diff --git a/.dependency-cruiser.cjs b/.dependency-cruiser.cjs index 25f7b64ce85..b7de80a70de 100644 --- a/.dependency-cruiser.cjs +++ b/.dependency-cruiser.cjs @@ -2,92 +2,86 @@ module.exports = { forbidden: [ { - name: 'no-circular-at-runtime', - severity: 'warn', + name: "no-circular-at-runtime", + severity: "warn", comment: - 'This dependency is part of a circular relationship. You might want to revise ' + - 'your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ', + "This dependency is part of a circular relationship. You might want to revise " + + "your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ", from: {}, to: { circular: true, viaOnly: { - dependencyTypesNot: [ - 'type-only' - ] - } - } + dependencyTypesNot: ["type-only"], + }, + }, }, { - name: 'no-orphans', + name: "no-orphans", comment: "This is an orphan module - it's likely not used (anymore?). Either use it or " + "remove it. If it's logical this module is an orphan (i.e. it's a config file), " + "add an exception for it in your dependency-cruiser configuration. By default " + "this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration " + "files (.d.ts), tsconfig.json and some of the babel and webpack configs.", - severity: 'warn', + severity: "warn", from: { orphan: true, pathNot: [ - '(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$', // dot files - '[.]d[.]ts$', // TypeScript declaration files - '(^|/)tsconfig[.]json$', // TypeScript config - '(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$' // other configs - ] + "(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$", // dot files + "[.]d[.]ts$", // TypeScript declaration files + "(^|/)tsconfig[.]json$", // TypeScript config + "(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$", // other configs + ], }, to: {}, }, { - name: 'no-deprecated-core', + name: "no-deprecated-core", comment: - 'A module depends on a node core module that has been deprecated. Find an alternative - these are ' + + "A module depends on a node core module that has been deprecated. Find an alternative - these are " + "bound to exist - node doesn't deprecate lightly.", - severity: 'warn', + severity: "warn", from: {}, to: { - dependencyTypes: [ - 'core' - ], + dependencyTypes: ["core"], path: [ - '^v8/tools/codemap$', - '^v8/tools/consarray$', - '^v8/tools/csvparser$', - '^v8/tools/logreader$', - '^v8/tools/profile_view$', - '^v8/tools/profile$', - '^v8/tools/SourceMap$', - '^v8/tools/splaytree$', - '^v8/tools/tickprocessor-driver$', - '^v8/tools/tickprocessor$', - '^node-inspect/lib/_inspect$', - '^node-inspect/lib/internal/inspect_client$', - '^node-inspect/lib/internal/inspect_repl$', - '^async_hooks$', - '^punycode$', - '^domain$', - '^constants$', - '^sys$', - '^_linklist$', - '^_stream_wrap$' + "^v8/tools/codemap$", + "^v8/tools/consarray$", + "^v8/tools/csvparser$", + "^v8/tools/logreader$", + "^v8/tools/profile_view$", + "^v8/tools/profile$", + "^v8/tools/SourceMap$", + "^v8/tools/splaytree$", + "^v8/tools/tickprocessor-driver$", + "^v8/tools/tickprocessor$", + "^node-inspect/lib/_inspect$", + "^node-inspect/lib/internal/inspect_client$", + "^node-inspect/lib/internal/inspect_repl$", + "^async_hooks$", + "^punycode$", + "^domain$", + "^constants$", + "^sys$", + "^_linklist$", + "^_stream_wrap$", ], - } + }, }, { - name: 'not-to-deprecated', + name: "not-to-deprecated", comment: - 'This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later ' + - 'version of that module, or find an alternative. Deprecated modules are a security risk.', - severity: 'warn', + "This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later " + + "version of that module, or find an alternative. Deprecated modules are a security risk.", + severity: "warn", from: {}, to: { - dependencyTypes: [ - 'deprecated' - ] - } + dependencyTypes: ["deprecated"], + }, }, { - name: 'no-non-package-json', - severity: 'error', + name: "no-non-package-json", + severity: "error", comment: "This module depends on an npm package that isn't in the 'dependencies' section of your package.json. " + "That's problematic as the package either (1) won't be available on live (2 - worse) will be " + @@ -95,87 +89,75 @@ module.exports = { "in your package.json.", from: {}, to: { - dependencyTypes: [ - 'npm-no-pkg', - 'npm-unknown' - ] - } + dependencyTypes: ["npm-no-pkg", "npm-unknown"], + }, }, { - name: 'not-to-unresolvable', + name: "not-to-unresolvable", comment: "This module depends on a module that cannot be found ('resolved to disk'). If it's an npm " + - 'module: add it to your package.json. In all other cases you likely already know what to do.', - severity: 'error', + "module: add it to your package.json. In all other cases you likely already know what to do.", + severity: "error", from: {}, to: { - couldNotResolve: true - } + couldNotResolve: true, + }, }, { - name: 'no-duplicate-dep-types', + name: "no-duplicate-dep-types", comment: "Likely this module depends on an external ('npm') package that occurs more than once " + "in your package.json i.e. bot as a devDependencies and in dependencies. This will cause " + "maintenance problems later on.", - severity: 'warn', + severity: "warn", from: {}, to: { moreThanOneDependencyType: true, - // as it's pretty common to have a type import be a type only import + // as it's pretty common to have a type import be a type only import // _and_ (e.g.) a devDependency - don't consider type-only dependency // types for this rule - dependencyTypesNot: ["type-only"] - } + dependencyTypesNot: ["type-only"], + }, }, /* rules you might want to tweak for your specific situation: */ { - name: 'not-to-spec', + name: "not-to-spec", comment: - 'This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. ' + + "This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. " + "If there's something in a spec that's of use to other modules, it doesn't have that single " + - 'responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.', - severity: 'error', + "responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.", + severity: "error", from: {}, to: { - path: '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$' - } + path: "[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$", + }, }, { - name: 'not-to-dev-dep', - severity: 'error', + name: "not-to-dev-dep", + severity: "error", comment: "This module depends on an npm package from the 'devDependencies' section of your " + - 'package.json. It looks like something that ships to production, though. To prevent problems ' + + "package.json. It looks like something that ships to production, though. To prevent problems " + "with npm packages that aren't there on production declare it (only!) in the 'dependencies'" + - 'section of your package.json. If this module is development only - add it to the ' + - 'from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration', + "section of your package.json. If this module is development only - add it to the " + + "from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration", from: { - path: '^(src)', - pathNot: [ - '[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$', - 'src/test' - ] + path: "^(src)", + pathNot: ["[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$", "./test"], }, to: { - dependencyTypes: [ - 'npm-dev', - ], + dependencyTypes: ["npm-dev"], // type only dependencies are not a problem as they don't end up in the // production code or are ignored by the runtime. - dependencyTypesNot: [ - 'type-only' - ], - pathNot: [ - 'node_modules/@types/' - ] - } + dependencyTypesNot: ["type-only"], + pathNot: ["node_modules/@types/"], + }, }, { - name: 'optional-deps-used', - severity: 'info', + name: "optional-deps-used", + severity: "info", comment: "This module depends on an npm package that is declared as an optional dependency " + "in your package.json. As this makes sense in limited situations only, it's flagged here. " + @@ -183,33 +165,28 @@ module.exports = { "dependency-cruiser configuration.", from: {}, to: { - dependencyTypes: [ - 'npm-optional' - ] - } + dependencyTypes: ["npm-optional"], + }, }, { - name: 'peer-deps-used', + name: "peer-deps-used", comment: "This module depends on an npm package that is declared as a peer dependency " + "in your package.json. This makes sense if your package is e.g. a plugin, but in " + "other cases - maybe not so much. If the use of a peer dependency is intentional " + "add an exception to your dependency-cruiser configuration.", - severity: 'warn', + severity: "warn", from: {}, to: { - dependencyTypes: [ - 'npm-peer' - ] - } - } + dependencyTypes: ["npm-peer"], + }, + }, ], options: { - /* Which modules not to follow further when encountered */ doNotFollow: { /* path: an array of regular expressions in strings to match against */ - path: ['node_modules'] + path: ["node_modules"], }, /* Which modules to exclude */ @@ -271,7 +248,7 @@ module.exports = { defaults to './tsconfig.json'. */ tsConfig: { - fileName: 'tsconfig.json' + fileName: "tsconfig.json", }, /* Webpack configuration to use to get resolve options from. @@ -345,7 +322,7 @@ module.exports = { collapses everything in node_modules to one folder deep so you see the external modules, but their innards. */ - collapsePattern: 'node_modules/(?:@[^/]+/[^/]+|[^/]+)', + collapsePattern: "node_modules/(?:@[^/]+/[^/]+|[^/]+)", /* Options to tweak the appearance of your graph.See https://github.com/sverweij/dependency-cruiser/blob/main/doc/options-reference.md#reporteroptions @@ -367,7 +344,8 @@ module.exports = { dependency graph reporter (`archi`) you probably want to tweak this collapsePattern to your situation. */ - collapsePattern: '^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)', + collapsePattern: + "^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)", /* Options to tweak the appearance of your graph. If you don't specify a theme for 'archi' dependency-cruiser will use the one specified in the @@ -375,10 +353,10 @@ module.exports = { */ // theme: { }, }, - "text": { - "highlightFocused": true + text: { + highlightFocused: true, }, - } - } + }, + }, }; // generated: dependency-cruiser@16.3.3 on 2024-06-13T23:26:36.169Z diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000000..be478a2b5fa --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[src/*.{js,ts}] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8e7606f0a48..79ab1bdc38a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,4 +4,19 @@ * @pagefaultgames/junior-dev-team # github actions/templates etc. - Dev Leads -/.github @pagefaultgames/dev-leads +/.github @pagefaultgames/senior-dev-team + +# Art Team +/public/**/*.png @pagefaultgames/art-team +/public/**/*.json @pagefaultgames/art-team +/public/images @pagefaultgames/art-team +/public/battle-anims @pagefaultgames/art-team + +# Audio files +*.mp3 @pagefaultgames/composer-team +*.wav @pagefaultgames/composer-team +*.ogg @pagefaultgames/composer-team +/public/audio @pagefaultgames/composer-team + +# Balance Files; contain actual code logic and must also be owned by dev team +/src/data/balance @pagefaultgames/balance-team @pagefaultgames/junior-dev-team \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index eb270dc8f80..81d8427b5db 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,7 @@ name: Bug Report description: Create a report to help us improve title: "[Bug] " +type: bug labels: ["Bug", "Triage"] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 29a79b38158..08d720aea7b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,6 +1,7 @@ name: Feature Request description: Suggest an idea for this project title: "[Feature] " +type: 'feature' labels: ["Enhancement", "Triage"] body: - type: markdown 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/.github/workflows/eslint.yml b/.github/workflows/quality.yml similarity index 88% rename from .github/workflows/eslint.yml rename to .github/workflows/quality.yml index d863c96a643..7e33a77a73a 100644 --- a/.github/workflows/eslint.yml +++ b/.github/workflows/quality.yml @@ -1,4 +1,4 @@ -name: ESLint +name: Biome Code Quality on: # Trigger the workflow on push or pull request, @@ -28,10 +28,13 @@ jobs: - name: Set up Node.js # Step to set up Node.js environment uses: actions/setup-node@v4 # Use the setup-node action version 4 with: - node-version: 20 # Specify Node.js version 20 + node-version-file: '.nvmrc' - name: Install Node.js dependencies # Step to install Node.js dependencies run: npm ci # Use 'npm ci' to install dependencies - + - name: eslint # Step to run linters run: npm run eslint-ci + + - name: Lint with Biome # Step to run linters + run: npm run biome-ci \ No newline at end of file diff --git a/.gitignore b/.gitignore index c22d0b2ce4c..9d96ed04a15 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,7 @@ coverage /dependency-graph.svg /.vs + + +# Script outputs +./*.csv \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000000..9bcccb9439d --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v20.13.1 diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 00000000000..6d884c8fd60 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,624 @@ +# 🎵 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 Developers +- pancakes aka patapancakes + +## Current and former Development Team members +- bennybroseph +- Brain Frog +- CodeTappert +- Dakurei +- flx-sta +- frutescens +- Greenlamp +- ImperialSympathizer +- innerthunder +- KimJeongSun +- Madmadness65 +- Moka +- Navori +- NightKev +- Opaquer +- OrangeRed +- Sam aka Flashfyre (initial developer, started PokéRogue) +- SirzBenjie +- sirzento +- SN34KZ +- Swain aka torranx +- Temp aka Tempo-anon +- Walker +- Wlowscha (aka Curbio) +- Xavion + +## Bug/Issue Managers +- Daleks +- Lily +- PigeonBar +- Snailman + +## Other Code Contributors +- Admiral-Billy +- allen925 +- arColm +- Arxalc +- AsdarDevelops +- Corrade +- DustinLin +- ElizaAlex +- EmberCM +- EmoUsedHM01 +- EvasiveAce +- Fontbane +- francktrouillez +- FredeX +- geeilhan +- happinyz +- hayuna +- InfernoVulpix +- j-diefenbach +- jaimefd +- JakubHanko +- JonStudders +- karl-police +- lucfd +- Lugiadrien +- madibye +- mattrossdev +- mcmontag +- meepen +- Mewtwo2387 +- muscode +- Neverblade +- NxKarim +- okimin +- PigeonBar +- PrabbyDD +- prateau +- prime-dialga +- PyGaVS +- rationality6 +- RedstonewolfX +- ReneGV +- rnicar245 +- schmidtc1 +- shayebeadling +- snoozbuster +- sodaMelon +- td76099 +- Vassiat +- Xiaphear +- zaccie +- zacharied +- Zé Ricardo + + +# 🌎 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 (creator of the now defunct "Yda's Dex") +- Admiral-Billy (Offline App - Desktop) +- Red aka StonedModder (iOS App) diff --git a/README.md b/README.md index 866687d54b7..5bb3ecfd26f 100644 --- a/README.md +++ b/README.md @@ -3,23 +3,30 @@ PokéRogue is a browser based Pokémon fangame heavily inspired by the roguelite genre. Battle endlessly while gathering stacking items, exploring many different biomes, fighting trainers, bosses, and more! # Contributing + ## 🛠️ Development + If you have the motivation and experience with Typescript/Javascript (or are willing to learn) please feel free to fork the repository and make pull requests with contributions. If you don't know what to work on but want to help, reference the below **To-Do** section or the **#feature-vote** channel in the discord. ### 💻 Environment Setup + #### Prerequisites + - node: 20.13.1 - npm: [how to install](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) #### Running Locally + 1. Clone the repo and in the root directory run `npm install` - *if you run into any errors, reach out in the **#dev-corner** channel in discord* 2. Run `npm run start:dev` to locally run the project in `localhost:8000` #### Linting -We're using ESLint as our common linter and formatter. It will run automatically during the pre-commit hook but if you would like to manually run it, use the `npm run eslint` script. To view the complete rules, check out the [eslint.config.js](./eslint.config.js) file. + +We're using Biome as our common linter and formatter. It will run automatically during the pre-commit hook but if you would like to manually run it, use the `npm run biome` script. To view the complete rules, check out the [biome.jsonc](./biome.jsonc) file. ### 📚 Documentation + You can find the auto-generated documentation [here](https://pagefaultgames.github.io/pokerogue/main/index.html). For information on enemy AI, check out the [enemy-ai.md](./docs/enemy-ai.md) file. For detailed guidelines on documenting your code, refer to the [comments.md](./docs/comments.md) file. @@ -27,102 +34,20 @@ For detailed guidelines on documenting your code, refer to the [comments.md](./d ### ❔ FAQ **How do I test a new _______?** + - In the `src/overrides.ts` file there are overrides for most values you'll need to change for testing **How do I retrieve the translations?** + - The translations were moved to the [dedicated translation repository](https://github.com/pagefaultgames/pokerogue-locales) and are now applied as a submodule in this project. - The command to retrieve the translations is `git submodule update --init --recursive`. If you still struggle to get it working, please reach out to #dev-corner channel in Discord. ## 🪧 To Do + 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/biome.jsonc b/biome.jsonc new file mode 100644 index 00000000000..3ec4552d359 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,106 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": true, + "defaultBranch": "beta" + }, + "formatter": { + "enabled": true, + "useEditorconfig": true, + "indentStyle": "space", + "ignore": ["src/enums/*", "src/data/balance/*"], + "lineWidth": 120 + }, + "files": { + "ignoreUnknown": true, + // Adding folders to the ignore list is GREAT for performance because it prevents biome from descending into them + // and having to verify whether each individual file is ignored + "ignore": [ + "**/*.d.ts", + "dist/*", + "build/*", + "coverage/*", + "public/*", + ".github/*", + "node_modules/*", + ".vscode/*", + "*.css", // TODO? + "*.html", // TODO? + "src/overrides.ts", + // TODO: these files are too big and complex, ignore them until their respective refactors + "src/data/moves/move.ts", + "src/data/ability.ts", + "src/field/pokemon.ts", + + // this file is just too big: + "src/data/balance/tms.ts" + ] + }, + "organizeImports": { "enabled": false }, + "linter": { + "ignore": [ + "src/phases/move-effect-phase.ts" // TODO: unignore after move-effect-phase refactor + ], + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUndeclaredVariables": "off", + "noUnusedVariables": "error", + "noSwitchDeclarations": "warn", // TODO: refactor and make this an error + "noVoidTypeReturn": "warn" // TODO: Refactor and make this an error + }, + "style": { + "noVar": "error", + "useEnumInitializers": "off", + "useBlockStatements": "error", + "useConst": "error", + "useImportType": "error", + "noNonNullAssertion": "off", // TODO: Turn this on ASAP and fix all non-null assertions + "noParameterAssign": "off", + "useExponentiationOperator": "off", + "useDefaultParameterLast": "off", // TODO: Fix spots in the codebase where this flag would be triggered, and then enable + "useSingleVarDeclarator": "off", + "useNodejsImportProtocol": "off", + "useTemplate": "off" // string concatenation is faster: https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation + }, + "suspicious": { + "noDoubleEquals": "error", + "noExplicitAny": "off", + "noAssignInExpressions": "off", + "noPrototypeBuiltins": "off", + "noFallthroughSwitchClause": "off", + "noImplicitAnyLet": "info", // TODO: Refactor and make this an error + "noRedeclare": "off", // TODO: Refactor and make this an error + "noGlobalIsNan": "off", + "noAsyncPromiseExecutor": "warn" // TODO: Refactor and make this an error + }, + "complexity": { + "noExcessiveCognitiveComplexity": "warn", + "useLiteralKeys": "off", + "noForEach": "off", // Foreach vs for of is not that simple. + "noUselessSwitchCase": "off", // Explicit > Implicit + "noUselessConstructor": "warn", // TODO: Refactor and make this an error + "noBannedTypes": "warn" // TODO: Refactor and make this an error + } + } + }, + "javascript": { + "formatter": { "quoteStyle": "double", "arrowParentheses": "asNeeded" } + }, + "overrides": [ + { + "include": ["test/**/*.test.ts"], + "javascript": { "globals": [] }, + "linter": { + "rules": { + "performance": { + "noDelete": "off" + } + } + } + } + ] +} diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index a365999c623..d47b7c4afeb 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -1,5 +1,5 @@ /** - * This script creates a test boilerplate file in the appropriate + * This script creates a test boilerplate file in the appropriate * directory based on the type selected. * @example npm run create-test */ @@ -31,7 +31,8 @@ async function promptTestType() { if (typeAnswer.selectedOption === "EXIT") { console.log("Exiting..."); return process.exit(); - } else if (!typeChoices.includes(typeAnswer.selectedOption)) { + } + if (!typeChoices.includes(typeAnswer.selectedOption)) { console.error(`Please provide a valid type (${typeChoices.join(", ")})!`); return await promptTestType(); } @@ -74,29 +75,29 @@ async function runInteractive() { const fileName = fileNameAnswer.userInput .replace(/-+/g, "_") // Convert kebab-case (dashes) to underscores .replace(/([a-z])([A-Z])/g, "$1_$2") // Convert camelCase to snake_case - .replace(/\s+/g, '_') // Replace spaces with underscores + .replace(/\s+/g, "_") // Replace spaces with underscores .toLowerCase(); // Ensure all lowercase // Format the description for the test case - const formattedName = fileName.replace(/_/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()); + const formattedName = fileName.replace(/_/g, " ").replace(/\b\w/g, char => char.toUpperCase()); // Determine the directory based on the type let dir; let description; switch (type) { case "move": - dir = path.join(__dirname, "src", "test", "moves"); + dir = path.join(__dirname, "test", "moves"); description = `Moves - ${formattedName}`; break; case "ability": - dir = path.join(__dirname, "src", "test", "abilities"); + dir = path.join(__dirname, "test", "abilities"); description = `Abilities - ${formattedName}`; break; case "item": - dir = path.join(__dirname, "src", "test", "items"); + dir = path.join(__dirname, "test", "items"); description = `Items - ${formattedName}`; break; case "mystery encounter": - dir = path.join(__dirname, "src", "test", "mystery-encounter", "encounters"); + dir = path.join(__dirname, "test", "mystery-encounter", "encounters"); description = `Mystery Encounter - ${formattedName}`; break; default: @@ -108,7 +109,7 @@ async function runInteractive() { const content = `import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; diff --git a/dependency-graph.js b/dependency-graph.js index 627aa3dcf13..dff960d8781 100644 --- a/dependency-graph.js +++ b/dependency-graph.js @@ -10,4 +10,4 @@ for await (const chunk of process.stdin) { const file = Buffer.concat(inputFile).toString("utf-8"); const svg = graphviz.dot(file, "svg"); -process.stdout.write(svg); \ No newline at end of file +process.stdout.write(svg); diff --git a/docs/enemy-ai.md b/docs/enemy-ai.md index 46482f56a90..8edf5a3f10e 100644 --- a/docs/enemy-ai.md +++ b/docs/enemy-ai.md @@ -80,8 +80,8 @@ As part of the move selection process, the enemy Pokémon must compute a **targe A move's UBS and TBS are computed with the respective functions in the `Move` class: ```ts -getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer; -getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer; +getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number; +getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number; ``` Logically, these functions are very similar – they add up their respective benefit scores from each of the move's attributes (as determined by `attr.getUserBenefitScore`, and `attr.getTargetBenefitScore`, respectively) and return the total benefit score. However, there are two key functional differences in how the UBS and TBS of a move are handled: diff --git a/eslint.config.js b/eslint.config.js index 2f2b466c66f..a97e3902411 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,51 +1,43 @@ -import tseslint from '@typescript-eslint/eslint-plugin'; -import stylisticTs from '@stylistic/eslint-plugin-ts'; -import parser from '@typescript-eslint/parser'; -import importX from 'eslint-plugin-import-x'; +import tseslint from "@typescript-eslint/eslint-plugin"; +import stylisticTs from "@stylistic/eslint-plugin-ts"; +import parser from "@typescript-eslint/parser"; +import importX from "eslint-plugin-import-x"; -export default [ - { - files: ["src/**/*.{ts,tsx,js,jsx}"], - ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"], - languageOptions: { - parser: parser - }, - plugins: { - "import-x": importX, - '@stylistic/ts': stylisticTs, - '@typescript-eslint': tseslint - }, - rules: { - "eqeqeq": ["error", "always"], // Enforces the use of `===` and `!==` instead of `==` and `!=` - "indent": ["error", 2, { "SwitchCase": 1 }], // Enforces a 2-space indentation, enforces indentation of `case ...:` statements - "quotes": ["error", "double"], // Enforces the use of double quotes for strings - "no-var": "error", // Disallows the use of `var`, enforcing `let` or `const` instead - "prefer-const": "error", // Enforces the use of `const` for variables that are never reassigned - "no-undef": "off", // Disables the rule that disallows the use of undeclared variables (TypeScript handles this) - "@typescript-eslint/no-unused-vars": [ "error", { - "args": "none", // Allows unused function parameters. Useful for functions with specific signatures where not all parameters are always used. - "ignoreRestSiblings": true // Allows unused variables that are part of a rest property in object destructuring. Useful for excluding certain properties from an object while using the others. - }], - "eol-last": ["error", "always"], // Enforces at least one newline at the end of files - "@stylistic/ts/semi": ["error", "always"], // Requires semicolons for TypeScript-specific syntax - "semi": "off", // Disables the general semi rule for TypeScript files - "no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax - "brace-style": "off", // Note: you must disable the base rule as it can report incorrect errors - "curly": ["error", "all"], // Enforces the use of curly braces for all control statements - "@stylistic/ts/brace-style": ["error", "1tbs"], // Enforces the following brace style: https://eslint.style/rules/js/brace-style#_1tbs - "no-trailing-spaces": ["error", { // Disallows trailing whitespace at the end of lines - "skipBlankLines": false, // Enforces the rule even on blank lines - "ignoreComments": false // Enforces the rule on lines containing comments - }], - "space-before-blocks": ["error", "always"], // Enforces a space before blocks - "keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords - "comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after commas - "import-x/extensions": ["error", "never", { "json": "always" }], // Enforces no extension for imports unless json - "array-bracket-spacing": ["error", "always", { "objectsInArrays": false, "arraysInArrays": false }], // Enforces consistent spacing inside array brackets - "object-curly-spacing": ["error", "always", { "arraysInObjects": false, "objectsInObjects": false }], // Enforces consistent spacing inside braces of object literals, destructuring assignments, and import/export specifiers - "computed-property-spacing": ["error", "never" ], // Enforces consistent spacing inside computed property brackets - "space-infix-ops": ["error", { "int32Hint": false }], // Enforces spacing around infix operators - "no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }], // Disallows multiple empty lines - } - } -] +export default [ + { + name: "eslint-config", + files: ["src/**/*.{ts,tsx,js,jsx}", "test/**/*.{ts,tsx,js,jsx}"], + ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"], + languageOptions: { + parser: parser, + }, + plugins: { + "import-x": importX, + "@stylistic/ts": stylisticTs, + "@typescript-eslint": tseslint, + }, + rules: { + "prefer-const": "error", // Enforces the use of `const` for variables that are never reassigned + "no-undef": "off", // Disables the rule that disallows the use of undeclared variables (TypeScript handles this) + "no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax + "import-x/extensions": ["error", "never", { json: "always" }], // Enforces no extension for imports unless json + }, + }, + { + name: "eslint-tests", + files: ["test/**/**.test.ts"], + languageOptions: { + parser: parser, + parserOptions: { + project: ["./tsconfig.json"], + }, + }, + plugins: { + "@typescript-eslint": tseslint, + }, + rules: { + "@typescript-eslint/no-floating-promises": "error", // Require Promise-like statements to be handled appropriately. - https://typescript-eslint.io/rules/no-floating-promises/ + "@typescript-eslint/no-misused-promises": "error", // Disallow Promises in places not designed to handle them. - https://typescript-eslint.io/rules/no-misused-promises/ + }, + }, +]; diff --git a/global.d.ts b/global.d.ts index f4dfa7d4cb2..c896a4983e4 100644 --- a/global.d.ts +++ b/global.d.ts @@ -10,5 +10,5 @@ declare global { * * To set up your own server in a test see `game_data.test.ts` */ - var i18nServer: SetupServerApi; + var server: SetupServerApi; } diff --git a/index.css b/index.css index 2ec106516d2..49e570bdccc 100644 --- a/index.css +++ b/index.css @@ -11,7 +11,7 @@ html { body { margin: 0; - display:flex; + display: flex; flex-direction: column; align-items: center; background: #484050; @@ -49,16 +49,17 @@ body { @media (pointer: coarse) { /* hasTouchscreen() && !isTouchControlsEnabled */ - body:has(> #touchControls[class=visible]) #app { + body:has(> #touchControls[class="visible"]) #app { align-items: start; } - body:has(> #touchControls[class=visible]) #app > div:first-child { + body:has(> #touchControls[class="visible"]) #app > div:first-child { transform-origin: top !important; } } -#layout:fullscreen #dpad, #layout:fullscreen { +#layout:fullscreen #dpad, +#layout:fullscreen { bottom: 6rem; } @@ -76,7 +77,6 @@ input { display: none !important; } - input:-internal-autofill-selected { -webkit-background-clip: text; background-clip: text; @@ -91,18 +91,33 @@ input:-internal-autofill-selected { --controls-padding: 1rem; - --controls-size-with-padding: calc(var(--controls-size) + var(--controls-padding)); - --controls-size-with-wide-padding: calc(var(--controls-size) *1.2 + var(--controls-padding)); + --controls-size-with-padding: calc( + var(--controls-size) + + var(--controls-padding) + ); + --controls-size-with-wide-padding: calc( + var(--controls-size) * + 1.2 + + var(--controls-padding) + ); --control-group-extra-size: calc(var(--controls-size) * 0.8); --control-group-extra-wide-size: calc(var(--controls-size) * 1.2); - --control-group-extra-2-offset: calc(var(--controls-size-with-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2); - --control-group-extra-1-offset: calc(var(--controls-padding) + (var(--controls-size) - var(--control-group-extra-size)) / 2); + --control-group-extra-2-offset: calc( + var(--controls-size-with-padding) + + (var(--controls-size) - var(--control-group-extra-size)) / + 2 + ); + --control-group-extra-1-offset: calc( + var(--controls-padding) + + (var(--controls-size) - var(--control-group-extra-size)) / + 2 + ); --small-control-size: calc(var(--controls-size) / 3); --rect-control-size: calc(var(--controls-size) * 0.74); - font-family: 'emerald'; + font-family: "emerald"; font-size: var(--controls-size); text-shadow: var(--color-dark) var(--text-shadow-size) var(--text-shadow-size); color: var(--color-light); @@ -146,32 +161,69 @@ input:-internal-autofill-selected { /* Hide buttons on specific UIs */ /* Show #apadPreviousTab and #apadNextTab only in settings, except in touch configuration panel */ -#touchControls:not([data-ui-mode^='SETTINGS']) #apadPreviousTab, -#touchControls:not([data-ui-mode^='SETTINGS']) #apadNextTab, +#touchControls:not([data-ui-mode^="SETTINGS"]) #apadPreviousTab, +#touchControls:not([data-ui-mode^="SETTINGS"]) #apadNextTab, #touchControls:is(.config-mode) #apadPreviousTab, #touchControls:is(.config-mode) #apadNextTab { display: none; } /* Show #apadInfo only in battle */ -#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']) #apadInfo { +#touchControls:not([data-ui-mode="COMMAND"]):not([data-ui-mode="FIGHT"]):not( + [data-ui-mode="BALL"] + ):not([data-ui-mode="TARGET_SELECT"]) + #apadInfo { display: none; } /* Show #apadStats only in battle and shop */ -#touchControls:not([data-ui-mode='COMMAND']):not([data-ui-mode='FIGHT']):not([data-ui-mode='BALL']):not([data-ui-mode='TARGET_SELECT']):not([data-ui-mode='MODIFIER_SELECT']) #apadStats { +#touchControls:not([data-ui-mode="COMMAND"]):not([data-ui-mode="FIGHT"]):not( + [data-ui-mode="BALL"] + ):not([data-ui-mode="TARGET_SELECT"]):not([data-ui-mode="MODIFIER_SELECT"]) + #apadStats { display: none; } /* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */ -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadOpenFilters, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleForm, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleShiny, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleVariant { - display: none; +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX"], + [data-ui-mode="POKEDEX_PAGE"] + ) + #apadOpenFilters, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX"], + [data-ui-mode="POKEDEX_PAGE"], + [data-ui-mode="RUN_INFO"] + ) + #apadCycleForm, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX"], + [data-ui-mode="POKEDEX_PAGE"], + [data-ui-mode="RUN_INFO"] + ) + #apadCycleShiny, +#touchControls:not(.config-mode):not([data-ui-mode="STARTER_SELECT"]) + #apadCycleNature, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX_PAGE"], + [data-ui-mode="RUN_INFO"] + ) + #apadCycleAbility, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX_PAGE"] + ) + #apadCycleGender, +#touchControls:not(.config-mode):not( + [data-ui-mode="STARTER_SELECT"], + [data-ui-mode="POKEDEX"] + ) + #apadCycleTera { + display: none; } /* Configuration toolbar */ @@ -217,16 +269,18 @@ input:-internal-autofill-selected { font-size: var(--small-control-size); border-radius: 8px; padding: 2px 8px; - text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); + text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) + calc(var(--text-shadow-size) / 3); } #configToolbar .button:active { - opacity: var(--touch-control-opacity) + opacity: var(--touch-control-opacity); } #configToolbar .orientation-label { font-size: var(--small-control-size); - text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); + text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) + calc(var(--text-shadow-size) / 3); } /* dpad */ @@ -270,7 +324,8 @@ input:-internal-autofill-selected { .apad-small > .apad-label { font-size: var(--small-control-size); - text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) calc(var(--text-shadow-size) / 3); + text-shadow: var(--color-dark) calc(var(--text-shadow-size) / 3) + calc(var(--text-shadow-size) / 3); } .apad-rectangle { @@ -320,7 +375,8 @@ input:-internal-autofill-selected { /* Layout */ -#layout:fullscreen #dpad, #layout:fullscreen #apad { +#layout:fullscreen #dpad, +#layout:fullscreen #apad { bottom: 6rem; } @@ -353,55 +409,55 @@ a { /* Firefox old*/ @-moz-keyframes blink { - 0% { - opacity:1; - } - 50% { - opacity:0; - } - 100% { - opacity:1; - } + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } } @-webkit-keyframes blink { - 0% { - opacity:1; - } - 50% { - opacity:0; - } - 100% { - opacity:1; - } + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } } /* IE */ @-ms-keyframes blink { - 0% { - opacity:1; - } - 50% { - opacity:0; - } - 100% { - opacity:1; - } + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } } /* Opera and prob css3 final iteration */ @keyframes blink { - 0% { - opacity:1; - } - 50% { - opacity:0; - } - 100% { - opacity:1; - } + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } } .blink-image { - -moz-animation: blink normal 4s infinite ease-in-out; /* Firefox */ - -webkit-animation: blink normal 4s infinite ease-in-out; /* Webkit */ - -ms-animation: blink normal 4s infinite ease-in-out; /* IE */ - animation: blink normal 4s infinite ease-in-out; /* Opera and prob css3 final iteration */ + -moz-animation: blink normal 4s infinite ease-in-out; /* Firefox */ + -webkit-animation: blink normal 4s infinite ease-in-out; /* Webkit */ + -ms-animation: blink normal 4s infinite ease-in-out; /* IE */ + animation: blink normal 4s infinite ease-in-out; /* Opera and prob css3 final iteration */ } diff --git a/index.html b/index.html index 390a29fb365..111464b5e5c 100644 --- a/index.html +++ b/index.html @@ -129,11 +129,11 @@
N
-
+
V
-
+
V
diff --git a/lefthook.yml b/lefthook.yml index 06eb0446ee5..4eff2ad1f8e 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -1,9 +1,9 @@ pre-commit: parallel: true commands: - eslint: + biome-lint: glob: "*.{js,jsx,ts,tsx}" - run: npx eslint --fix {staged_files} + run: npx @biomejs/biome check --write --reporter=summary {staged_files} --no-errors-on-unmatched stage_fixed: true skip: - merge @@ -11,9 +11,9 @@ pre-commit: pre-push: commands: - eslint: + biome-lint: glob: "*.{js,ts,jsx,tsx}" - run: npx eslint --fix {push_files} + run: npx @biomejs/biome check --write --reporter=summary {push_files} --no-errors-on-unmatched post-merge: commands: diff --git a/package-lock.json b/package-lock.json index be946306471..87e2e150c65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7034 +1,7179 @@ { - "name": "pokemon-rogue-battle", - "version": "1.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "pokemon-rogue-battle", - "version": "1.1.0", - "hasInstallScript": true, - "dependencies": { - "@material/material-color-utilities": "^0.2.7", - "crypto-js": "^4.2.0", - "i18next": "^23.11.1", - "i18next-browser-languagedetector": "^7.2.1", - "i18next-http-backend": "^2.6.1", - "i18next-korean-postposition-processor": "^1.0.0", - "json-stable-stringify": "^1.1.0", - "phaser": "^3.70.0", - "phaser3-rex-plugins": "^1.1.84" - }, - "devDependencies": { - "@eslint/js": "^9.3.0", - "@hpcc-js/wasm": "^2.18.0", - "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", - "@types/jsdom": "^21.1.7", - "@types/node": "^20.12.13", - "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", - "@typescript-eslint/parser": "^8.0.0-alpha.54", - "@vitest/coverage-istanbul": "^2.0.4", - "dependency-cruiser": "^16.3.10", - "eslint": "^9.7.0", - "eslint-plugin-import-x": "^4.2.1", - "inquirer": "^11.0.2", - "jsdom": "^24.0.0", - "lefthook": "^1.6.12", - "msw": "^2.4.9", - "phaser3spectorjs": "^0.0.8", - "typedoc": "^0.26.4", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.0-alpha.54", - "vite": "^5.4.8", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.0.4", - "vitest-canvas-mock": "^0.3.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", - "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.9", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", - "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", - "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cookie": "^0.5.0" - } - }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", - "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", - "dev": true, - "license": "ISC", - "dependencies": { - "statuses": "^2.0.1" - } - }, - "node_modules/@bundled-es-modules/tough-cookie": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", - "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@types/tough-cookie": "^4.0.5", - "tough-cookie": "^4.1.4" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", - "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", - "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@hpcc-js/wasm": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@hpcc-js/wasm/-/wasm-2.18.0.tgz", - "integrity": "sha512-M9XVIvAXGH4Xcyb5UoiohWcn6fil89pcos/gClNdBZG2v+W48xSf2bjcA8BW131X/AFHUerVY28n1P1Jw81/9A==", - "dev": true, - "dependencies": { - "yargs": "17.7.2" - }, - "bin": { - "dot-wasm": "bin/dot-wasm.js" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz", - "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/confirm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-4.0.1.tgz", - "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", - "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.5.5", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/editor": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-3.0.1.tgz", - "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0", - "external-editor": "^3.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/expand": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-3.0.1.tgz", - "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", - "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/input": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-3.0.1.tgz", - "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/number": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-2.0.1.tgz", - "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/password": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-3.0.1.tgz", - "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0", - "ansi-escapes": "^4.3.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/prompts": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-6.0.1.tgz", - "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^3.0.1", - "@inquirer/confirm": "^4.0.1", - "@inquirer/editor": "^3.0.1", - "@inquirer/expand": "^3.0.1", - "@inquirer/input": "^3.0.1", - "@inquirer/number": "^2.0.1", - "@inquirer/password": "^3.0.1", - "@inquirer/rawlist": "^3.0.1", - "@inquirer/search": "^2.0.1", - "@inquirer/select": "^3.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/rawlist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-3.0.1.tgz", - "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/type": "^2.0.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/search": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-2.0.1.tgz", - "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/select": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-3.0.1.tgz", - "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", - "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@material/material-color-utilities": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.2.7.tgz", - "integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==", - "license": "Apache-2.0" - }, - "node_modules/@mswjs/interceptors": { - "version": "0.35.8", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.8.tgz", - "integrity": "sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.12.0.tgz", - "integrity": "sha512-mc1cLbm6UQ8RxLc0dZES7v5rkH+99LxQp/ZvTqV3NLyYsO/fD6JhEflP1H5b2SDq9gI0+0G36AVZWxvounfR9w==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.4" - } - }, - "node_modules/@stylistic/eslint-plugin-js": { - "version": "2.6.0-beta.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.0-beta.0.tgz", - "integrity": "sha512-KQiNvzNzvl9AmMs1MiIBszLIy/Xy1bTExnyaVy5dSzOF9c+yT64JQfH0p0jP6XpGwoCnZsrPUNflwP30G42QBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^8.56.10", - "acorn": "^8.12.0", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@stylistic/eslint-plugin-js/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-ts": { - "version": "2.6.0-beta.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.6.0-beta.0.tgz", - "integrity": "sha512-WMz1zgmMC3bvg1L/tiYt5ygvDbTDKlbezoHoX2lV9MnUCAEQZUP4xJ9Wj3jmIKxb4mUuK5+vFZJVcOygvbbqow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@stylistic/eslint-plugin-js": "2.6.0-beta.0", - "@types/eslint": "^8.56.10", - "@typescript-eslint/utils": "^8.0.0-alpha.34" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "8.56.11", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz", - "integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/jsdom": { - "version": "21.1.7", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", - "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.14.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", - "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "dev": true - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.58.tgz", - "integrity": "sha512-5G9oIj8jvosj8RTa0VDFXvRmUg1U6FxXJu7ZEfyJYMvFkdMJoY5YnzFvgAvHbYsXOj+YgXZu81fNOTRWQzwk5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.0.0-alpha.58", - "@typescript-eslint/type-utils": "8.0.0-alpha.58", - "@typescript-eslint/utils": "8.0.0-alpha.58", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0-alpha.58.tgz", - "integrity": "sha512-/RpgxIejBui6WXJgV9ukwzxmvbZt5TlfHUGGLB/BsNLj+NRZEbXVtWT9rKuxVOqsGb1Dn9c5gxvBI/XzyuIsMQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "8.0.0-alpha.58", - "@typescript-eslint/types": "8.0.0-alpha.58", - "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.58.tgz", - "integrity": "sha512-bGgJXn8B3Pf3mzEOUQTPxEqhux54MOJSqw4HcgBReuP7dudz/hsN4TH9GqHbMXkFv8N4Ed1iqVRfgGeC8b1mGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.0.0-alpha.58", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.58" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.58.tgz", - "integrity": "sha512-spW/I/UAY6HM0lKj+/333Zb9arOvUoi8+H0cVNYHELPhOti9re9NjyyJFhck84PNiwi8WmpkEf3GXe7/h+Cquw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", - "@typescript-eslint/utils": "8.0.0-alpha.58", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0-alpha.58.tgz", - "integrity": "sha512-6+jM4y31a6pwKeV3MVQuVXPZl6d3I1ySMvP5WjZdZ+n57uovMvasZ3ZJstXngoRpa7JtkjVZ7NrMhQ1J8dxKCQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.58.tgz", - "integrity": "sha512-hm4nsoJnQcA7axMopUJrH7CD0MJhAMtE2zQt65uMFCy+U2YDdKPwE0g6qEAUBoKn6UBLQJWthJgUmwDbWrnwZg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.0.0-alpha.58", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0-alpha.58.tgz", - "integrity": "sha512-lZuGnpK23jr3huebgY4/qqrOKsWJ8dX0Q1Fo4oVYcyAy+sK6p+6nObK4VEPJG098gUmrriiavRiDKIhPDFm4Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.0.0-alpha.58", - "@typescript-eslint/types": "8.0.0-alpha.58", - "@typescript-eslint/typescript-estree": "8.0.0-alpha.58" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.58.tgz", - "integrity": "sha512-V//E9PRY2216kh9fN/ihRvTtjpobAXEtmrsr3utlVUwHa2iklcofq1J12yl3KOjx9QBRfBrtfQnYaeruF7L0Fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.0.0-alpha.58", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitest/coverage-istanbul": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.0.4.tgz", - "integrity": "sha512-6VibYMkXh8cJm5Bg8JYeOoR4oURlPf4YKP9kuVRE/NKasfYrXPnzSwuxrpgMbgOfPj13KUJXgMB3VAGukECtlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@istanbuljs/schema": "^0.1.3", - "debug": "^4.3.5", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-instrument": "^6.0.3", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magicast": "^0.3.4", - "test-exclude": "^7.0.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "2.0.4" - } - }, - "node_modules/@vitest/expect": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", - "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", - "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", - "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.0.4", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", - "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.4", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", - "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", - "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.4", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-jsx-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", - "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/acorn-loose": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.4.0.tgz", - "integrity": "sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001642", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", - "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT" - }, - "node_modules/cssfontparser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", - "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", - "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dependency-cruiser": { - "version": "16.3.10", - "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.10.tgz", - "integrity": "sha512-WkCnibHBfvaiaQ+S46LZ6h4AR6oj42Vsf5/0Vgtrwdwn7ZekMJdZ/ALoTwNp/RaGlKW+MbV/fhSZOvmhAWVWzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "8.12.1", - "acorn-jsx": "5.3.2", - "acorn-jsx-walk": "2.0.0", - "acorn-loose": "8.4.0", - "acorn-walk": "8.3.3", - "ajv": "8.17.1", - "commander": "12.1.0", - "enhanced-resolve": "5.17.1", - "ignore": "5.3.1", - "interpret": "^3.1.1", - "is-installed-globally": "1.0.0", - "json5": "2.2.3", - "memoize": "10.0.0", - "picocolors": "1.0.1", - "picomatch": "4.0.2", - "prompts": "2.4.2", - "rechoir": "^0.8.0", - "safe-regex": "2.1.1", - "semver": "^7.6.3", - "teamcity-service-messages": "0.1.14", - "tsconfig-paths-webpack-plugin": "4.1.0", - "watskeburt": "4.1.0" - }, - "bin": { - "depcruise": "bin/dependency-cruise.mjs", - "depcruise-baseline": "bin/depcruise-baseline.mjs", - "depcruise-fmt": "bin/depcruise-fmt.mjs", - "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs", - "dependency-cruise": "bin/dependency-cruise.mjs", - "dependency-cruiser": "bin/dependency-cruise.mjs" - }, - "engines": { - "node": "^18.17||>=20" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.830", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.830.tgz", - "integrity": "sha512-TrPKKH20HeN0J1LHzsYLs2qwXrp8TF4nHdu4sq61ozGbzMpWhI7iIOPYPPkxeq1azMT9PZ8enPFcftbs/Npcjg==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.7.0.tgz", - "integrity": "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.7.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import-x": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.2.1.tgz", - "integrity": "sha512-WWi2GedccIJa0zXxx3WDnTgouGQTtdYK1nhXMwywbqqAgB0Ov+p1pYBsWh3VaB0bvBOwLse6OfVII7jZD9xo5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^8.1.0", - "debug": "^4.3.4", - "doctrine": "^3.0.0", - "eslint-import-resolver-node": "^0.3.9", - "get-tsconfig": "^4.7.3", - "is-glob": "^4.0.3", - "minimatch": "^9.0.3", - "semver": "^7.6.3", - "stable-hash": "^0.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", - "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/headers-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/i18next": { - "version": "23.12.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", - "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, - "node_modules/i18next-browser-languagedetector": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz", - "integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, - "node_modules/i18next-http-backend": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.6.1.tgz", - "integrity": "sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==", - "license": "MIT", - "dependencies": { - "cross-fetch": "4.0.0" - } - }, - "node_modules/i18next-korean-postposition-processor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/i18next-korean-postposition-processor/-/i18next-korean-postposition-processor-1.0.0.tgz", - "integrity": "sha512-ruNXjI9awsFK6Ie+F9gYaMW8ciLMuCkeRjH9QkSv2Wb8xI0mnm773v3M9eua8dtvAXudIUk4p6Ho7hNkEASXDg==", - "license": "MIT", - "peerDependencies": { - "i18next": ">=8.4.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/inquirer": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-11.0.2.tgz", - "integrity": "sha512-pnbn3nL+JFrTw/pLhzyE/IQ3+gA3n5JxTAZQDjB6qu4gbjOaiTnpZbxT6HY2DDCT7bzDjTTsd3snRP+B6N//Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.2.1", - "@inquirer/prompts": "^6.0.1", - "@inquirer/type": "^2.0.0", - "@types/mute-stream": "^0.0.4", - "ansi-escapes": "^4.3.2", - "mute-stream": "^1.0.0", - "run-async": "^3.0.0", - "rxjs": "^7.8.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", - "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-directory": "^4.0.1", - "is-path-inside": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally/node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-canvas-mock": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", - "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", - "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.4", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.10", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.17.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "isarray": "^2.0.5", - "jsonify": "^0.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "license": "Public Domain", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lefthook": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.4.tgz", - "integrity": "sha512-lVv3nKH9l3KMDS3bySROvWJSw1+AsBHUO7xaA0rg1IEBZrj3+ePmM+a8elX+GU3Go1OzsZEYjo5AOOeLoZ7FQg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "lefthook": "bin/index.js" - }, - "optionalDependencies": { - "lefthook-darwin-arm64": "1.7.4", - "lefthook-darwin-x64": "1.7.4", - "lefthook-freebsd-arm64": "1.7.4", - "lefthook-freebsd-x64": "1.7.4", - "lefthook-linux-arm64": "1.7.4", - "lefthook-linux-x64": "1.7.4", - "lefthook-windows-arm64": "1.7.4", - "lefthook-windows-x64": "1.7.4" - } - }, - "node_modules/lefthook-darwin-arm64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.4.tgz", - "integrity": "sha512-6XpenaP0W7ZYA3lhHey/C1U+KmYz6eCq2cGswQsrTX+xdtHdWW3NbbOKngxATRTF8+CtF6m9UB2afP7qqkCghQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/lefthook-darwin-x64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.4.tgz", - "integrity": "sha512-lpQXbPMHiaWE7+9fV+spjuMKiZ3J/+oI6hY1/l48MO3LmSpIv6DNy0VHho1fZVQnHdBU4bDh5c1G0r1f5T0irg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/lefthook-freebsd-arm64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.4.tgz", - "integrity": "sha512-wv+JZgkD1/wi4X5aKKNodvxNcFcYmvL7uyzKkbtd/LgX5ssh9r5pO9J/71ULGtEuTXH4kqORRtez7u/ygqMEew==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/lefthook-freebsd-x64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.4.tgz", - "integrity": "sha512-xoYR0Ay8pbyY9W9mI+iI9VDkkCVYSXhMf9XyOChSlu2XmjKiqi23hjCXvSOpvHQ7jphGvAVpE3Byijr6Xjuihw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/lefthook-linux-arm64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.4.tgz", - "integrity": "sha512-WvXWzSM/e08n2f5lcC8j+pUMS0RzZftJK4zuBQ36TstSYXfBjWiw+FMnKCVZk6Q8Zc0icyF8sTmKQAyKCgX+UA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/lefthook-linux-x64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.4.tgz", - "integrity": "sha512-eR5NxGzqPJm3wDTm4HStwGxOZ8Omb0ooodyuQdEOxtYidLrd4U18N14huwCEFd3BAOrjIWYV8plH+ReTZE56eg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/lefthook-windows-arm64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.4.tgz", - "integrity": "sha512-C+MdHH+0ylermetMHwfHsYYNI5HI6QEOx7N4Iw4Ea6c3Yuj3eG3LsAzrhsup7KLSSBmDgIHOCJUx/Mfh2z+ATw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/lefthook-windows-x64": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.4.tgz", - "integrity": "sha512-BDQhiRzmMYPFQFtVtkRfUfeZuSlemG1oJfGKYXlCGFskvK9Jm1nGFnG0Ig63FAQaFdW33DFoLdr9ZKFTUQeSwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/magicast": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", - "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.24.4", - "@babel/types": "^7.24.0", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, - "node_modules/memoize": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.0.0.tgz", - "integrity": "sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/memoize?sponsor=1" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/moo-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", - "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.1.4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/msw": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.4.9.tgz", - "integrity": "sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/statuses": "^1.0.1", - "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.35.8", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", - "graphql": "^16.8.1", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.3.0", - "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.8.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/msw/node_modules/@inquirer/confirm": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", - "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/msw/node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/msw/node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", - "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", - "dev": true - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", - "dev": true - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true, - "license": "MIT" - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/papaparse": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", - "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", - "license": "MIT" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/phaser": { - "version": "3.80.1", - "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.80.1.tgz", - "integrity": "sha512-VQGAWoDOkEpAWYkI+PUADv5Ql+SM0xpLuAMBJHz9tBcOLqjJ2wd8bUhxJgOqclQlLTg97NmMd9MhS75w16x1Cw==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1" - } - }, - "node_modules/phaser3-rex-plugins": { - "version": "1.80.5", - "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.5.tgz", - "integrity": "sha512-hdL3Cm6dK72w6phQdGnEiqqntlwT8SvjU0yit7DkdqiPy/Io1g3KnsRFqndtY+Hu69zaMEuckpIVeQK6yVwx4A==", - "dependencies": { - "eventemitter3": "^3.1.2", - "i18next": "^22.5.1", - "i18next-http-backend": "^2.5.2", - "js-yaml": "^4.1.0", - "mustache": "^4.2.0", - "papaparse": "^5.4.1", - "webfontloader": "^1.6.28" - } - }, - "node_modules/phaser3-rex-plugins/node_modules/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "license": "MIT" - }, - "node_modules/phaser3-rex-plugins/node_modules/i18next": { - "version": "22.5.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", - "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.6" - } - }, - "node_modules/phaser3spectorjs": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/phaser3spectorjs/-/phaser3spectorjs-0.0.8.tgz", - "integrity": "sha512-0dSO7/aMjEUPrp5EcjRvRRsEf+jXDbmzalPeJ6VtTB2Pn1PeaKc+qlL/DmO3l1Dvc5lkzc+Sil1Ta+Hkyi5cbA==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss/node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true, - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "dev": true, - "license": "MIT", - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true - }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "regexp-tree": "~0.1.1" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shiki": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.12.0.tgz", - "integrity": "sha512-BuAxWOm5JhRcbSOl7XCei8wGjgJJonnV0oipUupPY58iULxUGyHhW5CF+9FRMuM1pcJ5cGEJGll1LusX6FwpPA==", - "dev": true, - "dependencies": { - "@shikijs/core": "1.12.0", - "@types/hast": "^3.0.4" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stable-hash": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", - "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/teamcity-service-messages": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz", - "integrity": "sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tsconfck": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", - "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths-webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", - "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true, - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedoc": { - "version": "0.26.5", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.5.tgz", - "integrity": "sha512-Vn9YKdjKtDZqSk+by7beZ+xzkkr8T8CYoiasqyt4TTRFy5+UHzL/mF/o4wGBjRF+rlWQHDb0t6xCpA3JNL5phg==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "shiki": "^1.9.1", - "yaml": "^2.4.5" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.0.0-alpha.58.tgz", - "integrity": "sha512-0mvrodNhExpkWns+5RaZP8YqsAfPyjmPVVM1p+kaJkvApMH58/VFcQ0iSQuun0bFRNCMvW0ZUdulS9AsHqVXkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.0.0-alpha.58", - "@typescript-eslint/parser": "8.0.0-alpha.58", - "@typescript-eslint/utils": "8.0.0-alpha.58" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", - "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.5", - "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", - "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", - "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.4", - "@vitest/pretty-format": "^2.0.4", - "@vitest/runner": "2.0.4", - "@vitest/snapshot": "2.0.4", - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.0.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.4", - "@vitest/ui": "2.0.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest-canvas-mock": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/vitest-canvas-mock/-/vitest-canvas-mock-0.3.3.tgz", - "integrity": "sha512-3P968tYBpqYyzzOaVtqnmYjqbe13576/fkjbDEJSfQAkHtC5/UjuRHOhFEN/ZV5HVZIkaROBUWgazDKJ+Ibw+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-canvas-mock": "~2.5.2" - }, - "peerDependencies": { - "vitest": "*" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/watskeburt": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.1.0.tgz", - "integrity": "sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw==", - "dev": true, - "bin": { - "watskeburt": "dist/run-cli.js" - }, - "engines": { - "node": "^18||>=20" - } - }, - "node_modules/webfontloader": { - "version": "1.6.28", - "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", - "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==", - "license": "Apache-2.0" - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } + "name": "pokemon-rogue-battle", + "version": "1.7.7", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pokemon-rogue-battle", + "version": "1.7.7", + "hasInstallScript": true, + "dependencies": { + "@material/material-color-utilities": "^0.2.7", + "crypto-js": "^4.2.0", + "i18next": "^23.11.1", + "i18next-browser-languagedetector": "^7.2.1", + "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" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@eslint/js": "^9.3.0", + "@hpcc-js/wasm": "^2.18.0", + "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", + "@types/jsdom": "^21.1.7", + "@types/node": "^20.12.13", + "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", + "@typescript-eslint/parser": "^8.0.0-alpha.54", + "@vitest/coverage-istanbul": "^2.1.9", + "dependency-cruiser": "^16.3.10", + "eslint": "^9.7.0", + "eslint-plugin-import-x": "^4.2.1", + "inquirer": "^11.0.2", + "jsdom": "^24.0.0", + "lefthook": "^1.6.12", + "msw": "^2.4.9", + "phaser3spectorjs": "^0.0.8", + "typedoc": "^0.26.4", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.0-alpha.54", + "vite": "^5.4.14", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^2.1.9", + "vitest-canvas-mock": "^0.3.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", + "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.9.4", + "@biomejs/cli-darwin-x64": "1.9.4", + "@biomejs/cli-linux-arm64": "1.9.4", + "@biomejs/cli-linux-arm64-musl": "1.9.4", + "@biomejs/cli-linux-x64": "1.9.4", + "@biomejs/cli-linux-x64-musl": "1.9.4", + "@biomejs/cli-win32-arm64": "1.9.4", + "@biomejs/cli-win32-x64": "1.9.4" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", + "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", + "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", + "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", + "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", + "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", + "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", + "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", + "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", + "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cookie": "^0.5.0" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", + "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", + "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@hpcc-js/wasm": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/wasm/-/wasm-2.18.0.tgz", + "integrity": "sha512-M9XVIvAXGH4Xcyb5UoiohWcn6fil89pcos/gClNdBZG2v+W48xSf2bjcA8BW131X/AFHUerVY28n1P1Jw81/9A==", + "dev": true, + "dependencies": { + "yargs": "17.7.2" + }, + "bin": { + "dot-wasm": "bin/dot-wasm.js" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz", + "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-4.0.1.tgz", + "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-3.0.1.tgz", + "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-3.0.1.tgz", + "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", + "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-3.0.1.tgz", + "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-2.0.1.tgz", + "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-3.0.1.tgz", + "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-6.0.1.tgz", + "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^3.0.1", + "@inquirer/confirm": "^4.0.1", + "@inquirer/editor": "^3.0.1", + "@inquirer/expand": "^3.0.1", + "@inquirer/input": "^3.0.1", + "@inquirer/number": "^2.0.1", + "@inquirer/password": "^3.0.1", + "@inquirer/rawlist": "^3.0.1", + "@inquirer/search": "^2.0.1", + "@inquirer/select": "^3.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-3.0.1.tgz", + "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-2.0.1.tgz", + "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-3.0.1.tgz", + "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@material/material-color-utilities": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.2.7.tgz", + "integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==", + "license": "Apache-2.0" + }, + "node_modules/@mswjs/interceptors": { + "version": "0.35.8", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.8.tgz", + "integrity": "sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.12.0.tgz", + "integrity": "sha512-mc1cLbm6UQ8RxLc0dZES7v5rkH+99LxQp/ZvTqV3NLyYsO/fD6JhEflP1H5b2SDq9gI0+0G36AVZWxvounfR9w==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.4" + } + }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "2.6.0-beta.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.0-beta.0.tgz", + "integrity": "sha512-KQiNvzNzvl9AmMs1MiIBszLIy/Xy1bTExnyaVy5dSzOF9c+yT64JQfH0p0jP6XpGwoCnZsrPUNflwP30G42QBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^8.56.10", + "acorn": "^8.12.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-js/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "2.6.0-beta.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.6.0-beta.0.tgz", + "integrity": "sha512-WMz1zgmMC3bvg1L/tiYt5ygvDbTDKlbezoHoX2lV9MnUCAEQZUP4xJ9Wj3jmIKxb4mUuK5+vFZJVcOygvbbqow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@stylistic/eslint-plugin-js": "2.6.0-beta.0", + "@types/eslint": "^8.56.10", + "@typescript-eslint/utils": "^8.0.0-alpha.34" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "8.56.11", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz", + "integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/jsdom": { + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.58.tgz", + "integrity": "sha512-5G9oIj8jvosj8RTa0VDFXvRmUg1U6FxXJu7ZEfyJYMvFkdMJoY5YnzFvgAvHbYsXOj+YgXZu81fNOTRWQzwk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.0.0-alpha.58", + "@typescript-eslint/type-utils": "8.0.0-alpha.58", + "@typescript-eslint/utils": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0-alpha.58.tgz", + "integrity": "sha512-/RpgxIejBui6WXJgV9ukwzxmvbZt5TlfHUGGLB/BsNLj+NRZEbXVtWT9rKuxVOqsGb1Dn9c5gxvBI/XzyuIsMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.0.0-alpha.58", + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.58.tgz", + "integrity": "sha512-bGgJXn8B3Pf3mzEOUQTPxEqhux54MOJSqw4HcgBReuP7dudz/hsN4TH9GqHbMXkFv8N4Ed1iqVRfgGeC8b1mGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.58.tgz", + "integrity": "sha512-spW/I/UAY6HM0lKj+/333Zb9arOvUoi8+H0cVNYHELPhOti9re9NjyyJFhck84PNiwi8WmpkEf3GXe7/h+Cquw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.0.0-alpha.58", + "@typescript-eslint/utils": "8.0.0-alpha.58", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0-alpha.58.tgz", + "integrity": "sha512-6+jM4y31a6pwKeV3MVQuVXPZl6d3I1ySMvP5WjZdZ+n57uovMvasZ3ZJstXngoRpa7JtkjVZ7NrMhQ1J8dxKCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.58.tgz", + "integrity": "sha512-hm4nsoJnQcA7axMopUJrH7CD0MJhAMtE2zQt65uMFCy+U2YDdKPwE0g6qEAUBoKn6UBLQJWthJgUmwDbWrnwZg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.58", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0-alpha.58.tgz", + "integrity": "sha512-lZuGnpK23jr3huebgY4/qqrOKsWJ8dX0Q1Fo4oVYcyAy+sK6p+6nObK4VEPJG098gUmrriiavRiDKIhPDFm4Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.0.0-alpha.58", + "@typescript-eslint/types": "8.0.0-alpha.58", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.58" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.58.tgz", + "integrity": "sha512-V//E9PRY2216kh9fN/ihRvTtjpobAXEtmrsr3utlVUwHa2iklcofq1J12yl3KOjx9QBRfBrtfQnYaeruF7L0Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.0.0-alpha.58", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitest/coverage-istanbul": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.1.9.tgz", + "integrity": "sha512-vdYE4FkC/y2lxcN3Dcj54Bw+ericmDwiex0B8LV5F/YNYEYP1mgVwhPnHwWGAXu38qizkjOuyczKbFTALfzFKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@istanbuljs/schema": "^0.1.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-instrument": "^6.0.3", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magicast": "^0.3.5", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.1.9" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-jsx-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", + "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn-loose": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.4.0.tgz", + "integrity": "sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001642", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", + "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dependency-cruiser": { + "version": "16.3.10", + "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.10.tgz", + "integrity": "sha512-WkCnibHBfvaiaQ+S46LZ6h4AR6oj42Vsf5/0Vgtrwdwn7ZekMJdZ/ALoTwNp/RaGlKW+MbV/fhSZOvmhAWVWzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "8.12.1", + "acorn-jsx": "5.3.2", + "acorn-jsx-walk": "2.0.0", + "acorn-loose": "8.4.0", + "acorn-walk": "8.3.3", + "ajv": "8.17.1", + "commander": "12.1.0", + "enhanced-resolve": "5.17.1", + "ignore": "5.3.1", + "interpret": "^3.1.1", + "is-installed-globally": "1.0.0", + "json5": "2.2.3", + "memoize": "10.0.0", + "picocolors": "1.0.1", + "picomatch": "4.0.2", + "prompts": "2.4.2", + "rechoir": "^0.8.0", + "safe-regex": "2.1.1", + "semver": "^7.6.3", + "teamcity-service-messages": "0.1.14", + "tsconfig-paths-webpack-plugin": "4.1.0", + "watskeburt": "4.1.0" + }, + "bin": { + "depcruise": "bin/dependency-cruise.mjs", + "depcruise-baseline": "bin/depcruise-baseline.mjs", + "depcruise-fmt": "bin/depcruise-fmt.mjs", + "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs", + "dependency-cruise": "bin/dependency-cruise.mjs", + "dependency-cruiser": "bin/dependency-cruise.mjs" + }, + "engines": { + "node": "^18.17||>=20" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.830", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.830.tgz", + "integrity": "sha512-TrPKKH20HeN0J1LHzsYLs2qwXrp8TF4nHdu4sq61ozGbzMpWhI7iIOPYPPkxeq1azMT9PZ8enPFcftbs/Npcjg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.7.0.tgz", + "integrity": "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.17.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.7.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import-x": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.2.1.tgz", + "integrity": "sha512-WWi2GedccIJa0zXxx3WDnTgouGQTtdYK1nhXMwywbqqAgB0Ov+p1pYBsWh3VaB0bvBOwLse6OfVII7jZD9xo5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.1.0", + "debug": "^4.3.4", + "doctrine": "^3.0.0", + "eslint-import-resolver-node": "^0.3.9", + "get-tsconfig": "^4.7.3", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3", + "semver": "^7.6.3", + "stable-hash": "^0.0.4", + "tslib": "^2.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/scope-manager": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/types": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-scope": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", + "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/i18next": { + "version": "23.12.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", + "integrity": "sha512-XIeh5V+bi8SJSWGL3jqbTEBW5oD6rbP5L+E7dVQh1MNTxxYef0x15rhJVcRb7oiuq4jLtgy2SD8eFlf6P2cmqg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz", + "integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-http-backend": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.6.1.tgz", + "integrity": "sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==", + "license": "MIT", + "dependencies": { + "cross-fetch": "4.0.0" + } + }, + "node_modules/i18next-korean-postposition-processor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/i18next-korean-postposition-processor/-/i18next-korean-postposition-processor-1.0.0.tgz", + "integrity": "sha512-ruNXjI9awsFK6Ie+F9gYaMW8ciLMuCkeRjH9QkSv2Wb8xI0mnm773v3M9eua8dtvAXudIUk4p6Ho7hNkEASXDg==", + "license": "MIT", + "peerDependencies": { + "i18next": ">=8.4.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-11.0.2.tgz", + "integrity": "sha512-pnbn3nL+JFrTw/pLhzyE/IQ3+gA3n5JxTAZQDjB6qu4gbjOaiTnpZbxT6HY2DDCT7bzDjTTsd3snRP+B6N//Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/prompts": "^6.0.1", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "ansi-escapes": "^4.3.2", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-canvas-mock": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", + "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssfontparser": "^1.2.1", + "moo-color": "^1.0.2" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", + "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.10", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.17.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "license": "Public Domain", + "funding": { + "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", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lefthook": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.7.4.tgz", + "integrity": "sha512-lVv3nKH9l3KMDS3bySROvWJSw1+AsBHUO7xaA0rg1IEBZrj3+ePmM+a8elX+GU3Go1OzsZEYjo5AOOeLoZ7FQg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "lefthook": "bin/index.js" + }, + "optionalDependencies": { + "lefthook-darwin-arm64": "1.7.4", + "lefthook-darwin-x64": "1.7.4", + "lefthook-freebsd-arm64": "1.7.4", + "lefthook-freebsd-x64": "1.7.4", + "lefthook-linux-arm64": "1.7.4", + "lefthook-linux-x64": "1.7.4", + "lefthook-windows-arm64": "1.7.4", + "lefthook-windows-x64": "1.7.4" + } + }, + "node_modules/lefthook-darwin-arm64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.7.4.tgz", + "integrity": "sha512-6XpenaP0W7ZYA3lhHey/C1U+KmYz6eCq2cGswQsrTX+xdtHdWW3NbbOKngxATRTF8+CtF6m9UB2afP7qqkCghQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/lefthook-darwin-x64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.7.4.tgz", + "integrity": "sha512-lpQXbPMHiaWE7+9fV+spjuMKiZ3J/+oI6hY1/l48MO3LmSpIv6DNy0VHho1fZVQnHdBU4bDh5c1G0r1f5T0irg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/lefthook-freebsd-arm64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.7.4.tgz", + "integrity": "sha512-wv+JZgkD1/wi4X5aKKNodvxNcFcYmvL7uyzKkbtd/LgX5ssh9r5pO9J/71ULGtEuTXH4kqORRtez7u/ygqMEew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/lefthook-freebsd-x64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.7.4.tgz", + "integrity": "sha512-xoYR0Ay8pbyY9W9mI+iI9VDkkCVYSXhMf9XyOChSlu2XmjKiqi23hjCXvSOpvHQ7jphGvAVpE3Byijr6Xjuihw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/lefthook-linux-arm64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.7.4.tgz", + "integrity": "sha512-WvXWzSM/e08n2f5lcC8j+pUMS0RzZftJK4zuBQ36TstSYXfBjWiw+FMnKCVZk6Q8Zc0icyF8sTmKQAyKCgX+UA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/lefthook-linux-x64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.7.4.tgz", + "integrity": "sha512-eR5NxGzqPJm3wDTm4HStwGxOZ8Omb0ooodyuQdEOxtYidLrd4U18N14huwCEFd3BAOrjIWYV8plH+ReTZE56eg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/lefthook-windows-arm64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.7.4.tgz", + "integrity": "sha512-C+MdHH+0ylermetMHwfHsYYNI5HI6QEOx7N4Iw4Ea6c3Yuj3eG3LsAzrhsup7KLSSBmDgIHOCJUx/Mfh2z+ATw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/lefthook-windows-x64": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.7.4.tgz", + "integrity": "sha512-BDQhiRzmMYPFQFtVtkRfUfeZuSlemG1oJfGKYXlCGFskvK9Jm1nGFnG0Ig63FAQaFdW33DFoLdr9ZKFTUQeSwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "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", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "node_modules/memoize": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.0.0.tgz", + "integrity": "sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/memoize?sponsor=1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/moo-color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", + "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msw": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.4.9.tgz", + "integrity": "sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.35.8", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.3.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/@inquirer/confirm": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", + "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/msw/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/msw/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", + "dev": true + }, + "node_modules/nwsapi": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "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", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/phaser": { + "version": "3.80.1", + "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.80.1.tgz", + "integrity": "sha512-VQGAWoDOkEpAWYkI+PUADv5Ql+SM0xpLuAMBJHz9tBcOLqjJ2wd8bUhxJgOqclQlLTg97NmMd9MhS75w16x1Cw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1" + } + }, + "node_modules/phaser3-rex-plugins": { + "version": "1.80.5", + "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.5.tgz", + "integrity": "sha512-hdL3Cm6dK72w6phQdGnEiqqntlwT8SvjU0yit7DkdqiPy/Io1g3KnsRFqndtY+Hu69zaMEuckpIVeQK6yVwx4A==", + "dependencies": { + "eventemitter3": "^3.1.2", + "i18next": "^22.5.1", + "i18next-http-backend": "^2.5.2", + "js-yaml": "^4.1.0", + "mustache": "^4.2.0", + "papaparse": "^5.4.1", + "webfontloader": "^1.6.28" + } + }, + "node_modules/phaser3-rex-plugins/node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "license": "MIT" + }, + "node_modules/phaser3-rex-plugins/node_modules/i18next": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", + "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.6" + } + }, + "node_modules/phaser3spectorjs": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/phaser3spectorjs/-/phaser3spectorjs-0.0.8.tgz", + "integrity": "sha512-0dSO7/aMjEUPrp5EcjRvRRsEf+jXDbmzalPeJ6VtTB2Pn1PeaKc+qlL/DmO3l1Dvc5lkzc+Sil1Ta+Hkyi5cbA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "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", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "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", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.12.0.tgz", + "integrity": "sha512-BuAxWOm5JhRcbSOl7XCei8wGjgJJonnV0oipUupPY58iULxUGyHhW5CF+9FRMuM1pcJ5cGEJGll1LusX6FwpPA==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.12.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "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", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/teamcity-service-messages": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz", + "integrity": "sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfck": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", + "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedoc": { + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.5.tgz", + "integrity": "sha512-Vn9YKdjKtDZqSk+by7beZ+xzkkr8T8CYoiasqyt4TTRFy5+UHzL/mF/o4wGBjRF+rlWQHDb0t6xCpA3JNL5phg==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.9.1", + "yaml": "^2.4.5" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.0.0-alpha.58", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.0.0-alpha.58.tgz", + "integrity": "sha512-0mvrodNhExpkWns+5RaZP8YqsAfPyjmPVVM1p+kaJkvApMH58/VFcQ0iSQuun0bFRNCMvW0ZUdulS9AsHqVXkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.0.0-alpha.58", + "@typescript-eslint/parser": "8.0.0-alpha.58", + "@typescript-eslint/utils": "8.0.0-alpha.58" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "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.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", + "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest-canvas-mock": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/vitest-canvas-mock/-/vitest-canvas-mock-0.3.3.tgz", + "integrity": "sha512-3P968tYBpqYyzzOaVtqnmYjqbe13576/fkjbDEJSfQAkHtC5/UjuRHOhFEN/ZV5HVZIkaROBUWgazDKJ+Ibw+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-canvas-mock": "~2.5.2" + }, + "peerDependencies": { + "vitest": "*" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/watskeburt": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.1.0.tgz", + "integrity": "sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw==", + "dev": true, + "bin": { + "watskeburt": "dist/run-cli.js" + }, + "engines": { + "node": "^18||>=20" + } + }, + "node_modules/webfontloader": { + "version": "1.6.28", + "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", + "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } } diff --git a/package.json b/package.json index a31296d1644..ce9e8b4a07b 100644 --- a/package.json +++ b/package.json @@ -1,70 +1,71 @@ { - "name": "pokemon-rogue-battle", - "private": true, - "version": "1.1.0", - "type": "module", - "scripts": { - "start": "vite", - "start:dev": "vite --mode development", - "build": "vite build", - "build:beta": "vite build --mode beta", - "preview": "vite preview", - "test": "vitest run --project pre && vitest run --project main", - "test:cov": "vitest run --project pre && vitest run --project main --coverage", - "test:watch": "vitest run --project pre && vitest watch --project main --coverage", - "test:silent": "vitest run --project pre && vitest run --project main --silent", - "typecheck": "tsc --noEmit", - "eslint": "eslint --fix .", - "eslint-ci": "eslint .", - "docs": "typedoc", - "depcruise": "depcruise src", - "depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg", - "create-test": "node ./create-test-boilerplate.js", - "postinstall": "npx lefthook install && npx lefthook run post-merge" - }, - "devDependencies": { - "@eslint/js": "^9.3.0", - "@hpcc-js/wasm": "^2.18.0", - "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", - "@types/jsdom": "^21.1.7", - "@types/node": "^20.12.13", - "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", - "@typescript-eslint/parser": "^8.0.0-alpha.54", - "@vitest/coverage-istanbul": "^2.0.4", - "dependency-cruiser": "^16.3.10", - "eslint": "^9.7.0", - "eslint-plugin-import-x": "^4.2.1", - "inquirer": "^11.0.2", - "jsdom": "^24.0.0", - "lefthook": "^1.6.12", - "msw": "^2.4.9", - "phaser3spectorjs": "^0.0.8", - "typedoc": "^0.26.4", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.0-alpha.54", - "vite": "^5.4.8", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.0.4", - "vitest-canvas-mock": "^0.3.3" - }, - "dependencies": { - "@material/material-color-utilities": "^0.2.7", - "crypto-js": "^4.2.0", - "i18next": "^23.11.1", - "i18next-browser-languagedetector": "^7.2.1", - "i18next-http-backend": "^2.6.1", - "i18next-korean-postposition-processor": "^1.0.0", - "json-stable-stringify": "^1.1.0", - "phaser": "^3.70.0", - "phaser3-rex-plugins": "^1.1.84" - }, - "engines": { - "node": ">=20.0.0" - }, - "imports": { - "#enums/*": "./enums/*", - "#app": "./src/main.js", - "#app/*": "./src/*", - "#test/*": "./src/test/*" - } + "name": "pokemon-rogue-battle", + "private": true, + "version": "1.7.7", + "type": "module", + "scripts": { + "start": "vite", + "start:dev": "vite --mode development", + "build": "vite build", + "build:beta": "vite build --mode beta", + "preview": "vite preview", + "test": "vitest run --project pre && vitest run --project main", + "test:cov": "vitest run --project pre && vitest run --project main --coverage", + "test:watch": "vitest run --project pre && vitest watch --project main --coverage", + "test:silent": "vitest run --project pre && vitest run --project main --silent", + "typecheck": "tsc --noEmit", + "eslint": "eslint --fix .", + "eslint-ci": "eslint .", + "biome": "biome check --write --changed --no-errors-on-unmatched", + "biome-ci": "biome ci --diagnostic-level=error --reporter=github --changed --no-errors-on-unmatched", + "docs": "typedoc", + "depcruise": "depcruise src", + "depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg", + "create-test": "node ./create-test-boilerplate.js", + "postinstall": "npx lefthook install && npx lefthook run post-merge", + "update-version:patch": "npm version patch --force --no-git-tag-version", + "update-version:minor": "npm version minor --force --no-git-tag-version", + "update-locales:remote": "git submodule update --progress --init --recursive --force --remote" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@eslint/js": "^9.3.0", + "@hpcc-js/wasm": "^2.18.0", + "@stylistic/eslint-plugin-ts": "^2.6.0-beta.0", + "@types/jsdom": "^21.1.7", + "@types/node": "^20.12.13", + "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", + "@typescript-eslint/parser": "^8.0.0-alpha.54", + "@vitest/coverage-istanbul": "^2.1.9", + "dependency-cruiser": "^16.3.10", + "eslint": "^9.7.0", + "eslint-plugin-import-x": "^4.2.1", + "inquirer": "^11.0.2", + "jsdom": "^24.0.0", + "lefthook": "^1.6.12", + "msw": "^2.4.9", + "phaser3spectorjs": "^0.0.8", + "typedoc": "^0.26.4", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.0-alpha.54", + "vite": "^5.4.14", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^2.1.9", + "vitest-canvas-mock": "^0.3.3" + }, + "dependencies": { + "@material/material-color-utilities": "^0.2.7", + "crypto-js": "^4.2.0", + "i18next": "^23.11.1", + "i18next-browser-languagedetector": "^7.2.1", + "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" + }, + "engines": { + "node": ">=20.0.0" + } } diff --git a/public/audio/bgm/battle_champion_kukui.mp3 b/public/audio/bgm/battle_champion_kukui.mp3 new file mode 100644 index 00000000000..9e0739fc4d0 Binary files /dev/null and b/public/audio/bgm/battle_champion_kukui.mp3 differ diff --git a/public/audio/bgm/battle_colress.mp3 b/public/audio/bgm/battle_colress.mp3 new file mode 100644 index 00000000000..49a5557860b Binary files /dev/null and b/public/audio/bgm/battle_colress.mp3 differ diff --git a/public/audio/bgm/battle_mustard.mp3 b/public/audio/bgm/battle_mustard.mp3 new file mode 100644 index 00000000000..dccb8f7dcc5 Binary files /dev/null and b/public/audio/bgm/battle_mustard.mp3 differ diff --git a/public/audio/bgm/battle_plasma_grunt.mp3 b/public/audio/bgm/battle_plasma_grunt.mp3 index 7d1bf710bc5..c3d004514d0 100644 Binary files a/public/audio/bgm/battle_plasma_grunt.mp3 and b/public/audio/bgm/battle_plasma_grunt.mp3 differ diff --git a/public/audio/bgm/end.mp3 b/public/audio/bgm/end.mp3 index c37973fd9cc..fa33f890dc3 100644 Binary files a/public/audio/bgm/end.mp3 and b/public/audio/bgm/end.mp3 differ 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/audio/bgm/graveyard.mp3 b/public/audio/bgm/graveyard.mp3 index 48092fa3ec2..45571f16d09 100644 Binary files a/public/audio/bgm/graveyard.mp3 and b/public/audio/bgm/graveyard.mp3 differ diff --git a/public/audio/bgm/title.mp3 b/public/audio/bgm/title.mp3 index 86d4be0da35..8ad451a52a9 100644 Binary files a/public/audio/bgm/title.mp3 and b/public/audio/bgm/title.mp3 differ diff --git a/public/audio/se/crit_throw.wav b/public/audio/se/crit_throw.wav new file mode 100644 index 00000000000..a737410e7ce Binary files /dev/null and b/public/audio/se/crit_throw.wav 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/battle-anims/common-terastallize.json b/public/battle-anims/common-terastallize.json new file mode 100644 index 00000000000..3843464dbde --- /dev/null +++ b/public/battle-anims/common-terastallize.json @@ -0,0 +1,774 @@ +{ + "graphic": "terastallize", + "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": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 150, + "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": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 225, + "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": 0, + "y": -20, + "zoomX": 70, + "zoomY": 70, + "visible": true, + "target": 2, + "graphicFrame": 1, + "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": 0, + "y": -20, + "zoomX": 70, + "zoomY": 70, + "visible": true, + "target": 2, + "graphicFrame": 1, + "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": 0, + "y": -20, + "zoomX": 90, + "zoomY": 90, + "visible": true, + "target": 2, + "graphicFrame": 1, + "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": 0, + "y": -20, + "zoomX": 90, + "zoomY": 90, + "visible": true, + "target": 2, + "graphicFrame": 1, + "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": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "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": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "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": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "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": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 200, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "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": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 100, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "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": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 100, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "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": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 60, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "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": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 60, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "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": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 60, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 100, + 100, + 100, + 0 + ], + "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, + "tone": [ + 255, + 255, + 255, + 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, + "tone": [ + 255, + 255, + 255, + 0 + ], + "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, + "tone": [ + 255, + 255, + 255, + 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": {}, + "position": 4, + "hue": 0 +} \ No newline at end of file diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 947bffd399d..50e10a8822d 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -183,6 +183,8 @@ "487-origin", "531-mega", "531-mega", + "569-gigantamax", + "569-gigantamax", "6-mega", "6-mega", "6-mega-x", @@ -201,6 +203,8 @@ "6211", "6215", "6215", + "6215f", + "6215f", "65-mega", "65-mega", "650", @@ -259,10 +263,10 @@ "666-fancy", "666-garden", "666-garden", - "666-high", - "666-high", - "666-icy", - "666-icy", + "666-high-plains", + "666-high-plains", + "666-icy-snow", + "666-icy-snow", "666-jungle", "666-jungle", "666-marine", @@ -275,8 +279,8 @@ "666-monsoon", "666-ocean", "666-ocean", - "666-poke", - "666-poke", + "666-poke-ball", + "666-poke-ball", "666-polar", "666-polar", "666-river", @@ -291,8 +295,8 @@ "666-tundra", "667", "667", - "668-female", - "668-female", + "668f", + "668f", "668", "668", "669-blue", @@ -337,8 +341,6 @@ "6724", "673", "673", - "674", - "674", "675", "675", "676", @@ -381,16 +383,12 @@ "692", "693", "693", - "694", - "694", "695", "695", "696", "696", "697", "697", - "698", - "698", "699", "699", "700", @@ -399,18 +397,12 @@ "701", "702", "702", - "703", - "703", "704", "704", "705", "705", "706", "706", - "707", - "707", - "708", - "708", "709", "709", "710", @@ -421,8 +413,6 @@ "712", "713", "713", - "714", - "714", "715", "715", "716-active", @@ -431,16 +421,10 @@ "716-neutral", "717", "717", - "718-10", - "718-10", "718-complete", "718-complete", - "718", - "718", "719-mega", "719-mega", - "719", - "719", "720-unbound", "720-unbound", "720", @@ -711,6 +695,8 @@ "814", "815", "815", + "815-gigantamax", + "815-gigantamax", "816", "816", "817", @@ -761,6 +747,8 @@ "838", "839", "839", + "839-gigantamax", + "839-gigantamax", "840", "840", "841", @@ -1085,8 +1073,6 @@ "978-droopy", "978-stretchy", "978-stretchy", - "979", - "979", "980", "980", "981", @@ -1315,6 +1301,8 @@ "487b-origin", "531b-mega", "531b-mega", + "569b-gigantamax", + "569b-gigantamax", "6b-mega", "6b-mega", "6b-mega-x", @@ -1333,6 +1321,8 @@ "6211b", "6215b", "6215b", + "6215bf", + "6215bf", "65b-mega", "65b-mega", "650b", @@ -1391,10 +1381,10 @@ "666b-fancy", "666b-garden", "666b-garden", - "666b-high", - "666b-high", - "666b-icy", - "666b-icy", + "666b-high-plains", + "666b-high-plains", + "666b-icy-snow", + "666b-icy-snow", "666b-jungle", "666b-jungle", "666b-marine", @@ -1407,8 +1397,8 @@ "666b-monsoon", "666b-ocean", "666b-ocean", - "666b-poke", - "666b-poke", + "666b-poke-ball", + "666b-poke-ball", "666b-polar", "666b-polar", "666b-river", @@ -1423,8 +1413,8 @@ "666b-tundra", "667b", "667b", - "668b-female", - "668b-female", + "668bf", + "668bf", "668b", "668b", "669b-blue", @@ -1469,8 +1459,6 @@ "6724b", "673b", "673b", - "674b", - "674b", "675b", "675b", "676b", @@ -1513,16 +1501,12 @@ "692b", "693b", "693b", - "694b", - "694b", "695b", "695b", "696b", "696b", "697b", "697b", - "698b", - "698b", "699b", "699b", "700b", @@ -1531,18 +1515,12 @@ "701b", "702b", "702b", - "703b", - "703b", "704b", "704b", "705b", "705b", "706b", "706b", - "707b", - "707b", - "708b", - "708b", "709b", "709b", "710b", @@ -1553,8 +1531,6 @@ "712b", "713b", "713b", - "714b", - "714b", "715b", "715b", "716b-active", @@ -1563,16 +1539,10 @@ "716b-neutral", "717b", "717b", - "718b-10", - "718b-10", "718b-complete", "718b-complete", - "718b", - "718b", "719b-mega", "719b-mega", - "719b", - "719b", "720b-unbound", "720b-unbound", "720b", @@ -1843,6 +1813,8 @@ "814b", "815b", "815b", + "815b-gigantamax", + "815b-gigantamax", "816b", "816b", "817b", @@ -1893,6 +1865,8 @@ "838b", "839b", "839b", + "839b-gigantamax", + "839b-gigantamax", "840b", "840b", "841b", @@ -2219,8 +2193,6 @@ "978b-droopy", "978b-stretchy", "978b-stretchy", - "979b", - "979b", "980b", "980b", "981b", @@ -2449,6 +2421,8 @@ "487sb-origin", "531sb-mega", "531sb-mega", + "569sb-gigantamax", + "569sb-gigantamax", "6sb-mega", "6sb-mega", "6sb-mega-x", @@ -2467,6 +2441,8 @@ "6211sb", "6215sb", "6215sb", + "6215sbf", + "6215sbf", "65sb-mega", "65sb-mega", "650sb", @@ -2525,10 +2501,10 @@ "666sb-fancy", "666sb-garden", "666sb-garden", - "666sb-high", - "666sb-high", - "666sb-icy", - "666sb-icy", + "666sb-high-plains", + "666sb-high-plains", + "666sb-icy-snow", + "666sb-icy-snow", "666sb-jungle", "666sb-jungle", "666sb-marine", @@ -2541,8 +2517,8 @@ "666sb-monsoon", "666sb-ocean", "666sb-ocean", - "666sb-poke", - "666sb-poke", + "666sb-poke-ball", + "666sb-poke-ball", "666sb-polar", "666sb-polar", "666sb-river", @@ -2559,6 +2535,8 @@ "667sb", "668sb", "668sb", + "668sbf", + "668sbf", "669sb-blue", "669sb-blue", "669sb-orange", @@ -2601,8 +2579,6 @@ "6724sb", "673sb", "673sb", - "674sb", - "674sb", "675sb", "675sb", "676sb", @@ -2645,16 +2621,12 @@ "692sb", "693sb", "693sb", - "694sb", - "694sb", "695sb", "695sb", "696sb", "696sb", "697sb", "697sb", - "698sb", - "698sb", "699sb", "699sb", "700sb", @@ -2663,18 +2635,12 @@ "701sb", "702sb", "702sb", - "703sb", - "703sb", "704sb", "704sb", "705sb", "705sb", "706sb", "706sb", - "707sb", - "707sb", - "708sb", - "708sb", "709sb", "709sb", "710sb", @@ -2685,8 +2651,6 @@ "712sb", "713sb", "713sb", - "714sb", - "714sb", "715sb", "715sb", "716sb-active", @@ -2695,16 +2659,10 @@ "716sb-neutral", "717sb", "717sb", - "718sb-10", - "718sb-10", "718sb-complete", "718sb-complete", - "718sb", - "718sb", "719sb-mega", "719sb-mega", - "719sb", - "719sb", "720sb-unbound", "720sb-unbound", "720sb", @@ -2975,6 +2933,8 @@ "814sb", "815sb", "815sb", + "815sb-gigantamax", + "815sb-gigantamax", "816sb", "816sb", "817sb", @@ -3025,6 +2985,8 @@ "838sb", "839sb", "839sb", + "839sb-gigantamax", + "839sb-gigantamax", "840sb", "840sb", "841sb", @@ -3351,8 +3313,6 @@ "978sb-droopy", "978sb-stretchy", "978sb-stretchy", - "979sb", - "979sb", "980sb", "980sb", "981sb", @@ -3586,6 +3546,8 @@ "487s-origin", "531s-mega", "531s-mega", + "569s-gigantamax", + "569s-gigantamax", "6s-mega", "6s-mega", "6s-mega-x", @@ -3604,6 +3566,8 @@ "6211s", "6215s", "6215s", + "6215sf", + "6215sf", "65s-mega", "65s-mega", "650s", @@ -3662,10 +3626,10 @@ "666s-fancy", "666s-garden", "666s-garden", - "666s-high", - "666s-high", - "666s-icy", - "666s-icy", + "666s-high-plains", + "666s-high-plains", + "666s-icy-snow", + "666s-icy-snow", "666s-jungle", "666s-jungle", "666s-marine", @@ -3678,8 +3642,8 @@ "666s-monsoon", "666s-ocean", "666s-ocean", - "666s-poke", - "666s-poke", + "666s-poke-ball", + "666s-poke-ball", "666s-polar", "666s-polar", "666s-river", @@ -3694,8 +3658,8 @@ "666s-tundra", "667s", "667s", - "668s-female", - "668s-female", + "668sf", + "668sf", "668s", "668s", "669s-blue", @@ -3740,8 +3704,6 @@ "6724s", "673s", "673s", - "674s", - "674s", "675s", "675s", "676s", @@ -3784,16 +3746,12 @@ "692s", "693s", "693s", - "694s", - "694s", "695s", "695s", "696s", "696s", "697s", "697s", - "698s", - "698s", "699s", "699s", "700s", @@ -3802,18 +3760,12 @@ "701s", "702s", "702s", - "703s", - "703s", "704s", "704s", "705s", "705s", "706s", "706s", - "707s", - "707s", - "708s", - "708s", "709s", "709s", "710s", @@ -3824,8 +3776,6 @@ "712s", "713s", "713s", - "714s", - "714s", "715s", "715s", "716s-active", @@ -3834,16 +3784,10 @@ "716s-neutral", "717s", "717s", - "718s-10", - "718s-10", "718s-complete", "718s-complete", - "718s", - "718s", "719s-mega", "719s-mega", - "719s", - "719s", "720s-unbound", "720s-unbound", "720s", @@ -4114,6 +4058,8 @@ "814s", "815s", "815s", + "815s-gigantamax", + "815s-gigantamax", "816s", "816s", "817s", @@ -4164,6 +4110,8 @@ "838s", "839s", "839s", + "839s-gigantamax", + "839s-gigantamax", "840s", "840s", "841s", @@ -4490,8 +4438,6 @@ "978s-droopy", "978s-stretchy", "978s-stretchy", - "979s", - "979s", "980s", "980s", "981s", @@ -4587,6 +4533,7 @@ "475-mega_3", "475-mega_3", "6215", + "6215f", "653", "654", "6549", @@ -4598,19 +4545,15 @@ "666-archipelago", "666-continental", "666-elegant", - "666-fancy_2", - "666-fancy_2", - "666-fancy_3", - "666-fancy_3", + "666-fancy", + "666-fancy", "666-garden", "666-high", - "666-icy", + "666-icy-snow", "666-jungle", "666-marine", - "666-meadow_2", - "666-meadow_2", - "666-meadow_3", - "666-meadow_3", + "666-meadow", + "666-meadow", "666-modern", "666-monsoon", "666-ocean", @@ -4619,8 +4562,6 @@ "666-poke", "666-polar", "666-river", - "666-river_2", - "666-river_2", "666-sandstorm", "666-savanna", "666-sun", @@ -4641,7 +4582,6 @@ "705_3", "705_3", "706", - "708", "709", "710", "711", @@ -4826,6 +4766,10 @@ "150b-mega", "181b-mega", "212b-mega", + "248b-mega", + "248b-mega", + "257b-mega", + "257b-mega", "282b-mega", "3b-mega_2", "3b-mega_2", @@ -4856,6 +4800,7 @@ "475b-mega_3", "475b-mega_3", "6215b", + "6215bf", "653b", "654b", "6549b", @@ -4866,86 +4811,46 @@ "665b", "665_2b", "665_2b", - "666b-archipelago_2", - "666b-archipelago_2", - "666b-archipelago_3", - "666b-archipelago_3", - "666b-continental_2", - "666b-continental_2", - "666b-continental_3", - "666b-continental_3", - "666b-elegant_2", - "666b-elegant_2", - "666b-elegant_3", - "666b-elegant_3", - "666b-fancy_2", - "666b-fancy_2", - "666b-fancy_3", - "666b-fancy_3", - "666b-garden_2", - "666b-garden_2", - "666b-garden_3", - "666b-garden_3", - "666b-high", - "666b-high", - "666b-high", - "666b-high", - "666b-icy", - "666b-icy", - "666b-icy", - "666b-icy", - "666b-jungle_2", - "666b-jungle_2", - "666b-jungle_3", - "666b-jungle_3", - "666b-marine_2", - "666b-marine_2", - "666b-marine_3", - "666b-marine_3", - "666b-meadow_2", - "666b-meadow_2", - "666b-meadow_3", - "666b-meadow_3", - "666b-modern_2", - "666b-modern_2", - "666b-modern_3", - "666b-modern_3", - "666b-monsoon_2", - "666b-monsoon_2", - "666b-monsoon_3", - "666b-monsoon_3", - "666b-ocean_2", - "666b-ocean_2", - "666b-ocean_3", - "666b-ocean_3", - "666b-poke", - "666b-poke", - "666b-poke", - "666b-poke", - "666b-polar_2", - "666b-polar_2", - "666b-polar_3", - "666b-polar_3", - "666b-river_2", - "666b-river_2", - "666b-river_3", - "666b-river_3", - "666b-sandstorm_2", - "666b-sandstorm_2", - "666b-sandstorm_3", - "666b-sandstorm_3", - "666b-savanna_2", - "666b-savanna_2", - "666b-savanna_3", - "666b-savanna_3", - "666b-sun_2", - "666b-sun_2", - "666b-sun_3", - "666b-sun_3", - "666b-tundra_2", - "666b-tundra_2", - "666b-tundra_3", - "666b-tundra_3", + "666b-archipelago", + "666b-archipelago", + "666b-continental", + "666b-continental", + "666b-elegant", + "666b-elegant", + "666b-fancy", + "666b-fancy", + "666b-garden", + "666b-garden", + "666b-high-plains", + "666b-high-plains", + "666b-icy-snow", + "666b-icy-snow", + "666b-jungle", + "666b-jungle", + "666b-marine", + "666b-marine", + "666b-meadow", + "666b-meadow", + "666b-modern", + "666b-modern", + "666b-monsoon", + "666b-monsoon", + "666b-ocean", + "666b-ocean", + "666b-poke-ball", + "666b-poke-ball", + "666b-polar", + "666b-polar", + "666b-river", + "666b-river", + "666b-sandstorm", + "666b-sandstorm", + "666b-savanna", + "666b-savanna", + "666b-sun", + "666b-sun", + "666b-tundra", + "666b-tundra", "6705b", "6706_2b", "6706_2b", @@ -4957,7 +4862,6 @@ "704b", "705b", "706b", - "708b", "709b", "710b", "711b", diff --git a/public/fonts/pkmnems.ttf b/public/fonts/pkmnems.ttf index b0b50d0f10f..2cc7bfeee62 100644 Binary files a/public/fonts/pkmnems.ttf and b/public/fonts/pkmnems.ttf differ diff --git a/public/fonts/pokemon-emerald-pro.ttf b/public/fonts/pokemon-emerald-pro.ttf index 84e49ebbc40..d63ff2d6470 100644 Binary files a/public/fonts/pokemon-emerald-pro.ttf and b/public/fonts/pokemon-emerald-pro.ttf differ 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/battle_anims/terastallize.png b/public/images/battle_anims/terastallize.png new file mode 100644 index 00000000000..78fbb7ec335 Binary files /dev/null and b/public/images/battle_anims/terastallize.png differ diff --git a/public/images/events/halloween2024-event-de.png b/public/images/events/halloween2024-event-de.png new file mode 100644 index 00000000000..a56053c73cc Binary files /dev/null and b/public/images/events/halloween2024-event-de.png differ diff --git a/public/images/events/halloween2024-event-en.png b/public/images/events/halloween2024-event-en.png new file mode 100644 index 00000000000..3886fa796ae Binary files /dev/null and b/public/images/events/halloween2024-event-en.png differ diff --git a/public/images/events/halloween2024-event-es-ES.png b/public/images/events/halloween2024-event-es-ES.png new file mode 100644 index 00000000000..dc9bac86cd0 Binary files /dev/null and b/public/images/events/halloween2024-event-es-ES.png differ diff --git a/public/images/events/halloween2024-event-fr.png b/public/images/events/halloween2024-event-fr.png new file mode 100644 index 00000000000..21df18c7471 Binary files /dev/null and b/public/images/events/halloween2024-event-fr.png differ diff --git a/public/images/events/halloween2024-event-it.png b/public/images/events/halloween2024-event-it.png new file mode 100644 index 00000000000..ce2316b2ce5 Binary files /dev/null and b/public/images/events/halloween2024-event-it.png differ diff --git a/public/images/events/halloween2024-event-ja.png b/public/images/events/halloween2024-event-ja.png new file mode 100644 index 00000000000..363f3b33b0d Binary files /dev/null and b/public/images/events/halloween2024-event-ja.png differ diff --git a/public/images/events/halloween2024-event-ko.png b/public/images/events/halloween2024-event-ko.png new file mode 100644 index 00000000000..3f52526a296 Binary files /dev/null and b/public/images/events/halloween2024-event-ko.png differ diff --git a/public/images/events/halloween2024-event-pt-BR.png b/public/images/events/halloween2024-event-pt-BR.png new file mode 100644 index 00000000000..764a9c1daa9 Binary files /dev/null and b/public/images/events/halloween2024-event-pt-BR.png differ diff --git a/public/images/events/halloween2024-event-zh-CN.png b/public/images/events/halloween2024-event-zh-CN.png new file mode 100644 index 00000000000..c2096a05d98 Binary files /dev/null and b/public/images/events/halloween2024-event-zh-CN.png differ diff --git a/public/images/events/pkmnday2025event-de.png b/public/images/events/pkmnday2025event-de.png new file mode 100644 index 00000000000..4cc53546752 Binary files /dev/null and b/public/images/events/pkmnday2025event-de.png differ diff --git a/public/images/events/pkmnday2025event-en.png b/public/images/events/pkmnday2025event-en.png new file mode 100644 index 00000000000..e9caa9e19d6 Binary files /dev/null and b/public/images/events/pkmnday2025event-en.png differ diff --git a/public/images/events/pkmnday2025event-es-ES.png b/public/images/events/pkmnday2025event-es-ES.png new file mode 100644 index 00000000000..e1ab096dffc Binary files /dev/null and b/public/images/events/pkmnday2025event-es-ES.png differ diff --git a/public/images/events/pkmnday2025event-fr.png b/public/images/events/pkmnday2025event-fr.png new file mode 100644 index 00000000000..037d1e06e61 Binary files /dev/null and b/public/images/events/pkmnday2025event-fr.png differ diff --git a/public/images/events/pkmnday2025event-it.png b/public/images/events/pkmnday2025event-it.png new file mode 100644 index 00000000000..f38a60330fa Binary files /dev/null and b/public/images/events/pkmnday2025event-it.png differ diff --git a/public/images/events/pkmnday2025event-ja.png b/public/images/events/pkmnday2025event-ja.png new file mode 100644 index 00000000000..94b02ad93a0 Binary files /dev/null and b/public/images/events/pkmnday2025event-ja.png differ diff --git a/public/images/events/pkmnday2025event-ko.png b/public/images/events/pkmnday2025event-ko.png new file mode 100644 index 00000000000..aed9ee3fb28 Binary files /dev/null and b/public/images/events/pkmnday2025event-ko.png differ diff --git a/public/images/events/pkmnday2025event-pt-BR.png b/public/images/events/pkmnday2025event-pt-BR.png new file mode 100644 index 00000000000..2190bbac535 Binary files /dev/null and b/public/images/events/pkmnday2025event-pt-BR.png differ diff --git a/public/images/events/pkmnday2025event-zh-CN.png b/public/images/events/pkmnday2025event-zh-CN.png new file mode 100644 index 00000000000..a3430482dd0 Binary files /dev/null and b/public/images/events/pkmnday2025event-zh-CN.png differ diff --git a/public/images/events/valentines2025event-de.png b/public/images/events/valentines2025event-de.png new file mode 100644 index 00000000000..8dd41924a77 Binary files /dev/null and b/public/images/events/valentines2025event-de.png differ diff --git a/public/images/events/valentines2025event-en.png b/public/images/events/valentines2025event-en.png new file mode 100644 index 00000000000..dc36dad3394 Binary files /dev/null and b/public/images/events/valentines2025event-en.png differ diff --git a/public/images/events/valentines2025event-es-ES.png b/public/images/events/valentines2025event-es-ES.png new file mode 100644 index 00000000000..0915299b7bd Binary files /dev/null and b/public/images/events/valentines2025event-es-ES.png differ diff --git a/public/images/events/valentines2025event-fr.png b/public/images/events/valentines2025event-fr.png new file mode 100644 index 00000000000..dbaf23101ed Binary files /dev/null and b/public/images/events/valentines2025event-fr.png differ diff --git a/public/images/events/valentines2025event-it.png b/public/images/events/valentines2025event-it.png new file mode 100644 index 00000000000..b10eb8083be Binary files /dev/null and b/public/images/events/valentines2025event-it.png differ diff --git a/public/images/events/valentines2025event-ja.png b/public/images/events/valentines2025event-ja.png new file mode 100644 index 00000000000..7e9fe5ad3d4 Binary files /dev/null and b/public/images/events/valentines2025event-ja.png differ diff --git a/public/images/events/valentines2025event-ko.png b/public/images/events/valentines2025event-ko.png new file mode 100644 index 00000000000..558a402fc77 Binary files /dev/null and b/public/images/events/valentines2025event-ko.png differ diff --git a/public/images/events/valentines2025event-pt-BR.png b/public/images/events/valentines2025event-pt-BR.png new file mode 100644 index 00000000000..45fa40f30fc Binary files /dev/null and b/public/images/events/valentines2025event-pt-BR.png differ diff --git a/public/images/events/valentines2025event-zh-CN.png b/public/images/events/valentines2025event-zh-CN.png new file mode 100644 index 00000000000..13256da720c Binary files /dev/null and b/public/images/events/valentines2025event-zh-CN.png differ diff --git a/public/images/events/winter_holidays2024-event-de.png b/public/images/events/winter_holidays2024-event-de.png new file mode 100644 index 00000000000..1c2e10086f2 Binary files /dev/null and b/public/images/events/winter_holidays2024-event-de.png differ diff --git a/public/images/events/winter_holidays2024-event-en.png b/public/images/events/winter_holidays2024-event-en.png new file mode 100644 index 00000000000..3a361e99bee Binary files /dev/null and b/public/images/events/winter_holidays2024-event-en.png differ diff --git a/public/images/events/winter_holidays2024-event-es-ES.png b/public/images/events/winter_holidays2024-event-es-ES.png new file mode 100644 index 00000000000..f7e64268ad5 Binary files /dev/null and b/public/images/events/winter_holidays2024-event-es-ES.png differ diff --git a/public/images/events/winter_holidays2024-event-fr.png b/public/images/events/winter_holidays2024-event-fr.png new file mode 100644 index 00000000000..278f5f2afd4 Binary files /dev/null and b/public/images/events/winter_holidays2024-event-fr.png differ diff --git a/public/images/events/winter_holidays2024-event-it.png b/public/images/events/winter_holidays2024-event-it.png new file mode 100644 index 00000000000..f3062f40d51 Binary files /dev/null and b/public/images/events/winter_holidays2024-event-it.png differ diff --git a/public/images/events/winter_holidays2024-event-ja.png b/public/images/events/winter_holidays2024-event-ja.png new file mode 100644 index 00000000000..0a217c81d03 Binary files /dev/null and b/public/images/events/winter_holidays2024-event-ja.png differ diff --git a/public/images/events/winter_holidays2024-event-ko.png b/public/images/events/winter_holidays2024-event-ko.png new file mode 100644 index 00000000000..83c9a8525f0 Binary files /dev/null and b/public/images/events/winter_holidays2024-event-ko.png differ diff --git a/public/images/events/winter_holidays2024-event-pt-BR.png b/public/images/events/winter_holidays2024-event-pt-BR.png new file mode 100644 index 00000000000..1f003be5986 Binary files /dev/null and b/public/images/events/winter_holidays2024-event-pt-BR.png differ diff --git a/public/images/events/winter_holidays2024-event-zh-CN.png b/public/images/events/winter_holidays2024-event-zh-CN.png new file mode 100644 index 00000000000..03a9f57c6f2 Binary files /dev/null and b/public/images/events/winter_holidays2024-event-zh-CN.png differ diff --git a/public/images/events/yearofthesnakeevent-de.png b/public/images/events/yearofthesnakeevent-de.png new file mode 100644 index 00000000000..f5e684bbcd5 Binary files /dev/null and b/public/images/events/yearofthesnakeevent-de.png differ diff --git a/public/images/events/yearofthesnakeevent-en.png b/public/images/events/yearofthesnakeevent-en.png new file mode 100644 index 00000000000..ddd34023b94 Binary files /dev/null and b/public/images/events/yearofthesnakeevent-en.png differ diff --git a/public/images/events/yearofthesnakeevent-es-ES.png b/public/images/events/yearofthesnakeevent-es-ES.png new file mode 100644 index 00000000000..76474c475c5 Binary files /dev/null and b/public/images/events/yearofthesnakeevent-es-ES.png differ diff --git a/public/images/events/yearofthesnakeevent-fr.png b/public/images/events/yearofthesnakeevent-fr.png new file mode 100644 index 00000000000..88ad3e770ca Binary files /dev/null and b/public/images/events/yearofthesnakeevent-fr.png differ diff --git a/public/images/events/yearofthesnakeevent-it.png b/public/images/events/yearofthesnakeevent-it.png new file mode 100644 index 00000000000..a02e7048d2a Binary files /dev/null and b/public/images/events/yearofthesnakeevent-it.png differ diff --git a/public/images/events/yearofthesnakeevent-ja.png b/public/images/events/yearofthesnakeevent-ja.png new file mode 100644 index 00000000000..ba13b5d281f Binary files /dev/null and b/public/images/events/yearofthesnakeevent-ja.png differ diff --git a/public/images/events/yearofthesnakeevent-ko.png b/public/images/events/yearofthesnakeevent-ko.png new file mode 100644 index 00000000000..dca6bcbbd15 Binary files /dev/null and b/public/images/events/yearofthesnakeevent-ko.png differ diff --git a/public/images/events/yearofthesnakeevent-pt-BR.png b/public/images/events/yearofthesnakeevent-pt-BR.png new file mode 100644 index 00000000000..a535aec2aa5 Binary files /dev/null and b/public/images/events/yearofthesnakeevent-pt-BR.png differ diff --git a/public/images/events/yearofthesnakeevent-zh-CN.png b/public/images/events/yearofthesnakeevent-zh-CN.png new file mode 100644 index 00000000000..3ab4fc565a7 Binary files /dev/null and b/public/images/events/yearofthesnakeevent-zh-CN.png differ diff --git a/public/images/items.json b/public/images/items.json index 3c9cff7a35a..9d84476a8a0 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -3353,12 +3353,12 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 24, - "h": 23 + "w": 32, + "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 1, + "x": 5, + "y": 5, "w": 22, "h": 21 }, @@ -8436,6 +8436,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:875c6d67e72590dfc6d319101aa31cfa:dd2bb865ecbc5ac7b975ddf70b993334:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:d91a46c431ace3f09f5ca68916a2171e:1e84369d9a13e1416fa58028d629d116:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 1bd7b3af9c3..191766f520e 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/berry_juice.png b/public/images/items/berry_juice.png index c0986b804f9..127fa458906 100644 Binary files a/public/images/items/berry_juice.png and b/public/images/items/berry_juice.png differ diff --git a/public/images/items/catching_charm.png b/public/images/items/catching_charm.png index 9d72fe465e3..c220ff70c03 100644 Binary files a/public/images/items/catching_charm.png and b/public/images/items/catching_charm.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/1012-counterfeit.png b/public/images/pokemon/1012-counterfeit.png index 2482debd312..32d9c1790c9 100644 Binary files a/public/images/pokemon/1012-counterfeit.png and b/public/images/pokemon/1012-counterfeit.png differ diff --git a/public/images/pokemon/1013-unremarkable.png b/public/images/pokemon/1013-unremarkable.png index a70954685ed..aaf57aa1a02 100644 Binary files a/public/images/pokemon/1013-unremarkable.png and b/public/images/pokemon/1013-unremarkable.png differ diff --git a/public/images/pokemon/154.png b/public/images/pokemon/154.png index 74370115aa6..7547d4c573a 100644 Binary files a/public/images/pokemon/154.png and b/public/images/pokemon/154.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/172-spiky.png b/public/images/pokemon/172-spiky.png index 2a02c6fb268..f74c6574344 100644 Binary files a/public/images/pokemon/172-spiky.png and b/public/images/pokemon/172-spiky.png differ diff --git a/public/images/pokemon/172.png b/public/images/pokemon/172.png index 435ebbe4c63..9e96ff34936 100644 Binary files a/public/images/pokemon/172.png and b/public/images/pokemon/172.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/194.png b/public/images/pokemon/194.png index 589c2ae155a..d126190685b 100644 Binary files a/public/images/pokemon/194.png and b/public/images/pokemon/194.png differ diff --git a/public/images/pokemon/198.png b/public/images/pokemon/198.png index 3d6c15f1a1d..5a310216129 100644 Binary files a/public/images/pokemon/198.png and b/public/images/pokemon/198.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/2026.png b/public/images/pokemon/2026.png index 78c881eb10d..fde7405f65a 100644 Binary files a/public/images/pokemon/2026.png and b/public/images/pokemon/2026.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-beauty-cosplay.png b/public/images/pokemon/25-beauty-cosplay.png index a0c4c5717b2..0db73184c8e 100644 Binary files a/public/images/pokemon/25-beauty-cosplay.png and b/public/images/pokemon/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/25-cool-cosplay.png b/public/images/pokemon/25-cool-cosplay.png index 209509f12fc..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/25-cosplay.png b/public/images/pokemon/25-cosplay.png index 9a70984cc8b..217ab730cc4 100644 Binary files a/public/images/pokemon/25-cosplay.png and b/public/images/pokemon/25-cosplay.png differ diff --git a/public/images/pokemon/25-cute-cosplay.png b/public/images/pokemon/25-cute-cosplay.png index 5c4adce2304..17fdfd32609 100644 Binary files a/public/images/pokemon/25-cute-cosplay.png and b/public/images/pokemon/25-cute-cosplay.png differ diff --git a/public/images/pokemon/25-gigantamax.png b/public/images/pokemon/25-gigantamax.png index b9f3f037788..e39511341a3 100644 Binary files a/public/images/pokemon/25-gigantamax.png and b/public/images/pokemon/25-gigantamax.png differ diff --git a/public/images/pokemon/25-partner.png b/public/images/pokemon/25-partner.png index 7b1104a3a55..f1cb33f9701 100644 Binary files a/public/images/pokemon/25-partner.png and b/public/images/pokemon/25-partner.png differ diff --git a/public/images/pokemon/25-smart-cosplay.png b/public/images/pokemon/25-smart-cosplay.png index edafa4d2a21..603837dd34f 100644 Binary files a/public/images/pokemon/25-smart-cosplay.png and b/public/images/pokemon/25-smart-cosplay.png differ diff --git a/public/images/pokemon/25-tough-cosplay.png b/public/images/pokemon/25-tough-cosplay.png index ecadee4ff27..380269b87e7 100644 Binary files a/public/images/pokemon/25-tough-cosplay.png and b/public/images/pokemon/25-tough-cosplay.png differ diff --git a/public/images/pokemon/25.png b/public/images/pokemon/25.png index 7b1104a3a55..f1cb33f9701 100644 Binary files a/public/images/pokemon/25.png and b/public/images/pokemon/25.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/26.png b/public/images/pokemon/26.png index ae0a7aeab62..f2cdf63c718 100644 Binary files a/public/images/pokemon/26.png and b/public/images/pokemon/26.png differ diff --git a/public/images/pokemon/261.png b/public/images/pokemon/261.png index a519b9951a4..da22d88806f 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/276.png b/public/images/pokemon/276.png index 1b24f59d105..a191440497c 100644 Binary files a/public/images/pokemon/276.png and b/public/images/pokemon/276.png differ diff --git a/public/images/pokemon/277.png b/public/images/pokemon/277.png index 3c4475e5fce..2ec0b9b8a9a 100644 Binary files a/public/images/pokemon/277.png and b/public/images/pokemon/277.png differ diff --git a/public/images/pokemon/3-gigantamax.png b/public/images/pokemon/3-gigantamax.png index 4036c641327..d551638c880 100644 Binary files a/public/images/pokemon/3-gigantamax.png and b/public/images/pokemon/3-gigantamax.png differ diff --git a/public/images/pokemon/3-mega.png b/public/images/pokemon/3-mega.png index 9f867c8e13d..c15a9cac092 100644 Binary files a/public/images/pokemon/3-mega.png and b/public/images/pokemon/3-mega.png differ diff --git a/public/images/pokemon/3.png b/public/images/pokemon/3.png index b9239f3096e..534a48fdfa6 100644 Binary files a/public/images/pokemon/3.png and b/public/images/pokemon/3.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.json b/public/images/pokemon/335.json index 0279e0fba5a..a9313fcec5d 100644 --- a/public/images/pokemon/335.json +++ b/public/images/pokemon/335.json @@ -1,1910 +1,547 @@ -{ - "textures": [ - { - "image": "335.png", - "format": "RGBA8888", - "size": { - "w": 366, - "h": 366 - }, - "scale": 1, - "frames": [ - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 63, - "w": 65, - "h": 66 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 192, - "w": 61, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 65, - "h": 61 - }, - "frame": { - "x": 199, - "y": 0, - "w": 65, - "h": 61 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 64, - "h": 61 - }, - "frame": { - "x": 64, - "y": 183, - "w": 64, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 62, - "h": 65 - }, - "frame": { - "x": 61, - "y": 244, - "w": 62, - "h": 65 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 6, - "y": 9, - "w": 63, - "h": 57 - }, - "frame": { - "x": 61, - "y": 309, - "w": 63, - "h": 57 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 64 - }, - "frame": { - "x": 123, - "y": 244, - "w": 61, - "h": 64 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 63, - "h": 58 - }, - "frame": { - "x": 124, - "y": 308, - "w": 63, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 62, - "h": 63 - }, - "frame": { - "x": 264, - "y": 58, - "w": 62, - "h": 63 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 58, - "h": 66 - }, - "frame": { - "x": 189, - "y": 128, - "w": 58, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 247, - "y": 121, - "w": 60, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 249, - "y": 250, - "w": 60, - "h": 63 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9c4e9647cd30b406386dcfa45795951c:b817a280fcd689ce74ea32e378a31e74:40bb9f4809624b12bf79bbfe664bea73$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0002.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0003.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0004.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0005.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0007.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0008.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0010.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0011.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0012.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0014.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0015.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0016.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0017.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0018.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0019.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0020.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0022.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0023.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0024.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0025.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0026.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0027.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0029.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0030.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0031.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0032.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0033.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0034.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0035.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0037.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0038.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0039.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0040.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0041.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0042.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0044.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0045.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0046.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0047.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0048.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0049.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0050.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0051.png", + "frame": { "x": 248, "y": 129, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0052.png", + "frame": { "x": 188, "y": 123, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 125, "w": 61, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 61, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 66, "w": 63, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 63, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0055.png", + "frame": { "x": 234, "y": 190, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0056.png", + "frame": { "x": 234, "y": 246, "w": 60, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 11, "w": 60, "h": 55 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0057.png", + "frame": { "x": 115, "y": 239, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 11, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0058.png", + "frame": { "x": 63, "y": 62, "w": 62, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 62, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0059.png", + "frame": { "x": 63, "y": 0, "w": 66, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 66, "h": 62 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 0, "w": 63, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 63, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0061.png", + "frame": { "x": 261, "y": 0, "w": 59, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 59, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0062.png", + "frame": { "x": 181, "y": 184, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 53, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0063.png", + "frame": { "x": 63, "y": 122, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 56, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0064.png", + "frame": { "x": 320, "y": 61, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 58, "h": 65 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0065.png", + "frame": { "x": 129, "y": 61, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 59, "h": 64 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0066.png", + "frame": { "x": 195, "y": 60, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0067.png", + "frame": { "x": 255, "y": 66, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.9.2-x64", + "image": "335.png", + "format": "I8", + "size": { "w": 382, "h": 305 }, + "scale": "1" + } } diff --git a/public/images/pokemon/335.png b/public/images/pokemon/335.png index 87f8b341b55..65b56582339 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/359-mega.png b/public/images/pokemon/359-mega.png index 99e95151b79..9c026d78779 100644 Binary files a/public/images/pokemon/359-mega.png and b/public/images/pokemon/359-mega.png differ diff --git a/public/images/pokemon/359.png b/public/images/pokemon/359.png index bb02f52637e..e5a1d168ad2 100644 Binary files a/public/images/pokemon/359.png and b/public/images/pokemon/359.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/379.png b/public/images/pokemon/379.png index dd430eb9d70..3a4185ffaf6 100644 Binary files a/public/images/pokemon/379.png and b/public/images/pokemon/379.png differ diff --git a/public/images/pokemon/390.png b/public/images/pokemon/390.png index 7bd6fd2de90..e96b6631c8a 100644 Binary files a/public/images/pokemon/390.png and b/public/images/pokemon/390.png differ diff --git a/public/images/pokemon/391.png b/public/images/pokemon/391.png index 480894c9373..bb6abefada7 100644 Binary files a/public/images/pokemon/391.png and b/public/images/pokemon/391.png differ diff --git a/public/images/pokemon/392.png b/public/images/pokemon/392.png index 5c65d92889b..b65da9eecb4 100644 Binary files a/public/images/pokemon/392.png and b/public/images/pokemon/392.png differ diff --git a/public/images/pokemon/40.png b/public/images/pokemon/40.png index 4d2cc4f1d60..e6b59c51bfe 100644 Binary files a/public/images/pokemon/40.png and b/public/images/pokemon/40.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/430.png b/public/images/pokemon/430.png index 07aca365e02..5ed0fb19c20 100644 Binary files a/public/images/pokemon/430.png and b/public/images/pokemon/430.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/455.png b/public/images/pokemon/455.png index 9518bc019fe..731abfec4e6 100644 Binary files a/public/images/pokemon/455.png and b/public/images/pokemon/455.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/477.png b/public/images/pokemon/477.png index de140bf6ba9..1013ca3d0dd 100644 Binary files a/public/images/pokemon/477.png and b/public/images/pokemon/477.png differ diff --git a/public/images/pokemon/486.png b/public/images/pokemon/486.png index aaee1287a47..328ed80c995 100644 Binary files a/public/images/pokemon/486.png and b/public/images/pokemon/486.png differ diff --git a/public/images/pokemon/501.png b/public/images/pokemon/501.png index ac4c5d9fbf0..79a012cadd5 100644 Binary files a/public/images/pokemon/501.png and b/public/images/pokemon/501.png differ diff --git a/public/images/pokemon/502.png b/public/images/pokemon/502.png index 8a7c2636894..ef1291a2520 100644 Binary files a/public/images/pokemon/502.png and b/public/images/pokemon/502.png differ diff --git a/public/images/pokemon/503.png b/public/images/pokemon/503.png index d9cf94f3c6f..3571e64156c 100644 Binary files a/public/images/pokemon/503.png and b/public/images/pokemon/503.png differ diff --git a/public/images/pokemon/528.png b/public/images/pokemon/528.png index d1806f17f70..fd6e0c54a77 100644 Binary files a/public/images/pokemon/528.png and b/public/images/pokemon/528.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/587.png b/public/images/pokemon/587.png index 409b423c13b..6a870170219 100644 Binary files a/public/images/pokemon/587.png and b/public/images/pokemon/587.png differ diff --git a/public/images/pokemon/590.png b/public/images/pokemon/590.png index 2cf97f1fe69..0908b46cd83 100644 Binary files a/public/images/pokemon/590.png and b/public/images/pokemon/590.png differ diff --git a/public/images/pokemon/591.png b/public/images/pokemon/591.png index 179e3b4160f..a294749149f 100644 Binary files a/public/images/pokemon/591.png and b/public/images/pokemon/591.png differ diff --git a/public/images/pokemon/616.png b/public/images/pokemon/616.png index 5d4e04e31fd..aff43388faf 100644 Binary files a/public/images/pokemon/616.png and b/public/images/pokemon/616.png differ diff --git a/public/images/pokemon/6503.png b/public/images/pokemon/6503.png index 906fcb9115b..71d6e27d855 100644 Binary files a/public/images/pokemon/6503.png and b/public/images/pokemon/6503.png differ diff --git a/public/images/pokemon/656.json b/public/images/pokemon/656.json index 9f2483c56b9..3776b4ed7e5 100644 --- a/public/images/pokemon/656.json +++ b/public/images/pokemon/656.json @@ -1,41 +1,20 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 35, - "h": 35 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:25355f0b039f39b6231cb75c6f8a0200:2e119e5dd64fab6d996ea751c24a38e0:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 35 }, + "sourceSize": { "w": 32, "h": 35 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 34, "h": 37 }, + "scale": "1" + } } diff --git a/public/images/pokemon/656.png b/public/images/pokemon/656.png index 1f0f181712b..06a9cd58268 100644 Binary files a/public/images/pokemon/656.png and b/public/images/pokemon/656.png differ diff --git a/public/images/pokemon/657.png b/public/images/pokemon/657.png index 8c0f2b9a15f..031c9404805 100644 Binary files a/public/images/pokemon/657.png and b/public/images/pokemon/657.png differ diff --git a/public/images/pokemon/658-ash.json b/public/images/pokemon/658-ash.json index 8fbe19f5ccb..c2b8eede9ef 100644 --- a/public/images/pokemon/658-ash.json +++ b/public/images/pokemon/658-ash.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 79, - "h": 79 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 79, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 0, - "y": 0, - "w": 79, - "h": 74 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:936f62fa49ba4d6e402bb2e2eaf2afd0:ed00ba047a44b4bf1309bc147dd000e3:bfbf521a5c7bd80bcd95a96d9789c0dd$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 79, "h": 74 }, + "scale": "1" + } } diff --git a/public/images/pokemon/658-ash.png b/public/images/pokemon/658-ash.png index 8daaaa02063..fa6ce5cb165 100644 Binary files a/public/images/pokemon/658-ash.png and b/public/images/pokemon/658-ash.png differ diff --git a/public/images/pokemon/658.json b/public/images/pokemon/658.json index 4fd918e0f50..219645ec240 100644 --- a/public/images/pokemon/658.json +++ b/public/images/pokemon/658.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 75, - "h": 75 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e0b10df331bd4ce6760edab61dee144b:061561c45beff89a92bf0158d065204f:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 85, "h": 67 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 85, "h": 67 }, + "sourceSize": { "w": 85, "h": 67 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 85, "h": 67 }, + "scale": "1" + } } diff --git a/public/images/pokemon/658.png b/public/images/pokemon/658.png index 095b8c0039d..ed730c8b81c 100644 Binary files a/public/images/pokemon/658.png and b/public/images/pokemon/658.png differ diff --git a/public/images/pokemon/666-continental.png b/public/images/pokemon/666-continental.png index 1bd15dbb70d..b45f5c4e76d 100644 Binary files a/public/images/pokemon/666-continental.png and b/public/images/pokemon/666-continental.png differ diff --git a/public/images/pokemon/666-fancy.png b/public/images/pokemon/666-fancy.png index ec5e8a5f6e8..9e40deb3568 100644 Binary files a/public/images/pokemon/666-fancy.png and b/public/images/pokemon/666-fancy.png differ diff --git a/public/images/pokemon/666-high-plains.png b/public/images/pokemon/666-high-plains.png index c294984e469..45cb22fc592 100644 Binary files a/public/images/pokemon/666-high-plains.png and b/public/images/pokemon/666-high-plains.png differ diff --git a/public/images/pokemon/666-river.png b/public/images/pokemon/666-river.png index eeabeecb069..ca93fd612b7 100644 Binary files a/public/images/pokemon/666-river.png and b/public/images/pokemon/666-river.png differ diff --git a/public/images/pokemon/668-female.png b/public/images/pokemon/668-female.png deleted file mode 100644 index c8f4e205491..00000000000 Binary files a/public/images/pokemon/668-female.png and /dev/null 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/674.json b/public/images/pokemon/674.json index 9534a585c64..9954c30188d 100644 --- a/public/images/pokemon/674.json +++ b/public/images/pokemon/674.json @@ -1,41 +1,506 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 28, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 28, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:17675dc9d79a224d5cfe26d4ea11594d:afc8db52143597fb62ac44c9a1600a80:b823d10f1c9b4d501296982088ba63d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0002.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0003.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0004.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0005.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0006.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0008.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0009.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0010.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0011.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0012.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0014.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0015.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0016.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0017.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0018.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0020.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0021.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0022.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0023.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0024.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0026.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0027.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0028.png", + "frame": { "x": 87, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0029.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0030.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0032.png", + "frame": { "x": 29, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0033.png", + "frame": { "x": 58, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0034.png", + "frame": { "x": 87, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0035.png", + "frame": { "x": 58, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0037.png", + "frame": { "x": 29, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0038.png", + "frame": { "x": 58, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0039.png", + "frame": { "x": 87, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 126, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0041.png", + "frame": { "x": 87, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0042.png", + "frame": { "x": 58, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0043.png", + "frame": { "x": 29, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0044.png", + "frame": { "x": 58, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0045.png", + "frame": { "x": 87, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 126, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0047.png", + "frame": { "x": 87, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0048.png", + "frame": { "x": 58, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0049.png", + "frame": { "x": 29, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 84, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0051.png", + "frame": { "x": 58, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0052.png", + "frame": { "x": 87, "y": 42, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0053.png", + "frame": { "x": 29, "y": 126, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0055.png", + "frame": { "x": 58, "y": 126, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "674.png", + "format": "I8", + "size": { "w": 116, "h": 168 }, + "scale": "1" + } } diff --git a/public/images/pokemon/674.png b/public/images/pokemon/674.png index 3161096bb29..85b2fafb91b 100644 Binary files a/public/images/pokemon/674.png and b/public/images/pokemon/674.png differ diff --git a/public/images/pokemon/676-dandy.png b/public/images/pokemon/676-dandy.png index 1e9f9b7bb2c..54e36574b2a 100644 Binary files a/public/images/pokemon/676-dandy.png and b/public/images/pokemon/676-dandy.png differ diff --git a/public/images/pokemon/676-debutante.png b/public/images/pokemon/676-debutante.png index 92390b17f34..30d5bcafec5 100644 Binary files a/public/images/pokemon/676-debutante.png and b/public/images/pokemon/676-debutante.png differ diff --git a/public/images/pokemon/676-diamond.png b/public/images/pokemon/676-diamond.png index 3915b78ec26..953581d7bb7 100644 Binary files a/public/images/pokemon/676-diamond.png and b/public/images/pokemon/676-diamond.png differ diff --git a/public/images/pokemon/676-heart.png b/public/images/pokemon/676-heart.png index 99327208605..9e6950cc36c 100644 Binary files a/public/images/pokemon/676-heart.png and b/public/images/pokemon/676-heart.png differ diff --git a/public/images/pokemon/676-kabuki.png b/public/images/pokemon/676-kabuki.png index c4f6473c75b..0d7323a520c 100644 Binary files a/public/images/pokemon/676-kabuki.png and b/public/images/pokemon/676-kabuki.png differ diff --git a/public/images/pokemon/676-la-reine.png b/public/images/pokemon/676-la-reine.png index e649e6d74c8..c2f0eb72d75 100644 Binary files a/public/images/pokemon/676-la-reine.png and b/public/images/pokemon/676-la-reine.png differ diff --git a/public/images/pokemon/676-matron.png b/public/images/pokemon/676-matron.png index 98142c41661..1f93b11a277 100644 Binary files a/public/images/pokemon/676-matron.png and b/public/images/pokemon/676-matron.png differ diff --git a/public/images/pokemon/676-pharaoh.png b/public/images/pokemon/676-pharaoh.png index cced072318b..e0f48c46bab 100644 Binary files a/public/images/pokemon/676-pharaoh.png and b/public/images/pokemon/676-pharaoh.png differ diff --git a/public/images/pokemon/676-star.png b/public/images/pokemon/676-star.png index 7a1044bda75..566aa713aee 100644 Binary files a/public/images/pokemon/676-star.png and b/public/images/pokemon/676-star.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/682.png b/public/images/pokemon/682.png index 41ecd482b14..2a83ceedaa9 100644 Binary files a/public/images/pokemon/682.png and b/public/images/pokemon/682.png differ diff --git a/public/images/pokemon/683.png b/public/images/pokemon/683.png index bf559a07929..1b16b038c51 100644 Binary files a/public/images/pokemon/683.png and b/public/images/pokemon/683.png differ diff --git a/public/images/pokemon/684.png b/public/images/pokemon/684.png index 8bf8f765465..a3f7e544f89 100644 Binary files a/public/images/pokemon/684.png and b/public/images/pokemon/684.png differ diff --git a/public/images/pokemon/685.png b/public/images/pokemon/685.png index 521b7560182..957cd5d815b 100644 Binary files a/public/images/pokemon/685.png and b/public/images/pokemon/685.png differ diff --git a/public/images/pokemon/688.json b/public/images/pokemon/688.json index 84ec62d4211..3d9aa902a54 100644 --- a/public/images/pokemon/688.json +++ b/public/images/pokemon/688.json @@ -1,41 +1,18 @@ -{ - "textures": [ - { - "image": "688.png", - "format": "RGBA8888", - "size": { - "w": 52, - "h": 52 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f328f72c414efc6cf463a1254afa75ac:50168e1a7077626f41bdaf5d0b35af74:176060351d0044923af938ba7932a6ef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 64, "h": 63 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 64, "h": 63 }, + "sourceSize": { "w": 64, "h": 63 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 64, "h": 63 }, + "scale": "1" + } } diff --git a/public/images/pokemon/688.png b/public/images/pokemon/688.png index 2ac1b5d5fb1..2e65d4beb6f 100644 Binary files a/public/images/pokemon/688.png and b/public/images/pokemon/688.png differ diff --git a/public/images/pokemon/689.json b/public/images/pokemon/689.json index 2ff881f55c0..488ef54de71 100644 --- a/public/images/pokemon/689.json +++ b/public/images/pokemon/689.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "689.png", - "format": "RGBA8888", - "size": { - "w": 86, - "h": 86 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 86, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 79 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1825183d2cc847c000400501e055918b:af535bb92b1490f3ab69be674b3b6fe0:bd0c58ecddcb4af9a0c6e7b39821d971$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 82 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 82 }, + "sourceSize": { "w": 79, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 79, "h": 82 }, + "scale": "1" + } } diff --git a/public/images/pokemon/689.png b/public/images/pokemon/689.png index 75fa0b474d7..1ec1bcec98a 100644 Binary files a/public/images/pokemon/689.png and b/public/images/pokemon/689.png differ diff --git a/public/images/pokemon/694.json b/public/images/pokemon/694.json index c770e137915..48e9623d7f4 100644 --- a/public/images/pokemon/694.json +++ b/public/images/pokemon/694.json @@ -1,41 +1,767 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 41, - "h": 41 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a121458917a5069ac5fcf0438e46af2b:afcd331d4ef231f539d602827ea66e55:b0990f9650cfe63b836cbed33f0b44d8$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 282, "y": 173, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 241, "y": 173, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 171, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 85, "y": 170, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 227, "y": 93, "w": 52, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 12, "w": 52, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 57, "y": 50, "w": 55, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 55, "h": 39 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 56, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 50 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 112, "y": 0, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 56, "h": 49 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 56, "h": 50 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 224, "y": 47, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 281, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 168, "y": 0, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 56, "h": 48 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 281, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 170, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 224, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 50, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 281, "y": 92, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 57, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 112, "y": 49, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 58, "h": 45 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 114, "y": 94, "w": 56, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 56, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 170, "y": 48, "w": 53, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 53, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 126, "y": 175, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 43, "y": 138, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "694.png", + "format": "I8", + "size": { "w": 338, "h": 249 }, + "scale": "1" + } } diff --git a/public/images/pokemon/694.png b/public/images/pokemon/694.png index 2659476db8a..fbd210e7d89 100644 Binary files a/public/images/pokemon/694.png and b/public/images/pokemon/694.png differ diff --git a/public/images/pokemon/698.json b/public/images/pokemon/698.json index 34938139984..6baf41b0ce7 100644 --- a/public/images/pokemon/698.json +++ b/public/images/pokemon/698.json @@ -1,41 +1,1415 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 57, - "h": 57 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:563dc7193ff897a6bf95dc8334febb0f:0dc4e9f203f0efed6323a93621a24f2c:198087d69fed44d4a642fa3ba5c077d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 0, "y": 113, "w": 30, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 30, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 0, "y": 113, "w": 30, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 30, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "698.png", + "format": "I8", + "size": { "w": 152, "h": 224 }, + "scale": "1" + } } diff --git a/public/images/pokemon/698.png b/public/images/pokemon/698.png index 81c7b03e375..d9e638561d1 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/703.json b/public/images/pokemon/703.json index e160dd32d25..5c0a6230108 100644 --- a/public/images/pokemon/703.json +++ b/public/images/pokemon/703.json @@ -1,41 +1,569 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 38, - "h": 38 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5da3bf1b2b82712da609c628fc886d69:7a2dc2f1f3b5fa2ee6b04cdf4c952277:721af8c322ff60159262e9b3017c784d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 74, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 35, "y": 114, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 70, "y": 114, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 105, "y": 114, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 140, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 35, "y": 153, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 111, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 107, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 107, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "703.png", + "format": "I8", + "size": { "w": 183, "h": 192 }, + "scale": "1" + } } diff --git a/public/images/pokemon/703.png b/public/images/pokemon/703.png index 3f3767fbc6c..ea231fc6c09 100644 Binary files a/public/images/pokemon/703.png and b/public/images/pokemon/703.png differ diff --git a/public/images/pokemon/707.json b/public/images/pokemon/707.json index b37a090ddb5..ee5036fb541 100644 --- a/public/images/pokemon/707.json +++ b/public/images/pokemon/707.json @@ -1,41 +1,1559 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:56a3742632a462544b501f22a2cb2e57:5315127216c0bad2620a5352c4e424ba:8e96b9056ea81e44ced99c97f472a528$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 578, "y": 149, "w": 51, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 51, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 95, "y": 62, "w": 59, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 14, "w": 59, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 519, "y": 2, "w": 67, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 67, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 280, "y": 2, "w": 82, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 82, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 2, "y": 2, "w": 93, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 93, "h": 63 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 95, "y": 2, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 95, "h": 60 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 190, "y": 2, "w": 90, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 90, "h": 62 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 362, "y": 2, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 445, "y": 2, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 74, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 586, "y": 2, "w": 65, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 2, "w": 65, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 2, "y": 220, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 4, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 319, "y": 447, "w": 42, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 5, "w": 42, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0122.png", + "frame": { "x": 447, "y": 489, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 7, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0123.png", + "frame": { "x": 614, "y": 500, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 10, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0124.png", + "frame": { "x": 573, "y": 453, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 11, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0125.png", + "frame": { "x": 267, "y": 480, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 14, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0126.png", + "frame": { "x": 184, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 14, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0127.png", + "frame": { "x": 2, "y": 443, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 16, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0128.png", + "frame": { "x": 226, "y": 442, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 17, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0129.png", + "frame": { "x": 130, "y": 438, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0130.png", + "frame": { "x": 2, "y": 366, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0131.png", + "frame": { "x": 52, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0132.png", + "frame": { "x": 682, "y": 221, "w": 48, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 18, "w": 48, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0133.png", + "frame": { "x": 519, "y": 361, "w": 47, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 19, "w": 47, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0134.png", + "frame": { "x": 43, "y": 502, "w": 44, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 20, "w": 44, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0135.png", + "frame": { "x": 714, "y": 505, "w": 41, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 20, "w": 41, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0136.png", + "frame": { "x": 402, "y": 489, "w": 45, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 20, "w": 45, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0137.png", + "frame": { "x": 471, "y": 219, "w": 51, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 51, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0138.png", + "frame": { "x": 692, "y": 80, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0139.png", + "frame": { "x": 389, "y": 147, "w": 54, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 18, "w": 54, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0140.png", + "frame": { "x": 399, "y": 297, "w": 46, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 18, "w": 46, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0141.png", + "frame": { "x": 610, "y": 375, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0142.png", + "frame": { "x": 141, "y": 360, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0143.png", + "frame": { "x": 638, "y": 79, "w": 54, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 54, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0144.png", + "frame": { "x": 362, "y": 67, "w": 60, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 60, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0145.png", + "frame": { "x": 474, "y": 73, "w": 59, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 59, "h": 68 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0146.png", + "frame": { "x": 264, "y": 147, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 57, "h": 68 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0147.png", + "frame": { "x": 298, "y": 264, "w": 54, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 54, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0148.png", + "frame": { "x": 524, "y": 148, "w": 54, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 54, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0149.png", + "frame": { "x": 211, "y": 135, "w": 53, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 53, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0150.png", + "frame": { "x": 471, "y": 290, "w": 48, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 19, "w": 48, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0151.png", + "frame": { "x": 569, "y": 302, "w": 48, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 19, "w": 48, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0152.png", + "frame": { "x": 154, "y": 134, "w": 57, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 20, "w": 57, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0153.png", + "frame": { "x": 154, "y": 64, "w": 60, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 20, "w": 60, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0154.png", + "frame": { "x": 214, "y": 64, "w": 59, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 19, "w": 59, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0155.png", + "frame": { "x": 2, "y": 292, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 18, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0156.png", + "frame": { "x": 696, "y": 426, "w": 41, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 41, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0157.png", + "frame": { "x": 533, "y": 73, "w": 53, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 53, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0158.png", + "frame": { "x": 56, "y": 135, "w": 62, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 62, "h": 64 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0159.png", + "frame": { "x": 662, "y": 373, "w": 62, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 22, "w": 62, "h": 53 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0160.png", + "frame": { "x": 655, "y": 505, "w": 59, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 22, "w": 59, "h": 47 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0161.png", + "frame": { "x": 422, "y": 437, "w": 61, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 22, "w": 61, "h": 52 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0162.png", + "frame": { "x": 326, "y": 136, "w": 63, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 63, "h": 62 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0163.png", + "frame": { "x": 321, "y": 198, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 57, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0164.png", + "frame": { "x": 519, "y": 291, "w": 50, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 20, "w": 50, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0165.png", + "frame": { "x": 445, "y": 363, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 20, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0166.png", + "frame": { "x": 45, "y": 426, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0167.png", + "frame": { "x": 189, "y": 352, "w": 44, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 44, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0168.png", + "frame": { "x": 667, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0169.png", + "frame": { "x": 425, "y": 218, "w": 46, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 40, "y": 18, "w": 46, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0170.png", + "frame": { "x": 148, "y": 203, "w": 47, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 47, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0171.png", + "frame": { "x": 572, "y": 224, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 18, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0172.png", + "frame": { "x": 244, "y": 287, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "707.png", + "format": "I8", + "size": { "w": 763, "h": 577 }, + "scale": "1" + } } diff --git a/public/images/pokemon/707.png b/public/images/pokemon/707.png index e96c81bb953..899ab995926 100644 Binary files a/public/images/pokemon/707.png and b/public/images/pokemon/707.png differ diff --git a/public/images/pokemon/708.json b/public/images/pokemon/708.json index 99aa2cffcb4..abc8d24db2b 100644 --- a/public/images/pokemon/708.json +++ b/public/images/pokemon/708.json @@ -1,41 +1,1091 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 44, - "h": 44 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c7204472319329328505da257ec6edec:b1ef9ba3c80855e31831f718036043ff:796c82c5076b122f2663381836c65843$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 90, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 135, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 90, "y": 207, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 43, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 134, "y": 207, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 43, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 180, "y": 165, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 14, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 225, "y": 165, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 15, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 270, "y": 165, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 17, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 0, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 19, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 270, "y": 206, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 21, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 90, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 23, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 135, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 21, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 180, "y": 206, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 20, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 225, "y": 206, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 18, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 268, "y": 247, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 44, "h": 39 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 178, "y": 247, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 15, "w": 44, "h": 39 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 223, "y": 247, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 44, "h": 39 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 226, "y": 83, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 45, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 180, "y": 83, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "708.png", + "format": "I8", + "size": { "w": 315, "h": 286 }, + "scale": "1" + } } diff --git a/public/images/pokemon/708.png b/public/images/pokemon/708.png index a51533e592b..0b612280028 100644 Binary files a/public/images/pokemon/708.png and b/public/images/pokemon/708.png differ diff --git a/public/images/pokemon/714.json b/public/images/pokemon/714.json index 84c1183e47b..b43aebd68a1 100644 --- a/public/images/pokemon/714.json +++ b/public/images/pokemon/714.json @@ -1,41 +1,263 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 64, - "h": 64 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 64, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 64, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:acf096b1d2c6d9730a18ff797fb5ae47:ea434d000e9983cb42ecd03220d247c4:1a07d46e710b0568ec824f54fbc4fe6a$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 133, "y": 1, "w": 64, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 64, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 1, "y": 60, "w": 61, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 61, "h": 55 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 184, "y": 117, "w": 32, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 32, "h": 67 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 50, "y": 119, "w": 33, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 33, "h": 63 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 199, "y": 1, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 64, "y": 60, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 133, "y": 1, "w": 64, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 64, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 1, "y": 60, "w": 61, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 61, "h": 55 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 184, "y": 117, "w": 32, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 3, "w": 32, "h": 67 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 50, "y": 119, "w": 33, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 33, "h": 63 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 199, "y": 1, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 64, "y": 60, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 133, "y": 1, "w": 64, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 64, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 133, "y": 59, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 61, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 113, "y": 117, "w": 33, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 33, "h": 68 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 148, "y": 117, "w": 34, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 34, "h": 64 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 1, "y": 117, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 64, "y": 60, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 67, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 196, "y": 59, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 61, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 113, "y": 117, "w": 33, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 2, "w": 33, "h": 68 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 218, "y": 117, "w": 33, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 33, "h": 64 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 199, "y": 1, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 64, "y": 60, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "714.png", + "format": "I8", + "size": { "w": 258, "h": 186 }, + "scale": "1" + } } diff --git a/public/images/pokemon/714.png b/public/images/pokemon/714.png index c79f9b83b82..4572eada3f3 100644 Binary files a/public/images/pokemon/714.png and b/public/images/pokemon/714.png differ diff --git a/public/images/pokemon/715.png b/public/images/pokemon/715.png index a13b8f435e4..08d9c985776 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/718-10.json b/public/images/pokemon/718-10.json index 479c069fe0a..ad273c9ea79 100644 --- a/public/images/pokemon/718-10.json +++ b/public/images/pokemon/718-10.json @@ -1,41 +1,686 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 66, - "h": 66 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 56, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1845dc28b51b657957628d4b4d7af94:87a4c3e6fcac562963f6331abb3d962c:82195cf2a6db620c5643b8162d6e8c5c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 287, "y": 130, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 57, "y": 131, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 164, "y": 261, "w": 56, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 56, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 327, "w": 56, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 56, "y": 327, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 169, "y": 329, "w": 57, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 57, "h": 62 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 112, "y": 326, "w": 57, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 54, "y": 265, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 58, "h": 62 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 226, "y": 332, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 220, "y": 261, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 264, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 279, "y": 196, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 56, "y": 197, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 110, "y": 197, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 198, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 169, "y": 194, "w": 55, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 55, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 224, "y": 194, "w": 55, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 55, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 132, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 113, "y": 131, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718-10.png", + "format": "I8", + "size": { "w": 345, "h": 395 }, + "scale": "1" + } } diff --git a/public/images/pokemon/718-10.png b/public/images/pokemon/718-10.png index a2acc542c68..4d15f78dd83 100644 Binary files a/public/images/pokemon/718-10.png and b/public/images/pokemon/718-10.png differ diff --git a/public/images/pokemon/718.json b/public/images/pokemon/718.json index b86c5362079..98053a226cb 100644 --- a/public/images/pokemon/718.json +++ b/public/images/pokemon/718.json @@ -1,41 +1,803 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 88, - "h": 88 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c521b0d088429d6fd0d1d291823b7881:a063fa0268f5006b3587b06e3245db2a:7b4a06b06cbac24b3f39727b0238661b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 222, "y": 355, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 73, "y": 354, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 149, "y": 353, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 442, "y": 353, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 149, "y": 266, "w": 74, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 74, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 377, "y": 265, "w": 75, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 308, "y": 177, "w": 76, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 76, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 76, "y": 91, "w": 76, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 76, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 301, "y": 264, "w": 76, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 76, "h": 86 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 267, "w": 74, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 74, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 90, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 391, "y": 88, "w": 77, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 77, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 78, "h": 91 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 468, "y": 88, "w": 77, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 77, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 157, "y": 0, "w": 78, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 90 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 313, "y": 0, "w": 78, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 78, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 79, "h": 90 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 391, "y": 0, "w": 78, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 78, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 235, "y": 0, "w": 78, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 78, "h": 90 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 469, "y": 0, "w": 78, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 313, "y": 89, "w": 77, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 77, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 157, "y": 90, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 76, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 226, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 354, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718.png", + "format": "I8", + "size": { "w": 547, "h": 530 }, + "scale": "1" + } } diff --git a/public/images/pokemon/718.png b/public/images/pokemon/718.png index 0c65ebefb31..07319fd6de0 100644 Binary files a/public/images/pokemon/718.png and b/public/images/pokemon/718.png differ diff --git a/public/images/pokemon/719.json b/public/images/pokemon/719.json index 4503b576777..29716341ffd 100644 --- a/public/images/pokemon/719.json +++ b/public/images/pokemon/719.json @@ -1,41 +1,875 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2444999ec5c861d795baf2a948bfbf12:226dba2be6e002f00cb5559f02986b41:17a705bb924916761be2495822a53735$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 86, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 129, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 172, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 42, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 40, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 83, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 124, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 86, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 215, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 86, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 129, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 172, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 42, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 40, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 83, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 124, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 86, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 215, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 86, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 129, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 172, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 42, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 40, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 83, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 124, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 86, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 215, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 86, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 129, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 172, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 42, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 40, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 83, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 124, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 215, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 128, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 170, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 80, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 120, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 237, "y": 288, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 37, "h": 69 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 198, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 237, "y": 359, "w": 35, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 35, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 120, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 160, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 165, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 212, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 206, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 200, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 240, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 159, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 40, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 80, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 248, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 43, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 128, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 170, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 80, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 120, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 237, "y": 288, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 37, "h": 69 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 198, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 237, "y": 359, "w": 35, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 35, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 120, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 160, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 165, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 212, "y": 72, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 206, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 200, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 240, "y": 216, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 159, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 40, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 80, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 248, "y": 144, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 43, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "719.png", + "format": "I8", + "size": { "w": 287, "h": 429 }, + "scale": "1" + } } diff --git a/public/images/pokemon/719.png b/public/images/pokemon/719.png index 287bfb9fd27..536e999a3d6 100644 Binary files a/public/images/pokemon/719.png and b/public/images/pokemon/719.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/894.png b/public/images/pokemon/894.png index ea82d8bd82e..5f5b0535e8a 100644 Binary files a/public/images/pokemon/894.png and b/public/images/pokemon/894.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/945.png b/public/images/pokemon/945.png index 280ad17b152..74c43b6d32e 100644 Binary files a/public/images/pokemon/945.png and b/public/images/pokemon/945.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/1012-counterfeit.png b/public/images/pokemon/back/1012-counterfeit.png index 8ab1941187d..e6deb02c70c 100644 Binary files a/public/images/pokemon/back/1012-counterfeit.png and b/public/images/pokemon/back/1012-counterfeit.png differ diff --git a/public/images/pokemon/back/1013-unremarkable.png b/public/images/pokemon/back/1013-unremarkable.png index b8532d049fc..479f0e51cff 100644 Binary files a/public/images/pokemon/back/1013-unremarkable.png and b/public/images/pokemon/back/1013-unremarkable.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/172-spiky.png b/public/images/pokemon/back/172-spiky.png index 37b2d401f17..d038e0d3661 100644 Binary files a/public/images/pokemon/back/172-spiky.png and b/public/images/pokemon/back/172-spiky.png differ diff --git a/public/images/pokemon/back/172.png b/public/images/pokemon/back/172.png index 9f4c8f4f1bd..775a42dd948 100644 Binary files a/public/images/pokemon/back/172.png and b/public/images/pokemon/back/172.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/198.png b/public/images/pokemon/back/198.png index dbae4ffdfed..dc92c8b1d59 100644 Binary files a/public/images/pokemon/back/198.png and b/public/images/pokemon/back/198.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/2026.png b/public/images/pokemon/back/2026.png index 4e1e16c6207..1f0411ffcd8 100644 Binary files a/public/images/pokemon/back/2026.png and b/public/images/pokemon/back/2026.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/249.json b/public/images/pokemon/back/249.json index 52784b825f8..7f126e8c62c 100644 --- a/public/images/pokemon/back/249.json +++ b/public/images/pokemon/back/249.json @@ -1,2540 +1,686 @@ -{ - "textures": [ - { - "image": "249.png", - "format": "RGBA8888", - "size": { - "w": 610, - "h": 610 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 25, - "y": 5, - "w": 99, - "h": 88 - }, - "frame": { - "x": 230, - "y": 137, - "w": 99, - "h": 88 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 5, - "w": 99, - "h": 88 - }, - "frame": { - "x": 329, - "y": 141, - "w": 99, - "h": 88 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 26, - "y": 0, - "w": 84, - "h": 97 - }, - "frame": { - "x": 526, - "y": 141, - "w": 84, - "h": 97 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 27, - "y": 4, - "w": 96, - "h": 89 - }, - "frame": { - "x": 0, - "y": 216, - "w": 96, - "h": 89 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 96, - "h": 89 - }, - "frame": { - "x": 96, - "y": 222, - "w": 96, - "h": 89 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 7, - "w": 95, - "h": 90 - }, - "frame": { - "x": 290, - "y": 229, - "w": 95, - "h": 90 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 7, - "w": 95, - "h": 90 - }, - "frame": { - "x": 290, - "y": 229, - "w": 95, - "h": 90 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 4, - "w": 95, - "h": 90 - }, - "frame": { - "x": 385, - "y": 230, - "w": 95, - "h": 90 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 6, - "w": 95, - "h": 91 - }, - "frame": { - "x": 95, - "y": 311, - "w": 95, - "h": 91 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 32, - "y": 2, - "w": 92, - "h": 91 - }, - "frame": { - "x": 190, - "y": 315, - "w": 92, - "h": 91 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 32, - "y": 2, - "w": 92, - "h": 91 - }, - "frame": { - "x": 190, - "y": 315, - "w": 92, - "h": 91 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 16, - "y": 5, - "w": 101, - "h": 91 - }, - "frame": { - "x": 282, - "y": 319, - "w": 101, - "h": 91 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 5, - "w": 94, - "h": 92 - }, - "frame": { - "x": 383, - "y": 320, - "w": 94, - "h": 92 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 16, - "y": 4, - "w": 100, - "h": 92 - }, - "frame": { - "x": 477, - "y": 329, - "w": 100, - "h": 92 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 94, - "h": 92 - }, - "frame": { - "x": 0, - "y": 396, - "w": 94, - "h": 92 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 29, - "y": 2, - "w": 91, - "h": 92 - }, - "frame": { - "x": 94, - "y": 402, - "w": 91, - "h": 92 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 29, - "y": 2, - "w": 91, - "h": 92 - }, - "frame": { - "x": 94, - "y": 402, - "w": 91, - "h": 92 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 2, - "w": 92, - "h": 92 - }, - "frame": { - "x": 185, - "y": 406, - "w": 92, - "h": 92 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 6, - "w": 96, - "h": 92 - }, - "frame": { - "x": 277, - "y": 410, - "w": 96, - "h": 92 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 2, - "w": 92, - "h": 93 - }, - "frame": { - "x": 465, - "y": 421, - "w": 92, - "h": 93 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 4, - "w": 93, - "h": 94 - }, - "frame": { - "x": 0, - "y": 488, - "w": 93, - "h": 94 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 1, - "w": 90, - "h": 95 - }, - "frame": { - "x": 93, - "y": 494, - "w": 90, - "h": 95 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 1, - "w": 90, - "h": 95 - }, - "frame": { - "x": 93, - "y": 494, - "w": 90, - "h": 95 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 3, - "w": 93, - "h": 95 - }, - "frame": { - "x": 183, - "y": 498, - "w": 93, - "h": 95 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 0, - "w": 86, - "h": 96 - }, - "frame": { - "x": 276, - "y": 502, - "w": 86, - "h": 96 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 0, - "w": 86, - "h": 96 - }, - "frame": { - "x": 276, - "y": 502, - "w": 86, - "h": 96 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 1, - "w": 90, - "h": 96 - }, - "frame": { - "x": 362, - "y": 505, - "w": 90, - "h": 96 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 2, - "w": 90, - "h": 96 - }, - "frame": { - "x": 452, - "y": 514, - "w": 90, - "h": 96 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d1fca3cca7f334c5072e6d9eac438f12:ad4656a8607db0b15f07d4c8860395b7:25c89a8ec37b43392b53a70993acdff3$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 284, "y": 81, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 96, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 690, "y": 66, "w": 103, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 14, "w": 103, "h": 86 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 554, "y": 0, "w": 136, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 33, "w": 136, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 143, "y": 69, "w": 141, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 40, "w": 141, "h": 63 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 409, "y": 0, "w": 145, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 38, "w": 145, "h": 65 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 143, "y": 0, "w": 144, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 33, "w": 144, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 143, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 30, "w": 143, "h": 71 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 409, "y": 65, "w": 131, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 131, "h": 68 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 540, "y": 69, "w": 134, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 33, "w": 134, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 690, "y": 0, "w": 139, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 32, "w": 139, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 287, "y": 0, "w": 122, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 16, "w": 122, "h": 81 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 380, "y": 133, "w": 96, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 96, "h": 87 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 573, "y": 135, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 653, "y": 242, "w": 90, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 90, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 665, "y": 152, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 284, "y": 81, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 96, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 690, "y": 66, "w": 103, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 14, "w": 103, "h": 86 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 554, "y": 0, "w": 136, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 33, "w": 136, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 143, "y": 69, "w": 141, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 40, "w": 141, "h": 63 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 409, "y": 0, "w": 145, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 38, "w": 145, "h": 65 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 143, "y": 0, "w": 144, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 33, "w": 144, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 143, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 30, "w": 143, "h": 71 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 409, "y": 65, "w": 131, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 131, "h": 68 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 540, "y": 69, "w": 134, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 33, "w": 134, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 690, "y": 0, "w": 139, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 32, "w": 139, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 287, "y": 0, "w": 122, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 16, "w": 122, "h": 81 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 380, "y": 133, "w": 96, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 96, "h": 87 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 573, "y": 135, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 653, "y": 242, "w": 90, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 90, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 665, "y": 152, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 284, "y": 81, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 96, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 690, "y": 66, "w": 103, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 14, "w": 103, "h": 86 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 554, "y": 0, "w": 136, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 33, "w": 136, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 143, "y": 69, "w": 141, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 40, "w": 141, "h": 63 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 409, "y": 0, "w": 145, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 38, "w": 145, "h": 65 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 143, "y": 0, "w": 144, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 33, "w": 144, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 143, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 30, "w": 143, "h": 71 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 409, "y": 65, "w": 131, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 131, "h": 68 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 540, "y": 69, "w": 134, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 33, "w": 134, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 690, "y": 0, "w": 139, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 32, "w": 139, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 287, "y": 0, "w": 122, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 16, "w": 122, "h": 81 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 380, "y": 133, "w": 96, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 96, "h": 87 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 573, "y": 135, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 653, "y": 242, "w": 90, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 90, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 665, "y": 152, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 284, "y": 81, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 96, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 161, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0048.png", + "frame": { "x": 374, "y": 220, "w": 93, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 10, "w": 93, "h": 89 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0049.png", + "frame": { "x": 832, "y": 275, "w": 89, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 89, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0050.png", + "frame": { "x": 282, "y": 169, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 9, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 191, "y": 132, "w": 91, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 91, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 71, "w": 98, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 8, "w": 98, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0053.png", + "frame": { "x": 829, "y": 0, "w": 97, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 6, "w": 97, "h": 92 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 92, "y": 222, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 90, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0055.png", + "frame": { "x": 926, "y": 0, "w": 89, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 89, "h": 92 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0056.png", + "frame": { "x": 90, "y": 313, "w": 88, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 5, "w": 88, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 251, "w": 90, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 6, "w": 90, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0058.png", + "frame": { "x": 743, "y": 271, "w": 89, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 4, "w": 89, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0059.png", + "frame": { "x": 98, "y": 132, "w": 93, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 5, "w": 93, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0060.png", + "frame": { "x": 182, "y": 223, "w": 93, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 7, "w": 93, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 793, "y": 92, "w": 97, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 97, "h": 87 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 476, "y": 135, "w": 97, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 9, "w": 97, "h": 86 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0063.png", + "frame": { "x": 560, "y": 225, "w": 93, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 7, "w": 93, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0064.png", + "frame": { "x": 467, "y": 221, "w": 93, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 93, "h": 89 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0065.png", + "frame": { "x": 275, "y": 259, "w": 89, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 89, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0066.png", + "frame": { "x": 921, "y": 275, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 87, "h": 93 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0067.png", + "frame": { "x": 536, "y": 313, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0068.png", + "frame": { "x": 182, "y": 311, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 1, "w": 84, "h": 96 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 341, "w": 80, "h": 97 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 0, "w": 80, "h": 97 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0070.png", + "frame": { "x": 619, "y": 332, "w": 81, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 2, "w": 81, "h": 96 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 364, "y": 309, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 450, "y": 310, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 86, "h": 94 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0073.png", + "frame": { "x": 757, "y": 179, "w": 90, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 90, "h": 92 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0074.png", + "frame": { "x": 847, "y": 183, "w": 90, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 90, "h": 92 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0075.png", + "frame": { "x": 890, "y": 92, "w": 92, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 92, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.9.2-x64", + "image": "249.png", + "format": "I8", + "size": { "w": 1015, "h": 438 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/249.png b/public/images/pokemon/back/249.png index e08ce361804..181c7076e5d 100644 Binary files a/public/images/pokemon/back/249.png and b/public/images/pokemon/back/249.png differ diff --git a/public/images/pokemon/back/25-beauty-cosplay.png b/public/images/pokemon/back/25-beauty-cosplay.png index 30c51863f9f..8a57b642aa7 100644 Binary files a/public/images/pokemon/back/25-beauty-cosplay.png and b/public/images/pokemon/back/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/back/25-cool-cosplay.png b/public/images/pokemon/back/25-cool-cosplay.png index fe8e67a27cd..1c9528eb350 100644 Binary files a/public/images/pokemon/back/25-cool-cosplay.png and b/public/images/pokemon/back/25-cool-cosplay.png differ diff --git a/public/images/pokemon/back/25-cosplay.png b/public/images/pokemon/back/25-cosplay.png index 54c1dca4925..38e573f5784 100644 Binary files a/public/images/pokemon/back/25-cosplay.png and b/public/images/pokemon/back/25-cosplay.png differ diff --git a/public/images/pokemon/back/25-cute-cosplay.png b/public/images/pokemon/back/25-cute-cosplay.png index 9436bad0863..64b180067d5 100644 Binary files a/public/images/pokemon/back/25-cute-cosplay.png and b/public/images/pokemon/back/25-cute-cosplay.png differ diff --git a/public/images/pokemon/back/25-gigantamax.png b/public/images/pokemon/back/25-gigantamax.png index 70bf85129da..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/25-partner.png b/public/images/pokemon/back/25-partner.png index 8085a963e28..ae6133aefff 100644 Binary files a/public/images/pokemon/back/25-partner.png and b/public/images/pokemon/back/25-partner.png differ diff --git a/public/images/pokemon/back/25-smart-cosplay.png b/public/images/pokemon/back/25-smart-cosplay.png index 81a6d938154..6f23b7f4df0 100644 Binary files a/public/images/pokemon/back/25-smart-cosplay.png and b/public/images/pokemon/back/25-smart-cosplay.png differ diff --git a/public/images/pokemon/back/25-tough-cosplay.png b/public/images/pokemon/back/25-tough-cosplay.png index e70757866a5..cfc9392efe8 100644 Binary files a/public/images/pokemon/back/25-tough-cosplay.png and b/public/images/pokemon/back/25-tough-cosplay.png differ diff --git a/public/images/pokemon/back/25.png b/public/images/pokemon/back/25.png index 8085a963e28..ae6133aefff 100644 Binary files a/public/images/pokemon/back/25.png and b/public/images/pokemon/back/25.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/26.png b/public/images/pokemon/back/26.png index 21b3a5fa9c1..454c581edae 100644 Binary files a/public/images/pokemon/back/26.png and b/public/images/pokemon/back/26.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/276.png b/public/images/pokemon/back/276.png index 64c4a4d22ee..fef264f004e 100644 Binary files a/public/images/pokemon/back/276.png and b/public/images/pokemon/back/276.png differ diff --git a/public/images/pokemon/back/277.png b/public/images/pokemon/back/277.png index 0e173bc54fb..ced72a75a73 100644 Binary files a/public/images/pokemon/back/277.png and b/public/images/pokemon/back/277.png differ diff --git a/public/images/pokemon/back/3-gigantamax.png b/public/images/pokemon/back/3-gigantamax.png index a368c97741e..278cb58b765 100644 Binary files a/public/images/pokemon/back/3-gigantamax.png and b/public/images/pokemon/back/3-gigantamax.png differ diff --git a/public/images/pokemon/back/3-mega.png b/public/images/pokemon/back/3-mega.png index 0c8512cb91b..5f4986de090 100644 Binary files a/public/images/pokemon/back/3-mega.png and b/public/images/pokemon/back/3-mega.png differ diff --git a/public/images/pokemon/back/3.png b/public/images/pokemon/back/3.png index 4312bfbce2c..9f833c7d122 100644 Binary files a/public/images/pokemon/back/3.png and b/public/images/pokemon/back/3.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/379.png b/public/images/pokemon/back/379.png index 586a19a5916..b4f282d5989 100644 Binary files a/public/images/pokemon/back/379.png and b/public/images/pokemon/back/379.png differ diff --git a/public/images/pokemon/back/390.png b/public/images/pokemon/back/390.png index 65b5595cfbe..d6dcc990c48 100644 Binary files a/public/images/pokemon/back/390.png and b/public/images/pokemon/back/390.png differ diff --git a/public/images/pokemon/back/391.png b/public/images/pokemon/back/391.png index e89d79720ab..9b41cd2bd89 100644 Binary files a/public/images/pokemon/back/391.png and b/public/images/pokemon/back/391.png differ diff --git a/public/images/pokemon/back/392.png b/public/images/pokemon/back/392.png index e15396669ce..2e7466294da 100644 Binary files a/public/images/pokemon/back/392.png and b/public/images/pokemon/back/392.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/430.png b/public/images/pokemon/back/430.png index 6c0fc8a5166..383685fa816 100644 Binary files a/public/images/pokemon/back/430.png and b/public/images/pokemon/back/430.png differ diff --git a/public/images/pokemon/back/455.png b/public/images/pokemon/back/455.png index 116faf6f090..2191905e2ce 100644 Binary files a/public/images/pokemon/back/455.png and b/public/images/pokemon/back/455.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/477.png b/public/images/pokemon/back/477.png index 40142d042b9..02b662fbd74 100644 Binary files a/public/images/pokemon/back/477.png and b/public/images/pokemon/back/477.png differ diff --git a/public/images/pokemon/back/486.png b/public/images/pokemon/back/486.png index 041b03e5790..4df438f6320 100644 Binary files a/public/images/pokemon/back/486.png and b/public/images/pokemon/back/486.png differ diff --git a/public/images/pokemon/back/502.png b/public/images/pokemon/back/502.png index 4857186bd7e..5225cb803e0 100644 Binary files a/public/images/pokemon/back/502.png and b/public/images/pokemon/back/502.png differ diff --git a/public/images/pokemon/back/503.png b/public/images/pokemon/back/503.png index 96a901b2bdc..8b38780da27 100644 Binary files a/public/images/pokemon/back/503.png and b/public/images/pokemon/back/503.png differ diff --git a/public/images/pokemon/back/527.png b/public/images/pokemon/back/527.png index 61eab42c767..ce061ffe60a 100644 Binary files a/public/images/pokemon/back/527.png and b/public/images/pokemon/back/527.png differ diff --git a/public/images/pokemon/back/528.png b/public/images/pokemon/back/528.png index 1b7733cd4db..81fc8414dd8 100644 Binary files a/public/images/pokemon/back/528.png and b/public/images/pokemon/back/528.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/587.png b/public/images/pokemon/back/587.png index e7304b754ce..8932c1f480a 100644 Binary files a/public/images/pokemon/back/587.png and b/public/images/pokemon/back/587.png differ diff --git a/public/images/pokemon/back/590.png b/public/images/pokemon/back/590.png index 9874d4e216d..6e7685b2ced 100644 Binary files a/public/images/pokemon/back/590.png and b/public/images/pokemon/back/590.png differ diff --git a/public/images/pokemon/back/591.png b/public/images/pokemon/back/591.png index af87fdf527e..2f2d9f34f08 100644 Binary files a/public/images/pokemon/back/591.png and b/public/images/pokemon/back/591.png differ diff --git a/public/images/pokemon/back/616.png b/public/images/pokemon/back/616.png index 751eaf485da..7033e50a0dd 100644 Binary files a/public/images/pokemon/back/616.png and b/public/images/pokemon/back/616.png differ diff --git a/public/images/pokemon/back/6503.png b/public/images/pokemon/back/6503.png index 3953d5d6c66..c88de28046e 100644 Binary files a/public/images/pokemon/back/6503.png and b/public/images/pokemon/back/6503.png differ diff --git a/public/images/pokemon/back/656.png b/public/images/pokemon/back/656.png index 5f6ce42c63b..62362337762 100644 Binary files a/public/images/pokemon/back/656.png and b/public/images/pokemon/back/656.png differ diff --git a/public/images/pokemon/back/657.png b/public/images/pokemon/back/657.png index c7655a643b2..1e61b595e49 100644 Binary files a/public/images/pokemon/back/657.png and b/public/images/pokemon/back/657.png differ diff --git a/public/images/pokemon/back/658-ash.json b/public/images/pokemon/back/658-ash.json index 4ddab1765b2..51a722070b3 100644 --- a/public/images/pokemon/back/658-ash.json +++ b/public/images/pokemon/back/658-ash.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 73, - "h": 73 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 73, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4f38801bb3afeda5faff04bdcf6a666f:0c78ce2715e7510bf55da0a92b42661c:bfbf521a5c7bd80bcd95a96d9789c0dd$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 73, "h": 73 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/658-ash.png b/public/images/pokemon/back/658-ash.png index e574e888fac..382b06fd6cb 100644 Binary files a/public/images/pokemon/back/658-ash.png and b/public/images/pokemon/back/658-ash.png differ diff --git a/public/images/pokemon/back/658.json b/public/images/pokemon/back/658.json index 119002876a6..1d8893e2d5d 100644 --- a/public/images/pokemon/back/658.json +++ b/public/images/pokemon/back/658.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 77, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 77, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:acdb9925f3f23b947504eec7cc28c92d:1a13d9d418f6c107bb9e5d621d9154bb:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 65 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 65 }, + "sourceSize": { "w": 77, "h": 65 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.9.2-x64", + "format": "I8", + "size": { "w": 77, "h": 65 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/658.png b/public/images/pokemon/back/658.png index a8128e1c73f..be286b88666 100644 Binary files a/public/images/pokemon/back/658.png and b/public/images/pokemon/back/658.png differ diff --git a/public/images/pokemon/back/666-fancy.png b/public/images/pokemon/back/666-fancy.png index 35ed4317d8e..b56daf08a52 100644 Binary files a/public/images/pokemon/back/666-fancy.png and b/public/images/pokemon/back/666-fancy.png differ diff --git a/public/images/pokemon/back/666-high-plains.png b/public/images/pokemon/back/666-high-plains.png index 22f676d8f49..d6cca9c2413 100644 Binary files a/public/images/pokemon/back/666-high-plains.png and b/public/images/pokemon/back/666-high-plains.png differ diff --git a/public/images/pokemon/back/666-river.png b/public/images/pokemon/back/666-river.png index 0d7d7a65d1e..effabe7fa2d 100644 Binary files a/public/images/pokemon/back/666-river.png and b/public/images/pokemon/back/666-river.png differ diff --git a/public/images/pokemon/back/668-female.json b/public/images/pokemon/back/668-female.json deleted file mode 100644 index dc3fc99ba58..00000000000 --- a/public/images/pokemon/back/668-female.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "668-female.png", - "format": "RGBA8888", - "size": { - "w": 74, - "h": 74 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 74, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3b22b1fc8fabd22888048f909287acba:10bec1e42fb1d39868a624d00345818d:d99ed0e84a0695b54e479aa98271aba1$" - } -} diff --git a/public/images/pokemon/back/668-female.png b/public/images/pokemon/back/668-female.png deleted file mode 100644 index 6f28278630a..00000000000 Binary files a/public/images/pokemon/back/668-female.png and /dev/null differ diff --git a/public/images/pokemon/back/674.json b/public/images/pokemon/back/674.json index e280c324a0a..cc0ead50962 100644 --- a/public/images/pokemon/back/674.json +++ b/public/images/pokemon/back/674.json @@ -1,41 +1,506 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 27, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 27, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 27, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1fb0fb4f4e63f6114c7490a9d4d536dc:9830bfa81d721fc889ca0580935f03e3:b823d10f1c9b4d501296982088ba63d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0002.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0003.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0004.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0005.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0006.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0007.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0008.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0009.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0010.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0011.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0012.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0013.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0014.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0015.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0016.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0017.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0018.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0019.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0020.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0021.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0022.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0023.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0024.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0025.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0026.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0027.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0028.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0029.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0030.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0031.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 42, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0033.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 83, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0035.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0036.png", + "frame": { "x": 87, "y": 0, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0038.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0039.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0040.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0041.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0042.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0044.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0045.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0046.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0047.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0048.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0050.png", + "frame": { "x": 87, "y": 0, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0051.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0052.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0053.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0055.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "674.png", + "format": "I8", + "size": { "w": 115, "h": 122 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/674.png b/public/images/pokemon/back/674.png index be77e6e1598..9a9d0ec59dd 100644 Binary files a/public/images/pokemon/back/674.png and b/public/images/pokemon/back/674.png differ diff --git a/public/images/pokemon/back/676-dandy.png b/public/images/pokemon/back/676-dandy.png index f8052549668..8a4f26e17b2 100644 Binary files a/public/images/pokemon/back/676-dandy.png and b/public/images/pokemon/back/676-dandy.png differ diff --git a/public/images/pokemon/back/676-debutante.png b/public/images/pokemon/back/676-debutante.png index 507ea4addbe..bed3f323a6b 100644 Binary files a/public/images/pokemon/back/676-debutante.png and b/public/images/pokemon/back/676-debutante.png differ diff --git a/public/images/pokemon/back/676-diamond.png b/public/images/pokemon/back/676-diamond.png index 9498e4e75be..436d9b6dbde 100644 Binary files a/public/images/pokemon/back/676-diamond.png and b/public/images/pokemon/back/676-diamond.png differ diff --git a/public/images/pokemon/back/676-heart.png b/public/images/pokemon/back/676-heart.png index 49c83c6c113..57d472c3834 100644 Binary files a/public/images/pokemon/back/676-heart.png and b/public/images/pokemon/back/676-heart.png differ diff --git a/public/images/pokemon/back/676-kabuki.png b/public/images/pokemon/back/676-kabuki.png index 2aa6fccce61..d602c607643 100644 Binary files a/public/images/pokemon/back/676-kabuki.png and b/public/images/pokemon/back/676-kabuki.png differ diff --git a/public/images/pokemon/back/676-la-reine.png b/public/images/pokemon/back/676-la-reine.png index 2147e5cab01..de1b1a15b90 100644 Binary files a/public/images/pokemon/back/676-la-reine.png and b/public/images/pokemon/back/676-la-reine.png differ diff --git a/public/images/pokemon/back/676-matron.png b/public/images/pokemon/back/676-matron.png index 38092e4fefe..e01a8f273af 100644 Binary files a/public/images/pokemon/back/676-matron.png and b/public/images/pokemon/back/676-matron.png differ diff --git a/public/images/pokemon/back/676-pharaoh.png b/public/images/pokemon/back/676-pharaoh.png index a7ca046406f..13952c58c68 100644 Binary files a/public/images/pokemon/back/676-pharaoh.png and b/public/images/pokemon/back/676-pharaoh.png differ diff --git a/public/images/pokemon/back/676-star.png b/public/images/pokemon/back/676-star.png index 9b082488381..5b188f33498 100644 Binary files a/public/images/pokemon/back/676-star.png and b/public/images/pokemon/back/676-star.png differ diff --git a/public/images/pokemon/back/682.png b/public/images/pokemon/back/682.png index a801a3be1d4..60f869b2f2c 100644 Binary files a/public/images/pokemon/back/682.png and b/public/images/pokemon/back/682.png differ diff --git a/public/images/pokemon/back/683.png b/public/images/pokemon/back/683.png index 2183bc34796..38247067a25 100644 Binary files a/public/images/pokemon/back/683.png and b/public/images/pokemon/back/683.png differ diff --git a/public/images/pokemon/back/684.png b/public/images/pokemon/back/684.png index 1ba17e86bac..3f02f312123 100644 Binary files a/public/images/pokemon/back/684.png and b/public/images/pokemon/back/684.png differ diff --git a/public/images/pokemon/back/685.png b/public/images/pokemon/back/685.png index b1a18694193..eab453253cc 100644 Binary files a/public/images/pokemon/back/685.png and b/public/images/pokemon/back/685.png differ diff --git a/public/images/pokemon/back/688.json b/public/images/pokemon/back/688.json index 872fbc1f9db..d9f30db34a8 100644 --- a/public/images/pokemon/back/688.json +++ b/public/images/pokemon/back/688.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "688.png", - "format": "RGBA8888", - "size": { - "w": 52, - "h": 52 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ea462f2b1b46327e3b8fcb7ec5e44f08:2d2598cc03dec73182dbea237ad83b34:176060351d0044923af938ba7932a6ef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 51, "h": 65 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 51, "h": 65 }, + "sourceSize": { "w": 51, "h": 65 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "688.png", + "format": "I8", + "size": { "w": 51, "h": 65 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/688.png b/public/images/pokemon/back/688.png index 33602c624a7..bb22ceed75e 100644 Binary files a/public/images/pokemon/back/688.png and b/public/images/pokemon/back/688.png differ diff --git a/public/images/pokemon/back/694.json b/public/images/pokemon/back/694.json index afdb992784d..76c88067e7e 100644 --- a/public/images/pokemon/back/694.json +++ b/public/images/pokemon/back/694.json @@ -1,41 +1,767 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 44, - "h": 44 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b35211eb8a79aa76e67039dd27e0e5a6:1905f4c2a0828a1c7c274f51d78b7e21:b0990f9650cfe63b836cbed33f0b44d8$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 57, "y": 129, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 162, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 126, "w": 48, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 48, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 283, "y": 90, "w": 49, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 49, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 126, "w": 49, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 49, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 276, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 132, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 132, "y": 201, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 234, "y": 201, "w": 42, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 42, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 206, "w": 42, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 42, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 44, "y": 203, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 276, "y": 201, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 89, "y": 200, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 146, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 57, "y": 129, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 162, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 114, "y": 126, "w": 48, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 48, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 283, "y": 90, "w": 49, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 49, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 126, "w": 49, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 49, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 276, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 132, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 132, "y": 201, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 234, "y": 201, "w": 42, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 42, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 206, "w": 42, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 42, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 44, "y": 203, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 276, "y": 201, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 89, "y": 200, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 146, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 57, "y": 129, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 162, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 114, "y": 126, "w": 48, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 48, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 283, "y": 90, "w": 49, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 49, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 126, "w": 49, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 49, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 276, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 132, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 132, "y": 201, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 234, "y": 201, "w": 42, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 42, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 206, "w": 42, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 42, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 44, "y": 203, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 276, "y": 201, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 89, "y": 200, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 146, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 57, "y": 129, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 162, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 114, "y": 126, "w": 48, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 48, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 283, "y": 90, "w": 49, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 49, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 126, "w": 49, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 49, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 276, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 132, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 132, "y": 201, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 234, "y": 201, "w": 42, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 42, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 206, "w": 42, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 42, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 44, "y": 203, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 276, "y": 201, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 89, "y": 200, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 146, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 253, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 297, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 209, "y": 162, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 172, "y": 90, "w": 55, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 55, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 57, "y": 90, "w": 57, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 57, "h": 39 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 117, "y": 0, "w": 58, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 47 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 59, "y": 0, "w": 58, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 48 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 59, "h": 48 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 232, "y": 0, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 58, "h": 45 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 232, "y": 45, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 175, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 289, "y": 45, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 117, "y": 47, "w": 57, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 57, "h": 43 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 290, "y": 0, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 45 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 174, "y": 47, "w": 57, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 43 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 58, "y": 48, "w": 57, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 42 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 90, "w": 57, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 42 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 48, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 114, "y": 90, "w": 58, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 12, "w": 58, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 227, "y": 90, "w": 56, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 56, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 169, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 190, "y": 199, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "694.png", + "format": "I8", + "size": { "w": 348, "h": 242 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/694.png b/public/images/pokemon/back/694.png index 5c5b107960c..d5f2f5f9563 100644 Binary files a/public/images/pokemon/back/694.png and b/public/images/pokemon/back/694.png differ diff --git a/public/images/pokemon/back/698.json b/public/images/pokemon/back/698.json index 5cfdd360d26..0da697e1f4e 100644 --- a/public/images/pokemon/back/698.json +++ b/public/images/pokemon/back/698.json @@ -1,41 +1,1415 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 55, - "h": 55 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 55 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:18b6430a6c7f4e62e682eee0f5b03c01:4297c6c0129460df1d8cf73dd3393a43:198087d69fed44d4a642fa3ba5c077d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 139, "y": 55, "w": 35, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 56 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 139, "y": 55, "w": 35, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 56 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 35, "y": 111, "w": 33, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 33, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 35, "y": 111, "w": 33, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 33, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 35, "y": 111, "w": 33, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 33, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 35, "y": 111, "w": 33, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 33, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 139, "y": 55, "w": 35, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 56 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 139, "y": 55, "w": 35, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 56 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "698.png", + "format": "I8", + "size": { "w": 174, "h": 169 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/698.png b/public/images/pokemon/back/698.png index 7326005d6f1..cd49968a7cd 100644 Binary files a/public/images/pokemon/back/698.png and b/public/images/pokemon/back/698.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/703.json b/public/images/pokemon/back/703.json index 4afe5c3a14d..d6752e6f7ff 100644 --- a/public/images/pokemon/back/703.json +++ b/public/images/pokemon/back/703.json @@ -1,41 +1,569 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 38, - "h": 38 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:32e6c2d8721f80aa2afd20f97c5e4cf1:2c61f7a426cd2d739241c87d6ab5ea99:721af8c322ff60159262e9b3017c784d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 36, "y": 38, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 36, "y": 38, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "703.png", + "format": "I8", + "size": { "w": 110, "h": 117 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/703.png b/public/images/pokemon/back/703.png index 1f52ddd3afe..b5b35e07027 100644 Binary files a/public/images/pokemon/back/703.png and b/public/images/pokemon/back/703.png differ diff --git a/public/images/pokemon/back/707.json b/public/images/pokemon/back/707.json index cf372e6a60f..b92e1983efc 100644 --- a/public/images/pokemon/back/707.json +++ b/public/images/pokemon/back/707.json @@ -1,41 +1,1559 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8e9f9a53c8e85bade8027fc978f717a4:3280efd867363be1c2e5a01411ad5bd5:8e96b9056ea81e44ced99c97f472a528$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 428, "y": 143, "w": 51, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 17, "w": 51, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 98, "y": 62, "w": 61, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 14, "w": 61, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 530, "y": 2, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 11, "w": 70, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 194, "y": 2, "w": 85, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 85, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 2, "y": 2, "w": 96, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 96, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 98, "y": 2, "w": 96, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 96, "h": 60 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 279, "y": 2, "w": 91, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 0, "w": 91, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 370, "y": 2, "w": 84, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 84, "h": 64 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 454, "y": 2, "w": 76, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 600, "y": 2, "w": 67, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 67, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 372, "y": 210, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 4, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 172, "y": 450, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 5, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0122.png", + "frame": { "x": 526, "y": 443, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 7, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0123.png", + "frame": { "x": 432, "y": 453, "w": 41, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 10, "w": 41, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0124.png", + "frame": { "x": 43, "y": 438, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 11, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0125.png", + "frame": { "x": 2, "y": 435, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 13, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0126.png", + "frame": { "x": 565, "y": 366, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 14, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0127.png", + "frame": { "x": 131, "y": 429, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 16, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0128.png", + "frame": { "x": 485, "y": 426, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0129.png", + "frame": { "x": 649, "y": 421, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0130.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0131.png", + "frame": { "x": 2, "y": 281, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0132.png", + "frame": { "x": 53, "y": 214, "w": 48, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 18, "w": 48, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0133.png", + "frame": { "x": 354, "y": 348, "w": 46, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 19, "w": 46, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0134.png", + "frame": { "x": 345, "y": 421, "w": 46, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 20, "w": 46, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0135.png", + "frame": { "x": 567, "y": 451, "w": 45, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 45, "h": 68 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0136.png", + "frame": { "x": 423, "y": 218, "w": 52, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 52, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0137.png", + "frame": { "x": 2, "y": 137, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 19, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0138.png", + "frame": { "x": 2, "y": 65, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 19, "w": 59, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0139.png", + "frame": { "x": 600, "y": 71, "w": 58, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 19, "w": 58, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0140.png", + "frame": { "x": 577, "y": 291, "w": 46, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 46, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0141.png", + "frame": { "x": 303, "y": 363, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0142.png", + "frame": { "x": 400, "y": 364, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0143.png", + "frame": { "x": 524, "y": 285, "w": 53, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 19, "w": 53, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0144.png", + "frame": { "x": 266, "y": 213, "w": 60, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 19, "w": 60, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0145.png", + "frame": { "x": 674, "y": 219, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 58, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0146.png", + "frame": { "x": 150, "y": 288, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 18, "w": 56, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0147.png", + "frame": { "x": 250, "y": 351, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 18, "w": 53, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0148.png", + "frame": { "x": 674, "y": 149, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 18, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0149.png", + "frame": { "x": 214, "y": 145, "w": 52, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 52, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0150.png", + "frame": { "x": 48, "y": 290, "w": 48, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 19, "w": 48, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0151.png", + "frame": { "x": 161, "y": 217, "w": 51, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 19, "w": 51, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0152.png", + "frame": { "x": 343, "y": 66, "w": 61, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 61, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0153.png", + "frame": { "x": 279, "y": 64, "w": 64, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 64, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0154.png", + "frame": { "x": 667, "y": 2, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 19, "w": 64, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0155.png", + "frame": { "x": 101, "y": 223, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 18, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0156.png", + "frame": { "x": 89, "y": 363, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0157.png", + "frame": { "x": 671, "y": 281, "w": 53, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 19, "w": 53, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0158.png", + "frame": { "x": 274, "y": 441, "w": 62, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 21, "w": 62, "h": 50 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0159.png", + "frame": { "x": 275, "y": 491, "w": 62, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 22, "w": 62, "h": 43 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0160.png", + "frame": { "x": 674, "y": 505, "w": 59, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 23, "w": 59, "h": 42 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0161.png", + "frame": { "x": 612, "y": 498, "w": 62, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 22, "w": 62, "h": 43 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0162.png", + "frame": { "x": 213, "y": 491, "w": 62, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 22, "w": 62, "h": 49 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0163.png", + "frame": { "x": 372, "y": 287, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 21, "w": 58, "h": 61 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0164.png", + "frame": { "x": 96, "y": 296, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 20, "w": 51, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0165.png", + "frame": { "x": 84, "y": 441, "w": 45, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 20, "w": 45, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0166.png", + "frame": { "x": 728, "y": 149, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 19, "w": 42, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0167.png", + "frame": { "x": 690, "y": 434, "w": 44, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 44, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0168.png", + "frame": { "x": 669, "y": 348, "w": 46, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 46, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0169.png", + "frame": { "x": 259, "y": 275, "w": 47, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 18, "w": 47, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0170.png", + "frame": { "x": 212, "y": 218, "w": 47, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 18, "w": 47, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0171.png", + "frame": { "x": 578, "y": 213, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 18, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0172.png", + "frame": { "x": 724, "y": 281, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "707.png", + "format": "I8", + "size": { "w": 772, "h": 549 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/707.png b/public/images/pokemon/back/707.png index 78aa7077f90..83ca7298f45 100644 Binary files a/public/images/pokemon/back/707.png and b/public/images/pokemon/back/707.png differ diff --git a/public/images/pokemon/back/708.json b/public/images/pokemon/back/708.json index 33edc5748bd..22aa1885edb 100644 --- a/public/images/pokemon/back/708.json +++ b/public/images/pokemon/back/708.json @@ -1,41 +1,1091 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 43, - "h": 43 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:baaaa3a73da00bbc954269f5f5228420:171d77a039e525f9a3a332d9e2d5d82c:796c82c5076b122f2663381836c65843$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 88, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 175, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 10, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 88, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 13, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 132, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 14, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 176, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 220, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 17, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 264, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 19, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 262, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 21, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 44, "y": 166, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 23, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 0, "y": 167, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 21, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 88, "y": 206, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 20, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 220, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 44, "y": 247, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 16, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 218, "y": 246, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 262, "y": 246, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 177, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 264, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 222, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "708.png", + "format": "I8", + "size": { "w": 307, "h": 286 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/708.png b/public/images/pokemon/back/708.png index d6ba8dd838c..9e094aa7122 100644 Binary files a/public/images/pokemon/back/708.png and b/public/images/pokemon/back/708.png differ diff --git a/public/images/pokemon/back/714.json b/public/images/pokemon/back/714.json index e4e3740603e..abcb8902edd 100644 --- a/public/images/pokemon/back/714.json +++ b/public/images/pokemon/back/714.json @@ -1,41 +1,263 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 63, - "h": 63 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 63, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 63, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8ffbc9c4153869b318391be0e5f3743c:6e53f3ebf638d13b0d9b325c9e1c6198:1a07d46e710b0568ec824f54fbc4fe6a$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 66, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 198, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 64, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 124, "y": 120, "w": 34, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 34, "h": 65 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 1, "y": 178, "w": 34, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 3, "w": 34, "h": 60 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 264, "y": 61, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 131, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 198, "y": 60, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 64, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 160, "y": 120, "w": 34, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 3, "w": 34, "h": 65 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 196, "y": 178, "w": 34, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 34, "h": 60 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 1, "y": 120, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 66, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 64, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 50, "y": 120, "w": 35, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 2, "w": 35, "h": 66 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 245, "y": 120, "w": 35, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 35, "h": 61 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 264, "y": 1, "w": 47, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 47, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 133, "y": 1, "w": 63, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 63, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 67, "y": 1, "w": 64, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 64, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 87, "y": 120, "w": 35, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 35, "h": 66 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 282, "y": 120, "w": 34, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 34, "h": 61 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 1, "y": 120, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "714.png", + "format": "I8", + "size": { "w": 317, "h": 239 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/714.png b/public/images/pokemon/back/714.png index b9724fe6a63..afe2bce45a4 100644 Binary files a/public/images/pokemon/back/714.png and b/public/images/pokemon/back/714.png differ diff --git a/public/images/pokemon/back/715.png b/public/images/pokemon/back/715.png index edcb84dbd2a..624780ff0c6 100644 Binary files a/public/images/pokemon/back/715.png and b/public/images/pokemon/back/715.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/718-10.json b/public/images/pokemon/back/718-10.json index 74c29a2514f..75053d61900 100644 --- a/public/images/pokemon/back/718-10.json +++ b/public/images/pokemon/back/718-10.json @@ -1,41 +1,686 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 65, - "h": 65 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 59, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e9f4b2c69d996349a8e35598e7ddec9c:06067c7cf2cde81fd4d1f42fe319185e:82195cf2a6db620c5643b8162d6e8c5c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 194, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 59, "y": 194, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 56, "y": 319, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 59, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 117, "y": 259, "w": 60, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 62 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 177, "y": 320, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 61 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 232, "y": 128, "w": 61, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 61, "h": 62 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 56, "y": 258, "w": 61, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 61, "h": 61 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 118, "y": 195, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 115, "y": 321, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 55, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 237, "y": 321, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 55, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 234, "y": 253, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 290, "y": 254, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 258, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 175, "y": 128, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 57, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 177, "y": 253, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 57, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 59, "y": 65, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 117, "y": 128, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 65, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718-10.png", + "format": "I8", + "size": { "w": 364, "h": 387 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/718-10.png b/public/images/pokemon/back/718-10.png index 351da7fa3b3..2f3b211e9a6 100644 Binary files a/public/images/pokemon/back/718-10.png and b/public/images/pokemon/back/718-10.png differ diff --git a/public/images/pokemon/back/718.json b/public/images/pokemon/back/718.json index ef727edcb5c..1a835e26b08 100644 --- a/public/images/pokemon/back/718.json +++ b/public/images/pokemon/back/718.json @@ -1,41 +1,803 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 88, - "h": 88 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3aa5b45708c79b806af72f343f73edbc:0b68b84d5671a020b28cd5a19650bf44:7b4a06b06cbac24b3f39727b0238661b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 359, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 300, "y": 357, "w": 73, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 73, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 380, "y": 271, "w": 74, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 74, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 384, "y": 181, "w": 75, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 75, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 155, "y": 92, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 309, "y": 91, "w": 77, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 77, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 227, "y": 268, "w": 77, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 77, "h": 87 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 150, "y": 182, "w": 77, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 77, "h": 87 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 272, "w": 75, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 75, "h": 87 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 310, "y": 0, "w": 77, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 77, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 387, "y": 0, "w": 77, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 77, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 155, "y": 0, "w": 77, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 77, "h": 92 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 77, "y": 0, "w": 78, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 78, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 77, "h": 93 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 231, "y": 180, "w": 77, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 77, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 232, "y": 0, "w": 78, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 77, "y": 91, "w": 78, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 78, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 464, "y": 0, "w": 77, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 232, "y": 90, "w": 77, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 77, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 464, "y": 90, "w": 77, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 77, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 93, "w": 75, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 75, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 75, "y": 179, "w": 75, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 75, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 454, "y": 357, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718.png", + "format": "I8", + "size": { "w": 541, "h": 534 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/718.png b/public/images/pokemon/back/718.png index 8e3966b1f79..ce48ca205b4 100644 Binary files a/public/images/pokemon/back/718.png and b/public/images/pokemon/back/718.png differ diff --git a/public/images/pokemon/back/719.json b/public/images/pokemon/back/719.json index ea7fd0f3213..440e23718de 100644 --- a/public/images/pokemon/back/719.json +++ b/public/images/pokemon/back/719.json @@ -1,41 +1,875 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 42, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fd235f556d7919416a78362d72f6badd:d250eac977fb7684257a27d4f4c11bea:17a705bb924916761be2495822a53735$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 44, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 88, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 132, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 176, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 42, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 83, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 42, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 84, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 131, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 220, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 44, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 88, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 132, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 176, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 42, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 83, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 42, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 84, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 131, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 220, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 44, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 88, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 132, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 176, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 42, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 83, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 42, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 84, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 131, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 220, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 44, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 88, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 132, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 176, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 42, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 83, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 42, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 84, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 131, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 220, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 72, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 126, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 168, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 124, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 206, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 162, "y": 359, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 0, "w": 37, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 202, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 82, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 165, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 210, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 217, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 44, "y": 72, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 88, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 252, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 247, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 288, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 162, "y": 288, "w": 38, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 38, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 241, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 122, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 41, "y": 288, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 216, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 174, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 72, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 126, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 168, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 124, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 206, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 162, "y": 359, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 0, "w": 37, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 202, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 82, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 165, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 210, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 217, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 44, "y": 72, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 88, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 252, "y": 144, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 247, "y": 216, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 288, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 162, "y": 288, "w": 38, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 38, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 241, "y": 288, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 122, "y": 288, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 41, "y": 288, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 216, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 174, "y": 72, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "719.png", + "format": "I8", + "size": { "w": 292, "h": 428 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/719.png b/public/images/pokemon/back/719.png index 14ff62742f7..1c275f3241d 100644 Binary files a/public/images/pokemon/back/719.png and b/public/images/pokemon/back/719.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..60ab60a9aa1 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/894.png b/public/images/pokemon/back/894.png index 337cba1cc71..b4cc4974ce2 100644 Binary files a/public/images/pokemon/back/894.png and b/public/images/pokemon/back/894.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/945.png b/public/images/pokemon/back/945.png index a89963b7cc3..6359f2cd77a 100644 Binary files a/public/images/pokemon/back/945.png and b/public/images/pokemon/back/945.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/987.png b/public/images/pokemon/back/987.png index 64a47fbf0ea..ab4e628de28 100644 Binary files a/public/images/pokemon/back/987.png and b/public/images/pokemon/back/987.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/198.png b/public/images/pokemon/back/female/198.png index 4f3f5d5c1a4..01489a05fb0 100644 Binary files a/public/images/pokemon/back/female/198.png and b/public/images/pokemon/back/female/198.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/25-beauty-cosplay.png b/public/images/pokemon/back/female/25-beauty-cosplay.png index b33e374aa6d..161cc301f7b 100644 Binary files a/public/images/pokemon/back/female/25-beauty-cosplay.png and b/public/images/pokemon/back/female/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-cool-cosplay.png b/public/images/pokemon/back/female/25-cool-cosplay.png index e672040eaab..d10328785c8 100644 Binary files a/public/images/pokemon/back/female/25-cool-cosplay.png and b/public/images/pokemon/back/female/25-cool-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-cosplay.png b/public/images/pokemon/back/female/25-cosplay.png index 2ebb0fe2285..644aec70f50 100644 Binary files a/public/images/pokemon/back/female/25-cosplay.png and b/public/images/pokemon/back/female/25-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-cute-cosplay.png b/public/images/pokemon/back/female/25-cute-cosplay.png index 998a41f7396..552d816e142 100644 Binary files a/public/images/pokemon/back/female/25-cute-cosplay.png and b/public/images/pokemon/back/female/25-cute-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-partner.png b/public/images/pokemon/back/female/25-partner.png index 97ceaa8bb2f..e65e58ec131 100644 Binary files a/public/images/pokemon/back/female/25-partner.png and b/public/images/pokemon/back/female/25-partner.png differ diff --git a/public/images/pokemon/back/female/25-smart-cosplay.png b/public/images/pokemon/back/female/25-smart-cosplay.png index 983f49e7024..c84c0b556aa 100644 Binary files a/public/images/pokemon/back/female/25-smart-cosplay.png and b/public/images/pokemon/back/female/25-smart-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-tough-cosplay.png b/public/images/pokemon/back/female/25-tough-cosplay.png index a043231f172..73be0c8fb85 100644 Binary files a/public/images/pokemon/back/female/25-tough-cosplay.png and b/public/images/pokemon/back/female/25-tough-cosplay.png differ diff --git a/public/images/pokemon/back/female/25.png b/public/images/pokemon/back/female/25.png index 97ceaa8bb2f..e65e58ec131 100644 Binary files a/public/images/pokemon/back/female/25.png and b/public/images/pokemon/back/female/25.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/26.png b/public/images/pokemon/back/female/26.png index 40d39589660..2a6a3e41b2f 100644 Binary files a/public/images/pokemon/back/female/26.png and b/public/images/pokemon/back/female/26.png differ diff --git a/public/images/pokemon/back/female/3.png b/public/images/pokemon/back/female/3.png index 0fdbf4e9be2..ef103db8ce0 100644 Binary files a/public/images/pokemon/back/female/3.png and b/public/images/pokemon/back/female/3.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/249.json b/public/images/pokemon/back/shiny/249.json index 7512f163c15..7f126e8c62c 100644 --- a/public/images/pokemon/back/shiny/249.json +++ b/public/images/pokemon/back/shiny/249.json @@ -1,2540 +1,686 @@ -{ - "textures": [ - { - "image": "249.png", - "format": "RGBA8888", - "size": { - "w": 610, - "h": 610 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 36, - "w": 143, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 143, - "h": 64 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 35, - "w": 146, - "h": 65 - }, - "frame": { - "x": 143, - "y": 0, - "w": 146, - "h": 65 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 30, - "w": 132, - "h": 67 - }, - "frame": { - "x": 289, - "y": 0, - "w": 132, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 140, - "h": 68 - }, - "frame": { - "x": 421, - "y": 0, - "w": 140, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 2, - "y": 30, - "w": 138, - "h": 70 - }, - "frame": { - "x": 0, - "y": 64, - "w": 138, - "h": 70 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 0, - "y": 30, - "w": 146, - "h": 70 - }, - "frame": { - "x": 138, - "y": 65, - "w": 146, - "h": 70 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 10, - "y": 28, - "w": 130, - "h": 70 - }, - "frame": { - "x": 284, - "y": 67, - "w": 130, - "h": 70 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 1, - "y": 26, - "w": 145, - "h": 73 - }, - "frame": { - "x": 414, - "y": 68, - "w": 145, - "h": 73 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 7, - "y": 13, - "w": 124, - "h": 82 - }, - "frame": { - "x": 0, - "y": 134, - "w": 124, - "h": 82 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 17, - "y": 11, - "w": 106, - "h": 87 - }, - "frame": { - "x": 124, - "y": 135, - "w": 106, - "h": 87 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 25, - "y": 5, - "w": 99, - "h": 88 - }, - "frame": { - "x": 230, - "y": 137, - "w": 99, - "h": 88 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 5, - "w": 99, - "h": 88 - }, - "frame": { - "x": 329, - "y": 141, - "w": 99, - "h": 88 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 6, - "w": 98, - "h": 89 - }, - "frame": { - "x": 428, - "y": 141, - "w": 98, - "h": 89 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 26, - "y": 0, - "w": 84, - "h": 97 - }, - "frame": { - "x": 526, - "y": 141, - "w": 84, - "h": 97 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 27, - "y": 4, - "w": 96, - "h": 89 - }, - "frame": { - "x": 0, - "y": 216, - "w": 96, - "h": 89 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 96, - "h": 89 - }, - "frame": { - "x": 96, - "y": 222, - "w": 96, - "h": 89 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 20, - "y": 7, - "w": 98, - "h": 90 - }, - "frame": { - "x": 192, - "y": 225, - "w": 98, - "h": 90 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 7, - "w": 95, - "h": 90 - }, - "frame": { - "x": 290, - "y": 229, - "w": 95, - "h": 90 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 7, - "w": 95, - "h": 90 - }, - "frame": { - "x": 290, - "y": 229, - "w": 95, - "h": 90 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 4, - "w": 95, - "h": 90 - }, - "frame": { - "x": 385, - "y": 230, - "w": 95, - "h": 90 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 4, - "w": 95, - "h": 91 - }, - "frame": { - "x": 480, - "y": 238, - "w": 95, - "h": 91 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 95, - "h": 91 - }, - "frame": { - "x": 0, - "y": 305, - "w": 95, - "h": 91 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 6, - "w": 95, - "h": 91 - }, - "frame": { - "x": 95, - "y": 311, - "w": 95, - "h": 91 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 32, - "y": 2, - "w": 92, - "h": 91 - }, - "frame": { - "x": 190, - "y": 315, - "w": 92, - "h": 91 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 32, - "y": 2, - "w": 92, - "h": 91 - }, - "frame": { - "x": 190, - "y": 315, - "w": 92, - "h": 91 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 16, - "y": 5, - "w": 101, - "h": 91 - }, - "frame": { - "x": 282, - "y": 319, - "w": 101, - "h": 91 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 5, - "w": 94, - "h": 92 - }, - "frame": { - "x": 383, - "y": 320, - "w": 94, - "h": 92 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 16, - "y": 4, - "w": 100, - "h": 92 - }, - "frame": { - "x": 477, - "y": 329, - "w": 100, - "h": 92 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 94, - "h": 92 - }, - "frame": { - "x": 0, - "y": 396, - "w": 94, - "h": 92 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 29, - "y": 2, - "w": 91, - "h": 92 - }, - "frame": { - "x": 94, - "y": 402, - "w": 91, - "h": 92 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 29, - "y": 2, - "w": 91, - "h": 92 - }, - "frame": { - "x": 94, - "y": 402, - "w": 91, - "h": 92 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 2, - "w": 92, - "h": 92 - }, - "frame": { - "x": 185, - "y": 406, - "w": 92, - "h": 92 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 6, - "w": 96, - "h": 92 - }, - "frame": { - "x": 277, - "y": 410, - "w": 96, - "h": 92 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 92, - "h": 93 - }, - "frame": { - "x": 373, - "y": 412, - "w": 92, - "h": 93 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 2, - "w": 92, - "h": 93 - }, - "frame": { - "x": 465, - "y": 421, - "w": 92, - "h": 93 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 4, - "w": 93, - "h": 94 - }, - "frame": { - "x": 0, - "y": 488, - "w": 93, - "h": 94 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 1, - "w": 90, - "h": 95 - }, - "frame": { - "x": 93, - "y": 494, - "w": 90, - "h": 95 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 1, - "w": 90, - "h": 95 - }, - "frame": { - "x": 93, - "y": 494, - "w": 90, - "h": 95 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 22, - "y": 3, - "w": 93, - "h": 95 - }, - "frame": { - "x": 183, - "y": 498, - "w": 93, - "h": 95 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 0, - "w": 86, - "h": 96 - }, - "frame": { - "x": 276, - "y": 502, - "w": 86, - "h": 96 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 0, - "w": 86, - "h": 96 - }, - "frame": { - "x": 276, - "y": 502, - "w": 86, - "h": 96 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 23, - "y": 1, - "w": 90, - "h": 96 - }, - "frame": { - "x": 362, - "y": 505, - "w": 90, - "h": 96 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 146, - "h": 100 - }, - "spriteSourceSize": { - "x": 24, - "y": 2, - "w": 90, - "h": 96 - }, - "frame": { - "x": 452, - "y": 514, - "w": 90, - "h": 96 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d7da4020739cd4d93722302e0d6f99c6:d519731f31735f11bbba940400858c46:25c89a8ec37b43392b53a70993acdff3$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 284, "y": 81, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 96, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 690, "y": 66, "w": 103, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 14, "w": 103, "h": 86 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 554, "y": 0, "w": 136, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 33, "w": 136, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 143, "y": 69, "w": 141, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 40, "w": 141, "h": 63 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 409, "y": 0, "w": 145, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 38, "w": 145, "h": 65 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 143, "y": 0, "w": 144, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 33, "w": 144, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 143, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 30, "w": 143, "h": 71 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 409, "y": 65, "w": 131, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 131, "h": 68 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 540, "y": 69, "w": 134, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 33, "w": 134, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 690, "y": 0, "w": 139, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 32, "w": 139, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 287, "y": 0, "w": 122, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 16, "w": 122, "h": 81 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 380, "y": 133, "w": 96, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 96, "h": 87 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 573, "y": 135, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 653, "y": 242, "w": 90, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 90, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 665, "y": 152, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 284, "y": 81, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 96, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 690, "y": 66, "w": 103, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 14, "w": 103, "h": 86 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 554, "y": 0, "w": 136, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 33, "w": 136, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 143, "y": 69, "w": 141, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 40, "w": 141, "h": 63 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 409, "y": 0, "w": 145, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 38, "w": 145, "h": 65 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 143, "y": 0, "w": 144, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 33, "w": 144, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 143, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 30, "w": 143, "h": 71 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 409, "y": 65, "w": 131, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 131, "h": 68 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 540, "y": 69, "w": 134, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 33, "w": 134, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 690, "y": 0, "w": 139, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 32, "w": 139, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 287, "y": 0, "w": 122, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 16, "w": 122, "h": 81 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 380, "y": 133, "w": 96, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 96, "h": 87 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 573, "y": 135, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 653, "y": 242, "w": 90, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 90, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 665, "y": 152, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 284, "y": 81, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 96, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 690, "y": 66, "w": 103, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 14, "w": 103, "h": 86 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 554, "y": 0, "w": 136, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 33, "w": 136, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 143, "y": 69, "w": 141, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 40, "w": 141, "h": 63 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 409, "y": 0, "w": 145, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 38, "w": 145, "h": 65 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 143, "y": 0, "w": 144, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 33, "w": 144, "h": 69 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 143, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 30, "w": 143, "h": 71 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 409, "y": 65, "w": 131, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 131, "h": 68 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 540, "y": 69, "w": 134, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 33, "w": 134, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 690, "y": 0, "w": 139, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 32, "w": 139, "h": 66 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 287, "y": 0, "w": 122, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 16, "w": 122, "h": 81 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 380, "y": 133, "w": 96, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 96, "h": 87 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 573, "y": 135, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 653, "y": 242, "w": 90, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 90, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 665, "y": 152, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 284, "y": 81, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 96, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 161, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0048.png", + "frame": { "x": 374, "y": 220, "w": 93, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 10, "w": 93, "h": 89 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0049.png", + "frame": { "x": 832, "y": 275, "w": 89, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 89, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0050.png", + "frame": { "x": 282, "y": 169, "w": 92, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 9, "w": 92, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 191, "y": 132, "w": 91, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 91, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 71, "w": 98, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 8, "w": 98, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0053.png", + "frame": { "x": 829, "y": 0, "w": 97, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 6, "w": 97, "h": 92 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 92, "y": 222, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 90, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0055.png", + "frame": { "x": 926, "y": 0, "w": 89, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 89, "h": 92 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0056.png", + "frame": { "x": 90, "y": 313, "w": 88, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 5, "w": 88, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 251, "w": 90, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 6, "w": 90, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0058.png", + "frame": { "x": 743, "y": 271, "w": 89, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 4, "w": 89, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0059.png", + "frame": { "x": 98, "y": 132, "w": 93, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 5, "w": 93, "h": 90 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0060.png", + "frame": { "x": 182, "y": 223, "w": 93, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 7, "w": 93, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 793, "y": 92, "w": 97, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 97, "h": 87 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 476, "y": 135, "w": 97, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 9, "w": 97, "h": 86 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0063.png", + "frame": { "x": 560, "y": 225, "w": 93, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 7, "w": 93, "h": 88 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0064.png", + "frame": { "x": 467, "y": 221, "w": 93, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 93, "h": 89 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0065.png", + "frame": { "x": 275, "y": 259, "w": 89, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 89, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0066.png", + "frame": { "x": 921, "y": 275, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 87, "h": 93 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + }, + { + "filename": "0067.png", + "frame": { "x": 536, "y": 313, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0068.png", + "frame": { "x": 182, "y": 311, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 1, "w": 84, "h": 96 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 341, "w": 80, "h": 97 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 0, "w": 80, "h": 97 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0070.png", + "frame": { "x": 619, "y": 332, "w": 81, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 2, "w": 81, "h": 96 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 364, "y": 309, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 450, "y": 310, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 86, "h": 94 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 30 + }, + { + "filename": "0073.png", + "frame": { "x": 757, "y": 179, "w": 90, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 90, "h": 92 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 70 + }, + { + "filename": "0074.png", + "frame": { "x": 847, "y": 183, "w": 90, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 90, "h": 92 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 20 + }, + { + "filename": "0075.png", + "frame": { "x": 890, "y": 92, "w": 92, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 92, "h": 91 }, + "sourceSize": { "w": 146, "h": 103 }, + "duration": 80 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.9.2-x64", + "image": "249.png", + "format": "I8", + "size": { "w": 1015, "h": 438 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/249.png b/public/images/pokemon/back/shiny/249.png index bf37f724613..066a38999e0 100644 Binary files a/public/images/pokemon/back/shiny/249.png and b/public/images/pokemon/back/shiny/249.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/3-gigantamax.png b/public/images/pokemon/back/shiny/3-gigantamax.png index e3402e164a6..24b79e4211e 100644 Binary files a/public/images/pokemon/back/shiny/3-gigantamax.png and b/public/images/pokemon/back/shiny/3-gigantamax.png differ diff --git a/public/images/pokemon/back/shiny/3.png b/public/images/pokemon/back/shiny/3.png index a80c363723b..890fce10821 100644 Binary files a/public/images/pokemon/back/shiny/3.png and b/public/images/pokemon/back/shiny/3.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/378.png b/public/images/pokemon/back/shiny/378.png index ecaa26564c3..7bb24f1edfe 100644 Binary files a/public/images/pokemon/back/shiny/378.png and b/public/images/pokemon/back/shiny/378.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..e7630e58e07 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/658-ash.json b/public/images/pokemon/back/shiny/658-ash.json index a796ad08246..51a722070b3 100644 --- a/public/images/pokemon/back/shiny/658-ash.json +++ b/public/images/pokemon/back/shiny/658-ash.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 73, - "h": 73 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 73, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d474b821316a87dfe09b397bdc2db5ef:497de0c2ec59ceba163e870b3226c76c:bfbf521a5c7bd80bcd95a96d9789c0dd$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 73, "h": 73 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/658-ash.png b/public/images/pokemon/back/shiny/658-ash.png index e41efb2c7ad..6e10e834731 100644 Binary files a/public/images/pokemon/back/shiny/658-ash.png and b/public/images/pokemon/back/shiny/658-ash.png differ diff --git a/public/images/pokemon/back/shiny/658.json b/public/images/pokemon/back/shiny/658.json index cc5d3c5b9ff..867e1d2d3d2 100644 --- a/public/images/pokemon/back/shiny/658.json +++ b/public/images/pokemon/back/shiny/658.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 77, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 77, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5891f87a78022cde3402e7d9714cc7bf:756360084290e39c139e3fef91c81759:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 65 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 65 }, + "sourceSize": { "w": 77, "h": 65 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 77, "h": 65 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/658.png b/public/images/pokemon/back/shiny/658.png index 8b7f9c7e4fb..239aaafb6ce 100644 Binary files a/public/images/pokemon/back/shiny/658.png and b/public/images/pokemon/back/shiny/658.png differ diff --git a/public/images/pokemon/back/shiny/668-female.png b/public/images/pokemon/back/shiny/668-female.png deleted file mode 100644 index caf8bed99ac..00000000000 Binary files a/public/images/pokemon/back/shiny/668-female.png and /dev/null differ diff --git a/public/images/pokemon/back/shiny/674.json b/public/images/pokemon/back/shiny/674.json index eac9372c5d4..cc0ead50962 100644 --- a/public/images/pokemon/back/shiny/674.json +++ b/public/images/pokemon/back/shiny/674.json @@ -1,41 +1,506 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 27, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 27, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 27, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:efc4d9ff714ef5249d5ea29e541766f9:c21489bea9a10b1521844e4efb4735d5:b823d10f1c9b4d501296982088ba63d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0002.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0003.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0004.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0005.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0006.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0007.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0008.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0009.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0010.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0011.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0012.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0013.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0014.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0015.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0016.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0017.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0018.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0019.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0020.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0021.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0022.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0023.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0024.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0025.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0026.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0027.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0028.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0029.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0030.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0031.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 42, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0033.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 83, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0035.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0036.png", + "frame": { "x": 87, "y": 0, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0038.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0039.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0040.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0041.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0042.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0044.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0045.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0046.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0047.png", + "frame": { "x": 58, "y": 0, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0048.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0050.png", + "frame": { "x": 87, "y": 0, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0051.png", + "frame": { "x": 54, "y": 82, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0052.png", + "frame": { "x": 81, "y": 82, "w": 27, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 27, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0053.png", + "frame": { "x": 27, "y": 80, "w": 27, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 27, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 85, "y": 41, "w": 27, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 27, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0055.png", + "frame": { "x": 58, "y": 40, "w": 27, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 27, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "674.png", + "format": "I8", + "size": { "w": 115, "h": 122 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/674.png b/public/images/pokemon/back/shiny/674.png index 96734feb3f7..4617b03c6eb 100644 Binary files a/public/images/pokemon/back/shiny/674.png and b/public/images/pokemon/back/shiny/674.png differ diff --git a/public/images/pokemon/back/shiny/688.json b/public/images/pokemon/back/shiny/688.json index 56cf47aab5a..d9f30db34a8 100644 --- a/public/images/pokemon/back/shiny/688.json +++ b/public/images/pokemon/back/shiny/688.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "688.png", - "format": "RGBA8888", - "size": { - "w": 52, - "h": 52 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0261b6c9242bba728fcfbfc515875b27:de0d9ddceed9311b33ae50ba86e969d1:176060351d0044923af938ba7932a6ef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 51, "h": 65 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 51, "h": 65 }, + "sourceSize": { "w": 51, "h": 65 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "688.png", + "format": "I8", + "size": { "w": 51, "h": 65 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/688.png b/public/images/pokemon/back/shiny/688.png index c4aff6eb12d..bfff80c4925 100644 Binary files a/public/images/pokemon/back/shiny/688.png and b/public/images/pokemon/back/shiny/688.png differ diff --git a/public/images/pokemon/back/shiny/694.json b/public/images/pokemon/back/shiny/694.json index ae617f4876f..76c88067e7e 100644 --- a/public/images/pokemon/back/shiny/694.json +++ b/public/images/pokemon/back/shiny/694.json @@ -1,41 +1,767 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 44, - "h": 44 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:136b476d55eb513322e6355dbd903c97:982afbb162c554e6193d6fe06bccb61d:b0990f9650cfe63b836cbed33f0b44d8$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 57, "y": 129, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 162, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 126, "w": 48, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 48, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 283, "y": 90, "w": 49, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 49, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 126, "w": 49, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 49, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 276, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 132, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 132, "y": 201, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 234, "y": 201, "w": 42, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 42, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 206, "w": 42, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 42, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 44, "y": 203, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 276, "y": 201, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 89, "y": 200, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 146, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 57, "y": 129, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 162, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 114, "y": 126, "w": 48, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 48, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 283, "y": 90, "w": 49, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 49, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 126, "w": 49, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 49, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 276, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 132, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 132, "y": 201, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 234, "y": 201, "w": 42, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 42, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 206, "w": 42, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 42, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 44, "y": 203, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 276, "y": 201, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 89, "y": 200, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 146, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 57, "y": 129, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 162, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 114, "y": 126, "w": 48, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 48, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 283, "y": 90, "w": 49, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 49, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 126, "w": 49, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 49, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 276, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 132, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 132, "y": 201, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 234, "y": 201, "w": 42, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 42, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 206, "w": 42, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 42, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 44, "y": 203, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 276, "y": 201, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 89, "y": 200, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 146, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 57, "y": 129, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 162, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 114, "y": 126, "w": 48, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 48, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 283, "y": 90, "w": 49, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 49, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 126, "w": 49, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 49, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 276, "y": 127, "w": 47, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 47, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 132, "w": 45, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 45, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 132, "y": 201, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 234, "y": 201, "w": 42, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 42, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 206, "w": 42, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 42, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 44, "y": 203, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 276, "y": 201, "w": 43, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 43, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 89, "y": 200, "w": 43, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 43, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 146, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 102, "y": 163, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 253, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 297, "y": 164, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 209, "y": 162, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 172, "y": 90, "w": 55, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 55, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 57, "y": 90, "w": 57, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 57, "h": 39 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 117, "y": 0, "w": 58, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 47 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 59, "y": 0, "w": 58, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 48 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 59, "h": 48 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 232, "y": 0, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 58, "h": 45 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 232, "y": 45, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 175, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 289, "y": 45, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 117, "y": 47, "w": 57, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 57, "h": 43 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 290, "y": 0, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 45 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 174, "y": 47, "w": 57, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 43 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 58, "y": 48, "w": 57, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 42 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 90, "w": 57, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 42 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 48, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 114, "y": 90, "w": 58, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 12, "w": 58, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 227, "y": 90, "w": 56, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 56, "h": 36 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 169, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 190, "y": 199, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 44, "h": 37 }, + "sourceSize": { "w": 61, "h": 48 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "694.png", + "format": "I8", + "size": { "w": 348, "h": 242 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/694.png b/public/images/pokemon/back/shiny/694.png index 1c6444e450a..b4d451678ef 100644 Binary files a/public/images/pokemon/back/shiny/694.png and b/public/images/pokemon/back/shiny/694.png differ diff --git a/public/images/pokemon/back/shiny/698.json b/public/images/pokemon/back/shiny/698.json index fba1db6d11d..0da697e1f4e 100644 --- a/public/images/pokemon/back/shiny/698.json +++ b/public/images/pokemon/back/shiny/698.json @@ -1,41 +1,1415 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 55, - "h": 55 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 55 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2d3467f0abbe6bec820c8196bd88983a:3a8331cf2af48202898ef3b9681f4110:198087d69fed44d4a642fa3ba5c077d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 99, "y": 113, "w": 31, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 31, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 68, "y": 112, "w": 31, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 31, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 139, "y": 111, "w": 33, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 33, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 107, "w": 35, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 0, "y": 0, "w": 45, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 45, "h": 52 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 44, "h": 53 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 89, "y": 0, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 41, "h": 54 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 130, "y": 0, "w": 39, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 39, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 139, "y": 55, "w": 35, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 56 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 139, "y": 55, "w": 35, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 56 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 35, "y": 111, "w": 33, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 33, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 35, "y": 111, "w": 33, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 33, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 37, "y": 53, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 71, "y": 54, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 105, "y": 55, "w": 34, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 34, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 35, "y": 111, "w": 33, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 33, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 35, "y": 111, "w": 33, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 33, "h": 58 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 139, "y": 55, "w": 35, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 56 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 139, "y": 55, "w": 35, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 56 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 0, "y": 52, "w": 37, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 55 }, + "sourceSize": { "w": 45, "h": 58 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "698.png", + "format": "I8", + "size": { "w": 174, "h": 169 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/698.png b/public/images/pokemon/back/shiny/698.png index 22f9b2b660d..bc96912bd46 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/703.json b/public/images/pokemon/back/shiny/703.json index ee6074b20ca..d6752e6f7ff 100644 --- a/public/images/pokemon/back/shiny/703.json +++ b/public/images/pokemon/back/shiny/703.json @@ -1,41 +1,569 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 38, - "h": 38 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d9d865fef42b5a28e45d32fccd741f98:96057dceb7fdf650f54901c6be0f386f:721af8c322ff60159262e9b3017c784d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 73, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 36, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 36, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 36, "y": 38, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 36, "y": 38, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 73, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 72, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "703.png", + "format": "I8", + "size": { "w": 110, "h": 117 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/703.png b/public/images/pokemon/back/shiny/703.png index ea22e4ad5d4..635d930e674 100644 Binary files a/public/images/pokemon/back/shiny/703.png and b/public/images/pokemon/back/shiny/703.png differ diff --git a/public/images/pokemon/back/shiny/707.json b/public/images/pokemon/back/shiny/707.json index 8151fd60f08..b92e1983efc 100644 --- a/public/images/pokemon/back/shiny/707.json +++ b/public/images/pokemon/back/shiny/707.json @@ -1,41 +1,1559 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c2d2cb3b868498a2b93c8233ad35af4a:09ee133b9c655c6135da1abf1c9b6ddf:8e96b9056ea81e44ced99c97f472a528$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 190, "y": 373, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 391, "y": 440, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 443, "y": 377, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 715, "y": 359, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 45, "y": 363, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 520, "y": 352, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 306, "y": 291, "w": 48, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 48, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 527, "y": 213, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 372, "y": 139, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 12, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 404, "y": 69, "w": 59, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 13, "w": 59, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 658, "y": 73, "w": 57, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 14, "w": 57, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 570, "y": 141, "w": 55, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 13, "w": 55, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 161, "y": 145, "w": 53, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 14, "w": 53, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 2, "y": 208, "w": 51, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 15, "w": 51, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 475, "y": 229, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 16, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 623, "y": 300, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 475, "y": 302, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 17, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 232, "y": 414, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 607, "y": 374, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 147, "y": 351, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 16, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 206, "y": 295, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 326, "y": 213, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 479, "y": 151, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 112, "y": 145, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 321, "y": 135, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 269, "y": 134, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 214, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 11, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 463, "y": 69, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 12, "w": 55, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 159, "y": 69, "w": 55, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 55, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 715, "y": 73, "w": 53, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 53, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 518, "y": 74, "w": 52, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 52, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 61, "y": 136, "w": 51, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 51, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 625, "y": 144, "w": 49, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 16, "w": 49, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 625, "y": 222, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 16, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 430, "y": 287, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 428, "y": 143, "w": 51, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 17, "w": 51, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 98, "y": 62, "w": 61, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 14, "w": 61, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 530, "y": 2, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 11, "w": 70, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 194, "y": 2, "w": 85, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 85, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 2, "y": 2, "w": 96, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 96, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 98, "y": 2, "w": 96, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 96, "h": 60 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 279, "y": 2, "w": 91, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 0, "w": 91, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 370, "y": 2, "w": 84, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 84, "h": 64 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 454, "y": 2, "w": 76, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 600, "y": 2, "w": 67, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 67, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 372, "y": 210, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 4, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 172, "y": 450, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 5, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0122.png", + "frame": { "x": 526, "y": 443, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 7, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0123.png", + "frame": { "x": 432, "y": 453, "w": 41, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 10, "w": 41, "h": 74 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0124.png", + "frame": { "x": 43, "y": 438, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 11, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0125.png", + "frame": { "x": 2, "y": 435, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 13, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0126.png", + "frame": { "x": 565, "y": 366, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 14, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0127.png", + "frame": { "x": 131, "y": 429, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 16, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0128.png", + "frame": { "x": 485, "y": 426, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 17, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0129.png", + "frame": { "x": 649, "y": 421, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0130.png", + "frame": { "x": 2, "y": 358, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0131.png", + "frame": { "x": 2, "y": 281, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0132.png", + "frame": { "x": 53, "y": 214, "w": 48, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 18, "w": 48, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0133.png", + "frame": { "x": 354, "y": 348, "w": 46, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 19, "w": 46, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0134.png", + "frame": { "x": 345, "y": 421, "w": 46, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 20, "w": 46, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0135.png", + "frame": { "x": 567, "y": 451, "w": 45, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 45, "h": 68 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0136.png", + "frame": { "x": 423, "y": 218, "w": 52, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 52, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0137.png", + "frame": { "x": 2, "y": 137, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 19, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0138.png", + "frame": { "x": 2, "y": 65, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 19, "w": 59, "h": 72 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0139.png", + "frame": { "x": 600, "y": 71, "w": 58, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 19, "w": 58, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0140.png", + "frame": { "x": 577, "y": 291, "w": 46, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 46, "h": 75 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0141.png", + "frame": { "x": 303, "y": 363, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0142.png", + "frame": { "x": 400, "y": 364, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0143.png", + "frame": { "x": 524, "y": 285, "w": 53, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 19, "w": 53, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0144.png", + "frame": { "x": 266, "y": 213, "w": 60, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 19, "w": 60, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0145.png", + "frame": { "x": 674, "y": 219, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 58, "h": 62 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0146.png", + "frame": { "x": 150, "y": 288, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 18, "w": 56, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0147.png", + "frame": { "x": 250, "y": 351, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 18, "w": 53, "h": 63 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0148.png", + "frame": { "x": 674, "y": 149, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 18, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0149.png", + "frame": { "x": 214, "y": 145, "w": 52, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 52, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0150.png", + "frame": { "x": 48, "y": 290, "w": 48, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 19, "w": 48, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0151.png", + "frame": { "x": 161, "y": 217, "w": 51, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 19, "w": 51, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0152.png", + "frame": { "x": 343, "y": 66, "w": 61, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 61, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0153.png", + "frame": { "x": 279, "y": 64, "w": 64, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 20, "w": 64, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0154.png", + "frame": { "x": 667, "y": 2, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 19, "w": 64, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0155.png", + "frame": { "x": 101, "y": 223, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 18, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0156.png", + "frame": { "x": 89, "y": 363, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0157.png", + "frame": { "x": 671, "y": 281, "w": 53, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 19, "w": 53, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0158.png", + "frame": { "x": 274, "y": 441, "w": 62, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 21, "w": 62, "h": 50 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0159.png", + "frame": { "x": 275, "y": 491, "w": 62, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 22, "w": 62, "h": 43 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0160.png", + "frame": { "x": 674, "y": 505, "w": 59, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 23, "w": 59, "h": 42 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0161.png", + "frame": { "x": 612, "y": 498, "w": 62, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 22, "w": 62, "h": 43 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0162.png", + "frame": { "x": 213, "y": 491, "w": 62, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 22, "w": 62, "h": 49 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0163.png", + "frame": { "x": 372, "y": 287, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 21, "w": 58, "h": 61 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0164.png", + "frame": { "x": 96, "y": 296, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 20, "w": 51, "h": 67 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0165.png", + "frame": { "x": 84, "y": 441, "w": 45, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 20, "w": 45, "h": 69 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0166.png", + "frame": { "x": 728, "y": 149, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 19, "w": 42, "h": 70 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0167.png", + "frame": { "x": 690, "y": 434, "w": 44, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 44, "h": 71 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0168.png", + "frame": { "x": 669, "y": 348, "w": 46, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 46, "h": 73 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0169.png", + "frame": { "x": 259, "y": 275, "w": 47, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 18, "w": 47, "h": 76 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0170.png", + "frame": { "x": 212, "y": 218, "w": 47, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 18, "w": 47, "h": 77 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0171.png", + "frame": { "x": 578, "y": 213, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 18, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + }, + { + "filename": "0172.png", + "frame": { "x": 724, "y": 281, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 18, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "707.png", + "format": "I8", + "size": { "w": 772, "h": 549 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/707.png b/public/images/pokemon/back/shiny/707.png index da84624a35c..8d7e5922091 100644 Binary files a/public/images/pokemon/back/shiny/707.png and b/public/images/pokemon/back/shiny/707.png differ diff --git a/public/images/pokemon/back/shiny/708.json b/public/images/pokemon/back/shiny/708.json index 1433d1f3954..22aa1885edb 100644 --- a/public/images/pokemon/back/shiny/708.json +++ b/public/images/pokemon/back/shiny/708.json @@ -1,41 +1,1091 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 43, - "h": 43 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ab46d1202eb640c4a791f5c8d9bd36ec:04314281a1a95837e11d92d38c448507:796c82c5076b122f2663381836c65843$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 132, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 176, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 218, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 262, "y": 206, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 9, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 44, "y": 207, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 131, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 208, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 85, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 130, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 86, "y": 84, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 174, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 0, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 218, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 88, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 132, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 43, "y": 43, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 42, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 132, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 44, "y": 0, "w": 43, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 43, "h": 42 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 264, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 88, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 176, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 220, "y": 0, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 43, "h": 41 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 44, "y": 125, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 132, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 88, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 175, "y": 206, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 10, "w": 42, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 88, "y": 247, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 13, "w": 42, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 132, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 14, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 176, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 15, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 220, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 17, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 264, "y": 165, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 19, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 262, "y": 124, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 21, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 44, "y": 166, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 23, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 0, "y": 167, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 21, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 88, "y": 206, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 20, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 220, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 44, "y": 247, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 16, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 218, "y": 246, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 262, "y": 246, "w": 43, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 43, "h": 39 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 177, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 264, "y": 83, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 43, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 222, "y": 42, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 67, "h": 63 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "708.png", + "format": "I8", + "size": { "w": 307, "h": 286 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/708.png b/public/images/pokemon/back/shiny/708.png index 51462cccc15..8a9ff2cb9ee 100644 Binary files a/public/images/pokemon/back/shiny/708.png and b/public/images/pokemon/back/shiny/708.png differ diff --git a/public/images/pokemon/back/shiny/714.json b/public/images/pokemon/back/shiny/714.json index 135bc02dbd5..abcb8902edd 100644 --- a/public/images/pokemon/back/shiny/714.json +++ b/public/images/pokemon/back/shiny/714.json @@ -1,41 +1,263 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 63, - "h": 63 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 63, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 63, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:11292bc220f23110a419628bee722abd:b42c1c416a6792bd1666ba41005a2f4d:1a07d46e710b0568ec824f54fbc4fe6a$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 66, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 198, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 64, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 124, "y": 120, "w": 34, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 34, "h": 65 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 1, "y": 178, "w": 34, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 3, "w": 34, "h": 60 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 264, "y": 61, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 131, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 198, "y": 60, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 64, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 160, "y": 120, "w": 34, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 3, "w": 34, "h": 65 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 196, "y": 178, "w": 34, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 34, "h": 60 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 1, "y": 120, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 66, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 64, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 50, "y": 120, "w": 35, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 2, "w": 35, "h": 66 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 245, "y": 120, "w": 35, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 35, "h": 61 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 264, "y": 1, "w": 47, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 47, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 61, "w": 63, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 63, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 133, "y": 1, "w": 63, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 63, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 67, "y": 1, "w": 64, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 64, "h": 58 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 87, "y": 120, "w": 35, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 35, "h": 66 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 282, "y": 120, "w": 34, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 34, "h": 61 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 1, "y": 120, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 196, "y": 119, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 68, "h": 68 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "714.png", + "format": "I8", + "size": { "w": 317, "h": 239 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/714.png b/public/images/pokemon/back/shiny/714.png index 65433cec665..e1e5d5dbec7 100644 Binary files a/public/images/pokemon/back/shiny/714.png and b/public/images/pokemon/back/shiny/714.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/718-10.json b/public/images/pokemon/back/shiny/718-10.json index 032783b5555..75053d61900 100644 --- a/public/images/pokemon/back/shiny/718-10.json +++ b/public/images/pokemon/back/shiny/718-10.json @@ -1,41 +1,686 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 65, - "h": 65 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 59, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 59, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 59, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c99dd53bf67561425f9faac1002806d0:277725239a09766c1d58b4a0f8c45775:82195cf2a6db620c5643b8162d6e8c5c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 179, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 293, "y": 128, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 131, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 120, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 181, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 242, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 303, "y": 0, "w": 61, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 61, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 232, "y": 190, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 292, "y": 191, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 60, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 60, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 60, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 238, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 297, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 120, "y": 63, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 194, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 59, "y": 194, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 56, "y": 319, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 59, "h": 63 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 117, "y": 259, "w": 60, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 62 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 177, "y": 320, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 61 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 232, "y": 128, "w": 61, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 61, "h": 62 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 56, "y": 258, "w": 61, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 61, "h": 61 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 118, "y": 195, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 59, "h": 64 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 115, "y": 321, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 55, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 237, "y": 321, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 55, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 234, "y": 253, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 290, "y": 254, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 258, "w": 56, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 175, "y": 128, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 57, "h": 67 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 177, "y": 253, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 57, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 59, "y": 65, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 117, "y": 128, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 66 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 65, "w": 59, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 65 }, + "sourceSize": { "w": 64, "h": 67 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718-10.png", + "format": "I8", + "size": { "w": 364, "h": 387 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/718-10.png b/public/images/pokemon/back/shiny/718-10.png index 0479543fc7a..7998912c001 100644 Binary files a/public/images/pokemon/back/shiny/718-10.png and b/public/images/pokemon/back/shiny/718-10.png differ diff --git a/public/images/pokemon/back/shiny/718.json b/public/images/pokemon/back/shiny/718.json index 4badc82d015..1a835e26b08 100644 --- a/public/images/pokemon/back/shiny/718.json +++ b/public/images/pokemon/back/shiny/718.json @@ -1,41 +1,803 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 88, - "h": 88 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f2bba9e481cf6dfcc460f398fd1af964:386098c871ad5fe384af5f85559e7551:7b4a06b06cbac24b3f39727b0238661b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 148, "y": 445, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 71, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 445, "y": 445, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 72, "y": 446, "w": 70, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 70, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 373, "y": 360, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 226, "y": 355, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 184, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 150, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 304, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 459, "y": 269, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 76, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 308, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 462, "y": 180, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 386, "y": 91, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 75, "y": 270, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 75, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 150, "y": 357, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 74, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 75, "y": 358, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 224, "y": 443, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 359, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 72, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 300, "y": 357, "w": 73, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 73, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 380, "y": 271, "w": 74, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 74, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 384, "y": 181, "w": 75, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 75, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 155, "y": 92, "w": 76, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 76, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 309, "y": 91, "w": 77, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 77, "h": 89 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 227, "y": 268, "w": 77, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 77, "h": 87 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 150, "y": 182, "w": 77, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 77, "h": 87 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 272, "w": 75, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 75, "h": 87 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 310, "y": 0, "w": 77, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 77, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 387, "y": 0, "w": 77, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 77, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 155, "y": 0, "w": 77, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 77, "h": 92 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 77, "y": 0, "w": 78, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 78, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 77, "h": 93 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 231, "y": 180, "w": 77, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 77, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 232, "y": 0, "w": 78, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 77, "y": 91, "w": 78, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 78, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 464, "y": 0, "w": 77, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 232, "y": 90, "w": 77, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 77, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 464, "y": 90, "w": 77, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 77, "h": 90 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 93, "w": 75, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 75, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 75, "y": 179, "w": 75, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 75, "h": 91 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 454, "y": 357, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 73, "h": 88 }, + "sourceSize": { "w": 87, "h": 93 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718.png", + "format": "I8", + "size": { "w": 541, "h": 534 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/718.png b/public/images/pokemon/back/shiny/718.png index 4492fbd3b22..bb8d4179347 100644 Binary files a/public/images/pokemon/back/shiny/718.png and b/public/images/pokemon/back/shiny/718.png differ diff --git a/public/images/pokemon/back/shiny/719.json b/public/images/pokemon/back/shiny/719.json index 8cb7bee25c3..f7fa0ccb512 100644 --- a/public/images/pokemon/back/shiny/719.json +++ b/public/images/pokemon/back/shiny/719.json @@ -1,41 +1,875 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 65, - "h": 65 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0340084a126284b9d4aa16b7bbdc9616:f699a390d9b5db64f5f03e684cf77f66:17a705bb924916761be2495822a53735$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 168, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 80, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 119, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 40, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 80, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 125, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 210, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 168, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 80, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 119, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 40, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 80, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 125, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 210, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 168, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 80, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 119, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 40, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 80, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 125, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 210, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 168, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 80, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 119, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 40, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 80, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 125, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 210, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 70, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 120, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 160, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 158, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 280, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 112, "y": 350, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 0, "w": 37, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 38, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 156, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 197, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 200, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 207, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 42, "y": 70, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 84, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 210, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 39, "y": 280, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 78, "y": 280, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 350, "w": 38, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 38, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 75, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 194, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 117, "y": 280, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 40, "y": 210, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 166, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 70, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 120, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 160, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 158, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 280, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 112, "y": 350, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 0, "w": 37, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 38, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 156, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 197, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 200, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 207, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 42, "y": 70, "w": 42, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 42, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 84, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 210, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 39, "y": 280, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 78, "y": 280, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 350, "w": 38, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 38, "h": 69 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 75, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 194, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 117, "y": 280, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 40, "y": 210, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 40, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 166, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 41, "h": 70 }, + "sourceSize": { "w": 61, "h": 80 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "719.png", + "format": "I8", + "size": { "w": 252, "h": 420 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/719.png b/public/images/pokemon/back/shiny/719.png index a0b34f5bcca..6e76d35bc93 100644 Binary files a/public/images/pokemon/back/shiny/719.png and b/public/images/pokemon/back/shiny/719.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/881.png b/public/images/pokemon/back/shiny/881.png index 3686b34dd99..4dc11742548 100644 Binary files a/public/images/pokemon/back/shiny/881.png and b/public/images/pokemon/back/shiny/881.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/944.png b/public/images/pokemon/back/shiny/944.png index 24957073d46..a33c2a39c2f 100644 Binary files a/public/images/pokemon/back/shiny/944.png and b/public/images/pokemon/back/shiny/944.png differ diff --git a/public/images/pokemon/back/shiny/945.png b/public/images/pokemon/back/shiny/945.png index a1cc685f008..38be3590480 100644 Binary files a/public/images/pokemon/back/shiny/945.png and b/public/images/pokemon/back/shiny/945.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/987.png b/public/images/pokemon/back/shiny/987.png index 8022d2f900a..8c4c0c8b62a 100644 Binary files a/public/images/pokemon/back/shiny/987.png and b/public/images/pokemon/back/shiny/987.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/3.png b/public/images/pokemon/back/shiny/female/3.png index 706a6c33f14..dff72d5b6e5 100644 Binary files a/public/images/pokemon/back/shiny/female/3.png and b/public/images/pokemon/back/shiny/female/3.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/2026.png b/public/images/pokemon/exp/2026.png index 80ac591cd62..718fb8957b3 100644 Binary files a/public/images/pokemon/exp/2026.png and b/public/images/pokemon/exp/2026.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/248-mega.json b/public/images/pokemon/exp/248-mega.json index 42e7e9f7d6d..2c9370cbeee 100644 --- a/public/images/pokemon/exp/248-mega.json +++ b/public/images/pokemon/exp/248-mega.json @@ -1,272 +1,929 @@ -{ - "textures": [ - { - "image": "248-mega.png", - "format": "RGBA8888", - "size": { - "w": 271, - "h": 271 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 91, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 91, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 91, - "h": 85 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 91, - "h": 85 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 170, - "w": 91, - "h": 85 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 170, - "w": 91, - "h": 85 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 91, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 91, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 181, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 84 - }, - "frame": { - "x": 91, - "y": 170, - "w": 90, - "h": 84 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cde8b160e19f5e22098d0c8712fe3e26:5bade20a2d91d5c0e3de833bedccd3cb:90df97eb431b7162252516cb937a0b9e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 184, "y": 176, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 184, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 374, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 182, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 549, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 89, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 182, "y": 512, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 273, "y": 513, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 456, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 547, "y": 512, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 274, "y": 431, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 91, "y": 430, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 275, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 91, "y": 347, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 369, "y": 345, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 184, "y": 176, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 184, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 374, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 182, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 549, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 89, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 182, "y": 512, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 273, "y": 513, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 456, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 547, "y": 512, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 274, "y": 431, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 91, "y": 430, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 275, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 91, "y": 347, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 369, "y": 345, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 184, "y": 176, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 184, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 374, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 182, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 549, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 89, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 182, "y": 512, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 273, "y": 513, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 456, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 547, "y": 512, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 274, "y": 431, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 91, "y": 430, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 275, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 91, "y": 347, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 369, "y": 345, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 184, "y": 176, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 184, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 374, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 182, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 549, "y": 430, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 89, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 182, "y": 512, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 513, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 456, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 547, "y": 512, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 274, "y": 431, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 91, "y": 430, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 275, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 91, "y": 347, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 369, "y": 345, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 92, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 92, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 184, "y": 345, "w": 89, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 89, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 278, "y": 263, "w": 89, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 89, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 468, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 549, "y": 346, "w": 89, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 89, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 347, "w": 89, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 89, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 431, "w": 87, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 87, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 367, "y": 429, "w": 87, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 87, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 461, "y": 346, "w": 86, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 86, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 283, "y": 175, "w": 89, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 89, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 189, "y": 88, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 0, "w": 93, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 93, "h": 87 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 380, "y": 0, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 95, "y": 88, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 474, "y": 0, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 190, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 95, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 285, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 378, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 283, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 473, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 89, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 374, "y": 175, "w": 91, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "248-mega.png", + "format": "I8", + "size": { "w": 651, "h": 593 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/248-mega.png b/public/images/pokemon/exp/248-mega.png index b7563738d3d..167b88b09e5 100644 Binary files a/public/images/pokemon/exp/248-mega.png and b/public/images/pokemon/exp/248-mega.png differ diff --git a/public/images/pokemon/exp/359-mega.png b/public/images/pokemon/exp/359-mega.png index 8b6d0dd2b4a..10787a35a8b 100644 Binary files a/public/images/pokemon/exp/359-mega.png and b/public/images/pokemon/exp/359-mega.png differ diff --git a/public/images/pokemon/exp/362-mega.json b/public/images/pokemon/exp/362-mega.json index 05497f4ce7e..c69ecfb1903 100644 --- a/public/images/pokemon/exp/362-mega.json +++ b/public/images/pokemon/exp/362-mega.json @@ -1,272 +1,551 @@ -{ - "textures": [ - { - "image": "362-mega.png", - "format": "RGBA8888", - "size": { - "w": 174, - "h": 174 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 72 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 72 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 72 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 72 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 71 - }, - "frame": { - "x": 0, - "y": 72, - "w": 58, - "h": 71 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 71 - }, - "frame": { - "x": 0, - "y": 72, - "w": 58, - "h": 71 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 71 - }, - "frame": { - "x": 0, - "y": 72, - "w": 58, - "h": 71 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 58, - "h": 71 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 71 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 58, - "h": 71 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 71 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 71 - }, - "frame": { - "x": 116, - "y": 0, - "w": 58, - "h": 71 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 70 - }, - "frame": { - "x": 58, - "y": 71, - "w": 58, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 70 - }, - "frame": { - "x": 58, - "y": 71, - "w": 58, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:06afd89cf806f88f8f27098b432ad2cd:96be21e5293fd792149dc4962c63b26d:8a7271a5423838c97ddeb1e6dc343255$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 11, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 14, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 16, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 18, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 15, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 13, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 11, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 14, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 16, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 18, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 15, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 13, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 11, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 14, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 16, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 18, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 15, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 13, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "362-mega.png", + "format": "I8", + "size": { "w": 122, "h": 134 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/362-mega.png b/public/images/pokemon/exp/362-mega.png index 76464e38a4c..be87d172e8e 100644 Binary files a/public/images/pokemon/exp/362-mega.png and b/public/images/pokemon/exp/362-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/484-origin.json b/public/images/pokemon/exp/484-origin.json index f52359c264a..2b63fdd6785 100644 --- a/public/images/pokemon/exp/484-origin.json +++ b/public/images/pokemon/exp/484-origin.json @@ -4,8 +4,8 @@ "image": "484-origin.png", "format": "RGBA8888", "size": { - "w": 426, - "h": 426 + "w": 274, + "h": 274 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -35,20 +35,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -56,20 +56,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -77,20 +77,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -98,20 +98,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -119,146 +119,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, "w": 91, - "h": 97 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 97 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 + "h": 95 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 92, - "h": 96 - }, - "frame": { - "x": 91, - "y": 0, - "w": 92, - "h": 96 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 92, - "h": 96 - }, - "frame": { - "x": 91, - "y": 0, - "w": 92, - "h": 96 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, "y": 0, "w": 90, - "h": 97 + "h": 95 }, "frame": { "x": 0, - "y": 97, - "w": 90, - "h": 97 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, "y": 0, "w": 90, - "h": 97 - }, - "frame": { - "x": 0, - "y": 97, - "w": 90, - "h": 97 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 96, - "h": 90 - }, - "frame": { - "x": 183, - "y": 0, - "w": 96, - "h": 90 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 96, - "h": 90 - }, - "frame": { - "x": 183, - "y": 0, - "w": 96, - "h": 90 + "h": 95 } }, { @@ -266,20 +140,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -287,20 +161,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -308,20 +182,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -329,20 +203,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -350,20 +224,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -371,20 +245,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -392,20 +266,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -413,20 +287,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -434,20 +308,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -455,20 +329,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -476,20 +350,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -497,272 +371,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 90, + "w": 91, "h": 95 }, - "frame": { + "spriteSourceSize": { "x": 0, - "y": 194, - "w": 90, - "h": 95 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 90, - "h": 95 - }, - "frame": { - "x": 0, - "y": 194, - "w": 90, - "h": 95 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 7, "y": 1, - "w": 89, - "h": 95 + "w": 90, + "h": 94 }, "frame": { "x": 0, - "y": 289, - "w": 89, - "h": 95 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 89, - "h": 95 - }, - "frame": { - "x": 0, - "y": 289, - "w": 89, - "h": 95 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 92, - "h": 92 - }, - "frame": { - "x": 279, - "y": 0, - "w": 92, - "h": 92 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 92, - "h": 92 - }, - "frame": { - "x": 279, - "y": 0, - "w": 92, - "h": 92 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 + "y": 95, + "w": 90, + "h": 94 } }, { @@ -770,20 +392,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -791,20 +413,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -812,20 +434,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -833,20 +455,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -854,20 +476,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -875,20 +497,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -896,20 +518,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -917,20 +539,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -938,20 +560,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -959,20 +581,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -980,20 +602,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -1001,272 +623,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, "w": 91, - "h": 92 + "h": 95 }, - "frame": { - "x": 275, - "y": 92, + "spriteSourceSize": { + "x": 0, + "y": 4, "w": 91, - "h": 92 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 + "h": 91 }, "frame": { "x": 90, - "y": 97, - "w": 89, - "h": 93 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 90, - "y": 97, - "w": 89, - "h": 93 + "y": 0, + "w": 91, + "h": 91 } }, { @@ -1274,20 +644,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1295,20 +665,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1316,20 +686,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1337,20 +707,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1358,20 +728,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1379,20 +749,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1400,20 +770,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1421,20 +791,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1442,20 +812,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1463,20 +833,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1484,20 +854,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1505,19 +875,229 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, + "h": 91 + }, + "frame": { + "x": 181, + "y": 0, + "w": 90, + "h": 91 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, "h": 92 }, "frame": { "x": 90, - "y": 190, - "w": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, "h": 92 } }, @@ -1526,20 +1106,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1547,20 +1127,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1568,20 +1148,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1589,20 +1169,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1610,20 +1190,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1631,20 +1211,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1652,20 +1232,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1673,20 +1253,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1694,20 +1274,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1715,20 +1295,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1736,20 +1316,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1757,62 +1337,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, + "w": 89, + "h": 91 + }, + "frame": { + "x": 90, + "y": 183, + "w": 89, + "h": 91 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, "w": 89, "h": 92 }, "frame": { - "x": 180, - "y": 182, + "x": 179, + "y": 91, "w": 89, "h": 92 } }, { - "filename": "0077.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 90, - "h": 90 + "x": 2, + "y": 3, + "w": 89, + "h": 92 }, "frame": { - "x": 269, - "y": 184, - "w": 90, - "h": 90 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 90, - "h": 90 - }, - "frame": { - "x": 269, - "y": 184, - "w": 90, - "h": 90 + "x": 179, + "y": 91, + "w": 89, + "h": 92 } }, { @@ -1820,20 +1400,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1841,20 +1421,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1862,20 +1442,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1883,20 +1463,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1904,20 +1484,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1925,608 +1505,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 79, - "h": 86 - }, - "frame": { - "x": 268, - "y": 274, - "w": 79, - "h": 86 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 79, - "h": 86 - }, - "frame": { - "x": 268, - "y": 274, - "w": 79, - "h": 86 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 79, - "h": 83 - }, - "frame": { - "x": 347, - "y": 274, - "w": 79, - "h": 83 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 359, - "y": 184, - "w": 59, - "h": 70 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 359, - "y": 184, - "w": 59, - "h": 70 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 35, - "y": 23, - "w": 27, - "h": 33 - }, - "frame": { - "x": 0, - "y": 384, - "w": 27, - "h": 33 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 35, - "y": 23, - "w": 27, - "h": 33 - }, - "frame": { - "x": 371, - "y": 54, - "w": 27, - "h": 33 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 26, - "w": 19, - "h": 23 - }, - "frame": { - "x": 27, - "y": 384, - "w": 19, - "h": 23 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 26, - "w": 19, - "h": 23 - }, - "frame": { - "x": 27, - "y": 384, - "w": 19, - "h": 23 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 35, - "w": 14, - "h": 10 - }, - "frame": { - "x": 359, - "y": 254, - "w": 14, - "h": 10 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 35, - "w": 14, - "h": 10 - }, - "frame": { - "x": 359, - "y": 254, - "w": 14, - "h": 10 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } } ] @@ -2535,6 +1527,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:52f94c22e7d6d2608638048866c1910a:045ab453153e084bad1f17ca61076c30:5ea3e660bc9c2624f846675d5196db82$" + "smartupdate": "$TexturePacker:SmartUpdate:4eec21f441df8c5ce7313596a1672a9e:bec666304c4bb8072e19fa13a830a7c8:5ea3e660bc9c2624f846675d5196db82$" } } diff --git a/public/images/pokemon/exp/484-origin.png b/public/images/pokemon/exp/484-origin.png index dbd6db55f78..2d8d0fde472 100644 Binary files a/public/images/pokemon/exp/484-origin.png and b/public/images/pokemon/exp/484-origin.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/569-gigantamax.json b/public/images/pokemon/exp/569-gigantamax.json new file mode 100644 index 00000000000..6cda2b0d79a --- /dev/null +++ b/public/images/pokemon/exp/569-gigantamax.json @@ -0,0 +1,1478 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0008.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0009.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0010.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0011.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0012.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0013.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0014.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0015.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0027.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0028.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0029.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0030.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0031.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0032.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0033.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0034.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0043.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0044.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0045.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0046.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0047.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0048.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0049.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0050.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0051.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0061.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0062.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0063.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0064.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0065.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0066.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0067.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0068.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0069.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0073.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0074.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0075.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0076.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0077.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0078.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0079.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0080.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0081.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0082.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0083.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0084.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0085.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0086.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0087.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0088.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0089.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0090.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0091.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0092.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0093.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0094.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0103.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0104.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0105.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0106.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0107.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0108.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0109.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0110.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0111.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0112.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0117.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0118.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0119.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0121.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0122.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0123.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0124.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0125.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0126.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0127.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0128.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0129.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0131.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0132.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0133.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0134.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0135.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0136.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0137.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0138.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0139.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0140.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0141.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0142.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0143.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0144.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0145.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0146.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0147.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0149.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0152.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0153.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0154.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0155.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0156.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0157.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0158.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0159.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0160.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0161.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0162.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0163.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "569-gigantamax.png", + "format": "I8", + "size": { "w": 419, "h": 261 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/569-gigantamax.png b/public/images/pokemon/exp/569-gigantamax.png new file mode 100644 index 00000000000..90decc0ad84 Binary files /dev/null and b/public/images/pokemon/exp/569-gigantamax.png differ diff --git a/public/images/pokemon/exp/6503.png b/public/images/pokemon/exp/6503.png index 28d3a366fef..d1a698254cb 100644 Binary files a/public/images/pokemon/exp/6503.png and b/public/images/pokemon/exp/6503.png differ diff --git a/public/images/pokemon/exp/651.json b/public/images/pokemon/exp/651.json index 5db25b75d8e..20bdccd5bd4 100644 --- a/public/images/pokemon/exp/651.json +++ b/public/images/pokemon/exp/651.json @@ -1,188 +1,713 @@ -{ - "textures": [ - { - "image": "651.png", - "format": "RGBA8888", - "size": { - "w": 116, - "h": 116 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 58, - "h": 53 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 52 - }, - "frame": { - "x": 58, - "y": 53, - "w": 58, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 52 - }, - "frame": { - "x": 58, - "y": 53, - "w": 58, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d110ead01ff70d3da8dfb432dfe00ac0:207046ea51a1627a342c2b30f969868e:a93e5fa02e10bf11e3ed8bf6571835ca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 239, "y": 0, "w": 57, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 60, "y": 0, "w": 58, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 355, "y": 0, "w": 58, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 58, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 59, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 119, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 59, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 179, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 59, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 297, "y": 0, "w": 57, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 101, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 203, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 329, "y": 252, "w": 51, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 47 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 109, "y": 252, "w": 51, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 219, "y": 204, "w": 52, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 52, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 166, "y": 202, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 52, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 275, "y": 203, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 54, "y": 204, "w": 54, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 54, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 333, "y": 202, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 110, "y": 202, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 55, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "651.png", + "format": "I8", + "size": { "w": 413, "h": 300 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/651.png b/public/images/pokemon/exp/651.png index 42a1af8184d..633a3cc0c75 100644 Binary files a/public/images/pokemon/exp/651.png and b/public/images/pokemon/exp/651.png differ diff --git a/public/images/pokemon/exp/653.json b/public/images/pokemon/exp/653.json index 19654fbb3cb..a08242f32cf 100644 --- a/public/images/pokemon/exp/653.json +++ b/public/images/pokemon/exp/653.json @@ -1,1553 +1,947 @@ -{ - "textures": [ - { - "image": "653.png", - "format": "RGBA8888", - "size": { - "w": 180, - "h": 180 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 47, - "y": 136, - "w": 47, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 133, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 133, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 43, - "h": 47 - }, - "frame": { - "x": 94, - "y": 98, - "w": 43, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 43, - "h": 47 - }, - "frame": { - "x": 94, - "y": 98, - "w": 43, - "h": 47 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 46 - }, - "frame": { - "x": 137, - "y": 98, - "w": 43, - "h": 46 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 46 - }, - "frame": { - "x": 137, - "y": 98, - "w": 43, - "h": 46 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 46 - }, - "frame": { - "x": 137, - "y": 98, - "w": 43, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3f19f65b0cc7eac6c736e7e4bd91d830:87ecb6f1ef5612019ef73bbf8249079d:a7be961d0230f568aff23d95e7ff0036$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 42, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 42, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 83, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 83, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 124, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 124, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "653.png", + "format": "I8", + "size": { "w": 168, "h": 175 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/653.png b/public/images/pokemon/exp/653.png index cf42c8754bc..66e359173aa 100644 Binary files a/public/images/pokemon/exp/653.png and b/public/images/pokemon/exp/653.png differ diff --git a/public/images/pokemon/exp/654.json b/public/images/pokemon/exp/654.json index a7f07f56864..74019f665ec 100644 --- a/public/images/pokemon/exp/654.json +++ b/public/images/pokemon/exp/654.json @@ -1,818 +1,695 @@ -{ - "textures": [ - { - "image": "654.png", - "format": "RGBA8888", - "size": { - "w": 390, - "h": 390 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 81, - "w": 47, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 162, - "w": 47, - "h": 81 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 47, - "h": 80 - }, - "frame": { - "x": 0, - "y": 243, - "w": 47, - "h": 80 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 0, - "w": 46, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 81, - "w": 46, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 162, - "w": 46, - "h": 81 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 80 - }, - "frame": { - "x": 47, - "y": 243, - "w": 46, - "h": 80 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 0, - "w": 46, - "h": 79 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 79, - "w": 46, - "h": 79 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 158, - "w": 46, - "h": 79 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 237, - "w": 46, - "h": 79 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 46, - "h": 74 - }, - "frame": { - "x": 93, - "y": 316, - "w": 46, - "h": 74 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 139, - "y": 0, - "w": 46, - "h": 79 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 80 - }, - "frame": { - "x": 139, - "y": 79, - "w": 45, - "h": 80 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 80 - }, - "frame": { - "x": 139, - "y": 159, - "w": 45, - "h": 80 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 46, - "h": 78 - }, - "frame": { - "x": 139, - "y": 239, - "w": 46, - "h": 78 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 46, - "h": 73 - }, - "frame": { - "x": 139, - "y": 317, - "w": 46, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 184, - "y": 79, - "w": 45, - "h": 79 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 185, - "y": 0, - "w": 45, - "h": 79 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 184, - "y": 158, - "w": 45, - "h": 79 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 185, - "y": 237, - "w": 45, - "h": 79 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 46, - "h": 74 - }, - "frame": { - "x": 185, - "y": 316, - "w": 46, - "h": 74 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 229, - "y": 79, - "w": 45, - "h": 79 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 230, - "y": 0, - "w": 45, - "h": 79 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 229, - "y": 158, - "w": 45, - "h": 79 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 230, - "y": 237, - "w": 45, - "h": 79 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 46, - "h": 73 - }, - "frame": { - "x": 231, - "y": 316, - "w": 46, - "h": 73 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 46, - "h": 77 - }, - "frame": { - "x": 274, - "y": 79, - "w": 46, - "h": 77 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 47, - "h": 75 - }, - "frame": { - "x": 275, - "y": 0, - "w": 47, - "h": 75 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 78 - }, - "frame": { - "x": 274, - "y": 156, - "w": 45, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 45, - "h": 78 - }, - "frame": { - "x": 275, - "y": 234, - "w": 45, - "h": 78 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 46, - "h": 76 - }, - "frame": { - "x": 319, - "y": 156, - "w": 46, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 45, - "h": 77 - }, - "frame": { - "x": 320, - "y": 75, - "w": 45, - "h": 77 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 46, - "h": 75 - }, - "frame": { - "x": 322, - "y": 0, - "w": 46, - "h": 75 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 46, - "h": 75 - }, - "frame": { - "x": 277, - "y": 312, - "w": 46, - "h": 75 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 45, - "h": 76 - }, - "frame": { - "x": 320, - "y": 232, - "w": 45, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 45, - "h": 76 - }, - "frame": { - "x": 323, - "y": 308, - "w": 45, - "h": 76 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6cb9cd08a225d9ce5a32640f2a1a4760:ab52583219972dae47f87bdaf152d0c0:1977f50e1ab8a3304ceeb59ee1aa2ba9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 152, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 164, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 117, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 172, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 213, "y": 265, "w": 51, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 282, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 173, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 60, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 110, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 165, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 282, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 55, "y": 133, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 220, "y": 134, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 54, "y": 198, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 218, "y": 199, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 271, "y": 261, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 51, "y": 264, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "654.png", + "format": "I8", + "size": { "w": 337, "h": 393 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/654.png b/public/images/pokemon/exp/654.png index 31d16e68e48..b1101648416 100644 Binary files a/public/images/pokemon/exp/654.png and b/public/images/pokemon/exp/654.png differ diff --git a/public/images/pokemon/exp/656.json b/public/images/pokemon/exp/656.json index 71ebaea1efb..3c2051bfe3a 100644 --- a/public/images/pokemon/exp/656.json +++ b/public/images/pokemon/exp/656.json @@ -1,671 +1,713 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 96, - "h": 96 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5f39528f34681b7e85d5ea8d96776a2d:75313d84bbb64652e1825fbfbea72872:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 98, "y": 116, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 200 + }, + { + "filename": "0057.png", + "frame": { "x": 129, "y": 1, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 31, "h": 38 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 30, "h": 41 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 33, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 30, "h": 41 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 65, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 30, "h": 41 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 97, "y": 1, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 30, "h": 40 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 162, "y": 1, "w": 30, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 30, "h": 39 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 67, "y": 81, "w": 29, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 29, "h": 38 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 164, "y": 148, "w": 29, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 29, "h": 37 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 35, "y": 81, "w": 30, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 30, "h": 37 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 69, "y": 152, "w": 33, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 14, "w": 33, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 104, "y": 185, "w": 34, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 16, "w": 34, "h": 30 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 68, "y": 186, "w": 34, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 17, "w": 34, "h": 29 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 157, "w": 33, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 14, "w": 33, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 137, "y": 112, "w": 33, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 33, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 750 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 44, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 132, "y": 147, "w": 30, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 30, "h": 36 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 36, "y": 157, "w": 30, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 30, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 35, "y": 121, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 35, "y": 44, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 69, "y": 44, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 103, "y": 79, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 240, "h": 216 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/656.png b/public/images/pokemon/exp/656.png index 4f4af590a45..cc85a92ecbb 100644 Binary files a/public/images/pokemon/exp/656.png and b/public/images/pokemon/exp/656.png differ diff --git a/public/images/pokemon/exp/657.png b/public/images/pokemon/exp/657.png index 6cfff5af3f7..404fb30a2b2 100644 Binary files a/public/images/pokemon/exp/657.png and b/public/images/pokemon/exp/657.png differ diff --git a/public/images/pokemon/exp/658-ash.json b/public/images/pokemon/exp/658-ash.json index f3a02cb1774..52dbac8366a 100644 --- a/public/images/pokemon/exp/658-ash.json +++ b/public/images/pokemon/exp/658-ash.json @@ -1,671 +1,299 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cfb009f1af61ea752bdb3266bffd0fd0:e1abe8d09d1fe3c1ec758293b0a4bed5:f09eeed5adc5ec50aec50218e03662c2$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658-ash.png", + "format": "I8", + "size": { "w": 237, "h": 148 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/658-ash.png b/public/images/pokemon/exp/658-ash.png index 5d80ca1ad0e..ced4cbcec71 100644 Binary files a/public/images/pokemon/exp/658-ash.png and b/public/images/pokemon/exp/658-ash.png differ diff --git a/public/images/pokemon/exp/658.png b/public/images/pokemon/exp/658.png index ab2e30592f6..83b2f5fab89 100644 Binary files a/public/images/pokemon/exp/658.png and b/public/images/pokemon/exp/658.png differ diff --git a/public/images/pokemon/exp/661.json b/public/images/pokemon/exp/661.json index f01755ccdc0..74bcbcb06a0 100644 --- a/public/images/pokemon/exp/661.json +++ b/public/images/pokemon/exp/661.json @@ -1,356 +1,397 @@ -{ - "textures": [ - { - "image": "661.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 35, - "w": 32, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7dcd93b1058cdbc2640b9885ceb2e854:a2e65850e27a715b371214cfcc8954f8:186d621a544ea0e0e2e0bd57975a29b1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0002.png", + "frame": { "x": 32, "y": 113, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0003.png", + "frame": { "x": 34, "y": 36, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0005.png", + "frame": { "x": 32, "y": 75, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 114, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0009.png", + "frame": { "x": 69, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0010.png", + "frame": { "x": 64, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0012.png", + "frame": { "x": 32, "y": 113, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0013.png", + "frame": { "x": 34, "y": 36, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 0, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0015.png", + "frame": { "x": 32, "y": 75, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 114, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0019.png", + "frame": { "x": 69, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0020.png", + "frame": { "x": 64, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0022.png", + "frame": { "x": 32, "y": 113, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0023.png", + "frame": { "x": 34, "y": 36, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 0, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0025.png", + "frame": { "x": 32, "y": 75, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 114, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0029.png", + "frame": { "x": 69, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0030.png", + "frame": { "x": 64, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 38, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0032.png", + "frame": { "x": 66, "y": 37, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0033.png", + "frame": { "x": 66, "y": 37, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0034.png", + "frame": { "x": 96, "y": 76, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0035.png", + "frame": { "x": 103, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0036.png", + "frame": { "x": 34, "y": 0, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0037.png", + "frame": { "x": 103, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0038.png", + "frame": { "x": 34, "y": 0, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0039.png", + "frame": { "x": 103, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0040.png", + "frame": { "x": 34, "y": 0, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0041.png", + "frame": { "x": 103, "y": 0, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0042.png", + "frame": { "x": 98, "y": 37, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0043.png", + "frame": { "x": 66, "y": 37, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 137, "h": 152 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/661.png b/public/images/pokemon/exp/661.png index 52e31c9ec73..ebc25efa895 100644 Binary files a/public/images/pokemon/exp/661.png and b/public/images/pokemon/exp/661.png differ diff --git a/public/images/pokemon/exp/662.json b/public/images/pokemon/exp/662.json index a5fb9d1a87c..3600bbcd38d 100644 --- a/public/images/pokemon/exp/662.json +++ b/public/images/pokemon/exp/662.json @@ -1,776 +1,254 @@ -{ - "textures": [ - { - "image": "662.png", - "format": "RGBA8888", - "size": { - "w": 167, - "h": 167 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 52, - "w": 56, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 52, - "w": 56, - "h": 44 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 96, - "w": 56, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 96, - "w": 56, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fdd7a1bbdeb9b06a84c6e230eaa36b6e:73c8c872230bd4fc874bce8a02ada9b0:e3da2dd0277c18bcc713dc6dd2460c87$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 221, "y": 131, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 57, "h": 61 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 113, "y": 70, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 19, "w": 56, "h": 63 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 335, "y": 136, "w": 49, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 36, "w": 49, "h": 50 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 105, "y": 197, "w": 63, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 33, "w": 63, "h": 51 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 1, "y": 1, "w": 59, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 16, "w": 59, "h": 66 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 119, "y": 1, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 56, "h": 68 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 233, "y": 1, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 54, "h": 70 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 176, "y": 1, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 56, "h": 68 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 288, "y": 1, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 20, "w": 59, "h": 64 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 338, "y": 187, "w": 47, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 30, "w": 47, "h": 48 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 66, "y": 249, "w": 62, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 26, "w": 62, "h": 49 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 68, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 58, "h": 64 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 169, "y": 141, "w": 47, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 17, "w": 47, "h": 49 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 275, "y": 198, "w": 62, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 12, "w": 62, "h": 50 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 61, "y": 1, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 57, "h": 67 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 288, "y": 66, "w": 54, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 54, "h": 69 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 60, "y": 69, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 52, "h": 71 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 170, "y": 70, "w": 50, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 50, "h": 70 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 1, "y": 133, "w": 49, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 49, "h": 70 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 275, "y": 249, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 30, "w": 56, "h": 49 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 1, "y": 205, "w": 64, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 27, "w": 64, "h": 48 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 221, "y": 72, "w": 60, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 60, "h": 58 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 113, "y": 134, "w": 55, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 55, "h": 62 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 223, "y": 193, "w": 51, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 51, "h": 64 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 51, "y": 141, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 53, "h": 63 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 169, "y": 193, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 53, "h": 63 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 279, "y": 136, "w": 55, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 55, "h": 61 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "662.png", + "format": "I8", + "size": { "w": 386, "h": 299 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/662.png b/public/images/pokemon/exp/662.png index 090e6e4c91f..be3e0170e73 100644 Binary files a/public/images/pokemon/exp/662.png and b/public/images/pokemon/exp/662.png differ diff --git a/public/images/pokemon/exp/663.json b/public/images/pokemon/exp/663.json index 7d61c15fd97..8c4ef182132 100644 --- a/public/images/pokemon/exp/663.json +++ b/public/images/pokemon/exp/663.json @@ -1,1700 +1,731 @@ -{ - "textures": [ - { - "image": "663.png", - "format": "RGBA8888", - "size": { - "w": 295, - "h": 295 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:df66b59e88a0e2316e65cc2931e2d45a:38fe3e789df33d7d1b51b40128b5adaa:3790d8d72a704a789cc594688d98802e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0002.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0003.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0004.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0006.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0007.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0009.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0010.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0012.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0013.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0014.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0016.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0017.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0019.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0020.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0022.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0023.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0024.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0026.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0027.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0029.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0030.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0032.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0033.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0034.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0036.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0037.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0039.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0040.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0042.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0043.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0044.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0046.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0047.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0049.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0050.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0052.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0053.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0054.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0056.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0057.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0059.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0060.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0062.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0064.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0065.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0066.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0067.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0069.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0070.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0071.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0072.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0074.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0075.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0076.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0077.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0079.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0080.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "663.png", + "format": "I8", + "size": { "w": 480, "h": 152 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/663.png b/public/images/pokemon/exp/663.png index e3f83f2594b..394cec2e0ee 100644 Binary files a/public/images/pokemon/exp/663.png and b/public/images/pokemon/exp/663.png differ diff --git a/public/images/pokemon/exp/664.json b/public/images/pokemon/exp/664.json index b44e028830f..5036fe74b0b 100644 --- a/public/images/pokemon/exp/664.json +++ b/public/images/pokemon/exp/664.json @@ -1,188 +1,110 @@ -{ - "textures": [ - { - "image": "664.png", - "format": "RGBA8888", - "size": { - "w": 84, - "h": 84 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 25, - "h": 41 - }, - "frame": { - "x": 0, - "y": 43, - "w": 25, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 25, - "h": 41 - }, - "frame": { - "x": 0, - "y": 43, - "w": 25, - "h": 41 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 25, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 25, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 50, - "y": 0, - "w": 25, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:463885b13604daf56d9395607b6a199b:02b6779c8edc4d65f396242ab67065d7:596e7d5b15b1bf041c4d7f6707c8ff49$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 46, "w": 26, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 26, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 83, "y": 46, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 26, "y": 90, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 52, "y": 91, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 26, "y": 46, "w": 27, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 27, "h": 44 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 78, "y": 91, "w": 26, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 44 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 56, "y": 0, "w": 28, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 28, "y": 0, "w": 28, "h": 46 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 84, "y": 0, "w": 27, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 56, "y": 45, "w": 27, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "664.png", + "format": "I8", + "size": { "w": 111, "h": 136 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/664.png b/public/images/pokemon/exp/664.png index 5f7ee7f426e..d626085b5a1 100644 Binary files a/public/images/pokemon/exp/664.png and b/public/images/pokemon/exp/664.png differ diff --git a/public/images/pokemon/exp/665.json b/public/images/pokemon/exp/665.json index 69d1dfa05e2..a06b1d10ad0 100644 --- a/public/images/pokemon/exp/665.json +++ b/public/images/pokemon/exp/665.json @@ -1,188 +1,596 @@ -{ - "textures": [ - { - "image": "665.png", - "format": "RGBA8888", - "size": { - "w": 76, - "h": 76 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 36, - "h": 36 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 36, - "h": 36 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 36, - "y": 36, - "w": 38, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 36, - "y": 36, - "w": 38, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:359a2e5553846e1cd19ec4ff9a207cd7:96f598328847d5f090f229788215db91:a72e6c94514c750d7462eab6b08ee591$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 151, "y": 103, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 7, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 151, "y": 103, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 7, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 151, "y": 103, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 7, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 159, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 193, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 159, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 40, "y": 41, "w": 39, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 39, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 80, "y": 38, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 3, "w": 45, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 227, "y": 34, "w": 63, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 63, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 0, "w": 74, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 74, "h": 38 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 154, "y": 0, "w": 81, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 81, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 235, "y": 0, "w": 81, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 81, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 0, "w": 80, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 80, "h": 41 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 154, "y": 34, "w": 73, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 73, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 316, "y": 0, "w": 73, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 73, "h": 37 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 290, "y": 37, "w": 53, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 4, "w": 53, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 343, "y": 37, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 46, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 41, "w": 40, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 40, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 227, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 261, "y": 71, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 295, "y": 71, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 329, "y": 72, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 363, "y": 72, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "665.png", + "format": "I8", + "size": { "w": 397, "h": 135 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/665.png b/public/images/pokemon/exp/665.png index 05b0370d0c6..88dc208300f 100644 Binary files a/public/images/pokemon/exp/665.png and b/public/images/pokemon/exp/665.png differ diff --git a/public/images/pokemon/exp/666-fancy.png b/public/images/pokemon/exp/666-fancy.png index 6c23274c5e0..92da507a61f 100644 Binary files a/public/images/pokemon/exp/666-fancy.png and b/public/images/pokemon/exp/666-fancy.png differ diff --git a/public/images/pokemon/exp/666-high-plains.png b/public/images/pokemon/exp/666-high-plains.png index 9d6527bf091..a34b2fd8254 100644 Binary files a/public/images/pokemon/exp/666-high-plains.png and b/public/images/pokemon/exp/666-high-plains.png differ diff --git a/public/images/pokemon/exp/666-meadow.json b/public/images/pokemon/exp/666-meadow.json index ee4f6d31bc0..77158992e59 100644 --- a/public/images/pokemon/exp/666-meadow.json +++ b/public/images/pokemon/exp/666-meadow.json @@ -1,314 +1,551 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 243, - "h": 243 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 84, - "h": 88 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 77, - "h": 89 - }, - "frame": { - "x": 0, - "y": 88, - "w": 77, - "h": 89 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 77, - "h": 89 - }, - "frame": { - "x": 0, - "y": 88, - "w": 77, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 69, - "h": 89 - }, - "frame": { - "x": 77, - "y": 88, - "w": 69, - "h": 89 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 69, - "h": 89 - }, - "frame": { - "x": 77, - "y": 88, - "w": 69, - "h": 89 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 62, - "h": 87 - }, - "frame": { - "x": 84, - "y": 0, - "w": 62, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 62, - "h": 87 - }, - "frame": { - "x": 84, - "y": 0, - "w": 62, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 86 - }, - "frame": { - "x": 146, - "y": 0, - "w": 56, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 13, - "y": 2, - "w": 56, - "h": 86 - }, - "frame": { - "x": 146, - "y": 0, - "w": 56, - "h": 86 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 41, - "h": 85 - }, - "frame": { - "x": 202, - "y": 0, - "w": 41, - "h": 85 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 51, - "h": 86 - }, - "frame": { - "x": 146, - "y": 86, - "w": 51, - "h": 86 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 51, - "h": 86 - }, - "frame": { - "x": 146, - "y": 86, - "w": 51, - "h": 86 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 46, - "h": 86 - }, - "frame": { - "x": 197, - "y": 86, - "w": 46, - "h": 86 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 46, - "h": 86 - }, - "frame": { - "x": 197, - "y": 86, - "w": 46, - "h": 86 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223ce33721ef8da9ff40286099c20de4:b82acd304c2a8b8cebeda2043a3e1f96:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 209, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 21, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 347, "y": 140, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 20, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 347, "y": 71, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 347, "y": 2, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 2, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 278, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 53, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 104, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 71, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 20, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 155, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 140, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 206, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 209, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 257, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 278, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 308, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 2, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 53, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 71, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 104, "y": 209, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 140, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 20, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 2, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 19, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 209, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 53, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 278, "y": 140, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 67, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 104, "y": 278, "w": 49, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 15, "w": 49, "h": 67 }, + "sourceSize": { "w": 96, "h": 96 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-meadow.png", + "format": "I8", + "size": { "w": 398, "h": 347 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/666-meadow.png b/public/images/pokemon/exp/666-meadow.png index 3f9f758ad1f..6912a8d8174 100644 Binary files a/public/images/pokemon/exp/666-meadow.png and b/public/images/pokemon/exp/666-meadow.png differ diff --git a/public/images/pokemon/exp/666-poke-ball.png b/public/images/pokemon/exp/666-poke-ball.png index e33fe6e8c5a..58cae8e2aaa 100644 Binary files a/public/images/pokemon/exp/666-poke-ball.png and b/public/images/pokemon/exp/666-poke-ball.png differ diff --git a/public/images/pokemon/exp/666-river.png b/public/images/pokemon/exp/666-river.png index 1e908ff89b6..433b2c39254 100644 Binary files a/public/images/pokemon/exp/666-river.png and b/public/images/pokemon/exp/666-river.png differ diff --git a/public/images/pokemon/exp/667.json b/public/images/pokemon/exp/667.json index 3667bc80aa0..3fba95afcf9 100644 --- a/public/images/pokemon/exp/667.json +++ b/public/images/pokemon/exp/667.json @@ -1,272 +1,659 @@ -{ - "textures": [ - { - "image": "667.png", - "format": "RGBA8888", - "size": { - "w": 160, - "h": 160 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 40, - "h": 46 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 92, - "w": 40, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 80, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 0, - "w": 40, - "h": 45 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 0, - "w": 40, - "h": 45 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 45, - "w": 40, - "h": 45 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 40, - "y": 90, - "w": 40, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 44 - }, - "frame": { - "x": 40, - "y": 46, - "w": 40, - "h": 44 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 44 - }, - "frame": { - "x": 80, - "y": 46, - "w": 40, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0c78c1973ebb266716d5a3a4557bca98:3ab4a906b1847f4048e828e5410eae40:02171d511e760c8a3e1b623ad6bf93f5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0066.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0068.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0070.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0071.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0072.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "667.png", + "format": "I8", + "size": { "w": 167, "h": 141 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/667.png b/public/images/pokemon/exp/667.png index 21bbfcc0d68..3ae931300c5 100644 Binary files a/public/images/pokemon/exp/667.png and b/public/images/pokemon/exp/667.png differ diff --git a/public/images/pokemon/exp/668.json b/public/images/pokemon/exp/668.json index 083fdcfb598..63671a548a2 100644 --- a/public/images/pokemon/exp/668.json +++ b/public/images/pokemon/exp/668.json @@ -1,272 +1,821 @@ -{ - "textures": [ - { - "image": "668.png", - "format": "RGBA8888", - "size": { - "w": 205, - "h": 205 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 136, - "y": 69, - "w": 69, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a0374d38386b4719d8b0a8fcc11d003d:7a4ba7ff9050ba3dee8c8340200f12c2:947bf84d1af493c62e2cef45bb6c19ad$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 351, "y": 151, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 142, "y": 221, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 351, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 421, "y": 225, "w": 69, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 205, "y": 296, "w": 69, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 69, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 212, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 137, "y": 294, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 274, "y": 299, "w": 64, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 368, "w": 61, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 61, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 442, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 55, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 438, "y": 441, "w": 55, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 261, "y": 372, "w": 59, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 134, "y": 367, "w": 62, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 62, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 68, "y": 295, "w": 66, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 66, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 365, "y": 75, "w": 69, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 69, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 75, "w": 71, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 71, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 442, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 221, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 369, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 296, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 74, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 148, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 148, "y": 74, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 222, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 442, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 293, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 71, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 71, "y": 149, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 143, "y": 148, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668.png", + "format": "I8", + "size": { "w": 515, "h": 516 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/668.png b/public/images/pokemon/exp/668.png index 36acb70a20f..85be1a55032 100644 Binary files a/public/images/pokemon/exp/668.png and b/public/images/pokemon/exp/668.png differ diff --git a/public/images/pokemon/exp/672.json b/public/images/pokemon/exp/672.json index 7062ea01ab3..f337bef7d29 100644 --- a/public/images/pokemon/exp/672.json +++ b/public/images/pokemon/exp/672.json @@ -1,965 +1,479 @@ -{ - "textures": [ - { - "image": "672.png", - "format": "RGBA8888", - "size": { - "w": 250, - "h": 250 - }, - "scale": 1, - "frames": [ - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 190, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 38, - "h": 42 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 42, - "w": 38, - "h": 42 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 76, - "y": 42, - "w": 38, - "h": 42 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 42 - }, - "frame": { - "x": 114, - "y": 42, - "w": 37, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 42 - }, - "frame": { - "x": 151, - "y": 42, - "w": 37, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 42 - }, - "frame": { - "x": 188, - "y": 42, - "w": 37, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 73, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 73, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 73, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 109, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 109, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 145, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 181, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 0, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 36, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 72, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 108, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 144, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 180, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 0, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 0, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 36, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 72, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 108, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 108, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 144, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 42 - }, - "frame": { - "x": 180, - "y": 168, - "w": 35, - "h": 42 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 42 - }, - "frame": { - "x": 180, - "y": 168, - "w": 35, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 42 - }, - "frame": { - "x": 215, - "y": 168, - "w": 35, - "h": 42 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 0, - "y": 209, - "w": 36, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 36, - "y": 209, - "w": 36, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:38e639fec858918eeed4df6a97e5793c:1f05d1f362d84566f20c17270128fcef:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 43, "y": 0, "w": 43, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 43, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 43, "h": 54 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 42, "y": 100, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 86, "y": 50, "w": 41, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 51 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 43, "y": 0, "w": 43, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 43, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 43, "h": 54 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 83, "y": 101, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 86, "y": 50, "w": 41, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 51 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "672.png", + "format": "I8", + "size": { "w": 170, "h": 193 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/672.png b/public/images/pokemon/exp/672.png index 1af5c35d308..1c261d8d51a 100644 Binary files a/public/images/pokemon/exp/672.png and b/public/images/pokemon/exp/672.png differ diff --git a/public/images/pokemon/exp/674.json b/public/images/pokemon/exp/674.json deleted file mode 100644 index ab275feb366..00000000000 --- a/public/images/pokemon/exp/674.json +++ /dev/null @@ -1,524 +0,0 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 90, - "h": 90 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 30, - "y": 0, - "w": 30, - "h": 39 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 30, - "y": 0, - "w": 30, - "h": 39 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 37, - "w": 30, - "h": 37 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 37, - "w": 30, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8a56731ba1ddcc58654c5fd4c09d4b6c:7feee6e8d94135fbc956d541853811cb:b823d10f1c9b4d501296982088ba63d6$" - } -} diff --git a/public/images/pokemon/exp/674.png b/public/images/pokemon/exp/674.png deleted file mode 100644 index 68fd635ed4f..00000000000 Binary files a/public/images/pokemon/exp/674.png and /dev/null 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/682.png b/public/images/pokemon/exp/682.png index 35ab3a5c315..104dc143677 100644 Binary files a/public/images/pokemon/exp/682.png and b/public/images/pokemon/exp/682.png differ diff --git a/public/images/pokemon/exp/683.png b/public/images/pokemon/exp/683.png index 5e8ff5acd30..d657a0ee5fd 100644 Binary files a/public/images/pokemon/exp/683.png and b/public/images/pokemon/exp/683.png differ diff --git a/public/images/pokemon/exp/684.png b/public/images/pokemon/exp/684.png index d7d6b29f730..84f06ee4f3c 100644 Binary files a/public/images/pokemon/exp/684.png and b/public/images/pokemon/exp/684.png differ diff --git a/public/images/pokemon/exp/685.png b/public/images/pokemon/exp/685.png index cfccc4f119b..2a1ab94bc22 100644 Binary files a/public/images/pokemon/exp/685.png and b/public/images/pokemon/exp/685.png differ diff --git a/public/images/pokemon/exp/692.json b/public/images/pokemon/exp/692.json index 935f67c3daa..86b535260ae 100644 --- a/public/images/pokemon/exp/692.json +++ b/public/images/pokemon/exp/692.json @@ -1,356 +1,794 @@ -{ - "textures": [ - { - "image": "692.png", - "format": "RGBA8888", - "size": { - "w": 162, - "h": 162 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 60, - "y": 0, - "w": 60, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 60, - "y": 0, - "w": 60, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 60, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 60, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 82, - "w": 60, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 82, - "w": 60, - "h": 41 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 0, - "y": 123, - "w": 60, - "h": 39 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 0, - "y": 123, - "w": 60, - "h": 39 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 60, - "y": 41, - "w": 60, - "h": 39 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 60, - "y": 41, - "w": 60, - "h": 39 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 60, - "y": 41, - "w": 60, - "h": 39 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 60, - "y": 41, - "w": 60, - "h": 39 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 41 - }, - "frame": { - "x": 60, - "y": 80, - "w": 59, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 41 - }, - "frame": { - "x": 60, - "y": 121, - "w": 59, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:770fa5fad1cc8a443ce0a20fecd29c87:eb7f111f1bbee8cd3438d375d4fb00f7:2880def858c84cd859bedf13b0b49a33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 117, "y": 72, "w": 59, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "692.png", + "format": "I8", + "size": { "w": 239, "h": 106 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/692.png b/public/images/pokemon/exp/692.png index 976faaf76a4..1e42cbf47fa 100644 Binary files a/public/images/pokemon/exp/692.png and b/public/images/pokemon/exp/692.png differ diff --git a/public/images/pokemon/exp/693.json b/public/images/pokemon/exp/693.json index b5b81735f10..c8f7763de1d 100644 --- a/public/images/pokemon/exp/693.json +++ b/public/images/pokemon/exp/693.json @@ -1,272 +1,902 @@ -{ - "textures": [ - { - "image": "693.png", - "format": "RGBA8888", - "size": { - "w": 259, - "h": 259 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 85, - "h": 89 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 85, - "h": 89 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 86, - "y": 0, - "w": 85, - "h": 89 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 86, - "y": 0, - "w": 85, - "h": 89 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 85, - "y": 89, - "w": 85, - "h": 89 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 85, - "h": 88 - }, - "frame": { - "x": 171, - "y": 0, - "w": 85, - "h": 88 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 85, - "h": 88 - }, - "frame": { - "x": 171, - "y": 0, - "w": 85, - "h": 88 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 91, - "h": 80 - }, - "frame": { - "x": 0, - "y": 178, - "w": 91, - "h": 80 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 89, - "h": 83 - }, - "frame": { - "x": 170, - "y": 89, - "w": 89, - "h": 83 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 89, - "h": 83 - }, - "frame": { - "x": 170, - "y": 89, - "w": 89, - "h": 83 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8606ef5d207ca2100dda49cb1d79599e:d3c4f159e863b497f7925b3a24df9e4b:9c1f9147e693c05eb4655590e9099679$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 303, "y": 140, "w": 102, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 102, "h": 70 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 523, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 11, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 318, "y": 290, "w": 103, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 7, "w": 103, "h": 64 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 105, "y": 1, "w": 102, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 102, "h": 75 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 306, "y": 72, "w": 108, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 108, "h": 68 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 108, "y": 276, "w": 105, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 14, "w": 105, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 104, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 104, "h": 74 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 203, "y": 210, "w": 106, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 13, "w": 106, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 508, "y": 152, "w": 106, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 106, "h": 67 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 414, "y": 74, "w": 103, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 103, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 306, "y": 72, "w": 108, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 108, "h": 68 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 108, "y": 276, "w": 105, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 14, "w": 105, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 1, "y": 1, "w": 104, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 104, "h": 74 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 203, "y": 210, "w": 106, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 13, "w": 106, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 309, "y": 214, "w": 107, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 14, "w": 107, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 306, "y": 1, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 106, "h": 70 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 1, "y": 218, "w": 107, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 14, "w": 107, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 213, "y": 279, "w": 105, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 14, "w": 105, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 103, "y": 341, "w": 104, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 15, "w": 104, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 516, "y": 1, "w": 101, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 101, "h": 73 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 100, "y": 149, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 1, "y": 349, "w": 102, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 16, "w": 102, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 103, "y": 404, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 16, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "693.png", + "format": "I8", + "size": { "w": 626, "h": 466 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/693.png b/public/images/pokemon/exp/693.png index 538f2f11f73..2e8f1ccd05c 100644 Binary files a/public/images/pokemon/exp/693.png and b/public/images/pokemon/exp/693.png differ diff --git a/public/images/pokemon/exp/694.json b/public/images/pokemon/exp/694.json deleted file mode 100644 index 12cc0369cc2..00000000000 --- a/public/images/pokemon/exp/694.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 140, - "h": 140 - }, - "scale": 1, - "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 44, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 34 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 43, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 34 - }, - "frame": { - "x": 44, - "y": 0, - "w": 43, - "h": 34 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 41, - "h": 35 - }, - "frame": { - "x": 0, - "y": 68, - "w": 41, - "h": 35 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 36, - "h": 37 - }, - "frame": { - "x": 0, - "y": 103, - "w": 36, - "h": 37 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 36, - "h": 37 - }, - "frame": { - "x": 0, - "y": 103, - "w": 36, - "h": 37 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 34, - "h": 37 - }, - "frame": { - "x": 36, - "y": 103, - "w": 34, - "h": 37 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 41, - "h": 35 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 35 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 39, - "h": 36 - }, - "frame": { - "x": 43, - "y": 34, - "w": 39, - "h": 36 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 39, - "h": 36 - }, - "frame": { - "x": 82, - "y": 35, - "w": 39, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 33, - "h": 37 - }, - "frame": { - "x": 70, - "y": 71, - "w": 33, - "h": 37 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 31, - "h": 37 - }, - "frame": { - "x": 103, - "y": 71, - "w": 31, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c6f790c1c7c7e284eb98dfeaad75e635:7e95f5e91c561cc43d0e8ef8188f18b3:b0990f9650cfe63b836cbed33f0b44d8$" - } -} diff --git a/public/images/pokemon/exp/694.png b/public/images/pokemon/exp/694.png deleted file mode 100644 index 671d9517e4c..00000000000 Binary files a/public/images/pokemon/exp/694.png and /dev/null differ diff --git a/public/images/pokemon/exp/696.json b/public/images/pokemon/exp/696.json index 3bc9dae1999..f95124e3f31 100644 --- a/public/images/pokemon/exp/696.json +++ b/public/images/pokemon/exp/696.json @@ -1,692 +1,1054 @@ -{ - "textures": [ - { - "image": "696.png", - "format": "RGBA8888", - "size": { - "w": 135, - "h": 135 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 53, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 53, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 53, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 53, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 53, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 53, - "h": 43 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f6c90e8287d3ce2aa68c9fef98f6e12f:24cf84ba4764bd88b4e751ca1911a8d5:58b7763fb9abdd043e9bfa400cfafdef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 171, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 171, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 286, "h": 179 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/696.png b/public/images/pokemon/exp/696.png index 8dd6b2cf6c7..7892c40e52b 100644 Binary files a/public/images/pokemon/exp/696.png and b/public/images/pokemon/exp/696.png differ diff --git a/public/images/pokemon/exp/697.json b/public/images/pokemon/exp/697.json index 9120976bb53..c56de41946c 100644 --- a/public/images/pokemon/exp/697.json +++ b/public/images/pokemon/exp/697.json @@ -1,1175 +1,983 @@ -{ - "textures": [ - { - "image": "697.png", - "format": "RGBA8888", - "size": { - "w": 378, - "h": 378 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 76, - "h": 74 - }, - "frame": { - "x": 76, - "y": 75, - "w": 76, - "h": 74 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 152, - "y": 0, - "w": 75, - "h": 75 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 76, - "h": 74 - }, - "frame": { - "x": 227, - "y": 0, - "w": 76, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 69, - "h": 76 - }, - "frame": { - "x": 0, - "y": 302, - "w": 69, - "h": 76 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 69, - "h": 76 - }, - "frame": { - "x": 0, - "y": 302, - "w": 69, - "h": 76 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 303, - "y": 0, - "w": 74, - "h": 74 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 303, - "y": 0, - "w": 74, - "h": 74 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 148, - "y": 149, - "w": 74, - "h": 75 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 148, - "y": 149, - "w": 74, - "h": 75 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 67, - "h": 77 - }, - "frame": { - "x": 222, - "y": 149, - "w": 67, - "h": 77 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 227, - "y": 74, - "w": 72, - "h": 75 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 67, - "h": 77 - }, - "frame": { - "x": 299, - "y": 74, - "w": 67, - "h": 77 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 65, - "h": 78 - }, - "frame": { - "x": 289, - "y": 151, - "w": 65, - "h": 78 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 65, - "h": 78 - }, - "frame": { - "x": 289, - "y": 151, - "w": 65, - "h": 78 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 63, - "h": 79 - }, - "frame": { - "x": 145, - "y": 227, - "w": 63, - "h": 79 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 63, - "h": 79 - }, - "frame": { - "x": 145, - "y": 227, - "w": 63, - "h": 79 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 61, - "h": 79 - }, - "frame": { - "x": 208, - "y": 226, - "w": 61, - "h": 79 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 61, - "h": 79 - }, - "frame": { - "x": 208, - "y": 226, - "w": 61, - "h": 79 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 60, - "h": 79 - }, - "frame": { - "x": 269, - "y": 229, - "w": 60, - "h": 79 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:768a260ef504838ad6b945525f4ed05f:3b115b0ef560b516c93f6aa5f1423cd9:f4fdd87d2fc1483d8e0a185c2654e3d9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 78, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 184, "y": 231, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 94, "y": 157, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 90, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 391, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 88, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 275, "y": 390, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 88, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 363, "y": 463, "w": 86, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 86, "h": 81 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 649, "y": 386, "w": 86, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 86, "h": 82 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 449, "y": 463, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 87, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 312, "w": 90, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 90, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 372, "y": 386, "w": 92, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 92, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 566, "y": 233, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 566, "y": 233, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 92, "y": 78, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 473, "y": 156, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 556, "y": 386, "w": 93, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 93, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 181, "y": 387, "w": 94, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 94, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 648, "y": 311, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 186, "y": 312, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 661, "y": 157, "w": 96, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 96, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 458, "y": 311, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 669, "y": 0, "w": 93, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 93, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 464, "y": 386, "w": 92, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 92, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 568, "y": 79, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 661, "y": 79, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 289, "y": 0, "w": 95, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 95, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 0, "y": 0, "w": 96, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 96, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 96, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 192, "y": 0, "w": 97, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 97, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 480, "y": 0, "w": 96, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 96, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 384, "y": 0, "w": 96, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 96, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 192, "y": 77, "w": 96, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 96, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 566, "y": 157, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 95, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 553, "y": 311, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 277, "y": 157, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 95, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 92, "y": 310, "w": 94, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 94, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 0, "y": 157, "w": 94, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 94, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 458, "y": 234, "w": 93, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 93, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 184, "y": 153, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 380, "y": 156, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 576, "y": 0, "w": 93, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 93, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 288, "y": 78, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "697.png", + "format": "I8", + "size": { "w": 762, "h": 616 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/697.png b/public/images/pokemon/exp/697.png index 136007c2892..808dd14eabd 100644 Binary files a/public/images/pokemon/exp/697.png and b/public/images/pokemon/exp/697.png differ diff --git a/public/images/pokemon/exp/698.json b/public/images/pokemon/exp/698.json deleted file mode 100644 index e0096ec0ecf..00000000000 --- a/public/images/pokemon/exp/698.json +++ /dev/null @@ -1,3296 +0,0 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 175, - "h": 175 - }, - "scale": 1, - "frames": [ - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2dce35b74cbe50cf08e71af3768cef4c:e4d5ff1dbd47865af99315586fe42981:198087d69fed44d4a642fa3ba5c077d6$" - } -} diff --git a/public/images/pokemon/exp/698.png b/public/images/pokemon/exp/698.png deleted file mode 100644 index 3fba3dad32a..00000000000 Binary files a/public/images/pokemon/exp/698.png and /dev/null 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/700.json b/public/images/pokemon/exp/700.json index fbcefcf3561..2ed26d79228 100644 --- a/public/images/pokemon/exp/700.json +++ b/public/images/pokemon/exp/700.json @@ -1,1070 +1,587 @@ -{ - "textures": [ - { - "image": "700.png", - "format": "RGBA8888", - "size": { - "w": 233, - "h": 233 - }, - "scale": 1, - "frames": [ - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 45, - "h": 58 - }, - "frame": { - "x": 0, - "y": 175, - "w": 45, - "h": 58 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 45, - "h": 58 - }, - "frame": { - "x": 0, - "y": 175, - "w": 45, - "h": 58 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 57 - }, - "frame": { - "x": 45, - "y": 176, - "w": 42, - "h": 57 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 101, - "y": 118, - "w": 50, - "h": 59 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8ebe248133b590a1727583e2ee69cc50:c2481ba04831dcd949e63454034488e2:2e4bf5ef1f19e475073f7da10c60b540$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 239, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 193, "y": 60, "w": 43, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 43, "h": 62 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 99, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 147, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 51, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 51, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 60, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 46, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 92, "y": 178, "w": 43, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 43, "h": 60 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 195, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 52, "y": 0, "w": 46, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 46, "h": 61 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 136, "y": 178, "w": 43, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 43, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 195, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 52, "y": 0, "w": 46, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 46, "h": 61 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 179, "w": 43, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 43, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 185, "y": 123, "w": 44, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 44, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 47, "y": 62, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 45, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 44, "y": 239, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "700.png", + "format": "I8", + "size": { "w": 242, "h": 298 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/700.png b/public/images/pokemon/exp/700.png index 997328d323d..4d3e64fab03 100644 Binary files a/public/images/pokemon/exp/700.png and b/public/images/pokemon/exp/700.png differ diff --git a/public/images/pokemon/exp/702.json b/public/images/pokemon/exp/702.json index bf5cfbccec0..0ab95b58c7a 100644 --- a/public/images/pokemon/exp/702.json +++ b/public/images/pokemon/exp/702.json @@ -1,671 +1,443 @@ -{ - "textures": [ - { - "image": "702.png", - "format": "RGBA8888", - "size": { - "w": 138, - "h": 138 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 48, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 48, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 45, - "h": 36 - }, - "frame": { - "x": 0, - "y": 72, - "w": 45, - "h": 36 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 45, - "h": 36 - }, - "frame": { - "x": 0, - "y": 72, - "w": 45, - "h": 36 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 47, - "y": 36, - "w": 44, - "h": 35 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 47, - "y": 36, - "w": 44, - "h": 35 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 47, - "y": 36, - "w": 44, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 47, - "h": 33 - }, - "frame": { - "x": 91, - "y": 36, - "w": 47, - "h": 33 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 47, - "h": 33 - }, - "frame": { - "x": 91, - "y": 36, - "w": 47, - "h": 33 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 47, - "h": 33 - }, - "frame": { - "x": 91, - "y": 36, - "w": 47, - "h": 33 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 93, - "y": 69, - "w": 44, - "h": 35 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 93, - "y": 69, - "w": 44, - "h": 35 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 93, - "y": 69, - "w": 44, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:be64539a559c97720b84c9b5cd8151b7:e7db40381441319d37a93d8698db35c7:ba8fdab405d5efab99c4aa1084328e6b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 47, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 47, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 94, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 141, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 47, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 47, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 94, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 141, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 47, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 47, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 94, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 141, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 47, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 47, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 94, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 141, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 94, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 141, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 141, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 188, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 48, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 74, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 188, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 145, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 96, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 47, "y": 74, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 94, "y": 74, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 187, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "702.png", + "format": "I8", + "size": { "w": 234, "h": 178 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/702.png b/public/images/pokemon/exp/702.png index a5d375e779a..1f1bd6b524f 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/703.json b/public/images/pokemon/exp/703.json deleted file mode 100644 index 75e52fdc904..00000000000 --- a/public/images/pokemon/exp/703.json +++ /dev/null @@ -1,356 +0,0 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 120, - "h": 120 - }, - "scale": 1, - "frames": [ - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 37, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 37, - "h": 41 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 37, - "h": 40 - }, - "frame": { - "x": 74, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 41 - }, - "frame": { - "x": 37, - "y": 40, - "w": 35, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 41 - }, - "frame": { - "x": 37, - "y": 40, - "w": 35, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 12, - "w": 35, - "h": 39 - }, - "frame": { - "x": 37, - "y": 81, - "w": 35, - "h": 39 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 40 - }, - "frame": { - "x": 72, - "y": 40, - "w": 37, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 35, - "h": 40 - }, - "frame": { - "x": 72, - "y": 80, - "w": 35, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:01a847d167639aeeb160ddd9a360a558:5e33077f4810fe91d17064ff7dd6bf4d:721af8c322ff60159262e9b3017c784d$" - } -} diff --git a/public/images/pokemon/exp/703.png b/public/images/pokemon/exp/703.png deleted file mode 100644 index 5a0c63154ef..00000000000 Binary files a/public/images/pokemon/exp/703.png and /dev/null differ diff --git a/public/images/pokemon/exp/704.json b/public/images/pokemon/exp/704.json index 440a41ebbc5..8b429c0639e 100644 --- a/public/images/pokemon/exp/704.json +++ b/public/images/pokemon/exp/704.json @@ -1,1784 +1,371 @@ -{ - "textures": [ - { - "image": "704.png", - "format": "RGBA8888", - "size": { - "w": 288, - "h": 288 - }, - "scale": 1, - "frames": [ - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 43, - "h": 48 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 43, - "h": 48 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 47 - }, - "frame": { - "x": 0, - "y": 144, - "w": 43, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 47 - }, - "frame": { - "x": 0, - "y": 144, - "w": 43, - "h": 47 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 46 - }, - "frame": { - "x": 0, - "y": 191, - "w": 41, - "h": 46 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 46 - }, - "frame": { - "x": 0, - "y": 191, - "w": 41, - "h": 46 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 0, - "y": 237, - "w": 39, - "h": 45 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 0, - "y": 237, - "w": 39, - "h": 45 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 41, - "y": 191, - "w": 41, - "h": 44 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 41, - "y": 191, - "w": 41, - "h": 44 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 80, - "y": 235, - "w": 41, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 121, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 121, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 43, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 205, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 247, - "y": 0, - "w": 41, - "h": 44 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 43, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 43, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 163, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 247, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 205, - "y": 84, - "w": 42, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 205, - "y": 84, - "w": 42, - "h": 40 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 205, - "y": 84, - "w": 42, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 247, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 247, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 43, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 43, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 43, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 82, - "y": 176, - "w": 36, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 82, - "y": 176, - "w": 36, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 121, - "y": 85, - "w": 42, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 163, - "y": 85, - "w": 36, - "h": 44 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 121, - "y": 125, - "w": 36, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 199, - "y": 124, - "w": 36, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 199, - "y": 124, - "w": 36, - "h": 44 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 157, - "y": 129, - "w": 36, - "h": 44 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 121, - "y": 169, - "w": 36, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 235, - "y": 132, - "w": 36, - "h": 43 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 235, - "y": 132, - "w": 36, - "h": 43 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 193, - "y": 168, - "w": 36, - "h": 43 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 157, - "y": 173, - "w": 36, - "h": 43 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 121, - "y": 213, - "w": 36, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 229, - "y": 175, - "w": 36, - "h": 43 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 193, - "y": 211, - "w": 36, - "h": 43 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 157, - "y": 216, - "w": 36, - "h": 43 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 229, - "y": 218, - "w": 36, - "h": 43 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 229, - "y": 218, - "w": 36, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:695bd0c4059d0b12112a2e7a99e1d237:1f0a27b4d1a84460990b54c833ed8007:45bb13be23ae6e2a6654a2a00c450d62$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0003.png", + "frame": { "x": 78, "y": 0, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0007.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0008.png", + "frame": { "x": 52, "y": 94, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0009.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0013.png", + "frame": { "x": 78, "y": 0, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0017.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0018.png", + "frame": { "x": 52, "y": 94, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0019.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0023.png", + "frame": { "x": 78, "y": 0, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0026.png", + "frame": { "x": 26, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 67, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0028.png", + "frame": { "x": 80, "y": 94, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0029.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0032.png", + "frame": { "x": 26, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0033.png", + "frame": { "x": 78, "y": 31, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0034.png", + "frame": { "x": 52, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0035.png", + "frame": { "x": 52, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0036.png", + "frame": { "x": 52, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0037.png", + "frame": { "x": 26, "y": 67, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 99, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0039.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "704.png", + "format": "I8", + "size": { "w": 108, "h": 128 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/704.png b/public/images/pokemon/exp/704.png index 2490591adf2..b85d8dfc3c0 100644 Binary files a/public/images/pokemon/exp/704.png and b/public/images/pokemon/exp/704.png differ diff --git a/public/images/pokemon/exp/705.json b/public/images/pokemon/exp/705.json index d710ef9e5eb..eecb83af45a 100644 --- a/public/images/pokemon/exp/705.json +++ b/public/images/pokemon/exp/705.json @@ -1,272 +1,596 @@ -{ - "textures": [ - { - "image": "705.png", - "format": "RGBA8888", - "size": { - "w": 154, - "h": 154 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 46, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 46, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 91, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 42, - "h": 58 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 42, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 58 - }, - "frame": { - "x": 42, - "y": 58, - "w": 41, - "h": 58 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 58 - }, - "frame": { - "x": 42, - "y": 58, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 58 - }, - "frame": { - "x": 83, - "y": 58, - "w": 36, - "h": 58 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 58 - }, - "frame": { - "x": 83, - "y": 58, - "w": 36, - "h": 58 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 119, - "y": 58, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4bf155254b23c88780e7eee282256589:82bb727988054c3064e203b6908ff464:6b57e983626c7fc9144ab67f30c66814$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 159, "y": 0, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 39, "y": 125, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 200, "y": 60, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 39, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 79, "y": 125, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 117, "y": 125, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 127, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 39, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 39, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 78, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 117, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 155, "y": 181, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 119, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 79, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 39, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 196, "y": 123, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 200, "y": 0, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 159, "y": 60, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "705.png", + "format": "RGBA8888", + "size": { "w": 241, "h": 361 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/705.png b/public/images/pokemon/exp/705.png index 670e8be5d51..0bd8323bcb4 100644 Binary files a/public/images/pokemon/exp/705.png and b/public/images/pokemon/exp/705.png differ diff --git a/public/images/pokemon/exp/707.json b/public/images/pokemon/exp/707.json deleted file mode 100644 index 253d37ed70a..00000000000 --- a/public/images/pokemon/exp/707.json +++ /dev/null @@ -1,1931 +0,0 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 283, - "h": 283 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 45, - "h": 70 - }, - "frame": { - "x": 120, - "y": 140, - "w": 45, - "h": 70 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 43, - "h": 70 - }, - "frame": { - "x": 165, - "y": 140, - "w": 43, - "h": 70 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 43, - "h": 70 - }, - "frame": { - "x": 165, - "y": 140, - "w": 43, - "h": 70 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 45, - "h": 71 - }, - "frame": { - "x": 151, - "y": 210, - "w": 45, - "h": 71 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 39, - "h": 71 - }, - "frame": { - "x": 196, - "y": 211, - "w": 39, - "h": 71 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 39, - "h": 71 - }, - "frame": { - "x": 196, - "y": 211, - "w": 39, - "h": 71 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 44, - "h": 71 - }, - "frame": { - "x": 235, - "y": 211, - "w": 44, - "h": 71 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a13ec2d124f7e95263b088a395e9d780:8c9f0ed432d15fda1ebbfa6ff4063d39:8e96b9056ea81e44ced99c97f472a528$" - } -} diff --git a/public/images/pokemon/exp/707.png b/public/images/pokemon/exp/707.png deleted file mode 100644 index 294d6e35e70..00000000000 Binary files a/public/images/pokemon/exp/707.png and /dev/null differ diff --git a/public/images/pokemon/exp/708.png b/public/images/pokemon/exp/708.png deleted file mode 100644 index f71cbaa535d..00000000000 Binary files a/public/images/pokemon/exp/708.png and /dev/null differ diff --git a/public/images/pokemon/exp/712.json b/public/images/pokemon/exp/712.json index 0e49da4d806..859fa54fc5c 100644 --- a/public/images/pokemon/exp/712.json +++ b/public/images/pokemon/exp/712.json @@ -1,2771 +1,1433 @@ -{ - "textures": [ - { - "image": "712.png", - "format": "RGBA8888", - "size": { - "w": 209, - "h": 209 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 43, - "w": 38, - "h": 43 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 43, - "w": 38, - "h": 43 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 43, - "w": 38, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 152, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 152, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 152, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 152, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 152, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 168, - "w": 38, - "h": 41 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 168, - "w": 38, - "h": 41 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 168, - "w": 38, - "h": 41 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 168, - "w": 38, - "h": 41 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 126, - "w": 38, - "h": 41 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 126, - "w": 38, - "h": 41 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 114, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 114, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 151, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 151, - "y": 167, - "w": 37, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:144801e89f73b8a2d351aa5854b03ced:c8bd981e9dc030e1f41d7d7d0b7df029:3a1cc69824960d920ca43f8c9376d136$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 108, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 109, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 145, "y": 43, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 72, "y": 84, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 144, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 36, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 36, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 36, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 108, "y": 85, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 108, "y": 85, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 144, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 144, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 36, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 36, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 72, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 72, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 144, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 144, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 126, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 0, "y": 126, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 144, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 144, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 72, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 72, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 36, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 36, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 36, "y": 126, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 36, "y": 126, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 108, "y": 126, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 108, "y": 126, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 72, "y": 165, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 72, "y": 165, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 144, "y": 165, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 144, "y": 165, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 0, "y": 166, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 0, "y": 166, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 72, "y": 43, "w": 37, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 37, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 72, "y": 43, "w": 37, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 37, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 144, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 144, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 108, "y": 85, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 108, "y": 85, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0157.png", + "frame": { "x": 36, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0158.png", + "frame": { "x": 36, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "712.png", + "format": "I8", + "size": { "w": 181, "h": 206 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/712.png b/public/images/pokemon/exp/712.png index cd40c2e5c9b..1726f22f7b8 100644 Binary files a/public/images/pokemon/exp/712.png and b/public/images/pokemon/exp/712.png differ diff --git a/public/images/pokemon/exp/713.json b/public/images/pokemon/exp/713.json index 7c5c6b565e4..f4fcfa1ff85 100644 --- a/public/images/pokemon/exp/713.json +++ b/public/images/pokemon/exp/713.json @@ -1,146 +1,1100 @@ -{ - "textures": [ - { - "image": "713.png", - "format": "RGBA8888", - "size": { - "w": 174, - "h": 174 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 87, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 71 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 87, - "h": 72 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 72 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 87, - "h": 72 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 72 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 73 - }, - "frame": { - "x": 0, - "y": 71, - "w": 87, - "h": 73 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 73 - }, - "frame": { - "x": 0, - "y": 71, - "w": 87, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 73 - }, - "frame": { - "x": 87, - "y": 72, - "w": 87, - "h": 73 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:11a7176e3fe76c2e9fc09061688f4db6:8fdb4357b8a1808fc8dcdc5a29bec720:625f70bcfe9c7f2437cb9cad6d2b863c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 83, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 83, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 332, "y": 0, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 332, "y": 0, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 332, "y": 0, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 249, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 249, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 332, "y": 188, "w": 83, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 59 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 332, "y": 188, "w": 83, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 59 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 332, "y": 188, "w": 83, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 59 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "713.png", + "format": "I8", + "size": { "w": 416, "h": 247 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/713.png b/public/images/pokemon/exp/713.png index 0452b1989a1..2d0b8477262 100644 Binary files a/public/images/pokemon/exp/713.png and b/public/images/pokemon/exp/713.png differ diff --git a/public/images/pokemon/exp/714.json b/public/images/pokemon/exp/714.json deleted file mode 100644 index 7deaf1909af..00000000000 --- a/public/images/pokemon/exp/714.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 179, - "h": 179 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 60 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 60 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 0, - "y": 60, - "w": 64, - "h": 59 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 0, - "y": 60, - "w": 64, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 58 - }, - "frame": { - "x": 63, - "y": 0, - "w": 64, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 61 - }, - "frame": { - "x": 64, - "y": 58, - "w": 60, - "h": 61 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 61 - }, - "frame": { - "x": 64, - "y": 58, - "w": 60, - "h": 61 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 116, - "w": 54, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 60, - "h": 60 - }, - "frame": { - "x": 0, - "y": 119, - "w": 60, - "h": 60 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 60, - "h": 60 - }, - "frame": { - "x": 0, - "y": 119, - "w": 60, - "h": 60 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 60 - }, - "frame": { - "x": 60, - "y": 119, - "w": 56, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 60 - }, - "frame": { - "x": 60, - "y": 119, - "w": 56, - "h": 60 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:585d7099ac8249026b274a63ac9c25f0:8d770fdec6c3922ce9cc2e04a6453388:1a07d46e710b0568ec824f54fbc4fe6a$" - } -} diff --git a/public/images/pokemon/exp/714.png b/public/images/pokemon/exp/714.png deleted file mode 100644 index 21c184bf476..00000000000 Binary files a/public/images/pokemon/exp/714.png and /dev/null differ diff --git a/public/images/pokemon/exp/715.png b/public/images/pokemon/exp/715.png index 58f093d089a..3967da0f1b9 100644 Binary files a/public/images/pokemon/exp/715.png and b/public/images/pokemon/exp/715.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/718-10.json b/public/images/pokemon/exp/718-10.json deleted file mode 100644 index f387823bf4c..00000000000 --- a/public/images/pokemon/exp/718-10.json +++ /dev/null @@ -1,692 +0,0 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 239, - "h": 239 - }, - "scale": 1, - "frames": [ - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 64, - "h": 61 - }, - "frame": { - "x": 0, - "y": 132, - "w": 64, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 65, - "h": 60 - }, - "frame": { - "x": 59, - "y": 65, - "w": 65, - "h": 60 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 59, - "h": 66 - }, - "frame": { - "x": 179, - "y": 0, - "w": 59, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 64, - "y": 125, - "w": 59, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4a92d566ab5398ac1329b7a8bd47bf23:05925b513eba9d64f38ee84fe4b031b9:82195cf2a6db620c5643b8162d6e8c5c$" - } -} diff --git a/public/images/pokemon/exp/718-10.png b/public/images/pokemon/exp/718-10.png deleted file mode 100644 index faf98182653..00000000000 Binary files a/public/images/pokemon/exp/718-10.png and /dev/null differ diff --git a/public/images/pokemon/exp/718.json b/public/images/pokemon/exp/718.json deleted file mode 100644 index 7e32292a1be..00000000000 --- a/public/images/pokemon/exp/718.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 219, - "h": 219 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 71, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 71, - "h": 88 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 71, - "y": 0, - "w": 73, - "h": 89 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 144, - "y": 0, - "w": 74, - "h": 89 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 144, - "y": 0, - "w": 74, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 74, - "h": 89 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 74, - "h": 89 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 74, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 74, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 89 - }, - "frame": { - "x": 147, - "y": 89, - "w": 72, - "h": 89 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 89 - }, - "frame": { - "x": 147, - "y": 89, - "w": 72, - "h": 89 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ca886cfe27a80d5575319fa107b1227d:f6e306f8382a9caca9560b144b026413:7b4a06b06cbac24b3f39727b0238661b$" - } -} diff --git a/public/images/pokemon/exp/718.png b/public/images/pokemon/exp/718.png deleted file mode 100644 index 01595585059..00000000000 Binary files a/public/images/pokemon/exp/718.png and /dev/null differ diff --git a/public/images/pokemon/exp/719.json b/public/images/pokemon/exp/719.json deleted file mode 100644 index 289b518f437..00000000000 --- a/public/images/pokemon/exp/719.json +++ /dev/null @@ -1,1091 +0,0 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 210, - "h": 210 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 34, - "y": 9, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 46, - "h": 67 - }, - "frame": { - "x": 144, - "y": 0, - "w": 46, - "h": 67 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 48, - "h": 66 - }, - "frame": { - "x": 0, - "y": 67, - "w": 48, - "h": 66 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 48, - "y": 12, - "w": 46, - "h": 66 - }, - "frame": { - "x": 48, - "y": 67, - "w": 46, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 45, - "y": 1, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 27, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 36, - "y": 2, - "w": 42, - "h": 67 - }, - "frame": { - "x": 44, - "y": 133, - "w": 42, - "h": 67 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 54, - "y": 3, - "w": 42, - "h": 67 - }, - "frame": { - "x": 139, - "y": 67, - "w": 42, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 23, - "y": 6, - "w": 42, - "h": 67 - }, - "frame": { - "x": 139, - "y": 67, - "w": 42, - "h": 67 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 12, - "w": 42, - "h": 66 - }, - "frame": { - "x": 86, - "y": 134, - "w": 42, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 55, - "y": 6, - "w": 41, - "h": 67 - }, - "frame": { - "x": 128, - "y": 134, - "w": 41, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 41, - "h": 67 - }, - "frame": { - "x": 169, - "y": 134, - "w": 41, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:eb63d565533cc4db6abe2324f72ce7a0:5cfab760df87a56d5ca4db54a28b4a46:17a705bb924916761be2495822a53735$" - } -} diff --git a/public/images/pokemon/exp/719.png b/public/images/pokemon/exp/719.png deleted file mode 100644 index f9059000661..00000000000 Binary files a/public/images/pokemon/exp/719.png and /dev/null 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/815-gigantamax.json b/public/images/pokemon/exp/815-gigantamax.json new file mode 100644 index 00000000000..d8fb9d62e57 --- /dev/null +++ b/public/images/pokemon/exp/815-gigantamax.json @@ -0,0 +1,659 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 258, "y": 385, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 267, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 1, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 268, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 426, "y": 389, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 82, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 484, "w": 81, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 81, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 341, "y": 389, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 84, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 9, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 167, "y": 484, "w": 81, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 81, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 195, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 265, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 89, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 1, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 1, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 353, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 510, "y": 389, "w": 80, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 80, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 169, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 355, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 443, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 174, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 84, "y": 388, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 438, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 335, "y": 483, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "815-gigantamax.png", + "format": "I8", + "size": { "w": 611, "h": 579 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/815-gigantamax.png b/public/images/pokemon/exp/815-gigantamax.png new file mode 100644 index 00000000000..4720e564c09 Binary files /dev/null and b/public/images/pokemon/exp/815-gigantamax.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/839-gigantamax.json b/public/images/pokemon/exp/839-gigantamax.json new file mode 100644 index 00000000000..15a7c122f5d --- /dev/null +++ b/public/images/pokemon/exp/839-gigantamax.json @@ -0,0 +1,821 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 454, "y": 470, "w": 86, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 86, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 379, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 573, "y": 285, "w": 91, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 91, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 93, "y": 191, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 390, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 585, "y": 96, "w": 94, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 94, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 293, "y": 95, "w": 97, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 97, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 484, "y": 190, "w": 96, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 96, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 92, "y": 286, "w": 92, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 92, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 177, "y": 471, "w": 89, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 89, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 177, "y": 379, "w": 91, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 91, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 184, "y": 286, "w": 91, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 91, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 480, "y": 282, "w": 93, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 93, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 281, "y": 281, "w": 93, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 93, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 293, "y": 188, "w": 95, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 587, "y": 0, "w": 95, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 95, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 491, "y": 95, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 190, "w": 93, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 93, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 388, "y": 191, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 285, "w": 92, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 92, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 275, "y": 374, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 374, "y": 286, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 365, "y": 380, "w": 89, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 89, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 553, "y": 380, "w": 89, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 89, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 540, "y": 473, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 87, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 268, "y": 468, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 87, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 355, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 86, "y": 475, "w": 85, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 85, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "839-gigantamax.png", + "format": "I8", + "size": { "w": 692, "h": 664 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/839-gigantamax.png b/public/images/pokemon/exp/839-gigantamax.png new file mode 100644 index 00000000000..5a614b0c895 Binary files /dev/null and b/public/images/pokemon/exp/839-gigantamax.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/894.png b/public/images/pokemon/exp/894.png index 4879a1ca5ec..749eec38e5e 100644 Binary files a/public/images/pokemon/exp/894.png and b/public/images/pokemon/exp/894.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/945.png b/public/images/pokemon/exp/945.png index 074c03fda29..b50e1a9af52 100644 Binary files a/public/images/pokemon/exp/945.png and b/public/images/pokemon/exp/945.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/2026.png b/public/images/pokemon/exp/back/2026.png index 007e4bee3e0..0624bb2c5e7 100644 Binary files a/public/images/pokemon/exp/back/2026.png and b/public/images/pokemon/exp/back/2026.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/248-mega.json b/public/images/pokemon/exp/back/248-mega.json index 25bc42548ab..ddd3987db90 100644 --- a/public/images/pokemon/exp/back/248-mega.json +++ b/public/images/pokemon/exp/back/248-mega.json @@ -1,272 +1,929 @@ -{ - "textures": [ - { - "image": "248-mega.png", - "format": "RGBA8888", - "size": { - "w": 292, - "h": 292 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 74, - "w": 80, - "h": 74 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 0, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 0, - "w": 79, - "h": 73 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 73, - "w": 79, - "h": 73 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 0, - "w": 73, - "h": 73 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 73, - "w": 73, - "h": 73 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:625e35ec9f8e731e89fa37587ffb4738:07d356e18baf0312a4e8a36adb76fdd5:90df97eb431b7162252516cb937a0b9e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 84, "y": 456, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 511, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 512, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 427, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 255, "y": 536, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 169, "y": 535, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 431, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 340, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 171, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 171, "y": 374, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 260, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 84, "y": 456, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 511, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 85, "y": 613, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 427, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 255, "y": 536, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 169, "y": 535, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 431, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 340, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 171, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 171, "y": 374, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 260, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 84, "y": 456, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 341, "y": 612, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 613, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 427, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 255, "y": 536, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 169, "y": 535, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 518, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 84, "y": 534, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 171, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 171, "y": 374, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 260, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 84, "y": 456, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 425, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 613, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 427, "y": 612, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 255, "y": 536, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 169, "y": 535, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 518, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 84, "y": 534, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 171, "y": 456, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 171, "y": 374, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 426, "y": 194, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 510, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 285, "w": 83, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 83, "h": 86 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 432, "y": 287, "w": 82, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 85, "y": 288, "w": 82, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 373, "w": 82, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 81 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 431, "y": 374, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 455, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 256, "y": 455, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 347, "y": 374, "w": 82, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 82, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 516, "y": 372, "w": 84, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 84, "h": 81 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 260, "y": 287, "w": 85, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 85, "h": 84 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 86, "y": 200, "w": 85, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 85, "h": 86 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 342, "y": 101, "w": 86, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 256, "y": 100, "w": 84, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 84, "h": 94 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 86, "y": 100, "w": 83, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 83, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 514, "y": 0, "w": 83, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 83, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 344, "y": 0, "w": 83, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 83, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 429, "y": 0, "w": 83, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 83, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 0, "w": 84, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 84, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 86, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 172, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 258, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 171, "y": 100, "w": 83, "h": 97 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 83, "h": 97 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 514, "y": 100, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 83, "h": 94 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "248-mega.png", + "format": "I8", + "size": { "w": 602, "h": 689 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/248-mega.png b/public/images/pokemon/exp/back/248-mega.png index 4b2a4021721..1e4918e5ca7 100644 Binary files a/public/images/pokemon/exp/back/248-mega.png and b/public/images/pokemon/exp/back/248-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/359-mega.png b/public/images/pokemon/exp/back/359-mega.png index 4ba1dd3ff81..1659752a571 100644 Binary files a/public/images/pokemon/exp/back/359-mega.png and b/public/images/pokemon/exp/back/359-mega.png differ diff --git a/public/images/pokemon/exp/back/362-mega.json b/public/images/pokemon/exp/back/362-mega.json index 6f5b4ea32bb..02354ddad93 100644 --- a/public/images/pokemon/exp/back/362-mega.json +++ b/public/images/pokemon/exp/back/362-mega.json @@ -1,272 +1,551 @@ -{ - "textures": [ - { - "image": "362-mega.png", - "format": "RGBA8888", - "size": { - "w": 140, - "h": 140 - }, - "scale": 1, - "frames": [ - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 70, - "w": 61, - "h": 70 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 70, - "w": 61, - "h": 70 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 69 - }, - "frame": { - "x": 0, - "y": 71, - "w": 61, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 69 - }, - "frame": { - "x": 0, - "y": 71, - "w": 61, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b710cac988ef0d2bf31cf4b83951fd3a:aaedfd5f04a5c93bc13787cb0b73c4e3:8a7271a5423838c97ddeb1e6dc343255$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 16, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 18, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 15, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 13, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 16, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 18, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 15, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 13, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 16, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 18, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 15, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 13, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "362-mega.png", + "format": "I8", + "size": { "w": 128, "h": 132 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/362-mega.png b/public/images/pokemon/exp/back/362-mega.png index 81f9bb5cdcd..5bbfd932d33 100644 Binary files a/public/images/pokemon/exp/back/362-mega.png and b/public/images/pokemon/exp/back/362-mega.png differ diff --git a/public/images/pokemon/exp/back/382-primal.png b/public/images/pokemon/exp/back/382-primal.png index 55c73cf877e..7bf840bcf24 100644 Binary files a/public/images/pokemon/exp/back/382-primal.png and b/public/images/pokemon/exp/back/382-primal.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/569-gigantamax.json b/public/images/pokemon/exp/back/569-gigantamax.json new file mode 100644 index 00000000000..b266f5eb799 --- /dev/null +++ b/public/images/pokemon/exp/back/569-gigantamax.json @@ -0,0 +1,1478 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0002.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0003.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0004.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0005.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0006.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0007.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0008.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0009.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0010.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0011.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0012.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0013.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0014.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0015.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0016.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0017.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0018.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0019.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0023.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0024.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0025.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0026.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0027.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0028.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0029.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0030.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0031.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0032.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0033.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0034.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0035.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0036.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0037.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0038.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0039.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0040.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0041.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0042.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0043.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0044.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0045.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0046.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0047.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0048.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0049.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0050.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0051.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0052.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0053.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0054.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0058.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0059.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0060.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0061.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0062.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0063.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0064.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0065.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0066.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0067.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0068.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0069.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0070.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0071.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0072.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0076.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0077.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0081.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0082.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0083.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0084.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0085.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0086.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0091.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0092.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0093.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0095.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0096.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0097.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0098.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0099.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0100.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0101.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0102.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0103.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0104.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0105.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0106.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0107.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0108.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0109.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0110.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0111.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0112.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0113.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0114.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0117.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0118.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0119.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0120.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0121.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0122.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0123.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0124.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0125.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0126.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0127.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0128.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0129.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0130.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0131.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0132.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0133.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0134.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0135.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0136.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0137.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0138.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0139.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0140.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0141.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0142.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0143.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0144.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0145.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0146.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0147.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0148.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0149.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0152.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0153.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0154.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0155.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0156.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0157.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0158.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0159.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0160.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0161.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0162.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0163.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "569-gigantamax.png", + "format": "I8", + "size": { "w": 413, "h": 281 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/569-gigantamax.png b/public/images/pokemon/exp/back/569-gigantamax.png new file mode 100644 index 00000000000..13bbe97bee4 Binary files /dev/null and b/public/images/pokemon/exp/back/569-gigantamax.png differ diff --git a/public/images/pokemon/exp/back/6503.png b/public/images/pokemon/exp/back/6503.png index f5a2395826a..39b93590981 100644 Binary files a/public/images/pokemon/exp/back/6503.png and b/public/images/pokemon/exp/back/6503.png differ diff --git a/public/images/pokemon/exp/back/651.json b/public/images/pokemon/exp/back/651.json index 2dfe8c0091a..d000767029c 100644 --- a/public/images/pokemon/exp/back/651.json +++ b/public/images/pokemon/exp/back/651.json @@ -1,104 +1,713 @@ -{ - "textures": [ - { - "image": "651.png", - "format": "RGBA8888", - "size": { - "w": 106, - "h": 106 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 49 - }, - "frame": { - "x": 0, - "y": 50, - "w": 53, - "h": 49 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:04a3a807a85b2fbb34c6e0e609d7bcd9:4422017bd667a14a570c0aab29c8a613:a93e5fa02e10bf11e3ed8bf6571835ca$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 277, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 329, "y": 200, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 330, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 277, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 329, "y": 200, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 330, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 277, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 329, "y": 200, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 330, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 272, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 100, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 56, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 51, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 165, "y": 150, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 56, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 160, "y": 247, "w": 55, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 55, "h": 47 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 221, "y": 150, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 56, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 200, "w": 56, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 56, "h": 47 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 149, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 332, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 165, "y": 198, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 215, "y": 247, "w": 53, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 107, "y": 247, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 53, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 219, "y": 198, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 326, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 53, "y": 199, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 107, "y": 199, "w": 55, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 55, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 55, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 110, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "651.png", + "format": "I8", + "size": { "w": 387, "h": 296 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/651.png b/public/images/pokemon/exp/back/651.png index dd8d2b22d61..b16c8d5d67b 100644 Binary files a/public/images/pokemon/exp/back/651.png and b/public/images/pokemon/exp/back/651.png differ diff --git a/public/images/pokemon/exp/back/653.json b/public/images/pokemon/exp/back/653.json index 48c09e77b1b..c5fb4a5db61 100644 --- a/public/images/pokemon/exp/back/653.json +++ b/public/images/pokemon/exp/back/653.json @@ -1,2036 +1,947 @@ -{ - "textures": [ - { - "image": "653.png", - "format": "RGBA8888", - "size": { - "w": 173, - "h": 173 - }, - "scale": 1, - "frames": [ - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 45, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 45, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 45, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 45, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 130, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 130, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2657d933ba34a7364529c17b46d25589:b79a47cc022bd83470144fdf9b951be2:a7be961d0230f568aff23d95e7ff0036$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 130, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 130, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 132, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 132, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 44, "y": 43, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 44, "y": 43, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "653.png", + "format": "I8", + "size": { "w": 176, "h": 170 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/653.png b/public/images/pokemon/exp/back/653.png index 1f9cb2fe168..58682e90e58 100644 Binary files a/public/images/pokemon/exp/back/653.png and b/public/images/pokemon/exp/back/653.png differ diff --git a/public/images/pokemon/exp/back/654.json b/public/images/pokemon/exp/back/654.json index e62078dc236..a5bd681b6cb 100644 --- a/public/images/pokemon/exp/back/654.json +++ b/public/images/pokemon/exp/back/654.json @@ -1,188 +1,677 @@ -{ - "textures": [ - { - "image": "654.png", - "format": "RGBA8888", - "size": { - "w": 120, - "h": 120 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 65 - }, - "frame": { - "x": 80, - "y": 0, - "w": 40, - "h": 65 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 65 - }, - "frame": { - "x": 80, - "y": 0, - "w": 40, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d0b30f6e084cc1428328b2f8b9fbe624:bf595af9905e0e91443856bfefa85a3a:1977f50e1ab8a3304ceeb59ee1aa2ba9$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 215, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 163, "y": 0, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 108, "y": 137, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 50, "y": 263, "w": 50, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 50, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 218, "y": 0, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 161, "y": 195, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 154, "y": 261, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 54, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 163, "y": 65, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 154, "y": 261, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 54, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 163, "y": 65, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 154, "y": 261, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 54, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 163, "y": 65, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 154, "y": 261, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 54, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 218, "y": 65, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 55, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 108, "y": 137, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 196, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 51, "y": 196, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "654.png", + "format": "I8", + "size": { "w": 273, "h": 330 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/654.png b/public/images/pokemon/exp/back/654.png index 1f8fdd06967..f5d317f8a2e 100644 Binary files a/public/images/pokemon/exp/back/654.png and b/public/images/pokemon/exp/back/654.png differ diff --git a/public/images/pokemon/exp/back/656.json b/public/images/pokemon/exp/back/656.json index 45c9ae75c29..78a3ae89852 100644 --- a/public/images/pokemon/exp/back/656.json +++ b/public/images/pokemon/exp/back/656.json @@ -1,1007 +1,713 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 34 - }, - "frame": { - "x": 35, - "y": 0, - "w": 35, - "h": 34 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 0, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 35, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 35, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 35, - "y": 34, - "w": 35, - "h": 33 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 35, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 35, - "h": 33 - }, - "frame": { - "x": 35, - "y": 34, - "w": 35, - "h": 33 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a0be6653f39ddbef185db62f993cae42:d1b80f97b079891e5ee3e04a05cb932f:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 200 + }, + { + "filename": "0057.png", + "frame": { "x": 67, "y": 1, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 33, "h": 38 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 1, "w": 31, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 31, "h": 41 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 34, "y": 1, "w": 31, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 31, "h": 41 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 102, "y": 1, "w": 31, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 31, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 167, "y": 1, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 30, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 167, "y": 80, "w": 30, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 30, "h": 39 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 67, "y": 41, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 30, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 135, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 30, "h": 41 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 99, "y": 43, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 30, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 1, "y": 155, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 107, "y": 189, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 32, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 1, "y": 191, "w": 31, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 16, "w": 31, "h": 31 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 69, "y": 190, "w": 31, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 31, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 35, "y": 188, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 750 + }, + { + "filename": "0071.png", + "frame": { "x": 145, "y": 121, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 117, "w": 32, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 36 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 107, "y": 152, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 1, "y": 44, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 131, "y": 44, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 202, "h": 224 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/656.png b/public/images/pokemon/exp/back/656.png index 3a7b6fcec5c..9e98534aab2 100644 Binary files a/public/images/pokemon/exp/back/656.png and b/public/images/pokemon/exp/back/656.png differ diff --git a/public/images/pokemon/exp/back/657.png b/public/images/pokemon/exp/back/657.png index 7484a85289c..72e8367e10d 100644 Binary files a/public/images/pokemon/exp/back/657.png and b/public/images/pokemon/exp/back/657.png differ diff --git a/public/images/pokemon/exp/back/658-ash.json b/public/images/pokemon/exp/back/658-ash.json index 9c2e394a89d..8e360497b8d 100644 --- a/public/images/pokemon/exp/back/658-ash.json +++ b/public/images/pokemon/exp/back/658-ash.json @@ -1,188 +1,155 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 75, - "y": 62, - "w": 75, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0121f3850f8a57a4a046524a1a5974dd:168ffc856b6fea872641e8672304766c:f09eeed5adc5ec50aec50218e03662c2$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658-ash.png", + "format": "I8", + "size": { "w": 146, "h": 146 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/658-ash.png b/public/images/pokemon/exp/back/658-ash.png index 8921ea65270..5d8794a1c0f 100644 Binary files a/public/images/pokemon/exp/back/658-ash.png and b/public/images/pokemon/exp/back/658-ash.png differ diff --git a/public/images/pokemon/exp/back/658.json b/public/images/pokemon/exp/back/658.json index 2fa50a7d23f..453f6c16dc6 100644 --- a/public/images/pokemon/exp/back/658.json +++ b/public/images/pokemon/exp/back/658.json @@ -1,188 +1,92 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:63845d55db2350ed7cd6956836dc9510:7129df11a518cdd74572c2016d5f8ed8:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 77, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 77, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658.png", + "format": "I8", + "size": { "w": 154, "h": 154 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/658.png b/public/images/pokemon/exp/back/658.png index edcfa15b9f3..07b9084c43e 100644 Binary files a/public/images/pokemon/exp/back/658.png and b/public/images/pokemon/exp/back/658.png differ diff --git a/public/images/pokemon/exp/back/661.json b/public/images/pokemon/exp/back/661.json index 5ccc4bdde31..be82a4ce425 100644 --- a/public/images/pokemon/exp/back/661.json +++ b/public/images/pokemon/exp/back/661.json @@ -1,356 +1,398 @@ -{ - "textures": [ - { - "image": "661.png", - "format": "RGBA8888", - "size": { - "w": 68, - "h": 68 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 34, - "w": 32, - "h": 34 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:64046aa714277f415100be681fde9148:1306649eb47cc5be6e5f0b266b6c13ae:186d621a544ea0e0e2e0bd57975a29b1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 39, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0004.png", + "frame": { "x": 105, "y": 36, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0005.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0006.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0007.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0008.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0011.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0013.png", + "frame": { "x": 34, "y": 40, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0014.png", + "frame": { "x": 69, "y": 37, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0015.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0016.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0017.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0018.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0021.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0023.png", + "frame": { "x": 34, "y": 40, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0024.png", + "frame": { "x": 69, "y": 37, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0025.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0026.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0027.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0028.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0031.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0032.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0033.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0034.png", + "frame": { "x": 101, "y": 112, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 34, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0035.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0036.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0037.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0038.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0039.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0040.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0041.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0042.png", + "frame": { "x": 104, "y": 74, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 34, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0043.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "661.png", + "format": "I8", + "size": { "w": 142, "h": 156 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/661.png b/public/images/pokemon/exp/back/661.png index 8ab845902d1..67d9bb04293 100644 Binary files a/public/images/pokemon/exp/back/661.png and b/public/images/pokemon/exp/back/661.png differ diff --git a/public/images/pokemon/exp/back/662.json b/public/images/pokemon/exp/back/662.json index e854c2b896c..52cc70bbe5d 100644 --- a/public/images/pokemon/exp/back/662.json +++ b/public/images/pokemon/exp/back/662.json @@ -1,671 +1,254 @@ -{ - "textures": [ - { - "image": "662.png", - "format": "RGBA8888", - "size": { - "w": 154, - "h": 154 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 56, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 56, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 105, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 105, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:66c0226d9868b335d6f9adbc58ca011b:9d85ba89536227407c6480dea06dad13:e3da2dd0277c18bcc713dc6dd2460c87$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 70, "w": 53, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 16, "w": 53, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 212, "y": 70, "w": 52, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 18, "w": 52, "h": 63 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 247, "y": 204, "w": 46, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 36, "w": 46, "h": 51 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 1, "y": 196, "w": 49, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 33, "w": 49, "h": 49 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 56, "y": 1, "w": 56, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 56, "h": 65 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 224, "y": 1, "w": 52, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 52, "h": 68 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 107, "y": 68, "w": 48, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 48, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 277, "y": 1, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 51, "h": 68 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 113, "y": 1, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 18, "w": 55, "h": 66 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 48, "y": 249, "w": 44, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 31, "w": 44, "h": 50 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 191, "y": 248, "w": 47, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 27, "w": 47, "h": 49 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 169, "y": 1, "w": 54, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 54, "h": 67 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 101, "y": 208, "w": 45, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 18, "w": 45, "h": 51 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 246, "w": 46, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 46, "h": 51 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 1, "y": 1, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 56, "y": 67, "w": 50, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 50, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 265, "y": 70, "w": 47, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 47, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 102, "y": 138, "w": 44, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 11, "w": 44, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 147, "y": 193, "w": 43, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 43, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 191, "y": 199, "w": 55, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 31, "w": 55, "h": 48 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 51, "y": 200, "w": 49, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 27, "w": 49, "h": 48 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 156, "y": 69, "w": 55, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 55, "h": 60 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 133, "w": 50, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 50, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 208, "y": 134, "w": 48, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 48, "h": 64 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 257, "y": 140, "w": 48, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 48, "h": 63 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 52, "y": 137, "w": 49, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 49, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 156, "y": 130, "w": 51, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 13, "w": 51, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "662.png", + "format": "I8", + "size": { "w": 329, "h": 300 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/662.png b/public/images/pokemon/exp/back/662.png index e2a3111062f..39a9e8e53ad 100644 Binary files a/public/images/pokemon/exp/back/662.png and b/public/images/pokemon/exp/back/662.png differ diff --git a/public/images/pokemon/exp/back/663.json b/public/images/pokemon/exp/back/663.json index 83f5b7ddc42..48526624362 100644 --- a/public/images/pokemon/exp/back/663.json +++ b/public/images/pokemon/exp/back/663.json @@ -1,587 +1,731 @@ -{ - "textures": [ - { - "image": "663.png", - "format": "RGBA8888", - "size": { - "w": 226, - "h": 226 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 93 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 93, - "w": 90, - "h": 93 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 93, - "w": 90, - "h": 93 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 93, - "w": 90, - "h": 93 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 93 - }, - "frame": { - "x": 0, - "y": 93, - "w": 90, - "h": 93 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 92 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 92 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 92 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 92 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 92 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 92 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 92 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 92 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 6, - "y": 19, - "w": 84, - "h": 62 - }, - "frame": { - "x": 90, - "y": 92, - "w": 84, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 6, - "y": 19, - "w": 84, - "h": 62 - }, - "frame": { - "x": 90, - "y": 92, - "w": 84, - "h": 62 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 6, - "y": 19, - "w": 84, - "h": 62 - }, - "frame": { - "x": 90, - "y": 92, - "w": 84, - "h": 62 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 6, - "y": 19, - "w": 84, - "h": 62 - }, - "frame": { - "x": 90, - "y": 92, - "w": 84, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 10, - "y": 24, - "w": 80, - "h": 72 - }, - "frame": { - "x": 90, - "y": 154, - "w": 80, - "h": 72 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 10, - "y": 24, - "w": 80, - "h": 72 - }, - "frame": { - "x": 90, - "y": 154, - "w": 80, - "h": 72 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 10, - "y": 24, - "w": 80, - "h": 72 - }, - "frame": { - "x": 90, - "y": 154, - "w": 80, - "h": 72 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 96 - }, - "spriteSourceSize": { - "x": 10, - "y": 24, - "w": 80, - "h": 72 - }, - "frame": { - "x": 90, - "y": 154, - "w": 80, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e8559a9780e93da88e5a990643c22bc0:3bdf9c50c7e3aa9ed9acc8477ddf312d:3790d8d72a704a789cc594688d98802e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0003.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0004.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0006.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0008.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0009.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0010.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0013.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0014.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0016.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0018.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0019.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0020.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0023.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0024.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0026.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0028.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0029.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0030.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0033.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0034.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0036.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0038.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0039.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0040.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0043.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0044.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0046.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0048.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0049.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0050.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0053.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0054.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0056.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0058.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0059.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0060.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0062.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0065.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0067.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0070.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0072.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0075.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0077.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0080.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "663.png", + "format": "I8", + "size": { "w": 388, "h": 212 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/663.png b/public/images/pokemon/exp/back/663.png index d241c8be871..6b49fc0a803 100644 Binary files a/public/images/pokemon/exp/back/663.png and b/public/images/pokemon/exp/back/663.png differ diff --git a/public/images/pokemon/exp/back/664.json b/public/images/pokemon/exp/back/664.json index 10da9db36bd..61c85d30239 100644 --- a/public/images/pokemon/exp/back/664.json +++ b/public/images/pokemon/exp/back/664.json @@ -1,104 +1,110 @@ -{ - "textures": [ - { - "image": "664.png", - "format": "RGBA8888", - "size": { - "w": 72, - "h": 72 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - }, - "frame": { - "x": 24, - "y": 0, - "w": 24, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 24, - "h": 42 - }, - "frame": { - "x": 48, - "y": 0, - "w": 24, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7fc62d03764cbb44c78d222a8281c03b:59a11cbddf36944dc23f528022e71fc9:596e7d5b15b1bf041c4d7f6707c8ff49$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 54, "y": 49, "w": 26, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 26, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 80, "y": 96, "w": 26, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 26, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 97, "w": 26, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 26, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 49, "w": 27, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 27, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 26, "y": 97, "w": 26, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 47 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 80, "y": 49, "w": 27, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 27, "h": 47 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 27, "y": 49, "w": 27, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 27, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 28, "y": 0, "w": 27, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 55, "y": 0, "w": 27, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 28, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 82, "y": 0, "w": 27, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 27, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "664.png", + "format": "I8", + "size": { "w": 109, "h": 145 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/664.png b/public/images/pokemon/exp/back/664.png index 30664a6aaf1..a8f0906c60d 100644 Binary files a/public/images/pokemon/exp/back/664.png and b/public/images/pokemon/exp/back/664.png differ diff --git a/public/images/pokemon/exp/back/665.json b/public/images/pokemon/exp/back/665.json index 320219545d9..6e713a69311 100644 --- a/public/images/pokemon/exp/back/665.json +++ b/public/images/pokemon/exp/back/665.json @@ -1,104 +1,596 @@ -{ - "textures": [ - { - "image": "665.png", - "format": "RGBA8888", - "size": { - "w": 75, - "h": 75 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 36 - }, - "frame": { - "x": 38, - "y": 0, - "w": 37, - "h": 36 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 0, - "y": 36, - "w": 38, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9899654837114efa492ec85d06cd415a:0050d8b3ae2b780795145dd4beb4e6bb:a72e6c94514c750d7462eab6b08ee591$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 160, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 290, "y": 67, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 160, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 47, "y": 40, "w": 39, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 5, "w": 39, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 343, "y": 34, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 5, "w": 45, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 227, "y": 33, "w": 63, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 63, "h": 36 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 0, "w": 74, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 74, "h": 40 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 154, "y": 0, "w": 81, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 81, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 235, "y": 0, "w": 81, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 81, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 0, "w": 80, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 80, "h": 38 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 154, "y": 33, "w": 73, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 73, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 316, "y": 0, "w": 73, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 73, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 290, "y": 34, "w": 53, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 7, "w": 53, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 38, "w": 47, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 7, "w": 47, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 86, "y": 40, "w": 40, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 40, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 101, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 34, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 36, "y": 75, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 194, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 228, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 324, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "665.png", + "format": "I8", + "size": { "w": 394, "h": 134 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/665.png b/public/images/pokemon/exp/back/665.png index 1cb4789e140..c989771bc5f 100644 Binary files a/public/images/pokemon/exp/back/665.png and b/public/images/pokemon/exp/back/665.png differ diff --git a/public/images/pokemon/exp/back/666-archipelago.json b/public/images/pokemon/exp/back/666-archipelago.json index bc4abf95a6d..817696f70a1 100644 --- a/public/images/pokemon/exp/back/666-archipelago.json +++ b/public/images/pokemon/exp/back/666-archipelago.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-archipelago.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223e2a75aa192f3fb67e18f7f0d6c4c7:ba854fe0d08f005e9aa52e55cdc7eb4e:80cdb6dd219378a41ccf5c2acc7e7786$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-archipelago.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-archipelago.png b/public/images/pokemon/exp/back/666-archipelago.png index 83622bd976f..f83b645e0fe 100644 Binary files a/public/images/pokemon/exp/back/666-archipelago.png and b/public/images/pokemon/exp/back/666-archipelago.png differ diff --git a/public/images/pokemon/exp/back/666-continental.json b/public/images/pokemon/exp/back/666-continental.json index d0cd7359c88..fc21deb6978 100644 --- a/public/images/pokemon/exp/back/666-continental.json +++ b/public/images/pokemon/exp/back/666-continental.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-continental.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:89725e18f2e4d97217076ac82b40230b:c83c3d03ad1200fc71d95ecafb54bc03:23aaac2256d564b9d8a58d7de70397c3$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-continental.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-continental.png b/public/images/pokemon/exp/back/666-continental.png index 21447191338..f1a4cf5a2a4 100644 Binary files a/public/images/pokemon/exp/back/666-continental.png and b/public/images/pokemon/exp/back/666-continental.png differ diff --git a/public/images/pokemon/exp/back/666-elegant.json b/public/images/pokemon/exp/back/666-elegant.json index c44ea10f7dd..35c20315153 100644 --- a/public/images/pokemon/exp/back/666-elegant.json +++ b/public/images/pokemon/exp/back/666-elegant.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-elegant.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-elegant.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-elegant.png b/public/images/pokemon/exp/back/666-elegant.png index 3187d681140..2a75c09b505 100644 Binary files a/public/images/pokemon/exp/back/666-elegant.png and b/public/images/pokemon/exp/back/666-elegant.png differ diff --git a/public/images/pokemon/exp/back/666-fancy.json b/public/images/pokemon/exp/back/666-fancy.json index 657c29e99ee..54113df4b51 100644 --- a/public/images/pokemon/exp/back/666-fancy.json +++ b/public/images/pokemon/exp/back/666-fancy.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-fancy.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:570d1bf9b987c1bf5ebfe39e485464dd:a3c8bebd39c1c84b1bf0fdf600026ea5:6d5edff9a806f43feff031c9919c9aca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-fancy.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-fancy.png b/public/images/pokemon/exp/back/666-fancy.png index 9f9f9c42e80..f7da62d0637 100644 Binary files a/public/images/pokemon/exp/back/666-fancy.png and b/public/images/pokemon/exp/back/666-fancy.png differ diff --git a/public/images/pokemon/exp/back/666-garden.json b/public/images/pokemon/exp/back/666-garden.json index 763dd125a5c..4fcc5ab0ad1 100644 --- a/public/images/pokemon/exp/back/666-garden.json +++ b/public/images/pokemon/exp/back/666-garden.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-garden.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-garden.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-garden.png b/public/images/pokemon/exp/back/666-garden.png index 47a9a27e790..35e0dd02087 100644 Binary files a/public/images/pokemon/exp/back/666-garden.png and b/public/images/pokemon/exp/back/666-garden.png differ diff --git a/public/images/pokemon/exp/back/666-high-plains.json b/public/images/pokemon/exp/back/666-high-plains.json index 90101dd98ba..56a90a01899 100644 --- a/public/images/pokemon/exp/back/666-high-plains.json +++ b/public/images/pokemon/exp/back/666-high-plains.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-high-plains.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:410c759185f779797422e8f2ce55db4f:6afd0d04b6138fdd57d12681e967b48c:2abdb5d19b2754e3daa24b6ff3ed2c2c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-high-plains.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-high-plains.png b/public/images/pokemon/exp/back/666-high-plains.png index 7b06fcc8040..7b84c4ebac3 100644 Binary files a/public/images/pokemon/exp/back/666-high-plains.png and b/public/images/pokemon/exp/back/666-high-plains.png differ diff --git a/public/images/pokemon/exp/back/666-icy-snow.json b/public/images/pokemon/exp/back/666-icy-snow.json index 17e6e3be8ef..b44f33bb07f 100644 --- a/public/images/pokemon/exp/back/666-icy-snow.json +++ b/public/images/pokemon/exp/back/666-icy-snow.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-icy-snow.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9f47e6de00b727163c2ffb6870af9c6b:16bfd68007c3798294c7d690e075f679:fb1e8b97806dc5c60ac6adf0ae48199b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-icy-snow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-icy-snow.png b/public/images/pokemon/exp/back/666-icy-snow.png index b34659ded51..332e96a6d61 100644 Binary files a/public/images/pokemon/exp/back/666-icy-snow.png and b/public/images/pokemon/exp/back/666-icy-snow.png differ diff --git a/public/images/pokemon/exp/back/666-jungle.json b/public/images/pokemon/exp/back/666-jungle.json index b2ffdb768e6..51876d649da 100644 --- a/public/images/pokemon/exp/back/666-jungle.json +++ b/public/images/pokemon/exp/back/666-jungle.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-jungle.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d8913bd65ce0b63c5354717532a7d60:39392afb8d9fb30f37b8d68b6cd368ad:c8686bcc5493911384853d54c85bfea1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-jungle.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-jungle.png b/public/images/pokemon/exp/back/666-jungle.png index 8e72fdd3af6..291c6bce18c 100644 Binary files a/public/images/pokemon/exp/back/666-jungle.png and b/public/images/pokemon/exp/back/666-jungle.png differ diff --git a/public/images/pokemon/exp/back/666-marine.json b/public/images/pokemon/exp/back/666-marine.json index 6f4be700dfc..18edbc78ec0 100644 --- a/public/images/pokemon/exp/back/666-marine.json +++ b/public/images/pokemon/exp/back/666-marine.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-marine.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-marine.png", + "format": "RGBA8888", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-marine.png b/public/images/pokemon/exp/back/666-marine.png index 91c5b1be983..9e644f0cdaa 100644 Binary files a/public/images/pokemon/exp/back/666-marine.png and b/public/images/pokemon/exp/back/666-marine.png differ diff --git a/public/images/pokemon/exp/back/666-meadow.json b/public/images/pokemon/exp/back/666-meadow.json index 737ccd7c848..0f24040bd0d 100644 --- a/public/images/pokemon/exp/back/666-meadow.json +++ b/public/images/pokemon/exp/back/666-meadow.json @@ -1,524 +1,118 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:49698fe6f96ff24d2fe1c7a365f79f1b:f15ccef05dfd7ebb03ac6c66ae05dcef:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-meadow.png b/public/images/pokemon/exp/back/666-meadow.png index d7d63b3098f..fabeb9730db 100644 Binary files a/public/images/pokemon/exp/back/666-meadow.png and b/public/images/pokemon/exp/back/666-meadow.png differ diff --git a/public/images/pokemon/exp/back/666-modern.json b/public/images/pokemon/exp/back/666-modern.json index a57b695d10b..e0a00da6d81 100644 --- a/public/images/pokemon/exp/back/666-modern.json +++ b/public/images/pokemon/exp/back/666-modern.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-modern.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-modern.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-modern.png b/public/images/pokemon/exp/back/666-modern.png index 689876c3d6d..01a3981dd97 100644 Binary files a/public/images/pokemon/exp/back/666-modern.png and b/public/images/pokemon/exp/back/666-modern.png differ diff --git a/public/images/pokemon/exp/back/666-monsoon.json b/public/images/pokemon/exp/back/666-monsoon.json index 3afda85f798..117fad03b83 100644 --- a/public/images/pokemon/exp/back/666-monsoon.json +++ b/public/images/pokemon/exp/back/666-monsoon.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-monsoon.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-monsoon.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-monsoon.png b/public/images/pokemon/exp/back/666-monsoon.png index e3cb4d2dca7..32cf2331411 100644 Binary files a/public/images/pokemon/exp/back/666-monsoon.png and b/public/images/pokemon/exp/back/666-monsoon.png differ diff --git a/public/images/pokemon/exp/back/666-ocean.json b/public/images/pokemon/exp/back/666-ocean.json index f0785703906..8d23d70cd31 100644 --- a/public/images/pokemon/exp/back/666-ocean.json +++ b/public/images/pokemon/exp/back/666-ocean.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-ocean.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-ocean.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-ocean.png b/public/images/pokemon/exp/back/666-ocean.png index f60844a9b87..65665ea56c3 100644 Binary files a/public/images/pokemon/exp/back/666-ocean.png and b/public/images/pokemon/exp/back/666-ocean.png differ diff --git a/public/images/pokemon/exp/back/666-poke-ball.json b/public/images/pokemon/exp/back/666-poke-ball.json index ed04a06e7ab..45564e59a32 100644 --- a/public/images/pokemon/exp/back/666-poke-ball.json +++ b/public/images/pokemon/exp/back/666-poke-ball.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-poke-ball.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-poke-ball.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-poke-ball.png b/public/images/pokemon/exp/back/666-poke-ball.png index eb3053e9434..895a2bf680f 100644 Binary files a/public/images/pokemon/exp/back/666-poke-ball.png and b/public/images/pokemon/exp/back/666-poke-ball.png differ diff --git a/public/images/pokemon/exp/back/666-polar.json b/public/images/pokemon/exp/back/666-polar.json index 4618d891d3f..abb6d0286f4 100644 --- a/public/images/pokemon/exp/back/666-polar.json +++ b/public/images/pokemon/exp/back/666-polar.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-polar.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3b0453f2d03b9c62472f57a438298a4:81a5a3455ae0c378bdb1dbe3c3323463:eb7086e98f867c6592e4b161835da18b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-polar.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-polar.png b/public/images/pokemon/exp/back/666-polar.png index 5d09b57833c..c7ec3ec550a 100644 Binary files a/public/images/pokemon/exp/back/666-polar.png and b/public/images/pokemon/exp/back/666-polar.png differ diff --git a/public/images/pokemon/exp/back/666-river.json b/public/images/pokemon/exp/back/666-river.json index c4e5274ab6d..28912532d76 100644 --- a/public/images/pokemon/exp/back/666-river.json +++ b/public/images/pokemon/exp/back/666-river.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-river.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2bb6d375761e6690eba12cf4d2bc99c9:9db30ec1cf68fe8c1026c243086573f3:fa23dc87fc53ba2cfa532cf440553cf5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-river.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-river.png b/public/images/pokemon/exp/back/666-river.png index 2910340b676..4e0493b8de5 100644 Binary files a/public/images/pokemon/exp/back/666-river.png and b/public/images/pokemon/exp/back/666-river.png differ diff --git a/public/images/pokemon/exp/back/666-sandstorm.json b/public/images/pokemon/exp/back/666-sandstorm.json index cc96c2a2805..99df25242ff 100644 --- a/public/images/pokemon/exp/back/666-sandstorm.json +++ b/public/images/pokemon/exp/back/666-sandstorm.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-sandstorm.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 0, - "w": 40, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 68, - "w": 40, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e35abed8cd9d0bbf1556fa684995d930:8d765a06a769bbf3d1639f361548cd6f:12f47e779927411662912d6094a9782d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-sandstorm.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-sandstorm.png b/public/images/pokemon/exp/back/666-sandstorm.png index 96d7084eb30..d95ab4413a5 100644 Binary files a/public/images/pokemon/exp/back/666-sandstorm.png and b/public/images/pokemon/exp/back/666-sandstorm.png differ diff --git a/public/images/pokemon/exp/back/666-savanna.json b/public/images/pokemon/exp/back/666-savanna.json index 8f85dfdeb13..8fa326da1b4 100644 --- a/public/images/pokemon/exp/back/666-savanna.json +++ b/public/images/pokemon/exp/back/666-savanna.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-savanna.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1ad0c7c841409c3fd4cb50b399d6e13c:b9406b41d37bc72c57260f9a01a352c8:625a4f0dc001069326a75c6a381f93e6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-savanna.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-savanna.png b/public/images/pokemon/exp/back/666-savanna.png index 7254d0f1f61..4169b1325a6 100644 Binary files a/public/images/pokemon/exp/back/666-savanna.png and b/public/images/pokemon/exp/back/666-savanna.png differ diff --git a/public/images/pokemon/exp/back/666-sun.json b/public/images/pokemon/exp/back/666-sun.json index df795f0ef0c..d41f22f541c 100644 --- a/public/images/pokemon/exp/back/666-sun.json +++ b/public/images/pokemon/exp/back/666-sun.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-sun.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1d3a140bac5951725915aa0b64d1fdc6:e322510cf8386dcc7834a05d57e5368e:8f5fdd0a698701f5391c5a3f67e303d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-sun.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-sun.png b/public/images/pokemon/exp/back/666-sun.png index 84b9d76ef88..5cc814e82d7 100644 Binary files a/public/images/pokemon/exp/back/666-sun.png and b/public/images/pokemon/exp/back/666-sun.png differ diff --git a/public/images/pokemon/exp/back/666-tundra.json b/public/images/pokemon/exp/back/666-tundra.json index 92e5cf92e07..afa574f9e07 100644 --- a/public/images/pokemon/exp/back/666-tundra.json +++ b/public/images/pokemon/exp/back/666-tundra.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-tundra.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:40f74f8757cb0f5a2ab7b5f68ea979a0:d062f67571674668b47f6fab68361105:9779ed3adebc298af537dd64dc25fe00$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-tundra.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/666-tundra.png b/public/images/pokemon/exp/back/666-tundra.png index 393ea113766..01657b339fd 100644 Binary files a/public/images/pokemon/exp/back/666-tundra.png and b/public/images/pokemon/exp/back/666-tundra.png differ diff --git a/public/images/pokemon/exp/back/667.json b/public/images/pokemon/exp/back/667.json index cfe6b109d70..db9918ea230 100644 --- a/public/images/pokemon/exp/back/667.json +++ b/public/images/pokemon/exp/back/667.json @@ -1,125 +1,659 @@ -{ - "textures": [ - { - "image": "667.png", - "format": "RGBA8888", - "size": { - "w": 115, - "h": 115 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 39, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 39, - "h": 41 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 41 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 39, - "y": 41, - "w": 38, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 77, - "y": 41, - "w": 38, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0515d906bdf1ec3ad533ac13c4e701ec:195a93073ecc7446c747c2e79ae07d54:02171d511e760c8a3e1b623ad6bf93f5$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0066.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0068.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0070.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0071.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0072.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "667.png", + "format": "I8", + "size": { "w": 167, "h": 138 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/667.png b/public/images/pokemon/exp/back/667.png index ef7ea964737..f1209cf8e20 100644 Binary files a/public/images/pokemon/exp/back/667.png and b/public/images/pokemon/exp/back/667.png differ diff --git a/public/images/pokemon/exp/back/668.json b/public/images/pokemon/exp/back/668.json index 1e37573828e..594e69189dc 100644 --- a/public/images/pokemon/exp/back/668.json +++ b/public/images/pokemon/exp/back/668.json @@ -1,146 +1,821 @@ -{ - "textures": [ - { - "image": "668.png", - "format": "RGBA8888", - "size": { - "w": 146, - "h": 146 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 73, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 73, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 73, - "h": 60 - }, - "frame": { - "x": 0, - "y": 61, - "w": 73, - "h": 60 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 73, - "h": 60 - }, - "frame": { - "x": 0, - "y": 61, - "w": 73, - "h": 60 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 72, - "h": 59 - }, - "frame": { - "x": 73, - "y": 61, - "w": 72, - "h": 59 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bc67ee0b37e5c8a13762178a52fad862:1ee199920770bc5797feb94424ff9f9a:947bf84d1af493c62e2cef45bb6c19ad$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 458, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 303, "y": 364, "w": 74, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 227, "y": 294, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 378, "y": 364, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 75, "h": 69 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 303, "y": 293, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 379, "y": 293, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 454, "y": 364, "w": 72, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 72, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 70, "y": 365, "w": 68, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 68, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 291, "y": 435, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 378, "y": 434, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 224, "y": 365, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 66, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 365, "w": 69, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 69, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 229, "y": 220, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 73, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 468, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 308, "y": 147, "w": 74, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 74, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 148, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 383, "y": 220, "w": 74, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 74, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 231, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 79, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 156, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 310, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 464, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 77, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 154, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 76, "y": 220, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 152, "y": 220, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 76, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 221, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 293, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 75, "y": 293, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668.png", + "format": "I8", + "size": { "w": 543, "h": 507 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/668.png b/public/images/pokemon/exp/back/668.png index a8384e5cf3c..e600e3e40e1 100644 Binary files a/public/images/pokemon/exp/back/668.png and b/public/images/pokemon/exp/back/668.png differ diff --git a/public/images/pokemon/exp/back/672.json b/public/images/pokemon/exp/back/672.json index e323b585879..f877b9abc2e 100644 --- a/public/images/pokemon/exp/back/672.json +++ b/public/images/pokemon/exp/back/672.json @@ -1,965 +1,479 @@ -{ - "textures": [ - { - "image": "672.png", - "format": "RGBA8888", - "size": { - "w": 282, - "h": 282 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 168, - "w": 41, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 210, - "w": 41, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 82, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 123, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 164, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 205, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 168, - "w": 41, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 209, - "w": 41, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 123, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 164, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 205, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 83, - "w": 41, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 124, - "w": 41, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 165, - "w": 40, - "h": 42 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 207, - "w": 40, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 124, - "w": 40, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 163, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 163, - "y": 124, - "w": 41, - "h": 40 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 203, - "y": 83, - "w": 41, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 164, - "w": 40, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 204, - "y": 123, - "w": 40, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 163, - "w": 40, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 203, - "w": 40, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 204, - "w": 40, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b36f1de558a8fa8ac8b56a9ba43a0dfd:5fe84a3f522e543bfbbfe0837355266b:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 39, "y": 0, "w": 39, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 39, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 39, "h": 56 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 79, "y": 146, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 119, "y": 146, "w": 38, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 38, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 39, "y": 0, "w": 39, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 39, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 39, "h": 56 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 79, "y": 146, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 119, "y": 146, "w": 38, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 38, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "672.png", + "format": "I8", + "size": { "w": 160, "h": 195 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/672.png b/public/images/pokemon/exp/back/672.png index 5281168ec2e..ef5cf63938e 100644 Binary files a/public/images/pokemon/exp/back/672.png and b/public/images/pokemon/exp/back/672.png differ diff --git a/public/images/pokemon/exp/back/674.json b/public/images/pokemon/exp/back/674.json deleted file mode 100644 index 9ace3fec70f..00000000000 --- a/public/images/pokemon/exp/back/674.json +++ /dev/null @@ -1,1175 +0,0 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 124, - "h": 124 - }, - "scale": 1, - "frames": [ - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 29, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 29, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 29, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 29, - "h": 40 - }, - "frame": { - "x": 29, - "y": 42, - "w": 29, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 29, - "h": 40 - }, - "frame": { - "x": 29, - "y": 42, - "w": 29, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 29, - "y": 82, - "w": 28, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 85, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 86, - "y": 42, - "w": 28, - "h": 41 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 86, - "y": 42, - "w": 28, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 86, - "y": 42, - "w": 28, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:25c10f058ffdfacdf8263d7198233227:17e793a518166b0f2a1f8af6ec7b8dd7:b823d10f1c9b4d501296982088ba63d6$" - } -} diff --git a/public/images/pokemon/exp/back/674.png b/public/images/pokemon/exp/back/674.png deleted file mode 100644 index 69d9e886150..00000000000 Binary files a/public/images/pokemon/exp/back/674.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/682.png b/public/images/pokemon/exp/back/682.png index 9f713bfb828..d926cdc22a8 100644 Binary files a/public/images/pokemon/exp/back/682.png and b/public/images/pokemon/exp/back/682.png differ diff --git a/public/images/pokemon/exp/back/683.png b/public/images/pokemon/exp/back/683.png index 76aa9914d20..e65d213eaf2 100644 Binary files a/public/images/pokemon/exp/back/683.png and b/public/images/pokemon/exp/back/683.png differ diff --git a/public/images/pokemon/exp/back/684.png b/public/images/pokemon/exp/back/684.png index a58d2c77eb8..517cc69f8ee 100644 Binary files a/public/images/pokemon/exp/back/684.png and b/public/images/pokemon/exp/back/684.png differ diff --git a/public/images/pokemon/exp/back/685.png b/public/images/pokemon/exp/back/685.png index c791e4e92d7..d05cf54fb63 100644 Binary files a/public/images/pokemon/exp/back/685.png and b/public/images/pokemon/exp/back/685.png differ diff --git a/public/images/pokemon/exp/back/692.json b/public/images/pokemon/exp/back/692.json index 41e845ef9ed..801710c4861 100644 --- a/public/images/pokemon/exp/back/692.json +++ b/public/images/pokemon/exp/back/692.json @@ -1,356 +1,794 @@ -{ - "textures": [ - { - "image": "692.png", - "format": "RGBA8888", - "size": { - "w": 152, - "h": 152 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 39 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 39 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 39 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 39 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 0, - "y": 39, - "w": 51, - "h": 39 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 0, - "y": 39, - "w": 51, - "h": 39 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 0, - "y": 39, - "w": 51, - "h": 39 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 0, - "y": 39, - "w": 51, - "h": 39 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 0, - "y": 78, - "w": 51, - "h": 39 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 0, - "y": 78, - "w": 51, - "h": 39 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 51, - "y": 39, - "w": 51, - "h": 39 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 39 - }, - "frame": { - "x": 51, - "y": 39, - "w": 51, - "h": 39 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 51, - "h": 37 - }, - "frame": { - "x": 51, - "y": 78, - "w": 51, - "h": 37 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 51, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 51, - "h": 37 - }, - "frame": { - "x": 51, - "y": 115, - "w": 51, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4116bfb3ff62a8dd3ed77070dfb17bc8:e9bdb93a4ed57d3e08db360998da889f:2880def858c84cd859bedf13b0b49a33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 60, "y": 72, "w": 58, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 31 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 119, "y": 72, "w": 56, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 31 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 60, "y": 72, "w": 58, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 31 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "692.png", + "format": "I8", + "size": { "w": 181, "h": 106 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/692.png b/public/images/pokemon/exp/back/692.png index 0b3462fe06d..e3eb957a624 100644 Binary files a/public/images/pokemon/exp/back/692.png and b/public/images/pokemon/exp/back/692.png differ diff --git a/public/images/pokemon/exp/back/693.json b/public/images/pokemon/exp/back/693.json index fb29d014658..6358a8908f6 100644 --- a/public/images/pokemon/exp/back/693.json +++ b/public/images/pokemon/exp/back/693.json @@ -1,230 +1,902 @@ -{ - "textures": [ - { - "image": "693.png", - "format": "RGBA8888", - "size": { - "w": 223, - "h": 223 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 72 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 72 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 72 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 72 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 72 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 73 - }, - "frame": { - "x": 0, - "y": 72, - "w": 90, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 73 - }, - "frame": { - "x": 0, - "y": 72, - "w": 90, - "h": 73 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 75 - }, - "frame": { - "x": 90, - "y": 72, - "w": 90, - "h": 75 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 75 - }, - "frame": { - "x": 90, - "y": 72, - "w": 90, - "h": 75 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 76 - }, - "frame": { - "x": 0, - "y": 145, - "w": 90, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 76 - }, - "frame": { - "x": 0, - "y": 145, - "w": 90, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 76 - }, - "frame": { - "x": 90, - "y": 147, - "w": 90, - "h": 76 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f3b26f7df2eeda76e504b3f1294ac699:a2e5c9fc75e286a40f09ab013ac5cb32:9c1f9147e693c05eb4655590e9099679$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 565, "y": 196, "w": 90, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 6, "w": 90, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 278, "y": 266, "w": 90, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 90, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 189, "y": 199, "w": 95, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 95, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 193, "y": 1, "w": 98, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 98, "h": 68 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 1, "y": 136, "w": 94, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 95, "y": 72, "w": 96, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 12, "w": 96, "h": 63 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 381, "y": 1, "w": 97, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 97, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 191, "y": 136, "w": 94, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 95, "y": 135, "w": 96, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 96, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 572, "y": 67, "w": 99, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 99, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 284, "y": 205, "w": 95, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 11, "w": 95, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 1, "y": 199, "w": 91, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 12, "w": 91, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 1, "y": 259, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 12, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 193, "y": 69, "w": 95, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 5, "w": 95, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 285, "y": 141, "w": 92, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 8, "w": 92, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 96, "y": 318, "w": 89, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 14, "w": 89, "h": 58 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 564, "y": 261, "w": 92, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 14, "w": 92, "h": 58 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "693.png", + "format": "I8", + "size": { "w": 672, "h": 377 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/693.png b/public/images/pokemon/exp/back/693.png index a4b89137043..4772c64f8d0 100644 Binary files a/public/images/pokemon/exp/back/693.png and b/public/images/pokemon/exp/back/693.png differ diff --git a/public/images/pokemon/exp/back/694.json b/public/images/pokemon/exp/back/694.json deleted file mode 100644 index d77a3db07e3..00000000000 --- a/public/images/pokemon/exp/back/694.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 130, - "h": 130 - }, - "scale": 1, - "frames": [ - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 35 - }, - "frame": { - "x": 48, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 36 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 36 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 47, - "h": 37 - }, - "frame": { - "x": 47, - "y": 35, - "w": 47, - "h": 37 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 47, - "h": 37 - }, - "frame": { - "x": 47, - "y": 35, - "w": 47, - "h": 37 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 38 - }, - "frame": { - "x": 0, - "y": 71, - "w": 46, - "h": 38 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 38 - }, - "frame": { - "x": 0, - "y": 71, - "w": 46, - "h": 38 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 39 - }, - "frame": { - "x": 46, - "y": 72, - "w": 44, - "h": 39 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 39 - }, - "frame": { - "x": 46, - "y": 72, - "w": 44, - "h": 39 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 40, - "h": 39 - }, - "frame": { - "x": 90, - "y": 72, - "w": 40, - "h": 39 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8940ca5f146f0b24d2aa10692e8e18b0:e6a9f01d7ca698d2b3d7fdf6d9244c8c:b0990f9650cfe63b836cbed33f0b44d8$" - } -} diff --git a/public/images/pokemon/exp/back/694.png b/public/images/pokemon/exp/back/694.png deleted file mode 100644 index d3675e0a9d7..00000000000 Binary files a/public/images/pokemon/exp/back/694.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/697.json b/public/images/pokemon/exp/back/697.json index 9707f931b14..6963da289ab 100644 --- a/public/images/pokemon/exp/back/697.json +++ b/public/images/pokemon/exp/back/697.json @@ -1,1196 +1,992 @@ -{ - "textures": [ - { - "image": "697.png", - "format": "RGBA8888", - "size": { - "w": 374, - "h": 374 - }, - "scale": 1, - "frames": [ - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 63, - "h": 78 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 78 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 63, - "h": 78 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 60, - "h": 78 - }, - "frame": { - "x": 0, - "y": 78, - "w": 60, - "h": 78 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 66, - "h": 77 - }, - "frame": { - "x": 0, - "y": 156, - "w": 66, - "h": 77 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 66, - "h": 77 - }, - "frame": { - "x": 0, - "y": 156, - "w": 66, - "h": 77 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 69, - "h": 76 - }, - "frame": { - "x": 140, - "y": 0, - "w": 69, - "h": 76 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 69, - "h": 76 - }, - "frame": { - "x": 140, - "y": 0, - "w": 69, - "h": 76 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 77, - "h": 73 - }, - "frame": { - "x": 285, - "y": 0, - "w": 77, - "h": 73 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 285, - "y": 73, - "w": 76, - "h": 75 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 72, - "h": 75 - }, - "frame": { - "x": 213, - "y": 75, - "w": 72, - "h": 75 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 72, - "h": 75 - }, - "frame": { - "x": 213, - "y": 75, - "w": 72, - "h": 75 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 74 - }, - "frame": { - "x": 285, - "y": 148, - "w": 76, - "h": 74 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 74 - }, - "frame": { - "x": 285, - "y": 148, - "w": 76, - "h": 74 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 75, - "h": 73 - }, - "frame": { - "x": 151, - "y": 301, - "w": 75, - "h": 73 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 75, - "h": 73 - }, - "frame": { - "x": 151, - "y": 301, - "w": 75, - "h": 73 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 225, - "y": 222, - "w": 74, - "h": 74 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 299, - "y": 222, - "w": 74, - "h": 74 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 299, - "y": 296, - "w": 73, - "h": 74 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5c15a6488ad8d9c5cd58a9490e3f8fe1:9f98e28712fdc6eb5949c7f74cafffeb:f4fdd87d2fc1483d8e0a185c2654e3d9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 370, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 558, "y": 227, "w": 90, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 90, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 376, "w": 88, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 88, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 89, "y": 379, "w": 87, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 87, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 365, "y": 378, "w": 86, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 86, "h": 76 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 640, "y": 449, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 84, "h": 77 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 552, "y": 378, "w": 87, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 87, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 92, "y": 303, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 465, "y": 302, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 186, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 225, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 670, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 93, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 472, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 565, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 670, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 277, "y": 301, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 388, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 97, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 292, "y": 0, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 196, "y": 0, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 582, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 98, "y": 0, "w": 97, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 97, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 0, "w": 97, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 97, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 485, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 388, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 75, "w": 96, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 96, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 286, "y": 76, "w": 95, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 95, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 670, "y": 76, "w": 95, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 95, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 658, "y": 226, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 94, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 191, "y": 76, "w": 94, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 94, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 279, "y": 226, "w": 93, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 93, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 679, "y": 0, "w": 94, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 94, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 482, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 576, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 379, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "697.png", + "format": "I8", + "size": { "w": 773, "h": 526 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/697.png b/public/images/pokemon/exp/back/697.png index 44a73042829..f0ae22f2bb0 100644 Binary files a/public/images/pokemon/exp/back/697.png and b/public/images/pokemon/exp/back/697.png differ diff --git a/public/images/pokemon/exp/back/698.json b/public/images/pokemon/exp/back/698.json deleted file mode 100644 index 01e3235cc36..00000000000 --- a/public/images/pokemon/exp/back/698.json +++ /dev/null @@ -1,3296 +0,0 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 181, - "h": 181 - }, - "scale": 1, - "frames": [ - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:47af8de4c4888204d35a4e17ac074ed2:4f5193840bb62c79e8f9d414f094a882:198087d69fed44d4a642fa3ba5c077d6$" - } -} diff --git a/public/images/pokemon/exp/back/698.png b/public/images/pokemon/exp/back/698.png deleted file mode 100644 index 6250dc0110f..00000000000 Binary files a/public/images/pokemon/exp/back/698.png and /dev/null 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/700.json b/public/images/pokemon/exp/back/700.json index 8919ba29366..70083de61c9 100644 --- a/public/images/pokemon/exp/back/700.json +++ b/public/images/pokemon/exp/back/700.json @@ -1,209 +1,587 @@ -{ - "textures": [ - { - "image": "700.png", - "format": "RGBA8888", - "size": { - "w": 173, - "h": 173 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 44, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 57 - }, - "frame": { - "x": 0, - "y": 116, - "w": 44, - "h": 57 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 44, - "y": 0, - "w": 44, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 88, - "y": 0, - "w": 44, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 88, - "y": 0, - "w": 44, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 44, - "y": 58, - "w": 44, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 56 - }, - "frame": { - "x": 44, - "y": 116, - "w": 44, - "h": 56 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 58 - }, - "frame": { - "x": 88, - "y": 58, - "w": 44, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e0cdfdc055c08cdcb7b31d0da301c709:2affc6f4613ab8f1ba13cd35d9106bb3:2e4bf5ef1f19e475073f7da10c60b540$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 142, "y": 124, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 101, "y": 0, "w": 48, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 48, "h": 63 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 195, "y": 0, "w": 49, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 49, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 60, "w": 49, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 49, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 53, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 148, "y": 64, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 195, "y": 60, "w": 47, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 47, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 194, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 96, "y": 122, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 195, "y": 60, "w": 47, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 47, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 194, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 96, "y": 122, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 149, "y": 0, "w": 46, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 46, "h": 64 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 53, "y": 0, "w": 48, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 48, "h": 64 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 142, "y": 124, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "700.png", + "format": "I8", + "size": { "w": 244, "h": 241 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/700.png b/public/images/pokemon/exp/back/700.png index 6684e845a39..a3675cc15d8 100644 Binary files a/public/images/pokemon/exp/back/700.png and b/public/images/pokemon/exp/back/700.png differ diff --git a/public/images/pokemon/exp/back/702.json b/public/images/pokemon/exp/back/702.json index 7fa99d3eb04..9680e17e397 100644 --- a/public/images/pokemon/exp/back/702.json +++ b/public/images/pokemon/exp/back/702.json @@ -1,1028 +1,443 @@ -{ - "textures": [ - { - "image": "702.png", - "format": "RGBA8888", - "size": { - "w": 141, - "h": 141 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 105, - "w": 47, - "h": 35 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 94, - "y": 0, - "w": 47, - "h": 34 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 47, - "y": 104, - "w": 47, - "h": 32 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4052cb31e311daed50c3ad98d6d07226:990695ce3fc0717eec42d716a52de75e:ba8fdab405d5efab99c4aa1084328e6b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 142, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 140, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 72, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 36, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "702.png", + "format": "I8", + "size": { "w": 188, "h": 103 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/702.png b/public/images/pokemon/exp/back/702.png index be5cf42476b..2305dd44628 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/703.json b/public/images/pokemon/exp/back/703.json deleted file mode 100644 index dc39d04326d..00000000000 --- a/public/images/pokemon/exp/back/703.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 110, - "h": 110 - }, - "scale": 1, - "frames": [ - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 36, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 36, - "h": 39 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 39 - }, - "frame": { - "x": 36, - "y": 0, - "w": 37, - "h": 39 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 37, - "h": 40 - }, - "frame": { - "x": 73, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 37, - "h": 40 - }, - "frame": { - "x": 73, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 73, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 37, - "h": 40 - }, - "frame": { - "x": 73, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 37, - "h": 40 - }, - "frame": { - "x": 73, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 37, - "h": 40 - }, - "frame": { - "x": 73, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 40 - }, - "frame": { - "x": 73, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 9, - "w": 37, - "h": 40 - }, - "frame": { - "x": 0, - "y": 39, - "w": 37, - "h": 40 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 36, - "h": 40 - }, - "frame": { - "x": 37, - "y": 39, - "w": 36, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 36, - "h": 40 - }, - "frame": { - "x": 37, - "y": 39, - "w": 36, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 40 - }, - "frame": { - "x": 37, - "y": 39, - "w": 36, - "h": 40 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 40 - }, - "frame": { - "x": 73, - "y": 40, - "w": 37, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9e937b9120a4e2d30cb17c3057bdb25e:2992340ca21fbb2052a947040742ff82:721af8c322ff60159262e9b3017c784d$" - } -} diff --git a/public/images/pokemon/exp/back/703.png b/public/images/pokemon/exp/back/703.png deleted file mode 100644 index 2af4ac363ea..00000000000 Binary files a/public/images/pokemon/exp/back/703.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/704.json b/public/images/pokemon/exp/back/704.json index cfee176924b..ff94c52a2a8 100644 --- a/public/images/pokemon/exp/back/704.json +++ b/public/images/pokemon/exp/back/704.json @@ -1,1742 +1,101 @@ -{ - "textures": [ - { - "image": "704.png", - "format": "RGBA8888", - "size": { - "w": 233, - "h": 233 - }, - "scale": 1, - "frames": [ - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 66, - "h": 72 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 24, - "w": 41, - "h": 48 - }, - "frame": { - "x": 0, - "y": 72, - "w": 41, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 25, - "w": 41, - "h": 47 - }, - "frame": { - "x": 66, - "y": 0, - "w": 41, - "h": 47 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 25, - "w": 41, - "h": 47 - }, - "frame": { - "x": 66, - "y": 0, - "w": 41, - "h": 47 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 25, - "w": 40, - "h": 47 - }, - "frame": { - "x": 0, - "y": 120, - "w": 40, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 25, - "w": 40, - "h": 47 - }, - "frame": { - "x": 0, - "y": 120, - "w": 40, - "h": 47 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 26, - "w": 39, - "h": 46 - }, - "frame": { - "x": 107, - "y": 0, - "w": 39, - "h": 46 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 26, - "w": 39, - "h": 46 - }, - "frame": { - "x": 0, - "y": 167, - "w": 39, - "h": 46 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 29, - "w": 41, - "h": 43 - }, - "frame": { - "x": 146, - "y": 0, - "w": 41, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 187, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 187, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 187, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 187, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 41, - "y": 72, - "w": 37, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 78, - "y": 47, - "w": 37, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 115, - "y": 46, - "w": 37, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 115, - "y": 46, - "w": 37, - "h": 46 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 115, - "y": 46, - "w": 37, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 152, - "y": 43, - "w": 37, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 152, - "y": 43, - "w": 37, - "h": 46 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 152, - "y": 43, - "w": 37, - "h": 46 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 29, - "y": 26, - "w": 37, - "h": 46 - }, - "frame": { - "x": 152, - "y": 43, - "w": 37, - "h": 46 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 26, - "w": 38, - "h": 46 - }, - "frame": { - "x": 189, - "y": 42, - "w": 38, - "h": 46 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 26, - "w": 38, - "h": 46 - }, - "frame": { - "x": 189, - "y": 42, - "w": 38, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 78, - "y": 93, - "w": 38, - "h": 45 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 116, - "y": 92, - "w": 38, - "h": 45 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 27, - "w": 38, - "h": 45 - }, - "frame": { - "x": 154, - "y": 89, - "w": 38, - "h": 45 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 192, - "y": 88, - "w": 41, - "h": 42 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 192, - "y": 88, - "w": 41, - "h": 42 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 192, - "y": 88, - "w": 41, - "h": 42 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 26, - "y": 30, - "w": 41, - "h": 42 - }, - "frame": { - "x": 192, - "y": 130, - "w": 41, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 154, - "y": 134, - "w": 38, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 154, - "y": 134, - "w": 38, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 154, - "y": 134, - "w": 38, - "h": 44 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 154, - "y": 134, - "w": 38, - "h": 44 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 116, - "y": 137, - "w": 38, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 40, - "y": 120, - "w": 38, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 40, - "y": 120, - "w": 38, - "h": 44 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 40, - "y": 120, - "w": 38, - "h": 44 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 28, - "y": 28, - "w": 38, - "h": 44 - }, - "frame": { - "x": 78, - "y": 138, - "w": 38, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 39, - "y": 167, - "w": 39, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 39, - "y": 167, - "w": 39, - "h": 44 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 39, - "y": 167, - "w": 39, - "h": 44 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 31, - "w": 42, - "h": 41 - }, - "frame": { - "x": 78, - "y": 182, - "w": 42, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 27, - "y": 28, - "w": 39, - "h": 44 - }, - "frame": { - "x": 120, - "y": 181, - "w": 39, - "h": 44 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 32, - "w": 42, - "h": 40 - }, - "frame": { - "x": 159, - "y": 178, - "w": 42, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 32, - "w": 42, - "h": 40 - }, - "frame": { - "x": 159, - "y": 178, - "w": 42, - "h": 40 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 32, - "w": 42, - "h": 40 - }, - "frame": { - "x": 159, - "y": 178, - "w": 42, - "h": 40 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 72 - }, - "spriteSourceSize": { - "x": 25, - "y": 32, - "w": 42, - "h": 40 - }, - "frame": { - "x": 159, - "y": 178, - "w": 42, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1af9bc6c970e4ca611c23ce1e26ff660:ab013a92210cb1b0ae94301a2c9b4c2a:45bb13be23ae6e2a6654a2a00c450d62$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0002.png", + "frame": { "x": 53, "y": 0, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0003.png", + "frame": { "x": 26, "y": 0, "w": 27, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 27, "h": 31 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0004.png", + "frame": { "x": 53, "y": 0, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0007.png", + "frame": { "x": 26, "y": 31, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0008.png", + "frame": { "x": 52, "y": 32, "w": 27, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 27, "h": 30 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0009.png", + "frame": { "x": 26, "y": 31, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "704.png", + "format": "I8", + "size": { "w": 79, "h": 63 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/704.png b/public/images/pokemon/exp/back/704.png index e08171177fd..a67b79b0ee9 100644 Binary files a/public/images/pokemon/exp/back/704.png and b/public/images/pokemon/exp/back/704.png differ diff --git a/public/images/pokemon/exp/back/705.json b/public/images/pokemon/exp/back/705.json index be407b80180..2fc8cb18e99 100644 --- a/public/images/pokemon/exp/back/705.json +++ b/public/images/pokemon/exp/back/705.json @@ -1,230 +1,596 @@ -{ - "textures": [ - { - "image": "705.png", - "format": "RGBA8888", - "size": { - "w": 118, - "h": 118 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 59 - }, - "frame": { - "x": 0, - "y": 59, - "w": 37, - "h": 59 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 59 - }, - "frame": { - "x": 0, - "y": 59, - "w": 37, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 59 - }, - "frame": { - "x": 37, - "y": 59, - "w": 35, - "h": 59 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 59 - }, - "frame": { - "x": 39, - "y": 0, - "w": 35, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 59 - }, - "frame": { - "x": 39, - "y": 0, - "w": 35, - "h": 59 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 58 - }, - "frame": { - "x": 72, - "y": 59, - "w": 41, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 58 - }, - "frame": { - "x": 72, - "y": 59, - "w": 41, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 42, - "h": 57 - }, - "frame": { - "x": 74, - "y": 0, - "w": 42, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:25dc113e55116f41d58d372b4ed9b10a:95a84e44ff027f7c648e68bbd8ace4bc:6b57e983626c7fc9144ab67f30c66814$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 40, "y": 185, "w": 40, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 40, "h": 58 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 77, "y": 298, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 162, "y": 299, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 202, "y": 299, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 117, "y": 300, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 121, "y": 245, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 55 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 80, "y": 242, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 244, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 40, "h": 57 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 194, "y": 240, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 39, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 125, "w": 37, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 156, "y": 184, "w": 38, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 38, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 243, "w": 37, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 158, "y": 0, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 39, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 156, "y": 62, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 197, "y": 0, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 40, "y": 185, "w": 40, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 40, "h": 58 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 77, "y": 298, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 162, "y": 299, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 202, "y": 299, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 117, "y": 300, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 121, "y": 245, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 55 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 80, "y": 242, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 244, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 40, "h": 57 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 194, "y": 240, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 39, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 125, "w": 37, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 156, "y": 184, "w": 38, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 38, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 40, "y": 243, "w": 37, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 158, "y": 0, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 39, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 156, "y": 62, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 197, "y": 0, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 185, "w": 40, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 40, "h": 58 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 77, "y": 298, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 162, "y": 299, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 202, "y": 299, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 117, "y": 300, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 121, "y": 245, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 55 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 80, "y": 242, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 244, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 40, "h": 57 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 194, "y": 240, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 39, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 125, "w": 37, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 156, "y": 184, "w": 38, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 38, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 40, "y": 243, "w": 37, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 158, "y": 0, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 39, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 156, "y": 62, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 197, "y": 0, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 195, "y": 181, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 118, "y": 0, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 40, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 40, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 118, "y": 61, "w": 38, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 38, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 62, "w": 38, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 38, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 40, "y": 0, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 39, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 79, "y": 0, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 39, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 38, "y": 63, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 77, "y": 63, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 195, "y": 120, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 123, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 38, "y": 124, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 77, "y": 124, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 197, "y": 60, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 116, "y": 183, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 185, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "705.png", + "format": "I8", + "size": { "w": 243, "h": 355 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/705.png b/public/images/pokemon/exp/back/705.png index a4f62a21004..18c942605d6 100644 Binary files a/public/images/pokemon/exp/back/705.png and b/public/images/pokemon/exp/back/705.png differ diff --git a/public/images/pokemon/exp/back/707.png b/public/images/pokemon/exp/back/707.png deleted file mode 100644 index 6ce681a5651..00000000000 Binary files a/public/images/pokemon/exp/back/707.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/708.json b/public/images/pokemon/exp/back/708.json deleted file mode 100644 index f0b2e21b5c1..00000000000 --- a/public/images/pokemon/exp/back/708.json +++ /dev/null @@ -1,503 +0,0 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 135, - "h": 135 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 45, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 45, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 45, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 45, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 45, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 45, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 45, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 44, - "h": 46 - }, - "frame": { - "x": 45, - "y": 46, - "w": 44, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 44, - "h": 46 - }, - "frame": { - "x": 45, - "y": 46, - "w": 44, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 44, - "h": 46 - }, - "frame": { - "x": 45, - "y": 46, - "w": 44, - "h": 46 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 44, - "h": 41 - }, - "frame": { - "x": 91, - "y": 0, - "w": 44, - "h": 41 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 44, - "h": 41 - }, - "frame": { - "x": 91, - "y": 0, - "w": 44, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 45 - }, - "frame": { - "x": 89, - "y": 45, - "w": 45, - "h": 45 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 45 - }, - "frame": { - "x": 89, - "y": 45, - "w": 45, - "h": 45 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 45 - }, - "frame": { - "x": 89, - "y": 45, - "w": 45, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 44 - }, - "frame": { - "x": 89, - "y": 90, - "w": 45, - "h": 44 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 44 - }, - "frame": { - "x": 89, - "y": 90, - "w": 45, - "h": 44 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 44 - }, - "frame": { - "x": 89, - "y": 90, - "w": 45, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bcbffc2559c06539de3a8e783aa9b810:1a73d753b783ff36005e333d5e1a213a:796c82c5076b122f2663381836c65843$" - } -} diff --git a/public/images/pokemon/exp/back/708.png b/public/images/pokemon/exp/back/708.png deleted file mode 100644 index a531ec27f9f..00000000000 Binary files a/public/images/pokemon/exp/back/708.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/712.json b/public/images/pokemon/exp/back/712.json index 46b8cdaad44..fe53f52369e 100644 --- a/public/images/pokemon/exp/back/712.json +++ b/public/images/pokemon/exp/back/712.json @@ -1,2729 +1,1433 @@ -{ - "textures": [ - { - "image": "712.png", - "format": "RGBA8888", - "size": { - "w": 208, - "h": 208 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 37, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 37, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 75, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 75, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 113, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 113, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 148, - "y": 87, - "w": 37, - "h": 41 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 148, - "y": 87, - "w": 37, - "h": 41 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 37, - "y": 127, - "w": 37, - "h": 41 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 37, - "y": 127, - "w": 37, - "h": 41 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 168, - "w": 37, - "h": 40 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 168, - "w": 37, - "h": 40 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 166, - "w": 37, - "h": 41 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 166, - "w": 37, - "h": 41 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 36, - "h": 41 - }, - "frame": { - "x": 148, - "y": 128, - "w": 36, - "h": 41 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 36, - "h": 41 - }, - "frame": { - "x": 148, - "y": 128, - "w": 36, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:600bb71c0995d9554966ee794b89312a:22158bf1d17659480b23ef6d5ed6dbcb:3a1cc69824960d920ca43f8c9376d136$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 141, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 105, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 140, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 70, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 70, "y": 42, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 35, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 106, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 35, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 35, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 72, "y": 125, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 72, "y": 125, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 142, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 142, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 0, "y": 126, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 0, "y": 126, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 70, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 70, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 106, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 106, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 70, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 70, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 0, "y": 126, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 0, "y": 126, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 35, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 35, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 142, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 142, "y": 85, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 107, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 107, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 36, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 36, "y": 125, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 142, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 142, "y": 165, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 166, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 0, "y": 166, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 107, "y": 125, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 72, "y": 125, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 72, "y": 125, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0157.png", + "frame": { "x": 35, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0158.png", + "frame": { "x": 35, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "712.png", + "format": "I8", + "size": { "w": 178, "h": 205 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/712.png b/public/images/pokemon/exp/back/712.png index 81f77412357..a5b57fc9f1b 100644 Binary files a/public/images/pokemon/exp/back/712.png and b/public/images/pokemon/exp/back/712.png differ diff --git a/public/images/pokemon/exp/back/713.json b/public/images/pokemon/exp/back/713.json index c2e09d4783e..0ff72eef867 100644 --- a/public/images/pokemon/exp/back/713.json +++ b/public/images/pokemon/exp/back/713.json @@ -1,188 +1,1100 @@ -{ - "textures": [ - { - "image": "713.png", - "format": "RGBA8888", - "size": { - "w": 199, - "h": 199 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 87, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 87, - "h": 66 - }, - "frame": { - "x": 87, - "y": 69, - "w": 87, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 87, - "h": 66 - }, - "frame": { - "x": 87, - "y": 69, - "w": 87, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 87, - "h": 64 - }, - "frame": { - "x": 87, - "y": 135, - "w": 87, - "h": 64 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6f396042cb759179580f2aeb1af94e22:59471aca6db39209b1e31d5894938bcb:625f70bcfe9c7f2437cb9cad6d2b863c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 174, "y": 65, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 174, "y": 65, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 92, "y": 0, "w": 91, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 91, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 92, "y": 0, "w": 91, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 91, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "713.png", + "format": "I8", + "size": { "w": 357, "h": 248 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/713.png b/public/images/pokemon/exp/back/713.png index 6692bc5c65a..d6782ee4357 100644 Binary files a/public/images/pokemon/exp/back/713.png and b/public/images/pokemon/exp/back/713.png differ diff --git a/public/images/pokemon/exp/back/714.json b/public/images/pokemon/exp/back/714.json deleted file mode 100644 index ecdf5b1b813..00000000000 --- a/public/images/pokemon/exp/back/714.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 147, - "h": 147 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 13, - "y": 0, - "w": 34, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 34, - "h": 57 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 60, - "h": 58 - }, - "frame": { - "x": 34, - "y": 0, - "w": 60, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 46, - "h": 58 - }, - "frame": { - "x": 94, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 46, - "h": 58 - }, - "frame": { - "x": 94, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 58, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 58, - "h": 58 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 58, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 58, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 54, - "h": 58 - }, - "frame": { - "x": 58, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 54, - "h": 58 - }, - "frame": { - "x": 58, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 12, - "y": 1, - "w": 35, - "h": 58 - }, - "frame": { - "x": 112, - "y": 58, - "w": 35, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 12, - "y": 1, - "w": 35, - "h": 58 - }, - "frame": { - "x": 112, - "y": 58, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5c3a62d7014eae3eb4c5e67ef6a405f3:1456f6425f3a65e77dc4017298499d80:1a07d46e710b0568ec824f54fbc4fe6a$" - } -} diff --git a/public/images/pokemon/exp/back/714.png b/public/images/pokemon/exp/back/714.png deleted file mode 100644 index 0d81f19fcd4..00000000000 Binary files a/public/images/pokemon/exp/back/714.png and /dev/null 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/718-10.json b/public/images/pokemon/exp/back/718-10.json deleted file mode 100644 index 03fc4c60ed9..00000000000 --- a/public/images/pokemon/exp/back/718-10.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 197, - "h": 197 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 0, - "y": 67, - "w": 66, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 0, - "y": 67, - "w": 66, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 67 - }, - "frame": { - "x": 66, - "y": 0, - "w": 66, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 67 - }, - "frame": { - "x": 132, - "y": 0, - "w": 65, - "h": 67 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 67 - }, - "frame": { - "x": 132, - "y": 0, - "w": 65, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 66, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 66, - "h": 65 - }, - "frame": { - "x": 66, - "y": 67, - "w": 66, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bd85fbac35b53b12b06187b29756853b:2478226f2126bdc982b17f3a3acb49c4:82195cf2a6db620c5643b8162d6e8c5c$" - } -} diff --git a/public/images/pokemon/exp/back/718-10.png b/public/images/pokemon/exp/back/718-10.png deleted file mode 100644 index 709dc3bea8a..00000000000 Binary files a/public/images/pokemon/exp/back/718-10.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/718.json b/public/images/pokemon/exp/back/718.json deleted file mode 100644 index 698179b1453..00000000000 --- a/public/images/pokemon/exp/back/718.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 216, - "h": 216 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 73, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 73, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 72, - "h": 89 - }, - "frame": { - "x": 74, - "y": 0, - "w": 72, - "h": 89 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 72, - "h": 89 - }, - "frame": { - "x": 74, - "y": 0, - "w": 72, - "h": 89 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 70, - "h": 88 - }, - "frame": { - "x": 146, - "y": 0, - "w": 70, - "h": 88 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 70, - "h": 88 - }, - "frame": { - "x": 146, - "y": 0, - "w": 70, - "h": 88 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 69, - "h": 87 - }, - "frame": { - "x": 146, - "y": 88, - "w": 69, - "h": 87 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:82c29d609c52a3a1aa4b9af042ef9ce8:8d05611f8189d493fef8906e0f11f3de:7b4a06b06cbac24b3f39727b0238661b$" - } -} diff --git a/public/images/pokemon/exp/back/718.png b/public/images/pokemon/exp/back/718.png deleted file mode 100644 index f2f380e339a..00000000000 Binary files a/public/images/pokemon/exp/back/718.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/719.json b/public/images/pokemon/exp/back/719.json deleted file mode 100644 index 4cd0e34f113..00000000000 --- a/public/images/pokemon/exp/back/719.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 158, - "h": 158 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 39, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 39, - "h": 67 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 39, - "h": 67 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 40, - "h": 67 - }, - "frame": { - "x": 78, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 40, - "h": 67 - }, - "frame": { - "x": 78, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 40, - "h": 67 - }, - "frame": { - "x": 118, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 40, - "h": 67 - }, - "frame": { - "x": 118, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 41, - "h": 67 - }, - "frame": { - "x": 0, - "y": 67, - "w": 41, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 68 - }, - "frame": { - "x": 41, - "y": 67, - "w": 41, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 68 - }, - "frame": { - "x": 41, - "y": 67, - "w": 41, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 68 - }, - "frame": { - "x": 82, - "y": 67, - "w": 42, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 68 - }, - "frame": { - "x": 82, - "y": 67, - "w": 42, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0db095e3b451ffc873bea6b5e23ba65d:f7ad8a345854a119edb545cc03dcde8e:17a705bb924916761be2495822a53735$" - } -} diff --git a/public/images/pokemon/exp/back/719.png b/public/images/pokemon/exp/back/719.png deleted file mode 100644 index cb0c84041f9..00000000000 Binary files a/public/images/pokemon/exp/back/719.png and /dev/null 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/815-gigantamax.json b/public/images/pokemon/exp/back/815-gigantamax.json new file mode 100644 index 00000000000..952ea16b6b8 --- /dev/null +++ b/public/images/pokemon/exp/back/815-gigantamax.json @@ -0,0 +1,659 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 84, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 444, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 171, "y": 289, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 389, "w": 81, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 81, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 525, "y": 288, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 83, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 485, "w": 79, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 79, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 84, "y": 389, "w": 81, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 81, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 356, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 268, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 354, "y": 194, "w": 84, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 84, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 255, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 423, "y": 385, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 1, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 506, "y": 481, "w": 80, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 80, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 250, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 1, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 89, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 339, "y": 291, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 167, "y": 386, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 440, "y": 288, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 414, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "815-gigantamax.png", + "format": "I8", + "size": { "w": 611, "h": 579 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/815-gigantamax.png b/public/images/pokemon/exp/back/815-gigantamax.png new file mode 100644 index 00000000000..0036d75cbfc Binary files /dev/null and b/public/images/pokemon/exp/back/815-gigantamax.png differ diff --git a/public/images/pokemon/exp/back/839-gigantamax.json b/public/images/pokemon/exp/back/839-gigantamax.json new file mode 100644 index 00000000000..35d98910c9f --- /dev/null +++ b/public/images/pokemon/exp/back/839-gigantamax.json @@ -0,0 +1,821 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 238, "y": 282, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 470, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 546, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 469, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 544, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 154, "y": 472, "w": 76, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 566, "w": 75, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 75, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 393, "y": 376, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 414, "y": 190, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 492, "y": 191, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 159, "y": 283, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 189, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 255, "y": 188, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 173, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 90, "y": 93, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 83, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 350, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 524, "y": 0, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 268, "y": 92, "w": 82, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 82, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 513, "y": 95, "w": 80, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 80, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 185, "w": 79, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 79, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 238, "y": 282, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 470, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 546, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 469, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 544, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 154, "y": 472, "w": 76, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 566, "w": 75, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 75, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 393, "y": 376, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 414, "y": 190, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 492, "y": 191, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 159, "y": 283, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 158, "y": 189, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 255, "y": 188, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 173, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 90, "y": 93, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 83, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 350, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 524, "y": 0, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 268, "y": 92, "w": 82, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 82, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 513, "y": 95, "w": 80, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 80, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 185, "w": 79, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 79, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 238, "y": 282, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 470, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 546, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 469, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 544, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 154, "y": 472, "w": 76, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 566, "w": 75, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 75, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 393, "y": 376, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 414, "y": 190, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 492, "y": 191, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 159, "y": 283, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 158, "y": 189, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 255, "y": 188, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 173, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 90, "y": 93, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 83, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 350, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 524, "y": 0, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 268, "y": 92, "w": 82, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 82, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 513, "y": 95, "w": 80, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 80, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 185, "w": 79, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 79, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 238, "y": 282, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 79, "y": 187, "w": 79, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 79, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 432, "y": 95, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 441, "y": 0, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 356, "y": 0, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 85, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 180, "y": 0, "w": 88, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 88, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 0, "w": 90, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 90, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 268, "y": 0, "w": 88, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 88, "h": 92 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 94, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 85, "h": 91 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 77, "y": 283, "w": 82, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 82, "h": 90 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 397, "y": 285, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 5, "w": 81, "h": 91 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 232, "y": 378, "w": 81, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 81, "h": 90 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 315, "y": 283, "w": 82, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 82, "h": 90 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 478, "y": 286, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 5, "w": 81, "h": 91 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 313, "y": 467, "w": 79, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 79, "h": 92 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 335, "y": 189, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 79, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 315, "y": 373, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 77, "y": 373, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 77, "y": 467, "w": 77, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 77, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 232, "y": 468, "w": 77, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 77, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 392, "y": 471, "w": 77, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 77, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 309, "y": 559, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 77, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 386, "y": 565, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 77, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 77, "y": 561, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 77, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 230, "y": 562, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 77, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 472, "w": 77, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 77, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 377, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 155, "y": 377, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 281, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "839-gigantamax.png", + "format": "I8", + "size": { "w": 622, "h": 661 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/839-gigantamax.png b/public/images/pokemon/exp/back/839-gigantamax.png new file mode 100644 index 00000000000..6b7622b05d8 Binary files /dev/null and b/public/images/pokemon/exp/back/839-gigantamax.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/894.png b/public/images/pokemon/exp/back/894.png index c83851c2d54..e82e8dc0183 100644 Binary files a/public/images/pokemon/exp/back/894.png and b/public/images/pokemon/exp/back/894.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/944.png b/public/images/pokemon/exp/back/944.png index 1f4139b4128..5162fa285be 100644 Binary files a/public/images/pokemon/exp/back/944.png and b/public/images/pokemon/exp/back/944.png differ diff --git a/public/images/pokemon/exp/back/945.png b/public/images/pokemon/exp/back/945.png index 98e56cc2468..74d4e56a598 100644 Binary files a/public/images/pokemon/exp/back/945.png and b/public/images/pokemon/exp/back/945.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/987.png b/public/images/pokemon/exp/back/987.png index 1da8db869dc..4956b630d3e 100644 Binary files a/public/images/pokemon/exp/back/987.png and b/public/images/pokemon/exp/back/987.png differ diff --git a/public/images/pokemon/exp/shiny/708.json b/public/images/pokemon/exp/back/female/6215.json similarity index 62% rename from public/images/pokemon/exp/shiny/708.json rename to public/images/pokemon/exp/back/female/6215.json index 188cebad63c..4f58734d55e 100644 --- a/public/images/pokemon/exp/shiny/708.json +++ b/public/images/pokemon/exp/back/female/6215.json @@ -1,432 +1,33 @@ { "textures": [ { - "image": "708.png", + "image": "6215.png", "format": "RGBA8888", "size": { - "w": 206, - "h": 206 + "w": 155, + "h": 155 }, "scale": 1, "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, { "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, "y": 1, - "w": 51, - "h": 43 + "w": 54, + "h": 49 }, "frame": { "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 + "w": 54, + "h": 49 } }, { @@ -434,20 +35,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 + "x": 0, + "y": 1, + "w": 54, + "h": 49 }, "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 } }, { @@ -455,20 +77,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 + "x": 0, + "y": 1, + "w": 54, + "h": 49 }, "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 } }, { @@ -476,461 +119,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 50, - "h": 40 - }, - "frame": { - "x": 102, - "y": 166, - "w": 50, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { "x": 0, - "y": 6, - "w": 50, - "h": 40 - }, - "frame": { - "x": 152, - "y": 166, - "w": 50, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, "y": 1, - "w": 51, - "h": 41 + "w": 54, + "h": 49 }, "frame": { - "x": 153, + "x": 0, "y": 0, - "w": 51, - "h": 41 + "w": 54, + "h": 49 } }, { - "filename": "0042.png", + "filename": "0043.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 6, + "x": 0, "y": 1, - "w": 51, - "h": 41 + "w": 54, + "h": 49 }, "frame": { - "x": 153, + "x": 0, "y": 0, - "w": 51, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 41, - "w": 51, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 41, - "w": 51, - "h": 41 + "w": 54, + "h": 49 } }, { @@ -938,41 +161,146 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 41 + "x": 0, + "y": 1, + "w": 54, + "h": 49 }, "frame": { - "x": 153, - "y": 82, - "w": 51, - "h": 41 + "x": 0, + "y": 0, + "w": 54, + "h": 49 } }, { - "filename": "0048.png", + "filename": "0005.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 2, + "x": 0, "y": 3, - "w": 51, - "h": 41 + "w": 54, + "h": 47 }, "frame": { - "x": 153, - "y": 82, - "w": 51, - "h": 41 + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 } }, { @@ -980,20 +308,167 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, "h": 47 }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, "spriteSourceSize": { "x": 0, "y": 4, - "w": 51, - "h": 41 + "w": 54, + "h": 46 }, "frame": { - "x": 153, - "y": 123, - "w": 51, - "h": 41 + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 } }, { @@ -1001,20 +476,545 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { "x": 0, "y": 4, - "w": 51, - "h": 41 + "w": 54, + "h": 46 }, "frame": { - "x": 153, - "y": 123, + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, "w": 51, - "h": 41 + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 } } ] @@ -1023,6 +1023,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:02aeb20d3dedab69cd63430f383bb8a9:140bc3262838e3b187b88498bce06706:796c82c5076b122f2663381836c65843$" + "smartupdate": "$TexturePacker:SmartUpdate:29aeff74e785c73ae2261d8bb0459111:5709d3d72351f1424de632ebf8347c01:736cd88647e79ba7896fc74f9406c2fe$" } } diff --git a/public/images/pokemon/exp/back/female/6215.png b/public/images/pokemon/exp/back/female/6215.png new file mode 100644 index 00000000000..7dbdab7eb85 Binary files /dev/null and b/public/images/pokemon/exp/back/female/6215.png differ diff --git a/public/images/pokemon/exp/back/female/668.json b/public/images/pokemon/exp/back/female/668.json new file mode 100644 index 00000000000..4c493f84959 --- /dev/null +++ b/public/images/pokemon/exp/back/female/668.json @@ -0,0 +1,821 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 233, "y": 213, "w": 78, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 78, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 156, "y": 144, "w": 79, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 79, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 319, "y": 144, "w": 80, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 80, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 73, "w": 80, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 80, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 310, "y": 282, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 534, "y": 350, "w": 71, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 4, "w": 71, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 301, "y": 351, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 67, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 353, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 3, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 204, "y": 417, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 139, "y": 352, "w": 65, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 65, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 73, "y": 352, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 66, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 368, "y": 351, "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 69, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 284, "w": 73, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 4, "w": 73, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 475, "y": 214, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 319, "y": 212, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 82, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 519, "y": 72, "w": 83, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 83, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 434, "y": 0, "w": 85, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 85, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 261, "y": 0, "w": 86, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 86, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 174, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 347, "y": 0, "w": 87, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 87, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 519, "y": 0, "w": 85, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 85, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 347, "y": 72, "w": 84, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 84, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 73, "w": 82, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 162, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 78, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668-female.png", + "format": "I8", + "size": { "w": 605, "h": 492 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/female/668.png b/public/images/pokemon/exp/back/female/668.png new file mode 100644 index 00000000000..e5b5ed2494e Binary files /dev/null and b/public/images/pokemon/exp/back/female/668.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/248-mega.json b/public/images/pokemon/exp/back/shiny/248-mega.json index e6874d48784..67e88b6014f 100644 --- a/public/images/pokemon/exp/back/shiny/248-mega.json +++ b/public/images/pokemon/exp/back/shiny/248-mega.json @@ -1,272 +1,929 @@ -{ - "textures": [ - { - "image": "248-mega.png", - "format": "RGBA8888", - "size": { - "w": 292, - "h": 292 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 74, - "w": 80, - "h": 74 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 0, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 0, - "w": 79, - "h": 73 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 73, - "w": 79, - "h": 73 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 0, - "w": 73, - "h": 73 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 73, - "w": 73, - "h": 73 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3dba844e4799c099eae9413ec740d703:7a7dc95ebe53fcea6738011b92bff44e:90df97eb431b7162252516cb937a0b9e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 341, "y": 455, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 84, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 170, "y": 534, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 170, "y": 456, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 341, "y": 533, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 84, "y": 456, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 255, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 513, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 428, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 260, "y": 373, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 341, "y": 455, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 84, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 170, "y": 534, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 170, "y": 456, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 341, "y": 533, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 84, "y": 456, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 255, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 513, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 428, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 260, "y": 373, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 341, "y": 455, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 84, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 170, "y": 534, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 170, "y": 456, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 341, "y": 533, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 84, "y": 456, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 255, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 513, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 428, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 260, "y": 373, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 430, "y": 101, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 195, "w": 84, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 84, "h": 88 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 173, "y": 287, "w": 85, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 85, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 373, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 85, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 341, "y": 455, "w": 85, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 85, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 84, "y": 534, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 170, "y": 534, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 170, "y": 456, "w": 83, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 83, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 341, "y": 533, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 84, "y": 456, "w": 84, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 84, "h": 76 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 255, "y": 455, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 84, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 513, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 428, "y": 455, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 83, "h": 77 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 260, "y": 373, "w": 83, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 516, "y": 287, "w": 83, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 83, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 347, "y": 287, "w": 83, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 83, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 256, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 342, "y": 192, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 101, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 92 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 426, "y": 194, "w": 82, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 82, "h": 91 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 510, "y": 196, "w": 83, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 83, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 285, "w": 83, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 83, "h": 86 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 432, "y": 287, "w": 82, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 85 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 85, "y": 288, "w": 82, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 83 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 373, "w": 82, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 82, "h": 81 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 345, "y": 374, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 429, "y": 374, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 455, "w": 82, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 82, "h": 79 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 171, "y": 374, "w": 82, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 82, "h": 80 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 516, "y": 372, "w": 84, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 84, "h": 81 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 260, "y": 287, "w": 85, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 85, "h": 84 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 86, "y": 200, "w": 85, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 85, "h": 86 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 342, "y": 101, "w": 86, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 89 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 256, "y": 100, "w": 84, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 84, "h": 94 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 86, "y": 100, "w": 83, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 83, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 514, "y": 0, "w": 83, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 83, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 429, "y": 0, "w": 83, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 83, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 344, "y": 0, "w": 83, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 83, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 0, "w": 84, "h": 99 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 84, "h": 99 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 258, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 172, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 86, "y": 0, "w": 84, "h": 98 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 84, "h": 98 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 171, "y": 100, "w": 83, "h": 97 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 83, "h": 97 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 514, "y": 100, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 83, "h": 94 }, + "sourceSize": { "w": 88, "h": 101 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "248-mega.png", + "format": "I8", + "size": { "w": 600, "h": 610 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/248-mega.png b/public/images/pokemon/exp/back/shiny/248-mega.png index 10b8bfb05f3..bb4a62d441f 100644 Binary files a/public/images/pokemon/exp/back/shiny/248-mega.png and b/public/images/pokemon/exp/back/shiny/248-mega.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/362-mega.json b/public/images/pokemon/exp/back/shiny/362-mega.json index 2c42a6db6f1..02354ddad93 100644 --- a/public/images/pokemon/exp/back/shiny/362-mega.json +++ b/public/images/pokemon/exp/back/shiny/362-mega.json @@ -1,272 +1,551 @@ -{ - "textures": [ - { - "image": "362-mega.png", - "format": "RGBA8888", - "size": { - "w": 140, - "h": 140 - }, - "scale": 1, - "frames": [ - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 61, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 71 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 70, - "w": 61, - "h": 70 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 61, - "h": 70 - }, - "frame": { - "x": 61, - "y": 70, - "w": 61, - "h": 70 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 69 - }, - "frame": { - "x": 0, - "y": 71, - "w": 61, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 69 - }, - "frame": { - "x": 0, - "y": 71, - "w": 61, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:25f7f8085d78ddcdd4aadd2f3591c111:e79d613f15426593f8c7367b1afc6c04:8a7271a5423838c97ddeb1e6dc343255$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 16, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 18, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 15, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 13, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 16, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 18, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 15, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 13, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 11, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 16, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 18, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 15, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 13, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 65, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 65, "h": 68 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 67, "y": 66, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 58, "h": 66 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 67, "y": 0, "w": 61, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 61, "h": 64 }, + "sourceSize": { "w": 65, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "362-mega.png", + "format": "I8", + "size": { "w": 128, "h": 132 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/362-mega.png b/public/images/pokemon/exp/back/shiny/362-mega.png index 32f3e5658a3..75d5b5075b9 100644 Binary files a/public/images/pokemon/exp/back/shiny/362-mega.png and b/public/images/pokemon/exp/back/shiny/362-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/569-gigantamax.json b/public/images/pokemon/exp/back/shiny/569-gigantamax.json new file mode 100644 index 00000000000..b266f5eb799 --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/569-gigantamax.json @@ -0,0 +1,1478 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0002.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0003.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0004.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0005.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0006.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0007.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0008.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0009.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0010.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0011.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0012.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0013.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0014.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0015.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0016.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0017.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0018.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0019.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0023.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0024.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0025.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0026.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0027.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0028.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0029.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0030.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0031.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0032.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0033.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0034.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0035.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0036.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0037.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0038.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0039.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0040.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0041.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0042.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0043.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0044.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0045.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0046.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0047.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0048.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0049.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0050.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0051.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0052.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0053.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0054.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0058.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0059.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0060.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0061.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0062.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0063.png", + "frame": { "x": 311, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0064.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0065.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0066.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0067.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0068.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0069.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0070.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0071.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0072.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0076.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0077.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0081.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0082.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0083.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0084.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0085.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0086.png", + "frame": { "x": 97, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 91, "w": 97, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 97, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0091.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0092.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0093.png", + "frame": { "x": 96, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 186, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0095.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0096.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0097.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0098.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0099.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0100.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0101.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0102.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0103.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0104.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0105.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0106.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0107.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0108.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0109.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0110.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0111.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0112.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0113.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0114.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0117.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0118.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0119.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0120.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0121.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0122.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0123.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0124.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0125.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0126.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0127.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0128.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0129.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0130.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0131.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0132.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0133.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0134.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0135.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0136.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0137.png", + "frame": { "x": 194, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0138.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0139.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0140.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0141.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0142.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0143.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0144.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0145.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0146.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0147.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0148.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0149.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 0, "w": 105, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 105, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0152.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0153.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0154.png", + "frame": { "x": 105, "y": 0, "w": 104, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 104, "h": 91 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0155.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0156.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0157.png", + "frame": { "x": 209, "y": 0, "w": 102, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 102, "h": 92 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0158.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0159.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0160.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0161.png", + "frame": { "x": 192, "y": 187, "w": 97, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 97, "h": 94 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0162.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + }, + { + "filename": "0163.png", + "frame": { "x": 290, "y": 92, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 96, "h": 95 }, + "sourceSize": { "w": 105, "h": 95 }, + "duration": 60 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "569-gigantamax.png", + "format": "I8", + "size": { "w": 413, "h": 281 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/569-gigantamax.png b/public/images/pokemon/exp/back/shiny/569-gigantamax.png new file mode 100644 index 00000000000..2322fc2321e Binary files /dev/null and b/public/images/pokemon/exp/back/shiny/569-gigantamax.png differ diff --git a/public/images/pokemon/exp/back/shiny/651.json b/public/images/pokemon/exp/back/shiny/651.json index 4e96154d67b..04a791f539f 100644 --- a/public/images/pokemon/exp/back/shiny/651.json +++ b/public/images/pokemon/exp/back/shiny/651.json @@ -1,104 +1,713 @@ -{ - "textures": [ - { - "image": "651.png", - "format": "RGBA8888", - "size": { - "w": 106, - "h": 106 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 50 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 50 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 49 - }, - "frame": { - "x": 0, - "y": 50, - "w": 53, - "h": 49 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3f6a8875e3bdc40a01569005eeaa99a4:fe6f34e605d5c3077475cfd03942ff77:a93e5fa02e10bf11e3ed8bf6571835ca$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 331, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 162, "y": 247, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 219, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 272, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 331, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 162, "y": 247, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 219, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 272, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 326, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 222, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 277, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 56, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 331, "y": 150, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 162, "y": 247, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 52, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 219, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 272, "y": 198, "w": 53, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 110, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 164, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 218, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 55, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 110, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 55, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 165, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 51 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 220, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 111, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 275, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 330, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 272, "y": 100, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 100, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 56, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 51, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 219, "y": 150, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 56, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 248, "w": 55, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 55, "h": 47 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 275, "y": 150, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 56, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 325, "y": 200, "w": 56, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 56, "h": 47 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 54, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 332, "y": 0, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 55, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 199, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 55, "y": 248, "w": 53, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 325, "y": 247, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 53, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 54, "y": 199, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 149, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 54, "h": 50 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 108, "y": 199, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 54, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 162, "y": 199, "w": 55, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 55, "h": 48 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 109, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 164, "y": 150, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 55, "h": 49 }, + "sourceSize": { "w": 59, "h": 54 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "651.png", + "format": "I8", + "size": { "w": 387, "h": 297 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/651.png b/public/images/pokemon/exp/back/shiny/651.png index 99fa14d5df9..b607fa69a15 100644 Binary files a/public/images/pokemon/exp/back/shiny/651.png and b/public/images/pokemon/exp/back/shiny/651.png differ diff --git a/public/images/pokemon/exp/back/shiny/653.json b/public/images/pokemon/exp/back/shiny/653.json index a5d273cff64..c5fb4a5db61 100644 --- a/public/images/pokemon/exp/back/shiny/653.json +++ b/public/images/pokemon/exp/back/shiny/653.json @@ -1,2204 +1,947 @@ -{ - "textures": [ - { - "image": "653.png", - "format": "RGBA8888", - "size": { - "w": 173, - "h": 173 - }, - "scale": 1, - "frames": [ - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 44 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 45, - "h": 44 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 45, - "h": 44 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 45, - "h": 44 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 45, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 132, - "w": 43, - "h": 41 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 132, - "w": 43, - "h": 40 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 44 - }, - "frame": { - "x": 45, - "y": 44, - "w": 44, - "h": 44 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 44 - }, - "frame": { - "x": 45, - "y": 88, - "w": 43, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 40, - "h": 44 - }, - "frame": { - "x": 88, - "y": 88, - "w": 40, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 89, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 130, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 41, - "h": 43 - }, - "frame": { - "x": 130, - "y": 44, - "w": 41, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 87, - "w": 40, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 128, - "y": 130, - "w": 40, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d04be8782bc4dd7044942acce05841d1:0e29431888e23f35da7ce4bf9b48965f:a7be961d0230f568aff23d95e7ff0036$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 123, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 130, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 130, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 84, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 42, "h": 39 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 44, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 41, "h": 40 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 38, "y": 128, "w": 38, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 38, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 42, "y": 86, "w": 39, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 42 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 81, "y": 87, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 38, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 88, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 44, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 132, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 132, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 44, "y": 43, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 44, "y": 43, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 44, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 88, "y": 43, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 42, "h": 44 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 130, "y": 43, "w": 41, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 41, "h": 43 }, + "sourceSize": { "w": 46, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "653.png", + "format": "I8", + "size": { "w": 176, "h": 170 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/653.png b/public/images/pokemon/exp/back/shiny/653.png index efd98f5ee42..08b2420ad11 100644 Binary files a/public/images/pokemon/exp/back/shiny/653.png and b/public/images/pokemon/exp/back/shiny/653.png differ diff --git a/public/images/pokemon/exp/back/shiny/654.json b/public/images/pokemon/exp/back/shiny/654.json index 990436ec243..a5bd681b6cb 100644 --- a/public/images/pokemon/exp/back/shiny/654.json +++ b/public/images/pokemon/exp/back/shiny/654.json @@ -1,188 +1,677 @@ -{ - "textures": [ - { - "image": "654.png", - "format": "RGBA8888", - "size": { - "w": 120, - "h": 120 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 66 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 65 - }, - "frame": { - "x": 80, - "y": 0, - "w": 40, - "h": 65 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 65 - }, - "frame": { - "x": 80, - "y": 0, - "w": 40, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6f47a7be287accef984c271dc9a4c0a3:dfd096ac65957c3db229b035490b4fbb:1977f50e1ab8a3304ceeb59ee1aa2ba9$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 102, "y": 203, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 161, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 110, "y": 0, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 53, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 110, "y": 68, "w": 51, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 51, "h": 69 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 214, "y": 195, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 263, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 215, "y": 130, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 163, "y": 0, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 108, "y": 137, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 50, "y": 263, "w": 50, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 50, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 218, "y": 0, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 161, "y": 195, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 154, "y": 261, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 54, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 163, "y": 65, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 154, "y": 261, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 54, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 163, "y": 65, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 154, "y": 261, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 54, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 163, "y": 65, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 154, "y": 261, "w": 52, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 52, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 54, "y": 131, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 218, "y": 65, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 55, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 108, "y": 137, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 196, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 51, "y": 196, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 55, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "654.png", + "format": "I8", + "size": { "w": 273, "h": 330 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/654.png b/public/images/pokemon/exp/back/shiny/654.png index 0dfad6834cc..747aa61bd58 100644 Binary files a/public/images/pokemon/exp/back/shiny/654.png and b/public/images/pokemon/exp/back/shiny/654.png differ diff --git a/public/images/pokemon/exp/back/shiny/656.json b/public/images/pokemon/exp/back/shiny/656.json index 0a023d7bee6..78a3ae89852 100644 --- a/public/images/pokemon/exp/back/shiny/656.json +++ b/public/images/pokemon/exp/back/shiny/656.json @@ -1,1658 +1,713 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 201, - "h": 201 - }, - "scale": 1, - "frames": [ - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 15, - "w": 32, - "h": 32 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 32 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 32, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 32, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 32, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 32, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 32, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 66, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 66, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 66, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 66, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 34, - "h": 33 - }, - "frame": { - "x": 66, - "y": 0, - "w": 34, - "h": 33 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 33, - "h": 33 - }, - "frame": { - "x": 100, - "y": 0, - "w": 33, - "h": 33 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 133, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 133, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 133, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 133, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 133, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 167, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 167, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 167, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 167, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 34, - "h": 34 - }, - "frame": { - "x": 167, - "y": 0, - "w": 34, - "h": 34 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 13, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 32, - "w": 32, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 34 - }, - "frame": { - "x": 32, - "y": 33, - "w": 34, - "h": 34 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 34 - }, - "frame": { - "x": 32, - "y": 33, - "w": 34, - "h": 34 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 34 - }, - "frame": { - "x": 32, - "y": 33, - "w": 34, - "h": 34 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 34 - }, - "frame": { - "x": 32, - "y": 33, - "w": 34, - "h": 34 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 34 - }, - "frame": { - "x": 32, - "y": 33, - "w": 34, - "h": 34 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 66, - "y": 33, - "w": 34, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 66, - "y": 33, - "w": 34, - "h": 35 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 66, - "y": 33, - "w": 34, - "h": 35 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 66, - "y": 33, - "w": 34, - "h": 35 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 66, - "y": 33, - "w": 34, - "h": 35 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 66, - "y": 33, - "w": 34, - "h": 35 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 66, - "y": 33, - "w": 34, - "h": 35 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 66, - "y": 33, - "w": 34, - "h": 35 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 66, - "y": 33, - "w": 34, - "h": 35 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 33, - "h": 35 - }, - "frame": { - "x": 100, - "y": 33, - "w": 33, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 133, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 133, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 133, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 133, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 133, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 167, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 167, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 167, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 167, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 167, - "y": 34, - "w": 34, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 35 - }, - "frame": { - "x": 0, - "y": 67, - "w": 34, - "h": 35 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 35 - }, - "frame": { - "x": 0, - "y": 67, - "w": 34, - "h": 35 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 35 - }, - "frame": { - "x": 0, - "y": 67, - "w": 34, - "h": 35 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 35 - }, - "frame": { - "x": 0, - "y": 67, - "w": 34, - "h": 35 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 35 - }, - "frame": { - "x": 0, - "y": 67, - "w": 34, - "h": 35 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 34, - "y": 68, - "w": 34, - "h": 35 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 34, - "y": 68, - "w": 34, - "h": 35 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 34, - "y": 68, - "w": 34, - "h": 35 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 34, - "y": 68, - "w": 34, - "h": 35 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 34, - "h": 35 - }, - "frame": { - "x": 34, - "y": 68, - "w": 34, - "h": 35 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 33, - "h": 35 - }, - "frame": { - "x": 68, - "y": 68, - "w": 33, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 36 - }, - "frame": { - "x": 101, - "y": 69, - "w": 34, - "h": 36 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 36 - }, - "frame": { - "x": 101, - "y": 69, - "w": 34, - "h": 36 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 36 - }, - "frame": { - "x": 101, - "y": 69, - "w": 34, - "h": 36 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 36 - }, - "frame": { - "x": 101, - "y": 69, - "w": 34, - "h": 36 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 36 - }, - "frame": { - "x": 101, - "y": 69, - "w": 34, - "h": 36 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 33, - "h": 36 - }, - "frame": { - "x": 135, - "y": 69, - "w": 33, - "h": 36 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 33, - "h": 36 - }, - "frame": { - "x": 168, - "y": 69, - "w": 33, - "h": 36 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 36 - }, - "frame": { - "x": 0, - "y": 102, - "w": 34, - "h": 36 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 34, - "h": 36 - }, - "frame": { - "x": 34, - "y": 103, - "w": 34, - "h": 36 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 33, - "h": 37 - }, - "frame": { - "x": 68, - "y": 103, - "w": 33, - "h": 37 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 34, - "h": 39 - }, - "frame": { - "x": 101, - "y": 105, - "w": 34, - "h": 39 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 31, - "h": 40 - }, - "frame": { - "x": 135, - "y": 105, - "w": 31, - "h": 40 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 31, - "h": 41 - }, - "frame": { - "x": 166, - "y": 105, - "w": 31, - "h": 41 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 32, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 32, - "h": 42 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 32, - "h": 42 - }, - "frame": { - "x": 32, - "y": 139, - "w": 32, - "h": 42 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 31, - "h": 42 - }, - "frame": { - "x": 64, - "y": 140, - "w": 31, - "h": 42 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 42 - }, - "frame": { - "x": 95, - "y": 144, - "w": 31, - "h": 42 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 32, - "h": 43 - }, - "frame": { - "x": 126, - "y": 145, - "w": 32, - "h": 43 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 34, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 31, - "h": 43 - }, - "frame": { - "x": 158, - "y": 146, - "w": 31, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5076cf3500c6d9392a3e656db2bcf661:8a870f3a4f8085495687c4af91e0de7e:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 131, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 37, "y": 83, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 109, "y": 117, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 35, "y": 119, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 35, "y": 154, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 71, "y": 156, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 167, "y": 43, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 71, "y": 121, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 141, "y": 158, "w": 34, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 73, "y": 85, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 200 + }, + { + "filename": "0057.png", + "frame": { "x": 67, "y": 1, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 33, "h": 38 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 1, "w": 31, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 31, "h": 41 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 34, "y": 1, "w": 31, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 31, "h": 41 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 102, "y": 1, "w": 31, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 31, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 167, "y": 1, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 30, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 167, "y": 80, "w": 30, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 30, "h": 39 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 67, "y": 41, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 30, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 135, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 30, "h": 41 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 99, "y": 43, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 30, "h": 40 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 1, "y": 155, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 107, "y": 189, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 32, "h": 32 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 1, "y": 191, "w": 31, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 16, "w": 31, "h": 31 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 69, "y": 190, "w": 31, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 31, "h": 33 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 35, "y": 188, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 750 + }, + { + "filename": "0071.png", + "frame": { "x": 145, "y": 121, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 117, "w": 32, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 36 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 107, "y": 152, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 1, "y": 44, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 131, "y": 44, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 34, "h": 35 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 81, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 34, "h": 34 }, + "sourceSize": { "w": 34, "h": 47 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 202, "h": 224 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/656.png b/public/images/pokemon/exp/back/shiny/656.png index 47b18020ffe..0c974e52a98 100644 Binary files a/public/images/pokemon/exp/back/shiny/656.png and b/public/images/pokemon/exp/back/shiny/656.png differ diff --git a/public/images/pokemon/exp/back/shiny/658-ash.json b/public/images/pokemon/exp/back/shiny/658-ash.json index db9e546af7f..8e360497b8d 100644 --- a/public/images/pokemon/exp/back/shiny/658-ash.json +++ b/public/images/pokemon/exp/back/shiny/658-ash.json @@ -1,188 +1,155 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 75, - "y": 62, - "w": 75, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d9855568004fd93bcd73aa782894b172:d7e4656a720ccca08a26ed4485129bb3:f09eeed5adc5ec50aec50218e03662c2$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658-ash.png", + "format": "I8", + "size": { "w": 146, "h": 146 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/658-ash.png b/public/images/pokemon/exp/back/shiny/658-ash.png index a2a53dbdbc7..3269d435c94 100644 Binary files a/public/images/pokemon/exp/back/shiny/658-ash.png and b/public/images/pokemon/exp/back/shiny/658-ash.png differ diff --git a/public/images/pokemon/exp/back/shiny/658.json b/public/images/pokemon/exp/back/shiny/658.json index 8dc315c768e..453f6c16dc6 100644 --- a/public/images/pokemon/exp/back/shiny/658.json +++ b/public/images/pokemon/exp/back/shiny/658.json @@ -1,188 +1,92 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:661efcc0c742bc0d4b4e26900a59332f:d0aa0f579971d046660bf77b4044aa35:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 77, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 77, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658.png", + "format": "I8", + "size": { "w": 154, "h": 154 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/658.png b/public/images/pokemon/exp/back/shiny/658.png index 416f1145463..bb0ee7accdf 100644 Binary files a/public/images/pokemon/exp/back/shiny/658.png and b/public/images/pokemon/exp/back/shiny/658.png differ diff --git a/public/images/pokemon/exp/back/shiny/661.json b/public/images/pokemon/exp/back/shiny/661.json index 1199eaead4b..be82a4ce425 100644 --- a/public/images/pokemon/exp/back/shiny/661.json +++ b/public/images/pokemon/exp/back/shiny/661.json @@ -1,356 +1,398 @@ -{ - "textures": [ - { - "image": "661.png", - "format": "RGBA8888", - "size": { - "w": 68, - "h": 68 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 34 - }, - "frame": { - "x": 32, - "y": 34, - "w": 32, - "h": 34 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:622c17fd3933b7d7d1eddb422fc24fc5:684446320bdfd8fa492ed28395182fcc:186d621a544ea0e0e2e0bd57975a29b1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 39, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0004.png", + "frame": { "x": 105, "y": 36, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0005.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0006.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0007.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0008.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0011.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0013.png", + "frame": { "x": 34, "y": 40, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0014.png", + "frame": { "x": 69, "y": 37, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0015.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0016.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0017.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0018.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0021.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 117, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0023.png", + "frame": { "x": 34, "y": 40, "w": 34, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0024.png", + "frame": { "x": 69, "y": 37, "w": 35, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0025.png", + "frame": { "x": 33, "y": 118, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0026.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0027.png", + "frame": { "x": 68, "y": 75, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0028.png", + "frame": { "x": 35, "y": 0, "w": 34, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 34, "h": 40 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 35, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0031.png", + "frame": { "x": 66, "y": 114, "w": 33, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 33, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0032.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0033.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0034.png", + "frame": { "x": 101, "y": 112, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 34, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0035.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0036.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0037.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0038.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0039.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0040.png", + "frame": { "x": 105, "y": 0, "w": 37, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 36 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0041.png", + "frame": { "x": 69, "y": 0, "w": 36, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 36, "h": 37 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0042.png", + "frame": { "x": 104, "y": 74, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 34, "h": 38 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + }, + { + "filename": "0043.png", + "frame": { "x": 33, "y": 79, "w": 33, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 33, "h": 39 }, + "sourceSize": { "w": 38, "h": 40 }, + "duration": 120 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "661.png", + "format": "I8", + "size": { "w": 142, "h": 156 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/661.png b/public/images/pokemon/exp/back/shiny/661.png index a76bde31ab3..a38de0cabe4 100644 Binary files a/public/images/pokemon/exp/back/shiny/661.png and b/public/images/pokemon/exp/back/shiny/661.png differ diff --git a/public/images/pokemon/exp/back/shiny/662.json b/public/images/pokemon/exp/back/shiny/662.json index f2154fb0de0..52cc70bbe5d 100644 --- a/public/images/pokemon/exp/back/shiny/662.json +++ b/public/images/pokemon/exp/back/shiny/662.json @@ -1,671 +1,254 @@ -{ - "textures": [ - { - "image": "662.png", - "format": "RGBA8888", - "size": { - "w": 154, - "h": 154 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 2, - "y": 16, - "w": 56, - "h": 37 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 37 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 56, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 56, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 105, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 8, - "y": 17, - "w": 49, - "h": 48 - }, - "frame": { - "x": 105, - "y": 0, - "w": 49, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 57, - "h": 50 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 48, - "w": 57, - "h": 51 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 57, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 57, - "h": 52 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 52 - }, - "frame": { - "x": 57, - "y": 99, - "w": 57, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:14a51ba69bd1aad179c85e117e323d5e:a3d65c092dec9149a9e5c39aed3a7dc3:e3da2dd0277c18bcc713dc6dd2460c87$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 70, "w": 53, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 16, "w": 53, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 212, "y": 70, "w": 52, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 18, "w": 52, "h": 63 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 247, "y": 204, "w": 46, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 36, "w": 46, "h": 51 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 1, "y": 196, "w": 49, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 33, "w": 49, "h": 49 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 56, "y": 1, "w": 56, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 56, "h": 65 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 224, "y": 1, "w": 52, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 52, "h": 68 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 107, "y": 68, "w": 48, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 48, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 277, "y": 1, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 12, "w": 51, "h": 68 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 113, "y": 1, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 18, "w": 55, "h": 66 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 48, "y": 249, "w": 44, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 31, "w": 44, "h": 50 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 191, "y": 248, "w": 47, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 27, "w": 47, "h": 49 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 169, "y": 1, "w": 54, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 54, "h": 67 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 101, "y": 208, "w": 45, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 18, "w": 45, "h": 51 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 246, "w": 46, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 13, "w": 46, "h": 51 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 1, "y": 1, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 56, "y": 67, "w": 50, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 50, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 265, "y": 70, "w": 47, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 47, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 102, "y": 138, "w": 44, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 11, "w": 44, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 147, "y": 193, "w": 43, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 14, "w": 43, "h": 69 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 191, "y": 199, "w": 55, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 31, "w": 55, "h": 48 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 51, "y": 200, "w": 49, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 27, "w": 49, "h": 48 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 156, "y": 69, "w": 55, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 55, "h": 60 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 133, "w": 50, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 50, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 208, "y": 134, "w": 48, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 48, "h": 64 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 257, "y": 140, "w": 48, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 48, "h": 63 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 52, "y": 137, "w": 49, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 49, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 156, "y": 130, "w": 51, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 13, "w": 51, "h": 62 }, + "sourceSize": { "w": 70, "h": 87 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "662.png", + "format": "I8", + "size": { "w": 329, "h": 300 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/662.png b/public/images/pokemon/exp/back/shiny/662.png index b4e6c703eab..b914dac31b1 100644 Binary files a/public/images/pokemon/exp/back/shiny/662.png and b/public/images/pokemon/exp/back/shiny/662.png differ diff --git a/public/images/pokemon/exp/back/shiny/663.json b/public/images/pokemon/exp/back/shiny/663.json index d464b333f20..48526624362 100644 --- a/public/images/pokemon/exp/back/shiny/663.json +++ b/public/images/pokemon/exp/back/shiny/663.json @@ -1,1700 +1,731 @@ -{ - "textures": [ - { - "image": "663.png", - "format": "RGBA8888", - "size": { - "w": 302, - "h": 302 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 33, - "w": 103, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 103, - "h": 59 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 29, - "w": 112, - "h": 60 - }, - "frame": { - "x": 103, - "y": 0, - "w": 112, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 14, - "y": 0, - "w": 84, - "h": 93 - }, - "frame": { - "x": 215, - "y": 0, - "w": 84, - "h": 93 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 29, - "w": 112, - "h": 62 - }, - "frame": { - "x": 0, - "y": 60, - "w": 112, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 98, - "h": 90 - }, - "frame": { - "x": 112, - "y": 60, - "w": 98, - "h": 90 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 92, - "h": 93 - }, - "frame": { - "x": 210, - "y": 93, - "w": 92, - "h": 93 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 1, - "y": 28, - "w": 109, - "h": 65 - }, - "frame": { - "x": 0, - "y": 122, - "w": 109, - "h": 65 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 97, - "h": 91 - }, - "frame": { - "x": 109, - "y": 150, - "w": 97, - "h": 91 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 116, - "h": 93 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 105, - "h": 83 - }, - "frame": { - "x": 0, - "y": 187, - "w": 105, - "h": 83 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cee80289834c8acf0ea6d754131cf471:08d47f0b9be8c73bf8d3f74f4dc0a00d:3790d8d72a704a789cc594688d98802e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0003.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0004.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0006.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0008.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0009.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0010.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0013.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0014.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0016.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0018.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0019.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0020.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0023.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0024.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0026.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0028.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0029.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0030.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0033.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0034.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0036.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0038.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0039.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0040.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0043.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0044.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0046.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0048.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0049.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0050.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0053.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0054.png", + "frame": { "x": 276, "y": 92, "w": 111, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 32, "w": 111, "h": 60 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0056.png", + "frame": { "x": 276, "y": 153, "w": 110, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 32, "w": 110, "h": 58 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0058.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 5, "w": 96, "h": 88 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0059.png", + "frame": { "x": 298, "y": 0, "w": 90, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0060.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0062.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0065.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0067.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0070.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0072.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0075.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 0, "w": 95, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 95, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0077.png", + "frame": { "x": 193, "y": 0, "w": 104, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 11, "w": 104, "h": 81 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 90, "w": 107, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 31, "w": 107, "h": 64 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 155, "w": 101, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 36, "w": 101, "h": 57 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0080.png", + "frame": { "x": 193, "y": 82, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 93 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "663.png", + "format": "I8", + "size": { "w": 388, "h": 212 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/663.png b/public/images/pokemon/exp/back/shiny/663.png index bb8a7a63b47..ddb4658f34f 100644 Binary files a/public/images/pokemon/exp/back/shiny/663.png and b/public/images/pokemon/exp/back/shiny/663.png differ diff --git a/public/images/pokemon/exp/back/shiny/664.json b/public/images/pokemon/exp/back/shiny/664.json index 737a874aeef..61c85d30239 100644 --- a/public/images/pokemon/exp/back/shiny/664.json +++ b/public/images/pokemon/exp/back/shiny/664.json @@ -1,104 +1,110 @@ -{ - "textures": [ - { - "image": "664.png", - "format": "RGBA8888", - "size": { - "w": 72, - "h": 72 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 24, - "h": 44 - }, - "frame": { - "x": 24, - "y": 0, - "w": 24, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 24, - "h": 42 - }, - "frame": { - "x": 48, - "y": 0, - "w": 24, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:601a4fb542614963fb9749e3339712b0:f6208a116912601a698682c3723dc18c:596e7d5b15b1bf041c4d7f6707c8ff49$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 54, "y": 49, "w": 26, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 26, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 80, "y": 96, "w": 26, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 26, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 97, "w": 26, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 26, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 49, "w": 27, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 27, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 26, "y": 97, "w": 26, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 47 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 80, "y": 49, "w": 27, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 27, "h": 47 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 27, "y": 49, "w": 27, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 27, "h": 48 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 28, "y": 0, "w": 27, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 55, "y": 0, "w": 27, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 28, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 82, "y": 0, "w": 27, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 27, "h": 49 }, + "sourceSize": { "w": 28, "h": 49 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "664.png", + "format": "I8", + "size": { "w": 109, "h": 145 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/664.png b/public/images/pokemon/exp/back/shiny/664.png index 84657407fb6..ad6b46a574e 100644 Binary files a/public/images/pokemon/exp/back/shiny/664.png and b/public/images/pokemon/exp/back/shiny/664.png differ diff --git a/public/images/pokemon/exp/back/shiny/665.json b/public/images/pokemon/exp/back/shiny/665.json index 74db8ba58cd..fe2659dbf6d 100644 --- a/public/images/pokemon/exp/back/shiny/665.json +++ b/public/images/pokemon/exp/back/shiny/665.json @@ -1,188 +1,596 @@ -{ - "textures": [ - { - "image": "665.png", - "format": "RGBA8888", - "size": { - "w": 107, - "h": 107 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 38, - "h": 36 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 38, - "h": 36 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 38, - "h": 36 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 36 - }, - "frame": { - "x": 38, - "y": 0, - "w": 37, - "h": 36 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 36 - }, - "frame": { - "x": 38, - "y": 36, - "w": 37, - "h": 36 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 38, - "y": 72, - "w": 38, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:33adc9cf726011c23993f48b34d8072e:5df22173a3e399c0e4fd7f67a42a829c:a72e6c94514c750d7462eab6b08ee591$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 262, "y": 102, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 9, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 120, "y": 101, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 8, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 71, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 358, "y": 69, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 86, "y": 73, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 160, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 290, "y": 67, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 160, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 47, "y": 40, "w": 39, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 5, "w": 39, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 343, "y": 34, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 5, "w": 45, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 227, "y": 33, "w": 63, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 63, "h": 36 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 0, "w": 74, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 74, "h": 40 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 154, "y": 0, "w": 81, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 81, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 235, "y": 0, "w": 81, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 81, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 0, "w": 80, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 80, "h": 38 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 154, "y": 33, "w": 73, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 73, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 316, "y": 0, "w": 73, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 73, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 290, "y": 34, "w": 53, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 7, "w": 53, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 38, "w": 47, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 7, "w": 47, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 86, "y": 40, "w": 40, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 40, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 101, "w": 34, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 7, "w": 34, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 36, "y": 75, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 194, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 228, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 324, "y": 69, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 126, "y": 66, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 5, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "665.png", + "format": "I8", + "size": { "w": 394, "h": 134 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/665.png b/public/images/pokemon/exp/back/shiny/665.png index 098b20d3d82..6b8ae18d7a0 100644 Binary files a/public/images/pokemon/exp/back/shiny/665.png and b/public/images/pokemon/exp/back/shiny/665.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-archipelago.json b/public/images/pokemon/exp/back/shiny/666-archipelago.json index 5207ba45af5..817696f70a1 100644 --- a/public/images/pokemon/exp/back/shiny/666-archipelago.json +++ b/public/images/pokemon/exp/back/shiny/666-archipelago.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-archipelago.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d3b3934e858033f670ae2a24ec4d347a:f014942f9212da6fadbc8a0c94f2dc11:80cdb6dd219378a41ccf5c2acc7e7786$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-archipelago.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-archipelago.png b/public/images/pokemon/exp/back/shiny/666-archipelago.png index cfc3f0012b6..ada5bd02bdb 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-archipelago.png and b/public/images/pokemon/exp/back/shiny/666-archipelago.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-continental.json b/public/images/pokemon/exp/back/shiny/666-continental.json index a20a1baa32b..fc21deb6978 100644 --- a/public/images/pokemon/exp/back/shiny/666-continental.json +++ b/public/images/pokemon/exp/back/shiny/666-continental.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-continental.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 46, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:06c65586a6c76ae16868407b3530cc3e:c9740628cc5f7aa0301821f74d9d2e17:23aaac2256d564b9d8a58d7de70397c3$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-continental.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-continental.png b/public/images/pokemon/exp/back/shiny/666-continental.png index 80fdfbd42fe..a70b86e6f4e 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-continental.png and b/public/images/pokemon/exp/back/shiny/666-continental.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-elegant.json b/public/images/pokemon/exp/back/shiny/666-elegant.json index e4372fe6e79..35c20315153 100644 --- a/public/images/pokemon/exp/back/shiny/666-elegant.json +++ b/public/images/pokemon/exp/back/shiny/666-elegant.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-elegant.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 44, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2f5780697c633c5f2db2d90012b0bfaa:3df5d06e71f1f48664b1d3f70b589ce5:d6b035048c66474f6236a3bc923faa7b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-elegant.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-elegant.png b/public/images/pokemon/exp/back/shiny/666-elegant.png index a63ccd8a4fd..f1493354831 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-elegant.png and b/public/images/pokemon/exp/back/shiny/666-elegant.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-fancy.json b/public/images/pokemon/exp/back/shiny/666-fancy.json index da0238946be..54113df4b51 100644 --- a/public/images/pokemon/exp/back/shiny/666-fancy.json +++ b/public/images/pokemon/exp/back/shiny/666-fancy.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-fancy.png", - "format": "RGBA8888", - "size": { - "w": 133, - "h": 133 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 67 - }, - "frame": { - "x": 65, - "y": 0, - "w": 41, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 67 - }, - "frame": { - "x": 0, - "y": 66, - "w": 41, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 65, - "h": 66 - }, - "frame": { - "x": 41, - "y": 67, - "w": 65, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f6d28d4fec94007c70d1812b69e8c9a4:cff02079419826e1cb2148e331588d89:6d5edff9a806f43feff031c9919c9aca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-fancy.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-fancy.png b/public/images/pokemon/exp/back/shiny/666-fancy.png index c84443bbe4e..6a50c5817a8 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-fancy.png and b/public/images/pokemon/exp/back/shiny/666-fancy.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-garden.json b/public/images/pokemon/exp/back/shiny/666-garden.json index 1a44f773e4f..4fcc5ab0ad1 100644 --- a/public/images/pokemon/exp/back/shiny/666-garden.json +++ b/public/images/pokemon/exp/back/shiny/666-garden.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-garden.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b8e1d103e0e6ac306d2c8f447067ec3c:8483540406726b13fa42ad566b4f6991:f13a1a8fa0a411aa91fccb833ac8719c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-garden.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-garden.png b/public/images/pokemon/exp/back/shiny/666-garden.png index b37c6f8c84e..92214cc4d75 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-garden.png and b/public/images/pokemon/exp/back/shiny/666-garden.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-high-plains.json b/public/images/pokemon/exp/back/shiny/666-high-plains.json index 898cbf94515..56a90a01899 100644 --- a/public/images/pokemon/exp/back/shiny/666-high-plains.json +++ b/public/images/pokemon/exp/back/shiny/666-high-plains.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-high-plains.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6a10c59dc5b4abef78a2379364bae874:239b86e13316e6d8fc74b42cc7f657d9:2abdb5d19b2754e3daa24b6ff3ed2c2c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-high-plains.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-high-plains.png b/public/images/pokemon/exp/back/shiny/666-high-plains.png index e23f879af0c..80e02eede13 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-high-plains.png and b/public/images/pokemon/exp/back/shiny/666-high-plains.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-icy-snow.json b/public/images/pokemon/exp/back/shiny/666-icy-snow.json index 4922c7c1fb6..b44f33bb07f 100644 --- a/public/images/pokemon/exp/back/shiny/666-icy-snow.json +++ b/public/images/pokemon/exp/back/shiny/666-icy-snow.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-icy-snow.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a19b20c8ff121729b5b9dfb470e1e166:abf786c03cda88b39336d9172fd788ec:fb1e8b97806dc5c60ac6adf0ae48199b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-icy-snow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-icy-snow.png b/public/images/pokemon/exp/back/shiny/666-icy-snow.png index 2ba96cc9ac3..1fe8305f068 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-icy-snow.png and b/public/images/pokemon/exp/back/shiny/666-icy-snow.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-jungle.json b/public/images/pokemon/exp/back/shiny/666-jungle.json index 17254038662..51876d649da 100644 --- a/public/images/pokemon/exp/back/shiny/666-jungle.json +++ b/public/images/pokemon/exp/back/shiny/666-jungle.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-jungle.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4318d523b7ff0df47aa749ed39d81402:f7d5cbe7029fecd1e518aa0501a8c8ba:c8686bcc5493911384853d54c85bfea1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-jungle.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-jungle.png b/public/images/pokemon/exp/back/shiny/666-jungle.png index 3f1127f0265..1dbe65c02f2 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-jungle.png and b/public/images/pokemon/exp/back/shiny/666-jungle.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-marine.json b/public/images/pokemon/exp/back/shiny/666-marine.json index 5e89662d52f..a77fd76f1dd 100644 --- a/public/images/pokemon/exp/back/shiny/666-marine.json +++ b/public/images/pokemon/exp/back/shiny/666-marine.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-marine.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:df888a902e99f6aa55c8d9a1696f30ef:5e5db402df59c188bf1aaf4cc0b516d5:dc240f0acbf3d56fe8729dd1f703009f$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-marine.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-marine.png b/public/images/pokemon/exp/back/shiny/666-marine.png index 7e1a47124b9..1a69d6587da 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-marine.png and b/public/images/pokemon/exp/back/shiny/666-marine.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-meadow.json b/public/images/pokemon/exp/back/shiny/666-meadow.json index 54e872aee05..2c4a73b80cf 100644 --- a/public/images/pokemon/exp/back/shiny/666-meadow.json +++ b/public/images/pokemon/exp/back/shiny/666-meadow.json @@ -1,524 +1,119 @@ -{ - "textures": [ - { - "image": "666-meadow.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:217e1d90eca71c8b95407de1c156a5e6:e2b23be3d14960d78059a46f5b83304a:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-meadow.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-meadow.png b/public/images/pokemon/exp/back/shiny/666-meadow.png index 2e8a64be5d4..1148fa5a620 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-meadow.png and b/public/images/pokemon/exp/back/shiny/666-meadow.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-modern.json b/public/images/pokemon/exp/back/shiny/666-modern.json index c60078bd8ce..e0a00da6d81 100644 --- a/public/images/pokemon/exp/back/shiny/666-modern.json +++ b/public/images/pokemon/exp/back/shiny/666-modern.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-modern.png", - "format": "RGBA8888", - "size": { - "w": 132, - "h": 132 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 40, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 40, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 40, - "y": 0, - "w": 65, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 65, - "h": 66 - }, - "frame": { - "x": 40, - "y": 66, - "w": 65, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:854759536c0175b34e9ed7b2513e55dd:9fbbae33832e3b62152c5bae85714a7a:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-modern.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-modern.png b/public/images/pokemon/exp/back/shiny/666-modern.png index f9654fbeb02..d9f109c8ef9 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-modern.png and b/public/images/pokemon/exp/back/shiny/666-modern.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-monsoon.json b/public/images/pokemon/exp/back/shiny/666-monsoon.json index 78130a47159..117fad03b83 100644 --- a/public/images/pokemon/exp/back/shiny/666-monsoon.json +++ b/public/images/pokemon/exp/back/shiny/666-monsoon.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-monsoon.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dcde8c849851ea64b2ceed92a82153e1:5a97106b9193dc2cda01b0448d9f2637:637bea52b465abfb8e5a576310b4dacc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-monsoon.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-monsoon.png b/public/images/pokemon/exp/back/shiny/666-monsoon.png index 5d87fc101a8..cc5279545d5 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-monsoon.png and b/public/images/pokemon/exp/back/shiny/666-monsoon.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-ocean.json b/public/images/pokemon/exp/back/shiny/666-ocean.json index 1bf44996eef..8d23d70cd31 100644 --- a/public/images/pokemon/exp/back/shiny/666-ocean.json +++ b/public/images/pokemon/exp/back/shiny/666-ocean.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-ocean.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dc3f54a39a4afa0ea28913252050d7c1:d856dfe44678a2ee4dc3d367a6658ad3:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-ocean.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-ocean.png b/public/images/pokemon/exp/back/shiny/666-ocean.png index 8c6aeca189a..caabd9302ea 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-ocean.png and b/public/images/pokemon/exp/back/shiny/666-ocean.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-poke-ball.json b/public/images/pokemon/exp/back/shiny/666-poke-ball.json index 5c8715a8a1e..45564e59a32 100644 --- a/public/images/pokemon/exp/back/shiny/666-poke-ball.json +++ b/public/images/pokemon/exp/back/shiny/666-poke-ball.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-poke-ball.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9df25dba5036e3cd48218e8de3a98074:4357b8b161f5f87776f4d39fcb3723f5:8ec14f129d1691b8da504a13b661abed$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-poke-ball.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-poke-ball.png b/public/images/pokemon/exp/back/shiny/666-poke-ball.png index 24907a5ef9f..30e2cbf8615 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-poke-ball.png and b/public/images/pokemon/exp/back/shiny/666-poke-ball.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-polar.json b/public/images/pokemon/exp/back/shiny/666-polar.json index ef69f49e390..abb6d0286f4 100644 --- a/public/images/pokemon/exp/back/shiny/666-polar.json +++ b/public/images/pokemon/exp/back/shiny/666-polar.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-polar.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 45, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:aab22d39518ad2f1b1621a5954e95674:958cacbba11b25f5b1e7fe9a9a40465d:eb7086e98f867c6592e4b161835da18b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-polar.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-polar.png b/public/images/pokemon/exp/back/shiny/666-polar.png index b2f00a2a6df..c9f4fe642ee 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-polar.png and b/public/images/pokemon/exp/back/shiny/666-polar.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-savanna.json b/public/images/pokemon/exp/back/shiny/666-savanna.json index 24638119724..8fa326da1b4 100644 --- a/public/images/pokemon/exp/back/shiny/666-savanna.json +++ b/public/images/pokemon/exp/back/shiny/666-savanna.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-savanna.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0c7fd4a8c1137a2566fabe2f53dac4c4:295a7bdde494b6106f9c73b649be6098:625a4f0dc001069326a75c6a381f93e6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-savanna.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-savanna.png b/public/images/pokemon/exp/back/shiny/666-savanna.png index 5fcf8bc6d28..a69c0c18ae1 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-savanna.png and b/public/images/pokemon/exp/back/shiny/666-savanna.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-sun.json b/public/images/pokemon/exp/back/shiny/666-sun.json index a2ccb3c82d8..d41f22f541c 100644 --- a/public/images/pokemon/exp/back/shiny/666-sun.json +++ b/public/images/pokemon/exp/back/shiny/666-sun.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-sun.png", - "format": "RGBA8888", - "size": { - "w": 135, - "h": 135 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 65, - "h": 67 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 70 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 68 - }, - "frame": { - "x": 65, - "y": 0, - "w": 41, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 70 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 41, - "h": 68 - }, - "frame": { - "x": 0, - "y": 67, - "w": 41, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 65, - "h": 67 - }, - "frame": { - "x": 41, - "y": 68, - "w": 65, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d1400564456ce432aab0ca4f263c336a:fba76efed9d6341c0b46301efd8cd8f5:8f5fdd0a698701f5391c5a3f67e303d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-sun.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-sun.png b/public/images/pokemon/exp/back/shiny/666-sun.png index 28918f2b59a..3914a0fe350 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-sun.png and b/public/images/pokemon/exp/back/shiny/666-sun.png differ diff --git a/public/images/pokemon/exp/back/shiny/666-tundra.json b/public/images/pokemon/exp/back/shiny/666-tundra.json index 8361b7ca139..afa574f9e07 100644 --- a/public/images/pokemon/exp/back/shiny/666-tundra.json +++ b/public/images/pokemon/exp/back/shiny/666-tundra.json @@ -1,104 +1,119 @@ -{ - "textures": [ - { - "image": "666-tundra.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 46, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b87511ba7b272729aecbf5eb18fe65cc:383836b7b2902a470e150b17bdd9bcfc:9779ed3adebc298af537dd64dc25fe00$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 2, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 2, "y": 71, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 124, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 140, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 71, "y": 71, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 71, "y": 2, "w": 67, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 67, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 209, "y": 2, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 51, "h": 67 }, + "sourceSize": { "w": 67, "h": 73 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "666-tundra.png", + "format": "I8", + "size": { "w": 262, "h": 140 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/666-tundra.png b/public/images/pokemon/exp/back/shiny/666-tundra.png index c33fbf1fc65..78316df8a8f 100644 Binary files a/public/images/pokemon/exp/back/shiny/666-tundra.png and b/public/images/pokemon/exp/back/shiny/666-tundra.png differ diff --git a/public/images/pokemon/exp/back/shiny/667.json b/public/images/pokemon/exp/back/shiny/667.json index cf561f26e4f..db9918ea230 100644 --- a/public/images/pokemon/exp/back/shiny/667.json +++ b/public/images/pokemon/exp/back/shiny/667.json @@ -1,1532 +1,659 @@ -{ - "textures": [ - { - "image": "667.png", - "format": "RGBA8888", - "size": { - "w": 160, - "h": 160 - }, - "scale": 1, - "frames": [ - { - "filename": "0056.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4fbaee798794f5f6bc216941c6d420d9:a27205da0cc7ce20d4a4422df81b9109:02171d511e760c8a3e1b623ad6bf93f5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0066.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0068.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0070.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0071.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0072.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "667.png", + "format": "I8", + "size": { "w": 167, "h": 138 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/667.png b/public/images/pokemon/exp/back/shiny/667.png index eb8b7eb756f..d44bed5ee65 100644 Binary files a/public/images/pokemon/exp/back/shiny/667.png and b/public/images/pokemon/exp/back/shiny/667.png differ diff --git a/public/images/pokemon/exp/back/shiny/668.json b/public/images/pokemon/exp/back/shiny/668.json index cd1665c7fe7..594e69189dc 100644 --- a/public/images/pokemon/exp/back/shiny/668.json +++ b/public/images/pokemon/exp/back/shiny/668.json @@ -1,146 +1,821 @@ -{ - "textures": [ - { - "image": "668.png", - "format": "RGBA8888", - "size": { - "w": 146, - "h": 146 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 73, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 73, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 73, - "h": 60 - }, - "frame": { - "x": 0, - "y": 61, - "w": 73, - "h": 60 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 73, - "h": 60 - }, - "frame": { - "x": 0, - "y": 61, - "w": 73, - "h": 60 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 72, - "h": 59 - }, - "frame": { - "x": 73, - "y": 61, - "w": 72, - "h": 59 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0e20693ecfc704a58db8c8592fcdc9cc:659468d84f3cc98068a3454a7c68f1e4:947bf84d1af493c62e2cef45bb6c19ad$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 458, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 303, "y": 364, "w": 74, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 227, "y": 294, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 378, "y": 364, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 75, "h": 69 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 303, "y": 293, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 379, "y": 293, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 454, "y": 364, "w": 72, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 72, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 70, "y": 365, "w": 68, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 68, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 291, "y": 435, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 378, "y": 434, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 224, "y": 365, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 66, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 365, "w": 69, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 69, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 229, "y": 220, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 73, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 468, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 308, "y": 147, "w": 74, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 74, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 148, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 383, "y": 220, "w": 74, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 74, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 231, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 79, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 156, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 310, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 464, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 77, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 154, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 76, "y": 220, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 152, "y": 220, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 76, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 221, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 293, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 75, "y": 293, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668.png", + "format": "I8", + "size": { "w": 543, "h": 507 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/668.png b/public/images/pokemon/exp/back/shiny/668.png index e2fa147e7fd..0ece333f235 100644 Binary files a/public/images/pokemon/exp/back/shiny/668.png and b/public/images/pokemon/exp/back/shiny/668.png differ diff --git a/public/images/pokemon/exp/back/shiny/672.json b/public/images/pokemon/exp/back/shiny/672.json index a8bb0336e34..f877b9abc2e 100644 --- a/public/images/pokemon/exp/back/shiny/672.json +++ b/public/images/pokemon/exp/back/shiny/672.json @@ -1,965 +1,479 @@ -{ - "textures": [ - { - "image": "672.png", - "format": "RGBA8888", - "size": { - "w": 282, - "h": 282 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 168, - "w": 41, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 0, - "y": 210, - "w": 41, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 82, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 123, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 164, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 205, - "y": 0, - "w": 41, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 42, - "w": 41, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 84, - "w": 41, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 42 - }, - "frame": { - "x": 41, - "y": 126, - "w": 41, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 168, - "w": 41, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 41, - "y": 209, - "w": 41, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 123, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 164, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 205, - "y": 42, - "w": 41, - "h": 41 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 83, - "w": 41, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 41 - }, - "frame": { - "x": 82, - "y": 124, - "w": 41, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 165, - "w": 40, - "h": 42 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 42 - }, - "frame": { - "x": 82, - "y": 207, - "w": 40, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 122, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 123, - "y": 124, - "w": 40, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 165, - "w": 40, - "h": 41 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 162, - "y": 206, - "w": 40, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 40, - "h": 41 - }, - "frame": { - "x": 163, - "y": 83, - "w": 40, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 163, - "y": 124, - "w": 41, - "h": 40 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 40 - }, - "frame": { - "x": 203, - "y": 83, - "w": 41, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 164, - "w": 40, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 204, - "y": 123, - "w": 40, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 163, - "w": 40, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 242, - "y": 203, - "w": 40, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 41, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 40, - "h": 40 - }, - "frame": { - "x": 202, - "y": 204, - "w": 40, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e27a409eb13547a4ef97935b726389b3:05b6a88e37fb9d64101b9f9071f3afb5:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 39, "y": 0, "w": 39, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 39, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 39, "h": 56 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 79, "y": 146, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 119, "y": 146, "w": 38, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 38, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 39, "y": 0, "w": 39, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 39, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 39, "h": 56 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 79, "y": 146, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 119, "y": 146, "w": 38, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 38, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "672.png", + "format": "I8", + "size": { "w": 160, "h": 195 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/672.png b/public/images/pokemon/exp/back/shiny/672.png index 2fab39d2aee..848b2e35962 100644 Binary files a/public/images/pokemon/exp/back/shiny/672.png and b/public/images/pokemon/exp/back/shiny/672.png differ diff --git a/public/images/pokemon/exp/back/shiny/674.json b/public/images/pokemon/exp/back/shiny/674.json deleted file mode 100644 index 52192847bdf..00000000000 --- a/public/images/pokemon/exp/back/shiny/674.json +++ /dev/null @@ -1,1175 +0,0 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 124, - "h": 124 - }, - "scale": 1, - "frames": [ - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 29, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 29, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 29, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 29, - "h": 42 - }, - "frame": { - "x": 58, - "y": 0, - "w": 29, - "h": 42 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 87, - "y": 0, - "w": 28, - "h": 42 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 29, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 29, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 29, - "h": 40 - }, - "frame": { - "x": 29, - "y": 42, - "w": 29, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 29, - "h": 40 - }, - "frame": { - "x": 29, - "y": 42, - "w": 29, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 58, - "y": 42, - "w": 28, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 29, - "y": 82, - "w": 28, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 28, - "h": 41 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 57, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 28, - "h": 40 - }, - "frame": { - "x": 85, - "y": 84, - "w": 28, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 86, - "y": 42, - "w": 28, - "h": 41 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 86, - "y": 42, - "w": 28, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 29, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 28, - "h": 41 - }, - "frame": { - "x": 86, - "y": 42, - "w": 28, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:76841431bc0f022caab94cff146aa974:cfb5f5b4c165e509044ceea57b0d5b30:b823d10f1c9b4d501296982088ba63d6$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/674.png b/public/images/pokemon/exp/back/shiny/674.png deleted file mode 100644 index 75e7b228137..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/674.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/shiny/692.json b/public/images/pokemon/exp/back/shiny/692.json index 9e90079e613..801710c4861 100644 --- a/public/images/pokemon/exp/back/shiny/692.json +++ b/public/images/pokemon/exp/back/shiny/692.json @@ -1,1847 +1,794 @@ -{ - "textures": [ - { - "image": "692.png", - "format": "RGBA8888", - "size": { - "w": 168, - "h": 168 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 61, - "h": 35 - }, - "frame": { - "x": 61, - "y": 0, - "w": 61, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 60, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 60, - "h": 35 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 60, - "h": 34 - }, - "frame": { - "x": 60, - "y": 35, - "w": 60, - "h": 34 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 60, - "h": 32 - }, - "frame": { - "x": 60, - "y": 69, - "w": 60, - "h": 32 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 60, - "h": 32 - }, - "frame": { - "x": 60, - "y": 69, - "w": 60, - "h": 32 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 59, - "h": 35 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 59, - "h": 35 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 59, - "h": 35 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 59, - "h": 35 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 59, - "h": 35 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 59, - "h": 35 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 59, - "h": 35 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 59, - "h": 35 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 105, - "w": 59, - "h": 35 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 105, - "w": 59, - "h": 35 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 105, - "w": 59, - "h": 35 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 59, - "h": 35 - }, - "frame": { - "x": 0, - "y": 105, - "w": 59, - "h": 35 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 58, - "h": 35 - }, - "frame": { - "x": 59, - "y": 101, - "w": 58, - "h": 35 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 57, - "h": 32 - }, - "frame": { - "x": 59, - "y": 136, - "w": 57, - "h": 32 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8f5831496e68316e4cb3449a0eaf2bb1:e0a74859ab21c488d9f8cbabc8355b5a:2880def858c84cd859bedf13b0b49a33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 60, "y": 72, "w": 58, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 31 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 119, "y": 72, "w": 56, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 31 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 60, "y": 72, "w": 58, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 31 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "692.png", + "format": "I8", + "size": { "w": 181, "h": 106 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/692.png b/public/images/pokemon/exp/back/shiny/692.png index a08f22af600..c1bb353a739 100644 Binary files a/public/images/pokemon/exp/back/shiny/692.png and b/public/images/pokemon/exp/back/shiny/692.png differ diff --git a/public/images/pokemon/exp/back/shiny/693.json b/public/images/pokemon/exp/back/shiny/693.json index b0fcec5a40b..6358a8908f6 100644 --- a/public/images/pokemon/exp/back/shiny/693.json +++ b/public/images/pokemon/exp/back/shiny/693.json @@ -1,230 +1,902 @@ -{ - "textures": [ - { - "image": "693.png", - "format": "RGBA8888", - "size": { - "w": 223, - "h": 223 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 90, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 72 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 72 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 72 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 90, - "h": 72 - }, - "frame": { - "x": 90, - "y": 0, - "w": 90, - "h": 72 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 73 - }, - "frame": { - "x": 0, - "y": 72, - "w": 90, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 73 - }, - "frame": { - "x": 0, - "y": 72, - "w": 90, - "h": 73 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 75 - }, - "frame": { - "x": 90, - "y": 72, - "w": 90, - "h": 75 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 75 - }, - "frame": { - "x": 90, - "y": 72, - "w": 90, - "h": 75 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 76 - }, - "frame": { - "x": 0, - "y": 145, - "w": 90, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 76 - }, - "frame": { - "x": 0, - "y": 145, - "w": 90, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 76 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 76 - }, - "frame": { - "x": 90, - "y": 147, - "w": 90, - "h": 76 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e2d977eceb50e18ece349b4545bbecdd:e9880823c470ec1cfcd9a8f06892f017:9c1f9147e693c05eb4655590e9099679$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 565, "y": 196, "w": 90, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 6, "w": 90, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 278, "y": 266, "w": 90, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 90, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 189, "y": 199, "w": 95, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 95, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 193, "y": 1, "w": 98, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 98, "h": 68 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 1, "y": 136, "w": 94, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 95, "y": 72, "w": 96, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 12, "w": 96, "h": 63 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 381, "y": 1, "w": 97, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 97, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 191, "y": 136, "w": 94, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 95, "y": 135, "w": 96, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 96, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 572, "y": 67, "w": 99, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 99, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 284, "y": 205, "w": 95, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 11, "w": 95, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 1, "y": 199, "w": 91, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 12, "w": 91, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 1, "y": 259, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 12, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 193, "y": 69, "w": 95, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 5, "w": 95, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 285, "y": 141, "w": 92, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 8, "w": 92, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 96, "y": 318, "w": 89, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 14, "w": 89, "h": 58 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 564, "y": 261, "w": 92, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 14, "w": 92, "h": 58 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "693.png", + "format": "I8", + "size": { "w": 672, "h": 377 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/693.png b/public/images/pokemon/exp/back/shiny/693.png index 5eb7110fc3d..10b639004ae 100644 Binary files a/public/images/pokemon/exp/back/shiny/693.png and b/public/images/pokemon/exp/back/shiny/693.png differ diff --git a/public/images/pokemon/exp/back/shiny/694.json b/public/images/pokemon/exp/back/shiny/694.json deleted file mode 100644 index ec28fb40922..00000000000 --- a/public/images/pokemon/exp/back/shiny/694.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 130, - "h": 130 - }, - "scale": 1, - "frames": [ - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 35 - }, - "frame": { - "x": 48, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 36 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 36 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 47, - "h": 37 - }, - "frame": { - "x": 47, - "y": 35, - "w": 47, - "h": 37 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 47, - "h": 37 - }, - "frame": { - "x": 47, - "y": 35, - "w": 47, - "h": 37 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 38 - }, - "frame": { - "x": 0, - "y": 71, - "w": 46, - "h": 38 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 38 - }, - "frame": { - "x": 0, - "y": 71, - "w": 46, - "h": 38 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 39 - }, - "frame": { - "x": 46, - "y": 72, - "w": 44, - "h": 39 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 39 - }, - "frame": { - "x": 46, - "y": 72, - "w": 44, - "h": 39 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 39 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 40, - "h": 39 - }, - "frame": { - "x": 90, - "y": 72, - "w": 40, - "h": 39 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d46bf508ccc2fa50cb3f373328d8e60a:7d537a54677423b5809fcbc4394d9538:b0990f9650cfe63b836cbed33f0b44d8$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/694.png b/public/images/pokemon/exp/back/shiny/694.png deleted file mode 100644 index 2df2c82fdd7..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/694.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/shiny/697.json b/public/images/pokemon/exp/back/shiny/697.json index ade475cd439..6963da289ab 100644 --- a/public/images/pokemon/exp/back/shiny/697.json +++ b/public/images/pokemon/exp/back/shiny/697.json @@ -1,1196 +1,992 @@ -{ - "textures": [ - { - "image": "697.png", - "format": "RGBA8888", - "size": { - "w": 374, - "h": 374 - }, - "scale": 1, - "frames": [ - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 63, - "h": 78 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 78 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 63, - "h": 78 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 60, - "h": 78 - }, - "frame": { - "x": 0, - "y": 78, - "w": 60, - "h": 78 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 66, - "h": 77 - }, - "frame": { - "x": 0, - "y": 156, - "w": 66, - "h": 77 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 66, - "h": 77 - }, - "frame": { - "x": 0, - "y": 156, - "w": 66, - "h": 77 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 60, - "y": 78, - "w": 77, - "h": 76 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 63, - "y": 0, - "w": 77, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 0, - "y": 233, - "w": 77, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 76 - }, - "frame": { - "x": 66, - "y": 154, - "w": 77, - "h": 76 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 76, - "h": 76 - }, - "frame": { - "x": 137, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 69, - "h": 76 - }, - "frame": { - "x": 140, - "y": 0, - "w": 69, - "h": 76 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 69, - "h": 76 - }, - "frame": { - "x": 140, - "y": 0, - "w": 69, - "h": 76 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 209, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 77, - "h": 73 - }, - "frame": { - "x": 285, - "y": 0, - "w": 77, - "h": 73 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 75 - }, - "frame": { - "x": 285, - "y": 73, - "w": 76, - "h": 75 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 72, - "h": 75 - }, - "frame": { - "x": 213, - "y": 75, - "w": 72, - "h": 75 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 72, - "h": 75 - }, - "frame": { - "x": 213, - "y": 75, - "w": 72, - "h": 75 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 74 - }, - "frame": { - "x": 285, - "y": 148, - "w": 76, - "h": 74 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 74 - }, - "frame": { - "x": 285, - "y": 148, - "w": 76, - "h": 74 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 75, - "h": 75 - }, - "frame": { - "x": 143, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 77, - "y": 230, - "w": 74, - "h": 74 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 151, - "y": 227, - "w": 74, - "h": 74 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 75, - "h": 73 - }, - "frame": { - "x": 151, - "y": 301, - "w": 75, - "h": 73 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 75, - "h": 73 - }, - "frame": { - "x": 151, - "y": 301, - "w": 75, - "h": 73 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 225, - "y": 222, - "w": 74, - "h": 74 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 74 - }, - "frame": { - "x": 299, - "y": 222, - "w": 74, - "h": 74 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 226, - "y": 296, - "w": 73, - "h": 74 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 78 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 73, - "h": 74 - }, - "frame": { - "x": 299, - "y": 296, - "w": 73, - "h": 74 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dc19d18c6fcbcf52992f8e0181b428f3:44bc6e229ce96fd68619c97288aeb670:f4fdd87d2fc1483d8e0a185c2654e3d9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 286, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 185, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 93, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 301, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 182, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 273, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 182, "y": 378, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 273, "y": 449, "w": 89, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 89, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 177, "y": 452, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 452, "y": 450, "w": 89, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 89, "h": 72 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 461, "y": 376, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 90, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 649, "y": 375, "w": 91, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 91, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 558, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 649, "y": 300, "w": 91, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 91, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 373, "y": 227, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 370, "y": 303, "w": 90, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 90, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 558, "y": 227, "w": 90, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 90, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 376, "w": 88, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 88, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 89, "y": 379, "w": 87, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 87, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 365, "y": 378, "w": 86, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 86, "h": 76 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 640, "y": 449, "w": 84, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 84, "h": 77 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 552, "y": 378, "w": 87, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 87, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 92, "y": 303, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 465, "y": 302, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 186, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 225, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 670, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 93, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 472, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 565, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 670, "y": 150, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 277, "y": 301, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 149, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 388, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 97, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 292, "y": 0, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 196, "y": 0, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 582, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 98, "y": 0, "w": 97, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 97, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 0, "w": 97, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 97, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 485, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 388, "y": 0, "w": 96, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 96, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 75, "w": 96, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 96, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 286, "y": 76, "w": 95, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 95, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 670, "y": 76, "w": 95, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 95, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 658, "y": 226, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 94, "h": 73 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 191, "y": 76, "w": 94, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 94, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 279, "y": 226, "w": 93, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 93, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 679, "y": 0, "w": 94, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 94, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 482, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 576, "y": 75, "w": 93, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 93, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 379, "y": 151, "w": 92, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 92, "h": 75 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 465, "y": 227, "w": 92, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 92, "h": 74 }, + "sourceSize": { "w": 100, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "697.png", + "format": "I8", + "size": { "w": 773, "h": 526 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/697.png b/public/images/pokemon/exp/back/shiny/697.png index cc3a5b344c3..fabed852462 100644 Binary files a/public/images/pokemon/exp/back/shiny/697.png and b/public/images/pokemon/exp/back/shiny/697.png differ diff --git a/public/images/pokemon/exp/back/shiny/698.json b/public/images/pokemon/exp/back/shiny/698.json deleted file mode 100644 index 197e3b844b3..00000000000 --- a/public/images/pokemon/exp/back/shiny/698.json +++ /dev/null @@ -1,3296 +0,0 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 181, - "h": 181 - }, - "scale": 1, - "frames": [ - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 45, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 43, - "h": 55 - }, - "frame": { - "x": 0, - "y": 54, - "w": 43, - "h": 55 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 45, - "h": 53 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 53 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 56 - }, - "frame": { - "x": 0, - "y": 109, - "w": 41, - "h": 56 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 56 - }, - "frame": { - "x": 90, - "y": 0, - "w": 39, - "h": 56 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 56 - }, - "frame": { - "x": 129, - "y": 0, - "w": 37, - "h": 56 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 56 - }, - "frame": { - "x": 41, - "y": 109, - "w": 35, - "h": 56 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 33, - "h": 55 - }, - "frame": { - "x": 43, - "y": 54, - "w": 33, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 57 - }, - "frame": { - "x": 76, - "y": 56, - "w": 37, - "h": 57 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 113, - "y": 56, - "w": 35, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 33, - "h": 54 - }, - "frame": { - "x": 148, - "y": 56, - "w": 33, - "h": 54 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 76, - "y": 113, - "w": 35, - "h": 58 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 111, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 146, - "y": 114, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7926d4052a1ca822dcfc49423c76e3a1:6930576af3683498fb06f805ffdf25f2:198087d69fed44d4a642fa3ba5c077d6$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/698.png b/public/images/pokemon/exp/back/shiny/698.png deleted file mode 100644 index 781f363220a..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/698.png and /dev/null 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/700.json b/public/images/pokemon/exp/back/shiny/700.json index fd3cf94bb73..70083de61c9 100644 --- a/public/images/pokemon/exp/back/shiny/700.json +++ b/public/images/pokemon/exp/back/shiny/700.json @@ -1,1364 +1,587 @@ -{ - "textures": [ - { - "image": "700.png", - "format": "RGBA8888", - "size": { - "w": 248, - "h": 248 - }, - "scale": 1, - "frames": [ - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 54, - "h": 61 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 61 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 50, - "h": 64 - }, - "frame": { - "x": 54, - "y": 0, - "w": 50, - "h": 64 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 50, - "h": 64 - }, - "frame": { - "x": 0, - "y": 61, - "w": 50, - "h": 64 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 61 - }, - "frame": { - "x": 50, - "y": 64, - "w": 51, - "h": 61 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 48, - "h": 64 - }, - "frame": { - "x": 101, - "y": 64, - "w": 48, - "h": 64 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 61 - }, - "frame": { - "x": 0, - "y": 125, - "w": 51, - "h": 61 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 49, - "h": 61 - }, - "frame": { - "x": 51, - "y": 125, - "w": 49, - "h": 61 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 49, - "h": 61 - }, - "frame": { - "x": 51, - "y": 125, - "w": 49, - "h": 61 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 49, - "h": 60 - }, - "frame": { - "x": 104, - "y": 0, - "w": 49, - "h": 60 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 100, - "y": 128, - "w": 48, - "h": 61 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 0, - "y": 186, - "w": 48, - "h": 61 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 48, - "y": 186, - "w": 48, - "h": 61 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 48, - "y": 186, - "w": 48, - "h": 61 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 148, - "y": 128, - "w": 48, - "h": 61 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 48, - "h": 61 - }, - "frame": { - "x": 148, - "y": 128, - "w": 48, - "h": 61 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 149, - "y": 60, - "w": 48, - "h": 60 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 153, - "y": 0, - "w": 48, - "h": 60 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 196, - "y": 120, - "w": 48, - "h": 60 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 48, - "h": 60 - }, - "frame": { - "x": 196, - "y": 120, - "w": 48, - "h": 60 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 48, - "h": 59 - }, - "frame": { - "x": 197, - "y": 60, - "w": 48, - "h": 59 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 201, - "y": 0, - "w": 47, - "h": 60 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 47, - "h": 60 - }, - "frame": { - "x": 196, - "y": 180, - "w": 47, - "h": 60 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 96, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 55, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 48, - "h": 58 - }, - "frame": { - "x": 144, - "y": 189, - "w": 48, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cc4ca4dff49e9c03ffd4d0d75ae6e17b:1555e19065e6e4144c3cbb6020a0ae39:2e4bf5ef1f19e475073f7da10c60b540$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 46, "y": 123, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 101, "y": 63, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 180, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 46, "h": 58 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 91, "y": 182, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 137, "y": 183, "w": 46, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 46, "h": 57 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 188, "y": 180, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 46, "y": 182, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 45, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 49, "y": 64, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 47, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 142, "y": 124, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 101, "y": 0, "w": 48, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 48, "h": 63 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 195, "y": 0, "w": 49, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 49, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 60, "w": 49, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 49, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 53, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 53, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 148, "y": 64, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 195, "y": 60, "w": 47, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 47, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 194, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 96, "y": 122, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 195, "y": 60, "w": 47, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 47, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 194, "y": 120, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 96, "y": 122, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 46, "h": 60 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 149, "y": 0, "w": 46, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 46, "h": 64 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 53, "y": 0, "w": 48, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 48, "h": 64 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 142, "y": 124, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 46, "h": 59 }, + "sourceSize": { "w": 55, "h": 64 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "700.png", + "format": "I8", + "size": { "w": 244, "h": 241 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/700.png b/public/images/pokemon/exp/back/shiny/700.png index fe533ba5a88..dab66177e99 100644 Binary files a/public/images/pokemon/exp/back/shiny/700.png and b/public/images/pokemon/exp/back/shiny/700.png differ diff --git a/public/images/pokemon/exp/back/shiny/702.json b/public/images/pokemon/exp/back/shiny/702.json index 2e194f21033..9680e17e397 100644 --- a/public/images/pokemon/exp/back/shiny/702.json +++ b/public/images/pokemon/exp/back/shiny/702.json @@ -1,1028 +1,443 @@ -{ - "textures": [ - { - "image": "702.png", - "format": "RGBA8888", - "size": { - "w": 141, - "h": 141 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 47, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 70, - "w": 47, - "h": 35 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 0, - "y": 105, - "w": 47, - "h": 35 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 35 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 35 - }, - "frame": { - "x": 47, - "y": 35, - "w": 46, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 47, - "y": 70, - "w": 47, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 93, - "y": 35, - "w": 47, - "h": 34 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 47, - "h": 34 - }, - "frame": { - "x": 94, - "y": 0, - "w": 47, - "h": 34 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 69, - "w": 47, - "h": 32 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 94, - "y": 101, - "w": 47, - "h": 32 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 47, - "h": 32 - }, - "frame": { - "x": 47, - "y": 104, - "w": 47, - "h": 32 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:72bba6c37c149abe81c9754a412876bd:fb5c4a7192ee7ba359b93fb9fea89158:ba8fdab405d5efab99c4aa1084328e6b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 48, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 93, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 139, "y": 70, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 95, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 142, "y": 0, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 140, "y": 36, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 47, "y": 72, "w": 45, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 45, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 72, "w": 46, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 46, "h": 31 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 93, "y": 70, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 36, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 47, "y": 36, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 45, "h": 35 }, + "sourceSize": { "w": 47, "h": 35 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "702.png", + "format": "I8", + "size": { "w": 188, "h": 103 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/702.png b/public/images/pokemon/exp/back/shiny/702.png index 12401f8950b..7a02b912cf0 100644 Binary files a/public/images/pokemon/exp/back/shiny/702.png and b/public/images/pokemon/exp/back/shiny/702.png differ diff --git a/public/images/pokemon/exp/back/shiny/703.json b/public/images/pokemon/exp/back/shiny/703.json deleted file mode 100644 index dee9aa2bb4e..00000000000 --- a/public/images/pokemon/exp/back/shiny/703.json +++ /dev/null @@ -1,1322 +0,0 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 152, - "h": 152 - }, - "scale": 1, - "frames": [ - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 38, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 38, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 38, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 38, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 38, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 38, - "h": 41 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 38, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 38, - "h": 41 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 38, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 38, - "h": 41 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 38, - "h": 41 - }, - "frame": { - "x": 0, - "y": 42, - "w": 38, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 83, - "w": 37, - "h": 41 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 39, - "h": 40 - }, - "frame": { - "x": 37, - "y": 83, - "w": 39, - "h": 40 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 39, - "h": 40 - }, - "frame": { - "x": 37, - "y": 83, - "w": 39, - "h": 40 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 39, - "h": 39 - }, - "frame": { - "x": 76, - "y": 0, - "w": 39, - "h": 39 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 39, - "h": 39 - }, - "frame": { - "x": 76, - "y": 0, - "w": 39, - "h": 39 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 39, - "h": 39 - }, - "frame": { - "x": 76, - "y": 0, - "w": 39, - "h": 39 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 39, - "h": 39 - }, - "frame": { - "x": 76, - "y": 0, - "w": 39, - "h": 39 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 39, - "h": 39 - }, - "frame": { - "x": 76, - "y": 0, - "w": 39, - "h": 39 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 40 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 40 - }, - "frame": { - "x": 115, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 40 - }, - "frame": { - "x": 115, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 40 - }, - "frame": { - "x": 115, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 40 - }, - "frame": { - "x": 115, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 38, - "h": 40 - }, - "frame": { - "x": 76, - "y": 39, - "w": 38, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 38, - "h": 40 - }, - "frame": { - "x": 76, - "y": 39, - "w": 38, - "h": 40 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 38, - "h": 40 - }, - "frame": { - "x": 76, - "y": 39, - "w": 38, - "h": 40 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 38, - "h": 40 - }, - "frame": { - "x": 76, - "y": 39, - "w": 38, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 40 - }, - "frame": { - "x": 38, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 40 - }, - "frame": { - "x": 114, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 40 - }, - "frame": { - "x": 114, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 40 - }, - "frame": { - "x": 114, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 40 - }, - "frame": { - "x": 114, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 40 - }, - "frame": { - "x": 114, - "y": 40, - "w": 38, - "h": 40 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 40 - }, - "frame": { - "x": 76, - "y": 79, - "w": 38, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 37, - "h": 40 - }, - "frame": { - "x": 114, - "y": 80, - "w": 37, - "h": 40 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 37, - "h": 40 - }, - "frame": { - "x": 114, - "y": 80, - "w": 37, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 37, - "h": 40 - }, - "frame": { - "x": 114, - "y": 80, - "w": 37, - "h": 40 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 37, - "h": 40 - }, - "frame": { - "x": 114, - "y": 80, - "w": 37, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:910fb9af9ea6e167d162cc6f8ae5174e:9e48a450788ccb42705466148db9893d:721af8c322ff60159262e9b3017c784d$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/703.png b/public/images/pokemon/exp/back/shiny/703.png deleted file mode 100644 index 2081d702118..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/703.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/shiny/704.json b/public/images/pokemon/exp/back/shiny/704.json index 32f8d89d5a8..ff94c52a2a8 100644 --- a/public/images/pokemon/exp/back/shiny/704.json +++ b/public/images/pokemon/exp/back/shiny/704.json @@ -1,230 +1,101 @@ -{ - "textures": [ - { - "image": "704.png", - "format": "RGBA8888", - "size": { - "w": 81, - "h": 81 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 27, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 27, - "h": 34 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 27, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 27, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 27, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 27, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 27, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 27, - "h": 34 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 27, - "h": 33 - }, - "frame": { - "x": 27, - "y": 0, - "w": 27, - "h": 33 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 27, - "h": 33 - }, - "frame": { - "x": 27, - "y": 0, - "w": 27, - "h": 33 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 27, - "h": 33 - }, - "frame": { - "x": 27, - "y": 33, - "w": 27, - "h": 33 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 27, - "h": 33 - }, - "frame": { - "x": 27, - "y": 33, - "w": 27, - "h": 33 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 27, - "h": 32 - }, - "frame": { - "x": 0, - "y": 34, - "w": 27, - "h": 32 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 27, - "h": 34 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 27, - "h": 31 - }, - "frame": { - "x": 54, - "y": 0, - "w": 27, - "h": 31 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6de9f988e21fa1819baa4118b3f8d3c5:467738d3742ffa651ad1f101f3369860:45bb13be23ae6e2a6654a2a00c450d62$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0002.png", + "frame": { "x": 53, "y": 0, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0003.png", + "frame": { "x": 26, "y": 0, "w": 27, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 27, "h": 31 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0004.png", + "frame": { "x": 53, "y": 0, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0007.png", + "frame": { "x": 26, "y": 31, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0008.png", + "frame": { "x": 52, "y": 32, "w": 27, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 27, "h": 30 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0009.png", + "frame": { "x": 26, "y": 31, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 27, "h": 34 }, + "duration": 150 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "704.png", + "format": "I8", + "size": { "w": 79, "h": 63 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/704.png b/public/images/pokemon/exp/back/shiny/704.png index 5d3b5026ded..75a2898cd92 100644 Binary files a/public/images/pokemon/exp/back/shiny/704.png and b/public/images/pokemon/exp/back/shiny/704.png differ diff --git a/public/images/pokemon/exp/back/shiny/705.json b/public/images/pokemon/exp/back/shiny/705.json index ab139c247f5..2fc8cb18e99 100644 --- a/public/images/pokemon/exp/back/shiny/705.json +++ b/public/images/pokemon/exp/back/shiny/705.json @@ -1,230 +1,596 @@ -{ - "textures": [ - { - "image": "705.png", - "format": "RGBA8888", - "size": { - "w": 118, - "h": 118 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 59 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 59 - }, - "frame": { - "x": 0, - "y": 59, - "w": 37, - "h": 59 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 59 - }, - "frame": { - "x": 0, - "y": 59, - "w": 37, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 59 - }, - "frame": { - "x": 37, - "y": 59, - "w": 35, - "h": 59 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 59 - }, - "frame": { - "x": 39, - "y": 0, - "w": 35, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 59 - }, - "frame": { - "x": 39, - "y": 0, - "w": 35, - "h": 59 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 58 - }, - "frame": { - "x": 72, - "y": 59, - "w": 41, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 41, - "h": 58 - }, - "frame": { - "x": 72, - "y": 59, - "w": 41, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 42, - "h": 57 - }, - "frame": { - "x": 74, - "y": 0, - "w": 42, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:82a03fa5424412ce647108fd8dac55a8:b9edd38338e7033be81034e75b8ae8a8:6b57e983626c7fc9144ab67f30c66814$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 40, "y": 185, "w": 40, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 40, "h": 58 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 77, "y": 298, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 162, "y": 299, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 202, "y": 299, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 117, "y": 300, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 121, "y": 245, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 55 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 80, "y": 242, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 244, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 40, "h": 57 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 194, "y": 240, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 39, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 125, "w": 37, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 156, "y": 184, "w": 38, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 38, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 243, "w": 37, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 158, "y": 0, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 39, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 156, "y": 62, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 197, "y": 0, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 40, "y": 185, "w": 40, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 40, "h": 58 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 77, "y": 298, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 162, "y": 299, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 202, "y": 299, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 117, "y": 300, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 121, "y": 245, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 55 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 80, "y": 242, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 244, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 40, "h": 57 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 194, "y": 240, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 39, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 125, "w": 37, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 156, "y": 184, "w": 38, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 38, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 40, "y": 243, "w": 37, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 158, "y": 0, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 39, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 156, "y": 62, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 197, "y": 0, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 185, "w": 40, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 40, "h": 58 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 77, "y": 298, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 162, "y": 299, "w": 40, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 202, "y": 299, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 117, "y": 300, "w": 41, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 54 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 121, "y": 245, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 55 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 80, "y": 242, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 56 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 244, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 40, "h": 57 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 194, "y": 240, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 39, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 125, "w": 37, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 156, "y": 184, "w": 38, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 38, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 40, "y": 243, "w": 37, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 37, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 158, "y": 0, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 39, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 156, "y": 62, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 197, "y": 0, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 116, "y": 124, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 195, "y": 181, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 118, "y": 0, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 40, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 40, "h": 62 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 118, "y": 61, "w": 38, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 38, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 62, "w": 38, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 38, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 40, "y": 0, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 39, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 79, "y": 0, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 39, "h": 63 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 38, "y": 63, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 77, "y": 63, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 195, "y": 120, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 123, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 38, "y": 124, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 77, "y": 124, "w": 39, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 61 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 197, "y": 60, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 60 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 116, "y": 183, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 185, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 40, "h": 59 }, + "sourceSize": { "w": 43, "h": 63 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "705.png", + "format": "I8", + "size": { "w": 243, "h": 355 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/705.png b/public/images/pokemon/exp/back/shiny/705.png index 65c9933f415..4ee803dd570 100644 Binary files a/public/images/pokemon/exp/back/shiny/705.png and b/public/images/pokemon/exp/back/shiny/705.png differ diff --git a/public/images/pokemon/exp/back/shiny/707.png b/public/images/pokemon/exp/back/shiny/707.png deleted file mode 100644 index 538667f7252..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/707.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/shiny/708.json b/public/images/pokemon/exp/back/shiny/708.json deleted file mode 100644 index fe864e9f9ea..00000000000 --- a/public/images/pokemon/exp/back/shiny/708.json +++ /dev/null @@ -1,503 +0,0 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 135, - "h": 135 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 45, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 45, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 45, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 45, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 45, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 2, - "y": 8, - "w": 45, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 45, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 44, - "h": 46 - }, - "frame": { - "x": 45, - "y": 46, - "w": 44, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 44, - "h": 46 - }, - "frame": { - "x": 45, - "y": 46, - "w": 44, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 44, - "h": 46 - }, - "frame": { - "x": 45, - "y": 46, - "w": 44, - "h": 46 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 45, - "h": 45 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 44, - "h": 41 - }, - "frame": { - "x": 91, - "y": 0, - "w": 44, - "h": 41 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 44, - "h": 41 - }, - "frame": { - "x": 91, - "y": 0, - "w": 44, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 45 - }, - "frame": { - "x": 89, - "y": 45, - "w": 45, - "h": 45 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 45 - }, - "frame": { - "x": 89, - "y": 45, - "w": 45, - "h": 45 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 45, - "h": 45 - }, - "frame": { - "x": 89, - "y": 45, - "w": 45, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 44 - }, - "frame": { - "x": 89, - "y": 90, - "w": 45, - "h": 44 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 44 - }, - "frame": { - "x": 89, - "y": 90, - "w": 45, - "h": 44 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 51 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 44 - }, - "frame": { - "x": 89, - "y": 90, - "w": 45, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ae43a2361518d114c34efceaee18a46b:85de733a19b6cdd71d9518299acef7f4:796c82c5076b122f2663381836c65843$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/708.png b/public/images/pokemon/exp/back/shiny/708.png deleted file mode 100644 index 8673e917e75..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/708.png and /dev/null 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/712.json b/public/images/pokemon/exp/back/shiny/712.json index 1fc96cf19a4..869a92fd6ea 100644 --- a/public/images/pokemon/exp/back/shiny/712.json +++ b/public/images/pokemon/exp/back/shiny/712.json @@ -1,3338 +1,1433 @@ -{ - "textures": [ - { - "image": "712.png", - "format": "RGBA8888", - "size": { - "w": 208, - "h": 208 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 37, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 37, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 75, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 75, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 113, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 113, - "y": 0, - "w": 38, - "h": 41 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 151, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 74, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 111, - "y": 41, - "w": 37, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 148, - "y": 44, - "w": 37, - "h": 43 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 37, - "h": 43 - }, - "frame": { - "x": 37, - "y": 84, - "w": 37, - "h": 43 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 37, - "h": 42 - }, - "frame": { - "x": 74, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 84, - "w": 37, - "h": 41 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 148, - "y": 87, - "w": 37, - "h": 41 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 148, - "y": 87, - "w": 37, - "h": 41 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 125, - "w": 37, - "h": 41 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 126, - "w": 37, - "h": 41 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 37, - "y": 127, - "w": 37, - "h": 41 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 37, - "y": 127, - "w": 37, - "h": 41 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 74, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 168, - "w": 37, - "h": 40 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 168, - "w": 37, - "h": 40 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 166, - "w": 37, - "h": 41 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 111, - "y": 166, - "w": 37, - "h": 41 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 36, - "h": 41 - }, - "frame": { - "x": 148, - "y": 128, - "w": 36, - "h": 41 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 36, - "h": 41 - }, - "frame": { - "x": 148, - "y": 128, - "w": 36, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6fc0455d6f0af01f72622b0f21f8ee70:352443e5019cc9719abfbd45c1015afa:3a1cc69824960d920ca43f8c9376d136$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 145, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 72, "y": 43, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 108, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 144, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 72, "y": 0, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 181, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 0, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 36, "y": 0, "w": 35, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 44 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 109, "y": 0, "w": 35, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 43 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 180, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 180, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 148, "y": 87, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 148, "y": 87, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 36, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 36, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 72, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 72, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 0, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 72, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 72, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 108, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 108, "y": 128, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 37, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 37, "y": 86, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 74, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 74, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 144, "y": 129, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 144, "y": 129, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 111, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 111, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 180, "y": 129, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 180, "y": 129, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 168, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 0, "y": 168, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 0, "y": 127, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 148, "y": 87, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 148, "y": 87, "w": 35, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 35, "h": 41 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0157.png", + "frame": { "x": 180, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + }, + { + "filename": "0158.png", + "frame": { "x": 180, "y": 44, "w": 35, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 35, "h": 42 }, + "sourceSize": { "w": 40, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "712.png", + "format": "I8", + "size": { "w": 216, "h": 207 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/712.png b/public/images/pokemon/exp/back/shiny/712.png index 709718daf83..989ed14b08e 100644 Binary files a/public/images/pokemon/exp/back/shiny/712.png and b/public/images/pokemon/exp/back/shiny/712.png differ diff --git a/public/images/pokemon/exp/back/shiny/713.json b/public/images/pokemon/exp/back/shiny/713.json index 8f1736a5256..0ff72eef867 100644 --- a/public/images/pokemon/exp/back/shiny/713.json +++ b/public/images/pokemon/exp/back/shiny/713.json @@ -1,188 +1,1100 @@ -{ - "textures": [ - { - "image": "713.png", - "format": "RGBA8888", - "size": { - "w": 199, - "h": 199 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 87, - "h": 69 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 87, - "h": 66 - }, - "frame": { - "x": 87, - "y": 69, - "w": 87, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 87, - "h": 66 - }, - "frame": { - "x": 87, - "y": 69, - "w": 87, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 87, - "h": 64 - }, - "frame": { - "x": 87, - "y": 135, - "w": 87, - "h": 64 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0af8023555592952fe28b217e91b3a50:e8f7bce9a0476374152ae2437bd2d84b:625f70bcfe9c7f2437cb9cad6d2b863c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 87, "y": 188, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 87, "h": 60 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 174, "y": 128, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 261, "y": 127, "w": 87, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 87, "h": 61 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 127, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 87, "y": 126, "w": 87, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 62 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 183, "y": 0, "w": 87, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 65 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 63, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 270, "y": 0, "w": 87, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 64 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 270, "y": 64, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 174, "y": 65, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 174, "y": 65, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 92, "y": 0, "w": 91, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 91, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 92, "y": 0, "w": 91, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 91, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 92, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 87, "y": 63, "w": 87, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 87, "h": 63 }, + "sourceSize": { "w": 92, "h": 66 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "713.png", + "format": "I8", + "size": { "w": 357, "h": 248 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/713.png b/public/images/pokemon/exp/back/shiny/713.png index 87011e1bbb9..b4417f8386b 100644 Binary files a/public/images/pokemon/exp/back/shiny/713.png and b/public/images/pokemon/exp/back/shiny/713.png differ diff --git a/public/images/pokemon/exp/back/shiny/714.json b/public/images/pokemon/exp/back/shiny/714.json deleted file mode 100644 index 1d8e87ffa8c..00000000000 --- a/public/images/pokemon/exp/back/shiny/714.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 147, - "h": 147 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 13, - "y": 0, - "w": 34, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 34, - "h": 57 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 60, - "h": 58 - }, - "frame": { - "x": 34, - "y": 0, - "w": 60, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 46, - "h": 58 - }, - "frame": { - "x": 94, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 46, - "h": 58 - }, - "frame": { - "x": 94, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 58, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 58, - "h": 58 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 1, - "y": 10, - "w": 58, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 58, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 54, - "h": 58 - }, - "frame": { - "x": 58, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 54, - "h": 58 - }, - "frame": { - "x": 58, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 12, - "y": 1, - "w": 35, - "h": 58 - }, - "frame": { - "x": 112, - "y": 58, - "w": 35, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 69 - }, - "spriteSourceSize": { - "x": 12, - "y": 1, - "w": 35, - "h": 58 - }, - "frame": { - "x": 112, - "y": 58, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b5f2c2112a42d04cd66e9ed8b57be94f:1af3c375153c5a8b4950e81283c602fa:1a07d46e710b0568ec824f54fbc4fe6a$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/714.png b/public/images/pokemon/exp/back/shiny/714.png deleted file mode 100644 index fa2c001e7cc..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/714.png and /dev/null 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/718-10.json b/public/images/pokemon/exp/back/shiny/718-10.json deleted file mode 100644 index 147d661bd6b..00000000000 --- a/public/images/pokemon/exp/back/shiny/718-10.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 194, - "h": 194 - }, - "scale": 1, - "frames": [ - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 66 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 60, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 60, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 63, - "h": 65 - }, - "frame": { - "x": 60, - "y": 66, - "w": 63, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 63, - "h": 65 - }, - "frame": { - "x": 62, - "y": 0, - "w": 63, - "h": 65 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 63, - "h": 64 - }, - "frame": { - "x": 125, - "y": 0, - "w": 63, - "h": 64 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 62, - "h": 65 - }, - "frame": { - "x": 125, - "y": 64, - "w": 62, - "h": 65 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 63, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 59, - "h": 65 - }, - "frame": { - "x": 123, - "y": 129, - "w": 59, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9b4423fced8dd8763a4e886055e4ab1f:d04b9095317ace207a8d36f1e501da19:82195cf2a6db620c5643b8162d6e8c5c$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/718-10.png b/public/images/pokemon/exp/back/shiny/718-10.png deleted file mode 100644 index 63d73684da4..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/718-10.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/shiny/718.json b/public/images/pokemon/exp/back/shiny/718.json deleted file mode 100644 index b5cde64bbad..00000000000 --- a/public/images/pokemon/exp/back/shiny/718.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 216, - "h": 216 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 73, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 73, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 72, - "h": 89 - }, - "frame": { - "x": 74, - "y": 0, - "w": 72, - "h": 89 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 72, - "h": 89 - }, - "frame": { - "x": 74, - "y": 0, - "w": 72, - "h": 89 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 70, - "h": 88 - }, - "frame": { - "x": 146, - "y": 0, - "w": 70, - "h": 88 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 70, - "h": 88 - }, - "frame": { - "x": 146, - "y": 0, - "w": 70, - "h": 88 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 69, - "h": 87 - }, - "frame": { - "x": 146, - "y": 88, - "w": 69, - "h": 87 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b8c991edb02cd8fac15ae3bfa6518a6b:1cf351059eb3257fa98dfd55b07708c4:7b4a06b06cbac24b3f39727b0238661b$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/718.png b/public/images/pokemon/exp/back/shiny/718.png deleted file mode 100644 index 5e981224596..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/718.png and /dev/null differ diff --git a/public/images/pokemon/exp/back/shiny/719.json b/public/images/pokemon/exp/back/shiny/719.json deleted file mode 100644 index d39dc5b1c99..00000000000 --- a/public/images/pokemon/exp/back/shiny/719.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 158, - "h": 158 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 14, - "w": 39, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 39, - "h": 67 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 39, - "h": 67 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 67 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 40, - "h": 67 - }, - "frame": { - "x": 78, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 40, - "h": 67 - }, - "frame": { - "x": 78, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 40, - "h": 67 - }, - "frame": { - "x": 118, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 40, - "h": 67 - }, - "frame": { - "x": 118, - "y": 0, - "w": 40, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 41, - "h": 67 - }, - "frame": { - "x": 0, - "y": 67, - "w": 41, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 68 - }, - "frame": { - "x": 41, - "y": 67, - "w": 41, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 68 - }, - "frame": { - "x": 41, - "y": 67, - "w": 41, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 68 - }, - "frame": { - "x": 82, - "y": 67, - "w": 42, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 68 - }, - "frame": { - "x": 82, - "y": 67, - "w": 42, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4664ffe6d92453555d7befbaf3a06e34:ee4f7a42565694ad44dfdf274a36ffbb:17a705bb924916761be2495822a53735$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/719.png b/public/images/pokemon/exp/back/shiny/719.png deleted file mode 100644 index d1640abb4a0..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/719.png and /dev/null 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/815-gigantamax.json b/public/images/pokemon/exp/back/shiny/815-gigantamax.json new file mode 100644 index 00000000000..952ea16b6b8 --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/815-gigantamax.json @@ -0,0 +1,659 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 525, "y": 384, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 356, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 444, "y": 98, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 267, "y": 98, "w": 87, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 87, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 528, "y": 194, "w": 82, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 82, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 250, "y": 484, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 333, "y": 388, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 82, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 167, "y": 483, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 81, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 440, "y": 194, "w": 86, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 86, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 267, "y": 193, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 85, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 1, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 333, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 84, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 444, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 171, "y": 289, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 389, "w": 81, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 81, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 525, "y": 288, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 83, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 485, "w": 79, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 7, "w": 79, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 84, "y": 389, "w": 81, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 81, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 356, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 268, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 354, "y": 194, "w": 84, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 84, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 255, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 423, "y": 385, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 1, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 506, "y": 481, "w": 80, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 80, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 250, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 1, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 89, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 339, "y": 291, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 5, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 167, "y": 386, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 4, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 440, "y": 288, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 414, "y": 482, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "815-gigantamax.png", + "format": "I8", + "size": { "w": 611, "h": 579 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/815-gigantamax.png b/public/images/pokemon/exp/back/shiny/815-gigantamax.png new file mode 100644 index 00000000000..0668fd3b065 Binary files /dev/null and b/public/images/pokemon/exp/back/shiny/815-gigantamax.png differ diff --git a/public/images/pokemon/exp/back/shiny/839-gigantamax.json b/public/images/pokemon/exp/back/shiny/839-gigantamax.json new file mode 100644 index 00000000000..35d98910c9f --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/839-gigantamax.json @@ -0,0 +1,821 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 238, "y": 282, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 470, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 546, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 469, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 544, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 154, "y": 472, "w": 76, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 566, "w": 75, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 75, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 393, "y": 376, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 414, "y": 190, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 492, "y": 191, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 159, "y": 283, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 189, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 255, "y": 188, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 173, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 90, "y": 93, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 83, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 350, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 524, "y": 0, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 268, "y": 92, "w": 82, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 82, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 513, "y": 95, "w": 80, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 80, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 185, "w": 79, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 79, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 238, "y": 282, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 470, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 546, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 469, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 544, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 154, "y": 472, "w": 76, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 566, "w": 75, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 75, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 393, "y": 376, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 414, "y": 190, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 492, "y": 191, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 159, "y": 283, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 158, "y": 189, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 255, "y": 188, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 173, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 90, "y": 93, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 83, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 350, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 524, "y": 0, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 268, "y": 92, "w": 82, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 82, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 513, "y": 95, "w": 80, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 80, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 185, "w": 79, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 79, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 238, "y": 282, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 470, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 546, "y": 377, "w": 76, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 76, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 469, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 544, "y": 473, "w": 75, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 75, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 154, "y": 472, "w": 76, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 1, "w": 76, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 566, "w": 75, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 75, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 393, "y": 376, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 414, "y": 190, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 492, "y": 191, "w": 78, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 1, "w": 78, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 159, "y": 283, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 158, "y": 189, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 255, "y": 188, "w": 80, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 80, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 173, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 90, "y": 93, "w": 83, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 83, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 350, "y": 95, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 82, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 524, "y": 0, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 268, "y": 92, "w": 82, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 82, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 513, "y": 95, "w": 80, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 0, "w": 80, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 185, "w": 79, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 79, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 238, "y": 282, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 79, "y": 187, "w": 79, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 79, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 432, "y": 95, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 441, "y": 0, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 356, "y": 0, "w": 85, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 85, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 180, "y": 0, "w": 88, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 88, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 0, "w": 90, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 90, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 268, "y": 0, "w": 88, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 88, "h": 92 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 94, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 85, "h": 91 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 77, "y": 283, "w": 82, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 82, "h": 90 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 397, "y": 285, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 5, "w": 81, "h": 91 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 232, "y": 378, "w": 81, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 81, "h": 90 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 315, "y": 283, "w": 82, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 82, "h": 90 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 478, "y": 286, "w": 81, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 5, "w": 81, "h": 91 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 313, "y": 467, "w": 79, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 79, "h": 92 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 335, "y": 189, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 2, "w": 79, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 315, "y": 373, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 77, "y": 373, "w": 78, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 78, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 77, "y": 467, "w": 77, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 77, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 232, "y": 468, "w": 77, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 77, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 392, "y": 471, "w": 77, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 2, "w": 77, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 309, "y": 559, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 77, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 386, "y": 565, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 77, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 77, "y": 561, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 77, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 230, "y": 562, "w": 77, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 77, "h": 93 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 472, "w": 77, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 77, "h": 94 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 377, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 155, "y": 377, "w": 77, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 1, "w": 77, "h": 95 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 281, "w": 77, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 77, "h": 96 }, + "sourceSize": { "w": 106, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "839-gigantamax.png", + "format": "I8", + "size": { "w": 622, "h": 661 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/839-gigantamax.png b/public/images/pokemon/exp/back/shiny/839-gigantamax.png new file mode 100644 index 00000000000..ce96d8134a6 Binary files /dev/null and b/public/images/pokemon/exp/back/shiny/839-gigantamax.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/944.png b/public/images/pokemon/exp/back/shiny/944.png index a0d96282076..060e8a99545 100644 Binary files a/public/images/pokemon/exp/back/shiny/944.png and b/public/images/pokemon/exp/back/shiny/944.png differ diff --git a/public/images/pokemon/exp/back/shiny/945.png b/public/images/pokemon/exp/back/shiny/945.png index dabe70fdb31..71644f57479 100644 Binary files a/public/images/pokemon/exp/back/shiny/945.png and b/public/images/pokemon/exp/back/shiny/945.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/back/shiny/987.png b/public/images/pokemon/exp/back/shiny/987.png index d829e1a2d11..f62bb9f3ecc 100644 Binary files a/public/images/pokemon/exp/back/shiny/987.png and b/public/images/pokemon/exp/back/shiny/987.png differ diff --git a/public/images/pokemon/exp/708.json b/public/images/pokemon/exp/back/shiny/female/6215.json similarity index 62% rename from public/images/pokemon/exp/708.json rename to public/images/pokemon/exp/back/shiny/female/6215.json index f03fc408ded..07510ceaa55 100644 --- a/public/images/pokemon/exp/708.json +++ b/public/images/pokemon/exp/back/shiny/female/6215.json @@ -1,432 +1,33 @@ { "textures": [ { - "image": "708.png", + "image": "6215.png", "format": "RGBA8888", "size": { - "w": 206, - "h": 206 + "w": 155, + "h": 155 }, "scale": 1, "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 43 - } - }, { "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 43, - "w": 51, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, "y": 1, - "w": 51, - "h": 43 + "w": 54, + "h": 49 }, "frame": { "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 51, - "h": 43 - }, - "frame": { - "x": 0, - "y": 86, - "w": 51, - "h": 43 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 51, - "h": 42 - }, - "frame": { - "x": 0, - "y": 129, - "w": 51, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 42, - "w": 51, - "h": 42 + "w": 54, + "h": 49 } }, { @@ -434,20 +35,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 + "x": 0, + "y": 1, + "w": 54, + "h": 49 }, "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 } }, { @@ -455,20 +77,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 + "x": 0, + "y": 1, + "w": 54, + "h": 49 }, "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 } }, { @@ -476,461 +119,41 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 84, - "w": 51, - "h": 42 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 51, - "h": 42 - }, - "frame": { - "x": 51, - "y": 126, - "w": 51, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 0, - "w": 51, - "h": 42 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 51, - "h": 42 - }, - "frame": { - "x": 102, - "y": 42, - "w": 51, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 84, - "w": 51, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 51, - "h": 41 - }, - "frame": { - "x": 102, - "y": 125, - "w": 51, - "h": 41 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 50, - "h": 40 - }, - "frame": { - "x": 102, - "y": 166, - "w": 50, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { "x": 0, - "y": 6, - "w": 50, - "h": 40 - }, - "frame": { - "x": 152, - "y": 166, - "w": 50, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 6, "y": 1, - "w": 51, - "h": 41 + "w": 54, + "h": 49 }, "frame": { - "x": 153, + "x": 0, "y": 0, - "w": 51, - "h": 41 + "w": 54, + "h": 49 } }, { - "filename": "0042.png", + "filename": "0043.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 6, + "x": 0, "y": 1, - "w": 51, - "h": 41 + "w": 54, + "h": 49 }, "frame": { - "x": 153, + "x": 0, "y": 0, - "w": 51, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 41, - "w": 51, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 47 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 51, - "h": 41 - }, - "frame": { - "x": 153, - "y": 41, - "w": 51, - "h": 41 + "w": 54, + "h": 49 } }, { @@ -938,41 +161,146 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 51, - "h": 41 + "x": 0, + "y": 1, + "w": 54, + "h": 49 }, "frame": { - "x": 153, - "y": 82, - "w": 51, - "h": 41 + "x": 0, + "y": 0, + "w": 54, + "h": 49 } }, { - "filename": "0048.png", + "filename": "0005.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { - "x": 2, + "x": 0, "y": 3, - "w": 51, - "h": 41 + "w": 54, + "h": 47 }, "frame": { - "x": 153, - "y": 82, - "w": 51, - "h": 41 + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 } }, { @@ -980,20 +308,167 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, "h": 47 }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, "spriteSourceSize": { "x": 0, "y": 4, - "w": 51, - "h": 41 + "w": 54, + "h": 46 }, "frame": { - "x": 153, - "y": 123, - "w": 51, - "h": 41 + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 } }, { @@ -1001,20 +476,545 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 58, - "h": 47 + "w": 54, + "h": 50 }, "spriteSourceSize": { "x": 0, "y": 4, - "w": 51, - "h": 41 + "w": 54, + "h": 46 }, "frame": { - "x": 153, - "y": 123, + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, "w": 51, - "h": 41 + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 } } ] @@ -1023,6 +1023,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:db6408a4e96a3c4552035ce768316e02:28f26069e5c44ed9f6fa66442864f895:796c82c5076b122f2663381836c65843$" + "smartupdate": "$TexturePacker:SmartUpdate:7decf4c336c92bdacc5d43bc8590718f:30606c7130f3577df61a85f98b567a88:736cd88647e79ba7896fc74f9406c2fe$" } } diff --git a/public/images/pokemon/exp/back/shiny/female/6215.png b/public/images/pokemon/exp/back/shiny/female/6215.png new file mode 100644 index 00000000000..3af5e81148c Binary files /dev/null and b/public/images/pokemon/exp/back/shiny/female/6215.png differ diff --git a/public/images/pokemon/exp/back/shiny/female/668.json b/public/images/pokemon/exp/back/shiny/female/668.json new file mode 100644 index 00000000000..8e55af5a4de --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/female/668.json @@ -0,0 +1,820 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 233, "y": 213, "w": 78, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 78, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 156, "y": 144, "w": 79, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 79, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 319, "y": 144, "w": 80, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 80, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 73, "w": 80, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 80, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 310, "y": 282, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 534, "y": 350, "w": 71, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 4, "w": 71, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 301, "y": 351, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 67, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 353, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 3, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 204, "y": 417, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 139, "y": 352, "w": 65, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 65, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 73, "y": 352, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 66, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 368, "y": 351, "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 69, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 284, "w": 73, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 4, "w": 73, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 475, "y": 214, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 319, "y": 212, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 82, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 519, "y": 72, "w": 83, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 83, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 434, "y": 0, "w": 85, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 85, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 261, "y": 0, "w": 86, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 86, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 174, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 347, "y": 0, "w": 87, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 87, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 519, "y": 0, "w": 85, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 85, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 347, "y": 72, "w": 84, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 84, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 73, "w": 82, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 162, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 78, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 605, "h": 492 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/female/668.png b/public/images/pokemon/exp/back/shiny/female/668.png new file mode 100644 index 00000000000..cec15d8fcb7 Binary files /dev/null and b/public/images/pokemon/exp/back/shiny/female/668.png differ diff --git a/public/images/pokemon/exp/back/shiny/707.json b/public/images/pokemon/exp/female/6215.json similarity index 62% rename from public/images/pokemon/exp/back/shiny/707.json rename to public/images/pokemon/exp/female/6215.json index 384c57d4102..8e010a77bb6 100644 --- a/public/images/pokemon/exp/back/shiny/707.json +++ b/public/images/pokemon/exp/female/6215.json @@ -1,2007 +1,33 @@ { "textures": [ { - "image": "707.png", + "image": "6215.png", "format": "RGBA8888", "size": { - "w": 286, - "h": 286 + "w": 230, + "h": 230 }, "scale": 1, "frames": [ - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 115, - "y": 142, - "w": 42, - "h": 70 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 239, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 239, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 235, - "y": 69, - "w": 43, - "h": 69 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 235, - "y": 69, - "w": 43, - "h": 69 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 42, - "h": 69 - }, - "frame": { - "x": 235, - "y": 138, - "w": 42, - "h": 69 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 42, - "h": 69 - }, - "frame": { - "x": 235, - "y": 138, - "w": 42, - "h": 69 - } - }, { "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 48, - "h": 74 + "w": 56, + "h": 54 }, "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 + "x": 1, + "y": 1, + "w": 55, + "h": 50 }, "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, + "x": 0, "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 + "w": 55, + "h": 50 } }, { @@ -2009,20 +35,1175 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 48, - "h": 74 + "w": 56, + "h": 54 }, "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 + "x": 1, + "y": 1, + "w": 55, + "h": 50 }, "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 50, + "w": 55, + "h": 50 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 50, + "w": 55, + "h": 50 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 } }, { @@ -2030,20 +1211,125 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 48, - "h": 74 + "w": 56, + "h": 54 }, "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 + "x": 2, + "y": 2, + "w": 54, + "h": 49 }, "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 } }, { @@ -2051,20 +1337,734 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 48, - "h": 74 + "w": 56, + "h": 54 }, "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 + "x": 2, + "y": 2, + "w": 54, + "h": 49 }, "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 150, + "w": 53, + "h": 50 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 150, + "w": 53, + "h": 50 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 55, + "y": 51, + "w": 53, + "h": 50 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 55, + "y": 51, + "w": 53, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 108, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 108, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 155, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 155, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 47, + "h": 44 + }, + "frame": { + "x": 108, + "y": 96, + "w": 47, + "h": 44 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 47, + "h": 44 + }, + "frame": { + "x": 108, + "y": 96, + "w": 47, + "h": 44 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 46 + }, + "frame": { + "x": 155, + "y": 96, + "w": 45, + "h": 46 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 46 + }, + "frame": { + "x": 155, + "y": 96, + "w": 45, + "h": 46 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 45, + "h": 44 + }, + "frame": { + "x": 107, + "y": 140, + "w": 45, + "h": 44 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 45, + "h": 44 + }, + "frame": { + "x": 107, + "y": 140, + "w": 45, + "h": 44 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 39, + "h": 46 + }, + "frame": { + "x": 103, + "y": 184, + "w": 39, + "h": 46 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 39, + "h": 46 + }, + "frame": { + "x": 103, + "y": 184, + "w": 39, + "h": 46 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 38, + "h": 46 + }, + "frame": { + "x": 142, + "y": 184, + "w": 38, + "h": 46 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 38, + "h": 46 + }, + "frame": { + "x": 142, + "y": 184, + "w": 38, + "h": 46 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 41, + "h": 44 + }, + "frame": { + "x": 180, + "y": 142, + "w": 41, + "h": 44 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 41, + "h": 44 + }, + "frame": { + "x": 180, + "y": 142, + "w": 41, + "h": 44 } } ] @@ -2073,6 +2073,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cdbd19c7dad9a1ff1df2740c2ec77705:390b1dd326d02ff6f47617dbaa2be2bb:8e96b9056ea81e44ced99c97f472a528$" + "smartupdate": "$TexturePacker:SmartUpdate:a8930baf3a1083758adeeca87b28c6c7:3138fb5696691a4322b6805a44d3caa0:736cd88647e79ba7896fc74f9406c2fe$" } } diff --git a/public/images/pokemon/exp/female/6215.png b/public/images/pokemon/exp/female/6215.png new file mode 100644 index 00000000000..2d132090ae8 Binary files /dev/null and b/public/images/pokemon/exp/female/6215.png differ diff --git a/public/images/pokemon/exp/female/668.json b/public/images/pokemon/exp/female/668.json new file mode 100644 index 00000000000..443f13c0b54 --- /dev/null +++ b/public/images/pokemon/exp/female/668.json @@ -0,0 +1,820 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 147, "w": 64, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 64, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 127, "y": 152, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 64, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 465, "y": 146, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 65, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 399, "y": 146, "w": 66, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 66, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 334, "y": 74, "w": 66, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 66, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 191, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 126, "y": 223, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 462, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 188, "y": 291, "w": 61, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 61, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 249, "y": 291, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 60, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 62, "y": 292, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 122, "y": 295, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 182, "y": 363, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 60, "y": 364, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 362, "w": 60, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 60, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 327, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 268, "y": 74, "w": 66, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 376, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 227, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 76, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 152, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 302, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 449, "y": 0, "w": 72, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 72, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 449, "y": 73, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 71, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 69, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 201, "y": 74, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 67, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 334, "y": 145, "w": 65, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 65, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 530, "h": 436 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/female/668.png b/public/images/pokemon/exp/female/668.png new file mode 100644 index 00000000000..fa0582a61f1 Binary files /dev/null and b/public/images/pokemon/exp/female/668.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/248-mega.json b/public/images/pokemon/exp/shiny/248-mega.json index 6dc54a8aeb2..15243cf5a2d 100644 --- a/public/images/pokemon/exp/shiny/248-mega.json +++ b/public/images/pokemon/exp/shiny/248-mega.json @@ -1,272 +1,929 @@ -{ - "textures": [ - { - "image": "248-mega.png", - "format": "RGBA8888", - "size": { - "w": 271, - "h": 271 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 91, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 91, - "y": 0, - "w": 91, - "h": 85 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 91, - "h": 85 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 91, - "h": 85 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 170, - "w": 91, - "h": 85 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 91, - "h": 85 - }, - "frame": { - "x": 0, - "y": 170, - "w": 91, - "h": 85 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 91, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 91, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 90, - "h": 85 - }, - "frame": { - "x": 181, - "y": 85, - "w": 90, - "h": 85 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 91, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 90, - "h": 84 - }, - "frame": { - "x": 91, - "y": 170, - "w": 90, - "h": 84 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e303fed6273448420d3b88ba11175e8d:629c5a6630efddb6c94efdcd98c81d33:90df97eb431b7162252516cb937a0b9e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 467, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 374, "y": 261, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 467, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 262, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 91, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 183, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 514, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 182, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 273, "y": 515, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 91, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 364, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 546, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 431, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 365, "y": 430, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 273, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 370, "y": 346, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 186, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 278, "y": 263, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 184, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 374, "y": 261, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 467, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 262, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 91, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 183, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 514, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 182, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 273, "y": 515, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 91, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 364, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 546, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 431, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 365, "y": 430, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 273, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 370, "y": 346, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 186, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 278, "y": 263, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 184, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 374, "y": 261, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 467, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 262, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 91, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 183, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 514, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 182, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 273, "y": 515, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 91, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 364, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 546, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 431, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 365, "y": 430, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 273, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 370, "y": 346, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 186, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 278, "y": 263, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 184, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 559, "y": 175, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 374, "y": 261, "w": 91, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 91, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 467, "y": 261, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 262, "w": 92, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 92, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 91, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 183, "y": 431, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 90, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 514, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 182, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 515, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 87, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 91, "y": 513, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 364, "y": 513, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 88, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 546, "y": 433, "w": 89, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 89, "h": 80 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 431, "w": 89, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 89, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 365, "y": 430, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 273, "y": 348, "w": 90, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 90, "h": 81 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 370, "y": 346, "w": 90, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 90, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 186, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 278, "y": 263, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 184, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 92, "y": 176, "w": 90, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 90, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 561, "y": 261, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 346, "w": 89, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 89, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 467, "y": 345, "w": 89, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 89, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 94, "y": 262, "w": 90, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 90, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 91, "y": 347, "w": 89, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 89, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 182, "y": 347, "w": 89, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 89, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 275, "y": 431, "w": 87, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 87, "h": 82 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 457, "y": 430, "w": 87, "h": 83 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 87, "h": 83 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 558, "y": 346, "w": 86, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 86, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 283, "y": 175, "w": 89, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 89, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 189, "y": 88, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 0, "y": 0, "w": 93, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 93, "h": 87 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 380, "y": 0, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 95, "y": 88, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 474, "y": 0, "w": 92, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 92, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 190, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 95, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 285, "y": 0, "w": 93, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 93, "h": 86 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 473, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 378, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 283, "y": 88, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 89, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 93, "h": 85 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 374, "y": 175, "w": 91, "h": 84 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 91, "h": 84 }, + "sourceSize": { "w": 94, "h": 87 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "248-mega.png", + "format": "I8", + "size": { "w": 651, "h": 595 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/248-mega.png b/public/images/pokemon/exp/shiny/248-mega.png index eebfa35bbd4..8d9d5fc316c 100644 Binary files a/public/images/pokemon/exp/shiny/248-mega.png and b/public/images/pokemon/exp/shiny/248-mega.png differ diff --git a/public/images/pokemon/exp/shiny/362-mega.json b/public/images/pokemon/exp/shiny/362-mega.json index fe381106be4..c69ecfb1903 100644 --- a/public/images/pokemon/exp/shiny/362-mega.json +++ b/public/images/pokemon/exp/shiny/362-mega.json @@ -1,272 +1,551 @@ -{ - "textures": [ - { - "image": "362-mega.png", - "format": "RGBA8888", - "size": { - "w": 174, - "h": 174 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 72 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 72 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 72 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 72 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 71 - }, - "frame": { - "x": 0, - "y": 72, - "w": 58, - "h": 71 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 71 - }, - "frame": { - "x": 0, - "y": 72, - "w": 58, - "h": 71 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 71 - }, - "frame": { - "x": 0, - "y": 72, - "w": 58, - "h": 71 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 58, - "h": 71 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 71 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 58, - "h": 71 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 71 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 71 - }, - "frame": { - "x": 116, - "y": 0, - "w": 58, - "h": 71 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 70 - }, - "frame": { - "x": 58, - "y": 71, - "w": 58, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 70 - }, - "frame": { - "x": 58, - "y": 71, - "w": 58, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2d52abc4de24282165212b778dfccd62:be0a830bc1f35d437700a203d1fea184:8a7271a5423838c97ddeb1e6dc343255$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 11, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 14, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 16, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 18, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 15, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 13, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 11, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 14, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 16, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 18, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 15, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 13, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 11, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 14, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 16, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 18, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 15, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 13, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 62, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 62, "h": 67 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 55, "h": 65 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 64, "y": 0, "w": 58, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 58, "h": 66 }, + "sourceSize": { "w": 62, "h": 84 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "362-mega.png", + "format": "I8", + "size": { "w": 122, "h": 134 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/362-mega.png b/public/images/pokemon/exp/shiny/362-mega.png index 9d2b9adc7f4..6645ab66cab 100644 Binary files a/public/images/pokemon/exp/shiny/362-mega.png and b/public/images/pokemon/exp/shiny/362-mega.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/484-origin.json b/public/images/pokemon/exp/shiny/484-origin.json index 97d6a0b5f49..e77754c3b3f 100644 --- a/public/images/pokemon/exp/shiny/484-origin.json +++ b/public/images/pokemon/exp/shiny/484-origin.json @@ -4,8 +4,8 @@ "image": "484-origin.png", "format": "RGBA8888", "size": { - "w": 426, - "h": 426 + "w": 274, + "h": 274 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -35,20 +35,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -56,20 +56,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -77,20 +77,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -98,20 +98,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, + "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 }, "frame": { "x": 0, "y": 0, - "w": 91, - "h": 97 + "w": 90, + "h": 95 } }, { @@ -119,146 +119,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, "w": 91, - "h": 97 - }, - "frame": { - "x": 0, - "y": 0, - "w": 91, - "h": 97 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 + "h": 95 }, "spriteSourceSize": { "x": 0, - "y": 5, - "w": 92, - "h": 96 - }, - "frame": { - "x": 91, - "y": 0, - "w": 92, - "h": 96 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 92, - "h": 96 - }, - "frame": { - "x": 91, - "y": 0, - "w": 92, - "h": 96 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, "y": 0, "w": 90, - "h": 97 + "h": 95 }, "frame": { "x": 0, - "y": 97, - "w": 90, - "h": 97 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, "y": 0, "w": 90, - "h": 97 - }, - "frame": { - "x": 0, - "y": 97, - "w": 90, - "h": 97 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 96, - "h": 90 - }, - "frame": { - "x": 183, - "y": 0, - "w": 96, - "h": 90 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 96, - "h": 90 - }, - "frame": { - "x": 183, - "y": 0, - "w": 96, - "h": 90 + "h": 95 } }, { @@ -266,20 +140,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -287,20 +161,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -308,20 +182,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -329,20 +203,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -350,20 +224,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -371,20 +245,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -392,20 +266,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -413,20 +287,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -434,20 +308,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -455,20 +329,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -476,20 +350,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 2, + "x": 0, + "y": 1, "w": 90, - "h": 95 + "h": 94 }, "frame": { "x": 0, - "y": 194, + "y": 95, "w": 90, - "h": 95 + "h": 94 } }, { @@ -497,272 +371,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 90, + "w": 91, "h": 95 }, - "frame": { + "spriteSourceSize": { "x": 0, - "y": 194, - "w": 90, - "h": 95 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 90, - "h": 95 - }, - "frame": { - "x": 0, - "y": 194, - "w": 90, - "h": 95 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 7, "y": 1, - "w": 89, - "h": 95 + "w": 90, + "h": 94 }, "frame": { "x": 0, - "y": 289, - "w": 89, - "h": 95 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 89, - "h": 95 - }, - "frame": { - "x": 0, - "y": 289, - "w": 89, - "h": 95 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 92, - "h": 92 - }, - "frame": { - "x": 279, - "y": 0, - "w": 92, - "h": 92 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 92, - "h": 92 - }, - "frame": { - "x": 279, - "y": 0, - "w": 92, - "h": 92 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 24, - "y": 16, - "w": 50, - "h": 54 - }, - "frame": { - "x": 371, - "y": 0, - "w": 50, - "h": 54 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 92, - "h": 92 - }, - "frame": { - "x": 183, - "y": 90, - "w": 92, - "h": 92 + "y": 95, + "w": 90, + "h": 94 } }, { @@ -770,20 +392,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -791,20 +413,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -812,20 +434,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -833,20 +455,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -854,20 +476,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -875,20 +497,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -896,20 +518,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -917,20 +539,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -938,20 +560,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -959,20 +581,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -980,20 +602,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 91, - "h": 92 + "h": 91 }, "frame": { - "x": 275, - "y": 92, + "x": 90, + "y": 0, "w": 91, - "h": 92 + "h": 91 } }, { @@ -1001,272 +623,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, "w": 91, - "h": 92 + "h": 95 }, - "frame": { - "x": 275, - "y": 92, + "spriteSourceSize": { + "x": 0, + "y": 4, "w": 91, - "h": 92 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 89, - "y": 289, - "w": 89, - "h": 93 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 + "h": 91 }, "frame": { "x": 90, - "y": 97, - "w": 89, - "h": 93 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 89, - "h": 93 - }, - "frame": { - "x": 90, - "y": 97, - "w": 89, - "h": 93 + "y": 0, + "w": 91, + "h": 91 } }, { @@ -1274,20 +644,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1295,20 +665,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1316,20 +686,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1337,20 +707,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1358,20 +728,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1379,20 +749,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1400,20 +770,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1421,20 +791,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1442,20 +812,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1463,20 +833,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1484,20 +854,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, - "h": 92 + "h": 91 }, "frame": { - "x": 90, - "y": 190, + "x": 181, + "y": 0, "w": 90, - "h": 92 + "h": 91 } }, { @@ -1505,19 +875,229 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 0, + "y": 4, "w": 90, + "h": 91 + }, + "frame": { + "x": 181, + "y": 0, + "w": 90, + "h": 91 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, "h": 92 }, "frame": { "x": 90, - "y": 190, - "w": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, + "h": 92 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 89, + "h": 92 + }, + "frame": { + "x": 90, + "y": 91, + "w": 89, "h": 92 } }, @@ -1526,20 +1106,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1547,20 +1127,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1568,20 +1148,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1589,20 +1169,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1610,20 +1190,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1631,20 +1211,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1652,20 +1232,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1673,20 +1253,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1694,20 +1274,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1715,20 +1295,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1736,20 +1316,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, "w": 89, - "h": 92 + "h": 91 }, "frame": { - "x": 180, - "y": 182, + "x": 90, + "y": 183, "w": 89, - "h": 92 + "h": 91 } }, { @@ -1757,62 +1337,62 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 7, - "y": 5, + "x": 1, + "y": 4, + "w": 89, + "h": 91 + }, + "frame": { + "x": 90, + "y": 183, + "w": 89, + "h": 91 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 91, + "h": 95 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, "w": 89, "h": 92 }, "frame": { - "x": 180, - "y": 182, + "x": 179, + "y": 91, "w": 89, "h": 92 } }, { - "filename": "0077.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 90, - "h": 90 + "x": 2, + "y": 3, + "w": 89, + "h": 92 }, "frame": { - "x": 269, - "y": 184, - "w": 90, - "h": 90 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 90, - "h": 90 - }, - "frame": { - "x": 269, - "y": 184, - "w": 90, - "h": 90 + "x": 179, + "y": 91, + "w": 89, + "h": 92 } }, { @@ -1820,20 +1400,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1841,20 +1421,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1862,20 +1442,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1883,20 +1463,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1904,20 +1484,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } }, { @@ -1925,608 +1505,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 110, - "h": 110 + "w": 91, + "h": 95 }, "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 88, - "h": 92 + "x": 4, + "y": 4, + "w": 87, + "h": 91 }, "frame": { - "x": 180, - "y": 274, - "w": 88, - "h": 92 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 79, - "h": 86 - }, - "frame": { - "x": 268, - "y": 274, - "w": 79, - "h": 86 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 15, - "y": 7, - "w": 79, - "h": 86 - }, - "frame": { - "x": 268, - "y": 274, - "w": 79, - "h": 86 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 79, - "h": 83 - }, - "frame": { - "x": 347, - "y": 274, - "w": 79, - "h": 83 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 11, - "w": 71, - "h": 69 - }, - "frame": { - "x": 347, - "y": 357, - "w": 71, - "h": 69 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 359, - "y": 184, - "w": 59, - "h": 70 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 20, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 359, - "y": 184, - "w": 59, - "h": 70 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 35, - "y": 23, - "w": 27, - "h": 33 - }, - "frame": { - "x": 0, - "y": 384, - "w": 27, - "h": 33 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 35, - "y": 23, - "w": 27, - "h": 33 - }, - "frame": { - "x": 371, - "y": 54, - "w": 27, - "h": 33 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 26, - "w": 19, - "h": 23 - }, - "frame": { - "x": 27, - "y": 384, - "w": 19, - "h": 23 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 26, - "w": 19, - "h": 23 - }, - "frame": { - "x": 27, - "y": 384, - "w": 19, - "h": 23 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 35, - "w": 14, - "h": 10 - }, - "frame": { - "x": 359, - "y": 254, - "w": 14, - "h": 10 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 42, - "y": 35, - "w": 14, - "h": 10 - }, - "frame": { - "x": 359, - "y": 254, - "w": 14, - "h": 10 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 110, - "h": 110 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 3, - "h": 3 - }, - "frame": { - "x": 90, - "y": 282, - "w": 3, - "h": 3 + "x": 179, + "y": 183, + "w": 87, + "h": 91 } } ] @@ -2535,6 +1527,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5fbe4aec02bf780bf0fca7dc7138bf7a:5d077386c518cf06786203ad5e3a3aba:5ea3e660bc9c2624f846675d5196db82$" + "smartupdate": "$TexturePacker:SmartUpdate:71a487dde0de6f6a7eb1b6e04018892f:49ee3dfe044ad986679a7ce34c28280d:5ea3e660bc9c2624f846675d5196db82$" } } diff --git a/public/images/pokemon/exp/shiny/484-origin.png b/public/images/pokemon/exp/shiny/484-origin.png index 69e95afe580..bea804ed677 100644 Binary files a/public/images/pokemon/exp/shiny/484-origin.png and b/public/images/pokemon/exp/shiny/484-origin.png differ diff --git a/public/images/pokemon/exp/shiny/569-gigantamax.json b/public/images/pokemon/exp/shiny/569-gigantamax.json new file mode 100644 index 00000000000..6cda2b0d79a --- /dev/null +++ b/public/images/pokemon/exp/shiny/569-gigantamax.json @@ -0,0 +1,1478 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0008.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0009.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0010.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0011.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0012.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0013.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0014.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0015.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0027.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0028.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0029.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0030.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0031.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0032.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0033.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0034.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0043.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0044.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0045.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0046.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0047.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0048.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0049.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0050.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0051.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0061.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0062.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0063.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0064.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0065.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0066.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0067.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0068.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0069.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0073.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0074.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0075.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0076.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0077.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0078.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0079.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0080.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0081.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0082.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0083.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0084.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0085.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0086.png", + "frame": { "x": 211, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0087.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0088.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0089.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0090.png", + "frame": { "x": 108, "y": 0, "w": 103, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 103, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0091.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0092.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0093.png", + "frame": { "x": 206, "y": 88, "w": 99, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 99, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0094.png", + "frame": { "x": 305, "y": 173, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0103.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0104.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0105.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0106.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0107.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0108.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0109.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0110.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0111.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0112.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0117.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0118.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0119.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0121.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0122.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0123.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0124.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0125.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0126.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0127.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0128.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0129.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0131.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0132.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0133.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0134.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0135.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0136.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0137.png", + "frame": { "x": 0, "y": 170, "w": 96, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 96, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0138.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0139.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0140.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0141.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0142.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0143.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0144.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0145.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0146.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0147.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0149.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 0, "w": 108, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 108, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0152.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0153.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0154.png", + "frame": { "x": 0, "y": 85, "w": 106, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 106, "h": 85 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0155.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0156.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0157.png", + "frame": { "x": 314, "y": 0, "w": 105, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 105, "h": 86 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0158.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0159.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0160.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0161.png", + "frame": { "x": 314, "y": 86, "w": 103, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 103, "h": 87 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0162.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + }, + { + "filename": "0163.png", + "frame": { "x": 106, "y": 88, "w": 100, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 100, "h": 88 }, + "sourceSize": { "w": 108, "h": 88 }, + "duration": 60 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "569-gigantamax.png", + "format": "I8", + "size": { "w": 419, "h": 261 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/shiny/569-gigantamax.png b/public/images/pokemon/exp/shiny/569-gigantamax.png new file mode 100644 index 00000000000..fc15ecd4585 Binary files /dev/null and b/public/images/pokemon/exp/shiny/569-gigantamax.png differ diff --git a/public/images/pokemon/exp/shiny/651.json b/public/images/pokemon/exp/shiny/651.json index 4289441de3d..20bdccd5bd4 100644 --- a/public/images/pokemon/exp/shiny/651.json +++ b/public/images/pokemon/exp/shiny/651.json @@ -1,188 +1,713 @@ -{ - "textures": [ - { - "image": "651.png", - "format": "RGBA8888", - "size": { - "w": 116, - "h": 116 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 58, - "y": 0, - "w": 58, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 58, - "h": 53 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 52 - }, - "frame": { - "x": 58, - "y": 53, - "w": 58, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 58, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 58, - "h": 52 - }, - "frame": { - "x": 58, - "y": 53, - "w": 58, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:53a767b5d08c0b868b90b8a06972f1db:ac5b599a09e8592218deeebb976d4e5c:a93e5fa02e10bf11e3ed8bf6571835ca$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 175, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 355, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 278, "y": 101, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 110, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 56, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 165, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 333, "y": 151, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 287, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 112, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 168, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 278, "y": 152, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 56, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 231, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 224, "y": 101, "w": 53, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 53, "h": 51 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 343, "y": 100, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 50, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 55, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 220, "y": 153, "w": 54, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 54, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 119, "y": 49, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 239, "y": 0, "w": 57, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 60, "y": 0, "w": 58, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 355, "y": 0, "w": 58, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 58, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 59, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 119, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 59, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 179, "y": 0, "w": 59, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 59, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 297, "y": 0, "w": 57, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 101, "w": 55, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 203, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 329, "y": 252, "w": 51, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 47 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 109, "y": 252, "w": 51, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 219, "y": 204, "w": 52, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 52, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 166, "y": 202, "w": 52, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 52, "h": 50 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 275, "y": 203, "w": 53, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 54, "y": 204, "w": 54, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 54, "h": 48 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 333, "y": 202, "w": 54, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 110, "y": 202, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 55, "h": 49 }, + "sourceSize": { "w": 60, "h": 53 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "651.png", + "format": "I8", + "size": { "w": 413, "h": 300 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/651.png b/public/images/pokemon/exp/shiny/651.png index dcd70d11100..1e59bc97587 100644 Binary files a/public/images/pokemon/exp/shiny/651.png and b/public/images/pokemon/exp/shiny/651.png differ diff --git a/public/images/pokemon/exp/shiny/653.json b/public/images/pokemon/exp/shiny/653.json index 738762f18c6..a08242f32cf 100644 --- a/public/images/pokemon/exp/shiny/653.json +++ b/public/images/pokemon/exp/shiny/653.json @@ -1,1553 +1,947 @@ -{ - "textures": [ - { - "image": "653.png", - "format": "RGBA8888", - "size": { - "w": 180, - "h": 180 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 47, - "h": 45 - }, - "frame": { - "x": 47, - "y": 0, - "w": 47, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 43, - "h": 49 - }, - "frame": { - "x": 94, - "y": 0, - "w": 43, - "h": 49 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 137, - "y": 0, - "w": 42, - "h": 49 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 47, - "h": 44 - }, - "frame": { - "x": 0, - "y": 45, - "w": 47, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 44, - "h": 47 - }, - "frame": { - "x": 47, - "y": 45, - "w": 44, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 0, - "y": 89, - "w": 42, - "h": 49 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 0, - "y": 138, - "w": 47, - "h": 42 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 46, - "h": 44 - }, - "frame": { - "x": 42, - "y": 92, - "w": 46, - "h": 44 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 47, - "h": 42 - }, - "frame": { - "x": 47, - "y": 136, - "w": 47, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 91, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 133, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 42, - "h": 49 - }, - "frame": { - "x": 133, - "y": 49, - "w": 42, - "h": 49 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 43, - "h": 47 - }, - "frame": { - "x": 94, - "y": 98, - "w": 43, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 43, - "h": 47 - }, - "frame": { - "x": 94, - "y": 98, - "w": 43, - "h": 47 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 46 - }, - "frame": { - "x": 137, - "y": 98, - "w": 43, - "h": 46 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 46 - }, - "frame": { - "x": 137, - "y": 98, - "w": 43, - "h": 46 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 46 - }, - "frame": { - "x": 137, - "y": 98, - "w": 43, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ee78bfcc0ba0e0b5534e843718784ee6:a0e7315742d6fef56aa3fa3581440131:a7be961d0230f568aff23d95e7ff0036$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 41, "y": 130, "w": 42, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 42, "h": 39 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 130, "w": 41, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 41, "h": 40 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 40, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 80, "y": 88, "w": 40, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 42 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 83, "y": 132, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 38, "h": 43 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 42, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 42, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 42, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 83, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 83, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 84, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 124, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 124, "y": 44, "w": 41, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 126, "y": 0, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 42, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 45 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 0, "y": 45, "w": 40, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 40, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 120, "y": 88, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 38, "h": 44 }, + "sourceSize": { "w": 44, "h": 45 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "653.png", + "format": "I8", + "size": { "w": 168, "h": 175 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/653.png b/public/images/pokemon/exp/shiny/653.png index 053624e5b7f..b1afebbd6a1 100644 Binary files a/public/images/pokemon/exp/shiny/653.png and b/public/images/pokemon/exp/shiny/653.png differ diff --git a/public/images/pokemon/exp/shiny/654.json b/public/images/pokemon/exp/shiny/654.json index 08655169f2a..74019f665ec 100644 --- a/public/images/pokemon/exp/shiny/654.json +++ b/public/images/pokemon/exp/shiny/654.json @@ -1,818 +1,695 @@ -{ - "textures": [ - { - "image": "654.png", - "format": "RGBA8888", - "size": { - "w": 390, - "h": 390 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 81, - "w": 47, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 47, - "h": 81 - }, - "frame": { - "x": 0, - "y": 162, - "w": 47, - "h": 81 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 47, - "h": 80 - }, - "frame": { - "x": 0, - "y": 243, - "w": 47, - "h": 80 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 0, - "w": 46, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 81, - "w": 46, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 81 - }, - "frame": { - "x": 47, - "y": 162, - "w": 46, - "h": 81 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 80 - }, - "frame": { - "x": 47, - "y": 243, - "w": 46, - "h": 80 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 0, - "w": 46, - "h": 79 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 79, - "w": 46, - "h": 79 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 158, - "w": 46, - "h": 79 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 93, - "y": 237, - "w": 46, - "h": 79 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 46, - "h": 74 - }, - "frame": { - "x": 93, - "y": 316, - "w": 46, - "h": 74 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 46, - "h": 79 - }, - "frame": { - "x": 139, - "y": 0, - "w": 46, - "h": 79 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 80 - }, - "frame": { - "x": 139, - "y": 79, - "w": 45, - "h": 80 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 80 - }, - "frame": { - "x": 139, - "y": 159, - "w": 45, - "h": 80 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 46, - "h": 78 - }, - "frame": { - "x": 139, - "y": 239, - "w": 46, - "h": 78 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 46, - "h": 73 - }, - "frame": { - "x": 139, - "y": 317, - "w": 46, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 184, - "y": 79, - "w": 45, - "h": 79 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 185, - "y": 0, - "w": 45, - "h": 79 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 184, - "y": 158, - "w": 45, - "h": 79 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 185, - "y": 237, - "w": 45, - "h": 79 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 46, - "h": 74 - }, - "frame": { - "x": 185, - "y": 316, - "w": 46, - "h": 74 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 229, - "y": 79, - "w": 45, - "h": 79 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 230, - "y": 0, - "w": 45, - "h": 79 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 229, - "y": 158, - "w": 45, - "h": 79 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 45, - "h": 79 - }, - "frame": { - "x": 230, - "y": 237, - "w": 45, - "h": 79 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 46, - "h": 73 - }, - "frame": { - "x": 231, - "y": 316, - "w": 46, - "h": 73 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 46, - "h": 77 - }, - "frame": { - "x": 274, - "y": 79, - "w": 46, - "h": 77 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 47, - "h": 75 - }, - "frame": { - "x": 275, - "y": 0, - "w": 47, - "h": 75 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 45, - "h": 78 - }, - "frame": { - "x": 274, - "y": 156, - "w": 45, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 45, - "h": 78 - }, - "frame": { - "x": 275, - "y": 234, - "w": 45, - "h": 78 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 46, - "h": 76 - }, - "frame": { - "x": 319, - "y": 156, - "w": 46, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 45, - "h": 77 - }, - "frame": { - "x": 320, - "y": 75, - "w": 45, - "h": 77 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 46, - "h": 75 - }, - "frame": { - "x": 322, - "y": 0, - "w": 46, - "h": 75 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 46, - "h": 75 - }, - "frame": { - "x": 277, - "y": 312, - "w": 46, - "h": 75 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 45, - "h": 76 - }, - "frame": { - "x": 320, - "y": 232, - "w": 45, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 54, - "h": 81 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 45, - "h": 76 - }, - "frame": { - "x": 323, - "y": 308, - "w": 45, - "h": 76 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3bc1d6050e2efe57cc85a4e2787f5287:383941fac594bced71237ecb57b89444:1977f50e1ab8a3304ceeb59ee1aa2ba9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 107, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 282, "y": 0, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 102, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 160, "y": 261, "w": 53, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 53, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 110, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 65, "w": 55, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 55, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 117, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 60, "y": 0, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 57, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 229, "y": 0, "w": 53, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 69 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 261, "w": 51, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 51, "h": 68 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 152, "y": 326, "w": 50, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 50, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 164, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 117, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 172, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 213, "y": 265, "w": 51, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 51, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 282, "y": 66, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 173, "y": 0, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 60, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 60, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 227, "y": 69, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 275, "y": 196, "w": 54, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 54, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 55, "y": 68, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 110, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 165, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 282, "y": 131, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 55, "y": 133, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 220, "y": 134, "w": 55, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 55, "h": 65 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 54, "y": 198, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 218, "y": 199, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 53, "h": 66 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 271, "y": 261, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 51, "y": 264, "w": 51, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 51, "h": 67 }, + "sourceSize": { "w": 63, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "654.png", + "format": "I8", + "size": { "w": 337, "h": 393 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/654.png b/public/images/pokemon/exp/shiny/654.png index f619614c362..bc9177ec918 100644 Binary files a/public/images/pokemon/exp/shiny/654.png and b/public/images/pokemon/exp/shiny/654.png differ diff --git a/public/images/pokemon/exp/shiny/656.json b/public/images/pokemon/exp/shiny/656.json index ac9979ad913..3c2051bfe3a 100644 --- a/public/images/pokemon/exp/shiny/656.json +++ b/public/images/pokemon/exp/shiny/656.json @@ -1,671 +1,713 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 96, - "h": 96 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 34 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 32, - "h": 34 - }, - "frame": { - "x": 64, - "y": 34, - "w": 32, - "h": 34 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5864efc3a72b67d8dab83f02efd39074:ff0362b6a3d22e42702e1a31a4aec233:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 98, "y": 116, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 194, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 194, "y": 38, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 172, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 207, "y": 112, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 195, "y": 148, "w": 32, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 195, "y": 183, "w": 32, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 32, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 163, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 197, "y": 75, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 118, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 81, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 200 + }, + { + "filename": "0057.png", + "frame": { "x": 129, "y": 1, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 31, "h": 38 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 30, "h": 41 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 33, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 30, "h": 41 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 65, "y": 1, "w": 30, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 30, "h": 41 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 97, "y": 1, "w": 30, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 30, "h": 40 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 162, "y": 1, "w": 30, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 30, "h": 39 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 67, "y": 81, "w": 29, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 29, "h": 38 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 164, "y": 148, "w": 29, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 29, "h": 37 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 35, "y": 81, "w": 30, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 30, "h": 37 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 69, "y": 152, "w": 33, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 14, "w": 33, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 104, "y": 185, "w": 34, "h": 30 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 16, "w": 34, "h": 30 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 68, "y": 186, "w": 34, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 17, "w": 34, "h": 29 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 157, "w": 33, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 14, "w": 33, "h": 32 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 137, "y": 112, "w": 33, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 33, "h": 33 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 750 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 44, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 132, "y": 147, "w": 30, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 30, "h": 36 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 36, "y": 157, "w": 30, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 30, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 35, "y": 121, "w": 32, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 34 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 35, "y": 44, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 69, "y": 44, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 103, "y": 79, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 129, "y": 42, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 32, "h": 35 }, + "sourceSize": { "w": 36, "h": 47 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 240, "h": 216 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/656.png b/public/images/pokemon/exp/shiny/656.png index ffbbc8258d1..c0a97924ca7 100644 Binary files a/public/images/pokemon/exp/shiny/656.png and b/public/images/pokemon/exp/shiny/656.png differ diff --git a/public/images/pokemon/exp/shiny/658-ash.json b/public/images/pokemon/exp/shiny/658-ash.json index 5101079ce90..52dbac8366a 100644 --- a/public/images/pokemon/exp/shiny/658-ash.json +++ b/public/images/pokemon/exp/shiny/658-ash.json @@ -1,671 +1,299 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0875c2204eeabc96bd1f034bcc69210b:e1abe8d09d1fe3c1ec758293b0a4bed5:f09eeed5adc5ec50aec50218e03662c2$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658-ash.png", + "format": "I8", + "size": { "w": 237, "h": 148 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/658-ash.png b/public/images/pokemon/exp/shiny/658-ash.png index 5d80ca1ad0e..5b25ec9e021 100644 Binary files a/public/images/pokemon/exp/shiny/658-ash.png and b/public/images/pokemon/exp/shiny/658-ash.png differ diff --git a/public/images/pokemon/exp/shiny/658.png b/public/images/pokemon/exp/shiny/658.png index 999bc74c659..e7278458f2c 100644 Binary files a/public/images/pokemon/exp/shiny/658.png and b/public/images/pokemon/exp/shiny/658.png differ diff --git a/public/images/pokemon/exp/shiny/661.json b/public/images/pokemon/exp/shiny/661.json index 6dba8b616b3..ba6523f22b1 100644 --- a/public/images/pokemon/exp/shiny/661.json +++ b/public/images/pokemon/exp/shiny/661.json @@ -1,356 +1,398 @@ -{ - "textures": [ - { - "image": "661.png", - "format": "RGBA8888", - "size": { - "w": 70, - "h": 70 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 35 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 35, - "w": 32, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 32, - "y": 35, - "w": 32, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f9a4d305d58fcbff383e0da1712abf6a:1bc270d999d234ddb64b1c01d568ad86:186d621a544ea0e0e2e0bd57975a29b1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0002.png", + "frame": { "x": 34, "y": 117, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0003.png", + "frame": { "x": 36, "y": 38, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0004.png", + "frame": { "x": 1, "y": 1, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0005.png", + "frame": { "x": 34, "y": 78, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0006.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0007.png", + "frame": { "x": 1, "y": 118, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0009.png", + "frame": { "x": 72, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0010.png", + "frame": { "x": 67, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0011.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0012.png", + "frame": { "x": 34, "y": 117, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0013.png", + "frame": { "x": 36, "y": 38, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 1, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0015.png", + "frame": { "x": 34, "y": 78, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0016.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0017.png", + "frame": { "x": 1, "y": 118, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0018.png", + "frame": { "x": 1, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0019.png", + "frame": { "x": 72, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0020.png", + "frame": { "x": 67, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0021.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0022.png", + "frame": { "x": 34, "y": 117, "w": 31, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0023.png", + "frame": { "x": 36, "y": 38, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0024.png", + "frame": { "x": 1, "y": 1, "w": 34, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0025.png", + "frame": { "x": 34, "y": 78, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0026.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0027.png", + "frame": { "x": 1, "y": 118, "w": 31, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 31, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0028.png", + "frame": { "x": 1, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0029.png", + "frame": { "x": 72, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0030.png", + "frame": { "x": 67, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0031.png", + "frame": { "x": 1, "y": 40, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0032.png", + "frame": { "x": 69, "y": 39, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0033.png", + "frame": { "x": 69, "y": 39, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0034.png", + "frame": { "x": 100, "y": 79, "w": 32, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 32, "h": 38 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0035.png", + "frame": { "x": 107, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0036.png", + "frame": { "x": 36, "y": 1, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0037.png", + "frame": { "x": 107, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0038.png", + "frame": { "x": 36, "y": 1, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0039.png", + "frame": { "x": 107, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0040.png", + "frame": { "x": 36, "y": 1, "w": 35, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 35, "h": 36 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0041.png", + "frame": { "x": 107, "y": 1, "w": 34, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 34, "h": 37 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0042.png", + "frame": { "x": 102, "y": 39, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + }, + { + "filename": "0043.png", + "frame": { "x": 69, "y": 39, "w": 32, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 32, "h": 39 }, + "sourceSize": { "w": 37, "h": 39 }, + "duration": 120 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "661.png", + "format": "I8", + "size": { "w": 142, "h": 157 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/661.png b/public/images/pokemon/exp/shiny/661.png index 2b73fb85c54..0e2d5996bc2 100644 Binary files a/public/images/pokemon/exp/shiny/661.png and b/public/images/pokemon/exp/shiny/661.png differ diff --git a/public/images/pokemon/exp/shiny/662.json b/public/images/pokemon/exp/shiny/662.json index 9aa396fbae1..3600bbcd38d 100644 --- a/public/images/pokemon/exp/shiny/662.json +++ b/public/images/pokemon/exp/shiny/662.json @@ -1,776 +1,254 @@ -{ - "textures": [ - { - "image": "662.png", - "format": "RGBA8888", - "size": { - "w": 167, - "h": 167 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 56, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 56, - "h": 52 - }, - "frame": { - "x": 56, - "y": 0, - "w": 56, - "h": 52 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 16, - "w": 55, - "h": 37 - }, - "frame": { - "x": 112, - "y": 0, - "w": 55, - "h": 37 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 51 - }, - "frame": { - "x": 0, - "y": 52, - "w": 56, - "h": 51 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 50 - }, - "frame": { - "x": 0, - "y": 103, - "w": 56, - "h": 50 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 52, - "w": 56, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 52, - "w": 56, - "h": 44 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 96, - "w": 56, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 56, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 56, - "h": 44 - }, - "frame": { - "x": 56, - "y": 96, - "w": 56, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3ab37b59d2c6d2f3d8b7379738b89720:769cd0fc38f80c712966ce15da281c1f:e3da2dd0277c18bcc713dc6dd2460c87$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 221, "y": 131, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 57, "h": 61 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 113, "y": 70, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 19, "w": 56, "h": 63 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 335, "y": 136, "w": 49, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 36, "w": 49, "h": 50 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 105, "y": 197, "w": 63, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 33, "w": 63, "h": 51 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 1, "y": 1, "w": 59, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 16, "w": 59, "h": 66 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 119, "y": 1, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 56, "h": 68 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 233, "y": 1, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 54, "h": 70 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 176, "y": 1, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 56, "h": 68 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 288, "y": 1, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 20, "w": 59, "h": 64 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 338, "y": 187, "w": 47, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 30, "w": 47, "h": 48 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 66, "y": 249, "w": 62, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 26, "w": 62, "h": 49 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 68, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 58, "h": 64 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 169, "y": 141, "w": 47, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 17, "w": 47, "h": 49 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 275, "y": 198, "w": 62, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 12, "w": 62, "h": 50 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 61, "y": 1, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 57, "h": 67 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 288, "y": 66, "w": 54, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 54, "h": 69 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 60, "y": 69, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 52, "h": 71 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 170, "y": 70, "w": 50, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 50, "h": 70 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 1, "y": 133, "w": 49, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 49, "h": 70 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 275, "y": 249, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 30, "w": 56, "h": 49 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 1, "y": 205, "w": 64, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 27, "w": 64, "h": 48 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 221, "y": 72, "w": 60, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 13, "w": 60, "h": 58 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 113, "y": 134, "w": 55, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 7, "w": 55, "h": 62 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 223, "y": 193, "w": 51, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 51, "h": 64 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 51, "y": 141, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 7, "w": 53, "h": 63 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 169, "y": 193, "w": 53, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 53, "h": 63 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 279, "y": 136, "w": 55, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 55, "h": 61 }, + "sourceSize": { "w": 75, "h": 86 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "662.png", + "format": "I8", + "size": { "w": 386, "h": 299 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/662.png b/public/images/pokemon/exp/shiny/662.png index ec0100f3e96..4eae91c7855 100644 Binary files a/public/images/pokemon/exp/shiny/662.png and b/public/images/pokemon/exp/shiny/662.png differ diff --git a/public/images/pokemon/exp/shiny/663.json b/public/images/pokemon/exp/shiny/663.json index 3af6f5c5875..8c4ef182132 100644 --- a/public/images/pokemon/exp/shiny/663.json +++ b/public/images/pokemon/exp/shiny/663.json @@ -1,1700 +1,731 @@ -{ - "textures": [ - { - "image": "663.png", - "format": "RGBA8888", - "size": { - "w": 295, - "h": 295 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 121, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 121, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 2, - "y": 27, - "w": 116, - "h": 64 - }, - "frame": { - "x": 121, - "y": 0, - "w": 116, - "h": 64 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 108, - "h": 88 - }, - "frame": { - "x": 0, - "y": 58, - "w": 108, - "h": 88 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 87, - "h": 92 - }, - "frame": { - "x": 0, - "y": 146, - "w": 87, - "h": 92 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 92, - "h": 91 - }, - "frame": { - "x": 87, - "y": 146, - "w": 92, - "h": 91 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 9, - "y": 33, - "w": 99, - "h": 58 - }, - "frame": { - "x": 87, - "y": 237, - "w": 99, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 104, - "h": 76 - }, - "frame": { - "x": 186, - "y": 64, - "w": 104, - "h": 76 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 7, - "y": 29, - "w": 103, - "h": 64 - }, - "frame": { - "x": 186, - "y": 140, - "w": 103, - "h": 64 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 121, - "h": 93 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 95, - "h": 87 - }, - "frame": { - "x": 186, - "y": 204, - "w": 95, - "h": 87 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8bf443d425b4203c8adbc0ffad215956:cf5b810e03b096373e0bdd0a7220fc2c:3790d8d72a704a789cc594688d98802e$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0002.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0003.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0004.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0006.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0007.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0009.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0010.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0012.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0013.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0014.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0016.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0017.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0019.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0020.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0022.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0023.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0024.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0026.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0027.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0029.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0030.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0032.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0033.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0034.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0036.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0037.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0039.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0040.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0042.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0043.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0044.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0046.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0047.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0049.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0050.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0052.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0053.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0054.png", + "frame": { "x": 115, "y": 90, "w": 121, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 30, "w": 121, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0056.png", + "frame": { "x": 378, "y": 75, "w": 101, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 32, "w": 101, "h": 63 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0057.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 0, "w": 106, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 106, "h": 86 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0059.png", + "frame": { "x": 107, "y": 0, "w": 90, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 3, "w": 90, "h": 89 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0060.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0062.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0064.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0065.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0066.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0067.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0069.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0070.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0071.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0072.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0074.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0075.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0076.png", + "frame": { "x": 198, "y": 0, "w": 93, "h": 85 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 6, "w": 93, "h": 85 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0077.png", + "frame": { "x": 378, "y": 0, "w": 102, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 16, "w": 102, "h": 74 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 90, "w": 114, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 30, "w": 114, "h": 62 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0079.png", + "frame": { "x": 237, "y": 92, "w": 97, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 36, "w": 97, "h": 56 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + }, + { + "filename": "0080.png", + "frame": { "x": 292, "y": 0, "w": 85, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 2, "w": 85, "h": 91 }, + "sourceSize": { "w": 128, "h": 96 }, + "duration": 80 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "663.png", + "format": "I8", + "size": { "w": 480, "h": 152 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/663.png b/public/images/pokemon/exp/shiny/663.png index 21c1e740e8d..a4e9dad1596 100644 Binary files a/public/images/pokemon/exp/shiny/663.png and b/public/images/pokemon/exp/shiny/663.png differ diff --git a/public/images/pokemon/exp/shiny/664.json b/public/images/pokemon/exp/shiny/664.json index 07a901e0d44..5036fe74b0b 100644 --- a/public/images/pokemon/exp/shiny/664.json +++ b/public/images/pokemon/exp/shiny/664.json @@ -1,188 +1,110 @@ -{ - "textures": [ - { - "image": "664.png", - "format": "RGBA8888", - "size": { - "w": 84, - "h": 84 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 25, - "h": 41 - }, - "frame": { - "x": 0, - "y": 43, - "w": 25, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 25, - "h": 41 - }, - "frame": { - "x": 0, - "y": 43, - "w": 25, - "h": 41 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 25, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 25, - "y": 0, - "w": 25, - "h": 43 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 25, - "h": 43 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 25, - "h": 43 - }, - "frame": { - "x": 50, - "y": 0, - "w": 25, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:abc9e31ee93d2f27a131cb957fe7fc3c:57e5ff2b24c643697831bc41f9168d6d:596e7d5b15b1bf041c4d7f6707c8ff49$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 46, "w": 26, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 26, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 83, "y": 46, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 26, "y": 90, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 52, "y": 91, "w": 26, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 26, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 26, "y": 46, "w": 27, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 27, "h": 44 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 78, "y": 91, "w": 26, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 44 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 56, "y": 0, "w": 28, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 45 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 28, "y": 0, "w": 28, "h": 46 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 84, "y": 0, "w": 27, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 56, "y": 45, "w": 27, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 27, "h": 46 }, + "sourceSize": { "w": 28, "h": 46 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "664.png", + "format": "I8", + "size": { "w": 111, "h": 136 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/664.png b/public/images/pokemon/exp/shiny/664.png index 2c10d379388..bfb8bd76371 100644 Binary files a/public/images/pokemon/exp/shiny/664.png and b/public/images/pokemon/exp/shiny/664.png differ diff --git a/public/images/pokemon/exp/shiny/665.json b/public/images/pokemon/exp/shiny/665.json index d419d4e9f03..a06b1d10ad0 100644 --- a/public/images/pokemon/exp/shiny/665.json +++ b/public/images/pokemon/exp/shiny/665.json @@ -1,188 +1,596 @@ -{ - "textures": [ - { - "image": "665.png", - "format": "RGBA8888", - "size": { - "w": 76, - "h": 76 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 36 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 36 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 36, - "h": 36 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 36, - "h": 36 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 36, - "y": 36, - "w": 38, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 35 - }, - "frame": { - "x": 36, - "y": 36, - "w": 38, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:af761b040cc08a74363c20cbe1eaf31a:5814711e03aeb472bfa3250552523d75:a72e6c94514c750d7462eab6b08ee591$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 151, "y": 103, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 7, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 151, "y": 103, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 7, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 151, "y": 103, "w": 36, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 7, "w": 36, "h": 31 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 115, "y": 103, "w": 36, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 6, "w": 36, "h": 32 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 76, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 79, "y": 73, "w": 36, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 5, "w": 36, "h": 33 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 36, "y": 76, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 4, "w": 34, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 159, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 193, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 159, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 40, "y": 41, "w": 39, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 39, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 80, "y": 38, "w": 45, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 3, "w": 45, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 227, "y": 34, "w": 63, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 63, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 0, "w": 74, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 74, "h": 38 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 154, "y": 0, "w": 81, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 81, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 235, "y": 0, "w": 81, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 81, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 0, "w": 80, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 80, "h": 41 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 154, "y": 34, "w": 73, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 73, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 316, "y": 0, "w": 73, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 73, "h": 37 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 290, "y": 37, "w": 53, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 4, "w": 53, "h": 34 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 343, "y": 37, "w": 46, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 46, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 41, "w": 40, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 40, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 227, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 261, "y": 71, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 295, "y": 71, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 329, "y": 72, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 363, "y": 72, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 125, "y": 68, "w": 34, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 3, "w": 34, "h": 35 }, + "sourceSize": { "w": 81, "h": 45 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "665.png", + "format": "I8", + "size": { "w": 397, "h": 135 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/665.png b/public/images/pokemon/exp/shiny/665.png index 316ad902306..7046825ae59 100644 Binary files a/public/images/pokemon/exp/shiny/665.png and b/public/images/pokemon/exp/shiny/665.png differ diff --git a/public/images/pokemon/exp/shiny/667.json b/public/images/pokemon/exp/shiny/667.json index db076b1f465..3fba95afcf9 100644 --- a/public/images/pokemon/exp/shiny/667.json +++ b/public/images/pokemon/exp/shiny/667.json @@ -1,272 +1,659 @@ -{ - "textures": [ - { - "image": "667.png", - "format": "RGBA8888", - "size": { - "w": 160, - "h": 160 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 40, - "h": 46 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 92, - "w": 40, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 80, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 0, - "w": 40, - "h": 45 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 0, - "w": 40, - "h": 45 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 45, - "w": 40, - "h": 45 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 40, - "y": 90, - "w": 40, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 44 - }, - "frame": { - "x": 40, - "y": 46, - "w": 40, - "h": 44 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 44 - }, - "frame": { - "x": 80, - "y": 46, - "w": 40, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fb79c9185dd67d4776808c312f36f7a4:a6c3c7cc2402b26f23f5ac4e23929ba7:02171d511e760c8a3e1b623ad6bf93f5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0066.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0068.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0070.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0071.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0072.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "667.png", + "format": "I8", + "size": { "w": 167, "h": 141 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/667.png b/public/images/pokemon/exp/shiny/667.png index a0704b502c9..589f219c472 100644 Binary files a/public/images/pokemon/exp/shiny/667.png and b/public/images/pokemon/exp/shiny/667.png differ diff --git a/public/images/pokemon/exp/shiny/668.json b/public/images/pokemon/exp/shiny/668.json index 7e3f88c2276..63671a548a2 100644 --- a/public/images/pokemon/exp/shiny/668.json +++ b/public/images/pokemon/exp/shiny/668.json @@ -1,272 +1,821 @@ -{ - "textures": [ - { - "image": "668.png", - "format": "RGBA8888", - "size": { - "w": 205, - "h": 205 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 136, - "y": 69, - "w": 69, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fe9d35bc9a00c019cb84acf0c89b22a5:7d23425606ae8471a81a61d8fdec2fc9:947bf84d1af493c62e2cef45bb6c19ad$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 351, "y": 151, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 142, "y": 221, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 351, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 421, "y": 225, "w": 69, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 205, "y": 296, "w": 69, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 69, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 212, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 137, "y": 294, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 274, "y": 299, "w": 64, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 368, "w": 61, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 61, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 442, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 55, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 438, "y": 441, "w": 55, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 261, "y": 372, "w": 59, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 134, "y": 367, "w": 62, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 62, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 68, "y": 295, "w": 66, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 66, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 365, "y": 75, "w": 69, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 69, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 75, "w": 71, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 71, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 442, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 221, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 369, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 296, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 74, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 148, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 148, "y": 74, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 222, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 442, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 293, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 71, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 71, "y": 149, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 143, "y": 148, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668.png", + "format": "I8", + "size": { "w": 515, "h": 516 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/668.png b/public/images/pokemon/exp/shiny/668.png index eaf8428625f..4cac3d1d582 100644 Binary files a/public/images/pokemon/exp/shiny/668.png and b/public/images/pokemon/exp/shiny/668.png differ diff --git a/public/images/pokemon/exp/shiny/672.json b/public/images/pokemon/exp/shiny/672.json index 67914bce1a9..f337bef7d29 100644 --- a/public/images/pokemon/exp/shiny/672.json +++ b/public/images/pokemon/exp/shiny/672.json @@ -1,965 +1,479 @@ -{ - "textures": [ - { - "image": "672.png", - "format": "RGBA8888", - "size": { - "w": 250, - "h": 250 - }, - "scale": 1, - "frames": [ - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 190, - "y": 0, - "w": 38, - "h": 42 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 38, - "h": 42 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 42, - "w": 38, - "h": 42 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 76, - "y": 42, - "w": 38, - "h": 42 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 42 - }, - "frame": { - "x": 114, - "y": 42, - "w": 37, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 42 - }, - "frame": { - "x": 151, - "y": 42, - "w": 37, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 42 - }, - "frame": { - "x": 188, - "y": 42, - "w": 37, - "h": 42 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 37, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 37, - "h": 42 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 73, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 73, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 73, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 109, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 109, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 145, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 181, - "y": 84, - "w": 36, - "h": 42 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 0, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 36, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 72, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 108, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 144, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 36, - "h": 42 - }, - "frame": { - "x": 180, - "y": 126, - "w": 36, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 0, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 0, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 36, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 72, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 108, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 108, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 144, - "y": 168, - "w": 36, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 42 - }, - "frame": { - "x": 180, - "y": 168, - "w": 35, - "h": 42 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 42 - }, - "frame": { - "x": 180, - "y": 168, - "w": 35, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 42 - }, - "frame": { - "x": 215, - "y": 168, - "w": 35, - "h": 42 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 0, - "y": 209, - "w": 36, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 36, - "h": 41 - }, - "frame": { - "x": 36, - "y": 209, - "w": 36, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6fbd68ddc96f5b89a1e22b8dd6bbb4a7:2f673cdac5630b38377caf1ee3b82a60:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 43, "y": 0, "w": 43, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 43, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 43, "h": 54 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 42, "y": 100, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 86, "y": 50, "w": 41, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 51 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 43, "y": 0, "w": 43, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 43, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 43, "h": 54 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 83, "y": 101, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 86, "y": 50, "w": 41, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 51 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "672.png", + "format": "I8", + "size": { "w": 170, "h": 193 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/672.png b/public/images/pokemon/exp/shiny/672.png index 51c0e68da6c..605e79f1889 100644 Binary files a/public/images/pokemon/exp/shiny/672.png and b/public/images/pokemon/exp/shiny/672.png differ diff --git a/public/images/pokemon/exp/shiny/674.json b/public/images/pokemon/exp/shiny/674.json deleted file mode 100644 index 26013ad137f..00000000000 --- a/public/images/pokemon/exp/shiny/674.json +++ /dev/null @@ -1,524 +0,0 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 90, - "h": 90 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 30, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 0, - "y": 40, - "w": 30, - "h": 39 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 30, - "y": 0, - "w": 30, - "h": 39 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 30, - "h": 39 - }, - "frame": { - "x": 30, - "y": 0, - "w": 30, - "h": 39 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 0, - "w": 30, - "h": 37 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 37, - "w": 30, - "h": 37 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 30, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 30, - "h": 37 - }, - "frame": { - "x": 60, - "y": 37, - "w": 30, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a2f25cc68caea7219a96b563bb024d37:e8428456d1d23ad84ab9684dafd116b9:b823d10f1c9b4d501296982088ba63d6$" - } -} diff --git a/public/images/pokemon/exp/shiny/674.png b/public/images/pokemon/exp/shiny/674.png deleted file mode 100644 index b32b56ecd8d..00000000000 Binary files a/public/images/pokemon/exp/shiny/674.png and /dev/null 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/684.png b/public/images/pokemon/exp/shiny/684.png index 96fbea5e395..ed7b392cd6d 100644 Binary files a/public/images/pokemon/exp/shiny/684.png and b/public/images/pokemon/exp/shiny/684.png differ diff --git a/public/images/pokemon/exp/shiny/692.json b/public/images/pokemon/exp/shiny/692.json index 6d64cba2430..86b535260ae 100644 --- a/public/images/pokemon/exp/shiny/692.json +++ b/public/images/pokemon/exp/shiny/692.json @@ -1,356 +1,794 @@ -{ - "textures": [ - { - "image": "692.png", - "format": "RGBA8888", - "size": { - "w": 162, - "h": 162 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 60, - "y": 0, - "w": 60, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 60, - "y": 0, - "w": 60, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 60, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 60, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 82, - "w": 60, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 41 - }, - "frame": { - "x": 0, - "y": 82, - "w": 60, - "h": 41 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 0, - "y": 123, - "w": 60, - "h": 39 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 0, - "y": 123, - "w": 60, - "h": 39 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 60, - "y": 41, - "w": 60, - "h": 39 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 60, - "y": 41, - "w": 60, - "h": 39 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 60, - "y": 41, - "w": 60, - "h": 39 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 39 - }, - "frame": { - "x": 60, - "y": 41, - "w": 60, - "h": 39 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 41 - }, - "frame": { - "x": 60, - "y": 80, - "w": 59, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 41 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 59, - "h": 41 - }, - "frame": { - "x": 60, - "y": 121, - "w": 59, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fc9e6abcf70d6b35f1c403837c5312e8:2e67d61083a20d6c59dae4299718afc0:2880def858c84cd859bedf13b0b49a33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 117, "y": 72, "w": 59, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "692.png", + "format": "I8", + "size": { "w": 239, "h": 106 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/692.png b/public/images/pokemon/exp/shiny/692.png index 46cb7ca0f35..3d938d6e64a 100644 Binary files a/public/images/pokemon/exp/shiny/692.png and b/public/images/pokemon/exp/shiny/692.png differ diff --git a/public/images/pokemon/exp/shiny/693.json b/public/images/pokemon/exp/shiny/693.json index 991a16f1e53..c8f7763de1d 100644 --- a/public/images/pokemon/exp/shiny/693.json +++ b/public/images/pokemon/exp/shiny/693.json @@ -1,272 +1,902 @@ -{ - "textures": [ - { - "image": "693.png", - "format": "RGBA8888", - "size": { - "w": 259, - "h": 259 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 85, - "h": 89 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 85, - "h": 89 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 86, - "y": 0, - "w": 85, - "h": 89 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 86, - "y": 0, - "w": 85, - "h": 89 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 85, - "h": 89 - }, - "frame": { - "x": 85, - "y": 89, - "w": 85, - "h": 89 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 85, - "h": 88 - }, - "frame": { - "x": 171, - "y": 0, - "w": 85, - "h": 88 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 85, - "h": 88 - }, - "frame": { - "x": 171, - "y": 0, - "w": 85, - "h": 88 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 91, - "h": 80 - }, - "frame": { - "x": 0, - "y": 178, - "w": 91, - "h": 80 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 89, - "h": 83 - }, - "frame": { - "x": 170, - "y": 89, - "w": 89, - "h": 83 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 89, - "h": 83 - }, - "frame": { - "x": 170, - "y": 89, - "w": 89, - "h": 83 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ab498798f30c4ef93c4c30affa037f2e:aef6fdb8988ea3ebf127e38fb4875bad:9c1f9147e693c05eb4655590e9099679$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 303, "y": 140, "w": 102, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 102, "h": 70 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 523, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 11, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 318, "y": 290, "w": 103, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 7, "w": 103, "h": 64 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 105, "y": 1, "w": 102, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 102, "h": 75 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 306, "y": 72, "w": 108, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 108, "h": 68 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 108, "y": 276, "w": 105, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 14, "w": 105, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 104, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 104, "h": 74 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 203, "y": 210, "w": 106, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 13, "w": 106, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 508, "y": 152, "w": 106, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 106, "h": 67 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 414, "y": 74, "w": 103, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 103, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 306, "y": 72, "w": 108, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 108, "h": 68 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 108, "y": 276, "w": 105, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 14, "w": 105, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 1, "y": 1, "w": 104, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 104, "h": 74 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 203, "y": 210, "w": 106, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 13, "w": 106, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 309, "y": 214, "w": 107, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 14, "w": 107, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 306, "y": 1, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 106, "h": 70 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 1, "y": 218, "w": 107, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 14, "w": 107, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 213, "y": 279, "w": 105, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 14, "w": 105, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 103, "y": 341, "w": 104, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 15, "w": 104, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 516, "y": 1, "w": 101, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 101, "h": 73 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 100, "y": 149, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 1, "y": 349, "w": 102, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 16, "w": 102, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 103, "y": 404, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 16, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "693.png", + "format": "I8", + "size": { "w": 626, "h": 466 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/693.png b/public/images/pokemon/exp/shiny/693.png index 328c909b196..60f40ad0c40 100644 Binary files a/public/images/pokemon/exp/shiny/693.png and b/public/images/pokemon/exp/shiny/693.png differ diff --git a/public/images/pokemon/exp/shiny/694.json b/public/images/pokemon/exp/shiny/694.json deleted file mode 100644 index 2352bb65a43..00000000000 --- a/public/images/pokemon/exp/shiny/694.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 140, - "h": 140 - }, - "scale": 1, - "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 44, - "h": 34 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 34 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 34 - }, - "frame": { - "x": 0, - "y": 34, - "w": 43, - "h": 34 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 43, - "h": 34 - }, - "frame": { - "x": 44, - "y": 0, - "w": 43, - "h": 34 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 41, - "h": 35 - }, - "frame": { - "x": 0, - "y": 68, - "w": 41, - "h": 35 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 36, - "h": 37 - }, - "frame": { - "x": 0, - "y": 103, - "w": 36, - "h": 37 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 36, - "h": 37 - }, - "frame": { - "x": 0, - "y": 103, - "w": 36, - "h": 37 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 34, - "h": 37 - }, - "frame": { - "x": 36, - "y": 103, - "w": 34, - "h": 37 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 41, - "h": 35 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 35 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 39, - "h": 36 - }, - "frame": { - "x": 43, - "y": 34, - "w": 39, - "h": 36 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 39, - "h": 36 - }, - "frame": { - "x": 82, - "y": 35, - "w": 39, - "h": 36 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 33, - "h": 37 - }, - "frame": { - "x": 70, - "y": 71, - "w": 33, - "h": 37 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 44, - "h": 37 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 31, - "h": 37 - }, - "frame": { - "x": 103, - "y": 71, - "w": 31, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8a9916d2af3a40f04636cd5b11758f77:333ac780963a12589518f0acf1d61fde:b0990f9650cfe63b836cbed33f0b44d8$" - } -} diff --git a/public/images/pokemon/exp/shiny/694.png b/public/images/pokemon/exp/shiny/694.png deleted file mode 100644 index fe927c06742..00000000000 Binary files a/public/images/pokemon/exp/shiny/694.png and /dev/null differ diff --git a/public/images/pokemon/exp/shiny/696.json b/public/images/pokemon/exp/shiny/696.json index 0d54e1282c5..7ea3165c669 100644 --- a/public/images/pokemon/exp/shiny/696.json +++ b/public/images/pokemon/exp/shiny/696.json @@ -1,692 +1,1055 @@ -{ - "textures": [ - { - "image": "696.png", - "format": "RGBA8888", - "size": { - "w": 135, - "h": 135 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 53, - "y": 0, - "w": 53, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 53, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 53, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 53, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 53, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 53, - "h": 43 - }, - "frame": { - "x": 0, - "y": 92, - "w": 53, - "h": 43 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 45 - }, - "frame": { - "x": 53, - "y": 46, - "w": 53, - "h": 45 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 44 - }, - "frame": { - "x": 53, - "y": 91, - "w": 53, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:83a7f65d0ef4a30ff24cb813c97b1fe2:69043b7539e99a45979999a29408221b:58b7763fb9abdd043e9bfa400cfafdef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 57, "y": 0, "w": 57, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 48 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 57, "h": 50 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 114, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 113, "y": 137, "w": 58, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 58, "h": 42 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 138, "w": 58, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 58, "h": 40 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 56, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 113, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 170, "y": 92, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 171, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 227, "y": 92, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 55, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 228, "y": 46, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 114, "y": 47, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 171, "y": 0, "w": 58, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 58, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 171, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 57, "y": 48, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 50, "w": 56, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 229, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 61, "h": 50 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "696.png", + "format": "I8", + "size": { "w": 286, "h": 179 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/696.png b/public/images/pokemon/exp/shiny/696.png index 0a11f7b7ec7..86ecac0d371 100644 Binary files a/public/images/pokemon/exp/shiny/696.png and b/public/images/pokemon/exp/shiny/696.png differ diff --git a/public/images/pokemon/exp/shiny/697.json b/public/images/pokemon/exp/shiny/697.json index 7d68fbf764e..c56de41946c 100644 --- a/public/images/pokemon/exp/shiny/697.json +++ b/public/images/pokemon/exp/shiny/697.json @@ -1,1175 +1,983 @@ -{ - "textures": [ - { - "image": "697.png", - "format": "RGBA8888", - "size": { - "w": 378, - "h": 378 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 76 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 76, - "h": 76 - }, - "frame": { - "x": 0, - "y": 76, - "w": 76, - "h": 76 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 76, - "h": 75 - }, - "frame": { - "x": 76, - "y": 0, - "w": 76, - "h": 75 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 0, - "y": 152, - "w": 75, - "h": 75 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 76, - "h": 74 - }, - "frame": { - "x": 76, - "y": 75, - "w": 76, - "h": 74 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 75, - "h": 75 - }, - "frame": { - "x": 152, - "y": 0, - "w": 75, - "h": 75 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 76, - "h": 74 - }, - "frame": { - "x": 227, - "y": 0, - "w": 76, - "h": 74 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 0, - "y": 227, - "w": 74, - "h": 75 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 69, - "h": 76 - }, - "frame": { - "x": 0, - "y": 302, - "w": 69, - "h": 76 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 69, - "h": 76 - }, - "frame": { - "x": 0, - "y": 302, - "w": 69, - "h": 76 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 152, - "y": 75, - "w": 74, - "h": 74 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 303, - "y": 0, - "w": 74, - "h": 74 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 74, - "h": 74 - }, - "frame": { - "x": 303, - "y": 0, - "w": 74, - "h": 74 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 69, - "y": 302, - "w": 72, - "h": 75 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 71, - "h": 75 - }, - "frame": { - "x": 74, - "y": 227, - "w": 71, - "h": 75 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 73, - "h": 75 - }, - "frame": { - "x": 75, - "y": 152, - "w": 73, - "h": 75 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 148, - "y": 149, - "w": 74, - "h": 75 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 74, - "h": 75 - }, - "frame": { - "x": 148, - "y": 149, - "w": 74, - "h": 75 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 67, - "h": 77 - }, - "frame": { - "x": 222, - "y": 149, - "w": 67, - "h": 77 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 72, - "h": 75 - }, - "frame": { - "x": 227, - "y": 74, - "w": 72, - "h": 75 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 67, - "h": 77 - }, - "frame": { - "x": 299, - "y": 74, - "w": 67, - "h": 77 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 65, - "h": 78 - }, - "frame": { - "x": 289, - "y": 151, - "w": 65, - "h": 78 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 65, - "h": 78 - }, - "frame": { - "x": 289, - "y": 151, - "w": 65, - "h": 78 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 63, - "h": 79 - }, - "frame": { - "x": 145, - "y": 227, - "w": 63, - "h": 79 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 63, - "h": 79 - }, - "frame": { - "x": 145, - "y": 227, - "w": 63, - "h": 79 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 61, - "h": 79 - }, - "frame": { - "x": 208, - "y": 226, - "w": 61, - "h": 79 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 61, - "h": 79 - }, - "frame": { - "x": 208, - "y": 226, - "w": 61, - "h": 79 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 76, - "h": 79 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 60, - "h": 79 - }, - "frame": { - "x": 269, - "y": 229, - "w": 60, - "h": 79 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f5b6396fc735fbaf3881fa6c1e4cdad7:20237f200f066bd1e2f7b8926f0361f1:f4fdd87d2fc1483d8e0a185c2654e3d9$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 476, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 661, "y": 232, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 281, "y": 312, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 556, "y": 462, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 181, "y": 462, "w": 90, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 90, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 88, "y": 464, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 540, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 90, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 179, "y": 540, "w": 89, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 89, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 647, "y": 468, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 271, "y": 470, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 536, "y": 539, "w": 90, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 90, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 90, "y": 386, "w": 91, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 91, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 366, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 275, "y": 233, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 78, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 184, "y": 231, "w": 91, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 91, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 94, "y": 157, "w": 90, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 90, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 391, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 88, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 275, "y": 390, "w": 88, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 88, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 363, "y": 463, "w": 86, "h": 81 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 86, "h": 81 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 649, "y": 386, "w": 86, "h": 82 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 86, "h": 82 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 449, "y": 463, "w": 87, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 87, "h": 80 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 312, "w": 90, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 90, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 372, "y": 386, "w": 92, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 92, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 566, "y": 233, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 566, "y": 233, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 92, "y": 78, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 473, "y": 156, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 556, "y": 386, "w": 93, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 93, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 181, "y": 387, "w": 94, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 94, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 648, "y": 311, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 186, "y": 312, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 661, "y": 157, "w": 96, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 96, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 458, "y": 311, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 669, "y": 0, "w": 93, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 93, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 464, "y": 386, "w": 92, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 92, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 234, "w": 92, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 92, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 384, "y": 77, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 568, "y": 79, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 661, "y": 79, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 289, "y": 0, "w": 95, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 95, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 0, "y": 0, "w": 96, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 96, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 96, "y": 0, "w": 96, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 96, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 192, "y": 0, "w": 97, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 97, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 480, "y": 0, "w": 96, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 96, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 384, "y": 0, "w": 96, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 96, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 192, "y": 77, "w": 96, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 96, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 566, "y": 157, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 95, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 553, "y": 311, "w": 95, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 95, "h": 75 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 277, "y": 157, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 95, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 92, "y": 310, "w": 94, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 94, "h": 76 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 0, "y": 157, "w": 94, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 94, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 458, "y": 234, "w": 93, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 93, "h": 77 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 184, "y": 153, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 380, "y": 156, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 93, "h": 78 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 576, "y": 0, "w": 93, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 93, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 288, "y": 78, "w": 92, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 92, "h": 79 }, + "sourceSize": { "w": 100, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "697.png", + "format": "I8", + "size": { "w": 762, "h": 616 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/697.png b/public/images/pokemon/exp/shiny/697.png index b89902a748f..7f4a0c09327 100644 Binary files a/public/images/pokemon/exp/shiny/697.png and b/public/images/pokemon/exp/shiny/697.png differ diff --git a/public/images/pokemon/exp/shiny/698.json b/public/images/pokemon/exp/shiny/698.json deleted file mode 100644 index de4bc49fb04..00000000000 --- a/public/images/pokemon/exp/shiny/698.json +++ /dev/null @@ -1,3296 +0,0 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 175, - "h": 175 - }, - "scale": 1, - "frames": [ - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 0, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 38, - "h": 55 - }, - "frame": { - "x": 0, - "y": 120, - "w": 38, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 32, - "y": 60, - "w": 32, - "h": 60 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 29, - "h": 55 - }, - "frame": { - "x": 38, - "y": 120, - "w": 29, - "h": 55 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 32, - "h": 60 - }, - "frame": { - "x": 64, - "y": 0, - "w": 32, - "h": 60 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 32, - "h": 59 - }, - "frame": { - "x": 64, - "y": 60, - "w": 32, - "h": 59 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 37, - "h": 56 - }, - "frame": { - "x": 67, - "y": 119, - "w": 37, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 38, - "h": 54 - }, - "frame": { - "x": 104, - "y": 0, - "w": 38, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 33, - "h": 58 - }, - "frame": { - "x": 142, - "y": 0, - "w": 33, - "h": 58 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 36, - "h": 57 - }, - "frame": { - "x": 104, - "y": 54, - "w": 36, - "h": 57 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 34, - "h": 58 - }, - "frame": { - "x": 140, - "y": 58, - "w": 34, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 31, - "h": 57 - }, - "frame": { - "x": 104, - "y": 116, - "w": 31, - "h": 57 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 38, - "h": 60 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 30, - "h": 56 - }, - "frame": { - "x": 135, - "y": 116, - "w": 30, - "h": 56 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0ae9a601cdaeb2fdd017428d743bace6:a3c21f877838702a0481b1e5447757cd:198087d69fed44d4a642fa3ba5c077d6$" - } -} diff --git a/public/images/pokemon/exp/shiny/698.png b/public/images/pokemon/exp/shiny/698.png deleted file mode 100644 index 322a44b92e8..00000000000 Binary files a/public/images/pokemon/exp/shiny/698.png and /dev/null 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/700.json b/public/images/pokemon/exp/shiny/700.json index 4b7158b6eb9..fd6ef9b1bed 100644 --- a/public/images/pokemon/exp/shiny/700.json +++ b/public/images/pokemon/exp/shiny/700.json @@ -1,1070 +1,523 @@ -{ - "textures": [ - { - "image": "700.png", - "format": "RGBA8888", - "size": { - "w": 233, - "h": 233 - }, - "scale": 1, - "frames": [ - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 53, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 53, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 52, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 52, - "h": 58 - }, - "frame": { - "x": 53, - "y": 0, - "w": 52, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 51, - "h": 59 - }, - "frame": { - "x": 0, - "y": 116, - "w": 51, - "h": 59 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 45, - "h": 58 - }, - "frame": { - "x": 0, - "y": 175, - "w": 45, - "h": 58 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 45, - "h": 58 - }, - "frame": { - "x": 0, - "y": 175, - "w": 45, - "h": 58 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 52, - "y": 58, - "w": 50, - "h": 59 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 105, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 155, - "y": 0, - "w": 50, - "h": 59 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 51, - "y": 117, - "w": 50, - "h": 59 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 57 - }, - "frame": { - "x": 45, - "y": 176, - "w": 42, - "h": 57 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 102, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 152, - "y": 59, - "w": 50, - "h": 59 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 50, - "h": 59 - }, - "frame": { - "x": 101, - "y": 118, - "w": 50, - "h": 59 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 53, - "h": 59 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 49, - "h": 59 - }, - "frame": { - "x": 151, - "y": 118, - "w": 49, - "h": 59 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b88614ce72ee950ea29dcf939b8dfd56:5daab4ddd86f67a34aaa4b7377e3b534:2e4bf5ef1f19e475073f7da10c60b540$" - } +{ "frames": { + "0001.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0002.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0003.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0004.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0005.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0006.png": { + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0007.png": { + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0008.png": { + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0009.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0010.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0011.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0012.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0013.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0014.png": { + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0015.png": { + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0016.png": { + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0017.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0018.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0019.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0020.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0021.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0022.png": { + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0023.png": { + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0024.png": { + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0025.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0026.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0027.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0028.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0029.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0030.png": { + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0031.png": { + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0032.png": { + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0033.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0034.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0035.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0036.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0037.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0038.png": { + "frame": { "x": 93, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0039.png": { + "frame": { "x": 99, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0040.png": { + "frame": { "x": 139, "y": 119, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0041.png": { + "frame": { "x": 180, "y": 183, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0042.png": { + "frame": { "x": 136, "y": 238, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0043.png": { + "frame": { "x": 44, "y": 181, "w": 44, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 44, "h": 57 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0044.png": { + "frame": { "x": 88, "y": 239, "w": 44, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 44, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0045.png": { + "frame": { "x": 180, "y": 242, "w": 43, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 43, "h": 56 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0046.png": { + "frame": { "x": 0, "y": 120, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0047.png": { + "frame": { "x": 146, "y": 60, "w": 46, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 46, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0048.png": { + "frame": { "x": 46, "y": 122, "w": 45, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 45, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0049.png": { + "frame": { "x": 0, "y": 239, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0050.png": { + "frame": { "x": 193, "y": 60, "w": 43, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 43, "h": 62 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0051.png": { + "frame": { "x": 99, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0052.png": { + "frame": { "x": 147, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0053.png": { + "frame": { "x": 0, "y": 0, "w": 51, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 51, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0054.png": { + "frame": { "x": 0, "y": 60, "w": 46, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 46, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0055.png": { + "frame": { "x": 92, "y": 178, "w": 43, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 43, "h": 60 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0056.png": { + "frame": { "x": 195, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0057.png": { + "frame": { "x": 52, "y": 0, "w": 46, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 46, "h": 61 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0058.png": { + "frame": { "x": 136, "y": 178, "w": 43, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 43, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0059.png": { + "frame": { "x": 195, "y": 0, "w": 47, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 47, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0060.png": { + "frame": { "x": 52, "y": 0, "w": 46, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 46, "h": 61 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0061.png": { + "frame": { "x": 0, "y": 179, "w": 43, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 43, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0062.png": { + "frame": { "x": 185, "y": 123, "w": 44, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 44, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0063.png": { + "frame": { "x": 47, "y": 62, "w": 45, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 45, "h": 59 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + }, + "0064.png": { + "frame": { "x": 44, "y": 239, "w": 43, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 43, "h": 58 }, + "sourceSize": { "w": 51, "h": 62 }, + "duration": 100 + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "700.png", + "format": "I8", + "size": { "w": 242, "h": 298 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/700.png b/public/images/pokemon/exp/shiny/700.png index 5c809e628f5..f7addc720bf 100644 Binary files a/public/images/pokemon/exp/shiny/700.png and b/public/images/pokemon/exp/shiny/700.png differ diff --git a/public/images/pokemon/exp/shiny/702.json b/public/images/pokemon/exp/shiny/702.json index fc28cb19512..0ab95b58c7a 100644 --- a/public/images/pokemon/exp/shiny/702.json +++ b/public/images/pokemon/exp/shiny/702.json @@ -1,671 +1,443 @@ -{ - "textures": [ - { - "image": "702.png", - "format": "RGBA8888", - "size": { - "w": 138, - "h": 138 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 48, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 48, - "h": 36 - }, - "frame": { - "x": 48, - "y": 0, - "w": 48, - "h": 36 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 47, - "h": 36 - }, - "frame": { - "x": 0, - "y": 36, - "w": 47, - "h": 36 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 45, - "h": 36 - }, - "frame": { - "x": 0, - "y": 72, - "w": 45, - "h": 36 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 45, - "h": 36 - }, - "frame": { - "x": 0, - "y": 72, - "w": 45, - "h": 36 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 35 - }, - "frame": { - "x": 45, - "y": 72, - "w": 48, - "h": 35 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 47, - "y": 36, - "w": 44, - "h": 35 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 47, - "y": 36, - "w": 44, - "h": 35 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 47, - "y": 36, - "w": 44, - "h": 35 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 47, - "h": 33 - }, - "frame": { - "x": 91, - "y": 36, - "w": 47, - "h": 33 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 47, - "h": 33 - }, - "frame": { - "x": 91, - "y": 36, - "w": 47, - "h": 33 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 47, - "h": 33 - }, - "frame": { - "x": 91, - "y": 36, - "w": 47, - "h": 33 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 93, - "y": 69, - "w": 44, - "h": 35 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 93, - "y": 69, - "w": 44, - "h": 35 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 36 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 44, - "h": 35 - }, - "frame": { - "x": 93, - "y": 69, - "w": 44, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2fc3a964a6785b059da0b8d24f80fbd1:ec3deecdcac6775e64f154a58c36eef3:ba8fdab405d5efab99c4aa1084328e6b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 47, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 47, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 94, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 141, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 47, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 47, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 94, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 141, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 47, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 47, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 94, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 141, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 47, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 47, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 94, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 141, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 94, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 141, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 141, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 188, "y": 37, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 144, "y": 0, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 48, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 74, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 188, "y": 111, "w": 46, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 46, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 145, "w": 45, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 45, "h": 33 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 96, "y": 0, "w": 47, "h": 36 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 47, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 47, "y": 74, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 94, "y": 74, "w": 46, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 187, "y": 74, "w": 45, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 45, "h": 36 }, + "sourceSize": { "w": 47, "h": 36 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "702.png", + "format": "I8", + "size": { "w": 234, "h": 178 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/702.png b/public/images/pokemon/exp/shiny/702.png index b7e117c9473..2f7b735a1dc 100644 Binary files a/public/images/pokemon/exp/shiny/702.png and b/public/images/pokemon/exp/shiny/702.png differ diff --git a/public/images/pokemon/exp/shiny/703.json b/public/images/pokemon/exp/shiny/703.json deleted file mode 100644 index 4762fa91a2c..00000000000 --- a/public/images/pokemon/exp/shiny/703.json +++ /dev/null @@ -1,356 +0,0 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 120, - "h": 120 - }, - "scale": 1, - "frames": [ - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 37, - "h": 41 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 37, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 37, - "h": 41 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 37, - "h": 40 - }, - "frame": { - "x": 37, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 11, - "w": 37, - "h": 40 - }, - "frame": { - "x": 74, - "y": 0, - "w": 37, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 35, - "h": 41 - }, - "frame": { - "x": 37, - "y": 40, - "w": 35, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 35, - "h": 41 - }, - "frame": { - "x": 37, - "y": 40, - "w": 35, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 12, - "w": 35, - "h": 39 - }, - "frame": { - "x": 37, - "y": 81, - "w": 35, - "h": 39 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 40 - }, - "frame": { - "x": 72, - "y": 40, - "w": 37, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 37, - "h": 51 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 35, - "h": 40 - }, - "frame": { - "x": 72, - "y": 80, - "w": 35, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:253ca4296d88ee81990e3297ca0f62aa:8f78420201adcea5fb7920c60446c81d:721af8c322ff60159262e9b3017c784d$" - } -} diff --git a/public/images/pokemon/exp/shiny/703.png b/public/images/pokemon/exp/shiny/703.png deleted file mode 100644 index 4e4064509ae..00000000000 Binary files a/public/images/pokemon/exp/shiny/703.png and /dev/null differ diff --git a/public/images/pokemon/exp/shiny/704.json b/public/images/pokemon/exp/shiny/704.json index d14609ad74c..4241b2d2a8d 100644 --- a/public/images/pokemon/exp/shiny/704.json +++ b/public/images/pokemon/exp/shiny/704.json @@ -1,1784 +1,371 @@ -{ - "textures": [ - { - "image": "704.png", - "format": "RGBA8888", - "size": { - "w": 288, - "h": 288 - }, - "scale": 1, - "frames": [ - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 43, - "h": 48 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 43, - "h": 48 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 47 - }, - "frame": { - "x": 0, - "y": 144, - "w": 43, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 47 - }, - "frame": { - "x": 0, - "y": 144, - "w": 43, - "h": 47 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 46 - }, - "frame": { - "x": 0, - "y": 191, - "w": 41, - "h": 46 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 41, - "h": 46 - }, - "frame": { - "x": 0, - "y": 191, - "w": 41, - "h": 46 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 0, - "y": 237, - "w": 39, - "h": 45 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 0, - "y": 237, - "w": 39, - "h": 45 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 39, - "y": 237, - "w": 41, - "h": 44 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 41, - "y": 191, - "w": 41, - "h": 44 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 41, - "y": 191, - "w": 41, - "h": 44 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 80, - "y": 235, - "w": 41, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 121, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 121, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 43, - "y": 0, - "w": 39, - "h": 44 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 163, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 42, - "h": 43 - }, - "frame": { - "x": 205, - "y": 0, - "w": 42, - "h": 43 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 41, - "h": 44 - }, - "frame": { - "x": 247, - "y": 0, - "w": 41, - "h": 44 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 121, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 82, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 43, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 43, - "y": 44, - "w": 39, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 42, - "h": 42 - }, - "frame": { - "x": 163, - "y": 43, - "w": 42, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 205, - "y": 43, - "w": 42, - "h": 41 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 247, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 205, - "y": 84, - "w": 42, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 205, - "y": 84, - "w": 42, - "h": 40 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 205, - "y": 84, - "w": 42, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 247, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 247, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 43, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 43, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 38, - "h": 44 - }, - "frame": { - "x": 43, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 132, - "w": 37, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 37, - "h": 44 - }, - "frame": { - "x": 81, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 82, - "y": 176, - "w": 36, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 82, - "y": 176, - "w": 36, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 42, - "h": 40 - }, - "frame": { - "x": 121, - "y": 85, - "w": 42, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 163, - "y": 85, - "w": 36, - "h": 44 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 121, - "y": 125, - "w": 36, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 199, - "y": 124, - "w": 36, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 199, - "y": 124, - "w": 36, - "h": 44 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 157, - "y": 129, - "w": 36, - "h": 44 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 36, - "h": 44 - }, - "frame": { - "x": 121, - "y": 169, - "w": 36, - "h": 44 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 235, - "y": 132, - "w": 36, - "h": 43 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 235, - "y": 132, - "w": 36, - "h": 43 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 193, - "y": 168, - "w": 36, - "h": 43 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 157, - "y": 173, - "w": 36, - "h": 43 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 121, - "y": 213, - "w": 36, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 229, - "y": 175, - "w": 36, - "h": 43 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 193, - "y": 211, - "w": 36, - "h": 43 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 157, - "y": 216, - "w": 36, - "h": 43 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 229, - "y": 218, - "w": 36, - "h": 43 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 36, - "h": 43 - }, - "frame": { - "x": 229, - "y": 218, - "w": 36, - "h": 43 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c2301c17b022e36ed40b13f27d705543:87a73272ea48477e6b25b210421da5ec:45bb13be23ae6e2a6654a2a00c450d62$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0003.png", + "frame": { "x": 78, "y": 0, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0007.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0008.png", + "frame": { "x": 52, "y": 94, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0009.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0013.png", + "frame": { "x": 78, "y": 0, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0017.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0018.png", + "frame": { "x": 52, "y": 94, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0019.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0023.png", + "frame": { "x": 78, "y": 0, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0026.png", + "frame": { "x": 26, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 67, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0028.png", + "frame": { "x": 80, "y": 94, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0029.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0032.png", + "frame": { "x": 26, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0033.png", + "frame": { "x": 78, "y": 31, "w": 28, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 31 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0034.png", + "frame": { "x": 52, "y": 34, "w": 26, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 26, "h": 33 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0035.png", + "frame": { "x": 52, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0036.png", + "frame": { "x": 52, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0037.png", + "frame": { "x": 26, "y": 67, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 99, "w": 28, "h": 29 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 28, "h": 29 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0039.png", + "frame": { "x": 78, "y": 62, "w": 26, "h": 32 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 26, "h": 32 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 26, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 26, "h": 34 }, + "sourceSize": { "w": 28, "h": 34 }, + "duration": 150 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "704.png", + "format": "RGBA8888", + "size": { "w": 108, "h": 128 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/704.png b/public/images/pokemon/exp/shiny/704.png index ac31e9da30c..d630d161de1 100644 Binary files a/public/images/pokemon/exp/shiny/704.png and b/public/images/pokemon/exp/shiny/704.png differ diff --git a/public/images/pokemon/exp/shiny/705.json b/public/images/pokemon/exp/shiny/705.json index 1d18b10d3a0..bc7b5ff15d3 100644 --- a/public/images/pokemon/exp/shiny/705.json +++ b/public/images/pokemon/exp/shiny/705.json @@ -1,272 +1,596 @@ -{ - "textures": [ - { - "image": "705.png", - "format": "RGBA8888", - "size": { - "w": 154, - "h": 154 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 46, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 46, - "h": 58 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 46, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 45, - "h": 58 - }, - "frame": { - "x": 91, - "y": 0, - "w": 45, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 42, - "h": 58 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 58 - }, - "frame": { - "x": 0, - "y": 58, - "w": 42, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 58 - }, - "frame": { - "x": 42, - "y": 58, - "w": 41, - "h": 58 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 58 - }, - "frame": { - "x": 42, - "y": 58, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 58 - }, - "frame": { - "x": 83, - "y": 58, - "w": 36, - "h": 58 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 36, - "h": 58 - }, - "frame": { - "x": 83, - "y": 58, - "w": 36, - "h": 58 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 49, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 35, - "h": 58 - }, - "frame": { - "x": 119, - "y": 58, - "w": 35, - "h": 58 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:eb2c6abdfceb0458f6389a25d31f9dab:0ef587160e8636cec6566f480554985e:6b57e983626c7fc9144ab67f30c66814$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 38, "y": 186, "w": 40, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 40, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 78, "y": 189, "w": 40, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 40, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 77, "y": 304, "w": 39, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 39, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 197, "y": 246, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 158, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 155, "y": 246, "w": 42, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 199, "y": 302, "w": 41, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 41, "h": 55 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 77, "y": 248, "w": 41, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 41, "h": 56 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 118, "y": 301, "w": 40, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 40, "h": 57 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 38, "y": 246, "w": 39, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 59 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 253, "w": 37, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 37, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 191, "w": 38, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 38, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 118, "y": 189, "w": 37, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 37, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 64, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 194, "y": 184, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 156, "y": 120, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 159, "y": 0, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 39, "y": 125, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 200, "y": 60, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 39, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 79, "y": 125, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 117, "y": 125, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 127, "w": 38, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 38, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 39, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 39, "h": 64 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 78, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 117, "y": 62, "w": 39, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 39, "h": 63 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 155, "y": 181, "w": 39, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 39, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 119, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 79, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 39, "y": 0, "w": 40, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 62 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 196, "y": 123, "w": 40, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 40, "h": 61 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 200, "y": 0, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 159, "y": 60, "w": 41, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 41, "h": 60 }, + "sourceSize": { "w": 44, "h": 64 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "705.png", + "format": "I8", + "size": { "w": 241, "h": 361 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/705.png b/public/images/pokemon/exp/shiny/705.png index 8653de923ec..7fed21b3583 100644 Binary files a/public/images/pokemon/exp/shiny/705.png and b/public/images/pokemon/exp/shiny/705.png differ diff --git a/public/images/pokemon/exp/shiny/707.json b/public/images/pokemon/exp/shiny/707.json deleted file mode 100644 index cdc3064d8aa..00000000000 --- a/public/images/pokemon/exp/shiny/707.json +++ /dev/null @@ -1,1931 +0,0 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 283, - "h": 283 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 69 - }, - "frame": { - "x": 41, - "y": 0, - "w": 39, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 69 - }, - "frame": { - "x": 80, - "y": 0, - "w": 37, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 117, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 159, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 44, - "h": 70 - }, - "frame": { - "x": 201, - "y": 0, - "w": 44, - "h": 70 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 245, - "y": 0, - "w": 38, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 70 - }, - "frame": { - "x": 0, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 70 - }, - "frame": { - "x": 44, - "y": 69, - "w": 44, - "h": 70 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 88, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 70 - }, - "frame": { - "x": 126, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 164, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 202, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 240, - "y": 70, - "w": 38, - "h": 70 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 0, - "y": 139, - "w": 38, - "h": 70 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 38, - "y": 139, - "w": 40, - "h": 70 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 42, - "h": 70 - }, - "frame": { - "x": 78, - "y": 140, - "w": 42, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 45, - "h": 70 - }, - "frame": { - "x": 120, - "y": 140, - "w": 45, - "h": 70 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 43, - "h": 70 - }, - "frame": { - "x": 165, - "y": 140, - "w": 43, - "h": 70 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 43, - "h": 70 - }, - "frame": { - "x": 165, - "y": 140, - "w": 43, - "h": 70 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 71 - }, - "frame": { - "x": 208, - "y": 140, - "w": 45, - "h": 71 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 71 - }, - "frame": { - "x": 0, - "y": 209, - "w": 37, - "h": 71 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 37, - "y": 209, - "w": 38, - "h": 71 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 9, - "y": 1, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 210, - "w": 38, - "h": 71 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 45, - "h": 71 - }, - "frame": { - "x": 151, - "y": 210, - "w": 45, - "h": 71 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 39, - "h": 71 - }, - "frame": { - "x": 196, - "y": 211, - "w": 39, - "h": 71 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 39, - "h": 71 - }, - "frame": { - "x": 196, - "y": 211, - "w": 39, - "h": 71 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 50, - "h": 73 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 44, - "h": 71 - }, - "frame": { - "x": 235, - "y": 211, - "w": 44, - "h": 71 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:26c493d70c41c4104147194dfbbab5b9:b12f3eb3fdd1a69bbf055a44f9557395:8e96b9056ea81e44ced99c97f472a528$" - } -} diff --git a/public/images/pokemon/exp/shiny/707.png b/public/images/pokemon/exp/shiny/707.png deleted file mode 100644 index ee0fec17e8c..00000000000 Binary files a/public/images/pokemon/exp/shiny/707.png and /dev/null differ diff --git a/public/images/pokemon/exp/shiny/708.png b/public/images/pokemon/exp/shiny/708.png deleted file mode 100644 index bb896a0214c..00000000000 Binary files a/public/images/pokemon/exp/shiny/708.png and /dev/null differ diff --git a/public/images/pokemon/exp/shiny/712.json b/public/images/pokemon/exp/shiny/712.json index 80e4e6a13b9..88a49637b7c 100644 --- a/public/images/pokemon/exp/shiny/712.json +++ b/public/images/pokemon/exp/shiny/712.json @@ -1,2771 +1,1433 @@ -{ - "textures": [ - { - "image": "712.png", - "format": "RGBA8888", - "size": { - "w": 209, - "h": 209 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 38, - "h": 44 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 38, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 0, - "y": 132, - "w": 38, - "h": 44 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 44 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 114, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 152, - "y": 0, - "w": 38, - "h": 43 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 43, - "w": 38, - "h": 43 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 43, - "w": 38, - "h": 43 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 43 - }, - "frame": { - "x": 76, - "y": 43, - "w": 38, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 38, - "y": 44, - "w": 38, - "h": 42 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 114, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 152, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 38, - "h": 42 - }, - "frame": { - "x": 152, - "y": 43, - "w": 38, - "h": 42 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 152, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 152, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 152, - "y": 85, - "w": 38, - "h": 41 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 86, - "w": 38, - "h": 41 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 168, - "w": 38, - "h": 41 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 38, - "y": 168, - "w": 38, - "h": 41 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 127, - "w": 38, - "h": 41 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 168, - "w": 38, - "h": 41 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 76, - "y": 168, - "w": 38, - "h": 41 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 126, - "w": 38, - "h": 41 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 41 - }, - "frame": { - "x": 114, - "y": 126, - "w": 38, - "h": 41 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 114, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 114, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 151, - "y": 167, - "w": 37, - "h": 41 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 42, - "h": 44 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 37, - "h": 41 - }, - "frame": { - "x": 151, - "y": 167, - "w": 37, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:90506cc63998ae2867a3e57df229bc50:f8b5635f0ab8bc294bdbf4d4b4782548:3a1cc69824960d920ca43f8c9376d136$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 111, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 112, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 149, "y": 44, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 74, "y": 86, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 148, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 0, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 37, "y": 0, "w": 36, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 36, "h": 44 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 74, "y": 0, "w": 36, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 43 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 37, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 37, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 111, "y": 87, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 111, "y": 87, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 148, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 148, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 0, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 0, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 0, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 37, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 37, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 74, "y": 128, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 74, "y": 128, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 148, "y": 128, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 148, "y": 128, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 129, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 0, "y": 129, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 148, "y": 128, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 148, "y": 128, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 74, "y": 128, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 74, "y": 128, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 37, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 37, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 37, "y": 129, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 37, "y": 129, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 111, "y": 129, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 111, "y": 129, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 74, "y": 169, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 74, "y": 169, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 148, "y": 169, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 148, "y": 169, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 0, "y": 170, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 0, "y": 170, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 74, "y": 44, "w": 37, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 37, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 74, "y": 44, "w": 37, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 37, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 0, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 0, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 0, "y": 88, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 148, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 148, "y": 87, "w": 36, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 40 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 111, "y": 87, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 111, "y": 87, "w": 36, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 36, "h": 41 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0157.png", + "frame": { "x": 37, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + }, + { + "filename": "0158.png", + "frame": { "x": 37, "y": 45, "w": 36, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 36, "h": 42 }, + "sourceSize": { "w": 42, "h": 44 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "712.png", + "format": "I8", + "size": { "w": 185, "h": 210 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/712.png b/public/images/pokemon/exp/shiny/712.png index 66e28efacd9..2ba0434ad7a 100644 Binary files a/public/images/pokemon/exp/shiny/712.png and b/public/images/pokemon/exp/shiny/712.png differ diff --git a/public/images/pokemon/exp/shiny/713.json b/public/images/pokemon/exp/shiny/713.json index c2aab871871..f4fcfa1ff85 100644 --- a/public/images/pokemon/exp/shiny/713.json +++ b/public/images/pokemon/exp/shiny/713.json @@ -1,146 +1,1100 @@ -{ - "textures": [ - { - "image": "713.png", - "format": "RGBA8888", - "size": { - "w": 174, - "h": 174 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 87, - "h": 71 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 71 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 87, - "h": 72 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 72 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 87, - "h": 72 - }, - "frame": { - "x": 87, - "y": 0, - "w": 87, - "h": 72 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 73 - }, - "frame": { - "x": 0, - "y": 71, - "w": 87, - "h": 73 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 73 - }, - "frame": { - "x": 0, - "y": 71, - "w": 87, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 73 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 73 - }, - "frame": { - "x": 87, - "y": 72, - "w": 87, - "h": 73 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ce42146f2549b65131ae1e38620ec02e:c360691d0dff3de5f5058a576fd05ded:625f70bcfe9c7f2437cb9cad6d2b863c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 83, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 128, "w": 83, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 83, "h": 61 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 166, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 332, "y": 126, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 249, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 166, "y": 64, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 83, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 0, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 249, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 166, "y": 0, "w": 83, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 64 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 83, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 83, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 332, "y": 0, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 332, "y": 0, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 332, "y": 63, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 332, "y": 0, "w": 84, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 84, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 249, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 249, "y": 127, "w": 83, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 62 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 332, "y": 188, "w": 83, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 59 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 332, "y": 188, "w": 83, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 59 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 0, "y": 189, "w": 83, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 58 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 332, "y": 188, "w": 83, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 59 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 0, "y": 65, "w": 83, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 83, "h": 63 }, + "sourceSize": { "w": 84, "h": 66 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "713.png", + "format": "I8", + "size": { "w": 416, "h": 247 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/713.png b/public/images/pokemon/exp/shiny/713.png index ded180bdefc..72c06f1d750 100644 Binary files a/public/images/pokemon/exp/shiny/713.png and b/public/images/pokemon/exp/shiny/713.png differ diff --git a/public/images/pokemon/exp/shiny/714.json b/public/images/pokemon/exp/shiny/714.json deleted file mode 100644 index dc8d580d33b..00000000000 --- a/public/images/pokemon/exp/shiny/714.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 179, - "h": 179 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 60 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 63, - "h": 60 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 60 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 0, - "y": 60, - "w": 64, - "h": 59 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 59 - }, - "frame": { - "x": 0, - "y": 60, - "w": 64, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 58 - }, - "frame": { - "x": 63, - "y": 0, - "w": 64, - "h": 58 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 61 - }, - "frame": { - "x": 64, - "y": 58, - "w": 60, - "h": 61 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 61 - }, - "frame": { - "x": 64, - "y": 58, - "w": 60, - "h": 61 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 58, - "w": 54, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 54, - "h": 58 - }, - "frame": { - "x": 124, - "y": 116, - "w": 54, - "h": 58 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 60, - "h": 60 - }, - "frame": { - "x": 0, - "y": 119, - "w": 60, - "h": 60 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 60, - "h": 60 - }, - "frame": { - "x": 0, - "y": 119, - "w": 60, - "h": 60 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 60 - }, - "frame": { - "x": 60, - "y": 119, - "w": 56, - "h": 60 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 64, - "h": 63 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 56, - "h": 60 - }, - "frame": { - "x": 60, - "y": 119, - "w": 56, - "h": 60 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f10fb65b088005bbceee81a7323b3d04:cc45de39527285e86e95e3dc2425b833:1a07d46e710b0568ec824f54fbc4fe6a$" - } -} diff --git a/public/images/pokemon/exp/shiny/714.png b/public/images/pokemon/exp/shiny/714.png deleted file mode 100644 index 53e4a6348be..00000000000 Binary files a/public/images/pokemon/exp/shiny/714.png and /dev/null 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/718-10.json b/public/images/pokemon/exp/shiny/718-10.json deleted file mode 100644 index 98f6bbb0f01..00000000000 --- a/public/images/pokemon/exp/shiny/718-10.json +++ /dev/null @@ -1,692 +0,0 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 239, - "h": 239 - }, - "scale": 1, - "frames": [ - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 65 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 59, - "h": 67 - }, - "frame": { - "x": 0, - "y": 65, - "w": 59, - "h": 67 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 64, - "h": 61 - }, - "frame": { - "x": 0, - "y": 132, - "w": 64, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 65, - "h": 60 - }, - "frame": { - "x": 59, - "y": 65, - "w": 65, - "h": 60 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 61, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 120, - "y": 0, - "w": 59, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 59, - "h": 66 - }, - "frame": { - "x": 179, - "y": 0, - "w": 59, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 58, - "h": 67 - }, - "frame": { - "x": 124, - "y": 66, - "w": 58, - "h": 67 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 59, - "h": 65 - }, - "frame": { - "x": 64, - "y": 125, - "w": 59, - "h": 65 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 182, - "y": 66, - "w": 57, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 58, - "h": 66 - }, - "frame": { - "x": 123, - "y": 133, - "w": 58, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 67 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 57, - "h": 67 - }, - "frame": { - "x": 181, - "y": 133, - "w": 57, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f59f7684ea1f2b8bb14e98d16b18e3e0:a1fa21d4b2b42982b0f0546116b38791:82195cf2a6db620c5643b8162d6e8c5c$" - } -} diff --git a/public/images/pokemon/exp/shiny/718-10.png b/public/images/pokemon/exp/shiny/718-10.png deleted file mode 100644 index 26bc2cdc580..00000000000 Binary files a/public/images/pokemon/exp/shiny/718-10.png and /dev/null differ diff --git a/public/images/pokemon/exp/shiny/718.json b/public/images/pokemon/exp/shiny/718.json deleted file mode 100644 index 29211eba621..00000000000 --- a/public/images/pokemon/exp/shiny/718.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 219, - "h": 219 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 71, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 71, - "h": 88 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 71, - "y": 0, - "w": 73, - "h": 89 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 144, - "y": 0, - "w": 74, - "h": 89 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 144, - "y": 0, - "w": 74, - "h": 89 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 74, - "h": 89 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 89 - }, - "frame": { - "x": 0, - "y": 89, - "w": 74, - "h": 89 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 74, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 89 - }, - "frame": { - "x": 74, - "y": 89, - "w": 73, - "h": 89 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 89 - }, - "frame": { - "x": 147, - "y": 89, - "w": 72, - "h": 89 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 89 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 89 - }, - "frame": { - "x": 147, - "y": 89, - "w": 72, - "h": 89 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5e3b138302e8798c9cc3072d564e3004:76aca0c13999f6d287f1b28f7f386fed:7b4a06b06cbac24b3f39727b0238661b$" - } -} diff --git a/public/images/pokemon/exp/shiny/718.png b/public/images/pokemon/exp/shiny/718.png deleted file mode 100644 index 59dde9d4c05..00000000000 Binary files a/public/images/pokemon/exp/shiny/718.png and /dev/null differ diff --git a/public/images/pokemon/exp/shiny/719.json b/public/images/pokemon/exp/shiny/719.json deleted file mode 100644 index 9bf72888c33..00000000000 --- a/public/images/pokemon/exp/shiny/719.json +++ /dev/null @@ -1,1091 +0,0 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 210, - "h": 210 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 10, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 24, - "y": 6, - "w": 49, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 49, - "h": 67 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 34, - "y": 9, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 16, - "y": 3, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 48, - "h": 67 - }, - "frame": { - "x": 49, - "y": 0, - "w": 48, - "h": 67 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 8, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 47, - "h": 67 - }, - "frame": { - "x": 97, - "y": 0, - "w": 47, - "h": 67 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 46, - "h": 67 - }, - "frame": { - "x": 144, - "y": 0, - "w": 46, - "h": 67 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 48, - "h": 66 - }, - "frame": { - "x": 0, - "y": 67, - "w": 48, - "h": 66 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 48, - "y": 12, - "w": 46, - "h": 66 - }, - "frame": { - "x": 48, - "y": 67, - "w": 46, - "h": 66 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 45, - "y": 1, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 45, - "h": 67 - }, - "frame": { - "x": 94, - "y": 67, - "w": 45, - "h": 67 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 2, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 27, - "y": 4, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 25, - "y": 6, - "w": 44, - "h": 67 - }, - "frame": { - "x": 0, - "y": 133, - "w": 44, - "h": 67 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 36, - "y": 2, - "w": 42, - "h": 67 - }, - "frame": { - "x": 44, - "y": 133, - "w": 42, - "h": 67 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 54, - "y": 3, - "w": 42, - "h": 67 - }, - "frame": { - "x": 139, - "y": 67, - "w": 42, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 23, - "y": 6, - "w": 42, - "h": 67 - }, - "frame": { - "x": 139, - "y": 67, - "w": 42, - "h": 67 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 1, - "y": 12, - "w": 42, - "h": 66 - }, - "frame": { - "x": 86, - "y": 134, - "w": 42, - "h": 66 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 55, - "y": 6, - "w": 41, - "h": 67 - }, - "frame": { - "x": 128, - "y": 134, - "w": 41, - "h": 67 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 41, - "h": 67 - }, - "frame": { - "x": 169, - "y": 134, - "w": 41, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a418188ec41514bd9ae14eb24912795a:ee144292ee551fc92c6c10944cfe21d9:17a705bb924916761be2495822a53735$" - } -} diff --git a/public/images/pokemon/exp/shiny/719.png b/public/images/pokemon/exp/shiny/719.png deleted file mode 100644 index a733b44e4b3..00000000000 Binary files a/public/images/pokemon/exp/shiny/719.png and /dev/null 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/815-gigantamax.json b/public/images/pokemon/exp/shiny/815-gigantamax.json new file mode 100644 index 00000000000..d8fb9d62e57 --- /dev/null +++ b/public/images/pokemon/exp/shiny/815-gigantamax.json @@ -0,0 +1,659 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 343, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 357, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 177, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 179, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 85, "y": 292, "w": 82, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 82, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 252, "y": 482, "w": 81, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 81, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 258, "y": 290, "w": 83, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 83, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 416, "y": 484, "w": 79, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 79, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 426, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 445, "y": 1, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 179, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 1, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 523, "y": 195, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 509, "y": 292, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 89, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 531, "y": 98, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 258, "y": 385, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 267, "y": 97, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 1, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 268, "y": 1, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 87, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 426, "y": 389, "w": 82, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 82, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 484, "w": 81, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 81, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 341, "y": 389, "w": 83, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 7, "w": 83, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 84, "y": 485, "w": 79, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 9, "w": 79, "h": 91 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 167, "y": 484, "w": 81, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 81, "h": 92 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 195, "w": 86, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 86, "h": 93 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 265, "y": 194, "w": 86, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 86, "h": 94 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 89, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 1, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 1, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 353, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 510, "y": 389, "w": 80, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 80, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 169, "y": 387, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 355, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 443, "y": 98, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 86, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 90, "y": 1, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 87, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 174, "y": 290, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 82, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 84, "y": 388, "w": 81, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 81, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 438, "y": 195, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 335, "y": 483, "w": 79, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 79, "h": 95 }, + "sourceSize": { "w": 100, "h": 100 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "815-gigantamax.png", + "format": "I8", + "size": { "w": 611, "h": 579 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/shiny/815-gigantamax.png b/public/images/pokemon/exp/shiny/815-gigantamax.png new file mode 100644 index 00000000000..a299119e06f Binary files /dev/null and b/public/images/pokemon/exp/shiny/815-gigantamax.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/839-gigantamax.json b/public/images/pokemon/exp/shiny/839-gigantamax.json new file mode 100644 index 00000000000..15a7c122f5d --- /dev/null +++ b/public/images/pokemon/exp/shiny/839-gigantamax.json @@ -0,0 +1,821 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 441, "y": 566, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 609, "y": 567, "w": 83, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 83, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 255, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 171, "y": 563, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 569, "w": 83, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 83, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 339, "y": 569, "w": 82, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 82, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 464, "y": 375, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 580, "y": 190, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 95, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 198, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 491, "y": 0, "w": 96, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 297, "y": 0, "w": 98, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 98, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 100, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 100, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 198, "y": 0, "w": 99, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 99, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 100, "y": 0, "w": 98, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 98, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 395, "y": 0, "w": 96, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 96, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 189, "y": 190, "w": 92, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 92, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 89, "y": 379, "w": 88, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 88, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 525, "y": 567, "w": 84, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 84, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 454, "y": 470, "w": 86, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 86, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 379, "w": 89, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 1, "w": 89, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 573, "y": 285, "w": 91, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 91, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 93, "y": 191, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 390, "y": 96, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 585, "y": 96, "w": 94, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 94, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 293, "y": 95, "w": 97, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 97, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 484, "y": 190, "w": 96, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 96, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 92, "y": 286, "w": 92, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 92, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 177, "y": 471, "w": 89, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 89, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 177, "y": 379, "w": 91, "h": 92 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 91, "h": 92 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 184, "y": 286, "w": 91, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 91, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 480, "y": 282, "w": 93, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 93, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 281, "y": 281, "w": 93, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 93, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 293, "y": 188, "w": 95, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 587, "y": 0, "w": 95, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 95, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 95, "w": 95, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 95, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 491, "y": 95, "w": 94, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 94, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 0, "y": 190, "w": 93, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 93, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 388, "y": 191, "w": 92, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 92, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 285, "w": 92, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 92, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 275, "y": 374, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 374, "y": 286, "w": 90, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 90, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 365, "y": 380, "w": 89, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 89, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 553, "y": 380, "w": 89, "h": 93 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 89, "h": 93 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 540, "y": 473, "w": 87, "h": 94 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 87, "h": 94 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 268, "y": 468, "w": 87, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 87, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 355, "y": 474, "w": 86, "h": 95 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 86, "h": 95 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 86, "y": 475, "w": 85, "h": 96 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 85, "h": 96 }, + "sourceSize": { "w": 111, "h": 96 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "839-gigantamax.png", + "format": "I8", + "size": { "w": 692, "h": 664 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/shiny/839-gigantamax.png b/public/images/pokemon/exp/shiny/839-gigantamax.png new file mode 100644 index 00000000000..f52de9357b1 Binary files /dev/null and b/public/images/pokemon/exp/shiny/839-gigantamax.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/944.png b/public/images/pokemon/exp/shiny/944.png index fdb0f2ecb68..ee13a988a2b 100644 Binary files a/public/images/pokemon/exp/shiny/944.png and b/public/images/pokemon/exp/shiny/944.png differ diff --git a/public/images/pokemon/exp/shiny/945.png b/public/images/pokemon/exp/shiny/945.png index 9b938dfcfdd..3dba64c6ee8 100644 Binary files a/public/images/pokemon/exp/shiny/945.png and b/public/images/pokemon/exp/shiny/945.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/exp/back/707.json b/public/images/pokemon/exp/shiny/female/6215.json similarity index 62% rename from public/images/pokemon/exp/back/707.json rename to public/images/pokemon/exp/shiny/female/6215.json index b8db4ac17f3..8c8b4e0cf73 100644 --- a/public/images/pokemon/exp/back/707.json +++ b/public/images/pokemon/exp/shiny/female/6215.json @@ -1,2007 +1,33 @@ { "textures": [ { - "image": "707.png", + "image": "6215.png", "format": "RGBA8888", "size": { - "w": 286, - "h": 286 + "w": 230, + "h": 230 }, "scale": 1, "frames": [ - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 72, - "w": 38, - "h": 72 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 0, - "y": 144, - "w": 38, - "h": 72 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 0, - "y": 216, - "w": 42, - "h": 70 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 38, - "h": 72 - }, - "frame": { - "x": 38, - "y": 0, - "w": 38, - "h": 72 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 37, - "h": 72 - }, - "frame": { - "x": 38, - "y": 72, - "w": 37, - "h": 72 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 71 - }, - "frame": { - "x": 38, - "y": 144, - "w": 39, - "h": 71 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 42, - "y": 215, - "w": 38, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 75, - "y": 72, - "w": 38, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 38, - "h": 71 - }, - "frame": { - "x": 77, - "y": 143, - "w": 38, - "h": 71 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 80, - "y": 214, - "w": 38, - "h": 71 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 76, - "y": 0, - "w": 38, - "h": 71 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 71 - }, - "frame": { - "x": 113, - "y": 71, - "w": 38, - "h": 71 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 114, - "y": 0, - "w": 42, - "h": 70 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 42, - "h": 70 - }, - "frame": { - "x": 115, - "y": 142, - "w": 42, - "h": 70 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 41, - "h": 70 - }, - "frame": { - "x": 151, - "y": 70, - "w": 41, - "h": 70 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 70 - }, - "frame": { - "x": 156, - "y": 0, - "w": 40, - "h": 70 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 38, - "h": 70 - }, - "frame": { - "x": 118, - "y": 212, - "w": 38, - "h": 70 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 156, - "y": 212, - "w": 44, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 43, - "h": 69 - }, - "frame": { - "x": 157, - "y": 140, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 192, - "y": 70, - "w": 43, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 196, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 239, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 69 - }, - "frame": { - "x": 239, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 235, - "y": 69, - "w": 43, - "h": 69 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 69 - }, - "frame": { - "x": 235, - "y": 69, - "w": 43, - "h": 69 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 42, - "h": 69 - }, - "frame": { - "x": 235, - "y": 138, - "w": 42, - "h": 69 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 42, - "h": 69 - }, - "frame": { - "x": 235, - "y": 138, - "w": 42, - "h": 69 - } - }, { "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 48, - "h": 74 + "w": 56, + "h": 54 }, "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 + "x": 1, + "y": 1, + "w": 55, + "h": 50 }, "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, + "x": 0, "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 41, - "h": 69 - }, - "frame": { - "x": 200, - "y": 207, - "w": 41, - "h": 69 + "w": 55, + "h": 50 } }, { @@ -2009,20 +35,1175 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 48, - "h": 74 + "w": 56, + "h": 54 }, "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 + "x": 1, + "y": 1, + "w": 55, + "h": 50 }, "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 50, + "w": 55, + "h": 50 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 50, + "w": 55, + "h": 50 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 } }, { @@ -2030,20 +1211,125 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 48, - "h": 74 + "w": 56, + "h": 54 }, "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 + "x": 2, + "y": 2, + "w": 54, + "h": 49 }, "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 } }, { @@ -2051,20 +1337,734 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 48, - "h": 74 + "w": 56, + "h": 54 }, "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 40, - "h": 69 + "x": 2, + "y": 2, + "w": 54, + "h": 49 }, "frame": { - "x": 241, - "y": 207, - "w": 40, - "h": 69 + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 150, + "w": 53, + "h": 50 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 150, + "w": 53, + "h": 50 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 55, + "y": 51, + "w": 53, + "h": 50 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 55, + "y": 51, + "w": 53, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 108, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 108, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 155, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 155, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 47, + "h": 44 + }, + "frame": { + "x": 108, + "y": 96, + "w": 47, + "h": 44 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 47, + "h": 44 + }, + "frame": { + "x": 108, + "y": 96, + "w": 47, + "h": 44 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 46 + }, + "frame": { + "x": 155, + "y": 96, + "w": 45, + "h": 46 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 46 + }, + "frame": { + "x": 155, + "y": 96, + "w": 45, + "h": 46 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 45, + "h": 44 + }, + "frame": { + "x": 107, + "y": 140, + "w": 45, + "h": 44 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 45, + "h": 44 + }, + "frame": { + "x": 107, + "y": 140, + "w": 45, + "h": 44 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 39, + "h": 46 + }, + "frame": { + "x": 103, + "y": 184, + "w": 39, + "h": 46 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 39, + "h": 46 + }, + "frame": { + "x": 103, + "y": 184, + "w": 39, + "h": 46 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 38, + "h": 46 + }, + "frame": { + "x": 142, + "y": 184, + "w": 38, + "h": 46 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 38, + "h": 46 + }, + "frame": { + "x": 142, + "y": 184, + "w": 38, + "h": 46 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 41, + "h": 44 + }, + "frame": { + "x": 180, + "y": 142, + "w": 41, + "h": 44 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 41, + "h": 44 + }, + "frame": { + "x": 180, + "y": 142, + "w": 41, + "h": 44 } } ] @@ -2073,6 +2073,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:923b4bcae7da04f16b46037df8433fd0:1631bc30b61a1b4a910dd4510c8733ca:8e96b9056ea81e44ced99c97f472a528$" + "smartupdate": "$TexturePacker:SmartUpdate:edaed3da1123a782356b1ac83d1afd7c:cb0e0681f4dbf68283437f5581a20bb3:736cd88647e79ba7896fc74f9406c2fe$" } } diff --git a/public/images/pokemon/exp/shiny/female/6215.png b/public/images/pokemon/exp/shiny/female/6215.png new file mode 100644 index 00000000000..4e7ea06c60a Binary files /dev/null and b/public/images/pokemon/exp/shiny/female/6215.png differ diff --git a/public/images/pokemon/exp/shiny/female/668.json b/public/images/pokemon/exp/shiny/female/668.json new file mode 100644 index 00000000000..443f13c0b54 --- /dev/null +++ b/public/images/pokemon/exp/shiny/female/668.json @@ -0,0 +1,820 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 147, "w": 64, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 64, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 127, "y": 152, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 64, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 465, "y": 146, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 65, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 399, "y": 146, "w": 66, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 66, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 334, "y": 74, "w": 66, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 66, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 191, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 126, "y": 223, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 462, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 188, "y": 291, "w": 61, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 61, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 249, "y": 291, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 60, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 62, "y": 292, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 122, "y": 295, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 182, "y": 363, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 60, "y": 364, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 362, "w": 60, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 60, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 327, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 268, "y": 74, "w": 66, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 376, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 227, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 76, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 152, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 302, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 449, "y": 0, "w": 72, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 72, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 449, "y": 73, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 71, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 69, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 201, "y": 74, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 67, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 334, "y": 145, "w": 65, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 65, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 530, "h": 436 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/shiny/female/668.png b/public/images/pokemon/exp/shiny/female/668.png new file mode 100644 index 00000000000..ad84dc50460 Binary files /dev/null and b/public/images/pokemon/exp/shiny/female/668.png differ diff --git a/public/images/pokemon/female/154.png b/public/images/pokemon/female/154.png index 4921f1556aa..f671d6b75aa 100644 Binary files a/public/images/pokemon/female/154.png and b/public/images/pokemon/female/154.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/194.png b/public/images/pokemon/female/194.png index 39c18727c2d..c0066f051ee 100644 Binary files a/public/images/pokemon/female/194.png and b/public/images/pokemon/female/194.png differ diff --git a/public/images/pokemon/female/198.png b/public/images/pokemon/female/198.png index 29bf2a296a5..9cead4fcbe0 100644 Binary files a/public/images/pokemon/female/198.png and b/public/images/pokemon/female/198.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-beauty-cosplay.png b/public/images/pokemon/female/25-beauty-cosplay.png index 018d0011254..26887468559 100644 Binary files a/public/images/pokemon/female/25-beauty-cosplay.png and b/public/images/pokemon/female/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/female/25-cool-cosplay.png b/public/images/pokemon/female/25-cool-cosplay.png index 5936a9042ed..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/25-cosplay.png b/public/images/pokemon/female/25-cosplay.png index 1f8f381419b..145d32e5130 100644 Binary files a/public/images/pokemon/female/25-cosplay.png and b/public/images/pokemon/female/25-cosplay.png differ diff --git a/public/images/pokemon/female/25-cute-cosplay.png b/public/images/pokemon/female/25-cute-cosplay.png index f559198f7ac..675a141b0fd 100644 Binary files a/public/images/pokemon/female/25-cute-cosplay.png and b/public/images/pokemon/female/25-cute-cosplay.png differ diff --git a/public/images/pokemon/female/25-partner.png b/public/images/pokemon/female/25-partner.png index e500db2a3be..8ce8d01c937 100644 Binary files a/public/images/pokemon/female/25-partner.png and b/public/images/pokemon/female/25-partner.png differ diff --git a/public/images/pokemon/female/25-smart-cosplay.png b/public/images/pokemon/female/25-smart-cosplay.png index b5c979e78ec..8306fb17dea 100644 Binary files a/public/images/pokemon/female/25-smart-cosplay.png and b/public/images/pokemon/female/25-smart-cosplay.png differ diff --git a/public/images/pokemon/female/25-tough-cosplay.png b/public/images/pokemon/female/25-tough-cosplay.png index 2896e27c8a9..a12d4a40a88 100644 Binary files a/public/images/pokemon/female/25-tough-cosplay.png and b/public/images/pokemon/female/25-tough-cosplay.png differ diff --git a/public/images/pokemon/female/25.png b/public/images/pokemon/female/25.png index e500db2a3be..8ce8d01c937 100644 Binary files a/public/images/pokemon/female/25.png and b/public/images/pokemon/female/25.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/26.png b/public/images/pokemon/female/26.png index 3f8c46ac761..242785a81cc 100644 Binary files a/public/images/pokemon/female/26.png and b/public/images/pokemon/female/26.png differ diff --git a/public/images/pokemon/female/3.png b/public/images/pokemon/female/3.png index 646157beb32..e21b53dfd57 100644 Binary files a/public/images/pokemon/female/3.png and b/public/images/pokemon/female/3.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/icons/1/25-beauty-cosplay.png b/public/images/pokemon/icons/1/25-beauty-cosplay.png index 19fd467ebd7..f9b6f3dcc82 100644 Binary files a/public/images/pokemon/icons/1/25-beauty-cosplay.png and b/public/images/pokemon/icons/1/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-cool-cosplay.png b/public/images/pokemon/icons/1/25-cool-cosplay.png index 7d1b0954524..6436dff6dbb 100644 Binary files a/public/images/pokemon/icons/1/25-cool-cosplay.png and b/public/images/pokemon/icons/1/25-cool-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-cosplay.png b/public/images/pokemon/icons/1/25-cosplay.png index 74f0b993ce4..580805ef797 100644 Binary files a/public/images/pokemon/icons/1/25-cosplay.png and b/public/images/pokemon/icons/1/25-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-cute-cosplay.png b/public/images/pokemon/icons/1/25-cute-cosplay.png index 76488be18fe..71822acab8b 100644 Binary files a/public/images/pokemon/icons/1/25-cute-cosplay.png and b/public/images/pokemon/icons/1/25-cute-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-gigantamax.png b/public/images/pokemon/icons/1/25-gigantamax.png index ee10d68fd92..8650a88a62e 100644 Binary files a/public/images/pokemon/icons/1/25-gigantamax.png and b/public/images/pokemon/icons/1/25-gigantamax.png differ diff --git a/public/images/pokemon/icons/1/25-smart-cosplay.png b/public/images/pokemon/icons/1/25-smart-cosplay.png index 7eb69c5a17e..90aba5ddbf0 100644 Binary files a/public/images/pokemon/icons/1/25-smart-cosplay.png and b/public/images/pokemon/icons/1/25-smart-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-tough-cosplay.png b/public/images/pokemon/icons/1/25-tough-cosplay.png index 45c95ada80e..18101b5b497 100644 Binary files a/public/images/pokemon/icons/1/25-tough-cosplay.png and b/public/images/pokemon/icons/1/25-tough-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-beauty-cosplay.png b/public/images/pokemon/icons/1/25s-beauty-cosplay.png index 19fd467ebd7..3b524dfcb06 100644 Binary files a/public/images/pokemon/icons/1/25s-beauty-cosplay.png and b/public/images/pokemon/icons/1/25s-beauty-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-cool-cosplay.png b/public/images/pokemon/icons/1/25s-cool-cosplay.png index 7d1b0954524..0a3fc2d11ac 100644 Binary files a/public/images/pokemon/icons/1/25s-cool-cosplay.png and b/public/images/pokemon/icons/1/25s-cool-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-cosplay.png b/public/images/pokemon/icons/1/25s-cosplay.png index 74f0b993ce4..218977fd454 100644 Binary files a/public/images/pokemon/icons/1/25s-cosplay.png and b/public/images/pokemon/icons/1/25s-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-cute-cosplay.png b/public/images/pokemon/icons/1/25s-cute-cosplay.png index 76488be18fe..07df252aeb9 100644 Binary files a/public/images/pokemon/icons/1/25s-cute-cosplay.png and b/public/images/pokemon/icons/1/25s-cute-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-smart-cosplay.png b/public/images/pokemon/icons/1/25s-smart-cosplay.png index 7eb69c5a17e..5742bb2718a 100644 Binary files a/public/images/pokemon/icons/1/25s-smart-cosplay.png and b/public/images/pokemon/icons/1/25s-smart-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-tough-cosplay.png b/public/images/pokemon/icons/1/25s-tough-cosplay.png index 45c95ada80e..7e49d494573 100644 Binary files a/public/images/pokemon/icons/1/25s-tough-cosplay.png and b/public/images/pokemon/icons/1/25s-tough-cosplay.png differ diff --git a/public/images/pokemon/icons/2/154-f.png b/public/images/pokemon/icons/2/154-f.png new file mode 100644 index 00000000000..6481cdd8a00 Binary files /dev/null and b/public/images/pokemon/icons/2/154-f.png differ diff --git a/public/images/pokemon/icons/2/154s-f.png b/public/images/pokemon/icons/2/154s-f.png new file mode 100644 index 00000000000..44ded711dcd Binary files /dev/null and b/public/images/pokemon/icons/2/154s-f.png differ diff --git a/public/images/pokemon/icons/2/172s.png b/public/images/pokemon/icons/2/172s.png index 27a11014758..a1def7089ba 100644 Binary files a/public/images/pokemon/icons/2/172s.png and b/public/images/pokemon/icons/2/172s.png differ diff --git a/public/images/pokemon/icons/2/198-f.png b/public/images/pokemon/icons/2/198-f.png new file mode 100644 index 00000000000..bfc3e9bea4c Binary files /dev/null and b/public/images/pokemon/icons/2/198-f.png differ diff --git a/public/images/pokemon/icons/2/198s-f.png b/public/images/pokemon/icons/2/198s-f.png new file mode 100644 index 00000000000..ccc258cafac Binary files /dev/null and b/public/images/pokemon/icons/2/198s-f.png differ diff --git a/public/images/pokemon/icons/3/255-f.png b/public/images/pokemon/icons/3/255-f.png new file mode 100644 index 00000000000..bb221be21e7 Binary files /dev/null and b/public/images/pokemon/icons/3/255-f.png differ diff --git a/public/images/pokemon/icons/3/255s-f.png b/public/images/pokemon/icons/3/255s-f.png new file mode 100644 index 00000000000..898b17c163c Binary files /dev/null and b/public/images/pokemon/icons/3/255s-f.png differ diff --git a/public/images/pokemon/icons/3/256-f.png b/public/images/pokemon/icons/3/256-f.png new file mode 100644 index 00000000000..72800cc5e25 Binary files /dev/null and b/public/images/pokemon/icons/3/256-f.png differ diff --git a/public/images/pokemon/icons/3/256s-f.png b/public/images/pokemon/icons/3/256s-f.png new file mode 100644 index 00000000000..ce6608f7bc5 Binary files /dev/null and b/public/images/pokemon/icons/3/256s-f.png differ diff --git a/public/images/pokemon/icons/3/257-f-mega.png b/public/images/pokemon/icons/3/257-f-mega.png new file mode 100644 index 00000000000..ed64fe8f41f Binary files /dev/null and b/public/images/pokemon/icons/3/257-f-mega.png differ diff --git a/public/images/pokemon/icons/3/257-f.png b/public/images/pokemon/icons/3/257-f.png new file mode 100644 index 00000000000..ee42a9f75c0 Binary files /dev/null and b/public/images/pokemon/icons/3/257-f.png differ diff --git a/public/images/pokemon/icons/3/257s-f-mega.png b/public/images/pokemon/icons/3/257s-f-mega.png new file mode 100644 index 00000000000..faf5e5aa30c Binary files /dev/null and b/public/images/pokemon/icons/3/257s-f-mega.png differ diff --git a/public/images/pokemon/icons/3/257s-f.png b/public/images/pokemon/icons/3/257s-f.png new file mode 100644 index 00000000000..bf59393972f Binary files /dev/null and b/public/images/pokemon/icons/3/257s-f.png differ diff --git a/public/images/pokemon/icons/3/350s.png b/public/images/pokemon/icons/3/350s.png index eaed5c4bd11..4f5de9f5d57 100644 Binary files a/public/images/pokemon/icons/3/350s.png and b/public/images/pokemon/icons/3/350s.png differ diff --git a/public/images/pokemon/icons/3/378s.png b/public/images/pokemon/icons/3/378s.png index e2fc99bbc87..b52709493e7 100644 Binary files a/public/images/pokemon/icons/3/378s.png and b/public/images/pokemon/icons/3/378s.png differ diff --git a/public/images/pokemon/icons/7/2026.png b/public/images/pokemon/icons/7/2026.png index 5bc49abc790..cd8db24dd8b 100644 Binary files a/public/images/pokemon/icons/7/2026.png and b/public/images/pokemon/icons/7/2026.png differ diff --git a/public/images/pokemon/icons/7/2026s.png b/public/images/pokemon/icons/7/2026s.png index ecc11b878ab..94ce33a124f 100644 Binary files a/public/images/pokemon/icons/7/2026s.png and b/public/images/pokemon/icons/7/2026s.png differ diff --git a/public/images/pokemon/icons/7/802-zenith.png b/public/images/pokemon/icons/7/802-zenith.png new file mode 100644 index 00000000000..7e0fee2d609 Binary files /dev/null and b/public/images/pokemon/icons/7/802-zenith.png differ diff --git a/public/images/pokemon/icons/7/802s-zenith.png b/public/images/pokemon/icons/7/802s-zenith.png new file mode 100644 index 00000000000..7e0fee2d609 Binary files /dev/null and b/public/images/pokemon/icons/7/802s-zenith.png differ diff --git a/public/images/pokemon/icons/9/1012-artisan.png b/public/images/pokemon/icons/9/1012-artisan.png index 96a215e47de..0eed79df1f2 100644 Binary files a/public/images/pokemon/icons/9/1012-artisan.png and b/public/images/pokemon/icons/9/1012-artisan.png differ diff --git a/public/images/pokemon/icons/9/1012-counterfeit.png b/public/images/pokemon/icons/9/1012-counterfeit.png index ff79d615db7..0eed79df1f2 100644 Binary files a/public/images/pokemon/icons/9/1012-counterfeit.png and b/public/images/pokemon/icons/9/1012-counterfeit.png differ diff --git a/public/images/pokemon/icons/9/1013-unremarkable.png b/public/images/pokemon/icons/9/1013-unremarkable.png index 3aa144b6d5c..9f4ec0cce34 100644 Binary files a/public/images/pokemon/icons/9/1013-unremarkable.png and b/public/images/pokemon/icons/9/1013-unremarkable.png differ diff --git a/public/images/pokemon/icons/variant/1/102_2.png b/public/images/pokemon/icons/variant/1/102_2.png new file mode 100644 index 00000000000..9d96f087919 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/102_2.png differ diff --git a/public/images/pokemon/icons/variant/1/102_3.png b/public/images/pokemon/icons/variant/1/102_3.png new file mode 100644 index 00000000000..65272284ea8 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/102_3.png differ diff --git a/public/images/pokemon/icons/variant/1/103_2.png b/public/images/pokemon/icons/variant/1/103_2.png new file mode 100644 index 00000000000..046d2b1bb6a Binary files /dev/null and b/public/images/pokemon/icons/variant/1/103_2.png differ diff --git a/public/images/pokemon/icons/variant/1/103_3.png b/public/images/pokemon/icons/variant/1/103_3.png new file mode 100644 index 00000000000..b68fdd50318 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/103_3.png differ diff --git a/public/images/pokemon/icons/variant/1/128_2.png b/public/images/pokemon/icons/variant/1/128_2.png new file mode 100644 index 00000000000..0a44d5bbfad Binary files /dev/null and b/public/images/pokemon/icons/variant/1/128_2.png differ diff --git a/public/images/pokemon/icons/variant/1/128_3.png b/public/images/pokemon/icons/variant/1/128_3.png new file mode 100644 index 00000000000..8f6b25c2c18 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/128_3.png differ diff --git a/public/images/pokemon/icons/variant/1/133-partner_2.png b/public/images/pokemon/icons/variant/1/133-partner_2.png new file mode 100644 index 00000000000..3e082ae0bd4 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/133-partner_2.png differ diff --git a/public/images/pokemon/icons/variant/1/133-partner_3.png b/public/images/pokemon/icons/variant/1/133-partner_3.png new file mode 100644 index 00000000000..57c969d855c Binary files /dev/null and b/public/images/pokemon/icons/variant/1/133-partner_3.png differ diff --git a/public/images/pokemon/icons/variant/1/133_2.png b/public/images/pokemon/icons/variant/1/133_2.png index 7ab496699f7..b17979df07a 100644 Binary files a/public/images/pokemon/icons/variant/1/133_2.png and b/public/images/pokemon/icons/variant/1/133_2.png differ diff --git a/public/images/pokemon/icons/variant/1/133_3.png b/public/images/pokemon/icons/variant/1/133_3.png index f999dd0fff7..fa4d99879ae 100644 Binary files a/public/images/pokemon/icons/variant/1/133_3.png and b/public/images/pokemon/icons/variant/1/133_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-beauty-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-beauty-cosplay_2.png new file mode 100644 index 00000000000..19c61af5069 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-beauty-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-beauty-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-beauty-cosplay_3.png new file mode 100644 index 00000000000..1da79229795 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-beauty-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cool-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-cool-cosplay_2.png new file mode 100644 index 00000000000..8dc1e27acab Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cool-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cool-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-cool-cosplay_3.png new file mode 100644 index 00000000000..7a603219649 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cool-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-cosplay_2.png new file mode 100644 index 00000000000..c47e9ef7d18 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-cosplay_3.png new file mode 100644 index 00000000000..16332db9041 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cute-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-cute-cosplay_2.png new file mode 100644 index 00000000000..3f606da7bb0 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cute-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cute-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-cute-cosplay_3.png new file mode 100644 index 00000000000..8560b6f04b5 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cute-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-gigantamax_2.png b/public/images/pokemon/icons/variant/1/25-gigantamax_2.png new file mode 100644 index 00000000000..6bc267b55fa Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-gigantamax_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-gigantamax_3.png b/public/images/pokemon/icons/variant/1/25-gigantamax_3.png new file mode 100644 index 00000000000..8c4ff760bcd Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-gigantamax_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-partner_2.png b/public/images/pokemon/icons/variant/1/25-partner_2.png new file mode 100644 index 00000000000..eaa2cfb610f Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-partner_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-partner_3.png b/public/images/pokemon/icons/variant/1/25-partner_3.png new file mode 100644 index 00000000000..1faf330ef51 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-partner_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-smart-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-smart-cosplay_2.png new file mode 100644 index 00000000000..4ecae1f73a2 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-smart-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-smart-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-smart-cosplay_3.png new file mode 100644 index 00000000000..ea41daf34e6 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-smart-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-tough-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-tough-cosplay_2.png new file mode 100644 index 00000000000..3f7072c4138 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-tough-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-tough-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-tough-cosplay_3.png new file mode 100644 index 00000000000..e671ff98639 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-tough-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25_2.png b/public/images/pokemon/icons/variant/1/25_2.png new file mode 100644 index 00000000000..5e987ffe777 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25_3.png b/public/images/pokemon/icons/variant/1/25_3.png new file mode 100644 index 00000000000..b04af012bec Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25_3.png differ diff --git a/public/images/pokemon/icons/variant/1/26_2.png b/public/images/pokemon/icons/variant/1/26_2.png new file mode 100644 index 00000000000..f21ebe42b16 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/26_2.png differ diff --git a/public/images/pokemon/icons/variant/1/26_3.png b/public/images/pokemon/icons/variant/1/26_3.png new file mode 100644 index 00000000000..adbe9c212b3 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/26_3.png differ diff --git a/public/images/pokemon/icons/variant/1/39_2.png b/public/images/pokemon/icons/variant/1/39_2.png new file mode 100644 index 00000000000..f4b85b201cf Binary files /dev/null and b/public/images/pokemon/icons/variant/1/39_2.png differ diff --git a/public/images/pokemon/icons/variant/1/39_3.png b/public/images/pokemon/icons/variant/1/39_3.png new file mode 100644 index 00000000000..137f3dc083c Binary files /dev/null and b/public/images/pokemon/icons/variant/1/39_3.png differ diff --git a/public/images/pokemon/icons/variant/1/40_2.png b/public/images/pokemon/icons/variant/1/40_2.png new file mode 100644 index 00000000000..09ffdcd5757 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/40_2.png differ diff --git a/public/images/pokemon/icons/variant/1/40_3.png b/public/images/pokemon/icons/variant/1/40_3.png new file mode 100644 index 00000000000..09333136c19 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/40_3.png differ diff --git a/public/images/pokemon/icons/variant/1/42_1.png b/public/images/pokemon/icons/variant/1/42_1.png index 17c82d9dd9e..91d7fae345d 100644 Binary files a/public/images/pokemon/icons/variant/1/42_1.png and b/public/images/pokemon/icons/variant/1/42_1.png differ diff --git a/public/images/pokemon/icons/variant/1/42_2.png b/public/images/pokemon/icons/variant/1/42_2.png index 91d7fae345d..17c82d9dd9e 100644 Binary files a/public/images/pokemon/icons/variant/1/42_2.png and b/public/images/pokemon/icons/variant/1/42_2.png differ diff --git a/public/images/pokemon/icons/variant/2/152_2.png b/public/images/pokemon/icons/variant/2/152_2.png new file mode 100644 index 00000000000..3815a4dbf49 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/152_2.png differ diff --git a/public/images/pokemon/icons/variant/2/152_3.png b/public/images/pokemon/icons/variant/2/152_3.png new file mode 100644 index 00000000000..be0fffab10c Binary files /dev/null and b/public/images/pokemon/icons/variant/2/152_3.png differ diff --git a/public/images/pokemon/icons/variant/2/153_2.png b/public/images/pokemon/icons/variant/2/153_2.png new file mode 100644 index 00000000000..020fc80d8b9 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/153_2.png differ diff --git a/public/images/pokemon/icons/variant/2/153_3.png b/public/images/pokemon/icons/variant/2/153_3.png new file mode 100644 index 00000000000..681acfa2db1 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/153_3.png differ diff --git a/public/images/pokemon/icons/variant/2/154-f_2.png b/public/images/pokemon/icons/variant/2/154-f_2.png new file mode 100644 index 00000000000..5ba8c458cf5 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/154-f_2.png differ diff --git a/public/images/pokemon/icons/variant/2/154-f_3.png b/public/images/pokemon/icons/variant/2/154-f_3.png new file mode 100644 index 00000000000..c278d045c38 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/154-f_3.png differ diff --git a/public/images/pokemon/icons/variant/2/154_2.png b/public/images/pokemon/icons/variant/2/154_2.png new file mode 100644 index 00000000000..323e2331a77 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/154_2.png differ diff --git a/public/images/pokemon/icons/variant/2/154_3.png b/public/images/pokemon/icons/variant/2/154_3.png new file mode 100644 index 00000000000..aef1e4d633e Binary files /dev/null and b/public/images/pokemon/icons/variant/2/154_3.png differ diff --git a/public/images/pokemon/icons/variant/2/158_2.png b/public/images/pokemon/icons/variant/2/158_2.png new file mode 100644 index 00000000000..c6b75ed6c20 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/158_2.png differ diff --git a/public/images/pokemon/icons/variant/2/158_3.png b/public/images/pokemon/icons/variant/2/158_3.png new file mode 100644 index 00000000000..073e3faa2e2 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/158_3.png differ diff --git a/public/images/pokemon/icons/variant/2/159_2.png b/public/images/pokemon/icons/variant/2/159_2.png new file mode 100644 index 00000000000..95d74728073 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/159_2.png differ diff --git a/public/images/pokemon/icons/variant/2/159_3.png b/public/images/pokemon/icons/variant/2/159_3.png new file mode 100644 index 00000000000..a73818d0c3a Binary files /dev/null and b/public/images/pokemon/icons/variant/2/159_3.png differ diff --git a/public/images/pokemon/icons/variant/2/160_2.png b/public/images/pokemon/icons/variant/2/160_2.png new file mode 100644 index 00000000000..7b7ba6e7231 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/160_2.png differ diff --git a/public/images/pokemon/icons/variant/2/160_3.png b/public/images/pokemon/icons/variant/2/160_3.png new file mode 100644 index 00000000000..62a4ab22fd2 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/160_3.png differ diff --git a/public/images/pokemon/icons/variant/2/167_2.png b/public/images/pokemon/icons/variant/2/167_2.png new file mode 100644 index 00000000000..a6bd15c0eef Binary files /dev/null and b/public/images/pokemon/icons/variant/2/167_2.png differ diff --git a/public/images/pokemon/icons/variant/2/167_3.png b/public/images/pokemon/icons/variant/2/167_3.png new file mode 100644 index 00000000000..88d84eec2a9 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/167_3.png differ diff --git a/public/images/pokemon/icons/variant/2/168_2.png b/public/images/pokemon/icons/variant/2/168_2.png new file mode 100644 index 00000000000..cf34c26be21 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/168_2.png differ diff --git a/public/images/pokemon/icons/variant/2/168_3.png b/public/images/pokemon/icons/variant/2/168_3.png new file mode 100644 index 00000000000..7a62c58d299 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/168_3.png differ diff --git a/public/images/pokemon/icons/variant/2/170_2.png b/public/images/pokemon/icons/variant/2/170_2.png new file mode 100644 index 00000000000..1ecdfda6eb8 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/170_2.png differ diff --git a/public/images/pokemon/icons/variant/2/170_3.png b/public/images/pokemon/icons/variant/2/170_3.png new file mode 100644 index 00000000000..01cb78568ed Binary files /dev/null and b/public/images/pokemon/icons/variant/2/170_3.png differ diff --git a/public/images/pokemon/icons/variant/2/171_2.png b/public/images/pokemon/icons/variant/2/171_2.png new file mode 100644 index 00000000000..3ff5792e2d2 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/171_2.png differ diff --git a/public/images/pokemon/icons/variant/2/171_3.png b/public/images/pokemon/icons/variant/2/171_3.png new file mode 100644 index 00000000000..11a3996da80 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/171_3.png differ diff --git a/public/images/pokemon/icons/variant/2/172-spiky_2.png b/public/images/pokemon/icons/variant/2/172-spiky_2.png new file mode 100644 index 00000000000..b293ee3283a Binary files /dev/null and b/public/images/pokemon/icons/variant/2/172-spiky_2.png differ diff --git a/public/images/pokemon/icons/variant/2/172-spiky_3.png b/public/images/pokemon/icons/variant/2/172-spiky_3.png new file mode 100644 index 00000000000..ff9a4229421 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/172-spiky_3.png differ diff --git a/public/images/pokemon/icons/variant/2/172_2.png b/public/images/pokemon/icons/variant/2/172_2.png new file mode 100644 index 00000000000..4fa282f9297 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/172_2.png differ diff --git a/public/images/pokemon/icons/variant/2/172_3.png b/public/images/pokemon/icons/variant/2/172_3.png new file mode 100644 index 00000000000..95f0c9bdc6d Binary files /dev/null and b/public/images/pokemon/icons/variant/2/172_3.png differ diff --git a/public/images/pokemon/icons/variant/2/174_2.png b/public/images/pokemon/icons/variant/2/174_2.png new file mode 100644 index 00000000000..e7ffddb1f57 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/174_2.png differ diff --git a/public/images/pokemon/icons/variant/2/174_3.png b/public/images/pokemon/icons/variant/2/174_3.png new file mode 100644 index 00000000000..58d98aab99a Binary files /dev/null and b/public/images/pokemon/icons/variant/2/174_3.png differ diff --git a/public/images/pokemon/icons/variant/2/194_2.png b/public/images/pokemon/icons/variant/2/194_2.png new file mode 100644 index 00000000000..043c11ce065 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/194_2.png differ diff --git a/public/images/pokemon/icons/variant/2/194_3.png b/public/images/pokemon/icons/variant/2/194_3.png new file mode 100644 index 00000000000..f5d792b141f Binary files /dev/null and b/public/images/pokemon/icons/variant/2/194_3.png differ diff --git a/public/images/pokemon/icons/variant/2/195_2.png b/public/images/pokemon/icons/variant/2/195_2.png new file mode 100644 index 00000000000..7fd5ba2792f Binary files /dev/null and b/public/images/pokemon/icons/variant/2/195_2.png differ diff --git a/public/images/pokemon/icons/variant/2/195_3.png b/public/images/pokemon/icons/variant/2/195_3.png new file mode 100644 index 00000000000..99da4dfe12e Binary files /dev/null and b/public/images/pokemon/icons/variant/2/195_3.png differ diff --git a/public/images/pokemon/icons/variant/2/198-f_2.png b/public/images/pokemon/icons/variant/2/198-f_2.png new file mode 100644 index 00000000000..35e5c2e75ea Binary files /dev/null and b/public/images/pokemon/icons/variant/2/198-f_2.png differ diff --git a/public/images/pokemon/icons/variant/2/198-f_3.png b/public/images/pokemon/icons/variant/2/198-f_3.png new file mode 100644 index 00000000000..f2920cd1d0e Binary files /dev/null and b/public/images/pokemon/icons/variant/2/198-f_3.png differ diff --git a/public/images/pokemon/icons/variant/2/198_2.png b/public/images/pokemon/icons/variant/2/198_2.png new file mode 100644 index 00000000000..35e5c2e75ea Binary files /dev/null and b/public/images/pokemon/icons/variant/2/198_2.png differ diff --git a/public/images/pokemon/icons/variant/2/198_3.png b/public/images/pokemon/icons/variant/2/198_3.png new file mode 100644 index 00000000000..f2920cd1d0e Binary files /dev/null and b/public/images/pokemon/icons/variant/2/198_3.png differ diff --git a/public/images/pokemon/icons/variant/2/211_2.png b/public/images/pokemon/icons/variant/2/211_2.png new file mode 100644 index 00000000000..c042910bc17 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/211_2.png differ diff --git a/public/images/pokemon/icons/variant/2/211_3.png b/public/images/pokemon/icons/variant/2/211_3.png new file mode 100644 index 00000000000..3548893b6ec Binary files /dev/null and b/public/images/pokemon/icons/variant/2/211_3.png differ diff --git a/public/images/pokemon/icons/variant/3/255_2.png b/public/images/pokemon/icons/variant/3/255_2.png index adf8c6ea8bc..b40b8f1607c 100644 Binary files a/public/images/pokemon/icons/variant/3/255_2.png and b/public/images/pokemon/icons/variant/3/255_2.png differ diff --git a/public/images/pokemon/icons/variant/3/255_3.png b/public/images/pokemon/icons/variant/3/255_3.png index 6ed47e69afa..2ae8ef351f5 100644 Binary files a/public/images/pokemon/icons/variant/3/255_3.png and b/public/images/pokemon/icons/variant/3/255_3.png differ diff --git a/public/images/pokemon/icons/variant/3/256_2.png b/public/images/pokemon/icons/variant/3/256_2.png index b372f1ff981..43919a2db06 100644 Binary files a/public/images/pokemon/icons/variant/3/256_2.png and b/public/images/pokemon/icons/variant/3/256_2.png differ diff --git a/public/images/pokemon/icons/variant/3/256_3.png b/public/images/pokemon/icons/variant/3/256_3.png index 0c529f838ba..bb1cbfe0809 100644 Binary files a/public/images/pokemon/icons/variant/3/256_3.png and b/public/images/pokemon/icons/variant/3/256_3.png differ diff --git a/public/images/pokemon/icons/variant/3/257_3.png b/public/images/pokemon/icons/variant/3/257_3.png index c7853c73d4f..cccaab5db12 100644 Binary files a/public/images/pokemon/icons/variant/3/257_3.png and b/public/images/pokemon/icons/variant/3/257_3.png differ diff --git a/public/images/pokemon/icons/variant/3/276_2.png b/public/images/pokemon/icons/variant/3/276_2.png new file mode 100644 index 00000000000..d7e8a3aa9ca Binary files /dev/null and b/public/images/pokemon/icons/variant/3/276_2.png differ diff --git a/public/images/pokemon/icons/variant/3/276_3.png b/public/images/pokemon/icons/variant/3/276_3.png new file mode 100644 index 00000000000..b9cfa276eb2 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/276_3.png differ diff --git a/public/images/pokemon/icons/variant/3/277_2.png b/public/images/pokemon/icons/variant/3/277_2.png new file mode 100644 index 00000000000..f4d58f259c3 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/277_2.png differ diff --git a/public/images/pokemon/icons/variant/3/277_3.png b/public/images/pokemon/icons/variant/3/277_3.png new file mode 100644 index 00000000000..69ccce9069b Binary files /dev/null and b/public/images/pokemon/icons/variant/3/277_3.png differ diff --git a/public/images/pokemon/icons/variant/3/359-mega_2.png b/public/images/pokemon/icons/variant/3/359-mega_2.png new file mode 100644 index 00000000000..35290c15aa9 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/359-mega_2.png differ diff --git a/public/images/pokemon/icons/variant/3/359-mega_3.png b/public/images/pokemon/icons/variant/3/359-mega_3.png new file mode 100644 index 00000000000..5a3250b944d Binary files /dev/null and b/public/images/pokemon/icons/variant/3/359-mega_3.png differ diff --git a/public/images/pokemon/icons/variant/3/359_2.png b/public/images/pokemon/icons/variant/3/359_2.png new file mode 100644 index 00000000000..0fa229141fd Binary files /dev/null and b/public/images/pokemon/icons/variant/3/359_2.png differ diff --git a/public/images/pokemon/icons/variant/3/359_3.png b/public/images/pokemon/icons/variant/3/359_3.png new file mode 100644 index 00000000000..54ba72028ac Binary files /dev/null and b/public/images/pokemon/icons/variant/3/359_3.png differ diff --git a/public/images/pokemon/icons/variant/3/377_2.png b/public/images/pokemon/icons/variant/3/377_2.png new file mode 100644 index 00000000000..f90f337c32e Binary files /dev/null and b/public/images/pokemon/icons/variant/3/377_2.png differ diff --git a/public/images/pokemon/icons/variant/3/377_3.png b/public/images/pokemon/icons/variant/3/377_3.png new file mode 100644 index 00000000000..0957178662a Binary files /dev/null and b/public/images/pokemon/icons/variant/3/377_3.png differ diff --git a/public/images/pokemon/icons/variant/3/378_1.png b/public/images/pokemon/icons/variant/3/378_1.png new file mode 100644 index 00000000000..32bc37d9e33 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/378_1.png differ diff --git a/public/images/pokemon/icons/variant/3/378_2.png b/public/images/pokemon/icons/variant/3/378_2.png new file mode 100644 index 00000000000..9f310bc92c8 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/378_2.png differ diff --git a/public/images/pokemon/icons/variant/3/378_3.png b/public/images/pokemon/icons/variant/3/378_3.png new file mode 100644 index 00000000000..45afe9a71a9 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/378_3.png differ diff --git a/public/images/pokemon/icons/variant/3/379_2.png b/public/images/pokemon/icons/variant/3/379_2.png new file mode 100644 index 00000000000..ad928fd752e Binary files /dev/null and b/public/images/pokemon/icons/variant/3/379_2.png differ diff --git a/public/images/pokemon/icons/variant/3/379_3.png b/public/images/pokemon/icons/variant/3/379_3.png new file mode 100644 index 00000000000..acb86b4f665 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/379_3.png differ diff --git a/public/images/pokemon/icons/variant/3/427_2.png b/public/images/pokemon/icons/variant/3/427_2.png deleted file mode 100644 index ceaf11acb48..00000000000 Binary files a/public/images/pokemon/icons/variant/3/427_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/427_3.png b/public/images/pokemon/icons/variant/3/427_3.png deleted file mode 100644 index 5972f5e9489..00000000000 Binary files a/public/images/pokemon/icons/variant/3/427_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/428-mega_2.png b/public/images/pokemon/icons/variant/3/428-mega_2.png deleted file mode 100644 index 32c3293a796..00000000000 Binary files a/public/images/pokemon/icons/variant/3/428-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/428_2.png b/public/images/pokemon/icons/variant/3/428_2.png deleted file mode 100644 index 5b325f3256a..00000000000 Binary files a/public/images/pokemon/icons/variant/3/428_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/429_1.png b/public/images/pokemon/icons/variant/3/429_1.png deleted file mode 100644 index 667f389f5c1..00000000000 Binary files a/public/images/pokemon/icons/variant/3/429_1.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/429_2.png b/public/images/pokemon/icons/variant/3/429_2.png deleted file mode 100644 index 85cd47bd85f..00000000000 Binary files a/public/images/pokemon/icons/variant/3/429_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/429_3.png b/public/images/pokemon/icons/variant/3/429_3.png deleted file mode 100644 index bb9b2384514..00000000000 Binary files a/public/images/pokemon/icons/variant/3/429_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/475-mega_3.png b/public/images/pokemon/icons/variant/3/475-mega_3.png deleted file mode 100644 index c067c36c836..00000000000 Binary files a/public/images/pokemon/icons/variant/3/475-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/475_3.png b/public/images/pokemon/icons/variant/3/475_3.png deleted file mode 100644 index 4a8f5bdb56d..00000000000 Binary files a/public/images/pokemon/icons/variant/3/475_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/4/390_2.png b/public/images/pokemon/icons/variant/4/390_2.png new file mode 100644 index 00000000000..f29d3561210 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/390_2.png differ diff --git a/public/images/pokemon/icons/variant/4/390_3.png b/public/images/pokemon/icons/variant/4/390_3.png new file mode 100644 index 00000000000..7634f2e8639 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/390_3.png differ diff --git a/public/images/pokemon/icons/variant/4/391_2.png b/public/images/pokemon/icons/variant/4/391_2.png new file mode 100644 index 00000000000..470de43c7bc Binary files /dev/null and b/public/images/pokemon/icons/variant/4/391_2.png differ diff --git a/public/images/pokemon/icons/variant/4/391_3.png b/public/images/pokemon/icons/variant/4/391_3.png new file mode 100644 index 00000000000..8996fdb025c Binary files /dev/null and b/public/images/pokemon/icons/variant/4/391_3.png differ diff --git a/public/images/pokemon/icons/variant/4/392_2.png b/public/images/pokemon/icons/variant/4/392_2.png new file mode 100644 index 00000000000..0550a20e94d Binary files /dev/null and b/public/images/pokemon/icons/variant/4/392_2.png differ diff --git a/public/images/pokemon/icons/variant/4/392_3.png b/public/images/pokemon/icons/variant/4/392_3.png new file mode 100644 index 00000000000..7a66926b533 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/392_3.png differ diff --git a/public/images/pokemon/icons/variant/4/427_2.png b/public/images/pokemon/icons/variant/4/427_2.png index 1b5d9271624..ceaf11acb48 100644 Binary files a/public/images/pokemon/icons/variant/4/427_2.png and b/public/images/pokemon/icons/variant/4/427_2.png differ diff --git a/public/images/pokemon/icons/variant/4/427_3.png b/public/images/pokemon/icons/variant/4/427_3.png index a3f90ea6dfa..5972f5e9489 100644 Binary files a/public/images/pokemon/icons/variant/4/427_3.png and b/public/images/pokemon/icons/variant/4/427_3.png differ diff --git a/public/images/pokemon/icons/variant/4/428-mega_2.png b/public/images/pokemon/icons/variant/4/428-mega_2.png index 43dfa05d438..32c3293a796 100644 Binary files a/public/images/pokemon/icons/variant/4/428-mega_2.png and b/public/images/pokemon/icons/variant/4/428-mega_2.png differ diff --git a/public/images/pokemon/icons/variant/4/428_2.png b/public/images/pokemon/icons/variant/4/428_2.png index 1e42720c78b..5b325f3256a 100644 Binary files a/public/images/pokemon/icons/variant/4/428_2.png and b/public/images/pokemon/icons/variant/4/428_2.png differ diff --git a/public/images/pokemon/icons/variant/4/429_1.png b/public/images/pokemon/icons/variant/4/429_1.png index 7354a6a6be7..667f389f5c1 100644 Binary files a/public/images/pokemon/icons/variant/4/429_1.png and b/public/images/pokemon/icons/variant/4/429_1.png differ diff --git a/public/images/pokemon/icons/variant/4/429_2.png b/public/images/pokemon/icons/variant/4/429_2.png index 9ec7cd5e76e..85cd47bd85f 100644 Binary files a/public/images/pokemon/icons/variant/4/429_2.png and b/public/images/pokemon/icons/variant/4/429_2.png differ diff --git a/public/images/pokemon/icons/variant/4/429_3.png b/public/images/pokemon/icons/variant/4/429_3.png index 48f7068ced8..bb9b2384514 100644 Binary files a/public/images/pokemon/icons/variant/4/429_3.png and b/public/images/pokemon/icons/variant/4/429_3.png differ diff --git a/public/images/pokemon/icons/variant/4/430_2.png b/public/images/pokemon/icons/variant/4/430_2.png new file mode 100644 index 00000000000..8026dd75141 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/430_2.png differ diff --git a/public/images/pokemon/icons/variant/4/430_3.png b/public/images/pokemon/icons/variant/4/430_3.png new file mode 100644 index 00000000000..d83a4f349f0 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/430_3.png differ diff --git a/public/images/pokemon/icons/variant/4/455_2.png b/public/images/pokemon/icons/variant/4/455_2.png new file mode 100644 index 00000000000..206ba13205f Binary files /dev/null and b/public/images/pokemon/icons/variant/4/455_2.png differ diff --git a/public/images/pokemon/icons/variant/4/455_3.png b/public/images/pokemon/icons/variant/4/455_3.png new file mode 100644 index 00000000000..199976e2f67 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/455_3.png differ diff --git a/public/images/pokemon/icons/variant/4/486_2.png b/public/images/pokemon/icons/variant/4/486_2.png new file mode 100644 index 00000000000..d13c4861a4b Binary files /dev/null and b/public/images/pokemon/icons/variant/4/486_2.png differ diff --git a/public/images/pokemon/icons/variant/4/486_3.png b/public/images/pokemon/icons/variant/4/486_3.png new file mode 100644 index 00000000000..cf33b01869a Binary files /dev/null and b/public/images/pokemon/icons/variant/4/486_3.png differ diff --git a/public/images/pokemon/icons/variant/5/501_2.png b/public/images/pokemon/icons/variant/5/501_2.png new file mode 100644 index 00000000000..d92f57a8399 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/501_2.png differ diff --git a/public/images/pokemon/icons/variant/5/501_3.png b/public/images/pokemon/icons/variant/5/501_3.png new file mode 100644 index 00000000000..50bbb59a545 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/501_3.png differ diff --git a/public/images/pokemon/icons/variant/5/502_2.png b/public/images/pokemon/icons/variant/5/502_2.png new file mode 100644 index 00000000000..3d327da2129 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/502_2.png differ diff --git a/public/images/pokemon/icons/variant/5/502_3.png b/public/images/pokemon/icons/variant/5/502_3.png new file mode 100644 index 00000000000..a10810daed9 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/502_3.png differ diff --git a/public/images/pokemon/icons/variant/5/503_2.png b/public/images/pokemon/icons/variant/5/503_2.png new file mode 100644 index 00000000000..b3611139d87 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/503_2.png differ diff --git a/public/images/pokemon/icons/variant/5/503_3.png b/public/images/pokemon/icons/variant/5/503_3.png new file mode 100644 index 00000000000..da3aa967ab5 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/503_3.png differ diff --git a/public/images/pokemon/icons/variant/5/527_2.png b/public/images/pokemon/icons/variant/5/527_2.png new file mode 100644 index 00000000000..3a0b284bfde Binary files /dev/null and b/public/images/pokemon/icons/variant/5/527_2.png differ diff --git a/public/images/pokemon/icons/variant/5/527_3.png b/public/images/pokemon/icons/variant/5/527_3.png new file mode 100644 index 00000000000..39b54a23b1e Binary files /dev/null and b/public/images/pokemon/icons/variant/5/527_3.png differ diff --git a/public/images/pokemon/icons/variant/5/528_2.png b/public/images/pokemon/icons/variant/5/528_2.png new file mode 100644 index 00000000000..4d209760134 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/528_2.png differ diff --git a/public/images/pokemon/icons/variant/5/528_3.png b/public/images/pokemon/icons/variant/5/528_3.png new file mode 100644 index 00000000000..1c887443660 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/528_3.png differ diff --git a/public/images/pokemon/icons/variant/5/587_2.png b/public/images/pokemon/icons/variant/5/587_2.png new file mode 100644 index 00000000000..1e522a31676 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/587_2.png differ diff --git a/public/images/pokemon/icons/variant/5/587_3.png b/public/images/pokemon/icons/variant/5/587_3.png new file mode 100644 index 00000000000..c26066605cd Binary files /dev/null and b/public/images/pokemon/icons/variant/5/587_3.png differ diff --git a/public/images/pokemon/icons/variant/5/588_2.png b/public/images/pokemon/icons/variant/5/588_2.png new file mode 100644 index 00000000000..df99218cedd Binary files /dev/null and b/public/images/pokemon/icons/variant/5/588_2.png differ diff --git a/public/images/pokemon/icons/variant/5/588_3.png b/public/images/pokemon/icons/variant/5/588_3.png new file mode 100644 index 00000000000..3d9277308c7 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/588_3.png differ diff --git a/public/images/pokemon/icons/variant/5/589_2.png b/public/images/pokemon/icons/variant/5/589_2.png new file mode 100644 index 00000000000..ada32c980c1 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/589_2.png differ diff --git a/public/images/pokemon/icons/variant/5/589_3.png b/public/images/pokemon/icons/variant/5/589_3.png new file mode 100644 index 00000000000..1f612c4e8a5 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/589_3.png differ diff --git a/public/images/pokemon/icons/variant/5/590_2.png b/public/images/pokemon/icons/variant/5/590_2.png new file mode 100644 index 00000000000..66c3767024b Binary files /dev/null and b/public/images/pokemon/icons/variant/5/590_2.png differ diff --git a/public/images/pokemon/icons/variant/5/590_3.png b/public/images/pokemon/icons/variant/5/590_3.png new file mode 100644 index 00000000000..d18ccb42e21 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/590_3.png differ diff --git a/public/images/pokemon/icons/variant/5/591_2.png b/public/images/pokemon/icons/variant/5/591_2.png new file mode 100644 index 00000000000..dad56af2559 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/591_2.png differ diff --git a/public/images/pokemon/icons/variant/5/591_3.png b/public/images/pokemon/icons/variant/5/591_3.png new file mode 100644 index 00000000000..a407a14b83a Binary files /dev/null and b/public/images/pokemon/icons/variant/5/591_3.png differ diff --git a/public/images/pokemon/icons/variant/5/616_2.png b/public/images/pokemon/icons/variant/5/616_2.png new file mode 100644 index 00000000000..88e45da0238 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/616_2.png differ diff --git a/public/images/pokemon/icons/variant/5/616_3.png b/public/images/pokemon/icons/variant/5/616_3.png new file mode 100644 index 00000000000..b1767da8fdd Binary files /dev/null and b/public/images/pokemon/icons/variant/5/616_3.png differ diff --git a/public/images/pokemon/icons/variant/5/617_2.png b/public/images/pokemon/icons/variant/5/617_2.png new file mode 100644 index 00000000000..fff02c3f344 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/617_2.png differ diff --git a/public/images/pokemon/icons/variant/5/617_3.png b/public/images/pokemon/icons/variant/5/617_3.png new file mode 100644 index 00000000000..b3f05f31db2 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/617_3.png differ diff --git a/public/images/pokemon/icons/variant/5/621_2.png b/public/images/pokemon/icons/variant/5/621_2.png new file mode 100644 index 00000000000..dbaa26325d8 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/621_2.png differ diff --git a/public/images/pokemon/icons/variant/5/621_3.png b/public/images/pokemon/icons/variant/5/621_3.png new file mode 100644 index 00000000000..190ffb11dc3 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/621_3.png differ diff --git a/public/images/pokemon/icons/variant/6/656_2.png b/public/images/pokemon/icons/variant/6/656_2.png new file mode 100644 index 00000000000..612386a5d1e Binary files /dev/null and b/public/images/pokemon/icons/variant/6/656_2.png differ diff --git a/public/images/pokemon/icons/variant/6/656_3.png b/public/images/pokemon/icons/variant/6/656_3.png new file mode 100644 index 00000000000..575cf3aef3a Binary files /dev/null and b/public/images/pokemon/icons/variant/6/656_3.png differ diff --git a/public/images/pokemon/icons/variant/6/657_2.png b/public/images/pokemon/icons/variant/6/657_2.png new file mode 100644 index 00000000000..9f26c5f85bf Binary files /dev/null and b/public/images/pokemon/icons/variant/6/657_2.png differ diff --git a/public/images/pokemon/icons/variant/6/657_3.png b/public/images/pokemon/icons/variant/6/657_3.png new file mode 100644 index 00000000000..fde76bb8d1c Binary files /dev/null and b/public/images/pokemon/icons/variant/6/657_3.png differ diff --git a/public/images/pokemon/icons/variant/6/658-ash_2.png b/public/images/pokemon/icons/variant/6/658-ash_2.png new file mode 100644 index 00000000000..b788b336efe Binary files /dev/null and b/public/images/pokemon/icons/variant/6/658-ash_2.png differ diff --git a/public/images/pokemon/icons/variant/6/658-ash_3.png b/public/images/pokemon/icons/variant/6/658-ash_3.png new file mode 100644 index 00000000000..52ac4fe0ede Binary files /dev/null and b/public/images/pokemon/icons/variant/6/658-ash_3.png differ diff --git a/public/images/pokemon/icons/variant/6/658_2.png b/public/images/pokemon/icons/variant/6/658_2.png new file mode 100644 index 00000000000..eaf9da8a9ce Binary files /dev/null and b/public/images/pokemon/icons/variant/6/658_2.png differ diff --git a/public/images/pokemon/icons/variant/6/658_3.png b/public/images/pokemon/icons/variant/6/658_3.png new file mode 100644 index 00000000000..027dda592f0 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/658_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-dandy_2.png b/public/images/pokemon/icons/variant/6/676-dandy_2.png new file mode 100644 index 00000000000..2fb1a1a01b6 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-dandy_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-dandy_3.png b/public/images/pokemon/icons/variant/6/676-dandy_3.png new file mode 100644 index 00000000000..ac05ae8dd3a Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-dandy_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-debutante_2.png b/public/images/pokemon/icons/variant/6/676-debutante_2.png new file mode 100644 index 00000000000..9ec13ca1964 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-debutante_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-debutante_3.png b/public/images/pokemon/icons/variant/6/676-debutante_3.png new file mode 100644 index 00000000000..aef6da0a1fd Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-debutante_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-diamond_2.png b/public/images/pokemon/icons/variant/6/676-diamond_2.png new file mode 100644 index 00000000000..1406640a69c Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-diamond_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-diamond_3.png b/public/images/pokemon/icons/variant/6/676-diamond_3.png new file mode 100644 index 00000000000..ccf477d6819 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-diamond_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-heart_2.png b/public/images/pokemon/icons/variant/6/676-heart_2.png new file mode 100644 index 00000000000..7f3607f8579 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-heart_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-heart_3.png b/public/images/pokemon/icons/variant/6/676-heart_3.png new file mode 100644 index 00000000000..e8256f783ba Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-heart_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-kabuki_2.png b/public/images/pokemon/icons/variant/6/676-kabuki_2.png new file mode 100644 index 00000000000..ea78810582a Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-kabuki_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-kabuki_3.png b/public/images/pokemon/icons/variant/6/676-kabuki_3.png new file mode 100644 index 00000000000..f8501bec610 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-kabuki_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-la-reine_2.png b/public/images/pokemon/icons/variant/6/676-la-reine_2.png new file mode 100644 index 00000000000..5d4cb6bbea0 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-la-reine_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-la-reine_3.png b/public/images/pokemon/icons/variant/6/676-la-reine_3.png new file mode 100644 index 00000000000..57488ba17e2 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-la-reine_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-matron_2.png b/public/images/pokemon/icons/variant/6/676-matron_2.png new file mode 100644 index 00000000000..e7bd18d5a10 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-matron_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-matron_3.png b/public/images/pokemon/icons/variant/6/676-matron_3.png new file mode 100644 index 00000000000..a8870d9ed20 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-matron_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-pharaoh_2.png b/public/images/pokemon/icons/variant/6/676-pharaoh_2.png new file mode 100644 index 00000000000..96d60fa6d4c Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-pharaoh_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-pharaoh_3.png b/public/images/pokemon/icons/variant/6/676-pharaoh_3.png new file mode 100644 index 00000000000..db2de83c8ef Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-pharaoh_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-star_2.png b/public/images/pokemon/icons/variant/6/676-star_2.png new file mode 100644 index 00000000000..e2a58c698f6 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-star_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-star_3.png b/public/images/pokemon/icons/variant/6/676-star_3.png new file mode 100644 index 00000000000..7c4fdc4efb1 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-star_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676_2.png b/public/images/pokemon/icons/variant/6/676_2.png new file mode 100644 index 00000000000..56bcc1a7a34 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676_3.png b/public/images/pokemon/icons/variant/6/676_3.png new file mode 100644 index 00000000000..accb6f96f66 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676_3.png differ diff --git a/public/images/pokemon/icons/variant/6/682_2.png b/public/images/pokemon/icons/variant/6/682_2.png new file mode 100644 index 00000000000..59c05cce665 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/682_2.png differ diff --git a/public/images/pokemon/icons/variant/6/682_3.png b/public/images/pokemon/icons/variant/6/682_3.png new file mode 100644 index 00000000000..a7c73e94eef Binary files /dev/null and b/public/images/pokemon/icons/variant/6/682_3.png differ diff --git a/public/images/pokemon/icons/variant/6/683_2.png b/public/images/pokemon/icons/variant/6/683_2.png new file mode 100644 index 00000000000..7f64665f9d7 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/683_2.png differ diff --git a/public/images/pokemon/icons/variant/6/683_3.png b/public/images/pokemon/icons/variant/6/683_3.png new file mode 100644 index 00000000000..b09a0be5fd2 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/683_3.png differ diff --git a/public/images/pokemon/icons/variant/6/684_2.png b/public/images/pokemon/icons/variant/6/684_2.png new file mode 100644 index 00000000000..2fccca23416 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/684_2.png differ diff --git a/public/images/pokemon/icons/variant/6/684_3.png b/public/images/pokemon/icons/variant/6/684_3.png new file mode 100644 index 00000000000..9c09475db49 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/684_3.png differ diff --git a/public/images/pokemon/icons/variant/6/685_2.png b/public/images/pokemon/icons/variant/6/685_2.png new file mode 100644 index 00000000000..8f52850dd2d Binary files /dev/null and b/public/images/pokemon/icons/variant/6/685_2.png differ diff --git a/public/images/pokemon/icons/variant/6/685_3.png b/public/images/pokemon/icons/variant/6/685_3.png new file mode 100644 index 00000000000..ebad502551e Binary files /dev/null and b/public/images/pokemon/icons/variant/6/685_3.png differ diff --git a/public/images/pokemon/icons/variant/6/688_2.png b/public/images/pokemon/icons/variant/6/688_2.png new file mode 100644 index 00000000000..6fe8ba9c770 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/688_2.png differ diff --git a/public/images/pokemon/icons/variant/6/688_3.png b/public/images/pokemon/icons/variant/6/688_3.png new file mode 100644 index 00000000000..9586c3203a9 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/688_3.png differ diff --git a/public/images/pokemon/icons/variant/6/689_2.png b/public/images/pokemon/icons/variant/6/689_2.png new file mode 100644 index 00000000000..66305ef69e8 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/689_2.png differ diff --git a/public/images/pokemon/icons/variant/6/689_3.png b/public/images/pokemon/icons/variant/6/689_3.png new file mode 100644 index 00000000000..2bdfea0ddd0 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/689_3.png differ diff --git a/public/images/pokemon/icons/variant/7/2026_2.png b/public/images/pokemon/icons/variant/7/2026_2.png new file mode 100644 index 00000000000..3b939a6c1fc Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2026_2.png differ diff --git a/public/images/pokemon/icons/variant/7/2026_3.png b/public/images/pokemon/icons/variant/7/2026_3.png new file mode 100644 index 00000000000..f530b9cfcb3 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2026_3.png differ diff --git a/public/images/pokemon/icons/variant/7/2103_2.png b/public/images/pokemon/icons/variant/7/2103_2.png new file mode 100644 index 00000000000..d3795c35070 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2103_2.png differ diff --git a/public/images/pokemon/icons/variant/7/2103_3.png b/public/images/pokemon/icons/variant/7/2103_3.png new file mode 100644 index 00000000000..e24ba1eb917 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2103_3.png differ diff --git a/public/images/pokemon/icons/variant/7/807_2.png b/public/images/pokemon/icons/variant/7/807_2.png new file mode 100644 index 00000000000..6e070af347d Binary files /dev/null and b/public/images/pokemon/icons/variant/7/807_2.png differ diff --git a/public/images/pokemon/icons/variant/7/807_3.png b/public/images/pokemon/icons/variant/7/807_3.png new file mode 100644 index 00000000000..19e59272f86 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/807_3.png differ diff --git a/public/images/pokemon/icons/variant/8/6503_2.png b/public/images/pokemon/icons/variant/8/6503_2.png new file mode 100644 index 00000000000..0098615187e Binary files /dev/null and b/public/images/pokemon/icons/variant/8/6503_2.png differ diff --git a/public/images/pokemon/icons/variant/8/6503_3.png b/public/images/pokemon/icons/variant/8/6503_3.png new file mode 100644 index 00000000000..64428182df0 Binary files /dev/null and b/public/images/pokemon/icons/variant/8/6503_3.png differ diff --git a/public/images/pokemon/icons/variant/8/851-gigantamax.png b/public/images/pokemon/icons/variant/8/851-gigantamax.png new file mode 100644 index 00000000000..e757af7b4fa Binary files /dev/null and b/public/images/pokemon/icons/variant/8/851-gigantamax.png differ diff --git a/public/images/pokemon/icons/variant/8/851-gigantamax_2.png b/public/images/pokemon/icons/variant/8/851-gigantamax_2.png new file mode 100644 index 00000000000..081d8284b3d Binary files /dev/null and b/public/images/pokemon/icons/variant/8/851-gigantamax_2.png differ diff --git a/public/images/pokemon/icons/variant/8/851-gigantamax_3.png b/public/images/pokemon/icons/variant/8/851-gigantamax_3.png new file mode 100644 index 00000000000..6d26a7395f2 Binary files /dev/null and b/public/images/pokemon/icons/variant/8/851-gigantamax_3.png differ diff --git a/public/images/pokemon/icons/variant/8/851s-gigantamax.png b/public/images/pokemon/icons/variant/8/851s-gigantamax.png new file mode 100644 index 00000000000..73fb57b8a5a Binary files /dev/null and b/public/images/pokemon/icons/variant/8/851s-gigantamax.png differ diff --git a/public/images/pokemon/icons/variant/8/894_2.png b/public/images/pokemon/icons/variant/8/894_2.png new file mode 100644 index 00000000000..2b4754d56a0 Binary files /dev/null and b/public/images/pokemon/icons/variant/8/894_2.png differ diff --git a/public/images/pokemon/icons/variant/8/894_3.png b/public/images/pokemon/icons/variant/8/894_3.png new file mode 100644 index 00000000000..cc5baef46cc Binary files /dev/null and b/public/images/pokemon/icons/variant/8/894_3.png differ diff --git a/public/images/pokemon/icons/variant/8/895_2.png b/public/images/pokemon/icons/variant/8/895_2.png new file mode 100644 index 00000000000..bdacf0683ee Binary files /dev/null and b/public/images/pokemon/icons/variant/8/895_2.png differ diff --git a/public/images/pokemon/icons/variant/8/895_3.png b/public/images/pokemon/icons/variant/8/895_3.png new file mode 100644 index 00000000000..9ac023e2e89 Binary files /dev/null and b/public/images/pokemon/icons/variant/8/895_3.png differ diff --git a/public/images/pokemon/icons/variant/8/909_2.png b/public/images/pokemon/icons/variant/8/909_2.png deleted file mode 100644 index 73f71bd49d3..00000000000 Binary files a/public/images/pokemon/icons/variant/8/909_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/8/909_3.png b/public/images/pokemon/icons/variant/8/909_3.png deleted file mode 100644 index 5fb79e5b917..00000000000 Binary files a/public/images/pokemon/icons/variant/8/909_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/8/1003_2.png b/public/images/pokemon/icons/variant/9/1003_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1003_2.png rename to public/images/pokemon/icons/variant/9/1003_2.png diff --git a/public/images/pokemon/icons/variant/8/1003_3.png b/public/images/pokemon/icons/variant/9/1003_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1003_3.png rename to public/images/pokemon/icons/variant/9/1003_3.png diff --git a/public/images/pokemon/icons/variant/8/1006_2.png b/public/images/pokemon/icons/variant/9/1006_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1006_2.png rename to public/images/pokemon/icons/variant/9/1006_2.png diff --git a/public/images/pokemon/icons/variant/8/1006_3.png b/public/images/pokemon/icons/variant/9/1006_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1006_3.png rename to public/images/pokemon/icons/variant/9/1006_3.png diff --git a/public/images/pokemon/icons/variant/8/1010_2.png b/public/images/pokemon/icons/variant/9/1010_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1010_2.png rename to public/images/pokemon/icons/variant/9/1010_2.png diff --git a/public/images/pokemon/icons/variant/8/1010_3.png b/public/images/pokemon/icons/variant/9/1010_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1010_3.png rename to public/images/pokemon/icons/variant/9/1010_3.png diff --git a/public/images/pokemon/icons/variant/9/1012-counterfeit_2.png b/public/images/pokemon/icons/variant/9/1012-counterfeit_2.png new file mode 100644 index 00000000000..19fa8603c69 Binary files /dev/null and b/public/images/pokemon/icons/variant/9/1012-counterfeit_2.png differ diff --git a/public/images/pokemon/icons/variant/9/1012-counterfeit_3.png b/public/images/pokemon/icons/variant/9/1012-counterfeit_3.png new file mode 100644 index 00000000000..04f74b0fd3a Binary files /dev/null and b/public/images/pokemon/icons/variant/9/1012-counterfeit_3.png differ diff --git a/public/images/pokemon/icons/variant/9/1013-unremarkable_2.png b/public/images/pokemon/icons/variant/9/1013-unremarkable_2.png new file mode 100644 index 00000000000..3588b5e2641 Binary files /dev/null and b/public/images/pokemon/icons/variant/9/1013-unremarkable_2.png differ diff --git a/public/images/pokemon/icons/variant/9/1013-unremarkable_3.png b/public/images/pokemon/icons/variant/9/1013-unremarkable_3.png new file mode 100644 index 00000000000..acdb6716ab8 Binary files /dev/null and b/public/images/pokemon/icons/variant/9/1013-unremarkable_3.png differ diff --git a/public/images/pokemon/icons/variant/9/909_2.png b/public/images/pokemon/icons/variant/9/909_2.png index 95cf5e14d4e..73f71bd49d3 100644 Binary files a/public/images/pokemon/icons/variant/9/909_2.png and b/public/images/pokemon/icons/variant/9/909_2.png differ diff --git a/public/images/pokemon/icons/variant/9/909_3.png b/public/images/pokemon/icons/variant/9/909_3.png index d4d7a9593a4..5fb79e5b917 100644 Binary files a/public/images/pokemon/icons/variant/9/909_3.png and b/public/images/pokemon/icons/variant/9/909_3.png differ diff --git a/public/images/pokemon/icons/variant/8/912_2.png b/public/images/pokemon/icons/variant/9/912_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/912_2.png rename to public/images/pokemon/icons/variant/9/912_2.png diff --git a/public/images/pokemon/icons/variant/8/912_3.png b/public/images/pokemon/icons/variant/9/912_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/912_3.png rename to public/images/pokemon/icons/variant/9/912_3.png diff --git a/public/images/pokemon/icons/variant/8/913_2.png b/public/images/pokemon/icons/variant/9/913_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/913_2.png rename to public/images/pokemon/icons/variant/9/913_2.png diff --git a/public/images/pokemon/icons/variant/8/913_3.png b/public/images/pokemon/icons/variant/9/913_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/913_3.png rename to public/images/pokemon/icons/variant/9/913_3.png diff --git a/public/images/pokemon/icons/variant/8/914_2.png b/public/images/pokemon/icons/variant/9/914_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/914_2.png rename to public/images/pokemon/icons/variant/9/914_2.png diff --git a/public/images/pokemon/icons/variant/8/914_3.png b/public/images/pokemon/icons/variant/9/914_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/914_3.png rename to public/images/pokemon/icons/variant/9/914_3.png diff --git a/public/images/pokemon/icons/variant/8/940_2.png b/public/images/pokemon/icons/variant/9/940_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/940_2.png rename to public/images/pokemon/icons/variant/9/940_2.png diff --git a/public/images/pokemon/icons/variant/8/940_3.png b/public/images/pokemon/icons/variant/9/940_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/940_3.png rename to public/images/pokemon/icons/variant/9/940_3.png diff --git a/public/images/pokemon/icons/variant/8/941_2.png b/public/images/pokemon/icons/variant/9/941_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/941_2.png rename to public/images/pokemon/icons/variant/9/941_2.png diff --git a/public/images/pokemon/icons/variant/8/941_3.png b/public/images/pokemon/icons/variant/9/941_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/941_3.png rename to public/images/pokemon/icons/variant/9/941_3.png diff --git a/public/images/pokemon/icons/variant/9/944_2.png b/public/images/pokemon/icons/variant/9/944_2.png new file mode 100644 index 00000000000..70af4937c8f Binary files /dev/null and b/public/images/pokemon/icons/variant/9/944_2.png differ diff --git a/public/images/pokemon/icons/variant/9/944_3.png b/public/images/pokemon/icons/variant/9/944_3.png new file mode 100644 index 00000000000..ef7618c9a9c Binary files /dev/null and b/public/images/pokemon/icons/variant/9/944_3.png differ diff --git a/public/images/pokemon/icons/variant/9/945_2.png b/public/images/pokemon/icons/variant/9/945_2.png new file mode 100644 index 00000000000..5a4a7c6ebe5 Binary files /dev/null and b/public/images/pokemon/icons/variant/9/945_2.png differ diff --git a/public/images/pokemon/icons/variant/9/945_3.png b/public/images/pokemon/icons/variant/9/945_3.png new file mode 100644 index 00000000000..1dad94c543c Binary files /dev/null and b/public/images/pokemon/icons/variant/9/945_3.png differ diff --git a/public/images/pokemon/icons/variant/8/953_2.png b/public/images/pokemon/icons/variant/9/953_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/953_2.png rename to public/images/pokemon/icons/variant/9/953_2.png diff --git a/public/images/pokemon/icons/variant/8/953_3.png b/public/images/pokemon/icons/variant/9/953_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/953_3.png rename to public/images/pokemon/icons/variant/9/953_3.png diff --git a/public/images/pokemon/icons/variant/8/954_2.png b/public/images/pokemon/icons/variant/9/954_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/954_2.png rename to public/images/pokemon/icons/variant/9/954_2.png diff --git a/public/images/pokemon/icons/variant/8/954_3.png b/public/images/pokemon/icons/variant/9/954_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/954_3.png rename to public/images/pokemon/icons/variant/9/954_3.png diff --git a/public/images/pokemon/icons/variant/8/981_2.png b/public/images/pokemon/icons/variant/9/981_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/981_2.png rename to public/images/pokemon/icons/variant/9/981_2.png diff --git a/public/images/pokemon/icons/variant/8/981_3.png b/public/images/pokemon/icons/variant/9/981_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/981_3.png rename to public/images/pokemon/icons/variant/9/981_3.png 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/194.png b/public/images/pokemon/shiny/194.png index 2e33bbfd005..38800a7d545 100644 Binary files a/public/images/pokemon/shiny/194.png and b/public/images/pokemon/shiny/194.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..6976a0747e1 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/3-gigantamax.png b/public/images/pokemon/shiny/3-gigantamax.png index ee4705de701..acc57a41671 100644 Binary files a/public/images/pokemon/shiny/3-gigantamax.png and b/public/images/pokemon/shiny/3-gigantamax.png differ diff --git a/public/images/pokemon/shiny/3.png b/public/images/pokemon/shiny/3.png index fb4545e3019..4afd3847484 100644 Binary files a/public/images/pokemon/shiny/3.png and b/public/images/pokemon/shiny/3.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.json b/public/images/pokemon/shiny/335.json index ca797f1d7a4..80c43b41c12 100644 --- a/public/images/pokemon/shiny/335.json +++ b/public/images/pokemon/shiny/335.json @@ -1,1910 +1,523 @@ -{ - "textures": [ - { - "image": "335.png", - "format": "RGBA8888", - "size": { - "w": 366, - "h": 366 - }, - "scale": 1, - "frames": [ - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 63, - "w": 65, - "h": 66 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 192, - "w": 61, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 65, - "h": 61 - }, - "frame": { - "x": 199, - "y": 0, - "w": 65, - "h": 61 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 64, - "h": 61 - }, - "frame": { - "x": 64, - "y": 183, - "w": 64, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 62, - "h": 65 - }, - "frame": { - "x": 61, - "y": 244, - "w": 62, - "h": 65 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 6, - "y": 9, - "w": 63, - "h": 57 - }, - "frame": { - "x": 61, - "y": 309, - "w": 63, - "h": 57 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 64 - }, - "frame": { - "x": 123, - "y": 244, - "w": 61, - "h": 64 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 63, - "h": 58 - }, - "frame": { - "x": 124, - "y": 308, - "w": 63, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 62, - "h": 63 - }, - "frame": { - "x": 264, - "y": 58, - "w": 62, - "h": 63 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 58, - "h": 66 - }, - "frame": { - "x": 189, - "y": 128, - "w": 58, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 247, - "y": 121, - "w": 60, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 249, - "y": 250, - "w": 60, - "h": 63 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0df67af080306e793f3e63687a642a63:bd66cef8682173381b002070c3411214:40bb9f4809624b12bf79bbfe664bea73$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0002.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0003.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0004.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0005.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0007.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0008.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0010.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0011.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0012.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0014.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0015.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0016.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0017.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0018.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0019.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0020.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0022.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0023.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0024.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0025.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0026.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0027.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0029.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0030.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0031.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0032.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0033.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0034.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0035.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0037.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0038.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0039.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0040.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0041.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0042.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0044.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0045.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0046.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0047.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0048.png", + "frame": { "x": 248, "y": 129, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0049.png", + "frame": { "x": 188, "y": 123, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 125, "w": 61, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 61, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 66, "w": 63, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 63, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0052.png", + "frame": { "x": 234, "y": 190, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0053.png", + "frame": { "x": 234, "y": 246, "w": 60, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 11, "w": 60, "h": 55 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0054.png", + "frame": { "x": 115, "y": 239, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 11, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0055.png", + "frame": { "x": 63, "y": 62, "w": 62, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 62, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0056.png", + "frame": { "x": 63, "y": 0, "w": 66, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 66, "h": 62 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 63, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 63, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0058.png", + "frame": { "x": 261, "y": 0, "w": 59, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 59, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0059.png", + "frame": { "x": 181, "y": 184, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 53, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0060.png", + "frame": { "x": 63, "y": 122, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 56, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0061.png", + "frame": { "x": 320, "y": 61, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 58, "h": 65 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0062.png", + "frame": { "x": 129, "y": 61, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 59, "h": 64 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0063.png", + "frame": { "x": 195, "y": 60, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0064.png", + "frame": { "x": 255, "y": 66, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.9.2-x64", + "image": "335.png", + "format": "I8", + "size": { "w": 382, "h": 305 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/335.png b/public/images/pokemon/shiny/335.png index e4f8d10fb1b..fc7c325a469 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/378.png b/public/images/pokemon/shiny/378.png index 62322276ec1..7674ac1873a 100644 Binary files a/public/images/pokemon/shiny/378.png and b/public/images/pokemon/shiny/378.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/656.json b/public/images/pokemon/shiny/656.json index be71c2199a3..3776b4ed7e5 100644 --- a/public/images/pokemon/shiny/656.json +++ b/public/images/pokemon/shiny/656.json @@ -1,41 +1,20 @@ -{ - "textures": [ - { - "image": "656.png", - "format": "RGBA8888", - "size": { - "w": 35, - "h": 35 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:272c02df78d2de4eac23552f4c031224:82f806bb336ca1c034951e96a72caaf5:9c4d208e6c2f857bfb0b23b8eea3326c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 1, "w": 32, "h": 35 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 35 }, + "sourceSize": { "w": 32, "h": 35 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "656.png", + "format": "I8", + "size": { "w": 34, "h": 37 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/656.png b/public/images/pokemon/shiny/656.png index 7779f40d332..d65d9ab857d 100644 Binary files a/public/images/pokemon/shiny/656.png and b/public/images/pokemon/shiny/656.png differ diff --git a/public/images/pokemon/shiny/658-ash.json b/public/images/pokemon/shiny/658-ash.json index 7ac419b1686..c2b8eede9ef 100644 --- a/public/images/pokemon/shiny/658-ash.json +++ b/public/images/pokemon/shiny/658-ash.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 79, - "h": 79 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 79, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 0, - "y": 0, - "w": 79, - "h": 74 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3dd081ba5490f090a73de8423aac2f6b:f088fafaea755476f2abf488e7340cab:bfbf521a5c7bd80bcd95a96d9789c0dd$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 79, "h": 74 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/658-ash.png b/public/images/pokemon/shiny/658-ash.png index 0d65f0bb900..b25693fd24e 100644 Binary files a/public/images/pokemon/shiny/658-ash.png and b/public/images/pokemon/shiny/658-ash.png differ diff --git a/public/images/pokemon/shiny/658.json b/public/images/pokemon/shiny/658.json index 92f9b29175c..219645ec240 100644 --- a/public/images/pokemon/shiny/658.json +++ b/public/images/pokemon/shiny/658.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 75, - "h": 75 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:be07c062265a19e890f1e2d2d1b5527d:ad4583a5a0498c496e9a93574c55ee03:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 85, "h": 67 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 85, "h": 67 }, + "sourceSize": { "w": 85, "h": 67 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 85, "h": 67 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/658.png b/public/images/pokemon/shiny/658.png index 6fb80fd57cc..100d2a02f4a 100644 Binary files a/public/images/pokemon/shiny/658.png and b/public/images/pokemon/shiny/658.png differ diff --git a/public/images/pokemon/shiny/668-female.json b/public/images/pokemon/shiny/668-female.json deleted file mode 100644 index ce08b281a62..00000000000 --- a/public/images/pokemon/shiny/668-female.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "668-female.png", - "format": "RGBA8888", - "size": { - "w": 72, - "h": 72 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 63, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bf61792d4b290b767953cfbbc5b6234f:c16e73a6866720618f3b4f8e3e0a0877:d99ed0e84a0695b54e479aa98271aba1$" - } -} diff --git a/public/images/pokemon/shiny/668-female.png b/public/images/pokemon/shiny/668-female.png deleted file mode 100644 index 1f56d13bc4c..00000000000 Binary files a/public/images/pokemon/shiny/668-female.png and /dev/null differ diff --git a/public/images/pokemon/shiny/668.png b/public/images/pokemon/shiny/668.png index c8ec7c9caf9..73c11b9a7c7 100644 Binary files a/public/images/pokemon/shiny/668.png and b/public/images/pokemon/shiny/668.png differ diff --git a/public/images/pokemon/shiny/674.json b/public/images/pokemon/shiny/674.json index 0ce6a2d9018..86d6cba1b01 100644 --- a/public/images/pokemon/shiny/674.json +++ b/public/images/pokemon/shiny/674.json @@ -1,41 +1,506 @@ -{ - "textures": [ - { - "image": "674.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 28, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 28, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 28, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3a00525649c00ed79ef7fff441994eb0:17d95f774222b5d9946bcc63782468e3:b823d10f1c9b4d501296982088ba63d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0004.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0007.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0010.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0013.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0016.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0019.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0022.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0025.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0028.png", + "frame": { "x": 28, "y": 120, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0031.png", + "frame": { "x": 58, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0032.png", + "frame": { "x": 58, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0033.png", + "frame": { "x": 57, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 123, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0035.png", + "frame": { "x": 57, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0036.png", + "frame": { "x": 86, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0038.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0039.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0040.png", + "frame": { "x": 28, "y": 81, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0041.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0042.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0044.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0045.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0046.png", + "frame": { "x": 28, "y": 81, "w": 29, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 29, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0047.png", + "frame": { "x": 29, "y": 41, "w": 29, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 29, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0048.png", + "frame": { "x": 29, "y": 0, "w": 29, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 29, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 29, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0050.png", + "frame": { "x": 86, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0051.png", + "frame": { "x": 57, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0052.png", + "frame": { "x": 0, "y": 123, "w": 28, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 28, "h": 39 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 210 + }, + { + "filename": "0053.png", + "frame": { "x": 85, "y": 83, "w": 28, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 28, "h": 40 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 42, "w": 28, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 28, "h": 41 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 140 + }, + { + "filename": "0055.png", + "frame": { "x": 86, "y": 0, "w": 28, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 42 }, + "sourceSize": { "w": 29, "h": 42 }, + "duration": 70 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "674.png", + "format": "I8", + "size": { "w": 114, "h": 162 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/674.png b/public/images/pokemon/shiny/674.png index 097368405fc..7c8e71d5988 100644 Binary files a/public/images/pokemon/shiny/674.png and b/public/images/pokemon/shiny/674.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/688.json b/public/images/pokemon/shiny/688.json index 8d34a857f65..3d9aa902a54 100644 --- a/public/images/pokemon/shiny/688.json +++ b/public/images/pokemon/shiny/688.json @@ -1,41 +1,18 @@ -{ - "textures": [ - { - "image": "688.png", - "format": "RGBA8888", - "size": { - "w": 52, - "h": 52 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e78487a241bfd62ebbe53b20c731d2c3:77b6de2bb0929c9cd5328c501256413b:176060351d0044923af938ba7932a6ef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 64, "h": 63 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 64, "h": 63 }, + "sourceSize": { "w": 64, "h": 63 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 64, "h": 63 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/688.png b/public/images/pokemon/shiny/688.png index e87b981aa45..42565cb09b2 100644 Binary files a/public/images/pokemon/shiny/688.png and b/public/images/pokemon/shiny/688.png differ diff --git a/public/images/pokemon/shiny/689.json b/public/images/pokemon/shiny/689.json index c388441a207..488ef54de71 100644 --- a/public/images/pokemon/shiny/689.json +++ b/public/images/pokemon/shiny/689.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "689.png", - "format": "RGBA8888", - "size": { - "w": 86, - "h": 86 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 86, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 79 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:182cf1643b5020735212d8aa4db1c48e:ceb6ea59b420d8893e991d5545fbb7c7:bd0c58ecddcb4af9a0c6e7b39821d971$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 82 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 82 }, + "sourceSize": { "w": 79, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 79, "h": 82 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/689.png b/public/images/pokemon/shiny/689.png index faf533459d0..c58ed341e75 100644 Binary files a/public/images/pokemon/shiny/689.png and b/public/images/pokemon/shiny/689.png differ diff --git a/public/images/pokemon/shiny/694.json b/public/images/pokemon/shiny/694.json index 0893d62dc10..48e9623d7f4 100644 --- a/public/images/pokemon/shiny/694.json +++ b/public/images/pokemon/shiny/694.json @@ -1,41 +1,767 @@ -{ - "textures": [ - { - "image": "694.png", - "format": "RGBA8888", - "size": { - "w": 41, - "h": 41 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bc6e45d13f38b4219ae03e14bb0999b9:7eab0806a2282a4facdb9684c54189e5:b0990f9650cfe63b836cbed33f0b44d8$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 158, "y": 137, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 133, "w": 43, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 12, "w": 43, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 114, "y": 132, "w": 44, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 44, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 95, "w": 45, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 45, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 131, "w": 46, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 13, "w": 46, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 273, "y": 136, "w": 44, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 13, "w": 44, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 82, "y": 208, "w": 41, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 13, "w": 41, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 246, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 207, "y": 211, "w": 39, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 39, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 285, "y": 211, "w": 38, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 38, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 123, "y": 213, "w": 39, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 39, "h": 36 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 209, "w": 40, "h": 37 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 13, "w": 40, "h": 37 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 167, "y": 206, "w": 40, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 12, "w": 40, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 200, "y": 168, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 41, "y": 176, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 282, "y": 173, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 241, "y": 173, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 171, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 85, "y": 170, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 227, "y": 93, "w": 52, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 12, "w": 52, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 57, "y": 50, "w": 55, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 11, "w": 55, "h": 39 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 56, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 56, "h": 50 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 112, "y": 0, "w": 56, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 56, "h": 49 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 56, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 56, "h": 50 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 224, "y": 47, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 281, "y": 46, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 168, "y": 0, "w": 56, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 56, "h": 48 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 281, "y": 0, "w": 57, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 57, "h": 46 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 170, "y": 93, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 224, "y": 0, "w": 57, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 57, "h": 47 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 50, "w": 57, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 57, "h": 45 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 281, "y": 92, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 57, "y": 94, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 57, "h": 44 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 112, "y": 49, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 58, "h": 45 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 114, "y": 94, "w": 56, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 56, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 170, "y": 48, "w": 53, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 53, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 126, "y": 175, "w": 41, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 41, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 43, "y": 138, "w": 42, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 42, "h": 38 }, + "sourceSize": { "w": 62, "h": 50 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "694.png", + "format": "I8", + "size": { "w": 338, "h": 249 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/694.png b/public/images/pokemon/shiny/694.png index a6c87937252..5f65aa5d4ff 100644 Binary files a/public/images/pokemon/shiny/694.png and b/public/images/pokemon/shiny/694.png differ diff --git a/public/images/pokemon/shiny/698.json b/public/images/pokemon/shiny/698.json index 707a84c8ca1..6baf41b0ce7 100644 --- a/public/images/pokemon/shiny/698.json +++ b/public/images/pokemon/shiny/698.json @@ -1,41 +1,1415 @@ -{ - "textures": [ - { - "image": "698.png", - "format": "RGBA8888", - "size": { - "w": 57, - "h": 57 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:46f728cad32ec7681d76168817f7001a:a044b85c8682cf2b3ce52dd5cb859583:198087d69fed44d4a642fa3ba5c077d6$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0088.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0089.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0090.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0091.png", + "frame": { "x": 125, "y": 56, "w": 27, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 27, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0092.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0093.png", + "frame": { "x": 123, "y": 169, "w": 28, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 5, "w": 28, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0094.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0095.png", + "frame": { "x": 123, "y": 113, "w": 29, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 29, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0096.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0097.png", + "frame": { "x": 30, "y": 114, "w": 31, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 31, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0098.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0099.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0100.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0101.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0102.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0103.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0104.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0105.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0106.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0107.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0108.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0109.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0110.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0111.png", + "frame": { "x": 0, "y": 0, "w": 38, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 38, "h": 53 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0112.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0113.png", + "frame": { "x": 38, "y": 0, "w": 37, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 37, "h": 54 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0114.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0115.png", + "frame": { "x": 75, "y": 0, "w": 36, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 36, "h": 55 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0116.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0117.png", + "frame": { "x": 111, "y": 0, "w": 34, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 34, "h": 56 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0118.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0119.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0120.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0121.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0122.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0123.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0124.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0125.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0126.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0127.png", + "frame": { "x": 0, "y": 113, "w": 30, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 30, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0128.png", + "frame": { "x": 0, "y": 113, "w": 30, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 30, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0129.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0130.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0131.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0132.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0133.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0134.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0135.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0136.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0137.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0138.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0139.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0140.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0141.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0142.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0143.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0144.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0145.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0146.png", + "frame": { "x": 62, "y": 55, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0147.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0148.png", + "frame": { "x": 0, "y": 53, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0149.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0150.png", + "frame": { "x": 31, "y": 54, "w": 31, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 31, "h": 60 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0151.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0152.png", + "frame": { "x": 93, "y": 113, "w": 30, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 59 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0153.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0154.png", + "frame": { "x": 61, "y": 115, "w": 30, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 58 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0155.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + }, + { + "filename": "0156.png", + "frame": { "x": 93, "y": 56, "w": 32, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 32, "h": 57 }, + "sourceSize": { "w": 38, "h": 60 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "698.png", + "format": "I8", + "size": { "w": 152, "h": 224 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/698.png b/public/images/pokemon/shiny/698.png index 0874f9af37e..a861e0c14d5 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/703.json b/public/images/pokemon/shiny/703.json index bc3c40dd555..5c0a6230108 100644 --- a/public/images/pokemon/shiny/703.json +++ b/public/images/pokemon/shiny/703.json @@ -1,41 +1,569 @@ -{ - "textures": [ - { - "image": "703.png", - "format": "RGBA8888", - "size": { - "w": 38, - "h": 38 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 37, - "h": 38 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3b9620097a6f8beec26187d7454b0493:5bb102b3070894423e8dff3d1f98cd21:721af8c322ff60159262e9b3017c784d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 37, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 35, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 71, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 107, "y": 38, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 148, "y": 0, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 9, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 38, "w": 35, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 35, "h": 40 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 143, "y": 78, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 143, "y": 40, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 35, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 71, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 74, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 35, "y": 114, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 70, "y": 114, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 105, "y": 114, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 140, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 117, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 35, "y": 153, "w": 35, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 35, "h": 39 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 111, "y": 0, "w": 37, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 37, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 107, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 107, "y": 76, "w": 36, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 36, "h": 38 }, + "sourceSize": { "w": 40, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "703.png", + "format": "I8", + "size": { "w": 183, "h": 192 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/703.png b/public/images/pokemon/shiny/703.png index 7d0d7999166..44ac529283c 100644 Binary files a/public/images/pokemon/shiny/703.png and b/public/images/pokemon/shiny/703.png differ diff --git a/public/images/pokemon/shiny/707.json b/public/images/pokemon/shiny/707.json index f0e0b2053ac..ee5036fb541 100644 --- a/public/images/pokemon/shiny/707.json +++ b/public/images/pokemon/shiny/707.json @@ -1,41 +1,1559 @@ -{ - "textures": [ - { - "image": "707.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 77 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 77 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f2be0784fdc424d853cf61d4ff5ef128:c0a67b3382e00d7635b97e14ca444b8e:8e96b9056ea81e44ced99c97f472a528$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 88, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 17, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 532, "y": 448, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 33, "y": 16, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 490, "y": 432, "w": 42, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 16, "w": 42, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 566, "y": 373, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 15, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 652, "y": 426, "w": 44, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 15, "w": 44, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 289, "y": 330, "w": 46, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 13, "w": 46, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 49, "y": 354, "w": 47, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 14, "w": 47, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 195, "y": 280, "w": 49, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 13, "w": 49, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 629, "y": 153, "w": 53, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 53, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 692, "y": 151, "w": 54, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 13, "w": 54, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 195, "y": 209, "w": 52, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 14, "w": 52, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 247, "y": 215, "w": 51, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 13, "w": 51, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 522, "y": 219, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 618, "y": 224, "w": 49, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 15, "w": 49, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 352, "y": 296, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 16, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 96, "y": 354, "w": 45, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 16, "w": 45, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 378, "y": 372, "w": 44, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 44, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 276, "y": 404, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 361, "y": 447, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 233, "y": 365, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 16, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 618, "y": 297, "w": 44, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 44, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 144, "y": 282, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 378, "y": 218, "w": 47, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 47, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 100, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 474, "y": 141, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 422, "y": 69, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 707, "y": 2, "w": 54, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 50, "y": 11, "w": 54, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 651, "y": 2, "w": 56, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 48, "y": 12, "w": 56, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 2, "y": 65, "w": 54, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 47, "y": 13, "w": 54, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 273, "y": 69, "w": 53, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 13, "w": 53, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 586, "y": 71, "w": 52, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 14, "w": 52, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 2, "y": 142, "w": 50, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 15, "w": 50, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 52, "y": 199, "w": 48, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 16, "w": 48, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 98, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 16, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 712, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 335, "y": 370, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 578, "y": 149, "w": 51, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 17, "w": 51, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 95, "y": 62, "w": 59, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 14, "w": 59, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 519, "y": 2, "w": 67, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 67, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 280, "y": 2, "w": 82, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 82, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 2, "y": 2, "w": 93, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 93, "h": 63 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 95, "y": 2, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 95, "h": 60 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 190, "y": 2, "w": 90, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 90, "h": 62 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 362, "y": 2, "w": 83, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 83, "h": 65 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 445, "y": 2, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 1, "w": 74, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 586, "y": 2, "w": 65, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 2, "w": 65, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 2, "y": 220, "w": 50, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 27, "y": 4, "w": 50, "h": 72 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0121.png", + "frame": { "x": 319, "y": 447, "w": 42, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 5, "w": 42, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0122.png", + "frame": { "x": 447, "y": 489, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 7, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0123.png", + "frame": { "x": 614, "y": 500, "w": 41, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 10, "w": 41, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0124.png", + "frame": { "x": 573, "y": 453, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 11, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0125.png", + "frame": { "x": 267, "y": 480, "w": 41, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 14, "w": 41, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0126.png", + "frame": { "x": 184, "y": 429, "w": 42, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 14, "w": 42, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0127.png", + "frame": { "x": 2, "y": 443, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 16, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0128.png", + "frame": { "x": 226, "y": 442, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 17, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0129.png", + "frame": { "x": 130, "y": 438, "w": 41, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 41, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0130.png", + "frame": { "x": 2, "y": 366, "w": 43, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 43, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0131.png", + "frame": { "x": 52, "y": 277, "w": 46, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 46, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0132.png", + "frame": { "x": 682, "y": 221, "w": 48, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 18, "w": 48, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0133.png", + "frame": { "x": 519, "y": 361, "w": 47, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 19, "w": 47, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0134.png", + "frame": { "x": 43, "y": 502, "w": 44, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 20, "w": 44, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0135.png", + "frame": { "x": 714, "y": 505, "w": 41, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 20, "w": 41, "h": 67 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0136.png", + "frame": { "x": 402, "y": 489, "w": 45, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 20, "w": 45, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0137.png", + "frame": { "x": 471, "y": 219, "w": 51, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 19, "w": 51, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0138.png", + "frame": { "x": 692, "y": 80, "w": 56, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 56, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0139.png", + "frame": { "x": 389, "y": 147, "w": 54, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 18, "w": 54, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0140.png", + "frame": { "x": 399, "y": 297, "w": 46, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 18, "w": 46, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0141.png", + "frame": { "x": 610, "y": 375, "w": 42, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 42, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0142.png", + "frame": { "x": 141, "y": 360, "w": 43, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 43, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0143.png", + "frame": { "x": 638, "y": 79, "w": 54, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 54, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0144.png", + "frame": { "x": 362, "y": 67, "w": 60, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 60, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0145.png", + "frame": { "x": 474, "y": 73, "w": 59, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 59, "h": 68 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0146.png", + "frame": { "x": 264, "y": 147, "w": 57, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 57, "h": 68 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0147.png", + "frame": { "x": 298, "y": 264, "w": 54, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 54, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0148.png", + "frame": { "x": 524, "y": 148, "w": 54, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 36, "y": 18, "w": 54, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0149.png", + "frame": { "x": 211, "y": 135, "w": 53, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 34, "y": 18, "w": 53, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0150.png", + "frame": { "x": 471, "y": 290, "w": 48, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 19, "w": 48, "h": 73 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0151.png", + "frame": { "x": 569, "y": 302, "w": 48, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 19, "w": 48, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0152.png", + "frame": { "x": 154, "y": 134, "w": 57, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 20, "w": 57, "h": 69 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0153.png", + "frame": { "x": 154, "y": 64, "w": 60, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 20, "w": 60, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0154.png", + "frame": { "x": 214, "y": 64, "w": 59, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 19, "w": 59, "h": 71 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0155.png", + "frame": { "x": 2, "y": 292, "w": 47, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 18, "w": 47, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0156.png", + "frame": { "x": 696, "y": 426, "w": 41, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 41, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0157.png", + "frame": { "x": 533, "y": 73, "w": 53, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 53, "h": 75 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0158.png", + "frame": { "x": 56, "y": 135, "w": 62, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 62, "h": 64 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0159.png", + "frame": { "x": 662, "y": 373, "w": 62, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 22, "w": 62, "h": 53 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0160.png", + "frame": { "x": 655, "y": 505, "w": 59, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 22, "w": 59, "h": 47 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0161.png", + "frame": { "x": 422, "y": 437, "w": 61, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 22, "w": 61, "h": 52 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0162.png", + "frame": { "x": 326, "y": 136, "w": 63, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 63, "h": 62 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0163.png", + "frame": { "x": 321, "y": 198, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 45, "y": 21, "w": 57, "h": 66 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0164.png", + "frame": { "x": 519, "y": 291, "w": 50, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 44, "y": 20, "w": 50, "h": 70 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0165.png", + "frame": { "x": 445, "y": 363, "w": 45, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 43, "y": 20, "w": 45, "h": 74 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0166.png", + "frame": { "x": 45, "y": 426, "w": 43, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 42, "y": 19, "w": 43, "h": 76 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0167.png", + "frame": { "x": 189, "y": 352, "w": 44, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 44, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0168.png", + "frame": { "x": 667, "y": 296, "w": 45, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 41, "y": 19, "w": 45, "h": 77 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0169.png", + "frame": { "x": 425, "y": 218, "w": 46, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 40, "y": 18, "w": 46, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0170.png", + "frame": { "x": 148, "y": 203, "w": 47, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 39, "y": 18, "w": 47, "h": 79 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0171.png", + "frame": { "x": 572, "y": 224, "w": 46, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 18, "w": 46, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + }, + { + "filename": "0172.png", + "frame": { "x": 244, "y": 287, "w": 45, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 45, "h": 78 }, + "sourceSize": { "w": 108, "h": 97 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "707.png", + "format": "I8", + "size": { "w": 763, "h": 577 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/707.png b/public/images/pokemon/shiny/707.png index 2f4efb3e8cb..7aed21b7873 100644 Binary files a/public/images/pokemon/shiny/707.png and b/public/images/pokemon/shiny/707.png differ diff --git a/public/images/pokemon/shiny/708.json b/public/images/pokemon/shiny/708.json index 06631af7cb8..abc8d24db2b 100644 --- a/public/images/pokemon/shiny/708.json +++ b/public/images/pokemon/shiny/708.json @@ -1,41 +1,1091 @@ -{ - "textures": [ - { - "image": "708.png", - "format": "RGBA8888", - "size": { - "w": 44, - "h": 44 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 44, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5ae7df27c9e36b2c06c09056297b74ab:efbc3a2251be2a5a300a0c333bce242b:796c82c5076b122f2663381836c65843$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 45, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 0, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 45, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 180, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 226, "y": 42, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 90, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 135, "y": 84, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 180, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 225, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 45, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 90, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 135, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 0, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 6, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 45, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 90, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 272, "y": 42, "w": 43, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 8, "w": 43, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 180, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 8, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 225, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 26, "y": 5, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 270, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 3, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 0, "y": 42, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 135, "y": 0, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 44, "h": 41 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 0, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 0, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0100.png", + "frame": { "x": 45, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0101.png", + "frame": { "x": 270, "y": 124, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0102.png", + "frame": { "x": 90, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0103.png", + "frame": { "x": 135, "y": 125, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0104.png", + "frame": { "x": 90, "y": 207, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 10, "w": 43, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0105.png", + "frame": { "x": 134, "y": 207, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 12, "w": 43, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0106.png", + "frame": { "x": 180, "y": 165, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 14, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0107.png", + "frame": { "x": 225, "y": 165, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 15, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0108.png", + "frame": { "x": 270, "y": 165, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 17, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0109.png", + "frame": { "x": 0, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 19, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0110.png", + "frame": { "x": 270, "y": 206, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 21, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0111.png", + "frame": { "x": 90, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 23, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0112.png", + "frame": { "x": 135, "y": 166, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 21, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0113.png", + "frame": { "x": 180, "y": 206, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 20, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0114.png", + "frame": { "x": 225, "y": 206, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 18, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0115.png", + "frame": { "x": 268, "y": 247, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 44, "h": 39 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0116.png", + "frame": { "x": 178, "y": 247, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 15, "w": 44, "h": 39 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0117.png", + "frame": { "x": 223, "y": 247, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 13, "w": 44, "h": 39 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0118.png", + "frame": { "x": 226, "y": 83, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0119.png", + "frame": { "x": 45, "y": 207, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 8, "w": 44, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + }, + { + "filename": "0120.png", + "frame": { "x": 180, "y": 83, "w": 45, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 45, "h": 40 }, + "sourceSize": { "w": 70, "h": 63 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "708.png", + "format": "I8", + "size": { "w": 315, "h": 286 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/708.png b/public/images/pokemon/shiny/708.png index 1da0441109b..d94b1286590 100644 Binary files a/public/images/pokemon/shiny/708.png and b/public/images/pokemon/shiny/708.png differ diff --git a/public/images/pokemon/shiny/714.json b/public/images/pokemon/shiny/714.json index 992ff63a393..b43aebd68a1 100644 --- a/public/images/pokemon/shiny/714.json +++ b/public/images/pokemon/shiny/714.json @@ -1,41 +1,263 @@ -{ - "textures": [ - { - "image": "714.png", - "format": "RGBA8888", - "size": { - "w": 64, - "h": 64 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 64, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 64, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 64, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0faf41a70733397a2e765b77d2cf3124:ed661ea37221a00e42647a088e380efd:1a07d46e710b0568ec824f54fbc4fe6a$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 133, "y": 1, "w": 64, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 64, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 1, "y": 60, "w": 61, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 61, "h": 55 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 184, "y": 117, "w": 32, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 32, "h": 67 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 50, "y": 119, "w": 33, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 33, "h": 63 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 199, "y": 1, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 64, "y": 60, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 133, "y": 1, "w": 64, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 64, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 1, "y": 60, "w": 61, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 8, "w": 61, "h": 55 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 184, "y": 117, "w": 32, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 3, "w": 32, "h": 67 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 50, "y": 119, "w": 33, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 3, "w": 33, "h": 63 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 199, "y": 1, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 64, "y": 60, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 133, "y": 1, "w": 64, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 64, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 133, "y": 59, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 61, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 113, "y": 117, "w": 33, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 33, "h": 68 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 148, "y": 117, "w": 34, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 34, "h": 64 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 1, "y": 117, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 64, "y": 60, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 67, "y": 1, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 64, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 196, "y": 59, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 61, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 113, "y": 117, "w": 33, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 2, "w": 33, "h": 68 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 218, "y": 117, "w": 33, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 2, "w": 33, "h": 64 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 199, "y": 1, "w": 47, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 1, "w": 47, "h": 56 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 64, "y": 60, "w": 47, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 47, "h": 57 }, + "sourceSize": { "w": 66, "h": 70 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "714.png", + "format": "I8", + "size": { "w": 258, "h": 186 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/714.png b/public/images/pokemon/shiny/714.png index 2cde838873a..924c67d3c85 100644 Binary files a/public/images/pokemon/shiny/714.png and b/public/images/pokemon/shiny/714.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/718-10.json b/public/images/pokemon/shiny/718-10.json index 05c86055ce7..ad273c9ea79 100644 --- a/public/images/pokemon/shiny/718-10.json +++ b/public/images/pokemon/shiny/718-10.json @@ -1,41 +1,686 @@ -{ - "textures": [ - { - "image": "718-10.png", - "format": "RGBA8888", - "size": { - "w": 66, - "h": 66 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 56, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 66 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ddb567f3553fb8f8477733fc8b91dfb8:21520f234fc9684cd172bbced8ed083b:82195cf2a6db620c5643b8162d6e8c5c$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 57, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 173, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 230, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 57, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 115, "y": 0, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 58, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 171, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 229, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 287, "y": 66, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 171, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 229, "y": 130, "w": 58, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 67, "w": 57, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 57, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 287, "y": 0, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 57, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 114, "y": 65, "w": 57, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 57, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 287, "y": 130, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 57, "y": 131, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 164, "y": 261, "w": 56, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 56, "h": 65 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 327, "w": 56, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 64 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 56, "y": 327, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 56, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 169, "y": 329, "w": 57, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 57, "h": 62 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 112, "y": 326, "w": 57, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 57, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 54, "y": 265, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 58, "h": 62 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 226, "y": 332, "w": 56, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 56, "h": 63 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 220, "y": 261, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 273, "y": 264, "w": 53, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 279, "y": 196, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 56, "y": 197, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 110, "y": 197, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 198, "w": 54, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 68 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 169, "y": 194, "w": 55, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 55, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 224, "y": 194, "w": 55, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 55, "h": 67 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 132, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 113, "y": 131, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 56, "h": 66 }, + "sourceSize": { "w": 61, "h": 69 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718-10.png", + "format": "I8", + "size": { "w": 345, "h": 395 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/718-10.png b/public/images/pokemon/shiny/718-10.png index bee16c7ec63..f976d91b4f6 100644 Binary files a/public/images/pokemon/shiny/718-10.png and b/public/images/pokemon/shiny/718-10.png differ diff --git a/public/images/pokemon/shiny/718.json b/public/images/pokemon/shiny/718.json index 00e4c68ba00..98053a226cb 100644 --- a/public/images/pokemon/shiny/718.json +++ b/public/images/pokemon/shiny/718.json @@ -1,41 +1,803 @@ -{ - "textures": [ - { - "image": "718.png", - "format": "RGBA8888", - "size": { - "w": 88, - "h": 88 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - }, - "frame": { - "x": 0, - "y": 0, - "w": 72, - "h": 88 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6daa10e13b8729f3ebc27b1a8eb1c6cb:65f7940d781324b41eba39e9e5565cb7:7b4a06b06cbac24b3f39727b0238661b$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 294, "y": 438, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 442, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 437, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 145, "y": 441, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 366, "y": 440, "w": 71, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 71, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 223, "y": 267, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 296, "y": 350, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 384, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 459, "y": 177, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 452, "y": 265, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 76, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 233, "y": 90, "w": 75, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 75, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 151, "y": 178, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 75, "y": 266, "w": 74, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 74, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 369, "y": 352, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 222, "y": 355, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 73, "y": 354, "w": 72, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 72, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 149, "y": 353, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 442, "y": 353, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 149, "y": 266, "w": 74, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 74, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 377, "y": 265, "w": 75, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 308, "y": 177, "w": 76, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 76, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 76, "y": 91, "w": 76, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 76, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 301, "y": 264, "w": 76, "h": 86 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 76, "h": 86 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 267, "w": 74, "h": 87 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 74, "h": 87 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 90, "w": 76, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 76, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 391, "y": 88, "w": 77, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 77, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 91 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 78, "h": 91 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 468, "y": 88, "w": 77, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 77, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 157, "y": 0, "w": 78, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 90 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 313, "y": 0, "w": 78, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 78, "h": 89 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 79, "h": 90 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 391, "y": 0, "w": 78, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 78, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 235, "y": 0, "w": 78, "h": 90 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 78, "h": 90 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 469, "y": 0, "w": 78, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 313, "y": 89, "w": 77, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 77, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 157, "y": 90, "w": 76, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 76, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 226, "y": 179, "w": 75, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 75, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 354, "w": 73, "h": 88 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 73, "h": 88 }, + "sourceSize": { "w": 88, "h": 92 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "718.png", + "format": "I8", + "size": { "w": 547, "h": 530 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/718.png b/public/images/pokemon/shiny/718.png index cdfa42ccec7..778ae8bff07 100644 Binary files a/public/images/pokemon/shiny/718.png and b/public/images/pokemon/shiny/718.png differ diff --git a/public/images/pokemon/shiny/719.json b/public/images/pokemon/shiny/719.json index 29e48d3b3be..12a679f029f 100644 --- a/public/images/pokemon/shiny/719.json +++ b/public/images/pokemon/shiny/719.json @@ -1,41 +1,875 @@ -{ - "textures": [ - { - "image": "719.png", - "format": "RGBA8888", - "size": { - "w": 65, - "h": 65 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 42, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f62b9cce190b10d691ae00fdc87df448:371601e6d1aa56d47c80c70305627ce1:17a705bb924916761be2495822a53735$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 41, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 82, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 123, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 164, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 40, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 39, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 79, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 118, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 82, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 205, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 41, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 82, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 123, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 164, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 40, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 39, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 77, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 79, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 118, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 82, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 205, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 41, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 82, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 123, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 164, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 40, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 39, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 77, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 79, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 118, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 82, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 205, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 41, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 82, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 8, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 123, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 164, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 40, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 39, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 77, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 79, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 118, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 82, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 205, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 122, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 162, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 115, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 153, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 74, "y": 350, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 37, "h": 69 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 37, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 111, "y": 350, "w": 35, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 35, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 190, "y": 280, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 191, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 157, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 202, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 196, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 38, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 76, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 114, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 152, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 41, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 122, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 162, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 115, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 153, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 74, "y": 350, "w": 37, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 37, "h": 69 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 37, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 111, "y": 350, "w": 35, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 35, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 190, "y": 280, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 191, "y": 210, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 157, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 202, "y": 70, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 0, "y": 0, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 0, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 140, "w": 40, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 9, "w": 40, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 196, "y": 140, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 8, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 38, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 5, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 76, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 4, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 0, "y": 350, "w": 37, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 4, "w": 37, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 114, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 152, "y": 280, "w": 38, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 7, "w": 38, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 0, "y": 210, "w": 39, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 39, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 41, "y": 70, "w": 41, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 41, "h": 70 }, + "sourceSize": { "w": 63, "h": 81 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "719.png", + "format": "I8", + "size": { "w": 246, "h": 420 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/719.png b/public/images/pokemon/shiny/719.png index f17e9b23ca8..c466201632a 100644 Binary files a/public/images/pokemon/shiny/719.png and b/public/images/pokemon/shiny/719.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/944.png b/public/images/pokemon/shiny/944.png index 5b5a264755f..e410629b535 100644 Binary files a/public/images/pokemon/shiny/944.png and b/public/images/pokemon/shiny/944.png differ diff --git a/public/images/pokemon/shiny/945.png b/public/images/pokemon/shiny/945.png index f458bf630d6..ab3fb485bb2 100644 Binary files a/public/images/pokemon/shiny/945.png and b/public/images/pokemon/shiny/945.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/194.png b/public/images/pokemon/shiny/female/194.png index 01c071ee41d..23e55c52190 100644 Binary files a/public/images/pokemon/shiny/female/194.png and b/public/images/pokemon/shiny/female/194.png differ diff --git a/public/images/pokemon/shiny/female/3.png b/public/images/pokemon/shiny/female/3.png index aeacf461779..ec5a9849e60 100644 Binary files a/public/images/pokemon/shiny/female/3.png and b/public/images/pokemon/shiny/female/3.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/shiny/female/668.png b/public/images/pokemon/shiny/female/668.png index 1f56d13bc4c..ec0d2338fac 100644 Binary files a/public/images/pokemon/shiny/female/668.png and b/public/images/pokemon/shiny/female/668.png differ diff --git a/public/images/pokemon/variant/1012-counterfeit.json b/public/images/pokemon/variant/1012-counterfeit.json new file mode 100644 index 00000000000..114c3811ba1 --- /dev/null +++ b/public/images/pokemon/variant/1012-counterfeit.json @@ -0,0 +1,44 @@ +{ + "1": { + "5d9e4a": "dda08a", + "a09750": "acbedf", + "423232": "626a96", + "827b74": "848fb8", + "613f19": "7b86ad", + "ccc374": "def7ff", + "a7ba72": "c87079", + "c1b9ae": "c8ddf1", + "69441b": "3a44a4", + "878278": "8a96c0", + "f7da67": "94386a", + "78c463": "f7dfc5", + "ede9e4": "f5fdff", + "261919": "222078", + "396725": "b0654a", + "251b1b": "404ec8", + "4d3635": "174593", + "87847e": "a1b0e6", + "4c3a3a": "667fe9" + }, + "2": { + "5d9e4a": "978dc7", + "a09750": "1b2556", + "423232": "020109", + "827b74": "6fbb45", + "613f19": "0d1030", + "ccc374": "242f66", + "a7ba72": "647c9a", + "c1b9ae": "111039", + "69441b": "44244b", + "878278": "070722", + "f7da67": "0f5627", + "78c463": "c3b4e0", + "ede9e4": "212b5e", + "261919": "1c0b1f", + "396725": "7a5aa7", + "251b1b": "37183f", + "4d3635": "aae16c", + "87847e": "443666", + "4c3a3a": "563f5b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/1013-unremarkable.json b/public/images/pokemon/variant/1013-unremarkable.json new file mode 100644 index 00000000000..cd988febd87 --- /dev/null +++ b/public/images/pokemon/variant/1013-unremarkable.json @@ -0,0 +1,48 @@ +{ + "1": { + "5d9e4a": "dda08a", + "786354": "7987bd", + "403030": "1c4b9c", + "7b8764": "c58c85", + "ccc374": "eefbff", + "a7ba72": "b75267", + "7b6f6c": "939ec4", + "c1b9ae": "cbe1f5", + "69441b": "3a44a4", + "342405": "616a8a", + "78c463": "f7dfc5", + "453636": "667fe9", + "988975": "acbedf", + "295217": "b0654a", + "e6e1db": "e6f9ff", + "9e8574": "b36171", + "251b1b": "404ec8", + "6a5b20": "8a96c0", + "a09750": "c3d7eb", + "291a0d": "222078", + "f7da67": "94386a" + }, + "2": { + "5d9e4a": "978dc7", + "786354": "5fb352", + "403030": "aae16c", + "7b8764": "716d99", + "ccc374": "263665", + "a7ba72": "647c9a", + "7b6f6c": "0f102d", + "c1b9ae": "111039", + "69441b": "44244b", + "342405": "08081f", + "78c463": "c3b4e0", + "453636": "563f5b", + "988975": "212e57", + "295217": "7a5aa7", + "e6e1db": "212b5e", + "9e8574": "585d81", + "251b1b": "37183f", + "6a5b20": "0b0c21", + "a09750": "131238", + "291a0d": "170d26", + "f7da67": "0f5627" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/102.json b/public/images/pokemon/variant/102.json new file mode 100644 index 00000000000..987f6046458 --- /dev/null +++ b/public/images/pokemon/variant/102.json @@ -0,0 +1,20 @@ +{ + "1": { + "ffce4a": "cea573", + "e69c00": "a0694c", + "ffe6ce": "7ae49f", + "943131": "193662", + "ffb58c": "369b96", + "ef8463": "26647e", + "ffd6ad": "4fba94" + }, + "2": { + "ffce4a": "92394b", + "e69c00": "6d2341", + "ffe6ce": "ebb6f8", + "943131": "414189", + "ffb58c": "9475ce", + "ef8463": "6c5fb6", + "ffd6ad": "b98fe4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/103.json b/public/images/pokemon/variant/103.json new file mode 100644 index 00000000000..2b6a1f13f79 --- /dev/null +++ b/public/images/pokemon/variant/103.json @@ -0,0 +1,28 @@ +{ + "1": { + "ffde6b": "a3c4ed", + "e6ad5a": "869fdc", + "8c7342": "283f5b", + "73ad31": "dea44c", + "526329": "c8592a", + "9cd64a": "f4e774", + "a56b21": "6072ba", + "b59c4a": "426378", + "734210": "373e85", + "ffefa5": "d3efff", + "524210": "131d33" + }, + "2": { + "ffde6b": "eb748d", + "e6ad5a": "c84e7f", + "8c7342": "d59cba", + "73ad31": "3d324b", + "526329": "1f1a31", + "9cd64a": "6a5b73", + "a56b21": "83295f", + "b59c4a": "ffdbe7", + "734210": "4e1044", + "ffefa5": "ffa29d", + "524210": "925b81" + } +} \ No newline at end of file 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/128.json b/public/images/pokemon/variant/128.json new file mode 100644 index 00000000000..cd6a7d64f3a --- /dev/null +++ b/public/images/pokemon/variant/128.json @@ -0,0 +1,32 @@ +{ + "1": { + "dea54a": "56b393", + "634a31": "173e0d", + "9c9cad": "997059", + "e6c57b": "8fcaaa", + "4a3a29": "072b05", + "8c6321": "215c72", + "8c6b52": "355816", + "b58431": "2e8a85", + "ad8c73": "5f722a", + "3a3a4a": "4d2324", + "6b6b84": "75413b", + "cecede": "c2a082", + "523a10": "102d4b" + }, + "2": { + "dea54a": "872b3b", + "634a31": "bc9681", + "9c9cad": "edda95", + "e6c57b": "a84d52", + "4a3a29": "966959", + "8c6321": "461029", + "8c6b52": "d6c3aa", + "b58431": "5e172e", + "ad8c73": "faf9ed", + "3a3a4a": "996537", + "6b6b84": "cca45e", + "cecede": "fffcc1", + "523a10": "2f0e21" + } +} \ No newline at end of file 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/152.json b/public/images/pokemon/variant/152.json new file mode 100644 index 00000000000..f3c1d446fa7 --- /dev/null +++ b/public/images/pokemon/variant/152.json @@ -0,0 +1,28 @@ +{ + "1": { + "efffc5": "f7f1fb", + "849452": "7373b4", + "c52929": "77b3af", + "b5ce6b": "aca1d7", + "d6f78c": "ded2f1", + "84e631": "8074fa", + "ef7b7b": "9bd5c1", + "6bb529": "6f4be2", + "425a19": "505d8d", + "426319": "5d2398", + "638c29": "6633bc" + }, + "2": { + "efffc5": "f4b2ad", + "849452": "a62775", + "c52929": "4eac60", + "b5ce6b": "c83c74", + "d6f78c": "e7617d", + "84e631": "feeeaf", + "ef7b7b": "71cf71", + "6bb529": "f0d187", + "425a19": "801a69", + "426319": "b4814b", + "638c29": "d8a864" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/153.json b/public/images/pokemon/variant/153.json new file mode 100644 index 00000000000..3456ca16513 --- /dev/null +++ b/public/images/pokemon/variant/153.json @@ -0,0 +1,28 @@ +{ + "1": { + "ffff8c": "cbe0fa", + "a58419": "5961ce", + "6b5200": "493fa6", + "ad3100": "47d0d1", + "8cbd31": "8251dc", + "debd29": "7b8ce6", + "527b08": "4d36be", + "6b9c10": "6740c9", + "295208": "232699", + "f7e64a": "a2bbf8", + "d68c52": "80f5e6" + }, + "2": { + "ffff8c": "f5c095", + "a58419": "a8244d", + "6b5200": "891b4f", + "ad3100": "439227", + "8cbd31": "fae084", + "debd29": "ca333d", + "527b08": "e8bc5e", + "6b9c10": "edc870", + "295208": "c58c48", + "f7e64a": "ea704a", + "d68c52": "8ec349" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/154.json b/public/images/pokemon/variant/154.json new file mode 100644 index 00000000000..90311122029 --- /dev/null +++ b/public/images/pokemon/variant/154.json @@ -0,0 +1,30 @@ +{ + "1": { + "634a00": "519aa7", + "f7a59c": "739ed4", + "e6ad00": "7bcfc6", + "ff3a5a": "3542a7", + "ffde21": "b1f2dc", + "ce213a": "27217d", + "63bd42": "9d86d9", + "bdff7b": "dadffe", + "7b103a": "23124e", + "107b31": "8057b2", + "fefefe": "9cfeff", + "9ce652": "b7afee" + }, + "2": { + "634a00": "488939", + "f7a59c": "fff6a9", + "e6ad00": "6bac4b", + "ff3a5a": "f9db74", + "ffde21": "92c462", + "ce213a": "e5b650", + "63bd42": "a31f60", + "bdff7b": "f57382", + "7b103a": "b7873b", + "107b31": "761858", + "fefefe": "ffffee", + "9ce652": "cd3b6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/158.json b/public/images/pokemon/variant/158.json new file mode 100644 index 00000000000..779c7ea69b4 --- /dev/null +++ b/public/images/pokemon/variant/158.json @@ -0,0 +1,27 @@ +{ + "1": { + "7b1900": "4f0332", + "6bb5e6": "dd8e59", + "94d6ff": "fdc17e", + "ffc552": "99d4d9", + "ad8429": "4798ab", + "3184c5": "ae5139", + "e67b7b": "749e9e", + "b54a52": "1d5d6c", + "ce4221": "772c52", + "315a84": "73131e" + }, + "2": { + "000000": "ffffff", + "7b1900": "a66b14", + "6bb5e6": "97ac5b", + "94d6ff": "ccd198", + "ffc552": "2f5365", + "ad8429": "1c314f", + "3184c5": "4f854a", + "e67b7b": "e4b843", + "b54a52": "c48b27", + "ce4221": "ce8c20", + "315a84": "2b4a30" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/159.json b/public/images/pokemon/variant/159.json new file mode 100644 index 00000000000..c6563e4204c --- /dev/null +++ b/public/images/pokemon/variant/159.json @@ -0,0 +1,33 @@ +{ + "1": { + "3a4a84": "973027", + "e64221": "749e9e", + "ce293a": "682c4e", + "5aade6": "e5a354", + "84ceff": "ffcf72", + "cebd63": "56b3bd", + "ffe68c": "a9e4e5", + "840008": "4f1037", + "3184c5": "cd6537", + "6b5200": "085d75", + "840009": "1d5d6c", + "ff8c84": "926877", + "f7525a": "774860" + }, + "2": { + "000000": "ffffff", + "3a4a84": "26472b", + "e64221": "e4b843", + "ce293a": "ce8c20", + "5aade6": "8fa54e", + "84ceff": "c2c78a", + "cebd63": "1c314f", + "ffe68c": "2f5365", + "840008": "a66b14", + "3184c5": "468040", + "6b5200": "112034", + "840009": "c48b27", + "ff8c84": "fff284", + "f7525a": "f3b649" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/160.json b/public/images/pokemon/variant/160.json new file mode 100644 index 00000000000..adb897ae5f5 --- /dev/null +++ b/public/images/pokemon/variant/160.json @@ -0,0 +1,27 @@ +{ + "1": { + "8cd6ff": "ffcf72", + "6b5200": "085d75", + "5ab5f7": "eda857", + "cebd63": "56b3bd", + "ffe68c": "a9e4e5", + "840008": "4f1037", + "294a8c": "973027", + "3a8cce": "d26738", + "ff8c84": "926877", + "f7525a": "774860" + }, + "2": { + "000000": "ffffff", + "8cd6ff": "d1d692", + "6b5200": "112034", + "5ab5f7": "9ab350", + "cebd63": "1c314f", + "ffe68c": "2f5365", + "840008": "a66b14", + "294a8c": "274c2d", + "3a8cce": "498a42", + "ff8c84": "fff284", + "f7525a": "f3b649" + } +} \ No newline at end of file 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/167.json b/public/images/pokemon/variant/167.json new file mode 100644 index 00000000000..20f954a4a55 --- /dev/null +++ b/public/images/pokemon/variant/167.json @@ -0,0 +1,31 @@ +{ + "1": { + "52b56b": "e06c19", + "b5424a": "861d1d", + "ef5a5a": "b92222", + "7b3142": "651218", + "c5b519": "3f2e71", + "314a10": "732202", + "846b29": "231a58", + "8ce631": "f1b940", + "527b29": "d54f19", + "ffe64a": "624095", + "adef63": "f5da68" + }, + "2": { + "52b56b": "8c2848", + "b5424a": "1f1d3f", + "bdc5c5": "a1b7de", + "ef5a5a": "313659", + "7b3142": "181729", + "c5b519": "7d95b9", + "314a10": "481229", + "846b29": "565e8d", + "8ce631": "b54158", + "527b29": "6a1b37", + "ffe64a": "aac3d6", + "ffffff": "cde6fc", + "6b6b73": "62657d", + "adef63": "dd7081" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/168.json b/public/images/pokemon/variant/168.json new file mode 100644 index 00000000000..4c8fcf5f4f5 --- /dev/null +++ b/public/images/pokemon/variant/168.json @@ -0,0 +1,32 @@ +{ + "1": { + "c54242": "62b943", + "6b5219": "043435", + "63319c": "af4900", + "9c5ac5": "e28220", + "bdbdbd": "b5d3dc", + "ffffff": "fffef9", + "ff8c73": "dce24b", + "c5b54a": "15463c", + "ff5a4a": "a8d919", + "ffde42": "186c45", + "8c2100": "317945", + "bd84e6": "f1b940", + "6b6b6b": "552718" + }, + "2": { + "c54242": "7ca5c6", + "6b5219": "161437", + "63319c": "291013", + "9c5ac5": "96304a", + "bdbdbd": "c09fa1", + "ffffff": "fae8e7", + "ff8c73": "c4e8e7", + "c5b54a": "1f2150", + "ff5a4a": "a3c8d1", + "ffde42": "313b60", + "8c2100": "2d3d72", + "bd84e6": "c8545d", + "6b6b6b": "3e538a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/170.json b/public/images/pokemon/variant/170.json new file mode 100644 index 00000000000..c83ca6836db --- /dev/null +++ b/public/images/pokemon/variant/170.json @@ -0,0 +1,34 @@ +{ + "1": { + "08295a": "691f03", + "ffce52": "a1dbba", + "b50000": "efde5a", + "94cee6": "ffeabf", + "295294": "a14713", + "ffef84": "ccffd7", + "5a73c5": "bf6924", + "c59400": "609a8a", + "522919": "052b38", + "ffffde": "f2fff5", + "7bbde6": "f6e37f", + "846352": "45757a", + "6ba5e6": "dda13d", + "e6b529": "84bda9" + }, + "2": { + "08295a": "1b072f", + "ffce52": "e25765", + "b50000": "f0d050", + "94cee6": "a15b8d", + "295294": "321648", + "ffef84": "f97f7f", + "5a73c5": "441e56", + "c59400": "931b3c", + "522919": "720b3a", + "ffffde": "ffc4be", + "7bbde6": "89498d", + "846352": "720b3a", + "6ba5e6": "693373", + "e6b529": "b62b51" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/171.json b/public/images/pokemon/variant/171.json new file mode 100644 index 00000000000..8a9cafe4265 --- /dev/null +++ b/public/images/pokemon/variant/171.json @@ -0,0 +1,30 @@ +{ + "1": { + "a5314a": "bf882c", + "4a7bce": "bc3c4c", + "423110": "05333a", + "ef635a": "efde5a", + "7badef": "f6907f", + "a5ceff": "fbcdb3", + "e6b552": "82ca4f", + "6394e6": "e86062", + "ffde63": "c3e875", + "ad9442": "2a8d3d", + "293173": "872341", + "7b634a": "0c5540" + }, + "2": { + "a5314a": "c3851d", + "4a7bce": "9781b3", + "423110": "040529", + "ef635a": "f0d050", + "7badef": "eecfed", + "a5ceff": "fbf5fa", + "e6b552": "3294b8", + "6394e6": "c5a5d0", + "ffde63": "4dd5d9", + "ad9442": "23689e", + "293173": "4b426c", + "7b634a": "0c1d4c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/172-spiky.json b/public/images/pokemon/variant/172-spiky.json new file mode 100644 index 00000000000..81a1d9bdcd6 --- /dev/null +++ b/public/images/pokemon/variant/172-spiky.json @@ -0,0 +1,30 @@ +{ + "1": { + "f7ef94": "c4e3c3", + "7d1c1c": "992424", + "e77b94": "bd4d5e", + "e36481": "d45976", + "292929": "242424", + "c5ad10": "6cab9a", + "845a29": "45818a", + "f7e652": "a3d1a8", + "a57b08": "5ca390", + "634a10": "30536b" + }, + "2": { + "f7ef94": "8aa5ad", + "7d1c1c": "c38218", + "212131": "d48d61", + "e77b94": "f5dd94", + "e36481": "b35b6d", + "292929": "242424", + "c5ad10": "4a6a90", + "845a29": "283567", + "8c2121": "772c49", + "424252": "e7c17c", + "f7e652": "7095ab", + "171721": "9a4440", + "a57b08": "486a8e", + "634a10": "2f335b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/172.json b/public/images/pokemon/variant/172.json new file mode 100644 index 00000000000..7df41b99457 --- /dev/null +++ b/public/images/pokemon/variant/172.json @@ -0,0 +1,29 @@ +{ + "1": { + "f7ef94": "c4e3c3", + "a57b08": "5ca390", + "d1667f": "d45976", + "e77b94": "bd4d5e", + "292929": "242424", + "c5ad10": "6cab9a", + "845a29": "45818a", + "f7e652": "a3d1a8", + "7d1c1c": "992424", + "634a10": "30536b" + }, + "2": { + "f7ef94": "8aa5ad", + "a57b08": "486a8e", + "d1667f": "b35b6d", + "8c2121": "772c49", + "e77b94": "f5dd94", + "c5ad10": "4a6a90", + "845a29": "283567", + "212131": "d48d61", + "424252": "e7c17c", + "f7e652": "7095ab", + "7d1c1c": "c38218", + "171721": "9a4440", + "634a10": "2f335b" + } +} \ No newline at end of file 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/174.json b/public/images/pokemon/variant/174.json new file mode 100644 index 00000000000..65b9af81dde --- /dev/null +++ b/public/images/pokemon/variant/174.json @@ -0,0 +1,20 @@ +{ + "1": { + "9c1952": "3a6472", + "e6849c": "81c2b8", + "bd0000": "f18fc4", + "630000": "6f305b", + "b55273": "43737d", + "e62910": "ae93d9", + "ffced6": "e5ffec", + "ffadbd": "c5ebd5" + }, + "2": { + "9c1952": "9c5200", + "e6849c": "f5c45b", + "b55273": "a16b30", + "e62910": "c43f3f", + "ffced6": "fff9bf", + "ffadbd": "f5e884" + } +} \ No newline at end of file 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/194.json b/public/images/pokemon/variant/194.json new file mode 100644 index 00000000000..47604b8228d --- /dev/null +++ b/public/images/pokemon/variant/194.json @@ -0,0 +1,24 @@ +{ + "1": { + "104a84": "7a150a", + "b54242": "23768d", + "ff6b73": "52c1e0", + "633a6b": "204954", + "3a7bc5": "d5682e", + "ef73e6": "81e2f7", + "73bdff": "ffc355", + "d65ad6": "65b1c2", + "529ce6": "e8983d" + }, + "2": { + "104a84": "180d42", + "b54242": "b96228", + "ff6b73": "e9cb52", + "633a6b": "80301c", + "3a7bc5": "3f377e", + "ef73e6": "e9cb52", + "73bdff": "5c66c4", + "d65ad6": "cf933b", + "529ce6": "564daa" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/195.json b/public/images/pokemon/variant/195.json new file mode 100644 index 00000000000..3bf5ea7844a --- /dev/null +++ b/public/images/pokemon/variant/195.json @@ -0,0 +1,26 @@ +{ + "1": { + "ade6ff": "f6dfa8", + "84d6f7": "ed9e4f", + "f7f7f7": "fffbea", + "637ba5": "936e66", + "639cbd": "dc6a4d", + "3194a5": "81e2f7", + "19423a": "204954", + "425284": "b03844", + "195a6b": "54aec2", + "6b5a8c": "23768d" + }, + "2": { + "ade6ff": "9864c2", + "84d6f7": "724ba7", + "f7f7f7": "e8b6ff", + "637ba5": "6f2d4b", + "639cbd": "493a8d", + "3194a5": "e9cb52", + "19423a": "b96228", + "425284": "240830", + "195a6b": "cf933b", + "6b5a8c": "80301c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/198.json b/public/images/pokemon/variant/198.json new file mode 100644 index 00000000000..ab9084619f3 --- /dev/null +++ b/public/images/pokemon/variant/198.json @@ -0,0 +1,34 @@ +{ + "1": { + "d94352": "7a101c", + "314263": "462b20", + "d64252": "b3986b", + "73293a": "755237", + "ffad8c": "ad2e24", + "73283a": "630c17", + "d6404f": "8c1b23", + "efd684": "a6a6b3", + "42639c": "694c30", + "5a4a21": "25253b", + "292942": "2a1512", + "b59c21": "57566f", + "752a3c": "4d0419", + "d6bd52": "838098" + }, + "2": { + "d94352": "5939a9", + "314263": "0e4333", + "d64252": "bc4b84", + "73293a": "7b2363", + "ffad8c": "b164e6", + "73283a": "630c17", + "d6404f": "8c1b23", + "efd684": "c2723a", + "42639c": "1d6e47", + "5a4a21": "4e1915", + "292942": "091e16", + "b59c21": "85412d", + "752a3c": "1e1764", + "d6bd52": "9a5524" + } +} \ No newline at end of file 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/2026.json b/public/images/pokemon/variant/2026.json new file mode 100644 index 00000000000..995e3a1a6e8 --- /dev/null +++ b/public/images/pokemon/variant/2026.json @@ -0,0 +1,34 @@ +{ + "1": { + "e3882d": "3d7375", + "965821": "2f4e6b", + "846b5b": "467f85", + "fffdfb": "d6d9ca", + "552720": "142c48", + "602c24": "162f4b", + "fef443": "c48081", + "b45f25": "2d5261", + "fef652": "eb999a", + "1a73cc": "b85346", + "174680": "2b1307", + "e9be14": "945c7b", + "646124": "492652", + "9c5430": "1d3a57", + "ecd8b7": "b4c2a5" + }, + "2": { + "e3882d": "d3b06f", + "965821": "9cb3ca", + "846b5b": "202746", + "fffdfb": "6d8297", + "552720": "43617f", + "fef443": "3a5873", + "b45f25": "bd8551", + "fef652": "faee9e", + "1a73cc": "c26400", + "174680": "2b0606", + "e9be14": "1a3551", + "646124": "122140", + "ecd8b7": "5a6f90" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/2103.json b/public/images/pokemon/variant/2103.json new file mode 100644 index 00000000000..2e97727835a --- /dev/null +++ b/public/images/pokemon/variant/2103.json @@ -0,0 +1,28 @@ +{ + "1": { + "2f9934": "dea44c", + "9f6b41": "426378", + "70442e": "283f5b", + "e6ac5a": "869fdc", + "522f16": "131d33", + "9cbd4a": "9977dd", + "fff68b": "a3c4ed", + "36cc36": "f4e774", + "2d5826": "c8592a", + "7b5210": "373e85", + "ffffcd": "d3efff" + }, + "2": { + "2f9934": "3d324b", + "9f6b41": "ffdbe7", + "70442e": "d59cba", + "e6ac5a": "c84e7f", + "522f16": "925b81", + "9cbd4a": "824a96", + "fff68b": "eb748d", + "36cc36": "6a5b73", + "2d5826": "1f1a31", + "7b5210": "4e1044", + "ffffcd": "ffa29d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/211.json b/public/images/pokemon/variant/211.json new file mode 100644 index 00000000000..cc2b3ba9209 --- /dev/null +++ b/public/images/pokemon/variant/211.json @@ -0,0 +1,28 @@ +{ + "1": { + "940000": "1c6449", + "194a52": "321128", + "dede94": "f1c17c", + "428494": "80294b", + "c5c57b": "dc9565", + "a5ad6b": "ad6643", + "3a6363": "611a42", + "d65263": "48be87", + "ffa594": "9ee79b", + "6b5231": "6d2c2c", + "73adb5": "a0415e" + }, + "2": { + "940000": "385881", + "194a52": "1c2f5b", + "dede94": "365492", + "428494": "60abdc", + "c5c57b": "2b3e7b", + "a5ad6b": "1e275b", + "3a6363": "396796", + "d65263": "a9cfd7", + "ffa594": "cafefd", + "6b5231": "181f46", + "73adb5": "8bd9ee" + } +} \ No newline at end of file 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.json b/public/images/pokemon/variant/248-mega.json index f515868233f..589b3616079 100644 --- a/public/images/pokemon/variant/248-mega.json +++ b/public/images/pokemon/variant/248-mega.json @@ -1,17 +1,34 @@ { + "1": { +"4a5a39": "533334", +"821610": "004194", +"942900": "004194", +"d0243b": "006fb3", +"d55200": "0098fc", +"ff3e40": "0098fc", +"f24159": "088a72", +"f55e72": "18b8a0", +"ff6668": "1cd9ff", +"739c62": "915957", +"ff8385": "00e0fc", +"ffa3a4": "00ffc8", +"accd9c": "c78482", +"dee6cd": "dbb1b5" + }, "2": { - "4a5a39": "06092f", - "101010": "101010", - "dee6cd": "7068b2", - "accd9c": "625695", - "739c62": "2c3071", - "942900": "ee7b06", - "fefefe": "fefefe", - "c5c5c5": "c5c5c5", - "d55200": "ffa904", - "d0243b": "ffa904", - "ff3e40": "ffef76", - "821610": "ee7b06", - "737373": "737373" +"4a5a39": "06092f", +"821610": "ee7b06", +"942900": "ee7b06", +"d0243b": "ffa904", +"d55200": "ffa904", +"ff3e40": "ffef76", +"f24159": "ff9224", +"f55e72": "ffba36", +"ff6668": "fff28f", +"739c62": "2c3071", +"ff8385": "fff49a", +"ffa3a4": "fff9ce", +"accd9c": "625695", +"dee6cd": "7068b2" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/248-mega_2.json b/public/images/pokemon/variant/248-mega_2.json deleted file mode 100644 index 9ef7d417209..00000000000 --- a/public/images/pokemon/variant/248-mega_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "248-mega_2.png", - "format": "RGBA8888", - "size": { - "w": 90, - "h": 90 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 84 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 84 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 84 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e4a1fe4fbac618754df7eb3fcf91b617:0e98725eab652ee45ee2526551c77350:90df97eb431b7162252516cb937a0b9e$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/248-mega_2.png b/public/images/pokemon/variant/248-mega_2.png deleted file mode 100644 index a6000c370a7..00000000000 Binary files a/public/images/pokemon/variant/248-mega_2.png and /dev/null 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/25-beauty-cosplay.json b/public/images/pokemon/variant/25-beauty-cosplay.json new file mode 100644 index 00000000000..0e5a6a1bad2 --- /dev/null +++ b/public/images/pokemon/variant/25-beauty-cosplay.json @@ -0,0 +1,49 @@ +{ + "1": { + "c52119": "ad4e76", + "5e5e6b": "6c6e60", + "f7e652": "a3d1a8", + "52525a": "4f454c", + "cecab9": "cfc8aa", + "e65137": "c95578", + "fffabf": "f4f7ab", + "b52821": "ad4469", + "292929": "1e1526", + "39509d": "47449c", + "f7e860": "f2ea50", + "e65a42": "cf6182", + "4d88c4": "7976c6", + "f7bd21": "79b5a5", + "2d276d": "2f2768", + "242323": "282030", + "585861": "443e6c", + "fff7a5": "c4e3c3", + "9c5200": "315c75", + "f7cc2f": "f7bd21", + "fffdea": "f8ffe3" + }, + "2": { + "c52119": "ebc67c", + "5e5e6b": "8a2554", + "f7e652": "577b98", + "52525a": "f1b571", + "cecab9": "b84084", + "e65137": "b95b6e", + "fffabf": "f5efd1", + "b52821": "6a253f", + "292929": "a45233", + "39509d": "9ec4cd", + "f7e860": "eddc78", + "e65a42": "eedd9c", + "4d88c4": "e4f6f1", + "f7bd21": "486689", + "2d276d": "454a61", + "242323": "282030", + "585861": "3f4246", + "fff7a5": "7b96aa", + "9c5200": "283361", + "965b0e": "96500e", + "f7cc2f": "d5ac44", + "fffdea": "ea82a6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-cool-cosplay.json b/public/images/pokemon/variant/25-cool-cosplay.json new file mode 100644 index 00000000000..de4a138b690 --- /dev/null +++ b/public/images/pokemon/variant/25-cool-cosplay.json @@ -0,0 +1,49 @@ +{ + "1": { + "171717": "2a1d36", + "e8b127": "f5ca2f", + "52525a": "55555e", + "c52119": "ad4e76", + "842222": "7b1f18", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "2baf23": "76a848", + "f7bd21": "79b5a5", + "e65a42": "cf6182", + "ba2b23": "b73850", + "f5e193": "f4f7ab", + "e66953": "b95b6e", + "6f6c8e": "656f86", + "a6adb6": "a5b0b6", + "8c4e22": "965b0e", + "9c5200": "1c4f75", + "c43129": "6a253f", + "d95b45": "cf6887", + "45484d": "443e6c", + "3b3b40": "4a3e46", + "292929": "272b2b" + }, + "2": { + "171717": "a45233", + "e8b127": "e7b432", + "52525a": "8f4b32", + "c52119": "ebc67c", + "842222": "1e1e43", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "2baf23": "572626", + "f7bd21": "445f8a", + "e65a42": "eedd9c", + "ba2b23": "2c2c47", + "f5e193": "eadbb3", + "e66953": "b95b6e", + "6f6c8e": "cf752b", + "a6adb6": "f0b541", + "8c4e22": "b1632b", + "9c5200": "22325c", + "c43129": "6a253f", + "d95b45": "3a3f5e", + "3b3b40": "f1b571", + "292929": "7d3833" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-cosplay.json b/public/images/pokemon/variant/25-cosplay.json new file mode 100644 index 00000000000..e324c094019 --- /dev/null +++ b/public/images/pokemon/variant/25-cosplay.json @@ -0,0 +1,36 @@ +{ + "1": { + "f7e652": "a3d1a8", + "212121": "30263b", + "c43129": "6a253f", + "171717": "1e1526", + "292929": "282030", + "e65a42": "cf6182", + "c52119": "ad4e76", + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "45454a": "4f454c", + "9c5200": "315c75", + "633108": "09406b", + "e66953": "b95b6e", + "de9400": "338087" + }, + "2": { + "f7e652": "577b98", + "212121": "d8805b", + "c43129": "6a253f", + "171717": "a45233", + "292929": "282030", + "e65a42": "eedd9c", + "c52119": "ebc67c", + "42424a": "3f4246", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "45454a": "f1b571", + "9c5200": "23345e", + "633108": "22244f", + "e66953": "b95b6e", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-cute-cosplay.json b/public/images/pokemon/variant/25-cute-cosplay.json new file mode 100644 index 00000000000..251530a0892 --- /dev/null +++ b/public/images/pokemon/variant/25-cute-cosplay.json @@ -0,0 +1,53 @@ +{ + "1": { + "e65a42": "cf6182", + "cf4770": "cf4a59", + "52525a": "30263b", + "c52119": "ad4e76", + "292929": "30263b", + "fff7a5": "f0eaa8", + "9c5200": "255e8a", + "752bd0": "5452b7", + "e66953": "b95b6e", + "c43129": "6a253f", + "42424a": "443e6c", + "f7e652": "a3d1a8", + "ea82a6": "e8848e", + "29292a": "1e1526", + "f3bace": "f2bbbb", + "853247": "85323c", + "52525c": "bab699", + "fff7a6": "c4e3c3", + "101011": "101010", + "baa998": "bab699", + "f7bd21": "79b5a5", + "101010": "1e1526", + "52525b": "4f454c" + }, + "2": { + "e65a42": "eedd9c", + "cf4770": "739b55", + "52525a": "d8805b", + "52525d": "d3ab5a", + "c52119": "ebc67c", + "292929": "d8805b", + "fff7a5": "ebe7b7", + "9c5200": "1e2d52", + "752bd0": "7751c2", + "e66953": "b95b6e", + "c43129": "6a253f", + "42424a": "373d45", + "f7e652": "577b98", + "ea82a6": "a4b95f", + "29292a": "a45233", + "f3bace": "c5cc85", + "853247": "254b30", + "52525c": "706053", + "fff7a6": "7b96aa", + "101011": "101010", + "baa998": "d3ab5a", + "f7bd21": "445f8a", + "101010": "a45233", + "52525b": "f1b571" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-gigantamax.json b/public/images/pokemon/variant/25-gigantamax.json new file mode 100644 index 00000000000..554b93c5bfa --- /dev/null +++ b/public/images/pokemon/variant/25-gigantamax.json @@ -0,0 +1,35 @@ +{ + "1": { + "212121": "1e1526", + "c52018": "ad4e76", + "f6e652": "a3d1a8", + "f6bd20": "79b5a5", + "fff9c2": "b8ffd9", + "e65a41": "cf6182", + "de9400": "338087", + "623108": "09406b", + "fff6a4": "c4e3c3", + "292929": "282030", + "323133": "30263b", + "f8fc4b": "5bc28b", + "9c5200": "315c75", + "41414a": "4f454c", + "61616d": "443e6c" + }, + "2": { + "212121": "a45233", + "c52018": "ebc67c", + "f6e652": "577b98", + "f6bd20": "445f8a", + "fff9c2": "83b1d2", + "e65a41": "eedd9c", + "de9400": "324472", + "623108": "09406b", + "fff6a4": "7b96aa", + "323133": "d8805b", + "695d65": "737383", + "f8fc4b": "326a9f", + "9c5200": "23345e", + "41414a": "d99362" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-partner.json b/public/images/pokemon/variant/25-partner.json new file mode 100644 index 00000000000..4363facf947 --- /dev/null +++ b/public/images/pokemon/variant/25-partner.json @@ -0,0 +1,36 @@ +{ + "1": { + "212121": "30263b", + "c52119": "ad4e76", + "fff7a5": "c4e3c3", + "f7e652": "a3d1a8", + "633108": "09406b", + "de9400": "338087", + "42424a": "443e6c", + "c43129": "6a253f", + "45454a": "4f454c", + "9c5200": "315c75", + "e66953": "b95b6e", + "e65a42": "cf6182", + "171717": "1e1526", + "f7bd21": "79b5a5", + "292929": "282030" + }, + "2": { + "212121": "d8805b", + "c52119": "ebc67c", + "fff7a5": "7b96aa", + "f7e652": "577b98", + "633108": "22244f", + "de9400": "324472", + "42424a": "3f4246", + "c43129": "6a253f", + "45454a": "f1b571", + "9c5200": "23345e", + "e66953": "b95b6e", + "e65a42": "eedd9c", + "171717": "a45233", + "f7bd21": "445f8a", + "292929": "282030" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-smart-cosplay.json b/public/images/pokemon/variant/25-smart-cosplay.json new file mode 100644 index 00000000000..4ba98883f16 --- /dev/null +++ b/public/images/pokemon/variant/25-smart-cosplay.json @@ -0,0 +1,42 @@ +{ + "1": { + "212121": "30263b", + "b7a599": "bab699", + "60b553": "76a848", + "366635": "3e5b2f", + "e35252": "d16b9a", + "c52119": "ad4e76", + "292929": "272b2b", + "9c5200": "315c75", + "f7e652": "a3d1a8", + "95635b": "91685f", + "171717": "1e1526", + "ba2525": "993f70", + "e65a42": "cf6182", + "54545c": "55555e", + "52525a": "4f454c", + "fffdea": "f8ffe3", + "f7bd21": "79b5a5", + "5f3434": "573b38" + }, + "2": { + "212121": "d8805b", + "b7a599": "a7b6b9", + "60b553": "dfb053", + "366635": "ab5130", + "e35252": "3a3f5e", + "c52119": "ebc67c", + "292929": "202937", + "9c5200": "23345e", + "f7e652": "577b98", + "95635b": "a09ea3", + "171717": "a45233", + "ba2525": "2b2b45", + "e65a42": "eedd9c", + "54545c": "45525c", + "52525a": "f1b571", + "fffdea": "f2f0df", + "f7bd21": "445f8a", + "5f3434": "666060" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-tough-cosplay.json b/public/images/pokemon/variant/25-tough-cosplay.json new file mode 100644 index 00000000000..620ac882643 --- /dev/null +++ b/public/images/pokemon/variant/25-tough-cosplay.json @@ -0,0 +1,43 @@ +{ + "1": { + "e37511": "d1694f", + "bf2629": "bf3638", + "303030": "30263b", + "b8282b": "753652", + "8d2b1d": "8e2525", + "424242": "443e6c", + "c52119": "ad4e76", + "292929": "1e1526", + "f7bd21": "79b5a5", + "fbab33": "de9764", + "db4a37": "ad4c60", + "e65a42": "cf6182", + "9c5200": "315c75", + "db5b42": "cf6a59", + "52525a": "4f454c", + "cecab9": "cfc8aa", + "f7e652": "a3d1a8" + }, + "2": { + "e37511": "644794", + "bf2629": "8e6fa1", + "f8ffe3": "e8e3e4", + "303030": "d8805b", + "b8282b": "6a253f", + "8d2b1d": "242866", + "424242": "3f4246", + "c52119": "e8be68", + "292929": "a45233", + "f7bd21": "445f8a", + "fbab33": "845ea1", + "db4a37": "b95b6e", + "e65a42": "edda8c", + "9c5200": "23345e", + "db5b42": "624780", + "52525a": "f1b571", + "4d4d4d": "2b3340", + "272b2b": "162231", + "cecab9": "cfc0c3", + "f7e652": "577b98" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25.json b/public/images/pokemon/variant/25.json new file mode 100644 index 00000000000..0542587ba6d --- /dev/null +++ b/public/images/pokemon/variant/25.json @@ -0,0 +1,36 @@ +{ + "1": { + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "de9400": "338087", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "e66953": "b95b6e", + "45454a": "4f454c", + "292929": "282030", + "c43129": "6a253f", + "212121": "30263b", + "171717": "1e1526", + "f7bd21": "79b5a5", + "9c5200": "315c75", + "633108": "09406b" + }, + "2": { + "42424a": "3f4246", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "de9400": "324472", + "e65a42": "eedd9c", + "f7e652": "577b98", + "e66953": "b95b6e", + "45454a": "f1b571", + "292929": "282030", + "c43129": "6a253f", + "212121": "d8805b", + "171717": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e", + "633108": "22244f" + } +} \ No newline at end of file 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/26.json b/public/images/pokemon/variant/26.json new file mode 100644 index 00000000000..c078c38570f --- /dev/null +++ b/public/images/pokemon/variant/26.json @@ -0,0 +1,36 @@ +{ + "1": { + "ffefd6": "c8d4ba", + "bd1908": "ad4e76", + "944242": "395a80", + "bd5a31": "386d82", + "e6bd84": "a4bda7", + "ffbd00": "b3596b", + "5a2929": "293059", + "3a3a42": "30263b", + "8c6310": "8c3c4c", + "ffde5a": "cf7878", + "8d5911": "983e50", + "734231": "6e2f33", + "63636b": "4f454c", + "de7b31": "539190", + "f7ad29": "76a68b" + }, + "2": { + "ffefd6": "cfc4b5", + "542127": "905331", + "bd1908": "a44c5d", + "944242": "2d3b80", + "bd5a31": "375681", + "e6bd84": "a6b5ab", + "ffbd00": "f3cf91", + "5a2929": "202a60", + "8c6310": "c79b5a", + "ffde5a": "f2e4b6", + "8d5911": "dea96e", + "734231": "bd8447", + "de7b31": "4d6f98", + "f7ad29": "6385ab", + "643034": "2e4685" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/276.json b/public/images/pokemon/variant/276.json new file mode 100644 index 00000000000..d7c6c1268ec --- /dev/null +++ b/public/images/pokemon/variant/276.json @@ -0,0 +1,32 @@ +{ + "1": { + "bdbdce": "26523c", + "ffffff": "3c6a3d", + "efbd63": "e7a562", + "524a29": "4b210d", + "bdbdcd": "b5b5d5", + "a57331": "784524", + "212952": "12223d", + "3a3a31": "3e3e3e", + "314a7b": "1a385a", + "e69410": "bc7532", + "943a52": "ad8634", + "5a6b9c": "2a596b", + "ce5273": "cebf49" + }, + "2": { + "bdbdce": "453f63", + "ffffff": "635d81", + "efbd63": "89787c", + "524a29": "381f2c", + "bdbdcd": "b5b5d5", + "a57331": "4a323a", + "212952": "191222", + "3a3a31": "442c34", + "314a7b": "282037", + "e69410": "63414f", + "943a52": "8ec08b", + "5a6b9c": "3c2f48", + "ce5273": "bcd59d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/277.json b/public/images/pokemon/variant/277.json new file mode 100644 index 00000000000..84d689cab9a --- /dev/null +++ b/public/images/pokemon/variant/277.json @@ -0,0 +1,34 @@ +{ + "1": { + "dea531": "bc7532", + "425a7b": "2a596b", + "ffffff": "3c6a3d", + "b5b5d6": "26523c", + "9c3152": "ad8634", + "945a10": "784524", + "5a5a5a": "b58251", + "63213a": "603c1d", + "c55a73": "cebf49", + "31313a": "89572a", + "e6b563": "e7a562", + "524221": "4b210d", + "292952": "12223d", + "294263": "1a385a" + }, + "2": { + "dea531": "63414f", + "425a7b": "3c2f48", + "ffffff": "635d81", + "b5b5d6": "453f63", + "9c3152": "8ec08b", + "945a10": "4a323a", + "5a5a5a": "5d454d", + "63213a": "5d9469", + "c55a73": "bcd59d", + "31313a": "442c34", + "e6b563": "89787c", + "524221": "381f2c", + "292952": "191222", + "294263": "282037" + } +} \ No newline at end of file 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-gigantamax.json b/public/images/pokemon/variant/3-gigantamax.json index 7b341b367aa..9b74b1131ba 100644 --- a/public/images/pokemon/variant/3-gigantamax.json +++ b/public/images/pokemon/variant/3-gigantamax.json @@ -4,6 +4,8 @@ "ffee52": "37d6de", "debd29": "078a8f", "833100": "002112", + "830009": "23033b", + "189d87": "c2247b", "ff7b73": "712f8f", "de4141": "3f1375", "ffbdbd": "a266b0", @@ -11,6 +13,7 @@ "107b6a": "9e1976", "105241": "4f2800", "83de7b": "a37707", + "2e5529": "38001c", "5a9c39": "705207", "20b49c": "de3592", "fdfdfd": "fdfdfd", @@ -21,14 +24,17 @@ "ffee52": "f75ea8", "debd29": "a30a66", "833100": "0b2e01", + "830009": "154205", + "189d87": "f17f05", "ff7b73": "9db042", "de4141": "3c8227", "ffbdbd": "e7e385", "101010": "101010", "107b6a": "d44300", - "105241": "030129", - "83de7b": "433d99", - "5a9c39": "19164f", + "105241": "381601", + "83de7b": "80ced9", + "2e5519": "011c38", + "5a9c39": "446b94", "20b49c": "fa8405", "fdfdfd": "fdfdfd", "5ad5c5": "faa405" diff --git a/public/images/pokemon/variant/3-mega_2.png b/public/images/pokemon/variant/3-mega_2.png index 037e983a030..54ca687d1c3 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..07ddb5ae7ed 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/3.json b/public/images/pokemon/variant/3.json index 83a13fdca0e..bdcc30edcbf 100644 --- a/public/images/pokemon/variant/3.json +++ b/public/images/pokemon/variant/3.json @@ -1,6 +1,7 @@ { "1": { "843100": "033b22", + "830009": "23033b", "ff7b73": "712f8f", "ffbdbd": "a266b0", "debd29": "078a8f", @@ -13,11 +14,13 @@ "5a9c3a": "b34952", "84de7b": "ff745e", "5ad6c5": "f062a4", + "2e5519": "38001c", "21b59c": "de3592", "ffffff": "ffffff" }, "2": { "843100": "420514", + "830009": "154205", "ff7b73": "9db042", "ffbdbd": "e7e385", "debd29": "a30a66", @@ -30,6 +33,7 @@ "5a9c3a": "446b94", "84de7b": "80ced9", "5ad6c5": "faa405", + "2e5519": "011c38", "21b59c": "fa8405", "ffffff": "ffffff" } 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/359-mega.json b/public/images/pokemon/variant/359-mega.json new file mode 100644 index 00000000000..3e76a8e6ee6 --- /dev/null +++ b/public/images/pokemon/variant/359-mega.json @@ -0,0 +1,30 @@ +{ + "1": { + "273535": "2b3266", + "7b2931": "c9824b", + "414a6a": "421e4a", + "b4b4d5": "458196", + "cd2920": "f7c26d", + "293939": "27122b", + "fdfdfd": "61a8ab", + "525a7b": "59274e", + "d5deee": "589aa6", + "737bac": "874267", + "8b8bac": "3b6987", + "626283": "2a3163" + }, + "2": { + "273535": "420918", + "7b2931": "0f4391", + "414a6a": "b39279", + "b4b4d5": "752f40", + "cd2920": "2a96ce", + "293939": "996e5f", + "fdfdfd": "9e363b", + "525a7b": "e0c79f", + "d5deee": "8f2f41", + "737bac": "f5f1cb", + "8b8bac": "59213b", + "626283": "42122d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/359.json b/public/images/pokemon/variant/359.json new file mode 100644 index 00000000000..936b3567c67 --- /dev/null +++ b/public/images/pokemon/variant/359.json @@ -0,0 +1,34 @@ +{ + "1": { + "424a6b": "421e4a", + "293a3a": "27122b", + "ce2921": "f7c26d", + "7b2931": "c9824b", + "ff7b73": "fff291", + "737bad": "874267", + "d6deef": "589aa6", + "283838": "101f30", + "525a7b": "612b54", + "b5b5d6": "458196", + "636384": "2a3163", + "7179ab": "2b3266", + "ffffff": "61a8ab", + "8c8cad": "3b6987" + }, + "2": { + "424a6b": "b39279", + "293a3a": "996e5f", + "ce2921": "2a96ce", + "7b2931": "0f4391", + "ff7b73": "96eeff", + "737bad": "f5f1cb", + "d6deef": "8f2f41", + "283838": "31101f", + "525a7b": "e0c79f", + "b5b5d6": "752f40", + "636384": "42122d", + "7179ab": "7d1d36", + "ffffff": "9e363b", + "8c8cad": "59213b" + } +} \ No newline at end of file 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/377.json b/public/images/pokemon/variant/377.json new file mode 100644 index 00000000000..84f8851b9a8 --- /dev/null +++ b/public/images/pokemon/variant/377.json @@ -0,0 +1,28 @@ +{ + "1": { + "b54200": "13512f", + "efad6b": "aac669", + "948c73": "2e4e7b", + "cec5ad": "4d8ba8", + "bd633a": "22773f", + "ef733a": "72b645", + "ef843a": "56963a", + "524a29": "182238", + "e6dead": "659db5", + "b5ad94": "3d6d8d", + "efe6de": "84c7ca" + }, + "2": { + "b54200": "3d0933", + "efad6b": "a54c5e", + "948c73": "262847", + "cec5ad": "303353", + "bd633a": "561934", + "ef733a": "c1271f", + "ef843a": "722a41", + "524a29": "161129", + "e6dead": "383e6a", + "b5ad94": "394170", + "efe6de": "4d5784" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/378.json b/public/images/pokemon/variant/378.json new file mode 100644 index 00000000000..c7d2816a024 --- /dev/null +++ b/public/images/pokemon/variant/378.json @@ -0,0 +1,38 @@ +{ + "0": { + "ffffff": "d7b6f1", + "293a7b": "101238", + "9cceff": "6f66a7", + "ceb521": "ca5846", + "6bb5d6": "414184", + "ffffad": "ffd6a7", + "ffe600": "e58b64", + "5a84ad": "282e64", + "3a6b8c": "191d4c", + "bdefff": "9983c4" + }, + "1": { + "6bb5d6": "bf344a", + "bdefff": "ffb88d", + "293a7b": "400b1c", + "ffe600": "7a5d98", + "5a84ad": "981d43", + "ffffff": "fff7d3", + "ffffad": "c39bd0", + "ceb521": "43356c", + "3a6b8c": "64132c", + "9cceff": "eb5d56" + }, + "2": { + "6bb5d6": "323232", + "bdefff": "5b5b5b", + "293a7b": "100f17", + "ffe600": "73e6f6", + "5a84ad": "212121", + "ffffff": "8c8c8c", + "ffffad": "e5fffd", + "ceb521": "319ce2", + "3a6b8c": "14131a", + "9cceff": "424242" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/379.json b/public/images/pokemon/variant/379.json new file mode 100644 index 00000000000..926acc7d987 --- /dev/null +++ b/public/images/pokemon/variant/379.json @@ -0,0 +1,30 @@ +{ + "1": { + "4a5a5a": "34366f", + "ff4242": "5cbed3", + "3a4252": "292960", + "ff9ca5": "d2d3c9", + "d6ced6": "cc9c65", + "b5adad": "a66f52", + "ffffff": "fff3aa", + "dedede": "f0d185", + "848c84": "4c5c91", + "4a4a4a": "533329", + "84847b": "80503b", + "bdbdbd": "7a9ee5" + }, + "2": { + "4a5a5a": "df8533", + "ff4242": "1e1e1e", + "3a4252": "e29631", + "ff9ca5": "a0a0a0", + "d6ced6": "cd5521", + "b5adad": "ad2d1e", + "ffffff": "ffb056", + "dedede": "e87537", + "848c84": "ffcd49", + "4a4a4a": "521328", + "84847b": "81222b", + "bdbdbd": "ffff7e" + } +} \ No newline at end of file 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/39.json b/public/images/pokemon/variant/39.json new file mode 100644 index 00000000000..c72887bdf9d --- /dev/null +++ b/public/images/pokemon/variant/39.json @@ -0,0 +1,26 @@ +{ + "1": { + "d63a31": "f18fc4", + "a53100": "6f305b", + "ffada5": "c5ebd5", + "e67384": "81c2b8", + "10b5ef": "a17ed9", + "ffcec5": "e5ffec", + "104a8c": "393178", + "1973c5": "604ea1", + "a51021": "3a6472", + "6b5263": "153427", + "ceefff": "d9d3e3" + }, + "2": { + "ffada5": "f5e884", + "e67384": "f5c45b", + "10b5ef": "d14b4b", + "ffcec5": "fff9bf", + "104a8c": "8a2f2f", + "1973c5": "c45c54", + "a51021": "9c5200", + "6b5263": "737454", + "ceefff": "ffe9ed" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/390.json b/public/images/pokemon/variant/390.json new file mode 100644 index 00000000000..ba0119974de --- /dev/null +++ b/public/images/pokemon/variant/390.json @@ -0,0 +1,34 @@ +{ + "1": { + "e63131": "1db978", + "b56b29": "64464d", + "9c3131": "174c48", + "947308": "a86256", + "7b4210": "382029", + "ef6b6b": "5db95b", + "ffd631": "eafe67", + "f06e6e": "81dc3f", + "ffe6ad": "edc6a4", + "7e4410": "994943", + "ffad52": "a88d8d", + "e63a42": "2d8766", + "de8400": "876766", + "deb552": "cc9176" + }, + "2": { + "e63131": "b5b0f3", + "b56b29": "293b69", + "9c3131": "422e6f", + "947308": "818596", + "7b4210": "171f46", + "ef6b6b": "cb96e5", + "ffd631": "f3f8fe", + "f06e6e": "cbcfff", + "ffe6ad": "d3d5e0", + "7e4410": "626678", + "ffad52": "6995b5", + "e63a42": "8457b0", + "de8400": "3e5f8a", + "deb552": "a5a9b8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/391.json b/public/images/pokemon/variant/391.json new file mode 100644 index 00000000000..c3503dec40a --- /dev/null +++ b/public/images/pokemon/variant/391.json @@ -0,0 +1,40 @@ +{ + "1": { + "8c7342": "994943", + "dfe5e7": "dac99d", + "c59463": "cc9176", + "cf3419": "2d8766", + "9c5219": "64464d", + "ffffff": "faf7d4", + "735a10": "a86256", + "cf2b19": "c9537e", + "ffce47": "f69044", + "efa542": "cd5528", + "ffce42": "eafe67", + "1052b5": "751a2f", + "1073de": "cc3140", + "6b3a08": "382029", + "d68c29": "876766", + "ce4219": "1db978", + "efce94": "edc6a4" + }, + "2": { + "8c7342": "818596", + "dfe5e7": "dca15d", + "c59463": "a5a9b8", + "cf3419": "8457b0", + "9c5219": "293b69", + "ffffff": "ffe175", + "735a10": "626678", + "cf2b19": "552b94", + "ffce47": "e8fdff", + "efa542": "b0cbd4", + "ffce42": "f3f8fe", + "1052b5": "e09f2f", + "1073de": "ffd745", + "6b3a08": "171f46", + "d68c29": "3e5f8a", + "ce4219": "b5b0f3", + "efce94": "d3d5e0" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/392.json b/public/images/pokemon/variant/392.json new file mode 100644 index 00000000000..78a9777736a --- /dev/null +++ b/public/images/pokemon/variant/392.json @@ -0,0 +1,54 @@ +{ + "1": { + "000000": "ffffff", + "a96442": "1a8251", + "a56240": "10916d", + "e68c5a": "876766", + "6b3a10": "382029", + "cfa423": "c9601e", + "bdc5de": "dac99d", + "a56342": "64464d", + "c9a022": "b7e350", + "737384": "9f8876", + "e63a42": "1db978", + "c59c21": "cd5528", + "875d08": "b03813", + "ffde4a": "e8a82a", + "ffde52": "f69044", + "e6353e": "2d8766", + "19427b": "581225", + "f88c49": "5db95b", + "ffffff": "faf7d4", + "845a08": "9b2719", + "3a73a5": "972733", + "f78c4a": "81dc3f", + "ffde4d": "eafe67", + "842931": "174c48" + }, + "2": { + "000000": "ffffff", + "a96442": "4c2985", + "a56240": "9595db", + "e68c5a": "3e5f8a", + "6b3a10": "171f46", + "cfa423": "c8af9b", + "bdc5de": "dca15d", + "a56342": "293b69", + "c9a022": "cbd0e3", + "737384": "a15a34", + "e63a42": "b5b0f3", + "c59c21": "a0c0cd", + "875d08": "8a5954", + "ffde4a": "fff8e5", + "ffde52": "e8fdff", + "e6353e": "8457b0", + "19427b": "4d5196", + "f88c49": "cb96e5", + "ffffff": "ffe175", + "845a08": "617995", + "3a73a5": "9c96e2", + "f78c4a": "cbcfff", + "ffde4d": "f3f8fe", + "842931": "422e6f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/40.json b/public/images/pokemon/variant/40.json new file mode 100644 index 00000000000..9ec866694ca --- /dev/null +++ b/public/images/pokemon/variant/40.json @@ -0,0 +1,27 @@ +{ + "1": { + "737373": "1f2e3b", + "ffb3db": "f18fc4", + "9c6b21": "153139", + "8c4242": "3a6472", + "52a58c": "a17ed9", + "f77b94": "81c2b8", + "734219": "214f4f", + "ffadbd": "c5ebd5", + "ce6b63": "82b8a9", + "215a63": "393178" + }, + "2": { + "737373": "3b1f24", + "e6dee6": "bc4e24", + "9c6b21": "612719", + "8c4242": "9c5200", + "52a58c": "c45c54", + "f77b94": "f5c45b", + "ffffff": "d07439", + "734219": "68311a", + "ffadbd": "f5e884", + "ce6b63": "e6a54c", + "215a63": "8a2f2f" + } +} \ No newline at end of file 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/430.json b/public/images/pokemon/variant/430.json new file mode 100644 index 00000000000..e6771e34524 --- /dev/null +++ b/public/images/pokemon/variant/430.json @@ -0,0 +1,40 @@ +{ + "1": { + "31313a": "1d1d2b", + "efeff7": "b9382d", + "8c313a": "b3986b", + "5a5a3a": "1e1e2c", + "545454": "3c3b4d", + "29213a": "271b1a", + "3a5a9c": "694c30", + "8c3039": "9e2933", + "de5057": "bd392d", + "a3a3b5": "60606c", + "a5a5b5": "7a1e21", + "de525a": "f3e3b3", + "4a2121": "755237", + "ad943a": "3f3e50", + "3a3a5a": "422e26", + "525252": "380514", + "f7de3a": "61616d" + }, + "2": { + "31313a": "521a16", + "efeff7": "975bc2", + "8c313a": "bc4b84", + "5a5a3a": "4e1915", + "545454": "87432e", + "29213a": "091e16", + "3a5a9c": "1d6e47", + "8c3039": "9e2933", + "de5057": "bd392d", + "a3a3b5": "c4743b", + "a5a5b5": "4f358e", + "de525a": "f17f9c", + "4a2121": "7b2363", + "ad943a": "85412d", + "3a3a5a": "0e4333", + "525252": "1c1754", + "f7de3a": "c2723a" + } +} \ No newline at end of file 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/455.json b/public/images/pokemon/variant/455.json new file mode 100644 index 00000000000..1483b02ef5b --- /dev/null +++ b/public/images/pokemon/variant/455.json @@ -0,0 +1,35 @@ +{ + "1": { + "f7ce31": "7c5d53", + "c59c31": "4d3432", + "9c214a": "451e14", + "2b453d": "523b3c", + "3a5a3a": "b34a82", + "5a6342": "826660", + "8c9452": "b89d8c", + "846b31": "301e20", + "bdc57b": "efd9ba", + "422919": "300c0c", + "e62919": "775331", + "63843a": "e880ab", + "29423a": "7e3b67", + "8f9653": "e2b0bc" + }, + "2": { + "f7ce31": "518078", + "ffffff": "affffe", + "c59c31": "244a45", + "9c214a": "1e4340", + "2b453d": "151926", + "3a5a3a": "37818a", + "5a6342": "2d304e", + "8c9452": "424d6e", + "846b31": "122e2f", + "bdc57b": "6679a1", + "422919": "0d2626", + "e62919": "406b64", + "63843a": "74ddcd", + "29423a": "123247", + "8f9653": "3d909b" + } +} \ No newline at end of file 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/486.json b/public/images/pokemon/variant/486.json new file mode 100644 index 00000000000..32082b03337 --- /dev/null +++ b/public/images/pokemon/variant/486.json @@ -0,0 +1,41 @@ +{ + "1": { + "364859": "611d2a", + "adadc5": "ca7426", + "374859": "6b76a4", + "3a4a5a": "5e1e33", + "4aa563": "e2f2ff", + "5f6d7d": "7b2a19", + "ef7b8c": "7741a1", + "b5bdc5": "0d6696", + "5ac5f7": "5f94d9", + "d6ced6": "e89b34", + "3c4d5e": "3f031d", + "ffffff": "eb8746", + "21846b": "90a7cd", + "fafafa": "ffc245", + "c59c52": "a12612", + "f7d65a": "ce5129", + "7b6321": "3d021b", + "8c94ad": "13081a" + }, + "2": { + "364859": "24293f", + "adadc5": "4f673a", + "374859": "2f1a18", + "3a4a5a": "3b1930", + "4aa563": "755648", + "5f6d7d": "374427", + "ef7b8c": "811745", + "b5bdc5": "f1c832", + "5ac5f7": "d3271a", + "d6ced6": "6e884b", + "ffffff": "a8afaf", + "21846b": "492f29", + "fafafa": "88b06f", + "c59c52": "5d717a", + "f7d65a": "8f9b9e", + "7b6321": "384751", + "8c94ad": "494922" + } +} \ No newline at end of file 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/501.json b/public/images/pokemon/variant/501.json new file mode 100644 index 00000000000..e70d0319842 --- /dev/null +++ b/public/images/pokemon/variant/501.json @@ -0,0 +1,33 @@ +{ + "1": { + "c59429": "ff9ef3", + "efce84": "f2d5ee", + "294252": "241e44", + "c49529": "b73891", + "215a63": "1e1a35", + "c5c5ce": "e3c2ca", + "4a6bad": "9660d1", + "21949c": "373049", + "29bdc5": "5d4a70", + "8c5a31": "af62ac", + "31426b": "4b349e", + "8a5830": "681d49" + }, + "2": { + "8c8c9c": "8f7491", + "c59429": "4e8787", + "efce84": "8abfb1", + "4a4a4a": "715b72", + "294252": "104432", + "c49529": "4e8787", + "215a63": "000000", + "c5c5ce": "ba9bc1", + "4a6bad": "589787", + "21949c": "321e1e", + "ffffff": "f5e9f4", + "29bdc5": "5e3e38", + "8c5a31": "0c4848", + "31426b": "3c706b", + "8a5830": "0c4848" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/502.json b/public/images/pokemon/variant/502.json new file mode 100644 index 00000000000..4227d277216 --- /dev/null +++ b/public/images/pokemon/variant/502.json @@ -0,0 +1,33 @@ +{ + "1": { + "7b5a10": "d877cd", + "31528c": "9d5bc9", + "4a4a4a": "20193d", + "efd68c": "f2d5ee", + "293a6b": "503e8e", + "c5525a": "b73891", + "52bdbd": "624060", + "c59429": "ff9ef3", + "733a3a": "6b1d42", + "313131": "120f33", + "315a73": "1e1624", + "218c94": "39273d", + "fffdfd": "ebb9c4" + }, + "2": { + "7b5a10": "0d5656", + "31528c": "5e3e38", + "4a4a4a": "2c3940", + "efd68c": "63c7bd", + "293a6b": "321e1e", + "c5525a": "519785", + "52bdbd": "8b7566", + "c59429": "488383", + "733a3a": "377667", + "313131": "1f2b36", + "315a73": "483026", + "218c94": "684f44", + "fffdfd": "ffffc2", + "ffffff": "ffffc2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/503.json b/public/images/pokemon/variant/503.json new file mode 100644 index 00000000000..16447be5cca --- /dev/null +++ b/public/images/pokemon/variant/503.json @@ -0,0 +1,37 @@ +{ + "1": { + "84a5a5": "563785", + "4a4a4a": "5e283e", + "215a9c": "4c234a", + "c5c5ce": "b57ea1", + "8aa3a3": "a05982", + "d65263": "b73891", + "8da8a8": "a58b90", + "7b6342": "975fad", + "fffeff": "ebb9c4", + "213a63": "28142c", + "4a4a4c": "6b3e51", + "d6c57b": "f2d5ee", + "5a7373": "332a59", + "ad945a": "db87d1" + }, + "2": { + "84a5a5": "41857b", + "4a4a4a": "c2700d", + "215a9c": "5e3e38", + "c5c5ce": "efa838", + "8aa3a3": "d3a51f", + "d65263": "41857b", + "8da8a8": "bdbdbd", + "7b6342": "0d5656", + "fdfdff": "ffffff", + "fffeff": "f9df58", + "213a63": "321e1e", + "4a4a4c": "c2700d", + "d6c57b": "63c7bd", + "5a7373": "2a5c57", + "9ab2af": "2a5c57", + "494644": "1a5451", + "ad945a": "488383" + } +} \ No newline at end of file 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/527.json b/public/images/pokemon/variant/527.json new file mode 100644 index 00000000000..460a954874f --- /dev/null +++ b/public/images/pokemon/variant/527.json @@ -0,0 +1,28 @@ +{ + "1": { + "191921": "24224f", + "424a5a": "866ca1", + "6b94ad": "6e315e", + "f7adb5": "8ffff9", + "73adc5": "853d6f", + "292931": "55457a", + "ce2942": "a3ffed", + "8c4a52": "4874b8", + "84193a": "5fd4d0", + "c56b7b": "6bc7e8", + "4a6b7b": "361538", + "addef7": "914a6e" + }, + "2": { + "191921": "45234d", + "424a5a": "bf3f75", + "6b94ad": "db843d", + "f7adb5": "b682e0", + "73adc5": "e8b04f", + "292931": "8c2961", + "8c4a52": "393582", + "c56b7b": "7b5ebf", + "4a6b7b": "994d22", + "addef7": "f7e05c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/528.json b/public/images/pokemon/variant/528.json new file mode 100644 index 00000000000..86dd66a4344 --- /dev/null +++ b/public/images/pokemon/variant/528.json @@ -0,0 +1,38 @@ +{ + "1": { + "bdbdce": "76debd", + "313131": "55457a", + "ceefff": "a6ffd7", + "425aa5": "451b41", + "4a4a52": "866ca1", + "2b2b2b": "2b4182", + "2e2e2e": "2f1236", + "f7a59c": "8ffff9", + "317b94": "6e315e", + "54546d": "582253", + "de8c84": "6bc7e8", + "19a5ce": "914a6e", + "944a4a": "4874b8", + "494950": "3b53a3", + "6b7b84": "439ca1", + "363636": "2e6f7a" + }, + "2": { + "bdbdce": "db843d", + "313131": "701c4c", + "ceefff": "f7e05c", + "425aa5": "d6a178", + "4a4a52": "bf3f75", + "2b2b2b": "1d1c4f", + "2e2e2e": "a6705e", + "f7a59c": "b682e0", + "317b94": "e0b49a", + "54546d": "a87354", + "de8c84": "7b5ebf", + "19a5ce": "f9fae3", + "944a4a": "393582", + "494950": "1b1f4d", + "6b7b84": "994d22", + "363636": "6b2314" + } +} \ No newline at end of file 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/587.json b/public/images/pokemon/variant/587.json new file mode 100644 index 00000000000..34831752444 --- /dev/null +++ b/public/images/pokemon/variant/587.json @@ -0,0 +1,33 @@ +{ + "1": { + "d6a531": "a84223", + "fffbf6": "8bd5dc", + "917d53": "16223d", + "ffd600": "d55b19", + "313131": "1d352a", + "212121": "091814", + "b58c08": "681c0e", + "cec5ad": "5a9fbf", + "6b5a31": "3b1c1b", + "a09478": "406da4", + "414141": "2b5d3f", + "434141": "2b5d3f" + }, + "2": { + "c56b63": "5046a7", + "d6a531": "6597cd", + "fffbf6": "c4658e", + "917d53": "321832", + "ffd600": "8bcaee", + "943a42": "462060", + "313131": "372a5b", + "212121": "15132f", + "e69484": "8166c6", + "b58c08": "4879af", + "cec5ad": "9b4072", + "6b5a31": "28273d", + "a09478": "7b3760", + "414141": "5e3a86", + "434141": "5e3a86" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/588.json b/public/images/pokemon/variant/588.json new file mode 100644 index 00000000000..86aa0e118f7 --- /dev/null +++ b/public/images/pokemon/variant/588.json @@ -0,0 +1,33 @@ +{ + "1": { + "213a5a": "2f185b", + "316bff": "8150a7", + "73d6ff": "e8aa48", + "313131": "38131d", + "736321": "8188b0", + "c55200": "b9262c", + "528cff": "c682d6", + "b59c19": "b8c5e5", + "4a4a4a": "64242d", + "000000": "ffffff", + "3a5284": "492c72", + "ffde19": "eef5ff", + "4294ad": "cd6a31" + }, + "2": { + "213a5a": "44446f", + "316bff": "d2cdeb", + "73d6ff": "ffe28d", + "313131": "182138", + "736321": "6f1b34", + "c55200": "ffe8c3", + "528cff": "f9f3ff", + "ce5263": "df6b99", + "b59c19": "a42641", + "4a4a4a": "28334f", + "000000": "ffffff", + "3a5284": "7777a7", + "ffde19": "d0413f", + "4294ad": "d9a35c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/589.json b/public/images/pokemon/variant/589.json new file mode 100644 index 00000000000..486088d13d3 --- /dev/null +++ b/public/images/pokemon/variant/589.json @@ -0,0 +1,32 @@ +{ + "1": { + "c5c5c5": "f9c347", + "ef2952": "eb8343", + "e65a10": "614593", + "bd2152": "c44126", + "736321": "7b8bb3", + "840808": "931119", + "000000": "ffffff", + "6b6b6b": "b34516", + "bd9c19": "b8c5e5", + "195abd": "7436a4", + "94949c": "dc862d", + "ffde19": "eef5ff", + "3a424a": "69130d" + }, + "2": { + "c5c5c5": "6e8e99", + "ef2952": "f7efff", + "e65a10": "ffe8c3", + "bd2152": "beb7df", + "736321": "6f1b34", + "840808": "72709e", + "000000": "ffffff", + "6b6b6b": "293a52", + "bd9c19": "a42641", + "195abd": "4f3d33", + "94949c": "3f6372", + "ffde19": "d0413f", + "3a424a": "1b253d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/590.json b/public/images/pokemon/variant/590.json new file mode 100644 index 00000000000..d17924e966c --- /dev/null +++ b/public/images/pokemon/variant/590.json @@ -0,0 +1,30 @@ +{ + "1": { + "826b61": "348999", + "9c3a3a": "71de8c", + "846b63": "348999", + "6b4a31": "0d9999", + "684b30": "0d9999", + "422929": "0a5870", + "9c3a7b": "88af70", + "de5a52": "e6ffc1", + "d6639c": "f4ebba", + "7b3131": "49ad77", + "c5b59c": "47d1b5", + "fff7e6": "afecc6" + }, + "2": { + "826b61": "86b8cc", + "9c3a3a": "e098cd", + "846b63": "404f6b", + "6b4a31": "f2f7f9", + "684b30": "2b5caf", + "422929": "b9d9e5", + "9c3a7b": "b1c4dd", + "de5a52": "ffbfcb", + "d6639c": "f2f7f9", + "7b3131": "ce88bb", + "c5b59c": "498cd3", + "fff7e6": "6ac2e2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/591.json b/public/images/pokemon/variant/591.json new file mode 100644 index 00000000000..d0290501b39 --- /dev/null +++ b/public/images/pokemon/variant/591.json @@ -0,0 +1,42 @@ +{ + "1": { + "423231": "0c7588", + "533f3a": "094164", + "604740": "0b7f79", + "6b314a": "49ad77", + "423131": "0a5870", + "8c735a": "348999", + "cec5c5": "afecc6", + "634b42": "094164", + "9c9484": "47d1b5", + "423331": "0c7588", + "634c42": "348999", + "291919": "094164", + "ad3163": "71de8c", + "de8ca5": "d8cfa0", + "634a42": "0d9999", + "6b314c": "749660", + "ffadce": "f4ebba", + "de528c": "e6ffc1" + }, + "2": { + "423231": "404f6b", + "533f3a": "223656", + "604740": "3b6aa0", + "6b314a": "ad629a", + "423131": "9bb6c1", + "8c735a": "2b5caf", + "cec5c5": "6ac2e2", + "634b42": "223656", + "9c9484": "56a1e2", + "423331": "9bb6c1", + "634c42": "3f7dc7", + "291919": "5e718e", + "ad3163": "e098cd", + "de8ca5": "b1c4dd", + "634a42": "f2f7f9", + "6b314c": "65788e", + "ffadce": "f4f8f9", + "de528c": "ffbfcb" + } +} \ No newline at end of file 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/616.json b/public/images/pokemon/variant/616.json new file mode 100644 index 00000000000..184360b3734 --- /dev/null +++ b/public/images/pokemon/variant/616.json @@ -0,0 +1,30 @@ +{ + "1": { + "3a8442": "4e3671", + "42bd31": "775998", + "313131": "491722", + "c5c5d6": "f9c347", + "9494ad": "dc862d", + "ff4a7b": "6ba779", + "630021": "204b4f", + "b5214a": "346c65", + "de3163": "4a8474", + "000000": "ffffff", + "29315a": "69130d", + "5a5a7b": "b34516" + }, + "2": { + "3a8442": "dfa75c", + "42bd31": "fff07e", + "313131": "171e2f", + "c5c5d6": "6e8e99", + "9494ad": "3f6372", + "ff4a7b": "8cb0d6", + "630021": "2e3469", + "b5214a": "4f62a4", + "de3163": "6b8bbf", + "000000": "ffffff", + "29315a": "1b253d", + "5a5a7b": "293a52" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/617.json b/public/images/pokemon/variant/617.json new file mode 100644 index 00000000000..7c2951b5571 --- /dev/null +++ b/public/images/pokemon/variant/617.json @@ -0,0 +1,30 @@ +{ + "1": { + "ffffff": "fff47e", + "a5846b": "5a6675", + "42b55a": "4e3671", + "c53a6b": "427b6b", + "bdbdce": "df9847", + "527b42": "362658", + "732931": "214c49", + "ff4a7b": "6ba779", + "6b84c5": "eef5ff", + "3a2919": "192638", + "000000": "ffffff", + "293a6b": "69719e", + "5a6384": "b8c5e5" + }, + "2": { + "a5846b": "637974", + "42b55a": "415c69", + "c53a6b": "dcaa47", + "527b42": "1d2a3b", + "732931": "8a5727", + "ff4a7b": "ffee72", + "6b84c5": "b43d40", + "3a2919": "2a2235", + "000000": "ffffff", + "293a6b": "461b2e", + "5a6384": "7b2c3d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/621.json b/public/images/pokemon/variant/621.json new file mode 100644 index 00000000000..1c347dcadc8 --- /dev/null +++ b/public/images/pokemon/variant/621.json @@ -0,0 +1,28 @@ +{ + "1": { + "d6bd6b": "ac8b5e", + "940042": "1a2248", + "635231": "605127", + "104a8c": "7e231b", + "8c7b5a": "73654b", + "efc500": "5c7886", + "103163": "601111", + "521031": "0f1330", + "d60042": "26335d", + "316bad": "a13b2c", + "d65273": "be5b5e" + }, + "2": { + "d6bd6b": "ffbc30", + "940042": "177297", + "635231": "be6e18", + "104a8c": "c9bb9a", + "8c7b5a": "da8921", + "efc500": "ffd437", + "103163": "a0896b", + "521031": "0f4973", + "d60042": "24aec0", + "316bad": "e3ddbd", + "d65273": "c583a5" + } +} \ No newline at end of file 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/6503.json b/public/images/pokemon/variant/6503.json new file mode 100644 index 00000000000..c6cc21b45db --- /dev/null +++ b/public/images/pokemon/variant/6503.json @@ -0,0 +1,34 @@ +{ + "1": { + "282f62": "f7d9de", + "c4c5cf": "e3c2ca", + "84a4a7": "563785", + "a82c47": "d45b9e", + "8aa3a3": "6b415b", + "494a48": "3d2439", + "1d3962": "28142c", + "d75063": "b73891", + "1e224e": "dc95ae", + "1e5b9b": "4d244b", + "181531": "a26579", + "6b1c34": "8f3396", + "597471": "332a59", + "8da8a8": "a58b90" + }, + "2": { + "282f62": "efdfee", + "c4c5cf": "232d2e", + "84a4a7": "41857b", + "a82c47": "8abfb1", + "8aa3a3": "181f20", + "faf9f9": "2c3940", + "494a48": "0b0f18", + "1d3962": "321e1e", + "d75063": "8f65d8", + "1e224e": "ba9bc1", + "1e5b9b": "5e3e38", + "181531": "715b72", + "6b1c34": "6d9d9a", + "597471": "2a5c57" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/656.json b/public/images/pokemon/variant/656.json new file mode 100644 index 00000000000..5037f86f22a --- /dev/null +++ b/public/images/pokemon/variant/656.json @@ -0,0 +1,32 @@ +{ + "1": { + "838394": "4d7dc5", + "62ace6": "8363af", + "7bcdff": "9c75c2", + "fdea88": "ddfff9", + "a1a1c4": "7ab7ec", + "c9b241": "97d6e2", + "ccbd70": "bae7e8", + "174592": "37408c", + "f8f8f8": "b1e5ff", + "9c9cc5": "5385c7", + "cdcde6": "7eb7e8", + "396a83": "362864", + "5a94cd": "7054a4" + }, + "2": { + "838394": "cc6845", + "62ace6": "c44848", + "7bcdff": "dd6155", + "fdea88": "ddfff9", + "a1a1c4": "f7c685", + "c9b241": "97d6e2", + "ccbd70": "bae7e8", + "174592": "198158", + "f8f8f8": "fff4bd", + "9c9cc5": "c96a48", + "cdcde6": "f7b785", + "396a83": "5c0d33", + "5a94cd": "a92f3f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/657.json b/public/images/pokemon/variant/657.json new file mode 100644 index 00000000000..773b4d2efc1 --- /dev/null +++ b/public/images/pokemon/variant/657.json @@ -0,0 +1,32 @@ +{ + "1": { + "f8f8f8": "8dcfff", + "efc653": "abd7db", + "737373": "0f3f82", + "0b566a": "281f52", + "ffec72": "c9fff5", + "002c58": "1c0726", + "bfbfbf": "4386df", + "006ba6": "4e1852", + "009dd5": "61255e", + "0b4a7a": "340f3d", + "e1a03a": "78c7c7", + "41ccf5": "7755a7", + "2896b5": "4b3578" + }, + "2": { + "f8f8f8": "fff6c7", + "efc653": "abd7db", + "737373": "df6a50", + "0b566a": "7e1628", + "ffec72": "ddfff9", + "002c58": "0c3b54", + "bfbfbf": "ffc996", + "006ba6": "239c91", + "009dd5": "37b8ac", + "0b4a7a": "156f78", + "e1a03a": "86abbb", + "41ccf5": "dd7355", + "2896b5": "a92f3a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/658-ash.json b/public/images/pokemon/variant/658-ash.json new file mode 100644 index 00000000000..1845b2b1bea --- /dev/null +++ b/public/images/pokemon/variant/658-ash.json @@ -0,0 +1,46 @@ +{ + "1": { + "265595": "432b6c", + "3f4447": "466698", + "de3431": "3fca9f", + "f8f8f8": "a1e9f0", + "f4f4f4": "d7eff4", + "7b282e": "0e3e81", + "6b1d1d": "206d74", + "4ebdd9": "41a7b0", + "bfb169": "165e78", + "bfbfbf": "8cc7d4", + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "fff0a6": "208698", + "3e7acc": "6b4592", + "18335c": "170738", + "f2798d": "8dcfff", + "f01818": "39b88f", + "7ddeff": "7ddcd6", + "268794": "1c3e58", + "282c35": "271f4c" + }, + "2": { + "265595": "cc7251", + "3f4447": "466698", + "de3431": "9ceec6", + "f8f8f8": "89d2b8", + "f4f4f4": "d7eff4", + "7b282e": "152a5c", + "6b1d1d": "356e8d", + "4ebdd9": "2f6e74", + "bfb169": "431022", + "bfbfbf": "8cc7d4", + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "fff0a6": "4d2637", + "3e7acc": "ecbb7a", + "18335c": "9f2727", + "f2798d": "5eb4a9", + "f01818": "ffe88d", + "7ddeff": "46988d", + "268794": "1c3e58", + "282c35": "4d2637" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/658.json b/public/images/pokemon/variant/658.json new file mode 100644 index 00000000000..25a6dad359d --- /dev/null +++ b/public/images/pokemon/variant/658.json @@ -0,0 +1,34 @@ +{ + "1": { + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "66d9ff": "7ddcd6", + "3d61cc": "6b4592", + "fff0a6": "208698", + "c92e2e": "73c5ff", + "937f69": "406695", + "c2c1bc": "89b0d7", + "f2798d": "8dcfff", + "f7f7f7": "d8ffff", + "2e4999": "432b6c", + "bfb169": "165e78", + "803340": "0e3e81", + "1b2a59": "170738" + }, + "2": { + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "66d9ff": "48968c", + "3d61cc": "ecbb7a", + "fff0a6": "652240", + "c92e2e": "63bf9b", + "937f69": "466698", + "c2c1bc": "8cc7d4", + "f2798d": "5eb4a9", + "f7f7f7": "d7eff4", + "2e4999": "cc7251", + "bfb169": "431022", + "803340": "152a5c", + "1b2a59": "9f2727" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-continental.json b/public/images/pokemon/variant/666-continental.json index 67e25fc79b4..92614fb346c 100644 --- a/public/images/pokemon/variant/666-continental.json +++ b/public/images/pokemon/variant/666-continental.json @@ -2,6 +2,7 @@ "1": { "101010": "101010", "595959": "724b7a", + "555353": "724b7a", "d18257": "d18257", "f9bd55": "f9bd55", "303030": "402746", @@ -15,5 +16,23 @@ "c3c3c3": "ffeaff", "811c1c": "811c1c", "e08528": "e08528" + }, + "2": { + "101010": "101010", + "595959": "8f551e", + "555353": "e99b44", + "d18257": "d18257", + "f9bd55": "f9bd55", + "303030": "6d2d0d", + "f8f05e": "f8f05e", + "d24c3e": "d24c3e", + "675220": "9c5c19", + "ceab62": "e99b44", + "707068": "e99b44", + "504a4a": "9c5c19", + "aa5844": "aa5844", + "c3c3c3": "f8f27f", + "811c1c": "811c1c", + "308528": "308528" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-continental_3.json b/public/images/pokemon/variant/666-continental_3.json deleted file mode 100644 index ed0fee105bb..00000000000 --- a/public/images/pokemon/variant/666-continental_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-continental_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:70eae64f87d7226958d0443e262bab16:5ea86607863e872365dc956f4d819752:23aaac2256d564b9d8a58d7de70397c3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-continental_3.png b/public/images/pokemon/variant/666-continental_3.png deleted file mode 100644 index 8052f0360f5..00000000000 Binary files a/public/images/pokemon/variant/666-continental_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/666-fancy.json b/public/images/pokemon/variant/666-fancy.json new file mode 100644 index 00000000000..1f31ac6983d --- /dev/null +++ b/public/images/pokemon/variant/666-fancy.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "811c1c": "811c1c", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "d9edd4", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "ffeaff", + "f2d4e3": "f2d4e3", + "ead2e3": "ffeaff" + }, + "2": { + "101010": "101010", + "303030": "00771b", + "675220": "b9c05a", + "504a4a": "b9c05a", + "595959": "6f9f42", + "707068": "e3e982", + "811c1c": "811c1c", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "e3e982", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "fcf1ff", + "f2d4e3": "f2d4e3", + "ead2e3": "fcf1ff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-fancy_2.json b/public/images/pokemon/variant/666-fancy_2.json deleted file mode 100644 index d2dd365d3ed..00000000000 --- a/public/images/pokemon/variant/666-fancy_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_2.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2d5276d8c199bae070dbaa73293fd554:a099f55391d8e4bbae565d4a170574c9:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-fancy_2.png b/public/images/pokemon/variant/666-fancy_2.png deleted file mode 100644 index 68e535cf3a1..00000000000 Binary files a/public/images/pokemon/variant/666-fancy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/666-fancy_3.json b/public/images/pokemon/variant/666-fancy_3.json deleted file mode 100644 index be0625b1360..00000000000 --- a/public/images/pokemon/variant/666-fancy_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2d5276d8c199bae070dbaa73293fd554:a099f55391d8e4bbae565d4a170574c9:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-fancy_3.png b/public/images/pokemon/variant/666-fancy_3.png deleted file mode 100644 index 2accdb4f486..00000000000 Binary files a/public/images/pokemon/variant/666-fancy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/666-high-plains.json b/public/images/pokemon/variant/666-high-plains.json index fd26a077f34..85a5eb24cc3 100644 --- a/public/images/pokemon/variant/666-high-plains.json +++ b/public/images/pokemon/variant/666-high-plains.json @@ -14,7 +14,8 @@ "c3c3c3": "ffeaff", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" }, "2": { "101010": "101010", @@ -31,6 +32,7 @@ "c3c3c3": "edc67c", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-monsoon.json b/public/images/pokemon/variant/666-monsoon.json index 8aaedab67ca..915d471b2b1 100644 --- a/public/images/pokemon/variant/666-monsoon.json +++ b/public/images/pokemon/variant/666-monsoon.json @@ -1,36 +1,33 @@ { - "1": { - "101010": "101010", - "595959": "724b7a", - "f0f0f8": "f0f0f8", - "303030": "402746", - "675220": "958c8a", - "ceab62": "d9edd4", + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "707068": "a97cbc", - "504a4a": "7f6991", - "4eccd6": "4eccd6", + "ceab62": "d9edd4", "5676de": "5676de", - "c3c3c3": "ffeaff", - "811c1c": "811c1c" - }, - "2": { - "101010": "101010", - "595959": "656565", - "f0f0f8": "f0f0f8", - "303030": "4f4645", - "675220": "2c3593", - "ceab62": "5857bc", - "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "707068": "5857bc", - "504a4a": "2c3593", - "4eccd6": "4eccd6", - "5676de": "5676de", - "c3c3c3": "b8f9f9", - "811c1c": "811c1c" - } + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-ocean.json b/public/images/pokemon/variant/666-ocean.json index 975602c6f9e..23f8d48c681 100644 --- a/public/images/pokemon/variant/666-ocean.json +++ b/public/images/pokemon/variant/666-ocean.json @@ -22,7 +22,7 @@ "e1384d": "e1384d", "f4ad61": "f4ad61", "f8ef6a": "f8ef6a", - "303030": "b56208", + "303030": "b54908", "675220": "bc601c", "ceab62": "ea8742", "707068": "ea8742", diff --git a/public/images/pokemon/variant/666-poke-ball.json b/public/images/pokemon/variant/666-poke-ball.json index e83072c51a5..fe6b42f6ef3 100644 --- a/public/images/pokemon/variant/666-poke-ball.json +++ b/public/images/pokemon/variant/666-poke-ball.json @@ -14,6 +14,25 @@ "504a4a": "7f6991", "c3c3c3": "ffeaff", "811c1c": "811c1c", - "a9a99e": "a9a99e" + "a9a99e": "a9a99e", + "2c2b2b": "402746" + }, + "2": { + "101010": "101010", + "f8f8f8": "00006d", + "303030": "ae001a", + "2c2b2b": "660000", + "504a4a": "a70038", + "595959": "df0036", + "c3c3c3": "f0a6bf", + "707068": "d5375a", + "a9a99e": "000050", + "811c1c": "811c1c", + "971d1d": "040046", + "b72c2c": "00005e", + "dc4b4b": "19007d", + "e97e7e": "2e2095", + "675220": "a70038", + "ceab62": "d5375a" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-poke-ball_3.json b/public/images/pokemon/variant/666-poke-ball_3.json deleted file mode 100644 index d506cef780e..00000000000 --- a/public/images/pokemon/variant/666-poke-ball_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ff5b539e59b71fa67f66f26bb0f2e9d:45bec6d118350401c25850e5f12a25af:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-poke-ball_3.png b/public/images/pokemon/variant/666-poke-ball_3.png deleted file mode 100644 index 64a072a7cbe..00000000000 Binary files a/public/images/pokemon/variant/666-poke-ball_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/666-river.json b/public/images/pokemon/variant/666-river.json index 818e1ee3989..c7e5e288d05 100644 --- a/public/images/pokemon/variant/666-river.json +++ b/public/images/pokemon/variant/666-river.json @@ -1,19 +1,40 @@ { - "2": { - "101010": "101010", - "595959": "8a5702", - "ceab62": "d9a666", - "303030": "7b2800", - "625841": "625841", - "bc813f": "bc813f", - "9c9143": "9c9143", - "675220": "ae7f41", - "707068": "d9a666", - "504a4a": "ae7f41", - "c3c3c3": "e3c384", - "811c1c": "811c1c", - "279ec2": "279ec2", - "59c9d3": "59c9d3", - "1d726a": "1d726a" - } + "1": { + "101010": "101010", + "303030": "402746", + "4a412c": "4a412c", + "675220": "958c8a", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "7f6991", + "595959": "724b7a", + "625841": "625841", + "707068": "a97cbc", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "c3c3c3", + "d2a862": "d9edd4" + }, + "2": { + "101010": "101010", + "303030": "7b2800", + "4a412c": "4a412c", + "675220": "ae7f41", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "ae7f41", + "595959": "8a5702", + "625841": "625841", + "707068": "d9a666", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "e3c384", + "d2a862": "d2a862" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/666-river_2.json b/public/images/pokemon/variant/666-river_2.json deleted file mode 100644 index 0da0f00b0be..00000000000 --- a/public/images/pokemon/variant/666-river_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-river_2.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:39f778a45b20cfcfded5a350ee1a02e9:5d7e7e891b7da588a2ebd23733da6c2d:fa23dc87fc53ba2cfa532cf440553cf5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/666-river_2.png b/public/images/pokemon/variant/666-river_2.png deleted file mode 100644 index 9b02df92a91..00000000000 Binary files a/public/images/pokemon/variant/666-river_2.png and /dev/null 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.json b/public/images/pokemon/variant/669-red.json index 627fdbeb44f..145228a41c2 100644 --- a/public/images/pokemon/variant/669-red.json +++ b/public/images/pokemon/variant/669-red.json @@ -1,4 +1,22 @@ { + "1": { + "101010": "101010", + "3d6629": "094740", + "665a1f": "3e0547", + "595959": "595959", + "686868": "686868", + "802d2d": "55061c", + "d94c4c": "aa263c", + "e15455": "dc6295", + "ff7373": "cd4a4a", + "65a943": "e493a1", + "6bb347": "1d8057", + "ccb43d": "6a094f", + "ffe14c": "9c235f", + "bfbfbf": "bfbfbf", + "f8f8f8": "f8f8f8", + "fffbfb": "fffbfb" + }, "2": { "665a1f": "393833", "ffe14c": "fdfffb", diff --git a/public/images/pokemon/variant/669-red_2.json b/public/images/pokemon/variant/669-red_2.json deleted file mode 100644 index 33816135db6..00000000000 --- a/public/images/pokemon/variant/669-red_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "669-red_2.png", - "format": "RGBA8888", - "size": { - "w": 46, - "h": 46 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:30be9438b4a7afb54dfbdae88661c2ed:ba8475f09ea3d2213c2462b54bc4a3e0:9f8ada9cf46c4e29f954b2eb815bc4e5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/669-red_2.png b/public/images/pokemon/variant/669-red_2.png deleted file mode 100644 index b898c298fbf..00000000000 Binary files a/public/images/pokemon/variant/669-red_2.png and /dev/null 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/676-dandy.json b/public/images/pokemon/variant/676-dandy.json new file mode 100644 index 00000000000..ac18c8446d9 --- /dev/null +++ b/public/images/pokemon/variant/676-dandy.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "30552b": "423839", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "376277": "4f8fe3", + "9c9f94": "42090e", + "4b4b46": "2b040f", + "508a3c": "aa9999", + "816e64": "a6afb3", + "6eb92b": "eddddd", + "453434": "313439" + }, + "2": { + "594d46": "9c7aca", + "30552b": "6a102e", + "b8bcaf": "ce9ede", + "f1f2ee": "e6c3f8", + "376277": "314173", + "fe3c31": "8362b4", + "9c9f94": "ad76bc", + "4b4b46": "6b3f77", + "508a3c": "ac254b", + "a83c31": "473085", + "816e64": "ae95dc", + "6eb92b": "e44a62", + "453434": "593173" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-debutante.json b/public/images/pokemon/variant/676-debutante.json new file mode 100644 index 00000000000..bf3d0dfe212 --- /dev/null +++ b/public/images/pokemon/variant/676-debutante.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "9c9f94": "42090e", + "f8f9f7": "8a1d1d", + "dfb76a": "aa9999", + "4b4b46": "2b040f", + "bcc0b3": "5e0f16", + "453434": "313439", + "816e64": "a6afb3", + "ac6d40": "423839", + "fbf588": "e3d6d6" + }, + "2": { + "594d46": "48a7d0", + "376277": "717171", + "fe3c31": "762ea8", + "9c9f94": "122a39", + "f8f9f7": "0e728e", + "dfb76a": "c6a65c", + "4b4b46": "021a2f", + "bcc0b3": "0b4b68", + "453434": "122a39", + "a83c31": "521073", + "816e64": "74ccec", + "ac6d40": "684d24", + "fbf588": "ffe998" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-diamond.json b/public/images/pokemon/variant/676-diamond.json new file mode 100644 index 00000000000..72e19d6a853 --- /dev/null +++ b/public/images/pokemon/variant/676-diamond.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "aa3e2b": "423839", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "376277": "4f8fe3", + "645e55": "2b040f", + "d95b37": "aa9999", + "e68a4d": "eddddd", + "453434": "313439", + "816e64": "a6afb3" + }, + "2": { + "594d46": "bd9462", + "aa3e2b": "642c0a", + "b8bcaf": "319c6a", + "f1f2ee": "6abd81", + "376277": "c56e34", + "fe3c31": "b37e47", + "645e55": "1b684b", + "d95b37": "935927", + "e68a4d": "b37e47", + "453434": "6c4b2d", + "a83c31": "642c0a", + "816e64": "eed59c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-heart.json b/public/images/pokemon/variant/676-heart.json new file mode 100644 index 00000000000..895b5b49e99 --- /dev/null +++ b/public/images/pokemon/variant/676-heart.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "f18598": "48474c", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "e0546c": "2a2a2f", + "376277": "4f8fe3", + "645e55": "2b040f", + "453434": "313439", + "816e64": "a6afb3", + "a73f4f": "19181f" + }, + "2": { + "594d46": "aca49c", + "f18598": "5f5953", + "b8bcaf": "bfc7e8", + "f1f2ee": "e4eafc", + "e0546c": "4c413c", + "376277": "1b1c21", + "fe3c31": "9475de", + "645e55": "7a81b7", + "453434": "837373", + "a83c31": "7249b7", + "816e64": "dadace", + "a73f4f": "2c2320" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-kabuki.json b/public/images/pokemon/variant/676-kabuki.json new file mode 100644 index 00000000000..9d57fc830be --- /dev/null +++ b/public/images/pokemon/variant/676-kabuki.json @@ -0,0 +1,36 @@ +{ + "1": { + "816e64": "a6afb3", + "8f2121": "19181f", + "b01a1a": "2a2a2f", + "d02f2e": "262629", + "594d46": "788087", + "f44b3d": "48474c", + "376277": "4f8fe3", + "68675c": "2b040f", + "453434": "313439", + "8a7d79": "a6afb3", + "9c9f94": "42090e", + "534343": "313439", + "bcc0b3": "5e0f16", + "f1f2ee": "8a1d1d" + }, + "2": { + "816e64": "506e7b", + "8f2121": "1b1d39", + "b01a1a": "305d9e", + "d02f2e": "48578e", + "594d46": "3e5368", + "f66559": "9890ec", + "f44b3d": "4c89d9", + "376277": "436ca1", + "68675c": "192b42", + "453434": "17242f", + "8a7d79": "425a70", + "9c9f94": "468197", + "534343": "233342", + "bcc0b3": "549ab8", + "f1f2ee": "6bcfd9", + "b32524": "8067c6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-la-reine.json b/public/images/pokemon/variant/676-la-reine.json new file mode 100644 index 00000000000..ae73038cfb2 --- /dev/null +++ b/public/images/pokemon/variant/676-la-reine.json @@ -0,0 +1,32 @@ +{ + "1": { + "816e64": "a6afb3", + "31a7bb": "aa9999", + "594d46": "788087", + "2f7387": "423839", + "453434": "313439", + "4b4b46": "2b040f", + "8a7d79": "a6afb3", + "9c9f94": "42090e", + "376277": "4f8fe3", + "56d1d8": "eddddd", + "bcc0b3": "5e0f16", + "f1f2ee": "8a1d1d" + }, + "2": { + "816e64": "973721", + "a83c31": "3041b7", + "31a7bb": "e3b876", + "594d46": "711e1e", + "2f7387": "8e673e", + "453434": "360608", + "4b4b46": "550b0c", + "8a7d79": "a11e24", + "9c9f94": "c63b31", + "376277": "221755", + "56d1d8": "ffec9b", + "bcc0b3": "d9533c", + "f1f2ee": "ee724b", + "fe3c31": "4b77e1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-matron.json b/public/images/pokemon/variant/676-matron.json new file mode 100644 index 00000000000..8fdf48c14a8 --- /dev/null +++ b/public/images/pokemon/variant/676-matron.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "b8bcaf": "5e0f16", + "873a5b": "19181f", + "376277": "4f8fe3", + "9c9f94": "42090e", + "f8f9f7": "8a1d1d", + "d07da9": "48474c", + "5f5951": "2b040f", + "816e64": "a6afb3", + "453434": "313439", + "b95b83": "2a2a2f" + }, + "2": { + "594d46": "d0b5b5", + "b8bcaf": "d95e7e", + "873a5b": "1b447b", + "376277": "2246aa", + "fe3c31": "64edf3", + "9c9f94": "bd4d6a", + "f8f9f7": "fa8c9f", + "d07da9": "64c8f3", + "5f5951": "8a2843", + "a83c31": "45a6d0", + "816e64": "e3d6d6", + "453434": "715456", + "b95b83": "528fcc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-pharaoh.json b/public/images/pokemon/variant/676-pharaoh.json new file mode 100644 index 00000000000..cf6694aa348 --- /dev/null +++ b/public/images/pokemon/variant/676-pharaoh.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "25559c": "2a2a2f", + "217fc4": "48474c", + "f1f2ee": "8a1d1d", + "376277": "4f8fe3", + "9c9f94": "42090e", + "bcc0b3": "5e0f16", + "68675c": "2b040f", + "453434": "313439", + "816e64": "a6afb3", + "243a6f": "19181f" + }, + "2": { + "594d46": "1c1c30", + "25559c": "d0902d", + "217fc4": "eed552", + "f1f2ee": "5e5e75", + "376277": "5e0808", + "fe3c31": "ec4d3e", + "9c9f94": "332b48", + "bcc0b3": "3b3955", + "68675c": "17122f", + "453434": "130b1c", + "a83c31": "a11717", + "816e64": "312c42", + "243a6f": "a15317" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-star.json b/public/images/pokemon/variant/676-star.json new file mode 100644 index 00000000000..e0b0e330676 --- /dev/null +++ b/public/images/pokemon/variant/676-star.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "645e55": "2b040f", + "b8bcaf": "5e0f16", + "3e8ebf": "2a2a2f", + "f1f2ee": "8a1d1d", + "453434": "313439", + "3a5078": "19181f", + "816e64": "a6afb3", + "7dc2e8": "48474c" + }, + "2": { + "594d46": "d7bc4d", + "376277": "647bb1", + "fe3c31": "b5e0f3", + "645e55": "848e75", + "a83c31": "6192aa", + "b8bcaf": "d6dec2", + "3e8ebf": "ac802f", + "f1f2ee": "fcfef5", + "453434": "836329", + "3a5078": "613d11", + "816e64": "f7e784", + "7dc2e8": "cdac4a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676.json b/public/images/pokemon/variant/676.json new file mode 100644 index 00000000000..8c9199960c9 --- /dev/null +++ b/public/images/pokemon/variant/676.json @@ -0,0 +1,21 @@ +{ + "1": { + "bcbca8": "5e0f16", + "606056": "2b040f", + "8e8e7b": "42090e", + "f2f2da": "8a1d1d", + "3f6273": "4f8fe3", + "494340": "788087", + "736b67": "a6afb3" + }, + "2": { + "bcbca8": "a4624a", + "cc2929": "3a240e", + "606056": "4a281b", + "8e8e7b": "805145", + "f2f2da": "c18960", + "3f6273": "4a281b", + "494340": "e6c594", + "736b67": "ffe6ac" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/682.json b/public/images/pokemon/variant/682.json new file mode 100644 index 00000000000..03337345194 --- /dev/null +++ b/public/images/pokemon/variant/682.json @@ -0,0 +1,26 @@ +{ + "1": { + "661f1f": "cd6132", + "bf5f9f": "7c48a1", + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "f24949": "ffa24f", + "7f4d59": "20644e" + }, + "2": { + "661f1f": "daa235", + "bf5f9f": "f0ebdd", + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "a6a6a6": "503851", + "f24949": "ffe664", + "e5e5e5": "6b4767", + "737373": "422f46", + "4d4d4d": "332539", + "7f4d59": "a23812" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/683.json b/public/images/pokemon/variant/683.json new file mode 100644 index 00000000000..42abc0856ad --- /dev/null +++ b/public/images/pokemon/variant/683.json @@ -0,0 +1,32 @@ +{ + "1": { + "661f1f": "b64d29", + "cc7087": "318759", + "ff99b3": "48ab61", + "fff0a6": "fec04b", + "f24949": "ffa24f", + "6b3962": "30185d", + "e5c37e": "d6872c", + "993d80": "4f297e", + "404040": "2c283b", + "b33636": "f4863f", + "7f4d59": "20644e", + "bf5f9f": "7c48a1" + }, + "2": { + "661f1f": "c78925", + "cc7087": "c3561a", + "ff99b3": "da7e29", + "fff0a6": "6d8719", + "a6a6a6": "503851", + "f24949": "ffe664", + "6b3962": "b89477", + "e5c37e": "376d11", + "993d80": "d2bfa1", + "e5e5e5": "6b4767", + "404040": "2a2234", + "b33636": "f0c150", + "7f4d59": "a23812", + "bf5f9f": "f0ebdd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/684.json b/public/images/pokemon/variant/684.json new file mode 100644 index 00000000000..df4240c57d6 --- /dev/null +++ b/public/images/pokemon/variant/684.json @@ -0,0 +1,24 @@ +{ + "1": { + "805963": "2d0c42", + "661a2d": "205025", + "e53964": "689b52", + "ffccd9": "814db1", + "f8f8f8": "caff90", + "cc99a6": "613b84", + "fff2f2": "f39f62", + "7b5760": "b13924", + "ccadad": "df6b40" + }, + "2": { + "805963": "679baa", + "661a2d": "26061b", + "e53964": "612747", + "ffccd9": "cbf6da", + "f8f8f8": "e4819d", + "cc99a6": "93d6ce", + "fff2f2": "746998", + "7b5760": "3c2f51", + "ccadad": "4b4876" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/685.json b/public/images/pokemon/variant/685.json new file mode 100644 index 00000000000..99d52263178 --- /dev/null +++ b/public/images/pokemon/variant/685.json @@ -0,0 +1,28 @@ +{ + "1": { + "f8f8f8": "caff90", + "661a2d": "13391c", + "7b5760": "b13924", + "a62949": "26592b", + "ffccd9": "8961c6", + "ff8ca9": "8dbe6d", + "cc99a6": "613b84", + "e53964": "689b52", + "fff2f2": "f39f62", + "ccadad": "df6b40", + "805963": "2d0c42" + }, + "2": { + "f8f8f8": "e4819d", + "661a2d": "26061b", + "7b5760": "3c2f51", + "a62949": "441838", + "ffccd9": "cbf6da", + "ff8ca9": "8c4264", + "cc99a6": "93d6ce", + "e53964": "612747", + "fff2f2": "746998", + "ccadad": "4b4876", + "805963": "679baa" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/688.json b/public/images/pokemon/variant/688.json new file mode 100644 index 00000000000..e5749f6bb3f --- /dev/null +++ b/public/images/pokemon/variant/688.json @@ -0,0 +1,33 @@ +{ + "1": { + "5890b0": "a9582e", + "385860": "70240f", + "372e27": "220a56", + "6b503b": "373295", + "d0d0d0": "d3bc8c", + "c0e0e8": "e8d37b", + "8a6d45": "4557b5", + "101010": "37160a", + "b7653f": "459aac", + "fcffff": "e8e5c6", + "808080": "7c582e", + "88c0c8": "cd8a50", + "ef8955": "70cccf" + }, + "2": { + "5890b0": "4b0038", + "385860": "2c052a", + "372e27": "1e1324", + "6b503b": "ba9fba", + "d0d0d0": "7eac4e", + "c0e0e8": "a74083", + "8a6d45": "f6eefc", + "101010": "0a391b", + "b7653f": "332149", + "fcffff": "caea77", + "f8f8f8": "ffffff", + "808080": "2a5524", + "88c0c8": "731f5c", + "ef8955": "4a376e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/689.json b/public/images/pokemon/variant/689.json new file mode 100644 index 00000000000..cd6db09c8d2 --- /dev/null +++ b/public/images/pokemon/variant/689.json @@ -0,0 +1,31 @@ +{ + "1": { + "bfeaff": "e8d37b", + "f2f2f2": "e8e5c6", + "5b8da6": "8d5030", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "672e1e", + "b3b3b3": "d3bc8c", + "cc7f70": "459aac", + "85b4cc": "cd8a50", + "ff9f8c": "70cccf", + "66541f": "373295", + "997e2e": "4557b5" + }, + "2": { + "bfeaff": "a74083", + "f2f2f2": "caea77", + "5b8da6": "4b0038", + "595959": "2a5524", + "403410": "3f2a4b", + "3f6273": "3e073b", + "b3b3b3": "7eac4e", + "cc7f70": "332149", + "85b4cc": "731f5c", + "f8f8f8": "dbaf67", + "ff9f8c": "4a376e", + "66541f": "ccb6cc", + "997e2e": "f6eefc" + } +} \ No newline at end of file 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.json b/public/images/pokemon/variant/715.json new file mode 100644 index 00000000000..e43af20a0de --- /dev/null +++ b/public/images/pokemon/variant/715.json @@ -0,0 +1,42 @@ +{ + "1": { + "101010": "101010", + "2b2b2b": "43167f", + "343333": "563d8f", + "3b3b3b": "5f32b1", + "6a3f73": "0f103c", + "287366": "731338", + "575757": "7a5ccc", + "555454": "9166c8", + "801a1a": "5d173d", + "e52e2e": "903b78", + "ffe14c": "ff8a58", + "8e5499": "202558", + "bd70cc": "2f386b", + "3aa694": "a42c54", + "4cd9c1": "d04b6c", + "bfbfbf": "bb9adc", + "f8f8f8": "f8f8f8", + "f7f3f3": "d6c8f1" + }, + "2": { + "101010": "101010", + "2b2b2b": "5e3932", + "343333": "1d060c", + "3b3b3b": "c29484", + "6a3f73": "3b0c18", + "287366": "832714", + "575757": "ecd3c3", + "555454": "2f0d13", + "801a1a": "7c0907", + "e52e2e": "ad3419", + "ffe14c": "49ffcd", + "8e5499": "5b1922", + "bd70cc": "7c2928", + "3aa694": "b8552c", + "4cd9c1": "dd834c", + "bfbfbf": "43191e", + "f8f8f8": "f8f8f8", + "f7f3f3": "5a2a2b" + } +} \ No newline at end of file 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/807.json b/public/images/pokemon/variant/807.json new file mode 100644 index 00000000000..bfb72f3cd42 --- /dev/null +++ b/public/images/pokemon/variant/807.json @@ -0,0 +1,28 @@ +{ + "1": { + "ef8a4e": "4f7bb6", + "484f57": "243058", + "000000": "ffffff", + "727678": "3e5277", + "2759a5": "736599", + "5bd0f2": "ebceff", + "daa936": "5a96b6", + "9d682d": "3c648d", + "f9e455": "7fc7d9", + "2394d8": "b298d8", + "31343e": "14193f" + }, + "2": { + "ef8a4e": "834b95", + "484f57": "cda4cb", + "000000": "ffffff", + "727678": "e8cae3", + "2759a5": "a4378a", + "5bd0f2": "e17197", + "daa936": "331b53", + "9d682d": "1d1044", + "f9e455": "56306f", + "2394d8": "c05192", + "31343e": "a981b1" + } +} \ No newline at end of file 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.json b/public/images/pokemon/variant/859.json new file mode 100644 index 00000000000..703d5d67218 --- /dev/null +++ b/public/images/pokemon/variant/859.json @@ -0,0 +1,30 @@ +{ + "1": { + "e65984": "619544", + "8d3856": "376b2d", + "ffbff5": "dbe797", + "f589c2": "9aba6d", + "45366d": "5b1d15", + "735aac": "a4332d", + "947cd8": "cd643d", + "f42252": "f55c14", + "101010": "101010", + "fdfdfd": "fdfdfd", + "c9c9c9": "c9c9c9", + "8b73d5": "cc5836" + }, + "2": { + "e65984": "4b1736", + "8d3856": "30082d", + "ffbff5": "904f55", + "f589c2": "6b2b3e", + "45366d": "794935", + "735aac": "f0c475", + "947cd8": "d9975b", + "f42252": "fc645a", + "101010": "101010", + "fdfdfd": "fdfdfd", + "c9c9c9": "dad6bf", + "8b73d5": "f9e9a4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/859_2.json b/public/images/pokemon/variant/859_2.json deleted file mode 100644 index 1494c4909f7..00000000000 --- a/public/images/pokemon/variant/859_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "859_2.png", - "format": "RGBA8888", - "size": { - "w": 51, - "h": 51 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 47 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:214cad7b549c6f4fdfaf238d82156c4e:50dda7cd3a060b6b559148b2a281e2fe:40139ec0718e207e11a4ee81c686e004$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/859_2.png b/public/images/pokemon/variant/859_2.png deleted file mode 100644 index 111e51b0892..00000000000 Binary files a/public/images/pokemon/variant/859_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/859_3.json b/public/images/pokemon/variant/859_3.json deleted file mode 100644 index e0d6c3779a8..00000000000 --- a/public/images/pokemon/variant/859_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "859_3.png", - "format": "RGBA8888", - "size": { - "w": 51, - "h": 51 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 51, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 51, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 51, - "h": 47 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:214cad7b549c6f4fdfaf238d82156c4e:50dda7cd3a060b6b559148b2a281e2fe:40139ec0718e207e11a4ee81c686e004$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/859_3.png b/public/images/pokemon/variant/859_3.png deleted file mode 100644 index 1c6888a0f95..00000000000 Binary files a/public/images/pokemon/variant/859_3.png and /dev/null 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/894.json b/public/images/pokemon/variant/894.json new file mode 100644 index 00000000000..99756eea4d5 --- /dev/null +++ b/public/images/pokemon/variant/894.json @@ -0,0 +1,28 @@ +{ + "1": { + "fffbfc": "fefaef", + "e5ee1a": "6ad7f3", + "8eacdd": "caffd1", + "7d542a": "2769aa", + "fefac7": "dffff6", + "bc8b2f": "124b78", + "fffbfb": "dffff6", + "2e3967": "357b84", + "4e7cc9": "9bf1c4", + "375395": "5fcaad", + "ff9dc2": "2c3072", + "d7ad0d": "45a3d6" + }, + "2": { + "e5ee1a": "d4ffd0", + "8eacdd": "c693d8", + "7d542a": "429877", + "fefac7": "ffffff", + "bc8b2f": "2a6f5d", + "2e3967": "514199", + "4e7cc9": "b67cd6", + "375395": "815bad", + "ff9dc2": "382875", + "d7ad0d": "7cd395" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/895.json b/public/images/pokemon/variant/895.json new file mode 100644 index 00000000000..90e3ec96f99 --- /dev/null +++ b/public/images/pokemon/variant/895.json @@ -0,0 +1,32 @@ +{ + "1": { + "641e2c": "722123", + "b63650": "bc623e", + "872c3c": "93372d", + "608d99": "fae5bf", + "2b3d40": "754f47", + "2261ca": "561a5b", + "4b6f78": "f1d4b6", + "e05276": "ef8429", + "242e35": "512c25", + "f27a99": "efb55a", + "76dff5": "ffe8f7", + "3f545f": "ad8473", + "139ee1": "9b407f" + }, + "2": { + "641e2c": "15553b", + "b63650": "3bb349", + "872c3c": "227843", + "608d99": "9b7ebc", + "2b3d40": "241951", + "2261ca": "640e0b", + "4b6f78": "5a4382", + "e05276": "8aea41", + "242e35": "0f0c1e", + "f27a99": "dfff75", + "76dff5": "fffcdf", + "3f545f": "3a2a67", + "139ee1": "98301c" + } +} \ No newline at end of file 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/944.json b/public/images/pokemon/variant/944.json new file mode 100644 index 00000000000..56fc21986f7 --- /dev/null +++ b/public/images/pokemon/variant/944.json @@ -0,0 +1,42 @@ +{ + "1": { + "b5eab2": "75a0d0", + "d4eac7": "8bcfe5", + "bdb2bd": "53a164", + "ceceb7": "3ec295", + "726766": "4f985c", + "4a4860": "372869", + "8ce1b2": "6383c4", + "564a49": "286943", + "000000": "ffffff", + "4ca391": "3a4a8a", + "a571e6": "ffe269", + "774d9b": "d09139", + "97859b": "3f8d59", + "afc6d8": "8056a7", + "efeee1": "88eeab", + "869fad": "5e4090", + "918772": "1c9b8d", + "3a2b2f": "18493f" + }, + "2": { + "b5eab2": "a9c6dc", + "d4eac7": "e2f8ff", + "bdb2bd": "78b0c2", + "ceceb7": "abc1df", + "726766": "5386b9", + "4a4860": "4f133f", + "8ce1b2": "8397c4", + "564a49": "2c4f8a", + "000000": "ffffff", + "4ca391": "6974ad", + "a571e6": "4c5372", + "774d9b": "2c2c46", + "97859b": "5582a4", + "afc6d8": "c23f4f", + "efeee1": "e2f3ff", + "869fad": "902a4b", + "918772": "6777aa", + "3a2b2f": "1e3072" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/945.json b/public/images/pokemon/variant/945.json new file mode 100644 index 00000000000..e22743030f9 --- /dev/null +++ b/public/images/pokemon/variant/945.json @@ -0,0 +1,53 @@ +{ + "1": { + "403f4f": "357747", + "1f2635": "1c193d", + "dcdcc3": "5ddcb2", + "282434": "14463f", + "ebe4e2": "ade273", + "a491a4": "499833", + "e6e2e1": "fffbf3", + "671544": "0f4e67", + "584698": "18153d", + "134175": "a74d2a", + "4f483f": "1b727b", + "323d4a": "2e2452", + "000000": "ffffff", + "8ac2a2": "1a355d", + "d73875": "29ad89", + "e0ebf1": "7ddfee", + "2481b0": "d09139", + "4b616b": "473869", + "38bdda": "ffe269", + "695575": "16613d", + "aca699": "2db3a4", + "8d2151": "157375", + "cedaaa": "2f5b7b" + }, + "2": { + "403f4f": "3b6b9e", + "1f2635": "3b091c", + "dcdcc3": "edf0f1", + "282434": "2d427e", + "ebe4e2": "c23f4f", + "a491a4": "902a4b", + "e6e2e1": "ebf4f9", + "671544": "223969", + "584698": "1f1e43", + "134175": "1c182f", + "4f483f": "5d7487", + "323d4a": "580f1d", + "000000": "ffffff", + "a599a8": "bf888f", + "8ac2a2": "8397c4", + "7c6a84": "965b6f", + "d73875": "68adca", + "2481b0": "2c2c46", + "4b616b": "8a2029", + "38bdda": "494e64", + "695575": "4f133f", + "aca699": "acbfc7", + "8d2151": "4676aa", + "cedaaa": "bad4e8" + } +} \ No newline at end of file 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/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 60ef635b862..6d2da0ed0ee 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -1,11113 +1,2481 @@ { - "1": [ - 0, - 1, - 1 - ], - "2": [ - 0, - 2, - 1 - ], - "3-gigantamax": [ - 0, - 1, - 1 - ], - "3-mega": [ - 0, - 2, - 2 - ], - "3": [ - 0, - 1, - 1 - ], - "4": [ - 0, - 1, - 1 - ], - "5": [ - 0, - 1, - 1 - ], - "6-mega-x": [ - 0, - 1, - 2 - ], - "6-gigantamax": [ - 0, - 1, - 2 - ], - "6-mega-y": [ - 0, - 1, - 2 - ], - "6": [ - 0, - 2, - 2 - ], - "7": [ - 0, - 2, - 2 - ], - "8": [ - 0, - 2, - 2 - ], - "9-gigantamax": [ - 0, - 1, - 2 - ], - "9-mega": [ - 0, - 2, - 2 - ], - "9": [ - 0, - 2, - 2 - ], - "19": [ - 0, - 1, - 1 - ], - "20": [ - 0, - 1, - 1 - ], - "23": [ - 0, - 1, - 1 - ], - "24": [ - 0, - 1, - 1 - ], - "29": [ - 0, - 1, - 1 - ], - "30": [ - 0, - 1, - 1 - ], - "31": [ - 1, - 1, - 1 - ], - "35": [ - 0, - 1, - 2 - ], - "36": [ - 0, - 1, - 1 - ], - "37": [ - 0, - 1, - 1 - ], - "38": [ - 0, - 1, - 1 - ], - "41": [ - 0, - 1, - 1 - ], - "42": [ - 0, - 1, - 1 - ], - "43": [ - 0, - 1, - 1 - ], - "44": [ - 0, - 1, - 1 - ], - "45": [ - 0, - 1, - 1 - ], - "46": [ - 1, - 1, - 1 - ], - "47": [ - 1, - 1, - 1 - ], - "50": [ - 0, - 1, - 1 - ], - "51": [ - 0, - 1, - 1 - ], - "52-gigantamax": [ - 1, - 1, - 1 - ], - "52": [ - 1, - 1, - 1 - ], - "53": [ - 1, - 1, - 1 - ], - "56": [ - 1, - 2, - 2 - ], - "57": [ - 2, - 2, - 2 - ], - "69": [ - 0, - 2, - 2 - ], - "70": [ - 0, - 1, - 1 - ], - "71": [ - 0, - 1, - 1 - ], - "77": [ - 0, - 1, - 1 - ], - "78": [ - 0, - 1, - 1 - ], - "79": [ - 1, - 1, - 1 - ], - "80": [ - 0, - 1, - 1 - ], - "80-mega": [ - 0, - 1, - 1 - ], - "81": [ - 0, - 1, - 1 - ], - "82": [ - 0, - 1, - 1 - ], - "83": [ - 0, - 2, - 2 - ], - "84": [ - 1, - 1, - 1 - ], - "85": [ - 1, - 1, - 1 - ], - "86": [ - 1, - 1, - 1 - ], - "87": [ - 1, - 1, - 1 - ], - "92": [ - 2, - 2, - 2 - ], - "93": [ - 1, - 1, - 1 - ], - "94-gigantamax": [ - 1, - 2, - 2 - ], - "94-mega": [ - 2, - 2, - 2 - ], - "94": [ - 1, - 1, - 1 - ], - "98": [ - 0, - 1, - 1 - ], - "99": [ - 0, - 1, - 1 - ], - "99-gigantamax": [ - 0, - 1, - 1 - ], - "100": [ - 0, - 1, - 1 - ], - "101": [ - 0, - 1, - 1 - ], - "111": [ - 0, - 1, - 1 - ], - "112": [ - 0, - 1, - 1 - ], - "113": [ - 2, - 2, - 2 - ], - "114": [ - 0, - 1, - 1 - ], - "116": [ - 0, - 1, - 1 - ], - "117": [ - 0, - 1, - 1 - ], - "118": [ - 1, - 1, - 1 - ], - "119": [ - 1, - 1, - 1 - ], - "120": [ - 0, - 1, - 1 - ], - "121": [ - 0, - 1, - 1 - ], - "123": [ - 1, - 1, - 1 - ], - "125": [ - 1, - 1, - 2 - ], - "126": [ - 0, - 2, - 1 - ], - "127-mega": [ - 0, - 1, - 1 - ], - "127": [ - 0, - 1, - 1 - ], - "129": [ - 0, - 1, - 1 - ], - "130-mega": [ - 0, - 1, - 1 - ], - "130": [ - 0, - 1, - 1 - ], - "131-gigantamax": [ - 0, - 1, - 1 - ], - "131": [ - 0, - 1, - 1 - ], - "132": [ - 0, - 1, - 1 - ], - "133": [ - 0, - 1, - 1 - ], - "133-partner": [ - 0, - 1, - 1 - ], - "134": [ - 0, - 1, - 1 - ], - "135": [ - 1, - 1, - 1 - ], - "136": [ - 1, - 1, - 1 - ], - "137": [ - 0, - 1, - 1 - ], - "138": [ - 0, - 1, - 1 - ], - "139": [ - 0, - 1, - 2 - ], - "140": [ - 0, - 1, - 1 - ], - "141": [ - 0, - 2, - 2 - ], - "142-mega": [ - 0, - 1, - 1 - ], - "142": [ - 0, - 1, - 1 - ], - "144": [ - 1, - 2, - 2 - ], - "145": [ - 1, - 1, - 1 - ], - "146": [ - 1, - 1, - 1 - ], - "147": [ - 0, - 1, - 1 - ], - "148": [ - 0, - 1, - 1 - ], - "149": [ - 0, - 1, - 1 - ], - "150-mega-x": [ - 0, - 1, - 1 - ], - "150-mega-y": [ - 0, - 1, - 1 - ], - "150": [ - 0, - 1, - 1 - ], - "151": [ - 0, - 1, - 1 - ], - "161": [ - 0, - 1, - 2 - ], - "162": [ - 0, - 1, - 1 - ], - "163": [ - 0, - 1, - 1 - ], - "164": [ - 0, - 2, - 2 - ], - "169": [ - 0, - 1, - 1 - ], - "173": [ - 0, - 1, - 2 - ], - "175": [ - 1, - 1, - 1 - ], - "176": [ - 1, - 1, - 1 - ], - "177": [ - 0, - 1, - 1 - ], - "178": [ - 0, - 2, - 2 - ], - "179": [ - 0, - 1, - 1 - ], - "180": [ - 0, - 2, - 2 - ], - "181-mega": [ - 0, - 1, - 2 - ], - "181": [ - 0, - 1, - 1 - ], - "182": [ - 0, - 1, - 1 - ], - "183": [ - 0, - 1, - 2 - ], - "184": [ - 0, - 2, - 2 - ], - "185": [ - 0, - 1, - 1 - ], - "190": [ - 0, - 1, - 1 - ], - "193": [ - 0, - 1, - 1 - ], - "196": [ - 1, - 1, - 1 - ], - "197": [ - 0, - 1, - 1 - ], - "199": [ - 2, - 1, - 1 - ], - "200": [ - 1, - 1, - 1 - ], - "201-m": [ - 0, - 1, - 1 - ], - "201-question": [ - 0, - 1, - 1 - ], - "201-j": [ - 0, - 1, - 1 - ], - "201-l": [ - 0, - 1, - 1 - ], - "201-h": [ - 0, - 1, - 1 - ], - "201-x": [ - 0, - 1, - 1 - ], - "201-exclamation": [ - 0, - 1, - 1 - ], - "201-q": [ - 0, - 1, - 1 - ], - "201-s": [ - 0, - 1, - 1 - ], - "201-c": [ - 0, - 1, - 1 - ], - "201-u": [ - 0, - 1, - 1 - ], - "201-t": [ - 0, - 1, - 1 - ], - "201-z": [ - 0, - 1, - 1 - ], - "201-d": [ - 0, - 1, - 1 - ], - "201-b": [ - 0, - 1, - 1 - ], - "201-g": [ - 0, - 1, - 1 - ], - "201-k": [ - 0, - 1, - 1 - ], - "201-i": [ - 0, - 1, - 1 - ], - "201-p": [ - 0, - 1, - 1 - ], - "201-e": [ - 0, - 1, - 1 - ], - "201-y": [ - 0, - 1, - 1 - ], - "201-r": [ - 0, - 1, - 1 - ], - "201-f": [ - 0, - 1, - 1 - ], - "201-n": [ - 0, - 1, - 1 - ], - "201-v": [ - 0, - 1, - 1 - ], - "201-a": [ - 0, - 1, - 1 - ], - "201-w": [ - 0, - 1, - 1 - ], - "201-o": [ - 0, - 1, - 1 - ], - "203": [ - 0, - 1, - 1 - ], - "206": [ - 0, - 1, - 1 - ], - "207": [ - 0, - 1, - 1 - ], - "212-mega": [ - 1, - 1, - 1 - ], - "212": [ - 1, - 1, - 1 - ], - "213": [ - 0, - 1, - 1 - ], - "215": [ - 0, - 1, - 1 - ], - "216": [ - 1, - 1, - 1 - ], - "217": [ - 1, - 1, - 1 - ], - "222": [ - 0, - 1, - 1 - ], - "226": [ - 0, - 2, - 2 - ], - "227": [ - 0, - 1, - 1 - ], - "228": [ - 0, - 1, - 1 - ], - "229": [ - 0, - 1, - 1 - ], - "229-mega": [ - 0, - 1, - 1 - ], - "230": [ - 0, - 1, - 1 - ], - "231": [ - 0, - 1, - 1 - ], - "232": [ - 0, - 1, - 1 - ], - "233": [ - 0, - 1, - 1 - ], - "235": [ - 0, - 1, - 1 - ], - "239": [ - 1, - 1, - 2 - ], - "240": [ - 0, - 1, - 1 - ], - "242": [ - 2, - 2, - 2 - ], - "243": [ - 0, - 1, - 1 - ], - "244": [ - 0, - 2, - 2 - ], - "245": [ - 0, - 1, - 1 - ], - "246": [ - 0, - 1, - 1 - ], - "247": [ - 0, - 1, - 1 - ], - "248": [ - 0, - 1, - 1 - ], - "248-mega": [ - 0, - 2, - 1 - ], - "249": [ - 0, - 2, - 2 - ], - "250": [ - 0, - 2, - 2 - ], - "251": [ - 0, - 1, - 1 - ], - "255": [ - 0, - 1, - 1 - ], - "256": [ - 0, - 1, - 1 - ], - "257": [ - 0, - 1, - 2 - ], - "257-mega": [ - 0, - 1, - 1 - ], - "261": [ - 0, - 1, - 1 - ], - "262": [ - 0, - 1, - 1 - ], - "263": [ - 0, - 1, - 1 - ], - "264": [ - 0, - 1, - 1 - ], - "278": [ - 1, - 1, - 1 - ], - "279": [ - 1, - 1, - 1 - ], - "280": [ - 0, - 1, - 1 - ], - "281": [ - 0, - 1, - 1 - ], - "282-mega": [ - 0, - 2, - 2 - ], - "282": [ - 0, - 1, - 1 - ], - "285": [ - 0, - 1, - 1 - ], - "286": [ - 0, - 1, - 1 - ], - "290": [ - 1, - 1, - 1 - ], - "291": [ - 2, - 2, - 2 - ], - "292": [ - 2, - 1, - 2 - ], - "298": [ - 0, - 2, - 2 - ], - "300": [ - 1, - 1, - 1 - ], - "301": [ - 1, - 1, - 1 - ], - "302": [ - 0, - 1, - 1 - ], - "302-mega": [ - 0, - 1, - 1 - ], - "303-mega": [ - 1, - 1, - 1 - ], - "303": [ - 0, - 1, - 1 - ], - "304": [ - 1, - 1, - 1 - ], - "305": [ - 1, - 1, - 1 - ], - "306-mega": [ - 1, - 1, - 1 - ], - "306": [ - 1, - 1, - 1 - ], - "307": [ - 0, - 1, - 1 - ], - "308-mega": [ - 0, - 1, - 1 - ], - "308": [ - 0, - 2, - 1 - ], - "309": [ - 0, - 1, - 1 - ], - "310-mega": [ - 0, - 1, - 1 - ], - "310": [ - 0, - 1, - 1 - ], - "311": [ - 1, - 1, - 1 - ], - "312": [ - 0, - 1, - 1 - ], - "315": [ - 0, - 1, - 1 - ], - "320": [ - 0, - 1, - 1 - ], - "321": [ - 0, - 1, - 1 - ], - "327": [ - 0, - 1, - 1 - ], - "328": [ - 0, - 1, - 1 - ], - "329": [ - 0, - 1, - 2 - ], - "330": [ - 0, - 1, - 1 - ], - "333": [ - 0, - 1, - 1 - ], - "334-mega": [ - 0, - 2, - 1 - ], - "334": [ - 0, - 2, - 2 - ], - "335": [ - 0, - 2, - 2 - ], - "336": [ - 0, - 1, - 1 - ], - "337": [ - 0, - 1, - 1 - ], - "338": [ - 0, - 1, - 1 - ], - "339": [ - 0, - 1, - 1 - ], - "340": [ - 0, - 1, - 2 - ], - "341": [ - 0, - 2, - 2 - ], - "342": [ - 0, - 2, - 2 - ], - "351-rainy": [ - 1, - 2, - 2 - ], - "351-snowy": [ - 1, - 1, - 1 - ], - "351-sunny": [ - 1, - 2, - 2 - ], - "351": [ - 0, - 2, - 2 - ], - "352": [ - 1, - 1, - 1 - ], - "353": [ - 0, - 1, - 1 - ], - "354": [ - 0, - 1, - 1 - ], - "354-mega": [ - 0, - 1, - 1 - ], - "357": [ - 0, - 1, - 1 - ], - "358": [ - 2, - 1, - 1 - ], - "361": [ - 0, - 1, - 1 - ], - "362": [ - 0, - 2, - 2 - ], - "362-mega": [ - 0, - 1, - 1 - ], - "369": [ - 0, - 1, - 1 - ], - "370": [ - 0, - 1, - 1 - ], - "371": [ - 0, - 1, - 1 - ], - "372": [ - 0, - 1, - 1 - ], - "373-mega": [ - 0, - 2, - 2 - ], - "373": [ - 0, - 1, - 1 - ], - "374": [ - 0, - 1, - 1 - ], - "375": [ - 0, - 1, - 1 - ], - "376-mega": [ - 0, - 1, - 1 - ], - "376": [ - 0, - 1, - 1 - ], - "380-mega": [ - 0, - 1, - 1 - ], - "380": [ - 0, - 1, - 1 - ], - "381-mega": [ - 0, - 1, - 1 - ], - "381": [ - 0, - 1, - 1 - ], - "382-primal": [ - 0, - 1, - 1 - ], - "382": [ - 0, - 1, - 1 - ], - "383-primal": [ - 0, - 1, - 1 - ], - "383": [ - 0, - 1, - 1 - ], - "384-mega": [ - 0, - 2, - 1 - ], - "384": [ - 0, - 1, - 1 - ], - "385": [ - 1, - 1, - 1 - ], - "387": [ - 0, - 1, - 1 - ], - "388": [ - 0, - 1, - 1 - ], - "389": [ - 0, - 1, - 1 - ], - "393": [ - 0, - 1, - 1 - ], - "394": [ - 0, - 1, - 1 - ], - "395": [ - 0, - 1, - 1 - ], - "399": [ - 0, - 1, - 1 - ], - "400": [ - 0, - 1, - 1 - ], - "401": [ - 0, - 1, - 1 - ], - "402": [ - 0, - 1, - 1 - ], - "406": [ - 0, - 1, - 1 - ], - "407": [ - 0, - 1, - 1 - ], - "412-sandy": [ - 2, - 2, - 2 - ], - "412-plant": [ - 1, - 1, - 1 - ], - "412-trash": [ - 1, - 1, - 1 - ], - "413-plant": [ - 2, - 2, - 2 - ], - "413-trash": [ - 1, - 1, - 1 - ], - "413-sandy": [ - 1, - 1, - 1 - ], - "414": [ - 0, - 1, - 1 - ], - "418": [ - 0, - 1, - 1 - ], - "419": [ - 0, - 1, - 1 - ], - "422-west": [ - 1, - 1, - 1 - ], - "422-east": [ - 1, - 1, - 1 - ], - "423-west": [ - 1, - 1, - 1 - ], - "423-east": [ - 1, - 1, - 1 - ], - "424": [ - 0, - 1, - 1 - ], - "425": [ - 0, - 1, - 1 - ], - "426": [ - 0, - 1, - 1 - ], - "427": [ - 0, - 1, - 1 - ], - "428-mega": [ - 0, - 1, - 1 - ], - "428": [ - 0, - 1, - 1 - ], - "429": [ - 1, - 1, - 1 - ], - "433": [ - 1, - 1, - 1 - ], - "436": [ - 0, - 1, - 1 - ], - "437": [ - 0, - 1, - 1 - ], - "438": [ - 0, - 1, - 1 - ], - "440": [ - 1, - 1, - 2 - ], - "441": [ - 0, - 1, - 1 - ], - "442": [ - 0, - 1, - 1 - ], - "443": [ - 1, - 1, - 1 - ], - "444": [ - 1, - 1, - 1 - ], - "445-mega": [ - 1, - 1, - 1 - ], - "445": [ - 1, - 1, - 1 - ], - "447": [ - 1, - 1, - 1 - ], - "448-mega": [ - 1, - 1, - 1 - ], - "448": [ - 1, - 1, - 1 - ], - "453": [ - 0, - 1, - 1 - ], - "454": [ - 0, - 1, - 1 - ], - "456": [ - 0, - 1, - 1 - ], - "457": [ - 0, - 1, - 1 - ], - "458": [ - 0, - 1, - 1 - ], - "461": [ - 0, - 1, - 1 - ], - "462": [ - 0, - 1, - 1 - ], - "464": [ - 0, - 1, - 1 - ], - "465": [ - 0, - 1, - 1 - ], - "466": [ - 1, - 1, - 2 - ], - "467": [ - 0, - 1, - 1 - ], - "468": [ - 1, - 1, - 1 - ], - "469": [ - 0, - 1, - 1 - ], - "470": [ - 1, - 1, - 1 - ], - "471": [ - 1, - 2, - 2 - ], - "472": [ - 0, - 1, - 1 - ], - "474": [ - 0, - 1, - 1 - ], - "475-mega": [ - 0, - 2, - 2 - ], - "475": [ - 0, - 1, - 1 - ], - "478": [ - 0, - 2, - 1 - ], - "479-heat": [ - 0, - 1, - 1 - ], - "479-wash": [ - 0, - 1, - 1 - ], - "479-mow": [ - 0, - 1, - 1 - ], - "479-frost": [ - 0, - 1, - 1 - ], - "479": [ - 0, - 1, - 1 - ], - "479-fan": [ - 0, - 1, - 1 - ], - "480": [ - 1, - 1, - 1 - ], - "481": [ - 1, - 1, - 1 - ], - "482": [ - 1, - 1, - 1 - ], - "485": [ - 0, - 1, - 1 - ], - "487-altered": [ - 0, - 1, - 1 - ], - "487-origin": [ - 0, - 1, - 1 - ], - "488": [ - 0, - 1, - 1 - ], - "489": [ - 1, - 1, - 1 - ], - "490": [ - 1, - 1, - 1 - ], - "491": [ - 0, - 1, - 1 - ], - "492-land": [ - 0, - 2, - 1 - ], - "492-sky": [ - 0, - 1, - 1 - ], - "494": [ - 0, - 1, - 1 - ], - "495": [ - 0, - 1, - 1 - ], - "496": [ - 0, - 1, - 1 - ], - "497": [ - 0, - 1, - 1 - ], - "517": [ - 0, - 1, - 1 - ], - "518": [ - 0, - 1, - 1 - ], - "524": [ - 0, - 1, - 1 - ], - "525": [ - 0, - 1, - 1 - ], - "526": [ - 0, - 2, - 2 - ], - "529": [ - 0, - 2, - 2 - ], - "530": [ - 0, - 2, - 2 - ], - "531": [ - 0, - 1, - 1 - ], - "531-mega": [ - 0, - 1, - 1 - ], - "532": [ - 0, - 1, - 1 - ], - "533": [ - 0, - 1, - 1 - ], - "534": [ - 0, - 1, - 1 - ], - "538": [ - 0, - 1, - 1 - ], - "539": [ - 0, - 2, - 2 - ], - "540": [ - 0, - 1, - 1 - ], - "541": [ - 0, - 1, - 1 - ], - "542": [ - 0, - 1, - 1 - ], - "543": [ - 0, - 1, - 2 - ], - "544": [ - 0, - 1, - 2 - ], - "545": [ - 0, - 1, - 1 - ], - "546": [ - 0, - 1, - 1 - ], - "547": [ - 0, - 1, - 1 - ], - "548": [ - 1, - 1, - 1 - ], - "549": [ - 0, - 1, - 2 - ], - "551": [ - 0, - 1, - 1 - ], - "552": [ - 0, - 1, - 1 - ], - "553": [ - 0, - 1, - 1 - ], - "556": [ - 0, - 1, - 1 - ], - "559": [ - 1, - 1, - 1 - ], - "560": [ - 1, - 1, - 1 - ], - "562": [ - 0, - 1, - 1 - ], - "563": [ - 0, - 1, - 1 - ], - "568": [ - 0, - 2, - 2 - ], - "569-gigantamax": [ - 0, - 1, - 1 - ], - "569": [ - 0, - 1, - 1 - ], - "570": [ - 0, - 1, - 1 - ], - "571": [ - 0, - 1, - 1 - ], - "572": [ - 0, - 1, - 1 - ], - "577": [ - 1, - 1, - 1 - ], - "578": [ - 1, - 1, - 1 - ], - "579": [ - 1, - 1, - 1 - ], - "585-autumn": [ - 2, - 0, - 0 - ], - "585-spring": [ - 2, - 0, - 0 - ], - "585-summer": [ - 2, - 0, - 0 - ], - "585-winter": [ - 2, - 0, - 0 - ], - "586-autumn": [ - 1, - 0, - 0 - ], - "586-spring": [ - 1, - 0, - 0 - ], - "586-summer": [ - 1, - 0, - 0 - ], - "586-winter": [ - 1, - 0, - 0 - ], - "592": [ - 0, - 1, - 2 - ], - "593": [ - 0, - 1, - 1 - ], - "594": [ - 0, - 1, - 2 - ], - "595": [ - 0, - 1, - 1 - ], - "596": [ - 0, - 1, - 1 - ], - "602": [ - 0, - 1, - 1 - ], - "603": [ - 0, - 1, - 1 - ], - "604": [ - 0, - 1, - 1 - ], - "605": [ - 1, - 1, - 1 - ], - "606": [ - 1, - 1, - 1 - ], - "607": [ - 0, - 1, - 1 - ], - "608": [ - 0, - 1, - 1 - ], - "609": [ - 0, - 1, - 1 - ], - "610": [ - 0, - 1, - 1 - ], - "611": [ - 0, - 1, - 1 - ], - "612": [ - 0, - 1, - 2 - ], - "618": [ - 0, - 1, - 1 - ], - "619": [ - 0, - 1, - 1 - ], - "620": [ - 0, - 1, - 1 - ], - "622": [ - 0, - 1, - 1 - ], - "623": [ - 0, - 1, - 1 - ], - "631": [ - 0, - 2, - 2 - ], - "632": [ - 0, - 1, - 1 - ], - "633": [ - 0, - 1, - 1 - ], - "634": [ - 0, - 1, - 1 - ], - "635": [ - 0, - 1, - 1 - ], - "636": [ - 0, - 1, - 1 - ], - "637": [ - 0, - 1, - 1 - ], - "640": [ - 0, - 1, - 1 - ], - "647-resolute": [ - 0, - 1, - 1 - ], - "647-ordinary": [ - 0, - 1, - 1 - ], - "648-aria": [ - 0, - 1, - 1 - ], - "648-pirouette": [ - 0, - 1, - 1 - ], - "649-burn": [ - 0, - 1, - 1 - ], - "649-chill": [ - 0, - 1, - 1 - ], - "649-douse": [ - 0, - 1, - 1 - ], - "649-shock": [ - 0, - 1, - 1 - ], - "649": [ - 0, - 1, - 1 - ], - "653": [ - 0, - 1, - 1 - ], - "654": [ - 0, - 1, - 1 - ], - "655": [ - 0, - 1, - 1 - ], - "664": [ - 0, - 1, - 1 - ], - "665": [ - 0, - 1, - 1 - ], - "666-archipelago": [ - 0, - 1, - 1 - ], - "666-continental": [ - 0, - 1, - 2 - ], - "666-elegant": [ - 0, - 1, - 1 - ], - "666-fancy": [ - 0, - 2, - 2 - ], - "666-garden": [ - 0, - 1, - 1 - ], - "666-high-plains": [ - 0, - 1, - 1 - ], - "666-icy-snow": [ - 0, - 1, - 1 - ], - "666-jungle": [ - 0, - 1, - 1 - ], - "666-marine": [ - 0, - 1, - 1 - ], - "666-meadow": [ - 0, - 1, - 1 - ], - "666-modern": [ - 0, - 1, - 1 - ], - "666-monsoon": [ - 0, - 1, - 1 - ], - "666-ocean": [ - 0, - 1, - 1 - ], - "666-poke-ball": [ - 0, - 1, - 2 - ], - "666-polar": [ - 0, - 1, - 1 - ], - "666-river": [ - 0, - 2, - 1 - ], - "666-sandstorm": [ - 0, - 1, - 1 - ], - "666-savanna": [ - 0, - 1, - 1 - ], - "666-sun": [ - 0, - 1, - 1 - ], - "666-tundra": [ - 0, - 1, - 1 - ], - "669-red": [ - 0, - 2, - 1 - ], - "669-blue": [ - 0, - 2, - 2 - ], - "669-white": [ - 0, - 1, - 1 - ], - "669-yellow": [ - 0, - 2, - 1 - ], - "669-orange": [ - 0, - 2, - 1 - ], - "670-white": [ - 0, - 2, - 2 - ], - "670-blue": [ - 0, - 2, - 2 - ], - "670-orange": [ - 0, - 2, - 2 - ], - "670-red": [ - 0, - 2, - 2 - ], - "670-yellow": [ - 0, - 2, - 2 - ], - "671-red": [ - 0, - 1, - 2 - ], - "671-blue": [ - 0, - 1, - 2 - ], - "671-yellow": [ - 0, - 1, - 2 - ], - "671-white": [ - 0, - 1, - 2 - ], - "671-orange": [ - 0, - 1, - 1 - ], - "672": [ - 0, - 1, - 2 - ], - "673": [ - 0, - 1, - 1 - ], - "677": [ - 0, - 1, - 1 - ], - "678-female": [ - 0, - 1, - 1 - ], - "678": [ - 0, - 1, - 1 - ], - "690": [ - 0, - 1, - 1 - ], - "691": [ - 0, - 1, - 1 - ], - "696": [ - 0, - 1, - 1 - ], - "697": [ - 0, - 1, - 1 - ], - "698": [ - 0, - 1, - 1 - ], - "699": [ - 0, - 1, - 1 - ], - "700": [ - 0, - 1, - 1 - ], - "702": [ - 0, - 1, - 1 - ], - "703": [ - 0, - 1, - 1 - ], - "704": [ - 0, - 1, - 1 - ], - "705": [ - 0, - 1, - 1 - ], - "706": [ - 0, - 1, - 1 - ], - "708": [ - 0, - 1, - 1 - ], - "709": [ - 0, - 1, - 1 - ], - "710": [ - 0, - 1, - 1 - ], - "711": [ - 1, - 1, - 1 - ], - "712": [ - 0, - 1, - 1 - ], - "713": [ - 0, - 1, - 1 - ], - "714": [ - 0, - 1, - 1 - ], - "715": [ - 0, - 2, - 2 - ], - "716-active": [ - 0, - 1, - 1 - ], - "716-neutral": [ - 0, - 1, - 1 - ], - "717": [ - 0, - 1, - 1 - ], - "720-unbound": [ - 1, - 1, - 1 - ], - "720": [ - 1, - 1, - 1 - ], - "728": [ - 0, - 1, - 1 - ], - "729": [ - 0, - 1, - 1 - ], - "730": [ - 0, - 1, - 1 - ], - "734": [ - 0, - 1, - 1 - ], - "735": [ - 0, - 1, - 1 - ], - "742": [ - 0, - 2, - 2 - ], - "743": [ - 0, - 2, - 2 - ], - "747": [ - 0, - 1, - 1 - ], - "748": [ - 0, - 1, - 1 - ], - "751": [ - 0, - 1, - 1 - ], - "752": [ - 0, - 1, - 1 - ], - "753": [ - 0, - 1, - 1 - ], - "754": [ - 0, - 1, - 1 - ], - "755": [ - 0, - 1, - 1 - ], - "756": [ - 0, - 1, - 2 - ], - "761": [ - 0, - 1, - 1 - ], - "762": [ - 0, - 1, - 1 - ], - "763": [ - 0, - 1, - 1 - ], - "767": [ - 0, - 1, - 1 - ], - "768": [ - 0, - 1, - 1 - ], - "771": [ - 0, - 1, - 1 - ], - "772": [ - 0, - 1, - 1 - ], - "773-fighting": [ - 0, - 1, - 1 - ], - "773-psychic": [ - 0, - 1, - 1 - ], - "773-poison": [ - 0, - 1, - 1 - ], - "773-ground": [ - 0, - 1, - 1 - ], - "773-ghost": [ - 0, - 1, - 1 - ], - "773-steel": [ - 0, - 1, - 1 - ], - "773-rock": [ - 0, - 1, - 1 - ], - "773-grass": [ - 0, - 1, - 1 - ], - "773-dragon": [ - 0, - 1, - 1 - ], - "773-bug": [ - 0, - 1, - 1 - ], - "773-ice": [ - 0, - 1, - 1 - ], - "773-dark": [ - 0, - 1, - 1 - ], - "773": [ - 0, - 1, - 1 - ], - "773-fairy": [ - 0, - 1, - 1 - ], - "773-water": [ - 0, - 1, - 1 - ], - "773-electric": [ - 0, - 1, - 1 - ], - "773-flying": [ - 0, - 1, - 1 - ], - "773-fire": [ - 0, - 1, - 1 - ], - "776": [ - 0, - 1, - 1 - ], - "777": [ - 0, - 1, - 1 - ], - "778-busted": [ - 0, - 1, - 1 - ], - "778-disguised": [ - 0, - 1, - 1 - ], - "779": [ - 0, - 1, - 1 - ], - "789": [ - 1, - 1, - 1 - ], - "790": [ - 0, - 1, - 1 - ], - "791-radiant-sun": [ - 0, - 1, - 1 - ], - "791": [ - 2, - 1, - 1 - ], - "792-full-moon": [ - 0, - 1, - 1 - ], - "792": [ - 0, - 1, - 1 - ], - "793": [ - 0, - 1, - 1 - ], - "797": [ - 0, - 1, - 1 - ], - "798": [ - 0, - 1, - 1 - ], - "800-dawn-wings": [ - 0, - 1, - 1 - ], - "800-dusk-mane": [ - 0, - 1, - 1 - ], - "800-ultra": [ - 0, - 1, - 1 - ], - "800": [ - 0, - 1, - 1 - ], - "802": [ - 1, - 1, - 1 - ], - "803": [ - 0, - 1, - 1 - ], - "804": [ - 0, - 1, - 1 - ], - "808": [ - 0, - 1, - 1 - ], - "809-gigantamax": [ - 0, - 1, - 1 - ], - "809": [ - 0, - 1, - 1 - ], - "816": [ - 0, - 1, - 1 - ], - "817": [ - 0, - 1, - 1 - ], - "818-gigantamax": [ - 1, - 1, - 1 - ], - "818": [ - 0, - 1, - 1 - ], - "821": [ - 0, - 1, - 1 - ], - "822": [ - 0, - 1, - 1 - ], - "823-gigantamax": [ - 0, - 2, - 2 - ], - "823": [ - 0, - 1, - 1 - ], - "829": [ - 0, - 1, - 1 - ], - "830": [ - 0, - 1, - 1 - ], - "835": [ - 0, - 1, - 1 - ], - "836": [ - 0, - 2, - 2 - ], - "850": [ - 0, - 1, - 1 - ], - "851-gigantamax": [ - 0, - 1, - 1 - ], - "851": [ - 0, - 1, - 1 - ], - "854": [ - 0, - 1, - 1 - ], - "855": [ - 0, - 1, - 1 - ], - "856": [ - 0, - 1, - 1 - ], - "857": [ - 0, - 2, - 2 - ], - "858-gigantamax": [ - 0, - 1, - 1 - ], - "858": [ - 0, - 1, - 1 - ], - "859": [ - 0, - 2, - 2 - ], - "860": [ - 0, - 1, - 1 - ], - "861-gigantamax": [ - 0, - 1, - 1 - ], - "861": [ - 0, - 1, - 1 - ], - "862": [ - 0, - 1, - 1 - ], - "863": [ - 0, - 1, - 1 - ], - "864": [ - 0, - 1, - 1 - ], - "867": [ - 0, - 1, - 1 - ], - "872": [ - 1, - 1, - 1 - ], - "873": [ - 1, - 1, - 1 - ], - "876-female": [ - 0, - 1, - 1 - ], - "876": [ - 0, - 1, - 1 - ], - "877-hangry": [ - 1, - 1, - 1 - ], - "877": [ - 1, - 1, - 1 - ], - "880": [ - 0, - 1, - 1 - ], - "881": [ - 0, - 1, - 1 - ], - "882": [ - 0, - 1, - 1 - ], - "883": [ - 0, - 1, - 1 - ], - "884-gigantamax": [ - 0, - 1, - 1 - ], - "884": [ - 0, - 1, - 1 - ], - "885": [ - 1, - 1, - 1 - ], - "886": [ - 1, - 1, - 1 - ], - "887": [ - 2, - 1, - 1 - ], - "888": [ - 0, - 1, - 1 - ], - "888-crowned": [ - 0, - 1, - 1 - ], - "889": [ - 0, - 1, - 1 - ], - "889-crowned": [ - 0, - 1, - 1 - ], - "890-eternamax": [ - 0, - 1, - 1 - ], - "890": [ - 0, - 1, - 1 - ], - "891": [ - 1, - 1, - 1 - ], - "892-gigantamax-rapid": [ - 1, - 2, - 2 - ], - "892-rapid-strike": [ - 1, - 1, - 1 - ], - "892": [ - 1, - 1, - 1 - ], - "892-gigantamax-single": [ - 1, - 2, - 2 - ], - "896": [ - 1, - 1, - 1 - ], - "897": [ - 2, - 1, - 1 - ], - "898": [ - 1, - 1, - 1 - ], - "898-ice": [ - 1, - 1, - 1 - ], - "898-shadow": [ - 1, - 1, - 1 - ], - "900": [ - 0, - 1, - 1 - ], - "901": [ - 0, - 1, - 2 - ], - "903": [ - 0, - 1, - 1 - ], - "909": [ - 0, - 2, - 2 - ], - "910": [ - 0, - 2, - 2 - ], - "911": [ - 0, - 1, - 1 - ], - "912": [ - 0, - 1, - 1 - ], - "913": [ - 0, - 2, - 2 - ], - "914": [ - 0, - 2, - 1 - ], - "919": [ - 1, - 1, - 1 - ], - "920": [ - 2, - 2, - 2 - ], - "924": [ - 1, - 1, - 1 - ], - "925-four": [ - 1, - 1, - 1 - ], - "925-three": [ - 1, - 1, - 1 - ], - "932": [ - 0, - 1, - 2 - ], - "933": [ - 0, - 1, - 1 - ], - "934": [ - 0, - 1, - 1 - ], - "935": [ - 2, - 2, - 2 - ], - "936": [ - 2, - 2, - 2 - ], - "937": [ - 2, - 2, - 2 - ], - "940": [ - 0, - 1, - 1 - ], - "941": [ - 0, - 1, - 1 - ], - "948": [ - 0, - 1, - 1 - ], - "949": [ - 0, - 1, - 1 - ], - "951": [ - 0, - 1, - 1 - ], - "952": [ - 0, - 1, - 1 - ], - "953": [ - 0, - 1, - 1 - ], - "954": [ - 0, - 1, - 1 - ], - "957": [ - 1, - 2, - 2 - ], - "958": [ - 2, - 2, - 1 - ], - "959": [ - 2, - 2, - 2 - ], - "962": [ - 1, - 1, - 1 - ], - "967": [ - 0, - 1, - 1 - ], - "968": [ - 0, - 2, - 2 - ], - "969": [ - 0, - 1, - 1 - ], - "970": [ - 0, - 1, - 1 - ], - "973": [ - 2, - 2, - 2 - ], - "974": [ - 0, - 1, - 1 - ], - "975": [ - 0, - 2, - 2 - ], - "978-curly": [ - 0, - 2, - 2 - ], - "978-droopy": [ - 0, - 2, - 2 - ], - "978-stretchy": [ - 0, - 2, - 2 - ], - "979": [ - 2, - 2, - 2 - ], - "981": [ - 0, - 1, - 1 - ], - "982": [ - 0, - 1, - 1 - ], - "982-three-segment": [ - 0, - 1, - 1 - ], - "987": [ - 1, - 1, - 1 - ], - "988": [ - 0, - 1, - 2 - ], - "993": [ - 0, - 1, - 1 - ], - "994": [ - 0, - 1, - 1 - ], - "995": [ - 0, - 1, - 1 - ], - "996": [ - 0, - 1, - 1 - ], - "997": [ - 0, - 1, - 1 - ], - "998": [ - 0, - 1, - 1 - ], - "999": [ - 1, - 1, - 1 - ], - "1000": [ - 1, - 1, - 1 - ], - "1001": [ - 0, - 1, - 1 - ], - "1003": [ - 0, - 1, - 1 - ], - "1004": [ - 0, - 1, - 1 - ], - "1006": [ - 0, - 2, - 1 - ], - "1007-apex-build": [ - 0, - 2, - 2 - ], - "1008-ultimate-mode": [ - 1, - 1, - 1 - ], - "1010": [ - 0, - 1, - 1 - ], - "1018": [ - 0, - 1, - 1 - ], - "1022": [ - 0, - 1, - 1 - ], - "1023": [ - 0, - 1, - 1 - ], - "2027": [ - 0, - 1, - 1 - ], - "2028": [ - 0, - 1, - 1 - ], - "2052": [ - 0, - 1, - 1 - ], - "2053": [ - 0, - 1, - 1 - ], - "2670": [ - 0, - 1, - 1 - ], - "4052": [ - 0, - 1, - 1 - ], - "4077": [ - 0, - 1, - 1 - ], - "4078": [ - 0, - 1, - 1 - ], - "4079": [ - 0, - 1, - 1 - ], - "4080": [ - 2, - 1, - 1 - ], - "4144": [ - 0, - 1, - 1 - ], - "4145": [ - 0, - 1, - 1 - ], - "4146": [ - 0, - 1, - 1 - ], - "4199": [ - 2, - 1, - 1 - ], - "4222": [ - 0, - 1, - 1 - ], - "4263": [ - 0, - 1, - 1 - ], - "4264": [ - 0, - 1, - 1 - ], - "4562": [ - 0, - 1, - 1 - ], - "6100": [ - 0, - 1, - 1 - ], - "6101": [ - 0, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ], - "6549": [ - 0, - 1, - 1 - ], - "6570": [ - 0, - 1, - 1 - ], - "6571": [ - 0, - 1, - 1 - ], - "6705": [ - 0, - 1, - 1 - ], - "6706": [ - 0, - 1, - 1 - ], - "6713": [ - 0, - 1, - 1 - ], - "8901": [ - 1, - 1, - 1 - ], + "1": [0, 1, 1], + "2": [0, 2, 1], + "3-gigantamax": [0, 1, 1], + "3-mega": [0, 2, 2], + "3": [0, 1, 1], + "4": [0, 1, 1], + "5": [0, 1, 1], + "6-mega-x": [0, 1, 2], + "6-gigantamax": [0, 1, 2], + "6-mega-y": [0, 1, 2], + "6": [0, 2, 2], + "7": [0, 2, 2], + "8": [0, 2, 2], + "9-gigantamax": [0, 1, 2], + "9-mega": [0, 2, 2], + "9": [0, 2, 2], + "19": [0, 1, 1], + "20": [0, 1, 1], + "23": [0, 1, 1], + "24": [0, 1, 1], + "25": [0, 1, 1], + "25-beauty-cosplay": [0, 1, 1], + "25-cool-cosplay": [0, 1, 1], + "25-cosplay": [0, 1, 1], + "25-cute-cosplay": [0, 1, 1], + "25-gigantamax": [0, 1, 1], + "25-partner": [0, 1, 1], + "25-smart-cosplay": [0, 1, 1], + "25-tough-cosplay": [0, 1, 1], + "26": [0, 1, 1], + "29": [0, 1, 1], + "30": [0, 1, 1], + "31": [1, 1, 1], + "35": [0, 1, 2], + "36": [0, 1, 1], + "37": [0, 1, 1], + "38": [0, 1, 1], + "39": [0, 1, 1], + "40": [0, 1, 1], + "41": [0, 1, 1], + "42": [0, 1, 1], + "43": [0, 1, 1], + "44": [0, 1, 1], + "45": [0, 1, 1], + "46": [1, 1, 1], + "47": [1, 1, 1], + "50": [0, 1, 1], + "51": [0, 1, 1], + "52-gigantamax": [1, 1, 1], + "52": [1, 1, 1], + "53": [1, 1, 1], + "56": [1, 2, 2], + "57": [2, 2, 2], + "69": [0, 2, 2], + "70": [0, 1, 1], + "71": [0, 1, 1], + "77": [0, 1, 1], + "78": [0, 1, 1], + "79": [1, 1, 1], + "80": [0, 1, 1], + "80-mega": [0, 1, 1], + "81": [0, 1, 1], + "82": [0, 1, 1], + "83": [0, 2, 2], + "84": [1, 1, 1], + "85": [1, 1, 1], + "86": [1, 1, 1], + "87": [1, 1, 1], + "92": [2, 2, 2], + "93": [1, 1, 1], + "94-gigantamax": [1, 2, 2], + "94-mega": [2, 2, 2], + "94": [1, 1, 1], + "98": [0, 1, 1], + "99": [0, 1, 1], + "99-gigantamax": [0, 1, 1], + "100": [0, 1, 1], + "101": [0, 1, 1], + "102": [0, 1, 1], + "103": [0, 1, 1], + "111": [0, 1, 1], + "112": [0, 1, 1], + "113": [2, 2, 2], + "114": [0, 1, 1], + "116": [0, 1, 1], + "117": [0, 1, 1], + "118": [1, 1, 1], + "119": [1, 1, 1], + "120": [0, 1, 1], + "121": [0, 1, 1], + "123": [1, 1, 1], + "125": [1, 1, 2], + "126": [0, 2, 1], + "127-mega": [0, 1, 1], + "127": [0, 1, 1], + "128": [0, 1, 1], + "129": [0, 1, 1], + "130-mega": [0, 1, 1], + "130": [0, 1, 1], + "131-gigantamax": [0, 1, 1], + "131": [0, 1, 1], + "132": [0, 1, 1], + "133": [0, 1, 1], + "133-partner": [0, 1, 1], + "134": [0, 1, 1], + "135": [1, 1, 1], + "136": [1, 1, 1], + "137": [0, 1, 1], + "138": [0, 1, 1], + "139": [0, 1, 2], + "140": [0, 1, 1], + "141": [0, 2, 2], + "142-mega": [0, 1, 1], + "142": [0, 1, 1], + "144": [1, 2, 2], + "145": [1, 1, 1], + "146": [1, 1, 1], + "147": [0, 1, 1], + "148": [0, 1, 1], + "149": [0, 1, 1], + "150-mega-x": [0, 1, 1], + "150-mega-y": [0, 1, 1], + "150": [0, 1, 1], + "151": [0, 1, 1], + "152": [0, 1, 1], + "153": [0, 1, 1], + "154": [0, 1, 1], + "158": [0, 1, 1], + "159": [0, 1, 1], + "160": [0, 1, 1], + "161": [0, 1, 2], + "162": [0, 1, 1], + "163": [0, 1, 1], + "164": [0, 2, 2], + "167": [0, 1, 1], + "168": [0, 1, 1], + "169": [0, 1, 1], + "170": [0, 1, 1], + "171": [0, 1, 1], + "172": [0, 1, 1], + "172-spiky": [0, 1, 1], + "173": [0, 1, 2], + "174": [0, 1, 1], + "175": [1, 1, 1], + "176": [1, 1, 1], + "177": [0, 1, 1], + "178": [0, 2, 2], + "179": [0, 1, 1], + "180": [0, 2, 2], + "181-mega": [0, 1, 2], + "181": [0, 1, 1], + "182": [0, 1, 1], + "183": [0, 1, 2], + "184": [0, 2, 2], + "185": [0, 1, 1], + "190": [0, 1, 1], + "193": [0, 1, 1], + "194": [0, 1, 1], + "195": [0, 1, 1], + "196": [1, 1, 1], + "197": [0, 1, 1], + "198": [0, 1, 1], + "199": [2, 1, 1], + "200": [1, 1, 1], + "201-m": [0, 1, 1], + "201-question": [0, 1, 1], + "201-j": [0, 1, 1], + "201-l": [0, 1, 1], + "201-h": [0, 1, 1], + "201-x": [0, 1, 1], + "201-exclamation": [0, 1, 1], + "201-q": [0, 1, 1], + "201-s": [0, 1, 1], + "201-c": [0, 1, 1], + "201-u": [0, 1, 1], + "201-t": [0, 1, 1], + "201-z": [0, 1, 1], + "201-d": [0, 1, 1], + "201-b": [0, 1, 1], + "201-g": [0, 1, 1], + "201-k": [0, 1, 1], + "201-i": [0, 1, 1], + "201-p": [0, 1, 1], + "201-e": [0, 1, 1], + "201-y": [0, 1, 1], + "201-r": [0, 1, 1], + "201-f": [0, 1, 1], + "201-n": [0, 1, 1], + "201-v": [0, 1, 1], + "201-a": [0, 1, 1], + "201-w": [0, 1, 1], + "201-o": [0, 1, 1], + "203": [0, 1, 1], + "206": [0, 1, 1], + "207": [0, 1, 1], + "211": [0, 1, 1], + "212-mega": [1, 1, 1], + "212": [1, 1, 1], + "213": [0, 1, 1], + "215": [0, 1, 1], + "216": [1, 1, 1], + "217": [1, 1, 1], + "222": [0, 1, 1], + "226": [0, 2, 2], + "227": [0, 1, 1], + "228": [0, 1, 1], + "229": [0, 1, 1], + "229-mega": [0, 1, 1], + "230": [0, 1, 1], + "231": [0, 1, 1], + "232": [0, 1, 1], + "233": [0, 1, 1], + "235": [0, 1, 1], + "239": [1, 1, 2], + "240": [0, 1, 1], + "242": [2, 2, 2], + "243": [0, 1, 1], + "244": [0, 2, 2], + "245": [0, 1, 1], + "246": [0, 1, 1], + "247": [0, 1, 1], + "248": [0, 1, 1], + "248-mega": [0, 1, 1], + "249": [0, 2, 2], + "250": [0, 2, 2], + "251": [0, 1, 1], + "255": [0, 1, 1], + "256": [0, 1, 1], + "257": [0, 1, 2], + "257-mega": [0, 1, 1], + "261": [0, 1, 1], + "262": [0, 1, 1], + "263": [0, 1, 1], + "264": [0, 1, 1], + "276": [0, 1, 1], + "277": [0, 1, 1], + "278": [1, 1, 1], + "279": [1, 1, 1], + "280": [0, 1, 1], + "281": [0, 1, 1], + "282-mega": [0, 2, 2], + "282": [0, 1, 1], + "285": [0, 1, 1], + "286": [0, 1, 1], + "290": [1, 1, 1], + "291": [2, 2, 2], + "292": [2, 1, 2], + "298": [0, 2, 2], + "300": [1, 1, 1], + "301": [1, 1, 1], + "302": [0, 1, 1], + "302-mega": [0, 1, 1], + "303-mega": [1, 1, 1], + "303": [0, 1, 1], + "304": [1, 1, 1], + "305": [1, 1, 1], + "306-mega": [1, 1, 1], + "306": [1, 1, 1], + "307": [0, 1, 1], + "308-mega": [0, 1, 1], + "308": [0, 2, 1], + "309": [0, 1, 1], + "310-mega": [0, 1, 1], + "310": [0, 1, 1], + "311": [1, 1, 1], + "312": [0, 1, 1], + "315": [0, 1, 1], + "320": [0, 1, 1], + "321": [0, 1, 1], + "327": [0, 1, 1], + "328": [0, 1, 1], + "329": [0, 1, 2], + "330": [0, 1, 1], + "333": [0, 1, 1], + "334-mega": [0, 2, 1], + "334": [0, 2, 2], + "335": [0, 2, 2], + "336": [0, 1, 1], + "337": [0, 1, 1], + "338": [0, 1, 1], + "339": [0, 1, 1], + "340": [0, 1, 2], + "341": [0, 2, 2], + "342": [0, 2, 2], + "351-rainy": [1, 2, 2], + "351-snowy": [1, 1, 1], + "351-sunny": [1, 2, 2], + "351": [0, 2, 2], + "352": [1, 1, 1], + "353": [0, 1, 1], + "354": [0, 1, 1], + "354-mega": [0, 1, 1], + "357": [0, 1, 1], + "358": [2, 1, 1], + "359": [0, 1, 1], + "359-mega": [0, 1, 1], + "361": [0, 1, 1], + "362": [0, 2, 2], + "362-mega": [0, 1, 1], + "369": [0, 1, 1], + "370": [0, 1, 1], + "371": [0, 1, 1], + "372": [0, 1, 1], + "373-mega": [0, 2, 2], + "373": [0, 1, 1], + "374": [0, 1, 1], + "375": [0, 1, 1], + "376-mega": [0, 1, 1], + "376": [0, 1, 1], + "377": [0, 1, 1], + "378": [1, 1, 1], + "379": [0, 1, 1], + "380-mega": [0, 1, 1], + "380": [0, 1, 1], + "381-mega": [0, 1, 1], + "381": [0, 1, 1], + "382-primal": [0, 1, 1], + "382": [0, 1, 1], + "383-primal": [0, 1, 1], + "383": [0, 1, 1], + "384-mega": [0, 2, 1], + "384": [0, 1, 1], + "385": [1, 1, 1], + "387": [0, 1, 1], + "388": [0, 1, 1], + "389": [0, 1, 1], + "390": [0, 1, 1], + "391": [0, 1, 1], + "392": [0, 1, 1], + "393": [0, 1, 1], + "394": [0, 1, 1], + "395": [0, 1, 1], + "399": [0, 1, 1], + "400": [0, 1, 1], + "401": [0, 1, 1], + "402": [0, 1, 1], + "406": [0, 1, 1], + "407": [0, 1, 1], + "412-sandy": [2, 2, 2], + "412-plant": [1, 1, 1], + "412-trash": [1, 1, 1], + "413-plant": [2, 2, 2], + "413-trash": [1, 1, 1], + "413-sandy": [1, 1, 1], + "414": [0, 1, 1], + "418": [0, 1, 1], + "419": [0, 1, 1], + "422-west": [1, 1, 1], + "422-east": [1, 1, 1], + "423-west": [1, 1, 1], + "423-east": [1, 1, 1], + "424": [0, 1, 1], + "425": [0, 1, 1], + "426": [0, 1, 1], + "427": [0, 1, 1], + "428-mega": [0, 1, 1], + "428": [0, 1, 1], + "429": [1, 1, 1], + "430": [0, 1, 1], + "433": [1, 1, 1], + "436": [0, 1, 1], + "437": [0, 1, 1], + "438": [0, 1, 1], + "440": [1, 1, 2], + "441": [0, 1, 1], + "442": [0, 1, 1], + "443": [1, 1, 1], + "444": [1, 1, 1], + "445-mega": [1, 1, 1], + "445": [1, 1, 1], + "447": [1, 1, 1], + "448-mega": [1, 1, 1], + "448": [1, 1, 1], + "453": [0, 1, 1], + "454": [0, 1, 1], + "455": [0, 1, 1], + "456": [0, 1, 1], + "457": [0, 1, 1], + "458": [0, 1, 1], + "461": [0, 1, 1], + "462": [0, 1, 1], + "464": [0, 1, 1], + "465": [0, 1, 1], + "466": [1, 1, 2], + "467": [0, 1, 1], + "468": [1, 1, 1], + "469": [0, 1, 1], + "470": [1, 1, 1], + "471": [1, 2, 2], + "472": [0, 1, 1], + "474": [0, 1, 1], + "475-mega": [0, 2, 2], + "475": [0, 1, 1], + "478": [0, 2, 1], + "479-heat": [0, 1, 1], + "479-wash": [0, 1, 1], + "479-mow": [0, 1, 1], + "479-frost": [0, 1, 1], + "479": [0, 1, 1], + "479-fan": [0, 1, 1], + "480": [1, 1, 1], + "481": [1, 1, 1], + "482": [1, 1, 1], + "485": [0, 1, 1], + "486": [0, 1, 1], + "487-altered": [0, 1, 1], + "487-origin": [0, 1, 1], + "488": [0, 1, 1], + "489": [1, 1, 1], + "490": [1, 1, 1], + "491": [0, 1, 1], + "492-land": [0, 2, 1], + "492-sky": [0, 1, 1], + "494": [0, 1, 1], + "495": [0, 1, 1], + "496": [0, 1, 1], + "497": [0, 1, 1], + "501": [0, 1, 1], + "502": [0, 1, 1], + "503": [0, 1, 1], + "517": [0, 1, 1], + "518": [0, 1, 1], + "524": [0, 1, 1], + "525": [0, 1, 1], + "526": [0, 2, 2], + "527": [0, 1, 1], + "528": [0, 1, 1], + "529": [0, 2, 2], + "530": [0, 2, 2], + "531": [0, 1, 1], + "531-mega": [0, 1, 1], + "532": [0, 1, 1], + "533": [0, 1, 1], + "534": [0, 1, 1], + "538": [0, 1, 1], + "539": [0, 2, 2], + "540": [0, 1, 1], + "541": [0, 1, 1], + "542": [0, 1, 1], + "543": [0, 1, 2], + "544": [0, 1, 2], + "545": [0, 1, 1], + "546": [0, 1, 1], + "547": [0, 1, 1], + "548": [1, 1, 1], + "549": [0, 1, 2], + "551": [0, 1, 1], + "552": [0, 1, 1], + "553": [0, 1, 1], + "556": [0, 1, 1], + "559": [1, 1, 1], + "560": [1, 1, 1], + "562": [0, 1, 1], + "563": [0, 1, 1], + "568": [0, 2, 2], + "569-gigantamax": [0, 1, 1], + "569": [0, 1, 1], + "570": [0, 1, 1], + "571": [0, 1, 1], + "572": [0, 1, 1], + "577": [1, 1, 1], + "578": [1, 1, 1], + "579": [1, 1, 1], + "585-autumn": [2, 0, 0], + "585-spring": [2, 0, 0], + "585-summer": [2, 0, 0], + "585-winter": [2, 0, 0], + "586-autumn": [1, 0, 0], + "586-spring": [1, 0, 0], + "586-summer": [1, 0, 0], + "586-winter": [1, 0, 0], + "587": [0, 1, 1], + "588": [0, 1, 1], + "589": [0, 1, 1], + "590": [0, 1, 1], + "591": [0, 1, 1], + "592": [0, 1, 2], + "593": [0, 1, 1], + "594": [0, 1, 2], + "595": [0, 1, 1], + "596": [0, 1, 1], + "602": [0, 1, 1], + "603": [0, 1, 1], + "604": [0, 1, 1], + "605": [1, 1, 1], + "606": [1, 1, 1], + "607": [0, 1, 1], + "608": [0, 1, 1], + "609": [0, 1, 1], + "610": [0, 1, 1], + "611": [0, 1, 1], + "612": [0, 1, 2], + "616": [0, 1, 1], + "617": [0, 1, 1], + "618": [0, 1, 1], + "619": [0, 1, 1], + "620": [0, 1, 1], + "621": [0, 1, 1], + "622": [0, 1, 1], + "623": [0, 1, 1], + "631": [0, 2, 2], + "632": [0, 1, 1], + "633": [0, 1, 1], + "634": [0, 1, 1], + "635": [0, 1, 1], + "636": [0, 1, 1], + "637": [0, 1, 1], + "640": [0, 1, 1], + "647-resolute": [0, 1, 1], + "647-ordinary": [0, 1, 1], + "648-aria": [0, 1, 1], + "648-pirouette": [0, 1, 1], + "649-burn": [0, 1, 1], + "649-chill": [0, 1, 1], + "649-douse": [0, 1, 1], + "649-shock": [0, 1, 1], + "649": [0, 1, 1], + "653": [0, 1, 1], + "654": [0, 1, 1], + "655": [0, 1, 1], + "656": [0, 1, 1], + "657": [0, 1, 1], + "658": [0, 1, 1], + "658-ash": [0, 1, 1], + "664": [0, 1, 1], + "665": [0, 1, 1], + "666-archipelago": [0, 1, 1], + "666-continental": [0, 1, 1], + "666-elegant": [0, 1, 1], + "666-fancy": [0, 1, 1], + "666-garden": [0, 1, 1], + "666-high-plains": [0, 1, 1], + "666-icy-snow": [0, 1, 1], + "666-jungle": [0, 1, 1], + "666-marine": [0, 1, 1], + "666-meadow": [0, 1, 1], + "666-modern": [0, 1, 1], + "666-monsoon": [0, 1, 1], + "666-ocean": [0, 1, 1], + "666-poke-ball": [0, 1, 1], + "666-polar": [0, 1, 1], + "666-river": [0, 1, 1], + "666-sandstorm": [0, 1, 1], + "666-savanna": [0, 1, 1], + "666-sun": [0, 1, 1], + "666-tundra": [0, 1, 1], + "669-red": [0, 1, 1], + "669-blue": [0, 2, 2], + "669-white": [0, 1, 1], + "669-yellow": [0, 2, 1], + "669-orange": [0, 2, 1], + "670-white": [0, 2, 2], + "670-blue": [0, 2, 2], + "670-orange": [0, 2, 2], + "670-red": [0, 2, 2], + "670-yellow": [0, 2, 2], + "671-red": [0, 1, 2], + "671-blue": [0, 1, 2], + "671-yellow": [0, 1, 2], + "671-white": [0, 1, 2], + "671-orange": [0, 1, 1], + "672": [0, 1, 2], + "673": [0, 1, 1], + "676": [0, 1, 1], + "676-dandy": [0, 1, 1], + "676-debutante": [0, 1, 1], + "676-diamond": [0, 1, 1], + "676-heart": [0, 1, 1], + "676-kabuki": [0, 1, 1], + "676-la-reine": [0, 1, 1], + "676-matron": [0, 1, 1], + "676-pharaoh": [0, 1, 1], + "676-star": [0, 1, 1], + "677": [0, 1, 1], + "678-female": [0, 1, 1], + "678": [0, 1, 1], + "682": [0, 1, 1], + "683": [0, 1, 1], + "684": [0, 1, 1], + "685": [0, 1, 1], + "688": [0, 1, 1], + "689": [0, 1, 1], + "690": [0, 1, 1], + "691": [0, 1, 1], + "696": [0, 1, 1], + "697": [0, 1, 1], + "698": [0, 1, 1], + "699": [0, 1, 1], + "700": [0, 1, 1], + "702": [0, 1, 1], + "703": [0, 1, 1], + "704": [0, 1, 1], + "705": [0, 1, 1], + "706": [0, 1, 1], + "708": [0, 1, 1], + "709": [0, 1, 1], + "710": [0, 1, 1], + "711": [1, 1, 1], + "712": [0, 1, 1], + "713": [0, 1, 1], + "714": [0, 1, 1], + "715": [0, 1, 1], + "716-active": [0, 1, 1], + "716-neutral": [0, 1, 1], + "717": [0, 1, 1], + "720-unbound": [1, 1, 1], + "720": [1, 1, 1], + "728": [0, 1, 1], + "729": [0, 1, 1], + "730": [0, 1, 1], + "734": [0, 1, 1], + "735": [0, 1, 1], + "742": [0, 2, 2], + "743": [0, 2, 2], + "747": [0, 1, 1], + "748": [0, 1, 1], + "751": [0, 1, 1], + "752": [0, 1, 1], + "753": [0, 1, 1], + "754": [0, 1, 1], + "755": [0, 1, 1], + "756": [0, 1, 2], + "761": [0, 1, 1], + "762": [0, 1, 1], + "763": [0, 1, 1], + "767": [0, 1, 1], + "768": [0, 1, 1], + "771": [0, 1, 1], + "772": [0, 1, 1], + "773-fighting": [0, 1, 1], + "773-psychic": [0, 1, 1], + "773-poison": [0, 1, 1], + "773-ground": [0, 1, 1], + "773-ghost": [0, 1, 1], + "773-steel": [0, 1, 1], + "773-rock": [0, 1, 1], + "773-grass": [0, 1, 1], + "773-dragon": [0, 1, 1], + "773-bug": [0, 1, 1], + "773-ice": [0, 1, 1], + "773-dark": [0, 1, 1], + "773": [0, 1, 1], + "773-fairy": [0, 1, 1], + "773-water": [0, 1, 1], + "773-electric": [0, 1, 1], + "773-flying": [0, 1, 1], + "773-fire": [0, 1, 1], + "776": [0, 1, 1], + "777": [0, 1, 1], + "778-busted": [0, 1, 1], + "778-disguised": [0, 1, 1], + "779": [0, 1, 1], + "789": [1, 1, 1], + "790": [0, 1, 1], + "791-radiant-sun": [0, 1, 1], + "791": [2, 1, 1], + "792-full-moon": [0, 1, 1], + "792": [0, 1, 1], + "793": [0, 1, 1], + "797": [0, 1, 1], + "798": [0, 1, 1], + "800-dawn-wings": [0, 1, 1], + "800-dusk-mane": [0, 1, 1], + "800-ultra": [0, 1, 1], + "800": [0, 1, 1], + "802": [1, 1, 1], + "803": [0, 1, 1], + "804": [0, 1, 1], + "807": [0, 1, 1], + "808": [0, 1, 1], + "809-gigantamax": [0, 1, 1], + "809": [0, 1, 1], + "816": [0, 1, 1], + "817": [0, 1, 1], + "818-gigantamax": [1, 1, 1], + "818": [0, 1, 1], + "821": [0, 1, 1], + "822": [0, 1, 1], + "823-gigantamax": [0, 2, 2], + "823": [0, 1, 1], + "829": [0, 1, 1], + "830": [0, 1, 1], + "835": [0, 1, 1], + "836": [0, 2, 2], + "850": [0, 1, 1], + "851-gigantamax": [0, 1, 1], + "851": [0, 1, 1], + "854": [0, 1, 1], + "855": [0, 1, 1], + "856": [0, 1, 1], + "857": [0, 2, 2], + "858-gigantamax": [0, 1, 1], + "858": [0, 1, 1], + "859": [0, 1, 1], + "860": [0, 1, 1], + "861-gigantamax": [0, 1, 1], + "861": [0, 1, 1], + "862": [0, 1, 1], + "863": [0, 1, 1], + "864": [0, 1, 1], + "867": [0, 1, 1], + "872": [1, 1, 1], + "873": [1, 1, 1], + "876-female": [0, 1, 1], + "876": [0, 1, 1], + "877-hangry": [1, 1, 1], + "877": [1, 1, 1], + "880": [0, 1, 1], + "881": [0, 1, 1], + "882": [0, 1, 1], + "883": [0, 1, 1], + "884-gigantamax": [0, 1, 1], + "884": [0, 1, 1], + "885": [1, 1, 1], + "886": [1, 1, 1], + "887": [2, 1, 1], + "888": [0, 1, 1], + "888-crowned": [0, 1, 1], + "889": [0, 1, 1], + "889-crowned": [0, 1, 1], + "890-eternamax": [0, 1, 1], + "890": [0, 1, 1], + "891": [1, 1, 1], + "892-gigantamax-rapid": [1, 2, 2], + "892-rapid-strike": [1, 1, 1], + "892": [1, 1, 1], + "892-gigantamax-single": [1, 2, 2], + "894": [0, 1, 1], + "895": [0, 1, 1], + "896": [1, 1, 1], + "897": [2, 1, 1], + "898": [1, 1, 1], + "898-ice": [1, 1, 1], + "898-shadow": [1, 1, 1], + "900": [0, 1, 1], + "901": [0, 1, 2], + "903": [0, 1, 1], + "909": [0, 2, 2], + "910": [0, 2, 2], + "911": [0, 1, 1], + "912": [0, 1, 1], + "913": [0, 2, 2], + "914": [0, 2, 1], + "919": [1, 1, 1], + "920": [2, 2, 2], + "924": [1, 1, 1], + "925-four": [1, 1, 1], + "925-three": [1, 1, 1], + "932": [0, 1, 2], + "933": [0, 1, 1], + "934": [0, 1, 1], + "935": [2, 2, 2], + "936": [2, 2, 2], + "937": [2, 2, 2], + "940": [0, 1, 1], + "941": [0, 1, 1], + "944": [0, 1, 1], + "945": [0, 1, 1], + "948": [0, 1, 1], + "949": [0, 1, 1], + "951": [0, 1, 1], + "952": [0, 1, 1], + "953": [0, 1, 1], + "954": [0, 1, 1], + "957": [1, 2, 2], + "958": [2, 2, 1], + "959": [2, 2, 2], + "962": [1, 1, 1], + "967": [0, 1, 1], + "968": [0, 2, 2], + "969": [0, 1, 1], + "970": [0, 1, 1], + "973": [2, 2, 2], + "974": [0, 1, 1], + "975": [0, 2, 2], + "978-curly": [0, 2, 2], + "978-droopy": [0, 2, 2], + "978-stretchy": [0, 2, 2], + "979": [2, 2, 2], + "981": [0, 1, 1], + "982": [0, 1, 1], + "982-three-segment": [0, 1, 1], + "987": [1, 1, 1], + "988": [0, 1, 2], + "993": [0, 1, 1], + "994": [0, 1, 1], + "995": [0, 1, 1], + "996": [0, 1, 1], + "997": [0, 1, 1], + "998": [0, 1, 1], + "999": [1, 1, 1], + "1000": [1, 1, 1], + "1001": [0, 1, 1], + "1003": [0, 1, 1], + "1004": [0, 1, 1], + "1006": [0, 2, 1], + "1007-apex-build": [0, 2, 2], + "1008-ultimate-mode": [1, 1, 1], + "1010": [0, 1, 1], + "1012-counterfeit": [0, 1, 1], + "1013-unremarkable": [0, 1, 1], + "1018": [0, 1, 1], + "1022": [0, 1, 1], + "1023": [0, 1, 1], + "2026": [0, 1, 1], + "2027": [0, 1, 1], + "2028": [0, 1, 1], + "2052": [0, 1, 1], + "2053": [0, 1, 1], + "2103": [0, 1, 1], + "2670": [0, 1, 1], + "4052": [0, 1, 1], + "4077": [0, 1, 1], + "4078": [0, 1, 1], + "4079": [0, 1, 1], + "4080": [2, 1, 1], + "4144": [0, 1, 1], + "4145": [0, 1, 1], + "4146": [0, 1, 1], + "4199": [2, 1, 1], + "4222": [0, 1, 1], + "4263": [0, 1, 1], + "4264": [0, 1, 1], + "4562": [0, 1, 1], + "6100": [0, 1, 1], + "6101": [0, 1, 1], + "6215": [0, 1, 1], + "6503": [0, 1, 1], + "6549": [0, 1, 1], + "6570": [0, 1, 1], + "6571": [0, 1, 1], + "6705": [0, 1, 1], + "6706": [0, 1, 1], + "6713": [0, 1, 1], + "8901": [1, 1, 1], "female": { - "3": [ - 0, - 2, - 1 - ], - "19": [ - 0, - 1, - 1 - ], - "20": [ - 0, - 1, - 1 - ], - "41": [ - 0, - 1, - 1 - ], - "42": [ - 0, - 1, - 1 - ], - "44": [ - 0, - 1, - 1 - ], - "45": [ - 0, - 1, - 1 - ], - "84": [ - 1, - 1, - 1 - ], - "85": [ - 1, - 1, - 1 - ], - "111": [ - 0, - 1, - 1 - ], - "112": [ - 0, - 1, - 1 - ], - "118": [ - 0, - 1, - 1 - ], - "119": [ - 0, - 1, - 1 - ], - "123": [ - 1, - 1, - 1 - ], - "129": [ - 0, - 1, - 1 - ], - "130": [ - 0, - 1, - 1 - ], - "178": [ - 0, - 2, - 2 - ], - "185": [ - 0, - 1, - 1 - ], - "190": [ - 0, - 1, - 1 - ], - "203": [ - 0, - 1, - 1 - ], - "207": [ - 0, - 1, - 1 - ], - "215": [ - 0, - 1, - 1 - ], - "217": [ - 1, - 1, - 1 - ], - "229": [ - 0, - 1, - 1 - ], - "232": [ - 0, - 1, - 1 - ], - "255": [ - 0, - 1, - 1 - ], - "256": [ - 0, - 1, - 1 - ], - "257": [ - 0, - 1, - 1 - ], - "307": [ - 0, - 1, - 1 - ], - "308": [ - 0, - 1, - 1 - ], - "315": [ - 0, - 1, - 1 - ], - "369": [ - 0, - 1, - 1 - ], - "399": [ - 0, - 1, - 1 - ], - "400": [ - 0, - 1, - 1 - ], - "401": [ - 0, - 1, - 1 - ], - "402": [ - 0, - 2, - 2 - ], - "407": [ - 0, - 1, - 1 - ], - "418": [ - 0, - 1, - 1 - ], - "419": [ - 0, - 2, - 1 - ], - "424": [ - 0, - 1, - 1 - ], - "443": [ - 1, - 1, - 1 - ], - "444": [ - 1, - 1, - 1 - ], - "445": [ - 1, - 1, - 1 - ], - "453": [ - 0, - 1, - 1 - ], - "454": [ - 0, - 1, - 1 - ], - "456": [ - 0, - 1, - 1 - ], - "457": [ - 0, - 1, - 1 - ], - "461": [ - 0, - 1, - 1 - ], - "464": [ - 0, - 1, - 1 - ], - "465": [ - 0, - 1, - 1 - ], - "592": [ - 1, - 1, - 1 - ], - "593": [ - 1, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ] + "3": [0, 1, 1], + "19": [0, 1, 1], + "20": [0, 1, 1], + "25": [0, 1, 1], + "25-beauty-cosplay": [0, 1, 1], + "25-cool-cosplay": [0, 1, 1], + "25-cosplay": [0, 1, 1], + "25-cute-cosplay": [0, 1, 1], + "25-partner": [0, 1, 1], + "25-smart-cosplay": [0, 1, 1], + "25-tough-cosplay": [0, 1, 1], + "26": [0, 1, 1], + "41": [0, 1, 1], + "42": [0, 1, 1], + "44": [0, 1, 1], + "45": [0, 1, 1], + "84": [1, 1, 1], + "85": [1, 1, 1], + "111": [0, 1, 1], + "112": [0, 1, 1], + "118": [0, 1, 1], + "119": [0, 1, 1], + "123": [1, 1, 1], + "129": [0, 1, 1], + "130": [0, 1, 1], + "154": [0, 1, 1], + "178": [0, 2, 2], + "185": [0, 1, 1], + "190": [0, 1, 1], + "194": [0, 1, 1], + "195": [0, 1, 1], + "198": [0, 1, 1], + "203": [0, 1, 1], + "207": [0, 1, 1], + "212": [1, 1, 1], + "215": [0, 1, 1], + "217": [1, 1, 1], + "229": [0, 1, 1], + "232": [0, 1, 1], + "255": [0, 1, 1], + "256": [0, 1, 1], + "257": [0, 1, 1], + "307": [0, 1, 1], + "308": [0, 1, 1], + "315": [0, 1, 1], + "369": [0, 1, 1], + "399": [0, 1, 1], + "400": [0, 1, 1], + "401": [0, 1, 1], + "402": [0, 2, 2], + "407": [0, 1, 1], + "418": [0, 1, 1], + "419": [0, 2, 1], + "424": [0, 1, 1], + "443": [1, 1, 1], + "444": [1, 1, 1], + "445": [1, 1, 1], + "453": [0, 1, 1], + "454": [0, 1, 1], + "456": [0, 1, 1], + "457": [0, 1, 1], + "461": [0, 1, 1], + "464": [0, 1, 1], + "465": [0, 1, 1], + "592": [1, 1, 1], + "593": [1, 1, 1], + "6215": [0, 1, 1] }, "back": { - "1": [ - 0, - 1, - 1 - ], - "2": [ - 0, - 1, - 1 - ], - "3-gigantamax": [ - 0, - 1, - 1 - ], - "3-mega": [ - 0, - 2, - 2 - ], - "3": [ - 0, - 1, - 1 - ], - "4": [ - 0, - 1, - 1 - ], - "5": [ - 0, - 1, - 1 - ], - "6-mega-x": [ - 0, - 1, - 2 - ], - "6-gigantamax": [ - 0, - 1, - 2 - ], - "6-mega-y": [ - 0, - 1, - 2 - ], - "6": [ - 0, - 2, - 2 - ], - "7": [ - 0, - 2, - 2 - ], - "8": [ - 0, - 2, - 2 - ], - "9-gigantamax": [ - 0, - 1, - 2 - ], - "9-mega": [ - 0, - 2, - 2 - ], - "9": [ - 0, - 2, - 2 - ], - "19": [ - 0, - 1, - 1 - ], - "20": [ - 0, - 1, - 1 - ], - "23": [ - 0, - 1, - 1 - ], - "24": [ - 0, - 1, - 1 - ], - "29": [ - 0, - 1, - 1 - ], - "30": [ - 0, - 1, - 1 - ], - "31": [ - 1, - 1, - 1 - ], - "35": [ - 0, - 1, - 1 - ], - "36": [ - 0, - 2, - 1 - ], - "37": [ - 0, - 1, - 1 - ], - "38": [ - 0, - 1, - 1 - ], - "41": [ - 0, - 1, - 1 - ], - "42": [ - 0, - 1, - 1 - ], - "43": [ - 0, - 1, - 1 - ], - "44": [ - 0, - 1, - 1 - ], - "45": [ - 0, - 1, - 1 - ], - "46": [ - 1, - 1, - 1 - ], - "47": [ - 1, - 1, - 1 - ], - "50": [ - 0, - 1, - 1 - ], - "51": [ - 0, - 1, - 1 - ], - "52-gigantamax": [ - 1, - 1, - 1 - ], - "52": [ - 1, - 1, - 1 - ], - "53": [ - 1, - 1, - 1 - ], - "56": [ - 1, - 1, - 1 - ], - "57": [ - 1, - 1, - 1 - ], - "69": [ - 0, - 1, - 1 - ], - "70": [ - 0, - 1, - 1 - ], - "71": [ - 0, - 1, - 1 - ], - "77": [ - 0, - 1, - 1 - ], - "78": [ - 0, - 1, - 1 - ], - "79": [ - 1, - 1, - 1 - ], - "80": [ - 0, - 1, - 1 - ], - "80-mega": [ - 0, - 1, - 1 - ], - "81": [ - 0, - 1, - 1 - ], - "82": [ - 0, - 1, - 1 - ], - "83": [ - 0, - 2, - 2 - ], - "84": [ - 1, - 1, - 1 - ], - "85": [ - 1, - 1, - 1 - ], - "86": [ - 1, - 1, - 1 - ], - "87": [ - 1, - 1, - 1 - ], - "92": [ - 2, - 2, - 2 - ], - "93": [ - 1, - 1, - 1 - ], - "94-gigantamax": [ - 1, - 1, - 1 - ], - "94-mega": [ - 1, - 1, - 1 - ], - "94": [ - 1, - 1, - 1 - ], - "98": [ - 0, - 1, - 1 - ], - "99": [ - 0, - 1, - 1 - ], - "99-gigantamax": [ - 0, - 1, - 1 - ], - "100": [ - 0, - 1, - 1 - ], - "101": [ - 0, - 1, - 1 - ], - "111": [ - 0, - 1, - 1 - ], - "112": [ - 0, - 1, - 1 - ], - "113": [ - 1, - 1, - 1 - ], - "114": [ - 0, - 1, - 1 - ], - "116": [ - 0, - 1, - 1 - ], - "117": [ - 0, - 1, - 1 - ], - "118": [ - 1, - 1, - 1 - ], - "119": [ - 1, - 1, - 1 - ], - "120": [ - 0, - 1, - 1 - ], - "121": [ - 0, - 1, - 1 - ], - "123": [ - 1, - 1, - 1 - ], - "125": [ - 1, - 1, - 2 - ], - "126": [ - 0, - 2, - 1 - ], - "127-mega": [ - 0, - 1, - 1 - ], - "127": [ - 0, - 1, - 1 - ], - "129": [ - 0, - 1, - 1 - ], - "130-mega": [ - 0, - 1, - 1 - ], - "130": [ - 0, - 1, - 1 - ], - "131-gigantamax": [ - 0, - 1, - 1 - ], - "131": [ - 0, - 1, - 1 - ], - "132": [ - 0, - 1, - 1 - ], - "133": [ - 0, - 1, - 1 - ], - "133-partner": [ - 0, - 1, - 1 - ], - "134": [ - 0, - 1, - 1 - ], - "135": [ - 1, - 1, - 1 - ], - "136": [ - 1, - 1, - 1 - ], - "137": [ - 0, - 1, - 1 - ], - "138": [ - 0, - 1, - 1 - ], - "139": [ - 0, - 1, - 1 - ], - "140": [ - 0, - 1, - 1 - ], - "141": [ - 0, - 1, - 1 - ], - "142-mega": [ - 0, - 1, - 1 - ], - "142": [ - 0, - 1, - 1 - ], - "144": [ - 1, - 1, - 1 - ], - "145": [ - 1, - 1, - 1 - ], - "146": [ - 1, - 1, - 1 - ], - "147": [ - 0, - 1, - 1 - ], - "148": [ - 0, - 1, - 1 - ], - "149": [ - 0, - 1, - 1 - ], - "150-mega-x": [ - 0, - 1, - 1 - ], - "150-mega-y": [ - 0, - 1, - 1 - ], - "150": [ - 0, - 1, - 1 - ], - "151": [ - 0, - 1, - 1 - ], - "161": [ - 0, - 1, - 1 - ], - "162": [ - 0, - 1, - 1 - ], - "163": [ - 0, - 1, - 1 - ], - "164": [ - 0, - 1, - 1 - ], - "169": [ - 0, - 1, - 1 - ], - "173": [ - 0, - 1, - 1 - ], - "175": [ - 1, - 1, - 1 - ], - "176": [ - 1, - 1, - 1 - ], - "177": [ - 0, - 1, - 1 - ], - "178": [ - 0, - 2, - 2 - ], - "179": [ - 0, - 1, - 1 - ], - "180": [ - 0, - 1, - 2 - ], - "181-mega": [ - 0, - 1, - 2 - ], - "181": [ - 0, - 1, - 1 - ], - "182": [ - 0, - 1, - 1 - ], - "183": [ - 0, - 1, - 1 - ], - "184": [ - 0, - 1, - 1 - ], - "185": [ - 0, - 1, - 1 - ], - "190": [ - 0, - 1, - 1 - ], - "193": [ - 0, - 1, - 1 - ], - "196": [ - 1, - 1, - 1 - ], - "197": [ - 0, - 1, - 1 - ], - "199": [ - 2, - 1, - 1 - ], - "200": [ - 1, - 2, - 2 - ], - "201-m": [ - 0, - 1, - 1 - ], - "201-question": [ - 0, - 1, - 1 - ], - "201-j": [ - 0, - 1, - 1 - ], - "201-l": [ - 0, - 1, - 1 - ], - "201-h": [ - 0, - 1, - 1 - ], - "201-x": [ - 0, - 1, - 1 - ], - "201-exclamation": [ - 0, - 1, - 1 - ], - "201-q": [ - 0, - 1, - 1 - ], - "201-s": [ - 0, - 1, - 1 - ], - "201-c": [ - 0, - 1, - 1 - ], - "201-u": [ - 0, - 1, - 1 - ], - "201-t": [ - 0, - 1, - 1 - ], - "201-z": [ - 0, - 1, - 1 - ], - "201-d": [ - 0, - 1, - 1 - ], - "201-b": [ - 0, - 1, - 1 - ], - "201-g": [ - 0, - 1, - 1 - ], - "201-k": [ - 0, - 1, - 1 - ], - "201-i": [ - 0, - 1, - 1 - ], - "201-p": [ - 0, - 1, - 1 - ], - "201-e": [ - 0, - 1, - 1 - ], - "201-y": [ - 0, - 1, - 1 - ], - "201-r": [ - 0, - 1, - 1 - ], - "201-f": [ - 0, - 1, - 1 - ], - "201-n": [ - 0, - 1, - 1 - ], - "201-v": [ - 0, - 1, - 1 - ], - "201-a": [ - 0, - 1, - 1 - ], - "201-w": [ - 0, - 1, - 1 - ], - "201-o": [ - 0, - 1, - 1 - ], - "203": [ - 0, - 1, - 1 - ], - "206": [ - 0, - 1, - 1 - ], - "207": [ - 0, - 1, - 1 - ], - "212-mega": [ - 1, - 2, - 1 - ], - "212": [ - 1, - 1, - 1 - ], - "213": [ - 0, - 1, - 1 - ], - "215": [ - 0, - 1, - 1 - ], - "216": [ - 1, - 1, - 1 - ], - "217": [ - 1, - 1, - 1 - ], - "222": [ - 0, - 1, - 1 - ], - "226": [ - 0, - 1, - 1 - ], - "227": [ - 0, - 1, - 1 - ], - "228": [ - 0, - 1, - 1 - ], - "229": [ - 0, - 1, - 1 - ], - "229-mega": [ - 0, - 1, - 1 - ], - "230": [ - 0, - 1, - 1 - ], - "231": [ - 0, - 1, - 1 - ], - "232": [ - 0, - 1, - 1 - ], - "233": [ - 0, - 1, - 1 - ], - "235": [ - 0, - 1, - 1 - ], - "239": [ - 1, - 1, - 2 - ], - "240": [ - 0, - 1, - 1 - ], - "242": [ - 1, - 1, - 1 - ], - "243": [ - 0, - 1, - 1 - ], - "244": [ - 0, - 2, - 2 - ], - "245": [ - 0, - 1, - 1 - ], - "246": [ - 0, - 1, - 1 - ], - "247": [ - 0, - 1, - 1 - ], - "248": [ - 0, - 1, - 1 - ], - "248-mega": [ - 0, - 1, - 1 - ], - "249": [ - 0, - 1, - 1 - ], - "250": [ - 0, - 1, - 1 - ], - "251": [ - 0, - 1, - 1 - ], - "255": [ - 0, - 1, - 1 - ], - "256": [ - 0, - 1, - 1 - ], - "257": [ - 0, - 1, - 1 - ], - "257-mega": [ - 0, - 1, - 1 - ], - "261": [ - 0, - 1, - 1 - ], - "262": [ - 0, - 1, - 1 - ], - "263": [ - 0, - 1, - 1 - ], - "264": [ - 0, - 1, - 1 - ], - "278": [ - 1, - 1, - 1 - ], - "279": [ - 1, - 1, - 1 - ], - "280": [ - 0, - 1, - 1 - ], - "281": [ - 0, - 1, - 1 - ], - "282-mega": [ - 0, - 1, - 1 - ], - "282": [ - 0, - 1, - 1 - ], - "285": [ - 0, - 1, - 1 - ], - "286": [ - 0, - 1, - 1 - ], - "290": [ - 1, - 1, - 1 - ], - "291": [ - 2, - 2, - 2 - ], - "292": [ - 2, - 2, - 2 - ], - "298": [ - 0, - 1, - 1 - ], - "300": [ - 1, - 1, - 1 - ], - "301": [ - 1, - 1, - 1 - ], - "302": [ - 0, - 1, - 1 - ], - "302-mega": [ - 0, - 1, - 1 - ], - "303-mega": [ - 1, - 1, - 1 - ], - "303": [ - 1, - 1, - 1 - ], - "304": [ - 1, - 1, - 1 - ], - "305": [ - 1, - 1, - 1 - ], - "306-mega": [ - 1, - 1, - 1 - ], - "306": [ - 1, - 1, - 1 - ], - "307": [ - 0, - 1, - 1 - ], - "308-mega": [ - 0, - 1, - 1 - ], - "308": [ - 0, - 1, - 1 - ], - "309": [ - 0, - 1, - 1 - ], - "310-mega": [ - 0, - 1, - 1 - ], - "310": [ - 0, - 1, - 1 - ], - "311": [ - 1, - 1, - 1 - ], - "312": [ - 0, - 1, - 1 - ], - "315": [ - 0, - 1, - 1 - ], - "320": [ - 0, - 1, - 1 - ], - "321": [ - 0, - 1, - 1 - ], - "327": [ - 0, - 1, - 1 - ], - "328": [ - 0, - 1, - 1 - ], - "329": [ - 0, - 1, - 1 - ], - "330": [ - 0, - 1, - 1 - ], - "333": [ - 0, - 1, - 1 - ], - "334-mega": [ - 0, - 1, - 1 - ], - "334": [ - 0, - 1, - 1 - ], - "335": [ - 0, - 2, - 2 - ], - "336": [ - 0, - 1, - 1 - ], - "337": [ - 0, - 1, - 1 - ], - "338": [ - 0, - 1, - 1 - ], - "339": [ - 0, - 2, - 1 - ], - "340": [ - 0, - 1, - 2 - ], - "341": [ - 0, - 1, - 1 - ], - "342": [ - 0, - 2, - 2 - ], - "351-rainy": [ - 1, - 1, - 1 - ], - "351-snowy": [ - 1, - 1, - 1 - ], - "351-sunny": [ - 1, - 1, - 2 - ], - "351": [ - 0, - 1, - 1 - ], - "352": [ - 1, - 1, - 1 - ], - "353": [ - 0, - 1, - 1 - ], - "354": [ - 0, - 1, - 1 - ], - "354-mega": [ - 0, - 1, - 1 - ], - "357": [ - 0, - 1, - 1 - ], - "358": [ - 1, - 1, - 1 - ], - "361": [ - 0, - 1, - 1 - ], - "362": [ - 0, - 1, - 1 - ], - "362-mega": [ - 0, - 1, - 1 - ], - "369": [ - 0, - 2, - 2 - ], - "370": [ - 0, - 2, - 2 - ], - "371": [ - 0, - 1, - 1 - ], - "372": [ - 0, - 1, - 1 - ], - "373-mega": [ - 0, - 1, - 1 - ], - "373": [ - 0, - 1, - 1 - ], - "374": [ - 0, - 1, - 1 - ], - "375": [ - 0, - 1, - 1 - ], - "376-mega": [ - 0, - 1, - 1 - ], - "376": [ - 0, - 1, - 1 - ], - "380-mega": [ - 0, - 1, - 1 - ], - "380": [ - 0, - 1, - 1 - ], - "381-mega": [ - 0, - 1, - 1 - ], - "381": [ - 0, - 1, - 1 - ], - "382-primal": [ - 0, - 1, - 1 - ], - "382": [ - 0, - 1, - 1 - ], - "383-primal": [ - 0, - 1, - 1 - ], - "383": [ - 0, - 1, - 1 - ], - "384-mega": [ - 0, - 1, - 1 - ], - "384": [ - 0, - 1, - 1 - ], - "385": [ - 1, - 1, - 1 - ], - "387": [ - 0, - 2, - 1 - ], - "388": [ - 0, - 1, - 1 - ], - "389": [ - 0, - 1, - 1 - ], - "393": [ - 0, - 1, - 1 - ], - "394": [ - 0, - 1, - 1 - ], - "395": [ - 0, - 1, - 1 - ], - "399": [ - 0, - 2, - 1 - ], - "400": [ - 0, - 1, - 1 - ], - "401": [ - 0, - 1, - 1 - ], - "402": [ - 0, - 1, - 1 - ], - "406": [ - 0, - 1, - 1 - ], - "407": [ - 0, - 1, - 1 - ], - "412-sandy": [ - 2, - 2, - 2 - ], - "412-plant": [ - 1, - 1, - 1 - ], - "412-trash": [ - 1, - 1, - 1 - ], - "413-plant": [ - 1, - 1, - 1 - ], - "413-trash": [ - 1, - 1, - 1 - ], - "413-sandy": [ - 1, - 1, - 1 - ], - "414": [ - 0, - 1, - 1 - ], - "418": [ - 0, - 1, - 1 - ], - "419": [ - 0, - 1, - 1 - ], - "422-west": [ - 1, - 1, - 1 - ], - "422-east": [ - 1, - 1, - 1 - ], - "423-west": [ - 1, - 1, - 1 - ], - "423-east": [ - 1, - 1, - 1 - ], - "424": [ - 0, - 1, - 1 - ], - "425": [ - 0, - 1, - 1 - ], - "426": [ - 0, - 1, - 1 - ], - "427": [ - 0, - 1, - 1 - ], - "428-mega": [ - 0, - 1, - 1 - ], - "428": [ - 0, - 1, - 1 - ], - "429": [ - 1, - 1, - 1 - ], - "433": [ - 1, - 1, - 1 - ], - "436": [ - 0, - 1, - 1 - ], - "437": [ - 0, - 1, - 1 - ], - "438": [ - 0, - 1, - 1 - ], - "440": [ - 1, - 1, - 1 - ], - "441": [ - 0, - 1, - 2 - ], - "442": [ - 0, - 1, - 1 - ], - "443": [ - 1, - 1, - 1 - ], - "444": [ - 1, - 1, - 1 - ], - "445-mega": [ - 1, - 1, - 1 - ], - "445": [ - 1, - 1, - 1 - ], - "447": [ - 1, - 1, - 1 - ], - "448-mega": [ - 1, - 1, - 1 - ], - "448": [ - 1, - 1, - 1 - ], - "453": [ - 0, - 1, - 1 - ], - "454": [ - 0, - 1, - 1 - ], - "456": [ - 0, - 1, - 1 - ], - "457": [ - 0, - 2, - 1 - ], - "458": [ - 0, - 2, - 2 - ], - "461": [ - 0, - 1, - 1 - ], - "462": [ - 0, - 1, - 1 - ], - "464": [ - 0, - 1, - 1 - ], - "465": [ - 0, - 1, - 1 - ], - "466": [ - 2, - 1, - 1 - ], - "467": [ - 0, - 1, - 1 - ], - "468": [ - 1, - 1, - 1 - ], - "469": [ - 0, - 1, - 1 - ], - "470": [ - 2, - 2, - 1 - ], - "471": [ - 1, - 1, - 1 - ], - "472": [ - 0, - 1, - 1 - ], - "474": [ - 0, - 1, - 1 - ], - "475-mega": [ - 0, - 2, - 2 - ], - "475": [ - 0, - 1, - 1 - ], - "478": [ - 0, - 2, - 1 - ], - "479-heat": [ - 0, - 1, - 1 - ], - "479-wash": [ - 0, - 1, - 1 - ], - "479-mow": [ - 0, - 1, - 1 - ], - "479-frost": [ - 0, - 1, - 1 - ], - "479": [ - 0, - 1, - 1 - ], - "479-fan": [ - 0, - 1, - 1 - ], - "480": [ - 1, - 1, - 1 - ], - "481": [ - 1, - 1, - 1 - ], - "482": [ - 1, - 1, - 1 - ], - "485": [ - 0, - 1, - 1 - ], - "487-altered": [ - 0, - 1, - 1 - ], - "487-origin": [ - 0, - 1, - 1 - ], - "488": [ - 0, - 1, - 1 - ], - "489": [ - 1, - 1, - 1 - ], - "490": [ - 1, - 1, - 1 - ], - "491": [ - 0, - 1, - 1 - ], - "492-land": [ - 0, - 1, - 1 - ], - "492-sky": [ - 0, - 1, - 1 - ], - "494": [ - 0, - 1, - 1 - ], - "495": [ - 0, - 1, - 1 - ], - "496": [ - 0, - 1, - 1 - ], - "497": [ - 0, - 1, - 1 - ], - "517": [ - 0, - 1, - 1 - ], - "518": [ - 0, - 1, - 1 - ], - "524": [ - 0, - 1, - 1 - ], - "525": [ - 0, - 1, - 1 - ], - "526": [ - 0, - 1, - 1 - ], - "529": [ - 0, - 2, - 2 - ], - "530": [ - 0, - 1, - 2 - ], - "531": [ - 0, - 1, - 1 - ], - "531-mega": [ - 0, - 1, - 1 - ], - "532": [ - 0, - 1, - 1 - ], - "533": [ - 0, - 1, - 1 - ], - "534": [ - 0, - 1, - 1 - ], - "538": [ - 0, - 1, - 1 - ], - "539": [ - 0, - 2, - 2 - ], - "540": [ - 0, - 1, - 1 - ], - "541": [ - 0, - 1, - 1 - ], - "542": [ - 0, - 1, - 1 - ], - "543": [ - 0, - 1, - 1 - ], - "544": [ - 0, - 1, - 1 - ], - "545": [ - 0, - 1, - 1 - ], - "546": [ - 0, - 1, - 1 - ], - "547": [ - 0, - 1, - 1 - ], - "548": [ - 1, - 1, - 1 - ], - "549": [ - 0, - 1, - 1 - ], - "551": [ - 0, - 1, - 1 - ], - "552": [ - 0, - 1, - 1 - ], - "553": [ - 0, - 1, - 1 - ], - "556": [ - 0, - 1, - 1 - ], - "559": [ - 1, - 1, - 1 - ], - "560": [ - 1, - 1, - 1 - ], - "562": [ - 0, - 1, - 1 - ], - "563": [ - 0, - 1, - 1 - ], - "568": [ - 0, - 1, - 1 - ], - "569-gigantamax": [ - 0, - 1, - 1 - ], - "569": [ - 0, - 1, - 1 - ], - "570": [ - 0, - 1, - 1 - ], - "571": [ - 0, - 1, - 1 - ], - "572": [ - 0, - 1, - 1 - ], - "577": [ - 1, - 1, - 1 - ], - "578": [ - 1, - 1, - 1 - ], - "579": [ - 1, - 1, - 1 - ], - "585-autumn": [ - 2, - 0, - 0 - ], - "585-spring": [ - 2, - 0, - 0 - ], - "585-summer": [ - 1, - 0, - 0 - ], - "585-winter": [ - 2, - 0, - 0 - ], - "586-autumn": [ - 1, - 0, - 0 - ], - "586-spring": [ - 1, - 0, - 0 - ], - "586-summer": [ - 1, - 0, - 0 - ], - "586-winter": [ - 1, - 0, - 0 - ], - "592": [ - 0, - 1, - 2 - ], - "593": [ - 0, - 1, - 1 - ], - "594": [ - 0, - 1, - 2 - ], - "595": [ - 0, - 1, - 1 - ], - "596": [ - 0, - 1, - 1 - ], - "602": [ - 0, - 1, - 1 - ], - "603": [ - 0, - 1, - 1 - ], - "604": [ - 0, - 1, - 1 - ], - "605": [ - 1, - 1, - 1 - ], - "606": [ - 1, - 1, - 1 - ], - "607": [ - 0, - 1, - 1 - ], - "608": [ - 0, - 1, - 1 - ], - "609": [ - 0, - 1, - 1 - ], - "610": [ - 0, - 1, - 1 - ], - "611": [ - 0, - 1, - 1 - ], - "612": [ - 0, - 1, - 1 - ], - "618": [ - 0, - 2, - 2 - ], - "619": [ - 0, - 1, - 1 - ], - "620": [ - 0, - 1, - 1 - ], - "622": [ - 0, - 1, - 1 - ], - "623": [ - 0, - 1, - 1 - ], - "631": [ - 0, - 2, - 2 - ], - "632": [ - 0, - 1, - 1 - ], - "633": [ - 0, - 1, - 1 - ], - "634": [ - 0, - 1, - 1 - ], - "635": [ - 0, - 1, - 1 - ], - "636": [ - 0, - 1, - 1 - ], - "637": [ - 0, - 1, - 1 - ], - "640": [ - 0, - 1, - 1 - ], - "641-incarnate": [ - 0, - 0, - 0 - ], - "641-therian": [ - 0, - 0, - 0 - ], - "642-incarnate": [ - 0, - 0, - 0 - ], - "642-therian": [ - 0, - 0, - 0 - ], - "645-incarnate": [ - 0, - 0, - 0 - ], - "645-therian": [ - 0, - 0, - 0 - ], - "647-resolute": [ - 0, - 1, - 1 - ], - "647-ordinary": [ - 0, - 1, - 1 - ], - "648-aria": [ - 0, - 1, - 1 - ], - "648-pirouette": [ - 0, - 1, - 1 - ], - "649-burn": [ - 0, - 1, - 1 - ], - "649-chill": [ - 0, - 1, - 1 - ], - "649-douse": [ - 0, - 1, - 1 - ], - "649-shock": [ - 0, - 1, - 1 - ], - "649": [ - 0, - 1, - 1 - ], - "653": [ - 0, - 1, - 1 - ], - "654": [ - 0, - 1, - 1 - ], - "655": [ - 0, - 1, - 1 - ], - "664": [ - 0, - 1, - 1 - ], - "665": [ - 0, - 1, - 1 - ], - "666-archipelago": [ - 0, - 1, - 1 - ], - "666-continental": [ - 0, - 1, - 1 - ], - "666-elegant": [ - 0, - 1, - 1 - ], - "666-fancy": [ - 0, - 2, - 2 - ], - "666-garden": [ - 0, - 1, - 1 - ], - "666-high-plains": [ - 0, - 1, - 1 - ], - "666-icy-snow": [ - 0, - 1, - 1 - ], - "666-jungle": [ - 0, - 1, - 1 - ], - "666-marine": [ - 0, - 1, - 1 - ], - "666-meadow": [ - 0, - 1, - 1 - ], - "666-modern": [ - 0, - 1, - 1 - ], - "666-monsoon": [ - 0, - 1, - 1 - ], - "666-ocean": [ - 0, - 1, - 1 - ], - "666-poke-ball": [ - 0, - 1, - 1 - ], - "666-polar": [ - 0, - 1, - 1 - ], - "666-river": [ - 0, - 2, - 1 - ], - "666-sandstorm": [ - 0, - 1, - 1 - ], - "666-savanna": [ - 0, - 1, - 1 - ], - "666-sun": [ - 0, - 1, - 1 - ], - "666-tundra": [ - 0, - 1, - 1 - ], - "669-red": [ - 0, - 1, - 1 - ], - "669-blue": [ - 0, - 1, - 1 - ], - "669-white": [ - 0, - 1, - 1 - ], - "669-yellow": [ - 0, - 1, - 1 - ], - "669-orange": [ - 0, - 1, - 1 - ], - "670-white": [ - 0, - 1, - 1 - ], - "670-blue": [ - 0, - 1, - 1 - ], - "670-orange": [ - 0, - 1, - 1 - ], - "670-red": [ - 0, - 1, - 1 - ], - "670-yellow": [ - 0, - 1, - 1 - ], - "671-red": [ - 0, - 1, - 1 - ], - "671-blue": [ - 0, - 1, - 1 - ], - "671-yellow": [ - 0, - 1, - 1 - ], - "671-white": [ - 0, - 1, - 1 - ], - "671-orange": [ - 0, - 1, - 1 - ], - "672": [ - 0, - 1, - 1 - ], - "673": [ - 0, - 1, - 1 - ], - "677": [ - 0, - 1, - 1 - ], - "678-female": [ - 0, - 1, - 1 - ], - "678": [ - 0, - 1, - 1 - ], - "690": [ - 0, - 1, - 1 - ], - "691": [ - 0, - 1, - 1 - ], - "696": [ - 0, - 1, - 1 - ], - "697": [ - 0, - 1, - 1 - ], - "698": [ - 0, - 1, - 1 - ], - "699": [ - 0, - 1, - 1 - ], - "700": [ - 0, - 1, - 1 - ], - "702": [ - 0, - 1, - 1 - ], - "703": [ - 0, - 1, - 1 - ], - "704": [ - 0, - 1, - 1 - ], - "705": [ - 0, - 1, - 1 - ], - "706": [ - 0, - 1, - 1 - ], - "708": [ - 0, - 1, - 1 - ], - "709": [ - 0, - 1, - 1 - ], - "710": [ - 0, - 1, - 1 - ], - "711": [ - 1, - 1, - 1 - ], - "712": [ - 0, - 1, - 1 - ], - "713": [ - 0, - 1, - 1 - ], - "714": [ - 0, - 1, - 1 - ], - "715": [ - 0, - 2, - 2 - ], - "716-active": [ - 0, - 1, - 1 - ], - "716-neutral": [ - 0, - 1, - 1 - ], - "717": [ - 0, - 1, - 1 - ], - "720-unbound": [ - 1, - 1, - 1 - ], - "720": [ - 1, - 1, - 1 - ], - "728": [ - 0, - 1, - 1 - ], - "729": [ - 0, - 1, - 1 - ], - "730": [ - 0, - 1, - 1 - ], - "734": [ - 0, - 1, - 1 - ], - "735": [ - 0, - 1, - 1 - ], - "742": [ - 0, - 2, - 2 - ], - "743": [ - 0, - 2, - 2 - ], - "747": [ - 0, - 1, - 1 - ], - "748": [ - 0, - 1, - 1 - ], - "751": [ - 0, - 1, - 1 - ], - "752": [ - 0, - 1, - 1 - ], - "753": [ - 0, - 1, - 1 - ], - "754": [ - 0, - 2, - 2 - ], - "755": [ - 0, - 1, - 1 - ], - "756": [ - 0, - 1, - 1 - ], - "761": [ - 0, - 1, - 1 - ], - "762": [ - 0, - 1, - 1 - ], - "763": [ - 0, - 1, - 1 - ], - "767": [ - 0, - 1, - 1 - ], - "768": [ - 0, - 1, - 1 - ], - "771": [ - 0, - 1, - 1 - ], - "772": [ - 0, - 1, - 1 - ], - "773-fighting": [ - 0, - 1, - 1 - ], - "773-psychic": [ - 0, - 1, - 1 - ], - "773-poison": [ - 0, - 1, - 1 - ], - "773-ground": [ - 0, - 1, - 1 - ], - "773-ghost": [ - 0, - 1, - 1 - ], - "773-steel": [ - 0, - 1, - 1 - ], - "773-rock": [ - 0, - 1, - 1 - ], - "773-grass": [ - 0, - 1, - 1 - ], - "773-dragon": [ - 0, - 1, - 1 - ], - "773-bug": [ - 0, - 1, - 1 - ], - "773-ice": [ - 0, - 1, - 1 - ], - "773-dark": [ - 0, - 1, - 1 - ], - "773": [ - 0, - 1, - 1 - ], - "773-fairy": [ - 0, - 1, - 1 - ], - "773-water": [ - 0, - 1, - 1 - ], - "773-electric": [ - 0, - 1, - 1 - ], - "773-flying": [ - 0, - 1, - 1 - ], - "773-fire": [ - 0, - 1, - 1 - ], - "776": [ - 0, - 1, - 1 - ], - "777": [ - 0, - 1, - 1 - ], - "778-busted": [ - 0, - 1, - 1 - ], - "778-disguised": [ - 0, - 1, - 1 - ], - "779": [ - 0, - 1, - 1 - ], - "789": [ - 1, - 1, - 1 - ], - "790": [ - 0, - 1, - 1 - ], - "791-radiant-sun": [ - 0, - 1, - 1 - ], - "791": [ - 2, - 1, - 1 - ], - "792-full-moon": [ - 0, - 1, - 1 - ], - "792": [ - 0, - 1, - 1 - ], - "793": [ - 0, - 1, - 1 - ], - "797": [ - 0, - 1, - 1 - ], - "798": [ - 0, - 1, - 1 - ], - "800-dawn-wings": [ - 0, - 1, - 1 - ], - "800-dusk-mane": [ - 0, - 1, - 1 - ], - "800-ultra": [ - 0, - 1, - 1 - ], - "800": [ - 0, - 1, - 1 - ], - "802": [ - 1, - 1, - 1 - ], - "803": [ - 0, - 1, - 1 - ], - "804": [ - 0, - 1, - 1 - ], - "808": [ - 0, - 1, - 1 - ], - "809-gigantamax": [ - 0, - 1, - 1 - ], - "809": [ - 0, - 1, - 1 - ], - "816": [ - 0, - 1, - 1 - ], - "817": [ - 0, - 1, - 1 - ], - "818-gigantamax": [ - 1, - 1, - 1 - ], - "818": [ - 0, - 1, - 1 - ], - "821": [ - 0, - 1, - 1 - ], - "822": [ - 0, - 1, - 1 - ], - "823-gigantamax": [ - 0, - 2, - 2 - ], - "823": [ - 0, - 1, - 1 - ], - "829": [ - 0, - 1, - 1 - ], - "830": [ - 0, - 1, - 1 - ], - "835": [ - 0, - 1, - 1 - ], - "836": [ - 0, - 1, - 1 - ], - "850": [ - 0, - 1, - 1 - ], - "851-gigantamax": [ - 0, - 1, - 1 - ], - "851": [ - 0, - 1, - 1 - ], - "854": [ - 0, - 1, - 1 - ], - "855": [ - 0, - 1, - 1 - ], - "856": [ - 0, - 1, - 1 - ], - "857": [ - 0, - 2, - 2 - ], - "858-gigantamax": [ - 0, - 1, - 1 - ], - "858": [ - 0, - 1, - 1 - ], - "859": [ - 0, - 1, - 1 - ], - "860": [ - 0, - 1, - 1 - ], - "861-gigantamax": [ - 0, - 1, - 1 - ], - "861": [ - 0, - 1, - 1 - ], - "862": [ - 0, - 1, - 1 - ], - "863": [ - 0, - 1, - 1 - ], - "864": [ - 0, - 1, - 1 - ], - "867": [ - 0, - 1, - 1 - ], - "872": [ - 1, - 1, - 1 - ], - "873": [ - 1, - 1, - 1 - ], - "876-female": [ - 0, - 1, - 1 - ], - "876": [ - 0, - 1, - 1 - ], - "877-hangry": [ - 1, - 1, - 1 - ], - "877": [ - 1, - 1, - 1 - ], - "880": [ - 0, - 1, - 1 - ], - "881": [ - 0, - 2, - 2 - ], - "882": [ - 0, - 1, - 1 - ], - "883": [ - 0, - 1, - 1 - ], - "884-gigantamax": [ - 0, - 1, - 1 - ], - "884": [ - 0, - 1, - 1 - ], - "885": [ - 1, - 1, - 1 - ], - "886": [ - 1, - 1, - 1 - ], - "887": [ - 1, - 1, - 1 - ], - "888": [ - 0, - 1, - 1 - ], - "888-crowned": [ - 0, - 1, - 1 - ], - "889": [ - 0, - 1, - 1 - ], - "889-crowned": [ - 0, - 1, - 1 - ], - "890-eternamax": [ - 0, - 1, - 1 - ], - "890": [ - 0, - 1, - 1 - ], - "891": [ - 1, - 1, - 1 - ], - "892-gigantamax-rapid": [ - 1, - 2, - 2 - ], - "892-rapid-strike": [ - 1, - 1, - 1 - ], - "892": [ - 1, - 1, - 1 - ], - "892-gigantamax-single": [ - 1, - 2, - 2 - ], - "896": [ - 1, - 1, - 1 - ], - "897": [ - 1, - 1, - 1 - ], - "898": [ - 1, - 1, - 1 - ], - "898-ice": [ - 1, - 1, - 1 - ], - "898-shadow": [ - 1, - 1, - 1 - ], - "900": [ - 0, - 1, - 1 - ], - "901": [ - 0, - 1, - 1 - ], - "903": [ - 0, - 1, - 1 - ], - "909": [ - 0, - 1, - 1 - ], - "910": [ - 0, - 2, - 2 - ], - "911": [ - 0, - 1, - 1 - ], - "912": [ - 0, - 1, - 1 - ], - "913": [ - 0, - 1, - 1 - ], - "914": [ - 0, - 1, - 1 - ], - "919": [ - 1, - 1, - 1 - ], - "920": [ - 1, - 1, - 1 - ], - "924": [ - 1, - 1, - 1 - ], - "925-four": [ - 1, - 1, - 1 - ], - "925-three": [ - 1, - 1, - 1 - ], - "932": [ - 0, - 1, - 1 - ], - "933": [ - 0, - 1, - 1 - ], - "934": [ - 0, - 1, - 1 - ], - "935": [ - 2, - 2, - 2 - ], - "936": [ - 1, - 1, - 1 - ], - "937": [ - 1, - 1, - 1 - ], - "940": [ - 0, - 1, - 1 - ], - "941": [ - 0, - 1, - 1 - ], - "948": [ - 0, - 1, - 1 - ], - "949": [ - 0, - 1, - 1 - ], - "951": [ - 0, - 1, - 1 - ], - "952": [ - 0, - 1, - 1 - ], - "953": [ - 0, - 1, - 1 - ], - "954": [ - 0, - 1, - 1 - ], - "957": [ - 1, - 1, - 1 - ], - "958": [ - 1, - 1, - 1 - ], - "959": [ - 1, - 1, - 1 - ], - "962": [ - 1, - 1, - 1 - ], - "967": [ - 0, - 1, - 1 - ], - "968": [ - 0, - 1, - 1 - ], - "969": [ - 0, - 1, - 1 - ], - "970": [ - 0, - 1, - 1 - ], - "973": [ - 1, - 1, - 1 - ], - "974": [ - 0, - 1, - 1 - ], - "975": [ - 0, - 1, - 1 - ], - "978-curly": [ - 0, - 2, - 2 - ], - "978-droopy": [ - 0, - 2, - 2 - ], - "978-stretchy": [ - 0, - 1, - 1 - ], - "979": [ - 1, - 1, - 1 - ], - "981": [ - 0, - 1, - 1 - ], - "982": [ - 0, - 1, - 2 - ], - "982-three-segment": [ - 0, - 1, - 2 - ], - "987": [ - 1, - 1, - 1 - ], - "988": [ - 0, - 1, - 1 - ], - "993": [ - 0, - 1, - 1 - ], - "994": [ - 0, - 1, - 1 - ], - "995": [ - 0, - 1, - 1 - ], - "996": [ - 0, - 1, - 1 - ], - "997": [ - 0, - 1, - 1 - ], - "998": [ - 0, - 1, - 1 - ], - "999": [ - 1, - 1, - 1 - ], - "1000": [ - 1, - 1, - 1 - ], - "1001": [ - 0, - 1, - 1 - ], - "1003": [ - 0, - 1, - 1 - ], - "1004": [ - 0, - 1, - 1 - ], - "1006": [ - 0, - 2, - 1 - ], - "1007-apex-build": [ - 0, - 2, - 2 - ], - "1008-ultimate-mode": [ - 1, - 1, - 1 - ], - "1010": [ - 0, - 1, - 1 - ], - "1018": [ - 0, - 1, - 1 - ], - "1022": [ - 0, - 2, - 2 - ], - "1023": [ - 0, - 1, - 1 - ], - "2027": [ - 0, - 1, - 1 - ], - "2028": [ - 0, - 1, - 1 - ], - "2052": [ - 0, - 1, - 1 - ], - "2053": [ - 0, - 1, - 1 - ], - "2670": [ - 0, - 1, - 1 - ], - "4052": [ - 0, - 1, - 1 - ], - "4077": [ - 0, - 1, - 1 - ], - "4078": [ - 0, - 1, - 1 - ], - "4079": [ - 0, - 1, - 1 - ], - "4080": [ - 2, - 1, - 1 - ], - "4144": [ - 0, - 1, - 1 - ], - "4145": [ - 0, - 1, - 1 - ], - "4146": [ - 0, - 1, - 1 - ], - "4199": [ - 2, - 1, - 1 - ], - "4222": [ - 0, - 1, - 1 - ], - "4263": [ - 0, - 1, - 1 - ], - "4264": [ - 0, - 1, - 1 - ], - "4562": [ - 0, - 1, - 1 - ], - "6100": [ - 0, - 1, - 1 - ], - "6101": [ - 0, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ], - "6549": [ - 0, - 1, - 1 - ], - "6570": [ - 0, - 1, - 1 - ], - "6571": [ - 0, - 1, - 1 - ], - "6705": [ - 0, - 1, - 1 - ], - "6706": [ - 0, - 1, - 1 - ], - "6713": [ - 0, - 1, - 1 - ], - "8901": [ - 1, - 1, - 1 - ], + "1": [0, 1, 1], + "2": [0, 1, 1], + "3-gigantamax": [0, 1, 1], + "3-mega": [0, 2, 2], + "3": [0, 1, 1], + "4": [0, 1, 1], + "5": [0, 1, 1], + "6-mega-x": [0, 1, 2], + "6-gigantamax": [0, 1, 2], + "6-mega-y": [0, 1, 2], + "6": [0, 2, 2], + "7": [0, 2, 2], + "8": [0, 2, 2], + "9-gigantamax": [0, 1, 2], + "9-mega": [0, 2, 2], + "9": [0, 2, 2], + "19": [0, 1, 1], + "20": [0, 1, 1], + "23": [0, 1, 1], + "24": [0, 1, 1], + "25": [0, 1, 1], + "25-beauty-cosplay": [0, 1, 1], + "25-cool-cosplay": [0, 1, 1], + "25-cosplay": [0, 1, 1], + "25-cute-cosplay": [0, 1, 1], + "25-gigantamax": [0, 1, 1], + "25-partner": [0, 1, 1], + "25-smart-cosplay": [0, 1, 1], + "25-tough-cosplay": [0, 1, 1], + "26": [0, 1, 1], + "29": [0, 1, 1], + "30": [0, 1, 1], + "31": [1, 1, 1], + "35": [0, 1, 1], + "36": [0, 2, 1], + "37": [0, 1, 1], + "38": [0, 1, 1], + "39": [0, 1, 1], + "40": [0, 1, 1], + "41": [0, 1, 1], + "42": [0, 1, 1], + "43": [0, 1, 1], + "44": [0, 1, 1], + "45": [0, 1, 1], + "46": [1, 1, 1], + "47": [1, 1, 1], + "50": [0, 1, 1], + "51": [0, 1, 1], + "52-gigantamax": [1, 1, 1], + "52": [1, 1, 1], + "53": [1, 1, 1], + "56": [1, 1, 1], + "57": [1, 1, 1], + "69": [0, 1, 1], + "70": [0, 1, 1], + "71": [0, 1, 1], + "77": [0, 1, 1], + "78": [0, 1, 1], + "79": [1, 1, 1], + "80": [0, 1, 1], + "80-mega": [0, 1, 1], + "81": [0, 1, 1], + "82": [0, 1, 1], + "83": [0, 2, 2], + "84": [1, 1, 1], + "85": [1, 1, 1], + "86": [1, 1, 1], + "87": [1, 1, 1], + "92": [2, 2, 2], + "93": [1, 1, 1], + "94-gigantamax": [1, 1, 1], + "94-mega": [1, 1, 1], + "94": [1, 1, 1], + "98": [0, 1, 1], + "99": [0, 1, 1], + "99-gigantamax": [0, 1, 1], + "100": [0, 1, 1], + "101": [0, 1, 1], + "102": [0, 1, 1], + "103": [0, 1, 1], + "111": [0, 1, 1], + "112": [0, 1, 1], + "113": [1, 1, 1], + "114": [0, 1, 1], + "116": [0, 1, 1], + "117": [0, 1, 1], + "118": [1, 1, 1], + "119": [1, 1, 1], + "120": [0, 1, 1], + "121": [0, 1, 1], + "123": [1, 1, 1], + "125": [1, 1, 2], + "126": [0, 2, 1], + "127-mega": [0, 1, 1], + "127": [0, 1, 1], + "128": [0, 1, 1], + "129": [0, 1, 1], + "130-mega": [0, 1, 1], + "130": [0, 1, 1], + "131-gigantamax": [0, 1, 1], + "131": [0, 1, 1], + "132": [0, 1, 1], + "133": [0, 1, 1], + "133-partner": [0, 1, 1], + "134": [0, 1, 1], + "135": [1, 1, 1], + "136": [1, 1, 1], + "137": [0, 1, 1], + "138": [0, 1, 1], + "139": [0, 1, 1], + "140": [0, 1, 1], + "141": [0, 1, 1], + "142-mega": [0, 1, 1], + "142": [0, 1, 1], + "144": [1, 1, 1], + "145": [1, 1, 1], + "146": [1, 1, 1], + "147": [0, 1, 1], + "148": [0, 1, 1], + "149": [0, 1, 1], + "150-mega-x": [0, 1, 1], + "150-mega-y": [0, 1, 1], + "150": [0, 1, 1], + "151": [0, 1, 1], + "152": [0, 1, 1], + "153": [0, 1, 1], + "154": [0, 1, 1], + "158": [0, 1, 1], + "159": [0, 1, 1], + "160": [0, 1, 1], + "161": [0, 1, 1], + "162": [0, 1, 1], + "163": [0, 1, 1], + "164": [0, 1, 1], + "167": [0, 1, 1], + "168": [0, 1, 1], + "169": [0, 1, 1], + "170": [0, 1, 1], + "171": [0, 1, 1], + "172": [0, 1, 1], + "172-spiky": [0, 1, 1], + "173": [0, 1, 1], + "174": [0, 1, 1], + "175": [1, 1, 1], + "176": [1, 1, 1], + "177": [0, 1, 1], + "178": [0, 2, 2], + "179": [0, 1, 1], + "180": [0, 1, 2], + "181-mega": [0, 1, 2], + "181": [0, 1, 1], + "182": [0, 1, 1], + "183": [0, 1, 1], + "184": [0, 1, 1], + "185": [0, 1, 1], + "190": [0, 1, 1], + "193": [0, 1, 1], + "194": [0, 1, 1], + "195": [0, 1, 1], + "196": [1, 1, 1], + "197": [0, 1, 1], + "198": [0, 1, 1], + "199": [2, 1, 1], + "200": [1, 2, 2], + "201-m": [0, 1, 1], + "201-question": [0, 1, 1], + "201-j": [0, 1, 1], + "201-l": [0, 1, 1], + "201-h": [0, 1, 1], + "201-x": [0, 1, 1], + "201-exclamation": [0, 1, 1], + "201-q": [0, 1, 1], + "201-s": [0, 1, 1], + "201-c": [0, 1, 1], + "201-u": [0, 1, 1], + "201-t": [0, 1, 1], + "201-z": [0, 1, 1], + "201-d": [0, 1, 1], + "201-b": [0, 1, 1], + "201-g": [0, 1, 1], + "201-k": [0, 1, 1], + "201-i": [0, 1, 1], + "201-p": [0, 1, 1], + "201-e": [0, 1, 1], + "201-y": [0, 1, 1], + "201-r": [0, 1, 1], + "201-f": [0, 1, 1], + "201-n": [0, 1, 1], + "201-v": [0, 1, 1], + "201-a": [0, 1, 1], + "201-w": [0, 1, 1], + "201-o": [0, 1, 1], + "203": [0, 1, 1], + "206": [0, 1, 1], + "207": [0, 1, 1], + "211": [0, 1, 1], + "212-mega": [1, 2, 1], + "212": [1, 1, 1], + "213": [0, 1, 1], + "215": [0, 1, 1], + "216": [1, 1, 1], + "217": [1, 1, 1], + "222": [0, 1, 1], + "226": [0, 1, 1], + "227": [0, 1, 1], + "228": [0, 1, 1], + "229": [0, 1, 1], + "229-mega": [0, 1, 1], + "230": [0, 1, 1], + "231": [0, 1, 1], + "232": [0, 1, 1], + "233": [0, 1, 1], + "235": [0, 1, 1], + "239": [1, 1, 2], + "240": [0, 1, 1], + "242": [1, 1, 1], + "243": [0, 1, 1], + "244": [0, 2, 2], + "245": [0, 1, 1], + "246": [0, 1, 1], + "247": [0, 1, 1], + "248": [0, 1, 1], + "248-mega": [0, 1, 1], + "249": [0, 1, 1], + "250": [0, 1, 1], + "251": [0, 1, 1], + "255": [0, 1, 1], + "256": [0, 1, 1], + "257": [0, 1, 1], + "257-mega": [0, 1, 1], + "261": [0, 1, 1], + "262": [0, 1, 1], + "263": [0, 1, 1], + "264": [0, 1, 1], + "276": [0, 1, 1], + "277": [0, 1, 1], + "278": [1, 1, 1], + "279": [1, 1, 1], + "280": [0, 1, 1], + "281": [0, 1, 1], + "282-mega": [0, 1, 1], + "282": [0, 1, 1], + "285": [0, 1, 1], + "286": [0, 1, 1], + "290": [1, 1, 1], + "291": [2, 2, 2], + "292": [2, 2, 2], + "298": [0, 1, 1], + "300": [1, 1, 1], + "301": [1, 1, 1], + "302": [0, 1, 1], + "302-mega": [0, 1, 1], + "303-mega": [1, 1, 1], + "303": [1, 1, 1], + "304": [1, 1, 1], + "305": [1, 1, 1], + "306-mega": [1, 1, 1], + "306": [1, 1, 1], + "307": [0, 1, 1], + "308-mega": [0, 1, 1], + "308": [0, 1, 1], + "309": [0, 1, 1], + "310-mega": [0, 1, 1], + "310": [0, 1, 1], + "311": [1, 1, 1], + "312": [0, 1, 1], + "315": [0, 1, 1], + "320": [0, 1, 1], + "321": [0, 1, 1], + "327": [0, 1, 1], + "328": [0, 1, 1], + "329": [0, 1, 1], + "330": [0, 1, 1], + "333": [0, 1, 1], + "334-mega": [0, 1, 1], + "334": [0, 1, 1], + "335": [0, 2, 2], + "336": [0, 1, 1], + "337": [0, 1, 1], + "338": [0, 1, 1], + "339": [0, 2, 1], + "340": [0, 1, 2], + "341": [0, 1, 1], + "342": [0, 2, 2], + "351-rainy": [1, 1, 1], + "351-snowy": [1, 1, 1], + "351-sunny": [1, 1, 2], + "351": [0, 1, 1], + "352": [1, 1, 1], + "353": [0, 1, 1], + "354": [0, 1, 1], + "354-mega": [0, 1, 1], + "357": [0, 1, 1], + "358": [1, 1, 1], + "359": [0, 1, 1], + "359-mega": [0, 1, 1], + "361": [0, 1, 1], + "362": [0, 1, 1], + "362-mega": [0, 1, 1], + "369": [0, 2, 2], + "370": [0, 2, 2], + "371": [0, 1, 1], + "372": [0, 1, 1], + "373-mega": [0, 1, 1], + "373": [0, 1, 1], + "374": [0, 1, 1], + "375": [0, 1, 1], + "376-mega": [0, 1, 1], + "376": [0, 1, 1], + "377": [0, 1, 1], + "378": [1, 1, 1], + "379": [0, 1, 1], + "380-mega": [0, 1, 1], + "380": [0, 1, 1], + "381-mega": [0, 1, 1], + "381": [0, 1, 1], + "382-primal": [0, 1, 1], + "382": [0, 1, 1], + "383-primal": [0, 1, 1], + "383": [0, 1, 1], + "384-mega": [0, 1, 1], + "384": [0, 1, 1], + "385": [1, 1, 1], + "387": [0, 2, 1], + "388": [0, 1, 1], + "389": [0, 1, 1], + "390": [0, 1, 1], + "391": [0, 1, 1], + "392": [0, 1, 1], + "393": [0, 1, 1], + "394": [0, 1, 1], + "395": [0, 1, 1], + "399": [0, 2, 1], + "400": [0, 1, 1], + "401": [0, 1, 1], + "402": [0, 1, 1], + "406": [0, 1, 1], + "407": [0, 1, 1], + "412-sandy": [2, 2, 2], + "412-plant": [1, 1, 1], + "412-trash": [1, 1, 1], + "413-plant": [1, 1, 1], + "413-trash": [1, 1, 1], + "413-sandy": [1, 1, 1], + "414": [0, 1, 1], + "418": [0, 1, 1], + "419": [0, 1, 1], + "422-west": [1, 1, 1], + "422-east": [1, 1, 1], + "423-west": [1, 1, 1], + "423-east": [1, 1, 1], + "424": [0, 1, 1], + "425": [0, 1, 1], + "426": [0, 1, 1], + "427": [0, 1, 1], + "428-mega": [0, 1, 1], + "428": [0, 1, 1], + "429": [1, 1, 1], + "430": [0, 1, 1], + "433": [1, 1, 1], + "436": [0, 1, 1], + "437": [0, 1, 1], + "438": [0, 1, 1], + "440": [1, 1, 1], + "441": [0, 1, 2], + "442": [0, 1, 1], + "443": [1, 1, 1], + "444": [1, 1, 1], + "445-mega": [1, 1, 1], + "445": [1, 1, 1], + "447": [1, 1, 1], + "448-mega": [1, 1, 1], + "448": [1, 1, 1], + "453": [0, 1, 1], + "454": [0, 1, 1], + "455": [0, 1, 1], + "456": [0, 1, 1], + "457": [0, 2, 1], + "458": [0, 2, 2], + "461": [0, 1, 1], + "462": [0, 1, 1], + "464": [0, 1, 1], + "465": [0, 1, 1], + "466": [2, 1, 1], + "467": [0, 1, 1], + "468": [1, 1, 1], + "469": [0, 1, 1], + "470": [2, 2, 1], + "471": [1, 1, 1], + "472": [0, 1, 1], + "474": [0, 1, 1], + "475-mega": [0, 2, 2], + "475": [0, 1, 1], + "478": [0, 2, 1], + "479-heat": [0, 1, 1], + "479-wash": [0, 1, 1], + "479-mow": [0, 1, 1], + "479-frost": [0, 1, 1], + "479": [0, 1, 1], + "479-fan": [0, 1, 1], + "480": [1, 1, 1], + "481": [1, 1, 1], + "482": [1, 1, 1], + "485": [0, 1, 1], "486": [0, 1 , 1 + ] ,"487-altered": [0, 1, 1], + "487-origin": [0, 1, 1], + "488": [0, 1, 1], + "489": [1, 1, 1], + "490": [1, 1, 1], + "491": [0, 1, 1], + "492-land": [0, 1, 1], + "492-sky": [0, 1, 1], + "494": [0, 1, 1], + "495": [0, 1, 1], + "496": [0, 1, 1], + "497": [0, 1, 1], + "501": [0, 1, 1], + "502": [0, 1, 1], + "503": [0, 1, 1], + "517": [0, 1, 1], + "518": [0, 1, 1], + "524": [0, 1, 1], + "525": [0, 1, 1], + "526": [0, 1, 1], + "527": [0, 1, 1], + "528": [0, 1, 1], + "529": [0, 2, 2], + "530": [0, 1, 2], + "531": [0, 1, 1], + "531-mega": [0, 1, 1], + "532": [0, 1, 1], + "533": [0, 1, 1], + "534": [0, 1, 1], + "538": [0, 1, 1], + "539": [0, 2, 2], + "540": [0, 1, 1], + "541": [0, 1, 1], + "542": [0, 1, 1], + "543": [0, 1, 1], + "544": [0, 1, 1], + "545": [0, 1, 1], + "546": [0, 1, 1], + "547": [0, 1, 1], + "548": [1, 1, 1], + "549": [0, 1, 1], + "551": [0, 1, 1], + "552": [0, 1, 1], + "553": [0, 1, 1], + "556": [0, 1, 1], + "559": [1, 1, 1], + "560": [1, 1, 1], + "562": [0, 1, 1], + "563": [0, 1, 1], + "568": [0, 1, 1], + "569-gigantamax": [0, 1, 1], + "569": [0, 1, 1], + "570": [0, 1, 1], + "571": [0, 1, 1], + "572": [0, 1, 1], + "577": [1, 1, 1], + "578": [1, 1, 1], + "579": [1, 1, 1], + "585-autumn": [2, 0, 0], + "585-spring": [2, 0, 0], + "585-summer": [1, 0, 0], + "585-winter": [2, 0, 0], + "586-autumn": [1, 0, 0], + "586-spring": [1, 0, 0], + "586-summer": [1, 0, 0], + "586-winter": [1, 0, 0], + "587": [0, 1, 1], + "588": [0, 1, 1], + "589": [0, 1, 1], + "590": [0, 1, 1], + "591": [0, 1, 1], + "592": [0, 1, 2], + "593": [0, 1, 1], + "594": [0, 1, 2], + "595": [0, 1, 1], + "596": [0, 1, 1], + "602": [0, 1, 1], + "603": [0, 1, 1], + "604": [0, 1, 1], + "605": [1, 1, 1], + "606": [1, 1, 1], + "607": [0, 1, 1], + "608": [0, 1, 1], + "609": [0, 1, 1], + "610": [0, 1, 1], + "611": [0, 1, 1], + "612": [0, 1, 1], + "616": [0, 1, 1], + "617": [0, 1, 1], + "618": [0, 1, 1], + "619": [0, 1, 1], + "620": [0, 1, 1], + "621": [0, 1, 1], + "622": [0, 1, 1], + "623": [0, 1, 1], + "631": [0, 2, 2], + "632": [0, 1, 1], + "633": [0, 1, 1], + "634": [0, 1, 1], + "635": [0, 1, 1], + "636": [0, 1, 1], + "637": [0, 1, 1], + "640": [0, 1, 1], + "641-incarnate": [0, 0, 0], + "641-therian": [0, 0, 0], + "642-incarnate": [0, 0, 0], + "642-therian": [0, 0, 0], + "645-incarnate": [0, 0, 0], + "645-therian": [0, 0, 0], + "647-resolute": [0, 1, 1], + "647-ordinary": [0, 1, 1], + "648-aria": [0, 1, 1], + "648-pirouette": [0, 1, 1], + "649-burn": [0, 1, 1], + "649-chill": [0, 1, 1], + "649-douse": [0, 1, 1], + "649-shock": [0, 1, 1], + "649": [0, 1, 1], + "653": [0, 1, 1], + "654": [0, 1, 1], + "655": [0, 1, 1], + "656": [0, 1, 1], + "657": [0, 1, 1], + "658": [0, 1, 1], + "658-ash": [0, 1, 1], + "664": [0, 1, 1], + "665": [0, 1, 1], + "666-archipelago": [0, 1, 1], + "666-continental": [0, 1, 1], + "666-elegant": [0, 1, 1], + "666-fancy": [0, 1, 1], + "666-garden": [0, 1, 1], + "666-high-plains": [0, 1, 1], + "666-icy-snow": [0, 1, 1], + "666-jungle": [0, 1, 1], + "666-marine": [0, 1, 1], + "666-meadow": [0, 1, 1], + "666-modern": [0, 1, 1], + "666-monsoon": [0, 1, 1], + "666-ocean": [0, 1, 1], + "666-poke-ball": [0, 1, 1], + "666-polar": [0, 1, 1], + "666-river": [0, 1, 1], + "666-sandstorm": [0, 1, 1], + "666-savanna": [0, 1, 1], + "666-sun": [0, 1, 1], + "666-tundra": [0, 1, 1], + "669-red": [0, 1, 1], + "669-blue": [0, 1, 1], + "669-white": [0, 1, 1], + "669-yellow": [0, 1, 1], + "669-orange": [0, 1, 1], + "670-white": [0, 1, 1], + "670-blue": [0, 1, 1], + "670-orange": [0, 1, 1], + "670-red": [0, 1, 1], + "670-yellow": [0, 1, 1], + "671-red": [0, 1, 1], + "671-blue": [0, 1, 1], + "671-yellow": [0, 1, 1], + "671-white": [0, 1, 1], + "671-orange": [0, 1, 1], + "672": [0, 1, 1], + "673": [0, 1, 1], + "676": [0, 1, 1], + "676-dandy": [0, 1, 1], + "676-debutante": [0, 1, 1], + "676-diamond": [0, 1, 1], + "676-heart": [0, 1, 1], + "676-kabuki": [0, 1, 1], + "676-la-reine": [0, 1, 1], + "676-matron": [0, 1, 1], + "676-pharaoh": [0, 1, 1], + "676-star": [0, 1, 1], + "677": [0, 1, 1], + "678-female": [0, 1, 1], + "678": [0, 1, 1], + "682": [0, 1, 1], + "683": [0, 1, 1], + "684": [0, 1, 1], + "685": [0, 1, 1], + "688": [0, 1, 1], + "689": [0, 1, 1], + "690": [0, 1, 1], + "691": [0, 1, 1], + "696": [0, 1, 1], + "697": [0, 1, 1], + "698": [0, 1, 1], + "699": [0, 1, 1], + "700": [0, 1, 1], + "702": [0, 1, 1], + "703": [0, 1, 1], + "704": [0, 1, 1], + "705": [0, 1, 1], + "706": [0, 1, 1], + "708": [0, 1, 1], + "709": [0, 1, 1], + "710": [0, 1, 1], + "711": [1, 1, 1], + "712": [0, 1, 1], + "713": [0, 1, 1], + "714": [0, 1, 1], + "715": [0, 1, 1], + "716-active": [0, 1, 1], + "716-neutral": [0, 1, 1], + "717": [0, 1, 1], + "720-unbound": [1, 1, 1], + "720": [1, 1, 1], + "728": [0, 1, 1], + "729": [0, 1, 1], + "730": [0, 1, 1], + "734": [0, 1, 1], + "735": [0, 1, 1], + "742": [0, 2, 2], + "743": [0, 2, 2], + "747": [0, 1, 1], + "748": [0, 1, 1], + "751": [0, 1, 1], + "752": [0, 1, 1], + "753": [0, 1, 1], + "754": [0, 2, 2], + "755": [0, 1, 1], + "756": [0, 1, 1], + "761": [0, 1, 1], + "762": [0, 1, 1], + "763": [0, 1, 1], + "767": [0, 1, 1], + "768": [0, 1, 1], + "771": [0, 1, 1], + "772": [0, 1, 1], + "773-fighting": [0, 1, 1], + "773-psychic": [0, 1, 1], + "773-poison": [0, 1, 1], + "773-ground": [0, 1, 1], + "773-ghost": [0, 1, 1], + "773-steel": [0, 1, 1], + "773-rock": [0, 1, 1], + "773-grass": [0, 1, 1], + "773-dragon": [0, 1, 1], + "773-bug": [0, 1, 1], + "773-ice": [0, 1, 1], + "773-dark": [0, 1, 1], + "773": [0, 1, 1], + "773-fairy": [0, 1, 1], + "773-water": [0, 1, 1], + "773-electric": [0, 1, 1], + "773-flying": [0, 1, 1], + "773-fire": [0, 1, 1], + "776": [0, 1, 1], + "777": [0, 1, 1], + "778-busted": [0, 1, 1], + "778-disguised": [0, 1, 1], + "779": [0, 1, 1], + "789": [1, 1, 1], + "790": [0, 1, 1], + "791-radiant-sun": [0, 1, 1], + "791": [2, 1, 1], + "792-full-moon": [0, 1, 1], + "792": [0, 1, 1], + "793": [0, 1, 1], + "797": [0, 1, 1], + "798": [0, 1, 1], + "800-dawn-wings": [0, 1, 1], + "800-dusk-mane": [0, 1, 1], + "800-ultra": [0, 1, 1], + "800": [0, 1, 1], + "802": [1, 1, 1], + "803": [0, 1, 1], + "804": [0, 1, 1], + "807": [0, 1, 1], + "808": [0, 1, 1], + "809-gigantamax": [0, 1, 1], + "809": [0, 1, 1], + "816": [0, 1, 1], + "817": [0, 1, 1], + "818-gigantamax": [1, 1, 1], + "818": [0, 1, 1], + "821": [0, 1, 1], + "822": [0, 1, 1], + "823-gigantamax": [0, 2, 2], + "823": [0, 1, 1], + "829": [0, 1, 1], + "830": [0, 1, 1], + "835": [0, 1, 1], + "836": [0, 1, 1], + "850": [0, 1, 1], + "851-gigantamax": [0, 1, 1], + "851": [0, 1, 1], + "854": [0, 1, 1], + "855": [0, 1, 1], + "856": [0, 1, 1], + "857": [0, 2, 2], + "858-gigantamax": [0, 1, 1], + "858": [0, 1, 1], + "859": [0, 1, 1], + "860": [0, 1, 1], + "861-gigantamax": [0, 1, 1], + "861": [0, 1, 1], + "862": [0, 1, 1], + "863": [0, 1, 1], + "864": [0, 1, 1], + "867": [0, 1, 1], + "872": [1, 1, 1], + "873": [1, 1, 1], + "876-female": [0, 1, 1], + "876": [0, 1, 1], + "877-hangry": [1, 1, 1], + "877": [1, 1, 1], + "880": [0, 1, 1], + "881": [0, 1, 1], + "882": [0, 1, 1], + "883": [0, 1, 1], + "884-gigantamax": [0, 1, 1], + "884": [0, 1, 1], + "885": [1, 1, 1], + "886": [1, 1, 1], + "887": [1, 1, 1], + "888": [0, 1, 1], + "888-crowned": [0, 1, 1], + "889": [0, 1, 1], + "889-crowned": [0, 1, 1], + "890-eternamax": [0, 1, 1], + "890": [0, 1, 1], + "891": [1, 1, 1], + "892-gigantamax-rapid": [1, 2, 2], + "892-rapid-strike": [1, 1, 1], + "892": [1, 1, 1], + "892-gigantamax-single": [1, 2, 2], + "894": [0, 1, 1], + "895": [0, 1, 1], + "896": [1, 1, 1], + "897": [1, 1, 1], + "898": [1, 1, 1], + "898-ice": [1, 1, 1], + "898-shadow": [1, 1, 1], + "900": [0, 1, 1], + "901": [0, 1, 1], + "903": [0, 1, 1], + "909": [0, 1, 1], + "910": [0, 2, 2], + "911": [0, 1, 1], + "912": [0, 1, 1], + "913": [0, 1, 1], + "914": [0, 1, 1], + "919": [1, 1, 1], + "920": [1, 1, 1], + "924": [1, 1, 1], + "925-four": [1, 1, 1], + "925-three": [1, 1, 1], + "932": [0, 1, 1], + "933": [0, 1, 1], + "934": [0, 1, 1], + "935": [2, 2, 2], + "936": [1, 1, 1], + "937": [1, 1, 1], + "940": [0, 1, 1], + "941": [0, 1, 1], + "944": [0, 1, 1], + "945": [0, 1, 1], + "948": [0, 1, 1], + "949": [0, 1, 1], + "951": [0, 1, 1], + "952": [0, 1, 1], + "953": [0, 1, 1], + "954": [0, 1, 1], + "957": [1, 1, 1], + "958": [1, 1, 1], + "959": [1, 1, 1], + "962": [1, 1, 1], + "967": [0, 1, 1], + "968": [0, 1, 1], + "969": [0, 1, 1], + "970": [0, 1, 1], + "973": [1, 1, 1], + "974": [0, 1, 1], + "975": [0, 1, 1], + "978-curly": [0, 2, 2], + "978-droopy": [0, 2, 2], + "978-stretchy": [0, 1, 1], + "979": [1, 1, 1], + "981": [0, 1, 1], + "982": [0, 1, 2], + "982-three-segment": [0, 1, 2], + "987": [1, 1, 1], + "988": [0, 1, 1], + "993": [0, 1, 1], + "994": [0, 1, 1], + "995": [0, 1, 1], + "996": [0, 1, 1], + "997": [0, 1, 1], + "998": [0, 1, 1], + "999": [1, 1, 1], + "1000": [1, 1, 1], + "1001": [0, 1, 1], + "1003": [0, 1, 1], + "1004": [0, 1, 1], + "1006": [0, 2, 1], + "1007-apex-build": [0, 2, 2], + "1008-ultimate-mode": [1, 1, 1], + "1010": [0, 1, 1], + "1012-counterfeit": [0, 1, 1], + "1013-unremarkable": [0, 1, 1], + "1018": [0, 1, 1], + "1022": [0, 2, 2], + "1023": [0, 1, 1], + "2026": [0, 1, 1], + "2027": [0, 1, 1], + "2028": [0, 1, 1], + "2052": [0, 1, 1], + "2053": [0, 1, 1], + "2103": [0, 1, 1], + "2670": [0, 1, 1], + "4052": [0, 1, 1], + "4077": [0, 1, 1], + "4078": [0, 1, 1], + "4079": [0, 1, 1], + "4080": [2, 1, 1], + "4144": [0, 1, 1], + "4145": [0, 1, 1], + "4146": [0, 1, 1], + "4199": [2, 1, 1], + "4222": [0, 1, 1], + "4263": [0, 1, 1], + "4264": [0, 1, 1], + "4562": [0, 1, 1], + "6100": [0, 1, 1], + "6101": [0, 1, 1], + "6215": [0, 1, 1], + "6503": [0, 1, 1], + "6549": [0, 1, 1], + "6570": [0, 1, 1], + "6571": [0, 1, 1], + "6705": [0, 1, 1], + "6706": [0, 1, 1], + "6713": [0, 1, 1], + "8901": [1, 1, 1], "female": { - "3": [ - 0, - 1, - 1 - ], - "19": [ - 0, - 1, - 1 - ], - "20": [ - 0, - 1, - 1 - ], - "41": [ - 0, - 1, - 1 - ], - "42": [ - 0, - 1, - 1 - ], - "44": [ - 0, - 1, - 1 - ], - "45": [ - 0, - 1, - 1 - ], - "84": [ - 1, - 1, - 1 - ], - "85": [ - 1, - 1, - 1 - ], - "111": [ - 0, - 1, - 1 - ], - "112": [ - 0, - 1, - 1 - ], - "118": [ - 0, - 1, - 1 - ], - "119": [ - 0, - 1, - 1 - ], - "123": [ - 1, - 1, - 1 - ], - "129": [ - 0, - 1, - 1 - ], - "130": [ - 0, - 1, - 1 - ], - "178": [ - 0, - 2, - 2 - ], - "185": [ - 0, - 1, - 1 - ], - "190": [ - 0, - 1, - 1 - ], - "203": [ - 0, - 1, - 1 - ], - "207": [ - 0, - 1, - 1 - ], - "215": [ - 0, - 1, - 1 - ], - "217": [ - 1, - 1, - 1 - ], - "229": [ - 0, - 1, - 1 - ], - "232": [ - 0, - 1, - 1 - ], - "255": [ - 0, - 1, - 1 - ], - "256": [ - 0, - 1, - 1 - ], - "257": [ - 0, - 1, - 1 - ], - "307": [ - 0, - 1, - 1 - ], - "308": [ - 0, - 1, - 1 - ], - "315": [ - 0, - 1, - 1 - ], - "369": [ - 0, - 1, - 1 - ], - "399": [ - 0, - 2, - 1 - ], - "400": [ - 0, - 1, - 1 - ], - "401": [ - 0, - 1, - 1 - ], - "402": [ - 0, - 1, - 1 - ], - "407": [ - 0, - 1, - 1 - ], - "418": [ - 0, - 2, - 2 - ], - "419": [ - 0, - 1, - 1 - ], - "424": [ - 0, - 1, - 1 - ], - "443": [ - 1, - 1, - 1 - ], - "444": [ - 1, - 1, - 1 - ], - "445": [ - 1, - 1, - 1 - ], - "453": [ - 0, - 1, - 1 - ], - "454": [ - 0, - 1, - 1 - ], - "456": [ - 0, - 1, - 1 - ], - "457": [ - 0, - 1, - 1 - ], - "461": [ - 0, - 1, - 1 - ], - "464": [ - 0, - 1, - 1 - ], - "465": [ - 0, - 1, - 1 - ], - "592": [ - 1, - 1, - 1 - ], - "593": [ - 1, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ] + "3": [0,1, 1], + "19": [0, 1, 1], + "20": [0, 1, 1], + "25": [0, 1, 1], + "25-beauty-cosplay": [0, 1, 1], + "25-cool-cosplay": [0, 1, 1], + "25-cosplay": [0, 1, 1], + "25-cute-cosplay": [0, 1, 1], + "25-partner": [0, 1, 1], + "25-smart-cosplay": [0, 1, 1], + "25-tough-cosplay": [0, 1, 1], + "26": [0, 1, 1], + "41": [0, 1, 1], + "42": [0, 1, 1], + "44": [0, 1, 1], + "45": [0, 1, 1], + "84": [1, 1, 1], + "85": [1, 1, 1], + "111": [0, 1, 1], + "112": [0, 1, 1], + "118": [0, 1, 1], + "119": [0, 1, 1], + "123": [1, 1, 1], + "129": [0, 1, 1], + "130": [0, 1, 1], + "154": [0, 1, 1], + "178": [0, 2, 2], + "185": [0, 1, 1], + "190": [0, 1, 1], + "194": [0, 1, 1], + "195": [0, 1, 1], + "198": [0, 1, 1], + "203": [0, 1, 1], + "207": [0, 1, 1], + "212": [1, 1, 1], + "215": [0, 1, 1], + "217": [1, 1, 1], + "229": [0, 1, 1], + "232": [0, 1, 1], + "255": [0, 1, 1], + "256": [0, 1, 1], + "257": [0, 1, 1], + "307": [0, 1, 1], + "308": [0, 1, 1], + "315": [0, 1, 1], + "369": [0, 1, 1], + "399": [0, 2, 1], + "400": [0, 1, 1], + "401": [0, 1, 1], + "402": [0, 1, 1], + "407": [0, 1, 1], + "418": [0, 2, 2], + "419": [0, 1, 1], + "424": [0, 1, 1], + "443": [1, 1, 1], + "444": [1, 1, 1], + "445": [1, 1, 1], + "453": [0, 1, 1], + "454": [0, 1, 1], + "456": [0, 1, 1], + "457": [0, 1, 1], + "461": [0, 1, 1], + "464": [0, 1, 1], + "465": [0, 1, 1], + "592": [1, 1, 1], + "593": [1, 1, 1], + "6215": [0, 1, 1] } }, "exp": { - "3-mega": [ - 0, - 2, - 2 - ], - "6-mega-x": [ - 0, - 2, - 2 - ], - "6-mega-y": [ - 0, - 2, - 2 - ], - "80-mega": [ - 0, - 1, - 1 - ], - "94-mega": [ - 2, - 2, - 2 - ], - "127-mega": [ - 0, - 1, - 1 - ], - "130-mega": [ - 0, - 1, - 1 - ], - "142-mega": [ - 0, - 1, - 1 - ], - "150-mega-x": [ - 0, - 1, - 1 - ], - "150-mega-y": [ - 0, - 1, - 1 - ], - "181-mega": [ - 0, - 1, - 2 - ], - "212-mega": [ - 1, - 1, - 2 - ], - "229-mega": [ - 0, - 1, - 1 - ], - "248-mega": [ - 0, - 1, - 1 - ], - "257-mega": [ - 0, - 1, - 1 - ], - "282-mega": [ - 0, - 2, - 2 - ], - "302-mega": [ - 0, - 1, - 1 - ], - "303-mega": [ - 0, - 1, - 1 - ], - "306-mega": [ - 1, - 1, - 1 - ], - "308-mega": [ - 0, - 1, - 1 - ], - "310-mega": [ - 0, - 1, - 1 - ], - "334-mega": [ - 0, - 2, - 1 - ], - "354-mega": [ - 0, - 1, - 1 - ], - "362-mega": [ - 0, - 1, - 1 - ], - "373-mega": [ - 0, - 1, - 1 - ], - "376-mega": [ - 0, - 1, - 1 - ], - "380-mega": [ - 0, - 1, - 1 - ], - "381-mega": [ - 0, - 1, - 1 - ], - "382-primal": [ - 0, - 1, - 1 - ], - "383-primal": [ - 0, - 1, - 1 - ], - "384-mega": [ - 0, - 2, - 1 - ], - "428-mega": [ - 0, - 1, - 1 - ], - "445-mega": [ - 1, - 1, - 1 - ], - "448-mega": [ - 1, - 1, - 1 - ], - "475-mega": [ - 0, - 2, - 2 - ], - "531-mega": [ - 0, - 1, - 1 - ], - "653": [ - 0, - 1, - 1 - ], - "654": [ - 0, - 1, - 1 - ], - "655": [ - 0, - 1, - 1 - ], - "664": [ - 0, - 1, - 1 - ], - "665": [ - 0, - 1, - 1 - ], - "666-archipelago": [ - 0, - 1, - 1 - ], - "666-continental": [ - 0, - 1, - 1 - ], - "666-elegant": [ - 0, - 1, - 1 - ], - "666-fancy": [ - 0, - 2, - 2 - ], - "666-garden": [ - 0, - 1, - 1 - ], - "666-high-plains": [ - 0, - 1, - 1 - ], - "666-icy-snow": [ - 0, - 1, - 1 - ], - "666-jungle": [ - 0, - 1, - 1 - ], - "666-marine": [ - 0, - 1, - 1 - ], - "666-meadow": [ - 0, - 2, - 2 - ], - "666-modern": [ - 0, - 1, - 1 - ], - "666-monsoon": [ - 0, - 1, - 1 - ], - "666-ocean": [ - 0, - 1, - 1 - ], - "666-poke-ball": [ - 0, - 1, - 2 - ], - "666-polar": [ - 0, - 1, - 1 - ], - "666-river": [ - 0, - 2, - 1 - ], - "666-sandstorm": [ - 0, - 1, - 1 - ], - "666-savanna": [ - 0, - 1, - 1 - ], - "666-sun": [ - 0, - 1, - 1 - ], - "666-tundra": [ - 0, - 1, - 1 - ], - "669-red": [ - 0, - 2, - 2 - ], - "669-blue": [ - 0, - 1, - 1 - ], - "669-white": [ - 0, - 1, - 1 - ], - "669-yellow": [ - 0, - 1, - 1 - ], - "669-orange": [ - 0, - 2, - 2 - ], - "670-white": [ - 0, - 1, - 1 - ], - "670-blue": [ - 0, - 1, - 1 - ], - "670-orange": [ - 0, - 1, - 1 - ], - "670-red": [ - 0, - 1, - 1 - ], - "670-yellow": [ - 0, - 1, - 1 - ], - "671-red": [ - 0, - 1, - 2 - ], - "671-blue": [ - 0, - 1, - 2 - ], - "671-yellow": [ - 0, - 1, - 1 - ], - "671-white": [ - 0, - 1, - 2 - ], - "671-orange": [ - 0, - 1, - 2 - ], - "672": [ - 0, - 1, - 1 - ], - "673": [ - 0, - 1, - 1 - ], - "677": [ - 0, - 1, - 1 - ], - "678-female": [ - 0, - 1, - 1 - ], - "678": [ - 0, - 1, - 1 - ], - "690": [ - 0, - 1, - 1 - ], - "691": [ - 0, - 1, - 1 - ], - "696": [ - 0, - 1, - 1 - ], - "697": [ - 0, - 1, - 1 - ], - "698": [ - 0, - 1, - 1 - ], - "699": [ - 0, - 1, - 1 - ], - "700": [ - 0, - 1, - 1 - ], - "702": [ - 0, - 1, - 1 - ], - "703": [ - 0, - 1, - 1 - ], - "704": [ - 0, - 1, - 1 - ], - "705": [ - 0, - 1, - 1 - ], - "706": [ - 0, - 1, - 1 - ], - "708": [ - 0, - 1, - 1 - ], - "709": [ - 0, - 1, - 1 - ], - "710": [ - 0, - 1, - 1 - ], - "711": [ - 1, - 1, - 1 - ], - "712": [ - 0, - 1, - 1 - ], - "713": [ - 0, - 1, - 1 - ], - "714": [ - 0, - 1, - 1 - ], - "715": [ - 0, - 2, - 1 - ], - "716-active": [ - 0, - 1, - 1 - ], - "716-neutral": [ - 0, - 1, - 1 - ], - "717": [ - 0, - 2, - 2 - ], - "720-unbound": [ - 1, - 1, - 1 - ], - "720": [ - 1, - 1, - 1 - ], - "728": [ - 0, - 1, - 1 - ], - "729": [ - 0, - 2, - 2 - ], - "730": [ - 0, - 2, - 1 - ], - "734": [ - 0, - 1, - 1 - ], - "735": [ - 0, - 1, - 1 - ], - "742": [ - 0, - 2, - 2 - ], - "743": [ - 0, - 2, - 2 - ], - "747": [ - 0, - 2, - 2 - ], - "748": [ - 0, - 1, - 1 - ], - "751": [ - 0, - 1, - 1 - ], - "752": [ - 0, - 1, - 1 - ], - "753": [ - 0, - 1, - 1 - ], - "754": [ - 0, - 2, - 2 - ], - "755": [ - 0, - 1, - 1 - ], - "756": [ - 0, - 1, - 1 - ], - "761": [ - 0, - 1, - 1 - ], - "762": [ - 0, - 1, - 1 - ], - "763": [ - 0, - 1, - 1 - ], - "767": [ - 0, - 1, - 1 - ], - "768": [ - 0, - 1, - 1 - ], - "770": [ - 0, - 0, - 0 - ], - "771": [ - 0, - 2, - 2 - ], - "772": [ - 0, - 1, - 1 - ], - "773-fighting": [ - 0, - 1, - 1 - ], - "773-psychic": [ - 0, - 1, - 1 - ], - "773-poison": [ - 0, - 1, - 1 - ], - "773-ground": [ - 0, - 1, - 1 - ], - "773-ghost": [ - 0, - 1, - 1 - ], - "773-steel": [ - 0, - 1, - 1 - ], - "773-rock": [ - 0, - 1, - 1 - ], - "773-grass": [ - 0, - 1, - 1 - ], - "773-dragon": [ - 0, - 1, - 1 - ], - "773-bug": [ - 0, - 1, - 1 - ], - "773-ice": [ - 0, - 1, - 1 - ], - "773-dark": [ - 0, - 1, - 1 - ], - "773": [ - 0, - 1, - 1 - ], - "773-fairy": [ - 0, - 1, - 1 - ], - "773-water": [ - 0, - 1, - 1 - ], - "773-electric": [ - 0, - 1, - 1 - ], - "773-flying": [ - 0, - 1, - 1 - ], - "773-fire": [ - 0, - 1, - 1 - ], - "776": [ - 0, - 1, - 1 - ], - "777": [ - 0, - 1, - 1 - ], - "778-busted": [ - 0, - 1, - 1 - ], - "778-disguised": [ - 0, - 1, - 1 - ], - "779": [ - 0, - 1, - 1 - ], - "789": [ - 1, - 1, - 1 - ], - "790": [ - 0, - 1, - 1 - ], - "791": [ - 2, - 1, - 1 - ], - "792": [ - 0, - 1, - 1 - ], - "793": [ - 0, - 2, - 2 - ], - "797": [ - 0, - 1, - 1 - ], - "798": [ - 0, - 1, - 1 - ], - "800-dawn-wings": [ - 0, - 1, - 1 - ], - "800-dusk-mane": [ - 0, - 1, - 1 - ], - "800-ultra": [ - 0, - 1, - 1 - ], - "800": [ - 0, - 1, - 1 - ], - "802": [ - 1, - 1, - 1 - ], - "803": [ - 0, - 1, - 1 - ], - "804": [ - 0, - 1, - 1 - ], - "808": [ - 0, - 1, - 1 - ], - "809": [ - 0, - 1, - 1 - ], - "816": [ - 0, - 1, - 1 - ], - "817": [ - 0, - 1, - 1 - ], - "818": [ - 1, - 1, - 1 - ], - "821": [ - 0, - 2, - 2 - ], - "822": [ - 0, - 1, - 1 - ], - "823": [ - 0, - 1, - 1 - ], - "829": [ - 0, - 1, - 1 - ], - "830": [ - 0, - 1, - 1 - ], - "835": [ - 0, - 1, - 1 - ], - "836": [ - 0, - 2, - 2 - ], - "850": [ - 0, - 1, - 1 - ], - "851": [ - 0, - 1, - 1 - ], - "854": [ - 0, - 1, - 1 - ], - "855": [ - 0, - 1, - 1 - ], - "856": [ - 0, - 1, - 1 - ], - "857": [ - 0, - 2, - 2 - ], - "858": [ - 0, - 1, - 1 - ], - "859": [ - 0, - 1, - 1 - ], - "860": [ - 0, - 1, - 1 - ], - "861": [ - 0, - 1, - 1 - ], - "862": [ - 0, - 1, - 1 - ], - "863": [ - 0, - 1, - 1 - ], - "864": [ - 0, - 1, - 1 - ], - "867": [ - 0, - 1, - 1 - ], - "872": [ - 1, - 1, - 1 - ], - "873": [ - 1, - 1, - 1 - ], - "876-female": [ - 0, - 1, - 1 - ], - "876": [ - 0, - 1, - 1 - ], - "877-hangry": [ - 1, - 1, - 1 - ], - "877": [ - 1, - 1, - 1 - ], - "880": [ - 0, - 1, - 1 - ], - "881": [ - 0, - 1, - 1 - ], - "882": [ - 0, - 2, - 1 - ], - "883": [ - 0, - 1, - 1 - ], - "884": [ - 0, - 1, - 1 - ], - "885": [ - 1, - 1, - 1 - ], - "886": [ - 1, - 1, - 1 - ], - "887": [ - 1, - 1, - 1 - ], - "888": [ - 0, - 1, - 1 - ], - "888-crowned": [ - 0, - 1, - 1 - ], - "889": [ - 0, - 1, - 1 - ], - "889-crowned": [ - 0, - 1, - 1 - ], - "890": [ - 0, - 2, - 1 - ], - "890-eternamax": [ - 0, - 1, - 1 - ], - "891": [ - 1, - 1, - 1 - ], - "892-rapid-strike": [ - 1, - 1, - 1 - ], - "892": [ - 1, - 1, - 1 - ], - "896": [ - 1, - 1, - 1 - ], - "897": [ - 1, - 1, - 1 - ], - "898": [ - 1, - 1, - 1 - ], - "898-ice": [ - 1, - 1, - 1 - ], - "898-shadow": [ - 1, - 1, - 1 - ], - "900": [ - 0, - 1, - 1 - ], - "901": [ - 0, - 1, - 1 - ], - "903": [ - 0, - 1, - 1 - ], - "909": [ - 0, - 1, - 1 - ], - "910": [ - 0, - 2, - 2 - ], - "911": [ - 0, - 2, - 2 - ], - "912": [ - 0, - 1, - 2 - ], - "913": [ - 0, - 1, - 2 - ], - "914": [ - 0, - 2, - 1 - ], - "919": [ - 1, - 1, - 1 - ], - "920": [ - 1, - 1, - 1 - ], - "924": [ - 1, - 1, - 1 - ], - "925-four": [ - 1, - 2, - 2 - ], - "925-three": [ - 1, - 2, - 2 - ], - "932": [ - 0, - 2, - 2 - ], - "933": [ - 0, - 2, - 2 - ], - "934": [ - 0, - 1, - 1 - ], - "935": [ - 1, - 1, - 2 - ], - "936": [ - 2, - 2, - 2 - ], - "937": [ - 2, - 2, - 2 - ], - "940": [ - 0, - 1, - 1 - ], - "941": [ - 0, - 1, - 1 - ], - "948": [ - 0, - 1, - 1 - ], - "949": [ - 0, - 1, - 1 - ], - "951": [ - 0, - 1, - 1 - ], - "952": [ - 0, - 1, - 1 - ], - "953": [ - 0, - 1, - 1 - ], - "954": [ - 0, - 1, - 1 - ], - "957": [ - 2, - 2, - 2 - ], - "958": [ - 2, - 2, - 2 - ], - "959": [ - 2, - 2, - 2 - ], - "962": [ - 1, - 1, - 1 - ], - "967": [ - 0, - 1, - 1 - ], - "968": [ - 0, - 1, - 1 - ], - "969": [ - 0, - 1, - 1 - ], - "970": [ - 0, - 1, - 1 - ], - "973": [ - 1, - 1, - 1 - ], - "974": [ - 0, - 1, - 1 - ], - "975": [ - 0, - 1, - 1 - ], - "978-curly": [ - 0, - 2, - 2 - ], - "978-droopy": [ - 0, - 2, - 2 - ], - "978-stretchy": [ - 0, - 2, - 2 - ], - "979": [ - 2, - 2, - 2 - ], - "981": [ - 0, - 1, - 1 - ], - "982": [ - 0, - 1, - 1 - ], - "982-three-segment": [ - 0, - 1, - 1 - ], - "987": [ - 1, - 1, - 1 - ], - "988": [ - 0, - 1, - 2 - ], - "993": [ - 0, - 1, - 1 - ], - "994": [ - 0, - 1, - 2 - ], - "995": [ - 0, - 1, - 1 - ], - "996": [ - 0, - 1, - 1 - ], - "997": [ - 0, - 2, - 2 - ], - "998": [ - 0, - 2, - 2 - ], - "999": [ - 2, - 1, - 1 - ], - "1000": [ - 1, - 1, - 1 - ], - "1001": [ - 0, - 1, - 1 - ], - "1003": [ - 0, - 1, - 1 - ], - "1004": [ - 0, - 1, - 1 - ], - "1006": [ - 0, - 2, - 1 - ], - "1007-apex-build": [ - 0, - 2, - 2 - ], - "1008-ultimate-mode": [ - 1, - 1, - 1 - ], - "2027": [ - 0, - 1, - 1 - ], - "2028": [ - 0, - 1, - 1 - ], - "2052": [ - 0, - 1, - 1 - ], - "2053": [ - 0, - 1, - 0 - ], - "4052": [ - 0, - 1, - 1 - ], - "4077": [ - 0, - 1, - 1 - ], - "4078": [ - 0, - 1, - 1 - ], - "4079": [ - 0, - 1, - 1 - ], - "4080": [ - 2, - 1, - 1 - ], - "4144": [ - 0, - 1, - 1 - ], - "4145": [ - 0, - 1, - 1 - ], - "4146": [ - 0, - 1, - 1 - ], - "4199": [ - 2, - 1, - 1 - ], - "4222": [ - 0, - 1, - 1 - ], - "4263": [ - 0, - 1, - 1 - ], - "4264": [ - 0, - 1, - 1 - ], - "4562": [ - 0, - 1, - 1 - ], - "6100": [ - 0, - 1, - 1 - ], - "6101": [ - 0, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ], - "6549": [ - 0, - 1, - 1 - ], - "6570": [ - 0, - 1, - 1 - ], - "6571": [ - 0, - 1, - 1 - ], - "6705": [ - 0, - 1, - 1 - ], - "6706": [ - 0, - 1, - 1 - ], - "female": {}, - "back": { - "3-mega": [ - 0, - 2, - 2 - ], - "6-mega-x": [ - 0, - 2, - 2 - ], - "6-mega-y": [ - 0, - 1, - 2 - ], - "80-mega": [ - 0, - 1, - 1 - ], - "94-mega": [ - 1, - 1, - 1 - ], - "127-mega": [ - 0, - 1, - 1 - ], - "130-mega": [ - 0, - 1, - 1 - ], - "142-mega": [ - 0, - 1, - 1 - ], - "150-mega-x": [ - 0, - 1, - 1 - ], - "150-mega-y": [ - 0, - 1, - 1 - ], - "181-mega": [ - 0, - 1, - 2 - ], - "212-mega": [ - 1, - 2, - 2 - ], - "229-mega": [ - 0, - 1, - 1 - ], - "248-mega": [ - 0, - 2, - 1 - ], - "257-mega": [ - 0, - 1, - 1 - ], - "282-mega": [ - 0, - 1, - 1 - ], - "302-mega": [ - 0, - 1, - 1 - ], - "303-mega": [ - 0, - 1, - 1 - ], - "306-mega": [ - 1, - 1, - 1 - ], - "308-mega": [ - 0, - 1, - 1 - ], - "310-mega": [ - 0, - 1, - 1 - ], - "334-mega": [ - 0, - 1, - 1 - ], - "354-mega": [ - 0, - 1, - 1 - ], - "362-mega": [ - 0, - 1, - 1 - ], - "373-mega": [ - 0, - 1, - 1 - ], - "376-mega": [ - 0, - 1, - 1 - ], - "380-mega": [ - 0, - 1, - 1 - ], - "381-mega": [ - 0, - 1, - 1 - ], - "382-primal": [ - 0, - 1, - 1 - ], - "383-primal": [ - 0, - 1, - 1 - ], - "384-mega": [ - 0, - 1, - 1 - ], - "428-mega": [ - 0, - 1, - 1 - ], - "445-mega": [ - 1, - 1, - 1 - ], - "448-mega": [ - 1, - 1, - 1 - ], - "475-mega": [ - 0, - 2, - 2 - ], - "531-mega": [ - 0, - 1, - 1 - ], - "653": [ - 0, - 1, - 1 - ], - "654": [ - 0, - 1, - 1 - ], - "655": [ - 0, - 1, - 1 - ], - "664": [ - 0, - 1, - 1 - ], - "665": [ - 0, - 2, - 1 - ], - "666-archipelago": [ - 0, - 2, - 2 - ], - "666-continental": [ - 0, - 2, - 2 - ], - "666-elegant": [ - 0, - 2, - 2 - ], - "666-fancy": [ - 0, - 2, - 2 - ], - "666-garden": [ - 0, - 2, - 2 - ], - "666-high-plains": [ - 0, - 2, - 2 - ], - "666-icy-snow": [ - 0, - 2, - 2 - ], - "666-jungle": [ - 0, - 2, - 2 - ], - "666-marine": [ - 0, - 2, - 2 - ], - "666-meadow": [ - 0, - 2, - 2 - ], - "666-modern": [ - 0, - 2, - 2 - ], - "666-monsoon": [ - 0, - 2, - 2 - ], - "666-ocean": [ - 0, - 2, - 2 - ], - "666-poke-ball": [ - 0, - 2, - 2 - ], - "666-polar": [ - 0, - 2, - 2 - ], - "666-river": [ - 0, - 2, - 2 - ], - "666-sandstorm": [ - 0, - 2, - 2 - ], - "666-savanna": [ - 0, - 2, - 2 - ], - "666-sun": [ - 0, - 2, - 2 - ], - "666-tundra": [ - 0, - 2, - 2 - ], - "669-red": [ - 0, - 2, - 2 - ], - "669-blue": [ - 0, - 2, - 2 - ], - "669-white": [ - 0, - 2, - 2 - ], - "669-yellow": [ - 0, - 2, - 2 - ], - "669-orange": [ - 0, - 2, - 2 - ], - "670-white": [ - 0, - 1, - 1 - ], - "670-blue": [ - 0, - 2, - 2 - ], - "670-orange": [ - 0, - 1, - 1 - ], - "670-red": [ - 0, - 1, - 1 - ], - "670-yellow": [ - 0, - 1, - 1 - ], - "671-red": [ - 0, - 1, - 1 - ], - "671-blue": [ - 0, - 1, - 1 - ], - "671-yellow": [ - 0, - 1, - 1 - ], - "671-white": [ - 0, - 1, - 1 - ], - "671-orange": [ - 0, - 1, - 1 - ], - "672": [ - 0, - 1, - 1 - ], - "673": [ - 0, - 1, - 1 - ], - "677": [ - 0, - 1, - 1 - ], - "678-female": [ - 0, - 1, - 1 - ], - "678": [ - 0, - 1, - 1 - ], - "690": [ - 0, - 1, - 1 - ], - "691": [ - 0, - 1, - 1 - ], - "696": [ - 0, - 1, - 1 - ], - "697": [ - 0, - 1, - 1 - ], - "698": [ - 0, - 1, - 1 - ], - "699": [ - 0, - 2, - 2 - ], - "700": [ - 0, - 1, - 1 - ], - "702": [ - 0, - 1, - 1 - ], - "703": [ - 0, - 1, - 1 - ], - "704": [ - 0, - 1, - 1 - ], - "705": [ - 0, - 1, - 1 - ], - "706": [ - 0, - 1, - 1 - ], - "708": [ - 0, - 1, - 1 - ], - "709": [ - 0, - 1, - 1 - ], - "710": [ - 0, - 1, - 1 - ], - "711": [ - 1, - 1, - 1 - ], - "712": [ - 0, - 1, - 1 - ], - "713": [ - 0, - 1, - 1 - ], - "714": [ - 0, - 1, - 1 - ], - "715": [ - 0, - 1, - 1 - ], - "716-active": [ - 0, - 1, - 1 - ], - "716-neutral": [ - 0, - 1, - 1 - ], - "717": [ - 0, - 1, - 1 - ], - "720-unbound": [ - 1, - 1, - 1 - ], - "720": [ - 1, - 1, - 1 - ], - "728": [ - 0, - 1, - 1 - ], - "729": [ - 0, - 2, - 2 - ], - "730": [ - 0, - 2, - 1 - ], - "734": [ - 0, - 1, - 1 - ], - "735": [ - 0, - 1, - 1 - ], - "742": [ - 0, - 2, - 2 - ], - "743": [ - 0, - 2, - 2 - ], - "747": [ - 0, - 2, - 2 - ], - "748": [ - 0, - 1, - 1 - ], - "751": [ - 0, - 1, - 1 - ], - "752": [ - 0, - 1, - 1 - ], - "753": [ - 0, - 1, - 1 - ], - "754": [ - 0, - 2, - 2 - ], - "755": [ - 0, - 1, - 1 - ], - "756": [ - 0, - 1, - 1 - ], - "761": [ - 0, - 1, - 1 - ], - "762": [ - 0, - 1, - 1 - ], - "763": [ - 0, - 1, - 1 - ], - "767": [ - 0, - 1, - 1 - ], - "768": [ - 0, - 1, - 1 - ], - "771": [ - 0, - 1, - 1 - ], - "772": [ - 0, - 1, - 1 - ], - "773-fighting": [ - 0, - 1, - 1 - ], - "773-psychic": [ - 0, - 1, - 1 - ], - "773-poison": [ - 0, - 1, - 1 - ], - "773-ground": [ - 0, - 1, - 1 - ], - "773-ghost": [ - 0, - 1, - 1 - ], - "773-steel": [ - 0, - 1, - 1 - ], - "773-rock": [ - 0, - 1, - 1 - ], - "773-grass": [ - 0, - 1, - 1 - ], - "773-dragon": [ - 0, - 1, - 1 - ], - "773-bug": [ - 0, - 1, - 1 - ], - "773-ice": [ - 0, - 1, - 1 - ], - "773-dark": [ - 0, - 1, - 1 - ], - "773": [ - 0, - 1, - 1 - ], - "773-fairy": [ - 0, - 1, - 1 - ], - "773-water": [ - 0, - 1, - 1 - ], - "773-electric": [ - 0, - 1, - 1 - ], - "773-flying": [ - 0, - 1, - 1 - ], - "773-fire": [ - 0, - 1, - 1 - ], - "776": [ - 0, - 2, - 2 - ], - "777": [ - 0, - 1, - 1 - ], - "778-busted": [ - 0, - 1, - 1 - ], - "778-disguised": [ - 0, - 1, - 1 - ], - "779": [ - 0, - 1, - 1 - ], - "789": [ - 1, - 1, - 1 - ], - "790": [ - 0, - 1, - 1 - ], - "791": [ - 1, - 1, - 1 - ], - "792": [ - 0, - 1, - 1 - ], - "793": [ - 0, - 1, - 1 - ], - "797": [ - 0, - 1, - 1 - ], - "798": [ - 0, - 1, - 1 - ], - "800-dawn-wings": [ - 0, - 1, - 1 - ], - "800-dusk-mane": [ - 0, - 1, - 1 - ], - "800-ultra": [ - 0, - 1, - 1 - ], - "800": [ - 0, - 1, - 1 - ], - "802": [ - 1, - 1, - 1 - ], - "803": [ - 0, - 1, - 1 - ], - "804": [ - 0, - 1, - 1 - ], - "808": [ - 0, - 1, - 1 - ], - "809": [ - 0, - 1, - 1 - ], - "816": [ - 0, - 1, - 1 - ], - "817": [ - 0, - 1, - 1 - ], - "818": [ - 0, - 1, - 1 - ], - "821": [ - 0, - 1, - 1 - ], - "822": [ - 0, - 1, - 1 - ], - "823": [ - 0, - 1, - 1 - ], - "829": [ - 0, - 1, - 1 - ], - "830": [ - 0, - 1, - 1 - ], - "835": [ - 0, - 1, - 1 - ], - "836": [ - 0, - 1, - 1 - ], - "850": [ - 0, - 1, - 1 - ], - "851": [ - 0, - 1, - 1 - ], - "854": [ - 0, - 1, - 1 - ], - "855": [ - 0, - 1, - 1 - ], - "856": [ - 0, - 1, - 1 - ], - "857": [ - 0, - 2, - 2 - ], - "858": [ - 0, - 1, - 1 - ], - "859": [ - 0, - 1, - 1 - ], - "860": [ - 0, - 1, - 1 - ], - "861": [ - 0, - 1, - 1 - ], - "862": [ - 0, - 1, - 1 - ], - "863": [ - 0, - 1, - 1 - ], - "864": [ - 0, - 1, - 1 - ], - "867": [ - 0, - 1, - 1 - ], - "872": [ - 1, - 1, - 1 - ], - "873": [ - 1, - 1, - 1 - ], - "876-female": [ - 0, - 1, - 1 - ], - "876": [ - 0, - 1, - 1 - ], - "877-hangry": [ - 1, - 1, - 1 - ], - "877": [ - 1, - 1, - 1 - ], - "880": [ - 0, - 1, - 1 - ], - "881": [ - 0, - 1, - 1 - ], - "882": [ - 0, - 1, - 1 - ], - "883": [ - 0, - 1, - 1 - ], - "884": [ - 0, - 1, - 1 - ], - "885": [ - 1, - 1, - 1 - ], - "886": [ - 1, - 1, - 1 - ], - "887": [ - 1, - 1, - 1 - ], - "888": [ - 0, - 1, - 1 - ], - "888-crowned": [ - 0, - 1, - 1 - ], - "889": [ - 0, - 1, - 1 - ], - "889-crowned": [ - 0, - 1, - 1 - ], - "890": [ - 0, - 1, - 1 - ], - "891": [ - 1, - 1, - 1 - ], - "892-rapid-strike": [ - 1, - 1, - 1 - ], - "892": [ - 1, - 1, - 1 - ], - "896": [ - 1, - 1, - 1 - ], - "897": [ - 1, - 1, - 1 - ], - "898": [ - 1, - 1, - 1 - ], - "898-ice": [ - 1, - 1, - 1 - ], - "898-shadow": [ - 1, - 1, - 1 - ], - "900": [ - 0, - 1, - 1 - ], - "901": [ - 0, - 1, - 1 - ], - "903": [ - 0, - 1, - 1 - ], - "909": [ - 0, - 1, - 1 - ], - "910": [ - 0, - 2, - 2 - ], - "911": [ - 0, - 1, - 1 - ], - "912": [ - 0, - 1, - 1 - ], - "913": [ - 0, - 1, - 1 - ], - "914": [ - 0, - 2, - 2 - ], - "919": [ - 1, - 1, - 1 - ], - "920": [ - 1, - 1, - 1 - ], - "924": [ - 1, - 1, - 1 - ], - "925-four": [ - 1, - 2, - 2 - ], - "925-three": [ - 1, - 2, - 2 - ], - "932": [ - 0, - 1, - 1 - ], - "933": [ - 0, - 1, - 1 - ], - "934": [ - 0, - 1, - 1 - ], - "935": [ - 2, - 2, - 2 - ], - "936": [ - 2, - 2, - 2 - ], - "937": [ - 2, - 2, - 2 - ], - "940": [ - 0, - 1, - 1 - ], - "941": [ - 0, - 1, - 1 - ], - "948": [ - 0, - 1, - 1 - ], - "949": [ - 0, - 1, - 1 - ], - "951": [ - 0, - 1, - 1 - ], - "952": [ - 0, - 2, - 1 - ], - "953": [ - 0, - 1, - 1 - ], - "954": [ - 0, - 1, - 1 - ], - "957": [ - 1, - 1, - 1 - ], - "958": [ - 1, - 1, - 1 - ], - "959": [ - 1, - 1, - 1 - ], - "962": [ - 1, - 1, - 1 - ], - "967": [ - 0, - 1, - 1 - ], - "968": [ - 0, - 2, - 2 - ], - "969": [ - 0, - 1, - 1 - ], - "970": [ - 0, - 1, - 1 - ], - "973": [ - 1, - 1, - 1 - ], - "974": [ - 0, - 1, - 1 - ], - "975": [ - 0, - 1, - 1 - ], - "978-curly": [ - 0, - 2, - 2 - ], - "978-droopy": [ - 0, - 2, - 2 - ], - "978-stretchy": [ - 0, - 1, - 1 - ], - "979": [ - 1, - 1, - 1 - ], - "981": [ - 0, - 1, - 1 - ], - "982": [ - 0, - 1, - 1 - ], - "982-three-segment": [ - 0, - 1, - 1 - ], - "987": [ - 1, - 1, - 1 - ], - "988": [ - 0, - 1, - 1 - ], - "993": [ - 0, - 1, - 1 - ], - "994": [ - 0, - 1, - 1 - ], - "995": [ - 0, - 1, - 1 - ], - "996": [ - 0, - 1, - 1 - ], - "997": [ - 0, - 1, - 1 - ], - "998": [ - 0, - 1, - 1 - ], - "999": [ - 1, - 1, - 1 - ], - "1000": [ - 1, - 1, - 1 - ], - "1001": [ - 0, - 1, - 1 - ], - "1003": [ - 0, - 1, - 1 - ], - "1004": [ - 0, - 1, - 1 - ], - "1006": [ - 0, - 2, - 2 - ], - "1007-apex-build": [ - 0, - 2, - 2 - ], - "1008-ultimate-mode": [ - 1, - 1, - 1 - ], - "2027": [ - 0, - 1, - 1 - ], - "2028": [ - 0, - 1, - 1 - ], - "2052": [ - 0, - 1, - 1 - ], - "2053": [ - 0, - 1, - 1 - ], - "4052": [ - 0, - 1, - 1 - ], - "4077": [ - 0, - 1, - 1 - ], - "4078": [ - 0, - 1, - 1 - ], - "4079": [ - 0, - 1, - 1 - ], - "4080": [ - 2, - 2, - 2 - ], - "4144": [ - 0, - 1, - 1 - ], - "4145": [ - 0, - 1, - 1 - ], - "4146": [ - 0, - 1, - 1 - ], - "4199": [ - 2, - 1, - 1 - ], - "4222": [ - 0, - 1, - 1 - ], - "4263": [ - 0, - 1, - 1 - ], - "4264": [ - 0, - 1, - 1 - ], - "4562": [ - 0, - 1, - 1 - ], - "6100": [ - 0, - 1, - 1 - ], - "6101": [ - 0, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ], - "6549": [ - 0, - 1, - 1 - ], - "6570": [ - 0, - 1, - 1 - ], - "6571": [ - 0, - 1, - 1 - ], - "6705": [ - 0, - 1, - 1 - ], - "6706": [ - 0, - 1, - 1 - ], - "6713": [ - 0, - 1, - 1 - ] + "3-mega": [0, 2, 2], + "6-mega-x": [0, 2, 2], + "6-mega-y": [0, 2, 2], + "80-mega": [0, 1, 1], + "94-mega": [2, 2, 2], + "127-mega": [0, 1, 1], + "130-mega": [0, 1, 1], + "142-mega": [0, 1, 1], + "150-mega-x": [0, 1, 1], + "150-mega-y": [0, 1, 1], + "181-mega": [0, 1, 2], + "212-mega": [1, 1, 2], + "229-mega": [0, 1, 1], + "248-mega": [0, 1, 1], + "257-mega": [0, 1, 1], + "282-mega": [0, 2, 2], + "302-mega": [0, 1, 1], + "303-mega": [0, 1, 1], + "306-mega": [1, 1, 1], + "308-mega": [0, 1, 1], + "310-mega": [0, 1, 1], + "334-mega": [0, 2, 1], + "354-mega": [0, 1, 1], + "359-mega": [0, 1, 1], + "362-mega": [0, 1, 1], + "373-mega": [0, 1, 1], + "376-mega": [0, 1, 1], + "380-mega": [0, 1, 1], + "381-mega": [0, 1, 1], + "382-primal": [0, 1, 1], + "383-primal": [0, 1, 1], + "384-mega": [0, 2, 1], + "428-mega": [0, 1, 1], + "445-mega": [1, 1, 1], + "448-mega": [1, 1, 1], + "475-mega": [0, 2, 2], + "531-mega": [0, 1, 1], + "653": [0, 1, 1], + "654": [0, 1, 1], + "655": [0, 1, 1], + "656": [0, 1, 1], + "657": [0, 1, 1], + "658": [0, 1, 1], + "658-ash": [0, 1, 1], + "664": [0, 1, 1], + "665": [0, 1, 1], + "666-archipelago": [0, 1, 1], + "666-continental": [0, 1, 1], + "666-elegant": [0, 1, 1], + "666-fancy": [0, 1, 1], + "666-garden": [0, 1, 1], + "666-high-plains": [0, 1, 1], + "666-icy-snow": [0, 1, 1], + "666-jungle": [0, 1, 1], + "666-marine": [0, 1, 1], + "666-meadow": [0, 1, 1], + "666-modern": [0, 1, 1], + "666-monsoon": [0, 1, 1], + "666-ocean": [0, 1, 1], + "666-poke-ball": [0, 1, 1], + "666-polar": [0, 1, 1], + "666-river": [0, 1, 1], + "666-sandstorm": [0, 1, 1], + "666-savanna": [0, 1, 1], + "666-sun": [0, 1, 1], + "666-tundra": [0, 1, 1], + "669-red": [0, 2, 2], + "669-blue": [0, 1, 1], + "669-white": [0, 1, 1], + "669-yellow": [0, 1, 1], + "669-orange": [0, 2, 2], + "670-white": [0, 1, 1], + "670-blue": [0, 1, 1], + "670-orange": [0, 1, 1], + "670-red": [0, 1, 1], + "670-yellow": [0, 1, 1], + "671-red": [0, 1, 2], + "671-blue": [0, 1, 2], + "671-yellow": [0, 1, 1], + "671-white": [0, 1, 2], + "671-orange": [0, 1, 2], + "672": [0, 1, 1], + "673": [0, 1, 1], + "676": [0, 1, 1], + "677": [0, 1, 1], + "678-female": [0, 1, 1], + "678": [0, 1, 1], + "682": [0, 1, 1], + "683": [0, 1, 1], + "684": [0, 1, 1], + "685": [0, 1, 1], + "688": [0, 1, 1], + "689": [0, 1, 1], + "690": [0, 1, 1], + "691": [0, 1, 1], + "696": [0, 1, 1], + "697": [0, 1, 1], + "698": [0, 1, 1], + "699": [0, 1, 1], + "700": [0, 1, 1], + "702": [0, 1, 1], + "703": [0, 1, 1], + "704": [0, 1, 1], + "705": [0, 1, 1], + "706": [0, 1, 1], + "708": [0, 1, 1], + "709": [0, 1, 1], + "710": [0, 1, 1], + "711": [1, 1, 1], + "712": [0, 1, 1], + "713": [0, 1, 1], + "714": [0, 1, 1], + "715": [0, 1, 1], + "716-active": [0, 1, 1], + "716-neutral": [0, 1, 1], + "717": [0, 2, 2], + "720-unbound": [1, 1, 1], + "720": [1, 1, 1], + "728": [0, 1, 1], + "729": [0, 2, 2], + "730": [0, 2, 1], + "734": [0, 1, 1], + "735": [0, 1, 1], + "742": [0, 2, 2], + "743": [0, 2, 2], + "747": [0, 2, 2], + "748": [0, 1, 1], + "751": [0, 1, 1], + "752": [0, 1, 1], + "753": [0, 1, 1], + "754": [0, 2, 2], + "755": [0, 1, 1], + "756": [0, 1, 1], + "761": [0, 1, 1], + "762": [0, 1, 1], + "763": [0, 1, 1], + "767": [0, 1, 1], + "768": [0, 1, 1], + "770": [0, 0, 0], + "771": [0, 2, 2], + "772": [0, 1, 1], + "773-fighting": [0, 1, 1], + "773-psychic": [0, 1, 1], + "773-poison": [0, 1, 1], + "773-ground": [0, 1, 1], + "773-ghost": [0, 1, 1], + "773-steel": [0, 1, 1], + "773-rock": [0, 1, 1], + "773-grass": [0, 1, 1], + "773-dragon": [0, 1, 1], + "773-bug": [0, 1, 1], + "773-ice": [0, 1, 1], + "773-dark": [0, 1, 1], + "773": [0, 1, 1], + "773-fairy": [0, 1, 1], + "773-water": [0, 1, 1], + "773-electric": [0, 1, 1], + "773-flying": [0, 1, 1], + "773-fire": [0, 1, 1], + "776": [0, 1, 1], + "777": [0, 1, 1], + "778-busted": [0, 1, 1], + "778-disguised": [0, 1, 1], + "779": [0, 1, 1], + "789": [1, 1, 1], + "790": [0, 1, 1], + "791": [2, 1, 1], + "792": [0, 1, 1], + "793": [0, 2, 2], + "797": [0, 1, 1], + "798": [0, 1, 1], + "800-dawn-wings": [0, 1, 1], + "800-dusk-mane": [0, 1, 1], + "800-ultra": [0, 1, 1], + "800": [0, 1, 1], + "802": [1, 1, 1], + "803": [0, 1, 1], + "804": [0, 1, 1], + "807": [0, 1, 1], + "808": [0, 1, 1], + "809": [0, 1, 1], + "816": [0, 1, 1], + "817": [0, 1, 1], + "818": [1, 1, 1], + "821": [0, 2, 2], + "822": [0, 1, 1], + "823": [0, 1, 1], + "829": [0, 1, 1], + "830": [0, 1, 1], + "835": [0, 1, 1], + "836": [0, 2, 2], + "850": [0, 1, 1], + "851": [0, 1, 1], + "854": [0, 1, 1], + "855": [0, 1, 1], + "856": [0, 1, 1], + "857": [0, 2, 2], + "858": [0, 1, 1], + "859": [0, 1, 1], + "860": [0, 1, 1], + "861": [0, 1, 1], + "862": [0, 1, 1], + "863": [0, 1, 1], + "864": [0, 1, 1], + "867": [0, 1, 1], + "872": [1, 1, 1], + "873": [1, 1, 1], + "876-female": [0, 1, 1], + "876": [0, 1, 1], + "877-hangry": [1, 1, 1], + "877": [1, 1, 1], + "880": [0, 1, 1], + "881": [0, 1, 1], + "882": [0, 2, 1], + "883": [0, 1, 1], + "884": [0, 1, 1], + "885": [1, 1, 1], + "886": [1, 1, 1], + "887": [1, 1, 1], + "888": [0, 1, 1], + "888-crowned": [0, 1, 1], + "889": [0, 1, 1], + "889-crowned": [0, 1, 1], + "890": [0, 2, 1], + "890-eternamax": [0, 1, 1], + "891": [1, 1, 1], + "892-rapid-strike": [1, 1, 1], + "892": [1, 1, 1], + "894": [0, 1, 1], + "895": [0, 1, 1], + "896": [1, 1, 1], + "897": [1, 1, 1], + "898": [1, 1, 1], + "898-ice": [1, 1, 1], + "898-shadow": [1, 1, 1], + "900": [0, 1, 1], + "901": [0, 1, 1], + "903": [0, 1, 1], + "909": [0, 1, 1], + "910": [0, 2, 2], + "911": [0, 2, 2], + "912": [0, 1, 2], + "913": [0, 1, 2], + "914": [0, 2, 1], + "919": [1, 1, 1], + "920": [1, 1, 1], + "924": [1, 1, 1], + "925-four": [1, 2, 2], + "925-three": [1, 2, 2], + "932": [0, 2, 2], + "933": [0, 2, 2], + "934": [0, 1, 1], + "935": [1, 1, 2], + "936": [2, 2, 2], + "937": [2, 2, 2], + "940": [0, 1, 1], + "941": [0, 1, 1], + "944": [0, 1, 1], + "945": [0, 1, 1], + "948": [0, 1, 1], + "949": [0, 1, 1], + "951": [0, 1, 1], + "952": [0, 1, 1], + "953": [0, 1, 1], + "954": [0, 1, 1], + "957": [2, 2, 2], + "958": [2, 2, 2], + "959": [2, 2, 2], + "962": [1, 1, 1], + "967": [0, 1, 1], + "968": [0, 1, 1], + "969": [0, 1, 1], + "970": [0, 1, 1], + "973": [1, 1, 1], + "974": [0, 1, 1], + "975": [0, 1, 1], + "978-curly": [0, 2, 2], + "978-droopy": [0, 2, 2], + "978-stretchy": [0, 2, 2], + "979": [2, 2, 2], + "981": [0, 1, 1], + "982": [0, 1, 1], + "982-three-segment": [0, 1, 1], + "987": [1, 1, 1], + "988": [0, 1, 2], + "993": [0, 1, 1], + "994": [0, 1, 2], + "995": [0, 1, 1], + "996": [0, 1, 1], + "997": [0, 2, 2], + "998": [0, 2, 2], + "999": [2, 1, 1], + "1000": [1, 1, 1], + "1001": [0, 1, 1], + "1003": [0, 1, 1], + "1004": [0, 1, 1], + "1006": [0, 2, 1], + "1007-apex-build": [0, 2, 2], + "1008-ultimate-mode": [1, 1, 1], + "2026": [0, 1, 1], + "2027": [0, 1, 1], + "2028": [0, 1, 1], + "2052": [0, 1, 1], + "2053": [0, 1, 0], + "2103": [0, 1, 1], + "4052": [0, 1, 1], + "4077": [0, 1, 1], + "4078": [0, 1, 1], + "4079": [0, 1, 1], + "4080": [2, 1, 1], + "4144": [0, 1, 1], + "4145": [0, 1, 1], + "4146": [0, 1, 1], + "4199": [2, 1, 1], + "4222": [0, 1, 1], + "4263": [0, 1, 1], + "4264": [0, 1, 1], + "4562": [0, 1, 1], + "6100": [0, 1, 1], + "6101": [0, 1, 1], + "6215": [0, 1, 1], + "6503": [0, 1, 1], + "6549": [0, 1, 1], + "6570": [0, 1, 1], + "6571": [0, 1, 1], + "6705": [0, 1, 1], + "6706": [0, 1, 1], + "6713": [0, 1, 1], + "female": { + "6215": [0, 1, 1] }, - "6713": [ - 0, - 1, - 1 - ] + "back": { + "3-mega": [0, 2, 2], + "6-mega-x": [0, 2, 2], + "6-mega-y": [0, 1, 2], + "80-mega": [0, 1, 1], + "94-mega": [1, 1, 1], + "127-mega": [0, 1, 1], + "130-mega": [0, 1, 1], + "142-mega": [0, 1, 1], + "150-mega-x": [0, 1, 1], + "150-mega-y": [0, 1, 1], + "181-mega": [0, 1, 2], + "212-mega": [1, 2, 2], + "229-mega": [0, 1, 1], + "248-mega": [0, 1, 1], + "257-mega": [0, 1, 1], + "282-mega": [0, 1, 1], + "302-mega": [0, 1, 1], + "303-mega": [0, 1, 1], + "306-mega": [1, 1, 1], + "308-mega": [0, 1, 1], + "310-mega": [0, 1, 1], + "334-mega": [0, 1, 1], + "354-mega": [0, 1, 1], + "359-mega": [0, 1, 1], + "362-mega": [0, 1, 1], + "373-mega": [0, 1, 1], + "376-mega": [0, 1, 1], + "380-mega": [0, 1, 1], + "381-mega": [0, 1, 1], + "382-primal": [0, 1, 1], + "383-primal": [0, 1, 1], + "384-mega": [0, 1, 1], + "428-mega": [0, 1, 1], + "445-mega": [1, 1, 1], + "448-mega": [1, 1, 1], + "475-mega": [0, 2, 2], + "531-mega": [0, 1, 1], + "653": [0, 1, 1], + "654": [0, 1, 1], + "655": [0, 1, 1], + "656": [0, 1, 1], + "657": [0, 1, 1], + "658": [0, 1, 1], + "658-ash": [0, 1, 1], + "664": [0, 1, 1], + "665": [0, 1, 1], + "666-archipelago": [0, 1, 1], + "666-continental": [0, 1, 1], + "666-elegant": [0, 1, 1], + "666-fancy": [0, 1, 1], + "666-garden": [0, 1, 1], + "666-high-plains": [0, 1, 1], + "666-icy-snow": [0, 1, 1], + "666-jungle": [0, 1, 1], + "666-marine": [0, 1, 1], + "666-meadow": [0, 1, 1], + "666-modern": [0, 1, 1], + "666-monsoon": [0, 1, 1], + "666-ocean": [0, 1, 1], + "666-poke-ball": [0, 1, 1], + "666-polar": [0, 1, 1], + "666-river": [0, 1, 1], + "666-sandstorm": [0, 1, 1], + "666-savanna": [0, 1, 1], + "666-sun": [0, 1, 1], + "666-tundra": [0, 1, 1], + "669-red": [0, 2, 2], + "669-blue": [0, 2, 2], + "669-white": [0, 2, 2], + "669-yellow": [0, 2, 2], + "669-orange": [0, 2, 2], + "670-white": [0, 1, 1], + "670-blue": [0, 2, 2], + "670-orange": [0, 1, 1], + "670-red": [0, 1, 1], + "670-yellow": [0, 1, 1], + "671-red": [0, 1, 1], + "671-blue": [0, 1, 1], + "671-yellow": [0, 1, 1], + "671-white": [0, 1, 1], + "671-orange": [0, 1, 1], + "672": [0, 1, 1], + "673": [0, 1, 1], + "676": [0, 1, 1], + "677": [0, 1, 1], + "678-female": [0, 1, 1], + "678": [0, 1, 1], + "682": [0, 1, 1], + "683": [0, 1, 1], + "684": [0, 1, 1], + "685": [0, 1, 1], + "688": [0, 1, 1], + "689": [0, 1, 1], + "690": [0, 1, 1], + "691": [0, 1, 1], + "696": [0, 1, 1], + "697": [0, 1, 1], + "698": [0, 1, 1], + "699": [0, 2, 2], + "700": [0, 1, 1], + "702": [0, 1, 1], + "703": [0, 1, 1], + "704": [0, 1, 1], + "705": [0, 1, 1], + "706": [0, 1, 1], + "708": [0, 1, 1], + "709": [0, 1, 1], + "710": [0, 1, 1], + "711": [1, 1, 1], + "712": [0, 1, 1], + "713": [0, 1, 1], + "714": [0, 1, 1], + "715": [0, 1, 1], + "716-active": [0, 1, 1], + "716-neutral": [0, 1, 1], + "717": [0, 1, 1], + "720-unbound": [1, 1, 1], + "720": [1, 1, 1], + "728": [0, 1, 1], + "729": [0, 2, 2], + "730": [0, 2, 1], + "734": [0, 1, 1], + "735": [0, 1, 1], + "742": [0, 2, 2], + "743": [0, 2, 2], + "747": [0, 2, 2], + "748": [0, 1, 1], + "751": [0, 1, 1], + "752": [0, 1, 1], + "753": [0, 1, 1], + "754": [0, 2, 2], + "755": [0, 1, 1], + "756": [0, 1, 1], + "761": [0, 1, 1], + "762": [0, 1, 1], + "763": [0, 1, 1], + "767": [0, 1, 1], + "768": [0, 1, 1], + "771": [0, 1, 1], + "772": [0, 1, 1], + "773-fighting": [0, 1, 1], + "773-psychic": [0, 1, 1], + "773-poison": [0, 1, 1], + "773-ground": [0, 1, 1], + "773-ghost": [0, 1, 1], + "773-steel": [0, 1, 1], + "773-rock": [0, 1, 1], + "773-grass": [0, 1, 1], + "773-dragon": [0, 1, 1], + "773-bug": [0, 1, 1], + "773-ice": [0, 1, 1], + "773-dark": [0, 1, 1], + "773": [0, 1, 1], + "773-fairy": [0, 1, 1], + "773-water": [0, 1, 1], + "773-electric": [0, 1, 1], + "773-flying": [0, 1, 1], + "773-fire": [0, 1, 1], + "776": [0, 2, 2], + "777": [0, 1, 1], + "778-busted": [0, 1, 1], + "778-disguised": [0, 1, 1], + "779": [0, 1, 1], + "789": [1, 1, 1], + "790": [0, 1, 1], + "791": [1, 1, 1], + "792": [0, 1, 1], + "793": [0, 1, 1], + "797": [0, 1, 1], + "798": [0, 1, 1], + "800-dawn-wings": [0, 1, 1], + "800-dusk-mane": [0, 1, 1], + "800-ultra": [0, 1, 1], + "800": [0, 1, 1], + "802": [1, 1, 1], + "803": [0, 1, 1], + "804": [0, 1, 1], + "807": [0, 1, 1], + "808": [0, 1, 1], + "809": [0, 1, 1], + "816": [0, 1, 1], + "817": [0, 1, 1], + "818": [0, 1, 1], + "821": [0, 1, 1], + "822": [0, 1, 1], + "823": [0, 1, 1], + "829": [0, 1, 1], + "830": [0, 1, 1], + "835": [0, 1, 1], + "836": [0, 1, 1], + "850": [0, 1, 1], + "851": [0, 1, 1], + "854": [0, 1, 1], + "855": [0, 1, 1], + "856": [0, 1, 1], + "857": [0, 2, 2], + "858": [0, 1, 1], + "859": [0, 1, 1], + "860": [0, 1, 1], + "861": [0, 1, 1], + "862": [0, 1, 1], + "863": [0, 1, 1], + "864": [0, 1, 1], + "867": [0, 1, 1], + "872": [1, 1, 1], + "873": [1, 1, 1], + "876-female": [0, 1, 1], + "876": [0, 1, 1], + "877-hangry": [1, 1, 1], + "877": [1, 1, 1], + "880": [0, 1, 1], + "881": [0, 1, 1], + "882": [0, 1, 1], + "883": [0, 1, 1], + "884": [0, 1, 1], + "885": [1, 1, 1], + "886": [1, 1, 1], + "887": [1, 1, 1], + "888": [0, 1, 1], + "888-crowned": [0, 1, 1], + "889": [0, 1, 1], + "889-crowned": [0, 1, 1], + "890": [0, 1, 1], + "891": [1, 1, 1], + "892-rapid-strike": [1, 1, 1], + "892": [1, 1, 1], + "894": [0, 1, 1], + "895": [0, 1, 1], + "896": [1, 1, 1], + "897": [1, 1, 1], + "898": [1, 1, 1], + "898-ice": [1, 1, 1], + "898-shadow": [1, 1, 1], + "900": [0, 1, 1], + "901": [0, 1, 1], + "903": [0, 1, 1], + "909": [0, 1, 1], + "910": [0, 2, 2], + "911": [0, 1, 1], + "912": [0, 1, 1], + "913": [0, 1, 1], + "914": [0, 2, 2], + "919": [1, 1, 1], + "920": [1, 1, 1], + "924": [1, 1, 1], + "925-four": [1, 2, 2], + "925-three": [1, 2, 2], + "932": [0, 1, 1], + "933": [0, 1, 1], + "934": [0, 1, 1], + "935": [2, 2, 2], + "936": [2, 2, 2], + "937": [2, 2, 2], + "940": [0, 1, 1], + "941": [0, 1, 1], + "944": [0, 1, 1], + "945": [0, 1, 1], + "948": [0, 1, 1], + "949": [0, 1, 1], + "951": [0, 1, 1], + "952": [0, 2, 1], + "953": [0, 1, 1], + "954": [0, 1, 1], + "957": [1, 1, 1], + "958": [1, 1, 1], + "959": [1, 1, 1], + "962": [1, 1, 1], + "967": [0, 1, 1], + "968": [0, 2, 2], + "969": [0, 1, 1], + "970": [0, 1, 1], + "973": [1, 1, 1], + "974": [0, 1, 1], + "975": [0, 1, 1], + "978-curly": [0, 2, 2], + "978-droopy": [0, 2, 2], + "978-stretchy": [0, 1, 1], + "979": [1, 1, 1], + "981": [0, 1, 1], + "982": [0, 1, 1], + "982-three-segment": [0, 1, 1], + "987": [1, 1, 1], + "988": [0, 1, 1], + "993": [0, 1, 1], + "994": [0, 1, 1], + "995": [0, 1, 1], + "996": [0, 1, 1], + "997": [0, 1, 1], + "998": [0, 1, 1], + "999": [1, 1, 1], + "1000": [1, 1, 1], + "1001": [0, 1, 1], + "1003": [0, 1, 1], + "1004": [0, 1, 1], + "1006": [0, 2, 2], + "1007-apex-build": [0, 2, 2], + "1008-ultimate-mode": [1, 1, 1], + "2026": [0, 1, 1], + "2027": [0, 1, 1], + "2028": [0, 1, 1], + "2052": [0, 1, 1], + "2053": [0, 1, 1], + "2103": [0, 1, 1], + "4052": [0, 1, 1], + "4077": [0, 1, 1], + "4078": [0, 1, 1], + "4079": [0, 1, 1], + "4080": [2, 2, 2], + "4144": [0, 1, 1], + "4145": [0, 1, 1], + "4146": [0, 1, 1], + "4199": [2, 1, 1], + "4222": [0, 1, 1], + "4263": [0, 1, 1], + "4264": [0, 1, 1], + "4562": [0, 1, 1], + "6100": [0, 1, 1], + "6101": [0, 1, 1], + "6215": [0, 1, 1], + "6503": [0, 1, 1], + "6549": [0, 1, 1], + "6570": [0, 1, 1], + "6571": [0, 1, 1], + "6705": [0, 1, 1], + "6706": [0, 1, 1], + "6713": [0, 1, 1], + "female": { + "6215": [0, 1, 1] + } + } } -} +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/1012-counterfeit.json b/public/images/pokemon/variant/back/1012-counterfeit.json new file mode 100644 index 00000000000..10255311fe0 --- /dev/null +++ b/public/images/pokemon/variant/back/1012-counterfeit.json @@ -0,0 +1,34 @@ +{ + "1": { + "291e1e": "404ec8", + "87847e": "8a96c0", + "78c463": "f7dfc5", + "4c3a3a": "667fe9", + "5d9e4a": "dda08a", + "251b1b": "222078", + "a09750": "acbedf", + "e6e1db": "f5fdff", + "396725": "b0654a", + "ccc374": "e9f4f7", + "613f19": "7b86ad", + "544040": "626a96", + "c1b9ae": "c8ddf1", + "69441b": "3a44a4" + }, + "2": { + "291e1e": "37183f", + "87847e": "070722", + "78c463": "c3b4e0", + "4c3a3a": "563f5b", + "5d9e4a": "978dc7", + "251b1b": "1c0b1f", + "a09750": "1b2556", + "e6e1db": "212b5e", + "396725": "7a5aa7", + "ccc374": "293363", + "613f19": "0d1030", + "544040": "020109", + "c1b9ae": "111039", + "69441b": "44244b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/1013-unremarkable.json b/public/images/pokemon/variant/back/1013-unremarkable.json new file mode 100644 index 00000000000..2a6de98db5a --- /dev/null +++ b/public/images/pokemon/variant/back/1013-unremarkable.json @@ -0,0 +1,36 @@ +{ + "1": { + "5d9e4a": "dda08a", + "a09750": "c3d7eb", + "251b1b": "404ec8", + "7b6f6c": "acbedf", + "c1b9ae": "cbe1f5", + "69441b": "3a44a4", + "342405": "565e7a", + "78c463": "f7dfc5", + "9e8574": "b36171", + "988975": "939ec4", + "295217": "b0654a", + "e6e1db": "e6f9ff", + "6a5b20": "8a96c0", + "291a0d": "222078", + "453636": "667fe9" + }, + "2": { + "5d9e4a": "978dc7", + "a09750": "263665", + "251b1b": "37183f", + "7b6f6c": "0f102d", + "c1b9ae": "111039", + "69441b": "44244b", + "342405": "0b0c21", + "78c463": "c3b4e0", + "9e8574": "585d81", + "988975": "212e57", + "295217": "7a5aa7", + "e6e1db": "212b5e", + "6a5b20": "171542", + "291a0d": "170d26", + "453636": "563f5b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/102.json b/public/images/pokemon/variant/back/102.json new file mode 100644 index 00000000000..61035a495c9 --- /dev/null +++ b/public/images/pokemon/variant/back/102.json @@ -0,0 +1,20 @@ +{ + "1": { + "943131": "193662", + "e69c00": "a0694c", + "ffe6ce": "7ae49f", + "ffce4a": "cea573", + "ffb58c": "369b96", + "ef8463": "26647e", + "ffd6ad": "4fba94" + }, + "2": { + "943131": "414189", + "e69c00": "6d2341", + "ffe6ce": "ebb6f8", + "ffce4a": "92394b", + "ffb58c": "9475ce", + "ef8463": "6c5fb6", + "ffd6ad": "b98fe4" + } +} \ No newline at end of file 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/103.json b/public/images/pokemon/variant/back/103.json new file mode 100644 index 00000000000..492bc14b102 --- /dev/null +++ b/public/images/pokemon/variant/back/103.json @@ -0,0 +1,28 @@ +{ + "1": { + "ffde6b": "a3c4ed", + "e6ad5a": "869fdc", + "73ad31": "dea44c", + "8c7342": "283f5b", + "526329": "c8592a", + "9cd64a": "f4e774", + "a56b21": "6072ba", + "b59c4a": "426378", + "734210": "373e85", + "ffefa5": "d3efff", + "524210": "131d33" + }, + "2": { + "ffde6b": "eb748d", + "e6ad5a": "c84e7f", + "73ad31": "3d324b", + "8c7342": "d59cba", + "526329": "1f1a31", + "9cd64a": "6a5b73", + "a56b21": "83295f", + "b59c4a": "ffdbe7", + "734210": "4e1044", + "ffefa5": "ffa29d", + "524210": "925b81" + } +} \ No newline at end of file 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/128.json b/public/images/pokemon/variant/back/128.json new file mode 100644 index 00000000000..ef61b186930 --- /dev/null +++ b/public/images/pokemon/variant/back/128.json @@ -0,0 +1,30 @@ +{ + "1": { + "dea54a": "56b393", + "634a31": "173e0d", + "9c9cad": "997059", + "6b6b84": "75413b", + "b58431": "2e8a85", + "8c6b52": "355816", + "523a10": "102d4b", + "ad8c73": "5f722a", + "4a3a29": "072b05", + "8c6321": "215c72", + "cecede": "c2a082", + "3a3a4a": "4d2324" + }, + "2": { + "dea54a": "872b3b", + "634a31": "bc9681", + "9c9cad": "edda95", + "6b6b84": "cca45e", + "b58431": "5e172e", + "8c6b52": "d6c3aa", + "523a10": "2f0e21", + "ad8c73": "faf9ed", + "4a3a29": "966959", + "8c6321": "461029", + "cecede": "fffcc1", + "3a3a4a": "996537" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/152.json b/public/images/pokemon/variant/back/152.json new file mode 100644 index 00000000000..2460f5977d5 --- /dev/null +++ b/public/images/pokemon/variant/back/152.json @@ -0,0 +1,26 @@ +{ + "1": { + "849452": "7373b4", + "b5ce6b": "aca1d7", + "d6f78c": "ded2f1", + "84e631": "8074fa", + "ef7b7b": "9bd5c1", + "c52929": "77b3af", + "6bb529": "6f4be2", + "425a19": "505d8d", + "638c29": "6633bc", + "426319": "5d2398" + }, + "2": { + "849452": "a62775", + "b5ce6b": "c83c74", + "d6f78c": "e7617d", + "84e631": "feeeaf", + "ef7b7b": "71cf71", + "c52929": "4eac60", + "6bb529": "f0d187", + "425a19": "801a69", + "638c29": "d8a864", + "426319": "b4814b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/153.json b/public/images/pokemon/variant/back/153.json new file mode 100644 index 00000000000..8495177fbaa --- /dev/null +++ b/public/images/pokemon/variant/back/153.json @@ -0,0 +1,26 @@ +{ + "1": { + "a58419": "5961ce", + "ad3100": "47d0d1", + "295208": "232699", + "8cbd31": "8251dc", + "debd29": "7b8ce6", + "527b08": "4d36be", + "6b9c10": "6b41cc", + "f7e64a": "a2bbf8", + "6b5200": "493fa6", + "d68c52": "80f5e6" + }, + "2": { + "a58419": "a8244d", + "ad3100": "439227", + "295208": "c58c48", + "8cbd31": "fae084", + "debd29": "ca333d", + "527b08": "e8bc5e", + "6b9c10": "edc870", + "f7e64a": "ea704a", + "6b5200": "891b4f", + "d68c52": "8ec349" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/154.json b/public/images/pokemon/variant/back/154.json new file mode 100644 index 00000000000..a667f36b9c1 --- /dev/null +++ b/public/images/pokemon/variant/back/154.json @@ -0,0 +1,26 @@ +{ + "1": { + "634a00": "519aa7", + "ff3a5a": "3542a7", + "e6ad00": "7bcfc6", + "ce213a": "27217d", + "63bd42": "9d86d9", + "f7a59c": "72d1da", + "7b103a": "23124e", + "107b31": "8057b2", + "ffde21": "b1f2dc", + "9ce652": "b7afee" + }, + "2": { + "634a00": "488939", + "ff3a5a": "f9db74", + "e6ad00": "6bac4b", + "ce213a": "e5b650", + "63bd42": "a31f60", + "f7a59c": "fff6a9", + "7b103a": "b7873b", + "107b31": "761858", + "ffde21": "92c462", + "9ce652": "cd3b6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/158.json b/public/images/pokemon/variant/back/158.json new file mode 100644 index 00000000000..a6c54577e98 --- /dev/null +++ b/public/images/pokemon/variant/back/158.json @@ -0,0 +1,29 @@ +{ + "1": { + "b54a52": "1d5d6c", + "6bb5e6": "dd8e59", + "94d6ff": "fdc17e", + "ffc552": "99d4d9", + "ad8429": "4798ab", + "ce4221": "772c52", + "3184c5": "ae5139", + "e67b7b": "749e9e", + "ef735a": "ad5778", + "7b1900": "4f0332", + "315a84": "73131e" + }, + "2": { + "000000": "ffffff", + "b54a52": "c48b27", + "6bb5e6": "97ac5b", + "94d6ff": "ccd198", + "ffc552": "2f5365", + "ad8429": "1c314f", + "ce4221": "ce8c20", + "3184c5": "4f854a", + "e67b7b": "e4b843", + "ef735a": "f3b649", + "7b1900": "a66b14", + "315a84": "2b4a30" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/159.json b/public/images/pokemon/variant/back/159.json new file mode 100644 index 00000000000..c1124bb8d42 --- /dev/null +++ b/public/images/pokemon/variant/back/159.json @@ -0,0 +1,29 @@ +{ + "1": { + "3a4a84": "973027", + "e64221": "749e9e", + "ce293a": "682c4e", + "5aade6": "e5a354", + "ffe68c": "a9e4e5", + "840008": "4f1037", + "3184c5": "cd6537", + "cebd63": "56b3bd", + "6b5200": "085d75", + "840009": "1d5d6c", + "f7525a": "774860" + }, + "2": { + "000000": "ffffff", + "3a4a84": "26472b", + "e64221": "e4b843", + "ce293a": "ce8c20", + "5aade6": "8fa54e", + "ffe68c": "2f5365", + "840008": "a66b14", + "3184c5": "468040", + "cebd63": "1c314f", + "6b5200": "112034", + "840009": "c48b27", + "f7525a": "f3b649" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/160.json b/public/images/pokemon/variant/back/160.json new file mode 100644 index 00000000000..ac9067df672 --- /dev/null +++ b/public/images/pokemon/variant/back/160.json @@ -0,0 +1,29 @@ +{ + "1": { + "8cd6ff": "ffcf72", + "6b5200": "085d75", + "ce293a": "682c4e", + "5ab5f7": "eda857", + "cebd63": "56b3bd", + "ffe68c": "a9e4e5", + "840008": "4f1037", + "294a8c": "973027", + "3a8cce": "d26738", + "ff8c84": "926877", + "f7525a": "774860" + }, + "2": { + "000000": "ffffff", + "8cd6ff": "d1d692", + "6b5200": "112034", + "ce293a": "ce8c20", + "5ab5f7": "9ab350", + "cebd63": "1c314f", + "ffe68c": "2f5365", + "840008": "a66b14", + "294a8c": "274c2d", + "3a8cce": "498a42", + "ff8c84": "fff284", + "f7525a": "f3b649" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/167.json b/public/images/pokemon/variant/back/167.json new file mode 100644 index 00000000000..65a2a2dedf9 --- /dev/null +++ b/public/images/pokemon/variant/back/167.json @@ -0,0 +1,24 @@ +{ + "1": { + "52b56b": "e5812a", + "000000": "ffffff", + "c5b519": "3f2e71", + "314a10": "641218", + "8ce631": "f2ba40", + "527b29": "d54f1a", + "846b29": "221b57", + "ffe64a": "624095" + }, + "2": { + "52b56b": "b54158", + "bdc5c5": "a1b7de", + "c5b519": "7d95b9", + "314a10": "481229", + "ffffff": "cde6fc", + "8ce631": "dd7081", + "527b29": "8c2848", + "846b29": "565e8d", + "ffe64a": "aac3d6", + "6b6b73": "62657d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/168.json b/public/images/pokemon/variant/back/168.json new file mode 100644 index 00000000000..7a4270ff9c0 --- /dev/null +++ b/public/images/pokemon/variant/back/168.json @@ -0,0 +1,29 @@ +{ + "1": { + "c54242": "62b943", + "6b5219": "043435", + "63319c": "e28220", + "bdbdbd": "b5d3dc", + "520000": "317945", + "ff5a4a": "a8d919", + "c5b54a": "15463c", + "ffde42": "186c45", + "ff8c73": "dce24b", + "bd84e6": "f1b940", + "6b6b6b": "5f7980" + }, + "2": { + "c54242": "7ca5c6", + "6b5219": "161437", + "63319c": "96304a", + "bdbdbd": "c09fa1", + "520000": "2d3d72", + "ff5a4a": "a3c8d1", + "c5b54a": "1f2150", + "ffffff": "fae8e7", + "ffde42": "313b60", + "ff8c73": "c4e8e7", + "bd84e6": "c8545d", + "6b6b6b": "605050" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/170.json b/public/images/pokemon/variant/back/170.json new file mode 100644 index 00000000000..6f6317314fb --- /dev/null +++ b/public/images/pokemon/variant/back/170.json @@ -0,0 +1,30 @@ +{ + "1": { + "08295a": "691f03", + "ffce52": "a1dbba", + "295294": "a14713", + "ffef84": "ccffd7", + "5a73c5": "dda13d", + "94cee6": "ffeabf", + "522919": "052b38", + "ffffde": "f2fff5", + "c59400": "84bda9", + "7bbde6": "ffe0a2", + "846352": "45757a", + "6ba5e6": "f6e37f" + }, + "2": { + "08295a": "1b072f", + "ffce52": "e25765", + "295294": "441e56", + "ffef84": "f97f7f", + "5a73c5": "693373", + "94cee6": "a15b8d", + "522919": "720b3a", + "ffffde": "ffc4be", + "c59400": "b62b51", + "7bbde6": "9f5a9b", + "846352": "931b3c", + "6ba5e6": "89498d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/171.json b/public/images/pokemon/variant/back/171.json new file mode 100644 index 00000000000..8a9cafe4265 --- /dev/null +++ b/public/images/pokemon/variant/back/171.json @@ -0,0 +1,30 @@ +{ + "1": { + "a5314a": "bf882c", + "4a7bce": "bc3c4c", + "423110": "05333a", + "ef635a": "efde5a", + "7badef": "f6907f", + "a5ceff": "fbcdb3", + "e6b552": "82ca4f", + "6394e6": "e86062", + "ffde63": "c3e875", + "ad9442": "2a8d3d", + "293173": "872341", + "7b634a": "0c5540" + }, + "2": { + "a5314a": "c3851d", + "4a7bce": "9781b3", + "423110": "040529", + "ef635a": "f0d050", + "7badef": "eecfed", + "a5ceff": "fbf5fa", + "e6b552": "3294b8", + "6394e6": "c5a5d0", + "ffde63": "4dd5d9", + "ad9442": "23689e", + "293173": "4b426c", + "7b634a": "0c1d4c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/172-spiky.json b/public/images/pokemon/variant/back/172-spiky.json new file mode 100644 index 00000000000..f4c5e28b61a --- /dev/null +++ b/public/images/pokemon/variant/back/172-spiky.json @@ -0,0 +1,23 @@ +{ + "1": { + "c5ad10": "6cab9a", + "845a29": "45818a", + "a57b08": "5ca390", + "7d1c1c": "992424", + "e77b94": "bd4d5e", + "634a10": "30536b", + "f7e652": "a3d1a8" + }, + "2": { + "c5ad10": "4a6a90", + "845a29": "283567", + "171721": "9a4440", + "a57b08": "486a8e", + "212131": "d48d61", + "7d1c1c": "c38218", + "424252": "e7c17c", + "e77b94": "f5dd94", + "634a10": "2b2f54", + "f7e652": "7095ab" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/172-spiky_2.png b/public/images/pokemon/variant/back/172-spiky_2.png new file mode 100644 index 00000000000..9e9994d6b19 Binary files /dev/null and b/public/images/pokemon/variant/back/172-spiky_2.png differ diff --git a/public/images/pokemon/variant/back/172-spiky_3.png b/public/images/pokemon/variant/back/172-spiky_3.png new file mode 100644 index 00000000000..260de86af53 Binary files /dev/null and b/public/images/pokemon/variant/back/172-spiky_3.png differ diff --git a/public/images/pokemon/variant/back/172.json b/public/images/pokemon/variant/back/172.json new file mode 100644 index 00000000000..18c7f5bdee4 --- /dev/null +++ b/public/images/pokemon/variant/back/172.json @@ -0,0 +1,23 @@ +{ + "1": { + "c5ad10": "6cab9a", + "845a29": "45818a", + "a57b08": "5ca390", + "7d1c1c": "992424", + "e77b94": "bd4d5e", + "634a10": "30536b", + "f7e652": "a3d1a8" + }, + "2": { + "c5ad10": "4a6a90", + "845a29": "283567", + "171721": "9a4440", + "a57b08": "486a8e", + "212131": "d48d61", + "7d1c1c": "c38218", + "424252": "e7c17c", + "e77b94": "f5dd94", + "634a10": "2f335b", + "f7e652": "7095ab" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/172_2.png b/public/images/pokemon/variant/back/172_2.png new file mode 100644 index 00000000000..84a35b18ead Binary files /dev/null and b/public/images/pokemon/variant/back/172_2.png differ diff --git a/public/images/pokemon/variant/back/172_3.png b/public/images/pokemon/variant/back/172_3.png new file mode 100644 index 00000000000..b94789940f5 Binary files /dev/null and b/public/images/pokemon/variant/back/172_3.png differ diff --git a/public/images/pokemon/variant/back/174.json b/public/images/pokemon/variant/back/174.json new file mode 100644 index 00000000000..eaabbbc574d --- /dev/null +++ b/public/images/pokemon/variant/back/174.json @@ -0,0 +1,14 @@ +{ + "1": { + "9c1952": "3a6472", + "b55273": "43737d", + "e6849c": "81c2b8", + "ffadbd": "c5ebd5" + }, + "2": { + "9c1952": "9c5200", + "b55273": "a16b30", + "e6849c": "f5c45b", + "ffadbd": "f5e884" + } +} \ No newline at end of file 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/194.json b/public/images/pokemon/variant/back/194.json new file mode 100644 index 00000000000..83297ce4e5b --- /dev/null +++ b/public/images/pokemon/variant/back/194.json @@ -0,0 +1,20 @@ +{ + "1": { + "529ce6": "e8983d", + "9463a5": "65b1c2", + "633a6b": "204954", + "3a7bc5": "d5682e", + "73bdff": "ffc355", + "d65ad6": "81e2f7", + "104a84": "7a150a" + }, + "2": { + "529ce6": "564daa", + "9463a5": "cf933b", + "633a6b": "80301c", + "3a7bc5": "3f377e", + "73bdff": "5c66c4", + "d65ad6": "e9cb52", + "104a84": "180d42" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/195.json b/public/images/pokemon/variant/back/195.json new file mode 100644 index 00000000000..f79c398dc81 --- /dev/null +++ b/public/images/pokemon/variant/back/195.json @@ -0,0 +1,26 @@ +{ + "1": { + "ade6ff": "f6dfa8", + "84d6f7": "ed9e4f", + "637ba5": "936e66", + "639cbd": "dc6a4d", + "3194a5": "81e2f7", + "6b5a8c": "23768d", + "425284": "b03844", + "426b84": "af4237", + "195a6b": "54aec2", + "19423a": "204954" + }, + "2": { + "ade6ff": "9864c2", + "84d6f7": "724ba7", + "637ba5": "692d5d", + "639cbd": "493a8d", + "3194a5": "e9cb52", + "6b5a8c": "742f3d", + "425284": "240830", + "426b84": "3d237b", + "195a6b": "cf933b", + "19423a": "b96228" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/198.json b/public/images/pokemon/variant/back/198.json new file mode 100644 index 00000000000..eed8404265c --- /dev/null +++ b/public/images/pokemon/variant/back/198.json @@ -0,0 +1,26 @@ +{ + "1": { + "d94352": "8c1b23", + "314263": "462b20", + "efd684": "a6a6b3", + "d64252": "b3986b", + "42639c": "694c30", + "5a4a21": "25253b", + "292942": "2a1512", + "b59c21": "57566f", + "73293a": "755237", + "d6bd52": "838098" + }, + "2": { + "d94352": "8c1b23", + "314263": "0e4333", + "efd684": "c2723a", + "d64252": "bc4b84", + "42639c": "1d6e47", + "5a4a21": "4e1915", + "292942": "091e16", + "b59c21": "85412d", + "73293a": "7b2363", + "d6bd52": "9a5524" + } +} \ No newline at end of file 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/2026.json b/public/images/pokemon/variant/back/2026.json new file mode 100644 index 00000000000..4fb224dd489 --- /dev/null +++ b/public/images/pokemon/variant/back/2026.json @@ -0,0 +1,31 @@ +{ + "1": { + "b45f25": "2d5261", + "552720": "162f4b", + "f9ed9f": "eb999a", + "e9be14": "945c7b", + "e3882d": "3d7375", + "646124": "492652", + "ecd8b7": "b4c2a5", + "fffdfb": "d6d9ca", + "846b5b": "467f85", + "965821": "2f4e6b", + "dfc043": "d17577", + "602c24": "162f4b", + "fef443": "c48081", + "993c20": "1d3a57" + }, + "2": { + "b45f25": "bd8551", + "552720": "43617f", + "e9be14": "1a3551", + "e3882d": "d3b06f", + "646124": "122140", + "ecd8b7": "5a6f90", + "fffdfb": "6d8297", + "846b5b": "202746", + "965821": "9cb3ca", + "fef443": "3a5873", + "993c20": "965636" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/2103.json b/public/images/pokemon/variant/back/2103.json new file mode 100644 index 00000000000..2e97727835a --- /dev/null +++ b/public/images/pokemon/variant/back/2103.json @@ -0,0 +1,28 @@ +{ + "1": { + "2f9934": "dea44c", + "9f6b41": "426378", + "70442e": "283f5b", + "e6ac5a": "869fdc", + "522f16": "131d33", + "9cbd4a": "9977dd", + "fff68b": "a3c4ed", + "36cc36": "f4e774", + "2d5826": "c8592a", + "7b5210": "373e85", + "ffffcd": "d3efff" + }, + "2": { + "2f9934": "3d324b", + "9f6b41": "ffdbe7", + "70442e": "d59cba", + "e6ac5a": "c84e7f", + "522f16": "925b81", + "9cbd4a": "824a96", + "fff68b": "eb748d", + "36cc36": "6a5b73", + "2d5826": "1f1a31", + "7b5210": "4e1044", + "ffffcd": "ffa29d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/211.json b/public/images/pokemon/variant/back/211.json new file mode 100644 index 00000000000..01ae33500a4 --- /dev/null +++ b/public/images/pokemon/variant/back/211.json @@ -0,0 +1,22 @@ +{ + "1": { + "a5ad6b": "ad6643", + "194a52": "321128", + "dede94": "f1c17c", + "428494": "80294b", + "c5c57b": "dc9565", + "3a6363": "611a42", + "6b5231": "6d2c2c", + "73adb5": "a0415e" + }, + "2": { + "a5ad6b": "1e275b", + "194a52": "1c2f5b", + "dede94": "365492", + "428494": "60abdc", + "c5c57b": "2b3e7b", + "3a6363": "396796", + "6b5231": "181f46", + "73adb5": "8bd9ee" + } +} \ No newline at end of file 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/248-mega.json b/public/images/pokemon/variant/back/248-mega.json index 5def1f5a316..c63b19d7c29 100644 --- a/public/images/pokemon/variant/back/248-mega.json +++ b/public/images/pokemon/variant/back/248-mega.json @@ -1,28 +1,28 @@ { "1": { - "101010": "101010", - "4a5a39": "533334", - "accd9c": "c78482", - "739c62": "915957", - "c5c5c5": "c5c5c5", - "942900": "006fbe", - "fefefe": "fefefe", - "d55200": "0098fc", - "737373": "737373", - "821610": "004194", - "d0243b": "006fbe" + "171717": "101010", + "4a5a39": "533334", + "4b5a3b": "533334", + "727272": "727272", + "801c17": "533334", + "922d00": "004194", + "ce283d": "006fb3", + "d35200": "0098fc", + "729a62": "915957", + "739c62": "915957", + "aacb9a": "c78482" }, "2": { - "101010": "101010", - "4a5a39": "06092f", - "accd9c": "625695", - "739c62": "2c3071", - "c5c5c5": "c5c5c5", - "942900": "ee7b06", - "fefefe": "fefefe", - "d55200": "ffa904", - "737373": "737373", - "821610": "ee7b06", - "d0243b": "ffa904" + "171717": "101010", + "4a5a39": "06092f", + "4b5a3b": "06092f", + "727272": "727272", + "801c17": "ee7b06", + "922d00": "ee7b06", + "ce283d": "ffa904", + "d35200": "ffa904", + "729a62": "59417c", + "739c62": "59417c", + "aacb9a": "625695" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-beauty-cosplay.json b/public/images/pokemon/variant/back/25-beauty-cosplay.json new file mode 100644 index 00000000000..216262b149b --- /dev/null +++ b/public/images/pokemon/variant/back/25-beauty-cosplay.json @@ -0,0 +1,30 @@ +{ + "1": { + "5e5e6b": "6c6e60", + "f7e652": "a3d1a8", + "cecab9": "cfc8aa", + "f7e860": "eddc78", + "4d88c4": "7976c6", + "f7bd21": "79b5a5", + "2d276d": "2f2768", + "9c5200": "315c75", + "39509d": "47449c", + "fffdea": "f8ffe3", + "f7cc2f": "d5ac44" + }, + "2": { + "1e1526": "a45233", + "5e5e6b": "8a2554", + "f7e652": "577b98", + "cecab9": "b84084", + "f7e860": "eddc78", + "4d88c4": "e4f6f1", + "f7bd21": "486689", + "2d276d": "454a61", + "9c5200": "283361", + "39509d": "9ec4cd", + "fffdea": "ea82a6", + "4f454c": "f1b571", + "f7cc2f": "d5ac44" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-cool-cosplay.json b/public/images/pokemon/variant/back/25-cool-cosplay.json new file mode 100644 index 00000000000..278feb070bd --- /dev/null +++ b/public/images/pokemon/variant/back/25-cool-cosplay.json @@ -0,0 +1,31 @@ +{ + "1": { + "171717": "2a1d36", + "c52119": "ad4e76", + "842222": "7b1f18", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "ba2b23": "b73850", + "9c5200": "1c4f75", + "d95b45": "cf6887", + "3b3b40": "4a3e46" + }, + "2": { + "171717": "a45233", + "656f86": "cf752b", + "a5b0b6": "f0b541", + "c52119": "ebc67c", + "842222": "1e1e43", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "ba2b23": "2c2c47", + "55555e": "8f4b32", + "9c5200": "22325c", + "f4f7ab": "eadbb3", + "d95b45": "3a3f5e", + "3b3b40": "f1b571", + "272b2b": "7d3833" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-cosplay.json b/public/images/pokemon/variant/back/25-cosplay.json new file mode 100644 index 00000000000..c574d63d743 --- /dev/null +++ b/public/images/pokemon/variant/back/25-cosplay.json @@ -0,0 +1,26 @@ +{ + "1": { + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "f7bd21": "79b5a5", + "52525a": "4f454c", + "9c5200": "315c75", + "292929": "1e1526", + "633108": "09406b", + "e65a42": "cf6182", + "de9400": "338087" + }, + "2": { + "f7e652": "577b98", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "f7bd21": "445f8a", + "52525a": "f1b571", + "9c5200": "23345e", + "292929": "a45233", + "633108": "22244f", + "e65a42": "eedd9c", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-cute-cosplay.json b/public/images/pokemon/variant/back/25-cute-cosplay.json new file mode 100644 index 00000000000..7b26b79d08f --- /dev/null +++ b/public/images/pokemon/variant/back/25-cute-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "752bd0": "5452b7", + "baa998": "bab699", + "fff7a5": "c4e3c3", + "f7e652": "a3d1a8", + "ea82a6": "e8848e", + "cf4770": "cf4a59", + "f3bace": "f2bbbb", + "853247": "85323c", + "f7ef97": "f0eaa8", + "52525a": "4f454c", + "292929": "30263b", + "f7bd21": "79b5a5", + "9c5200": "255e8a" + }, + "2": { + "752bd0": "7751c2", + "baa998": "d3ab5a", + "fff7a5": "7b96aa", + "f7e652": "577b98", + "ea82a6": "a4b95f", + "cf4770": "739b55", + "f3bace": "c5cc85", + "853247": "254b30", + "f7ef97": "ebe7b7", + "52525a": "f1b571", + "292929": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-gigantamax.json b/public/images/pokemon/variant/back/25-gigantamax.json new file mode 100644 index 00000000000..1c47104e04d --- /dev/null +++ b/public/images/pokemon/variant/back/25-gigantamax.json @@ -0,0 +1,30 @@ +{ + "1": { + "623108": "09406b", + "c52018": "ad4e76", + "de9400": "338087", + "fefefe": "ffffff", + "f6bd20": "79b5a5", + "fff6a4": "c4e3c3", + "fff9c2": "b8ffd9", + "e65a41": "cf6182", + "9c5200": "315c75", + "f8fc4b": "5bc28b", + "f6e652": "a3d1a8" + }, + "2": { + "623108": "22244f", + "c52018": "ebc67c", + "de9400": "324472", + "fefefe": "ffffff", + "f6bd20": "445f8a", + "fff6a4": "7b96aa", + "fff9c2": "83b1d2", + "e65a41": "eedd9c", + "9c5200": "23345e", + "f8fc4b": "326a9f", + "695d65": "f1b571", + "f6e652": "577b98", + "323133": "d99362" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-partner.json b/public/images/pokemon/variant/back/25-partner.json new file mode 100644 index 00000000000..c20fae48a34 --- /dev/null +++ b/public/images/pokemon/variant/back/25-partner.json @@ -0,0 +1,26 @@ +{ + "1": { + "45454a": "4f454c", + "9c5200": "315c75", + "de9400": "338087", + "171717": "1e1526", + "c52119": "ad4e76", + "633108": "09406b", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5" + }, + "2": { + "45454a": "f1b571", + "9c5200": "23345e", + "de9400": "324472", + "171717": "a45233", + "c52119": "ebc67c", + "633108": "22244f", + "e65a42": "eedd9c", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "f7bd21": "445f8a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-smart-cosplay.json b/public/images/pokemon/variant/back/25-smart-cosplay.json new file mode 100644 index 00000000000..50749b31d8b --- /dev/null +++ b/public/images/pokemon/variant/back/25-smart-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "fffdea": "f8ffe3", + "b7a599": "bab699", + "60b553": "76a848", + "f7e652": "a3d1a8", + "366635": "3e5b2f", + "95635b": "91685f", + "171717": "1e1526", + "5f3434": "573b38", + "54545c": "55555e", + "52525a": "4f454c", + "292929": "272b2b", + "f7bd21": "79b5a5", + "9c5200": "315c75" + }, + "2": { + "fffdea": "f2f0df", + "b7a599": "a7b6b9", + "60b553": "dfb053", + "f7e652": "577b98", + "366635": "ab5130", + "95635b": "a09ea3", + "171717": "a45233", + "5f3434": "666060", + "54545c": "45525c", + "52525a": "f1b571", + "292929": "202937", + "f7bd21": "445f8a", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-tough-cosplay.json b/public/images/pokemon/variant/back/25-tough-cosplay.json new file mode 100644 index 00000000000..49c50d17ad2 --- /dev/null +++ b/public/images/pokemon/variant/back/25-tough-cosplay.json @@ -0,0 +1,35 @@ +{ + "1": { + "e37511": "d1694f", + "bf2629": "cf6a59", + "8d2b1d": "bf3638", + "c52119": "ad4e76", + "46464d": "2b3340", + "292929": "1e1526", + "f7bd21": "79b5a5", + "fbab33": "de9764", + "e65a42": "cf6182", + "cecab9": "cfc8aa", + "52525a": "4f454c", + "f7e652": "a3d1a8", + "9c5200": "315c75" + }, + "2": { + "e37511": "60448d", + "bf2629": "826694", + "f8ffe3": "e8e3e4", + "8d2b1d": "3d3f7d", + "c52119": "ebc67c", + "46464d": "2b3340", + "292929": "a45233", + "f7bd21": "445f8a", + "fbab33": "845ea1", + "e65a42": "eedd9c", + "cecab9": "beb1b4", + "8e2525": "242866", + "52525a": "f1b571", + "f7e652": "577b98", + "272b2b": "162231", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25.json b/public/images/pokemon/variant/back/25.json new file mode 100644 index 00000000000..c20fae48a34 --- /dev/null +++ b/public/images/pokemon/variant/back/25.json @@ -0,0 +1,26 @@ +{ + "1": { + "45454a": "4f454c", + "9c5200": "315c75", + "de9400": "338087", + "171717": "1e1526", + "c52119": "ad4e76", + "633108": "09406b", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5" + }, + "2": { + "45454a": "f1b571", + "9c5200": "23345e", + "de9400": "324472", + "171717": "a45233", + "c52119": "ebc67c", + "633108": "22244f", + "e65a42": "eedd9c", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "f7bd21": "445f8a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/26.json b/public/images/pokemon/variant/back/26.json new file mode 100644 index 00000000000..758faf12c97 --- /dev/null +++ b/public/images/pokemon/variant/back/26.json @@ -0,0 +1,34 @@ +{ + "1": { + "63636b": "4f454c", + "101011": "293059", + "944242": "395a80", + "bd5a31": "386d82", + "e6bd84": "a4bda7", + "ffbd00": "b3596b", + "5a2929": "293059", + "3a3a42": "30263b", + "8c6310": "8c3c4c", + "ffde5a": "cf7878", + "f7ad29": "76a68b", + "734231": "6e2f33", + "ffefd6": "c8d4ba", + "de7b31": "539190" + }, + "2": { + "542127": "905331", + "101011": "202a60", + "944242": "2d3b80", + "bd5a31": "375681", + "e6bd84": "a6b5ab", + "ffbd00": "f3cf91", + "5a2929": "202a60", + "8c6310": "c79b5a", + "ffde5a": "f2e4b6", + "f7ad29": "6385ab", + "734231": "bf8445", + "ffefd6": "cfc4b5", + "de7b31": "4d6f98", + "643034": "2e4685" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/276.json b/public/images/pokemon/variant/back/276.json new file mode 100644 index 00000000000..e0fb6b93467 --- /dev/null +++ b/public/images/pokemon/variant/back/276.json @@ -0,0 +1,32 @@ +{ + "1": { + "bdbdcc": "b5b5d5", + "bdbdce": "26523c", + "943a52": "ad8634", + "ffffff": "3c6a3d", + "a57331": "784524", + "212952": "12223d", + "3a3a31": "3e3e3e", + "5a6b9c": "2a596b", + "e69410": "bc7532", + "524a29": "4b210d", + "fffffd": "fffffe", + "314a7b": "1a385a", + "ce5273": "cebf49" + }, + "2": { + "bdbdcc": "b5b5d5", + "bdbdce": "453f63", + "943a52": "8ec08b", + "ffffff": "635d81", + "a57331": "4a323a", + "212952": "191222", + "3a3a31": "442c34", + "5a6b9c": "3c2f48", + "e69410": "63414f", + "524a29": "381f2c", + "fffffd": "fffffe", + "314a7b": "282037", + "ce5273": "bcd59d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/277.json b/public/images/pokemon/variant/back/277.json new file mode 100644 index 00000000000..5a3e049f5f5 --- /dev/null +++ b/public/images/pokemon/variant/back/277.json @@ -0,0 +1,36 @@ +{ + "1": { + "dea531": "bc7532", + "425a7b": "2a596b", + "ffffff": "3c6a3d", + "b5b5d6": "26523c", + "9c3152": "ad8634", + "945a10": "784524", + "5a5a5a": "b58251", + "63213a": "603c1d", + "c55a73": "cebf49", + "294263": "1a385a", + "292952": "12223d", + "fffffd": "fffffe", + "524221": "4b210d", + "b5b5d4": "b5b5d5", + "31313a": "89572a" + }, + "2": { + "dea531": "63414f", + "425a7b": "3c2f48", + "ffffff": "635d81", + "b5b5d6": "453f63", + "9c3152": "8ec08b", + "945a10": "4a323a", + "5a5a5a": "5d454d", + "63213a": "5d9469", + "c55a73": "bcd59d", + "294263": "282037", + "292952": "191222", + "fffffd": "fffffe", + "524221": "381f2c", + "b5b5d4": "b5b5d5", + "31313a": "442c34" + } +} \ No newline at end of file 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-gigantamax.json b/public/images/pokemon/variant/back/3-gigantamax.json index a8cd61c3419..b618abecbcc 100644 --- a/public/images/pokemon/variant/back/3-gigantamax.json +++ b/public/images/pokemon/variant/back/3-gigantamax.json @@ -1,6 +1,7 @@ { "1": { "833100": "180136", + "830009": "23033b", "bd6a31": "012729", "ffee52": "37d6de", "debd29": "078a8f", @@ -8,15 +9,18 @@ "de4141": "3f1375", "ff7b73": "712f8f", "ffbdbd": "a266b0", - "5a9c39": "705207", - "105241": "4f2800", - "83de7b": "a37707", + "e8a3a3": "91579e", + "5a9c39": "b34952", + "105241": "190038", + "2e5519": "38001c", + "83de7b": "ff745e", "107b6a": "b80479", "20b49c": "de3592", "fdfdfd": "fdfdfd" }, "2": { "833100": "0b2e01", + "830009": "154205", "bd6a31": "420514", "ffee52": "f75ea8", "debd29": "a30a66", @@ -24,9 +28,11 @@ "de4141": "3c8227", "ff7b73": "9db042", "ffbdbd": "e7e385", - "5a9c39": "19164f", - "105241": "030129", - "83de7b": "433d99", + "e8a3a3": "ced76f", + "5a9c39": "446b94", + "105241": "381601", + "2e5519": "011c38", + "83de7b": "80ced9", "107b6a": "d15d04", "20b49c": "fa8405", "fdfdfd": "fdfdfd" diff --git a/public/images/pokemon/variant/back/3-mega_2.png b/public/images/pokemon/variant/back/3-mega_2.png index 52f8ed7b580..90eeb6d84f2 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..77d6c7f12fa 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/3.json b/public/images/pokemon/variant/back/3.json index 616efac7d3c..0c179dd5e4a 100644 --- a/public/images/pokemon/variant/back/3.json +++ b/public/images/pokemon/variant/back/3.json @@ -1,6 +1,7 @@ { "1": { "843100": "033b22", + "830009": "23033b", "ffbdbd": "a266b0", "ff7b73": "712f8f", "debd29": "078a8f", @@ -11,6 +12,7 @@ "105242": "190038", "107b6b": "c21f7e", "5a9c3a": "b34952", + "2e5519": "38001c", "5ad6c5": "f062a4", "21b59c": "de3592", "84de7b": "ff745e", @@ -18,6 +20,7 @@ }, "2": { "843100": "420514", + "830009": "154205", "ffbdbd": "e7e385", "ff7b73": "9db042", "debd29": "a30a66", @@ -25,7 +28,8 @@ "de4242": "3c8227", "101010": "101010", "ffef52": "f75ea8", - "105242": "001a33", + "105242": "381601", + "2e5519": "011c38", "107b6b": "d15d04", "5a9c3a": "446b94", "5ad6c5": "faa405", 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/359-mega.json b/public/images/pokemon/variant/back/359-mega.json new file mode 100644 index 00000000000..d81d313a1de --- /dev/null +++ b/public/images/pokemon/variant/back/359-mega.json @@ -0,0 +1,24 @@ +{ + "1": { + "ffffff": "61a8ab", + "414a6a": "421e4a", + "b4b4d5": "458196", + "293939": "27122b", + "8b8bac": "3b6987", + "525a7b": "59274e", + "d5deee": "589aa6", + "737bac": "874267", + "626283": "2a3163" + }, + "2": { + "ffffff": "9e363b", + "414a6a": "b39279", + "b4b4d5": "752f40", + "293939": "996e5f", + "8b8bac": "59213b", + "525a7b": "dfd1ae", + "d5deee": "8f2f41", + "737bac": "f5f1cb", + "626283": "42122d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/359.json b/public/images/pokemon/variant/back/359.json new file mode 100644 index 00000000000..4ccca6800b3 --- /dev/null +++ b/public/images/pokemon/variant/back/359.json @@ -0,0 +1,24 @@ +{ + "1": { + "424a6b": "421e4a", + "293a3a": "27122b", + "737bad": "874267", + "d6deef": "589aa6", + "525a7b": "612b54", + "8c8cad": "3b6987", + "636384": "2a3163", + "b5b5d6": "458196", + "ffffff": "61a8ab" + }, + "2": { + "424a6b": "b39279", + "293a3a": "996e5f", + "737bad": "f5f1cb", + "d6deef": "8f2f41", + "525a7b": "e0c79f", + "8c8cad": "59213b", + "636384": "42122d", + "b5b5d6": "752f40", + "ffffff": "9e363b" + } +} \ No newline at end of file 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/377.json b/public/images/pokemon/variant/back/377.json new file mode 100644 index 00000000000..1ab9bce073f --- /dev/null +++ b/public/images/pokemon/variant/back/377.json @@ -0,0 +1,26 @@ +{ + "1": { + "b54200": "13512f", + "efad6b": "aac669", + "948c73": "2e4e7b", + "cec5ad": "4d8ba8", + "bd633a": "22773f", + "ef843a": "56963a", + "b5ad94": "3d6d8d", + "e6dead": "659db5", + "524a29": "182238", + "efe6de": "84c7ca" + }, + "2": { + "b54200": "3d0933", + "efad6b": "a54c5e", + "948c73": "262847", + "cec5ad": "303353", + "bd633a": "561934", + "ef843a": "722a41", + "b5ad94": "394170", + "e6dead": "383e6a", + "524a29": "161129", + "efe6de": "4d5784" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/378.json b/public/images/pokemon/variant/back/378.json new file mode 100644 index 00000000000..74ef70cbcec --- /dev/null +++ b/public/images/pokemon/variant/back/378.json @@ -0,0 +1,29 @@ +{ + "0": { + "ffffff": "d7b6f1", + "6bb5d6": "414184", + "293a7b": "101238", + "9cceff": "6f66a7", + "3a6b8c": "191d4c", + "bdefff": "9983c4", + "5a84ad": "282e64" + }, + "1": { + "6bb5d6": "bf344a", + "bdefff": "ffb88d", + "9cceff": "eb5d56", + "293a7b": "400b1c", + "ffffff": "fff7d3", + "3a6b8c": "64132c", + "5a84ad": "981d43" + }, + "2": { + "6bb5d6": "323232", + "bdefff": "5b5b5b", + "9cceff": "424242", + "293a7b": "100f17", + "ffffff": "8c8c8c", + "3a6b8c": "14131a", + "5a84ad": "212121" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/379.json b/public/images/pokemon/variant/back/379.json new file mode 100644 index 00000000000..e99b7d8c171 --- /dev/null +++ b/public/images/pokemon/variant/back/379.json @@ -0,0 +1,26 @@ +{ + "1": { + "4a5a5a": "34366f", + "3a4252": "292960", + "d6ced6": "cc9c65", + "848c84": "4c5c91", + "ffffff": "fff3aa", + "dedede": "f0d185", + "b5adad": "a66f52", + "4a4a4a": "533329", + "84847b": "80503b", + "3e4f4f": "542618" + }, + "2": { + "4a5a5a": "df8533", + "3a4252": "e29631", + "d6ced6": "cd5521", + "848c84": "ffcd49", + "ffffff": "ffb056", + "dedede": "e87537", + "b5adad": "ad2d1e", + "4a4a4a": "521328", + "84847b": "81222b", + "3e4f4f": "54051f" + } +} \ No newline at end of file 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/39.json b/public/images/pokemon/variant/back/39.json new file mode 100644 index 00000000000..59d78f7958a --- /dev/null +++ b/public/images/pokemon/variant/back/39.json @@ -0,0 +1,16 @@ +{ + "1": { + "6b5263": "153427", + "ffada5": "c5ebd5", + "e67384": "81c2b8", + "a51021": "3a6472", + "ffcec5": "e5ffec" + }, + "2": { + "6b5263": "737454", + "ffada5": "f5e884", + "e67384": "f5c45b", + "a51021": "9c5200", + "ffcec5": "fff9bf" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/390.json b/public/images/pokemon/variant/back/390.json new file mode 100644 index 00000000000..94bfe837547 --- /dev/null +++ b/public/images/pokemon/variant/back/390.json @@ -0,0 +1,32 @@ +{ + "1": { + "7a410f": "994943", + "e63131": "1db978", + "b56b29": "64464d", + "9c3131": "2d8766", + "947308": "a86256", + "7b4210": "382029", + "ef6b6b": "81dc3f", + "f06e6e": "76c96d", + "ffd631": "eafe67", + "ffe6ad": "edc6a4", + "e63a42": "5db95b", + "de8400": "876766", + "deb552": "cc9176" + }, + "2": { + "7a410f": "626678", + "e63131": "b5b0f3", + "b56b29": "293b69", + "9c3131": "422e6f", + "947308": "818596", + "7b4210": "171f46", + "ef6b6b": "cbcfff", + "f06e6e": "cb96e5", + "ffd631": "f3f8fe", + "ffe6ad": "d3d5e0", + "e63a42": "8457b0", + "de8400": "3e5f8a", + "deb552": "a5a9b8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/391.json b/public/images/pokemon/variant/back/391.json new file mode 100644 index 00000000000..6c21033ceba --- /dev/null +++ b/public/images/pokemon/variant/back/391.json @@ -0,0 +1,36 @@ +{ + "1": { + "8c7342": "a86256", + "cf451b": "2d8766", + "c59463": "cc9176", + "dee6e6": "dac99d", + "9c5219": "64464d", + "ffffff": "faf7d4", + "735a10": "6b2b28", + "efce94": "edc6a4", + "ffce42": "eafe67", + "ffcd45": "f69044", + "1052b5": "ba2342", + "6b3a08": "382029", + "d68c29": "876766", + "ce4219": "1db978", + "efa542": "cd5528" + }, + "2": { + "8c7342": "818596", + "cf451b": "8457b0", + "c59463": "a5a9b8", + "dee6e6": "dca15d", + "9c5219": "293b69", + "ffffff": "ffe175", + "735a10": "626678", + "efce94": "d3d5e0", + "ffce42": "f3f8fe", + "ffcd45": "e8fdff", + "1052b5": "e09f2f", + "6b3a08": "171f46", + "d68c29": "3e5f8a", + "ce4219": "b5b0f3", + "efa542": "b0cbd4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/392.json b/public/images/pokemon/variant/back/392.json new file mode 100644 index 00000000000..44c2930f77d --- /dev/null +++ b/public/images/pokemon/variant/back/392.json @@ -0,0 +1,42 @@ +{ + "1": { + "e68c5a": "876766", + "6b3a10": "382029", + "e63740": "2d8766", + "bdc5de": "dac99d", + "a56342": "64464d", + "845a08": "9b2719", + "737384": "9f8876", + "ffdf4f": "eafe67", + "e63a42": "1db978", + "c59c21": "cd5528", + "ffde52": "f69044", + "ffdd47": "e8a82a", + "c79e22": "cf8021", + "ffffff": "faf7d4", + "19427b": "581225", + "f78c4a": "81dc3f", + "3a73a5": "972733", + "842931": "174c48" + }, + "2": { + "e68c5a": "3e5f8a", + "6b3a10": "171f46", + "e63740": "8457b0", + "bdc5de": "dca15d", + "a56342": "293b69", + "845a08": "617995", + "737384": "a15a34", + "ffdf4f": "f3f8fe", + "e63a42": "b5b0f3", + "c59c21": "a0c0cd", + "ffde52": "e8fdff", + "ffdd47": "fff8e5", + "c79e22": "ccbdab", + "ffffff": "ffe175", + "19427b": "4d5196", + "f78c4a": "cbcfff", + "3a73a5": "9c96e2", + "842931": "422e6f" + } +} \ No newline at end of file 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/40.json b/public/images/pokemon/variant/back/40.json new file mode 100644 index 00000000000..21e5ef69cd1 --- /dev/null +++ b/public/images/pokemon/variant/back/40.json @@ -0,0 +1,17 @@ +{ + "1": { + "f77b94": "81c2b8", + "ce6b63": "82b8a9", + "8c4242": "3a6472", + "ffadbd": "c5ebd5" + }, + "2": { + "737373": "3b1f24", + "f77b94": "f5c45b", + "ffffff": "d07439", + "ce6b63": "e6a54c", + "e6dee6": "bc4e24", + "8c4242": "9c5200", + "ffadbd": "f5e884" + } +} \ No newline at end of file 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/430.json b/public/images/pokemon/variant/back/430.json new file mode 100644 index 00000000000..2edd26708c9 --- /dev/null +++ b/public/images/pokemon/variant/back/430.json @@ -0,0 +1,34 @@ +{ + "1": { + "31313a": "280113", + "8c313a": "b3986b", + "5a5a3a": "1e1e2c", + "545454": "3c3b4d", + "a3a3b5": "7a1e21", + "3a5a9c": "694c30", + "525151": "380514", + "a7a7b8": "60606c", + "efeff8": "b9382d", + "4a2121": "755237", + "ad943a": "3f3e50", + "f7de3a": "61616d", + "3a3a5a": "422e26", + "29213a": "271b1a" + }, + "2": { + "31313a": "080735", + "8c313a": "bc4b84", + "5a5a3a": "4e1915", + "545454": "85412d", + "a3a3b5": "4f358e", + "3a5a9c": "1d6e47", + "525151": "1c1754", + "a7a7b8": "c27238", + "efeff8": "975bc2", + "4a2121": "7b2363", + "ad943a": "85402c", + "f7de3a": "c2723a", + "3a3a5a": "0e4333", + "29213a": "091e16" + } +} \ No newline at end of file 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/455.json b/public/images/pokemon/variant/back/455.json new file mode 100644 index 00000000000..d10a2ff0741 --- /dev/null +++ b/public/images/pokemon/variant/back/455.json @@ -0,0 +1,34 @@ +{ + "1": { + "f7ce31": "7c5d53", + "9c214a": "451e14", + "2b453d": "523b3c", + "3a5a3a": "b34a82", + "5a6342": "826660", + "8c9452": "b89d8c", + "846b31": "301e20", + "bdc57b": "efd9ba", + "e62919": "775331", + "63843a": "e880ab", + "8f9653": "e2b0bc", + "29423a": "7e3b67", + "c59c31": "4d3432" + }, + "2": { + "f7ce31": "518078", + "ffffff": "affffe", + "9c214a": "1e4340", + "2b453d": "151926", + "3a5a3a": "37818a", + "5a6342": "2d304e", + "8c9452": "424d6e", + "846b31": "122e2f", + "bdc57b": "6679a1", + "e62919": "406b64", + "63843a": "74ddcd", + "422919": "0d2626", + "8f9653": "3d909b", + "29423a": "123247", + "c59c31": "244a45" + } +} \ No newline at end of file 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/486.json b/public/images/pokemon/variant/back/486.json new file mode 100644 index 00000000000..36a343a2966 --- /dev/null +++ b/public/images/pokemon/variant/back/486.json @@ -0,0 +1,32 @@ +{ + "1": { + "fafafa": "ffc245", + "adadc5": "ca7426", + "8c94ad": "13081a", + "374859": "6b76a4", + "d6ced6": "e89b34", + "f7d65a": "ce5129", + "5f6d7d": "7b2a19", + "ffffff": "eb8746", + "21846b": "90a7cd", + "3a4a5a": "5e1e33", + "c59c52": "a12612", + "7b6321": "3d021b", + "4aa563": "e2f2ff" + }, + "2": { + "fafafa": "88b06f", + "adadc5": "4f673a", + "8c94ad": "494922", + "374859": "2f1a18", + "d6ced6": "6e884b", + "f7d65a": "8f9b9e", + "5f6d7d": "374427", + "ffffff": "a8afaf", + "21846b": "492f29", + "3a4a5a": "3b1930", + "c59c52": "5d717a", + "7b6321": "384751", + "4aa563": "755648" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/501.json b/public/images/pokemon/variant/back/501.json new file mode 100644 index 00000000000..3476b2710b1 --- /dev/null +++ b/public/images/pokemon/variant/back/501.json @@ -0,0 +1,24 @@ +{ + "1": { + "215a63": "1e1a35", + "c5c5ce": "e3c2ca", + "4a6bad": "9660d1", + "294252": "241e44", + "21949c": "373049", + "29bdc5": "5d4a70", + "31426b": "4b349e", + "212142": "241e44" + }, + "2": { + "8c8c9c": "8f7491", + "4a4a4a": "715b72", + "215a63": "000000", + "c5c5ce": "ba9bc1", + "4a6bad": "589787", + "21949c": "321e1e", + "29bdc5": "5e3e38", + "31426b": "3c706b", + "ffffff": "f5e9f4", + "212142": "104432" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/502.json b/public/images/pokemon/variant/back/502.json new file mode 100644 index 00000000000..26772013df7 --- /dev/null +++ b/public/images/pokemon/variant/back/502.json @@ -0,0 +1,28 @@ +{ + "1": { + "4a4a4a": "20193d", + "31528c": "9d5bc9", + "293a6b": "503e8e", + "7b5a10": "d877cd", + "52bdbd": "624060", + "c59429": "ff9ef3", + "efd68c": "f2d5ee", + "313131": "120f33", + "315a73": "1e1624", + "218c94": "39273d", + "fffdfd": "ebb9c4" + }, + "2": { + "4a4a4a": "2c3940", + "31528c": "5e3e38", + "293a6b": "321e1e", + "7b5a10": "0d5656", + "52bdbd": "8b7566", + "c59429": "488383", + "efd68c": "63c7bd", + "313131": "1f2b36", + "315a73": "483026", + "218c94": "684f44", + "fffdfd": "ffffc2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/503.json b/public/images/pokemon/variant/back/503.json new file mode 100644 index 00000000000..9eb2168dd5b --- /dev/null +++ b/public/images/pokemon/variant/back/503.json @@ -0,0 +1,33 @@ +{ + "1": { + "84a5a5": "563785", + "4a4a4a": "5e283e", + "215a9c": "4d244b", + "8aa3a3": "a05982", + "d65263": "b73891", + "ad945a": "db87d1", + "7b6342": "975fad", + "474a46": "2b1838", + "fffeff": "ebb9c4", + "213a63": "28142c", + "4a4a4c": "6b3e51", + "d6c57b": "f2d5ee", + "5a7373": "332a59", + "8da8a8": "a58b90" + }, + "2": { + "4a4a4a": "c2700d", + "215a9c": "5e3e38", + "8aa3a3": "efa838", + "d65263": "41857b", + "ad945a": "488383", + "7b6342": "0d5656", + "474a46": "462d27", + "fffeff": "f9df58", + "213a63": "321e1e", + "4a4a4c": "c2700d", + "d6c57b": "63c7bd", + "5a7373": "2a5c57", + "8da8a8": "84a5a5" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/527.json b/public/images/pokemon/variant/back/527.json new file mode 100644 index 00000000000..67767eefcb3 --- /dev/null +++ b/public/images/pokemon/variant/back/527.json @@ -0,0 +1,20 @@ +{ + "1": { + "424a5a": "866ca1", + "6b94ad": "6e315e", + "73adc5": "853e66", + "292931": "55457a", + "addef7": "914a6e", + "4a6b7b": "562259", + "27272f": "361538" + }, + "2": { + "424a5a": "bf3f75", + "6b94ad": "db843d", + "73adc5": "e8b04f", + "292931": "8c2961", + "addef7": "f7e05c", + "4a6b7b": "994d22", + "27272f": "7c3622" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/528.json b/public/images/pokemon/variant/back/528.json new file mode 100644 index 00000000000..fb91d0318a5 --- /dev/null +++ b/public/images/pokemon/variant/back/528.json @@ -0,0 +1,30 @@ +{ + "1": { + "317b94": "6e315e", + "4c4c54": "582253", + "313131": "55457a", + "de8c84": "6bc7e8", + "6b7b84": "439ca1", + "ceefff": "a6ffd7", + "bdbdce": "76debd", + "19a5ce": "914a6e", + "944a4a": "4874b8", + "313132": "451b41", + "4a4a52": "866ca1", + "47474f": "2e6f7a" + }, + "2": { + "317b94": "e0b49a", + "4c4c54": "a6705e", + "313131": "701c4c", + "de8c84": "7b5ebf", + "6b7b84": "994d22", + "ceefff": "f7e05c", + "bdbdce": "db843d", + "19a5ce": "f9fae3", + "944a4a": "393582", + "313132": "a87354", + "4a4a52": "bf3f75", + "47474f": "6b2314" + } +} \ No newline at end of file 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/587.json b/public/images/pokemon/variant/back/587.json new file mode 100644 index 00000000000..85c4c20f4f0 --- /dev/null +++ b/public/images/pokemon/variant/back/587.json @@ -0,0 +1,28 @@ +{ + "1": { + "212121": "1d352a", + "d6a531": "a84223", + "b58c08": "681c0e", + "bda573": "5a9fbf", + "6b5a31": "16223d", + "cec5ad": "8bd5dc", + "7f6b0d": "3b1c1b", + "846e07": "35708c", + "ffd600": "d55b19", + "9c9c73": "406da4", + "313131": "2b5d3f" + }, + "2": { + "212121": "372a5b", + "d6a531": "6597cd", + "b58c08": "4879af", + "bda573": "9b4072", + "6b5a31": "321832", + "cec5ad": "c4658e", + "7f6b0d": "355c90", + "846e07": "723158", + "ffd600": "8bcaee", + "9c9c73": "7b3760", + "313131": "5e3a86" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/588.json b/public/images/pokemon/variant/back/588.json new file mode 100644 index 00000000000..c00f1886940 --- /dev/null +++ b/public/images/pokemon/variant/back/588.json @@ -0,0 +1,20 @@ +{ + "1": { + "213a5a": "2f185b", + "316bff": "8150a7", + "4a4a4a": "64242d", + "313131": "38131d", + "000000": "ffffff", + "528cff": "c682d6", + "3a5284": "492c72" + }, + "2": { + "213a5a": "44446f", + "316bff": "d2cdeb", + "4a4a4a": "28334f", + "313131": "182138", + "000000": "ffffff", + "528cff": "f9f3ff", + "3a5284": "7777a7" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/589.json b/public/images/pokemon/variant/back/589.json new file mode 100644 index 00000000000..b499504daa3 --- /dev/null +++ b/public/images/pokemon/variant/back/589.json @@ -0,0 +1,30 @@ +{ + "1": { + "c5c5c5": "f9c347", + "ef2952": "eb8343", + "bd2152": "c44126", + "840808": "931119", + "bd9c19": "b8c5e5", + "e65a10": "614593", + "6b6b6b": "b34516", + "294a84": "7436a4", + "195abd": "9448bf", + "94949c": "dc862d", + "000000": "ffffff", + "3a424a": "69130d" + }, + "2": { + "c5c5c5": "6e8e99", + "ef2952": "f7efff", + "bd2152": "beb7df", + "840808": "72709e", + "bd9c19": "a42641", + "e65a10": "ffe8c3", + "6b6b6b": "293a52", + "294a84": "4f3d33", + "195abd": "785442", + "94949c": "3f6372", + "000000": "ffffff", + "3a424a": "1b253d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/590.json b/public/images/pokemon/variant/back/590.json new file mode 100644 index 00000000000..7d19153ec2c --- /dev/null +++ b/public/images/pokemon/variant/back/590.json @@ -0,0 +1,30 @@ +{ + "1": { + "684c30": "0d9999", + "9c3a3a": "71de8c", + "846b63": "0fad9a", + "9c3a7b": "88af70", + "6b4a31": "0d9999", + "422929": "0a5870", + "7b3131": "49ad77", + "de5a52": "e6ffc1", + "d6639c": "f4ebba", + "7a3730": "49aa87", + "c5b59c": "47d1b5", + "fff7e6": "afecc6" + }, + "2": { + "684c30": "2b5caf", + "9c3a3a": "e098cd", + "846b63": "64a3bc", + "9c3a7b": "b1c4dd", + "6b4a31": "f2f7f9", + "422929": "b9d9e5", + "7b3131": "ad629a", + "de5a52": "ffbfcb", + "d6639c": "f2f7f9", + "7a3730": "404f6b", + "c5b59c": "498cd3", + "fff7e6": "6ac2e2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/591.json b/public/images/pokemon/variant/back/591.json new file mode 100644 index 00000000000..0d369a42c02 --- /dev/null +++ b/public/images/pokemon/variant/back/591.json @@ -0,0 +1,28 @@ +{ + "1": { + "cec5c5": "afecc6", + "291919": "094164", + "de528c": "e6ffc1", + "634c42": "348999", + "423331": "094164", + "9c9484": "47d1b5", + "634d42": "0c7588", + "634a42": "0d9999", + "423131": "0a5870", + "6b314a": "49ad77", + "ad3163": "71de8c" + }, + "2": { + "cec5c5": "6ac2e2", + "291919": "5e718e", + "de528c": "ffbfcb", + "634c42": "3f7dc7", + "423331": "223656", + "9c9484": "56a1e2", + "634d42": "2b5caf", + "634a42": "f2f7f9", + "423131": "9bb6c1", + "6b314a": "ad629a", + "ad3163": "e098cd" + } +} \ No newline at end of file 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/616.json b/public/images/pokemon/variant/back/616.json new file mode 100644 index 00000000000..a883b42edc8 --- /dev/null +++ b/public/images/pokemon/variant/back/616.json @@ -0,0 +1,26 @@ +{ + "1": { + "3a8442": "4e3671", + "5a5a7b": "b34516", + "9494ad": "dc862d", + "630021": "204b4f", + "b5214a": "346c65", + "ff4a7b": "6ba779", + "de3163": "4a8474", + "29315a": "69130d", + "c5c5d6": "f9c347", + "000000": "ffffff" + }, + "2": { + "3a8442": "d6aa53", + "5a5a7b": "293a52", + "9494ad": "3f6372", + "630021": "2e3469", + "b5214a": "4f62a4", + "ff4a7b": "8cb0d6", + "de3163": "6b8bbf", + "29315a": "1b253d", + "c5c5d6": "6e8e99", + "000000": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/617.json b/public/images/pokemon/variant/back/617.json new file mode 100644 index 00000000000..93310065d35 --- /dev/null +++ b/public/images/pokemon/variant/back/617.json @@ -0,0 +1,30 @@ +{ + "1": { + "ffffff": "fff47e", + "a5846b": "5a6675", + "42b55a": "4e3671", + "c53a6b": "427b6b", + "636363": "c46d31", + "bdbdce": "df9847", + "527b42": "362658", + "732931": "214c49", + "ff4a7b": "6ba779", + "6b84c5": "eef5ff", + "293a6b": "69719e", + "000000": "ffffff", + "3a2919": "192638", + "5a6384": "b8c5e5" + }, + "2": { + "a5846b": "637974", + "42b55a": "415c69", + "c53a6b": "dcaa47", + "527b42": "2d3d52", + "ff4a7b": "ffee72", + "6b84c5": "b43d40", + "293a6b": "461b2e", + "000000": "ffffff", + "3a2919": "2a2235", + "5a6384": "7b2c3d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618.json b/public/images/pokemon/variant/back/618.json new file mode 100644 index 00000000000..d4db4967946 --- /dev/null +++ b/public/images/pokemon/variant/back/618.json @@ -0,0 +1,40 @@ +{ + "1": { + "cebd00": "bdac99", + "ffff00": "f3e6dd", + "6b6319": "987b6d", + "081019": "081019", + "52423a": "312118", + "6b524a": "4a342a", + "bd846b": "8c3841", + "846b63": "6b3838", + "d69c84": "ad4c4c", + "efce42": "eac2bd", + "d6cec5": "d6cec5", + "ffffff": "ffffff", + "081018": "081018", + "735a52": "564038", + "735a53": "564038", + "9c8473": "a08773", + "bda59c": "e6dbd6" + }, + "2": { + "cebd00": "58536b", + "ffff00": "707488", + "6b6319": "39314a", + "081019": "081019", + "52423a": "5a2e2e", + "6b524a": "804e48", + "bd846b": "cec9b1", + "846b63": "9c7765", + "d69c84": "f0ead6", + "efce42": "9fadb9", + "d6cec5": "4c8c4c", + "ffffff": "79a962", + "081018": "204a29", + "735a52": "885011", + "735a53": "735555", + "9c8473": "c18a2c", + "bda59c": "efc44b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_2.json b/public/images/pokemon/variant/back/618_2.json deleted file mode 100644 index d82c52e26e2..00000000000 --- a/public/images/pokemon/variant/back/618_2.json +++ /dev/null @@ -1,2750 +0,0 @@ -{ - "textures": [ - { - "image": "618_2.png", - "format": "RGBA8888", - "size": { - "w": 221, - "h": 221 - }, - "scale": 1, - "frames": [ - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ed241f9d4e0679b62ab26da17057d65:739de537da7171a9caf5769b4458f68f:22e585907b89e90c4fc3ab2512d175fd$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_2.png b/public/images/pokemon/variant/back/618_2.png deleted file mode 100644 index e74c6db3f04..00000000000 Binary files a/public/images/pokemon/variant/back/618_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/618_3.json b/public/images/pokemon/variant/back/618_3.json deleted file mode 100644 index 17c49c5e59b..00000000000 --- a/public/images/pokemon/variant/back/618_3.json +++ /dev/null @@ -1,2750 +0,0 @@ -{ - "textures": [ - { - "image": "618_3.png", - "format": "RGBA8888", - "size": { - "w": 221, - "h": 221 - }, - "scale": 1, - "frames": [ - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ed241f9d4e0679b62ab26da17057d65:739de537da7171a9caf5769b4458f68f:22e585907b89e90c4fc3ab2512d175fd$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_3.png b/public/images/pokemon/variant/back/618_3.png deleted file mode 100644 index aaba24cfc58..00000000000 Binary files a/public/images/pokemon/variant/back/618_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/621.json b/public/images/pokemon/variant/back/621.json new file mode 100644 index 00000000000..cf80562d31f --- /dev/null +++ b/public/images/pokemon/variant/back/621.json @@ -0,0 +1,26 @@ +{ + "1": { + "8c7b5a": "73654b", + "940042": "1a2248", + "104a8c": "7e231b", + "635231": "605127", + "efc500": "5c7886", + "103163": "601111", + "521031": "0f1330", + "d60042": "26335d", + "316bad": "a13b2c", + "d65273": "be5b5e" + }, + "2": { + "8c7b5a": "da8921", + "940042": "177297", + "104a8c": "c9bb9a", + "635231": "be6e18", + "efc500": "ffd437", + "103163": "a0896b", + "521031": "0f4973", + "d60042": "24aec0", + "316bad": "e3ddbd", + "d65273": "c583a5" + } +} \ No newline at end of file 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/6503.json b/public/images/pokemon/variant/back/6503.json new file mode 100644 index 00000000000..455b06a69d6 --- /dev/null +++ b/public/images/pokemon/variant/back/6503.json @@ -0,0 +1,38 @@ +{ + "1": { + "282f62": "f7d9de", + "84a5a5": "563785", + "a82c47": "d45b9e", + "8aa3a3": "d3a0bb", + "faf9f9": "f6f4f4", + "494a48": "3d2439", + "1d3962": "28142c", + "474a46": "2b1838", + "d75063": "b73891", + "fbfcfa": "fafcf9", + "324149": "363442", + "1e224e": "dc95ae", + "6b1c34": "8f3396", + "181531": "a26579", + "5a7373": "332a59", + "8da8a8": "a58b90", + "1e5b9b": "4d244b" + }, + "2": { + "282f62": "efdfee", + "84a5a5": "41857b", + "a82c47": "8abfb1", + "8aa3a3": "232d2e", + "faf9f9": "2c3940", + "494a48": "181f20", + "1d3962": "321e1e", + "474a46": "181f20", + "d75063": "8f65d8", + "fbfcfa": "fcfdfc", + "1e224e": "ba9bc1", + "6b1c34": "6d9d9a", + "181531": "715b72", + "5a7373": "2a5c57", + "1e5b9b": "5e3e38" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/656.json b/public/images/pokemon/variant/back/656.json new file mode 100644 index 00000000000..f41398f3154 --- /dev/null +++ b/public/images/pokemon/variant/back/656.json @@ -0,0 +1,24 @@ +{ + "1": { + "848496": "4d7dc5", + "7bcdff": "9c75c2", + "62ace6": "8363af", + "ffffff": "b1e5ff", + "396a83": "362864", + "9c9cc5": "5385c7", + "cdcde6": "7eb7e8", + "174592": "37408c", + "5a94cd": "7054a4" + }, + "2": { + "848496": "cc6845", + "7bcdff": "dd6155", + "62ace6": "c44848", + "ffffff": "fff4bd", + "396a83": "5c0d33", + "9c9cc5": "c96a48", + "cdcde6": "f7b785", + "174592": "198158", + "5a94cd": "a92f3f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/657.json b/public/images/pokemon/variant/back/657.json new file mode 100644 index 00000000000..083a9dba0a6 --- /dev/null +++ b/public/images/pokemon/variant/back/657.json @@ -0,0 +1,24 @@ +{ + "1": { + "f8f8f8": "8dcfff", + "737373": "0f3f82", + "0b566a": "281f52", + "002c58": "1c0726", + "bfbfbf": "4386df", + "006ba6": "4e1852", + "0b4a7a": "340f3d", + "41ccf5": "7755a7", + "2896b5": "4b3578" + }, + "2": { + "f8f8f8": "fff6c7", + "737373": "df6a50", + "0b566a": "7e1628", + "002c58": "0c3b54", + "bfbfbf": "ffc996", + "006ba6": "239c91", + "0b4a7a": "156f78", + "41ccf5": "dd7355", + "2896b5": "a92f3a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/658-ash.json b/public/images/pokemon/variant/back/658-ash.json new file mode 100644 index 00000000000..370d5df8081 --- /dev/null +++ b/public/images/pokemon/variant/back/658-ash.json @@ -0,0 +1,38 @@ +{ + "1": { + "265595": "432b6c", + "de3431": "3fca9f", + "f8f8f8": "a1e9f0", + "7b282e": "0e3e81", + "6b1d1d": "206d74", + "134e52": "062e3c", + "bfb169": "165e78", + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "282c35": "271f4c", + "f2798d": "8dcfff", + "268794": "1c3e58", + "3e7acc": "6b4592", + "7ddeff": "7ddcd6", + "4ebdd9": "41a7b0", + "18335c": "170738" + }, + "2": { + "265595": "cc7251", + "de3431": "9ceec6", + "f8f8f8": "89d2b8", + "7b282e": "152a5c", + "6b1d1d": "356e8d", + "134e52": "0d1e3e", + "bfb169": "4d2637", + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "282c35": "4d2637", + "f2798d": "5eb4a9", + "268794": "1c3e58", + "3e7acc": "ecbb7a", + "7ddeff": "46988d", + "4ebdd9": "2f6e74", + "18335c": "9f2727" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/658.json b/public/images/pokemon/variant/back/658.json new file mode 100644 index 00000000000..c1bb4222ce4 --- /dev/null +++ b/public/images/pokemon/variant/back/658.json @@ -0,0 +1,26 @@ +{ + "1": { + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "3d61cc": "6b4592", + "fff0a6": "208698", + "2e4999": "432b6c", + "f2798d": "8dcfff", + "803340": "0e3e81", + "1b2a59": "170738", + "66d9ff": "7ddcd6", + "bfb169": "165e78" + }, + "2": { + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "3d61cc": "ecbb7a", + "fff0a6": "652240", + "2e4999": "cc7251", + "f2798d": "5eb4a9", + "803340": "152a5c", + "1b2a59": "9f2727", + "66d9ff": "48968c", + "bfb169": "431022" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy.json b/public/images/pokemon/variant/back/666-fancy.json new file mode 100644 index 00000000000..5d368667ae3 --- /dev/null +++ b/public/images/pokemon/variant/back/666-fancy.json @@ -0,0 +1,36 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "d9edd4", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "ffeaff", + "f2d4e3": "f2d4e3", + "ead2e3": "ffeaff" + }, + "2": { + "101010": "101010", + "303030": "00771b", + "675220": "b9c05a", + "504a4a": "b9c05a", + "595959": "6f9f42", + "707068": "6f9f42", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "e3e982", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "fcf1ff", + "f2d4e3": "f2d4e3", + "ead2e3": "fcf1ff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy_2.json b/public/images/pokemon/variant/back/666-fancy_2.json deleted file mode 100644 index 49478186fd7..00000000000 --- a/public/images/pokemon/variant/back/666-fancy_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_2.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c0935d72f3dd919dfad1f00ce1550c3c:4c9a4c435b13a6c8dbd3fa6eacd260d8:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy_2.png b/public/images/pokemon/variant/back/666-fancy_2.png deleted file mode 100644 index d51a6403f3b..00000000000 Binary files a/public/images/pokemon/variant/back/666-fancy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/666-fancy_3.json b/public/images/pokemon/variant/back/666-fancy_3.json deleted file mode 100644 index f060b4b02c6..00000000000 --- a/public/images/pokemon/variant/back/666-fancy_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c0935d72f3dd919dfad1f00ce1550c3c:4c9a4c435b13a6c8dbd3fa6eacd260d8:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-fancy_3.png b/public/images/pokemon/variant/back/666-fancy_3.png deleted file mode 100644 index aeca21cbeb5..00000000000 Binary files a/public/images/pokemon/variant/back/666-fancy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/666-high-plains.json b/public/images/pokemon/variant/back/666-high-plains.json index acd62e863c1..6ee5c78e6ca 100644 --- a/public/images/pokemon/variant/back/666-high-plains.json +++ b/public/images/pokemon/variant/back/666-high-plains.json @@ -13,7 +13,8 @@ "504a4a": "7f6991", "c3c3c3": "c3c3c3", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" }, "2": { "101010": "101010", @@ -29,6 +30,7 @@ "504a4a": "c97034", "c3c3c3": "edc67c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-monsoon.json b/public/images/pokemon/variant/back/666-monsoon.json index afb60e0f5ae..915d471b2b1 100644 --- a/public/images/pokemon/variant/back/666-monsoon.json +++ b/public/images/pokemon/variant/back/666-monsoon.json @@ -1,34 +1,33 @@ { - "1": { - "101010": "101010", - "595959": "724b7a", - "f0f0f8": "f0f0f8", - "303030": "402746", - "ceab62": "d9edd4", - "675220": "958c8a", + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "707068": "a97cbc", + "ceab62": "d9edd4", "5676de": "5676de", - "4eccd6": "4eccd6", - "504a4a": "7f6991", - "c3c3c3": "c3c3c3" - }, - "2": { - "101010": "101010", - "595959": "656565", - "f0f0f8": "f0f0f8", - "303030": "4f4645", - "ceab62": "5857bc", - "675220": "2c3593", - "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "707068": "5857bc", - "5676de": "5676de", - "4eccd6": "4eccd6", - "504a4a": "2c3593", - "c3c3c3": "b8f9f9" - } + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-ocean.json b/public/images/pokemon/variant/back/666-ocean.json index 51a99de1ea8..8b62b4a8072 100644 --- a/public/images/pokemon/variant/back/666-ocean.json +++ b/public/images/pokemon/variant/back/666-ocean.json @@ -21,7 +21,7 @@ "e1384d": "e1384d", "f4ad61": "f4ad61", "f8ef6a": "f8ef6a", - "303030": "b56208", + "303030": "b54908", "ceb362": "ea8742", "675220": "bc601c", "ebcf3f": "ebcf3f", diff --git a/public/images/pokemon/variant/back/666-river.json b/public/images/pokemon/variant/back/666-river.json index b3b9671ee75..c7e5e288d05 100644 --- a/public/images/pokemon/variant/back/666-river.json +++ b/public/images/pokemon/variant/back/666-river.json @@ -1,18 +1,40 @@ { - "2": { - "101010": "101010", - "595959": "8a5702", - "ceab62": "d9a666", - "625841": "625841", - "303030": "7b2800", - "bc813f": "bc813f", - "9c9143": "9c9143", - "675220": "ae7f41", - "707068": "d9a666", - "504a4a": "ae7f41", - "c3c3c3": "e3c384", - "279ec2": "279ec2", - "59c9d3": "59c9d3", - "1d726a": "1d726a" - } + "1": { + "101010": "101010", + "303030": "402746", + "4a412c": "4a412c", + "675220": "958c8a", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "7f6991", + "595959": "724b7a", + "625841": "625841", + "707068": "a97cbc", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "c3c3c3", + "d2a862": "d9edd4" + }, + "2": { + "101010": "101010", + "303030": "7b2800", + "4a412c": "4a412c", + "675220": "ae7f41", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "ae7f41", + "595959": "8a5702", + "625841": "625841", + "707068": "d9a666", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "e3c384", + "d2a862": "d2a862" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-river_2.json b/public/images/pokemon/variant/back/666-river_2.json deleted file mode 100644 index 710513e4626..00000000000 --- a/public/images/pokemon/variant/back/666-river_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "666-river_2.png", - "format": "RGBA8888", - "size": { - "w": 67, - "h": 67 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 67, - "h": 67 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c5c96b8025cde94330c424121707d6d1:0eb4b25134091aa2435bee846468e099:fa23dc87fc53ba2cfa532cf440553cf5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/666-river_2.png b/public/images/pokemon/variant/back/666-river_2.png deleted file mode 100644 index 06c1b09d749..00000000000 Binary files a/public/images/pokemon/variant/back/666-river_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/676-dandy.json b/public/images/pokemon/variant/back/676-dandy.json new file mode 100644 index 00000000000..f73bd90f690 --- /dev/null +++ b/public/images/pokemon/variant/back/676-dandy.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "9c9f94": "42090e", + "30552b": "423839", + "b8bcaf": "5e0f16", + "508a3c": "aa9999", + "f1f2ee": "8a1d1d", + "816e64": "a6afb3", + "6eb92b": "eddddd", + "4b4b46": "2b040f" + }, + "2": { + "594d46": "9c7aca", + "376277": "314173", + "fe3c31": "8362b4", + "9c9f94": "ad76bc", + "30552b": "6a102e", + "b8bcaf": "ce9ede", + "508a3c": "ac254b", + "f1f2ee": "e6c3f8", + "a83c31": "473085", + "816e64": "ae95dc", + "6eb92b": "e44a62", + "4b4b46": "6b3f77" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-debutante.json b/public/images/pokemon/variant/back/676-debutante.json new file mode 100644 index 00000000000..cad1f7792f0 --- /dev/null +++ b/public/images/pokemon/variant/back/676-debutante.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "9c9f94": "42090e", + "dfb76a": "aa9999", + "4b4b46": "2b040f", + "bcc0b3": "5e0f16", + "816e64": "a6afb3", + "ac6d40": "423839", + "f8f9f7": "8a1d1d", + "fbf588": "eddddd" + }, + "2": { + "594d46": "48a7d0", + "376277": "717171", + "fe3c31": "762ea8", + "9c9f94": "0b374f", + "dfb76a": "c6a65c", + "4b4b46": "021a2f", + "bcc0b3": "0b4b68", + "a83c31": "521073", + "816e64": "74ccec", + "ac6d40": "684d24", + "f8f9f7": "0e728e", + "fbf588": "ffe998" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-diamond.json b/public/images/pokemon/variant/back/676-diamond.json new file mode 100644 index 00000000000..35876619287 --- /dev/null +++ b/public/images/pokemon/variant/back/676-diamond.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "aa3e2b": "423839", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "376277": "4f8fe3", + "645e55": "2b040f", + "d95b37": "aa9999", + "e68a4d": "eddddd", + "453434": "313439", + "816e64": "a6afb3", + "9c9f94": "42090e" + }, + "2": { + "594d46": "bd9462", + "aa3e2b": "642c0a", + "b8bcaf": "319c6a", + "f1f2ee": "6abd81", + "376277": "c56e34", + "fe3c31": "b37e47", + "645e55": "10573c", + "d95b37": "935927", + "e68a4d": "b37e47", + "453434": "6c4b2d", + "a83c31": "642c0a", + "816e64": "eed59c", + "9c9f94": "288c66" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-heart.json b/public/images/pokemon/variant/back/676-heart.json new file mode 100644 index 00000000000..abb8ed1a9b3 --- /dev/null +++ b/public/images/pokemon/variant/back/676-heart.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "f18598": "48474c", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "e0546c": "2a2a2f", + "376277": "4f8fe3", + "645e55": "2b040f", + "453434": "313439", + "816e64": "a6afb3", + "a73f4f": "19181f", + "9c9f94": "42090e" + }, + "2": { + "594d46": "aca49c", + "f18598": "5f5953", + "b8bcaf": "bfc7e8", + "f1f2ee": "e4eafc", + "e0546c": "4c413c", + "376277": "1b1c21", + "fe3c31": "9475de", + "645e55": "7a81b7", + "453434": "837373", + "a83c31": "7249b7", + "816e64": "dadace", + "a73f4f": "2c2320", + "9c9f94": "9fa7c8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-kabuki.json b/public/images/pokemon/variant/back/676-kabuki.json new file mode 100644 index 00000000000..54e87ca19b2 --- /dev/null +++ b/public/images/pokemon/variant/back/676-kabuki.json @@ -0,0 +1,36 @@ +{ + "1": { + "811d1d": "240b12", + "8f2121": "19181f", + "b01a1a": "17161c", + "d02f2e": "2a2a2f", + "594d46": "a6afb3", + "f66559": "fe3c31", + "f44b3d": "313439", + "376277": "436ca1", + "8a7d79": "788087", + "68675c": "2b040f", + "9c9f94": "42090e", + "534343": "360513", + "bcc0b3": "5e0f16", + "f1f2ee": "8a1d1d", + "b32524": "a83c31" + }, + "2": { + "811d1d": "181a38", + "8f2121": "191b38", + "b01a1a": "48578e", + "d02f2e": "305d9e", + "594d46": "3e5368", + "f66559": "9890ec", + "f44b3d": "4c89d9", + "376277": "436ca1", + "8a7d79": "233342", + "68675c": "1b1d39", + "9c9f94": "468197", + "534343": "192b42", + "bcc0b3": "549ab8", + "f1f2ee": "6bcfd9", + "b32524": "8067c6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-la-reine.json b/public/images/pokemon/variant/back/676-la-reine.json new file mode 100644 index 00000000000..a464639a025 --- /dev/null +++ b/public/images/pokemon/variant/back/676-la-reine.json @@ -0,0 +1,28 @@ +{ + "1": { + "8a7d79": "788087", + "376277": "4f8fe3", + "31a7bb": "aa9999", + "594d46": "a6afb3", + "4b4b46": "2b040f", + "9c9f94": "42090e", + "56d1d8": "eddddd", + "bcc0b3": "5e0f16", + "2f7387": "423839", + "f1f2ee": "8a1d1d" + }, + "2": { + "a83c31": "3041b7", + "8a7d79": "a11e24", + "376277": "221755", + "31a7bb": "e3b876", + "594d46": "973721", + "4b4b46": "550b0c", + "9c9f94": "c63b31", + "56d1d8": "ffec9b", + "bcc0b3": "d9533c", + "2f7387": "8e673e", + "f1f2ee": "ee724b", + "fe3c31": "4b77e1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-matron.json b/public/images/pokemon/variant/back/676-matron.json new file mode 100644 index 00000000000..70a32e09a19 --- /dev/null +++ b/public/images/pokemon/variant/back/676-matron.json @@ -0,0 +1,29 @@ +{ + "1": { + "873a5b": "19181f", + "376277": "4f8fe3", + "9c9f94": "42090e", + "594d46": "788087", + "b8bcaf": "5e0f16", + "5f5951": "2b040f", + "121212": "101010", + "b95b83": "2a2a2f", + "816e64": "a6afb3", + "f8f9f7": "8a1d1d", + "d07da9": "313439" + }, + "2": { + "873a5b": "1b447b", + "376277": "2246aa", + "fe3c31": "64edf3", + "9c9f94": "bd4d6a", + "594d46": "d0b5b5", + "b8bcaf": "d95e7e", + "5f5951": "8a2843", + "b95b83": "528fcc", + "816e64": "e3d6d6", + "a83c31": "45a6d0", + "f8f9f7": "fa8c9f", + "d07da9": "64c8f3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-pharaoh.json b/public/images/pokemon/variant/back/676-pharaoh.json new file mode 100644 index 00000000000..fa9c60533b6 --- /dev/null +++ b/public/images/pokemon/variant/back/676-pharaoh.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "9c9f94": "42090e", + "bcc0b3": "5e0f16", + "25559c": "2a2a2f", + "484640": "2b040f", + "217fc4": "313439", + "68675c": "2b040f", + "816e64": "42090e", + "243a6f": "19181f", + "f1f2ee": "8a1d1d" + }, + "2": { + "594d46": "22172f", + "376277": "5e0808", + "fe3c31": "ec4d3e", + "9c9f94": "332b42", + "bcc0b3": "3b3955", + "25559c": "d0902d", + "484640": "17122f", + "217fc4": "eed552", + "68675c": "17122f", + "a83c31": "a11717", + "816e64": "332b42", + "243a6f": "a15317", + "f1f2ee": "5a5a71" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-star.json b/public/images/pokemon/variant/back/676-star.json new file mode 100644 index 00000000000..f6bdec0ca9e --- /dev/null +++ b/public/images/pokemon/variant/back/676-star.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "3a5078": "19181f", + "376277": "4f8fe3", + "645e55": "2b040f", + "3e8ebf": "2a2a2f", + "9c9f94": "42090e", + "453434": "48474c", + "816e64": "a6afb3", + "7dc2e8": "313439" + }, + "2": { + "594d46": "d7bc4d", + "b8bcaf": "d6dec2", + "f1f2ee": "fcfef5", + "3a5078": "613d11", + "376277": "647bb1", + "fe3c31": "b5e0f3", + "645e55": "848e75", + "3e8ebf": "ac802f", + "9c9f94": "c3cdab", + "453434": "836329", + "a83c31": "6192aa", + "816e64": "f7e784", + "7dc2e8": "cdac4a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676.json b/public/images/pokemon/variant/back/676.json new file mode 100644 index 00000000000..9a8ab0f7aa3 --- /dev/null +++ b/public/images/pokemon/variant/back/676.json @@ -0,0 +1,23 @@ +{ + "1": { + "bcbca8": "5e0f16", + "606056": "2b040f", + "8e8e7b": "42090e", + "f2f2da": "8a1d1d", + "3f6273": "2b040f", + "736b67": "a6afb3", + "494340": "788087", + "3f6274": "4f8fe3" + }, + "2": { + "bcbca8": "a4624a", + "cc2929": "3a240e", + "606056": "4a281b", + "8e8e7b": "805145", + "f2f2da": "c18960", + "3f6273": "4a281b", + "736b67": "ffe6ac", + "494340": "e6c594", + "3f6274": "4a2e23" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/682.json b/public/images/pokemon/variant/back/682.json new file mode 100644 index 00000000000..5b3a6821f1f --- /dev/null +++ b/public/images/pokemon/variant/back/682.json @@ -0,0 +1,20 @@ +{ + "1": { + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "7f4d59": "20644e" + }, + "2": { + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "7f4d59": "a23812", + "a6a6a6": "503851", + "737373": "422f46", + "4d4d4d": "332539", + "e5e5e5": "6b4767" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/683.json b/public/images/pokemon/variant/back/683.json new file mode 100644 index 00000000000..9d7f4682b9a --- /dev/null +++ b/public/images/pokemon/variant/back/683.json @@ -0,0 +1,20 @@ +{ + "1": { + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "404040": "2c283b", + "7f4d59": "20644e", + "bf5f9f": "7c48a1" + }, + "2": { + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "404040": "2a2234", + "7f4d59": "a23812", + "bf5f9f": "f0ebdd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/684.json b/public/images/pokemon/variant/back/684.json new file mode 100644 index 00000000000..18afd91b4a2 --- /dev/null +++ b/public/images/pokemon/variant/back/684.json @@ -0,0 +1,18 @@ +{ + "1": { + "805963": "3c195b", + "7b5760": "8f1d15", + "cc99a6": "814db1", + "ffccd9": "8961c6", + "fff2f2": "f39f62", + "ccadad": "e6774a" + }, + "2": { + "805963": "679baa", + "7b5760": "3c2f51", + "cc99a6": "93d6ce", + "ffccd9": "cbf6da", + "fff2f2": "746998", + "ccadad": "4b4876" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/685.json b/public/images/pokemon/variant/back/685.json new file mode 100644 index 00000000000..87b0bad9422 --- /dev/null +++ b/public/images/pokemon/variant/back/685.json @@ -0,0 +1,28 @@ +{ + "1": { + "f8f8f8": "caff90", + "661a2d": "13391c", + "805963": "2d0c42", + "7b5760": "b13924", + "ffccd9": "8961c6", + "ff8ca9": "8dbe6d", + "cc99a6": "613b84", + "e53964": "689b52", + "fff2f2": "f39f62", + "ccadad": "df6b40", + "a62949": "26592b" + }, + "2": { + "f8f8f8": "e4819d", + "661a2d": "26061b", + "805963": "679baa", + "7b5760": "3c2f51", + "ffccd9": "cbf6da", + "ff8ca9": "8c4264", + "cc99a6": "93d6ce", + "e53964": "612747", + "fff2f2": "746998", + "ccadad": "4b4876", + "a62949": "441838" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/688.json b/public/images/pokemon/variant/back/688.json new file mode 100644 index 00000000000..ac388cd384e --- /dev/null +++ b/public/images/pokemon/variant/back/688.json @@ -0,0 +1,30 @@ +{ + "1": { + "b7653f": "459aac", + "385860": "70240f", + "6b503b": "373295", + "372e27": "220a56", + "c0e0e8": "e8d37b", + "8a6d45": "4557b5", + "808080": "7c582e", + "5890b0": "a9582e", + "fcffff": "e8e5c6", + "d0d0d0": "d3bc8c", + "88c0c8": "cd8a50", + "ef8955": "70cccf" + }, + "2": { + "b7653f": "332149", + "385860": "2c052a", + "6b503b": "ba9fba", + "372e27": "1e1324", + "c0e0e8": "a74083", + "8a6d45": "f6eefc", + "808080": "4d6a09", + "5890b0": "4b0038", + "fcffff": "d1ec8c", + "d0d0d0": "94c268", + "88c0c8": "731f5c", + "ef8955": "4a376e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/689.json b/public/images/pokemon/variant/back/689.json new file mode 100644 index 00000000000..6c47b57f35b --- /dev/null +++ b/public/images/pokemon/variant/back/689.json @@ -0,0 +1,31 @@ +{ + "1": { + "cc7f70": "459aac", + "f2f2f2": "e8e5c6", + "5b8da6": "8d5030", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "672e1e", + "b3b3b3": "d3bc8c", + "bfeaff": "e8d37b", + "85b4cc": "cd8a50", + "ff9f8c": "70cccf", + "66541f": "373295", + "997e2e": "4557b5" + }, + "2": { + "cc7f70": "332149", + "f2f2f2": "caea77", + "5b8da6": "4b0038", + "595959": "2a5524", + "403410": "3f2a4b", + "3f6273": "3e073b", + "b3b3b3": "7eac4e", + "bfeaff": "a74083", + "85b4cc": "731f5c", + "f8f8f8": "dbaf67", + "ff9f8c": "4a376e", + "66541f": "ccb6cc", + "997e2e": "f6eefc" + } +} \ No newline at end of file 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.json b/public/images/pokemon/variant/back/715.json new file mode 100644 index 00000000000..7ca4d81e5dc --- /dev/null +++ b/public/images/pokemon/variant/back/715.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "287366": "731338", + "3aa694": "a42c54", + "404040": "542f98", + "343434": "3e107b", + "252525": "260447", + "4cd9c1": "d04b6c", + "595959": "7a5ccc", + "6a3f73": "0f103c", + "737373": "563d8f", + "801a1a": "801a1a", + "8e5499": "202558", + "bd70cc": "2f386b", + "bfbfbf": "ab83dd", + "e52e2e": "e52e2e", + "f8f8f8": "d5bdec" + }, + "2": { + "101010": "101010", + "287366": "832714", + "3aa694": "b8552c", + "404040": "b18373", + "343434": "906152", + "252525": "6c3f39", + "4cd9c1": "dd834c", + "595959": "e2c7b5", + "6a3f73": "3b0c18", + "737373": "280911", + "801a1a": "801a1a", + "8e5499": "5b1922", + "bd70cc": "7c2928", + "bfbfbf": "43191e", + "e52e2e": "e52e2e", + "f8f8f8": "5a2a2b" + } +} \ No newline at end of file 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/807.json b/public/images/pokemon/variant/back/807.json new file mode 100644 index 00000000000..4471a1b5b50 --- /dev/null +++ b/public/images/pokemon/variant/back/807.json @@ -0,0 +1,28 @@ +{ + "1": { + "484f57": "243058", + "5bd0f2": "ebceff", + "2759a5": "736599", + "727678": "3f5277", + "daa936": "5c96b4", + "ef8a4e": "517bb5", + "f9e455": "80c7d7", + "9d682d": "3d648c", + "000000": "ffffff", + "2394d8": "b298d8", + "31343e": "14193f" + }, + "2": { + "484f57": "cba3ca", + "5bd0f2": "df7298", + "2759a5": "a3378a", + "727678": "e7c9e2", + "daa936": "351d53", + "ef8a4e": "844c94", + "f9e455": "58326f", + "9d682d": "1f1144", + "000000": "ffffff", + "2394d8": "be5293", + "31343e": "a880b0" + } +} \ No newline at end of file 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.json b/public/images/pokemon/variant/back/881.json new file mode 100644 index 00000000000..3efad4efe60 --- /dev/null +++ b/public/images/pokemon/variant/back/881.json @@ -0,0 +1,42 @@ +{ + "1": { + "e39e1e": "9c1430", + "975e17": "5b0610", + "ffff84": "ee8563", + "ead900": "c6362b", + "101010": "101010", + "2abbfc": "ceb16f", + "09354d": "271014", + "9ab8ba": "cea5b9", + "edf3f2": "faebc8", + "5c7996": "a57185", + "07305f": "4d254a", + "085d94": "714363", + "0981ae": "45242e", + "27aed6": "6e4145", + "072241": "301636", + "097da8": "43222c", + "0a3463": "492146", + "23abd3": "b59795" + }, + "2": { + "e39e1e": "35365e", + "975e17": "211b3d", + "ffff84": "dceeeb", + "ead900": "636287", + "101010": "101010", + "2abbfc": "26c248", + "09354d": "09354d", + "9ab8ba": "a3c465", + "edf3f2": "fcffe4", + "5c7996": "50a751", + "07305f": "7b1a5e", + "085d94": "ad3b6c", + "0981ae": "205e5d", + "27aed6": "2d7b65", + "072241": "5d0e54", + "097da8": "185453", + "0a3463": "721957", + "23abd3": "d49da9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/881_2.json b/public/images/pokemon/variant/back/881_2.json deleted file mode 100644 index 568946ee9f9..00000000000 --- a/public/images/pokemon/variant/back/881_2.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "881_2.png", - "format": "RGBA8888", - "size": { - "w": 80, - "h": 80 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 80 - }, - "frame": { - "x": 0, - "y": 0, - "w": 66, - "h": 80 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:08f9e60b28adb0f1c25487a3423af005:e78d63b8a44825ae516935d669e48f61:1f7350865753535cbb572c579820f817$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/881_2.png b/public/images/pokemon/variant/back/881_2.png deleted file mode 100644 index 76176d7d5fe..00000000000 Binary files a/public/images/pokemon/variant/back/881_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/881_3.json b/public/images/pokemon/variant/back/881_3.json deleted file mode 100644 index b9101d9b13f..00000000000 --- a/public/images/pokemon/variant/back/881_3.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "881_3.png", - "format": "RGBA8888", - "size": { - "w": 80, - "h": 80 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 66, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 66, - "h": 80 - }, - "frame": { - "x": 0, - "y": 0, - "w": 66, - "h": 80 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:08f9e60b28adb0f1c25487a3423af005:e78d63b8a44825ae516935d669e48f61:1f7350865753535cbb572c579820f817$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/881_3.png b/public/images/pokemon/variant/back/881_3.png deleted file mode 100644 index c255e83cc16..00000000000 Binary files a/public/images/pokemon/variant/back/881_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/894.json b/public/images/pokemon/variant/back/894.json new file mode 100644 index 00000000000..d213b87dcf4 --- /dev/null +++ b/public/images/pokemon/variant/back/894.json @@ -0,0 +1,24 @@ +{ + "1": { + "e5ee1a": "6ad7f3", + "7d542a": "2769aa", + "bc8b2f": "124b78", + "fefac7": "dffff6", + "2e3967": "357b84", + "8eacdd": "caffd1", + "375395": "5fcaad", + "4e7cc9": "9bf1c4", + "d7ad0d": "45a3d6" + }, + "2": { + "e5ee1a": "d4ffd0", + "7d542a": "429877", + "bc8b2f": "2a6f5d", + "fefac7": "ffffff", + "2e3967": "514199", + "8eacdd": "c693d8", + "375395": "815bad", + "4e7cc9": "b67cd6", + "d7ad0d": "7cd395" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/895.json b/public/images/pokemon/variant/back/895.json new file mode 100644 index 00000000000..d9a7f49ae44 --- /dev/null +++ b/public/images/pokemon/variant/back/895.json @@ -0,0 +1,26 @@ +{ + "1": { + "641e2c": "722123", + "b63650": "bc623e", + "608d99": "fae5bf", + "2b3d40": "754f47", + "4b6f78": "f1d4b6", + "e05276": "ef8429", + "f27a99": "efb55a", + "3f545f": "ad8473", + "872c3c": "93372d", + "242e35": "512c25" + }, + "2": { + "641e2c": "15553b", + "b63650": "3bb349", + "608d99": "9b7ebc", + "2b3d40": "241951", + "4b6f78": "5a4382", + "e05276": "8aea41", + "f27a99": "dfff75", + "3f545f": "3a2a67", + "872c3c": "227843", + "242e35": "0f0c1e" + } +} \ No newline at end of file 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/944.json b/public/images/pokemon/variant/back/944.json new file mode 100644 index 00000000000..6f41f91c4d6 --- /dev/null +++ b/public/images/pokemon/variant/back/944.json @@ -0,0 +1,44 @@ +{ + "1": { + "b5eab2": "75a0d0", + "d4eac7": "8bcfe5", + "bdb2bd": "53a164", + "ceceb7": "3ec295", + "726766": "4f985c", + "4a4860": "372869", + "8ce1b2": "6383c4", + "564a49": "286943", + "000000": "ffffff", + "4ca391": "3a4a8a", + "97859b": "3f8d59", + "a571e6": "ffe269", + "774d9b": "d09139", + "efeee1": "88eeab", + "afc6d8": "8056a7", + "c9e1f4": "b782cd", + "918772": "1c9b8d", + "869fad": "5e4090", + "3a2b2f": "18493f" + }, + "2": { + "b5eab2": "a9c6dc", + "d4eac7": "e2f8ff", + "bdb2bd": "78b0c2", + "ceceb7": "abc1df", + "726766": "5386b9", + "4a4860": "4f133f", + "8ce1b2": "8397c4", + "564a49": "2c4f8a", + "000000": "ffffff", + "4ca391": "6974ad", + "97859b": "5582a4", + "a571e6": "4c5372", + "774d9b": "2c2c46", + "efeee1": "e2f3ff", + "afc6d8": "c23f4f", + "c9e1f4": "f98381", + "918772": "6777aa", + "869fad": "902a4b", + "3a2b2f": "1e3072" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/945.json b/public/images/pokemon/variant/back/945.json new file mode 100644 index 00000000000..500e68e3812 --- /dev/null +++ b/public/images/pokemon/variant/back/945.json @@ -0,0 +1,38 @@ +{ + "1": { + "403f4f": "357747", + "1f2635": "1c193d", + "dcdcc3": "5ddcb2", + "d6d3ca": "499833", + "e0ebf1": "7ddfee", + "e6e2e1": "fffbf3", + "8d2151": "4676aa", + "4f483f": "1b727b", + "323d4a": "2e2452", + "000000": "ffffff", + "d73875": "68adca", + "aebec7": "62b0d0", + "38bdda": "494e64", + "282434": "14463f", + "aca699": "2db3a4", + "a4988b": "16613d", + "4b616b": "473869" + }, + "2": { + "403f4f": "3b6b9e", + "1f2635": "3b091c", + "dcdcc3": "edf0f1", + "e6e2e1": "ebf4f9", + "8d2151": "4676aa", + "4f483f": "5d7487", + "323d4a": "580f1d", + "000000": "ffffff", + "a599a8": "bf888f", + "d73875": "68adca", + "7c6a84": "965b6f", + "38bdda": "494e64", + "282434": "2d427e", + "aca699": "acbfc7", + "4b616b": "8a2029" + } +} \ No newline at end of file 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/987.json b/public/images/pokemon/variant/back/987.json index 1773ba70c36..e28a34d5435 100644 --- a/public/images/pokemon/variant/back/987.json +++ b/public/images/pokemon/variant/back/987.json @@ -9,7 +9,7 @@ "de62a4": "ffc668", "4a83a4": "387fa7", "314a62": "244260", - "70bbb4": "f8d371", + "548e88": "2d60bb", "a4295a": "cc762f" }, "1": { @@ -22,7 +22,7 @@ "de62a4": "ffdf90", "4a83a4": "a1c8db", "314a62": "7396b4", - "70bbb4": "70bbb4", + "548e88": "a9c0c6", "a4295a": "e28c27" }, "2": { @@ -35,7 +35,7 @@ "de62a4": "e25038", "4a83a4": "e6aa47", "314a62": "b56f2a", - "70bbb4": "f8d371", + "548e88": "e0b544", "a4295a": "a62a21" } } \ No newline at end of file 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/154.json b/public/images/pokemon/variant/back/female/154.json new file mode 100644 index 00000000000..d7463ebee9d --- /dev/null +++ b/public/images/pokemon/variant/back/female/154.json @@ -0,0 +1,26 @@ +{ + "1": { + "634a00": "6da0df", + "ff3a5a": "234d81", + "e6ad00": "90c6f8", + "ce213a": "192e5e", + "63bd42": "9d86d9", + "f7a59c": "78d38b", + "7b103a": "111c44", + "107b31": "8057b2", + "ffde21": "b9e2ff", + "9ce652": "b7afee" + }, + "2": { + "634a00": "144627", + "ff3a5a": "9ed662", + "e6ad00": "1e632b", + "ce213a": "81c65c", + "63bd42": "a31f60", + "f7a59c": "ddf2b5", + "7b103a": "59ac45", + "107b31": "761858", + "ffde21": "288028", + "9ce652": "cd3b6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/194.json b/public/images/pokemon/variant/back/female/194.json new file mode 100644 index 00000000000..db649381d14 --- /dev/null +++ b/public/images/pokemon/variant/back/female/194.json @@ -0,0 +1,20 @@ +{ + "1": { + "529ce6": "e8983d", + "9463a5": "2ea380", + "633a6b": "09484f", + "3a7bc5": "d5682e", + "73bdff": "ffc355", + "d65ad6": "44d77f", + "104a84": "7a150a" + }, + "2": { + "529ce6": "564daa", + "9463a5": "aeccdf", + "633a6b": "444c7e", + "3a7bc5": "3f377e", + "73bdff": "5c66c4", + "d65ad6": "e8faff", + "104a84": "180d42" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/195.json b/public/images/pokemon/variant/back/female/195.json new file mode 100644 index 00000000000..a097ea3eac4 --- /dev/null +++ b/public/images/pokemon/variant/back/female/195.json @@ -0,0 +1,24 @@ +{ + "1": { + "ade6ff": "f6dfa8", + "84d6f7": "ed9e4f", + "637ba5": "816251", + "639cbd": "dc6a4d", + "3194a5": "44d77f", + "6b5a8c": "1b5a55", + "425284": "b03844", + "426b84": "b8453b", + "195a6b": "2ea380" + }, + "2": { + "ade6ff": "9864c2", + "84d6f7": "724ba7", + "637ba5": "504a8a", + "639cbd": "493a8d", + "3194a5": "ebf5ff", + "6b5a8c": "5e649b", + "425284": "240830", + "195a6b": "aebbdf", + "19423a": "747aae" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/198.json b/public/images/pokemon/variant/back/female/198.json new file mode 100644 index 00000000000..eed8404265c --- /dev/null +++ b/public/images/pokemon/variant/back/female/198.json @@ -0,0 +1,26 @@ +{ + "1": { + "d94352": "8c1b23", + "314263": "462b20", + "efd684": "a6a6b3", + "d64252": "b3986b", + "42639c": "694c30", + "5a4a21": "25253b", + "292942": "2a1512", + "b59c21": "57566f", + "73293a": "755237", + "d6bd52": "838098" + }, + "2": { + "d94352": "8c1b23", + "314263": "0e4333", + "efd684": "c2723a", + "d64252": "bc4b84", + "42639c": "1d6e47", + "5a4a21": "4e1915", + "292942": "091e16", + "b59c21": "85412d", + "73293a": "7b2363", + "d6bd52": "9a5524" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/212.json b/public/images/pokemon/variant/back/female/212.json new file mode 100644 index 00000000000..84f12bf1434 --- /dev/null +++ b/public/images/pokemon/variant/back/female/212.json @@ -0,0 +1,41 @@ +{ + "0": { + "632929": "215a2d", + "f76b6b": "8cce73", + "a52929": "2f794e", + "101010": "101010", + "d63a3a": "4a9c53", + "9494a5": "9494a5", + "ffffff": "ffffff", + "b5b5ce": "b5b5ce", + "3a3a4a": "3a3a4a", + "9c6b21": "9c6b21", + "dec510": "dec510" + }, + "1": { + "632929": "2f2962", + "f76b6b": "639cf7", + "a52929": "29429c", + "101010": "101010", + "d63a3a": "4263ef", + "9494a5": "6262a4", + "ffffff": "ffffff", + "b5b5ce": "b5b5ce", + "3a3a4a": "3c3c50", + "9c6b21": "131387", + "dec510": "10bdde" + }, + "2": { + "632929": "645117", + "f76b6b": "c59f29", + "a52929": "b88619", + "101010": "101010", + "d63a3a": "ffca2a", + "9494a5": "3c4543", + "ffffff": "ffffff", + "b5b5ce": "b5b5ce", + "3a3a4a": "282d2c", + "9c6b21": "9c6b21", + "dec510": "dec510" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-beauty-cosplay.json b/public/images/pokemon/variant/back/female/25-beauty-cosplay.json new file mode 100644 index 00000000000..34a087f71cd --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-beauty-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "f7cc2f": "d5ac44", + "9c5200": "315c75", + "f7e860": "eddc78", + "cecab9": "b84084", + "2d276d": "454a61", + "4d88c4": "e4f6f1", + "39509d": "9ec4cd", + "fffdea": "ea82a6", + "f7e652": "a3d1a8", + "f7bd21": "79b5a5", + "5e5e6b": "8a2554" + }, + "2": { + "4f454c": "f1b571", + "f7cc2f": "d5ac44", + "fffabf": "f5efd1", + "9c5200": "283361", + "f7e860": "eddc78", + "965b0e": "96500e", + "cecab9": "b84084", + "2d276d": "454a61", + "4d88c4": "e4f6f1", + "39509d": "9ec4cd", + "fffdea": "ea82a6", + "1e1526": "a45233", + "f7e652": "577b98", + "f7bd21": "486689", + "5e5e6b": "8a2554" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-cool-cosplay.json b/public/images/pokemon/variant/back/female/25-cool-cosplay.json new file mode 100644 index 00000000000..278feb070bd --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-cool-cosplay.json @@ -0,0 +1,31 @@ +{ + "1": { + "171717": "2a1d36", + "c52119": "ad4e76", + "842222": "7b1f18", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "ba2b23": "b73850", + "9c5200": "1c4f75", + "d95b45": "cf6887", + "3b3b40": "4a3e46" + }, + "2": { + "171717": "a45233", + "656f86": "cf752b", + "a5b0b6": "f0b541", + "c52119": "ebc67c", + "842222": "1e1e43", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "ba2b23": "2c2c47", + "55555e": "8f4b32", + "9c5200": "22325c", + "f4f7ab": "eadbb3", + "d95b45": "3a3f5e", + "3b3b40": "f1b571", + "272b2b": "7d3833" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-cosplay.json b/public/images/pokemon/variant/back/female/25-cosplay.json new file mode 100644 index 00000000000..c574d63d743 --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-cosplay.json @@ -0,0 +1,26 @@ +{ + "1": { + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "f7bd21": "79b5a5", + "52525a": "4f454c", + "9c5200": "315c75", + "292929": "1e1526", + "633108": "09406b", + "e65a42": "cf6182", + "de9400": "338087" + }, + "2": { + "f7e652": "577b98", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "f7bd21": "445f8a", + "52525a": "f1b571", + "9c5200": "23345e", + "292929": "a45233", + "633108": "22244f", + "e65a42": "eedd9c", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-cute-cosplay.json b/public/images/pokemon/variant/back/female/25-cute-cosplay.json new file mode 100644 index 00000000000..7b26b79d08f --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-cute-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "752bd0": "5452b7", + "baa998": "bab699", + "fff7a5": "c4e3c3", + "f7e652": "a3d1a8", + "ea82a6": "e8848e", + "cf4770": "cf4a59", + "f3bace": "f2bbbb", + "853247": "85323c", + "f7ef97": "f0eaa8", + "52525a": "4f454c", + "292929": "30263b", + "f7bd21": "79b5a5", + "9c5200": "255e8a" + }, + "2": { + "752bd0": "7751c2", + "baa998": "d3ab5a", + "fff7a5": "7b96aa", + "f7e652": "577b98", + "ea82a6": "a4b95f", + "cf4770": "739b55", + "f3bace": "c5cc85", + "853247": "254b30", + "f7ef97": "ebe7b7", + "52525a": "f1b571", + "292929": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-partner.json b/public/images/pokemon/variant/back/female/25-partner.json new file mode 100644 index 00000000000..affebee3c8b --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-partner.json @@ -0,0 +1,26 @@ +{ + "1": { + "9c5200": "315c75", + "171717": "1e1526", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "f7e652": "a3d1a8", + "c52119": "ad4e76", + "e65a42": "cf6182", + "633108": "09406b", + "45454a": "4f454c", + "de9400": "338087" + }, + "2": { + "9c5200": "23345e", + "171717": "a45233", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "f7e652": "577b98", + "c52119": "ebc67c", + "e65a42": "eedd9c", + "633108": "22244f", + "45454a": "f1b571", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-smart-cosplay.json b/public/images/pokemon/variant/back/female/25-smart-cosplay.json new file mode 100644 index 00000000000..50749b31d8b --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-smart-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "fffdea": "f8ffe3", + "b7a599": "bab699", + "60b553": "76a848", + "f7e652": "a3d1a8", + "366635": "3e5b2f", + "95635b": "91685f", + "171717": "1e1526", + "5f3434": "573b38", + "54545c": "55555e", + "52525a": "4f454c", + "292929": "272b2b", + "f7bd21": "79b5a5", + "9c5200": "315c75" + }, + "2": { + "fffdea": "f2f0df", + "b7a599": "a7b6b9", + "60b553": "dfb053", + "f7e652": "577b98", + "366635": "ab5130", + "95635b": "a09ea3", + "171717": "a45233", + "5f3434": "666060", + "54545c": "45525c", + "52525a": "f1b571", + "292929": "202937", + "f7bd21": "445f8a", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-tough-cosplay.json b/public/images/pokemon/variant/back/female/25-tough-cosplay.json new file mode 100644 index 00000000000..49c50d17ad2 --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-tough-cosplay.json @@ -0,0 +1,35 @@ +{ + "1": { + "e37511": "d1694f", + "bf2629": "cf6a59", + "8d2b1d": "bf3638", + "c52119": "ad4e76", + "46464d": "2b3340", + "292929": "1e1526", + "f7bd21": "79b5a5", + "fbab33": "de9764", + "e65a42": "cf6182", + "cecab9": "cfc8aa", + "52525a": "4f454c", + "f7e652": "a3d1a8", + "9c5200": "315c75" + }, + "2": { + "e37511": "60448d", + "bf2629": "826694", + "f8ffe3": "e8e3e4", + "8d2b1d": "3d3f7d", + "c52119": "ebc67c", + "46464d": "2b3340", + "292929": "a45233", + "f7bd21": "445f8a", + "fbab33": "845ea1", + "e65a42": "eedd9c", + "cecab9": "beb1b4", + "8e2525": "242866", + "52525a": "f1b571", + "f7e652": "577b98", + "272b2b": "162231", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25.json b/public/images/pokemon/variant/back/female/25.json new file mode 100644 index 00000000000..affebee3c8b --- /dev/null +++ b/public/images/pokemon/variant/back/female/25.json @@ -0,0 +1,26 @@ +{ + "1": { + "9c5200": "315c75", + "171717": "1e1526", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "f7e652": "a3d1a8", + "c52119": "ad4e76", + "e65a42": "cf6182", + "633108": "09406b", + "45454a": "4f454c", + "de9400": "338087" + }, + "2": { + "9c5200": "23345e", + "171717": "a45233", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "f7e652": "577b98", + "c52119": "ebc67c", + "e65a42": "eedd9c", + "633108": "22244f", + "45454a": "f1b571", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/26.json b/public/images/pokemon/variant/back/female/26.json new file mode 100644 index 00000000000..6a29870fc8b --- /dev/null +++ b/public/images/pokemon/variant/back/female/26.json @@ -0,0 +1,33 @@ +{ + "1": { + "63636b": "4f454c", + "944242": "395a80", + "bd5a31": "386d82", + "e6bd84": "a4bda7", + "ffbd00": "b3596b", + "5a2929": "293059", + "3a3a42": "30263b", + "8c6310": "8c3c4c", + "ffde5a": "cf7878", + "f7ad29": "76a68b", + "734231": "6e2f33", + "ffefd6": "c8d4ba", + "de7b31": "539190" + }, + "2": { + "101010": "000000", + "542127": "905331", + "944242": "2d3b80", + "bd5a31": "375681", + "e6bd84": "a6b5ab", + "ffbd00": "f3cf91", + "5a2929": "202a60", + "8c6310": "c79b5a", + "ffde5a": "f2e4b6", + "f7ad29": "6385ab", + "734231": "bf8445", + "ffefd6": "cfc4b5", + "de7b31": "4d6f98", + "643034": "2e4685" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/3.json b/public/images/pokemon/variant/back/female/3.json index 567479d58d0..49fe726b084 100644 --- a/public/images/pokemon/variant/back/female/3.json +++ b/public/images/pokemon/variant/back/female/3.json @@ -1,6 +1,7 @@ { "1": { "843100": "033b22", + "830009": "23033b", "ffbdbd": "a266b0", "ffef52": "37d6de", "debd29": "078a8f", @@ -10,6 +11,7 @@ "101010": "101010", "105242": "190038", "107b6b": "9e1976", + "2e5519": "38001c", "5a9c3a": "b34952", "5ad6c5": "f062a4", "21b59c": "de3592", @@ -18,6 +20,7 @@ }, "2": { "843100": "420514", + "830009": "154205", "ffbdbd": "e7e385", "ffef52": "f75ea8", "debd29": "a30a66", @@ -27,6 +30,7 @@ "101010": "101010", "105242": "381601", "107b6b": "d15d04", + "2e5519": "011c38", "5a9c3a": "446b94", "5ad6c5": "faa405", "21b59c": "fa8405", 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/2026.json b/public/images/pokemon/variant/exp/2026.json new file mode 100644 index 00000000000..287b16fb52b --- /dev/null +++ b/public/images/pokemon/variant/exp/2026.json @@ -0,0 +1,34 @@ +{ + "1": { + "ecd8b7": "b4c2a5", + "646124": "492652", + "602c24": "162f4b", + "fef652": "eb999a", + "846b5b": "467f85", + "1a73cc": "b85346", + "9c5430": "1d3a57", + "174680": "2b1307", + "fef443": "c48081", + "b45f25": "2d5261", + "fffdfb": "d6d9ca", + "e9be14": "945c7b", + "e3882d": "3d7375", + "965821": "2f4e6b", + "552720": "142c48" + }, + "2": { + "ecd8b7": "5a6f90", + "646124": "122140", + "fef652": "faee9e", + "846b5b": "202746", + "1a73cc": "c26400", + "174680": "2b0606", + "fef443": "3a5873", + "b45f25": "bd8551", + "fffdfb": "6d8297", + "e9be14": "1a3551", + "e3882d": "d3b06f", + "965821": "9cb3ca", + "552720": "43617f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/2103.json b/public/images/pokemon/variant/exp/2103.json new file mode 100644 index 00000000000..2e97727835a --- /dev/null +++ b/public/images/pokemon/variant/exp/2103.json @@ -0,0 +1,28 @@ +{ + "1": { + "2f9934": "dea44c", + "9f6b41": "426378", + "70442e": "283f5b", + "e6ac5a": "869fdc", + "522f16": "131d33", + "9cbd4a": "9977dd", + "fff68b": "a3c4ed", + "36cc36": "f4e774", + "2d5826": "c8592a", + "7b5210": "373e85", + "ffffcd": "d3efff" + }, + "2": { + "2f9934": "3d324b", + "9f6b41": "ffdbe7", + "70442e": "d59cba", + "e6ac5a": "c84e7f", + "522f16": "925b81", + "9cbd4a": "824a96", + "fff68b": "eb748d", + "36cc36": "6a5b73", + "2d5826": "1f1a31", + "7b5210": "4e1044", + "ffffcd": "ffa29d" + } +} \ No newline at end of file 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/248-mega.json b/public/images/pokemon/variant/exp/248-mega.json index f6a6d5bf7ed..0a46ac40a4a 100644 --- a/public/images/pokemon/variant/exp/248-mega.json +++ b/public/images/pokemon/variant/exp/248-mega.json @@ -1,32 +1,34 @@ { "1": { - "4a5a39": "533334", - "dee6cd": "dbb1b5", - "101010": "101010", - "accd9c": "c78482", - "ffffff": "ffffff", - "c5c5c5": "c5c5c5", - "739c62": "915957", - "d55200": "006fbe", - "942900": "004194", - "ee5229": "0098fc", - "bd3920": "006fbe", - "737373": "737373", - "6a2000": "004194" +"4a5a39": "533334", +"821610": "004194", +"942900": "004194", +"d0243b": "006fb3", +"d55200": "0098fc", +"ff3e40": "0098fc", +"f24159": "088a72", +"f55e72": "18b8a0", +"ff6668": "1cd9ff", +"739c62": "915957", +"ff8385": "00e0fc", +"ffa3a4": "00ffc8", +"accd9c": "c78482", +"dee6cd": "dbb1b5" }, "2": { - "4a5a39": "06092f", - "dee6cd": "7068b2", - "101010": "101010", - "accd9c": "625695", - "ffffff": "ffffff", - "c5c5c5": "c5c5c5", - "739c62": "2c3071", - "d55200": "ffa904", - "942900": "ee7b06", - "ee5229": "ffef76", - "bd3920": "ffa904", - "737373": "737373", - "6a2000": "ee7b06" +"4a5a39": "06092f", +"821610": "ee7b06", +"942900": "ee7b06", +"d0243b": "ffa904", +"d55200": "ffa904", +"ff3e40": "ffef76", +"f24159": "ffbf44", +"f55e72": "ffd380", +"ff6668": "fef3a1", +"739c62": "2c3071", +"ff8385": "fff8c1", +"ffa3a4": "fffbdd", +"accd9c": "625695", +"dee6cd": "7068b2" } } \ No newline at end of file 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/359-mega.json b/public/images/pokemon/variant/exp/359-mega.json new file mode 100644 index 00000000000..084ba24477b --- /dev/null +++ b/public/images/pokemon/variant/exp/359-mega.json @@ -0,0 +1,34 @@ +{ + "1": { + "ffffff": "61a8ab", + "253334": "27122b", + "253333": "2b3266", + "273636": "101f30", + "7b2931": "c9824b", + "414a6a": "421e4a", + "b4b4d5": "458196", + "cd2920": "f7c26d", + "293939": "27122b", + "525a7b": "59274e", + "d5deee": "589aa6", + "737bac": "874267", + "8b8bac": "3b6987", + "626283": "2a3163" + }, + "2": { + "ffffff": "9e363b", + "253334": "996e5f", + "253333": "420b26", + "273636": "420918", + "7b2931": "0f4391", + "414a6a": "b39279", + "b4b4d5": "752f40", + "cd2920": "2a96ce", + "293939": "996e5f", + "525a7b": "e0c79f", + "d5deee": "8f2f41", + "737bac": "f5f1cb", + "8b8bac": "59213b", + "626283": "42122d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/362-mega.json b/public/images/pokemon/variant/exp/362-mega.json index 27f5d6f5afc..3b6e39436e6 100644 --- a/public/images/pokemon/variant/exp/362-mega.json +++ b/public/images/pokemon/variant/exp/362-mega.json @@ -1,38 +1,35 @@ -{ - "1": { - "000000": "000000", +{"1": { + "010101": "000000", "2b74a8": "84073c", - "a4deff": "ffd287", - "7b7b83": "151a57", - "62bdee": "fd9b44", - "58585f": "0d1146", - "faf9fb": "ff937b", + "bbeeff": "f9383e", "393941": "0d1146", + "7dbbee": "b7113a", + "fefefe": "ff937b", "e6e6f6": "a2b7e5", "7b7b94": "151a57", "c5cde6": "6076c6", "acaccd": "2f3c84", - "52526a": "0d1146", + "2983bd": "d54f14", + "62bdee": "fd9b44", "a82f37": "f9ff3d", - "324c67": "460025", - "ffffff": "ff937b" + "afe3f8": "ffd287", + "20315e": "460025" }, "2": { - "000000": "010101", + "010101": "010101", "2b74a8": "0c4b3a", - "a4deff": "f2ff87", - "7b7b83": "4a282a", - "62bdee": "c0ee46", - "58585f": "221315", - "faf9fb": "c8ff9c", + "bbeeff": "5ce11a", "393941": "221315", + "7dbbee": "009325", + "fefefe": "c8ff9c", "e6e6f6": "9b6146", "7b7b94": "4a282a", "c5cde6": "7e4a3f", "acaccd": "613735", - "52526a": "221315", + "2983bd": "6bb61a", + "62bdee": "c0ee46", "a82f37": "ff36b3", - "324c67": "0a2a2e", - "ffffff": "c8ff9c" + "afe3f8": "f2ff87", + "20315e": "0a2a2e" } } \ No newline at end of file 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/6503.json b/public/images/pokemon/variant/exp/6503.json new file mode 100644 index 00000000000..62c6cb628b2 --- /dev/null +++ b/public/images/pokemon/variant/exp/6503.json @@ -0,0 +1,37 @@ +{ + "1": { + "282f62": "f7d9de", + "c4c5cf": "e3c2ca", + "84a4a7": "563785", + "a82c47": "d45b9e", + "8aa3a3": "6b415b", + "8da8a8": "a58b90", + "1d3962": "28142c", + "d75063": "b73891", + "d9cacd": "f7d9de", + "808280": "020501", + "1e224e": "dc95ae", + "1e5b9b": "4d244b", + "181531": "a26579", + "6b1c34": "8f3396", + "597471": "332a59", + "494a48": "3d2439" + }, + "2": { + "282f62": "efdfee", + "c4c5cf": "232d2e", + "84a4a7": "41857b", + "a82c47": "8abfb1", + "8aa3a3": "181f20", + "faf9f9": "2c3940", + "8da8a8": "bdbdbd", + "1d3962": "321e1e", + "d75063": "8f65d8", + "1e224e": "ba9bc1", + "1e5b9b": "5e3e38", + "181531": "715b72", + "6b1c34": "6d9d9a", + "597471": "2a5c57", + "494a48": "0b0f18" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/653.json b/public/images/pokemon/variant/exp/653.json index aa8c032d4e3..be967d6c9c2 100644 --- a/public/images/pokemon/variant/exp/653.json +++ b/public/images/pokemon/variant/exp/653.json @@ -1,28 +1,28 @@ { "1": { - "796934": "9f398a", - "fee772": "e190c3", "101010": "101010", - "cfb458": "c35ba3", - "7f2d1b": "3c195c", - "ec5631": "794cb7", - "b64126": "502c81", - "736a65": "68326b", - "ffffff": "fbecff", - "c5c5ce": "c093c3", - "524e4e": "404040" + "736028": "9f398a", + "ffd659": "e190c3", + "ccab47": "c35ba3", + "732e17": "3c195c", + "f26130": "794cb7", + "b34724": "502c81", + "737373": "68326b", + "f8f8f8": "fbecff", + "bfbfbf": "c093c3", + "404040": "404040" }, "2": { - "796934": "172547", - "fee772": "3a6a93", "101010": "101010", - "cfb458": "264166", - "7f2d1b": "005646", - "ec5631": "21d170", - "b64126": "0aaa77", - "736a65": "75553c", - "ffffff": "fff8ec", - "c5c5ce": "d4b996", - "524e4e": "404040" + "736028": "172547", + "ffd659": "3a6a93", + "ccab47": "264166", + "732e17": "005646", + "f26130": "21d170", + "b34724": "0aaa77", + "737373": "75553c", + "f8f8f8": "fff8ec", + "bfbfbf": "d4b996", + "404040": "404040" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/654.json b/public/images/pokemon/variant/exp/654.json index a413295bc6c..0f3b2bf3d4e 100644 --- a/public/images/pokemon/variant/exp/654.json +++ b/public/images/pokemon/variant/exp/654.json @@ -1,38 +1,38 @@ { "1": { - "983a29": "6231a5", - "f07944": "ab6ce0", "101010": "101010", - "bf5633": "6231a5", - "987028": "061530", - "f7e77a": "b55390", - "e8b848": "872b59", - "56301f": "471b70", - "af7045": "6231a5", - "8d452e": "c5b3ca", - "969696": "262424", - "414141": "404040", + "736028": "061530", + "ffd659": "b55390", + "ccab47": "872b59", + "732e17": "471b70", + "f26130": "ab6ce0", + "b34724": "6231a5", "f8f8f8": "f7e4fc", - "d8d8c8": "c093c3", - "5c5c5c": "262424", - "000000": "101010" + "737373": "5c255f", + "bfbfbf": "c093c3", + "804913": "c5b3ca", + "262626": "262626", + "404040": "404040", + "f8cf52": "80f37b", + "ffc000": "4fcb61", + "ff8700": "207d4e" }, "2": { - "983a29": "0aaa77", - "f07944": "21d170", "101010": "101010", - "bf5633": "0aaa77", - "987028": "061530", - "f7e77a": "2b5f8a", - "e8b848": "173864", - "56301f": "005646", - "af7045": "0aaa77", - "8d452e": "098794", - "969696": "1a1a22", - "414141": "404040", + "736028": "061530", + "ffd659": "2b5f8a", + "ccab47": "173864", + "732e17": "005646", + "f26130": "21d170", + "b34724": "0aaa77", "f8f8f8": "fff2dd", - "d8d8c8": "d4b996", - "5c5c5c": "1a1a22", - "000000": "101010" + "737373": "75553c", + "bfbfbf": "d4b996", + "804913": "098794", + "262626": "262626", + "404040": "404040", + "f8cf52": "c858a4", + "ffc000": "75308e", + "ff8700": "521364" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/656.json b/public/images/pokemon/variant/exp/656.json new file mode 100644 index 00000000000..1d1003f739c --- /dev/null +++ b/public/images/pokemon/variant/exp/656.json @@ -0,0 +1,32 @@ +{ + "1": { + "838394": "4d7dc5", + "62ace6": "8363af", + "7bcdff": "9c75c2", + "fdea88": "ddfff9", + "a1a1c4": "7ab7ec", + "c9b241": "97d6e2", + "dfcf77": "bae7e8", + "174592": "37408c", + "ffffff": "b1e5ff", + "9c9cc5": "5385c7", + "cdcde6": "7eb7e8", + "396a83": "362864", + "5a94cd": "7054a4" + }, + "2": { + "838394": "cc6845", + "62ace6": "c44848", + "7bcdff": "dd6155", + "fdea88": "ddfff9", + "a1a1c4": "f7c685", + "c9b241": "97d6e2", + "dfcf77": "bae7e8", + "174592": "198158", + "ffffff": "fff4bd", + "9c9cc5": "c96a48", + "cdcde6": "f7b785", + "396a83": "5c0d33", + "5a94cd": "a92f3f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/657.json b/public/images/pokemon/variant/exp/657.json new file mode 100644 index 00000000000..773b4d2efc1 --- /dev/null +++ b/public/images/pokemon/variant/exp/657.json @@ -0,0 +1,32 @@ +{ + "1": { + "f8f8f8": "8dcfff", + "efc653": "abd7db", + "737373": "0f3f82", + "0b566a": "281f52", + "ffec72": "c9fff5", + "002c58": "1c0726", + "bfbfbf": "4386df", + "006ba6": "4e1852", + "009dd5": "61255e", + "0b4a7a": "340f3d", + "e1a03a": "78c7c7", + "41ccf5": "7755a7", + "2896b5": "4b3578" + }, + "2": { + "f8f8f8": "fff6c7", + "efc653": "abd7db", + "737373": "df6a50", + "0b566a": "7e1628", + "ffec72": "ddfff9", + "002c58": "0c3b54", + "bfbfbf": "ffc996", + "006ba6": "239c91", + "009dd5": "37b8ac", + "0b4a7a": "156f78", + "e1a03a": "86abbb", + "41ccf5": "dd7355", + "2896b5": "a92f3a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/658-ash.json b/public/images/pokemon/variant/exp/658-ash.json new file mode 100644 index 00000000000..79cad7ea42d --- /dev/null +++ b/public/images/pokemon/variant/exp/658-ash.json @@ -0,0 +1,46 @@ +{ + "1": { + "265595": "432b6c", + "3f4447": "466698", + "de3431": "3fca9f", + "f8f8f8": "a1e9f0", + "f4f4f4": "d7effa", + "7b282e": "0e3e81", + "6b1d1d": "206d74", + "4ebdd9": "41a7b0", + "bfb169": "165e78", + "bfbfbf": "8cc7d4", + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "fff0a6": "208698", + "3e7acc": "6b4592", + "18335c": "170738", + "f2798d": "8dcfff", + "f01818": "39b88f", + "7ddeff": "7ddcd6", + "268794": "1c3e58", + "282c35": "271f4c" + }, + "2": { + "265595": "cc7251", + "3f4447": "466698", + "de3431": "9ceec6", + "f8f8f8": "89d2b8", + "f4f4f4": "d7effa", + "7b282e": "152a5c", + "6b1d1d": "356e8d", + "4ebdd9": "2f6e74", + "bfb169": "431022", + "bfbfbf": "8cc7d4", + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "fff0a6": "472333", + "3e7acc": "ecbb7a", + "18335c": "9f2727", + "f2798d": "5eb4a9", + "f01818": "ffe88d", + "7ddeff": "46988d", + "268794": "1c3e58", + "282c35": "4d2637" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/658.json b/public/images/pokemon/variant/exp/658.json new file mode 100644 index 00000000000..826e31b4e21 --- /dev/null +++ b/public/images/pokemon/variant/exp/658.json @@ -0,0 +1,34 @@ +{ + "1": { + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "66d9ff": "7ddcd6", + "3d61cc": "6b4592", + "fff0a6": "208698", + "c92e2e": "73c5ff", + "937f69": "406695", + "c2c1bc": "89b0d7", + "f2798d": "8dcfff", + "f7f7f7": "d8ffff", + "bfb169": "165e78", + "1b2a59": "170738", + "803340": "0e3e81", + "2e4999": "432b6c" + }, + "2": { + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "66d9ff": "48968c", + "3d61cc": "ecbb7a", + "fff0a6": "652240", + "c92e2e": "63bf9b", + "937f69": "466698", + "c2c1bc": "8cc7d4", + "f2798d": "5eb4a9", + "f7f7f7": "d7eff4", + "bfb169": "431022", + "1b2a59": "9f2727", + "803340": "152a5c", + "2e4999": "cc7251" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/664.json b/public/images/pokemon/variant/exp/664.json index 02633098521..bd4164ca7db 100644 --- a/public/images/pokemon/variant/exp/664.json +++ b/public/images/pokemon/variant/exp/664.json @@ -1,30 +1,30 @@ { "1": { - "797987": "9d6260", - "f9f8fa": "ffffff", - "000000": "000000", - "cdcdcd": "e9c7c4", - "54544e": "895a9f", - "383830": "4c2855", - "727272": "a97dbb", - "8e5136": "838b53", - "f0d5b9": "a0c896", - "d8a465": "838b53", - "653925": "626649", - "383834": "383834" + "4d4d4d": "9d6260", + "f8f8f8": "ffffff", + "101010": "101010", + "b3b3b3": "e9c7c4", + "363636": "4c2855", + "747474": "a97dbb", + "4e4e4e": "895a9f", + "9d7247": "838b53", + "d1bf6b": "a0c896", + "b2b2b2": "b2b2b2", + "f7f7f7": "f7f7f7", + "855d31": "626649" }, "2": { - "797987": "590015", - "f9f8fa": "c83e4c", - "000000": "000000", - "cdcdcd": "a70d37", - "54544e": "377772", - "383830": "05312f", - "727272": "73bdae", - "8e5136": "bf8961", - "f0d5b9": "ffe0ba", - "d8a465": "dda476", - "653925": "05312f", - "383834": "383834" + "4d4d4d": "590015", + "f8f8f8": "c83e4c", + "101010": "101010", + "b3b3b3": "a70d37", + "363636": "05312f", + "747474": "73bdae", + "4e4e4e": "377772", + "9d7247": "dda476", + "d1bf6b": "ffe0ba", + "b2b2b2": "b2b2b2", + "f7f7f7": "f7f7f7", + "855d31": "bf8961" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/665.json b/public/images/pokemon/variant/exp/665.json index 02e88015c15..6d828dadb5d 100644 --- a/public/images/pokemon/variant/exp/665.json +++ b/public/images/pokemon/variant/exp/665.json @@ -1,36 +1,36 @@ { "1": { - "8e5136": "838b53", - "653925": "626649", - "52524b": "4c2855", - "f0d5b9": "a0c896", - "d8a465": "838b53", - "838392": "9c615f", - "8b8b8b": "a97dbb", - "000000": "000000", - "cdcdcd": "e9c7c4", - "6a6a6a": "895a9f", - "ffffff": "ffffff", - "f9f8fa": "f9f8fa", - "94416a": "005361", - "ff94b4": "008aac", - "ee5a62": "00aacd" + "363636": "4c2855", + "d1bf6b": "a0c896", + "9d7247": "838b53", + "4e4e4e": "895a9f", + "747474": "a97dbb", + "bfbfbf": "b294be", + "101010": "101010", + "fdfdfd": "fdfdfd", + "8c8c8c": "895a9f", + "4d4d4d": "9c615f", + "f8f8f8": "ffffff", + "b3b3b3": "e9c7c4", + "802626": "005361", + "ff4c4c": "00aacd", + "eed83e": "cae2c3" }, "2": { - "8e5136": "bf8961", - "653925": "bf8961", - "52524b": "05312f", - "f0d5b9": "ffe0ba", - "d8a465": "dda476", - "838392": "590015", - "8b8b8b": "73bdae", - "000000": "000000", - "cdcdcd": "a70d37", - "6a6a6a": "377772", - "ffffff": "c83e4c", - "f9f8fa": "c83e4c", - "94416a": "004270", - "ff94b4": "0092dd", - "ee5a62": "0092dd" + "363636": "05312f", + "d1bf6b": "ffe0ba", + "9d7247": "dda476", + "4e4e4e": "377772", + "747474": "73bdae", + "bfbfbf": "a70d37", + "101010": "101010", + "fdfdfd": "fdfdfd", + "8c8c8c": "590015", + "4d4d4d": "590015", + "f8f8f8": "c83e4c", + "b3b3b3": "a70d37", + "802626": "004270", + "ff4c4c": "0092dd", + "eed83e": "ffe0ba" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-fancy.json b/public/images/pokemon/variant/exp/666-fancy.json new file mode 100644 index 00000000000..1f31ac6983d --- /dev/null +++ b/public/images/pokemon/variant/exp/666-fancy.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "811c1c": "811c1c", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "d9edd4", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "ffeaff", + "f2d4e3": "f2d4e3", + "ead2e3": "ffeaff" + }, + "2": { + "101010": "101010", + "303030": "00771b", + "675220": "b9c05a", + "504a4a": "b9c05a", + "595959": "6f9f42", + "707068": "e3e982", + "811c1c": "811c1c", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "e3e982", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "fcf1ff", + "f2d4e3": "f2d4e3", + "ead2e3": "fcf1ff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-fancy_2.json b/public/images/pokemon/variant/exp/666-fancy_2.json deleted file mode 100644 index bcfde0b3dd4..00000000000 --- a/public/images/pokemon/variant/exp/666-fancy_2.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_2.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:370e4a87d9d988b8133d25e0b97db22c:d173344c5e41aaa90de937ec3e1b167f:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-fancy_2.png b/public/images/pokemon/variant/exp/666-fancy_2.png deleted file mode 100644 index df1343095d0..00000000000 Binary files a/public/images/pokemon/variant/exp/666-fancy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/666-fancy_3.json b/public/images/pokemon/variant/exp/666-fancy_3.json deleted file mode 100644 index 60fd0634e79..00000000000 --- a/public/images/pokemon/variant/exp/666-fancy_3.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:370e4a87d9d988b8133d25e0b97db22c:d173344c5e41aaa90de937ec3e1b167f:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-fancy_3.png b/public/images/pokemon/variant/exp/666-fancy_3.png deleted file mode 100644 index 4a48c5cc236..00000000000 Binary files a/public/images/pokemon/variant/exp/666-fancy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/666-high-plains.json b/public/images/pokemon/variant/exp/666-high-plains.json index 330d1c39772..f63bb4f81f3 100644 --- a/public/images/pokemon/variant/exp/666-high-plains.json +++ b/public/images/pokemon/variant/exp/666-high-plains.json @@ -14,7 +14,8 @@ "c3c3c3": "ffeaff", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" }, "2": { "101010": "101010", @@ -31,6 +32,7 @@ "c3c3c3": "edc67c", "811c1c": "811c1c", "337543": "337543", - "e8c815": "e8c815" + "e8c815": "e8c815", + "773d21": "773d21" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-icy-snow.json b/public/images/pokemon/variant/exp/666-icy-snow.json index 9cae71418ce..d69d48d89e9 100644 --- a/public/images/pokemon/variant/exp/666-icy-snow.json +++ b/public/images/pokemon/variant/exp/666-icy-snow.json @@ -6,12 +6,13 @@ "303030": "402746", "cfd9cf": "cfd9cf", "c5c5da": "c5c5da", - "ceab62": "d9edd4", "675220": "958c8a", - "504a4a": "7f6991", + "ceab62": "d9edd4", "707068": "a97cbc", + "504a4a": "7f6991", "c3c3c3": "ffeaff", "acacc2": "acacc2", + "95a1a1": "95a1a1", "811c1c": "811c1c" }, "2": { @@ -21,12 +22,13 @@ "303030": "364051", "cfd9cf": "cfd9cf", "c5c5da": "c5c5da", - "ceab62": "8c91a4", "675220": "666b7d", - "504a4a": "666b7d", + "ceab62": "8c91a4", "707068": "8c91a4", + "504a4a": "666b7d", "c3c3c3": "fefeff", "acacc2": "acacc2", + "95a1a1": "95a1a1", "811c1c": "811c1c" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-meadow.json b/public/images/pokemon/variant/exp/666-meadow.json new file mode 100644 index 00000000000..c766325427b --- /dev/null +++ b/public/images/pokemon/variant/exp/666-meadow.json @@ -0,0 +1,36 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "811c1c": "811c1c", + "b4295a": "b4295a", + "da6b7e": "da6b7e", + "ceab62": "d9edd4", + "e66fad": "e66fad", + "2d9b9b": "2d9b9b", + "f3a0ca": "f3a0ca", + "c3c3c3": "ffeaff", + "f2f2f2": "f2f2f2" + }, + "2": { + "101010": "101010", + "303030": "770921", + "675220": "a2275e", + "504a4a": "a2275e", + "595959": "9e3941", + "707068": "ce5283", + "811c1c": "811c1c", + "b4295a": "b4295a", + "da6b7e": "da6b7e", + "ceab62": "ce5283", + "e66fad": "e66fad", + "2d9b9b": "2d9b9b", + "f3a0ca": "f3a0ca", + "c3c3c3": "f4c2ec", + "f2f2f2": "f2f2f2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-meadow_2.json b/public/images/pokemon/variant/exp/666-meadow_2.json deleted file mode 100644 index 4d4d4d16147..00000000000 --- a/public/images/pokemon/variant/exp/666-meadow_2.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-meadow_2.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223ce33721ef8da9ff40286099c20de4:b82acd304c2a8b8cebeda2043a3e1f96:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } -} diff --git a/public/images/pokemon/variant/exp/666-meadow_2.png b/public/images/pokemon/variant/exp/666-meadow_2.png deleted file mode 100644 index 5ada6bb51be..00000000000 Binary files a/public/images/pokemon/variant/exp/666-meadow_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/666-meadow_3.json b/public/images/pokemon/variant/exp/666-meadow_3.json deleted file mode 100644 index 8af56626a35..00000000000 --- a/public/images/pokemon/variant/exp/666-meadow_3.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-meadow_3.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223ce33721ef8da9ff40286099c20de4:b82acd304c2a8b8cebeda2043a3e1f96:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } -} diff --git a/public/images/pokemon/variant/exp/666-meadow_3.png b/public/images/pokemon/variant/exp/666-meadow_3.png deleted file mode 100644 index 2acb4732409..00000000000 Binary files a/public/images/pokemon/variant/exp/666-meadow_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/666-monsoon.json b/public/images/pokemon/variant/exp/666-monsoon.json index edc2e86427e..915d471b2b1 100644 --- a/public/images/pokemon/variant/exp/666-monsoon.json +++ b/public/images/pokemon/variant/exp/666-monsoon.json @@ -1,36 +1,33 @@ { - "1": { - "101010": "101010", - "595959": "724b7a", - "f0f0f8": "f0f0f8", - "303030": "402746", - "ceab62": "d9edd4", - "675220": "958c8a", + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "504a4a": "7f6991", - "707068": "a97cbc", - "4eccd6": "4eccd6", + "ceab62": "d9edd4", "5676de": "5676de", - "c3c3c3": "ffeaff", - "811c1c": "811c1c" - }, - "2": { - "101010": "101010", - "595959": "656565", - "f0f0f8": "f0f0f8", - "303030": "4f4645", - "ceab62": "5857bc", - "675220": "2c3593", - "807676": "807676", - "92f4f4": "92f4f4", - "989898": "989898", - "504a4a": "2c3593", - "707068": "5857bc", - "4eccd6": "4eccd6", - "5676de": "5676de", - "c3c3c3": "b8f9f9", - "811c1c": "811c1c" - } + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-ocean.json b/public/images/pokemon/variant/exp/666-ocean.json index 26a38bad7a8..c468bbcbf1e 100644 --- a/public/images/pokemon/variant/exp/666-ocean.json +++ b/public/images/pokemon/variant/exp/666-ocean.json @@ -22,7 +22,7 @@ "e1384d": "e1384d", "f3a861": "f3a861", "fcf372": "fcf372", - "303030": "b56208", + "303030": "b54908", "ceab62": "ea8742", "675220": "bc601c", "504a4a": "bc601c", diff --git a/public/images/pokemon/variant/exp/666-poke-ball.json b/public/images/pokemon/variant/exp/666-poke-ball.json index 36cd38b95f0..fe6b42f6ef3 100644 --- a/public/images/pokemon/variant/exp/666-poke-ball.json +++ b/public/images/pokemon/variant/exp/666-poke-ball.json @@ -3,17 +3,36 @@ "101010": "101010", "595959": "724b7a", "b72c2c": "b72c2c", - "303030": "402746", "dc4b4b": "dc4b4b", - "ceab62": "d9edd4", + "303030": "402746", "675220": "958c8a", + "ceab62": "d9edd4", "e97e7e": "e97e7e", "971d1d": "971d1d", "f8f8f8": "f8f8f8", - "504a4a": "7f6991", "707068": "a97cbc", + "504a4a": "7f6991", "c3c3c3": "ffeaff", "811c1c": "811c1c", - "a9a99e": "a9a99e" + "a9a99e": "a9a99e", + "2c2b2b": "402746" + }, + "2": { + "101010": "101010", + "f8f8f8": "00006d", + "303030": "ae001a", + "2c2b2b": "660000", + "504a4a": "a70038", + "595959": "df0036", + "c3c3c3": "f0a6bf", + "707068": "d5375a", + "a9a99e": "000050", + "811c1c": "811c1c", + "971d1d": "040046", + "b72c2c": "00005e", + "dc4b4b": "19007d", + "e97e7e": "2e2095", + "675220": "a70038", + "ceab62": "d5375a" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-poke-ball_3.json b/public/images/pokemon/variant/exp/666-poke-ball_3.json deleted file mode 100644 index 3d133124358..00000000000 --- a/public/images/pokemon/variant/exp/666-poke-ball_3.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_3.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9b0791af9130022168ad784a59e299ce:b180b141bed2ea965d6f07d9e2cd7ecc:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-poke-ball_3.png b/public/images/pokemon/variant/exp/666-poke-ball_3.png deleted file mode 100644 index 9e821efd1eb..00000000000 Binary files a/public/images/pokemon/variant/exp/666-poke-ball_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/666-river.json b/public/images/pokemon/variant/exp/666-river.json index df10a73d783..c7e5e288d05 100644 --- a/public/images/pokemon/variant/exp/666-river.json +++ b/public/images/pokemon/variant/exp/666-river.json @@ -1,19 +1,40 @@ { - "2": { - "101010": "101010", - "595959": "8a5702", - "ceab62": "d9a666", - "303030": "7b2800", - "625843": "625843", - "bc813f": "bc813f", - "9c9143": "9c9143", - "675220": "ae7f41", - "504a4a": "ae7f41", - "707068": "d9a666", - "c3c3c3": "e3c384", - "811c1c": "811c1c", - "59c9d3": "59c9d3", - "279ec2": "279ec2", - "1d726a": "1d726a" - } + "1": { + "101010": "101010", + "303030": "402746", + "4a412c": "4a412c", + "675220": "958c8a", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "7f6991", + "595959": "724b7a", + "625841": "625841", + "707068": "a97cbc", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "c3c3c3", + "d2a862": "d9edd4" + }, + "2": { + "101010": "101010", + "303030": "7b2800", + "4a412c": "4a412c", + "675220": "ae7f41", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "ae7f41", + "595959": "8a5702", + "625841": "625841", + "707068": "d9a666", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "e3c384", + "d2a862": "d2a862" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-river_2.json b/public/images/pokemon/variant/exp/666-river_2.json deleted file mode 100644 index f840b39ccfd..00000000000 --- a/public/images/pokemon/variant/exp/666-river_2.json +++ /dev/null @@ -1,1280 +0,0 @@ -{ - "textures": [ - { - "image": "666-river_2.png", - "format": "RGBA8888", - "size": { - "w": 346, - "h": 346 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 0, - "y": 276, - "w": 67, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 134, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 201, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 268, - "y": 0, - "w": 67, - "h": 69 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 69, - "w": 67, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 138, - "w": 67, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 67, - "h": 69 - }, - "frame": { - "x": 67, - "y": 207, - "w": 67, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 67, - "y": 276, - "w": 67, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 67, - "h": 68 - }, - "frame": { - "x": 134, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 201, - "y": 69, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 268, - "y": 69, - "w": 53, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 137, - "w": 53, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 138, - "w": 53, - "h": 69 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 206, - "w": 53, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 134, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 187, - "y": 275, - "w": 53, - "h": 69 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 53, - "h": 69 - }, - "frame": { - "x": 240, - "y": 276, - "w": 53, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 2, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 207, - "w": 53, - "h": 69 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 53, - "h": 69 - }, - "frame": { - "x": 293, - "y": 276, - "w": 53, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3ecaf6e3ae563f3da9598e7b18b87b05:e4ece90a3e9880c6499c363b000de8dd:fa23dc87fc53ba2cfa532cf440553cf5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/666-river_2.png b/public/images/pokemon/variant/exp/666-river_2.png deleted file mode 100644 index 7dc96690328..00000000000 Binary files a/public/images/pokemon/variant/exp/666-river_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/676.json b/public/images/pokemon/variant/exp/676.json new file mode 100644 index 00000000000..d5ec3013e8e --- /dev/null +++ b/public/images/pokemon/variant/exp/676.json @@ -0,0 +1,22 @@ +{ + "1": { + "a8a592": "42090e", + "376277": "2b040f", + "ccc8b1": "5e0f16", + "59463c": "aaaec1", + "97362c": "a83c31", + "68675c": "2b040f", + "fc362c": "cc2929", + "efeeda": "8a1d1d" + }, + "2": { + "a8a592": "805145", + "376277": "4a281b", + "ccc8b1": "a4624a", + "59463c": "ffe6ac", + "97362c": "3a240e", + "68675c": "4a281b", + "fc362c": "50351b", + "efeeda": "c18960" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/682.json b/public/images/pokemon/variant/exp/682.json new file mode 100644 index 00000000000..a8a7caf46b1 --- /dev/null +++ b/public/images/pokemon/variant/exp/682.json @@ -0,0 +1,28 @@ +{ + "1": { + "661f1f": "cd6132", + "bf5f9f": "7c48a1", + "ff99b3": "48ab61", + "f24949": "ffa24f", + "6b3962": "30185d", + "993d80": "4f297e", + "ffb6c2": "62c45f", + "7f4d59": "20644e", + "cc7087": "318759" + }, + "2": { + "661f1f": "daa235", + "bf5f9f": "f0ebdd", + "ff99b3": "da7e29", + "a6a6a6": "503851", + "737373": "422f46", + "f24949": "ffe664", + "6b3962": "b89477", + "993d80": "d2bfa1", + "ffb6c2": "ed9f3a", + "e5e5e5": "6b4767", + "7f4d59": "a23812", + "4d4d4d": "332539", + "cc7087": "c3561a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/683.json b/public/images/pokemon/variant/exp/683.json new file mode 100644 index 00000000000..f9485702936 --- /dev/null +++ b/public/images/pokemon/variant/exp/683.json @@ -0,0 +1,32 @@ +{ + "1": { + "661f1f": "b64d29", + "cc7087": "318759", + "ff99b3": "48ab61", + "fff0a6": "fec04b", + "f24949": "ffa24f", + "6b3962": "30185d", + "e5c37e": "d6872c", + "993d80": "4f297e", + "7f4d59": "20644e", + "404040": "2c283b", + "b33636": "f4863f", + "bf5f9f": "7c48a1" + }, + "2": { + "661f1f": "c78925", + "cc7087": "c3561a", + "ff99b3": "da7e29", + "fff0a6": "6d8719", + "e5e5e5": "6b4767", + "f24949": "ffe664", + "6b3962": "b89477", + "e5c37e": "376d11", + "993d80": "d2bfa1", + "7f4d59": "a23812", + "a6a6a6": "503851", + "404040": "2a2234", + "b33636": "f0c150", + "bf5f9f": "f0ebdd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/684.json b/public/images/pokemon/variant/exp/684.json new file mode 100644 index 00000000000..fb88bb28c70 --- /dev/null +++ b/public/images/pokemon/variant/exp/684.json @@ -0,0 +1,30 @@ +{ + "1": { + "805963": "2d0c42", + "553a41": "8f1d15", + "661a2d": "13391c", + "e53964": "8dbe6d", + "ffccd9": "8961c6", + "5e4048": "260b37", + "cc99a6": "613b84", + "f8f8f8": "caff90", + "fff2f2": "f39f62", + "a62949": "689b52", + "7b5760": "b13924", + "ccadad": "df6b40" + }, + "2": { + "805963": "6796aa", + "553a41": "1d1426", + "661a2d": "26061b", + "e53964": "8c4264", + "ffccd9": "cbf6da", + "5e4048": "52718e", + "cc99a6": "93d6ce", + "f8f8f8": "ffe5ec", + "fff2f2": "746998", + "a62949": "612747", + "7b5760": "3c2f51", + "ccadad": "4b4876" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/685.json b/public/images/pokemon/variant/exp/685.json new file mode 100644 index 00000000000..24ead59428a --- /dev/null +++ b/public/images/pokemon/variant/exp/685.json @@ -0,0 +1,28 @@ +{ + "1": { + "f8f8f8": "caff90", + "661a2d": "13391c", + "7b5760": "b13924", + "ffccd9": "8961c6", + "ff8ca9": "8dbe6d", + "cc99a6": "613b84", + "e53964": "689b52", + "fff2f2": "f39f62", + "a62949": "26592b", + "ccadad": "df6b40", + "805963": "2d0c42" + }, + "2": { + "f8f8f8": "e4819d", + "661a2d": "26061b", + "7b5760": "3c2f51", + "ffccd9": "cbf6da", + "ff8ca9": "8c4264", + "cc99a6": "93d6ce", + "e53964": "612747", + "fff2f2": "746998", + "a62949": "441838", + "ccadad": "4b4876", + "805963": "52718e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/688.json b/public/images/pokemon/variant/exp/688.json new file mode 100644 index 00000000000..e5749f6bb3f --- /dev/null +++ b/public/images/pokemon/variant/exp/688.json @@ -0,0 +1,33 @@ +{ + "1": { + "5890b0": "a9582e", + "385860": "70240f", + "372e27": "220a56", + "6b503b": "373295", + "d0d0d0": "d3bc8c", + "c0e0e8": "e8d37b", + "8a6d45": "4557b5", + "101010": "37160a", + "b7653f": "459aac", + "fcffff": "e8e5c6", + "808080": "7c582e", + "88c0c8": "cd8a50", + "ef8955": "70cccf" + }, + "2": { + "5890b0": "4b0038", + "385860": "2c052a", + "372e27": "1e1324", + "6b503b": "ba9fba", + "d0d0d0": "7eac4e", + "c0e0e8": "a74083", + "8a6d45": "f6eefc", + "101010": "0a391b", + "b7653f": "332149", + "fcffff": "caea77", + "f8f8f8": "ffffff", + "808080": "2a5524", + "88c0c8": "731f5c", + "ef8955": "4a376e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/689.json b/public/images/pokemon/variant/exp/689.json new file mode 100644 index 00000000000..cd6db09c8d2 --- /dev/null +++ b/public/images/pokemon/variant/exp/689.json @@ -0,0 +1,31 @@ +{ + "1": { + "bfeaff": "e8d37b", + "f2f2f2": "e8e5c6", + "5b8da6": "8d5030", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "672e1e", + "b3b3b3": "d3bc8c", + "cc7f70": "459aac", + "85b4cc": "cd8a50", + "ff9f8c": "70cccf", + "66541f": "373295", + "997e2e": "4557b5" + }, + "2": { + "bfeaff": "a74083", + "f2f2f2": "caea77", + "5b8da6": "4b0038", + "595959": "2a5524", + "403410": "3f2a4b", + "3f6273": "3e073b", + "b3b3b3": "7eac4e", + "cc7f70": "332149", + "85b4cc": "731f5c", + "f8f8f8": "dbaf67", + "ff9f8c": "4a376e", + "66541f": "ccb6cc", + "997e2e": "f6eefc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/696.json b/public/images/pokemon/variant/exp/696.json index 3a4b4480673..677f5d98578 100644 --- a/public/images/pokemon/variant/exp/696.json +++ b/public/images/pokemon/variant/exp/696.json @@ -1,40 +1,38 @@ { "1": { - "774411":"5e0b0b", - "101010":"101010", - "ff8f1f":"a50d0d", - "4f2e1d":"023425", - "5f4f4f":"0b4c29", - "af8f7f":"478136", - "3f3f44":"4c3216", - "8f6f5f":"1b6430", - "f8f7f9":"dfdea7", - "bfbfcc":"cbbe8c", - "121212":"121212", - "8f8f99":"ad8c63", - "c2c2cf":"c9bc87", - "fbfafc":"dddca1", - "772d34":"77452d", - "ff9bd5":"c98c68" - }, - "2": { - "774411":"395cb7", - "101010":"101010", - "ff8f1f":"d2e9ff", - "4f2e1d":"3e1f18", - "5f4f4f":"644943", - "af8f7f":"a59e9a", - "3f3f44":"250860", - "8f6f5f":"83726e", - "f8f7f9":"6e46a7", - "bfbfcc":"593097", - "121212":"decaff", - "8f8f99":"411684", - "c2c2cf":"7ccad5", - "fbfafc":"fbfafc", - "772d34":"375ab3", - "ff9bd5":"79c8d3" - } +"734517": "5e0b0b", +"ffa64c": "a50d0d", +"4a322c": "023425", +"404040": "4c3216", +"101010": "101010", +"65483a": "0b4c29", +"966858": "1b6430", +"f8f8f8": "dfdea7", +"8c8c8c": "ad8c63", +"bfbfbf": "cbbe8c", +"000000": "000000", +"b73b6b": "4c3216", +"ff949e": "c98c68", +"b3b9b9": "cbbe8c", +"3f3d3d": "4c3216" +}, +"2": { +"734517": "395cb7", +"ffa64c": "d2e9ff", +"4a322c": "3e1f18", +"404040": "250860", +"101010": "101010", +"65483a": "644943", +"966858": "83726e", +"f8f8f8": "6e46a7", +"8c8c8c": "411684", +"bfbfbf": "593097", +"000000": "decaff", +"b73b6b": "395cb7", +"ff949e": "79c8d3", +"b3b9b9": "79c8d3", +"3f3d3d": "395cb7" +} } 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.json b/public/images/pokemon/variant/exp/697.json index dae4554a1b7..b8d305022f5 100644 --- a/public/images/pokemon/variant/exp/697.json +++ b/public/images/pokemon/variant/exp/697.json @@ -1,42 +1,42 @@ { - "1": { - "1f0a0a":"1f0a0a", - "471515":"0a1b17", - "621e1d":"0b241e", - "902e2c":"153626", - "b45250":"285234", - "d16c6b":"416a45", - "653510":"5e0b0b", - "b56726":"971c1c", - "e39f33":"b52424", - "756b66":"ad8c63", - "b1b0b5":"cbbe8c", - "f0f0f2":"dfdea7", - "573b43":"4c3216", - "736964":"ab885f", - "ac628a":"9d5d18", - "aeadb3":"a88860", - "ededf0":"dbdaa4" - }, - "2": { - "1f0a0a":"1f0a0a", - "471515":"191124", - "621e1d":"52352f", - "902e2c":"83726e", - "b45250":"ab9b97", - "d16c6b":"c7bcb9", - "653510":"9d5390", - "b56726":"ce7ecc", - "e39f33":"f4dbf6", - "756b66":"26173b", - "b1b0b5":"33214f", - "f0f0f2":"4b2e64", - "573b43":"cc7cc9", - "736964":"f6dcf7", - "ac628a":"eed5f0", - "aeadb3":"c779c4", - "ededf0":"f8defa" - } +"1": { +"080808": "080808", +"32252c": "3e1e17", +"50131e": "0b241e", +"722533": "153626", +"54434c": "4c3216", +"964b1c": "5e0b0b", +"963e4e": "285234", +"bf7545": "971c1c", +"f19d5a": "b52424", +"9f9d98": "ad8c63", +"cccccc": "cbbe8c", +"fafafa": "dfdea7", +"cac2c2": "cbbe8c", +"f7eeee": "dfdea7", +"53414b": "4c3216", +"30222a": "3e1e17", +"53454d": "4c3216" +}, +"2": { +"080808": "080808", +"32252c": "0d0124", +"50131e": "573b36", +"722533": "83726e", +"54434c": "170c25", +"964b1c": "9d5390", +"963e4e": "ab9b97", +"bf7545": "ce7ecc", +"f19d5a": "f4dbf6", +"9f9d98": "26173b", +"cccccc": "33214f", +"fafafa": "4b2e64", +"cac2c2": "ce7ecc", +"f7eeee": "f4dbf6", +"53414b": "dea5dd", +"30222a": "ce7ecc", +"53454d": "f4dbf6" +} } 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/700.json b/public/images/pokemon/variant/exp/700.json index 0b6071ad765..1189d463f2b 100644 --- a/public/images/pokemon/variant/exp/700.json +++ b/public/images/pokemon/variant/exp/700.json @@ -1,34 +1,32 @@ { - "1": { - "9a4557": "452f89", - "19657b": "a63071", - "fb9cc3": "c7a6ee", - "52cbee": "e974db", - "000000": "000000", - "cb628d": "996cd2", - "f7bbd4": "e1cff3", - "0d146e": "0d146e", - "3744e5": "d648b7", - "584f4f": "5c6889", - "ffffff": "f7f5ff", - "1f337b": "a63071", - "cbc0c0": "c3c5d9", - "2999b9": "d648b7" - }, - "2": { - "9a4557": "197d46", - "19657b": "c72537", - "fb9cc3": "7dec9d", - "52cbee": "ff9a68", - "000000": "000000", - "cb628d": "5dae7d", - "f7bbd4": "f7bbd4", - "0d146e": "0d146e", - "3744e5": "eb5244", - "584f4f": "7f5c89", - "ffffff": "fff5fc", - "1f337b": "c72537", - "cbc0c0": "d9c3d6", - "2999b9": "eb5244" - } +"1": { +"101010": "101010", +"8a2843": "452f89", +"235a99": "a63071", +"895c72": "5c6889", +"d85a7a": "996cd2", +"528fcc": "d648b7", +"a88d8c": "8c8fa8", +"f18a78": "b52d27", +"fa8caa": "c7a6ee", +"64c8f3": "e974db", +"d9c3c3": "c3c5d9", +"fff5f5": "f7f5ff", +"65798c": "65798c" +}, +"2": { +"101010": "101010", +"8a2843": "0e6134", +"235a99": "900d1b", +"895c72": "7f5c89", +"d85a7a": "5dae7d", +"528fcc": "dd3d4f", +"a88d8c": "7f5c89", +"f18a78": "d14ea4", +"fa8caa": "7dec9d", +"64c8f3": "ff9a68", +"d9c3c3": "d9c3d6", +"fff5f5": "fff5fc", +"65798c": "65798c" +} } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/702.json b/public/images/pokemon/variant/exp/702.json index 1edd126264e..12feb29a0fd 100644 --- a/public/images/pokemon/variant/exp/702.json +++ b/public/images/pokemon/variant/exp/702.json @@ -3,30 +3,30 @@ "101010": "101010", "262626": "2a3b5e", "4d4d4d": "6789b3", - "ccbb99": "a3d1cc", - "efefcf": "ddfff5", - "704030": "a53c42", - "906030": "c9685f", - "efbf5f": "ffd3b6", - "cf8f4f": "e49f84", + "bfbf86": "a3d1cc", + "f2f2aa": "ddfff5", + "735c2e": "a53c42", + "997a3d": "c9685f", + "f2c261": "ffd3b6", + "bf994c": "e49f84", "1d1d1d": "1a1c45", - "fefefe": "fefefe", + "f8f8f8": "f8f8f8", "464646": "424b8f", - "df7f5f": "7cd6a1" + "d97d21": "7cd6a1" }, "2": { "101010": "101010", "262626": "072d38", "4d4d4d": "197870", - "ccbb99": "aaa8d6", - "efefcf": "ece5ff", - "704030": "1e0e27", - "906030": "2d1533", - "efbf5f": "5f3662", - "cf8f4f": "432249", + "bfbf86": "aaa8d6", + "f2f2aa": "ece5ff", + "735c2e": "1e0e27", + "997a3d": "2d1533", + "f2c261": "5f3662", + "bf994c": "432249", "1d1d1d": "02172d", - "fefefe": "fefefe", + "f8f8f8": "f8f8f8", "464646": "17646c", - "df7f5f": "d2fff1" + "d97d21": "d2fff1" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/704.json b/public/images/pokemon/variant/exp/704.json index 38e5cdaf70d..e292d6fb41f 100644 --- a/public/images/pokemon/variant/exp/704.json +++ b/public/images/pokemon/variant/exp/704.json @@ -1,30 +1,30 @@ { "1": { - "6f5e80": "4e4094", - "e0d3e0": "fbb3d2", - "010202": "101010", - "bbafc4": "c7a1e5", - "2f6b38": "4e4094", - "74d457": "3aa8c4", - "3da84d": "197497", - "3f3d5e": "4e4094", - "a497c2": "c7a1e5", - "766fa6": "8b69c3", - "4c3143": "4e4094", - "cc93ab": "c7a1e5" + "807380": "b93f84", + "f2daf2": "fbb3d2", + "bfacbf": "e56ca6", + "4d454d": "8a2166", + "101010": "101010", + "4d993d": "197497", + "66cc52": "3aa8c4", + "b8a1e5": "c7a1e5", + "8f7db3": "8b69c3", + "665980": "4e4094", + "c25054": "c68260", + "de817e": "e5e1a1" }, "2": { - "6f5e80": "274159", - "e0d3e0": "92d8c8", - "010202": "101010", - "bbafc4": "63a99e", - "2f6b38": "134557", - "74d457": "d27e26", - "3da84d": "a34205", - "3f3d5e": "134557", - "a497c2": "63a99e", - "766fa6": "2f667c", - "4c3143": "134557", - "cc93ab": "63a99e" + "807380": "237e7f", + "f2daf2": "92d8c8", + "bfacbf": "63a99e", + "4d454d": "134557", + "101010": "101010", + "4d993d": "a34205", + "66cc52": "d27e26", + "b8a1e5": "4a9699", + "8f7db3": "2f667c", + "665980": "274159", + "c25054": "9268a4", + "de817e": "f2daf2" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/705.json b/public/images/pokemon/variant/exp/705.json index a29b8f124dc..bf9aa91eb4b 100644 --- a/public/images/pokemon/variant/exp/705.json +++ b/public/images/pokemon/variant/exp/705.json @@ -1,33 +1,34 @@ { "1": { - "101010":"101010", - "4d454d":"8a2166", - "807380":"b93f84", - "bfacbf":"e56ca6", - "f2daf2":"fbb3d2", - "665980":"4e4094", - "8f7db3":"8b69c3", - "b8a1e5":"c7a1e5", - "4d993d":"aa6a00", - "66cc52":"ffd047", - "4e9c3e":"0c5474", - "67cf53":"3aa8c4", - "b6f2aa":"63cee1" + "807380": "b93f84", + "bfacbf": "e56ca6", + "f2daf2": "fbb3d2", + "4d454d": "8a2166", + "307922": "aa6a00", + "46b030": "ffd047", + "101010": "101010", + "98bd51": "197497", + "d2e79e": "3aa8c4", + "647543": "0c5474", + "b8a1e5": "c7a1e5", + "665980": "4e4094", + "8f7db3": "8b69c3", + "ef6f8f": "b93f84" }, "2": { - "101010":"101010", - "4d454d":"194f51", - "807380":"2b736f", - "bfacbf":"5db6a9", - "f2daf2":"9cead8", - "665980":"274159", - "8f7db3":"2f667c", - "b8a1e5":"4a9699", - "4d993d":"007d61", - "66cc52":"49ffbf", - "4e9c3e":"842401", - "67cf53":"a34205", - "b6f2aa":"d27e26" + "807380": "2b736f", + "bfacbf": "5db6a9", + "f2daf2": "9cead8", + "4d454d": "194f51", + "307922": "007d61", + "46b030": "49ffbf", + "101010": "101010", + "98bd51": "a34205", + "d2e79e": "d27e26", + "647543": "842401", + "b8a1e5": "4a9699", + "665980": "274159", + "8f7db3": "2f667c", + "3f6f8f": "9268a4" } -} - +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/713.json b/public/images/pokemon/variant/exp/713.json index d18009819f4..ca45360ecea 100644 --- a/public/images/pokemon/variant/exp/713.json +++ b/public/images/pokemon/variant/exp/713.json @@ -1,26 +1,32 @@ { "1": { - "42575f": "994255", - "bbeef9": "ffbfda", - "ffffff": "ffebf2", - "473552": "4c131f", - "9e7ac1": "994255", - "6a4e7a": "732334", - "8db7c7": "d97389", - "000000": "000000", - "698e9c": "bf566d", - "e6c81e": "9dcc3e" + "608cba": "bf566d", + "bff4ff": "ffbfda", + "85d7f2": "f29eb3", + "967acc": "732334", + "77b8d9": "d97389", + "335980": "994255", + "f2ffff": "ffebf2", + "101010": "101010", + "737373": "737373", + "bfbfbf": "bfbfbf", + "efab34": "9dcc3e", + "ffe46a": "cbe696", + "f8f8f8": "f8f8f8" }, "2": { - "42575f": "42575f", - "bbeef9": "fcc95c", - "ffffff": "fff2ad", - "473552": "473552", - "9e7ac1": "6cb3ae", - "6a4e7a": "006761", - "8db7c7": "cc7b1e", - "000000": "000000", - "698e9c": "a8632a", - "e6c81e": "8dd9d4" + "608cba": "a8632a", + "bff4ff": "fcc95c", + "85d7f2": "e69e2b", + "967acc": "2c7a75", + "77b8d9": "cc7b1e", + "335980": "824628", + "f2ffff": "fff2ad", + "101010": "101010", + "737373": "737373", + "bfbfbf": "6cb3ae", + "efab34": "6cb3ae", + "ffe46a": "b9f2ee", + "f8f8f8": "b9f2ee" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/715.json b/public/images/pokemon/variant/exp/715.json index 4ca2bcad56a..0e97862f10b 100644 --- a/public/images/pokemon/variant/exp/715.json +++ b/public/images/pokemon/variant/exp/715.json @@ -1,20 +1,38 @@ { + "1": { + "101010": "101010", + "404040": "5f32b1", + "6a3f73": "0f103c", + "287366": "731338", + "3aa694": "a42c54", + "8e5499": "202558", + "bfbfbf": "bb9adc", + "595959": "7a5ccc", + "801a1a": "5d173d", + "4cd9c1": "d04b6c", + "bd70cc": "2f386b", + "737373": "563d8f", + "f8f8f8": "d6c8f1", + "e52e2e": "903b78", + "000000": "000000", + "ffe14c": "ff8a58" + }, "2": { - "404040": "c29484", - "595959": "ecd3c3", "101010": "101010", - "287366": "832714", - "4cd9c1": "dd834c", - "3aa694": "b8552c", - "801a1a": "7c0907", - "e52e2e": "ad3419", - "bd70cc": "5b1922", - "6a3f73": "3b0c18", - "737373": "1d060c", - "8e5499": "7c2928", - "bfbfbf": "43191e", - "f8f8f8": "5a2a2b", - "ffe14c": "49ffcd", - "000000": "000000" + "404040": "c29484", + "6a3f73": "3b0c18", + "287366": "832714", + "3aa694": "b8552c", + "8e5499": "7c2928", + "bfbfbf": "43191e", + "595959": "ecd3c3", + "801a1a": "7c0907", + "4cd9c1": "dd834c", + "bd70cc": "5b1922", + "737373": "1d060c", + "f8f8f8": "5a2a2b", + "e52e2e": "ad3419", + "000000": "000000", + "ffe14c": "49ffcd" } } \ No newline at end of file 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/807.json b/public/images/pokemon/variant/exp/807.json new file mode 100644 index 00000000000..8344e88090b --- /dev/null +++ b/public/images/pokemon/variant/exp/807.json @@ -0,0 +1,36 @@ +{ + "1": { + "53e4f9": "d7a7de", + "ef8a4e": "4f7bb6", + "2759a5": "736599", + "14bdea": "c987e3", + "2394d8": "b298d8", + "31343e": "14193f", + "1f73b4": "995fc0", + "4cf4fe": "f4a7ff", + "484f57": "243058", + "000000": "ffffff", + "727678": "3e5277", + "9d682d": "3c648d", + "f9e455": "7fc7d9", + "daa936": "5a96b6", + "5bd0f2": "ebceff" + }, + "2": { + "53e4f9": "d967a2", + "ef8a4e": "834b95", + "2759a5": "a4378a", + "14bdea": "c02f8d", + "2394d8": "c05192", + "31343e": "a981b1", + "1f73b4": "9a1d82", + "4cf4fe": "e3418f", + "484f57": "cda4cb", + "000000": "ffffff", + "727678": "e8cae3", + "9d682d": "1d1044", + "f9e455": "56306f", + "daa936": "331b53", + "5bd0f2": "e17197" + } +} \ No newline at end of file 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/894.json b/public/images/pokemon/variant/exp/894.json new file mode 100644 index 00000000000..dd270f3bc0e --- /dev/null +++ b/public/images/pokemon/variant/exp/894.json @@ -0,0 +1,27 @@ +{ + "1": { + "e5ee1a": "6ad7f3", + "ff9dc2": "2c3072", + "7d542a": "2769aa", + "8eacdd": "caffd1", + "bc8b2f": "124b78", + "fffbfb": "dffff6", + "2e3967": "357b84", + "fefac7": "dffff6", + "375395": "5fcaad", + "4e7cc9": "9bf1c4", + "d7ad0d": "45a3d6" + }, + "2": { + "e5ee1a": "d4ffd0", + "ff9dc2": "382875", + "7d542a": "429877", + "8eacdd": "c693d8", + "bc8b2f": "2a6f5d", + "2e3967": "514199", + "fefac7": "ffffff", + "375395": "815bad", + "4e7cc9": "b67cd6", + "d7ad0d": "7cd395" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/895.json b/public/images/pokemon/variant/exp/895.json new file mode 100644 index 00000000000..7c37283fee7 --- /dev/null +++ b/public/images/pokemon/variant/exp/895.json @@ -0,0 +1,34 @@ +{ + "1": { + "2261ca": "561a5b", + "641e2c": "722123", + "ff92ae": "edca71", + "242e35": "512c25", + "608d99": "fae5bf", + "2b3d40": "754f47", + "76dff5": "ffe8f7", + "4b6f78": "f1d4b6", + "e05276": "ef8429", + "b63650": "bc623e", + "f27a99": "efb55a", + "872c3c": "93372d", + "3f545f": "ad8473", + "139ee1": "9b407f" + }, + "2": { + "2261ca": "640e0b", + "641e2c": "15553b", + "ff92ae": "f1ff8d", + "242e35": "0f0c1e", + "608d99": "9b7ebc", + "2b3d40": "241951", + "76dff5": "fffcdf", + "4b6f78": "5a4382", + "e05276": "8aea41", + "b63650": "3bb349", + "f27a99": "dfff75", + "872c3c": "227843", + "3f545f": "3a2a67", + "139ee1": "98301c" + } +} \ No newline at end of file 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/944.json b/public/images/pokemon/variant/exp/944.json new file mode 100644 index 00000000000..4f1707ae85c --- /dev/null +++ b/public/images/pokemon/variant/exp/944.json @@ -0,0 +1,42 @@ +{ + "1": { + "b5eab2": "75a0d0", + "d4eac7": "8bcfe5", + "bdb2bd": "53a164", + "ceceb7": "3ec295", + "726766": "4f985c", + "4a4860": "372869", + "8ce1b2": "6383c4", + "564a49": "286943", + "000000": "ffffff", + "4ca391": "3a4a8a", + "a571e6": "ffe269", + "774d9b": "d09139", + "97859b": "3f8d59", + "afc6d8": "8056a7", + "efeee1": "88eeab", + "869fad": "5e4090", + "918772": "1c9b8d", + "3a2b2f": "18493f" + }, + "2": { + "b5eab2": "a9c6dc", + "d4eac7": "e2f8ff", + "bdb2bd": "78b0c2", + "ceceb7": "abc1df", + "726766": "5386b9", + "4a4860": "4f133f", + "8ce1b2": "8397c4", + "564a49": "2c4f8a", + "000000": "ffffff", + "4ca391": "3a4a8a", + "a571e6": "4c5372", + "774d9b": "2c2c46", + "97859b": "5582a4", + "afc6d8": "c23f4f", + "efeee1": "e2f3ff", + "869fad": "902a4b", + "918772": "6777aa", + "3a2b2f": "1e3072" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/945.json b/public/images/pokemon/variant/exp/945.json new file mode 100644 index 00000000000..e22743030f9 --- /dev/null +++ b/public/images/pokemon/variant/exp/945.json @@ -0,0 +1,53 @@ +{ + "1": { + "403f4f": "357747", + "1f2635": "1c193d", + "dcdcc3": "5ddcb2", + "282434": "14463f", + "ebe4e2": "ade273", + "a491a4": "499833", + "e6e2e1": "fffbf3", + "671544": "0f4e67", + "584698": "18153d", + "134175": "a74d2a", + "4f483f": "1b727b", + "323d4a": "2e2452", + "000000": "ffffff", + "8ac2a2": "1a355d", + "d73875": "29ad89", + "e0ebf1": "7ddfee", + "2481b0": "d09139", + "4b616b": "473869", + "38bdda": "ffe269", + "695575": "16613d", + "aca699": "2db3a4", + "8d2151": "157375", + "cedaaa": "2f5b7b" + }, + "2": { + "403f4f": "3b6b9e", + "1f2635": "3b091c", + "dcdcc3": "edf0f1", + "282434": "2d427e", + "ebe4e2": "c23f4f", + "a491a4": "902a4b", + "e6e2e1": "ebf4f9", + "671544": "223969", + "584698": "1f1e43", + "134175": "1c182f", + "4f483f": "5d7487", + "323d4a": "580f1d", + "000000": "ffffff", + "a599a8": "bf888f", + "8ac2a2": "8397c4", + "7c6a84": "965b6f", + "d73875": "68adca", + "2481b0": "2c2c46", + "4b616b": "8a2029", + "38bdda": "494e64", + "695575": "4f133f", + "aca699": "acbfc7", + "8d2151": "4676aa", + "cedaaa": "bad4e8" + } +} \ No newline at end of file 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/2026.json b/public/images/pokemon/variant/exp/back/2026.json new file mode 100644 index 00000000000..5758dcc8c6c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/2026.json @@ -0,0 +1,31 @@ +{ + "1": { + "552720": "162f4b", + "ecd8b7": "b4c2a5", + "dfc043": "d17577", + "fffdfb": "d6d9ca", + "993c20": "1d3a57", + "b45f25": "2d5261", + "965821": "2f4e6b", + "e9be14": "945c7b", + "846b5b": "467f85", + "602c24": "162f4b", + "f9ed9f": "eb999a", + "e3882d": "3d7375", + "646124": "492652", + "fef443": "c48081" + }, + "2": { + "552720": "43617f", + "ecd8b7": "5a6f90", + "fffdfb": "6d8297", + "993c20": "965636", + "b45f25": "bd8551", + "965821": "9cb3ca", + "e9be14": "1a3551", + "846b5b": "202746", + "e3882d": "d3b06f", + "646124": "122140", + "fef443": "3a5873" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/2103.json b/public/images/pokemon/variant/exp/back/2103.json new file mode 100644 index 00000000000..2e97727835a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/2103.json @@ -0,0 +1,28 @@ +{ + "1": { + "2f9934": "dea44c", + "9f6b41": "426378", + "70442e": "283f5b", + "e6ac5a": "869fdc", + "522f16": "131d33", + "9cbd4a": "9977dd", + "fff68b": "a3c4ed", + "36cc36": "f4e774", + "2d5826": "c8592a", + "7b5210": "373e85", + "ffffcd": "d3efff" + }, + "2": { + "2f9934": "3d324b", + "9f6b41": "ffdbe7", + "70442e": "d59cba", + "e6ac5a": "c84e7f", + "522f16": "925b81", + "9cbd4a": "824a96", + "fff68b": "eb748d", + "36cc36": "6a5b73", + "2d5826": "1f1a31", + "7b5210": "4e1044", + "ffffcd": "ffa29d" + } +} \ No newline at end of file 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.json b/public/images/pokemon/variant/exp/back/248-mega.json index f1770cfc32f..f5b58bf5f10 100644 --- a/public/images/pokemon/variant/exp/back/248-mega.json +++ b/public/images/pokemon/variant/exp/back/248-mega.json @@ -1,13 +1,28 @@ { + "1": { + "171717": "101010", + "4a5a39": "533334", + "4b5a3b": "533334", + "727272": "727272", + "801c17": "004194", + "922d00": "004194", + "ce283d": "006fb3", + "d35200": "0098fc", + "729a62": "915957", + "739c62": "915957", + "aacb9a": "c78482" + }, "2": { - "4a5a39": "06092f", - "101010": "101010", - "accd9c": "625695", - "739c62": "2c3071", - "ffffff": "ffffff", - "6a2000": "ee7b06", - "bd3920": "ffa904", - "737373": "737373", - "000000": "000000" + "171717": "101010", + "4a5a39": "06092f", + "4b5a3b": "06092f", + "727272": "727272", + "801c17": "ee7b06", + "922d00": "ee7b06", + "ce283d": "ffa904", + "d35200": "ffa904", + "729a62": "2c3071", + "739c62": "2c3071", + "aacb9a": "625695" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/248-mega_2.json b/public/images/pokemon/variant/exp/back/248-mega_2.json deleted file mode 100644 index 7f236a6bb87..00000000000 --- a/public/images/pokemon/variant/exp/back/248-mega_2.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "248-mega_2.png", - "format": "RGBA8888", - "size": { - "w": 292, - "h": 292 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 74 - }, - "frame": { - "x": 0, - "y": 74, - "w": 80, - "h": 74 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 0, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 79, - "y": 148, - "w": 79, - "h": 74 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 0, - "w": 79, - "h": 73 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 73 - }, - "frame": { - "x": 80, - "y": 73, - "w": 79, - "h": 73 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 146, - "w": 75, - "h": 73 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 75, - "h": 73 - }, - "frame": { - "x": 158, - "y": 219, - "w": 75, - "h": 73 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 0, - "w": 73, - "h": 73 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 74 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 73, - "h": 73 - }, - "frame": { - "x": 159, - "y": 73, - "w": 73, - "h": 73 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:625e35ec9f8e731e89fa37587ffb4738:07d356e18baf0312a4e8a36adb76fdd5:90df97eb431b7162252516cb937a0b9e$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/248-mega_2.png b/public/images/pokemon/variant/exp/back/248-mega_2.png deleted file mode 100644 index 6dd5a1a7111..00000000000 Binary files a/public/images/pokemon/variant/exp/back/248-mega_2.png and /dev/null 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/359-mega.json b/public/images/pokemon/variant/exp/back/359-mega.json new file mode 100644 index 00000000000..5ae5a7477e7 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/359-mega.json @@ -0,0 +1,24 @@ +{ + "1": { + "ffffff": "61a8ab", + "414a6a": "421e4a", + "b4b4d5": "458196", + "293939": "27122b", + "525a7b": "59274e", + "d5deee": "589aa6", + "737bac": "874267", + "626283": "2a3163", + "8b8bac": "3b6987" + }, + "2": { + "ffffff": "9e363b", + "414a6a": "b39279", + "b4b4d5": "752f40", + "293939": "996e5f", + "525a7b": "e0c79f", + "d5deee": "8f2f41", + "737bac": "f5f1cb", + "626283": "42122d", + "8b8bac": "59213b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/362-mega.json b/public/images/pokemon/variant/exp/back/362-mega.json index 3eddfcb3ef0..2f3d13a6944 100644 --- a/public/images/pokemon/variant/exp/back/362-mega.json +++ b/public/images/pokemon/variant/exp/back/362-mega.json @@ -1,28 +1,26 @@ { "1": { - "000000": "010101", "393941": "050832", + "010101": "010101", "2b74a8": "84073c", - "7b7b83": "1b205d", - "ffffff": "ff937b", - "a4deff": "f9383e", - "62bdee": "b7113a", - "e6e6f6": "a2b7e5", - "c5cde6": "6076c6", + "bbeeff": "f9383e", + "7dbbee": "b7113a", + "fefefe": "ff937b", "7b7b94": "1b205d", - "acaccd": "2f3c84" + "e6e6f6": "a2b7e5", + "acaccd": "2f3c84", + "c5cde6": "6076c6" }, "2": { - "000000": "010101", "393941": "221315", + "010101": "010101", "2b74a8": "0c4b3a", - "7b7b83": "4a282a", - "ffffff": "c8ff9c", - "a4deff": "5ce11a", - "62bdee": "009325", - "e6e6f6": "a76344", - "c5cde6": "7e4a3f", + "bbeeff": "5ce11a", + "7dbbee": "009325", + "fefefe": "c8ff9c", "7b7b94": "4a282a", - "acaccd": "613735" + "e6e6f6": "a76344", + "acaccd": "613735", + "c5cde6": "7e4a3f" } } \ No newline at end of file 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/6503.json b/public/images/pokemon/variant/exp/back/6503.json new file mode 100644 index 00000000000..a977e095e71 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/6503.json @@ -0,0 +1,35 @@ +{ + "1": { + "181531": "a26579", + "fafcf9": "f6f4f4", + "84a4a7": "563785", + "a82c47": "d45b9e", + "8aa3a3": "d3a0bb", + "494a48": "3d2439", + "1d3962": "28142c", + "474a46": "2b1838", + "d75063": "b73891", + "6b1c34": "8f3396", + "1e224e": "dc95ae", + "1e5b9b": "4d244b", + "8da8a8": "a58b90", + "597471": "332a59", + "282f62": "f7d9de" + }, + "2": { + "181531": "715b72", + "fafcf9": "2c3940", + "84a4a7": "41857b", + "a82c47": "8abfb1", + "8aa3a3": "232d2e", + "494a48": "181f20", + "1d3962": "321e1e", + "474a46": "181f20", + "d75063": "8f65d8", + "6b1c34": "6d9d9a", + "1e224e": "ba9bc1", + "1e5b9b": "5e3e38", + "597471": "2a5c57", + "282f62": "efdfee" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/654.json b/public/images/pokemon/variant/exp/back/654.json index c7524e01b9a..0f3b2bf3d4e 100644 --- a/public/images/pokemon/variant/exp/back/654.json +++ b/public/images/pokemon/variant/exp/back/654.json @@ -1,34 +1,38 @@ { "1": { - "907020": "481332", - "ffe060": "a85789", - "e0ad10": "682546", - "040404": "101010", - "803020": "471b70", - "f06030": "ab6ce0", - "bf4020": "6231a5", - "202020": "262626", - "cccccc": "c093c3", - "3c3c3c": "404040", - "fdfdfd": "e7caef", - "a4583e": "6231a5", - "414141": "404040", - "606060": "5c255f" + "101010": "101010", + "736028": "061530", + "ffd659": "b55390", + "ccab47": "872b59", + "732e17": "471b70", + "f26130": "ab6ce0", + "b34724": "6231a5", + "f8f8f8": "f7e4fc", + "737373": "5c255f", + "bfbfbf": "c093c3", + "804913": "c5b3ca", + "262626": "262626", + "404040": "404040", + "f8cf52": "80f37b", + "ffc000": "4fcb61", + "ff8700": "207d4e" }, "2": { - "907020": "061530", - "ffe060": "2b5f8a", - "e0ad10": "173864", - "040404": "101010", - "803020": "005646", - "f06030": "21d170", - "bf4020": "0aaa77", - "202020": "262626", - "cccccc": "d4b996", - "3c3c3c": "404040", - "fdfdfd": "fff2dd", - "a4583e": "0aaa77", - "414141": "404040", - "606060": "75553c" + "101010": "101010", + "736028": "061530", + "ffd659": "2b5f8a", + "ccab47": "173864", + "732e17": "005646", + "f26130": "21d170", + "b34724": "0aaa77", + "f8f8f8": "fff2dd", + "737373": "75553c", + "bfbfbf": "d4b996", + "804913": "098794", + "262626": "262626", + "404040": "404040", + "f8cf52": "c858a4", + "ffc000": "75308e", + "ff8700": "521364" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/656.json b/public/images/pokemon/variant/exp/back/656.json new file mode 100644 index 00000000000..f41398f3154 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/656.json @@ -0,0 +1,24 @@ +{ + "1": { + "848496": "4d7dc5", + "7bcdff": "9c75c2", + "62ace6": "8363af", + "ffffff": "b1e5ff", + "396a83": "362864", + "9c9cc5": "5385c7", + "cdcde6": "7eb7e8", + "174592": "37408c", + "5a94cd": "7054a4" + }, + "2": { + "848496": "cc6845", + "7bcdff": "dd6155", + "62ace6": "c44848", + "ffffff": "fff4bd", + "396a83": "5c0d33", + "9c9cc5": "c96a48", + "cdcde6": "f7b785", + "174592": "198158", + "5a94cd": "a92f3f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/657.json b/public/images/pokemon/variant/exp/back/657.json new file mode 100644 index 00000000000..083a9dba0a6 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/657.json @@ -0,0 +1,24 @@ +{ + "1": { + "f8f8f8": "8dcfff", + "737373": "0f3f82", + "0b566a": "281f52", + "002c58": "1c0726", + "bfbfbf": "4386df", + "006ba6": "4e1852", + "0b4a7a": "340f3d", + "41ccf5": "7755a7", + "2896b5": "4b3578" + }, + "2": { + "f8f8f8": "fff6c7", + "737373": "df6a50", + "0b566a": "7e1628", + "002c58": "0c3b54", + "bfbfbf": "ffc996", + "006ba6": "239c91", + "0b4a7a": "156f78", + "41ccf5": "dd7355", + "2896b5": "a92f3a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/658-ash.json b/public/images/pokemon/variant/exp/back/658-ash.json new file mode 100644 index 00000000000..370d5df8081 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/658-ash.json @@ -0,0 +1,38 @@ +{ + "1": { + "265595": "432b6c", + "de3431": "3fca9f", + "f8f8f8": "a1e9f0", + "7b282e": "0e3e81", + "6b1d1d": "206d74", + "134e52": "062e3c", + "bfb169": "165e78", + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "282c35": "271f4c", + "f2798d": "8dcfff", + "268794": "1c3e58", + "3e7acc": "6b4592", + "7ddeff": "7ddcd6", + "4ebdd9": "41a7b0", + "18335c": "170738" + }, + "2": { + "265595": "cc7251", + "de3431": "9ceec6", + "f8f8f8": "89d2b8", + "7b282e": "152a5c", + "6b1d1d": "356e8d", + "134e52": "0d1e3e", + "bfb169": "4d2637", + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "282c35": "4d2637", + "f2798d": "5eb4a9", + "268794": "1c3e58", + "3e7acc": "ecbb7a", + "7ddeff": "46988d", + "4ebdd9": "2f6e74", + "18335c": "9f2727" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/658.json b/public/images/pokemon/variant/exp/back/658.json new file mode 100644 index 00000000000..c1bb4222ce4 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/658.json @@ -0,0 +1,26 @@ +{ + "1": { + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "3d61cc": "6b4592", + "fff0a6": "208698", + "2e4999": "432b6c", + "f2798d": "8dcfff", + "803340": "0e3e81", + "1b2a59": "170738", + "66d9ff": "7ddcd6", + "bfb169": "165e78" + }, + "2": { + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "3d61cc": "ecbb7a", + "fff0a6": "652240", + "2e4999": "cc7251", + "f2798d": "5eb4a9", + "803340": "152a5c", + "1b2a59": "9f2727", + "66d9ff": "48968c", + "bfb169": "431022" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/664.json b/public/images/pokemon/variant/exp/back/664.json index 65474e240f3..ae0ec9fc792 100644 --- a/public/images/pokemon/variant/exp/back/664.json +++ b/public/images/pokemon/variant/exp/back/664.json @@ -1,28 +1,26 @@ { "1": { - "797987": "9c615f", - "f9f8fa": "f9f8fa", - "000000": "000000", - "ffffff": "ffffff", - "cdcdcd": "e9c7c4", - "383830": "4c2855", - "54544e": "895a9f", - "727272": "a97dbb", - "d8a465": "838b53", - "f0d5b9": "a0c896", - "653925": "626649" + "101010": "101010", + "363636": "4c2855", + "4d4d4d": "9d6260", + "4e4e4e": "895a9f", + "747474": "a97dbb", + "855d31": "626649", + "9d7247": "838b53", + "d1bf6b": "a0c896", + "b3b3b3": "e9c7c4", + "f8f8f8": "ffffff" }, "2": { - "797987": "590015", - "f9f8fa": "c83e4c", - "000000": "000000", - "ffffff": "c83e4c", - "cdcdcd": "a70d37", - "383830": "05312f", - "54544e": "377772", - "727272": "73bdae", - "d8a465": "dda476", - "f0d5b9": "ffe0ba", - "653925": "bf8961" + "101010": "101010", + "363636": "05312f", + "4d4d4d": "590015", + "4e4e4e": "377772", + "747474": "73bdae", + "855d31": "bf8961", + "9d7247": "dda476", + "d1bf6b": "ffe0ba", + "b3b3b3": "a70d37", + "f8f8f8": "c83e4c" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/665.json b/public/images/pokemon/variant/exp/back/665.json index 876adeed0ea..c5defbab5b7 100644 --- a/public/images/pokemon/variant/exp/back/665.json +++ b/public/images/pokemon/variant/exp/back/665.json @@ -1,16 +1,30 @@ { + "1": { + "363636": "363636", + "d1bf6b": "a0c896", + "8c8c8c": "895a9f", + "bfbfbf": "a97dbb", + "9d7247": "838b53", + "101010": "101010", + "4d4d4d": "9c615f", + "b3b3b3": "e9c7c4", + "f8f8f8": "ffffff", + "802626": "005361", + "ff4c4c": "00aacd", + "eed83e": "cae2c3" + }, "2": { - "8e5136": "bf8961", - "838392": "590015", - "d8a465": "dda476", - "f0d5b9": "ffe0ba", - "cdcdcd": "a70d37", - "52524b": "360000", - "653925": "bf8961", - "000000": "000000", - "f9f8fa": "c83e4c", - "94416a": "004270", - "ee5a62": "0092dd", - "6a6a6a": "590015" + "363636": "360000", + "d1bf6b": "ffe0ba", + "8c8c8c": "590015", + "bfbfbf": "a70d37", + "9d7247": "dda476", + "101010": "101010", + "4d4d4d": "590015", + "b3b3b3": "a70d37", + "f8f8f8": "c83e4c", + "802626": "004270", + "ff4c4c": "0092dd", + "eed83e": "ffe0ba" } } \ No newline at end of file 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.json b/public/images/pokemon/variant/exp/back/666-archipelago.json new file mode 100644 index 00000000000..6386464b74e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-archipelago.json @@ -0,0 +1,35 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "c8373c": "c8373c", + "a2523b": "a2523b", + "c27351": "c27351", + "30c171": "30c171", + "b28e67": "b28e67", + "ceab62": "d9edd4", + "d2bf96": "d2bf96", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "642703", + "675220": "741300", + "504a4a": "741300", + "595959": "824719", + "707068": "a22414", + "c8373c": "c8373c", + "a2523b": "a2523b", + "c27351": "c27351", + "30c171": "30c171", + "b28e67": "b28e67", + "ceab62": "a22414", + "d2bf96": "d2bf96", + "c3c3c3": "e7caa5" + + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_2.json b/public/images/pokemon/variant/exp/back/666-archipelago_2.json deleted file mode 100644 index 8c6fd7bcb91..00000000000 --- a/public/images/pokemon/variant/exp/back/666-archipelago_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-archipelago_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223e2a75aa192f3fb67e18f7f0d6c4c7:ba854fe0d08f005e9aa52e55cdc7eb4e:80cdb6dd219378a41ccf5c2acc7e7786$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_2.png b/public/images/pokemon/variant/exp/back/666-archipelago_2.png deleted file mode 100644 index 032fd73f5c3..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-archipelago_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_3.json b/public/images/pokemon/variant/exp/back/666-archipelago_3.json deleted file mode 100644 index 3f9c86ecd75..00000000000 --- a/public/images/pokemon/variant/exp/back/666-archipelago_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-archipelago_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:223e2a75aa192f3fb67e18f7f0d6c4c7:ba854fe0d08f005e9aa52e55cdc7eb4e:80cdb6dd219378a41ccf5c2acc7e7786$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_3.png b/public/images/pokemon/variant/exp/back/666-archipelago_3.png deleted file mode 100644 index b14fc9699cb..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-archipelago_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-continental.json b/public/images/pokemon/variant/exp/back/666-continental.json new file mode 100644 index 00000000000..92614fb346c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-continental.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "595959": "724b7a", + "555353": "724b7a", + "d18257": "d18257", + "f9bd55": "f9bd55", + "303030": "402746", + "f8f05e": "f8f05e", + "d24c3e": "d24c3e", + "675220": "958c8a", + "ceab62": "d9edd4", + "707068": "a97cbc", + "504a4a": "7f6991", + "aa5844": "aa5844", + "c3c3c3": "ffeaff", + "811c1c": "811c1c", + "e08528": "e08528" + }, + "2": { + "101010": "101010", + "595959": "8f551e", + "555353": "e99b44", + "d18257": "d18257", + "f9bd55": "f9bd55", + "303030": "6d2d0d", + "f8f05e": "f8f05e", + "d24c3e": "d24c3e", + "675220": "9c5c19", + "ceab62": "e99b44", + "707068": "e99b44", + "504a4a": "9c5c19", + "aa5844": "aa5844", + "c3c3c3": "f8f27f", + "811c1c": "811c1c", + "308528": "308528" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-continental_2.json b/public/images/pokemon/variant/exp/back/666-continental_2.json deleted file mode 100644 index 371e157ff8a..00000000000 --- a/public/images/pokemon/variant/exp/back/666-continental_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-continental_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:89725e18f2e4d97217076ac82b40230b:c83c3d03ad1200fc71d95ecafb54bc03:23aaac2256d564b9d8a58d7de70397c3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-continental_2.png b/public/images/pokemon/variant/exp/back/666-continental_2.png deleted file mode 100644 index df588f7c4f5..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-continental_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-continental_3.json b/public/images/pokemon/variant/exp/back/666-continental_3.json deleted file mode 100644 index ec9c98e6312..00000000000 --- a/public/images/pokemon/variant/exp/back/666-continental_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-continental_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:89725e18f2e4d97217076ac82b40230b:c83c3d03ad1200fc71d95ecafb54bc03:23aaac2256d564b9d8a58d7de70397c3$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-continental_3.png b/public/images/pokemon/variant/exp/back/666-continental_3.png deleted file mode 100644 index 76bb3953e51..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-continental_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-elegant.json b/public/images/pokemon/variant/exp/back/666-elegant.json new file mode 100644 index 00000000000..1b7b9838005 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-elegant.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "f8de3f": "f8de3f", + "ceab62": "d9edd4", + "56479d": "56479d", + "875fb5": "875fb5", + "cf7ef3": "cf7ef3", + "c3c3c3": "c3c3c3", + "e6ddf8": "e6ddf8" + }, + "2": { + "101010": "101010", + "303030": "351262", + "675220": "7d1083", + "504a4a": "7d1083", + "595959": "612776", + "707068": "a73fab", + "de4040": "de4040", + "f8de3f": "f8de3f", + "ceab62": "a73fab", + "56479d": "56479d", + "875fb5": "875fb5", + "cf7ef3": "cf7ef3", + "c3c3c3": "f0ecff", + "e6ddf8": "e6ddf8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-elegant_2.json b/public/images/pokemon/variant/exp/back/666-elegant_2.json deleted file mode 100644 index 0894ba3672b..00000000000 --- a/public/images/pokemon/variant/exp/back/666-elegant_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-elegant_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-elegant_2.png b/public/images/pokemon/variant/exp/back/666-elegant_2.png deleted file mode 100644 index 68129e87db0..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-elegant_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-elegant_3.json b/public/images/pokemon/variant/exp/back/666-elegant_3.json deleted file mode 100644 index 20501609416..00000000000 --- a/public/images/pokemon/variant/exp/back/666-elegant_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-elegant_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 44, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 44, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bbba66d69955866664e782205a4af88d:66e99814147be780756a4d4ccd8b31dc:d6b035048c66474f6236a3bc923faa7b$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-elegant_3.png b/public/images/pokemon/variant/exp/back/666-elegant_3.png deleted file mode 100644 index d68e8977850..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-elegant_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-fancy.json b/public/images/pokemon/variant/exp/back/666-fancy.json new file mode 100644 index 00000000000..5d368667ae3 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-fancy.json @@ -0,0 +1,36 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "d9edd4", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "ffeaff", + "f2d4e3": "f2d4e3", + "ead2e3": "ffeaff" + }, + "2": { + "101010": "101010", + "303030": "00771b", + "675220": "b9c05a", + "504a4a": "b9c05a", + "595959": "6f9f42", + "707068": "6f9f42", + "de4040": "de4040", + "5faa3e": "5faa3e", + "ceab62": "e3e982", + "b6d26d": "b6d26d", + "e9e052": "e9e052", + "cf7ef3": "cf7ef3", + "c3c3c3": "fcf1ff", + "f2d4e3": "f2d4e3", + "ead2e3": "fcf1ff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-fancy_2.json b/public/images/pokemon/variant/exp/back/666-fancy_2.json deleted file mode 100644 index 5f8f29308d3..00000000000 --- a/public/images/pokemon/variant/exp/back/666-fancy_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:570d1bf9b987c1bf5ebfe39e485464dd:a3c8bebd39c1c84b1bf0fdf600026ea5:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-fancy_2.png b/public/images/pokemon/variant/exp/back/666-fancy_2.png deleted file mode 100644 index 1fce2d851f4..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-fancy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-fancy_3.json b/public/images/pokemon/variant/exp/back/666-fancy_3.json deleted file mode 100644 index c1c35bf083a..00000000000 --- a/public/images/pokemon/variant/exp/back/666-fancy_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-fancy_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:570d1bf9b987c1bf5ebfe39e485464dd:a3c8bebd39c1c84b1bf0fdf600026ea5:6d5edff9a806f43feff031c9919c9aca$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-fancy_3.png b/public/images/pokemon/variant/exp/back/666-fancy_3.png deleted file mode 100644 index 8bb80556451..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-fancy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-garden.json b/public/images/pokemon/variant/exp/back/666-garden.json new file mode 100644 index 00000000000..16fec8bc537 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-garden.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "de4040": "de4040", + "398351": "398351", + "ceab62": "d9edd4", + "88d254": "88d254", + "3f919a": "3f919a", + "3dba96": "3dba96", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "044553", + "675220": "055160", + "504a4a": "055160", + "595959": "006b55", + "707068": "227687", + "de4040": "de4040", + "398351": "398351", + "ceab62": "227687", + "88d254": "88d254", + "3f919a": "3f919a", + "3dba96": "3dba96", + "c3c3c3": "72d0a3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-garden_2.json b/public/images/pokemon/variant/exp/back/666-garden_2.json deleted file mode 100644 index 1c3840b900c..00000000000 --- a/public/images/pokemon/variant/exp/back/666-garden_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-garden_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-garden_2.png b/public/images/pokemon/variant/exp/back/666-garden_2.png deleted file mode 100644 index 547bcb72245..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-garden_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-garden_3.json b/public/images/pokemon/variant/exp/back/666-garden_3.json deleted file mode 100644 index 5fbdd2097fd..00000000000 --- a/public/images/pokemon/variant/exp/back/666-garden_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-garden_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4b2ac69ef7a99f6cef35d3fd38c74d01:8a4c29615f3bf20e9c5d0bb372a5b210:f13a1a8fa0a411aa91fccb833ac8719c$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-garden_3.png b/public/images/pokemon/variant/exp/back/666-garden_3.png deleted file mode 100644 index 8b0261631c3..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-garden_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-high-plains.json b/public/images/pokemon/variant/exp/back/666-high-plains.json new file mode 100644 index 00000000000..984055b6a24 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-high-plains.json @@ -0,0 +1,38 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "337543": "337543", + "504a4a": "7f6991", + "595959": "724b7a", + "7d4428": "7d4428", + "707068": "a97cbc", + "9a5a3b": "9a5a3b", + "aa4343": "aa4343", + "e1764e": "e1764e", + "e8c815": "e8c815", + "ceab62": "d9edd4", + "f3a861": "f3a861", + "c3c3c3": "c3c3c3", + "773d21": "773d21" + }, + "2": { + "101010": "101010", + "303030": "8f1d19", + "675220": "c97034", + "337543": "337543", + "504a4a": "c97034", + "595959": "a55422", + "7d4428": "7d4428", + "707068": "f2975a", + "9a5a3b": "9a5a3b", + "aa4343": "aa4343", + "e1764e": "e1764e", + "e8c815": "e8c815", + "ceab62": "f2975a", + "f3a861": "f3a861", + "c3c3c3": "edc67c", + "773d21": "773d21" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-high-plains_2.json b/public/images/pokemon/variant/exp/back/666-high-plains_2.json deleted file mode 100644 index 405f2657c8a..00000000000 --- a/public/images/pokemon/variant/exp/back/666-high-plains_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-high-plains_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:410c759185f779797422e8f2ce55db4f:6afd0d04b6138fdd57d12681e967b48c:2abdb5d19b2754e3daa24b6ff3ed2c2c$" - } -} \ No newline at end of file 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 deleted file mode 100644 index d656a17d3cd..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-high-plains_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-high-plains_3.json b/public/images/pokemon/variant/exp/back/666-high-plains_3.json deleted file mode 100644 index 4c91b8fb5a0..00000000000 --- a/public/images/pokemon/variant/exp/back/666-high-plains_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-high-plains_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:410c759185f779797422e8f2ce55db4f:6afd0d04b6138fdd57d12681e967b48c:2abdb5d19b2754e3daa24b6ff3ed2c2c$" - } -} \ No newline at end of file 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 deleted file mode 100644 index cc4d6aa7536..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-high-plains_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-icy-snow.json b/public/images/pokemon/variant/exp/back/666-icy-snow.json new file mode 100644 index 00000000000..ec52af1302a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-icy-snow.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "ceab62": "d9edd4", + "95a1a1": "95a1a1", + "acacc2": "acacc2", + "c3c3c3": "c3c3c3", + "cfd9cf": "cfd9cf", + "c5c5da": "c5c5da", + "ffffff": "ffffff" + }, + "2": { + "101010": "101010", + "303030": "364051", + "675220": "666b7d", + "504a4a": "666b7d", + "595959": "60646a", + "707068": "8c91a4", + "ceab62": "8c91a4", + "95a1a1": "95a1a1", + "acacc2": "acacc2", + "c3c3c3": "c3c3c3", + "cfd9cf": "cfd9cf", + "c5c5da": "c5c5da", + "ffffff": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-icy-snow_2.json b/public/images/pokemon/variant/exp/back/666-icy-snow_2.json deleted file mode 100644 index a456b34be45..00000000000 --- a/public/images/pokemon/variant/exp/back/666-icy-snow_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-icy-snow_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9f47e6de00b727163c2ffb6870af9c6b:16bfd68007c3798294c7d690e075f679:fb1e8b97806dc5c60ac6adf0ae48199b$" - } -} \ No newline at end of file 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 deleted file mode 100644 index f5b9bff1f1a..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-icy-snow_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-icy-snow_3.json b/public/images/pokemon/variant/exp/back/666-icy-snow_3.json deleted file mode 100644 index c1b2ff5791d..00000000000 --- a/public/images/pokemon/variant/exp/back/666-icy-snow_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-icy-snow_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9f47e6de00b727163c2ffb6870af9c6b:16bfd68007c3798294c7d690e075f679:fb1e8b97806dc5c60ac6adf0ae48199b$" - } -} \ No newline at end of file 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 deleted file mode 100644 index 3b9a184ff14..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-icy-snow_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-jungle.json b/public/images/pokemon/variant/exp/back/666-jungle.json new file mode 100644 index 00000000000..63b998e284e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-jungle.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "724e28": "724e28", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "567456": "567456", + "707068": "a97cbc", + "9a653e": "9a653e", + "638c63": "638c63", + "c29566": "c29566", + "ceab62": "d9edd4", + "7cc48b": "7cc48b", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "20452e", + "724e28": "724e28", + "675220": "153922", + "504a4a": "153922", + "595959": "285b3b", + "567456": "567456", + "707068": "385c43", + "9a653e": "9a653e", + "638c63": "638c63", + "c29566": "c29566", + "ceab62": "385c43", + "7cc48b": "7cc48b", + "c3c3c3": "a9d9a0" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-jungle_2.json b/public/images/pokemon/variant/exp/back/666-jungle_2.json deleted file mode 100644 index e941cffbb5e..00000000000 --- a/public/images/pokemon/variant/exp/back/666-jungle_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-jungle_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d8913bd65ce0b63c5354717532a7d60:39392afb8d9fb30f37b8d68b6cd368ad:c8686bcc5493911384853d54c85bfea1$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-jungle_2.png b/public/images/pokemon/variant/exp/back/666-jungle_2.png deleted file mode 100644 index 64465ae4644..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-jungle_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-jungle_3.json b/public/images/pokemon/variant/exp/back/666-jungle_3.json deleted file mode 100644 index 8bbc5571373..00000000000 --- a/public/images/pokemon/variant/exp/back/666-jungle_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-jungle_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d8913bd65ce0b63c5354717532a7d60:39392afb8d9fb30f37b8d68b6cd368ad:c8686bcc5493911384853d54c85bfea1$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-jungle_3.png b/public/images/pokemon/variant/exp/back/666-jungle_3.png deleted file mode 100644 index e0132ad8b7a..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-jungle_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-marine.json b/public/images/pokemon/variant/exp/back/666-marine.json new file mode 100644 index 00000000000..0bae2c2067e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-marine.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "ceab62": "d9edd4", + "315382": "315382", + "367cb9": "367cb9", + "2f8dc9": "2f8dc9", + "5acdf1": "5acdf1", + "c3c3c3": "c3c3c3", + "f2f2f2": "f2f2f2" + }, + "2": { + "101010": "101010", + "303030": "16244f", + "675220": "264c85", + "504a4a": "264c85", + "595959": "2a5894", + "707068": "3070af", + "ceab62": "3070af", + "315382": "315382", + "367cb9": "367cb9", + "2f8dc9": "2f8dc9", + "5acdf1": "5acdf1", + "c3c3c3": "3070af", + "f2f2f2": "f2f2f2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-marine_2.json b/public/images/pokemon/variant/exp/back/666-marine_2.json deleted file mode 100644 index 7f85f0176f9..00000000000 --- a/public/images/pokemon/variant/exp/back/666-marine_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-marine_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-marine_2.png b/public/images/pokemon/variant/exp/back/666-marine_2.png deleted file mode 100644 index 11f4045e000..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-marine_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-marine_3.json b/public/images/pokemon/variant/exp/back/666-marine_3.json deleted file mode 100644 index f61b5ed14a9..00000000000 --- a/public/images/pokemon/variant/exp/back/666-marine_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-marine_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b061fec5d665439da49159647e0a7d71:7cac8aa51d4531fbcf0f9ea9bf644452:dc240f0acbf3d56fe8729dd1f703009f$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-marine_3.png b/public/images/pokemon/variant/exp/back/666-marine_3.png deleted file mode 100644 index f8dbcebb2d2..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-marine_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-meadow.json b/public/images/pokemon/variant/exp/back/666-meadow.json new file mode 100644 index 00000000000..4f567cb29ee --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-meadow.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "f2f2f2": "f2f2f2", + "303030": "402746", + "504a4a": "7f6991", + "595959": "724b7a", + "c3c3c3": "c3c3c3", + "707068": "a97cbc", + "675220": "958c8a", + "ceab62": "d9edd4", + "2d9b9b": "2d9b9b", + "e66fad": "e66fad", + "b4295a": "b4295a", + "f3a0ca": "f3a0ca", + "da6b7e": "da6b7e" + }, + "2": { + "101010": "101010", + "f2f2f2": "f2f2f2", + "303030": "770921", + "504a4a": "a2275e", + "595959": "9e3941", + "c3c3c3": "f4c2ec", + "707068": "ce5283", + "675220": "a2275e", + "ceab62": "ce5283", + "2d9b9b": "2d9b9b", + "e66fad": "e66fad", + "b4295a": "b4295a", + "f3a0ca": "f3a0ca", + "da6b7e": "da6b7e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-meadow_2.json b/public/images/pokemon/variant/exp/back/666-meadow_2.json deleted file mode 100644 index 7c2cbd58134..00000000000 --- a/public/images/pokemon/variant/exp/back/666-meadow_2.json +++ /dev/null @@ -1,524 +0,0 @@ -{ - "textures": [ - { - "image": "666-meadow_2.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:49698fe6f96ff24d2fe1c7a365f79f1b:f15ccef05dfd7ebb03ac6c66ae05dcef:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-meadow_2.png b/public/images/pokemon/variant/exp/back/666-meadow_2.png deleted file mode 100644 index 3a66918a8d2..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-meadow_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-meadow_3.json b/public/images/pokemon/variant/exp/back/666-meadow_3.json deleted file mode 100644 index 6dcce66c44e..00000000000 --- a/public/images/pokemon/variant/exp/back/666-meadow_3.json +++ /dev/null @@ -1,524 +0,0 @@ -{ - "textures": [ - { - "image": "666-meadow_3.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 78, - "h": 87 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 87 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 70, - "h": 87 - }, - "frame": { - "x": 0, - "y": 87, - "w": 70, - "h": 87 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 11, - "y": 2, - "w": 63, - "h": 87 - }, - "frame": { - "x": 70, - "y": 87, - "w": 63, - "h": 87 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 57, - "h": 87 - }, - "frame": { - "x": 78, - "y": 0, - "w": 57, - "h": 87 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 84, - "h": 86 - }, - "frame": { - "x": 135, - "y": 0, - "w": 84, - "h": 86 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 52, - "h": 87 - }, - "frame": { - "x": 135, - "y": 86, - "w": 52, - "h": 87 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 84, - "h": 91 - }, - "spriteSourceSize": { - "x": 20, - "y": 0, - "w": 47, - "h": 85 - }, - "frame": { - "x": 187, - "y": 86, - "w": 47, - "h": 85 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:49698fe6f96ff24d2fe1c7a365f79f1b:f15ccef05dfd7ebb03ac6c66ae05dcef:f8ac4807b4d6eef2256fa1b93e0f89ba$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-meadow_3.png b/public/images/pokemon/variant/exp/back/666-meadow_3.png deleted file mode 100644 index 04c790e6b2b..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-meadow_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-modern.json b/public/images/pokemon/variant/exp/back/666-modern.json new file mode 100644 index 00000000000..5572a58bfa9 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-modern.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "b83c3c": "b83c3c", + "f44f4f": "f44f4f", + "ceab62": "d9edd4", + "3b6cbb": "3b6cbb", + "405793": "405793", + "c3c3c3": "c3c3c3", + "cfc5d9": "cfc5d9" + }, + "2":{ + "101010": "101010", + "303030": "4e0000", + "675220": "801521", + "504a4a": "801521", + "595959": "830012", + "707068": "ad2640", + "b83c3c": "b83c3c", + "f44f4f": "f44f4f", + "ceab62": "ad2640", + "3b6cbb": "3b6cbb", + "405793": "405793", + "c3c3c3": "ffeae8", + "cfc5d9": "cfc5d9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-modern_2.json b/public/images/pokemon/variant/exp/back/666-modern_2.json deleted file mode 100644 index 4b0ef1a8a59..00000000000 --- a/public/images/pokemon/variant/exp/back/666-modern_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-modern_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-modern_2.png b/public/images/pokemon/variant/exp/back/666-modern_2.png deleted file mode 100644 index 1e226e6b79c..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-modern_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-modern_3.json b/public/images/pokemon/variant/exp/back/666-modern_3.json deleted file mode 100644 index 78c496fc208..00000000000 --- a/public/images/pokemon/variant/exp/back/666-modern_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-modern_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:deb5b8b4295c15b4c8718bf2ed9791d1:bbe309a34a59a4e2f74eeba5769476f4:5fc0e8f9a0750c2f3cfb5d6e7eca0d45$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-modern_3.png b/public/images/pokemon/variant/exp/back/666-modern_3.png deleted file mode 100644 index 6d7516c4620..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-modern_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-monsoon.json b/public/images/pokemon/variant/exp/back/666-monsoon.json new file mode 100644 index 00000000000..915d471b2b1 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-monsoon.json @@ -0,0 +1,33 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "807676": "807676", + "ceab62": "d9edd4", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "3d3231", + "675220": "2c3593", + "504a4a": "2c3593", + "595959": "4f4645", + "707068": "5857bc", + "807676": "807676", + "ceab62": "5857bc", + "5676de": "5676de", + "4eccd6": "4eccd6", + "989898": "989898", + "92f4f4": "92f4f4", + "c3c3c3": "b8f9f9", + "f0f0f8": "f0f0f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_2.json b/public/images/pokemon/variant/exp/back/666-monsoon_2.json deleted file mode 100644 index 344344ec0b2..00000000000 --- a/public/images/pokemon/variant/exp/back/666-monsoon_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-monsoon_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_2.png b/public/images/pokemon/variant/exp/back/666-monsoon_2.png deleted file mode 100644 index 7570e6a7bfe..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-monsoon_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_3.json b/public/images/pokemon/variant/exp/back/666-monsoon_3.json deleted file mode 100644 index 4f7304f6c0c..00000000000 --- a/public/images/pokemon/variant/exp/back/666-monsoon_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-monsoon_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 42, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 42, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 42, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 42, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a24b11bc54be921b67b4376d798e05:f5358aac113e1f7af7eddf984d9692b3:637bea52b465abfb8e5a576310b4dacc$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_3.png b/public/images/pokemon/variant/exp/back/666-monsoon_3.png deleted file mode 100644 index 6e9314cde1f..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-monsoon_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-ocean.json b/public/images/pokemon/variant/exp/back/666-ocean.json new file mode 100644 index 00000000000..70e7a51c21f --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-ocean.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "e1384d": "e1384d", + "ebcf3f": "ebcf3f", + "ceab62": "d9edd4", + "f4ad61": "f4ad61", + "f8ef6a": "f8ef6a", + "4482c9": "4482c9", + "6bb2e9": "6bb2e9", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "b54908", + "675220": "bc601c", + "504a4a": "bc601c", + "595959": "e99a26", + "707068": "ea8742", + "e1384d": "e1384d", + "ebcf3f": "ebcf3f", + "ceab62": "ea8742", + "f4ad61": "f4ad61", + "f8ef6a": "f8ef6a", + "4482c9": "4482c9", + "6bb2e9": "6bb2e9", + "c3c3c3": "f3c86b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-ocean_2.json b/public/images/pokemon/variant/exp/back/666-ocean_2.json deleted file mode 100644 index d5bb27bf592..00000000000 --- a/public/images/pokemon/variant/exp/back/666-ocean_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-ocean_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-ocean_2.png b/public/images/pokemon/variant/exp/back/666-ocean_2.png deleted file mode 100644 index f8757bc7547..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-ocean_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-ocean_3.json b/public/images/pokemon/variant/exp/back/666-ocean_3.json deleted file mode 100644 index 4ca1832c359..00000000000 --- a/public/images/pokemon/variant/exp/back/666-ocean_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-ocean_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1a0079c64e9d91336d227b1380cd9d2:cf159e4653ad9208c0f4633a498a6cd1:e7a0e68eab89c2013a3eb7f3b6fc0b33$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-ocean_3.png b/public/images/pokemon/variant/exp/back/666-ocean_3.png deleted file mode 100644 index 77b839e4326..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-ocean_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball.json b/public/images/pokemon/variant/exp/back/666-poke-ball.json new file mode 100644 index 00000000000..e21ba03fc1e --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-poke-ball.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "971d1d": "971d1d", + "b72c2c": "b72c2c", + "dc4b4b": "dc4b4b", + "e97e7e": "e97e7e", + "ceab62": "d9edd4", + "a9a99e": "a9a99e", + "c3c3c3": "c3c3c3", + "f8f8f8": "f8f8f8" + }, + "2": { + "101010": "101010", + "303030": "ae001a", + "675220": "a70038", + "504a4a": "a70038", + "595959": "df0036", + "707068": "d5375a", + "971d1d": "040046", + "b72c2c": "00005e", + "dc4b4b": "19007d", + "e97e7e": "2e2095", + "ceab62": "d5375a", + "a9a99e": "000050", + "c3c3c3": "f0a6bf", + "f8f8f8": "00006d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_2.json b/public/images/pokemon/variant/exp/back/666-poke-ball_2.json deleted file mode 100644 index 99da9b9ac29..00000000000 --- a/public/images/pokemon/variant/exp/back/666-poke-ball_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file 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 deleted file mode 100644 index caaf61118bc..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-poke-ball_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_3.json b/public/images/pokemon/variant/exp/back/666-poke-ball_3.json deleted file mode 100644 index de222894738..00000000000 --- a/public/images/pokemon/variant/exp/back/666-poke-ball_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-poke-ball_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e744396a3b647429d050d678017c05ce:ec812f719dffcd362f0481d7d83c3476:8ec14f129d1691b8da504a13b661abed$" - } -} \ No newline at end of file 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 deleted file mode 100644 index 944f53eb4aa..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-poke-ball_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-polar.json b/public/images/pokemon/variant/exp/back/666-polar.json new file mode 100644 index 00000000000..f86b4df3dcc --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-polar.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "2d2d61": "2d2d61", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "ceab62": "d9edd4", + "3b4b8a": "3b4b8a", + "4d6cc1": "4d6cc1", + "6aa2dc": "6aa2dc", + "bfbfbf": "bfbfbf", + "c3c3c3": "c3c3c3", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "191b54", + "675220": "366098", + "2d2d61": "2d2d61", + "504a4a": "366098", + "595959": "2f3887", + "707068": "5f85c1", + "ceab62": "5f85c1", + "3b4b8a": "3b4b8a", + "4d6cc1": "4d6cc1", + "6aa2dc": "6aa2dc", + "bfbfbf": "bfbfbf", + "c3c3c3": "ffffff", + "f0f0f8": "f0f0f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-polar_2.json b/public/images/pokemon/variant/exp/back/666-polar_2.json deleted file mode 100644 index e30095c2299..00000000000 --- a/public/images/pokemon/variant/exp/back/666-polar_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-polar_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3b0453f2d03b9c62472f57a438298a4:81a5a3455ae0c378bdb1dbe3c3323463:eb7086e98f867c6592e4b161835da18b$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-polar_2.png b/public/images/pokemon/variant/exp/back/666-polar_2.png deleted file mode 100644 index e8d5a056bb3..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-polar_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-polar_3.json b/public/images/pokemon/variant/exp/back/666-polar_3.json deleted file mode 100644 index 76df03f7d08..00000000000 --- a/public/images/pokemon/variant/exp/back/666-polar_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-polar_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 14, - "y": 1, - "w": 45, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 45, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3b0453f2d03b9c62472f57a438298a4:81a5a3455ae0c378bdb1dbe3c3323463:eb7086e98f867c6592e4b161835da18b$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-polar_3.png b/public/images/pokemon/variant/exp/back/666-polar_3.png deleted file mode 100644 index 131d702ddb1..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-polar_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-river.json b/public/images/pokemon/variant/exp/back/666-river.json new file mode 100644 index 00000000000..c7e5e288d05 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-river.json @@ -0,0 +1,40 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "4a412c": "4a412c", + "675220": "958c8a", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "7f6991", + "595959": "724b7a", + "625841": "625841", + "707068": "a97cbc", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "c3c3c3", + "d2a862": "d9edd4" + }, + "2": { + "101010": "101010", + "303030": "7b2800", + "4a412c": "4a412c", + "675220": "ae7f41", + "634d20": "634d20", + "1d726a": "1d726a", + "504a4a": "ae7f41", + "595959": "8a5702", + "625841": "625841", + "707068": "d9a666", + "bc813f": "bc813f", + "9c9143": "9c9143", + "ceab62": "ceab62", + "279ec2": "279ec2", + "59c9d3": "59c9d3", + "c3c3c3": "e3c384", + "d2a862": "d2a862" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-river_2.json b/public/images/pokemon/variant/exp/back/666-river_2.json deleted file mode 100644 index 4edb4a188f8..00000000000 --- a/public/images/pokemon/variant/exp/back/666-river_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-river_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2bb6d375761e6690eba12cf4d2bc99c9:9db30ec1cf68fe8c1026c243086573f3:fa23dc87fc53ba2cfa532cf440553cf5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-river_2.png b/public/images/pokemon/variant/exp/back/666-river_2.png deleted file mode 100644 index 97ce9b85139..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-river_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-river_3.json b/public/images/pokemon/variant/exp/back/666-river_3.json deleted file mode 100644 index 69623e13034..00000000000 --- a/public/images/pokemon/variant/exp/back/666-river_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-river_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2bb6d375761e6690eba12cf4d2bc99c9:9db30ec1cf68fe8c1026c243086573f3:fa23dc87fc53ba2cfa532cf440553cf5$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-river_3.png b/public/images/pokemon/variant/exp/back/666-river_3.png deleted file mode 100644 index c84413aaaaf..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-river_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm.json b/public/images/pokemon/variant/exp/back/666-sandstorm.json new file mode 100644 index 00000000000..6bc91afb34d --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-sandstorm.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "625843": "625843", + "72604d": "72604d", + "707068": "a97cbc", + "9b9148": "9b9148", + "ba8d68": "ba8d68", + "ceab62": "d9edd4", + "d9b674": "d9b674", + "f1d69e": "f1d69e", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "443123", + "675220": "9c703b", + "504a4a": "9c703b", + "595959": "88583e", + "625843": "625843", + "72604d": "72604d", + "707068": "c6975f", + "9b9148": "9b9148", + "ba8d68": "ba8d68", + "ceab62": "c6975f", + "d9b674": "d9b674", + "f1d69e": "f1d69e", + "c3c3c3": "ece1a9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_2.json b/public/images/pokemon/variant/exp/back/666-sandstorm_2.json deleted file mode 100644 index 5651485f6d0..00000000000 --- a/public/images/pokemon/variant/exp/back/666-sandstorm_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-sandstorm_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 0, - "w": 40, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 68, - "w": 40, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e35abed8cd9d0bbf1556fa684995d930:8d765a06a769bbf3d1639f361548cd6f:12f47e779927411662912d6094a9782d$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_2.png b/public/images/pokemon/variant/exp/back/666-sandstorm_2.png deleted file mode 100644 index 541d183dc62..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-sandstorm_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_3.json b/public/images/pokemon/variant/exp/back/666-sandstorm_3.json deleted file mode 100644 index d43381578cb..00000000000 --- a/public/images/pokemon/variant/exp/back/666-sandstorm_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-sandstorm_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 0, - "w": 40, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 17, - "y": 2, - "w": 40, - "h": 68 - }, - "frame": { - "x": 67, - "y": 68, - "w": 40, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e35abed8cd9d0bbf1556fa684995d930:8d765a06a769bbf3d1639f361548cd6f:12f47e779927411662912d6094a9782d$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_3.png b/public/images/pokemon/variant/exp/back/666-sandstorm_3.png deleted file mode 100644 index 393e47eb747..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-sandstorm_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-savanna.json b/public/images/pokemon/variant/exp/back/666-savanna.json new file mode 100644 index 00000000000..c261f52dced --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-savanna.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "dcc433": "dcc433", + "ceab62": "d9edd4", + "3b67ac": "3b67ac", + "61a0f5": "61a0f5", + "55d3d9": "55d3d9", + "6cc6c6": "6cc6c6", + "fffd77": "fffd77", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "183576", + "675220": "1d828b", + "504a4a": "1d828b", + "595959": "4168bb", + "707068": "4faab3", + "dcc433": "dcc433", + "ceab62": "4faab3", + "fffd77": "fffd77", + "3b67ac": "3b67ac", + "61a0f5": "61a0f5", + "55d3d9": "55d3d9", + "6cc6c6": "6cc6c6", + "c3c3c3": "81e7e1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-savanna_2.json b/public/images/pokemon/variant/exp/back/666-savanna_2.json deleted file mode 100644 index c1f73f6efc7..00000000000 --- a/public/images/pokemon/variant/exp/back/666-savanna_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-savanna_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1ad0c7c841409c3fd4cb50b399d6e13c:b9406b41d37bc72c57260f9a01a352c8:625a4f0dc001069326a75c6a381f93e6$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-savanna_2.png b/public/images/pokemon/variant/exp/back/666-savanna_2.png deleted file mode 100644 index dea05ede882..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-savanna_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-savanna_3.json b/public/images/pokemon/variant/exp/back/666-savanna_3.json deleted file mode 100644 index 49ab66f6855..00000000000 --- a/public/images/pokemon/variant/exp/back/666-savanna_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-savanna_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1ad0c7c841409c3fd4cb50b399d6e13c:b9406b41d37bc72c57260f9a01a352c8:625a4f0dc001069326a75c6a381f93e6$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-savanna_3.png b/public/images/pokemon/variant/exp/back/666-savanna_3.png deleted file mode 100644 index bc2366e3483..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-savanna_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-sun.json b/public/images/pokemon/variant/exp/back/666-sun.json new file mode 100644 index 00000000000..21cf5787ba4 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-sun.json @@ -0,0 +1,34 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "c94971": "c94971", + "e18248": "e18248", + "ceab62": "d9edd4", + "f1a26a": "f1a26a", + "f0ce44": "f0ce44", + "fcf372": "fcf372", + "f47491": "f47491", + "c3c3c3": "c3c3c3" + }, + "2": { + "101010": "101010", + "303030": "640000", + "675220": "8c1850", + "504a4a": "8c1850", + "595959": "750500", + "707068": "b83b74", + "c94971": "c94971", + "e18248": "e18248", + "ceab62": "b83b74", + "f1a26a": "f1a26a", + "f0ce44": "f0ce44", + "fcf372": "fcf372", + "f47491": "f47491", + "c3c3c3": "fee3e7" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sun_2.json b/public/images/pokemon/variant/exp/back/666-sun_2.json deleted file mode 100644 index d7c995a1bc0..00000000000 --- a/public/images/pokemon/variant/exp/back/666-sun_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-sun_2.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1d3a140bac5951725915aa0b64d1fdc6:e322510cf8386dcc7834a05d57e5368e:8f5fdd0a698701f5391c5a3f67e303d6$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sun_2.png b/public/images/pokemon/variant/exp/back/666-sun_2.png deleted file mode 100644 index 32737f852e6..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-sun_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-sun_3.json b/public/images/pokemon/variant/exp/back/666-sun_3.json deleted file mode 100644 index a3f755a4e7c..00000000000 --- a/public/images/pokemon/variant/exp/back/666-sun_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-sun_3.png", - "format": "RGBA8888", - "size": { - "w": 137, - "h": 137 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 67, - "y": 0, - "w": 43, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 15, - "y": 1, - "w": 43, - "h": 69 - }, - "frame": { - "x": 0, - "y": 68, - "w": 43, - "h": 69 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 43, - "y": 69, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1d3a140bac5951725915aa0b64d1fdc6:e322510cf8386dcc7834a05d57e5368e:8f5fdd0a698701f5391c5a3f67e303d6$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-sun_3.png b/public/images/pokemon/variant/exp/back/666-sun_3.png deleted file mode 100644 index d1679b936e1..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-sun_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-tundra.json b/public/images/pokemon/variant/exp/back/666-tundra.json new file mode 100644 index 00000000000..b098f776c00 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/666-tundra.json @@ -0,0 +1,32 @@ +{ + "1": { + "101010": "101010", + "303030": "402746", + "675220": "958c8a", + "504a4a": "7f6991", + "595959": "724b7a", + "707068": "a97cbc", + "ceab62": "d9edd4", + "539ad9": "539ad9", + "74bbe9": "74bbe9", + "a3def1": "a3def1", + "c3c3c3": "c3c3c3", + "d0d0d0": "d0d0d0", + "f0f0f8": "f0f0f8" + }, + "2": { + "101010": "101010", + "303030": "003d69", + "675220": "3a76a7", + "504a4a": "3a76a7", + "595959": "225b72", + "707068": "659dd0", + "ceab62": "659dd0", + "539ad9": "539ad9", + "74bbe9": "74bbe9", + "a3def1": "a3def1", + "c3c3c3": "cbfbfb", + "d0d0d0": "d0d0d0", + "f0f0f8": "f0f0f8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-tundra_2.json b/public/images/pokemon/variant/exp/back/666-tundra_2.json deleted file mode 100644 index 3d8ae45a641..00000000000 --- a/public/images/pokemon/variant/exp/back/666-tundra_2.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-tundra_2.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:40f74f8757cb0f5a2ab7b5f68ea979a0:d062f67571674668b47f6fab68361105:9779ed3adebc298af537dd64dc25fe00$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-tundra_2.png b/public/images/pokemon/variant/exp/back/666-tundra_2.png deleted file mode 100644 index 7311852570a..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-tundra_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/666-tundra_3.json b/public/images/pokemon/variant/exp/back/666-tundra_3.json deleted file mode 100644 index 65be2910a02..00000000000 --- a/public/images/pokemon/variant/exp/back/666-tundra_3.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "textures": [ - { - "image": "666-tundra_3.png", - "format": "RGBA8888", - "size": { - "w": 136, - "h": 136 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 13, - "y": 1, - "w": 46, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 0, - "w": 67, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 67, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 67, - "h": 68 - }, - "frame": { - "x": 46, - "y": 68, - "w": 67, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:40f74f8757cb0f5a2ab7b5f68ea979a0:d062f67571674668b47f6fab68361105:9779ed3adebc298af537dd64dc25fe00$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/666-tundra_3.png b/public/images/pokemon/variant/exp/back/666-tundra_3.png deleted file mode 100644 index 3d1d40ca2a2..00000000000 Binary files a/public/images/pokemon/variant/exp/back/666-tundra_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/676.json b/public/images/pokemon/variant/exp/back/676.json new file mode 100644 index 00000000000..7e64f6b0f61 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/676.json @@ -0,0 +1,21 @@ +{ + "1": { + "f2f2da": "8a1d1d", + "3f6273": "2b040f", + "595350": "788087", + "736b67": "a6afb3", + "ccccb8": "5e0f16", + "66665c": "2b040f", + "a6a695": "42090e" + }, + "2": { + "cc2929": "3a240e", + "f2f2da": "c18960", + "3f6273": "4a281b", + "595350": "e6c594", + "736b67": "ffe6ac", + "ccccb8": "a4624a", + "66665c": "4a281b", + "a6a695": "805145" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/682.json b/public/images/pokemon/variant/exp/back/682.json new file mode 100644 index 00000000000..bc2111153cf --- /dev/null +++ b/public/images/pokemon/variant/exp/back/682.json @@ -0,0 +1,21 @@ +{ + "1": { + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "7f4d59": "20644e", + "4d4d4d": "a6a6a6" + }, + "2": { + "4f4c4f": "332539", + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "7f4d59": "a23812", + "e5e5e5": "6b4767", + "4d4d4d": "503851", + "737373": "422f46" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/683.json b/public/images/pokemon/variant/exp/back/683.json new file mode 100644 index 00000000000..9d7f4682b9a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/683.json @@ -0,0 +1,20 @@ +{ + "1": { + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "404040": "2c283b", + "7f4d59": "20644e", + "bf5f9f": "7c48a1" + }, + "2": { + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "404040": "2a2234", + "7f4d59": "a23812", + "bf5f9f": "f0ebdd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/684.json b/public/images/pokemon/variant/exp/back/684.json new file mode 100644 index 00000000000..25de3aa838f --- /dev/null +++ b/public/images/pokemon/variant/exp/back/684.json @@ -0,0 +1,22 @@ +{ + "1": { + "805963": "2d0c42", + "553a41": "8f1d15", + "ffccd9": "8961c6", + "cc99a6": "613b84", + "fff2f2": "f39f62", + "5e4048": "260b37", + "ccadad": "df6b40", + "7b5760": "b13924" + }, + "2": { + "805963": "6796aa", + "553a41": "1d1426", + "ffccd9": "cbf6da", + "cc99a6": "93d6ce", + "fff2f2": "746998", + "5e4048": "52718e", + "ccadad": "4b4876", + "7b5760": "3c2f51" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/685.json b/public/images/pokemon/variant/exp/back/685.json new file mode 100644 index 00000000000..a144e0d45ff --- /dev/null +++ b/public/images/pokemon/variant/exp/back/685.json @@ -0,0 +1,26 @@ +{ + "1": { + "f8f8f8": "caff90", + "661a2d": "13391c", + "805963": "2d0c42", + "ffccd9": "8961c6", + "ff8ca9": "8dbe6d", + "cc99a6": "613b84", + "e53964": "689b52", + "fff2f2": "f39f62", + "ccadad": "df6b40", + "a62949": "26592b" + }, + "2": { + "f8f8f8": "e4819d", + "661a2d": "26061b", + "805963": "679baa", + "ffccd9": "cbf6da", + "ff8ca9": "8c4264", + "cc99a6": "93d6ce", + "e53964": "612747", + "fff2f2": "746998", + "ccadad": "4b4876", + "a62949": "441838" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/688.json b/public/images/pokemon/variant/exp/back/688.json new file mode 100644 index 00000000000..e3d15e60fed --- /dev/null +++ b/public/images/pokemon/variant/exp/back/688.json @@ -0,0 +1,30 @@ +{ + "1": { + "bfeaff": "e8d37b", + "f2f2f2": "e8e5c6", + "5b8da6": "a9582e", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "70240f", + "b3b3b3": "d3bc8c", + "ffac59": "70cccf", + "85b4cc": "cd8a50", + "997e2e": "4557b5", + "cc8a47": "459aac", + "66541f": "373295" + }, + "2": { + "bfeaff": "a74083", + "f2f2f2": "d1ec8c", + "5b8da6": "4b0038", + "595959": "4d6a09", + "403410": "1e1324", + "3f6273": "2c052a", + "b3b3b3": "94c268", + "ffac59": "4a376e", + "85b4cc": "731f5c", + "997e2e": "f6eefc", + "cc8a47": "332149", + "66541f": "ba9fba" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/689.json b/public/images/pokemon/variant/exp/back/689.json new file mode 100644 index 00000000000..6c47b57f35b --- /dev/null +++ b/public/images/pokemon/variant/exp/back/689.json @@ -0,0 +1,31 @@ +{ + "1": { + "cc7f70": "459aac", + "f2f2f2": "e8e5c6", + "5b8da6": "8d5030", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "672e1e", + "b3b3b3": "d3bc8c", + "bfeaff": "e8d37b", + "85b4cc": "cd8a50", + "ff9f8c": "70cccf", + "66541f": "373295", + "997e2e": "4557b5" + }, + "2": { + "cc7f70": "332149", + "f2f2f2": "caea77", + "5b8da6": "4b0038", + "595959": "2a5524", + "403410": "3f2a4b", + "3f6273": "3e073b", + "b3b3b3": "7eac4e", + "bfeaff": "a74083", + "85b4cc": "731f5c", + "f8f8f8": "dbaf67", + "ff9f8c": "4a376e", + "66541f": "ccb6cc", + "997e2e": "f6eefc" + } +} \ No newline at end of file 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.json b/public/images/pokemon/variant/exp/back/697.json index 61a5f16551b..5303995a117 100644 --- a/public/images/pokemon/variant/exp/back/697.json +++ b/public/images/pokemon/variant/exp/back/697.json @@ -1,37 +1,34 @@ { - "1": { - "080808":"080808", - "621e1d":"0b241e", - "902f2d":"153626", - "b45250":"285234", - "653510":"5e0b0b", - "b56827":"971c1c", - "e39f33":"b52424", - "46413f":"4c3216", - "766c67":"ad8c63", - "adaaae":"cbbe8c", - "f0f0f2":"dfdea7", - "3d3937":"ab8a61", - "786d68":"cfc28f", - "afacb0":"c9bd8b", - "ededf0":"e0dfa8" - }, - "2": { - "080808":"080808", - "621e1d":"52352f", - "902f2d":"83726e", - "b45250":"ab9b97", - "653510":"9d5390", - "b56827":"ce7ecc", - "e39f33":"f4dbf6", - "46413f":"170c25", - "766c67":"26173b", - "adaaae":"33214f", - "f0f0f2":"4b2e64", - "3d3937":"c97bc7", - "786d68":"e5a9ea", - "afacb0":"d180ce", - "ededf0":"ededf0" - } + +"1": { +"080808": "080808", +"32252c": "3e1e17", +"50131e": "0b241e", +"722533": "153626", +"54434c": "4c3216", +"964b1c": "5e0b0b", +"963e4e": "285234", +"bf7545": "971c1c", +"f19d5a": "b52424", +"9f9d98": "ad8c63", +"cccccc": "cbbe8c", +"fafafa": "dfdea7", +"53454d":"4c3216" +}, +"2": { +"080808": "080808", +"32252c": "0d0124", +"50131e": "573b36", +"722533": "83726e", +"54434c": "170c25", +"964b1c": "9d5390", +"963e4e": "ab9b97", +"bf7545": "ce7ecc", +"f19d5a": "f4dbf6", +"9f9d98": "26173b", +"cccccc": "33214f", +"fafafa": "4b2e64", +"53454d": "f4dbf6" +} } 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/700.json b/public/images/pokemon/variant/exp/back/700.json index 4b65fb00405..1189d463f2b 100644 --- a/public/images/pokemon/variant/exp/back/700.json +++ b/public/images/pokemon/variant/exp/back/700.json @@ -1,26 +1,32 @@ { - "1": { - "107090": "c72537", - "af4f6f": "452f89", - "7fcfdf": "ff9a68", - "ffaebb": "c7a6ee", - "101010": "101010", - "807070": "5c6889", - "ef6f8f": "996cd2", - "ffffff": "f7f5ff", - "ddcccc": "c3c5d9", - "6f8faf": "eb5244" - }, - "2": { - "107090": "c72537", - "af4f6f": "197d46", - "7fcfdf": "ff9a68", - "ffaebb": "7dec9d", - "101010": "101010", - "807070": "7f5c89", - "ef6f8f": "5dae7d", - "ffffff": "fff5fc", - "ddcccc": "d9c3d6", - "6f8faf": "eb5244" - } +"1": { +"101010": "101010", +"8a2843": "452f89", +"235a99": "a63071", +"895c72": "5c6889", +"d85a7a": "996cd2", +"528fcc": "d648b7", +"a88d8c": "8c8fa8", +"f18a78": "b52d27", +"fa8caa": "c7a6ee", +"64c8f3": "e974db", +"d9c3c3": "c3c5d9", +"fff5f5": "f7f5ff", +"65798c": "65798c" +}, +"2": { +"101010": "101010", +"8a2843": "0e6134", +"235a99": "900d1b", +"895c72": "7f5c89", +"d85a7a": "5dae7d", +"528fcc": "dd3d4f", +"a88d8c": "7f5c89", +"f18a78": "d14ea4", +"fa8caa": "7dec9d", +"64c8f3": "ff9a68", +"d9c3c3": "d9c3d6", +"fff5f5": "fff5fc", +"65798c": "65798c" +} } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/702.json b/public/images/pokemon/variant/exp/back/702.json index a5bb32bb790..12feb29a0fd 100644 --- a/public/images/pokemon/variant/exp/back/702.json +++ b/public/images/pokemon/variant/exp/back/702.json @@ -1,22 +1,32 @@ { "1": { "101010": "101010", - "4d4d4d": "6789b3", "262626": "2a3b5e", + "4d4d4d": "6789b3", + "bfbf86": "a3d1cc", + "f2f2aa": "ddfff5", "735c2e": "a53c42", + "997a3d": "c9685f", "f2c261": "ffd3b6", "bf994c": "e49f84", - "997a3d": "c9685f", - "000000": "000000" + "1d1d1d": "1a1c45", + "f8f8f8": "f8f8f8", + "464646": "424b8f", + "d97d21": "7cd6a1" }, "2": { "101010": "101010", - "4d4d4d": "197870", "262626": "072d38", + "4d4d4d": "197870", + "bfbf86": "aaa8d6", + "f2f2aa": "ece5ff", "735c2e": "1e0e27", + "997a3d": "2d1533", "f2c261": "5f3662", "bf994c": "432249", - "997a3d": "2d1533", - "000000": "000000" + "1d1d1d": "02172d", + "f8f8f8": "f8f8f8", + "464646": "17646c", + "d97d21": "d2fff1" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/704.json b/public/images/pokemon/variant/exp/back/704.json index 179c06d54ac..1955f425b26 100644 --- a/public/images/pokemon/variant/exp/back/704.json +++ b/public/images/pokemon/variant/exp/back/704.json @@ -1,26 +1,30 @@ { "1": { - "766fa6": "7d699d", - "010202": "101010", - "6f5e80": "4e4094", - "e0d3e0": "fbb3d2", - "bbafc4": "da75a5", - "2f6b38": "033c55", - "a497c2": "da75a5", - "74d457": "348fa6", - "3da84d": "185d83", - "3f3d5e": "033c55" + "807380": "b93f84", + "f2daf2": "fbb3d2", + "bfacbf": "e56ca6", + "4d454d": "8a2166", + "101010": "101010", + "4d993d": "197497", + "66cc52": "3aa8c4", + "b8a1e5": "c7a1e5", + "8f7db3": "8b69c3", + "665980": "4e4094", + "de817e": "e5e1a1", + "c25054": "c68260" }, "2": { - "766fa6": "2f5d6f", - "010202": "101010", - "6f5e80": "274159", - "e0d3e0": "92d8c8", - "bbafc4": "5f8d86", - "2f6b38": "681b00", - "a497c2": "5f8d86", - "74d457": "bb7935", - "3da84d": "a34205", - "3f3d5e": "681b00" + "807380": "237e7f", + "f2daf2": "92d8c8", + "bfacbf": "63a99e", + "4d454d": "134557", + "101010": "101010", + "4d993d": "a34205", + "66cc52": "d27e26", + "b8a1e5": "4a9699", + "8f7db3": "2f667c", + "665980": "274159", + "de817e": "f2daf2", + "c25054": "9268a4" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/705.json b/public/images/pokemon/variant/exp/back/705.json index 93f270c6976..72dd07123ea 100644 --- a/public/images/pokemon/variant/exp/back/705.json +++ b/public/images/pokemon/variant/exp/back/705.json @@ -1,28 +1,26 @@ { "1": { - "807380": "b93f84", - "f2daf2": "fbb3d2", - "101010": "101010", - "4d454d": "8a2166", - "bfacbf": "ca719c", - "66cc52": "197497", - "b6f2aa": "197497", - "4d993d": "0c5474", - "665980": "4e4094", - "b8a1e5": "c7a1e5", - "8f7db3": "8b69c3" + "101010": "101010", + "4d454d": "8a2166", + "647543": "197497", + "98bd51": "3aa8c4", + "665980": "4e4094", + "807380": "b93f84", + "8f7db3": "8b69c3", + "bfacbf": "e56ca6", + "b8a1e5": "c7a1e5", + "f2daf2": "fbb3d2" }, "2": { - "807380": "20615e", - "f2daf2": "9cead8", - "101010": "101010", - "4d454d": "124143", - "bfacbf": "4e9b8f", - "66cc52": "a34205", - "b6f2aa": "a34205", - "4d993d": "842401", - "665980": "274159", - "b8a1e5": "4a9699", - "8f7db3": "2f667c" + "101010": "101010", + "4d454d": "194f51", + "647543": "a34205", + "98bd51": "d27e26", + "665980": "274159", + "807380": "2b736f", + "8f7db3": "2f667c", + "bfacbf": "5db6a9", + "b8a1e5": "4a9699", + "f2daf2": "9cead8" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/713.json b/public/images/pokemon/variant/exp/back/713.json index 8c54b0ab776..61977f60470 100644 --- a/public/images/pokemon/variant/exp/back/713.json +++ b/public/images/pokemon/variant/exp/back/713.json @@ -1,22 +1,22 @@ { "1": { - "6994bf": "bf566d", - "f2ffff": "ffebf2", - "335980": "994255", + "608cba": "bf566d", "967acc": "732334", - "77b8d9": "d97389", "85d7f2": "f29eb3", "bff4ff": "ffbfda", + "335980": "994255", + "f2ffff": "ffebf2", + "77b8d9": "d97389", "101010": "101010" }, "2": { - "6994bf": "a8632a", - "f2ffff": "fff2ad", - "335980": "824628", + "608cba": "a8632a", "967acc": "2c7a75", - "77b8d9": "cc7b1e", "85d7f2": "e69e2b", "bff4ff": "fcc95c", + "335980": "824628", + "f2ffff": "fff2ad", + "77b8d9": "cc7b1e", "101010": "101010" } } \ No newline at end of file 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/807.json b/public/images/pokemon/variant/exp/back/807.json new file mode 100644 index 00000000000..aff6a52c9b2 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/807.json @@ -0,0 +1,38 @@ +{ + "1": { + "53e4f9": "eac1eb", + "ef8a4e": "4f7bb6", + "2759a5": "736599", + "5bd0f2": "ebceff", + "2394d8": "b298d8", + "31343e": "14193f", + "1f73b4": "995fc0", + "4cf4fe": "f4a7ff", + "484f57": "243058", + "daa936": "5c96b4", + "727678": "3e5277", + "30cff1": "d7a7de", + "f9e455": "80c7d7", + "000000": "ffffff", + "9d682d": "3d648c", + "14bdea": "c987e3" + }, + "2": { + "53e4f9": "e688af", + "ef8a4e": "844c94", + "2759a5": "a3378a", + "5bd0f2": "df7298", + "2394d8": "be5293", + "31343e": "a880b0", + "1f73b4": "9a1d82", + "4cf4fe": "e3418f", + "484f57": "cba3ca", + "daa936": "351d53", + "727678": "e7c9e2", + "30cff1": "d967a2", + "f9e455": "58326f", + "000000": "ffffff", + "9d682d": "1f1144", + "14bdea": "c02f8d" + } +} \ No newline at end of file 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/894.json b/public/images/pokemon/variant/exp/back/894.json new file mode 100644 index 00000000000..276133a842a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/894.json @@ -0,0 +1,24 @@ +{ + "1": { + "e5ee1a": "6ad7f3", + "7d542a": "2769aa", + "bc8b2f": "124b78", + "8eacdd": "caffd1", + "2e3967": "357b84", + "fefac7": "dffff6", + "375395": "5fcaad", + "4e7cc9": "9bf1c4", + "d7ad0d": "45a3d6" + }, + "2": { + "e5ee1a": "d4ffd0", + "7d542a": "429877", + "bc8b2f": "2a6f5d", + "8eacdd": "c693d8", + "2e3967": "514199", + "fefac7": "ffffff", + "375395": "815bad", + "4e7cc9": "b67cd6", + "d7ad0d": "7cd395" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/895.json b/public/images/pokemon/variant/exp/back/895.json new file mode 100644 index 00000000000..d6859edafb3 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/895.json @@ -0,0 +1,28 @@ +{ + "1": { + "641e2c": "722123", + "b63650": "bc623e", + "608d99": "fae5bf", + "2b3d40": "754f47", + "4b6f78": "f1d4b6", + "e05276": "ef8429", + "f27a99": "efb55a", + "ff92ae": "edca71", + "3f545f": "ad8473", + "872c3c": "93372d", + "242e35": "512c25" + }, + "2": { + "641e2c": "15553b", + "b63650": "3bb349", + "608d99": "9b7ebc", + "2b3d40": "241951", + "4b6f78": "5a4382", + "e05276": "8aea41", + "f27a99": "dfff75", + "ff92ae": "f1ff8d", + "3f545f": "3a2a67", + "872c3c": "227843", + "242e35": "0f0c1e" + } +} \ No newline at end of file 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/944.json b/public/images/pokemon/variant/exp/back/944.json new file mode 100644 index 00000000000..6de6bc5e833 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/944.json @@ -0,0 +1,34 @@ +{ + "1": { + "403f4f": "33784a", + "dcdcc3": "88eeab", + "484441": "286943", + "282434": "16402d", + "2f2826": "18493f", + "774d9b": "d09139", + "8095a8": "5e4090", + "e6e2e1": "53a164", + "a599a8": "3f8d59", + "211e28": "103833", + "bbd2e3": "8056a7", + "aca699": "3ec295", + "000000": "ffffff", + "6c5c4d": "1c9b8d" + }, + "2": { + "403f4f": "395d87", + "dcdcc3": "e2f3ff", + "484441": "2c4f8a", + "282434": "1d2f5b", + "2f2826": "1e3072", + "774d9b": "4c5372", + "8095a8": "902a4b", + "e6e2e1": "78b0c2", + "a599a8": "5582a4", + "211e28": "17255b", + "bbd2e3": "c23f4f", + "aca699": "abc1df", + "000000": "ffffff", + "6c5c4d": "6777aa" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/945.json b/public/images/pokemon/variant/exp/back/945.json new file mode 100644 index 00000000000..6590d0b67ed --- /dev/null +++ b/public/images/pokemon/variant/exp/back/945.json @@ -0,0 +1,43 @@ +{ + "1": { + "403f4f": "357747", + "1f2635": "1c193d", + "dcdcc3": "5ddcb2", + "282434": "14463f", + "a491a4": "499833", + "e6e2e1": "fffbf3", + "671544": "0f4e67", + "134175": "a74d2a", + "4f483f": "1b727b", + "323d4a": "2e2452", + "000000": "ffffff", + "4b616b": "473869", + "d73875": "29ad89", + "2481b0": "d09139", + "38bdda": "ffe269", + "695575": "16613d", + "aca699": "2db3a4", + "8d2151": "157375" + }, + "2": { + "403f4f": "3b6b9e", + "1f2635": "3b091c", + "dcdcc3": "edf0f1", + "282434": "2d427e", + "a491a4": "902a4b", + "e6e2e1": "ebf4f9", + "671544": "223969", + "134175": "1c182f", + "4f483f": "5d7487", + "323d4a": "580f1d", + "000000": "ffffff", + "4b616b": "8a2029", + "a599a8": "bf888f", + "d73875": "68adca", + "2481b0": "2c2c46", + "38bdda": "494e64", + "695575": "4f133f", + "aca699": "acbfc7", + "8d2151": "4676aa" + } +} \ No newline at end of file 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/exp/back/987.json b/public/images/pokemon/variant/exp/back/987.json index 385a9eeb29f..5fb59f6979d 100644 --- a/public/images/pokemon/variant/exp/back/987.json +++ b/public/images/pokemon/variant/exp/back/987.json @@ -8,7 +8,7 @@ "0f0f0f": "0f0f0f", "314a62": "244260", "621841": "71370f", - "70bbb4": "f8d371", + "548e88": "2d60bb", "de62a4": "ffc668", "a4295a": "cc762f" }, @@ -21,7 +21,7 @@ "0f0f0f": "0f0f0f", "314a62": "7396b4", "621841": "7b3c08", - "70bbb4": "70bbb4", + "548e88": "a9c0c6", "de62a4": "ffdf90", "a4295a": "e28c27" }, @@ -34,7 +34,7 @@ "0f0f0f": "0f0f0f", "314a62": "b56f2a", "621841": "5a0a05", - "70bbb4": "f8d371", + "548e88": "e0b544", "de62a4": "e25038", "a4295a": "a62a21" } diff --git a/public/images/pokemon/variant/exp/back/female/6215.json b/public/images/pokemon/variant/exp/back/female/6215.json new file mode 100644 index 00000000000..a66e3780d12 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/female/6215.json @@ -0,0 +1,32 @@ +{ + "1": { + "724ca2": "12968b", + "9c9bce": "ae8976", + "503678": "0f5d6d", + "956cbe": "31dabb", + "514a80": "402010", + "dcdbf7": "d0b3a4", + "080808": "080808", + "28234b": "220d0a", + "7d6ca4": "672e26", + "584d80": "401914", + "f6f6ff": "f6f6ff", + "bdbdc5": "bdbdc5", + "c52973": "ea903f" + }, + "2": { + "724ca2": "982e33", + "9c9bce": "3c8775", + "503678": "601522", + "956cbe": "cc5427", + "514a80": "14273a", + "dcdbf7": "60ae7e", + "080808": "080808", + "28234b": "0a191e", + "7d6ca4": "395962", + "584d80": "1c3942", + "f6f6ff": "f6f6ff", + "bdbdc5": "bdbdc5", + "c52973": "f49633" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/female/6215.json b/public/images/pokemon/variant/exp/female/6215.json new file mode 100644 index 00000000000..3198424563b --- /dev/null +++ b/public/images/pokemon/variant/exp/female/6215.json @@ -0,0 +1,38 @@ +{ + "1": { + "503678": "0f5d6d", + "080808": "080808", + "514a80": "402010", + "956cbe": "31dabb", + "9c9bce": "ae8976", + "724ca2": "12968b", + "dcdbf7": "d0b3a4", + "7d6ca4": "853a36", + "c58b08": "6e6f6f", + "ffde7b": "a7a7a7", + "584d80": "562627", + "28234b": "220d0a", + "c52973": "ea903f", + "bdbdc5": "bdbdc5", + "f6f6ff": "f6f6ff", + "000000": "000000" + }, + "2": { + "503678": "601522", + "080808": "080808", + "514a80": "14273a", + "956cbe": "cc5427", + "9c9bce": "3c8775", + "724ca2": "982e33", + "dcdbf7": "60ae7e", + "7d6ca4": "395962", + "c58b08": "ffa341", + "ffde7b": "ffe07e", + "584d80": "1c3942", + "28234b": "0a191e", + "c52973": "f49633", + "bdbdc5": "bdbdc5", + "f6f6ff": "f6f6ff", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/154.json b/public/images/pokemon/variant/female/154.json new file mode 100644 index 00000000000..c02d214d834 --- /dev/null +++ b/public/images/pokemon/variant/female/154.json @@ -0,0 +1,30 @@ +{ + "1": { + "634a00": "6da0df", + "f7a59c": "3c88ac", + "e6ad00": "90c6f8", + "ff3a5a": "234d81", + "ffde21": "b9e2ff", + "ce213a": "192e5e", + "63bd42": "9d86d9", + "bdff7b": "dadffe", + "7b103a": "111c44", + "107b31": "8057b2", + "fefefe": "a6f5af", + "9ce652": "b7afee" + }, + "2": { + "634a00": "144627", + "f7a59c": "ddf2b5", + "e6ad00": "1e632b", + "ff3a5a": "9ed662", + "ffde21": "288028", + "ce213a": "81c65c", + "63bd42": "a31f60", + "bdff7b": "f57382", + "7b103a": "59ac45", + "107b31": "761858", + "fefefe": "f6ffdf", + "9ce652": "cd3b6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/194.json b/public/images/pokemon/variant/female/194.json new file mode 100644 index 00000000000..5824dec5029 --- /dev/null +++ b/public/images/pokemon/variant/female/194.json @@ -0,0 +1,24 @@ +{ + "1": { + "104a84": "7a150a", + "b54242": "1a6a62", + "ff6b73": "4db983", + "633a6b": "09484f", + "3a7bc5": "d5682e", + "ef73e6": "44d77f", + "73bdff": "ffc355", + "529ce6": "e8983d", + "d65ad6": "2ea380" + }, + "2": { + "104a84": "180d42", + "b54242": "8a9fc2", + "ff6b73": "e8faff", + "633a6b": "444c7e", + "3a7bc5": "3f377e", + "ef73e6": "e8faff", + "73bdff": "5c66c4", + "529ce6": "564daa", + "d65ad6": "aeccdf" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/195.json b/public/images/pokemon/variant/female/195.json new file mode 100644 index 00000000000..ff25261d120 --- /dev/null +++ b/public/images/pokemon/variant/female/195.json @@ -0,0 +1,25 @@ +{ + "1": { + "ade6ff": "f6dfa8", + "84d6f7": "ed9e4f", + "f7f7f7": "fffbea", + "637ba5": "816251", + "639cbd": "dc6a4d", + "3194a5": "44d77f", + "425284": "b03844", + "195a6b": "2ea380", + "6b5a8c": "1b5a55" + }, + "2": { + "ade6ff": "9864c2", + "84d6f7": "724ba7", + "f7f7f7": "e8b6ff", + "637ba5": "504a8a", + "639cbd": "493a8d", + "3194a5": "ebf5ff", + "19423a": "747aae", + "425284": "240830", + "195a6b": "aebbdf", + "6b5a8c": "5e649b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/198.json b/public/images/pokemon/variant/female/198.json new file mode 100644 index 00000000000..b0386502899 --- /dev/null +++ b/public/images/pokemon/variant/female/198.json @@ -0,0 +1,34 @@ +{ + "1": { + "d94352": "b3986b", + "314263": "462b20", + "d64252": "7a101c", + "73293a": "4d0419", + "ffad8c": "ad2e24", + "73283a": "630c17", + "d6404f": "8c1b23", + "efd684": "a6a6b3", + "42639c": "694c30", + "5a4a21": "25253b", + "292942": "2a1512", + "b59c21": "57566f", + "752a3c": "755237", + "d6bd52": "838098" + }, + "2": { + "d94352": "bc4b84", + "314263": "0e4333", + "d64252": "5939a9", + "73293a": "1e1764", + "ffad8c": "b164e6", + "73283a": "630c17", + "d6404f": "8c1b23", + "efd684": "c2723a", + "42639c": "1d6e47", + "5a4a21": "4e1915", + "292942": "091e16", + "b59c21": "85412d", + "752a3c": "7b2363", + "d6bd52": "9a5524" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/212.json b/public/images/pokemon/variant/female/212.json new file mode 100644 index 00000000000..55fcc0858ac --- /dev/null +++ b/public/images/pokemon/variant/female/212.json @@ -0,0 +1,41 @@ +{ + "0": { + "632929": "215a2d", + "f76b6b": "8cce73", + "101010": "101010", + "3a3a4a": "3a3a4a", + "ffffff": "ffffff", + "d63a3a": "4a9c53", + "b5b5ce": "b5b5ce", + "9494a5": "9494a5", + "a52929": "2f794e", + "dec510": "dec510", + "9c6b21": "9c6b21" + }, + "1": { + "632929": "2f2962", + "f76b6b": "639cf7", + "101010": "101010", + "3a3a4a": "3c3c50", + "ffffff": "ffffff", + "d63a3a": "4263ef", + "b5b5ce": "b5b5ce", + "9494a5": "6262a4", + "a52929": "29429c", + "dec510": "10bdde", + "9c6b21": "131387" + }, + "2": { + "632929": "645117", + "f76b6b": "c59f29", + "101010": "101010", + "3a3a4a": "282d2c", + "ffffff": "ffffff", + "d63a3a": "ffca2a", + "b5b5ce": "b5b5ce", + "9494a5": "3c4543", + "a52929": "b88619", + "dec510": "dec510", + "9c6b21": "9c6b21" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-beauty-cosplay.json b/public/images/pokemon/variant/female/25-beauty-cosplay.json new file mode 100644 index 00000000000..0e5a6a1bad2 --- /dev/null +++ b/public/images/pokemon/variant/female/25-beauty-cosplay.json @@ -0,0 +1,49 @@ +{ + "1": { + "c52119": "ad4e76", + "5e5e6b": "6c6e60", + "f7e652": "a3d1a8", + "52525a": "4f454c", + "cecab9": "cfc8aa", + "e65137": "c95578", + "fffabf": "f4f7ab", + "b52821": "ad4469", + "292929": "1e1526", + "39509d": "47449c", + "f7e860": "f2ea50", + "e65a42": "cf6182", + "4d88c4": "7976c6", + "f7bd21": "79b5a5", + "2d276d": "2f2768", + "242323": "282030", + "585861": "443e6c", + "fff7a5": "c4e3c3", + "9c5200": "315c75", + "f7cc2f": "f7bd21", + "fffdea": "f8ffe3" + }, + "2": { + "c52119": "ebc67c", + "5e5e6b": "8a2554", + "f7e652": "577b98", + "52525a": "f1b571", + "cecab9": "b84084", + "e65137": "b95b6e", + "fffabf": "f5efd1", + "b52821": "6a253f", + "292929": "a45233", + "39509d": "9ec4cd", + "f7e860": "eddc78", + "e65a42": "eedd9c", + "4d88c4": "e4f6f1", + "f7bd21": "486689", + "2d276d": "454a61", + "242323": "282030", + "585861": "3f4246", + "fff7a5": "7b96aa", + "9c5200": "283361", + "965b0e": "96500e", + "f7cc2f": "d5ac44", + "fffdea": "ea82a6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-cool-cosplay.json b/public/images/pokemon/variant/female/25-cool-cosplay.json new file mode 100644 index 00000000000..de4a138b690 --- /dev/null +++ b/public/images/pokemon/variant/female/25-cool-cosplay.json @@ -0,0 +1,49 @@ +{ + "1": { + "171717": "2a1d36", + "e8b127": "f5ca2f", + "52525a": "55555e", + "c52119": "ad4e76", + "842222": "7b1f18", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "2baf23": "76a848", + "f7bd21": "79b5a5", + "e65a42": "cf6182", + "ba2b23": "b73850", + "f5e193": "f4f7ab", + "e66953": "b95b6e", + "6f6c8e": "656f86", + "a6adb6": "a5b0b6", + "8c4e22": "965b0e", + "9c5200": "1c4f75", + "c43129": "6a253f", + "d95b45": "cf6887", + "45484d": "443e6c", + "3b3b40": "4a3e46", + "292929": "272b2b" + }, + "2": { + "171717": "a45233", + "e8b127": "e7b432", + "52525a": "8f4b32", + "c52119": "ebc67c", + "842222": "1e1e43", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "2baf23": "572626", + "f7bd21": "445f8a", + "e65a42": "eedd9c", + "ba2b23": "2c2c47", + "f5e193": "eadbb3", + "e66953": "b95b6e", + "6f6c8e": "cf752b", + "a6adb6": "f0b541", + "8c4e22": "b1632b", + "9c5200": "22325c", + "c43129": "6a253f", + "d95b45": "3a3f5e", + "3b3b40": "f1b571", + "292929": "7d3833" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-cosplay.json b/public/images/pokemon/variant/female/25-cosplay.json new file mode 100644 index 00000000000..e324c094019 --- /dev/null +++ b/public/images/pokemon/variant/female/25-cosplay.json @@ -0,0 +1,36 @@ +{ + "1": { + "f7e652": "a3d1a8", + "212121": "30263b", + "c43129": "6a253f", + "171717": "1e1526", + "292929": "282030", + "e65a42": "cf6182", + "c52119": "ad4e76", + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "45454a": "4f454c", + "9c5200": "315c75", + "633108": "09406b", + "e66953": "b95b6e", + "de9400": "338087" + }, + "2": { + "f7e652": "577b98", + "212121": "d8805b", + "c43129": "6a253f", + "171717": "a45233", + "292929": "282030", + "e65a42": "eedd9c", + "c52119": "ebc67c", + "42424a": "3f4246", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "45454a": "f1b571", + "9c5200": "23345e", + "633108": "22244f", + "e66953": "b95b6e", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-cute-cosplay.json b/public/images/pokemon/variant/female/25-cute-cosplay.json new file mode 100644 index 00000000000..26bebb4143d --- /dev/null +++ b/public/images/pokemon/variant/female/25-cute-cosplay.json @@ -0,0 +1,43 @@ +{ + "1": { + "212121": "30263b", + "e65a42": "cf6182", + "fff7a5": "c4e3c3", + "45454a": "4f454c", + "c52119": "ad4e76", + "9c5200": "255e8a", + "752bd0": "5452b7", + "f3bace": "f2bbbb", + "f7e652": "a3d1a8", + "ea82a6": "e8848e", + "e66953": "b95b6e", + "853247": "85323c", + "c43129": "6a253f", + "baa998": "bab699", + "42424a": "443e6c", + "fff9ba": "f0eaa8", + "f7bd21": "79b5a5", + "cf4770": "cf4a59" + }, + "2": { + "212121": "d8805b", + "e65a42": "eedd9c", + "fff7a5": "7b96aa", + "45454a": "f1b571", + "c52119": "ebc67c", + "9c5200": "1e2d52", + "752bd0": "7751c2", + "f3bace": "c5cc85", + "f7e652": "577b98", + "ea82a6": "a4b95f", + "e66953": "b95b6e", + "171717": "a45233", + "853247": "254b30", + "c43129": "6a253f", + "baa998": "d3ab5a", + "42424a": "373d45", + "fff9ba": "ebe7b7", + "f7bd21": "445f8a", + "cf4770": "739b55" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-partner.json b/public/images/pokemon/variant/female/25-partner.json new file mode 100644 index 00000000000..0542587ba6d --- /dev/null +++ b/public/images/pokemon/variant/female/25-partner.json @@ -0,0 +1,36 @@ +{ + "1": { + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "de9400": "338087", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "e66953": "b95b6e", + "45454a": "4f454c", + "292929": "282030", + "c43129": "6a253f", + "212121": "30263b", + "171717": "1e1526", + "f7bd21": "79b5a5", + "9c5200": "315c75", + "633108": "09406b" + }, + "2": { + "42424a": "3f4246", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "de9400": "324472", + "e65a42": "eedd9c", + "f7e652": "577b98", + "e66953": "b95b6e", + "45454a": "f1b571", + "292929": "282030", + "c43129": "6a253f", + "212121": "d8805b", + "171717": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e", + "633108": "22244f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-smart-cosplay.json b/public/images/pokemon/variant/female/25-smart-cosplay.json new file mode 100644 index 00000000000..4ba98883f16 --- /dev/null +++ b/public/images/pokemon/variant/female/25-smart-cosplay.json @@ -0,0 +1,42 @@ +{ + "1": { + "212121": "30263b", + "b7a599": "bab699", + "60b553": "76a848", + "366635": "3e5b2f", + "e35252": "d16b9a", + "c52119": "ad4e76", + "292929": "272b2b", + "9c5200": "315c75", + "f7e652": "a3d1a8", + "95635b": "91685f", + "171717": "1e1526", + "ba2525": "993f70", + "e65a42": "cf6182", + "54545c": "55555e", + "52525a": "4f454c", + "fffdea": "f8ffe3", + "f7bd21": "79b5a5", + "5f3434": "573b38" + }, + "2": { + "212121": "d8805b", + "b7a599": "a7b6b9", + "60b553": "dfb053", + "366635": "ab5130", + "e35252": "3a3f5e", + "c52119": "ebc67c", + "292929": "202937", + "9c5200": "23345e", + "f7e652": "577b98", + "95635b": "a09ea3", + "171717": "a45233", + "ba2525": "2b2b45", + "e65a42": "eedd9c", + "54545c": "45525c", + "52525a": "f1b571", + "fffdea": "f2f0df", + "f7bd21": "445f8a", + "5f3434": "666060" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-tough-cosplay.json b/public/images/pokemon/variant/female/25-tough-cosplay.json new file mode 100644 index 00000000000..620ac882643 --- /dev/null +++ b/public/images/pokemon/variant/female/25-tough-cosplay.json @@ -0,0 +1,43 @@ +{ + "1": { + "e37511": "d1694f", + "bf2629": "bf3638", + "303030": "30263b", + "b8282b": "753652", + "8d2b1d": "8e2525", + "424242": "443e6c", + "c52119": "ad4e76", + "292929": "1e1526", + "f7bd21": "79b5a5", + "fbab33": "de9764", + "db4a37": "ad4c60", + "e65a42": "cf6182", + "9c5200": "315c75", + "db5b42": "cf6a59", + "52525a": "4f454c", + "cecab9": "cfc8aa", + "f7e652": "a3d1a8" + }, + "2": { + "e37511": "644794", + "bf2629": "8e6fa1", + "f8ffe3": "e8e3e4", + "303030": "d8805b", + "b8282b": "6a253f", + "8d2b1d": "242866", + "424242": "3f4246", + "c52119": "e8be68", + "292929": "a45233", + "f7bd21": "445f8a", + "fbab33": "845ea1", + "db4a37": "b95b6e", + "e65a42": "edda8c", + "9c5200": "23345e", + "db5b42": "624780", + "52525a": "f1b571", + "4d4d4d": "2b3340", + "272b2b": "162231", + "cecab9": "cfc0c3", + "f7e652": "577b98" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25.json b/public/images/pokemon/variant/female/25.json new file mode 100644 index 00000000000..0542587ba6d --- /dev/null +++ b/public/images/pokemon/variant/female/25.json @@ -0,0 +1,36 @@ +{ + "1": { + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "de9400": "338087", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "e66953": "b95b6e", + "45454a": "4f454c", + "292929": "282030", + "c43129": "6a253f", + "212121": "30263b", + "171717": "1e1526", + "f7bd21": "79b5a5", + "9c5200": "315c75", + "633108": "09406b" + }, + "2": { + "42424a": "3f4246", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "de9400": "324472", + "e65a42": "eedd9c", + "f7e652": "577b98", + "e66953": "b95b6e", + "45454a": "f1b571", + "292929": "282030", + "c43129": "6a253f", + "212121": "d8805b", + "171717": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e", + "633108": "22244f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/26.json b/public/images/pokemon/variant/female/26.json new file mode 100644 index 00000000000..40921512c4b --- /dev/null +++ b/public/images/pokemon/variant/female/26.json @@ -0,0 +1,39 @@ +{ + "1": { + "101010": "000000", + "ffefd6": "c8d4ba", + "bd1908": "ad4e76", + "944242": "643034", + "bd5a31": "386d82", + "e6bd84": "a4bda7", + "ffbd00": "b3596b", + "5a2929": "293059", + "3a3a42": "30263b", + "8c6310": "8c3c4c", + "ffde5a": "cf7878", + "8d5911": "983e50", + "734231": "6e2f33", + "63636b": "4f454c", + "de7b31": "539190", + "f7ad29": "76a68b", + "643034": "395a80" + }, + "2": { + "101010": "000000", + "ffefd6": "cfc4b5", + "542127": "905331", + "bd1908": "a44c5d", + "944242": "2e4685", + "bd5a31": "375681", + "e6bd84": "a6b5ab", + "ffbd00": "f3cf91", + "5a2929": "202a60", + "8c6310": "c79b5a", + "ffde5a": "f2e4b6", + "8d5911": "dea96e", + "734231": "bd8447", + "de7b31": "4d6f98", + "f7ad29": "6385ab", + "643034": "2d3b80" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/3.json b/public/images/pokemon/variant/female/3.json index 515cd2e93e5..de2c52f6003 100644 --- a/public/images/pokemon/variant/female/3.json +++ b/public/images/pokemon/variant/female/3.json @@ -1,19 +1,41 @@ { + "1": { + "843100": "033b22", + "830009": "23033b", + "ffbdbd": "a266b0", + "ffef52": "37d6de", + "debd29": "078a8f", + "ff7b73": "712f8f", + "bd6b31": "168a69", + "de4242": "3f1375", + "101010": "101010", + "105242": "190038", + "107b6b": "9e1976", + "2e5519": "38001c", + "5a9c3a": "b34952", + "5ad6c5": "f062a4", + "21b59c": "de3592", + "84de7b": "ff745e", + "ffffff": "ffffff" + }, "2": { "843100": "420514", - "ff7b73": "9db042", + "830009": "154205", "ffbdbd": "e7e385", "ffef52": "f75ea8", "debd29": "a30a66", + "ff7b73": "9db042", "bd6b31": "852a41", "de4242": "3c8227", "101010": "101010", "105242": "381601", - "107b6b": "d44300", + "107b6b": "d15d04", + "2e5519": "011c38", "5a9c3a": "446b94", - "84de7b": "80ced9", "5ad6c5": "faa405", "21b59c": "fa8405", - "ffffff": "ffffff" + "84de7b": "80ced9", + "ffffff": "ffffff", + "2f561a": "011b34" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/female/3_2.json b/public/images/pokemon/variant/female/3_2.json deleted file mode 100644 index 8c89faed762..00000000000 --- a/public/images/pokemon/variant/female/3_2.json +++ /dev/null @@ -1,4136 +0,0 @@ -{ - "textures": [ - { - "image": "3_2.png", - "format": "RGBA8888", - "size": { - "w": 569, - "h": 569 - }, - "scale": 1, - "frames": [ - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 81, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 81, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 81, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 81, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 81, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 162, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 162, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 162, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 81, - "h": 66 - }, - "frame": { - "x": 162, - "y": 0, - "w": 81, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 243, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 243, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 243, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 243, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 243, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 324, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 324, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 324, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 324, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 405, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 405, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 486, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 486, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 67 - }, - "frame": { - "x": 486, - "y": 0, - "w": 81, - "h": 67 - } - }, - { - "filename": "0172.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 0, - "y": 66, - "w": 81, - "h": 67 - } - }, - { - "filename": "0173.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 0, - "y": 66, - "w": 81, - "h": 67 - } - }, - { - "filename": "0190.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 84, - "h": 67 - }, - "frame": { - "x": 81, - "y": 66, - "w": 84, - "h": 67 - } - }, - { - "filename": "0191.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 84, - "h": 67 - }, - "frame": { - "x": 81, - "y": 66, - "w": 84, - "h": 67 - } - }, - { - "filename": "0192.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 84, - "h": 67 - }, - "frame": { - "x": 81, - "y": 66, - "w": 84, - "h": 67 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 165, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 165, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 165, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 165, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 165, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 246, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 246, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 246, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 246, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 246, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 327, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 327, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 327, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 327, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 408, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 408, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 408, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 408, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 408, - "y": 67, - "w": 81, - "h": 68 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 80, - "h": 68 - }, - "frame": { - "x": 489, - "y": 67, - "w": 80, - "h": 68 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 80, - "h": 68 - }, - "frame": { - "x": 489, - "y": 67, - "w": 80, - "h": 68 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 0, - "y": 133, - "w": 81, - "h": 68 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 0, - "y": 133, - "w": 81, - "h": 68 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 0, - "y": 133, - "w": 81, - "h": 68 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 0, - "y": 133, - "w": 81, - "h": 68 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 0, - "y": 133, - "w": 81, - "h": 68 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 84, - "h": 68 - }, - "frame": { - "x": 81, - "y": 133, - "w": 84, - "h": 68 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 84, - "h": 68 - }, - "frame": { - "x": 81, - "y": 133, - "w": 84, - "h": 68 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 84, - "h": 68 - }, - "frame": { - "x": 165, - "y": 135, - "w": 84, - "h": 68 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 84, - "h": 68 - }, - "frame": { - "x": 165, - "y": 135, - "w": 84, - "h": 68 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 84, - "h": 68 - }, - "frame": { - "x": 165, - "y": 135, - "w": 84, - "h": 68 - } - }, - { - "filename": "0174.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 249, - "y": 135, - "w": 81, - "h": 68 - } - }, - { - "filename": "0175.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 81, - "h": 68 - }, - "frame": { - "x": 249, - "y": 135, - "w": 81, - "h": 68 - } - }, - { - "filename": "0188.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 84, - "h": 68 - }, - "frame": { - "x": 330, - "y": 135, - "w": 84, - "h": 68 - } - }, - { - "filename": "0189.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 84, - "h": 68 - }, - "frame": { - "x": 330, - "y": 135, - "w": 84, - "h": 68 - } - }, - { - "filename": "0193.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 83, - "h": 68 - }, - "frame": { - "x": 414, - "y": 135, - "w": 83, - "h": 68 - } - }, - { - "filename": "0194.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 83, - "h": 68 - }, - "frame": { - "x": 414, - "y": 135, - "w": 83, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 81, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 81, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 81, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 81, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 81, - "y": 201, - "w": 81, - "h": 69 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 162, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 162, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 162, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 162, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 162, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 243, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 243, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 243, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 243, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 243, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 324, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 324, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 324, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 324, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 324, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 405, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 405, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 405, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 405, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 69 - }, - "frame": { - "x": 486, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 69 - }, - "frame": { - "x": 486, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 69 - }, - "frame": { - "x": 486, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 69 - }, - "frame": { - "x": 486, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 81, - "h": 69 - }, - "frame": { - "x": 486, - "y": 203, - "w": 81, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 270, - "w": 81, - "h": 69 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 270, - "w": 81, - "h": 69 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 270, - "w": 81, - "h": 69 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 270, - "w": 81, - "h": 69 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 0, - "y": 270, - "w": 81, - "h": 69 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 81, - "y": 270, - "w": 81, - "h": 69 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 81, - "h": 69 - }, - "frame": { - "x": 81, - "y": 270, - "w": 81, - "h": 69 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 80, - "h": 69 - }, - "frame": { - "x": 162, - "y": 272, - "w": 80, - "h": 69 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 80, - "h": 69 - }, - "frame": { - "x": 162, - "y": 272, - "w": 80, - "h": 69 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 83, - "h": 69 - }, - "frame": { - "x": 242, - "y": 272, - "w": 83, - "h": 69 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 83, - "h": 69 - }, - "frame": { - "x": 242, - "y": 272, - "w": 83, - "h": 69 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 80, - "h": 69 - }, - "frame": { - "x": 325, - "y": 272, - "w": 80, - "h": 69 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 80, - "h": 69 - }, - "frame": { - "x": 325, - "y": 272, - "w": 80, - "h": 69 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 81, - "h": 69 - }, - "frame": { - "x": 405, - "y": 272, - "w": 81, - "h": 69 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 81, - "h": 69 - }, - "frame": { - "x": 405, - "y": 272, - "w": 81, - "h": 69 - } - }, - { - "filename": "0171.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 81, - "h": 69 - }, - "frame": { - "x": 405, - "y": 272, - "w": 81, - "h": 69 - } - }, - { - "filename": "0176.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 80, - "h": 69 - }, - "frame": { - "x": 486, - "y": 272, - "w": 80, - "h": 69 - } - }, - { - "filename": "0177.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 80, - "h": 69 - }, - "frame": { - "x": 486, - "y": 272, - "w": 80, - "h": 69 - } - }, - { - "filename": "0178.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 80, - "h": 69 - }, - "frame": { - "x": 486, - "y": 272, - "w": 80, - "h": 69 - } - }, - { - "filename": "0195.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 82, - "h": 69 - }, - "frame": { - "x": 0, - "y": 339, - "w": 82, - "h": 69 - } - }, - { - "filename": "0196.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 82, - "h": 69 - }, - "frame": { - "x": 0, - "y": 339, - "w": 82, - "h": 69 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 80, - "h": 70 - }, - "frame": { - "x": 82, - "y": 339, - "w": 80, - "h": 70 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 80, - "h": 70 - }, - "frame": { - "x": 82, - "y": 339, - "w": 80, - "h": 70 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 80, - "h": 70 - }, - "frame": { - "x": 82, - "y": 339, - "w": 80, - "h": 70 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 243, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 243, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 243, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 243, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 324, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 324, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 324, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 324, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 486, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 486, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 486, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 486, - "y": 341, - "w": 81, - "h": 70 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 0, - "y": 408, - "w": 81, - "h": 70 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 0, - "y": 408, - "w": 81, - "h": 70 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 0, - "y": 408, - "w": 81, - "h": 70 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 0, - "y": 408, - "w": 81, - "h": 70 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 0, - "y": 408, - "w": 81, - "h": 70 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 81, - "y": 409, - "w": 81, - "h": 70 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 81, - "y": 409, - "w": 81, - "h": 70 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 81, - "y": 409, - "w": 81, - "h": 70 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 81, - "y": 409, - "w": 81, - "h": 70 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 81, - "y": 409, - "w": 81, - "h": 70 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 162, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 243, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 243, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 243, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 243, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 70 - }, - "frame": { - "x": 324, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 70 - }, - "frame": { - "x": 324, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 70 - }, - "frame": { - "x": 324, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 70 - }, - "frame": { - "x": 324, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 81, - "h": 70 - }, - "frame": { - "x": 324, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0181.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0182.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 405, - "y": 411, - "w": 81, - "h": 70 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 70 - }, - "frame": { - "x": 486, - "y": 411, - "w": 83, - "h": 70 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 70 - }, - "frame": { - "x": 486, - "y": 411, - "w": 83, - "h": 70 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 0, - "y": 478, - "w": 81, - "h": 70 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 81, - "h": 70 - }, - "frame": { - "x": 0, - "y": 478, - "w": 81, - "h": 70 - } - }, - { - "filename": "0179.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 80, - "h": 70 - }, - "frame": { - "x": 81, - "y": 479, - "w": 80, - "h": 70 - } - }, - { - "filename": "0180.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 80, - "h": 70 - }, - "frame": { - "x": 81, - "y": 479, - "w": 80, - "h": 70 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 84, - "h": 70 - }, - "frame": { - "x": 161, - "y": 481, - "w": 84, - "h": 70 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 84, - "h": 70 - }, - "frame": { - "x": 161, - "y": 481, - "w": 84, - "h": 70 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 82, - "h": 70 - }, - "frame": { - "x": 245, - "y": 481, - "w": 82, - "h": 70 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 82, - "h": 70 - }, - "frame": { - "x": 245, - "y": 481, - "w": 82, - "h": 70 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 82, - "h": 70 - }, - "frame": { - "x": 245, - "y": 481, - "w": 82, - "h": 70 - } - }, - { - "filename": "0183.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 70 - }, - "frame": { - "x": 327, - "y": 481, - "w": 83, - "h": 70 - } - }, - { - "filename": "0184.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 70 - }, - "frame": { - "x": 327, - "y": 481, - "w": 83, - "h": 70 - } - }, - { - "filename": "0185.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 83, - "h": 70 - }, - "frame": { - "x": 327, - "y": 481, - "w": 83, - "h": 70 - } - }, - { - "filename": "0186.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 84, - "h": 70 - }, - "frame": { - "x": 410, - "y": 481, - "w": 84, - "h": 70 - } - }, - { - "filename": "0187.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 86, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 84, - "h": 70 - }, - "frame": { - "x": 410, - "y": 481, - "w": 84, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:45b1919b351dad733f7b88701725e98a:30341f5f924f3632d0e938277cc51026:4e25ec866a209ce3a44bf419a5862c0c$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/3_2.png b/public/images/pokemon/variant/female/3_2.png deleted file mode 100644 index df83d7b05e2..00000000000 Binary files a/public/images/pokemon/variant/female/3_2.png and /dev/null 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/images/pokemon_icons_1.json b/public/images/pokemon_icons_1.json index 49e471514cd..12e26b380a5 100644 --- a/public/images/pokemon_icons_1.json +++ b/public/images/pokemon_icons_1.json @@ -1647,6 +1647,27 @@ "h": 25 } }, + { + "filename": "85-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 29, + "h": 25 + }, + "frame": { + "x": 55, + "y": 270, + "w": 29, + "h": 25 + } + }, { "filename": "22s", "rotated": false, @@ -1731,6 +1752,27 @@ "h": 25 } }, + { + "filename": "85s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 29, + "h": 25 + }, + "frame": { + "x": 56, + "y": 317, + "w": 29, + "h": 25 + } + }, { "filename": "9s", "rotated": false, @@ -6456,6 +6498,27 @@ "h": 18 } }, + { + "filename": "84-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 98, + "y": 712, + "w": 21, + "h": 18 + } + }, { "filename": "107", "rotated": false, @@ -6519,6 +6582,27 @@ "h": 18 } }, + { + "filename": "84s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 96, + "y": 770, + "w": 21, + "h": 18 + } + }, { "filename": "88", "rotated": false, diff --git a/public/images/pokemon_icons_1v.json b/public/images/pokemon_icons_1v.json index 4400b9d0213..de66db65eb7 100644 --- a/public/images/pokemon_icons_1v.json +++ b/public/images/pokemon_icons_1v.json @@ -1,1740 +1,2299 @@ -{ "frames": { - "100_2": { - "frame": { "x": 390, "y": 53, "w": 14, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "100_3": { - "frame": { "x": 328, "y": 30, "w": 14, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "101_2": { - "frame": { "x": 287, "y": 172, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "101_3": { - "frame": { "x": 263, "y": 156, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "111_2": { - "frame": { "x": 211, "y": 226, "w": 24, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 24, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "111_3": { - "frame": { "x": 265, "y": 233, "w": 24, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 24, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "112_2": { - "frame": { "x": 347, "y": 125, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "112_3": { - "frame": { "x": 322, "y": 125, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "113_1": { - "frame": { "x": 421, "y": 158, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "113_2": { - "frame": { "x": 299, "y": 277, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "113_3": { - "frame": { "x": 280, "y": 276, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "114_2": { - "frame": { "x": 212, "y": 297, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "114_3": { - "frame": { "x": 336, "y": 298, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "116_2": { - "frame": { "x": 142, "y": 303, "w": 18, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 18, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "116_3": { - "frame": { "x": 17, "y": 303, "w": 18, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 18, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "117_2": { - "frame": { "x": 92, "y": 226, "w": 24, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 24, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "117_3": { - "frame": { "x": 376, "y": 223, "w": 24, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 24, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "118_1": { - "frame": { "x": 400, "y": 241, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "118_2": { - "frame": { "x": 20, "y": 242, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "118_3": { - "frame": { "x": 372, "y": 243, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "119_1": { - "frame": { "x": 400, "y": 200, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "119_2": { - "frame": { "x": 196, "y": 199, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "119_3": { - "frame": { "x": 0, "y": 199, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "120_2": { - "frame": { "x": 77, "y": 306, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "120_3": { - "frame": { "x": 94, "y": 311, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "121_2": { - "frame": { "x": 355, "y": 300, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "121_3": { - "frame": { "x": 58, "y": 296, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "123_1": { - "frame": { "x": 148, "y": 284, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "123_2": { - "frame": { "x": 0, "y": 284, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "123_3": { - "frame": { "x": 173, "y": 283, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "125_1": { - "frame": { "x": 69, "y": 235, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "125_2": { - "frame": { "x": 311, "y": 235, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "125_3": { - "frame": { "x": 235, "y": 234, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "126_2": { - "frame": { "x": 287, "y": 188, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "126_3": { - "frame": { "x": 378, "y": 178, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "127-mega_2": { - "frame": { "x": 0, "y": 54, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "127-mega_3": { - "frame": { "x": 359, "y": 53, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "127_2": { - "frame": { "x": 0, "y": 219, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "127_3": { - "frame": { "x": 46, "y": 223, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "129_2": { - "frame": { "x": 213, "y": 175, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "129_3": { - "frame": { "x": 418, "y": 0, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "130-mega_2": { - "frame": { "x": 30, "y": 25, "w": 30, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "130-mega_3": { - "frame": { "x": 0, "y": 25, "w": 30, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "130_2": { - "frame": { "x": 210, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "130_3": { - "frame": { "x": 239, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "131-gigantamax_2": { - "frame": { "x": 373, "y": 25, "w": 31, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "131-gigantamax_3": { - "frame": { "x": 342, "y": 25, "w": 31, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "131_2": { - "frame": { "x": 172, "y": 198, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "131_3": { - "frame": { "x": 354, "y": 194, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "132_2": { - "frame": { "x": 231, "y": 311, "w": 16, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "132_3": { - "frame": { "x": 247, "y": 312, "w": 16, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "133_2": { - "frame": { "x": 0, "y": 303, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "133_3": { - "frame": { "x": 35, "y": 305, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "134_2": { - "frame": { "x": 165, "y": 219, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "134_3": { - "frame": { "x": 69, "y": 214, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "135_1": { - "frame": { "x": 20, "y": 261, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "135_2": { - "frame": { "x": 153, "y": 263, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "135_3": { - "frame": { "x": 396, "y": 260, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "136_1": { - "frame": { "x": 23, "y": 221, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "136_2": { - "frame": { "x": 400, "y": 220, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "136_3": { - "frame": { "x": 142, "y": 217, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "137_2": { - "frame": { "x": 280, "y": 296, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "137_3": { - "frame": { "x": 299, "y": 297, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "138_2": { - "frame": { "x": 415, "y": 301, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "138_3": { - "frame": { "x": 167, "y": 302, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "139_2": { - "frame": { "x": 47, "y": 201, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "139_3": { - "frame": { "x": 243, "y": 212, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "140_2": { - "frame": { "x": 263, "y": 312, "w": 16, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "140_3": { - "frame": { "x": 424, "y": 239, "w": 16, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "141_2": { - "frame": { "x": 261, "y": 276, "w": 19, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "141_3": { - "frame": { "x": 214, "y": 276, "w": 19, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "142-mega_2": { - "frame": { "x": 268, "y": 56, "w": 32, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 5, "w": 32, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "142-mega_3": { - "frame": { "x": 62, "y": 57, "w": 32, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 5, "w": 32, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "142_2": { - "frame": { "x": 322, "y": 103, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "142_3": { - "frame": { "x": 351, "y": 103, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "144_1": { - "frame": { "x": 304, "y": 168, "w": 27, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "144_2": { - "frame": { "x": 49, "y": 158, "w": 27, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "144_3": { - "frame": { "x": 394, "y": 158, "w": 27, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "145_1": { - "frame": { "x": 77, "y": 155, "w": 29, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 29, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "145_2": { - "frame": { "x": 130, "y": 153, "w": 29, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 29, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "145_3": { - "frame": { "x": 159, "y": 153, "w": 29, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 29, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "146_1": { - "frame": { "x": 70, "y": 196, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "146_2": { - "frame": { "x": 122, "y": 195, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "146_3": { - "frame": { "x": 258, "y": 194, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "147_2": { - "frame": { "x": 192, "y": 287, "w": 20, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 20, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "147_3": { - "frame": { "x": 38, "y": 287, "w": 20, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 20, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "148_2": { - "frame": { "x": 98, "y": 204, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "148_3": { - "frame": { "x": 378, "y": 201, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "149_2": { - "frame": { "x": 188, "y": 155, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "149_3": { - "frame": { "x": 24, "y": 156, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150-mega-x_2": { - "frame": { "x": 106, "y": 155, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150-mega-x_3": { - "frame": { "x": 242, "y": 156, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150-mega-y_2": { - "frame": { "x": 175, "y": 107, "w": 20, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150-mega-y_3": { - "frame": { "x": 407, "y": 108, "w": 20, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150_2": { - "frame": { "x": 352, "y": 236, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150_3": { - "frame": { "x": 332, "y": 235, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "151_2": { - "frame": { "x": 195, "y": 130, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "151_3": { - "frame": { "x": 231, "y": 127, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "19_2": { - "frame": { "x": 321, "y": 258, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "19_3": { - "frame": { "x": 0, "y": 263, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1_2": { - "frame": { "x": 338, "y": 279, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1_3": { - "frame": { "x": 318, "y": 279, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "20_2": { - "frame": { "x": 174, "y": 177, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "20_3": { - "frame": { "x": 23, "y": 178, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "23_2": { - "frame": { "x": 416, "y": 280, "w": 18, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "23_3": { - "frame": { "x": 20, "y": 282, "w": 18, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "24_2": { - "frame": { "x": 138, "y": 238, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "24_3": { - "frame": { "x": 0, "y": 240, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "29_1": { - "frame": { "x": 130, "y": 133, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "29_2": { - "frame": { "x": 397, "y": 299, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "29_3": { - "frame": { "x": 379, "y": 299, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2_2": { - "frame": { "x": 362, "y": 262, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2_3": { - "frame": { "x": 173, "y": 263, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3-gigantamax_2": { - "frame": { "x": 214, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3-gigantamax_3": { - "frame": { "x": 246, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3-mega_2": { - "frame": { "x": 181, "y": 58, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3-mega_3": { - "frame": { "x": 152, "y": 57, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "30_2": { - "frame": { "x": 87, "y": 267, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "30_3": { - "frame": { "x": 40, "y": 265, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "31_1": { - "frame": { "x": 331, "y": 168, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "31_2": { - "frame": { "x": 0, "y": 172, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "31_3": { - "frame": { "x": 127, "y": 172, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "35_2": { - "frame": { "x": 318, "y": 298, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "35_3": { - "frame": { "x": 124, "y": 299, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "36_2": { - "frame": { "x": 178, "y": 240, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "36_3": { - "frame": { "x": 158, "y": 240, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "37_2": { - "frame": { "x": 194, "y": 267, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "37_3": { - "frame": { "x": 241, "y": 274, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "38_2": { - "frame": { "x": 370, "y": 149, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "38_3": { - "frame": { "x": 218, "y": 152, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3_2": { - "frame": { "x": 0, "y": 79, "w": 30, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3_3": { - "frame": { "x": 240, "y": 80, "w": 30, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "41_1": { - "frame": { "x": 341, "y": 259, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "41_2": { - "frame": { "x": 416, "y": 260, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "41_3": { - "frame": { "x": 132, "y": 261, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "42_1": { - "frame": { "x": 104, "y": 133, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "42_2": { - "frame": { "x": 25, "y": 134, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "42_3": { - "frame": { "x": 51, "y": 136, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "43_2": { - "frame": { "x": 423, "y": 220, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "43_3": { - "frame": { "x": 423, "y": 178, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "44_2": { - "frame": { "x": 116, "y": 235, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "44_3": { - "frame": { "x": 289, "y": 235, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "45_2": { - "frame": { "x": 100, "y": 181, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "45_3": { - "frame": { "x": 48, "y": 178, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "46_1": { - "frame": { "x": 65, "y": 257, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "46_2": { - "frame": { "x": 299, "y": 257, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "46_3": { - "frame": { "x": 78, "y": 113, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "47_1": { - "frame": { "x": 25, "y": 199, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "47_2": { - "frame": { "x": 308, "y": 213, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "47_3": { - "frame": { "x": 120, "y": 213, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4_2": { - "frame": { "x": 59, "y": 277, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4_3": { - "frame": { "x": 106, "y": 277, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "50_2": { - "frame": { "x": 425, "y": 138, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "50_3": { - "frame": { "x": 425, "y": 197, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "51_2": { - "frame": { "x": 286, "y": 211, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "51_3": { - "frame": { "x": 221, "y": 204, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52-gigantamax_1": { - "frame": { "x": 77, "y": 83, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52-gigantamax_2": { - "frame": { "x": 54, "y": 81, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52-gigantamax_3": { - "frame": { "x": 417, "y": 78, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52_1": { - "frame": { "x": 44, "y": 244, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52_2": { - "frame": { "x": 90, "y": 246, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52_3": { - "frame": { "x": 198, "y": 246, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "53_1": { - "frame": { "x": 235, "y": 182, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "53_2": { - "frame": { "x": 400, "y": 178, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "53_3": { - "frame": { "x": 309, "y": 191, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "56_1": { - "frame": { "x": 342, "y": 148, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "56_2": { - "frame": { "x": 314, "y": 148, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "56_3": { - "frame": { "x": 397, "y": 138, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "57_1": { - "frame": { "x": 150, "y": 83, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "57_2": { - "frame": { "x": 294, "y": 103, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "57_3": { - "frame": { "x": 0, "y": 103, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "5_2": { - "frame": { "x": 332, "y": 191, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "5_3": { - "frame": { "x": 150, "y": 194, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-gigantamax_2": { - "frame": { "x": 270, "y": 80, "w": 24, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-gigantamax_3": { - "frame": { "x": 30, "y": 81, "w": 24, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-mega-x_2": { - "frame": { "x": 40, "y": 0, "w": 40, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-mega-x_3": { - "frame": { "x": 0, "y": 0, "w": 40, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-mega-y_2": { - "frame": { "x": 380, "y": 0, "w": 38, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-mega-y_3": { - "frame": { "x": 342, "y": 0, "w": 38, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "69_2": { - "frame": { "x": 173, "y": 137, "w": 20, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 20, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "69_3": { - "frame": { "x": 185, "y": 305, "w": 20, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 20, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6_2": { - "frame": { "x": 60, "y": 29, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6_3": { - "frame": { "x": 404, "y": 25, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "70_2": { - "frame": { "x": 277, "y": 256, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "70_3": { - "frame": { "x": 219, "y": 256, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "71_2": { - "frame": { "x": 178, "y": 84, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "71_3": { - "frame": { "x": 210, "y": 83, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "77_2": { - "frame": { "x": 280, "y": 149, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "77_3": { - "frame": { "x": 0, "y": 149, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "78_2": { - "frame": { "x": 123, "y": 57, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "78_3": { - "frame": { "x": 94, "y": 57, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "79_1": { - "frame": { "x": 265, "y": 212, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "79_2": { - "frame": { "x": 256, "y": 253, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "79_3": { - "frame": { "x": 111, "y": 256, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "7_2": { - "frame": { "x": 233, "y": 294, "w": 21, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 21, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "7_3": { - "frame": { "x": 80, "y": 289, "w": 21, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 21, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "80-mega_2": { - "frame": { "x": 125, "y": 83, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "80-mega_3": { - "frame": { "x": 100, "y": 83, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "80_2": { - "frame": { "x": 238, "y": 104, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "80_3": { - "frame": { "x": 380, "y": 103, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "81_2": { - "frame": { "x": 101, "y": 296, "w": 23, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 23, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "81_3": { - "frame": { "x": 254, "y": 297, "w": 23, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 23, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "82_2": { - "frame": { "x": 354, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "82_3": { - "frame": { "x": 76, "y": 174, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "83_2": { - "frame": { "x": 78, "y": 133, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "83_3": { - "frame": { "x": 254, "y": 134, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "84_1": { - "frame": { "x": 358, "y": 282, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "84_2": { - "frame": { "x": 383, "y": 281, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "84_3": { - "frame": { "x": 127, "y": 281, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "85_1": { - "frame": { "x": 388, "y": 78, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "85_2": { - "frame": { "x": 359, "y": 78, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "85_3": { - "frame": { "x": 330, "y": 78, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "86_1": { - "frame": { "x": 53, "y": 113, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "86_2": { - "frame": { "x": 28, "y": 111, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "86_3": { - "frame": { "x": 148, "y": 130, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "87_1": { - "frame": { "x": 372, "y": 126, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "87_2": { - "frame": { "x": 0, "y": 126, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "87_3": { - "frame": { "x": 289, "y": 126, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8_2": { - "frame": { "x": 150, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8_3": { - "frame": { "x": 263, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9-gigantamax_2": { - "frame": { "x": 181, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9-gigantamax_3": { - "frame": { "x": 152, "y": 29, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9-mega_2": { - "frame": { "x": 122, "y": 29, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9-mega_3": { - "frame": { "x": 92, "y": 29, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "92_1": { - "frame": { "x": 188, "y": 219, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "92_2": { - "frame": { "x": 330, "y": 214, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "92_3": { - "frame": { "x": 353, "y": 215, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "93_1": { - "frame": { "x": 404, "y": 52, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "93_2": { - "frame": { "x": 268, "y": 30, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "93_3": { - "frame": { "x": 298, "y": 30, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-gigantamax_1": { - "frame": { "x": 182, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-gigantamax_2": { - "frame": { "x": 310, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-gigantamax_3": { - "frame": { "x": 278, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-mega_1": { - "frame": { "x": 148, "y": 0, "w": 34, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-mega_2": { - "frame": { "x": 114, "y": 0, "w": 34, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-mega_3": { - "frame": { "x": 80, "y": 0, "w": 34, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94_1": { - "frame": { "x": 265, "y": 110, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94_2": { - "frame": { "x": 124, "y": 109, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94_3": { - "frame": { "x": 100, "y": 109, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "98_2": { - "frame": { "x": 240, "y": 58, "w": 28, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "98_3": { - "frame": { "x": 300, "y": 56, "w": 28, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "99-gigantamax_2": { - "frame": { "x": 328, "y": 53, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "99-gigantamax_3": { - "frame": { "x": 31, "y": 56, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "99_2": { - "frame": { "x": 300, "y": 78, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "99_3": { - "frame": { "x": 210, "y": 58, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9_2": { - "frame": { "x": 150, "y": 106, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9_3": { - "frame": { "x": 206, "y": 106, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_1v.png", - "format": "RGBA8888", - "size": { "w": 440, "h": 328 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_1v.png", + "format": "RGBA8888", + "size": { + "w": 600, + "h": 600 + }, + "scale": 1, + "frames": [ + { + "filename": "1_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "1_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "2_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "2_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "4_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "4_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "5_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "5_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "6-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "6-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6-mega-x_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6-mega-x_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6-mega-y_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6-mega-y_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "7_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "7_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "8_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "8_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "9_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "19_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "19_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "20_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "20_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "23_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "23_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "24_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "24_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-beauty-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-beauty-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-cool-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-cool-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-cute-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-cute-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-partner_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-partner_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-smart-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-smart-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-tough-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-tough-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "26_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "26_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "29_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "29_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "29_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "30_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "30_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "31_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "31_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "31_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "35_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "35_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "36_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "36_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "37_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "37_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "38_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "38_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "39_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "39_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "40_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "40_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "41_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "41_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "41_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "42_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "42_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "42_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "43_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "43_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "44_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "44_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "45_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "45_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "46_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "46_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "46_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "47_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "47_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "47_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "50_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "50_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "51_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "51_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "52-gigantamax_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "52-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "52-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "52_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "52_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "52_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "53_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "53_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "53_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "56_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "56_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "56_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "57_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "57_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "57_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "69_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "69_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "70_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "70_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "71_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "71_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "77_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "77_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "78_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "78_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "79_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "79_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "79_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "80-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "80-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "80_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "80_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "81_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "81_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "82_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "82_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "83_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "83_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84-f_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85-f_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "85_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "86_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "86_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "86_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "87_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "87_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "87_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "92_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "92_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "92_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "93_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "93_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "93_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "94-gigantamax_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "94-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "98_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "98_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "99-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "99-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "99_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "99_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "100_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "100_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "101_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "101_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "102_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "102_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "103_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "103_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "111_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "111_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "112_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "112_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "113_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "113_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "113_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "114_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "114_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "116_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "116_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "117_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "117_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "118_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "118_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "118_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "119_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "119_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "119_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "120_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "120_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "121_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "121_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "123_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "123_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "123_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "125_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "125_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "125_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "126_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "126_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "127-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "127-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "127_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "127_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "128_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "128_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "129_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "129_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "130-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "130-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "130_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "130_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "131-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "131-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "131_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "131_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "132_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "132_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "133-partner_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "133-partner_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "133_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "133_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "134_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "134_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "135_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "135_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "135_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "136_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "136_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "136_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "137_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "137_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "138_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "138_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "139_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "139_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "140_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "140_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "141_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "141_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "142-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "142-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "142_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "142_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "144_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "144_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "144_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "145_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "145_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "145_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "146_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "146_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "146_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "147_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "147_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "148_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "148_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "149_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "149_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150-mega-x_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150-mega-x_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150-mega-y_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150-mega-y_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "151_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "151_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 540, "w": 40, "h": 30} + } + ] + } + ], + "meta": { + "app": "texturepacker", + "version": "3.0" + } } diff --git a/public/images/pokemon_icons_1v.png b/public/images/pokemon_icons_1v.png index 2aa0433b3f6..d6b1bc0cf7e 100644 Binary files a/public/images/pokemon_icons_1v.png and b/public/images/pokemon_icons_1v.png differ diff --git a/public/images/pokemon_icons_2.json b/public/images/pokemon_icons_2.json index 5a389362bc0..c5ebfe61487 100644 --- a/public/images/pokemon_icons_2.json +++ b/public/images/pokemon_icons_2.json @@ -786,6 +786,27 @@ "h": 27 } }, + { + "filename": "154-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 23, + "h": 27 + }, + "frame": { + "x": 29, + "y": 147, + "w": 23, + "h": 27 + } + }, { "filename": "154s", "rotated": false, @@ -807,6 +828,27 @@ "h": 27 } }, + { + "filename": "154s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 23, + "h": 27 + }, + "frame": { + "x": 29, + "y": 174, + "w": 23, + "h": 27 + } + }, { "filename": "229-mega", "rotated": false, diff --git a/public/images/pokemon_icons_2v.json b/public/images/pokemon_icons_2v.json index ac38ebbcf6b..23eec483b42 100644 --- a/public/images/pokemon_icons_2v.json +++ b/public/images/pokemon_icons_2v.json @@ -1,1271 +1,4640 @@ -{ "frames": { - "161_2": { - "frame": { "x": 225, "y": 163, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "161_3": { - "frame": { "x": 82, "y": 162, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "162_2": { - "frame": { "x": 22, "y": 102, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "162_3": { - "frame": { "x": 45, "y": 103, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "163_2": { - "frame": { "x": 0, "y": 184, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "163_3": { - "frame": { "x": 240, "y": 183, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "164_2": { - "frame": { "x": 64, "y": 145, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "164_3": { - "frame": { "x": 186, "y": 145, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "169_1": { - "frame": { "x": 148, "y": 29, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "169_2": { - "frame": { "x": 55, "y": 30, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "169_3": { - "frame": { "x": 85, "y": 30, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "173_3": { - "frame": { "x": 64, "y": 223, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "175_1": { - "frame": { "x": 185, "y": 206, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "175_2": { - "frame": { "x": 31, "y": 207, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "175_3": { - "frame": { "x": 169, "y": 207, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "176_1": { - "frame": { "x": 54, "y": 168, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "176_2": { - "frame": { "x": 37, "y": 166, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "176_3": { - "frame": { "x": 261, "y": 99, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "177_2": { - "frame": { "x": 135, "y": 196, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "177_3": { - "frame": { "x": 152, "y": 196, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "178_2": { - "frame": { "x": 276, "y": 164, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "178_3": { - "frame": { "x": 293, "y": 164, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "179_2": { - "frame": { "x": 226, "y": 143, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "179_3": { - "frame": { "x": 88, "y": 142, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "180_2": { - "frame": { "x": 116, "y": 122, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "180_3": { - "frame": { "x": 239, "y": 121, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "181-mega_2": { - "frame": { "x": 262, "y": 0, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "181-mega_3": { - "frame": { "x": 291, "y": 0, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "181_2": { - "frame": { "x": 200, "y": 96, "w": 20, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 20, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "181_3": { - "frame": { "x": 124, "y": 97, "w": 20, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 20, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "182_2": { - "frame": { "x": 97, "y": 184, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "182_3": { - "frame": { "x": 17, "y": 184, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "183_2": { - "frame": { "x": 154, "y": 160, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "183_3": { - "frame": { "x": 131, "y": 156, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "184_2": { - "frame": { "x": 25, "y": 56, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "184_3": { - "frame": { "x": 202, "y": 53, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "185_2": { - "frame": { "x": 22, "y": 123, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "185_3": { - "frame": { "x": 0, "y": 123, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "190_2": { - "frame": { "x": 284, "y": 124, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "190_3": { - "frame": { "x": 260, "y": 124, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "193_2": { - "frame": { "x": 137, "y": 140, "w": 28, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 12, "w": 28, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "193_3": { - "frame": { "x": 88, "y": 126, "w": 28, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 12, "w": 28, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "196_1": { - "frame": { "x": 251, "y": 78, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "196_2": { - "frame": { "x": 0, "y": 80, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "196_3": { - "frame": { "x": 289, "y": 77, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "197_2": { - "frame": { "x": 289, "y": 143, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "197_3": { - "frame": { "x": 269, "y": 143, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "199_1": { - "frame": { "x": 220, "y": 97, "w": 19, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 2, "w": 19, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "199_2": { - "frame": { "x": 297, "y": 98, "w": 19, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 2, "w": 19, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "199_3": { - "frame": { "x": 278, "y": 98, "w": 19, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 2, "w": 19, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "200_1": { - "frame": { "x": 69, "y": 204, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "200_2": { - "frame": { "x": 257, "y": 202, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "200_3": { - "frame": { "x": 211, "y": 203, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-a_2": { - "frame": { "x": 148, "y": 233, "w": 10, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-a_3": { - "frame": { "x": 128, "y": 230, "w": 10, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-b_2": { - "frame": { "x": 13, "y": 225, "w": 12, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 7, "w": 12, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-b_3": { - "frame": { "x": 271, "y": 224, "w": 12, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 7, "w": 12, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-c_2": { - "frame": { "x": 85, "y": 205, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-c_3": { - "frame": { "x": 304, "y": 205, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-d_2": { - "frame": { "x": 201, "y": 222, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-d_3": { - "frame": { "x": 215, "y": 222, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-exclamation_2": { - "frame": { "x": 227, "y": 53, "w": 10, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 10, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-exclamation_3": { - "frame": { "x": 103, "y": 241, "w": 10, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 10, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-e_2": { - "frame": { "x": 257, "y": 221, "w": 14, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 14, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-e_3": { - "frame": { "x": 243, "y": 203, "w": 14, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 14, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-f_2": { - "frame": { "x": 152, "y": 214, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-f_3": { - "frame": { "x": 212, "y": 77, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-g_2": { - "frame": { "x": 310, "y": 145, "w": 10, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-g_3": { - "frame": { "x": 138, "y": 230, "w": 10, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-h_2": { - "frame": { "x": 177, "y": 168, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-h_3": { - "frame": { "x": 115, "y": 173, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-i_2": { - "frame": { "x": 113, "y": 241, "w": 10, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 8, "w": 10, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-i_3": { - "frame": { "x": 199, "y": 241, "w": 10, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 8, "w": 10, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-j_2": { - "frame": { "x": 62, "y": 239, "w": 11, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 9, "w": 11, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-j_3": { - "frame": { "x": 92, "y": 241, "w": 11, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 9, "w": 11, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-k_2": { - "frame": { "x": 229, "y": 222, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-k_3": { - "frame": { "x": 226, "y": 123, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-l_2": { - "frame": { "x": 291, "y": 208, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-l_3": { - "frame": { "x": 0, "y": 223, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-m_2": { - "frame": { "x": 97, "y": 164, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-m_3": { - "frame": { "x": 19, "y": 164, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-n_2": { - "frame": { "x": 211, "y": 189, "w": 22, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-n_3": { - "frame": { "x": 113, "y": 192, "w": 22, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-o_2": { - "frame": { "x": 151, "y": 177, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-o_3": { - "frame": { "x": 133, "y": 173, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-p_2": { - "frame": { "x": 71, "y": 168, "w": 11, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 8, "w": 11, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-p_3": { - "frame": { "x": 278, "y": 78, "w": 11, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 8, "w": 11, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-question_2": { - "frame": { "x": 309, "y": 124, "w": 11, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 7, "w": 11, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-question_3": { - "frame": { "x": 51, "y": 225, "w": 11, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 7, "w": 11, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-q_2": { - "frame": { "x": 304, "y": 225, "w": 14, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 14, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-q_3": { - "frame": { "x": 283, "y": 228, "w": 14, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 14, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-r_2": { - "frame": { "x": 255, "y": 241, "w": 10, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 10, "w": 10, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-r_3": { - "frame": { "x": 297, "y": 241, "w": 10, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 10, "w": 10, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-s_2": { - "frame": { "x": 290, "y": 185, "w": 14, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 14, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-s_3": { - "frame": { "x": 276, "y": 185, "w": 14, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 14, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-t_2": { - "frame": { "x": 167, "y": 225, "w": 12, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 12, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-t_3": { - "frame": { "x": 80, "y": 225, "w": 12, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 12, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-u_2": { - "frame": { "x": 273, "y": 208, "w": 18, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 12, "w": 18, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-u_3": { - "frame": { "x": 134, "y": 214, "w": 18, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 12, "w": 18, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-v_2": { - "frame": { "x": 100, "y": 223, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-v_3": { - "frame": { "x": 185, "y": 224, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-w_2": { - "frame": { "x": 100, "y": 206, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-w_3": { - "frame": { "x": 117, "y": 206, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-x_2": { - "frame": { "x": 242, "y": 241, "w": 13, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 14, "w": 13, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-x_3": { - "frame": { "x": 209, "y": 241, "w": 13, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 14, "w": 13, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-y_2": { - "frame": { "x": 25, "y": 225, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-y_3": { - "frame": { "x": 38, "y": 225, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-z_2": { - "frame": { "x": 310, "y": 166, "w": 10, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 9, "w": 10, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-z_3": { - "frame": { "x": 185, "y": 187, "w": 10, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 9, "w": 10, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "203_2": { - "frame": { "x": 102, "y": 80, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "203_3": { - "frame": { "x": 51, "y": 80, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "206_2": { - "frame": { "x": 204, "y": 146, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "206_3": { - "frame": { "x": 42, "y": 147, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "207_2": { - "frame": { "x": 227, "y": 73, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "207_3": { - "frame": { "x": 103, "y": 56, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212-mega_1": { - "frame": { "x": 234, "y": 0, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212-mega_2": { - "frame": { "x": 206, "y": 0, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212-mega_3": { - "frame": { "x": 178, "y": 0, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212_1": { - "frame": { "x": 122, "y": 29, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212_2": { - "frame": { "x": 292, "y": 26, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212_3": { - "frame": { "x": 29, "y": 29, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "213_2": { - "frame": { "x": 27, "y": 80, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "213_3": { - "frame": { "x": 78, "y": 77, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "215_2": { - "frame": { "x": 259, "y": 164, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "215_3": { - "frame": { "x": 204, "y": 165, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "216_2": { - "frame": { "x": 304, "y": 185, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "216_3": { - "frame": { "x": 169, "y": 187, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "217_1": { - "frame": { "x": 95, "y": 103, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "217_2": { - "frame": { "x": 144, "y": 117, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "217_3": { - "frame": { "x": 165, "y": 117, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "222_2": { - "frame": { "x": 248, "y": 143, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "222_3": { - "frame": { "x": 110, "y": 144, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "226_2": { - "frame": { "x": 182, "y": 77, "w": 30, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 9, "w": 30, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "226_3": { - "frame": { "x": 152, "y": 77, "w": 30, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 9, "w": 30, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "227_2": { - "frame": { "x": 127, "y": 74, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "227_3": { - "frame": { "x": 237, "y": 28, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "228_2": { - "frame": { "x": 0, "y": 164, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "228_3": { - "frame": { "x": 240, "y": 163, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "229-mega_2": { - "frame": { "x": 266, "y": 51, "w": 23, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 23, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "229-mega_3": { - "frame": { "x": 55, "y": 53, "w": 23, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 23, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "229_2": { - "frame": { "x": 44, "y": 124, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "229_3": { - "frame": { "x": 206, "y": 123, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "230_2": { - "frame": { "x": 68, "y": 121, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "230_3": { - "frame": { "x": 186, "y": 121, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "231_2": { - "frame": { "x": 49, "y": 189, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "231_3": { - "frame": { "x": 71, "y": 188, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "232_2": { - "frame": { "x": 237, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "232_3": { - "frame": { "x": 148, "y": 52, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "233_2": { - "frame": { "x": 257, "y": 185, "w": 19, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "233_3": { - "frame": { "x": 127, "y": 56, "w": 19, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "235_2": { - "frame": { "x": 176, "y": 96, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "235_3": { - "frame": { "x": 152, "y": 96, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "239_1": { - "frame": { "x": 0, "y": 144, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "239_2": { - "frame": { "x": 21, "y": 144, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "239_3": { - "frame": { "x": 165, "y": 140, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "240_2": { - "frame": { "x": 33, "y": 187, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "240_3": { - "frame": { "x": 195, "y": 186, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "242_1": { - "frame": { "x": 239, "y": 99, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "242_2": { - "frame": { "x": 0, "y": 101, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "242_3": { - "frame": { "x": 73, "y": 99, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "243_2": { - "frame": { "x": 262, "y": 26, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "243_3": { - "frame": { "x": 178, "y": 28, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "244_2": { - "frame": { "x": 289, "y": 53, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "244_3": { - "frame": { "x": 0, "y": 54, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "245_2": { - "frame": { "x": 208, "y": 28, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "245_3": { - "frame": { "x": 0, "y": 29, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "246_2": { - "frame": { "x": 49, "y": 205, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "246_3": { - "frame": { "x": 16, "y": 205, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "247_2": { - "frame": { "x": 0, "y": 204, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "247_3": { - "frame": { "x": 227, "y": 203, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "248-mega_2": { - "frame": { "x": 122, "y": 0, "w": 28, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "248-mega_3": { - "frame": { "x": 150, "y": 0, "w": 28, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "248_2": { - "frame": { "x": 177, "y": 53, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "248_3": { - "frame": { "x": 78, "y": 53, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "249_2": { - "frame": { "x": 0, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "249_3": { - "frame": { "x": 32, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "250_2": { - "frame": { "x": 93, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "250_3": { - "frame": { "x": 64, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "251_2": { - "frame": { "x": 114, "y": 223, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "251_3": { - "frame": { "x": 242, "y": 223, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_2v.png", - "format": "RGBA8888", - "size": { "w": 320, "h": 261 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_2v.png", + "format": "RGBA8888", + "size": { + "w": 520, + "h": 520 + }, + "scale": 1, + "frames": [ + { + "filename": "152_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "152_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "153_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "153_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "154-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "154-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "154_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "154_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "158_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "158_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "159_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "159_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "160_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "160_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "161_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "161_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "162_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "162_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "163_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "163_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "164_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "164_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "167_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "167_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "168_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "168_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "169_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "169_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "169_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "170_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "170_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "171_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "171_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "172-spiky_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "172-spiky_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "172_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "172_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "173_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "173_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "174_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "174_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "175_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "175_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "175_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "176_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "176_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "176_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "177_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "177_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "178_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "178_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "179_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "179_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "180_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "180_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "181-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "181-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "181_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "181_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "182_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "182_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "183_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "183_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "184_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "184_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "185_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "185_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "190_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "190_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "193_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "193_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "194_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "194_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "195_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "195_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "196_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "196_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "196_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "197_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "197_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "198-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "198_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "198-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "198_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "199_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "199_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "199_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "200_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "200_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "200_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-a_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-a_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-b_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-b_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-c_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-c_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-d_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-d_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-e_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-e_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-exclamation_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-exclamation_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-g_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-g_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-h_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-h_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-i_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-i_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-j_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-j_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-k_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-k_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-l_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-l_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-m_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-m_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-n_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-n_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-o_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-o_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-p_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-p_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-q_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-q_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-question_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-question_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-r_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-r_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-s_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-s_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-t_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-t_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-u_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-u_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-v_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-v_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-w_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-w_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-x_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-x_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-y_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-y_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-z_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-z_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "203_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "203_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "206_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "206_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "207_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "207_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "211_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "211_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "212_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "213_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "213_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "215_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "215_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "216_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "216_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "216_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "217_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "217_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "217_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "222_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "222_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "226_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "226_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "227_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "227_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "228_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "228_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "229-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "229-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "229_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "229_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "230_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "230_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "231_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "231_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "232_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "232_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "233_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "233_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "235_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "235_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "239_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "239_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "239_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "240_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "240_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "242_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "242_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "242_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "243_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "243_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "244_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "244_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "245_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "245_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "246_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "246_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "247_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "247_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "248-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "248-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "248_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "248_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "249_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "249_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "250_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "250_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "251_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "251_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:cb87bf48266ab3d893dbbd24a52f875f:d37e73561b49b4fe831e3fcaee67b851:63b368599cdc6e139499267117e91cd5$" + } } diff --git a/public/images/pokemon_icons_2v.png b/public/images/pokemon_icons_2v.png index 443d14b176d..e74840b647b 100644 Binary files a/public/images/pokemon_icons_2v.png and b/public/images/pokemon_icons_2v.png differ diff --git a/public/images/pokemon_icons_3.json b/public/images/pokemon_icons_3.json index 220d91f5222..a1aefa0ff0b 100644 --- a/public/images/pokemon_icons_3.json +++ b/public/images/pokemon_icons_3.json @@ -198,6 +198,27 @@ "h": 27 } }, + { + "filename": "257-f-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 32, + "h": 27 + }, + "frame": { + "x": 0, + "y": 79, + "w": 32, + "h": 27 + } + }, { "filename": "257s-mega", "rotated": false, @@ -219,6 +240,27 @@ "h": 27 } }, + { + "filename": "257s-f-mega", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 32, + "h": 27 + }, + "frame": { + "x": 0, + "y": 106, + "w": 32, + "h": 27 + } + }, { "filename": "323-mega", "rotated": false, @@ -1248,6 +1290,27 @@ "h": 26 } }, + { + "filename": "257-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 25, + "h": 26 + }, + "frame": { + "x": 28, + "y": 556, + "w": 25, + "h": 26 + } + }, { "filename": "257s", "rotated": false, @@ -1269,6 +1332,27 @@ "h": 26 } }, + { + "filename": "257s-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 2, + "w": 25, + "h": 26 + }, + "frame": { + "x": 28, + "y": 582, + "w": 25, + "h": 26 + } + }, { "filename": "359-mega", "rotated": false, @@ -1605,6 +1689,27 @@ "h": 25 } }, + { + "filename": "256-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 98, + "y": 72, + "w": 23, + "h": 25 + } + }, { "filename": "282s-mega", "rotated": false, @@ -5553,6 +5658,27 @@ "h": 19 } }, + { + "filename": "255-f", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 9, + "w": 13, + "h": 19 + }, + "frame": { + "x": 204, + "y": 342, + "w": 13, + "h": 19 + } + }, { "filename": "307s", "rotated": false, diff --git a/public/images/pokemon_icons_3v.json b/public/images/pokemon_icons_3v.json index 2cd15286a81..2500eebbff8 100644 --- a/public/images/pokemon_icons_3v.json +++ b/public/images/pokemon_icons_3v.json @@ -1,1411 +1,4661 @@ -{ "frames": { - "255_2": { - "frame": { "x": 167, "y": 275, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "255_3": { - "frame": { "x": 367, "y": 186, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "256_2": { - "frame": { "x": 106, "y": 124, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "256_3": { - "frame": { "x": 51, "y": 124, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "257-mega_2": { - "frame": { "x": 146, "y": 0, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "257-mega_3": { - "frame": { "x": 178, "y": 0, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "257_2": { - "frame": { "x": 0, "y": 81, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "257_3": { - "frame": { "x": 150, "y": 78, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "261_2": { - "frame": { "x": 17, "y": 232, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "261_3": { - "frame": { "x": 38, "y": 232, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "262_2": { - "frame": { "x": 48, "y": 149, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "262_3": { - "frame": { "x": 96, "y": 149, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "263_2": { - "frame": { "x": 123, "y": 243, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "263_3": { - "frame": { "x": 252, "y": 243, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "264_2": { - "frame": { "x": 115, "y": 193, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "264_3": { - "frame": { "x": 66, "y": 192, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "278_1": { - "frame": { "x": 275, "y": 78, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 14, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "278_2": { - "frame": { "x": 151, "y": 232, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 14, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "278_3": { - "frame": { "x": 97, "y": 233, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 14, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "279_1": { - "frame": { "x": 178, "y": 165, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "279_2": { - "frame": { "x": 144, "y": 166, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "279_3": { - "frame": { "x": 254, "y": 161, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "280_2": { - "frame": { "x": 122, "y": 275, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "280_3": { - "frame": { "x": 108, "y": 275, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "281_2": { - "frame": { "x": 159, "y": 209, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "281_3": { - "frame": { "x": 177, "y": 210, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "282-mega_2": { - "frame": { "x": 227, "y": 99, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "282-mega_3": { - "frame": { "x": 352, "y": 0, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "282_2": { - "frame": { "x": 201, "y": 98, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "282_3": { - "frame": { "x": 175, "y": 98, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "285_2": { - "frame": { "x": 15, "y": 271, "w": 18, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 18, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "285_3": { - "frame": { "x": 307, "y": 269, "w": 18, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 18, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "286_2": { - "frame": { "x": 220, "y": 123, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "286_3": { - "frame": { "x": 0, "y": 107, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "290_1": { - "frame": { "x": 291, "y": 249, "w": 23, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 14, "w": 23, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "290_2": { - "frame": { "x": 353, "y": 248, "w": 23, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 14, "w": 23, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "290_3": { - "frame": { "x": 97, "y": 247, "w": 23, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 14, "w": 23, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "291_1": { - "frame": { "x": 277, "y": 180, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "291_2": { - "frame": { "x": 245, "y": 182, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "291_3": { - "frame": { "x": 222, "y": 180, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "292_1": { - "frame": { "x": 357, "y": 229, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "292_2": { - "frame": { "x": 77, "y": 231, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "292_3": { - "frame": { "x": 296, "y": 230, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "298_2": { - "frame": { "x": 139, "y": 263, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "298_3": { - "frame": { "x": 277, "y": 263, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "300_1": { - "frame": { "x": 108, "y": 213, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "300_2": { - "frame": { "x": 17, "y": 212, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "300_3": { - "frame": { "x": 88, "y": 211, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "301_1": { - "frame": { "x": 115, "y": 172, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "301_2": { - "frame": { "x": 0, "y": 178, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "301_3": { - "frame": { "x": 93, "y": 170, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "302-mega_2": { - "frame": { "x": 274, "y": 51, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "302-mega_3": { - "frame": { "x": 150, "y": 51, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "302_2": { - "frame": { "x": 338, "y": 166, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "302_3": { - "frame": { "x": 315, "y": 166, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303-mega_1": { - "frame": { "x": 26, "y": 51, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303-mega_2": { - "frame": { "x": 56, "y": 51, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303-mega_3": { - "frame": { "x": 342, "y": 50, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303_1": { - "frame": { "x": 315, "y": 145, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303_2": { - "frame": { "x": 341, "y": 145, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303_3": { - "frame": { "x": 178, "y": 144, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "304_1": { - "frame": { "x": 196, "y": 275, "w": 16, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 16, "w": 16, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "304_2": { - "frame": { "x": 180, "y": 275, "w": 16, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 16, "w": 16, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "304_3": { - "frame": { "x": 252, "y": 202, "w": 16, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 16, "w": 16, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "305_1": { - "frame": { "x": 334, "y": 227, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "305_2": { - "frame": { "x": 128, "y": 226, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "305_3": { - "frame": { "x": 273, "y": 226, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306-mega_1": { - "frame": { "x": 62, "y": 25, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306-mega_2": { - "frame": { "x": 93, "y": 25, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306-mega_3": { - "frame": { "x": 342, "y": 24, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306_1": { - "frame": { "x": 55, "y": 77, "w": 29, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 29, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306_2": { - "frame": { "x": 338, "y": 76, "w": 29, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 29, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306_3": { - "frame": { "x": 26, "y": 77, "w": 29, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 29, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "307_2": { - "frame": { "x": 215, "y": 241, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "307_3": { - "frame": { "x": 274, "y": 243, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "308-mega_2": { - "frame": { "x": 190, "y": 48, "w": 29, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "308-mega_3": { - "frame": { "x": 219, "y": 48, "w": 29, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "308_2": { - "frame": { "x": 0, "y": 199, "w": 17, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 3, "w": 17, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "308_3": { - "frame": { "x": 235, "y": 202, "w": 17, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 3, "w": 17, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "309_2": { - "frame": { "x": 45, "y": 268, "w": 19, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 19, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "309_3": { - "frame": { "x": 253, "y": 99, "w": 19, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 19, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "310-mega_2": { - "frame": { "x": 25, "y": 101, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "310-mega_3": { - "frame": { "x": 338, "y": 100, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "310_2": { - "frame": { "x": 323, "y": 187, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "310_3": { - "frame": { "x": 167, "y": 186, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "311_1": { - "frame": { "x": 164, "y": 256, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "311_2": { - "frame": { "x": 77, "y": 250, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "311_3": { - "frame": { "x": 314, "y": 250, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "312_2": { - "frame": { "x": 196, "y": 256, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "312_3": { - "frame": { "x": 180, "y": 256, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "315_2": { - "frame": { "x": 153, "y": 144, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "315_3": { - "frame": { "x": 290, "y": 138, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "320_2": { - "frame": { "x": 211, "y": 200, "w": 24, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 10, "w": 24, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "320_3": { - "frame": { "x": 268, "y": 200, "w": 24, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 10, "w": 24, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "321_2": { - "frame": { "x": 84, "y": 98, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "321_3": { - "frame": { "x": 308, "y": 93, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "327_2": { - "frame": { "x": 364, "y": 100, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "327_3": { - "frame": { "x": 0, "y": 247, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "328_2": { - "frame": { "x": 177, "y": 237, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "328_3": { - "frame": { "x": 196, "y": 237, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "329_2": { - "frame": { "x": 229, "y": 160, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "329_3": { - "frame": { "x": 290, "y": 160, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "330_2": { - "frame": { "x": 51, "y": 101, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "330_3": { - "frame": { "x": 139, "y": 104, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "333_2": { - "frame": { "x": 45, "y": 252, "w": 19, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "333_3": { - "frame": { "x": 120, "y": 259, "w": 19, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "334-mega_2": { - "frame": { "x": 280, "y": 114, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "334-mega_3": { - "frame": { "x": 253, "y": 114, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "334_2": { - "frame": { "x": 73, "y": 168, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "334_3": { - "frame": { "x": 23, "y": 167, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "335_2": { - "frame": { "x": 0, "y": 156, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "335_3": { - "frame": { "x": 121, "y": 150, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "336_2": { - "frame": { "x": 137, "y": 187, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "336_3": { - "frame": { "x": 300, "y": 187, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "337_2": { - "frame": { "x": 277, "y": 161, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "337_3": { - "frame": { "x": 154, "y": 275, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "338_2": { - "frame": { "x": 43, "y": 170, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "338_3": { - "frame": { "x": 201, "y": 169, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "339_2": { - "frame": { "x": 226, "y": 268, "w": 21, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "339_3": { - "frame": { "x": 64, "y": 269, "w": 21, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "340_2": { - "frame": { "x": 187, "y": 191, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "340_3": { - "frame": { "x": 343, "y": 187, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "341_2": { - "frame": { "x": 252, "y": 218, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "341_3": { - "frame": { "x": 195, "y": 218, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "342_2": { - "frame": { "x": 129, "y": 127, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "342_3": { - "frame": { "x": 243, "y": 137, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-rainy_1": { - "frame": { "x": 330, "y": 261, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-rainy_2": { - "frame": { "x": 344, "y": 262, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-rainy_3": { - "frame": { "x": 212, "y": 261, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-snowy_1": { - "frame": { "x": 216, "y": 218, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-snowy_2": { - "frame": { "x": 363, "y": 206, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-snowy_3": { - "frame": { "x": 0, "y": 224, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-sunny_1": { - "frame": { "x": 59, "y": 232, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-sunny_2": { - "frame": { "x": 316, "y": 230, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-sunny_3": { - "frame": { "x": 362, "y": 124, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351_2": { - "frame": { "x": 367, "y": 76, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351_3": { - "frame": { "x": 367, "y": 144, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "352_1": { - "frame": { "x": 37, "y": 212, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "352_2": { - "frame": { "x": 57, "y": 212, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "352_3": { - "frame": { "x": 314, "y": 210, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "353_2": { - "frame": { "x": 262, "y": 263, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "353_3": { - "frame": { "x": 292, "y": 263, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "354-mega_2": { - "frame": { "x": 0, "y": 51, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "354-mega_3": { - "frame": { "x": 248, "y": 48, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "354_2": { - "frame": { "x": 137, "y": 207, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "354_3": { - "frame": { "x": 292, "y": 207, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "357_2": { - "frame": { "x": 31, "y": 25, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "357_3": { - "frame": { "x": 0, "y": 25, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "358_1": { - "frame": { "x": 232, "y": 247, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "358_2": { - "frame": { "x": 15, "y": 250, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "358_3": { - "frame": { "x": 30, "y": 250, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "361_2": { - "frame": { "x": 0, "y": 268, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "361_3": { - "frame": { "x": 358, "y": 262, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "362-mega_2": { - "frame": { "x": 0, "y": 132, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "362-mega_3": { - "frame": { "x": 267, "y": 137, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "362_2": { - "frame": { "x": 233, "y": 227, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "362_3": { - "frame": { "x": 361, "y": 166, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "369_2": { - "frame": { "x": 204, "y": 148, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "369_3": { - "frame": { "x": 23, "y": 146, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "371_2": { - "frame": { "x": 247, "y": 259, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "371_3": { - "frame": { "x": 93, "y": 261, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "372_2": { - "frame": { "x": 343, "y": 206, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "372_3": { - "frame": { "x": 190, "y": 27, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "373-mega_2": { - "frame": { "x": 111, "y": 0, "w": 35, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "373-mega_3": { - "frame": { "x": 76, "y": 0, "w": 35, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "373_2": { - "frame": { "x": 86, "y": 75, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 5, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "373_3": { - "frame": { "x": 118, "y": 75, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 5, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "374_2": { - "frame": { "x": 145, "y": 246, "w": 19, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "374_3": { - "frame": { "x": 334, "y": 244, "w": 19, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "375_2": { - "frame": { "x": 166, "y": 122, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "375_3": { - "frame": { "x": 193, "y": 122, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "376-mega_2": { - "frame": { "x": 118, "y": 51, "w": 32, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 5, "w": 32, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "376-mega_3": { - "frame": { "x": 86, "y": 51, "w": 32, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 5, "w": 32, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "376_2": { - "frame": { "x": 178, "y": 75, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "376_3": { - "frame": { "x": 210, "y": 75, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "380-mega_2": { - "frame": { "x": 282, "y": 0, "w": 35, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "380-mega_3": { - "frame": { "x": 317, "y": 0, "w": 35, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "380_2": { - "frame": { "x": 23, "y": 125, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "380_3": { - "frame": { "x": 335, "y": 124, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "381-mega_2": { - "frame": { "x": 210, "y": 24, "w": 35, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "381-mega_3": { - "frame": { "x": 245, "y": 24, "w": 35, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "381_2": { - "frame": { "x": 78, "y": 121, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "381_3": { - "frame": { "x": 307, "y": 116, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "382-primal_2": { - "frame": { "x": 302, "y": 72, "w": 36, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 8, "w": 36, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "382-primal_3": { - "frame": { "x": 302, "y": 51, "w": 36, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 8, "w": 36, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "382_2": { - "frame": { "x": 275, "y": 93, "w": 33, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 8, "w": 33, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "382_3": { - "frame": { "x": 242, "y": 78, "w": 33, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 8, "w": 33, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "383-primal_2": { - "frame": { "x": 246, "y": 0, "w": 36, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "383-primal_3": { - "frame": { "x": 210, "y": 0, "w": 36, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "383_2": { - "frame": { "x": 157, "y": 27, "w": 33, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 33, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "383_3": { - "frame": { "x": 124, "y": 27, "w": 33, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 33, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "384-mega_2": { - "frame": { "x": 38, "y": 0, "w": 38, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 3, "w": 38, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "384-mega_3": { - "frame": { "x": 0, "y": 0, "w": 38, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 3, "w": 38, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "384_2": { - "frame": { "x": 311, "y": 24, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "384_3": { - "frame": { "x": 280, "y": 24, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "385_1": { - "frame": { "x": 22, "y": 192, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "385_2": { - "frame": { "x": 93, "y": 191, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "385_3": { - "frame": { "x": 44, "y": 192, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475-mega_3": { - "frame": { "x": 114, "y": 98, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475_3": { - "frame": { "x": 74, "y": 143, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_3v.png", - "format": "RGBA8888", - "size": { "w": 380, "h": 294 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_3v.png", + "format": "RGBA8888", + "size": { + "w": 520, + "h": 520 + }, + "scale": 1, + "frames": [ + { + "filename": "255-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "255-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "255_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "255_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "256-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "256-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "256_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "256_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "261_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "261_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "262_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "262_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "263_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "263_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "264_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "264_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "276_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "276_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "277_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "277_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "278_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "278_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "278_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "279_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "279_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "279_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "280_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "280_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "281_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "281_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "282-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "282-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "282_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "282_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "285_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "285_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "286_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "286_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "290_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "290_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "290_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "291_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "291_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "291_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "292_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "292_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "292_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "298_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "298_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "300_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "300_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "300_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "301_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "301_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "301_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "302-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "302-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "302_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "302_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "303-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "304_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "304_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "304_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "305_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "305_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "305_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "306-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "306-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "306-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "306_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "306_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "306_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "307_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "307_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "308-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "308-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "308_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "308_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "309_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "309_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "310-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "310-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "310_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "310_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "311_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "311_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "311_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "312_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "312_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "315_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "315_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "320_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "320_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "321_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "321_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "327_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "327_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "328_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "328_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "329_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "329_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "330_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "330_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "333_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "333_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "334-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "334-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "334_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "334_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "335_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "335_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "336_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "336_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "337_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "337_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "338_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "338_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "339_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "339_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "340_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "340_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "341_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "341_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "342_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "342_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-rainy_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-rainy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-rainy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-snowy_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-snowy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-snowy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-sunny_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-sunny_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-sunny_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "351_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "351_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "352_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "352_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "352_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "353_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "353_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "354-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "354-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "354_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "354_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "357_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "357_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "358_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "358_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "358_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "359-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "359-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "359_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "359_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "361_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "361_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "362-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "362-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "362_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "362_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "369_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "369_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "370_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "370_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "371_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "371_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "372_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "372_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "373-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "373-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "373_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "373_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "374_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "374_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "375_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "375_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "376-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "376-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "376_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "376_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "377_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "377_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "378_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "378_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "378_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "379_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "379_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "380-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "380-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "380_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "380_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "381-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "381-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "381_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "381_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "382-primal_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "382-primal_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "382_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "382_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "383-primal_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "383-primal_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "383_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "383_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "384-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "384-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "384_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "384_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "385_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "385_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "385_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:673055e796ec5f9913fd1dd04284765c:1804ddee68059c3372bf99289c91dd89:039b026190bf1878996b3e03190bcdf3$" + } } diff --git a/public/images/pokemon_icons_3v.png b/public/images/pokemon_icons_3v.png index 51a1707ea35..6b699b3bfa9 100644 Binary files a/public/images/pokemon_icons_3v.png and b/public/images/pokemon_icons_3v.png differ diff --git a/public/images/pokemon_icons_4v.json b/public/images/pokemon_icons_4v.json index 9113fe89dc8..2f171915e01 100644 --- a/public/images/pokemon_icons_4v.json +++ b/public/images/pokemon_icons_4v.json @@ -1,1390 +1,4409 @@ -{ "frames": { - "387_2": { - "frame": { "x": 39, "y": 225, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "387_3": { - "frame": { "x": 148, "y": 225, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "388_2": { - "frame": { "x": 261, "y": 187, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "388_3": { - "frame": { "x": 64, "y": 190, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "389_2": { - "frame": { "x": 272, "y": 47, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "389_3": { - "frame": { "x": 244, "y": 47, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "393_2": { - "frame": { "x": 69, "y": 275, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "393_3": { - "frame": { "x": 285, "y": 275, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "394_2": { - "frame": { "x": 321, "y": 232, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "394_3": { - "frame": { "x": 0, "y": 244, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "395_2": { - "frame": { "x": 340, "y": 95, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "395_3": { - "frame": { "x": 24, "y": 98, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "399_2": { - "frame": { "x": 24, "y": 123, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "399_3": { - "frame": { "x": 108, "y": 267, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "400_2": { - "frame": { "x": 217, "y": 180, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "400_3": { - "frame": { "x": 239, "y": 180, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "401_2": { - "frame": { "x": 279, "y": 243, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "401_3": { - "frame": { "x": 201, "y": 243, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "402_2": { - "frame": { "x": 97, "y": 186, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "402_3": { - "frame": { "x": 289, "y": 182, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "406_2": { - "frame": { "x": 298, "y": 275, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "406_3": { - "frame": { "x": 184, "y": 225, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "407_2": { - "frame": { "x": 177, "y": 203, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "407_3": { - "frame": { "x": 86, "y": 210, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-plant_1": { - "frame": { "x": 338, "y": 232, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-plant_2": { - "frame": { "x": 184, "y": 243, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-plant_3": { - "frame": { "x": 99, "y": 242, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-sandy_1": { - "frame": { "x": 164, "y": 247, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-sandy_2": { - "frame": { "x": 76, "y": 252, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-sandy_3": { - "frame": { "x": 296, "y": 252, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-trash_1": { - "frame": { "x": 218, "y": 245, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-trash_2": { - "frame": { "x": 132, "y": 244, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-trash_3": { - "frame": { "x": 116, "y": 244, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-plant_1": { - "frame": { "x": 333, "y": 168, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-plant_2": { - "frame": { "x": 311, "y": 168, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-plant_3": { - "frame": { "x": 75, "y": 167, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-sandy_1": { - "frame": { "x": 0, "y": 117, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-sandy_2": { - "frame": { "x": 292, "y": 117, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-sandy_3": { - "frame": { "x": 316, "y": 117, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-trash_1": { - "frame": { "x": 125, "y": 157, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-trash_2": { - "frame": { "x": 319, "y": 145, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-trash_3": { - "frame": { "x": 266, "y": 142, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "414_2": { - "frame": { "x": 120, "y": 180, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "414_3": { - "frame": { "x": 145, "y": 180, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "418_2": { - "frame": { "x": 127, "y": 224, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "418_3": { - "frame": { "x": 0, "y": 224, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "419_2": { - "frame": { "x": 221, "y": 159, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "419_3": { - "frame": { "x": 50, "y": 158, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-east_1": { - "frame": { "x": 197, "y": 203, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-east_2": { - "frame": { "x": 302, "y": 232, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-east_3": { - "frame": { "x": 80, "y": 232, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-west_1": { - "frame": { "x": 36, "y": 265, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-west_2": { - "frame": { "x": 91, "y": 264, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-west_3": { - "frame": { "x": 253, "y": 264, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-east_1": { - "frame": { "x": 148, "y": 157, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-east_2": { - "frame": { "x": 266, "y": 165, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-east_3": { - "frame": { "x": 41, "y": 179, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-west_1": { - "frame": { "x": 97, "y": 164, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-west_2": { - "frame": { "x": 194, "y": 160, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-west_3": { - "frame": { "x": 171, "y": 160, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "424_2": { - "frame": { "x": 303, "y": 0, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "424_3": { - "frame": { "x": 274, "y": 0, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "425_2": { - "frame": { "x": 270, "y": 265, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "425_3": { - "frame": { "x": 234, "y": 265, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "426_2": { - "frame": { "x": 110, "y": 96, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "426_3": { - "frame": { "x": 268, "y": 96, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "427_2": { - "frame": { "x": 21, "y": 225, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "427_3": { - "frame": { "x": 166, "y": 225, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "428-mega_2": { - "frame": { "x": 95, "y": 0, "w": 33, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 5, "w": 33, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "428-mega_3": { - "frame": { "x": 62, "y": 0, "w": 33, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 5, "w": 33, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "428_2": { - "frame": { "x": 47, "y": 117, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "428_3": { - "frame": { "x": 73, "y": 117, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "429_1": { - "frame": { "x": 247, "y": 138, "w": 19, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 19, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "429_2": { - "frame": { "x": 0, "y": 140, "w": 19, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 19, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "429_3": { - "frame": { "x": 78, "y": 139, "w": 19, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 19, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "433_1": { - "frame": { "x": 328, "y": 213, "w": 23, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 23, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "433_2": { - "frame": { "x": 305, "y": 213, "w": 23, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 23, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "433_3": { - "frame": { "x": 61, "y": 211, "w": 23, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 23, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "436_2": { - "frame": { "x": 0, "y": 284, "w": 13, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 13, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "436_3": { - "frame": { "x": 108, "y": 283, "w": 13, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 13, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "437_2": { - "frame": { "x": 239, "y": 117, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "437_3": { - "frame": { "x": 212, "y": 117, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "438_2": { - "frame": { "x": 351, "y": 211, "w": 12, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 12, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "438_3": { - "frame": { "x": 351, "y": 191, "w": 12, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 12, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "440_1": { - "frame": { "x": 163, "y": 270, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "440_2": { - "frame": { "x": 343, "y": 271, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "440_3": { - "frame": { "x": 329, "y": 271, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "441_2": { - "frame": { "x": 157, "y": 203, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "441_3": { - "frame": { "x": 237, "y": 202, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "442_2": { - "frame": { "x": 106, "y": 222, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "442_3": { - "frame": { "x": 197, "y": 223, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "443_1": { - "frame": { "x": 256, "y": 245, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "443_2": { - "frame": { "x": 17, "y": 247, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "443_3": { - "frame": { "x": 234, "y": 246, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "444_1": { - "frame": { "x": 170, "y": 182, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "444_2": { - "frame": { "x": 0, "y": 183, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "444_3": { - "frame": { "x": 193, "y": 182, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445-mega_1": { - "frame": { "x": 214, "y": 0, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445-mega_2": { - "frame": { "x": 184, "y": 0, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445-mega_3": { - "frame": { "x": 244, "y": 0, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445_1": { - "frame": { "x": 207, "y": 48, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445_2": { - "frame": { "x": 87, "y": 49, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445_3": { - "frame": { "x": 331, "y": 49, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "447_1": { - "frame": { "x": 23, "y": 183, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "447_2": { - "frame": { "x": 0, "y": 266, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "447_3": { - "frame": { "x": 18, "y": 266, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448-mega_1": { - "frame": { "x": 138, "y": 200, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448-mega_2": { - "frame": { "x": 42, "y": 201, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448-mega_3": { - "frame": { "x": 23, "y": 201, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448_1": { - "frame": { "x": 195, "y": 265, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448_2": { - "frame": { "x": 179, "y": 265, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448_3": { - "frame": { "x": 53, "y": 265, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "453_2": { - "frame": { "x": 128, "y": 267, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "453_3": { - "frame": { "x": 211, "y": 268, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "454_2": { - "frame": { "x": 330, "y": 191, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "454_3": { - "frame": { "x": 342, "y": 145, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "456_2": { - "frame": { "x": 56, "y": 247, "w": 20, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 20, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "456_3": { - "frame": { "x": 36, "y": 247, "w": 20, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 20, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "457_2": { - "frame": { "x": 19, "y": 160, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "457_3": { - "frame": { "x": 289, "y": 159, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "458_2": { - "frame": { "x": 311, "y": 254, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "458_3": { - "frame": { "x": 331, "y": 254, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "461_2": { - "frame": { "x": 218, "y": 223, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "461_3": { - "frame": { "x": 237, "y": 224, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "462_2": { - "frame": { "x": 58, "y": 70, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "462_3": { - "frame": { "x": 329, "y": 71, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "464_2": { - "frame": { "x": 83, "y": 95, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "464_3": { - "frame": { "x": 313, "y": 95, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "465_2": { - "frame": { "x": 145, "y": 53, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "465_3": { - "frame": { "x": 300, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "466_1": { - "frame": { "x": 216, "y": 94, "w": 26, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "466_2": { - "frame": { "x": 242, "y": 94, "w": 26, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "466_3": { - "frame": { "x": 57, "y": 94, "w": 26, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "467_2": { - "frame": { "x": 171, "y": 138, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "467_3": { - "frame": { "x": 121, "y": 120, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "468_1": { - "frame": { "x": 97, "y": 145, "w": 28, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "468_2": { - "frame": { "x": 291, "y": 140, "w": 28, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "468_3": { - "frame": { "x": 50, "y": 139, "w": 28, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "469_2": { - "frame": { "x": 204, "y": 70, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "469_3": { - "frame": { "x": 174, "y": 70, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "470_1": { - "frame": { "x": 266, "y": 120, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "470_2": { - "frame": { "x": 146, "y": 135, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "470_3": { - "frame": { "x": 196, "y": 138, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "471_1": { - "frame": { "x": 110, "y": 73, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "471_2": { - "frame": { "x": 286, "y": 73, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "471_3": { - "frame": { "x": 137, "y": 75, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "472_2": { - "frame": { "x": 275, "y": 25, "w": 31, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 6, "w": 31, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "472_3": { - "frame": { "x": 244, "y": 25, "w": 31, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 6, "w": 31, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "474_2": { - "frame": { "x": 292, "y": 96, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "474_3": { - "frame": { "x": 216, "y": 202, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475-mega_2": { - "frame": { "x": 120, "y": 47, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475-mega_3": { - "frame": { "x": 33, "y": 28, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475_2": { - "frame": { "x": 99, "y": 120, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475_3": { - "frame": { "x": 340, "y": 120, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "478_2": { - "frame": { "x": 148, "y": 247, "w": 16, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 16, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "478_3": { - "frame": { "x": 313, "y": 73, "w": 16, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 16, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-fan_2": { - "frame": { "x": 221, "y": 138, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-fan_3": { - "frame": { "x": 24, "y": 139, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-frost_2": { - "frame": { "x": 214, "y": 25, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-frost_3": { - "frame": { "x": 184, "y": 25, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-heat_2": { - "frame": { "x": 58, "y": 48, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-heat_3": { - "frame": { "x": 0, "y": 70, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-mow_2": { - "frame": { "x": 192, "y": 91, "w": 24, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-mow_3": { - "frame": { "x": 0, "y": 92, "w": 24, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-wash_2": { - "frame": { "x": 164, "y": 91, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-wash_3": { - "frame": { "x": 29, "y": 76, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479_2": { - "frame": { "x": 156, "y": 0, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479_3": { - "frame": { "x": 128, "y": 0, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "480_1": { - "frame": { "x": 186, "y": 116, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "480_2": { - "frame": { "x": 160, "y": 113, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "480_3": { - "frame": { "x": 134, "y": 98, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "481_1": { - "frame": { "x": 178, "y": 48, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "481_2": { - "frame": { "x": 0, "y": 48, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "481_3": { - "frame": { "x": 29, "y": 54, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "482_1": { - "frame": { "x": 84, "y": 71, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "482_2": { - "frame": { "x": 260, "y": 70, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "482_3": { - "frame": { "x": 234, "y": 70, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "485_2": { - "frame": { "x": 0, "y": 28, "w": 33, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 33, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "485_3": { - "frame": { "x": 120, "y": 27, "w": 33, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 33, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "487-altered_2": { - "frame": { "x": 332, "y": 0, "w": 30, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "487-altered_3": { - "frame": { "x": 62, "y": 24, "w": 30, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "487-origin_2": { - "frame": { "x": 92, "y": 24, "w": 28, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 28, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "487-origin_3": { - "frame": { "x": 332, "y": 24, "w": 28, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 28, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "488_2": { - "frame": { "x": 153, "y": 27, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "488_3": { - "frame": { "x": 306, "y": 25, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "489_1": { - "frame": { "x": 57, "y": 230, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "489_2": { - "frame": { "x": 279, "y": 226, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "489_3": { - "frame": { "x": 256, "y": 228, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "490_1": { - "frame": { "x": 257, "y": 208, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "490_2": { - "frame": { "x": 283, "y": 206, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "490_3": { - "frame": { "x": 0, "y": 204, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "491_2": { - "frame": { "x": 0, "y": 0, "w": 31, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 31, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "491_3": { - "frame": { "x": 31, "y": 0, "w": 31, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 31, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "492-land_2": { - "frame": { "x": 145, "y": 269, "w": 18, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 18, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "492-land_3": { - "frame": { "x": 311, "y": 271, "w": 18, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 18, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "492-sky_2": { - "frame": { "x": 117, "y": 200, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "492-sky_3": { - "frame": { "x": 309, "y": 191, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_4v.png", - "format": "RGBA8888", - "size": { "w": 363, "h": 300 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_4v.png", + "format": "RGBA8888", + "size": { + "w": 520, + "h": 520 + }, + "scale": 1, + "frames": [ + { + "filename": "387_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "387_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "388_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "388_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "389_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "389_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "390_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "390_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "391_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "391_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "392_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "392_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "393_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "393_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "394_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "394_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "395_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "395_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "399_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "399_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "400_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "400_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "401_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "401_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "402_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "402_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "406_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "406_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "407_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "407_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-plant_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-plant_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-plant_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-sandy_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-sandy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-sandy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-trash_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-trash_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-trash_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-plant_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-plant_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-plant_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-sandy_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-sandy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-sandy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-trash_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-trash_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-trash_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "414_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "414_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "418_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "418_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "419_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "419_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-east_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-east_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-east_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-west_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-west_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-west_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-east_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-east_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-east_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-west_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-west_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-west_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "424_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "424_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "425_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "425_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "426_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "426_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "427_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "427_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "428-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "428-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "428_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "428_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "429_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "429_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "429_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "430_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "430_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "433_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "433_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "433_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "436_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "436_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "437_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "437_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "438_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "438_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "440_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "440_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "440_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "441_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "441_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "442_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "442_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "443_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "443_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "443_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "444_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "444_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "444_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "447_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "447_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "447_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "448-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "448-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "448-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "448_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "448_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "448_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "453_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "453_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "454_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "454_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "455_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "455_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "456_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "456_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "457_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "457_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "458_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "458_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "461_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "461_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "462_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "462_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "464_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "464_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "465_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "465_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "466_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "466_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "466_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "467_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "467_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "468_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "468_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "468_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "469_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "469_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "470_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "470_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "470_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "471_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "471_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "471_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "472_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "472_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "474_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "474_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "475-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "475-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "475_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "475_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "478_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "478_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-fan_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-fan_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-frost_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-frost_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-heat_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-heat_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-mow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-mow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-wash_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-wash_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "480_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "480_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "480_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "481_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "481_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "481_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "482_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "482_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "482_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "485_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "485_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "486_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "486_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "487-altered_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "487-altered_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "487-origin_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "487-origin_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "488_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "488_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "489_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "489_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "489_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "490_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "490_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "490_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "491_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "491_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "492-land_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "492-land_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "492-sky_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "492-sky_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:2288ca6bd49f36a5ca5b49f1bcaab17a:e83f40529aad7883718910695eafd075:ebc3f8ec5b2480b298192d752b6e57dc$" + } } diff --git a/public/images/pokemon_icons_4v.png b/public/images/pokemon_icons_4v.png index 4dbf5cc6918..7cfab80312a 100644 Binary files a/public/images/pokemon_icons_4v.png and b/public/images/pokemon_icons_4v.png differ diff --git a/public/images/pokemon_icons_5v.json b/public/images/pokemon_icons_5v.json index ef3ce80e8ef..7da5a765c0c 100644 --- a/public/images/pokemon_icons_5v.json +++ b/public/images/pokemon_icons_5v.json @@ -1,1341 +1,4640 @@ -{ "frames": { - "494_2": { - "frame": { "x": 251, "y": 190, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "494_3": { - "frame": { "x": 212, "y": 186, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "495_2": { - "frame": { "x": 192, "y": 225, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "495_3": { - "frame": { "x": 103, "y": 224, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "496_2": { - "frame": { "x": 138, "y": 180, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "496_3": { - "frame": { "x": 95, "y": 183, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "497_2": { - "frame": { "x": 28, "y": 94, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "497_3": { - "frame": { "x": 242, "y": 74, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "517_2": { - "frame": { "x": 92, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "517_3": { - "frame": { "x": 62, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "518_2": { - "frame": { "x": 288, "y": 149, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "518_3": { - "frame": { "x": 0, "y": 164, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "524_2": { - "frame": { "x": 88, "y": 140, "w": 11, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 11, "w": 11, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "524_3": { - "frame": { "x": 99, "y": 118, "w": 11, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 11, "w": 11, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "525_2": { - "frame": { "x": 47, "y": 164, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "525_3": { - "frame": { "x": 23, "y": 164, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "526_2": { - "frame": { "x": 95, "y": 26, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "526_3": { - "frame": { "x": 157, "y": 26, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "529_2": { - "frame": { "x": 202, "y": 208, "w": 21, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 21, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "529_3": { - "frame": { "x": 269, "y": 209, "w": 21, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 21, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "530_2": { - "frame": { "x": 183, "y": 71, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "530_3": { - "frame": { "x": 0, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "531-mega_2": { - "frame": { "x": 292, "y": 97, "w": 22, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "531-mega_3": { - "frame": { "x": 270, "y": 74, "w": 22, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "531_2": { - "frame": { "x": 311, "y": 169, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "531_3": { - "frame": { "x": 263, "y": 168, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "532_2": { - "frame": { "x": 71, "y": 179, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "532_3": { - "frame": { "x": 60, "y": 75, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "533_2": { - "frame": { "x": 242, "y": 50, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "533_3": { - "frame": { "x": 269, "y": 50, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "534_2": { - "frame": { "x": 249, "y": 0, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 5, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "534_3": { - "frame": { "x": 218, "y": 0, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 5, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "538_2": { - "frame": { "x": 166, "y": 115, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "538_3": { - "frame": { "x": 0, "y": 116, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "539_2": { - "frame": { "x": 169, "y": 165, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "539_3": { - "frame": { "x": 208, "y": 164, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "540_2": { - "frame": { "x": 16, "y": 248, "w": 15, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 11, "w": 15, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "540_3": { - "frame": { "x": 297, "y": 245, "w": 15, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 11, "w": 15, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "541_2": { - "frame": { "x": 288, "y": 229, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "541_3": { - "frame": { "x": 57, "y": 230, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "542_2": { - "frame": { "x": 195, "y": 242, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "542_3": { - "frame": { "x": 181, "y": 242, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "543_2": { - "frame": { "x": 312, "y": 249, "w": 18, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 14, "w": 18, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "543_3": { - "frame": { "x": 241, "y": 249, "w": 18, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 14, "w": 18, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "544_2": { - "frame": { "x": 223, "y": 213, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "544_3": { - "frame": { "x": 245, "y": 213, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "545_2": { - "frame": { "x": 154, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "545_3": { - "frame": { "x": 115, "y": 71, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "546_2": { - "frame": { "x": 160, "y": 242, "w": 21, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "546_3": { - "frame": { "x": 139, "y": 242, "w": 21, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "547_2": { - "frame": { "x": 230, "y": 171, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "547_3": { - "frame": { "x": 285, "y": 171, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "548_1": { - "frame": { "x": 251, "y": 171, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "548_2": { - "frame": { "x": 340, "y": 97, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "548_3": { - "frame": { "x": 228, "y": 97, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "549_2": { - "frame": { "x": 191, "y": 165, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "549_3": { - "frame": { "x": 335, "y": 119, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "551_2": { - "frame": { "x": 324, "y": 211, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 13, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "551_3": { - "frame": { "x": 62, "y": 214, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 13, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "552_2": { - "frame": { "x": 88, "y": 158, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "552_3": { - "frame": { "x": 144, "y": 159, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "553_2": { - "frame": { "x": 324, "y": 50, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "553_3": { - "frame": { "x": 296, "y": 50, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "556_2": { - "frame": { "x": 99, "y": 135, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "556_3": { - "frame": { "x": 253, "y": 124, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "559_1": { - "frame": { "x": 166, "y": 256, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "559_2": { - "frame": { "x": 136, "y": 256, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "559_3": { - "frame": { "x": 151, "y": 256, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "560_1": { - "frame": { "x": 144, "y": 138, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "560_2": { - "frame": { "x": 117, "y": 183, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "560_3": { - "frame": { "x": 23, "y": 185, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "562_2": { - "frame": { "x": 127, "y": 220, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "562_3": { - "frame": { "x": 290, "y": 213, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "563_2": { - "frame": { "x": 218, "y": 25, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "563_3": { - "frame": { "x": 307, "y": 0, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "568_2": { - "frame": { "x": 181, "y": 205, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "568_3": { - "frame": { "x": 0, "y": 205, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "569-gigantamax_2": { - "frame": { "x": 32, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "569-gigantamax_3": { - "frame": { "x": 0, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "569_2": { - "frame": { "x": 277, "y": 28, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "569_3": { - "frame": { "x": 0, "y": 29, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "570_2": { - "frame": { "x": 209, "y": 247, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "570_3": { - "frame": { "x": 225, "y": 247, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "571_2": { - "frame": { "x": 86, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "571_3": { - "frame": { "x": 29, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "572_2": { - "frame": { "x": 43, "y": 185, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "572_3": { - "frame": { "x": 0, "y": 186, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "577_1": { - "frame": { "x": 47, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "577_2": { - "frame": { "x": 71, "y": 164, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "577_3": { - "frame": { "x": 77, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "578_1": { - "frame": { "x": 0, "y": 241, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "578_2": { - "frame": { "x": 93, "y": 241, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "578_3": { - "frame": { "x": 77, "y": 241, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "579_1": { - "frame": { "x": 0, "y": 73, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "579_2": { - "frame": { "x": 30, "y": 73, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "579_3": { - "frame": { "x": 144, "y": 73, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "585-autumn_1": { - "frame": { "x": 333, "y": 145, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "585-spring_1": { - "frame": { "x": 333, "y": 167, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "585-summer_1": { - "frame": { "x": 333, "y": 189, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "585-winter_1": { - "frame": { "x": 306, "y": 191, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "586-autumn_1": { - "frame": { "x": 86, "y": 73, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "586-spring_1": { - "frame": { "x": 51, "y": 116, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "586-summer_1": { - "frame": { "x": 28, "y": 116, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "586-winter_1": { - "frame": { "x": 267, "y": 100, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592-f_1": { - "frame": { "x": 89, "y": 203, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592-f_2": { - "frame": { "x": 43, "y": 204, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592-f_3": { - "frame": { "x": 108, "y": 204, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592_2": { - "frame": { "x": 137, "y": 200, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592_3": { - "frame": { "x": 230, "y": 193, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593-f_1": { - "frame": { "x": 56, "y": 94, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593-f_2": { - "frame": { "x": 139, "y": 94, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593-f_3": { - "frame": { "x": 240, "y": 96, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593_2": { - "frame": { "x": 0, "y": 94, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593_3": { - "frame": { "x": 212, "y": 75, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "594_2": { - "frame": { "x": 264, "y": 242, "w": 13, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 13, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "594_3": { - "frame": { "x": 34, "y": 243, "w": 13, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 13, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "595_2": { - "frame": { "x": 149, "y": 226, "w": 21, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "595_3": { - "frame": { "x": 267, "y": 226, "w": 21, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "596_2": { - "frame": { "x": 174, "y": 93, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "596_3": { - "frame": { "x": 111, "y": 93, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "602_2": { - "frame": { "x": 107, "y": 262, "w": 14, "h": 11 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 17, "w": 14, "h": 11 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "602_3": { - "frame": { "x": 290, "y": 262, "w": 14, "h": 11 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 17, "w": 14, "h": 11 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "603_2": { - "frame": { "x": 191, "y": 186, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "603_3": { - "frame": { "x": 160, "y": 187, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "604_2": { - "frame": { "x": 186, "y": 49, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "604_3": { - "frame": { "x": 124, "y": 49, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "605_1": { - "frame": { "x": 123, "y": 256, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "605_2": { - "frame": { "x": 330, "y": 249, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "605_3": { - "frame": { "x": 293, "y": 193, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "606_1": { - "frame": { "x": 19, "y": 226, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "606_2": { - "frame": { "x": 312, "y": 227, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "606_3": { - "frame": { "x": 327, "y": 227, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "607_2": { - "frame": { "x": 0, "y": 260, "w": 13, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 13, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "607_3": { - "frame": { "x": 277, "y": 259, "w": 13, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 13, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "608_2": { - "frame": { "x": 0, "y": 223, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "608_3": { - "frame": { "x": 84, "y": 223, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "609_2": { - "frame": { "x": 64, "y": 27, "w": 29, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 29, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "609_3": { - "frame": { "x": 186, "y": 26, "w": 29, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 29, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "610_2": { - "frame": { "x": 21, "y": 206, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "610_3": { - "frame": { "x": 156, "y": 206, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "611_2": { - "frame": { "x": 113, "y": 162, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "611_3": { - "frame": { "x": 263, "y": 147, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "612_2": { - "frame": { "x": 322, "y": 73, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "612_3": { - "frame": { "x": 296, "y": 73, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "618_2": { - "frame": { "x": 277, "y": 245, "w": 20, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 20, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "618_3": { - "frame": { "x": 47, "y": 246, "w": 20, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 20, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "619_2": { - "frame": { "x": 39, "y": 224, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "619_3": { - "frame": { "x": 174, "y": 223, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "620_2": { - "frame": { "x": 228, "y": 118, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "620_3": { - "frame": { "x": 74, "y": 118, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "622_2": { - "frame": { "x": 212, "y": 229, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "622_3": { - "frame": { "x": 230, "y": 229, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "623_2": { - "frame": { "x": 60, "y": 50, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "623_3": { - "frame": { "x": 216, "y": 50, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "631_2": { - "frame": { "x": 83, "y": 98, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "631_3": { - "frame": { "x": 111, "y": 115, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "632_2": { - "frame": { "x": 65, "y": 198, "w": 24, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "632_3": { - "frame": { "x": 269, "y": 193, "w": 24, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "633_2": { - "frame": { "x": 248, "y": 229, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "633_3": { - "frame": { "x": 123, "y": 236, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "634_2": { - "frame": { "x": 202, "y": 97, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "634_3": { - "frame": { "x": 314, "y": 97, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "635_2": { - "frame": { "x": 307, "y": 25, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "635_3": { - "frame": { "x": 248, "y": 25, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "640_2": { - "frame": { "x": 290, "y": 123, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "640_3": { - "frame": { "x": 314, "y": 119, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "641-incarnate_1": { - "frame": { "x": 188, "y": 0, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "641-therian_1": { - "frame": { "x": 127, "y": 0, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "642-incarnate_1": { - "frame": { "x": 64, "y": 0, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "642-therian_1": { - "frame": { "x": 95, "y": 0, "w": 32, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 32, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "645-incarnate_1": { - "frame": { "x": 157, "y": 0, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "645-therian_1": { - "frame": { "x": 280, "y": 0, "w": 27, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 27, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "647-ordinary_2": { - "frame": { "x": 194, "y": 119, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "647-ordinary_3": { - "frame": { "x": 139, "y": 116, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "647-resolute_2": { - "frame": { "x": 124, "y": 27, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "647-resolute_3": { - "frame": { "x": 30, "y": 29, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "648-aria_2": { - "frame": { "x": 109, "y": 241, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "648-aria_3": { - "frame": { "x": 276, "y": 124, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "648-pirouette_2": { - "frame": { "x": 337, "y": 23, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "648-pirouette_3": { - "frame": { "x": 337, "y": 0, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-burn_2": { - "frame": { "x": 22, "y": 140, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-burn_3": { - "frame": { "x": 122, "y": 138, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-chill_2": { - "frame": { "x": 0, "y": 136, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-chill_3": { - "frame": { "x": 164, "y": 135, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-douse_2": { - "frame": { "x": 241, "y": 147, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-douse_3": { - "frame": { "x": 311, "y": 145, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-shock_2": { - "frame": { "x": 186, "y": 141, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-shock_3": { - "frame": { "x": 219, "y": 140, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649_2": { - "frame": { "x": 66, "y": 140, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649_3": { - "frame": { "x": 44, "y": 140, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_5v.png", - "format": "RGBA8888", - "size": { "w": 352, "h": 278 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_5v.png", + "format": "RGBA8888", + "size": { + "w": 520, + "h": 520 + }, + "scale": 1, + "frames": [ + { + "filename": "494_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "494_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "495_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "495_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "496_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "496_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "497_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "497_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "501_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "501_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "502_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "502_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "503_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "503_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "517_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "517_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "518_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "518_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "524_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "524_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "525_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "525_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "526_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "526_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "527_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "527_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "528_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "528_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "529_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "529_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "530_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "530_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "531-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "531-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "531_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "531_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "532_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "532_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "533_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "533_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "534_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "534_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "538_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "538_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "539_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "539_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "540_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "540_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "541_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "541_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "542_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "542_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "543_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "543_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "544_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "544_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "545_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "545_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "546_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "546_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "547_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "547_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "548_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "548_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "548_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "549_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "549_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "551_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "551_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "552_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "552_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "553_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "553_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "556_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "556_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "559_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "559_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "559_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "560_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "560_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "560_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "562_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "562_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "563_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "563_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "568_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "568_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "569-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "569-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "569_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "569_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "570_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "570_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "571_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "571_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "572_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "572_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "577_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "577_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "577_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "578_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "578_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "578_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "579_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "579_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "579_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "585-autumn_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "585-spring_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "585-summer_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "585-winter_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "586-autumn_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "586-spring_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "586-summer_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "586-winter_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "587_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "587_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "588_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "588_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "589_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "589_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "590_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "590_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "591_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "591_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592-f_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "593-f_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "593-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "593-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "593_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "593_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "594_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "594_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "595_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "595_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "596_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "596_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "602_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "602_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "603_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "603_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "604_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "604_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "605_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "605_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "605_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "606_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "606_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "606_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "607_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "607_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "608_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "608_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "609_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "609_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "610_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "610_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "611_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "611_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "612_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "612_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "616_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "616_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "617_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "617_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "618_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "618_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "619_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "619_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "620_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "620_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "621_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "621_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "622_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "622_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "623_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "623_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "631_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "631_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "632_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "632_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "633_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "633_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "634_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "634_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "635_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "635_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "636_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "636_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "637_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "637_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "640_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "640_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "641-incarnate_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "641-therian_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "642-incarnate_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "642-therian_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "645-incarnate_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "645-therian_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "647-ordinary_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "647-ordinary_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "647-resolute_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "647-resolute_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "648-aria_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "648-aria_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "648-pirouette_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "648-pirouette_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-burn_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-burn_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-chill_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-chill_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-douse_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-douse_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-shock_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-shock_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b615ea9a62bec26b97d0171030d11a55:35fd8571f91311ef2e9944578f979466:f1931bc28ee7f32dba7543723757cf2a$" + } } diff --git a/public/images/pokemon_icons_5v.png b/public/images/pokemon_icons_5v.png index 917e0621263..9dd1b278ac1 100644 Binary files a/public/images/pokemon_icons_5v.png and b/public/images/pokemon_icons_5v.png differ diff --git a/public/images/pokemon_icons_6v.json b/public/images/pokemon_icons_6v.json index 600624ca730..8061ed9152b 100644 --- a/public/images/pokemon_icons_6v.json +++ b/public/images/pokemon_icons_6v.json @@ -1,1026 +1,3905 @@ -{ "frames": { - "2670_2": { - "frame": { "x": 119, "y": 159, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2670_3": { - "frame": { "x": 175, "y": 157, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "653_2": { - "frame": { "x": 142, "y": 204, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "653_3": { - "frame": { "x": 304, "y": 210, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "654_2": { - "frame": { "x": 322, "y": 22, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "654_3": { - "frame": { "x": 322, "y": 0, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "655_2": { - "frame": { "x": 287, "y": 145, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "655_3": { - "frame": { "x": 260, "y": 145, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "664_2": { - "frame": { "x": 38, "y": 214, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "664_3": { - "frame": { "x": 159, "y": 204, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "665_2": { - "frame": { "x": 173, "y": 217, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "665_3": { - "frame": { "x": 52, "y": 218, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-archipelago_2": { - "frame": { "x": 78, "y": 105, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-archipelago_3": { - "frame": { "x": 130, "y": 107, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-continental_2": { - "frame": { "x": 156, "y": 107, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-continental_3": { - "frame": { "x": 182, "y": 107, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-elegant_2": { - "frame": { "x": 260, "y": 120, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-elegant_3": { - "frame": { "x": 286, "y": 120, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-fancy_2": { - "frame": { "x": 52, "y": 105, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-fancy_3": { - "frame": { "x": 208, "y": 126, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-garden_2": { - "frame": { "x": 156, "y": 82, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-garden_3": { - "frame": { "x": 234, "y": 126, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-high-plains_2": { - "frame": { "x": 0, "y": 130, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-high-plains_3": { - "frame": { "x": 26, "y": 130, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-icy-snow_2": { - "frame": { "x": 0, "y": 55, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-icy-snow_3": { - "frame": { "x": 26, "y": 55, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-jungle_2": { - "frame": { "x": 52, "y": 55, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-jungle_3": { - "frame": { "x": 78, "y": 55, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-marine_2": { - "frame": { "x": 104, "y": 57, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-marine_3": { - "frame": { "x": 130, "y": 57, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-meadow_2": { - "frame": { "x": 156, "y": 57, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-meadow_3": { - "frame": { "x": 182, "y": 57, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-modern_2": { - "frame": { "x": 268, "y": 70, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-modern_3": { - "frame": { "x": 294, "y": 70, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-monsoon_2": { - "frame": { "x": 208, "y": 76, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-monsoon_3": { - "frame": { "x": 234, "y": 76, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-ocean_2": { - "frame": { "x": 312, "y": 120, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-ocean_3": { - "frame": { "x": 0, "y": 80, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-poke-ball_2": { - "frame": { "x": 26, "y": 80, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-poke-ball_3": { - "frame": { "x": 52, "y": 80, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-polar_2": { - "frame": { "x": 78, "y": 80, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-polar_3": { - "frame": { "x": 104, "y": 82, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-river_2": { - "frame": { "x": 130, "y": 82, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-river_3": { - "frame": { "x": 104, "y": 107, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-sandstorm_2": { - "frame": { "x": 182, "y": 82, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-sandstorm_3": { - "frame": { "x": 260, "y": 95, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-savanna_2": { - "frame": { "x": 286, "y": 95, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-savanna_3": { - "frame": { "x": 312, "y": 95, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-sun_2": { - "frame": { "x": 208, "y": 101, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-sun_3": { - "frame": { "x": 234, "y": 101, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-tundra_2": { - "frame": { "x": 0, "y": 105, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-tundra_3": { - "frame": { "x": 26, "y": 105, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-blue_2": { - "frame": { "x": 0, "y": 220, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-blue_3": { - "frame": { "x": 142, "y": 223, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-orange_2": { - "frame": { "x": 83, "y": 223, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-orange_3": { - "frame": { "x": 113, "y": 224, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-red_2": { - "frame": { "x": 157, "y": 225, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-red_3": { - "frame": { "x": 229, "y": 229, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-white_2": { - "frame": { "x": 296, "y": 229, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-white_3": { - "frame": { "x": 189, "y": 218, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-yellow_2": { - "frame": { "x": 98, "y": 219, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-yellow_3": { - "frame": { "x": 68, "y": 223, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-blue_2": { - "frame": { "x": 175, "y": 178, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-blue_3": { - "frame": { "x": 138, "y": 180, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-orage_2": { - "frame": { "x": 86, "y": 182, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-orage_3": { - "frame": { "x": 268, "y": 190, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-red_2": { - "frame": { "x": 67, "y": 179, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-red_3": { - "frame": { "x": 119, "y": 180, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-white_2": { - "frame": { "x": 249, "y": 190, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-white_3": { - "frame": { "x": 198, "y": 175, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-yellow_2": { - "frame": { "x": 0, "y": 177, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-yellow_3": { - "frame": { "x": 19, "y": 177, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-blue_2": { - "frame": { "x": 230, "y": 27, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-blue_3": { - "frame": { "x": 182, "y": 30, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-orange_2": { - "frame": { "x": 156, "y": 30, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-orange_3": { - "frame": { "x": 256, "y": 27, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-red_2": { - "frame": { "x": 0, "y": 28, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-red_3": { - "frame": { "x": 26, "y": 28, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-white_2": { - "frame": { "x": 52, "y": 28, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-white_3": { - "frame": { "x": 130, "y": 30, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-yellow_2": { - "frame": { "x": 78, "y": 28, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-yellow_3": { - "frame": { "x": 104, "y": 30, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "672_2": { - "frame": { "x": 263, "y": 212, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "672_3": { - "frame": { "x": 321, "y": 213, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "673_2": { - "frame": { "x": 23, "y": 155, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "673_3": { - "frame": { "x": 0, "y": 155, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "677_2": { - "frame": { "x": 280, "y": 215, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "677_3": { - "frame": { "x": 18, "y": 216, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "678-female_2": { - "frame": { "x": 316, "y": 169, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "678-female_3": { - "frame": { "x": 253, "y": 168, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "678_2": { - "frame": { "x": 295, "y": 169, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "678_3": { - "frame": { "x": 274, "y": 168, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "690_2": { - "frame": { "x": 194, "y": 197, "w": 18, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "690_3": { - "frame": { "x": 0, "y": 199, "w": 18, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "691_2": { - "frame": { "x": 290, "y": 0, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "691_3": { - "frame": { "x": 290, "y": 23, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "696_2": { - "frame": { "x": 174, "y": 200, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "696_3": { - "frame": { "x": 18, "y": 199, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "697_2": { - "frame": { "x": 208, "y": 54, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "697_3": { - "frame": { "x": 238, "y": 54, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "698_2": { - "frame": { "x": 157, "y": 180, "w": 17, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "698_3": { - "frame": { "x": 287, "y": 191, "w": 17, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "699_2": { - "frame": { "x": 130, "y": 132, "w": 24, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 24, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "699_3": { - "frame": { "x": 106, "y": 132, "w": 24, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 24, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "700_2": { - "frame": { "x": 320, "y": 70, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "700_3": { - "frame": { "x": 208, "y": 30, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "702_2": { - "frame": { "x": 105, "y": 202, "w": 22, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 11, "w": 22, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "702_3": { - "frame": { "x": 59, "y": 201, "w": 22, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 11, "w": 22, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "703_2": { - "frame": { "x": 105, "y": 182, "w": 14, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 15, "w": 14, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "703_3": { - "frame": { "x": 268, "y": 54, "w": 14, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 15, "w": 14, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "704_2": { - "frame": { "x": 142, "y": 159, "w": 12, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 14, "w": 12, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "704_3": { - "frame": { "x": 128, "y": 224, "w": 12, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 14, "w": 12, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "705_2": { - "frame": { "x": 325, "y": 191, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "705_3": { - "frame": { "x": 127, "y": 202, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "706_2": { - "frame": { "x": 204, "y": 151, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "706_3": { - "frame": { "x": 314, "y": 145, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "708_2": { - "frame": { "x": 228, "y": 151, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "708_3": { - "frame": { "x": 52, "y": 154, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "709_2": { - "frame": { "x": 154, "y": 132, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "709_3": { - "frame": { "x": 179, "y": 132, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "710_2": { - "frame": { "x": 81, "y": 204, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "710_3": { - "frame": { "x": 212, "y": 211, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "711_1": { - "frame": { "x": 77, "y": 156, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "711_2": { - "frame": { "x": 154, "y": 157, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "711_3": { - "frame": { "x": 98, "y": 159, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "712_2": { - "frame": { "x": 229, "y": 211, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "712_3": { - "frame": { "x": 246, "y": 212, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "713_2": { - "frame": { "x": 52, "y": 130, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "713_3": { - "frame": { "x": 79, "y": 132, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "714_2": { - "frame": { "x": 46, "y": 175, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "714_3": { - "frame": { "x": 228, "y": 172, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "715_2": { - "frame": { "x": 310, "y": 46, "w": 28, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 28, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "715_3": { - "frame": { "x": 282, "y": 46, "w": 28, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 28, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "716-active_2": { - "frame": { "x": 114, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "716-active_3": { - "frame": { "x": 143, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "716-neutral_2": { - "frame": { "x": 172, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "716-neutral_3": { - "frame": { "x": 201, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "717_2": { - "frame": { "x": 230, "y": 0, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "717_3": { - "frame": { "x": 260, "y": 0, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720-unbound_1": { - "frame": { "x": 38, "y": 0, "w": 38, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720-unbound_2": { - "frame": { "x": 76, "y": 0, "w": 38, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720-unbound_3": { - "frame": { "x": 0, "y": 0, "w": 38, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720_1": { - "frame": { "x": 217, "y": 192, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720_2": { - "frame": { "x": 38, "y": 195, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720_3": { - "frame": { "x": 304, "y": 191, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_6v.png", - "format": "RGBA8888", - "size": { "w": 342, "h": 247 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_6v.png", + "format": "RGBA8888", + "size": { + "w": 480, + "h": 480 + }, + "scale": 1, + "frames": [ + { + "filename": "653_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "653_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "654_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "654_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "655_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "655_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "656_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "656_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "657_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "657_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "658-ash_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "658-ash_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "658_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "658_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "664_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "664_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "665_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "665_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-archipelago_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-archipelago_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-continental_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-continental_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-elegant_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-elegant_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-fancy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-fancy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-garden_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-garden_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-high-plains_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-high-plains_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-icy-snow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-icy-snow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-jungle_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-jungle_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-marine_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-marine_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-meadow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-meadow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-modern_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-modern_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-monsoon_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-monsoon_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-ocean_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-ocean_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-poke-ball_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-poke-ball_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-polar_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-polar_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-river_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-river_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-sandstorm_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-sandstorm_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-savanna_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-savanna_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-sun_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-sun_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-tundra_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-tundra_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-blue_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-blue_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-orange_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-orange_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-red_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-red_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-white_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-white_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-yellow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-yellow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-blue_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-blue_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-orange_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-orange_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-red_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-red_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-white_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-white_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-yellow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-yellow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-blue_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-blue_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-orange_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-orange_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-red_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-red_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-white_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-white_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-yellow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-yellow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "672_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "672_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "673_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "673_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-dandy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-dandy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-debutante_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-debutante_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-diamond_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-diamond_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-heart_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-heart_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-kabuki_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-kabuki_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-la-reine_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-la-reine_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-matron_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-matron_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-pharaoh_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-pharaoh_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-star_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-star_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "676_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "676_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "677_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "677_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "678-female_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "678-female_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "678_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "678_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "682_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "682_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "683_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "683_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "684_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "684_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "685_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "685_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "688_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "688_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "689_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "689_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "690_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "690_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "691_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "691_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "696_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "696_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "697_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "697_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "698_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "698_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "699_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "699_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "700_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "700_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "702_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "702_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "703_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "703_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "704_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "704_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "705_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "705_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "706_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "706_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "708_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "708_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "709_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "709_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "710_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "710_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "711_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "711_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "711_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "712_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "712_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "713_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "713_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "714_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "714_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "715_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "715_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "716-active_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "716-active_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "716-neutral_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "716-neutral_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "717_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "717_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "720-unbound_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "720-unbound_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "720-unbound_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "720_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "720_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "720_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "2670_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "2670_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:41960148e7a74c451d8ed1c46adc4e09:5dc2b45aa8a432e966da6c4070905be6:8a74f769af240f74b0e67390bbb36c14$" + } } diff --git a/public/images/pokemon_icons_6v.png b/public/images/pokemon_icons_6v.png index 83e29e28738..29d00876b50 100644 Binary files a/public/images/pokemon_icons_6v.png and b/public/images/pokemon_icons_6v.png differ diff --git a/public/images/pokemon_icons_7.json b/public/images/pokemon_icons_7.json index 0523a232d79..03eeba88a70 100644 --- a/public/images/pokemon_icons_7.json +++ b/public/images/pokemon_icons_7.json @@ -5,7 +5,7 @@ "format": "RGBA8888", "size": { "w": 502, - "h": 323 + "h": 325 }, "scale": 1, "frames": [ @@ -324,48 +324,6 @@ "h": 29 } }, - { - "filename": "795", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 293, - "w": 28, - "h": 30 - } - }, - { - "filename": "795s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 28, - "y": 293, - "w": 28, - "h": 30 - } - }, { "filename": "798s", "rotated": false, @@ -381,8 +339,8 @@ "h": 29 }, "frame": { - "x": 112, - "y": 0, + "x": 0, + "y": 293, "w": 31, "h": 29 } @@ -402,7 +360,7 @@ "h": 28 }, "frame": { - "x": 143, + "x": 112, "y": 0, "w": 30, "h": 28 @@ -423,8 +381,8 @@ "h": 28 }, "frame": { - "x": 173, - "y": 0, + "x": 108, + "y": 28, "w": 30, "h": 28 } @@ -444,7 +402,7 @@ "h": 28 }, "frame": { - "x": 203, + "x": 142, "y": 0, "w": 29, "h": 28 @@ -465,8 +423,8 @@ "h": 28 }, "frame": { - "x": 232, - "y": 0, + "x": 138, + "y": 28, "w": 29, "h": 28 } @@ -486,7 +444,7 @@ "h": 27 }, "frame": { - "x": 261, + "x": 171, "y": 0, "w": 29, "h": 27 @@ -507,7 +465,7 @@ "h": 27 }, "frame": { - "x": 290, + "x": 200, "y": 0, "w": 29, "h": 27 @@ -528,7 +486,7 @@ "h": 27 }, "frame": { - "x": 319, + "x": 229, "y": 0, "w": 28, "h": 27 @@ -549,7 +507,7 @@ "h": 27 }, "frame": { - "x": 347, + "x": 257, "y": 0, "w": 28, "h": 27 @@ -570,7 +528,7 @@ "h": 23 }, "frame": { - "x": 375, + "x": 285, "y": 0, "w": 32, "h": 23 @@ -591,14 +549,14 @@ "h": 23 }, "frame": { - "x": 407, + "x": 317, "y": 0, "w": 32, "h": 23 } }, { - "filename": "800", + "filename": "795", "rotated": false, "trimmed": true, "sourceSize": { @@ -619,7 +577,7 @@ } }, { - "filename": "800s", + "filename": "795s", "rotated": false, "trimmed": true, "sourceSize": { @@ -639,6 +597,48 @@ "h": 30 } }, + { + "filename": "800", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 32, + "y": 145, + "w": 28, + "h": 30 + } + }, + { + "filename": "800s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 32, + "y": 175, + "w": 28, + "h": 30 + } + }, { "filename": "805", "rotated": false, @@ -654,8 +654,8 @@ "h": 30 }, "frame": { - "x": 32, - "y": 145, + "x": 31, + "y": 205, "w": 28, "h": 30 } @@ -674,31 +674,10 @@ "w": 28, "h": 30 }, - "frame": { - "x": 32, - "y": 175, - "w": 28, - "h": 30 - } - }, - { - "filename": "773", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, "frame": { "x": 31, - "y": 205, - "w": 26, + "y": 235, + "w": 28, "h": 30 } }, @@ -718,32 +697,11 @@ }, "frame": { "x": 31, - "y": 235, + "y": 265, "w": 26, "h": 30 } }, - { - "filename": "792", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 31, - "y": 265, - "w": 28, - "h": 28 - } - }, { "filename": "773-dark", "rotated": false, @@ -759,8 +717,8 @@ "h": 30 }, "frame": { - "x": 56, - "y": 293, + "x": 31, + "y": 295, "w": 26, "h": 30 } @@ -780,7 +738,7 @@ "h": 25 }, "frame": { - "x": 439, + "x": 349, "y": 0, "w": 30, "h": 25 @@ -801,12 +759,75 @@ "h": 25 }, "frame": { - "x": 469, + "x": 379, "y": 0, "w": 30, "h": 25 } }, + { + "filename": "785", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 409, + "y": 0, + "w": 28, + "h": 26 + } + }, + { + "filename": "785s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 437, + "y": 0, + "w": 28, + "h": 26 + } + }, + { + "filename": "792", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 465, + "y": 0, + "w": 28, + "h": 28 + } + }, { "filename": "792s", "rotated": false, @@ -822,8 +843,8 @@ "h": 28 }, "frame": { - "x": 108, - "y": 29, + "x": 70, + "y": 57, "w": 28, "h": 28 } @@ -843,8 +864,8 @@ "h": 30 }, "frame": { - "x": 70, - "y": 57, + "x": 62, + "y": 85, "w": 26, "h": 30 } @@ -864,8 +885,8 @@ "h": 30 }, "frame": { - "x": 96, - "y": 57, + "x": 62, + "y": 115, "w": 26, "h": 30 } @@ -885,8 +906,8 @@ "h": 30 }, "frame": { - "x": 62, - "y": 87, + "x": 60, + "y": 145, "w": 26, "h": 30 } @@ -906,8 +927,8 @@ "h": 30 }, "frame": { - "x": 88, - "y": 87, + "x": 60, + "y": 175, "w": 26, "h": 30 } @@ -927,8 +948,8 @@ "h": 30 }, "frame": { - "x": 62, - "y": 117, + "x": 59, + "y": 205, "w": 26, "h": 30 } @@ -948,8 +969,8 @@ "h": 30 }, "frame": { - "x": 88, - "y": 117, + "x": 59, + "y": 235, "w": 26, "h": 30 } @@ -969,8 +990,8 @@ "h": 30 }, "frame": { - "x": 60, - "y": 147, + "x": 57, + "y": 265, "w": 26, "h": 30 } @@ -990,12 +1011,54 @@ "h": 30 }, "frame": { - "x": 86, - "y": 147, + "x": 57, + "y": 295, "w": 26, "h": 30 } }, + { + "filename": "764", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 25, + "h": 30 + }, + "frame": { + "x": 88, + "y": 85, + "w": 25, + "h": 30 + } + }, + { + "filename": "764s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 25, + "h": 30 + }, + "frame": { + "x": 88, + "y": 115, + "w": 25, + "h": 30 + } + }, { "filename": "773-ground", "rotated": false, @@ -1011,8 +1074,8 @@ "h": 30 }, "frame": { - "x": 60, - "y": 177, + "x": 86, + "y": 145, "w": 26, "h": 30 } @@ -1033,7 +1096,7 @@ }, "frame": { "x": 86, - "y": 177, + "y": 175, "w": 26, "h": 30 } @@ -1053,8 +1116,8 @@ "h": 30 }, "frame": { - "x": 57, - "y": 207, + "x": 85, + "y": 205, "w": 26, "h": 30 } @@ -1074,54 +1137,12 @@ "h": 30 }, "frame": { - "x": 83, - "y": 207, + "x": 85, + "y": 235, "w": 26, "h": 30 } }, - { - "filename": "2026", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 26, - "h": 28 - }, - "frame": { - "x": 57, - "y": 237, - "w": 26, - "h": 28 - } - }, - { - "filename": "772", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 59, - "y": 265, - "w": 25, - "h": 28 - } - }, { "filename": "773-rock", "rotated": false, @@ -1136,53 +1157,11 @@ "w": 26, "h": 30 }, - "frame": { - "x": 82, - "y": 293, - "w": 26, - "h": 30 - } - }, - { - "filename": "2026s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 26, - "h": 28 - }, "frame": { "x": 83, - "y": 237, - "w": 26, - "h": 28 - } - }, - { - "filename": "772s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 84, "y": 265, - "w": 25, - "h": 28 + "w": 26, + "h": 30 } }, { @@ -1200,14 +1179,14 @@ "h": 30 }, "frame": { - "x": 108, - "y": 293, + "x": 83, + "y": 295, "w": 26, "h": 30 } }, { - "filename": "764", + "filename": "772", "rotated": false, "trimmed": true, "sourceSize": { @@ -1215,16 +1194,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 0, + "x": 8, + "y": 2, "w": 25, - "h": 30 + "h": 28 }, "frame": { - "x": 122, + "x": 98, "y": 57, "w": 25, - "h": 30 + "h": 28 } }, { @@ -1242,14 +1221,14 @@ "h": 30 }, "frame": { - "x": 114, - "y": 87, + "x": 123, + "y": 56, "w": 26, "h": 30 } }, { - "filename": "773s", + "filename": "773", "rotated": false, "trimmed": true, "sourceSize": { @@ -1263,8 +1242,8 @@ "h": 30 }, "frame": { - "x": 114, - "y": 117, + "x": 149, + "y": 56, "w": 26, "h": 30 } @@ -1284,8 +1263,8 @@ "h": 30 }, "frame": { - "x": 112, - "y": 147, + "x": 113, + "y": 86, "w": 26, "h": 30 } @@ -1305,8 +1284,8 @@ "h": 30 }, "frame": { - "x": 112, - "y": 177, + "x": 139, + "y": 86, "w": 26, "h": 30 } @@ -1326,8 +1305,8 @@ "h": 30 }, "frame": { - "x": 109, - "y": 207, + "x": 113, + "y": 116, "w": 26, "h": 30 } @@ -1347,33 +1326,12 @@ "h": 30 }, "frame": { - "x": 109, - "y": 237, + "x": 139, + "y": 116, "w": 26, "h": 30 } }, - { - "filename": "785", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 109, - "y": 267, - "w": 28, - "h": 26 - } - }, { "filename": "773s-fairy", "rotated": false, @@ -1389,33 +1347,12 @@ "h": 30 }, "frame": { - "x": 134, - "y": 293, + "x": 112, + "y": 146, "w": 26, "h": 30 } }, - { - "filename": "801", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 136, - "y": 29, - "w": 20, - "h": 28 - } - }, { "filename": "773s-fighting", "rotated": false, @@ -1431,8 +1368,8 @@ "h": 30 }, "frame": { - "x": 156, - "y": 28, + "x": 138, + "y": 146, "w": 26, "h": 30 } @@ -1452,8 +1389,8 @@ "h": 30 }, "frame": { - "x": 182, - "y": 28, + "x": 112, + "y": 176, "w": 26, "h": 30 } @@ -1473,8 +1410,8 @@ "h": 30 }, "frame": { - "x": 208, - "y": 28, + "x": 138, + "y": 176, "w": 26, "h": 30 } @@ -1494,8 +1431,8 @@ "h": 30 }, "frame": { - "x": 234, - "y": 28, + "x": 111, + "y": 206, "w": 26, "h": 30 } @@ -1515,8 +1452,8 @@ "h": 30 }, "frame": { - "x": 147, - "y": 58, + "x": 137, + "y": 206, "w": 26, "h": 30 } @@ -1536,8 +1473,8 @@ "h": 30 }, "frame": { - "x": 173, - "y": 58, + "x": 111, + "y": 236, "w": 26, "h": 30 } @@ -1557,8 +1494,8 @@ "h": 30 }, "frame": { - "x": 199, - "y": 58, + "x": 137, + "y": 236, "w": 26, "h": 30 } @@ -1578,12 +1515,33 @@ "h": 30 }, "frame": { - "x": 225, - "y": 58, + "x": 109, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 109, + "y": 296, + "w": 25, + "h": 29 + } + }, { "filename": "773s-psychic", "rotated": false, @@ -1599,12 +1557,54 @@ "h": 30 }, "frame": { - "x": 140, - "y": 88, + "x": 135, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 134, + "y": 296, + "w": 25, + "h": 29 + } + }, + { + "filename": "796", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 159, + "y": 296, + "w": 18, + "h": 29 + } + }, { "filename": "773s-rock", "rotated": false, @@ -1620,12 +1620,54 @@ "h": 30 }, "frame": { - "x": 166, - "y": 88, + "x": 161, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "796s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 177, + "y": 296, + "w": 18, + "h": 29 + } + }, + { + "filename": "772s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 167, + "y": 28, + "w": 25, + "h": 28 + } + }, { "filename": "773s-steel", "rotated": false, @@ -1642,7 +1684,7 @@ }, "frame": { "x": 192, - "y": 88, + "y": 27, "w": 26, "h": 30 } @@ -1663,13 +1705,13 @@ }, "frame": { "x": 218, - "y": 88, + "y": 27, "w": 26, "h": 30 } }, { - "filename": "764s", + "filename": "773s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1677,123 +1719,18 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 7, "y": 0, - "w": 25, + "w": 26, "h": 30 }, "frame": { - "x": 140, - "y": 118, - "w": 25, + "x": 244, + "y": 27, + "w": 26, "h": 30 } }, - { - "filename": "785s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 165, - "y": 118, - "w": 28, - "h": 26 - } - }, - { - "filename": "2075", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 29, - "h": 24 - }, - "frame": { - "x": 193, - "y": 118, - "w": 29, - "h": 24 - } - }, - { - "filename": "794", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 138, - "y": 148, - "w": 25, - "h": 29 - } - }, - { - "filename": "794s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 138, - "y": 177, - "w": 25, - "h": 29 - } - }, - { - "filename": "726", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 222, - "y": 118, - "w": 23, - "h": 24 - } - }, { "filename": "2103", "rotated": false, @@ -1809,12 +1746,75 @@ "h": 30 }, "frame": { - "x": 251, - "y": 58, + "x": 270, + "y": 27, "w": 21, "h": 30 } }, + { + "filename": "2026", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 291, + "y": 23, + "w": 26, + "h": 28 + } + }, + { + "filename": "2026s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 317, + "y": 23, + "w": 26, + "h": 28 + } + }, + { + "filename": "2075", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 29, + "h": 24 + }, + "frame": { + "x": 343, + "y": 25, + "w": 29, + "h": 24 + } + }, { "filename": "2075s", "rotated": false, @@ -1830,180 +1830,12 @@ "h": 24 }, "frame": { - "x": 244, - "y": 88, + "x": 372, + "y": 25, "w": 29, "h": 24 } }, - { - "filename": "748", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 245, - "y": 112, - "w": 26, - "h": 25 - } - }, - { - "filename": "2103s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 21, - "h": 30 - }, - "frame": { - "x": 260, - "y": 28, - "w": 21, - "h": 30 - } - }, - { - "filename": "748s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 281, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "2089", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 307, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "2089s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 333, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "724", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 359, - "y": 27, - "w": 19, - "h": 25 - } - }, - { - "filename": "745-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 378, - "y": 23, - "w": 25, - "h": 25 - } - }, - { - "filename": "745s-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 403, - "y": 23, - "w": 25, - "h": 25 - } - }, { "filename": "746-school", "rotated": false, @@ -2019,8 +1851,8 @@ "h": 22 }, "frame": { - "x": 428, - "y": 25, + "x": 401, + "y": 26, "w": 28, "h": 22 } @@ -2040,14 +1872,14 @@ "h": 22 }, "frame": { - "x": 456, - "y": 25, + "x": 429, + "y": 26, "w": 28, "h": 22 } }, { - "filename": "796", + "filename": "760", "rotated": false, "trimmed": true, "sourceSize": { @@ -2055,20 +1887,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 + "x": 13, + "y": 4, + "w": 17, + "h": 24 }, "frame": { - "x": 484, - "y": 25, - "w": 18, - "h": 29 + "x": 175, + "y": 56, + "w": 17, + "h": 24 } }, { - "filename": "796s", + "filename": "748", "rotated": false, "trimmed": true, "sourceSize": { @@ -2076,16 +1908,121 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 + "x": 7, + "y": 5, + "w": 26, + "h": 25 }, "frame": { - "x": 272, - "y": 58, - "w": 18, - "h": 29 + "x": 192, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "748s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 25 + }, + "frame": { + "x": 218, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "2089", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 244, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "745-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 270, + "y": 57, + "w": 25, + "h": 25 + } + }, + { + "filename": "2089s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 295, + "y": 51, + "w": 26, + "h": 25 + } + }, + { + "filename": "745s-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 321, + "y": 51, + "w": 25, + "h": 25 } }, { @@ -2103,8 +2040,8 @@ "h": 26 }, "frame": { - "x": 290, - "y": 52, + "x": 346, + "y": 49, "w": 24, "h": 26 } @@ -2124,159 +2061,12 @@ "h": 26 }, "frame": { - "x": 314, - "y": 52, + "x": 370, + "y": 49, "w": 24, "h": 26 } }, - { - "filename": "750", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 338, - "y": 52, - "w": 25, - "h": 24 - } - }, - { - "filename": "724s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 273, - "y": 87, - "w": 19, - "h": 25 - } - }, - { - "filename": "776", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 271, - "y": 112, - "w": 23, - "h": 26 - } - }, - { - "filename": "750s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 292, - "y": 78, - "w": 25, - "h": 24 - } - }, - { - "filename": "726s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 317, - "y": 78, - "w": 23, - "h": 24 - } - }, - { - "filename": "776s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 340, - "y": 76, - "w": 23, - "h": 26 - } - }, - { - "filename": "801-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 363, - "y": 52, - "w": 20, - "h": 28 - } - }, { "filename": "765", "rotated": false, @@ -2292,14 +2082,56 @@ "h": 21 }, "frame": { - "x": 383, - "y": 48, + "x": 457, + "y": 28, "w": 28, "h": 21 } }, { - "filename": "727", + "filename": "760s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 485, + "y": 28, + "w": 17, + "h": 24 + } + }, + { + "filename": "2103s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 21, + "h": 30 + }, + "frame": { + "x": 165, + "y": 86, + "w": 21, + "h": 30 + } + }, + { + "filename": "783", "rotated": false, "trimmed": true, "sourceSize": { @@ -2308,14 +2140,56 @@ }, "spriteSourceSize": { "x": 9, + "y": 3, + "w": 21, + "h": 27 + }, + "frame": { + "x": 165, + "y": 116, + "w": 21, + "h": 27 + } + }, + { + "filename": "750", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, "y": 4, - "w": 23, + "w": 25, "h": 24 }, "frame": { - "x": 363, - "y": 80, - "w": 23, + "x": 186, + "y": 82, + "w": 25, + "h": 24 + } + }, + { + "filename": "750s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 211, + "y": 82, + "w": 25, "h": 24 } }, @@ -2334,159 +2208,12 @@ "h": 21 }, "frame": { - "x": 294, - "y": 102, + "x": 186, + "y": 106, "w": 28, "h": 21 } }, - { - "filename": "725", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 322, - "y": 102, - "w": 25, - "h": 21 - } - }, - { - "filename": "780", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 294, - "y": 123, - "w": 27, - "h": 19 - } - }, - { - "filename": "780s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 321, - "y": 123, - "w": 27, - "h": 19 - } - }, - { - "filename": "723", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 411, - "y": 48, - "w": 17, - "h": 22 - } - }, - { - "filename": "745", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 428, - "y": 47, - "w": 25, - "h": 23 - } - }, - { - "filename": "745s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 453, - "y": 47, - "w": 25, - "h": 23 - } - }, - { - "filename": "768", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 54, - "w": 24, - "h": 23 - } - }, { "filename": "2028", "rotated": false, @@ -2502,8 +2229,8 @@ "h": 24 }, "frame": { - "x": 386, - "y": 69, + "x": 236, + "y": 82, "w": 25, "h": 24 } @@ -2523,56 +2250,14 @@ "h": 24 }, "frame": { - "x": 411, - "y": 70, + "x": 261, + "y": 82, "w": 25, "h": 24 } }, { - "filename": "727s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 436, - "y": 70, - "w": 23, - "h": 24 - } - }, - { - "filename": "781", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 459, - "y": 70, - "w": 19, - "h": 25 - } - }, - { - "filename": "768s", + "filename": "725", "rotated": false, "trimmed": true, "sourceSize": { @@ -2581,15 +2266,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 5, - "w": 24, - "h": 23 + "y": 7, + "w": 25, + "h": 21 }, "frame": { - "x": 478, - "y": 77, - "w": 24, - "h": 23 + "x": 214, + "y": 106, + "w": 25, + "h": 21 } }, { @@ -2607,14 +2292,14 @@ "h": 21 }, "frame": { - "x": 386, - "y": 93, + "x": 239, + "y": 106, "w": 25, "h": 21 } }, { - "filename": "2020", + "filename": "726", "rotated": false, "trimmed": true, "sourceSize": { @@ -2623,40 +2308,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 411, - "y": 94, - "w": 25, - "h": 22 - } - }, - { - "filename": "729", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, + "y": 4, "w": 23, "h": 24 }, "frame": { - "x": 436, - "y": 94, + "x": 264, + "y": 106, "w": 23, "h": 24 } }, { - "filename": "781s", + "filename": "780", "rotated": false, "trimmed": true, "sourceSize": { @@ -2664,62 +2328,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 459, - "y": 95, - "w": 19, - "h": 25 - } - }, - { - "filename": "2105", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 100, - "w": 24, - "h": 23 - } - }, - { - "filename": "761", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, + "x": 7, + "y": 7, + "w": 27, "h": 19 }, "frame": { - "x": 347, - "y": 102, - "w": 16, + "x": 186, + "y": 127, + "w": 27, "h": 19 } }, { - "filename": "729s", + "filename": "780s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2727,184 +2349,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 363, - "y": 104, - "w": 23, - "h": 24 - } - }, - { - "filename": "734", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 386, - "y": 114, - "w": 25, - "h": 16 - } - }, - { - "filename": "734s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 411, - "y": 116, - "w": 25, - "h": 16 - } - }, - { - "filename": "733", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, + "x": 7, "y": 7, - "w": 23, - "h": 21 + "w": 27, + "h": 19 }, "frame": { - "x": 436, - "y": 118, - "w": 23, - "h": 21 - } - }, - { - "filename": "732", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 459, - "y": 120, - "w": 19, - "h": 22 - } - }, - { - "filename": "2105s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 123, - "w": 24, - "h": 23 - } - }, - { - "filename": "2050", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 348, - "y": 121, - "w": 15, - "h": 18 - } - }, - { - "filename": "733s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 363, - "y": 128, - "w": 23, - "h": 21 - } - }, - { - "filename": "2020s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 386, - "y": 130, - "w": 25, - "h": 22 + "x": 213, + "y": 127, + "w": 27, + "h": 19 } }, { @@ -2922,14 +2376,14 @@ "h": 22 }, "frame": { - "x": 411, - "y": 132, + "x": 240, + "y": 127, "w": 24, "h": 22 } }, { - "filename": "758s", + "filename": "726s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2937,104 +2391,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 24, - "h": 22 + "x": 8, + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 435, - "y": 139, - "w": 24, - "h": 22 + "x": 264, + "y": 130, + "w": 23, + "h": 24 } }, { - "filename": "732s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 459, - "y": 142, - "w": 19, - "h": 22 - } - }, - { - "filename": "2053", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 478, - "y": 146, - "w": 24, - "h": 22 - } - }, - { - "filename": "801s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 135, - "y": 207, - "w": 20, - "h": 28 - } - }, - { - "filename": "801s-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 135, - "y": 235, - "w": 20, - "h": 28 - } - }, - { - "filename": "783", + "filename": "727", "rotated": false, "trimmed": true, "sourceSize": { @@ -3043,15 +2413,78 @@ }, "spriteSourceSize": { "x": 9, - "y": 3, - "w": 21, - "h": 27 + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 137, - "y": 263, - "w": 21, - "h": 27 + "x": 286, + "y": 82, + "w": 23, + "h": 24 + } + }, + { + "filename": "776", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 287, + "y": 106, + "w": 23, + "h": 26 + } + }, + { + "filename": "727s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 287, + "y": 132, + "w": 23, + "h": 24 + } + }, + { + "filename": "776s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 309, + "y": 76, + "w": 23, + "h": 26 } }, { @@ -3069,8 +2502,8 @@ "h": 27 }, "frame": { - "x": 155, - "y": 206, + "x": 310, + "y": 102, "w": 21, "h": 27 } @@ -3090,8 +2523,8 @@ "h": 26 }, "frame": { - "x": 155, - "y": 233, + "x": 310, + "y": 129, "w": 22, "h": 26 } @@ -3111,8 +2544,8 @@ "h": 26 }, "frame": { - "x": 158, - "y": 259, + "x": 332, + "y": 76, "w": 22, "h": 26 } @@ -3132,12 +2565,306 @@ "h": 26 }, "frame": { - "x": 160, - "y": 285, + "x": 331, + "y": 102, "w": 22, "h": 26 } }, + { + "filename": "745", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 354, + "y": 75, + "w": 25, + "h": 23 + } + }, + { + "filename": "788s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 332, + "y": 128, + "w": 22, + "h": 26 + } + }, + { + "filename": "724", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 379, + "y": 75, + "w": 19, + "h": 25 + } + }, + { + "filename": "724s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 394, + "y": 49, + "w": 19, + "h": 25 + } + }, + { + "filename": "745s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 413, + "y": 48, + "w": 25, + "h": 23 + } + }, + { + "filename": "781", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 438, + "y": 48, + "w": 19, + "h": 25 + } + }, + { + "filename": "729", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 457, + "y": 49, + "w": 23, + "h": 24 + } + }, + { + "filename": "806", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 480, + "y": 52, + "w": 22, + "h": 25 + } + }, + { + "filename": "801-original", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 398, + "y": 74, + "w": 20, + "h": 28 + } + }, + { + "filename": "801", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 418, + "y": 71, + "w": 20, + "h": 28 + } + }, + { + "filename": "803", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 438, + "y": 73, + "w": 23, + "h": 25 + } + }, + { + "filename": "781s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 461, + "y": 73, + "w": 19, + "h": 25 + } + }, + { + "filename": "806s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 480, + "y": 77, + "w": 22, + "h": 25 + } + }, + { + "filename": "734", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 354, + "y": 98, + "w": 25, + "h": 16 + } + }, { "filename": "767", "rotated": false, @@ -3153,14 +2880,35 @@ "h": 14 }, "frame": { - "x": 245, - "y": 137, + "x": 353, + "y": 114, "w": 24, "h": 14 } }, { - "filename": "767s", + "filename": "803s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 354, + "y": 128, + "w": 23, + "h": 25 + } + }, + { + "filename": "732", "rotated": false, "trimmed": true, "sourceSize": { @@ -3169,15 +2917,603 @@ }, "spriteSourceSize": { "x": 10, - "y": 11, - "w": 24, - "h": 14 + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 269, - "y": 138, + "x": 379, + "y": 100, + "w": 19, + "h": 22 + } + }, + { + "filename": "801s-original", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 377, + "y": 122, + "w": 20, + "h": 28 + } + }, + { + "filename": "729s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 398, + "y": 102, + "w": 23, + "h": 24 + } + }, + { + "filename": "768", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, "w": 24, - "h": 14 + "h": 23 + }, + "frame": { + "x": 397, + "y": 126, + "w": 24, + "h": 23 + } + }, + { + "filename": "801s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 421, + "y": 99, + "w": 20, + "h": 28 + } + }, + { + "filename": "768s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 441, + "y": 98, + "w": 24, + "h": 23 + } + }, + { + "filename": "735", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 421, + "y": 127, + "w": 20, + "h": 24 + } + }, + { + "filename": "770", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 441, + "y": 121, + "w": 23, + "h": 24 + } + }, + { + "filename": "2050", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 98, + "w": 15, + "h": 18 + } + }, + { + "filename": "756", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 102, + "w": 22, + "h": 24 + } + }, + { + "filename": "2050s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 116, + "w": 15, + "h": 18 + } + }, + { + "filename": "756s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 126, + "w": 22, + "h": 24 + } + }, + { + "filename": "761", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 134, + "w": 16, + "h": 19 + } + }, + { + "filename": "802-zenith", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 150, + "w": 22, + "h": 24 + } + }, + { + "filename": "733", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 441, + "y": 145, + "w": 23, + "h": 21 + } + }, + { + "filename": "761s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 153, + "w": 16, + "h": 19 + } + }, + { + "filename": "745-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 165, + "y": 143, + "w": 21, + "h": 24 + } + }, + { + "filename": "2020", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 186, + "y": 146, + "w": 25, + "h": 22 + } + }, + { + "filename": "2020s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 211, + "y": 146, + "w": 25, + "h": 22 + } + }, + { + "filename": "802", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 164, + "y": 167, + "w": 22, + "h": 24 + } + }, + { + "filename": "2105", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 186, + "y": 168, + "w": 24, + "h": 23 + } + }, + { + "filename": "2105s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 210, + "y": 168, + "w": 24, + "h": 23 + } + }, + { + "filename": "734s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 164, + "y": 191, + "w": 25, + "h": 16 + } + }, + { + "filename": "770s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 163, + "y": 207, + "w": 23, + "h": 24 + } + }, + { + "filename": "2051", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 163, + "y": 231, + "w": 23, + "h": 24 + } + }, + { + "filename": "758s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 189, + "y": 191, + "w": 24, + "h": 22 + } + }, + { + "filename": "2051s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 186, + "y": 213, + "w": 23, + "h": 24 + } + }, + { + "filename": "745s-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 213, + "y": 191, + "w": 21, + "h": 24 + } + }, + { + "filename": "2053", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 209, + "y": 215, + "w": 24, + "h": 22 } }, { @@ -3195,8 +3531,8 @@ "h": 22 }, "frame": { - "x": 293, - "y": 142, + "x": 186, + "y": 237, "w": 24, "h": 22 } @@ -3216,14 +3552,14 @@ "h": 22 }, "frame": { - "x": 317, - "y": 142, + "x": 210, + "y": 237, "w": 23, "h": 22 } }, { - "filename": "769s", + "filename": "802s-zenith", "rotated": false, "trimmed": true, "sourceSize": { @@ -3231,125 +3567,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 340, - "y": 142, - "w": 23, - "h": 22 - } - }, - { - "filename": "752", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 363, - "y": 149, - "w": 23, - "h": 18 - } - }, - { - "filename": "2074", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 - }, - "frame": { - "x": 386, - "y": 152, - "w": 24, - "h": 15 - } - }, - { - "filename": "2074s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 - }, - "frame": { - "x": 410, - "y": 154, - "w": 24, - "h": 15 - } - }, - { - "filename": "752s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 434, - "y": 161, - "w": 23, - "h": 18 - } - }, - { - "filename": "745-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 13, "y": 4, - "w": 21, + "w": 22, "h": 24 }, "frame": { - "x": 457, - "y": 164, - "w": 21, + "x": 187, + "y": 259, + "w": 22, "h": 24 } }, { - "filename": "770", + "filename": "802s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3357,20 +3588,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 13, "y": 4, - "w": 23, + "w": 22, "h": 24 }, "frame": { - "x": 478, - "y": 168, - "w": 23, + "x": 209, + "y": 259, + "w": 22, "h": 24 } }, { - "filename": "722", + "filename": "746", "rotated": false, "trimmed": true, "sourceSize": { @@ -3379,19 +3610,40 @@ }, "spriteSourceSize": { "x": 12, - "y": 8, - "w": 17, - "h": 18 + "y": 11, + "w": 18, + "h": 13 }, "frame": { - "x": 163, - "y": 188, - "w": 17, - "h": 18 + "x": 187, + "y": 283, + "w": 18, + "h": 13 } }, { - "filename": "735", + "filename": "733s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 236, + "y": 149, + "w": 23, + "h": 21 + } + }, + { + "filename": "807", "rotated": false, "trimmed": true, "sourceSize": { @@ -3401,308 +3653,14 @@ "spriteSourceSize": { "x": 11, "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 163, - "y": 164, - "w": 20, - "h": 24 - } - }, - { - "filename": "789", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 165, - "y": 144, - "w": 23, - "h": 20 - } - }, - { - "filename": "788s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, "w": 22, - "h": 26 + "h": 24 }, "frame": { - "x": 176, - "y": 206, + "x": 234, + "y": 170, "w": 22, - "h": 26 - } - }, - { - "filename": "803", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 177, - "y": 232, - "w": 23, - "h": 25 - } - }, - { - "filename": "786", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 180, - "y": 257, - "w": 20, - "h": 25 - } - }, - { - "filename": "786s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 182, - "y": 282, - "w": 20, - "h": 25 - } - }, - { - "filename": "778-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 182, - "y": 307, - "w": 21, - "h": 16 - } - }, - { - "filename": "757", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 18 - }, - "frame": { - "x": 180, - "y": 188, - "w": 19, - "h": 18 - } - }, - { - "filename": "735s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, "h": 24 - }, - "frame": { - "x": 183, - "y": 164, - "w": 20, - "h": 24 - } - }, - { - "filename": "728", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 188, - "y": 144, - "w": 17, - "h": 20 - } - }, - { - "filename": "770s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 205, - "y": 142, - "w": 23, - "h": 24 - } - }, - { - "filename": "760", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 228, - "y": 142, - "w": 17, - "h": 24 - } - }, - { - "filename": "803s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 203, - "y": 166, - "w": 23, - "h": 25 - } - }, - { - "filename": "806", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 226, - "y": 166, - "w": 22, - "h": 25 - } - }, - { - "filename": "789s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 199, - "y": 191, - "w": 23, - "h": 20 } }, { @@ -3720,14 +3678,14 @@ "h": 21 }, "frame": { - "x": 198, - "y": 211, + "x": 234, + "y": 194, "w": 22, "h": 21 } }, { - "filename": "806s", + "filename": "807s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3735,125 +3693,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 200, - "y": 232, - "w": 22, - "h": 25 - } - }, - { - "filename": "756", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 200, - "y": 257, - "w": 22, - "h": 24 - } - }, - { - "filename": "745s-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 11, "y": 4, - "w": 21, + "w": 22, "h": 24 }, "frame": { - "x": 202, - "y": 281, - "w": 21, - "h": 24 - } - }, - { - "filename": "2027", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 203, - "y": 305, - "w": 21, - "h": 18 - } - }, - { - "filename": "2051", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 222, - "y": 191, - "w": 23, - "h": 24 - } - }, - { - "filename": "778s-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 220, + "x": 233, "y": 215, - "w": 21, - "h": 16 + "w": 22, + "h": 24 } }, { - "filename": "756s", + "filename": "738s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3862,19 +3715,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 5, + "y": 6, "w": 22, - "h": 24 + "h": 21 }, "frame": { - "x": 222, - "y": 231, + "x": 233, + "y": 239, "w": 22, - "h": 24 + "h": 21 } }, { - "filename": "802", + "filename": "769s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3882,16 +3735,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 + "x": 8, + "y": 6, + "w": 23, + "h": 22 }, "frame": { - "x": 222, - "y": 255, - "w": 22, - "h": 24 + "x": 231, + "y": 260, + "w": 23, + "h": 22 + } + }, + { + "filename": "767s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 205, + "y": 283, + "w": 24, + "h": 14 } }, { @@ -3909,8 +3783,71 @@ "h": 24 }, "frame": { - "x": 223, - "y": 279, + "x": 195, + "y": 297, + "w": 21, + "h": 24 + } + }, + { + "filename": "735s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 216, + "y": 297, + "w": 20, + "h": 24 + } + }, + { + "filename": "752", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 259, + "y": 154, + "w": 23, + "h": 18 + } + }, + { + "filename": "763s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 256, + "y": 172, "w": 21, "h": 24 } @@ -3930,134 +3867,8 @@ "h": 20 }, "frame": { - "x": 224, - "y": 303, - "w": 22, - "h": 20 - } - }, - { - "filename": "746", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 245, - "y": 151, - "w": 18, - "h": 13 - } - }, - { - "filename": "760s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 248, - "y": 164, - "w": 17, - "h": 24 - } - }, - { - "filename": "2051s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 265, - "y": 152, - "w": 23, - "h": 24 - } - }, - { - "filename": "738s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 265, - "y": 176, - "w": 22, - "h": 21 - } - }, - { - "filename": "743", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 245, - "y": 191, - "w": 20, - "h": 22 - } - }, - { - "filename": "747s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 265, - "y": 197, + "x": 256, + "y": 196, "w": 22, "h": 20 } @@ -4077,8 +3888,8 @@ "h": 23 }, "frame": { - "x": 288, - "y": 164, + "x": 255, + "y": 216, "w": 22, "h": 23 } @@ -4098,77 +3909,14 @@ "h": 23 }, "frame": { - "x": 310, - "y": 164, + "x": 255, + "y": 239, "w": 22, "h": 23 } }, { - "filename": "802s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 287, - "y": 187, - "w": 22, - "h": 24 - } - }, - { - "filename": "807", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 309, - "y": 187, - "w": 22, - "h": 24 - } - }, - { - "filename": "807s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 332, - "y": 164, - "w": 22, - "h": 24 - } - }, - { - "filename": "749", + "filename": "789", "rotated": false, "trimmed": true, "sourceSize": { @@ -4177,19 +3925,61 @@ }, "spriteSourceSize": { "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 254, + "y": 262, + "w": 23, + "h": 20 + } + }, + { + "filename": "752s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 282, + "y": 156, + "w": 23, + "h": 18 + } + }, + { + "filename": "743", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, "y": 5, - "w": 21, - "h": 23 + "w": 20, + "h": 22 }, "frame": { - "x": 331, - "y": 188, - "w": 21, - "h": 23 + "x": 277, + "y": 174, + "w": 20, + "h": 22 } }, { - "filename": "2037", + "filename": "732s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4198,61 +3988,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 22, - "h": 21 + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 354, - "y": 167, - "w": 22, - "h": 21 + "x": 278, + "y": 196, + "w": 19, + "h": 22 } }, { - "filename": "749s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 352, - "y": 188, - "w": 21, - "h": 23 - } - }, - { - "filename": "2037s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 376, - "y": 167, - "w": 22, - "h": 21 - } - }, - { - "filename": "763s", + "filename": "786", "rotated": false, "trimmed": true, "sourceSize": { @@ -4261,15 +4009,57 @@ }, "spriteSourceSize": { "x": 11, - "y": 4, - "w": 21, - "h": 24 + "y": 3, + "w": 20, + "h": 25 }, "frame": { - "x": 373, - "y": 188, - "w": 21, - "h": 24 + "x": 277, + "y": 218, + "w": 20, + "h": 25 + } + }, + { + "filename": "786s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 277, + "y": 243, + "w": 20, + "h": 25 + } + }, + { + "filename": "739", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 277, + "y": 268, + "w": 20, + "h": 21 } }, { @@ -4287,54 +4077,12 @@ "h": 24 }, "frame": { - "x": 394, - "y": 188, + "x": 297, + "y": 174, "w": 13, "h": 24 } }, - { - "filename": "790", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 398, - "y": 169, - "w": 21, - "h": 19 - } - }, - { - "filename": "2050s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 419, - "y": 169, - "w": 15, - "h": 18 - } - }, { "filename": "755s", "rotated": false, @@ -4350,8 +4098,8 @@ "h": 24 }, "frame": { - "x": 407, - "y": 188, + "x": 297, + "y": 198, "w": 13, "h": 24 } @@ -4371,180 +4119,12 @@ "h": 24 }, "frame": { - "x": 420, - "y": 187, + "x": 297, + "y": 222, "w": 21, "h": 24 } }, - { - "filename": "761s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 441, - "y": 179, - "w": 16, - "h": 19 - } - }, - { - "filename": "775", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 457, - "y": 188, - "w": 21, - "h": 20 - } - }, - { - "filename": "775s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 478, - "y": 192, - "w": 21, - "h": 20 - } - }, - { - "filename": "751", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 441, - "y": 198, - "w": 14, - "h": 20 - } - }, - { - "filename": "779", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 420, - "y": 211, - "w": 21, - "h": 20 - } - }, - { - "filename": "779s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 455, - "y": 208, - "w": 21, - "h": 20 - } - }, - { - "filename": "751s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 441, - "y": 218, - "w": 14, - "h": 20 - } - }, - { - "filename": "790s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 476, - "y": 212, - "w": 21, - "h": 19 - } - }, { "filename": "793s", "rotated": false, @@ -4560,14 +4140,161 @@ "h": 24 }, "frame": { - "x": 455, - "y": 228, + "x": 297, + "y": 246, "w": 21, "h": 24 } }, { - "filename": "2019", + "filename": "747s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 297, + "y": 270, + "w": 22, + "h": 20 + } + }, + { + "filename": "2074", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 13, + "w": 24, + "h": 15 + }, + "frame": { + "x": 231, + "y": 282, + "w": 24, + "h": 15 + } + }, + { + "filename": "2037", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 255, + "y": 282, + "w": 22, + "h": 21 + } + }, + { + "filename": "744", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 236, + "y": 297, + "w": 19, + "h": 22 + } + }, + { + "filename": "743s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 255, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "754", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 275, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "746s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 277, + "y": 290, + "w": 18, + "h": 13 + } + }, + { + "filename": "749", "rotated": false, "trimmed": true, "sourceSize": { @@ -4578,17 +4305,101 @@ "x": 10, "y": 5, "w": 21, - "h": 21 + "h": 23 }, "frame": { - "x": 476, - "y": 231, + "x": 295, + "y": 290, "w": 21, - "h": 21 + "h": 23 } }, { - "filename": "2019s", + "filename": "722", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 305, + "y": 156, + "w": 17, + "h": 18 + } + }, + { + "filename": "741-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 174, + "w": 17, + "h": 23 + } + }, + { + "filename": "741s-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 197, + "w": 17, + "h": 23 + } + }, + { + "filename": "737", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 18, + "h": 19 + }, + "frame": { + "x": 322, + "y": 155, + "w": 18, + "h": 19 + } + }, + { + "filename": "749s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4599,55 +4410,13 @@ "x": 10, "y": 5, "w": 21, - "h": 21 + "h": 23 }, "frame": { - "x": 287, - "y": 211, + "x": 327, + "y": 174, "w": 21, - "h": 21 - } - }, - { - "filename": "2052", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 308, - "y": 211, - "w": 21, - "h": 21 - } - }, - { - "filename": "2052s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 329, - "y": 211, - "w": 21, - "h": 21 + "h": 23 } }, { @@ -4665,8 +4434,8 @@ "h": 23 }, "frame": { - "x": 350, - "y": 211, + "x": 327, + "y": 197, "w": 21, "h": 23 } @@ -4686,75 +4455,12 @@ "h": 23 }, "frame": { - "x": 371, - "y": 212, + "x": 318, + "y": 220, "w": 21, "h": 23 } }, - { - "filename": "743s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 392, - "y": 212, - "w": 20, - "h": 22 - } - }, - { - "filename": "739", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 245, - "y": 213, - "w": 20, - "h": 21 - } - }, - { - "filename": "754", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 244, - "y": 234, - "w": 20, - "h": 22 - } - }, { "filename": "754s", "rotated": false, @@ -4770,12 +4476,33 @@ "h": 22 }, "frame": { - "x": 244, - "y": 256, + "x": 318, + "y": 243, "w": 20, "h": 22 } }, + { + "filename": "728", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 340, + "y": 154, + "w": 17, + "h": 20 + } + }, { "filename": "739s", "rotated": false, @@ -4791,14 +4518,14 @@ "h": 21 }, "frame": { - "x": 244, - "y": 278, + "x": 357, + "y": 153, "w": 20, "h": 21 } }, { - "filename": "2027s", + "filename": "789s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4807,19 +4534,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 10, - "w": 21, - "h": 18 + "y": 6, + "w": 23, + "h": 20 }, "frame": { - "x": 265, - "y": 217, - "w": 21, - "h": 18 + "x": 348, + "y": 174, + "w": 23, + "h": 20 } }, { - "filename": "744", + "filename": "2037s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4827,16 +4554,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 + "x": 10, + "y": 7, + "w": 22, + "h": 21 }, "frame": { - "x": 264, - "y": 235, - "w": 19, - "h": 22 + "x": 348, + "y": 194, + "w": 22, + "h": 21 } }, { @@ -4854,33 +4581,12 @@ "h": 22 }, "frame": { - "x": 264, - "y": 257, + "x": 377, + "y": 150, "w": 19, "h": 22 } }, - { - "filename": "741-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 264, - "y": 279, - "w": 20, - "h": 20 - } - }, { "filename": "762", "rotated": false, @@ -4896,8 +4602,8 @@ "h": 23 }, "frame": { - "x": 246, - "y": 299, + "x": 319, + "y": 265, "w": 18, "h": 23 } @@ -4917,54 +4623,12 @@ "h": 23 }, "frame": { - "x": 264, - "y": 299, + "x": 339, + "y": 220, "w": 18, "h": 23 } }, - { - "filename": "741-sensu", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 283, - "y": 235, - "w": 17, - "h": 23 - } - }, - { - "filename": "728s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 283, - "y": 258, - "w": 17, - "h": 20 - } - }, { "filename": "741-pau", "rotated": false, @@ -4980,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 300, - "y": 232, + "x": 338, + "y": 243, "w": 18, "h": 22 } @@ -5001,35 +4665,14 @@ "h": 22 }, "frame": { - "x": 318, - "y": 232, + "x": 337, + "y": 265, "w": 18, "h": 22 } }, { - "filename": "741s-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 300, - "y": 254, - "w": 20, - "h": 20 - } - }, - { - "filename": "723s", + "filename": "723", "rotated": false, "trimmed": true, "sourceSize": { @@ -5043,14 +4686,14 @@ "h": 22 }, "frame": { - "x": 284, - "y": 278, + "x": 357, + "y": 215, "w": 17, "h": 22 } }, { - "filename": "741s-sensu", + "filename": "2074s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5058,20 +4701,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 + "x": 8, + "y": 13, + "w": 24, + "h": 15 }, "frame": { - "x": 282, - "y": 300, - "w": 17, - "h": 23 + "x": 397, + "y": 149, + "w": 24, + "h": 15 } }, { - "filename": "731", + "filename": "741-pompom", "rotated": false, "trimmed": true, "sourceSize": { @@ -5079,16 +4722,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, + "x": 10, + "y": 7, + "w": 20, + "h": 20 + }, + "frame": { + "x": 421, + "y": 151, + "w": 20, + "h": 20 + } + }, + { + "filename": "775", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, "y": 6, - "w": 17, - "h": 22 + "w": 21, + "h": 20 }, "frame": { - "x": 320, - "y": 254, - "w": 17, - "h": 22 + "x": 396, + "y": 164, + "w": 21, + "h": 20 } }, { @@ -5106,14 +4770,119 @@ "h": 20 }, "frame": { - "x": 301, - "y": 274, + "x": 377, + "y": 172, "w": 19, "h": 20 } }, { - "filename": "722s", + "filename": "775s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 21, + "h": 20 + }, + "frame": { + "x": 417, + "y": 171, + "w": 21, + "h": 20 + } + }, + { + "filename": "778-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 396, + "y": 184, + "w": 21, + "h": 16 + } + }, + { + "filename": "778s-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 417, + "y": 191, + "w": 21, + "h": 16 + } + }, + { + "filename": "779", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 441, + "y": 166, + "w": 21, + "h": 20 + } + }, + { + "filename": "2019", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 438, + "y": 186, + "w": 21, + "h": 21 + } + }, + { + "filename": "737s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5123,18 +4892,18 @@ "spriteSourceSize": { "x": 12, "y": 8, - "w": 17, - "h": 18 + "w": 18, + "h": 19 }, "frame": { - "x": 320, - "y": 276, - "w": 17, - "h": 18 + "x": 462, + "y": 172, + "w": 18, + "h": 19 } }, { - "filename": "753", + "filename": "779s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5142,20 +4911,125 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 480, + "y": 174, + "w": 21, + "h": 20 + } + }, + { + "filename": "790", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, "h": 19 }, "frame": { - "x": 336, - "y": 232, - "w": 14, + "x": 459, + "y": 191, + "w": 21, "h": 19 } }, { - "filename": "2088", + "filename": "790s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 480, + "y": 194, + "w": 21, + "h": 19 + } + }, + { + "filename": "2019s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 370, + "y": 194, + "w": 21, + "h": 21 + } + }, + { + "filename": "723s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 374, + "y": 215, + "w": 17, + "h": 22 + } + }, + { + "filename": "2052", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 391, + "y": 200, + "w": 21, + "h": 21 + } + }, + { + "filename": "2027", "rotated": false, "trimmed": true, "sourceSize": { @@ -5169,14 +5043,56 @@ "h": 18 }, "frame": { - "x": 350, - "y": 234, + "x": 391, + "y": 221, "w": 21, "h": 18 } }, { - "filename": "2088s", + "filename": "2052s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 412, + "y": 207, + "w": 21, + "h": 21 + } + }, + { + "filename": "741s-pompom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 20 + }, + "frame": { + "x": 433, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "filename": "2027s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5190,8 +5106,8 @@ "h": 18 }, "frame": { - "x": 371, - "y": 235, + "x": 412, + "y": 228, "w": 21, "h": 18 } @@ -5211,12 +5127,75 @@ "h": 20 }, "frame": { - "x": 392, - "y": 234, + "x": 433, + "y": 227, "w": 19, "h": 20 } }, + { + "filename": "2088", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 453, + "y": 210, + "w": 21, + "h": 18 + } + }, + { + "filename": "2088s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 452, + "y": 228, + "w": 21, + "h": 18 + } + }, + { + "filename": "757", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 18 + }, + "frame": { + "x": 474, + "y": 213, + "w": 19, + "h": 18 + } + }, { "filename": "757s", "rotated": false, @@ -5232,12 +5211,54 @@ "h": 18 }, "frame": { - "x": 301, - "y": 294, + "x": 473, + "y": 231, "w": 19, "h": 18 } }, + { + "filename": "731", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 316, + "y": 290, + "w": 17, + "h": 22 + } + }, + { + "filename": "771", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 316, + "y": 312, + "w": 18, + "h": 13 + } + }, { "filename": "731s", "rotated": false, @@ -5253,12 +5274,33 @@ "h": 22 }, "frame": { - "x": 320, - "y": 294, + "x": 333, + "y": 288, "w": 17, "h": 22 } }, + { + "filename": "736", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 334, + "y": 310, + "w": 17, + "h": 13 + } + }, { "filename": "778-disguised", "rotated": false, @@ -5274,8 +5316,8 @@ "h": 22 }, "frame": { - "x": 337, - "y": 252, + "x": 350, + "y": 287, "w": 17, "h": 22 } @@ -5295,54 +5337,12 @@ "h": 22 }, "frame": { - "x": 354, - "y": 252, + "x": 355, + "y": 265, "w": 17, "h": 22 } }, - { - "filename": "737", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 337, - "y": 274, - "w": 18, - "h": 19 - } - }, - { - "filename": "737s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 371, - "y": 253, - "w": 18, - "h": 19 - } - }, { "filename": "741", "rotated": false, @@ -5358,12 +5358,96 @@ "h": 19 }, "frame": { - "x": 337, - "y": 293, + "x": 356, + "y": 246, "w": 17, "h": 19 } }, + { + "filename": "728s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 373, + "y": 237, + "w": 17, + "h": 20 + } + }, + { + "filename": "722s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 390, + "y": 239, + "w": 17, + "h": 18 + } + }, + { + "filename": "736s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 351, + "y": 309, + "w": 17, + "h": 13 + } + }, + { + "filename": "771s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 373, + "y": 257, + "w": 18, + "h": 13 + } + }, { "filename": "741s", "rotated": false, @@ -5379,8 +5463,8 @@ "h": 19 }, "frame": { - "x": 355, - "y": 274, + "x": 372, + "y": 270, "w": 17, "h": 19 } @@ -5400,12 +5484,33 @@ "h": 19 }, "frame": { - "x": 354, - "y": 293, + "x": 367, + "y": 289, "w": 17, "h": 19 } }, + { + "filename": "808", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 368, + "y": 308, + "w": 17, + "h": 17 + } + }, { "filename": "759s", "rotated": false, @@ -5421,96 +5526,12 @@ "h": 19 }, "frame": { - "x": 372, - "y": 272, + "x": 391, + "y": 257, "w": 17, "h": 19 } }, - { - "filename": "777", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 389, - "y": 254, - "w": 17, - "h": 19 - } - }, - { - "filename": "774", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 389, - "y": 273, - "w": 17, - "h": 18 - } - }, - { - "filename": "774s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 389, - "y": 273, - "w": 17, - "h": 18 - } - }, - { - "filename": "753s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 406, - "y": 254, - "w": 14, - "h": 19 - } - }, { "filename": "774-blue", "rotated": false, @@ -5526,35 +5547,14 @@ "h": 18 }, "frame": { - "x": 406, - "y": 273, + "x": 389, + "y": 276, "w": 17, "h": 18 } }, { - "filename": "746s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 423, - "y": 231, - "w": 18, - "h": 13 - } - }, - { - "filename": "777s", + "filename": "777", "rotated": false, "trimmed": true, "sourceSize": { @@ -5568,54 +5568,12 @@ "h": 19 }, "frame": { - "x": 420, - "y": 244, + "x": 408, + "y": 246, "w": 17, "h": 19 } }, - { - "filename": "771", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 437, - "y": 244, - "w": 18, - "h": 13 - } - }, - { - "filename": "771s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 437, - "y": 257, - "w": 18, - "h": 13 - } - }, { "filename": "774-green", "rotated": false, @@ -5631,12 +5589,33 @@ "h": 18 }, "frame": { - "x": 455, - "y": 252, + "x": 408, + "y": 265, "w": 17, "h": 18 } }, + { + "filename": "777s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 425, + "y": 247, + "w": 17, + "h": 19 + } + }, { "filename": "774-indigo", "rotated": false, @@ -5652,14 +5631,14 @@ "h": 18 }, "frame": { - "x": 472, - "y": 252, + "x": 425, + "y": 266, "w": 17, "h": 18 } }, { - "filename": "736", + "filename": "751", "rotated": false, "trimmed": true, "sourceSize": { @@ -5667,37 +5646,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 + "x": 13, + "y": 8, + "w": 14, + "h": 20 }, "frame": { - "x": 372, - "y": 291, - "w": 17, - "h": 13 - } - }, - { - "filename": "736s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 - }, - "frame": { - "x": 389, - "y": 291, - "w": 17, - "h": 13 + "x": 442, + "y": 247, + "w": 14, + "h": 20 } }, { @@ -5715,8 +5673,8 @@ "h": 18 }, "frame": { - "x": 406, - "y": 291, + "x": 456, + "y": 246, "w": 17, "h": 18 } @@ -5736,12 +5694,33 @@ "h": 18 }, "frame": { - "x": 371, - "y": 304, + "x": 473, + "y": 249, "w": 17, "h": 18 } }, + { + "filename": "751s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 442, + "y": 267, + "w": 14, + "h": 20 + } + }, { "filename": "774-violet", "rotated": false, @@ -5757,8 +5736,8 @@ "h": 18 }, "frame": { - "x": 388, - "y": 304, + "x": 456, + "y": 264, "w": 17, "h": 18 } @@ -5778,8 +5757,29 @@ "h": 18 }, "frame": { - "x": 423, - "y": 270, + "x": 473, + "y": 267, + "w": 17, + "h": 18 + } + }, + { + "filename": "774", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 406, + "y": 283, "w": 17, "h": 18 } @@ -5800,32 +5800,11 @@ }, "frame": { "x": 423, - "y": 288, + "y": 284, "w": 17, "h": 18 } }, - { - "filename": "808", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 423, - "y": 306, - "w": 17, - "h": 17 - } - }, { "filename": "774s-green", "rotated": false, @@ -5842,11 +5821,32 @@ }, "frame": { "x": 440, - "y": 270, + "y": 287, "w": 17, "h": 18 } }, + { + "filename": "753", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 457, + "y": 282, + "w": 14, + "h": 19 + } + }, { "filename": "774s-indigo", "rotated": false, @@ -5862,14 +5862,14 @@ "h": 18 }, "frame": { - "x": 440, - "y": 288, + "x": 471, + "y": 285, "w": 17, "h": 18 } }, { - "filename": "808s", + "filename": "753s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5877,16 +5877,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 + "x": 14, + "y": 8, + "w": 14, + "h": 19 }, "frame": { - "x": 440, - "y": 306, - "w": 17, - "h": 17 + "x": 488, + "y": 285, + "w": 14, + "h": 19 } }, { @@ -5904,8 +5904,8 @@ "h": 18 }, "frame": { - "x": 457, - "y": 270, + "x": 385, + "y": 294, "w": 17, "h": 18 } @@ -5925,8 +5925,8 @@ "h": 18 }, "frame": { - "x": 457, - "y": 288, + "x": 402, + "y": 301, "w": 17, "h": 18 } @@ -5946,8 +5946,8 @@ "h": 18 }, "frame": { - "x": 474, - "y": 270, + "x": 419, + "y": 302, "w": 17, "h": 18 } @@ -5967,11 +5967,53 @@ "h": 18 }, "frame": { - "x": 474, - "y": 288, + "x": 436, + "y": 305, "w": 17, "h": 18 } + }, + { + "filename": "774s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 453, + "y": 305, + "w": 17, + "h": 18 + } + }, + { + "filename": "808s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 470, + "y": 303, + "w": 17, + "h": 17 + } } ] } @@ -5979,6 +6021,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a4de8d1c4f7d4f58c929b8b5479e03f1:3c8ac308e19a7f9420a4df8a78188490:2e7c5873ead8fd8fce82a0b3fcc86b42$" + "smartupdate": "$TexturePacker:SmartUpdate:5861cb99c3db0943f1ccef3b0e1b4683:26656a692718930d92be5b6aba391ced:2e7c5873ead8fd8fce82a0b3fcc86b42$" } } diff --git a/public/images/pokemon_icons_7.png b/public/images/pokemon_icons_7.png index c9a396ed5c6..5e6421360fd 100644 Binary files a/public/images/pokemon_icons_7.png and b/public/images/pokemon_icons_7.png differ diff --git a/public/images/pokemon_icons_7v.json b/public/images/pokemon_icons_7v.json index a7f828a0fe1..30e12ce3bb4 100644 --- a/public/images/pokemon_icons_7v.json +++ b/public/images/pokemon_icons_7v.json @@ -1,956 +1,2981 @@ -{ "frames": { - "2027_2": { - "frame": { "x": 160, "y": 218, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2027_3": { - "frame": { "x": 91, "y": 218, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2028_2": { - "frame": { "x": 26, "y": 148, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2028_3": { - "frame": { "x": 104, "y": 148, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2052_2": { - "frame": { "x": 144, "y": 195, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2052_3": { - "frame": { "x": 331, "y": 195, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2053_2": { - "frame": { "x": 121, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2053_3": { - "frame": { "x": 312, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "728_2": { - "frame": { "x": 62, "y": 219, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "728_3": { - "frame": { "x": 45, "y": 219, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "729_2": { - "frame": { "x": 158, "y": 171, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "729_3": { - "frame": { "x": 98, "y": 172, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "730_2": { - "frame": { "x": 130, "y": 145, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "730_3": { - "frame": { "x": 234, "y": 147, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "734_2": { - "frame": { "x": 306, "y": 214, "w": 25, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 25, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "734_3": { - "frame": { "x": 20, "y": 215, "w": 25, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 25, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "735_2": { - "frame": { "x": 268, "y": 175, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "735_3": { - "frame": { "x": 288, "y": 175, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "742_2": { - "frame": { "x": 187, "y": 217, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "742_3": { - "frame": { "x": 283, "y": 217, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "743_2": { - "frame": { "x": 0, "y": 197, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "743_3": { - "frame": { "x": 96, "y": 196, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "747_2": { - "frame": { "x": 165, "y": 198, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "747_3": { - "frame": { "x": 202, "y": 197, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "748_2": { - "frame": { "x": 0, "y": 148, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "748_3": { - "frame": { "x": 312, "y": 147, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "751_2": { - "frame": { "x": 104, "y": 60, "w": 14, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 14, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "751_3": { - "frame": { "x": 130, "y": 88, "w": 14, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 14, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "752_2": { - "frame": { "x": 283, "y": 199, "w": 23, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 23, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "752_3": { - "frame": { "x": 116, "y": 214, "w": 23, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 23, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "753_2": { - "frame": { "x": 187, "y": 198, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "753_3": { - "frame": { "x": 234, "y": 118, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "754_2": { - "frame": { "x": 71, "y": 197, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "754_3": { - "frame": { "x": 224, "y": 198, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "755_2": { - "frame": { "x": 346, "y": 52, "w": 13, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 4, "w": 13, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "755_3": { - "frame": { "x": 268, "y": 30, "w": 13, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 4, "w": 13, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "756_2": { - "frame": { "x": 338, "y": 171, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "756_3": { - "frame": { "x": 0, "y": 173, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "761_2": { - "frame": { "x": 323, "y": 235, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "761_3": { - "frame": { "x": 129, "y": 235, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "762_2": { - "frame": { "x": 342, "y": 29, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "762_3": { - "frame": { "x": 265, "y": 199, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "763_2": { - "frame": { "x": 50, "y": 175, "w": 21, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 21, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "763_3": { - "frame": { "x": 181, "y": 174, "w": 21, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 21, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "767_2": { - "frame": { "x": 223, "y": 220, "w": 24, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 24, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "767_3": { - "frame": { "x": 17, "y": 231, "w": 24, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 24, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "768_2": { - "frame": { "x": 26, "y": 172, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "768_3": { - "frame": { "x": 74, "y": 150, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "771_2": { - "frame": { "x": 163, "y": 236, "w": 18, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 11, "w": 18, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "771_3": { - "frame": { "x": 145, "y": 236, "w": 18, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 11, "w": 18, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "772_2": { - "frame": { "x": 262, "y": 147, "w": 25, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "772_3": { - "frame": { "x": 287, "y": 147, "w": 25, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-bug_2": { - "frame": { "x": 0, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-bug_3": { - "frame": { "x": 26, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-dark_2": { - "frame": { "x": 104, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-dark_3": { - "frame": { "x": 182, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-dragon_2": { - "frame": { "x": 208, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-dragon_3": { - "frame": { "x": 52, "y": 120, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-electric_2": { - "frame": { "x": 78, "y": 120, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-electric_3": { - "frame": { "x": 268, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fairy_2": { - "frame": { "x": 294, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fairy_3": { - "frame": { "x": 320, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fighting_2": { - "frame": { "x": 0, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fighting_3": { - "frame": { "x": 26, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fire_2": { - "frame": { "x": 118, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fire_3": { - "frame": { "x": 203, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-flying_2": { - "frame": { "x": 229, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-flying_3": { - "frame": { "x": 326, "y": 117, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ghost_2": { - "frame": { "x": 78, "y": 60, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ghost_3": { - "frame": { "x": 144, "y": 85, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-grass_2": { - "frame": { "x": 170, "y": 85, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-grass_3": { - "frame": { "x": 255, "y": 87, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ground_2": { - "frame": { "x": 281, "y": 87, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ground_3": { - "frame": { "x": 307, "y": 87, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ice_2": { - "frame": { "x": 333, "y": 87, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ice_3": { - "frame": { "x": 0, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-poison_2": { - "frame": { "x": 26, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-poison_3": { - "frame": { "x": 104, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-psychic_2": { - "frame": { "x": 196, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-psychic_3": { - "frame": { "x": 222, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-rock_2": { - "frame": { "x": 52, "y": 90, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-rock_3": { - "frame": { "x": 78, "y": 90, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-steel_2": { - "frame": { "x": 130, "y": 115, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-steel_3": { - "frame": { "x": 52, "y": 60, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-water_2": { - "frame": { "x": 156, "y": 115, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-water_3": { - "frame": { "x": 248, "y": 117, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773_2": { - "frame": { "x": 274, "y": 117, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773_3": { - "frame": { "x": 300, "y": 117, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "776_2": { - "frame": { "x": 181, "y": 148, "w": 23, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "776_3": { - "frame": { "x": 158, "y": 145, "w": 23, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "777_2": { - "frame": { "x": 223, "y": 234, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "777_3": { - "frame": { "x": 112, "y": 232, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "778-busted_2": { - "frame": { "x": 302, "y": 230, "w": 21, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "778-busted_3": { - "frame": { "x": 247, "y": 222, "w": 21, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "778-disguised_2": { - "frame": { "x": 206, "y": 217, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "778-disguised_3": { - "frame": { "x": 0, "y": 219, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "779_2": { - "frame": { "x": 244, "y": 199, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "779_3": { - "frame": { "x": 45, "y": 199, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "789_1": { - "frame": { "x": 308, "y": 194, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "789_2": { - "frame": { "x": 22, "y": 195, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "789_3": { - "frame": { "x": 121, "y": 194, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "790_2": { - "frame": { "x": 331, "y": 216, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "790_3": { - "frame": { "x": 139, "y": 216, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "791_1": { - "frame": { "x": 239, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "791_2": { - "frame": { "x": 210, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "791_3": { - "frame": { "x": 118, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "792_2": { - "frame": { "x": 175, "y": 57, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "792_3": { - "frame": { "x": 147, "y": 57, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "793_2": { - "frame": { "x": 247, "y": 175, "w": 21, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "793_3": { - "frame": { "x": 226, "y": 174, "w": 21, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "797_2": { - "frame": { "x": 250, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "797_3": { - "frame": { "x": 218, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "798_2": { - "frame": { "x": 179, "y": 28, "w": 31, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "798_3": { - "frame": { "x": 148, "y": 28, "w": 31, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-dawn-wings_2": { - "frame": { "x": 31, "y": 28, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-dawn-wings_3": { - "frame": { "x": 0, "y": 28, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-dusk-mane_2": { - "frame": { "x": 114, "y": 0, "w": 34, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 34, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-dusk-mane_3": { - "frame": { "x": 80, "y": 0, "w": 34, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 34, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-ultra_2": { - "frame": { "x": 183, "y": 0, "w": 35, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-ultra_3": { - "frame": { "x": 148, "y": 0, "w": 35, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800_2": { - "frame": { "x": 90, "y": 30, "w": 28, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 28, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800_3": { - "frame": { "x": 62, "y": 30, "w": 28, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 28, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "802_1": { - "frame": { "x": 74, "y": 173, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "802_2": { - "frame": { "x": 204, "y": 173, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "802_3": { - "frame": { "x": 338, "y": 147, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "803_2": { - "frame": { "x": 51, "y": 150, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "803_3": { - "frame": { "x": 204, "y": 148, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "804_2": { - "frame": { "x": 315, "y": 0, "w": 33, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 33, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "804_3": { - "frame": { "x": 282, "y": 0, "w": 33, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 33, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "808_2": { - "frame": { "x": 339, "y": 235, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "808_3": { - "frame": { "x": 79, "y": 236, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "809-gigantamax_2": { - "frame": { "x": 312, "y": 29, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "809-gigantamax_3": { - "frame": { "x": 282, "y": 29, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "809_2": { - "frame": { "x": 40, "y": 0, "w": 40, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 40, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "809_3": { - "frame": { "x": 0, "y": 0, "w": 40, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 40, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_6v.png", - "format": "RGBA8888", - "size": { "w": 360, "h": 254 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_7v.png", + "format": "RGBA8888", + "size": { + "w": 440, + "h": 440 + }, + "scale": 1, + "frames": [ + { + "filename": "728_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "728_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "729_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "729_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "730_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "730_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "734_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "734_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "735_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "735_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "742_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "742_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "743_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "743_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "747_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "747_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "748_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "748_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "751_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "751_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "752_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "752_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "753_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "753_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "754_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "754_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "755_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "755_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "756_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "756_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "761_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "761_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "762_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "762_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "763_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "763_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "767_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "767_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "768_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "768_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "771_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "771_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "772_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "772_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-bug_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-bug_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-dark_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-dark_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-dragon_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-dragon_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-electric_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-electric_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fairy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fairy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fighting_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fighting_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fire_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fire_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-flying_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-flying_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ghost_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ghost_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-grass_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-grass_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ground_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ground_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ice_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ice_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-poison_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-poison_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-psychic_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-psychic_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-rock_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-rock_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-steel_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-steel_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-water_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-water_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "773_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "773_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "776_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "776_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "777_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "777_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "778-busted_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "778-busted_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "778-disguised_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "778-disguised_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "779_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "779_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "789_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "789_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "789_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "790_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "790_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "791_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "791_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "791_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "792_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "792_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "793_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "793_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "797_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "797_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "798_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "798_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-dawn-wings_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-dawn-wings_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-dusk-mane_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-dusk-mane_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-ultra_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-ultra_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "800_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "800_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "802_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "802_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "802_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "803_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "803_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "804_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "804_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "807_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "807_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "808_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "808_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "809-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "809-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "809_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "809_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "2026_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "2026_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "2027_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "2027_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2028_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2028_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2052_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2052_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2053_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2053_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2103_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2103_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:914c9869d6dab145bbbe443bdc3f932c:80b9ecf9647b68af17c07b88e1a1856e:d5975df27e1e94206a68aa1fd3c2c8d0$" + } } diff --git a/public/images/pokemon_icons_7v.png b/public/images/pokemon_icons_7v.png index 50fee6de396..1f7d6e5f826 100644 Binary files a/public/images/pokemon_icons_7v.png and b/public/images/pokemon_icons_7v.png differ diff --git a/public/images/pokemon_icons_8v.json b/public/images/pokemon_icons_8v.json index 002957bba0c..a33f88e9d9b 100644 --- a/public/images/pokemon_icons_8v.json +++ b/public/images/pokemon_icons_8v.json @@ -1,1306 +1,4115 @@ -{ "frames": { - "4052_2": { - "frame": { "x": 85, "y": 209, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4052_3": { - "frame": { "x": 106, "y": 210, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4077_2": { - "frame": { "x": 203, "y": 112, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4077_3": { - "frame": { "x": 48, "y": 112, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4078_2": { - "frame": { "x": 230, "y": 133, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4078_3": { - "frame": { "x": 203, "y": 133, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4079_2": { - "frame": { "x": 79, "y": 250, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4079_3": { - "frame": { "x": 351, "y": 250, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4080_1": { - "frame": { "x": 352, "y": 161, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4080_2": { - "frame": { "x": 23, "y": 161, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4080_3": { - "frame": { "x": 328, "y": 160, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4144_2": { - "frame": { "x": 146, "y": 230, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4144_3": { - "frame": { "x": 85, "y": 231, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4145_2": { - "frame": { "x": 228, "y": 110, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4145_3": { - "frame": { "x": 97, "y": 89, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4146_2": { - "frame": { "x": 240, "y": 200, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4146_3": { - "frame": { "x": 212, "y": 200, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4199_1": { - "frame": { "x": 360, "y": 30, "w": 20, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4199_2": { - "frame": { "x": 96, "y": 182, "w": 20, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4199_3": { - "frame": { "x": 192, "y": 179, "w": 20, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4222_2": { - "frame": { "x": 309, "y": 228, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4222_3": { - "frame": { "x": 330, "y": 228, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4263_2": { - "frame": { "x": 216, "y": 258, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4263_3": { - "frame": { "x": 304, "y": 265, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4264_2": { - "frame": { "x": 287, "y": 210, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4264_3": { - "frame": { "x": 160, "y": 210, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4562_2": { - "frame": { "x": 76, "y": 264, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4562_3": { - "frame": { "x": 351, "y": 264, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6100_2": { - "frame": { "x": 168, "y": 230, "w": 14, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6100_3": { - "frame": { "x": 49, "y": 277, "w": 14, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6101_2": { - "frame": { "x": 312, "y": 187, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6101_3": { - "frame": { "x": 266, "y": 271, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6215_2": { - "frame": { "x": 182, "y": 251, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6215_3": { - "frame": { "x": 126, "y": 250, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6549_2": { - "frame": { "x": 288, "y": 249, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6549_3": { - "frame": { "x": 286, "y": 58, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6570_2": { - "frame": { "x": 146, "y": 249, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6570_3": { - "frame": { "x": 333, "y": 248, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6571_2": { - "frame": { "x": 193, "y": 156, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6571_3": { - "frame": { "x": 23, "y": 138, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6705_2": { - "frame": { "x": 125, "y": 89, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6705_3": { - "frame": { "x": 34, "y": 271, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6706_2": { - "frame": { "x": 234, "y": 85, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6706_3": { - "frame": { "x": 260, "y": 85, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6713_2": { - "frame": { "x": 257, "y": 133, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6713_3": { - "frame": { "x": 48, "y": 134, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "816_2": { - "frame": { "x": 0, "y": 188, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "816_3": { - "frame": { "x": 290, "y": 187, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "817_2": { - "frame": { "x": 308, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "817_3": { - "frame": { "x": 332, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "818-gigantamax_2": { - "frame": { "x": 214, "y": 28, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "818-gigantamax_3": { - "frame": { "x": 348, "y": 0, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "818_2": { - "frame": { "x": 75, "y": 134, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "818_3": { - "frame": { "x": 123, "y": 135, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "821_2": { - "frame": { "x": 139, "y": 271, "w": 19, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "821_3": { - "frame": { "x": 158, "y": 271, "w": 19, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "822_2": { - "frame": { "x": 0, "y": 231, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "822_3": { - "frame": { "x": 287, "y": 230, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "823-gigantamax_2": { - "frame": { "x": 302, "y": 28, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "823-gigantamax_3": { - "frame": { "x": 0, "y": 30, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "823_2": { - "frame": { "x": 140, "y": 87, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "823_3": { - "frame": { "x": 201, "y": 88, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "829_2": { - "frame": { "x": 270, "y": 231, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "829_3": { - "frame": { "x": 122, "y": 271, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "830_2": { - "frame": { "x": 42, "y": 226, "w": 19, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "830_3": { - "frame": { "x": 233, "y": 218, "w": 19, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "835_2": { - "frame": { "x": 211, "y": 218, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "835_3": { - "frame": { "x": 0, "y": 211, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "836_2": { - "frame": { "x": 189, "y": 206, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "836_3": { - "frame": { "x": 138, "y": 205, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "850_2": { - "frame": { "x": 194, "y": 276, "w": 21, "h": 10 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 10 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "850_3": { - "frame": { "x": 233, "y": 275, "w": 21, "h": 10 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 10 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "851_2": { - "frame": { "x": 113, "y": 0, "w": 37, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 0, "w": 37, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "851_3": { - "frame": { "x": 76, "y": 0, "w": 37, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 0, "w": 37, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "854_2": { - "frame": { "x": 98, "y": 274, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "854_3": { - "frame": { "x": 177, "y": 272, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "855_2": { - "frame": { "x": 116, "y": 187, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "855_3": { - "frame": { "x": 167, "y": 187, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "856_2": { - "frame": { "x": 127, "y": 227, "w": 19, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "856_3": { - "frame": { "x": 182, "y": 228, "w": 19, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "857_2": { - "frame": { "x": 312, "y": 206, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "857_3": { - "frame": { "x": 44, "y": 204, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "858-gigantamax_2": { - "frame": { "x": 273, "y": 28, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "858-gigantamax_3": { - "frame": { "x": 244, "y": 28, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "858_2": { - "frame": { "x": 47, "y": 179, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "858_3": { - "frame": { "x": 74, "y": 161, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "859_2": { - "frame": { "x": 326, "y": 270, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "859_3": { - "frame": { "x": 0, "y": 271, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "860_2": { - "frame": { "x": 22, "y": 184, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "860_3": { - "frame": { "x": 69, "y": 186, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "861-gigantamax_2": { - "frame": { "x": 0, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "861-gigantamax_3": { - "frame": { "x": 302, "y": 55, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "861_2": { - "frame": { "x": 286, "y": 85, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "861_3": { - "frame": { "x": 72, "y": 83, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "863_2": { - "frame": { "x": 22, "y": 207, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "863_3": { - "frame": { "x": 360, "y": 112, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "864_2": { - "frame": { "x": 94, "y": 30, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "864_3": { - "frame": { "x": 151, "y": 30, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "867_2": { - "frame": { "x": 32, "y": 30, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "867_3": { - "frame": { "x": 63, "y": 30, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "872_1": { - "frame": { "x": 282, "y": 272, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "872_2": { - "frame": { "x": 216, "y": 274, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "872_3": { - "frame": { "x": 17, "y": 274, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "873_1": { - "frame": { "x": 243, "y": 178, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "873_2": { - "frame": { "x": 218, "y": 178, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "873_3": { - "frame": { "x": 270, "y": 162, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "876-female_2": { - "frame": { "x": 350, "y": 184, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "876-female_3": { - "frame": { "x": 268, "y": 184, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "876_2": { - "frame": { "x": 268, "y": 207, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "876_3": { - "frame": { "x": 66, "y": 209, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877-hangry_1": { - "frame": { "x": 105, "y": 253, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877-hangry_2": { - "frame": { "x": 249, "y": 254, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877-hangry_3": { - "frame": { "x": 199, "y": 255, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877_1": { - "frame": { "x": 59, "y": 256, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877_2": { - "frame": { "x": 0, "y": 250, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877_3": { - "frame": { "x": 17, "y": 253, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "880_2": { - "frame": { "x": 244, "y": 156, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "880_3": { - "frame": { "x": 218, "y": 156, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "881_2": { - "frame": { "x": 252, "y": 231, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "881_3": { - "frame": { "x": 61, "y": 233, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "882_2": { - "frame": { "x": 328, "y": 183, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "882_3": { - "frame": { "x": 145, "y": 182, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "883_2": { - "frame": { "x": 357, "y": 207, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "883_3": { - "frame": { "x": 334, "y": 207, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "884-gigantamax_2": { - "frame": { "x": 124, "y": 30, "w": 27, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "884-gigantamax_3": { - "frame": { "x": 181, "y": 30, "w": 27, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "884_2": { - "frame": { "x": 123, "y": 162, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "884_3": { - "frame": { "x": 0, "y": 163, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "885_1": { - "frame": { "x": 201, "y": 238, "w": 24, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 24, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "885_2": { - "frame": { "x": 225, "y": 241, "w": 24, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 24, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "885_3": { - "frame": { "x": 309, "y": 248, "w": 24, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 24, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "886_1": { - "frame": { "x": 308, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "886_2": { - "frame": { "x": 125, "y": 111, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "886_3": { - "frame": { "x": 177, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "887_1": { - "frame": { "x": 86, "y": 57, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "887_2": { - "frame": { "x": 56, "y": 57, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "887_3": { - "frame": { "x": 26, "y": 57, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "888-crowned_2": { - "frame": { "x": 182, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "888-crowned_3": { - "frame": { "x": 150, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "888_2": { - "frame": { "x": 167, "y": 89, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "888_3": { - "frame": { "x": 311, "y": 89, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "889-crowned_2": { - "frame": { "x": 214, "y": 0, "w": 34, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "889-crowned_3": { - "frame": { "x": 248, "y": 0, "w": 34, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "889_2": { - "frame": { "x": 260, "y": 58, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "889_3": { - "frame": { "x": 234, "y": 58, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "890-eternamax_2": { - "frame": { "x": 0, "y": 0, "w": 38, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 0, "w": 38, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "890-eternamax_3": { - "frame": { "x": 38, "y": 0, "w": 38, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 0, "w": 38, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "890_2": { - "frame": { "x": 282, "y": 0, "w": 33, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 33, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "890_3": { - "frame": { "x": 315, "y": 0, "w": 33, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 33, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "891_1": { - "frame": { "x": 164, "y": 249, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "891_2": { - "frame": { "x": 270, "y": 249, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "891_3": { - "frame": { "x": 41, "y": 249, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-rapid_1": { - "frame": { "x": 284, "y": 111, "w": 24, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 24, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-rapid_2": { - "frame": { "x": 0, "y": 112, "w": 24, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 24, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-rapid_3": { - "frame": { "x": 24, "y": 112, "w": 24, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 24, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-single_1": { - "frame": { "x": 26, "y": 83, "w": 23, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-single_2": { - "frame": { "x": 49, "y": 83, "w": 23, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-single_3": { - "frame": { "x": 352, "y": 60, "w": 23, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-rapid-strike_1": { - "frame": { "x": 48, "y": 157, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-rapid-strike_2": { - "frame": { "x": 97, "y": 160, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-rapid-strike_3": { - "frame": { "x": 145, "y": 160, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892_1": { - "frame": { "x": 356, "y": 136, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892_2": { - "frame": { "x": 284, "y": 137, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892_3": { - "frame": { "x": 0, "y": 138, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "896_1": { - "frame": { "x": 97, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "896_2": { - "frame": { "x": 145, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "896_3": { - "frame": { "x": 169, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "897_1": { - "frame": { "x": 151, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "897_2": { - "frame": { "x": 97, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "897_3": { - "frame": { "x": 334, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-ice_1": { - "frame": { "x": 328, "y": 60, "w": 24, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-ice_2": { - "frame": { "x": 116, "y": 60, "w": 24, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-ice_3": { - "frame": { "x": 177, "y": 60, "w": 24, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-shadow_1": { - "frame": { "x": 151, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-shadow_2": { - "frame": { "x": 208, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-shadow_3": { - "frame": { "x": 334, "y": 30, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898_1": { - "frame": { "x": 351, "y": 228, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898_2": { - "frame": { "x": 22, "y": 231, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898_3": { - "frame": { "x": 107, "y": 231, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "900_2": { - "frame": { "x": 0, "y": 87, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "900_3": { - "frame": { "x": 72, "y": 109, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "901_2": { - "frame": { "x": 256, "y": 110, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "901_3": { - "frame": { "x": 339, "y": 89, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "903_2": { - "frame": { "x": 307, "y": 160, "w": 21, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 21, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "903_3": { - "frame": { "x": 171, "y": 160, "w": 21, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 21, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_8v.png", - "format": "RGBA8888", - "size": { "w": 380, "h": 293 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_8v.png", + "format": "RGBA8888", + "size": { + "w": 510, + "h": 510 + }, + "scale": 1, + "frames": [ + { + "filename": "816_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "816_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "817_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "817_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "818-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "818-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "818_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "818_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "821_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "821_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "822_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "822_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "823-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "823-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "823_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "823_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "829_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "829_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "830_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "830_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "835_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "835_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "836_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "836_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "850_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "850_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851-gigantamax", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851s-gigantamax", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "854_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "854_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "855_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "855_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "856_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "856_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "857_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "857_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "858-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "858-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "858_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "858_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "859_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "859_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "860_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "860_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "861-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "861-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "861_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "861_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "863_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "863_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "864_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "864_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "867_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "867_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "872_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "872_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "872_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "873_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "873_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "873_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "876-female_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "876-female_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "876_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "876_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877-hangry_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877-hangry_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877-hangry_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "877_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "880_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "880_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "881_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "881_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "882_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "882_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "883_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "883_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "884-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "884-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "884_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "884_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "885_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "885_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "885_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "886_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "886_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "886_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "887_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "887_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "887_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "888-crowned_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "888-crowned_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "888_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "888_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "889-crowned_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "889-crowned_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "889_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "889_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "890-eternamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "890-eternamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "890_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "890_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "891_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "891_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "891_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-rapid_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-rapid_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-rapid_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-single_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-single_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-single_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-rapid-strike_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-rapid-strike_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-rapid-strike_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "892_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "894_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "894_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "895_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "895_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "896_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "896_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "896_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "897_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "897_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "897_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-ice_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-ice_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-ice_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-shadow_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-shadow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-shadow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "900_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "900_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "901_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "901_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "903_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "903_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4052_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4052_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4077_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4077_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4078_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4078_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4079_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4079_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4080_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4080_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4080_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4144_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4144_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4145_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4145_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4146_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4146_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4199_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4199_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4199_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4222_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4222_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4263_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4263_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4264_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4264_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4562_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4562_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6100_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6100_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6101_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6101_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6215_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6215_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6503_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6503_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6549_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6549_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6570_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6570_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6571_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6571_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6705_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6705_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6706_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6706_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "6713_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "6713_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c6192164d1b1971f54a6c5864e11748d:46b3adcf2a25bfb824db3d24cd1c96a9:ec5f05e7f30cd98f74db0c2326109fd3$" + } } diff --git a/public/images/pokemon_icons_8v.png b/public/images/pokemon_icons_8v.png index 1968bfe6214..2af86ac656f 100644 Binary files a/public/images/pokemon_icons_8v.png and b/public/images/pokemon_icons_8v.png differ diff --git a/public/images/pokemon_icons_9v.json b/public/images/pokemon_icons_9v.json index 06909a8298f..6c8b93208e3 100644 --- a/public/images/pokemon_icons_9v.json +++ b/public/images/pokemon_icons_9v.json @@ -1,1047 +1,3296 @@ -{ "frames": { - "1000_1": { - "frame": { "x": 93, "y": 139, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1000_2": { - "frame": { "x": 170, "y": 135, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1000_3": { - "frame": { "x": 192, "y": 135, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1001_2": { - "frame": { "x": 249, "y": 0, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1001_3": { - "frame": { "x": 279, "y": 0, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1003_2": { - "frame": { "x": 27, "y": 58, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1003_3": { - "frame": { "x": 55, "y": 58, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1004_2": { - "frame": { "x": 249, "y": 207, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1004_3": { - "frame": { "x": 204, "y": 206, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1006_2": { - "frame": { "x": 44, "y": 140, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1006_3": { - "frame": { "x": 22, "y": 139, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1007-apex-build_2": { - "frame": { "x": 155, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1007-apex-build_3": { - "frame": { "x": 187, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1008-ultimate-mode_1": { - "frame": { "x": 185, "y": 29, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1008-ultimate-mode_2": { - "frame": { "x": 155, "y": 29, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1008-ultimate-mode_3": { - "frame": { "x": 219, "y": 0, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1010_2": { - "frame": { "x": 271, "y": 179, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1010_3": { - "frame": { "x": 162, "y": 182, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1018_2": { - "frame": { "x": 0, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1018_3": { - "frame": { "x": 31, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1022_2": { - "frame": { "x": 27, "y": 86, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1022_3": { - "frame": { "x": 163, "y": 84, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1023_2": { - "frame": { "x": 300, "y": 30, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1023_3": { - "frame": { "x": 46, "y": 167, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8901_1": { - "frame": { "x": 30, "y": 30, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8901_2": { - "frame": { "x": 60, "y": 30, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8901_3": { - "frame": { "x": 0, "y": 30, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "909_2": { - "frame": { "x": 42, "y": 195, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "909_3": { - "frame": { "x": 63, "y": 196, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "910_2": { - "frame": { "x": 271, "y": 205, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "910_3": { - "frame": { "x": 292, "y": 204, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "911_2": { - "frame": { "x": 131, "y": 112, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "911_3": { - "frame": { "x": 188, "y": 112, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "912_2": { - "frame": { "x": 36, "y": 244, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "912_3": { - "frame": { "x": 178, "y": 244, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "913_2": { - "frame": { "x": 84, "y": 217, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "913_3": { - "frame": { "x": 197, "y": 59, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "914_2": { - "frame": { "x": 122, "y": 135, "w": 24, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "914_3": { - "frame": { "x": 146, "y": 135, "w": 24, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "919_1": { - "frame": { "x": 0, "y": 253, "w": 16, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 13, "w": 16, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "919_2": { - "frame": { "x": 51, "y": 250, "w": 16, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 13, "w": 16, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "919_3": { - "frame": { "x": 95, "y": 247, "w": 16, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 13, "w": 16, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "920_1": { - "frame": { "x": 0, "y": 190, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "920_2": { - "frame": { "x": 208, "y": 183, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "920_3": { - "frame": { "x": 0, "y": 143, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "924_1": { - "frame": { "x": 237, "y": 152, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "924_2": { - "frame": { "x": 144, "y": 162, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "924_3": { - "frame": { "x": 266, "y": 159, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-four_1": { - "frame": { "x": 93, "y": 117, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-four_2": { - "frame": { "x": 245, "y": 130, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-four_3": { - "frame": { "x": 216, "y": 112, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-three_1": { - "frame": { "x": 115, "y": 160, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-three_2": { - "frame": { "x": 202, "y": 163, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-three_3": { - "frame": { "x": 173, "y": 162, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "932_2": { - "frame": { "x": 202, "y": 226, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "932_3": { - "frame": { "x": 292, "y": 225, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "933_2": { - "frame": { "x": 183, "y": 183, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "933_3": { - "frame": { "x": 292, "y": 183, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "934_2": { - "frame": { "x": 273, "y": 30, "w": 27, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "934_3": { - "frame": { "x": 0, "y": 58, "w": 27, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "935_1": { - "frame": { "x": 300, "y": 244, "w": 13, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 13, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "935_2": { - "frame": { "x": 287, "y": 244, "w": 13, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 13, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "935_3": { - "frame": { "x": 236, "y": 241, "w": 13, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 13, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "936_1": { - "frame": { "x": 251, "y": 179, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "936_2": { - "frame": { "x": 66, "y": 168, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "936_3": { - "frame": { "x": 231, "y": 172, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "937_1": { - "frame": { "x": 215, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "937_2": { - "frame": { "x": 244, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "937_3": { - "frame": { "x": 90, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "937_9": { - "frame": { "x": 119, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "940_2": { - "frame": { "x": 245, "y": 116, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 14, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "940_3": { - "frame": { "x": 153, "y": 254, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 14, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "941_2": { - "frame": { "x": 183, "y": 204, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "941_3": { - "frame": { "x": 125, "y": 204, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "948_2": { - "frame": { "x": 249, "y": 227, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "948_3": { - "frame": { "x": 0, "y": 232, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "949_2": { - "frame": { "x": 22, "y": 193, "w": 20, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "949_3": { - "frame": { "x": 86, "y": 192, "w": 20, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "951_2": { - "frame": { "x": 220, "y": 241, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "951_3": { - "frame": { "x": 162, "y": 234, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "952_2": { - "frame": { "x": 112, "y": 180, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "952_3": { - "frame": { "x": 137, "y": 182, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "953_2": { - "frame": { "x": 51, "y": 219, "w": 24, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "953_3": { - "frame": { "x": 225, "y": 225, "w": 24, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "954_2": { - "frame": { "x": 296, "y": 130, "w": 21, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 21, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "954_3": { - "frame": { "x": 216, "y": 134, "w": 21, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 21, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "957_1": { - "frame": { "x": 193, "y": 245, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "957_2": { - "frame": { "x": 301, "y": 113, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "957_3": { - "frame": { "x": 265, "y": 246, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "958_1": { - "frame": { "x": 270, "y": 226, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "958_2": { - "frame": { "x": 145, "y": 227, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "958_3": { - "frame": { "x": 101, "y": 227, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "959_1": { - "frame": { "x": 62, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "959_2": { - "frame": { "x": 93, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "959_3": { - "frame": { "x": 124, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "962_1": { - "frame": { "x": 301, "y": 88, "w": 19, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "962_2": { - "frame": { "x": 230, "y": 200, "w": 19, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "962_3": { - "frame": { "x": 106, "y": 202, "w": 19, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "967_2": { - "frame": { "x": 182, "y": 225, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "967_3": { - "frame": { "x": 125, "y": 225, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "968_2": { - "frame": { "x": 48, "y": 112, "w": 23, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "968_3": { - "frame": { "x": 25, "y": 111, "w": 23, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "969_2": { - "frame": { "x": 16, "y": 260, "w": 18, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 16, "w": 18, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "969_3": { - "frame": { "x": 67, "y": 255, "w": 18, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 16, "w": 18, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "970_2": { - "frame": { "x": 118, "y": 244, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "970_3": { - "frame": { "x": 16, "y": 244, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "973_1": { - "frame": { "x": 167, "y": 208, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 2, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "973_2": { - "frame": { "x": 21, "y": 218, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 2, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "973_3": { - "frame": { "x": 36, "y": 218, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 2, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "974_2": { - "frame": { "x": 73, "y": 240, "w": 22, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "974_3": { - "frame": { "x": 51, "y": 235, "w": 22, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "975_2": { - "frame": { "x": 269, "y": 109, "w": 32, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 7, "w": 32, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "975_3": { - "frame": { "x": 269, "y": 88, "w": 32, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 7, "w": 32, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-curly_2": { - "frame": { "x": 111, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-curly_3": { - "frame": { "x": 209, "y": 261, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-droopy_2": { - "frame": { "x": 85, "y": 262, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-droopy_3": { - "frame": { "x": 193, "y": 262, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-stretchy_2": { - "frame": { "x": 224, "y": 262, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-stretchy_3": { - "frame": { "x": 34, "y": 263, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "979_1": { - "frame": { "x": 56, "y": 86, "w": 27, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "979_2": { - "frame": { "x": 192, "y": 86, "w": 27, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "979_3": { - "frame": { "x": 219, "y": 86, "w": 27, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "981_2": { - "frame": { "x": 108, "y": 87, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "981_3": { - "frame": { "x": 246, "y": 86, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "982-three-segment_2": { - "frame": { "x": 83, "y": 87, "w": 25, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 25, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "982-three-segment_3": { - "frame": { "x": 295, "y": 60, "w": 25, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 25, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "982_2": { - "frame": { "x": 24, "y": 167, "w": 22, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "982_3": { - "frame": { "x": 90, "y": 166, "w": 22, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "987_1": { - "frame": { "x": 66, "y": 144, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "987_2": { - "frame": { "x": 295, "y": 159, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "987_3": { - "frame": { "x": 0, "y": 166, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "988_2": { - "frame": { "x": 137, "y": 84, "w": 26, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 26, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "988_3": { - "frame": { "x": 269, "y": 60, "w": 26, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 26, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "993_2": { - "frame": { "x": 167, "y": 59, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "993_3": { - "frame": { "x": 137, "y": 59, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "994_2": { - "frame": { "x": 242, "y": 58, "w": 27, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 27, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "994_3": { - "frame": { "x": 215, "y": 58, "w": 27, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 27, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "995_2": { - "frame": { "x": 110, "y": 58, "w": 27, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 27, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "995_3": { - "frame": { "x": 83, "y": 58, "w": 27, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 27, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "996_2": { - "frame": { "x": 138, "y": 247, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "996_3": { - "frame": { "x": 249, "y": 248, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "997_2": { - "frame": { "x": 146, "y": 208, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "997_3": { - "frame": { "x": 0, "y": 213, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "998_2": { - "frame": { "x": 163, "y": 109, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "998_3": { - "frame": { "x": 0, "y": 88, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "999_1": { - "frame": { "x": 274, "y": 130, "w": 22, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 22, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "999_2": { - "frame": { "x": 71, "y": 115, "w": 22, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 22, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "999_3": { - "frame": { "x": 0, "y": 114, "w": 22, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 22, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_9v.png", - "format": "RGBA8888", - "size": { "w": 320, "h": 277 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_9v.png", + "format": "RGBA8888", + "size": { + "w": 450, + "h": 450 + }, + "scale": 1, + "frames": [ + { + "filename": "909_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "909_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "910_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "910_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "911_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "911_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "912_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "912_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "913_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "913_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "914_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "914_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "919_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "919_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "919_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "920_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "920_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "920_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "924_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "924_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "924_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-four_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-four_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-four_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-three_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-three_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-three_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "932_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "932_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "933_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "933_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "934_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "934_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "935_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "935_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "935_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "936_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "936_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "936_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "937_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "937_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "937_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "937_9", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "940_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "940_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "941_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "941_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "944_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "944_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "945_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "945_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "948_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "948_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "949_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "949_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "951_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "951_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "952_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "952_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "953_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "953_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "954_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "954_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "957_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "957_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "957_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "958_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "958_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "958_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "959_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "959_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "959_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "962_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "962_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "962_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "967_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "967_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "968_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "968_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "969_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "969_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "970_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "970_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "973_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "973_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "973_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "974_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "974_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "975_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "975_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-curly_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-curly_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-droopy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-droopy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-stretchy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-stretchy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "979_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "979_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "979_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "981_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "981_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "982-three-segment_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "982-three-segment_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "982_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "982_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "987_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "987_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "987_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "988_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "988_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "993_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "993_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "994_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "994_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "995_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "995_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "996_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "996_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "997_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "997_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "998_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "998_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "999_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "999_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "999_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1000_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1000_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1000_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1001_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1001_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1003_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1003_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1004_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1004_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1006_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1006_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1007-apex-build_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1007-apex-build_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1008-ultimate-mode_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1008-ultimate-mode_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1008-ultimate-mode_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1010_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1010_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1012-counterfeit_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1012-counterfeit_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1013-unremarkable_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1013-unremarkable_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1018_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1018_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1022_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1022_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1023_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1023_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "8901_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "8901_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "8901_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c13ec323095f727665fa953e64e98300:e7531bea9b5e1bef44def5b357c81630:3ec5c0bc286c296cfb7fa30a8b06f3da$" + } } diff --git a/public/images/pokemon_icons_9v.png b/public/images/pokemon_icons_9v.png index 5d0908d0590..f71b6c5ada5 100644 Binary files a/public/images/pokemon_icons_9v.png and b/public/images/pokemon_icons_9v.png differ diff --git a/public/images/statuses_es.json b/public/images/statuses_es-ES.json similarity index 98% rename from public/images/statuses_es.json rename to public/images/statuses_es-ES.json index 4b44aa117e4..dbb3783842a 100644 --- a/public/images/statuses_es.json +++ b/public/images/statuses_es-ES.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "statuses_es.png", + "image": "statuses_es-ES.png", "format": "RGBA8888", "size": { "w": 22, diff --git a/public/images/statuses_es-ES.png b/public/images/statuses_es-ES.png new file mode 100644 index 00000000000..dc845d6fb1f Binary files /dev/null and b/public/images/statuses_es-ES.png differ diff --git a/public/images/statuses_es.png b/public/images/statuses_es.png deleted file mode 100644 index d372b989be9..00000000000 Binary files a/public/images/statuses_es.png and /dev/null differ diff --git a/public/images/trainer/aether_grunt_f.json b/public/images/trainer/aether_grunt_f.json index c43bdae9b2e..26ae177bd21 100644 --- a/public/images/trainer/aether_grunt_f.json +++ b/public/images/trainer/aether_grunt_f.json @@ -4,8 +4,8 @@ "image": "aether_grunt_f.png", "format": "RGBA8888", "size": { - "w": 69, - "h": 69 + "w": 70, + "h": 70 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 39, + "h": 70 }, "spriteSourceSize": { - "x": 23, - "y": 10, - "w": 35, - "h": 69 + "x": 0, + "y": 0, + "w": 39, + "h": 70 }, "frame": { "x": 0, "y": 0, - "w": 35, - "h": 69 + "w": 39, + "h": 70 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0c9e77856d3b434e719021572bcb93de:f9c45dc5d67009b134dd1bbc5593f6ec:a694f8828aff21c718e5161e2fd63ade$" + "smartupdate": "$TexturePacker:SmartUpdate:0a678d2035c82d3741f2de29e01d42d3:374042fde99a4ff05c5e90cedbc5bd1f:a694f8828aff21c718e5161e2fd63ade$" } } diff --git a/public/images/trainer/aether_grunt_f.png b/public/images/trainer/aether_grunt_f.png index b43c5e71a51..a5088c9e1de 100644 Binary files a/public/images/trainer/aether_grunt_f.png and b/public/images/trainer/aether_grunt_f.png differ diff --git a/public/images/trainer/aether_grunt_m.json b/public/images/trainer/aether_grunt_m.json index eba00096f8d..74195b97dde 100644 --- a/public/images/trainer/aether_grunt_m.json +++ b/public/images/trainer/aether_grunt_m.json @@ -4,8 +4,8 @@ "image": "aether_grunt_m.png", "format": "RGBA8888", "size": { - "w": 65, - "h": 65 + "w": 69, + "h": 69 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 45, + "h": 69 }, "spriteSourceSize": { - "x": 16, - "y": 14, - "w": 47, - "h": 65 + "x": 0, + "y": 0, + "w": 45, + "h": 69 }, "frame": { "x": 0, "y": 0, - "w": 47, - "h": 65 + "w": 45, + "h": 69 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:963887cf29549ad3c123b8055cb4d701:68004c4a6e04c93bd21c26a6f8921f0c:d2241fc11d0fc31b26ecbedae6da74f4$" + "smartupdate": "$TexturePacker:SmartUpdate:f7ad29bea8c4a179c08958890cadb04b:741fc1b2e43d2da720c249c6f81910bc:d2241fc11d0fc31b26ecbedae6da74f4$" } } diff --git a/public/images/trainer/aether_grunt_m.png b/public/images/trainer/aether_grunt_m.png index f4df26ef007..1b1e092a340 100644 Binary files a/public/images/trainer/aether_grunt_m.png and b/public/images/trainer/aether_grunt_m.png differ diff --git a/public/images/trainer/aqua_grunt_f.json b/public/images/trainer/aqua_grunt_f.json index 20515f30e5e..23f118927f1 100644 --- a/public/images/trainer/aqua_grunt_f.json +++ b/public/images/trainer/aqua_grunt_f.json @@ -4,8 +4,8 @@ "image": "aqua_grunt_f.png", "format": "RGBA8888", "size": { - "w": 71, - "h": 71 + "w": 73, + "h": 73 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 34, + "h": 73 }, "spriteSourceSize": { - "x": 22, - "y": 8, - "w": 36, - "h": 71 + "x": 0, + "y": 0, + "w": 34, + "h": 73 }, "frame": { "x": 0, "y": 0, - "w": 36, - "h": 71 + "w": 34, + "h": 73 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6db25cb5753163d19bca8e2db45849ae:7d8f51509862bfdf8a78bf42dd0005cd:af0aa9494be37941522487032b556989$" + "smartupdate": "$TexturePacker:SmartUpdate:99d76e35df4b09fc9d312218d8fa8cc7:8ad846929ea03b5fb70fd16144e5e2fa:af0aa9494be37941522487032b556989$" } } diff --git a/public/images/trainer/aqua_grunt_f.png b/public/images/trainer/aqua_grunt_f.png index 132d239c0b8..4db237bf9e7 100644 Binary files a/public/images/trainer/aqua_grunt_f.png and b/public/images/trainer/aqua_grunt_f.png differ diff --git a/public/images/trainer/aqua_grunt_m.json b/public/images/trainer/aqua_grunt_m.json index 93408cc40c8..3a120f7d20c 100644 --- a/public/images/trainer/aqua_grunt_m.json +++ b/public/images/trainer/aqua_grunt_m.json @@ -4,8 +4,8 @@ "image": "aqua_grunt_m.png", "format": "RGBA8888", "size": { - "w": 73, - "h": 73 + "w": 74, + "h": 74 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 38, + "h": 74 }, "spriteSourceSize": { - "x": 17, - "y": 6, - "w": 46, - "h": 73 + "x": 0, + "y": 0, + "w": 38, + "h": 74 }, "frame": { "x": 0, "y": 0, - "w": 46, - "h": 73 + "w": 38, + "h": 74 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:efd07ff3ed1e610150a4b8ca18974343:d9b85b9eb11182e9e4669e2bd8b08694:72b7b50231708a9486d5f315824e4df1$" + "smartupdate": "$TexturePacker:SmartUpdate:ea2cdca90584089079af92307948ecdc:331e1f5314abbfcf58331ab0b9fd1c40:72b7b50231708a9486d5f315824e4df1$" } } diff --git a/public/images/trainer/aqua_grunt_m.png b/public/images/trainer/aqua_grunt_m.png index 87dbfd566a1..4fe230ca119 100644 Binary files a/public/images/trainer/aqua_grunt_m.png and b/public/images/trainer/aqua_grunt_m.png differ diff --git a/public/images/trainer/archie.json b/public/images/trainer/archie.json index 63837d40847..3718bcffd0c 100644 --- a/public/images/trainer/archie.json +++ b/public/images/trainer/archie.json @@ -4,8 +4,8 @@ "image": "archie.png", "format": "RGBA8888", "size": { - "w": 80, - "h": 80 + "w": 79, + "h": 79 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 58, + "h": 79 }, "spriteSourceSize": { - "x": 21, + "x": 0, "y": 0, - "w": 42, - "h": 80 + "w": 58, + "h": 79 }, "frame": { "x": 0, "y": 0, - "w": 42, - "h": 80 + "w": 58, + "h": 79 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bfa7fdd7b6ac9be68dc9dc562fb8339f:06f87a279450b21b19294ba956b69c26:4b7980be4e3ac1d20c9eaf970913ec63$" + "smartupdate": "$TexturePacker:SmartUpdate:1edc051db037c1742819ac8674ebe4be:bfaa715c0faf707c1b20ab8259d42a35:4b7980be4e3ac1d20c9eaf970913ec63$" } } diff --git a/public/images/trainer/archie.png b/public/images/trainer/archie.png index c83975c0690..d4c003fd348 100644 Binary files a/public/images/trainer/archie.png and b/public/images/trainer/archie.png differ diff --git a/public/images/trainer/atticus.json b/public/images/trainer/atticus.json index 95621998bf2..8b1ebdd63f2 100644 --- a/public/images/trainer/atticus.json +++ b/public/images/trainer/atticus.json @@ -4,8 +4,8 @@ "image": "atticus.png", "format": "RGBA8888", "size": { - "w": 46, - "h": 46 + "w": 55, + "h": 55 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 55, + "h": 49 }, "spriteSourceSize": { - "x": 21, - "y": 33, - "w": 43, - "h": 46 + "x": 0, + "y": 0, + "w": 55, + "h": 49 }, "frame": { "x": 0, "y": 0, - "w": 43, - "h": 46 + "w": 55, + "h": 49 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6dcd7c3d3982793cbca0d6fcd1f9260e:19c44634629fadd9d039d23dc71ec987:d26ede35f15aa571d5a7a2dd2fb868e1$" + "smartupdate": "$TexturePacker:SmartUpdate:2c1a2ecebeac4770c51422bede6add57:5c82bf231c27d62e440081f186eb1da9:d26ede35f15aa571d5a7a2dd2fb868e1$" } } diff --git a/public/images/trainer/atticus.png b/public/images/trainer/atticus.png index e3e7e870f2b..75cd70b72d8 100644 Binary files a/public/images/trainer/atticus.png and b/public/images/trainer/atticus.png differ diff --git a/public/images/trainer/courtney.json b/public/images/trainer/courtney.json index de55e91eb85..1da3e08b107 100644 --- a/public/images/trainer/courtney.json +++ b/public/images/trainer/courtney.json @@ -4,8 +4,8 @@ "image": "courtney.png", "format": "RGBA8888", "size": { - "w": 52, - "h": 80 + "w": 72, + "h": 72 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 52, - "h": 80 + "w": 44, + "h": 72 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 52, - "h": 80 + "w": 44, + "h": 72 }, "frame": { "x": 0, "y": 0, - "w": 52, - "h": 80 + "w": 44, + "h": 72 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + "smartupdate": "$TexturePacker:SmartUpdate:c39b0f300dc09114fba490e6ab68b2b5:a24a6dbdd0e3f4d4b7a567673b73316a:b0c7d3a5747d1c7edafa00c8e6d1257e$" } } diff --git a/public/images/trainer/courtney.png b/public/images/trainer/courtney.png index 0efdb615fcd..3db5151e61c 100644 Binary files a/public/images/trainer/courtney.png and b/public/images/trainer/courtney.png differ diff --git a/public/images/trainer/eri.json b/public/images/trainer/eri.json index fd4daf60437..08312d7a310 100644 --- a/public/images/trainer/eri.json +++ b/public/images/trainer/eri.json @@ -4,8 +4,8 @@ "image": "eri.png", "format": "RGBA8888", "size": { - "w": 74, - "h": 74 + "w": 78, + "h": 78 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 52, + "h": 78 }, "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 45, - "h": 74 + "x": 0, + "y": 0, + "w": 52, + "h": 78 }, "frame": { "x": 0, "y": 0, - "w": 45, - "h": 74 + "w": 52, + "h": 78 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:59594ac27e74ec85e2949d12ff680dc2:d65b6b00858ac47b26ef8393a8fa6795:d7f4cd3ff755f8074c14d3006b0c8301$" + "smartupdate": "$TexturePacker:SmartUpdate:d413fdffea2ec50087a67019a6ce4063:66a18e7a21ca3a1953778dbc09074ab6:d7f4cd3ff755f8074c14d3006b0c8301$" } } diff --git a/public/images/trainer/eri.png b/public/images/trainer/eri.png index 0c9bdf7b47b..cb38f96b030 100644 Binary files a/public/images/trainer/eri.png and b/public/images/trainer/eri.png differ diff --git a/public/images/trainer/faba.json b/public/images/trainer/faba.json index 0e9544e2529..a419c782d87 100644 --- a/public/images/trainer/faba.json +++ b/public/images/trainer/faba.json @@ -4,8 +4,8 @@ "image": "faba.png", "format": "RGBA8888", "size": { - "w": 74, - "h": 74 + "w": 76, + "h": 76 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 29, + "h": 76 }, "spriteSourceSize": { - "x": 25, - "y": 5, - "w": 31, - "h": 74 + "x": 0, + "y": 0, + "w": 29, + "h": 76 }, "frame": { "x": 0, "y": 0, - "w": 31, - "h": 74 + "w": 29, + "h": 76 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:47622708d99a504998950bd9c389a504:fe1c51be191dd9fafb5b6f309c08ae1a:8d64db18930325b8b513740c1d83ce4c$" + "smartupdate": "$TexturePacker:SmartUpdate:bbfce6e1ed69401694ce8c2537dd1fea:a2c9351e4ba08d44cafa66ecdf509866:8d64db18930325b8b513740c1d83ce4c$" } } diff --git a/public/images/trainer/faba.png b/public/images/trainer/faba.png index a7fa0fb4879..1c509da8a78 100644 Binary files a/public/images/trainer/faba.png and b/public/images/trainer/faba.png differ diff --git a/public/images/trainer/flare_grunt_f.json b/public/images/trainer/flare_grunt_f.json index e536d28a1aa..a8ebf9a8a4a 100644 --- a/public/images/trainer/flare_grunt_f.json +++ b/public/images/trainer/flare_grunt_f.json @@ -4,8 +4,8 @@ "image": "flare_grunt_f.png", "format": "RGBA8888", "size": { - "w": 80, - "h": 80 + "w": 85, + "h": 85 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 23, + "h": 85 }, "spriteSourceSize": { - "x": 31, + "x": 0, "y": 0, "w": 23, - "h": 80 + "h": 85 }, "frame": { "x": 0, "y": 0, "w": 23, - "h": 80 + "h": 85 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c30bf82452209a923f4becf13d275a9a:a6355b09f92c9c0388d0b919010f587f:0638dbf213f8a974eb5af76eb1e5ddeb$" + "smartupdate": "$TexturePacker:SmartUpdate:88d242a8c3b9859307ecdd290c30ce7d:acd04d60ab09f18e86e4e5727132dac2:0638dbf213f8a974eb5af76eb1e5ddeb$" } } diff --git a/public/images/trainer/flare_grunt_f.png b/public/images/trainer/flare_grunt_f.png index 4446675dc44..e2a4dd7fe92 100644 Binary files a/public/images/trainer/flare_grunt_f.png and b/public/images/trainer/flare_grunt_f.png differ diff --git a/public/images/trainer/flare_grunt_m.json b/public/images/trainer/flare_grunt_m.json index 4d54acbf810..226257ef84a 100644 --- a/public/images/trainer/flare_grunt_m.json +++ b/public/images/trainer/flare_grunt_m.json @@ -14,12 +14,12 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 31, + "h": 77 }, "spriteSourceSize": { - "x": 24, - "y": 2, + "x": 0, + "y": 0, "w": 31, "h": 77 }, @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a26606e70778f88a1a7053b2f2420dde:84abf0d0f6bc90c6a60f660567b2d641:adc35a4070bac9fe828c2605a3b15744$" + "smartupdate": "$TexturePacker:SmartUpdate:8683e52bbd1a42992f4d7ab8aa65a2a1:e8279cd322279bc5f8e2bb5797e6f818:adc35a4070bac9fe828c2605a3b15744$" } } diff --git a/public/images/trainer/flare_grunt_m.png b/public/images/trainer/flare_grunt_m.png index 79eb98449ca..eb14dbed0e2 100644 Binary files a/public/images/trainer/flare_grunt_m.png and b/public/images/trainer/flare_grunt_m.png differ diff --git a/public/images/trainer/giacomo.json b/public/images/trainer/giacomo.json index 5eeb2cd685b..f61d5b64901 100644 --- a/public/images/trainer/giacomo.json +++ b/public/images/trainer/giacomo.json @@ -4,8 +4,8 @@ "image": "giacomo.png", "format": "RGBA8888", "size": { - "w": 75, - "h": 75 + "w": 71, + "h": 71 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 37, + "h": 71 }, "spriteSourceSize": { - "x": 23, - "y": 4, + "x": 0, + "y": 0, "w": 37, - "h": 75 + "h": 71 }, "frame": { "x": 0, "y": 0, "w": 37, - "h": 75 + "h": 71 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8c4e7da48e5667abc6d364330268c092:0fa43e58d8a746d3b86cb2dd763719f4:8603cc19e888c8c8de62177f4011577c$" + "smartupdate": "$TexturePacker:SmartUpdate:8d4b9bca01f3729556cd02a8795c3e89:cb2840cbbd1e5a614bfa6bcb23db5b62:8603cc19e888c8c8de62177f4011577c$" } } diff --git a/public/images/trainer/giacomo.png b/public/images/trainer/giacomo.png index 275f47fad3c..352acaddf95 100644 Binary files a/public/images/trainer/giacomo.png and b/public/images/trainer/giacomo.png differ diff --git a/public/images/trainer/guzma.json b/public/images/trainer/guzma.json index c278d68be24..1b75915c088 100644 --- a/public/images/trainer/guzma.json +++ b/public/images/trainer/guzma.json @@ -4,8 +4,8 @@ "image": "guzma.png", "format": "RGBA8888", "size": { - "w": 58, - "h": 58 + "w": 64, + "h": 64 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 34, + "h": 64 }, "spriteSourceSize": { - "x": 21, - "y": 20, - "w": 37, - "h": 58 + "x": 0, + "y": 0, + "w": 34, + "h": 64 }, "frame": { "x": 0, "y": 0, - "w": 37, - "h": 58 + "w": 34, + "h": 64 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c3b08a562a2882d1ca8b5e031e245da9:72a8305e547f091d15abccd2b142e401:3b302c7f9eb6ea81b65bcaeead4a95a9$" + "smartupdate": "$TexturePacker:SmartUpdate:90cfe8ae514c30ddf48840678b251141:87a93d268c61327ad913bba3b052686b:3b302c7f9eb6ea81b65bcaeead4a95a9$" } } diff --git a/public/images/trainer/guzma.png b/public/images/trainer/guzma.png index 6afd6f3b34a..1ae6d8eb8d1 100644 Binary files a/public/images/trainer/guzma.png and b/public/images/trainer/guzma.png differ diff --git a/public/images/trainer/hala.json b/public/images/trainer/hala.json index f909ebe7684..5fcea739488 100644 --- a/public/images/trainer/hala.json +++ b/public/images/trainer/hala.json @@ -4,8 +4,8 @@ "image": "hala.png", "format": "RGBA8888", "size": { - "w": 78, - "h": 78 + "w": 82, + "h": 82 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 59, - "h": 78 + "w": 58, + "h": 82 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 59, - "h": 78 + "w": 58, + "h": 82 }, "frame": { "x": 0, "y": 0, - "w": 59, - "h": 78 + "w": 58, + "h": 82 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b6547cc9975d92a02b99fd63122d740b:0a72e0ac4fcbfe4329a7dcdad284ab36:7c2af56b9a9851f2e2eaeaf0cdca9370$" + "smartupdate": "$TexturePacker:SmartUpdate:57dc13db648785ad4694bf67c40fa21d:ee2bc7184f4f48ab8ba3c10c89bfc8f0:7c2af56b9a9851f2e2eaeaf0cdca9370$" } } diff --git a/public/images/trainer/hala.png b/public/images/trainer/hala.png index 0a72be4113b..4f26cbb8ff3 100644 Binary files a/public/images/trainer/hala.png and b/public/images/trainer/hala.png differ diff --git a/public/images/trainer/hau.json b/public/images/trainer/hau.json index 5f2ef8bcec8..351283ff0ad 100644 --- a/public/images/trainer/hau.json +++ b/public/images/trainer/hau.json @@ -4,8 +4,8 @@ "image": "hau.png", "format": "RGBA8888", "size": { - "w": 70, - "h": 70 + "w": 71, + "h": 71 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 24, + "h": 71 }, "spriteSourceSize": { - "x": 27, - "y": 9, - "w": 29, - "h": 70 + "x": 0, + "y": 0, + "w": 24, + "h": 71 }, "frame": { "x": 0, "y": 0, - "w": 29, - "h": 70 + "w": 24, + "h": 71 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:688d6d27e686efec45b144ba4544f248:676457a4e9dfbcad0510f6e7bfa73514:d4c7e8b349477c2295b49b0e99b91bb3$" + "smartupdate": "$TexturePacker:SmartUpdate:0d500afd9a36f32a23b5a316dcf397d9:aa5d3e58d6df67b90e484ec7f345a4cf:d4c7e8b349477c2295b49b0e99b91bb3$" } } diff --git a/public/images/trainer/hau.png b/public/images/trainer/hau.png index 1ce2c98f6af..7aa673a6fe9 100644 Binary files a/public/images/trainer/hau.png and b/public/images/trainer/hau.png differ diff --git a/public/images/trainer/korrina.json b/public/images/trainer/korrina.json index cc1ba59bd55..7c258fa4927 100644 --- a/public/images/trainer/korrina.json +++ b/public/images/trainer/korrina.json @@ -4,8 +4,8 @@ "image": "korrina.png", "format": "RGBA8888", "size": { - "w": 75, - "h": 75 + "w": 83, + "h": 83 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 57, + "h": 83 }, "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 56, - "h": 75 + "x": 0, + "y": 0, + "w": 57, + "h": 83 }, "frame": { "x": 0, "y": 0, - "w": 56, - "h": 75 + "w": 57, + "h": 83 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:43a6564beec2569a58110232e9752b64:0decef066ae75dc7f3bd0c811f9a92d1:ed5be09cd8b82ed6439ff8617ffa74c0$" + "smartupdate": "$TexturePacker:SmartUpdate:1dc28e18e99698fbfd8a110a1dc737f2:79d24176afd3059dc69ce785ce672bbb:ed5be09cd8b82ed6439ff8617ffa74c0$" } } diff --git a/public/images/trainer/korrina.png b/public/images/trainer/korrina.png index 6d6817faf94..8994afdddb1 100644 Binary files a/public/images/trainer/korrina.png and b/public/images/trainer/korrina.png differ diff --git a/public/images/pokemon/back/shiny/668-female.json b/public/images/trainer/kukui.json similarity index 63% rename from public/images/pokemon/back/shiny/668-female.json rename to public/images/trainer/kukui.json index 7b4adc1a94d..139a1456cc5 100644 --- a/public/images/pokemon/back/shiny/668-female.json +++ b/public/images/trainer/kukui.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "668-female.png", + "image": "kukui.png", "format": "RGBA8888", "size": { "w": 74, @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 74, - "h": 72 + "w": 37, + "h": 74 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 74, - "h": 72 + "w": 37, + "h": 74 }, "frame": { "x": 0, "y": 0, - "w": 74, - "h": 72 + "w": 37, + "h": 74 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3f814ea1f5b062df0ecc4e7c343d89b:769178f31dc2505ae0e67b72b1319828:d99ed0e84a0695b54e479aa98271aba1$" + "smartupdate": "$TexturePacker:SmartUpdate:bccd7af37a8608585716e34d0acb49af:8e1ebc6f022707fbb1e6b4f7d1dbb00c:70bdbf4bca082082ae121aa8ef03c2be$" } } diff --git a/public/images/trainer/kukui.png b/public/images/trainer/kukui.png new file mode 100644 index 00000000000..aacf1c197ee Binary files /dev/null and b/public/images/trainer/kukui.png differ diff --git a/public/images/trainer/lusamine.json b/public/images/trainer/lusamine.json index 55a711a21fb..c2e9b2f2356 100644 --- a/public/images/trainer/lusamine.json +++ b/public/images/trainer/lusamine.json @@ -4,8 +4,8 @@ "image": "lusamine.png", "format": "RGBA8888", "size": { - "w": 74, - "h": 74 + "w": 80, + "h": 80 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, + "w": 52, "h": 80 }, "spriteSourceSize": { - "x": 22, - "y": 5, - "w": 36, - "h": 74 + "x": 0, + "y": 0, + "w": 52, + "h": 80 }, "frame": { "x": 0, "y": 0, - "w": 36, - "h": 74 + "w": 52, + "h": 80 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:41da3a1299e3831be70016dc91e49313:2413ba06767fb10fdc6fde8cc736c51c:4012333084c529872232c8d052561dc1$" + "smartupdate": "$TexturePacker:SmartUpdate:52c5f9beccbfe68b9861b8fc393ba674:35d25e8bad6c7212e330a0e3d0c88315:4012333084c529872232c8d052561dc1$" } } diff --git a/public/images/trainer/lusamine.png b/public/images/trainer/lusamine.png index 8b835a2d0be..1619dc11e2d 100644 Binary files a/public/images/trainer/lusamine.png and b/public/images/trainer/lusamine.png differ diff --git a/public/images/trainer/lysandre.json b/public/images/trainer/lysandre.json index 931b1633a32..1dcb9c8c710 100644 --- a/public/images/trainer/lysandre.json +++ b/public/images/trainer/lysandre.json @@ -4,8 +4,8 @@ "image": "lysandre.png", "format": "RGBA8888", "size": { - "w": 80, - "h": 80 + "w": 82, + "h": 82 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 50, + "h": 82 }, "spriteSourceSize": { - "x": 14, + "x": 0, "y": 0, - "w": 52, - "h": 80 + "w": 50, + "h": 82 }, "frame": { "x": 0, "y": 0, - "w": 52, - "h": 80 + "w": 50, + "h": 82 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6b887c8bab74885a1b05f2b382759db6:ba102d9d25ddd794a3a17f029b971daf:e6066149f6ec4ccb9fc28faea3d64a7f$" + "smartupdate": "$TexturePacker:SmartUpdate:b09528fe2d3137bba8ce5c667d2a962f:7c522eefcc85ee87df485d34b58e814b:e6066149f6ec4ccb9fc28faea3d64a7f$" } } diff --git a/public/images/trainer/lysandre.png b/public/images/trainer/lysandre.png index b83b649d142..fe6dafb00f8 100644 Binary files a/public/images/trainer/lysandre.png and b/public/images/trainer/lysandre.png differ diff --git a/public/images/trainer/macro_grunt_f.json b/public/images/trainer/macro_grunt_f.json index 04b30ec4ca5..8a9a3943a27 100644 --- a/public/images/trainer/macro_grunt_f.json +++ b/public/images/trainer/macro_grunt_f.json @@ -14,19 +14,19 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 33, + "h": 74 }, "spriteSourceSize": { - "x": 24, - "y": 5, - "w": 31, + "x": 0, + "y": 0, + "w": 33, "h": 74 }, "frame": { "x": 0, "y": 0, - "w": 31, + "w": 33, "h": 74 } } @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a015c43d80f8fd1932758e0e2cfcec61:59fc8205ea5ca04295831b4a2eb623ec:30df2ea8e9dac9e95f70534ec43d5ecd$" + "smartupdate": "$TexturePacker:SmartUpdate:7449212fcdbfb4a600364bd3761e4fb6:37c81a387501a047cff84cabdeedb496:d1412ef32f1904a102cf70569806f3b7$" } } diff --git a/public/images/trainer/macro_grunt_f.png b/public/images/trainer/macro_grunt_f.png index 892299d701e..85586126da1 100644 Binary files a/public/images/trainer/macro_grunt_f.png and b/public/images/trainer/macro_grunt_f.png differ diff --git a/public/images/trainer/macro_grunt_m.json b/public/images/trainer/macro_grunt_m.json index 5357fdb0767..f9a8736c4d1 100644 --- a/public/images/trainer/macro_grunt_m.json +++ b/public/images/trainer/macro_grunt_m.json @@ -4,8 +4,8 @@ "image": "macro_grunt_m.png", "format": "RGBA8888", "size": { - "w": 75, - "h": 75 + "w": 76, + "h": 76 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 35, + "h": 76 }, "spriteSourceSize": { - "x": 15, - "y": 4, - "w": 48, - "h": 75 + "x": 0, + "y": 0, + "w": 35, + "h": 76 }, "frame": { "x": 0, "y": 0, - "w": 48, - "h": 75 + "w": 35, + "h": 76 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:52fccff2a0675b4e10139ddb7067d4cf:10d254175d2d8a9111cce096ffb55fa3:d57016467aa07cafdfaf13e0ff643c1b$" + "smartupdate": "$TexturePacker:SmartUpdate:5800bf6888eb6dd61ea39e1c9a1f93e3:25a930b7c50e2d7832bd3c30402d7544:1f76f2e682f472208a45e187250a6a3d$" } } diff --git a/public/images/trainer/macro_grunt_m.png b/public/images/trainer/macro_grunt_m.png index aa6b3607a87..464c735c75d 100644 Binary files a/public/images/trainer/macro_grunt_m.png and b/public/images/trainer/macro_grunt_m.png differ diff --git a/public/images/trainer/magma_grunt_f.json b/public/images/trainer/magma_grunt_f.json index 05c0512bbf0..d7a3d214317 100644 --- a/public/images/trainer/magma_grunt_f.json +++ b/public/images/trainer/magma_grunt_f.json @@ -4,30 +4,30 @@ "image": "magma_grunt_f.png", "format": "RGBA8888", "size": { - "w": 80, - "h": 80 + "w": 72, + "h": 72 }, "scale": 1, "frames": [ { "filename": "0001.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 43, + "h": 72 }, "spriteSourceSize": { - "x": 10, + "x": 0, "y": 0, - "w": 60, - "h": 80 + "w": 43, + "h": 72 }, "frame": { - "x": 10, + "x": 0, "y": 0, - "w": 60, - "h": 80 + "w": 43, + "h": 72 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f63ad48affc076f60fae78992c96a2bf:80928b32710abcb28c07c6fc5a425d99:3b961d8852b62aaf24ceb2030c036515$" + "smartupdate": "$TexturePacker:SmartUpdate:219462e400564a65012cda9dbc31ab22:4e0070239d24311df52a263271698c59:3b961d8852b62aaf24ceb2030c036515$" } } diff --git a/public/images/trainer/magma_grunt_f.png b/public/images/trainer/magma_grunt_f.png index 215ad83eea1..5ea582ad067 100644 Binary files a/public/images/trainer/magma_grunt_f.png and b/public/images/trainer/magma_grunt_f.png differ diff --git a/public/images/trainer/magma_grunt_m.json b/public/images/trainer/magma_grunt_m.json index ac8cd838c5a..57ac7c40da9 100644 --- a/public/images/trainer/magma_grunt_m.json +++ b/public/images/trainer/magma_grunt_m.json @@ -4,30 +4,30 @@ "image": "magma_grunt_m.png", "format": "RGBA8888", "size": { - "w": 80, - "h": 80 + "w": 72, + "h": 72 }, "scale": 1, "frames": [ { "filename": "0001.png", "rotated": false, - "trimmed": true, + "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 44, + "h": 72 }, "spriteSourceSize": { - "x": 10, + "x": 0, "y": 0, - "w": 60, - "h": 80 + "w": 44, + "h": 72 }, "frame": { - "x": 10, + "x": 0, "y": 0, - "w": 60, - "h": 80 + "w": 44, + "h": 72 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:96aa833d987a01bcdcb6f0e7809f5daf:791cce8d026f92b2e52f0b66df8b8e11:35532fd5d9aea30957d50d06f2d2f9a6$" + "smartupdate": "$TexturePacker:SmartUpdate:46f6e6e1aef8e2e7640c67116e548c5d:34cb6b7f64b0d3c294fcdde45097575d:35532fd5d9aea30957d50d06f2d2f9a6$" } } diff --git a/public/images/trainer/magma_grunt_m.png b/public/images/trainer/magma_grunt_m.png index a37b9acbb52..b2432a79d28 100644 Binary files a/public/images/trainer/magma_grunt_m.png and b/public/images/trainer/magma_grunt_m.png differ diff --git a/public/images/trainer/mela.json b/public/images/trainer/mela.json index c9db18acc5a..1d242d50074 100644 --- a/public/images/trainer/mela.json +++ b/public/images/trainer/mela.json @@ -4,8 +4,8 @@ "image": "mela.png", "format": "RGBA8888", "size": { - "w": 78, - "h": 78 + "w": 75, + "h": 75 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 41, + "h": 75 }, "spriteSourceSize": { - "x": 18, - "y": 1, - "w": 46, - "h": 78 + "x": 0, + "y": 0, + "w": 41, + "h": 75 }, "frame": { "x": 0, "y": 0, - "w": 46, - "h": 78 + "w": 41, + "h": 75 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e26d8c926c54c848cef673b3f59f35e7:ff040c2cebb1a92d2ef61dc91c018390:68668cf06383ff459cccaafb6bf56215$" + "smartupdate": "$TexturePacker:SmartUpdate:96e97b165e8ca706b7838616d32ab81f:89c577db41f4b610520823e876066e35:68668cf06383ff459cccaafb6bf56215$" } } diff --git a/public/images/trainer/mela.png b/public/images/trainer/mela.png index fbb08ed69cf..a98547d6380 100644 Binary files a/public/images/trainer/mela.png and b/public/images/trainer/mela.png differ diff --git a/public/images/trainer/molayne.json b/public/images/trainer/molayne.json index ae80a12f012..8a0b1b3534e 100644 --- a/public/images/trainer/molayne.json +++ b/public/images/trainer/molayne.json @@ -4,8 +4,8 @@ "image": "molayne.png", "format": "RGBA8888", "size": { - "w": 79, - "h": 79 + "w": 78, + "h": 78 }, "scale": 1, "frames": [ @@ -15,19 +15,19 @@ "trimmed": false, "sourceSize": { "w": 31, - "h": 79 + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, "w": 31, - "h": 79 + "h": 78 }, "frame": { "x": 0, "y": 0, "w": 31, - "h": 79 + "h": 78 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:056720ae56077b81375b258850332053:774e1c8463f26fac3be55ed88c8b48b9:11092260a376b1a46e696927361b6498$" + "smartupdate": "$TexturePacker:SmartUpdate:190386db101d4bd1ef5ed1f4f7b5bb1c:c8bc1b069ceb2707738b9178fb6aea0f:11092260a376b1a46e696927361b6498$" } } diff --git a/public/images/trainer/molayne.png b/public/images/trainer/molayne.png index 75f9569370e..c400e5be33d 100644 Binary files a/public/images/trainer/molayne.png and b/public/images/trainer/molayne.png differ diff --git a/public/images/pokemon/668-female.json b/public/images/trainer/mustard.json similarity index 59% rename from public/images/pokemon/668-female.json rename to public/images/trainer/mustard.json index 13d67c90194..5c3a73f0a0b 100644 --- a/public/images/pokemon/668-female.json +++ b/public/images/trainer/mustard.json @@ -1,11 +1,11 @@ { "textures": [ { - "image": "668-female.png", + "image": "mustard.png", "format": "RGBA8888", "size": { - "w": 72, - "h": 72 + "w": 71, + "h": 71 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 63, - "h": 72 + "w": 57, + "h": 71 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 63, - "h": 72 + "w": 57, + "h": 71 }, "frame": { "x": 0, "y": 0, - "w": 63, - "h": 72 + "w": 57, + "h": 71 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3f88e039152d4a967a218cb721938610:e6991ce9c3bad348cbc05ebf9b440302:d99ed0e84a0695b54e479aa98271aba1$" + "smartupdate": "$TexturePacker:SmartUpdate:8e2d109ee2cb1b2a6dda840c5bba1d4e:8116b1de2fd7bc0ca08e2d3e618b3dae:ac5d03e7cabff8ff660969c2bc2f3b36$" } } diff --git a/public/images/trainer/mustard.png b/public/images/trainer/mustard.png new file mode 100644 index 00000000000..0acba02db45 Binary files /dev/null and b/public/images/trainer/mustard.png differ diff --git a/public/images/trainer/oleana.json b/public/images/trainer/oleana.json index 7219b640c38..d9344226819 100644 --- a/public/images/trainer/oleana.json +++ b/public/images/trainer/oleana.json @@ -4,8 +4,8 @@ "image": "oleana.png", "format": "RGBA8888", "size": { - "w": 79, - "h": 79 + "w": 78, + "h": 78 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 56, + "h": 78 }, "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 53, - "h": 79 + "x": 0, + "y": 0, + "w": 56, + "h": 78 }, "frame": { "x": 0, "y": 0, - "w": 53, - "h": 79 + "w": 56, + "h": 78 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:30987a671771127a38491a588c465964:38b28effcfd5c6cbc0f358912a775af3:82e2a1f8afed29be57f6c2473f4c5be2$" + "smartupdate": "$TexturePacker:SmartUpdate:3f088913cab1db14067e247bd92e82ce:b32e1ef6ef289564b39fd326346002c6:82e2a1f8afed29be57f6c2473f4c5be2$" } } diff --git a/public/images/trainer/oleana.png b/public/images/trainer/oleana.png index 3252c67ab8e..e74fb6ab2eb 100644 Binary files a/public/images/trainer/oleana.png and b/public/images/trainer/oleana.png differ diff --git a/public/images/trainer/ortega.json b/public/images/trainer/ortega.json index 53bab5dba40..082817344e0 100644 --- a/public/images/trainer/ortega.json +++ b/public/images/trainer/ortega.json @@ -4,8 +4,8 @@ "image": "ortega.png", "format": "RGBA8888", "size": { - "w": 69, - "h": 69 + "w": 70, + "h": 70 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 47, + "h": 70 }, "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 53, - "h": 69 + "x": 0, + "y": 0, + "w": 47, + "h": 70 }, "frame": { "x": 0, "y": 0, - "w": 53, - "h": 69 + "w": 47, + "h": 70 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c6ff92d90ed884222095de81d1db9166:a91cf3c83a063f549c52afb42f7ba3b0:c3f9fcec121c8bc93f2b230b20b79c57$" + "smartupdate": "$TexturePacker:SmartUpdate:f69a1067315885ed736a07362122f371:717e3f134eb10424f0f0fa724500ba63:c3f9fcec121c8bc93f2b230b20b79c57$" } } diff --git a/public/images/trainer/ortega.png b/public/images/trainer/ortega.png index 7f694c6ded6..cede7b6c311 100644 Binary files a/public/images/trainer/ortega.png and b/public/images/trainer/ortega.png differ diff --git a/public/images/trainer/penny.json b/public/images/trainer/penny.json index da64efffa3b..bb74e43da89 100644 --- a/public/images/trainer/penny.json +++ b/public/images/trainer/penny.json @@ -4,8 +4,8 @@ "image": "penny.png", "format": "RGBA8888", "size": { - "w": 75, - "h": 75 + "w": 67, + "h": 67 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 30, + "h": 67 }, "spriteSourceSize": { - "x": 24, - "y": 4, - "w": 34, - "h": 75 + "x": 0, + "y": 0, + "w": 30, + "h": 67 }, "frame": { "x": 0, "y": 0, - "w": 34, - "h": 75 + "w": 30, + "h": 67 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:54f184bf1995a94a78aff33c9a851e6b:a6c9b3fe428b0cd0344b5cf14b999f36:cf221da9747cb8cb356053d3042d8d22$" + "smartupdate": "$TexturePacker:SmartUpdate:cb4d76912d528afe986ac5cad775f455:cc70d9738c9c7347b2ac9afec4ec9290:cf221da9747cb8cb356053d3042d8d22$" } } diff --git a/public/images/trainer/penny.png b/public/images/trainer/penny.png index 0e36760e21b..67c90a41462 100644 Binary files a/public/images/trainer/penny.png and b/public/images/trainer/penny.png differ diff --git a/public/images/trainer/plasma_grunt_f.json b/public/images/trainer/plasma_grunt_f.json index 4d23eeeb483..4a73a55e24b 100644 --- a/public/images/trainer/plasma_grunt_f.json +++ b/public/images/trainer/plasma_grunt_f.json @@ -4,30 +4,408 @@ "image": "plasma_grunt_f.png", "format": "RGBA8888", "size": { - "w": 75, - "h": 75 + "w": 186, + "h": 186 }, "scale": 1, "frames": [ { - "filename": "0001.png", + "filename": "0002.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { "w": 80, "h": 80 }, "spriteSourceSize": { - "x": 21, - "y": 4, - "w": 37, - "h": 75 + "x": 16, + "y": 31, + "w": 49, + "h": 49 }, "frame": { "x": 0, "y": 0, - "w": 37, - "h": 75 + "w": 49, + "h": 49 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 31, + "w": 49, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 49 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 27, + "w": 46, + "h": 53 + }, + "frame": { + "x": 49, + "y": 0, + "w": 46, + "h": 53 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 27, + "w": 45, + "h": 53 + }, + "frame": { + "x": 0, + "y": 49, + "w": 45, + "h": 53 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 27, + "w": 45, + "h": 53 + }, + "frame": { + "x": 0, + "y": 49, + "w": 45, + "h": 53 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 27, + "w": 45, + "h": 53 + }, + "frame": { + "x": 0, + "y": 49, + "w": 45, + "h": 53 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 27, + "w": 45, + "h": 53 + }, + "frame": { + "x": 0, + "y": 49, + "w": 45, + "h": 53 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 33, + "w": 50, + "h": 47 + }, + "frame": { + "x": 45, + "y": 53, + "w": 50, + "h": 47 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 33, + "w": 50, + "h": 47 + }, + "frame": { + "x": 45, + "y": 53, + "w": 50, + "h": 47 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 36, + "w": 50, + "h": 44 + }, + "frame": { + "x": 45, + "y": 100, + "w": 50, + "h": 44 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 36, + "w": 50, + "h": 44 + }, + "frame": { + "x": 45, + "y": 100, + "w": 50, + "h": 44 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 27, + "w": 45, + "h": 53 + }, + "frame": { + "x": 0, + "y": 102, + "w": 45, + "h": 53 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 38, + "w": 50, + "h": 42 + }, + "frame": { + "x": 45, + "y": 144, + "w": 50, + "h": 42 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 38, + "w": 50, + "h": 42 + }, + "frame": { + "x": 45, + "y": 144, + "w": 50, + "h": 42 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 27, + "w": 43, + "h": 53 + }, + "frame": { + "x": 95, + "y": 0, + "w": 43, + "h": 53 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 27, + "w": 43, + "h": 53 + }, + "frame": { + "x": 95, + "y": 53, + "w": 43, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 31, + "w": 49, + "h": 49 + }, + "frame": { + "x": 95, + "y": 106, + "w": 49, + "h": 49 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 31, + "w": 49, + "h": 49 + }, + "frame": { + "x": 95, + "y": 106, + "w": 49, + "h": 49 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 16, + "y": 29, + "w": 46, + "h": 51 + }, + "frame": { + "x": 138, + "y": 0, + "w": 46, + "h": 51 } } ] @@ -36,6 +414,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c3001e18f1878c01a4825697200e823e:2003e0d4db249f7020c3471872198ac8:b01645b9e941158814978f2126e7e995$" + "smartupdate": "$TexturePacker:SmartUpdate:e8e867ad78b993918fba435e10511740:758a95ecd97e2607ff6ab81f85e665e6:b01645b9e941158814978f2126e7e995$" } } diff --git a/public/images/trainer/plasma_grunt_f.png b/public/images/trainer/plasma_grunt_f.png index 95b065f4360..7fa804cc39d 100644 Binary files a/public/images/trainer/plasma_grunt_f.png and b/public/images/trainer/plasma_grunt_f.png differ diff --git a/public/images/trainer/plasma_grunt_m.json b/public/images/trainer/plasma_grunt_m.json index 7c34b16790f..8fda1bd947b 100644 --- a/public/images/trainer/plasma_grunt_m.json +++ b/public/images/trainer/plasma_grunt_m.json @@ -4,30 +4,555 @@ "image": "plasma_grunt_m.png", "format": "RGBA8888", "size": { - "w": 72, - "h": 72 + "w": 262, + "h": 262 }, "scale": 1, "frames": [ { - "filename": "0001.png", + "filename": "0021.png", "rotated": false, - "trimmed": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 54, + "h": 69 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 69 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 54, + "h": 69 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 69 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, "sourceSize": { "w": 80, "h": 80 }, "spriteSourceSize": { "x": 16, - "y": 7, - "w": 47, - "h": 72 + "y": 11, + "w": 51, + "h": 69 }, "frame": { "x": 0, + "y": 69, + "w": 51, + "h": 69 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 11, + "w": 50, + "h": 69 + }, + "frame": { + "x": 0, + "y": 138, + "w": 50, + "h": 69 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 11, + "w": 50, + "h": 69 + }, + "frame": { + "x": 0, + "y": 138, + "w": 50, + "h": 69 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 11, + "w": 50, + "h": 69 + }, + "frame": { + "x": 0, + "y": 138, + "w": 50, + "h": 69 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 11, + "w": 50, + "h": 69 + }, + "frame": { + "x": 0, + "y": 138, + "w": 50, + "h": 69 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 11, + "w": 50, + "h": 69 + }, + "frame": { + "x": 50, + "y": 138, + "w": 50, + "h": 69 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 11, + "w": 50, + "h": 69 + }, + "frame": { + "x": 50, + "y": 138, + "w": 50, + "h": 69 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 11, + "w": 50, + "h": 69 + }, + "frame": { + "x": 51, + "y": 69, + "w": 50, + "h": 69 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 11, + "w": 50, + "h": 69 + }, + "frame": { + "x": 54, "y": 0, - "w": 47, - "h": 72 + "w": 50, + "h": 69 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 17, + "y": 11, + "w": 50, + "h": 69 + }, + "frame": { + "x": 54, + "y": 0, + "w": 50, + "h": 69 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 18, + "y": 11, + "w": 49, + "h": 69 + }, + "frame": { + "x": 100, + "y": 138, + "w": 49, + "h": 69 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 18, + "y": 11, + "w": 49, + "h": 69 + }, + "frame": { + "x": 100, + "y": 138, + "w": 49, + "h": 69 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 13, + "w": 52, + "h": 67 + }, + "frame": { + "x": 101, + "y": 69, + "w": 52, + "h": 67 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 13, + "w": 52, + "h": 67 + }, + "frame": { + "x": 101, + "y": 69, + "w": 52, + "h": 67 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 13, + "w": 52, + "h": 67 + }, + "frame": { + "x": 104, + "y": 0, + "w": 52, + "h": 67 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 53, + "h": 65 + }, + "frame": { + "x": 156, + "y": 0, + "w": 53, + "h": 65 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 53, + "h": 65 + }, + "frame": { + "x": 156, + "y": 0, + "w": 53, + "h": 65 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 53, + "h": 65 + }, + "frame": { + "x": 209, + "y": 0, + "w": 53, + "h": 65 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 53, + "h": 65 + }, + "frame": { + "x": 156, + "y": 65, + "w": 53, + "h": 65 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 53, + "h": 65 + }, + "frame": { + "x": 209, + "y": 65, + "w": 53, + "h": 65 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 53, + "h": 65 + }, + "frame": { + "x": 153, + "y": 130, + "w": 53, + "h": 65 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 53, + "h": 65 + }, + "frame": { + "x": 149, + "y": 195, + "w": 53, + "h": 65 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 53, + "h": 65 + }, + "frame": { + "x": 202, + "y": 195, + "w": 53, + "h": 65 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 15, + "w": 53, + "h": 65 + }, + "frame": { + "x": 206, + "y": 130, + "w": 53, + "h": 65 } } ] @@ -36,6 +561,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:61f195ebbcde93ab7442408edad7fe7a:28ae203b3cb42a94c4ba4420fdebdccc:9ae0ee174d431d48052a2f6b74e9d40c$" + "smartupdate": "$TexturePacker:SmartUpdate:8e214218a81b826b2cecce3e41f6eee8:2b88638dcf4559e6aad7c14cd730b7c3:9ae0ee174d431d48052a2f6b74e9d40c$" } } diff --git a/public/images/trainer/plasma_grunt_m.png b/public/images/trainer/plasma_grunt_m.png index e3ec6dd8c35..801e91b1d6d 100644 Binary files a/public/images/trainer/plasma_grunt_m.png and b/public/images/trainer/plasma_grunt_m.png differ diff --git a/public/images/trainer/plumeria.json b/public/images/trainer/plumeria.json index 936a8766750..4175fe5d716 100644 --- a/public/images/trainer/plumeria.json +++ b/public/images/trainer/plumeria.json @@ -4,8 +4,8 @@ "image": "plumeria.png", "format": "RGBA8888", "size": { - "w": 72, - "h": 72 + "w": 76, + "h": 76 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 40, + "h": 76 }, "spriteSourceSize": { - "x": 23, - "y": 7, - "w": 36, - "h": 72 + "x": 0, + "y": 0, + "w": 40, + "h": 76 }, "frame": { "x": 0, "y": 0, - "w": 36, - "h": 72 + "w": 40, + "h": 76 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5527e7b646932d429928b53f055e9d27:c0640510780d2974f9b74a7f8e6b29aa:7bfec029bae78c9d483f59c35b73afad$" + "smartupdate": "$TexturePacker:SmartUpdate:d0e080a4dcc30b39616c49dfd96c98f7:47c6a714be68fabdf11801166e154db6:7bfec029bae78c9d483f59c35b73afad$" } } diff --git a/public/images/trainer/plumeria.png b/public/images/trainer/plumeria.png index b7382f6afde..4528c3e2053 100644 Binary files a/public/images/trainer/plumeria.png and b/public/images/trainer/plumeria.png differ diff --git a/public/images/trainer/rose.json b/public/images/trainer/rose.json index 86869257b63..883aa128e50 100644 --- a/public/images/trainer/rose.json +++ b/public/images/trainer/rose.json @@ -4,8 +4,8 @@ "image": "rose.png", "format": "RGBA8888", "size": { - "w": 79, - "h": 79 + "w": 77, + "h": 77 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 31, + "h": 77 }, "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 52, - "h": 79 + "x": 0, + "y": 0, + "w": 31, + "h": 77 }, "frame": { "x": 0, "y": 0, - "w": 52, - "h": 79 + "w": 31, + "h": 77 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2b4ccaff7255c7d72661eac13de83ff8:72ee3660cdf470bd67375d355307e19d:8d35b104fc841baa4443581e6cea979e$" + "smartupdate": "$TexturePacker:SmartUpdate:be2215e7232e2260242613e54c91c3c4:852fb3fda379db104106f8888649d9d5:8d35b104fc841baa4443581e6cea979e$" } } diff --git a/public/images/trainer/rose.png b/public/images/trainer/rose.png index f90da7568d4..4c448e3302b 100644 Binary files a/public/images/trainer/rose.png and b/public/images/trainer/rose.png differ diff --git a/public/images/trainer/shelly.json b/public/images/trainer/shelly.json index 7761779864a..bac17e2885e 100644 --- a/public/images/trainer/shelly.json +++ b/public/images/trainer/shelly.json @@ -4,8 +4,8 @@ "image": "shelly.png", "format": "RGBA8888", "size": { - "w": 80, - "h": 80 + "w": 78, + "h": 78 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 45, + "h": 78 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 80, - "h": 80 + "w": 45, + "h": 78 }, "frame": { "x": 0, "y": 0, - "w": 80, - "h": 80 + "w": 45, + "h": 78 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:831f5748dad92911b10a1cb358ee2dae:a3bf81bbaa3b49cad5e0e549cf94563b:bb6befc9383c9c08837183ae2a7a80c1$" + "smartupdate": "$TexturePacker:SmartUpdate:601dbcee82b14bde5072df26ddd7d684:a0d576e65d8e3ff549dde75f0a82bc94:a277ff67eb669e1dac57ad29940004ac$" } } diff --git a/public/images/trainer/shelly.png b/public/images/trainer/shelly.png index 505dce1b110..95e6a07310d 100644 Binary files a/public/images/trainer/shelly.png and b/public/images/trainer/shelly.png differ diff --git a/public/images/trainer/skull_grunt_f.json b/public/images/trainer/skull_grunt_f.json index 182f9300ad5..b8c42ffafdd 100644 --- a/public/images/trainer/skull_grunt_f.json +++ b/public/images/trainer/skull_grunt_f.json @@ -4,8 +4,8 @@ "image": "skull_grunt_f.png", "format": "RGBA8888", "size": { - "w": 74, - "h": 74 + "w": 69, + "h": 69 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 31, - "h": 74 + "w": 44, + "h": 69 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 31, - "h": 74 + "w": 44, + "h": 69 }, "frame": { "x": 0, "y": 0, - "w": 31, - "h": 74 + "w": 44, + "h": 69 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:71a1f5b1981674c6e81163ac8ea576c3:a5e612d58e5f0a1489e111212baea09d:dd369353af16e4c5eb6547e129dfac18$" + "smartupdate": "$TexturePacker:SmartUpdate:b9685517b9674887653c84a03f3781c0:894dcd88bf117d48750df82b7bfac644:9035f560a0ab0d45bcc084aba7172990$" } } diff --git a/public/images/trainer/skull_grunt_f.png b/public/images/trainer/skull_grunt_f.png index fe7834ba4a8..c26e8d7f882 100644 Binary files a/public/images/trainer/skull_grunt_f.png and b/public/images/trainer/skull_grunt_f.png differ diff --git a/public/images/trainer/skull_grunt_m.json b/public/images/trainer/skull_grunt_m.json index 7c728e9d3fc..6a2d13ed8a3 100644 --- a/public/images/trainer/skull_grunt_m.json +++ b/public/images/trainer/skull_grunt_m.json @@ -4,8 +4,8 @@ "image": "skull_grunt_m.png", "format": "RGBA8888", "size": { - "w": 72, - "h": 72 + "w": 64, + "h": 64 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 51, - "h": 72 + "w": 39, + "h": 64 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 51, - "h": 72 + "w": 39, + "h": 64 }, "frame": { "x": 0, "y": 0, - "w": 51, - "h": 72 + "w": 39, + "h": 64 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4deb2a68e4d168bb1a40cb5d190a7d1f:be3d7b29f4b544ba51cf907691fef51d:df57ca2c9bf5f80d930306e15a851d4d$" + "smartupdate": "$TexturePacker:SmartUpdate:c39ac1d47c8cbe300cffe98bda48c590:b400e0c6286f0e20dfbc383f7453e35b:1ff10b395daf6ebfa377680a6404f816$" } } diff --git a/public/images/trainer/skull_grunt_m.png b/public/images/trainer/skull_grunt_m.png index f2b8acba984..8babb09ec74 100644 Binary files a/public/images/trainer/skull_grunt_m.png and b/public/images/trainer/skull_grunt_m.png differ diff --git a/public/images/trainer/star_grunt_f.json b/public/images/trainer/star_grunt_f.json index e26477e3512..a6b613f44cf 100644 --- a/public/images/trainer/star_grunt_f.json +++ b/public/images/trainer/star_grunt_f.json @@ -14,12 +14,12 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 30, + "h": 68 }, "spriteSourceSize": { - "x": 24, - "y": 11, + "x": 0, + "y": 0, "w": 30, "h": 68 }, @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b542a1bdd6995584fc776f75d578b434:f03fddece4494ab59698002fe6671972:c6f0e54e24ec5ffaa711700431b1955e$" + "smartupdate": "$TexturePacker:SmartUpdate:a5493363086a57d0f145cf61c42475de:2e4d3b330bb89e05e93f34d605eee203:c6f0e54e24ec5ffaa711700431b1955e$" } } diff --git a/public/images/trainer/star_grunt_f.png b/public/images/trainer/star_grunt_f.png index 6eb63ae1e03..ee0c25147cc 100644 Binary files a/public/images/trainer/star_grunt_f.png and b/public/images/trainer/star_grunt_f.png differ diff --git a/public/images/trainer/star_grunt_m.json b/public/images/trainer/star_grunt_m.json index bf49e3027e6..ba245e2eeb3 100644 --- a/public/images/trainer/star_grunt_m.json +++ b/public/images/trainer/star_grunt_m.json @@ -4,8 +4,8 @@ "image": "star_grunt_m.png", "format": "RGBA8888", "size": { - "w": 70, - "h": 70 + "w": 64, + "h": 64 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 80, - "h": 80 + "w": 36, + "h": 64 }, "spriteSourceSize": { - "x": 24, - "y": 9, - "w": 31, - "h": 70 + "x": 0, + "y": 0, + "w": 36, + "h": 64 }, "frame": { "x": 0, "y": 0, - "w": 31, - "h": 70 + "w": 36, + "h": 64 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:abc4b0424c37fd55a2bf2e9f5142adce:41a140aa68a1eda61d9a00cab4e07721:a0796711f9e0333796b6629cd43ff8e8$" + "smartupdate": "$TexturePacker:SmartUpdate:11da63c3829d44356a3c26d094212d64:45ebf021548ac0e12b6f25093c5bf0db:a0796711f9e0333796b6629cd43ff8e8$" } } diff --git a/public/images/trainer/star_grunt_m.png b/public/images/trainer/star_grunt_m.png index a69359eda8e..13fd4e88510 100644 Binary files a/public/images/trainer/star_grunt_m.png and b/public/images/trainer/star_grunt_m.png differ diff --git a/public/images/types_de.png b/public/images/types_de.png old mode 100644 new mode 100755 index 62ad3a332bc..a033554029c Binary files a/public/images/types_de.png and b/public/images/types_de.png differ diff --git a/public/images/types_es.json b/public/images/types_es-ES.json similarity index 99% rename from public/images/types_es.json rename to public/images/types_es-ES.json index 0fb922e8939..198899c0f12 100644 --- a/public/images/types_es.json +++ b/public/images/types_es-ES.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_es.png", + "image": "types_es-ES.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_es.png b/public/images/types_es-ES.png similarity index 100% rename from public/images/types_es.png rename to public/images/types_es-ES.png diff --git a/public/images/ui/button_tera.json b/public/images/ui/button_tera.json new file mode 100644 index 00000000000..7b64db66ae6 --- /dev/null +++ b/public/images/ui/button_tera.json @@ -0,0 +1,158 @@ +{ "frames": { + "unknown": { + "frame": { "x": 0, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "bug": { + "frame": { "x": 18, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "dark": { + "frame": { "x": 36, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "dragon": { + "frame": { "x": 54, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "electric": { + "frame": { "x": 72, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fairy": { + "frame": { "x": 0, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fighting": { + "frame": { "x": 18, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fire": { + "frame": { "x": 36, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "flying": { + "frame": { "x": 54, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ghost": { + "frame": { "x": 72, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "grass": { + "frame": { "x": 0, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ground": { + "frame": { "x": 18, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ice": { + "frame": { "x": 36, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "normal": { + "frame": { "x": 54, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "poison": { + "frame": { "x": 72, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "psychic": { + "frame": { "x": 0, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "rock": { + "frame": { "x": 18, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "steel": { + "frame": { "x": 36, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "water": { + "frame": { "x": 54, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "stellar": { + "frame": { "x": 72, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "button_tera.png", + "format": "RGBA8888", + "size": { "w": 90, "h": 84 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Sprite Sheet", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } +} diff --git a/public/images/ui/button_tera.png b/public/images/ui/button_tera.png new file mode 100644 index 00000000000..c9672bafa39 Binary files /dev/null and b/public/images/ui/button_tera.png differ diff --git a/public/images/ui/cursor_tera.png b/public/images/ui/cursor_tera.png new file mode 100644 index 00000000000..34cbe095895 Binary files /dev/null and b/public/images/ui/cursor_tera.png differ diff --git a/public/images/ui/legacy/button_tera.json b/public/images/ui/legacy/button_tera.json new file mode 100644 index 00000000000..7b64db66ae6 --- /dev/null +++ b/public/images/ui/legacy/button_tera.json @@ -0,0 +1,158 @@ +{ "frames": { + "unknown": { + "frame": { "x": 0, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "bug": { + "frame": { "x": 18, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "dark": { + "frame": { "x": 36, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "dragon": { + "frame": { "x": 54, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "electric": { + "frame": { "x": 72, "y": 0, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fairy": { + "frame": { "x": 0, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fighting": { + "frame": { "x": 18, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "fire": { + "frame": { "x": 36, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "flying": { + "frame": { "x": 54, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ghost": { + "frame": { "x": 72, "y": 21, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "grass": { + "frame": { "x": 0, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ground": { + "frame": { "x": 18, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "ice": { + "frame": { "x": 36, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "normal": { + "frame": { "x": 54, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "poison": { + "frame": { "x": 72, "y": 42, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "psychic": { + "frame": { "x": 0, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "rock": { + "frame": { "x": 18, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "steel": { + "frame": { "x": 36, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "water": { + "frame": { "x": 54, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + }, + "stellar": { + "frame": { "x": 72, "y": 63, "w": 18, "h": 21 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 18, "h": 21 }, + "sourceSize": { "w": 20, "h": 23 } + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "button_tera.png", + "format": "RGBA8888", + "size": { "w": 90, "h": 84 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Sprite Sheet", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } +} diff --git a/public/images/ui/legacy/button_tera.png b/public/images/ui/legacy/button_tera.png new file mode 100644 index 00000000000..c9672bafa39 Binary files /dev/null and b/public/images/ui/legacy/button_tera.png differ diff --git a/public/images/ui/legacy/cursor_tera.png b/public/images/ui/legacy/cursor_tera.png new file mode 100644 index 00000000000..f2e77046137 Binary files /dev/null and b/public/images/ui/legacy/cursor_tera.png differ diff --git a/public/images/ui/legacy/mystery_egg.png b/public/images/ui/legacy/mystery_egg.png new file mode 100644 index 00000000000..bb117a137b0 Binary files /dev/null and b/public/images/ui/legacy/mystery_egg.png differ diff --git a/public/images/ui/legacy/normal_memory.png b/public/images/ui/legacy/normal_memory.png new file mode 100644 index 00000000000..ddc22d1d4ab Binary files /dev/null and b/public/images/ui/legacy/normal_memory.png differ diff --git a/public/images/ui/legacy/pokedex_summary_bg.png b/public/images/ui/legacy/pokedex_summary_bg.png new file mode 100644 index 00000000000..690df1547c0 Binary files /dev/null and b/public/images/ui/legacy/pokedex_summary_bg.png differ diff --git a/public/images/ui/legacy/summary_bg.png b/public/images/ui/legacy/summary_bg.png index e4da2dd5da2..c482b5a1bf1 100644 Binary files a/public/images/ui/legacy/summary_bg.png and b/public/images/ui/legacy/summary_bg.png differ diff --git a/public/images/ui/legacy/summary_profile.png b/public/images/ui/legacy/summary_profile.png index 1d184023ca8..77d59dac177 100644 Binary files a/public/images/ui/legacy/summary_profile.png and b/public/images/ui/legacy/summary_profile.png differ diff --git a/public/images/ui/mystery_egg.png b/public/images/ui/mystery_egg.png new file mode 100644 index 00000000000..bb117a137b0 Binary files /dev/null and b/public/images/ui/mystery_egg.png differ diff --git a/public/images/ui/normal_memory.png b/public/images/ui/normal_memory.png new file mode 100644 index 00000000000..ddc22d1d4ab Binary files /dev/null and b/public/images/ui/normal_memory.png differ diff --git a/public/images/ui/pokedex_summary_bg.png b/public/images/ui/pokedex_summary_bg.png new file mode 100644 index 00000000000..92e70bbee27 Binary files /dev/null and b/public/images/ui/pokedex_summary_bg.png differ diff --git a/public/images/ui/summary_bg.png b/public/images/ui/summary_bg.png index b77cdadd2ac..a86a94dd56e 100644 Binary files a/public/images/ui/summary_bg.png and b/public/images/ui/summary_bg.png differ diff --git a/public/images/ui/summary_profile.png b/public/images/ui/summary_profile.png index 38bb5e84dfd..55cc70dc4d0 100644 Binary files a/public/images/ui/summary_profile.png and b/public/images/ui/summary_profile.png differ diff --git a/public/locales b/public/locales index 71390cba88f..6b3f37cb351 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 71390cba88f4103d0d2273d59a6dd8340a4fa54f +Subproject commit 6b3f37cb351552721232f4dabefa17bddb5b9004 diff --git a/scripts/find_sprite_variant_mismatches.py b/scripts/find_sprite_variant_mismatches.py new file mode 100644 index 00000000000..483695fdb66 --- /dev/null +++ b/scripts/find_sprite_variant_mismatches.py @@ -0,0 +1,98 @@ +""" +Validates the contents of the variant's masterlist file and identifies +any mismatched entries for the sprite of the same key between front, back, exp, exp back, and female. + +This will create a csv file that contains all of the entries with mismatches. + +An empty entry means that there was not a mismatch for that version of the sprite (meaning it matches front). +""" + +import sys + +if sys.version_info < (3, 7): + msg = "This script requires Python 3.7+" + raise RuntimeError(msg) + +import json +import os +import csv +from dataclasses import dataclass, field +from typing import Literal as L + +MASTERLIST_PATH = os.path.join( + os.path.dirname(os.path.dirname(__file__)), "public", "images", "pokemon", "variant", "_masterlist.json" +) +DEFAULT_OUTPUT_PATH = "sprite-mismatches.csv" + + +@dataclass(order=True) +class Sprite: + key: str = field(compare=False) + front: list[int] = field(default_factory=list, compare=False) + back: list[int] = field(default_factory=list, compare=False) + female: list[int] = field(default_factory=list, compare=False) + exp: list[int] = field(default_factory=list, compare=False) + expback: list[int] = field(default_factory=list, compare=False) + sortedKey: tuple[int] | tuple[int, str] = field(init=False, repr=False, compare=True) + + def as_row(self) -> tuple[str, list[int] | L[""], list[int] | L[""], list[int] | L[""], list[int] | L[""], list[int] | L[""]]: + """return sprite information as a tuple for csv writing""" + return (self.key, self.front or "", self.back or "", self.exp or "", self.expback or "", self.female or "") + + def is_mismatch(self) -> bool: + """return True if the female, back, or exp sprites do not match the front""" + for val in [self.back, self.exp, self.expback, self.female]: + if val != [] and val != self.front: + return True + return False + + def __post_init__(self): + split = self.key.split("-", maxsplit=1) + self.sortedKey = (int(split[0]), split[1]) if len(split) == 2 else (int(split[0]),) + + +def make_mismatch_sprite_list(path): + with open(path, "r") as f: + masterlist: dict = json.load(f) + + # Go through the keys in "front" and "back" and make sure they match the masterlist + back_data: dict[str, list[int]] = masterlist.pop("back", {}) + exp_data: dict[str, list[int]] = masterlist.pop("exp", {}) + exp_back_data: dict[str, list[int]] = exp_data.get("back", []) + female_data: dict[str, list[int]] = masterlist.pop("female", {}) + + sprites: list[Sprite] = [] + + for key, item in masterlist.items(): + sprite = Sprite( + key, front=item, back=back_data.get(key, []), exp=exp_data.get(key, []), expback=exp_back_data.get(key, []), female=female_data.get(key, []) + ) + if sprite.is_mismatch(): + sprites.append(sprite) + + return sprites + + +def write_mismatch_csv(filename: str, mismatches: list[Sprite]): + with open(filename, "w", newline="") as csvfile: + writer = csv.writer(csvfile) + writer.writerow(["key", "front", "back", "exp", "expback", "female"]) + for sprite in sorted(mismatches): + writer.writerow(sprite.as_row()) + + +if __name__ == "__main__": + import argparse + + p = argparse.ArgumentParser("find_sprite_variant_mismatches", description=__doc__) + + p.add_argument( + "-o", + "--output", + default=DEFAULT_OUTPUT_PATH, + help=f"The path to a file to save the output file. If not specified, will write to {DEFAULT_OUTPUT_PATH}.", + ) + p.add_argument("--masterlist", default=MASTERLIST_PATH, help=f"The path to the masterlist file to validate. Defaults to {MASTERLIST_PATH}.") + args = p.parse_args() + mismatches = make_mismatch_sprite_list(args.masterlist) + write_mismatch_csv(args.output, mismatches) diff --git a/src/@types/PokerogueAccountApi.ts b/src/@types/PokerogueAccountApi.ts new file mode 100644 index 00000000000..68d0a5e7730 --- /dev/null +++ b/src/@types/PokerogueAccountApi.ts @@ -0,0 +1,17 @@ +import type { UserInfo } from "#app/@types/UserInfo"; + +export interface AccountInfoResponse extends UserInfo {} + +export interface AccountLoginRequest { + username: string; + password: string; +} + +export interface AccountLoginResponse { + token: string; +} + +export interface AccountRegisterRequest { + username: string; + password: string; +} diff --git a/src/@types/PokerogueAdminApi.ts b/src/@types/PokerogueAdminApi.ts new file mode 100644 index 00000000000..2ee25b560d9 --- /dev/null +++ b/src/@types/PokerogueAdminApi.ts @@ -0,0 +1,31 @@ +export interface LinkAccountToDiscordIdRequest { + username: string; + discordId: string; +} + +export interface UnlinkAccountFromDiscordIdRequest { + username: string; + discordId: string; +} + +export interface LinkAccountToGoogledIdRequest { + username: string; + googleId: string; +} + +export interface UnlinkAccountFromGoogledIdRequest { + username: string; + googleId: string; +} + +export interface SearchAccountRequest { + username: string; +} + +export interface SearchAccountResponse { + username: string; + discordId: string; + googleId: string; + lastLoggedIn: string; + registered: string; +} diff --git a/src/@types/PokerogueApi.ts b/src/@types/PokerogueApi.ts new file mode 100644 index 00000000000..79755b23a54 --- /dev/null +++ b/src/@types/PokerogueApi.ts @@ -0,0 +1,4 @@ +export interface TitleStatsResponse { + playerCount: number; + battleCount: number; +} diff --git a/src/@types/PokerogueDailyApi.ts b/src/@types/PokerogueDailyApi.ts new file mode 100644 index 00000000000..3f3d8eb61ca --- /dev/null +++ b/src/@types/PokerogueDailyApi.ts @@ -0,0 +1,10 @@ +import type { ScoreboardCategory } from "#app/ui/daily-run-scoreboard"; + +export interface GetDailyRankingsRequest { + category: ScoreboardCategory; + page?: number; +} + +export interface GetDailyRankingsPageCountRequest { + category: ScoreboardCategory; +} diff --git a/src/@types/PokerogueSavedataApi.ts b/src/@types/PokerogueSavedataApi.ts new file mode 100644 index 00000000000..a313cd708c7 --- /dev/null +++ b/src/@types/PokerogueSavedataApi.ts @@ -0,0 +1,8 @@ +import type { SessionSaveData, SystemSaveData } from "#app/system/game-data"; + +export interface UpdateAllSavedataRequest { + system: SystemSaveData; + session: SessionSaveData; + sessionSlotId: number; + clientSessionId: string; +} diff --git a/src/@types/PokerogueSessionSavedataApi.ts b/src/@types/PokerogueSessionSavedataApi.ts new file mode 100644 index 00000000000..c4650611c4f --- /dev/null +++ b/src/@types/PokerogueSessionSavedataApi.ts @@ -0,0 +1,40 @@ +export class UpdateSessionSavedataRequest { + slot: number; + trainerId: number; + secretId: number; + clientSessionId: string; +} + +/** This is **NOT** similar to {@linkcode ClearSessionSavedataRequest} */ +export interface NewClearSessionSavedataRequest { + slot: number; + isVictory: boolean; + clientSessionId: string; +} + +export interface GetSessionSavedataRequest { + slot: number; + clientSessionId: string; +} + +export interface DeleteSessionSavedataRequest { + slot: number; + clientSessionId: string; +} + +/** This is **NOT** similar to {@linkcode NewClearSessionSavedataRequest} */ +export interface ClearSessionSavedataRequest { + slot: number; + trainerId: number; + clientSessionId: string; +} + +/** + * Pokerogue API response for path: `/savedata/session/clear` + */ +export interface ClearSessionSavedataResponse { + /** Contains the error message if any occured */ + error?: string; + /** Is `true` if the request was successfully processed */ + success?: boolean; +} diff --git a/src/@types/PokerogueSystemSavedataApi.ts b/src/@types/PokerogueSystemSavedataApi.ts new file mode 100644 index 00000000000..8ce160a5ec2 --- /dev/null +++ b/src/@types/PokerogueSystemSavedataApi.ts @@ -0,0 +1,20 @@ +import type { SystemSaveData } from "#app/system/game-data"; + +export interface GetSystemSavedataRequest { + clientSessionId: string; +} + +export class UpdateSystemSavedataRequest { + clientSessionId: string; + trainerId?: number; + secretId?: number; +} + +export interface VerifySystemSavedataRequest { + clientSessionId: string; +} + +export interface VerifySystemSavedataResponse { + valid: boolean; + systemData: SystemSaveData; +} diff --git a/src/@types/UserInfo.ts b/src/@types/UserInfo.ts new file mode 100644 index 00000000000..c8a0c6ecb26 --- /dev/null +++ b/src/@types/UserInfo.ts @@ -0,0 +1,7 @@ +export interface UserInfo { + username: string; + lastSessionSlot: number; + discordId: string; + googleId: string; + hasAdminRole: boolean; +} diff --git a/src/@types/common.ts b/src/@types/common.ts index fcd946656dc..93d88a3b680 100644 --- a/src/@types/common.ts +++ b/src/@types/common.ts @@ -1,3 +1 @@ -import BattleScene from "#app/battle-scene"; - -export type ConditionFn = (scene: BattleScene, args?: any[]) => boolean; +export type ConditionFn = (args?: any[]) => boolean; diff --git a/src/@types/i18next.d.ts b/src/@types/i18next.d.ts index 3bd71bc6c61..0eaa1e6ff0f 100644 --- a/src/@types/i18next.d.ts +++ b/src/@types/i18next.d.ts @@ -1,4 +1,4 @@ -import { TOptions } from "i18next"; +import type { TOptions } from "i18next"; // Module declared to make referencing keys in the localization files type-safe. declare module "i18next" { diff --git a/src/@types/pokerogue-api.ts b/src/@types/pokerogue-api.ts deleted file mode 100644 index 892869968bb..00000000000 --- a/src/@types/pokerogue-api.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Pokerogue API response for path: `/savedata/session/clear` - */ -export interface PokerogueApiClearSessionData { - /** Contains the error message if any occured */ - error?: string; - /** Is `true` if the request was successfully processed */ - success?: boolean; -} diff --git a/src/account.ts b/src/account.ts index 692ff2b0d81..96ce32714bb 100644 --- a/src/account.ts +++ b/src/account.ts @@ -1,26 +1,32 @@ +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import type { UserInfo } from "#app/@types/UserInfo"; import { bypassLogin } from "./battle-scene"; import * as Utils from "./utils"; -export interface UserInfo { - username: string; - lastSessionSlot: integer; - discordId: string; - googleId: string; - hasAdminRole: boolean; -} - export let loggedInUser: UserInfo | null = null; // This is a random string that is used to identify the client session - unique per session (tab or window) so that the game will only save on the one that the server is expecting export const clientSessionId = Utils.randomString(32); export function initLoggedInUser(): void { - loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: "", hasAdminRole: false }; + loggedInUser = { + username: "Guest", + lastSessionSlot: -1, + discordId: "", + googleId: "", + hasAdminRole: false, + }; } -export function updateUserInfo(): Promise<[boolean, integer]> { - return new Promise<[boolean, integer]>(resolve => { +export function updateUserInfo(): Promise<[boolean, number]> { + return new Promise<[boolean, number]>(resolve => { if (bypassLogin) { - loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: "", hasAdminRole: false }; + loggedInUser = { + username: "Guest", + lastSessionSlot: -1, + discordId: "", + googleId: "", + hasAdminRole: false, + }; let lastSessionSlot = -1; for (let s = 0; s < 5; s++) { if (localStorage.getItem(`sessionData${s ? s : ""}_${loggedInUser.username}`)) { @@ -30,7 +36,7 @@ export function updateUserInfo(): Promise<[boolean, integer]> { } loggedInUser.lastSessionSlot = lastSessionSlot; // Migrate old data from before the username was appended - [ "data", "sessionData", "sessionData1", "sessionData2", "sessionData3", "sessionData4" ].map(d => { + ["data", "sessionData", "sessionData1", "sessionData2", "sessionData3", "sessionData4"].map(d => { const lsItem = localStorage.getItem(d); if (lsItem && !!loggedInUser?.username) { const lsUserItem = localStorage.getItem(`${d}_${loggedInUser.username}`); @@ -41,20 +47,15 @@ export function updateUserInfo(): Promise<[boolean, integer]> { localStorage.removeItem(d); } }); - return resolve([ true, 200 ]); + return resolve([true, 200]); } - Utils.apiFetch("account/info", true).then(response => { - if (!response.ok) { - resolve([ false, response.status ]); + pokerogueApi.account.getInfo().then(([accountInfo, status]) => { + if (!accountInfo) { + resolve([false, status]); return; } - return response.json(); - }).then(jsonResponse => { - loggedInUser = jsonResponse; - resolve([ true, 200 ]); - }).catch(err => { - console.error(err); - resolve([ false, 500 ]); + loggedInUser = accountInfo; + resolve([true, 200]); }); }); } diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 3cbf4d7b422..a6c986d3d0f 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1,43 +1,104 @@ import Phaser from "phaser"; import UI from "#app/ui/ui"; -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 type Pokemon from "#app/field/pokemon"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import type { PokemonSpeciesFilter } from "#app/data/pokemon-species"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; +import type { Constructor } from "#app/utils"; +import { 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 { PokeballType } from "#app/data/pokeball"; -import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "#app/data/battle-anims"; -import { Phase } from "#app/phase"; +import type { Modifier, ModifierPredicate, TurnHeldItemTransferModifier } from "./modifier/modifier"; +import { + ConsumableModifier, + ConsumablePokemonModifier, + DoubleBattleChanceBoosterModifier, + ExpBalanceModifier, + ExpShareModifier, + FusePokemonModifier, + HealingBoosterModifier, + ModifierBar, + MultipleParticipantExpBonusModifier, + PersistentModifier, + PokemonExpBoosterModifier, + PokemonFormChangeItemModifier, + PokemonHeldItemModifier, + PokemonHpRestoreModifier, + PokemonIncrementingStatModifier, + RememberMoveModifier, +} from "./modifier/modifier"; +import { PokeballType } from "#enums/pokeball"; +import { + initCommonAnims, + initMoveAnim, + loadCommonAnimAssets, + loadMoveAnimAssets, + populateAnims, +} from "#app/data/battle-anims"; +import type { Phase } from "#app/phase"; import { initGameSpeed } from "#app/system/game-speed"; import { Arena, ArenaBase } from "#app/field/arena"; import { GameData } from "#app/system/game-data"; import { addTextObject, getTextColor, TextStyle } from "#app/ui/text"; -import { allMoves } from "#app/data/move"; -import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getModifierType, getPartyLuckValue, ModifierPoolType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { allMoves } from "#app/data/moves/move"; +import { MusicPreference } from "#app/system/settings/settings"; +import { + getDefaultModifierTypeForTier, + getEnemyModifierTypesForWave, + getLuckString, + getLuckTextTint, + getModifierPoolForType, + getModifierType, + getPartyLuckValue, + ModifierPoolType, + modifierTypes, + PokemonHeldItemModifierType, +} from "#app/modifier/modifier-type"; import AbilityBar from "#app/ui/ability-bar"; -import { allAbilities, applyAbAttrs, applyPostBattleInitAbAttrs, BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, PostBattleInitAbAttr } from "#app/data/ability"; -import Battle, { BattleType, FixedBattleConfig } from "#app/battle"; -import { GameMode, GameModes, getGameMode } from "#app/game-mode"; +import { + allAbilities, + applyAbAttrs, + applyPostBattleInitAbAttrs, + applyPostItemLostAbAttrs, + BlockItemTheftAbAttr, + DoubleBattleChanceAbAttr, + PostBattleInitAbAttr, + PostItemLostAbAttr, +} from "#app/data/ability"; +import type { FixedBattleConfig } from "#app/battle"; +import Battle, { BattleType } from "#app/battle"; +import type { GameMode } from "#app/game-mode"; +import { GameModes, getGameMode } from "#app/game-mode"; import FieldSpritePipeline from "#app/pipelines/field-sprite"; import SpritePipeline from "#app/pipelines/sprite"; import PartyExpBar from "#app/ui/party-exp-bar"; -import { trainerConfigs, TrainerSlot } from "#app/data/trainer-config"; +import type { TrainerSlot } from "#app/data/trainer-config"; +import { trainerConfigs } from "#app/data/trainer-config"; import Trainer, { TrainerVariant } from "#app/field/trainer"; -import TrainerData from "#app/system/trainer-data"; +import type TrainerData from "#app/system/trainer-data"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; import PokeballTray from "#app/ui/pokeball-tray"; import InvertPostFX from "#app/pipelines/invert"; -import { Achv, achvs, ModifierAchv, MoneyAchv } from "#app/system/achv"; -import { Voucher, vouchers } from "#app/system/voucher"; +import type { Achv } from "#app/system/achv"; +import { achvs, ModifierAchv, MoneyAchv } from "#app/system/achv"; +import type { Voucher } from "#app/system/voucher"; +import { vouchers } from "#app/system/voucher"; import { Gender } from "#app/data/gender"; -import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; +import type UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import { addUiThemeOverrides } from "#app/ui/ui-theme"; -import PokemonData from "#app/system/pokemon-data"; -import { Nature } from "#app/data/nature"; -import { FormChangeItem, pokemonFormChanges, SpeciesFormChange, SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger } from "#app/data/pokemon-forms"; +import type PokemonData from "#app/system/pokemon-data"; +import { Nature } from "#enums/nature"; +import type { SpeciesFormChange, SpeciesFormChangeTrigger } from "#app/data/pokemon-forms"; +import { + FormChangeItem, + pokemonFormChanges, + SpeciesFormChangeManualTrigger, + SpeciesFormChangeTimeOfDayTrigger, +} from "#app/data/pokemon-forms"; import { FormChangePhase } from "#app/phases/form-change-phase"; import { getTypeRgb } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import PokemonSpriteSparkleHandler from "#app/field/pokemon-sprite-sparkle-handler"; import CharSprite from "#app/ui/char-sprite"; import DamageNumberHandler from "#app/field/damage-number-handler"; @@ -45,8 +106,9 @@ 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 { Localizable } from "#app/interfaces/locales"; +import type { Variant, VariantSet } from "#app/data/variant"; +import { variantColorCache, variantData } from "#app/data/variant"; +import type { Localizable } from "#app/interfaces/locales"; import Overrides from "#app/overrides"; import { InputsController } from "#app/inputs-controller"; import { UiInputs } from "#app/ui-inputs"; @@ -56,14 +118,14 @@ import { EaseType } from "#enums/ease-type"; import { BattleSpec } from "#enums/battle-spec"; import { BattleStyle } from "#enums/battle-style"; import { Biome } from "#enums/biome"; -import { ExpNotification } from "#enums/exp-notification"; +import type { ExpNotification } from "#enums/exp-notification"; import { MoneyFormat } from "#enums/money-format"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager"; -import { PokemonAnimType } from "#enums/pokemon-anim-type"; +import type { PokemonAnimType } from "#enums/pokemon-anim-type"; import i18next from "i18next"; import { TrainerType } from "#enums/trainer-type"; import { battleSpecDialogue } from "#app/data/dialogue"; @@ -86,26 +148,36 @@ import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-ph import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; -import { allMysteryEncounters, ANTI_VARIANCE_WEIGHT_MODIFIER, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, mysteryEncountersByBiome } from "#app/data/mystery-encounters/mystery-encounters"; +import { + allMysteryEncounters, + ANTI_VARIANCE_WEIGHT_MODIFIER, + AVERAGE_ENCOUNTERS_PER_RUN_TARGET, + BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, + MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, + mysteryEncountersByBiome, +} from "#app/data/mystery-encounters/mystery-encounters"; import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import HeldModifierConfig from "#app/interfaces/held-modifier-config"; +import type HeldModifierConfig from "#app/interfaces/held-modifier-config"; import { ExpPhase } from "#app/phases/exp-phase"; import { ShowPartyExpBarPhase } from "#app/phases/show-party-exp-bar-phase"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { ExpGainsSpeed } from "#enums/exp-gains-speed"; +import { BattlerTagType } from "#enums/battler-tag-type"; import { FRIENDSHIP_GAIN_FROM_BATTLE } from "#app/data/balance/starters"; +import { StatusEffect } from "#enums/status-effect"; +import { initGlobalScene } from "#app/global-scene"; +import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; +import { HideAbilityPhase } from "#app/phases/hide-ability-phase"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; const DEBUG_RNG = false; -const OPP_IVS_OVERRIDE_VALIDATED : integer[] = ( - Array.isArray(Overrides.OPP_IVS_OVERRIDE) ? - Overrides.OPP_IVS_OVERRIDE : - new Array(6).fill(Overrides.OPP_IVS_OVERRIDE) -).map(iv => isNaN(iv) || iv === null || iv > 31 ? -1 : iv); +const OPP_IVS_OVERRIDE_VALIDATED: number[] = ( + Array.isArray(Overrides.OPP_IVS_OVERRIDE) ? Overrides.OPP_IVS_OVERRIDE : new Array(6).fill(Overrides.OPP_IVS_OVERRIDE) +).map(iv => (Number.isNaN(iv) || iv === null || iv > 31 ? -1 : iv)); export const startingWave = Overrides.STARTING_WAVE_OVERRIDE || 1; @@ -113,18 +185,18 @@ const expSpriteKeys: string[] = []; export let starterColors: StarterColors; interface StarterColors { - [key: string]: [string, string] + [key: string]: [string, string]; } export interface PokeballCounts { - [pb: string]: integer; + [pb: string]: number; } export type AnySound = Phaser.Sound.WebAudioSound | Phaser.Sound.HTML5AudioSound | Phaser.Sound.NoAudioSound; export interface InfoToggle { - toggleInfo(force?: boolean): void; - isActive(): boolean; + toggleInfo(force?: boolean): void; + isActive(): boolean; } export default class BattleScene extends SceneBase { @@ -132,92 +204,94 @@ export default class BattleScene extends SceneBase { public inputController: InputsController; public uiInputs: UiInputs; - public sessionPlayTime: integer | null = null; - public lastSavePlayTime: integer | null = null; - public masterVolume: number = 0.5; - public bgmVolume: number = 1; - public fieldVolume: number = 1; - public seVolume: number = 1; - public uiVolume: number = 1; - public gameSpeed: integer = 1; - public damageNumbersMode: integer = 0; - public reroll: boolean = false; + public sessionPlayTime: number | null = null; + public lastSavePlayTime: number | null = null; + public masterVolume = 0.5; + public bgmVolume = 1; + public fieldVolume = 1; + public seVolume = 1; + public uiVolume = 1; + public gameSpeed = 1; + public damageNumbersMode = 0; + public reroll = false; public shopCursorTarget: number = ShopCursorTarget.REWARDS; - public showMovesetFlyout: boolean = true; - public showArenaFlyout: boolean = true; - public showTimeOfDayWidget: boolean = true; + public commandCursorMemory = false; + public dexForDevs = false; + public showMovesetFlyout = true; + public showArenaFlyout = true; + public showTimeOfDayWidget = true; public timeOfDayAnimation: EaseType = EaseType.NONE; - public showLevelUpStats: boolean = true; + public showLevelUpStats = true; public enableTutorials: boolean = import.meta.env.VITE_BYPASS_TUTORIAL === "1"; - public enableMoveInfo: boolean = true; - public enableRetries: boolean = false; - public hideIvs: boolean = false; + public enableMoveInfo = true; + public enableRetries = false; + public hideIvs = false; /** * Determines the condition for a notification should be shown for Candy Upgrades * - 0 = 'Off' * - 1 = 'Passives Only' * - 2 = 'On' */ - public candyUpgradeNotification: integer = 0; + public candyUpgradeNotification = 0; /** * Determines what type of notification is used for Candy Upgrades * - 0 = 'Icon' * - 1 = 'Animation' */ - public candyUpgradeDisplay: integer = 0; + public candyUpgradeDisplay = 0; public moneyFormat: MoneyFormat = MoneyFormat.NORMAL; public uiTheme: UiTheme = UiTheme.DEFAULT; - public windowType: integer = 0; - public experimentalSprites: boolean = false; - public musicPreference: integer = 0; - public moveAnimations: boolean = true; + public windowType = 0; + public experimentalSprites = false; + public musicPreference: number = MusicPreference.ALLGENS; + public moveAnimations = true; public expGainsSpeed: ExpGainsSpeed = ExpGainsSpeed.DEFAULT; - public skipSeenDialogues: boolean = false; + public skipSeenDialogues = false; /** * Determines if the egg hatching animation should be skipped * - 0 = Never (never skip animation) * - 1 = Ask (ask to skip animation when hatching 2 or more eggs) * - 2 = Always (automatically skip animation when hatching 2 or more eggs) */ - public eggSkipPreference: number = 0; + public eggSkipPreference = 0; /** - * Defines the experience gain display mode. - * - * @remarks - * The `expParty` can have several modes: - * - `0` - Default: The normal experience gain display, nothing changed. - * - `1` - Level Up Notification: Displays the level up in the small frame instead of a message. - * - `2` - Skip: No level up frame nor message. - * - * Modes `1` and `2` are still compatible with stats display, level up, new move, etc. - * @default 0 - Uses the default normal experience gain display. - */ + * Defines the experience gain display mode. + * + * @remarks + * The `expParty` can have several modes: + * - `0` - Default: The normal experience gain display, nothing changed. + * - `1` - Level Up Notification: Displays the level up in the small frame instead of a message. + * - `2` - Skip: No level up frame nor message. + * + * Modes `1` and `2` are still compatible with stats display, level up, new move, etc. + * @default 0 - Uses the default normal experience gain display. + */ public expParty: ExpNotification = 0; - public hpBarSpeed: integer = 0; - public fusionPaletteSwaps: boolean = true; - public enableTouchControls: boolean = false; - public enableVibration: boolean = false; - public showBgmBar: boolean = true; + public hpBarSpeed = 0; + public fusionPaletteSwaps = true; + public enableTouchControls = false; + public enableVibration = false; + public showBgmBar = true; /** * Determines the selected battle style. * - 0 = 'Switch' * - 1 = 'Set' - The option to switch the active pokemon at the start of a battle will not display. */ - public battleStyle: integer = BattleStyle.SWITCH; + public battleStyle: number = BattleStyle.SWITCH; /** - * Defines whether or not to show type effectiveness hints - * - true: No hints - * - false: Show hints for moves + * Defines whether or not to show type effectiveness hints + * - true: No hints + * - false: Show hints for moves */ - public typeHints: boolean = false; + public typeHints = false; - public disableMenu: boolean = false; + public disableMenu = false; public gameData: GameData; - public sessionSlotId: integer; + public sessionSlotId: number; /** PhaseQueue: dequeue/remove the first element to get the next phase */ public phaseQueue: Phase[]; @@ -226,7 +300,7 @@ export default class BattleScene extends SceneBase { private phaseQueuePrepend: Phase[]; /** overrides default of inserting phases to end of phaseQueuePrepend array, useful or inserting Phases "out of order" */ - private phaseQueuePrependSpliceIndex: integer; + private phaseQueuePrependSpliceIndex: number; private nextCommandPhaseQueue: Phase[]; private currentPhase: Phase | null; @@ -247,13 +321,13 @@ export default class BattleScene extends SceneBase { public arenaNextEnemy: ArenaBase; public arena: Arena; public gameMode: GameMode; - public score: integer; + public score: number; public lockModifierTiers: boolean; public trainer: Phaser.GameObjects.Sprite; public lastEnemyTrainer: Trainer | null; public currentBattle: Battle; public pokeballCounts: PokeballCounts; - public money: integer; + public money: number; public pokemonInfoContainer: PokemonInfoContainer; private party: PlayerPokemon[]; /** Session save data that pertains to Mystery Encounters */ @@ -272,8 +346,8 @@ export default class BattleScene extends SceneBase { private fieldOverlay: Phaser.GameObjects.Rectangle; private shopOverlay: Phaser.GameObjects.Rectangle; - private shopOverlayShown: boolean = false; - private shopOverlayOpacity: number = .8; + private shopOverlayShown = false; + private shopOverlayOpacity = 0.8; public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; @@ -282,7 +356,7 @@ export default class BattleScene extends SceneBase { public seed: string; public waveSeed: string; - public waveCycleOffset: integer; + public waveCycleOffset: number; public offsetGym: boolean; public damageNumberHandler: DamageNumberHandler; @@ -296,9 +370,9 @@ export default class BattleScene extends SceneBase { private bgmCache: Set = new Set(); private playTimeTimer: Phaser.Time.TimerEvent; - public rngCounter: integer = 0; - public rngSeedOverride: string = ""; - public rngOffset: integer = 0; + public rngCounter = 0; + public rngSeedOverride = ""; + public rngOffset = 0; public inputMethod: string; private infoToggles: InfoToggle[] = []; @@ -323,7 +397,9 @@ export default class BattleScene extends SceneBase { this.conditionalQueue = []; this.phaseQueuePrependSpliceIndex = -1; this.nextCommandPhaseQueue = []; + this.eventManager = new TimedEventManager(); this.updateGameInfo(); + initGlobalScene(this); } loadPokemonAtlas(key: string, atlasPath: string, experimental?: boolean) { @@ -337,19 +413,51 @@ export default class BattleScene extends SceneBase { if (variant) { atlasPath = atlasPath.replace("variant/", ""); } - this.load.atlas(key, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.png`, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.json`); + 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} + */ + public async loadPokemonVariantAssets(spriteKey: string, fileRoot: string, variant?: Variant): Promise { + 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; + + return new Promise(resolve => { + if (variantSet && variant !== undefined && variantSet[variant] === 1) { + if (variantColorCache.hasOwnProperty(spriteKey)) { + return resolve(); + } + this.cachedFetch(`./images/pokemon/variant/${fileRoot}.json`) + .then(res => res.json()) + .then(c => { + variantColorCache[spriteKey] = c; + resolve(); + }); + } else { + resolve(); + } + }); } async preload() { if (DEBUG_RNG) { - const scene = this; const originalRealInRange = Phaser.Math.RND.realInRange; Phaser.Math.RND.realInRange = function (min: number, max: number): number { - const ret = originalRealInRange.apply(this, [ min, max ]); - const args = [ "RNG", ++scene.rngCounter, ret / (max - min), `min: ${min} / max: ${max}` ]; - args.push(`seed: ${scene.rngSeedOverride || scene.waveSeed || scene.seed}`); - if (scene.rngOffset) { - args.push(`offset: ${scene.rngOffset}`); + const ret = originalRealInRange.apply(this, [min, max]); + const args = ["RNG", ++this.rngCounter, ret / (max - min), `min: ${min} / max: ${max}`]; + args.push(`seed: ${this.rngSeedOverride || this.waveSeed || this.seed}`); + if (this.rngOffset) { + args.push(`offset: ${this.rngOffset}`); } console.log(...args); return ret; @@ -364,12 +472,12 @@ export default class BattleScene extends SceneBase { create() { this.scene.remove(LoadingScene.KEY); initGameSpeed.apply(this); - this.inputController = new InputsController(this); - this.uiInputs = new UiInputs(this, this.inputController); + this.inputController = new InputsController(); + this.uiInputs = new UiInputs(this.inputController); - this.gameData = new GameData(this); + this.gameData = new GameData(); - addUiThemeOverrides(this); + addUiThemeOverrides(); this.load.setBaseURL(); @@ -378,7 +486,6 @@ export default class BattleScene extends SceneBase { this.fieldSpritePipeline = new FieldSpritePipeline(this.game); (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("FieldSprite", this.fieldSpritePipeline); - this.eventManager = new TimedEventManager(); this.launchBattle(); } @@ -393,12 +500,12 @@ export default class BattleScene extends SceneBase { this.arenaBgTransition = this.add.sprite(0, 0, "plains_bg"); this.arenaBgTransition.setName("sprite-arena-bg-transition"); - [ this.arenaBgTransition, this.arenaBg ].forEach(a => { + for (const a of [this.arenaBgTransition, this.arenaBg]) { a.setPipeline(this.fieldSpritePipeline); a.setScale(6); a.setOrigin(0); a.setSize(320, 240); - }); + } const field = this.add.container(0, 0); field.setName("field"); @@ -413,13 +520,16 @@ export default class BattleScene extends SceneBase { this.fieldUI = fieldUI; - const transition = this.make.rexTransitionImagePack({ - x: 0, - y: 0, - scale: 6, - key: "loading_bg", - origin: { x: 0, y: 0 } - }, true); + const transition = this.make.rexTransitionImagePack( + { + x: 0, + y: 0, + scale: 6, + key: "loading_bg", + origin: { x: 0, y: 0 }, + }, + true, + ); //@ts-ignore (the defined types in the package are incromplete...) transition.transit({ @@ -441,7 +551,7 @@ export default class BattleScene extends SceneBase { this.uiContainer = uiContainer; const overlayWidth = this.game.canvas.width / 6; - const overlayHeight = (this.game.canvas.height / 6) - 48; + const overlayHeight = this.game.canvas.height / 6 - 48; this.fieldOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x424242); this.fieldOverlay.setName("rect-field-overlay"); this.fieldOverlay.setOrigin(0, 0); @@ -457,76 +567,87 @@ export default class BattleScene extends SceneBase { this.modifiers = []; this.enemyModifiers = []; - this.modifierBar = new ModifierBar(this); + this.modifierBar = new ModifierBar(); this.modifierBar.setName("modifier-bar"); this.add.existing(this.modifierBar); uiContainer.add(this.modifierBar); - this.enemyModifierBar = new ModifierBar(this, true); + this.enemyModifierBar = new ModifierBar(true); this.enemyModifierBar.setName("enemy-modifier-bar"); this.add.existing(this.enemyModifierBar); uiContainer.add(this.enemyModifierBar); - this.charSprite = new CharSprite(this); + this.charSprite = new CharSprite(); this.charSprite.setName("sprite-char"); this.charSprite.setup(); this.fieldUI.add(this.charSprite); - this.pbTray = new PokeballTray(this, true); + this.pbTray = new PokeballTray(true); this.pbTray.setName("pb-tray"); this.pbTray.setup(); - this.pbTrayEnemy = new PokeballTray(this, false); + this.pbTrayEnemy = new PokeballTray(false); this.pbTrayEnemy.setName("enemy-pb-tray"); this.pbTrayEnemy.setup(); this.fieldUI.add(this.pbTray); this.fieldUI.add(this.pbTrayEnemy); - this.abilityBar = new AbilityBar(this); + this.abilityBar = new AbilityBar(); this.abilityBar.setName("ability-bar"); this.abilityBar.setup(); this.fieldUI.add(this.abilityBar); - this.partyExpBar = new PartyExpBar(this); + this.partyExpBar = new PartyExpBar(); this.partyExpBar.setName("party-exp-bar"); this.partyExpBar.setup(); this.fieldUI.add(this.partyExpBar); - this.candyBar = new CandyBar(this); + this.candyBar = new CandyBar(); this.candyBar.setName("candy-bar"); this.candyBar.setup(); this.fieldUI.add(this.candyBar); - this.biomeWaveText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, startingWave.toString(), TextStyle.BATTLE_INFO); + this.biomeWaveText = addTextObject( + this.game.canvas.width / 6 - 2, + 0, + startingWave.toString(), + TextStyle.BATTLE_INFO, + ); this.biomeWaveText.setName("text-biome-wave"); this.biomeWaveText.setOrigin(1, 0.5); this.fieldUI.add(this.biomeWaveText); - this.moneyText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, "", TextStyle.MONEY); + this.moneyText = addTextObject(this.game.canvas.width / 6 - 2, 0, "", TextStyle.MONEY); this.moneyText.setName("text-money"); this.moneyText.setOrigin(1, 0.5); this.fieldUI.add(this.moneyText); - this.scoreText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); + this.scoreText = addTextObject(this.game.canvas.width / 6 - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); this.scoreText.setName("text-score"); this.scoreText.setOrigin(1, 0.5); this.fieldUI.add(this.scoreText); - this.luckText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); + this.luckText = addTextObject(this.game.canvas.width / 6 - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); this.luckText.setName("text-luck"); this.luckText.setOrigin(1, 0.5); this.luckText.setVisible(false); this.fieldUI.add(this.luckText); - this.luckLabelText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, i18next.t("common:luckIndicator"), TextStyle.PARTY, { fontSize: "54px" }); + this.luckLabelText = addTextObject( + this.game.canvas.width / 6 - 2, + 0, + i18next.t("common:luckIndicator"), + TextStyle.PARTY, + { fontSize: "54px" }, + ); this.luckLabelText.setName("text-luck-label"); this.luckLabelText.setOrigin(1, 0.5); this.luckLabelText.setVisible(false); this.fieldUI.add(this.luckLabelText); - this.arenaFlyout = new ArenaFlyout(this); + this.arenaFlyout = new ArenaFlyout(); this.fieldUI.add(this.arenaFlyout); this.fieldUI.moveBelow(this.arenaFlyout, this.fieldOverlay); @@ -535,9 +656,12 @@ export default class BattleScene extends SceneBase { this.damageNumberHandler = new DamageNumberHandler(); this.spriteSparkleHandler = new PokemonSpriteSparkleHandler(); - this.spriteSparkleHandler.setup(this); + this.spriteSparkleHandler.setup(); - this.pokemonInfoContainer = new PokemonInfoContainer(this, (this.game.canvas.width / 6) + 52, -(this.game.canvas.height / 6) + 66); + this.pokemonInfoContainer = new PokemonInfoContainer( + this.game.canvas.width / 6 + 52, + -(this.game.canvas.height / 6) + 66, + ); this.pokemonInfoContainer.setup(); this.fieldUI.add(this.pokemonInfoContainer); @@ -546,27 +670,31 @@ export default class BattleScene extends SceneBase { const loadPokemonAssets = []; - this.arenaPlayer = new ArenaBase(this, true); + this.arenaPlayer = new ArenaBase(true); this.arenaPlayer.setName("arena-player"); - this.arenaPlayerTransition = new ArenaBase(this, true); + this.arenaPlayerTransition = new ArenaBase(true); this.arenaPlayerTransition.setName("arena-player-transition"); - this.arenaEnemy = new ArenaBase(this, false); + this.arenaEnemy = new ArenaBase(false); this.arenaEnemy.setName("arena-enemy"); - this.arenaNextEnemy = new ArenaBase(this, false); + this.arenaNextEnemy = new ArenaBase(false); this.arenaNextEnemy.setName("arena-next-enemy"); this.arenaBgTransition.setVisible(false); this.arenaPlayerTransition.setVisible(false); this.arenaNextEnemy.setVisible(false); - [ this.arenaPlayer, this.arenaPlayerTransition, this.arenaEnemy, this.arenaNextEnemy ].forEach(a => { + for (const a of [this.arenaPlayer, this.arenaPlayerTransition, this.arenaEnemy, this.arenaNextEnemy]) { if (a instanceof Phaser.GameObjects.Sprite) { a.setOrigin(0, 0); } field.add(a); - }); + } - const trainer = this.addFieldSprite(0, 0, `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + const trainer = this.addFieldSprite( + 0, + 0, + `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); trainer.setOrigin(0.5, 1); trainer.setName("sprite-trainer"); @@ -579,37 +707,42 @@ export default class BattleScene extends SceneBase { frames: this.anims.generateFrameNumbers("prompt", { start: 1, end: 4 }), frameRate: 6, repeat: -1, - showOnStart: true + showOnStart: true, }); this.anims.create({ key: "tera_sparkle", - frames: this.anims.generateFrameNumbers("tera_sparkle", { start: 0, end: 12 }), + frames: this.anims.generateFrameNumbers("tera_sparkle", { + start: 0, + end: 12, + }), frameRate: 18, repeat: 0, showOnStart: true, - hideOnComplete: true + hideOnComplete: true, }); this.reset(false, false, true); - const ui = new UI(this); + const ui = new UI(); this.uiContainer.add(ui); this.ui = ui; ui.setup(); - const defaultMoves = [ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ]; + const defaultMoves = [Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE]; Promise.all([ Promise.all(loadPokemonAssets), - initCommonAnims(this).then(() => loadCommonAnimAssets(this, true)), - Promise.all([ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map(m => initMoveAnim(this, m))).then(() => loadMoveAnimAssets(this, defaultMoves, true)), - this.initStarterColors() + initCommonAnims().then(() => loadCommonAnimAssets(true)), + Promise.all([Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE].map(m => initMoveAnim(m))).then( + () => loadMoveAnimAssets(defaultMoves, true), + ), + this.initStarterColors(), ]).then(() => { - this.pushPhase(new LoginPhase(this)); - this.pushPhase(new TitlePhase(this)); + this.pushPhase(new LoginPhase()); + this.pushPhase(new TitlePhase()); this.shiftPhase(); }); @@ -640,7 +773,7 @@ export default class BattleScene extends SceneBase { if (this.lastSavePlayTime !== null) { this.lastSavePlayTime++; } - } + }, }); this.updateBiomeWaveText(); @@ -652,30 +785,37 @@ export default class BattleScene extends SceneBase { if (expSpriteKeys.length) { return; } - this.cachedFetch("./exp-sprites.json").then(res => res.json()).then(keys => { - if (Array.isArray(keys)) { - expSpriteKeys.push(...keys); - } - Promise.resolve(); - }); + this.cachedFetch("./exp-sprites.json") + .then(res => res.json()) + .then(keys => { + if (Array.isArray(keys)) { + expSpriteKeys.push(...keys); + } + Promise.resolve(); + }); } async initVariantData(): Promise { - Object.keys(variantData).forEach(key => delete variantData[key]); - await this.cachedFetch("./images/pokemon/variant/_masterlist.json").then(res => res.json()) + for (const key of Object.keys(variantData)) { + delete variantData[key]; + } + await this.cachedFetch("./images/pokemon/variant/_masterlist.json") + .then(res => res.json()) .then(v => { - Object.keys(v).forEach(k => variantData[k] = v[k]); + for (const k of Object.keys(v)) { + variantData[k] = v[k]; + } if (this.experimentalSprites) { const expVariantData = variantData["exp"]; const traverseVariantData = (keys: string[]) => { let variantTree = variantData; let expTree = expVariantData; - keys.map((k: string, i: integer) => { + keys.map((k: string, i: number) => { if (i < keys.length - 1) { variantTree = variantTree[k]; expTree = expTree[k]; } else if (variantTree.hasOwnProperty(k) && expTree.hasOwnProperty(k)) { - if ([ "back", "female" ].includes(k)) { + if (["back", "female"].includes(k)) { traverseVariantData(keys.concat(k)); } else { variantTree[k] = expTree[k]; @@ -683,7 +823,9 @@ export default class BattleScene extends SceneBase { } }); }; - Object.keys(expVariantData).forEach(ek => traverseVariantData([ ek ])); + for (const ek of Object.keys(expVariantData)) { + traverseVariantData([ek]); + } } Promise.resolve(); }); @@ -706,36 +848,16 @@ export default class BattleScene extends SceneBase { return resolve(); } - this.cachedFetch("./starter-colors.json").then(res => res.json()).then(sc => { - starterColors = {}; - Object.keys(sc).forEach(key => { - starterColors[key] = sc[key]; + this.cachedFetch("./starter-colors.json") + .then(res => res.json()) + .then(sc => { + starterColors = {}; + for (const key of Object.keys(sc)) { + starterColors[key] = sc[key]; + } + + resolve(); }); - - /*const loadPokemonAssets: Promise[] = []; - - for (let s of Object.keys(speciesStarters)) { - const species = getPokemonSpecies(parseInt(s)); - loadPokemonAssets.push(species.loadAssets(this, false, 0, false)); - } - - Promise.all(loadPokemonAssets).then(() => { - const starterCandyColors = {}; - const rgbaToHexFunc = (r, g, b) => [r, g, b].map(x => x.toString(16).padStart(2, '0')).join(''); - - for (let s of Object.keys(speciesStarters)) { - const species = getPokemonSpecies(parseInt(s)); - - starterCandyColors[species.speciesId] = species.generateCandyColors(this).map(c => rgbaToHexFunc(c[0], c[1], c[2])); - } - - console.log(JSON.stringify(starterCandyColors)); - - resolve(); - });*/ - - resolve(); - }); }); } @@ -764,65 +886,77 @@ export default class BattleScene extends SceneBase { return true; } - getParty(): PlayerPokemon[] { + public getPlayerParty(): PlayerPokemon[] { return this.party; } - getPlayerPokemon(): PlayerPokemon | undefined { - return this.getPlayerField().find(p => p.isActive()); - } - /** - * Finds the first {@linkcode Pokemon.isActive() | active PlayerPokemon} that isn't also currently switching out - * @returns Either the first {@linkcode PlayerPokemon} satisfying, or undefined if no player pokemon on the field satisfy + * @returns An array of {@linkcode PlayerPokemon} filtered from the player's party + * that are {@linkcode Pokemon.isAllowedInBattle | allowed in battle}. */ - getNonSwitchedPlayerPokemon(): PlayerPokemon | undefined { - return this.getPlayerField().find(p => p.isActive() && p.switchOutStatus === false); + public getPokemonAllowedInBattle(): PlayerPokemon[] { + return this.getPlayerParty().filter(p => p.isAllowedInBattle()); } /** - * Returns an array of PlayerPokemon of length 1 or 2 depending on if double battles or not + * @returns The first {@linkcode PlayerPokemon} that is {@linkcode getPlayerField on the field} + * and {@linkcode PlayerPokemon.isActive is active} + * (aka {@linkcode PlayerPokemon.isAllowedInBattle is allowed in battle}), + * or `undefined` if there are no valid pokemon + * @param includeSwitching Whether a pokemon that is currently switching out is valid, default `true` + */ + public getPlayerPokemon(includeSwitching = true): PlayerPokemon | undefined { + return this.getPlayerField().find(p => p.isActive() && (includeSwitching || p.switchOutStatus === false)); + } + + /** + * Returns an array of PlayerPokemon of length 1 or 2 depending on if in a double battle or not. + * Does not actually check if the pokemon are on the field or not. * @returns array of {@linkcode PlayerPokemon} */ - getPlayerField(): PlayerPokemon[] { - const party = this.getParty(); + public getPlayerField(): PlayerPokemon[] { + const party = this.getPlayerParty(); return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); } - getEnemyParty(): EnemyPokemon[] { + public getEnemyParty(): EnemyPokemon[] { return this.currentBattle?.enemyParty ?? []; } - getEnemyPokemon(): EnemyPokemon | undefined { - return this.getEnemyField().find(p => p.isActive()); - } - /** - * Finds the first {@linkcode Pokemon.isActive() | active EnemyPokemon} pokemon from the enemy that isn't also currently switching out - * @returns Either the first {@linkcode EnemyPokemon} satisfying, or undefined if no player pokemon on the field satisfy + * @returns The first {@linkcode EnemyPokemon} that is {@linkcode getEnemyField on the field} + * and {@linkcode EnemyPokemon.isActive is active} + * (aka {@linkcode EnemyPokemon.isAllowedInBattle is allowed in battle}), + * or `undefined` if there are no valid pokemon + * @param includeSwitching Whether a pokemon that is currently switching out is valid, default `true` */ - getNonSwitchedEnemyPokemon(): EnemyPokemon | undefined { - return this.getEnemyField().find(p => p.isActive() && p.switchOutStatus === false); + public getEnemyPokemon(includeSwitching = true): EnemyPokemon | undefined { + return this.getEnemyField().find(p => p.isActive() && (includeSwitching || p.switchOutStatus === false)); } /** - * Returns an array of EnemyPokemon of length 1 or 2 depending on if double battles or not + * Returns an array of EnemyPokemon of length 1 or 2 depending on if in a double battle or not. + * Does not actually check if the pokemon are on the field or not. * @returns array of {@linkcode EnemyPokemon} */ - getEnemyField(): EnemyPokemon[] { + public getEnemyField(): EnemyPokemon[] { const party = this.getEnemyParty(); return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); } - getField(activeOnly: boolean = false): Pokemon[] { + /** + * Returns an array of Pokemon on both sides of the battle - player first, then enemy. + * Does not actually check if the pokemon are on the field or not, and always has length 4 regardless of battle type. + * @param activeOnly Whether to consider only active pokemon + * @returns array of {@linkcode Pokemon} + */ + public getField(activeOnly = false): Pokemon[] { const ret = new Array(4).fill(null); const playerField = this.getPlayerField(); const enemyField = this.getEnemyField(); ret.splice(0, playerField.length, ...playerField); ret.splice(2, enemyField.length, ...enemyField); - return activeOnly - ? ret.filter(p => p?.isActive()) - : ret; + return activeOnly ? ret.filter(p => p?.isActive()) : ret; } /** @@ -838,7 +972,13 @@ export default class BattleScene extends SceneBase { if (allyPokemon?.isActive(true)) { let targetingMovePhase: MovePhase; do { - targetingMovePhase = this.findPhase(mp => mp instanceof MovePhase && mp.targets.length === 1 && mp.targets[0] === removedPokemon.getBattlerIndex() && mp.pokemon.isPlayer() !== allyPokemon.isPlayer()) as MovePhase; + targetingMovePhase = this.findPhase( + mp => + mp instanceof MovePhase && + mp.targets.length === 1 && + mp.targets[0] === removedPokemon.getBattlerIndex() && + mp.pokemon.isPlayer() !== allyPokemon.isPlayer(), + ) as MovePhase; if (targetingMovePhase && targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex()) { targetingMovePhase.targets[0] = allyPokemon.getBattlerIndex(); } @@ -861,17 +1001,40 @@ export default class BattleScene extends SceneBase { } // return the stored info toggles; used by ui-inputs - getInfoToggles(activeOnly: boolean = false): InfoToggle[] { + getInfoToggles(activeOnly = false): InfoToggle[] { return activeOnly ? this.infoToggles.filter(t => t?.isActive()) : this.infoToggles; } - getPokemonById(pokemonId: integer): Pokemon | null { + getPokemonById(pokemonId: number): Pokemon | null { const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId); - return (findInParty(this.getParty()) || findInParty(this.getEnemyParty())) ?? null; + return (findInParty(this.getPlayerParty()) || findInParty(this.getEnemyParty())) ?? null; } - addPlayerPokemon(species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData, postProcess?: (playerPokemon: PlayerPokemon) => void): PlayerPokemon { - const pokemon = new PlayerPokemon(this, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); + addPlayerPokemon( + species: PokemonSpecies, + level: number, + abilityIndex?: number, + formIndex?: number, + gender?: Gender, + shiny?: boolean, + variant?: Variant, + ivs?: number[], + nature?: Nature, + dataSource?: Pokemon | PokemonData, + postProcess?: (playerPokemon: PlayerPokemon) => void, + ): PlayerPokemon { + const pokemon = new PlayerPokemon( + species, + level, + abilityIndex, + formIndex, + gender, + shiny, + variant, + ivs, + nature, + dataSource, + ); if (postProcess) { postProcess(pokemon); } @@ -879,7 +1042,15 @@ 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: number, + trainerSlot: TrainerSlot, + boss = false, + shinyLock = false, + dataSource?: PokemonData, + postProcess?: (enemyPokemon: EnemyPokemon) => void, + ): EnemyPokemon { if (Overrides.OPP_LEVEL_OVERRIDE > 0) { level = Overrides.OPP_LEVEL_OVERRIDE; } @@ -889,18 +1060,22 @@ 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(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)); for (let s = 0; s < pokemon.ivs.length; s++) { - pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75)); + pokemon.ivs[s] = Math.round( + Phaser.Math.Linear( + Math.min(pokemon.ivs[s], secondaryIvs[s]), + Math.max(pokemon.ivs[s], secondaryIvs[s]), + 0.75, + ), + ); } } if (postProcess) { @@ -923,7 +1098,7 @@ export default class BattleScene extends SceneBase { * @param pokemon * @param destroy Default true. If true, will destroy the {@linkcode PlayerPokemon} after removing */ - removePokemonFromPlayerParty(pokemon: PlayerPokemon, destroy: boolean = true) { + removePokemonFromPlayerParty(pokemon: PlayerPokemon, destroy = true) { if (!pokemon) { return; } @@ -937,7 +1112,14 @@ export default class BattleScene extends SceneBase { this.updateModifiers(true); } - addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container { + addPokemonIcon( + pokemon: Pokemon, + x: number, + y: number, + originX = 0.5, + originY = 0.5, + ignoreOverride = false, + ): Phaser.GameObjects.Container { const container = this.add.container(x, y); container.setName(`${pokemon.name}-icon`); @@ -967,13 +1149,22 @@ export default class BattleScene extends SceneBase { const originalHeight = icon.height; const originalFrame = icon.frame; - const iconHeight = (icon.frame.cutHeight <= fusionIcon.frame.cutHeight ? Math.ceil : Math.floor)((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4); + const iconHeight = (icon.frame.cutHeight <= fusionIcon.frame.cutHeight ? Math.ceil : Math.floor)( + (icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4, + ); // Inefficient, but for some reason didn't work with only the unique properties as part of the name const iconFrameId = `${icon.frame.name}f${fusionIcon.frame.name}`; if (!icon.frame.texture.has(iconFrameId)) { - icon.frame.texture.add(iconFrameId, icon.frame.sourceIndex, icon.frame.cutX, icon.frame.cutY, icon.frame.cutWidth, iconHeight); + icon.frame.texture.add( + iconFrameId, + icon.frame.sourceIndex, + icon.frame.cutX, + icon.frame.cutY, + icon.frame.cutWidth, + iconHeight, + ); } icon.setFrame(iconFrameId); @@ -989,7 +1180,14 @@ export default class BattleScene extends SceneBase { const fusionIconFrameId = `${fusionIcon.frame.name}f${icon.frame.name}`; if (!fusionIcon.frame.texture.has(fusionIconFrameId)) { - fusionIcon.frame.texture.add(fusionIconFrameId, fusionIcon.frame.sourceIndex, fusionIcon.frame.cutX, fusionIconY, fusionIcon.frame.cutWidth, fusionIconHeight); + fusionIcon.frame.texture.add( + fusionIconFrameId, + fusionIcon.frame.sourceIndex, + fusionIcon.frame.cutX, + fusionIconY, + fusionIcon.frame.cutWidth, + fusionIconHeight, + ); } fusionIcon.setFrame(fusionIconFrameId); @@ -1002,7 +1200,7 @@ export default class BattleScene extends SceneBase { container.x -= originalWidth * (originX - 0.5); } if (originY !== 0) { - container.y -= (originalHeight) * originY; + container.y -= originalHeight * originY; } } else { if (originX !== 0.5) { @@ -1026,20 +1224,20 @@ export default class BattleScene extends SceneBase { /** * Generates a random number using the current battle's seed * - * This calls {@linkcode Battle.randSeedInt}(`scene`, {@linkcode range}, {@linkcode min}) in `src/battle.ts` + * This calls {@linkcode Battle.randSeedInt}({@linkcode range}, {@linkcode min}) in `src/battle.ts` * which calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts` * * @param range How large of a range of random numbers to choose from. If {@linkcode range} <= 1, returns {@linkcode min} * @param min The minimum integer to pick, default `0` * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) */ - randBattleSeedInt(range: integer, min: integer = 0): integer { - return this.currentBattle?.randSeedInt(this, range, min); + randBattleSeedInt(range: number, min = 0): number { + return this.currentBattle?.randSeedInt(range, min); } - reset(clearScene: boolean = false, clearData: boolean = false, reloadI18n: boolean = false): void { + reset(clearScene = false, clearData = false, reloadI18n = false): void { if (clearData) { - this.gameData = new GameData(this); + this.gameData = new GameData(); } this.gameMode = getGameMode(GameModes.CLASSIC); @@ -1051,7 +1249,11 @@ export default class BattleScene extends SceneBase { this.lockModifierTiers = false; - this.pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ])); + this.pokeballCounts = Object.fromEntries( + Utils.getEnumValues(PokeballType) + .filter(p => p <= PokeballType.MASTER_BALL) + .map(t => [t, 0]), + ); this.pokeballCounts[PokeballType.POKEBALL] += 5; if (Overrides.POKEBALL_OVERRIDE.active) { this.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs; @@ -1062,7 +1264,7 @@ export default class BattleScene extends SceneBase { this.modifierBar.removeAll(true); this.enemyModifierBar.removeAll(true); - for (const p of this.getParty()) { + for (const p of this.getPlayerParty()) { p.destroy(); } this.party = []; @@ -1093,7 +1295,7 @@ export default class BattleScene extends SceneBase { this.updateScoreText(); this.scoreText.setVisible(false); - [ this.luckLabelText, this.luckText ].map(t => t.setVisible(false)); + [this.luckLabelText, this.luckText].map(t => t.setVisible(false)); this.newArena(Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN); @@ -1102,7 +1304,8 @@ export default class BattleScene extends SceneBase { this.arenaBgTransition.setPosition(0, 0); this.arenaPlayer.setPosition(300, 0); this.arenaPlayerTransition.setPosition(0, 0); - [ this.arenaEnemy, this.arenaNextEnemy ].forEach(a => a.setPosition(-280, 0)); + this.arenaEnemy.setPosition(-280, 0); + this.arenaNextEnemy.setPosition(-280, 0); this.arenaNextEnemy.setVisible(false); this.arena.init(); @@ -1120,7 +1323,15 @@ export default class BattleScene extends SceneBase { ...allSpecies, ...allMoves, ...allAbilities, - ...Utils.getEnumValues(ModifierPoolType).map(mpt => getModifierPoolForType(mpt)).map(mp => Object.values(mp).flat().map(mt => mt.modifierType).filter(mt => "localize" in mt).map(lpb => lpb as unknown as Localizable)).flat() + ...Utils.getEnumValues(ModifierPoolType) + .map(mpt => getModifierPoolForType(mpt)) + .flatMap(mp => + Object.values(mp) + .flat() + .map(mt => mt.modifierType) + .filter(mt => "localize" in mt) + .map(lpb => lpb as unknown as Localizable), + ), ]; for (const item of localizable) { item.localize(); @@ -1133,31 +1344,42 @@ export default class BattleScene extends SceneBase { this.fadeOutBgm(250, false); this.tweens.add({ - targets: [ this.uiContainer ], + targets: [this.uiContainer], alpha: 0, duration: 250, ease: "Sine.easeInOut", onComplete: () => { this.clearPhaseQueue(); + this.ui.freeUIData(); + this.uiContainer.remove(this.ui, true); + this.uiContainer.destroy(); this.children.removeAll(true); this.game.domContainer.innerHTML = ""; this.launchBattle(); - } + }, }); } } getDoubleBattleChance(newWaveIndex: number, playerField: PlayerPokemon[]) { - const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); + const doubleChance = new Utils.NumberHolder(newWaveIndex % 10 === 0 ? 32 : 8); this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); - playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance)); + for (const p of playerField) { + applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance); + } return Math.max(doubleChance.value, 1); } - newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean, mysteryEncounterType?: MysteryEncounterType): Battle | null { + newBattle( + waveIndex?: number, + battleType?: BattleType, + trainerData?: TrainerData, + double?: boolean, + mysteryEncounterType?: MysteryEncounterType, + ): Battle | null { const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave; - const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1); + const newWaveIndex = waveIndex || (this.currentBattle?.waveIndex || _startingWave - 1) + 1; let newDouble: boolean | undefined; let newBattleType: BattleType; let newTrainer: Trainer | undefined; @@ -1172,7 +1394,10 @@ export default class BattleScene extends SceneBase { battleConfig = this.gameMode.getFixedBattle(newWaveIndex); newDouble = battleConfig.double; newBattleType = battleConfig.battleType; - this.executeWithSeedOffset(() => newTrainer = battleConfig?.getTrainer(this), (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8); + this.executeWithSeedOffset( + () => (newTrainer = battleConfig?.getTrainer()), + (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8, + ); if (newTrainer) { this.field.add(newTrainer); } @@ -1193,12 +1418,19 @@ export default class BattleScene extends SceneBase { } else if (trainerConfigs[trainerType].hasDouble) { doubleTrainer = !Utils.randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); // Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance - if (trainerConfigs[trainerType].trainerTypeDouble && ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType)) { + if ( + trainerConfigs[trainerType].trainerTypeDouble && + ![TrainerType.TATE, TrainerType.LIZA].includes(trainerType) + ) { doubleTrainer = false; } } - const variant = doubleTrainer ? TrainerVariant.DOUBLE : (Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); - newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, variant); + const variant = doubleTrainer + ? TrainerVariant.DOUBLE + : Utils.randSeedInt(2) + ? TrainerVariant.FEMALE + : TrainerVariant.DEFAULT; + newTrainer = trainerData !== undefined ? trainerData.toTrainer() : new Trainer(trainerType, variant); this.field.add(newTrainer); } @@ -1221,33 +1453,70 @@ export default class BattleScene extends SceneBase { newDouble = !!double; } - if (Overrides.BATTLE_TYPE_OVERRIDE === "double") { - newDouble = true; - } - /* Override battles into single only if not fighting with trainers */ - if (newBattleType !== BattleType.TRAINER && Overrides.BATTLE_TYPE_OVERRIDE === "single") { + // Disable double battles on Endless/Endless Spliced Wave 50x boss battles (Introduced 1.2.0) + if (this.gameMode.isEndlessBoss(newWaveIndex)) { newDouble = false; } - const lastBattle = this.currentBattle; + if (!isNullOrUndefined(Overrides.BATTLE_TYPE_OVERRIDE)) { + let doubleOverrideForWave: "single" | "double" | null = null; - if (lastBattle?.double && !newDouble) { - this.tryRemovePhase(p => p instanceof SwitchPhase); + switch (Overrides.BATTLE_TYPE_OVERRIDE) { + case "double": + doubleOverrideForWave = "double"; + break; + case "single": + doubleOverrideForWave = "single"; + break; + case "even-doubles": + doubleOverrideForWave = newWaveIndex % 2 ? "single" : "double"; + break; + case "odd-doubles": + doubleOverrideForWave = newWaveIndex % 2 ? "double" : "single"; + break; + } + + if (doubleOverrideForWave === "double") { + newDouble = true; + } + /** + * Override battles into single only if not fighting with trainers. + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/1948 | GitHub Issue #1948} + */ + if (newBattleType !== BattleType.TRAINER && doubleOverrideForWave === "single") { + newDouble = false; + } } + const lastBattle = this.currentBattle; + const maxExpLevel = this.getMaxExpLevel(); this.lastEnemyTrainer = lastBattle?.trainer ?? null; this.lastMysteryEncounter = lastBattle?.mysteryEncounter; - this.executeWithSeedOffset(() => { - this.currentBattle = new Battle(this.gameMode, newWaveIndex, newBattleType, newTrainer, newDouble); - }, newWaveIndex << 3, this.waveSeed); - this.currentBattle.incrementTurn(this); - if (newBattleType === BattleType.MYSTERY_ENCOUNTER) { // Disable double battle on mystery encounters (it may be re-enabled as part of encounter) - this.currentBattle.double = false; + newDouble = false; + } + + if (lastBattle?.double && !newDouble) { + this.tryRemovePhase(p => p instanceof SwitchPhase); + for (const p of this.getPlayerField()) { + p.lapseTag(BattlerTagType.COMMANDED); + } + } + + this.executeWithSeedOffset( + () => { + this.currentBattle = new Battle(this.gameMode, newWaveIndex, newBattleType, newTrainer, newDouble); + }, + newWaveIndex << 3, + this.waveSeed, + ); + this.currentBattle.incrementTurn(); + + if (newBattleType === BattleType.MYSTERY_ENCOUNTER) { // Will generate the actual Mystery Encounter during NextEncounterPhase, to ensure it uses proper biome this.currentBattle.mysteryEncounterType = mysteryEncounterType; } @@ -1257,47 +1526,64 @@ export default class BattleScene extends SceneBase { if (!waveIndex && lastBattle) { const isWaveIndexMultipleOfTen = !(lastBattle.waveIndex % 10); const isEndlessOrDaily = this.gameMode.hasShortBiomes || this.gameMode.isDaily; - const isEndlessFifthWave = this.gameMode.hasShortBiomes && (lastBattle.waveIndex % 5) === 0; - const isWaveIndexMultipleOfFiftyMinusOne = (lastBattle.waveIndex % 50) === 49; - const isNewBiome = isWaveIndexMultipleOfTen || isEndlessFifthWave || (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne); - const resetArenaState = isNewBiome || [ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(this.currentBattle.battleType) || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; - this.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy()); + const isEndlessFifthWave = this.gameMode.hasShortBiomes && lastBattle.waveIndex % 5 === 0; + const isWaveIndexMultipleOfFiftyMinusOne = lastBattle.waveIndex % 50 === 49; + const isNewBiome = + isWaveIndexMultipleOfTen || isEndlessFifthWave || (isEndlessOrDaily && isWaveIndexMultipleOfFiftyMinusOne); + const resetArenaState = + isNewBiome || + [BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(this.currentBattle.battleType) || + this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; + for (const enemyPokemon of this.getEnemyParty()) { + enemyPokemon.destroy(); + } this.trySpreadPokerus(); - if (!isNewBiome && (newWaveIndex % 10) === 5) { + if (!isNewBiome && newWaveIndex % 10 === 5) { this.arena.updatePoolsForTimeOfDay(); } if (resetArenaState) { this.arena.resetArenaEffects(); + for (const pokemon of playerField) { + pokemon.lapseTag(BattlerTagType.COMMANDED); + } + playerField.forEach((pokemon, p) => { if (pokemon.isOnField()) { - this.pushPhase(new ReturnPhase(this, p)); + this.pushPhase(new ReturnPhase(p)); } }); - for (const pokemon of this.getParty()) { + for (const pokemon of this.getPlayerParty()) { pokemon.resetBattleData(); + pokemon.resetTera(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); + if ( + pokemon.hasSpecies(Species.TERAPAGOS) || + (this.gameMode.isClassic && this.currentBattle.waveIndex > 180 && this.currentBattle.waveIndex <= 190) + ) { + this.arena.playerTerasUsed = 0; + } } if (!this.trainer.visible) { - this.pushPhase(new ShowTrainerPhase(this)); + this.pushPhase(new ShowTrainerPhase()); } } - for (const pokemon of this.getParty()) { + for (const pokemon of this.getPlayerParty()) { this.triggerPokemonFormChange(pokemon, SpeciesFormChangeTimeOfDayTrigger); } if (!this.gameMode.hasRandomBiomes && !isNewBiome) { - this.pushPhase(new NextEncounterPhase(this)); + this.pushPhase(new NextEncounterPhase()); } else { - this.pushPhase(new SelectBiomePhase(this)); - this.pushPhase(new NewBiomeEncounterPhase(this)); + this.pushPhase(new SelectBiomePhase()); + this.pushPhase(new NewBiomeEncounterPhase()); const newMaxExpLevel = this.getMaxExpLevel(); if (newMaxExpLevel > maxExpLevel) { - this.pushPhase(new LevelCapPhase(this)); + this.pushPhase(new LevelCapPhase()); } } } @@ -1305,26 +1591,34 @@ export default class BattleScene extends SceneBase { return this.currentBattle; } - newArena(biome: Biome): Arena { - this.arena = new Arena(this, biome, Biome[biome].toLowerCase()); + newArena(biome: Biome, playerFaints?: number): Arena { + this.arena = new Arena(biome, Biome[biome].toLowerCase(), playerFaints); this.eventTarget.dispatchEvent(new NewArenaEvent()); - this.arenaBg.pipelineData = { terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome() }; + this.arenaBg.pipelineData = { + terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome(), + }; return this.arena; } updateFieldScale(): Promise { return new Promise(resolve => { - const fieldScale = Math.floor(Math.pow(1 / this.getField(true) - .map(p => p.getSpriteScale()) - .reduce((highestScale: number, scale: number) => highestScale = Math.max(scale, highestScale), 0), 0.7) * 40 - ) / 40; + const fieldScale = + Math.floor( + Math.pow( + 1 / + this.getField(true) + .map(p => p.getSpriteScale()) + .reduce((highestScale: number, scale: number) => (highestScale = Math.max(scale, highestScale)), 0), + 0.7, + ) * 40, + ) / 40; this.setFieldScale(fieldScale).then(() => resolve()); }); } - setFieldScale(scale: number, instant: boolean = false): Promise { + setFieldScale(scale: number, instant = false): Promise { return new Promise(resolve => { scale *= 6; if (this.field.scale === scale) { @@ -1343,16 +1637,79 @@ export default class BattleScene extends SceneBase { y: defaultHeight - scaledHeight, duration: !instant ? Utils.fixedInt(Math.abs(this.field.scale - scale) * 200) : 0, ease: "Sine.easeInOut", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } - getSpeciesFormIndex(species: PokemonSpecies, gender?: Gender, nature?: Nature, ignoreArena?: boolean): integer { + getSpeciesFormIndex(species: PokemonSpecies, gender?: Gender, nature?: Nature, ignoreArena?: boolean): number { if (!species.forms?.length) { return 0; } + const isEggPhase: boolean = ["EggLapsePhase", "EggHatchPhase"].includes( + this.getCurrentPhase()?.constructor.name ?? "", + ); + + if ( + // Give trainers with specialty types an appropriately-typed form for Wormadam, Rotom, Arceus, Oricorio, Silvally, or Paldean Tauros. + !isEggPhase && + this.currentBattle?.battleType === BattleType.TRAINER && + !isNullOrUndefined(this.currentBattle.trainer) && + this.currentBattle.trainer.config.hasSpecialtyType() + ) { + if (species.speciesId === Species.WORMADAM) { + switch (this.currentBattle.trainer.config.specialtyType) { + case PokemonType.GROUND: + return 1; // Sandy Cloak + case PokemonType.STEEL: + return 2; // Trash Cloak + case PokemonType.GRASS: + return 0; // Plant Cloak + } + } + if (species.speciesId === Species.ROTOM) { + switch (this.currentBattle.trainer.config.specialtyType) { + case PokemonType.FLYING: + return 4; // Fan Rotom + case PokemonType.GHOST: + return 0; // Lightbulb Rotom + case PokemonType.FIRE: + return 1; // Heat Rotom + case PokemonType.GRASS: + return 5; // Mow Rotom + case PokemonType.WATER: + return 2; // Wash Rotom + case PokemonType.ICE: + return 3; // Frost Rotom + } + } + if (species.speciesId === Species.ORICORIO) { + switch (this.currentBattle.trainer.config.specialtyType) { + case PokemonType.GHOST: + return 3; // Sensu Style + case PokemonType.FIRE: + return 0; // Baile Style + case PokemonType.ELECTRIC: + return 1; // Pom-Pom Style + case PokemonType.PSYCHIC: + return 2; // Pa'u Style + } + } + if (species.speciesId === Species.PALDEA_TAUROS) { + switch (this.currentBattle.trainer.config.specialtyType) { + case PokemonType.FIRE: + return 1; // Blaze Breed + case PokemonType.WATER: + return 2; // Aqua Breed + } + } + if (species.speciesId === Species.SILVALLY || species.speciesId === Species.ARCEUS) { + // Would probably never happen, but might as well + return this.currentBattle.trainer.config.specialtyType; + } + } + switch (species.speciesId) { case Species.UNOWN: case Species.SHELLOS: @@ -1360,8 +1717,6 @@ export default class BattleScene extends SceneBase { case Species.BASCULIN: case Species.DEERLING: case Species.SAWSBUCK: - case Species.FROAKIE: - case Species.FROGADIER: case Species.SCATTERBUG: case Species.SPEWPA: case Species.VIVILLON: @@ -1379,10 +1734,27 @@ export default class BattleScene extends SceneBase { case Species.PALDEA_TAUROS: return Utils.randSeedInt(species.forms.length); case Species.PIKACHU: + if (this.currentBattle?.battleType === BattleType.TRAINER && this.currentBattle?.waveIndex < 30) { + return 0; // Ban Cosplay and Partner Pika from Trainers before wave 30 + } return Utils.randSeedInt(8); case Species.EEVEE: + if ( + this.currentBattle?.battleType === BattleType.TRAINER && + this.currentBattle?.waveIndex < 30 && + !isEggPhase + ) { + return 0; // No Partner Eevee for Wave 12 Preschoolers + } return Utils.randSeedInt(2); + case Species.FROAKIE: + case Species.FROGADIER: case Species.GRENINJA: + if (this.currentBattle?.battleType === BattleType.TRAINER && !isEggPhase) { + return 0; // Don't give trainers Battle Bond Greninja, Froakie or Frogadier + } + return Utils.randSeedInt(2); + case Species.URSHIFU: return Utils.randSeedInt(2); case Species.ZYGARDE: return Utils.randSeedInt(4); @@ -1395,19 +1767,32 @@ export default class BattleScene extends SceneBase { case Species.BASCULEGION: case Species.OINKOLOGNE: return gender === Gender.FEMALE ? 1 : 0; - case Species.TOXTRICITY: - const lowkeyNatures = [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ]; + case Species.TOXTRICITY: { + const lowkeyNatures = [ + Nature.LONELY, + Nature.BOLD, + Nature.RELAXED, + Nature.TIMID, + Nature.SERIOUS, + Nature.MODEST, + Nature.MILD, + Nature.QUIET, + Nature.BASHFUL, + Nature.CALM, + Nature.GENTLE, + Nature.CAREFUL, + ]; if (nature !== undefined && lowkeyNatures.indexOf(nature) > -1) { return 1; } return 0; + } case Species.GIMMIGHOUL: - // Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs - if (this.gameMode.hasMysteryEncounters) { + // Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs + if (this.gameMode.hasMysteryEncounters && !isEggPhase) { return 1; // Wandering form - } else { - return Utils.randSeedInt(species.forms.length); } + return Utils.randSeedInt(species.forms.length); } if (ignoreArena) { @@ -1426,24 +1811,33 @@ export default class BattleScene extends SceneBase { private getGeneratedOffsetGym(): boolean { let ret = false; - this.executeWithSeedOffset(() => { - ret = !Utils.randSeedInt(2); - }, 0, this.seed.toString()); + this.executeWithSeedOffset( + () => { + ret = !Utils.randSeedInt(2); + }, + 0, + this.seed.toString(), + ); return ret; } - private getGeneratedWaveCycleOffset(): integer { + private getGeneratedWaveCycleOffset(): number { let ret = 0; - this.executeWithSeedOffset(() => { - ret = Utils.randSeedInt(8) * 5; - }, 0, this.seed.toString()); + this.executeWithSeedOffset( + () => { + ret = Utils.randSeedInt(8) * 5; + }, + 0, + this.seed.toString(), + ); return ret; } - getEncounterBossSegments(waveIndex: integer, level: integer, species?: PokemonSpecies, forceBoss: boolean = false): integer { + getEncounterBossSegments(waveIndex: number, level: number, species?: PokemonSpecies, forceBoss = false): number { if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1) { return Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE; - } else if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) { + } + if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) { // The rest of the code expects to be returned 0 and not 1 if the enemy is not a boss return 0; } @@ -1457,14 +1851,17 @@ export default class BattleScene extends SceneBase { isBoss = true; } else { this.executeWithSeedOffset(() => { - isBoss = waveIndex % 10 === 0 || (this.gameMode.hasRandomBosses && Utils.randSeedInt(100) < Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); + isBoss = + waveIndex % 10 === 0 || + (this.gameMode.hasRandomBosses && + Utils.randSeedInt(100) < Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); }, waveIndex << 2); } if (!isBoss) { return 0; } - let ret: integer = 2; + let ret = 2; if (level >= 100) { ret++; @@ -1480,8 +1877,8 @@ export default class BattleScene extends SceneBase { } trySpreadPokerus(): void { - const party = this.getParty(); - const infectedIndexes: integer[] = []; + const party = this.getPlayerParty(); + const infectedIndexes: number[] = []; const spread = (index: number, spreadTo: number) => { const partyMember = party[index + spreadTo]; if (!partyMember.pokerus && !Utils.randSeedInt(10)) { @@ -1494,26 +1891,34 @@ export default class BattleScene extends SceneBase { return; } - this.executeWithSeedOffset(() => { - if (p) { - spread(p, -1); - } - if (p < party.length - 1) { - spread(p, 1); - } - }, this.currentBattle.waveIndex + (p << 8)); + this.executeWithSeedOffset( + () => { + if (p) { + spread(p, -1); + } + if (p < party.length - 1) { + spread(p, 1); + } + }, + this.currentBattle.waveIndex + (p << 8), + ); }); } - resetSeed(waveIndex?: integer): void { + resetSeed(waveIndex?: number): void { const wave = waveIndex || this.currentBattle?.waveIndex || 0; this.waveSeed = Utils.shiftCharCodes(this.seed, wave); - Phaser.Math.RND.sow([ this.waveSeed ]); + Phaser.Math.RND.sow([this.waveSeed]); console.log("Wave Seed:", this.waveSeed, wave); this.rngCounter = 0; } - executeWithSeedOffset(func: Function, offset: integer, seedOverride?: string): void { + executeWithSeedOffset( + // biome-ignore lint/complexity/noBannedTypes: Refactor to not use Function + func: Function, + offset: number, + seedOverride?: string, + ): void { if (!func) { return; } @@ -1521,7 +1926,7 @@ export default class BattleScene extends SceneBase { const tempRngOffset = this.rngOffset; const tempRngSeedOverride = this.rngSeedOverride; const state = Phaser.Math.RND.state(); - Phaser.Math.RND.sow([ Utils.shiftCharCodes(seedOverride || this.seed, offset) ]); + Phaser.Math.RND.sow([Utils.shiftCharCodes(seedOverride || this.seed, offset)]); this.rngCounter = 0; this.rngOffset = offset; this.rngSeedOverride = seedOverride || ""; @@ -1532,7 +1937,13 @@ export default class BattleScene extends SceneBase { this.rngSeedOverride = tempRngSeedOverride; } - addFieldSprite(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, terrainColorRatio: number = 0): Phaser.GameObjects.Sprite { + addFieldSprite( + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + terrainColorRatio = 0, + ): Phaser.GameObjects.Sprite { const ret = this.add.sprite(x, y, texture, frame); ret.setPipeline(this.fieldSpritePipeline); if (terrainColorRatio) { @@ -1542,14 +1953,33 @@ export default class BattleScene extends SceneBase { return ret; } - addPokemonSprite(pokemon: Pokemon, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { + addPokemonSprite( + pokemon: Pokemon, + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + hasShadow = false, + ignoreOverride = false, + ): Phaser.GameObjects.Sprite { const ret = this.addFieldSprite(x, y, texture, frame); this.initPokemonSprite(ret, pokemon, hasShadow, ignoreOverride); return ret; } - initPokemonSprite(sprite: Phaser.GameObjects.Sprite, pokemon?: Pokemon, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { - sprite.setPipeline(this.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined }); + initPokemonSprite( + sprite: Phaser.GameObjects.Sprite, + pokemon?: Pokemon, + hasShadow = false, + ignoreOverride = false, + ): Phaser.GameObjects.Sprite { + sprite.setPipeline(this.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: hasShadow, + ignoreOverride: ignoreOverride, + teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined, + isTerastallized: pokemon ? pokemon.isTerastallized : false, + }); this.spriteSparkleHandler.add(sprite); return sprite; } @@ -1561,26 +1991,26 @@ export default class BattleScene extends SceneBase { this.arenaFlyout.toggleFlyout(pressed); } - showFieldOverlay(duration: integer): Promise { + showFieldOverlay(duration: number): Promise { return new Promise(resolve => { this.tweens.add({ targets: this.fieldOverlay, alpha: 0.5, ease: "Sine.easeOut", duration: duration, - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } - hideFieldOverlay(duration: integer): Promise { + hideFieldOverlay(duration: number): Promise { return new Promise(resolve => { this.tweens.add({ targets: this.fieldOverlay, alpha: 0, duration: duration, ease: "Cubic.easeIn", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } @@ -1593,7 +2023,7 @@ export default class BattleScene extends SceneBase { } } - showShopOverlay(duration: integer): Promise { + showShopOverlay(duration: number): Promise { this.shopOverlayShown = true; return new Promise(resolve => { this.tweens.add({ @@ -1601,12 +2031,12 @@ export default class BattleScene extends SceneBase { alpha: this.shopOverlayOpacity, ease: "Sine.easeOut", duration, - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } - hideShopOverlay(duration: integer): Promise { + hideShopOverlay(duration: number): Promise { this.shopOverlayShown = false; return new Promise(resolve => { this.tweens.add({ @@ -1614,7 +2044,7 @@ export default class BattleScene extends SceneBase { alpha: 0, duration: duration, ease: "Cubic.easeIn", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } @@ -1631,13 +2061,13 @@ export default class BattleScene extends SceneBase { const isBoss = !(this.currentBattle.waveIndex % 10); const biomeString: string = getBiomeName(this.arena.biomeType); this.fieldUI.moveAbove(this.biomeWaveText, this.luckText); - this.biomeWaveText.setText( biomeString + " - " + this.currentBattle.waveIndex.toString()); + this.biomeWaveText.setText(biomeString + " - " + this.currentBattle.waveIndex.toString()); this.biomeWaveText.setColor(!isBoss ? "#ffffff" : "#f89890"); this.biomeWaveText.setShadowColor(!isBoss ? "#636363" : "#984038"); this.biomeWaveText.setVisible(true); } - updateMoneyText(forceVisible: boolean = true): void { + updateMoneyText(forceVisible = true): void { if (this.money === undefined) { return; } @@ -1661,7 +2091,7 @@ export default class BattleScene extends SceneBase { scale: this.moneyText.scale + deltaScale, loop: 0, yoyo: true, - onComplete: (_) => this.moneyText.setShadowColor(getTextColor(TextStyle.MONEY, true)), + onComplete: _ => this.moneyText.setShadowColor(getTextColor(TextStyle.MONEY, true)), }); } @@ -1675,50 +2105,60 @@ export default class BattleScene extends SceneBase { * @param duration The time for this label to fade in, if it is not already visible. */ updateAndShowText(duration: number): void { - const labels = [ this.luckLabelText, this.luckText ]; - labels.forEach(t => t.setAlpha(0)); - const luckValue = getPartyLuckValue(this.getParty()); + const labels = [this.luckLabelText, this.luckText]; + for (const label of labels) { + label.setAlpha(0); + } + const luckValue = getPartyLuckValue(this.getPlayerParty()); this.luckText.setText(getLuckString(luckValue)); if (luckValue < 14) { this.luckText.setTint(getLuckTextTint(luckValue)); } else { this.luckText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); } - this.luckLabelText.setX((this.game.canvas.width / 6) - 2 - (this.luckText.displayWidth + 2)); + this.luckLabelText.setX(this.game.canvas.width / 6 - 2 - (this.luckText.displayWidth + 2)); this.tweens.add({ targets: labels, duration: duration, alpha: 1, onComplete: () => { - labels.forEach(t => t.setVisible(true)); - } + for (const label of labels) { + label.setVisible(true); + } + }, }); } - hideLuckText(duration: integer): void { + hideLuckText(duration: number): void { if (this.reroll) { return; } - const labels = [ this.luckLabelText, this.luckText ]; + const labels = [this.luckLabelText, this.luckText]; this.tweens.add({ targets: labels, duration: duration, alpha: 0, onComplete: () => { - labels.forEach(l => l.setVisible(false)); - } + for (const label of labels) { + label.setVisible(false); + } + }, }); } updateUIPositions(): void { - const enemyModifierCount = this.enemyModifiers.filter(m => m.isIconVisible(this)).length; + const enemyModifierCount = this.enemyModifiers.filter(m => m.isIconVisible()).length; const biomeWaveTextHeight = this.biomeWaveText.getBottomLeft().y - this.biomeWaveText.getTopLeft().y; this.biomeWaveText.setY( - -(this.game.canvas.height / 6) + (enemyModifierCount ? enemyModifierCount <= 12 ? 15 : 24 : 0) + (biomeWaveTextHeight / 2) + -(this.game.canvas.height / 6) + + (enemyModifierCount ? (enemyModifierCount <= 12 ? 15 : 24) : 0) + + biomeWaveTextHeight / 2, ); this.moneyText.setY(this.biomeWaveText.y + 10); this.scoreText.setY(this.moneyText.y + 10); - [ this.luckLabelText, this.luckText ].map(l => l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10)); + [this.luckLabelText, this.luckText].map(l => + l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10), + ); const offsetY = (this.scoreText.visible ? this.scoreText : this.moneyText).y + 15; this.partyExpBar.setY(offsetY); this.candyBar.setY(offsetY + 15); @@ -1735,16 +2175,24 @@ export default class BattleScene extends SceneBase { } addFaintedEnemyScore(enemy: EnemyPokemon): void { - let scoreIncrease = enemy.getSpeciesForm().getBaseExp() * (enemy.level / this.getMaxExpLevel()) * ((enemy.ivs.reduce((iv: integer, total: integer) => total += iv, 0) / 93) * 0.2 + 0.8); - this.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, false).map(m => scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()); + let scoreIncrease = + enemy.getSpeciesForm().getBaseExp() * + (enemy.level / this.getMaxExpLevel()) * + ((enemy.ivs.reduce((iv: number, total: number) => (total += iv), 0) / 93) * 0.2 + 0.8); + this.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, false).map( + m => (scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()), + ); if (enemy.isBoss()) { scoreIncrease *= Math.sqrt(enemy.bossSegments); } this.currentBattle.battleScore += Math.ceil(scoreIncrease); } - getMaxExpLevel(ignoreLevelCap?: boolean): integer { - if (ignoreLevelCap) { + getMaxExpLevel(ignoreLevelCap = false): number { + if (Overrides.LEVEL_CAP_OVERRIDE > 0) { + return Overrides.LEVEL_CAP_OVERRIDE; + } + if (ignoreLevelCap || Overrides.LEVEL_CAP_OVERRIDE < 0) { return Number.MAX_SAFE_INTEGER; } const waveIndex = Math.ceil((this.currentBattle?.waveIndex || 1) / 10) * 10; @@ -1753,28 +2201,44 @@ export default class BattleScene extends SceneBase { return Math.ceil(baseLevel / 2) * 2 + 2; } - randomSpecies(waveIndex: integer, level: integer, fromArenaPool?: boolean, speciesFilter?: PokemonSpeciesFilter, filterAllEvolutions?: boolean): PokemonSpecies { + randomSpecies( + waveIndex: number, + level: number, + fromArenaPool?: boolean, + speciesFilter?: PokemonSpeciesFilter, + filterAllEvolutions?: boolean, + ): PokemonSpecies { if (fromArenaPool) { return this.arena.randomSpecies(waveIndex, level, undefined, getPartyLuckValue(this.party)); } - const filteredSpecies = speciesFilter ? [ ...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => { - if (!filterAllEvolutions) { - while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) { - s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); - } - } - return s; - })) ] : allSpecies.filter(s => s.isCatchable()); + const filteredSpecies = speciesFilter + ? [ + ...new Set( + allSpecies + .filter(s => s.isCatchable()) + .filter(speciesFilter) + .map(s => { + if (!filterAllEvolutions) { + while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) { + s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); + } + } + return s; + }), + ), + ] + : allSpecies.filter(s => s.isCatchable()); return filteredSpecies[Utils.randSeedInt(filteredSpecies.length)]; } - generateRandomBiome(waveIndex: integer): Biome { + generateRandomBiome(waveIndex: number): Biome { const relWave = waveIndex % 250; - const biomes = Utils.getEnumValues(Biome).slice(1, Utils.getEnumValues(Biome).filter(b => b >= 40).length * -1); + const biomes = Utils.getEnumValues(Biome).filter(b => b !== Biome.TOWN && b !== Biome.END); const maxDepth = biomeDepths[Biome.END][0] - 2; - const depthWeights = new Array(maxDepth + 1).fill(null) - .map((_, i: integer) => ((1 - Math.min(Math.abs((i / (maxDepth - 1)) - (relWave / 250)) + 0.25, 1)) / 0.75) * 250); - const biomeThresholds: integer[] = []; + const depthWeights = new Array(maxDepth + 1) + .fill(null) + .map((_, i: number) => ((1 - Math.min(Math.abs(i / (maxDepth - 1) - relWave / 250) + 0.25, 1)) / 0.75) * 250); + const biomeThresholds: number[] = []; let totalWeight = 0; for (const biome of biomes) { totalWeight += Math.ceil(depthWeights[biomeDepths[biome][0] - 1] / biomeDepths[biome][1]); @@ -1783,9 +2247,9 @@ export default class BattleScene extends SceneBase { const randInt = Utils.randSeedInt(totalWeight); - for (const biome of biomes) { - if (randInt < biomeThresholds[biome]) { - return biome; + for (let i = 0; i < biomes.length; i++) { + if (randInt < biomeThresholds[i]) { + return biomes[i]; } } @@ -1793,17 +2257,17 @@ export default class BattleScene extends SceneBase { } isBgmPlaying(): boolean { - return this.bgm && this.bgm.isPlaying; + return this.bgm?.isPlaying ?? false; } playBgm(bgmName?: string, fadeOut?: boolean): void { if (bgmName === undefined) { - bgmName = this.currentBattle?.getBgmOverride(this) || this.arena?.bgm; + bgmName = this.currentBattle?.getBgmOverride() || this.arena?.bgm; } if (this.bgm && bgmName === this.bgm.key) { if (!this.bgm.isPlaying) { this.bgm.play({ - volume: this.masterVolume * this.bgmVolume + volume: this.masterVolume * this.bgmVolume, }); } return; @@ -1814,15 +2278,13 @@ export default class BattleScene extends SceneBase { this.bgmCache.add(bgmName); this.loadBgm(bgmName); let loopPoint = 0; - loopPoint = bgmName === this.arena.bgm - ? this.arena.getBgmLoopPoint() - : this.getBgmLoopPoint(bgmName); + loopPoint = bgmName === this.arena.bgm ? this.arena.getBgmLoopPoint() : this.getBgmLoopPoint(bgmName); let loaded = false; const playNewBgm = () => { this.ui.bgmBar.setBgmToBgmBar(bgmName); if (bgmName === null && this.bgm && !this.bgm.pendingRemove) { this.bgm.play({ - volume: this.masterVolume * this.bgmVolume + volume: this.masterVolume * this.bgmVolume, }); return; } @@ -1831,7 +2293,7 @@ export default class BattleScene extends SceneBase { } this.bgm = this.sound.add(bgmName, { loop: true }); this.bgm.play({ - volume: this.masterVolume * this.bgmVolume + volume: this.masterVolume * this.bgmVolume, }); if (loopPoint) { this.bgm.on("looped", () => this.bgm.play({ seek: loopPoint })); @@ -1880,7 +2342,6 @@ export default class BattleScene extends SceneBase { } else { const soundDetails = sound.key.split("/"); switch (soundDetails[0]) { - case "battle_anims": case "cry": if (soundDetails[1].startsWith("PRSFX- ")) { @@ -1898,7 +2359,7 @@ export default class BattleScene extends SceneBase { } } - fadeOutBgm(duration: integer = 500, destroy: boolean = true): boolean { + fadeOutBgm(duration = 500, destroy = true): boolean { if (!this.bgm) { return false; } @@ -1917,7 +2378,7 @@ export default class BattleScene extends SceneBase { * @param destroy * @param delay */ - fadeAndSwitchBgm(newBgmKey: string, destroy: boolean = false, delay: number = 2000) { + fadeAndSwitchBgm(newBgmKey: string, destroy = false, delay = 2000) { this.fadeOutBgm(delay, destroy); this.time.delayedCall(delay, () => { this.playBgm(newBgmKey); @@ -1937,24 +2398,24 @@ export default class BattleScene extends SceneBase { case "heal": case "evolution": case "evolution_fanfare": - // These sounds are loaded in as BGM, but played as sound effects - // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() - config["volume"] *= (this.masterVolume * this.bgmVolume); + // These sounds are loaded in as BGM, but played as sound effects + // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() + config["volume"] *= this.masterVolume * this.bgmVolume; break; case "battle_anims": case "cry": - config["volume"] *= (this.masterVolume * this.fieldVolume); + config["volume"] *= this.masterVolume * this.fieldVolume; //PRSFX sound files are unusually loud if (keyDetails[1].startsWith("PRSFX- ")) { config["volume"] *= 0.5; } break; case "ui": - //As of, right now this applies to the "select", "menu_open", "error" sound effects - config["volume"] *= (this.masterVolume * this.uiVolume); + //As of, right now this applies to the "select", "menu_open", "error" sound effects + config["volume"] *= this.masterVolume * this.uiVolume; break; case "se": - config["volume"] *= (this.masterVolume * this.seVolume); + config["volume"] *= this.masterVolume * this.seVolume; break; } this.sound.play(key, config); @@ -1965,7 +2426,7 @@ export default class BattleScene extends SceneBase { } } - playSoundWithoutBgm(soundName: string, pauseDuration?: integer): AnySound { + playSoundWithoutBgm(soundName: string, pauseDuration?: number): AnySound { this.bgmCache.add(soundName); const resumeBgm = this.pauseBgm(); this.playSound(soundName); @@ -1974,7 +2435,7 @@ export default class BattleScene extends SceneBase { this.bgmResumeTimer.destroy(); } if (resumeBgm) { - this.bgmResumeTimer = this.time.delayedCall((pauseDuration || Utils.fixedInt(sound.totalDuration * 1000)), () => { + this.bgmResumeTimer = this.time.delayedCall(pauseDuration || Utils.fixedInt(sound.totalDuration * 1000), () => { this.resumeBgm(); this.bgmResumeTimer = null; }); @@ -1982,10 +2443,13 @@ export default class BattleScene extends SceneBase { return sound; } + /** The loop point of any given battle, mystery encounter, or title track, read as seconds and milliseconds. */ getBgmLoopPoint(bgmName: string): number { switch (bgmName) { + case "title": //Firel PokéRogue Title + return 46.5; case "battle_kanto_champion": //B2W2 Kanto Champion Battle - return 13.950; + return 13.95; case "battle_johto_champion": //B2W2 Johto Champion Battle return 23.498; case "battle_hoenn_champion_g5": //B2W2 Hoenn Champion Battle @@ -1999,11 +2463,15 @@ export default class BattleScene extends SceneBase { case "battle_champion_iris": //B2W2 Unova Champion Battle return 10.145; case "battle_kalos_champion": //XY Kalos Champion Battle - return 10.380; + return 10.38; + case "battle_champion_kukui": //SM Kukui Battle + return 15.784; case "battle_alola_champion": //USUM Alola Champion Battle return 13.025; case "battle_galar_champion": //SWSH Galar Champion Battle return 61.635; + case "battle_mustard": //SWSH Mustard Battle + return 22.442; case "battle_champion_geeta": //SV Champion Geeta Battle return 37.447; case "battle_champion_nemona": //SV Champion Nemona Battle @@ -2011,17 +2479,17 @@ export default class BattleScene extends SceneBase { case "battle_champion_kieran": //SV Champion Kieran Battle return 7.206; case "battle_hoenn_elite": //ORAS Elite Four Battle - return 11.350; + return 11.35; case "battle_unova_elite": //BW Elite Four Battle - return 17.730; + return 17.73; case "battle_kalos_elite": //XY Elite Four Battle - return 12.340; + return 12.34; case "battle_alola_elite": //SM Elite Four Battle return 19.212; case "battle_galar_elite": //SWSH League Tournament Battle return 164.069; case "battle_paldea_elite": //SV Elite Four Battle - return 12.770; + return 12.77; case "battle_bb_elite": //SV BB League Elite Four Battle return 19.434; case "battle_final_encounter": //PMD RTDX Rayquaza's Domain @@ -2039,7 +2507,7 @@ export default class BattleScene extends SceneBase { case "battle_unova_gym": //BW Unova Gym Battle return 19.145; case "battle_kalos_gym": //XY Kalos Gym Battle - return 44.810; + return 44.81; case "battle_galar_gym": //SWSH Galar Gym Battle return 171.262; case "battle_paldea_gym": //SV Paldea Gym Battle @@ -2053,13 +2521,13 @@ export default class BattleScene extends SceneBase { case "battle_legendary_suicune": //HGSS Suicune Battle return 12.636; case "battle_legendary_lugia": //HGSS Lugia Battle - return 19.770; + return 19.77; case "battle_legendary_ho_oh": //HGSS Ho-oh Battle return 17.668; case "battle_legendary_regis_g5": //B2W2 Legendary Titan Battle - return 49.500; + return 49.5; case "battle_legendary_regis_g6": //ORAS Legendary Titan Battle - return 21.130; + return 21.13; case "battle_legendary_gro_kyo": //ORAS Groudon & Kyogre Battle return 10.547; case "battle_legendary_rayquaza": //ORAS Rayquaza Battle @@ -2069,7 +2537,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_lake_trio": //ORAS Lake Guardians Battle return 16.887; case "battle_legendary_sinnoh": //ORAS Sinnoh Legendary Battle - return 22.770; + return 22.77; case "battle_legendary_dia_pal": //ORAS Dialga & Palkia Battle return 16.009; case "battle_legendary_origin_forme": //LA Origin Dialga & Palkia Battle @@ -2087,7 +2555,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_xern_yvel": //XY Xerneas & Yveltal Battle return 26.468; case "battle_legendary_tapu": //SM Tapu Battle - return 0.000; + return 0.0; case "battle_legendary_sol_lun": //SM Solgaleo & Lunala Battle return 6.525; case "battle_legendary_ub": //SM Ultra Beast Battle @@ -2111,7 +2579,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_kor_mir": //SV Depths of Area Zero Battle return 6.442; case "battle_legendary_loyal_three": //SV Loyal Three Battle - return 6.500; + return 6.5; case "battle_legendary_ogerpon": //SV Ogerpon Battle return 14.335; case "battle_legendary_terapagos": //SV Terapagos Battle @@ -2119,7 +2587,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_pecharunt": //SV Pecharunt Battle return 6.508; case "battle_rival": //BW Rival Battle - return 14.110; + return 14.11; case "battle_rival_2": //BW N Battle return 17.714; case "battle_rival_3": //BW Final N Battle @@ -2129,7 +2597,7 @@ export default class BattleScene extends SceneBase { case "battle_wild": //BW Wild Battle return 12.703; case "battle_wild_strong": //BW Strong Wild Battle - return 13.940; + return 13.94; case "end_summit": //PMD RTDX Sky Tower Summit return 30.025; case "battle_rocket_grunt": //HGSS Team Rocket Battle @@ -2138,12 +2606,12 @@ export default class BattleScene extends SceneBase { return 12.062; case "battle_galactic_grunt": //BDSP Team Galactic Battle return 13.043; - case "battle_plasma_grunt": //BW Team Plasma Battle - return 12.974; + case "battle_plasma_grunt": //B2W2 Team Plasma Battle + return 14.758; case "battle_flare_grunt": //XY Team Flare Battle return 4.228; case "battle_aether_grunt": // SM Aether Foundation Battle - return 16.00; + return 16.0; case "battle_skull_grunt": // SM Team Skull Battle return 20.87; case "battle_macro_grunt": // SWSH Trainer Battle @@ -2152,10 +2620,12 @@ export default class BattleScene extends SceneBase { return 133.362; case "battle_galactic_admin": //BDSP Team Galactic Admin Battle return 11.997; + case "battle_colress": //B2W2 Colress Battle + return 12.234; case "battle_skull_admin": //SM Team Skull Admin Battle return 15.463; case "battle_oleana": //SWSH Oleana Battle - return 14.110; + return 14.11; case "battle_star_admin": //SV Team Star Boss Battle return 9.493; case "battle_rocket_boss": //USUM Giovanni Battle @@ -2208,7 +2678,6 @@ export default class BattleScene extends SceneBase { return this.standbyPhase; } - /** * Adds a phase to the conditional queue and ensures it is executed only when the specified condition is met. * @@ -2220,7 +2689,7 @@ export default class BattleScene extends SceneBase { * */ pushConditionalPhase(phase: Phase, condition: () => boolean): void { - this.conditionalQueue.push([ condition, phase ]); + this.conditionalQueue.push([condition, phase]); } /** @@ -2228,19 +2697,19 @@ export default class BattleScene extends SceneBase { * @param phase {@linkcode Phase} the phase to add * @param defer boolean on which queue to add to, defaults to false, and adds to phaseQueue */ - pushPhase(phase: Phase, defer: boolean = false): void { + pushPhase(phase: Phase, defer = false): void { (!defer ? this.phaseQueue : this.nextCommandPhaseQueue).push(phase); } /** - * Adds Phase to the end of phaseQueuePrepend, or at phaseQueuePrependSpliceIndex - * @param phase {@linkcode Phase} the phase to add + * Adds Phase(s) to the end of phaseQueuePrepend, or at phaseQueuePrependSpliceIndex + * @param phases {@linkcode Phase} the phase(s) to add */ - unshiftPhase(phase: Phase): void { + unshiftPhase(...phases: Phase[]): void { if (this.phaseQueuePrependSpliceIndex === -1) { - this.phaseQueuePrepend.push(phase); + this.phaseQueuePrepend.push(...phases); } else { - this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, phase); + this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, ...phases); } } @@ -2378,16 +2847,38 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in phaseQueue * @returns boolean if a targetPhase was found and added */ - prependToPhase(phase: Phase, targetPhase: Constructor): boolean { + prependToPhase(phase: Phase | Phase[], targetPhase: Constructor): boolean { + if (!Array.isArray(phase)) { + phase = [phase]; + } const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); if (targetIndex !== -1) { - this.phaseQueue.splice(targetIndex, 0, phase); + this.phaseQueue.splice(targetIndex, 0, ...phase); return true; - } else { - this.unshiftPhase(phase); - return false; } + this.unshiftPhase(...phase); + return false; + } + + /** + * Tries to add the input phase(s) to index after target phase in the {@linkcode phaseQueue}, else simply calls {@linkcode unshiftPhase()} + * @param phase {@linkcode Phase} the phase(s) 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 | Phase[], targetPhase: Constructor): boolean { + if (!Array.isArray(phase)) { + phase = [phase]; + } + 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; + } + this.unshiftPhase(...phase); + return false; } /** @@ -2398,8 +2889,14 @@ export default class BattleScene extends SceneBase { * @param promptDelay optional param for MessagePhase constructor * @param defer boolean for which queue to add it to, false -> add to PhaseQueuePrepend, true -> nextCommandPhaseQueue */ - queueMessage(message: string, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null, defer?: boolean | null) { - const phase = new MessagePhase(this, message, callbackDelay, prompt, promptDelay); + queueMessage( + message: string, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + defer?: boolean | null, + ) { + const phase = new MessagePhase(message, callbackDelay, prompt, promptDelay); if (!defer) { // adds to the end of PhaseQueuePrepend this.unshiftPhase(phase); @@ -2409,6 +2906,21 @@ export default class BattleScene extends SceneBase { } } + /** + * Queues an ability bar flyout phase + * @param pokemon The pokemon who has the ability + * @param passive Whether the ability is a passive + * @param show Whether to show or hide the bar + */ + public queueAbilityDisplay(pokemon: Pokemon, passive: boolean, show: boolean): void { + this.unshiftPhase( + show + ? new ShowAbilityPhase(pokemon.getBattlerIndex(), passive) + : new HideAbilityPhase(pokemon.getBattlerIndex(), passive), + ); + this.clearPhaseQueueSplice(); + } + /** * Moves everything from nextCommandPhaseQueue to phaseQueue (keeping order) */ @@ -2417,120 +2929,119 @@ export default class BattleScene extends SceneBase { this.phaseQueue.push(...this.nextCommandPhaseQueue); this.nextCommandPhaseQueue.splice(0, this.nextCommandPhaseQueue.length); } - this.phaseQueue.push(new TurnInitPhase(this)); + this.phaseQueue.push(new TurnInitPhase()); } - addMoney(amount: integer): void { + addMoney(amount: number): void { this.money = Math.min(this.money + amount, Number.MAX_SAFE_INTEGER); this.updateMoneyText(); this.animateMoneyChanged(true); this.validateAchvs(MoneyAchv); } - getWaveMoneyAmount(moneyMultiplier: number): integer { + getWaveMoneyAmount(moneyMultiplier: number): number { const waveIndex = this.currentBattle.waveIndex; const waveSetIndex = Math.ceil(waveIndex / 10) - 1; - const moneyValue = Math.pow((waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, 1 + 0.005 * waveSetIndex) * moneyMultiplier; + const moneyValue = + Math.pow((waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, 1 + 0.005 * waveSetIndex) * + moneyMultiplier; return Math.floor(moneyValue / 10) * 10; } - addModifier(modifier: Modifier | null, ignoreUpdate?: boolean, playSound?: boolean, virtual?: boolean, instant?: boolean, cost?: number): Promise { + addModifier( + modifier: Modifier | null, + ignoreUpdate?: boolean, + playSound?: boolean, + virtual?: boolean, + instant?: boolean, + cost?: number, + ): boolean { if (!modifier) { - return Promise.resolve(false); + return false; } - return new Promise(resolve => { - let success = false; - const soundName = modifier.type.soundName; - this.validateAchvs(ModifierAchv, modifier); - const modifiersToRemove: PersistentModifier[] = []; - const modifierPromises: Promise[] = []; - if (modifier instanceof PersistentModifier) { - if (modifier instanceof TerastallizeModifier) { - modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId))); - } - if ((modifier as PersistentModifier).add(this.modifiers, !!virtual, this)) { - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { - const pokemon = this.getPokemonById(modifier.pokemonId); - if (pokemon) { - success = modifier.apply(pokemon, true); - } + let success = false; + const soundName = modifier.type.soundName; + this.validateAchvs(ModifierAchv, modifier); + const modifiersToRemove: PersistentModifier[] = []; + if (modifier instanceof PersistentModifier) { + if ((modifier as PersistentModifier).add(this.modifiers, !!virtual)) { + if (modifier instanceof PokemonFormChangeItemModifier) { + const pokemon = this.getPokemonById(modifier.pokemonId); + if (pokemon) { + success = modifier.apply(pokemon, true); } - if (playSound && !this.sound.get(soundName)) { - this.playSound(soundName); - } - } else if (!virtual) { - const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); - this.queueMessage(i18next.t("battle:itemStackFull", { fullItemName: modifier.type.name, itemName: defaultModifierType.name }), undefined, true); - return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); } - - for (const rm of modifiersToRemove) { - this.removeModifier(rm); - } - - if (!ignoreUpdate && !virtual) { - return this.updateModifiers(true, instant).then(() => resolve(success)); - } - } else if (modifier instanceof ConsumableModifier) { if (playSound && !this.sound.get(soundName)) { this.playSound(soundName); } - - if (modifier instanceof ConsumablePokemonModifier) { - for (const p in this.party) { - const pokemon = this.party[p]; - - const args: unknown[] = []; - if (modifier instanceof PokemonHpRestoreModifier) { - if (!(modifier as PokemonHpRestoreModifier).fainted) { - const hpRestoreMultiplier = new Utils.IntegerHolder(1); - this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); - args.push(hpRestoreMultiplier.value); - } else { - args.push(1); - } - } else if (modifier instanceof FusePokemonModifier) { - args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon); - } else if (modifier instanceof RememberMoveModifier && !Utils.isNullOrUndefined(cost)) { - args.push(cost); - } - - if (modifier.shouldApply(pokemon, ...args)) { - const result = modifier.apply(pokemon, ...args); - if (result instanceof Promise) { - modifierPromises.push(result.then(s => success ||= s)); - } else { - success ||= result; - } - } - } - - return Promise.allSettled([ this.party.map(p => p.updateInfo(instant)), ...modifierPromises ]).then(() => resolve(success)); - } else { - const args = [ this ]; - if (modifier.shouldApply(...args)) { - const result = modifier.apply(...args); - if (result instanceof Promise) { - return result.then(success => resolve(success)); - } else { - success ||= result; - } - } - } + } else if (!virtual) { + const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); + this.queueMessage( + i18next.t("battle:itemStackFull", { + fullItemName: modifier.type.name, + itemName: defaultModifierType.name, + }), + undefined, + false, + 3000, + ); + return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant); } - resolve(success); - }); + for (const rm of modifiersToRemove) { + this.removeModifier(rm); + } + + if (!ignoreUpdate && !virtual) { + this.updateModifiers(true, instant); + } + } else if (modifier instanceof ConsumableModifier) { + if (playSound && !this.sound.get(soundName)) { + this.playSound(soundName); + } + + if (modifier instanceof ConsumablePokemonModifier) { + for (const p in this.party) { + const pokemon = this.party[p]; + + const args: unknown[] = []; + if (modifier instanceof PokemonHpRestoreModifier) { + if (!(modifier as PokemonHpRestoreModifier).fainted) { + const hpRestoreMultiplier = new Utils.NumberHolder(1); + this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); + args.push(hpRestoreMultiplier.value); + } else { + args.push(1); + } + } else if (modifier instanceof FusePokemonModifier) { + args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon); + } else if (modifier instanceof RememberMoveModifier && !Utils.isNullOrUndefined(cost)) { + args.push(cost); + } + + if (modifier.shouldApply(pokemon, ...args)) { + const result = modifier.apply(pokemon, ...args); + success ||= result; + } + } + + this.party.map(p => p.updateInfo(instant)); + } else { + const args = [this]; + if (modifier.shouldApply(...args)) { + const result = modifier.apply(...args); + success ||= result; + } + } + } + return success; } addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { return new Promise(resolve => { const modifiersToRemove: PersistentModifier[] = []; - if (modifier instanceof TerastallizeModifier) { - modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId, false))); - } - if ((modifier as PersistentModifier).add(this.enemyModifiers, false, this)) { - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + if ((modifier as PersistentModifier).add(this.enemyModifiers, false)) { + if (modifier instanceof PokemonFormChangeItemModifier) { const pokemon = this.getPokemonById(modifier.pokemonId); if (pokemon) { modifier.apply(pokemon, true); @@ -2541,7 +3052,8 @@ export default class BattleScene extends SceneBase { } } if (!ignoreUpdate) { - this.updateModifiers(false, instant).then(() => resolve()); + this.updateModifiers(false, instant); + resolve(); } else { resolve(); } @@ -2554,73 +3066,136 @@ export default class BattleScene extends SceneBase { * The quantity to transfer is automatically capped at how much the recepient can take before reaching the maximum stack size for the item. * A transfer that moves a quantity smaller than what is specified in the transferQuantity parameter is still considered successful. * @param itemModifier {@linkcode PokemonHeldItemModifier} item to transfer (represents the whole stack) - * @param target {@linkcode Pokemon} pokemon recepient in this transfer - * @param playSound {boolean} - * @param transferQuantity {@linkcode integer} how many items of the stack to transfer. Optional, defaults to 1 - * @param instant {boolean} - * @param ignoreUpdate {boolean} - * @returns true if the transfer was successful + * @param target {@linkcode Pokemon} recepient in this transfer + * @param playSound `true` to play a sound when transferring the item + * @param transferQuantity How many items of the stack to transfer. Optional, defaults to `1` + * @param instant ??? (Optional) + * @param ignoreUpdate ??? (Optional) + * @param itemLost If `true`, treat the item's current holder as losing the item (for now, this simply enables Unburden). Default is `true`. + * @returns `true` if the transfer was successful */ - tryTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, playSound: boolean, transferQuantity: integer = 1, instant?: boolean, ignoreUpdate?: boolean): Promise { - return new Promise(resolve => { - const source = itemModifier.pokemonId ? itemModifier.getPokemon(target.scene) : null; - const cancelled = new Utils.BooleanHolder(false); - Utils.executeIf(!!source && source.isPlayer() !== target.isPlayer(), () => applyAbAttrs(BlockItemTheftAbAttr, source! /* checked in condition*/, cancelled)).then(() => { - if (cancelled.value) { - return resolve(false); - } - const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; - newItemModifier.pokemonId = target.id; - const matchingModifier = target.scene.findModifier(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).matchType(itemModifier) && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier; - let removeOld = true; - if (matchingModifier) { - const maxStackCount = matchingModifier.getMaxStackCount(target.scene); - if (matchingModifier.stackCount >= maxStackCount) { - return resolve(false); - } - const countTaken = Math.min(transferQuantity, itemModifier.stackCount, maxStackCount - matchingModifier.stackCount); - itemModifier.stackCount -= countTaken; - newItemModifier.stackCount = matchingModifier.stackCount + countTaken; - removeOld = !itemModifier.stackCount; - } else { - const countTaken = Math.min(transferQuantity, itemModifier.stackCount); - itemModifier.stackCount -= countTaken; - newItemModifier.stackCount = countTaken; - } - removeOld = !itemModifier.stackCount; - if (!removeOld || !source || this.removeModifier(itemModifier, !source.isPlayer())) { - const addModifier = () => { - if (!matchingModifier || this.removeModifier(matchingModifier, !target.isPlayer())) { - if (target.isPlayer()) { - this.addModifier(newItemModifier, ignoreUpdate, playSound, false, instant).then(() => resolve(true)); - } else { - this.addEnemyModifier(newItemModifier, ignoreUpdate, instant).then(() => resolve(true)); - } - } else { - resolve(false); + tryTransferHeldItemModifier( + itemModifier: PokemonHeldItemModifier, + target: Pokemon, + playSound: boolean, + transferQuantity = 1, + instant?: boolean, + ignoreUpdate?: boolean, + itemLost = true, + ): boolean { + const source = itemModifier.pokemonId ? itemModifier.getPokemon() : null; + const cancelled = new Utils.BooleanHolder(false); + + if (source && source.isPlayer() !== target.isPlayer()) { + applyAbAttrs(BlockItemTheftAbAttr, source, cancelled); + } + + if (cancelled.value) { + return false; + } + + const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; + newItemModifier.pokemonId = target.id; + const matchingModifier = this.findModifier( + m => m instanceof PokemonHeldItemModifier && m.matchType(itemModifier) && m.pokemonId === target.id, + target.isPlayer(), + ) as PokemonHeldItemModifier; + + if (matchingModifier) { + const maxStackCount = matchingModifier.getMaxStackCount(); + if (matchingModifier.stackCount >= maxStackCount) { + return false; + } + const countTaken = Math.min( + transferQuantity, + itemModifier.stackCount, + maxStackCount - matchingModifier.stackCount, + ); + itemModifier.stackCount -= countTaken; + newItemModifier.stackCount = matchingModifier.stackCount + countTaken; + } else { + const countTaken = Math.min(transferQuantity, itemModifier.stackCount); + itemModifier.stackCount -= countTaken; + newItemModifier.stackCount = countTaken; + } + + const removeOld = itemModifier.stackCount === 0; + + if (!removeOld || !source || this.removeModifier(itemModifier, !source.isPlayer())) { + const addModifier = () => { + if (!matchingModifier || this.removeModifier(matchingModifier, !target.isPlayer())) { + if (target.isPlayer()) { + this.addModifier(newItemModifier, ignoreUpdate, playSound, false, instant); + if (source && itemLost) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); } - }; - if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) { - this.updateModifiers(source.isPlayer(), instant).then(() => addModifier()); - } else { - addModifier(); + return true; } - return; + this.addEnemyModifier(newItemModifier, ignoreUpdate, instant); + if (source && itemLost) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, source, false); + } + return true; } - resolve(false); - }); - }); + return false; + }; + if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) { + this.updateModifiers(source.isPlayer(), instant); + addModifier(); + } else { + addModifier(); + } + return true; + } + return false; } - removePartyMemberModifiers(partyMemberIndex: integer): Promise { + canTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, transferQuantity = 1): boolean { + const mod = itemModifier.clone() as PokemonHeldItemModifier; + const source = mod.pokemonId ? mod.getPokemon() : null; + const cancelled = new Utils.BooleanHolder(false); + + if (source && source.isPlayer() !== target.isPlayer()) { + applyAbAttrs(BlockItemTheftAbAttr, source, cancelled); + } + + if (cancelled.value) { + return false; + } + + const matchingModifier = this.findModifier( + m => m instanceof PokemonHeldItemModifier && m.matchType(mod) && m.pokemonId === target.id, + target.isPlayer(), + ) as PokemonHeldItemModifier; + + if (matchingModifier) { + const maxStackCount = matchingModifier.getMaxStackCount(); + if (matchingModifier.stackCount >= maxStackCount) { + return false; + } + const countTaken = Math.min(transferQuantity, mod.stackCount, maxStackCount - matchingModifier.stackCount); + mod.stackCount -= countTaken; + } else { + const countTaken = Math.min(transferQuantity, mod.stackCount); + mod.stackCount -= countTaken; + } + + const removeOld = mod.stackCount === 0; + + return !removeOld || !source || this.hasModifier(itemModifier, !source.isPlayer()); + } + + removePartyMemberModifiers(partyMemberIndex: number): Promise { return new Promise(resolve => { - const pokemonId = this.getParty()[partyMemberIndex].id; - const modifiersToRemove = this.modifiers.filter(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId); + const pokemonId = this.getPlayerParty()[partyMemberIndex].id; + const modifiersToRemove = this.modifiers.filter( + m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId, + ); for (const m of modifiersToRemove) { this.modifiers.splice(this.modifiers.indexOf(m), 1); } - this.updateModifiers().then(() => resolve()); + this.updateModifiers(); + resolve(); }); } @@ -2645,9 +3220,9 @@ export default class BattleScene extends SceneBase { } } - party.forEach((enemyPokemon: EnemyPokemon, i: integer) => { + party.forEach((enemyPokemon: EnemyPokemon, i: number) => { if (heldModifiersConfigs && i < heldModifiersConfigs.length && heldModifiersConfigs[i]) { - heldModifiersConfigs[i].forEach(mt => { + for (const mt of heldModifiersConfigs[i]) { let modifier: PokemonHeldItemModifier; if (mt.modifier instanceof PokemonHeldItemModifierType) { modifier = mt.modifier.newModifier(enemyPokemon); @@ -2658,9 +3233,11 @@ export default class BattleScene extends SceneBase { modifier.stackCount = mt.stackCount ?? 1; modifier.isTransferable = mt.isTransferable ?? modifier.isTransferable; this.addEnemyModifier(modifier, true); - }); + } } else { - const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss); + const isBoss = + enemyPokemon.isBoss() || + (this.currentBattle.battleType === BattleType.TRAINER && !!this.currentBattle.trainer?.config.isBoss); let upgradeChance = 32; if (isBoss) { upgradeChance /= 2; @@ -2668,107 +3245,122 @@ export default class BattleScene extends SceneBase { if (isFinalBoss) { upgradeChance /= 8; } - const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); - let pokemonModifierChance = modifierChance; - if (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer) - pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line let count = 0; for (let c = 0; c < chances; c++) { - if (!Utils.randSeedInt(modifierChance)) { + if (!Utils.randSeedInt(this.gameMode.getEnemyModifierChance(isBoss))) { count++; } } if (isBoss) { count = Math.max(count, Math.floor(chances / 2)); } - getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) - .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); + getEnemyModifierTypesForWave( + difficultyWaveIndex, + count, + [enemyPokemon], + this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, + upgradeChance, + ).map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false)); } return true; }); - this.updateModifiers(false).then(() => resolve()); + this.updateModifiers(false); + resolve(); }); } /** - * Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type - */ + * Removes all modifiers from enemy pokemon of {@linkcode PersistentModifier} type + */ clearEnemyModifiers(): void { const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); } - this.updateModifiers(false).then(() => this.updateUIPositions()); + this.updateModifiers(false); + this.updateUIPositions(); } /** - * Removes all modifiers from enemy pokemon of {@linkcode PokemonHeldItemModifier} type - * @param pokemon - If specified, only removes held items from that {@linkcode Pokemon} - */ + * Removes all modifiers from enemy pokemon of {@linkcode PokemonHeldItemModifier} type + * @param pokemon - If specified, only removes held items from that {@linkcode Pokemon} + */ clearEnemyHeldItemModifiers(pokemon?: Pokemon): void { - const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier && (!pokemon || m.getPokemon(this) === pokemon)); + const modifiersToRemove = this.enemyModifiers.filter( + m => m instanceof PokemonHeldItemModifier && (!pokemon || m.getPokemon() === pokemon), + ); for (const m of modifiersToRemove) { this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); } - this.updateModifiers(false).then(() => this.updateUIPositions()); + this.updateModifiers(false); + this.updateUIPositions(); } setModifiersVisible(visible: boolean) { - [ this.modifierBar, this.enemyModifierBar ].map(m => m.setVisible(visible)); + [this.modifierBar, this.enemyModifierBar].map(m => m.setVisible(visible)); } - updateModifiers(player?: boolean, instant?: boolean): Promise { - if (player === undefined) { - player = true; + updateModifiers(player = true, instant?: boolean): void { + const modifiers = player ? this.modifiers : (this.enemyModifiers as PersistentModifier[]); + for (let m = 0; m < modifiers.length; m++) { + const modifier = modifiers[m]; + if ( + modifier instanceof PokemonHeldItemModifier && + !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId) + ) { + modifiers.splice(m--, 1); + } } - return new Promise(resolve => { - const modifiers = player ? this.modifiers : this.enemyModifiers as PersistentModifier[]; - for (let m = 0; m < modifiers.length; m++) { - const modifier = modifiers[m]; - if (modifier instanceof PokemonHeldItemModifier && !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId)) { - modifiers.splice(m--, 1); - } - } - for (const modifier of modifiers) { - if (modifier instanceof PersistentModifier) { - (modifier as PersistentModifier).virtualStackCount = 0; - } + for (const modifier of modifiers) { + if (modifier instanceof PersistentModifier) { + (modifier as PersistentModifier).virtualStackCount = 0; } + } - const modifiersClone = modifiers.slice(0); - for (const modifier of modifiersClone) { - if (!modifier.getStackCount()) { - modifiers.splice(modifiers.indexOf(modifier), 1); - } + const modifiersClone = modifiers.slice(0); + for (const modifier of modifiersClone) { + if (!modifier.getStackCount()) { + modifiers.splice(modifiers.indexOf(modifier), 1); } + } - this.updatePartyForModifiers(player ? this.getParty() : this.getEnemyParty(), instant).then(() => { - (player ? this.modifierBar : this.enemyModifierBar).updateModifiers(modifiers); - if (!player) { - this.updateUIPositions(); - } - resolve(); - }); - }); + this.updatePartyForModifiers(player ? this.getPlayerParty() : this.getEnemyParty(), instant); + (player ? this.modifierBar : this.enemyModifierBar).updateModifiers(modifiers); + if (!player) { + this.updateUIPositions(); + } } updatePartyForModifiers(party: Pokemon[], instant?: boolean): Promise { return new Promise(resolve => { - Promise.allSettled(party.map(p => { - if (p.scene) { + Promise.allSettled( + party.map(p => { p.calculateStats(); - } - return p.updateInfo(instant); - })).then(() => resolve()); + return p.updateInfo(instant); + }), + ).then(() => resolve()); }); } - removeModifier(modifier: PersistentModifier, enemy?: boolean): boolean { + hasModifier(modifier: PersistentModifier, enemy = false): boolean { + const modifiers = !enemy ? this.modifiers : this.enemyModifiers; + return modifiers.indexOf(modifier) > -1; + } + + /** + * Removes a currently owned item. If the item is stacked, the entire item stack + * gets removed. This function does NOT apply in-battle effects, such as Unburden. + * If in-battle effects are needed, use {@linkcode Pokemon.loseHeldItem} instead. + * @param modifier The item to be removed. + * @param enemy If `true`, remove an item owned by the enemy. If `false`, remove an item owned by the player. Default is `false`. + * @returns `true` if the item exists and was successfully removed, `false` otherwise. + */ + removeModifier(modifier: PersistentModifier, enemy = false): boolean { const modifiers = !enemy ? this.modifiers : this.enemyModifiers; const modifierIndex = modifiers.indexOf(modifier); if (modifierIndex > -1) { modifiers.splice(modifierIndex, 1); - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + if (modifier instanceof PokemonFormChangeItemModifier) { const pokemon = this.getPokemonById(modifier.pokemonId); if (pokemon) { modifier.apply(pokemon, false); @@ -2786,7 +3378,7 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that matched `modifierType`. */ - getModifiers(modifierType: Constructor, player: boolean = true): T[] { + getModifiers(modifierType: Constructor, player = true): T[] { return (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType); } @@ -2796,7 +3388,7 @@ export default class BattleScene extends SceneBase { * @param isPlayer Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the list of all modifiers that passed the `modifierFilter` function */ - findModifiers(modifierFilter: ModifierPredicate, isPlayer: boolean = true): PersistentModifier[] { + findModifiers(modifierFilter: ModifierPredicate, isPlayer = true): PersistentModifier[] { return (isPlayer ? this.modifiers : this.enemyModifiers).filter(modifierFilter); } @@ -2806,30 +3398,39 @@ export default class BattleScene extends SceneBase { * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @returns the first modifier that passed the `modifierFilter` function; `undefined` if none passed */ - findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier | undefined { + findModifier(modifierFilter: ModifierPredicate, player = true): PersistentModifier | undefined { return (player ? this.modifiers : this.enemyModifiers).find(modifierFilter); } /** * Apply all modifiers that match `modifierType` in a random order - * @param scene {@linkcode BattleScene} used to randomize the order of modifiers * @param modifierType The type of modifier to apply; must extend {@linkcode PersistentModifier} * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the list of all modifiers that matched `modifierType` and were applied. */ - applyShuffledModifiers(scene: BattleScene, modifierType: Constructor, player: boolean = true, ...args: Parameters): T[] { - let modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); - scene.executeWithSeedOffset(() => { - const shuffleModifiers = mods => { - if (mods.length < 1) { - return mods; - } - const rand = Utils.randSeedInt(mods.length); - return [ mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand)) ]; - }; - modifiers = shuffleModifiers(modifiers); - }, scene.currentBattle.turn << 4, scene.waveSeed); + applyShuffledModifiers( + modifierType: Constructor, + player = true, + ...args: Parameters + ): T[] { + let modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); + this.executeWithSeedOffset( + () => { + const shuffleModifiers = mods => { + if (mods.length < 1) { + return mods; + } + const rand = Utils.randSeedInt(mods.length); + return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))]; + }; + modifiers = shuffleModifiers(modifiers); + }, + this.currentBattle.turn << 4, + this.waveSeed, + ); return this.applyModifiersInternal(modifiers, player, args); } @@ -2840,13 +3441,23 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the list of all modifiers that matched `modifierType` and were applied. */ - applyModifiers(modifierType: Constructor, player: boolean = true, ...args: Parameters): T[] { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); + applyModifiers( + modifierType: Constructor, + player = true, + ...args: Parameters + ): T[] { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); return this.applyModifiersInternal(modifiers, player, args); } /** Helper function to apply all passed modifiers */ - applyModifiersInternal(modifiers: T[], player: boolean, args: Parameters): T[] { + applyModifiersInternal( + modifiers: T[], + player: boolean, + args: Parameters, + ): T[] { const appliedModifiers: T[] = []; for (const modifier of modifiers) { if (modifier.apply(...args)) { @@ -2865,8 +3476,14 @@ export default class BattleScene extends SceneBase { * @param ...args The list of arguments needed to invoke `modifierType.apply` * @returns the first modifier that matches `modifierType` and was applied; return `null` if none matched */ - applyModifier(modifierType: Constructor, player: boolean = true, ...args: Parameters): T | null { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType && m.shouldApply(...args)); + applyModifier( + modifierType: Constructor, + player = true, + ...args: Parameters + ): T | null { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter( + (m): m is T => m instanceof modifierType && m.shouldApply(...args), + ); for (const modifier of modifiers) { if (modifier.apply(...args)) { console.log("Applied", modifier.type.name, !player ? "(enemy)" : ""); @@ -2877,31 +3494,42 @@ export default class BattleScene extends SceneBase { return null; } - triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: Constructor, delayed: boolean = false, modal: boolean = false): boolean { + triggerPokemonFormChange( + pokemon: Pokemon, + formChangeTriggerType: Constructor, + delayed = false, + modal = false, + ): boolean { if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { - // in case this is NECROZMA, determine which forms this - const matchingFormChangeOpts = pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); + const matchingFormChangeOpts = pokemonFormChanges[pokemon.species.speciesId].filter( + fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon), + ); let matchingFormChange: SpeciesFormChange | null; if (pokemon.species.speciesId === Species.NECROZMA && matchingFormChangeOpts.length > 1) { // Ultra Necrozma is changing its form back, so we need to figure out into which form it devolves. - const formChangeItemModifiers = (this.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]).filter(m => m.active).map(m => m.formChangeItem); + const formChangeItemModifiers = ( + this.findModifiers( + m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id, + ) as PokemonFormChangeItemModifier[] + ) + .filter(m => m.active) + .map(m => m.formChangeItem); - - matchingFormChange = formChangeItemModifiers.includes(FormChangeItem.N_LUNARIZER) ? - matchingFormChangeOpts[0] : - formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) ? - matchingFormChangeOpts[1] : - null; + matchingFormChange = formChangeItemModifiers.includes(FormChangeItem.N_LUNARIZER) + ? matchingFormChangeOpts[0] + : formChangeItemModifiers.includes(FormChangeItem.N_SOLARIZER) + ? matchingFormChangeOpts[1] + : null; } else { matchingFormChange = matchingFormChangeOpts[0]; } if (matchingFormChange) { let phase: Phase; if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet) { - phase = new FormChangePhase(this, pokemon, matchingFormChange, modal); + phase = new FormChangePhase(pokemon, matchingFormChange, modal); } else { - phase = new QuietFormChangePhase(this, pokemon, matchingFormChange); + phase = new QuietFormChangePhase(pokemon, matchingFormChange); } if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet && modal) { this.overridePhase(phase); @@ -2917,8 +3545,13 @@ export default class BattleScene extends SceneBase { return false; } - triggerPokemonBattleAnim(pokemon: Pokemon, battleAnimType: PokemonAnimType, fieldAssets?: Phaser.GameObjects.Sprite[], delayed: boolean = false): boolean { - const phase: Phase = new PokemonAnimPhase(this, battleAnimType, pokemon, fieldAssets); + triggerPokemonBattleAnim( + pokemon: Pokemon, + battleAnimType: PokemonAnimType, + fieldAssets?: Phaser.GameObjects.Sprite[], + delayed = false, + ): boolean { + const phase: Phase = new PokemonAnimPhase(battleAnimType, pokemon, fieldAssets); if (delayed) { this.pushPhase(phase); } else { @@ -2935,7 +3568,10 @@ 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(args) + ) { this.gameData.achvUnlocks[achv.id] = new Date().getTime(); this.ui.achvBar.showAchv(achv); if (vouchers.hasOwnProperty(achv.id)) { @@ -2948,7 +3584,7 @@ export default class BattleScene extends SceneBase { } validateVoucher(voucher: Voucher, args?: unknown[]): boolean { - if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(this, args)) { + if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(args)) { this.gameData.voucherUnlocks[voucher.id] = new Date().getTime(); this.ui.achvBar.showAchv(voucher); this.gameData.voucherCounts[voucher.voucherType]++; @@ -2960,13 +3596,25 @@ export default class BattleScene extends SceneBase { updateGameInfo(): void { const gameInfo = { - playTime: this.sessionPlayTime ? this.sessionPlayTime : 0, + playTime: this.sessionPlayTime ?? 0, gameMode: this.currentBattle ? this.gameMode.getName() : "Title", biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : "", - wave: this.currentBattle?.waveIndex || 0, - party: this.party ? this.party.map(p => { - return { name: p.name, level: p.level }; - }) : [], + wave: this.currentBattle?.waveIndex ?? 0, + party: this.party + ? this.party.map(p => { + return { + name: p.name, + form: p.getFormKey(), + types: p.getTypes().map(type => PokemonType[type]), + teraType: PokemonType[p.getTeraType()], + isTerastallized: p.isTerastallized, + level: p.level, + currentHP: p.hp, + maxHP: p.getMaxHp(), + status: p.status?.effect ? StatusEffect[p.status.effect] : "", + }; + }) + : [], modeChain: this.ui?.getModeChain() ?? [], }; (window as any).gameInfo = gameInfo; @@ -2980,24 +3628,18 @@ export default class BattleScene extends SceneBase { */ getActiveKeys(): string[] { const keys: string[] = []; - const playerParty = this.getParty(); - playerParty.forEach(p => { + let activePokemon: (PlayerPokemon | EnemyPokemon)[] = this.getPlayerParty(); + activePokemon = activePokemon.concat(this.getEnemyParty()); + for (const p of activePokemon) { keys.push(p.getSpriteKey(true)); - keys.push(p.getBattleSpriteKey(true, true)); - keys.push("cry/" + p.species.getCryKey(p.formIndex)); - if (p.fusionSpecies) { - keys.push("cry/" + p.fusionSpecies.getCryKey(p.fusionFormIndex)); + if (p instanceof PlayerPokemon) { + keys.push(p.getBattleSpriteKey(true, true)); } - }); - // enemyParty has to be operated on separately from playerParty because playerPokemon =/= enemyPokemon - const enemyParty = this.getEnemyParty(); - enemyParty.forEach(p => { - keys.push(p.getSpriteKey(true)); - keys.push("cry/" + p.species.getCryKey(p.formIndex)); + keys.push(p.species.getCryKey(p.formIndex)); if (p.fusionSpecies) { - keys.push("cry/" + p.fusionSpecies.getCryKey(p.fusionFormIndex)); + keys.push(p.fusionSpecies.getCryKey(p.fusionFormIndex)); } - }); + } return keys; } @@ -3008,24 +3650,31 @@ export default class BattleScene extends SceneBase { initFinalBossPhaseTwo(pokemon: Pokemon): void { if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { this.fadeOutBgm(Utils.fixedInt(2000), false); - this.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, undefined, () => { - const finalBossMBH = getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as TurnHeldItemTransferModifier; - finalBossMBH.setTransferrableFalse(); - this.addEnemyModifier(finalBossMBH, false, true); - pokemon.generateAndPopulateMoveset(1); - this.setFieldScale(0.75); - this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - this.currentBattle.double = true; - const availablePartyMembers = this.getParty().filter((p) => p.isAllowedInBattle()); - if (availablePartyMembers.length > 1) { - this.pushPhase(new ToggleDoublePositionPhase(this, true)); - if (!availablePartyMembers[1].isOnField()) { - this.pushPhase(new SummonPhase(this, 1)); + this.ui.showDialogue( + battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, + pokemon.species.name, + undefined, + () => { + const finalBossMBH = getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier( + pokemon, + ) as TurnHeldItemTransferModifier; + finalBossMBH.setTransferrableFalse(); + this.addEnemyModifier(finalBossMBH, false, true); + pokemon.generateAndPopulateMoveset(1); + this.setFieldScale(0.75); + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + this.currentBattle.double = true; + const availablePartyMembers = this.getPlayerParty().filter(p => p.isAllowedInBattle()); + if (availablePartyMembers.length > 1) { + this.pushPhase(new ToggleDoublePositionPhase(true)); + if (!availablePartyMembers[1].isOnField()) { + this.pushPhase(new SummonPhase(1)); + } } - } - this.shiftPhase(); - }); + this.shiftPhase(); + }, + ); return; } @@ -3039,22 +3688,32 @@ export default class BattleScene extends SceneBase { * @param useWaveIndexMultiplier Default false. If true, will multiply expValue by a scaling waveIndex multiplier. Not needed if expValue is already scaled by level/wave * @param pokemonParticipantIds Participants. If none are defined, no exp will be given. To spread evenly among the party, should pass all ids of party members. */ - applyPartyExp(expValue: number, pokemonDefeated: boolean, useWaveIndexMultiplier?: boolean, pokemonParticipantIds?: Set): void { + applyPartyExp( + expValue: number, + pokemonDefeated: boolean, + useWaveIndexMultiplier?: boolean, + pokemonParticipantIds?: Set, + ): void { const participantIds = pokemonParticipantIds ?? this.currentBattle.playerParticipantIds; - const party = this.getParty(); + const party = this.getPlayerParty(); const expShareModifier = this.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; const expBalanceModifier = this.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; - const multipleParticipantExpBonusModifier = this.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier; + const multipleParticipantExpBonusModifier = this.findModifier( + m => m instanceof MultipleParticipantExpBonusModifier, + ) as MultipleParticipantExpBonusModifier; const nonFaintedPartyMembers = party.filter(p => p.hp); const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < this.getMaxExpLevel()); const partyMemberExp: number[] = []; // EXP value calculation is based off Pokemon.getExpValue if (useWaveIndexMultiplier) { - expValue = Math.floor(expValue * this.currentBattle.waveIndex / 5 + 1); + expValue = Math.floor((expValue * this.currentBattle.waveIndex) / 5 + 1); } if (participantIds.size > 0) { - if (this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { + if ( + this.currentBattle.battleType === BattleType.TRAINER || + this.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE + ) { expValue = Math.floor(expValue * 1.5); } else if (this.currentBattle.isBattleMysteryEncounter() && this.currentBattle.mysteryEncounter) { expValue = Math.floor(expValue * this.currentBattle.mysteryEncounter.expMultiplier); @@ -3065,7 +3724,7 @@ export default class BattleScene extends SceneBase { if (participated && pokemonDefeated) { partyMember.addFriendship(FRIENDSHIP_GAIN_FROM_BATTLE); const machoBraceModifier = partyMember.getHeldItems().find(m => m instanceof PokemonIncrementingStatModifier); - if (machoBraceModifier && machoBraceModifier.stackCount < machoBraceModifier.getMaxStackCount(this)) { + if (machoBraceModifier && machoBraceModifier.stackCount < machoBraceModifier.getMaxStackCount()) { machoBraceModifier.stackCount++; this.updateModifiers(true, true); partyMember.updateInfo(); @@ -3080,7 +3739,7 @@ export default class BattleScene extends SceneBase { } let expMultiplier = 0; if (participated) { - expMultiplier += (1 / participantIds.size); + expMultiplier += 1 / participantIds.size; if (participantIds.size > 1 && multipleParticipantExpBonusModifier) { expMultiplier += multipleParticipantExpBonusModifier.getStackCount() * 0.2; } @@ -3118,7 +3777,11 @@ export default class BattleScene extends SceneBase { const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); expPartyMembers.forEach((_partyMember, pm) => { - partyMemberExp[pm] = Phaser.Math.Linear(partyMemberExp[pm], recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, 0.2 * expBalanceModifier.getStackCount()); + partyMemberExp[pm] = Phaser.Math.Linear( + partyMemberExp[pm], + recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, + 0.2 * expBalanceModifier.getStackCount(), + ); }); } @@ -3127,7 +3790,11 @@ export default class BattleScene extends SceneBase { if (exp) { const partyMemberIndex = party.indexOf(expPartyMembers[pm]); - this.unshiftPhase(expPartyMembers[pm].isOnField() ? new ExpPhase(this, partyMemberIndex, exp) : new ShowPartyExpBarPhase(this, partyMemberIndex, exp)); + this.unshiftPhase( + expPartyMembers[pm].isOnField() + ? new ExpPhase(partyMemberIndex, exp) + : new ShowPartyExpBarPhase(partyMemberIndex, exp), + ); } } } @@ -3139,8 +3806,14 @@ export default class BattleScene extends SceneBase { * That check is made in {@linkcode BattleScene.isWaveMysteryEncounter} instead. */ isMysteryEncounterValidForWave(battleType: BattleType, waveIndex: number): boolean { - const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); - return this.gameMode.hasMysteryEncounters && battleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave; + const [lowestMysteryEncounterWave, highestMysteryEncounterWave] = this.gameMode.getMysteryEncounterLegalWaves(); + return ( + this.gameMode.hasMysteryEncounters && + battleType === BattleType.WILD && + !this.gameMode.isBoss(waveIndex) && + waveIndex < highestMysteryEncounterWave && + waveIndex > lowestMysteryEncounterWave + ); } /** @@ -3151,7 +3824,7 @@ export default class BattleScene extends SceneBase { * @param waveIndex */ private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number): boolean { - const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); + const [lowestMysteryEncounterWave, highestMysteryEncounterWave] = this.gameMode.getMysteryEncounterLegalWaves(); if (this.isMysteryEncounterValidForWave(newBattleType, waveIndex)) { // Base spawn weight is BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT/256, and increases by WEIGHT_INCREMENT_ON_SPAWN_MISS/256 for each missed attempt at spawning an encounter on a valid floor const sessionEncounterRate = this.mysteryEncounterSaveData.encounterSpawnChance; @@ -3160,21 +3833,33 @@ export default class BattleScene extends SceneBase { // If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn (reverse as well) // Reduces occurrence of runs with total encounters significantly different from AVERAGE_ENCOUNTERS_PER_RUN_TARGET // Favored rate changes can never exceed 50%. So if base rate is 15/256 and favored rate would add 200/256, result will be (15 + 128)/256 - const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (highestMysteryEncounterWave - lowestMysteryEncounterWave) * (waveIndex - lowestMysteryEncounterWave); + const expectedEncountersByFloor = + (AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (highestMysteryEncounterWave - lowestMysteryEncounterWave)) * + (waveIndex - lowestMysteryEncounterWave); const currentRunDiffFromAvg = expectedEncountersByFloor - encounteredEvents.length; - const favoredEncounterRate = sessionEncounterRate + Math.min(currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2); + const favoredEncounterRate = + sessionEncounterRate + + Math.min(currentRunDiffFromAvg * ANTI_VARIANCE_WEIGHT_MODIFIER, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT / 2); - const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!; + const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) + ? favoredEncounterRate + : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE!; // If the most recent ME was 3 or fewer waves ago, can never spawn a ME - const canSpawn = encounteredEvents.length === 0 || (waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex) > 3 || !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE); + const canSpawn = + encounteredEvents.length === 0 || + waveIndex - encounteredEvents[encounteredEvents.length - 1].waveIndex > 3 || + !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE); if (canSpawn) { let roll = MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT; // Always rolls the check on the same offset to ensure no RNG changes from reloading session - this.executeWithSeedOffset(() => { - roll = randSeedInt(MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT); - }, waveIndex * 3 * 1000); + this.executeWithSeedOffset( + () => { + roll = randSeedInt(MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT); + }, + waveIndex * 3 * 1000, + ); return roll < successRate; } } @@ -3191,7 +3876,10 @@ export default class BattleScene extends SceneBase { getMysteryEncounter(encounterType?: MysteryEncounterType, canBypass?: boolean): MysteryEncounter { // Loading override or session encounter let encounter: MysteryEncounter | null; - if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) { + if ( + !isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && + allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) + ) { encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE]; if (canBypass) { return encounter; @@ -3204,7 +3892,11 @@ export default class BattleScene extends SceneBase { } // Check for queued encounters first - if (!encounter && this.mysteryEncounterSaveData?.queuedEncounters && this.mysteryEncounterSaveData.queuedEncounters.length > 0) { + if ( + !encounter && + this.mysteryEncounterSaveData?.queuedEncounters && + this.mysteryEncounterSaveData.queuedEncounters.length > 0 + ) { let i = 0; while (i < this.mysteryEncounterSaveData.queuedEncounters.length && !!encounter) { const candidate = this.mysteryEncounterSaveData.queuedEncounters[i]; @@ -3219,73 +3911,104 @@ export default class BattleScene extends SceneBase { if (encounter) { encounter = new MysteryEncounter(encounter); - encounter.populateDialogueTokensFromRequirements(this); + encounter.populateDialogueTokensFromRequirements(); return encounter; } // See Enum values for base tier weights - const tierWeights = [ MysteryEncounterTier.COMMON, MysteryEncounterTier.GREAT, MysteryEncounterTier.ULTRA, MysteryEncounterTier.ROGUE ]; + const tierWeights = [ + MysteryEncounterTier.COMMON, + MysteryEncounterTier.GREAT, + MysteryEncounterTier.ULTRA, + MysteryEncounterTier.ROGUE, + ]; // Adjust tier weights by previously encountered events to lower odds of only Common/Great in run - this.mysteryEncounterSaveData.encounteredEvents.forEach(seenEncounterData => { + // biome-ignore format: biome sucks at formatting this line + for (const seenEncounterData of this.mysteryEncounterSaveData.encounteredEvents) { if (seenEncounterData.tier === MysteryEncounterTier.COMMON) { tierWeights[0] = tierWeights[0] - 6; } else if (seenEncounterData.tier === MysteryEncounterTier.GREAT) { tierWeights[1] = tierWeights[1] - 4; } - }); + } const totalWeight = tierWeights.reduce((a, b) => a + b); const tierValue = Utils.randSeedInt(totalWeight); const commonThreshold = totalWeight - tierWeights[0]; const greatThreshold = totalWeight - tierWeights[0] - tierWeights[1]; const ultraThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; - let tier: MysteryEncounterTier | null = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > greatThreshold ? MysteryEncounterTier.GREAT : tierValue > ultraThreshold ? MysteryEncounterTier.ULTRA : MysteryEncounterTier.ROGUE; + let tier: MysteryEncounterTier | null = + tierValue > commonThreshold + ? MysteryEncounterTier.COMMON + : tierValue > greatThreshold + ? MysteryEncounterTier.GREAT + : tierValue > ultraThreshold + ? MysteryEncounterTier.ULTRA + : MysteryEncounterTier.ROGUE; if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) { tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; } let availableEncounters: MysteryEncounter[] = []; - // New encounter should never be the same as the most recent encounter - const previousEncounter = this.mysteryEncounterSaveData.encounteredEvents.length > 0 ? this.mysteryEncounterSaveData.encounteredEvents[this.mysteryEncounterSaveData.encounteredEvents.length - 1].type : null; - const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType) ?? []; + const previousEncounter = + this.mysteryEncounterSaveData.encounteredEvents.length > 0 + ? this.mysteryEncounterSaveData.encounteredEvents[this.mysteryEncounterSaveData.encounteredEvents.length - 1] + .type + : null; + const disabledEncounters = this.eventManager.getEventMysteryEncountersDisabled(); + const biomeMysteryEncounters = + mysteryEncountersByBiome.get(this.arena.biomeType)?.filter(enc => !disabledEncounters.includes(enc)) ?? []; // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available while (availableEncounters.length === 0 && tier !== null) { availableEncounters = biomeMysteryEncounters - .filter((encounterType) => { + .filter(encounterType => { const encounterCandidate = allMysteryEncounters[encounterType]; if (!encounterCandidate) { return false; } - if (encounterCandidate.encounterTier !== tier) { // Encounter is in tier + if ( + this.eventManager.getMysteryEncounterTierForEvent(encounterType, encounterCandidate.encounterTier) !== tier + ) { return false; } const disallowedGameModes = encounterCandidate.disallowedGameModes; - if (disallowedGameModes && disallowedGameModes.length > 0 - && disallowedGameModes.includes(this.gameMode.modeId)) { // Encounter is enabled for game mode + if ( + disallowedGameModes && + disallowedGameModes.length > 0 && + disallowedGameModes.includes(this.gameMode.modeId) + ) { return false; } - if (this.gameMode.modeId === GameModes.CHALLENGE) { // Encounter is enabled for challenges + if (this.gameMode.modeId === GameModes.CHALLENGE) { const disallowedChallenges = encounterCandidate.disallowedChallenges; - if (disallowedChallenges && disallowedChallenges.length > 0 && this.gameMode.challenges.some(challenge => disallowedChallenges.includes(challenge.id))) { + if ( + disallowedChallenges && + disallowedChallenges.length > 0 && + this.gameMode.challenges.some(challenge => disallowedChallenges.includes(challenge.id)) + ) { return false; } } - if (!encounterCandidate.meetsRequirements(this)) { // Meets encounter requirements + if (!encounterCandidate.meetsRequirements()) { return false; } - if (previousEncounter !== null && encounterType === previousEncounter) { // Previous encounter was not this one + if (previousEncounter !== null && encounterType === previousEncounter) { return false; } - if (this.mysteryEncounterSaveData.encounteredEvents.length > 0 && // Encounter has not exceeded max allowed encounters - (encounterCandidate.maxAllowedEncounters && encounterCandidate.maxAllowedEncounters > 0) - && this.mysteryEncounterSaveData.encounteredEvents.filter(e => e.type === encounterType).length >= encounterCandidate.maxAllowedEncounters) { + if ( + this.mysteryEncounterSaveData.encounteredEvents.length > 0 && + encounterCandidate.maxAllowedEncounters && + encounterCandidate.maxAllowedEncounters > 0 && + this.mysteryEncounterSaveData.encounteredEvents.filter(e => e.type === encounterType).length >= + encounterCandidate.maxAllowedEncounters + ) { return false; } return true; }) - .map((m) => (allMysteryEncounters[m])); + .map(m => allMysteryEncounters[m]); // Decrement tier if (tier === MysteryEncounterTier.ROGUE) { tier = MysteryEncounterTier.ULTRA; @@ -3306,7 +4029,7 @@ export default class BattleScene extends SceneBase { encounter = availableEncounters[Utils.randSeedInt(availableEncounters.length)]; // New encounter object to not dirty flags encounter = new MysteryEncounter(encounter); - encounter.populateDialogueTokensFromRequirements(this); + encounter.populateDialogueTokensFromRequirements(); return encounter; } } diff --git a/src/battle.ts b/src/battle.ts index 6086c2ceb4e..5ada921bf5a 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -1,36 +1,56 @@ -import BattleScene from "./battle-scene"; -import { Command } from "./ui/command-ui-handler"; +import { globalScene } from "#app/global-scene"; +import type { Command } from "./ui/command-ui-handler"; import * as Utils from "./utils"; import Trainer, { TrainerVariant } from "./field/trainer"; -import { GameMode } from "./game-mode"; +import type { GameMode } from "./game-mode"; import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier"; -import { PokeballType } from "./data/pokeball"; +import type { PokeballType } from "#enums/pokeball"; import { trainerConfigs } from "#app/data/trainer-config"; -import Pokemon, { EnemyPokemon, PlayerPokemon, QueuedMove } from "#app/field/pokemon"; +import { SpeciesFormKey } from "#enums/species-form-key"; +import type { EnemyPokemon, PlayerPokemon, TurnMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattleSpec } from "#enums/battle-spec"; -import { Moves } from "#enums/moves"; +import type { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; +import { MusicPreference } from "#app/system/settings/settings"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import i18next from "#app/plugins/i18n"; -import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; -import { CustomModifierSettings } from "#app/modifier/modifier-type"; +import type { CustomModifierSettings } from "#app/modifier/modifier-type"; import { ModifierTier } from "#app/modifier/modifier-tier"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; export enum ClassicFixedBossWaves { - // TODO: other fixed wave battles should be added here + TOWN_YOUNGSTER = 5, + RIVAL_1 = 8, + RIVAL_2 = 25, + EVIL_GRUNT_1 = 35, + RIVAL_3 = 55, + EVIL_GRUNT_2 = 62, + EVIL_GRUNT_3 = 64, + EVIL_ADMIN_1 = 66, + RIVAL_4 = 95, + EVIL_GRUNT_4 = 112, + EVIL_ADMIN_2 = 114, EVIL_BOSS_1 = 115, + RIVAL_5 = 145, EVIL_BOSS_2 = 165, + ELITE_FOUR_1 = 182, + ELITE_FOUR_2 = 184, + ELITE_FOUR_3 = 186, + ELITE_FOUR_4 = 188, + CHAMPION = 190, + RIVAL_6 = 195, } export enum BattleType { WILD, TRAINER, CLEAR, - MYSTERY_ENCOUNTER + MYSTERY_ENCOUNTER, } export enum BattlerIndex { @@ -38,25 +58,25 @@ export enum BattlerIndex { PLAYER, PLAYER_2, ENEMY, - ENEMY_2 + ENEMY_2, } export interface TurnCommand { command: Command; cursor?: number; - move?: QueuedMove; + move?: TurnMove; targets?: BattlerIndex[]; skip?: boolean; args?: any[]; } export interface FaintLogEntry { - pokemon: Pokemon, - turn: number + pokemon: Pokemon; + turn: number; } interface TurnCommands { - [key: number]: TurnCommand | null + [key: number]: TurnCommand | null; } export default class Battle { @@ -69,23 +89,29 @@ export default class Battle { public enemyParty: EnemyPokemon[] = []; public seenEnemyPartyMemberIds: Set = new Set(); public double: boolean; - public started: boolean = false; - public enemySwitchCounter: number = 0; - public turn: number = 0; + public started = false; + public enemySwitchCounter = 0; + public turn = 0; + public preTurnCommands: TurnCommands; public turnCommands: TurnCommands; public playerParticipantIds: Set = new Set(); - public battleScore: number = 0; + public battleScore = 0; public postBattleLoot: PokemonHeldItemModifier[] = []; - public escapeAttempts: number = 0; + public escapeAttempts = 0; public lastMove: Moves; public battleSeed: string = Utils.randomString(16, true); private battleSeedState: string | null = null; - public moneyScattered: number = 0; + public moneyScattered = 0; + /** Primarily for double battles, keeps track of last enemy and player pokemon that triggered its ability or used a move */ + public lastEnemyInvolved: number; + public lastPlayerInvolved: number; public lastUsedPokeball: PokeballType | null = null; - /** The number of times a Pokemon on the player's side has fainted this battle */ - public playerFaints: number = 0; - /** The number of times a Pokemon on the enemy's side has fainted this battle */ - public enemyFaints: number = 0; + /** + * Saves the number of times a Pokemon on the enemy's side has fainted during this battle. + * This is saved here since we encounter a new enemy every wave. + * {@linkcode globalScene.arena.playerFaints} is the corresponding faint counter for the player and needs to be save across waves (reset every arena encounter). + */ + public enemyFaints = 0; public playerFaintsHistory: FaintLogEntry[] = []; public enemyFaintsHistory: FaintLogEntry[] = []; @@ -93,18 +119,19 @@ export default class Battle { /** If the current battle is a Mystery Encounter, this will always be defined */ public mysteryEncounter?: MysteryEncounter; - private rngCounter: number = 0; + private rngCounter = 0; - constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double?: boolean) { + constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double = false) { this.gameMode = gameMode; this.waveIndex = waveIndex; this.battleType = battleType; this.trainer = trainer ?? null; this.initBattleSpec(); - this.enemyLevels = battleType !== BattleType.TRAINER - ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) - : trainer?.getPartyLevels(this.waveIndex); - this.double = double ?? false; + this.enemyLevels = + battleType !== BattleType.TRAINER + ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) + : trainer?.getPartyLevels(this.waveIndex); + this.double = double; } private initBattleSpec(): void { @@ -152,9 +179,10 @@ export default class Battle { return this.double ? 2 : 1; } - incrementTurn(scene: BattleScene): void { + incrementTurn(): void { this.turn++; - this.turnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [ bt, null ])); + this.turnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [bt, null])); + this.preTurnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [bt, null])); this.battleSeedState = null; } @@ -167,214 +195,252 @@ export default class Battle { } addPostBattleLoot(enemyPokemon: EnemyPokemon): void { - this.postBattleLoot.push(...enemyPokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.isTransferable, false).map(i => { - const ret = i as PokemonHeldItemModifier; - //@ts-ignore - this is awful to fix/change - ret.pokemonId = null; - return ret; - })); + this.postBattleLoot.push( + ...globalScene + .findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.isTransferable, + false, + ) + .map(i => { + const ret = i as PokemonHeldItemModifier; + //@ts-ignore - this is awful to fix/change + ret.pokemonId = null; + return ret; + }), + ); } - pickUpScatteredMoney(scene: BattleScene): void { - const moneyAmount = new Utils.IntegerHolder(scene.currentBattle.moneyScattered); - scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + pickUpScatteredMoney(): void { + const moneyAmount = new Utils.NumberHolder(globalScene.currentBattle.moneyScattered); + globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); - if (scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { + if (globalScene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { moneyAmount.value *= 2; } - scene.addMoney(moneyAmount.value); + globalScene.addMoney(moneyAmount.value); const userLocale = navigator.language || "en-US"; const formattedMoneyAmount = moneyAmount.value.toLocaleString(userLocale); - const message = i18next.t("battle:moneyPickedUp", { moneyAmount: formattedMoneyAmount }); - scene.queueMessage(message, undefined, true); + const message = i18next.t("battle:moneyPickedUp", { + moneyAmount: formattedMoneyAmount, + }); + globalScene.queueMessage(message, undefined, true); - scene.currentBattle.moneyScattered = 0; + globalScene.currentBattle.moneyScattered = 0; } - addBattleScore(scene: BattleScene): void { - let partyMemberTurnMultiplier = scene.getEnemyParty().length / 2 + 0.5; + addBattleScore(): void { + let partyMemberTurnMultiplier = globalScene.getEnemyParty().length / 2 + 0.5; if (this.double) { partyMemberTurnMultiplier /= 1.5; } - for (const p of scene.getEnemyParty()) { + for (const p of globalScene.getEnemyParty()) { if (p.isBoss()) { - partyMemberTurnMultiplier *= (p.bossSegments / 1.5) / scene.getEnemyParty().length; + partyMemberTurnMultiplier *= p.bossSegments / 1.5 / globalScene.getEnemyParty().length; } } - const turnMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")(1 - Math.min(this.turn - 2, 10 * partyMemberTurnMultiplier) / (10 * partyMemberTurnMultiplier)); + const turnMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")( + 1 - Math.min(this.turn - 2, 10 * partyMemberTurnMultiplier) / (10 * partyMemberTurnMultiplier), + ); const finalBattleScore = Math.ceil(this.battleScore * turnMultiplier); - scene.score += finalBattleScore; - console.log(`Battle Score: ${finalBattleScore} (${this.turn - 1} Turns x${Math.floor(turnMultiplier * 100) / 100})`); - console.log(`Total Score: ${scene.score}`); - scene.updateScoreText(); + globalScene.score += finalBattleScore; + console.log( + `Battle Score: ${finalBattleScore} (${this.turn - 1} Turns x${Math.floor(turnMultiplier * 100) / 100})`, + ); + console.log(`Total Score: ${globalScene.score}`); + globalScene.updateScoreText(); } - getBgmOverride(scene: BattleScene): string | null { - const battlers = this.enemyParty.slice(0, this.getBattlerCount()); + getBgmOverride(): string | null { if (this.isBattleMysteryEncounter() && this.mysteryEncounter?.encounterMode === MysteryEncounterMode.DEFAULT) { // Music is overridden for MEs during ME onInit() // Should not use any BGM overrides before swapping from DEFAULT mode return null; - } else if (this.battleType === BattleType.TRAINER || this.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { + } + if ( + this.battleType === BattleType.TRAINER || + this.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE + ) { if (!this.started && this.trainer?.config.encounterBgm && this.trainer?.getEncounterMessages()?.length) { return `encounter_${this.trainer?.getEncounterBgm()}`; } - if (scene.musicPreference === 0) { + if (globalScene.musicPreference === MusicPreference.GENFIVE) { return this.trainer?.getBattleBgm() ?? null; - } else { - return this.trainer?.getMixedBattleBgm() ?? null; } - } else if (this.gameMode.isClassic && this.waveIndex > 195 && this.battleSpec !== BattleSpec.FINAL_BOSS) { + return this.trainer?.getMixedBattleBgm() ?? null; + } + if (this.gameMode.isClassic && this.waveIndex > 195 && this.battleSpec !== BattleSpec.FINAL_BOSS) { return "end_summit"; } - for (const pokemon of battlers) { + const wildOpponents = globalScene.getEnemyParty(); + for (const pokemon of wildOpponents) { if (this.battleSpec === BattleSpec.FINAL_BOSS) { - if (pokemon.formIndex) { + if (pokemon.species.getFormSpriteKey(pokemon.formIndex) === SpeciesFormKey.ETERNAMAX) { return "battle_final"; } return "battle_final_encounter"; } if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) { - if (scene.musicPreference === 0) { - if (pokemon.species.speciesId === Species.REGIROCK || pokemon.species.speciesId === Species.REGICE || pokemon.species.speciesId === Species.REGISTEEL || pokemon.species.speciesId === Species.REGIGIGAS || pokemon.species.speciesId === Species.REGIELEKI || pokemon.species.speciesId === Species.REGIDRAGO) { - return "battle_legendary_regis_g5"; + if (globalScene.musicPreference === MusicPreference.GENFIVE) { + switch (pokemon.species.speciesId) { + case Species.REGIROCK: + case Species.REGICE: + case Species.REGISTEEL: + case Species.REGIGIGAS: + case Species.REGIDRAGO: + case Species.REGIELEKI: + return "battle_legendary_regis_g5"; + case Species.KYUREM: + return "battle_legendary_kyurem"; + default: + if (pokemon.species.legendary) { + return "battle_legendary_res_zek"; + } + return "battle_legendary_unova"; } - if (pokemon.species.speciesId === Species.COBALION || pokemon.species.speciesId === Species.TERRAKION || pokemon.species.speciesId === Species.VIRIZION || pokemon.species.speciesId === Species.TORNADUS || pokemon.species.speciesId === Species.THUNDURUS || pokemon.species.speciesId === Species.LANDORUS || pokemon.species.speciesId === Species.KELDEO || pokemon.species.speciesId === Species.MELOETTA || pokemon.species.speciesId === Species.GENESECT) { - return "battle_legendary_unova"; - } - if (pokemon.species.speciesId === Species.KYUREM) { - return "battle_legendary_kyurem"; - } - if (pokemon.species.legendary) { - return "battle_legendary_res_zek"; - } - return "battle_legendary_unova"; - } else { - if (pokemon.species.speciesId === Species.ARTICUNO || pokemon.species.speciesId === Species.ZAPDOS || pokemon.species.speciesId === Species.MOLTRES || pokemon.species.speciesId === Species.MEWTWO || pokemon.species.speciesId === Species.MEW) { - return "battle_legendary_kanto"; - } - if (pokemon.species.speciesId === Species.RAIKOU) { - return "battle_legendary_raikou"; - } - if (pokemon.species.speciesId === Species.ENTEI) { - return "battle_legendary_entei"; - } - if (pokemon.species.speciesId === Species.SUICUNE) { - return "battle_legendary_suicune"; - } - if (pokemon.species.speciesId === Species.LUGIA) { - return "battle_legendary_lugia"; - } - if (pokemon.species.speciesId === Species.HO_OH) { - return "battle_legendary_ho_oh"; - } - if (pokemon.species.speciesId === Species.REGIROCK || pokemon.species.speciesId === Species.REGICE || pokemon.species.speciesId === Species.REGISTEEL || pokemon.species.speciesId === Species.REGIGIGAS || pokemon.species.speciesId === Species.REGIELEKI || pokemon.species.speciesId === Species.REGIDRAGO) { - return "battle_legendary_regis_g6"; - } - if (pokemon.species.speciesId === Species.GROUDON || pokemon.species.speciesId === Species.KYOGRE) { - return "battle_legendary_gro_kyo"; - } - if (pokemon.species.speciesId === Species.RAYQUAZA) { - return "battle_legendary_rayquaza"; - } - if (pokemon.species.speciesId === Species.DEOXYS) { - return "battle_legendary_deoxys"; - } - if (pokemon.species.speciesId === Species.UXIE || pokemon.species.speciesId === Species.MESPRIT || pokemon.species.speciesId === Species.AZELF) { - return "battle_legendary_lake_trio"; - } - if (pokemon.species.speciesId === Species.HEATRAN || pokemon.species.speciesId === Species.CRESSELIA || pokemon.species.speciesId === Species.DARKRAI || pokemon.species.speciesId === Species.SHAYMIN) { - return "battle_legendary_sinnoh"; - } - if (pokemon.species.speciesId === Species.DIALGA || pokemon.species.speciesId === Species.PALKIA) { - if (pokemon.getFormKey() === "") { + } + if (globalScene.musicPreference === MusicPreference.ALLGENS) { + switch (pokemon.species.speciesId) { + case Species.ARTICUNO: + case Species.ZAPDOS: + case Species.MOLTRES: + case Species.MEWTWO: + case Species.MEW: + return "battle_legendary_kanto"; + case Species.RAIKOU: + return "battle_legendary_raikou"; + case Species.ENTEI: + return "battle_legendary_entei"; + case Species.SUICUNE: + return "battle_legendary_suicune"; + case Species.LUGIA: + return "battle_legendary_lugia"; + case Species.HO_OH: + return "battle_legendary_ho_oh"; + case Species.REGIROCK: + case Species.REGICE: + case Species.REGISTEEL: + case Species.REGIGIGAS: + case Species.REGIDRAGO: + case Species.REGIELEKI: + return "battle_legendary_regis_g6"; + case Species.GROUDON: + case Species.KYOGRE: + return "battle_legendary_gro_kyo"; + case Species.RAYQUAZA: + return "battle_legendary_rayquaza"; + case Species.DEOXYS: + return "battle_legendary_deoxys"; + case Species.UXIE: + case Species.MESPRIT: + case Species.AZELF: + return "battle_legendary_lake_trio"; + case Species.HEATRAN: + case Species.CRESSELIA: + case Species.DARKRAI: + case Species.SHAYMIN: + return "battle_legendary_sinnoh"; + case Species.DIALGA: + case Species.PALKIA: + if (pokemon.species.getFormSpriteKey(pokemon.formIndex) === SpeciesFormKey.ORIGIN) { + return "battle_legendary_origin_forme"; + } return "battle_legendary_dia_pal"; - } - if (pokemon.getFormKey() === "origin") { - return "battle_legendary_origin_forme"; - } - } - if (pokemon.species.speciesId === Species.GIRATINA) { - return "battle_legendary_giratina"; - } - if (pokemon.species.speciesId === Species.ARCEUS) { - return "battle_legendary_arceus"; - } - if (pokemon.species.speciesId === Species.COBALION || pokemon.species.speciesId === Species.TERRAKION || pokemon.species.speciesId === Species.VIRIZION || pokemon.species.speciesId === Species.TORNADUS || pokemon.species.speciesId === Species.THUNDURUS || pokemon.species.speciesId === Species.LANDORUS || pokemon.species.speciesId === Species.KELDEO || pokemon.species.speciesId === Species.MELOETTA || pokemon.species.speciesId === Species.GENESECT) { - return "battle_legendary_unova"; - } - if (pokemon.species.speciesId === Species.KYUREM) { - return "battle_legendary_kyurem"; - } - if (pokemon.species.speciesId === Species.XERNEAS || pokemon.species.speciesId === Species.YVELTAL || pokemon.species.speciesId === Species.ZYGARDE) { - return "battle_legendary_xern_yvel"; - } - if (pokemon.species.speciesId === Species.TAPU_KOKO || pokemon.species.speciesId === Species.TAPU_LELE || pokemon.species.speciesId === Species.TAPU_BULU || pokemon.species.speciesId === Species.TAPU_FINI) { - return "battle_legendary_tapu"; - } - if ([ Species.COSMOG, Species.COSMOEM, Species.SOLGALEO, Species.LUNALA ].includes(pokemon.species.speciesId)) { - return "battle_legendary_sol_lun"; - } - if (pokemon.species.speciesId === Species.NECROZMA) { - if (pokemon.getFormKey() === "") { + case Species.GIRATINA: + return "battle_legendary_giratina"; + case Species.ARCEUS: + return "battle_legendary_arceus"; + case Species.COBALION: + case Species.TERRAKION: + case Species.VIRIZION: + case Species.KELDEO: + case Species.TORNADUS: + case Species.LANDORUS: + case Species.THUNDURUS: + case Species.MELOETTA: + case Species.GENESECT: + return "battle_legendary_unova"; + case Species.KYUREM: + return "battle_legendary_kyurem"; + case Species.XERNEAS: + case Species.YVELTAL: + case Species.ZYGARDE: + return "battle_legendary_xern_yvel"; + case Species.TAPU_KOKO: + case Species.TAPU_LELE: + case Species.TAPU_BULU: + case Species.TAPU_FINI: + return "battle_legendary_tapu"; + case Species.SOLGALEO: + case Species.LUNALA: return "battle_legendary_sol_lun"; - } - if (pokemon.getFormKey() === "dusk-mane" || pokemon.getFormKey() === "dawn-wings") { - return "battle_legendary_dusk_dawn"; - } - if (pokemon.getFormKey() === "ultra") { - return "battle_legendary_ultra_nec"; - } - } - if ([ Species.NIHILEGO, Species.BUZZWOLE, Species.PHEROMOSA, Species.XURKITREE, Species.CELESTEELA, Species.KARTANA, Species.GUZZLORD, Species.POIPOLE, Species.NAGANADEL, Species.STAKATAKA, Species.BLACEPHALON ].includes(pokemon.species.speciesId)) { - return "battle_legendary_ub"; - } - if (pokemon.species.speciesId === Species.ZACIAN || pokemon.species.speciesId === Species.ZAMAZENTA) { - return "battle_legendary_zac_zam"; - } - if (pokemon.species.speciesId === Species.GLASTRIER || pokemon.species.speciesId === Species.SPECTRIER) { - return "battle_legendary_glas_spec"; - } - if (pokemon.species.speciesId === Species.CALYREX) { - if (pokemon.getFormKey() === "") { + case Species.NECROZMA: + switch (pokemon.getFormKey()) { + case "dusk-mane": + case "dawn-wings": + return "battle_legendary_dusk_dawn"; + case "ultra": + return "battle_legendary_ultra_nec"; + default: + return "battle_legendary_sol_lun"; + } + case Species.NIHILEGO: + case Species.PHEROMOSA: + case Species.BUZZWOLE: + case Species.XURKITREE: + case Species.CELESTEELA: + case Species.KARTANA: + case Species.GUZZLORD: + case Species.POIPOLE: + case Species.NAGANADEL: + case Species.STAKATAKA: + case Species.BLACEPHALON: + return "battle_legendary_ub"; + case Species.ZACIAN: + case Species.ZAMAZENTA: + return "battle_legendary_zac_zam"; + case Species.GLASTRIER: + case Species.SPECTRIER: + return "battle_legendary_glas_spec"; + case Species.CALYREX: + if (pokemon.getFormKey() === "ice" || pokemon.getFormKey() === "shadow") { + return "battle_legendary_riders"; + } return "battle_legendary_calyrex"; - } - if (pokemon.getFormKey() === "ice" || pokemon.getFormKey() === "shadow") { - return "battle_legendary_riders"; - } + case Species.GALAR_ARTICUNO: + case Species.GALAR_ZAPDOS: + case Species.GALAR_MOLTRES: + return "battle_legendary_birds_galar"; + case Species.WO_CHIEN: + case Species.CHIEN_PAO: + case Species.TING_LU: + case Species.CHI_YU: + return "battle_legendary_ruinous"; + case Species.KORAIDON: + case Species.MIRAIDON: + return "battle_legendary_kor_mir"; + case Species.OKIDOGI: + case Species.MUNKIDORI: + case Species.FEZANDIPITI: + return "battle_legendary_loyal_three"; + case Species.OGERPON: + return "battle_legendary_ogerpon"; + case Species.TERAPAGOS: + return "battle_legendary_terapagos"; + case Species.PECHARUNT: + return "battle_legendary_pecharunt"; + default: + if (pokemon.species.legendary) { + return "battle_legendary_res_zek"; + } + return "battle_legendary_unova"; } - if (pokemon.species.speciesId === Species.GALAR_ARTICUNO || pokemon.species.speciesId === Species.GALAR_ZAPDOS || pokemon.species.speciesId === Species.GALAR_MOLTRES) { - return "battle_legendary_birds_galar"; - } - if (pokemon.species.speciesId === Species.WO_CHIEN || pokemon.species.speciesId === Species.CHIEN_PAO || pokemon.species.speciesId === Species.TING_LU || pokemon.species.speciesId === Species.CHI_YU) { - return "battle_legendary_ruinous"; - } - if (pokemon.species.speciesId === Species.KORAIDON || pokemon.species.speciesId === Species.MIRAIDON) { - return "battle_legendary_kor_mir"; - } - if (pokemon.species.speciesId === Species.OKIDOGI || pokemon.species.speciesId === Species.MUNKIDORI || pokemon.species.speciesId === Species.FEZANDIPITI) { - return "battle_legendary_loyal_three"; - } - if (pokemon.species.speciesId === Species.OGERPON) { - return "battle_legendary_ogerpon"; - } - if (pokemon.species.speciesId === Species.TERAPAGOS) { - return "battle_legendary_terapagos"; - } - if (pokemon.species.speciesId === Species.PECHARUNT) { - return "battle_legendary_pecharunt"; - } - if (pokemon.species.legendary) { - return "battle_legendary_res_zek"; - } - return "battle_legendary_unova"; } } } - if (scene.gameMode.isClassic && this.waveIndex <= 4) { + if (globalScene.gameMode.isClassic && this.waveIndex <= 4) { return "battle_wild"; } @@ -387,26 +453,26 @@ export default class Battle { * @param min The minimum integer to pick, default `0` * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) */ - randSeedInt(scene: BattleScene, range: number, min: number = 0): number { + randSeedInt(range: number, min = 0): number { if (range <= 1) { return min; } - const tempRngCounter = scene.rngCounter; - const tempSeedOverride = scene.rngSeedOverride; + const tempRngCounter = globalScene.rngCounter; + const tempSeedOverride = globalScene.rngSeedOverride; const state = Phaser.Math.RND.state(); if (this.battleSeedState) { Phaser.Math.RND.state(this.battleSeedState); } else { - Phaser.Math.RND.sow([ Utils.shiftCharCodes(this.battleSeed, this.turn << 6) ]); + Phaser.Math.RND.sow([Utils.shiftCharCodes(this.battleSeed, this.turn << 6)]); console.log("Battle Seed:", this.battleSeed); } - scene.rngCounter = this.rngCounter++; - scene.rngSeedOverride = this.battleSeed; + globalScene.rngCounter = this.rngCounter++; + globalScene.rngSeedOverride = this.battleSeed; const ret = Utils.randSeedInt(range, min); this.battleSeedState = Phaser.Math.RND.state(); Phaser.Math.RND.state(state); - scene.rngCounter = tempRngCounter; - scene.rngSeedOverride = tempSeedOverride; + globalScene.rngCounter = tempRngCounter; + globalScene.rngSeedOverride = tempSeedOverride; return ret; } @@ -419,16 +485,22 @@ export default class Battle { } export class FixedBattle extends Battle { - constructor(scene: BattleScene, waveIndex: number, config: FixedBattleConfig) { - super(scene.gameMode, waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer(scene) : undefined, config.double); + constructor(waveIndex: number, config: FixedBattleConfig) { + super( + globalScene.gameMode, + waveIndex, + config.battleType, + config.battleType === BattleType.TRAINER ? config.getTrainer() : undefined, + config.double, + ); if (config.getEnemyParty) { - this.enemyParty = config.getEnemyParty(scene); + this.enemyParty = config.getEnemyParty(); } } } -type GetTrainerFunc = (scene: BattleScene) => Trainer; -type GetEnemyPartyFunc = (scene: BattleScene) => EnemyPokemon[]; +type GetTrainerFunc = () => Trainer; +type GetEnemyPartyFunc = () => EnemyPokemon[]; export class FixedBattleConfig { public battleType: BattleType; @@ -469,7 +541,6 @@ export class FixedBattleConfig { } } - /** * Helper function to generate a random trainer for evil team trainers and the elite 4/champion * @param trainerPool The TrainerType or list of TrainerTypes that can possibly be generated @@ -477,39 +548,52 @@ export class FixedBattleConfig { * @param seedOffset the seed offset to use for the random generation of the trainer * @returns the generated trainer */ -function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[], randomGender: boolean = false, seedOffset: number = 0): GetTrainerFunc { - return (scene: BattleScene) => { +export function getRandomTrainerFunc( + trainerPool: (TrainerType | TrainerType[])[], + randomGender = false, + seedOffset = 0, +): GetTrainerFunc { + return () => { const rand = Utils.randSeedInt(trainerPool.length); const trainerTypes: TrainerType[] = []; - scene.executeWithSeedOffset(() => { + globalScene.executeWithSeedOffset(() => { for (const trainerPoolEntry of trainerPool) { - const trainerType = Array.isArray(trainerPoolEntry) - ? Utils.randSeedItem(trainerPoolEntry) - : trainerPoolEntry; + const trainerType = Array.isArray(trainerPoolEntry) ? Utils.randSeedItem(trainerPoolEntry) : trainerPoolEntry; trainerTypes.push(trainerType); } }, seedOffset); let trainerGender = TrainerVariant.DEFAULT; if (randomGender) { - trainerGender = (Utils.randInt(2) === 0) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; + trainerGender = Utils.randInt(2) === 0 ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; } /* 1/3 chance for evil team grunts to be double battles */ - const evilTeamGrunts = [ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ]; + const evilTeamGrunts = [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ]; const isEvilTeamGrunt = evilTeamGrunts.includes(trainerTypes[rand]); if (trainerConfigs[trainerTypes[rand]].hasDouble && isEvilTeamGrunt) { - return new Trainer(scene, trainerTypes[rand], (Utils.randInt(3) === 0) ? TrainerVariant.DOUBLE : trainerGender); + return new Trainer(trainerTypes[rand], Utils.randInt(3) === 0 ? TrainerVariant.DOUBLE : trainerGender); } - return new Trainer(scene, trainerTypes[rand], trainerGender); + return new Trainer(trainerTypes[rand], trainerGender); }; } export interface FixedBattleConfigs { - [key: number]: FixedBattleConfig + [key: number]: FixedBattleConfig; } /** * Youngster/Lass on 5 @@ -521,51 +605,355 @@ export interface FixedBattleConfigs { * Champion on 190 */ export const classicFixedBattles: FixedBattleConfigs = { - [5]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.YOUNGSTER, Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [8]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], allowLuckUpgrades: false }), - [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)), - [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], allowLuckUpgrades: false }), - [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)), - [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)), - [66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA, [ TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI ]], true)), - [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }), - [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT, TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT, TrainerType.MACRO_GRUNT, TrainerType.STAR_GRUNT ], true)), - [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([[ TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL ], [ TrainerType.TABITHA, TrainerType.COURTNEY ], [ TrainerType.MATT, TrainerType.SHELLY ], [ TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN ], [ TrainerType.ZINZOLIN, TrainerType.ROOD ], [ TrainerType.XEROSIC, TrainerType.BRYONY ], TrainerType.FABA, TrainerType.PLUMERIA, TrainerType.OLEANA, [ TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI ]], true, 1)), - [ClassicFixedBossWaves.EVIL_BOSS_1]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE, TrainerType.LUSAMINE, TrainerType.GUZMA, TrainerType.ROSE, TrainerType.PENNY ])) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }), - [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }), - [ClassicFixedBossWaves.EVIL_BOSS_2]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2, TrainerType.LUSAMINE_2, TrainerType.GUZMA_2, TrainerType.ROSE_2, TrainerType.PENNY_2 ])) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA ], allowLuckUpgrades: false }), - [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])), - [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY, TrainerType.AMARYS ])), - [186]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, [ TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE ], TrainerType.LARRY_ELITE, TrainerType.LACEY ])), - [188]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL, TrainerType.DRAYTON ])), - [190]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN ])), - [195]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_6, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) - .setCustomModifierRewards({ guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], allowLuckUpgrades: false }) + [ClassicFixedBossWaves.TOWN_YOUNGSTER]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => new Trainer(TrainerType.YOUNGSTER, Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT), + ), + [ClassicFixedBossWaves.RIVAL_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ), + [ClassicFixedBossWaves.RIVAL_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_2, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.EVIL_GRUNT_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ], + true, + ), + ), + [ClassicFixedBossWaves.RIVAL_3]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_3, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.EVIL_GRUNT_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ], + true, + ), + ), + [ClassicFixedBossWaves.EVIL_GRUNT_3]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ], + true, + ), + ), + [ClassicFixedBossWaves.EVIL_ADMIN_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + [TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL], + [TrainerType.TABITHA, TrainerType.COURTNEY], + [TrainerType.MATT, TrainerType.SHELLY], + [TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN], + [TrainerType.ZINZOLIN, TrainerType.COLRESS], + [TrainerType.XEROSIC, TrainerType.BRYONY], + TrainerType.FABA, + TrainerType.PLUMERIA, + TrainerType.OLEANA, + [TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI], + ], + true, + ), + ), + [ClassicFixedBossWaves.RIVAL_4]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_4, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.EVIL_GRUNT_4]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + TrainerType.ROCKET_GRUNT, + TrainerType.MAGMA_GRUNT, + TrainerType.AQUA_GRUNT, + TrainerType.GALACTIC_GRUNT, + TrainerType.PLASMA_GRUNT, + TrainerType.FLARE_GRUNT, + TrainerType.AETHER_GRUNT, + TrainerType.SKULL_GRUNT, + TrainerType.MACRO_GRUNT, + TrainerType.STAR_GRUNT, + ], + true, + ), + ), + [ClassicFixedBossWaves.EVIL_ADMIN_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc( + [ + [TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL], + [TrainerType.TABITHA, TrainerType.COURTNEY], + [TrainerType.MATT, TrainerType.SHELLY], + [TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN], + [TrainerType.ZINZOLIN, TrainerType.COLRESS], + [TrainerType.XEROSIC, TrainerType.BRYONY], + TrainerType.FABA, + TrainerType.PLUMERIA, + TrainerType.OLEANA, + [TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI], + ], + true, + 1, + ), + ), + [ClassicFixedBossWaves.EVIL_BOSS_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.ROCKET_BOSS_GIOVANNI_1, + TrainerType.MAXIE, + TrainerType.ARCHIE, + TrainerType.CYRUS, + TrainerType.GHETSIS, + TrainerType.LYSANDRE, + TrainerType.LUSAMINE, + TrainerType.GUZMA, + TrainerType.ROSE, + TrainerType.PENNY, + ]), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.RIVAL_5]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_5, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.EVIL_BOSS_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.ROCKET_BOSS_GIOVANNI_2, + TrainerType.MAXIE_2, + TrainerType.ARCHIE_2, + TrainerType.CYRUS_2, + TrainerType.GHETSIS_2, + TrainerType.LYSANDRE_2, + TrainerType.LUSAMINE_2, + TrainerType.GUZMA_2, + TrainerType.ROSE_2, + TrainerType.PENNY_2, + ]), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }), + [ClassicFixedBossWaves.ELITE_FOUR_1]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.LORELEI, + TrainerType.WILL, + TrainerType.SIDNEY, + TrainerType.AARON, + TrainerType.SHAUNTAL, + TrainerType.MALVA, + [TrainerType.HALA, TrainerType.MOLAYNE], + TrainerType.MARNIE_ELITE, + TrainerType.RIKA, + TrainerType.CRISPIN, + ]), + ), + [ClassicFixedBossWaves.ELITE_FOUR_2]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.BRUNO, + TrainerType.KOGA, + TrainerType.PHOEBE, + TrainerType.BERTHA, + TrainerType.MARSHAL, + TrainerType.SIEBOLD, + TrainerType.OLIVIA, + TrainerType.NESSA_ELITE, + TrainerType.POPPY, + TrainerType.AMARYS, + ]), + ), + [ClassicFixedBossWaves.ELITE_FOUR_3]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.AGATHA, + TrainerType.BRUNO, + TrainerType.GLACIA, + TrainerType.FLINT, + TrainerType.GRIMSLEY, + TrainerType.WIKSTROM, + TrainerType.ACEROLA, + [TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE], + TrainerType.LARRY_ELITE, + TrainerType.LACEY, + ]), + ), + [ClassicFixedBossWaves.ELITE_FOUR_4]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.LANCE, + TrainerType.KAREN, + TrainerType.DRAKE, + TrainerType.LUCIAN, + TrainerType.CAITLIN, + TrainerType.DRASNA, + TrainerType.KAHILI, + TrainerType.RAIHAN_ELITE, + TrainerType.HASSEL, + TrainerType.DRAYTON, + ]), + ), + [ClassicFixedBossWaves.CHAMPION]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.ELITE_FOUR_1) + .setGetTrainerFunc( + getRandomTrainerFunc([ + TrainerType.BLUE, + [TrainerType.RED, TrainerType.LANCE_CHAMPION], + [TrainerType.STEVEN, TrainerType.WALLACE], + TrainerType.CYNTHIA, + [TrainerType.ALDER, TrainerType.IRIS], + TrainerType.DIANTHA, + [TrainerType.KUKUI, TrainerType.HAU], + [TrainerType.LEON, TrainerType.MUSTARD], + [TrainerType.GEETA, TrainerType.NEMONA], + TrainerType.KIERAN, + ]), + ), + [ClassicFixedBossWaves.RIVAL_6]: new FixedBattleConfig() + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc( + () => + new Trainer( + TrainerType.RIVAL_6, + globalScene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + ), + ) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.GREAT, + ModifierTier.GREAT, + ], + allowLuckUpgrades: false, + }), }; diff --git a/src/configs/inputs/cfg_keyboard_qwerty.ts b/src/configs/inputs/cfg_keyboard_qwerty.ts index 5ddc12e8784..2ad04ab418d 100644 --- a/src/configs/inputs/cfg_keyboard_qwerty.ts +++ b/src/configs/inputs/cfg_keyboard_qwerty.ts @@ -77,7 +77,7 @@ const cfg_keyboard_qwerty = { KEY_RIGHT_BRACKET: Phaser.Input.Keyboard.KeyCodes.CLOSED_BRACKET, KEY_SEMICOLON: Phaser.Input.Keyboard.KeyCodes.SEMICOLON, KEY_BACKSPACE: Phaser.Input.Keyboard.KeyCodes.BACKSPACE, - KEY_ALT: Phaser.Input.Keyboard.KeyCodes.ALT + KEY_ALT: Phaser.Input.Keyboard.KeyCodes.ALT, }, icons: { KEY_A: "A.png", @@ -131,7 +131,6 @@ const cfg_keyboard_qwerty = { KEY_F11: "F11.png", KEY_F12: "F12.png", - KEY_PAGE_DOWN: "PAGE_DOWN.png", KEY_PAGE_UP: "PAGE_UP.png", @@ -163,7 +162,7 @@ const cfg_keyboard_qwerty = { KEY_SEMICOLON: "SEMICOLON.png", KEY_BACKSPACE: "BACK.png", - KEY_ALT: "ALT.png" + KEY_ALT: "ALT.png", }, settings: { [SettingKeyboard.Button_Up]: Button.UP, @@ -180,9 +179,9 @@ const cfg_keyboard_qwerty = { [SettingKeyboard.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingKeyboard.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingKeyboard.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingKeyboard.Button_Cycle_Variant]: Button.V, [SettingKeyboard.Button_Speed_Up]: Button.SPEED_UP, [SettingKeyboard.Button_Slow_Down]: Button.SLOW_DOWN, + [SettingKeyboard.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingKeyboard.Alt_Button_Up]: Button.UP, [SettingKeyboard.Alt_Button_Down]: Button.DOWN, [SettingKeyboard.Alt_Button_Left]: Button.LEFT, @@ -197,9 +196,9 @@ const cfg_keyboard_qwerty = { [SettingKeyboard.Alt_Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingKeyboard.Alt_Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingKeyboard.Alt_Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingKeyboard.Alt_Button_Cycle_Variant]: Button.V, [SettingKeyboard.Alt_Button_Speed_Up]: Button.SPEED_UP, [SettingKeyboard.Alt_Button_Slow_Down]: Button.SLOW_DOWN, + [SettingKeyboard.Alt_Button_Cycle_Tera]: Button.CYCLE_TERA, }, default: { KEY_ARROW_UP: SettingKeyboard.Button_Up, @@ -216,7 +215,7 @@ const cfg_keyboard_qwerty = { KEY_G: SettingKeyboard.Button_Cycle_Gender, KEY_E: SettingKeyboard.Button_Cycle_Ability, KEY_N: SettingKeyboard.Button_Cycle_Nature, - KEY_V: SettingKeyboard.Button_Cycle_Variant, + KEY_V: SettingKeyboard.Button_Cycle_Tera, KEY_PLUS: -1, KEY_MINUS: -1, KEY_A: SettingKeyboard.Alt_Button_Left, @@ -274,7 +273,7 @@ const cfg_keyboard_qwerty = { KEY_LEFT_BRACKET: -1, KEY_RIGHT_BRACKET: -1, KEY_SEMICOLON: -1, - KEY_ALT: -1 + KEY_ALT: -1, }, blacklist: [ "KEY_ENTER", @@ -287,7 +286,7 @@ const cfg_keyboard_qwerty = { "KEY_ARROW_RIGHT", "KEY_DEL", "KEY_HOME", - ] + ], }; export default cfg_keyboard_qwerty; diff --git a/src/configs/inputs/configHandler.ts b/src/configs/inputs/configHandler.ts index 50be692cbc3..b896f303cb3 100644 --- a/src/configs/inputs/configHandler.ts +++ b/src/configs/inputs/configHandler.ts @@ -93,7 +93,7 @@ export function getIconWithSettingName(config, settingName) { } export function getIconForLatestInput(configs, source, devices, settingName) { - let config; + let config: any; // TODO: refine type if (source === "gamepad") { config = configs[devices[Device.GAMEPAD]]; } else { @@ -102,7 +102,7 @@ export function getIconForLatestInput(configs, source, devices, settingName) { const icon = getIconWithSettingName(config, settingName); if (!icon) { const isAlt = settingName.includes("ALT_"); - let altSettingName; + let altSettingName: string; if (isAlt) { altSettingName = settingName.split("ALT_").splice(1)[0]; } else { @@ -115,7 +115,10 @@ export function getIconForLatestInput(configs, source, devices, settingName) { export function assign(config, settingNameTarget, keycode): boolean { // first, we need to check if this keycode is already used on another settingName - if (!canIAssignThisKey(config, getKeyWithKeycode(config, keycode)) || !canIOverrideThisSetting(config, settingNameTarget)) { + if ( + !canIAssignThisKey(config, getKeyWithKeycode(config, keycode)) || + !canIOverrideThisSetting(config, settingNameTarget) + ) { return false; } const previousSettingName = getSettingNameWithKeycode(config, keycode); diff --git a/src/configs/inputs/pad_dualshock.ts b/src/configs/inputs/pad_dualshock.ts index 2fbdd0ddfaa..51af1b2defd 100644 --- a/src/configs/inputs/pad_dualshock.ts +++ b/src/configs/inputs/pad_dualshock.ts @@ -24,7 +24,7 @@ const pad_dualshock = { LC_S: 13, LC_W: 14, LC_E: 15, - TOUCH: 17 + TOUCH: 17, }, icons: { RC_S: "CROSS.png", @@ -43,7 +43,7 @@ const pad_dualshock = { LC_S: "DOWN.png", LC_W: "LEFT.png", LC_E: "RIGHT.png", - TOUCH: "TOUCH.png" + TOUCH: "TOUCH.png", }, settings: { [SettingGamepad.Button_Up]: Button.UP, @@ -53,16 +53,16 @@ const pad_dualshock = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, - [SettingGamepad.Button_Submit]: Button.SUBMIT + [SettingGamepad.Button_Submit]: Button.SUBMIT, }, default: { LC_N: SettingGamepad.Button_Up, @@ -72,7 +72,7 @@ const pad_dualshock = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, diff --git a/src/configs/inputs/pad_generic.ts b/src/configs/inputs/pad_generic.ts index 256af8f0fe3..e47b7ce1ace 100644 --- a/src/configs/inputs/pad_generic.ts +++ b/src/configs/inputs/pad_generic.ts @@ -23,7 +23,7 @@ const pad_generic = { LC_N: 12, LC_S: 13, LC_W: 14, - LC_E: 15 + LC_E: 15, }, icons: { RC_S: "XB_Letter_A_OL.png", @@ -51,15 +51,15 @@ const pad_generic = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, - [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN + [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, }, default: { LC_N: SettingGamepad.Button_Up, @@ -69,7 +69,7 @@ const pad_generic = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, @@ -77,14 +77,9 @@ const pad_generic = { LT: SettingGamepad.Button_Cycle_Gender, RT: SettingGamepad.Button_Cycle_Ability, LS: SettingGamepad.Button_Speed_Up, - RS: SettingGamepad.Button_Slow_Down + RS: SettingGamepad.Button_Slow_Down, }, - blacklist: [ - "LC_N", - "LC_S", - "LC_W", - "LC_E", - ] + blacklist: ["LC_N", "LC_S", "LC_W", "LC_E"], }; export default pad_generic; diff --git a/src/configs/inputs/pad_procon.ts b/src/configs/inputs/pad_procon.ts index 98d17c4ef57..61558c7365e 100644 --- a/src/configs/inputs/pad_procon.ts +++ b/src/configs/inputs/pad_procon.ts @@ -52,15 +52,15 @@ const pad_procon = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, - [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN + [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, }, default: { LC_N: SettingGamepad.Button_Up, @@ -70,7 +70,7 @@ const pad_procon = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, @@ -78,7 +78,7 @@ const pad_procon = { LT: SettingGamepad.Button_Cycle_Gender, RT: SettingGamepad.Button_Cycle_Ability, LS: SettingGamepad.Button_Speed_Up, - RS: SettingGamepad.Button_Slow_Down + RS: SettingGamepad.Button_Slow_Down, }, }; diff --git a/src/configs/inputs/pad_unlicensedSNES.ts b/src/configs/inputs/pad_unlicensedSNES.ts index 77e68e6a644..d0c4f41c8f5 100644 --- a/src/configs/inputs/pad_unlicensedSNES.ts +++ b/src/configs/inputs/pad_unlicensedSNES.ts @@ -7,7 +7,7 @@ import { Button } from "#enums/buttons"; const pad_unlicensedSNES = { padID: "081f-e401", padType: "xbox", - deviceMapping : { + deviceMapping: { RC_S: 2, RC_E: 1, RC_W: 3, @@ -19,7 +19,7 @@ const pad_unlicensedSNES = { LC_N: 12, LC_S: 13, LC_W: 14, - LC_E: 15 + LC_E: 15, }, icons: { RC_S: "XB_Letter_A_OL.png", @@ -43,15 +43,15 @@ const pad_unlicensedSNES = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, - [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN + [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, }, default: { LC_N: SettingGamepad.Button_Up, @@ -61,7 +61,7 @@ const pad_unlicensedSNES = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, @@ -69,7 +69,7 @@ const pad_unlicensedSNES = { LT: -1, RT: -1, LS: -1, - RS: -1 + RS: -1, }, }; diff --git a/src/configs/inputs/pad_xbox360.ts b/src/configs/inputs/pad_xbox360.ts index 6afc452f50b..60cbd9ab181 100644 --- a/src/configs/inputs/pad_xbox360.ts +++ b/src/configs/inputs/pad_xbox360.ts @@ -23,7 +23,7 @@ const pad_xbox360 = { LC_N: 12, LC_S: 13, LC_W: 14, - LC_E: 15 + LC_E: 15, }, icons: { RC_S: "XB_Letter_A_OL.png", @@ -51,15 +51,15 @@ const pad_xbox360 = { [SettingGamepad.Button_Action]: Button.ACTION, [SettingGamepad.Button_Cancel]: Button.CANCEL, [SettingGamepad.Button_Cycle_Nature]: Button.CYCLE_NATURE, - [SettingGamepad.Button_Cycle_Variant]: Button.V, + [SettingGamepad.Button_Cycle_Tera]: Button.CYCLE_TERA, [SettingGamepad.Button_Menu]: Button.MENU, [SettingGamepad.Button_Stats]: Button.STATS, - [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, + [SettingGamepad.Button_Cycle_Form]: Button.CYCLE_FORM, [SettingGamepad.Button_Cycle_Shiny]: Button.CYCLE_SHINY, [SettingGamepad.Button_Cycle_Gender]: Button.CYCLE_GENDER, [SettingGamepad.Button_Cycle_Ability]: Button.CYCLE_ABILITY, [SettingGamepad.Button_Speed_Up]: Button.SPEED_UP, - [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN + [SettingGamepad.Button_Slow_Down]: Button.SLOW_DOWN, }, default: { LC_N: SettingGamepad.Button_Up, @@ -69,7 +69,7 @@ const pad_xbox360 = { RC_S: SettingGamepad.Button_Action, RC_E: SettingGamepad.Button_Cancel, RC_W: SettingGamepad.Button_Cycle_Nature, - RC_N: SettingGamepad.Button_Cycle_Variant, + RC_N: SettingGamepad.Button_Cycle_Tera, START: SettingGamepad.Button_Menu, SELECT: SettingGamepad.Button_Stats, LB: SettingGamepad.Button_Cycle_Form, @@ -77,7 +77,7 @@ const pad_xbox360 = { LT: SettingGamepad.Button_Cycle_Gender, RT: SettingGamepad.Button_Cycle_Ability, LS: SettingGamepad.Button_Speed_Up, - RS: SettingGamepad.Button_Slow_Down + RS: SettingGamepad.Button_Slow_Down, }, }; diff --git a/src/constants.ts b/src/constants.ts index 0b1261ad814..63f00b9f33f 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3,3 +3,9 @@ export const PLAYER_PARTY_MAX_SIZE: number = 6; /** Whether to use seasonal splash messages in general */ export const USE_SEASONAL_SPLASH_MESSAGES: boolean = false; + +/** Name of the session ID cookie */ +export const SESSION_ID_COOKIE_NAME: string = "pokerogue_sessionId"; + +/** Max value for an integer attribute in {@linkcode SystemSaveData} */ +export const MAX_INT_ATTR_VALUE = 0x80000000; diff --git a/src/data/ability.ts b/src/data/ability.ts index d761657f5cd..0b5b3624c73 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,23 +1,32 @@ -import Pokemon, { HitResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; -import { Type } from "./type"; -import { Constructor } from "#app/utils"; +import type { EnemyPokemon, PokemonMove } from "../field/pokemon"; +import type Pokemon from "../field/pokemon"; +import { HitResult, MoveResult, PlayerPokemon } from "../field/pokemon"; +import { PokemonType } from "#enums/pokemon-type"; +import type { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { getPokemonNameWithAffix } from "../messages"; -import { Weather, WeatherType } from "./weather"; -import { BattlerTag, GroundedTag } from "./battler-tags"; -import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; +import type { Weather } from "#app/data/weather"; +import type { BattlerTag } from "./battler-tags"; +import { BattlerTagLapseType, GroundedTag } from "./battler-tags"; +import { getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "#app/data/status-effect"; import { Gender } from "./gender"; -import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, SacrificialAttr, SacrificialAttrOnHit, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./move"; -import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; -import { BerryModifier, PokemonHeldItemModifier } from "../modifier/modifier"; +import type Move from "./moves/move"; +import { AttackMove, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./moves/move"; +import { MoveFlags } from "#enums/MoveFlags"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveCategory } from "#enums/MoveCategory"; +import type { ArenaTrapTag, SuppressAbilitiesTag } from "./arena-tag"; +import { ArenaTagSide } from "./arena-tag"; +import { BerryModifier, HitHealModifier, PokemonHeldItemModifier } from "../modifier/modifier"; import { TerrainType } from "./terrain"; -import { SpeciesFormChangeManualTrigger, SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "./pokemon-forms"; +import { SpeciesFormChangeAbilityTrigger, SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "./pokemon-forms"; import i18next from "i18next"; -import { Localizable } from "#app/interfaces/locales"; +import type { Localizable } from "#app/interfaces/locales"; import { Command } from "../ui/command-ui-handler"; import { BerryModifierType } from "#app/modifier/modifier-type"; import { getPokeballName } from "./pokeball"; -import { BattlerIndex } from "#app/battle"; +import type { BattlerIndex } from "#app/battle"; +import { BattleType } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -26,9 +35,18 @@ import { Species } from "#enums/species"; import { Stat, type BattleStat, type EffectiveStat, BATTLE_STATS, EFFECTIVE_STATS, getStatKey } from "#app/enums/stat"; import { MovePhase } from "#app/phases/move-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; -import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import { SwitchType } from "#app/enums/switch-type"; +import { SwitchPhase } from "#app/phases/switch-phase"; +import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; +import { BattleEndPhase } from "#app/phases/battle-end-phase"; +import { NewBattlePhase } from "#app/phases/new-battle-phase"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; +import { PokemonAnimType } from "#enums/pokemon-anim-type"; +import { StatusEffect } from "#enums/status-effect"; +import { WeatherType } from "#enums/weather-type"; +import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; export class Ability implements Localizable { public id: Abilities; @@ -36,13 +54,13 @@ export class Ability implements Localizable { private nameAppend: string; public name: string; public description: string; - public generation: integer; + public generation: number; public isBypassFaint: boolean; public isIgnorable: boolean; public attrs: AbAttr[]; public conditions: AbAttrCondition[]; - constructor(id: Abilities, generation: integer) { + constructor(id: Abilities, generation: number) { this.id = id; this.nameAppend = ""; @@ -128,7 +146,8 @@ export class Ability implements Localizable { } } -type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => boolean | Promise; +type AbAttrApplyFunc = (attr: TAttr, passive: boolean) => void; +type AbAttrSuccessFunc = (attr: TAttr, passive: boolean) => boolean; type AbAttrCondition = (pokemon: Pokemon) => boolean; // TODO: Can this be improved? @@ -140,13 +159,19 @@ export abstract class AbAttr { public showAbility: boolean; private extraCondition: AbAttrCondition; - constructor(showAbility: boolean = true) { + constructor(showAbility = true) { this.showAbility = showAbility; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { - return false; - } + /** + * Applies ability effects without checking conditions + * @param pokemon - The pokemon to apply this ability to + * @param passive - Whether or not the ability is a passive + * @param simulated - Whether the call is simulated + * @param args - Extra args passed to the function. Handled by child classes. + * @see {@linkcode canApply} + */ + apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): void {} getTriggerMessage(_pokemon: Pokemon, _abilityName: string, ..._args: any[]): string | null { return null; @@ -160,13 +185,28 @@ export abstract class AbAttr { this.extraCondition = condition; return this; } + + /** + * Returns a boolean describing whether the ability can be applied under current conditions + * @param pokemon - The pokemon to apply this ability to + * @param passive - Whether or not the ability is a passive + * @param simulated - Whether the call is simulated + * @param args - Extra args passed to the function. Handled by child classes. + * @returns `true` if the ability can be applied, `false` otherwise + * @see {@linkcode apply} + */ + canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; + } } export class BlockRecoilDamageAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - cancelled.value = true; + constructor() { + super(false); + } - return true; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { @@ -177,7 +217,7 @@ export class BlockRecoilDamageAttr extends AbAttr { /** * Attribute for abilities that increase the chance of a double battle * occurring. - * @see apply + * @see {@linkcode apply} */ export class DoubleBattleChanceAbAttr extends AbAttr { constructor() { @@ -187,106 +227,160 @@ export class DoubleBattleChanceAbAttr extends AbAttr { /** * Increases the chance of a double battle occurring * @param args [0] {@linkcode Utils.NumberHolder} for double battle chance - * @returns true if the ability was applied */ - apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): void { const doubleBattleChance = args[0] as Utils.NumberHolder; // This is divided because the chance is generated as a number from 0 to doubleBattleChance.value using Utils.randSeedInt // A double battle will initiate if the generated number is 0 doubleBattleChance.value = doubleBattleChance.value / 4; - - return true; } } export class PostBattleInitAbAttr extends AbAttr { - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - return false; + canApplyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } export class PostBattleInitFormChangeAbAttr extends PostBattleInitAbAttr { - private formFunc: (p: Pokemon) => integer; + private formFunc: (p: Pokemon) => number; - constructor(formFunc: ((p: Pokemon) => integer)) { - super(true); + constructor(formFunc: ((p: Pokemon) => number)) { + super(false); this.formFunc = formFunc; } - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex && !simulated) { - return pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - } + return formIndex !== pokemon.formIndex && !simulated; + } - return false; + override applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); } } -export class PostBattleInitStatStageChangeAbAttr extends PostBattleInitAbAttr { +export class PostTeraFormChangeStatChangeAbAttr extends AbAttr { private stats: BattleStat[]; private stages: number; - private selfTarget: boolean; - constructor(stats: BattleStat[], stages: number, selfTarget?: boolean) { + constructor(stats: BattleStat[], stages: number) { super(); this.stats = stats; this.stages = stages; - this.selfTarget = !!selfTarget; } - applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder | null, args: any[]): void { const statStageChangePhases: StatStageChangePhase[] = []; if (!simulated) { - if (this.selfTarget) { - statStageChangePhases.push(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages)); - } else { - for (const opponent of pokemon.getOpponents()) { - statStageChangePhases.push(new StatStageChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.stages)); - } - } + statStageChangePhases.push(new StatStageChangePhase(pokemon.getBattlerIndex(), true, this.stats, this.stages)); for (const statStageChangePhase of statStageChangePhases) { - if (!this.selfTarget && !statStageChangePhase.getPokemon()?.summonData) { - pokemon.scene.pushPhase(statStageChangePhase); - } else { // TODO: This causes the ability bar to be shown at the wrong time - pokemon.scene.unshiftPhase(statStageChangePhase); - } + globalScene.unshiftPhase(statStageChangePhase); } } + } +} - return true; +/** + * Clears a specified weather whenever this attribute is called. + */ +export class ClearWeatherAbAttr extends AbAttr { + private weather: WeatherType[]; + + /** + * @param weather {@linkcode WeatherType[]} - the weather to be removed + */ + constructor(weather: WeatherType[]) { + super(true); + + this.weather = weather; + } + + public override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.canSetWeather(WeatherType.NONE); + } + + public override apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetWeather(WeatherType.NONE, true); + } + } +} + +/** + * Clears a specified terrain whenever this attribute is called. + */ +export class ClearTerrainAbAttr extends AbAttr { + private terrain: TerrainType[]; + + /** + * @param terrain {@linkcode TerrainType[]} - the terrain to be removed + */ + constructor(terrain: TerrainType[]) { + super(true); + + this.terrain = terrain; + } + + public override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.canSetTerrain(TerrainType.NONE); + } + + public override apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetTerrain(TerrainType.NONE, true, true); + } } } type PreDefendAbAttrCondition = (pokemon: Pokemon, attacker: Pokemon, move: Move) => boolean; export class PreDefendAbAttr extends AbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { - return false; + canApplyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[]): boolean { + return true; } + + applyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[], + ): void {} } export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (pokemon.isFullHp() - && pokemon.getMaxHp() > 1 //Checks if pokemon has wonder_guard (which forces 1hp) - && (args[0] as Utils.NumberHolder).value >= pokemon.hp) { //Damage >= hp - return simulated || pokemon.addTag(BattlerTagType.STURDY, 1); - } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return pokemon.isFullHp() + && pokemon.getMaxHp() > 1 //Checks if pokemon has wonder_guard (which forces 1hp) + && (args[0] as Utils.NumberHolder).value >= pokemon.hp; //Damage >= hp + } - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + pokemon.addTag(BattlerTagType.STURDY, 1); + } } } export class BlockItemTheftAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { @@ -298,13 +392,16 @@ export class BlockItemTheftAbAttr extends AbAttr { } export class StabBoostAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if ((args[0] as Utils.NumberHolder).value > 1) { - (args[0] as Utils.NumberHolder).value += 0.5; - return true; - } + constructor() { + super(false); + } - return false; + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return (args[0] as Utils.NumberHolder).value > 1; + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value += 0.5; } } @@ -312,27 +409,48 @@ export class ReceivedMoveDamageMultiplierAbAttr extends PreDefendAbAttr { protected condition: PokemonDefendCondition; private damageMultiplier: number; - constructor(condition: PokemonDefendCondition, damageMultiplier: number) { - super(); + constructor(condition: PokemonDefendCondition, damageMultiplier: number, showAbility: boolean = false) { + super(showAbility); this.condition = condition; this.damageMultiplier = damageMultiplier; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.condition(pokemon, attacker, move)) { - (args[0] as Utils.NumberHolder).value = Utils.toDmgValue((args[0] as Utils.NumberHolder).value * this.damageMultiplier); + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return this.condition(pokemon, attacker, move); + } - return true; - } + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue((args[0] as Utils.NumberHolder).value * this.damageMultiplier); + } +} - return false; +/** + * Reduces the damage dealt to an allied Pokemon. Used by Friend Guard. + * @see {@linkcode applyPreDefend} + */ +export class AlliedFieldDamageReductionAbAttr extends PreDefendAbAttr { + private damageMultiplier: number; + + constructor(damageMultiplier: number) { + super(); + this.damageMultiplier = damageMultiplier; + } + + /** + * Handles the damage reduction + * @param args + * - `[0]` {@linkcode Utils.NumberHolder} - The damage being dealt + */ + override applyPreDefend(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _attacker: Pokemon, _move: Move, _cancelled: Utils.BooleanHolder, args: any[]): void { + const damage = args[0] as Utils.NumberHolder; + damage.value = Utils.toDmgValue(damage.value * this.damageMultiplier); } } export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultiplierAbAttr { - constructor(moveType: Type, damageMultiplier: number) { - super((target, user, move) => user.getMoveType(move) === moveType, damageMultiplier); + constructor(moveType: PokemonType, damageMultiplier: number) { + super((target, user, move) => user.getMoveType(move) === moveType, damageMultiplier, false); } } @@ -343,16 +461,20 @@ export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultip * @see {@linkcode getCondition} */ export class TypeImmunityAbAttr extends PreDefendAbAttr { - private immuneType: Type | null; + private immuneType: PokemonType | null; private condition: AbAttrCondition | null; - constructor(immuneType: Type | null, condition?: AbAttrCondition) { - super(); + constructor(immuneType: PokemonType | null, condition?: AbAttrCondition) { + super(true); this.immuneType = immuneType; this.condition = condition ?? null; } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return ![ MoveTarget.BOTH_SIDES, MoveTarget.ENEMY_SIDE, MoveTarget.USER_SIDE ].includes(move.moveTarget) && attacker !== pokemon && attacker.getMoveType(move) === this.immuneType; + } + /** * Applies immunity if this ability grants immunity to the type of the given move. * @param pokemon {@linkcode Pokemon} The defending Pokemon. @@ -363,19 +485,11 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { * @param args [0] {@linkcode Utils.NumberHolder} gets set to 0 if move is immuned by an ability. * @param args [1] - Whether the move is simulated. */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - // Field moves should ignore immunity - if ([ MoveTarget.BOTH_SIDES, MoveTarget.ENEMY_SIDE, MoveTarget.USER_SIDE ].includes(move.moveTarget)) { - return false; - } - if (attacker !== pokemon && attacker.getMoveType(move) === this.immuneType) { - (args[0] as Utils.NumberHolder).value = 0; - return true; - } - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value = 0; } - getImmuneType(): Type | null { + getImmuneType(): PokemonType | null { return this.immuneType; } @@ -385,43 +499,43 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { } export class AttackTypeImmunityAbAttr extends TypeImmunityAbAttr { - constructor(immuneType: Type, condition?: AbAttrCondition) { + constructor(immuneType: PokemonType, condition?: AbAttrCondition) { super(immuneType, condition); } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return move.category !== MoveCategory.STATUS && !move.hasAttr(NeutralDamageAgainstFlyingTypeMultiplierAttr) + && super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } + /** * Applies immunity if the move used is not a status move. * Type immunity abilities that do not give additional benefits (HP recovery, stat boosts, etc) are not immune to status moves of the type * Example: Levitate */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { // this is a hacky way to fix the Levitate/Thousand Arrows interaction, but it works for now... - if (move.category !== MoveCategory.STATUS && !move.hasAttr(NeutralDamageAgainstFlyingTypeMultiplierAttr)) { - return super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); - } - return false; + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); } } export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { - constructor(immuneType: Type) { + constructor(immuneType: PokemonType) { super(immuneType); } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } - if (ret) { - if (!pokemon.isFullHp() && !simulated) { - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / 4), i18next.t("abilityTriggers:typeImmunityHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); - cancelled.value = true; // Suppresses "No Effect" message - } - return true; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + if (!pokemon.isFullHp() && !simulated) { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / 4), i18next.t("abilityTriggers:typeImmunityHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); + cancelled.value = true; // Suppresses "No Effect" message } - - return false; } } @@ -429,49 +543,47 @@ class TypeImmunityStatStageChangeAbAttr extends TypeImmunityAbAttr { private stat: BattleStat; private stages: number; - constructor(immuneType: Type, stat: BattleStat, stages: number, condition?: AbAttrCondition) { + constructor(immuneType: PokemonType, stat: BattleStat, stages: number, condition?: AbAttrCondition) { super(immuneType, condition); this.stat = stat; this.stages = stages; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } - if (ret) { - cancelled.value = true; // Suppresses "No Effect" message - if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); - } + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + cancelled.value = true; // Suppresses "No Effect" message + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); } - - return ret; } } class TypeImmunityAddBattlerTagAbAttr extends TypeImmunityAbAttr { private tagType: BattlerTagType; - private turnCount: integer; + private turnCount: number; - constructor(immuneType: Type, tagType: BattlerTagType, turnCount: integer, condition?: AbAttrCondition) { + constructor(immuneType: PokemonType, tagType: BattlerTagType, turnCount: number, condition?: AbAttrCondition) { super(immuneType, condition); this.tagType = tagType; this.turnCount = turnCount; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } - if (ret) { - cancelled.value = true; // Suppresses "No Effect" message - if (!simulated) { - pokemon.addTag(this.tagType, this.turnCount, undefined, pokemon.id); - } + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + cancelled.value = true; // Suppresses "No Effect" message + if (!simulated) { + pokemon.addTag(this.tagType, this.turnCount, undefined, pokemon.id); } - - return ret; } } @@ -480,14 +592,16 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr { super(null, condition); } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (move instanceof AttackMove && pokemon.getAttackTypeEffectiveness(attacker.getMoveType(move), attacker) < 2) { - cancelled.value = true; // Suppresses "No Effect" message - (args[0] as Utils.NumberHolder).value = 0; - return true; - } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + const modifierValue = args.length > 0 + ? (args[0] as Utils.NumberHolder).value + : pokemon.getAttackTypeEffectiveness(attacker.getMoveType(move), attacker, undefined, undefined, move); + return move instanceof AttackMove && modifierValue < 2; + } - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; // Suppresses "No Effect" message + (args[0] as Utils.NumberHolder).value = 0; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -504,6 +618,12 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr { * @extends PreDefendAbAttr */ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { + + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + const typeMultiplier = args[0]; + return (typeMultiplier && typeMultiplier instanceof Utils.NumberHolder) && !(move && move.hasAttr(FixedDamageAttr)) && pokemon.isFullHp() && typeMultiplier.value > 0.5; + } + /** * Reduces a type multiplier to 0.5 if the source is at full HP. * @param pokemon {@linkcode Pokemon} the Pokemon with this ability @@ -513,24 +633,18 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { * @param move {@linkcode Move} the move being used on the source * @param cancelled n/a * @param args `[0]` a container for the move's current type effectiveness multiplier - * @returns `true` if the move's effectiveness is reduced; `false` otherwise */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise { + override applyPreDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + args: any[]): void { const typeMultiplier = args[0]; - if (!(typeMultiplier && typeMultiplier instanceof Utils.NumberHolder)) { - return false; - } - - if (move && move.hasAttr(FixedDamageAttr)) { - return false; - } - - if (pokemon.isFullHp() && typeMultiplier.value > 0.5) { - typeMultiplier.value = 0.5; - pokemon.turnData.moveEffectiveness = 0.5; - return true; - } - return false; + typeMultiplier.value = 0.5; + pokemon.turnData.moveEffectiveness = 0.5; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -541,34 +655,58 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr { } export class PostDefendAbAttr extends AbAttr { - applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { - return false; + canApplyPostDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[]): boolean { + return true; } + + applyPostDefend( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[], + ): void {} } export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const attackPriority = new Utils.IntegerHolder(move.priority); - applyMoveAttrs(IncrementMovePriorityAttr, attacker, null, move, attackPriority); - applyAbAttrs(ChangeMovePriorityAbAttr, attacker, null, simulated, move, attackPriority); - if (move.moveTarget === MoveTarget.USER || move.moveTarget === MoveTarget.NEAR_ALLY) { - return false; - } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return !(move.moveTarget === MoveTarget.USER || move.moveTarget === MoveTarget.NEAR_ALLY) && move.getPriority(attacker) > 0 && !move.isMultiTarget(); + } - if (attackPriority.value > 0 && !move.isMultiTarget()) { - cancelled.value = true; - return true; - } - - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } export class PostStatStageChangeAbAttr extends AbAttr { - applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statsChanged: BattleStat[], stagesChanged: integer, selfTarget: boolean, args: any[]): boolean | Promise { - return false; + canApplyPostStatStageChange( + pokemon: Pokemon, + simulated: boolean, + statsChanged: BattleStat[], + stagesChanged: number, + selfTarget: boolean, + args: any[]): boolean { + return true; } + + applyPostStatStageChange( + pokemon: Pokemon, + simulated: boolean, + statsChanged: BattleStat[], + stagesChanged: number, + selfTarget: boolean, + args: any[], + ): void {} } export class MoveImmunityAbAttr extends PreDefendAbAttr { @@ -580,13 +718,12 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr { this.immuneCondition = immuneCondition; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.immuneCondition(pokemon, attacker, move)) { - cancelled.value = true; - return true; - } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return this.immuneCondition(pokemon, attacker, move); + } - return false; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -601,14 +738,19 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr { * @extends PreDefendAbAttr */ export class WonderSkinAbAttr extends PreDefendAbAttr { - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const moveAccuracy = args[0] as Utils.NumberHolder; - if (move.category === MoveCategory.STATUS && moveAccuracy.value >= 50) { - moveAccuracy.value = 50; - return true; - } - return false; + constructor() { + super(false); + } + + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + const moveAccuracy = args[0] as Utils.NumberHolder; + return move.category === MoveCategory.STATUS && moveAccuracy.value >= 50; + } + + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + const moveAccuracy = args[0] as Utils.NumberHolder; + moveAccuracy.value = 50; } } @@ -622,13 +764,13 @@ export class MoveImmunityStatStageChangeAbAttr extends MoveImmunityAbAttr { this.stages = stages; } - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); - if (ret && !simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); - } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return !simulated && super.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + } - return ret; + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { + super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); } } /** @@ -637,6 +779,11 @@ export class MoveImmunityStatStageChangeAbAttr extends MoveImmunityAbAttr { * @see {@linkcode applyPostDefend} */ export class ReverseDrainAbAttr extends PostDefendAbAttr { + + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return move.hasAttr(HitHealAttr) && !move.hitsSubstitute(attacker, pokemon); + } + /** * Determines if a damage and draining move was used to check if this ability should stop the healing. * Examples include: Absorb, Draining Kiss, Bitter Blade, etc. @@ -647,16 +794,11 @@ export class ReverseDrainAbAttr extends PostDefendAbAttr { * @param move {@linkcode PokemonMove} that is being used * @param _hitResult N/A * @param _args N/A - * @returns true if healing should be reversed on a healing move, false otherwise. */ - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.hasAttr(HitHealAttr) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - pokemon.scene.queueMessage(i18next.t("abilityTriggers:reverseDrain", { pokemonNameWithAffix: getPokemonNameWithAffix(attacker) })); - } - return true; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.queueMessage(i18next.t("abilityTriggers:reverseDrain", { pokemonNameWithAffix: getPokemonNameWithAffix(attacker) })); } - return false; } } @@ -667,7 +809,7 @@ export class PostDefendStatStageChangeAbAttr extends PostDefendAbAttr { private selfTarget: boolean; private allOthers: boolean; - constructor(condition: PokemonDefendCondition, stat: BattleStat, stages: number, selfTarget: boolean = true, allOthers: boolean = false) { + constructor(condition: PokemonDefendCondition, stat: BattleStat, stages: number, selfTarget = true, allOthers = false) { super(true); this.condition = condition; @@ -677,24 +819,23 @@ export class PostDefendStatStageChangeAbAttr extends PostDefendAbAttr { this.allOthers = allOthers; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) { - if (simulated) { - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon); + } - if (this.allOthers) { - const otherPokemon = pokemon.getAlly() ? pokemon.getOpponents().concat([ pokemon.getAlly() ]) : pokemon.getOpponents(); - for (const other of otherPokemon) { - other.scene.unshiftPhase(new StatStageChangePhase(other.scene, (other).getBattlerIndex(), false, [ this.stat ], this.stages)); - } - return true; - } - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), this.selfTarget, [ this.stat ], this.stages)); - return true; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (simulated) { + return; } - return false; + if (this.allOthers) { + const otherPokemon = pokemon.getAlly() ? pokemon.getOpponents().concat([ pokemon.getAlly() ]) : pokemon.getOpponents(); + for (const other of otherPokemon) { + globalScene.unshiftPhase(new StatStageChangePhase((other).getBattlerIndex(), false, [ this.stat ], this.stages)); + } + } else { + globalScene.unshiftPhase(new StatStageChangePhase((this.selfTarget ? pokemon : attacker).getBattlerIndex(), this.selfTarget, [ this.stat ], this.stages)); + } } } @@ -705,7 +846,7 @@ export class PostDefendHpGatedStatStageChangeAbAttr extends PostDefendAbAttr { private stages: number; private selfTarget: boolean; - constructor(condition: PokemonDefendCondition, hpGate: number, stats: BattleStat[], stages: number, selfTarget: boolean = true) { + constructor(condition: PokemonDefendCondition, hpGate: number, stats: BattleStat[], stages: number, selfTarget = true) { super(true); this.condition = condition; @@ -715,19 +856,17 @@ export class PostDefendHpGatedStatStageChangeAbAttr extends PostDefendAbAttr { this.selfTarget = selfTarget; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { const hpGateFlat: number = Math.ceil(pokemon.getMaxHp() * this.hpGate); const lastAttackReceived = pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1]; const damageReceived = lastAttackReceived?.damage || 0; + return this.condition(pokemon, attacker, move) && (pokemon.hp <= hpGateFlat && (pokemon.hp + damageReceived) > hpGateFlat) && !move.hitsSubstitute(attacker, pokemon); + } - if (this.condition(pokemon, attacker, move) && (pokemon.hp <= hpGateFlat && (pokemon.hp + damageReceived) > hpGateFlat) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.stages)); - } - return true; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase((this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.stages)); } - - return false; } } @@ -742,17 +881,16 @@ export class PostDefendApplyArenaTrapTagAbAttr extends PostDefendAbAttr { this.tagType = tagType; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) { - const tag = pokemon.scene.arena.getTag(this.tagType) as ArenaTrapTag; - if (!pokemon.scene.arena.getTag(this.tagType) || tag.layers < tag.maxLayers) { - if (!simulated) { - pokemon.scene.arena.addTag(this.tagType, 0, undefined, pokemon.id, pokemon.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); - } - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + const tag = globalScene.arena.getTag(this.tagType) as ArenaTrapTag; + return (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) + && (!globalScene.arena.getTag(this.tagType) || tag.layers < tag.maxLayers); + } + + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.arena.addTag(this.tagType, 0, undefined, pokemon.id, pokemon.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); } - return false; } } @@ -766,40 +904,37 @@ export class PostDefendApplyBattlerTagAbAttr extends PostDefendAbAttr { this.tagType = tagType; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) { - if (!pokemon.getTag(this.tagType) && !simulated) { - pokemon.addTag(this.tagType, undefined, undefined, pokemon.id); - pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name })); - } - return true; + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon); + } + + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!pokemon.getTag(this.tagType) && !simulated) { + pokemon.addTag(this.tagType, undefined, undefined, pokemon.id); + globalScene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name })); } - return false; } } export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): boolean { - if (hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon)) { - if (simulated) { - return true; - } - const type = attacker.getMoveType(move); - const pokemonTypes = pokemon.getTypes(true); - if (pokemonTypes.length !== 1 || pokemonTypes[0] !== type) { - pokemon.summonData.types = [ type ]; - return true; - } - } + private type: PokemonType; - return false; + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + this.type = attacker.getMoveType(move); + const pokemonTypes = pokemon.getTypes(true); + return hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon) && (simulated || pokemonTypes.length !== 1 || pokemonTypes[0] !== this.type); + } + + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): void { + const type = attacker.getMoveType(move); + pokemon.summonData.types = [ type ]; } override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { return i18next.t("abilityTriggers:postDefendTypeChange", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName, - typeName: i18next.t(`pokemonInfo:Type.${Type[pokemon.getTypes(true)[0]]}`) + typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) }); } } @@ -813,42 +948,38 @@ export class PostDefendTerrainChangeAbAttr extends PostDefendAbAttr { this.terrainType = terrainType; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): boolean { - if (hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon)) { - if (simulated) { - return pokemon.scene.arena.terrain?.terrainType !== (this.terrainType || undefined); - } else { - return pokemon.scene.arena.trySetTerrain(this.terrainType, true); - } - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + return hitResult < HitResult.NO_EFFECT && !move.hitsSubstitute(attacker, pokemon) && globalScene.arena.canSetTerrain(this.terrainType); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.arena.trySetTerrain(this.terrainType, true); + } } } export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr { - public chance: integer; + public chance: number; private effects: StatusEffect[]; - constructor(chance: integer, ...effects: StatusEffect[]) { - super(); + constructor(chance: number, ...effects: StatusEffect[]) { + super(true); this.chance = chance; this.effects = effects; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status - && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !move.hitsSubstitute(attacker, pokemon)) { - const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; - if (simulated) { - return attacker.canSetStatus(effect, true, false, pokemon); - } else { - return attacker.trySetStatus(effect, true, pokemon); - } - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; + return move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.status + && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !move.hitsSubstitute(attacker, pokemon) + && attacker.canSetStatus(effect, true, false, pokemon); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; + attacker.trySetStatus(effect, true, pokemon); } } @@ -857,20 +988,22 @@ export class EffectSporeAbAttr extends PostDefendContactApplyStatusEffectAbAttr super(10, StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP); } - applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (attacker.hasAbility(Abilities.OVERCOAT) || attacker.isOfType(Type.GRASS)) { - return false; - } - return super.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args); + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return !(attacker.hasAbility(Abilities.OVERCOAT) || attacker.isOfType(PokemonType.GRASS)) + && super.canApplyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args); + } + + override applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { + super.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args); } } export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { - private chance: integer; + private chance: number; private tagType: BattlerTagType; - private turnCount: integer | undefined; + private turnCount: number | undefined; - constructor(chance: integer, tagType: BattlerTagType, turnCount?: integer) { + constructor(chance: number, tagType: BattlerTagType, turnCount?: number) { super(); this.tagType = tagType; @@ -878,16 +1011,15 @@ export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { this.turnCount = turnCount; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && pokemon.randSeedInt(100) < this.chance && !move.hitsSubstitute(attacker, pokemon)) { - if (simulated) { - return attacker.canAddTag(this.tagType); - } else { - return attacker.addTag(this.tagType, this.turnCount, move.id, attacker.id); - } - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && pokemon.randSeedInt(100) < this.chance + && !move.hitsSubstitute(attacker, pokemon) && attacker.canAddTag(this.tagType); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + attacker.addTag(this.tagType, this.turnCount, move.id, attacker.id); + } } } @@ -902,16 +1034,14 @@ export class PostDefendCritStatStageChangeAbAttr extends PostDefendAbAttr { this.stages = stages; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.hitsSubstitute(attacker, pokemon)) { - return false; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return !move.hitsSubstitute(attacker, pokemon); + } + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ this.stat ], this.stages)); } - - return true; } override getCondition(): AbAttrCondition { @@ -920,23 +1050,22 @@ export class PostDefendCritStatStageChangeAbAttr extends PostDefendAbAttr { } export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { - private damageRatio: integer; + private damageRatio: number; - constructor(damageRatio: integer) { + constructor(damageRatio: number) { super(); this.damageRatio = damageRatio; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (!simulated && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) - && !attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !move.hitsSubstitute(attacker, pokemon)) { - attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); - attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)); - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return !simulated && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) + && !attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !move.hitsSubstitute(attacker, pokemon); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)); } override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { @@ -954,27 +1083,24 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { * @extends {PostDefendAbAttr} */ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr { - private turns: integer; + private turns: number; - constructor(turns: integer) { + constructor(turns: number) { super(); this.turns = turns; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !move.hitsSubstitute(attacker, pokemon)) { - if (pokemon.getTag(BattlerTagType.PERISH_SONG) || attacker.getTag(BattlerTagType.PERISH_SONG)) { - return false; - } else { - if (!simulated) { - attacker.addTag(BattlerTagType.PERISH_SONG, this.turns); - pokemon.addTag(BattlerTagType.PERISH_SONG, this.turns); - } - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !move.hitsSubstitute(attacker, pokemon)) + && !attacker.getTag(BattlerTagType.PERISH_SONG); + } + + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + attacker.addTag(BattlerTagType.PERISH_SONG, this.turns); + pokemon.addTag(BattlerTagType.PERISH_SONG, this.turns); } - return false; } override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { @@ -993,18 +1119,15 @@ export class PostDefendWeatherChangeAbAttr extends PostDefendAbAttr { this.condition = condition; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (this.condition && !this.condition(pokemon, attacker, move) || move.hitsSubstitute(attacker, pokemon)) { - return false; - } - if (!pokemon.scene.arena.weather?.isImmutable()) { - if (simulated) { - return pokemon.scene.arena.weather?.weatherType !== this.weatherType; - } - return pokemon.scene.arena.trySetWeather(this.weatherType, true); - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return (!(this.condition && !this.condition(pokemon, attacker, move) || move.hitsSubstitute(attacker, pokemon)) + && !globalScene.arena.weather?.isImmutable() && globalScene.arena.canSetWeather(this.weatherType)); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + globalScene.arena.trySetWeather(this.weatherType, true); + } } } @@ -1013,18 +1136,17 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr { super(); } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) - && !attacker.getAbility().hasAttr(UnswappableAbilityAbAttr) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - const tempAbilityId = attacker.getAbility().id; - attacker.summonData.ability = pokemon.getAbility().id; - pokemon.summonData.ability = tempAbilityId; - } - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) + && !attacker.getAbility().hasAttr(UnswappableAbilityAbAttr) && !move.hitsSubstitute(attacker, pokemon); + } - return false; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, args: any[]): void { + if (!simulated) { + const tempAbility = attacker.getAbility(); + attacker.setTempAbility(pokemon.getAbility()); + pokemon.setTempAbility(tempAbility); + } } override getTriggerMessage(pokemon: Pokemon, _abilityName: string, ..._args: any[]): string { @@ -1040,17 +1162,15 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { this.ability = ability; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr) - && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - attacker.summonData.ability = this.ability; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr) + && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr) && !move.hitsSubstitute(attacker, pokemon); + } - return true; + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + attacker.setTempAbility(allAbilities[this.ability]); } - - return false; } override getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { @@ -1062,30 +1182,27 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { } export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr { - private chance: integer; + private chance: number; private attacker: Pokemon; private move: Move; - constructor(chance: integer) { + constructor(chance: number) { super(); this.chance = chance; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { - if (attacker.getTag(BattlerTagType.DISABLED) === null && !move.hitsSubstitute(attacker, pokemon)) { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) { - if (simulated) { - return true; - } + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return attacker.getTag(BattlerTagType.DISABLED) === null && !move.hitsSubstitute(attacker, pokemon) + && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance); + } - this.attacker = attacker; - this.move = move; - this.attacker.addTag(BattlerTagType.DISABLED, 4, 0, pokemon.id); - return true; - } + override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): void { + if (!simulated) { + this.attacker = attacker; + this.move = move; + this.attacker.addTag(BattlerTagType.DISABLED, 4, 0, pokemon.id); } - return false; } } @@ -1102,22 +1219,36 @@ export class PostStatStageChangeStatStageChangeAbAttr extends PostStatStageChang this.stages = stages; } - applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statStagesChanged: BattleStat[], stagesChanged: number, selfTarget: boolean, args: any[]): boolean { - if (this.condition(pokemon, statStagesChanged, stagesChanged) && !selfTarget) { - if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, (pokemon).getBattlerIndex(), true, this.statsToChange, this.stages)); - } - return true; - } + override canApplyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statStagesChanged: BattleStat[], stagesChanged: integer, selfTarget: boolean, args: any[]): boolean { + return this.condition(pokemon, statStagesChanged, stagesChanged) && !selfTarget; + } - return false; + override applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statStagesChanged: BattleStat[], stagesChanged: number, selfTarget: boolean, args: any[]): void { + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase((pokemon).getBattlerIndex(), true, this.statsToChange, this.stages)); + } } } export class PreAttackAbAttr extends AbAttr { - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean | Promise { - return false; + canApplyPreAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon | null, + move: Move, + args: any[]): boolean { + return true; } + + applyPreAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon | null, + move: Move, + args: any[], + ): void {} } /** @@ -1129,26 +1260,22 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { private chanceMultiplier: number; constructor(chanceMultiplier: number) { - super(true); + super(false); this.chanceMultiplier = chanceMultiplier; } + + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const exceptMoves = [ Moves.ORDER_UP, Moves.ELECTRO_SHOT ]; + return !((args[0] as Utils.NumberHolder).value <= 0 || exceptMoves.includes((args[1] as Move).id)); + } + /** * @param args [0]: {@linkcode Utils.NumberHolder} Move additional effect chance. Has to be higher than or equal to 0. * [1]: {@linkcode Moves } Move used by the ability user. */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - // Disable showAbility during getTargetBenefitScore - this.showAbility = args[4]; - - const exceptMoves = [ Moves.ORDER_UP, Moves.ELECTRO_SHOT ]; - if ((args[0] as Utils.NumberHolder).value <= 0 || exceptMoves.includes((args[1] as Move).id)) { - return false; - } - + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value *= this.chanceMultiplier; (args[0] as Utils.NumberHolder).value = Math.min((args[0] as Utils.NumberHolder).value, 100); - return true; - } } @@ -1158,32 +1285,34 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { * @see {@linkcode applyPreDefend} */ export class IgnoreMoveEffectsAbAttr extends PreDefendAbAttr { + + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return (args[0] as Utils.NumberHolder).value > 0; + } + /** * @param args [0]: {@linkcode Utils.NumberHolder} Move additional effect chance. */ - applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - - if ((args[0] as Utils.NumberHolder).value <= 0) { - return false; - } - + override applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value = 0; - return true; - } } export class VariableMovePowerAbAttr extends PreAttackAbAttr { - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - //const power = args[0] as Utils.NumberHolder; - return false; + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + return true; } } export class FieldPreventExplosiveMovesAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + override apply( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + cancelled: Utils.BooleanHolder, + args: any[], + ): void { cancelled.value = true; - return true; } } @@ -1199,7 +1328,7 @@ export class FieldMultiplyStatAbAttr extends AbAttr { private multiplier: number; private canStack: boolean; - constructor(stat: Stat, multiplier: number, canStack: boolean = false) { + constructor(stat: Stat, multiplier: number, canStack = false) { super(false); this.stat = stat; @@ -1207,6 +1336,11 @@ export class FieldMultiplyStatAbAttr extends AbAttr { this.canStack = canStack; } + canApplyFieldStat(pokemon: Pokemon, passive: boolean, simulated: boolean, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, args: any[]): boolean { + return this.canStack || !hasApplied.value + && this.stat === stat && checkedPokemon.getAbilityAttrs(FieldMultiplyStatAbAttr).every(attr => (attr as FieldMultiplyStatAbAttr).stat !== stat); + } + /** * applyFieldStat: Tries to multiply a Pokemon's Stat * @param pokemon {@linkcode Pokemon} the Pokemon using this ability @@ -1216,91 +1350,81 @@ export class FieldMultiplyStatAbAttr extends AbAttr { * @param checkedPokemon {@linkcode Pokemon} the Pokemon this ability is targeting * @param hasApplied {@linkcode Utils.BooleanHolder} whether or not another multiplier has been applied to this stat * @param args {any[]} unused - * @returns true if this changed the checked stat, false otherwise. */ - applyFieldStat(pokemon: Pokemon, passive: boolean, simulated: boolean, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, args: any[]): boolean { - if (!this.canStack && hasApplied.value) { - return false; - } - - if (this.stat === stat && checkedPokemon.getAbilityAttrs(FieldMultiplyStatAbAttr).every(attr => (attr as FieldMultiplyStatAbAttr).stat !== stat)) { - statValue.value *= this.multiplier; - hasApplied.value = true; - return true; - } - return false; + applyFieldStat(pokemon: Pokemon, passive: boolean, simulated: boolean, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, args: any[]): void { + statValue.value *= this.multiplier; + hasApplied.value = true; } } export class MoveTypeChangeAbAttr extends PreAttackAbAttr { constructor( - private newType: Type, + private newType: PokemonType, private powerMultiplier: number, private condition?: PokemonAttackCondition ) { - super(true); + super(false); + } + + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return (this.condition && this.condition(pokemon, defender, move)) ?? false; } // TODO: Decouple this into two attributes (type change / power boost) - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - if (this.condition && this.condition(pokemon, defender, move)) { - if (args[0] && args[0] instanceof Utils.NumberHolder) { - args[0].value = this.newType; - } - if (args[1] && args[1] instanceof Utils.NumberHolder) { - args[1].value *= this.powerMultiplier; - } - return true; + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + if (args[0] && args[0] instanceof Utils.NumberHolder) { + args[0].value = this.newType; + } + if (args[1] && args[1] instanceof Utils.NumberHolder) { + args[1].value *= this.powerMultiplier; } - - return false; } } /** Ability attribute for changing a pokemon's type before using a move */ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { - private moveType: Type; + private moveType: PokemonType; constructor() { super(true); } - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - if ( - !pokemon.isTerastallized() && - move.id !== Moves.STRUGGLE && - /** - * Skip moves that call other moves because these moves generate a following move that will trigger this ability attribute - * @see {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_call_other_moves} - */ - !move.findAttr((attr) => - attr instanceof RandomMovesetMoveAttr || - attr instanceof RandomMoveAttr || - attr instanceof NaturePowerAttr || - attr instanceof CopyMoveAttr - ) - ) { + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + if (!pokemon.isTerastallized && + move.id !== Moves.STRUGGLE && + /** + * Skip moves that call other moves because these moves generate a following move that will trigger this ability attribute + * @see {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_call_other_moves} + */ + !move.findAttr((attr) => + attr instanceof RandomMovesetMoveAttr || + attr instanceof RandomMoveAttr || + attr instanceof NaturePowerAttr || + attr instanceof CopyMoveAttr)) { const moveType = pokemon.getMoveType(move); - if (pokemon.getTypes().some((t) => t !== moveType)) { - if (!simulated) { - this.moveType = moveType; - pokemon.summonData.types = [ moveType ]; - pokemon.updateInfo(); - } - + this.moveType = moveType; return true; } } - return false; } + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + const moveType = pokemon.getMoveType(move); + + if (!simulated) { + this.moveType = moveType; + pokemon.summonData.types = [ moveType ]; + pokemon.updateInfo(); + } + } + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveType: i18next.t(`pokemonInfo:Type.${Type[this.moveType]}`), + moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`), }); } } @@ -1318,69 +1442,31 @@ export class AddSecondStrikeAbAttr extends PreAttackAbAttr { this.damageMultiplier = damageMultiplier; } - /** - * Determines whether this attribute can apply to a given move. - * @param {Move} move the move to which this attribute may apply - * @param numTargets the number of {@linkcode Pokemon} targeted by this move - * @returns true if the attribute can apply to the move, false otherwise - */ - canApplyPreAttack(move: Move, numTargets: integer): boolean { - /** - * Parental Bond cannot apply to multi-hit moves, charging moves, or - * moves that cause the user to faint. - */ - const exceptAttrs: Constructor[] = [ - MultiHitAttr, - SacrificialAttr, - SacrificialAttrOnHit - ]; - - /** Parental Bond cannot apply to these specific moves */ - const exceptMoves: Moves[] = [ - Moves.FLING, - Moves.UPROAR, - Moves.ROLLOUT, - Moves.ICE_BALL, - Moves.ENDEAVOR - ]; - - /** Also check if this move is an Attack move and if it's only targeting one Pokemon */ - return numTargets === 1 - && !move.isChargingMove() - && !exceptAttrs.some(attr => move.hasAttr(attr)) - && !exceptMoves.some(id => move.id === id) - && move.category !== MoveCategory.STATUS; + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return move.canBeMultiStrikeEnhanced(pokemon, true); } /** * If conditions are met, this doubles the move's hit count (via args[1]) * or multiplies the damage of secondary strikes (via args[2]) - * @param {Pokemon} pokemon the Pokemon using the move + * @param pokemon the {@linkcode Pokemon} using the move * @param passive n/a * @param defender n/a - * @param {Move} move the move used by the ability source - * @param args\[0\] the number of Pokemon this move is targeting - * @param {Utils.IntegerHolder} args\[1\] the number of strikes with this move - * @param {Utils.NumberHolder} args\[2\] the damage multiplier for the current strike - * @returns + * @param move the {@linkcode Move} used by the ability source + * @param args Additional arguments: + * - `[0]` the number of strikes this move currently has ({@linkcode Utils.NumberHolder}) + * - `[1]` the damage multiplier for the current strike ({@linkcode Utils.NumberHolder}) */ - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - const numTargets = args[0] as integer; - const hitCount = args[1] as Utils.IntegerHolder; - const multiplier = args[2] as Utils.NumberHolder; - - if (this.canApplyPreAttack(move, numTargets)) { - this.showAbility = !!hitCount?.value; - if (!!hitCount?.value) { - hitCount.value *= 2; - } - - if (!!multiplier?.value && pokemon.turnData.hitsLeft % 2 === 1 && pokemon.turnData.hitsLeft !== pokemon.turnData.hitCount) { - multiplier.value *= this.damageMultiplier; - } - return true; + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + const hitCount = args[0] as Utils.NumberHolder; + const multiplier = args[1] as Utils.NumberHolder; + if (hitCount?.value) { + hitCount.value += 1; + } + + if (multiplier?.value && pokemon.turnData.hitsLeft === 1) { + multiplier.value = this.damageMultiplier; } - return false; } } @@ -1395,11 +1481,15 @@ export class DamageBoostAbAttr extends PreAttackAbAttr { private condition: PokemonAttackCondition; constructor(damageMultiplier: number, condition: PokemonAttackCondition) { - super(true); + super(false); this.damageMultiplier = damageMultiplier; this.condition = condition; } + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return this.condition(pokemon, defender, move); + } + /** * * @param pokemon the attacker pokemon @@ -1407,16 +1497,10 @@ export class DamageBoostAbAttr extends PreAttackAbAttr { * @param defender the target pokemon * @param move the move used by the attacker pokemon * @param args Utils.NumberHolder as damage - * @returns true if the function succeeds */ - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - if (this.condition(pokemon, defender, move)) { - const power = args[0] as Utils.NumberHolder; - power.value = Math.floor(power.value * this.damageMultiplier); - return true; - } - - return false; + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + const power = args[0] as Utils.NumberHolder; + power.value = Utils.toDmgValue(power.value * this.damageMultiplier); } } @@ -1424,31 +1508,29 @@ export class MovePowerBoostAbAttr extends VariableMovePowerAbAttr { private condition: PokemonAttackCondition; private powerMultiplier: number; - constructor(condition: PokemonAttackCondition, powerMultiplier: number, showAbility: boolean = true) { + constructor(condition: PokemonAttackCondition, powerMultiplier: number, showAbility: boolean = false) { super(showAbility); this.condition = condition; this.powerMultiplier = powerMultiplier; } - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - if (this.condition(pokemon, defender, move)) { - (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return this.condition(pokemon, defender, move); + } - return true; - } - - return false; + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; } } export class MoveTypePowerBoostAbAttr extends MovePowerBoostAbAttr { - constructor(boostedType: Type, powerMultiplier?: number) { - super((pokemon, defender, move) => pokemon?.getMoveType(move) === boostedType, powerMultiplier || 1.5); + constructor(boostedType: PokemonType, powerMultiplier?: number) { + super((pokemon, defender, move) => pokemon?.getMoveType(move) === boostedType, powerMultiplier || 1.5, false); } } export class LowHpMoveTypePowerBoostAbAttr extends MoveTypePowerBoostAbAttr { - constructor(boostedType: Type) { + constructor(boostedType: PokemonType) { super(boostedType); } @@ -1469,22 +1551,18 @@ export class VariableMovePowerBoostAbAttr extends VariableMovePowerAbAttr { * @param mult A function which takes the user, target, and move, and returns the power multiplier. 1 means no multiplier. * @param {boolean} showAbility Whether to show the ability when it activates. */ - constructor(mult: (user: Pokemon, target: Pokemon, move: Move) => number, showAbility: boolean = true) { + constructor(mult: (user: Pokemon, target: Pokemon, move: Move) => number, showAbility = true) { super(showAbility); this.mult = mult; } - /** - * @override - */ - applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move, args: any[]): boolean { - const multiplier = this.mult(pokemon, defender, move); - if (multiplier !== 1) { - (args[0] as Utils.NumberHolder).value *= multiplier; - return true; - } + override canApplyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + return this.mult(pokemon, defender, move) !== 1; + } - return false; + override applyPreAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, args: any[]): void { + const multiplier = this.mult(pokemon, defender, move); + (args[0] as Utils.NumberHolder).value *= multiplier; } } @@ -1493,6 +1571,7 @@ export class VariableMovePowerBoostAbAttr extends VariableMovePowerAbAttr { * @extends AbAttr */ export class FieldMovePowerBoostAbAttr extends AbAttr { + // TODO: Refactor this class? It extends from base AbAttr but has preAttack methods and gets called directly instead of going through applyAbAttrsInternal private condition: PokemonAttackCondition; private powerMultiplier: number; @@ -1506,14 +1585,14 @@ export class FieldMovePowerBoostAbAttr extends AbAttr { this.powerMultiplier = powerMultiplier; } - applyPreAttack(pokemon: Pokemon | null, passive: boolean | null, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + canApplyPreAttack(pokemon: Pokemon | null, passive: boolean | null, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): boolean { + return true; // logic for this attr is handled in move.ts instead of normally + } + + applyPreAttack(pokemon: Pokemon | null, passive: boolean | null, simulated: boolean, defender: Pokemon | null, move: Move, args: any[]): void { if (this.condition(pokemon, defender, move)) { (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; - - return true; } - - return false; } } @@ -1526,7 +1605,7 @@ export class PreAttackFieldMoveTypePowerBoostAbAttr extends FieldMovePowerBoostA * @param boostedType - The type of move that will receive the power boost. * @param powerMultiplier - The multiplier to apply to the move's power, defaults to 1.5 if not provided. */ - constructor(boostedType: Type, powerMultiplier?: number) { + constructor(boostedType: PokemonType, powerMultiplier?: number) { super((pokemon, defender, move) => pokemon?.getMoveType(move) === boostedType, powerMultiplier || 1.5); } } @@ -1570,14 +1649,25 @@ export class StatMultiplierAbAttr extends AbAttr { this.condition = condition ?? null; } - applyStatStage(pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise { + canApplyStatStage( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + stat: BattleStat, + statValue: Utils.NumberHolder, + args: any[]): boolean { const move = (args[0] as Move); - if (stat === this.stat && (!this.condition || this.condition(pokemon, null, move))) { - statValue.value *= this.multiplier; - return true; - } + return stat === this.stat && (!this.condition || this.condition(pokemon, null, move)); + } - return false; + applyStatStage( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + stat: BattleStat, + statValue: Utils.NumberHolder, + args: any[]): void { + statValue.value *= this.multiplier; } } @@ -1585,33 +1675,38 @@ export class PostAttackAbAttr extends AbAttr { private attackCondition: PokemonAttackCondition; /** The default attackCondition requires that the selected move is a damaging move */ - constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS), showAbility: boolean = true) { + constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS), showAbility = true) { super(showAbility); this.attackCondition = attackCondition; } /** - * Please override {@link applyPostAttackAfterMoveTypeCheck} instead of this method. By default, this method checks that the move used is a damaging attack before + * By default, this method checks that the move used is a damaging attack before * applying the effect of any inherited class. This can be changed by providing a different {@link attackCondition} to the constructor. See {@link ConfusionOnStatusEffectAbAttr} * for an example of an effect that does not require a damaging move. */ - applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + canApplyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[]): boolean { // When attackRequired is true, we require the move to be an attack move and to deal damage before checking secondary requirements. // If attackRequired is false, we always defer to the secondary requirements. - if (this.attackCondition(pokemon, defender, move)) { - return this.applyPostAttackAfterMoveTypeCheck(pokemon, passive, simulated, defender, move, hitResult, args); - } else { - return false; - } + return this.attackCondition(pokemon, defender, move); } - /** - * This method is only called after {@link applyPostAttack} has already been applied. Use this for handling checks specific to the ability in question. - */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { - return false; - } + applyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[]): void {} } /** @@ -1623,6 +1718,18 @@ export class GorillaTacticsAbAttr extends PostAttackAbAttr { super((user, target, move) => true, false); } + override canApplyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[]): boolean { + return super.canApplyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args) + && simulated || !pokemon.getTag(BattlerTagType.GORILLA_TACTICS); + } + /** * * @param {Pokemon} pokemon the {@linkcode Pokemon} with this ability @@ -1632,24 +1739,24 @@ export class GorillaTacticsAbAttr extends PostAttackAbAttr { * @param move n/a * @param hitResult n/a * @param args n/a - * @returns `true` if the ability is applied */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { - if (simulated) { - return simulated; + override applyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + args: any[]): void { + if (!simulated) { + pokemon.addTag(BattlerTagType.GORILLA_TACTICS); } - - if (pokemon.getTag(BattlerTagType.GORILLA_TACTICS)) { - return false; - } - - pokemon.addTag(BattlerTagType.GORILLA_TACTICS); - return true; } } export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { private stealCondition: PokemonAttackCondition | null; + private stolenItem?: PokemonHeldItemModifier; constructor(stealCondition?: PokemonAttackCondition) { super(); @@ -1657,37 +1764,70 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { this.stealCondition = stealCondition ?? null; } - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { - return new Promise(resolve => { - if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.stealCondition || this.stealCondition(pokemon, defender, move))) { - const heldItems = this.getTargetHeldItems(defender).filter(i => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { - if (success) { - pokemon.scene.queueMessage(i18next.t("abilityTriggers:postAttackStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), defenderName: defender.name, stolenItemType: stolenItem.type.name })); - } - resolve(success); - }); - return; + override canApplyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult, + args: any[]): boolean { + if ( + super.canApplyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args) && + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.stealCondition || this.stealCondition(pokemon, defender, move)) + ) { + const heldItems = this.getTargetHeldItems(defender).filter((i) => i.isTransferable); + if (heldItems.length) { + // Ensure that the stolen item in testing is the same as when the effect is applied + this.stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.canTransferHeldItemModifier(this.stolenItem, pokemon)) { + return true; } } - resolve(simulated); - }); + } + this.stolenItem = undefined; + return false; + } + + override applyPostAttack( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + defender: Pokemon, + move: Move, + hitResult: HitResult, + args: any[], + ): void { + const heldItems = this.getTargetHeldItems(defender).filter((i) => i.isTransferable); + if (!this.stolenItem) { + this.stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + } + if (globalScene.tryTransferHeldItemModifier(this.stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postAttackStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + defenderName: defender.name, + stolenItemType: this.stolenItem.type.name, + }), + ); + } + this.stolenItem = undefined; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { - return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + return globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } } export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr { private contactRequired: boolean; - private chance: integer; + private chance: number; private effects: StatusEffect[]; - constructor(contactRequired: boolean, chance: integer, ...effects: StatusEffect[]) { + constructor(contactRequired: boolean, chance: number, ...effects: StatusEffect[]) { super(); this.contactRequired = contactRequired; @@ -1695,54 +1835,65 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr { this.effects = effects; } - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (pokemon !== attacker && move.hitsSubstitute(attacker, pokemon)) { - return false; - } - - /**Status inflicted by abilities post attacking are also considered additional effects.*/ - if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !simulated && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) { + override canApplyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + if ( + super.canApplyPostAttack(pokemon, passive, simulated, attacker, move, hitResult, args) + && !(pokemon !== attacker && move.hitsSubstitute(attacker, pokemon)) + && (simulated || !attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker + && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) + ) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; - return attacker.trySetStatus(effect, true, pokemon); + return simulated || attacker.canSetStatus(effect, true, false, pokemon); } - return simulated; + return false; + } + + applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { + const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; + attacker.trySetStatus(effect, true, pokemon); } } export class PostAttackContactApplyStatusEffectAbAttr extends PostAttackApplyStatusEffectAbAttr { - constructor(chance: integer, ...effects: StatusEffect[]) { + constructor(chance: number, ...effects: StatusEffect[]) { super(true, chance, ...effects); } } export class PostAttackApplyBattlerTagAbAttr extends PostAttackAbAttr { private contactRequired: boolean; - private chance: (user: Pokemon, target: Pokemon, move: Move) => integer; + private chance: (user: Pokemon, target: Pokemon, move: Move) => number; private effects: BattlerTagType[]; - constructor(contactRequired: boolean, chance: (user: Pokemon, target: Pokemon, move: Move) => integer, ...effects: BattlerTagType[]) { - super(); + constructor(contactRequired: boolean, chance: (user: Pokemon, target: Pokemon, move: Move) => number, ...effects: BattlerTagType[]) { + super(undefined, false); this.contactRequired = contactRequired; this.chance = chance; this.effects = effects; } - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + override canApplyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { /**Battler tags inflicted by abilities post attacking are also considered additional effects.*/ - if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance(attacker, pokemon, move) && !pokemon.status) { - const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; - return simulated || attacker.addTag(effect); - } + return super.canApplyPostAttack(pokemon, passive, simulated, attacker, move, hitResult, args) && + !attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker && + (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && + pokemon.randSeedInt(100) < this.chance(attacker, pokemon, move) && !pokemon.status; + } - return false; + override applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { + if (!simulated) { + const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; + attacker.addTag(effect); + } } } export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { private condition?: PokemonDefendCondition; + private stolenItem?: PokemonHeldItemModifier; constructor(condition?: PokemonDefendCondition) { super(); @@ -1750,27 +1901,52 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { this.condition = condition; } - override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, _args: any[]): Promise { - return new Promise(resolve => { - if (!simulated && hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move)) && !move.hitsSubstitute(attacker, pokemon)) { - const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferable); - if (heldItems.length) { - const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; - pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { - if (success) { - pokemon.scene.queueMessage(i18next.t("abilityTriggers:postDefendStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), attackerName: attacker.name, stolenItemType: stolenItem.type.name })); - } - resolve(success); - }); - return; + override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + if ( + !simulated && + hitResult < HitResult.NO_EFFECT && + (!this.condition || this.condition(pokemon, attacker, move)) && + !move.hitsSubstitute(attacker, pokemon) + ) { + const heldItems = this.getTargetHeldItems(attacker).filter((i) => i.isTransferable); + if (heldItems.length) { + this.stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + if (globalScene.canTransferHeldItemModifier(this.stolenItem, pokemon)) { + return true; } } - resolve(simulated); - }); + } + return false; + } + + override applyPostDefend( + pokemon: Pokemon, + _passive: boolean, + simulated: boolean, + attacker: Pokemon, + move: Move, + hitResult: HitResult, + _args: any[], + ): void { + + const heldItems = this.getTargetHeldItems(attacker).filter((i) => i.isTransferable); + if (!this.stolenItem) { + this.stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; + } + if (globalScene.tryTransferHeldItemModifier(this.stolenItem, pokemon, false)) { + globalScene.queueMessage( + i18next.t("abilityTriggers:postDefendStealHeldItem", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + attackerName: attacker.name, + stolenItemType: this.stolenItem.type.name, + }), + ); + } + this.stolenItem = undefined; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { - return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + return globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } } @@ -1780,6 +1956,16 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { * @see {@linkcode applyPostSetStatus()}. */ export class PostSetStatusAbAttr extends AbAttr { + canApplyPostSetStatus( + pokemon: Pokemon, + sourcePokemon: Pokemon | null = null, + passive: boolean, + effect: StatusEffect, + simulated: boolean, + rgs: any[]): boolean { + return true; + } + /** * Does nothing after a status condition is set. * @param pokemon {@linkcode Pokemon} that status condition was set on. @@ -1787,11 +1973,15 @@ export class PostSetStatusAbAttr extends AbAttr { * @param passive Whether this ability is a passive. * @param effect {@linkcode StatusEffect} that was set. * @param args Set of unique arguments needed by this attribute. - * @returns `true` if application of the ability succeeds. */ - applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]) : boolean | Promise { - return false; - } + applyPostSetStatus( + pokemon: Pokemon, + sourcePokemon: Pokemon | null = null, + passive: boolean, + effect: StatusEffect, + simulated: boolean, + args: any[], + ): void {} } /** @@ -1800,17 +1990,7 @@ export class PostSetStatusAbAttr extends AbAttr { * ability attribute. For Synchronize ability. */ export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr { - /** - * If the `StatusEffect` that was set is Burn, Paralysis, Poison, or Toxic, and the status - * was set by a source Pokemon, set the source Pokemon's status to the same `StatusEffect`. - * @param pokemon {@linkcode Pokemon} that status condition was set on. - * @param sourcePokemon {@linkcode Pokemon} that that set the status condition. Is null if status was not set by a Pokemon. - * @param passive Whether this ability is a passive. - * @param effect {@linkcode StatusEffect} that was set. - * @param args Set of unique arguments needed by this attribute. - * @returns `true` if application of the ability succeeds. - */ - override applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]): boolean { + override canApplyPostSetStatus(pokemon: Pokemon, sourcePokemon: (Pokemon | null) | undefined, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]): boolean { /** Synchronizable statuses */ const syncStatuses = new Set([ StatusEffect.BURN, @@ -1819,21 +1999,32 @@ export class SynchronizeStatusAbAttr extends PostSetStatusAbAttr { StatusEffect.TOXIC ]); - if (sourcePokemon && syncStatuses.has(effect)) { - if (!simulated) { - sourcePokemon.trySetStatus(effect, true, pokemon); - } - return true; - } + // synchronize does not need to check canSetStatus because the ability shows even if it fails to set the status + return ((sourcePokemon ?? false) && syncStatuses.has(effect)); + } - return false; + /** + * If the `StatusEffect` that was set is Burn, Paralysis, Poison, or Toxic, and the status + * was set by a source Pokemon, set the source Pokemon's status to the same `StatusEffect`. + * @param pokemon {@linkcode Pokemon} that status condition was set on. + * @param sourcePokemon {@linkcode Pokemon} that that set the status condition. Is null if status was not set by a Pokemon. + * @param passive Whether this ability is a passive. + * @param effect {@linkcode StatusEffect} that was set. + * @param args Set of unique arguments needed by this attribute. + */ + override applyPostSetStatus(pokemon: Pokemon, sourcePokemon: Pokemon | null = null, passive: boolean, effect: StatusEffect, simulated: boolean, args: any[]): void { + if (!simulated && sourcePokemon) { + sourcePokemon.trySetStatus(effect, true, pokemon); + } } } export class PostVictoryAbAttr extends AbAttr { - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - return false; + canApplyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } class PostVictoryStatStageChangeAbAttr extends PostVictoryAbAttr { @@ -1847,43 +2038,41 @@ class PostVictoryStatStageChangeAbAttr extends PostVictoryAbAttr { this.stages = stages; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - const stat = typeof this.stat === "function" - ? this.stat(pokemon) - : this.stat; + override applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.stages)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } - return true; } } export class PostVictoryFormChangeAbAttr extends PostVictoryAbAttr { - private formFunc: (p: Pokemon) => integer; + private formFunc: (p: Pokemon) => number; - constructor(formFunc: ((p: Pokemon) => integer)) { + constructor(formFunc: ((p: Pokemon) => number)) { super(true); this.formFunc = formFunc; } - applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override canApplyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - if (!simulated) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - } - return true; - } + return formIndex !== pokemon.formIndex; + } - return false; + override applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); + } } } export class PostKnockOutAbAttr extends AbAttr { - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { - return false; + canApplyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { + return true; } + + applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): void {} } export class PostKnockOutStatStageChangeAbAttr extends PostKnockOutAbAttr { @@ -1897,14 +2086,11 @@ export class PostKnockOutStatStageChangeAbAttr extends PostKnockOutAbAttr { this.stages = stages; } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { - const stat = typeof this.stat === "function" - ? this.stat(pokemon) - : this.stat; + override applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): void { + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.stages)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ stat ], this.stages)); } - return true; } } @@ -1913,19 +2099,22 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { super(); } - applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { - if (pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr)) { - if (!simulated) { - pokemon.summonData.ability = knockedOut.getAbility().id; - pokemon.scene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); - } - return true; - } + override canApplyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean { + return pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr); + } - return false; + override applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): void { + if (!simulated) { + pokemon.setTempAbility(knockedOut.getAbility()); + globalScene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); + } } } +/** + * Ability attribute for ignoring the opponent's stat changes + * @param stats the stats that should be ignored + */ export class IgnoreOpponentStatStagesAbAttr extends AbAttr { private stats: readonly BattleStat[]; @@ -1935,12 +2124,20 @@ export class IgnoreOpponentStatStagesAbAttr extends AbAttr { this.stats = stats ?? BATTLE_STATS; } - apply(_pokemon: Pokemon, _passive: boolean, simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]) { - if (this.stats.includes(args[0])) { - (args[1] as Utils.BooleanHolder).value = true; - return true; - } - return false; + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.stats.includes(args[0]); + } + + /** + * Modifies a BooleanHolder and returns the result to see if a stat is ignored or not + * @param _pokemon n/a + * @param _passive n/a + * @param simulated n/a + * @param _cancelled n/a + * @param args A BooleanHolder that represents whether or not to ignore a stat's stat changes + */ + override apply(_pokemon: Pokemon, _passive: boolean, simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): void { + (args[1] as Utils.BooleanHolder).value = true; } } @@ -1949,9 +2146,8 @@ export class IntimidateImmunityAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -1974,12 +2170,11 @@ export class PostIntimidateStatStageChangeAbAttr extends AbAttr { this.overwrites = !!overwrites; } - apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { - pokemon.scene.pushPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, this.stages)); + globalScene.pushPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, this.stats, this.stages)); } cancelled.value = this.overwrites; - return true; } } @@ -1988,16 +2183,32 @@ export class PostIntimidateStatStageChangeAbAttr extends AbAttr { * @see {@linkcode applyPostSummon()} */ export class PostSummonAbAttr extends AbAttr { + /** Should the ability activate when gained in battle? This will almost always be true */ + private activateOnGain: boolean; + + constructor(showAbility = true, activateOnGain = true) { + super(showAbility); + this.activateOnGain = activateOnGain; + } + + /** + * @returns Whether the ability should activate when gained in battle + */ + shouldActivateOnGain(): boolean { + return this.activateOnGain; + } + + canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; + } + /** * Applies ability post summon (after switching in) * @param pokemon {@linkcode Pokemon} with this ability * @param passive Whether this ability is a passive * @param args Set of unique arguments needed by this attribute - * @returns true if application of the ability succeeds */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - return false; - } + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } /** @@ -2015,13 +2226,43 @@ export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr { this.arenaTags = arenaTags; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.tags.some(tag => this.arenaTags.includes(tag.tagType)); + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { for (const arenaTag of this.arenaTags) { - pokemon.scene.arena.removeTag(arenaTag); + globalScene.arena.removeTag(arenaTag); } } - return true; + } +} + +/** + * Generic class to add an arena tag upon switching in + */ +export class PostSummonAddArenaTagAbAttr extends PostSummonAbAttr { + private readonly tagType: ArenaTagType; + private readonly turnCount: number; + private readonly side?: ArenaTagSide; + private readonly quiet?: boolean; + private sourceId: number; + + + constructor(showAbility: boolean, tagType: ArenaTagType, turnCount: number, side?: ArenaTagSide, quiet?: boolean) { + super(showAbility); + this.tagType = tagType; + this.turnCount = turnCount; + this.side = side; + this.quiet = quiet; + } + + public override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + this.sourceId = pokemon.id; + if (!simulated) { + globalScene.arena.addTag(this.tagType, this.turnCount, undefined, this.sourceId, this.side, this.quiet); + } } } @@ -2034,12 +2275,10 @@ export class PostSummonMessageAbAttr extends PostSummonAbAttr { this.messageFunc = messageFunc; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { - pokemon.scene.queueMessage(this.messageFunc(pokemon)); + globalScene.queueMessage(this.messageFunc(pokemon)); } - - return true; } } @@ -2053,31 +2292,31 @@ export class PostSummonUnnamedMessageAbAttr extends PostSummonAbAttr { this.message = message; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { - pokemon.scene.queueMessage(this.message); + globalScene.queueMessage(this.message); } - - return true; } } export class PostSummonAddBattlerTagAbAttr extends PostSummonAbAttr { private tagType: BattlerTagType; - private turnCount: integer; + private turnCount: number; - constructor(tagType: BattlerTagType, turnCount: integer, showAbility?: boolean) { + constructor(tagType: BattlerTagType, turnCount: number, showAbility?: boolean) { super(showAbility); this.tagType = tagType; this.turnCount = turnCount; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (simulated) { - return pokemon.canAddTag(this.tagType); - } else { - return pokemon.addTag(this.tagType, this.turnCount); + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return pokemon.canAddTag(this.tagType); + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + pokemon.addTag(this.tagType, this.turnCount); } } } @@ -2089,7 +2328,7 @@ export class PostSummonStatStageChangeAbAttr extends PostSummonAbAttr { private intimidate: boolean; constructor(stats: BattleStat[], stages: number, selfTarget?: boolean, intimidate?: boolean) { - super(false); + super(true); this.stats = stats; this.stages = stages; @@ -2097,33 +2336,31 @@ export class PostSummonStatStageChangeAbAttr extends PostSummonAbAttr { this.intimidate = !!intimidate; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (simulated) { - return true; + return; } - queueShowAbility(pokemon, passive); // TODO: Better solution than manually showing the ability here if (this.selfTarget) { // we unshift the StatStageChangePhase to put it right after the showAbility and not at the end of the // phase list (which could be after CommandPhase for example) - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages)); - return true; - } - for (const opponent of pokemon.getOpponents()) { - const cancelled = new Utils.BooleanHolder(false); - if (this.intimidate) { - applyAbAttrs(IntimidateImmunityAbAttr, opponent, cancelled, simulated); - applyAbAttrs(PostIntimidateStatStageChangeAbAttr, opponent, cancelled, simulated); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, this.stats, this.stages)); + } else { + for (const opponent of pokemon.getOpponents()) { + const cancelled = new Utils.BooleanHolder(false); + if (this.intimidate) { + applyAbAttrs(IntimidateImmunityAbAttr, opponent, cancelled, simulated); + applyAbAttrs(PostIntimidateStatStageChangeAbAttr, opponent, cancelled, simulated); - if (opponent.getTag(BattlerTagType.SUBSTITUTE)) { - cancelled.value = true; + if (opponent.getTag(BattlerTagType.SUBSTITUTE)) { + cancelled.value = true; + } + } + if (!cancelled.value) { + globalScene.unshiftPhase(new StatStageChangePhase(opponent.getBattlerIndex(), false, this.stats, this.stages)); } } - if (!cancelled.value) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.stages)); - } } - return true; } } @@ -2131,25 +2368,23 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr { private healRatio: number; private showAnim: boolean; - constructor(healRatio: number, showAnim: boolean = false) { + constructor(healRatio: number, showAnim = false) { super(); this.healRatio = healRatio || 4; this.showAnim = showAnim; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return pokemon.getAlly()?.isActive(true); + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { const target = pokemon.getAlly(); - if (target?.isActive(true)) { - if (!simulated) { - target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / this.healRatio), i18next.t("abilityTriggers:postSummonAllyHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(target), pokemonName: pokemon.name }), true, !this.showAnim)); - } - - return true; + if (!simulated) { + globalScene.unshiftPhase(new PokemonHealPhase(target.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / this.healRatio), i18next.t("abilityTriggers:postSummonAllyHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(target), pokemonName: pokemon.name }), true, !this.showAnim)); } - - return false; } } @@ -2166,21 +2401,19 @@ export class PostSummonClearAllyStatStagesAbAttr extends PostSummonAbAttr { super(); } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const target = pokemon.getAlly(); - if (target?.isActive(true)) { - if (!simulated) { - for (const s of BATTLE_STATS) { - target.setStatStage(s, 0); - } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return pokemon.getAlly()?.isActive(true); + } - target.scene.queueMessage(i18next.t("abilityTriggers:postSummonClearAllyStats", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const target = pokemon.getAlly(); + if (!simulated) { + for (const s of BATTLE_STATS) { + target.setStatStage(s, 0); } - return true; + globalScene.queueMessage(i18next.t("abilityTriggers:postSummonClearAllyStats", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); } - - return false; } } @@ -2192,20 +2425,12 @@ export class PostSummonClearAllyStatStagesAbAttr extends PostSummonAbAttr { * @see {applyPostSummon} */ export class DownloadAbAttr extends PostSummonAbAttr { - private enemyDef: integer; - private enemySpDef: integer; - private enemyCountTally: integer; + private enemyDef: number; + private enemySpDef: number; + private enemyCountTally: number; private stats: BattleStat[]; - /** - * Checks to see if it is the opening turn (starting a new game), if so, Download won't work. This is because Download takes into account - * vitamins and items, so it needs to use the Stat and the stat alone. - * @param {Pokemon} pokemon Pokemon that is using the move, as well as seeing the opposing pokemon. - * @param {boolean} passive N/A - * @param {any[]} args N/A - * @returns Returns true if ability is used successful, false if not. - */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { this.enemyDef = 0; this.enemySpDef = 0; this.enemyCountTally = 0; @@ -2217,21 +2442,26 @@ export class DownloadAbAttr extends PostSummonAbAttr { } this.enemyDef = Math.round(this.enemyDef / this.enemyCountTally); this.enemySpDef = Math.round(this.enemySpDef / this.enemyCountTally); + return this.enemyDef > 0 && this.enemySpDef > 0; + } + /** + * Checks to see if it is the opening turn (starting a new game), if so, Download won't work. This is because Download takes into account + * vitamins and items, so it needs to use the Stat and the stat alone. + * @param {Pokemon} pokemon Pokemon that is using the move, as well as seeing the opposing pokemon. + * @param {boolean} passive N/A + * @param {any[]} args N/A + */ + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (this.enemyDef < this.enemySpDef) { this.stats = [ Stat.ATK ]; } else { this.stats = [ Stat.SPATK ]; } - if (this.enemyDef > 0 && this.enemySpDef > 0) { // only activate if there's actually an enemy to download from - if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, 1)); - } - return true; + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, this.stats, 1)); } - - return false; } } @@ -2244,18 +2474,17 @@ export class PostSummonWeatherChangeAbAttr extends PostSummonAbAttr { this.weatherType = weatherType; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if ((this.weatherType === WeatherType.HEAVY_RAIN || + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const weatherReplaceable = (this.weatherType === WeatherType.HEAVY_RAIN || this.weatherType === WeatherType.HARSH_SUN || - this.weatherType === WeatherType.STRONG_WINDS) || !pokemon.scene.arena.weather?.isImmutable()) { - if (simulated) { - return pokemon.scene.arena.weather?.weatherType !== this.weatherType; - } else { - return pokemon.scene.arena.trySetWeather(this.weatherType, true); - } - } + this.weatherType === WeatherType.STRONG_WINDS) || !globalScene.arena.weather?.isImmutable(); + return weatherReplaceable && globalScene.arena.canSetWeather(this.weatherType); + } - return false; + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetWeather(this.weatherType, true); + } } } @@ -2268,31 +2497,34 @@ export class PostSummonTerrainChangeAbAttr extends PostSummonAbAttr { this.terrainType = terrainType; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (simulated) { - return pokemon.scene.arena.terrain?.terrainType !== this.terrainType; - } else { - return pokemon.scene.arena.trySetTerrain(this.terrainType, true); + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.canSetTerrain(this.terrainType); + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetTerrain(this.terrainType, true); } } } export class PostSummonFormChangeAbAttr extends PostSummonAbAttr { - private formFunc: (p: Pokemon) => integer; + private formFunc: (p: Pokemon) => number; - constructor(formFunc: ((p: Pokemon) => integer)) { + constructor(formFunc: ((p: Pokemon) => number)) { super(true); this.formFunc = formFunc; } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - return simulated || pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.formFunc(pokemon) !== pokemon.formIndex; + } - return false; + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); + } } } @@ -2301,7 +2533,7 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { private target: Pokemon; private targetAbilityName: string; - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); if (!targets.length) { return false; @@ -2309,7 +2541,7 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { let target: Pokemon; if (targets.length > 1) { - pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); + globalScene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), globalScene.currentBattle.waveIndex); } else { target = targets[0]; } @@ -2322,15 +2554,17 @@ export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { return false; } + this.target = target!; + this.targetAbilityName = allAbilities[target!.getAbility().id].name; + return true; + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { - this.target = target!; - this.targetAbilityName = allAbilities[target!.getAbility().id].name; - pokemon.summonData.ability = target!.getAbility().id; - setAbilityRevealed(target!); + pokemon.setTempAbility(this.target!.getAbility()); + setAbilityRevealed(this.target!); pokemon.updateInfo(); } - - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -2357,40 +2591,39 @@ export class PostSummonUserFieldRemoveStatusEffectAbAttr extends PostSummonAbAtt this.statusEffect = statusEffect; } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const party = pokemon instanceof PlayerPokemon ? globalScene.getPlayerField() : globalScene.getEnemyField(); + return party.filter(p => p.isAllowedInBattle()).length > 0; + } + /** * Removes supplied status effect from the user's field when user of the ability is summoned. * * @param pokemon - The Pokémon that triggered the ability. * @param passive - n/a * @param args - n/a - * @returns A boolean or a promise that resolves to a boolean indicating the result of the ability application. */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - const party = pokemon instanceof PlayerPokemon ? pokemon.scene.getPlayerField() : pokemon.scene.getEnemyField(); + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const party = pokemon instanceof PlayerPokemon ? globalScene.getPlayerField() : globalScene.getEnemyField(); const allowedParty = party.filter(p => p.isAllowedInBattle()); - if (allowedParty.length < 1) { - return false; - } - if (!simulated) { for (const pokemon of allowedParty) { if (pokemon.status && this.statusEffect.includes(pokemon.status.effect)) { - pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + globalScene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); pokemon.resetStatus(false); pokemon.updateInfo(); } } } - return true; } } /** Attempt to copy the stat changes on an ally pokemon */ export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!pokemon.scene.currentBattle.double) { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!globalScene.currentBattle.double) { return false; } @@ -2399,14 +2632,17 @@ export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { return false; } + return true; + } + + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const ally = pokemon.getAlly(); if (!simulated) { for (const s of BATTLE_STATS) { pokemon.setStatStage(s, ally.getStatStage(s)); } pokemon.updateInfo(); } - - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -2417,62 +2653,57 @@ export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { } } +/** + * Used by Imposter + */ export class PostSummonTransformAbAttr extends PostSummonAbAttr { constructor() { - super(true); + super(true, false); } - async applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): Promise { + private getTarget(targets: Pokemon[]): Pokemon { + let target: Pokemon; + if (targets.length > 1) { + globalScene.executeWithSeedOffset(() => { + // in a double battle, if one of the opposing pokemon is fused the other one will be chosen + // if both are fused, then Imposter will fail below + if (targets[0].fusionSpecies) { + target = targets[1]; + return; + } else if (targets[1].fusionSpecies) { + target = targets[0]; + return; + } + target = Utils.randSeedItem(targets); + }, globalScene.currentBattle.waveIndex); + } else { + target = targets[0]; + } + target = target!; + + return target; + } + + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); if (simulated || !targets.length) { return simulated; } - const promises: Promise[] = []; - let target: Pokemon; - if (targets.length > 1) { - pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); - } else { - target = targets[0]; + // transforming from or into fusion pokemon causes various problems (including crashes and save corruption) + if (this.getTarget(targets).fusionSpecies || pokemon.fusionSpecies) { + return false; } - target = target!; - pokemon.summonData.speciesForm = target.getSpeciesForm(); - pokemon.summonData.fusionSpeciesForm = target.getFusionSpeciesForm(); - pokemon.summonData.ability = target.getAbility().id; - pokemon.summonData.gender = target.getGender(); - pokemon.summonData.fusionGender = target.getFusionGender(); - - // Copy all stats (except HP) - for (const s of EFFECTIVE_STATS) { - pokemon.setStat(s, target.getStat(s, false), false); - } - - // Copy all stat stages - for (const s of BATTLE_STATS) { - pokemon.setStatStage(s, target.getStatStage(s)); - } - - pokemon.summonData.moveset = target.getMoveset().map(m => { - const pp = m?.getMove().pp ?? 0; - // if PP value is less than 5, do nothing. If greater, we need to reduce the value to 5 using a negative ppUp value. - const ppUp = pp <= 5 ? 0 : (5 - pp) / Math.max(Math.floor(pp / 5), 1); - return new PokemonMove(m?.moveId ?? Moves.NONE, 0, ppUp); - }); - pokemon.summonData.types = target.getTypes(); - promises.push(pokemon.updateInfo()); - - pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target!.name, })); - pokemon.scene.playSound("battle_anims/PRSFX- Transform"); - promises.push(pokemon.loadAssets(false).then(() => { - pokemon.playAnim(); - pokemon.updateInfo(); - })); - - await Promise.all(promises); - return true; } + + override applyPostSummon(pokemon: Pokemon, _passive: boolean, simulated: boolean, _args: any[]): void { + const target = this.getTarget(pokemon.getOpponents()); + + globalScene.unshiftPhase(new PokemonTransformPhase(pokemon.getBattlerIndex(), target.getBattlerIndex(), true)); + + } } /** @@ -2481,25 +2712,20 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { * @extends PostSummonAbAttr */ export class PostSummonWeatherSuppressedFormChangeAbAttr extends PostSummonAbAttr { + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return getPokemonWithWeatherBasedForms().length > 0; + } + /** * Triggers {@linkcode Arena.triggerWeatherBasedFormChangesToNormal | triggerWeatherBasedFormChangesToNormal} * @param {Pokemon} pokemon the Pokemon with this ability * @param passive n/a * @param args n/a - * @returns whether a Pokemon was reverted to its normal form */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]) { - const pokemonToTransform = getPokemonWithWeatherBasedForms(pokemon.scene); - - if (pokemonToTransform.length < 1) { - return false; - } - + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { - pokemon.scene.arena.triggerWeatherBasedFormChangesToNormal(); + globalScene.arena.triggerWeatherBasedFormChangesToNormal(); } - - return true; } } @@ -2517,6 +2743,12 @@ export class PostSummonFormChangeByWeatherAbAttr extends PostSummonAbAttr { this.ability = ability; } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST); + const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT); + return isCastformWithForecast || isCherrimWithFlowerGift; + } + /** * Calls the {@linkcode BattleScene.triggerPokemonFormChange | triggerPokemonFormChange} for both * {@linkcode SpeciesFormChange.SpeciesFormChangeWeatherTrigger | SpeciesFormChangeWeatherTrigger} and @@ -2525,48 +2757,76 @@ export class PostSummonFormChangeByWeatherAbAttr extends PostSummonAbAttr { * @param {Pokemon} pokemon the Pokemon with this ability * @param passive n/a * @param args n/a - * @returns whether the form change was triggered */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST); - const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT); - - if (isCastformWithForecast || isCherrimWithFlowerGift) { - if (simulated) { - return simulated; - } - - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeWeatherTrigger); - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeRevertWeatherFormTrigger); - queueShowAbility(pokemon, passive); - return true; + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeWeatherTrigger); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeRevertWeatherFormTrigger); + globalScene.queueAbilityDisplay(pokemon, passive, true); } - return false; } } -export class PreSwitchOutAbAttr extends AbAttr { +/** + * Attribute implementing the effects of {@link https://bulbapedia.bulbagarden.net/wiki/Commander_(Ability) | Commander}. + * When the source of an ability with this attribute detects a Dondozo as their active ally, the source "jumps + * into the Dondozo's mouth," sharply boosting the Dondozo's stats, cancelling the source's moves, and + * causing attacks that target the source to always miss. + */ +export class CommanderAbAttr extends AbAttr { constructor() { super(true); } - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - return false; + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + // If the ally Dondozo is fainted or was previously "commanded" by + // another Pokemon, this effect cannot apply. + + // TODO: Should this work with X + Dondozo fusions? + return !(pokemon.getAlly().isFainted() || pokemon.getAlly().getTag(BattlerTagType.COMMANDED)) + && globalScene.currentBattle?.double && pokemon.getAlly()?.species.speciesId === Species.DONDOZO; + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: null, args: any[]): void { + if (!simulated) { + // Lapse the source's semi-invulnerable tags (to avoid visual inconsistencies) + pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); + // Play an animation of the source jumping into the ally Dondozo's mouth + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.COMMANDER_APPLY); + // Apply boosts from this effect to the ally Dondozo + pokemon.getAlly().addTag(BattlerTagType.COMMANDED, 0, Moves.NONE, pokemon.id); + // Cancel the source Pokemon's next move (if a move is queued) + globalScene.tryRemovePhase((phase) => phase instanceof MovePhase && phase.pokemon === pokemon); + } } } +export class PreSwitchOutAbAttr extends AbAttr { + constructor(showAbility: boolean = true) { + super(showAbility); + } + + canApplyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; + } + + applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} +} + export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - if (pokemon.status) { - if (!simulated) { - pokemon.resetStatus(); - pokemon.updateInfo(); - } + constructor() { + super(false); + } - return true; + override canApplyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !Utils.isNullOrUndefined(pokemon.status); + } + + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + pokemon.resetStatus(); + pokemon.updateInfo(); } - - return false; } } @@ -2574,34 +2834,48 @@ export class PreSwitchOutResetStatusAbAttr extends PreSwitchOutAbAttr { * Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon switching out. */ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { - /** * @param pokemon The {@linkcode Pokemon} with the ability * @param passive N/A * @param args N/A * @returns {boolean} Returns true if the weather clears, otherwise false. */ - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - const weatherType = pokemon.scene.arena.weather?.weatherType; + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const weatherType = globalScene.arena.weather?.weatherType; let turnOffWeather = false; // Clear weather only if user's ability matches the weather and no other pokemon has the ability. switch (weatherType) { - case (WeatherType.HARSH_SUN): - if (pokemon.hasAbility(Abilities.DESOLATE_LAND) - && pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) { + case WeatherType.HARSH_SUN: + if ( + pokemon.hasAbility(Abilities.DESOLATE_LAND) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0 + ) { turnOffWeather = true; } break; - case (WeatherType.HEAVY_RAIN): - if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) - && pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) { + case WeatherType.HEAVY_RAIN: + if ( + pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0 + ) { turnOffWeather = true; } break; - case (WeatherType.STRONG_WINDS): - if (pokemon.hasAbility(Abilities.DELTA_STREAM) - && pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) { + case WeatherType.STRONG_WINDS: + if ( + pokemon.hasAbility(Abilities.DELTA_STREAM) && + globalScene + .getField(true) + .filter((p) => p !== pokemon) + .filter((p) => p.hasAbility(Abilities.DELTA_STREAM)).length === 0 + ) { turnOffWeather = true; } break; @@ -2612,7 +2886,7 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { } if (turnOffWeather) { - pokemon.scene.arena.trySetWeather(WeatherType.NONE, false); + globalScene.arena.trySetWeather(WeatherType.NONE, false); return true; } @@ -2621,18 +2895,16 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { } export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - if (!pokemon.isFullHp()) { - if (!simulated) { - const healAmount = Utils.toDmgValue(pokemon.getMaxHp() * 0.33); - pokemon.heal(healAmount); - pokemon.updateInfo(); - } + override canApplyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !pokemon.isFullHp(); + } - return true; + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + const healAmount = Utils.toDmgValue(pokemon.getMaxHp() * 0.33); + pokemon.heal(healAmount); + pokemon.updateInfo(); } - - return false; } } @@ -2642,39 +2914,156 @@ export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { * @see {@linkcode applyPreSwitchOut} */ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr { - private formFunc: (p: Pokemon) => integer; + private formFunc: (p: Pokemon) => number; - constructor(formFunc: ((p: Pokemon) => integer)) { + constructor(formFunc: ((p: Pokemon) => number)) { super(); this.formFunc = formFunc; } + override canApplyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.formFunc(pokemon) !== pokemon.formIndex; + } + /** * On switch out, trigger the form change to the one defined in the ability * @param pokemon The pokemon switching out and changing form {@linkcode Pokemon} * @param passive N/A * @param args N/A - * @returns true if the form change was successful */ - applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - if (!simulated) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - } - return true; + override applyPreSwitchOut(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); } - - return false; } } -export class PreStatStageChangeAbAttr extends AbAttr { - applyPreStatStageChange(pokemon: Pokemon | null, passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { +export class PreLeaveFieldAbAttr extends AbAttr { + canApplyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; + } + + applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} +} + +/** + * Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon switching out. + */ +export class PreLeaveFieldClearWeatherAbAttr extends PreLeaveFieldAbAttr { + + override canApplyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const weatherType = globalScene.arena.weather?.weatherType; + // Clear weather only if user's ability matches the weather and no other pokemon has the ability. + switch (weatherType) { + case (WeatherType.HARSH_SUN): + if (pokemon.hasAbility(Abilities.DESOLATE_LAND) + && globalScene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) { + return true; + } + break; + case (WeatherType.HEAVY_RAIN): + if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) + && globalScene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) { + return true; + } + break; + case (WeatherType.STRONG_WINDS): + if (pokemon.hasAbility(Abilities.DELTA_STREAM) + && globalScene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) { + return true; + } + break; + } return false; } + + /** + * @param pokemon The {@linkcode Pokemon} with the ability + * @param passive N/A + * @param args N/A + */ + override applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetWeather(WeatherType.NONE, false); + } + } +} + +/** + * Updates the active {@linkcode SuppressAbilitiesTag} when a pokemon with {@linkcode Abilities.NEUTRALIZING_GAS} leaves the field + */ +export class PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr extends PreLeaveFieldAbAttr { + constructor() { + super(false); + } + + public override canApplyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !!globalScene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS); + } + + public override applyPreLeaveField(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const suppressTag = globalScene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS) as SuppressAbilitiesTag; + suppressTag.onSourceLeave(globalScene.arena); + } +} + +export class PreStatStageChangeAbAttr extends AbAttr { + canApplyPreStatStageChange( + pokemon: Pokemon | null, + passive: boolean, + simulated: boolean, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + args: any[]): boolean { + return true; + } + + applyPreStatStageChange( + pokemon: Pokemon | null, + passive: boolean, + simulated: boolean, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + args: any[], + ): void {} +} + +/** + * Reflect all {@linkcode BattleStat} reductions caused by other Pokémon's moves and Abilities. + * Currently only applies to Mirror Armor. + */ +export class ReflectStatStageChangeAbAttr extends PreStatStageChangeAbAttr { + /** {@linkcode BattleStat} to reflect */ + private reflectedStat? : BattleStat; + + /** + * Apply the {@linkcode ReflectStatStageChangeAbAttr} to an interaction + * @param _pokemon The user pokemon + * @param _passive N/A + * @param simulated `true` if the ability is being simulated by the AI + * @param stat the {@linkcode BattleStat} being affected + * @param cancelled The {@linkcode Utils.BooleanHolder} that will be set to true due to reflection + * @param args + */ + override applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): void { + const attacker: Pokemon = args[0]; + const stages = args[1]; + this.reflectedStat = stat; + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase(attacker.getBattlerIndex(), false, [ stat ], stages, true, false, true, null, true)); + } + cancelled.value = true; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { + return i18next.t("abilityTriggers:protectStat", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName, + statName: this.reflectedStat ? i18next.t(getStatKey(this.reflectedStat)) : i18next.t("battle:stats") + }); + } } /** @@ -2690,6 +3079,10 @@ export class ProtectStatAbAttr extends PreStatStageChangeAbAttr { this.protectedStat = protectedStat; } + override canApplyPreStatStageChange(pokemon: Pokemon | null, passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean { + return Utils.isNullOrUndefined(this.protectedStat) || stat === this.protectedStat; + } + /** * Apply the {@linkcode ProtectedStatAbAttr} to an interaction * @param _pokemon @@ -2698,15 +3091,9 @@ export class ProtectStatAbAttr extends PreStatStageChangeAbAttr { * @param stat the {@linkcode BattleStat} being affected * @param cancelled The {@linkcode Utils.BooleanHolder} that will be set to true if the stat is protected * @param _args - * @returns true if the stat is protected, false otherwise */ - applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, _args: any[]): boolean { - if (Utils.isNullOrUndefined(this.protectedStat) || stat === this.protectedStat) { - cancelled.value = true; - return true; - } - - return false; + override applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, _args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { @@ -2734,6 +3121,13 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { super((user, target, move) => true); this.effects = effects; } + + override canApplyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { + return super.canApplyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args) + && this.effects.indexOf(args[0]) > -1 && !defender.isFainted() && defender.canAddTag(BattlerTagType.CONFUSED); + } + + /** * Applies confusion to the target pokemon. * @param pokemon {@link Pokemon} attacking @@ -2742,24 +3136,33 @@ export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { * @param move {@link Move} used to apply status effect and confusion * @param hitResult N/A * @param args [0] {@linkcode StatusEffect} applied by move - * @returns true if defender is confused */ - applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (this.effects.indexOf(args[0]) > -1 && !defender.isFainted()) { - if (simulated) { - return defender.canAddTag(BattlerTagType.CONFUSED); - } else { - return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 5), move.id, defender.id); - } + override applyPostAttack(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { + if (!simulated) { + defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 5), move.id, defender.id); } - return false; } } export class PreSetStatusAbAttr extends AbAttr { - applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { - return false; + canApplyPreSetStatus( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + args: any[]): boolean { + return true; } + + applyPreSetStatus( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + args: any[], + ): void {} } /** @@ -2777,6 +3180,10 @@ export class PreSetStatusEffectImmunityAbAttr extends PreSetStatusAbAttr { this.immuneEffects = immuneEffects; } + override canApplyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean { + return effect !== StatusEffect.FAINT && this.immuneEffects.length < 1 || this.immuneEffects.includes(effect); + } + /** * Applies immunity to supplied status effects. * @@ -2785,15 +3192,9 @@ export class PreSetStatusEffectImmunityAbAttr extends PreSetStatusAbAttr { * @param effect - The status effect being applied. * @param cancelled - A holder for a boolean value indicating if the status application was cancelled. * @param args - n/a - * @returns A boolean indicating the result of the status application. */ - applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.immuneEffects.length < 1 || this.immuneEffects.includes(effect)) { - cancelled.value = true; - return true; - } - - return false; + override applyPreSetStatus(pokemon: Pokemon, passive: boolean, simulated: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -2823,9 +3224,25 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr export class UserFieldStatusEffectImmunityAbAttr extends PreSetStatusEffectImmunityAbAttr { } export class PreApplyBattlerTagAbAttr extends AbAttr { - applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { - return false; + canApplyPreApplyBattlerTag( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + args: any[], + ): boolean { + return true; } + + applyPreApplyBattlerTag( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + args: any[], + ): void {} } /** @@ -2836,21 +3253,19 @@ export class PreApplyBattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { private battlerTag: BattlerTag; constructor(immuneTagTypes: BattlerTagType | BattlerTagType[]) { - super(); + super(true); this.immuneTagTypes = Array.isArray(immuneTagTypes) ? immuneTagTypes : [ immuneTagTypes ]; } - applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.immuneTagTypes.includes(tag.tagType)) { - cancelled.value = true; - if (!simulated) { - this.battlerTag = tag; - } - return true; - } + override canApplyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): boolean { + this.battlerTag = tag; - return false; + return this.immuneTagTypes.includes(tag.tagType); + } + + override applyPreApplyBattlerTag(pokemon: Pokemon, passive: boolean, simulated: boolean, tag: BattlerTag, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -2875,16 +3290,21 @@ export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagImmunityAbAttr { export class UserFieldBattlerTagImmunityAbAttr extends PreApplyBattlerTagImmunityAbAttr { } export class BlockCritAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + constructor() { + super(false); + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.BooleanHolder).value = true; - return true; } } export class BonusCritAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + constructor() { + super(false); + } + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.BooleanHolder).value = true; - return true; } } @@ -2892,19 +3312,19 @@ export class MultCritAbAttr extends AbAttr { public multAmount: number; constructor(multAmount: number) { - super(true); + super(false); this.multAmount = multAmount; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const critMult = args[0] as Utils.NumberHolder; - if (critMult.value > 1) { - critMult.value *= this.multAmount; - return true; - } + return critMult.value > 1; + } - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + const critMult = args[0] as Utils.NumberHolder; + critMult.value *= this.multAmount; } } @@ -2916,34 +3336,36 @@ export class MultCritAbAttr extends AbAttr { export class ConditionalCritAbAttr extends AbAttr { private condition: PokemonAttackCondition; - constructor(condition: PokemonAttackCondition, checkUser?: Boolean) { - super(); + constructor(condition: PokemonAttackCondition, checkUser?: boolean) { + super(false); this.condition = condition; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const target = (args[1] as Pokemon); + const move = (args[2] as Move); + return this.condition(pokemon, target, move); + } + /** * @param pokemon {@linkcode Pokemon} user. * @param args [0] {@linkcode Utils.BooleanHolder} If true critical hit is guaranteed. * [1] {@linkcode Pokemon} Target. * [2] {@linkcode Move} used by ability user. */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const target = (args[1] as Pokemon); - const move = (args[2] as Move); - if (!this.condition(pokemon, target, move)) { - return false; - } - + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.BooleanHolder).value = true; - return true; } } export class BlockNonDirectDamageAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + constructor() { + super(false); + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - return true; } } @@ -2962,26 +3384,27 @@ export class BlockStatusDamageAbAttr extends AbAttr { this.effects = effects; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (pokemon.status && this.effects.includes(pokemon.status.effect)) { + return true; + } + return false; + } + /** * @param {Pokemon} pokemon The pokemon with the ability * @param {boolean} passive N/A * @param {Utils.BooleanHolder} cancelled Whether to cancel the status damage * @param {any[]} args N/A - * @returns Returns true if status damage is blocked */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (pokemon.status && this.effects.includes(pokemon.status.effect)) { - cancelled.value = true; - return true; - } - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } export class BlockOneHitKOAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - return true; } } @@ -2999,28 +3422,42 @@ export class ChangeMovePriorityAbAttr extends AbAttr { * @param {number} changeAmount the amount of priority added or subtracted */ constructor(moveFunc: (pokemon: Pokemon, move: Move) => boolean, changeAmount: number) { - super(true); + super(false); this.moveFunc = moveFunc; this.changeAmount = changeAmount; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.moveFunc(pokemon, args[0] as Move)) { - return false; - } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.moveFunc(pokemon, args[0] as Move); + } - (args[1] as Utils.IntegerHolder).value += this.changeAmount; - return true; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[1] as Utils.NumberHolder).value += this.changeAmount; } } export class IgnoreContactAbAttr extends AbAttr { } export class PreWeatherEffectAbAttr extends AbAttr { - applyPreWeatherEffect(pokemon: Pokemon, passive: Boolean, simulated: boolean, weather: Weather | null, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { - return false; + canApplyPreWeatherEffect( + pokemon: Pokemon, + passive: Boolean, + simulated: boolean, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + args: any[]): boolean { + return true; } + + applyPreWeatherEffect( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + args: any[], + ): void {} } export class PreWeatherDamageAbAttr extends PreWeatherEffectAbAttr { } @@ -3029,17 +3466,17 @@ export class BlockWeatherDamageAttr extends PreWeatherDamageAbAttr { private weatherTypes: WeatherType[]; constructor(...weatherTypes: WeatherType[]) { - super(); + super(false); this.weatherTypes = weatherTypes; } - applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.weatherTypes.length || this.weatherTypes.indexOf(weather?.weatherType) > -1) { - cancelled.value = true; - } + override canApplyPreWeatherEffect(pokemon: Pokemon, passive: Boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { + return !this.weatherTypes.length || this.weatherTypes.indexOf(weather?.weatherType) > -1; + } - return true; + override applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } @@ -3047,25 +3484,24 @@ export class SuppressWeatherEffectAbAttr extends PreWeatherEffectAbAttr { public affectsImmutable: boolean; constructor(affectsImmutable?: boolean) { - super(); + super(true); this.affectsImmutable = !!affectsImmutable; } - applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.affectsImmutable || weather.isImmutable()) { - cancelled.value = true; - return true; - } + override canApplyPreWeatherEffect(pokemon: Pokemon, passive: Boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { + return this.affectsImmutable || weather.isImmutable(); + } - return false; + override applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } /** * Condition function to applied to abilities related to Sheer Force. * Checks if last move used against target was affected by a Sheer Force user and: - * Disables: Color Change, Pickpocket, Wimp Out, Emergency Exit, Berserk, Anger Shell + * Disables: Color Change, Pickpocket, Berserk, Anger Shell * @returns {AbAttrCondition} If false disables the ability which the condition is applied to. */ function getSheerForceHitDisableAbCondition(): AbAttrCondition { @@ -3092,14 +3528,14 @@ function getSheerForceHitDisableAbCondition(): AbAttrCondition { } function getWeatherCondition(...weatherTypes: WeatherType[]): AbAttrCondition { - return (pokemon: Pokemon) => { - if (!pokemon.scene?.arena) { + return () => { + if (!globalScene?.arena) { return false; } - if (pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene)) { + if (globalScene.arena.weather?.isEffectSuppressed()) { return false; } - const weatherType = pokemon.scene.arena.weather?.weatherType; + const weatherType = globalScene.arena.weather?.weatherType; return !!weatherType && weatherTypes.indexOf(weatherType) > -1; }; } @@ -3113,7 +3549,7 @@ function getAnticipationCondition(): AbAttrCondition { continue; } // the move's base type (not accounting for variable type changes) is super effective - if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, opponent, true) >= 2) { + if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, opponent, true, undefined, move.getMove()) >= 2) { return true; } // move is a OHKO @@ -3130,10 +3566,10 @@ function getAnticipationCondition(): AbAttrCondition { + (opponent.ivs[Stat.SPDEF] & 1) * 32) * 15 / 63); const type = [ - Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, - Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, - Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC, - Type.PSYCHIC, Type.ICE, Type.DRAGON, Type.DARK ][iv_val]; + PokemonType.FIGHTING, PokemonType.FLYING, PokemonType.POISON, PokemonType.GROUND, + PokemonType.ROCK, PokemonType.BUG, PokemonType.GHOST, PokemonType.STEEL, + PokemonType.FIRE, PokemonType.WATER, PokemonType.GRASS, PokemonType.ELECTRIC, + PokemonType.PSYCHIC, PokemonType.ICE, PokemonType.DRAGON, PokemonType.DARK ][iv_val]; if (pokemon.getAttackTypeEffectiveness(type, opponent) >= 2) { return true; @@ -3163,7 +3599,7 @@ export class ForewarnAbAttr extends PostSummonAbAttr { super(true); } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { let maxPowerSeen = 0; let maxMove = ""; let movePower = 0; @@ -3188,9 +3624,8 @@ export class ForewarnAbAttr extends PostSummonAbAttr { } } if (!simulated) { - pokemon.scene.queueMessage(i18next.t("abilityTriggers:forewarn", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: maxMove })); + globalScene.queueMessage(i18next.t("abilityTriggers:forewarn", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: maxMove })); } - return true; } } @@ -3199,21 +3634,22 @@ export class FriskAbAttr extends PostSummonAbAttr { super(true); } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { if (!simulated) { for (const opponent of pokemon.getOpponents()) { - pokemon.scene.queueMessage(i18next.t("abilityTriggers:frisk", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), opponentName: opponent.name, opponentAbilityName: opponent.getAbility().name })); + globalScene.queueMessage(i18next.t("abilityTriggers:frisk", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), opponentName: opponent.name, opponentAbilityName: opponent.getAbility().name })); setAbilityRevealed(opponent); } } - return true; } } export class PostWeatherChangeAbAttr extends AbAttr { - applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { - return false; + canApplyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { + return true; } + + applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): void {} } /** @@ -3232,6 +3668,13 @@ export class PostWeatherChangeFormChangeAbAttr extends PostWeatherChangeAbAttr { this.formRevertingWeathers = formRevertingWeathers; } + override canApplyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { + const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST); + const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT); + + return isCastformWithForecast || isCherrimWithFlowerGift; + } + /** * Calls {@linkcode Arena.triggerWeatherBasedFormChangesToNormal | triggerWeatherBasedFormChangesToNormal} when the * weather changed to form-reverting weather, otherwise calls {@linkcode Arena.triggerWeatherBasedFormChanges | triggerWeatherBasedFormChanges} @@ -3239,36 +3682,28 @@ export class PostWeatherChangeFormChangeAbAttr extends PostWeatherChangeAbAttr { * @param passive n/a * @param weather n/a * @param args n/a - * @returns whether the form change was triggered */ - applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { - const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST); - const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT); - - if (isCastformWithForecast || isCherrimWithFlowerGift) { - if (simulated) { - return simulated; - } - - const weatherType = pokemon.scene.arena.weather?.weatherType; - - if (weatherType && this.formRevertingWeathers.includes(weatherType)) { - pokemon.scene.arena.triggerWeatherBasedFormChangesToNormal(); - } else { - pokemon.scene.arena.triggerWeatherBasedFormChanges(); - } - return true; + override applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): void { + if (simulated) { + return; + } + + const weatherType = globalScene.arena.weather?.weatherType; + + if (weatherType && this.formRevertingWeathers.includes(weatherType)) { + globalScene.arena.triggerWeatherBasedFormChangesToNormal(); + } else { + globalScene.arena.triggerWeatherBasedFormChanges(); } - return false; } } export class PostWeatherChangeAddBattlerTagAttr extends PostWeatherChangeAbAttr { private tagType: BattlerTagType; - private turnCount: integer; + private turnCount: number; private weatherTypes: WeatherType[]; - constructor(tagType: BattlerTagType, turnCount: integer, ...weatherTypes: WeatherType[]) { + constructor(tagType: BattlerTagType, turnCount: number, ...weatherTypes: WeatherType[]) { super(); this.tagType = tagType; @@ -3276,16 +3711,13 @@ export class PostWeatherChangeAddBattlerTagAttr extends PostWeatherChangeAbAttr this.weatherTypes = weatherTypes; } - applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { - console.log(this.weatherTypes.find(w => weather === w), WeatherType[weather]); - if (!this.weatherTypes.find(w => weather === w)) { - return false; - } + override canApplyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean { + return !!this.weatherTypes.find(w => weather === w) && pokemon.canAddTag(this.tagType); + } - if (simulated) { - return pokemon.canAddTag(this.tagType); - } else { - return pokemon.addTag(this.tagType, this.turnCount); + override applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): void { + if (!simulated) { + pokemon.addTag(this.tagType, this.turnCount); } } } @@ -3299,76 +3731,86 @@ export class PostWeatherLapseAbAttr extends AbAttr { this.weatherTypes = weatherTypes; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[]): boolean | Promise { - return false; + canApplyPostWeatherLapse( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + weather: Weather | null, + args: any[]): boolean { + return true; } + applyPostWeatherLapse( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + weather: Weather | null, + args: any[], + ): void {} + getCondition(): AbAttrCondition { return getWeatherCondition(...this.weatherTypes); } } export class PostWeatherLapseHealAbAttr extends PostWeatherLapseAbAttr { - private healFactor: integer; + private healFactor: number; - constructor(healFactor: integer, ...weatherTypes: WeatherType[]) { + constructor(healFactor: number, ...weatherTypes: WeatherType[]) { super(...weatherTypes); this.healFactor = healFactor; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): boolean { - if (!pokemon.isFullHp()) { - const scene = pokemon.scene; - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - if (!simulated) { - scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.healFactor)), i18next.t("abilityTriggers:postWeatherLapseHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); - } - return true; - } + override canApplyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[]): boolean { + return !pokemon.isFullHp(); + } - return false; + override applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): void { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + if (!simulated) { + globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.healFactor)), i18next.t("abilityTriggers:postWeatherLapseHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); + } } } export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { - private damageFactor: integer; + private damageFactor: number; - constructor(damageFactor: integer, ...weatherTypes: WeatherType[]) { + constructor(damageFactor: number, ...weatherTypes: WeatherType[]) { super(...weatherTypes); this.damageFactor = damageFactor; } - applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): boolean { - const scene = pokemon.scene; - if (pokemon.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { - return false; - } + override canApplyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather | null, args: any[]): boolean { + return !pokemon.hasAbilityWithAttr(BlockNonDirectDamageAbAttr); + } + override applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: Weather, args: any[]): void { if (!simulated) { const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName })); + globalScene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName })); pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); } - - return true; } } export class PostTerrainChangeAbAttr extends AbAttr { - applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { - return false; + canApplyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { + return true; } + + applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): void {} } export class PostTerrainChangeAddBattlerTagAttr extends PostTerrainChangeAbAttr { private tagType: BattlerTagType; - private turnCount: integer; + private turnCount: number; private terrainTypes: TerrainType[]; - constructor(tagType: BattlerTagType, turnCount: integer, ...terrainTypes: TerrainType[]) { + constructor(tagType: BattlerTagType, turnCount: number, ...terrainTypes: TerrainType[]) { super(); this.tagType = tagType; @@ -3376,30 +3818,30 @@ export class PostTerrainChangeAddBattlerTagAttr extends PostTerrainChangeAbAttr this.terrainTypes = terrainTypes; } - applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { - if (!this.terrainTypes.find(t => t === terrain)) { - return false; - } + override canApplyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): boolean { + return !!this.terrainTypes.find(t => t === terrain) && pokemon.canAddTag(this.tagType); + } - if (simulated) { - return pokemon.canAddTag(this.tagType); - } else { - return pokemon.addTag(this.tagType, this.turnCount); + override applyPostTerrainChange(pokemon: Pokemon, passive: boolean, simulated: boolean, terrain: TerrainType, args: any[]): void { + if (!simulated) { + pokemon.addTag(this.tagType, this.turnCount); } } } function getTerrainCondition(...terrainTypes: TerrainType[]): AbAttrCondition { return (pokemon: Pokemon) => { - const terrainType = pokemon.scene.arena.terrain?.terrainType; + const terrainType = globalScene.arena.terrain?.terrainType; return !!terrainType && terrainTypes.indexOf(terrainType) > -1; }; } export class PostTurnAbAttr extends AbAttr { - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - return false; + canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } /** @@ -3417,25 +3859,21 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { this.effects = effects; } + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return (pokemon.status !== null) && this.effects.includes(pokemon.status.effect) && !pokemon.isFullHp(); + } + /** * @param {Pokemon} pokemon The pokemon with the ability that will receive the healing * @param {Boolean} passive N/A * @param {any[]} args N/A - * @returns Returns true if healed from status, false if not */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - if (pokemon.status && this.effects.includes(pokemon.status.effect)) { - if (!pokemon.isFullHp()) { - if (!simulated) { - const scene = pokemon.scene; - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / 8), i18next.t("abilityTriggers:poisonHeal", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }), true)); - } - return true; - } + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / 8), i18next.t("abilityTriggers:poisonHeal", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName }), true)); } - return false; } } @@ -3447,28 +3885,26 @@ export class PostTurnResetStatusAbAttr extends PostTurnAbAttr { private allyTarget: boolean; private target: Pokemon; - constructor(allyTarget: boolean = false) { + constructor(allyTarget = false) { super(true); this.allyTarget = allyTarget; } - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (this.allyTarget) { this.target = pokemon.getAlly(); } else { this.target = pokemon; } - if (this.target?.status) { - if (!simulated) { - this.target.scene.queueMessage(getStatusEffectHealText(this.target.status?.effect, getPokemonNameWithAffix(this.target))); - this.target.resetStatus(false); - this.target.updateInfo(); - } + return !Utils.isNullOrUndefined(this.target.status); + } - return true; + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated && this.target.status) { + globalScene.queueMessage(getStatusEffectHealText(this.target.status?.effect, getPokemonNameWithAffix(this.target))); + this.target.resetStatus(false); + this.target.updateInfo(); } - - return false; } } @@ -3489,18 +3925,14 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { super(); } - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const pass = Phaser.Math.RND.realInRange(0, 1); + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { // Clamp procChance to [0, 1]. Skip if didn't proc (less than pass) - if (Math.max(Math.min(this.procChance(pokemon), 1), 0) < pass) { - return false; - } + const pass = Phaser.Math.RND.realInRange(0, 1); + return !(Math.max(Math.min(this.procChance(pokemon), 1), 0) < pass) && this.itemType === "EATEN_BERRIES" && !!pokemon.battleData.berriesEaten; + } - if (this.itemType === "EATEN_BERRIES") { - return this.createEatenBerry(pokemon, simulated); - } else { - return false; - } + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + this.createEatenBerry(pokemon, simulated); } /** @@ -3525,7 +3957,7 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { const chosenBerry = new BerryModifierType(chosenBerryType); berriesEaten.splice(randomIdx); // Remove berry from memory - const berryModifier = pokemon.scene.findModifier( + const berryModifier = globalScene.findModifier( (m) => m instanceof BerryModifier && m.berryType === chosenBerryType, pokemon.isPlayer() ) as BerryModifier | undefined; @@ -3533,16 +3965,16 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { if (!berryModifier) { const newBerry = new BerryModifier(chosenBerry, pokemon.id, chosenBerryType, 1); if (pokemon.isPlayer()) { - pokemon.scene.addModifier(newBerry); + globalScene.addModifier(newBerry); } else { - pokemon.scene.addEnemyModifier(newBerry); + globalScene.addEnemyModifier(newBerry); } } else if (berryModifier.stackCount < berryModifier.getMaxHeldItemCount(pokemon)) { berryModifier.stackCount++; } - pokemon.scene.queueMessage(i18next.t("abilityTriggers:postTurnLootCreateEatenBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: chosenBerry.name })); - pokemon.scene.updateModifiers(pokemon.isPlayer()); + globalScene.queueMessage(i18next.t("abilityTriggers:postTurnLootCreateEatenBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: chosenBerry.name })); + globalScene.updateModifiers(pokemon.isPlayer()); return true; } @@ -3561,13 +3993,12 @@ export class MoodyAbAttr extends PostTurnAbAttr { * @param passive N/A * @param simulated true if applying in a simulated call. * @param args N/A - * @returns true * * Any stat stages at +6 or -6 are excluded from being increased or decreased, respectively * If the pokemon already has all stat stages raised to 6, it will only decrease one stat stage by 1 * If the pokemon already has all stat stages lowered to -6, it will only increase one stat stage by 2 */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { const canRaise = EFFECTIVE_STATS.filter(s => pokemon.getStatStage(s) < 6); let canLower = EFFECTIVE_STATS.filter(s => pokemon.getStatStage(s) > -6); @@ -3575,76 +4006,62 @@ export class MoodyAbAttr extends PostTurnAbAttr { if (canRaise.length > 0) { const raisedStat = canRaise[pokemon.randSeedInt(canRaise.length)]; canLower = canRaise.filter(s => s !== raisedStat); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ raisedStat ], 2)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ raisedStat ], 2)); } if (canLower.length > 0) { const loweredStat = canLower[pokemon.randSeedInt(canLower.length)]; - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ loweredStat ], -1)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ loweredStat ], -1)); } } - - return true; } } -export class PostTurnStatStageChangeAbAttr extends PostTurnAbAttr { - private stats: BattleStat[]; - private stages: number; +export class SpeedBoostAbAttr extends PostTurnAbAttr { - constructor(stats: BattleStat[], stages: number) { + constructor() { super(true); - - this.stats = Array.isArray(stats) - ? stats - : [ stats ]; - this.stages = stages; } - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages)); - } - return true; + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return simulated || (!pokemon.turnData.switchedInThisTurn && !pokemon.turnData.failedRunAway); + } + + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [ Stat.SPD ], 1)); } } export class PostTurnHealAbAttr extends PostTurnAbAttr { - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!pokemon.isFullHp()) { - if (!simulated) { - const scene = pokemon.scene; - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / 16), i18next.t("abilityTriggers:postTurnHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); - } + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !pokemon.isFullHp(); + } - return true; + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + globalScene.unshiftPhase(new PokemonHealPhase(pokemon.getBattlerIndex(), + Utils.toDmgValue(pokemon.getMaxHp() / 16), i18next.t("abilityTriggers:postTurnHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), true)); } - - return false; } } export class PostTurnFormChangeAbAttr extends PostTurnAbAttr { - private formFunc: (p: Pokemon) => integer; + private formFunc: (p: Pokemon) => number; - constructor(formFunc: ((p: Pokemon) => integer)) { + constructor(formFunc: ((p: Pokemon) => number)) { super(true); this.formFunc = formFunc; } - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) { - if (!simulated) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - } + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.formFunc(pokemon) !== pokemon.formIndex; + } - return true; + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + if (!simulated) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger, false); } - - return false; } } @@ -3653,28 +4070,25 @@ export class PostTurnFormChangeAbAttr extends PostTurnAbAttr { * Attribute used for abilities (Bad Dreams) that damages the opponents for being asleep */ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { - + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return pokemon.getOpponents().some(opp => (opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !opp.switchOutStatus); + } /** * 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 */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { - let hadEffect: boolean = false; + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { 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) })); + globalScene.queueMessage(i18next.t("abilityTriggers:badDreams", { pokemonName: getPokemonNameWithAffix(opp) })); } - hadEffect = true; } - } - return hadEffect; } } @@ -3687,25 +4101,22 @@ export class FetchBallAbAttr extends PostTurnAbAttr { constructor() { super(); } + + override canApplyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !simulated && globalScene.currentBattle.lastUsedPokeball !== null && !!pokemon.isPlayer; + } + /** * Adds the last used Pokeball back into the player's inventory * @param pokemon {@linkcode Pokemon} with this ability * @param passive N/A * @param args N/A - * @returns true if player has used a pokeball and this pokemon is owned by the player */ - applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (simulated) { - return false; - } - const lastUsed = pokemon.scene.currentBattle.lastUsedPokeball; - if (lastUsed !== null && !!pokemon.isPlayer) { - pokemon.scene.pokeballCounts[lastUsed]++; - pokemon.scene.currentBattle.lastUsedPokeball = null; - pokemon.scene.queueMessage(i18next.t("abilityTriggers:fetchBall", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokeballName: getPokeballName(lastUsed) })); - return true; - } - return false; + override applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const lastUsed = globalScene.currentBattle.lastUsedPokeball; + globalScene.pokeballCounts[lastUsed!]++; + globalScene.currentBattle.lastUsedPokeball = null; + globalScene.queueMessage(i18next.t("abilityTriggers:fetchBall", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokeballName: getPokeballName(lastUsed!) })); } } @@ -3720,16 +4131,14 @@ export class PostBiomeChangeWeatherChangeAbAttr extends PostBiomeChangeAbAttr { this.weatherType = weatherType; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!pokemon.scene.arena.weather?.isImmutable()) { - if (simulated) { - return pokemon.scene.arena.weather?.weatherType !== this.weatherType; - } else { - return pokemon.scene.arena.trySetWeather(this.weatherType, true); - } - } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return ((globalScene.arena.weather?.isImmutable() ?? false) && globalScene.arena.canSetWeather(this.weatherType)); + } - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetWeather(this.weatherType, true); + } } } @@ -3742,11 +4151,13 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { this.terrainType = terrainType; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (simulated) { - return pokemon.scene.arena.terrain?.terrainType !== this.terrainType; - } else { - return pokemon.scene.arena.trySetTerrain(this.terrainType, true); + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.canSetTerrain(this.terrainType); + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + globalScene.arena.trySetTerrain(this.terrainType, true); } } } @@ -3756,9 +4167,24 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { * @extends AbAttr */ export class PostMoveUsedAbAttr extends AbAttr { - applyPostMoveUsed(pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { - return false; + canApplyPostMoveUsed( + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[]): boolean { + return true; } + + applyPostMoveUsed( + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[], + ): void {} } /** @@ -3766,6 +4192,15 @@ export class PostMoveUsedAbAttr extends AbAttr { * @extends PostMoveUsedAbAttr */ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { + override canApplyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean { + // List of tags that prevent the Dancer from replicating the move + const forbiddenTags = [ BattlerTagType.FLYING, BattlerTagType.UNDERWATER, + BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN ]; + // The move to replicate cannot come from the Dancer + return source.getBattlerIndex() !== dancer.getBattlerIndex() + && !dancer.summonData.tags.some(tag => forbiddenTags.includes(tag.tagType)); + } + /** * Resolves the Dancer ability by replicating the move used by the source of the dance * either on the source itself or on the target of the dance @@ -3774,29 +4209,24 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { * @param source {@linkcode Pokemon} that used the dancing move * @param targets {@linkcode BattlerIndex}Targets of the dancing move * @param args N/A - * - * @return true if the Dancer ability was resolved */ - applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean, args: any[]): boolean | Promise { - // List of tags that prevent the Dancer from replicating the move - const forbiddenTags = [ BattlerTagType.FLYING, BattlerTagType.UNDERWATER, - BattlerTagType.UNDERGROUND, BattlerTagType.HIDDEN ]; - // The move to replicate cannot come from the Dancer - if (source.getBattlerIndex() !== dancer.getBattlerIndex() - && !dancer.summonData.tags.some(tag => forbiddenTags.includes(tag.tagType))) { - if (!simulated) { - // If the move is an AttackMove or a StatusMove the Dancer must replicate the move on the source of the Dance - if (move.getMove() instanceof AttackMove || move.getMove() instanceof StatusMove) { - const target = this.getTarget(dancer, source, targets); - dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, target, move, true, true)); - } else if (move.getMove() instanceof SelfStatusMove) { - // If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself - dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, [ dancer.getBattlerIndex() ], move, true, true)); - } + override applyPostMoveUsed( + dancer: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated: boolean, + args: any[]): void { + if (!simulated) { + // If the move is an AttackMove or a StatusMove the Dancer must replicate the move on the source of the Dance + if (move.getMove() instanceof AttackMove || move.getMove() instanceof StatusMove) { + const target = this.getTarget(dancer, source, targets); + globalScene.unshiftPhase(new MovePhase(dancer, target, move, true, true)); + } else if (move.getMove() instanceof SelfStatusMove) { + // If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself + globalScene.unshiftPhase(new MovePhase(dancer, [ dancer.getBattlerIndex() ], move, true, true)); } - return true; } - return false; } /** @@ -3814,28 +4244,68 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { } } -export class StatStageChangeMultiplierAbAttr extends AbAttr { - private multiplier: integer; +/** + * Triggers after the Pokemon loses or consumes an item + * @extends AbAttr + */ +export class PostItemLostAbAttr extends AbAttr { + canApplyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { + return true; + } - constructor(multiplier: integer) { - super(true); + applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): void {} +} + +/** + * Applies a Battler Tag to the Pokemon after it loses or consumes item + * @extends PostItemLostAbAttr + */ +export class PostItemLostApplyBattlerTagAbAttr extends PostItemLostAbAttr { + private tagType: BattlerTagType; + constructor(tagType: BattlerTagType) { + super(false); + this.tagType = tagType; + } + + override canApplyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): boolean { + return !pokemon.getTag(this.tagType) && !simulated; + } + + /** + * Adds the last used Pokeball back into the player's inventory + * @param pokemon {@linkcode Pokemon} with this ability + * @param args N/A + */ + override applyPostItemLost(pokemon: Pokemon, simulated: boolean, args: any[]): void { + pokemon.addTag(this.tagType); + } +} + +export class StatStageChangeMultiplierAbAttr extends AbAttr { + private multiplier: number; + + constructor(multiplier: number) { + super(false); this.multiplier = multiplier; } - override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value *= this.multiplier; - - return true; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value *= this.multiplier; } } export class StatStageChangeCopyAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { + override apply( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + cancelled: Utils.BooleanHolder, + args: any[], + ): void { if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as number), true, false, false)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as number), true, false, false)); } - return true; } } @@ -3844,10 +4314,8 @@ export class BypassBurnDamageReductionAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - - return true; } } @@ -3866,28 +4334,21 @@ export class ReduceBurnDamageAbAttr extends AbAttr { * @param passive N/A * @param cancelled N/A * @param args `[0]` {@linkcode Utils.NumberHolder} The damage value being modified - * @returns `true` */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value = Utils.toDmgValue((args[0] as Utils.NumberHolder).value * this.multiplier); - - return true; } } export class DoubleBerryEffectAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value *= 2; - - return true; } } export class PreventBerryUseAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - - return true; } } @@ -3907,12 +4368,11 @@ export class HealFromBerryUseAbAttr extends AbAttr { this.healPercent = Math.max(Math.min(healPercent, 1), 0); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, ...args: [Utils.BooleanHolder, any[]]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, ...args: [Utils.BooleanHolder, any[]]): void { const { name: abilityName } = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); if (!simulated) { - pokemon.scene.unshiftPhase( + globalScene.unshiftPhase( new PokemonHealPhase( - pokemon.scene, pokemon.getBattlerIndex(), Utils.toDmgValue(pokemon.getMaxHp() * this.healPercent), i18next.t("abilityTriggers:healFromBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName }), @@ -3920,15 +4380,12 @@ export class HealFromBerryUseAbAttr extends AbAttr { ) ); } - return true; } } export class RunSuccessAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = 256; - - return true; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value = 256; } } @@ -3948,9 +4405,24 @@ export class CheckTrappedAbAttr extends AbAttr { this.arenaTrapCondition = condition; } - applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean | Promise { - return false; + canApplyCheckTrapped( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + args: any[]): boolean { + return true; } + + applyCheckTrapped( + pokemon: Pokemon, + passive: boolean, + simulated: boolean, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + args: any[], + ): void {} } /** @@ -3960,6 +4432,12 @@ export class CheckTrappedAbAttr extends AbAttr { * @see {@linkcode applyCheckTrapped} */ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { + override canApplyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean { + return this.arenaTrapCondition(pokemon, otherPokemon) + && !(otherPokemon.getTypes(true).includes(PokemonType.GHOST) || (otherPokemon.getTypes(true).includes(PokemonType.STELLAR) && otherPokemon.getTypes().includes(PokemonType.GHOST))) + && !otherPokemon.hasAbility(Abilities.RUN_AWAY); + } + /** * Checks if enemy Pokemon is trapped by an Arena Trap-esque ability * If the enemy is a Ghost type, it is not trapped @@ -3971,22 +4449,9 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { * @param trapped {@link Utils.BooleanHolder} indicating whether the other Pokemon is trapped or not * @param otherPokemon The {@link Pokemon} that is affected by an Arena Trap ability * @param args N/A - * @returns if enemy Pokemon is trapped or not */ - applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean { - if (this.arenaTrapCondition(pokemon, otherPokemon)) { - if (otherPokemon.getTypes(true).includes(Type.GHOST) || (otherPokemon.getTypes(true).includes(Type.STELLAR) && otherPokemon.getTypes().includes(Type.GHOST))) { - trapped.value = false; - return false; - } else if (otherPokemon.hasAbility(Abilities.RUN_AWAY)) { - trapped.value = false; - return false; - } - trapped.value = true; - return true; - } - trapped.value = false; - return false; + override applyCheckTrapped(pokemon: Pokemon, passive: boolean, simulated: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): void { + trapped.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -3995,10 +4460,12 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { } export class MaxMultiHitAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = 0; + constructor() { + super(false); + } - return true; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + (args[0] as Utils.NumberHolder).value = 0; } } @@ -4007,32 +4474,48 @@ export class PostBattleAbAttr extends AbAttr { super(true); } - applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - return false; + canApplyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return true; } + + applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void {} } export class PostBattleLootAbAttr extends PostBattleAbAttr { - applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const postBattleLoot = pokemon.scene.currentBattle.postBattleLoot; - if (!simulated && postBattleLoot.length) { - const randItem = Utils.randSeedItem(postBattleLoot); - //@ts-ignore - TODO see below - if (pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true)) { // TODO: fix. This is a promise!? - postBattleLoot.splice(postBattleLoot.indexOf(randItem), 1); - pokemon.scene.queueMessage(i18next.t("abilityTriggers:postBattleLoot", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), itemName: randItem.type.name })); - return true; - } + private randItem?: PokemonHeldItemModifier; + + override canApplyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const postBattleLoot = globalScene.currentBattle.postBattleLoot; + if (!simulated && postBattleLoot.length && args[0]) { + this.randItem = Utils.randSeedItem(postBattleLoot); + return globalScene.canTransferHeldItemModifier(this.randItem, pokemon, 1); + } + return false; + } + + /** + * @param args - `[0]`: boolean for if the battle ended in a victory + */ + override applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + const postBattleLoot = globalScene.currentBattle.postBattleLoot; + if (!this.randItem) { + this.randItem = Utils.randSeedItem(postBattleLoot); } - return false; + if (globalScene.tryTransferHeldItemModifier(this.randItem, pokemon, true, 1, true, undefined, false)) { + postBattleLoot.splice(postBattleLoot.indexOf(this.randItem), 1); + globalScene.queueMessage(i18next.t("abilityTriggers:postBattleLoot", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), itemName: this.randItem.type.name })); + } + this.randItem = undefined; } } export class PostFaintAbAttr extends AbAttr { - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { - return false; + canApplyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + return true; } + + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): void {} } /** @@ -4041,6 +4524,10 @@ export class PostFaintAbAttr extends AbAttr { * @extends PostFaintAbAttr */ export class PostFaintUnsuppressedWeatherFormChangeAbAttr extends PostFaintAbAttr { + override canApplyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + return getPokemonWithWeatherBasedForms().length > 0; + } + /** * Triggers {@linkcode Arena.triggerWeatherBasedFormChanges | triggerWeatherBasedFormChanges} * when the user of the ability faints @@ -4050,100 +4537,39 @@ export class PostFaintUnsuppressedWeatherFormChangeAbAttr extends PostFaintAbAtt * @param move n/a * @param hitResult n/a * @param args n/a - * @returns whether the form change was triggered */ - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - const pokemonToTransform = getPokemonWithWeatherBasedForms(pokemon.scene); - - if (pokemonToTransform.length < 1) { - return false; - } - + override applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): void { if (!simulated) { - pokemon.scene.arena.triggerWeatherBasedFormChanges(); + globalScene.arena.triggerWeatherBasedFormChanges(); } - - return true; - } -} - -/** - * Clears Desolate Land/Primordial Sea/Delta Stream upon the Pokemon fainting - */ -export class PostFaintClearWeatherAbAttr extends PostFaintAbAttr { - - /** - * @param pokemon The {@linkcode Pokemon} with the ability - * @param passive N/A - * @param attacker N/A - * @param move N/A - * @param hitResult N/A - * @param args N/A - * @returns {boolean} Returns true if the weather clears, otherwise false. - */ - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { - const weatherType = pokemon.scene.arena.weather?.weatherType; - let turnOffWeather = false; - - // Clear weather only if user's ability matches the weather and no other pokemon has the ability. - switch (weatherType) { - case (WeatherType.HARSH_SUN): - if (pokemon.hasAbility(Abilities.DESOLATE_LAND) - && pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) { - turnOffWeather = true; - } - break; - case (WeatherType.HEAVY_RAIN): - if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) - && pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) { - turnOffWeather = true; - } - break; - case (WeatherType.STRONG_WINDS): - if (pokemon.hasAbility(Abilities.DELTA_STREAM) - && pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) { - turnOffWeather = true; - } - break; - } - - if (simulated) { - return turnOffWeather; - } - - if (turnOffWeather) { - pokemon.scene.arena.trySetWeather(WeatherType.NONE, false); - return true; - } - - return false; } } export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { - private damageRatio: integer; + private damageRatio: number; - constructor(damageRatio: integer) { - super(); + constructor(damageRatio: number) { + super(true); this.damageRatio = damageRatio; } - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { - if (move !== undefined && attacker !== undefined && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { //If the mon didn't die to indirect damage - const cancelled = new Utils.BooleanHolder(false); - pokemon.scene.getField(true).map(p => applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled, simulated)); - if (cancelled.value || attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { - return false; - } - if (!simulated) { - attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); - attacker.turnData.damageTaken += Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)); - } - return true; + override canApplyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + const diedToDirectDamage = move !== undefined && attacker !== undefined && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon); + const cancelled = new Utils.BooleanHolder(false); + globalScene.getField(true).map(p => applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled, simulated)); + if (!diedToDirectDamage || cancelled.value || attacker!.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + return false; } - return false; + return true; + } + + override applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): void { + if (!simulated) { + attacker!.damageAndUpdate(Utils.toDmgValue(attacker!.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker!.turnData.damageTaken += Utils.toDmgValue(attacker!.getMaxHp() * (1 / this.damageRatio)); + } } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -4159,13 +4585,12 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { super (); } - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + override applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): void { if (move !== undefined && attacker !== undefined && !simulated) { //If the mon didn't die to indirect damage const damage = pokemon.turnData.attacksReceived[0].damage; attacker.damageAndUpdate((damage), HitResult.OTHER); attacker.turnData.damageTaken += damage; } - return true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -4173,36 +4598,49 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { } } +/** + * Redirects a move to the pokemon with this ability if it meets the conditions + */ export class RedirectMoveAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.canRedirect(args[0] as Moves)) { - const target = args[1] as Utils.IntegerHolder; - const newTarget = pokemon.getBattlerIndex(); - if (target.value !== newTarget) { - target.value = newTarget; - return true; - } - } + /** + * @param pokemon - The Pokemon with the redirection ability + * @param args - The args passed to the `AbAttr`: + * - `[0]` - The id of the {@linkcode Move} used + * - `[1]` - The target's battler index (before redirection) + * - `[2]` - The Pokemon that used the move being redirected + */ - return false; + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + if (!this.canRedirect(args[0] as Moves, args[2] as Pokemon)) { + return false; + } + const target = args[1] as Utils.NumberHolder; + const newTarget = pokemon.getBattlerIndex(); + return target.value !== newTarget; } - canRedirect(moveId: Moves): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + const target = args[1] as Utils.NumberHolder; + const newTarget = pokemon.getBattlerIndex(); + target.value = newTarget; + } + + canRedirect(moveId: Moves, user: Pokemon): boolean { const move = allMoves[moveId]; return !![ MoveTarget.NEAR_OTHER, MoveTarget.OTHER ].find(t => move.moveTarget === t); } } export class RedirectTypeMoveAbAttr extends RedirectMoveAbAttr { - public type: Type; + public type: PokemonType; - constructor(type: Type) { + constructor(type: PokemonType) { super(); this.type = type; } - canRedirect(moveId: Moves): boolean { - return super.canRedirect(moveId) && allMoves[moveId].type === this.type; + canRedirect(moveId: Moves, user: Pokemon): boolean { + return super.canRedirect(moveId, user) && user.getMoveType(allMoves[moveId]) === this.type; } } @@ -4217,28 +4655,23 @@ export class ReduceStatusEffectDurationAbAttr extends AbAttr { private statusEffect: StatusEffect; constructor(statusEffect: StatusEffect) { - super(true); + super(false); this.statusEffect = statusEffect; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return args[1] instanceof Utils.NumberHolder && args[0] === this.statusEffect; + } + /** * Reduces the number of sleep turns remaining by an extra 1 when applied * @param args - The args passed to the `AbAttr`: * - `[0]` - The {@linkcode StatusEffect} of the Pokemon * - `[1]` - The number of turns remaining until the status is healed - * @returns `true` if the ability was applied */ - apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!(args[1] instanceof Utils.NumberHolder)) { - return false; - } - if (args[0] === this.statusEffect) { - args[1].value -= 1; - return true; - } - - return false; + override apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): void { + args[1].value -= 1; } } @@ -4261,20 +4694,18 @@ export class FlinchStatStageChangeAbAttr extends FlinchEffectAbAttr { this.stages = stages; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, this.stats, this.stages)); } - return true; } } export class IncreasePpAbAttr extends AbAttr { } export class ForceSwitchOutImmunityAbAttr extends AbAttr { - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { cancelled.value = true; - return true; } } @@ -4283,15 +4714,13 @@ export class ReduceBerryUseThresholdAbAttr extends AbAttr { super(); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const hpRatio = pokemon.getHpRatio(); + return args[0].value < hpRatio; + } - if (args[0].value < hpRatio) { - args[0].value *= 2; - return args[0].value >= hpRatio; - } - - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + args[0].value *= 2; } } @@ -4300,18 +4729,16 @@ export class ReduceBerryUseThresholdAbAttr extends AbAttr { * Used for Heavy Metal (doubling weight) and Light Metal (halving weight) */ export class WeightMultiplierAbAttr extends AbAttr { - private multiplier: integer; + private multiplier: number; - constructor(multiplier: integer) { - super(); + constructor(multiplier: number) { + super(false); this.multiplier = multiplier; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Utils.NumberHolder).value *= this.multiplier; - - return true; } } @@ -4320,10 +4747,8 @@ export class SyncEncounterNatureAbAttr extends AbAttr { super(false); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { (args[0] as Pokemon).setNature(pokemon.getNature()); - - return true; } } @@ -4336,27 +4761,12 @@ export class MoveAbilityBypassAbAttr extends AbAttr { this.moveIgnoreFunc = moveIgnoreFunc || ((pokemon, move) => true); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.moveIgnoreFunc(pokemon, (args[0] as Move))) { - cancelled.value = true; - return true; - } - return false; - } -} - -export class SuppressFieldAbilitiesAbAttr extends AbAttr { - constructor() { - super(false); + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.moveIgnoreFunc(pokemon, (args[0] as Move)); } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ability = (args[0] as Ability); - if (!ability.hasAttr(UnsuppressableAbilityAbAttr) && !ability.hasAttr(SuppressFieldAbilitiesAbAttr)) { - cancelled.value = true; - return true; - } - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } @@ -4370,6 +4780,14 @@ export class IgnoreProtectOnContactAbAttr extends AbAttr { } * Allows the source's moves to bypass the effects of opposing Light Screen, Reflect, Aurora Veil, Safeguard, Mist, and Substitute. */ export class InfiltratorAbAttr extends AbAttr { + constructor() { + super(false); + } + + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return args[0] instanceof Utils.BooleanHolder; + } + /** * Sets a flag to bypass screens, Substitute, Safeguard, and Mist * @param pokemon n/a @@ -4377,18 +4795,20 @@ export class InfiltratorAbAttr extends AbAttr { * @param simulated n/a * @param cancelled n/a * @param args `[0]` a {@linkcode Utils.BooleanHolder | BooleanHolder} containing the flag - * @returns `true` if the bypass flag was successfully set; `false` otherwise. */ - override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: null, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: null, args: any[]): void { const bypassed = args[0]; - if (args[0] instanceof Utils.BooleanHolder) { - bypassed.value = true; - return true; - } - return false; + bypassed.value = true; } } +/** + * Attribute implementing the effects of {@link https://bulbapedia.bulbagarden.net/wiki/Magic_Bounce_(ability) | Magic Bounce}. + * Allows the source to bounce back {@linkcode MoveFlags.REFLECTABLE | Reflectable} + * moves as if the user had used {@linkcode Moves.MAGIC_COAT | Magic Coat}. + */ +export class ReflectStatusMoveAbAttr extends AbAttr { } + export class UncopiableAbilityAbAttr extends AbAttr { constructor() { super(false); @@ -4420,21 +4840,21 @@ export class NoFusionAbilityAbAttr extends AbAttr { } export class IgnoreTypeImmunityAbAttr extends AbAttr { - private defenderType: Type; - private allowedMoveTypes: Type[]; + private defenderType: PokemonType; + private allowedMoveTypes: PokemonType[]; - constructor(defenderType: Type, allowedMoveTypes: Type[]) { - super(true); + constructor(defenderType: PokemonType, allowedMoveTypes: PokemonType[]) { + super(false); this.defenderType = defenderType; this.allowedMoveTypes = allowedMoveTypes; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.defenderType === (args[1] as Type) && this.allowedMoveTypes.includes(args[0] as Type)) { - cancelled.value = true; - return true; - } - return false; + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.defenderType === (args[1] as PokemonType) && this.allowedMoveTypes.includes(args[0] as PokemonType); + } + + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } @@ -4443,22 +4863,21 @@ export class IgnoreTypeImmunityAbAttr extends AbAttr { */ export class IgnoreTypeStatusEffectImmunityAbAttr extends AbAttr { private statusEffect: StatusEffect[]; - private defenderType: Type[]; + private defenderType: PokemonType[]; - constructor(statusEffect: StatusEffect[], defenderType: Type[]) { - super(true); + constructor(statusEffect: StatusEffect[], defenderType: PokemonType[]) { + super(false); this.statusEffect = statusEffect; this.defenderType = defenderType; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.statusEffect.includes(args[0] as StatusEffect) && this.defenderType.includes(args[1] as Type)) { - cancelled.value = true; - return true; - } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return this.statusEffect.includes(args[0] as StatusEffect) && this.defenderType.includes(args[1] as PokemonType); + } - return false; + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { + cancelled.value = true; } } @@ -4473,17 +4892,17 @@ export class MoneyAbAttr extends PostBattleAbAttr { super(); } + override canApplyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !simulated && args[0]; + } + /** * @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 */ - applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!simulated) { - pokemon.scene.currentBattle.moneyScattered += pokemon.scene.getWaveMoneyAmount(0.2); - } - return true; + override applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + globalScene.currentBattle.moneyScattered += globalScene.getWaveMoneyAmount(0.2); } } @@ -4491,13 +4910,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; @@ -4512,6 +4930,12 @@ export class PostSummonStatStageChangeOnArenaAbAttr extends PostSummonStatStageC this.tagType = tagType; } + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const side = pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + return (globalScene.arena.getTagOnSide(this.tagType, side) ?? false) + && super.canApplyPostSummon(pokemon, passive, simulated, args); + } + /** * Applies the post-summon stat change if the specified arena tag is present on pokemon's side. * This is used in Wind Rider ability. @@ -4519,15 +4943,9 @@ export class PostSummonStatStageChangeOnArenaAbAttr extends PostSummonStatStageC * @param {Pokemon} pokemon - The Pokémon being summoned. * @param {boolean} passive - Whether the effect is passive. * @param {any[]} args - Additional arguments. - * @returns {boolean} - Returns true if the stat change was applied, otherwise false. */ - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - const side = pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - - if (pokemon.scene.arena.getTagOnSide(this.tagType, side)) { - return super.applyPostSummon(pokemon, passive, simulated, args); - } - return false; + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + super.applyPostSummon(pokemon, passive, simulated, args); } } @@ -4551,6 +4969,10 @@ export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr { this.triggerMessageFunc = triggerMessageFunc; } + override canApplyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder | null, args: any[]): boolean { + return this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon); + } + /** * Applies the pre-defense ability to the Pokémon. * Removes the appropriate `BattlerTagType` when hit by an attack and is in its defense form. @@ -4561,21 +4983,15 @@ export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr { * @param move The move being used. * @param _cancelled n/a * @param args Additional arguments. - * @returns `true` if the immunity was applied. */ - override applyPreDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.condition(pokemon, attacker, move) && !move.hitsSubstitute(attacker, pokemon)) { - if (!simulated) { - (args[0] as Utils.NumberHolder).value = this.multiplier; - pokemon.removeTag(this.tagType); - if (this.recoilDamageFunc) { - pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), HitResult.OTHER, false, false, true, true); - } + override applyPreDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _cancelled: Utils.BooleanHolder, args: any[]): void { + if (!simulated) { + (args[0] as Utils.NumberHolder).value = this.multiplier; + pokemon.removeTag(this.tagType); + if (this.recoilDamageFunc) { + pokemon.damageAndUpdate(this.recoilDamageFunc(pokemon), HitResult.OTHER, false, false, true, true); } - return true; } - - return false; } /** @@ -4596,44 +5012,35 @@ export class FormBlockDamageAbAttr extends ReceivedMoveDamageMultiplierAbAttr { * @extends AbAttr */ export class BypassSpeedChanceAbAttr extends AbAttr { - public chance: integer; + public chance: number; /** - * @param {integer} chance probability of ability being active. + * @param {number} chance probability of ability being active. */ - constructor(chance: integer) { + constructor(chance: number) { super(true); this.chance = chance; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const bypassSpeed = args[0] as Utils.BooleanHolder; + const turnCommand = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; + const isCommandFight = turnCommand?.command === Command.FIGHT; + const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; + const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL; + return !simulated && !bypassSpeed.value && pokemon.randSeedInt(100) < this.chance && isCommandFight && isDamageMove; + } + /** * bypass move order in their priority bracket when pokemon choose damaging move * @param {Pokemon} pokemon {@linkcode Pokemon} the Pokemon applying this ability * @param {boolean} passive N/A * @param {Utils.BooleanHolder} cancelled N/A * @param {any[]} args [0] {@linkcode Utils.BooleanHolder} set to true when the ability activated - * @returns {boolean} - whether the ability was activated. */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (simulated) { - return false; - } + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { const bypassSpeed = args[0] as Utils.BooleanHolder; - - if (!bypassSpeed.value && pokemon.randSeedInt(100) < this.chance) { - const turnCommand = - pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; - const isCommandFight = turnCommand?.command === Command.FIGHT; - const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; - const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL; - - if (isCommandFight && isDamageMove) { - bypassSpeed.value = true; - return true; - } - } - - return false; + bypassSpeed.value = true; } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { @@ -4656,112 +5063,567 @@ export class PreventBypassSpeedChanceAbAttr extends AbAttr { this.condition = condition; } + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + const turnCommand = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; + const isCommandFight = turnCommand?.command === Command.FIGHT; + const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; + return isCommandFight && this.condition(pokemon, move!); + } + /** * @argument {boolean} bypassSpeed - determines if a Pokemon is able to bypass speed at the moment * @argument {boolean} canCheckHeldItems - determines if a Pokemon has access to Quick Claw's effects or not */ - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): void { const bypassSpeed = args[0] as Utils.BooleanHolder; const canCheckHeldItems = args[1] as Utils.BooleanHolder; - - const turnCommand = pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; - const isCommandFight = turnCommand?.command === Command.FIGHT; - const move = turnCommand?.move?.move ? allMoves[turnCommand.move.move] : null; - if (this.condition(pokemon, move!) && isCommandFight) { - bypassSpeed.value = false; - canCheckHeldItems.value = false; - return false; - } - return true; + bypassSpeed.value = false; + canCheckHeldItems.value = false; } } -async function applyAbAttrsInternal( +/** + * This applies a terrain-based type change to the Pokemon. + * Used by Mimicry. + */ +export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { + constructor() { + super(true); + } + + override canApply(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return !pokemon.isTerastallized; + } + + override apply(pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, _args: any[]): void { + const currentTerrain = globalScene.arena.getTerrainType(); + const typeChange: PokemonType[] = this.determineTypeChange(pokemon, currentTerrain); + if (typeChange.length !== 0) { + if (pokemon.summonData.addedType && typeChange.includes(pokemon.summonData.addedType)) { + pokemon.summonData.addedType = null; + } + pokemon.summonData.types = typeChange; + pokemon.updateInfo(); + } + } + + /** + * Retrieves the type(s) the Pokemon should change to in response to a terrain + * @param pokemon + * @param currentTerrain {@linkcode TerrainType} + * @returns a list of type(s) + */ + private determineTypeChange(pokemon: Pokemon, currentTerrain: TerrainType): PokemonType[] { + const typeChange: PokemonType[] = []; + switch (currentTerrain) { + case TerrainType.ELECTRIC: + typeChange.push(PokemonType.ELECTRIC); + break; + case TerrainType.MISTY: + typeChange.push(PokemonType.FAIRY); + break; + case TerrainType.GRASSY: + typeChange.push(PokemonType.GRASS); + break; + case TerrainType.PSYCHIC: + typeChange.push(PokemonType.PSYCHIC); + break; + default: + pokemon.getTypes(false, false, true).forEach(t => { + typeChange.push(t); + }); + break; + } + return typeChange; + } + + override canApplyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + return globalScene.arena.getTerrainType() !== TerrainType.NONE && + this.canApply(pokemon, passive, simulated, args); + } + + /** + * Checks if the Pokemon should change types if summoned into an active terrain + */ + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): void { + this.apply(pokemon, passive, simulated, new Utils.BooleanHolder(false), []); + } + + override getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { + const currentTerrain = globalScene.arena.getTerrainType(); + const pokemonNameWithAffix = getPokemonNameWithAffix(pokemon); + if (currentTerrain === TerrainType.NONE) { + return i18next.t("abilityTriggers:pokemonTypeChangeRevert", { pokemonNameWithAffix }); + } else { + const moveType = i18next.t(`pokemonInfo:Type.${PokemonType[this.determineTypeChange(pokemon, currentTerrain)[0]]}`); + return i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix, moveType }); + } + } +} + +function applySingleAbAttrs( + pokemon: Pokemon, + passive: boolean, attrType: Constructor, - pokemon: Pokemon | null, applyFunc: AbAttrApplyFunc, + successFunc: AbAttrSuccessFunc, args: any[], - showAbilityInstant: boolean = false, + gainedMidTurn: boolean = false, simulated: boolean = false, - messages: string[] = [], + messages: string[] = [] ) { - for (const passive of [ false, true ]) { - if (!pokemon?.canApplyAbility(passive) || (passive && pokemon.getPassiveAbility().id === pokemon.getAbility().id)) { + if (!pokemon?.canApplyAbility(passive) || (passive && (pokemon.getPassiveAbility().id === pokemon.getAbility().id))) { + return; + } + + const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); + if (gainedMidTurn && ability.getAttrs(attrType).some(attr => attr instanceof PostSummonAbAttr && !attr.shouldActivateOnGain())) { + return; + } + + for (const attr of ability.getAttrs(attrType)) { + const condition = attr.getCondition(); + let abShown = false; + if (condition && !condition(pokemon) || !successFunc(attr, passive)) { continue; } - const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); - for (const attr of ability.getAttrs(attrType)) { - const condition = attr.getCondition(); - if (condition && !condition(pokemon)) { - continue; - } + globalScene.setPhaseQueueSplice(); - pokemon.scene.setPhaseQueueSplice(); - - let result = applyFunc(attr, passive); - // TODO Remove this when promises get reworked - if (result instanceof Promise) { - result = await result; - } - if (result) { - if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) { - pokemon.summonData.abilitiesApplied.push(ability.id); - } - if (pokemon.battleData && !simulated && !pokemon.battleData.abilitiesApplied.includes(ability.id)) { - pokemon.battleData.abilitiesApplied.push(ability.id); - } - if (attr.showAbility && !simulated) { - if (showAbilityInstant) { - pokemon.scene.abilityBar.showAbility(pokemon, passive); - } else { - queueShowAbility(pokemon, passive); - } - } - const message = attr.getTriggerMessage(pokemon, ability.name, args); - if (message) { - if (!simulated) { - pokemon.scene.queueMessage(message); - } - } - messages.push(message!); - } + if (attr.showAbility && !simulated) { + globalScene.queueAbilityDisplay(pokemon, passive, true); + abShown = true; } - pokemon.scene.clearPhaseQueueSplice(); + const message = attr.getTriggerMessage(pokemon, ability.name, args); + if (message) { + if (!simulated) { + globalScene.queueMessage(message); + } + messages.push(message); + } + + applyFunc(attr, passive); + + if (abShown) { + globalScene.queueAbilityDisplay(pokemon, passive, false); + } + + if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) { + pokemon.summonData.abilitiesApplied.push(ability.id); + } + if (pokemon.battleData && !simulated && !pokemon.battleData.abilitiesApplied.includes(ability.id)) { + pokemon.battleData.abilitiesApplied.push(ability.id); + } + + globalScene.clearPhaseQueueSplice(); } } -export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), args, false, simulated); +class ForceSwitchOutHelper { + constructor(private switchType: SwitchType) {} + + /** + * Handles the logic for switching out a Pokémon based on battle conditions, HP, and the switch type. + * + * @param pokemon The {@linkcode Pokemon} attempting to switch out. + * @returns `true` if the switch is successful + */ + public switchOutLogic(pokemon: Pokemon): boolean { + const switchOutTarget = pokemon; + /** + * If the switch-out target is a player-controlled Pokémon, the function checks: + * - Whether there are available party members to switch in. + * - If the Pokémon is still alive (hp > 0), and if so, it leaves the field and a new SwitchPhase is initiated. + */ + if (switchOutTarget instanceof PlayerPokemon) { + if (globalScene.getPlayerParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) { + return false; + } + + if (switchOutTarget.hp > 0) { + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + globalScene.prependToPhase(new SwitchPhase(this.switchType, switchOutTarget.getFieldIndex(), true, true), MoveEndPhase); + return true; + } + /** + * For non-wild battles, it checks if the opposing party has any available Pokémon to switch in. + * If yes, the Pokémon leaves the field and a new SwitchSummonPhase is initiated. + */ + } else if (globalScene.currentBattle.battleType !== BattleType.WILD) { + if (globalScene.getEnemyParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) { + return false; + } + if (switchOutTarget.hp > 0) { + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + const summonIndex = (globalScene.currentBattle.trainer ? globalScene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0); + globalScene.prependToPhase(new SwitchSummonPhase(this.switchType, switchOutTarget.getFieldIndex(), summonIndex, false, false), MoveEndPhase); + return true; + } + /** + * For wild Pokémon battles, the Pokémon will flee if the conditions are met (waveIndex and double battles). + * It will not flee if it is a Mystery Encounter with fleeing disabled (checked in `getSwitchOutCondition()`) or if it is a wave 10x wild boss + */ + } else { + if (!globalScene.currentBattle.waveIndex || globalScene.currentBattle.waveIndex % 10 === 0) { + return false; + } + + if (switchOutTarget.hp > 0) { + switchOutTarget.leaveField(false); + globalScene.queueMessage(i18next.t("moveTriggers:fled", { pokemonName: getPokemonNameWithAffix(switchOutTarget) }), null, true, 500); + + if (globalScene.currentBattle.double) { + const allyPokemon = switchOutTarget.getAlly(); + globalScene.redirectPokemonMoves(switchOutTarget, allyPokemon); + } + } + + if (!switchOutTarget.getAlly()?.isActive(true)) { + globalScene.clearEnemyHeldItemModifiers(); + + if (switchOutTarget.hp) { + globalScene.pushPhase(new BattleEndPhase(false)); + globalScene.pushPhase(new NewBattlePhase()); + } + } + } + return false; + } + + /** + * Determines if a Pokémon can switch out based on its status, the opponent's status, and battle conditions. + * + * @param pokemon The Pokémon attempting to switch out. + * @param opponent The opponent Pokémon. + * @returns `true` if the switch-out condition is met + */ + public getSwitchOutCondition(pokemon: Pokemon, opponent: Pokemon): boolean { + const switchOutTarget = pokemon; + const player = switchOutTarget instanceof PlayerPokemon; + + if (player) { + const blockedByAbility = new Utils.BooleanHolder(false); + applyAbAttrs(ForceSwitchOutImmunityAbAttr, opponent, blockedByAbility); + return !blockedByAbility.value; + } + + if (!player && globalScene.currentBattle.battleType === BattleType.WILD) { + if (!globalScene.currentBattle.waveIndex && globalScene.currentBattle.waveIndex % 10 === 0) { + return false; + } + } + + if (!player && globalScene.currentBattle.isBattleMysteryEncounter() && !globalScene.currentBattle.mysteryEncounter?.fleeAllowed) { + return false; + } + + const party = player ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); + return (!player && globalScene.currentBattle.battleType === BattleType.WILD) + || party.filter(p => p.isAllowedInBattle() + && (player || (p as EnemyPokemon).trainerSlot === (switchOutTarget as EnemyPokemon).trainerSlot)).length > globalScene.currentBattle.getBattlerCount(); + } + + /** + * Returns a message if the switch-out attempt fails due to ability effects. + * + * @param target The target Pokémon. + * @returns The failure message, or `null` if no failure. + */ + public getFailedText(target: Pokemon): string | null { + const blockedByAbility = new Utils.BooleanHolder(false); + applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); + return blockedByAbility.value ? i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }) : null; + } } -export function applyPostBattleInitAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), args, false, simulated); +/** + * Calculates the amount of recovery from the Shell Bell item. + * + * If the Pokémon is holding a Shell Bell, this function computes the amount of health + * recovered based on the damage dealt in the current turn. The recovery is multiplied by the + * Shell Bell's modifier (if any). + * + * @param pokemon - The Pokémon whose Shell Bell recovery is being calculated. + * @returns The amount of health recovered by Shell Bell. + */ +function calculateShellBellRecovery(pokemon: Pokemon): number { + const shellBellModifier = pokemon.getHeldItems().find(m => m instanceof HitHealModifier); + if (shellBellModifier) { + return Utils.toDmgValue(pokemon.turnData.totalDamageDealt / 8) * shellBellModifier.stackCount; + } + return 0; } -export function applyPreDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), args, false, simulated); +/** + * Triggers after the Pokemon takes any damage + * @extends AbAttr + */ +export class PostDamageAbAttr extends AbAttr { + public canApplyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon): boolean { + return true; + } + + public applyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon, + ): void {} } -export function applyPostDefendAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); +/** + * Ability attribute for forcing a Pokémon to switch out after its health drops below half. + * This attribute checks various conditions related to the damage received, the moves used by the Pokémon + * and its opponents, and determines whether a forced switch-out should occur. + * + * Used by Wimp Out and Emergency Exit + * + * @extends PostDamageAbAttr + * @see {@linkcode applyPostDamage} + */ +export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { + private helper: ForceSwitchOutHelper = new ForceSwitchOutHelper(SwitchType.SWITCH); + private hpRatio: number; + + constructor(hpRatio = 0.5) { + super(); + this.hpRatio = hpRatio; + } + + public override canApplyPostDamage( + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated: boolean, + args: any[], + source?: Pokemon): boolean { + const moveHistory = pokemon.getMoveHistory(); + // Will not activate when the Pokémon's HP is lowered by cutting its own HP + const fordbiddenAttackingMoves = [ Moves.BELLY_DRUM, Moves.SUBSTITUTE, Moves.CURSE, Moves.PAIN_SPLIT ]; + if (moveHistory.length > 0) { + const lastMoveUsed = moveHistory[moveHistory.length - 1]; + if (fordbiddenAttackingMoves.includes(lastMoveUsed.move)) { + return false; + } + } + + // Dragon Tail and Circle Throw switch out Pokémon before the Ability activates. + const fordbiddenDefendingMoves = [ Moves.DRAGON_TAIL, Moves.CIRCLE_THROW ]; + if (source) { + const enemyMoveHistory = source.getMoveHistory(); + if (enemyMoveHistory.length > 0) { + const enemyLastMoveUsed = enemyMoveHistory[enemyMoveHistory.length - 1]; + // Will not activate if the Pokémon's HP falls below half while it is in the air during Sky Drop. + if (fordbiddenDefendingMoves.includes(enemyLastMoveUsed.move) || enemyLastMoveUsed.move === Moves.SKY_DROP && enemyLastMoveUsed.result === MoveResult.OTHER) { + return false; + // Will not activate if the Pokémon's HP falls below half by a move affected by Sheer Force. + } else if (allMoves[enemyLastMoveUsed.move].chance >= 0 && source.hasAbility(Abilities.SHEER_FORCE)) { + return false; + // Activate only after the last hit of multistrike moves + } else if (source.turnData.hitsLeft > 1) { + return false; + } + if (source.turnData.hitCount > 1) { + damage = pokemon.turnData.damageTaken; + } + } + } + + if (pokemon.hp + damage >= pokemon.getMaxHp() * this.hpRatio) { + const shellBellHeal = calculateShellBellRecovery(pokemon); + if (pokemon.hp - shellBellHeal < pokemon.getMaxHp() * this.hpRatio) { + for (const opponent of pokemon.getOpponents()) { + if (!this.helper.getSwitchOutCondition(pokemon, opponent)) { + return false; + } + } + return true; + } + } + + return false; + } + + /** + * Applies the switch-out logic after the Pokémon takes damage. + * Checks various conditions based on the moves used by the Pokémon, the opponents' moves, and + * the Pokémon's health after damage to determine whether the switch-out should occur. + * + * @param pokemon The Pokémon that took damage. + * @param damage N/A + * @param passive N/A + * @param simulated Whether the ability is being simulated. + * @param args N/A + * @param source N/A + */ + public override applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): void { + this.helper.switchOutLogic(pokemon); + } +} +function applyAbAttrsInternal( + attrType: Constructor, + pokemon: Pokemon | null, + applyFunc: AbAttrApplyFunc, + successFunc: AbAttrSuccessFunc, + args: any[], + simulated: boolean = false, + messages: string[] = [], + gainedMidTurn = false +) { + for (const passive of [ false, true ]) { + if (pokemon) { + applySingleAbAttrs(pokemon, passive, attrType, applyFunc, successFunc, args, gainedMidTurn, simulated, messages); + globalScene.clearPhaseQueueSplice(); + } + } } -export function applyPostMoveUsedAbAttrs(attrType: Constructor, - pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), args, false, simulated); +export function applyAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + cancelled: Utils.BooleanHolder | null, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), + (attr, passive) => attr.canApply(pokemon, passive, simulated, args), + args, + simulated, + ); } -export function applyStatMultiplierAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: BattleStat, statValue: Utils.NumberHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), args); +export function applyPostBattleInitAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostBattleInit(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostBattleInit(pokemon, passive, simulated, args), + args, + simulated, + ); } -export function applyPostSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, effect: StatusEffect, sourcePokemon?: Pokemon | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), args, false, simulated); + +export function applyPreDefendAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker: Pokemon, + move: Move | null, + cancelled: Utils.BooleanHolder | null, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), + (attr, passive) => attr.canApplyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args), + args, + simulated, + ); +} + +export function applyPostDefendAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker: Pokemon, + move: Move, + hitResult: HitResult | null, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), + (attr, passive) => attr.canApplyPostDefend(pokemon, passive, simulated, attacker, move, hitResult, args), args, + simulated, + ); +} + +export function applyPostMoveUsedAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + move: PokemonMove, + source: Pokemon, + targets: BattlerIndex[], + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), + (attr, passive) => attr.canApplyPostMoveUsed(pokemon, move, source, targets, simulated, args), + args, + simulated, + ); +} + +export function applyStatMultiplierAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stat: BattleStat, + statValue: Utils.NumberHolder, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), + (attr, passive) => attr.canApplyStatStage(pokemon, passive, simulated, stat, statValue, args), + args, + ); +} +export function applyPostSetStatusAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + effect: StatusEffect, + sourcePokemon?: Pokemon | null, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), + (attr, passive) => attr.canApplyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), args, + simulated, + ); +} + +export function applyPostDamageAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + damage: number, + passive: boolean, + simulated = false, + args: any[], + source?: Pokemon, +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostDamage(pokemon, damage, passive, simulated, args, source), + (attr, passive) => attr.canApplyPostDamage(pokemon, damage, passive, simulated, args, source), + args, + ); } /** @@ -4774,104 +5636,400 @@ export function applyPostSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), args); +export function applyFieldStatMultiplierAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stat: Stat, + statValue: Utils.NumberHolder, + checkedPokemon: Pokemon, + hasApplied: Utils.BooleanHolder, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), + (attr, passive) => attr.canApplyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), args, + ); } -export function applyPreAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon | null, move: Move, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), args, false, simulated); +export function applyPreAttackAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + defender: Pokemon | null, + move: Move, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreAttack(pokemon, passive, simulated, defender, move, args), + (attr, passive) => attr.canApplyPreAttack(pokemon, passive, simulated, defender, move, args), + args, + simulated, + ); } -export function applyPostAttackAbAttrs(attrType: Constructor, - pokemon: Pokemon, defender: Pokemon, move: Move, hitResult: HitResult | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), args, false, simulated); +export function applyPostAttackAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + defender: Pokemon, + move: Move, + hitResult: HitResult | null, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), + (attr, passive) => attr.canApplyPostAttack(pokemon, passive, simulated, defender, move, hitResult, args), args, + simulated, + ); } -export function applyPostKnockOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, knockedOut: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), args, false, simulated); +export function applyPostKnockOutAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + knockedOut: Pokemon, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostKnockOut(pokemon, passive, simulated, knockedOut, args), + (attr, passive) => attr.canApplyPostKnockOut(pokemon, passive, simulated, knockedOut, args), + args, + simulated, + ); } -export function applyPostVictoryAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostVictoryAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostVictory(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostVictory(pokemon, passive, simulated, args), + args, + simulated, + ); } -export function applyPostSummonAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), args, false, simulated); +export function applyPostSummonAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostSummon(pokemon, passive, simulated, args), + args, + simulated, + ); } -export function applyPreSwitchOutAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), args, true, simulated); +export function applyPreSwitchOutAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPreSwitchOut(pokemon, passive, simulated, args), + args, + simulated, + ); } -export function applyPreStatStageChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon | null, stat: BattleStat, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), args, false, simulated); +export function applyPreLeaveFieldAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated = false, + ...args: any[] +): void { + return applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => + attr.applyPreLeaveField(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPreLeaveField(pokemon, passive, simulated, args), + args, + simulated + ); } -export function applyPostStatStageChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, stats: BattleStat[], stages: integer, selfTarget: boolean, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), args, false, simulated); +export function applyPreStatStageChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon | null, + stat: BattleStat, + cancelled: Utils.BooleanHolder, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), + (attr, passive) => attr.canApplyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), args, + simulated, + ); } -export function applyPreSetStatusAbAttrs(attrType: Constructor, - pokemon: Pokemon, effect: StatusEffect | undefined, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), args, false, simulated); +export function applyPostStatStageChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + stats: BattleStat[], + stages: integer, + selfTarget: boolean, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), + (attr, _passive) => attr.canApplyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), args, + simulated, + ); } -export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor, - pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), args, false, simulated); +export function applyPreSetStatusAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + effect: StatusEffect | undefined, + cancelled: Utils.BooleanHolder, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), + (attr, passive) => attr.canApplyPreSetStatus(pokemon, passive, simulated, effect, cancelled, args), + args, + simulated, + ); } -export function applyPreWeatherEffectAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather | null, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), args, true, simulated); +export function applyPreApplyBattlerTagAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + tag: BattlerTag, + cancelled: Utils.BooleanHolder, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), + (attr, passive) => attr.canApplyPreApplyBattlerTag(pokemon, passive, simulated, tag, cancelled, args), args, + simulated, + ); } -export function applyPostTurnAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), args, false, simulated); +export function applyPreWeatherEffectAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: Weather | null, + cancelled: Utils.BooleanHolder, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), + (attr, passive) => attr.canApplyPreWeatherEffect(pokemon, passive, simulated, weather, cancelled, args), args, + simulated, + ); } -export function applyPostWeatherChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: WeatherType, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), args, false, simulated); +export function applyPostTurnAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostTurn(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostTurn(pokemon, passive, simulated, args), + args, + simulated, + ); } -export function applyPostWeatherLapseAbAttrs(attrType: Constructor, - pokemon: Pokemon, weather: Weather | null, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), args, false, simulated); +export function applyPostWeatherChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: WeatherType, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, simulated, weather, args), + (attr, passive) => attr.canApplyPostWeatherChange(pokemon, passive, simulated, weather, args), + args, + simulated, + ); } -export function applyPostTerrainChangeAbAttrs(attrType: Constructor, - pokemon: Pokemon, terrain: TerrainType, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), args, false, simulated); +export function applyPostWeatherLapseAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + weather: Weather | null, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, simulated, weather, args), + (attr, passive) => attr.canApplyPostWeatherLapse(pokemon, passive, simulated, weather, args), + args, + simulated, + ); } -export function applyCheckTrappedAbAttrs(attrType: Constructor, - pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, messages: string[], simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), args, false, simulated, messages); +export function applyPostTerrainChangeAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + terrain: TerrainType, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, simulated, terrain, args), + (attr, passive) => attr.canApplyPostTerrainChange(pokemon, passive, simulated, terrain, args), + args, + simulated, + ); } -export function applyPostBattleAbAttrs(attrType: Constructor, - pokemon: Pokemon, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), args, false, simulated); +export function applyCheckTrappedAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + trapped: Utils.BooleanHolder, + otherPokemon: Pokemon, + messages: string[], + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), + (attr, passive) => attr.canApplyCheckTrapped(pokemon, passive, simulated, trapped, otherPokemon, args), args, + simulated, + messages, + ); } -export function applyPostFaintAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker?: Pokemon, move?: Move, hitResult?: HitResult, simulated: boolean = false, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); +export function applyPostBattleAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostBattle(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostBattle(pokemon, passive, simulated, args), + args, + simulated, + ); } -function queueShowAbility(pokemon: Pokemon, passive: boolean): void { - pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, passive)); - pokemon.scene.clearPhaseQueueSplice(); +export function applyPostFaintAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + attacker?: Pokemon, + move?: Move, + hitResult?: HitResult, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), + (attr, passive) => attr.canApplyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), + args, + simulated, + ); +} + +export function applyPostItemLostAbAttrs( + attrType: Constructor, + pokemon: Pokemon, + simulated = false, + ...args: any[] +): void { + applyAbAttrsInternal( + attrType, + pokemon, + (attr, passive) => attr.applyPostItemLost(pokemon, simulated, args), + (attr, passive) => attr.canApplyPostItemLost(pokemon, simulated, args), + args, + ); +} + +/** + * Applies abilities when they become active mid-turn (ability switch) + * + * Ignores passives as they don't change and shouldn't be reapplied when main abilities change + */ +export function applyOnGainAbAttrs( + pokemon: Pokemon, + passive: boolean = false, + simulated: boolean = false, + ...args: any[]): void { + applySingleAbAttrs( + pokemon, + passive, + PostSummonAbAttr, + (attr, passive) => attr.applyPostSummon(pokemon, passive, simulated, args), + (attr, passive) => attr.canApplyPostSummon(pokemon, passive, simulated, args), + args, + true, + simulated, + ); +} + +/** + * Clears primal weather/neutralizing gas during the turn if {@linkcode pokemon}'s ability corresponds to one + */ +export function applyOnLoseAbAttrs(pokemon: Pokemon, passive = false, simulated = false, ...args: any[]): void { + applySingleAbAttrs( + pokemon, + passive, + PreLeaveFieldAbAttr, + (attr, passive) => attr.applyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), + (attr, passive) => attr.canApplyPreLeaveField(pokemon, passive, simulated, [ ...args, true ]), + args, + true, + simulated); } /** @@ -4887,10 +6045,9 @@ function setAbilityRevealed(pokemon: Pokemon): void { /** * Returns the Pokemon with weather-based forms - * @param {BattleScene} scene - The current scene */ -function getPokemonWithWeatherBasedForms(scene: BattleScene) { - return scene.getField(true).filter(p => +function getPokemonWithWeatherBasedForms() { + return globalScene.getField(true).filter(p => (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM) || (p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM) ); @@ -4906,7 +6063,7 @@ export function initAbilities() { .attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN), new Ability(Abilities.SPEED_BOOST, 3) - .attr(PostTurnStatStageChangeAbAttr, [ Stat.SPD ], 1), + .attr(SpeedBoostAbAttr), new Ability(Abilities.BATTLE_ARMOR, 3) .attr(BlockCritAbAttr) .ignorable(), @@ -4929,10 +6086,10 @@ export function initAbilities() { .attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.PARALYSIS) .bypassFaint(), new Ability(Abilities.VOLT_ABSORB, 3) - .attr(TypeImmunityHealAbAttr, Type.ELECTRIC) + .attr(TypeImmunityHealAbAttr, PokemonType.ELECTRIC) .ignorable(), new Ability(Abilities.WATER_ABSORB, 3) - .attr(TypeImmunityHealAbAttr, Type.WATER) + .attr(TypeImmunityHealAbAttr, PokemonType.WATER) .ignorable(), new Ability(Abilities.OBLIVIOUS, 3) .attr(BattlerTagImmunityAbAttr, [ BattlerTagType.INFATUATED, BattlerTagType.TAUNT ]) @@ -4957,10 +6114,11 @@ export function initAbilities() { .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .ignorable(), new Ability(Abilities.FLASH_FIRE, 3) - .attr(TypeImmunityAddBattlerTagAbAttr, Type.FIRE, BattlerTagType.FIRE_BOOST, 1) + .attr(TypeImmunityAddBattlerTagAbAttr, PokemonType.FIRE, BattlerTagType.FIRE_BOOST, 1) .ignorable(), new Ability(Abilities.SHIELD_DUST, 3) - .attr(IgnoreMoveEffectsAbAttr), + .attr(IgnoreMoveEffectsAbAttr) + .ignorable(), new Ability(Abilities.OWN_TEMPO, 3) .attr(BattlerTagImmunityAbAttr, BattlerTagType.CONFUSED) .attr(IntimidateImmunityAbAttr) @@ -4986,22 +6144,21 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.LEVITATE, 3) - .attr(AttackTypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY)) + .attr(AttackTypeImmunityAbAttr, PokemonType.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !globalScene.arena.getTag(ArenaTagType.GRAVITY)) .ignorable(), new Ability(Abilities.EFFECT_SPORE, 3) .attr(EffectSporeAbAttr), new Ability(Abilities.SYNCHRONIZE, 3) .attr(SyncEncounterNatureAbAttr) - .attr(SynchronizeStatusAbAttr) - .partial(), // interaction with psycho shift needs work, keeping to old Gen interaction for now + .attr(SynchronizeStatusAbAttr), new Ability(Abilities.CLEAR_BODY, 3) .attr(ProtectStatAbAttr) .ignorable(), new Ability(Abilities.NATURAL_CURE, 3) .attr(PreSwitchOutResetStatusAbAttr), new Ability(Abilities.LIGHTNING_ROD, 3) - .attr(RedirectTypeMoveAbAttr, Type.ELECTRIC) - .attr(TypeImmunityStatStageChangeAbAttr, Type.ELECTRIC, Stat.SPATK, 1) + .attr(RedirectTypeMoveAbAttr, PokemonType.ELECTRIC) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.ELECTRIC, Stat.SPATK, 1) .ignorable(), new Ability(Abilities.SERENE_GRACE, 3) .attr(MoveEffectChanceMultiplierAbAttr, 2), @@ -5014,6 +6171,7 @@ export function initAbilities() { new Ability(Abilities.ILLUMINATE, 3) .attr(ProtectStatAbAttr, Stat.ACC) .attr(DoubleBattleChanceAbAttr) + .attr(IgnoreOpponentStatStagesAbAttr, [ Stat.EVA ]) .ignorable(), new Ability(Abilities.TRACE, 3) .attr(PostSummonCopyAbilityAbAttr) @@ -5035,7 +6193,7 @@ export function initAbilities() { .ignorable(), new Ability(Abilities.MAGNET_PULL, 3) .attr(ArenaTrapAbAttr, (user, target) => { - if (target.getTypes(true).includes(Type.STEEL) || (target.getTypes(true).includes(Type.STELLAR) && target.getTypes().includes(Type.STEEL))) { + if (target.getTypes(true).includes(PokemonType.STEEL) || (target.getTypes(true).includes(PokemonType.STELLAR) && target.getTypes().includes(PokemonType.STEEL))) { return true; } return false; @@ -5052,8 +6210,8 @@ export function initAbilities() { .attr(IncreasePpAbAttr) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonPressure", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.THICK_FAT, 3) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.ICE, 0.5) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.FIRE, 0.5) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.ICE, 0.5) .ignorable(), new Ability(Abilities.EARLY_BIRD, 3) .attr(ReduceStatusEffectDurationAbAttr, StatusEffect.SLEEP), @@ -5069,7 +6227,8 @@ export function initAbilities() { .attr(ProtectStatAbAttr, Stat.ATK) .ignorable(), new Ability(Abilities.PICKUP, 3) - .attr(PostBattleLootAbAttr), + .attr(PostBattleLootAbAttr) + .attr(UnsuppressableAbilityAbAttr), new Ability(Abilities.TRUANT, 3) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false), new Ability(Abilities.HUSTLE, 3) @@ -5078,11 +6237,9 @@ export function initAbilities() { new Ability(Abilities.CUTE_CHARM, 3) .attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED), new Ability(Abilities.PLUS, 3) - .conditionalAttr(p => p.scene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5) - .ignorable(), + .conditionalAttr(p => globalScene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5), new Ability(Abilities.MINUS, 3) - .conditionalAttr(p => p.scene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5) - .ignorable(), + .conditionalAttr(p => globalScene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5), new Ability(Abilities.FORECAST, 3) .attr(UncopiableAbilityAbAttr) .attr(NoFusionAbilityAbAttr) @@ -5103,13 +6260,13 @@ export function initAbilities() { new Ability(Abilities.LIQUID_OOZE, 3) .attr(ReverseDrainAbAttr), new Ability(Abilities.OVERGROW, 3) - .attr(LowHpMoveTypePowerBoostAbAttr, Type.GRASS), + .attr(LowHpMoveTypePowerBoostAbAttr, PokemonType.GRASS), new Ability(Abilities.BLAZE, 3) - .attr(LowHpMoveTypePowerBoostAbAttr, Type.FIRE), + .attr(LowHpMoveTypePowerBoostAbAttr, PokemonType.FIRE), new Ability(Abilities.TORRENT, 3) - .attr(LowHpMoveTypePowerBoostAbAttr, Type.WATER), + .attr(LowHpMoveTypePowerBoostAbAttr, PokemonType.WATER), new Ability(Abilities.SWARM, 3) - .attr(LowHpMoveTypePowerBoostAbAttr, Type.BUG), + .attr(LowHpMoveTypePowerBoostAbAttr, PokemonType.BUG), new Ability(Abilities.ROCK_HEAD, 3) .attr(BlockRecoilDamageAttr), new Ability(Abilities.DROUGHT, 3) @@ -5145,7 +6302,7 @@ export function initAbilities() { .conditionalAttr(pokemon => !!pokemon.getTag(BattlerTagType.CONFUSED), StatMultiplierAbAttr, Stat.EVA, 2) .ignorable(), new Ability(Abilities.MOTOR_DRIVE, 4) - .attr(TypeImmunityStatStageChangeAbAttr, Type.ELECTRIC, Stat.SPD, 1) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.ELECTRIC, Stat.SPD, 1) .ignorable(), new Ability(Abilities.RIVALRY, 4) .attr(MovePowerBoostAbAttr, (user, target, move) => user?.gender !== Gender.GENDERLESS && target?.gender !== Gender.GENDERLESS && user?.gender === target?.gender, 1.25, true) @@ -5162,9 +6319,11 @@ export function initAbilities() { new Ability(Abilities.ANGER_POINT, 4) .attr(PostDefendCritStatStageChangeAbAttr, Stat.ATK, 6), new Ability(Abilities.UNBURDEN, 4) - .unimplemented(), + .attr(PostItemLostApplyBattlerTagAbAttr, BattlerTagType.UNBURDEN) + .bypassFaint() // Allows reviver seed to activate Unburden + .edgeCase(), // Should not restore Unburden boost if Pokemon loses then regains Unburden ability new Ability(Abilities.HEATPROOF, 4) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.FIRE, 0.5) .attr(ReduceBurnDamageAbAttr, 0.5) .ignorable(), new Ability(Abilities.SIMPLE, 4) @@ -5173,8 +6332,8 @@ export function initAbilities() { new Ability(Abilities.DRY_SKIN, 4) .attr(PostWeatherLapseDamageAbAttr, 2, WeatherType.SUNNY, WeatherType.HARSH_SUN) .attr(PostWeatherLapseHealAbAttr, 2, WeatherType.RAIN, WeatherType.HEAVY_RAIN) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 1.25) - .attr(TypeImmunityHealAbAttr, Type.WATER) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.FIRE, 1.25) + .attr(TypeImmunityHealAbAttr, PokemonType.WATER) .ignorable(), new Ability(Abilities.DOWNLOAD, 4) .attr(DownloadAbAttr), @@ -5198,8 +6357,8 @@ export function initAbilities() { .conditionalAttr(pokemon => pokemon.status ? pokemon.status.effect === StatusEffect.PARALYSIS : false, StatMultiplierAbAttr, Stat.SPD, 2) .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.SPD, 1.5), new Ability(Abilities.NORMALIZE, 4) - .attr(MoveTypeChangeAbAttr, Type.NORMAL, 1.2, (user, target, move) => { - return ![ Moves.HIDDEN_POWER, Moves.WEATHER_BALL, Moves.NATURAL_GIFT, Moves.JUDGMENT, Moves.TECHNO_BLAST ].includes(move.id); + .attr(MoveTypeChangeAbAttr, PokemonType.NORMAL, 1.2, (user, target, move) => { + return ![ Moves.MULTI_ATTACK, Moves.REVELATION_DANCE, Moves.TERRAIN_PULSE, Moves.HIDDEN_POWER, Moves.WEATHER_BALL, Moves.NATURAL_GIFT, Moves.JUDGMENT, Moves.TECHNO_BLAST ].includes(move.id); }), new Ability(Abilities.SNIPER, 4) .attr(MultCritAbAttr, 1.5), @@ -5235,7 +6394,7 @@ export function initAbilities() { new Ability(Abilities.FOREWARN, 4) .attr(ForewarnAbAttr), new Ability(Abilities.UNAWARE, 4) - .attr(IgnoreOpponentStatStagesAbAttr) + .attr(IgnoreOpponentStatStagesAbAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA ]) .ignorable(), new Ability(Abilities.TINTED_LENS, 4) .attr(DamageBoostAbAttr, 2, (user, target, move) => (target?.getMoveEffectiveness(user!, move) ?? 1) <= 0.5), @@ -5245,11 +6404,11 @@ export function initAbilities() { new Ability(Abilities.SLOW_START, 4) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.SLOW_START, 5), new Ability(Abilities.SCRAPPY, 4) - .attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ]) + .attr(IgnoreTypeImmunityAbAttr, PokemonType.GHOST, [ PokemonType.NORMAL, PokemonType.FIGHTING ]) .attr(IntimidateImmunityAbAttr), new Ability(Abilities.STORM_DRAIN, 4) - .attr(RedirectTypeMoveAbAttr, Type.WATER) - .attr(TypeImmunityStatStageChangeAbAttr, Type.WATER, Stat.SPATK, 1) + .attr(RedirectTypeMoveAbAttr, PokemonType.WATER) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.WATER, Stat.SPATK, 1) .ignorable(), new Ability(Abilities.ICE_BODY, 4) .attr(BlockWeatherDamageAttr, WeatherType.HAIL) @@ -5261,7 +6420,8 @@ export function initAbilities() { .attr(PostSummonWeatherChangeAbAttr, WeatherType.SNOW) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SNOW), new Ability(Abilities.HONEY_GATHER, 4) - .attr(MoneyAbAttr), + .attr(MoneyAbAttr) + .attr(UnsuppressableAbilityAbAttr), new Ability(Abilities.FRISK, 4) .attr(FriskAbAttr), new Ability(Abilities.RECKLESS, 4) @@ -5287,9 +6447,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(), @@ -5307,8 +6465,8 @@ export function initAbilities() { new Ability(Abilities.HEALER, 5) .conditionalAttr(pokemon => pokemon.getAlly() && Utils.randSeedInt(10) < 3, PostTurnResetStatusAbAttr, true), new Ability(Abilities.FRIEND_GUARD, 5) - .ignorable() - .unimplemented(), + .attr(AlliedFieldDamageReductionAbAttr, 0.75) + .ignorable(), new Ability(Abilities.WEAK_ARMOR, 5) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, Stat.DEF, -1) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, Stat.SPD, 2), @@ -5357,9 +6515,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 = globalScene.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) @@ -5376,26 +6535,29 @@ export function initAbilities() { new Ability(Abilities.MOXIE, 5) .attr(PostVictoryStatStageChangeAbAttr, Stat.ATK, 1), new Ability(Abilities.JUSTIFIED, 5) - .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.DARK && move.category !== MoveCategory.STATUS, Stat.ATK, 1), + .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === PokemonType.DARK && move.category !== MoveCategory.STATUS, Stat.ATK, 1), new Ability(Abilities.RATTLED, 5) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => { const moveType = user.getMoveType(move); return move.category !== MoveCategory.STATUS - && (moveType === Type.DARK || moveType === Type.BUG || moveType === Type.GHOST); + && (moveType === PokemonType.DARK || moveType === PokemonType.BUG || moveType === PokemonType.GHOST); }, Stat.SPD, 1) .attr(PostIntimidateStatStageChangeAbAttr, [ Stat.SPD ], 1), new Ability(Abilities.MAGIC_BOUNCE, 5) + .attr(ReflectStatusMoveAbAttr) .ignorable() - .unimplemented(), + // Interactions with stomping tantrum, instruct, encore, and probably other moves that + // rely on move history + .edgeCase(), new Ability(Abilities.SAP_SIPPER, 5) - .attr(TypeImmunityStatStageChangeAbAttr, Type.GRASS, Stat.ATK, 1) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.GRASS, Stat.ATK, 1) .ignorable(), new Ability(Abilities.PRANKSTER, 5) .attr(ChangeMovePriorityAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS, 1), new Ability(Abilities.SAND_FORCE, 5) - .attr(MoveTypePowerBoostAbAttr, Type.ROCK, 1.3) - .attr(MoveTypePowerBoostAbAttr, Type.GROUND, 1.3) - .attr(MoveTypePowerBoostAbAttr, Type.STEEL, 1.3) + .attr(MoveTypePowerBoostAbAttr, PokemonType.ROCK, 1.3) + .attr(MoveTypePowerBoostAbAttr, PokemonType.GROUND, 1.3) + .attr(MoveTypePowerBoostAbAttr, PokemonType.STEEL, 1.3) .attr(BlockWeatherDamageAttr, WeatherType.SANDSTORM) .condition(getWeatherCondition(WeatherType.SANDSTORM)), new Ability(Abilities.IRON_BARBS, 5) @@ -5420,7 +6582,8 @@ export function initAbilities() { .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTeravolt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.AROMA_VEIL, 6) - .attr(UserFieldBattlerTagImmunityAbAttr, [ BattlerTagType.INFATUATED, BattlerTagType.TAUNT, BattlerTagType.DISABLED, BattlerTagType.TORMENT, BattlerTagType.HEAL_BLOCK ]), + .attr(UserFieldBattlerTagImmunityAbAttr, [ BattlerTagType.INFATUATED, BattlerTagType.TAUNT, BattlerTagType.DISABLED, BattlerTagType.TORMENT, BattlerTagType.HEAL_BLOCK ]) + .ignorable(), new Ability(Abilities.FLOWER_VEIL, 6) .ignorable() .unimplemented(), @@ -5442,7 +6605,7 @@ export function initAbilities() { new Ability(Abilities.STRONG_JAW, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.BITING_MOVE), 1.5), new Ability(Abilities.REFRIGERATE, 6) - .attr(MoveTypeChangeAbAttr, Type.ICE, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), + .attr(MoveTypeChangeAbAttr, PokemonType.ICE, 1.2, (user, target, move) => move.type === PokemonType.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.SWEET_VEIL, 6) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.SLEEP) .attr(UserFieldBattlerTagImmunityAbAttr, BattlerTagType.DROWSY) @@ -5454,7 +6617,7 @@ export function initAbilities() { .attr(UnsuppressableAbilityAbAttr) .attr(NoFusionAbilityAbAttr), new Ability(Abilities.GALE_WINGS, 6) - .attr(ChangeMovePriorityAbAttr, (pokemon, move) => pokemon.isFullHp() && pokemon.getMoveType(move) === Type.FLYING, 1), + .attr(ChangeMovePriorityAbAttr, (pokemon, move) => pokemon.isFullHp() && pokemon.getMoveType(move) === PokemonType.FLYING, 1), new Ability(Abilities.MEGA_LAUNCHER, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.PULSE_MOVE), 1.5), new Ability(Abilities.GRASS_PELT, 6) @@ -5465,74 +6628,73 @@ export function initAbilities() { new Ability(Abilities.TOUGH_CLAWS, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 1.3), new Ability(Abilities.PIXILATE, 6) - .attr(MoveTypeChangeAbAttr, Type.FAIRY, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), + .attr(MoveTypeChangeAbAttr, PokemonType.FAIRY, 1.2, (user, target, move) => move.type === PokemonType.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.GOOEY, 6) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), Stat.SPD, -1, false), new Ability(Abilities.AERILATE, 6) - .attr(MoveTypeChangeAbAttr, Type.FLYING, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), + .attr(MoveTypeChangeAbAttr, PokemonType.FLYING, 1.2, (user, target, move) => move.type === PokemonType.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.PARENTAL_BOND, 6) .attr(AddSecondStrikeAbAttr, 0.25), new Ability(Abilities.DARK_AURA, 6) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonDarkAura", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) - .attr(FieldMoveTypePowerBoostAbAttr, Type.DARK, 4 / 3), + .attr(FieldMoveTypePowerBoostAbAttr, PokemonType.DARK, 4 / 3), new Ability(Abilities.FAIRY_AURA, 6) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonFairyAura", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) - .attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3), + .attr(FieldMoveTypePowerBoostAbAttr, PokemonType.FAIRY, 4 / 3), new Ability(Abilities.AURA_BREAK, 6) .ignorable() - .conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA)), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16) - .conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.FAIRY_AURA)), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16) - .conditionalAttr(pokemon => pokemon.scene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA) || p.hasAbility(Abilities.FAIRY_AURA)), + .conditionalAttr(pokemon => globalScene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA)), FieldMoveTypePowerBoostAbAttr, PokemonType.DARK, 9 / 16) + .conditionalAttr(pokemon => globalScene.getField(true).some(p => p.hasAbility(Abilities.FAIRY_AURA)), FieldMoveTypePowerBoostAbAttr, PokemonType.FAIRY, 9 / 16) + .conditionalAttr(pokemon => globalScene.getField(true).some(p => p.hasAbility(Abilities.DARK_AURA) || p.hasAbility(Abilities.FAIRY_AURA)), PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAuraBreak", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.PRIMORDIAL_SEA, 6) .attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) - .attr(PreSwitchOutClearWeatherAbAttr) - .attr(PostFaintClearWeatherAbAttr) + .attr(PreLeaveFieldClearWeatherAbAttr) .bypassFaint(), new Ability(Abilities.DESOLATE_LAND, 6) .attr(PostSummonWeatherChangeAbAttr, WeatherType.HARSH_SUN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HARSH_SUN) - .attr(PreSwitchOutClearWeatherAbAttr) - .attr(PostFaintClearWeatherAbAttr) + .attr(PreLeaveFieldClearWeatherAbAttr) .bypassFaint(), new Ability(Abilities.DELTA_STREAM, 6) .attr(PostSummonWeatherChangeAbAttr, WeatherType.STRONG_WINDS) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.STRONG_WINDS) - .attr(PreSwitchOutClearWeatherAbAttr) - .attr(PostFaintClearWeatherAbAttr) + .attr(PreLeaveFieldClearWeatherAbAttr) .bypassFaint(), new Ability(Abilities.STAMINA, 7) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, Stat.DEF, 1), new Ability(Abilities.WIMP_OUT, 7) - .condition(getSheerForceHitDisableAbCondition()) - .unimplemented(), + .attr(PostDamageForceSwitchAbAttr) + .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) - .condition(getSheerForceHitDisableAbCondition()) - .unimplemented(), + .attr(PostDamageForceSwitchAbAttr) + .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), + .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === PokemonType.WATER && move.category !== MoveCategory.STATUS, Stat.DEF, 2), new Ability(Abilities.MERCILESS, 7) .attr(ConditionalCritAbAttr, (user, target, move) => target?.status?.effect === StatusEffect.TOXIC || target?.status?.effect === StatusEffect.POISON), new Ability(Abilities.SHIELDS_DOWN, 7) .attr(PostBattleInitFormChangeAbAttr, () => 0) .attr(PostSummonFormChangeAbAttr, p => p.formIndex % 7 + (p.getHpRatio() <= 0.5 ? 7 : 0)) .attr(PostTurnFormChangeAbAttr, p => p.formIndex % 7 + (p.getHpRatio() <= 0.5 ? 7 : 0)) + .conditionalAttr(p => p.formIndex !== 7, StatusEffectImmunityAbAttr) + .conditionalAttr(p => p.formIndex !== 7, BattlerTagImmunityAbAttr, BattlerTagType.DROWSY) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr) .attr(NoFusionAbilityAbAttr) - .bypassFaint() - .partial(), // Meteor form should protect against status effects and yawn + .attr(NoTransformAbilityAbAttr) + .bypassFaint(), 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) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.FIRE, 0.5) + .attr(MoveTypePowerBoostAbAttr, PokemonType.WATER, 2) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) .ignorable(), new Ability(Abilities.STEELWORKER, 7) - .attr(MoveTypePowerBoostAbAttr, Type.STEEL), + .attr(MoveTypePowerBoostAbAttr, PokemonType.STEEL), new Ability(Abilities.BERSERK, 7) .attr(PostDefendHpGatedStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ Stat.SPATK ], 1) .condition(getSheerForceHitDisableAbCondition()), @@ -5542,11 +6704,11 @@ export function initAbilities() { new Ability(Abilities.LONG_REACH, 7) .attr(IgnoreContactAbAttr), new Ability(Abilities.LIQUID_VOICE, 7) - .attr(MoveTypeChangeAbAttr, Type.WATER, 1, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED)), + .attr(MoveTypeChangeAbAttr, PokemonType.WATER, 1, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED)), new Ability(Abilities.TRIAGE, 7) .attr(ChangeMovePriorityAbAttr, (pokemon, move) => move.hasFlag(MoveFlags.TRIAGE_MOVE), 3), new Ability(Abilities.GALVANIZE, 7) - .attr(MoveTypeChangeAbAttr, Type.ELECTRIC, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), + .attr(MoveTypeChangeAbAttr, PokemonType.ELECTRIC, 1.2, (user, target, move) => move.type === PokemonType.NORMAL && !move.hasAttr(VariableMoveTypeAttr)), new Ability(Abilities.SURGE_SURFER, 7) .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), StatMultiplierAbAttr, Stat.SPD, 2), new Ability(Abilities.SCHOOLING, 7) @@ -5594,8 +6756,8 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .bypassFaint(), new Ability(Abilities.CORROSION, 7) - .attr(IgnoreTypeStatusEffectImmunityAbAttr, [ StatusEffect.POISON, StatusEffect.TOXIC ], [ Type.STEEL, Type.POISON ]) - .edgeCase(), // Should interact correctly with magic coat/bounce (not yet implemented), fling with toxic orb (not implemented yet), and synchronize (not fully implemented yet) + .attr(IgnoreTypeStatusEffectImmunityAbAttr, [ StatusEffect.POISON, StatusEffect.TOXIC ], [ PokemonType.STEEL, PokemonType.POISON ]) + .edgeCase(), // Should poison itself with toxic orb. new Ability(Abilities.COMATOSE, 7) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) @@ -5614,7 +6776,7 @@ export function initAbilities() { .attr(AllyMoveCategoryPowerBoostAbAttr, [ MoveCategory.SPECIAL ], 1.3), new Ability(Abilities.FLUFFY, 7) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 0.5) - .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE, 2) + .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => user.getMoveType(move) === PokemonType.FIRE, 2) .ignorable(), new Ability(Abilities.DAZZLING, 7) .attr(FieldPriorityMoveImmunityAbAttr) @@ -5668,11 +6830,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 @@ -5685,8 +6845,8 @@ export function initAbilities() { new Ability(Abilities.PROPELLER_TAIL, 8) .attr(BlockRedirectAbAttr), new Ability(Abilities.MIRROR_ARMOR, 8) - .ignorable() - .unimplemented(), + .attr(ReflectStatStageChangeAbAttr) + .ignorable(), /** * Right now, the logic is attached to Surf and Dive moves. Ideally, the post-defend/hit should be an * ability attribute but the current implementation of move effects for BattlerTag does not support this- in the case @@ -5706,14 +6866,15 @@ export function initAbilities() { .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => { const moveType = user.getMoveType(move); return move.category !== MoveCategory.STATUS - && (moveType === Type.FIRE || moveType === Type.WATER); + && (moveType === PokemonType.FIRE || moveType === PokemonType.WATER); }, Stat.SPD, 6), new Ability(Abilities.PUNK_ROCK, 8) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED), 1.3) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.SOUND_BASED), 0.5) .ignorable(), new Ability(Abilities.SAND_SPIT, 8) - .attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS), + .attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS) + .bypassFaint(), new Ability(Abilities.ICE_SCALES, 8) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.category === MoveCategory.SPECIAL, 0.5) .ignorable(), @@ -5740,13 +6901,14 @@ export function initAbilities() { new Ability(Abilities.POWER_SPOT, 8) .attr(AllyMoveCategoryPowerBoostAbAttr, [ MoveCategory.SPECIAL, MoveCategory.PHYSICAL ], 1.3), new Ability(Abilities.MIMICRY, 8) - .unimplemented(), + .attr(TerrainEventTypeChangeAbAttr), new Ability(Abilities.SCREEN_CLEANER, 8) .attr(PostSummonRemoveArenaTagAbAttr, [ ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.REFLECT ]), new Ability(Abilities.STEELY_SPIRIT, 8) - .attr(UserFieldMoveTypePowerBoostAbAttr, Type.STEEL), + .attr(UserFieldMoveTypePowerBoostAbAttr, PokemonType.STEEL), new Ability(Abilities.PERISH_BODY, 8) - .attr(PostDefendPerishSongAbAttr, 4), + .attr(PostDefendPerishSongAbAttr, 4) + .bypassFaint(), new Ability(Abilities.WANDERING_SPIRIT, 8) .attr(PostDefendAbilitySwapAbAttr) .bypassFaint() @@ -5754,12 +6916,12 @@ export function initAbilities() { new Ability(Abilities.GORILLA_TACTICS, 8) .attr(GorillaTacticsAbAttr), new Ability(Abilities.NEUTRALIZING_GAS, 8) - .attr(SuppressFieldAbilitiesAbAttr) + .attr(PostSummonAddArenaTagAbAttr, true, ArenaTagType.NEUTRALIZING_GAS, 0) + .attr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonNeutralizingGas", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) - .partial(), // A bunch of weird interactions with other abilities being suppressed then unsuppressed + .bypassFaint(), new Ability(Abilities.PASTEL_VEIL, 8) .attr(PostSummonUserFieldRemoveStatusEffectAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .attr(UserFieldStatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) @@ -5771,7 +6933,7 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) .attr(NoFusionAbilityAbAttr) - .condition((pokemon) => !pokemon.isTerastallized()), + .condition((pokemon) => !pokemon.isTerastallized), new Ability(Abilities.QUICK_DRAW, 8) .attr(BypassSpeedChanceAbAttr, 30), new Ability(Abilities.UNSEEN_FIST, 8) @@ -5779,9 +6941,9 @@ export function initAbilities() { new Ability(Abilities.CURIOUS_MEDICINE, 8) .attr(PostSummonClearAllyStatStagesAbAttr), new Ability(Abilities.TRANSISTOR, 8) - .attr(MoveTypePowerBoostAbAttr, Type.ELECTRIC), + .attr(MoveTypePowerBoostAbAttr, PokemonType.ELECTRIC), new Ability(Abilities.DRAGONS_MAW, 8) - .attr(MoveTypePowerBoostAbAttr, Type.DRAGON), + .attr(MoveTypePowerBoostAbAttr, PokemonType.DRAGON), new Ability(Abilities.CHILLING_NEIGH, 8) .attr(PostVictoryStatStageChangeAbAttr, Stat.ATK, 1), new Ability(Abilities.GRIM_NEIGH, 8) @@ -5804,9 +6966,10 @@ export function initAbilities() { .attr(PostDefendAbilityGiveAbAttr, Abilities.LINGERING_AROMA) .bypassFaint(), new Ability(Abilities.SEED_SOWER, 9) - .attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY), + .attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY) + .bypassFaint(), new Ability(Abilities.THERMAL_EXCHANGE, 9) - .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE && move.category !== MoveCategory.STATUS, Stat.ATK, 1) + .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === PokemonType.FIRE && move.category !== MoveCategory.STATUS, Stat.ATK, 1) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) .ignorable(), new Ability(Abilities.ANGER_SHELL, 9) @@ -5815,10 +6978,10 @@ export function initAbilities() { .condition(getSheerForceHitDisableAbCondition()), new Ability(Abilities.PURIFYING_SALT, 9) .attr(StatusEffectImmunityAbAttr) - .attr(ReceivedTypeDamageMultiplierAbAttr, Type.GHOST, 0.5) + .attr(ReceivedTypeDamageMultiplierAbAttr, PokemonType.GHOST, 0.5) .ignorable(), new Ability(Abilities.WELL_BAKED_BODY, 9) - .attr(TypeImmunityStatStageChangeAbAttr, Type.FIRE, Stat.DEF, 2) + .attr(TypeImmunityStatStageChangeAbAttr, PokemonType.FIRE, Stat.DEF, 2) .ignorable(), new Ability(Abilities.WIND_RIDER, 9) .attr(MoveImmunityStatStageChangeAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.hasFlag(MoveFlags.WIND_MOVE) && move.category !== MoveCategory.STATUS, Stat.ATK, 1) @@ -5829,7 +6992,7 @@ export function initAbilities() { .attr(ForceSwitchOutImmunityAbAttr) .ignorable(), new Ability(Abilities.ROCKY_PAYLOAD, 9) - .attr(MoveTypePowerBoostAbAttr, Type.ROCK), + .attr(MoveTypePowerBoostAbAttr, PokemonType.ROCK), new Ability(Abilities.WIND_POWER, 9) .attr(PostDefendApplyBattlerTagAbAttr, (target, user, move) => move.hasFlag(MoveFlags.WIND_MOVE), BattlerTagType.CHARGED), new Ability(Abilities.ZERO_TO_HERO, 9) @@ -5842,9 +7005,11 @@ export function initAbilities() { .attr(PreSwitchOutFormChangeAbAttr, (pokemon) => !pokemon.isFainted() ? 1 : pokemon.formIndex) .bypassFaint(), new Ability(Abilities.COMMANDER, 9) + .attr(CommanderAbAttr) + .attr(DoubleBattleChanceAbAttr) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .unimplemented(), + .edgeCase(), // Encore, Frenzy, and other non-`TURN_END` tags don't lapse correctly on the commanding Pokemon. new Ability(Abilities.ELECTROMORPHOSIS, 9) .attr(PostDefendApplyBattlerTagAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, BattlerTagType.CHARGED), new Ability(Abilities.PROTOSYNTHESIS, 9) @@ -5852,35 +7017,30 @@ export function initAbilities() { .attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.PROTOSYNTHESIS, 0, WeatherType.SUNNY, WeatherType.HARSH_SUN) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.QUARK_DRIVE, 9) .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), PostSummonAddBattlerTagAbAttr, BattlerTagType.QUARK_DRIVE, 0, true) .attr(PostTerrainChangeAddBattlerTagAttr, BattlerTagType.QUARK_DRIVE, 0, TerrainType.ELECTRIC) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.GOOD_AS_GOLD, 9) - .attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.category === MoveCategory.STATUS) - .ignorable() - .partial(), // Lots of weird interactions with moves and abilities such as negating status moves that target the field + .attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.category === MoveCategory.STATUS && ![ MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES, MoveTarget.USER_SIDE ].includes(move.moveTarget)) + .ignorable(), new Ability(Abilities.VESSEL_OF_RUIN, 9) .attr(FieldMultiplyStatAbAttr, Stat.SPATK, 0.75) .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonVesselOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.SPATK)) })) .ignorable(), new Ability(Abilities.SWORD_OF_RUIN, 9) .attr(FieldMultiplyStatAbAttr, Stat.DEF, 0.75) - .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonSwordOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.DEF)) })) - .ignorable(), + .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonSwordOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.DEF)) })), new Ability(Abilities.TABLETS_OF_RUIN, 9) .attr(FieldMultiplyStatAbAttr, Stat.ATK, 0.75) .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonTabletsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.ATK)) })) .ignorable(), new Ability(Abilities.BEADS_OF_RUIN, 9) .attr(FieldMultiplyStatAbAttr, Stat.SPDEF, 0.75) - .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonBeadsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.SPDEF)) })) - .ignorable(), + .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonBeadsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.SPDEF)) })), new Ability(Abilities.ORICHALCUM_PULSE, 9) .attr(PostSummonWeatherChangeAbAttr, WeatherType.SUNNY) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SUNNY) @@ -5896,8 +7056,8 @@ export function initAbilities() { new Ability(Abilities.SHARPNESS, 9) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SLICING_MOVE), 1.5), new Ability(Abilities.SUPREME_OVERLORD, 9) - .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? user.scene.currentBattle.playerFaints : user.scene.currentBattle.enemyFaints, 5)) - .partial(), // Counter resets every wave + .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? globalScene.arena.playerFaints : globalScene.currentBattle.enemyFaints, 5)) + .partial(), // Should only boost once, on summon new Ability(Abilities.COSTAR, 9) .attr(PostSummonCopyAllyStatsAbAttr), new Ability(Abilities.TOXIC_DEBRIS, 9) @@ -5907,48 +7067,43 @@ export function initAbilities() { .attr(FieldPriorityMoveImmunityAbAttr) .ignorable(), new Ability(Abilities.EARTH_EATER, 9) - .attr(TypeImmunityHealAbAttr, Type.GROUND) + .attr(TypeImmunityHealAbAttr, PokemonType.GROUND) .ignorable(), new Ability(Abilities.MYCELIUM_MIGHT, 9) .attr(ChangeMovePriorityAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS, -0.2) .attr(PreventBypassSpeedChanceAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS) .attr(MoveAbilityBypassAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS), new Ability(Abilities.MINDS_EYE, 9) - .attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ]) + .attr(IgnoreTypeImmunityAbAttr, PokemonType.GHOST, [ PokemonType.NORMAL, PokemonType.FIGHTING ]) .attr(ProtectStatAbAttr, Stat.ACC) .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) .attr(PostAttackApplyStatusEffectAbAttr, false, 30, StatusEffect.TOXIC), new Ability(Abilities.EMBODY_ASPECT_TEAL, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPD ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.SPD ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.EMBODY_ASPECT_WELLSPRING, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPDEF ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.SPDEF ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.EMBODY_ASPECT_HEARTHFLAME, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.ATK ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.ATK ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.EMBODY_ASPECT_CORNERSTONE, 9) - .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.DEF ], 1, true) + .attr(PostTeraFormChangeStatChangeAbAttr, [ Stat.DEF ], 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // Ogerpon tera interactions + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.TERA_SHIFT, 9) .attr(PostSummonFormChangeAbAttr, p => p.getFormKey() ? 0 : 1) .attr(UncopiableAbilityAbAttr) @@ -5962,9 +7117,11 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.TERAFORM_ZERO, 9) + .attr(ClearWeatherAbAttr, [ WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN, WeatherType.STRONG_WINDS ]) + .attr(ClearTerrainAbAttr, [ TerrainType.MISTY, TerrainType.ELECTRIC, TerrainType.GRASSY, TerrainType.PSYCHIC ]) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .unimplemented(), + .condition(getOncePerBattleCondition(Abilities.TERAFORM_ZERO)), new Ability(Abilities.POISON_PUPPETEER, 9) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index d2c95b7ccdf..276cfa035b8 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1,13 +1,24 @@ -import { Arena } from "#app/field/arena"; -import BattleScene from "#app/battle-scene"; -import { Type } from "#app/data/type"; +import { globalScene } from "#app/global-scene"; +import type { Arena } from "#app/field/arena"; +import { PokemonType } from "#enums/pokemon-type"; import { BooleanHolder, NumberHolder, toDmgValue } from "#app/utils"; -import { MoveCategory, allMoves, MoveTarget, IncrementMovePriorityAttr, applyMoveAttrs } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveCategory } from "#enums/MoveCategory"; import { getPokemonNameWithAffix } from "#app/messages"; -import Pokemon, { HitResult, PokemonMove } from "#app/field/pokemon"; -import { StatusEffect } from "#app/data/status-effect"; -import { BattlerIndex } from "#app/battle"; -import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, InfiltratorAbAttr, ProtectStatAbAttr, applyAbAttrs } from "#app/data/ability"; +import type Pokemon from "#app/field/pokemon"; +import { HitResult, PokemonMove } from "#app/field/pokemon"; +import { StatusEffect } from "#enums/status-effect"; +import type { BattlerIndex } from "#app/battle"; +import { + BlockNonDirectDamageAbAttr, + InfiltratorAbAttr, + PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, + ProtectStatAbAttr, + applyAbAttrs, + applyOnGainAbAttrs, + applyOnLoseAbAttrs, +} from "#app/data/ability"; import { Stat } from "#enums/stat"; import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; import i18next from "i18next"; @@ -24,7 +35,7 @@ import { CommonAnimPhase } from "#app/phases/common-anim-phase"; export enum ArenaTagSide { BOTH, PLAYER, - ENEMY + ENEMY, } export abstract class ArenaTag { @@ -33,31 +44,34 @@ export abstract class ArenaTag { public turnCount: number, public sourceMove?: Moves, public sourceId?: number, - public side: ArenaTagSide = ArenaTagSide.BOTH + public side: ArenaTagSide = ArenaTagSide.BOTH, ) {} - apply(arena: Arena, simulated: boolean, ...args: unknown[]): boolean { + apply(_arena: Arena, _simulated: boolean, ..._args: unknown[]): boolean { return true; } - onAdd(arena: Arena, quiet: boolean = false): void { } + onAdd(_arena: Arena, _quiet = false): void {} - onRemove(arena: Arena, quiet: boolean = false): void { + onRemove(_arena: Arena, quiet = false): void { if (!quiet) { - arena.scene.queueMessage(i18next.t(`arenaTag:arenaOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, { moveName: this.getMoveName() })); + globalScene.queueMessage( + i18next.t( + `arenaTag:arenaOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + { moveName: this.getMoveName() }, + ), + ); } } - onOverlap(arena: Arena): void { } + onOverlap(_arena: Arena): void {} - lapse(arena: Arena): boolean { - return this.turnCount < 1 || !!(--this.turnCount); + lapse(_arena: Arena): boolean { + return this.turnCount < 1 || !!--this.turnCount; } getMoveName(): string | null { - return this.sourceMove - ? allMoves[this.sourceMove].name - : null; + return this.sourceMove ? allMoves[this.sourceMove].name : null; } /** @@ -65,7 +79,7 @@ export abstract class ArenaTag { * This is meant to be inherited from by any arena tag with custom attributes * @param {ArenaTag | any} source An arena tag */ - loadTag(source : ArenaTag | any) : void { + loadTag(source: ArenaTag | any): void { this.turnCount = source.turnCount; this.sourceMove = source.sourceMove; this.sourceId = source.sourceId; @@ -74,27 +88,25 @@ export abstract class ArenaTag { /** * Helper function that retrieves the source Pokemon - * @param scene medium to retrieve the source Pokemon * @returns The source {@linkcode Pokemon} or `null` if none is found */ - public getSourcePokemon(scene: BattleScene): Pokemon | null { - return this.sourceId ? scene.getPokemonById(this.sourceId) : null; + public getSourcePokemon(): Pokemon | null { + return this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; } /** * Helper function that retrieves the Pokemon affected - * @param scene - medium to retrieve the involved Pokemon * @returns list of PlayerPokemon or EnemyPokemon on the field */ - public getAffectedPokemon(scene: BattleScene): Pokemon[] { + public getAffectedPokemon(): Pokemon[] { switch (this.side) { case ArenaTagSide.PLAYER: - return scene.getPlayerField() ?? []; + return globalScene.getPlayerField() ?? []; case ArenaTagSide.ENEMY: - return scene.getEnemyField() ?? []; + return globalScene.getEnemyField() ?? []; case ArenaTagSide.BOTH: default: - return scene.getField(true) ?? []; + return globalScene.getField(true) ?? []; } } } @@ -108,14 +120,18 @@ export class MistTag extends ArenaTag { super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); if (this.sourceId) { - const source = arena.scene.getPokemonById(this.sourceId); + const source = globalScene.getPokemonById(this.sourceId); if (!quiet && source) { - arena.scene.queueMessage(i18next.t("arenaTag:mistOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + globalScene.queueMessage( + i18next.t("arenaTag:mistOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(source), + }), + ); } else if (!quiet) { console.warn("Failed to get source for MistTag onAdd"); } @@ -124,13 +140,14 @@ export class MistTag extends ArenaTag { /** * Cancels the lowering of stats - * @param arena the {@linkcode Arena} containing this effect + * @param _arena the {@linkcode Arena} containing this effect * @param simulated `true` if the effect should be applied quietly + * @param attacker the {@linkcode Pokemon} using a move into this effect. * @param cancelled a {@linkcode BooleanHolder} whose value is set to `true` * to flag the stat reduction as cancelled * @returns `true` if a stat reduction was cancelled; `false` otherwise */ - override apply(arena: Arena, simulated: boolean, attacker: Pokemon, cancelled: BooleanHolder): boolean { + override apply(_arena: Arena, simulated: boolean, attacker: Pokemon, cancelled: BooleanHolder): boolean { // `StatStageChangePhase` currently doesn't have a reference to the source of stat drops, // so this code currently has no effect on gameplay. if (attacker) { @@ -145,7 +162,7 @@ export class MistTag extends ArenaTag { cancelled.value = true; if (!simulated) { - arena.scene.queueMessage(i18next.t("arenaTag:mistApply")); + globalScene.queueMessage(i18next.t("arenaTag:mistApply")); } return true; @@ -169,7 +186,14 @@ export class WeakenMoveScreenTag extends ArenaTag { * @param side - The side (player or enemy) the tag affects. * @param weakenedCategories - The categories of moves that are weakened by this tag. */ - constructor(tagType: ArenaTagType, turnCount: number, sourceMove: Moves, sourceId: number, side: ArenaTagSide, weakenedCategories: MoveCategory[]) { + constructor( + tagType: ArenaTagType, + turnCount: number, + sourceMove: Moves, + sourceId: number, + side: ArenaTagSide, + weakenedCategories: MoveCategory[], + ) { super(tagType, turnCount, sourceMove, sourceId, side); this.weakenedCategories = weakenedCategories; @@ -178,21 +202,27 @@ export class WeakenMoveScreenTag extends ArenaTag { /** * Applies the weakening effect to the move. * - * @param arena the {@linkcode Arena} where the move is applied. - * @param simulated n/a + * @param _arena the {@linkcode Arena} where the move is applied. + * @param _simulated n/a * @param attacker the attacking {@linkcode Pokemon} * @param moveCategory the attacking move's {@linkcode MoveCategory}. * @param damageMultiplier A {@linkcode NumberHolder} containing the damage multiplier * @returns `true` if the attacking move was weakened; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, attacker: Pokemon, moveCategory: MoveCategory, damageMultiplier: NumberHolder): boolean { + override apply( + _arena: Arena, + _simulated: boolean, + attacker: Pokemon, + moveCategory: MoveCategory, + damageMultiplier: NumberHolder, + ): boolean { if (this.weakenedCategories.includes(moveCategory)) { const bypassed = new BooleanHolder(false); applyAbAttrs(InfiltratorAbAttr, attacker, null, false, bypassed); if (bypassed.value) { return false; } - damageMultiplier.value = arena.scene.currentBattle.double ? 2732 / 4096 : 0.5; + damageMultiplier.value = globalScene.currentBattle.double ? 2732 / 4096 : 0.5; return true; } return false; @@ -205,12 +235,16 @@ export class WeakenMoveScreenTag extends ArenaTag { */ class ReflectTag extends WeakenMoveScreenTag { constructor(turnCount: number, sourceId: number, side: ArenaTagSide) { - super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [ MoveCategory.PHYSICAL ]); + super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [MoveCategory.PHYSICAL]); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(_arena: Arena, quiet = false): void { if (!quiet) { - arena.scene.queueMessage(i18next.t(`arenaTag:reflectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:reflectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } } @@ -221,12 +255,16 @@ class ReflectTag extends WeakenMoveScreenTag { */ class LightScreenTag extends WeakenMoveScreenTag { constructor(turnCount: number, sourceId: number, side: ArenaTagSide) { - super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [ MoveCategory.SPECIAL ]); + super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [MoveCategory.SPECIAL]); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(_arena: Arena, quiet = false): void { if (!quiet) { - arena.scene.queueMessage(i18next.t(`arenaTag:lightScreenOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:lightScreenOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } } @@ -237,12 +275,19 @@ class LightScreenTag extends WeakenMoveScreenTag { */ class AuroraVeilTag extends WeakenMoveScreenTag { constructor(turnCount: number, sourceId: number, side: ArenaTagSide) { - super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [ MoveCategory.SPECIAL, MoveCategory.PHYSICAL ]); + super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [ + MoveCategory.SPECIAL, + MoveCategory.PHYSICAL, + ]); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(_arena: Arena, quiet = false): void { if (!quiet) { - arena.scene.queueMessage(i18next.t(`arenaTag:auroraVeilOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:auroraVeilOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } } @@ -259,19 +304,31 @@ export class ConditionalProtectTag extends ArenaTag { /** Does this apply to all moves, including those that ignore other forms of protection? */ protected ignoresBypass: boolean; - constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: number, side: ArenaTagSide, condition: ProtectConditionFunc, ignoresBypass: boolean = false) { + constructor( + tagType: ArenaTagType, + sourceMove: Moves, + sourceId: number, + side: ArenaTagSide, + condition: ProtectConditionFunc, + ignoresBypass = false, + ) { super(tagType, 1, sourceMove, sourceId, side); this.protectConditionFunc = condition; this.ignoresBypass = ignoresBypass; } - onAdd(arena: Arena): void { - arena.scene.queueMessage(i18next.t(`arenaTag:conditionalProtectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, { moveName: super.getMoveName() })); + onAdd(_arena: Arena): void { + globalScene.queueMessage( + i18next.t( + `arenaTag:conditionalProtectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + { moveName: super.getMoveName() }, + ), + ); } // Removes default message for effect removal - onRemove(arena: Arena): void { } + onRemove(_arena: Arena): void {} /** * Checks incoming moves against the condition function @@ -285,18 +342,28 @@ export class ConditionalProtectTag extends ArenaTag { * @param ignoresProtectBypass a {@linkcode BooleanHolder} used to flag if a protection effect supercedes effects that ignore protection * @returns `true` if this tag protected against the attack; `false` otherwise */ - override apply(arena: Arena, simulated: boolean, isProtected: BooleanHolder, attacker: Pokemon, defender: Pokemon, - moveId: Moves, ignoresProtectBypass: BooleanHolder): boolean { - - if ((this.side === ArenaTagSide.PLAYER) === defender.isPlayer() - && this.protectConditionFunc(arena, moveId)) { + override apply( + arena: Arena, + simulated: boolean, + isProtected: BooleanHolder, + attacker: Pokemon, + defender: Pokemon, + moveId: Moves, + ignoresProtectBypass: BooleanHolder, + ): boolean { + if ((this.side === ArenaTagSide.PLAYER) === defender.isPlayer() && this.protectConditionFunc(arena, moveId)) { if (!isProtected.value) { isProtected.value = true; if (!simulated) { attacker.stopMultiHit(defender); - new CommonBattleAnim(CommonAnim.PROTECT, defender).play(arena.scene); - arena.scene.queueMessage(i18next.t("arenaTag:conditionalProtectApply", { moveName: super.getMoveName(), pokemonNameWithAffix: getPokemonNameWithAffix(defender) })); + new CommonBattleAnim(CommonAnim.PROTECT, defender).play(); + globalScene.queueMessage( + i18next.t("arenaTag:conditionalProtectApply", { + moveName: super.getMoveName(), + pokemonNameWithAffix: getPokemonNameWithAffix(defender), + }), + ); } } @@ -310,22 +377,22 @@ export class ConditionalProtectTag extends ArenaTag { /** * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Guard_(move) Quick Guard's} * protection effect. - * @param arena {@linkcode Arena} The arena containing the protection effect + * @param _arena {@linkcode Arena} The arena containing the protection effect * @param moveId {@linkcode Moves} The move to check against this condition - * @returns `true` if the incoming move's priority is greater than 0. This includes - * moves with modified priorities from abilities (e.g. Prankster) + * @returns `true` if the incoming move's priority is greater than 0. + * This includes moves with modified priorities from abilities (e.g. Prankster) */ -const QuickGuardConditionFunc: ProtectConditionFunc = (arena, moveId) => { +const QuickGuardConditionFunc: ProtectConditionFunc = (_arena, moveId) => { const move = allMoves[moveId]; - const priority = new NumberHolder(move.priority); - const effectPhase = arena.scene.getCurrentPhase(); + const effectPhase = globalScene.getCurrentPhase(); if (effectPhase instanceof MoveEffectPhase) { - const attacker = effectPhase.getUserPokemon()!; - applyMoveAttrs(IncrementMovePriorityAttr, attacker, null, move, priority); - applyAbAttrs(ChangeMovePriorityAbAttr, attacker, null, false, move, priority); + const attacker = effectPhase.getUserPokemon(); + if (attacker) { + return move.getPriority(attacker) > 0; + } } - return priority.value > 0; + return move.priority > 0; }; /** @@ -341,11 +408,11 @@ class QuickGuardTag extends ConditionalProtectTag { /** * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Wide_Guard_(move) Wide Guard's} * protection effect. - * @param arena {@linkcode Arena} The arena containing the protection effect + * @param _arena {@linkcode Arena} The arena containing the protection effect * @param moveId {@linkcode Moves} The move to check against this condition * @returns `true` if the incoming move is multi-targeted (even if it's only used against one Pokemon). */ -const WideGuardConditionFunc: ProtectConditionFunc = (arena, moveId) : boolean => { +const WideGuardConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean => { const move = allMoves[moveId]; switch (move.moveTarget) { @@ -372,11 +439,11 @@ class WideGuardTag extends ConditionalProtectTag { /** * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Mat_Block_(move) Mat Block's} * protection effect. - * @param arena {@linkcode Arena} The arena containing the protection effect. + * @param _arena {@linkcode Arena} The arena containing the protection effect. * @param moveId {@linkcode Moves} The move to check against this condition. * @returns `true` if the incoming move is not a Status move. */ -const MatBlockConditionFunc: ProtectConditionFunc = (arena, moveId) : boolean => { +const MatBlockConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean => { const move = allMoves[moveId]; return move.category !== MoveCategory.STATUS; }; @@ -390,11 +457,15 @@ class MatBlockTag extends ConditionalProtectTag { super(ArenaTagType.MAT_BLOCK, Moves.MAT_BLOCK, sourceId, side, MatBlockConditionFunc); } - onAdd(arena: Arena) { + onAdd(_arena: Arena) { if (this.sourceId) { - const source = arena.scene.getPokemonById(this.sourceId); + const source = globalScene.getPokemonById(this.sourceId); if (source) { - arena.scene.queueMessage(i18next.t("arenaTag:matBlockOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + globalScene.queueMessage( + i18next.t("arenaTag:matBlockOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(source), + }), + ); } else { console.warn("Failed to get source for MatBlockTag onAdd"); } @@ -405,24 +476,26 @@ class MatBlockTag extends ConditionalProtectTag { /** * Condition function for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield's} * protection effect. - * @param arena {@linkcode Arena} The arena containing the protection effect + * @param _arena {@linkcode Arena} The arena containing the protection effect * @param moveId {@linkcode Moves} The move to check against this condition * @returns `true` if the incoming move is a Status move, is not a hazard, and does not target all * Pokemon or sides of the field. */ -const CraftyShieldConditionFunc: ProtectConditionFunc = (arena, moveId) => { +const CraftyShieldConditionFunc: ProtectConditionFunc = (_arena, moveId) => { const move = allMoves[moveId]; - return move.category === MoveCategory.STATUS - && move.moveTarget !== MoveTarget.ENEMY_SIDE - && move.moveTarget !== MoveTarget.BOTH_SIDES - && move.moveTarget !== MoveTarget.ALL; + return ( + move.category === MoveCategory.STATUS && + move.moveTarget !== MoveTarget.ENEMY_SIDE && + move.moveTarget !== MoveTarget.BOTH_SIDES && + move.moveTarget !== MoveTarget.ALL + ); }; /** * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield} * Condition: The incoming move is a Status move, is not a hazard, and does * not target all Pokemon or sides of the field. -*/ + */ class CraftyShieldTag extends ConditionalProtectTag { constructor(sourceId: number, side: ArenaTagSide) { super(ArenaTagType.CRAFTY_SHIELD, Moves.CRAFTY_SHIELD, sourceId, side, CraftyShieldConditionFunc, true); @@ -446,19 +519,23 @@ export class NoCritTag extends ArenaTag { } /** Queues a message upon adding this effect to the field */ - onAdd(arena: Arena): void { - arena.scene.queueMessage(i18next.t(`arenaTag:noCritOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : "Enemy"}`, { - moveName: this.getMoveName() - })); + onAdd(_arena: Arena): void { + globalScene.queueMessage( + i18next.t(`arenaTag:noCritOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : "Enemy"}`, { + moveName: this.getMoveName(), + }), + ); } /** Queues a message upon removing this effect from the field */ - onRemove(arena: Arena): void { - const source = arena.scene.getPokemonById(this.sourceId!); // TODO: is this bang correct? - arena.scene.queueMessage(i18next.t("arenaTag:noCritOnRemove", { - pokemonNameWithAffix: getPokemonNameWithAffix(source ?? undefined), - moveName: this.getMoveName() - })); + onRemove(_arena: Arena): void { + const source = globalScene.getPokemonById(this.sourceId!); // TODO: is this bang correct? + globalScene.queueMessage( + i18next.t("arenaTag:noCritOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(source ?? undefined), + moveName: this.getMoveName(), + }), + ); } } @@ -475,12 +552,14 @@ class WishTag extends ArenaTag { super(ArenaTagType.WISH, turnCount, Moves.WISH, sourceId, side); } - onAdd(arena: Arena): void { + onAdd(_arena: Arena): void { if (this.sourceId) { - const user = arena.scene.getPokemonById(this.sourceId); + const user = globalScene.getPokemonById(this.sourceId); if (user) { this.battlerIndex = user.getBattlerIndex(); - this.triggerMessage = i18next.t("arenaTag:wishTagOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user) }); + this.triggerMessage = i18next.t("arenaTag:wishTagOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(user), + }); this.healHp = toDmgValue(user.getMaxHp() / 2); } else { console.warn("Failed to get source for WishTag onAdd"); @@ -488,11 +567,11 @@ class WishTag extends ArenaTag { } } - onRemove(arena: Arena): void { - const target = arena.scene.getField()[this.battlerIndex]; + onRemove(_arena: Arena): void { + const target = globalScene.getField()[this.battlerIndex]; if (target?.isActive(true)) { - arena.scene.queueMessage(this.triggerMessage); - arena.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), this.healHp, null, true, false)); + globalScene.queueMessage(this.triggerMessage); + globalScene.unshiftPhase(new PokemonHealPhase(target.getBattlerIndex(), this.healHp, null, true, false)); } } } @@ -501,7 +580,7 @@ class WishTag extends ArenaTag { * Abstract class to implement weakened moves of a specific type. */ export class WeakenMoveTypeTag extends ArenaTag { - private weakenedType: Type; + private weakenedType: PokemonType; /** * Creates a new instance of the WeakenMoveTypeTag class. @@ -512,7 +591,7 @@ export class WeakenMoveTypeTag extends ArenaTag { * @param sourceMove - The move that created the tag. * @param sourceId - The ID of the source of the tag. */ - constructor(tagType: ArenaTagType, turnCount: number, type: Type, sourceMove: Moves, sourceId: number) { + constructor(tagType: ArenaTagType, turnCount: number, type: PokemonType, sourceMove: Moves, sourceId: number) { super(tagType, turnCount, sourceMove, sourceId); this.weakenedType = type; @@ -520,13 +599,13 @@ export class WeakenMoveTypeTag extends ArenaTag { /** * Reduces an attack's power by 0.33x if it matches this tag's weakened type. - * @param arena n/a - * @param simulated n/a - * @param type the attack's {@linkcode Type} + * @param _arena n/a + * @param _simulated n/a + * @param type the attack's {@linkcode PokemonType} * @param power a {@linkcode NumberHolder} containing the attack's power * @returns `true` if the attack's power was reduced; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, type: Type, power: NumberHolder): boolean { + override apply(_arena: Arena, _simulated: boolean, type: PokemonType, power: NumberHolder): boolean { if (type === this.weakenedType) { power.value *= 0.33; return true; @@ -541,15 +620,15 @@ export class WeakenMoveTypeTag extends ArenaTag { */ class MudSportTag extends WeakenMoveTypeTag { constructor(turnCount: number, sourceId: number) { - super(ArenaTagType.MUD_SPORT, turnCount, Type.ELECTRIC, Moves.MUD_SPORT, sourceId); + super(ArenaTagType.MUD_SPORT, turnCount, PokemonType.ELECTRIC, Moves.MUD_SPORT, sourceId); } - onAdd(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:mudSportOnAdd")); + onAdd(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:mudSportOnAdd")); } - onRemove(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:mudSportOnRemove")); + onRemove(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:mudSportOnRemove")); } } @@ -559,15 +638,15 @@ class MudSportTag extends WeakenMoveTypeTag { */ class WaterSportTag extends WeakenMoveTypeTag { constructor(turnCount: number, sourceId: number) { - super(ArenaTagType.WATER_SPORT, turnCount, Type.FIRE, Moves.WATER_SPORT, sourceId); + super(ArenaTagType.WATER_SPORT, turnCount, PokemonType.FIRE, Moves.WATER_SPORT, sourceId); } - onAdd(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:waterSportOnAdd")); + onAdd(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:waterSportOnAdd")); } - onRemove(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:waterSportOnRemove")); + onRemove(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:waterSportOnRemove")); } } @@ -582,22 +661,22 @@ export class IonDelugeTag extends ArenaTag { } /** Queues an on-add message */ - onAdd(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:plasmaFistsOnAdd")); + onAdd(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:plasmaFistsOnAdd")); } - onRemove(arena: Arena): void { } // Removes default on-remove message + onRemove(_arena: Arena): void {} // Removes default on-remove message /** * Converts Normal-type moves to Electric type - * @param arena n/a - * @param simulated n/a - * @param moveType a {@linkcode NumberHolder} containing a move's {@linkcode Type} + * @param _arena n/a + * @param _simulated n/a + * @param moveType a {@linkcode NumberHolder} containing a move's {@linkcode PokemonType} * @returns `true` if the given move type changed; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, moveType: NumberHolder): boolean { - if (moveType.value === Type.NORMAL) { - moveType.value = Type.ELECTRIC; + override apply(_arena: Arena, _simulated: boolean, moveType: NumberHolder): boolean { + if (moveType.value === PokemonType.NORMAL) { + moveType.value = PokemonType.ELECTRIC; return true; } return false; @@ -637,12 +716,12 @@ export class ArenaTrapTag extends ArenaTag { /** * Activates the hazard effect onto a Pokemon when it enters the field - * @param arena the {@linkcode Arena} containing this tag + * @param _arena the {@linkcode Arena} containing this tag * @param simulated if `true`, only checks if the hazard would activate. * @param pokemon the {@linkcode Pokemon} triggering this hazard * @returns `true` if this hazard affects the given Pokemon; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, pokemon: Pokemon): boolean { + override apply(_arena: Arena, simulated: boolean, pokemon: Pokemon): boolean { if ((this.side === ArenaTagSide.PLAYER) !== pokemon.isPlayer()) { return false; } @@ -650,12 +729,14 @@ export class ArenaTrapTag extends ArenaTag { return this.activateTrap(pokemon, simulated); } - activateTrap(pokemon: Pokemon, simulated: boolean): boolean { + activateTrap(_pokemon: Pokemon, _simulated: boolean): boolean { return false; } getMatchupScoreMultiplier(pokemon: Pokemon): number { - return pokemon.isGrounded() ? 1 : Phaser.Math.Linear(0, 1 / Math.pow(2, this.layers), Math.min(pokemon.getHpRatio(), 0.5) * 2); + return pokemon.isGrounded() + ? 1 + : Phaser.Math.Linear(0, 1 / Math.pow(2, this.layers), Math.min(pokemon.getHpRatio(), 0.5) * 2); } loadTag(source: any): void { @@ -675,12 +756,17 @@ class SpikesTag extends ArenaTrapTag { super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); - const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (!quiet && source) { - arena.scene.queueMessage(i18next.t("arenaTag:spikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); + globalScene.queueMessage( + i18next.t("arenaTag:spikesOnAdd", { + moveName: this.getMoveName(), + opponentDesc: source.getOpponentDescriptor(), + }), + ); } } @@ -697,7 +783,11 @@ class SpikesTag extends ArenaTrapTag { const damageHpRatio = 1 / (10 - 2 * this.layers); const damage = toDmgValue(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(i18next.t("arenaTag:spikesActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("arenaTag:spikesActivateTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -724,12 +814,17 @@ class ToxicSpikesTag extends ArenaTrapTag { this.neutralized = false; } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); - const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (!quiet && source) { - arena.scene.queueMessage(i18next.t("arenaTag:toxicSpikesOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); + globalScene.queueMessage( + i18next.t("arenaTag:toxicSpikesOnAdd", { + moveName: this.getMoveName(), + opponentDesc: source.getOpponentDescriptor(), + }), + ); } } @@ -744,15 +839,22 @@ class ToxicSpikesTag extends ArenaTrapTag { if (simulated) { return true; } - if (pokemon.isOfType(Type.POISON)) { + if (pokemon.isOfType(PokemonType.POISON)) { this.neutralized = true; - if (pokemon.scene.arena.removeTag(this.tagType)) { - pokemon.scene.queueMessage(i18next.t("arenaTag:toxicSpikesActivateTrapPoison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() })); + if (globalScene.arena.removeTag(this.tagType)) { + globalScene.queueMessage( + i18next.t("arenaTag:toxicSpikesActivateTrapPoison", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName(), + }), + ); return true; } } else if (!pokemon.status) { const toxic = this.layers > 1; - if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, this.getMoveName())) { + if ( + pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, this.getMoveName()) + ) { return true; } } @@ -765,7 +867,7 @@ class ToxicSpikesTag extends ArenaTrapTag { if (pokemon.isGrounded() || !pokemon.canSetStatus(StatusEffect.POISON, true)) { return 1; } - if (pokemon.isOfType(Type.POISON)) { + if (pokemon.isOfType(PokemonType.POISON)) { return 1.25; } return super.getMatchupScoreMultiplier(pokemon); @@ -777,26 +879,35 @@ class ToxicSpikesTag extends ArenaTrapTag { * Delays the attack's effect by a set amount of turns, usually 3 (including the turn the move is used), * and deals damage after the turn count is reached. */ -class DelayedAttackTag extends ArenaTag { +export class DelayedAttackTag extends ArenaTag { public targetIndex: BattlerIndex; - constructor(tagType: ArenaTagType, sourceMove: Moves | undefined, sourceId: number, targetIndex: BattlerIndex) { - super(tagType, 3, sourceMove, sourceId); + constructor( + tagType: ArenaTagType, + sourceMove: Moves | undefined, + sourceId: number, + targetIndex: BattlerIndex, + side: ArenaTagSide = ArenaTagSide.BOTH, + ) { + super(tagType, 3, sourceMove, sourceId, side); this.targetIndex = targetIndex; + this.side = side; } lapse(arena: Arena): boolean { const ret = super.lapse(arena); if (!ret) { - arena.scene.unshiftPhase(new MoveEffectPhase(arena.scene, this.sourceId!, [ this.targetIndex ], new PokemonMove(this.sourceMove!, 0, 0, true))); // TODO: are those bangs correct? + globalScene.unshiftPhase( + new MoveEffectPhase(this.sourceId!, [this.targetIndex], new PokemonMove(this.sourceMove!, 0, 0, true)), + ); // TODO: are those bangs correct? } return ret; } - onRemove(arena: Arena): void { } + onRemove(_arena: Arena): void {} } /** @@ -809,19 +920,23 @@ class StealthRockTag extends ArenaTrapTag { super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); - const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (!quiet && source) { - arena.scene.queueMessage(i18next.t("arenaTag:stealthRockOnAdd", { opponentDesc: source.getOpponentDescriptor() })); + globalScene.queueMessage( + i18next.t("arenaTag:stealthRockOnAdd", { + opponentDesc: source.getOpponentDescriptor(), + }), + ); } } getDamageHpRatio(pokemon: Pokemon): number { - const effectiveness = pokemon.getAttackTypeEffectiveness(Type.ROCK, undefined, true); + const effectiveness = pokemon.getAttackTypeEffectiveness(PokemonType.ROCK, undefined, true); - let damageHpRatio: number = 0; + let damageHpRatio = 0; switch (effectiveness) { case 0: @@ -849,7 +964,7 @@ class StealthRockTag extends ArenaTrapTag { override activateTrap(pokemon: Pokemon, simulated: boolean): boolean { const cancelled = new BooleanHolder(false); - applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); + applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (cancelled.value) { return false; @@ -862,7 +977,11 @@ class StealthRockTag extends ArenaTrapTag { return true; } const damage = toDmgValue(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(i18next.t("arenaTag:stealthRockActivateTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("arenaTag:stealthRockActivateTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -889,11 +1008,16 @@ class StickyWebTag extends ArenaTrapTag { super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(arena: Arena, quiet = false): void { super.onAdd(arena); - const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (!quiet && source) { - arena.scene.queueMessage(i18next.t("arenaTag:stickyWebOnAdd", { moveName: this.getMoveName(), opponentDesc: source.getOpponentDescriptor() })); + globalScene.queueMessage( + i18next.t("arenaTag:stickyWebOnAdd", { + moveName: this.getMoveName(), + opponentDesc: source.getOpponentDescriptor(), + }), + ); } } @@ -907,16 +1031,32 @@ class StickyWebTag extends ArenaTrapTag { } if (!cancelled.value) { - pokemon.scene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() })); + globalScene.queueMessage( + i18next.t("arenaTag:stickyWebActivateTrap", { + pokemonName: pokemon.getNameToRender(), + }), + ); const stages = new NumberHolder(-1); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.SPD ], stages.value)); + globalScene.unshiftPhase( + new StatStageChangePhase( + pokemon.getBattlerIndex(), + false, + [Stat.SPD], + stages.value, + true, + false, + true, + null, + false, + true, + ), + ); return true; } } return false; } - } /** @@ -931,26 +1071,30 @@ export class TrickRoomTag extends ArenaTag { /** * Reverses Speed-based turn order for all Pokemon on the field - * @param arena n/a - * @param simulated n/a + * @param _arena n/a + * @param _simulated n/a * @param speedReversed a {@linkcode BooleanHolder} used to flag if Speed-based * turn order should be reversed. * @returns `true` if turn order is successfully reversed; `false` otherwise */ - override apply(arena: Arena, simulated: boolean, speedReversed: BooleanHolder): boolean { + override apply(_arena: Arena, _simulated: boolean, speedReversed: BooleanHolder): boolean { speedReversed.value = !speedReversed.value; return true; } - onAdd(arena: Arena): void { - const source = this.sourceId ? arena.scene.getPokemonById(this.sourceId) : null; + onAdd(_arena: Arena): void { + const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (source) { - arena.scene.queueMessage(i18next.t("arenaTag:trickRoomOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + globalScene.queueMessage( + i18next.t("arenaTag:trickRoomOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(source), + }), + ); } } - onRemove(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:trickRoomOnRemove")); + onRemove(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:trickRoomOnRemove")); } } @@ -964,9 +1108,9 @@ export class GravityTag extends ArenaTag { super(ArenaTagType.GRAVITY, turnCount, Moves.GRAVITY); } - onAdd(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:gravityOnAdd")); - arena.scene.getField(true).forEach((pokemon) => { + onAdd(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:gravityOnAdd")); + globalScene.getField(true).forEach(pokemon => { if (pokemon !== null) { pokemon.removeTag(BattlerTagType.FLOATING); pokemon.removeTag(BattlerTagType.TELEKINESIS); @@ -977,8 +1121,8 @@ export class GravityTag extends ArenaTag { }); } - onRemove(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:gravityOnRemove")); + onRemove(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:gravityOnRemove")); } } @@ -992,31 +1136,44 @@ class TailwindTag extends ArenaTag { super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side); } - onAdd(arena: Arena, quiet: boolean = false): void { + onAdd(_arena: Arena, quiet = false): void { if (!quiet) { - arena.scene.queueMessage(i18next.t(`arenaTag:tailwindOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:tailwindOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } - const source = arena.scene.getPokemonById(this.sourceId!); //TODO: this bang is questionable! - const party = (source?.isPlayer() ? source.scene.getPlayerField() : source?.scene.getEnemyField()) ?? []; + const source = globalScene.getPokemonById(this.sourceId!); //TODO: this bang is questionable! + const party = (source?.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField()) ?? []; for (const pokemon of party) { // Apply the CHARGED tag to party members with the WIND_POWER ability if (pokemon.hasAbility(Abilities.WIND_POWER) && !pokemon.getTag(BattlerTagType.CHARGED)) { pokemon.addTag(BattlerTagType.CHARGED); - pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: this.getMoveName() })); + globalScene.queueMessage( + i18next.t("abilityTriggers:windPowerCharged", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName(), + }), + ); } // Raise attack by one stage if party member has WIND_RIDER ability if (pokemon.hasAbility(Abilities.WIND_RIDER)) { - pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.getBattlerIndex())); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.ATK ], 1, true)); + globalScene.unshiftPhase(new ShowAbilityPhase(pokemon.getBattlerIndex())); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.ATK], 1, true)); } } } - onRemove(arena: Arena, quiet: boolean = false): void { + onRemove(_arena: Arena, quiet = false): void { if (!quiet) { - arena.scene.queueMessage(i18next.t(`arenaTag:tailwindOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:tailwindOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } } @@ -1030,12 +1187,12 @@ class HappyHourTag extends ArenaTag { super(ArenaTagType.HAPPY_HOUR, turnCount, Moves.HAPPY_HOUR, sourceId, side); } - onAdd(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:happyHourOnAdd")); + onAdd(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:happyHourOnAdd")); } - onRemove(arena: Arena): void { - arena.scene.queueMessage(i18next.t("arenaTag:happyHourOnRemove")); + onRemove(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:happyHourOnRemove")); } } @@ -1044,12 +1201,20 @@ class SafeguardTag extends ArenaTag { super(ArenaTagType.SAFEGUARD, turnCount, Moves.SAFEGUARD, sourceId, side); } - onAdd(arena: Arena): void { - arena.scene.queueMessage(i18next.t(`arenaTag:safeguardOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + onAdd(_arena: Arena): void { + globalScene.queueMessage( + i18next.t( + `arenaTag:safeguardOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } - onRemove(arena: Arena): void { - arena.scene.queueMessage(i18next.t(`arenaTag:safeguardOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + onRemove(_arena: Arena): void { + globalScene.queueMessage( + i18next.t( + `arenaTag:safeguardOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } } @@ -1072,16 +1237,20 @@ class ImprisonTag extends ArenaTrapTag { * This function applies the effects of Imprison to the opposing Pokemon already present on the field. * @param arena */ - override onAdd({ scene }: Arena) { - const source = this.getSourcePokemon(scene); + override onAdd() { + const source = this.getSourcePokemon(); if (source) { - const party = this.getAffectedPokemon(scene); - party?.forEach((p: Pokemon ) => { + const party = this.getAffectedPokemon(); + party?.forEach((p: Pokemon) => { if (p.isAllowedInBattle()) { p.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId); } }); - scene.queueMessage(i18next.t("battlerTags:imprisonOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(source) })); + globalScene.queueMessage( + i18next.t("battlerTags:imprisonOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(source), + }), + ); } } @@ -1090,8 +1259,8 @@ class ImprisonTag extends ArenaTrapTag { * @param _arena * @returns `true` if the source of the tag is still active on the field | `false` if not */ - override lapse({ scene }: Arena): boolean { - const source = this.getSourcePokemon(scene); + override lapse(): boolean { + const source = this.getSourcePokemon(); return source ? source.isActive(true) : false; } @@ -1101,8 +1270,8 @@ class ImprisonTag extends ArenaTrapTag { * @returns `true` */ override activateTrap(pokemon: Pokemon): boolean { - const source = this.getSourcePokemon(pokemon.scene); - if (source && source.isActive(true) && pokemon.isAllowedInBattle()) { + const source = this.getSourcePokemon(); + if (source?.isActive(true) && pokemon.isAllowedInBattle()) { pokemon.addTag(BattlerTagType.IMPRISON, 1, Moves.IMPRISON, this.sourceId); } return true; @@ -1112,8 +1281,8 @@ class ImprisonTag extends ArenaTrapTag { * When the arena tag is removed, it also attempts to remove any related Battler Tags if they haven't already been removed from the affected Pokemon * @param arena */ - override onRemove({ scene }: Arena): void { - const party = this.getAffectedPokemon(scene); + override onRemove(): void { + const party = this.getAffectedPokemon(); party?.forEach((p: Pokemon) => { p.removeTag(BattlerTagType.IMPRISON); }); @@ -1132,23 +1301,34 @@ class FireGrassPledgeTag extends ArenaTag { super(ArenaTagType.FIRE_GRASS_PLEDGE, 4, Moves.FIRE_PLEDGE, sourceId, side); } - override onAdd(arena: Arena): void { + override onAdd(_arena: Arena): void { // "A sea of fire enveloped your/the opposing team!" - arena.scene.queueMessage(i18next.t(`arenaTag:fireGrassPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:fireGrassPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } override lapse(arena: Arena): boolean { - const field: Pokemon[] = (this.side === ArenaTagSide.PLAYER) - ? arena.scene.getPlayerField() - : arena.scene.getEnemyField(); + const field: Pokemon[] = + this.side === ArenaTagSide.PLAYER ? globalScene.getPlayerField() : globalScene.getEnemyField(); - field.filter(pokemon => !pokemon.isOfType(Type.FIRE)).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 - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.MAGMA_STORM)); - pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); - }); + field + .filter(pokemon => !pokemon.isOfType(PokemonType.FIRE) && !pokemon.switchOutStatus) + .forEach(pokemon => { + // "{pokemonNameWithAffix} was hurt by the sea of fire!" + globalScene.queueMessage( + i18next.t("arenaTag:fireGrassPledgeLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + // TODO: Replace this with a proper animation + globalScene.unshiftPhase( + new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.MAGMA_STORM), + ); + pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); + }); return super.lapse(arena); } @@ -1166,20 +1346,24 @@ class WaterFirePledgeTag extends ArenaTag { super(ArenaTagType.WATER_FIRE_PLEDGE, 4, Moves.WATER_PLEDGE, sourceId, side); } - override onAdd(arena: Arena): void { + override onAdd(_arena: Arena): void { // "A rainbow appeared in the sky on your/the opposing team's side!" - arena.scene.queueMessage(i18next.t(`arenaTag:waterFirePledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:waterFirePledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); } /** * Doubles the chance for the given move's secondary effect(s) to trigger - * @param arena the {@linkcode Arena} containing this tag - * @param simulated n/a + * @param _arena the {@linkcode Arena} containing this tag + * @param _simulated n/a * @param moveChance a {@linkcode NumberHolder} containing * the move's current effect chance * @returns `true` if the move's effect chance was doubled (currently always `true`) */ - override apply(arena: Arena, simulated: boolean, moveChance: NumberHolder): boolean { + override apply(_arena: Arena, _simulated: boolean, moveChance: NumberHolder): boolean { moveChance.value *= 2; return true; } @@ -1196,14 +1380,118 @@ class GrassWaterPledgeTag extends ArenaTag { super(ArenaTagType.GRASS_WATER_PLEDGE, 4, Moves.GRASS_PLEDGE, sourceId, side); } - override onAdd(arena: Arena): void { + override onAdd(_arena: Arena): void { // "A swamp enveloped your/the opposing team!" - arena.scene.queueMessage(i18next.t(`arenaTag:grassWaterPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`)); + globalScene.queueMessage( + i18next.t( + `arenaTag:grassWaterPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`, + ), + ); + } +} + +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Fairy_Lock_(move) Fairy Lock}. + * Fairy Lock prevents all Pokémon (except Ghost types) on the field from switching out or + * fleeing during their next turn. + * If a Pokémon that's on the field when Fairy Lock is used goes on to faint later in the same turn, + * the Pokémon that replaces it will still be unable to switch out in the following turn. + */ +export class FairyLockTag extends ArenaTag { + constructor(turnCount: number, sourceId: number) { + super(ArenaTagType.FAIRY_LOCK, turnCount, Moves.FAIRY_LOCK, sourceId); + } + + onAdd(_arena: Arena): void { + globalScene.queueMessage(i18next.t("arenaTag:fairyLockOnAdd")); + } +} + +/** + * Arena tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Neutralizing_Gas_(Ability) Neutralizing Gas} + * + * Keeps track of the number of pokemon on the field with Neutralizing Gas - If it drops to zero, the effect is ended and abilities are reactivated + * + * Additionally ends onLose abilities when it is activated + */ +export class SuppressAbilitiesTag extends ArenaTag { + private sourceCount: number; + private beingRemoved: boolean; + + constructor(sourceId: number) { + super(ArenaTagType.NEUTRALIZING_GAS, 0, undefined, sourceId); + this.sourceCount = 1; + this.beingRemoved = false; + } + + public override onAdd(_arena: Arena): void { + const pokemon = this.getSourcePokemon(); + if (pokemon) { + globalScene.queueMessage( + i18next.t("arenaTag:neutralizingGasOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + + for (const fieldPokemon of globalScene.getField(true)) { + if (fieldPokemon && fieldPokemon.id !== pokemon.id) { + [true, false].forEach(passive => applyOnLoseAbAttrs(fieldPokemon, passive)); + } + } + } + } + + public override onOverlap(_arena: Arena): void { + this.sourceCount++; + } + + public onSourceLeave(arena: Arena): void { + this.sourceCount--; + if (this.sourceCount <= 0) { + arena.removeTag(ArenaTagType.NEUTRALIZING_GAS); + } else if (this.sourceCount === 1) { + // With 1 source left, that pokemon's other abilities should reactivate + // This may be confusing for players but would be the most accurate gameplay-wise + // Could have a custom message that plays when a specific pokemon's NG ends? This entire thing exists due to passives after all + const setter = globalScene + .getField() + .filter(p => p?.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false))[0]; + applyOnGainAbAttrs(setter, setter.getAbility().hasAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr)); + } + } + + public override onRemove(_arena: Arena, quiet = false) { + this.beingRemoved = true; + if (!quiet) { + globalScene.queueMessage(i18next.t("arenaTag:neutralizingGasOnRemove")); + } + + for (const pokemon of globalScene.getField(true)) { + // There is only one pokemon with this attr on the field on removal, so its abilities are already active + if (pokemon && !pokemon.hasAbilityWithAttr(PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, false)) { + [true, false].forEach(passive => applyOnGainAbAttrs(pokemon, passive)); + } + } + } + + public shouldApplyToSelf(): boolean { + return this.sourceCount > 1; + } + + public isBeingRemoved() { + return this.beingRemoved; } } // TODO: swap `sourceMove` and `sourceId` and make `sourceMove` an optional parameter -export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null { +export function getArenaTag( + tagType: ArenaTagType, + turnCount: number, + sourceMove: Moves | undefined, + sourceId: number, + targetIndex?: BattlerIndex, + side: ArenaTagSide = ArenaTagSide.BOTH, +): ArenaTag | null { switch (tagType) { case ArenaTagType.MIST: return new MistTag(turnCount, sourceId, side); @@ -1229,7 +1517,7 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove return new ToxicSpikesTag(sourceId, side); case ArenaTagType.FUTURE_SIGHT: case ArenaTagType.DOOM_DESIRE: - return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex!); // TODO:questionable bang + return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex!, side); // TODO:questionable bang case ArenaTagType.WISH: return new WishTag(turnCount, sourceId, side); case ArenaTagType.STEALTH_ROCK: @@ -1260,6 +1548,10 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove return new WaterFirePledgeTag(sourceId, side); case ArenaTagType.GRASS_WATER_PLEDGE: return new GrassWaterPledgeTag(sourceId, side); + case ArenaTagType.FAIRY_LOCK: + return new FairyLockTag(turnCount, sourceId); + case ArenaTagType.NEUTRALIZING_GAS: + return new SuppressAbilitiesTag(sourceId); default: return null; } @@ -1271,9 +1563,15 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove * @return {ArenaTag} The valid arena tag */ export function loadArenaTag(source: ArenaTag | any): ArenaTag { - const tag = getArenaTag(source.tagType, source.turnCount, source.sourceMove, source.sourceId, source.targetIndex, source.side) - ?? new NoneTag(); + const tag = + getArenaTag( + source.tagType, + source.turnCount, + source.sourceMove, + source.sourceId, + source.targetIndex, + source.side, + ) ?? new NoneTag(); tag.loadTag(source); return tag; } - diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index 2ce693c360b..71a48162e57 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -1,6 +1,7 @@ -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import * as Utils from "#app/utils"; -import { pokemonEvolutions, SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; +import type { SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; +import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import i18next from "i18next"; import { Biome } from "#enums/biome"; import { Species } from "#enums/species"; @@ -25,11 +26,11 @@ export function getBiomeName(biome: Biome | -1) { } interface BiomeLinks { - [key: integer]: Biome | (Biome | [Biome, integer])[] + [key: number]: Biome | (Biome | [Biome, number])[] } interface BiomeDepths { - [key: integer]: [integer, integer] + [key: number]: [number, number] } export const biomeLinks: BiomeLinks = { @@ -86,27 +87,39 @@ export enum BiomePoolTier { export const uncatchableSpecies: Species[] = []; export interface SpeciesTree { - [key: integer]: Species[] + [key: number]: Species[] } export interface PokemonPools { - [key: integer]: (Species | SpeciesTree)[] + [key: number]: (Species | SpeciesTree)[] } export interface BiomeTierPokemonPools { - [key: integer]: PokemonPools + [key: number]: PokemonPools } export interface BiomePokemonPools { - [key: integer]: BiomeTierPokemonPools + [key: number]: BiomeTierPokemonPools } +export interface BiomeTierTod { + biome: Biome, + tier: BiomePoolTier, + tod: TimeOfDay[] +} + +export interface CatchableSpecies{ + [key: number]: BiomeTierTod[] +} + +export const catchableSpecies: CatchableSpecies = {}; + export interface BiomeTierTrainerPools { - [key: integer]: TrainerType[] + [key: number]: TrainerType[] } export interface BiomeTrainerPools { - [key: integer]: BiomeTierTrainerPools + [key: number]: BiomeTierTrainerPools } export const biomePokemonPools: BiomePokemonPools = { @@ -2009,450 +2022,451 @@ export const biomeTrainerPools: BiomeTrainerPools = { } }; +// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: init methods are expected to have many lines. export function initBiomes() { const pokemonBiomes = [ - [ Species.BULBASAUR, Type.GRASS, Type.POISON, [ + [ Species.BULBASAUR, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.RARE ] ] ], - [ Species.IVYSAUR, Type.GRASS, Type.POISON, [ + [ Species.IVYSAUR, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.RARE ] ] ], - [ Species.VENUSAUR, Type.GRASS, Type.POISON, [ + [ Species.VENUSAUR, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.RARE ], [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CHARMANDER, Type.FIRE, -1, [ + [ Species.CHARMANDER, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.CHARMELEON, Type.FIRE, -1, [ + [ Species.CHARMELEON, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.CHARIZARD, Type.FIRE, Type.FLYING, [ + [ Species.CHARIZARD, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SQUIRTLE, Type.WATER, -1, [ + [ Species.SQUIRTLE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.WARTORTLE, Type.WATER, -1, [ + [ Species.WARTORTLE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.BLASTOISE, Type.WATER, -1, [ + [ Species.BLASTOISE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CATERPIE, Type.BUG, -1, [ + [ Species.CATERPIE, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.METAPOD, Type.BUG, -1, [ + [ Species.METAPOD, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BUTTERFREE, Type.BUG, Type.FLYING, [ + [ Species.BUTTERFREE, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WEEDLE, Type.BUG, Type.POISON, [ + [ Species.WEEDLE, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KAKUNA, Type.BUG, Type.POISON, [ + [ Species.KAKUNA, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BEEDRILL, Type.BUG, Type.POISON, [ + [ Species.BEEDRILL, PokemonType.BUG, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PIDGEY, Type.NORMAL, Type.FLYING, [ + [ Species.PIDGEY, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] ] ], - [ Species.PIDGEOTTO, Type.NORMAL, Type.FLYING, [ + [ Species.PIDGEOTTO, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] ] ], - [ Species.PIDGEOT, Type.NORMAL, Type.FLYING, [ + [ Species.PIDGEOT, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.RATTATA, Type.NORMAL, -1, [ + [ Species.RATTATA, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.COMMON ] ] ], - [ Species.RATICATE, Type.NORMAL, -1, [ + [ Species.RATICATE, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.COMMON ] ] ], - [ Species.SPEAROW, Type.NORMAL, Type.FLYING, [ + [ Species.SPEAROW, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] ] ], - [ Species.FEAROW, Type.NORMAL, Type.FLYING, [ + [ Species.FEAROW, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.EKANS, Type.POISON, -1, [ + [ Species.EKANS, PokemonType.POISON, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ARBOK, Type.POISON, -1, [ + [ Species.ARBOK, PokemonType.POISON, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PIKACHU, Type.ELECTRIC, -1, [ + [ Species.PIKACHU, PokemonType.ELECTRIC, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.RAICHU, Type.ELECTRIC, -1, [ + [ Species.RAICHU, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.SANDSHREW, Type.GROUND, -1, [ + [ Species.SANDSHREW, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.COMMON ] ] ], - [ Species.SANDSLASH, Type.GROUND, -1, [ + [ Species.SANDSLASH, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.NIDORAN_F, Type.POISON, -1, [ + [ Species.NIDORAN_F, PokemonType.POISON, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.NIDORINA, Type.POISON, -1, [ + [ Species.NIDORINA, PokemonType.POISON, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.NIDOQUEEN, Type.POISON, Type.GROUND, [ + [ Species.NIDOQUEEN, PokemonType.POISON, PokemonType.GROUND, [ [ Biome.TALL_GRASS, BiomePoolTier.BOSS, TimeOfDay.DAY ] ] ], - [ Species.NIDORAN_M, Type.POISON, -1, [ + [ Species.NIDORAN_M, PokemonType.POISON, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.NIDORINO, Type.POISON, -1, [ + [ Species.NIDORINO, PokemonType.POISON, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.NIDOKING, Type.POISON, Type.GROUND, [ + [ Species.NIDOKING, PokemonType.POISON, PokemonType.GROUND, [ [ Biome.TALL_GRASS, BiomePoolTier.BOSS, TimeOfDay.DAY ] ] ], - [ Species.CLEFAIRY, Type.FAIRY, -1, [ + [ Species.CLEFAIRY, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.SPACE, BiomePoolTier.COMMON ] ] ], - [ Species.CLEFABLE, Type.FAIRY, -1, [ + [ Species.CLEFABLE, PokemonType.FAIRY, -1, [ [ Biome.SPACE, BiomePoolTier.BOSS ] ] ], - [ Species.VULPIX, Type.FIRE, -1, [ + [ Species.VULPIX, PokemonType.FIRE, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.NINETALES, Type.FIRE, -1, [ + [ Species.NINETALES, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.JIGGLYPUFF, Type.NORMAL, Type.FAIRY, [ + [ Species.JIGGLYPUFF, PokemonType.NORMAL, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.WIGGLYTUFF, Type.NORMAL, Type.FAIRY, [ + [ Species.WIGGLYTUFF, PokemonType.NORMAL, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ZUBAT, Type.POISON, Type.FLYING, [ + [ Species.ZUBAT, PokemonType.POISON, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.GOLBAT, Type.POISON, Type.FLYING, [ + [ Species.GOLBAT, PokemonType.POISON, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.ODDISH, Type.GRASS, Type.POISON, [ + [ Species.ODDISH, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GLOOM, Type.GRASS, Type.POISON, [ + [ Species.GLOOM, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.VILEPLUME, Type.GRASS, Type.POISON, [ + [ Species.VILEPLUME, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PARAS, Type.BUG, Type.GRASS, [ + [ Species.PARAS, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.PARASECT, Type.BUG, Type.GRASS, [ + [ Species.PARASECT, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.VENONAT, Type.BUG, Type.POISON, [ + [ Species.VENONAT, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.VENOMOTH, Type.BUG, Type.POISON, [ + [ Species.VENOMOTH, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.DIGLETT, Type.GROUND, -1, [ + [ Species.DIGLETT, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ] ] ], - [ Species.DUGTRIO, Type.GROUND, -1, [ + [ Species.DUGTRIO, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.MEOWTH, Type.NORMAL, -1, [ + [ Species.MEOWTH, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PERSIAN, Type.NORMAL, -1, [ + [ Species.PERSIAN, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PSYDUCK, Type.WATER, -1, [ + [ Species.PSYDUCK, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.COMMON ] ] ], - [ Species.GOLDUCK, Type.WATER, -1, [ + [ Species.GOLDUCK, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.MANKEY, Type.FIGHTING, -1, [ + [ Species.MANKEY, PokemonType.FIGHTING, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.PRIMEAPE, Type.FIGHTING, -1, [ + [ Species.PRIMEAPE, PokemonType.FIGHTING, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.GROWLITHE, Type.FIRE, -1, [ + [ Species.GROWLITHE, PokemonType.FIRE, -1, [ [ Biome.GRASS, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.ARCANINE, Type.FIRE, -1, [ + [ Species.ARCANINE, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.POLIWAG, Type.WATER, -1, [ + [ Species.POLIWAG, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.POLIWHIRL, Type.WATER, -1, [ + [ Species.POLIWHIRL, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.POLIWRATH, Type.WATER, Type.FIGHTING, [ + [ Species.POLIWRATH, PokemonType.WATER, PokemonType.FIGHTING, [ [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.ABRA, Type.PSYCHIC, -1, [ + [ Species.ABRA, PokemonType.PSYCHIC, -1, [ [ Biome.TOWN, BiomePoolTier.RARE ], [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KADABRA, Type.PSYCHIC, -1, [ + [ Species.KADABRA, PokemonType.PSYCHIC, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.ALAKAZAM, Type.PSYCHIC, -1, [ + [ Species.ALAKAZAM, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.MACHOP, Type.FIGHTING, -1, [ + [ Species.MACHOP, PokemonType.FIGHTING, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.MACHOKE, Type.FIGHTING, -1, [ + [ Species.MACHOKE, PokemonType.FIGHTING, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.MACHAMP, Type.FIGHTING, -1, [ + [ Species.MACHAMP, PokemonType.FIGHTING, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] ] ], - [ Species.BELLSPROUT, Type.GRASS, Type.POISON, [ + [ Species.BELLSPROUT, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WEEPINBELL, Type.GRASS, Type.POISON, [ + [ Species.WEEPINBELL, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VICTREEBEL, Type.GRASS, Type.POISON, [ + [ Species.VICTREEBEL, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TENTACOOL, Type.WATER, Type.POISON, [ + [ Species.TENTACOOL, PokemonType.WATER, PokemonType.POISON, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TENTACRUEL, Type.WATER, Type.POISON, [ + [ Species.TENTACRUEL, PokemonType.WATER, PokemonType.POISON, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.SEA, BiomePoolTier.BOSS ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GEODUDE, Type.ROCK, Type.GROUND, [ + [ Species.GEODUDE, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GRAVELER, Type.ROCK, Type.GROUND, [ + [ Species.GRAVELER, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GOLEM, Type.ROCK, Type.GROUND, [ + [ Species.GOLEM, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.PONYTA, Type.FIRE, -1, [ + [ Species.PONYTA, PokemonType.FIRE, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.RAPIDASH, Type.FIRE, -1, [ + [ Species.RAPIDASH, PokemonType.FIRE, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.SLOWPOKE, Type.WATER, Type.PSYCHIC, [ + [ Species.SLOWPOKE, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.LAKE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SLOWBRO, Type.WATER, Type.PSYCHIC, [ + [ Species.SLOWBRO, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.MAGNEMITE, Type.ELECTRIC, Type.STEEL, [ + [ Species.MAGNEMITE, PokemonType.ELECTRIC, PokemonType.STEEL, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.MAGNETON, Type.ELECTRIC, Type.STEEL, [ + [ Species.MAGNETON, PokemonType.ELECTRIC, PokemonType.STEEL, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.FARFETCHD, Type.NORMAL, Type.FLYING, [ + [ Species.FARFETCHD, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DODUO, Type.NORMAL, Type.FLYING, [ + [ Species.DODUO, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.DODRIO, Type.NORMAL, Type.FLYING, [ + [ Species.DODRIO, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SEEL, Type.WATER, -1, [ + [ Species.SEEL, PokemonType.WATER, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.DEWGONG, Type.WATER, Type.ICE, [ + [ Species.DEWGONG, PokemonType.WATER, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.GRIMER, Type.POISON, -1, [ + [ Species.GRIMER, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.MUK, Type.POISON, -1, [ + [ Species.MUK, PokemonType.POISON, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ], [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.BOSS ], @@ -2460,84 +2474,84 @@ export function initBiomes() { [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.SHELLDER, Type.WATER, -1, [ + [ Species.SHELLDER, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CLOYSTER, Type.WATER, Type.ICE, [ + [ Species.CLOYSTER, PokemonType.WATER, PokemonType.ICE, [ [ Biome.BEACH, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GASTLY, Type.GHOST, Type.POISON, [ + [ Species.GASTLY, PokemonType.GHOST, PokemonType.POISON, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.HAUNTER, Type.GHOST, Type.POISON, [ + [ Species.HAUNTER, PokemonType.GHOST, PokemonType.POISON, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.GENGAR, Type.GHOST, Type.POISON, [ + [ Species.GENGAR, PokemonType.GHOST, PokemonType.POISON, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.ONIX, Type.ROCK, Type.GROUND, [ + [ Species.ONIX, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.RARE ], [ Biome.CAVE, BiomePoolTier.RARE ], [ Biome.CAVE, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] ] ], - [ Species.DROWZEE, Type.PSYCHIC, -1, [ + [ Species.DROWZEE, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ] ] ], - [ Species.HYPNO, Type.PSYCHIC, -1, [ + [ Species.HYPNO, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.KRABBY, Type.WATER, -1, [ + [ Species.KRABBY, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.KINGLER, Type.WATER, -1, [ + [ Species.KINGLER, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.VOLTORB, Type.ELECTRIC, -1, [ + [ Species.VOLTORB, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.ELECTRODE, Type.ELECTRIC, -1, [ + [ Species.ELECTRODE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.EXEGGCUTE, Type.GRASS, Type.PSYCHIC, [ + [ Species.EXEGGCUTE, PokemonType.GRASS, PokemonType.PSYCHIC, [ [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.EXEGGUTOR, Type.GRASS, Type.PSYCHIC, [ + [ Species.EXEGGUTOR, PokemonType.GRASS, PokemonType.PSYCHIC, [ [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CUBONE, Type.GROUND, -1, [ + [ Species.CUBONE, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MAROWAK, Type.GROUND, -1, [ + [ Species.MAROWAK, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], @@ -2545,143 +2559,143 @@ export function initBiomes() { [ Biome.GRAVEYARD, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY, TimeOfDay.DUSK ]] ] ], - [ Species.HITMONLEE, Type.FIGHTING, -1, [ + [ Species.HITMONLEE, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] ] ], - [ Species.HITMONCHAN, Type.FIGHTING, -1, [ + [ Species.HITMONCHAN, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] ] ], - [ Species.LICKITUNG, Type.NORMAL, -1, [ + [ Species.LICKITUNG, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.KOFFING, Type.POISON, -1, [ + [ Species.KOFFING, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WEEZING, Type.POISON, -1, [ + [ Species.WEEZING, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.RHYHORN, Type.GROUND, Type.ROCK, [ + [ Species.RHYHORN, PokemonType.GROUND, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.RHYDON, Type.GROUND, Type.ROCK, [ + [ Species.RHYDON, PokemonType.GROUND, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CHANSEY, Type.NORMAL, -1, [ + [ Species.CHANSEY, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.MEADOW, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.TANGELA, Type.GRASS, -1, [ + [ Species.TANGELA, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KANGASKHAN, Type.NORMAL, -1, [ + [ Species.KANGASKHAN, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HORSEA, Type.WATER, -1, [ + [ Species.HORSEA, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SEADRA, Type.WATER, -1, [ + [ Species.SEADRA, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GOLDEEN, Type.WATER, -1, [ + [ Species.GOLDEEN, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SEAKING, Type.WATER, -1, [ + [ Species.SEAKING, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ], [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.STARYU, Type.WATER, -1, [ + [ Species.STARYU, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.STARMIE, Type.WATER, Type.PSYCHIC, [ + [ Species.STARMIE, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BEACH, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.MR_MIME, Type.PSYCHIC, Type.FAIRY, [ + [ Species.MR_MIME, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.RUINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SCYTHER, Type.BUG, Type.FLYING, [ + [ Species.SCYTHER, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ], [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.JYNX, Type.ICE, Type.PSYCHIC, [ + [ Species.JYNX, PokemonType.ICE, PokemonType.PSYCHIC, [ [ Biome.ICE_CAVE, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ELECTABUZZ, Type.ELECTRIC, -1, [ + [ Species.ELECTABUZZ, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MAGMAR, Type.FIRE, -1, [ + [ Species.MAGMAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PINSIR, Type.BUG, -1, [ + [ Species.PINSIR, PokemonType.BUG, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TAUROS, Type.NORMAL, -1, [ + [ Species.TAUROS, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.MAGIKARP, Type.WATER, -1, [ + [ Species.MAGIKARP, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.COMMON ] ] ], - [ Species.GYARADOS, Type.WATER, Type.FLYING, [ + [ Species.GYARADOS, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.LAPRAS, Type.WATER, Type.ICE, [ + [ Species.LAPRAS, PokemonType.WATER, PokemonType.ICE, [ [ Biome.SEA, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DITTO, Type.NORMAL, -1, [ + [ Species.DITTO, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.ULTRA_RARE ], [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ], @@ -2689,164 +2703,164 @@ export function initBiomes() { [ Biome.LABORATORY, BiomePoolTier.RARE ] ] ], - [ Species.EEVEE, Type.NORMAL, -1, [ + [ Species.EEVEE, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.SUPER_RARE ], [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ], [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.VAPOREON, Type.WATER, -1, [ + [ Species.VAPOREON, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.SUPER_RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.JOLTEON, Type.ELECTRIC, -1, [ + [ Species.JOLTEON, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.SUPER_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FLAREON, Type.FIRE, -1, [ + [ Species.FLAREON, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PORYGON, Type.NORMAL, -1, [ + [ Species.PORYGON, PokemonType.NORMAL, -1, [ [ Biome.FACTORY, BiomePoolTier.RARE ], [ Biome.SPACE, BiomePoolTier.SUPER_RARE ], [ Biome.LABORATORY, BiomePoolTier.RARE ] ] ], - [ Species.OMANYTE, Type.ROCK, Type.WATER, [ + [ Species.OMANYTE, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.OMASTAR, Type.ROCK, Type.WATER, [ + [ Species.OMASTAR, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KABUTO, Type.ROCK, Type.WATER, [ + [ Species.KABUTO, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.KABUTOPS, Type.ROCK, Type.WATER, [ + [ Species.KABUTOPS, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.AERODACTYL, Type.ROCK, Type.FLYING, [ + [ Species.AERODACTYL, PokemonType.ROCK, PokemonType.FLYING, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SNORLAX, Type.NORMAL, -1, [ + [ Species.SNORLAX, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ARTICUNO, Type.ICE, Type.FLYING, [ + [ Species.ARTICUNO, PokemonType.ICE, PokemonType.FLYING, [ [ Biome.ICE_CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ZAPDOS, Type.ELECTRIC, Type.FLYING, [ + [ Species.ZAPDOS, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MOLTRES, Type.FIRE, Type.FLYING, [ + [ Species.MOLTRES, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.DRATINI, Type.DRAGON, -1, [ + [ Species.DRATINI, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.RARE ] ] ], - [ Species.DRAGONAIR, Type.DRAGON, -1, [ + [ Species.DRAGONAIR, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.RARE ] ] ], - [ Species.DRAGONITE, Type.DRAGON, Type.FLYING, [ + [ Species.DRAGONITE, PokemonType.DRAGON, PokemonType.FLYING, [ [ Biome.WASTELAND, BiomePoolTier.RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.MEWTWO, Type.PSYCHIC, -1, [ + [ Species.MEWTWO, PokemonType.PSYCHIC, -1, [ [ Biome.LABORATORY, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.MEW, Type.PSYCHIC, -1, [ ] + [ Species.MEW, PokemonType.PSYCHIC, -1, [ ] ], - [ Species.CHIKORITA, Type.GRASS, -1, [ + [ Species.CHIKORITA, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ] ] ], - [ Species.BAYLEEF, Type.GRASS, -1, [ + [ Species.BAYLEEF, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ] ] ], - [ Species.MEGANIUM, Type.GRASS, -1, [ + [ Species.MEGANIUM, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CYNDAQUIL, Type.FIRE, -1, [ + [ Species.CYNDAQUIL, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.QUILAVA, Type.FIRE, -1, [ + [ Species.QUILAVA, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.TYPHLOSION, Type.FIRE, -1, [ + [ Species.TYPHLOSION, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TOTODILE, Type.WATER, -1, [ + [ Species.TOTODILE, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.RARE ] ] ], - [ Species.CROCONAW, Type.WATER, -1, [ + [ Species.CROCONAW, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.RARE ] ] ], - [ Species.FERALIGATR, Type.WATER, -1, [ + [ Species.FERALIGATR, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SENTRET, Type.NORMAL, -1, [ + [ Species.SENTRET, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FURRET, Type.NORMAL, -1, [ + [ Species.FURRET, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HOOTHOOT, Type.NORMAL, Type.FLYING, [ + [ Species.HOOTHOOT, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ] ] ], - [ Species.NOCTOWL, Type.NORMAL, Type.FLYING, [ + [ Species.NOCTOWL, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.LEDYBA, Type.BUG, Type.FLYING, [ + [ Species.LEDYBA, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.DAWN ], [ Biome.MEADOW, BiomePoolTier.COMMON, TimeOfDay.DAWN ] ] ], - [ Species.LEDIAN, Type.BUG, Type.FLYING, [ + [ Species.LEDIAN, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.MEADOW, BiomePoolTier.COMMON, TimeOfDay.DAWN ], [ Biome.MEADOW, BiomePoolTier.BOSS, TimeOfDay.DAWN ] ] ], - [ Species.SPINARAK, Type.BUG, Type.POISON, [ + [ Species.SPINARAK, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], @@ -2856,7 +2870,7 @@ export function initBiomes() { [ Biome.JUNGLE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.ARIADOS, Type.BUG, Type.POISON, [ + [ Species.ARIADOS, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], @@ -2865,227 +2879,227 @@ export function initBiomes() { [ Biome.JUNGLE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.CROBAT, Type.POISON, Type.FLYING, [ + [ Species.CROBAT, PokemonType.POISON, PokemonType.FLYING, [ [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.CHINCHOU, Type.WATER, Type.ELECTRIC, [ + [ Species.CHINCHOU, PokemonType.WATER, PokemonType.ELECTRIC, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.LANTURN, Type.WATER, Type.ELECTRIC, [ + [ Species.LANTURN, PokemonType.WATER, PokemonType.ELECTRIC, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.SEABED, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.PICHU, Type.ELECTRIC, -1, [ ] + [ Species.PICHU, PokemonType.ELECTRIC, -1, [ ] ], - [ Species.CLEFFA, Type.FAIRY, -1, [ ] + [ Species.CLEFFA, PokemonType.FAIRY, -1, [ ] ], - [ Species.IGGLYBUFF, Type.NORMAL, Type.FAIRY, [ ] + [ Species.IGGLYBUFF, PokemonType.NORMAL, PokemonType.FAIRY, [ ] ], - [ Species.TOGEPI, Type.FAIRY, -1, [ ] + [ Species.TOGEPI, PokemonType.FAIRY, -1, [ ] ], - [ Species.TOGETIC, Type.FAIRY, Type.FLYING, [ + [ Species.TOGETIC, PokemonType.FAIRY, PokemonType.FLYING, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.NATU, Type.PSYCHIC, Type.FLYING, [ + [ Species.NATU, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.XATU, Type.PSYCHIC, Type.FLYING, [ + [ Species.XATU, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.MAREEP, Type.ELECTRIC, -1, [ + [ Species.MAREEP, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.RARE ] ] ], - [ Species.FLAAFFY, Type.ELECTRIC, -1, [ + [ Species.FLAAFFY, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.RARE ] ] ], - [ Species.AMPHAROS, Type.ELECTRIC, -1, [ + [ Species.AMPHAROS, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.BELLOSSOM, Type.GRASS, -1, [ + [ Species.BELLOSSOM, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.MARILL, Type.WATER, Type.FAIRY, [ + [ Species.MARILL, PokemonType.WATER, PokemonType.FAIRY, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.AZUMARILL, Type.WATER, Type.FAIRY, [ + [ Species.AZUMARILL, PokemonType.WATER, PokemonType.FAIRY, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.SUDOWOODO, Type.ROCK, -1, [ + [ Species.SUDOWOODO, PokemonType.ROCK, -1, [ [ Biome.GRASS, BiomePoolTier.SUPER_RARE ], [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.POLITOED, Type.WATER, -1, [ + [ Species.POLITOED, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HOPPIP, Type.GRASS, Type.FLYING, [ + [ Species.HOPPIP, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SKIPLOOM, Type.GRASS, Type.FLYING, [ + [ Species.SKIPLOOM, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.JUMPLUFF, Type.GRASS, Type.FLYING, [ + [ Species.JUMPLUFF, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.AIPOM, Type.NORMAL, -1, [ + [ Species.AIPOM, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.SUNKERN, Type.GRASS, -1, [ + [ Species.SUNKERN, PokemonType.GRASS, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SUNFLORA, Type.GRASS, -1, [ + [ Species.SUNFLORA, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.YANMA, Type.BUG, Type.FLYING, [ + [ Species.YANMA, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.WOOPER, Type.WATER, Type.GROUND, [ + [ Species.WOOPER, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.QUAGSIRE, Type.WATER, Type.GROUND, [ + [ Species.QUAGSIRE, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ESPEON, Type.PSYCHIC, -1, [ + [ Species.ESPEON, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.SUPER_RARE, TimeOfDay.DAY ], [ Biome.RUINS, BiomePoolTier.BOSS_RARE, TimeOfDay.DAY ] ] ], - [ Species.UMBREON, Type.DARK, -1, [ + [ Species.UMBREON, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.SUPER_RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.MURKROW, Type.DARK, Type.FLYING, [ + [ Species.MURKROW, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE, TimeOfDay.NIGHT ], [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.SLOWKING, Type.WATER, Type.PSYCHIC, [ + [ Species.SLOWKING, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.LAKE, BiomePoolTier.SUPER_RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.MISDREAVUS, Type.GHOST, -1, [ + [ Species.MISDREAVUS, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ] ] ], - [ Species.UNOWN, Type.PSYCHIC, -1, [ + [ Species.UNOWN, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ] ] ], - [ Species.WOBBUFFET, Type.PSYCHIC, -1, [ + [ Species.WOBBUFFET, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GIRAFARIG, Type.NORMAL, Type.PSYCHIC, [ + [ Species.GIRAFARIG, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ] ] ], - [ Species.PINECO, Type.BUG, -1, [ + [ Species.PINECO, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FORRETRESS, Type.BUG, Type.STEEL, [ + [ Species.FORRETRESS, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DUNSPARCE, Type.NORMAL, -1, [ + [ Species.DUNSPARCE, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.GLIGAR, Type.GROUND, Type.FLYING, [ + [ Species.GLIGAR, PokemonType.GROUND, PokemonType.FLYING, [ [ Biome.BADLANDS, BiomePoolTier.RARE ] ] ], - [ Species.STEELIX, Type.STEEL, Type.GROUND, [ + [ Species.STEELIX, PokemonType.STEEL, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SNUBBULL, Type.FAIRY, -1, [ + [ Species.SNUBBULL, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GRANBULL, Type.FAIRY, -1, [ + [ Species.GRANBULL, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.QWILFISH, Type.WATER, Type.POISON, [ + [ Species.QWILFISH, PokemonType.WATER, PokemonType.POISON, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.SCIZOR, Type.BUG, Type.STEEL, [ + [ Species.SCIZOR, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SHUCKLE, Type.BUG, Type.ROCK, [ + [ Species.SHUCKLE, PokemonType.BUG, PokemonType.ROCK, [ [ Biome.CAVE, BiomePoolTier.SUPER_RARE ], [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HERACROSS, Type.BUG, Type.FIGHTING, [ + [ Species.HERACROSS, PokemonType.BUG, PokemonType.FIGHTING, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SNEASEL, Type.DARK, Type.ICE, [ + [ Species.SNEASEL, PokemonType.DARK, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TEDDIURSA, Type.NORMAL, -1, [ + [ Species.TEDDIURSA, PokemonType.NORMAL, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.URSARING, Type.NORMAL, -1, [ + [ Species.URSARING, PokemonType.NORMAL, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ], @@ -3093,926 +3107,926 @@ export function initBiomes() { [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SLUGMA, Type.FIRE, -1, [ + [ Species.SLUGMA, PokemonType.FIRE, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.MAGCARGO, Type.FIRE, Type.ROCK, [ + [ Species.MAGCARGO, PokemonType.FIRE, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.SWINUB, Type.ICE, Type.GROUND, [ + [ Species.SWINUB, PokemonType.ICE, PokemonType.GROUND, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.PILOSWINE, Type.ICE, Type.GROUND, [ + [ Species.PILOSWINE, PokemonType.ICE, PokemonType.GROUND, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.CORSOLA, Type.WATER, Type.ROCK, [ + [ Species.CORSOLA, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.REMORAID, Type.WATER, -1, [ + [ Species.REMORAID, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.OCTILLERY, Type.WATER, -1, [ + [ Species.OCTILLERY, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.DELIBIRD, Type.ICE, Type.FLYING, [ + [ Species.DELIBIRD, PokemonType.ICE, PokemonType.FLYING, [ [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] ] ], - [ Species.MANTINE, Type.WATER, Type.FLYING, [ + [ Species.MANTINE, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.SKARMORY, Type.STEEL, Type.FLYING, [ + [ Species.SKARMORY, PokemonType.STEEL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.HOUNDOUR, Type.DARK, Type.FIRE, [ + [ Species.HOUNDOUR, PokemonType.DARK, PokemonType.FIRE, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.HOUNDOOM, Type.DARK, Type.FIRE, [ + [ Species.HOUNDOOM, PokemonType.DARK, PokemonType.FIRE, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.KINGDRA, Type.WATER, Type.DRAGON, [ + [ Species.KINGDRA, PokemonType.WATER, PokemonType.DRAGON, [ [ Biome.SEA, BiomePoolTier.SUPER_RARE ], [ Biome.SEA, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PHANPY, Type.GROUND, -1, [ + [ Species.PHANPY, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.DONPHAN, Type.GROUND, -1, [ + [ Species.DONPHAN, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PORYGON2, Type.NORMAL, -1, [ + [ Species.PORYGON2, PokemonType.NORMAL, -1, [ [ Biome.FACTORY, BiomePoolTier.RARE ], [ Biome.SPACE, BiomePoolTier.SUPER_RARE ], [ Biome.LABORATORY, BiomePoolTier.RARE ] ] ], - [ Species.STANTLER, Type.NORMAL, -1, [ + [ Species.STANTLER, PokemonType.NORMAL, -1, [ [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SMEARGLE, Type.NORMAL, -1, [ + [ Species.SMEARGLE, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.TYROGUE, Type.FIGHTING, -1, [ ] + [ Species.TYROGUE, PokemonType.FIGHTING, -1, [ ] ], - [ Species.HITMONTOP, Type.FIGHTING, -1, [ + [ Species.HITMONTOP, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.SUPER_RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_RARE ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.SMOOCHUM, Type.ICE, Type.PSYCHIC, [ ] + [ Species.SMOOCHUM, PokemonType.ICE, PokemonType.PSYCHIC, [ ] ], - [ Species.ELEKID, Type.ELECTRIC, -1, [ ] + [ Species.ELEKID, PokemonType.ELECTRIC, -1, [ ] ], - [ Species.MAGBY, Type.FIRE, -1, [ ] + [ Species.MAGBY, PokemonType.FIRE, -1, [ ] ], - [ Species.MILTANK, Type.NORMAL, -1, [ + [ Species.MILTANK, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.BLISSEY, Type.NORMAL, -1, [ + [ Species.BLISSEY, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.RAIKOU, Type.ELECTRIC, -1, [ + [ Species.RAIKOU, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ENTEI, Type.FIRE, -1, [ + [ Species.ENTEI, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.SUICUNE, Type.WATER, -1, [ + [ Species.SUICUNE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.ULTRA_RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.LARVITAR, Type.ROCK, Type.GROUND, [ + [ Species.LARVITAR, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PUPITAR, Type.ROCK, Type.GROUND, [ + [ Species.PUPITAR, PokemonType.ROCK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.TYRANITAR, Type.ROCK, Type.DARK, [ + [ Species.TYRANITAR, PokemonType.ROCK, PokemonType.DARK, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.LUGIA, Type.PSYCHIC, Type.FLYING, [ + [ Species.LUGIA, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.HO_OH, Type.FIRE, Type.FLYING, [ + [ Species.HO_OH, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.CELEBI, Type.PSYCHIC, Type.GRASS, [ ] + [ Species.CELEBI, PokemonType.PSYCHIC, PokemonType.GRASS, [ ] ], - [ Species.TREECKO, Type.GRASS, -1, [ + [ Species.TREECKO, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.GROVYLE, Type.GRASS, -1, [ + [ Species.GROVYLE, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.SCEPTILE, Type.GRASS, -1, [ + [ Species.SCEPTILE, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TORCHIC, Type.FIRE, -1, [ + [ Species.TORCHIC, PokemonType.FIRE, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ] ] ], - [ Species.COMBUSKEN, Type.FIRE, Type.FIGHTING, [ + [ Species.COMBUSKEN, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ] ] ], - [ Species.BLAZIKEN, Type.FIRE, Type.FIGHTING, [ + [ Species.BLAZIKEN, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.MUDKIP, Type.WATER, -1, [ + [ Species.MUDKIP, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.RARE ] ] ], - [ Species.MARSHTOMP, Type.WATER, Type.GROUND, [ + [ Species.MARSHTOMP, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.RARE ] ] ], - [ Species.SWAMPERT, Type.WATER, Type.GROUND, [ + [ Species.SWAMPERT, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.POOCHYENA, Type.DARK, -1, [ + [ Species.POOCHYENA, PokemonType.DARK, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MIGHTYENA, Type.DARK, -1, [ + [ Species.MIGHTYENA, PokemonType.DARK, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ZIGZAGOON, Type.NORMAL, -1, [ + [ Species.ZIGZAGOON, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.COMMON ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ] ] ], - [ Species.LINOONE, Type.NORMAL, -1, [ + [ Species.LINOONE, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.BOSS ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ] ] ], - [ Species.WURMPLE, Type.BUG, -1, [ + [ Species.WURMPLE, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ] ] ], - [ Species.SILCOON, Type.BUG, -1, [ + [ Species.SILCOON, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.DAY ] ] ], - [ Species.BEAUTIFLY, Type.BUG, Type.FLYING, [ + [ Species.BEAUTIFLY, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.DAY ], [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.DAY ] ] ], - [ Species.CASCOON, Type.BUG, -1, [ + [ Species.CASCOON, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.DUSTOX, Type.BUG, Type.POISON, [ + [ Species.DUSTOX, PokemonType.BUG, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.LOTAD, Type.WATER, Type.GRASS, [ + [ Species.LOTAD, PokemonType.WATER, PokemonType.GRASS, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LOMBRE, Type.WATER, Type.GRASS, [ + [ Species.LOMBRE, PokemonType.WATER, PokemonType.GRASS, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LUDICOLO, Type.WATER, Type.GRASS, [ + [ Species.LUDICOLO, PokemonType.WATER, PokemonType.GRASS, [ [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SEEDOT, Type.GRASS, -1, [ + [ Species.SEEDOT, PokemonType.GRASS, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.NUZLEAF, Type.GRASS, Type.DARK, [ + [ Species.NUZLEAF, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SHIFTRY, Type.GRASS, Type.DARK, [ + [ Species.SHIFTRY, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.TAILLOW, Type.NORMAL, Type.FLYING, [ + [ Species.TAILLOW, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SWELLOW, Type.NORMAL, Type.FLYING, [ + [ Species.SWELLOW, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WINGULL, Type.WATER, Type.FLYING, [ + [ Species.WINGULL, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PELIPPER, Type.WATER, Type.FLYING, [ + [ Species.PELIPPER, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.RALTS, Type.PSYCHIC, Type.FAIRY, [ + [ Species.RALTS, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.TOWN, BiomePoolTier.SUPER_RARE ], [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KIRLIA, Type.PSYCHIC, Type.FAIRY, [ + [ Species.KIRLIA, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GARDEVOIR, Type.PSYCHIC, Type.FAIRY, [ + [ Species.GARDEVOIR, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ], [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SURSKIT, Type.BUG, Type.WATER, [ + [ Species.SURSKIT, PokemonType.BUG, PokemonType.WATER, [ [ Biome.TOWN, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MASQUERAIN, Type.BUG, Type.FLYING, [ + [ Species.MASQUERAIN, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.SHROOMISH, Type.GRASS, -1, [ + [ Species.SHROOMISH, PokemonType.GRASS, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BRELOOM, Type.GRASS, Type.FIGHTING, [ + [ Species.BRELOOM, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SLAKOTH, Type.NORMAL, -1, [ + [ Species.SLAKOTH, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.VIGOROTH, Type.NORMAL, -1, [ + [ Species.VIGOROTH, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.SLAKING, Type.NORMAL, -1, [ + [ Species.SLAKING, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.NINCADA, Type.BUG, Type.GROUND, [ + [ Species.NINCADA, PokemonType.BUG, PokemonType.GROUND, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON ], [ Biome.TALL_GRASS, BiomePoolTier.COMMON ] ] ], - [ Species.NINJASK, Type.BUG, Type.FLYING, [ + [ Species.NINJASK, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] ] ], - [ Species.SHEDINJA, Type.BUG, Type.GHOST, [ + [ Species.SHEDINJA, PokemonType.BUG, PokemonType.GHOST, [ [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.WHISMUR, Type.NORMAL, -1, [ + [ Species.WHISMUR, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.LOUDRED, Type.NORMAL, -1, [ + [ Species.LOUDRED, PokemonType.NORMAL, -1, [ [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.EXPLOUD, Type.NORMAL, -1, [ + [ Species.EXPLOUD, PokemonType.NORMAL, -1, [ [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.MAKUHITA, Type.FIGHTING, -1, [ + [ Species.MAKUHITA, PokemonType.FIGHTING, -1, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.HARIYAMA, Type.FIGHTING, -1, [ + [ Species.HARIYAMA, PokemonType.FIGHTING, -1, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.AZURILL, Type.NORMAL, Type.FAIRY, [ ] + [ Species.AZURILL, PokemonType.NORMAL, PokemonType.FAIRY, [ ] ], - [ Species.NOSEPASS, Type.ROCK, -1, [ + [ Species.NOSEPASS, PokemonType.ROCK, -1, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SKITTY, Type.NORMAL, -1, [ + [ Species.SKITTY, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.DELCATTY, Type.NORMAL, -1, [ + [ Species.DELCATTY, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SABLEYE, Type.DARK, Type.GHOST, [ + [ Species.SABLEYE, PokemonType.DARK, PokemonType.GHOST, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.MAWILE, Type.STEEL, Type.FAIRY, [ + [ Species.MAWILE, PokemonType.STEEL, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ARON, Type.STEEL, Type.ROCK, [ + [ Species.ARON, PokemonType.STEEL, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.LAIRON, Type.STEEL, Type.ROCK, [ + [ Species.LAIRON, PokemonType.STEEL, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.AGGRON, Type.STEEL, Type.ROCK, [ + [ Species.AGGRON, PokemonType.STEEL, PokemonType.ROCK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.MEDITITE, Type.FIGHTING, Type.PSYCHIC, [ + [ Species.MEDITITE, PokemonType.FIGHTING, PokemonType.PSYCHIC, [ [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.MEDICHAM, Type.FIGHTING, Type.PSYCHIC, [ + [ Species.MEDICHAM, PokemonType.FIGHTING, PokemonType.PSYCHIC, [ [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.ELECTRIKE, Type.ELECTRIC, -1, [ + [ Species.ELECTRIKE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.MANECTRIC, Type.ELECTRIC, -1, [ + [ Species.MANECTRIC, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.PLUSLE, Type.ELECTRIC, -1, [ + [ Species.PLUSLE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MINUN, Type.ELECTRIC, -1, [ + [ Species.MINUN, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.VOLBEAT, Type.BUG, -1, [ + [ Species.VOLBEAT, PokemonType.BUG, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE, TimeOfDay.NIGHT ] ] ], - [ Species.ILLUMISE, Type.BUG, -1, [ + [ Species.ILLUMISE, PokemonType.BUG, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE, TimeOfDay.NIGHT ] ] ], - [ Species.ROSELIA, Type.GRASS, Type.POISON, [ + [ Species.ROSELIA, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GULPIN, Type.POISON, -1, [ + [ Species.GULPIN, PokemonType.POISON, -1, [ [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.SWALOT, Type.POISON, -1, [ + [ Species.SWALOT, PokemonType.POISON, -1, [ [ Biome.SWAMP, BiomePoolTier.COMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.CARVANHA, Type.WATER, Type.DARK, [ + [ Species.CARVANHA, PokemonType.WATER, PokemonType.DARK, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SHARPEDO, Type.WATER, Type.DARK, [ + [ Species.SHARPEDO, PokemonType.WATER, PokemonType.DARK, [ [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.WAILMER, Type.WATER, -1, [ + [ Species.WAILMER, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WAILORD, Type.WATER, -1, [ + [ Species.WAILORD, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.NUMEL, Type.FIRE, Type.GROUND, [ + [ Species.NUMEL, PokemonType.FIRE, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.CAMERUPT, Type.FIRE, Type.GROUND, [ + [ Species.CAMERUPT, PokemonType.FIRE, PokemonType.GROUND, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.TORKOAL, Type.FIRE, -1, [ + [ Species.TORKOAL, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.SPOINK, Type.PSYCHIC, -1, [ + [ Species.SPOINK, PokemonType.PSYCHIC, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.COMMON ] ] ], - [ Species.GRUMPIG, Type.PSYCHIC, -1, [ + [ Species.GRUMPIG, PokemonType.PSYCHIC, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.SPINDA, Type.NORMAL, -1, [ + [ Species.SPINDA, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.TRAPINCH, Type.GROUND, -1, [ + [ Species.TRAPINCH, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VIBRAVA, Type.GROUND, Type.DRAGON, [ + [ Species.VIBRAVA, PokemonType.GROUND, PokemonType.DRAGON, [ [ Biome.DESERT, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.FLYGON, Type.GROUND, Type.DRAGON, [ + [ Species.FLYGON, PokemonType.GROUND, PokemonType.DRAGON, [ [ Biome.DESERT, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.COMMON ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.CACNEA, Type.GRASS, -1, [ + [ Species.CACNEA, PokemonType.GRASS, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.CACTURNE, Type.GRASS, Type.DARK, [ + [ Species.CACTURNE, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SWABLU, Type.NORMAL, Type.FLYING, [ + [ Species.SWABLU, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] ] ], - [ Species.ALTARIA, Type.DRAGON, Type.FLYING, [ + [ Species.ALTARIA, PokemonType.DRAGON, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] ] ], - [ Species.ZANGOOSE, Type.NORMAL, -1, [ + [ Species.ZANGOOSE, PokemonType.NORMAL, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] ] ], - [ Species.SEVIPER, Type.POISON, -1, [ + [ Species.SEVIPER, PokemonType.POISON, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.LUNATONE, Type.ROCK, Type.PSYCHIC, [ + [ Species.LUNATONE, PokemonType.ROCK, PokemonType.PSYCHIC, [ [ Biome.SPACE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.SPACE, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.SOLROCK, Type.ROCK, Type.PSYCHIC, [ + [ Species.SOLROCK, PokemonType.ROCK, PokemonType.PSYCHIC, [ [ Biome.SPACE, BiomePoolTier.COMMON, TimeOfDay.DAY ], [ Biome.SPACE, BiomePoolTier.BOSS, TimeOfDay.DAY ] ] ], - [ Species.BARBOACH, Type.WATER, Type.GROUND, [ + [ Species.BARBOACH, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WHISCASH, Type.WATER, Type.GROUND, [ + [ Species.WHISCASH, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.CORPHISH, Type.WATER, -1, [ + [ Species.CORPHISH, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.CRAWDAUNT, Type.WATER, Type.DARK, [ + [ Species.CRAWDAUNT, PokemonType.WATER, PokemonType.DARK, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.BALTOY, Type.GROUND, Type.PSYCHIC, [ + [ Species.BALTOY, PokemonType.GROUND, PokemonType.PSYCHIC, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CLAYDOL, Type.GROUND, Type.PSYCHIC, [ + [ Species.CLAYDOL, PokemonType.GROUND, PokemonType.PSYCHIC, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ], [ Biome.SPACE, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.LILEEP, Type.ROCK, Type.GRASS, [ + [ Species.LILEEP, PokemonType.ROCK, PokemonType.GRASS, [ [ Biome.DESERT, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.CRADILY, Type.ROCK, Type.GRASS, [ + [ Species.CRADILY, PokemonType.ROCK, PokemonType.GRASS, [ [ Biome.DESERT, BiomePoolTier.SUPER_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ANORITH, Type.ROCK, Type.BUG, [ + [ Species.ANORITH, PokemonType.ROCK, PokemonType.BUG, [ [ Biome.DESERT, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.ARMALDO, Type.ROCK, Type.BUG, [ + [ Species.ARMALDO, PokemonType.ROCK, PokemonType.BUG, [ [ Biome.DESERT, BiomePoolTier.SUPER_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FEEBAS, Type.WATER, -1, [ + [ Species.FEEBAS, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.MILOTIC, Type.WATER, -1, [ + [ Species.MILOTIC, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CASTFORM, Type.NORMAL, -1, [ + [ Species.CASTFORM, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.ULTRA_RARE ], [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KECLEON, Type.NORMAL, -1, [ + [ Species.KECLEON, PokemonType.NORMAL, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] ] ], - [ Species.SHUPPET, Type.GHOST, -1, [ + [ Species.SHUPPET, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.BANETTE, Type.GHOST, -1, [ + [ Species.BANETTE, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.DUSKULL, Type.GHOST, -1, [ + [ Species.DUSKULL, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.DUSCLOPS, Type.GHOST, -1, [ + [ Species.DUSCLOPS, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.TROPIUS, Type.GRASS, Type.FLYING, [ + [ Species.TROPIUS, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CHIMECHO, Type.PSYCHIC, -1, [ + [ Species.CHIMECHO, PokemonType.PSYCHIC, -1, [ [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.BOSS ] ] ], - [ Species.ABSOL, Type.DARK, -1, [ + [ Species.ABSOL, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.WYNAUT, Type.PSYCHIC, -1, [ ] + [ Species.WYNAUT, PokemonType.PSYCHIC, -1, [ ] ], - [ Species.SNORUNT, Type.ICE, -1, [ + [ Species.SNORUNT, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GLALIE, Type.ICE, -1, [ + [ Species.GLALIE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SPHEAL, Type.ICE, Type.WATER, [ + [ Species.SPHEAL, PokemonType.ICE, PokemonType.WATER, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SEALEO, Type.ICE, Type.WATER, [ + [ Species.SEALEO, PokemonType.ICE, PokemonType.WATER, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WALREIN, Type.ICE, Type.WATER, [ + [ Species.WALREIN, PokemonType.ICE, PokemonType.WATER, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.CLAMPERL, Type.WATER, -1, [ + [ Species.CLAMPERL, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.HUNTAIL, Type.WATER, -1, [ + [ Species.HUNTAIL, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.GOREBYSS, Type.WATER, -1, [ + [ Species.GOREBYSS, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.RELICANTH, Type.WATER, Type.ROCK, [ + [ Species.RELICANTH, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.LUVDISC, Type.WATER, -1, [ + [ Species.LUVDISC, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.BAGON, Type.DRAGON, -1, [ + [ Species.BAGON, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SHELGON, Type.DRAGON, -1, [ + [ Species.SHELGON, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SALAMENCE, Type.DRAGON, Type.FLYING, [ + [ Species.SALAMENCE, PokemonType.DRAGON, PokemonType.FLYING, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BELDUM, Type.STEEL, Type.PSYCHIC, [ + [ Species.BELDUM, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.RARE ] ] ], - [ Species.METANG, Type.STEEL, Type.PSYCHIC, [ + [ Species.METANG, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.RARE ] ] ], - [ Species.METAGROSS, Type.STEEL, Type.PSYCHIC, [ + [ Species.METAGROSS, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], [ Biome.SPACE, BiomePoolTier.RARE ], [ Biome.SPACE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.REGIROCK, Type.ROCK, -1, [ + [ Species.REGIROCK, PokemonType.ROCK, -1, [ [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGICE, Type.ICE, -1, [ + [ Species.REGICE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGISTEEL, Type.STEEL, -1, [ + [ Species.REGISTEEL, PokemonType.STEEL, -1, [ [ Biome.RUINS, BiomePoolTier.ULTRA_RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.LATIAS, Type.DRAGON, Type.PSYCHIC, [ + [ Species.LATIAS, PokemonType.DRAGON, PokemonType.PSYCHIC, [ [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.LATIOS, Type.DRAGON, Type.PSYCHIC, [ + [ Species.LATIOS, PokemonType.DRAGON, PokemonType.PSYCHIC, [ [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.KYOGRE, Type.WATER, -1, [ + [ Species.KYOGRE, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GROUDON, Type.GROUND, -1, [ + [ Species.GROUDON, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.RAYQUAZA, Type.DRAGON, Type.FLYING, [ + [ Species.RAYQUAZA, PokemonType.DRAGON, PokemonType.FLYING, [ [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.JIRACHI, Type.STEEL, Type.PSYCHIC, [ ] + [ Species.JIRACHI, PokemonType.STEEL, PokemonType.PSYCHIC, [ ] ], - [ Species.DEOXYS, Type.PSYCHIC, -1, [ ] + [ Species.DEOXYS, PokemonType.PSYCHIC, -1, [ ] ], - [ Species.TURTWIG, Type.GRASS, -1, [ + [ Species.TURTWIG, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.RARE ] ] ], - [ Species.GROTLE, Type.GRASS, -1, [ + [ Species.GROTLE, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.RARE ] ] ], - [ Species.TORTERRA, Type.GRASS, Type.GROUND, [ + [ Species.TORTERRA, PokemonType.GRASS, PokemonType.GROUND, [ [ Biome.GRASS, BiomePoolTier.RARE ], [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CHIMCHAR, Type.FIRE, -1, [ + [ Species.CHIMCHAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.MONFERNO, Type.FIRE, Type.FIGHTING, [ + [ Species.MONFERNO, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.INFERNAPE, Type.FIRE, Type.FIGHTING, [ + [ Species.INFERNAPE, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PIPLUP, Type.WATER, -1, [ + [ Species.PIPLUP, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] ] ], - [ Species.PRINPLUP, Type.WATER, -1, [ + [ Species.PRINPLUP, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] ] ], - [ Species.EMPOLEON, Type.WATER, Type.STEEL, [ + [ Species.EMPOLEON, PokemonType.WATER, PokemonType.STEEL, [ [ Biome.SEA, BiomePoolTier.RARE ], [ Biome.SEA, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.STARLY, Type.NORMAL, Type.FLYING, [ + [ Species.STARLY, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.STARAVIA, Type.NORMAL, Type.FLYING, [ + [ Species.STARAVIA, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.STARAPTOR, Type.NORMAL, Type.FLYING, [ + [ Species.STARAPTOR, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BIDOOF, Type.NORMAL, -1, [ + [ Species.BIDOOF, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.COMMON ] ] ], - [ Species.BIBAREL, Type.NORMAL, Type.WATER, [ + [ Species.BIBAREL, PokemonType.NORMAL, PokemonType.WATER, [ [ Biome.PLAINS, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.BOSS ] ] ], - [ Species.KRICKETOT, Type.BUG, -1, [ + [ Species.KRICKETOT, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KRICKETUNE, Type.BUG, -1, [ + [ Species.KRICKETUNE, PokemonType.BUG, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SHINX, Type.ELECTRIC, -1, [ + [ Species.SHINX, PokemonType.ELECTRIC, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.LUXIO, Type.ELECTRIC, -1, [ + [ Species.LUXIO, PokemonType.ELECTRIC, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.LUXRAY, Type.ELECTRIC, -1, [ + [ Species.LUXRAY, PokemonType.ELECTRIC, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.BUDEW, Type.GRASS, Type.POISON, [ ] + [ Species.BUDEW, PokemonType.GRASS, PokemonType.POISON, [ ] ], - [ Species.ROSERADE, Type.GRASS, Type.POISON, [ + [ Species.ROSERADE, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CRANIDOS, Type.ROCK, -1, [ + [ Species.CRANIDOS, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.RAMPARDOS, Type.ROCK, -1, [ + [ Species.RAMPARDOS, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SHIELDON, Type.ROCK, Type.STEEL, [ + [ Species.SHIELDON, PokemonType.ROCK, PokemonType.STEEL, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.BASTIODON, Type.ROCK, Type.STEEL, [ + [ Species.BASTIODON, PokemonType.ROCK, PokemonType.STEEL, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.BURMY, Type.BUG, -1, [ + [ Species.BURMY, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.BEACH, BiomePoolTier.UNCOMMON ], [ Biome.SLUM, BiomePoolTier.UNCOMMON ] ] ], - [ Species.WORMADAM, Type.BUG, Type.GRASS, [ + [ Species.WORMADAM, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ], [ Biome.BEACH, BiomePoolTier.UNCOMMON ], @@ -4021,122 +4035,122 @@ export function initBiomes() { [ Biome.SLUM, BiomePoolTier.BOSS ] ] ], - [ Species.MOTHIM, Type.BUG, Type.FLYING, [ + [ Species.MOTHIM, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.COMBEE, Type.BUG, Type.FLYING, [ + [ Species.COMBEE, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VESPIQUEN, Type.BUG, Type.FLYING, [ + [ Species.VESPIQUEN, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PACHIRISU, Type.ELECTRIC, -1, [ + [ Species.PACHIRISU, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.BUIZEL, Type.WATER, -1, [ + [ Species.BUIZEL, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON ] ] ], - [ Species.FLOATZEL, Type.WATER, -1, [ + [ Species.FLOATZEL, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON ], [ Biome.SEA, BiomePoolTier.BOSS ] ] ], - [ Species.CHERUBI, Type.GRASS, -1, [ + [ Species.CHERUBI, PokemonType.GRASS, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CHERRIM, Type.GRASS, -1, [ + [ Species.CHERRIM, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SHELLOS, Type.WATER, -1, [ + [ Species.SHELLOS, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GASTRODON, Type.WATER, Type.GROUND, [ + [ Species.GASTRODON, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ], [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.AMBIPOM, Type.NORMAL, -1, [ + [ Species.AMBIPOM, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.DRIFLOON, Type.GHOST, Type.FLYING, [ + [ Species.DRIFLOON, PokemonType.GHOST, PokemonType.FLYING, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.DRIFBLIM, Type.GHOST, Type.FLYING, [ + [ Species.DRIFBLIM, PokemonType.GHOST, PokemonType.FLYING, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.BUNEARY, Type.NORMAL, -1, [ + [ Species.BUNEARY, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE ] ] ], - [ Species.LOPUNNY, Type.NORMAL, -1, [ + [ Species.LOPUNNY, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS ] ] ], - [ Species.MISMAGIUS, Type.GHOST, -1, [ + [ Species.MISMAGIUS, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.HONCHKROW, Type.DARK, Type.FLYING, [ + [ Species.HONCHKROW, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.GLAMEOW, Type.NORMAL, -1, [ + [ Species.GLAMEOW, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.MEADOW, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PURUGLY, Type.NORMAL, -1, [ + [ Species.PURUGLY, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.CHINGLING, Type.PSYCHIC, -1, [ + [ Species.CHINGLING, PokemonType.PSYCHIC, -1, [ [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.STUNKY, Type.POISON, Type.DARK, [ + [ Species.STUNKY, PokemonType.POISON, PokemonType.DARK, [ [ Biome.SLUM, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SKUNTANK, Type.POISON, Type.DARK, [ + [ Species.SKUNTANK, PokemonType.POISON, PokemonType.DARK, [ [ Biome.SLUM, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BRONZOR, Type.STEEL, Type.PSYCHIC, [ + [ Species.BRONZOR, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], [ Biome.SPACE, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.BRONZONG, Type.STEEL, Type.PSYCHIC, [ + [ Species.BRONZONG, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], [ Biome.SPACE, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.BOSS ], @@ -4144,186 +4158,186 @@ export function initBiomes() { [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.BONSLY, Type.ROCK, -1, [ ] + [ Species.BONSLY, PokemonType.ROCK, -1, [ ] ], - [ Species.MIME_JR, Type.PSYCHIC, Type.FAIRY, [ ] + [ Species.MIME_JR, PokemonType.PSYCHIC, PokemonType.FAIRY, [ ] ], - [ Species.HAPPINY, Type.NORMAL, -1, [ ] + [ Species.HAPPINY, PokemonType.NORMAL, -1, [ ] ], - [ Species.CHATOT, Type.NORMAL, Type.FLYING, [ + [ Species.CHATOT, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.SPIRITOMB, Type.GHOST, Type.DARK, [ + [ Species.SPIRITOMB, PokemonType.GHOST, PokemonType.DARK, [ [ Biome.GRAVEYARD, BiomePoolTier.SUPER_RARE ], [ Biome.ABYSS, BiomePoolTier.RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.GIBLE, Type.DRAGON, Type.GROUND, [ + [ Species.GIBLE, PokemonType.DRAGON, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.GABITE, Type.DRAGON, Type.GROUND, [ + [ Species.GABITE, PokemonType.DRAGON, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.GARCHOMP, Type.DRAGON, Type.GROUND, [ + [ Species.GARCHOMP, PokemonType.DRAGON, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.MUNCHLAX, Type.NORMAL, -1, [ ] + [ Species.MUNCHLAX, PokemonType.NORMAL, -1, [ ] ], - [ Species.RIOLU, Type.FIGHTING, -1, [ ] + [ Species.RIOLU, PokemonType.FIGHTING, -1, [ ] ], - [ Species.LUCARIO, Type.FIGHTING, Type.STEEL, [ + [ Species.LUCARIO, PokemonType.FIGHTING, PokemonType.STEEL, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.HIPPOPOTAS, Type.GROUND, -1, [ + [ Species.HIPPOPOTAS, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HIPPOWDON, Type.GROUND, -1, [ + [ Species.HIPPOWDON, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SKORUPI, Type.POISON, Type.BUG, [ + [ Species.SKORUPI, PokemonType.POISON, PokemonType.BUG, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.DRAPION, Type.POISON, Type.DARK, [ + [ Species.DRAPION, PokemonType.POISON, PokemonType.DARK, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CROAGUNK, Type.POISON, Type.FIGHTING, [ + [ Species.CROAGUNK, PokemonType.POISON, PokemonType.FIGHTING, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TOXICROAK, Type.POISON, Type.FIGHTING, [ + [ Species.TOXICROAK, PokemonType.POISON, PokemonType.FIGHTING, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.CARNIVINE, Type.GRASS, -1, [ + [ Species.CARNIVINE, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.FINNEON, Type.WATER, -1, [ + [ Species.FINNEON, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] ] ], - [ Species.LUMINEON, Type.WATER, -1, [ + [ Species.LUMINEON, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], [ Biome.SEA, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] ] ], - [ Species.MANTYKE, Type.WATER, Type.FLYING, [ + [ Species.MANTYKE, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.SEABED, BiomePoolTier.RARE ] ] ], - [ Species.SNOVER, Type.GRASS, Type.ICE, [ + [ Species.SNOVER, PokemonType.GRASS, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.ABOMASNOW, Type.GRASS, Type.ICE, [ + [ Species.ABOMASNOW, PokemonType.GRASS, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.WEAVILE, Type.DARK, Type.ICE, [ + [ Species.WEAVILE, PokemonType.DARK, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.MAGNEZONE, Type.ELECTRIC, Type.STEEL, [ + [ Species.MAGNEZONE, PokemonType.ELECTRIC, PokemonType.STEEL, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.LICKILICKY, Type.NORMAL, -1, [ + [ Species.LICKILICKY, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.RHYPERIOR, Type.GROUND, Type.ROCK, [ + [ Species.RHYPERIOR, PokemonType.GROUND, PokemonType.ROCK, [ [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.TANGROWTH, Type.GRASS, -1, [ + [ Species.TANGROWTH, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ELECTIVIRE, Type.ELECTRIC, -1, [ + [ Species.ELECTIVIRE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.MAGMORTAR, Type.FIRE, -1, [ + [ Species.MAGMORTAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.TOGEKISS, Type.FAIRY, Type.FLYING, [ + [ Species.TOGEKISS, PokemonType.FAIRY, PokemonType.FLYING, [ [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.YANMEGA, Type.BUG, Type.FLYING, [ + [ Species.YANMEGA, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.LEAFEON, Type.GRASS, -1, [ + [ Species.LEAFEON, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GLACEON, Type.ICE, -1, [ + [ Species.GLACEON, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GLISCOR, Type.GROUND, Type.FLYING, [ + [ Species.GLISCOR, PokemonType.GROUND, PokemonType.FLYING, [ [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.MAMOSWINE, Type.ICE, Type.GROUND, [ + [ Species.MAMOSWINE, PokemonType.ICE, PokemonType.GROUND, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.PORYGON_Z, Type.NORMAL, -1, [ + [ Species.PORYGON_Z, PokemonType.NORMAL, -1, [ [ Biome.SPACE, BiomePoolTier.BOSS_RARE ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.GALLADE, Type.PSYCHIC, Type.FIGHTING, [ + [ Species.GALLADE, PokemonType.PSYCHIC, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.SUPER_RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PROBOPASS, Type.ROCK, Type.STEEL, [ + [ Species.PROBOPASS, PokemonType.ROCK, PokemonType.STEEL, [ [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.DUSKNOIR, Type.GHOST, -1, [ + [ Species.DUSKNOIR, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.FROSLASS, Type.ICE, Type.GHOST, [ + [ Species.FROSLASS, PokemonType.ICE, PokemonType.GHOST, [ [ Biome.ICE_CAVE, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ROTOM, Type.ELECTRIC, Type.GHOST, [ + [ Species.ROTOM, PokemonType.ELECTRIC, PokemonType.GHOST, [ [ Biome.LABORATORY, BiomePoolTier.SUPER_RARE ], [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ], [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], @@ -4338,104 +4352,104 @@ export function initBiomes() { [ Biome.TALL_GRASS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.UXIE, Type.PSYCHIC, -1, [ + [ Species.UXIE, PokemonType.PSYCHIC, -1, [ [ Biome.CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MESPRIT, Type.PSYCHIC, -1, [ + [ Species.MESPRIT, PokemonType.PSYCHIC, -1, [ [ Biome.LAKE, BiomePoolTier.ULTRA_RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.AZELF, Type.PSYCHIC, -1, [ + [ Species.AZELF, PokemonType.PSYCHIC, -1, [ [ Biome.SWAMP, BiomePoolTier.ULTRA_RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.DIALGA, Type.STEEL, Type.DRAGON, [ + [ Species.DIALGA, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.PALKIA, Type.WATER, Type.DRAGON, [ + [ Species.PALKIA, PokemonType.WATER, PokemonType.DRAGON, [ [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.HEATRAN, Type.FIRE, Type.STEEL, [ + [ Species.HEATRAN, PokemonType.FIRE, PokemonType.STEEL, [ [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGIGIGAS, Type.NORMAL, -1, [ + [ Species.REGIGIGAS, PokemonType.NORMAL, -1, [ [ Biome.TEMPLE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GIRATINA, Type.GHOST, Type.DRAGON, [ + [ Species.GIRATINA, PokemonType.GHOST, PokemonType.DRAGON, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.CRESSELIA, Type.PSYCHIC, -1, [ + [ Species.CRESSELIA, PokemonType.PSYCHIC, -1, [ [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.PHIONE, Type.WATER, -1, [ ] + [ Species.PHIONE, PokemonType.WATER, -1, [ ] ], - [ Species.MANAPHY, Type.WATER, -1, [ ] + [ Species.MANAPHY, PokemonType.WATER, -1, [ ] ], - [ Species.DARKRAI, Type.DARK, -1, [ + [ Species.DARKRAI, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.ULTRA_RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.SHAYMIN, Type.GRASS, -1, [ + [ Species.SHAYMIN, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ARCEUS, Type.NORMAL, -1, [ ] + [ Species.ARCEUS, PokemonType.NORMAL, -1, [ ] ], - [ Species.VICTINI, Type.PSYCHIC, Type.FIRE, [ ] + [ Species.VICTINI, PokemonType.PSYCHIC, PokemonType.FIRE, [ ] ], - [ Species.SNIVY, Type.GRASS, -1, [ + [ Species.SNIVY, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.SERVINE, Type.GRASS, -1, [ + [ Species.SERVINE, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.SERPERIOR, Type.GRASS, -1, [ + [ Species.SERPERIOR, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TEPIG, Type.FIRE, -1, [ + [ Species.TEPIG, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.PIGNITE, Type.FIRE, Type.FIGHTING, [ + [ Species.PIGNITE, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.EMBOAR, Type.FIRE, Type.FIGHTING, [ + [ Species.EMBOAR, PokemonType.FIRE, PokemonType.FIGHTING, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.OSHAWOTT, Type.WATER, -1, [ + [ Species.OSHAWOTT, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.DEWOTT, Type.WATER, -1, [ + [ Species.DEWOTT, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.SAMUROTT, Type.WATER, -1, [ + [ Species.SAMUROTT, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PATRAT, Type.NORMAL, -1, [ + [ Species.PATRAT, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], @@ -4443,437 +4457,437 @@ export function initBiomes() { [ Biome.SLUM, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.WATCHOG, Type.NORMAL, -1, [ + [ Species.WATCHOG, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.LILLIPUP, Type.NORMAL, -1, [ + [ Species.LILLIPUP, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.METROPOLIS, BiomePoolTier.COMMON ] ] ], - [ Species.HERDIER, Type.NORMAL, -1, [ + [ Species.HERDIER, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ] ] ], - [ Species.STOUTLAND, Type.NORMAL, -1, [ + [ Species.STOUTLAND, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ], [ Biome.METROPOLIS, BiomePoolTier.BOSS ] ] ], - [ Species.PURRLOIN, Type.DARK, -1, [ + [ Species.PURRLOIN, PokemonType.DARK, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.LIEPARD, Type.DARK, -1, [ + [ Species.LIEPARD, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PANSAGE, Type.GRASS, -1, [ + [ Species.PANSAGE, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SIMISAGE, Type.GRASS, -1, [ + [ Species.SIMISAGE, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PANSEAR, Type.FIRE, -1, [ + [ Species.PANSEAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SIMISEAR, Type.FIRE, -1, [ + [ Species.SIMISEAR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PANPOUR, Type.WATER, -1, [ + [ Species.PANPOUR, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SIMIPOUR, Type.WATER, -1, [ + [ Species.SIMIPOUR, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SEA, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MUNNA, Type.PSYCHIC, -1, [ + [ Species.MUNNA, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.COMMON ] ] ], - [ Species.MUSHARNA, Type.PSYCHIC, -1, [ + [ Species.MUSHARNA, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.BOSS ] ] ], - [ Species.PIDOVE, Type.NORMAL, Type.FLYING, [ + [ Species.PIDOVE, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TRANQUILL, Type.NORMAL, Type.FLYING, [ + [ Species.TRANQUILL, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.UNFEZANT, Type.NORMAL, Type.FLYING, [ + [ Species.UNFEZANT, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BLITZLE, Type.ELECTRIC, -1, [ + [ Species.BLITZLE, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.ZEBSTRIKA, Type.ELECTRIC, -1, [ + [ Species.ZEBSTRIKA, PokemonType.ELECTRIC, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.ROGGENROLA, Type.ROCK, -1, [ + [ Species.ROGGENROLA, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.BOLDORE, Type.ROCK, -1, [ + [ Species.BOLDORE, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.GIGALITH, Type.ROCK, -1, [ + [ Species.GIGALITH, PokemonType.ROCK, -1, [ [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.WOOBAT, Type.PSYCHIC, Type.FLYING, [ + [ Species.WOOBAT, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.SWOOBAT, Type.PSYCHIC, Type.FLYING, [ + [ Species.SWOOBAT, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.DRILBUR, Type.GROUND, -1, [ + [ Species.DRILBUR, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.EXCADRILL, Type.GROUND, Type.STEEL, [ + [ Species.EXCADRILL, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.BADLANDS, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.AUDINO, Type.NORMAL, -1, [ + [ Species.AUDINO, PokemonType.NORMAL, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.TIMBURR, Type.FIGHTING, -1, [ + [ Species.TIMBURR, PokemonType.FIGHTING, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.GURDURR, Type.FIGHTING, -1, [ + [ Species.GURDURR, PokemonType.FIGHTING, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] ] ], - [ Species.CONKELDURR, Type.FIGHTING, -1, [ + [ Species.CONKELDURR, PokemonType.FIGHTING, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] ] ], - [ Species.TYMPOLE, Type.WATER, -1, [ + [ Species.TYMPOLE, PokemonType.WATER, -1, [ [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.PALPITOAD, Type.WATER, Type.GROUND, [ + [ Species.PALPITOAD, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON ] ] ], - [ Species.SEISMITOAD, Type.WATER, Type.GROUND, [ + [ Species.SEISMITOAD, PokemonType.WATER, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.THROH, Type.FIGHTING, -1, [ + [ Species.THROH, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.SAWK, Type.FIGHTING, -1, [ + [ Species.SAWK, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.SEWADDLE, Type.BUG, Type.GRASS, [ + [ Species.SEWADDLE, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SWADLOON, Type.BUG, Type.GRASS, [ + [ Species.SWADLOON, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LEAVANNY, Type.BUG, Type.GRASS, [ + [ Species.LEAVANNY, PokemonType.BUG, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VENIPEDE, Type.BUG, Type.POISON, [ + [ Species.VENIPEDE, PokemonType.BUG, PokemonType.POISON, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.WHIRLIPEDE, Type.BUG, Type.POISON, [ + [ Species.WHIRLIPEDE, PokemonType.BUG, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SCOLIPEDE, Type.BUG, Type.POISON, [ + [ Species.SCOLIPEDE, PokemonType.BUG, PokemonType.POISON, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.COTTONEE, Type.GRASS, Type.FAIRY, [ + [ Species.COTTONEE, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WHIMSICOTT, Type.GRASS, Type.FAIRY, [ + [ Species.WHIMSICOTT, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PETILIL, Type.GRASS, -1, [ + [ Species.PETILIL, PokemonType.GRASS, -1, [ [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LILLIGANT, Type.GRASS, -1, [ + [ Species.LILLIGANT, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BASCULIN, Type.WATER, -1, [ + [ Species.BASCULIN, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.SANDILE, Type.GROUND, Type.DARK, [ + [ Species.SANDILE, PokemonType.GROUND, PokemonType.DARK, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KROKOROK, Type.GROUND, Type.DARK, [ + [ Species.KROKOROK, PokemonType.GROUND, PokemonType.DARK, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.KROOKODILE, Type.GROUND, Type.DARK, [ + [ Species.KROOKODILE, PokemonType.GROUND, PokemonType.DARK, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DARUMAKA, Type.FIRE, -1, [ + [ Species.DARUMAKA, PokemonType.FIRE, -1, [ [ Biome.DESERT, BiomePoolTier.RARE ] ] ], - [ Species.DARMANITAN, Type.FIRE, -1, [ + [ Species.DARMANITAN, PokemonType.FIRE, -1, [ [ Biome.DESERT, BiomePoolTier.RARE ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.MARACTUS, Type.GRASS, -1, [ + [ Species.MARACTUS, PokemonType.GRASS, -1, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.DWEBBLE, Type.BUG, Type.ROCK, [ + [ Species.DWEBBLE, PokemonType.BUG, PokemonType.ROCK, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.CRUSTLE, Type.BUG, Type.ROCK, [ + [ Species.CRUSTLE, PokemonType.BUG, PokemonType.ROCK, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.SCRAGGY, Type.DARK, Type.FIGHTING, [ + [ Species.SCRAGGY, PokemonType.DARK, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.UNCOMMON ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SCRAFTY, Type.DARK, Type.FIGHTING, [ + [ Species.SCRAFTY, PokemonType.DARK, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SIGILYPH, Type.PSYCHIC, Type.FLYING, [ + [ Species.SIGILYPH, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.RUINS, BiomePoolTier.UNCOMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ], [ Biome.SPACE, BiomePoolTier.RARE ] ] ], - [ Species.YAMASK, Type.GHOST, -1, [ + [ Species.YAMASK, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.COFAGRIGUS, Type.GHOST, -1, [ + [ Species.COFAGRIGUS, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.TEMPLE, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.BOSS ] ] ], - [ Species.TIRTOUGA, Type.WATER, Type.ROCK, [ + [ Species.TIRTOUGA, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.SEA, BiomePoolTier.SUPER_RARE ], [ Biome.BEACH, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.CARRACOSTA, Type.WATER, Type.ROCK, [ + [ Species.CARRACOSTA, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.SEA, BiomePoolTier.SUPER_RARE ], [ Biome.BEACH, BiomePoolTier.SUPER_RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ARCHEN, Type.ROCK, Type.FLYING, [ + [ Species.ARCHEN, PokemonType.ROCK, PokemonType.FLYING, [ [ Biome.RUINS, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.ARCHEOPS, Type.ROCK, Type.FLYING, [ + [ Species.ARCHEOPS, PokemonType.ROCK, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.RUINS, BiomePoolTier.SUPER_RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TRUBBISH, Type.POISON, -1, [ + [ Species.TRUBBISH, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ] ] ], - [ Species.GARBODOR, Type.POISON, -1, [ + [ Species.GARBODOR, PokemonType.POISON, -1, [ [ Biome.SLUM, BiomePoolTier.COMMON ], [ Biome.SLUM, BiomePoolTier.BOSS ] ] ], - [ Species.ZORUA, Type.DARK, -1, [ + [ Species.ZORUA, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.RARE ] ] ], - [ Species.ZOROARK, Type.DARK, -1, [ + [ Species.ZOROARK, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.MINCCINO, Type.NORMAL, -1, [ + [ Species.MINCCINO, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CINCCINO, Type.NORMAL, -1, [ + [ Species.CINCCINO, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GOTHITA, Type.PSYCHIC, -1, [ + [ Species.GOTHITA, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ] ] ], - [ Species.GOTHORITA, Type.PSYCHIC, -1, [ + [ Species.GOTHORITA, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ] ] ], - [ Species.GOTHITELLE, Type.PSYCHIC, -1, [ + [ Species.GOTHITELLE, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.SOLOSIS, Type.PSYCHIC, -1, [ + [ Species.SOLOSIS, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.RARE ], [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ] ] ], - [ Species.DUOSION, Type.PSYCHIC, -1, [ + [ Species.DUOSION, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.RARE ], [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ] ] ], - [ Species.REUNICLUS, Type.PSYCHIC, -1, [ + [ Species.REUNICLUS, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.RARE ], [ Biome.SPACE, BiomePoolTier.BOSS ], [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.DUCKLETT, Type.WATER, Type.FLYING, [ + [ Species.DUCKLETT, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SWANNA, Type.WATER, Type.FLYING, [ + [ Species.SWANNA, PokemonType.WATER, PokemonType.FLYING, [ [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VANILLITE, Type.ICE, -1, [ + [ Species.VANILLITE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.VANILLISH, Type.ICE, -1, [ + [ Species.VANILLISH, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.VANILLUXE, Type.ICE, -1, [ + [ Species.VANILLUXE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.DEERLING, Type.NORMAL, Type.GRASS, [ + [ Species.DEERLING, PokemonType.NORMAL, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SAWSBUCK, Type.NORMAL, Type.GRASS, [ + [ Species.SAWSBUCK, PokemonType.NORMAL, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.EMOLGA, Type.ELECTRIC, Type.FLYING, [ + [ Species.EMOLGA, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KARRABLAST, Type.BUG, -1, [ + [ Species.KARRABLAST, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.ESCAVALIER, Type.BUG, Type.STEEL, [ + [ Species.ESCAVALIER, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FOONGUS, Type.GRASS, Type.POISON, [ + [ Species.FOONGUS, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.AMOONGUSS, Type.GRASS, Type.POISON, [ + [ Species.AMOONGUSS, PokemonType.GRASS, PokemonType.POISON, [ [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], @@ -4881,712 +4895,712 @@ export function initBiomes() { [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FRILLISH, Type.WATER, Type.GHOST, [ + [ Species.FRILLISH, PokemonType.WATER, PokemonType.GHOST, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.JELLICENT, Type.WATER, Type.GHOST, [ + [ Species.JELLICENT, PokemonType.WATER, PokemonType.GHOST, [ [ Biome.SEABED, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.ALOMOMOLA, Type.WATER, -1, [ + [ Species.ALOMOMOLA, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.JOLTIK, Type.BUG, Type.ELECTRIC, [ + [ Species.JOLTIK, PokemonType.BUG, PokemonType.ELECTRIC, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GALVANTULA, Type.BUG, Type.ELECTRIC, [ + [ Species.GALVANTULA, PokemonType.BUG, PokemonType.ELECTRIC, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.FERROSEED, Type.GRASS, Type.STEEL, [ + [ Species.FERROSEED, PokemonType.GRASS, PokemonType.STEEL, [ [ Biome.CAVE, BiomePoolTier.RARE ] ] ], - [ Species.FERROTHORN, Type.GRASS, Type.STEEL, [ + [ Species.FERROTHORN, PokemonType.GRASS, PokemonType.STEEL, [ [ Biome.CAVE, BiomePoolTier.RARE ], [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KLINK, Type.STEEL, -1, [ + [ Species.KLINK, PokemonType.STEEL, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.KLANG, Type.STEEL, -1, [ + [ Species.KLANG, PokemonType.STEEL, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.COMMON ] ] ], - [ Species.KLINKLANG, Type.STEEL, -1, [ + [ Species.KLINKLANG, PokemonType.STEEL, -1, [ [ Biome.FACTORY, BiomePoolTier.COMMON ], [ Biome.FACTORY, BiomePoolTier.BOSS ], [ Biome.LABORATORY, BiomePoolTier.COMMON ], [ Biome.LABORATORY, BiomePoolTier.BOSS ] ] ], - [ Species.TYNAMO, Type.ELECTRIC, -1, [ + [ Species.TYNAMO, PokemonType.ELECTRIC, -1, [ [ Biome.SEABED, BiomePoolTier.RARE ] ] ], - [ Species.EELEKTRIK, Type.ELECTRIC, -1, [ + [ Species.EELEKTRIK, PokemonType.ELECTRIC, -1, [ [ Biome.SEABED, BiomePoolTier.RARE ] ] ], - [ Species.EELEKTROSS, Type.ELECTRIC, -1, [ + [ Species.EELEKTROSS, PokemonType.ELECTRIC, -1, [ [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ELGYEM, Type.PSYCHIC, -1, [ + [ Species.ELGYEM, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.BEHEEYEM, Type.PSYCHIC, -1, [ + [ Species.BEHEEYEM, PokemonType.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ], [ Biome.SPACE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.LITWICK, Type.GHOST, Type.FIRE, [ + [ Species.LITWICK, PokemonType.GHOST, PokemonType.FIRE, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.LAMPENT, Type.GHOST, Type.FIRE, [ + [ Species.LAMPENT, PokemonType.GHOST, PokemonType.FIRE, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CHANDELURE, Type.GHOST, Type.FIRE, [ + [ Species.CHANDELURE, PokemonType.GHOST, PokemonType.FIRE, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.AXEW, Type.DRAGON, -1, [ + [ Species.AXEW, PokemonType.DRAGON, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.FRAXURE, Type.DRAGON, -1, [ + [ Species.FRAXURE, PokemonType.DRAGON, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.COMMON ] ] ], - [ Species.HAXORUS, Type.DRAGON, -1, [ + [ Species.HAXORUS, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.CUBCHOO, Type.ICE, -1, [ + [ Species.CUBCHOO, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.BEARTIC, Type.ICE, -1, [ + [ Species.BEARTIC, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.CRYOGONAL, Type.ICE, -1, [ + [ Species.CRYOGONAL, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SHELMET, Type.BUG, -1, [ + [ Species.SHELMET, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.ACCELGOR, Type.BUG, -1, [ + [ Species.ACCELGOR, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.STUNFISK, Type.GROUND, Type.ELECTRIC, [ + [ Species.STUNFISK, PokemonType.GROUND, PokemonType.ELECTRIC, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.MIENFOO, Type.FIGHTING, -1, [ + [ Species.MIENFOO, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.UNCOMMON ] ] ], - [ Species.MIENSHAO, Type.FIGHTING, -1, [ + [ Species.MIENSHAO, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.UNCOMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.DRUDDIGON, Type.DRAGON, -1, [ + [ Species.DRUDDIGON, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GOLETT, Type.GROUND, Type.GHOST, [ + [ Species.GOLETT, PokemonType.GROUND, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.GOLURK, Type.GROUND, Type.GHOST, [ + [ Species.GOLURK, PokemonType.GROUND, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.COMMON ], [ Biome.TEMPLE, BiomePoolTier.BOSS ] ] ], - [ Species.PAWNIARD, Type.DARK, Type.STEEL, [ + [ Species.PAWNIARD, PokemonType.DARK, PokemonType.STEEL, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.BISHARP, Type.DARK, Type.STEEL, [ + [ Species.BISHARP, PokemonType.DARK, PokemonType.STEEL, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.BOUFFALANT, Type.NORMAL, -1, [ + [ Species.BOUFFALANT, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.RUFFLET, Type.NORMAL, Type.FLYING, [ + [ Species.RUFFLET, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BRAVIARY, Type.NORMAL, Type.FLYING, [ + [ Species.BRAVIARY, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VULLABY, Type.DARK, Type.FLYING, [ + [ Species.VULLABY, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MANDIBUZZ, Type.DARK, Type.FLYING, [ + [ Species.MANDIBUZZ, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.HEATMOR, Type.FIRE, -1, [ + [ Species.HEATMOR, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.DURANT, Type.BUG, Type.STEEL, [ + [ Species.DURANT, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.FOREST, BiomePoolTier.SUPER_RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DEINO, Type.DARK, Type.DRAGON, [ + [ Species.DEINO, PokemonType.DARK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ABYSS, BiomePoolTier.RARE ] ] ], - [ Species.ZWEILOUS, Type.DARK, Type.DRAGON, [ + [ Species.ZWEILOUS, PokemonType.DARK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ABYSS, BiomePoolTier.RARE ] ] ], - [ Species.HYDREIGON, Type.DARK, Type.DRAGON, [ + [ Species.HYDREIGON, PokemonType.DARK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ABYSS, BiomePoolTier.RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.LARVESTA, Type.BUG, Type.FIRE, [ + [ Species.LARVESTA, PokemonType.BUG, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.VOLCARONA, Type.BUG, Type.FIRE, [ + [ Species.VOLCARONA, PokemonType.BUG, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.COBALION, Type.STEEL, Type.FIGHTING, [ + [ Species.COBALION, PokemonType.STEEL, PokemonType.FIGHTING, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.ULTRA_RARE ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TERRAKION, Type.ROCK, Type.FIGHTING, [ + [ Species.TERRAKION, PokemonType.ROCK, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.VIRIZION, Type.GRASS, Type.FIGHTING, [ + [ Species.VIRIZION, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.GRASS, BiomePoolTier.ULTRA_RARE ], [ Biome.GRASS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TORNADUS, Type.FLYING, -1, [ + [ Species.TORNADUS, PokemonType.FLYING, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.THUNDURUS, Type.ELECTRIC, Type.FLYING, [ + [ Species.THUNDURUS, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.RESHIRAM, Type.DRAGON, Type.FIRE, [ + [ Species.RESHIRAM, PokemonType.DRAGON, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ZEKROM, Type.DRAGON, Type.ELECTRIC, [ + [ Species.ZEKROM, PokemonType.DRAGON, PokemonType.ELECTRIC, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.LANDORUS, Type.GROUND, Type.FLYING, [ + [ Species.LANDORUS, PokemonType.GROUND, PokemonType.FLYING, [ [ Biome.BADLANDS, BiomePoolTier.ULTRA_RARE ], [ Biome.BADLANDS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.KYUREM, Type.DRAGON, Type.ICE, [ + [ Species.KYUREM, PokemonType.DRAGON, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.KELDEO, Type.WATER, Type.FIGHTING, [ + [ Species.KELDEO, PokemonType.WATER, PokemonType.FIGHTING, [ [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MELOETTA, Type.NORMAL, Type.PSYCHIC, [ + [ Species.MELOETTA, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.MEADOW, BiomePoolTier.ULTRA_RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.GENESECT, Type.BUG, Type.STEEL, [ + [ Species.GENESECT, PokemonType.BUG, PokemonType.STEEL, [ [ Biome.FACTORY, BiomePoolTier.ULTRA_RARE ], [ Biome.FACTORY, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CHESPIN, Type.GRASS, -1, [ + [ Species.CHESPIN, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.QUILLADIN, Type.GRASS, -1, [ + [ Species.QUILLADIN, PokemonType.GRASS, -1, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.CHESNAUGHT, Type.GRASS, Type.FIGHTING, [ + [ Species.CHESNAUGHT, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FENNEKIN, Type.FIRE, -1, [ + [ Species.FENNEKIN, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.BRAIXEN, Type.FIRE, -1, [ + [ Species.BRAIXEN, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.DELPHOX, Type.FIRE, Type.PSYCHIC, [ + [ Species.DELPHOX, PokemonType.FIRE, PokemonType.PSYCHIC, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FROAKIE, Type.WATER, -1, [ + [ Species.FROAKIE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.FROGADIER, Type.WATER, -1, [ + [ Species.FROGADIER, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.GRENINJA, Type.WATER, Type.DARK, [ + [ Species.GRENINJA, PokemonType.WATER, PokemonType.DARK, [ [ Biome.LAKE, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.BUNNELBY, Type.NORMAL, -1, [ + [ Species.BUNNELBY, PokemonType.NORMAL, -1, [ [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.DIGGERSBY, Type.NORMAL, Type.GROUND, [ + [ Species.DIGGERSBY, PokemonType.NORMAL, PokemonType.GROUND, [ [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.FLETCHLING, Type.NORMAL, Type.FLYING, [ + [ Species.FLETCHLING, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FLETCHINDER, Type.FIRE, Type.FLYING, [ + [ Species.FLETCHINDER, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TALONFLAME, Type.FIRE, Type.FLYING, [ + [ Species.TALONFLAME, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SCATTERBUG, Type.BUG, -1, [ + [ Species.SCATTERBUG, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SPEWPA, Type.BUG, -1, [ + [ Species.SPEWPA, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VIVILLON, Type.BUG, Type.FLYING, [ + [ Species.VIVILLON, PokemonType.BUG, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.LITLEO, Type.FIRE, Type.NORMAL, [ + [ Species.LITLEO, PokemonType.FIRE, PokemonType.NORMAL, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PYROAR, Type.FIRE, Type.NORMAL, [ + [ Species.PYROAR, PokemonType.FIRE, PokemonType.NORMAL, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.FLABEBE, Type.FAIRY, -1, [ + [ Species.FLABEBE, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.FLOETTE, Type.FAIRY, -1, [ + [ Species.FLOETTE, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.FLORGES, Type.FAIRY, -1, [ + [ Species.FLORGES, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.SKIDDO, Type.GRASS, -1, [ + [ Species.SKIDDO, PokemonType.GRASS, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] ] ], - [ Species.GOGOAT, Type.GRASS, -1, [ + [ Species.GOGOAT, PokemonType.GRASS, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] ] ], - [ Species.PANCHAM, Type.FIGHTING, -1, [ + [ Species.PANCHAM, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PANGORO, Type.FIGHTING, Type.DARK, [ + [ Species.PANGORO, PokemonType.FIGHTING, PokemonType.DARK, [ [ Biome.DOJO, BiomePoolTier.RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_RARE ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FURFROU, Type.NORMAL, -1, [ + [ Species.FURFROU, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.BOSS ] ] ], - [ Species.ESPURR, Type.PSYCHIC, -1, [ + [ Species.ESPURR, PokemonType.PSYCHIC, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MEOWSTIC, Type.PSYCHIC, -1, [ + [ Species.MEOWSTIC, PokemonType.PSYCHIC, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.METROPOLIS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.HONEDGE, Type.STEEL, Type.GHOST, [ + [ Species.HONEDGE, PokemonType.STEEL, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.DOUBLADE, Type.STEEL, Type.GHOST, [ + [ Species.DOUBLADE, PokemonType.STEEL, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.COMMON ] ] ], - [ Species.AEGISLASH, Type.STEEL, Type.GHOST, [ + [ Species.AEGISLASH, PokemonType.STEEL, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.BOSS ] ] ], - [ Species.SPRITZEE, Type.FAIRY, -1, [ + [ Species.SPRITZEE, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.AROMATISSE, Type.FAIRY, -1, [ + [ Species.AROMATISSE, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SWIRLIX, Type.FAIRY, -1, [ + [ Species.SWIRLIX, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.SLURPUFF, Type.FAIRY, -1, [ + [ Species.SLURPUFF, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.INKAY, Type.DARK, Type.PSYCHIC, [ + [ Species.INKAY, PokemonType.DARK, PokemonType.PSYCHIC, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MALAMAR, Type.DARK, Type.PSYCHIC, [ + [ Species.MALAMAR, PokemonType.DARK, PokemonType.PSYCHIC, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BINACLE, Type.ROCK, Type.WATER, [ + [ Species.BINACLE, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.BARBARACLE, Type.ROCK, Type.WATER, [ + [ Species.BARBARACLE, PokemonType.ROCK, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.SKRELP, Type.POISON, Type.WATER, [ + [ Species.SKRELP, PokemonType.POISON, PokemonType.WATER, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.DRAGALGE, Type.POISON, Type.DRAGON, [ + [ Species.DRAGALGE, PokemonType.POISON, PokemonType.DRAGON, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.CLAUNCHER, Type.WATER, -1, [ + [ Species.CLAUNCHER, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CLAWITZER, Type.WATER, -1, [ + [ Species.CLAWITZER, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.UNCOMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.HELIOPTILE, Type.ELECTRIC, Type.NORMAL, [ + [ Species.HELIOPTILE, PokemonType.ELECTRIC, PokemonType.NORMAL, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HELIOLISK, Type.ELECTRIC, Type.NORMAL, [ + [ Species.HELIOLISK, PokemonType.ELECTRIC, PokemonType.NORMAL, [ [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TYRUNT, Type.ROCK, Type.DRAGON, [ + [ Species.TYRUNT, PokemonType.ROCK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.TYRANTRUM, Type.ROCK, Type.DRAGON, [ + [ Species.TYRANTRUM, PokemonType.ROCK, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.AMAURA, Type.ROCK, Type.ICE, [ + [ Species.AMAURA, PokemonType.ROCK, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.AURORUS, Type.ROCK, Type.ICE, [ + [ Species.AURORUS, PokemonType.ROCK, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SYLVEON, Type.FAIRY, -1, [ + [ Species.SYLVEON, PokemonType.FAIRY, -1, [ [ Biome.MEADOW, BiomePoolTier.SUPER_RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HAWLUCHA, Type.FIGHTING, Type.FLYING, [ + [ Species.HAWLUCHA, PokemonType.FIGHTING, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DEDENNE, Type.ELECTRIC, Type.FAIRY, [ + [ Species.DEDENNE, PokemonType.ELECTRIC, PokemonType.FAIRY, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.CARBINK, Type.ROCK, Type.FAIRY, [ + [ Species.CARBINK, PokemonType.ROCK, PokemonType.FAIRY, [ [ Biome.CAVE, BiomePoolTier.RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.GOOMY, Type.DRAGON, -1, [ + [ Species.GOOMY, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SLIGGOO, Type.DRAGON, -1, [ + [ Species.SLIGGOO, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GOODRA, Type.DRAGON, -1, [ + [ Species.GOODRA, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.KLEFKI, Type.STEEL, Type.FAIRY, [ + [ Species.KLEFKI, PokemonType.STEEL, PokemonType.FAIRY, [ [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], [ Biome.FACTORY, BiomePoolTier.BOSS ] ] ], - [ Species.PHANTUMP, Type.GHOST, Type.GRASS, [ + [ Species.PHANTUMP, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.TREVENANT, Type.GHOST, Type.GRASS, [ + [ Species.TREVENANT, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.PUMPKABOO, Type.GHOST, Type.GRASS, [ + [ Species.PUMPKABOO, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.GOURGEIST, Type.GHOST, Type.GRASS, [ + [ Species.GOURGEIST, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.BERGMITE, Type.ICE, -1, [ + [ Species.BERGMITE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.AVALUGG, Type.ICE, -1, [ + [ Species.AVALUGG, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.NOIBAT, Type.FLYING, Type.DRAGON, [ + [ Species.NOIBAT, PokemonType.FLYING, PokemonType.DRAGON, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.NOIVERN, Type.FLYING, Type.DRAGON, [ + [ Species.NOIVERN, PokemonType.FLYING, PokemonType.DRAGON, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.XERNEAS, Type.FAIRY, -1, [ + [ Species.XERNEAS, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.YVELTAL, Type.DARK, Type.FLYING, [ + [ Species.YVELTAL, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ZYGARDE, Type.DRAGON, Type.GROUND, [ + [ Species.ZYGARDE, PokemonType.DRAGON, PokemonType.GROUND, [ [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.DIANCIE, Type.ROCK, Type.FAIRY, [ + [ Species.DIANCIE, PokemonType.ROCK, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.HOOPA, Type.PSYCHIC, Type.GHOST, [ + [ Species.HOOPA, PokemonType.PSYCHIC, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], [ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.VOLCANION, Type.FIRE, Type.WATER, [ + [ Species.VOLCANION, PokemonType.FIRE, PokemonType.WATER, [ [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ROWLET, Type.GRASS, Type.FLYING, [ + [ Species.ROWLET, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.DARTRIX, Type.GRASS, Type.FLYING, [ + [ Species.DARTRIX, PokemonType.GRASS, PokemonType.FLYING, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.DECIDUEYE, Type.GRASS, Type.GHOST, [ + [ Species.DECIDUEYE, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.LITTEN, Type.FIRE, -1, [ + [ Species.LITTEN, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.TORRACAT, Type.FIRE, -1, [ + [ Species.TORRACAT, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.INCINEROAR, Type.FIRE, Type.DARK, [ + [ Species.INCINEROAR, PokemonType.FIRE, PokemonType.DARK, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.POPPLIO, Type.WATER, -1, [ + [ Species.POPPLIO, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] ] ], - [ Species.BRIONNE, Type.WATER, -1, [ + [ Species.BRIONNE, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] ] ], - [ Species.PRIMARINA, Type.WATER, Type.FAIRY, [ + [ Species.PRIMARINA, PokemonType.WATER, PokemonType.FAIRY, [ [ Biome.SEA, BiomePoolTier.RARE ], [ Biome.SEA, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PIKIPEK, Type.NORMAL, Type.FLYING, [ + [ Species.PIKIPEK, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.TRUMBEAK, Type.NORMAL, Type.FLYING, [ + [ Species.TRUMBEAK, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ Species.TOUCANNON, Type.NORMAL, Type.FLYING, [ + [ Species.TOUCANNON, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.JUNGLE, BiomePoolTier.COMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.YUNGOOS, Type.NORMAL, -1, [ + [ Species.YUNGOOS, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GUMSHOOS, Type.NORMAL, -1, [ + [ Species.GUMSHOOS, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GRUBBIN, Type.BUG, -1, [ + [ Species.GRUBBIN, PokemonType.BUG, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.CHARJABUG, Type.BUG, Type.ELECTRIC, [ + [ Species.CHARJABUG, PokemonType.BUG, PokemonType.ELECTRIC, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.VIKAVOLT, Type.BUG, Type.ELECTRIC, [ + [ Species.VIKAVOLT, PokemonType.BUG, PokemonType.ELECTRIC, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.CRABRAWLER, Type.FIGHTING, -1, [ + [ Species.CRABRAWLER, PokemonType.FIGHTING, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.CRABOMINABLE, Type.FIGHTING, Type.ICE, [ + [ Species.CRABOMINABLE, PokemonType.FIGHTING, PokemonType.ICE, [ [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ORICORIO, Type.FIRE, Type.FLYING, [ + [ Species.ORICORIO, PokemonType.FIRE, PokemonType.FLYING, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.CUTIEFLY, Type.BUG, Type.FAIRY, [ + [ Species.CUTIEFLY, PokemonType.BUG, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.RIBOMBEE, Type.BUG, Type.FAIRY, [ + [ Species.RIBOMBEE, PokemonType.BUG, PokemonType.FAIRY, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ], [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ROCKRUFF, Type.ROCK, -1, [ + [ Species.ROCKRUFF, PokemonType.ROCK, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], [ Biome.CAVE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ] ] ], - [ Species.LYCANROC, Type.ROCK, -1, [ + [ Species.LYCANROC, PokemonType.ROCK, -1, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, TimeOfDay.DAY ], [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], @@ -5595,1529 +5609,1529 @@ export function initBiomes() { [ Biome.CAVE, BiomePoolTier.BOSS_RARE, TimeOfDay.DUSK ] ] ], - [ Species.WISHIWASHI, Type.WATER, -1, [ + [ Species.WISHIWASHI, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.MAREANIE, Type.POISON, Type.WATER, [ + [ Species.MAREANIE, PokemonType.POISON, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.SWAMP, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TOXAPEX, Type.POISON, Type.WATER, [ + [ Species.TOXAPEX, PokemonType.POISON, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.COMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ], [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.SWAMP, BiomePoolTier.BOSS ] ] ], - [ Species.MUDBRAY, Type.GROUND, -1, [ + [ Species.MUDBRAY, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ] ] ], - [ Species.MUDSDALE, Type.GROUND, -1, [ + [ Species.MUDSDALE, PokemonType.GROUND, -1, [ [ Biome.BADLANDS, BiomePoolTier.COMMON ], [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.DEWPIDER, Type.WATER, Type.BUG, [ + [ Species.DEWPIDER, PokemonType.WATER, PokemonType.BUG, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ARAQUANID, Type.WATER, Type.BUG, [ + [ Species.ARAQUANID, PokemonType.WATER, PokemonType.BUG, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FOMANTIS, Type.GRASS, -1, [ + [ Species.FOMANTIS, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.LURANTIS, Type.GRASS, -1, [ + [ Species.LURANTIS, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ], [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.MORELULL, Type.GRASS, Type.FAIRY, [ + [ Species.MORELULL, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.SHIINOTIC, Type.GRASS, Type.FAIRY, [ + [ Species.SHIINOTIC, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SALANDIT, Type.POISON, Type.FIRE, [ + [ Species.SALANDIT, PokemonType.POISON, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.SALAZZLE, Type.POISON, Type.FIRE, [ + [ Species.SALAZZLE, PokemonType.POISON, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.STUFFUL, Type.NORMAL, Type.FIGHTING, [ + [ Species.STUFFUL, PokemonType.NORMAL, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.BEWEAR, Type.NORMAL, Type.FIGHTING, [ + [ Species.BEWEAR, PokemonType.NORMAL, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.BOUNSWEET, Type.GRASS, -1, [ + [ Species.BOUNSWEET, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.STEENEE, Type.GRASS, -1, [ + [ Species.STEENEE, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TSAREENA, Type.GRASS, -1, [ + [ Species.TSAREENA, PokemonType.GRASS, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.COMFEY, Type.FAIRY, -1, [ + [ Species.COMFEY, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.ORANGURU, Type.NORMAL, Type.PSYCHIC, [ + [ Species.ORANGURU, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PASSIMIAN, Type.FIGHTING, -1, [ + [ Species.PASSIMIAN, PokemonType.FIGHTING, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.WIMPOD, Type.BUG, Type.WATER, [ + [ Species.WIMPOD, PokemonType.BUG, PokemonType.WATER, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GOLISOPOD, Type.BUG, Type.WATER, [ + [ Species.GOLISOPOD, PokemonType.BUG, PokemonType.WATER, [ [ Biome.CAVE, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.SANDYGAST, Type.GHOST, Type.GROUND, [ + [ Species.SANDYGAST, PokemonType.GHOST, PokemonType.GROUND, [ [ Biome.BEACH, BiomePoolTier.UNCOMMON ] ] ], - [ Species.PALOSSAND, Type.GHOST, Type.GROUND, [ + [ Species.PALOSSAND, PokemonType.GHOST, PokemonType.GROUND, [ [ Biome.BEACH, BiomePoolTier.UNCOMMON ], [ Biome.BEACH, BiomePoolTier.BOSS ] ] ], - [ Species.PYUKUMUKU, Type.WATER, -1, [ + [ Species.PYUKUMUKU, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TYPE_NULL, Type.NORMAL, -1, [ + [ Species.TYPE_NULL, PokemonType.NORMAL, -1, [ [ Biome.LABORATORY, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.SILVALLY, Type.NORMAL, -1, [ + [ Species.SILVALLY, PokemonType.NORMAL, -1, [ [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MINIOR, Type.ROCK, Type.FLYING, [ + [ Species.MINIOR, PokemonType.ROCK, PokemonType.FLYING, [ [ Biome.SPACE, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.BOSS ] ] ], - [ Species.KOMALA, Type.NORMAL, -1, [ + [ Species.KOMALA, PokemonType.NORMAL, -1, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TURTONATOR, Type.FIRE, Type.DRAGON, [ + [ Species.TURTONATOR, PokemonType.FIRE, PokemonType.DRAGON, [ [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.TOGEDEMARU, Type.ELECTRIC, Type.STEEL, [ + [ Species.TOGEDEMARU, PokemonType.ELECTRIC, PokemonType.STEEL, [ [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.MIMIKYU, Type.GHOST, Type.FAIRY, [ + [ Species.MIMIKYU, PokemonType.GHOST, PokemonType.FAIRY, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.BRUXISH, Type.WATER, Type.PSYCHIC, [ + [ Species.BRUXISH, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.ISLAND, BiomePoolTier.UNCOMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.DRAMPA, Type.NORMAL, Type.DRAGON, [ + [ Species.DRAMPA, PokemonType.NORMAL, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.DHELMISE, Type.GHOST, Type.GRASS, [ + [ Species.DHELMISE, PokemonType.GHOST, PokemonType.GRASS, [ [ Biome.SEABED, BiomePoolTier.RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.JANGMO_O, Type.DRAGON, -1, [ + [ Species.JANGMO_O, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HAKAMO_O, Type.DRAGON, Type.FIGHTING, [ + [ Species.HAKAMO_O, PokemonType.DRAGON, PokemonType.FIGHTING, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.KOMMO_O, Type.DRAGON, Type.FIGHTING, [ + [ Species.KOMMO_O, PokemonType.DRAGON, PokemonType.FIGHTING, [ [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TAPU_KOKO, Type.ELECTRIC, Type.FAIRY, [ + [ Species.TAPU_KOKO, PokemonType.ELECTRIC, PokemonType.FAIRY, [ [ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], [ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TAPU_LELE, Type.PSYCHIC, Type.FAIRY, [ + [ Species.TAPU_LELE, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TAPU_BULU, Type.GRASS, Type.FAIRY, [ + [ Species.TAPU_BULU, PokemonType.GRASS, PokemonType.FAIRY, [ [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TAPU_FINI, Type.WATER, Type.FAIRY, [ + [ Species.TAPU_FINI, PokemonType.WATER, PokemonType.FAIRY, [ [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.COSMOG, Type.PSYCHIC, -1, [ + [ Species.COSMOG, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.COSMOEM, Type.PSYCHIC, -1, [ + [ Species.COSMOEM, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.SOLGALEO, Type.PSYCHIC, Type.STEEL, [ + [ Species.SOLGALEO, PokemonType.PSYCHIC, PokemonType.STEEL, [ [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE, TimeOfDay.DAY ] ] ], - [ Species.LUNALA, Type.PSYCHIC, Type.GHOST, [ + [ Species.LUNALA, PokemonType.PSYCHIC, PokemonType.GHOST, [ [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE, TimeOfDay.NIGHT ] ] ], - [ Species.NIHILEGO, Type.ROCK, Type.POISON, [ + [ Species.NIHILEGO, PokemonType.ROCK, PokemonType.POISON, [ [ Biome.SEABED, BiomePoolTier.ULTRA_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.BUZZWOLE, Type.BUG, Type.FIGHTING, [ + [ Species.BUZZWOLE, PokemonType.BUG, PokemonType.FIGHTING, [ [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.PHEROMOSA, Type.BUG, Type.FIGHTING, [ + [ Species.PHEROMOSA, PokemonType.BUG, PokemonType.FIGHTING, [ [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.XURKITREE, Type.ELECTRIC, -1, [ + [ Species.XURKITREE, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CELESTEELA, Type.STEEL, Type.FLYING, [ + [ Species.CELESTEELA, PokemonType.STEEL, PokemonType.FLYING, [ [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ], [ Biome.SPACE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.KARTANA, Type.GRASS, Type.STEEL, [ + [ Species.KARTANA, PokemonType.GRASS, PokemonType.STEEL, [ [ Biome.FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.GUZZLORD, Type.DARK, Type.DRAGON, [ + [ Species.GUZZLORD, PokemonType.DARK, PokemonType.DRAGON, [ [ Biome.SLUM, BiomePoolTier.ULTRA_RARE ], [ Biome.SLUM, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.NECROZMA, Type.PSYCHIC, -1, [ + [ Species.NECROZMA, PokemonType.PSYCHIC, -1, [ [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.MAGEARNA, Type.STEEL, Type.FAIRY, [ + [ Species.MAGEARNA, PokemonType.STEEL, PokemonType.FAIRY, [ [ Biome.FACTORY, BiomePoolTier.ULTRA_RARE ], [ Biome.FACTORY, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MARSHADOW, Type.FIGHTING, Type.GHOST, [ + [ Species.MARSHADOW, PokemonType.FIGHTING, PokemonType.GHOST, [ [ Biome.GRAVEYARD, BiomePoolTier.ULTRA_RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.POIPOLE, Type.POISON, -1, [ + [ Species.POIPOLE, PokemonType.POISON, -1, [ [ Biome.SWAMP, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.NAGANADEL, Type.POISON, Type.DRAGON, [ + [ Species.NAGANADEL, PokemonType.POISON, PokemonType.DRAGON, [ [ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.STAKATAKA, Type.ROCK, Type.STEEL, [ + [ Species.STAKATAKA, PokemonType.ROCK, PokemonType.STEEL, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.ULTRA_RARE ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.BLACEPHALON, Type.FIRE, Type.GHOST, [ + [ Species.BLACEPHALON, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.ISLAND, BiomePoolTier.ULTRA_RARE ], [ Biome.ISLAND, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ZERAORA, Type.ELECTRIC, -1, [ + [ Species.ZERAORA, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MELTAN, Type.STEEL, -1, [ ] + [ Species.MELTAN, PokemonType.STEEL, -1, [ ] ], - [ Species.MELMETAL, Type.STEEL, -1, [ ] + [ Species.MELMETAL, PokemonType.STEEL, -1, [ ] ], - [ Species.GROOKEY, Type.GRASS, -1, [ + [ Species.GROOKEY, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.THWACKEY, Type.GRASS, -1, [ + [ Species.THWACKEY, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ] ] ], - [ Species.RILLABOOM, Type.GRASS, -1, [ + [ Species.RILLABOOM, PokemonType.GRASS, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SCORBUNNY, Type.FIRE, -1, [ + [ Species.SCORBUNNY, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.RABOOT, Type.FIRE, -1, [ + [ Species.RABOOT, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.CINDERACE, Type.FIRE, -1, [ + [ Species.CINDERACE, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SOBBLE, Type.WATER, -1, [ + [ Species.SOBBLE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.DRIZZILE, Type.WATER, -1, [ + [ Species.DRIZZILE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ] ] ], - [ Species.INTELEON, Type.WATER, -1, [ + [ Species.INTELEON, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.RARE ], [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SKWOVET, Type.NORMAL, -1, [ + [ Species.SKWOVET, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GREEDENT, Type.NORMAL, -1, [ + [ Species.GREEDENT, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ROOKIDEE, Type.FLYING, -1, [ + [ Species.ROOKIDEE, PokemonType.FLYING, -1, [ [ Biome.TOWN, BiomePoolTier.RARE ], [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CORVISQUIRE, Type.FLYING, -1, [ + [ Species.CORVISQUIRE, PokemonType.FLYING, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CORVIKNIGHT, Type.FLYING, Type.STEEL, [ + [ Species.CORVIKNIGHT, PokemonType.FLYING, PokemonType.STEEL, [ [ Biome.PLAINS, BiomePoolTier.RARE ], [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BLIPBUG, Type.BUG, -1, [ + [ Species.BLIPBUG, PokemonType.BUG, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DOTTLER, Type.BUG, Type.PSYCHIC, [ + [ Species.DOTTLER, PokemonType.BUG, PokemonType.PSYCHIC, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ORBEETLE, Type.BUG, Type.PSYCHIC, [ + [ Species.ORBEETLE, PokemonType.BUG, PokemonType.PSYCHIC, [ [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.NICKIT, Type.DARK, -1, [ + [ Species.NICKIT, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.THIEVUL, Type.DARK, -1, [ + [ Species.THIEVUL, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.GOSSIFLEUR, Type.GRASS, -1, [ + [ Species.GOSSIFLEUR, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.ELDEGOSS, Type.GRASS, -1, [ + [ Species.ELDEGOSS, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.WOOLOO, Type.NORMAL, -1, [ + [ Species.WOOLOO, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.COMMON ] ] ], - [ Species.DUBWOOL, Type.NORMAL, -1, [ + [ Species.DUBWOOL, PokemonType.NORMAL, -1, [ [ Biome.MEADOW, BiomePoolTier.COMMON ], [ Biome.MEADOW, BiomePoolTier.BOSS ] ] ], - [ Species.CHEWTLE, Type.WATER, -1, [ + [ Species.CHEWTLE, PokemonType.WATER, -1, [ [ Biome.LAKE, BiomePoolTier.COMMON ] ] ], - [ Species.DREDNAW, Type.WATER, Type.ROCK, [ + [ Species.DREDNAW, PokemonType.WATER, PokemonType.ROCK, [ [ Biome.LAKE, BiomePoolTier.COMMON ], [ Biome.LAKE, BiomePoolTier.BOSS ] ] ], - [ Species.YAMPER, Type.ELECTRIC, -1, [ + [ Species.YAMPER, PokemonType.ELECTRIC, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.BOLTUND, Type.ELECTRIC, -1, [ + [ Species.BOLTUND, PokemonType.ELECTRIC, -1, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.METROPOLIS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ROLYCOLY, Type.ROCK, -1, [ + [ Species.ROLYCOLY, PokemonType.ROCK, -1, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.CARKOL, Type.ROCK, Type.FIRE, [ + [ Species.CARKOL, PokemonType.ROCK, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ] ] ], - [ Species.COALOSSAL, Type.ROCK, Type.FIRE, [ + [ Species.COALOSSAL, PokemonType.ROCK, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.COMMON ], [ Biome.VOLCANO, BiomePoolTier.BOSS ] ] ], - [ Species.APPLIN, Type.GRASS, Type.DRAGON, [ + [ Species.APPLIN, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.FLAPPLE, Type.GRASS, Type.DRAGON, [ + [ Species.FLAPPLE, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.APPLETUN, Type.GRASS, Type.DRAGON, [ + [ Species.APPLETUN, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SILICOBRA, Type.GROUND, -1, [ + [ Species.SILICOBRA, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON ] ] ], - [ Species.SANDACONDA, Type.GROUND, -1, [ + [ Species.SANDACONDA, PokemonType.GROUND, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.CRAMORANT, Type.FLYING, Type.WATER, [ + [ Species.CRAMORANT, PokemonType.FLYING, PokemonType.WATER, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ARROKUDA, Type.WATER, -1, [ + [ Species.ARROKUDA, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.BARRASKEWDA, Type.WATER, -1, [ + [ Species.BARRASKEWDA, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.COMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.TOXEL, Type.ELECTRIC, Type.POISON, [ ] + [ Species.TOXEL, PokemonType.ELECTRIC, PokemonType.POISON, [ ] ], - [ Species.TOXTRICITY, Type.ELECTRIC, Type.POISON, [ + [ Species.TOXTRICITY, PokemonType.ELECTRIC, PokemonType.POISON, [ [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.SIZZLIPEDE, Type.FIRE, Type.BUG, [ + [ Species.SIZZLIPEDE, PokemonType.FIRE, PokemonType.BUG, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CENTISKORCH, Type.FIRE, Type.BUG, [ + [ Species.CENTISKORCH, PokemonType.FIRE, PokemonType.BUG, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.CLOBBOPUS, Type.FIGHTING, -1, [ + [ Species.CLOBBOPUS, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.COMMON ] ] ], - [ Species.GRAPPLOCT, Type.FIGHTING, -1, [ + [ Species.GRAPPLOCT, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.SINISTEA, Type.GHOST, -1, [ + [ Species.SINISTEA, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] ] ], - [ Species.POLTEAGEIST, Type.GHOST, -1, [ + [ Species.POLTEAGEIST, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.HATENNA, Type.PSYCHIC, -1, [ + [ Species.HATENNA, PokemonType.PSYCHIC, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.HATTREM, Type.PSYCHIC, -1, [ + [ Species.HATTREM, PokemonType.PSYCHIC, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.HATTERENE, Type.PSYCHIC, Type.FAIRY, [ + [ Species.HATTERENE, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.IMPIDIMP, Type.DARK, Type.FAIRY, [ + [ Species.IMPIDIMP, PokemonType.DARK, PokemonType.FAIRY, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.MORGREM, Type.DARK, Type.FAIRY, [ + [ Species.MORGREM, PokemonType.DARK, PokemonType.FAIRY, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.GRIMMSNARL, Type.DARK, Type.FAIRY, [ + [ Species.GRIMMSNARL, PokemonType.DARK, PokemonType.FAIRY, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.OBSTAGOON, Type.DARK, Type.NORMAL, [ + [ Species.OBSTAGOON, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SLUM, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.PERRSERKER, Type.STEEL, -1, [ + [ Species.PERRSERKER, PokemonType.STEEL, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE, TimeOfDay.DUSK ], [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_RARE, TimeOfDay.DUSK ] ] ], - [ Species.CURSOLA, Type.GHOST, -1, [ + [ Species.CURSOLA, PokemonType.GHOST, -1, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SIRFETCHD, Type.FIGHTING, -1, [ + [ Species.SIRFETCHD, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.MR_RIME, Type.ICE, Type.PSYCHIC, [ + [ Species.MR_RIME, PokemonType.ICE, PokemonType.PSYCHIC, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.RUNERIGUS, Type.GROUND, Type.GHOST, [ + [ Species.RUNERIGUS, PokemonType.GROUND, PokemonType.GHOST, [ [ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.RUINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.MILCERY, Type.FAIRY, -1, [ + [ Species.MILCERY, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.ALCREMIE, Type.FAIRY, -1, [ + [ Species.ALCREMIE, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.FALINKS, Type.FIGHTING, -1, [ + [ Species.FALINKS, PokemonType.FIGHTING, -1, [ [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], [ Biome.JUNGLE, BiomePoolTier.BOSS ] ] ], - [ Species.PINCURCHIN, Type.ELECTRIC, -1, [ + [ Species.PINCURCHIN, PokemonType.ELECTRIC, -1, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ] ] ], - [ Species.SNOM, Type.ICE, Type.BUG, [ + [ Species.SNOM, PokemonType.ICE, PokemonType.BUG, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FROSMOTH, Type.ICE, Type.BUG, [ + [ Species.FROSMOTH, PokemonType.ICE, PokemonType.BUG, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.STONJOURNER, Type.ROCK, -1, [ + [ Species.STONJOURNER, PokemonType.ROCK, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ] ] ], - [ Species.EISCUE, Type.ICE, -1, [ + [ Species.EISCUE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.INDEEDEE, Type.PSYCHIC, Type.NORMAL, [ + [ Species.INDEEDEE, PokemonType.PSYCHIC, PokemonType.NORMAL, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.MORPEKO, Type.ELECTRIC, Type.DARK, [ + [ Species.MORPEKO, PokemonType.ELECTRIC, PokemonType.DARK, [ [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.CUFANT, Type.STEEL, -1, [ + [ Species.CUFANT, PokemonType.STEEL, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.COPPERAJAH, Type.STEEL, -1, [ + [ Species.COPPERAJAH, PokemonType.STEEL, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], [ Biome.BADLANDS, BiomePoolTier.BOSS ] ] ], - [ Species.DRACOZOLT, Type.ELECTRIC, Type.DRAGON, [ + [ Species.DRACOZOLT, PokemonType.ELECTRIC, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ARCTOZOLT, Type.ELECTRIC, Type.ICE, [ + [ Species.ARCTOZOLT, PokemonType.ELECTRIC, PokemonType.ICE, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DRACOVISH, Type.WATER, Type.DRAGON, [ + [ Species.DRACOVISH, PokemonType.WATER, PokemonType.DRAGON, [ [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ARCTOVISH, Type.WATER, Type.ICE, [ + [ Species.ARCTOVISH, PokemonType.WATER, PokemonType.ICE, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DURALUDON, Type.STEEL, Type.DRAGON, [ + [ Species.DURALUDON, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] ] ], - [ Species.DREEPY, Type.DRAGON, Type.GHOST, [ + [ Species.DREEPY, PokemonType.DRAGON, PokemonType.GHOST, [ [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DRAKLOAK, Type.DRAGON, Type.GHOST, [ + [ Species.DRAKLOAK, PokemonType.DRAGON, PokemonType.GHOST, [ [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.DRAGAPULT, Type.DRAGON, Type.GHOST, [ + [ Species.DRAGAPULT, PokemonType.DRAGON, PokemonType.GHOST, [ [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ZACIAN, Type.FAIRY, -1, [ + [ Species.ZACIAN, PokemonType.FAIRY, -1, [ [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ZAMAZENTA, Type.FIGHTING, -1, [ + [ Species.ZAMAZENTA, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.ETERNATUS, Type.POISON, Type.DRAGON, [ + [ Species.ETERNATUS, PokemonType.POISON, PokemonType.DRAGON, [ [ Biome.END, BiomePoolTier.BOSS ] ] ], - [ Species.KUBFU, Type.FIGHTING, -1, [ + [ Species.KUBFU, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ] ] ], - [ Species.URSHIFU, Type.FIGHTING, Type.DARK, [ + [ Species.URSHIFU, PokemonType.FIGHTING, PokemonType.DARK, [ [ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ZARUDE, Type.DARK, Type.GRASS, [ + [ Species.ZARUDE, PokemonType.DARK, PokemonType.GRASS, [ [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGIELEKI, Type.ELECTRIC, -1, [ + [ Species.REGIELEKI, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.REGIDRAGO, Type.DRAGON, -1, [ + [ Species.REGIDRAGO, PokemonType.DRAGON, -1, [ [ Biome.WASTELAND, BiomePoolTier.ULTRA_RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.GLASTRIER, Type.ICE, -1, [ + [ Species.GLASTRIER, PokemonType.ICE, -1, [ [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.SPECTRIER, Type.GHOST, -1, [ + [ Species.SPECTRIER, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.ULTRA_RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CALYREX, Type.PSYCHIC, Type.GRASS, [ + [ Species.CALYREX, PokemonType.PSYCHIC, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.WYRDEER, Type.NORMAL, Type.PSYCHIC, [ + [ Species.WYRDEER, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.KLEAVOR, Type.BUG, Type.ROCK, [ + [ Species.KLEAVOR, PokemonType.BUG, PokemonType.ROCK, [ [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.URSALUNA, Type.GROUND, Type.NORMAL, [ + [ Species.URSALUNA, PokemonType.GROUND, PokemonType.NORMAL, [ [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.BASCULEGION, Type.WATER, Type.GHOST, [ + [ Species.BASCULEGION, PokemonType.WATER, PokemonType.GHOST, [ [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.SNEASLER, Type.FIGHTING, Type.POISON, [ + [ Species.SNEASLER, PokemonType.FIGHTING, PokemonType.POISON, [ [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.OVERQWIL, Type.DARK, Type.POISON, [ + [ Species.OVERQWIL, PokemonType.DARK, PokemonType.POISON, [ [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ENAMORUS, Type.FAIRY, Type.FLYING, [ + [ Species.ENAMORUS, PokemonType.FAIRY, PokemonType.FLYING, [ [ Biome.FAIRY_CAVE, BiomePoolTier.ULTRA_RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.SPRIGATITO, Type.GRASS, -1, [ + [ Species.SPRIGATITO, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.FLORAGATO, Type.GRASS, -1, [ + [ Species.FLORAGATO, PokemonType.GRASS, -1, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.MEOWSCARADA, Type.GRASS, Type.DARK, [ + [ Species.MEOWSCARADA, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.MEADOW, BiomePoolTier.RARE ], [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.FUECOCO, Type.FIRE, -1, [ + [ Species.FUECOCO, PokemonType.FIRE, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ] ] ], - [ Species.CROCALOR, Type.FIRE, -1, [ + [ Species.CROCALOR, PokemonType.FIRE, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ] ] ], - [ Species.SKELEDIRGE, Type.FIRE, Type.GHOST, [ + [ Species.SKELEDIRGE, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.QUAXLY, Type.WATER, -1, [ + [ Species.QUAXLY, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.RARE ] ] ], - [ Species.QUAXWELL, Type.WATER, -1, [ + [ Species.QUAXWELL, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.RARE ] ] ], - [ Species.QUAQUAVAL, Type.WATER, Type.FIGHTING, [ + [ Species.QUAQUAVAL, PokemonType.WATER, PokemonType.FIGHTING, [ [ Biome.BEACH, BiomePoolTier.RARE ], [ Biome.BEACH, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.LECHONK, Type.NORMAL, -1, [ + [ Species.LECHONK, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.COMMON ] ] ], - [ Species.OINKOLOGNE, Type.NORMAL, -1, [ + [ Species.OINKOLOGNE, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.COMMON ], [ Biome.PLAINS, BiomePoolTier.BOSS ] ] ], - [ Species.TAROUNTULA, Type.BUG, -1, [ + [ Species.TAROUNTULA, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.SPIDOPS, Type.BUG, -1, [ + [ Species.SPIDOPS, PokemonType.BUG, -1, [ [ Biome.FOREST, BiomePoolTier.COMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.NYMBLE, Type.BUG, -1, [ + [ Species.NYMBLE, PokemonType.BUG, -1, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.LOKIX, Type.BUG, Type.DARK, [ + [ Species.LOKIX, PokemonType.BUG, PokemonType.DARK, [ [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS ], [ Biome.FOREST, BiomePoolTier.COMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.PAWMI, Type.ELECTRIC, -1, [ + [ Species.PAWMI, PokemonType.ELECTRIC, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.PAWMO, Type.ELECTRIC, Type.FIGHTING, [ + [ Species.PAWMO, PokemonType.ELECTRIC, PokemonType.FIGHTING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.PAWMOT, Type.ELECTRIC, Type.FIGHTING, [ + [ Species.PAWMOT, PokemonType.ELECTRIC, PokemonType.FIGHTING, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.TANDEMAUS, Type.NORMAL, -1, [ + [ Species.TANDEMAUS, PokemonType.NORMAL, -1, [ [ Biome.TOWN, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.MAUSHOLD, Type.NORMAL, -1, [ + [ Species.MAUSHOLD, PokemonType.NORMAL, -1, [ [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FIDOUGH, Type.FAIRY, -1, [ + [ Species.FIDOUGH, PokemonType.FAIRY, -1, [ [ Biome.TOWN, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.DACHSBUN, Type.FAIRY, -1, [ + [ Species.DACHSBUN, PokemonType.FAIRY, -1, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.METROPOLIS, BiomePoolTier.BOSS ] ] ], - [ Species.SMOLIV, Type.GRASS, Type.NORMAL, [ + [ Species.SMOLIV, PokemonType.GRASS, PokemonType.NORMAL, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.DOLLIV, Type.GRASS, Type.NORMAL, [ + [ Species.DOLLIV, PokemonType.GRASS, PokemonType.NORMAL, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ARBOLIVA, Type.GRASS, Type.NORMAL, [ + [ Species.ARBOLIVA, PokemonType.GRASS, PokemonType.NORMAL, [ [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SQUAWKABILLY, Type.NORMAL, Type.FLYING, [ + [ Species.SQUAWKABILLY, PokemonType.NORMAL, PokemonType.FLYING, [ [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.NACLI, Type.ROCK, -1, [ + [ Species.NACLI, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.NACLSTACK, Type.ROCK, -1, [ + [ Species.NACLSTACK, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.CAVE, BiomePoolTier.COMMON ] ] ], - [ Species.GARGANACL, Type.ROCK, -1, [ + [ Species.GARGANACL, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS ], [ Biome.CAVE, BiomePoolTier.COMMON ], [ Biome.CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.CHARCADET, Type.FIRE, -1, [ + [ Species.CHARCADET, PokemonType.FIRE, -1, [ [ Biome.VOLCANO, BiomePoolTier.RARE ] ] ], - [ Species.ARMAROUGE, Type.FIRE, Type.PSYCHIC, [ + [ Species.ARMAROUGE, PokemonType.FIRE, PokemonType.PSYCHIC, [ [ Biome.VOLCANO, BiomePoolTier.RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CERULEDGE, Type.FIRE, Type.GHOST, [ + [ Species.CERULEDGE, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.GRAVEYARD, BiomePoolTier.RARE ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.TADBULB, Type.ELECTRIC, -1, [ + [ Species.TADBULB, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] ] ], - [ Species.BELLIBOLT, Type.ELECTRIC, -1, [ + [ Species.BELLIBOLT, PokemonType.ELECTRIC, -1, [ [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] ] ], - [ Species.WATTREL, Type.ELECTRIC, Type.FLYING, [ + [ Species.WATTREL, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KILOWATTREL, Type.ELECTRIC, Type.FLYING, [ + [ Species.KILOWATTREL, PokemonType.ELECTRIC, PokemonType.FLYING, [ [ Biome.SEA, BiomePoolTier.UNCOMMON ], [ Biome.SEA, BiomePoolTier.BOSS ] ] ], - [ Species.MASCHIFF, Type.DARK, -1, [ + [ Species.MASCHIFF, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ] ] ], - [ Species.MABOSSTIFF, Type.DARK, -1, [ + [ Species.MABOSSTIFF, PokemonType.DARK, -1, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.SHROODLE, Type.POISON, Type.NORMAL, [ + [ Species.SHROODLE, PokemonType.POISON, PokemonType.NORMAL, [ [ Biome.FOREST, BiomePoolTier.COMMON ] ] ], - [ Species.GRAFAIAI, Type.POISON, Type.NORMAL, [ + [ Species.GRAFAIAI, PokemonType.POISON, PokemonType.NORMAL, [ [ Biome.FOREST, BiomePoolTier.COMMON ], [ Biome.FOREST, BiomePoolTier.BOSS ] ] ], - [ Species.BRAMBLIN, Type.GRASS, Type.GHOST, [ + [ Species.BRAMBLIN, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.BRAMBLEGHAST, Type.GRASS, Type.GHOST, [ + [ Species.BRAMBLEGHAST, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.BOSS ] ] ], - [ Species.TOEDSCOOL, Type.GROUND, Type.GRASS, [ + [ Species.TOEDSCOOL, PokemonType.GROUND, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.RARE ] ] ], - [ Species.TOEDSCRUEL, Type.GROUND, Type.GRASS, [ + [ Species.TOEDSCRUEL, PokemonType.GROUND, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KLAWF, Type.ROCK, -1, [ + [ Species.KLAWF, PokemonType.ROCK, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.RARE ] ] ], - [ Species.CAPSAKID, Type.GRASS, -1, [ + [ Species.CAPSAKID, PokemonType.GRASS, -1, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.SCOVILLAIN, Type.GRASS, Type.FIRE, [ + [ Species.SCOVILLAIN, PokemonType.GRASS, PokemonType.FIRE, [ [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.RELLOR, Type.BUG, -1, [ + [ Species.RELLOR, PokemonType.BUG, -1, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.RABSCA, Type.BUG, Type.PSYCHIC, [ + [ Species.RABSCA, PokemonType.BUG, PokemonType.PSYCHIC, [ [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FLITTLE, Type.PSYCHIC, -1, [ + [ Species.FLITTLE, PokemonType.PSYCHIC, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ESPATHRA, Type.PSYCHIC, -1, [ + [ Species.ESPATHRA, PokemonType.PSYCHIC, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.TINKATINK, Type.FAIRY, Type.STEEL, [ + [ Species.TINKATINK, PokemonType.FAIRY, PokemonType.STEEL, [ [ Biome.RUINS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TINKATUFF, Type.FAIRY, Type.STEEL, [ + [ Species.TINKATUFF, PokemonType.FAIRY, PokemonType.STEEL, [ [ Biome.RUINS, BiomePoolTier.UNCOMMON ] ] ], - [ Species.TINKATON, Type.FAIRY, Type.STEEL, [ + [ Species.TINKATON, PokemonType.FAIRY, PokemonType.STEEL, [ [ Biome.RUINS, BiomePoolTier.UNCOMMON ], [ Biome.RUINS, BiomePoolTier.BOSS ] ] ], - [ Species.WIGLETT, Type.WATER, -1, [ + [ Species.WIGLETT, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.WUGTRIO, Type.WATER, -1, [ + [ Species.WUGTRIO, PokemonType.WATER, -1, [ [ Biome.BEACH, BiomePoolTier.COMMON ] ] ], - [ Species.BOMBIRDIER, Type.FLYING, Type.DARK, [ + [ Species.BOMBIRDIER, PokemonType.FLYING, PokemonType.DARK, [ [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.FINIZEN, Type.WATER, -1, [ + [ Species.FINIZEN, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PALAFIN, Type.WATER, -1, [ + [ Species.PALAFIN, PokemonType.WATER, -1, [ [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.VAROOM, Type.STEEL, Type.POISON, [ + [ Species.VAROOM, PokemonType.STEEL, PokemonType.POISON, [ [ Biome.METROPOLIS, BiomePoolTier.RARE ], [ Biome.SLUM, BiomePoolTier.RARE ] ] ], - [ Species.REVAVROOM, Type.STEEL, Type.POISON, [ + [ Species.REVAVROOM, PokemonType.STEEL, PokemonType.POISON, [ [ Biome.METROPOLIS, BiomePoolTier.RARE ], [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE ], [ Biome.SLUM, BiomePoolTier.RARE ], [ Biome.SLUM, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.CYCLIZAR, Type.DRAGON, Type.NORMAL, [ + [ Species.CYCLIZAR, PokemonType.DRAGON, PokemonType.NORMAL, [ [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] ] ], - [ Species.ORTHWORM, Type.STEEL, -1, [ + [ Species.ORTHWORM, PokemonType.STEEL, -1, [ [ Biome.DESERT, BiomePoolTier.UNCOMMON ] ] ], - [ Species.GLIMMET, Type.ROCK, Type.POISON, [ + [ Species.GLIMMET, PokemonType.ROCK, PokemonType.POISON, [ [ Biome.CAVE, BiomePoolTier.RARE ] ] ], - [ Species.GLIMMORA, Type.ROCK, Type.POISON, [ + [ Species.GLIMMORA, PokemonType.ROCK, PokemonType.POISON, [ [ Biome.CAVE, BiomePoolTier.RARE ], [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GREAVARD, Type.GHOST, -1, [ + [ Species.GREAVARD, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] ] ], - [ Species.HOUNDSTONE, Type.GHOST, -1, [ + [ Species.HOUNDSTONE, PokemonType.GHOST, -1, [ [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] ] ], - [ Species.FLAMIGO, Type.FLYING, Type.FIGHTING, [ + [ Species.FLAMIGO, PokemonType.FLYING, PokemonType.FIGHTING, [ [ Biome.LAKE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CETODDLE, Type.ICE, -1, [ + [ Species.CETODDLE, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] ] ], - [ Species.CETITAN, Type.ICE, -1, [ + [ Species.CETITAN, PokemonType.ICE, -1, [ [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] ] ], - [ Species.VELUZA, Type.WATER, Type.PSYCHIC, [ + [ Species.VELUZA, PokemonType.WATER, PokemonType.PSYCHIC, [ [ Biome.SEABED, BiomePoolTier.COMMON ] ] ], - [ Species.DONDOZO, Type.WATER, -1, [ + [ Species.DONDOZO, PokemonType.WATER, -1, [ [ Biome.SEABED, BiomePoolTier.UNCOMMON ], [ Biome.SEABED, BiomePoolTier.BOSS ] ] ], - [ Species.TATSUGIRI, Type.DRAGON, Type.WATER, [ + [ Species.TATSUGIRI, PokemonType.DRAGON, PokemonType.WATER, [ [ Biome.BEACH, BiomePoolTier.RARE ] ] ], - [ Species.ANNIHILAPE, Type.FIGHTING, Type.GHOST, [ + [ Species.ANNIHILAPE, PokemonType.FIGHTING, PokemonType.GHOST, [ [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.DOJO, BiomePoolTier.COMMON ], [ Biome.DOJO, BiomePoolTier.BOSS ] ] ], - [ Species.CLODSIRE, Type.POISON, Type.GROUND, [ + [ Species.CLODSIRE, PokemonType.POISON, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.FARIGIRAF, Type.NORMAL, Type.PSYCHIC, [ + [ Species.FARIGIRAF, PokemonType.NORMAL, PokemonType.PSYCHIC, [ [ Biome.TALL_GRASS, BiomePoolTier.RARE ], [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.DUDUNSPARCE, Type.NORMAL, -1, [ + [ Species.DUDUNSPARCE, PokemonType.NORMAL, -1, [ [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.KINGAMBIT, Type.DARK, Type.STEEL, [ + [ Species.KINGAMBIT, PokemonType.DARK, PokemonType.STEEL, [ [ Biome.ABYSS, BiomePoolTier.COMMON ], [ Biome.ABYSS, BiomePoolTier.BOSS ] ] ], - [ Species.GREAT_TUSK, Type.GROUND, Type.FIGHTING, [ + [ Species.GREAT_TUSK, PokemonType.GROUND, PokemonType.FIGHTING, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.SCREAM_TAIL, Type.FAIRY, Type.PSYCHIC, [ + [ Species.SCREAM_TAIL, PokemonType.FAIRY, PokemonType.PSYCHIC, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.BRUTE_BONNET, Type.GRASS, Type.DARK, [ + [ Species.BRUTE_BONNET, PokemonType.GRASS, PokemonType.DARK, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.FLUTTER_MANE, Type.GHOST, Type.FAIRY, [ + [ Species.FLUTTER_MANE, PokemonType.GHOST, PokemonType.FAIRY, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.SLITHER_WING, Type.BUG, Type.FIGHTING, [ + [ Species.SLITHER_WING, PokemonType.BUG, PokemonType.FIGHTING, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.SANDY_SHOCKS, Type.ELECTRIC, Type.GROUND, [ + [ Species.SANDY_SHOCKS, PokemonType.ELECTRIC, PokemonType.GROUND, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_TREADS, Type.GROUND, Type.STEEL, [ + [ Species.IRON_TREADS, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_BUNDLE, Type.ICE, Type.WATER, [ + [ Species.IRON_BUNDLE, PokemonType.ICE, PokemonType.WATER, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_HANDS, Type.FIGHTING, Type.ELECTRIC, [ + [ Species.IRON_HANDS, PokemonType.FIGHTING, PokemonType.ELECTRIC, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_JUGULIS, Type.DARK, Type.FLYING, [ + [ Species.IRON_JUGULIS, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_MOTH, Type.FIRE, Type.POISON, [ + [ Species.IRON_MOTH, PokemonType.FIRE, PokemonType.POISON, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.IRON_THORNS, Type.ROCK, Type.ELECTRIC, [ + [ Species.IRON_THORNS, PokemonType.ROCK, PokemonType.ELECTRIC, [ [ Biome.END, BiomePoolTier.COMMON ] ] ], - [ Species.FRIGIBAX, Type.DRAGON, Type.ICE, [ + [ Species.FRIGIBAX, PokemonType.DRAGON, PokemonType.ICE, [ [ Biome.WASTELAND, BiomePoolTier.RARE ] ] ], - [ Species.ARCTIBAX, Type.DRAGON, Type.ICE, [ + [ Species.ARCTIBAX, PokemonType.DRAGON, PokemonType.ICE, [ [ Biome.WASTELAND, BiomePoolTier.RARE ] ] ], - [ Species.BAXCALIBUR, Type.DRAGON, Type.ICE, [ + [ Species.BAXCALIBUR, PokemonType.DRAGON, PokemonType.ICE, [ [ Biome.WASTELAND, BiomePoolTier.RARE ], [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], - [ Species.GIMMIGHOUL, Type.GHOST, -1, [ + [ Species.GIMMIGHOUL, PokemonType.GHOST, -1, [ [ Biome.TEMPLE, BiomePoolTier.RARE ] ] ], - [ Species.GHOLDENGO, Type.STEEL, Type.GHOST, [ + [ Species.GHOLDENGO, PokemonType.STEEL, PokemonType.GHOST, [ [ Biome.TEMPLE, BiomePoolTier.RARE ], [ Biome.TEMPLE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.WO_CHIEN, Type.DARK, Type.GRASS, [ + [ Species.WO_CHIEN, PokemonType.DARK, PokemonType.GRASS, [ [ Biome.FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.FOREST, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CHIEN_PAO, Type.DARK, Type.ICE, [ + [ Species.CHIEN_PAO, PokemonType.DARK, PokemonType.ICE, [ [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.TING_LU, Type.DARK, Type.GROUND, [ + [ Species.TING_LU, PokemonType.DARK, PokemonType.GROUND, [ [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.CHI_YU, Type.DARK, Type.FIRE, [ + [ Species.CHI_YU, PokemonType.DARK, PokemonType.FIRE, [ [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ROARING_MOON, Type.DRAGON, Type.DARK, [ + [ Species.ROARING_MOON, PokemonType.DRAGON, PokemonType.DARK, [ [ Biome.END, BiomePoolTier.UNCOMMON ] ] ], - [ Species.IRON_VALIANT, Type.FAIRY, Type.FIGHTING, [ + [ Species.IRON_VALIANT, PokemonType.FAIRY, PokemonType.FIGHTING, [ [ Biome.END, BiomePoolTier.UNCOMMON ] ] ], - [ Species.KORAIDON, Type.FIGHTING, Type.DRAGON, [ + [ Species.KORAIDON, PokemonType.FIGHTING, PokemonType.DRAGON, [ [ Biome.RUINS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.MIRAIDON, Type.ELECTRIC, Type.DRAGON, [ + [ Species.MIRAIDON, PokemonType.ELECTRIC, PokemonType.DRAGON, [ [ Biome.LABORATORY, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.WALKING_WAKE, Type.WATER, Type.DRAGON, [ + [ Species.WALKING_WAKE, PokemonType.WATER, PokemonType.DRAGON, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.IRON_LEAVES, Type.GRASS, Type.PSYCHIC, [ + [ Species.IRON_LEAVES, PokemonType.GRASS, PokemonType.PSYCHIC, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.DIPPLIN, Type.GRASS, Type.DRAGON, [ + [ Species.DIPPLIN, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.RARE ] ] ], - [ Species.POLTCHAGEIST, Type.GRASS, Type.GHOST, [ + [ Species.POLTCHAGEIST, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.BADLANDS, BiomePoolTier.RARE ] ] ], - [ Species.SINISTCHA, Type.GRASS, Type.GHOST, [ + [ Species.SINISTCHA, PokemonType.GRASS, PokemonType.GHOST, [ [ Biome.BADLANDS, BiomePoolTier.RARE ], [ Biome.BADLANDS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.OKIDOGI, Type.POISON, Type.FIGHTING, [ + [ Species.OKIDOGI, PokemonType.POISON, PokemonType.FIGHTING, [ [ Biome.BADLANDS, BiomePoolTier.ULTRA_RARE ], [ Biome.BADLANDS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.MUNKIDORI, Type.POISON, Type.PSYCHIC, [ + [ Species.MUNKIDORI, PokemonType.POISON, PokemonType.PSYCHIC, [ [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.FEZANDIPITI, Type.POISON, Type.FAIRY, [ + [ Species.FEZANDIPITI, PokemonType.POISON, PokemonType.FAIRY, [ [ Biome.RUINS, BiomePoolTier.ULTRA_RARE ], [ Biome.RUINS, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.OGERPON, Type.GRASS, -1, [ + [ Species.OGERPON, PokemonType.GRASS, -1, [ [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] ] ], - [ Species.ARCHALUDON, Type.STEEL, Type.DRAGON, [ + [ Species.ARCHALUDON, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HYDRAPPLE, Type.GRASS, Type.DRAGON, [ + [ Species.HYDRAPPLE, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GOUGING_FIRE, Type.FIRE, Type.DRAGON, [ + [ Species.GOUGING_FIRE, PokemonType.FIRE, PokemonType.DRAGON, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.RAGING_BOLT, Type.ELECTRIC, Type.DRAGON, [ + [ Species.RAGING_BOLT, PokemonType.ELECTRIC, PokemonType.DRAGON, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.IRON_BOULDER, Type.ROCK, Type.PSYCHIC, [ + [ Species.IRON_BOULDER, PokemonType.ROCK, PokemonType.PSYCHIC, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.IRON_CROWN, Type.STEEL, Type.PSYCHIC, [ + [ Species.IRON_CROWN, PokemonType.STEEL, PokemonType.PSYCHIC, [ [ Biome.END, BiomePoolTier.RARE ] ] ], - [ Species.TERAPAGOS, Type.NORMAL, -1, [ + [ Species.TERAPAGOS, PokemonType.NORMAL, -1, [ [ Biome.CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.PECHARUNT, Type.POISON, Type.GHOST, [ ] + [ Species.PECHARUNT, PokemonType.POISON, PokemonType.GHOST, [ ] ], - [ Species.ALOLA_RATTATA, Type.DARK, Type.NORMAL, [ + [ Species.ALOLA_RATTATA, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ALOLA_RATICATE, Type.DARK, Type.NORMAL, [ + [ Species.ALOLA_RATICATE, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ALOLA_RAICHU, Type.ELECTRIC, Type.PSYCHIC, [ + [ Species.ALOLA_RAICHU, PokemonType.ELECTRIC, PokemonType.PSYCHIC, [ [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ALOLA_SANDSHREW, Type.ICE, Type.STEEL, [ + [ Species.ALOLA_SANDSHREW, PokemonType.ICE, PokemonType.STEEL, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] ] ], - [ Species.ALOLA_SANDSLASH, Type.ICE, Type.STEEL, [ + [ Species.ALOLA_SANDSLASH, PokemonType.ICE, PokemonType.STEEL, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ALOLA_VULPIX, Type.ICE, -1, [ + [ Species.ALOLA_VULPIX, PokemonType.ICE, -1, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] ] ], - [ Species.ALOLA_NINETALES, Type.ICE, Type.FAIRY, [ + [ Species.ALOLA_NINETALES, PokemonType.ICE, PokemonType.FAIRY, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ], [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.ALOLA_DIGLETT, Type.GROUND, Type.STEEL, [ + [ Species.ALOLA_DIGLETT, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.ISLAND, BiomePoolTier.COMMON ] ] ], - [ Species.ALOLA_DUGTRIO, Type.GROUND, Type.STEEL, [ + [ Species.ALOLA_DUGTRIO, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.ALOLA_MEOWTH, Type.DARK, -1, [ + [ Species.ALOLA_MEOWTH, PokemonType.DARK, -1, [ [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ALOLA_PERSIAN, Type.DARK, -1, [ + [ Species.ALOLA_PERSIAN, PokemonType.DARK, -1, [ [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ALOLA_GEODUDE, Type.ROCK, Type.ELECTRIC, [ + [ Species.ALOLA_GEODUDE, PokemonType.ROCK, PokemonType.ELECTRIC, [ [ Biome.ISLAND, BiomePoolTier.COMMON ] ] ], - [ Species.ALOLA_GRAVELER, Type.ROCK, Type.ELECTRIC, [ + [ Species.ALOLA_GRAVELER, PokemonType.ROCK, PokemonType.ELECTRIC, [ [ Biome.ISLAND, BiomePoolTier.COMMON ] ] ], - [ Species.ALOLA_GOLEM, Type.ROCK, Type.ELECTRIC, [ + [ Species.ALOLA_GOLEM, PokemonType.ROCK, PokemonType.ELECTRIC, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.ALOLA_GRIMER, Type.POISON, Type.DARK, [ + [ Species.ALOLA_GRIMER, PokemonType.POISON, PokemonType.DARK, [ [ Biome.ISLAND, BiomePoolTier.COMMON ] ] ], - [ Species.ALOLA_MUK, Type.POISON, Type.DARK, [ + [ Species.ALOLA_MUK, PokemonType.POISON, PokemonType.DARK, [ [ Biome.ISLAND, BiomePoolTier.COMMON ], [ Biome.ISLAND, BiomePoolTier.BOSS ] ] ], - [ Species.ALOLA_EXEGGUTOR, Type.GRASS, Type.DRAGON, [ + [ Species.ALOLA_EXEGGUTOR, PokemonType.GRASS, PokemonType.DRAGON, [ [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.ALOLA_MAROWAK, Type.FIRE, Type.GHOST, [ + [ Species.ALOLA_MAROWAK, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.ETERNAL_FLOETTE, Type.FAIRY, -1, [ + [ Species.ETERNAL_FLOETTE, PokemonType.FAIRY, -1, [ [ Biome.FAIRY_CAVE, BiomePoolTier.RARE ], [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GALAR_MEOWTH, Type.STEEL, -1, [ + [ Species.GALAR_MEOWTH, PokemonType.STEEL, -1, [ [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE, TimeOfDay.DUSK ] ] ], - [ Species.GALAR_PONYTA, Type.PSYCHIC, -1, [ + [ Species.GALAR_PONYTA, PokemonType.PSYCHIC, -1, [ [ Biome.JUNGLE, BiomePoolTier.RARE, TimeOfDay.DAWN ] ] ], - [ Species.GALAR_RAPIDASH, Type.PSYCHIC, Type.FAIRY, [ + [ Species.GALAR_RAPIDASH, PokemonType.PSYCHIC, PokemonType.FAIRY, [ [ Biome.JUNGLE, BiomePoolTier.RARE, TimeOfDay.DAWN ], [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE, TimeOfDay.DAWN ] ] ], - [ Species.GALAR_SLOWPOKE, Type.PSYCHIC, -1, [ + [ Species.GALAR_SLOWPOKE, PokemonType.PSYCHIC, -1, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_SLOWBRO, Type.POISON, Type.PSYCHIC, [ + [ Species.GALAR_SLOWBRO, PokemonType.POISON, PokemonType.PSYCHIC, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_FARFETCHD, Type.FIGHTING, -1, [ + [ Species.GALAR_FARFETCHD, PokemonType.FIGHTING, -1, [ [ Biome.DOJO, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.GALAR_WEEZING, Type.POISON, Type.FAIRY, [ + [ Species.GALAR_WEEZING, PokemonType.POISON, PokemonType.FAIRY, [ [ Biome.SLUM, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.GALAR_MR_MIME, Type.ICE, Type.PSYCHIC, [ + [ Species.GALAR_MR_MIME, PokemonType.ICE, PokemonType.PSYCHIC, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.GALAR_ARTICUNO, Type.PSYCHIC, Type.FLYING, [ + [ Species.GALAR_ARTICUNO, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GALAR_ZAPDOS, Type.FIGHTING, Type.FLYING, [ + [ Species.GALAR_ZAPDOS, PokemonType.FIGHTING, PokemonType.FLYING, [ [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ], [ Biome.DOJO, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GALAR_MOLTRES, Type.DARK, Type.FLYING, [ + [ Species.GALAR_MOLTRES, PokemonType.DARK, PokemonType.FLYING, [ [ Biome.ABYSS, BiomePoolTier.ULTRA_RARE ], [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] ] ], - [ Species.GALAR_SLOWKING, Type.POISON, Type.PSYCHIC, [ + [ Species.GALAR_SLOWKING, PokemonType.POISON, PokemonType.PSYCHIC, [ [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_CORSOLA, Type.GHOST, -1, [ + [ Species.GALAR_CORSOLA, PokemonType.GHOST, -1, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.GALAR_ZIGZAGOON, Type.DARK, Type.NORMAL, [ + [ Species.GALAR_ZIGZAGOON, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GALAR_LINOONE, Type.DARK, Type.NORMAL, [ + [ Species.GALAR_LINOONE, PokemonType.DARK, PokemonType.NORMAL, [ [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GALAR_DARUMAKA, Type.ICE, -1, [ + [ Species.GALAR_DARUMAKA, PokemonType.ICE, -1, [ [ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_DARMANITAN, Type.ICE, -1, [ + [ Species.GALAR_DARMANITAN, PokemonType.ICE, -1, [ [ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.GALAR_YAMASK, Type.GROUND, Type.GHOST, [ + [ Species.GALAR_YAMASK, PokemonType.GROUND, PokemonType.GHOST, [ [ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.GALAR_STUNFISK, Type.GROUND, Type.STEEL, [ + [ Species.GALAR_STUNFISK, PokemonType.GROUND, PokemonType.STEEL, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE ], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_GROWLITHE, Type.FIRE, Type.ROCK, [ + [ Species.HISUI_GROWLITHE, PokemonType.FIRE, PokemonType.ROCK, [ [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.HISUI_ARCANINE, Type.FIRE, Type.ROCK, [ + [ Species.HISUI_ARCANINE, PokemonType.FIRE, PokemonType.ROCK, [ [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_VOLTORB, Type.ELECTRIC, Type.GRASS, [ + [ Species.HISUI_VOLTORB, PokemonType.ELECTRIC, PokemonType.GRASS, [ [ Biome.POWER_PLANT, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.HISUI_ELECTRODE, Type.ELECTRIC, Type.GRASS, [ + [ Species.HISUI_ELECTRODE, PokemonType.ELECTRIC, PokemonType.GRASS, [ [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_TYPHLOSION, Type.FIRE, Type.GHOST, [ + [ Species.HISUI_TYPHLOSION, PokemonType.FIRE, PokemonType.GHOST, [ [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_QWILFISH, Type.DARK, Type.POISON, [ + [ Species.HISUI_QWILFISH, PokemonType.DARK, PokemonType.POISON, [ [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.HISUI_SNEASEL, Type.FIGHTING, Type.POISON, [ + [ Species.HISUI_SNEASEL, PokemonType.FIGHTING, PokemonType.POISON, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_SAMUROTT, Type.WATER, Type.DARK, [ + [ Species.HISUI_SAMUROTT, PokemonType.WATER, PokemonType.DARK, [ [ Biome.ABYSS, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.HISUI_LILLIGANT, Type.GRASS, Type.FIGHTING, [ + [ Species.HISUI_LILLIGANT, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.MEADOW, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_ZORUA, Type.NORMAL, Type.GHOST, [ + [ Species.HISUI_ZORUA, PokemonType.NORMAL, PokemonType.GHOST, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.HISUI_ZOROARK, Type.NORMAL, Type.GHOST, [ + [ Species.HISUI_ZOROARK, PokemonType.NORMAL, PokemonType.GHOST, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]], [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.HISUI_BRAVIARY, Type.PSYCHIC, Type.FLYING, [ + [ Species.HISUI_BRAVIARY, PokemonType.PSYCHIC, PokemonType.FLYING, [ [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_SLIGGOO, Type.STEEL, Type.DRAGON, [ + [ Species.HISUI_SLIGGOO, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_GOODRA, Type.STEEL, Type.DRAGON, [ + [ Species.HISUI_GOODRA, PokemonType.STEEL, PokemonType.DRAGON, [ [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.HISUI_AVALUGG, Type.ICE, Type.ROCK, [ + [ Species.HISUI_AVALUGG, PokemonType.ICE, PokemonType.ROCK, [ [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ] ] ], - [ Species.HISUI_DECIDUEYE, Type.GRASS, Type.FIGHTING, [ + [ Species.HISUI_DECIDUEYE, PokemonType.GRASS, PokemonType.FIGHTING, [ [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] ] ], - [ Species.PALDEA_TAUROS, Type.FIGHTING, -1, [ + [ Species.PALDEA_TAUROS, PokemonType.FIGHTING, -1, [ [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]], [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ]] ] ], - [ Species.PALDEA_WOOPER, Type.POISON, Type.GROUND, [ + [ Species.PALDEA_WOOPER, PokemonType.POISON, PokemonType.GROUND, [ [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]] ] ], - [ Species.BLOODMOON_URSALUNA, Type.GROUND, Type.NORMAL, [ + [ Species.BLOODMOON_URSALUNA, PokemonType.GROUND, PokemonType.NORMAL, [ [ Biome.FOREST, BiomePoolTier.SUPER_RARE, TimeOfDay.NIGHT ], [ Biome.FOREST, BiomePoolTier.BOSS_RARE, TimeOfDay.NIGHT ] ] @@ -7662,15 +7676,15 @@ export function initBiomes() { biomeDepths[Biome.TOWN] = [ 0, 1 ]; - const traverseBiome = (biome: Biome, depth: integer) => { + const traverseBiome = (biome: Biome, depth: number) => { if (biome === Biome.END) { - const biomeList = Object.keys(Biome).filter(key => !isNaN(Number(key))); + const biomeList = Object.keys(Biome).filter(key => !Number.isNaN(Number(key))); biomeList.pop(); // Removes Biome.END from the list - const randIndex = Utils.randInt(biomeList.length, 1); // Will never be Biome.TOWN + const randIndex = Utils.randSeedInt(biomeList.length, 1); // Will never be Biome.TOWN biome = Biome[biomeList[randIndex]]; } - const linkedBiomes: (Biome | [ Biome, integer ])[] = Array.isArray(biomeLinks[biome]) - ? biomeLinks[biome] as (Biome | [ Biome, integer ])[] + const linkedBiomes: (Biome | [ Biome, number ])[] = Array.isArray(biomeLinks[biome]) + ? biomeLinks[biome] as (Biome | [ Biome, number ])[] : [ biomeLinks[biome] as Biome ]; for (const linkedBiomeEntry of linkedBiomes) { const linkedBiome = !Array.isArray(linkedBiomeEntry) @@ -7687,7 +7701,7 @@ export function initBiomes() { }; traverseBiome(Biome.TOWN, 0); - biomeDepths[Biome.END] = [ Object.values(biomeDepths).map(d => d[0]).reduce((max: integer, value: integer) => Math.max(max, value), 0) + 1, 1 ]; + biomeDepths[Biome.END] = [ Object.values(biomeDepths).map(d => d[0]).reduce((max: number, value: number) => Math.max(max, value), 0) + 1, 1 ]; for (const biome of Utils.getEnumValues(Biome)) { biomePokemonPools[biome] = {}; @@ -7715,6 +7729,9 @@ export function initBiomes() { uncatchableSpecies.push(speciesId); } + // array of biome options for the current species + catchableSpecies[speciesId] = []; + for (const b of biomeEntries) { const biome = b[0]; const tier = b[1]; @@ -7724,6 +7741,12 @@ export function initBiomes() { : [ b[2] ] : [ TimeOfDay.ALL ]; + catchableSpecies[speciesId].push({ + biome: biome as Biome, + tier: tier as BiomePoolTier, + tod: timesOfDay as TimeOfDay[] + }); + for (const tod of timesOfDay) { if (!biomePokemonPools.hasOwnProperty(biome) || !biomePokemonPools[biome].hasOwnProperty(tier) || !biomePokemonPools[biome][tier].hasOwnProperty(tod)) { continue; @@ -7742,7 +7765,8 @@ export function initBiomes() { treeIndex = t; arrayIndex = es + 1; break; - } else if (speciesEvolutions && speciesEvolutions.find(se => se.speciesId === existingSpeciesId)) { + } + if (speciesEvolutions?.find(se => se.speciesId === existingSpeciesId)) { treeIndex = t; arrayIndex = es; break; @@ -7764,7 +7788,7 @@ export function initBiomes() { for (const b of Object.keys(biomePokemonPools)) { for (const t of Object.keys(biomePokemonPools[b])) { - const tier = parseInt(t) as BiomePoolTier; + const tier = Number.parseInt(t) as BiomePoolTier; for (const tod of Object.keys(biomePokemonPools[b][t])) { const biomeTierTimePool = biomePokemonPools[b][t][tod]; for (let e = 0; e < biomeTierTimePool.length; e++) { @@ -7777,7 +7801,7 @@ export function initBiomes() { }; for (let s = 1; s < entry.length; s++) { const speciesId = entry[s]; - const prevolution = entry.map(s => pokemonEvolutions[s]).flat().find(e => e && e.speciesId === speciesId); + const prevolution = entry.flatMap((s: string | number) => pokemonEvolutions[s]).find(e => e && e.speciesId === speciesId); const level = prevolution.level - (prevolution.level === 1 ? 1 : 0) + (prevolution.wildDelay * 10) - (tier >= BiomePoolTier.BOSS ? 10 : 0); if (!newEntry.hasOwnProperty(level)) { newEntry[level] = [ speciesId ]; diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 8df92e179d9..5829e3e10aa 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -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.SHORE_UP, 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.PIDGEY]: [ Moves.BLEAKWIND_STORM, Moves.SANDSEAR_STORM, Moves.CALM_MIND, 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,106 +31,108 @@ 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.SPLISHY_SPLASH, 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.EXEGGCUTE]: [ Moves.FICKLE_BEAM, Moves.APPLE_ACID, Moves.HEAT_WAVE, 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.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.TANGELA]: [ Moves.NATURES_MADNESS, Moves.SNAP_TRAP, Moves.PARTING_SHOT, Moves.SAPPY_SEED ], + [Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.TRAILBLAZE, Moves.COVET, Moves.SEISMIC_TOSS ], + [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.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.DRAGON_ASCENT, Moves.SURGING_STRIKES ], + [Species.TAUROS]: [ Moves.SWORDS_DANCE, Moves.FIRE_LASH, Moves.WICKED_TORQUE, Moves.COLLISION_COURSE ], + [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.KNOCK_OFF, Moves.DRAGON_ASCENT ], [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.PLAY_ROUGH, 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.FIERY_WRATH, Moves.THUNDERBOLT, Moves.MOONBLAST, Moves.ARMOR_CANNON ], + [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.POOCHYENA]: [ Moves.JAW_LOCK, Moves.CLOSE_COMBAT, Moves.DIRE_CLAW, Moves.NO_RETREAT ], + + [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.KNOCK_OFF, Moves.CLOSE_COMBAT, Moves.DIRE_CLAW, Moves.VICTORY_DANCE ], [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 ], [Species.LOTAD]: [ Moves.REVELATION_DANCE, Moves.APPLE_ACID, Moves.ICE_BEAM, Moves.QUIVER_DANCE ], @@ -151,44 +153,44 @@ 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.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.GULPIN]: [ Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.STRENGTH_SAP ], + [Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.GUNK_SHOT, Moves.OBSTRUCT, Moves.SURGING_STRIKES ], + [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 ], - [Species.SNORUNT]: [ Moves.FREEZY_FROST, Moves.EXTREME_SPEED, Moves.EARTH_POWER, Moves.NO_RETREAT ], + [Species.SNORUNT]: [ Moves.SPARKLY_SWIRL, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.BLOOD_MOON ], [Species.SPHEAL]: [ Moves.FLIP_TURN, Moves.FREEZE_DRY, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], [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.HEADLONG_RUSH, 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 ], @@ -199,10 +201,11 @@ export const speciesEggMoves = { [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.CHIMCHAR]: [ Moves.THUNDERBOLT, Moves.SECRET_SWORD, Moves.TRIPLE_AXEL, Moves.SACRED_FIRE ], + [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 ], @@ -212,63 +215,64 @@ export const speciesEggMoves = { [Species.SHIELDON]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.DIAMOND_STORM ], [Species.BURMY]: [ Moves.FIERY_DANCE, Moves.DEFEND_ORDER, Moves.HEAL_ORDER, Moves.SAPPY_SEED ], [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.PACHIRISU]: [ Moves.FREEZY_FROST, Moves.SIZZLY_SLIDE, Moves.SLACK_OFF, Moves.THUNDER_CAGE ], [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 ], + [Species.DRIFLOON]: [ Moves.PSYCHO_SHIFT, Moves.MIND_BLOWN, Moves.CALM_MIND, Moves.OBLIVION_WING ], + [Species.BUNEARY]: [ Moves.TRIPLE_AXEL, Moves.EXTREME_SPEED, Moves.THUNDEROUS_KICK, Moves.SWORDS_DANCE ], [Species.GLAMEOW]: [ Moves.PARTING_SHOT, Moves.HIGH_HORSEPOWER, Moves.SWORDS_DANCE, Moves.EXTREME_SPEED ], [Species.CHINGLING]: [ Moves.BUZZY_BUZZ, Moves.EERIE_SPELL, Moves.TORCH_SONG, Moves.BOOMBURST ], - [Species.STUNKY]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.RECOVER, Moves.DIRE_CLAW ], + [Species.STUNKY]: [ Moves.CEASELESS_EDGE, Moves.FIRE_LASH, Moves.RECOVER, Moves.DIRE_CLAW ], [Species.BRONZOR]: [ Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.GLARE, Moves.LUMINA_CRASH ], [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.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.TRIPLE_AXEL, 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.FINNEON]: [ Moves.QUIVER_DANCE, Moves.SPLISHY_SPLASH, Moves.FREEZE_DRY, Moves.OBLIVION_WING ], [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.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.UXIE]: [ Moves.LUMINA_CRASH, Moves.AURA_SPHERE, Moves.RECOVER, Moves.TAIL_GLOW ], + [Species.MESPRIT]: [ Moves.PHOTON_GEYSER, Moves.AURA_SPHERE, Moves.RECOVER, Moves.TAIL_GLOW ], + [Species.AZELF]: [ Moves.PSYSTRIKE, Moves.AURA_SPHERE, Moves.ICE_BEAM, 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.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.SPECTRAL_THIEF, Moves.RECOVER, Moves.COLLISION_COURSE ], + [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 ], [Species.PURRLOIN]: [ Moves.ENCORE, Moves.OBSTRUCT, Moves.PARTING_SHOT, Moves.WICKED_BLOW ], [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.PIDOVE]: [ Moves.GUNK_SHOT, Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], + [Species.PANSEAR]: [ Moves.NASTY_PLOT, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.ERUPTION ], + [Species.PANPOUR]: [ Moves.NASTY_PLOT, Moves.ENERGY_BALL, Moves.EARTH_POWER, Moves.WATER_SPOUT ], + [Species.MUNNA]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.LUNAR_BLESSING, Moves.MYSTICAL_POWER ], + [Species.PIDOVE]: [ Moves.SLASH, 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.ICE_SPINNER, Moves.SHIFT_GEAR, Moves.THOUSAND_ARROWS ], + [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.SUCKER_PUNCH, Moves.FIRE_LASH, Moves.HEADLONG_RUSH ], + [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.DEERLING]: [ Moves.TIDY_UP, Moves.HEADBUTT, Moves.COMBAT_TORQUE, Moves.FLOWER_TRICK ], + [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.CEASELESS_EDGE, 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.GIGA_DRAIN, 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,111 +325,122 @@ 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.DAZZLING_GLEAM, Moves.EARTH_POWER, Moves.HYDRO_STEAM ], [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.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.KNOCK_OFF, Moves.VICTORY_DANCE ], + [Species.VIRIZION]: [ Moves.SAPPY_SEED, Moves.PSYBLADE, Moves.STONE_AXE, Moves.VICTORY_DANCE ], + [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.ZEKROM]: [ Moves.TRIPLE_AXEL, Moves.THUNDEROUS_KICK, Moves.DRAGON_HAMMER, Moves.DRAGON_ENERGY ], [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.BUNNELBY]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.LANDS_WRATH, 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.BULK_UP, 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.YVELTAL]: [ Moves.SLUDGE_WAVE, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ], + [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.V_CREATE, Moves.CLANGOROUS_SOUL, Moves.HEAL_ORDER ], + [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.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.SEARING_SHOT, Moves.THUNDERCLAP ], + [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.MOONLIGHT, 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 ], - [Species.CRABRAWLER]: [ Moves.JET_PUNCH, Moves.SHORE_UP, Moves.SUCKER_PUNCH, Moves.SURGING_STRIKES ], + [Species.CRABRAWLER]: [ Moves.JET_PUNCH, Moves.SHORE_UP, Moves.MACH_PUNCH, Moves.SURGING_STRIKES ], [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 ], + [Species.DEWPIDER]: [ Moves.AQUA_STEP, Moves.SILK_TRAP, Moves.SWORDS_DANCE, Moves.JET_PUNCH ], [Species.FOMANTIS]: [ Moves.SUPERPOWER, Moves.HEADLONG_RUSH, Moves.ICE_HAMMER, Moves.BITTER_BLADE ], [Species.MORELULL]: [ Moves.CALM_MIND, Moves.SAPPY_SEED, Moves.DRAINING_KISS, Moves.MATCHA_GOTCHA ], - [Species.SALANDIT]: [ Moves.SCALD, Moves.SLUDGE_WAVE, Moves.CORE_ENFORCER, Moves.ERUPTION ], + [Species.SALANDIT]: [ Moves.SCALD, Moves.MALIGNANT_CHAIN, Moves.CORE_ENFORCER, Moves.ERUPTION ], [Species.STUFFUL]: [ Moves.DRAIN_PUNCH, Moves.METEOR_MASH, Moves.TRIPLE_AXEL, Moves.RAGE_FIST ], [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.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.LANDS_WRATH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ], + [Species.TAPU_FINI]: [ Moves.SPRINGTIDE_STORM, 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 ], + [Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.EARTH_POWER, Moves.OBLIVION_WING ], [Species.KARTANA]: [ Moves.MIGHTY_CLEAVE, Moves.PSYBLADE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ], [Species.GUZZLORD]: [ Moves.SUCKER_PUNCH, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ], [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.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.BONEMERANG, Moves.METEOR_MASH, Moves.TRIPLE_AXEL ], + [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.ZERAORA]: [ Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE, Moves.PYRO_BALL ], + [Species.BLACEPHALON]: [ Moves.STEEL_BEAM, Moves.MOONBLAST, Moves.CHLOROBLAST, Moves.MOONGEIST_BEAM ], + [Species.ZERAORA]: [ Moves.SWORDS_DANCE, Moves.U_TURN, Moves.COLLISION_COURSE, Moves.TRIPLE_AXEL ], [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.LIQUIDATION, 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,55 +448,73 @@ 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.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.GOSSIFLEUR]: [ Moves.PARTING_SHOT, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SEED_FLARE ], + [Species.WOOLOO]: [ Moves.NUZZLE, Moves.MILK_DRINK, Moves.BODY_PRESS, Moves.MULTI_ATTACK ], + [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.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.BOLT_BEAK, Moves.OBLIVION_WING ], + [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 ], - [Species.SINISTEA]: [ Moves.SCALD, Moves.TAKE_HEART, Moves.SPARKLY_SWIRL, Moves.MATCHA_GOTCHA ], + [Species.SINISTEA]: [ Moves.SPLISHY_SPLASH, Moves.MATCHA_GOTCHA, Moves.DRAINING_KISS, Moves.MOONGEIST_BEAM ], [Species.HATENNA]: [ Moves.RECOVER, Moves.MOONBLAST, Moves.BUZZY_BUZZ, Moves.TORCH_SONG ], - [Species.IMPIDIMP]: [ Moves.ENCORE, Moves.PARTING_SHOT, Moves.TOPSY_TURVY, Moves.WICKED_BLOW ], + [Species.IMPIDIMP]: [ Moves.SLACK_OFF, Moves.PARTING_SHOT, Moves.OCTOLOCK, 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.FALINKS]: [ Moves.BATON_PASS, Moves.POWER_TRIP, Moves.HEAL_ORDER, Moves.COMBAT_TORQUE ], + [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 ], [Species.KUBFU]: [ Moves.METEOR_MASH, Moves.DRAIN_PUNCH, Moves.JET_PUNCH, Moves.DRAGON_DANCE ], [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.SPECTRIER]: [ Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ], + [Species.REGIDRAGO]: [ Moves.SHELL_SIDE_ARM, Moves.FLAMETHROWER, Moves.TAKE_HEART, Moves.DRAGON_DARTS ], + [Species.GLASTRIER]: [ Moves.SPEED_SWAP, Moves.SLACK_OFF, Moves.HIGH_HORSEPOWER, Moves.GLACIAL_LANCE ], + [Species.SPECTRIER]: [ Moves.EARTH_POWER, Moves.MOONLIGHT, 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.POISON_JAB, 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.SECRET_SWORD, 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.LECHONK]: [ Moves.MILK_DRINK, Moves.PSYSHIELD_BASH, Moves.BLAZING_TORQUE, Moves.FILLET_AWAY ], [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 ], @@ -489,91 +522,66 @@ export const speciesEggMoves = { [Species.CHARCADET]: [ Moves.SACRED_SWORD, Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.SPECTRAL_THIEF ], [Species.TADBULB]: [ Moves.PARABOLIC_CHARGE, Moves.SCALD, Moves.EARTH_POWER, Moves.ELECTRO_SHOT ], [Species.WATTREL]: [ Moves.NASTY_PLOT, Moves.SPLISHY_SPLASH, Moves.SANDSEAR_STORM, Moves.ELECTRO_SHOT ], - [Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.CLOSE_COMBAT, Moves.PSYCHIC_FANGS, Moves.NO_RETREAT ], + [Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.COMBAT_TORQUE, Moves.PSYCHIC_FANGS, Moves.NO_RETREAT ], [Species.SHROODLE]: [ Moves.GASTRO_ACID, Moves.PARTING_SHOT, Moves.TOXIC, Moves.SKETCH ], [Species.BRAMBLIN]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.FLOWER_TRICK, Moves.LAST_RESPECTS ], [Species.TOEDSCOOL]: [ Moves.STRENGTH_SAP, Moves.TOPSY_TURVY, Moves.SAPPY_SEED, Moves.TAIL_GLOW ], [Species.KLAWF]: [ Moves.CRABHAMMER, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH ], [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.RELLOR]: [ Moves.HEAL_BLOCK, Moves.RECOVER, Moves.MAGIC_POWDER, 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.GLIMMET]: [ Moves.CALM_MIND, Moves.GIGA_DRAIN, Moves.FIERY_DANCE, Moves.MALIGNANT_CHAIN ], + [Species.GREAVARD]: [ Moves.SHADOW_BONE, Moves.SIZZLY_SLIDE, 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.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.CETODDLE]: [ Moves.ZING_ZAP, Moves.HIGH_HORSEPOWER, Moves.SLACK_OFF, Moves.DRAGON_DANCE ], + [Species.VELUZA]: [ Moves.PSYBLADE, Moves.LEAF_BLADE, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE ], + [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 ], - [Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.STEAM_ERUPTION ], + [Species.IRON_TREADS]: [ Moves.FUSION_BOLT, Moves.SHIFT_GEAR, Moves.SHORE_UP, Moves.SUNSTEEL_STRIKE ], + [Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.SPLISHY_SPLASH, Moves.VOLT_SWITCH, Moves.NASTY_PLOT ], [Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS, Moves.ICE_HAMMER ], [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.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.METEOR_MASH, Moves.DRAGON_ASCENT ], [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.FUSION_FLARE, 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.TERAPAGOS]: [ Moves.MOONBLAST, Moves.NASTY_PLOT, Moves.ASTRAL_BARRAGE, Moves.RECOVER ], + [Species.PECHARUNT]: [ Moves.TAKE_HEART, Moves.BODY_PRESS, Moves.SAPPY_SEED, Moves.ASTRAL_BARRAGE ], [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 { @@ -583,7 +591,7 @@ function parseEggMoves(content: string): void { const speciesValues = Utils.getEnumValues(Species); const lines = content.split(/\n/g); - lines.forEach((line, l) => { + for (const line of lines) { const cols = line.split(",").slice(0, 5); const moveNames = allMoves.map(m => m.name.replace(/ \([A-Z]\)$/, "").toLowerCase()); const enumSpeciesName = cols[0].toUpperCase().replace(/[ -]/g, "_"); @@ -604,7 +612,7 @@ function parseEggMoves(content: string): void { if (eggMoves.find(m => m !== Moves.NONE)) { output += `[Species.${Species[species]}]: [ ${eggMoves.map(m => `Moves.${Moves[m]}`).join(", ")} ],\n`; } - }); + } console.log(output); } diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index 6fb0e80e085..c613be0137b 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -1,574 +1,590 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; -export const starterPassiveAbilities = { - [Species.BULBASAUR]: Abilities.GRASSY_SURGE, - [Species.CHARMANDER]: Abilities.BEAST_BOOST, - [Species.SQUIRTLE]: Abilities.STURDY, - [Species.CATERPIE]: Abilities.MAGICIAN, - [Species.WEEDLE]: Abilities.TINTED_LENS, - [Species.PIDGEY]: Abilities.SHEER_FORCE, - [Species.RATTATA]: Abilities.STRONG_JAW, - [Species.SPEAROW]: Abilities.MOXIE, - [Species.EKANS]: Abilities.REGENERATOR, - [Species.SANDSHREW]: Abilities.TOUGH_CLAWS, - [Species.NIDORAN_F]: Abilities.FLARE_BOOST, - [Species.NIDORAN_M]: Abilities.GUTS, - [Species.VULPIX]: Abilities.FUR_COAT, - [Species.ZUBAT]: Abilities.INTIMIDATE, - [Species.ODDISH]: Abilities.TRIAGE, - [Species.PARAS]: Abilities.TRIAGE, - [Species.VENONAT]: Abilities.SIMPLE, - [Species.DIGLETT]: Abilities.STURDY, - [Species.MEOWTH]: Abilities.TOUGH_CLAWS, - [Species.PSYDUCK]: Abilities.SIMPLE, - [Species.MANKEY]: Abilities.IRON_FIST, - [Species.GROWLITHE]: Abilities.SPEED_BOOST, - [Species.POLIWAG]: Abilities.NO_GUARD, - [Species.ABRA]: Abilities.PSYCHIC_SURGE, - [Species.MACHOP]: Abilities.QUICK_FEET, - [Species.BELLSPROUT]: Abilities.FLOWER_GIFT, - [Species.TENTACOOL]: Abilities.TOXIC_CHAIN, - [Species.GEODUDE]: Abilities.DRY_SKIN, - [Species.PONYTA]: Abilities.MAGIC_GUARD, - [Species.SLOWPOKE]: Abilities.UNAWARE, - [Species.MAGNEMITE]: Abilities.LEVITATE, - [Species.FARFETCHD]: Abilities.SNIPER, - [Species.DODUO]: Abilities.PARENTAL_BOND, - [Species.SEEL]: Abilities.WATER_BUBBLE, - [Species.GRIMER]: Abilities.WATER_ABSORB, - [Species.SHELLDER]: Abilities.ICE_SCALES, - [Species.GASTLY]: Abilities.SHADOW_SHIELD, - [Species.ONIX]: Abilities.ROCKY_PAYLOAD, - [Species.DROWZEE]: Abilities.MAGICIAN, - [Species.KRABBY]: Abilities.THERMAL_EXCHANGE, - [Species.VOLTORB]: Abilities.TRANSISTOR, - [Species.EXEGGCUTE]: Abilities.RIPEN, - [Species.CUBONE]: Abilities.PARENTAL_BOND, - [Species.LICKITUNG]: Abilities.CHEEK_POUCH, - [Species.KOFFING]: Abilities.PARENTAL_BOND, - [Species.RHYHORN]: Abilities.FILTER, - [Species.TANGELA]: Abilities.SEED_SOWER, - [Species.KANGASKHAN]: Abilities.GUTS, - [Species.HORSEA]: Abilities.DRAGONS_MAW, - [Species.GOLDEEN]: Abilities.MULTISCALE, - [Species.STARYU]: Abilities.REGENERATOR, - [Species.SCYTHER]: Abilities.TINTED_LENS, - [Species.PINSIR]: Abilities.TINTED_LENS, - [Species.TAUROS]: Abilities.STAMINA, - [Species.MAGIKARP]: Abilities.MULTISCALE, - [Species.LAPRAS]: Abilities.LIGHTNING_ROD, - [Species.DITTO]: Abilities.ADAPTABILITY, - [Species.EEVEE]: Abilities.PICKUP, - [Species.PORYGON]: Abilities.PROTEAN, - [Species.OMANYTE]: Abilities.STURDY, - [Species.KABUTO]: Abilities.TOUGH_CLAWS, - [Species.AERODACTYL]: Abilities.ORICHALCUM_PULSE, - [Species.ARTICUNO]: Abilities.SNOW_WARNING, - [Species.ZAPDOS]: Abilities.DRIZZLE, - [Species.MOLTRES]: Abilities.DROUGHT, - [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, - [Species.SENTRET]: Abilities.PICKUP, - [Species.HOOTHOOT]: Abilities.AERILATE, - [Species.LEDYBA]: Abilities.PRANKSTER, - [Species.SPINARAK]: Abilities.PRANKSTER, - [Species.CHINCHOU]: Abilities.WATER_BUBBLE, - [Species.PICHU]: Abilities.ELECTRIC_SURGE, - [Species.CLEFFA]: Abilities.ANALYTIC, - [Species.IGGLYBUFF]: Abilities.HUGE_POWER, - [Species.TOGEPI]: Abilities.PIXILATE, - [Species.NATU]: Abilities.TINTED_LENS, - [Species.MAREEP]: Abilities.ELECTROMORPHOSIS, - [Species.HOPPIP]: Abilities.FLUFFY, - [Species.AIPOM]: Abilities.SCRAPPY, - [Species.SUNKERN]: Abilities.DROUGHT, - [Species.YANMA]: Abilities.SHEER_FORCE, - [Species.WOOPER]: Abilities.COMATOSE, - [Species.MURKROW]: Abilities.DARK_AURA, - [Species.MISDREAVUS]: Abilities.BEADS_OF_RUIN, - [Species.UNOWN]: Abilities.PICKUP, - [Species.GIRAFARIG]: Abilities.PARENTAL_BOND, - [Species.PINECO]: Abilities.IRON_BARBS, - [Species.DUNSPARCE]: Abilities.UNAWARE, - [Species.GLIGAR]: Abilities.TOXIC_BOOST, - [Species.SNUBBULL]: Abilities.PIXILATE, - [Species.QWILFISH]: Abilities.TOXIC_DEBRIS, - [Species.SHUCKLE]: Abilities.HARVEST, - [Species.HERACROSS]: Abilities.TECHNICIAN, - [Species.SNEASEL]: Abilities.TOUGH_CLAWS, - [Species.TEDDIURSA]: Abilities.THICK_FAT, - [Species.SLUGMA]: Abilities.DESOLATE_LAND, - [Species.SWINUB]: Abilities.SLUSH_RUSH, - [Species.CORSOLA]: Abilities.STORM_DRAIN, - [Species.REMORAID]: Abilities.SIMPLE, - [Species.DELIBIRD]: Abilities.HUGE_POWER, - [Species.SKARMORY]: Abilities.LIGHTNING_ROD, - [Species.HOUNDOUR]: Abilities.DROUGHT, - [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.MILTANK]: Abilities.STAMINA, - [Species.RAIKOU]: Abilities.TRANSISTOR, - [Species.ENTEI]: Abilities.MOXIE, - [Species.SUICUNE]: Abilities.UNAWARE, - [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.MUDKIP]: Abilities.DRIZZLE, - [Species.POOCHYENA]: Abilities.TOUGH_CLAWS, - [Species.ZIGZAGOON]: Abilities.RUN_AWAY, - [Species.WURMPLE]: Abilities.SIMPLE, - [Species.LOTAD]: Abilities.DRIZZLE, - [Species.SEEDOT]: Abilities.SHARPNESS, - [Species.TAILLOW]: Abilities.AERILATE, - [Species.WINGULL]: Abilities.SWIFT_SWIM, - [Species.RALTS]: Abilities.PSYCHIC_SURGE, - [Species.SURSKIT]: Abilities.WATER_BUBBLE, - [Species.SHROOMISH]: Abilities.GUTS, - [Species.SLAKOTH]: Abilities.GUTS, - [Species.NINCADA]: Abilities.MAGIC_GUARD, - [Species.WHISMUR]: Abilities.PUNK_ROCK, - [Species.MAKUHITA]: Abilities.STAMINA, - [Species.AZURILL]: Abilities.MISTY_SURGE, - [Species.NOSEPASS]: Abilities.LEVITATE, - [Species.SKITTY]: Abilities.SCRAPPY, - [Species.SABLEYE]: Abilities.UNNERVE, - [Species.MAWILE]: Abilities.UNNERVE, - [Species.ARON]: Abilities.EARTH_EATER, - [Species.MEDITITE]: Abilities.MINDS_EYE, - [Species.ELECTRIKE]: Abilities.ELECTRIC_SURGE, - [Species.PLUSLE]: Abilities.POWER_SPOT, - [Species.MINUN]: Abilities.POWER_SPOT, - [Species.VOLBEAT]: Abilities.HONEY_GATHER, - [Species.ILLUMISE]: Abilities.HONEY_GATHER, - [Species.GULPIN]: Abilities.EARTH_EATER, - [Species.CARVANHA]: Abilities.SHEER_FORCE, - [Species.WAILMER]: Abilities.LEVITATE, - [Species.NUMEL]: Abilities.FUR_COAT, - [Species.TORKOAL]: Abilities.ANALYTIC, - [Species.SPOINK]: Abilities.PSYCHIC_SURGE, - [Species.SPINDA]: Abilities.SIMPLE, - [Species.TRAPINCH]: Abilities.ADAPTABILITY, - [Species.CACNEA]: Abilities.SAND_RUSH, - [Species.SWABLU]: Abilities.ADAPTABILITY, - [Species.ZANGOOSE]: Abilities.POISON_HEAL, - [Species.SEVIPER]: Abilities.MULTISCALE, - [Species.LUNATONE]: Abilities.SHADOW_SHIELD, - [Species.SOLROCK]: Abilities.DROUGHT, - [Species.BARBOACH]: Abilities.SIMPLE, - [Species.CORPHISH]: Abilities.TOUGH_CLAWS, - [Species.BALTOY]: Abilities.WELL_BAKED_BODY, - [Species.LILEEP]: Abilities.SEED_SOWER, - [Species.ANORITH]: Abilities.WATER_ABSORB, - [Species.FEEBAS]: Abilities.MAGIC_GUARD, - [Species.CASTFORM]: Abilities.ADAPTABILITY, - [Species.KECLEON]: Abilities.ADAPTABILITY, - [Species.SHUPPET]: Abilities.SHADOW_SHIELD, - [Species.DUSKULL]: Abilities.UNNERVE, - [Species.TROPIUS]: Abilities.RIPEN, - [Species.ABSOL]: Abilities.SHARPNESS, - [Species.WYNAUT]: Abilities.STURDY, - [Species.SNORUNT]: Abilities.SNOW_WARNING, - [Species.SPHEAL]: Abilities.UNAWARE, - [Species.CLAMPERL]: Abilities.DRIZZLE, - [Species.RELICANTH]: Abilities.PRIMORDIAL_SEA, - [Species.LUVDISC]: Abilities.MULTISCALE, - [Species.BAGON]: Abilities.DRAGONS_MAW, - [Species.BELDUM]: Abilities.LEVITATE, - [Species.REGIROCK]: Abilities.SAND_STREAM, - [Species.REGICE]: Abilities.SNOW_WARNING, - [Species.REGISTEEL]: Abilities.FILTER, - [Species.LATIAS]: Abilities.PRISM_ARMOR, - [Species.LATIOS]: Abilities.TINTED_LENS, - [Species.KYOGRE]: Abilities.MOLD_BREAKER, - [Species.GROUDON]: Abilities.TURBOBLAZE, - [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, - [Species.STARLY]: Abilities.ROCK_HEAD, - [Species.BIDOOF]: Abilities.SAP_SIPPER, - [Species.KRICKETOT]: Abilities.SHARPNESS, - [Species.SHINX]: Abilities.SPEED_BOOST, - [Species.BUDEW]: Abilities.GRASSY_SURGE, - [Species.CRANIDOS]: Abilities.ROCK_HEAD, - [Species.SHIELDON]: Abilities.EARTH_EATER, - [Species.BURMY]: Abilities.STURDY, - [Species.COMBEE]: Abilities.INTIMIDATE, - [Species.PACHIRISU]: Abilities.HONEY_GATHER, - [Species.BUIZEL]: Abilities.MOXIE, - [Species.CHERUBI]: Abilities.ORICHALCUM_PULSE, - [Species.SHELLOS]: Abilities.REGENERATOR, - [Species.DRIFLOON]: Abilities.MAGIC_GUARD, - [Species.BUNEARY]: Abilities.ADAPTABILITY, - [Species.GLAMEOW]: Abilities.INTIMIDATE, - [Species.CHINGLING]: Abilities.PUNK_ROCK, - [Species.STUNKY]: Abilities.NEUTRALIZING_GAS, - [Species.BRONZOR]: Abilities.BULLETPROOF, - [Species.BONSLY]: Abilities.SAP_SIPPER, - [Species.MIME_JR]: Abilities.OPPORTUNIST, - [Species.HAPPINY]: Abilities.FUR_COAT, - [Species.CHATOT]: Abilities.PUNK_ROCK, - [Species.SPIRITOMB]: Abilities.VESSEL_OF_RUIN, - [Species.GIBLE]: Abilities.SAND_STREAM, - [Species.MUNCHLAX]: Abilities.RIPEN, - [Species.RIOLU]: Abilities.MINDS_EYE, - [Species.HIPPOPOTAS]: Abilities.UNAWARE, - [Species.SKORUPI]: Abilities.SUPER_LUCK, - [Species.CROAGUNK]: Abilities.MOXIE, - [Species.CARNIVINE]: Abilities.ARENA_TRAP, - [Species.FINNEON]: Abilities.WATER_BUBBLE, - [Species.MANTYKE]: Abilities.UNAWARE, - [Species.SNOVER]: Abilities.THICK_FAT, - [Species.ROTOM]: Abilities.HADRON_ENGINE, - [Species.UXIE]: Abilities.UNAWARE, - [Species.MESPRIT]: Abilities.MOODY, - [Species.AZELF]: Abilities.NEUROFORCE, - [Species.DIALGA]: Abilities.LEVITATE, - [Species.PALKIA]: Abilities.SPEED_BOOST, - [Species.HEATRAN]: Abilities.EARTH_EATER, - [Species.REGIGIGAS]: Abilities.SCRAPPY, - [Species.GIRATINA]: Abilities.SHADOW_SHIELD, - [Species.CRESSELIA]: Abilities.SHADOW_SHIELD, - [Species.PHIONE]: Abilities.SIMPLE, - [Species.MANAPHY]: Abilities.PRIMORDIAL_SEA, - [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, - [Species.OSHAWOTT]: Abilities.INTREPID_SWORD, - [Species.PATRAT]: Abilities.NO_GUARD, - [Species.LILLIPUP]: Abilities.FUR_COAT, - [Species.PURRLOIN]: Abilities.PICKUP, - [Species.PANSAGE]: Abilities.WELL_BAKED_BODY, - [Species.PANSEAR]: Abilities.WATER_ABSORB, - [Species.PANPOUR]: Abilities.SAP_SIPPER, - [Species.MUNNA]: Abilities.NEUTRALIZING_GAS, - [Species.PIDOVE]: Abilities.SNIPER, - [Species.BLITZLE]: Abilities.ELECTRIC_SURGE, - [Species.ROGGENROLA]: Abilities.SOLID_ROCK, - [Species.WOOBAT]: Abilities.OPPORTUNIST, - [Species.DRILBUR]: Abilities.SAND_STREAM, - [Species.AUDINO]: Abilities.FRIEND_GUARD, - [Species.TIMBURR]: Abilities.ROCKY_PAYLOAD, - [Species.TYMPOLE]: Abilities.POISON_HEAL, - [Species.THROH]: Abilities.STAMINA, - [Species.SAWK]: Abilities.SCRAPPY, - [Species.SEWADDLE]: Abilities.SHARPNESS, - [Species.VENIPEDE]: Abilities.STAMINA, - [Species.COTTONEE]: Abilities.FLUFFY, - [Species.PETILIL]: Abilities.SIMPLE, - [Species.BASCULIN]: Abilities.SUPREME_OVERLORD, - [Species.SANDILE]: Abilities.TOUGH_CLAWS, - [Species.DARUMAKA]: Abilities.GORILLA_TACTICS, - [Species.MARACTUS]: Abilities.WELL_BAKED_BODY, - [Species.DWEBBLE]: Abilities.ROCKY_PAYLOAD, - [Species.SCRAGGY]: Abilities.PROTEAN, - [Species.SIGILYPH]: Abilities.FLARE_BOOST, - [Species.YAMASK]: Abilities.PURIFYING_SALT, - [Species.TIRTOUGA]: Abilities.WATER_ABSORB, - [Species.ARCHEN]: Abilities.MULTISCALE, - [Species.TRUBBISH]: Abilities.NEUTRALIZING_GAS, - [Species.ZORUA]: Abilities.DARK_AURA, - [Species.MINCCINO]: Abilities.FUR_COAT, - [Species.GOTHITA]: Abilities.UNNERVE, - [Species.SOLOSIS]: Abilities.PSYCHIC_SURGE, - [Species.DUCKLETT]: Abilities.DRIZZLE, - [Species.VANILLITE]: Abilities.SLUSH_RUSH, - [Species.DEERLING]: Abilities.FUR_COAT, - [Species.EMOLGA]: Abilities.TRANSISTOR, - [Species.KARRABLAST]: Abilities.QUICK_DRAW, - [Species.FOONGUS]: Abilities.THICK_FAT, - [Species.FRILLISH]: Abilities.POISON_HEAL, - [Species.ALOMOMOLA]: Abilities.MULTISCALE, - [Species.JOLTIK]: Abilities.TRANSISTOR, - [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.AXEW]: Abilities.DRAGONS_MAW, - [Species.CUBCHOO]: Abilities.TOUGH_CLAWS, - [Species.CRYOGONAL]: Abilities.SNOW_WARNING, - [Species.SHELMET]: Abilities.PROTEAN, - [Species.STUNFISK]: Abilities.STORM_DRAIN, - [Species.MIENFOO]: Abilities.NO_GUARD, - [Species.DRUDDIGON]: Abilities.INTIMIDATE, - [Species.GOLETT]: Abilities.SHADOW_SHIELD, - [Species.PAWNIARD]: Abilities.SWORD_OF_RUIN, - [Species.BOUFFALANT]: Abilities.ROCK_HEAD, - [Species.RUFFLET]: Abilities.SPEED_BOOST, - [Species.VULLABY]: Abilities.THICK_FAT, - [Species.HEATMOR]: Abilities.CONTRARY, - [Species.DURANT]: Abilities.COMPOUND_EYES, - [Species.DEINO]: Abilities.PARENTAL_BOND, - [Species.LARVESTA]: Abilities.DROUGHT, - [Species.COBALION]: Abilities.INTREPID_SWORD, - [Species.TERRAKION]: Abilities.ROCKY_PAYLOAD, - [Species.VIRIZION]: Abilities.SHARPNESS, - [Species.TORNADUS]: Abilities.DRIZZLE, - [Species.THUNDURUS]: Abilities.DRIZZLE, - [Species.RESHIRAM]: Abilities.ORICHALCUM_PULSE, - [Species.ZEKROM]: Abilities.HADRON_ENGINE, - [Species.LANDORUS]: Abilities.STORM_DRAIN, - [Species.KYUREM]: Abilities.SNOW_WARNING, - [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, - [Species.BUNNELBY]: Abilities.GUTS, - [Species.FLETCHLING]: Abilities.MAGIC_GUARD, - [Species.SCATTERBUG]: Abilities.PRANKSTER, - [Species.LITLEO]: Abilities.BEAST_BOOST, - [Species.FLABEBE]: Abilities.GRASSY_SURGE, - [Species.SKIDDO]: Abilities.SEED_SOWER, - [Species.PANCHAM]: Abilities.FUR_COAT, - [Species.FURFROU]: Abilities.FLUFFY, - [Species.ESPURR]: Abilities.FUR_COAT, - [Species.HONEDGE]: Abilities.SHARPNESS, - [Species.SPRITZEE]: Abilities.FUR_COAT, - [Species.SWIRLIX]: Abilities.WELL_BAKED_BODY, - [Species.INKAY]: Abilities.UNNERVE, - [Species.BINACLE]: Abilities.SAP_SIPPER, - [Species.SKRELP]: Abilities.DRAGONS_MAW, - [Species.CLAUNCHER]: Abilities.SWIFT_SWIM, - [Species.HELIOPTILE]: Abilities.PROTEAN, - [Species.TYRUNT]: Abilities.RECKLESS, - [Species.AMAURA]: Abilities.ICE_SCALES, - [Species.HAWLUCHA]: Abilities.MOXIE, - [Species.DEDENNE]: Abilities.PIXILATE, - [Species.CARBINK]: Abilities.SOLID_ROCK, - [Species.GOOMY]: Abilities.REGENERATOR, - [Species.KLEFKI]: Abilities.LEVITATE, - [Species.PHANTUMP]: Abilities.SHADOW_TAG, - [Species.PUMPKABOO]: Abilities.WELL_BAKED_BODY, - [Species.BERGMITE]: Abilities.ICE_SCALES, - [Species.NOIBAT]: Abilities.PUNK_ROCK, - [Species.XERNEAS]: Abilities.HARVEST, - [Species.YVELTAL]: Abilities.SOUL_HEART, - [Species.ZYGARDE]: Abilities.HUGE_POWER, - [Species.DIANCIE]: Abilities.LEVITATE, - [Species.HOOPA]: Abilities.OPPORTUNIST, - [Species.VOLCANION]: Abilities.FILTER, - [Species.ROWLET]: Abilities.SNIPER, - [Species.LITTEN]: Abilities.OPPORTUNIST, - [Species.POPPLIO]: Abilities.PUNK_ROCK, - [Species.PIKIPEK]: Abilities.TECHNICIAN, - [Species.YUNGOOS]: Abilities.TOUGH_CLAWS, - [Species.GRUBBIN]: Abilities.SPEED_BOOST, - [Species.CRABRAWLER]: Abilities.WATER_BUBBLE, - [Species.ORICORIO]: Abilities.ADAPTABILITY, - [Species.CUTIEFLY]: Abilities.TINTED_LENS, - [Species.ROCKRUFF]: Abilities.ROCKY_PAYLOAD, - [Species.WISHIWASHI]: Abilities.REGENERATOR, - [Species.MAREANIE]: Abilities.TOXIC_DEBRIS, - [Species.MUDBRAY]: Abilities.CUD_CHEW, - [Species.DEWPIDER]: Abilities.TINTED_LENS, - [Species.FOMANTIS]: Abilities.SHARPNESS, - [Species.MORELULL]: Abilities.TRIAGE, - [Species.SALANDIT]: Abilities.DRAGONS_MAW, - [Species.STUFFUL]: Abilities.SCRAPPY, - [Species.BOUNSWEET]: Abilities.MOXIE, - [Species.COMFEY]: Abilities.FRIEND_GUARD, - [Species.ORANGURU]: Abilities.POWER_SPOT, - [Species.PASSIMIAN]: Abilities.LIBERO, - [Species.WIMPOD]: Abilities.REGENERATOR, - [Species.SANDYGAST]: Abilities.SAND_SPIT, - [Species.PYUKUMUKU]: Abilities.PURIFYING_SALT, - [Species.TYPE_NULL]: Abilities.ADAPTABILITY, - [Species.MINIOR]: Abilities.STURDY, - [Species.KOMALA]: Abilities.GUTS, - [Species.TURTONATOR]: Abilities.DAUNTLESS_SHIELD, - [Species.TOGEDEMARU]: Abilities.ROUGH_SKIN, - [Species.MIMIKYU]: Abilities.TOUGH_CLAWS, - [Species.BRUXISH]: Abilities.MULTISCALE, - [Species.DRAMPA]: Abilities.THICK_FAT, - [Species.DHELMISE]: Abilities.WATER_BUBBLE, - [Species.JANGMO_O]: Abilities.DAUNTLESS_SHIELD, - [Species.TAPU_KOKO]: Abilities.TRANSISTOR, - [Species.TAPU_LELE]: Abilities.SHEER_FORCE, - [Species.TAPU_BULU]: Abilities.TRIAGE, - [Species.TAPU_FINI]: Abilities.FAIRY_AURA, - [Species.COSMOG]: Abilities.BEAST_BOOST, - [Species.NIHILEGO]: Abilities.LEVITATE, - [Species.BUZZWOLE]: Abilities.MOXIE, - [Species.PHEROMOSA]: Abilities.TINTED_LENS, - [Species.XURKITREE]: Abilities.TRANSISTOR, - [Species.CELESTEELA]: Abilities.HEATPROOF, - [Species.KARTANA]: Abilities.SHARPNESS, - [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.STAKATAKA]: Abilities.SOLID_ROCK, - [Species.BLACEPHALON]: Abilities.MAGIC_GUARD, - [Species.ZERAORA]: Abilities.TOUGH_CLAWS, - [Species.MELTAN]: Abilities.STEELY_SPIRIT, - [Species.GROOKEY]: Abilities.GRASS_PELT, - [Species.SCORBUNNY]: Abilities.NO_GUARD, - [Species.SOBBLE]: Abilities.SUPER_LUCK, - [Species.SKWOVET]: Abilities.HARVEST, - [Species.ROOKIDEE]: Abilities.IRON_BARBS, - [Species.BLIPBUG]: Abilities.PSYCHIC_SURGE, - [Species.NICKIT]: Abilities.MAGICIAN, - [Species.GOSSIFLEUR]: Abilities.GRASSY_SURGE, - [Species.WOOLOO]: Abilities.SIMPLE, - [Species.CHEWTLE]: Abilities.ROCKY_PAYLOAD, - [Species.YAMPER]: Abilities.SHEER_FORCE, - [Species.ROLYCOLY]: Abilities.SOLID_ROCK, - [Species.APPLIN]: Abilities.DRAGONS_MAW, - [Species.SILICOBRA]: Abilities.SAND_RUSH, - [Species.CRAMORANT]: Abilities.LIGHTNING_ROD, - [Species.ARROKUDA]: Abilities.INTIMIDATE, - [Species.TOXEL]: Abilities.ELECTRIC_SURGE, - [Species.SIZZLIPEDE]: Abilities.SPEED_BOOST, - [Species.CLOBBOPUS]: Abilities.WATER_BUBBLE, - [Species.SINISTEA]: Abilities.SHADOW_SHIELD, - [Species.HATENNA]: Abilities.FAIRY_AURA, - [Species.IMPIDIMP]: Abilities.FUR_COAT, - [Species.MILCERY]: Abilities.REGENERATOR, - [Species.FALINKS]: Abilities.PARENTAL_BOND, - [Species.PINCURCHIN]: Abilities.ELECTROMORPHOSIS, - [Species.SNOM]: Abilities.SNOW_WARNING, - [Species.STONJOURNER]: Abilities.STURDY, - [Species.EISCUE]: Abilities.ICE_SCALES, - [Species.INDEEDEE]: Abilities.FRIEND_GUARD, - [Species.MORPEKO]: Abilities.MOODY, - [Species.CUFANT]: Abilities.EARTH_EATER, - [Species.DRACOZOLT]: Abilities.NO_GUARD, - [Species.ARCTOZOLT]: Abilities.TRANSISTOR, - [Species.DRACOVISH]: Abilities.SWIFT_SWIM, - [Species.ARCTOVISH]: Abilities.STRONG_JAW, - [Species.DURALUDON]: Abilities.STEELWORKER, - [Species.DREEPY]: Abilities.PARENTAL_BOND, - [Species.ZACIAN]: Abilities.UNNERVE, - [Species.ZAMAZENTA]: Abilities.UNNERVE, - [Species.ETERNATUS]: Abilities.NEUTRALIZING_GAS, - [Species.KUBFU]: Abilities.IRON_FIST, - [Species.ZARUDE]: Abilities.TOUGH_CLAWS, - [Species.REGIELEKI]: Abilities.ELECTRIC_SURGE, - [Species.REGIDRAGO]: Abilities.MULTISCALE, - [Species.GLASTRIER]: Abilities.FILTER, - [Species.SPECTRIER]: Abilities.SHADOW_SHIELD, - [Species.CALYREX]: Abilities.HARVEST, - [Species.ENAMORUS]: Abilities.FAIRY_AURA, - [Species.SPRIGATITO]: Abilities.MAGICIAN, - [Species.FUECOCO]: Abilities.PUNK_ROCK, - [Species.QUAXLY]: Abilities.OPPORTUNIST, - [Species.LECHONK]: Abilities.SIMPLE, - [Species.TAROUNTULA]: Abilities.HONEY_GATHER, - [Species.NYMBLE]: Abilities.GUTS, - [Species.PAWMI]: Abilities.TRANSISTOR, - [Species.TANDEMAUS]: Abilities.SCRAPPY, - [Species.FIDOUGH]: Abilities.WATER_ABSORB, - [Species.SMOLIV]: Abilities.RIPEN, - [Species.SQUAWKABILLY]: Abilities.MOXIE, - [Species.NACLI]: Abilities.SOLID_ROCK, - [Species.CHARCADET]: Abilities.PRISM_ARMOR, - [Species.TADBULB]: Abilities.STAMINA, - [Species.WATTREL]: Abilities.SHEER_FORCE, - [Species.MASCHIFF]: Abilities.STRONG_JAW, - [Species.SHROODLE]: Abilities.CORROSION, - [Species.BRAMBLIN]: Abilities.SHADOW_SHIELD, - [Species.TOEDSCOOL]: Abilities.PRANKSTER, - [Species.KLAWF]: Abilities.WATER_ABSORB, - [Species.CAPSAKID]: Abilities.PARENTAL_BOND, - [Species.RELLOR]: Abilities.PRANKSTER, - [Species.FLITTLE]: Abilities.DAZZLING, - [Species.TINKATINK]: Abilities.STEELWORKER, - [Species.WIGLETT]: Abilities.STURDY, - [Species.BOMBIRDIER]: Abilities.UNBURDEN, - [Species.FINIZEN]: Abilities.IRON_FIST, - [Species.VAROOM]: Abilities.LEVITATE, - [Species.CYCLIZAR]: Abilities.PROTEAN, - [Species.ORTHWORM]: Abilities.REGENERATOR, - [Species.GLIMMET]: Abilities.LEVITATE, - [Species.GREAVARD]: Abilities.FUR_COAT, - [Species.FLAMIGO]: Abilities.MOXIE, - [Species.CETODDLE]: Abilities.ICE_SCALES, - [Species.VELUZA]: Abilities.SUPER_LUCK, - [Species.DONDOZO]: Abilities.PARENTAL_BOND, - [Species.TATSUGIRI]: Abilities.ADAPTABILITY, - [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.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.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.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.OGERPON]: Abilities.OPPORTUNIST, - [Species.GOUGING_FIRE]: Abilities.BEAST_BOOST, - [Species.RAGING_BOLT]: Abilities.BEAST_BOOST, - [Species.IRON_BOULDER]: Abilities.SHARPNESS, - [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 +export interface PassiveAbilities { + [key: number]: Abilities +} + +interface StarterPassiveAbilities { + [key: number]: PassiveAbilities +} + +export const starterPassiveAbilities: StarterPassiveAbilities = { + [Species.BULBASAUR]: { 0: Abilities.GRASSY_SURGE }, + [Species.CHARMANDER]: { 0: Abilities.BEAST_BOOST }, + [Species.SQUIRTLE]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.CATERPIE]: { 0: Abilities.MAGICIAN }, + [Species.WEEDLE]: { 0: Abilities.TINTED_LENS }, + [Species.PIDGEY]: { 0: Abilities.SHEER_FORCE }, + [Species.RATTATA]: { 0: Abilities.STRONG_JAW }, + [Species.SPEAROW]: { 0: Abilities.MOXIE }, + [Species.EKANS]: { 0: Abilities.REGENERATOR }, + [Species.SANDSHREW]: { 0: Abilities.TOUGH_CLAWS }, + [Species.NIDORAN_F]: { 0: Abilities.FLARE_BOOST }, + [Species.NIDORAN_M]: { 0: Abilities.GUTS }, + [Species.VULPIX]: { 0: Abilities.FUR_COAT }, + [Species.ZUBAT]: { 0: Abilities.INTIMIDATE }, + [Species.ODDISH]: { 0: Abilities.TRIAGE }, + [Species.PARAS]: { 0: Abilities.TRIAGE }, + [Species.VENONAT]: { 0: Abilities.SIMPLE }, + [Species.DIGLETT]: { 0: Abilities.STURDY }, + [Species.MEOWTH]: { 0: Abilities.TOUGH_CLAWS }, + [Species.PSYDUCK]: { 0: Abilities.SIMPLE }, + [Species.MANKEY]: { 0: Abilities.IRON_FIST }, + [Species.GROWLITHE]: { 0: Abilities.FLUFFY }, + [Species.POLIWAG]: { 0: Abilities.NO_GUARD }, + [Species.ABRA]: { 0: Abilities.MAGICIAN }, + [Species.MACHOP]: { 0: Abilities.QUICK_FEET }, + [Species.BELLSPROUT]: { 0: Abilities.FLOWER_GIFT }, + [Species.TENTACOOL]: { 0: Abilities.TOXIC_CHAIN }, + [Species.GEODUDE]: { 0: Abilities.DRY_SKIN }, + [Species.PONYTA]: { 0: Abilities.MAGIC_GUARD }, + [Species.SLOWPOKE]: { 0: Abilities.UNAWARE }, + [Species.MAGNEMITE]: { 0: Abilities.LEVITATE }, + [Species.FARFETCHD]: { 0: Abilities.SNIPER }, + [Species.DODUO]: { 0: Abilities.PARENTAL_BOND }, + [Species.SEEL]: { 0: Abilities.WATER_BUBBLE }, + [Species.GRIMER]: { 0: Abilities.WATER_ABSORB }, + [Species.SHELLDER]: { 0: Abilities.ICE_SCALES }, + [Species.GASTLY]: { 0: Abilities.SHADOW_SHIELD }, + [Species.ONIX]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.DROWZEE]: { 0: Abilities.MAGICIAN }, + [Species.KRABBY]: { 0: Abilities.UNBURDEN }, + [Species.VOLTORB]: { 0: Abilities.TRANSISTOR }, + [Species.EXEGGCUTE]: { 0: Abilities.RIPEN }, + [Species.CUBONE]: { 0: Abilities.PARENTAL_BOND }, + [Species.LICKITUNG]: { 0: Abilities.CHEEK_POUCH }, + [Species.KOFFING]: { 0: Abilities.PARENTAL_BOND }, + [Species.RHYHORN]: { 0: Abilities.FILTER }, + [Species.TANGELA]: { 0: Abilities.SEED_SOWER }, + [Species.KANGASKHAN]: { 0: Abilities.TECHNICIAN }, + [Species.HORSEA]: { 0: Abilities.DRAGONS_MAW }, + [Species.GOLDEEN]: { 0: Abilities.MULTISCALE }, + [Species.STARYU]: { 0: Abilities.REGENERATOR }, + [Species.SCYTHER]: { 0: Abilities.TINTED_LENS }, + [Species.PINSIR]: { 0: Abilities.TINTED_LENS }, + [Species.TAUROS]: { 0: Abilities.STAMINA }, + [Species.MAGIKARP]: { 0: Abilities.MULTISCALE }, + [Species.LAPRAS]: { 0: Abilities.LIGHTNING_ROD }, + [Species.DITTO]: { 0: Abilities.ADAPTABILITY }, + [Species.EEVEE]: { 0: Abilities.PICKUP }, + [Species.PORYGON]: { 0: Abilities.PROTEAN }, + [Species.OMANYTE]: { 0: Abilities.STURDY }, + [Species.KABUTO]: { 0: Abilities.TOUGH_CLAWS }, + [Species.AERODACTYL]: { 0: Abilities.ORICHALCUM_PULSE }, + [Species.ARTICUNO]: { 0: Abilities.SNOW_WARNING }, + [Species.ZAPDOS]: { 0: Abilities.DRIZZLE }, + [Species.MOLTRES]: { 0: Abilities.DROUGHT }, + [Species.DRATINI]: { 0: Abilities.AERILATE }, + [Species.MEWTWO]: { 0: Abilities.NEUROFORCE }, + [Species.MEW]: { 0: Abilities.PROTEAN }, + + [Species.CHIKORITA]: { 0: Abilities.THICK_FAT }, + [Species.CYNDAQUIL]: { 0: Abilities.DROUGHT }, + [Species.TOTODILE]: { 0: Abilities.TOUGH_CLAWS }, + [Species.SENTRET]: { 0: Abilities.PICKUP }, + [Species.HOOTHOOT]: { 0: Abilities.AERILATE }, + [Species.LEDYBA]: { 0: Abilities.PRANKSTER }, + [Species.SPINARAK]: { 0: Abilities.PRANKSTER }, + [Species.CHINCHOU]: { 0: Abilities.REGENERATOR }, + [Species.PICHU]: { 0: Abilities.ELECTRIC_SURGE }, + [Species.CLEFFA]: { 0: Abilities.ANALYTIC }, + [Species.IGGLYBUFF]: { 0: Abilities.HUGE_POWER }, + [Species.TOGEPI]: { 0: Abilities.PIXILATE }, + [Species.NATU]: { 0: Abilities.SHEER_FORCE }, + [Species.MAREEP]: { 0: Abilities.ELECTROMORPHOSIS }, + [Species.HOPPIP]: { 0: Abilities.FLUFFY }, + [Species.AIPOM]: { 0: Abilities.SCRAPPY }, + [Species.SUNKERN]: { 0: Abilities.DROUGHT }, + [Species.YANMA]: { 0: Abilities.SHEER_FORCE }, + [Species.WOOPER]: { 0: Abilities.COMATOSE }, + [Species.MURKROW]: { 0: Abilities.DARK_AURA }, + [Species.MISDREAVUS]: { 0: Abilities.BEADS_OF_RUIN }, + [Species.UNOWN]: { 0: Abilities.PICKUP }, + [Species.GIRAFARIG]: { 0: Abilities.PARENTAL_BOND }, + [Species.PINECO]: { 0: Abilities.IRON_BARBS }, + [Species.DUNSPARCE]: { 0: Abilities.UNAWARE }, + [Species.GLIGAR]: { 0: Abilities.TOXIC_BOOST }, + [Species.SNUBBULL]: { 0: Abilities.PIXILATE }, + [Species.QWILFISH]: { 0: Abilities.TOXIC_DEBRIS }, + [Species.SHUCKLE]: { 0: Abilities.HARVEST }, + [Species.HERACROSS]: { 0: Abilities.TECHNICIAN }, + [Species.SNEASEL]: { 0: Abilities.TOUGH_CLAWS }, + [Species.TEDDIURSA]: { 0: Abilities.THICK_FAT }, + [Species.SLUGMA]: { 0: Abilities.DESOLATE_LAND }, + [Species.SWINUB]: { 0: Abilities.SLUSH_RUSH }, + [Species.CORSOLA]: { 0: Abilities.STORM_DRAIN }, + [Species.REMORAID]: { 0: Abilities.SIMPLE }, + [Species.DELIBIRD]: { 0: Abilities.HUGE_POWER }, + [Species.SKARMORY]: { 0: Abilities.LIGHTNING_ROD }, + [Species.HOUNDOUR]: { 0: Abilities.LIGHTNING_ROD }, + [Species.PHANPY]: { 0: Abilities.SPEED_BOOST }, + [Species.STANTLER]: { 0: Abilities.SPEED_BOOST }, + [Species.SMEARGLE]: { 0: Abilities.PRANKSTER }, + [Species.TYROGUE]: { 0: Abilities.MOXIE }, + [Species.SMOOCHUM]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.ELEKID]: { 0: Abilities.SHEER_FORCE }, + [Species.MAGBY]: { 0: Abilities.SHEER_FORCE }, + [Species.MILTANK]: { 0: Abilities.STAMINA }, + [Species.RAIKOU]: { 0: Abilities.BEAST_BOOST }, + [Species.ENTEI]: { 0: Abilities.BEAST_BOOST }, + [Species.SUICUNE]: { 0: Abilities.BEAST_BOOST }, + [Species.LARVITAR]: { 0: Abilities.SOLID_ROCK }, + [Species.LUGIA]: { 0: Abilities.DELTA_STREAM }, + [Species.HO_OH]: { 0: Abilities.MAGIC_GUARD }, + [Species.CELEBI]: { 0: Abilities.PSYCHIC_SURGE }, + + [Species.TREECKO]: { 0: Abilities.TINTED_LENS }, + [Species.TORCHIC]: { 0: Abilities.DEFIANT }, + [Species.MUDKIP]: { 0: Abilities.DRIZZLE }, + [Species.POOCHYENA]: { 0: Abilities.TOUGH_CLAWS }, + [Species.ZIGZAGOON]: { 0: Abilities.RUN_AWAY }, + [Species.WURMPLE]: { 0: Abilities.SIMPLE }, + [Species.LOTAD]: { 0: Abilities.DRIZZLE }, + [Species.SEEDOT]: { 0: Abilities.SHARPNESS }, + [Species.TAILLOW]: { 0: Abilities.AERILATE }, + [Species.WINGULL]: { 0: Abilities.SWIFT_SWIM }, + [Species.RALTS]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.SURSKIT]: { 0: Abilities.WATER_BUBBLE }, + [Species.SHROOMISH]: { 0: Abilities.GUTS }, + [Species.SLAKOTH]: { 0: Abilities.GUTS }, + [Species.NINCADA]: { 0: Abilities.MAGIC_GUARD }, + [Species.WHISMUR]: { 0: Abilities.PUNK_ROCK }, + [Species.MAKUHITA]: { 0: Abilities.STAMINA }, + [Species.AZURILL]: { 0: Abilities.MISTY_SURGE }, + [Species.NOSEPASS]: { 0: Abilities.LEVITATE }, + [Species.SKITTY]: { 0: Abilities.SCRAPPY }, + [Species.SABLEYE]: { 0: Abilities.UNNERVE }, + [Species.MAWILE]: { 0: Abilities.UNNERVE }, + [Species.ARON]: { 0: Abilities.EARTH_EATER }, + [Species.MEDITITE]: { 0: Abilities.MINDS_EYE }, + [Species.ELECTRIKE]: { 0: Abilities.FLASH_FIRE }, + [Species.PLUSLE]: { 0: Abilities.POWER_SPOT }, + [Species.MINUN]: { 0: Abilities.POWER_SPOT }, + [Species.VOLBEAT]: { 0: Abilities.HONEY_GATHER }, + [Species.ILLUMISE]: { 0: Abilities.HONEY_GATHER }, + [Species.GULPIN]: { 0: Abilities.EARTH_EATER }, + [Species.CARVANHA]: { 0: Abilities.SHEER_FORCE }, + [Species.WAILMER]: { 0: Abilities.LEVITATE }, + [Species.NUMEL]: { 0: Abilities.FUR_COAT }, + [Species.TORKOAL]: { 0: Abilities.ANALYTIC }, + [Species.SPOINK]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.SPINDA]: { 0: Abilities.SIMPLE }, + [Species.TRAPINCH]: { 0: Abilities.ADAPTABILITY }, + [Species.CACNEA]: { 0: Abilities.SAND_RUSH }, + [Species.SWABLU]: { 0: Abilities.FLUFFY }, + [Species.ZANGOOSE]: { 0: Abilities.POISON_HEAL }, + [Species.SEVIPER]: { 0: Abilities.MULTISCALE }, + [Species.LUNATONE]: { 0: Abilities.SHADOW_SHIELD }, + [Species.SOLROCK]: { 0: Abilities.DROUGHT }, + [Species.BARBOACH]: { 0: Abilities.SIMPLE }, + [Species.CORPHISH]: { 0: Abilities.TOUGH_CLAWS }, + [Species.BALTOY]: { 0: Abilities.WELL_BAKED_BODY }, + [Species.LILEEP]: { 0: Abilities.SEED_SOWER }, + [Species.ANORITH]: { 0: Abilities.WATER_ABSORB }, + [Species.FEEBAS]: { 0: Abilities.MAGIC_GUARD }, + [Species.CASTFORM]: { 0: Abilities.ADAPTABILITY }, + [Species.KECLEON]: { 0: Abilities.ADAPTABILITY }, + [Species.SHUPPET]: { 0: Abilities.SHADOW_SHIELD }, + [Species.DUSKULL]: { 0: Abilities.UNNERVE }, + [Species.TROPIUS]: { 0: Abilities.RIPEN }, + [Species.ABSOL]: { 0: Abilities.SHARPNESS }, + [Species.WYNAUT]: { 0: Abilities.STURDY }, + [Species.SNORUNT]: { 0: Abilities.SNOW_WARNING }, + [Species.SPHEAL]: { 0: Abilities.UNAWARE }, + [Species.CLAMPERL]: { 0: Abilities.ARENA_TRAP }, + [Species.RELICANTH]: { 0: Abilities.PRIMORDIAL_SEA }, + [Species.LUVDISC]: { 0: Abilities.MULTISCALE }, + [Species.BAGON]: { 0: Abilities.MOLD_BREAKER }, + [Species.BELDUM]: { 0: Abilities.LEVITATE }, + [Species.REGIROCK]: { 0: Abilities.SAND_STREAM }, + [Species.REGICE]: { 0: Abilities.SNOW_WARNING }, + [Species.REGISTEEL]: { 0: Abilities.STEELY_SPIRIT }, + [Species.LATIAS]: { 0: Abilities.PRISM_ARMOR }, + [Species.LATIOS]: { 0: Abilities.TINTED_LENS }, + [Species.KYOGRE]: { 0: Abilities.MOLD_BREAKER }, + [Species.GROUDON]: { 0: Abilities.TURBOBLAZE }, + [Species.RAYQUAZA]: { 0: Abilities.UNNERVE }, + [Species.JIRACHI]: { 0: Abilities.COMATOSE }, + [Species.DEOXYS]: { 0: Abilities.PROTEAN }, + + [Species.TURTWIG]: { 0: Abilities.THICK_FAT }, + [Species.CHIMCHAR]: { 0: Abilities.BEAST_BOOST }, + [Species.PIPLUP]: { 0: Abilities.DRIZZLE }, + [Species.STARLY]: { 0: Abilities.ROCK_HEAD }, + [Species.BIDOOF]: { 0: Abilities.SAP_SIPPER }, + [Species.KRICKETOT]: { 0: Abilities.SHARPNESS }, + [Species.SHINX]: { 0: Abilities.SPEED_BOOST }, + [Species.BUDEW]: { 0: Abilities.GRASSY_SURGE }, + [Species.CRANIDOS]: { 0: Abilities.ROCK_HEAD }, + [Species.SHIELDON]: { 0: Abilities.EARTH_EATER }, + [Species.BURMY]: { 0: Abilities.STURDY }, + [Species.COMBEE]: { 0: Abilities.INTIMIDATE }, + [Species.PACHIRISU]: { 0: Abilities.HONEY_GATHER }, + [Species.BUIZEL]: { 0: Abilities.MOXIE }, + [Species.CHERUBI]: { 0: Abilities.ORICHALCUM_PULSE }, + [Species.SHELLOS]: { 0: Abilities.REGENERATOR }, + [Species.DRIFLOON]: { 0: Abilities.MAGIC_GUARD }, + [Species.BUNEARY]: { 0: Abilities.ADAPTABILITY }, + [Species.GLAMEOW]: { 0: Abilities.INTIMIDATE }, + [Species.CHINGLING]: { 0: Abilities.PUNK_ROCK }, + [Species.STUNKY]: { 0: Abilities.NEUTRALIZING_GAS }, + [Species.BRONZOR]: { 0: Abilities.MIRROR_ARMOR }, + [Species.BONSLY]: { 0: Abilities.SAP_SIPPER }, + [Species.MIME_JR]: { 0: Abilities.PRANKSTER }, + [Species.HAPPINY]: { 0: Abilities.FUR_COAT }, + [Species.CHATOT]: { 0: Abilities.PUNK_ROCK }, + [Species.SPIRITOMB]: { 0: Abilities.VESSEL_OF_RUIN }, + [Species.GIBLE]: { 0: Abilities.SAND_STREAM }, + [Species.MUNCHLAX]: { 0: Abilities.RIPEN }, + [Species.RIOLU]: { 0: Abilities.MINDS_EYE }, + [Species.HIPPOPOTAS]: { 0: Abilities.UNAWARE }, + [Species.SKORUPI]: { 0: Abilities.SUPER_LUCK }, + [Species.CROAGUNK]: { 0: Abilities.MOXIE }, + [Species.CARNIVINE]: { 0: Abilities.ARENA_TRAP }, + [Species.FINNEON]: { 0: Abilities.WATER_BUBBLE }, + [Species.MANTYKE]: { 0: Abilities.UNAWARE }, + [Species.SNOVER]: { 0: Abilities.GRASSY_SURGE }, + [Species.ROTOM]: { 0: Abilities.HADRON_ENGINE }, + [Species.UXIE]: { 0: Abilities.UNNERVE }, + [Species.MESPRIT]: { 0: Abilities.MOODY }, + [Species.AZELF]: { 0: Abilities.NEUROFORCE }, + [Species.DIALGA]: { 0: Abilities.BERSERK }, + [Species.PALKIA]: { 0: Abilities.BERSERK }, + [Species.HEATRAN]: { 0: Abilities.EARTH_EATER }, + [Species.REGIGIGAS]: { 0: Abilities.SCRAPPY }, + [Species.GIRATINA]: { 0: Abilities.SHADOW_SHIELD }, + [Species.CRESSELIA]: { 0: Abilities.SHADOW_SHIELD }, + [Species.PHIONE]: { 0: Abilities.SIMPLE }, + [Species.MANAPHY]: { 0: Abilities.PRIMORDIAL_SEA }, + [Species.DARKRAI]: { 0: Abilities.UNNERVE }, + [Species.SHAYMIN]: { 0: Abilities.WIND_RIDER }, + [Species.ARCEUS]: { 0: Abilities.ADAPTABILITY }, + + [Species.VICTINI]: { 0: Abilities.SHEER_FORCE }, + [Species.SNIVY]: { 0: Abilities.MULTISCALE }, + [Species.TEPIG]: { 0: Abilities.ROCK_HEAD }, + [Species.OSHAWOTT]: { 0: Abilities.INTREPID_SWORD }, + [Species.PATRAT]: { 0: Abilities.NO_GUARD }, + [Species.LILLIPUP]: { 0: Abilities.FUR_COAT }, + [Species.PURRLOIN]: { 0: Abilities.PICKUP }, + [Species.PANSAGE]: { 0: Abilities.WELL_BAKED_BODY }, + [Species.PANSEAR]: { 0: Abilities.WATER_ABSORB }, + [Species.PANPOUR]: { 0: Abilities.SAP_SIPPER }, + [Species.MUNNA]: { 0: Abilities.NEUTRALIZING_GAS }, + [Species.PIDOVE]: { 0: Abilities.SNIPER }, + [Species.BLITZLE]: { 0: Abilities.ELECTRIC_SURGE }, + [Species.ROGGENROLA]: { 0: Abilities.SOLID_ROCK }, + [Species.WOOBAT]: { 0: Abilities.OPPORTUNIST }, + [Species.DRILBUR]: { 0: Abilities.STURDY }, + [Species.AUDINO]: { 0: Abilities.FRIEND_GUARD }, + [Species.TIMBURR]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.TYMPOLE]: { 0: Abilities.POISON_HEAL }, + [Species.THROH]: { 0: Abilities.STAMINA }, + [Species.SAWK]: { 0: Abilities.SCRAPPY }, + [Species.SEWADDLE]: { 0: Abilities.SHARPNESS }, + [Species.VENIPEDE]: { 0: Abilities.STAMINA }, + [Species.COTTONEE]: { 0: Abilities.FLUFFY }, + [Species.PETILIL]: { 0: Abilities.FLOWER_VEIL }, + [Species.BASCULIN]: { 0: Abilities.SUPREME_OVERLORD }, + [Species.SANDILE]: { 0: Abilities.TOUGH_CLAWS }, + [Species.DARUMAKA]: { 0: Abilities.GORILLA_TACTICS }, + [Species.MARACTUS]: { 0: Abilities.WELL_BAKED_BODY }, + [Species.DWEBBLE]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.SCRAGGY]: { 0: Abilities.PROTEAN }, + [Species.SIGILYPH]: { 0: Abilities.FLARE_BOOST }, + [Species.YAMASK]: { 0: Abilities.PURIFYING_SALT }, + [Species.TIRTOUGA]: { 0: Abilities.WATER_ABSORB }, + [Species.ARCHEN]: { 0: Abilities.MULTISCALE }, + [Species.TRUBBISH]: { 0: Abilities.NEUTRALIZING_GAS }, + [Species.ZORUA]: { 0: Abilities.DARK_AURA }, + [Species.MINCCINO]: { 0: Abilities.FUR_COAT }, + [Species.GOTHITA]: { 0: Abilities.UNNERVE }, + [Species.SOLOSIS]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.DUCKLETT]: { 0: Abilities.DRIZZLE }, + [Species.VANILLITE]: { 0: Abilities.SLUSH_RUSH }, + [Species.DEERLING]: { 0: Abilities.FUR_COAT }, + [Species.EMOLGA]: { 0: Abilities.SERENE_GRACE }, + [Species.KARRABLAST]: { 0: Abilities.QUICK_DRAW }, + [Species.FOONGUS]: { 0: Abilities.THICK_FAT }, + [Species.FRILLISH]: { 0: Abilities.POISON_HEAL }, + [Species.ALOMOMOLA]: { 0: Abilities.MULTISCALE }, + [Species.JOLTIK]: { 0: Abilities.TRANSISTOR }, + [Species.FERROSEED]: { 0: Abilities.ROUGH_SKIN }, + [Species.KLINK]: { 0: Abilities.STEELY_SPIRIT }, + [Species.TYNAMO]: { 0: Abilities.POISON_HEAL }, + [Species.ELGYEM]: { 0: Abilities.BEADS_OF_RUIN }, + [Species.LITWICK]: { 0: Abilities.SHADOW_TAG }, + [Species.AXEW]: { 0: Abilities.DRAGONS_MAW }, + [Species.CUBCHOO]: { 0: Abilities.FUR_COAT }, + [Species.CRYOGONAL]: { 0: Abilities.SNOW_WARNING }, + [Species.SHELMET]: { 0: Abilities.PROTEAN }, + [Species.STUNFISK]: { 0: Abilities.STORM_DRAIN }, + [Species.MIENFOO]: { 0: Abilities.NO_GUARD }, + [Species.DRUDDIGON]: { 0: Abilities.INTIMIDATE }, + [Species.GOLETT]: { 0: Abilities.SHADOW_SHIELD }, + [Species.PAWNIARD]: { 0: Abilities.SWORD_OF_RUIN }, + [Species.BOUFFALANT]: { 0: Abilities.ROCK_HEAD }, + [Species.RUFFLET]: { 0: Abilities.SPEED_BOOST }, + [Species.VULLABY]: { 0: Abilities.THICK_FAT }, + [Species.HEATMOR]: { 0: Abilities.CONTRARY }, + [Species.DURANT]: { 0: Abilities.COMPOUND_EYES }, + [Species.DEINO]: { 0: Abilities.PARENTAL_BOND }, + [Species.LARVESTA]: { 0: Abilities.DROUGHT }, + [Species.COBALION]: { 0: Abilities.INTREPID_SWORD }, + [Species.TERRAKION]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.VIRIZION]: { 0: Abilities.SHARPNESS }, + [Species.TORNADUS]: { 0: Abilities.DRIZZLE }, + [Species.THUNDURUS]: { 0: Abilities.DRIZZLE }, + [Species.RESHIRAM]: { 0: Abilities.ORICHALCUM_PULSE }, + [Species.ZEKROM]: { 0: Abilities.HADRON_ENGINE }, + [Species.LANDORUS]: { 0: Abilities.STORM_DRAIN }, + [Species.KYUREM]: { 0: Abilities.SNOW_WARNING }, + [Species.KELDEO]: { 0: Abilities.GRIM_NEIGH }, + [Species.MELOETTA]: { 0: Abilities.MINDS_EYE }, + [Species.GENESECT]: { 0: Abilities.PROTEAN }, + + [Species.CHESPIN]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.FENNEKIN]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.FROAKIE]: { 0: Abilities.STAKEOUT }, + [Species.BUNNELBY]: { 0: Abilities.THICK_FAT }, + [Species.FLETCHLING]: { 0: Abilities.MAGIC_GUARD }, + [Species.SCATTERBUG]: { 0: Abilities.PRANKSTER }, + [Species.LITLEO]: { 0: Abilities.BEAST_BOOST }, + [Species.FLABEBE]: { 0: Abilities.GRASSY_SURGE }, + [Species.SKIDDO]: { 0: Abilities.SEED_SOWER }, + [Species.PANCHAM]: { 0: Abilities.FUR_COAT }, + [Species.FURFROU]: { 0: Abilities.FLUFFY }, + [Species.ESPURR]: { 0: Abilities.FUR_COAT }, + [Species.HONEDGE]: { 0: Abilities.SHARPNESS }, + [Species.SPRITZEE]: { 0: Abilities.FUR_COAT }, + [Species.SWIRLIX]: { 0: Abilities.RIPEN }, + [Species.INKAY]: { 0: Abilities.UNNERVE }, + [Species.BINACLE]: { 0: Abilities.SAP_SIPPER }, + [Species.SKRELP]: { 0: Abilities.DRAGONS_MAW }, + [Species.CLAUNCHER]: { 0: Abilities.PROTEAN }, + [Species.HELIOPTILE]: { 0: Abilities.PROTEAN }, + [Species.TYRUNT]: { 0: Abilities.RECKLESS }, + [Species.AMAURA]: { 0: Abilities.ICE_SCALES }, + [Species.HAWLUCHA]: { 0: Abilities.MOXIE }, + [Species.DEDENNE]: { 0: Abilities.PIXILATE }, + [Species.CARBINK]: { 0: Abilities.SOLID_ROCK }, + [Species.GOOMY]: { 0: Abilities.REGENERATOR }, + [Species.KLEFKI]: { 0: Abilities.LEVITATE }, + [Species.PHANTUMP]: { 0: Abilities.SHADOW_TAG }, + [Species.PUMPKABOO]: { 0: Abilities.WELL_BAKED_BODY }, + [Species.BERGMITE]: { 0: Abilities.ICE_SCALES }, + [Species.NOIBAT]: { 0: Abilities.PUNK_ROCK }, + [Species.XERNEAS]: { 0: Abilities.HARVEST }, + [Species.YVELTAL]: { 0: Abilities.SOUL_HEART }, + [Species.ZYGARDE]: { 0: Abilities.ADAPTABILITY }, + [Species.DIANCIE]: { 0: Abilities.PRISM_ARMOR }, + [Species.HOOPA]: { 0: Abilities.OPPORTUNIST }, + [Species.VOLCANION]: { 0: Abilities.NEUTRALIZING_GAS }, + [Species.ETERNAL_FLOETTE]: { 0: Abilities.MAGIC_GUARD }, + + [Species.ROWLET]: { 0: Abilities.SNIPER }, + [Species.LITTEN]: { 0: Abilities.OPPORTUNIST }, + [Species.POPPLIO]: { 0: Abilities.PUNK_ROCK }, + [Species.PIKIPEK]: { 0: Abilities.TECHNICIAN }, + [Species.YUNGOOS]: { 0: Abilities.TOUGH_CLAWS }, + [Species.GRUBBIN]: { 0: Abilities.SPEED_BOOST }, + [Species.CRABRAWLER]: { 0: Abilities.WATER_BUBBLE }, + [Species.ORICORIO]: { 0: Abilities.ADAPTABILITY }, + [Species.CUTIEFLY]: { 0: Abilities.TINTED_LENS }, + [Species.ROCKRUFF]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.WISHIWASHI]: { 0: Abilities.REGENERATOR }, + [Species.MAREANIE]: { 0: Abilities.TOXIC_DEBRIS }, + [Species.MUDBRAY]: { 0: Abilities.SAP_SIPPER }, + [Species.DEWPIDER]: { 0: Abilities.TINTED_LENS }, + [Species.FOMANTIS]: { 0: Abilities.SHARPNESS }, + [Species.MORELULL]: { 0: Abilities.TRIAGE }, + [Species.SALANDIT]: { 0: Abilities.DRAGONS_MAW }, + [Species.STUFFUL]: { 0: Abilities.SCRAPPY }, + [Species.BOUNSWEET]: { 0: Abilities.MOXIE }, + [Species.COMFEY]: { 0: Abilities.FRIEND_GUARD }, + [Species.ORANGURU]: { 0: Abilities.POWER_SPOT }, + [Species.PASSIMIAN]: { 0: Abilities.LIBERO }, + [Species.WIMPOD]: { 0: Abilities.REGENERATOR }, + [Species.SANDYGAST]: { 0: Abilities.SAND_SPIT }, + [Species.PYUKUMUKU]: { 0: Abilities.PURIFYING_SALT }, + [Species.TYPE_NULL]: { 0: Abilities.ADAPTABILITY }, + [Species.MINIOR]: { 0: Abilities.STURDY }, + [Species.KOMALA]: { 0: Abilities.GUTS }, + [Species.TURTONATOR]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.TOGEDEMARU]: { 0: Abilities.ROUGH_SKIN }, + [Species.MIMIKYU]: { 0: Abilities.TOUGH_CLAWS }, + [Species.BRUXISH]: { 0: Abilities.MULTISCALE }, + [Species.DRAMPA]: { 0: Abilities.THICK_FAT }, + [Species.DHELMISE]: { 0: Abilities.WATER_BUBBLE }, + [Species.JANGMO_O]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.TAPU_KOKO]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.TAPU_LELE]: { 0: Abilities.BERSERK }, + [Species.TAPU_BULU]: { 0: Abilities.FLOWER_VEIL }, + [Species.TAPU_FINI]: { 0: Abilities.FAIRY_AURA }, + [Species.COSMOG]: { 0: Abilities.BEAST_BOOST }, + [Species.NIHILEGO]: { 0: Abilities.LEVITATE }, + [Species.BUZZWOLE]: { 0: Abilities.MOXIE }, + [Species.PHEROMOSA]: { 0: Abilities.TINTED_LENS }, + [Species.XURKITREE]: { 0: Abilities.TRANSISTOR }, + [Species.CELESTEELA]: { 0: Abilities.HEATPROOF }, + [Species.KARTANA]: { 0: Abilities.LONG_REACH }, + [Species.GUZZLORD]: { 0: Abilities.POISON_HEAL }, + [Species.NECROZMA]: { 0: Abilities.BEAST_BOOST }, + [Species.MAGEARNA]: { 0: Abilities.STEELY_SPIRIT }, + [Species.MARSHADOW]: { 0: Abilities.IRON_FIST }, + [Species.POIPOLE]: { 0: Abilities.LEVITATE }, + [Species.STAKATAKA]: { 0: Abilities.SOLID_ROCK }, + [Species.BLACEPHALON]: { 0: Abilities.MAGIC_GUARD }, + [Species.ZERAORA]: { 0: Abilities.TOUGH_CLAWS }, + [Species.MELTAN]: { 0: Abilities.HEATPROOF }, + [Species.ALOLA_RATTATA]: { 0: Abilities.ADAPTABILITY }, + [Species.ALOLA_SANDSHREW]: { 0: Abilities.ICE_SCALES }, + [Species.ALOLA_VULPIX]: { 0: Abilities.SHEER_FORCE }, + [Species.ALOLA_DIGLETT]: { 0: Abilities.STURDY }, + [Species.ALOLA_MEOWTH]: { 0: Abilities.DARK_AURA }, + [Species.ALOLA_GEODUDE]: { 0: Abilities.DRY_SKIN }, + [Species.ALOLA_GRIMER]: { 0: Abilities.TOXIC_DEBRIS }, + + [Species.GROOKEY]: { 0: Abilities.GRASS_PELT }, + [Species.SCORBUNNY]: { 0: Abilities.NO_GUARD }, + [Species.SOBBLE]: { 0: Abilities.SUPER_LUCK }, + [Species.SKWOVET]: { 0: Abilities.HARVEST }, + [Species.ROOKIDEE]: { 0: Abilities.IRON_BARBS }, + [Species.BLIPBUG]: { 0: Abilities.PSYCHIC_SURGE }, + [Species.NICKIT]: { 0: Abilities.MAGICIAN }, + [Species.GOSSIFLEUR]: { 0: Abilities.GRASSY_SURGE }, + [Species.WOOLOO]: { 0: Abilities.SCRAPPY }, + [Species.CHEWTLE]: { 0: Abilities.ROCKY_PAYLOAD }, + [Species.YAMPER]: { 0: Abilities.SHEER_FORCE }, + [Species.ROLYCOLY]: { 0: Abilities.SOLID_ROCK }, + [Species.APPLIN]: { 0: Abilities.DRAGONS_MAW }, + [Species.SILICOBRA]: { 0: Abilities.SAND_RUSH }, + [Species.CRAMORANT]: { 0: Abilities.LIGHTNING_ROD }, + [Species.ARROKUDA]: { 0: Abilities.INTIMIDATE }, + [Species.TOXEL]: { 0: Abilities.ELECTRIC_SURGE }, + [Species.SIZZLIPEDE]: { 0: Abilities.SPEED_BOOST }, + [Species.CLOBBOPUS]: { 0: Abilities.WATER_BUBBLE }, + [Species.SINISTEA]: { 0: Abilities.SHADOW_SHIELD }, + [Species.HATENNA]: { 0: Abilities.FAIRY_AURA }, + [Species.IMPIDIMP]: { 0: Abilities.INTIMIDATE }, + [Species.MILCERY]: { 0: Abilities.REGENERATOR }, + [Species.FALINKS]: { 0: Abilities.PARENTAL_BOND }, + [Species.PINCURCHIN]: { 0: Abilities.ELECTROMORPHOSIS }, + [Species.SNOM]: { 0: Abilities.SNOW_WARNING }, + [Species.STONJOURNER]: { 0: Abilities.STURDY }, + [Species.EISCUE]: { 0: Abilities.ICE_SCALES }, + [Species.INDEEDEE]: { 0: Abilities.FRIEND_GUARD }, + [Species.MORPEKO]: { 0: Abilities.MOODY }, + [Species.CUFANT]: { 0: Abilities.EARTH_EATER }, + [Species.DRACOZOLT]: { 0: Abilities.NO_GUARD }, + [Species.ARCTOZOLT]: { 0: Abilities.WATER_ABSORB }, + [Species.DRACOVISH]: { 0: Abilities.SWIFT_SWIM }, + [Species.ARCTOVISH]: { 0: Abilities.STRONG_JAW }, + [Species.DURALUDON]: { 0: Abilities.STEELWORKER }, + [Species.DREEPY]: { 0: Abilities.PARENTAL_BOND }, + [Species.ZACIAN]: { 0: Abilities.UNNERVE }, + [Species.ZAMAZENTA]: { 0: Abilities.UNNERVE }, + [Species.ETERNATUS]: { 0: Abilities.NEUTRALIZING_GAS }, + [Species.KUBFU]: { 0: Abilities.IRON_FIST }, + [Species.ZARUDE]: { 0: Abilities.TOUGH_CLAWS }, + [Species.REGIELEKI]: { 0: Abilities.ELECTRIC_SURGE }, + [Species.REGIDRAGO]: { 0: Abilities.MULTISCALE }, + [Species.GLASTRIER]: { 0: Abilities.FILTER }, + [Species.SPECTRIER]: { 0: Abilities.SHADOW_SHIELD }, + [Species.CALYREX]: { 0: Abilities.HARVEST }, + [Species.ENAMORUS]: { 0: Abilities.FAIRY_AURA }, + [Species.GALAR_MEOWTH]: { 0: Abilities.UNBURDEN }, + [Species.GALAR_PONYTA]: { 0: Abilities.CHILLING_NEIGH }, + [Species.GALAR_SLOWPOKE]: { 0: Abilities.UNAWARE }, + [Species.GALAR_FARFETCHD]: { 0: Abilities.INTREPID_SWORD }, + [Species.GALAR_ARTICUNO]: { 0: Abilities.SERENE_GRACE }, + [Species.GALAR_ZAPDOS]: { 0: Abilities.TOUGH_CLAWS }, + [Species.GALAR_MOLTRES]: { 0: Abilities.DARK_AURA }, + [Species.GALAR_CORSOLA]: { 0: Abilities.SHADOW_SHIELD }, + [Species.GALAR_ZIGZAGOON]: { 0: Abilities.POISON_HEAL }, + [Species.GALAR_DARUMAKA]: { 0: Abilities.FLASH_FIRE }, + [Species.GALAR_YAMASK]: { 0: Abilities.TABLETS_OF_RUIN }, + [Species.GALAR_STUNFISK]: { 0: Abilities.ARENA_TRAP }, + [Species.HISUI_GROWLITHE]: { 0: Abilities.RECKLESS }, + [Species.HISUI_VOLTORB]: { 0: Abilities.TRANSISTOR }, + [Species.HISUI_QWILFISH]: { 0: Abilities.MERCILESS }, + [Species.HISUI_SNEASEL]: { 0: Abilities.SCRAPPY }, + [Species.HISUI_ZORUA]: { 0: Abilities.ADAPTABILITY }, + + [Species.SPRIGATITO]: { 0: Abilities.MAGICIAN }, + [Species.FUECOCO]: { 0: Abilities.PUNK_ROCK }, + [Species.QUAXLY]: { 0: Abilities.OPPORTUNIST }, + [Species.LECHONK]: { 0: Abilities.SIMPLE }, + [Species.TAROUNTULA]: { 0: Abilities.HONEY_GATHER }, + [Species.NYMBLE]: { 0: Abilities.GUTS }, + [Species.PAWMI]: { 0: Abilities.TRANSISTOR }, + [Species.TANDEMAUS]: { 0: Abilities.SCRAPPY }, + [Species.FIDOUGH]: { 0: Abilities.WATER_ABSORB }, + [Species.SMOLIV]: { 0: Abilities.RIPEN }, + [Species.SQUAWKABILLY]: { 0: Abilities.MOXIE }, + [Species.NACLI]: { 0: Abilities.SOLID_ROCK }, + [Species.CHARCADET]: { 0: Abilities.PRISM_ARMOR }, + [Species.TADBULB]: { 0: Abilities.STAMINA }, + [Species.WATTREL]: { 0: Abilities.SHEER_FORCE }, + [Species.MASCHIFF]: { 0: Abilities.STRONG_JAW }, + [Species.SHROODLE]: { 0: Abilities.CORROSION }, + [Species.BRAMBLIN]: { 0: Abilities.SHADOW_SHIELD }, + [Species.TOEDSCOOL]: { 0: Abilities.PRANKSTER }, + [Species.KLAWF]: { 0: Abilities.WATER_ABSORB }, + [Species.CAPSAKID]: { 0: Abilities.PARENTAL_BOND }, + [Species.RELLOR]: { 0: Abilities.PRANKSTER }, + [Species.FLITTLE]: { 0: Abilities.DAZZLING }, + [Species.TINKATINK]: { 0: Abilities.STEELWORKER }, + [Species.WIGLETT]: { 0: Abilities.STURDY }, + [Species.BOMBIRDIER]: { 0: Abilities.UNBURDEN }, + [Species.FINIZEN]: { 0: Abilities.IRON_FIST }, + [Species.VAROOM]: { 0: Abilities.LEVITATE }, + [Species.CYCLIZAR]: { 0: Abilities.PROTEAN }, + [Species.ORTHWORM]: { 0: Abilities.REGENERATOR }, + [Species.GLIMMET]: { 0: Abilities.TERA_SHELL }, + [Species.GREAVARD]: { 0: Abilities.UNAWARE }, + [Species.FLAMIGO]: { 0: Abilities.MOXIE }, + [Species.CETODDLE]: { 0: Abilities.REFRIGERATE }, + [Species.VELUZA]: { 0: Abilities.SUPER_LUCK }, + [Species.DONDOZO]: { 0: Abilities.DRAGONS_MAW }, + [Species.TATSUGIRI]: { 0: Abilities.FLUFFY }, + [Species.GREAT_TUSK]: { 0: Abilities.INTIMIDATE }, + [Species.SCREAM_TAIL]: { 0: Abilities.UNAWARE }, + [Species.BRUTE_BONNET]: { 0: Abilities.CHLOROPHYLL }, + [Species.FLUTTER_MANE]: { 0: Abilities.DAZZLING }, + [Species.SLITHER_WING]: { 0: Abilities.SCRAPPY }, + [Species.SANDY_SHOCKS]: { 0: Abilities.ELECTRIC_SURGE }, + [Species.IRON_TREADS]: { 0: Abilities.DAUNTLESS_SHIELD }, + [Species.IRON_BUNDLE]: { 0: Abilities.SNOW_WARNING }, + [Species.IRON_HANDS]: { 0: Abilities.IRON_FIST }, + [Species.IRON_JUGULIS]: { 0: Abilities.LIGHTNING_ROD }, + [Species.IRON_MOTH]: { 0: Abilities.LEVITATE }, + [Species.IRON_THORNS]: { 0: Abilities.SAND_STREAM }, + [Species.FRIGIBAX]: { 0: Abilities.INTIMIDATE }, + [Species.GIMMIGHOUL]: { 0: Abilities.HONEY_GATHER }, + [Species.WO_CHIEN]: { 0: Abilities.VESSEL_OF_RUIN }, + [Species.CHIEN_PAO]: { 0: Abilities.INTIMIDATE }, + [Species.TING_LU]: { 0: Abilities.STAMINA }, + [Species.CHI_YU]: { 0: Abilities.BERSERK }, + [Species.ROARING_MOON]: { 0: Abilities.INTIMIDATE }, + [Species.IRON_VALIANT]: { 0: Abilities.NEUROFORCE }, + [Species.KORAIDON]: { 0: Abilities.OPPORTUNIST }, + [Species.MIRAIDON]: { 0: Abilities.OPPORTUNIST }, + [Species.WALKING_WAKE]: { 0: Abilities.BEAST_BOOST }, + [Species.IRON_LEAVES]: { 0: Abilities.SHARPNESS }, + [Species.POLTCHAGEIST]: { 0: Abilities.TRIAGE }, + [Species.OKIDOGI]: { 0: Abilities.DARK_AURA }, + [Species.MUNKIDORI]: { 0: Abilities.MAGICIAN }, + [Species.FEZANDIPITI]: { 0: Abilities.PIXILATE }, + [Species.OGERPON]: { 0: Abilities.OPPORTUNIST }, + [Species.GOUGING_FIRE]: { 0: Abilities.BEAST_BOOST }, + [Species.RAGING_BOLT]: { 0: Abilities.BEAST_BOOST }, + [Species.IRON_BOULDER]: { 0: Abilities.SHARPNESS }, + [Species.IRON_CROWN]: { 0: Abilities.SHARPNESS }, + [Species.TERAPAGOS]: { 0: Abilities.SHIELD_DUST }, + [Species.PECHARUNT]: { 0: Abilities.TOXIC_CHAIN }, + [Species.PALDEA_TAUROS]: { 0: Abilities.ADAPTABILITY }, + [Species.PALDEA_WOOPER]: { 0: Abilities.THICK_FAT }, + [Species.BLOODMOON_URSALUNA]: { 0: Abilities.BERSERK } }; diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index 4a6e44e0d51..c34bc229bd7 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -1,16 +1,19 @@ +import { globalScene } from "#app/global-scene"; import { Gender } from "#app/data/gender"; -import { PokeballType } from "#app/data/pokeball"; -import Pokemon from "#app/field/pokemon"; -import { Type } from "#app/data/type"; +import { PokeballType } from "#enums/pokeball"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonType } from "#enums/pokemon-type"; import * as Utils from "#app/utils"; -import { WeatherType } from "#app/data/weather"; -import { Nature } from "#app/data/nature"; +import { WeatherType } from "#enums/weather-type"; +import { Nature } from "#enums/nature"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; import { DamageMoneyRewardModifier, ExtraModifierModifier, MoneyMultiplierModifier, TempExtraModifierModifier } from "#app/modifier/modifier"; import { SpeciesFormKey } from "#enums/species-form-key"; +import { speciesStarterCosts } from "./starters"; +import i18next from "i18next"; export enum SpeciesWildEvolutionDelay { @@ -74,9 +77,9 @@ export enum EvolutionItem { /** * Pokemon Evolution tuple type consisting of: * @property 0 {@linkcode Species} The species of the Pokemon. - * @property 1 {@linkcode integer} The level at which the Pokemon evolves. + * @property 1 {@linkcode number} The level at which the Pokemon evolves. */ -export type EvolutionLevel = [species: Species, level: integer]; +export type EvolutionLevel = [species: Species, level: number]; export type EvolutionConditionPredicate = (p: Pokemon) => boolean; export type EvolutionConditionEnforceFunc = (p: Pokemon) => void; @@ -85,12 +88,13 @@ export class SpeciesFormEvolution { public speciesId: Species; public preFormKey: string | null; public evoFormKey: string | null; - public level: integer; + public level: number; public item: EvolutionItem | null; public condition: SpeciesEvolutionCondition | null; public wildDelay: SpeciesWildEvolutionDelay; + public description = ""; - constructor(speciesId: Species, preFormKey: string | null, evoFormKey: string | null, level: integer, item: EvolutionItem | null, condition: SpeciesEvolutionCondition | null, wildDelay?: SpeciesWildEvolutionDelay) { + constructor(speciesId: Species, preFormKey: string | null, evoFormKey: string | null, level: number, item: EvolutionItem | null, condition: SpeciesEvolutionCondition | null, wildDelay?: SpeciesWildEvolutionDelay) { this.speciesId = speciesId; this.preFormKey = preFormKey; this.evoFormKey = evoFormKey; @@ -98,11 +102,28 @@ export class SpeciesFormEvolution { this.item = item || EvolutionItem.NONE; this.condition = condition; this.wildDelay = wildDelay ?? SpeciesWildEvolutionDelay.NONE; + + const strings: string[] = []; + if (this.level > 1) { + strings.push(i18next.t("pokemonEvolutions:level") + ` ${this.level}`); + } + if (this.item) { + const itemDescription = i18next.t(`modifierType:EvolutionItem.${EvolutionItem[this.item].toUpperCase()}`); + const rarity = this.item > 50 ? i18next.t("pokemonEvolutions:ULTRA") : i18next.t("pokemonEvolutions:GREAT"); + strings.push(i18next.t("pokemonEvolutions:using") + itemDescription + ` (${rarity})`); + } + if (this.condition) { + strings.push(this.condition.description); + } + this.description = strings + .filter(str => str !== "") + .map((str, index) => index > 0 ? str[0].toLowerCase() + str.slice(1) : str) + .join(i18next.t("pokemonEvolutions:connector")); } } export class SpeciesEvolution extends SpeciesFormEvolution { - constructor(speciesId: Species, level: integer, item: EvolutionItem | null, condition: SpeciesEvolutionCondition | null, wildDelay?: SpeciesWildEvolutionDelay) { + constructor(speciesId: Species, level: number, item: EvolutionItem | null, condition: SpeciesEvolutionCondition | null, wildDelay?: SpeciesWildEvolutionDelay) { super(speciesId, null, null, level, item, condition, wildDelay); } } @@ -119,17 +140,215 @@ export class FusionSpeciesFormEvolution extends SpeciesFormEvolution { export class SpeciesEvolutionCondition { public predicate: EvolutionConditionPredicate; - public enforceFunc: EvolutionConditionEnforceFunc | undefined; + public enforceFunc?: EvolutionConditionEnforceFunc; + public description: string; constructor(predicate: EvolutionConditionPredicate, enforceFunc?: EvolutionConditionEnforceFunc) { this.predicate = predicate; this.enforceFunc = enforceFunc; + this.description = ""; } } -export class SpeciesFriendshipEvolutionCondition extends SpeciesEvolutionCondition { - constructor(friendshipAmount: integer, predicate?: EvolutionConditionPredicate, enforceFunc?: EvolutionConditionEnforceFunc) { - super(p => p.friendship >= friendshipAmount && (!predicate || predicate(p)), enforceFunc); +class GenderEvolutionCondition extends SpeciesEvolutionCondition { + public gender: Gender; + constructor(gender: Gender) { + super(p => p.gender === gender, p => p.gender = gender); + this.gender = gender; + this.description = i18next.t("pokemonEvolutions:gender", { gender: i18next.t(`pokemonEvolutions:${Gender[gender]}`) }); + } +} + +class TimeOfDayEvolutionCondition extends SpeciesEvolutionCondition { + public timesOfDay: TimeOfDay[]; + constructor(tod: "day" | "night") { + if (tod === "day") { + super(() => globalScene.arena.getTimeOfDay() === TimeOfDay.DAWN || globalScene.arena.getTimeOfDay() === TimeOfDay.DAY); + this.timesOfDay = [ TimeOfDay.DAWN, TimeOfDay.DAY ]; + } else if (tod === "night") { + super(() => globalScene.arena.getTimeOfDay() === TimeOfDay.DUSK || globalScene.arena.getTimeOfDay() === TimeOfDay.NIGHT); + this.timesOfDay = [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]; + } else { + super(() => false); + this.timesOfDay = []; + } + this.description = i18next.t("pokemonEvolutions:timeOfDay", { tod: i18next.t(`pokemonEvolutions:${tod}`) }); + } +} + +class MoveEvolutionCondition extends SpeciesEvolutionCondition { + public move: Moves; + constructor(move: Moves) { + super(p => p.moveset.filter(m => m?.moveId === move).length > 0); + this.move = move; + const moveKey = Moves[this.move].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + this.description = i18next.t("pokemonEvolutions:move", { move: i18next.t(`move:${moveKey}.name`) }); + } +} + +class FriendshipEvolutionCondition extends SpeciesEvolutionCondition { + public amount: number; + constructor(amount: number) { + super(p => p.friendship >= amount); + this.amount = amount; + this.description = i18next.t("pokemonEvolutions:friendship"); + } +} + +class FriendshipTimeOfDayEvolutionCondition extends SpeciesEvolutionCondition { + public amount: number; + public timesOfDay: TimeOfDay[]; + constructor(amount: number, tod: "day" | "night") { + if (tod === "day") { + super(p => p.friendship >= amount && (globalScene.arena.getTimeOfDay() === TimeOfDay.DAWN || globalScene.arena.getTimeOfDay() === TimeOfDay.DAY)); + this.timesOfDay = [ TimeOfDay.DAWN, TimeOfDay.DAY ]; + } else if (tod === "night") { + super(p => p.friendship >= amount && (globalScene.arena.getTimeOfDay() === TimeOfDay.DUSK || globalScene.arena.getTimeOfDay() === TimeOfDay.NIGHT)); + this.timesOfDay = [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]; + } else { + super(_p => false); + this.timesOfDay = []; + } + this.amount = amount; + this.description = i18next.t("pokemonEvolutions:friendshipTimeOfDay", { tod: i18next.t(`pokemonEvolutions:${tod}`) }); + } +} + +class FriendshipMoveTypeEvolutionCondition extends SpeciesEvolutionCondition { + public amount: number; + public type: PokemonType; + constructor(amount: number, type: PokemonType) { + super(p => p.friendship >= amount && !!p.getMoveset().find(m => m?.getMove().type === type)); + this.amount = amount; + this.type = type; + this.description = i18next.t("pokemonEvolutions:friendshipMoveType", { type: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) }); + } +} + +class ShedinjaEvolutionCondition extends SpeciesEvolutionCondition { + constructor() { + super(() => globalScene.getPlayerParty().length < 6 && globalScene.pokeballCounts[PokeballType.POKEBALL] > 0); + this.description = i18next.t("pokemonEvolutions:shedinja"); + } +} + +class PartyTypeEvolutionCondition extends SpeciesEvolutionCondition { + public type: PokemonType; + constructor(type: PokemonType) { + super(() => !!globalScene.getPlayerParty().find(p => p.getTypes(false, false, true).indexOf(type) > -1)); + this.type = type; + this.description = i18next.t("pokemonEvolutions:partyType", { type: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) }); + } +} + +class CaughtEvolutionCondition extends SpeciesEvolutionCondition { + public species: Species; + constructor(species: Species) { + super(() => !!globalScene.gameData.dexData[species].caughtAttr); + this.species = species; + this.description = i18next.t("pokemonEvolutions:caught", { species: i18next.t(`pokemon:${Species[this.species].toLowerCase()}`) }); + } +} + +class WeatherEvolutionCondition extends SpeciesEvolutionCondition { + public weatherTypes: WeatherType[]; + constructor(weatherTypes: WeatherType[]) { + super(() => weatherTypes.indexOf(globalScene.arena.weather?.weatherType || WeatherType.NONE) > -1); + this.weatherTypes = weatherTypes; + this.description = i18next.t("pokemonEvolutions:weather"); + } +} + +class MoveTypeEvolutionCondition extends SpeciesEvolutionCondition { + public type: PokemonType; + constructor(type: PokemonType) { + super(p => p.moveset.filter(m => m?.getMove().type === type).length > 0); + this.type = type; + this.description = i18next.t("pokemonEvolutions:moveType", { type: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) }); + } +} + +class TreasureEvolutionCondition extends SpeciesEvolutionCondition { + constructor() { + super(p => p.evoCounter + + p.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length + + globalScene.findModifiers(m => m instanceof MoneyMultiplierModifier + || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length > 9); + this.description = i18next.t("pokemonEvolutions:treasure"); + } +} + +class TyrogueEvolutionCondition extends SpeciesEvolutionCondition { + public move: Moves; + constructor(move: Moves) { + super(p => + p.getMoveset(true).find(m => m && [ Moves.LOW_SWEEP, Moves.MACH_PUNCH, Moves.RAPID_SPIN ].includes(m?.moveId))?.moveId === move); + this.move = move; + const moveKey = Moves[this.move].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + this.description = i18next.t("pokemonEvolutions:move", { move: i18next.t(`move:${moveKey}.name`) }); + } +} + +class NatureEvolutionCondition extends SpeciesEvolutionCondition { + public natures: Nature[]; + constructor(natures: Nature[]) { + super(p => natures.indexOf(p.getNature()) > -1); + this.natures = natures; + this.description = i18next.t("pokemonEvolutions:nature"); + } +} + +class MoveTimeOfDayEvolutionCondition extends SpeciesEvolutionCondition { + public move: Moves; + public timesOfDay: TimeOfDay[]; + constructor(move: Moves, tod: "day" | "night") { + if (tod === "day") { + super(p => p.moveset.filter(m => m?.moveId === move).length > 0 && (globalScene.arena.getTimeOfDay() === TimeOfDay.DAWN || globalScene.arena.getTimeOfDay() === TimeOfDay.DAY)); + this.move = move; + this.timesOfDay = [ TimeOfDay.DAWN, TimeOfDay.DAY ]; + } else if (tod === "night") { + super(p => p.moveset.filter(m => m?.moveId === move).length > 0 && (globalScene.arena.getTimeOfDay() === TimeOfDay.DUSK || globalScene.arena.getTimeOfDay() === TimeOfDay.NIGHT)); + this.move = move; + this.timesOfDay = [ TimeOfDay.DUSK, TimeOfDay.NIGHT ]; + } else { + super(() => false); + this.timesOfDay = []; + } + const moveKey = Moves[this.move].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + this.description = i18next.t("pokemonEvolutions:moveTimeOfDay", { move: i18next.t(`move:${moveKey}.name`), tod: i18next.t(`pokemonEvolutions:${tod}`) }); + } +} + +class BiomeEvolutionCondition extends SpeciesEvolutionCondition { + public biomes: Biome[]; + constructor(biomes: Biome[]) { + super(() => biomes.filter(b => b === globalScene.arena.biomeType).length > 0); + this.biomes = biomes; + this.description = i18next.t("pokemonEvolutions:biome"); + } +} + +class DunsparceEvolutionCondition extends SpeciesEvolutionCondition { + constructor() { + super(p => { + let ret = false; + if (p.moveset.filter(m => m?.moveId === Moves.HYPER_DRILL).length > 0) { + globalScene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); + } + return ret; + }); + const moveKey = Moves[Moves.HYPER_DRILL].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + this.description = i18next.t("pokemonEvolutions:move", { move: i18next.t(`move:${moveKey}.name`) }); + } +} + +class TandemausEvolutionCondition extends SpeciesEvolutionCondition { + constructor() { + super(p => { + let ret = false; + globalScene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); + return ret; + }); } } @@ -266,8 +485,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ELECTRODE, 30, null, null) ], [Species.CUBONE]: [ - new SpeciesEvolution(Species.ALOLA_MAROWAK, 28, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), - new SpeciesEvolution(Species.MAROWAK, 28, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.ALOLA_MAROWAK, 28, null, new TimeOfDayEvolutionCondition("night")), + new SpeciesEvolution(Species.MAROWAK, 28, null, new TimeOfDayEvolutionCondition("day")) ], [Species.TYROGUE]: [ /** @@ -276,19 +495,13 @@ export const pokemonEvolutions: PokemonEvolutions = { * If Tyrogue knows multiple of these moves, its evolution is based on * the first qualifying move in its moveset. */ - new SpeciesEvolution(Species.HITMONLEE, 20, null, new SpeciesEvolutionCondition(p => - p.getMoveset(true).find(move => move && [ Moves.LOW_SWEEP, Moves.MACH_PUNCH, Moves.RAPID_SPIN ].includes(move?.moveId))?.moveId === Moves.LOW_SWEEP - )), - new SpeciesEvolution(Species.HITMONCHAN, 20, null, new SpeciesEvolutionCondition(p => - p.getMoveset(true).find(move => move && [ Moves.LOW_SWEEP, Moves.MACH_PUNCH, Moves.RAPID_SPIN ].includes(move?.moveId))?.moveId === Moves.MACH_PUNCH - )), - new SpeciesEvolution(Species.HITMONTOP, 20, null, new SpeciesEvolutionCondition(p => - p.getMoveset(true).find(move => move && [ Moves.LOW_SWEEP, Moves.MACH_PUNCH, Moves.RAPID_SPIN ].includes(move?.moveId))?.moveId === Moves.RAPID_SPIN - )), + new SpeciesEvolution(Species.HITMONLEE, 20, null, new TyrogueEvolutionCondition(Moves.LOW_SWEEP)), + new SpeciesEvolution(Species.HITMONCHAN, 20, null, new TyrogueEvolutionCondition(Moves.MACH_PUNCH)), + new SpeciesEvolution(Species.HITMONTOP, 20, null, new TyrogueEvolutionCondition(Moves.RAPID_SPIN)), ], [Species.KOFFING]: [ - new SpeciesEvolution(Species.GALAR_WEEZING, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), - new SpeciesEvolution(Species.WEEZING, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.GALAR_WEEZING, 35, null, new TimeOfDayEvolutionCondition("night")), + new SpeciesEvolution(Species.WEEZING, 35, null, new TimeOfDayEvolutionCondition("day")) ], [Species.RHYHORN]: [ new SpeciesEvolution(Species.RHYDON, 42, null, null) @@ -333,8 +546,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.QUILAVA, 14, null, null) ], [Species.QUILAVA]: [ - new SpeciesEvolution(Species.HISUI_TYPHLOSION, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), - new SpeciesEvolution(Species.TYPHLOSION, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.HISUI_TYPHLOSION, 36, null, new TimeOfDayEvolutionCondition("night")), + new SpeciesEvolution(Species.TYPHLOSION, 36, null, new TimeOfDayEvolutionCondition("day")) ], [Species.TOTODILE]: [ new SpeciesEvolution(Species.CROCONAW, 18, null, null) @@ -436,8 +649,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.LINOONE, 20, null, null) ], [Species.WURMPLE]: [ - new SpeciesEvolution(Species.SILCOON, 7, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)), - new SpeciesEvolution(Species.CASCOON, 7, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.SILCOON, 7, null, new TimeOfDayEvolutionCondition("day")), + new SpeciesEvolution(Species.CASCOON, 7, null, new TimeOfDayEvolutionCondition("night")) ], [Species.SILCOON]: [ new SpeciesEvolution(Species.BEAUTIFLY, 10, null, null) @@ -461,8 +674,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.KIRLIA, 20, null, null) ], [Species.KIRLIA]: [ - new SpeciesEvolution(Species.GARDEVOIR, 30, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)), - new SpeciesEvolution(Species.GALLADE, 30, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)) + new SpeciesEvolution(Species.GARDEVOIR, 30, null, new GenderEvolutionCondition(Gender.FEMALE)), + new SpeciesEvolution(Species.GALLADE, 30, null, new GenderEvolutionCondition(Gender.MALE)) ], [Species.SURSKIT]: [ new SpeciesEvolution(Species.MASQUERAIN, 22, null, null) @@ -478,7 +691,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.NINCADA]: [ new SpeciesEvolution(Species.NINJASK, 20, null, null), - new SpeciesEvolution(Species.SHEDINJA, 20, null, new SpeciesEvolutionCondition(p => p.scene.getParty().length < 6 && p.scene.pokeballCounts[PokeballType.POKEBALL] > 0)) + new SpeciesEvolution(Species.SHEDINJA, 20, null, new ShedinjaEvolutionCondition()) ], [Species.WHISMUR]: [ new SpeciesEvolution(Species.LOUDRED, 20, null, null) @@ -550,8 +763,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.DUSCLOPS, 37, null, null) ], [Species.SNORUNT]: [ - new SpeciesEvolution(Species.GLALIE, 42, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)), - new SpeciesEvolution(Species.FROSLASS, 42, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)) + new SpeciesEvolution(Species.GLALIE, 42, null, new GenderEvolutionCondition(Gender.MALE)), + new SpeciesEvolution(Species.FROSLASS, 42, null, new GenderEvolutionCondition(Gender.FEMALE)) ], [Species.SPHEAL]: [ new SpeciesEvolution(Species.SEALEO, 32, null, null) @@ -614,11 +827,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.BASTIODON, 30, null, null) ], [Species.BURMY]: [ - new SpeciesEvolution(Species.MOTHIM, 20, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)), - new SpeciesEvolution(Species.WORMADAM, 20, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)) + new SpeciesEvolution(Species.MOTHIM, 20, null, new GenderEvolutionCondition(Gender.MALE)), + new SpeciesEvolution(Species.WORMADAM, 20, null, new GenderEvolutionCondition(Gender.FEMALE)) ], [Species.COMBEE]: [ - new SpeciesEvolution(Species.VESPIQUEN, 21, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)) + new SpeciesEvolution(Species.VESPIQUEN, 21, null, new GenderEvolutionCondition(Gender.FEMALE)) ], [Species.BUIZEL]: [ new SpeciesEvolution(Species.FLOATZEL, 26, null, null) @@ -660,7 +873,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.LUMINEON, 31, null, null) ], [Species.MANTYKE]: [ - new SpeciesEvolution(Species.MANTINE, 32, null, new SpeciesEvolutionCondition(p => !!p.scene.gameData.dexData[Species.REMORAID].caughtAttr), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.MANTINE, 32, null, new CaughtEvolutionCondition(Species.REMORAID), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.SNOVER]: [ new SpeciesEvolution(Species.ABOMASNOW, 40, null, null) @@ -681,8 +894,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.DEWOTT, 17, null, null) ], [Species.DEWOTT]: [ - new SpeciesEvolution(Species.HISUI_SAMUROTT, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), - new SpeciesEvolution(Species.SAMUROTT, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.HISUI_SAMUROTT, 36, null, new TimeOfDayEvolutionCondition("night")), + new SpeciesEvolution(Species.SAMUROTT, 36, null, new TimeOfDayEvolutionCondition("day")) ], [Species.PATRAT]: [ new SpeciesEvolution(Species.WATCHOG, 20, null, null) @@ -832,8 +1045,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.KINGAMBIT, 1, EvolutionItem.LEADERS_CREST, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.RUFFLET]: [ - new SpeciesEvolution(Species.HISUI_BRAVIARY, 54, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), - new SpeciesEvolution(Species.BRAVIARY, 54, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.HISUI_BRAVIARY, 54, null, new TimeOfDayEvolutionCondition("night")), + new SpeciesEvolution(Species.BRAVIARY, 54, null, new TimeOfDayEvolutionCondition("day")) ], [Species.VULLABY]: [ new SpeciesEvolution(Species.MANDIBUZZ, 54, null, null) @@ -890,11 +1103,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GOGOAT, 32, null, null) ], [Species.PANCHAM]: [ - new SpeciesEvolution(Species.PANGORO, 32, null, new SpeciesEvolutionCondition(p => !!p.scene.getParty().find(p => p.getTypes(false, false, true).indexOf(Type.DARK) > -1)), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.PANGORO, 32, null, new PartyTypeEvolutionCondition(PokemonType.DARK), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.ESPURR]: [ - new SpeciesFormEvolution(Species.MEOWSTIC, "", "female", 25, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)), - new SpeciesFormEvolution(Species.MEOWSTIC, "", "", 25, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)) + new SpeciesFormEvolution(Species.MEOWSTIC, "", "female", 25, null, new GenderEvolutionCondition(Gender.FEMALE)), + new SpeciesFormEvolution(Species.MEOWSTIC, "", "", 25, null, new GenderEvolutionCondition(Gender.MALE)) ], [Species.HONEDGE]: [ new SpeciesEvolution(Species.DOUBLADE, 35, null, null) @@ -912,21 +1125,21 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CLAWITZER, 37, null, null) ], [Species.TYRUNT]: [ - new SpeciesEvolution(Species.TYRANTRUM, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.TYRANTRUM, 39, null, new TimeOfDayEvolutionCondition("day")) ], [Species.AMAURA]: [ - new SpeciesEvolution(Species.AURORUS, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.AURORUS, 39, null, new TimeOfDayEvolutionCondition("night")) ], [Species.GOOMY]: [ - new SpeciesEvolution(Species.HISUI_SLIGGOO, 40, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), - new SpeciesEvolution(Species.SLIGGOO, 40, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.HISUI_SLIGGOO, 40, null, new TimeOfDayEvolutionCondition("night")), + new SpeciesEvolution(Species.SLIGGOO, 40, null, new TimeOfDayEvolutionCondition("day")) ], [Species.SLIGGOO]: [ - new SpeciesEvolution(Species.GOODRA, 50, null, new SpeciesEvolutionCondition(p => [ WeatherType.RAIN, WeatherType.FOG, WeatherType.HEAVY_RAIN ].indexOf(p.scene.arena.weather?.weatherType || WeatherType.NONE) > -1), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.GOODRA, 50, null, new WeatherEvolutionCondition([ WeatherType.RAIN, WeatherType.FOG, WeatherType.HEAVY_RAIN ]), SpeciesWildEvolutionDelay.LONG) ], [Species.BERGMITE]: [ - new SpeciesEvolution(Species.HISUI_AVALUGG, 37, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), - new SpeciesEvolution(Species.AVALUGG, 37, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.HISUI_AVALUGG, 37, null, new TimeOfDayEvolutionCondition("night")), + new SpeciesEvolution(Species.AVALUGG, 37, null, new TimeOfDayEvolutionCondition("day")) ], [Species.NOIBAT]: [ new SpeciesEvolution(Species.NOIVERN, 48, null, null) @@ -935,8 +1148,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.DARTRIX, 17, null, null) ], [Species.DARTRIX]: [ - new SpeciesEvolution(Species.HISUI_DECIDUEYE, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), - new SpeciesEvolution(Species.DECIDUEYE, 34, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.HISUI_DECIDUEYE, 36, null, new TimeOfDayEvolutionCondition("night")), + new SpeciesEvolution(Species.DECIDUEYE, 34, null, new TimeOfDayEvolutionCondition("day")) ], [Species.LITTEN]: [ new SpeciesEvolution(Species.TORRACAT, 17, null, null) @@ -957,7 +1170,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.TOUCANNON, 28, null, null) ], [Species.YUNGOOS]: [ - new SpeciesEvolution(Species.GUMSHOOS, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.GUMSHOOS, 20, null, new TimeOfDayEvolutionCondition("day")) ], [Species.GRUBBIN]: [ new SpeciesEvolution(Species.CHARJABUG, 20, null, null) @@ -975,13 +1188,13 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ARAQUANID, 22, null, null) ], [Species.FOMANTIS]: [ - new SpeciesEvolution(Species.LURANTIS, 34, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.LURANTIS, 34, null, new TimeOfDayEvolutionCondition("day")) ], [Species.MORELULL]: [ new SpeciesEvolution(Species.SHIINOTIC, 24, null, null) ], [Species.SALANDIT]: [ - new SpeciesEvolution(Species.SALAZZLE, 33, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)) + new SpeciesEvolution(Species.SALAZZLE, 33, null, new GenderEvolutionCondition(Gender.FEMALE)) ], [Species.STUFFUL]: [ new SpeciesEvolution(Species.BEWEAR, 27, null, null) @@ -1005,14 +1218,14 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.COSMOEM, 23, null, null) ], [Species.COSMOEM]: [ - new SpeciesEvolution(Species.SOLGALEO, 53, EvolutionItem.SUN_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesEvolution(Species.LUNALA, 53, EvolutionItem.MOON_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.SOLGALEO, 1, EvolutionItem.SUN_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesEvolution(Species.LUNALA, 1, EvolutionItem.MOON_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MELTAN]: [ new SpeciesEvolution(Species.MELMETAL, 48, null, null) ], [Species.ALOLA_RATTATA]: [ - new SpeciesEvolution(Species.ALOLA_RATICATE, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.ALOLA_RATICATE, 20, null, new TimeOfDayEvolutionCondition("night")) ], [Species.ALOLA_DIGLETT]: [ new SpeciesEvolution(Species.ALOLA_DUGTRIO, 26, null, null) @@ -1085,7 +1298,8 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.TOXEL]: [ new SpeciesFormEvolution(Species.TOXTRICITY, "", "lowkey", 30, null, - new SpeciesEvolutionCondition(p => [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ].indexOf(p.getNature()) > -1)), + new NatureEvolutionCondition([ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ]) + ), new SpeciesFormEvolution(Species.TOXTRICITY, "", "amped", 30, null, null) ], [Species.SIZZLIPEDE]: [ @@ -1135,7 +1349,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GALAR_LINOONE, 20, null, null) ], [Species.GALAR_LINOONE]: [ - new SpeciesEvolution(Species.OBSTAGOON, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.OBSTAGOON, 35, null, new TimeOfDayEvolutionCondition("night")) ], [Species.GALAR_YAMASK]: [ new SpeciesEvolution(Species.RUNERIGUS, 34, null, null) @@ -1144,7 +1358,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.HISUI_ZOROARK, 30, null, null) ], [Species.HISUI_SLIGGOO]: [ - new SpeciesEvolution(Species.HISUI_GOODRA, 50, null, new SpeciesEvolutionCondition(p => [ WeatherType.RAIN, WeatherType.FOG, WeatherType.HEAVY_RAIN ].indexOf(p.scene.arena.weather?.weatherType || WeatherType.NONE) > -1), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.HISUI_GOODRA, 50, null, new WeatherEvolutionCondition([ WeatherType.RAIN, WeatherType.FOG, WeatherType.HEAVY_RAIN ]), SpeciesWildEvolutionDelay.LONG) ], [Species.SPRIGATITO]: [ new SpeciesEvolution(Species.FLORAGATO, 16, null, null) @@ -1165,8 +1379,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.QUAQUAVAL, 36, null, null) ], [Species.LECHONK]: [ - new SpeciesFormEvolution(Species.OINKOLOGNE, "", "female", 18, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)), - new SpeciesFormEvolution(Species.OINKOLOGNE, "", "", 18, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)) + new SpeciesFormEvolution(Species.OINKOLOGNE, "", "female", 18, null, new GenderEvolutionCondition(Gender.FEMALE)), + new SpeciesFormEvolution(Species.OINKOLOGNE, "", "", 18, null, new GenderEvolutionCondition(Gender.MALE)) ], [Species.TAROUNTULA]: [ new SpeciesEvolution(Species.SPIDOPS, 15, null, null) @@ -1181,12 +1395,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.PAWMOT, 32, null, null) ], [Species.TANDEMAUS]: [ - new SpeciesFormEvolution(Species.MAUSHOLD, "", "three", 25, null, new SpeciesEvolutionCondition(p => { - let ret = false; - p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); - return ret; - })), - new SpeciesEvolution(Species.MAUSHOLD, 25, null, null) + new SpeciesFormEvolution(Species.MAUSHOLD, "", "three", 25, null, new TandemausEvolutionCondition()), + new SpeciesFormEvolution(Species.MAUSHOLD, "", "four", 25, null, null) ], [Species.FIDOUGH]: [ new SpeciesEvolution(Species.DACHSBUN, 26, null, null) @@ -1243,7 +1453,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GLIMMORA, 35, null, null) ], [Species.GREAVARD]: [ - new SpeciesEvolution(Species.HOUNDSTONE, 30, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.HOUNDSTONE, 30, null, new TimeOfDayEvolutionCondition("night")) ], [Species.FRIGIBAX]: [ new SpeciesEvolution(Species.ARCTIBAX, 35, null, null) @@ -1300,21 +1510,21 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.EXEGGUTOR, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.TANGELA]: [ - new SpeciesEvolution(Species.TANGROWTH, 34, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.TANGROWTH, 34, null, new MoveEvolutionCondition(Moves.ANCIENT_POWER), SpeciesWildEvolutionDelay.LONG) ], [Species.LICKITUNG]: [ - new SpeciesEvolution(Species.LICKILICKY, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.ROLLOUT).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.LICKILICKY, 32, null, new MoveEvolutionCondition(Moves.ROLLOUT), SpeciesWildEvolutionDelay.LONG) ], [Species.STARYU]: [ new SpeciesEvolution(Species.STARMIE, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.EEVEE]: [ - new SpeciesFormEvolution(Species.SYLVEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => !!p.getMoveset().find(m => m?.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.SYLVEON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => !!p.getMoveset().find(m => m?.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ESPEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ESPEON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.UMBREON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.UMBREON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SYLVEON, "", "", 1, null, new FriendshipMoveTypeEvolutionCondition(120, PokemonType.FAIRY), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SYLVEON, "partner", "", 1, null, new FriendshipMoveTypeEvolutionCondition(120, PokemonType.FAIRY), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ESPEON, "", "", 1, null, new FriendshipTimeOfDayEvolutionCondition(120, "day"), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ESPEON, "partner", "", 1, null, new FriendshipTimeOfDayEvolutionCondition(120, "day"), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.UMBREON, "", "", 1, null, new FriendshipTimeOfDayEvolutionCondition(120, "night"), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.UMBREON, "partner", "", 1, null, new FriendshipTimeOfDayEvolutionCondition(120, "night"), SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.VAPOREON, "", "", 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.VAPOREON, "partner", "", 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.JOLTEON, "", "", 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG), @@ -1330,13 +1540,13 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.TOGEKISS, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.AIPOM]: [ - new SpeciesEvolution(Species.AMBIPOM, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.DOUBLE_HIT).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.AMBIPOM, 32, null, new MoveEvolutionCondition(Moves.DOUBLE_HIT), SpeciesWildEvolutionDelay.LONG) ], [Species.SUNKERN]: [ new SpeciesEvolution(Species.SUNFLORA, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.YANMA]: [ - new SpeciesEvolution(Species.YANMEGA, 33, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.YANMEGA, 33, null, new MoveEvolutionCondition(Moves.ANCIENT_POWER), SpeciesWildEvolutionDelay.LONG) ], [Species.MURKROW]: [ new SpeciesEvolution(Species.HONCHKROW, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1345,32 +1555,26 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.MISMAGIUS, 1, EvolutionItem.DUSK_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GIRAFARIG]: [ - new SpeciesEvolution(Species.FARIGIRAF, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.TWIN_BEAM).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.FARIGIRAF, 32, null, new MoveEvolutionCondition(Moves.TWIN_BEAM), SpeciesWildEvolutionDelay.LONG) ], [Species.DUNSPARCE]: [ - new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "three-segment", 32, null, new SpeciesEvolutionCondition(p => { - let ret = false; - if (p.moveset.filter(m => m?.moveId === Moves.HYPER_DRILL).length > 0) { - p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); - } - return ret; - }), SpeciesWildEvolutionDelay.LONG), - new SpeciesEvolution(Species.DUDUNSPARCE, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.HYPER_DRILL).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "three-segment", 32, null, new DunsparceEvolutionCondition(), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "two-segment", 32, null, new MoveEvolutionCondition(Moves.HYPER_DRILL), SpeciesWildEvolutionDelay.LONG) ], [Species.GLIGAR]: [ - new SpeciesEvolution(Species.GLISCOR, 1, EvolutionItem.RAZOR_FANG, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT /* Razor fang at night*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.GLISCOR, 1, EvolutionItem.RAZOR_FANG, new TimeOfDayEvolutionCondition("night") /* Razor fang at night*/, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SNEASEL]: [ - new SpeciesEvolution(Species.WEAVILE, 1, EvolutionItem.RAZOR_CLAW, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT /* Razor claw at night*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.WEAVILE, 1, EvolutionItem.RAZOR_CLAW, new TimeOfDayEvolutionCondition("night") /* Razor claw at night*/, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.URSARING]: [ new SpeciesEvolution(Species.URSALUNA, 1, EvolutionItem.PEAT_BLOCK, null, SpeciesWildEvolutionDelay.VERY_LONG) //Ursaring does not evolve into Bloodmoon Ursaluna ], [Species.PILOSWINE]: [ - new SpeciesEvolution(Species.MAMOSWINE, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.ANCIENT_POWER).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MAMOSWINE, 1, null, new MoveEvolutionCondition(Moves.ANCIENT_POWER), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.STANTLER]: [ - new SpeciesEvolution(Species.WYRDEER, 25, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.PSYSHIELD_BASH).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.WYRDEER, 25, null, new MoveEvolutionCondition(Moves.PSYSHIELD_BASH), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.LOMBRE]: [ new SpeciesEvolution(Species.LUDICOLO, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1388,11 +1592,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ROSERADE, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.BONSLY]: [ - new SpeciesEvolution(Species.SUDOWOODO, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SUDOWOODO, 1, null, new MoveEvolutionCondition(Moves.MIMIC), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MIME_JR]: [ - new SpeciesEvolution(Species.GALAR_MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0 && (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0 && (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.GALAR_MR_MIME, 1, null, new MoveTimeOfDayEvolutionCondition(Moves.MIMIC, "night"), SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.MR_MIME, 1, null, new MoveTimeOfDayEvolutionCondition(Moves.MIMIC, "day"), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.PANSAGE]: [ new SpeciesEvolution(Species.SIMISAGE, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1414,8 +1618,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.LILLIGANT, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.BASCULIN]: [ - new SpeciesFormEvolution(Species.BASCULEGION, "white-striped", "female", 40, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE), SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesFormEvolution(Species.BASCULEGION, "white-striped", "male", 40, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesFormEvolution(Species.BASCULEGION, "white-striped", "female", 40, null, new GenderEvolutionCondition(Gender.FEMALE), SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesFormEvolution(Species.BASCULEGION, "white-striped", "male", 40, null, new GenderEvolutionCondition(Gender.MALE), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MINCCINO]: [ new SpeciesEvolution(Species.CINCCINO, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1442,15 +1646,15 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.ROCKRUFF]: [ - new SpeciesFormEvolution(Species.LYCANROC, "", "midday", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY) && (p.formIndex === 0))), - new SpeciesFormEvolution(Species.LYCANROC, "", "dusk", 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1)), - new SpeciesFormEvolution(Species.LYCANROC, "", "midnight", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0))) + new SpeciesFormEvolution(Species.LYCANROC, "own-tempo", "dusk", 25, null, null), + new SpeciesFormEvolution(Species.LYCANROC, "", "midday", 25, null, new TimeOfDayEvolutionCondition("day")), + new SpeciesFormEvolution(Species.LYCANROC, "", "midnight", 25, null, new TimeOfDayEvolutionCondition("night")) ], [Species.STEENEE]: [ - new SpeciesEvolution(Species.TSAREENA, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.STOMP).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.TSAREENA, 28, null, new MoveEvolutionCondition(Moves.STOMP), SpeciesWildEvolutionDelay.LONG) ], [Species.POIPOLE]: [ - new SpeciesEvolution(Species.NAGANADEL, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.DRAGON_PULSE).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.NAGANADEL, 1, null, new MoveEvolutionCondition(Moves.DRAGON_PULSE), SpeciesWildEvolutionDelay.LONG) ], [Species.ALOLA_SANDSHREW]: [ new SpeciesEvolution(Species.ALOLA_SANDSLASH, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1464,22 +1668,40 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.APPLETUN, 1, EvolutionItem.SWEET_APPLE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.CLOBBOPUS]: [ - new SpeciesEvolution(Species.GRAPPLOCT, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.TAUNT).length > 0)/*Once Taunt is implemented, change evo level to 1 and delay to LONG*/) + new SpeciesEvolution(Species.GRAPPLOCT, 35, null, new MoveEvolutionCondition(Moves.TAUNT)/*Once Taunt is implemented, change evo level to 1 and delay to LONG*/) ], [Species.SINISTEA]: [ new SpeciesFormEvolution(Species.POLTEAGEIST, "phony", "phony", 1, EvolutionItem.CRACKED_POT, null, SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.POLTEAGEIST, "antique", "antique", 1, EvolutionItem.CHIPPED_POT, null, SpeciesWildEvolutionDelay.LONG) ], [Species.MILCERY]: [ - new SpeciesFormEvolution(Species.ALCREMIE, "", "vanilla-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.TOWN || p.scene.arena.biomeType === Biome.PLAINS || p.scene.arena.biomeType === Biome.GRASS || p.scene.arena.biomeType === Biome.TALL_GRASS || p.scene.arena.biomeType === Biome.METROPOLIS), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, "", "ruby-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.BADLANDS || p.scene.arena.biomeType === Biome.VOLCANO || p.scene.arena.biomeType === Biome.GRAVEYARD || p.scene.arena.biomeType === Biome.FACTORY || p.scene.arena.biomeType === Biome.SLUM), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, "", "matcha-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.FOREST || p.scene.arena.biomeType === Biome.SWAMP || p.scene.arena.biomeType === Biome.MEADOW || p.scene.arena.biomeType === Biome.JUNGLE), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, "", "mint-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.SEA || p.scene.arena.biomeType === Biome.BEACH || p.scene.arena.biomeType === Biome.LAKE || p.scene.arena.biomeType === Biome.SEABED), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, "", "lemon-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.DESERT || p.scene.arena.biomeType === Biome.POWER_PLANT || p.scene.arena.biomeType === Biome.DOJO || p.scene.arena.biomeType === Biome.RUINS || p.scene.arena.biomeType === Biome.CONSTRUCTION_SITE), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, "", "salted-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.MOUNTAIN || p.scene.arena.biomeType === Biome.CAVE || p.scene.arena.biomeType === Biome.ICE_CAVE || p.scene.arena.biomeType === Biome.FAIRY_CAVE || p.scene.arena.biomeType === Biome.SNOWY_FOREST), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, "", "ruby-swirl", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.WASTELAND || p.scene.arena.biomeType === Biome.LABORATORY), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, "", "caramel-swirl", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.TEMPLE || p.scene.arena.biomeType === Biome.ISLAND), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, "", "rainbow-swirl", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ABYSS || p.scene.arena.biomeType === Biome.SPACE || p.scene.arena.biomeType === Biome.END), SpeciesWildEvolutionDelay.LONG) + new SpeciesFormEvolution(Species.ALCREMIE, "", "vanilla-cream", 1, EvolutionItem.STRAWBERRY_SWEET, + new BiomeEvolutionCondition([ Biome.TOWN, Biome.PLAINS, Biome.GRASS, Biome.TALL_GRASS, Biome.METROPOLIS ]), + SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "ruby-cream", 1, EvolutionItem.STRAWBERRY_SWEET, + new BiomeEvolutionCondition([ Biome.BADLANDS, Biome.VOLCANO, Biome.GRAVEYARD, Biome.FACTORY, Biome.SLUM ]), + SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "matcha-cream", 1, EvolutionItem.STRAWBERRY_SWEET, + new BiomeEvolutionCondition([ Biome.FOREST, Biome.SWAMP, Biome.MEADOW, Biome.JUNGLE ]), + SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "mint-cream", 1, EvolutionItem.STRAWBERRY_SWEET, + new BiomeEvolutionCondition([ Biome.SEA, Biome.BEACH, Biome.LAKE, Biome.SEABED ]), + SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "lemon-cream", 1, EvolutionItem.STRAWBERRY_SWEET, + new BiomeEvolutionCondition([ Biome.DESERT, Biome.POWER_PLANT, Biome.DOJO, Biome.RUINS, Biome.CONSTRUCTION_SITE ]), + SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "salted-cream", 1, EvolutionItem.STRAWBERRY_SWEET, + new BiomeEvolutionCondition([ Biome.MOUNTAIN, Biome.CAVE, Biome.ICE_CAVE, Biome.FAIRY_CAVE, Biome.SNOWY_FOREST ]), + SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "ruby-swirl", 1, EvolutionItem.STRAWBERRY_SWEET, + new BiomeEvolutionCondition([ Biome.WASTELAND, Biome.LABORATORY ]), + SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "caramel-swirl", 1, EvolutionItem.STRAWBERRY_SWEET, + new BiomeEvolutionCondition([ Biome.TEMPLE, Biome.ISLAND ]), + SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "rainbow-swirl", 1, EvolutionItem.STRAWBERRY_SWEET, + new BiomeEvolutionCondition([ Biome.ABYSS, Biome.SPACE, Biome.END ]), + SpeciesWildEvolutionDelay.LONG) ], [Species.DURALUDON]: [ new SpeciesFormEvolution(Species.ARCHALUDON, "", "", 1, EvolutionItem.METAL_ALLOY, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1498,10 +1720,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.HISUI_ELECTRODE, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.HISUI_QWILFISH]: [ - new SpeciesEvolution(Species.OVERQWIL, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.BARB_BARRAGE).length > 0), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.OVERQWIL, 28, null, new MoveEvolutionCondition(Moves.BARB_BARRAGE), SpeciesWildEvolutionDelay.LONG) ], [Species.HISUI_SNEASEL]: [ - new SpeciesEvolution(Species.SNEASLER, 1, EvolutionItem.RAZOR_CLAW, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY /* Razor claw at day*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.SNEASLER, 1, EvolutionItem.RAZOR_CLAW, new TimeOfDayEvolutionCondition("day") /* Razor claw at day*/, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.CHARCADET]: [ new SpeciesEvolution(Species.ARMAROUGE, 1, EvolutionItem.AUSPICIOUS_ARMOR, null, SpeciesWildEvolutionDelay.LONG), @@ -1521,7 +1743,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesFormEvolution(Species.SINISTCHA, "artisan", "masterpiece", 1, EvolutionItem.MASTERPIECE_TEACUP, null, SpeciesWildEvolutionDelay.LONG) ], [Species.DIPPLIN]: [ - new SpeciesEvolution(Species.HYDRAPPLE, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.DRAGON_CHEER).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.HYDRAPPLE, 1, null, new MoveEvolutionCondition(Moves.DRAGON_CHEER), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.KADABRA]: [ new SpeciesEvolution(Species.ALAKAZAM, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1536,9 +1758,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GENGAR, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.ONIX]: [ - new SpeciesEvolution(Species.STEELIX, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( - p => p.moveset.filter(m => m?.getMove().type === Type.STEEL).length > 0), - SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.STEELIX, 1, EvolutionItem.LINKING_CORD, new MoveTypeEvolutionCondition(PokemonType.STEEL), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.RHYDON]: [ new SpeciesEvolution(Species.RHYPERIOR, 1, EvolutionItem.PROTECTOR, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1547,9 +1767,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.KINGDRA, 1, EvolutionItem.DRAGON_SCALE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SCYTHER]: [ - new SpeciesEvolution(Species.SCIZOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( - p => p.moveset.filter(m => m?.getMove().type === Type.STEEL).length > 0), - SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesEvolution(Species.SCIZOR, 1, EvolutionItem.LINKING_CORD, new MoveTypeEvolutionCondition(PokemonType.STEEL), SpeciesWildEvolutionDelay.VERY_LONG), new SpeciesEvolution(Species.KLEAVOR, 1, EvolutionItem.BLACK_AUGURITE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.ELECTABUZZ]: [ @@ -1571,8 +1789,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.DUSKNOIR, 1, EvolutionItem.REAPER_CLOTH, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.CLAMPERL]: [ - new SpeciesEvolution(Species.HUNTAIL, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE /* Deep Sea Tooth */), SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesEvolution(Species.GOREBYSS, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE /* Deep Sea Scale */), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.HUNTAIL, 1, EvolutionItem.LINKING_CORD, new GenderEvolutionCondition(Gender.MALE /* Deep Sea Tooth */), SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesEvolution(Species.GOREBYSS, 1, EvolutionItem.LINKING_CORD, new GenderEvolutionCondition(Gender.FEMALE /* Deep Sea Scale */), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.BOLDORE]: [ new SpeciesEvolution(Species.GIGALITH, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1581,10 +1799,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CONKELDURR, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.KARRABLAST]: [ - new SpeciesEvolution(Species.ESCAVALIER, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => !!p.scene.gameData.dexData[Species.SHELMET].caughtAttr), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.ESCAVALIER, 1, EvolutionItem.LINKING_CORD, new CaughtEvolutionCondition(Species.SHELMET), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SHELMET]: [ - new SpeciesEvolution(Species.ACCELGOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => !!p.scene.gameData.dexData[Species.KARRABLAST].caughtAttr), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.ACCELGOR, 1, EvolutionItem.LINKING_CORD, new CaughtEvolutionCondition(Species.KARRABLAST), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SPRITZEE]: [ new SpeciesEvolution(Species.AROMATISSE, 1, EvolutionItem.SACHET, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1602,72 +1820,66 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ALOLA_GOLEM, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.PRIMEAPE]: [ - new SpeciesEvolution(Species.ANNIHILAPE, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.RAGE_FIST).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.ANNIHILAPE, 35, null, new MoveEvolutionCondition(Moves.RAGE_FIST), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GOLBAT]: [ - new SpeciesEvolution(Species.CROBAT, 1, null, new SpeciesFriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.CROBAT, 1, null, new FriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.CHANSEY]: [ - new SpeciesEvolution(Species.BLISSEY, 1, null, new SpeciesFriendshipEvolutionCondition(200), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.BLISSEY, 1, null, new FriendshipEvolutionCondition(200), SpeciesWildEvolutionDelay.LONG) ], [Species.PICHU]: [ - new SpeciesFormEvolution(Species.PIKACHU, "spiky", "partner", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), - new SpeciesFormEvolution(Species.PIKACHU, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), + new SpeciesFormEvolution(Species.PIKACHU, "spiky", "partner", 1, null, new FriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), + new SpeciesFormEvolution(Species.PIKACHU, "", "", 1, null, new FriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.SHORT), ], [Species.CLEFFA]: [ - new SpeciesEvolution(Species.CLEFAIRY, 1, null, new SpeciesFriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.CLEFAIRY, 1, null, new FriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT) ], [Species.IGGLYBUFF]: [ - new SpeciesEvolution(Species.JIGGLYPUFF, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.JIGGLYPUFF, 1, null, new FriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.SHORT) ], [Species.TOGEPI]: [ - new SpeciesEvolution(Species.TOGETIC, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.TOGETIC, 1, null, new FriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.SHORT) ], [Species.AZURILL]: [ - new SpeciesEvolution(Species.MARILL, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.MARILL, 1, null, new FriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.SHORT) ], [Species.BUDEW]: [ - new SpeciesEvolution(Species.ROSELIA, 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.ROSELIA, 1, null, new FriendshipTimeOfDayEvolutionCondition(70, "day"), SpeciesWildEvolutionDelay.SHORT) ], [Species.BUNEARY]: [ - new SpeciesEvolution(Species.LOPUNNY, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.LOPUNNY, 1, null, new FriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.CHINGLING]: [ - new SpeciesEvolution(Species.CHIMECHO, 1, null, new SpeciesFriendshipEvolutionCondition(90, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.CHIMECHO, 1, null, new FriendshipTimeOfDayEvolutionCondition(90, "night"), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.HAPPINY]: [ - new SpeciesEvolution(Species.CHANSEY, 1, null, new SpeciesFriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT) + new SpeciesEvolution(Species.CHANSEY, 1, null, new FriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT) ], [Species.MUNCHLAX]: [ - new SpeciesEvolution(Species.SNORLAX, 1, null, new SpeciesFriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.SNORLAX, 1, null, new FriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.LONG) ], [Species.RIOLU]: [ - new SpeciesEvolution(Species.LUCARIO, 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.LUCARIO, 1, null, new FriendshipTimeOfDayEvolutionCondition(120, "day"), SpeciesWildEvolutionDelay.LONG) ], [Species.WOOBAT]: [ - new SpeciesEvolution(Species.SWOOBAT, 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SWOOBAT, 1, null, new FriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.SWADLOON]: [ - new SpeciesEvolution(Species.LEAVANNY, 1, null, new SpeciesFriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.LEAVANNY, 1, null, new FriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.LONG) ], [Species.TYPE_NULL]: [ - new SpeciesEvolution(Species.SILVALLY, 1, null, new SpeciesFriendshipEvolutionCondition(100), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.SILVALLY, 1, null, new FriendshipEvolutionCondition(100), SpeciesWildEvolutionDelay.LONG) ], [Species.ALOLA_MEOWTH]: [ - new SpeciesEvolution(Species.ALOLA_PERSIAN, 1, null, new SpeciesFriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.ALOLA_PERSIAN, 1, null, new FriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.LONG) ], [Species.SNOM]: [ - new SpeciesEvolution(Species.FROSMOTH, 1, null, new SpeciesFriendshipEvolutionCondition(90, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.FROSMOTH, 1, null, new FriendshipTimeOfDayEvolutionCondition(90, "night"), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.GIMMIGHOUL]: [ - new SpeciesFormEvolution(Species.GHOLDENGO, "chest", "", 1, null, new SpeciesEvolutionCondition(p => p.evoCounter - + p.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length - + p.scene.findModifiers(m => m instanceof MoneyMultiplierModifier - || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length > 9), SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesFormEvolution(Species.GHOLDENGO, "roaming", "", 1, null, new SpeciesEvolutionCondition(p => p.evoCounter - + p.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length - + p.scene.findModifiers(m => m instanceof MoneyMultiplierModifier - || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length > 9), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesFormEvolution(Species.GHOLDENGO, "chest", "", 1, null, new TreasureEvolutionCondition(), SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesFormEvolution(Species.GHOLDENGO, "roaming", "", 1, null, new TreasureEvolutionCondition(), SpeciesWildEvolutionDelay.VERY_LONG) ] }; @@ -1686,7 +1898,23 @@ export function initPokemonPrevolutions(): void { if (ev.evoFormKey && megaFormKeys.indexOf(ev.evoFormKey) > -1) { continue; } - pokemonPrevolutions[ev.speciesId] = parseInt(pk) as Species; + pokemonPrevolutions[ev.speciesId] = Number.parseInt(pk) as Species; + } + }); +} + + +// TODO: This may cause funny business for double starters such as Pichu/Pikachu +export const pokemonStarters: PokemonPrevolutions = {}; + +export function initPokemonStarters(): void { + const starterKeys = Object.keys(pokemonPrevolutions); + starterKeys.forEach(pk => { + const prevolution = pokemonPrevolutions[pk]; + if (speciesStarterCosts.hasOwnProperty(prevolution)) { + pokemonStarters[pk] = prevolution; + } else { + pokemonStarters[pk] = pokemonPrevolutions[prevolution]; } }); } diff --git a/src/data/balance/pokemon-level-moves.ts b/src/data/balance/pokemon-level-moves.ts index 71d98fb4fc2..dcbc2fb0c0d 100644 --- a/src/data/balance/pokemon-level-moves.ts +++ b/src/data/balance/pokemon-level-moves.ts @@ -1,24 +1,24 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -export type LevelMoves = ([integer, Moves])[]; +export type LevelMoves = ([number, Moves])[]; interface PokemonSpeciesLevelMoves { - [key: integer]: LevelMoves + [key: number]: LevelMoves } interface PokemonFormLevelMoves { - [key: integer]: LevelMoves + [key: number]: LevelMoves } interface PokemonSpeciesFormLevelMoves { - [key: integer]: PokemonFormLevelMoves + [key: number]: PokemonFormLevelMoves } /** 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]: [ @@ -19464,7 +19464,6 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.GRENINJA]: { 1: [ - [ EVOLVE_MOVE, Moves.WATER_SHURIKEN ], [ EVOLVE_MOVE, Moves.WATER_SHURIKEN ], [ 1, Moves.POUND ], [ 1, Moves.GROWL ], @@ -19475,6 +19474,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 1, Moves.SMACK_DOWN ], // Previous Stage Move [ 1, Moves.BOUNCE ], // Previous Stage Move [ 1, Moves.HAZE ], + [ 1, Moves.MAT_BLOCK ], [ 1, Moves.ROLE_PLAY ], [ 1, Moves.NIGHT_SLASH ], [ 10, Moves.LICK ], @@ -19718,6 +19718,44 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 48, Moves.CLOSE_COMBAT ], [ 52, Moves.FOCUS_PUNCH ], ], + 2: [ + [ EVOLVE_MOVE, Moves.WICKED_BLOW ], + [ 1, Moves.LEER ], + [ 1, Moves.FOCUS_ENERGY ], + [ 1, Moves.ENDURE ], + [ 1, Moves.ROCK_SMASH ], + [ 1, Moves.SUCKER_PUNCH ], + [ 12, Moves.AERIAL_ACE ], + [ 16, Moves.SCARY_FACE ], + [ 20, Moves.HEADBUTT ], + [ 24, Moves.BRICK_BREAK ], + [ 28, Moves.DETECT ], + [ 32, Moves.BULK_UP ], + [ 36, Moves.IRON_HEAD ], + [ 40, Moves.DYNAMIC_PUNCH ], + [ 44, Moves.COUNTER ], + [ 48, Moves.CLOSE_COMBAT ], + [ 52, Moves.FOCUS_PUNCH ], + ], + 3: [ + [ EVOLVE_MOVE, Moves.SURGING_STRIKES ], + [ 1, Moves.LEER ], + [ 1, Moves.FOCUS_ENERGY ], + [ 1, Moves.ENDURE ], + [ 1, Moves.ROCK_SMASH ], + [ 1, Moves.AQUA_JET ], + [ 12, Moves.AERIAL_ACE ], + [ 16, Moves.SCARY_FACE ], + [ 20, Moves.HEADBUTT ], + [ 24, Moves.BRICK_BREAK ], + [ 28, Moves.DETECT ], + [ 32, Moves.BULK_UP ], + [ 36, Moves.IRON_HEAD ], + [ 40, Moves.DYNAMIC_PUNCH ], + [ 44, Moves.COUNTER ], + [ 48, Moves.CLOSE_COMBAT ], + [ 52, Moves.FOCUS_PUNCH ], + ], }, [Species.CALYREX]: { 1: [ diff --git a/src/data/balance/signature-species.ts b/src/data/balance/signature-species.ts new file mode 100644 index 00000000000..a1b73af40cd --- /dev/null +++ b/src/data/balance/signature-species.ts @@ -0,0 +1,162 @@ +import { Species } from "#enums/species"; + +export type SignatureSpecies = { + [key in string]: (Species | Species[])[]; +}; + +/* + * The signature species for each Gym Leader, Elite Four member, and Champion. + * The key is the trainer type, and the value is an array of Species or Species arrays. + * This is in a separate const so it can be accessed from other places and not just the trainerConfigs + */ +export const signatureSpecies: SignatureSpecies = { + // Gym Leaders- Kanto + BROCK: [Species.GEODUDE, Species.ONIX], + MISTY: [Species.STARYU, Species.PSYDUCK], + LT_SURGE: [Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ], + ERIKA: [Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP], + JANINE: [Species.VENONAT, Species.SPINARAK, Species.ZUBAT], + SABRINA: [Species.ABRA, Species.MR_MIME, Species.ESPEON], + BLAINE: [Species.GROWLITHE, Species.PONYTA, Species.MAGMAR], + GIOVANNI: [Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F], + // Gym Leaders- Johto + FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.DODUO], + BUGSY: [Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR], + WHITNEY: [Species.JIGGLYPUFF, Species.MILTANK, Species.AIPOM, Species.GIRAFARIG], + MORTY: [Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE], + CHUCK: [Species.POLIWRATH, Species.MANKEY], + JASMINE: [Species.MAGNEMITE, Species.STEELIX], + PRYCE: [Species.SEEL, Species.SWINUB], + CLAIR: [Species.DRATINI, Species.HORSEA, Species.GYARADOS], + // Gym Leaders- Hoenn + ROXANNE: [Species.GEODUDE, Species.NOSEPASS], + BRAWLY: [Species.MACHOP, Species.MAKUHITA], + WATTSON: [Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE], + FLANNERY: [Species.SLUGMA, Species.TORKOAL, Species.NUMEL], + NORMAN: [Species.SLAKOTH, Species.SPINDA, Species.ZIGZAGOON, Species.KECLEON], + WINONA: [Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY], + TATE: [Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE], + LIZA: [Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR], + JUAN: [Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH], + // Gym Leaders- Sinnoh + ROARK: [Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE], + GARDENIA: [Species.ROSELIA, Species.TANGELA, Species.TURTWIG], + MAYLENE: [Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR], + CRASHER_WAKE: [Species.BUIZEL, Species.WOOPER, Species.PIPLUP, Species.MAGIKARP], + FANTINA: [Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB], + BYRON: [Species.SHIELDON, Species.BRONZOR, Species.AGGRON], + CANDICE: [Species.SNEASEL, Species.SNOVER, Species.SNORUNT], + VOLKNER: [Species.SHINX, Species.CHINCHOU, Species.ROTOM], + // Gym Leaders- Unova + CILAN: [Species.PANSAGE, Species.FOONGUS, Species.PETILIL], + CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.NUMEL], + CRESS: [Species.PANPOUR, Species.TYMPOLE, Species.SLOWPOKE], + CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PIDOVE], + LENORA: [Species.PATRAT, Species.DEERLING, Species.AUDINO], + ROXIE: [Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI], + BURGH: [Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST], + ELESA: [Species.EMOLGA, Species.BLITZLE, Species.JOLTIK], + CLAY: [Species.DRILBUR, Species.SANDILE, Species.GOLETT], + SKYLA: [Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET], + BRYCEN: [Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO], + DRAYDEN: [Species.DRUDDIGON, Species.AXEW, Species.DEINO], + MARLON: [Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA], + // Gym Leaders- Kalos + VIOLA: [Species.SURSKIT, Species.SCATTERBUG], + GRANT: [Species.AMAURA, Species.TYRUNT], + KORRINA: [Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO], + RAMOS: [Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT], + CLEMONT: [Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA], + VALERIE: [Species.SYLVEON, Species.MAWILE, Species.MR_MIME], + OLYMPIA: [Species.ESPURR, Species.SIGILYPH, Species.SLOWKING], + WULFRIC: [Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL], + // Gym Leaders- Galar + MILO: [Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET], + NESSA: [Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD], + KABU: [Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL], + BEA: [Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS], + ALLISTER: [Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY], + OPAL: [Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING], + BEDE: [Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR], + GORDIE: [Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE], + MELONY: [Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME], + PIERS: [Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY], + MARNIE: [Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO], + RAIHAN: [Species.DURALUDON, Species.TURTONATOR, Species.GOOMY], + // Gym Leaders- Paldea; First slot is Tera + KATY: [Species.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA], // Tera Bug Teddiursa + BRASSIUS: [Species.SUDOWOODO, Species.BRAMBLIN, Species.SMOLIV], // Tera Grass Sudowoodo + IONO: [Species.MISDREAVUS, Species.TADBULB, Species.WATTREL], // Tera Ghost Misdreavus + KOFU: [Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL], // Tera Water Crabrawler + LARRY: [Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA], // Tera Normal Starly + RYME: [Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU], // Tera Ghost Toxel + TULIP: [Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG], // Tera Psychic Flabebe + GRUSHA: [Species.SWABLU, Species.CETODDLE, Species.CUBCHOO, Species.ALOLA_VULPIX], // Tera Ice Swablu + + // Elite Four- Kanto + LORELEI: [ + Species.JYNX, + [Species.SLOWBRO, Species.GALAR_SLOWBRO], + Species.LAPRAS, + [Species.CLOYSTER, Species.ALOLA_SANDSLASH], + ], + BRUNO: [Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [Species.GOLEM, Species.ALOLA_GOLEM]], + AGATHA: [Species.GENGAR, [Species.ARBOK, Species.WEEZING], Species.CROBAT, Species.ALOLA_MAROWAK], + LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR], + // Elite Four- Johto (Bruno included) + WILL: [Species.XATU, Species.JYNX, [Species.SLOWBRO, Species.SLOWKING], Species.EXEGGUTOR], + KOGA: [[Species.MUK, Species.WEEZING], [Species.VENOMOTH, Species.ARIADOS], Species.CROBAT, Species.TENTACRUEL], + KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE], + // Elite Four- Hoenn + SIDNEY: [ + [Species.SHIFTRY, Species.CACTURNE], + [Species.SHARPEDO, Species.CRAWDAUNT], + Species.ABSOL, + Species.MIGHTYENA, + ], + PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [Species.DRIFBLIM, Species.MISMAGIUS]], + GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW], + DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA], + // Elite Four- Sinnoh + AARON: [[Species.SCIZOR, Species.KLEAVOR], Species.HERACROSS, [Species.VESPIQUEN, Species.YANMEGA], Species.DRAPION], + BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR], + FLINT: [ + [Species.RAPIDASH, Species.FLAREON], + Species.MAGMORTAR, + [Species.STEELIX, Species.LOPUNNY], + Species.INFERNAPE, + ], // Tera Fire Steelix or Lopunny + LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [Species.ALAKAZAM, Species.ESPEON]], + // Elite Four- Unova + SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT], + MARSHAL: [Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK], + GRIMSLEY: [Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE], + CAITLIN: [Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS], + // Elite Four- Kalos + MALVA: [Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME], + SIEBOLD: [Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE], + WIKSTROM: [Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH], + DRASNA: [Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN], + // Elite Four- Alola + HALA: [Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, [Species.POLIWRATH, Species.ANNIHILAPE]], + MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO], + OLIVIA: [Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC], + ACEROLA: [[Species.BANETTE, Species.DRIFBLIM], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND], + KAHILI: [[Species.BRAVIARY, Species.MANDIBUZZ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON], + // Elite Four- Galar + MARNIE_ELITE: [Species.MORPEKO, Species.LIEPARD, [Species.TOXICROAK, Species.SCRAFTY], Species.GRIMMSNARL], + NESSA_ELITE: [Species.GOLISOPOD, [Species.QUAGSIRE, Species.PELIPPER], Species.TOXAPEX, Species.DREDNAW], + BEA_ELITE: [Species.HAWLUCHA, [Species.GRAPPLOCT, Species.SIRFETCHD], Species.FALINKS, Species.MACHAMP], + ALLISTER_ELITE: [Species.DUSKNOIR, [Species.POLTEAGEIST, Species.RUNERIGUS], Species.CURSOLA, Species.GENGAR], + RAIHAN_ELITE: [Species.GOODRA, [Species.TORKOAL, Species.TURTONATOR], Species.FLYGON, Species.ARCHALUDON], + // Elite Four- Paldea + RIKA: [Species.CLODSIRE, [Species.DUGTRIO, Species.DONPHAN], Species.CAMERUPT, Species.WHISCASH], // Tera Ground Clodsire + POPPY: [Species.TINKATON, Species.BRONZONG, Species.CORVIKNIGHT, Species.COPPERAJAH], // Tera Steel Tinkaton + LARRY_ELITE: [Species.FLAMIGO, Species.STARAPTOR, [Species.ALTARIA, Species.TROPIUS], Species.ORICORIO], // Tera Flying Flamigo; random Oricorio + HASSEL: [Species.BAXCALIBUR, [Species.FLAPPLE, Species.APPLETUN], Species.DRAGALGE, Species.NOIVERN], // Tera Dragon Baxcalibur + // Elite Four- BBL + CRISPIN: [Species.BLAZIKEN, Species.MAGMORTAR, [Species.CAMERUPT, Species.TALONFLAME], Species.ROTOM], // Tera Fire Blaziken; Heat Rotom + AMARYS: [Species.METAGROSS, Species.SCIZOR, Species.EMPOLEON, Species.SKARMORY], // Tera Steel Metagross + LACEY: [Species.EXCADRILL, Species.PRIMARINA, [Species.WHIMSICOTT, Species.ALCREMIE], Species.GRANBULL], // Tera Fairy Excadrill + DRAYTON: [Species.ARCHALUDON, Species.DRAGONITE, Species.HAXORUS, Species.SCEPTILE], // Tera Dragon Archaludon +}; 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 cd266dfcf54..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, @@ -497,7 +480,7 @@ export const speciesEggTiers = { [Species.DREEPY]: EggTier.RARE, [Species.ZACIAN]: EggTier.LEGENDARY, [Species.ZAMAZENTA]: EggTier.LEGENDARY, - [Species.ETERNATUS]: EggTier.COMMON, + [Species.ETERNATUS]: EggTier.LEGENDARY, [Species.KUBFU]: EggTier.EPIC, [Species.ZARUDE]: EggTier.EPIC, [Species.REGIELEKI]: EggTier.EPIC, @@ -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..3468163c988 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,13 +47,11 @@ 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, - [Species.CLEFAIRY]: 3, [Species.VULPIX]: 3, - [Species.JIGGLYPUFF]: 2, [Species.ZUBAT]: 3, [Species.ODDISH]: 3, [Species.PARAS]: 2, @@ -84,22 +82,15 @@ export const speciesStarterCosts = { [Species.VOLTORB]: 2, [Species.EXEGGCUTE]: 3, [Species.CUBONE]: 3, - [Species.HITMONLEE]: 4, - [Species.HITMONCHAN]: 4, [Species.LICKITUNG]: 3, [Species.KOFFING]: 2, - [Species.RHYHORN]: 3, - [Species.CHANSEY]: 3, + [Species.RHYHORN]: 4, [Species.TANGELA]: 3, [Species.KANGASKHAN]: 4, [Species.HORSEA]: 3, [Species.GOLDEEN]: 2, [Species.STARYU]: 3, - [Species.MR_MIME]: 3, [Species.SCYTHER]: 5, - [Species.JYNX]: 4, - [Species.ELECTABUZZ]: 4, - [Species.MAGMAR]: 4, [Species.PINSIR]: 4, [Species.TAUROS]: 4, [Species.MAGIKARP]: 4, @@ -110,13 +101,12 @@ export const speciesStarterCosts = { [Species.OMANYTE]: 3, [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,23 +116,20 @@ 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, [Species.NATU]: 2, [Species.MAREEP]: 2, - [Species.MARILL]: 4, - [Species.SUDOWOODO]: 3, [Species.HOPPIP]: 2, [Species.AIPOM]: 2, [Species.SUNKERN]: 1, [Species.YANMA]: 3, [Species.WOOPER]: 2, [Species.MURKROW]: 3, - [Species.MISDREAVUS]: 2, + [Species.MISDREAVUS]: 3, [Species.UNOWN]: 1, - [Species.WOBBUFFET]: 2, [Species.GIRAFARIG]: 3, [Species.PINECO]: 2, [Species.DUNSPARCE]: 3, @@ -158,7 +145,6 @@ export const speciesStarterCosts = { [Species.CORSOLA]: 2, [Species.REMORAID]: 2, [Species.DELIBIRD]: 2, - [Species.MANTINE]: 3, [Species.SKARMORY]: 4, [Species.HOUNDOUR]: 3, [Species.PHANPY]: 3, @@ -175,7 +161,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 +173,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 +184,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, @@ -206,7 +192,6 @@ export const speciesStarterCosts = { [Species.MINUN]: 2, [Species.VOLBEAT]: 2, [Species.ILLUMISE]: 2, - [Species.ROSELIA]: 3, [Species.GULPIN]: 1, [Species.CARVANHA]: 3, [Species.WAILMER]: 2, @@ -232,7 +217,6 @@ export const speciesStarterCosts = { [Species.SHUPPET]: 2, [Species.DUSKULL]: 3, [Species.TROPIUS]: 3, - [Species.CHIMECHO]: 3, [Species.ABSOL]: 4, [Species.WYNAUT]: 2, [Species.SNORUNT]: 2, @@ -243,7 +227,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, @@ -261,7 +245,7 @@ export const speciesStarterCosts = { [Species.KRICKETOT]: 1, [Species.SHINX]: 2, [Species.BUDEW]: 3, - [Species.CRANIDOS]: 3, + [Species.CRANIDOS]: 2, [Species.SHIELDON]: 3, [Species.BURMY]: 2, [Species.COMBEE]: 2, @@ -290,13 +274,13 @@ export const speciesStarterCosts = { [Species.FINNEON]: 1, [Species.MANTYKE]: 2, [Species.SNOVER]: 2, - [Species.ROTOM]: 5, - [Species.UXIE]: 6, - [Species.MESPRIT]: 6, + [Species.ROTOM]: 4, + [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, @@ -306,7 +290,7 @@ export const speciesStarterCosts = { [Species.SHAYMIN]: 6, [Species.ARCEUS]: 9, - [Species.VICTINI]: 7, + [Species.VICTINI]: 6, [Species.SNIVY]: 3, [Species.TEPIG]: 3, [Species.OSHAWOTT]: 3, @@ -351,7 +335,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 +394,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 +409,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 +448,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.MARSHADOW]: 8, + [Species.POIPOLE]: 8, [Species.STAKATAKA]: 6, [Species.BLACEPHALON]: 7, [Species.ZERAORA]: 6, @@ -532,31 +516,30 @@ 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_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 +578,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 +589,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.TERAPAGOS]: 8, + [Species.IRON_CROWN]: 7, + [Species.TERAPAGOS]: 9, [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/balance/tms.ts b/src/data/balance/tms.ts index 1a509637e05..788ffd4f273 100644 --- a/src/data/balance/tms.ts +++ b/src/data/balance/tms.ts @@ -3,7 +3,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; interface TmSpecies { - [key: integer]: Array> + [key: number]: Array> } export const reverseCompatibleTms: Moves[] = [];/*[ @@ -3302,11 +3302,23 @@ export const tmSpecies: TmSpecies = { Species.FERALIGATR, Species.SENTRET, Species.FURRET, + Species.HOOTHOOT, Species.NOCTOWL, + Species.LEDYBA, + Species.LEDIAN, + Species.SPINARAK, + Species.ARIADOS, Species.CROBAT, Species.CHINCHOU, Species.LANTURN, + Species.PICHU, + Species.CLEFFA, Species.IGGLYBUFF, + Species.TYROGUE, + Species.TOGEPI, + Species.TOGETIC, + Species.NATU, + Species.XATU, Species.MAREEP, Species.FLAAFFY, Species.AMPHAROS, @@ -3328,6 +3340,7 @@ export const tmSpecies: TmSpecies = { Species.UMBREON, Species.MURKROW, Species.SLOWKING, + Species.MISDREAVUS, Species.GIRAFARIG, Species.PINECO, Species.FORRETRESS, @@ -3338,11 +3351,21 @@ export const tmSpecies: TmSpecies = { Species.GRANBULL, Species.QWILFISH, Species.SCIZOR, + Species.SHUCKLE, Species.HERACROSS, + Species.SNEASEL, Species.TEDDIURSA, Species.URSARING, + Species.SLUGMA, + Species.MAGCARGO, Species.SWINUB, Species.PILOSWINE, + Species.CORSOLA, + Species.REMORAID, + Species.OCTILLERY, + Species.DELIBIRD, + Species.MANTINE, + Species.SKARMORY, Species.HOUNDOUR, Species.HOUNDOOM, Species.KINGDRA, @@ -3350,9 +3373,12 @@ export const tmSpecies: TmSpecies = { Species.DONPHAN, Species.PORYGON2, Species.STANTLER, + Species.TYROGUE, Species.HITMONTOP, + Species.SMOOCHUM, Species.ELEKID, Species.MAGBY, + Species.MILTANK, Species.BLISSEY, Species.RAIKOU, Species.ENTEI, @@ -3362,6 +3388,9 @@ export const tmSpecies: TmSpecies = { Species.TYRANITAR, Species.LUGIA, Species.HO_OH, + Species.CELEBI, + Species.TREECKO, + Species.GROVYLE, Species.SCEPTILE, Species.TORCHIC, Species.COMBUSKEN, @@ -3371,41 +3400,116 @@ export const tmSpecies: TmSpecies = { Species.SWAMPERT, Species.POOCHYENA, Species.MIGHTYENA, + Species.ZIGZAGOON, + Species.LINOONE, + Species.BEAUTIFLY, + Species.DUSTOX, Species.LOTAD, Species.LOMBRE, Species.LUDICOLO, Species.SEEDOT, Species.NUZLEAF, Species.SHIFTRY, + Species.TAILLOW, + Species.SWELLOW, + Species.WINGULL, + Species.PELIPPER, + Species.RALTS, + Species.KIRLIA, + Species.GARDEVOIR, + Species.SURSKIT, + Species.MASQUERAIN, + Species.SHROOMISH, + Species.BRELOOM, Species.VIGOROTH, Species.SLAKING, + Species.NINCADA, + Species.NINJASK, + Species.SHEDINJA, + Species.WHISMUR, + Species.LOUDRED, + Species.EXPLOUD, Species.MAKUHITA, Species.HARIYAMA, + Species.AZURILL, Species.NOSEPASS, + Species.SKITTY, + Species.DELCATTY, + Species.SABLEYE, + Species.MAWILE, + Species.ARON, + Species.LAIRON, + Species.AGGRON, + Species.MEDITITE, + Species.MEDICHAM, + Species.ELECTRIKE, + Species.MANECTRIC, + Species.PLUSLE, + Species.MINUN, Species.VOLBEAT, Species.ILLUMISE, + Species.ROSELIA, + Species.GULPIN, Species.SWALOT, + Species.CARVANHA, + Species.SHARPEDO, + Species.WAILMER, + Species.WAILORD, Species.NUMEL, Species.CAMERUPT, Species.TORKOAL, + Species.SPOINK, + Species.GRUMPIG, + Species.SPINDA, + Species.TRAPINCH, + Species.VIBRAVA, Species.FLYGON, + Species.CACNEA, + Species.CACTURNE, + Species.SWABLU, Species.ALTARIA, Species.ZANGOOSE, Species.SEVIPER, + Species.LUNATONE, + Species.SOLROCK, Species.BARBOACH, Species.WHISCASH, Species.CORPHISH, Species.CRAWDAUNT, + Species.BALTOY, + Species.CLAYDOL, + Species.LILEEP, + Species.CRADILY, + Species.ANORITH, + Species.ARMALDO, Species.FEEBAS, Species.MILOTIC, + Species.CASTFORM, + Species.KECLEON, + Species.SHUPPET, + Species.BANETTE, + Species.DUSKULL, + Species.DUSCLOPS, Species.TROPIUS, Species.CHIMECHO, + Species.ABSOL, + Species.SNORUNT, + Species.GLALIE, + Species.SPHEAL, + Species.SEALEO, + Species.WALREIN, + Species.CLAMPERL, + Species.HUNTAIL, + Species.GOREBYSS, + Species.RELICANTH, + Species.LUVDISC, Species.BAGON, Species.SHELGON, Species.SALAMENCE, Species.METANG, Species.METAGROSS, Species.REGIROCK, + Species.REGICE, Species.REGISTEEL, Species.LATIAS, Species.LATIOS, @@ -3413,6 +3517,7 @@ export const tmSpecies: TmSpecies = { Species.GROUDON, Species.RAYQUAZA, Species.JIRACHI, + Species.DEOXYS, Species.TURTWIG, Species.GROTLE, Species.TORTERRA, @@ -12318,6 +12423,7 @@ export const tmSpecies: TmSpecies = { Species.TURTWIG, Species.GROTLE, Species.TORTERRA, + Species.BASTIODON, Species.CHINGLING, Species.BRONZOR, Species.BRONZONG, @@ -12325,6 +12431,7 @@ export const tmSpecies: TmSpecies = { Species.WEAVILE, Species.MAGNEZONE, Species.TANGROWTH, + Species.ELECTIVIRE, Species.TOGEKISS, Species.MAMOSWINE, Species.GALLADE, @@ -12357,6 +12464,8 @@ export const tmSpecies: TmSpecies = { Species.CRYOGONAL, Species.MIENFOO, Species.MIENSHAO, + Species.GOLETT, + Species.GOLURK, Species.HYDREIGON, Species.COBALION, Species.TERRAKION, @@ -40233,6 +40342,1065 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZORUA, Species.HISUI_ZOROARK, ], + [Moves.SECRET_POWER]: [ + Species.BULBASAUR, + Species.IVYSAUR, + Species.VENUSAUR, + Species.CHARMANDER, + Species.CHARMELEON, + Species.CHARIZARD, + Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, + Species.BUTTERFREE, + Species.BEEDRILL, + Species.PIDGEY, + Species.PIDGEOTTO, + Species.PIDGEOT, + Species.RATTATA, + Species.RATICATE, + Species.SPEAROW, + Species.FEAROW, + Species.EKANS, + Species.ARBOK, + Species.PIKACHU, + Species.RAICHU, + Species.SANDSHREW, + Species.SANDSLASH, + Species.NIDORAN_F, + Species.NIDORINA, + Species.NIDOQUEEN, + Species.NIDORAN_M, + Species.NIDORINO, + Species.NIDOKING, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.VULPIX, + Species.NINETALES, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.ZUBAT, + Species.GOLBAT, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, + Species.PARAS, + Species.PARASECT, + Species.VENONAT, + Species.VENOMOTH, + Species.DIGLETT, + Species.DUGTRIO, + Species.MEOWTH, + Species.PERSIAN, + Species.PSYDUCK, + Species.GOLDUCK, + Species.MANKEY, + Species.PRIMEAPE, + Species.GROWLITHE, + Species.ARCANINE, + Species.POLIWAG, + Species.POLIWHIRL, + Species.POLIWRATH, + Species.ABRA, + Species.KADABRA, + Species.ALAKAZAM, + Species.MACHOP, + Species.MACHOKE, + Species.MACHAMP, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, + Species.TENTACOOL, + Species.TENTACRUEL, + Species.GEODUDE, + Species.GRAVELER, + Species.GOLEM, + Species.PONYTA, + Species.RAPIDASH, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.MAGNEMITE, + Species.MAGNETON, + Species.FARFETCHD, + Species.DODUO, + Species.DODRIO, + Species.SEEL, + Species.DEWGONG, + Species.GRIMER, + Species.MUK, + Species.SHELLDER, + Species.CLOYSTER, + Species.GASTLY, + Species.HAUNTER, + Species.GENGAR, + Species.ONIX, + Species.DROWZEE, + Species.HYPNO, + Species.KRABBY, + Species.KINGLER, + Species.VOLTORB, + Species.ELECTRODE, + Species.EXEGGCUTE, + Species.EXEGGUTOR, + Species.CUBONE, + Species.MAROWAK, + Species.HITMONLEE, + Species.HITMONCHAN, + Species.LICKITUNG, + Species.KOFFING, + Species.WEEZING, + Species.RHYHORN, + Species.RHYDON, + Species.CHANSEY, + Species.TANGELA, + Species.KANGASKHAN, + Species.HORSEA, + Species.SEADRA, + Species.GOLDEEN, + Species.SEAKING, + Species.STARYU, + Species.STARMIE, + Species.MR_MIME, + Species.SCYTHER, + Species.JYNX, + Species.ELECTABUZZ, + Species.MAGMAR, + Species.PINSIR, + Species.TAUROS, + Species.GYARADOS, + Species.LAPRAS, + Species.EEVEE, + Species.VAPOREON, + Species.JOLTEON, + Species.FLAREON, + Species.PORYGON, + Species.OMANYTE, + Species.OMASTAR, + Species.KABUTO, + Species.KABUTOPS, + Species.AERODACTYL, + Species.SNORLAX, + Species.ARTICUNO, + Species.ZAPDOS, + Species.MOLTRES, + Species.DRATINI, + Species.DRAGONAIR, + Species.DRAGONITE, + Species.MEWTWO, + Species.MEW, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.CYNDAQUIL, + Species.QUILAVA, + Species.TYPHLOSION, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.SENTRET, + Species.FURRET, + Species.HOOTHOOT, + Species.NOCTOWL, + Species.LEDYBA, + Species.LEDIAN, + Species.SPINARAK, + Species.ARIADOS, + Species.CROBAT, + Species.CHINCHOU, + Species.LANTURN, + Species.PICHU, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.TOGEPI, + Species.TOGETIC, + Species.NATU, + Species.XATU, + Species.MAREEP, + Species.FLAAFFY, + Species.AMPHAROS, + Species.BELLOSSOM, + Species.MARILL, + Species.AZUMARILL, + Species.SUDOWOODO, + Species.POLITOED, + Species.HOPPIP, + Species.SKIPLOOM, + Species.JUMPLUFF, + Species.AIPOM, + Species.SUNKERN, + Species.SUNFLORA, + Species.YANMA, + Species.WOOPER, + Species.QUAGSIRE, + Species.ESPEON, + Species.UMBREON, + Species.MURKROW, + Species.SLOWKING, + Species.MISDREAVUS, + Species.GIRAFARIG, + Species.PINECO, + Species.FORRETRESS, + Species.DUNSPARCE, + Species.GLIGAR, + Species.STEELIX, + Species.SNUBBULL, + Species.GRANBULL, + Species.QWILFISH, + Species.SCIZOR, + Species.SHUCKLE, + Species.HERACROSS, + Species.SNEASEL, + Species.TEDDIURSA, + Species.URSARING, + Species.SLUGMA, + Species.MAGCARGO, + Species.SWINUB, + Species.PILOSWINE, + Species.CORSOLA, + Species.REMORAID, + Species.OCTILLERY, + Species.DELIBIRD, + Species.MANTINE, + Species.SKARMORY, + Species.HOUNDOUR, + Species.HOUNDOOM, + Species.KINGDRA, + Species.PHANPY, + Species.DONPHAN, + Species.PORYGON2, + Species.STANTLER, + Species.TYROGUE, + Species.HITMONTOP, + Species.SMOOCHUM, + Species.ELEKID, + Species.MAGBY, + Species.MILTANK, + Species.BLISSEY, + Species.RAIKOU, + Species.ENTEI, + Species.SUICUNE, + Species.LARVITAR, + Species.PUPITAR, + Species.TYRANITAR, + Species.LUGIA, + Species.HO_OH, + Species.CELEBI, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, + Species.TORCHIC, + Species.COMBUSKEN, + Species.BLAZIKEN, + Species.MUDKIP, + Species.MARSHTOMP, + Species.SWAMPERT, + Species.POOCHYENA, + Species.MIGHTYENA, + Species.ZIGZAGOON, + Species.LINOONE, + Species.BEAUTIFLY, + Species.DUSTOX, + Species.LOTAD, + Species.LOMBRE, + Species.LUDICOLO, + Species.SEEDOT, + Species.NUZLEAF, + Species.SHIFTRY, + Species.TAILLOW, + Species.SWELLOW, + Species.WINGULL, + Species.PELIPPER, + Species.RALTS, + Species.KIRLIA, + Species.GARDEVOIR, + Species.SURSKIT, + Species.MASQUERAIN, + Species.SHROOMISH, + Species.BRELOOM, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.NINCADA, + Species.NINJASK, + Species.SHEDINJA, + Species.WHISMUR, + Species.LOUDRED, + Species.EXPLOUD, + Species.MAKUHITA, + Species.HARIYAMA, + Species.AZURILL, + Species.NOSEPASS, + Species.SKITTY, + Species.DELCATTY, + Species.SABLEYE, + Species.MAWILE, + Species.ARON, + Species.LAIRON, + Species.AGGRON, + Species.MEDITITE, + Species.MEDICHAM, + Species.ELECTRIKE, + Species.MANECTRIC, + Species.PLUSLE, + Species.MINUN, + Species.VOLBEAT, + Species.ILLUMISE, + Species.ROSELIA, + Species.GULPIN, + Species.SWALOT, + Species.CARVANHA, + Species.SHARPEDO, + Species.WAILMER, + Species.WAILORD, + Species.NUMEL, + Species.CAMERUPT, + Species.TORKOAL, + Species.SPOINK, + Species.GRUMPIG, + Species.SPINDA, + Species.TRAPINCH, + Species.VIBRAVA, + Species.FLYGON, + Species.CACNEA, + Species.CACTURNE, + Species.SWABLU, + Species.ALTARIA, + Species.ZANGOOSE, + Species.SEVIPER, + Species.LUNATONE, + Species.SOLROCK, + Species.BARBOACH, + Species.WHISCASH, + Species.CORPHISH, + Species.CRAWDAUNT, + Species.BALTOY, + Species.CLAYDOL, + Species.LILEEP, + Species.CRADILY, + Species.ANORITH, + Species.ARMALDO, + Species.FEEBAS, + Species.MILOTIC, + Species.CASTFORM, + Species.KECLEON, + Species.SHUPPET, + Species.BANETTE, + Species.DUSKULL, + Species.DUSCLOPS, + Species.TROPIUS, + Species.CHIMECHO, + Species.ABSOL, + Species.SNORUNT, + Species.GLALIE, + Species.SPHEAL, + Species.SEALEO, + Species.WALREIN, + Species.CLAMPERL, + Species.HUNTAIL, + Species.GOREBYSS, + Species.RELICANTH, + Species.LUVDISC, + Species.BAGON, + Species.SHELGON, + Species.SALAMENCE, + Species.METANG, + Species.METAGROSS, + Species.REGIROCK, + Species.REGICE, + Species.REGISTEEL, + Species.LATIAS, + Species.LATIOS, + Species.KYOGRE, + Species.GROUDON, + Species.RAYQUAZA, + Species.JIRACHI, + Species.DEOXYS, + Species.TURTWIG, + Species.GROTLE, + Species.TORTERRA, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.PIPLUP, + Species.PRINPLUP, + Species.EMPOLEON, + Species.STARLY, + Species.STARAVIA, + Species.STARAPTOR, + Species.BIDOOF, + Species.BIBAREL, + Species.KRICKETUNE, + Species.SHINX, + Species.LUXIO, + Species.LUXRAY, + Species.BUDEW, + Species.ROSERADE, + Species.CRANIDOS, + Species.RAMPARDOS, + Species.SHIELDON, + Species.BASTIODON, + Species.WORMADAM, + Species.MOTHIM, + Species.VESPIQUEN, + Species.PACHIRISU, + Species.BUIZEL, + Species.FLOATZEL, + Species.CHERUBI, + Species.CHERRIM, + Species.SHELLOS, + Species.GASTRODON, + Species.AMBIPOM, + Species.DRIFLOON, + Species.DRIFBLIM, + Species.BUNEARY, + Species.LOPUNNY, + Species.MISMAGIUS, + Species.HONCHKROW, + Species.GLAMEOW, + Species.PURUGLY, + Species.CHINGLING, + Species.STUNKY, + Species.SKUNTANK, + Species.BRONZOR, + Species.BRONZONG, + Species.BONSLY, + Species.MIME_JR, + Species.HAPPINY, + Species.CHATOT, + Species.SPIRITOMB, + Species.GIBLE, + Species.GABITE, + Species.GARCHOMP, + Species.MUNCHLAX, + Species.RIOLU, + Species.LUCARIO, + Species.HIPPOPOTAS, + Species.HIPPOWDON, + Species.SKORUPI, + Species.DRAPION, + Species.CROAGUNK, + Species.TOXICROAK, + Species.CARNIVINE, + Species.FINNEON, + Species.LUMINEON, + Species.MANTYKE, + Species.SNOVER, + Species.ABOMASNOW, + Species.WEAVILE, + Species.MAGNEZONE, + Species.LICKILICKY, + Species.RHYPERIOR, + Species.TANGROWTH, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.TOGEKISS, + Species.YANMEGA, + Species.LEAFEON, + Species.GLACEON, + Species.GLISCOR, + Species.MAMOSWINE, + Species.PORYGON_Z, + Species.GALLADE, + Species.PROBOPASS, + Species.DUSKNOIR, + Species.FROSLASS, + Species.ROTOM, + Species.UXIE, + Species.MESPRIT, + Species.AZELF, + Species.DIALGA, + Species.PALKIA, + Species.HEATRAN, + Species.REGIGIGAS, + Species.GIRATINA, + Species.CRESSELIA, + Species.PHIONE, + Species.MANAPHY, + Species.DARKRAI, + Species.SHAYMIN, + Species.ARCEUS, + Species.VICTINI, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, + Species.OSHAWOTT, + Species.DEWOTT, + Species.SAMUROTT, + Species.PATRAT, + Species.WATCHOG, + Species.LILLIPUP, + Species.HERDIER, + Species.STOUTLAND, + Species.PURRLOIN, + Species.LIEPARD, + Species.PANSAGE, + Species.SIMISAGE, + Species.PANSEAR, + Species.SIMISEAR, + Species.PANPOUR, + Species.SIMIPOUR, + Species.MUNNA, + Species.MUSHARNA, + Species.PIDOVE, + Species.TRANQUILL, + Species.UNFEZANT, + Species.BLITZLE, + Species.ZEBSTRIKA, + Species.ROGGENROLA, + Species.BOLDORE, + Species.GIGALITH, + Species.WOOBAT, + Species.SWOOBAT, + Species.DRILBUR, + Species.EXCADRILL, + Species.AUDINO, + Species.TIMBURR, + Species.GURDURR, + Species.CONKELDURR, + Species.TYMPOLE, + Species.PALPITOAD, + Species.SEISMITOAD, + Species.THROH, + Species.SAWK, + Species.SEWADDLE, + Species.SWADLOON, + Species.LEAVANNY, + Species.VENIPEDE, + Species.WHIRLIPEDE, + Species.SCOLIPEDE, + Species.COTTONEE, + Species.WHIMSICOTT, + Species.PETILIL, + Species.LILLIGANT, + Species.BASCULIN, + Species.SANDILE, + Species.KROKOROK, + Species.KROOKODILE, + Species.DARUMAKA, + Species.DARMANITAN, + Species.MARACTUS, + Species.DWEBBLE, + Species.CRUSTLE, + Species.SCRAGGY, + Species.SCRAFTY, + Species.SIGILYPH, + Species.YAMASK, + Species.COFAGRIGUS, + Species.TIRTOUGA, + Species.CARRACOSTA, + Species.ARCHEN, + Species.ARCHEOPS, + Species.TRUBBISH, + Species.GARBODOR, + Species.ZORUA, + Species.ZOROARK, + Species.MINCCINO, + Species.CINCCINO, + Species.GOTHITA, + Species.GOTHORITA, + Species.GOTHITELLE, + Species.SOLOSIS, + Species.DUOSION, + Species.REUNICLUS, + Species.DUCKLETT, + Species.SWANNA, + Species.VANILLITE, + Species.VANILLISH, + Species.VANILLUXE, + Species.DEERLING, + Species.SAWSBUCK, + Species.EMOLGA, + Species.KARRABLAST, + Species.ESCAVALIER, + Species.FOONGUS, + Species.AMOONGUSS, + Species.FRILLISH, + Species.JELLICENT, + Species.ALOMOMOLA, + Species.JOLTIK, + Species.GALVANTULA, + Species.FERROSEED, + Species.FERROTHORN, + Species.KLINK, + Species.KLANG, + Species.KLINKLANG, + Species.EELEKTRIK, + Species.EELEKTROSS, + Species.ELGYEM, + Species.BEHEEYEM, + Species.LITWICK, + Species.LAMPENT, + Species.CHANDELURE, + Species.AXEW, + Species.FRAXURE, + Species.HAXORUS, + Species.CUBCHOO, + Species.BEARTIC, + Species.CRYOGONAL, + Species.SHELMET, + Species.ACCELGOR, + Species.STUNFISK, + Species.MIENFOO, + Species.MIENSHAO, + Species.DRUDDIGON, + Species.GOLETT, + Species.GOLURK, + Species.PAWNIARD, + Species.BISHARP, + Species.BOUFFALANT, + Species.RUFFLET, + Species.BRAVIARY, + Species.VULLABY, + Species.MANDIBUZZ, + Species.HEATMOR, + Species.DURANT, + Species.DEINO, + Species.ZWEILOUS, + Species.HYDREIGON, + Species.LARVESTA, + Species.VOLCARONA, + Species.COBALION, + Species.TERRAKION, + Species.VIRIZION, + Species.TORNADUS, + Species.THUNDURUS, + Species.RESHIRAM, + Species.ZEKROM, + Species.LANDORUS, + Species.KYUREM, + Species.KELDEO, + Species.MELOETTA, + Species.GENESECT, + Species.CHESPIN, + Species.QUILLADIN, + Species.CHESNAUGHT, + Species.FENNEKIN, + Species.BRAIXEN, + Species.DELPHOX, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.BUNNELBY, + Species.DIGGERSBY, + Species.FLETCHLING, + Species.FLETCHINDER, + Species.TALONFLAME, + Species.VIVILLON, + Species.LITLEO, + Species.PYROAR, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.SKIDDO, + Species.GOGOAT, + Species.PANCHAM, + Species.PANGORO, + Species.FURFROU, + Species.ESPURR, + Species.MEOWSTIC, + Species.HONEDGE, + Species.DOUBLADE, + Species.AEGISLASH, + Species.SPRITZEE, + Species.AROMATISSE, + Species.SWIRLIX, + Species.SLURPUFF, + Species.INKAY, + Species.MALAMAR, + Species.BINACLE, + Species.BARBARACLE, + Species.SKRELP, + Species.DRAGALGE, + Species.CLAUNCHER, + Species.CLAWITZER, + Species.HELIOPTILE, + Species.HELIOLISK, + Species.TYRUNT, + Species.TYRANTRUM, + Species.AMAURA, + Species.AURORUS, + Species.SYLVEON, + Species.HAWLUCHA, + Species.DEDENNE, + Species.CARBINK, + Species.GOOMY, + Species.SLIGGOO, + Species.GOODRA, + Species.KLEFKI, + Species.PHANTUMP, + Species.TREVENANT, + Species.PUMPKABOO, + Species.GOURGEIST, + Species.BERGMITE, + Species.AVALUGG, + Species.NOIBAT, + Species.NOIVERN, + Species.XERNEAS, + Species.YVELTAL, + Species.ZYGARDE, + Species.DIANCIE, + Species.HOOPA, + Species.VOLCANION, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.LITTEN, + Species.TORRACAT, + Species.INCINEROAR, + Species.POPPLIO, + Species.BRIONNE, + Species.PRIMARINA, + Species.PIKIPEK, + Species.TRUMBEAK, + Species.TOUCANNON, + Species.YUNGOOS, + Species.GUMSHOOS, + Species.GRUBBIN, + Species.CHARJABUG, + Species.VIKAVOLT, + Species.CRABRAWLER, + Species.CRABOMINABLE, + Species.ORICORIO, + Species.CUTIEFLY, + Species.RIBOMBEE, + Species.ROCKRUFF, + Species.LYCANROC, + Species.WISHIWASHI, + Species.MAREANIE, + Species.TOXAPEX, + Species.MUDBRAY, + Species.MUDSDALE, + Species.DEWPIDER, + Species.ARAQUANID, + Species.FOMANTIS, + Species.LURANTIS, + Species.MORELULL, + Species.SHIINOTIC, + Species.SALANDIT, + Species.SALAZZLE, + Species.STUFFUL, + Species.BEWEAR, + Species.BOUNSWEET, + Species.STEENEE, + Species.TSAREENA, + Species.COMFEY, + Species.ORANGURU, + Species.PASSIMIAN, + Species.WIMPOD, + Species.GOLISOPOD, + Species.SANDYGAST, + Species.PALOSSAND, + Species.TYPE_NULL, + Species.SILVALLY, + Species.MINIOR, + Species.KOMALA, + Species.TURTONATOR, + Species.TOGEDEMARU, + Species.MIMIKYU, + Species.BRUXISH, + Species.DRAMPA, + Species.DHELMISE, + Species.JANGMO_O, + Species.HAKAMO_O, + Species.KOMMO_O, + Species.TAPU_KOKO, + Species.TAPU_LELE, + Species.TAPU_BULU, + Species.TAPU_FINI, + Species.SOLGALEO, + Species.LUNALA, + Species.NIHILEGO, + Species.BUZZWOLE, + Species.PHEROMOSA, + Species.XURKITREE, + Species.CELESTEELA, + Species.KARTANA, + Species.GUZZLORD, + Species.NECROZMA, + Species.MAGEARNA, + Species.MARSHADOW, + Species.POIPOLE, + Species.NAGANADEL, + Species.STAKATAKA, + Species.BLACEPHALON, + Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, + Species.ALOLA_RATTATA, + Species.ALOLA_RATICATE, + Species.ALOLA_RAICHU, + Species.ALOLA_SANDSHREW, + Species.ALOLA_SANDSLASH, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.ALOLA_DIGLETT, + Species.ALOLA_DUGTRIO, + Species.ALOLA_MEOWTH, + Species.ALOLA_PERSIAN, + Species.ALOLA_GEODUDE, + Species.ALOLA_GRAVELER, + Species.ALOLA_GOLEM, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + Species.ALOLA_EXEGGUTOR, + Species.ALOLA_MAROWAK, + Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, + ], [Moves.DIVE]: [ Species.SQUIRTLE, Species.WARTORTLE, @@ -59529,26 +60697,6 @@ export const tmSpecies: TmSpecies = { Species.HISUI_SAMUROTT, Species.PALDEA_TAUROS, ], - [Moves.SACRED_SWORD]: [ - Species.GALLADE, - Species.OSHAWOTT, - Species.DEWOTT, - Species.SAMUROTT, - Species.COBALION, - Species.TERRAKION, - Species.VIRIZION, - Species.KELDEO, - Species.HONEDGE, - Species.DOUBLADE, - Species.AEGISLASH, - Species.KARTANA, - Species.ZACIAN, - Species.CHIEN_PAO, - Species.IRON_LEAVES, - Species.IRON_BOULDER, - Species.IRON_CROWN, - Species.HISUI_SAMUROTT, - ], [Moves.RAZOR_SHELL]: [ Species.SLOWBRO, Species.SHELLDER, @@ -63203,12 +64351,16 @@ export const tmSpecies: TmSpecies = { Species.BLOODMOON_URSALUNA, ], [Moves.LIQUIDATION]: [ + Species.SQUIRTLE, + Species.WARTORTLE, Species.BLASTOISE, Species.PSYDUCK, Species.GOLDUCK, Species.POLIWAG, Species.POLIWHIRL, Species.POLIWRATH, + Species.TENTACOOL, + Species.TENTACRUEL, Species.SLOWPOKE, Species.SLOWBRO, Species.DEWGONG, @@ -63224,7 +64376,11 @@ export const tmSpecies: TmSpecies = { Species.KABUTO, Species.KABUTOPS, Species.MEW, + Species.TOTODILE, + Species.CROCONAW, Species.FERALIGATR, + Species.CHINCHOU, + Species.LANTURN, Species.MARILL, Species.AZUMARILL, Species.POLITOED, @@ -63237,6 +64393,9 @@ export const tmSpecies: TmSpecies = { Species.MANTINE, Species.KINGDRA, Species.SUICUNE, + Species.LUGIA, + Species.MUDKIP, + Species.MARSHTOMP, Species.SWAMPERT, Species.WINGULL, Species.PELIPPER, @@ -63253,6 +64412,8 @@ export const tmSpecies: TmSpecies = { Species.WALREIN, Species.RELICANTH, Species.LUVDISC, + Species.LATIAS, + Species.LATIOS, Species.KYOGRE, Species.PIPLUP, Species.PRINPLUP, @@ -63364,11 +64525,13 @@ export const tmSpecies: TmSpecies = { Species.ONIX, Species.HYPNO, Species.LICKITUNG, + Species.RHYHORN, Species.RHYDON, Species.LAPRAS, Species.SNORLAX, Species.DRAGONITE, Species.MEW, + Species.MEGANIUM, Species.SUDOWOODO, Species.QUAGSIRE, Species.FORRETRESS, @@ -63402,6 +64565,8 @@ export const tmSpecies: TmSpecies = { Species.REGISTEEL, Species.GROUDON, Species.TORTERRA, + Species.RAMPARDOS, + Species.BASTIODON, Species.BRONZONG, Species.HIPPOPOTAS, Species.HIPPOWDON, @@ -63416,6 +64581,7 @@ export const tmSpecies: TmSpecies = { Species.HEATRAN, Species.REGIGIGAS, Species.ARCEUS, + Species.EMBOAR, Species.ROGGENROLA, Species.BOLDORE, Species.GIGALITH, @@ -63428,6 +64594,7 @@ export const tmSpecies: TmSpecies = { Species.CUBCHOO, Species.BEARTIC, Species.GOLURK, + Species.COBALION, Species.RESHIRAM, Species.ZEKROM, Species.KYUREM, @@ -65981,6 +67148,7 @@ export const tmSpecies: TmSpecies = { Species.VELUZA, Species.DONDOZO, Species.TATSUGIRI, + Species.ANNIHILAPE, Species.CLODSIRE, Species.FARIGIRAF, Species.DUDUNSPARCE, @@ -67265,8 +68433,48 @@ export const tmSpecies: TmSpecies = { ], }; +interface SpeciesTmMoves { + [key: number]: (Moves | [string | Species, Moves])[]; +} + +function transposeTmSpecies(): SpeciesTmMoves { + const flipped: SpeciesTmMoves = {}; + + for (const move in tmSpecies) { + const moveKey = Number(move); + const speciesList = tmSpecies[move]; + + for (const species of speciesList) { + + if (Array.isArray(species)) { + // Extract base species and all associated forms + const [ baseSpecies, ...forms ] = species; + const speciesKey = Number(baseSpecies); + + if (!flipped[speciesKey]) { + flipped[speciesKey] = []; + } + + for (const form of forms) { + flipped[speciesKey].push([ form, moveKey ]); + } + + } else { + const speciesKey = Number(species); + if (!flipped[speciesKey]) { + flipped[speciesKey] = []; + } + flipped[speciesKey].push(moveKey); + } + } + } + return flipped; +} + +export const speciesTmMoves: SpeciesTmMoves = transposeTmSpecies(); + interface TmPoolTiers { - [key: integer]: ModifierTier + [key: number]: ModifierTier } export const tmPoolTiers: TmPoolTiers = { @@ -67389,6 +68597,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ENDEAVOR]: ModifierTier.COMMON, [Moves.SKILL_SWAP]: ModifierTier.COMMON, [Moves.IMPRISON]: ModifierTier.COMMON, + [Moves.SECRET_POWER]: ModifierTier.COMMON, [Moves.DIVE]: ModifierTier.GREAT, [Moves.FEATHER_DANCE]: ModifierTier.COMMON, [Moves.BLAZE_KICK]: ModifierTier.GREAT, @@ -67517,7 +68726,6 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ELECTROWEB]: ModifierTier.GREAT, [Moves.WILD_CHARGE]: ModifierTier.GREAT, [Moves.DRILL_RUN]: ModifierTier.GREAT, - [Moves.SACRED_SWORD]: ModifierTier.ULTRA, [Moves.RAZOR_SHELL]: ModifierTier.GREAT, [Moves.HEAT_CRASH]: ModifierTier.GREAT, [Moves.TAIL_SLAP]: ModifierTier.GREAT, diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 37900a3ab5a..86060ef4bfc 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -1,121 +1,122 @@ -//import { battleAnimRawData } from "./battle-anim-raw-data"; -import BattleScene from "../battle-scene"; -import { AttackMove, BeakBlastHeaderAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move"; -import Pokemon from "../field/pokemon"; -import * as Utils from "../utils"; -import { BattlerIndex } from "../battle"; -import { Element } from "json-stable-stringify"; +import { globalScene } from "#app/global-scene"; +import { AttackMove, BeakBlastHeaderAttr, DelayedAttackAttr, SelfStatusMove, allMoves } from "./moves/move"; +import { MoveFlags } from "#enums/MoveFlags"; +import type Pokemon from "../field/pokemon"; +import { type nil, getFrameMs, getEnumKeys, getEnumValues, animationFileName } from "../utils"; +import type { BattlerIndex } from "../battle"; +import type { Element } from "json-stable-stringify"; import { Moves } from "#enums/moves"; import { SubstituteTag } from "./battler-tags"; import { isNullOrUndefined } from "../utils"; import Phaser from "phaser"; import { EncounterAnim } from "#enums/encounter-anims"; -//import fs from 'vite-plugin-fs/browser'; export enum AnimFrameTarget { - USER, - TARGET, - GRAPHIC + USER, + TARGET, + GRAPHIC, } enum AnimFocus { - TARGET = 1, - USER, - USER_TARGET, - SCREEN + TARGET = 1, + USER, + USER_TARGET, + SCREEN, } enum AnimBlendType { - NORMAL, - ADD, - SUBTRACT + NORMAL, + ADD, + SUBTRACT, } export enum ChargeAnim { - FLY_CHARGING = 1000, - BOUNCE_CHARGING, - DIG_CHARGING, - FUTURE_SIGHT_CHARGING, - DIVE_CHARGING, - SOLAR_BEAM_CHARGING, - SHADOW_FORCE_CHARGING, - SKULL_BASH_CHARGING, - FREEZE_SHOCK_CHARGING, - SKY_DROP_CHARGING, - SKY_ATTACK_CHARGING, - ICE_BURN_CHARGING, - DOOM_DESIRE_CHARGING, - RAZOR_WIND_CHARGING, - PHANTOM_FORCE_CHARGING, - GEOMANCY_CHARGING, - SHADOW_BLADE_CHARGING, - SOLAR_BLADE_CHARGING, - BEAK_BLAST_CHARGING, - METEOR_BEAM_CHARGING, - ELECTRO_SHOT_CHARGING + FLY_CHARGING = 1000, + BOUNCE_CHARGING, + DIG_CHARGING, + FUTURE_SIGHT_CHARGING, + DIVE_CHARGING, + SOLAR_BEAM_CHARGING, + SHADOW_FORCE_CHARGING, + SKULL_BASH_CHARGING, + FREEZE_SHOCK_CHARGING, + SKY_DROP_CHARGING, + SKY_ATTACK_CHARGING, + ICE_BURN_CHARGING, + DOOM_DESIRE_CHARGING, + RAZOR_WIND_CHARGING, + PHANTOM_FORCE_CHARGING, + GEOMANCY_CHARGING, + SHADOW_BLADE_CHARGING, + SOLAR_BLADE_CHARGING, + BEAK_BLAST_CHARGING, + METEOR_BEAM_CHARGING, + ELECTRO_SHOT_CHARGING, } export enum CommonAnim { - USE_ITEM = 2000, - HEALTH_UP, - POISON = 2010, - TOXIC, - PARALYSIS, - SLEEP, - FROZEN, - BURN, - CONFUSION, - ATTRACT, - BIND, - WRAP, - CURSE_NO_GHOST, - LEECH_SEED, - FIRE_SPIN, - PROTECT, - COVET, - WHIRLPOOL, - BIDE, - SAND_TOMB, - QUICK_GUARD, - WIDE_GUARD, - CURSE, - MAGMA_STORM, - CLAMP, - SNAP_TRAP, - THUNDER_CAGE, - INFESTATION, - ORDER_UP_CURLY, - ORDER_UP_DROOPY, - ORDER_UP_STRETCHY, - RAGING_BULL_FIRE, - RAGING_BULL_WATER, - SALT_CURE, - SUNNY = 2100, - RAIN, - SANDSTORM, - HAIL, - SNOW, - WIND, - HEAVY_RAIN, - HARSH_SUN, - STRONG_WINDS, - MISTY_TERRAIN = 2110, - ELECTRIC_TERRAIN, - GRASSY_TERRAIN, - PSYCHIC_TERRAIN, - LOCK_ON = 2120 + USE_ITEM = 2000, + HEALTH_UP, + TERASTALLIZE, + POISON = 2010, + TOXIC, + PARALYSIS, + SLEEP, + FROZEN, + BURN, + CONFUSION, + ATTRACT, + BIND, + WRAP, + CURSE_NO_GHOST, + LEECH_SEED, + FIRE_SPIN, + PROTECT, + COVET, + WHIRLPOOL, + BIDE, + SAND_TOMB, + QUICK_GUARD, + WIDE_GUARD, + CURSE, + MAGMA_STORM, + CLAMP, + SNAP_TRAP, + THUNDER_CAGE, + INFESTATION, + ORDER_UP_CURLY, + ORDER_UP_DROOPY, + ORDER_UP_STRETCHY, + RAGING_BULL_FIRE, + RAGING_BULL_WATER, + SALT_CURE, + POWDER, + SUNNY = 2100, + RAIN, + SANDSTORM, + HAIL, + SNOW, + WIND, + HEAVY_RAIN, + HARSH_SUN, + STRONG_WINDS, + MISTY_TERRAIN = 2110, + ELECTRIC_TERRAIN, + GRASSY_TERRAIN, + PSYCHIC_TERRAIN, + LOCK_ON = 2120, } export class AnimConfig { - public id: integer; + public id: number; public graphic: string; public frames: AnimFrame[][]; - public frameTimedEvents: Map; - public position: integer; - public hue: integer; + public frameTimedEvents: Map; + public position: number; + public hue: number; constructor(source?: any) { - this.frameTimedEvents = new Map; + this.frameTimedEvents = new Map(); if (source) { this.id = source.id; @@ -147,7 +148,7 @@ export class AnimConfig { timedEvent && timedEvents.push(timedEvent); } - this.frameTimedEvents.set(parseInt(fte), timedEvents); + this.frameTimedEvents.set(Number.parseInt(fte), timedEvents); } this.position = source.position; @@ -196,18 +197,43 @@ class AnimFrame { public visible: boolean; public blendType: AnimBlendType; public target: AnimFrameTarget; - public graphicFrame: integer; - public opacity: integer; - public color: integer[]; - public tone: integer[]; - public flash: integer[]; + public graphicFrame: number; + public opacity: number; + public color: number[]; + public tone: number[]; + public flash: number[]; public locked: boolean; - public priority: integer; + public priority: number; public focus: AnimFocus; - constructor(x: number, y: number, zoomX: number, zoomY: number, angle: number, mirror: boolean, visible: boolean, blendType: AnimBlendType, pattern: integer, - opacity: integer, colorR: integer, colorG: integer, colorB: integer, colorA: integer, toneR: integer, toneG: integer, toneB: integer, toneA: integer, - flashR: integer, flashG: integer, flashB: integer, flashA: integer, locked: boolean, priority: integer, focus: AnimFocus, init?: boolean) { + constructor( + x: number, + y: number, + zoomX: number, + zoomY: number, + angle: number, + mirror: boolean, + visible: boolean, + blendType: AnimBlendType, + pattern: number, + opacity: number, + colorR: number, + colorG: number, + colorB: number, + colorA: number, + toneR: number, + toneG: number, + toneB: number, + toneA: number, + flashR: number, + flashG: number, + flashB: number, + flashA: number, + locked: boolean, + priority: number, + focus: AnimFocus, + init?: boolean, + ) { this.x = !init ? ((x || 0) - 128) * 0.5 : x; this.y = !init ? ((y || 0) - 224) * 0.5 : y; if (zoomX) { @@ -259,19 +285,19 @@ class AnimFrame { this.opacity = 0; } if (colorR || colorG || colorB || colorA) { - this.color = [ colorR || 0, colorG || 0, colorB || 0, colorA || 0 ]; + this.color = [colorR || 0, colorG || 0, colorB || 0, colorA || 0]; } else if (init) { - this.color = [ 0, 0, 0, 0 ]; + this.color = [0, 0, 0, 0]; } if (toneR || toneG || toneB || toneA) { - this.tone = [ toneR || 0, toneG || 0, toneB || 0, toneA || 0 ]; + this.tone = [toneR || 0, toneG || 0, toneB || 0, toneA || 0]; } else if (init) { - this.tone = [ 0, 0, 0, 0 ]; + this.tone = [0, 0, 0, 0]; } if (flashR || flashG || flashB || flashA) { - this.flash = [ flashR || 0, flashG || 0, flashB || 0, flashA || 0 ]; + this.flash = [flashR || 0, flashG || 0, flashB || 0, flashA || 0]; } else if (init) { - this.flash = [ 0, 0, 0, 0 ]; + this.flash = [0, 0, 0, 0]; } if (locked) { this.locked = locked; @@ -289,34 +315,61 @@ class AnimFrame { class ImportedAnimFrame extends AnimFrame { constructor(source: any) { - const color: integer[] = source.color || [ 0, 0, 0, 0 ]; - const tone: integer[] = source.tone || [ 0, 0, 0, 0 ]; - const flash: integer[] = source.flash || [ 0, 0, 0, 0 ]; - super(source.x, source.y, source.zoomX, source.zoomY, source.angle, source.mirror, source.visible, source.blendType, source.graphicFrame, source.opacity, color[0], color[1], color[2], color[3], tone[0], tone[1], tone[2], tone[3], flash[0], flash[1], flash[2], flash[3], source.locked, source.priority, source.focus, true); + const color: number[] = source.color || [0, 0, 0, 0]; + const tone: number[] = source.tone || [0, 0, 0, 0]; + const flash: number[] = source.flash || [0, 0, 0, 0]; + super( + source.x, + source.y, + source.zoomX, + source.zoomY, + source.angle, + source.mirror, + source.visible, + source.blendType, + source.graphicFrame, + source.opacity, + color[0], + color[1], + color[2], + color[3], + tone[0], + tone[1], + tone[2], + tone[3], + flash[0], + flash[1], + flash[2], + flash[3], + source.locked, + source.priority, + source.focus, + true, + ); this.target = source.target; this.graphicFrame = source.graphicFrame; } } abstract class AnimTimedEvent { - public frameIndex: integer; + public frameIndex: number; public resourceName: string; - constructor(frameIndex: integer, resourceName: string) { + constructor(frameIndex: number, resourceName: string) { this.frameIndex = frameIndex; this.resourceName = resourceName; } - abstract execute(scene: BattleScene, battleAnim: BattleAnim, priority?: number): integer; + abstract execute(battleAnim: BattleAnim, priority?: number): number; - abstract getEventType(): string; + abstract getEventType(): string; } class AnimTimedSoundEvent extends AnimTimedEvent { - public volume: number = 100; - public pitch: number = 100; + public volume = 100; + public pitch = 100; - constructor(frameIndex: integer, resourceName: string, source?: any) { + constructor(frameIndex: number, resourceName: string, source?: any) { super(frameIndex, resourceName); if (source) { @@ -325,18 +378,17 @@ class AnimTimedSoundEvent extends AnimTimedEvent { } } - execute(scene: BattleScene, battleAnim: BattleAnim, priority?: number): integer { - const soundConfig = { rate: (this.pitch * 0.01), volume: (this.volume * 0.01) }; + execute(battleAnim: BattleAnim): number { + const soundConfig = { rate: this.pitch * 0.01, volume: this.volume * 0.01 }; if (this.resourceName) { try { - scene.playSound(`battle_anims/${this.resourceName}`, soundConfig); + globalScene.playSound(`battle_anims/${this.resourceName}`, soundConfig); } catch (err) { console.error(err); } - return Math.ceil((scene.sound.get(`battle_anims/${this.resourceName}`).totalDuration * 1000) / 33.33); - } else { - return Math.ceil((battleAnim.user!.cry(soundConfig).totalDuration * 1000) / 33.33); // TODO: is the bang behind user correct? + return Math.ceil((globalScene.sound.get(`battle_anims/${this.resourceName}`).totalDuration * 1000) / 33.33); } + return Math.ceil((battleAnim.user!.cry(soundConfig).totalDuration * 1000) / 33.33); // TODO: is the bang behind user correct? } getEventType(): string { @@ -345,22 +397,22 @@ class AnimTimedSoundEvent extends AnimTimedEvent { } abstract class AnimTimedBgEvent extends AnimTimedEvent { - public bgX: number = 0; - public bgY: number = 0; - public opacity: integer = 0; - /*public colorRed: integer = 0; - public colorGreen: integer = 0; - public colorBlue: integer = 0; - public colorAlpha: integer = 0;*/ - public duration: integer = 0; - /*public flashScope: integer = 0; - public flashRed: integer = 0; - public flashGreen: integer = 0; - public flashBlue: integer = 0; - public flashAlpha: integer = 0; - public flashDuration: integer = 0;*/ + public bgX = 0; + public bgY = 0; + public opacity = 0; + /*public colorRed: number = 0; + public colorGreen: number = 0; + public colorBlue: number = 0; + public colorAlpha: number = 0;*/ + public duration = 0; + /*public flashScope: number = 0; + public flashRed: number = 0; + public flashGreen: number = 0; + public flashBlue: number = 0; + public flashAlpha: number = 0; + public flashDuration: number = 0;*/ - constructor(frameIndex: integer, resourceName: string, source: any) { + constructor(frameIndex: number, resourceName: string, source?: any) { super(frameIndex, resourceName); if (source) { @@ -383,26 +435,28 @@ abstract class AnimTimedBgEvent extends AnimTimedEvent { } class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { - constructor(frameIndex: integer, resourceName: string, source?: any) { - super(frameIndex, resourceName, source); - } - - execute(scene: BattleScene, moveAnim: MoveAnim, priority?: number): integer { + // biome-ignore lint/correctness/noUnusedVariables: seems intentional + execute(moveAnim: MoveAnim, priority?: number): number { const tweenProps = {}; if (this.bgX !== undefined) { - tweenProps["x"] = (this.bgX * 0.5) - 320; + tweenProps["x"] = this.bgX * 0.5 - 320; } if (this.bgY !== undefined) { - tweenProps["y"] = (this.bgY * 0.5) - 284; + tweenProps["y"] = this.bgY * 0.5 - 284; } if (this.opacity !== undefined) { tweenProps["alpha"] = (this.opacity || 0) / 255; } if (Object.keys(tweenProps).length) { - scene.tweens.add(Object.assign({ - targets: moveAnim.bgSprite, - duration: Utils.getFrameMs(this.duration * 3) - }, tweenProps)); + globalScene.tweens.add( + Object.assign( + { + targets: moveAnim.bgSprite, + duration: getFrameMs(this.duration * 3), + }, + tweenProps, + ), + ); } return this.duration * 2; } @@ -413,31 +467,27 @@ class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { } class AnimTimedAddBgEvent extends AnimTimedBgEvent { - constructor(frameIndex: integer, resourceName: string, source?: any) { - super(frameIndex, resourceName, source); - } - - execute(scene: BattleScene, moveAnim: MoveAnim, priority?: number): integer { + execute(moveAnim: MoveAnim, priority?: number): number { if (moveAnim.bgSprite) { moveAnim.bgSprite.destroy(); } moveAnim.bgSprite = this.resourceName - ? scene.add.tileSprite(this.bgX - 320, this.bgY - 284, 896, 576, this.resourceName) - : scene.add.rectangle(this.bgX - 320, this.bgY - 284, 896, 576, 0); + ? globalScene.add.tileSprite(this.bgX - 320, this.bgY - 284, 896, 576, this.resourceName) + : globalScene.add.rectangle(this.bgX - 320, this.bgY - 284, 896, 576, 0); moveAnim.bgSprite.setOrigin(0, 0); moveAnim.bgSprite.setScale(1.25); moveAnim.bgSprite.setAlpha(this.opacity / 255); - scene.field.add(moveAnim.bgSprite); - const fieldPokemon = scene.getNonSwitchedEnemyPokemon() || scene.getNonSwitchedPlayerPokemon(); + globalScene.field.add(moveAnim.bgSprite); + const fieldPokemon = globalScene.getEnemyPokemon(false) ?? globalScene.getPlayerPokemon(false); if (!isNullOrUndefined(priority)) { - scene.field.moveTo(moveAnim.bgSprite as Phaser.GameObjects.GameObject, priority); + globalScene.field.moveTo(moveAnim.bgSprite as Phaser.GameObjects.GameObject, priority); } else if (fieldPokemon?.isOnField()) { - scene.field.moveBelow(moveAnim.bgSprite as Phaser.GameObjects.GameObject, fieldPokemon); + globalScene.field.moveBelow(moveAnim.bgSprite as Phaser.GameObjects.GameObject, fieldPokemon); } - scene.tweens.add({ + globalScene.tweens.add({ targets: moveAnim.bgSprite, - duration: Utils.getFrameMs(this.duration * 3) + duration: getFrameMs(this.duration * 3), }); return this.duration * 2; @@ -453,22 +503,25 @@ export const chargeAnims = new Map(); export const encounterAnims = new Map(); -export function initCommonAnims(scene: BattleScene): Promise { +export function initCommonAnims(): Promise { return new Promise(resolve => { - const commonAnimNames = Utils.getEnumKeys(CommonAnim); - const commonAnimIds = Utils.getEnumValues(CommonAnim); + const commonAnimNames = getEnumKeys(CommonAnim); + const commonAnimIds = getEnumValues(CommonAnim); const commonAnimFetches: Promise>[] = []; for (let ca = 0; ca < commonAnimIds.length; ca++) { const commonAnimId = commonAnimIds[ca]; - commonAnimFetches.push(scene.cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, "-")}.json`) - .then(response => response.json()) - .then(cas => commonAnims.set(commonAnimId, new AnimConfig(cas)))); + commonAnimFetches.push( + globalScene + .cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, "-")}.json`) + .then(response => response.json()) + .then(cas => commonAnims.set(commonAnimId, new AnimConfig(cas))), + ); } Promise.allSettled(commonAnimFetches).then(() => resolve()); }); } -export function initMoveAnim(scene: BattleScene, move: Moves): Promise { +export function initMoveAnim(move: Moves): Promise { return new Promise(resolve => { if (moveAnims.has(move)) { if (moveAnims.get(move) !== null) { @@ -476,10 +529,9 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { } else { const loadedCheckTimer = setInterval(() => { if (moveAnims.get(move) !== null) { - const chargeAnimSource = (allMoves[move].isChargingMove()) + const chargeAnimSource = allMoves[move].isChargingMove() ? allMoves[move] - : (allMoves[move].getAttrs(DelayedAttackAttr)[0] - ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); + : (allMoves[move].getAttrs(DelayedAttackAttr)[0] ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); if (chargeAnimSource && chargeAnims.get(chargeAnimSource.chargeAnim) === null) { return; } @@ -490,10 +542,16 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { } } else { moveAnims.set(move, null); - const defaultMoveAnim = allMoves[move] instanceof AttackMove ? Moves.TACKLE : allMoves[move] instanceof SelfStatusMove ? Moves.FOCUS_ENERGY : Moves.TAIL_WHIP; + const defaultMoveAnim = + allMoves[move] instanceof AttackMove + ? Moves.TACKLE + : allMoves[move] instanceof SelfStatusMove + ? Moves.FOCUS_ENERGY + : Moves.TAIL_WHIP; const fetchAnimAndResolve = (move: Moves) => { - scene.cachedFetch(`./battle-anims/${Utils.animationFileName(move)}.json`) + globalScene + .cachedFetch(`./battle-anims/${animationFileName(move)}.json`) .then(response => { const contentType = response.headers.get("content-type"); if (!response.ok || contentType?.indexOf("application/json") === -1) { @@ -510,12 +568,11 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { } else { populateMoveAnim(move, ba); } - const chargeAnimSource = (allMoves[move].isChargingMove()) + const chargeAnimSource = allMoves[move].isChargingMove() ? allMoves[move] - : (allMoves[move].getAttrs(DelayedAttackAttr)[0] - ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); + : (allMoves[move].getAttrs(DelayedAttackAttr)[0] ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); if (chargeAnimSource) { - initMoveChargeAnim(scene, chargeAnimSource.chargeAnim).then(() => resolve()); + initMoveChargeAnim(chargeAnimSource.chargeAnim).then(() => resolve()); } else { resolve(); } @@ -550,31 +607,33 @@ function useDefaultAnim(move: Moves, defaultMoveAnim: Moves) { * @remarks use {@linkcode useDefaultAnim} to use a default animation */ function logMissingMoveAnim(move: Moves, ...optionalParams: any[]) { - const moveName = Utils.animationFileName(move); + const moveName = animationFileName(move); console.warn(`Could not load animation file for move '${moveName}'`, ...optionalParams); } /** * Fetches animation configs to be used in a Mystery Encounter - * @param scene * @param encounterAnim one or more animations to fetch */ -export async function initEncounterAnims(scene: BattleScene, encounterAnim: EncounterAnim | EncounterAnim[]): Promise { - const anims = Array.isArray(encounterAnim) ? encounterAnim : [ encounterAnim ]; - const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); +export async function initEncounterAnims(encounterAnim: EncounterAnim | EncounterAnim[]): Promise { + const anims = Array.isArray(encounterAnim) ? encounterAnim : [encounterAnim]; + const encounterAnimNames = getEnumKeys(EncounterAnim); const encounterAnimFetches: Promise>[] = []; for (const anim of anims) { if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { continue; } - encounterAnimFetches.push(scene.cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) - .then(response => response.json()) - .then(cas => encounterAnims.set(anim, new AnimConfig(cas)))); + encounterAnimFetches.push( + globalScene + .cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) + .then(response => response.json()) + .then(cas => encounterAnims.set(anim, new AnimConfig(cas))), + ); } await Promise.allSettled(encounterAnimFetches); } -export function initMoveChargeAnim(scene: BattleScene, chargeAnim: ChargeAnim): Promise { +export function initMoveChargeAnim(chargeAnim: ChargeAnim): Promise { return new Promise(resolve => { if (chargeAnims.has(chargeAnim)) { if (chargeAnims.get(chargeAnim) !== null) { @@ -589,7 +648,8 @@ export function initMoveChargeAnim(scene: BattleScene, chargeAnim: ChargeAnim): } } else { chargeAnims.set(chargeAnim, null); - scene.cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/\_/g, "-")}.json`) + globalScene + .cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/\_/g, "-")}.json`) .then(response => response.json()) .then(ca => { if (Array.isArray(ca)) { @@ -610,7 +670,7 @@ function populateMoveAnim(move: Moves, animSource: any): void { moveAnims.set(move, moveAnim); return; } - moveAnims.set(move, [ moveAnims.get(move) as AnimConfig, moveAnim ]); + moveAnims.set(move, [moveAnims.get(move) as AnimConfig, moveAnim]); } function populateMoveChargeAnim(chargeAnim: ChargeAnim, animSource: any) { @@ -619,33 +679,31 @@ function populateMoveChargeAnim(chargeAnim: ChargeAnim, animSource: any) { chargeAnims.set(chargeAnim, moveChargeAnim); return; } - chargeAnims.set(chargeAnim, [ chargeAnims.get(chargeAnim) as AnimConfig, moveChargeAnim ]); + chargeAnims.set(chargeAnim, [chargeAnims.get(chargeAnim) as AnimConfig, moveChargeAnim]); } -export function loadCommonAnimAssets(scene: BattleScene, startLoad?: boolean): Promise { +export function loadCommonAnimAssets(startLoad?: boolean): Promise { return new Promise(resolve => { - loadAnimAssets(scene, Array.from(commonAnims.values()), startLoad).then(() => resolve()); + loadAnimAssets(Array.from(commonAnims.values()), startLoad).then(() => resolve()); }); } /** * Loads encounter animation assets to scene * MUST be called after {@linkcode initEncounterAnims()} to load all required animations properly - * @param scene * @param startLoad */ -export async function loadEncounterAnimAssets(scene: BattleScene, startLoad?: boolean): Promise { - await loadAnimAssets(scene, Array.from(encounterAnims.values()), startLoad); +export async function loadEncounterAnimAssets(startLoad?: boolean): Promise { + await loadAnimAssets(Array.from(encounterAnims.values()), startLoad); } -export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLoad?: boolean): Promise { +export function loadMoveAnimAssets(moveIds: Moves[], startLoad?: boolean): Promise { return new Promise(resolve => { - const moveAnimations = moveIds.map(m => moveAnims.get(m) as AnimConfig).flat(); + const moveAnimations = moveIds.flatMap(m => moveAnims.get(m) as AnimConfig); for (const moveId of moveIds) { - const chargeAnimSource = (allMoves[moveId].isChargingMove()) + const chargeAnimSource = allMoves[moveId].isChargingMove() ? allMoves[moveId] - : (allMoves[moveId].getAttrs(DelayedAttackAttr)[0] - ?? allMoves[moveId].getAttrs(BeakBlastHeaderAttr)[0]); + : (allMoves[moveId].getAttrs(DelayedAttackAttr)[0] ?? allMoves[moveId].getAttrs(BeakBlastHeaderAttr)[0]); if (chargeAnimSource) { const moveChargeAnims = chargeAnims.get(chargeAnimSource.chargeAnim); moveAnimations.push(moveChargeAnims instanceof AnimConfig ? moveChargeAnims : moveChargeAnims![0]); // TODO: is the bang correct? @@ -654,11 +712,11 @@ export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLo } } } - loadAnimAssets(scene, moveAnimations, startLoad).then(() => resolve()); + loadAnimAssets(moveAnimations, startLoad).then(() => resolve()); }); } -function loadAnimAssets(scene: BattleScene, anims: AnimConfig[], startLoad?: boolean): Promise { +function loadAnimAssets(anims: AnimConfig[], startLoad?: boolean): Promise { return new Promise(resolve => { const backgrounds = new Set(); const sounds = new Set(); @@ -675,19 +733,19 @@ function loadAnimAssets(scene: BattleScene, anims: AnimConfig[], startLoad?: boo backgrounds.add(abg); } if (a.graphic) { - scene.loadSpritesheet(a.graphic, "battle_anims", 96); + globalScene.loadSpritesheet(a.graphic, "battle_anims", 96); } } for (const bg of backgrounds) { - scene.loadImage(bg, "battle_anims"); + globalScene.loadImage(bg, "battle_anims"); } for (const s of sounds) { - scene.loadSe(s, "battle_anims", s); + globalScene.loadSe(s, "battle_anims", s); } if (startLoad) { - scene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); - if (!scene.load.isLoading()) { - scene.load.start(); + globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); + if (!globalScene.load.isLoading()) { + globalScene.load.start(); } } else { resolve(); @@ -696,11 +754,11 @@ function loadAnimAssets(scene: BattleScene, anims: AnimConfig[], startLoad?: boo } interface GraphicFrameData { - x: number, - y: number, - scaleX: number, - scaleY: number, - angle: number + x: number; + y: number; + scaleX: number; + scaleY: number; + angle: number; } const userFocusX = 106; @@ -708,25 +766,43 @@ const userFocusY = 148 - 32; const targetFocusX = 234; const targetFocusY = 84 - 32; -function transformPoint(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number, px: number, py: number): [ x: number, y: number ] { +function transformPoint( + x1: number, + y1: number, + x2: number, + y2: number, + x3: number, + y3: number, + x4: number, + y4: number, + px: number, + py: number, +): [x: number, y: number] { const yIntersect = yAxisIntersect(x1, y1, x2, y2, px, py); return repositionY(x3, y3, x4, y4, yIntersect[0], yIntersect[1]); } -function yAxisIntersect(x1: number, y1: number, x2: number, y2: number, px: number, py: number): [ x: number, y: number ] { +function yAxisIntersect( + x1: number, + y1: number, + x2: number, + y2: number, + px: number, + py: number, +): [x: number, y: number] { const dx = x2 - x1; const dy = y2 - y1; const x = dx === 0 ? 0 : (px - x1) / dx; const y = dy === 0 ? 0 : (py - y1) / dy; - return [ x, y ]; + return [x, y]; } -function repositionY(x1: number, y1: number, x2: number, y2: number, tx: number, ty: number): [ x: number, y: number ] { +function repositionY(x1: number, y1: number, x2: number, y2: number, tx: number, ty: number): [x: number, y: number] { const dx = x2 - x1; const dy = y2 - y1; - const x = x1 + (tx * dx); - const y = y1 + (ty * dy); - return [ x, y ]; + const x = x1 + tx * dx; + const y = y1 + ty * dy; + return [x, y]; } function isReversed(src1: number, src2: number, dst1: number, dst2: number) { @@ -740,7 +816,7 @@ function isReversed(src1: number, src2: number, dst1: number, dst2: number) { } interface SpriteCache { - [key: integer]: Phaser.GameObjects.Sprite[] + [key: number]: Phaser.GameObjects.Sprite[]; } export abstract class BattleAnim { @@ -758,518 +834,590 @@ export abstract class BattleAnim { private srcLine: number[]; private dstLine: number[]; - constructor(user?: Pokemon, target?: Pokemon, playRegardlessOfIssues: boolean = false) { + constructor(user?: Pokemon, target?: Pokemon, playRegardlessOfIssues = false) { this.user = user ?? null; this.target = target ?? null; this.sprites = []; this.playRegardlessOfIssues = playRegardlessOfIssues; } - abstract getAnim(): AnimConfig | null; + abstract getAnim(): AnimConfig | null; - abstract isOppAnim(): boolean; + abstract isOppAnim(): boolean; - protected isHideUser(): boolean { - return false; - } + protected isHideUser(): boolean { + return false; + } - protected isHideTarget(): boolean { - return false; - } + protected isHideTarget(): boolean { + return false; + } - private getGraphicFrameData(scene: BattleScene, frames: AnimFrame[], onSubstitute?: boolean): Map> { - const ret: Map> = new Map([ - [ AnimFrameTarget.GRAPHIC, new Map() ], - [ AnimFrameTarget.USER, new Map() ], - [ AnimFrameTarget.TARGET, new Map() ] - ]); + private getGraphicFrameData( + frames: AnimFrame[], + onSubstitute?: boolean, + ): Map> { + const ret: Map> = new Map([ + [AnimFrameTarget.GRAPHIC, new Map()], + [AnimFrameTarget.USER, new Map()], + [AnimFrameTarget.TARGET, new Map()], + ]); - const isOppAnim = this.isOppAnim(); - const user = !isOppAnim ? this.user : this.target; - const target = !isOppAnim ? this.target : this.user; + const isOppAnim = this.isOppAnim(); + const user = !isOppAnim ? this.user : this.target; + const target = !isOppAnim ? this.target : this.user; - const targetSubstitute = (onSubstitute && user !== target) ? target!.getTag(SubstituteTag) : null; + const targetSubstitute = onSubstitute && user !== target ? target!.getTag(SubstituteTag) : null; - const userInitialX = user!.x; // TODO: is this bang correct? - const userInitialY = user!.y; // TODO: is this bang correct? - const userHalfHeight = user!.getSprite().displayHeight! / 2; // TODO: is this bang correct? + const userInitialX = user!.x; // TODO: is this bang correct? + const userInitialY = user!.y; // TODO: is this bang correct? + const userHalfHeight = user!.getSprite().displayHeight! / 2; // TODO: is this bang correct? - const targetInitialX = targetSubstitute?.sprite?.x ?? target!.x; // TODO: is this bang correct? - const targetInitialY = targetSubstitute?.sprite?.y ?? target!.y; // TODO: is this bang correct? - const targetHalfHeight = (targetSubstitute?.sprite ?? target!.getSprite()).displayHeight! / 2; // TODO: is this bang correct? + const targetInitialX = targetSubstitute?.sprite?.x ?? target!.x; // TODO: is this bang correct? + const targetInitialY = targetSubstitute?.sprite?.y ?? target!.y; // TODO: is this bang correct? + const targetHalfHeight = (targetSubstitute?.sprite ?? target!.getSprite()).displayHeight! / 2; // TODO: is this bang correct? - let g = 0; - let u = 0; - let t = 0; + let g = 0; + let u = 0; + let t = 0; - for (const frame of frames) { - let x = frame.x + 106; - let y = frame.y + 116; - let scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); - const scaleY = (frame.zoomY / 100); - switch (frame.focus) { - case AnimFocus.TARGET: - x += targetInitialX - targetFocusX; - y += (targetInitialY - targetHalfHeight) - targetFocusY; - break; - case AnimFocus.USER: - x += userInitialX - userFocusX; - y += (userInitialY - userHalfHeight) - userFocusY; - break; - case AnimFocus.USER_TARGET: - const point = transformPoint(this.srcLine[0], this.srcLine[1], this.srcLine[2], this.srcLine[3], - this.dstLine[0], this.dstLine[1] - userHalfHeight, this.dstLine[2], this.dstLine[3] - targetHalfHeight, x, y); + for (const frame of frames) { + let x = frame.x + 106; + let y = frame.y + 116; + let scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); + const scaleY = frame.zoomY / 100; + switch (frame.focus) { + case AnimFocus.TARGET: + x += targetInitialX - targetFocusX; + y += targetInitialY - targetHalfHeight - targetFocusY; + break; + case AnimFocus.USER: + x += userInitialX - userFocusX; + y += userInitialY - userHalfHeight - userFocusY; + break; + case AnimFocus.USER_TARGET: + { + const point = transformPoint( + this.srcLine[0], + this.srcLine[1], + this.srcLine[2], + this.srcLine[3], + this.dstLine[0], + this.dstLine[1] - userHalfHeight, + this.dstLine[2], + this.dstLine[3] - targetHalfHeight, + x, + y, + ); x = point[0]; y = point[1]; - if (frame.target === AnimFrameTarget.GRAPHIC && isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2])) { + if ( + frame.target === AnimFrameTarget.GRAPHIC && + isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2]) + ) { scaleX = scaleX * -1; } - break; - } - const angle = -frame.angle; - const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; - ret.get(frame.target)!.set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); // TODO: is the bang correct? + } + break; } - - return ret; + const angle = -frame.angle; + const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; + ret.get(frame.target)!.set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); // TODO: is the bang correct? } - play(scene: BattleScene, onSubstitute?: boolean, callback?: Function) { - const isOppAnim = this.isOppAnim(); - const user = !isOppAnim ? this.user! : this.target!; // TODO: are those bangs correct? - const target = !isOppAnim ? this.target! : this.user!; + return ret; + } - if (!target?.isOnField() && !this.playRegardlessOfIssues) { - if (callback) { - callback(); - } - return; + // biome-ignore lint/complexity/noBannedTypes: callback is used liberally + play(onSubstitute?: boolean, callback?: Function) { + const isOppAnim = this.isOppAnim(); + const user = !isOppAnim ? this.user! : this.target!; // TODO: are those bangs correct? + const target = !isOppAnim ? this.target! : this.user!; + + if (!target?.isOnField() && !this.playRegardlessOfIssues) { + if (callback) { + callback(); } - - const targetSubstitute = (!!onSubstitute && user !== target) ? target.getTag(SubstituteTag) : null; - - const userSprite = user.getSprite(); - const targetSprite = targetSubstitute?.sprite ?? target.getSprite(); - - const spriteCache: SpriteCache = { - [AnimFrameTarget.GRAPHIC]: [], - [AnimFrameTarget.USER]: [], - [AnimFrameTarget.TARGET]: [] - }; - const spritePriorities: integer[] = []; - - const cleanUpAndComplete = () => { - userSprite.setPosition(0, 0); - userSprite.setScale(1); - userSprite.setAlpha(1); - userSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ]; - userSprite.setAngle(0); - if (!targetSubstitute) { - targetSprite.setPosition(0, 0); - targetSprite.setScale(1); - targetSprite.setAlpha(1); - } else { - targetSprite.setPosition( - target.x - target.getSubstituteOffset()[0], - target.y - target.getSubstituteOffset()[1] - ); - targetSprite.setScale(target.getSpriteScale() * (target.isPlayer() ? 0.5 : 1)); - targetSprite.setAlpha(1); - } - targetSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ]; - targetSprite.setAngle(0); - - /** - * This and `targetSpriteToShow` are used to restore context lost - * from the `isOppAnim` swap. Using these references instead of `this.user` - * and `this.target` prevent the target's Substitute doll from disappearing - * after being the target of an animation. - */ - const userSpriteToShow = !isOppAnim ? userSprite : targetSprite; - const targetSpriteToShow = !isOppAnim ? targetSprite : userSprite; - if (!this.isHideUser() && userSpriteToShow) { - userSpriteToShow.setVisible(true); - } - if (!this.isHideTarget() && (targetSpriteToShow !== userSpriteToShow || !this.isHideUser())) { - targetSpriteToShow.setVisible(true); - } - for (const ms of Object.values(spriteCache).flat()) { - if (ms) { - ms.destroy(); - } - } - if (this.bgSprite) { - this.bgSprite.destroy(); - } - if (callback) { - callback(); - } - }; - - if (!scene.moveAnimations && !this.playRegardlessOfIssues) { - return cleanUpAndComplete(); - } - - const anim = this.getAnim(); - - const userInitialX = user.x; - const userInitialY = user.y; - const targetInitialX = targetSubstitute?.sprite?.x ?? target.x; - const targetInitialY = targetSubstitute?.sprite?.y ?? target.y; - - this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; - this.dstLine = [ userInitialX, userInitialY, targetInitialX, targetInitialY ]; - - let r = anim?.frames.length ?? 0; - let f = 0; - - scene.tweens.addCounter({ - duration: Utils.getFrameMs(3), - repeat: anim?.frames.length ?? 0, - onRepeat: () => { - if (!f) { - userSprite.setVisible(false); - targetSprite.setVisible(false); - } - - const spriteFrames = anim!.frames[f]; // TODO: is the bang correcT? - const frameData = this.getGraphicFrameData(scene, anim!.frames[f], onSubstitute); // TODO: is the bang correct? - let u = 0; - let t = 0; - let g = 0; - for (const frame of spriteFrames) { - if (frame.target !== AnimFrameTarget.GRAPHIC) { - const isUser = frame.target === AnimFrameTarget.USER; - if (isUser && target === user) { - continue; - } else if (this.playRegardlessOfIssues && frame.target === AnimFrameTarget.TARGET && !target.isOnField()) { - continue; - } - const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET]; - const spriteSource = isUser ? userSprite : targetSprite; - if ((isUser ? u : t) === sprites.length) { - if (isUser || !targetSubstitute) { - const sprite = scene.addPokemonSprite(isUser ? user! : target, 0, 0, spriteSource!.texture, spriteSource!.frame.name, true); // TODO: are those bangs correct? - [ "spriteColors", "fusionSpriteColors" ].map(k => sprite.pipelineData[k] = (isUser ? user! : target).getSprite().pipelineData[k]); // TODO: are those bangs correct? - sprite.setPipelineData("spriteKey", (isUser ? user! : target).getBattleSpriteKey()); - sprite.setPipelineData("shiny", (isUser ? user : target).shiny); - sprite.setPipelineData("variant", (isUser ? user : target).variant); - sprite.setPipelineData("ignoreFieldPos", true); - spriteSource.on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); - scene.field.add(sprite); - sprites.push(sprite); - } else { - const sprite = scene.addFieldSprite(spriteSource.x, spriteSource.y, spriteSource.texture); - spriteSource.on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); - scene.field.add(sprite); - sprites.push(sprite); - } - } - - const spriteIndex = isUser ? u++ : t++; - const pokemonSprite = sprites[spriteIndex]; - const graphicFrameData = frameData.get(frame.target)!.get(spriteIndex)!; // TODO: are the bangs correct? - const spriteSourceScale = (isUser || !targetSubstitute) - ? spriteSource.parentContainer.scale - : target.getSpriteScale() * (target.isPlayer() ? 0.5 : 1); - pokemonSprite.setPosition(graphicFrameData.x, graphicFrameData.y - ((spriteSource.height / 2) * (spriteSourceScale - 1))); - - pokemonSprite.setAngle(graphicFrameData.angle); - pokemonSprite.setScale(graphicFrameData.scaleX * spriteSourceScale, graphicFrameData.scaleY * spriteSourceScale); - - pokemonSprite.setData("locked", frame.locked); - - pokemonSprite.setAlpha(frame.opacity / 255); - pokemonSprite.pipelineData["tone"] = frame.tone; - pokemonSprite.setVisible(frame.visible && (isUser ? user.visible : target.visible)); - pokemonSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); - } else { - const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; - if (g === sprites.length) { - const newSprite: Phaser.GameObjects.Sprite = scene.addFieldSprite(0, 0, anim!.graphic, 1); // TODO: is the bang correct? - sprites.push(newSprite); - scene.field.add(newSprite); - spritePriorities.push(1); - } - - const graphicIndex = g++; - const moveSprite = sprites[graphicIndex]; - if (spritePriorities[graphicIndex] !== frame.priority) { - spritePriorities[graphicIndex] = frame.priority; - const setSpritePriority = (priority: integer) => { - switch (priority) { - case 0: - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, scene.getNonSwitchedEnemyPokemon() || scene.getNonSwitchedPlayerPokemon()!); // This bang assumes that if (the EnemyPokemon is undefined, then the PlayerPokemon function must return an object), correct assumption? - break; - case 1: - scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); - break; - case 2: - switch (frame.focus) { - case AnimFocus.USER: - if (this.bgSprite) { - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.bgSprite); - } else { - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? - } - break; - case AnimFocus.TARGET: - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? - break; - default: - setSpritePriority(1); - break; - } - break; - case 3: - switch (frame.focus) { - case AnimFocus.USER: - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? - break; - case AnimFocus.TARGET: - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? - break; - default: - setSpritePriority(1); - break; - } - break; - default: - setSpritePriority(1); - } - }; - setSpritePriority(frame.priority); - } - moveSprite.setFrame(frame.graphicFrame); - //console.log(AnimFocus[frame.focus]); - - const graphicFrameData = frameData.get(frame.target)!.get(graphicIndex)!; // TODO: are those bangs correct? - moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); - moveSprite.setAngle(graphicFrameData.angle); - moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); - - moveSprite.setAlpha(frame.opacity / 255); - moveSprite.setVisible(frame.visible); - moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); - } - } - if (anim?.frameTimedEvents.has(f)) { - for (const event of anim.frameTimedEvents.get(f)!) { // TODO: is this bang correct? - r = Math.max((anim.frames.length - f) + event.execute(scene, this), r); - } - } - const targets = Utils.getEnumValues(AnimFrameTarget); - for (const i of targets) { - const count = i === AnimFrameTarget.GRAPHIC ? g : i === AnimFrameTarget.USER ? u : t; - if (count < spriteCache[i].length) { - const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); - for (const rs of spritesToRemove) { - if (!rs.getData("locked") as boolean) { - const spriteCacheIndex = spriteCache[i].indexOf(rs); - spriteCache[i].splice(spriteCacheIndex, 1); - if (i === AnimFrameTarget.GRAPHIC) { - spritePriorities.splice(spriteCacheIndex, 1); - } - rs.destroy(); - } - } - } - } - f++; - r--; - }, - onComplete: () => { - for (const ms of Object.values(spriteCache).flat()) { - if (ms && !ms.getData("locked")) { - ms.destroy(); - } - } - if (r) { - scene.tweens.addCounter({ - duration: Utils.getFrameMs(r), - onComplete: () => cleanUpAndComplete() - }); - } else { - cleanUpAndComplete(); - } - } - }); + return; } - private getGraphicFrameDataWithoutTarget(frames: AnimFrame[], targetInitialX: number, targetInitialY: number): Map> { - const ret: Map> = new Map([ - [ AnimFrameTarget.GRAPHIC, new Map() ], - [ AnimFrameTarget.USER, new Map() ], - [ AnimFrameTarget.TARGET, new Map() ] - ]); + const targetSubstitute = !!onSubstitute && user !== target ? target.getTag(SubstituteTag) : null; - let g = 0; - let u = 0; - let t = 0; + const userSprite = user.getSprite(); + const targetSprite = targetSubstitute?.sprite ?? target.getSprite(); - for (const frame of frames) { - let { x, y } = frame; - const scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); - const scaleY = (frame.zoomY / 100); - x += targetInitialX; - y += targetInitialY; - const angle = -frame.angle; - const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; - ret.get(frame.target)?.set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); + const spriteCache: SpriteCache = { + [AnimFrameTarget.GRAPHIC]: [], + [AnimFrameTarget.USER]: [], + [AnimFrameTarget.TARGET]: [], + }; + const spritePriorities: number[] = []; + + const cleanUpAndComplete = () => { + userSprite.setPosition(0, 0); + userSprite.setScale(1); + userSprite.setAlpha(1); + userSprite.pipelineData["tone"] = [0.0, 0.0, 0.0, 0.0]; + userSprite.setAngle(0); + if (!targetSubstitute) { + targetSprite.setPosition(0, 0); + targetSprite.setScale(1); + targetSprite.setAlpha(1); + } else { + targetSprite.setPosition( + target.x - target.getSubstituteOffset()[0], + target.y - target.getSubstituteOffset()[1], + ); + targetSprite.setScale(target.getSpriteScale() * (target.isPlayer() ? 0.5 : 1)); + targetSprite.setAlpha(1); } + targetSprite.pipelineData["tone"] = [0.0, 0.0, 0.0, 0.0]; + targetSprite.setAngle(0); - return ret; + /** + * This and `targetSpriteToShow` are used to restore context lost + * from the `isOppAnim` swap. Using these references instead of `this.user` + * and `this.target` prevent the target's Substitute doll from disappearing + * after being the target of an animation. + */ + const userSpriteToShow = !isOppAnim ? userSprite : targetSprite; + const targetSpriteToShow = !isOppAnim ? targetSprite : userSprite; + if (!this.isHideUser() && userSpriteToShow) { + userSpriteToShow.setVisible(true); + } + if (!this.isHideTarget() && (targetSpriteToShow !== userSpriteToShow || !this.isHideUser())) { + targetSpriteToShow.setVisible(true); + } + for (const ms of Object.values(spriteCache).flat()) { + if (ms) { + ms.destroy(); + } + } + if (this.bgSprite) { + this.bgSprite.destroy(); + } + if (callback) { + callback(); + } + }; + + if (!globalScene.moveAnimations && !this.playRegardlessOfIssues) { + return cleanUpAndComplete(); } - /** - * - * @param scene - * @param targetInitialX - * @param targetInitialY - * @param frameTimeMult - * @param frameTimedEventPriority - * - 0 is behind all other sprites (except BG) - * - 1 on top of player field - * - 3 is on top of both fields - * - 5 is on top of player sprite - * @param callback - */ - playWithoutTargets(scene: BattleScene, targetInitialX: number, targetInitialY: number, frameTimeMult: number, frameTimedEventPriority?: 0 | 1 | 3 | 5, callback?: Function) { - const spriteCache: SpriteCache = { - [AnimFrameTarget.GRAPHIC]: [], - [AnimFrameTarget.USER]: [], - [AnimFrameTarget.TARGET]: [] - }; + const anim = this.getAnim(); - const cleanUpAndComplete = () => { - for (const ms of Object.values(spriteCache).flat()) { - if (ms) { - ms.destroy(); - } + const userInitialX = user.x; + const userInitialY = user.y; + const targetInitialX = targetSubstitute?.sprite?.x ?? target.x; + const targetInitialY = targetSubstitute?.sprite?.y ?? target.y; + + this.srcLine = [userFocusX, userFocusY, targetFocusX, targetFocusY]; + this.dstLine = [userInitialX, userInitialY, targetInitialX, targetInitialY]; + + let r = anim?.frames.length ?? 0; + let f = 0; + + globalScene.tweens.addCounter({ + duration: getFrameMs(3), + repeat: anim?.frames.length ?? 0, + onRepeat: () => { + if (!f) { + userSprite.setVisible(false); + targetSprite.setVisible(false); } - if (this.bgSprite) { - this.bgSprite.destroy(); - } - if (callback) { - callback(); - } - }; - if (!scene.moveAnimations && !this.playRegardlessOfIssues) { - return cleanUpAndComplete(); - } - - const anim = this.getAnim(); - - this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; - this.dstLine = [ 150, 75, targetInitialX, targetInitialY ]; - - let totalFrames = anim!.frames.length; - let frameCount = 0; - - let existingFieldSprites = scene.field.getAll().slice(0); - - scene.tweens.addCounter({ - duration: Utils.getFrameMs(3) * frameTimeMult, - repeat: anim!.frames.length, - onRepeat: () => { - existingFieldSprites = scene.field.getAll().slice(0); - const spriteFrames = anim!.frames[frameCount]; - const frameData = this.getGraphicFrameDataWithoutTarget(anim!.frames[frameCount], targetInitialX, targetInitialY); - let graphicFrameCount = 0; - for (const frame of spriteFrames) { - if (frame.target !== AnimFrameTarget.GRAPHIC) { - console.log("Encounter animations do not support targets"); + const spriteFrames = anim!.frames[f]; // TODO: is the bang correcT? + const frameData = this.getGraphicFrameData(anim!.frames[f], onSubstitute); // TODO: is the bang correct? + let u = 0; + let t = 0; + let g = 0; + for (const frame of spriteFrames) { + if (frame.target !== AnimFrameTarget.GRAPHIC) { + const isUser = frame.target === AnimFrameTarget.USER; + if (isUser && target === user) { continue; } - - const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; - if (graphicFrameCount === sprites.length) { - const newSprite: Phaser.GameObjects.Sprite = scene.addFieldSprite(0, 0, anim!.graphic, 1); - sprites.push(newSprite); - scene.field.add(newSprite); + if (this.playRegardlessOfIssues && frame.target === AnimFrameTarget.TARGET && !target.isOnField()) { + continue; + } + const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET]; + const spriteSource = isUser ? userSprite : targetSprite; + if ((isUser ? u : t) === sprites.length) { + if (isUser || !targetSubstitute) { + const sprite = globalScene.addPokemonSprite( + isUser ? user! : target, + 0, + 0, + spriteSource!.texture, + spriteSource!.frame.name, + true, + ); // TODO: are those bangs correct? + ["spriteColors", "fusionSpriteColors"].map( + k => (sprite.pipelineData[k] = (isUser ? user! : target).getSprite().pipelineData[k]), + ); // TODO: are those bangs correct? + sprite.setPipelineData("spriteKey", (isUser ? user! : target).getBattleSpriteKey()); + sprite.setPipelineData("shiny", (isUser ? user : target).shiny); + sprite.setPipelineData("variant", (isUser ? user : target).variant); + sprite.setPipelineData("ignoreFieldPos", true); + spriteSource.on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); + globalScene.field.add(sprite); + sprites.push(sprite); + } else { + const sprite = globalScene.addFieldSprite(spriteSource.x, spriteSource.y, spriteSource.texture); + spriteSource.on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); + globalScene.field.add(sprite); + sprites.push(sprite); + } } - const graphicIndex = graphicFrameCount++; + const spriteIndex = isUser ? u++ : t++; + const pokemonSprite = sprites[spriteIndex]; + const graphicFrameData = frameData.get(frame.target)!.get(spriteIndex)!; // TODO: are the bangs correct? + const spriteSourceScale = + isUser || !targetSubstitute + ? spriteSource.parentContainer.scale + : target.getSpriteScale() * (target.isPlayer() ? 0.5 : 1); + pokemonSprite.setPosition( + graphicFrameData.x, + graphicFrameData.y - (spriteSource.height / 2) * (spriteSourceScale - 1), + ); + + pokemonSprite.setAngle(graphicFrameData.angle); + pokemonSprite.setScale( + graphicFrameData.scaleX * spriteSourceScale, + graphicFrameData.scaleY * spriteSourceScale, + ); + + pokemonSprite.setData("locked", frame.locked); + + pokemonSprite.setAlpha(frame.opacity / 255); + pokemonSprite.pipelineData["tone"] = frame.tone; + pokemonSprite.setVisible(frame.visible && (isUser ? user.visible : target.visible)); + pokemonSprite.setBlendMode( + frame.blendType === AnimBlendType.NORMAL + ? Phaser.BlendModes.NORMAL + : frame.blendType === AnimBlendType.ADD + ? Phaser.BlendModes.ADD + : Phaser.BlendModes.DIFFERENCE, + ); + } else { + const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; + if (g === sprites.length) { + const newSprite: Phaser.GameObjects.Sprite = globalScene.addFieldSprite(0, 0, anim!.graphic, 1); // TODO: is the bang correct? + sprites.push(newSprite); + globalScene.field.add(newSprite); + spritePriorities.push(1); + } + + const graphicIndex = g++; const moveSprite = sprites[graphicIndex]; - if (!isNullOrUndefined(frame.priority)) { - const setSpritePriority = (priority: integer) => { - if (existingFieldSprites.length > priority) { - // Move to specified priority index - const index = scene.field.getIndex(existingFieldSprites[priority]); - scene.field.moveTo(moveSprite, index); - } else { - // Move to top of scene - scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); + if (spritePriorities[graphicIndex] !== frame.priority) { + spritePriorities[graphicIndex] = frame.priority; + /** Move the position that the moveSprite is rendered in based on the priority. + * @param priority The priority level to draw the sprite. + * - 0: Draw the sprite in front of the pokemon on the field. + * - 1: Draw the sprite in front of the user pokemon. + * - 2: Draw the sprite in front of its `bgSprite` (if it has one), or its + * `AnimFocus` (if that is user/target), otherwise behind everything. + * - 3: Draw the sprite behind its `AnimFocus` (if that is user/target), otherwise in front of everything. + */ + const setSpritePriority = (priority: number) => { + /** The sprite we are moving the moveSprite in relation to */ + let targetSprite: Phaser.GameObjects.GameObject | nil; + /** The method that is being used to move the sprite.*/ + let moveFunc: + | ((sprite: Phaser.GameObjects.GameObject, target: Phaser.GameObjects.GameObject) => void) + | ((sprite: Phaser.GameObjects.GameObject) => void) = globalScene.field.bringToTop; + + if (priority === 0) { + // Place the sprite in front of the pokemon on the field. + targetSprite = globalScene.getEnemyField().find(p => p) ?? globalScene.getPlayerField().find(p => p); + console.log(typeof targetSprite); + moveFunc = globalScene.field.moveBelow; + } else if (priority === 2 && this.bgSprite) { + moveFunc = globalScene.field.moveAbove; + targetSprite = this.bgSprite; + } else if (priority === 2 || priority === 3) { + moveFunc = priority === 2 ? globalScene.field.moveBelow : globalScene.field.moveAbove; + if (frame.focus === AnimFocus.USER) { + targetSprite = this.user; + } else if (frame.focus === AnimFocus.TARGET) { + targetSprite = this.target; + } } + // If target sprite is not undefined and exists in the field container, then move the sprite using the moveFunc. + // Otherwise, default to just bringing it to the top. + targetSprite && globalScene.field.exists(targetSprite) + ? moveFunc.bind(globalScene.field)(moveSprite as Phaser.GameObjects.GameObject, targetSprite) + : globalScene.field.bringToTop(moveSprite as Phaser.GameObjects.GameObject); }; setSpritePriority(frame.priority); } moveSprite.setFrame(frame.graphicFrame); + //console.log(AnimFocus[frame.focus]); - const graphicFrameData = frameData.get(frame.target)?.get(graphicIndex); - if (graphicFrameData) { - moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); - moveSprite.setAngle(graphicFrameData.angle); - moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); + const graphicFrameData = frameData.get(frame.target)!.get(graphicIndex)!; // TODO: are those bangs correct? + moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); + moveSprite.setAngle(graphicFrameData.angle); + moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); - moveSprite.setAlpha(frame.opacity / 255); - moveSprite.setVisible(frame.visible); - moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); - } + moveSprite.setAlpha(frame.opacity / 255); + moveSprite.setVisible(frame.visible); + moveSprite.setBlendMode( + frame.blendType === AnimBlendType.NORMAL + ? Phaser.BlendModes.NORMAL + : frame.blendType === AnimBlendType.ADD + ? Phaser.BlendModes.ADD + : Phaser.BlendModes.DIFFERENCE, + ); } - if (anim?.frameTimedEvents.get(frameCount)) { - for (const event of anim.frameTimedEvents.get(frameCount)!) { - totalFrames = Math.max((anim.frames.length - frameCount) + event.execute(scene, this, frameTimedEventPriority), totalFrames); - } + } + if (anim?.frameTimedEvents.has(f)) { + const base = anim.frames.length - f; + // Bang is correct due to `has` check above, which cannot return true for an undefined / null `f` + for (const event of anim.frameTimedEvents.get(f)!) { + r = Math.max(base + event.execute(this), r); } - const targets = Utils.getEnumValues(AnimFrameTarget); - for (const i of targets) { - const count = graphicFrameCount; - if (count < spriteCache[i].length) { - const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); - for (const sprite of spritesToRemove) { - if (!sprite.getData("locked") as boolean) { - const spriteCacheIndex = spriteCache[i].indexOf(sprite); - spriteCache[i].splice(spriteCacheIndex, 1); - sprite.destroy(); + } + const targets = getEnumValues(AnimFrameTarget); + for (const i of targets) { + const count = i === AnimFrameTarget.GRAPHIC ? g : i === AnimFrameTarget.USER ? u : t; + if (count < spriteCache[i].length) { + const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); + for (const rs of spritesToRemove) { + if (!rs.getData("locked") as boolean) { + const spriteCacheIndex = spriteCache[i].indexOf(rs); + spriteCache[i].splice(spriteCacheIndex, 1); + if (i === AnimFrameTarget.GRAPHIC) { + spritePriorities.splice(spriteCacheIndex, 1); } + rs.destroy(); } } } - frameCount++; - totalFrames--; - }, - onComplete: () => { - for (const sprite of Object.values(spriteCache).flat()) { - if (sprite && !sprite.getData("locked")) { - sprite.destroy(); - } - } - if (totalFrames) { - scene.tweens.addCounter({ - duration: Utils.getFrameMs(totalFrames), - onComplete: () => cleanUpAndComplete() - }); - } else { - cleanUpAndComplete(); + } + f++; + r--; + }, + onComplete: () => { + for (const ms of Object.values(spriteCache).flat()) { + if (ms && !ms.getData("locked")) { + ms.destroy(); } } + if (r) { + globalScene.tweens.addCounter({ + duration: getFrameMs(r), + onComplete: () => cleanUpAndComplete(), + }); + } else { + cleanUpAndComplete(); + } + }, + }); + } + + private getGraphicFrameDataWithoutTarget( + frames: AnimFrame[], + targetInitialX: number, + targetInitialY: number, + ): Map> { + const ret: Map> = new Map([ + [AnimFrameTarget.GRAPHIC, new Map()], + [AnimFrameTarget.USER, new Map()], + [AnimFrameTarget.TARGET, new Map()], + ]); + + let g = 0; + let u = 0; + let t = 0; + + for (const frame of frames) { + let { x, y } = frame; + const scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); + const scaleY = frame.zoomY / 100; + x += targetInitialX; + y += targetInitialY; + const angle = -frame.angle; + const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; + ret.get(frame.target)?.set(key, { + x: x, + y: y, + scaleX: scaleX, + scaleY: scaleY, + angle: angle, }); } + + return ret; + } + + /** + * @param targetInitialX + * @param targetInitialY + * @param frameTimeMult + * @param frameTimedEventPriority + * - 0 is behind all other sprites (except BG) + * - 1 on top of player field + * - 3 is on top of both fields + * - 5 is on top of player sprite + * @param callback + */ + playWithoutTargets( + targetInitialX: number, + targetInitialY: number, + frameTimeMult: number, + frameTimedEventPriority?: 0 | 1 | 3 | 5, + // biome-ignore lint/complexity/noBannedTypes: callback is used liberally + callback?: Function, + ) { + const spriteCache: SpriteCache = { + [AnimFrameTarget.GRAPHIC]: [], + [AnimFrameTarget.USER]: [], + [AnimFrameTarget.TARGET]: [], + }; + + const cleanUpAndComplete = () => { + for (const ms of Object.values(spriteCache).flat()) { + if (ms) { + ms.destroy(); + } + } + if (this.bgSprite) { + this.bgSprite.destroy(); + } + if (callback) { + callback(); + } + }; + + if (!globalScene.moveAnimations && !this.playRegardlessOfIssues) { + return cleanUpAndComplete(); + } + + const anim = this.getAnim(); + + this.srcLine = [userFocusX, userFocusY, targetFocusX, targetFocusY]; + this.dstLine = [150, 75, targetInitialX, targetInitialY]; + + let totalFrames = anim!.frames.length; + let frameCount = 0; + + let existingFieldSprites = globalScene.field.getAll().slice(0); + + globalScene.tweens.addCounter({ + duration: getFrameMs(3) * frameTimeMult, + repeat: anim!.frames.length, + onRepeat: () => { + existingFieldSprites = globalScene.field.getAll().slice(0); + const spriteFrames = anim!.frames[frameCount]; + const frameData = this.getGraphicFrameDataWithoutTarget( + anim!.frames[frameCount], + targetInitialX, + targetInitialY, + ); + let graphicFrameCount = 0; + for (const frame of spriteFrames) { + if (frame.target !== AnimFrameTarget.GRAPHIC) { + console.log("Encounter animations do not support targets"); + continue; + } + + const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; + if (graphicFrameCount === sprites.length) { + const newSprite: Phaser.GameObjects.Sprite = globalScene.addFieldSprite(0, 0, anim!.graphic, 1); + sprites.push(newSprite); + globalScene.field.add(newSprite); + } + + const graphicIndex = graphicFrameCount++; + const moveSprite = sprites[graphicIndex]; + if (!isNullOrUndefined(frame.priority)) { + const setSpritePriority = (priority: number) => { + if (existingFieldSprites.length > priority) { + // Move to specified priority index + const index = globalScene.field.getIndex(existingFieldSprites[priority]); + globalScene.field.moveTo(moveSprite, index); + } else { + // Move to top of scene + globalScene.field.moveTo(moveSprite, globalScene.field.getAll().length - 1); + } + }; + setSpritePriority(frame.priority); + } + moveSprite.setFrame(frame.graphicFrame); + + const graphicFrameData = frameData.get(frame.target)?.get(graphicIndex); + if (graphicFrameData) { + moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); + moveSprite.setAngle(graphicFrameData.angle); + moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); + + moveSprite.setAlpha(frame.opacity / 255); + moveSprite.setVisible(frame.visible); + moveSprite.setBlendMode( + frame.blendType === AnimBlendType.NORMAL + ? Phaser.BlendModes.NORMAL + : frame.blendType === AnimBlendType.ADD + ? Phaser.BlendModes.ADD + : Phaser.BlendModes.DIFFERENCE, + ); + } + } + if (anim?.frameTimedEvents.get(frameCount)) { + const base = anim.frames.length - frameCount; + for (const event of anim.frameTimedEvents.get(frameCount)!) { + totalFrames = Math.max(base + event.execute(this, frameTimedEventPriority), totalFrames); + } + } + const targets = getEnumValues(AnimFrameTarget); + for (const i of targets) { + const count = graphicFrameCount; + if (count < spriteCache[i].length) { + const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); + for (const sprite of spritesToRemove) { + if (!sprite.getData("locked") as boolean) { + const spriteCacheIndex = spriteCache[i].indexOf(sprite); + spriteCache[i].splice(spriteCacheIndex, 1); + sprite.destroy(); + } + } + } + } + frameCount++; + totalFrames--; + }, + onComplete: () => { + for (const sprite of Object.values(spriteCache).flat()) { + if (sprite && !sprite.getData("locked")) { + sprite.destroy(); + } + } + if (totalFrames) { + globalScene.tweens.addCounter({ + duration: getFrameMs(totalFrames), + onComplete: () => cleanUpAndComplete(), + }); + } else { + cleanUpAndComplete(); + } + }, + }); + } } export class CommonBattleAnim extends BattleAnim { public commonAnim: CommonAnim | null; - constructor(commonAnim: CommonAnim | null, user: Pokemon, target?: Pokemon, playOnEmptyField: boolean = false) { + constructor(commonAnim: CommonAnim | null, user: Pokemon, target?: Pokemon, playOnEmptyField = false) { super(user, target || user, playOnEmptyField); this.commonAnim = commonAnim; } getAnim(): AnimConfig | null { - return this.commonAnim ? commonAnims.get(this.commonAnim) ?? null : null; + return this.commonAnim ? (commonAnims.get(this.commonAnim) ?? null) : null; } isOppAnim(): boolean { @@ -1280,16 +1428,16 @@ export class CommonBattleAnim extends BattleAnim { export class MoveAnim extends BattleAnim { public move: Moves; - constructor(move: Moves, user: Pokemon, target: BattlerIndex, playOnEmptyField: boolean = false) { - super(user, user.scene.getField()[target], playOnEmptyField); + constructor(move: Moves, user: Pokemon, target: BattlerIndex, playOnEmptyField = false) { + super(user, globalScene.getField()[target], playOnEmptyField); this.move = move; } getAnim(): AnimConfig { return moveAnims.get(this.move) instanceof AnimConfig - ? moveAnims.get(this.move) as AnimConfig - : moveAnims.get(this.move)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig; + ? (moveAnims.get(this.move) as AnimConfig) + : (moveAnims.get(this.move)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig); } isOppAnim(): boolean { @@ -1320,8 +1468,8 @@ export class MoveChargeAnim extends MoveAnim { getAnim(): AnimConfig { return chargeAnims.get(this.chargeAnim) instanceof AnimConfig - ? chargeAnims.get(this.chargeAnim) as AnimConfig - : chargeAnims.get(this.chargeAnim)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig; + ? (chargeAnims.get(this.chargeAnim) as AnimConfig) + : (chargeAnims.get(this.chargeAnim)?.[this.user?.isPlayer() ? 0 : 1] as AnimConfig); } } @@ -1346,22 +1494,22 @@ export class EncounterBattleAnim extends BattleAnim { } export async function populateAnims() { - const commonAnimNames = Utils.getEnumKeys(CommonAnim).map(k => k.toLowerCase()); + const commonAnimNames = getEnumKeys(CommonAnim).map(k => k.toLowerCase()); const commonAnimMatchNames = commonAnimNames.map(k => k.replace(/\_/g, "")); - const commonAnimIds = Utils.getEnumValues(CommonAnim) as CommonAnim[]; - const chargeAnimNames = Utils.getEnumKeys(ChargeAnim).map(k => k.toLowerCase()); + const commonAnimIds = getEnumValues(CommonAnim) as CommonAnim[]; + const chargeAnimNames = getEnumKeys(ChargeAnim).map(k => k.toLowerCase()); const chargeAnimMatchNames = chargeAnimNames.map(k => k.replace(/\_/g, " ")); - const chargeAnimIds = Utils.getEnumValues(ChargeAnim) as ChargeAnim[]; + const chargeAnimIds = getEnumValues(ChargeAnim) as ChargeAnim[]; const commonNamePattern = /name: (?:Common:)?(Opp )?(.*)/; const moveNameToId = {}; - for (const move of Utils.getEnumValues(Moves).slice(1)) { + for (const move of getEnumValues(Moves).slice(1)) { const moveName = Moves[move].toUpperCase().replace(/\_/g, ""); moveNameToId[moveName] = move; } - const seNames: string[] = [];//(await fs.readdir('./public/audio/se/battle_anims/')).map(se => se.toString()); + const seNames: string[] = []; //(await fs.readdir('./public/audio/se/battle_anims/')).map(se => se.toString()); - const animsData : any[] = [];//battleAnimRawData.split('!ruby/array:PBAnimation').slice(1); // TODO: add a proper type + const animsData: any[] = []; //battleAnimRawData.split('!ruby/array:PBAnimation').slice(1); // TODO: add a proper type for (let a = 0; a < animsData.length; a++) { const fields = animsData[a].split("@").slice(1); @@ -1392,51 +1540,84 @@ export async function populateAnims() { if (commonAnimId) { commonAnims.set(commonAnimId, anim); } else if (chargeAnimId) { - chargeAnims.set(chargeAnimId, !isOppMove ? anim : [ chargeAnims.get(chargeAnimId) as AnimConfig, anim ]); + chargeAnims.set(chargeAnimId, !isOppMove ? anim : [chargeAnims.get(chargeAnimId) as AnimConfig, anim]); } else { - moveAnims.set(moveNameToId[animName], !isOppMove ? anim as AnimConfig : [ moveAnims.get(moveNameToId[animName]) as AnimConfig, anim as AnimConfig ]); + moveAnims.set( + moveNameToId[animName], + !isOppMove ? (anim as AnimConfig) : [moveAnims.get(moveNameToId[animName]) as AnimConfig, anim as AnimConfig], + ); } for (let f = 0; f < fields.length; f++) { const field = fields[f]; const fieldName = field.slice(0, field.indexOf(":")); const fieldData = field.slice(fieldName.length + 1, field.lastIndexOf("\n")).trim(); switch (fieldName) { - case "array": + case "array": { const framesData = fieldData.split(" - - - ").slice(1); for (let fd = 0; fd < framesData.length; fd++) { anim.frames.push([]); const frameData = framesData[fd]; const focusFramesData = frameData.split(" - - "); for (let tf = 0; tf < focusFramesData.length; tf++) { - const values = focusFramesData[tf].replace(/ \- /g, "").split("\n"); - const targetFrame = new AnimFrame(parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), parseFloat(values[11]), parseFloat(values[3]), - parseInt(values[4]) === 1, parseInt(values[6]) === 1, parseInt(values[5]), parseInt(values[7]), parseInt(values[8]), parseInt(values[12]), parseInt(values[13]), - parseInt(values[14]), parseInt(values[15]), parseInt(values[16]), parseInt(values[17]), parseInt(values[18]), parseInt(values[19]), - parseInt(values[21]), parseInt(values[22]), parseInt(values[23]), parseInt(values[24]), parseInt(values[20]) === 1, parseInt(values[25]), parseInt(values[26]) as AnimFocus); + const values = focusFramesData[tf].replace(/ {6}\- /g, "").split("\n"); + const targetFrame = new AnimFrame( + Number.parseFloat(values[0]), + Number.parseFloat(values[1]), + Number.parseFloat(values[2]), + Number.parseFloat(values[11]), + Number.parseFloat(values[3]), + Number.parseInt(values[4]) === 1, + Number.parseInt(values[6]) === 1, + Number.parseInt(values[5]), + Number.parseInt(values[7]), + Number.parseInt(values[8]), + Number.parseInt(values[12]), + Number.parseInt(values[13]), + Number.parseInt(values[14]), + Number.parseInt(values[15]), + Number.parseInt(values[16]), + Number.parseInt(values[17]), + Number.parseInt(values[18]), + Number.parseInt(values[19]), + Number.parseInt(values[21]), + Number.parseInt(values[22]), + Number.parseInt(values[23]), + Number.parseInt(values[24]), + Number.parseInt(values[20]) === 1, + Number.parseInt(values[25]), + Number.parseInt(values[26]) as AnimFocus, + ); anim.frames[fd].push(targetFrame); } } break; - case "graphic": + } + case "graphic": { const graphic = fieldData !== "''" ? fieldData : ""; - anim.graphic = graphic.indexOf(".") > -1 - ? graphic.slice(0, fieldData.indexOf(".")) - : graphic; + anim.graphic = graphic.indexOf(".") > -1 ? graphic.slice(0, fieldData.indexOf(".")) : graphic; break; - case "timing": + } + case "timing": { const timingEntries = fieldData.split("- !ruby/object:PBAnimTiming ").slice(1); for (let t = 0; t < timingEntries.length; t++) { - const timingData = timingEntries[t].replace(/\n/g, " ").replace(/[ ]{2,}/g, " ").replace(/[a-z]+: ! '', /ig, "").replace(/name: (.*?),/, "name: \"$1\",") - .replace(/flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, "flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1"); - const frameIndex = parseInt(/frame: (\d+)/.exec(timingData)![1]); // TODO: is the bang correct? + const timingData = timingEntries[t] + .replace(/\n/g, " ") + .replace(/[ ]{2,}/g, " ") + .replace(/[a-z]+: ! '', /gi, "") + .replace(/name: (.*?),/, 'name: "$1",') + .replace( + /flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, + "flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1", + ); + const frameIndex = Number.parseInt(/frame: (\d+)/.exec(timingData)![1]); // TODO: is the bang correct? let resourceName = /name: "(.*?)"/.exec(timingData)![1].replace("''", ""); // TODO: is the bang correct? - const timingType = parseInt(/timingType: (\d)/.exec(timingData)![1]); // TODO: is the bang correct? + const timingType = Number.parseInt(/timingType: (\d)/.exec(timingData)![1]); // TODO: is the bang correct? let timedEvent: AnimTimedEvent | undefined; switch (timingType) { case 0: if (resourceName && resourceName.indexOf(".") === -1) { let ext: string | undefined; - [ "wav", "mp3", "m4a" ].every(e => { + ["wav", "mp3", "m4a"].every(e => { if (seNames.indexOf(`${resourceName}.${e}`) > -1) { ext = e; return false; @@ -1460,15 +1641,16 @@ export async function populateAnims() { if (!timedEvent) { continue; } - const propPattern = /([a-z]+): (.*?)(?:,|\})/ig; + const propPattern = /([a-z]+): (.*?)(?:,|\})/gi; let propMatch: RegExpExecArray; - while ((propMatch = propPattern.exec(timingData)!)) { // TODO: is this bang correct? + while ((propMatch = propPattern.exec(timingData)!)) { + // TODO: is this bang correct? const prop = propMatch[1]; let value: any = propMatch[2]; switch (prop) { case "bgX": case "bgY": - value = parseFloat(value); + value = Number.parseFloat(value); break; case "volume": case "pitch": @@ -1484,7 +1666,7 @@ export async function populateAnims() { case "flashBlue": case "flashAlpha": case "flashDuration": - value = parseInt(value); + value = Number.parseInt(value); break; } if (timedEvent.hasOwnProperty(prop)) { @@ -1494,21 +1676,21 @@ export async function populateAnims() { if (!anim.frameTimedEvents.has(frameIndex)) { anim.frameTimedEvents.set(frameIndex, []); } - anim.frameTimedEvents.get(frameIndex)!.push(timedEvent); // TODO: is this bang correct? + anim.frameTimedEvents.get(frameIndex)!.push(timedEvent); // TODO: is this bang correct? } break; + } case "position": - anim.position = parseInt(fieldData); + anim.position = Number.parseInt(fieldData); break; case "hue": - anim.hue = parseInt(fieldData); + anim.hue = Number.parseInt(fieldData); break; } } } - // used in commented code - // eslint-disable-next-line @typescript-eslint/no-unused-vars + // biome-ignore lint/correctness/noUnusedVariables: used in commented code const animReplacer = (k, v) => { if (k === "id" && !v) { return undefined; @@ -1522,12 +1704,29 @@ export async function populateAnims() { return v; }; - const animConfigProps = [ "id", "graphic", "frames", "frameTimedEvents", "position", "hue" ]; - const animFrameProps = [ "x", "y", "zoomX", "zoomY", "angle", "mirror", "visible", "blendType", "target", "graphicFrame", "opacity", "color", "tone", "flash", "locked", "priority", "focus" ]; - const propSets = [ animConfigProps, animFrameProps ]; + const animConfigProps = ["id", "graphic", "frames", "frameTimedEvents", "position", "hue"]; + const animFrameProps = [ + "x", + "y", + "zoomX", + "zoomY", + "angle", + "mirror", + "visible", + "blendType", + "target", + "graphicFrame", + "opacity", + "color", + "tone", + "flash", + "locked", + "priority", + "focus", + ]; + const propSets = [animConfigProps, animFrameProps]; - // used in commented code - // eslint-disable-next-line @typescript-eslint/no-unused-vars + // biome-ignore lint/correctness/noUnusedVariables: used in commented code const animComparator = (a: Element, b: Element) => { let props: string[]; for (let p = 0; p < propSets.length; p++) { diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index d671c56ab26..43a7072fd12 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1,35 +1,37 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { allAbilities, applyAbAttrs, BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ProtectStatAbAttr, - ReverseDrainAbAttr + ReverseDrainAbAttr, } from "#app/data/ability"; import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "#app/data/battle-anims"; -import Move, { +import type Move from "#app/data/moves/move"; +import { allMoves, applyMoveAttrs, ConsecutiveUseDoublePowerAttr, HealOnAllyAttr, - MoveCategory, - MoveFlags, - StatusCategoryOnAllyAttr -} from "#app/data/move"; -import { SpeciesFormChangeManualTrigger } from "#app/data/pokemon-forms"; -import { StatusEffect } from "#app/data/status-effect"; + StatusCategoryOnAllyAttr, +} from "#app/data/moves/move"; +import { MoveFlags } from "#enums/MoveFlags"; +import { MoveCategory } from "#enums/MoveCategory"; +import { SpeciesFormChangeAbilityTrigger } from "#app/data/pokemon-forms"; +import { getStatusEffectHealText } from "#app/data/status-effect"; import { TerrainType } from "#app/data/terrain"; -import { Type } from "#app/data/type"; -import { WeatherType } from "#app/data/weather"; -import Pokemon, { HitResult, MoveResult } from "#app/field/pokemon"; +import { PokemonType } from "#enums/pokemon-type"; +import type Pokemon from "#app/field/pokemon"; +import { HitResult, MoveResult } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { CommonAnimPhase } from "#app/phases/common-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MovePhase } from "#app/phases/move-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; -import { StatStageChangeCallback, StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; +import type { StatStageChangeCallback } from "#app/phases/stat-stage-change-phase"; +import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import i18next from "#app/plugins/i18n"; import { BooleanHolder, getFrameMs, NumberHolder, toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; @@ -38,6 +40,9 @@ import { Moves } from "#enums/moves"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { Species } from "#enums/species"; import { EFFECTIVE_STATS, getStatKey, Stat, type BattleStat, type EffectiveStat } from "#enums/stat"; +import { StatusEffect } from "#enums/status-effect"; +import { WeatherType } from "#enums/weather-type"; +import * as Utils from "../utils"; export enum BattlerTagLapseType { FAINT, @@ -48,7 +53,7 @@ export enum BattlerTagLapseType { TURN_END, HIT, AFTER_HIT, - CUSTOM + CUSTOM, } export class BattlerTag { @@ -59,26 +64,33 @@ export class BattlerTag { public sourceId?: number; public isBatonPassable: boolean; - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: number, sourceMove?: Moves, sourceId?: number, isBatonPassable: boolean = false) { + constructor( + tagType: BattlerTagType, + lapseType: BattlerTagLapseType | BattlerTagLapseType[], + turnCount: number, + sourceMove?: Moves, + sourceId?: number, + isBatonPassable = false, + ) { this.tagType = tagType; - this.lapseTypes = Array.isArray(lapseType) ? lapseType : [ lapseType ]; + this.lapseTypes = Array.isArray(lapseType) ? lapseType : [lapseType]; this.turnCount = turnCount; this.sourceMove = sourceMove!; // TODO: is this bang correct? this.sourceId = sourceId; this.isBatonPassable = isBatonPassable; } - canAdd(pokemon: Pokemon): boolean { + canAdd(_pokemon: Pokemon): boolean { return true; } - onAdd(pokemon: Pokemon): void { } + onAdd(_pokemon: Pokemon): void {} - onRemove(pokemon: Pokemon): void { } + onRemove(_pokemon: Pokemon): void {} - onOverlap(pokemon: Pokemon): void { } + onOverlap(_pokemon: Pokemon): void {} - lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + lapse(_pokemon: Pokemon, _lapseType: BattlerTagLapseType): boolean { return --this.turnCount > 0; } @@ -91,16 +103,14 @@ export class BattlerTag { } getMoveName(): string | null { - return this.sourceMove - ? allMoves[this.sourceMove].name - : null; + return this.sourceMove ? allMoves[this.sourceMove].name : null; } /** - * When given a battler tag or json representing one, load the data for it. - * This is meant to be inherited from by any battler tag with custom attributes - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * This is meant to be inherited from by any battler tag with custom attributes + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { this.turnCount = source.turnCount; this.sourceMove = source.sourceMove; @@ -109,11 +119,10 @@ export class BattlerTag { /** * Helper function that retrieves the source Pokemon object - * @param scene medium to retrieve the source Pokemon * @returns The source {@linkcode Pokemon} or `null` if none is found */ - public getSourcePokemon(scene: BattleScene): Pokemon | null { - return this.sourceId ? scene.getPokemonById(this.sourceId) : null; + public getSourcePokemon(): Pokemon | null { + return this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; } } @@ -134,7 +143,13 @@ export interface TerrainBattlerTag { * to select restricted moves. */ export abstract class MoveRestrictionBattlerTag extends BattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: integer, sourceMove?: Moves, sourceId?: integer) { + constructor( + tagType: BattlerTagType, + lapseType: BattlerTagLapseType | BattlerTagLapseType[], + turnCount: number, + sourceMove?: Moves, + sourceId?: number, + ) { super(tagType, lapseType, turnCount, sourceMove, sourceId); } @@ -142,12 +157,12 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.PRE_MOVE) { // Cancel the affected pokemon's selected move - const phase = pokemon.scene.getCurrentPhase() as MovePhase; + const phase = globalScene.getCurrentPhase() as MovePhase; const move = phase.move; if (this.isMoveRestricted(move.moveId, pokemon)) { if (this.interruptedText(pokemon, move.moveId)) { - pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId)); + globalScene.queueMessage(this.interruptedText(pokemon, move.moveId)); } phase.cancel(); } @@ -170,12 +185,12 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { /** * Checks if this tag is restricting a move based on a user's decisions during the target selection phase * - * @param {Moves} move {@linkcode Moves} move ID to check restriction for - * @param {Pokemon} user {@linkcode Pokemon} the user of the above move - * @param {Pokemon} target {@linkcode Pokemon} the target of the above move + * @param {Moves} _move {@linkcode Moves} move ID to check restriction for + * @param {Pokemon} _user {@linkcode Pokemon} the user of the above move + * @param {Pokemon} _target {@linkcode Pokemon} the target of the above move * @returns {boolean} `false` unless overridden by the child tag */ - isMoveTargetRestricted(move: Moves, user: Pokemon, target: Pokemon): boolean { + isMoveTargetRestricted(_move: Moves, _user: Pokemon, _target: Pokemon): boolean { return false; } @@ -193,11 +208,11 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { * Because restriction effects also prevent selection of the move, this situation can only arise if a * pokemon first selects a move, then gets outsped by a pokemon using a move that restricts the selected move. * - * @param {Pokemon} pokemon {@linkcode Pokemon} attempting to use the restricted move - * @param {Moves} move {@linkcode Moves} ID of the move being interrupted + * @param {Pokemon} _pokemon {@linkcode Pokemon} attempting to use the restricted move + * @param {Moves} _move {@linkcode Moves} ID of the move being interrupted * @returns {string} text to display when the move is interrupted */ - interruptedText(pokemon: Pokemon, move: Moves): string { + interruptedText(_pokemon: Pokemon, _move: Moves): string { return ""; } } @@ -209,7 +224,12 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { */ export class ThroatChoppedTag extends MoveRestrictionBattlerTag { constructor() { - super(BattlerTagType.THROAT_CHOPPED, [ BattlerTagLapseType.TURN_END, BattlerTagLapseType.PRE_MOVE ], 2, Moves.THROAT_CHOP); + super( + BattlerTagType.THROAT_CHOPPED, + [BattlerTagLapseType.TURN_END, BattlerTagLapseType.PRE_MOVE], + 2, + Moves.THROAT_CHOP, + ); } /** @@ -225,23 +245,27 @@ export class ThroatChoppedTag extends MoveRestrictionBattlerTag { /** * Shows a message when the player attempts to select a move that is restricted by Throat Chop. * @override - * @param {Pokemon} pokemon the {@linkcode Pokemon} that is attempting to select the restricted move + * @param {Pokemon} _pokemon the {@linkcode Pokemon} that is attempting to select the restricted move * @param {Moves} move the {@linkcode Moves | move} that is being restricted * @returns the message to display when the player attempts to select the restricted move */ - override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name }); + override selectionDeniedText(_pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:moveCannotBeSelected", { + moveName: allMoves[move].name, + }); } /** * Shows a message when a move is interrupted by Throat Chop. * @override * @param {Pokemon} pokemon the interrupted {@linkcode Pokemon} - * @param {Moves} move the {@linkcode Moves | move} that was interrupted + * @param {Moves} _move the {@linkcode Moves | move} that was interrupted * @returns the message to display when the move is interrupted */ - override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:throatChopInterruptedMove", { pokemonName: getPokemonNameWithAffix(pokemon) }); + override interruptedText(pokemon: Pokemon, _move: Moves): string { + return i18next.t("battle:throatChopInterruptedMove", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } } @@ -254,7 +278,13 @@ export class DisabledTag extends MoveRestrictionBattlerTag { private moveId: Moves = Moves.NONE; constructor(sourceId: number) { - super(BattlerTagType.DISABLED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 4, Moves.DISABLE, sourceId); + super( + BattlerTagType.DISABLED, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], + 4, + Moves.DISABLE, + sourceId, + ); } /** @override */ @@ -271,26 +301,35 @@ export class DisabledTag extends MoveRestrictionBattlerTag { override onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - const move = pokemon.getLastXMoves() - .find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual); - if (move === undefined) { + const move = pokemon.getLastXMoves(-1).find(m => !m.virtual); + if (Utils.isNullOrUndefined(move) || move.move === Moves.STRUGGLE || move.move === Moves.NONE) { return; } this.moveId = move.move; - pokemon.scene.queueMessage(i18next.t("battlerTags:disabledOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[this.moveId].name })); + globalScene.queueMessage( + i18next.t("battlerTags:disabledOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[this.moveId].name, + }), + ); } /** @override */ override onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:disabledLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[this.moveId].name })); + globalScene.queueMessage( + i18next.t("battlerTags:disabledLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[this.moveId].name, + }), + ); } /** @override */ - override selectionDeniedText(pokemon: Pokemon, move: Moves): string { + override selectionDeniedText(_pokemon: Pokemon, move: Moves): string { return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name }); } @@ -301,7 +340,10 @@ export class DisabledTag extends MoveRestrictionBattlerTag { * @returns {string} text to display when the move is interrupted */ override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:disableInterruptedMove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } /** @override */ @@ -333,7 +375,7 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { * @returns `true` if the pokemon has a valid move and no existing {@linkcode GorillaTacticsTag}; `false` otherwise */ override canAdd(pokemon: Pokemon): boolean { - return (this.getLastValidMove(pokemon) !== undefined) && !pokemon.getTag(GorillaTacticsTag); + return this.getLastValidMove(pokemon) !== undefined && !pokemon.getTag(GorillaTacticsTag); } /** @@ -367,11 +409,14 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { * * @override * @param {Pokemon} pokemon n/a - * @param {Moves} move {@linkcode Moves} ID of the move being denied + * @param {Moves} _move {@linkcode Moves} ID of the move being denied * @returns {string} text to display when the move is denied - */ - override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:canOnlyUseMove", { moveName: allMoves[this.moveId].name, pokemonName: getPokemonNameWithAffix(pokemon) }); + */ + override selectionDeniedText(pokemon: Pokemon, _move: Moves): string { + return i18next.t("battle:canOnlyUseMove", { + moveName: allMoves[this.moveId].name, + pokemonName: getPokemonNameWithAffix(pokemon), + }); } /** @@ -380,8 +425,7 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { * @returns {Moves | undefined} the last valid move from the pokemon's move history */ getLastValidMove(pokemon: Pokemon): Moves | undefined { - const move = pokemon.getLastXMoves() - .find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual); + const move = pokemon.getLastXMoves().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual); return move?.move; } @@ -392,21 +436,25 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { */ export class RechargingTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.RECHARGING, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 2, sourceMove); + super(BattlerTagType.RECHARGING, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], 2, sourceMove); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); // Queue a placeholder move for the Pokemon to "use" next turn - pokemon.getMoveQueue().push({ move: Moves.NONE, targets: []}); + pokemon.getMoveQueue().push({ move: Moves.NONE, targets: [] }); } /** Cancels the source's move this turn and queues a "__ must recharge!" message */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.PRE_MOVE) { - pokemon.scene.queueMessage(i18next.t("battlerTags:rechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); + globalScene.queueMessage( + i18next.t("battlerTags:rechargingLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + (globalScene.getCurrentPhase() as MovePhase).cancel(); pokemon.getMoveQueue().shift(); } return super.lapse(pokemon, lapseType); @@ -420,15 +468,24 @@ export class RechargingTag extends BattlerTag { */ export class BeakBlastChargingTag extends BattlerTag { constructor() { - super(BattlerTagType.BEAK_BLAST_CHARGING, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT ], 1, Moves.BEAK_BLAST); + super( + BattlerTagType.BEAK_BLAST_CHARGING, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT], + 1, + Moves.BEAK_BLAST, + ); } onAdd(pokemon: Pokemon): void { // Play Beak Blast's charging animation - new MoveChargeAnim(ChargeAnim.BEAK_BLAST_CHARGING, this.sourceMove, pokemon).play(pokemon.scene); + new MoveChargeAnim(ChargeAnim.BEAK_BLAST_CHARGING, this.sourceMove, pokemon).play(); // Queue Beak Blast's header message - pokemon.scene.queueMessage(i18next.t("moveTriggers:startedHeatingUpBeak", { pokemonName: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("moveTriggers:startedHeatingUpBeak", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -456,14 +513,18 @@ export class BeakBlastChargingTag extends BattlerTag { * @see {@link https://bulbapedia.bulbagarden.net/wiki/Shell_Trap_(move) | Shell Trap} */ export class ShellTrapTag extends BattlerTag { - public activated: boolean = false; + public activated = false; constructor() { - super(BattlerTagType.SHELL_TRAP, [ BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT ], 1); + super(BattlerTagType.SHELL_TRAP, [BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT], 1); } onAdd(pokemon: Pokemon): void { - pokemon.scene.queueMessage(i18next.t("moveTriggers:setUpShellTrap", { pokemonName: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("moveTriggers:setUpShellTrap", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -478,17 +539,15 @@ export class ShellTrapTag extends BattlerTag { // Trap should only be triggered by opponent's Physical moves if (phaseData?.move.category === MoveCategory.PHYSICAL && pokemon.isOpponent(phaseData.attacker)) { - const shellTrapPhaseIndex = pokemon.scene.phaseQueue.findIndex( - phase => phase instanceof MovePhase && phase.pokemon === pokemon - ); - const firstMovePhaseIndex = pokemon.scene.phaseQueue.findIndex( - phase => phase instanceof MovePhase + const shellTrapPhaseIndex = globalScene.phaseQueue.findIndex( + phase => phase instanceof MovePhase && phase.pokemon === pokemon, ); + const firstMovePhaseIndex = globalScene.phaseQueue.findIndex(phase => phase instanceof MovePhase); // Only shift MovePhase timing if it's not already next up if (shellTrapPhaseIndex !== -1 && shellTrapPhaseIndex !== firstMovePhaseIndex) { - const shellTrapMovePhase = pokemon.scene.phaseQueue.splice(shellTrapPhaseIndex, 1)[0]; - pokemon.scene.prependToPhase(shellTrapMovePhase, MovePhase); + const shellTrapMovePhase = globalScene.phaseQueue.splice(shellTrapPhaseIndex, 1)[0]; + globalScene.prependToPhase(shellTrapMovePhase, MovePhase); } this.activated = true; @@ -502,15 +561,21 @@ export class ShellTrapTag extends BattlerTag { } export class TrappedTag extends BattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: number, sourceMove: Moves, sourceId: number) { + constructor( + tagType: BattlerTagType, + lapseType: BattlerTagLapseType, + turnCount: number, + sourceMove: Moves, + sourceId: number, + ) { super(tagType, lapseType, turnCount, sourceMove, sourceId, true); } canAdd(pokemon: Pokemon): boolean { - const source = pokemon.scene.getPokemonById(this.sourceId!)!; + const source = globalScene.getPokemonById(this.sourceId!)!; const move = allMoves[this.sourceMove]; - const isGhost = pokemon.isOfType(Type.GHOST); + const isGhost = pokemon.isOfType(PokemonType.GHOST); const isTrapped = pokemon.getTag(TrappedTag); const hasSubstitute = move.hitsSubstitute(source, pokemon); @@ -520,16 +585,18 @@ export class TrappedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(this.getTrapMessage(pokemon)); + globalScene.queueMessage(this.getTrapMessage(pokemon)); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:trappedOnRemove", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveName: this.getMoveName() - })); + globalScene.queueMessage( + i18next.t("battlerTags:trappedOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName(), + }), + ); } getDescriptor(): string { @@ -541,7 +608,9 @@ export class TrappedTag extends BattlerTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:trappedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:trappedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -567,7 +636,7 @@ class NoRetreatTag extends TrappedTag { */ export class FlinchedTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.FLINCHED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 0, sourceMove); + super(BattlerTagType.FLINCHED, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], 0, sourceMove); } onAdd(pokemon: Pokemon): void { @@ -584,8 +653,12 @@ export class FlinchedTag extends BattlerTag { */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.PRE_MOVE) { - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - pokemon.scene.queueMessage(i18next.t("battlerTags:flinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + (globalScene.getCurrentPhase() as MovePhase).cancel(); + globalScene.queueMessage( + i18next.t("battlerTags:flinchedLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } return super.lapse(pokemon, lapseType); @@ -609,11 +682,15 @@ export class InterruptedTag extends BattlerTag { super.onAdd(pokemon); pokemon.getMoveQueue().shift(); - pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.OTHER }); + pokemon.pushMoveHistory({ + move: Moves.NONE, + result: MoveResult.OTHER, + targets: [], + }); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); + (globalScene.getCurrentPhase() as MovePhase).cancel(); return super.lapse(pokemon, lapseType); } } @@ -627,44 +704,62 @@ export class ConfusedTag extends BattlerTag { } canAdd(pokemon: Pokemon): boolean { - return pokemon.scene.arena.terrain?.terrainType !== TerrainType.MISTY || !pokemon.isGrounded(); + return globalScene.arena.terrain?.terrainType !== TerrainType.MISTY || !pokemon.isGrounded(); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); - pokemon.scene.queueMessage(i18next.t("battlerTags:confusedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); + globalScene.queueMessage( + i18next.t("battlerTags:confusedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:confusedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:confusedOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:confusedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:confusedOnOverlap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM && super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); + globalScene.queueMessage( + i18next.t("battlerTags:confusedLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); // 1/3 chance of hitting self with a 40 base power move if (pokemon.randSeedInt(3) === 0) { const atk = pokemon.getEffectiveStat(Stat.ATK); const def = pokemon.getEffectiveStat(Stat.DEF); - const damage = toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedIntRange(85, 100) / 100)); - pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself")); + const damage = toDmgValue( + ((((2 * pokemon.level) / 5 + 2) * 40 * atk) / def / 50 + 2) * (pokemon.randSeedIntRange(85, 100) / 100), + ); + globalScene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself")); pokemon.damageAndUpdate(damage); pokemon.battleData.hitCount++; - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); + (globalScene.getCurrentPhase() as MovePhase).cancel(); } } @@ -699,7 +794,7 @@ export class DestinyBondTag extends BattlerTag { if (lapseType !== BattlerTagLapseType.CUSTOM) { return super.lapse(pokemon, lapseType); } - const source = this.sourceId ? pokemon.scene.getPokemonById(this.sourceId) : null; + const source = this.sourceId ? globalScene.getPokemonById(this.sourceId) : null; if (!source?.isFainted()) { return true; } @@ -709,15 +804,19 @@ export class DestinyBondTag extends BattlerTag { } if (pokemon.isBossImmune()) { - pokemon.scene.queueMessage(i18next.t("battlerTags:destinyBondLapseIsBoss", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:destinyBondLapseIsBoss", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); return false; } - pokemon.scene.queueMessage( + globalScene.queueMessage( i18next.t("battlerTags:destinyBondLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(source), - pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon) - }) + pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon), + }), ); pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, false, true); return false; @@ -731,52 +830,58 @@ export class InfatuatedTag extends BattlerTag { canAdd(pokemon: Pokemon): boolean { if (this.sourceId) { - const pkm = pokemon.scene.getPokemonById(this.sourceId); + const pkm = globalScene.getPokemonById(this.sourceId); if (pkm) { return pokemon.isOppositeGender(pkm); - } else { - console.warn("canAdd: this.sourceId is not a valid pokemon id!", this.sourceId); - return false; } - } else { - console.warn("canAdd: this.sourceId is undefined"); + console.warn("canAdd: this.sourceId is not a valid pokemon id!", this.sourceId); return false; } + console.warn("canAdd: this.sourceId is undefined"); + return false; } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage( + globalScene.queueMessage( i18next.t("battlerTags:infatuatedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct? - }) + sourcePokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + }), ); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:infatuatedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:infatuatedOnOverlap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage( + globalScene.queueMessage( i18next.t("battlerTags:infatuatedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined) // TODO: is that bang correct? - }) + sourcePokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + }), ); - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.ATTRACT)); + globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, CommonAnim.ATTRACT)); if (pokemon.randSeedInt(2)) { - pokemon.scene.queueMessage(i18next.t("battlerTags:infatuatedLapseImmobilize", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); + globalScene.queueMessage( + i18next.t("battlerTags:infatuatedLapseImmobilize", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + (globalScene.getCurrentPhase() as MovePhase).cancel(); } } @@ -786,7 +891,11 @@ export class InfatuatedTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:infatuatedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:infatuatedOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } isSourceLinked(): boolean { @@ -806,23 +915,27 @@ export class SeedTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.sourceIndex = source.sourceIndex; } canAdd(pokemon: Pokemon): boolean { - return !pokemon.isOfType(Type.GRASS); + return !pokemon.isOfType(PokemonType.GRASS); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:seededOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? + globalScene.queueMessage( + i18next.t("battlerTags:seededOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + this.sourceIndex = globalScene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -835,14 +948,27 @@ export class SeedTag extends BattlerTag { applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED)); + globalScene.unshiftPhase( + new CommonAnimPhase(source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED), + ); const damage = pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr, false); - pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, source.getBattlerIndex(), - !reverseDrain ? damage : damage * -1, - !reverseDrain ? i18next.t("battlerTags:seededLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }) : i18next.t("battlerTags:seededLapseShed", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), - false, true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + source.getBattlerIndex(), + !reverseDrain ? damage : damage * -1, + !reverseDrain + ? i18next.t("battlerTags:seededLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }) + : i18next.t("battlerTags:seededLapseShed", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + false, + true, + ), + ); } } } @@ -855,6 +981,67 @@ 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!" + globalScene.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 = globalScene.getCurrentPhase(); + if (movePhase instanceof MovePhase) { + const move = movePhase.move.getMove(); + const weather = globalScene.arena.weather; + if ( + pokemon.getMoveType(move) === PokemonType.FIRE && + !(weather && weather.weatherType === WeatherType.HEAVY_RAIN && !weather.isEffectSuppressed()) + ) { + movePhase.fail(); + movePhase.showMoveText(); + + globalScene.unshiftPhase( + new CommonAnimPhase(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!" + globalScene.queueMessage(i18next.t("battlerTags:powderLapse", { moveName: move.name })); + } + } + return true; + } + return super.lapse(pokemon, lapseType); + } +} + export class NightmareTag extends BattlerTag { constructor() { super(BattlerTagType.NIGHTMARE, BattlerTagLapseType.TURN_END, 1, Moves.NIGHTMARE); @@ -863,21 +1050,33 @@ export class NightmareTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:nightmareOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:nightmareOnOverlap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CURSE)); // TODO: Update animation type + globalScene.queueMessage( + i18next.t("battlerTags:nightmareLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, CommonAnim.CURSE)); // TODO: Update animation type const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); @@ -903,23 +1102,34 @@ export class FrenzyTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - if (this.turnCount < 2) { // Only add CONFUSED tag if a disruption occurs on the final confusion-inducing turn of FRENZY + if (this.turnCount < 2) { + // Only add CONFUSED tag if a disruption occurs on the final confusion-inducing turn of FRENZY pokemon.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 4)); } } } -export class EncoreTag extends BattlerTag { +/** + * Applies the effects of the move Encore onto the target Pokemon + * Encore forces the target Pokemon to use its most-recent move for 3 turns + */ +export class EncoreTag extends MoveRestrictionBattlerTag { public moveId: Moves; constructor(sourceId: number) { - super(BattlerTagType.ENCORE, BattlerTagLapseType.AFTER_MOVE, 3, Moves.ENCORE, sourceId); + super( + BattlerTagType.ENCORE, + [BattlerTagLapseType.CUSTOM, BattlerTagLapseType.AFTER_MOVE], + 3, + Moves.ENCORE, + sourceId, + ); } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.moveId = source.moveId as Moves; @@ -956,23 +1166,65 @@ export class EncoreTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:encoreOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:encoreOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); - const movePhase = pokemon.scene.findPhase(m => m instanceof MovePhase && m.pokemon === pokemon); + const movePhase = globalScene.findPhase(m => m instanceof MovePhase && m.pokemon === pokemon); if (movePhase) { const movesetMove = pokemon.getMoveset().find(m => m!.moveId === this.moveId); // TODO: is this bang correct? if (movesetMove) { const lastMove = pokemon.getLastXMoves(1)[0]; - pokemon.scene.tryReplacePhase((m => m instanceof MovePhase && m.pokemon === pokemon), - new MovePhase(pokemon.scene, pokemon, lastMove.targets!, movesetMove)); // TODO: is this bang correct? + globalScene.tryReplacePhase( + m => m instanceof MovePhase && m.pokemon === pokemon, + new MovePhase(pokemon, lastMove.targets!, movesetMove), + ); // TODO: is this bang correct? } } } + /** + * If the encored move has run out of PP, Encore ends early. Otherwise, Encore lapses based on the AFTER_MOVE battler tag lapse type. + * @returns `true` to persist | `false` to end and be removed + */ + override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + if (lapseType === BattlerTagLapseType.CUSTOM) { + const encoredMove = pokemon.getMoveset().find(m => m?.moveId === this.moveId); + if (encoredMove && encoredMove?.getPpRatio() > 0) { + return true; + } + return false; + } + return super.lapse(pokemon, lapseType); + } + + /** + * Checks if the move matches the moveId stored within the tag and returns a boolean value + * @param move {@linkcode Moves} the move selected + * @param user N/A + * @returns `true` if the move does not match with the moveId stored and as a result, restricted + */ + override isMoveRestricted(move: Moves, _user?: Pokemon): boolean { + if (move !== this.moveId) { + return true; + } + return false; + } + + override selectionDeniedText(_pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name }); + } + onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:encoreOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:encoreOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -982,11 +1234,11 @@ export class HelpingHandTag extends BattlerTag { } onAdd(pokemon: Pokemon): void { - pokemon.scene.queueMessage( + globalScene.queueMessage( i18next.t("battlerTags:helpingHandOnAdd", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? - pokemonName: getPokemonNameWithAffix(pokemon) - }) + pokemonNameWithAffix: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + pokemonName: getPokemonNameWithAffix(pokemon), + }), ); } } @@ -1015,14 +1267,15 @@ export class IngrainTag extends TrappedTag { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.unshiftPhase( + globalScene.unshiftPhase( new PokemonHealPhase( - pokemon.scene, pokemon.getBattlerIndex(), toDmgValue(pokemon.getMaxHp() / 16), - i18next.t("battlerTags:ingrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), - true - ) + i18next.t("battlerTags:ingrainLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + true, + ), ); } @@ -1030,7 +1283,9 @@ export class IngrainTag extends TrappedTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:ingrainOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:ingrainOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } getDescriptor(): string { @@ -1047,15 +1302,11 @@ 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); if (shouldLapse) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.DEF, Stat.SPDEF ], -1)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, [Stat.DEF, Stat.SPDEF], -1)); return true; } @@ -1071,23 +1322,28 @@ export class AquaRingTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:aquaRingOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:aquaRingOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.unshiftPhase( + globalScene.unshiftPhase( new PokemonHealPhase( - pokemon.scene, pokemon.getBattlerIndex(), toDmgValue(pokemon.getMaxHp() / 16), i18next.t("battlerTags:aquaRingLapse", { moveName: this.getMoveName(), - pokemonName: getPokemonNameWithAffix(pokemon) + pokemonName: getPokemonNameWithAffix(pokemon), }), - true)); + true, + ), + ); } return ret; @@ -1119,13 +1375,17 @@ export class DrowsyTag extends BattlerTag { } canAdd(pokemon: Pokemon): boolean { - return pokemon.scene.arena.terrain?.terrainType !== TerrainType.ELECTRIC || !pokemon.isGrounded(); + return globalScene.arena.terrain?.terrainType !== TerrainType.ELECTRIC || !pokemon.isGrounded(); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:drowsyOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:drowsyOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1152,9 +1412,9 @@ export abstract class DamagingTrapTag extends TrappedTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.commonAnim = source.commonAnim as CommonAnim; @@ -1168,13 +1428,13 @@ export abstract class DamagingTrapTag extends TrappedTag { const ret = super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage( + globalScene.queueMessage( i18next.t("battlerTags:damagingTrapLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveName: this.getMoveName() - }) + moveName: this.getMoveName(), + }), ); - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, this.commonAnim)); + globalScene.unshiftPhase(new CommonAnimPhase(pokemon.getBattlerIndex(), undefined, this.commonAnim)); const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); @@ -1196,8 +1456,8 @@ export class BindTag extends DamagingTrapTag { getTrapMessage(pokemon: Pokemon): string { return i18next.t("battlerTags:bindOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? - moveName: this.getMoveName() + sourcePokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + moveName: this.getMoveName(), }); } } @@ -1210,7 +1470,7 @@ export class WrapTag extends DamagingTrapTag { getTrapMessage(pokemon: Pokemon): string { return i18next.t("battlerTags:wrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + sourcePokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? }); } } @@ -1221,7 +1481,9 @@ export abstract class VortexTrapTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:vortexOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:vortexOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -1244,7 +1506,7 @@ export class ClampTag extends DamagingTrapTag { getTrapMessage(pokemon: Pokemon): string { return i18next.t("battlerTags:clampOnTrap", { - sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + sourcePokemonNameWithAffix: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? pokemonName: getPokemonNameWithAffix(pokemon), }); } @@ -1258,7 +1520,7 @@ export class SandTombTag extends DamagingTrapTag { getTrapMessage(pokemon: Pokemon): string { return i18next.t("battlerTags:sandTombOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveName: this.getMoveName() + moveName: this.getMoveName(), }); } } @@ -1269,7 +1531,9 @@ export class MagmaStormTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:magmaStormOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:magmaStormOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -1279,7 +1543,9 @@ export class SnapTrapTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return i18next.t("battlerTags:snapTrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlerTags:snapTrapOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -1291,7 +1557,7 @@ export class ThunderCageTag extends DamagingTrapTag { getTrapMessage(pokemon: Pokemon): string { return i18next.t("battlerTags:thunderCageOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + sourcePokemonNameWithAffix: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? }); } } @@ -1304,12 +1570,11 @@ export class InfestationTag extends DamagingTrapTag { getTrapMessage(pokemon: Pokemon): string { return i18next.t("battlerTags:infestationOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? + sourcePokemonNameWithAffix: getPokemonNameWithAffix(globalScene.getPokemonById(this.sourceId!) ?? undefined), // TODO: is that bang correct? }); } } - export class ProtectedTag extends BattlerTag { constructor(sourceMove: Moves, tagType: BattlerTagType = BattlerTagType.PROTECTED) { super(tagType, BattlerTagLapseType.TURN_END, 0, sourceMove); @@ -1318,16 +1583,24 @@ export class ProtectedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:protectedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:protectedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - new CommonBattleAnim(CommonAnim.PROTECT, pokemon).play(pokemon.scene); - pokemon.scene.queueMessage(i18next.t("battlerTags:protectedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + new CommonBattleAnim(CommonAnim.PROTECT, pokemon).play(); + globalScene.queueMessage( + i18next.t("battlerTags:protectedLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); // Stop multi-hit moves early - const effectPhase = pokemon.scene.getCurrentPhase(); + const effectPhase = globalScene.getCurrentPhase(); if (effectPhase instanceof MoveEffectPhase) { effectPhase.stopMultiHit(pokemon); } @@ -1355,9 +1628,9 @@ export class ContactDamageProtectedTag extends ProtectedTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.damageRatio = source.damageRatio; @@ -1367,7 +1640,7 @@ export class ContactDamageProtectedTag extends ProtectedTag { const ret = super.lapse(pokemon, lapseType); if (lapseType === BattlerTagLapseType.CUSTOM) { - const effectPhase = pokemon.scene.getCurrentPhase(); + const effectPhase = globalScene.getCurrentPhase(); if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { const attacker = effectPhase.getPokemon(); if (!attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { @@ -1396,9 +1669,9 @@ export class ContactStatStageChangeProtectedTag extends DamageProtectedTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.stat = source.stat; @@ -1409,10 +1682,10 @@ export class ContactStatStageChangeProtectedTag extends DamageProtectedTag { const ret = super.lapse(pokemon, lapseType); if (lapseType === BattlerTagLapseType.CUSTOM) { - const effectPhase = pokemon.scene.getCurrentPhase(); + const effectPhase = globalScene.getCurrentPhase(); if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { const attacker = effectPhase.getPokemon(); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), false, [ this.stat ], this.levels)); + globalScene.unshiftPhase(new StatStageChangePhase(attacker.getBattlerIndex(), false, [this.stat], this.levels)); } } @@ -1429,7 +1702,7 @@ export class ContactPoisonProtectedTag extends ProtectedTag { const ret = super.lapse(pokemon, lapseType); if (lapseType === BattlerTagLapseType.CUSTOM) { - const effectPhase = pokemon.scene.getCurrentPhase(); + const effectPhase = globalScene.getCurrentPhase(); if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { const attacker = effectPhase.getPokemon(); attacker.trySetStatus(StatusEffect.POISON, true, pokemon); @@ -1453,7 +1726,7 @@ export class ContactBurnProtectedTag extends DamageProtectedTag { const ret = super.lapse(pokemon, lapseType); if (lapseType === BattlerTagLapseType.CUSTOM) { - const effectPhase = pokemon.scene.getCurrentPhase(); + const effectPhase = globalScene.getCurrentPhase(); if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { const attacker = effectPhase.getPokemon(); attacker.trySetStatus(StatusEffect.BURN, true); @@ -1464,20 +1737,33 @@ export class ContactBurnProtectedTag extends DamageProtectedTag { } } +/** + * `BattlerTag` class for effects that cause the affected Pokemon to survive lethal attacks at 1 HP. + * Used for {@link https://bulbapedia.bulbagarden.net/wiki/Endure_(move) | Endure} and + * Endure Tokens. + */ export class EnduringTag extends BattlerTag { - constructor(sourceMove: Moves) { - super(BattlerTagType.ENDURING, BattlerTagLapseType.TURN_END, 0, sourceMove); + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: Moves) { + super(tagType, lapseType, 0, sourceMove); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:enduringOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:enduringOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - pokemon.scene.queueMessage(i18next.t("battlerTags:enduringLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:enduringLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); return true; } @@ -1492,7 +1778,11 @@ export class SturdyTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - pokemon.scene.queueMessage(i18next.t("battlerTags:sturdyLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:sturdyLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); return true; } @@ -1513,11 +1803,11 @@ export class PerishSongTag extends BattlerTag { const ret = super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage( + globalScene.queueMessage( i18next.t("battlerTags:perishSongLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - turnCount: this.turnCount - }) + turnCount: this.turnCount, + }), ); } else { pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, true, true); @@ -1537,12 +1827,12 @@ export class CenterOfAttentionTag extends BattlerTag { constructor(sourceMove: Moves) { super(BattlerTagType.CENTER_OF_ATTENTION, BattlerTagLapseType.TURN_END, 1, sourceMove); - this.powder = (this.sourceMove === Moves.RAGE_POWDER); + this.powder = this.sourceMove === Moves.RAGE_POWDER; } /** "Center of Attention" can't be added if an ally is already the Center of Attention. */ canAdd(pokemon: Pokemon): boolean { - const activeTeam = pokemon.isPlayer() ? pokemon.scene.getPlayerField() : pokemon.scene.getEnemyField(); + const activeTeam = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); return !activeTeam.find(p => p.getTag(BattlerTagType.CENTER_OF_ATTENTION)); } @@ -1550,7 +1840,11 @@ export class CenterOfAttentionTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:centerOfAttentionOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:centerOfAttentionOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -1564,15 +1858,31 @@ export class AbilityBattlerTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.ability = source.ability as Abilities; } } +/** + * Tag used by Unburden to double speed + * @extends AbilityBattlerTag + */ +export class UnburdenTag extends AbilityBattlerTag { + constructor() { + super(BattlerTagType.UNBURDEN, Abilities.UNBURDEN, BattlerTagLapseType.CUSTOM, 1); + } + onAdd(pokemon: Pokemon): void { + super.onAdd(pokemon); + } + onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + } +} + export class TruantTag extends AbilityBattlerTag { constructor() { super(BattlerTagType.TRUANT, Abilities.TRUANT, BattlerTagLapseType.MOVE, 1); @@ -1587,9 +1897,13 @@ export class TruantTag extends AbilityBattlerTag { const lastMove = pokemon.getLastXMoves().find(() => true); if (lastMove && lastMove.move !== Moves.NONE) { - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, passive)); - pokemon.scene.queueMessage(i18next.t("battlerTags:truantLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + (globalScene.getCurrentPhase() as MovePhase).cancel(); + globalScene.unshiftPhase(new ShowAbilityPhase(pokemon.id, passive)); + globalScene.queueMessage( + i18next.t("battlerTags:truantLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } return true; @@ -1604,7 +1918,15 @@ export class SlowStartTag extends AbilityBattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:slowStartOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null, true); + globalScene.queueMessage( + i18next.t("battlerTags:slowStartOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + null, + false, + null, + true, + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1618,7 +1940,14 @@ export class SlowStartTag extends AbilityBattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:slowStartOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null); + globalScene.queueMessage( + i18next.t("battlerTags:slowStartOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + null, + false, + null, + ); } } @@ -1631,9 +1960,9 @@ export class HighestStatBoostTag extends AbilityBattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.stat = source.stat as Stat; @@ -1644,7 +1973,9 @@ export class HighestStatBoostTag extends AbilityBattlerTag { super.onAdd(pokemon); let highestStat: EffectiveStat; - EFFECTIVE_STATS.map(s => pokemon.getEffectiveStat(s)).reduce((highestValue: number, value: number, i: number) => { + EFFECTIVE_STATS.map(s => + pokemon.getEffectiveStat(s, undefined, undefined, undefined, undefined, undefined, undefined, true), + ).reduce((highestValue: number, value: number, i: number) => { if (value > highestValue) { highestStat = EFFECTIVE_STATS[i]; return value; @@ -1655,22 +1986,28 @@ export class HighestStatBoostTag extends AbilityBattlerTag { highestStat = highestStat!; // tell TS compiler it's defined! this.stat = highestStat; - switch (this.stat) { - case Stat.SPD: - this.multiplier = 1.5; - break; - default: - this.multiplier = 1.3; - break; - } - - pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: i18next.t(getStatKey(highestStat)) }), null, false, null, true); + this.multiplier = this.stat === Stat.SPD ? 1.5 : 1.3; + globalScene.queueMessage( + i18next.t("battlerTags:highestStatBoostOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + statName: i18next.t(getStatKey(highestStat)), + }), + null, + false, + null, + true, + ); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: allAbilities[this.ability].name })); + globalScene.queueMessage( + i18next.t("battlerTags:highestStatBoostOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: allAbilities[this.ability].name, + }), + ); } } @@ -1683,9 +2020,9 @@ export class WeatherHighestStatBoostTag extends HighestStatBoostTag implements W } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.weatherTypes = source.weatherTypes.map(w => w as WeatherType); @@ -1701,9 +2038,9 @@ export class TerrainHighestStatBoostTag extends HighestStatBoostTag implements T } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.terrainTypes = source.terrainTypes.map(w => w as TerrainType); @@ -1723,29 +2060,29 @@ export class SemiInvulnerableTag extends BattlerTag { onRemove(pokemon: Pokemon): void { // Wait 2 frames before setting visible for battle animations that don't immediately show the sprite invisible - pokemon.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ duration: getFrameMs(2), - onComplete: () => pokemon.setVisible(true) + onComplete: () => pokemon.setVisible(true), }); } } export class TypeImmuneTag extends BattlerTag { - public immuneType: Type; + public immuneType: PokemonType; - constructor(tagType: BattlerTagType, sourceMove: Moves, immuneType: Type, length: number = 1) { + constructor(tagType: BattlerTagType, sourceMove: Moves, immuneType: PokemonType, length = 1) { super(tagType, BattlerTagLapseType.TURN_END, length, sourceMove, undefined, true); this.immuneType = immuneType; } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); - this.immuneType = source.immuneType as Type; + this.immuneType = source.immuneType as PokemonType; } } @@ -1755,33 +2092,46 @@ export class TypeImmuneTag extends BattlerTag { * @see {@link https://bulbapedia.bulbagarden.net/wiki/Telekinesis_(move) | Moves.TELEKINESIS} */ export class FloatingTag extends TypeImmuneTag { - constructor(tagType: BattlerTagType, sourceMove: Moves) { - super(tagType, sourceMove, Type.GROUND, 5); + constructor(tagType: BattlerTagType, sourceMove: Moves, turnCount: number) { + super(tagType, sourceMove, PokemonType.GROUND, turnCount); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); if (this.sourceMove === Moves.MAGNET_RISE) { - pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:magnetRisenOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } - } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); if (this.sourceMove === Moves.MAGNET_RISE) { - pokemon.scene.queueMessage(i18next.t("battlerTags:magnetRisenOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:magnetRisenOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } } export class TypeBoostTag extends BattlerTag { - public boostedType: Type; + public boostedType: PokemonType; public boostValue: number; public oneUse: boolean; - constructor(tagType: BattlerTagType, sourceMove: Moves, boostedType: Type, boostValue: number, oneUse: boolean) { + constructor( + tagType: BattlerTagType, + sourceMove: Moves, + boostedType: PokemonType, + boostValue: number, + oneUse: boolean, + ) { super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove); this.boostedType = boostedType; @@ -1790,12 +2140,12 @@ export class TypeBoostTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); - this.boostedType = source.boostedType as Type; + this.boostedType = source.boostedType as PokemonType; this.boostValue = source.boostValue; this.oneUse = source.oneUse; } @@ -1813,7 +2163,11 @@ export class CritBoostTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:critBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:critBoostOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1823,7 +2177,11 @@ export class CritBoostTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:critBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:critBoostOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -1833,7 +2191,7 @@ export class CritBoostTag extends BattlerTag { */ export class DragonCheerTag extends CritBoostTag { /** The types of the user's ally when the tag is added */ - public typesOnAdd: Type[]; + public typesOnAdd: PokemonType[]; constructor() { super(BattlerTagType.CRIT_BOOST, Moves.DRAGON_CHEER); @@ -1854,9 +2212,9 @@ export class SaltCuredTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.sourceIndex = source.sourceIndex; @@ -1865,28 +2223,34 @@ export class SaltCuredTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:saltCuredOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? + globalScene.queueMessage( + i18next.t("battlerTags:saltCuredOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + this.sourceIndex = globalScene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE)); + globalScene.unshiftPhase( + new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE), + ); const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - const pokemonSteelOrWater = pokemon.isOfType(Type.STEEL) || pokemon.isOfType(Type.WATER); + const pokemonSteelOrWater = pokemon.isOfType(PokemonType.STEEL) || pokemon.isOfType(PokemonType.WATER); pokemon.damageAndUpdate(toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8)); - pokemon.scene.queueMessage( + globalScene.queueMessage( i18next.t("battlerTags:saltCuredLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - moveName: this.getMoveName() - }) + moveName: this.getMoveName(), + }), ); } } @@ -1903,9 +2267,9 @@ export class CursedTag extends BattlerTag { } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.sourceIndex = source.sourceIndex; @@ -1913,21 +2277,27 @@ export class CursedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? + this.sourceIndex = globalScene.getPokemonById(this.sourceId!)!.getBattlerIndex(); // TODO: are those bangs correct? } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE)); + globalScene.unshiftPhase( + new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE), + ); const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 4)); - pokemon.scene.queueMessage(i18next.t("battlerTags:cursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:cursedLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -1959,8 +2329,8 @@ export class GroundedTag extends BattlerTag { */ export class RoostedTag extends BattlerTag { - private isBaseFlying : boolean; - private isBasePureFlying : boolean; + private isBaseFlying: boolean; + private isBasePureFlying: boolean; constructor() { super(BattlerTagType.ROOSTED, BattlerTagLapseType.TURN_END, 1, Moves.ROOST); @@ -1970,21 +2340,23 @@ export class RoostedTag extends BattlerTag { const currentTypes = pokemon.getTypes(); const baseTypes = pokemon.getTypes(false, false, true); - const forestsCurseApplied: boolean = currentTypes.includes(Type.GRASS) && !baseTypes.includes(Type.GRASS); - const trickOrTreatApplied: boolean = currentTypes.includes(Type.GHOST) && !baseTypes.includes(Type.GHOST); + const forestsCurseApplied: boolean = + currentTypes.includes(PokemonType.GRASS) && !baseTypes.includes(PokemonType.GRASS); + const trickOrTreatApplied: boolean = + currentTypes.includes(PokemonType.GHOST) && !baseTypes.includes(PokemonType.GHOST); if (this.isBaseFlying) { - let modifiedTypes: Type[] = []; + let modifiedTypes: PokemonType[] = []; if (this.isBasePureFlying) { if (forestsCurseApplied || trickOrTreatApplied) { - modifiedTypes = currentTypes.filter(type => type !== Type.NORMAL); - modifiedTypes.push(Type.FLYING); + modifiedTypes = currentTypes.filter(type => type !== PokemonType.NORMAL); + modifiedTypes.push(PokemonType.FLYING); } else { - modifiedTypes = [ Type.FLYING ]; + modifiedTypes = [PokemonType.FLYING]; } } else { - modifiedTypes = [ ...currentTypes ]; - modifiedTypes.push(Type.FLYING); + modifiedTypes = [...currentTypes]; + modifiedTypes.push(PokemonType.FLYING); } pokemon.summonData.types = modifiedTypes; pokemon.updateInfo(); @@ -1997,18 +2369,18 @@ export class RoostedTag extends BattlerTag { const isOriginallyDualType = baseTypes.length === 2; const isCurrentlyDualType = currentTypes.length === 2; - this.isBaseFlying = baseTypes.includes(Type.FLYING); - this.isBasePureFlying = baseTypes[0] === Type.FLYING && baseTypes.length === 1; + this.isBaseFlying = baseTypes.includes(PokemonType.FLYING); + this.isBasePureFlying = baseTypes[0] === PokemonType.FLYING && baseTypes.length === 1; if (this.isBaseFlying) { - let modifiedTypes: Type[]; + let modifiedTypes: PokemonType[]; if (this.isBasePureFlying && !isCurrentlyDualType) { - modifiedTypes = [ Type.NORMAL ]; + modifiedTypes = [PokemonType.NORMAL]; } else { if (!!pokemon.getTag(RemovedTypeTag) && isOriginallyDualType && !isCurrentlyDualType) { - modifiedTypes = [ Type.UNKNOWN ]; + modifiedTypes = [PokemonType.UNKNOWN]; } else { - modifiedTypes = currentTypes.filter(type => type !== Type.FLYING); + modifiedTypes = currentTypes.filter(type => type !== PokemonType.FLYING); } } pokemon.summonData.types = modifiedTypes; @@ -2041,7 +2413,7 @@ export class FormBlockDamageTag extends BattlerTag { super.onAdd(pokemon); if (pokemon.formIndex !== 0) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger); } } @@ -2053,28 +2425,65 @@ export class FormBlockDamageTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger); } } /** Provides the additional weather-based effects of the Ice Face ability */ export class IceFaceBlockDamageTag extends FormBlockDamageTag { - constructor(tagType: BattlerTagType) { - super(tagType); - } - /** * Determines if the tag can be added to the Pokémon. * @param {Pokemon} pokemon The Pokémon to which the tag might be added. * @returns {boolean} True if the tag can be added, false otherwise. */ canAdd(pokemon: Pokemon): boolean { - const weatherType = pokemon.scene.arena.weather?.weatherType; + const weatherType = globalScene.arena.weather?.weatherType; const isWeatherSnowOrHail = weatherType === WeatherType.HAIL || weatherType === WeatherType.SNOW; return super.canAdd(pokemon) || isWeatherSnowOrHail; } } +/** + * Battler tag indicating a Tatsugiri with {@link https://bulbapedia.bulbagarden.net/wiki/Commander_(Ability) | Commander} + * has entered the tagged Pokemon's mouth. + */ +export class CommandedTag extends BattlerTag { + private _tatsugiriFormKey: string; + + constructor(sourceId: number) { + super(BattlerTagType.COMMANDED, BattlerTagLapseType.CUSTOM, 0, Moves.NONE, sourceId); + } + + public get tatsugiriFormKey(): string { + return this._tatsugiriFormKey; + } + + /** Caches the Tatsugiri's form key and sharply boosts the tagged Pokemon's stats */ + override onAdd(pokemon: Pokemon): void { + this._tatsugiriFormKey = this.getSourcePokemon()?.getFormKey() ?? "curly"; + globalScene.unshiftPhase( + new StatStageChangePhase( + pokemon.getBattlerIndex(), + true, + [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD], + 2, + ), + ); + } + + /** Triggers an {@linkcode PokemonAnimType | animation} of the tagged Pokemon "spitting out" Tatsugiri */ + override onRemove(pokemon: Pokemon): void { + if (this.getSourcePokemon()?.isActive(true)) { + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.COMMANDER_REMOVE); + } + } + + override loadTag(source: BattlerTag | any): void { + super.loadTag(source); + this._tatsugiriFormKey = source._tatsugiriFormKey; + } +} + /** * Battler tag enabling the Stockpile mechanic. This tag handles: * - Stack tracking, including max limit enforcement (which is replicated in Stockpile for redundancy). @@ -2086,10 +2495,10 @@ export class IceFaceBlockDamageTag extends FormBlockDamageTag { * the stat when added. */ export class StockpilingTag extends BattlerTag { - public stockpiledCount: number = 0; + public stockpiledCount = 0; public statChangeCounts: { [Stat.DEF]: number; [Stat.SPDEF]: number } = { [Stat.DEF]: 0, - [Stat.SPDEF]: 0 + [Stat.SPDEF]: 0, }; constructor(sourceMove: Moves = Moves.NONE) { @@ -2127,16 +2536,26 @@ export class StockpilingTag extends BattlerTag { if (this.stockpiledCount < 3) { this.stockpiledCount++; - pokemon.scene.queueMessage(i18next.t("battlerTags:stockpilingOnAdd", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - stockpiledCount: this.stockpiledCount - })); + globalScene.queueMessage( + i18next.t("battlerTags:stockpilingOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + stockpiledCount: this.stockpiledCount, + }), + ); // Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes. - pokemon.scene.unshiftPhase(new StatStageChangePhase( - pokemon.scene, pokemon.getBattlerIndex(), true, - [ Stat.SPDEF, Stat.DEF ], 1, true, false, true, this.onStatStagesChanged - )); + globalScene.unshiftPhase( + new StatStageChangePhase( + pokemon.getBattlerIndex(), + true, + [Stat.SPDEF, Stat.DEF], + 1, + true, + false, + true, + this.onStatStagesChanged, + ), + ); } } @@ -2153,11 +2572,15 @@ export class StockpilingTag extends BattlerTag { const spDefChange = this.statChangeCounts[Stat.SPDEF]; if (defChange) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.DEF ], -defChange, true, false, true)); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.DEF], -defChange, true, false, true), + ); } if (spDefChange) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPDEF ], -spDefChange, true, false, true)); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.SPDEF], -spDefChange, true, false, true), + ); } } } @@ -2171,12 +2594,12 @@ export class GulpMissileTag extends BattlerTag { super(tagType, BattlerTagLapseType.HIT, 0, sourceMove); } - override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + override lapse(pokemon: Pokemon, _lapseType: BattlerTagLapseType): boolean { if (pokemon.getTag(BattlerTagType.UNDERWATER)) { return true; } - const moveEffectPhase = pokemon.scene.getCurrentPhase(); + const moveEffectPhase = globalScene.getCurrentPhase(); if (moveEffectPhase instanceof MoveEffectPhase) { const attacker = moveEffectPhase.getUserPokemon(); @@ -2196,7 +2619,7 @@ export class GulpMissileTag extends BattlerTag { } if (this.tagType === BattlerTagType.GULP_MISSILE_ARROKUDA) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), false, [ Stat.DEF ], -1)); + globalScene.unshiftPhase(new StatStageChangePhase(attacker.getBattlerIndex(), false, [Stat.DEF], -1)); } else { attacker.trySetStatus(StatusEffect.PARALYSIS, true, pokemon); } @@ -2210,8 +2633,11 @@ export class GulpMissileTag extends BattlerTag { * @returns Whether the BattlerTag can be added. */ canAdd(pokemon: Pokemon): boolean { - const isSurfOrDive = [ Moves.SURF, Moves.DIVE ].includes(this.sourceMove); - const isNormalForm = pokemon.formIndex === 0 && !pokemon.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA) && !pokemon.getTag(BattlerTagType.GULP_MISSILE_PIKACHU); + const isSurfOrDive = [Moves.SURF, Moves.DIVE].includes(this.sourceMove); + const isNormalForm = + pokemon.formIndex === 0 && + !pokemon.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA) && + !pokemon.getTag(BattlerTagType.GULP_MISSILE_PIKACHU); const isCramorant = pokemon.species.speciesId === Species.CRAMORANT; return isSurfOrDive && isNormalForm && isCramorant; @@ -2219,12 +2645,12 @@ export class GulpMissileTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger); } } @@ -2239,31 +2665,31 @@ export class GulpMissileTag extends BattlerTag { * @see {@linkcode ignoreImmunity} */ export class ExposedTag extends BattlerTag { - private defenderType: Type; - private allowedTypes: Type[]; + private defenderType: PokemonType; + private allowedTypes: PokemonType[]; - constructor(tagType: BattlerTagType, sourceMove: Moves, defenderType: Type, allowedTypes: Type[]) { + constructor(tagType: BattlerTagType, sourceMove: Moves, defenderType: PokemonType, allowedTypes: PokemonType[]) { super(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove); this.defenderType = defenderType; this.allowedTypes = allowedTypes; } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); - this.defenderType = source.defenderType as Type; - this.allowedTypes = source.allowedTypes as Type[]; + this.defenderType = source.defenderType as PokemonType; + this.allowedTypes = source.allowedTypes as PokemonType[]; } /** - * @param types {@linkcode Type} of the defending Pokemon - * @param moveType {@linkcode Type} of the move targetting it + * @param types {@linkcode PokemonType} of the defending Pokemon + * @param moveType {@linkcode PokemonType} of the move targetting it * @returns `true` if the move should be allowed to target the defender. */ - ignoreImmunity(type: Type, moveType: Type): boolean { + ignoreImmunity(type: PokemonType, moveType: PokemonType): boolean { return type === this.defenderType && this.allowedTypes.includes(moveType); } } @@ -2276,11 +2702,18 @@ export class ExposedTag extends BattlerTag { */ export class HealBlockTag extends MoveRestrictionBattlerTag { constructor(turnCount: number, sourceMove: Moves) { - super(BattlerTagType.HEAL_BLOCK, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], turnCount, sourceMove); + super( + BattlerTagType.HEAL_BLOCK, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], + turnCount, + sourceMove, + ); } onActivation(pokemon: Pokemon): string { - return i18next.t("battle:battlerTagsHealBlock", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battle:battlerTagsHealBlock", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } /** @@ -2306,17 +2739,21 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { override isMoveTargetRestricted(move: Moves, user: Pokemon, target: Pokemon) { const moveCategory = new NumberHolder(allMoves[move].category); applyMoveAttrs(StatusCategoryOnAllyAttr, user, target, allMoves[move], moveCategory); - if (allMoves[move].hasAttr(HealOnAllyAttr) && moveCategory.value === MoveCategory.STATUS ) { + if (allMoves[move].hasAttr(HealOnAllyAttr) && moveCategory.value === MoveCategory.STATUS) { return true; } return false; } /** - * Uses DisabledTag's selectionDeniedText() message + * Uses its own unique selectionDeniedText() message */ override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledHealBlock", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name, healBlockName: allMoves[Moves.HEAL_BLOCK].name }); + return i18next.t("battle:moveDisabledHealBlock", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + healBlockName: allMoves[Moves.HEAL_BLOCK].name, + }); } /** @@ -2326,13 +2763,24 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { * @returns {string} text to display when the move is interrupted */ override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledHealBlock", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name, healBlockName: allMoves[Moves.HEAL_BLOCK].name }); + return i18next.t("battle:moveDisabledHealBlock", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + healBlockName: allMoves[Moves.HEAL_BLOCK].name, + }); } override onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsHealBlockOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null); + globalScene.queueMessage( + i18next.t("battle:battlerTagsHealBlockOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + null, + false, + null, + ); } } @@ -2351,11 +2799,15 @@ export class TarShotTag extends BattlerTag { * @returns whether the tag is applied */ override canAdd(pokemon: Pokemon): boolean { - return !pokemon.isTerastallized(); + return !pokemon.isTerastallized; } override onAdd(pokemon: Pokemon): void { - pokemon.scene.queueMessage(i18next.t("battlerTags:tarShotOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:tarShotOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -2370,7 +2822,11 @@ export class ElectrifiedTag extends BattlerTag { override onAdd(pokemon: Pokemon): void { // "{pokemonNameWithAffix}'s moves have been electrified!" - pokemon.scene.queueMessage(i18next.t("battlerTags:electrifiedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:electrifiedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -2379,7 +2835,7 @@ export class ElectrifiedTag extends BattlerTag { * Each count of Autotomization reduces the weight by 100kg */ export class AutotomizedTag extends BattlerTag { - public autotomizeCount: number = 0; + public autotomizeCount = 0; constructor(sourceMove: Moves = Moves.AUTOTOMIZE) { super(BattlerTagType.AUTOTOMIZED, BattlerTagLapseType.CUSTOM, 1, sourceMove); } @@ -2392,9 +2848,11 @@ export class AutotomizedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { const minWeight = 0.1; if (pokemon.getWeight() > minWeight) { - pokemon.scene.queueMessage(i18next.t("battlerTags:autotomizeOnAdd", { - pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) - })); + globalScene.queueMessage( + i18next.t("battlerTags:autotomizeOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } this.autotomizeCount += 1; } @@ -2417,21 +2875,38 @@ export class SubstituteTag extends BattlerTag { /** Is the source Pokemon "in focus," i.e. is it fully visible on the field? */ public sourceInFocus: boolean; - constructor(sourceMove: Moves, sourceId: integer) { - super(BattlerTagType.SUBSTITUTE, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE, BattlerTagLapseType.HIT ], 0, sourceMove, sourceId, true); + constructor(sourceMove: Moves, sourceId: number) { + super( + BattlerTagType.SUBSTITUTE, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE, BattlerTagLapseType.HIT], + 0, + sourceMove, + sourceId, + true, + ); } /** Sets the Substitute's HP and queues an on-add battle animation that initializes the Substitute's sprite. */ onAdd(pokemon: Pokemon): void { - this.hp = Math.floor(pokemon.scene.getPokemonById(this.sourceId!)!.getMaxHp() / 4); + this.hp = Math.floor(globalScene.getPokemonById(this.sourceId!)!.getMaxHp() / 4); this.sourceInFocus = false; // Queue battle animation and message - pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_ADD); + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_ADD); if (this.sourceMove === Moves.SHED_TAIL) { - pokemon.scene.queueMessage(i18next.t("battlerTags:shedTailOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + globalScene.queueMessage( + i18next.t("battlerTags:shedTailOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + 1500, + ); } else { - pokemon.scene.queueMessage(i18next.t("battlerTags:substituteOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + globalScene.queueMessage( + i18next.t("battlerTags:substituteOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + 1500, + ); } // Remove any binding effects from the user @@ -2442,11 +2917,15 @@ export class SubstituteTag extends BattlerTag { onRemove(pokemon: Pokemon): void { // Only play the animation if the cause of removal isn't from the source's own move if (!this.sourceInFocus) { - pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_REMOVE, [ this.sprite ]); + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_REMOVE, [this.sprite]); } else { this.sprite.destroy(); } - pokemon.scene.queueMessage(i18next.t("battlerTags:substituteOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:substituteOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -2466,34 +2945,41 @@ export class SubstituteTag extends BattlerTag { /** Triggers an animation that brings the Pokemon into focus before it uses a move */ onPreMove(pokemon: Pokemon): void { - pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_PRE_MOVE, [ this.sprite ]); + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_PRE_MOVE, [this.sprite]); this.sourceInFocus = true; } /** Triggers an animation that brings the Pokemon out of focus after it uses a move */ onAfterMove(pokemon: Pokemon): void { - pokemon.scene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_POST_MOVE, [ this.sprite ]); + globalScene.triggerPokemonBattleAnim(pokemon, PokemonAnimType.SUBSTITUTE_POST_MOVE, [this.sprite]); this.sourceInFocus = false; } /** If the Substitute redirects damage, queue a message to indicate it. */ onHit(pokemon: Pokemon): void { - const moveEffectPhase = pokemon.scene.getCurrentPhase(); + const moveEffectPhase = globalScene.getCurrentPhase(); if (moveEffectPhase instanceof MoveEffectPhase) { - const attacker = moveEffectPhase.getUserPokemon()!; + const attacker = moveEffectPhase.getUserPokemon(); + if (!attacker) { + return; + } const move = moveEffectPhase.move.getMove(); - const firstHit = (attacker.turnData.hitCount === attacker.turnData.hitsLeft); + const firstHit = attacker.turnData.hitCount === attacker.turnData.hitsLeft; if (firstHit && move.hitsSubstitute(attacker, pokemon)) { - pokemon.scene.queueMessage(i18next.t("battlerTags:substituteOnHit", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:substituteOnHit", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ + * When given a battler tag or json representing one, load the data for it. + * @param {BattlerTag | any} source A battler tag + */ loadTag(source: BattlerTag | any): void { super.loadTag(source); this.hp = source.hp; @@ -2557,7 +3043,12 @@ export class TormentTag extends MoveRestrictionBattlerTag { */ override onAdd(pokemon: Pokemon) { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:tormentOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + globalScene.queueMessage( + i18next.t("battlerTags:tormentOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + 1500, + ); } /** @@ -2580,14 +3071,14 @@ export class TormentTag extends MoveRestrictionBattlerTag { return false; } const lastMove = user.getLastXMoves(1)[0]; - if ( !lastMove ) { + if (!lastMove) { return false; } // This checks for locking / momentum moves like Rollout and Hydro Cannon + if the user is under the influence of BattlerTagType.FRENZY // Because Uproar's unique behavior is not implemented, it does not check for Uproar. Torment has been marked as partial in moves.ts const moveObj = allMoves[lastMove.move]; const isUnaffected = moveObj.hasAttr(ConsecutiveUseDoublePowerAttr) || user.getTag(BattlerTagType.FRENZY); - const validLastMoveResult = (lastMove.result === MoveResult.SUCCESS) || (lastMove.result === MoveResult.MISS); + const validLastMoveResult = lastMove.result === MoveResult.SUCCESS || lastMove.result === MoveResult.MISS; if (lastMove.move === move && validLastMoveResult && lastMove.move !== Moves.STRUGGLE && !isUnaffected) { return true; } @@ -2595,7 +3086,9 @@ export class TormentTag extends MoveRestrictionBattlerTag { } override selectionDeniedText(pokemon: Pokemon, _move: Moves): string { - return i18next.t("battle:moveDisabledTorment", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battle:moveDisabledTorment", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } } @@ -2606,12 +3099,27 @@ export class TormentTag extends MoveRestrictionBattlerTag { */ export class TauntTag extends MoveRestrictionBattlerTag { constructor() { - super(BattlerTagType.TAUNT, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE ], 4, Moves.TAUNT); + super(BattlerTagType.TAUNT, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], 4, Moves.TAUNT); } override onAdd(pokemon: Pokemon) { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:tauntOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), 1500); + globalScene.queueMessage( + i18next.t("battlerTags:tauntOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + 1500, + ); + } + + public override onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + + globalScene.queueMessage( + i18next.t("battlerTags:tauntOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -2624,11 +3132,17 @@ export class TauntTag extends MoveRestrictionBattlerTag { } override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledTaunt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:moveDisabledTaunt", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledTaunt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:moveDisabledTaunt", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } } @@ -2639,7 +3153,13 @@ export class TauntTag extends MoveRestrictionBattlerTag { */ export class ImprisonTag extends MoveRestrictionBattlerTag { constructor(sourceId: number) { - super(BattlerTagType.IMPRISON, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE ], 1, Moves.IMPRISON, sourceId); + super( + BattlerTagType.IMPRISON, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], + 1, + Moves.IMPRISON, + sourceId, + ); } /** @@ -2649,13 +3169,12 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { * @returns `true` if the source is still active */ public override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - const source = this.getSourcePokemon(pokemon.scene); + const source = this.getSourcePokemon(); if (source) { if (lapseType === BattlerTagLapseType.PRE_MOVE) { return super.lapse(pokemon, lapseType) && source.isActive(true); - } else { - return source.isActive(true); } + return source.isActive(true); } return false; } @@ -2666,8 +3185,8 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { * @param {Moves} move the move under investigation * @returns `false` if either condition is not met */ - public override isMoveRestricted(move: Moves, user: Pokemon): boolean { - const source = this.getSourcePokemon(user.scene); + public override isMoveRestricted(move: Moves, _user: Pokemon): boolean { + const source = this.getSourcePokemon(); if (source) { const sourceMoveset = source.getMoveset().map(m => m!.moveId); return sourceMoveset?.includes(move) && source.isActive(true); @@ -2676,11 +3195,17 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { } override selectionDeniedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledImprison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:moveDisabledImprison", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } override interruptedText(pokemon: Pokemon, move: Moves): string { - return i18next.t("battle:moveDisabledImprison", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); + return i18next.t("battle:moveDisabledImprison", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: allMoves[move].name, + }); } } @@ -2700,7 +3225,11 @@ export class SyrupBombTag extends BattlerTag { */ override onAdd(pokemon: Pokemon) { super.onAdd(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:syrupBombOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:syrupBombOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -2710,15 +3239,18 @@ export class SyrupBombTag extends BattlerTag { * @returns `true` if the `turnCount` is still greater than `0`; `false` if the `turnCount` is `0` or the target or source Pokemon has been removed from the field */ override lapse(pokemon: Pokemon, _lapseType: BattlerTagLapseType): boolean { - if (this.sourceId && !pokemon.scene.getPokemonById(this.sourceId)?.isActive(true)) { + if (this.sourceId && !globalScene.getPokemonById(this.sourceId)?.isActive(true)) { return false; } // Custom message in lieu of an animation in mainline - pokemon.scene.queueMessage(i18next.t("battlerTags:syrupBombLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - pokemon.scene.unshiftPhase(new StatStageChangePhase( - pokemon.scene, pokemon.getBattlerIndex(), true, - [ Stat.SPD ], -1, true, false, true - )); + globalScene.queueMessage( + i18next.t("battlerTags:syrupBombLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.SPD], -1, true, false, true), + ); return --this.turnCount > 0; } } @@ -2726,16 +3258,27 @@ export class SyrupBombTag extends BattlerTag { /** * Telekinesis raises the target into the air for three turns and causes all moves used against the target (aside from OHKO moves) to hit the target unless the target is in a semi-invulnerable state from Fly/Dig. * The first effect is provided by {@linkcode FloatingTag}, the accuracy-bypass effect is provided by TelekinesisTag - * The effects of Telekinesis can be baton passed to a teammate. Unlike the mainline games, Telekinesis can be baton-passed to Mega Gengar. + * The effects of Telekinesis can be baton passed to a teammate. * @see {@link https://bulbapedia.bulbagarden.net/wiki/Telekinesis_(move) | Moves.TELEKINESIS} */ export class TelekinesisTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.TELEKINESIS, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE ], 3, sourceMove, undefined, true); + super( + BattlerTagType.TELEKINESIS, + [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], + 3, + sourceMove, + undefined, + true, + ); } - override onAdd(pokemon: Pokemon) { - pokemon.scene.queueMessage(i18next.t("battlerTags:telekinesisOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + override onAdd(pokemon: Pokemon) { + globalScene.queueMessage( + i18next.t("battlerTags:telekinesisOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } } @@ -2750,12 +3293,20 @@ export class PowerTrickTag extends BattlerTag { onAdd(pokemon: Pokemon): void { this.swapStat(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:powerTrickActive", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:powerTrickActive", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } onRemove(pokemon: Pokemon): void { this.swapStat(pokemon); - pokemon.scene.queueMessage(i18next.t("battlerTags:powerTrickActive", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("battlerTags:powerTrickActive", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -2777,12 +3328,108 @@ export class PowerTrickTag extends BattlerTag { } } +/** + * Tag associated with the move Grudge. + * If this tag is active when the bearer faints from an opponent's move, the tag reduces that move's PP to 0. + * Otherwise, it lapses when the bearer makes another move. + */ +export class GrudgeTag extends BattlerTag { + constructor() { + super(BattlerTagType.GRUDGE, [BattlerTagLapseType.CUSTOM, BattlerTagLapseType.PRE_MOVE], 1, Moves.GRUDGE); + } + + onAdd(pokemon: Pokemon) { + super.onAdd(pokemon); + globalScene.queueMessage( + i18next.t("battlerTags:grudgeOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + } + + /** + * Activates Grudge's special effect on the attacking Pokemon and lapses the tag. + * @param pokemon + * @param lapseType + * @param sourcePokemon {@linkcode Pokemon} the source of the move that fainted the tag's bearer + * @returns `false` if Grudge activates its effect or lapses + */ + override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType, sourcePokemon?: Pokemon): boolean { + if (lapseType === BattlerTagLapseType.CUSTOM && sourcePokemon) { + if (sourcePokemon.isActive() && pokemon.isOpponent(sourcePokemon)) { + const lastMove = pokemon.turnData.attacksReceived[0]; + const lastMoveData = sourcePokemon.getMoveset().find(m => m?.moveId === lastMove.move); + if (lastMoveData && lastMove.move !== Moves.STRUGGLE) { + lastMoveData.ppUsed = lastMoveData.getMovePp(); + globalScene.queueMessage( + i18next.t("battlerTags:grudgeLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: lastMoveData.getName(), + }), + ); + } + } + return false; + } + return super.lapse(pokemon, lapseType); + } +} + +/** + * Tag used to heal the user of Psycho Shift of its status effect if Psycho Shift succeeds in transferring its status effect to the target Pokemon + */ +export class PsychoShiftTag extends BattlerTag { + constructor() { + super(BattlerTagType.PSYCHO_SHIFT, BattlerTagLapseType.AFTER_MOVE, 1, Moves.PSYCHO_SHIFT); + } + + /** + * Heals Psycho Shift's user of its status effect after it uses a move + * @returns `false` to expire the tag immediately + */ + override lapse(pokemon: Pokemon, _lapseType: BattlerTagLapseType): boolean { + if (pokemon.status && pokemon.isActive(true)) { + globalScene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + pokemon.resetStatus(); + pokemon.updateInfo(); + } + return false; + } +} + +/** + * Tag associated with the move Magic Coat. + */ +export class MagicCoatTag extends BattlerTag { + constructor() { + super(BattlerTagType.MAGIC_COAT, BattlerTagLapseType.TURN_END, 1, Moves.MAGIC_COAT); + } + + /** + * Queues the "[PokemonName] shrouded itself with Magic Coat" message when the tag is added. + * @param pokemon - The target {@linkcode Pokemon} + */ + override onAdd(pokemon: Pokemon) { + // "{pokemonNameWithAffix} shrouded itself with Magic Coat!" + globalScene.queueMessage( + i18next.t("battlerTags:magicCoatOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); + } +} + /** * Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID. * @param sourceId - The ID of the pokemon adding the tag * @returns The corresponding {@linkcode BattlerTag} object. */ -export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag { +export function getBattlerTag( + tagType: BattlerTagType, + turnCount: number, + sourceMove: Moves, + sourceId: number, +): BattlerTag { switch (tagType) { case BattlerTagType.RECHARGING: return new RechargingTag(sourceMove); @@ -2800,6 +3447,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: @@ -2855,7 +3504,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.BURNING_BULWARK: return new ContactBurnProtectedTag(sourceMove); case BattlerTagType.ENDURING: - return new EnduringTag(sourceMove); + return new EnduringTag(tagType, BattlerTagLapseType.TURN_END, sourceMove); + case BattlerTagType.ENDURE_TOKEN: + return new EnduringTag(tagType, BattlerTagLapseType.AFTER_HIT, sourceMove); case BattlerTagType.STURDY: return new SturdyTag(sourceMove); case BattlerTagType.PERISH_SONG: @@ -2867,7 +3518,12 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.SLOW_START: return new SlowStartTag(); case BattlerTagType.PROTOSYNTHESIS: - return new WeatherHighestStatBoostTag(tagType, Abilities.PROTOSYNTHESIS, WeatherType.SUNNY, WeatherType.HARSH_SUN); + return new WeatherHighestStatBoostTag( + tagType, + Abilities.PROTOSYNTHESIS, + WeatherType.SUNNY, + WeatherType.HARSH_SUN, + ); case BattlerTagType.QUARK_DRIVE: return new TerrainHighestStatBoostTag(tagType, Abilities.QUARK_DRIVE, TerrainType.ELECTRIC); case BattlerTagType.FLYING: @@ -2876,7 +3532,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.HIDDEN: return new SemiInvulnerableTag(tagType, turnCount, sourceMove); case BattlerTagType.FIRE_BOOST: - return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); + return new TypeBoostTag(tagType, sourceMove, PokemonType.FIRE, 1.5, false); case BattlerTagType.CRIT_BOOST: return new CritBoostTag(tagType, sourceMove); case BattlerTagType.DRAGON_CHEER: @@ -2902,9 +3558,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.CURSED: return new CursedTag(sourceId); case BattlerTagType.CHARGED: - return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); + return new TypeBoostTag(tagType, sourceMove, PokemonType.ELECTRIC, 2, true); case BattlerTagType.FLOATING: - return new FloatingTag(tagType, sourceMove); + return new FloatingTag(tagType, sourceMove, turnCount); case BattlerTagType.MINIMIZED: return new MinimizeTag(); case BattlerTagType.DESTINY_BOND: @@ -2913,6 +3569,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new IceFaceBlockDamageTag(tagType); case BattlerTagType.DISGUISE: return new FormBlockDamageTag(tagType); + case BattlerTagType.COMMANDED: + return new CommandedTag(sourceId); case BattlerTagType.STOCKPILING: return new StockpilingTag(sourceMove); case BattlerTagType.OCTOLOCK: @@ -2920,9 +3578,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.DISABLED: return new DisabledTag(sourceId); case BattlerTagType.IGNORE_GHOST: - return new ExposedTag(tagType, sourceMove, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ]); + return new ExposedTag(tagType, sourceMove, PokemonType.GHOST, [PokemonType.NORMAL, PokemonType.FIGHTING]); case BattlerTagType.IGNORE_DARK: - return new ExposedTag(tagType, sourceMove, Type.DARK, [ Type.PSYCHIC ]); + return new ExposedTag(tagType, sourceMove, PokemonType.DARK, [PokemonType.PSYCHIC]); case BattlerTagType.GULP_MISSILE_ARROKUDA: case BattlerTagType.GULP_MISSILE_PIKACHU: return new GulpMissileTag(tagType, sourceMove); @@ -2934,6 +3592,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new ThroatChoppedTag(); case BattlerTagType.GORILLA_TACTICS: return new GorillaTacticsTag(); + case BattlerTagType.UNBURDEN: + return new UnburdenTag(); case BattlerTagType.SUBSTITUTE: return new SubstituteTag(sourceMove, sourceId); case BattlerTagType.AUTOTOMIZED: @@ -2954,6 +3614,12 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new TelekinesisTag(sourceMove); case BattlerTagType.POWER_TRICK: return new PowerTrickTag(sourceMove, sourceId); + case BattlerTagType.GRUDGE: + return new GrudgeTag(); + case BattlerTagType.PSYCHO_SHIFT: + return new PsychoShiftTag(); + case BattlerTagType.MAGIC_COAT: + return new MagicCoatTag(); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); @@ -2961,10 +3627,10 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source } /** -* When given a battler tag or json representing one, creates an actual BattlerTag object with the same data. -* @param {BattlerTag | any} source A battler tag -* @return {BattlerTag} The valid battler tag -*/ + * When given a battler tag or json representing one, creates an actual BattlerTag object with the same data. + * @param {BattlerTag | any} source A battler tag + * @return {BattlerTag} The valid battler tag + */ export function loadBattlerTag(source: BattlerTag | any): BattlerTag { const tag = getBattlerTag(source.tagType, source.turnCount, source.sourceMove, source.sourceId); tag.loadTag(source); @@ -2974,17 +3640,17 @@ export function loadBattlerTag(source: BattlerTag | any): BattlerTag { /** * Helper function to verify that the current phase is a MoveEffectPhase and provide quick access to commonly used fields * - * @param pokemon {@linkcode Pokemon} The Pokémon used to access the current phase + * @param _pokemon {@linkcode Pokemon} The Pokémon used to access the current phase * @returns null if current phase is not MoveEffectPhase, otherwise Object containing the {@linkcode MoveEffectPhase}, and its * corresponding {@linkcode Move} and user {@linkcode Pokemon} */ -function getMoveEffectPhaseData(pokemon: Pokemon): {phase: MoveEffectPhase, attacker: Pokemon, move: Move} | null { - const phase = pokemon.scene.getCurrentPhase(); +function getMoveEffectPhaseData(_pokemon: Pokemon): { phase: MoveEffectPhase; attacker: Pokemon; move: Move } | null { + const phase = globalScene.getCurrentPhase(); if (phase instanceof MoveEffectPhase) { return { - phase : phase, - attacker : phase.getPokemon(), - move : phase.move.getMove() + phase: phase, + attacker: phase.getPokemon(), + move: phase.move.getMove(), }; } return null; diff --git a/src/data/berry.ts b/src/data/berry.ts index 7243c4c1b2e..ed8ae8d2b62 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -1,14 +1,22 @@ import { getPokemonNameWithAffix } from "../messages"; -import Pokemon, { HitResult } from "../field/pokemon"; +import type Pokemon from "../field/pokemon"; +import { HitResult } from "../field/pokemon"; import { getStatusEffectHealText } from "./status-effect"; import * as Utils from "../utils"; -import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability"; +import { + DoubleBerryEffectAbAttr, + PostItemLostAbAttr, + ReduceBerryUseThresholdAbAttr, + applyAbAttrs, + applyPostItemLostAbAttrs, +} from "./ability"; import i18next from "i18next"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { Stat, type BattleStat } from "#app/enums/stat"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; +import { globalScene } from "#app/global-scene"; export function getBerryName(berryType: BerryType): string { return i18next.t(`berry:${BerryType[berryType]}.name`); @@ -27,7 +35,8 @@ export function getBerryPredicate(berryType: BerryType): BerryPredicate { case BerryType.LUM: return (pokemon: Pokemon) => !!pokemon.status || !!pokemon.getTag(BattlerTagType.CONFUSED); case BerryType.ENIGMA: - return (pokemon: Pokemon) => !!pokemon.turnData.attacksReceived.filter(a => a.result === HitResult.SUPER_EFFECTIVE).length; + return (pokemon: Pokemon) => + !!pokemon.turnData.attacksReceived.filter(a => a.result === HitResult.SUPER_EFFECTIVE).length; case BerryType.LIECHI: case BerryType.GANLON: case BerryType.PETAYA: @@ -61,38 +70,49 @@ export function getBerryPredicate(berryType: BerryType): BerryPredicate { } } -export type BerryEffectFunc = (pokemon: Pokemon) => void; +export type BerryEffectFunc = (pokemon: Pokemon, berryOwner?: Pokemon) => void; export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { switch (berryType) { case BerryType.SITRUS: case BerryType.ENIGMA: - return (pokemon: Pokemon) => { + return (pokemon: Pokemon, berryOwner?: Pokemon) => { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } const hpHealed = new Utils.NumberHolder(Utils.toDmgValue(pokemon.getMaxHp() / 4)); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, hpHealed); - pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - hpHealed.value, i18next.t("battle:hpHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: getBerryName(berryType) }), true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + hpHealed.value, + i18next.t("battle:hpHealBerry", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + berryName: getBerryName(berryType), + }), + true, + ), + ); + applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); }; case BerryType.LUM: - return (pokemon: Pokemon) => { + return (pokemon: Pokemon, berryOwner?: Pokemon) => { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } if (pokemon.status) { - pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + globalScene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); } pokemon.resetStatus(true, true); pokemon.updateInfo(); + applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); }; case BerryType.LIECHI: case BerryType.GANLON: case BerryType.PETAYA: case BerryType.APICOT: case BerryType.SALAC: - return (pokemon: Pokemon) => { + return (pokemon: Pokemon, berryOwner?: Pokemon) => { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } @@ -100,34 +120,46 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { const stat: BattleStat = berryType - BerryType.ENIGMA; const statStages = new Utils.NumberHolder(1); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statStages); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], statStages.value)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [stat], statStages.value)); + applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); }; case BerryType.LANSAT: - return (pokemon: Pokemon) => { + return (pokemon: Pokemon, berryOwner?: Pokemon) => { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } pokemon.addTag(BattlerTagType.CRIT_BOOST); + applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); }; case BerryType.STARF: - return (pokemon: Pokemon) => { + return (pokemon: Pokemon, berryOwner?: Pokemon) => { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } const randStat = Utils.randSeedInt(Stat.SPD, Stat.ATK); const stages = new Utils.NumberHolder(2); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, stages); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ randStat ], stages.value)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [randStat], stages.value)); + applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); }; case BerryType.LEPPA: - return (pokemon: Pokemon) => { + return (pokemon: Pokemon, berryOwner?: Pokemon) => { if (pokemon.battleData) { pokemon.battleData.berriesEaten.push(berryType); } - const ppRestoreMove = pokemon.getMoveset().find(m => !m?.getPpRatio()) ? pokemon.getMoveset().find(m => !m?.getPpRatio()) : pokemon.getMoveset().find(m => m!.getPpRatio() < 1); // TODO: is this bang correct? + const ppRestoreMove = pokemon.getMoveset().find(m => !m?.getPpRatio()) + ? pokemon.getMoveset().find(m => !m?.getPpRatio()) + : pokemon.getMoveset().find(m => m!.getPpRatio() < 1); // TODO: is this bang correct? if (ppRestoreMove !== undefined) { - ppRestoreMove!.ppUsed = Math.max(ppRestoreMove!.ppUsed - 10, 0); - pokemon.scene.queueMessage(i18next.t("battle:ppHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: ppRestoreMove!.getName(), berryName: getBerryName(berryType) })); + ppRestoreMove!.ppUsed = Math.max(ppRestoreMove!.ppUsed - 10, 0); + globalScene.queueMessage( + i18next.t("battle:ppHealBerry", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: ppRestoreMove!.getName(), + berryName: getBerryName(berryType), + }), + ); + applyPostItemLostAbAttrs(PostItemLostAbAttr, berryOwner ?? pokemon, false); } }; } diff --git a/src/data/challenge.ts b/src/data/challenge.ts index a64a90e5d14..b9d817836c3 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -1,21 +1,26 @@ import * as Utils from "#app/utils"; import i18next from "i18next"; -import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data"; -import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import type { DexAttrProps, GameData } from "#app/system/game-data"; +import { defaultStarterSpecies } from "#app/system/game-data"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; -import Pokemon, { PokemonMove } from "#app/field/pokemon"; -import { BattleType, FixedBattleConfig } from "#app/battle"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; +import type { FixedBattleConfig } from "#app/battle"; +import { ClassicFixedBossWaves, BattleType, getRandomTrainerFunc } from "#app/battle"; import Trainer, { TrainerVariant } from "#app/field/trainer"; -import { GameMode } from "#app/game-mode"; -import { Type } from "#app/data/type"; +import type { GameMode } from "#app/game-mode"; +import { PokemonType } from "#enums/pokemon-type"; import { Challenges } from "#enums/challenges"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; -import { Nature } from "#app/data/nature"; -import { Moves } from "#enums/moves"; +import { Nature } from "#enums/nature"; +import type { Moves } from "#enums/moves"; import { TypeColor, TypeShadow } from "#enums/color"; import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { pokemonFormChanges } from "#app/data/pokemon-forms"; +import { ModifierTier } from "#app/modifier/modifier-tier"; /** A constant for the default max cost of the starting party before a run */ const DEFAULT_PARTY_MAX_COST = 10; @@ -28,37 +33,37 @@ export enum ChallengeType { /** * Challenges which modify what starters you can choose * @see {@link Challenge.applyStarterChoice} - */ + */ STARTER_CHOICE, /** * Challenges which modify how many starter points you have * @see {@link Challenge.applyStarterPoints} - */ + */ STARTER_POINTS, /** * Challenges which modify how many starter points you have * @see {@link Challenge.applyStarterPointCost} - */ + */ STARTER_COST, /** * Challenges which modify your starters in some way * @see {@link Challenge.applyStarterModify} - */ + */ STARTER_MODIFY, /** * Challenges which limit which pokemon you can have in battle. * @see {@link Challenge.applyPokemonInBattle} - */ + */ POKEMON_IN_BATTLE, /** * Adds or modifies the fixed battles in a run * @see {@link Challenge.applyFixedBattle} - */ + */ FIXED_BATTLES, /** * Modifies the effectiveness of Type matchups in battle * @see {@linkcode Challenge.applyTypeEffectiveness} - */ + */ TYPE_EFFECTIVENESS, /** * Modifies what level the AI pokemon are. UNIMPLEMENTED. @@ -84,6 +89,10 @@ export enum ChallengeType { * Modifies what weight AI pokemon have when generating movesets. UNIMPLEMENTED. */ MOVE_WEIGHT, + /** + * Modifies what the pokemon stats for Flip Stat Mode. + */ + FLIP_STAT, } /** @@ -96,7 +105,7 @@ export enum MoveSourceType { GREAT_TM, ULTRA_TM, COMMON_EGG, - RARE_EGG + RARE_EGG, } /** @@ -105,17 +114,17 @@ export enum MoveSourceType { export abstract class Challenge { public id: Challenges; // The id of the challenge - public value: integer; // The "strength" of the challenge, all challenges have a numerical value. - public maxValue: integer; // The maximum strength of the challenge. - public severity: integer; // The current severity of the challenge. Some challenges have multiple severities in addition to strength. - public maxSeverity: integer; // The maximum severity of the challenge. + public value: number; // The "strength" of the challenge, all challenges have a numerical value. + public maxValue: number; // The maximum strength of the challenge. + public severity: number; // The current severity of the challenge. Some challenges have multiple severities in addition to strength. + public maxSeverity: number; // The maximum severity of the challenge. public conditions: ChallengeCondition[]; /** * @param id {@link Challenges} The enum value for the challenge */ - constructor(id: Challenges, maxValue: integer = Number.MAX_SAFE_INTEGER) { + constructor(id: Challenges, maxValue: number = Number.MAX_SAFE_INTEGER) { this.id = id; this.value = 0; @@ -138,7 +147,10 @@ export abstract class Challenge { * @returns {@link string} The i18n key for this challenge */ geti18nKey(): string { - return Challenges[this.id].split("_").map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + return Challenges[this.id] + .split("_") + .map((f, i) => (i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase())) + .join(""); } /** @@ -170,7 +182,7 @@ export abstract class Challenge { /** * Returns the textual representation of a challenge's current value. - * @param overrideValue {@link integer} The value to check for. If undefined, gets the current value. + * @param overrideValue {@link number} The value to check for. If undefined, gets the current value. * @returns {@link string} The localised name for the current value. */ getValue(overrideValue?: number): string { @@ -180,12 +192,12 @@ export abstract class Challenge { /** * Returns the description of a challenge's current value. - * @param overrideValue {@link integer} The value to check for. If undefined, gets the current value. + * @param overrideValue {@link number} The value to check for. If undefined, gets the current value. * @returns {@link string} The localised description for the current value. */ getDescription(overrideValue?: number): string { const value = overrideValue ?? this.value; - return `${i18next.t([ `challenges:${this.geti18nKey()}.desc.${value}`, `challenges:${this.geti18nKey()}.desc` ])}`; + return `${i18next.t([`challenges:${this.geti18nKey()}.desc.${value}`, `challenges:${this.geti18nKey()}.desc`])}`; } /** @@ -247,7 +259,7 @@ export abstract class Challenge { * Gets the "difficulty" value of this challenge. * @returns {@link integer} The difficulty value. */ - getDifficulty(): integer { + getDifficulty(): number { return this.value; } @@ -255,7 +267,7 @@ export abstract class Challenge { * Gets the minimum difficulty added by this challenge. * @returns {@link integer} The difficulty value. */ - getMinDifficulty(): integer { + getMinDifficulty(): number { return 0; } @@ -264,98 +276,103 @@ export abstract class Challenge { * @param source The source challenge or json. * @returns This challenge. */ - static loadChallenge(source: Challenge | any): Challenge { + static loadChallenge(_source: Challenge | any): Challenge { throw new Error("Method not implemented! Use derived class"); } /** * An apply function for STARTER_CHOICE challenges. Derived classes should alter this. - * @param pokemon {@link PokemonSpecies} The pokemon to check the validity of. - * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. - * @param dexAttr {@link DexAttrProps} The dex attributes of the pokemon. - * @param soft {@link boolean} If true, allow it if it could become a valid pokemon. + * @param _pokemon {@link PokemonSpecies} The pokemon to check the validity of. + * @param _valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. + * @param _dexAttr {@link DexAttrProps} The dex attributes of the pokemon. + * @param _soft {@link boolean} If true, allow it if it could become a valid pokemon. * @returns {@link boolean} Whether this function did anything. */ - applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean { + applyStarterChoice( + _pokemon: PokemonSpecies, + _valid: Utils.BooleanHolder, + _dexAttr: DexAttrProps, + _soft = false, + ): boolean { return false; } /** * An apply function for STARTER_POINTS challenges. Derived classes should alter this. - * @param points {@link Utils.NumberHolder} The amount of points you have available. + * @param _points {@link Utils.NumberHolder} The amount of points you have available. * @returns {@link boolean} Whether this function did anything. */ - applyStarterPoints(points: Utils.NumberHolder): boolean { + applyStarterPoints(_points: Utils.NumberHolder): boolean { return false; } /** * An apply function for STARTER_COST challenges. Derived classes should alter this. - * @param species {@link Species} The pokemon to change the cost of. - * @param cost {@link Utils.NumberHolder} The cost of the starter. + * @param _species {@link Species} The pokemon to change the cost of. + * @param _cost {@link Utils.NumberHolder} The cost of the starter. * @returns {@link boolean} Whether this function did anything. */ - applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean { + applyStarterCost(_species: Species, _cost: Utils.NumberHolder): boolean { return false; } /** * An apply function for STARTER_MODIFY challenges. Derived classes should alter this. - * @param pokemon {@link Pokemon} The starter pokemon to modify. + * @param _pokemon {@link Pokemon} The starter pokemon to modify. * @returns {@link boolean} Whether this function did anything. */ - applyStarterModify(pokemon: Pokemon): boolean { + applyStarterModify(_pokemon: Pokemon): boolean { return false; } /** * An apply function for POKEMON_IN_BATTLE challenges. Derived classes should alter this. - * @param pokemon {@link Pokemon} The pokemon to check the validity of. - * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. + * @param _pokemon {@link Pokemon} The pokemon to check the validity of. + * @param _valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. * @returns {@link boolean} Whether this function did anything. */ - applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { + applyPokemonInBattle(_pokemon: Pokemon, _valid: Utils.BooleanHolder): boolean { return false; } /** * An apply function for FIXED_BATTLE challenges. Derived classes should alter this. - * @param waveIndex {@link Number} The current wave index. - * @param battleConfig {@link FixedBattleConfig} The battle config to modify. + * @param _waveIndex {@link Number} The current wave index. + * @param _battleConfig {@link FixedBattleConfig} The battle config to modify. * @returns {@link boolean} Whether this function did anything. */ - applyFixedBattle(waveIndex: Number, battleConfig: FixedBattleConfig): boolean { + applyFixedBattle(_waveIndex: number, _battleConfig: FixedBattleConfig): boolean { return false; } /** * An apply function for TYPE_EFFECTIVENESS challenges. Derived classes should alter this. - * @param effectiveness {@linkcode Utils.NumberHolder} The current effectiveness of the move. + * @param _effectiveness {@linkcode Utils.NumberHolder} The current effectiveness of the move. * @returns Whether this function did anything. */ - applyTypeEffectiveness(effectiveness: Utils.NumberHolder): boolean { + applyTypeEffectiveness(_effectiveness: Utils.NumberHolder): boolean { return false; } /** * An apply function for AI_LEVEL challenges. Derived classes should alter this. - * @param level {@link Utils.IntegerHolder} The generated level. - * @param levelCap {@link Number} The current level cap. - * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. - * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. + * @param _level {@link Utils.NumberHolder} The generated level. + * @param _levelCap {@link Number} The current level cap. + * @param _isTrainer {@link Boolean} Whether this is a trainer pokemon. + * @param _isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. * @returns {@link boolean} Whether this function did anything. */ - applyLevelChange(level: Utils.IntegerHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean { + applyLevelChange(_level: Utils.NumberHolder, _levelCap: number, _isTrainer: boolean, _isBoss: boolean): boolean { return false; } /** * An apply function for AI_MOVE_SLOTS challenges. Derived classes should alter this. * @param pokemon {@link Pokemon} The pokemon that is being considered. - * @param moveSlots {@link Utils.IntegerHolder} The amount of move slots. + * @param moveSlots {@link Utils.NumberHolder} The amount of move slots. * @returns {@link boolean} Whether this function did anything. */ - applyMoveSlot(pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean { + applyMoveSlot(_pokemon: Pokemon, _moveSlots: Utils.NumberHolder): boolean { return false; } @@ -365,7 +382,7 @@ export abstract class Challenge { * @param hasPassive {@link Utils.BooleanHolder} Whether it should have its passive. * @returns {@link boolean} Whether this function did anything. */ - applyPassiveAccess(pokemon: Pokemon, hasPassive: Utils.BooleanHolder): boolean { + applyPassiveAccess(_pokemon: Pokemon, _hasPassive: Utils.BooleanHolder): boolean { return false; } @@ -374,31 +391,46 @@ export abstract class Challenge { * @param gameMode {@link GameMode} The current game mode. * @returns {@link boolean} Whether this function did anything. */ - applyGameModeModify(gameMode: GameMode): boolean { + applyGameModeModify(_gameMode: GameMode): boolean { return false; } /** * An apply function for MOVE_ACCESS. Derived classes should alter this. - * @param pokemon {@link Pokemon} What pokemon would learn the move. - * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. - * @param move {@link Moves} The move in question. - * @param level {@link Utils.IntegerHolder} The level threshold for access. + * @param _pokemon {@link Pokemon} What pokemon would learn the move. + * @param _moveSource {@link MoveSourceType} What source the pokemon would get the move from. + * @param _move {@link Moves} The move in question. + * @param _level {@link Utils.NumberHolder} The level threshold for access. * @returns {@link boolean} Whether this function did anything. */ - applyMoveAccessLevel(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean { + applyMoveAccessLevel( + _pokemon: Pokemon, + _moveSource: MoveSourceType, + _move: Moves, + _level: Utils.NumberHolder, + ): boolean { return false; } /** * An apply function for MOVE_WEIGHT. Derived classes should alter this. - * @param pokemon {@link Pokemon} What pokemon would learn the move. - * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. - * @param move {@link Moves} The move in question. - * @param weight {@link Utils.IntegerHolder} The base weight of the move + * @param _pokemon {@link Pokemon} What pokemon would learn the move. + * @param _moveSource {@link MoveSourceType} What source the pokemon would get the move from. + * @param _move {@link Moves} The move in question. + * @param _weight {@link Utils.NumberHolder} The base weight of the move * @returns {@link boolean} Whether this function did anything. */ - applyMoveWeight(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean { + applyMoveWeight(_pokemon: Pokemon, _moveSource: MoveSourceType, _move: Moves, _level: Utils.NumberHolder): boolean { + return false; + } + + /** + * An apply function for FlipStats. Derived classes should alter this. + * @param _pokemon {@link Pokemon} What pokemon would learn the move. + * @param _baseStats What are the stats to flip. + * @returns {@link boolean} Whether this function did anything. + */ + applyFlipStat(_pokemon: Pokemon, _baseStats: number[]) { return false; } } @@ -413,10 +445,15 @@ export class SingleGenerationChallenge extends Challenge { super(Challenges.SINGLE_GENERATION, 9); } - applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean { - const generations = [ pokemon.generation ]; + applyStarterChoice( + pokemon: PokemonSpecies, + valid: Utils.BooleanHolder, + _dexAttr: DexAttrProps, + soft = false, + ): boolean { + const generations = [pokemon.generation]; if (soft) { - const speciesToCheck = [ pokemon.speciesId ]; + const speciesToCheck = [pokemon.speciesId]; while (speciesToCheck.length) { const checking = speciesToCheck.pop(); if (checking && pokemonEvolutions.hasOwnProperty(checking)) { @@ -436,40 +473,210 @@ export class SingleGenerationChallenge extends Challenge { } applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { - const baseGeneration = pokemon.species.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.species.speciesId).generation; - const fusionGeneration = pokemon.isFusion() ? pokemon.fusionSpecies?.speciesId === Species.VICTINI ? 5 : getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; // TODO: is the bang on fusionSpecies correct? - if (pokemon.isPlayer() && (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value))) { + const baseGeneration = getPokemonSpecies(pokemon.species.speciesId).generation; + const fusionGeneration = pokemon.isFusion() ? getPokemonSpecies(pokemon.fusionSpecies!.speciesId).generation : 0; // TODO: is the bang on fusionSpecies correct? + if ( + pokemon.isPlayer() && + (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value)) + ) { valid.value = false; return true; } return false; } - applyFixedBattle(waveIndex: Number, battleConfig: FixedBattleConfig): boolean { - let trainerTypes: TrainerType[] = []; + applyFixedBattle(waveIndex: number, battleConfig: FixedBattleConfig): boolean { + let trainerTypes: (TrainerType | TrainerType[])[] = []; + const evilTeamWaves: number[] = [ + ClassicFixedBossWaves.EVIL_GRUNT_1, + ClassicFixedBossWaves.EVIL_GRUNT_2, + ClassicFixedBossWaves.EVIL_GRUNT_3, + ClassicFixedBossWaves.EVIL_ADMIN_1, + ClassicFixedBossWaves.EVIL_GRUNT_4, + ClassicFixedBossWaves.EVIL_ADMIN_2, + ClassicFixedBossWaves.EVIL_BOSS_1, + ClassicFixedBossWaves.EVIL_BOSS_2, + ]; + const evilTeamGrunts = [ + [TrainerType.ROCKET_GRUNT], + [TrainerType.ROCKET_GRUNT], + [TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT], + [TrainerType.GALACTIC_GRUNT], + [TrainerType.PLASMA_GRUNT], + [TrainerType.FLARE_GRUNT], + [TrainerType.AETHER_GRUNT, TrainerType.SKULL_GRUNT], + [TrainerType.MACRO_GRUNT], + [TrainerType.STAR_GRUNT], + ]; + const evilTeamAdmins = [ + [TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL], + [TrainerType.ARCHER, TrainerType.ARIANA, TrainerType.PROTON, TrainerType.PETREL], + [ + [TrainerType.TABITHA, TrainerType.COURTNEY], + [TrainerType.MATT, TrainerType.SHELLY], + ], + [TrainerType.JUPITER, TrainerType.MARS, TrainerType.SATURN], + [TrainerType.ZINZOLIN, TrainerType.COLRESS], + [TrainerType.XEROSIC, TrainerType.BRYONY], + [TrainerType.FABA, TrainerType.PLUMERIA], + [TrainerType.OLEANA], + [TrainerType.GIACOMO, TrainerType.MELA, TrainerType.ATTICUS, TrainerType.ORTEGA, TrainerType.ERI], + ]; + const evilTeamBosses = [ + [TrainerType.ROCKET_BOSS_GIOVANNI_1], + [TrainerType.ROCKET_BOSS_GIOVANNI_1], + [TrainerType.MAXIE, TrainerType.ARCHIE], + [TrainerType.CYRUS], + [TrainerType.GHETSIS], + [TrainerType.LYSANDRE], + [TrainerType.LUSAMINE, TrainerType.GUZMA], + [TrainerType.ROSE], + [TrainerType.PENNY], + ]; + const evilTeamBossRematches = [ + [TrainerType.ROCKET_BOSS_GIOVANNI_2], + [TrainerType.ROCKET_BOSS_GIOVANNI_2], + [TrainerType.MAXIE_2, TrainerType.ARCHIE_2], + [TrainerType.CYRUS_2], + [TrainerType.GHETSIS_2], + [TrainerType.LYSANDRE_2], + [TrainerType.LUSAMINE_2, TrainerType.GUZMA_2], + [TrainerType.ROSE_2], + [TrainerType.PENNY_2], + ]; switch (waveIndex) { - case 182: - trainerTypes = [ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, Utils.randSeedItem([ TrainerType.HALA, TrainerType.MOLAYNE ]), TrainerType.MARNIE_ELITE, TrainerType.RIKA ]; + case ClassicFixedBossWaves.EVIL_GRUNT_1: + trainerTypes = evilTeamGrunts[this.value - 1]; + battleConfig.setBattleType(BattleType.TRAINER).setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)); + return true; + case ClassicFixedBossWaves.EVIL_GRUNT_2: + case ClassicFixedBossWaves.EVIL_GRUNT_3: + case ClassicFixedBossWaves.EVIL_GRUNT_4: + trainerTypes = evilTeamGrunts[this.value - 1]; break; - case 184: - trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ]; + case ClassicFixedBossWaves.EVIL_ADMIN_1: + case ClassicFixedBossWaves.EVIL_ADMIN_2: + trainerTypes = evilTeamAdmins[this.value - 1]; break; - case 186: - trainerTypes = [ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, Utils.randSeedItem([ TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE ]), TrainerType.LARRY_ELITE ]; + case ClassicFixedBossWaves.EVIL_BOSS_1: + trainerTypes = evilTeamBosses[this.value - 1]; + battleConfig + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }); + return true; + case ClassicFixedBossWaves.EVIL_BOSS_2: + trainerTypes = evilTeamBossRematches[this.value - 1]; + battleConfig + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)) + .setCustomModifierRewards({ + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + allowLuckUpgrades: false, + }); + return true; + case ClassicFixedBossWaves.ELITE_FOUR_1: + trainerTypes = [ + TrainerType.LORELEI, + TrainerType.WILL, + TrainerType.SIDNEY, + TrainerType.AARON, + TrainerType.SHAUNTAL, + TrainerType.MALVA, + Utils.randSeedItem([TrainerType.HALA, TrainerType.MOLAYNE]), + TrainerType.MARNIE_ELITE, + TrainerType.RIKA, + ]; break; - case 188: - trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ]; + case ClassicFixedBossWaves.ELITE_FOUR_2: + trainerTypes = [ + TrainerType.BRUNO, + TrainerType.KOGA, + TrainerType.PHOEBE, + TrainerType.BERTHA, + TrainerType.MARSHAL, + TrainerType.SIEBOLD, + TrainerType.OLIVIA, + TrainerType.NESSA_ELITE, + TrainerType.POPPY, + ]; break; - case 190: - trainerTypes = [ TrainerType.BLUE, Utils.randSeedItem([ TrainerType.RED, TrainerType.LANCE_CHAMPION ]), Utils.randSeedItem([ TrainerType.STEVEN, TrainerType.WALLACE ]), TrainerType.CYNTHIA, Utils.randSeedItem([ TrainerType.ALDER, TrainerType.IRIS ]), TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, Utils.randSeedItem([ TrainerType.GEETA, TrainerType.NEMONA ]) ]; + case ClassicFixedBossWaves.ELITE_FOUR_3: + trainerTypes = [ + TrainerType.AGATHA, + TrainerType.BRUNO, + TrainerType.GLACIA, + TrainerType.FLINT, + TrainerType.GRIMSLEY, + TrainerType.WIKSTROM, + TrainerType.ACEROLA, + Utils.randSeedItem([TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE]), + TrainerType.LARRY_ELITE, + ]; + break; + case ClassicFixedBossWaves.ELITE_FOUR_4: + trainerTypes = [ + TrainerType.LANCE, + TrainerType.KAREN, + TrainerType.DRAKE, + TrainerType.LUCIAN, + TrainerType.CAITLIN, + TrainerType.DRASNA, + TrainerType.KAHILI, + TrainerType.RAIHAN_ELITE, + TrainerType.HASSEL, + ]; + break; + case ClassicFixedBossWaves.CHAMPION: + trainerTypes = [ + TrainerType.BLUE, + Utils.randSeedItem([TrainerType.RED, TrainerType.LANCE_CHAMPION]), + Utils.randSeedItem([TrainerType.STEVEN, TrainerType.WALLACE]), + TrainerType.CYNTHIA, + Utils.randSeedItem([TrainerType.ALDER, TrainerType.IRIS]), + TrainerType.DIANTHA, + Utils.randSeedItem([TrainerType.KUKUI, TrainerType.HAU]), + Utils.randSeedItem([TrainerType.LEON, TrainerType.MUSTARD]), + Utils.randSeedItem([TrainerType.GEETA, TrainerType.NEMONA]), + ]; break; } if (trainerTypes.length === 0) { return false; - } else { - battleConfig.setBattleType(BattleType.TRAINER).setGetTrainerFunc(scene => new Trainer(scene, trainerTypes[this.value - 1], TrainerVariant.DEFAULT)); + } + if (evilTeamWaves.includes(waveIndex)) { + battleConfig + .setBattleType(BattleType.TRAINER) + .setSeedOffsetWave(ClassicFixedBossWaves.EVIL_GRUNT_1) + .setGetTrainerFunc(getRandomTrainerFunc(trainerTypes, true)); return true; } + if (waveIndex >= ClassicFixedBossWaves.ELITE_FOUR_1 && waveIndex <= ClassicFixedBossWaves.CHAMPION) { + const ttypes = trainerTypes as TrainerType[]; + battleConfig + .setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(() => new Trainer(ttypes[this.value - 1], TrainerVariant.DEFAULT)); + return true; + } + return false; } /** @@ -502,10 +709,11 @@ export class SingleGenerationChallenge extends Challenge { if (value === 0) { return i18next.t("challenges:singleGeneration.desc_default"); } - return i18next.t("challenges:singleGeneration.desc", { gen: i18next.t(`challenges:singleGeneration.gen_${value}`) }); + return i18next.t("challenges:singleGeneration.desc", { + gen: i18next.t(`challenges:singleGeneration.gen_${value}`), + }); } - static loadChallenge(source: SingleGenerationChallenge | any): SingleGenerationChallenge { const newChallenge = new SingleGenerationChallenge(); newChallenge.value = source.value; @@ -518,7 +726,7 @@ interface monotypeOverride { /** The species to override */ species: Species; /** The type to count as */ - type: Type; + type: PokemonType; /** If part of a fusion, should we check the fused species instead of the base species? */ fusion: boolean; } @@ -528,20 +736,25 @@ interface monotypeOverride { */ export class SingleTypeChallenge extends Challenge { private static TYPE_OVERRIDES: monotypeOverride[] = [ - { species: Species.CASTFORM, type: Type.NORMAL, fusion: false }, + { species: Species.CASTFORM, type: PokemonType.NORMAL, fusion: false }, ]; // TODO: Find a solution for all Pokemon with this ssui issue, including Basculin and Burmy - private static SPECIES_OVERRIDES: Species[] = [ Species.MELOETTA ]; + private static SPECIES_OVERRIDES: Species[] = [Species.MELOETTA]; constructor() { super(Challenges.SINGLE_TYPE, 18); } - override applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false): boolean { + override applyStarterChoice( + pokemon: PokemonSpecies, + valid: Utils.BooleanHolder, + dexAttr: DexAttrProps, + soft = false, + ): boolean { const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex); - const types = [ speciesForm.type1, speciesForm.type2 ]; + const types = [speciesForm.type1, speciesForm.type2]; if (soft && !SingleTypeChallenge.SPECIES_OVERRIDES.includes(pokemon.speciesId)) { - const speciesToCheck = [ pokemon.speciesId ]; + const speciesToCheck = [pokemon.speciesId]; while (speciesToCheck.length) { const checking = speciesToCheck.pop(); if (checking && pokemonEvolutions.hasOwnProperty(checking)) { @@ -569,8 +782,16 @@ export class SingleTypeChallenge extends Challenge { } applyPokemonInBattle(pokemon: Pokemon, valid: Utils.BooleanHolder): boolean { - if (pokemon.isPlayer() && !pokemon.isOfType(this.value - 1, false, false, true) - && !SingleTypeChallenge.TYPE_OVERRIDES.some(o => o.type === (this.value - 1) && (pokemon.isFusion() && o.fusion ? pokemon.fusionSpecies! : pokemon.species).speciesId === o.species)) { // TODO: is the bang on fusionSpecies correct? + if ( + pokemon.isPlayer() && + !pokemon.isOfType(this.value - 1, false, false, true) && + !SingleTypeChallenge.TYPE_OVERRIDES.some( + o => + o.type === this.value - 1 && + (pokemon.isFusion() && o.fusion ? pokemon.fusionSpecies! : pokemon.species).speciesId === o.species, + ) + ) { + // TODO: is the bang on fusionSpecies correct? valid.value = false; return true; } @@ -589,11 +810,11 @@ export class SingleTypeChallenge extends Challenge { * @param {value} overrideValue The value to check for. If undefined, gets the current value. * @returns {string} The localised name for the current value. */ - getValue(overrideValue?: integer): string { + getValue(overrideValue?: number): string { if (overrideValue === undefined) { overrideValue = this.value; } - return Type[this.value - 1].toLowerCase(); + return PokemonType[this.value - 1].toLowerCase(); } /** @@ -601,14 +822,16 @@ export class SingleTypeChallenge extends Challenge { * @param {value} overrideValue The value to check for. If undefined, gets the current value. * @returns {string} The localised description for the current value. */ - getDescription(overrideValue?: integer): string { + getDescription(overrideValue?: number): string { if (overrideValue === undefined) { overrideValue = this.value; } - const type = i18next.t(`pokemonInfo:Type.${Type[this.value - 1]}`); - const typeColor = `[color=${TypeColor[Type[this.value - 1]]}][shadow=${TypeShadow[Type[this.value - 1]]}]${type}[/shadow][/color]`; + const type = i18next.t(`pokemonInfo:Type.${PokemonType[this.value - 1]}`); + const typeColor = `[color=${TypeColor[PokemonType[this.value - 1]]}][shadow=${TypeShadow[PokemonType[this.value - 1]]}]${type}[/shadow][/color]`; const defaultDesc = i18next.t("challenges:singleType.desc_default"); - const typeDesc = i18next.t("challenges:singleType.desc", { type: typeColor }); + const typeDesc = i18next.t("challenges:singleType.desc", { + type: typeColor, + }); return this.value === 0 ? defaultDesc : typeDesc; } @@ -648,12 +871,18 @@ export class FreshStartChallenge extends Challenge { pokemon.abilityIndex = 0; // Always base ability, not hidden ability pokemon.passive = false; // Passive isn't unlocked pokemon.nature = Nature.HARDY; // Neutral nature - pokemon.moveset = pokemon.species.getLevelMoves().filter(m => m[0] <= 5).map(lm => lm[1]).slice(0, 4).map(m => new PokemonMove(m)); // No egg moves + pokemon.moveset = pokemon.species + .getLevelMoves() + .filter(m => m[0] <= 5) + .map(lm => lm[1]) + .slice(0, 4) + .map(m => new PokemonMove(m)); // No egg moves pokemon.luck = 0; // No luck pokemon.shiny = false; // Not shiny pokemon.variant = 0; // Not shiny pokemon.formIndex = 0; // Froakie should be base form - pokemon.ivs = [ 10, 10, 10, 10, 10, 10 ]; // Default IVs of 10 for all stats + pokemon.ivs = [15, 15, 15, 15, 15, 15]; // Default IVs of 15 for all stats (Updated to 15 from 10 in 1.2.0) + pokemon.teraType = pokemon.species.type1; // Always primary tera type return true; } @@ -692,7 +921,8 @@ export class InverseBattleChallenge extends Challenge { if (effectiveness.value < 1) { effectiveness.value = 2; return true; - } else if (effectiveness.value > 1) { + } + if (effectiveness.value > 1) { effectiveness.value = 0.5; return true; } @@ -701,6 +931,33 @@ export class InverseBattleChallenge extends Challenge { } } +/** + * Implements a flip stat challenge. + */ +export class FlipStatChallenge extends Challenge { + constructor() { + super(Challenges.FLIP_STAT, 1); + } + + override applyFlipStat(_pokemon: Pokemon, baseStats: number[]) { + const origStats = Utils.deepCopy(baseStats); + baseStats[0] = origStats[5]; + baseStats[1] = origStats[4]; + baseStats[2] = origStats[3]; + baseStats[3] = origStats[2]; + baseStats[4] = origStats[1]; + baseStats[5] = origStats[0]; + return true; + } + + static loadChallenge(source: FlipStatChallenge | any): FlipStatChallenge { + const newChallenge = new FlipStatChallenge(); + newChallenge.value = source.value; + newChallenge.severity = source.severity; + return newChallenge; + } +} + /** * Lowers the amount of starter points available. */ @@ -712,7 +969,7 @@ export class LowerStarterMaxCostChallenge extends Challenge { /** * @override */ - getValue(overrideValue?: integer): string { + getValue(overrideValue?: number): string { if (overrideValue === undefined) { overrideValue = this.value; } @@ -746,7 +1003,7 @@ export class LowerStarterPointsChallenge extends Challenge { /** * @override */ - getValue(overrideValue?: integer): string { + getValue(overrideValue?: number): string { if (overrideValue === undefined) { overrideValue = this.value; } @@ -776,7 +1033,14 @@ export class LowerStarterPointsChallenge extends Challenge { * @param soft {@link boolean} If true, allow it if it could become a valid pokemon. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_CHOICE, pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.STARTER_CHOICE, + pokemon: PokemonSpecies, + valid: Utils.BooleanHolder, + dexAttr: DexAttrProps, + soft: boolean, +): boolean; /** * Apply all challenges that modify available total starter points. * @param gameMode {@link GameMode} The current gameMode @@ -784,7 +1048,11 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param points {@link Utils.NumberHolder} The amount of points you have available. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_POINTS, points: Utils.NumberHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.STARTER_POINTS, + points: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify the cost of a starter. * @param gameMode {@link GameMode} The current gameMode @@ -793,7 +1061,12 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param points {@link Utils.NumberHolder} The cost of the pokemon. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_COST, species: Species, cost: Utils.NumberHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.STARTER_COST, + species: Species, + cost: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify a starter after selection. * @param gameMode {@link GameMode} The current gameMode @@ -801,7 +1074,11 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param pokemon {@link Pokemon} The starter pokemon to modify. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.STARTER_MODIFY, pokemon: Pokemon): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.STARTER_MODIFY, + pokemon: Pokemon, +): boolean; /** * Apply all challenges that what pokemon you can have in battle. * @param gameMode {@link GameMode} The current gameMode @@ -810,7 +1087,12 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param valid {@link Utils.BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.POKEMON_IN_BATTLE, pokemon: Pokemon, valid: Utils.BooleanHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.POKEMON_IN_BATTLE, + pokemon: Pokemon, + valid: Utils.BooleanHolder, +): boolean; /** * Apply all challenges that modify what fixed battles there are. * @param gameMode {@link GameMode} The current gameMode @@ -819,7 +1101,12 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param battleConfig {@link FixedBattleConfig} The battle config to modify. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.FIXED_BATTLES, waveIndex: Number, battleConfig: FixedBattleConfig): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.FIXED_BATTLES, + waveIndex: number, + battleConfig: FixedBattleConfig, +): boolean; /** * Apply all challenges that modify type effectiveness. * @param gameMode {@linkcode GameMode} The current gameMode @@ -827,27 +1114,43 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param effectiveness {@linkcode Utils.NumberHolder} The current effectiveness of the move. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.TYPE_EFFECTIVENESS, effectiveness: Utils.NumberHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.TYPE_EFFECTIVENESS, + effectiveness: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify what level AI are. * @param gameMode {@link GameMode} The current gameMode * @param challengeType {@link ChallengeType} ChallengeType.AI_LEVEL - * @param level {@link Utils.IntegerHolder} The generated level of the pokemon. + * @param level {@link Utils.NumberHolder} The generated level of the pokemon. * @param levelCap {@link Number} The maximum level cap for the current wave. * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_LEVEL, level: Utils.IntegerHolder, levelCap: number, isTrainer: boolean, isBoss: boolean): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.AI_LEVEL, + level: Utils.NumberHolder, + levelCap: number, + isTrainer: boolean, + isBoss: boolean, +): boolean; /** * Apply all challenges that modify how many move slots the AI has. * @param gameMode {@link GameMode} The current gameMode * @param challengeType {@link ChallengeType} ChallengeType.AI_MOVE_SLOTS * @param pokemon {@link Pokemon} The pokemon being considered. - * @param moveSlots {@link Utils.IntegerHolder} The amount of move slots. + * @param moveSlots {@link Utils.NumberHolder} The amount of move slots. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_MOVE_SLOTS, pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.AI_MOVE_SLOTS, + pokemon: Pokemon, + moveSlots: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify whether a pokemon has its passive. * @param gameMode {@link GameMode} The current gameMode @@ -856,7 +1159,12 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param hasPassive {@link Utils.BooleanHolder} Whether it has its passive. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.PASSIVE_ACCESS, pokemon: Pokemon, hasPassive: Utils.BooleanHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.PASSIVE_ACCESS, + pokemon: Pokemon, + hasPassive: Utils.BooleanHolder, +): boolean; /** * Apply all challenges that modify the game modes settings. * @param gameMode {@link GameMode} The current gameMode @@ -871,10 +1179,17 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param pokemon {@link Pokemon} What pokemon would learn the move. * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. * @param move {@link Moves} The move in question. - * @param level {@link Utils.IntegerHolder} The level threshold for access. + * @param level {@link Utils.NumberHolder} The level threshold for access. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_ACCESS, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.MOVE_ACCESS, + pokemon: Pokemon, + moveSource: MoveSourceType, + move: Moves, + level: Utils.NumberHolder, +): boolean; /** * Apply all challenges that modify what weight a pokemon gives to move generation * @param gameMode {@link GameMode} The current gameMode @@ -882,10 +1197,25 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @param pokemon {@link Pokemon} What pokemon would learn the move. * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. * @param move {@link Moves} The move in question. - * @param weight {@link Utils.IntegerHolder} The weight of the move. + * @param weight {@link Utils.NumberHolder} The weight of the move. * @returns True if any challenge was successfully applied. */ -export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.MOVE_WEIGHT, pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, weight: Utils.IntegerHolder): boolean; +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.MOVE_WEIGHT, + pokemon: Pokemon, + moveSource: MoveSourceType, + move: Moves, + weight: Utils.NumberHolder, +): boolean; + +export function applyChallenges( + gameMode: GameMode, + challengeType: ChallengeType.FLIP_STAT, + pokemon: Pokemon, + baseStats: number[], +): boolean; + export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType, ...args: any[]): boolean { let ret = false; gameMode.challenges.forEach(c => { @@ -930,6 +1260,9 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType case ChallengeType.MOVE_WEIGHT: ret ||= c.applyMoveWeight(args[0], args[1], args[2], args[3]); break; + case ChallengeType.FLIP_STAT: + ret ||= c.applyFlipStat(args[0], args[1]); + break; } } }); @@ -955,6 +1288,8 @@ export function copyChallenge(source: Challenge | any): Challenge { return FreshStartChallenge.loadChallenge(source); case Challenges.INVERSE_BATTLE: return InverseBattleChallenge.loadChallenge(source); + case Challenges.FLIP_STAT: + return FlipStatChallenge.loadChallenge(source); } throw new Error("Unknown challenge copied"); } @@ -967,5 +1302,6 @@ export function initChallenges() { new SingleTypeChallenge(), new FreshStartChallenge(), new InverseBattleChallenge(), + new FlipStatChallenge(), ); } diff --git a/src/data/custom-pokemon-data.ts b/src/data/custom-pokemon-data.ts index 2e94123fc84..d95d9f77b83 100644 --- a/src/data/custom-pokemon-data.ts +++ b/src/data/custom-pokemon-data.ts @@ -1,18 +1,21 @@ -import { Abilities } from "#enums/abilities"; -import { Type } from "#app/data/type"; +import type { Abilities } from "#enums/abilities"; +import type { PokemonType } from "#enums/pokemon-type"; import { isNullOrUndefined } from "#app/utils"; -import { Nature } from "#enums/nature"; +import type { Nature } from "#enums/nature"; /** * Data that can customize a Pokemon in non-standard ways from its Species - * Currently only used by Mystery Encounters and Mints. + * Used by Mystery Encounters and Mints + * Also used as a counter how often a Pokemon got hit until new arena encounter */ export class CustomPokemonData { public spriteScale: number; public ability: Abilities | -1; public passive: Abilities | -1; public nature: Nature | -1; - public types: Type[]; + public types: PokemonType[]; + /** `hitsReceivedCount` aka `hitsRecCount` saves how often the pokemon got hit until a new arena encounter (used for Rage Fist) */ + public hitsRecCount: number; constructor(data?: CustomPokemonData | Partial) { if (!isNullOrUndefined(data)) { @@ -24,5 +27,10 @@ export class CustomPokemonData { this.passive = this.passive ?? -1; this.nature = this.nature ?? -1; this.types = this.types ?? []; + this.hitsRecCount = this.hitsRecCount ?? 0; + } + + resetHitReceivedCount(): void { + this.hitsRecCount = 0; } } diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index 0decab63f4f..22fb7db10ae 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -1,76 +1,168 @@ import { PartyMemberStrength } from "#enums/party-member-strength"; -import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; +import type { Species } from "#enums/species"; +import { globalScene } from "#app/global-scene"; import { PlayerPokemon } from "#app/field/pokemon"; -import { Starter } from "#app/ui/starter-select-ui-handler"; +import type { Starter } from "#app/ui/starter-select-ui-handler"; import * as Utils from "#app/utils"; -import PokemonSpecies, { PokemonSpeciesForm, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import type { PokemonSpeciesForm } from "#app/data/pokemon-species"; +import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import { Biome } from "#app/enums/biome"; export interface DailyRunConfig { - seed: integer; + seed: number; starters: Starter; } export function fetchDailyRunSeed(): Promise { - return new Promise((resolve, reject) => { - Utils.apiFetch("daily/seed").then(response => { - if (!response.ok) { - resolve(null); - return; - } - return response.text(); - }).then(seed => resolve(seed ?? null)) - .catch(err => reject(err)); + return new Promise((resolve, _reject) => { + pokerogueApi.daily.getSeed().then(dailySeed => { + resolve(dailySeed); + }); }); } -export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[] { +export function getDailyRunStarters(seed: string): Starter[] { const starters: Starter[] = []; - scene.executeWithSeedOffset(() => { - const startingLevel = scene.gameMode.getStartingLevel(); + globalScene.executeWithSeedOffset( + () => { + const startingLevel = globalScene.gameMode.getStartingLevel(); - if (/\d{18}$/.test(seed)) { - for (let s = 0; s < 3; s++) { - const offset = 6 + s * 6; - const starterSpeciesForm = getPokemonSpeciesForm(parseInt(seed.slice(offset, offset + 4)) as Species, parseInt(seed.slice(offset + 4, offset + 6))); - starters.push(getDailyRunStarter(scene, starterSpeciesForm, startingLevel)); + if (/\d{18}$/.test(seed)) { + for (let s = 0; s < 3; s++) { + const offset = 6 + s * 6; + const starterSpeciesForm = getPokemonSpeciesForm( + Number.parseInt(seed.slice(offset, offset + 4)) as Species, + Number.parseInt(seed.slice(offset + 4, offset + 6)), + ); + starters.push(getDailyRunStarter(starterSpeciesForm, startingLevel)); + } + return; } - return; - } - const starterCosts: integer[] = []; - starterCosts.push(Math.min(Math.round(3.5 + Math.abs(Utils.randSeedGauss(1))), 8)); - starterCosts.push(Utils.randSeedInt(9 - starterCosts[0], 1)); - starterCosts.push(10 - (starterCosts[0] + starterCosts[1])); + const starterCosts: number[] = []; + starterCosts.push(Math.min(Math.round(3.5 + Math.abs(Utils.randSeedGauss(1))), 8)); + starterCosts.push(Utils.randSeedInt(9 - starterCosts[0], 1)); + starterCosts.push(10 - (starterCosts[0] + starterCosts[1])); - for (let c = 0; c < starterCosts.length; c++) { - const cost = starterCosts[c]; - const costSpecies = Object.keys(speciesStarterCosts) - .map(s => parseInt(s) as Species) - .filter(s => speciesStarterCosts[s] === cost); - const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies)); - const starterSpecies = getPokemonSpecies(randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER)); - starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel)); - } - }, 0, seed); + for (let c = 0; c < starterCosts.length; c++) { + const cost = starterCosts[c]; + const costSpecies = Object.keys(speciesStarterCosts) + .map(s => Number.parseInt(s) as Species) + .filter(s => speciesStarterCosts[s] === cost); + const randPkmSpecies = getPokemonSpecies(Utils.randSeedItem(costSpecies)); + const starterSpecies = getPokemonSpecies( + randPkmSpecies.getTrainerSpeciesForLevel(startingLevel, true, PartyMemberStrength.STRONGER), + ); + starters.push(getDailyRunStarter(starterSpecies, startingLevel)); + } + }, + 0, + seed, + ); return starters; } -function getDailyRunStarter(scene: BattleScene, starterSpeciesForm: PokemonSpeciesForm, startingLevel: integer): Starter { - const starterSpecies = starterSpeciesForm instanceof PokemonSpecies ? starterSpeciesForm : getPokemonSpecies(starterSpeciesForm.speciesId); +function getDailyRunStarter(starterSpeciesForm: PokemonSpeciesForm, startingLevel: number): Starter { + const starterSpecies = + starterSpeciesForm instanceof PokemonSpecies ? starterSpeciesForm : getPokemonSpecies(starterSpeciesForm.speciesId); const formIndex = starterSpeciesForm instanceof PokemonSpecies ? undefined : starterSpeciesForm.formIndex; - const pokemon = new PlayerPokemon(scene, starterSpecies, startingLevel, undefined, formIndex, undefined, undefined, undefined, undefined, undefined, undefined); + const pokemon = new PlayerPokemon( + starterSpecies, + startingLevel, + undefined, + formIndex, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + ); const starter: Starter = { species: starterSpecies, dexAttr: pokemon.getDexAttr(), abilityIndex: pokemon.abilityIndex, passive: false, nature: pokemon.getNature(), - pokerus: pokemon.pokerus + pokerus: pokemon.pokerus, }; pokemon.destroy(); return starter; } + +interface BiomeWeights { + [key: number]: number; +} + +// Initially weighted by amount of exits each biome has +// Town and End are set to 0 however +// And some other biomes were balanced +1/-1 based on average size of the total daily. +const dailyBiomeWeights: BiomeWeights = { + [Biome.CAVE]: 3, + [Biome.LAKE]: 3, + [Biome.PLAINS]: 3, + [Biome.SNOWY_FOREST]: 3, + [Biome.SWAMP]: 3, // 2 -> 3 + [Biome.TALL_GRASS]: 3, // 2 -> 3 + + [Biome.ABYSS]: 2, // 3 -> 2 + [Biome.RUINS]: 2, + [Biome.BADLANDS]: 2, + [Biome.BEACH]: 2, + [Biome.CONSTRUCTION_SITE]: 2, + [Biome.DESERT]: 2, + [Biome.DOJO]: 2, // 3 -> 2 + [Biome.FACTORY]: 2, + [Biome.FAIRY_CAVE]: 2, + [Biome.FOREST]: 2, + [Biome.GRASS]: 2, // 1 -> 2 + [Biome.MEADOW]: 2, + [Biome.MOUNTAIN]: 2, // 3 -> 2 + [Biome.SEA]: 2, + [Biome.SEABED]: 2, + [Biome.SLUM]: 2, + [Biome.TEMPLE]: 2, // 3 -> 2 + [Biome.VOLCANO]: 2, + + [Biome.GRAVEYARD]: 1, + [Biome.ICE_CAVE]: 1, + [Biome.ISLAND]: 1, + [Biome.JUNGLE]: 1, + [Biome.LABORATORY]: 1, + [Biome.METROPOLIS]: 1, + [Biome.POWER_PLANT]: 1, + [Biome.SPACE]: 1, + [Biome.WASTELAND]: 1, + + [Biome.TOWN]: 0, + [Biome.END]: 0, +}; + +export function getDailyStartingBiome(): Biome { + const biomes = Utils.getEnumValues(Biome).filter(b => b !== Biome.TOWN && b !== Biome.END); + + let totalWeight = 0; + const biomeThresholds: number[] = []; + for (const biome of biomes) { + // Keep track of the total weight + totalWeight += dailyBiomeWeights[biome]; + + // Keep track of each biomes cumulative weight + biomeThresholds.push(totalWeight); + } + + const randInt = Utils.randSeedInt(totalWeight); + + for (let i = 0; i < biomes.length; i++) { + if (randInt < biomeThresholds[i]) { + return biomes[i]; + } + } + + // Fallback in case something went wrong + return biomes[Utils.randSeedInt(biomes.length)]; +} diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 3219ce4d058..208e269bd9c 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -3,13 +3,13 @@ import { TrainerType } from "#enums/trainer-type"; import { trainerConfigs } from "./trainer-config"; export interface TrainerTypeMessages { - encounter?: string | string[], - victory?: string | string[], - defeat?: string | string[] + encounter?: string | string[]; + victory?: string | string[]; + defeat?: string | string[]; } export interface TrainerTypeDialogue { - [key: integer]: TrainerTypeMessages | Array + [key: number]: TrainerTypeMessages | Array; } export function getTrainerTypeDialogue(): TrainerTypeDialogue { @@ -32,7 +32,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:youngster.encounter.10", "dialogue:youngster.encounter.11", "dialogue:youngster.encounter.12", - "dialogue:youngster.encounter.13" + "dialogue:youngster.encounter.13", ], victory: [ "dialogue:youngster.victory.1", @@ -48,7 +48,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:youngster.victory.11", "dialogue:youngster.victory.12", "dialogue:youngster.victory.13", - ] + ], }, //LASS { @@ -61,7 +61,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:lass.encounter.6", "dialogue:lass.encounter.7", "dialogue:lass.encounter.8", - "dialogue:lass.encounter.9" + "dialogue:lass.encounter.9", ], victory: [ "dialogue:lass.victory.1", @@ -72,27 +72,15 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:lass.victory.6", "dialogue:lass.victory.7", "dialogue:lass.victory.8", - "dialogue:lass.victory.9" - ] - } + "dialogue:lass.victory.9", + ], + }, ], [TrainerType.BREEDER]: [ { - encounter: [ - "dialogue:breeder.encounter.1", - "dialogue:breeder.encounter.2", - "dialogue:breeder.encounter.3", - ], - victory: [ - "dialogue:breeder.victory.1", - "dialogue:breeder.victory.2", - "dialogue:breeder.victory.3", - ], - defeat: [ - "dialogue:breeder.defeat.1", - "dialogue:breeder.defeat.2", - "dialogue:breeder.defeat.3", - ] + encounter: ["dialogue:breeder.encounter.1", "dialogue:breeder.encounter.2", "dialogue:breeder.encounter.3"], + victory: ["dialogue:breeder.victory.1", "dialogue:breeder.victory.2", "dialogue:breeder.victory.3"], + defeat: ["dialogue:breeder.defeat.1", "dialogue:breeder.defeat.2", "dialogue:breeder.defeat.3"], }, { encounter: [ @@ -109,21 +97,13 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:breeder_female.defeat.1", "dialogue:breeder_female.defeat.2", "dialogue:breeder_female.defeat.3", - ] - } + ], + }, ], [TrainerType.FISHERMAN]: [ { - encounter: [ - "dialogue:fisherman.encounter.1", - "dialogue:fisherman.encounter.2", - "dialogue:fisherman.encounter.3", - ], - victory: [ - "dialogue:fisherman.victory.1", - "dialogue:fisherman.victory.2", - "dialogue:fisherman.victory.3", - ] + encounter: ["dialogue:fisherman.encounter.1", "dialogue:fisherman.encounter.2", "dialogue:fisherman.encounter.3"], + victory: ["dialogue:fisherman.victory.1", "dialogue:fisherman.victory.2", "dialogue:fisherman.victory.3"], }, { encounter: [ @@ -135,22 +115,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:fisherman_female.victory.1", "dialogue:fisherman_female.victory.2", "dialogue:fisherman_female.victory.3", - ] - } + ], + }, ], [TrainerType.SWIMMER]: [ { - encounter: [ - "dialogue:swimmer.encounter.1", - "dialogue:swimmer.encounter.2", - "dialogue:swimmer.encounter.3", - ], - victory: [ - "dialogue:swimmer.victory.1", - "dialogue:swimmer.victory.2", - "dialogue:swimmer.victory.3", - ] - } + encounter: ["dialogue:swimmer.encounter.1", "dialogue:swimmer.encounter.2", "dialogue:swimmer.encounter.3"], + victory: ["dialogue:swimmer.victory.1", "dialogue:swimmer.victory.2", "dialogue:swimmer.victory.3"], + }, ], [TrainerType.BACKPACKER]: [ { @@ -165,8 +137,8 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:backpacker.victory.2", "dialogue:backpacker.victory.3", "dialogue:backpacker.victory.4", - ] - } + ], + }, ], [TrainerType.ACE_TRAINER]: [ { @@ -187,258 +159,138 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:ace_trainer.defeat.2", "dialogue:ace_trainer.defeat.3", "dialogue:ace_trainer.defeat.4", - ] - } + ], + }, ], [TrainerType.PARASOL_LADY]: [ { - encounter: [ - "dialogue:parasol_lady.encounter.1", - ], - victory: [ - "dialogue:parasol_lady.victory.1", - ] - } + encounter: ["dialogue:parasol_lady.encounter.1"], + victory: ["dialogue:parasol_lady.victory.1"], + }, ], [TrainerType.TWINS]: [ { - encounter: [ - "dialogue:twins.encounter.1", - "dialogue:twins.encounter.2", - "dialogue:twins.encounter.3", - ], - victory: [ - "dialogue:twins.victory.1", - "dialogue:twins.victory.2", - "dialogue:twins.victory.3", - ], - defeat: [ - "dialogue:twins.defeat.1", - "dialogue:twins.defeat.2", - "dialogue:twins.defeat.3", - ], - } + encounter: ["dialogue:twins.encounter.1", "dialogue:twins.encounter.2", "dialogue:twins.encounter.3"], + victory: ["dialogue:twins.victory.1", "dialogue:twins.victory.2", "dialogue:twins.victory.3"], + defeat: ["dialogue:twins.defeat.1", "dialogue:twins.defeat.2", "dialogue:twins.defeat.3"], + }, ], [TrainerType.CYCLIST]: [ { - encounter: [ - "dialogue:cyclist.encounter.1", - "dialogue:cyclist.encounter.2", - "dialogue:cyclist.encounter.3", - ], - victory: [ - "dialogue:cyclist.victory.1", - "dialogue:cyclist.victory.2", - "dialogue:cyclist.victory.3", - ] - } + encounter: ["dialogue:cyclist.encounter.1", "dialogue:cyclist.encounter.2", "dialogue:cyclist.encounter.3"], + victory: ["dialogue:cyclist.victory.1", "dialogue:cyclist.victory.2", "dialogue:cyclist.victory.3"], + }, ], [TrainerType.BLACK_BELT]: [ { - encounter: [ - "dialogue:black_belt.encounter.1", - "dialogue:black_belt.encounter.2", - ], - victory: [ - "dialogue:black_belt.victory.1", - "dialogue:black_belt.victory.2", - ] + encounter: ["dialogue:black_belt.encounter.1", "dialogue:black_belt.encounter.2"], + victory: ["dialogue:black_belt.victory.1", "dialogue:black_belt.victory.2"], }, //BATTLE GIRL { - encounter: [ - "dialogue:battle_girl.encounter.1", - ], - victory: [ - "dialogue:battle_girl.victory.1", - ] - } + encounter: ["dialogue:battle_girl.encounter.1"], + victory: ["dialogue:battle_girl.victory.1"], + }, ], [TrainerType.HIKER]: [ { - encounter: [ - "dialogue:hiker.encounter.1", - "dialogue:hiker.encounter.2", - ], - victory: [ - "dialogue:hiker.victory.1", - "dialogue:hiker.victory.2", - ] - } + encounter: ["dialogue:hiker.encounter.1", "dialogue:hiker.encounter.2"], + victory: ["dialogue:hiker.victory.1", "dialogue:hiker.victory.2"], + }, ], [TrainerType.RANGER]: [ { - encounter: [ - "dialogue:ranger.encounter.1", - "dialogue:ranger.encounter.2", - ], - victory: [ - "dialogue:ranger.victory.1", - "dialogue:ranger.victory.2", - ], - defeat: [ - "dialogue:ranger.defeat.1", - "dialogue:ranger.defeat.2", - ] - } + encounter: ["dialogue:ranger.encounter.1", "dialogue:ranger.encounter.2"], + victory: ["dialogue:ranger.victory.1", "dialogue:ranger.victory.2"], + defeat: ["dialogue:ranger.defeat.1", "dialogue:ranger.defeat.2"], + }, ], [TrainerType.SCIENTIST]: [ { - encounter: [ - "dialogue:scientist.encounter.1", - ], - victory: [ - "dialogue:scientist.victory.1", - ] - } + encounter: ["dialogue:scientist.encounter.1"], + victory: ["dialogue:scientist.victory.1"], + }, ], [TrainerType.SCHOOL_KID]: [ { - encounter: [ - "dialogue:school_kid.encounter.1", - "dialogue:school_kid.encounter.2", - ], - victory: [ - "dialogue:school_kid.victory.1", - "dialogue:school_kid.victory.2", - ] - } + encounter: ["dialogue:school_kid.encounter.1", "dialogue:school_kid.encounter.2"], + victory: ["dialogue:school_kid.victory.1", "dialogue:school_kid.victory.2"], + }, ], [TrainerType.ARTIST]: [ { - encounter: [ - "dialogue:artist.encounter.1", - ], - victory: [ - "dialogue:artist.victory.1", - ] - } + encounter: ["dialogue:artist.encounter.1"], + victory: ["dialogue:artist.victory.1"], + }, ], [TrainerType.GUITARIST]: [ { - encounter: [ - "dialogue:guitarist.encounter.1", - ], - victory: [ - "dialogue:guitarist.victory.1", - ] - } + encounter: ["dialogue:guitarist.encounter.1"], + victory: ["dialogue:guitarist.victory.1"], + }, ], [TrainerType.WORKER]: [ { - encounter: [ - "dialogue:worker.encounter.1", - ], - victory: [ - "dialogue:worker.victory.1", - ] + encounter: ["dialogue:worker.encounter.1"], + victory: ["dialogue:worker.victory.1"], }, { - encounter: [ - "dialogue:worker_female.encounter.1", - ], - victory: [ - "dialogue:worker_female.victory.1", - ], - defeat: [ - "dialogue:worker_female.defeat.1", - ] + encounter: ["dialogue:worker_female.encounter.1"], + victory: ["dialogue:worker_female.victory.1"], + defeat: ["dialogue:worker_female.defeat.1"], }, { - encounter: [ - "dialogue:worker_double.encounter.1", - ], - victory: [ - "dialogue:worker_double.victory.1", - ] + encounter: ["dialogue:worker_double.encounter.1"], + victory: ["dialogue:worker_double.victory.1"], }, ], // Defeat dialogue in the language .JSONS exist as translated or placeholders; (en, fr, it, es, de, ja, ko, zh_cn, zh_tw, pt_br) [TrainerType.SNOW_WORKER]: [ { - encounter: [ - "dialogue:snow_worker.encounter.1", - ], - victory: [ - "dialogue:snow_worker.victory.1", - ] + encounter: ["dialogue:snow_worker.encounter.1"], + victory: ["dialogue:snow_worker.victory.1"], }, { - encounter: [ - "dialogue:snow_worker_double.encounter.1", - ], - victory: [ - "dialogue:snow_worker_double.victory.1", - ] + encounter: ["dialogue:snow_worker_double.encounter.1"], + victory: ["dialogue:snow_worker_double.victory.1"], }, ], [TrainerType.HEX_MANIAC]: [ { - encounter: [ - "dialogue:hex_maniac.encounter.1", - "dialogue:hex_maniac.encounter.2", - ], - victory: [ - "dialogue:hex_maniac.victory.1", - "dialogue:hex_maniac.victory.2", - ], - defeat: [ - "dialogue:hex_maniac.defeat.1", - "dialogue:hex_maniac.defeat.2", - ] - } + encounter: ["dialogue:hex_maniac.encounter.1", "dialogue:hex_maniac.encounter.2"], + victory: ["dialogue:hex_maniac.victory.1", "dialogue:hex_maniac.victory.2"], + defeat: ["dialogue:hex_maniac.defeat.1", "dialogue:hex_maniac.defeat.2"], + }, ], [TrainerType.PSYCHIC]: [ { - encounter: [ - "dialogue:psychic.encounter.1", - ], - victory: [ - "dialogue:psychic.victory.1", - ] - } + encounter: ["dialogue:psychic.encounter.1"], + victory: ["dialogue:psychic.victory.1"], + }, ], [TrainerType.OFFICER]: [ { - encounter: [ - "dialogue:officer.encounter.1", - "dialogue:officer.encounter.2", - ], - victory: [ - "dialogue:officer.victory.1", - "dialogue:officer.victory.2", - ], - } + encounter: ["dialogue:officer.encounter.1", "dialogue:officer.encounter.2"], + victory: ["dialogue:officer.victory.1", "dialogue:officer.victory.2"], + }, ], [TrainerType.BEAUTY]: [ { - encounter: [ - "dialogue:beauty.encounter.1", - ], - victory: [ - "dialogue:beauty.victory.1", - ] - } + encounter: ["dialogue:beauty.encounter.1"], + victory: ["dialogue:beauty.victory.1"], + }, ], [TrainerType.BAKER]: [ { - encounter: [ - "dialogue:baker.encounter.1", - ], - victory: [ - "dialogue:baker.victory.1", - ] - } + encounter: ["dialogue:baker.encounter.1"], + victory: ["dialogue:baker.victory.1"], + }, ], [TrainerType.BIKER]: [ { - encounter: [ - "dialogue:biker.encounter.1", - ], - victory: [ - "dialogue:biker.victory.1", - ] - } + encounter: ["dialogue:biker.encounter.1"], + victory: ["dialogue:biker.victory.1"], + }, ], [TrainerType.FIREBREATHER]: [ { @@ -451,22 +303,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:firebreather.victory.1", "dialogue:firebreather.victory.2", "dialogue:firebreather.victory.3", - ] - } + ], + }, ], [TrainerType.SAILOR]: [ { - encounter: [ - "dialogue:sailor.encounter.1", - "dialogue:sailor.encounter.2", - "dialogue:sailor.encounter.3", - ], - victory: [ - "dialogue:sailor.victory.1", - "dialogue:sailor.victory.2", - "dialogue:sailor.victory.3", - ] - } + encounter: ["dialogue:sailor.encounter.1", "dialogue:sailor.encounter.2", "dialogue:sailor.encounter.3"], + victory: ["dialogue:sailor.victory.1", "dialogue:sailor.victory.2", "dialogue:sailor.victory.3"], + }, ], [TrainerType.ROCKET_GRUNT]: [ { @@ -483,64 +327,32 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:rocket_grunt.victory.3", "dialogue:rocket_grunt.victory.4", "dialogue:rocket_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.ARCHER]: [ { - encounter: [ - "dialogue:archer.encounter.1", - "dialogue:archer.encounter.2", - "dialogue:archer.encounter.3", - ], - victory: [ - "dialogue:archer.victory.1", - "dialogue:archer.victory.2", - "dialogue:archer.victory.3", - ] - } + encounter: ["dialogue:archer.encounter.1", "dialogue:archer.encounter.2", "dialogue:archer.encounter.3"], + victory: ["dialogue:archer.victory.1", "dialogue:archer.victory.2", "dialogue:archer.victory.3"], + }, ], [TrainerType.ARIANA]: [ { - encounter: [ - "dialogue:ariana.encounter.1", - "dialogue:ariana.encounter.2", - "dialogue:ariana.encounter.3", - ], - victory: [ - "dialogue:ariana.victory.1", - "dialogue:ariana.victory.2", - "dialogue:ariana.victory.3", - ] - } + encounter: ["dialogue:ariana.encounter.1", "dialogue:ariana.encounter.2", "dialogue:ariana.encounter.3"], + victory: ["dialogue:ariana.victory.1", "dialogue:ariana.victory.2", "dialogue:ariana.victory.3"], + }, ], [TrainerType.PROTON]: [ { - encounter: [ - "dialogue:proton.encounter.1", - "dialogue:proton.encounter.2", - "dialogue:proton.encounter.3", - ], - victory: [ - "dialogue:proton.victory.1", - "dialogue:proton.victory.2", - "dialogue:proton.victory.3", - ] - } + encounter: ["dialogue:proton.encounter.1", "dialogue:proton.encounter.2", "dialogue:proton.encounter.3"], + victory: ["dialogue:proton.victory.1", "dialogue:proton.victory.2", "dialogue:proton.victory.3"], + }, ], [TrainerType.PETREL]: [ { - encounter: [ - "dialogue:petrel.encounter.1", - "dialogue:petrel.encounter.2", - "dialogue:petrel.encounter.3", - ], - victory: [ - "dialogue:petrel.victory.1", - "dialogue:petrel.victory.2", - "dialogue:petrel.victory.3", - ] - } + encounter: ["dialogue:petrel.encounter.1", "dialogue:petrel.encounter.2", "dialogue:petrel.encounter.3"], + victory: ["dialogue:petrel.victory.1", "dialogue:petrel.victory.2", "dialogue:petrel.victory.3"], + }, ], [TrainerType.MAGMA_GRUNT]: [ { @@ -557,36 +369,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:magma_grunt.victory.3", "dialogue:magma_grunt.victory.4", "dialogue:magma_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.TABITHA]: [ { - encounter: [ - "dialogue:tabitha.encounter.1", - "dialogue:tabitha.encounter.2", - "dialogue:tabitha.encounter.3", - ], - victory: [ - "dialogue:tabitha.victory.1", - "dialogue:tabitha.victory.2", - "dialogue:tabitha.victory.3", - ] - } + encounter: ["dialogue:tabitha.encounter.1", "dialogue:tabitha.encounter.2", "dialogue:tabitha.encounter.3"], + victory: ["dialogue:tabitha.victory.1", "dialogue:tabitha.victory.2", "dialogue:tabitha.victory.3"], + }, ], [TrainerType.COURTNEY]: [ { - encounter: [ - "dialogue:courtney.encounter.1", - "dialogue:courtney.encounter.2", - "dialogue:courtney.encounter.3", - ], - victory: [ - "dialogue:courtney.victory.1", - "dialogue:courtney.victory.2", - "dialogue:courtney.victory.3", - ] - } + encounter: ["dialogue:courtney.encounter.1", "dialogue:courtney.encounter.2", "dialogue:courtney.encounter.3"], + victory: ["dialogue:courtney.victory.1", "dialogue:courtney.victory.2", "dialogue:courtney.victory.3"], + }, ], [TrainerType.AQUA_GRUNT]: [ { @@ -603,36 +399,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:aqua_grunt.victory.3", "dialogue:aqua_grunt.victory.4", "dialogue:aqua_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.MATT]: [ { - encounter: [ - "dialogue:matt.encounter.1", - "dialogue:matt.encounter.2", - "dialogue:matt.encounter.3", - ], - victory: [ - "dialogue:matt.victory.1", - "dialogue:matt.victory.2", - "dialogue:matt.victory.3", - ] - } + encounter: ["dialogue:matt.encounter.1", "dialogue:matt.encounter.2", "dialogue:matt.encounter.3"], + victory: ["dialogue:matt.victory.1", "dialogue:matt.victory.2", "dialogue:matt.victory.3"], + }, ], [TrainerType.SHELLY]: [ { - encounter: [ - "dialogue:shelly.encounter.1", - "dialogue:shelly.encounter.2", - "dialogue:shelly.encounter.3", - ], - victory: [ - "dialogue:shelly.victory.1", - "dialogue:shelly.victory.2", - "dialogue:shelly.victory.3", - ] - } + encounter: ["dialogue:shelly.encounter.1", "dialogue:shelly.encounter.2", "dialogue:shelly.encounter.3"], + victory: ["dialogue:shelly.victory.1", "dialogue:shelly.victory.2", "dialogue:shelly.victory.3"], + }, ], [TrainerType.GALACTIC_GRUNT]: [ { @@ -649,50 +429,26 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:galactic_grunt.victory.3", "dialogue:galactic_grunt.victory.4", "dialogue:galactic_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.JUPITER]: [ { - encounter: [ - "dialogue:jupiter.encounter.1", - "dialogue:jupiter.encounter.2", - "dialogue:jupiter.encounter.3", - ], - victory: [ - "dialogue:jupiter.victory.1", - "dialogue:jupiter.victory.2", - "dialogue:jupiter.victory.3", - ] - } + encounter: ["dialogue:jupiter.encounter.1", "dialogue:jupiter.encounter.2", "dialogue:jupiter.encounter.3"], + victory: ["dialogue:jupiter.victory.1", "dialogue:jupiter.victory.2", "dialogue:jupiter.victory.3"], + }, ], [TrainerType.MARS]: [ { - encounter: [ - "dialogue:mars.encounter.1", - "dialogue:mars.encounter.2", - "dialogue:mars.encounter.3", - ], - victory: [ - "dialogue:mars.victory.1", - "dialogue:mars.victory.2", - "dialogue:mars.victory.3", - ] - } + encounter: ["dialogue:mars.encounter.1", "dialogue:mars.encounter.2", "dialogue:mars.encounter.3"], + victory: ["dialogue:mars.victory.1", "dialogue:mars.victory.2", "dialogue:mars.victory.3"], + }, ], [TrainerType.SATURN]: [ { - encounter: [ - "dialogue:saturn.encounter.1", - "dialogue:saturn.encounter.2", - "dialogue:saturn.encounter.3", - ], - victory: [ - "dialogue:saturn.victory.1", - "dialogue:saturn.victory.2", - "dialogue:saturn.victory.3", - ] - } + encounter: ["dialogue:saturn.encounter.1", "dialogue:saturn.encounter.2", "dialogue:saturn.encounter.3"], + victory: ["dialogue:saturn.victory.1", "dialogue:saturn.victory.2", "dialogue:saturn.victory.3"], + }, ], [TrainerType.PLASMA_GRUNT]: [ { @@ -709,36 +465,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:plasma_grunt.victory.3", "dialogue:plasma_grunt.victory.4", "dialogue:plasma_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.ZINZOLIN]: [ { - encounter: [ - "dialogue:zinzolin.encounter.1", - "dialogue:zinzolin.encounter.2", - "dialogue:zinzolin.encounter.3", - ], - victory: [ - "dialogue:zinzolin.victory.1", - "dialogue:zinzolin.victory.2", - "dialogue:zinzolin.victory.3", - ] - } + encounter: ["dialogue:zinzolin.encounter.1", "dialogue:zinzolin.encounter.2", "dialogue:zinzolin.encounter.3"], + victory: ["dialogue:zinzolin.victory.1", "dialogue:zinzolin.victory.2", "dialogue:zinzolin.victory.3"], + }, ], - [TrainerType.ROOD]: [ + [TrainerType.COLRESS]: [ { - encounter: [ - "dialogue:rood.encounter.1", - "dialogue:rood.encounter.2", - "dialogue:rood.encounter.3", - ], - victory: [ - "dialogue:rood.victory.1", - "dialogue:rood.victory.2", - "dialogue:rood.victory.3", - ] - } + encounter: ["dialogue:colress.encounter.1", "dialogue:colress.encounter.2", "dialogue:colress.encounter.3"], + victory: ["dialogue:colress.victory.1", "dialogue:colress.victory.2", "dialogue:colress.victory.3"], + }, ], [TrainerType.FLARE_GRUNT]: [ { @@ -755,36 +495,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:flare_grunt.victory.3", "dialogue:flare_grunt.victory.4", "dialogue:flare_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.BRYONY]: [ { - encounter: [ - "dialogue:bryony.encounter.1", - "dialogue:bryony.encounter.2", - "dialogue:bryony.encounter.3", - ], - victory: [ - "dialogue:bryony.victory.1", - "dialogue:bryony.victory.2", - "dialogue:bryony.victory.3", - ] - } + encounter: ["dialogue:bryony.encounter.1", "dialogue:bryony.encounter.2", "dialogue:bryony.encounter.3"], + victory: ["dialogue:bryony.victory.1", "dialogue:bryony.victory.2", "dialogue:bryony.victory.3"], + }, ], [TrainerType.XEROSIC]: [ { - encounter: [ - "dialogue:xerosic.encounter.1", - "dialogue:xerosic.encounter.2", - "dialogue:xerosic.encounter.3", - ], - victory: [ - "dialogue:xerosic.victory.1", - "dialogue:xerosic.victory.2", - "dialogue:xerosic.victory.3", - ] - } + encounter: ["dialogue:xerosic.encounter.1", "dialogue:xerosic.encounter.2", "dialogue:xerosic.encounter.3"], + victory: ["dialogue:xerosic.victory.1", "dialogue:xerosic.victory.2", "dialogue:xerosic.victory.3"], + }, ], [TrainerType.AETHER_GRUNT]: [ { @@ -801,22 +525,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:aether_grunt.victory.3", "dialogue:aether_grunt.victory.4", "dialogue:aether_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.FABA]: [ { - encounter: [ - "dialogue:faba.encounter.1", - "dialogue:faba.encounter.2", - "dialogue:faba.encounter.3", - ], - victory: [ - "dialogue:faba.victory.1", - "dialogue:faba.victory.2", - "dialogue:faba.victory.3", - ] - } + encounter: ["dialogue:faba.encounter.1", "dialogue:faba.encounter.2", "dialogue:faba.encounter.3"], + victory: ["dialogue:faba.victory.1", "dialogue:faba.victory.2", "dialogue:faba.victory.3"], + }, ], [TrainerType.SKULL_GRUNT]: [ { @@ -833,22 +549,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:skull_grunt.victory.3", "dialogue:skull_grunt.victory.4", "dialogue:skull_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.PLUMERIA]: [ { - encounter: [ - "dialogue:plumeria.encounter.1", - "dialogue:plumeria.encounter.2", - "dialogue:plumeria.encounter.3", - ], - victory: [ - "dialogue:plumeria.victory.1", - "dialogue:plumeria.victory.2", - "dialogue:plumeria.victory.3", - ] - } + encounter: ["dialogue:plumeria.encounter.1", "dialogue:plumeria.encounter.2", "dialogue:plumeria.encounter.3"], + victory: ["dialogue:plumeria.victory.1", "dialogue:plumeria.victory.2", "dialogue:plumeria.victory.3"], + }, ], [TrainerType.MACRO_GRUNT]: [ { @@ -865,22 +573,14 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:macro_grunt.victory.3", "dialogue:macro_grunt.victory.4", "dialogue:macro_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.OLEANA]: [ { - encounter: [ - "dialogue:oleana.encounter.1", - "dialogue:oleana.encounter.2", - "dialogue:oleana.encounter.3", - ], - victory: [ - "dialogue:oleana.victory.1", - "dialogue:oleana.victory.2", - "dialogue:oleana.victory.3", - ] - } + encounter: ["dialogue:oleana.encounter.1", "dialogue:oleana.encounter.2", "dialogue:oleana.encounter.3"], + victory: ["dialogue:oleana.victory.1", "dialogue:oleana.victory.2", "dialogue:oleana.victory.3"], + }, ], [TrainerType.STAR_GRUNT]: [ { @@ -897,509 +597,258 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:star_grunt.victory.3", "dialogue:star_grunt.victory.4", "dialogue:star_grunt.victory.5", - ] - } + ], + }, ], [TrainerType.GIACOMO]: [ { - encounter: [ - "dialogue:giacomo.encounter.1", - "dialogue:giacomo.encounter.2", - ], - victory: [ - "dialogue:giacomo.victory.1", - "dialogue:giacomo.victory.2", - ] - } + encounter: ["dialogue:giacomo.encounter.1", "dialogue:giacomo.encounter.2"], + victory: ["dialogue:giacomo.victory.1", "dialogue:giacomo.victory.2"], + }, ], [TrainerType.MELA]: [ { - encounter: [ - "dialogue:mela.encounter.1", - "dialogue:mela.encounter.2", - ], - victory: [ - "dialogue:mela.victory.1", - "dialogue:mela.victory.2", - ] - } + encounter: ["dialogue:mela.encounter.1", "dialogue:mela.encounter.2"], + victory: ["dialogue:mela.victory.1", "dialogue:mela.victory.2"], + }, ], [TrainerType.ATTICUS]: [ { - encounter: [ - "dialogue:atticus.encounter.1", - "dialogue:atticus.encounter.2", - ], - victory: [ - "dialogue:atticus.victory.1", - "dialogue:atticus.victory.2", - ] - } + encounter: ["dialogue:atticus.encounter.1", "dialogue:atticus.encounter.2"], + victory: ["dialogue:atticus.victory.1", "dialogue:atticus.victory.2"], + }, ], [TrainerType.ORTEGA]: [ { - encounter: [ - "dialogue:ortega.encounter.1", - "dialogue:ortega.encounter.2", - ], - victory: [ - "dialogue:ortega.victory.1", - "dialogue:ortega.victory.2", - ] - } + encounter: ["dialogue:ortega.encounter.1", "dialogue:ortega.encounter.2"], + victory: ["dialogue:ortega.victory.1", "dialogue:ortega.victory.2"], + }, ], [TrainerType.ERI]: [ { - encounter: [ - "dialogue:eri.encounter.1", - "dialogue:eri.encounter.2", - ], - victory: [ - "dialogue:eri.victory.1", - "dialogue:eri.victory.2", - ] - } + encounter: ["dialogue:eri.encounter.1", "dialogue:eri.encounter.2"], + victory: ["dialogue:eri.victory.1", "dialogue:eri.victory.2"], + }, ], [TrainerType.ROCKET_BOSS_GIOVANNI_1]: [ { - encounter: [ - "dialogue:rocket_boss_giovanni_1.encounter.1" - ], - victory: [ - "dialogue:rocket_boss_giovanni_1.victory.1" - ], - defeat: [ - "dialogue:rocket_boss_giovanni_1.defeat.1" - ] - } + encounter: ["dialogue:rocket_boss_giovanni_1.encounter.1"], + victory: ["dialogue:rocket_boss_giovanni_1.victory.1"], + defeat: ["dialogue:rocket_boss_giovanni_1.defeat.1"], + }, ], [TrainerType.ROCKET_BOSS_GIOVANNI_2]: [ { - encounter: [ - "dialogue:rocket_boss_giovanni_2.encounter.1" - ], - victory: [ - "dialogue:rocket_boss_giovanni_2.victory.1" - ], - defeat: [ - "dialogue:rocket_boss_giovanni_2.defeat.1" - ] - } + encounter: ["dialogue:rocket_boss_giovanni_2.encounter.1"], + victory: ["dialogue:rocket_boss_giovanni_2.victory.1"], + defeat: ["dialogue:rocket_boss_giovanni_2.defeat.1"], + }, ], [TrainerType.MAXIE]: [ { - encounter: [ - "dialogue:magma_boss_maxie_1.encounter.1" - ], - victory: [ - "dialogue:magma_boss_maxie_1.victory.1" - ], - defeat: [ - "dialogue:magma_boss_maxie_1.defeat.1" - ] - } + encounter: ["dialogue:magma_boss_maxie_1.encounter.1"], + victory: ["dialogue:magma_boss_maxie_1.victory.1"], + defeat: ["dialogue:magma_boss_maxie_1.defeat.1"], + }, ], [TrainerType.MAXIE_2]: [ { - encounter: [ - "dialogue:magma_boss_maxie_2.encounter.1" - ], - victory: [ - "dialogue:magma_boss_maxie_2.victory.1" - ], - defeat: [ - "dialogue:magma_boss_maxie_2.defeat.1" - ] - } + encounter: ["dialogue:magma_boss_maxie_2.encounter.1"], + victory: ["dialogue:magma_boss_maxie_2.victory.1"], + defeat: ["dialogue:magma_boss_maxie_2.defeat.1"], + }, ], [TrainerType.ARCHIE]: [ { - encounter: [ - "dialogue:aqua_boss_archie_1.encounter.1" - ], - victory: [ - "dialogue:aqua_boss_archie_1.victory.1" - ], - defeat: [ - "dialogue:aqua_boss_archie_1.defeat.1" - ] - } + encounter: ["dialogue:aqua_boss_archie_1.encounter.1"], + victory: ["dialogue:aqua_boss_archie_1.victory.1"], + defeat: ["dialogue:aqua_boss_archie_1.defeat.1"], + }, ], [TrainerType.ARCHIE_2]: [ { - encounter: [ - "dialogue:aqua_boss_archie_2.encounter.1" - ], - victory: [ - "dialogue:aqua_boss_archie_2.victory.1" - ], - defeat: [ - "dialogue:aqua_boss_archie_2.defeat.1" - ] - } + encounter: ["dialogue:aqua_boss_archie_2.encounter.1"], + victory: ["dialogue:aqua_boss_archie_2.victory.1"], + defeat: ["dialogue:aqua_boss_archie_2.defeat.1"], + }, ], [TrainerType.CYRUS]: [ { - encounter: [ - "dialogue:galactic_boss_cyrus_1.encounter.1" - ], - victory: [ - "dialogue:galactic_boss_cyrus_1.victory.1" - ], - defeat: [ - "dialogue:galactic_boss_cyrus_1.defeat.1" - ] - } + encounter: ["dialogue:galactic_boss_cyrus_1.encounter.1"], + victory: ["dialogue:galactic_boss_cyrus_1.victory.1"], + defeat: ["dialogue:galactic_boss_cyrus_1.defeat.1"], + }, ], [TrainerType.CYRUS_2]: [ { - encounter: [ - "dialogue:galactic_boss_cyrus_2.encounter.1" - ], - victory: [ - "dialogue:galactic_boss_cyrus_2.victory.1" - ], - defeat: [ - "dialogue:galactic_boss_cyrus_2.defeat.1" - ] - } + encounter: ["dialogue:galactic_boss_cyrus_2.encounter.1"], + victory: ["dialogue:galactic_boss_cyrus_2.victory.1"], + defeat: ["dialogue:galactic_boss_cyrus_2.defeat.1"], + }, ], [TrainerType.GHETSIS]: [ { - encounter: [ - "dialogue:plasma_boss_ghetsis_1.encounter.1" - ], - victory: [ - "dialogue:plasma_boss_ghetsis_1.victory.1" - ], - defeat: [ - "dialogue:plasma_boss_ghetsis_1.defeat.1" - ] - } + encounter: ["dialogue:plasma_boss_ghetsis_1.encounter.1"], + victory: ["dialogue:plasma_boss_ghetsis_1.victory.1"], + defeat: ["dialogue:plasma_boss_ghetsis_1.defeat.1"], + }, ], [TrainerType.GHETSIS_2]: [ { - encounter: [ - "dialogue:plasma_boss_ghetsis_2.encounter.1" - ], - victory: [ - "dialogue:plasma_boss_ghetsis_2.victory.1" - ], - defeat: [ - "dialogue:plasma_boss_ghetsis_2.defeat.1" - ] - } + encounter: ["dialogue:plasma_boss_ghetsis_2.encounter.1"], + victory: ["dialogue:plasma_boss_ghetsis_2.victory.1"], + defeat: ["dialogue:plasma_boss_ghetsis_2.defeat.1"], + }, ], [TrainerType.LYSANDRE]: [ { - encounter: [ - "dialogue:flare_boss_lysandre_1.encounter.1" - ], - victory: [ - "dialogue:flare_boss_lysandre_1.victory.1" - ], - defeat: [ - "dialogue:flare_boss_lysandre_1.defeat.1" - ] - } + encounter: ["dialogue:flare_boss_lysandre_1.encounter.1"], + victory: ["dialogue:flare_boss_lysandre_1.victory.1"], + defeat: ["dialogue:flare_boss_lysandre_1.defeat.1"], + }, ], [TrainerType.LYSANDRE_2]: [ { - encounter: [ - "dialogue:flare_boss_lysandre_2.encounter.1" - ], - victory: [ - "dialogue:flare_boss_lysandre_2.victory.1" - ], - defeat: [ - "dialogue:flare_boss_lysandre_2.defeat.1" - ] - } + encounter: ["dialogue:flare_boss_lysandre_2.encounter.1"], + victory: ["dialogue:flare_boss_lysandre_2.victory.1"], + defeat: ["dialogue:flare_boss_lysandre_2.defeat.1"], + }, ], [TrainerType.LUSAMINE]: [ { - encounter: [ - "dialogue:aether_boss_lusamine_1.encounter.1" - ], - victory: [ - "dialogue:aether_boss_lusamine_1.victory.1" - ], - defeat: [ - "dialogue:aether_boss_lusamine_1.defeat.1" - ] - } + encounter: ["dialogue:aether_boss_lusamine_1.encounter.1"], + victory: ["dialogue:aether_boss_lusamine_1.victory.1"], + defeat: ["dialogue:aether_boss_lusamine_1.defeat.1"], + }, ], [TrainerType.LUSAMINE_2]: [ { - encounter: [ - "dialogue:aether_boss_lusamine_2.encounter.1" - ], - victory: [ - "dialogue:aether_boss_lusamine_2.victory.1" - ], - defeat: [ - "dialogue:aether_boss_lusamine_2.defeat.1" - ] - } + encounter: ["dialogue:aether_boss_lusamine_2.encounter.1"], + victory: ["dialogue:aether_boss_lusamine_2.victory.1"], + defeat: ["dialogue:aether_boss_lusamine_2.defeat.1"], + }, ], [TrainerType.GUZMA]: [ { - encounter: [ - "dialogue:skull_boss_guzma_1.encounter.1" - ], - victory: [ - "dialogue:skull_boss_guzma_1.victory.1" - ], - defeat: [ - "dialogue:skull_boss_guzma_1.defeat.1" - ] - } + encounter: ["dialogue:skull_boss_guzma_1.encounter.1"], + victory: ["dialogue:skull_boss_guzma_1.victory.1"], + defeat: ["dialogue:skull_boss_guzma_1.defeat.1"], + }, ], [TrainerType.GUZMA_2]: [ { - encounter: [ - "dialogue:skull_boss_guzma_2.encounter.1" - ], - victory: [ - "dialogue:skull_boss_guzma_2.victory.1" - ], - defeat: [ - "dialogue:skull_boss_guzma_2.defeat.1" - ] - } + encounter: ["dialogue:skull_boss_guzma_2.encounter.1"], + victory: ["dialogue:skull_boss_guzma_2.victory.1"], + defeat: ["dialogue:skull_boss_guzma_2.defeat.1"], + }, ], [TrainerType.ROSE]: [ { - encounter: [ - "dialogue:macro_boss_rose_1.encounter.1" - ], - victory: [ - "dialogue:macro_boss_rose_1.victory.1" - ], - defeat: [ - "dialogue:macro_boss_rose_1.defeat.1" - ] - } + encounter: ["dialogue:macro_boss_rose_1.encounter.1"], + victory: ["dialogue:macro_boss_rose_1.victory.1"], + defeat: ["dialogue:macro_boss_rose_1.defeat.1"], + }, ], [TrainerType.ROSE_2]: [ { - encounter: [ - "dialogue:macro_boss_rose_2.encounter.1" - ], - victory: [ - "dialogue:macro_boss_rose_2.victory.1" - ], - defeat: [ - "dialogue:macro_boss_rose_2.defeat.1" - ] - } + encounter: ["dialogue:macro_boss_rose_2.encounter.1"], + victory: ["dialogue:macro_boss_rose_2.victory.1"], + defeat: ["dialogue:macro_boss_rose_2.defeat.1"], + }, ], [TrainerType.PENNY]: [ { - encounter: [ - "dialogue:star_boss_penny_1.encounter.1" - ], - victory: [ - "dialogue:star_boss_penny_1.victory.1" - ], - defeat: [ - "dialogue:star_boss_penny_1.defeat.1" - ] - } + encounter: ["dialogue:star_boss_penny_1.encounter.1"], + victory: ["dialogue:star_boss_penny_1.victory.1"], + defeat: ["dialogue:star_boss_penny_1.defeat.1"], + }, ], [TrainerType.PENNY_2]: [ { - encounter: [ - "dialogue:star_boss_penny_2.encounter.1" - ], - victory: [ - "dialogue:star_boss_penny_2.victory.1" - ], - defeat: [ - "dialogue:star_boss_penny_2.defeat.1" - ] - } + encounter: ["dialogue:star_boss_penny_2.encounter.1"], + victory: ["dialogue:star_boss_penny_2.victory.1"], + defeat: ["dialogue:star_boss_penny_2.defeat.1"], + }, ], [TrainerType.BUCK]: [ { - encounter: [ - "dialogue:stat_trainer_buck.encounter.1", - "dialogue:stat_trainer_buck.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_buck.victory.1", - "dialogue:stat_trainer_buck.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_buck.defeat.1", - "dialogue:stat_trainer_buck.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_buck.encounter.1", "dialogue:stat_trainer_buck.encounter.2"], + victory: ["dialogue:stat_trainer_buck.victory.1", "dialogue:stat_trainer_buck.victory.2"], + defeat: ["dialogue:stat_trainer_buck.defeat.1", "dialogue:stat_trainer_buck.defeat.2"], + }, ], [TrainerType.CHERYL]: [ { - encounter: [ - "dialogue:stat_trainer_cheryl.encounter.1", - "dialogue:stat_trainer_cheryl.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_cheryl.victory.1", - "dialogue:stat_trainer_cheryl.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_cheryl.defeat.1", - "dialogue:stat_trainer_cheryl.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_cheryl.encounter.1", "dialogue:stat_trainer_cheryl.encounter.2"], + victory: ["dialogue:stat_trainer_cheryl.victory.1", "dialogue:stat_trainer_cheryl.victory.2"], + defeat: ["dialogue:stat_trainer_cheryl.defeat.1", "dialogue:stat_trainer_cheryl.defeat.2"], + }, ], [TrainerType.MARLEY]: [ { - encounter: [ - "dialogue:stat_trainer_marley.encounter.1", - "dialogue:stat_trainer_marley.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_marley.victory.1", - "dialogue:stat_trainer_marley.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_marley.defeat.1", - "dialogue:stat_trainer_marley.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_marley.encounter.1", "dialogue:stat_trainer_marley.encounter.2"], + victory: ["dialogue:stat_trainer_marley.victory.1", "dialogue:stat_trainer_marley.victory.2"], + defeat: ["dialogue:stat_trainer_marley.defeat.1", "dialogue:stat_trainer_marley.defeat.2"], + }, ], [TrainerType.MIRA]: [ { - encounter: [ - "dialogue:stat_trainer_mira.encounter.1", - "dialogue:stat_trainer_mira.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_mira.victory.1", - "dialogue:stat_trainer_mira.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_mira.defeat.1", - "dialogue:stat_trainer_mira.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_mira.encounter.1", "dialogue:stat_trainer_mira.encounter.2"], + victory: ["dialogue:stat_trainer_mira.victory.1", "dialogue:stat_trainer_mira.victory.2"], + defeat: ["dialogue:stat_trainer_mira.defeat.1", "dialogue:stat_trainer_mira.defeat.2"], + }, ], [TrainerType.RILEY]: [ { - encounter: [ - "dialogue:stat_trainer_riley.encounter.1", - "dialogue:stat_trainer_riley.encounter.2" - ], - victory: [ - "dialogue:stat_trainer_riley.victory.1", - "dialogue:stat_trainer_riley.victory.2" - ], - defeat: [ - "dialogue:stat_trainer_riley.defeat.1", - "dialogue:stat_trainer_riley.defeat.2" - ] - } + encounter: ["dialogue:stat_trainer_riley.encounter.1", "dialogue:stat_trainer_riley.encounter.2"], + victory: ["dialogue:stat_trainer_riley.victory.1", "dialogue:stat_trainer_riley.victory.2"], + defeat: ["dialogue:stat_trainer_riley.defeat.1", "dialogue:stat_trainer_riley.defeat.2"], + }, ], [TrainerType.VICTOR]: [ { - encounter: [ - "dialogue:winstrates_victor.encounter.1", - ], - victory: [ - "dialogue:winstrates_victor.victory.1" - ], - } + encounter: ["dialogue:winstrates_victor.encounter.1"], + victory: ["dialogue:winstrates_victor.victory.1"], + }, ], [TrainerType.VICTORIA]: [ { - encounter: [ - "dialogue:winstrates_victoria.encounter.1", - ], - victory: [ - "dialogue:winstrates_victoria.victory.1" - ], - } + encounter: ["dialogue:winstrates_victoria.encounter.1"], + victory: ["dialogue:winstrates_victoria.victory.1"], + }, ], [TrainerType.VIVI]: [ { - encounter: [ - "dialogue:winstrates_vivi.encounter.1", - ], - victory: [ - "dialogue:winstrates_vivi.victory.1" - ], - } + encounter: ["dialogue:winstrates_vivi.encounter.1"], + victory: ["dialogue:winstrates_vivi.victory.1"], + }, ], [TrainerType.VICKY]: [ { - encounter: [ - "dialogue:winstrates_vicky.encounter.1", - ], - victory: [ - "dialogue:winstrates_vicky.victory.1" - ], - } + encounter: ["dialogue:winstrates_vicky.encounter.1"], + victory: ["dialogue:winstrates_vicky.victory.1"], + }, ], [TrainerType.VITO]: [ { - encounter: [ - "dialogue:winstrates_vito.encounter.1", - ], - victory: [ - "dialogue:winstrates_vito.victory.1" - ], - } + encounter: ["dialogue:winstrates_vito.encounter.1"], + victory: ["dialogue:winstrates_vito.victory.1"], + }, ], [TrainerType.BROCK]: { - encounter: [ - "dialogue:brock.encounter.1", - "dialogue:brock.encounter.2", - "dialogue:brock.encounter.3", - ], - victory: [ - "dialogue:brock.victory.1", - "dialogue:brock.victory.2", - "dialogue:brock.victory.3", - ], - defeat: [ - "dialogue:brock.defeat.1", - "dialogue:brock.defeat.2", - "dialogue:brock.defeat.3", - ] + encounter: ["dialogue:brock.encounter.1", "dialogue:brock.encounter.2", "dialogue:brock.encounter.3"], + victory: ["dialogue:brock.victory.1", "dialogue:brock.victory.2", "dialogue:brock.victory.3"], + defeat: ["dialogue:brock.defeat.1", "dialogue:brock.defeat.2", "dialogue:brock.defeat.3"], }, [TrainerType.MISTY]: { - encounter: [ - "dialogue:misty.encounter.1", - "dialogue:misty.encounter.2", - "dialogue:misty.encounter.3", - ], - victory: [ - "dialogue:misty.victory.1", - "dialogue:misty.victory.2", - "dialogue:misty.victory.3", - ], - defeat: [ - "dialogue:misty.defeat.1", - "dialogue:misty.defeat.2", - "dialogue:misty.defeat.3", - ] + encounter: ["dialogue:misty.encounter.1", "dialogue:misty.encounter.2", "dialogue:misty.encounter.3"], + victory: ["dialogue:misty.victory.1", "dialogue:misty.victory.2", "dialogue:misty.victory.3"], + defeat: ["dialogue:misty.defeat.1", "dialogue:misty.defeat.2", "dialogue:misty.defeat.3"], }, [TrainerType.LT_SURGE]: { - encounter: [ - "dialogue:lt_surge.encounter.1", - "dialogue:lt_surge.encounter.2", - "dialogue:lt_surge.encounter.3", - ], - victory: [ - "dialogue:lt_surge.victory.1", - "dialogue:lt_surge.victory.2", - "dialogue:lt_surge.victory.3", - ], - defeat: [ - "dialogue:lt_surge.defeat.1", - "dialogue:lt_surge.defeat.2", - "dialogue:lt_surge.defeat.3", - ] + encounter: ["dialogue:lt_surge.encounter.1", "dialogue:lt_surge.encounter.2", "dialogue:lt_surge.encounter.3"], + victory: ["dialogue:lt_surge.victory.1", "dialogue:lt_surge.victory.2", "dialogue:lt_surge.victory.3"], + defeat: ["dialogue:lt_surge.defeat.1", "dialogue:lt_surge.defeat.2", "dialogue:lt_surge.defeat.3"], }, [TrainerType.ERIKA]: { encounter: [ @@ -1419,420 +868,151 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:erika.defeat.2", "dialogue:erika.defeat.3", "dialogue:erika.defeat.4", - ] + ], }, [TrainerType.JANINE]: { - encounter: [ - "dialogue:janine.encounter.1", - "dialogue:janine.encounter.2", - "dialogue:janine.encounter.3", - ], - victory: [ - "dialogue:janine.victory.1", - "dialogue:janine.victory.2", - "dialogue:janine.victory.3", - ], - defeat: [ - "dialogue:janine.defeat.1", - "dialogue:janine.defeat.2", - "dialogue:janine.defeat.3", - ] + encounter: ["dialogue:janine.encounter.1", "dialogue:janine.encounter.2", "dialogue:janine.encounter.3"], + victory: ["dialogue:janine.victory.1", "dialogue:janine.victory.2", "dialogue:janine.victory.3"], + defeat: ["dialogue:janine.defeat.1", "dialogue:janine.defeat.2", "dialogue:janine.defeat.3"], }, [TrainerType.SABRINA]: { - encounter: [ - "dialogue:sabrina.encounter.1", - "dialogue:sabrina.encounter.2", - "dialogue:sabrina.encounter.3", - ], - victory: [ - "dialogue:sabrina.victory.1", - "dialogue:sabrina.victory.2", - "dialogue:sabrina.victory.3", - ], - defeat: [ - "dialogue:sabrina.defeat.1", - "dialogue:sabrina.defeat.2", - "dialogue:sabrina.defeat.3", - ] + encounter: ["dialogue:sabrina.encounter.1", "dialogue:sabrina.encounter.2", "dialogue:sabrina.encounter.3"], + victory: ["dialogue:sabrina.victory.1", "dialogue:sabrina.victory.2", "dialogue:sabrina.victory.3"], + defeat: ["dialogue:sabrina.defeat.1", "dialogue:sabrina.defeat.2", "dialogue:sabrina.defeat.3"], }, [TrainerType.BLAINE]: { - encounter: [ - "dialogue:blaine.encounter.1", - "dialogue:blaine.encounter.2", - "dialogue:blaine.encounter.3", - ], - victory: [ - "dialogue:blaine.victory.1", - "dialogue:blaine.victory.2", - "dialogue:blaine.victory.3", - ], - defeat: [ - "dialogue:blaine.defeat.1", - "dialogue:blaine.defeat.2", - "dialogue:blaine.defeat.3", - ] + encounter: ["dialogue:blaine.encounter.1", "dialogue:blaine.encounter.2", "dialogue:blaine.encounter.3"], + victory: ["dialogue:blaine.victory.1", "dialogue:blaine.victory.2", "dialogue:blaine.victory.3"], + defeat: ["dialogue:blaine.defeat.1", "dialogue:blaine.defeat.2", "dialogue:blaine.defeat.3"], }, [TrainerType.GIOVANNI]: { - encounter: [ - "dialogue:giovanni.encounter.1", - "dialogue:giovanni.encounter.2", - "dialogue:giovanni.encounter.3", - ], - victory: [ - "dialogue:giovanni.victory.1", - "dialogue:giovanni.victory.2", - "dialogue:giovanni.victory.3", - ], - defeat: [ - "dialogue:giovanni.defeat.1", - "dialogue:giovanni.defeat.2", - "dialogue:giovanni.defeat.3", - ] + encounter: ["dialogue:giovanni.encounter.1", "dialogue:giovanni.encounter.2", "dialogue:giovanni.encounter.3"], + victory: ["dialogue:giovanni.victory.1", "dialogue:giovanni.victory.2", "dialogue:giovanni.victory.3"], + defeat: ["dialogue:giovanni.defeat.1", "dialogue:giovanni.defeat.2", "dialogue:giovanni.defeat.3"], }, [TrainerType.ROXANNE]: { - encounter: [ - "dialogue:roxanne.encounter.1", - "dialogue:roxanne.encounter.2", - "dialogue:roxanne.encounter.3" - ], - victory: [ - "dialogue:roxanne.victory.1", - "dialogue:roxanne.victory.2", - "dialogue:roxanne.victory.3" - ], - defeat: [ - "dialogue:roxanne.defeat.1", - "dialogue:roxanne.defeat.2", - "dialogue:roxanne.defeat.3" - ] + encounter: ["dialogue:roxanne.encounter.1", "dialogue:roxanne.encounter.2", "dialogue:roxanne.encounter.3"], + victory: ["dialogue:roxanne.victory.1", "dialogue:roxanne.victory.2", "dialogue:roxanne.victory.3"], + defeat: ["dialogue:roxanne.defeat.1", "dialogue:roxanne.defeat.2", "dialogue:roxanne.defeat.3"], }, [TrainerType.BRAWLY]: { - encounter: [ - "dialogue:brawly.encounter.1", - "dialogue:brawly.encounter.2", - "dialogue:brawly.encounter.3" - ], - victory: [ - "dialogue:brawly.victory.1", - "dialogue:brawly.victory.2", - "dialogue:brawly.victory.3" - ], - defeat: [ - "dialogue:brawly.defeat.1", - "dialogue:brawly.defeat.2", - "dialogue:brawly.defeat.3" - ] + encounter: ["dialogue:brawly.encounter.1", "dialogue:brawly.encounter.2", "dialogue:brawly.encounter.3"], + victory: ["dialogue:brawly.victory.1", "dialogue:brawly.victory.2", "dialogue:brawly.victory.3"], + defeat: ["dialogue:brawly.defeat.1", "dialogue:brawly.defeat.2", "dialogue:brawly.defeat.3"], }, [TrainerType.WATTSON]: { - encounter: [ - "dialogue:wattson.encounter.1", - "dialogue:wattson.encounter.2", - "dialogue:wattson.encounter.3" - ], - victory: [ - "dialogue:wattson.victory.1", - "dialogue:wattson.victory.2", - "dialogue:wattson.victory.3" - ], - defeat: [ - "dialogue:wattson.defeat.1", - "dialogue:wattson.defeat.2", - "dialogue:wattson.defeat.3" - ] + encounter: ["dialogue:wattson.encounter.1", "dialogue:wattson.encounter.2", "dialogue:wattson.encounter.3"], + victory: ["dialogue:wattson.victory.1", "dialogue:wattson.victory.2", "dialogue:wattson.victory.3"], + defeat: ["dialogue:wattson.defeat.1", "dialogue:wattson.defeat.2", "dialogue:wattson.defeat.3"], }, [TrainerType.FLANNERY]: { - encounter: [ - "dialogue:flannery.encounter.1", - "dialogue:flannery.encounter.2", - "dialogue:flannery.encounter.3" - ], - victory: [ - "dialogue:flannery.victory.1", - "dialogue:flannery.victory.2", - "dialogue:flannery.victory.3" - ], - defeat: [ - "dialogue:flannery.defeat.1", - "dialogue:flannery.defeat.2", - "dialogue:flannery.defeat.3" - ] + encounter: ["dialogue:flannery.encounter.1", "dialogue:flannery.encounter.2", "dialogue:flannery.encounter.3"], + victory: ["dialogue:flannery.victory.1", "dialogue:flannery.victory.2", "dialogue:flannery.victory.3"], + defeat: ["dialogue:flannery.defeat.1", "dialogue:flannery.defeat.2", "dialogue:flannery.defeat.3"], }, [TrainerType.NORMAN]: { - encounter: [ - "dialogue:norman.encounter.1", - "dialogue:norman.encounter.2", - "dialogue:norman.encounter.3" - ], - victory: [ - "dialogue:norman.victory.1", - "dialogue:norman.victory.2", - "dialogue:norman.victory.3" - ], - defeat: [ - "dialogue:norman.defeat.1", - "dialogue:norman.defeat.2", - "dialogue:norman.defeat.3" - ] + encounter: ["dialogue:norman.encounter.1", "dialogue:norman.encounter.2", "dialogue:norman.encounter.3"], + victory: ["dialogue:norman.victory.1", "dialogue:norman.victory.2", "dialogue:norman.victory.3"], + defeat: ["dialogue:norman.defeat.1", "dialogue:norman.defeat.2", "dialogue:norman.defeat.3"], }, [TrainerType.WINONA]: { - encounter: [ - "dialogue:winona.encounter.1", - "dialogue:winona.encounter.2", - "dialogue:winona.encounter.3" - ], - victory: [ - "dialogue:winona.victory.1", - "dialogue:winona.victory.2", - "dialogue:winona.victory.3" - ], - defeat: [ - "dialogue:winona.defeat.1", - "dialogue:winona.defeat.2", - "dialogue:winona.defeat.3" - ] + encounter: ["dialogue:winona.encounter.1", "dialogue:winona.encounter.2", "dialogue:winona.encounter.3"], + victory: ["dialogue:winona.victory.1", "dialogue:winona.victory.2", "dialogue:winona.victory.3"], + defeat: ["dialogue:winona.defeat.1", "dialogue:winona.defeat.2", "dialogue:winona.defeat.3"], }, [TrainerType.TATE]: { - encounter: [ - "dialogue:tate.encounter.1", - "dialogue:tate.encounter.2", - "dialogue:tate.encounter.3" - ], - victory: [ - "dialogue:tate.victory.1", - "dialogue:tate.victory.2", - "dialogue:tate.victory.3" - ], - defeat: [ - "dialogue:tate.defeat.1", - "dialogue:tate.defeat.2", - "dialogue:tate.defeat.3" - ] + encounter: ["dialogue:tate.encounter.1", "dialogue:tate.encounter.2", "dialogue:tate.encounter.3"], + victory: ["dialogue:tate.victory.1", "dialogue:tate.victory.2", "dialogue:tate.victory.3"], + defeat: ["dialogue:tate.defeat.1", "dialogue:tate.defeat.2", "dialogue:tate.defeat.3"], }, [TrainerType.LIZA]: { - encounter: [ - "dialogue:liza.encounter.1", - "dialogue:liza.encounter.2", - "dialogue:liza.encounter.3" - ], - victory: [ - "dialogue:liza.victory.1", - "dialogue:liza.victory.2", - "dialogue:liza.victory.3" - ], - defeat: [ - "dialogue:liza.defeat.1", - "dialogue:liza.defeat.2", - "dialogue:liza.defeat.3" - ] + encounter: ["dialogue:liza.encounter.1", "dialogue:liza.encounter.2", "dialogue:liza.encounter.3"], + victory: ["dialogue:liza.victory.1", "dialogue:liza.victory.2", "dialogue:liza.victory.3"], + defeat: ["dialogue:liza.defeat.1", "dialogue:liza.defeat.2", "dialogue:liza.defeat.3"], }, [TrainerType.JUAN]: { encounter: [ "dialogue:juan.encounter.1", "dialogue:juan.encounter.2", "dialogue:juan.encounter.3", - "dialogue:juan.encounter.4" + "dialogue:juan.encounter.4", ], victory: [ "dialogue:juan.victory.1", "dialogue:juan.victory.2", "dialogue:juan.victory.3", - "dialogue:juan.victory.4" + "dialogue:juan.victory.4", ], - defeat: [ - "dialogue:juan.defeat.1", - "dialogue:juan.defeat.2", - "dialogue:juan.defeat.3", - "dialogue:juan.defeat.4" - ] + defeat: ["dialogue:juan.defeat.1", "dialogue:juan.defeat.2", "dialogue:juan.defeat.3", "dialogue:juan.defeat.4"], }, [TrainerType.CRASHER_WAKE]: { encounter: [ "dialogue:crasher_wake.encounter.1", "dialogue:crasher_wake.encounter.2", - "dialogue:crasher_wake.encounter.3" + "dialogue:crasher_wake.encounter.3", ], - victory: [ - "dialogue:crasher_wake.victory.1", - "dialogue:crasher_wake.victory.2", - "dialogue:crasher_wake.victory.3" - ], - defeat: [ - "dialogue:crasher_wake.defeat.1", - "dialogue:crasher_wake.defeat.2", - "dialogue:crasher_wake.defeat.3" - ] + victory: ["dialogue:crasher_wake.victory.1", "dialogue:crasher_wake.victory.2", "dialogue:crasher_wake.victory.3"], + defeat: ["dialogue:crasher_wake.defeat.1", "dialogue:crasher_wake.defeat.2", "dialogue:crasher_wake.defeat.3"], }, [TrainerType.FALKNER]: { - encounter: [ - "dialogue:falkner.encounter.1", - "dialogue:falkner.encounter.2", - "dialogue:falkner.encounter.3" - ], - victory: [ - "dialogue:falkner.victory.1", - "dialogue:falkner.victory.2", - "dialogue:falkner.victory.3" - ], - defeat: [ - "dialogue:falkner.defeat.1", - "dialogue:falkner.defeat.2", - "dialogue:falkner.defeat.3" - ] + encounter: ["dialogue:falkner.encounter.1", "dialogue:falkner.encounter.2", "dialogue:falkner.encounter.3"], + victory: ["dialogue:falkner.victory.1", "dialogue:falkner.victory.2", "dialogue:falkner.victory.3"], + defeat: ["dialogue:falkner.defeat.1", "dialogue:falkner.defeat.2", "dialogue:falkner.defeat.3"], }, [TrainerType.NESSA]: { - encounter: [ - "dialogue:nessa.encounter.1", - "dialogue:nessa.encounter.2", - "dialogue:nessa.encounter.3" - ], - victory: [ - "dialogue:nessa.victory.1", - "dialogue:nessa.victory.2", - "dialogue:nessa.victory.3" - ], - defeat: [ - "dialogue:nessa.defeat.1", - "dialogue:nessa.defeat.2", - "dialogue:nessa.defeat.3" - ] + encounter: ["dialogue:nessa.encounter.1", "dialogue:nessa.encounter.2", "dialogue:nessa.encounter.3"], + victory: ["dialogue:nessa.victory.1", "dialogue:nessa.victory.2", "dialogue:nessa.victory.3"], + defeat: ["dialogue:nessa.defeat.1", "dialogue:nessa.defeat.2", "dialogue:nessa.defeat.3"], }, [TrainerType.MELONY]: { - encounter: [ - "dialogue:melony.encounter.1", - "dialogue:melony.encounter.2", - "dialogue:melony.encounter.3" - ], - victory: [ - "dialogue:melony.victory.1", - "dialogue:melony.victory.2", - "dialogue:melony.victory.3" - ], - defeat: [ - "dialogue:melony.defeat.1", - "dialogue:melony.defeat.2", - "dialogue:melony.defeat.3" - ] + encounter: ["dialogue:melony.encounter.1", "dialogue:melony.encounter.2", "dialogue:melony.encounter.3"], + victory: ["dialogue:melony.victory.1", "dialogue:melony.victory.2", "dialogue:melony.victory.3"], + defeat: ["dialogue:melony.defeat.1", "dialogue:melony.defeat.2", "dialogue:melony.defeat.3"], }, [TrainerType.MARLON]: { - encounter: [ - "dialogue:marlon.encounter.1", - "dialogue:marlon.encounter.2", - "dialogue:marlon.encounter.3" - ], - victory: [ - "dialogue:marlon.victory.1", - "dialogue:marlon.victory.2", - "dialogue:marlon.victory.3" - ], - defeat: [ - "dialogue:marlon.defeat.1", - "dialogue:marlon.defeat.2", - "dialogue:marlon.defeat.3" - ] + encounter: ["dialogue:marlon.encounter.1", "dialogue:marlon.encounter.2", "dialogue:marlon.encounter.3"], + victory: ["dialogue:marlon.victory.1", "dialogue:marlon.victory.2", "dialogue:marlon.victory.3"], + defeat: ["dialogue:marlon.defeat.1", "dialogue:marlon.defeat.2", "dialogue:marlon.defeat.3"], }, [TrainerType.SHAUNTAL]: { - encounter: [ - "dialogue:shauntal.encounter.1", - "dialogue:shauntal.encounter.2", - "dialogue:shauntal.encounter.3" - ], - victory: [ - "dialogue:shauntal.victory.1", - "dialogue:shauntal.victory.2", - "dialogue:shauntal.victory.3" - ], - defeat: [ - "dialogue:shauntal.defeat.1", - "dialogue:shauntal.defeat.2", - "dialogue:shauntal.defeat.3" - ] + encounter: ["dialogue:shauntal.encounter.1", "dialogue:shauntal.encounter.2", "dialogue:shauntal.encounter.3"], + victory: ["dialogue:shauntal.victory.1", "dialogue:shauntal.victory.2", "dialogue:shauntal.victory.3"], + defeat: ["dialogue:shauntal.defeat.1", "dialogue:shauntal.defeat.2", "dialogue:shauntal.defeat.3"], }, [TrainerType.MARSHAL]: { - encounter: [ - "dialogue:marshal.encounter.1", - "dialogue:marshal.encounter.2", - "dialogue:marshal.encounter.3" - ], - victory: [ - "dialogue:marshal.victory.1", - "dialogue:marshal.victory.2", - "dialogue:marshal.victory.3" - ], - defeat: [ - "dialogue:marshal.defeat.1", - "dialogue:marshal.defeat.2", - "dialogue:marshal.defeat.3" - ] + encounter: ["dialogue:marshal.encounter.1", "dialogue:marshal.encounter.2", "dialogue:marshal.encounter.3"], + victory: ["dialogue:marshal.victory.1", "dialogue:marshal.victory.2", "dialogue:marshal.victory.3"], + defeat: ["dialogue:marshal.defeat.1", "dialogue:marshal.defeat.2", "dialogue:marshal.defeat.3"], }, [TrainerType.CHEREN]: { - encounter: [ - "dialogue:cheren.encounter.1", - "dialogue:cheren.encounter.2", - "dialogue:cheren.encounter.3" - ], - victory: [ - "dialogue:cheren.victory.1", - "dialogue:cheren.victory.2", - "dialogue:cheren.victory.3" - ], - defeat: [ - "dialogue:cheren.defeat.1", - "dialogue:cheren.defeat.2", - "dialogue:cheren.defeat.3" - ] + encounter: ["dialogue:cheren.encounter.1", "dialogue:cheren.encounter.2", "dialogue:cheren.encounter.3"], + victory: ["dialogue:cheren.victory.1", "dialogue:cheren.victory.2", "dialogue:cheren.victory.3"], + defeat: ["dialogue:cheren.defeat.1", "dialogue:cheren.defeat.2", "dialogue:cheren.defeat.3"], }, [TrainerType.CHILI]: { - encounter: [ - "dialogue:chili.encounter.1", - "dialogue:chili.encounter.2", - "dialogue:chili.encounter.3" - ], - victory: [ - "dialogue:chili.victory.1", - "dialogue:chili.victory.2", - "dialogue:chili.victory.3" - ], - defeat: [ - "dialogue:chili.defeat.1", - "dialogue:chili.defeat.2", - "dialogue:chili.defeat.3" - ] + encounter: ["dialogue:chili.encounter.1", "dialogue:chili.encounter.2", "dialogue:chili.encounter.3"], + victory: ["dialogue:chili.victory.1", "dialogue:chili.victory.2", "dialogue:chili.victory.3"], + defeat: ["dialogue:chili.defeat.1", "dialogue:chili.defeat.2", "dialogue:chili.defeat.3"], }, [TrainerType.CILAN]: { - encounter: [ - "dialogue:cilan.encounter.1", - "dialogue:cilan.encounter.2", - "dialogue:cilan.encounter.3" - ], - victory: [ - "dialogue:cilan.victory.1", - "dialogue:cilan.victory.2", - "dialogue:cilan.victory.3" - ], - defeat: [ - "dialogue:cilan.defeat.1", - "dialogue:cilan.defeat.2", - "dialogue:cilan.defeat.3" - ] + encounter: ["dialogue:cilan.encounter.1", "dialogue:cilan.encounter.2", "dialogue:cilan.encounter.3"], + victory: ["dialogue:cilan.victory.1", "dialogue:cilan.victory.2", "dialogue:cilan.victory.3"], + defeat: ["dialogue:cilan.defeat.1", "dialogue:cilan.defeat.2", "dialogue:cilan.defeat.3"], }, [TrainerType.ROARK]: { encounter: [ "dialogue:roark.encounter.1", "dialogue:roark.encounter.2", "dialogue:roark.encounter.3", - "dialogue:roark.encounter.4" + "dialogue:roark.encounter.4", ], victory: [ "dialogue:roark.victory.1", "dialogue:roark.victory.2", "dialogue:roark.victory.3", - "dialogue:roark.victory.4" + "dialogue:roark.victory.4", ], - defeat: [ - "dialogue:roark.defeat.1", - "dialogue:roark.defeat.2", - "dialogue:roark.defeat.3" - ] + defeat: ["dialogue:roark.defeat.1", "dialogue:roark.defeat.2", "dialogue:roark.defeat.3"], }, [TrainerType.MORTY]: { encounter: [ @@ -1841,7 +1021,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:morty.encounter.3", "dialogue:morty.encounter.4", "dialogue:morty.encounter.5", - "dialogue:morty.encounter.6" + "dialogue:morty.encounter.6", ], victory: [ "dialogue:morty.victory.1", @@ -1849,7 +1029,7 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:morty.victory.3", "dialogue:morty.victory.4", "dialogue:morty.victory.5", - "dialogue:morty.victory.6" + "dialogue:morty.victory.6", ], defeat: [ "dialogue:morty.defeat.1", @@ -1857,1313 +1037,626 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:morty.defeat.3", "dialogue:morty.defeat.4", "dialogue:morty.defeat.5", - "dialogue:morty.defeat.6" - ] + "dialogue:morty.defeat.6", + ], }, [TrainerType.CRISPIN]: { - encounter: [ - "dialogue:crispin.encounter.1", - "dialogue:crispin.encounter.2" - ], - victory: [ - "dialogue:crispin.victory.1", - "dialogue:crispin.victory.2" - ], - defeat: [ - "dialogue:crispin.defeat.1", - "dialogue:crispin.defeat.2" - ] + encounter: ["dialogue:crispin.encounter.1", "dialogue:crispin.encounter.2"], + victory: ["dialogue:crispin.victory.1", "dialogue:crispin.victory.2"], + defeat: ["dialogue:crispin.defeat.1", "dialogue:crispin.defeat.2"], }, [TrainerType.AMARYS]: { - encounter: [ - "dialogue:amarys.encounter.1" - ], - victory: [ - "dialogue:amarys.victory.1" - ], - defeat: [ - "dialogue:amarys.defeat.1" - ] + encounter: ["dialogue:amarys.encounter.1"], + victory: ["dialogue:amarys.victory.1"], + defeat: ["dialogue:amarys.defeat.1"], }, [TrainerType.LACEY]: { - encounter: [ - "dialogue:lacey.encounter.1" - ], - victory: [ - "dialogue:lacey.victory.1" - ], - defeat: [ - "dialogue:lacey.defeat.1" - ] + encounter: ["dialogue:lacey.encounter.1"], + victory: ["dialogue:lacey.victory.1"], + defeat: ["dialogue:lacey.defeat.1"], }, [TrainerType.DRAYTON]: { - encounter: [ - "dialogue:drayton.encounter.1" - ], - victory: [ - "dialogue:drayton.victory.1" - ], - defeat: [ - "dialogue:drayton.defeat.1" - ] + encounter: ["dialogue:drayton.encounter.1"], + victory: ["dialogue:drayton.victory.1"], + defeat: ["dialogue:drayton.defeat.1"], }, [TrainerType.RAMOS]: { - encounter: [ - "dialogue:ramos.encounter.1" - ], - victory: [ - "dialogue:ramos.victory.1" - ], - defeat: [ - "dialogue:ramos.defeat.1" - ] + encounter: ["dialogue:ramos.encounter.1"], + victory: ["dialogue:ramos.victory.1"], + defeat: ["dialogue:ramos.defeat.1"], }, [TrainerType.VIOLA]: { - encounter: [ - "dialogue:viola.encounter.1", - "dialogue:viola.encounter.2" - ], - victory: [ - "dialogue:viola.victory.1", - "dialogue:viola.victory.2" - ], - defeat: [ - "dialogue:viola.defeat.1", - "dialogue:viola.defeat.2" - ] + encounter: ["dialogue:viola.encounter.1", "dialogue:viola.encounter.2"], + victory: ["dialogue:viola.victory.1", "dialogue:viola.victory.2"], + defeat: ["dialogue:viola.defeat.1", "dialogue:viola.defeat.2"], }, [TrainerType.CANDICE]: { - encounter: [ - "dialogue:candice.encounter.1", - "dialogue:candice.encounter.2" - ], - victory: [ - "dialogue:candice.victory.1", - "dialogue:candice.victory.2" - ], - defeat: [ - "dialogue:candice.defeat.1", - "dialogue:candice.defeat.2" - ] + encounter: ["dialogue:candice.encounter.1", "dialogue:candice.encounter.2"], + victory: ["dialogue:candice.victory.1", "dialogue:candice.victory.2"], + defeat: ["dialogue:candice.defeat.1", "dialogue:candice.defeat.2"], }, [TrainerType.GARDENIA]: { - encounter: [ - "dialogue:gardenia.encounter.1" - ], - victory: [ - "dialogue:gardenia.victory.1" - ], - defeat: [ - "dialogue:gardenia.defeat.1" - ] + encounter: ["dialogue:gardenia.encounter.1"], + victory: ["dialogue:gardenia.victory.1"], + defeat: ["dialogue:gardenia.defeat.1"], }, [TrainerType.AARON]: { - encounter: [ - "dialogue:aaron.encounter.1" - ], - victory: [ - "dialogue:aaron.victory.1" - ], - defeat: [ - "dialogue:aaron.defeat.1" - ] + encounter: ["dialogue:aaron.encounter.1"], + victory: ["dialogue:aaron.victory.1"], + defeat: ["dialogue:aaron.defeat.1"], }, [TrainerType.CRESS]: { - encounter: [ - "dialogue:cress.encounter.1" - ], - victory: [ - "dialogue:cress.victory.1" - ], - defeat: [ - "dialogue:cress.defeat.1" - ] + encounter: ["dialogue:cress.encounter.1"], + victory: ["dialogue:cress.victory.1"], + defeat: ["dialogue:cress.defeat.1"], }, [TrainerType.ALLISTER]: { - encounter: [ - "dialogue:allister.encounter.1" - ], - victory: [ - "dialogue:allister.victory.1" - ], - defeat: [ - "dialogue:allister.defeat.1" - ] + encounter: ["dialogue:allister.encounter.1"], + victory: ["dialogue:allister.victory.1"], + defeat: ["dialogue:allister.defeat.1"], }, [TrainerType.CLAY]: { - encounter: [ - "dialogue:clay.encounter.1" - ], - victory: [ - "dialogue:clay.victory.1" - ], - defeat: [ - "dialogue:clay.defeat.1" - ] + encounter: ["dialogue:clay.encounter.1"], + victory: ["dialogue:clay.victory.1"], + defeat: ["dialogue:clay.defeat.1"], }, [TrainerType.KOFU]: { - encounter: [ - "dialogue:kofu.encounter.1" - ], - victory: [ - "dialogue:kofu.victory.1" - ], - defeat: [ - "dialogue:kofu.defeat.1" - ] + encounter: ["dialogue:kofu.encounter.1"], + victory: ["dialogue:kofu.victory.1"], + defeat: ["dialogue:kofu.defeat.1"], }, [TrainerType.TULIP]: { - encounter: [ - "dialogue:tulip.encounter.1" - ], - victory: [ - "dialogue:tulip.victory.1" - ], - defeat: [ - "dialogue:tulip.defeat.1" - ] + encounter: ["dialogue:tulip.encounter.1"], + victory: ["dialogue:tulip.victory.1"], + defeat: ["dialogue:tulip.defeat.1"], }, [TrainerType.SIDNEY]: { - encounter: [ - "dialogue:sidney.encounter.1" - ], - victory: [ - "dialogue:sidney.victory.1" - ], - defeat: [ - "dialogue:sidney.defeat.1" - ] + encounter: ["dialogue:sidney.encounter.1"], + victory: ["dialogue:sidney.victory.1"], + defeat: ["dialogue:sidney.defeat.1"], }, [TrainerType.PHOEBE]: { - encounter: [ - "dialogue:phoebe.encounter.1" - ], - victory: [ - "dialogue:phoebe.victory.1" - ], - defeat: [ - "dialogue:phoebe.defeat.1" - ] + encounter: ["dialogue:phoebe.encounter.1"], + victory: ["dialogue:phoebe.victory.1"], + defeat: ["dialogue:phoebe.defeat.1"], }, [TrainerType.GLACIA]: { - encounter: [ - "dialogue:glacia.encounter.1" - ], - victory: [ - "dialogue:glacia.victory.1" - ], - defeat: [ - "dialogue:glacia.defeat.1" - ] + encounter: ["dialogue:glacia.encounter.1"], + victory: ["dialogue:glacia.victory.1"], + defeat: ["dialogue:glacia.defeat.1"], }, [TrainerType.DRAKE]: { - encounter: [ - "dialogue:drake.encounter.1" - ], - victory: [ - "dialogue:drake.victory.1" - ], - defeat: [ - "dialogue:drake.defeat.1" - ] + encounter: ["dialogue:drake.encounter.1"], + victory: ["dialogue:drake.victory.1"], + defeat: ["dialogue:drake.defeat.1"], }, [TrainerType.WALLACE]: { - encounter: [ - "dialogue:wallace.encounter.1" - ], - victory: [ - "dialogue:wallace.victory.1" - ], - defeat: [ - "dialogue:wallace.defeat.1" - ] + encounter: ["dialogue:wallace.encounter.1"], + victory: ["dialogue:wallace.victory.1"], + defeat: ["dialogue:wallace.defeat.1"], }, [TrainerType.LORELEI]: { - encounter: [ - "dialogue:lorelei.encounter.1" - ], - victory: [ - "dialogue:lorelei.victory.1" - ], - defeat: [ - "dialogue:lorelei.defeat.1" - ] + encounter: ["dialogue:lorelei.encounter.1"], + victory: ["dialogue:lorelei.victory.1"], + defeat: ["dialogue:lorelei.defeat.1"], }, [TrainerType.WILL]: { - encounter: [ - "dialogue:will.encounter.1" - ], - victory: [ - "dialogue:will.victory.1" - ], - defeat: [ - "dialogue:will.defeat.1" - ] + encounter: ["dialogue:will.encounter.1"], + victory: ["dialogue:will.victory.1"], + defeat: ["dialogue:will.defeat.1"], }, [TrainerType.MALVA]: { - encounter: [ - "dialogue:malva.encounter.1" - ], - victory: [ - "dialogue:malva.victory.1" - ], - defeat: [ - "dialogue:malva.defeat.1" - ] + encounter: ["dialogue:malva.encounter.1"], + victory: ["dialogue:malva.victory.1"], + defeat: ["dialogue:malva.defeat.1"], }, [TrainerType.HALA]: { - encounter: [ - "dialogue:hala.encounter.1" - ], - victory: [ - "dialogue:hala.victory.1" - ], - defeat: [ - "dialogue:hala.defeat.1" - ] + encounter: ["dialogue:hala.encounter.1"], + victory: ["dialogue:hala.victory.1"], + defeat: ["dialogue:hala.defeat.1"], }, [TrainerType.MOLAYNE]: { - encounter: [ - "dialogue:molayne.encounter.1" - ], - victory: [ - "dialogue:molayne.victory.1" - ], - defeat: [ - "dialogue:molayne.defeat.1" - ] + encounter: ["dialogue:molayne.encounter.1"], + victory: ["dialogue:molayne.victory.1"], + defeat: ["dialogue:molayne.defeat.1"], }, [TrainerType.RIKA]: { - encounter: [ - "dialogue:rika.encounter.1" - ], - victory: [ - "dialogue:rika.victory.1" - ], - defeat: [ - "dialogue:rika.defeat.1" - ] + encounter: ["dialogue:rika.encounter.1"], + victory: ["dialogue:rika.victory.1"], + defeat: ["dialogue:rika.defeat.1"], }, [TrainerType.BRUNO]: { - encounter: [ - "dialogue:bruno.encounter.1" - ], - victory: [ - "dialogue:bruno.victory.1" - ], - defeat: [ - "dialogue:bruno.defeat.1" - ] + encounter: ["dialogue:bruno.encounter.1"], + victory: ["dialogue:bruno.victory.1"], + defeat: ["dialogue:bruno.defeat.1"], }, [TrainerType.BUGSY]: { - encounter: [ - "dialogue:bugsy.encounter.1" - ], - victory: [ - "dialogue:bugsy.victory.1" - ], - defeat: [ - "dialogue:bugsy.defeat.1" - ] + encounter: ["dialogue:bugsy.encounter.1"], + victory: ["dialogue:bugsy.victory.1"], + defeat: ["dialogue:bugsy.defeat.1"], }, [TrainerType.KOGA]: { - encounter: [ - "dialogue:koga.encounter.1" - ], - victory: [ - "dialogue:koga.victory.1" - ], - defeat: [ - "dialogue:koga.defeat.1" - ] + encounter: ["dialogue:koga.encounter.1"], + victory: ["dialogue:koga.victory.1"], + defeat: ["dialogue:koga.defeat.1"], }, [TrainerType.BERTHA]: { - encounter: [ - "dialogue:bertha.encounter.1" - ], - victory: [ - "dialogue:bertha.victory.1" - ], - defeat: [ - "dialogue:bertha.defeat.1" - ] + encounter: ["dialogue:bertha.encounter.1"], + victory: ["dialogue:bertha.victory.1"], + defeat: ["dialogue:bertha.defeat.1"], }, [TrainerType.LENORA]: { - encounter: [ - "dialogue:lenora.encounter.1" - ], - victory: [ - "dialogue:lenora.victory.1" - ], - defeat: [ - "dialogue:lenora.defeat.1" - ] + encounter: ["dialogue:lenora.encounter.1"], + victory: ["dialogue:lenora.victory.1"], + defeat: ["dialogue:lenora.defeat.1"], }, [TrainerType.SIEBOLD]: { - encounter: [ - "dialogue:siebold.encounter.1" - ], - victory: [ - "dialogue:siebold.victory.1" - ], - defeat: [ - "dialogue:siebold.defeat.1" - ] + encounter: ["dialogue:siebold.encounter.1"], + victory: ["dialogue:siebold.victory.1"], + defeat: ["dialogue:siebold.defeat.1"], }, [TrainerType.ROXIE]: { - encounter: [ - "dialogue:roxie.encounter.1" - ], - victory: [ - "dialogue:roxie.victory.1" - ], - defeat: [ - "dialogue:roxie.defeat.1" - ] + encounter: ["dialogue:roxie.encounter.1"], + victory: ["dialogue:roxie.victory.1"], + defeat: ["dialogue:roxie.defeat.1"], }, [TrainerType.OLIVIA]: { - encounter: [ - "dialogue:olivia.encounter.1" - ], - victory: [ - "dialogue:olivia.victory.1" - ], - defeat: [ - "dialogue:olivia.defeat.1" - ] + encounter: ["dialogue:olivia.encounter.1"], + victory: ["dialogue:olivia.victory.1"], + defeat: ["dialogue:olivia.defeat.1"], }, [TrainerType.POPPY]: { - encounter: [ - "dialogue:poppy.encounter.1" - ], - victory: [ - "dialogue:poppy.victory.1" - ], - defeat: [ - "dialogue:poppy.defeat.1" - ] + encounter: ["dialogue:poppy.encounter.1"], + victory: ["dialogue:poppy.victory.1"], + defeat: ["dialogue:poppy.defeat.1"], }, [TrainerType.AGATHA]: { - encounter: [ - "dialogue:agatha.encounter.1" - ], - victory: [ - "dialogue:agatha.victory.1" - ], - defeat: [ - "dialogue:agatha.defeat.1" - ] + encounter: ["dialogue:agatha.encounter.1"], + victory: ["dialogue:agatha.victory.1"], + defeat: ["dialogue:agatha.defeat.1"], }, [TrainerType.FLINT]: { - encounter: [ - "dialogue:flint.encounter.1" - ], - victory: [ - "dialogue:flint.victory.1" - ], - defeat: [ - "dialogue:flint.defeat.1" - ] + encounter: ["dialogue:flint.encounter.1"], + victory: ["dialogue:flint.victory.1"], + defeat: ["dialogue:flint.defeat.1"], }, [TrainerType.GRIMSLEY]: { - encounter: [ - "dialogue:grimsley.encounter.1" - ], - victory: [ - "dialogue:grimsley.victory.1" - ], - defeat: [ - "dialogue:grimsley.defeat.1" - ] + encounter: ["dialogue:grimsley.encounter.1"], + victory: ["dialogue:grimsley.victory.1"], + defeat: ["dialogue:grimsley.defeat.1"], }, [TrainerType.CAITLIN]: { - encounter: [ - "dialogue:caitlin.encounter.1" - ], - victory: [ - "dialogue:caitlin.victory.1" - ], - defeat: [ - "dialogue:caitlin.defeat.1" - ] + encounter: ["dialogue:caitlin.encounter.1"], + victory: ["dialogue:caitlin.victory.1"], + defeat: ["dialogue:caitlin.defeat.1"], }, [TrainerType.DIANTHA]: { - encounter: [ - "dialogue:diantha.encounter.1" - ], - victory: [ - "dialogue:diantha.victory.1" - ], - defeat: [ - "dialogue:diantha.defeat.1" - ] + encounter: ["dialogue:diantha.encounter.1"], + victory: ["dialogue:diantha.victory.1"], + defeat: ["dialogue:diantha.defeat.1"], }, [TrainerType.WIKSTROM]: { - encounter: [ - "dialogue:wikstrom.encounter.1" - ], - victory: [ - "dialogue:wikstrom.victory.1" - ], - defeat: [ - "dialogue:wikstrom.defeat.1" - ] + encounter: ["dialogue:wikstrom.encounter.1"], + victory: ["dialogue:wikstrom.victory.1"], + defeat: ["dialogue:wikstrom.defeat.1"], }, [TrainerType.ACEROLA]: { - encounter: [ - "dialogue:acerola.encounter.1" - ], - victory: [ - "dialogue:acerola.victory.1" - ], - defeat: [ - "dialogue:acerola.defeat.1" - ] + encounter: ["dialogue:acerola.encounter.1"], + victory: ["dialogue:acerola.victory.1"], + defeat: ["dialogue:acerola.defeat.1"], }, [TrainerType.LARRY_ELITE]: { - encounter: [ - "dialogue:larry_elite.encounter.1" - ], - victory: [ - "dialogue:larry_elite.victory.1" - ], - defeat: [ - "dialogue:larry_elite.defeat.1" - ] + encounter: ["dialogue:larry_elite.encounter.1"], + victory: ["dialogue:larry_elite.victory.1"], + defeat: ["dialogue:larry_elite.defeat.1"], }, [TrainerType.LANCE]: { - encounter: [ - "dialogue:lance.encounter.1", - "dialogue:lance.encounter.2" - ], - victory: [ - "dialogue:lance.victory.1", - "dialogue:lance.victory.2" - ], - defeat: [ - "dialogue:lance.defeat.1", - "dialogue:lance.defeat.2" - ] + encounter: ["dialogue:lance.encounter.1", "dialogue:lance.encounter.2"], + victory: ["dialogue:lance.victory.1", "dialogue:lance.victory.2"], + defeat: ["dialogue:lance.defeat.1", "dialogue:lance.defeat.2"], }, [TrainerType.KAREN]: { - encounter: [ - "dialogue:karen.encounter.1", - "dialogue:karen.encounter.2", - "dialogue:karen.encounter.3" - ], - victory: [ - "dialogue:karen.victory.1", - "dialogue:karen.victory.2", - "dialogue:karen.victory.3" - ], - defeat: [ - "dialogue:karen.defeat.1", - "dialogue:karen.defeat.2", - "dialogue:karen.defeat.3" - ] + encounter: ["dialogue:karen.encounter.1", "dialogue:karen.encounter.2", "dialogue:karen.encounter.3"], + victory: ["dialogue:karen.victory.1", "dialogue:karen.victory.2", "dialogue:karen.victory.3"], + defeat: ["dialogue:karen.defeat.1", "dialogue:karen.defeat.2", "dialogue:karen.defeat.3"], }, [TrainerType.MILO]: { - encounter: [ - "dialogue:milo.encounter.1" - ], - victory: [ - "dialogue:milo.victory.1" - ], - defeat: [ - "dialogue:milo.defeat.1" - ] + encounter: ["dialogue:milo.encounter.1"], + victory: ["dialogue:milo.victory.1"], + defeat: ["dialogue:milo.defeat.1"], }, [TrainerType.LUCIAN]: { - encounter: [ - "dialogue:lucian.encounter.1" - ], - victory: [ - "dialogue:lucian.victory.1" - ], - defeat: [ - "dialogue:lucian.defeat.1" - ] + encounter: ["dialogue:lucian.encounter.1"], + victory: ["dialogue:lucian.victory.1"], + defeat: ["dialogue:lucian.defeat.1"], }, [TrainerType.DRASNA]: { - encounter: [ - "dialogue:drasna.encounter.1" - ], - victory: [ - "dialogue:drasna.victory.1" - ], - defeat: [ - "dialogue:drasna.defeat.1" - ] + encounter: ["dialogue:drasna.encounter.1"], + victory: ["dialogue:drasna.victory.1"], + defeat: ["dialogue:drasna.defeat.1"], }, [TrainerType.KAHILI]: { - encounter: [ - "dialogue:kahili.encounter.1" - ], - victory: [ - "dialogue:kahili.victory.1" - ], - defeat: [ - "dialogue:kahili.defeat.1" - ] + encounter: ["dialogue:kahili.encounter.1"], + victory: ["dialogue:kahili.victory.1"], + defeat: ["dialogue:kahili.defeat.1"], }, [TrainerType.HASSEL]: { - encounter: [ - "dialogue:hassel.encounter.1" - ], - victory: [ - "dialogue:hassel.victory.1" - ], - defeat: [ - "dialogue:hassel.defeat.1" - ] + encounter: ["dialogue:hassel.encounter.1"], + victory: ["dialogue:hassel.victory.1"], + defeat: ["dialogue:hassel.defeat.1"], }, [TrainerType.BLUE]: { - encounter: [ - "dialogue:blue.encounter.1" - ], - victory: [ - "dialogue:blue.victory.1" - ], - defeat: [ - "dialogue:blue.defeat.1" - ] + encounter: ["dialogue:blue.encounter.1"], + victory: ["dialogue:blue.victory.1"], + defeat: ["dialogue:blue.defeat.1"], }, [TrainerType.PIERS]: { - encounter: [ - "dialogue:piers.encounter.1" - ], - victory: [ - "dialogue:piers.victory.1" - ], - defeat: [ - "dialogue:piers.defeat.1" - ] + encounter: ["dialogue:piers.encounter.1"], + victory: ["dialogue:piers.victory.1"], + defeat: ["dialogue:piers.defeat.1"], }, [TrainerType.RED]: { - encounter: [ - "dialogue:red.encounter.1" - ], - victory: [ - "dialogue:red.victory.1" - ], - defeat: [ - "dialogue:red.defeat.1" - ] + encounter: ["dialogue:red.encounter.1"], + victory: ["dialogue:red.victory.1"], + defeat: ["dialogue:red.defeat.1"], }, [TrainerType.JASMINE]: { - encounter: [ - "dialogue:jasmine.encounter.1" - ], - victory: [ - "dialogue:jasmine.victory.1" - ], - defeat: [ - "dialogue:jasmine.defeat.1" - ] + encounter: ["dialogue:jasmine.encounter.1"], + victory: ["dialogue:jasmine.victory.1"], + defeat: ["dialogue:jasmine.defeat.1"], }, [TrainerType.LANCE_CHAMPION]: { - encounter: [ - "dialogue:lance_champion.encounter.1" - ], - victory: [ - "dialogue:lance_champion.victory.1" - ], - defeat: [ - "dialogue:lance_champion.defeat.1" - ] + encounter: ["dialogue:lance_champion.encounter.1"], + victory: ["dialogue:lance_champion.victory.1"], + defeat: ["dialogue:lance_champion.defeat.1"], }, [TrainerType.STEVEN]: { - encounter: [ - "dialogue:steven.encounter.1" - ], - victory: [ - "dialogue:steven.victory.1" - ], - defeat: [ - "dialogue:steven.defeat.1" - ] + encounter: ["dialogue:steven.encounter.1"], + victory: ["dialogue:steven.victory.1"], + defeat: ["dialogue:steven.defeat.1"], }, [TrainerType.CYNTHIA]: { - encounter: [ - "dialogue:cynthia.encounter.1" - ], - victory: [ - "dialogue:cynthia.victory.1" - ], - defeat: [ - "dialogue:cynthia.defeat.1" - ] + encounter: ["dialogue:cynthia.encounter.1"], + victory: ["dialogue:cynthia.victory.1"], + defeat: ["dialogue:cynthia.defeat.1"], }, [TrainerType.IRIS]: { - encounter: [ - "dialogue:iris.encounter.1" - ], - victory: [ - "dialogue:iris.victory.1" - ], - defeat: [ - "dialogue:iris.defeat.1" - ] + encounter: ["dialogue:iris.encounter.1"], + victory: ["dialogue:iris.victory.1"], + defeat: ["dialogue:iris.defeat.1"], + }, + [TrainerType.KUKUI]: { + encounter: ["dialogue:kukui.encounter.1"], + victory: ["dialogue:kukui.victory.1"], + defeat: ["dialogue:kukui.defeat.1"], }, [TrainerType.HAU]: { - encounter: [ - "dialogue:hau.encounter.1" - ], - victory: [ - "dialogue:hau.victory.1" - ], - defeat: [ - "dialogue:hau.defeat.1" - ] + encounter: ["dialogue:hau.encounter.1"], + victory: ["dialogue:hau.victory.1"], + defeat: ["dialogue:hau.defeat.1"], }, [TrainerType.GEETA]: { - encounter: [ - "dialogue:geeta.encounter.1" - ], - victory: [ - "dialogue:geeta.victory.1" - ], - defeat: [ - "dialogue:geeta.defeat.1" - ] + encounter: ["dialogue:geeta.encounter.1"], + victory: ["dialogue:geeta.victory.1"], + defeat: ["dialogue:geeta.defeat.1"], }, [TrainerType.NEMONA]: { - encounter: [ - "dialogue:nemona.encounter.1" - ], - victory: [ - "dialogue:nemona.victory.1" - ], - defeat: [ - "dialogue:nemona.defeat.1" - ] + encounter: ["dialogue:nemona.encounter.1"], + victory: ["dialogue:nemona.victory.1"], + defeat: ["dialogue:nemona.defeat.1"], }, [TrainerType.LEON]: { - encounter: [ - "dialogue:leon.encounter.1" - ], - victory: [ - "dialogue:leon.victory.1" - ], - defeat: [ - "dialogue:leon.defeat.1" - ] + encounter: ["dialogue:leon.encounter.1"], + victory: ["dialogue:leon.victory.1"], + defeat: ["dialogue:leon.defeat.1"], + }, + [TrainerType.MUSTARD]: { + encounter: ["dialogue:mustard.encounter.1"], + victory: ["dialogue:mustard.victory.1"], + defeat: ["dialogue:mustard.defeat.1"], }, [TrainerType.WHITNEY]: { - encounter: [ - "dialogue:whitney.encounter.1" - ], - victory: [ - "dialogue:whitney.victory.1" - ], - defeat: [ - "dialogue:whitney.defeat.1" - ] + encounter: ["dialogue:whitney.encounter.1"], + victory: ["dialogue:whitney.victory.1"], + defeat: ["dialogue:whitney.defeat.1"], }, [TrainerType.CHUCK]: { - encounter: [ - "dialogue:chuck.encounter.1" - ], - victory: [ - "dialogue:chuck.victory.1" - ], - defeat: [ - "dialogue:chuck.defeat.1" - ] + encounter: ["dialogue:chuck.encounter.1"], + victory: ["dialogue:chuck.victory.1"], + defeat: ["dialogue:chuck.defeat.1"], }, [TrainerType.KATY]: { - encounter: [ - "dialogue:katy.encounter.1" - ], - victory: [ - "dialogue:katy.victory.1" - ], - defeat: [ - "dialogue:katy.defeat.1" - ] + encounter: ["dialogue:katy.encounter.1"], + victory: ["dialogue:katy.victory.1"], + defeat: ["dialogue:katy.defeat.1"], }, [TrainerType.PRYCE]: { - encounter: [ - "dialogue:pryce.encounter.1" - ], - victory: [ - "dialogue:pryce.victory.1" - ], - defeat: [ - "dialogue:pryce.defeat.1" - ] + encounter: ["dialogue:pryce.encounter.1"], + victory: ["dialogue:pryce.victory.1"], + defeat: ["dialogue:pryce.defeat.1"], }, [TrainerType.CLAIR]: { - encounter: [ - "dialogue:clair.encounter.1" - ], - victory: [ - "dialogue:clair.victory.1" - ], - defeat: [ - "dialogue:clair.defeat.1" - ] + encounter: ["dialogue:clair.encounter.1"], + victory: ["dialogue:clair.victory.1"], + defeat: ["dialogue:clair.defeat.1"], }, [TrainerType.MAYLENE]: { - encounter: [ - "dialogue:maylene.encounter.1" - ], - victory: [ - "dialogue:maylene.victory.1" - ], - defeat: [ - "dialogue:maylene.defeat.1" - ] + encounter: ["dialogue:maylene.encounter.1"], + victory: ["dialogue:maylene.victory.1"], + defeat: ["dialogue:maylene.defeat.1"], }, [TrainerType.FANTINA]: { - encounter: [ - "dialogue:fantina.encounter.1" - ], - victory: [ - "dialogue:fantina.victory.1" - ], - defeat: [ - "dialogue:fantina.defeat.1" - ] + encounter: ["dialogue:fantina.encounter.1"], + victory: ["dialogue:fantina.victory.1"], + defeat: ["dialogue:fantina.defeat.1"], }, [TrainerType.BYRON]: { - encounter: [ - "dialogue:byron.encounter.1" - ], - victory: [ - "dialogue:byron.victory.1" - ], - defeat: [ - "dialogue:byron.defeat.1" - ] + encounter: ["dialogue:byron.encounter.1"], + victory: ["dialogue:byron.victory.1"], + defeat: ["dialogue:byron.defeat.1"], }, [TrainerType.OLYMPIA]: { - encounter: [ - "dialogue:olympia.encounter.1" - ], - victory: [ - "dialogue:olympia.victory.1" - ], - defeat: [ - "dialogue:olympia.defeat.1" - ] + encounter: ["dialogue:olympia.encounter.1"], + victory: ["dialogue:olympia.victory.1"], + defeat: ["dialogue:olympia.defeat.1"], }, [TrainerType.VOLKNER]: { - encounter: [ - "dialogue:volkner.encounter.1" - ], - victory: [ - "dialogue:volkner.victory.1" - ], - defeat: [ - "dialogue:volkner.defeat.1" - ] + encounter: ["dialogue:volkner.encounter.1"], + victory: ["dialogue:volkner.victory.1"], + defeat: ["dialogue:volkner.defeat.1"], }, [TrainerType.BURGH]: { - encounter: [ - "dialogue:burgh.encounter.1", - "dialogue:burgh.encounter.2" - ], - victory: [ - "dialogue:burgh.victory.1", - "dialogue:burgh.victory.2" - ], - defeat: [ - "dialogue:burgh.defeat.1", - "dialogue:burgh.defeat.2" - ] + encounter: ["dialogue:burgh.encounter.1", "dialogue:burgh.encounter.2"], + victory: ["dialogue:burgh.victory.1", "dialogue:burgh.victory.2"], + defeat: ["dialogue:burgh.defeat.1", "dialogue:burgh.defeat.2"], }, [TrainerType.ELESA]: { - encounter: [ - "dialogue:elesa.encounter.1" - ], - victory: [ - "dialogue:elesa.victory.1" - ], - defeat: [ - "dialogue:elesa.defeat.1" - ] + encounter: ["dialogue:elesa.encounter.1"], + victory: ["dialogue:elesa.victory.1"], + defeat: ["dialogue:elesa.defeat.1"], }, [TrainerType.SKYLA]: { - encounter: [ - "dialogue:skyla.encounter.1" - ], - victory: [ - "dialogue:skyla.victory.1" - ], - defeat: [ - "dialogue:skyla.defeat.1" - ] + encounter: ["dialogue:skyla.encounter.1"], + victory: ["dialogue:skyla.victory.1"], + defeat: ["dialogue:skyla.defeat.1"], }, [TrainerType.BRYCEN]: { - encounter: [ - "dialogue:brycen.encounter.1" - ], - victory: [ - "dialogue:brycen.victory.1" - ], - defeat: [ - "dialogue:brycen.defeat.1" - ] + encounter: ["dialogue:brycen.encounter.1"], + victory: ["dialogue:brycen.victory.1"], + defeat: ["dialogue:brycen.defeat.1"], }, [TrainerType.DRAYDEN]: { - encounter: [ - "dialogue:drayden.encounter.1" - ], - victory: [ - "dialogue:drayden.victory.1" - ], - defeat: [ - "dialogue:drayden.defeat.1" - ] + encounter: ["dialogue:drayden.encounter.1"], + victory: ["dialogue:drayden.victory.1"], + defeat: ["dialogue:drayden.defeat.1"], }, [TrainerType.GRANT]: { - encounter: [ - "dialogue:grant.encounter.1" - ], - victory: [ - "dialogue:grant.victory.1" - ], - defeat: [ - "dialogue:grant.defeat.1" - ] + encounter: ["dialogue:grant.encounter.1"], + victory: ["dialogue:grant.victory.1"], + defeat: ["dialogue:grant.defeat.1"], }, [TrainerType.KORRINA]: { - encounter: [ - "dialogue:korrina.encounter.1" - ], - victory: [ - "dialogue:korrina.victory.1" - ], - defeat: [ - "dialogue:korrina.defeat.1" - ] + encounter: ["dialogue:korrina.encounter.1"], + victory: ["dialogue:korrina.victory.1"], + defeat: ["dialogue:korrina.defeat.1"], }, [TrainerType.CLEMONT]: { - encounter: [ - "dialogue:clemont.encounter.1" - ], - victory: [ - "dialogue:clemont.victory.1" - ], - defeat: [ - "dialogue:clemont.defeat.1" - ] + encounter: ["dialogue:clemont.encounter.1"], + victory: ["dialogue:clemont.victory.1"], + defeat: ["dialogue:clemont.defeat.1"], }, [TrainerType.VALERIE]: { - encounter: [ - "dialogue:valerie.encounter.1" - ], - victory: [ - "dialogue:valerie.victory.1" - ], - defeat: [ - "dialogue:valerie.defeat.1" - ] + encounter: ["dialogue:valerie.encounter.1"], + victory: ["dialogue:valerie.victory.1"], + defeat: ["dialogue:valerie.defeat.1"], }, [TrainerType.WULFRIC]: { - encounter: [ - "dialogue:wulfric.encounter.1" - ], - victory: [ - "dialogue:wulfric.victory.1" - ], - defeat: [ - "dialogue:wulfric.defeat.1" - ] + encounter: ["dialogue:wulfric.encounter.1"], + victory: ["dialogue:wulfric.victory.1"], + defeat: ["dialogue:wulfric.defeat.1"], }, [TrainerType.KABU]: { - encounter: [ - "dialogue:kabu.encounter.1" - ], - victory: [ - "dialogue:kabu.victory.1" - ], - defeat: [ - "dialogue:kabu.defeat.1" - ] + encounter: ["dialogue:kabu.encounter.1"], + victory: ["dialogue:kabu.victory.1"], + defeat: ["dialogue:kabu.defeat.1"], }, [TrainerType.BEA]: { - encounter: [ - "dialogue:bea.encounter.1" - ], - victory: [ - "dialogue:bea.victory.1" - ], - defeat: [ - "dialogue:bea.defeat.1" - ] + encounter: ["dialogue:bea.encounter.1"], + victory: ["dialogue:bea.victory.1"], + defeat: ["dialogue:bea.defeat.1"], }, [TrainerType.OPAL]: { - encounter: [ - "dialogue:opal.encounter.1" - ], - victory: [ - "dialogue:opal.victory.1" - ], - defeat: [ - "dialogue:opal.defeat.1" - ] + encounter: ["dialogue:opal.encounter.1"], + victory: ["dialogue:opal.victory.1"], + defeat: ["dialogue:opal.defeat.1"], }, [TrainerType.BEDE]: { - encounter: [ - "dialogue:bede.encounter.1" - ], - victory: [ - "dialogue:bede.victory.1" - ], - defeat: [ - "dialogue:bede.defeat.1" - ] + encounter: ["dialogue:bede.encounter.1"], + victory: ["dialogue:bede.victory.1"], + defeat: ["dialogue:bede.defeat.1"], }, [TrainerType.GORDIE]: { - encounter: [ - "dialogue:gordie.encounter.1" - ], - victory: [ - "dialogue:gordie.victory.1" - ], - defeat: [ - "dialogue:gordie.defeat.1" - ] + encounter: ["dialogue:gordie.encounter.1"], + victory: ["dialogue:gordie.victory.1"], + defeat: ["dialogue:gordie.defeat.1"], }, [TrainerType.MARNIE]: { - encounter: [ - "dialogue:marnie.encounter.1" - ], - victory: [ - "dialogue:marnie.victory.1" - ], - defeat: [ - "dialogue:marnie.defeat.1" - ] + encounter: ["dialogue:marnie.encounter.1"], + victory: ["dialogue:marnie.victory.1"], + defeat: ["dialogue:marnie.defeat.1"], }, [TrainerType.RAIHAN]: { - encounter: [ - "dialogue:raihan.encounter.1" - ], - victory: [ - "dialogue:raihan.victory.1" - ], - defeat: [ - "dialogue:raihan.defeat.1" - ] + encounter: ["dialogue:raihan.encounter.1"], + victory: ["dialogue:raihan.victory.1"], + defeat: ["dialogue:raihan.defeat.1"], }, [TrainerType.BRASSIUS]: { - encounter: [ - "dialogue:brassius.encounter.1" - ], - victory: [ - "dialogue:brassius.victory.1" - ], - defeat: [ - "dialogue:brassius.defeat.1" - ] + encounter: ["dialogue:brassius.encounter.1"], + victory: ["dialogue:brassius.victory.1"], + defeat: ["dialogue:brassius.defeat.1"], }, [TrainerType.IONO]: { - encounter: [ - "dialogue:iono.encounter.1" - ], - victory: [ - "dialogue:iono.victory.1" - ], - defeat: [ - "dialogue:iono.defeat.1" - ] + encounter: ["dialogue:iono.encounter.1"], + victory: ["dialogue:iono.victory.1"], + defeat: ["dialogue:iono.defeat.1"], }, [TrainerType.LARRY]: { - encounter: [ - "dialogue:larry.encounter.1" - ], - victory: [ - "dialogue:larry.victory.1" - ], - defeat: [ - "dialogue:larry.defeat.1" - ] + encounter: ["dialogue:larry.encounter.1"], + victory: ["dialogue:larry.victory.1"], + defeat: ["dialogue:larry.defeat.1"], }, [TrainerType.RYME]: { - encounter: [ - "dialogue:ryme.encounter.1" - ], - victory: [ - "dialogue:ryme.victory.1" - ], - defeat: [ - "dialogue:ryme.defeat.1" - ] + encounter: ["dialogue:ryme.encounter.1"], + victory: ["dialogue:ryme.victory.1"], + defeat: ["dialogue:ryme.defeat.1"], }, [TrainerType.GRUSHA]: { - encounter: [ - "dialogue:grusha.encounter.1" - ], - victory: [ - "dialogue:grusha.victory.1" - ], - defeat: [ - "dialogue:grusha.defeat.1" - ] + encounter: ["dialogue:grusha.encounter.1"], + victory: ["dialogue:grusha.victory.1"], + defeat: ["dialogue:grusha.defeat.1"], }, [TrainerType.MARNIE_ELITE]: { - encounter: [ - "dialogue:marnie_elite.encounter.1", - "dialogue:marnie_elite.encounter.2" - ], - victory: [ - "dialogue:marnie_elite.victory.1", - "dialogue:marnie_elite.victory.2" - ], - defeat: [ - "dialogue:marnie_elite.defeat.1", - "dialogue:marnie_elite.defeat.2" - ] + encounter: ["dialogue:marnie_elite.encounter.1", "dialogue:marnie_elite.encounter.2"], + victory: ["dialogue:marnie_elite.victory.1", "dialogue:marnie_elite.victory.2"], + defeat: ["dialogue:marnie_elite.defeat.1", "dialogue:marnie_elite.defeat.2"], }, [TrainerType.NESSA_ELITE]: { - encounter: [ - "dialogue:nessa_elite.encounter.1", - "dialogue:nessa_elite.encounter.2" - ], - victory: [ - "dialogue:nessa_elite.victory.1", - "dialogue:nessa_elite.victory.2" - ], - defeat: [ - "dialogue:nessa_elite.defeat.1", - "dialogue:nessa_elite.defeat.2" - ] + encounter: ["dialogue:nessa_elite.encounter.1", "dialogue:nessa_elite.encounter.2"], + victory: ["dialogue:nessa_elite.victory.1", "dialogue:nessa_elite.victory.2"], + defeat: ["dialogue:nessa_elite.defeat.1", "dialogue:nessa_elite.defeat.2"], }, [TrainerType.BEA_ELITE]: { - encounter: [ - "dialogue:bea_elite.encounter.1", - "dialogue:bea_elite.encounter.2" - ], - victory: [ - "dialogue:bea_elite.victory.1", - "dialogue:bea_elite.victory.2" - ], - defeat: [ - "dialogue:bea_elite.defeat.1", - "dialogue:bea_elite.defeat.2" - ] + encounter: ["dialogue:bea_elite.encounter.1", "dialogue:bea_elite.encounter.2"], + victory: ["dialogue:bea_elite.victory.1", "dialogue:bea_elite.victory.2"], + defeat: ["dialogue:bea_elite.defeat.1", "dialogue:bea_elite.defeat.2"], }, [TrainerType.ALLISTER_ELITE]: { - encounter: [ - "dialogue:allister_elite.encounter.1", - "dialogue:allister_elite.encounter.2" - ], - victory: [ - "dialogue:allister_elite.victory.1", - "dialogue:allister_elite.victory.2" - ], - defeat: [ - "dialogue:allister_elite.defeat.1", - "dialogue:allister_elite.defeat.2" - ] + encounter: ["dialogue:allister_elite.encounter.1", "dialogue:allister_elite.encounter.2"], + victory: ["dialogue:allister_elite.victory.1", "dialogue:allister_elite.victory.2"], + defeat: ["dialogue:allister_elite.defeat.1", "dialogue:allister_elite.defeat.2"], }, [TrainerType.RAIHAN_ELITE]: { - encounter: [ - "dialogue:raihan_elite.encounter.1", - "dialogue:raihan_elite.encounter.2" - ], - victory: [ - "dialogue:raihan_elite.victory.1", - "dialogue:raihan_elite.victory.2" - ], - defeat: [ - "dialogue:raihan_elite.defeat.1", - "dialogue:raihan_elite.defeat.2" - ] + encounter: ["dialogue:raihan_elite.encounter.1", "dialogue:raihan_elite.encounter.2"], + victory: ["dialogue:raihan_elite.victory.1", "dialogue:raihan_elite.victory.2"], + defeat: ["dialogue:raihan_elite.defeat.1", "dialogue:raihan_elite.defeat.2"], }, [TrainerType.ALDER]: { - encounter: [ - "dialogue:alder.encounter.1" - ], - victory: [ - "dialogue:alder.victory.1" - ], - defeat: [ - "dialogue:alder.defeat.1" - ] + encounter: ["dialogue:alder.encounter.1"], + victory: ["dialogue:alder.victory.1"], + defeat: ["dialogue:alder.defeat.1"], }, [TrainerType.KIERAN]: { - encounter: [ - "dialogue:kieran.encounter.1" - ], - victory: [ - "dialogue:kieran.victory.1" - ], - defeat: [ - "dialogue:kieran.defeat.1" - ] + encounter: ["dialogue:kieran.encounter.1"], + victory: ["dialogue:kieran.victory.1"], + defeat: ["dialogue:kieran.defeat.1"], }, [TrainerType.RIVAL]: [ { - encounter: [ - "dialogue:rival.encounter.1", - ], - victory: [ - "dialogue:rival.victory.1", - ], - + encounter: ["dialogue:rival.encounter.1"], + victory: ["dialogue:rival.victory.1"], }, { - encounter: [ - "dialogue:rival_female.encounter.1", - ], - victory: [ - "dialogue:rival_female.victory.1", - ] - } + encounter: ["dialogue:rival_female.encounter.1"], + victory: ["dialogue:rival_female.victory.1"], + }, ], [TrainerType.RIVAL_2]: [ { - encounter: [ - "dialogue:rival_2.encounter.1", - ], - victory: [ - "dialogue:rival_2.victory.1", - ], - + encounter: ["dialogue:rival_2.encounter.1"], + victory: ["dialogue:rival_2.victory.1"], }, { - encounter: [ - "dialogue:rival_2_female.encounter.1", - ], - victory: [ - "dialogue:rival_2_female.victory.1", - ], - defeat: [ - "dialogue:rival_2_female.defeat.1", - ] + encounter: ["dialogue:rival_2_female.encounter.1"], + victory: ["dialogue:rival_2_female.victory.1"], + defeat: ["dialogue:rival_2_female.defeat.1"], }, ], [TrainerType.RIVAL_3]: [ { - encounter: [ - "dialogue:rival_3.encounter.1", - ], - victory: [ - "dialogue:rival_3.victory.1", - ] + encounter: ["dialogue:rival_3.encounter.1"], + victory: ["dialogue:rival_3.victory.1"], }, { - encounter: [ - "dialogue:rival_3_female.encounter.1", - ], - victory: [ - "dialogue:rival_3_female.victory.1", - ], - defeat: [ - "dialogue:rival_3_female.defeat.1", - ] - } + encounter: ["dialogue:rival_3_female.encounter.1"], + victory: ["dialogue:rival_3_female.victory.1"], + defeat: ["dialogue:rival_3_female.defeat.1"], + }, ], [TrainerType.RIVAL_4]: [ { - encounter: [ - "dialogue:rival_4.encounter.1", - ], - victory: [ - "dialogue:rival_4.victory.1", - ] + encounter: ["dialogue:rival_4.encounter.1"], + victory: ["dialogue:rival_4.victory.1"], }, { - encounter: [ - "dialogue:rival_4_female.encounter.1", - ], - victory: [ - "dialogue:rival_4_female.victory.1", - ], - defeat: [ - "dialogue:rival_4_female.defeat.1", - ] - } + encounter: ["dialogue:rival_4_female.encounter.1"], + victory: ["dialogue:rival_4_female.victory.1"], + defeat: ["dialogue:rival_4_female.defeat.1"], + }, ], [TrainerType.RIVAL_5]: [ { - encounter: [ - "dialogue:rival_5.encounter.1", - ], - victory: [ - "dialogue:rival_5.victory.1", - ] + encounter: ["dialogue:rival_5.encounter.1"], + victory: ["dialogue:rival_5.victory.1"], }, { - encounter: [ - "dialogue:rival_5_female.encounter.1", - ], - victory: [ - "dialogue:rival_5_female.victory.1", - ], - defeat: [ - "dialogue:rival_5_female.defeat.1", - ] - } + encounter: ["dialogue:rival_5_female.encounter.1"], + victory: ["dialogue:rival_5_female.victory.1"], + defeat: ["dialogue:rival_5_female.defeat.1"], + }, ], [TrainerType.RIVAL_6]: [ { - encounter: [ - "dialogue:rival_6.encounter.1", - ], - victory: [ - "dialogue:rival_6.victory.1", - ] + encounter: ["dialogue:rival_6.encounter.1"], + victory: ["dialogue:rival_6.victory.1"], }, { - encounter: [ - "dialogue:rival_6_female.encounter.1", - ], - victory: [ - "dialogue:rival_6_female.victory.1", - ], - } - ] + encounter: ["dialogue:rival_6_female.encounter.1"], + victory: ["dialogue:rival_6_female.victory.1"], + }, + ], }; - export const doubleBattleDialogue = { - "blue_red_double": { - encounter: [ "doubleBattleDialogue:blue_red_double.encounter.1" ], - victory: [ "doubleBattleDialogue:blue_red_double.victory.1" ] + blue_red_double: { + encounter: ["doubleBattleDialogue:blue_red_double.encounter.1"], + victory: ["doubleBattleDialogue:blue_red_double.victory.1"], }, - "red_blue_double": { - encounter: [ "doubleBattleDialogue:red_blue_double.encounter.1" ], - victory: [ "doubleBattleDialogue:red_blue_double.victory.1" ] + red_blue_double: { + encounter: ["doubleBattleDialogue:red_blue_double.encounter.1"], + victory: ["doubleBattleDialogue:red_blue_double.victory.1"], }, - "tate_liza_double": { - encounter: [ "doubleBattleDialogue:tate_liza_double.encounter.1" ], - victory: [ "doubleBattleDialogue:tate_liza_double.victory.1" ] + tate_liza_double: { + encounter: ["doubleBattleDialogue:tate_liza_double.encounter.1"], + victory: ["doubleBattleDialogue:tate_liza_double.victory.1"], }, - "liza_tate_double": { - encounter: [ "doubleBattleDialogue:liza_tate_double.encounter.1" ], - victory: [ "doubleBattleDialogue:liza_tate_double.victory.1" ] + liza_tate_double: { + encounter: ["doubleBattleDialogue:liza_tate_double.encounter.1"], + victory: ["doubleBattleDialogue:liza_tate_double.victory.1"], }, - "wallace_steven_double": { - encounter: [ "doubleBattleDialogue:wallace_steven_double.encounter.1" ], - victory: [ "doubleBattleDialogue:wallace_steven_double.victory.1" ] + wallace_steven_double: { + encounter: ["doubleBattleDialogue:wallace_steven_double.encounter.1"], + victory: ["doubleBattleDialogue:wallace_steven_double.victory.1"], }, - "steven_wallace_double": { - encounter: [ "doubleBattleDialogue:steven_wallace_double.encounter.1" ], - victory: [ "doubleBattleDialogue:steven_wallace_double.victory.1" ] + steven_wallace_double: { + encounter: ["doubleBattleDialogue:steven_wallace_double.encounter.1"], + victory: ["doubleBattleDialogue:steven_wallace_double.victory.1"], }, - "alder_iris_double": { - encounter: [ "doubleBattleDialogue:alder_iris_double.encounter.1" ], - victory: [ "doubleBattleDialogue:alder_iris_double.victory.1" ] + alder_iris_double: { + encounter: ["doubleBattleDialogue:alder_iris_double.encounter.1"], + victory: ["doubleBattleDialogue:alder_iris_double.victory.1"], }, - "iris_alder_double": { - encounter: [ "doubleBattleDialogue:iris_alder_double.encounter.1" ], - victory: [ "doubleBattleDialogue:iris_alder_double.victory.1" ] + iris_alder_double: { + encounter: ["doubleBattleDialogue:iris_alder_double.encounter.1"], + victory: ["doubleBattleDialogue:iris_alder_double.victory.1"], }, - "marnie_piers_double": { - encounter: [ "doubleBattleDialogue:marnie_piers_double.encounter.1" ], - victory: [ "doubleBattleDialogue:marnie_piers_double.victory.1" ] + marnie_piers_double: { + encounter: ["doubleBattleDialogue:marnie_piers_double.encounter.1"], + victory: ["doubleBattleDialogue:marnie_piers_double.victory.1"], }, - "piers_marnie_double": { - encounter: [ "doubleBattleDialogue:piers_marnie_double.encounter.1" ], - victory: [ "doubleBattleDialogue:piers_marnie_double.victory.1" ] + piers_marnie_double: { + encounter: ["doubleBattleDialogue:piers_marnie_double.encounter.1"], + victory: ["doubleBattleDialogue:piers_marnie_double.victory.1"], }, - - }; export const battleSpecDialogue = { @@ -3171,14 +1664,11 @@ export const battleSpecDialogue = { encounter: "battleSpecDialogue:encounter", firstStageWin: "battleSpecDialogue:firstStageWin", secondStageWin: "battleSpecDialogue:secondStageWin", - } + }, }; export const miscDialogue = { - ending: [ - "miscDialogue:ending", - "miscDialogue:ending_female" - ] + ending: ["miscDialogue:ending", "miscDialogue:ending_female"], }; export function getCharVariantFromDialogue(message: string): string { @@ -3190,17 +1680,18 @@ export function getCharVariantFromDialogue(message: string): string { } export function initTrainerTypeDialogue(): void { - const trainerTypes = Object.keys(trainerTypeDialogue).map(t => parseInt(t) as TrainerType); + const trainerTypes = Object.keys(trainerTypeDialogue).map(t => Number.parseInt(t) as TrainerType); for (const trainerType of trainerTypes) { const messages = trainerTypeDialogue[trainerType]; - const messageTypes = [ "encounter", "victory", "defeat" ]; + const messageTypes = ["encounter", "victory", "defeat"]; for (const messageType of messageTypes) { if (Array.isArray(messages)) { if (messages[0][messageType]) { trainerConfigs[trainerType][`${messageType}Messages`] = messages[0][messageType]; } if (messages.length > 1) { - trainerConfigs[trainerType][`female${messageType.slice(0, 1).toUpperCase()}${messageType.slice(1)}Messages`] = messages[1][messageType]; + trainerConfigs[trainerType][`female${messageType.slice(0, 1).toUpperCase()}${messageType.slice(1)}Messages`] = + messages[1][messageType]; } } else { trainerConfigs[trainerType][`${messageType}Messages`] = messages[messageType]; diff --git a/src/data/egg-hatch-data.ts b/src/data/egg-hatch-data.ts index ba553b55c4f..949ed1af063 100644 --- a/src/data/egg-hatch-data.ts +++ b/src/data/egg-hatch-data.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene"; -import { PlayerPokemon } from "#app/field/pokemon"; -import { DexEntry, StarterDataEntry } from "#app/system/game-data"; +import { globalScene } from "#app/global-scene"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type { DexEntry, StarterDataEntry } from "#app/system/game-data"; /** * Stores data associated with a specific egg and the hatched pokemon @@ -17,30 +17,27 @@ export class EggHatchData { public dexEntryBeforeUpdate: DexEntry; /** stored copy of the hatched pokemon's starter entry before it was updated due to hatch */ public starterDataEntryBeforeUpdate: StarterDataEntry; - /** reference to the battle scene to get gamedata and update dex */ - private scene: BattleScene; - constructor(scene: BattleScene, pokemon: PlayerPokemon, eggMoveIndex: number) { - this.scene = scene; + constructor(pokemon: PlayerPokemon, eggMoveIndex: number) { this.pokemon = pokemon; this.eggMoveIndex = eggMoveIndex; } /** - * Sets the boolean for if the egg move for the hatch is a new unlock - * @param unlocked True if the EM is new - */ + * Sets the boolean for if the egg move for the hatch is a new unlock + * @param unlocked True if the EM is new + */ setEggMoveUnlocked(unlocked: boolean) { - this.eggMoveUnlocked = unlocked; + this.eggMoveUnlocked = unlocked; } /** - * Stores a copy of the current DexEntry of the pokemon and StarterDataEntry of its starter - * Used before updating the dex, so comparing the pokemon to these entries will show the new attributes - */ + * Stores a copy of the current DexEntry of the pokemon and StarterDataEntry of its starter + * Used before updating the dex, so comparing the pokemon to these entries will show the new attributes + */ setDex() { - const currDexEntry = this.scene.gameData.dexData[this.pokemon.species.speciesId]; - const currStarterDataEntry = this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()]; + const currDexEntry = globalScene.gameData.dexData[this.pokemon.species.speciesId]; + const currStarterDataEntry = globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId()]; this.dexEntryBeforeUpdate = { seenAttr: currDexEntry.seenAttr, caughtAttr: currDexEntry.caughtAttr, @@ -48,7 +45,7 @@ export class EggHatchData { seenCount: currDexEntry.seenCount, caughtCount: currDexEntry.caughtCount, hatchedCount: currDexEntry.hatchedCount, - ivs: [ ...currDexEntry.ivs ] + ivs: [...currDexEntry.ivs], }; this.starterDataEntryBeforeUpdate = { moveset: currStarterDataEntry.moveset, @@ -58,37 +55,37 @@ export class EggHatchData { abilityAttr: currStarterDataEntry.abilityAttr, passiveAttr: currStarterDataEntry.passiveAttr, valueReduction: currStarterDataEntry.valueReduction, - classicWinCount: currStarterDataEntry.classicWinCount + classicWinCount: currStarterDataEntry.classicWinCount, }; } /** - * Gets the dex entry before update - * @returns Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex - */ + * Gets the dex entry before update + * @returns Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex + */ getDex(): DexEntry { return this.dexEntryBeforeUpdate; } /** - * Gets the starter dex entry before update - * @returns Starter Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex - */ + * Gets the starter dex entry before update + * @returns Starter Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex + */ getStarterEntry(): StarterDataEntry { return this.starterDataEntryBeforeUpdate; } /** - * Update the pokedex data corresponding with the new hatch's pokemon data - * Also sets whether the egg move is a new unlock or not - * @param showMessage boolean to show messages for the new catches and egg moves (false by default) - * @returns - */ - updatePokemon(showMessage : boolean = false) { + * Update the pokedex data corresponding with the new hatch's pokemon data + * Also sets whether the egg move is a new unlock or not + * @param showMessage boolean to show messages for the new catches and egg moves (false by default) + * @returns + */ + updatePokemon(showMessage = false) { return new Promise(resolve => { - this.scene.gameData.setPokemonCaught(this.pokemon, true, true, showMessage).then(() => { - this.scene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); - this.scene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex, showMessage).then((value) => { + globalScene.gameData.setPokemonCaught(this.pokemon, true, true, showMessage).then(() => { + globalScene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); + globalScene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex, showMessage).then(value => { this.setEggMoveUnlocked(value); resolve(); }); diff --git a/src/data/egg.ts b/src/data/egg.ts index 0f88c53b748..0dabf8f1119 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -1,64 +1,89 @@ -import BattleScene from "#app/battle-scene"; -import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; +import type BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; import { VariantTier } from "#enums/variant-tier"; import * as Utils from "#app/utils"; import Overrides from "#app/overrides"; import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; import { EggSourceType } from "#enums/egg-source-types"; -import { MANAPHY_EGG_MANAPHY_RATE, SAME_SPECIES_EGG_HA_RATE, GACHA_EGG_HA_RATE, GACHA_DEFAULT_RARE_EGGMOVE_RATE, SAME_SPECIES_EGG_RARE_EGGMOVE_RATE, GACHA_MOVE_UP_RARE_EGGMOVE_RATE, GACHA_DEFAULT_SHINY_RATE, GACHA_SHINY_UP_SHINY_RATE, SAME_SPECIES_EGG_SHINY_RATE, EGG_PITY_LEGENDARY_THRESHOLD, EGG_PITY_EPIC_THRESHOLD, EGG_PITY_RARE_THRESHOLD, SHINY_VARIANT_CHANCE, SHINY_EPIC_CHANCE, GACHA_DEFAULT_COMMON_EGG_THRESHOLD, GACHA_DEFAULT_RARE_EGG_THRESHOLD, GACHA_DEFAULT_EPIC_EGG_THRESHOLD, GACHA_LEGENDARY_UP_THRESHOLD_OFFSET, HATCH_WAVES_MANAPHY_EGG, HATCH_WAVES_COMMON_EGG, HATCH_WAVES_RARE_EGG, HATCH_WAVES_EPIC_EGG, HATCH_WAVES_LEGENDARY_EGG } from "#app/data/balance/rates"; +import { + MANAPHY_EGG_MANAPHY_RATE, + SAME_SPECIES_EGG_HA_RATE, + GACHA_EGG_HA_RATE, + GACHA_DEFAULT_RARE_EGGMOVE_RATE, + SAME_SPECIES_EGG_RARE_EGGMOVE_RATE, + GACHA_MOVE_UP_RARE_EGGMOVE_RATE, + GACHA_DEFAULT_SHINY_RATE, + GACHA_SHINY_UP_SHINY_RATE, + SAME_SPECIES_EGG_SHINY_RATE, + EGG_PITY_LEGENDARY_THRESHOLD, + EGG_PITY_EPIC_THRESHOLD, + EGG_PITY_RARE_THRESHOLD, + SHINY_VARIANT_CHANCE, + SHINY_EPIC_CHANCE, + GACHA_DEFAULT_COMMON_EGG_THRESHOLD, + GACHA_DEFAULT_RARE_EGG_THRESHOLD, + GACHA_DEFAULT_EPIC_EGG_THRESHOLD, + GACHA_LEGENDARY_UP_THRESHOLD_OFFSET, + HATCH_WAVES_MANAPHY_EGG, + HATCH_WAVES_COMMON_EGG, + HATCH_WAVES_RARE_EGG, + HATCH_WAVES_EPIC_EGG, + HATCH_WAVES_LEGENDARY_EGG, +} from "#app/data/balance/rates"; import { speciesEggTiers } from "#app/data/balance/species-egg-tiers"; 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 applied. * Egg will be automaticly added to the game data. - * 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. */ + /** Legacy field, kept for backwards-compatibility */ 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. */ 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, - + overrideHiddenAbility?: boolean; /** Can customize the message displayed for where the egg was obtained */ eggDescriptor?: string; } export class Egg { - //// // #region Private properties //// @@ -139,11 +164,11 @@ export class Egg { this._sourceType = eggOptions?.sourceType!; // TODO: is this bang correct? // Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced - this._tier = eggOptions?.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier()); + this._tier = eggOptions?.tier ?? Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier(); // If egg was pulled, check if egg pity needs to override the egg tier if (eggOptions?.pulled) { // Needs this._tier and this._sourceType to work - this.checkForPityTierOverrides(eggOptions.scene!); // TODO: is this bang correct? + this.checkForPityTierOverrides(); } this._id = eggOptions?.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier); @@ -154,8 +179,8 @@ export class Egg { // First roll shiny and variant so we can filter if species with an variant exist this._isShiny = eggOptions?.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny()); - this._variantTier = eggOptions?.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant()); - this._species = eggOptions?.species ?? this.rollSpecies(eggOptions!.scene!)!; // TODO: Are those bangs correct? + this._variantTier = eggOptions?.variantTier ?? Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant(); + this._species = eggOptions?.species ?? this.rollSpecies()!; // TODO: Is this bang correct? this._overrideHiddenAbility = eggOptions?.overrideHiddenAbility ?? false; @@ -173,19 +198,19 @@ export class Egg { // Needs this._tier so it needs to be generated afer the tier override if bought from same species this._eggMoveIndex = eggOptions?.eggMoveIndex ?? this.rollEggMoveIndex(); if (eggOptions?.pulled) { - this.increasePullStatistic(eggOptions.scene!); // TODO: is this bang correct? - this.addEggToGameData(eggOptions.scene!); // TODO: is this bang correct? + this.increasePullStatistic(); + this.addEggToGameData(); } }; - if (eggOptions?.scene) { - const seedOverride = Utils.randomString(24); - eggOptions?.scene.executeWithSeedOffset(() => { + const seedOverride = Utils.randomString(24); + globalScene.executeWithSeedOffset( + () => { generateEggProperties(eggOptions); - }, 0, seedOverride); - } else { // For legacy eggs without scene - generateEggProperties(eggOptions); - } + }, + 0, + seedOverride, + ); this._eggDescriptor = eggOptions?.eggDescriptor; } @@ -195,8 +220,11 @@ export class Egg { //// public isManaphyEgg(): boolean { - return (this._species === Species.PHIONE || this._species === Species.MANAPHY) || - this._tier === EggTier.COMMON && !(this._id % 204) && !this._species; + return ( + this._species === Species.PHIONE || + this._species === Species.MANAPHY || + (this._tier === EggTier.COMMON && !(this._id % 204) && !this._species) + ); } public getKey(): string { @@ -207,33 +235,37 @@ export class Egg { } // Generates a PlayerPokemon from an egg - public generatePlayerPokemon(scene: BattleScene): PlayerPokemon { + public generatePlayerPokemon(): PlayerPokemon { let ret: PlayerPokemon; - const generatePlayerPokemonHelper = (scene: BattleScene) => { + const generatePlayerPokemonHelper = () => { // Legacy egg wants to hatch. Generate missing properties if (!this._species) { this._isShiny = this.rollShiny(); - this._species = this.rollSpecies(scene!)!; // TODO: are these bangs correct? + this._species = this.rollSpecies()!; // TODO: is this bang correct? } let pokemonSpecies = getPokemonSpecies(this._species); // Special condition to have Phione eggs also have a chance of generating Manaphy if (this._species === Species.PHIONE && this._sourceType === EggSourceType.SAME_SPECIES_EGG) { - pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY); + pokemonSpecies = getPokemonSpecies( + Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY, + ); } // Sets the hidden ability if a hidden ability exists and // the override is set or the egg hits the chance let abilityIndex: number | undefined = undefined; - const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)); - const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE)); + const sameSpeciesEggHACheck = + this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE); + const gachaEggHACheck = + !(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE); if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) { abilityIndex = 2; } // This function has way to many optional parameters - ret = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false); + ret = globalScene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false); ret.shiny = this._isShiny; ret.variant = this._variantTier; @@ -244,17 +276,21 @@ export class Egg { } }; - ret = ret!; // Tell TS compiler it's defined now - scene.executeWithSeedOffset(() => { - generatePlayerPokemonHelper(scene); - }, this._id, EGG_SEED.toString()); + ret = ret!; // Tell TS compiler it's defined now + globalScene.executeWithSeedOffset( + () => { + generatePlayerPokemonHelper(); + }, + this._id, + EGG_SEED.toString(), + ); return ret; } // Doesn't need to be called if the egg got pulled by a gacha machiene - public addEggToGameData(scene: BattleScene): void { - scene.gameData.eggs.push(this); + public addEggToGameData(): void { + globalScene.gameData.eggs.push(this); } public getEggDescriptor(): string { @@ -286,12 +322,20 @@ export class Egg { return i18next.t("egg:hatchWavesMessageLongTime"); } - public getEggTypeDescriptor(scene: BattleScene): string { + public getEggTypeDescriptor(): string { switch (this.sourceType) { case EggSourceType.SAME_SPECIES_EGG: - return this._eggDescriptor ?? i18next.t("egg:sameSpeciesEgg", { species: getPokemonSpecies(this._species).getName() }); + return ( + this._eggDescriptor ?? + i18next.t("egg:sameSpeciesEgg", { + species: getPokemonSpecies(this._species).getName(), + }) + ); case EggSourceType.GACHA_LEGENDARY: - return this._eggDescriptor ?? `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp)).getName()})`; + return ( + this._eggDescriptor ?? + `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(this.timestamp)).getName()})` + ); case EggSourceType.GACHA_SHINY: return this._eggDescriptor ?? i18next.t("egg:gachaTypeShiny"); case EggSourceType.GACHA_MOVE: @@ -346,13 +390,20 @@ export class Egg { } private rollEggTier(): EggTier { - const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; + const tierValueOffset = + this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; const tierValue = Utils.randInt(256); - return tierValue >= GACHA_DEFAULT_COMMON_EGG_THRESHOLD + tierValueOffset ? EggTier.COMMON : tierValue >= GACHA_DEFAULT_RARE_EGG_THRESHOLD + tierValueOffset ? EggTier.RARE : tierValue >= GACHA_DEFAULT_EPIC_EGG_THRESHOLD + tierValueOffset ? EggTier.EPIC : EggTier.LEGENDARY; + return tierValue >= GACHA_DEFAULT_COMMON_EGG_THRESHOLD + tierValueOffset + ? EggTier.COMMON + : tierValue >= GACHA_DEFAULT_RARE_EGG_THRESHOLD + tierValueOffset + ? EggTier.RARE + : tierValue >= GACHA_DEFAULT_EPIC_EGG_THRESHOLD + tierValueOffset + ? EggTier.EPIC + : EggTier.LEGENDARY; } - private rollSpecies(scene: BattleScene): Species | null { - if (!scene) { + private rollSpecies(): Species | null { + if (!globalScene) { return null; } /** @@ -366,17 +417,17 @@ export class Egg { * when Utils.randSeedInt(8) = 1, and by making the generatePlayerPokemon() species * check pass when Utils.randSeedInt(8) = 0, we can tell them apart during tests. */ - const rand = (Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) !== 1); + const rand = Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) !== 1; return rand ? Species.PHIONE : Species.MANAPHY; - } else if (this.tier === EggTier.LEGENDARY - && this._sourceType === EggSourceType.GACHA_LEGENDARY) { + } + if (this.tier === EggTier.LEGENDARY && this._sourceType === EggSourceType.GACHA_LEGENDARY) { if (!Utils.randSeedInt(2)) { - return getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp); + return getLegendaryGachaSpeciesForTimestamp(this.timestamp); } } - let minStarterValue: integer; - let maxStarterValue: integer; + let minStarterValue: number; + let maxStarterValue: number; switch (this.tier) { case EggTier.RARE: @@ -397,17 +448,25 @@ export class Egg { break; } - const ignoredSpecies = [ Species.PHIONE, Species.MANAPHY, Species.ETERNATUS ]; + const ignoredSpecies = [Species.PHIONE, Species.MANAPHY, Species.ETERNATUS]; let speciesPool = Object.keys(speciesEggTiers) .filter(s => speciesEggTiers[s] === this.tier) - .map(s => parseInt(s) as Species) - .filter(s => !pokemonPrevolutions.hasOwnProperty(s) && getPokemonSpecies(s).isObtainable() && ignoredSpecies.indexOf(s) === -1); + .map(s => Number.parseInt(s) as Species) + .filter( + s => + !pokemonPrevolutions.hasOwnProperty(s) && + getPokemonSpecies(s).isObtainable() && + ignoredSpecies.indexOf(s) === -1, + ); // If this is the 10th egg without unlocking something new, attempt to force it. - if (scene.gameData.unlockPity[this.tier] >= 9) { - const lockedPool = speciesPool.filter(s => !scene.gameData.dexData[s].caughtAttr && !scene.gameData.eggs.some(e => e.species === s)); - if (lockedPool.length) { // Skip this if everything is unlocked + if (globalScene.gameData.unlockPity[this.tier] >= 9) { + const lockedPool = speciesPool.filter( + s => !globalScene.gameData.dexData[s].caughtAttr && !globalScene.gameData.eggs.some(e => e.species === s), + ); + if (lockedPool.length) { + // Skip this if everything is unlocked speciesPool = lockedPool; } } @@ -418,7 +477,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 @@ -429,15 +488,13 @@ export class Egg { * and being the same each time */ let totalWeight = 0; - const speciesWeights : number[] = []; + const speciesWeights: number[] = []; 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; } @@ -453,19 +510,22 @@ export class Egg { } species = species!; // tell TS compiled it's defined now! - if (!!scene.gameData.dexData[species].caughtAttr || scene.gameData.eggs.some(e => e.species === species)) { - scene.gameData.unlockPity[this.tier] = Math.min(scene.gameData.unlockPity[this.tier] + 1, 10); + if ( + globalScene.gameData.dexData[species].caughtAttr || + globalScene.gameData.eggs.some(e => e.species === species) + ) { + globalScene.gameData.unlockPity[this.tier] = Math.min(globalScene.gameData.unlockPity[this.tier] + 1, 10); } else { - scene.gameData.unlockPity[this.tier] = 0; + globalScene.gameData.unlockPity[this.tier] = 0; } return species; } /** - * Rolls whether the egg is shiny or not. - * @returns True if the egg is shiny - **/ + * Rolls whether the egg is shiny or not. + * @returns `true` if the egg is shiny + **/ private rollShiny(): boolean { let shinyChance = GACHA_DEFAULT_SHINY_RATE; switch (this._sourceType) { @@ -484,6 +544,7 @@ export class Egg { // Uses the same logic as pokemon.generateVariant(). I would like to only have this logic in one // place but I don't want to touch the pokemon class. + // TODO: Remove this or replace the one in the Pokemon class. private rollVariant(): VariantTier { if (!this.isShiny) { return VariantTier.STANDARD; @@ -492,45 +553,49 @@ export class Egg { const rand = Utils.randSeedInt(10); if (rand >= SHINY_VARIANT_CHANCE) { return VariantTier.STANDARD; // 6/10 - } else if (rand >= SHINY_EPIC_CHANCE) { - return VariantTier.RARE; // 3/10 - } else { - return VariantTier.EPIC; // 1/10 } + if (rand >= SHINY_EPIC_CHANCE) { + return VariantTier.RARE; // 3/10 + } + return VariantTier.EPIC; // 1/10 } - private checkForPityTierOverrides(scene: BattleScene): void { - const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; - scene.gameData.eggPity[EggTier.RARE] += 1; - scene.gameData.eggPity[EggTier.EPIC] += 1; - scene.gameData.eggPity[EggTier.LEGENDARY] += 1 + tierValueOffset; + private checkForPityTierOverrides(): void { + const tierValueOffset = + this._sourceType === EggSourceType.GACHA_LEGENDARY ? GACHA_LEGENDARY_UP_THRESHOLD_OFFSET : 0; + globalScene.gameData.eggPity[EggTier.RARE] += 1; + globalScene.gameData.eggPity[EggTier.EPIC] += 1; + globalScene.gameData.eggPity[EggTier.LEGENDARY] += 1 + tierValueOffset; // These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. - if (scene.gameData.eggPity[EggTier.LEGENDARY] >= EGG_PITY_LEGENDARY_THRESHOLD && this._tier === EggTier.COMMON) { + if ( + globalScene.gameData.eggPity[EggTier.LEGENDARY] >= EGG_PITY_LEGENDARY_THRESHOLD && + this._tier === EggTier.COMMON + ) { this._tier = EggTier.LEGENDARY; - } else if (scene.gameData.eggPity[EggTier.EPIC] >= EGG_PITY_EPIC_THRESHOLD && this._tier === EggTier.COMMON) { + } else if (globalScene.gameData.eggPity[EggTier.EPIC] >= EGG_PITY_EPIC_THRESHOLD && this._tier === EggTier.COMMON) { this._tier = EggTier.EPIC; - } else if (scene.gameData.eggPity[EggTier.RARE] >= EGG_PITY_RARE_THRESHOLD && this._tier === EggTier.COMMON) { + } else if (globalScene.gameData.eggPity[EggTier.RARE] >= EGG_PITY_RARE_THRESHOLD && this._tier === EggTier.COMMON) { this._tier = EggTier.RARE; } - scene.gameData.eggPity[this._tier] = 0; + globalScene.gameData.eggPity[this._tier] = 0; } - private increasePullStatistic(scene: BattleScene): void { - scene.gameData.gameStats.eggsPulled++; + private increasePullStatistic(): void { + globalScene.gameData.gameStats.eggsPulled++; if (this.isManaphyEgg()) { - scene.gameData.gameStats.manaphyEggsPulled++; + globalScene.gameData.gameStats.manaphyEggsPulled++; this._hatchWaves = this.getEggTierDefaultHatchWaves(EggTier.EPIC); return; } switch (this.tier) { case EggTier.RARE: - scene.gameData.gameStats.rareEggsPulled++; + globalScene.gameData.gameStats.rareEggsPulled++; break; case EggTier.EPIC: - scene.gameData.gameStats.epicEggsPulled++; + globalScene.gameData.gameStats.epicEggsPulled++; break; case EggTier.LEGENDARY: - scene.gameData.gameStats.legendaryEggsPulled++; + globalScene.gameData.gameStats.legendaryEggsPulled++; break; } } @@ -544,11 +609,15 @@ export class Egg { //// } -export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: number): Species { - const legendarySpecies = Object.entries(speciesEggTiers) +export function getValidLegendaryGachaSpecies(): Species[] { + return Object.entries(speciesEggTiers) .filter(s => s[1] === EggTier.LEGENDARY) - .map(s => parseInt(s[0])) - .filter(s => getPokemonSpecies(s).isObtainable()); + .map(s => Number.parseInt(s[0])) + .filter(s => getPokemonSpecies(s).isObtainable() && s !== Species.ETERNATUS); +} + +export function getLegendaryGachaSpeciesForTimestamp(timestamp: number): Species { + const legendarySpecies = getValidLegendaryGachaSpecies(); let ret: Species; @@ -558,9 +627,13 @@ export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timesta const offset = Math.floor(Math.floor(dayTimestamp / 86400000) / legendarySpecies.length); // Cycle number const index = Math.floor(dayTimestamp / 86400000) % legendarySpecies.length; // Index within cycle - scene.executeWithSeedOffset(() => { - ret = Phaser.Math.RND.shuffle(legendarySpecies)[index]; - }, offset, EGG_SEED.toString()); + globalScene.executeWithSeedOffset( + () => { + ret = Phaser.Math.RND.shuffle(legendarySpecies)[index]; + }, + offset, + EGG_SEED.toString(), + ); ret = ret!; // tell TS compiler it's return ret; @@ -571,6 +644,6 @@ export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timesta * @param pokemonSpecies - Species for wich we will check the egg tier it belongs to * @returns The egg tier of a given pokemon species */ -export function getEggTierForSpecies(pokemonSpecies :PokemonSpecies): EggTier { +export function getEggTierForSpecies(pokemonSpecies: PokemonSpecies): EggTier { return speciesEggTiers[pokemonSpecies.getRootSpeciesId()]; } diff --git a/src/data/exp.ts b/src/data/exp.ts index c03abddadfc..9f8ccce6d88 100644 --- a/src/data/exp.ts +++ b/src/data/exp.ts @@ -4,19 +4,67 @@ export enum GrowthRate { MEDIUM_FAST, MEDIUM_SLOW, SLOW, - FLUCTUATING + FLUCTUATING, } const expLevels = [ - [ 0, 15, 52, 122, 237, 406, 637, 942, 1326, 1800, 2369, 3041, 3822, 4719, 5737, 6881, 8155, 9564, 11111, 12800, 14632, 16610, 18737, 21012, 23437, 26012, 28737, 31610, 34632, 37800, 41111, 44564, 48155, 51881, 55737, 59719, 63822, 68041, 72369, 76800, 81326, 85942, 90637, 95406, 100237, 105122, 110052, 115015, 120001, 125000, 131324, 137795, 144410, 151165, 158056, 165079, 172229, 179503, 186894, 194400, 202013, 209728, 217540, 225443, 233431, 241496, 249633, 257834, 267406, 276458, 286328, 296358, 305767, 316074, 326531, 336255, 346965, 357812, 367807, 378880, 390077, 400293, 411686, 423190, 433572, 445239, 457001, 467489, 479378, 491346, 501878, 513934, 526049, 536557, 548720, 560922, 571333, 583539, 591882, 600000 ], - [ 0, 6, 21, 51, 100, 172, 274, 409, 583, 800, 1064, 1382, 1757, 2195, 2700, 3276, 3930, 4665, 5487, 6400, 7408, 8518, 9733, 11059, 12500, 14060, 15746, 17561, 19511, 21600, 23832, 26214, 28749, 31443, 34300, 37324, 40522, 43897, 47455, 51200, 55136, 59270, 63605, 68147, 72900, 77868, 83058, 88473, 94119, 100000, 106120, 112486, 119101, 125971, 133100, 140492, 148154, 156089, 164303, 172800, 181584, 190662, 200037, 209715, 219700, 229996, 240610, 251545, 262807, 274400, 286328, 298598, 311213, 324179, 337500, 351180, 365226, 379641, 394431, 409600, 425152, 441094, 457429, 474163, 491300, 508844, 526802, 545177, 563975, 583200, 602856, 622950, 643485, 664467, 685900, 707788, 730138, 752953, 776239, 800000 ], - [ 0, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913, 5832, 6859, 8000, 9261, 10648, 12167, 13824, 15625, 17576, 19683, 21952, 24389, 27000, 29791, 32768, 35937, 39304, 42875, 46656, 50653, 54872, 59319, 64000, 68921, 74088, 79507, 85184, 91125, 97336, 103823, 110592, 117649, 125000, 132651, 140608, 148877, 157464, 166375, 175616, 185193, 195112, 205379, 216000, 226981, 238328, 250047, 262144, 274625, 287496, 300763, 314432, 328509, 343000, 357911, 373248, 389017, 405224, 421875, 438976, 456533, 474552, 493039, 512000, 531441, 551368, 571787, 592704, 614125, 636056, 658503, 681472, 704969, 729000, 753571, 778688, 804357, 830584, 857375, 884736, 912673, 941192, 970299, 1000000 ], - [ 0, 9, 57, 96, 135, 179, 236, 314, 419, 560, 742, 973, 1261, 1612, 2035, 2535, 3120, 3798, 4575, 5460, 6458, 7577, 8825, 10208, 11735, 13411, 15244, 17242, 19411, 21760, 24294, 27021, 29949, 33084, 36435, 40007, 43808, 47846, 52127, 56660, 61450, 66505, 71833, 77440, 83335, 89523, 96012, 102810, 109923, 117360, 125126, 133229, 141677, 150476, 159635, 169159, 179056, 189334, 199999, 211060, 222522, 234393, 246681, 259392, 272535, 286115, 300140, 314618, 329555, 344960, 360838, 377197, 394045, 411388, 429235, 447591, 466464, 485862, 505791, 526260, 547274, 568841, 590969, 613664, 636935, 660787, 685228, 710266, 735907, 762160, 789030, 816525, 844653, 873420, 902835, 932903, 963632, 995030, 1027103, 1059860 ], - [ 0, 10, 33, 80, 156, 270, 428, 640, 911, 1250, 1663, 2160, 2746, 3430, 4218, 5120, 6141, 7290, 8573, 10000, 11576, 13310, 15208, 17280, 19531, 21970, 24603, 27440, 30486, 33750, 37238, 40960, 44921, 49130, 53593, 58320, 63316, 68590, 74148, 80000, 86151, 92610, 99383, 106480, 113906, 121670, 129778, 138240, 147061, 156250, 165813, 175760, 186096, 196830, 207968, 219520, 231491, 243890, 256723, 270000, 283726, 297910, 312558, 327680, 343281, 359370, 375953, 393040, 410636, 428750, 447388, 466560, 486271, 506530, 527343, 548720, 570666, 593190, 616298, 640000, 664301, 689210, 714733, 740880, 767656, 795070, 823128, 851840, 881211, 911250, 941963, 973360, 1005446, 1038230, 1071718, 1105920, 1140841, 1176490, 1212873, 1250000 ], - [ 0, 4, 13, 32, 65, 112, 178, 276, 393, 540, 745, 967, 1230, 1591, 1957, 2457, 3046, 3732, 4526, 5440, 6482, 7666, 9003, 10506, 12187, 14060, 16140, 18439, 20974, 23760, 26811, 30146, 33780, 37731, 42017, 46656, 50653, 55969, 60505, 66560, 71677, 78533, 84277, 91998, 98415, 107069, 114205, 123863, 131766, 142500, 151222, 163105, 172697, 185807, 196322, 210739, 222231, 238036, 250562, 267840, 281456, 300293, 315059, 335544, 351520, 373744, 390991, 415050, 433631, 459620, 479600, 507617, 529063, 559209, 582187, 614566, 639146, 673863, 700115, 737280, 765275, 804997, 834809, 877201, 908905, 954084, 987754, 1035837, 1071552, 1122660, 1160499, 1214753, 1254796, 1312322, 1354652, 1415577, 1460276, 1524731, 1571884, 1640000 ] + [ + 0, 15, 52, 122, 237, 406, 637, 942, 1326, 1800, 2369, 3041, 3822, 4719, 5737, 6881, 8155, 9564, 11111, 12800, 14632, + 16610, 18737, 21012, 23437, 26012, 28737, 31610, 34632, 37800, 41111, 44564, 48155, 51881, 55737, 59719, 63822, + 68041, 72369, 76800, 81326, 85942, 90637, 95406, 100237, 105122, 110052, 115015, 120001, 125000, 131324, 137795, + 144410, 151165, 158056, 165079, 172229, 179503, 186894, 194400, 202013, 209728, 217540, 225443, 233431, 241496, + 249633, 257834, 267406, 276458, 286328, 296358, 305767, 316074, 326531, 336255, 346965, 357812, 367807, 378880, + 390077, 400293, 411686, 423190, 433572, 445239, 457001, 467489, 479378, 491346, 501878, 513934, 526049, 536557, + 548720, 560922, 571333, 583539, 591882, 600000, + ], + [ + 0, 6, 21, 51, 100, 172, 274, 409, 583, 800, 1064, 1382, 1757, 2195, 2700, 3276, 3930, 4665, 5487, 6400, 7408, 8518, + 9733, 11059, 12500, 14060, 15746, 17561, 19511, 21600, 23832, 26214, 28749, 31443, 34300, 37324, 40522, 43897, + 47455, 51200, 55136, 59270, 63605, 68147, 72900, 77868, 83058, 88473, 94119, 100000, 106120, 112486, 119101, 125971, + 133100, 140492, 148154, 156089, 164303, 172800, 181584, 190662, 200037, 209715, 219700, 229996, 240610, 251545, + 262807, 274400, 286328, 298598, 311213, 324179, 337500, 351180, 365226, 379641, 394431, 409600, 425152, 441094, + 457429, 474163, 491300, 508844, 526802, 545177, 563975, 583200, 602856, 622950, 643485, 664467, 685900, 707788, + 730138, 752953, 776239, 800000, + ], + [ + 0, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913, 5832, 6859, 8000, 9261, + 10648, 12167, 13824, 15625, 17576, 19683, 21952, 24389, 27000, 29791, 32768, 35937, 39304, 42875, 46656, 50653, + 54872, 59319, 64000, 68921, 74088, 79507, 85184, 91125, 97336, 103823, 110592, 117649, 125000, 132651, 140608, + 148877, 157464, 166375, 175616, 185193, 195112, 205379, 216000, 226981, 238328, 250047, 262144, 274625, 287496, + 300763, 314432, 328509, 343000, 357911, 373248, 389017, 405224, 421875, 438976, 456533, 474552, 493039, 512000, + 531441, 551368, 571787, 592704, 614125, 636056, 658503, 681472, 704969, 729000, 753571, 778688, 804357, 830584, + 857375, 884736, 912673, 941192, 970299, 1000000, + ], + [ + 0, 9, 57, 96, 135, 179, 236, 314, 419, 560, 742, 973, 1261, 1612, 2035, 2535, 3120, 3798, 4575, 5460, 6458, 7577, + 8825, 10208, 11735, 13411, 15244, 17242, 19411, 21760, 24294, 27021, 29949, 33084, 36435, 40007, 43808, 47846, + 52127, 56660, 61450, 66505, 71833, 77440, 83335, 89523, 96012, 102810, 109923, 117360, 125126, 133229, 141677, + 150476, 159635, 169159, 179056, 189334, 199999, 211060, 222522, 234393, 246681, 259392, 272535, 286115, 300140, + 314618, 329555, 344960, 360838, 377197, 394045, 411388, 429235, 447591, 466464, 485862, 505791, 526260, 547274, + 568841, 590969, 613664, 636935, 660787, 685228, 710266, 735907, 762160, 789030, 816525, 844653, 873420, 902835, + 932903, 963632, 995030, 1027103, 1059860, + ], + [ + 0, 10, 33, 80, 156, 270, 428, 640, 911, 1250, 1663, 2160, 2746, 3430, 4218, 5120, 6141, 7290, 8573, 10000, 11576, + 13310, 15208, 17280, 19531, 21970, 24603, 27440, 30486, 33750, 37238, 40960, 44921, 49130, 53593, 58320, 63316, + 68590, 74148, 80000, 86151, 92610, 99383, 106480, 113906, 121670, 129778, 138240, 147061, 156250, 165813, 175760, + 186096, 196830, 207968, 219520, 231491, 243890, 256723, 270000, 283726, 297910, 312558, 327680, 343281, 359370, + 375953, 393040, 410636, 428750, 447388, 466560, 486271, 506530, 527343, 548720, 570666, 593190, 616298, 640000, + 664301, 689210, 714733, 740880, 767656, 795070, 823128, 851840, 881211, 911250, 941963, 973360, 1005446, 1038230, + 1071718, 1105920, 1140841, 1176490, 1212873, 1250000, + ], + [ + 0, 4, 13, 32, 65, 112, 178, 276, 393, 540, 745, 967, 1230, 1591, 1957, 2457, 3046, 3732, 4526, 5440, 6482, 7666, + 9003, 10506, 12187, 14060, 16140, 18439, 20974, 23760, 26811, 30146, 33780, 37731, 42017, 46656, 50653, 55969, + 60505, 66560, 71677, 78533, 84277, 91998, 98415, 107069, 114205, 123863, 131766, 142500, 151222, 163105, 172697, + 185807, 196322, 210739, 222231, 238036, 250562, 267840, 281456, 300293, 315059, 335544, 351520, 373744, 390991, + 415050, 433631, 459620, 479600, 507617, 529063, 559209, 582187, 614566, 639146, 673863, 700115, 737280, 765275, + 804997, 834809, 877201, 908905, 954084, 987754, 1035837, 1071552, 1122660, 1160499, 1214753, 1254796, 1312322, + 1354652, 1415577, 1460276, 1524731, 1571884, 1640000, + ], ]; -export function getLevelTotalExp(level: integer, growthRate: GrowthRate): integer { +export function getLevelTotalExp(level: number, growthRate: GrowthRate): number { if (level < 100) { const levelExp = expLevels[growthRate][level - 1]; if (growthRate !== GrowthRate.MEDIUM_FAST) { @@ -25,26 +73,26 @@ export function getLevelTotalExp(level: integer, growthRate: GrowthRate): intege return levelExp; } - let ret: integer; + let ret: number; switch (growthRate) { case GrowthRate.ERRATIC: - ret = (Math.pow(level, 4) + (Math.pow(level, 3) * 2000)) / 3500; + ret = (Math.pow(level, 4) + Math.pow(level, 3) * 2000) / 3500; break; case GrowthRate.FAST: - ret = Math.pow(level, 3) * 4 / 5; + ret = (Math.pow(level, 3) * 4) / 5; break; case GrowthRate.MEDIUM_FAST: ret = Math.pow(level, 3); break; case GrowthRate.MEDIUM_SLOW: - ret = (Math.pow(level, 3) * 6 / 5) - (15 * Math.pow(level, 2)) + (100 * level) - 140; + ret = (Math.pow(level, 3) * 6) / 5 - 15 * Math.pow(level, 2) + 100 * level - 140; break; case GrowthRate.SLOW: - ret = Math.pow(level, 3) * 5 / 4; + ret = (Math.pow(level, 3) * 5) / 4; break; case GrowthRate.FLUCTUATING: - ret = (Math.pow(level, 3) * ((level / 2) + 8)) * 4 / (100 + level); + ret = (Math.pow(level, 3) * (level / 2 + 8) * 4) / (100 + level); break; } @@ -55,7 +103,7 @@ export function getLevelTotalExp(level: integer, growthRate: GrowthRate): intege return Math.floor(ret); } -export function getLevelRelExp(level: integer, growthRate: GrowthRate): number { +export function getLevelRelExp(level: number, growthRate: GrowthRate): number { return getLevelTotalExp(level, growthRate) - getLevelTotalExp(level - 1, growthRate); } diff --git a/src/data/gender.ts b/src/data/gender.ts index dae7723dd85..5a835c2e786 100644 --- a/src/data/gender.ts +++ b/src/data/gender.ts @@ -1,7 +1,7 @@ export enum Gender { - GENDERLESS = -1, - MALE, - FEMALE + GENDERLESS = -1, + MALE, + FEMALE, } export function getGenderSymbol(gender: Gender) { diff --git a/src/data/moves/invalid-moves.ts b/src/data/moves/invalid-moves.ts new file mode 100644 index 00000000000..50f815b9e58 --- /dev/null +++ b/src/data/moves/invalid-moves.ts @@ -0,0 +1,281 @@ +import { Moves } from "#enums/moves"; + +/** Set of moves that cannot be called by {@linkcode Moves.METRONOME Metronome} */ +export const invalidMetronomeMoves: ReadonlySet = new Set([ + Moves.AFTER_YOU, + Moves.APPLE_ACID, + Moves.ARMOR_CANNON, + Moves.ASSIST, + Moves.ASTRAL_BARRAGE, + Moves.AURA_WHEEL, + Moves.BANEFUL_BUNKER, + Moves.BEAK_BLAST, + Moves.BEHEMOTH_BASH, + Moves.BEHEMOTH_BLADE, + Moves.BELCH, + Moves.BESTOW, + Moves.BLAZING_TORQUE, + Moves.BODY_PRESS, + Moves.BRANCH_POKE, + Moves.BREAKING_SWIPE, + Moves.CELEBRATE, + Moves.CHATTER, + Moves.CHILLING_WATER, + Moves.CHILLY_RECEPTION, + Moves.CLANGOROUS_SOUL, + Moves.COLLISION_COURSE, + Moves.COMBAT_TORQUE, + Moves.COMEUPPANCE, + Moves.COPYCAT, + Moves.COUNTER, + Moves.COVET, + Moves.CRAFTY_SHIELD, + Moves.DECORATE, + Moves.DESTINY_BOND, + Moves.DETECT, + Moves.DIAMOND_STORM, + Moves.DOODLE, + Moves.DOUBLE_IRON_BASH, + Moves.DOUBLE_SHOCK, + Moves.DRAGON_ASCENT, + Moves.DRAGON_ENERGY, + Moves.DRUM_BEATING, + Moves.DYNAMAX_CANNON, + Moves.ELECTRO_DRIFT, + Moves.ENDURE, + Moves.ETERNABEAM, + Moves.FALSE_SURRENDER, + Moves.FEINT, + Moves.FIERY_WRATH, + Moves.FILLET_AWAY, + Moves.FLEUR_CANNON, + Moves.FOCUS_PUNCH, + Moves.FOLLOW_ME, + Moves.FREEZE_SHOCK, + Moves.FREEZING_GLARE, + Moves.GLACIAL_LANCE, + Moves.GRAV_APPLE, + Moves.HELPING_HAND, + Moves.HOLD_HANDS, + Moves.HYPER_DRILL, + Moves.HYPERSPACE_FURY, + Moves.HYPERSPACE_HOLE, + Moves.ICE_BURN, + Moves.INSTRUCT, + Moves.JET_PUNCH, + Moves.JUNGLE_HEALING, + Moves.KINGS_SHIELD, + Moves.LIFE_DEW, + Moves.LIGHT_OF_RUIN, + Moves.MAKE_IT_RAIN, + Moves.MAGICAL_TORQUE, + Moves.MAT_BLOCK, + Moves.ME_FIRST, + Moves.METEOR_ASSAULT, + Moves.METRONOME, + Moves.MIMIC, + Moves.MIND_BLOWN, + Moves.MIRROR_COAT, + Moves.MIRROR_MOVE, + Moves.MOONGEIST_BEAM, + Moves.NATURE_POWER, + Moves.NATURES_MADNESS, + Moves.NOXIOUS_TORQUE, + Moves.OBSTRUCT, + Moves.ORDER_UP, + Moves.ORIGIN_PULSE, + Moves.OVERDRIVE, + Moves.PHOTON_GEYSER, + Moves.PLASMA_FISTS, + Moves.POPULATION_BOMB, + Moves.POUNCE, + Moves.POWER_SHIFT, + Moves.PRECIPICE_BLADES, + Moves.PROTECT, + Moves.PYRO_BALL, + Moves.QUASH, + Moves.QUICK_GUARD, + Moves.RAGE_FIST, + Moves.RAGE_POWDER, + Moves.RAGING_BULL, + Moves.RAGING_FURY, + Moves.RELIC_SONG, + Moves.REVIVAL_BLESSING, + Moves.RUINATION, + Moves.SALT_CURE, + Moves.SECRET_SWORD, + Moves.SHED_TAIL, + Moves.SHELL_TRAP, + Moves.SILK_TRAP, + Moves.SKETCH, + Moves.SLEEP_TALK, + Moves.SNAP_TRAP, + Moves.SNARL, + Moves.SNATCH, + Moves.SNORE, + Moves.SNOWSCAPE, + Moves.SPECTRAL_THIEF, + Moves.SPICY_EXTRACT, + Moves.SPIKY_SHIELD, + Moves.SPIRIT_BREAK, + Moves.SPOTLIGHT, + Moves.STEAM_ERUPTION, + Moves.STEEL_BEAM, + Moves.STRANGE_STEAM, + Moves.STRUGGLE, + Moves.SUNSTEEL_STRIKE, + Moves.SURGING_STRIKES, + Moves.SWITCHEROO, + Moves.TECHNO_BLAST, + Moves.TERA_STARSTORM, + Moves.THIEF, + Moves.THOUSAND_ARROWS, + Moves.THOUSAND_WAVES, + Moves.THUNDER_CAGE, + Moves.THUNDEROUS_KICK, + Moves.TIDY_UP, + Moves.TRAILBLAZE, + Moves.TRANSFORM, + Moves.TRICK, + Moves.TWIN_BEAM, + Moves.V_CREATE, + Moves.WICKED_BLOW, + Moves.WICKED_TORQUE, + Moves.WIDE_GUARD, +]); + +/** Set of moves that cannot be called by {@linkcode Moves.ASSIST Assist} */ +export const invalidAssistMoves: ReadonlySet = new Set([ + Moves.ASSIST, + Moves.BANEFUL_BUNKER, + Moves.BEAK_BLAST, + Moves.BELCH, + Moves.BESTOW, + Moves.BOUNCE, + Moves.CELEBRATE, + Moves.CHATTER, + Moves.CIRCLE_THROW, + Moves.COPYCAT, + Moves.COUNTER, + Moves.COVET, + Moves.DESTINY_BOND, + Moves.DETECT, + Moves.DIG, + Moves.DIVE, + Moves.DRAGON_TAIL, + Moves.ENDURE, + Moves.FEINT, + Moves.FLY, + Moves.FOCUS_PUNCH, + Moves.FOLLOW_ME, + Moves.HELPING_HAND, + Moves.HOLD_HANDS, + Moves.KINGS_SHIELD, + Moves.MAT_BLOCK, + Moves.ME_FIRST, + Moves.METRONOME, + Moves.MIMIC, + Moves.MIRROR_COAT, + Moves.MIRROR_MOVE, + Moves.NATURE_POWER, + Moves.PHANTOM_FORCE, + Moves.PROTECT, + Moves.RAGE_POWDER, + Moves.ROAR, + Moves.SHADOW_FORCE, + Moves.SHELL_TRAP, + Moves.SKETCH, + Moves.SKY_DROP, + Moves.SLEEP_TALK, + Moves.SNATCH, + Moves.SPIKY_SHIELD, + Moves.SPOTLIGHT, + Moves.STRUGGLE, + Moves.SWITCHEROO, + Moves.THIEF, + Moves.TRANSFORM, + Moves.TRICK, + Moves.WHIRLWIND, +]); + +/** Set of moves that cannot be called by {@linkcode Moves.SLEEP_TALK Sleep Talk} */ +export const invalidSleepTalkMoves: ReadonlySet = new Set([ + Moves.ASSIST, + Moves.BELCH, + Moves.BEAK_BLAST, + Moves.BIDE, + Moves.BOUNCE, + Moves.COPYCAT, + Moves.DIG, + Moves.DIVE, + Moves.DYNAMAX_CANNON, + Moves.FREEZE_SHOCK, + Moves.FLY, + Moves.FOCUS_PUNCH, + Moves.GEOMANCY, + Moves.ICE_BURN, + Moves.ME_FIRST, + Moves.METRONOME, + Moves.MIRROR_MOVE, + Moves.MIMIC, + Moves.PHANTOM_FORCE, + Moves.RAZOR_WIND, + Moves.SHADOW_FORCE, + Moves.SHELL_TRAP, + Moves.SKETCH, + Moves.SKULL_BASH, + Moves.SKY_ATTACK, + Moves.SKY_DROP, + Moves.SLEEP_TALK, + Moves.SOLAR_BLADE, + Moves.SOLAR_BEAM, + Moves.STRUGGLE, + Moves.UPROAR, +]); + +/** Set of moves that cannot be copied by {@linkcode Moves.COPYCAT Copycat} */ +export const invalidCopycatMoves: ReadonlySet = new Set([ + Moves.ASSIST, + Moves.BANEFUL_BUNKER, + Moves.BEAK_BLAST, + Moves.BEHEMOTH_BASH, + Moves.BEHEMOTH_BLADE, + Moves.BESTOW, + Moves.CELEBRATE, + Moves.CHATTER, + Moves.CIRCLE_THROW, + Moves.COPYCAT, + Moves.COUNTER, + Moves.COVET, + Moves.DESTINY_BOND, + Moves.DETECT, + Moves.DRAGON_TAIL, + Moves.ENDURE, + Moves.FEINT, + Moves.FOCUS_PUNCH, + Moves.FOLLOW_ME, + Moves.HELPING_HAND, + Moves.HOLD_HANDS, + Moves.KINGS_SHIELD, + Moves.MAT_BLOCK, + Moves.ME_FIRST, + Moves.METRONOME, + Moves.MIMIC, + Moves.MIRROR_COAT, + Moves.MIRROR_MOVE, + Moves.PROTECT, + Moves.RAGE_POWDER, + Moves.ROAR, + Moves.SHELL_TRAP, + Moves.SKETCH, + Moves.SLEEP_TALK, + Moves.SNATCH, + Moves.SPIKY_SHIELD, + Moves.SPOTLIGHT, + Moves.STRUGGLE, + Moves.SWITCHEROO, + Moves.THIEF, + Moves.TRANSFORM, + Moves.TRICK, + Moves.WHIRLWIND, +]); diff --git a/src/data/move.ts b/src/data/moves/move.ts similarity index 58% rename from src/data/move.ts rename to src/data/moves/move.ts index efdd4568927..f2157ab65b7 100644 --- a/src/data/move.ts +++ b/src/data/moves/move.ts @@ -1,22 +1,91 @@ -import { ChargeAnim, initMoveAnim, loadMoveAnimAssets, MoveChargeAnim } from "./battle-anims"; -import { EncoreTag, GulpMissileTag, HelpingHandTag, SemiInvulnerableTag, ShellTrapTag, StockpilingTag, SubstituteTag, TrappedTag, TypeBoostTag } from "./battler-tags"; -import { getPokemonNameWithAffix } from "../messages"; -import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon"; -import { getNonVolatileStatusEffects, getStatusEffectHealText, isNonVolatileStatusEffect, StatusEffect } from "./status-effect"; -import { getTypeDamageMultiplier, Type } from "./type"; -import { Constructor, NumberHolder } from "#app/utils"; -import * as Utils from "../utils"; -import { WeatherType } from "./weather"; -import { ArenaTagSide, ArenaTrapTag, WeakenMoveTypeTag } from "./arena-tag"; -import { allAbilities, AllyMoveCategoryPowerBoostAbAttr, applyAbAttrs, applyPostAttackAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, BlockItemTheftAbAttr, BlockNonDirectDamageAbAttr, BlockOneHitKOAbAttr, BlockRecoilDamageAttr, ConfusionOnStatusEffectAbAttr, FieldMoveTypePowerBoostAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, HealFromBerryUseAbAttr, IgnoreContactAbAttr, IgnoreMoveEffectsAbAttr, IgnoreProtectOnContactAbAttr, InfiltratorAbAttr, MaxMultiHitAbAttr, MoveAbilityBypassAbAttr, MoveEffectChanceMultiplierAbAttr, MoveTypeChangeAbAttr, ReverseDrainAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, UnswappableAbilityAbAttr, UserFieldMoveTypePowerBoostAbAttr, VariableMovePowerAbAttr, WonderSkinAbAttr } from "./ability"; -import { AttackTypeBoosterModifier, BerryModifier, PokemonHeldItemModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PreserveBerryModifier } from "../modifier/modifier"; -import { BattlerIndex, BattleType } from "../battle"; -import { TerrainType } from "./terrain"; +import { ChargeAnim, MoveChargeAnim } from "../battle-anims"; +import { + CommandedTag, + EncoreTag, + GulpMissileTag, + HelpingHandTag, + SemiInvulnerableTag, + ShellTrapTag, + StockpilingTag, + SubstituteTag, + TrappedTag, + TypeBoostTag, +} from "../battler-tags"; +import { getPokemonNameWithAffix } from "../../messages"; +import type { AttackMoveResult, TurnMove } from "../../field/pokemon"; +import type Pokemon from "../../field/pokemon"; +import { + EnemyPokemon, + HitResult, + MoveResult, + PlayerPokemon, + PokemonMove, +} from "../../field/pokemon"; +import { + getNonVolatileStatusEffects, + getStatusEffectHealText, + isNonVolatileStatusEffect, +} from "../status-effect"; +import { getTypeDamageMultiplier } from "../type"; +import { PokemonType } from "#enums/pokemon-type"; +import type { Constructor } from "#app/utils"; +import { NumberHolder } from "#app/utils"; +import * as Utils from "../../utils"; +import { WeatherType } from "#enums/weather-type"; +import type { ArenaTrapTag } from "../arena-tag"; +import { ArenaTagSide, WeakenMoveTypeTag } from "../arena-tag"; +import { + allAbilities, + AllyMoveCategoryPowerBoostAbAttr, + applyAbAttrs, + applyPostAttackAbAttrs, + applyPostItemLostAbAttrs, + applyPreAttackAbAttrs, + applyPreDefendAbAttrs, + BlockItemTheftAbAttr, + BlockNonDirectDamageAbAttr, + BlockOneHitKOAbAttr, + BlockRecoilDamageAttr, + ChangeMovePriorityAbAttr, + ConfusionOnStatusEffectAbAttr, + FieldMoveTypePowerBoostAbAttr, + FieldPreventExplosiveMovesAbAttr, + ForceSwitchOutImmunityAbAttr, + HealFromBerryUseAbAttr, + IgnoreContactAbAttr, + IgnoreMoveEffectsAbAttr, + IgnoreProtectOnContactAbAttr, + InfiltratorAbAttr, + MaxMultiHitAbAttr, + MoveAbilityBypassAbAttr, + MoveEffectChanceMultiplierAbAttr, + MoveTypeChangeAbAttr, + PostDamageForceSwitchAbAttr, + PostItemLostAbAttr, + ReverseDrainAbAttr, + UncopiableAbilityAbAttr, + UnsuppressableAbilityAbAttr, + UnswappableAbilityAbAttr, + UserFieldMoveTypePowerBoostAbAttr, + VariableMovePowerAbAttr, + WonderSkinAbAttr, +} from "../ability"; +import { + AttackTypeBoosterModifier, + BerryModifier, + PokemonHeldItemModifier, + PokemonMoveAccuracyBoosterModifier, + PokemonMultiHitModifier, + PreserveBerryModifier, +} from "../../modifier/modifier"; +import type { BattlerIndex } from "../../battle"; +import { BattleType } from "../../battle"; +import { TerrainType } from "../terrain"; import { ModifierPoolType } from "#app/modifier/modifier-type"; -import { Command } from "../ui/command-ui-handler"; +import { Command } from "../../ui/command-ui-handler"; import i18next from "i18next"; -import { Localizable } from "#app/interfaces/locales"; -import { getBerryEffectFunc } from "./berry"; +import type { Localizable } from "#app/interfaces/locales"; +import { getBerryEffectFunc } from "../berry"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -24,7 +93,13 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveUsedEvent } from "#app/events/battle-scene"; -import { BATTLE_STATS, type BattleStat, EFFECTIVE_STATS, type EffectiveStat, getStatKey, Stat } from "#app/enums/stat"; +import { + BATTLE_STATS, + type BattleStat, + type EffectiveStat, + getStatKey, + Stat, +} from "#app/enums/stat"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; @@ -34,92 +109,23 @@ import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { SwitchPhase } from "#app/phases/switch-phase"; import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; -import { SpeciesFormChangeRevertWeatherFormTrigger } from "./pokemon-forms"; -import { GameMode } from "#app/game-mode"; -import { applyChallenges, ChallengeType } from "./challenge"; +import { SpeciesFormChangeRevertWeatherFormTrigger } from "../pokemon-forms"; +import type { GameMode } from "#app/game-mode"; +import { applyChallenges, ChallengeType } from "../challenge"; import { SwitchType } from "#enums/switch-type"; - -export enum MoveCategory { - PHYSICAL, - SPECIAL, - STATUS -} - -export enum MoveTarget { - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_the_user Moves that target the User} */ - USER, - OTHER, - ALL_OTHERS, - NEAR_OTHER, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_Pok%C3%A9mon Moves that target all adjacent Pokemon} */ - ALL_NEAR_OTHERS, - NEAR_ENEMY, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_foes Moves that target all adjacent foes} */ - ALL_NEAR_ENEMIES, - RANDOM_NEAR_ENEMY, - ALL_ENEMIES, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Counterattacks Counterattacks} */ - ATTACKER, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_one_adjacent_ally Moves that target one adjacent ally} */ - NEAR_ALLY, - ALLY, - USER_OR_NEAR_ALLY, - USER_AND_ALLIES, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_Pok%C3%A9mon Moves that target all Pokemon} */ - ALL, - USER_SIDE, - /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Entry_hazard-creating_moves Entry hazard-creating moves} */ - ENEMY_SIDE, - BOTH_SIDES, - PARTY, - CURSE -} - -export enum MoveFlags { - NONE = 0, - MAKES_CONTACT = 1 << 0, - IGNORE_PROTECT = 1 << 1, - IGNORE_VIRTUAL = 1 << 2, - /** - * Sound-based moves have the following effects: - * - Pokemon with the {@linkcode Abilities.SOUNDPROOF Soundproof Ability} are unaffected by other Pokemon's sound-based moves. - * - Pokemon affected by {@linkcode Moves.THROAT_CHOP Throat Chop} cannot use sound-based moves for two turns. - * - Sound-based moves used by a Pokemon with {@linkcode Abilities.LIQUID_VOICE Liquid Voice} become Water-type moves. - * - Sound-based moves used by a Pokemon with {@linkcode Abilities.PUNK_ROCK Punk Rock} are boosted by 30%. Pokemon with Punk Rock also take half damage from sound-based moves. - * - All sound-based moves (except Howl) can hit Pokemon behind an active {@linkcode Moves.SUBSTITUTE Substitute}. - * - * cf https://bulbapedia.bulbagarden.net/wiki/Sound-based_move - */ - SOUND_BASED = 1 << 3, - HIDE_USER = 1 << 4, - HIDE_TARGET = 1 << 5, - BITING_MOVE = 1 << 6, - PULSE_MOVE = 1 << 7, - PUNCHING_MOVE = 1 << 8, - SLICING_MOVE = 1 << 9, - /** - * Indicates a move should be affected by {@linkcode Abilities.RECKLESS} - * @see {@linkcode Move.recklessMove()} - */ - RECKLESS_MOVE = 1 << 10, - /** Indicates a move should be affected by {@linkcode Abilities.BULLETPROOF} */ - BALLBOMB_MOVE = 1 << 11, - /** Grass types and pokemon with {@linkcode Abilities.OVERCOAT} are immune to powder moves */ - POWDER_MOVE = 1 << 12, - /** Indicates a move should trigger {@linkcode Abilities.DANCER} */ - DANCE_MOVE = 1 << 13, - /** Indicates a move should trigger {@linkcode Abilities.WIND_RIDER} */ - WIND_MOVE = 1 << 14, - /** Indicates a move should trigger {@linkcode Abilities.TRIAGE} */ - TRIAGE_MOVE = 1 << 15, - IGNORE_ABILITIES = 1 << 16, - /** Enables all hits of a multi-hit move to be accuracy checked individually */ - CHECK_ALL_HITS = 1 << 17, - /** Indicates a move is able to bypass its target's Substitute (if the target has one) */ - IGNORE_SUBSTITUTE = 1 << 18, - /** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */ - REDIRECT_COUNTER = 1 << 19, -} +import { StatusEffect } from "#enums/status-effect"; +import { globalScene } from "#app/global-scene"; +import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; +import { LoadMoveAnimPhase } from "#app/phases/load-move-anim-phase"; +import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase"; +import { MoveAnimPhase } from "#app/phases/move-anim-phase"; +import { loggedInUser } from "#app/account"; +import { MoveCategory } from "#enums/MoveCategory"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveFlags } from "#enums/MoveFlags"; +import { MoveEffectTrigger } from "#enums/MoveEffectTrigger"; +import { MultiHitType } from "#enums/MultiHitType"; +import { invalidAssistMoves, invalidCopycatMoves, invalidMetronomeMoves, invalidSleepTalkMoves } from "./invalid-moves"; type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean; type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean; @@ -127,7 +133,7 @@ type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean; export default class Move implements Localizable { public id: Moves; public name: string; - private _type: Type; + private _type: PokemonType; private _category: MoveCategory; public moveTarget: MoveTarget; public power: number; @@ -144,7 +150,7 @@ export default class Move implements Localizable { private flags: number = 0; private nameAppend: string = ""; - constructor(id: Moves, type: Type, category: MoveCategory, defaultMoveTarget: MoveTarget, power: number, accuracy: number, pp: number, chance: number, priority: number, generation: number) { + constructor(id: Moves, type: PokemonType, category: MoveCategory, defaultMoveTarget: MoveTarget, power: number, accuracy: number, pp: number, chance: number, priority: number, generation: number) { this.id = id; this._type = type; this._category = category; @@ -314,21 +320,21 @@ export default class Move implements Localizable { * Currently looks at cases of Grass types with powder moves and Dark types with moves affected by Prankster. * @param {Pokemon} user the source of this move * @param {Pokemon} target the target of this move - * @param {Type} type the type of the move's target + * @param {PokemonType} type the type of the move's target * @returns boolean */ - isTypeImmune(user: Pokemon, target: Pokemon, type: Type): boolean { + isTypeImmune(user: Pokemon, target: Pokemon, type: PokemonType): boolean { if (this.moveTarget === MoveTarget.USER) { return false; } switch (type) { - case Type.GRASS: + case PokemonType.GRASS: if (this.hasFlag(MoveFlags.POWDER_MOVE)) { return true; } break; - case Type.DARK: + case PokemonType.DARK: if (user.hasAbility(Abilities.PRANKSTER) && this.category === MoveCategory.STATUS && (user.isPlayer() !== target.isPlayer())) { return true; } @@ -433,16 +439,6 @@ export default class Move implements Localizable { return this; } - /** - * Sets the {@linkcode MoveFlags.IGNORE_VIRTUAL} flag for the calling Move - * @see {@linkcode Moves.NATURE_POWER} - * @returns The {@linkcode Move} that called this function - */ - ignoresVirtual(): this { - this.setFlag(MoveFlags.IGNORE_VIRTUAL, true); - return this; - } - /** * Sets the {@linkcode MoveFlags.SOUND_BASED} flag for the calling Move * @see {@linkcode Moves.UPROAR} @@ -613,6 +609,16 @@ export default class Move implements Localizable { return this; } + /** + * Sets the {@linkcode MoveFlags.REFLECTABLE} flag for the calling Move + * @see {@linkcode Moves.ATTRACT} + * @returns The {@linkcode Move} that called this function + */ + reflectable(): this { + this.setFlag(MoveFlags.REFLECTABLE, true); + return this; + } + /** * Checks if the move flag applies to the pokemon(s) using/receiving the move * @param flag {@linkcode MoveFlags} MoveFlag to check on user and/or target @@ -666,21 +672,19 @@ export default class Move implements Localizable { } /** - * Sees if, given the target pokemon, a move fails on it (by looking at each {@linkcode MoveAttr} of this move + * Sees if a move has a custom failure text (by looking at each {@linkcode MoveAttr} of this move) * @param user {@linkcode Pokemon} using the move - * @param target {@linkcode Pokemon} receiving the move - * @param move {@linkcode Move} using the move - * @param cancelled {@linkcode Utils.BooleanHolder} to hold boolean value - * @returns string of the failed text, or null + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + * @returns string of the custom failure text, or `null` if it uses the default text ("But it failed!") */ - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { for (const attr of this.attrs) { - const failedText = attr.getFailedText(user, target, move, cancelled); - if (failedText !== null) { + const failedText = attr.getFailedText(user, target, move); + if (failedText) { return failedText; } } - return null; } /** @@ -690,7 +694,7 @@ export default class Move implements Localizable { * @param move {@linkcode Move} using the move * @returns integer representing the total benefitScore */ - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { let score = 0; for (const attr of this.attrs) { @@ -711,9 +715,13 @@ export default class Move implements Localizable { * @param move {@linkcode Move} using the move * @returns integer representing the total benefitScore */ - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { let score = 0; + if (target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target) { + return 20 * (target.isPlayer() === user.isPlayer() ? -1 : 1); // always -20 with how the AI handles this score + } + for (const attr of this.attrs) { // conditionals to check if the move is self targeting (if so then you are applying the move to yourself, not the target) score += attr.getTargetBenefitScore(user, !attr.selfTarget ? target : user, move) * (target !== user && attr.selfTarget ? -1 : 1); @@ -742,10 +750,10 @@ export default class Move implements Localizable { const isOhko = this.hasAttr(OneHitKOAccuracyAttr); if (!isOhko) { - user.scene.applyModifiers(PokemonMoveAccuracyBoosterModifier, user.isPlayer(), user, moveAccuracy); + globalScene.applyModifiers(PokemonMoveAccuracyBoosterModifier, user.isPlayer(), user, moveAccuracy); } - if (user.scene.arena.weather?.weatherType === WeatherType.FOG) { + if (globalScene.arena.weather?.weatherType === WeatherType.FOG) { /** * The 0.9 multiplier is PokeRogue-only implementation, Bulbapedia uses 3/5 * See Fog {@link https://bulbapedia.bulbagarden.net/wiki/Fog} @@ -753,7 +761,7 @@ export default class Move implements Localizable { moveAccuracy.value = Math.floor(moveAccuracy.value * 0.9); } - if (!isOhko && user.scene.arena.getTag(ArenaTagType.GRAVITY)) { + if (!isOhko && globalScene.arena.getTag(ArenaTagType.GRAVITY)) { moveAccuracy.value = Math.floor(moveAccuracy.value * 1.67); } @@ -778,7 +786,7 @@ export default class Move implements Localizable { applyPreAttackAbAttrs(MoveTypeChangeAbAttr, source, target, this, true, null, typeChangeMovePowerMultiplier); const sourceTeraType = source.getTeraType(); - if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === this.type && power.value < 60 && this.priority <= 0 && !this.hasAttr(MultiHitAttr) && !source.scene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { + if (source.isTerastallized && sourceTeraType === this.type && power.value < 60 && this.priority <= 0 && !this.hasAttr(MultiHitAttr) && !globalScene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { power.value = 60; } @@ -789,7 +797,7 @@ export default class Move implements Localizable { } const fieldAuras = new Set( - source.scene.getField(true) + globalScene.getField(true) .map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr).filter(attr => { const condition = attr.getCondition(); return (!condition || condition(p)); @@ -800,7 +808,7 @@ export default class Move implements Localizable { aura.applyPreAttack(source, null, simulated, target, this, [ power ]); } - const alliedField: Pokemon[] = source instanceof PlayerPokemon ? source.scene.getPlayerField() : source.scene.getEnemyField(); + const alliedField: Pokemon[] = source instanceof PlayerPokemon ? globalScene.getPlayerField() : globalScene.getEnemyField(); alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, target, this, simulated, power)); power.value *= typeChangeMovePowerMultiplier.value; @@ -812,11 +820,9 @@ export default class Move implements Localizable { applyMoveAttrs(VariablePowerAttr, source, target, this, power); - source.scene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, new Utils.IntegerHolder(0), power); - if (!this.hasAttr(TypelessAttr)) { - source.scene.arena.applyTags(WeakenMoveTypeTag, simulated, this.type, power); - source.scene.applyModifiers(AttackTypeBoosterModifier, source.isPlayer(), source, this.type, power); + globalScene.arena.applyTags(WeakenMoveTypeTag, simulated, this.type, power); + globalScene.applyModifiers(AttackTypeBoosterModifier, source.isPlayer(), source, this.type, power); } if (source.getTag(HelpingHandTag)) { @@ -825,73 +831,151 @@ export default class Move implements Localizable { return power.value; } + + getPriority(user: Pokemon, simulated: boolean = true) { + const priority = new Utils.NumberHolder(this.priority); + + applyMoveAttrs(IncrementMovePriorityAttr, user, null, this, priority); + applyAbAttrs(ChangeMovePriorityAbAttr, user, null, simulated, this, priority); + + return priority.value; + } + + /** + * Calculate the [Expected Power](https://en.wikipedia.org/wiki/Expected_value) per turn + * of this move, taking into account multi hit moves, accuracy, and the number of turns it + * takes to execute. + * + * Does not (yet) consider the current field effects or the user's abilities. + */ + calculateEffectivePower(): number { + let effectivePower: number; + // Triple axel and triple kick are easier to special case. + if (this.id === Moves.TRIPLE_AXEL) { + effectivePower = 94.14; + } else if (this.id === Moves.TRIPLE_KICK) { + effectivePower = 47.07; + } else { + const multiHitAttr = this.getAttrs(MultiHitAttr)[0]; + if (multiHitAttr) { + effectivePower = multiHitAttr.calculateExpectedHitCount(this) * this.power; + } else { + effectivePower = this.power * (this.accuracy === -1 ? 1 : this.accuracy / 100); + } + } + /** The number of turns the user must commit to for this move's damage */ + let numTurns = 1; + + // These are intentionally not else-if statements even though there are no + // pokemon moves that have more than one of these attributes. This allows + // the function to future proof new moves / custom move behaviors. + if (this.hasAttr(DelayedAttackAttr)) { + numTurns += 2; + } + if (this.hasAttr(RechargeAttr)) { + numTurns += 1; + } + if (this.isChargingMove()) { + numTurns += 1; + } + return effectivePower / numTurns; + } + + /** + * Returns `true` if this move can be given additional strikes + * by enhancing effects. + * Currently used for {@link https://bulbapedia.bulbagarden.net/wiki/Parental_Bond_(Ability) | Parental Bond} + * and {@linkcode PokemonMultiHitModifier | Multi-Lens}. + * @param user The {@linkcode Pokemon} using the move + * @param restrictSpread `true` if the enhancing effect + * should not affect multi-target moves (default `false`) + */ + canBeMultiStrikeEnhanced(user: Pokemon, restrictSpread: boolean = false): boolean { + // Multi-strike enhancers... + + // ...cannot enhance moves that hit multiple targets + const { targets, multiple } = getMoveTargets(user, this.id); + const isMultiTarget = multiple && targets.length > 1; + + // ...cannot enhance multi-hit or sacrificial moves + const exceptAttrs: Constructor[] = [ + MultiHitAttr, + SacrificialAttr, + SacrificialAttrOnHit + ]; + + // ...and cannot enhance these specific moves. + const exceptMoves: Moves[] = [ + Moves.FLING, + Moves.UPROAR, + Moves.ROLLOUT, + Moves.ICE_BALL, + Moves.ENDEAVOR + ]; + + return (!restrictSpread || !isMultiTarget) + && !this.isChargingMove() + && !exceptAttrs.some(attr => this.hasAttr(attr)) + && !exceptMoves.some(id => this.id === id) + && this.category !== MoveCategory.STATUS; + } } export class AttackMove extends Move { - constructor(id: Moves, type: Type, category: MoveCategory, power: integer, accuracy: integer, pp: integer, chance: integer, priority: integer, generation: integer) { + constructor(id: Moves, type: PokemonType, category: MoveCategory, power: number, accuracy: number, pp: number, chance: number, priority: number, generation: number) { super(id, type, category, MoveTarget.NEAR_OTHER, power, accuracy, pp, chance, priority, generation); /** * {@link https://bulbapedia.bulbagarden.net/wiki/Freeze_(status_condition)} * > All damaging Fire-type moves can now thaw a frozen target, regardless of whether or not they have a chance to burn; */ - if (this.type === Type.FIRE) { + if (this.type === PokemonType.FIRE) { this.addAttr(new HealStatusEffectAttr(false, StatusEffect.FREEZE)); } } - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - let ret = super.getTargetBenefitScore(user, target, move); - + /** + * Compute the benefit score of this move based on the offensive stat used and the move's power. + * @param user The Pokemon using the move + * @param target The Pokemon targeted by the move + * @param move The move being used + * @returns The benefit score of using this move + */ + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { + // TODO: Properly handle foul play, body press, and opponent stat stages. + const ret = super.getTargetBenefitScore(user, target, move); let attackScore = 0; - const effectiveness = target.getAttackTypeEffectiveness(this.type, user); - attackScore = Math.pow(effectiveness - 1, 2) * effectiveness < 1 ? -2 : 2; - if (attackScore) { - if (this.category === MoveCategory.PHYSICAL) { - const atk = new Utils.IntegerHolder(user.getEffectiveStat(Stat.ATK, target)); - applyMoveAttrs(VariableAtkAttr, user, target, move, atk); - if (atk.value > user.getEffectiveStat(Stat.SPATK, target)) { - const statRatio = user.getEffectiveStat(Stat.SPATK, target) / atk.value; - if (statRatio <= 0.75) { - attackScore *= 2; - } else if (statRatio <= 0.875) { - attackScore *= 1.5; - } - } - } else { - const spAtk = new Utils.IntegerHolder(user.getEffectiveStat(Stat.SPATK, target)); - applyMoveAttrs(VariableAtkAttr, user, target, move, spAtk); - if (spAtk.value > user.getEffectiveStat(Stat.ATK, target)) { - const statRatio = user.getEffectiveStat(Stat.ATK, target) / spAtk.value; - if (statRatio <= 0.75) { - attackScore *= 2; - } else if (statRatio <= 0.875) { - attackScore *= 1.5; - } - } - } - - const power = new Utils.NumberHolder(this.power); - applyMoveAttrs(VariablePowerAttr, user, target, move, power); - - attackScore += Math.floor(power.value / 5); + const effectiveness = target.getAttackTypeEffectiveness(this.type, user, undefined, undefined, this); + attackScore = Math.pow(effectiveness - 1, 2) * (effectiveness < 1 ? -2 : 2); + const [ thisStat, offStat ]: EffectiveStat[] = this.category === MoveCategory.PHYSICAL ? [ Stat.ATK, Stat.SPATK ] : [ Stat.SPATK, Stat.ATK ]; + const statHolder = new Utils.NumberHolder(user.getEffectiveStat(thisStat, target)); + const offStatValue = user.getEffectiveStat(offStat, target); + applyMoveAttrs(VariableAtkAttr, user, target, move, statHolder); + const statRatio = offStatValue / statHolder.value; + if (statRatio <= 0.75) { + attackScore *= 2; + } else if (statRatio <= 0.875) { + attackScore *= 1.5; } - ret -= attackScore; + const power = new Utils.NumberHolder(this.calculateEffectivePower()); + applyMoveAttrs(VariablePowerAttr, user, target, move, power); - return ret; + attackScore += Math.floor(power.value / 5); + + return ret - attackScore; } } export class StatusMove extends Move { - constructor(id: Moves, type: Type, accuracy: integer, pp: integer, chance: integer, priority: integer, generation: integer) { + constructor(id: Moves, type: PokemonType, accuracy: number, pp: number, chance: number, priority: number, generation: number) { super(id, type, MoveCategory.STATUS, MoveTarget.NEAR_OTHER, -1, accuracy, pp, chance, priority, generation); } } export class SelfStatusMove extends Move { - constructor(id: Moves, type: Type, accuracy: integer, pp: integer, chance: integer, priority: integer, generation: integer) { + constructor(id: Moves, type: PokemonType, accuracy: number, pp: number, chance: number, priority: number, generation: number) { super(id, type, MoveCategory.STATUS, MoveTarget.USER, -1, accuracy, pp, chance, priority, generation); } } @@ -930,7 +1014,7 @@ function ChargeMove(Base: TBase) { * @param target the {@linkcode Pokemon} targeted by this move (optional) */ showChargeText(user: Pokemon, target?: Pokemon): void { - user.scene.queueMessage(this._chargeText + globalScene.queueMessage(this._chargeText .replace("{USER}", getPokemonNameWithAffix(user)) .replace("{TARGET}", getPokemonNameWithAffix(target)) ); @@ -998,7 +1082,7 @@ export abstract class MoveAttr { * @param args Set of unique arguments needed by this attribute * @returns true if application of the ability succeeds */ - apply(user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): boolean { return true; } @@ -1015,11 +1099,10 @@ export abstract class MoveAttr { * @param user {@linkcode Pokemon} using the move * @param target {@linkcode Pokemon} target of the move * @param move {@linkcode Move} with this attribute - * @param cancelled {@linkcode Utils.BooleanHolder} which stores if the move should fail * @returns the string representing failure of this {@linkcode Move} */ - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { - return null; + getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { + return; } /** @@ -1027,7 +1110,7 @@ export abstract class MoveAttr { * @see {@linkcode EnemyPokemon.getNextMove} * @virtual */ - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return 0; } @@ -1036,17 +1119,25 @@ export abstract class MoveAttr { * @see {@linkcode EnemyPokemon.getNextMove} * @virtual */ - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return 0; } } -export enum MoveEffectTrigger { - PRE_APPLY, - POST_APPLY, - HIT, - /** Triggers one time after all target effects have applied */ - POST_TARGET, +interface MoveEffectAttrOptions { + /** + * Defines when this effect should trigger in the move's effect order + * @see {@linkcode MoveEffectPhase} + */ + trigger?: MoveEffectTrigger; + /** Should this effect only apply on the first hit? */ + firstHitOnly?: boolean; + /** Should this effect only apply on the last hit? */ + lastHitOnly?: boolean; + /** Should this effect only apply on the first target hit? */ + firstTargetOnly?: boolean; + /** Overrides the secondary effect chance for this attr if set. */ + effectChanceOverride?: number; } /** Base class defining all Move Effect Attributes @@ -1054,26 +1145,59 @@ export enum MoveEffectTrigger { * @see {@linkcode apply} */ export class MoveEffectAttr extends MoveAttr { - /** Defines when this effect should trigger in the move's effect order - * @see {@linkcode phases.MoveEffectPhase.start} + /** + * A container for this attribute's optional parameters + * @see {@linkcode MoveEffectAttrOptions} for supported params. */ - public trigger: MoveEffectTrigger; - /** Should this effect only apply on the first hit? */ - public firstHitOnly: boolean; - /** Should this effect only apply on the last hit? */ - public lastHitOnly: boolean; - /** Should this effect only apply on the first target hit? */ - public firstTargetOnly: boolean; - /** Overrides the secondary effect chance for this attr if set. */ - public effectChanceOverride?: number; + protected options?: MoveEffectAttrOptions; - constructor(selfTarget?: boolean, trigger?: MoveEffectTrigger, firstHitOnly: boolean = false, lastHitOnly: boolean = false, firstTargetOnly: boolean = false, effectChanceOverride?: number) { + constructor(selfTarget?: boolean, options?: MoveEffectAttrOptions) { super(selfTarget); - this.trigger = trigger ?? MoveEffectTrigger.POST_APPLY; - this.firstHitOnly = firstHitOnly; - this.lastHitOnly = lastHitOnly; - this.firstTargetOnly = firstTargetOnly; - this.effectChanceOverride = effectChanceOverride; + this.options = options; + } + + /** + * Defines when this effect should trigger in the move's effect order. + * @default MoveEffectTrigger.POST_APPLY + * @see {@linkcode MoveEffectTrigger} + */ + public get trigger () { + return this.options?.trigger ?? MoveEffectTrigger.POST_APPLY; + } + + /** + * `true` if this effect should only trigger on the first hit of + * multi-hit moves. + * @default false + */ + public get firstHitOnly () { + return this.options?.firstHitOnly ?? false; + } + + /** + * `true` if this effect should only trigger on the last hit of + * multi-hit moves. + * @default false + */ + public get lastHitOnly () { + return this.options?.lastHitOnly ?? false; + } + + /** + * `true` if this effect should apply only upon hitting a target + * for the first time when targeting multiple {@linkcode Pokemon}. + * @default false + */ + public get firstTargetOnly () { + return this.options?.firstTargetOnly ?? false; + } + + /** + * If defined, overrides the move's base chance for this + * secondary effect to trigger. + */ + public get effectChanceOverride () { + return this.options?.effectChanceOverride; } /** @@ -1092,7 +1216,7 @@ export class MoveEffectAttr extends MoveAttr { } /** Applies move effects so long as they are able based on {@linkcode canApply} */ - apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { return this.canApply(user, target, move, args); } @@ -1105,14 +1229,14 @@ export class MoveEffectAttr extends MoveAttr { * @param selfEffect `true` if move targets user. * @returns Move effect chance value. */ - getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): integer { + getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): number { const moveChance = new Utils.NumberHolder(this.effectChanceOverride ?? move.chance); applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, false, moveChance, move, target, selfEffect, showAbility); if ((!move.hasAttr(FlinchAttr) || moveChance.value <= move.chance) && !move.hasAttr(SecretPowerAttr)) { const userSide = user.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - user.scene.arena.applyTagsForSide(ArenaTagType.WATER_FIRE_PLEDGE, userSide, false, moveChance); + globalScene.arena.applyTagsForSide(ArenaTagType.WATER_FIRE_PLEDGE, userSide, false, moveChance); } if (!selfEffect) { @@ -1152,7 +1276,7 @@ export class MessageHeaderAttr extends MoveHeaderAttr { : this.message(user, move); if (message) { - user.scene.queueMessage(message); + globalScene.queueMessage(message); return true; } return false; @@ -1205,13 +1329,61 @@ export class PreMoveMessageAttr extends MoveAttr { ? this.message as string : this.message(user, target, move); if (message) { - user.scene.queueMessage(message, 500); + globalScene.queueMessage(message, 500); return true; } return false; } } +/** + * Attribute for moves that can be conditionally interrupted to be considered to + * have failed before their "useMove" message is displayed. Currently used by + * Focus Punch. + * @extends MoveAttr + */ +export class PreUseInterruptAttr extends MoveAttr { + protected message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string); + protected overridesFailedMessage: boolean; + protected conditionFunc: MoveConditionFunc; + + /** + * Create a new MoveInterruptedMessageAttr. + * @param message The message to display when the move is interrupted, or a function that formats the message based on the user, target, and move. + */ + constructor(message?: string | ((user: Pokemon, target: Pokemon, move: Move) => string), conditionFunc?: MoveConditionFunc) { + super(); + this.message = message; + this.conditionFunc = conditionFunc ?? (() => true); + } + + /** + * Message to display when a move is interrupted. + * @param user {@linkcode Pokemon} using the move + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + */ + override apply(user: Pokemon, target: Pokemon, move: Move): boolean { + return this.conditionFunc(user, target, move); + } + + /** + * Message to display when a move is interrupted. + * @param user {@linkcode Pokemon} using the move + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + */ + override getFailedText(user: Pokemon, target: Pokemon, move: Move): string | undefined { + if (this.message && this.conditionFunc(user, target, move)) { + const message = + typeof this.message === "string" + ? (this.message as string) + : this.message(user, target, move); + return message; + } + } +} + /** * Attribute for Status moves that take attack type effectiveness * into consideration (i.e. {@linkcode https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move) | Thunder Wave}) @@ -1229,12 +1401,12 @@ export class IgnoreOpponentStatStagesAttr extends MoveAttr { export class HighCritAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value++; + (args[0] as Utils.NumberHolder).value++; return true; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return 3; } } @@ -1246,27 +1418,27 @@ export class CritOnlyAttr extends MoveAttr { return true; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return 5; } } export class FixedDamageAttr extends MoveAttr { - private damage: integer; + private damage: number; - constructor(damage: integer) { + constructor(damage: number) { super(); this.damage = damage; } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = this.getDamage(user, target, move); + (args[0] as Utils.NumberHolder).value = this.getDamage(user, target, move); return true; } - getDamage(user: Pokemon, target: Pokemon, move: Move): integer { + getDamage(user: Pokemon, target: Pokemon, move: Move): number { return this.damage; } } @@ -1277,21 +1449,45 @@ export class UserHpDamageAttr extends FixedDamageAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = user.hp; + (args[0] as Utils.NumberHolder).value = user.hp; return true; } } export class TargetHalfHpDamageAttr extends FixedDamageAttr { + /** + * The initial amount of hp the target had before the first hit. + * Used for calculating multi lens damage. + */ + 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; + case lensCount + 1: + // parental bond added hit; calc damage as normal + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue(target.hp / 2); + return true; + } } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { @@ -1305,7 +1501,7 @@ export class MatchHpAttr extends FixedDamageAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = target.hp - user.hp; + (args[0] as Utils.NumberHolder).value = target.hp - user.hp; return true; } @@ -1315,7 +1511,7 @@ export class MatchHpAttr extends FixedDamageAttr { } // TODO - /*getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + /*getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return 0; }*/ } @@ -1326,7 +1522,7 @@ export class CounterDamageAttr extends FixedDamageAttr { private moveFilter: MoveFilter; private multiplier: number; - constructor(moveFilter: MoveFilter, multiplier: integer) { + constructor(moveFilter: MoveFilter, multiplier: number) { super(0); this.moveFilter = moveFilter; @@ -1334,8 +1530,8 @@ export class CounterDamageAttr extends FixedDamageAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const damage = user.turnData.attacksReceived.filter(ar => this.moveFilter(allMoves[ar.move])).reduce((total: integer, ar: AttackMoveResult) => total + ar.damage, 0); - (args[0] as Utils.IntegerHolder).value = Utils.toDmgValue(damage * this.multiplier); + const damage = user.turnData.attacksReceived.filter(ar => this.moveFilter(allMoves[ar.move])).reduce((total: number, ar: AttackMoveResult) => total + ar.damage, 0); + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue(damage * this.multiplier); return true; } @@ -1367,13 +1563,13 @@ export class RandomLevelDamageAttr extends FixedDamageAttr { export class ModifiedDamageAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const initialDamage = args[0] as Utils.IntegerHolder; + const initialDamage = args[0] as Utils.NumberHolder; initialDamage.value = this.getModifiedDamage(user, target, move, initialDamage.value); return true; } - getModifiedDamage(user: Pokemon, target: Pokemon, move: Move, damage: integer): integer { + getModifiedDamage(user: Pokemon, target: Pokemon, move: Move, damage: number): number { return damage; } } @@ -1387,18 +1583,32 @@ export class SurviveDamageAttr extends ModifiedDamageAttr { return (user, target, move) => target.hp > 1; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return target.hp > 1 ? 0 : -20; } } +export class SplashAttr extends MoveEffectAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:splash")); + return true; + } +} + +export class CelebrateAttr extends MoveEffectAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:celebrate", { playerName: loggedInUser?.username })); + return true; + } +} + export class RecoilAttr extends MoveEffectAttr { private useHp: boolean; private damageRatio: number; private unblockable: boolean; constructor(useHp: boolean = false, damageRatio: number = 0.25, unblockable: boolean = false) { - super(true, MoveEffectTrigger.POST_APPLY, false, true); + super(true, { lastHitOnly: true }); this.useHp = useHp; this.damageRatio = damageRatio; @@ -1420,8 +1630,13 @@ export class RecoilAttr extends MoveEffectAttr { return false; } - const damageValue = (!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio; - const minValue = user.turnData.damageDealt ? 1 : 0; + // Chloroblast and Struggle should not deal recoil damage if the move was not successful + if (this.useHp && [ MoveResult.FAIL, MoveResult.MISS ].includes(user.getLastXMoves(1)[0]?.result ?? MoveResult.FAIL)) { + return false; + } + + const damageValue = (!this.useHp ? user.turnData.totalDamageDealt : user.getMaxHp()) * this.damageRatio; + const minValue = user.turnData.totalDamageDealt ? 1 : 0; const recoilDamage = Utils.toDmgValue(damageValue, minValue); if (!recoilDamage) { return false; @@ -1432,13 +1647,13 @@ export class RecoilAttr extends MoveEffectAttr { } user.damageAndUpdate(recoilDamage, HitResult.OTHER, false, true, true); - user.scene.queueMessage(i18next.t("moveTriggers:hitWithRecoil", { pokemonName: getPokemonNameWithAffix(user) })); + globalScene.queueMessage(i18next.t("moveTriggers:hitWithRecoil", { pokemonName: getPokemonNameWithAffix(user) })); user.turnData.damageTaken += recoilDamage; return true; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return Math.floor((move.power / 5) / -4); } } @@ -1451,7 +1666,7 @@ export class RecoilAttr extends MoveEffectAttr { **/ export class SacrificialAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.POST_TARGET); + super(true, { trigger: MoveEffectTrigger.POST_TARGET }); } /** @@ -1469,7 +1684,7 @@ export class SacrificialAttr extends MoveEffectAttr { return true; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { if (user.isBoss()) { return -20; } @@ -1484,7 +1699,7 @@ export class SacrificialAttr extends MoveEffectAttr { **/ export class SacrificialAttrOnHit extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT); + super(true, { trigger: MoveEffectTrigger.HIT }); } /** @@ -1507,7 +1722,7 @@ export class SacrificialAttrOnHit extends MoveEffectAttr { return true; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { if (user.isBoss()) { return -20; } @@ -1523,7 +1738,7 @@ export class SacrificialAttrOnHit extends MoveEffectAttr { */ export class HalfSacrificialAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.POST_TARGET); + super(true, { trigger: MoveEffectTrigger.POST_TARGET }); } /** @@ -1544,12 +1759,12 @@ export class HalfSacrificialAttr extends MoveEffectAttr { applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); if (!cancelled.value) { user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / 2), HitResult.OTHER, false, true, true); - user.scene.queueMessage(i18next.t("moveTriggers:cutHpPowerUpMove", { pokemonName: getPokemonNameWithAffix(user) })); // Queue recoil message + globalScene.queueMessage(i18next.t("moveTriggers:cutHpPowerUpMove", { pokemonName: getPokemonNameWithAffix(user) })); // Queue recoil message } return true; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { if (user.isBoss()) { return -10; } @@ -1566,11 +1781,14 @@ export class HalfSacrificialAttr extends MoveEffectAttr { export class AddSubstituteAttr extends MoveEffectAttr { /** The ratio of the user's max HP that is required to apply this effect */ private hpCost: number; + /** Whether the damage taken should be rounded up (Shed Tail rounds up) */ + private roundUp: boolean; - constructor(hpCost: number = 0.25) { + constructor(hpCost: number, roundUp: boolean) { super(true); this.hpCost = hpCost; + this.roundUp = roundUp; } /** @@ -1586,7 +1804,8 @@ export class AddSubstituteAttr extends MoveEffectAttr { return false; } - user.damageAndUpdate(Math.floor(user.getMaxHp() * this.hpCost), HitResult.OTHER, false, true, true); + const damageTaken = this.roundUp ? Math.ceil(user.getMaxHp() * this.hpCost) : Math.floor(user.getMaxHp() * this.hpCost); + user.damageAndUpdate(damageTaken, HitResult.OTHER, false, true, true); user.addTag(BattlerTagType.SUBSTITUTE, 0, move.id, user.id); return true; } @@ -1599,28 +1818,23 @@ export class AddSubstituteAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > Math.floor(user.getMaxHp() * this.hpCost) && user.getMaxHp() > 1; + return (user, target, move) => !user.getTag(SubstituteTag) && user.hp > (this.roundUp ? Math.ceil(user.getMaxHp() * this.hpCost) : Math.floor(user.getMaxHp() * this.hpCost)) && user.getMaxHp() > 1; } - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + /** + * Get the substitute-specific failure message if one should be displayed. + * @param user The pokemon using the move. + * @returns The substitute-specific failure message if the conditions apply, otherwise `undefined` + */ + getFailedText(user: Pokemon, _target: Pokemon, _move: Move): string | undefined { if (user.getTag(SubstituteTag)) { return i18next.t("moveTriggers:substituteOnOverlap", { pokemonName: getPokemonNameWithAffix(user) }); } else if (user.hp <= Math.floor(user.getMaxHp() / 4) || user.getMaxHp() === 1) { return i18next.t("moveTriggers:substituteNotEnoughHp"); - } else { - return i18next.t("battle:attackFailed"); } } } -export enum MultiHitType { - _2, - _2_TO_5, - _3, - _10, - BEAT_UP, -} - /** * Heals the user or target by {@linkcode healRatio} depending on the value of {@linkcode selfTarget} * @extends MoveEffectAttr @@ -1649,11 +1863,11 @@ export class HealAttr extends MoveEffectAttr { * This heals the target and shows the appropriate message. */ addHealPhase(target: Pokemon, healRatio: number) { - target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), + globalScene.unshiftPhase(new PokemonHealPhase(target.getBattlerIndex(), Utils.toDmgValue(target.getMaxHp() * healRatio), i18next.t("moveTriggers:healHp", { pokemonName: getPokemonNameWithAffix(target) }), true, !this.showAnim)); } - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { const score = ((1 - (this.selfTarget ? user : target).getHpRatio()) * 20) - this.healRatio * 10; return Math.round(score / (1 - this.healRatio / 2)); } @@ -1689,11 +1903,11 @@ export class PartyStatusCureAttr extends MoveEffectAttr { if (!this.canApply(user, target, move, args)) { return false; } - const partyPokemon = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); + const partyPokemon = user.isPlayer() ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); partyPokemon.forEach(p => this.cureStatus(p, user.id)); if (this.message) { - user.scene.queueMessage(this.message); + globalScene.queueMessage(this.message); } return true; @@ -1712,7 +1926,7 @@ export class PartyStatusCureAttr extends MoveEffectAttr { pokemon.resetStatus(); pokemon.updateInfo(); } else { - pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, pokemon.getPassiveAbility()?.id === this.abilityCondition)); + globalScene.unshiftPhase(new ShowAbilityPhase(pokemon.id, pokemon.getPassiveAbility()?.id === this.abilityCondition)); } } } @@ -1729,7 +1943,7 @@ export class FlameBurstAttr extends MoveEffectAttr { * @param args - n/a * @returns A boolean indicating whether the effect was successfully applied. */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const targetAlly = target.getAlly(); const cancelled = new Utils.BooleanHolder(false); @@ -1737,7 +1951,7 @@ export class FlameBurstAttr extends MoveEffectAttr { applyAbAttrs(BlockNonDirectDamageAbAttr, targetAlly, cancelled); } - if (cancelled.value || !targetAlly) { + if (cancelled.value || !targetAlly || targetAlly.switchOutStatus) { return false; } @@ -1745,14 +1959,20 @@ export class FlameBurstAttr extends MoveEffectAttr { return true; } - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return target.getAlly() ? -5 : 0; } } export class SacrificialFullRestoreAttr extends SacrificialAttr { - constructor() { + protected restorePP: boolean; + protected moveMessage: string; + + constructor(restorePP: boolean, moveMessage: string) { super(); + + this.restorePP = restorePP; + this.moveMessage = moveMessage; } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -1761,20 +1981,31 @@ export class SacrificialFullRestoreAttr extends SacrificialAttr { } // We don't know which party member will be chosen, so pick the highest max HP in the party - const maxPartyMemberHp = user.scene.getParty().map(p => p.getMaxHp()).reduce((maxHp: integer, hp: integer) => Math.max(hp, maxHp), 0); + const party = user.isPlayer() ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); + const maxPartyMemberHp = party.map(p => p.getMaxHp()).reduce((maxHp: number, hp: number) => Math.max(hp, maxHp), 0); - user.scene.pushPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), - maxPartyMemberHp, i18next.t("moveTriggers:sacrificialFullRestore", { pokemonName: getPokemonNameWithAffix(user) }), true, false, false, true), true); + globalScene.pushPhase( + new PokemonHealPhase( + user.getBattlerIndex(), + maxPartyMemberHp, + i18next.t(this.moveMessage, { pokemonName: getPokemonNameWithAffix(user) }), + true, + false, + false, + true, + false, + this.restorePP), + true); return true; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return -20; } getCondition(): MoveConditionFunc { - return (user, target, move) => user.scene.getParty().filter(p => p.isActive()).length > user.scene.currentBattle.getBattlerCount(); + return (user, _target, _move) => globalScene.getPlayerParty().filter(p => p.isActive()).length > globalScene.currentBattle.getBattlerCount(); } } @@ -1803,7 +2034,7 @@ export class IgnoreWeatherTypeDebuffAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const weatherModifier = args[0] as Utils.NumberHolder; //If the type-based attack power modifier due to weather (e.g. Water moves in Sun) is below 1, set it to 1 - if (user.scene.arena.weather?.weatherType === this.weather) { + if (globalScene.arena.weather?.weatherType === this.weather) { weatherModifier.value = Math.max(weatherModifier.value, 1); } return true; @@ -1817,8 +2048,8 @@ export abstract class WeatherHealAttr extends HealAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { let healRatio = 0.5; - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { - const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; + if (!globalScene.arena.weather?.isEffectSuppressed()) { + const weatherType = globalScene.arena.weather?.weatherType || WeatherType.NONE; healRatio = this.getWeatherHealRatio(weatherType); } this.addHealPhase(user, healRatio); @@ -1927,7 +2158,7 @@ export class HitHealAttr extends MoveEffectAttr { private healStat: EffectiveStat | null; constructor(healRatio?: number | null, healStat?: EffectiveStat) { - super(true, MoveEffectTrigger.HIT); + super(true, { trigger: MoveEffectTrigger.HIT }); this.healRatio = healRatio ?? 0.5; this.healStat = healStat ?? null; @@ -1952,7 +2183,7 @@ export class HitHealAttr extends MoveEffectAttr { message = i18next.t("battle:drainMessage", { pokemonName: getPokemonNameWithAffix(target) }); } else { // Default healing formula used by draining moves like Absorb, Draining Kiss, Bitter Blade, etc. - healAmount = Utils.toDmgValue(user.turnData.currDamageDealt * this.healRatio); + healAmount = Utils.toDmgValue(user.turnData.singleHitDamageDealt * this.healRatio); message = i18next.t("battle:regainHealth", { pokemonName: getPokemonNameWithAffix(user) }); } if (reverseDrain) { @@ -1965,7 +2196,7 @@ export class HitHealAttr extends MoveEffectAttr { message = ""; } } - user.scene.unshiftPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), healAmount, message, false, true)); + globalScene.unshiftPhase(new PokemonHealPhase(user.getBattlerIndex(), healAmount, message, false, true)); return true; } @@ -1976,7 +2207,7 @@ export class HitHealAttr extends MoveEffectAttr { * @param move {@linkcode Move} being used * @returns an integer. Higher means enemy is more likely to use that move. */ - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { if (this.healStat) { const healAmount = target.getEffectiveStat(this.healStat); return Math.floor(Math.max(0, (Math.min(1, (healAmount + user.hp) / user.getMaxHp() - 0.33))) / user.getHpRatio()); @@ -1996,7 +2227,7 @@ export class IncrementMovePriorityAttr extends MoveAttr { /** The condition for a move's priority being incremented */ private moveIncrementFunc: (pokemon: Pokemon, target:Pokemon, move: Move) => boolean; /** The amount to increment priority by, if condition passes. */ - private increaseAmount: integer; + private increaseAmount: number; constructor(moveIncrementFunc: (pokemon: Pokemon, target:Pokemon, move: Move) => boolean, increaseAmount = 1) { super(); @@ -2010,7 +2241,7 @@ export class IncrementMovePriorityAttr extends MoveAttr { * @param user {@linkcode Pokemon} using this move * @param target {@linkcode Pokemon} target of this move * @param move {@linkcode Move} being used - * @param args [0] {@linkcode Utils.IntegerHolder} for move priority. + * @param args [0] {@linkcode Utils.NumberHolder} for move priority. * @returns true if function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -2018,7 +2249,7 @@ export class IncrementMovePriorityAttr extends MoveAttr { return false; } - (args[0] as Utils.IntegerHolder).value += this.increaseAmount; + (args[0] as Utils.NumberHolder).value += this.increaseAmount; return true; } } @@ -2056,7 +2287,7 @@ export class MultiHitAttr extends MoveAttr { * @param user {@linkcode Pokemon} that used the attack * @param target {@linkcode Pokemon} targeted by the attack * @param move {@linkcode Move} being used - * @param args [0] {@linkcode Utils.IntegerHolder} storing the hit count of the attack + * @param args [0] {@linkcode Utils.NumberHolder} storing the hit count of the attack * @returns True */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -2080,18 +2311,18 @@ export class MultiHitAttr extends MoveAttr { * @param target {@linkcode Pokemon} targeted by the attack * @returns The number of hits this attack should deal */ - getHitCount(user: Pokemon, target: Pokemon): integer { + getHitCount(user: Pokemon, target: Pokemon): number { switch (this.multiHitType) { case MultiHitType._2_TO_5: { - const rand = user.randSeedInt(16); - const hitValue = new Utils.IntegerHolder(rand); + const rand = user.randSeedInt(20); + const hitValue = new Utils.NumberHolder(rand); applyAbAttrs(MaxMultiHitAbAttr, user, null, false, hitValue); - if (hitValue.value >= 10) { + if (hitValue.value >= 13) { return 2; - } else if (hitValue.value >= 4) { + } else if (hitValue.value >= 6) { return 3; - } else if (hitValue.value >= 2) { + } else if (hitValue.value >= 3) { return 4; } else { return 5; @@ -2104,13 +2335,53 @@ export class MultiHitAttr extends MoveAttr { case MultiHitType._10: return 10; case MultiHitType.BEAT_UP: - const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); + const party = user.isPlayer() ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); // No status means the ally pokemon can contribute to Beat Up return party.reduce((total, pokemon) => { return total + (pokemon.id === user.id ? 1 : pokemon?.status && pokemon.status.effect !== StatusEffect.NONE ? 0 : 1); }, 0); } } + + /** + * Calculate the expected number of hits given this attribute's {@linkcode MultiHitType}, + * the move's accuracy, and a number of situational parameters. + * + * @param move - The move that this attribtue is applied to + * @param partySize - The size of the user's party, used for {@linkcode Moves.BEAT_UP | Beat Up} (default: `1`) + * @param maxMultiHit - Whether the move should always hit the maximum number of times, e.g. due to {@linkcode Abilities.SKILL_LINK | Skill Link} (default: `false`) + * @param ignoreAcc - `true` if the move should ignore accuracy checks, e.g. due to {@linkcode Abilities.NO_GUARD | No Guard} (default: `false`) + */ + calculateExpectedHitCount(move: Move, { ignoreAcc = false, maxMultiHit = false, partySize = 1 }: {ignoreAcc?: boolean, maxMultiHit?: boolean, partySize?: number} = {}): number { + let expectedHits: number; + switch (this.multiHitType) { + case MultiHitType._2_TO_5: + expectedHits = maxMultiHit ? 5 : 3.1; + break; + case MultiHitType._2: + expectedHits = 2; + break; + case MultiHitType._3: + expectedHits = 3; + break; + case MultiHitType._10: + expectedHits = 10; + break; + case MultiHitType.BEAT_UP: + // Estimate that half of the party can contribute to beat up. + expectedHits = Math.max(1, partySize / 2); + break; + } + if (ignoreAcc || move.accuracy === -1) { + return expectedHits; + } + const acc = move.accuracy / 100; + if (move.hasFlag(MoveFlags.CHECK_ALL_HITS) && !maxMultiHit) { + // N.B. No moves should be the _2_TO_5 variant and have the CHECK_ALL_HITS flag. + return acc * (1 - Math.pow(acc, expectedHits)) / (1 - acc); + } + return expectedHits *= acc; + } } export class ChangeMultiHitTypeAttr extends MoveAttr { @@ -2123,7 +2394,7 @@ export class ChangeMultiHitTypeAttr extends MoveAttr { export class WaterShurikenMultiHitTypeAttr extends ChangeMultiHitTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (user.species.speciesId === Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex === 2) { - (args[0] as Utils.IntegerHolder).value = MultiHitType._3; + (args[0] as Utils.NumberHolder).value = MultiHitType._3; return true; } return false; @@ -2136,7 +2407,7 @@ export class StatusEffectAttr extends MoveEffectAttr { public overrideStatus: boolean = false; constructor(effect: StatusEffect, selfTarget?: boolean, turnsRemaining?: number, overrideStatus: boolean = false) { - super(selfTarget, MoveEffectTrigger.HIT); + super(selfTarget, { trigger: MoveEffectTrigger.HIT }); this.effect = effect; this.turnsRemaining = turnsRemaining; @@ -2162,7 +2433,7 @@ export class StatusEffectAttr extends MoveEffectAttr { if (user !== target && target.isSafeguarded(user)) { if (move.category === MoveCategory.STATUS) { - user.scene.queueMessage(i18next.t("moveTriggers:safeguard", { targetName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:safeguard", { targetName: getPokemonNameWithAffix(target) })); } return false; } @@ -2177,7 +2448,10 @@ export class StatusEffectAttr extends MoveEffectAttr { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { const moveChance = this.getMoveChance(user, target, move, this.selfTarget, false); - return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(moveChance * -0.1) : 0; + const score = (moveChance < 0) ? -10 : Math.floor(moveChance * -0.1); + const pokemon = this.selfTarget ? user : target; + + return !pokemon.status && pokemon.canSetStatus(this.effect, true, false, user) ? score : 0; } } @@ -2197,38 +2471,43 @@ export class MultiStatusEffectAttr extends StatusEffectAttr { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { const moveChance = this.getMoveChance(user, target, move, this.selfTarget, false); - return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(moveChance * -0.1) : 0; + const score = (moveChance < 0) ? -10 : Math.floor(moveChance * -0.1); + const pokemon = this.selfTarget ? user : target; + + return !pokemon.status && pokemon.canSetStatus(this.effect, true, false, user) ? score : 0; } } export class PsychoShiftEffectAttr extends MoveEffectAttr { constructor() { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + /** + * Applies the effect of Psycho Shift to its target + * Psycho Shift takes the user's status effect and passes it onto the target. The user is then healed after the move has been successfully executed. + * @returns `true` if Psycho Shift's effect is able to be applied to the target + */ + apply(user: Pokemon, target: Pokemon, _move: Move, _args: any[]): boolean { const statusToApply: StatusEffect | undefined = user.status?.effect ?? (user.hasAbility(Abilities.COMATOSE) ? StatusEffect.SLEEP : undefined); if (target.status) { return false; } else { const canSetStatus = target.canSetStatus(statusToApply, true, false, user); + const trySetStatus = canSetStatus ? target.trySetStatus(statusToApply, true, user) : false; - if (canSetStatus) { - if (user.status) { - user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user))); - } - user.resetStatus(); - user.updateInfo(); - target.trySetStatus(statusToApply, true, user); + if (trySetStatus && user.status) { + // PsychoShiftTag is added to the user if move succeeds so that the user is healed of its status effect after its move + user.addTag(BattlerTagType.PSYCHO_SHIFT); } - return canSetStatus; + return trySetStatus; } } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(user.status?.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0; + return !target.status && target.canSetStatus(user.status?.effect, true, false, user) ? -10 : 0; } } /** @@ -2240,40 +2519,35 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { private chance: number; constructor(chance: number) { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); this.chance = chance; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (move.hitsSubstitute(user, target)) { - return resolve(false); - } - const rand = Phaser.Math.RND.realInRange(0, 1); - if (rand >= this.chance) { - return resolve(false); - } - const heldItems = this.getTargetHeldItems(target).filter(i => i.isTransferable); - if (heldItems.length) { - const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; - const highestItemTier = heldItems.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is the bang after tier correct? - const tierHeldItems = heldItems.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; - user.scene.tryTransferHeldItemModifier(stolenItem, user, false).then(success => { - if (success) { - user.scene.queueMessage(i18next.t("moveTriggers:stoleItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name })); - } - resolve(success); - }); - return; - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (move.hitsSubstitute(user, target)) { + return false; + } - resolve(false); - }); + const rand = Phaser.Math.RND.realInRange(0, 1); + if (rand >= this.chance) { + return false; + } + const heldItems = this.getTargetHeldItems(target).filter((i) => i.isTransferable); + if (heldItems.length) { + const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; + const highestItemTier = heldItems.map((m) => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is the bang after tier correct? + const tierHeldItems = heldItems.filter((m) => m.type.getOrInferTier(poolType) === highestItemTier); + const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; + if (globalScene.tryTransferHeldItemModifier(stolenItem, user, false)) { + globalScene.queueMessage(i18next.t("moveTriggers:stoleItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: stolenItem.type.name })); + return true; + } + } + return false; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { - return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + return globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } @@ -2301,7 +2575,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { private berriesOnly: boolean; constructor(berriesOnly: boolean) { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); this.berriesOnly = berriesOnly; } @@ -2340,13 +2614,14 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { const removedItem = heldItems[user.randSeedInt(heldItems.length)]; // Decrease item amount and update icon - !--removedItem.stackCount; - target.scene.updateModifiers(target.isPlayer()); + target.loseHeldItem(removedItem); + globalScene.updateModifiers(target.isPlayer()); + if (this.berriesOnly) { - user.scene.queueMessage(i18next.t("moveTriggers:incineratedItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name })); + globalScene.queueMessage(i18next.t("moveTriggers:incineratedItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name })); } else { - user.scene.queueMessage(i18next.t("moveTriggers:knockedOffItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name })); + globalScene.queueMessage(i18next.t("moveTriggers:knockedOffItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name })); } } @@ -2354,7 +2629,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { - return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + return globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } @@ -2375,7 +2650,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { export class EatBerryAttr extends MoveEffectAttr { protected chosenBerry: BerryModifier | undefined; constructor() { - super(true, MoveEffectTrigger.HIT); + super(true, { trigger: MoveEffectTrigger.HIT }); } /** * Causes the target to eat a berry. @@ -2396,7 +2671,7 @@ export class EatBerryAttr extends MoveEffectAttr { } this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; const preserve = new Utils.BooleanHolder(false); - target.scene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); // check for berry pouch preservation + globalScene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); // check for berry pouch preservation if (!preserve.value) { this.reduceBerryModifier(target); } @@ -2405,21 +2680,19 @@ export class EatBerryAttr extends MoveEffectAttr { } getTargetHeldBerries(target: Pokemon): BerryModifier[] { - return target.scene.findModifiers(m => m instanceof BerryModifier + return globalScene.findModifiers(m => m instanceof BerryModifier && (m as BerryModifier).pokemonId === target.id, target.isPlayer()) as BerryModifier[]; } reduceBerryModifier(target: Pokemon) { - if (this.chosenBerry?.stackCount === 1) { - target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); - } else if (this.chosenBerry !== undefined && this.chosenBerry.stackCount > 1) { - this.chosenBerry.stackCount--; + if (this.chosenBerry) { + target.loseHeldItem(this.chosenBerry); } - target.scene.updateModifiers(target.isPlayer()); + globalScene.updateModifiers(target.isPlayer()); } - eatBerry(consumer: Pokemon) { - getBerryEffectFunc(this.chosenBerry!.berryType)(consumer); // consumer eats the berry + eatBerry(consumer: Pokemon, berryOwner?: Pokemon) { + getBerryEffectFunc(this.chosenBerry!.berryType)(consumer, berryOwner); // consumer eats the berry applyAbAttrs(HealFromBerryUseAbAttr, consumer, new Utils.BooleanHolder(false)); } } @@ -2456,10 +2729,11 @@ export class StealEatBerryAttr extends EatBerryAttr { } // if the target has berries, pick a random berry and steal it this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; + applyPostItemLostAbAttrs(PostItemLostAbAttr, target, false); const message = i18next.t("battle:stealEatBerry", { pokemonName: user.name, targetName: target.name, berryName: this.chosenBerry.type.name }); - user.scene.queueMessage(message); + globalScene.queueMessage(message); this.reduceBerryModifier(target); - this.eatBerry(user); + this.eatBerry(user, target); return true; } } @@ -2475,12 +2749,11 @@ export class HealStatusEffectAttr extends MoveEffectAttr { /** * @param selfTarget - Whether this move targets the user - * @param ...effects - List of status effects to cure + * @param effects - status effect or list of status effects to cure */ - constructor(selfTarget: boolean, ...effects: StatusEffect[]) { - super(selfTarget, MoveEffectTrigger.POST_APPLY, false, true); - - this.effects = effects; + constructor(selfTarget: boolean, effects: StatusEffect | StatusEffect[]) { + super(selfTarget, { lastHitOnly: true }); + this.effects = [ effects ].flat(1); } /** @@ -2506,7 +2779,7 @@ export class HealStatusEffectAttr extends MoveEffectAttr { const pokemon = this.selfTarget ? user : target; if (pokemon.status && this.effects.includes(pokemon.status.effect)) { - pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + globalScene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); pokemon.resetStatus(); pokemon.updateInfo(); @@ -2520,7 +2793,7 @@ export class HealStatusEffectAttr extends MoveEffectAttr { return this.effects.includes(effect); } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return user.status ? 10 : 0; } } @@ -2541,7 +2814,7 @@ export class BypassSleepAttr extends MoveAttr { * @param target * @param move */ - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return user.status && user.status.effect === StatusEffect.SLEEP ? 200 : -10; } } @@ -2577,11 +2850,11 @@ export class WeatherChangeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - return user.scene.arena.trySetWeather(this.weatherType, true); + return globalScene.arena.trySetWeather(this.weatherType, true); } getCondition(): MoveConditionFunc { - return (user, target, move) => !user.scene.arena.weather || (user.scene.arena.weather.weatherType !== this.weatherType && !user.scene.arena.weather.isImmutable()); + return (user, target, move) => !globalScene.arena.weather || (globalScene.arena.weather.weatherType !== this.weatherType && !globalScene.arena.weather.isImmutable()); } } @@ -2595,8 +2868,8 @@ export class ClearWeatherAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.scene.arena.weather?.weatherType === this.weatherType) { - return user.scene.arena.trySetWeather(WeatherType.NONE, true); + if (globalScene.arena.weather?.weatherType === this.weatherType) { + return globalScene.arena.trySetWeather(WeatherType.NONE, true); } return false; @@ -2613,16 +2886,16 @@ export class TerrainChangeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - return user.scene.arena.trySetTerrain(this.terrainType, true, true); + return globalScene.arena.trySetTerrain(this.terrainType, true, true); } getCondition(): MoveConditionFunc { - return (user, target, move) => !user.scene.arena.terrain || (user.scene.arena.terrain.terrainType !== this.terrainType); + return (user, target, move) => !globalScene.arena.terrain || (globalScene.arena.terrain.terrainType !== this.terrainType); } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { // TODO: Expand on this - return user.scene.arena.terrain ? 0 : 6; + return globalScene.arena.terrain ? 0 : 6; } } @@ -2632,7 +2905,7 @@ export class ClearTerrainAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - return user.scene.arena.trySetTerrain(TerrainType.NONE, true, true); + return globalScene.arena.trySetTerrain(TerrainType.NONE, true, true); } } @@ -2701,12 +2974,12 @@ export class InstantChargeAttr extends MoveAttr { export class WeatherInstantChargeAttr extends InstantChargeAttr { constructor(weatherTypes: WeatherType[]) { super((user, move) => { - const currentWeather = user.scene.arena.weather; + const currentWeather = globalScene.arena.weather; if (Utils.isNullOrUndefined(currentWeather?.weatherType)) { return false; } else { - return !currentWeather?.isEffectSuppressed(user.scene) + return !currentWeather?.isEffectSuppressed() && weatherTypes.includes(currentWeather?.weatherType); } }); @@ -2714,13 +2987,19 @@ export class WeatherInstantChargeAttr extends InstantChargeAttr { } export class OverrideMoveEffectAttr extends MoveAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - //const overridden = args[0] as Utils.BooleanHolder; - //const virtual = arg[1] as boolean; + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { return true; } } +/** + * Attack Move that doesn't hit the turn it is played and doesn't allow for multiple + * uses on the same target. Examples are Future Sight or Doom Desire. + * @extends OverrideMoveEffectAttr + * @param tagType The {@linkcode ArenaTagType} that will be placed on the field when the move is used + * @param chargeAnim The {@linkcode ChargeAnim | Charging Animation} used for the move + * @param chargeText The text to display when the move is used + */ export class DelayedAttackAttr extends OverrideMoveEffectAttr { public tagType: ArenaTagType; public chargeAnim: ChargeAnim; @@ -2734,21 +3013,27 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr { this.chargeText = chargeText; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (args.length < 2 || !args[1]) { - new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, false, () => { - (args[0] as Utils.BooleanHolder).value = true; - user.scene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); - user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); - user.scene.arena.addTag(this.tagType, 3, move.id, user.id, ArenaTagSide.BOTH, false, target.getBattlerIndex()); + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + // Edge case for the move applied on a pokemon that has fainted + if (!target) { + return true; + } - resolve(true); - }); - } else { - user.scene.ui.showText(i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(user.scene.getPokemonById(target.id) ?? undefined), moveName: move.name }), null, () => resolve(true)); - } - }); + const overridden = args[0] as Utils.BooleanHolder; + const virtual = args[1] as boolean; + + if (!virtual) { + overridden.value = true; + globalScene.unshiftPhase(new MoveAnimPhase(new MoveChargeAnim(this.chargeAnim, move.id, user))); + globalScene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); + user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); + const side = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + globalScene.arena.addTag(this.tagType, 3, move.id, user.id, side, false, target.getBattlerIndex()); + } else { + globalScene.queueMessage(i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(target.id) ?? undefined), moveName: move.name })); + } + + return true; } } @@ -2775,29 +3060,29 @@ export class AwaitCombinedPledgeAttr extends OverrideMoveEffectAttr { override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (user.turnData.combiningPledge) { // "The two moves have become one!\nIt's a combined move!" - user.scene.queueMessage(i18next.t("moveTriggers:combiningPledge")); + globalScene.queueMessage(i18next.t("moveTriggers:combiningPledge")); return false; } const overridden = args[0] as Utils.BooleanHolder; - const allyMovePhase = user.scene.findPhase((phase) => phase instanceof MovePhase && phase.pokemon.isPlayer() === user.isPlayer()); + const allyMovePhase = globalScene.findPhase((phase) => phase instanceof MovePhase && phase.pokemon.isPlayer() === user.isPlayer()); if (allyMovePhase) { const allyMove = allyMovePhase.move.getMove(); if (allyMove !== move && allyMove.hasAttr(AwaitCombinedPledgeAttr)) { [ user, allyMovePhase.pokemon ].forEach((p) => p.turnData.combiningPledge = move.id); // "{userPokemonName} is waiting for {allyPokemonName}'s move..." - user.scene.queueMessage(i18next.t("moveTriggers:awaitingPledge", { + globalScene.queueMessage(i18next.t("moveTriggers:awaitingPledge", { userPokemonName: getPokemonNameWithAffix(user), allyPokemonName: getPokemonNameWithAffix(allyMovePhase.pokemon) })); // Move the ally's MovePhase (if needed) so that the ally moves next - const allyMovePhaseIndex = user.scene.phaseQueue.indexOf(allyMovePhase); - const firstMovePhaseIndex = user.scene.phaseQueue.findIndex((phase) => phase instanceof MovePhase); + const allyMovePhaseIndex = globalScene.phaseQueue.indexOf(allyMovePhase); + const firstMovePhaseIndex = globalScene.phaseQueue.findIndex((phase) => phase instanceof MovePhase); if (allyMovePhaseIndex !== firstMovePhaseIndex) { - user.scene.prependToPhase(user.scene.phaseQueue.splice(allyMovePhaseIndex, 1)[0], MovePhase); + globalScene.prependToPhase(globalScene.phaseQueue.splice(allyMovePhaseIndex, 1)[0], MovePhase); } overridden.value = true; @@ -2808,35 +3093,67 @@ export class AwaitCombinedPledgeAttr extends OverrideMoveEffectAttr { } } +/** + * Set of optional parameters that may be applied to stat stage changing effects + * @extends MoveEffectAttrOptions + * @see {@linkcode StatStageChangeAttr} + */ +interface StatStageChangeAttrOptions extends MoveEffectAttrOptions { + /** If defined, needs to be met in order for the stat change to apply */ + condition?: MoveConditionFunc, + /** `true` to display a message */ + showMessage?: boolean +} + /** * Attribute used for moves that change stat stages * * @param stats {@linkcode BattleStat} Array of stat(s) to change * @param stages How many stages to change the stat(s) by, [-6, 6] * @param selfTarget `true` if the move is self-targetting - * @param condition {@linkcode MoveConditionFunc} Optional condition to be checked in order to apply the changes - * @param showMessage `true` to display a message; default `true` - * @param firstHitOnly `true` if only the first hit of a multi hit move should cause a stat stage change; default `false` - * @param moveEffectTrigger {@linkcode MoveEffectTrigger} When the stat change should trigger; default {@linkcode MoveEffectTrigger.HIT} - * @param firstTargetOnly `true` if a move that hits multiple pokemon should only trigger the stat change if it hits at least one pokemon, rather than once per hit pokemon; default `false` - * @param lastHitOnly `true` if the effect should only apply after the last hit of a multi hit move; default `false` - * @param effectChanceOverride Will override the move's normal secondary effect chance if specified + * @param options {@linkcode StatStageChangeAttrOptions} Container for any optional parameters for this attribute. * * @extends MoveEffectAttr * @see {@linkcode apply} */ export class StatStageChangeAttr extends MoveEffectAttr { public stats: BattleStat[]; - public stages: integer; - private condition?: MoveConditionFunc | null; - private showMessage: boolean; + public stages: number; + /** + * Container for optional parameters to this attribute. + * @see {@linkcode StatStageChangeAttrOptions} for available optional params + */ + protected override options?: StatStageChangeAttrOptions; - constructor(stats: BattleStat[], stages: integer, selfTarget?: boolean, condition?: MoveConditionFunc | null, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT, firstTargetOnly: boolean = false, lastHitOnly: boolean = false, effectChanceOverride?: number) { - super(selfTarget, moveEffectTrigger, firstHitOnly, lastHitOnly, firstTargetOnly, effectChanceOverride); + constructor(stats: BattleStat[], stages: number, selfTarget?: boolean, options?: StatStageChangeAttrOptions) { + super(selfTarget, options); this.stats = stats; this.stages = stages; - this.condition = condition; - this.showMessage = showMessage; + this.options = options; + } + + /** + * The condition required for the stat stage change to apply. + * Defaults to `null` (i.e. no condition required). + */ + private get condition () { + return this.options?.condition ?? null; + } + + /** + * `true` to display a message for the stat change. + * @default true + */ + private get showMessage () { + return this.options?.showMessage ?? true; + } + + /** + * Indicates when the stat change should trigger + * @default MoveEffectTrigger.HIT + */ + public override get trigger () { + return this.options?.trigger ?? MoveEffectTrigger.HIT; } /** @@ -2847,7 +3164,7 @@ export class StatStageChangeAttr extends MoveEffectAttr { * @param args unused * @returns whether stat stages were changed */ - apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { if (!super.apply(user, target, move, args) || (this.condition && !this.condition(user, target, move))) { return false; } @@ -2859,18 +3176,18 @@ export class StatStageChangeAttr extends MoveEffectAttr { const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { const stages = this.getLevels(user); - user.scene.unshiftPhase(new StatStageChangePhase(user.scene, (this.selfTarget ? user : target).getBattlerIndex(), this.selfTarget, this.stats, stages, this.showMessage)); + globalScene.unshiftPhase(new StatStageChangePhase((this.selfTarget ? user : target).getBattlerIndex(), this.selfTarget, this.stats, stages, this.showMessage)); return true; } return false; } - getLevels(_user: Pokemon): integer { + getLevels(_user: Pokemon): number { return this.stages; } - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { let ret = 0; const moveLevels = this.getLevels(user); for (const stat of this.stats) { @@ -2921,38 +3238,22 @@ export class SecretPowerAttr extends MoveEffectAttr { super(false); } - /** - * Used to determine if the move should apply a secondary effect based on Secret Power's 30% chance - * @returns `true` if the move's secondary effect should apply - */ - override canApply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { - this.effectChanceOverride = move.chance; - const moveChance = this.getMoveChance(user, target, move, this.selfTarget); - if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { - return true; - } else { - return false; - } - } - /** * Used to apply the secondary effect to the target Pokemon * @returns `true` if a secondary effect is successfully applied */ - override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean | Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } let secondaryEffect: MoveEffectAttr; - const terrain = user.scene.arena.getTerrainType(); + const terrain = globalScene.arena.getTerrainType(); if (terrain !== TerrainType.NONE) { secondaryEffect = this.determineTerrainEffect(terrain); } else { - const biome = user.scene.arena.biomeType; + const biome = globalScene.arena.biomeType; secondaryEffect = this.determineBiomeEffect(biome); } - // effectChanceOverride used in the application of the actual secondary effect - secondaryEffect.effectChanceOverride = 100; return secondaryEffect.apply(user, target, move, []); } @@ -3096,11 +3397,11 @@ export class AcupressureStatStageChangeAttr extends MoveEffectAttr { super(); } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - const randStats = BATTLE_STATS.filter(s => target.getStatStage(s) < 6); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const randStats = BATTLE_STATS.filter((s) => target.getStatStage(s) < 6); if (randStats.length > 0) { const boostStat = [ randStats[user.randSeedInt(randStats.length)] ]; - user.scene.unshiftPhase(new StatStageChangePhase(user.scene, target.getBattlerIndex(), this.selfTarget, boostStat, 2)); + globalScene.unshiftPhase(new StatStageChangePhase(target.getBattlerIndex(), this.selfTarget, boostStat, 2)); return true; } return false; @@ -3113,8 +3414,8 @@ export class GrowthStatStageChangeAttr extends StatStageChangeAttr { } getLevels(user: Pokemon): number { - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { - const weatherType = user.scene.arena.weather?.weatherType; + if (!globalScene.arena.weather?.isEffectSuppressed()) { + const weatherType = globalScene.arena.weather?.weatherType; if (weatherType === WeatherType.SUNNY || weatherType === WeatherType.HARSH_SUN) { return this.stages + 1; } @@ -3124,27 +3425,24 @@ export class GrowthStatStageChangeAttr extends StatStageChangeAttr { } export class CutHpStatStageBoostAttr extends StatStageChangeAttr { - private cutRatio: integer; + private cutRatio: number; private messageCallback: ((user: Pokemon) => void) | undefined; - constructor(stat: BattleStat[], levels: integer, cutRatio: integer, messageCallback?: ((user: Pokemon) => void) | undefined) { - super(stat, levels, true, null, true); + constructor(stat: BattleStat[], levels: number, cutRatio: number, messageCallback?: ((user: Pokemon) => void) | undefined) { + super(stat, levels, true); this.cutRatio = cutRatio; this.messageCallback = messageCallback; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); - user.updateInfo().then(() => { - const ret = super.apply(user, target, move, args); - if (this.messageCallback) { - this.messageCallback(user); - } - resolve(ret); - }); - }); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); + user.updateInfo(); + const ret = super.apply(user, target, move, args); + if (this.messageCallback) { + this.messageCallback(user); + } + return ret; } getCondition(): MoveConditionFunc { @@ -3152,6 +3450,41 @@ export class CutHpStatStageBoostAttr extends StatStageChangeAttr { } } +/** + * Attribute implementing the stat boosting effect of {@link https://bulbapedia.bulbagarden.net/wiki/Order_Up_(move) | Order Up}. + * If the user has a Pokemon with {@link https://bulbapedia.bulbagarden.net/wiki/Commander_(Ability) | Commander} in their mouth, + * one of the user's stats are increased by 1 stage, depending on the "commanding" Pokemon's form. This effect does not respect + * effect chance, but Order Up itself may be boosted by Sheer Force. + */ +export class OrderUpStatBoostAttr extends MoveEffectAttr { + constructor() { + super(true, { trigger: MoveEffectTrigger.HIT }); + } + + override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { + const commandedTag = user.getTag(CommandedTag); + if (!commandedTag) { + return false; + } + + let increasedStat: EffectiveStat = Stat.ATK; + switch (commandedTag.tatsugiriFormKey) { + case "curly": + increasedStat = Stat.ATK; + break; + case "droopy": + increasedStat = Stat.DEF; + break; + case "stretchy": + increasedStat = Stat.SPD; + break; + } + + globalScene.unshiftPhase(new StatStageChangePhase(user.getBattlerIndex(), this.selfTarget, [ increasedStat ], 1)); + return true; + } +} + export class CopyStatsAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { @@ -3170,7 +3503,7 @@ export class CopyStatsAttr extends MoveEffectAttr { } target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(i18next.t("moveTriggers:copiedStatChanges", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:copiedStatChanges", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); return true; } @@ -3189,7 +3522,7 @@ export class InvertStatsAttr extends MoveEffectAttr { target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(i18next.t("moveTriggers:invertStats", { pokemonName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:invertStats", { pokemonName: getPokemonNameWithAffix(target) })); return true; } @@ -3201,28 +3534,27 @@ export class ResetStatsAttr extends MoveEffectAttr { super(); this.targetAllPokemon = targetAllPokemon; } - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - const promises: Promise[] = []; - if (this.targetAllPokemon) { // Target all pokemon on the field when Freezy Frost or Haze are used - const activePokemon = user.scene.getField(true); - activePokemon.forEach(p => promises.push(this.resetStats(p))); - target.scene.queueMessage(i18next.t("moveTriggers:statEliminated")); + + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (this.targetAllPokemon) { + // Target all pokemon on the field when Freezy Frost or Haze are used + const activePokemon = globalScene.getField(true); + activePokemon.forEach((p) => this.resetStats(p)); + globalScene.queueMessage(i18next.t("moveTriggers:statEliminated")); } else { // Affects only the single target when Clear Smog is used if (!move.hitsSubstitute(user, target)) { - promises.push(this.resetStats(target)); - target.scene.queueMessage(i18next.t("moveTriggers:resetStats", { pokemonName: getPokemonNameWithAffix(target) })); + this.resetStats(target); + globalScene.queueMessage(i18next.t("moveTriggers:resetStats", { pokemonName: getPokemonNameWithAffix(target) })); } } - - await Promise.all(promises); return true; } - async resetStats(pokemon: Pokemon): Promise { + private resetStats(pokemon: Pokemon): void { for (const s of BATTLE_STATS) { pokemon.setStatStage(s, 0); } - return pokemon.updateInfo(); + pokemon.updateInfo(); } } @@ -3263,9 +3595,9 @@ export class SwapStatStagesAttr extends MoveEffectAttr { user.updateInfo(); if (this.stats.length === 7) { - user.scene.queueMessage(i18next.t("moveTriggers:switchedStatChanges", { pokemonName: getPokemonNameWithAffix(user) })); + globalScene.queueMessage(i18next.t("moveTriggers:switchedStatChanges", { pokemonName: getPokemonNameWithAffix(user) })); } else if (this.stats.length === 2) { - user.scene.queueMessage(i18next.t("moveTriggers:switchedTwoStatChanges", { + globalScene.queueMessage(i18next.t("moveTriggers:switchedTwoStatChanges", { pokemonName: getPokemonNameWithAffix(user), firstStat: i18next.t(getStatKey(this.stats[0])), secondStat: i18next.t(getStatKey(this.stats[1])) @@ -3278,43 +3610,28 @@ export class SwapStatStagesAttr extends MoveEffectAttr { } export class HpSplitAttr extends MoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (!super.apply(user, target, move, args)) { - return resolve(false); - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } - const infoUpdates: Promise[] = []; - - const hpValue = Math.floor((target.hp + user.hp) / 2); - if (user.hp < hpValue) { - const healing = user.heal(hpValue - user.hp); + const hpValue = Math.floor((target.hp + user.hp) / 2); + [ user, target ].forEach((p) => { + if (p.hp < hpValue) { + const healing = p.heal(hpValue - p.hp); if (healing) { - user.scene.damageNumberHandler.add(user, healing, HitResult.HEAL); + globalScene.damageNumberHandler.add(p, healing, HitResult.HEAL); } - } else if (user.hp > hpValue) { - const damage = user.damage(user.hp - hpValue, true); + } else if (p.hp > hpValue) { + const damage = p.damage(p.hp - hpValue, true); if (damage) { - user.scene.damageNumberHandler.add(user, damage); + globalScene.damageNumberHandler.add(p, damage); } } - infoUpdates.push(user.updateInfo()); - - if (target.hp < hpValue) { - const healing = target.heal(hpValue - target.hp); - if (healing) { - user.scene.damageNumberHandler.add(user, healing, HitResult.HEAL); - } - } else if (target.hp > hpValue) { - const damage = target.damage(target.hp - hpValue, true); - if (damage) { - target.scene.damageNumberHandler.add(target, damage); - } - } - infoUpdates.push(target.updateInfo()); - - return Promise.all(infoUpdates).then(() => resolve(true)); + p.updateInfo(); }); + + return true; } } @@ -3391,7 +3708,7 @@ export class MovePowerMultiplierAttr extends VariablePowerAttr { * @returns The base power of the Beat Up hit. */ const beatUpFunc = (user: Pokemon, allyIndex: number): number => { - const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); + const party = user.isPlayer() ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); for (let i = allyIndex; i < party.length; i++) { const pokemon = party[i]; @@ -3419,7 +3736,7 @@ export class BeatUpAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); + const party = user.isPlayer() ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); const allyCount = party.filter(pokemon => { return pokemon.id === user.id || !pokemon.status?.effect; }).length; @@ -3431,19 +3748,19 @@ export class BeatUpAttr extends VariablePowerAttr { const doublePowerChanceMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { let message: string = ""; - user.scene.executeWithSeedOffset(() => { + globalScene.executeWithSeedOffset(() => { const rand = Utils.randSeedInt(100); if (rand < move.chance) { message = i18next.t("moveTriggers:goingAllOutForAttack", { pokemonName: getPokemonNameWithAffix(user) }); } - }, user.scene.currentBattle.turn << 6, user.scene.waveSeed); + }, globalScene.currentBattle.turn << 6, globalScene.waveSeed); return message; }; export class DoublePowerChanceAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - let rand: integer; - user.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100), user.scene.currentBattle.turn << 6, user.scene.waveSeed); + let rand: number; + globalScene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100), globalScene.currentBattle.turn << 6, globalScene.waveSeed); if (rand! < move.chance) { const power = args[0] as Utils.NumberHolder; power.value *= 2; @@ -3455,7 +3772,7 @@ export class DoublePowerChanceAttr extends VariablePowerAttr { } export abstract class ConsecutiveUsePowerMultiplierAttr extends MovePowerMultiplierAttr { - constructor(limit: integer, resetOnFail: boolean, resetOnLimit?: boolean, ...comboMoves: Moves[]) { + constructor(limit: number, resetOnFail: boolean, resetOnLimit?: boolean, ...comboMoves: Moves[]) { super((user: Pokemon, target: Pokemon, move: Move): number => { const moveHistory = user.getLastXMoves(limit + 1).slice(1); @@ -3476,7 +3793,7 @@ export abstract class ConsecutiveUsePowerMultiplierAttr extends MovePowerMultipl }); } - abstract getMultiplier(count: integer): number; + abstract getMultiplier(count: number): number; } export class ConsecutiveUseDoublePowerAttr extends ConsecutiveUsePowerMultiplierAttr { @@ -3677,8 +3994,8 @@ export class OpponentHighHpPowerAttr extends VariablePowerAttr { export class FirstAttackDoublePowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - console.log(target.getLastXMoves(1), target.scene.currentBattle.turn); - if (!target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn)) { + console.log(target.getLastXMoves(1), globalScene.currentBattle.turn); + if (!target.getLastXMoves(1).find(m => m.turn === globalScene.currentBattle.turn)) { (args[0] as Utils.NumberHolder).value *= 2; return true; } @@ -3701,7 +4018,7 @@ export class TurnDamagedDoublePowerAttr extends VariablePowerAttr { const magnitudeMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { let message: string; - user.scene.executeWithSeedOffset(() => { + globalScene.executeWithSeedOffset(() => { const magnitudeThresholds = [ 5, 15, 35, 65, 75, 95 ]; const rand = Utils.randSeedInt(100); @@ -3714,7 +4031,7 @@ const magnitudeMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { } message = i18next.t("moveTriggers:magnitudeMessage", { magnitude: m + 4 }); - }, user.scene.currentBattle.turn << 6, user.scene.waveSeed); + }, globalScene.currentBattle.turn << 6, globalScene.waveSeed); return message!; }; @@ -3725,9 +4042,9 @@ export class MagnitudePowerAttr extends VariablePowerAttr { const magnitudeThresholds = [ 5, 15, 35, 65, 75, 95 ]; const magnitudePowers = [ 10, 30, 50, 70, 90, 100, 110, 150 ]; - let rand: integer; + let rand: number; - user.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100), user.scene.currentBattle.turn << 6, user.scene.waveSeed); + globalScene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100), globalScene.currentBattle.turn << 6, globalScene.waveSeed); let m = 0; for (; m < magnitudeThresholds.length; m++) { @@ -3744,9 +4061,9 @@ export class MagnitudePowerAttr extends VariablePowerAttr { export class AntiSunlightPowerDecreaseAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { + if (!globalScene.arena.weather?.isEffectSuppressed()) { const power = args[0] as Utils.NumberHolder; - const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; + const weatherType = globalScene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { case WeatherType.RAIN: case WeatherType.SANDSTORM: @@ -3781,12 +4098,32 @@ export class FriendshipPowerAttr extends VariablePowerAttr { } } -export class HitCountPowerAttr extends VariablePowerAttr { +/** + * This Attribute calculates the current power of {@linkcode Moves.RAGE_FIST}. + * The counter for power calculation does not reset on every wave but on every new arena encounter + */ +export class RageFistPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.NumberHolder).value += Math.min(user.battleData.hitCount, 6) * 50; + const { hitCount, prevHitCount } = user.battleData; + const basePower: Utils.NumberHolder = args[0]; + + this.updateHitReceivedCount(user, hitCount, prevHitCount); + + basePower.value = 50 + (Math.min(user.customPokemonData.hitsRecCount, 6) * 50); return true; } + + /** + * Updates the number of hits the Pokemon has taken in battle + * @param user Pokemon calling Rage Fist + * @param hitCount The number of received hits this battle + * @param previousHitCount The number of received hits this battle since last time Rage Fist was used + */ + protected updateHitReceivedCount(user: Pokemon, hitCount: number, previousHitCount: number): void { + user.customPokemonData.hitsRecCount += (hitCount - previousHitCount); + user.battleData.prevHitCount = hitCount; + } } /** @@ -3862,7 +4199,7 @@ export class PresentPowerAttr extends VariablePowerAttr { } else if (80 < powerSeed && powerSeed <= 100) { // If this move is multi-hit, disable all other hits user.stopMultiHit(); - target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), + globalScene.unshiftPhase(new PokemonHealPhase(target.getBattlerIndex(), Utils.toDmgValue(target.getMaxHp() / 4), i18next.t("moveTriggers:regainedHealth", { pokemonName: getPokemonNameWithAffix(target) }), true)); } @@ -3873,7 +4210,7 @@ export class PresentPowerAttr extends VariablePowerAttr { export class WaterShurikenPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (user.species.speciesId === Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex === 2) { - (args[0] as Utils.IntegerHolder).value = 20; + (args[0] as Utils.NumberHolder).value = 20; return true; } return false; @@ -3895,7 +4232,7 @@ export class SpitUpPowerAttr extends VariablePowerAttr { const stockpilingTag = user.getTag(StockpilingTag); if (stockpilingTag && stockpilingTag.stockpiledCount > 0) { - const power = args[0] as Utils.IntegerHolder; + const power = args[0] as Utils.NumberHolder; power.value = this.multiplier * stockpilingTag.stockpiledCount; return true; } @@ -3947,9 +4284,9 @@ const hasStockpileStacksCondition: MoveConditionFunc = (user) => { */ export class MultiHitPowerIncrementAttr extends VariablePowerAttr { /** The max number of base power increments allowed for this move */ - private maxHits: integer; + private maxHits: number; - constructor(maxHits: integer) { + constructor(maxHits: number) { super(); this.maxHits = maxHits; @@ -4012,7 +4349,7 @@ export class LastMoveDoublePowerAttr extends VariablePowerAttr { pokemonActed.push(enemy); } - if (user.scene.currentBattle.double) { + if (globalScene.currentBattle.double) { const userAlly = user.getAlly(); const enemyAlly = enemy?.getAlly(); @@ -4081,13 +4418,130 @@ export class CombinedPledgeStabBoostAttr extends MoveAttr { } } +/** + * Variable Power attribute for {@link https://bulbapedia.bulbagarden.net/wiki/Round_(move) | Round}. + * Doubles power if another Pokemon has previously selected Round this turn. + * @extends VariablePowerAttr + */ +export class RoundPowerAttr extends VariablePowerAttr { + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const power = args[0]; + if (!(power instanceof Utils.NumberHolder)) { + return false; + } + + if (user.turnData?.joinedRound) { + power.value *= 2; + return true; + } + return false; + } +} + +/** + * Attribute for the "combo" effect of {@link https://bulbapedia.bulbagarden.net/wiki/Round_(move) | Round}. + * Preempts the next move in the turn order with the first instance of any Pokemon + * using Round. Also marks the Pokemon using the cued Round to double the move's power. + * @extends MoveEffectAttr + * @see {@linkcode RoundPowerAttr} + */ +export class CueNextRoundAttr extends MoveEffectAttr { + constructor() { + super(true, { lastHitOnly: true }); + } + + override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { + const nextRoundPhase = globalScene.findPhase(phase => + phase instanceof MovePhase && phase.move.moveId === Moves.ROUND + ); + + if (!nextRoundPhase) { + return false; + } + + // Update the phase queue so that the next Pokemon using Round moves next + const nextRoundIndex = globalScene.phaseQueue.indexOf(nextRoundPhase); + const nextMoveIndex = globalScene.phaseQueue.findIndex(phase => phase instanceof MovePhase); + if (nextRoundIndex !== nextMoveIndex) { + globalScene.prependToPhase(globalScene.phaseQueue.splice(nextRoundIndex, 1)[0], MovePhase); + } + + // Mark the corresponding Pokemon as having "joined the Round" (for doubling power later) + nextRoundPhase.pokemon.turnData.joinedRound = true; + return true; + } +} + +/** + * Attribute that changes stat stages before the damage is calculated + */ +export class StatChangeBeforeDmgCalcAttr extends MoveAttr { + /** + * Applies Stat Changes before damage is calculated + * + * @param user {@linkcode Pokemon} that called {@linkcode move} + * @param target {@linkcode Pokemon} that is the target of {@linkcode move} + * @param move {@linkcode Move} called by {@linkcode user} + * @param args N/A + * + * @returns true if stat stages where correctly applied + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + return false; + } +} + +/** + * Steals the postitive Stat stages of the target before damage calculation so stat changes + * apply to damage calculation (e.g. {@linkcode Moves.SPECTRAL_THIEF}) + * {@link https://bulbapedia.bulbagarden.net/wiki/Spectral_Thief_(move) | Spectral Thief} + */ +export class SpectralThiefAttr extends StatChangeBeforeDmgCalcAttr { + /** + * steals max amount of positive stats of the target while not exceeding the limit of max 6 stat stages + * + * @param user {@linkcode Pokemon} that called {@linkcode move} + * @param target {@linkcode Pokemon} that is the target of {@linkcode move} + * @param move {@linkcode Move} called by {@linkcode user} + * @param args N/A + * + * @returns true if stat stages where correctly stolen + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + /** + * Copy all positive stat stages to user and reduce copied stat stages on target. + */ + for (const s of BATTLE_STATS) { + const statStageValueTarget = target.getStatStage(s); + const statStageValueUser = user.getStatStage(s); + + if (statStageValueTarget > 0) { + /** + * Only value of up to 6 can be stolen (stat stages don't exceed 6) + */ + const availableToSteal = Math.min(statStageValueTarget, 6 - statStageValueUser); + + globalScene.unshiftPhase(new StatStageChangePhase(user.getBattlerIndex(), this.selfTarget, [ s ], availableToSteal)); + target.setStatStage(s, statStageValueTarget - availableToSteal); + } + } + + target.updateInfo(); + user.updateInfo(); + globalScene.queueMessage(i18next.t("moveTriggers:stealPositiveStats", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); + + return true; + } + +} + export class VariableAtkAttr extends MoveAttr { constructor() { super(); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - //const atk = args[0] as Utils.IntegerHolder; + //const atk = args[0] as Utils.NumberHolder; return false; } } @@ -4097,7 +4551,7 @@ export class TargetAtkUserAtkAttr extends VariableAtkAttr { super(); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = target.getEffectiveStat(Stat.ATK, target); + (args[0] as Utils.NumberHolder).value = target.getEffectiveStat(Stat.ATK, target); return true; } } @@ -4108,7 +4562,7 @@ export class DefAtkAttr extends VariableAtkAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = user.getEffectiveStat(Stat.DEF, target); + (args[0] as Utils.NumberHolder).value = user.getEffectiveStat(Stat.DEF, target); return true; } } @@ -4119,7 +4573,7 @@ export class VariableDefAttr extends MoveAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - //const def = args[0] as Utils.IntegerHolder; + //const def = args[0] as Utils.NumberHolder; return false; } } @@ -4130,7 +4584,7 @@ export class DefDefAttr extends VariableDefAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = target.getEffectiveStat(Stat.DEF, user); + (args[0] as Utils.NumberHolder).value = target.getEffectiveStat(Stat.DEF, user); return true; } } @@ -4147,9 +4601,9 @@ export class VariableAccuracyAttr extends MoveAttr { */ export class ThunderAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { + if (!globalScene.arena.weather?.isEffectSuppressed()) { const accuracy = args[0] as Utils.NumberHolder; - const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; + const weatherType = globalScene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { case WeatherType.SUNNY: case WeatherType.HARSH_SUN: @@ -4173,9 +4627,9 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { */ export class StormAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { + if (!globalScene.arena.weather?.isEffectSuppressed()) { const accuracy = args[0] as Utils.NumberHolder; - const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; + const weatherType = globalScene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { case WeatherType.RAIN: case WeatherType.HEAVY_RAIN: @@ -4217,7 +4671,7 @@ export class AlwaysHitMinimizeAttr extends VariableAccuracyAttr { export class ToxicAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.isOfType(Type.POISON)) { + if (user.isOfType(PokemonType.POISON)) { const accuracy = args[0] as Utils.NumberHolder; accuracy.value = -1; return true; @@ -4229,9 +4683,9 @@ export class ToxicAccuracyAttr extends VariableAccuracyAttr { export class BlizzardAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { + if (!globalScene.arena.weather?.isEffectSuppressed()) { const accuracy = args[0] as Utils.NumberHolder; - const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; + const weatherType = globalScene.arena.weather?.weatherType || WeatherType.NONE; if (weatherType === WeatherType.HAIL || weatherType === WeatherType.SNOW) { accuracy.value = -1; return true; @@ -4272,7 +4726,8 @@ export class TeraMoveCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const category = (args[0] as Utils.NumberHolder); - if (user.isTerastallized() && user.getEffectiveStat(Stat.ATK, target, move) > user.getEffectiveStat(Stat.SPATK, target, move)) { + if (user.isTerastallized && user.getEffectiveStat(Stat.ATK, target, move, true, true, false, false, true) > + user.getEffectiveStat(Stat.SPATK, target, move, true, true, false, false, true)) { category.value = MoveCategory.PHYSICAL; return true; } @@ -4299,7 +4754,7 @@ export class TeraBlastPowerAttr extends VariablePowerAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - if (user.isTerastallized() && user.getTeraType() === Type.STELLAR) { + if (user.isTerastallized && user.getTeraType() === PokemonType.STELLAR) { power.value = 100; return true; } @@ -4357,30 +4812,6 @@ export class VariableMoveTypeAttr extends MoveAttr { } } -/** - * Attribute used for Tera Starstorm that changes the move type to Stellar - * @extends VariableMoveTypeAttr - */ -export class TeraStarstormTypeAttr extends VariableMoveTypeAttr { - /** - * - * @param user the {@linkcode Pokemon} using the move - * @param target n/a - * @param move n/a - * @param args[0] {@linkcode Utils.NumberHolder} the move type - * @returns `true` if the move type is changed to {@linkcode Type.STELLAR}, `false` otherwise - */ - override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.isTerastallized() && (user.hasFusionSpecies(Species.TERAPAGOS) || user.species.speciesId === Species.TERAPAGOS)) { - const moveType = args[0] as Utils.NumberHolder; - - moveType.value = Type.STELLAR; - return true; - } - return false; - } -} - export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveType = args[0]; @@ -4389,9 +4820,9 @@ export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { } if ([ user.species.speciesId, user.fusionSpecies?.speciesId ].includes(Species.ARCEUS) || [ user.species.speciesId, user.fusionSpecies?.speciesId ].includes(Species.SILVALLY)) { - const form = user.species.speciesId === Species.ARCEUS || user.species.speciesId === Species.SILVALLY ? user.formIndex : user.fusionSpecies?.formIndex!; // TODO: is this bang correct? + const form = user.species.speciesId === Species.ARCEUS || user.species.speciesId === Species.SILVALLY ? user.formIndex : user.fusionSpecies?.formIndex!; - moveType.value = Type[Type[form]]; + moveType.value = PokemonType[PokemonType[form]]; return true; } @@ -4411,19 +4842,19 @@ export class TechnoBlastTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Shock Drive - moveType.value = Type.ELECTRIC; + moveType.value = PokemonType.ELECTRIC; break; case 2: // Burn Drive - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; break; case 3: // Chill Drive - moveType.value = Type.ICE; + moveType.value = PokemonType.ICE; break; case 4: // Douse Drive - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; break; default: - moveType.value = Type.NORMAL; + moveType.value = PokemonType.NORMAL; break; } return true; @@ -4445,10 +4876,10 @@ export class AuraWheelTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Hangry Mode - moveType.value = Type.DARK; + moveType.value = PokemonType.DARK; break; default: // Full Belly Mode - moveType.value = Type.ELECTRIC; + moveType.value = PokemonType.ELECTRIC; break; } return true; @@ -4470,13 +4901,13 @@ export class RagingBullTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Blaze breed - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; break; case 2: // Aqua breed - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; break; default: - moveType.value = Type.FIGHTING; + moveType.value = PokemonType.FIGHTING; break; } return true; @@ -4499,19 +4930,19 @@ export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { switch (form) { case 1: // Wellspring Mask case 5: // Wellspring Mask Tera - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; break; case 2: // Hearthflame Mask case 6: // Hearthflame Mask Tera - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; break; case 3: // Cornerstone Mask case 7: // Cornerstone Mask Tera - moveType.value = Type.ROCK; + moveType.value = PokemonType.ROCK; break; case 4: // Teal Mask Tera default: - moveType.value = Type.GRASS; + moveType.value = PokemonType.GRASS; break; } return true; @@ -4528,22 +4959,22 @@ export class WeatherBallTypeAttr extends VariableMoveTypeAttr { return false; } - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { - switch (user.scene.arena.weather?.weatherType) { + if (!globalScene.arena.weather?.isEffectSuppressed()) { + switch (globalScene.arena.weather?.weatherType) { case WeatherType.SUNNY: case WeatherType.HARSH_SUN: - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; break; case WeatherType.RAIN: case WeatherType.HEAVY_RAIN: - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; break; case WeatherType.SANDSTORM: - moveType.value = Type.ROCK; + moveType.value = PokemonType.ROCK; break; case WeatherType.HAIL: case WeatherType.SNOW: - moveType.value = Type.ICE; + moveType.value = PokemonType.ICE; break; default: return false; @@ -4579,19 +5010,19 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { return false; } - const currentTerrain = user.scene.arena.getTerrainType(); + const currentTerrain = globalScene.arena.getTerrainType(); switch (currentTerrain) { case TerrainType.MISTY: - moveType.value = Type.FAIRY; + moveType.value = PokemonType.FAIRY; break; case TerrainType.ELECTRIC: - moveType.value = Type.ELECTRIC; + moveType.value = PokemonType.ELECTRIC; break; case TerrainType.GRASSY: - moveType.value = Type.GRASS; + moveType.value = PokemonType.GRASS; break; case TerrainType.PSYCHIC: - moveType.value = Type.PSYCHIC; + moveType.value = PokemonType.PSYCHIC; break; default: return false; @@ -4619,10 +5050,10 @@ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr { + (user.ivs[Stat.SPDEF] & 1) * 32) * 15 / 63); moveType.value = [ - Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, - Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, - Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC, - Type.PSYCHIC, Type.ICE, Type.DRAGON, Type.DARK ][iv_val]; + PokemonType.FIGHTING, PokemonType.FLYING, PokemonType.POISON, PokemonType.GROUND, + PokemonType.ROCK, PokemonType.BUG, PokemonType.GHOST, PokemonType.STEEL, + PokemonType.FIRE, PokemonType.WATER, PokemonType.GRASS, PokemonType.ELECTRIC, + PokemonType.PSYCHIC, PokemonType.ICE, PokemonType.DRAGON, PokemonType.DARK ][iv_val]; return true; } @@ -4646,7 +5077,7 @@ export class TeraBlastTypeAttr extends VariableMoveTypeAttr { return false; } - if (user.isTerastallized()) { + if (user.isTerastallized) { moveType.value = user.getTeraType(); // changes move type to tera type return true; } @@ -4655,6 +5086,30 @@ export class TeraBlastTypeAttr extends VariableMoveTypeAttr { } } +/** + * Attribute used for Tera Starstorm that changes the move type to Stellar + * @extends VariableMoveTypeAttr + */ +export class TeraStarstormTypeAttr extends VariableMoveTypeAttr { + /** + * + * @param user the {@linkcode Pokemon} using the move + * @param target n/a + * @param move n/a + * @param args[0] {@linkcode Utils.NumberHolder} the move type + * @returns `true` if the move type is changed to {@linkcode PokemonType.STELLAR}, `false` otherwise + */ + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (user.isTerastallized && user.hasSpecies(Species.TERAPAGOS)) { + const moveType = args[0] as Utils.NumberHolder; + + moveType.value = PokemonType.STELLAR; + return true; + } + return false; + } +} + export class MatchUserTypeAttr extends VariableMoveTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveType = args[0]; @@ -4663,7 +5118,7 @@ export class MatchUserTypeAttr extends VariableMoveTypeAttr { } const userTypes = user.getTypes(true); - if (userTypes.includes(Type.STELLAR)) { // will not change to stellar type + if (userTypes.includes(PokemonType.STELLAR)) { // will not change to stellar type const nonTeraTypes = user.getTypes(); moveType.value = nonTeraTypes[0]; return true; @@ -4688,7 +5143,7 @@ export class CombinedPledgeTypeAttr extends VariableMoveTypeAttr { return false; } - const combinedPledgeMove = user.turnData.combiningPledge; + const combinedPledgeMove = user?.turnData?.combiningPledge; if (!combinedPledgeMove) { return false; } @@ -4696,19 +5151,19 @@ export class CombinedPledgeTypeAttr extends VariableMoveTypeAttr { switch (move.id) { case Moves.FIRE_PLEDGE: if (combinedPledgeMove === Moves.WATER_PLEDGE) { - moveType.value = Type.WATER; + moveType.value = PokemonType.WATER; return true; } return false; case Moves.WATER_PLEDGE: if (combinedPledgeMove === Moves.GRASS_PLEDGE) { - moveType.value = Type.GRASS; + moveType.value = PokemonType.GRASS; return true; } return false; case Moves.GRASS_PLEDGE: if (combinedPledgeMove === Moves.FIRE_PLEDGE) { - moveType.value = Type.FIRE; + moveType.value = PokemonType.FIRE; return true; } return false; @@ -4729,7 +5184,7 @@ export class NeutralDamageAgainstFlyingTypeMultiplierAttr extends VariableMoveTy if (!target.getTag(BattlerTagType.IGNORE_FLYING)) { const multiplier = args[0] as Utils.NumberHolder; //When a flying type is hit, the first hit is always 1x multiplier. - if (target.isOfType(Type.FLYING)) { + if (target.isOfType(PokemonType.FLYING)) { multiplier.value = 1; } return true; @@ -4739,22 +5194,6 @@ export class NeutralDamageAgainstFlyingTypeMultiplierAttr extends VariableMoveTy } } -export class WaterSuperEffectTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const multiplier = args[0] as Utils.NumberHolder; - if (target.isOfType(Type.WATER)) { - const effectivenessAgainstWater = new Utils.NumberHolder(getTypeDamageMultiplier(move.type, Type.WATER)); - applyChallenges(user.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, effectivenessAgainstWater); - if (effectivenessAgainstWater.value !== 0) { - multiplier.value *= 2 / effectivenessAgainstWater.value; - return true; - } - } - - return false; - } -} - export class IceNoEffectTypeAttr extends VariableMoveTypeMultiplierAttr { /** * Checks to see if the Target is Ice-Type or not. If so, the move will have no effect. @@ -4766,7 +5205,7 @@ export class IceNoEffectTypeAttr extends VariableMoveTypeMultiplierAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const multiplier = args[0] as Utils.NumberHolder; - if (target.isOfType(Type.ICE)) { + if (target.isOfType(PokemonType.ICE)) { multiplier.value = 0; return true; } @@ -4777,11 +5216,46 @@ export class IceNoEffectTypeAttr extends VariableMoveTypeMultiplierAttr { export class FlyingTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const multiplier = args[0] as Utils.NumberHolder; - multiplier.value *= target.getAttackTypeEffectiveness(Type.FLYING, user); + multiplier.value *= target.getAttackTypeEffectiveness(PokemonType.FLYING, user); return true; } } +/** + * Attribute for moves which have a custom type chart interaction. + */ +export class VariableMoveTypeChartAttr extends MoveAttr { + /** + * @param user {@linkcode Pokemon} using the move + * @param target {@linkcode Pokemon} target of the move + * @param move {@linkcode Move} with this attribute + * @param args [0] {@linkcode NumberHolder} holding the type effectiveness + * @param args [1] A single defensive type of the target + * + * @returns true if application of the attribute succeeds + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + return false; + } +} + +/** + * This class forces Freeze-Dry to be super effective against Water Type. + */ +export class FreezeDryAttr extends VariableMoveTypeChartAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const multiplier = args[0] as Utils.NumberHolder; + const defType = args[1] as PokemonType; + + if (defType === PokemonType.WATER) { + multiplier.value = 2; + return true; + } else { + return false; + } + } +} + export class OneHitKOAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const accuracy = args[0] as Utils.NumberHolder; @@ -4810,7 +5284,7 @@ export class SheerColdAccuracyAttr extends OneHitKOAccuracyAttr { if (user.level < target.level) { accuracy.value = 0; } else { - const baseAccuracy = user.isOfType(Type.ICE) ? 30 : 20; + const baseAccuracy = user.isOfType(PokemonType.ICE) ? 30 : 20; accuracy.value = Math.min(Math.max(baseAccuracy + 100 * (1 - target.level / user.level), 0), 100); } return true; @@ -4855,7 +5329,7 @@ const crashDamageFunc = (user: Pokemon, move: Move) => { } user.damageAndUpdate(Utils.toDmgValue(user.getMaxHp() / 2), HitResult.OTHER, false, true); - user.scene.queueMessage(i18next.t("moveTriggers:keptGoingAndCrashed", { pokemonName: getPokemonNameWithAffix(user) })); + globalScene.queueMessage(i18next.t("moveTriggers:keptGoingAndCrashed", { pokemonName: getPokemonNameWithAffix(user) })); user.turnData.damageTaken += Utils.toDmgValue(user.getMaxHp() / 2); return true; @@ -4878,7 +5352,7 @@ export class BypassRedirectAttr extends MoveAttr { export class FrenzyAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT, false, true); + super(true, { trigger: MoveEffectTrigger.HIT, lastHitOnly: true }); } canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) { @@ -4945,13 +5419,13 @@ export class SemiInvulnerableAttr extends MoveEffectAttr { export class AddBattlerTagAttr extends MoveEffectAttr { public tagType: BattlerTagType; - public turnCountMin: integer; - public turnCountMax: integer; + public turnCountMin: number; + public turnCountMax: number; protected cancelOnFail: boolean; private failOnOverlap: boolean; - constructor(tagType: BattlerTagType, selfTarget: boolean = false, failOnOverlap: boolean = false, turnCountMin: integer = 0, turnCountMax?: integer, lastHitOnly: boolean = false, cancelOnFail: boolean = false) { - super(selfTarget, MoveEffectTrigger.POST_APPLY, false, lastHitOnly); + constructor(tagType: BattlerTagType, selfTarget: boolean = false, failOnOverlap: boolean = false, turnCountMin: number = 0, turnCountMax?: number, lastHitOnly: boolean = false, cancelOnFail: boolean = false) { + super(selfTarget, { lastHitOnly: lastHitOnly }); this.tagType = tagType; this.turnCountMin = turnCountMin; @@ -4987,7 +5461,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { : null; } - getTagTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer | void { + getTagTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number | void { switch (this.tagType) { case BattlerTagType.RECHARGING: case BattlerTagType.PERISH_SONG: @@ -5025,6 +5499,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { case BattlerTagType.INGRAIN: case BattlerTagType.IGNORE_ACCURACY: case BattlerTagType.AQUA_RING: + case BattlerTagType.MAGIC_COAT: return 3; case BattlerTagType.PROTECTED: case BattlerTagType.FLYING: @@ -5034,7 +5509,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { } } - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { let moveChance = this.getMoveChance(user, target, move, this.selfTarget, false); if (moveChance < 0) { moveChance = 100; @@ -5101,7 +5576,7 @@ export class GulpMissileTagAttr extends MoveEffectAttr { return false; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { const isCramorant = user.hasAbility(Abilities.GULP_MISSILE) && user.species.speciesId === Species.CRAMORANT; return isCramorant && !user.getTag(GulpMissileTag) ? 10 : 0; } @@ -5143,14 +5618,14 @@ export class JawLockAttr extends AddBattlerTagAttr { export class CurseAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move:Move, args: any[]): boolean { - if (user.getTypes(true).includes(Type.GHOST)) { + if (user.getTypes(true).includes(PokemonType.GHOST)) { if (target.getTag(BattlerTagType.CURSED)) { - user.scene.queueMessage(i18next.t("battle:attackFailed")); + globalScene.queueMessage(i18next.t("battle:attackFailed")); return false; } const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2)); user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true); - user.scene.queueMessage( + globalScene.queueMessage( i18next.t("battlerTags:cursedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user), pokemonName: getPokemonNameWithAffix(target) @@ -5160,8 +5635,8 @@ export class CurseAttr extends MoveEffectAttr { target.addTag(BattlerTagType.CURSED, 0, move.id, user.id); return true; } else { - user.scene.unshiftPhase(new StatStageChangePhase(user.scene, user.getBattlerIndex(), true, [ Stat.ATK, Stat.DEF ], 1)); - user.scene.unshiftPhase(new StatStageChangePhase(user.scene, user.getBattlerIndex(), true, [ Stat.SPD ], -1)); + globalScene.unshiftPhase(new StatStageChangePhase(user.getBattlerIndex(), true, [ Stat.ATK, Stat.DEF ], 1)); + globalScene.unshiftPhase(new StatStageChangePhase(user.getBattlerIndex(), true, [ Stat.SPD ], -1)); return true; } } @@ -5232,7 +5707,7 @@ export class ConfuseAttr extends AddBattlerTagAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!this.selfTarget && target.isSafeguarded(user)) { if (move.category === MoveCategory.STATUS) { - user.scene.queueMessage(i18next.t("moveTriggers:safeguard", { targetName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:safeguard", { targetName: getPokemonNameWithAffix(target) })); } return false; } @@ -5292,7 +5767,7 @@ export class IgnoreAccuracyAttr extends AddBattlerTagAttr { return false; } - user.scene.queueMessage(i18next.t("moveTriggers:tookAimAtTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:tookAimAtTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); return true; } @@ -5308,7 +5783,7 @@ export class FaintCountdownAttr extends AddBattlerTagAttr { return false; } - user.scene.queueMessage(i18next.t("moveTriggers:faintCountdown", { pokemonName: getPokemonNameWithAffix(target), turnCount: this.turnCountMin - 1 })); + globalScene.queueMessage(i18next.t("moveTriggers:faintCountdown", { pokemonName: getPokemonNameWithAffix(target), turnCount: this.turnCountMin - 1 })); return true; } @@ -5338,7 +5813,7 @@ export class RemoveAllSubstitutesAttr extends MoveEffectAttr { return false; } - user.scene.getField(true).forEach(pokemon => + globalScene.getField(true).forEach(pokemon => pokemon.findAndRemoveTags(tag => tag.tagType === BattlerTagType.SUBSTITUTE)); return true; } @@ -5363,7 +5838,7 @@ export class HitsTagAttr extends MoveAttr { this.doubleDamage = !!doubleDamage; } - getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return target.getTag(this.tagType) ? this.doubleDamage ? 10 : 5 : 0; } } @@ -5381,12 +5856,12 @@ export class HitsTagForDoubleDamageAttr extends HitsTagAttr { export class AddArenaTagAttr extends MoveEffectAttr { public tagType: ArenaTagType; - public turnCount: integer; + public turnCount: number; private failOnOverlap: boolean; public selfSideTarget: boolean; - constructor(tagType: ArenaTagType, turnCount?: integer | null, failOnOverlap: boolean = false, selfSideTarget: boolean = false) { - super(true, MoveEffectTrigger.POST_APPLY); + constructor(tagType: ArenaTagType, turnCount?: number | null, failOnOverlap: boolean = false, selfSideTarget: boolean = false) { + super(true); this.tagType = tagType; this.turnCount = turnCount!; // TODO: is the bang correct? @@ -5400,7 +5875,8 @@ export class AddArenaTagAttr extends MoveEffectAttr { } if ((move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) && user.getLastXMoves(1)[0]?.result === MoveResult.SUCCESS) { - user.scene.arena.addTag(this.tagType, this.turnCount, move.id, user.id, (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); + const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + globalScene.arena.addTag(this.tagType, this.turnCount, move.id, user.id, side); return true; } @@ -5409,7 +5885,7 @@ export class AddArenaTagAttr extends MoveEffectAttr { getCondition(): MoveConditionFunc | null { return this.failOnOverlap - ? (user, target, move) => !user.scene.arena.getTagOnSide(this.tagType, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY) + ? (user, target, move) => !globalScene.arena.getTagOnSide(this.tagType, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY) : null; } } @@ -5424,7 +5900,7 @@ export class RemoveArenaTagsAttr extends MoveEffectAttr { public selfSideTarget: boolean; constructor(tagTypes: ArenaTagType[], selfSideTarget: boolean) { - super(true, MoveEffectTrigger.POST_APPLY); + super(true); this.tagTypes = tagTypes; this.selfSideTarget = selfSideTarget; @@ -5438,7 +5914,7 @@ export class RemoveArenaTagsAttr extends MoveEffectAttr { const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; for (const tagType of this.tagTypes) { - user.scene.arena.removeTagOnSide(tagType, side); + globalScene.arena.removeTagOnSide(tagType, side); } return true; @@ -5449,7 +5925,7 @@ export class AddArenaTrapTagAttr extends AddArenaTagAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - const tag = user.scene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; + const tag = globalScene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; if (!tag) { return true; } @@ -5473,9 +5949,9 @@ export class AddArenaTrapTagHitAttr extends AddArenaTagAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - const tag = user.scene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; + const tag = globalScene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; if ((moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) && user.getLastXMoves(1)[0]?.result === MoveResult.SUCCESS) { - user.scene.arena.addTag(this.tagType, 0, move.id, user.id, side); + globalScene.arena.addTag(this.tagType, 0, move.id, user.id, side); if (!tag) { return true; } @@ -5490,7 +5966,7 @@ export class RemoveArenaTrapAttr extends MoveEffectAttr { private targetBothSides: boolean; constructor(targetBothSides: boolean = false) { - super(true, MoveEffectTrigger.PRE_APPLY); + super(true, { trigger: MoveEffectTrigger.PRE_APPLY }); this.targetBothSides = targetBothSides; } @@ -5501,20 +5977,20 @@ export class RemoveArenaTrapAttr extends MoveEffectAttr { } if (this.targetBothSides) { - user.scene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY); - user.scene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY); - user.scene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.ENEMY); - user.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.ENEMY); } else { - user.scene.arena.removeTagOnSide(ArenaTagType.SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); } return true; @@ -5526,7 +6002,7 @@ export class RemoveScreensAttr extends MoveEffectAttr { private targetBothSides: boolean; constructor(targetBothSides: boolean = false) { - super(true, MoveEffectTrigger.PRE_APPLY); + super(true, { trigger: MoveEffectTrigger.PRE_APPLY }); this.targetBothSides = targetBothSides; } @@ -5537,17 +6013,17 @@ export class RemoveScreensAttr extends MoveEffectAttr { } if (this.targetBothSides) { - user.scene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.PLAYER); + globalScene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaTagSide.PLAYER); - user.scene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.ENEMY); - user.scene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.ENEMY); - user.scene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaTagSide.ENEMY); } else { - user.scene.arena.removeTagOnSide(ArenaTagType.REFLECT, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); - user.scene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); - user.scene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.REFLECT, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); + globalScene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); } return true; @@ -5564,7 +6040,7 @@ export class SwapArenaTagsAttr extends MoveEffectAttr { constructor(SwapTags: ArenaTagType[]) { - super(true, MoveEffectTrigger.POST_APPLY); + super(true); this.SwapTags = SwapTags; } @@ -5573,25 +6049,25 @@ export class SwapArenaTagsAttr extends MoveEffectAttr { return false; } - const tagPlayerTemp = user.scene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaTagSide.PLAYER); - const tagEnemyTemp = user.scene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaTagSide.ENEMY); + const tagPlayerTemp = globalScene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaTagSide.PLAYER); + const tagEnemyTemp = globalScene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaTagSide.ENEMY); if (tagPlayerTemp) { for (const swapTagsType of tagPlayerTemp) { - user.scene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.PLAYER, true); - user.scene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaTagSide.ENEMY, true); // TODO: is the bang correct? + globalScene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.PLAYER, true); + globalScene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaTagSide.ENEMY, true); // TODO: is the bang correct? } } if (tagEnemyTemp) { for (const swapTagsType of tagEnemyTemp) { - user.scene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.ENEMY, true); - user.scene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaTagSide.PLAYER, true); // TODO: is the bang correct? + globalScene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.ENEMY, true); + globalScene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaTagSide.PLAYER, true); // TODO: is the bang correct? } } - user.scene.queueMessage(i18next.t("moveTriggers:swapArenaTags", { pokemonName: getPokemonNameWithAffix(user) })); + globalScene.queueMessage(i18next.t("moveTriggers:swapArenaTags", { pokemonName: getPokemonNameWithAffix(user) })); return true; } } @@ -5640,44 +6116,44 @@ export class RevivalBlessingAttr extends MoveEffectAttr { * @param args N/A * @returns Promise, true if function succeeds. */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - // If user is player, checks if the user has fainted pokemon - if (user instanceof PlayerPokemon - && user.scene.getParty().findIndex(p => p.isFainted()) > -1) { - (user as PlayerPokemon).revivalBlessing().then(() => { - resolve(true); - }); - // If user is enemy, checks that it is a trainer, and it has fainted non-boss pokemon in party - } else if (user instanceof EnemyPokemon - && user.hasTrainer() - && user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { - // Selects a random fainted pokemon - const faintedPokemon = user.scene.getEnemyParty().filter(p => p.isFainted() && !p.isBoss()); - const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; - const slotIndex = user.scene.getEnemyParty().findIndex(p => pokemon.id === p.id); - pokemon.resetStatus(); - pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); - user.scene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: getPokemonNameWithAffix(pokemon) }), 0, true); + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + // If user is player, checks if the user has fainted pokemon + if (user instanceof PlayerPokemon) { + globalScene.unshiftPhase(new RevivalBlessingPhase(user)); + return true; + } else if (user instanceof EnemyPokemon && user.hasTrainer() && globalScene.getEnemyParty().findIndex((p) => p.isFainted() && !p.isBoss()) > -1) { + // If used by an enemy trainer with at least one fainted non-boss Pokemon, this + // revives one of said Pokemon selected at random. + const faintedPokemon = globalScene.getEnemyParty().filter((p) => p.isFainted() && !p.isBoss()); + const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; + const slotIndex = globalScene.getEnemyParty().findIndex((p) => pokemon.id === p.id); + pokemon.resetStatus(); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + globalScene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: getPokemonNameWithAffix(pokemon) }), 0, true); - if (user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) { - const allyPokemon = user.getAlly(); - if (slotIndex <= 1) { - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); - } else if (allyPokemon.isFainted()) { - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); - } + if (globalScene.currentBattle.double && globalScene.getEnemyParty().length > 1) { + const allyPokemon = user.getAlly(); + if (slotIndex <= 1) { + globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, false)); + } else if (allyPokemon.isFainted()) { + globalScene.unshiftPhase(new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, false)); } - resolve(true); - } else { - user.scene.queueMessage(i18next.t("battle:attackFailed")); - resolve(false); } - }); + return true; + } + return false; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - if (user.hasTrainer() && user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { + getCondition(): MoveConditionFunc { + return (user, target, move) => + (user instanceof PlayerPokemon && globalScene.getPlayerParty().some((p) => p.isFainted())) || + (user instanceof EnemyPokemon && + user.hasTrainer() && + globalScene.getEnemyParty().some((p) => p.isFainted() && !p.isBoss())); + } + + override getUserBenefitScore(user: Pokemon, _target: Pokemon, _move: Move): number { + if (user.hasTrainer() && globalScene.getEnemyParty().some((p) => p.isFainted() && !p.isBoss())) { return 20; } @@ -5685,12 +6161,13 @@ export class RevivalBlessingAttr extends MoveEffectAttr { } } + export class ForceSwitchOutAttr extends MoveEffectAttr { constructor( private selfSwitch: boolean = false, private switchType: SwitchType = SwitchType.SWITCH ) { - super(false, MoveEffectTrigger.POST_APPLY, false, true); + super(false, { lastHitOnly: true }); } isBatonPass() { @@ -5703,59 +6180,147 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return false; } - /** - * Move the switch out logic inside the conditional block - * This ensures that the switch out only happens when the conditions are met - */ + /** The {@linkcode Pokemon} to be switched out with this effect */ const switchOutTarget = this.selfSwitch ? user : target; + + // If the switch-out target is a Dondozo with a Tatsugiri in its mouth + // (e.g. when it uses Flip Turn), make it spit out the Tatsugiri before switching out. + switchOutTarget.lapseTag(BattlerTagType.COMMANDED); + if (switchOutTarget instanceof PlayerPokemon) { - // Switch out logic for the player's Pokemon - if (switchOutTarget.scene.getParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) { + /** + * 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) + && [ Moves.U_TURN, Moves.VOLT_SWITCH, Moves.FLIP_TURN ].includes(move.id) + ) { + if (this.hpDroppedBelowHalf(target)) { + return false; + } + } + + // Find indices of off-field Pokemon that are eligible to be switched into + const eligibleNewIndices: number[] = []; + globalScene.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)]; + globalScene.prependToPhase( + new SwitchSummonPhase( + this.switchType, + switchOutTarget.getFieldIndex(), + slotIndex, + false, + true + ), + MoveEndPhase + ); + } else { + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + globalScene.prependToPhase( + new SwitchPhase( + 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 (globalScene.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[] = []; + globalScene.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)]; + globalScene.prependToPhase( + new SwitchSummonPhase( + this.switchType, + switchOutTarget.getFieldIndex(), + slotIndex, + false, + false + ), + MoveEndPhase + ); + } else { + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + globalScene.prependToPhase( + new SwitchSummonPhase( + this.switchType, + switchOutTarget.getFieldIndex(), + (globalScene.currentBattle.trainer ? globalScene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0), + false, + false + ), + MoveEndPhase + ); + } } - } else { - // Switch out logic for everything else (eg: WILD battles) - if (user.scene.currentBattle.waveIndex % 10 === 0) { + } 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) + && [ Moves.U_TURN, Moves.VOLT_SWITCH, Moves.FLIP_TURN ].includes(move.id) + ) { + if (this.hpDroppedBelowHalf(target)) { + return false; + } + } + + if (globalScene.currentBattle.waveIndex % 10 === 0) { + return false; + } + + // Don't allow wild mons to flee with U-turn et al. + if (this.selfSwitch && !user.isPlayer() && move.category !== MoveCategory.STATUS) { return false; } if (switchOutTarget.hp > 0) { switchOutTarget.leaveField(false); - user.scene.queueMessage(i18next.t("moveTriggers:fled", { pokemonName: getPokemonNameWithAffix(switchOutTarget) }), null, true, 500); + globalScene.queueMessage(i18next.t("moveTriggers:fled", { pokemonName: getPokemonNameWithAffix(switchOutTarget) }), null, true, 500); // in double battles redirect potential moves off fled pokemon - if (switchOutTarget.scene.currentBattle.double) { + if (globalScene.currentBattle.double) { const allyPokemon = switchOutTarget.getAlly(); - switchOutTarget.scene.redirectPokemonMoves(switchOutTarget, allyPokemon); + globalScene.redirectPokemonMoves(switchOutTarget, allyPokemon); } } if (!switchOutTarget.getAlly()?.isActive(true)) { - user.scene.clearEnemyHeldItemModifiers(); + globalScene.clearEnemyHeldItemModifiers(); if (switchOutTarget.hp) { - user.scene.pushPhase(new BattleEndPhase(user.scene)); - user.scene.pushPhase(new NewBattlePhase(user.scene)); + globalScene.pushPhase(new BattleEndPhase(false)); + globalScene.pushPhase(new NewBattlePhase()); } } } @@ -5767,10 +6332,12 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return (user, target, move) => (move.category !== MoveCategory.STATUS || this.getSwitchOutCondition()(user, target, move)); } - getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + getFailedText(_user: Pokemon, target: Pokemon, _move: Move): string | undefined { const blockedByAbility = new Utils.BooleanHolder(false); applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); - return blockedByAbility.value ? i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }) : null; + if (blockedByAbility.value) { + return i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }); + } } getSwitchOutCondition(): MoveConditionFunc { @@ -5783,7 +6350,13 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return false; } - if (!player && user.scene.currentBattle.isBattleMysteryEncounter() && !user.scene.currentBattle.mysteryEncounter?.fleeAllowed) { + // Dondozo with an allied Tatsugiri in its mouth cannot be forced out + const commandedTag = switchOutTarget.getTag(BattlerTagType.COMMANDED); + if (commandedTag?.getSourcePokemon()?.isActive(true)) { + return false; + } + + if (!player && globalScene.currentBattle.isBattleMysteryEncounter() && !globalScene.currentBattle.mysteryEncounter?.fleeAllowed) { // Don't allow wild opponents to be force switched during MEs with flee disabled return false; } @@ -5793,55 +6366,69 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return !blockedByAbility.value; } - if (!player && user.scene.currentBattle.battleType === BattleType.WILD) { + if (!player && globalScene.currentBattle.battleType === BattleType.WILD) { if (this.isBatonPass()) { return false; } // Don't allow wild opponents to flee on the boss stage since it can ruin a run early on - if (user.scene.currentBattle.waveIndex % 10 === 0) { + if (globalScene.currentBattle.waveIndex % 10 === 0) { return false; } } - const party = player ? user.scene.getParty() : user.scene.getEnemyParty(); - return (!player && !user.scene.currentBattle.battleType) + const party = player ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); + return (!player && !globalScene.currentBattle.battleType) || party.filter(p => p.isAllowedInBattle() - && (player || (p as EnemyPokemon).trainerSlot === (switchOutTarget as EnemyPokemon).trainerSlot)).length > user.scene.currentBattle.getBattlerCount(); + && (player || (p as EnemyPokemon).trainerSlot === (switchOutTarget as EnemyPokemon).trainerSlot)).length > globalScene.currentBattle.getBattlerCount(); }; } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - if (!user.scene.getEnemyParty().find(p => p.isActive() && !p.isOnField())) { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { + if (!globalScene.getEnemyParty().find(p => p.isActive() && !p.isOnField())) { return -20; } let ret = this.selfSwitch ? Math.floor((1 - user.getHpRatio()) * 20) : super.getUserBenefitScore(user, target, move); if (this.selfSwitch && this.isBatonPass()) { - const statStageTotal = user.getStatStages().reduce((s: integer, total: integer) => total += s, 0); + const statStageTotal = user.getStatStages().reduce((s: number, total: number) => total += s, 0); ret = ret / 2 + (Phaser.Tweens.Builders.GetEaseFunction("Sine.easeOut")(Math.min(Math.abs(statStageTotal), 10) / 10) * (statStageTotal >= 0 ? 10 : -10)); } return ret; } -} + /** + * Helper function to check if the Pokémon's health is below half after taking damage. + * Used for an edge case interaction with Wimp Out/Emergency Exit. + * If the Ability activates due to being hit by U-turn or Volt Switch, the user of that move will not be switched out. + */ + hpDroppedBelowHalf(target: Pokemon): boolean { + const pokemonHealth = target.hp; + const maxPokemonHealth = target.getMaxHp(); + const damageTaken = target.turnData.damageTaken; + const initialHealth = pokemonHealth + damageTaken; + + // Check if the Pokémon's health has dropped below half after the damage + return initialHealth >= maxPokemonHealth / 2 && pokemonHealth < maxPokemonHealth / 2; + } +} export class ChillyReceptionAttr extends ForceSwitchOutAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - user.scene.arena.trySetWeather(WeatherType.SNOW, true); + globalScene.arena.trySetWeather(WeatherType.SNOW, true); return super.apply(user, target, move, args); } getCondition(): MoveConditionFunc { // chilly reception move will go through if the weather is change-able to snow, or the user can switch out, else move will fail - return (user, target, move) => user.scene.arena.weather?.weatherType !== WeatherType.SNOW || super.getSwitchOutCondition()(user, target, move); + return (user, target, move) => globalScene.arena.weather?.weatherType !== WeatherType.SNOW || super.getSwitchOutCondition()(user, target, move); } } export class RemoveTypeAttr extends MoveEffectAttr { - private removedType: Type; + private removedType: PokemonType; private messageCallback: ((user: Pokemon) => void) | undefined; - constructor(removedType: Type, messageCallback?: (user: Pokemon) => void) { - super(true, MoveEffectTrigger.POST_TARGET); + constructor(removedType: PokemonType, messageCallback?: (user: Pokemon) => void) { + super(true, { trigger: MoveEffectTrigger.POST_TARGET }); this.removedType = removedType; this.messageCallback = messageCallback; @@ -5852,12 +6439,15 @@ export class RemoveTypeAttr extends MoveEffectAttr { return false; } - if (user.isTerastallized() && user.getTeraType() === this.removedType) { // active tera types cannot be removed + if (user.isTerastallized && user.getTeraType() === this.removedType) { // active tera types cannot be removed return false; } const userTypes = user.getTypes(true); const modifiedTypes = userTypes.filter(type => type !== this.removedType); + if (modifiedTypes.length === 0) { + modifiedTypes.push(PokemonType.UNKNOWN); + } user.summonData.types = modifiedTypes; user.updateInfo(); @@ -5880,16 +6470,20 @@ export class CopyTypeAttr extends MoveEffectAttr { return false; } - user.summonData.types = target.getTypes(true); + const targetTypes = target.getTypes(true); + if (targetTypes.includes(PokemonType.UNKNOWN) && targetTypes.indexOf(PokemonType.UNKNOWN) > -1) { + targetTypes[targetTypes.indexOf(PokemonType.UNKNOWN)] = PokemonType.NORMAL; + } + user.summonData.types = targetTypes; user.updateInfo(); - user.scene.queueMessage(i18next.t("moveTriggers:copyType", { pokemonName: getPokemonNameWithAffix(user), targetPokemonName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:copyType", { pokemonName: getPokemonNameWithAffix(user), targetPokemonName: getPokemonNameWithAffix(target) })); return true; } getCondition(): MoveConditionFunc { - return (user, target, move) => target.getTypes()[0] !== Type.UNKNOWN; + return (user, target, move) => target.getTypes()[0] !== PokemonType.UNKNOWN || target.summonData.addedType !== null; } } @@ -5903,22 +6497,114 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { return false; } - const biomeType = user.scene.arena.getTypeForBiome(); + const terrainType = globalScene.arena.getTerrainType(); + let typeChange: PokemonType; + if (terrainType !== TerrainType.NONE) { + typeChange = this.getTypeForTerrain(globalScene.arena.getTerrainType()); + } else { + typeChange = this.getTypeForBiome(globalScene.arena.biomeType); + } - user.summonData.types = [ biomeType ]; + user.summonData.types = [ typeChange ]; user.updateInfo(); - user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${Type[biomeType]}`) })); + globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${PokemonType[typeChange]}`) })); return true; } + + /** + * Retrieves a type from the current terrain + * @param terrainType {@linkcode TerrainType} + * @returns {@linkcode Type} + */ + private getTypeForTerrain(terrainType: TerrainType): PokemonType { + switch (terrainType) { + case TerrainType.ELECTRIC: + return PokemonType.ELECTRIC; + case TerrainType.MISTY: + return PokemonType.FAIRY; + case TerrainType.GRASSY: + return PokemonType.GRASS; + case TerrainType.PSYCHIC: + return PokemonType.PSYCHIC; + case TerrainType.NONE: + default: + return PokemonType.UNKNOWN; + } + } + + /** + * Retrieves a type from the current biome + * @param biomeType {@linkcode Biome} + * @returns {@linkcode Type} + */ + private getTypeForBiome(biomeType: Biome): PokemonType { + switch (biomeType) { + case Biome.TOWN: + case Biome.PLAINS: + case Biome.METROPOLIS: + return PokemonType.NORMAL; + case Biome.GRASS: + case Biome.TALL_GRASS: + return PokemonType.GRASS; + case Biome.FOREST: + case Biome.JUNGLE: + return PokemonType.BUG; + case Biome.SLUM: + case Biome.SWAMP: + return PokemonType.POISON; + case Biome.SEA: + case Biome.BEACH: + case Biome.LAKE: + case Biome.SEABED: + return PokemonType.WATER; + case Biome.MOUNTAIN: + return PokemonType.FLYING; + case Biome.BADLANDS: + return PokemonType.GROUND; + case Biome.CAVE: + case Biome.DESERT: + return PokemonType.ROCK; + case Biome.ICE_CAVE: + case Biome.SNOWY_FOREST: + return PokemonType.ICE; + case Biome.MEADOW: + case Biome.FAIRY_CAVE: + case Biome.ISLAND: + return PokemonType.FAIRY; + case Biome.POWER_PLANT: + return PokemonType.ELECTRIC; + case Biome.VOLCANO: + return PokemonType.FIRE; + case Biome.GRAVEYARD: + case Biome.TEMPLE: + return PokemonType.GHOST; + case Biome.DOJO: + case Biome.CONSTRUCTION_SITE: + return PokemonType.FIGHTING; + case Biome.FACTORY: + case Biome.LABORATORY: + return PokemonType.STEEL; + case Biome.RUINS: + case Biome.SPACE: + return PokemonType.PSYCHIC; + case Biome.WASTELAND: + case Biome.END: + return PokemonType.DRAGON; + case Biome.ABYSS: + return PokemonType.DARK; + default: + return PokemonType.UNKNOWN; + } + } } export class ChangeTypeAttr extends MoveEffectAttr { - private type: Type; + private type: PokemonType; - constructor(type: Type) { - super(false, MoveEffectTrigger.HIT); + constructor(type: PokemonType) { + super(false, { trigger: MoveEffectTrigger.HIT }); this.type = type; } @@ -5927,40 +6613,36 @@ export class ChangeTypeAttr extends MoveEffectAttr { target.summonData.types = [ this.type ]; target.updateInfo(); - user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:Type.${Type[this.type]}`) })); + globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(target), typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`) })); return true; } getCondition(): MoveConditionFunc { - return (user, target, move) => !target.isTerastallized() && !target.hasAbility(Abilities.MULTITYPE) && !target.hasAbility(Abilities.RKS_SYSTEM) && !(target.getTypes().length === 1 && target.getTypes()[0] === this.type); + return (user, target, move) => !target.isTerastallized && !target.hasAbility(Abilities.MULTITYPE) && !target.hasAbility(Abilities.RKS_SYSTEM) && !(target.getTypes().length === 1 && target.getTypes()[0] === this.type); } } export class AddTypeAttr extends MoveEffectAttr { - private type: Type; + private type: PokemonType; - constructor(type: Type) { - super(false, MoveEffectTrigger.HIT); + constructor(type: PokemonType) { + super(false, { trigger: MoveEffectTrigger.HIT }); this.type = type; } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const types = target.getTypes().slice(0, 2).filter(t => t !== Type.UNKNOWN); // TODO: Figure out some way to actually check if another version of this effect is already applied - if (this.type !== Type.UNKNOWN) { - types.push(this.type); - } - target.summonData.types = types; + target.summonData.addedType = this.type; target.updateInfo(); - user.scene.queueMessage(i18next.t("moveTriggers:addType", { typeName: i18next.t(`pokemonInfo:Type.${Type[this.type]}`), pokemonName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:addType", { typeName: i18next.t(`pokemonInfo:Type.${PokemonType[this.type]}`), pokemonName: getPokemonNameWithAffix(target) })); return true; } getCondition(): MoveConditionFunc { - return (user, target, move) => !target.isTerastallized() && !target.getTypes().includes(this.type); + return (user, target, move) => !target.isTerastallized && !target.getTypes().includes(this.type); } } @@ -5976,265 +6658,430 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { const firstMoveType = target.getMoveset()[0]?.getMove().type!; // TODO: is this bang correct? user.summonData.types = [ firstMoveType ]; - user.scene.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: i18next.t(`pokemonInfo:Type.${Type[firstMoveType]}`) })); + globalScene.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: i18next.t(`pokemonInfo:Type.${PokemonType[firstMoveType]}`) })); return true; } } -export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr { - private enemyMoveset: boolean | null; - - constructor(enemyMoveset?: boolean) { - super(); - - this.enemyMoveset = enemyMoveset!; // TODO: is this bang correct? - } - +/** + * Attribute used to call a move. + * Used by other move attributes: {@linkcode RandomMoveAttr}, {@linkcode RandomMovesetMoveAttr}, {@linkcode CopyMoveAttr} + * @see {@linkcode apply} for move call + * @extends OverrideMoveEffectAttr + */ +class CallMoveAttr extends OverrideMoveEffectAttr { + protected invalidMoves: ReadonlySet; + protected hasTarget: boolean; apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const moveset = (!this.enemyMoveset ? user : target).getMoveset(); - const moves = moveset.filter(m => !m?.getMove().hasFlag(MoveFlags.IGNORE_VIRTUAL)); - if (moves.length) { - const move = moves[user.randSeedInt(moves.length)]; - const moveIndex = moveset.findIndex(m => m?.moveId === move?.moveId); - const moveTargets = getMoveTargets(user, move?.moveId!); // TODO: is this bang correct? - if (!moveTargets.targets.length) { - return false; - } - let selectTargets: BattlerIndex[]; - switch (true) { - case (moveTargets.multiple || moveTargets.targets.length === 1): { - selectTargets = moveTargets.targets; - break; - } - case (moveTargets.targets.indexOf(target.getBattlerIndex()) > -1): { - selectTargets = [ target.getBattlerIndex() ]; - break; - } - default: { - moveTargets.targets.splice(moveTargets.targets.indexOf(user.getAlly().getBattlerIndex())); - selectTargets = [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; - break; - } - } - const targets = selectTargets; - user.getMoveQueue().push({ move: move?.moveId!, targets: targets, ignorePP: true }); // TODO: is this bang correct? - user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, moveset[moveIndex]!, true)); // There's a PR to re-do the move(s) that use this Attr, gonna put `!` for now - return true; + const replaceMoveTarget = move.moveTarget === MoveTarget.NEAR_OTHER ? MoveTarget.NEAR_ENEMY : undefined; + const moveTargets = getMoveTargets(user, move.id, replaceMoveTarget); + if (moveTargets.targets.length === 0) { + return false; } - - return false; + const targets = moveTargets.multiple || moveTargets.targets.length === 1 + ? moveTargets.targets + : [ this.hasTarget ? target.getBattlerIndex() : moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; // account for Mirror Move having a target already + user.getMoveQueue().push({ move: move.id, targets: targets, virtual: true, ignorePP: true }); + globalScene.unshiftPhase(new LoadMoveAnimPhase(move.id)); + globalScene.unshiftPhase(new MovePhase(user, targets, new PokemonMove(move.id, 0, 0, true), true, true)); + return true; } } -export class RandomMoveAttr extends OverrideMoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - const moveIds = Utils.getEnumValues(Moves).filter(m => !allMoves[m].hasFlag(MoveFlags.IGNORE_VIRTUAL) && !allMoves[m].name.endsWith(" (N)")); - const moveId = moveIds[user.randSeedInt(moveIds.length)]; +/** + * Attribute used to call a random move. + * Used for {@linkcode Moves.METRONOME} + * @see {@linkcode apply} for move selection and move call + * @extends CallMoveAttr to call a selected move + */ +export class RandomMoveAttr extends CallMoveAttr { + constructor(invalidMoves: ReadonlySet) { + super(); + this.invalidMoves = invalidMoves; + } - const moveTargets = getMoveTargets(user, moveId); - if (!moveTargets.targets.length) { - resolve(false); - return; + /** + * This function exists solely to allow tests to override the randomly selected move by mocking this function. + */ + public getMoveOverride(): Moves | null { + return null; + } + + /** + * User calls a random moveId. + * + * Invalid moves are indicated by what is passed in to invalidMoves: {@linkcode invalidMetronomeMoves} + * @param user Pokemon that used the move and will call a random move + * @param target Pokemon that will be targeted by the random move (if single target) + * @param move Move being used + * @param args Unused + */ + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveIds = Utils.getEnumValues(Moves).map(m => !this.invalidMoves.has(m) && !allMoves[m].name.endsWith(" (N)") ? m : Moves.NONE); + let moveId: Moves = Moves.NONE; + do { + moveId = this.getMoveOverride() ?? moveIds[user.randSeedInt(moveIds.length)]; + } + while (moveId === Moves.NONE); + return super.apply(user, target, allMoves[moveId], args); + } +} + +/** + * Attribute used to call a random move in the user or party's moveset. + * Used for {@linkcode Moves.ASSIST} and {@linkcode Moves.SLEEP_TALK} + * + * Fails if the user has no callable moves. + * + * Invalid moves are indicated by what is passed in to invalidMoves: {@linkcode invalidAssistMoves} or {@linkcode invalidSleepTalkMoves} + * @extends RandomMoveAttr to use the callMove function on a moveId + * @see {@linkcode getCondition} for move selection + */ +export class RandomMovesetMoveAttr extends CallMoveAttr { + private includeParty: boolean; + private moveId: number; + constructor(invalidMoves: ReadonlySet, includeParty: boolean = false) { + super(); + this.includeParty = includeParty; + this.invalidMoves = invalidMoves; + } + + /** + * User calls a random moveId selected in {@linkcode getCondition} + * @param user Pokemon that used the move and will call a random move + * @param target Pokemon that will be targeted by the random move (if single target) + * @param move Move being used + * @param args Unused + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + return super.apply(user, target, allMoves[this.moveId], args); + } + + getCondition(): MoveConditionFunc { + return (user, target, move) => { + // includeParty will be true for Assist, false for Sleep Talk + let allies: Pokemon[]; + if (this.includeParty) { + allies = user.isPlayer() ? globalScene.getPlayerParty().filter(p => p !== user) : globalScene.getEnemyParty().filter(p => p !== user); + } else { + allies = [ user ]; } - const targets = moveTargets.multiple || moveTargets.targets.length === 1 - ? moveTargets.targets - : moveTargets.targets.indexOf(target.getBattlerIndex()) > -1 - ? [ target.getBattlerIndex() ] - : [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; - user.getMoveQueue().push({ move: moveId, targets: targets, ignorePP: true }); - user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, new PokemonMove(moveId, 0, 0, true), true)); - initMoveAnim(user.scene, moveId).then(() => { - loadMoveAnimAssets(user.scene, [ moveId ], true) - .then(() => resolve(true)); - }); - }); + const partyMoveset = allies.map(p => p.moveset).flat(); + const moves = partyMoveset.filter(m => !this.invalidMoves.has(m!.moveId) && !m!.getMove().name.endsWith(" (N)")); + if (moves.length === 0) { + return false; + } + + this.moveId = moves[user.randSeedInt(moves.length)]!.moveId; + return true; + }; } } export class NaturePowerAttr extends OverrideMoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - let moveId; - switch (user.scene.arena.getTerrainType()) { - // this allows terrains to 'override' the biome move - case TerrainType.NONE: - switch (user.scene.arena.biomeType) { - case Biome.TOWN: - moveId = Moves.ROUND; - break; - case Biome.METROPOLIS: - moveId = Moves.TRI_ATTACK; - break; - case Biome.SLUM: - moveId = Moves.SLUDGE_BOMB; - break; - case Biome.PLAINS: - moveId = Moves.SILVER_WIND; - break; - case Biome.GRASS: - moveId = Moves.GRASS_KNOT; - break; - case Biome.TALL_GRASS: - moveId = Moves.POLLEN_PUFF; - break; - case Biome.MEADOW: - moveId = Moves.GIGA_DRAIN; - break; - case Biome.FOREST: - moveId = Moves.BUG_BUZZ; - break; - case Biome.JUNGLE: - moveId = Moves.LEAF_STORM; - break; - case Biome.SEA: - moveId = Moves.HYDRO_PUMP; - break; - case Biome.SWAMP: - moveId = Moves.MUD_BOMB; - break; - case Biome.BEACH: - moveId = Moves.SCALD; - break; - case Biome.LAKE: - moveId = Moves.BUBBLE_BEAM; - break; - case Biome.SEABED: - moveId = Moves.BRINE; - break; - case Biome.ISLAND: - moveId = Moves.LEAF_TORNADO; - break; - case Biome.MOUNTAIN: - moveId = Moves.AIR_SLASH; - break; - case Biome.BADLANDS: - moveId = Moves.EARTH_POWER; - break; - case Biome.DESERT: - moveId = Moves.SCORCHING_SANDS; - break; - case Biome.WASTELAND: - moveId = Moves.DRAGON_PULSE; - break; - case Biome.CONSTRUCTION_SITE: - moveId = Moves.STEEL_BEAM; - break; - case Biome.CAVE: - moveId = Moves.POWER_GEM; - break; - case Biome.ICE_CAVE: - moveId = Moves.ICE_BEAM; - break; - case Biome.SNOWY_FOREST: - moveId = Moves.FROST_BREATH; - break; - case Biome.VOLCANO: - moveId = Moves.LAVA_PLUME; - break; - case Biome.GRAVEYARD: - moveId = Moves.SHADOW_BALL; - break; - case Biome.RUINS: - moveId = Moves.ANCIENT_POWER; - break; - case Biome.TEMPLE: - moveId = Moves.EXTRASENSORY; - break; - case Biome.DOJO: - moveId = Moves.FOCUS_BLAST; - break; - case Biome.FAIRY_CAVE: - moveId = Moves.ALLURING_VOICE; - break; - case Biome.ABYSS: - moveId = Moves.OMINOUS_WIND; - break; - case Biome.SPACE: - moveId = Moves.DRACO_METEOR; - break; - case Biome.FACTORY: - moveId = Moves.FLASH_CANNON; - break; - case Biome.LABORATORY: - moveId = Moves.ZAP_CANNON; - break; - case Biome.POWER_PLANT: - moveId = Moves.CHARGE_BEAM; - break; - case Biome.END: - moveId = Moves.ETERNABEAM; - break; - } - break; - case TerrainType.MISTY: - moveId = Moves.MOONBLAST; - break; - case TerrainType.ELECTRIC: - moveId = Moves.THUNDERBOLT; - break; - case TerrainType.GRASSY: - moveId = Moves.ENERGY_BALL; - break; - case TerrainType.PSYCHIC: - moveId = Moves.PSYCHIC; - break; - default: - // Just in case there's no match - moveId = Moves.TRI_ATTACK; - break; - } + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + let moveId; + switch (globalScene.arena.getTerrainType()) { + // this allows terrains to 'override' the biome move + case TerrainType.NONE: + switch (globalScene.arena.biomeType) { + case Biome.TOWN: + moveId = Moves.ROUND; + break; + case Biome.METROPOLIS: + moveId = Moves.TRI_ATTACK; + break; + case Biome.SLUM: + moveId = Moves.SLUDGE_BOMB; + break; + case Biome.PLAINS: + moveId = Moves.SILVER_WIND; + break; + case Biome.GRASS: + moveId = Moves.GRASS_KNOT; + break; + case Biome.TALL_GRASS: + moveId = Moves.POLLEN_PUFF; + break; + case Biome.MEADOW: + moveId = Moves.GIGA_DRAIN; + break; + case Biome.FOREST: + moveId = Moves.BUG_BUZZ; + break; + case Biome.JUNGLE: + moveId = Moves.LEAF_STORM; + break; + case Biome.SEA: + moveId = Moves.HYDRO_PUMP; + break; + case Biome.SWAMP: + moveId = Moves.MUD_BOMB; + break; + case Biome.BEACH: + moveId = Moves.SCALD; + break; + case Biome.LAKE: + moveId = Moves.BUBBLE_BEAM; + break; + case Biome.SEABED: + moveId = Moves.BRINE; + break; + case Biome.ISLAND: + moveId = Moves.LEAF_TORNADO; + break; + case Biome.MOUNTAIN: + moveId = Moves.AIR_SLASH; + break; + case Biome.BADLANDS: + moveId = Moves.EARTH_POWER; + break; + case Biome.DESERT: + moveId = Moves.SCORCHING_SANDS; + break; + case Biome.WASTELAND: + moveId = Moves.DRAGON_PULSE; + break; + case Biome.CONSTRUCTION_SITE: + moveId = Moves.STEEL_BEAM; + break; + case Biome.CAVE: + moveId = Moves.POWER_GEM; + break; + case Biome.ICE_CAVE: + moveId = Moves.ICE_BEAM; + break; + case Biome.SNOWY_FOREST: + moveId = Moves.FROST_BREATH; + break; + case Biome.VOLCANO: + moveId = Moves.LAVA_PLUME; + break; + case Biome.GRAVEYARD: + moveId = Moves.SHADOW_BALL; + break; + case Biome.RUINS: + moveId = Moves.ANCIENT_POWER; + break; + case Biome.TEMPLE: + moveId = Moves.EXTRASENSORY; + break; + case Biome.DOJO: + moveId = Moves.FOCUS_BLAST; + break; + case Biome.FAIRY_CAVE: + moveId = Moves.ALLURING_VOICE; + break; + case Biome.ABYSS: + moveId = Moves.OMINOUS_WIND; + break; + case Biome.SPACE: + moveId = Moves.DRACO_METEOR; + break; + case Biome.FACTORY: + moveId = Moves.FLASH_CANNON; + break; + case Biome.LABORATORY: + moveId = Moves.ZAP_CANNON; + break; + case Biome.POWER_PLANT: + moveId = Moves.CHARGE_BEAM; + break; + case Biome.END: + moveId = Moves.ETERNABEAM; + break; + } + break; + case TerrainType.MISTY: + moveId = Moves.MOONBLAST; + break; + case TerrainType.ELECTRIC: + moveId = Moves.THUNDERBOLT; + break; + case TerrainType.GRASSY: + moveId = Moves.ENERGY_BALL; + break; + case TerrainType.PSYCHIC: + moveId = Moves.PSYCHIC; + break; + default: + // Just in case there's no match + moveId = Moves.TRI_ATTACK; + break; + } - user.getMoveQueue().push({ move: moveId, targets: [ target.getBattlerIndex() ], ignorePP: true }); - user.scene.unshiftPhase(new MovePhase(user.scene, user, [ target.getBattlerIndex() ], new PokemonMove(moveId, 0, 0, true), true)); - initMoveAnim(user.scene, moveId).then(() => { - loadMoveAnimAssets(user.scene, [ moveId ], true) - .then(() => resolve(true)); - }); - }); + user.getMoveQueue().push({ move: moveId, targets: [ target.getBattlerIndex() ], ignorePP: true }); + globalScene.unshiftPhase(new LoadMoveAnimPhase(moveId)); + globalScene.unshiftPhase(new MovePhase(user, [ target.getBattlerIndex() ], new PokemonMove(moveId, 0, 0, true), true)); + return true; } } -const lastMoveCopiableCondition: MoveConditionFunc = (user, target, move) => { - const copiableMove = user.scene.currentBattle.lastMove; - - if (!copiableMove) { - return false; +/** + * Attribute used to copy a previously-used move. + * Used for {@linkcode Moves.COPYCAT} and {@linkcode Moves.MIRROR_MOVE} + * @see {@linkcode apply} for move selection and move call + * @extends CallMoveAttr to call a selected move + */ +export class CopyMoveAttr extends CallMoveAttr { + private mirrorMove: boolean; + constructor(mirrorMove: boolean, invalidMoves: ReadonlySet = new Set()) { + super(); + this.mirrorMove = mirrorMove; + this.invalidMoves = invalidMoves; } - if (allMoves[copiableMove].isChargingMove()) { - return false; - } - - // TODO: Add last turn of Bide - - return true; -}; - -export class CopyMoveAttr extends OverrideMoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const lastMove = user.scene.currentBattle.lastMove; + this.hasTarget = this.mirrorMove; + const lastMove = this.mirrorMove ? target.getLastXMoves()[0].move : globalScene.currentBattle.lastMove; + return super.apply(user, target, allMoves[lastMove], args); + } - const moveTargets = getMoveTargets(user, lastMove); - if (!moveTargets.targets.length) { - return false; + getCondition(): MoveConditionFunc { + return (user, target, move) => { + if (this.mirrorMove) { + return target.getMoveHistory().length !== 0; + } else { + const lastMove = globalScene.currentBattle.lastMove; + return lastMove !== undefined && !this.invalidMoves.has(lastMove); + } + }; + } +} + +/** + * 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)!; + // If the last move used can hit more than one target or has variable targets, + // re-compute the targets for the attack + // (mainly for alternating double/single battle shenanigans) + // Rampaging moves (e.g. Outrage) are not included due to being incompatible with Instruct + // TODO: Fix this once dragon darts gets smart targeting + let moveTargets = movesetMove.getMove().isMultiTarget() ? getMoveTargets(target, lastMove.move).targets : lastMove.targets; + + /** In the event the instructed move's only target is a fainted opponent, redirect it to an alive ally if possible + Normally, all yet-unexecuted move phases would swap over when the enemy in question faints + (see `redirectPokemonMoves` in `battle-scene.ts`), + but since instruct adds a new move phase pre-emptively, we need to handle this interaction manually. + */ + const firstTarget = globalScene.getField()[moveTargets[0]]; + if (globalScene.currentBattle.double && moveTargets.length === 1 && firstTarget.isFainted() && firstTarget !== target.getAlly()) { + const ally = firstTarget.getAlly(); + if (ally.isActive()) { // ally exists, is not dead and can sponge the blast + moveTargets = [ ally.getBattlerIndex() ]; + } } - const targets = moveTargets.multiple || moveTargets.targets.length === 1 - ? moveTargets.targets - : moveTargets.targets.indexOf(target.getBattlerIndex()) > -1 - ? [ target.getBattlerIndex() ] - : [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; - user.getMoveQueue().push({ move: lastMove, targets: targets, ignorePP: true }); - - user.scene.unshiftPhase(new MovePhase(user.scene, user as PlayerPokemon, targets, new PokemonMove(lastMove, 0, 0, true), true)); - + globalScene.queueMessage(i18next.t("moveTriggers:instructingMove", { + userPokemonName: getPokemonNameWithAffix(user), + targetPokemonName: getPokemonNameWithAffix(target) + })); + target.getMoveQueue().unshift({ move: lastMove.move, targets: moveTargets, ignorePP: false }); + target.turnData.extraTurns++; + globalScene.appendToPhase(new MovePhase(target, moveTargets, movesetMove), MoveEndPhase); return true; } getCondition(): MoveConditionFunc { - return lastMoveCopiableCondition; + return (user, target, move) => { + const lastMove = target.getLastXMoves(-1).find(m => m.move !== Moves.NONE); + const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove?.move); + const uninstructableMoves = [ + // 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 (!lastMove?.move // no move to instruct + || !movesetMove // called move not in target's moveset (forgetting the move, etc.) + || movesetMove.ppUsed === movesetMove.getMovePp() // move out of pp + || allMoves[lastMove.move].isChargingMove() // called move is a charging/recharging move + || uninstructableMoves.includes(lastMove.move)) { // called move is in the banlist + return false; + } + return true; + }; + } + + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { + // TODO: Make the AI actually 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; } } @@ -6266,8 +7113,8 @@ export class ReducePpMoveAttr extends MoveEffectAttr { movesetMove!.ppUsed = Math.min((movesetMove?.ppUsed!) + this.reduction, movesetMove?.getMovePp()!); // TODO: is the bang correct? const message = i18next.t("battle:ppReduced", { targetName: getPokemonNameWithAffix(target), moveName: movesetMove?.getName(), reduction: (movesetMove?.ppUsed!) - lastPpUsed }); // TODO: is the bang correct? - user.scene.eventTarget.dispatchEvent(new MoveUsedEvent(target?.id, movesetMove?.getMove()!, movesetMove?.ppUsed!)); // TODO: are these bangs correct? - user.scene.queueMessage(message); + globalScene.eventTarget.dispatchEvent(new MoveUsedEvent(target?.id, movesetMove?.getMove()!, movesetMove?.ppUsed!)); // TODO: are these bangs correct? + globalScene.queueMessage(message); return true; } @@ -6378,7 +7225,7 @@ export class MovesetCopyMoveAttr extends OverrideMoveEffectAttr { user.summonData.moveset = user.getMoveset().slice(0); user.summonData.moveset[thisMoveIndex] = new PokemonMove(copiedMove.id, 0, 0); - user.scene.queueMessage(i18next.t("moveTriggers:copiedMove", { pokemonName: getPokemonNameWithAffix(user), moveName: copiedMove.name })); + globalScene.queueMessage(i18next.t("moveTriggers:copiedMove", { pokemonName: getPokemonNameWithAffix(user), moveName: copiedMove.name })); return true; } @@ -6414,7 +7261,8 @@ export class SketchAttr extends MoveEffectAttr { return false; } - const targetMove = target.getMoveHistory().filter(m => !m.virtual).at(-1); + const targetMove = target.getLastXMoves(-1) + .find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual); if (!targetMove) { return false; } @@ -6427,7 +7275,7 @@ export class SketchAttr extends MoveEffectAttr { user.setMove(sketchIndex, sketchedMove.id); - user.scene.queueMessage(i18next.t("moveTriggers:sketchedMove", { pokemonName: getPokemonNameWithAffix(user), moveName: sketchedMove.name })); + globalScene.queueMessage(i18next.t("moveTriggers:sketchedMove", { pokemonName: getPokemonNameWithAffix(user), moveName: sketchedMove.name })); return true; } @@ -6472,7 +7320,7 @@ export class AbilityChangeAttr extends MoveEffectAttr { public ability: Abilities; constructor(ability: Abilities, selfTarget?: boolean) { - super(selfTarget, MoveEffectTrigger.HIT); + super(selfTarget, { trigger: MoveEffectTrigger.HIT }); this.ability = ability; } @@ -6484,10 +7332,10 @@ export class AbilityChangeAttr extends MoveEffectAttr { const moveTarget = this.selfTarget ? user : target; - moveTarget.summonData.ability = this.ability; - user.scene.triggerPokemonFormChange(moveTarget, SpeciesFormChangeRevertWeatherFormTrigger); + globalScene.queueMessage(i18next.t("moveTriggers:acquiredAbility", { pokemonName: getPokemonNameWithAffix((this.selfTarget ? user : target)), abilityName: allAbilities[this.ability].name })); - user.scene.queueMessage(i18next.t("moveTriggers:acquiredAbility", { pokemonName: getPokemonNameWithAffix((this.selfTarget ? user : target)), abilityName: allAbilities[this.ability].name })); + moveTarget.setTempAbility(allAbilities[this.ability]); + globalScene.triggerPokemonFormChange(moveTarget, SpeciesFormChangeRevertWeatherFormTrigger); return true; } @@ -6501,7 +7349,7 @@ export class AbilityCopyAttr extends MoveEffectAttr { public copyToPartner: boolean; constructor(copyToPartner: boolean = false) { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); this.copyToPartner = copyToPartner; } @@ -6511,13 +7359,13 @@ export class AbilityCopyAttr extends MoveEffectAttr { return false; } - user.summonData.ability = target.getAbility().id; + globalScene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name })); - user.scene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name })); + user.setTempAbility(target.getAbility()); - if (this.copyToPartner && user.scene.currentBattle?.double && user.getAlly().hp) { - user.getAlly().summonData.ability = target.getAbility().id; - user.getAlly().scene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", { pokemonName: getPokemonNameWithAffix(user.getAlly()), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name })); + if (this.copyToPartner && globalScene.currentBattle?.double && user.getAlly().hp) { + globalScene.queueMessage(i18next.t("moveTriggers:copiedTargetAbility", { pokemonName: getPokemonNameWithAffix(user.getAlly()), targetName: getPokemonNameWithAffix(target), abilityName: allAbilities[target.getAbility().id].name })); + user.getAlly().setTempAbility(target.getAbility()); } return true; @@ -6526,7 +7374,7 @@ export class AbilityCopyAttr extends MoveEffectAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { let ret = !target.getAbility().hasAttr(UncopiableAbilityAbAttr) && !user.getAbility().hasAttr(UnsuppressableAbilityAbAttr); - if (this.copyToPartner && user.scene.currentBattle?.double) { + if (this.copyToPartner && globalScene.currentBattle?.double) { ret = ret && (!user.getAlly().hp || !user.getAlly().getAbility().hasAttr(UnsuppressableAbilityAbAttr)); } else { ret = ret && user.getAbility().id !== target.getAbility().id; @@ -6540,7 +7388,7 @@ export class AbilityGiveAttr extends MoveEffectAttr { public copyToPartner: boolean; constructor() { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -6548,9 +7396,9 @@ export class AbilityGiveAttr extends MoveEffectAttr { return false; } - target.summonData.ability = user.getAbility().id; + globalScene.queueMessage(i18next.t("moveTriggers:acquiredAbility", { pokemonName: getPokemonNameWithAffix(target), abilityName: allAbilities[user.getAbility().id].name })); - user.scene.queueMessage(i18next.t("moveTriggers:acquiredAbility", { pokemonName: getPokemonNameWithAffix(target), abilityName: allAbilities[user.getAbility().id].name })); + target.setTempAbility(user.getAbility()); return true; } @@ -6566,15 +7414,14 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr { return false; } - const tempAbilityId = user.getAbility().id; - user.summonData.ability = target.getAbility().id; - target.summonData.ability = tempAbilityId; + const tempAbility = user.getAbility(); - user.scene.queueMessage(i18next.t("moveTriggers:swappedAbilitiesWithTarget", { pokemonName: getPokemonNameWithAffix(user) })); + globalScene.queueMessage(i18next.t("moveTriggers:swappedAbilitiesWithTarget", { pokemonName: getPokemonNameWithAffix(user) })); + + user.setTempAbility(target.getAbility()); + target.setTempAbility(tempAbility); // Swaps Forecast/Flower Gift from Castform/Cherrim - user.scene.arena.triggerWeatherBasedFormChangesToNormal(); - // Swaps Forecast/Flower Gift to Castform/Cherrim (edge case) - user.scene.arena.triggerWeatherBasedFormChanges(); + globalScene.arena.triggerWeatherBasedFormChangesToNormal(); return true; } @@ -6599,10 +7446,11 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { return false; } - target.summonData.abilitySuppressed = true; - target.scene.arena.triggerWeatherBasedFormChangesToNormal(); + globalScene.queueMessage(i18next.t("moveTriggers:suppressAbilities", { pokemonName: getPokemonNameWithAffix(target) })); - target.scene.queueMessage(i18next.t("moveTriggers:suppressAbilities", { pokemonName: getPokemonNameWithAffix(target) })); + target.suppressAbility(); + + globalScene.arena.triggerWeatherBasedFormChangesToNormal(); return true; } @@ -6642,49 +7490,19 @@ export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr { } } +/** + * Used by Transform + */ export class TransformAttr extends MoveEffectAttr { - async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } - const promises: Promise[] = []; - user.summonData.speciesForm = target.getSpeciesForm(); - user.summonData.fusionSpeciesForm = target.getFusionSpeciesForm(); - user.summonData.ability = target.getAbility().id; - user.summonData.gender = target.getGender(); - user.summonData.fusionGender = target.getFusionGender(); + globalScene.unshiftPhase(new PokemonTransformPhase(user.getBattlerIndex(), target.getBattlerIndex())); - // Power Trick's effect will not preserved after using Transform - user.removeTag(BattlerTagType.POWER_TRICK); + globalScene.queueMessage(i18next.t("moveTriggers:transformedIntoTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); - // Copy all stats (except HP) - for (const s of EFFECTIVE_STATS) { - user.setStat(s, target.getStat(s, false), false); - } - - // Copy all stat stages - for (const s of BATTLE_STATS) { - user.setStatStage(s, target.getStatStage(s)); - } - - user.summonData.moveset = target.getMoveset().map(m => { - const pp = m?.getMove().pp ?? 0; - // if PP value is less than 5, do nothing. If greater, we need to reduce the value to 5 using a negative ppUp value. - const ppUp = pp <= 5 ? 0 : (5 - pp) / Math.max(Math.floor(pp / 5), 1); - return new PokemonMove(m?.moveId!, 0, ppUp); - }); - user.summonData.types = target.getTypes(); - promises.push(user.updateInfo()); - - user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); - - promises.push(user.loadAssets(false).then(() => { - user.playAnim(); - user.updateInfo(); - })); - - await Promise.all(promises); return true; } } @@ -6720,7 +7538,7 @@ export class SwapStatAttr extends MoveEffectAttr { user.setStat(this.stat, target.getStat(this.stat, false), false); target.setStat(this.stat, temp, false); - user.scene.queueMessage(i18next.t("moveTriggers:switchedStat", { + globalScene.queueMessage(i18next.t("moveTriggers:switchedStat", { pokemonName: getPokemonNameWithAffix(user), stat: i18next.t(getStatKey(this.stat)), })); @@ -6766,7 +7584,7 @@ export class ShiftStatAttr extends MoveEffectAttr { user.setStat(this.statToSwitch, secondStat, false); user.setStat(this.statToSwitchWith, firstStat, false); - user.scene.queueMessage(i18next.t("moveTriggers:shiftedStats", { + globalScene.queueMessage(i18next.t("moveTriggers:shiftedStats", { pokemonName: getPokemonNameWithAffix(user), statToSwitch: i18next.t(getStatKey(this.statToSwitch)), statToSwitchWith: i18next.t(getStatKey(this.statToSwitchWith)) @@ -6782,7 +7600,7 @@ export class ShiftStatAttr extends MoveEffectAttr { * @param move n/a * @returns number of points to add to the user's benefit score */ - override getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + override getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return user.getStat(this.statToSwitchWith, false) > user.getStat(this.statToSwitch, false) ? 10 : 0; } } @@ -6825,7 +7643,7 @@ export class AverageStatsAttr extends MoveEffectAttr { target.setStat(s, avg, false); } - user.scene.queueMessage(i18next.t(this.msgKey, { pokemonName: getPokemonNameWithAffix(user) })); + globalScene.queueMessage(i18next.t(this.msgKey, { pokemonName: getPokemonNameWithAffix(user) })); return true; } @@ -6834,7 +7652,7 @@ export class AverageStatsAttr extends MoveEffectAttr { } export class DiscourageFrequentUseAttr extends MoveAttr { - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { const lastMoves = user.getLastXMoves(4); console.log(lastMoves); for (let m = 0; m < lastMoves.length; m++) { @@ -6849,12 +7667,12 @@ export class DiscourageFrequentUseAttr extends MoveAttr { export class MoneyAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT, true); + super(true, { trigger: MoveEffectTrigger.HIT, firstHitOnly: true }); } apply(user: Pokemon, target: Pokemon, move: Move): boolean { - user.scene.currentBattle.moneyScattered += user.scene.getWaveMoneyAmount(0.2); - user.scene.queueMessage(i18next.t("moveTriggers:coinsScatteredEverywhere")); + globalScene.currentBattle.moneyScattered += globalScene.getWaveMoneyAmount(0.2); + globalScene.queueMessage(i18next.t("moveTriggers:coinsScatteredEverywhere")); return true; } } @@ -6866,7 +7684,7 @@ export class MoneyAttr extends MoveEffectAttr { */ export class DestinyBondAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.PRE_APPLY); + super(true, { trigger: MoveEffectTrigger.PRE_APPLY }); } /** @@ -6878,7 +7696,7 @@ export class DestinyBondAttr extends MoveEffectAttr { * @returns true */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - user.scene.queueMessage(`${i18next.t("moveTriggers:tryingToTakeFoeDown", { pokemonName: getPokemonNameWithAffix(user) })}`); + globalScene.queueMessage(`${i18next.t("moveTriggers:tryingToTakeFoeDown", { pokemonName: getPokemonNameWithAffix(user) })}`); user.addTag(BattlerTagType.DESTINY_BOND, undefined, move.id, user.id); return true; } @@ -6916,7 +7734,7 @@ export class StatusIfBoostedAttr extends MoveEffectAttr { public effect: StatusEffect; constructor(effect: StatusEffect) { - super(true, MoveEffectTrigger.HIT); + super(true, { trigger: MoveEffectTrigger.HIT }); this.effect = effect; } @@ -6950,31 +7768,6 @@ export class LastResortAttr extends MoveAttr { } } - -/** - * The move only works if the target has a transferable held item - * @extends MoveAttr - * @see {@linkcode getCondition} - */ -export class AttackedByItemAttr extends MoveAttr { - /** - * @returns the {@linkcode MoveConditionFunc} for this {@linkcode Move} - */ - getCondition(): MoveConditionFunc { - return (user: Pokemon, target: Pokemon, move: Move) => { - const heldItems = target.getHeldItems().filter(i => i.isTransferable); - if (heldItems.length === 0) { - return false; - } - - const itemName = heldItems[0]?.type?.name ?? "item"; - target.scene.queueMessage(i18next.t("moveTriggers:attackedByItem", { pokemonName: getPokemonNameWithAffix(target), itemName: itemName })); - - return true; - }; - } -} - export class VariableTargetAttr extends MoveAttr { private targetChangeFunc: (user: Pokemon, target: Pokemon, move: Move) => number; @@ -7007,30 +7800,80 @@ export class AfterYouAttr extends MoveEffectAttr { * @returns true */ override apply(user: Pokemon, target: Pokemon, _move: Move, _args: any[]): boolean { - user.scene.queueMessage(i18next.t("moveTriggers:afterYou", { targetName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:afterYou", { targetName: getPokemonNameWithAffix(target) })); //Will find next acting phase of the targeted pokémon, delete it and queue it next on successful delete. - const nextAttackPhase = target.scene.findPhase((phase) => phase.pokemon === target); - if (nextAttackPhase && target.scene.tryRemovePhase((phase: MovePhase) => phase.pokemon === target)) { - target.scene.prependToPhase(new MovePhase(target.scene, target, [ ...nextAttackPhase.targets ], nextAttackPhase.move), MovePhase); + const nextAttackPhase = globalScene.findPhase((phase) => phase.pokemon === target); + if (nextAttackPhase && globalScene.tryRemovePhase((phase: MovePhase) => phase.pokemon === target)) { + globalScene.prependToPhase(new MovePhase(target, [ ...nextAttackPhase.targets ], nextAttackPhase.move), MovePhase); } return true; } } -const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY); +/** + * Move effect to force the target to move last, ignoring priority. + * If applied to multiple targets, they move in speed order after all other moves. + * @extends MoveEffectAttr + */ +export class ForceLastAttr extends MoveEffectAttr { + /** + * Forces the target of this move to move last. + * + * @param user {@linkcode Pokemon} that is using the move. + * @param target {@linkcode Pokemon} that will be forced to move last. + * @param move {@linkcode Move} {@linkcode Moves.QUASH} + * @param _args N/A + * @returns true + */ + override apply(user: Pokemon, target: Pokemon, _move: Move, _args: any[]): boolean { + globalScene.queueMessage(i18next.t("moveTriggers:forceLast", { targetPokemonName: getPokemonNameWithAffix(target) })); + + const targetMovePhase = globalScene.findPhase((phase) => phase.pokemon === target); + if (targetMovePhase && !targetMovePhase.isForcedLast() && globalScene.tryRemovePhase((phase: MovePhase) => phase.pokemon === target)) { + // Finding the phase to insert the move in front of - + // Either the end of the turn or in front of another, slower move which has also been forced last + const prependPhase = globalScene.findPhase((phase) => + [ MovePhase, MoveEndPhase ].every(cls => !(phase instanceof cls)) + || (phase instanceof MovePhase) && phaseForcedSlower(phase, target, !!globalScene.arena.getTag(ArenaTagType.TRICK_ROOM)) + ); + if (prependPhase) { + globalScene.phaseQueue.splice( + globalScene.phaseQueue.indexOf(prependPhase), + 0, + new MovePhase(target, [ ...targetMovePhase.targets ], targetMovePhase.move, false, false, false, true) + ); + } + } + return true; + } +} + +/** Returns whether a {@linkcode MovePhase} has been forced last and the corresponding pokemon is slower than {@linkcode target} */ +const phaseForcedSlower = (phase: MovePhase, target: Pokemon, trickRoom: boolean): boolean => { + let slower: boolean; + // quashed pokemon still have speed ties + if (phase.pokemon.getEffectiveStat(Stat.SPD) === target.getEffectiveStat(Stat.SPD)) { + slower = !!target.randSeedInt(2); + } else { + slower = !trickRoom ? phase.pokemon.getEffectiveStat(Stat.SPD) < target.getEffectiveStat(Stat.SPD) : phase.pokemon.getEffectiveStat(Stat.SPD) > target.getEffectiveStat(Stat.SPD); + } + return phase.isForcedLast() && slower; +}; + +const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !globalScene.arena.getTag(ArenaTagType.GRAVITY); const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune(); -const failIfSingleBattle: MoveConditionFunc = (user, target, move) => user.scene.currentBattle.double; +const failIfSingleBattle: MoveConditionFunc = (user, target, move) => globalScene.currentBattle.double; const failIfDampCondition: MoveConditionFunc = (user, target, move) => { const cancelled = new Utils.BooleanHolder(false); - user.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); + globalScene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); // Queue a message if an ability prevented usage of the move if (cancelled.value) { - user.scene.queueMessage(i18next.t("moveTriggers:cannotUseMove", { pokemonName: getPokemonNameWithAffix(user), moveName: move.name })); + globalScene.queueMessage(i18next.t("moveTriggers:cannotUseMove", { pokemonName: getPokemonNameWithAffix(user), moveName: move.name })); } return !cancelled.value; }; @@ -7039,48 +7882,77 @@ const userSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target: const targetSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => target.status?.effect === StatusEffect.SLEEP || target.hasAbility(Abilities.COMATOSE); -const failIfLastCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => user.scene.phaseQueue.find(phase => phase instanceof MovePhase) !== undefined; +const failIfLastCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => globalScene.phaseQueue.find(phase => phase instanceof MovePhase) !== undefined; + +const failIfLastInPartyCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => { + const party: Pokemon[] = user.isPlayer() ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); + return party.some(pokemon => pokemon.isActive() && !pokemon.isOnField()); +}; + +const failIfGhostTypeCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => !target.isOfType(PokemonType.GHOST); + +const failIfNoTargetHeldItemsCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => target.getHeldItems().filter(i => i.isTransferable)?.length > 0; + +const attackedByItemMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { + const heldItems = target.getHeldItems().filter(i => i.isTransferable); + if (heldItems.length === 0) { + return ""; + } + const itemName = heldItems[0]?.type?.name ?? "item"; + const message: string = i18next.t("moveTriggers:attackedByItem", { pokemonName: getPokemonNameWithAffix(target), itemName: itemName }); + return message; +}; export type MoveAttrFilter = (attr: MoveAttr) => boolean; -function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): Promise { - return new Promise(resolve => { - const attrPromises: Promise[] = []; - const moveAttrs = move.attrs.filter(a => attrFilter(a)); - for (const attr of moveAttrs) { - const result = attr.apply(user, target, move, args); - if (result instanceof Promise) { - attrPromises.push(result); - } - } - Promise.allSettled(attrPromises).then(() => resolve()); - }); +function applyMoveAttrsInternal( + attrFilter: MoveAttrFilter, + user: Pokemon | null, + target: Pokemon | null, + move: Move, + args: any[], +): void { + move.attrs.filter((attr) => attrFilter(attr)).forEach((attr) => attr.apply(user, target, move, args)); } -function applyMoveChargeAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, args: any[]): Promise { - return new Promise(resolve => { - const chargeAttrPromises: Promise[] = []; - const chargeMoveAttrs = move.chargeAttrs.filter(a => attrFilter(a)); - for (const attr of chargeMoveAttrs) { - const result = attr.apply(user, target, move, args); - if (result instanceof Promise) { - chargeAttrPromises.push(result); - } - } - Promise.allSettled(chargeAttrPromises).then(() => resolve()); - }); +function applyMoveChargeAttrsInternal( + attrFilter: MoveAttrFilter, + user: Pokemon | null, + target: Pokemon | null, + move: ChargingMove, + args: any[], +): void { + move.chargeAttrs.filter((attr) => attrFilter(attr)).forEach((attr) => attr.apply(user, target, move, args)); } -export function applyMoveAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: Move, ...args: any[]): Promise { - return applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); +export function applyMoveAttrs( + attrType: Constructor, + user: Pokemon | null, + target: Pokemon | null, + move: Move, + ...args: any[] +): void { + applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } -export function applyFilteredMoveAttrs(attrFilter: MoveAttrFilter, user: Pokemon, target: Pokemon | null, move: Move, ...args: any[]): Promise { - return applyMoveAttrsInternal(attrFilter, user, target, move, args); +export function applyFilteredMoveAttrs( + attrFilter: MoveAttrFilter, + user: Pokemon, + target: Pokemon | null, + move: Move, + ...args: any[] +): void { + applyMoveAttrsInternal(attrFilter, user, target, move, args); } -export function applyMoveChargeAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, ...args: any[]): Promise { - return applyMoveChargeAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); +export function applyMoveChargeAttrs( + attrType: Constructor, + user: Pokemon | null, + target: Pokemon | null, + move: ChargingMove, + ...args: any[] +): void { + applyMoveChargeAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } export class MoveCondition { @@ -7094,7 +7966,7 @@ export class MoveCondition { return this.func(user, target, move); } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return 0; } } @@ -7104,11 +7976,32 @@ export class FirstMoveCondition extends MoveCondition { super((user, target, move) => user.battleSummonData?.waveTurnCount === 1); } - getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { return this.apply(user, target, move) ? 10 : -20; } } +/** + * Condition used by the move {@link https://bulbapedia.bulbagarden.net/wiki/Upper_Hand_(move) | Upper Hand}. + * Moves with this condition are only successful when the target has selected + * a high-priority attack (after factoring in priority-boosting effects) and + * hasn't moved yet this turn. + */ +export class UpperHandCondition extends MoveCondition { + constructor() { + super((user, target, move) => { + const targetCommand = globalScene.currentBattle.turnCommands[target.getBattlerIndex()]; + + return !!targetCommand + && targetCommand.command === Command.FIGHT + && !target.turnData.acted + && !!targetCommand.move?.move + && allMoves[targetCommand.move.move].category !== MoveCategory.STATUS + && allMoves[targetCommand.move.move].getPriority(target) > 0; + }); + } +} + export class hitsSameTypeAttr extends VariableMoveTypeMultiplierAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const multiplier = args[0] as Utils.NumberHolder; @@ -7152,17 +8045,17 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr { } const moveData = allMoves[targetMove.move]; - if (moveData.type === Type.STELLAR || moveData.type === Type.UNKNOWN) { + if (moveData.type === PokemonType.STELLAR || moveData.type === PokemonType.UNKNOWN) { return false; } const userTypes = user.getTypes(); - const validTypes = this.getTypeResistances(user.scene.gameMode, moveData.type).filter(t => !userTypes.includes(t)); // valid types are ones that are not already the user's types + const validTypes = this.getTypeResistances(globalScene.gameMode, moveData.type).filter(t => !userTypes.includes(t)); // valid types are ones that are not already the user's types if (!validTypes.length) { return false; } const type = validTypes[user.randSeedInt(validTypes.length)]; user.summonData.types = [ type ]; - user.scene.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: Utils.toReadableString(Type[type]) })); + globalScene.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: Utils.toReadableString(PokemonType[type]) })); user.updateInfo(); return true; @@ -7172,10 +8065,10 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr { * Retrieve the types resisting a given type. Used by Conversion 2 * @returns An array populated with Types, or an empty array if no resistances exist (Unknown or Stellar type) */ - getTypeResistances(gameMode: GameMode, type: number): Type[] { - const typeResistances: Type[] = []; + getTypeResistances(gameMode: GameMode, type: number): PokemonType[] { + const typeResistances: PokemonType[] = []; - for (let i = 0; i < Object.keys(Type).length; i++) { + for (let i = 0; i < Object.keys(PokemonType).length; i++) { const multiplier = new NumberHolder(1); multiplier.value = getTypeDamageMultiplier(type, i); applyChallenges(gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier); @@ -7221,25 +8114,34 @@ export class ExposedMoveAttr extends AddBattlerTagAttr { return false; } - user.scene.queueMessage(i18next.t("moveTriggers:exposedMove", { pokemonName: getPokemonNameWithAffix(user), targetPokemonName: getPokemonNameWithAffix(target) })); + globalScene.queueMessage(i18next.t("moveTriggers:exposedMove", { pokemonName: getPokemonNameWithAffix(user), targetPokemonName: getPokemonNameWithAffix(target) })); return true; } } -const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(Type.UNKNOWN); +const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(PokemonType.UNKNOWN); export type MoveTargetSet = { targets: BattlerIndex[]; multiple: boolean; }; -export function getMoveTargets(user: Pokemon, move: Moves): MoveTargetSet { +export function getMoveTargets(user: Pokemon, move: Moves, replaceTarget?: MoveTarget): MoveTargetSet { const variableTarget = new Utils.NumberHolder(0); user.getOpponents().forEach(p => applyMoveAttrs(VariableTargetAttr, user, p, allMoves[move], variableTarget)); - const moveTarget = allMoves[move].hasAttr(VariableTargetAttr) ? variableTarget.value : move ? allMoves[move].moveTarget : move === undefined ? MoveTarget.NEAR_ENEMY : []; + let moveTarget: MoveTarget | undefined; + if (allMoves[move].hasAttr(VariableTargetAttr)) { + moveTarget = variableTarget.value; + } else if (replaceTarget !== undefined) { + moveTarget = replaceTarget; + } else if (move) { + moveTarget = allMoves[move].moveTarget; + } else if (move === undefined) { + moveTarget = MoveTarget.NEAR_ENEMY; + } const opponents = user.getOpponents(); let set: Pokemon[] = []; @@ -7285,7 +8187,7 @@ export function getMoveTargets(user: Pokemon, move: Moves): MoveTargetSet { multiple = true; break; case MoveTarget.CURSE: - set = user.getTypes(true).includes(Type.GHOST) ? (opponents.concat([ user.getAlly() ])) : [ user ]; + set = user.getTypes(true).includes(PokemonType.GHOST) ? (opponents.concat([ user.getAlly() ])) : [ user ]; break; } @@ -7293,552 +8195,577 @@ export function getMoveTargets(user: Pokemon, move: Moves): MoveTargetSet { } export const allMoves: Move[] = [ - new SelfStatusMove(Moves.NONE, Type.NORMAL, MoveCategory.STATUS, -1, -1, 0, 1), + new SelfStatusMove(Moves.NONE, PokemonType.NORMAL, MoveCategory.STATUS, -1, -1, 0, 1), ]; export const selfStatLowerMoves: Moves[] = []; export function initMoves() { allMoves.push( - new AttackMove(Moves.POUND, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), - new AttackMove(Moves.KARATE_CHOP, Type.FIGHTING, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 1) + new AttackMove(Moves.POUND, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), + new AttackMove(Moves.KARATE_CHOP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 1) .attr(HighCritAttr), - new AttackMove(Moves.DOUBLE_SLAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 10, -1, 0, 1) + new AttackMove(Moves.DOUBLE_SLAP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 10, -1, 0, 1) .attr(MultiHitAttr), - new AttackMove(Moves.COMET_PUNCH, Type.NORMAL, MoveCategory.PHYSICAL, 18, 85, 15, -1, 0, 1) + new AttackMove(Moves.COMET_PUNCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 18, 85, 15, -1, 0, 1) .attr(MultiHitAttr) .punchingMove(), - new AttackMove(Moves.MEGA_PUNCH, Type.NORMAL, MoveCategory.PHYSICAL, 80, 85, 20, -1, 0, 1) + new AttackMove(Moves.MEGA_PUNCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 85, 20, -1, 0, 1) .punchingMove(), - new AttackMove(Moves.PAY_DAY, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 1) + new AttackMove(Moves.PAY_DAY, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 1) .attr(MoneyAttr) .makesContact(false), - new AttackMove(Moves.FIRE_PUNCH, Type.FIRE, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) + new AttackMove(Moves.FIRE_PUNCH, PokemonType.FIRE, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.BURN) .punchingMove(), - new AttackMove(Moves.ICE_PUNCH, Type.ICE, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) + new AttackMove(Moves.ICE_PUNCH, PokemonType.ICE, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.FREEZE) .punchingMove(), - new AttackMove(Moves.THUNDER_PUNCH, Type.ELECTRIC, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) + new AttackMove(Moves.THUNDER_PUNCH, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 75, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .punchingMove(), - new AttackMove(Moves.SCRATCH, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), - new AttackMove(Moves.VISE_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, 55, 100, 30, -1, 0, 1), - new AttackMove(Moves.GUILLOTINE, Type.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) + new AttackMove(Moves.SCRATCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), + new AttackMove(Moves.VISE_GRIP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 55, 100, 30, -1, 0, 1), + new AttackMove(Moves.GUILLOTINE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr), - new ChargingAttackMove(Moves.RAZOR_WIND, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) + new ChargingAttackMove(Moves.RAZOR_WIND, PokemonType.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) .chargeText(i18next.t("moveTriggers:whippedUpAWhirlwind", { pokemonName: "{USER}" })) .attr(HighCritAttr) .windMove() - .ignoresVirtual() .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.SWORDS_DANCE, Type.NORMAL, -1, 20, -1, 0, 1) + new SelfStatusMove(Moves.SWORDS_DANCE, PokemonType.NORMAL, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], 2, true) .danceMove(), - new AttackMove(Moves.CUT, Type.NORMAL, MoveCategory.PHYSICAL, 50, 95, 30, -1, 0, 1) + new AttackMove(Moves.CUT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 50, 95, 30, -1, 0, 1) .slicingMove(), - new AttackMove(Moves.GUST, Type.FLYING, MoveCategory.SPECIAL, 40, 100, 35, -1, 0, 1) + new AttackMove(Moves.GUST, PokemonType.FLYING, MoveCategory.SPECIAL, 40, 100, 35, -1, 0, 1) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.FLYING) .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) + new AttackMove(Moves.WING_ATTACK, PokemonType.FLYING, MoveCategory.PHYSICAL, 60, 100, 35, -1, 0, 1), + new StatusMove(Moves.WHIRLWIND, PokemonType.NORMAL, -1, 20, -1, -6, 1) + .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .ignoresSubstitute() .hidesTarget() .windMove() - .partial(), // Should force random switches - new ChargingAttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) + .reflectable(), + new ChargingAttackMove(Moves.FLY, PokemonType.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) .chargeText(i18next.t("moveTriggers:flewUpHigh", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) - .condition(failOnGravityCondition) - .ignoresVirtual(), - new AttackMove(Moves.BIND, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) + .condition(failOnGravityCondition), + new AttackMove(Moves.BIND, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) .attr(TrapAttr, BattlerTagType.BIND), - new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1), - new AttackMove(Moves.VINE_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1), - new AttackMove(Moves.STOMP, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1) + new AttackMove(Moves.SLAM, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1), + new AttackMove(Moves.VINE_WHIP, PokemonType.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1), + new AttackMove(Moves.STOMP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 1) .attr(AlwaysHitMinimizeAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .attr(FlinchAttr), - new AttackMove(Moves.DOUBLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1) + new AttackMove(Moves.DOUBLE_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 30, 100, 30, -1, 0, 1) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.MEGA_KICK, Type.NORMAL, MoveCategory.PHYSICAL, 120, 75, 5, -1, 0, 1), - new AttackMove(Moves.JUMP_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 1) + new AttackMove(Moves.MEGA_KICK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 75, 5, -1, 0, 1), + new AttackMove(Moves.JUMP_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 1) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) .condition(failOnGravityCondition) .recklessMove(), - new AttackMove(Moves.ROLLING_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 85, 15, 30, 0, 1) + new AttackMove(Moves.ROLLING_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 85, 15, 30, 0, 1) .attr(FlinchAttr), - new StatusMove(Moves.SAND_ATTACK, Type.GROUND, 100, 15, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.HEADBUTT, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 15, 30, 0, 1) + new StatusMove(Moves.SAND_ATTACK, PokemonType.GROUND, 100, 15, -1, 0, 1) + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), + new AttackMove(Moves.HEADBUTT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 15, 30, 0, 1) .attr(FlinchAttr), - new AttackMove(Moves.HORN_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1), - new AttackMove(Moves.FURY_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) + new AttackMove(Moves.HORN_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1), + new AttackMove(Moves.FURY_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) .attr(MultiHitAttr), - new AttackMove(Moves.HORN_DRILL, Type.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) + new AttackMove(Moves.HORN_DRILL, PokemonType.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr), - new AttackMove(Moves.TACKLE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), - new AttackMove(Moves.BODY_SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1) + new AttackMove(Moves.TACKLE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 35, -1, 0, 1), + new AttackMove(Moves.BODY_SLAM, PokemonType.NORMAL, MoveCategory.PHYSICAL, 85, 100, 15, 30, 0, 1) .attr(AlwaysHitMinimizeAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, -1, 0, 1) + new AttackMove(Moves.WRAP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, -1, 0, 1) .attr(TrapAttr, BattlerTagType.WRAP), - new AttackMove(Moves.TAKE_DOWN, Type.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, -1, 0, 1) + new AttackMove(Moves.TAKE_DOWN, PokemonType.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, -1, 0, 1) .attr(RecoilAttr) .recklessMove(), - new AttackMove(Moves.THRASH, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 1) + new AttackMove(Moves.THRASH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 1) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .attr(NoEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), - new AttackMove(Moves.DOUBLE_EDGE, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 1) + new AttackMove(Moves.DOUBLE_EDGE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 1) .attr(RecoilAttr, false, 0.33) .recklessMove(), - new StatusMove(Moves.TAIL_WHIP, Type.NORMAL, 100, 30, -1, 0, 1) + new StatusMove(Moves.TAIL_WHIP, PokemonType.NORMAL, 100, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) - .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.POISON_STING, Type.POISON, MoveCategory.PHYSICAL, 15, 100, 35, 30, 0, 1) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new AttackMove(Moves.POISON_STING, PokemonType.POISON, MoveCategory.PHYSICAL, 15, 100, 35, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), - new AttackMove(Moves.TWINEEDLE, Type.BUG, MoveCategory.PHYSICAL, 25, 100, 20, 20, 0, 1) + new AttackMove(Moves.TWINEEDLE, PokemonType.BUG, MoveCategory.PHYSICAL, 25, 100, 20, 20, 0, 1) .attr(MultiHitAttr, MultiHitType._2) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), - new AttackMove(Moves.PIN_MISSILE, Type.BUG, MoveCategory.PHYSICAL, 25, 95, 20, -1, 0, 1) + new AttackMove(Moves.PIN_MISSILE, PokemonType.BUG, MoveCategory.PHYSICAL, 25, 95, 20, -1, 0, 1) .attr(MultiHitAttr) .makesContact(false), - new StatusMove(Moves.LEER, Type.NORMAL, 100, 30, -1, 0, 1) + new StatusMove(Moves.LEER, PokemonType.NORMAL, 100, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) - .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.BITE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 1) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new AttackMove(Moves.BITE, PokemonType.DARK, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 1) .attr(FlinchAttr) .bitingMove(), - new StatusMove(Moves.GROWL, Type.NORMAL, 100, 40, -1, 0, 1) + new StatusMove(Moves.GROWL, PokemonType.NORMAL, 100, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .soundBased() - .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.ROAR, Type.NORMAL, -1, 20, -1, -6, 1) - .attr(ForceSwitchOutAttr) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new StatusMove(Moves.ROAR, PokemonType.NORMAL, -1, 20, -1, -6, 1) + .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .soundBased() .hidesTarget() - .partial(), // Should force random switching - new StatusMove(Moves.SING, Type.NORMAL, 55, 15, -1, 0, 1) + .reflectable(), + new StatusMove(Moves.SING, PokemonType.NORMAL, 55, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .soundBased(), - new StatusMove(Moves.SUPERSONIC, Type.NORMAL, 55, 20, -1, 0, 1) + .soundBased() + .reflectable(), + new StatusMove(Moves.SUPERSONIC, PokemonType.NORMAL, 55, 20, -1, 0, 1) .attr(ConfuseAttr) - .soundBased(), - new AttackMove(Moves.SONIC_BOOM, Type.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1) + .soundBased() + .reflectable(), + new AttackMove(Moves.SONIC_BOOM, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1) .attr(FixedDamageAttr, 20), - new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1) + new StatusMove(Moves.DISABLE, PokemonType.NORMAL, 100, 20, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.DISABLED, false, true) - .condition((user, target, move) => target.getMoveHistory().reverse().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual) !== undefined) - .ignoresSubstitute(), - new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) + .condition((user, target, move) => { + const lastRealMove = target.getLastXMoves(-1).find(m => !m.virtual); + return !Utils.isNullOrUndefined(lastRealMove) && lastRealMove.move !== Moves.NONE && lastRealMove.move !== Moves.STRUGGLE; + }) + .ignoresSubstitute() + .reflectable(), + new AttackMove(Moves.ACID, PokemonType.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.EMBER, Type.FIRE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 1) + new AttackMove(Moves.EMBER, PokemonType.FIRE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.FLAMETHROWER, Type.FIRE, MoveCategory.SPECIAL, 90, 100, 15, 10, 0, 1) + new AttackMove(Moves.FLAMETHROWER, PokemonType.FIRE, MoveCategory.SPECIAL, 90, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.BURN), - new StatusMove(Moves.MIST, Type.ICE, -1, 30, -1, 0, 1) + new StatusMove(Moves.MIST, PokemonType.ICE, -1, 30, -1, 0, 1) .attr(AddArenaTagAttr, ArenaTagType.MIST, 5, true) .target(MoveTarget.USER_SIDE), - new AttackMove(Moves.WATER_GUN, Type.WATER, MoveCategory.SPECIAL, 40, 100, 25, -1, 0, 1), - new AttackMove(Moves.HYDRO_PUMP, Type.WATER, MoveCategory.SPECIAL, 110, 80, 5, -1, 0, 1), - new AttackMove(Moves.SURF, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 1) + new AttackMove(Moves.WATER_GUN, PokemonType.WATER, MoveCategory.SPECIAL, 40, 100, 25, -1, 0, 1), + new AttackMove(Moves.HYDRO_PUMP, PokemonType.WATER, MoveCategory.SPECIAL, 110, 80, 5, -1, 0, 1), + new AttackMove(Moves.SURF, PokemonType.WATER, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 1) .target(MoveTarget.ALL_NEAR_OTHERS) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.UNDERWATER) .attr(GulpMissileTagAttr), - new AttackMove(Moves.ICE_BEAM, Type.ICE, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) + new AttackMove(Moves.ICE_BEAM, PokemonType.ICE, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.FREEZE), - new AttackMove(Moves.BLIZZARD, Type.ICE, MoveCategory.SPECIAL, 110, 70, 5, 10, 0, 1) + new AttackMove(Moves.BLIZZARD, PokemonType.ICE, MoveCategory.SPECIAL, 110, 70, 5, 10, 0, 1) .attr(BlizzardAccuracyAttr) .attr(StatusEffectAttr, StatusEffect.FREEZE) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.PSYBEAM, Type.PSYCHIC, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) + new AttackMove(Moves.PSYBEAM, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) .attr(ConfuseAttr), - new AttackMove(Moves.BUBBLE_BEAM, Type.WATER, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) + new AttackMove(Moves.BUBBLE_BEAM, PokemonType.WATER, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new AttackMove(Moves.AURORA_BEAM, Type.ICE, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) + new AttackMove(Moves.AURORA_BEAM, PokemonType.ICE, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.HYPER_BEAM, Type.NORMAL, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 1) + new AttackMove(Moves.HYPER_BEAM, PokemonType.NORMAL, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 1) .attr(RechargeAttr), - new AttackMove(Moves.PECK, Type.FLYING, MoveCategory.PHYSICAL, 35, 100, 35, -1, 0, 1), - new AttackMove(Moves.DRILL_PECK, Type.FLYING, MoveCategory.PHYSICAL, 80, 100, 20, -1, 0, 1), - new AttackMove(Moves.SUBMISSION, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 80, 20, -1, 0, 1) + new AttackMove(Moves.PECK, PokemonType.FLYING, MoveCategory.PHYSICAL, 35, 100, 35, -1, 0, 1), + new AttackMove(Moves.DRILL_PECK, PokemonType.FLYING, MoveCategory.PHYSICAL, 80, 100, 20, -1, 0, 1), + new AttackMove(Moves.SUBMISSION, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 80, 80, 20, -1, 0, 1) .attr(RecoilAttr) .recklessMove(), - new AttackMove(Moves.LOW_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 1) + new AttackMove(Moves.LOW_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 1) .attr(WeightPowerAttr), - new AttackMove(Moves.COUNTER, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, -5, 1) + new AttackMove(Moves.COUNTER, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, -5, 1) .attr(CounterDamageAttr, (move: Move) => move.category === MoveCategory.PHYSICAL, 2) .target(MoveTarget.ATTACKER), - new AttackMove(Moves.SEISMIC_TOSS, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 1) + new AttackMove(Moves.SEISMIC_TOSS, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 1) .attr(LevelDamageAttr), - new AttackMove(Moves.STRENGTH, Type.NORMAL, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 1), - new AttackMove(Moves.ABSORB, Type.GRASS, MoveCategory.SPECIAL, 20, 100, 25, -1, 0, 1) + new AttackMove(Moves.STRENGTH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 1), + new AttackMove(Moves.ABSORB, PokemonType.GRASS, MoveCategory.SPECIAL, 20, 100, 25, -1, 0, 1) .attr(HitHealAttr) .triageMove(), - new AttackMove(Moves.MEGA_DRAIN, Type.GRASS, MoveCategory.SPECIAL, 40, 100, 15, -1, 0, 1) + new AttackMove(Moves.MEGA_DRAIN, PokemonType.GRASS, MoveCategory.SPECIAL, 40, 100, 15, -1, 0, 1) .attr(HitHealAttr) .triageMove(), - new StatusMove(Moves.LEECH_SEED, Type.GRASS, 90, 10, -1, 0, 1) + new StatusMove(Moves.LEECH_SEED, PokemonType.GRASS, 90, 10, -1, 0, 1) .attr(LeechSeedAttr) - .condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(Type.GRASS)), - new SelfStatusMove(Moves.GROWTH, Type.NORMAL, -1, 20, -1, 0, 1) + .condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(PokemonType.GRASS)) + .reflectable(), + new SelfStatusMove(Moves.GROWTH, PokemonType.NORMAL, -1, 20, -1, 0, 1) .attr(GrowthStatStageChangeAttr), - new AttackMove(Moves.RAZOR_LEAF, Type.GRASS, MoveCategory.PHYSICAL, 55, 95, 25, -1, 0, 1) + new AttackMove(Moves.RAZOR_LEAF, PokemonType.GRASS, MoveCategory.PHYSICAL, 55, 95, 25, -1, 0, 1) .attr(HighCritAttr) .makesContact(false) .slicingMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new ChargingAttackMove(Moves.SOLAR_BEAM, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) + new ChargingAttackMove(Moves.SOLAR_BEAM, PokemonType.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) .chargeText(i18next.t("moveTriggers:tookInSunlight", { pokemonName: "{USER}" })) .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]) - .attr(AntiSunlightPowerDecreaseAttr) - .ignoresVirtual(), - new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1) + .attr(AntiSunlightPowerDecreaseAttr), + new StatusMove(Moves.POISON_POWDER, PokemonType.POISON, 75, 35, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) - .powderMove(), - new StatusMove(Moves.STUN_SPORE, Type.GRASS, 75, 30, -1, 0, 1) + .powderMove() + .reflectable(), + new StatusMove(Moves.STUN_SPORE, PokemonType.GRASS, 75, 30, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .powderMove(), - new StatusMove(Moves.SLEEP_POWDER, Type.GRASS, 75, 15, -1, 0, 1) + .powderMove() + .reflectable(), + new StatusMove(Moves.SLEEP_POWDER, PokemonType.GRASS, 75, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .powderMove(), - new AttackMove(Moves.PETAL_DANCE, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) + .powderMove() + .reflectable(), + new AttackMove(Moves.PETAL_DANCE, PokemonType.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .attr(NoEffectAttr, frenzyMissFunc) .makesContact() .danceMove() .target(MoveTarget.RANDOM_NEAR_ENEMY), - new StatusMove(Moves.STRING_SHOT, Type.BUG, 95, 40, -1, 0, 1) + new StatusMove(Moves.STRING_SHOT, PokemonType.BUG, 95, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -2) - .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.DRAGON_RAGE, Type.DRAGON, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 1) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new AttackMove(Moves.DRAGON_RAGE, PokemonType.DRAGON, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 1) .attr(FixedDamageAttr, 40), - new AttackMove(Moves.FIRE_SPIN, Type.FIRE, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 1) + new AttackMove(Moves.FIRE_SPIN, PokemonType.FIRE, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 1) .attr(TrapAttr, BattlerTagType.FIRE_SPIN), - new AttackMove(Moves.THUNDER_SHOCK, Type.ELECTRIC, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) + new AttackMove(Moves.THUNDER_SHOCK, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.THUNDERBOLT, Type.ELECTRIC, MoveCategory.SPECIAL, 90, 100, 15, 10, 0, 1) + new AttackMove(Moves.THUNDERBOLT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 90, 100, 15, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new StatusMove(Moves.THUNDER_WAVE, Type.ELECTRIC, 90, 20, -1, 0, 1) + new StatusMove(Moves.THUNDER_WAVE, PokemonType.ELECTRIC, 90, 20, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .attr(RespectAttackTypeImmunityAttr), - new AttackMove(Moves.THUNDER, Type.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1) + .attr(RespectAttackTypeImmunityAttr) + .reflectable(), + new AttackMove(Moves.THUNDER, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(ThunderAccuracyAttr) .attr(HitsTagAttr, BattlerTagType.FLYING), - new AttackMove(Moves.ROCK_THROW, Type.ROCK, MoveCategory.PHYSICAL, 50, 90, 15, -1, 0, 1) + new AttackMove(Moves.ROCK_THROW, PokemonType.ROCK, MoveCategory.PHYSICAL, 50, 90, 15, -1, 0, 1) .makesContact(false), - new AttackMove(Moves.EARTHQUAKE, Type.GROUND, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 1) + new AttackMove(Moves.EARTHQUAKE, PokemonType.GROUND, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 1) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.UNDERGROUND) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.FISSURE, Type.GROUND, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) + new AttackMove(Moves.FISSURE, PokemonType.GROUND, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr) .attr(HitsTagAttr, BattlerTagType.UNDERGROUND) .makesContact(false), - new ChargingAttackMove(Moves.DIG, Type.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) + new ChargingAttackMove(Moves.DIG, PokemonType.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) .chargeText(i18next.t("moveTriggers:dugAHole", { pokemonName: "{USER}" })) - .chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERGROUND) - .ignoresVirtual(), - new StatusMove(Moves.TOXIC, Type.POISON, 90, 10, -1, 0, 1) + .chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERGROUND), + new StatusMove(Moves.TOXIC, PokemonType.POISON, 90, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.TOXIC) - .attr(ToxicAccuracyAttr), - new AttackMove(Moves.CONFUSION, Type.PSYCHIC, MoveCategory.SPECIAL, 50, 100, 25, 10, 0, 1) + .attr(ToxicAccuracyAttr) + .reflectable(), + new AttackMove(Moves.CONFUSION, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 50, 100, 25, 10, 0, 1) .attr(ConfuseAttr), - new AttackMove(Moves.PSYCHIC, Type.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) + new AttackMove(Moves.PSYCHIC, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new StatusMove(Moves.HYPNOSIS, Type.PSYCHIC, 60, 20, -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.SLEEP), - new SelfStatusMove(Moves.MEDITATE, Type.PSYCHIC, -1, 40, -1, 0, 1) + new StatusMove(Moves.HYPNOSIS, PokemonType.PSYCHIC, 60, 20, -1, 0, 1) + .attr(StatusEffectAttr, StatusEffect.SLEEP) + .reflectable(), + new SelfStatusMove(Moves.MEDITATE, PokemonType.PSYCHIC, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true), - new SelfStatusMove(Moves.AGILITY, Type.PSYCHIC, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.AGILITY, PokemonType.PSYCHIC, -1, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true), - new AttackMove(Moves.QUICK_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 1), - new AttackMove(Moves.RAGE, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 20, -1, 0, 1) + new AttackMove(Moves.QUICK_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 1), + new AttackMove(Moves.RAGE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 20, 100, 20, -1, 0, 1) .partial(), // No effect implemented - new SelfStatusMove(Moves.TELEPORT, Type.PSYCHIC, -1, 20, -1, -6, 1) + new SelfStatusMove(Moves.TELEPORT, PokemonType.PSYCHIC, -1, 20, -1, -6, 1) .attr(ForceSwitchOutAttr, true) .hidesUser(), - new AttackMove(Moves.NIGHT_SHADE, Type.GHOST, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) + new AttackMove(Moves.NIGHT_SHADE, PokemonType.GHOST, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) .attr(LevelDamageAttr), - new StatusMove(Moves.MIMIC, Type.NORMAL, -1, 10, -1, 0, 1) + new StatusMove(Moves.MIMIC, PokemonType.NORMAL, -1, 10, -1, 0, 1) .attr(MovesetCopyMoveAttr) - .ignoresSubstitute() - .ignoresVirtual(), - new StatusMove(Moves.SCREECH, Type.NORMAL, 85, 40, -1, 0, 1) + .ignoresSubstitute(), + new StatusMove(Moves.SCREECH, PokemonType.NORMAL, 85, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -2) - .soundBased(), - new SelfStatusMove(Moves.DOUBLE_TEAM, Type.NORMAL, -1, 15, -1, 0, 1) + .soundBased() + .reflectable(), + new SelfStatusMove(Moves.DOUBLE_TEAM, PokemonType.NORMAL, -1, 15, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.EVA ], 1, true), - new SelfStatusMove(Moves.RECOVER, Type.NORMAL, -1, 5, -1, 0, 1) + new SelfStatusMove(Moves.RECOVER, PokemonType.NORMAL, -1, 5, -1, 0, 1) .attr(HealAttr, 0.5) .triageMove(), - new SelfStatusMove(Moves.HARDEN, Type.NORMAL, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.HARDEN, PokemonType.NORMAL, -1, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new SelfStatusMove(Moves.MINIMIZE, Type.NORMAL, -1, 10, -1, 0, 1) + new SelfStatusMove(Moves.MINIMIZE, PokemonType.NORMAL, -1, 10, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false) .attr(StatStageChangeAttr, [ Stat.EVA ], 2, true), - new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new StatusMove(Moves.CONFUSE_RAY, Type.GHOST, 100, 10, -1, 0, 1) - .attr(ConfuseAttr), - new SelfStatusMove(Moves.WITHDRAW, Type.WATER, -1, 40, -1, 0, 1) + new StatusMove(Moves.SMOKESCREEN, PokemonType.NORMAL, 100, 20, -1, 0, 1) + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), + new StatusMove(Moves.CONFUSE_RAY, PokemonType.GHOST, 100, 10, -1, 0, 1) + .attr(ConfuseAttr) + .reflectable(), + new SelfStatusMove(Moves.WITHDRAW, PokemonType.WATER, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new SelfStatusMove(Moves.DEFENSE_CURL, Type.NORMAL, -1, 40, -1, 0, 1) + new SelfStatusMove(Moves.DEFENSE_CURL, PokemonType.NORMAL, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new SelfStatusMove(Moves.BARRIER, Type.PSYCHIC, -1, 20, -1, 0, 1) + new SelfStatusMove(Moves.BARRIER, PokemonType.PSYCHIC, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), - new StatusMove(Moves.LIGHT_SCREEN, Type.PSYCHIC, -1, 30, -1, 0, 1) + new StatusMove(Moves.LIGHT_SCREEN, PokemonType.PSYCHIC, -1, 30, -1, 0, 1) .attr(AddArenaTagAttr, ArenaTagType.LIGHT_SCREEN, 5, true) .target(MoveTarget.USER_SIDE), - new SelfStatusMove(Moves.HAZE, Type.ICE, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.HAZE, PokemonType.ICE, -1, 30, -1, 0, 1) .ignoresSubstitute() .attr(ResetStatsAttr, true), - new StatusMove(Moves.REFLECT, Type.PSYCHIC, -1, 20, -1, 0, 1) + new StatusMove(Moves.REFLECT, PokemonType.PSYCHIC, -1, 20, -1, 0, 1) .attr(AddArenaTagAttr, ArenaTagType.REFLECT, 5, true) .target(MoveTarget.USER_SIDE), - new SelfStatusMove(Moves.FOCUS_ENERGY, Type.NORMAL, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.FOCUS_ENERGY, PokemonType.NORMAL, -1, 30, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.CRIT_BOOST, true, true), - new AttackMove(Moves.BIDE, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 10, -1, 1, 1) - .ignoresVirtual() + new AttackMove(Moves.BIDE, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, -1, 10, -1, 1, 1) .target(MoveTarget.USER) .unimplemented(), - new SelfStatusMove(Moves.METRONOME, Type.NORMAL, -1, 10, -1, 0, 1) - .attr(RandomMoveAttr) - .ignoresVirtual(), - new StatusMove(Moves.MIRROR_MOVE, Type.FLYING, -1, 20, -1, 0, 1) - .attr(CopyMoveAttr) - .ignoresVirtual(), - new AttackMove(Moves.SELF_DESTRUCT, Type.NORMAL, MoveCategory.PHYSICAL, 200, 100, 5, -1, 0, 1) + new SelfStatusMove(Moves.METRONOME, PokemonType.NORMAL, -1, 10, -1, 0, 1) + .attr(RandomMoveAttr, invalidMetronomeMoves), + new StatusMove(Moves.MIRROR_MOVE, PokemonType.FLYING, -1, 20, -1, 0, 1) + .attr(CopyMoveAttr, true), + new AttackMove(Moves.SELF_DESTRUCT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 200, 100, 5, -1, 0, 1) .attr(SacrificialAttr) .makesContact(false) .condition(failIfDampCondition) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.EGG_BOMB, Type.NORMAL, MoveCategory.PHYSICAL, 100, 75, 10, -1, 0, 1) + new AttackMove(Moves.EGG_BOMB, PokemonType.NORMAL, MoveCategory.PHYSICAL, 100, 75, 10, -1, 0, 1) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.LICK, Type.GHOST, MoveCategory.PHYSICAL, 30, 100, 30, 30, 0, 1) + new AttackMove(Moves.LICK, PokemonType.GHOST, MoveCategory.PHYSICAL, 30, 100, 30, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.SMOG, Type.POISON, MoveCategory.SPECIAL, 30, 70, 20, 40, 0, 1) + new AttackMove(Moves.SMOG, PokemonType.POISON, MoveCategory.SPECIAL, 30, 70, 20, 40, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.SLUDGE, Type.POISON, MoveCategory.SPECIAL, 65, 100, 20, 30, 0, 1) + new AttackMove(Moves.SLUDGE, PokemonType.POISON, MoveCategory.SPECIAL, 65, 100, 20, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.BONE_CLUB, Type.GROUND, MoveCategory.PHYSICAL, 65, 85, 20, 10, 0, 1) + new AttackMove(Moves.BONE_CLUB, PokemonType.GROUND, MoveCategory.PHYSICAL, 65, 85, 20, 10, 0, 1) .attr(FlinchAttr) .makesContact(false), - new AttackMove(Moves.FIRE_BLAST, Type.FIRE, MoveCategory.SPECIAL, 110, 85, 5, 10, 0, 1) + new AttackMove(Moves.FIRE_BLAST, PokemonType.FIRE, MoveCategory.SPECIAL, 110, 85, 5, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.WATERFALL, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 1) + new AttackMove(Moves.WATERFALL, PokemonType.WATER, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 1) .attr(FlinchAttr), - new AttackMove(Moves.CLAMP, Type.WATER, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 1) + new AttackMove(Moves.CLAMP, PokemonType.WATER, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 1) .attr(TrapAttr, BattlerTagType.CLAMP), - new AttackMove(Moves.SWIFT, Type.NORMAL, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 1) + new AttackMove(Moves.SWIFT, PokemonType.NORMAL, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new ChargingAttackMove(Moves.SKULL_BASH, Type.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, -1, 0, 1) + new ChargingAttackMove(Moves.SKULL_BASH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, -1, 0, 1) .chargeText(i18next.t("moveTriggers:loweredItsHead", { pokemonName: "{USER}" })) - .chargeAttr(StatStageChangeAttr, [ Stat.DEF ], 1, true) - .ignoresVirtual(), - new AttackMove(Moves.SPIKE_CANNON, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 15, -1, 0, 1) + .chargeAttr(StatStageChangeAttr, [ Stat.DEF ], 1, true), + new AttackMove(Moves.SPIKE_CANNON, PokemonType.NORMAL, MoveCategory.PHYSICAL, 20, 100, 15, -1, 0, 1) .attr(MultiHitAttr) .makesContact(false), - new AttackMove(Moves.CONSTRICT, Type.NORMAL, MoveCategory.PHYSICAL, 10, 100, 35, 10, 0, 1) + new AttackMove(Moves.CONSTRICT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 10, 100, 35, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new SelfStatusMove(Moves.AMNESIA, Type.PSYCHIC, -1, 20, -1, 0, 1) + new SelfStatusMove(Moves.AMNESIA, PokemonType.PSYCHIC, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], 2, true), - new StatusMove(Moves.KINESIS, Type.PSYCHIC, 80, 15, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new SelfStatusMove(Moves.SOFT_BOILED, Type.NORMAL, -1, 5, -1, 0, 1) + new StatusMove(Moves.KINESIS, PokemonType.PSYCHIC, 80, 15, -1, 0, 1) + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), + new SelfStatusMove(Moves.SOFT_BOILED, PokemonType.NORMAL, -1, 5, -1, 0, 1) .attr(HealAttr, 0.5) .triageMove(), - new AttackMove(Moves.HIGH_JUMP_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 130, 90, 10, -1, 0, 1) + new AttackMove(Moves.HIGH_JUMP_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 130, 90, 10, -1, 0, 1) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) .condition(failOnGravityCondition) .recklessMove(), - new StatusMove(Moves.GLARE, Type.NORMAL, 100, 30, -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.DREAM_EATER, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 15, -1, 0, 1) + new StatusMove(Moves.GLARE, PokemonType.NORMAL, 100, 30, -1, 0, 1) + .attr(StatusEffectAttr, StatusEffect.PARALYSIS) + .reflectable(), + new AttackMove(Moves.DREAM_EATER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 15, -1, 0, 1) .attr(HitHealAttr) .condition(targetSleptOrComatoseCondition) .triageMove(), - new StatusMove(Moves.POISON_GAS, Type.POISON, 90, 40, -1, 0, 1) + new StatusMove(Moves.POISON_GAS, PokemonType.POISON, 90, 40, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) - .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.BARRAGE, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new AttackMove(Moves.BARRAGE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) .attr(MultiHitAttr) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.LEECH_LIFE, Type.BUG, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) + new AttackMove(Moves.LEECH_LIFE, PokemonType.BUG, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) .attr(HitHealAttr) .triageMove(), - new StatusMove(Moves.LOVELY_KISS, Type.NORMAL, 75, 10, -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.SLEEP), - new ChargingAttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) + new StatusMove(Moves.LOVELY_KISS, PokemonType.NORMAL, 75, 10, -1, 0, 1) + .attr(StatusEffectAttr, StatusEffect.SLEEP) + .reflectable(), + new ChargingAttackMove(Moves.SKY_ATTACK, PokemonType.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) .attr(HighCritAttr) .attr(FlinchAttr) - .makesContact(false) - .ignoresVirtual(), - new StatusMove(Moves.TRANSFORM, Type.NORMAL, -1, 10, -1, 0, 1) + .makesContact(false), + new StatusMove(Moves.TRANSFORM, PokemonType.NORMAL, -1, 10, -1, 0, 1) .attr(TransformAttr) - .condition((user, target, move) => !target.getTag(BattlerTagType.SUBSTITUTE)) + // transforming from or into fusion pokemon causes various problems (such as crashes) + .condition((user, target, move) => !target.getTag(BattlerTagType.SUBSTITUTE) && !user.fusionSpecies && !target.fusionSpecies) .ignoresProtect(), - new AttackMove(Moves.BUBBLE, Type.WATER, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) + new AttackMove(Moves.BUBBLE, PokemonType.WATER, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.DIZZY_PUNCH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, 20, 0, 1) + new AttackMove(Moves.DIZZY_PUNCH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, 20, 0, 1) .attr(ConfuseAttr) .punchingMove(), - new StatusMove(Moves.SPORE, Type.GRASS, 100, 15, -1, 0, 1) + new StatusMove(Moves.SPORE, PokemonType.GRASS, 100, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .powderMove(), - new StatusMove(Moves.FLASH, Type.NORMAL, 100, 20, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.PSYWAVE, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) + .powderMove() + .reflectable(), + new StatusMove(Moves.FLASH, PokemonType.NORMAL, 100, 20, -1, 0, 1) + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), + new AttackMove(Moves.PSYWAVE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) .attr(RandomLevelDamageAttr), - new SelfStatusMove(Moves.SPLASH, Type.NORMAL, -1, 40, -1, 0, 1) + new SelfStatusMove(Moves.SPLASH, PokemonType.NORMAL, -1, 40, -1, 0, 1) + .attr(SplashAttr) .condition(failOnGravityCondition), - new SelfStatusMove(Moves.ACID_ARMOR, Type.POISON, -1, 20, -1, 0, 1) + new SelfStatusMove(Moves.ACID_ARMOR, PokemonType.POISON, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), - new AttackMove(Moves.CRABHAMMER, Type.WATER, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 1) + new AttackMove(Moves.CRABHAMMER, PokemonType.WATER, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 1) .attr(HighCritAttr), - new AttackMove(Moves.EXPLOSION, Type.NORMAL, MoveCategory.PHYSICAL, 250, 100, 5, -1, 0, 1) + new AttackMove(Moves.EXPLOSION, PokemonType.NORMAL, MoveCategory.PHYSICAL, 250, 100, 5, -1, 0, 1) .condition(failIfDampCondition) .attr(SacrificialAttr) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.FURY_SWIPES, Type.NORMAL, MoveCategory.PHYSICAL, 18, 80, 15, -1, 0, 1) + new AttackMove(Moves.FURY_SWIPES, PokemonType.NORMAL, MoveCategory.PHYSICAL, 18, 80, 15, -1, 0, 1) .attr(MultiHitAttr), - new AttackMove(Moves.BONEMERANG, Type.GROUND, MoveCategory.PHYSICAL, 50, 90, 10, -1, 0, 1) + new AttackMove(Moves.BONEMERANG, PokemonType.GROUND, MoveCategory.PHYSICAL, 50, 90, 10, -1, 0, 1) .attr(MultiHitAttr, MultiHitType._2) .makesContact(false), - new SelfStatusMove(Moves.REST, Type.PSYCHIC, -1, 5, -1, 0, 1) + new SelfStatusMove(Moves.REST, PokemonType.PSYCHIC, -1, 5, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP, true, 3, true) .attr(HealAttr, 1, true) .condition((user, target, move) => !user.isFullHp() && user.canSetStatus(StatusEffect.SLEEP, true, true)) .triageMove(), - new AttackMove(Moves.ROCK_SLIDE, Type.ROCK, MoveCategory.PHYSICAL, 75, 90, 10, 30, 0, 1) + new AttackMove(Moves.ROCK_SLIDE, PokemonType.ROCK, MoveCategory.PHYSICAL, 75, 90, 10, 30, 0, 1) .attr(FlinchAttr) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.HYPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, 80, 90, 15, 10, 0, 1) + new AttackMove(Moves.HYPER_FANG, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 90, 15, 10, 0, 1) .attr(FlinchAttr) .bitingMove(), - new SelfStatusMove(Moves.SHARPEN, Type.NORMAL, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.SHARPEN, PokemonType.NORMAL, -1, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true), - new SelfStatusMove(Moves.CONVERSION, Type.NORMAL, -1, 30, -1, 0, 1) + new SelfStatusMove(Moves.CONVERSION, PokemonType.NORMAL, -1, 30, -1, 0, 1) .attr(FirstMoveTypeAttr), - new AttackMove(Moves.TRI_ATTACK, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1) + new AttackMove(Moves.TRI_ATTACK, PokemonType.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1) .attr(MultiStatusEffectAttr, [ StatusEffect.BURN, StatusEffect.FREEZE, StatusEffect.PARALYSIS ]), - new AttackMove(Moves.SUPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1) + new AttackMove(Moves.SUPER_FANG, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1) .attr(TargetHalfHpDamageAttr), - new AttackMove(Moves.SLASH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1) + new AttackMove(Moves.SLASH, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1) .attr(HighCritAttr) .slicingMove(), - new SelfStatusMove(Moves.SUBSTITUTE, Type.NORMAL, -1, 10, -1, 0, 1) - .attr(AddSubstituteAttr), - new AttackMove(Moves.STRUGGLE, Type.NORMAL, MoveCategory.PHYSICAL, 50, -1, 1, -1, 0, 1) + new SelfStatusMove(Moves.SUBSTITUTE, PokemonType.NORMAL, -1, 10, -1, 0, 1) + .attr(AddSubstituteAttr, 0.25, false), + new AttackMove(Moves.STRUGGLE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 50, -1, 1, -1, 0, 1) .attr(RecoilAttr, true, 0.25, true) .attr(TypelessAttr) - .ignoresVirtual() .target(MoveTarget.RANDOM_NEAR_ENEMY), - new StatusMove(Moves.SKETCH, Type.NORMAL, -1, 1, -1, 0, 2) + new StatusMove(Moves.SKETCH, PokemonType.NORMAL, -1, 1, -1, 0, 2) .ignoresSubstitute() - .attr(SketchAttr) - .ignoresVirtual(), - new AttackMove(Moves.TRIPLE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 10, 90, 10, -1, 0, 2) + .attr(SketchAttr), + new AttackMove(Moves.TRIPLE_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 10, 90, 10, -1, 0, 2) .attr(MultiHitAttr, MultiHitType._3) .attr(MultiHitPowerIncrementAttr, 3) .checkAllHits(), - new AttackMove(Moves.THIEF, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, -1, 0, 2) + new AttackMove(Moves.THIEF, PokemonType.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) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), - new StatusMove(Moves.MIND_READER, Type.NORMAL, -1, 5, -1, 0, 2) + new StatusMove(Moves.SPIDER_WEB, PokemonType.BUG, -1, 10, -1, 0, 2) + .condition(failIfGhostTypeCondition) + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .reflectable(), + new StatusMove(Moves.MIND_READER, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(IgnoreAccuracyAttr), - new StatusMove(Moves.NIGHTMARE, Type.GHOST, 100, 15, -1, 0, 2) + new StatusMove(Moves.NIGHTMARE, PokemonType.GHOST, 100, 15, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.NIGHTMARE) .condition(targetSleptOrComatoseCondition), - new AttackMove(Moves.FLAME_WHEEL, Type.FIRE, MoveCategory.PHYSICAL, 60, 100, 25, 10, 0, 2) + new AttackMove(Moves.FLAME_WHEEL, PokemonType.FIRE, MoveCategory.PHYSICAL, 60, 100, 25, 10, 0, 2) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.SNORE, Type.NORMAL, MoveCategory.SPECIAL, 50, 100, 15, 30, 0, 2) + new AttackMove(Moves.SNORE, PokemonType.NORMAL, MoveCategory.SPECIAL, 50, 100, 15, 30, 0, 2) .attr(BypassSleepAttr) .attr(FlinchAttr) .condition(userSleptOrComatoseCondition) .soundBased(), - new StatusMove(Moves.CURSE, Type.GHOST, -1, 10, -1, 0, 2) + new StatusMove(Moves.CURSE, PokemonType.GHOST, -1, 10, -1, 0, 2) .attr(CurseAttr) .ignoresSubstitute() .ignoresProtect() .target(MoveTarget.CURSE), - new AttackMove(Moves.FLAIL, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) + new AttackMove(Moves.FLAIL, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) .attr(LowHpPowerAttr), - new StatusMove(Moves.CONVERSION_2, Type.NORMAL, -1, 30, -1, 0, 2) + new StatusMove(Moves.CONVERSION_2, PokemonType.NORMAL, -1, 30, -1, 0, 2) .attr(ResistLastMoveTypeAttr) .ignoresSubstitute() .partial(), // Checks the move's original typing and not if its type is changed through some other means - new AttackMove(Moves.AEROBLAST, Type.FLYING, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 2) + new AttackMove(Moves.AEROBLAST, PokemonType.FLYING, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 2) .windMove() .attr(HighCritAttr), - new StatusMove(Moves.COTTON_SPORE, Type.GRASS, 100, 40, -1, 0, 2) + new StatusMove(Moves.COTTON_SPORE, PokemonType.GRASS, 100, 40, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPD ], -2) .powderMove() - .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.REVERSAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new AttackMove(Moves.REVERSAL, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) .attr(LowHpPowerAttr), - new StatusMove(Moves.SPITE, Type.GHOST, 100, 10, -1, 0, 2) + new StatusMove(Moves.SPITE, PokemonType.GHOST, 100, 10, -1, 0, 2) .ignoresSubstitute() - .attr(ReducePpMoveAttr, 4), - new AttackMove(Moves.POWDER_SNOW, Type.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2) + .attr(ReducePpMoveAttr, 4) + .reflectable(), + new AttackMove(Moves.POWDER_SNOW, PokemonType.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2) .attr(StatusEffectAttr, StatusEffect.FREEZE) .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.PROTECT, Type.NORMAL, -1, 10, -1, 4, 2) + new SelfStatusMove(Moves.PROTECT, PokemonType.NORMAL, -1, 10, -1, 4, 2) .attr(ProtectAttr) .condition(failIfLastCondition), - new AttackMove(Moves.MACH_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2) + new AttackMove(Moves.MACH_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2) .punchingMove(), - new StatusMove(Moves.SCARY_FACE, Type.NORMAL, 100, 10, -1, 0, 2) - .attr(StatStageChangeAttr, [ Stat.SPD ], -2), - new AttackMove(Moves.FEINT_ATTACK, Type.DARK, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 2), - new StatusMove(Moves.SWEET_KISS, Type.FAIRY, 75, 10, -1, 0, 2) - .attr(ConfuseAttr), - new SelfStatusMove(Moves.BELLY_DRUM, Type.NORMAL, -1, 10, -1, 0, 2) + new StatusMove(Moves.SCARY_FACE, PokemonType.NORMAL, 100, 10, -1, 0, 2) + .attr(StatStageChangeAttr, [ Stat.SPD ], -2) + .reflectable(), + new AttackMove(Moves.FEINT_ATTACK, PokemonType.DARK, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 2), + new StatusMove(Moves.SWEET_KISS, PokemonType.FAIRY, 75, 10, -1, 0, 2) + .attr(ConfuseAttr) + .reflectable(), + new SelfStatusMove(Moves.BELLY_DRUM, PokemonType.NORMAL, -1, 10, -1, 0, 2) .attr(CutHpStatStageBoostAttr, [ Stat.ATK ], 12, 2, (user) => { - user.scene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", { pokemonName: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.ATK)) })); + globalScene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", { pokemonName: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.ATK)) })); }), - new AttackMove(Moves.SLUDGE_BOMB, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 30, 0, 2) + new AttackMove(Moves.SLUDGE_BOMB, PokemonType.POISON, MoveCategory.SPECIAL, 90, 100, 10, 30, 0, 2) .attr(StatusEffectAttr, StatusEffect.POISON) .ballBombMove(), - new AttackMove(Moves.MUD_SLAP, Type.GROUND, MoveCategory.SPECIAL, 20, 100, 10, 100, 0, 2) + new AttackMove(Moves.MUD_SLAP, PokemonType.GROUND, MoveCategory.SPECIAL, 20, 100, 10, 100, 0, 2) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.OCTAZOOKA, Type.WATER, MoveCategory.SPECIAL, 65, 85, 10, 50, 0, 2) + new AttackMove(Moves.OCTAZOOKA, PokemonType.WATER, MoveCategory.SPECIAL, 65, 85, 10, 50, 0, 2) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .ballBombMove(), - new StatusMove(Moves.SPIKES, Type.GROUND, -1, 20, -1, 0, 2) + new StatusMove(Moves.SPIKES, PokemonType.GROUND, -1, 20, -1, 0, 2) .attr(AddArenaTrapTagAttr, ArenaTagType.SPIKES) - .target(MoveTarget.ENEMY_SIDE), - new AttackMove(Moves.ZAP_CANNON, Type.ELECTRIC, MoveCategory.SPECIAL, 120, 50, 5, 100, 0, 2) + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), + new AttackMove(Moves.ZAP_CANNON, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 120, 50, 5, 100, 0, 2) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .ballBombMove(), - new StatusMove(Moves.FORESIGHT, Type.NORMAL, -1, 40, -1, 0, 2) + new StatusMove(Moves.FORESIGHT, PokemonType.NORMAL, -1, 40, -1, 0, 2) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST) - .ignoresSubstitute(), - new SelfStatusMove(Moves.DESTINY_BOND, Type.GHOST, -1, 5, -1, 0, 2) + .ignoresSubstitute() + .reflectable(), + new SelfStatusMove(Moves.DESTINY_BOND, PokemonType.GHOST, -1, 5, -1, 0, 2) .ignoresProtect() .attr(DestinyBondAttr) .condition((user, target, move) => { @@ -7850,114 +8777,120 @@ export function initMoves() { // - the previous move was unsuccessful return lastTurnMove.length === 0 || lastTurnMove[0].move !== move.id || lastTurnMove[0].result !== MoveResult.SUCCESS; }), - new StatusMove(Moves.PERISH_SONG, Type.NORMAL, -1, 5, -1, 0, 2) + new StatusMove(Moves.PERISH_SONG, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(FaintCountdownAttr) .ignoresProtect() .soundBased() .condition(failOnBossCondition) .target(MoveTarget.ALL), - new AttackMove(Moves.ICY_WIND, Type.ICE, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 2) + new AttackMove(Moves.ICY_WIND, PokemonType.ICE, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.DETECT, Type.FIGHTING, -1, 5, -1, 4, 2) + new SelfStatusMove(Moves.DETECT, PokemonType.FIGHTING, -1, 5, -1, 4, 2) .attr(ProtectAttr) .condition(failIfLastCondition), - new AttackMove(Moves.BONE_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 2) + new AttackMove(Moves.BONE_RUSH, PokemonType.GROUND, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 2) .attr(MultiHitAttr) .makesContact(false), - new StatusMove(Moves.LOCK_ON, Type.NORMAL, -1, 5, -1, 0, 2) + new StatusMove(Moves.LOCK_ON, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(IgnoreAccuracyAttr), - new AttackMove(Moves.OUTRAGE, Type.DRAGON, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 2) + new AttackMove(Moves.OUTRAGE, PokemonType.DRAGON, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 2) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .attr(NoEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), - new StatusMove(Moves.SANDSTORM, Type.ROCK, -1, 10, -1, 0, 2) + new StatusMove(Moves.SANDSTORM, PokemonType.ROCK, -1, 10, -1, 0, 2) .attr(WeatherChangeAttr, WeatherType.SANDSTORM) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.GIGA_DRAIN, Type.GRASS, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 2) + new AttackMove(Moves.GIGA_DRAIN, PokemonType.GRASS, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 2) .attr(HitHealAttr) .triageMove(), - new SelfStatusMove(Moves.ENDURE, Type.NORMAL, -1, 10, -1, 4, 2) + new SelfStatusMove(Moves.ENDURE, PokemonType.NORMAL, -1, 10, -1, 4, 2) .attr(ProtectAttr, BattlerTagType.ENDURING) .condition(failIfLastCondition), - new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2) - .attr(StatStageChangeAttr, [ Stat.ATK ], -2), - new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2) + new StatusMove(Moves.CHARM, PokemonType.FAIRY, 100, 20, -1, 0, 2) + .attr(StatStageChangeAttr, [ Stat.ATK ], -2) + .reflectable(), + new AttackMove(Moves.ROLLOUT, PokemonType.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2) .partial() // Does not lock the user, also does not increase damage properly .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL), - new AttackMove(Moves.FALSE_SWIPE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2) + new AttackMove(Moves.FALSE_SWIPE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2) .attr(SurviveDamageAttr), - new StatusMove(Moves.SWAGGER, Type.NORMAL, 85, 15, -1, 0, 2) + new StatusMove(Moves.SWAGGER, PokemonType.NORMAL, 85, 15, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.ATK ], 2) - .attr(ConfuseAttr), - new SelfStatusMove(Moves.MILK_DRINK, Type.NORMAL, -1, 5, -1, 0, 2) + .attr(ConfuseAttr) + .reflectable(), + new SelfStatusMove(Moves.MILK_DRINK, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(HealAttr, 0.5) .triageMove(), - new AttackMove(Moves.SPARK, Type.ELECTRIC, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 2) + new AttackMove(Moves.SPARK, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 2) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.FURY_CUTTER, Type.BUG, MoveCategory.PHYSICAL, 40, 95, 20, -1, 0, 2) + new AttackMove(Moves.FURY_CUTTER, PokemonType.BUG, MoveCategory.PHYSICAL, 40, 95, 20, -1, 0, 2) .attr(ConsecutiveUseDoublePowerAttr, 3, true) .slicingMove(), - new AttackMove(Moves.STEEL_WING, Type.STEEL, MoveCategory.PHYSICAL, 70, 90, 25, 10, 0, 2) + new AttackMove(Moves.STEEL_WING, PokemonType.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) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), - new StatusMove(Moves.ATTRACT, Type.NORMAL, 100, 15, -1, 0, 2) + new StatusMove(Moves.MEAN_LOOK, PokemonType.NORMAL, -1, 5, -1, 0, 2) + .condition(failIfGhostTypeCondition) + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .reflectable(), + new StatusMove(Moves.ATTRACT, PokemonType.NORMAL, 100, 15, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.INFATUATED) .ignoresSubstitute() - .condition((user, target, move) => user.isOppositeGender(target)), - new SelfStatusMove(Moves.SLEEP_TALK, Type.NORMAL, -1, 10, -1, 0, 2) + .condition((user, target, move) => user.isOppositeGender(target)) + .reflectable(), + new SelfStatusMove(Moves.SLEEP_TALK, PokemonType.NORMAL, -1, 10, -1, 0, 2) .attr(BypassSleepAttr) - .attr(RandomMovesetMoveAttr) + .attr(RandomMovesetMoveAttr, invalidSleepTalkMoves, false) .condition(userSleptOrComatoseCondition) - .target(MoveTarget.ALL_ENEMIES) - .ignoresVirtual(), - new StatusMove(Moves.HEAL_BELL, Type.NORMAL, -1, 5, -1, 0, 2) + .target(MoveTarget.NEAR_ENEMY), + new StatusMove(Moves.HEAL_BELL, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(PartyStatusCureAttr, i18next.t("moveTriggers:bellChimed"), Abilities.SOUNDPROOF) .soundBased() .target(MoveTarget.PARTY), - new AttackMove(Moves.RETURN, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 2) + new AttackMove(Moves.RETURN, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 2) .attr(FriendshipPowerAttr), - new AttackMove(Moves.PRESENT, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 15, -1, 0, 2) + new AttackMove(Moves.PRESENT, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 90, 15, -1, 0, 2) .attr(PresentPowerAttr) .makesContact(false), - new AttackMove(Moves.FRUSTRATION, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 2) + new AttackMove(Moves.FRUSTRATION, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 2) .attr(FriendshipPowerAttr, true), - new StatusMove(Moves.SAFEGUARD, Type.NORMAL, -1, 25, -1, 0, 2) + new StatusMove(Moves.SAFEGUARD, PokemonType.NORMAL, -1, 25, -1, 0, 2) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.SAFEGUARD, 5, true, true), - new StatusMove(Moves.PAIN_SPLIT, Type.NORMAL, -1, 20, -1, 0, 2) + new StatusMove(Moves.PAIN_SPLIT, PokemonType.NORMAL, -1, 20, -1, 0, 2) .attr(HpSplitAttr) .condition(failOnBossCondition), - new AttackMove(Moves.SACRED_FIRE, Type.FIRE, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 2) + new AttackMove(Moves.SACRED_FIRE, PokemonType.FIRE, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 2) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .makesContact(false), - new AttackMove(Moves.MAGNITUDE, Type.GROUND, MoveCategory.PHYSICAL, -1, 100, 30, -1, 0, 2) + new AttackMove(Moves.MAGNITUDE, PokemonType.GROUND, MoveCategory.PHYSICAL, -1, 100, 30, -1, 0, 2) .attr(PreMoveMessageAttr, magnitudeMessageFunc) .attr(MagnitudePowerAttr) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.UNDERGROUND) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.DYNAMIC_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 50, 5, 100, 0, 2) + new AttackMove(Moves.DYNAMIC_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 50, 5, 100, 0, 2) .attr(ConfuseAttr) .punchingMove(), - new AttackMove(Moves.MEGAHORN, Type.BUG, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 2), - new AttackMove(Moves.DRAGON_BREATH, Type.DRAGON, MoveCategory.SPECIAL, 60, 100, 20, 30, 0, 2) + new AttackMove(Moves.MEGAHORN, PokemonType.BUG, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 2), + new AttackMove(Moves.DRAGON_BREATH, PokemonType.DRAGON, MoveCategory.SPECIAL, 60, 100, 20, 30, 0, 2) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new SelfStatusMove(Moves.BATON_PASS, Type.NORMAL, -1, 40, -1, 0, 2) + new SelfStatusMove(Moves.BATON_PASS, PokemonType.NORMAL, -1, 40, -1, 0, 2) .attr(ForceSwitchOutAttr, true, SwitchType.BATON_PASS) + .condition(failIfLastInPartyCondition) .hidesUser(), - new StatusMove(Moves.ENCORE, Type.NORMAL, 100, 5, -1, 0, 2) + new StatusMove(Moves.ENCORE, PokemonType.NORMAL, 100, 5, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.ENCORE, false, true) .ignoresSubstitute() - .condition((user, target, move) => new EncoreTag(user.id).canAdd(target)), - new AttackMove(Moves.PURSUIT, Type.DARK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 2) + .condition((user, target, move) => new EncoreTag(user.id).canAdd(target)) + .reflectable(), + new AttackMove(Moves.PURSUIT, PokemonType.DARK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 2) .partial(), // No effect implemented - new AttackMove(Moves.RAPID_SPIN, Type.NORMAL, MoveCategory.PHYSICAL, 50, 100, 40, 100, 0, 2) + new AttackMove(Moves.RAPID_SPIN, PokemonType.NORMAL, MoveCategory.PHYSICAL, 50, 100, 40, 100, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true) .attr(RemoveBattlerTagAttr, [ BattlerTagType.BIND, @@ -7973,426 +8906,445 @@ export function initMoves() { BattlerTagType.INFESTATION ], true) .attr(RemoveArenaTrapAttr), - new StatusMove(Moves.SWEET_SCENT, Type.NORMAL, 100, 20, -1, 0, 2) + new StatusMove(Moves.SWEET_SCENT, PokemonType.NORMAL, 100, 20, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.EVA ], -2) - .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.IRON_TAIL, Type.STEEL, MoveCategory.PHYSICAL, 100, 75, 15, 30, 0, 2) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new AttackMove(Moves.IRON_TAIL, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 75, 15, 30, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.METAL_CLAW, Type.STEEL, MoveCategory.PHYSICAL, 50, 95, 35, 10, 0, 2) + new AttackMove(Moves.METAL_CLAW, PokemonType.STEEL, MoveCategory.PHYSICAL, 50, 95, 35, 10, 0, 2) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true), - new AttackMove(Moves.VITAL_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 70, -1, 10, -1, -1, 2), - new SelfStatusMove(Moves.MORNING_SUN, Type.NORMAL, -1, 5, -1, 0, 2) + new AttackMove(Moves.VITAL_THROW, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 70, -1, 10, -1, -1, 2), + new SelfStatusMove(Moves.MORNING_SUN, PokemonType.NORMAL, -1, 5, -1, 0, 2) .attr(PlantHealAttr) .triageMove(), - new SelfStatusMove(Moves.SYNTHESIS, Type.GRASS, -1, 5, -1, 0, 2) + new SelfStatusMove(Moves.SYNTHESIS, PokemonType.GRASS, -1, 5, -1, 0, 2) .attr(PlantHealAttr) .triageMove(), - new SelfStatusMove(Moves.MOONLIGHT, Type.FAIRY, -1, 5, -1, 0, 2) + new SelfStatusMove(Moves.MOONLIGHT, PokemonType.FAIRY, -1, 5, -1, 0, 2) .attr(PlantHealAttr) .triageMove(), - new AttackMove(Moves.HIDDEN_POWER, Type.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 2) + new AttackMove(Moves.HIDDEN_POWER, PokemonType.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 2) .attr(HiddenPowerTypeAttr), - new AttackMove(Moves.CROSS_CHOP, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 2) + new AttackMove(Moves.CROSS_CHOP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 2) .attr(HighCritAttr), - new AttackMove(Moves.TWISTER, Type.DRAGON, MoveCategory.SPECIAL, 40, 100, 20, 20, 0, 2) + new AttackMove(Moves.TWISTER, PokemonType.DRAGON, MoveCategory.SPECIAL, 40, 100, 20, 20, 0, 2) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.FLYING) .attr(FlinchAttr) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.RAIN_DANCE, Type.WATER, -1, 5, -1, 0, 2) + new StatusMove(Moves.RAIN_DANCE, PokemonType.WATER, -1, 5, -1, 0, 2) .attr(WeatherChangeAttr, WeatherType.RAIN) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.SUNNY_DAY, Type.FIRE, -1, 5, -1, 0, 2) + new StatusMove(Moves.SUNNY_DAY, PokemonType.FIRE, -1, 5, -1, 0, 2) .attr(WeatherChangeAttr, WeatherType.SUNNY) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.CRUNCH, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 2) + new AttackMove(Moves.CRUNCH, PokemonType.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .bitingMove(), - new AttackMove(Moves.MIRROR_COAT, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 20, -1, -5, 2) + new AttackMove(Moves.MIRROR_COAT, PokemonType.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 20, -1, -5, 2) .attr(CounterDamageAttr, (move: Move) => move.category === MoveCategory.SPECIAL, 2) .target(MoveTarget.ATTACKER), - new StatusMove(Moves.PSYCH_UP, Type.NORMAL, -1, 10, -1, 0, 2) + new StatusMove(Moves.PSYCH_UP, PokemonType.NORMAL, -1, 10, -1, 0, 2) .ignoresSubstitute() .attr(CopyStatsAttr), - new AttackMove(Moves.EXTREME_SPEED, Type.NORMAL, MoveCategory.PHYSICAL, 80, 100, 5, -1, 2, 2), - new AttackMove(Moves.ANCIENT_POWER, Type.ROCK, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 2) + new AttackMove(Moves.EXTREME_SPEED, PokemonType.NORMAL, MoveCategory.PHYSICAL, 80, 100, 5, -1, 2, 2), + new AttackMove(Moves.ANCIENT_POWER, PokemonType.ROCK, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 2) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true), - new AttackMove(Moves.SHADOW_BALL, Type.GHOST, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 2) + new AttackMove(Moves.SHADOW_BALL, PokemonType.GHOST, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .ballBombMove(), - new AttackMove(Moves.FUTURE_SIGHT, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2) - .partial() // Complete buggy mess + new AttackMove(Moves.FUTURE_SIGHT, PokemonType.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, 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) + new AttackMove(Moves.ROCK_SMASH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 15, 50, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.WHIRLPOOL, Type.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2) + new AttackMove(Moves.WHIRLPOOL, PokemonType.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2) .attr(TrapAttr, BattlerTagType.WHIRLPOOL) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.UNDERWATER), - new AttackMove(Moves.BEAT_UP, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 2) + new AttackMove(Moves.BEAT_UP, PokemonType.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 2) .attr(MultiHitAttr, MultiHitType.BEAT_UP) .attr(BeatUpAttr) .makesContact(false), - new AttackMove(Moves.FAKE_OUT, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 10, 100, 3, 3) + new AttackMove(Moves.FAKE_OUT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 10, 100, 3, 3) .attr(FlinchAttr) .condition(new FirstMoveCondition()), - new AttackMove(Moves.UPROAR, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 10, -1, 0, 3) - .ignoresVirtual() + new AttackMove(Moves.UPROAR, PokemonType.NORMAL, MoveCategory.SPECIAL, 90, 100, 10, -1, 0, 3) .soundBased() .target(MoveTarget.RANDOM_NEAR_ENEMY) .partial(), // Does not lock the user, does not stop Pokemon from sleeping - new SelfStatusMove(Moves.STOCKPILE, Type.NORMAL, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.STOCKPILE, PokemonType.NORMAL, -1, 20, -1, 0, 3) .condition(user => (user.getTag(StockpilingTag)?.stockpiledCount ?? 0) < 3) .attr(AddBattlerTagAttr, BattlerTagType.STOCKPILING, true), - new AttackMove(Moves.SPIT_UP, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 10, -1, 0, 3) + new AttackMove(Moves.SPIT_UP, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, -1, 10, -1, 0, 3) .condition(hasStockpileStacksCondition) .attr(SpitUpPowerAttr, 100) .attr(RemoveBattlerTagAttr, [ BattlerTagType.STOCKPILING ], true), - new SelfStatusMove(Moves.SWALLOW, Type.NORMAL, -1, 10, -1, 0, 3) + new SelfStatusMove(Moves.SWALLOW, PokemonType.NORMAL, -1, 10, -1, 0, 3) .condition(hasStockpileStacksCondition) .attr(SwallowHealAttr) .attr(RemoveBattlerTagAttr, [ BattlerTagType.STOCKPILING ], true) .triageMove(), - new AttackMove(Moves.HEAT_WAVE, Type.FIRE, MoveCategory.SPECIAL, 95, 90, 10, 10, 0, 3) + new AttackMove(Moves.HEAT_WAVE, PokemonType.FIRE, MoveCategory.SPECIAL, 95, 90, 10, 10, 0, 3) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.HAIL, Type.ICE, -1, 10, -1, 0, 3) + new StatusMove(Moves.HAIL, PokemonType.ICE, -1, 10, -1, 0, 3) .attr(WeatherChangeAttr, WeatherType.HAIL) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.TORMENT, Type.DARK, 100, 15, -1, 0, 3) + new StatusMove(Moves.TORMENT, PokemonType.DARK, 100, 15, -1, 0, 3) .ignoresSubstitute() .edgeCase() // Incomplete implementation because of Uproar's partial implementation - .attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1), - new StatusMove(Moves.FLATTER, Type.DARK, 100, 15, -1, 0, 3) + .attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1) + .reflectable(), + new StatusMove(Moves.FLATTER, PokemonType.DARK, 100, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1) - .attr(ConfuseAttr), - new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3) - .attr(StatusEffectAttr, StatusEffect.BURN), - new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3) + .attr(ConfuseAttr) + .reflectable(), + new StatusMove(Moves.WILL_O_WISP, PokemonType.FIRE, 85, 15, -1, 0, 3) + .attr(StatusEffectAttr, StatusEffect.BURN) + .reflectable(), + new StatusMove(Moves.MEMENTO, PokemonType.DARK, 100, 10, -1, 0, 3) .attr(SacrificialAttrOnHit) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -2), - new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3) + new AttackMove(Moves.FACADE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => user.status && (user.status.effect === StatusEffect.BURN || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.PARALYSIS) ? 2 : 1) .attr(BypassBurnDamageReductionAttr), - new AttackMove(Moves.FOCUS_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) + new AttackMove(Moves.FOCUS_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 20, -1, -3, 3) .attr(MessageHeaderAttr, (user, move) => i18next.t("moveTriggers:isTighteningFocus", { pokemonName: getPokemonNameWithAffix(user) })) - .punchingMove() - .ignoresVirtual() - .condition((user, target, move) => !user.turnData.attacksReceived.find(r => r.damage)), - new AttackMove(Moves.SMELLING_SALTS, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3) + .attr(PreUseInterruptAttr, (user, target, move) => i18next.t("moveTriggers:lostFocus", { pokemonName: getPokemonNameWithAffix(user) }), user => !!user.turnData.attacksReceived.find(r => r.damage)) + .punchingMove(), + new AttackMove(Moves.SMELLING_SALTS, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.PARALYSIS ? 2 : 1) .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS), - new SelfStatusMove(Moves.FOLLOW_ME, Type.NORMAL, -1, 20, -1, 2, 3) + new SelfStatusMove(Moves.FOLLOW_ME, PokemonType.NORMAL, -1, 20, -1, 2, 3) .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, true), - new StatusMove(Moves.NATURE_POWER, Type.NORMAL, -1, 20, -1, 0, 3) - .attr(NaturePowerAttr) - .ignoresVirtual(), - new SelfStatusMove(Moves.CHARGE, Type.ELECTRIC, -1, 20, -1, 0, 3) + new StatusMove(Moves.NATURE_POWER, PokemonType.NORMAL, -1, 20, -1, 0, 3) + .attr(NaturePowerAttr), + new SelfStatusMove(Moves.CHARGE, PokemonType.ELECTRIC, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPDEF ], 1, true) .attr(AddBattlerTagAttr, BattlerTagType.CHARGED, true, false), - new StatusMove(Moves.TAUNT, Type.DARK, 100, 20, -1, 0, 3) + new StatusMove(Moves.TAUNT, PokemonType.DARK, 100, 20, -1, 0, 3) .ignoresSubstitute() - .attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4), - new StatusMove(Moves.HELPING_HAND, Type.NORMAL, -1, 20, -1, 5, 3) + .attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4) + .reflectable(), + new StatusMove(Moves.HELPING_HAND, PokemonType.NORMAL, -1, 20, -1, 5, 3) .attr(AddBattlerTagAttr, BattlerTagType.HELPING_HAND) .ignoresSubstitute() - .target(MoveTarget.NEAR_ALLY), - new StatusMove(Moves.TRICK, Type.PSYCHIC, 100, 10, -1, 0, 3) + .target(MoveTarget.NEAR_ALLY) + .condition(failIfSingleBattle), + new StatusMove(Moves.TRICK, PokemonType.PSYCHIC, 100, 10, -1, 0, 3) .unimplemented(), - new StatusMove(Moves.ROLE_PLAY, Type.PSYCHIC, -1, 10, -1, 0, 3) + new StatusMove(Moves.ROLE_PLAY, PokemonType.PSYCHIC, -1, 10, -1, 0, 3) .ignoresSubstitute() .attr(AbilityCopyAttr), - new SelfStatusMove(Moves.WISH, Type.NORMAL, -1, 10, -1, 0, 3) + new SelfStatusMove(Moves.WISH, PokemonType.NORMAL, -1, 10, -1, 0, 3) .triageMove() .attr(AddArenaTagAttr, ArenaTagType.WISH, 2, true), - new SelfStatusMove(Moves.ASSIST, Type.NORMAL, -1, 20, -1, 0, 3) - .attr(RandomMovesetMoveAttr, true) - .ignoresVirtual(), - new SelfStatusMove(Moves.INGRAIN, Type.GRASS, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.ASSIST, PokemonType.NORMAL, -1, 20, -1, 0, 3) + .attr(RandomMovesetMoveAttr, invalidAssistMoves, true), + new SelfStatusMove(Moves.INGRAIN, PokemonType.GRASS, -1, 20, -1, 0, 3) .attr(AddBattlerTagAttr, BattlerTagType.INGRAIN, true, true) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, true, true) .attr(RemoveBattlerTagAttr, [ BattlerTagType.FLOATING ], true), - new AttackMove(Moves.SUPERPOWER, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 3) + new AttackMove(Moves.SUPERPOWER, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1, true), - new SelfStatusMove(Moves.MAGIC_COAT, Type.PSYCHIC, -1, 15, -1, 4, 3) + new SelfStatusMove(Moves.MAGIC_COAT, PokemonType.PSYCHIC, -1, 15, -1, 4, 3) + .attr(AddBattlerTagAttr, BattlerTagType.MAGIC_COAT, true, true, 0) + .condition(failIfLastCondition) + // Interactions with stomping tantrum, instruct, and other moves that + // rely on move history + // Also will not reflect roar / whirlwind if the target has ForceSwitchOutImmunityAbAttr + .edgeCase(), + new SelfStatusMove(Moves.RECYCLE, PokemonType.NORMAL, -1, 10, -1, 0, 3) .unimplemented(), - new SelfStatusMove(Moves.RECYCLE, Type.NORMAL, -1, 10, -1, 0, 3) - .unimplemented(), - new AttackMove(Moves.REVENGE, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 3) + new AttackMove(Moves.REVENGE, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 3) .attr(TurnDamagedDoublePowerAttr), - new AttackMove(Moves.BRICK_BREAK, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 15, -1, 0, 3) + new AttackMove(Moves.BRICK_BREAK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 15, -1, 0, 3) .attr(RemoveScreensAttr), - new StatusMove(Moves.YAWN, Type.NORMAL, -1, 10, -1, 0, 3) + new StatusMove(Moves.YAWN, PokemonType.NORMAL, -1, 10, -1, 0, 3) .attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true) - .condition((user, target, move) => !target.status && !target.isSafeguarded(user)), - new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) + .condition((user, target, move) => !target.status && !target.isSafeguarded(user)) + .reflectable(), + new AttackMove(Moves.KNOCK_OFF, PokemonType.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferable).length > 0 ? 1.5 : 1) .attr(RemoveHeldItemAttr, false), - new AttackMove(Moves.ENDEAVOR, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 3) + new AttackMove(Moves.ENDEAVOR, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 3) .attr(MatchHpAttr) .condition(failOnBossCondition), - new AttackMove(Moves.ERUPTION, Type.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) + new AttackMove(Moves.ERUPTION, PokemonType.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) .attr(HpPowerAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.SKILL_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 3) + new StatusMove(Moves.SKILL_SWAP, PokemonType.PSYCHIC, -1, 10, -1, 0, 3) .ignoresSubstitute() .attr(SwitchAbilitiesAttr), - new StatusMove(Moves.IMPRISON, Type.PSYCHIC, 100, 10, -1, 0, 3) + new StatusMove(Moves.IMPRISON, PokemonType.PSYCHIC, 100, 10, -1, 0, 3) .ignoresSubstitute() .attr(AddArenaTagAttr, ArenaTagType.IMPRISON, 1, true, false) .target(MoveTarget.ENEMY_SIDE), - new SelfStatusMove(Moves.REFRESH, Type.NORMAL, -1, 20, -1, 0, 3) - .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN) + new SelfStatusMove(Moves.REFRESH, PokemonType.NORMAL, -1, 20, -1, 0, 3) + .attr(HealStatusEffectAttr, true, [ StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN ]) .condition((user, target, move) => !!user.status && (user.status.effect === StatusEffect.PARALYSIS || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.BURN)), - new SelfStatusMove(Moves.GRUDGE, Type.GHOST, -1, 5, -1, 0, 3) + new SelfStatusMove(Moves.GRUDGE, PokemonType.GHOST, -1, 5, -1, 0, 3) + .attr(AddBattlerTagAttr, BattlerTagType.GRUDGE, true, undefined, 1), + new SelfStatusMove(Moves.SNATCH, PokemonType.DARK, -1, 10, -1, 4, 3) .unimplemented(), - new SelfStatusMove(Moves.SNATCH, Type.DARK, -1, 10, -1, 4, 3) - .unimplemented(), - new AttackMove(Moves.SECRET_POWER, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, 30, 0, 3) + new AttackMove(Moves.SECRET_POWER, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, 30, 0, 3) .makesContact(false) .attr(SecretPowerAttr), - new ChargingAttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) + new ChargingAttackMove(Moves.DIVE, PokemonType.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) .chargeText(i18next.t("moveTriggers:hidUnderwater", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERWATER) - .chargeAttr(GulpMissileTagAttr) - .ignoresVirtual(), - new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) + .chargeAttr(GulpMissileTagAttr), + new AttackMove(Moves.ARM_THRUST, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) .attr(MultiHitAttr), - new SelfStatusMove(Moves.CAMOUFLAGE, Type.NORMAL, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.CAMOUFLAGE, PokemonType.NORMAL, -1, 20, -1, 0, 3) .attr(CopyBiomeTypeAttr), - new SelfStatusMove(Moves.TAIL_GLOW, Type.BUG, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.TAIL_GLOW, PokemonType.BUG, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], 3, true), - new AttackMove(Moves.LUSTER_PURGE, Type.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3) + new AttackMove(Moves.LUSTER_PURGE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new AttackMove(Moves.MIST_BALL, Type.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3) + new AttackMove(Moves.MIST_BALL, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) .ballBombMove(), - new StatusMove(Moves.FEATHER_DANCE, Type.FLYING, 100, 15, -1, 0, 3) + new StatusMove(Moves.FEATHER_DANCE, PokemonType.FLYING, 100, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], -2) - .danceMove(), - new StatusMove(Moves.TEETER_DANCE, Type.NORMAL, 100, 20, -1, 0, 3) + .danceMove() + .reflectable(), + new StatusMove(Moves.TEETER_DANCE, PokemonType.NORMAL, 100, 20, -1, 0, 3) .attr(ConfuseAttr) .danceMove() .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.BLAZE_KICK, Type.FIRE, MoveCategory.PHYSICAL, 85, 90, 10, 10, 0, 3) + new AttackMove(Moves.BLAZE_KICK, PokemonType.FIRE, MoveCategory.PHYSICAL, 85, 90, 10, 10, 0, 3) .attr(HighCritAttr) .attr(StatusEffectAttr, StatusEffect.BURN), - new StatusMove(Moves.MUD_SPORT, Type.GROUND, -1, 15, -1, 0, 3) + new StatusMove(Moves.MUD_SPORT, PokemonType.GROUND, -1, 15, -1, 0, 3) .ignoresProtect() .attr(AddArenaTagAttr, ArenaTagType.MUD_SPORT, 5) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.ICE_BALL, Type.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 3) + new AttackMove(Moves.ICE_BALL, PokemonType.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 3) .partial() // Does not lock the user properly, does not increase damage correctly .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL) .ballBombMove(), - new AttackMove(Moves.NEEDLE_ARM, Type.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, 30, 0, 3) + new AttackMove(Moves.NEEDLE_ARM, PokemonType.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, 30, 0, 3) .attr(FlinchAttr), - new SelfStatusMove(Moves.SLACK_OFF, Type.NORMAL, -1, 5, -1, 0, 3) + new SelfStatusMove(Moves.SLACK_OFF, PokemonType.NORMAL, -1, 5, -1, 0, 3) .attr(HealAttr, 0.5) .triageMove(), - new AttackMove(Moves.HYPER_VOICE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 10, -1, 0, 3) + new AttackMove(Moves.HYPER_VOICE, PokemonType.NORMAL, MoveCategory.SPECIAL, 90, 100, 10, -1, 0, 3) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.POISON_FANG, Type.POISON, MoveCategory.PHYSICAL, 50, 100, 15, 50, 0, 3) + new AttackMove(Moves.POISON_FANG, PokemonType.POISON, MoveCategory.PHYSICAL, 50, 100, 15, 50, 0, 3) .attr(StatusEffectAttr, StatusEffect.TOXIC) .bitingMove(), - new AttackMove(Moves.CRUSH_CLAW, Type.NORMAL, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 3) + new AttackMove(Moves.CRUSH_CLAW, PokemonType.NORMAL, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 3) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.BLAST_BURN, Type.FIRE, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) + new AttackMove(Moves.BLAST_BURN, PokemonType.FIRE, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) .attr(RechargeAttr), - new AttackMove(Moves.HYDRO_CANNON, Type.WATER, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) + new AttackMove(Moves.HYDRO_CANNON, PokemonType.WATER, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) .attr(RechargeAttr), - new AttackMove(Moves.METEOR_MASH, Type.STEEL, MoveCategory.PHYSICAL, 90, 90, 10, 20, 0, 3) + new AttackMove(Moves.METEOR_MASH, PokemonType.STEEL, MoveCategory.PHYSICAL, 90, 90, 10, 20, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true) .punchingMove(), - new AttackMove(Moves.ASTONISH, Type.GHOST, MoveCategory.PHYSICAL, 30, 100, 15, 30, 0, 3) + new AttackMove(Moves.ASTONISH, PokemonType.GHOST, MoveCategory.PHYSICAL, 30, 100, 15, 30, 0, 3) .attr(FlinchAttr), - new AttackMove(Moves.WEATHER_BALL, Type.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 3) + new AttackMove(Moves.WEATHER_BALL, PokemonType.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 3) .attr(WeatherBallTypeAttr) - .attr(MovePowerMultiplierAttr, (user, target, move) => [ WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN ].includes(user.scene.arena.weather?.weatherType!) && !user.scene.arena.weather?.isEffectSuppressed(user.scene) ? 2 : 1) // TODO: is this bang correct? + .attr(MovePowerMultiplierAttr, (user, target, move) => [ WeatherType.SUNNY, WeatherType.RAIN, WeatherType.SANDSTORM, WeatherType.HAIL, WeatherType.SNOW, WeatherType.FOG, WeatherType.HEAVY_RAIN, WeatherType.HARSH_SUN ].includes(globalScene.arena.weather?.weatherType!) && !globalScene.arena.weather?.isEffectSuppressed() ? 2 : 1) // TODO: is this bang correct? .ballBombMove(), - new StatusMove(Moves.AROMATHERAPY, Type.GRASS, -1, 5, -1, 0, 3) + new StatusMove(Moves.AROMATHERAPY, PokemonType.GRASS, -1, 5, -1, 0, 3) .attr(PartyStatusCureAttr, i18next.t("moveTriggers:soothingAromaWaftedThroughArea"), Abilities.SAP_SIPPER) .target(MoveTarget.PARTY), - new StatusMove(Moves.FAKE_TEARS, Type.DARK, 100, 20, -1, 0, 3) - .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), - new AttackMove(Moves.AIR_CUTTER, Type.FLYING, MoveCategory.SPECIAL, 60, 95, 25, -1, 0, 3) + new StatusMove(Moves.FAKE_TEARS, PokemonType.DARK, 100, 20, -1, 0, 3) + .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) + .reflectable(), + new AttackMove(Moves.AIR_CUTTER, PokemonType.FLYING, MoveCategory.SPECIAL, 60, 95, 25, -1, 0, 3) .attr(HighCritAttr) .slicingMove() .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.OVERHEAT, Type.FIRE, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 3) + new AttackMove(Moves.OVERHEAT, PokemonType.FIRE, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE), - new StatusMove(Moves.ODOR_SLEUTH, Type.NORMAL, -1, 40, -1, 0, 3) + new StatusMove(Moves.ODOR_SLEUTH, PokemonType.NORMAL, -1, 40, -1, 0, 3) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST) - .ignoresSubstitute(), - new AttackMove(Moves.ROCK_TOMB, Type.ROCK, MoveCategory.PHYSICAL, 60, 95, 15, 100, 0, 3) + .ignoresSubstitute() + .reflectable(), + new AttackMove(Moves.ROCK_TOMB, PokemonType.ROCK, MoveCategory.PHYSICAL, 60, 95, 15, 100, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .makesContact(false), - new AttackMove(Moves.SILVER_WIND, Type.BUG, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 3) + new AttackMove(Moves.SILVER_WIND, PokemonType.BUG, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .windMove(), - new StatusMove(Moves.METAL_SOUND, Type.STEEL, 85, 40, -1, 0, 3) + new StatusMove(Moves.METAL_SOUND, PokemonType.STEEL, 85, 40, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) - .soundBased(), - new StatusMove(Moves.GRASS_WHISTLE, Type.GRASS, 55, 15, -1, 0, 3) + .soundBased() + .reflectable(), + new StatusMove(Moves.GRASS_WHISTLE, PokemonType.GRASS, 55, 15, -1, 0, 3) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .soundBased(), - new StatusMove(Moves.TICKLE, Type.NORMAL, 100, 20, -1, 0, 3) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1), - new SelfStatusMove(Moves.COSMIC_POWER, Type.PSYCHIC, -1, 20, -1, 0, 3) + .soundBased() + .reflectable(), + new StatusMove(Moves.TICKLE, PokemonType.NORMAL, 100, 20, -1, 0, 3) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1) + .reflectable(), + new SelfStatusMove(Moves.COSMIC_POWER, PokemonType.PSYCHIC, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, true), - new AttackMove(Moves.WATER_SPOUT, Type.WATER, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) + new AttackMove(Moves.WATER_SPOUT, PokemonType.WATER, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) .attr(HpPowerAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.SIGNAL_BEAM, Type.BUG, MoveCategory.SPECIAL, 75, 100, 15, 10, 0, 3) + new AttackMove(Moves.SIGNAL_BEAM, PokemonType.BUG, MoveCategory.SPECIAL, 75, 100, 15, 10, 0, 3) .attr(ConfuseAttr), - new AttackMove(Moves.SHADOW_PUNCH, Type.GHOST, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 3) + new AttackMove(Moves.SHADOW_PUNCH, PokemonType.GHOST, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 3) .punchingMove(), - new AttackMove(Moves.EXTRASENSORY, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 20, 10, 0, 3) + new AttackMove(Moves.EXTRASENSORY, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 20, 10, 0, 3) .attr(FlinchAttr), - new AttackMove(Moves.SKY_UPPERCUT, Type.FIGHTING, MoveCategory.PHYSICAL, 85, 90, 15, -1, 0, 3) + new AttackMove(Moves.SKY_UPPERCUT, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 85, 90, 15, -1, 0, 3) .attr(HitsTagAttr, BattlerTagType.FLYING) .punchingMove(), - new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3) + new AttackMove(Moves.SAND_TOMB, PokemonType.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3) .attr(TrapAttr, BattlerTagType.SAND_TOMB) .makesContact(false), - new AttackMove(Moves.SHEER_COLD, Type.ICE, MoveCategory.SPECIAL, 200, 20, 5, -1, 0, 3) + new AttackMove(Moves.SHEER_COLD, PokemonType.ICE, MoveCategory.SPECIAL, 200, 20, 5, -1, 0, 3) .attr(IceNoEffectTypeAttr) .attr(OneHitKOAttr) .attr(SheerColdAccuracyAttr), - new AttackMove(Moves.MUDDY_WATER, Type.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3) + new AttackMove(Moves.MUDDY_WATER, PokemonType.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.BULLET_SEED, Type.GRASS, MoveCategory.PHYSICAL, 25, 100, 30, -1, 0, 3) + new AttackMove(Moves.BULLET_SEED, PokemonType.GRASS, MoveCategory.PHYSICAL, 25, 100, 30, -1, 0, 3) .attr(MultiHitAttr) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.AERIAL_ACE, Type.FLYING, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 3) + new AttackMove(Moves.AERIAL_ACE, PokemonType.FLYING, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 3) .slicingMove(), - new AttackMove(Moves.ICICLE_SPEAR, Type.ICE, MoveCategory.PHYSICAL, 25, 100, 30, -1, 0, 3) + new AttackMove(Moves.ICICLE_SPEAR, PokemonType.ICE, MoveCategory.PHYSICAL, 25, 100, 30, -1, 0, 3) .attr(MultiHitAttr) .makesContact(false), - new SelfStatusMove(Moves.IRON_DEFENSE, Type.STEEL, -1, 15, -1, 0, 3) + new SelfStatusMove(Moves.IRON_DEFENSE, PokemonType.STEEL, -1, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), - new StatusMove(Moves.BLOCK, Type.NORMAL, -1, 5, -1, 0, 3) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), - new StatusMove(Moves.HOWL, Type.NORMAL, -1, 40, -1, 0, 3) + new StatusMove(Moves.BLOCK, PokemonType.NORMAL, -1, 5, -1, 0, 3) + .condition(failIfGhostTypeCondition) + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .reflectable(), + new StatusMove(Moves.HOWL, PokemonType.NORMAL, -1, 40, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], 1) .soundBased() .target(MoveTarget.USER_AND_ALLIES), - new AttackMove(Moves.DRAGON_CLAW, Type.DRAGON, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 3), - new AttackMove(Moves.FRENZY_PLANT, Type.GRASS, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) + new AttackMove(Moves.DRAGON_CLAW, PokemonType.DRAGON, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 3), + new AttackMove(Moves.FRENZY_PLANT, PokemonType.GRASS, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3) .attr(RechargeAttr), - new SelfStatusMove(Moves.BULK_UP, Type.FIGHTING, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.BULK_UP, PokemonType.FIGHTING, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1, true), - new ChargingAttackMove(Moves.BOUNCE, Type.FLYING, MoveCategory.PHYSICAL, 85, 85, 5, 30, 0, 3) + new ChargingAttackMove(Moves.BOUNCE, PokemonType.FLYING, MoveCategory.PHYSICAL, 85, 85, 5, 30, 0, 3) .chargeText(i18next.t("moveTriggers:sprangUp", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .condition(failOnGravityCondition) - .ignoresVirtual(), - new AttackMove(Moves.MUD_SHOT, Type.GROUND, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 3) + .condition(failOnGravityCondition), + new AttackMove(Moves.MUD_SHOT, PokemonType.GROUND, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new AttackMove(Moves.POISON_TAIL, Type.POISON, MoveCategory.PHYSICAL, 50, 100, 25, 10, 0, 3) + new AttackMove(Moves.POISON_TAIL, PokemonType.POISON, MoveCategory.PHYSICAL, 50, 100, 25, 10, 0, 3) .attr(HighCritAttr) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.COVET, Type.NORMAL, MoveCategory.PHYSICAL, 60, 100, 25, -1, 0, 3) + new AttackMove(Moves.COVET, PokemonType.NORMAL, MoveCategory.PHYSICAL, 60, 100, 25, -1, 0, 3) .attr(StealHeldItemChanceAttr, 0.3), - new AttackMove(Moves.VOLT_TACKLE, Type.ELECTRIC, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 3) + new AttackMove(Moves.VOLT_TACKLE, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 3) .attr(RecoilAttr, false, 0.33) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .recklessMove(), - new AttackMove(Moves.MAGICAL_LEAF, Type.GRASS, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3), - new StatusMove(Moves.WATER_SPORT, Type.WATER, -1, 15, -1, 0, 3) + new AttackMove(Moves.MAGICAL_LEAF, PokemonType.GRASS, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3), + new StatusMove(Moves.WATER_SPORT, PokemonType.WATER, -1, 15, -1, 0, 3) .ignoresProtect() .attr(AddArenaTagAttr, ArenaTagType.WATER_SPORT, 5) .target(MoveTarget.BOTH_SIDES), - new SelfStatusMove(Moves.CALM_MIND, Type.PSYCHIC, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.CALM_MIND, PokemonType.PSYCHIC, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF ], 1, true), - new AttackMove(Moves.LEAF_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 3) + new AttackMove(Moves.LEAF_BLADE, PokemonType.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 3) .attr(HighCritAttr) .slicingMove(), - new SelfStatusMove(Moves.DRAGON_DANCE, Type.DRAGON, -1, 20, -1, 0, 3) + new SelfStatusMove(Moves.DRAGON_DANCE, PokemonType.DRAGON, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true) .danceMove(), - new AttackMove(Moves.ROCK_BLAST, Type.ROCK, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 3) + new AttackMove(Moves.ROCK_BLAST, PokemonType.ROCK, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 3) .attr(MultiHitAttr) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.SHOCK_WAVE, Type.ELECTRIC, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3), - new AttackMove(Moves.WATER_PULSE, Type.WATER, MoveCategory.SPECIAL, 60, 100, 20, 20, 0, 3) + new AttackMove(Moves.SHOCK_WAVE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 3), + new AttackMove(Moves.WATER_PULSE, PokemonType.WATER, MoveCategory.SPECIAL, 60, 100, 20, 20, 0, 3) .attr(ConfuseAttr) .pulseMove(), - new AttackMove(Moves.DOOM_DESIRE, Type.STEEL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 3) - .partial() // Complete buggy mess + new AttackMove(Moves.DOOM_DESIRE, PokemonType.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, 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) + new AttackMove(Moves.PSYCHO_BOOST, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true), - new SelfStatusMove(Moves.ROOST, Type.FLYING, -1, 5, -1, 0, 4) + new SelfStatusMove(Moves.ROOST, PokemonType.FLYING, -1, 5, -1, 0, 4) .attr(HealAttr, 0.5) .attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false) .triageMove(), - new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4) + new StatusMove(Moves.GRAVITY, PokemonType.PSYCHIC, -1, 5, -1, 0, 4) .ignoresProtect() .attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4) + new StatusMove(Moves.MIRACLE_EYE, PokemonType.PSYCHIC, -1, 40, -1, 0, 4) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_DARK) - .ignoresSubstitute(), - new AttackMove(Moves.WAKE_UP_SLAP, Type.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4) + .ignoresSubstitute() + .reflectable(), + new AttackMove(Moves.WAKE_UP_SLAP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => targetSleptOrComatoseCondition(user, target, move) ? 2 : 1) .attr(HealStatusEffectAttr, false, StatusEffect.SLEEP), - new AttackMove(Moves.HAMMER_ARM, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 4) + new AttackMove(Moves.HAMMER_ARM, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPD ], -1, true) .punchingMove(), - new AttackMove(Moves.GYRO_BALL, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) + new AttackMove(Moves.GYRO_BALL, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .attr(GyroBallPowerAttr) .ballBombMove(), - new SelfStatusMove(Moves.HEALING_WISH, Type.PSYCHIC, -1, 10, -1, 0, 4) - .attr(SacrificialFullRestoreAttr) - .triageMove(), - new AttackMove(Moves.BRINE, Type.WATER, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 4) + new SelfStatusMove(Moves.HEALING_WISH, PokemonType.PSYCHIC, -1, 10, -1, 0, 4) + .attr(SacrificialFullRestoreAttr, false, "moveTriggers:sacrificialFullRestore") + .triageMove() + .condition(failIfLastInPartyCondition), + new AttackMove(Moves.BRINE, PokemonType.WATER, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHpRatio() < 0.5 ? 2 : 1), - new AttackMove(Moves.NATURAL_GIFT, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 4) + new AttackMove(Moves.NATURAL_GIFT, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 4) .makesContact(false) .unimplemented(), - new AttackMove(Moves.FEINT, Type.NORMAL, MoveCategory.PHYSICAL, 30, 100, 10, -1, 2, 4) + new AttackMove(Moves.FEINT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 30, 100, 10, -1, 2, 4) .attr(RemoveBattlerTagAttr, [ BattlerTagType.PROTECTED ]) .attr(RemoveArenaTagsAttr, [ ArenaTagType.QUICK_GUARD, ArenaTagType.WIDE_GUARD, ArenaTagType.MAT_BLOCK, ArenaTagType.CRAFTY_SHIELD ], false) .makesContact(false) .ignoresProtect(), - new AttackMove(Moves.PLUCK, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) + new AttackMove(Moves.PLUCK, PokemonType.FLYING, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) .attr(StealEatBerryAttr), - new StatusMove(Moves.TAILWIND, Type.FLYING, -1, 15, -1, 0, 4) + new StatusMove(Moves.TAILWIND, PokemonType.FLYING, -1, 15, -1, 0, 4) .windMove() .attr(AddArenaTagAttr, ArenaTagType.TAILWIND, 4, true) .target(MoveTarget.USER_SIDE), - new StatusMove(Moves.ACUPRESSURE, Type.NORMAL, -1, 30, -1, 0, 4) + new StatusMove(Moves.ACUPRESSURE, PokemonType.NORMAL, -1, 30, -1, 0, 4) .attr(AcupressureStatStageChangeAttr) .target(MoveTarget.USER_OR_NEAR_ALLY), - new AttackMove(Moves.METAL_BURST, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) + new AttackMove(Moves.METAL_BURST, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) .attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5) .redirectCounter() .makesContact(false) .target(MoveTarget.ATTACKER), - new AttackMove(Moves.U_TURN, Type.BUG, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) + new AttackMove(Moves.U_TURN, PokemonType.BUG, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) .attr(ForceSwitchOutAttr, true), - new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) + new AttackMove(Moves.CLOSE_COMBAT, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true), - new AttackMove(Moves.PAYBACK, Type.DARK, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 4) - .attr(MovePowerMultiplierAttr, (user, target, move) => target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.BALL ? 2 : 1), - new AttackMove(Moves.ASSURANCE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4) + new AttackMove(Moves.PAYBACK, PokemonType.DARK, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 4) + .attr(MovePowerMultiplierAttr, (user, target, move) => target.getLastXMoves(1).find(m => m.turn === globalScene.currentBattle.turn) || globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.BALL ? 2 : 1), + new AttackMove(Moves.ASSURANCE, PokemonType.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.turnData.damageTaken > 0 ? 2 : 1), - new StatusMove(Moves.EMBARGO, Type.DARK, 100, 15, -1, 0, 4) + new StatusMove(Moves.EMBARGO, PokemonType.DARK, 100, 15, -1, 0, 4) + .reflectable() .unimplemented(), - new AttackMove(Moves.FLING, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) + new AttackMove(Moves.FLING, PokemonType.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) .makesContact(false) .unimplemented(), - new StatusMove(Moves.PSYCHO_SHIFT, Type.PSYCHIC, 100, 10, -1, 0, 4) + new StatusMove(Moves.PSYCHO_SHIFT, PokemonType.PSYCHIC, 100, 10, -1, 0, 4) .attr(PsychoShiftEffectAttr) .condition((user, target, move) => { let statusToApply = user.hasAbility(Abilities.COMATOSE) ? StatusEffect.SLEEP : undefined; @@ -8402,418 +9354,431 @@ export function initMoves() { return !!statusToApply && target.canSetStatus(statusToApply, false, false, user); } ), - new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4) + new AttackMove(Moves.TRUMP_CARD, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4) .makesContact() .attr(LessPPMorePowerAttr), - new StatusMove(Moves.HEAL_BLOCK, Type.PSYCHIC, 100, 15, -1, 0, 4) + new StatusMove(Moves.HEAL_BLOCK, PokemonType.PSYCHIC, 100, 15, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.HEAL_BLOCK, false, true, 5) - .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.WRING_OUT, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new AttackMove(Moves.WRING_OUT, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4) .attr(OpponentHighHpPowerAttr, 120) .makesContact(), - new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4) + new SelfStatusMove(Moves.POWER_TRICK, PokemonType.PSYCHIC, -1, 10, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.POWER_TRICK, true), - new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4) - .attr(SuppressAbilitiesAttr), - new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4) + new StatusMove(Moves.GASTRO_ACID, PokemonType.POISON, 100, 10, -1, 0, 4) + .attr(SuppressAbilitiesAttr) + .reflectable(), + new StatusMove(Moves.LUCKY_CHANT, PokemonType.NORMAL, -1, 30, -1, 0, 4) .attr(AddArenaTagAttr, ArenaTagType.NO_CRIT, 5, true, true) .target(MoveTarget.USER_SIDE), - new StatusMove(Moves.ME_FIRST, Type.NORMAL, -1, 20, -1, 0, 4) + new StatusMove(Moves.ME_FIRST, PokemonType.NORMAL, -1, 20, -1, 0, 4) .ignoresSubstitute() - .ignoresVirtual() .target(MoveTarget.NEAR_ENEMY) .unimplemented(), - new SelfStatusMove(Moves.COPYCAT, Type.NORMAL, -1, 20, -1, 0, 4) - .attr(CopyMoveAttr) - .ignoresVirtual(), - new StatusMove(Moves.POWER_SWAP, Type.PSYCHIC, -1, 10, 100, 0, 4) + new SelfStatusMove(Moves.COPYCAT, PokemonType.NORMAL, -1, 20, -1, 0, 4) + .attr(CopyMoveAttr, false, invalidCopycatMoves), + new StatusMove(Moves.POWER_SWAP, PokemonType.PSYCHIC, -1, 10, 100, 0, 4) .attr(SwapStatStagesAttr, [ Stat.ATK, Stat.SPATK ]) .ignoresSubstitute(), - new StatusMove(Moves.GUARD_SWAP, Type.PSYCHIC, -1, 10, 100, 0, 4) + new StatusMove(Moves.GUARD_SWAP, PokemonType.PSYCHIC, -1, 10, 100, 0, 4) .attr(SwapStatStagesAttr, [ Stat.DEF, Stat.SPDEF ]) .ignoresSubstitute(), - new AttackMove(Moves.PUNISHMENT, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) + new AttackMove(Moves.PUNISHMENT, PokemonType.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .makesContact(true) .attr(PunishmentPowerAttr), - new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4) + new AttackMove(Moves.LAST_RESORT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4) .attr(LastResortAttr), - new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4) - .attr(AbilityChangeAttr, Abilities.INSOMNIA), - new AttackMove(Moves.SUCKER_PUNCH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4) - .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? - new StatusMove(Moves.TOXIC_SPIKES, Type.POISON, -1, 20, -1, 0, 4) + new StatusMove(Moves.WORRY_SEED, PokemonType.GRASS, 100, 10, -1, 0, 4) + .attr(AbilityChangeAttr, Abilities.INSOMNIA) + .reflectable(), + new AttackMove(Moves.SUCKER_PUNCH, PokemonType.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4) + .condition((user, target, move) => globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? + new StatusMove(Moves.TOXIC_SPIKES, PokemonType.POISON, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES) - .target(MoveTarget.ENEMY_SIDE), - new StatusMove(Moves.HEART_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4) + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), + new StatusMove(Moves.HEART_SWAP, PokemonType.PSYCHIC, -1, 10, -1, 0, 4) .attr(SwapStatStagesAttr, BATTLE_STATS) .ignoresSubstitute(), - new SelfStatusMove(Moves.AQUA_RING, Type.WATER, -1, 20, -1, 0, 4) + new SelfStatusMove(Moves.AQUA_RING, PokemonType.WATER, -1, 20, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true), - new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4) - .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, true, true) - .condition((user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY) && [ BattlerTagType.FLOATING, BattlerTagType.IGNORE_FLYING, BattlerTagType.INGRAIN ].every((tag) => !user.getTag(tag))), - new AttackMove(Moves.FLARE_BLITZ, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 4) + new SelfStatusMove(Moves.MAGNET_RISE, PokemonType.ELECTRIC, -1, 10, -1, 0, 4) + .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, true, true, 5) + .condition((user, target, move) => !globalScene.arena.getTag(ArenaTagType.GRAVITY) && [ BattlerTagType.FLOATING, BattlerTagType.IGNORE_FLYING, BattlerTagType.INGRAIN ].every((tag) => !user.getTag(tag))), + new AttackMove(Moves.FLARE_BLITZ, PokemonType.FIRE, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 4) .attr(RecoilAttr, false, 0.33) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .recklessMove(), - new AttackMove(Moves.FORCE_PALM, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, 30, 0, 4) + new AttackMove(Moves.FORCE_PALM, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.AURA_SPHERE, Type.FIGHTING, MoveCategory.SPECIAL, 80, -1, 20, -1, 0, 4) + new AttackMove(Moves.AURA_SPHERE, PokemonType.FIGHTING, MoveCategory.SPECIAL, 80, -1, 20, -1, 0, 4) .pulseMove() .ballBombMove(), - new SelfStatusMove(Moves.ROCK_POLISH, Type.ROCK, -1, 20, -1, 0, 4) + new SelfStatusMove(Moves.ROCK_POLISH, PokemonType.ROCK, -1, 20, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true), - new AttackMove(Moves.POISON_JAB, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 20, 30, 0, 4) + new AttackMove(Moves.POISON_JAB, PokemonType.POISON, MoveCategory.PHYSICAL, 80, 100, 20, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.DARK_PULSE, Type.DARK, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 4) + new AttackMove(Moves.DARK_PULSE, PokemonType.DARK, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 4) .attr(FlinchAttr) .pulseMove(), - new AttackMove(Moves.NIGHT_SLASH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 15, -1, 0, 4) + new AttackMove(Moves.NIGHT_SLASH, PokemonType.DARK, MoveCategory.PHYSICAL, 70, 100, 15, -1, 0, 4) .attr(HighCritAttr) .slicingMove(), - new AttackMove(Moves.AQUA_TAIL, Type.WATER, MoveCategory.PHYSICAL, 90, 90, 10, -1, 0, 4), - new AttackMove(Moves.SEED_BOMB, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 4) + new AttackMove(Moves.AQUA_TAIL, PokemonType.WATER, MoveCategory.PHYSICAL, 90, 90, 10, -1, 0, 4), + new AttackMove(Moves.SEED_BOMB, PokemonType.GRASS, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 4) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.AIR_SLASH, Type.FLYING, MoveCategory.SPECIAL, 75, 95, 15, 30, 0, 4) + new AttackMove(Moves.AIR_SLASH, PokemonType.FLYING, MoveCategory.SPECIAL, 75, 95, 15, 30, 0, 4) .attr(FlinchAttr) .slicingMove(), - new AttackMove(Moves.X_SCISSOR, Type.BUG, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 4) + new AttackMove(Moves.X_SCISSOR, PokemonType.BUG, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 4) .slicingMove(), - new AttackMove(Moves.BUG_BUZZ, Type.BUG, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) + new AttackMove(Moves.BUG_BUZZ, PokemonType.BUG, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .soundBased(), - new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4) + new AttackMove(Moves.DRAGON_PULSE, PokemonType.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4) .pulseMove(), - new AttackMove(Moves.DRAGON_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4) + new AttackMove(Moves.DRAGON_RUSH, PokemonType.DRAGON, MoveCategory.PHYSICAL, 100, 75, 10, 20, 0, 4) .attr(AlwaysHitMinimizeAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .attr(FlinchAttr), - new AttackMove(Moves.POWER_GEM, Type.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4), - new AttackMove(Moves.DRAIN_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4) + new AttackMove(Moves.POWER_GEM, PokemonType.ROCK, MoveCategory.SPECIAL, 80, 100, 20, -1, 0, 4), + new AttackMove(Moves.DRAIN_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 4) .attr(HitHealAttr) .punchingMove() .triageMove(), - new AttackMove(Moves.VACUUM_WAVE, Type.FIGHTING, MoveCategory.SPECIAL, 40, 100, 30, -1, 1, 4), - new AttackMove(Moves.FOCUS_BLAST, Type.FIGHTING, MoveCategory.SPECIAL, 120, 70, 5, 10, 0, 4) + new AttackMove(Moves.VACUUM_WAVE, PokemonType.FIGHTING, MoveCategory.SPECIAL, 40, 100, 30, -1, 1, 4), + new AttackMove(Moves.FOCUS_BLAST, PokemonType.FIGHTING, MoveCategory.SPECIAL, 120, 70, 5, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .ballBombMove(), - new AttackMove(Moves.ENERGY_BALL, Type.GRASS, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) + new AttackMove(Moves.ENERGY_BALL, PokemonType.GRASS, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .ballBombMove(), - new AttackMove(Moves.BRAVE_BIRD, Type.FLYING, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4) + new AttackMove(Moves.BRAVE_BIRD, PokemonType.FLYING, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4) .attr(RecoilAttr, false, 0.33) .recklessMove(), - new AttackMove(Moves.EARTH_POWER, Type.GROUND, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) + new AttackMove(Moves.EARTH_POWER, PokemonType.GROUND, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new StatusMove(Moves.SWITCHEROO, Type.DARK, 100, 10, -1, 0, 4) + new StatusMove(Moves.SWITCHEROO, PokemonType.DARK, 100, 10, -1, 0, 4) .unimplemented(), - new AttackMove(Moves.GIGA_IMPACT, Type.NORMAL, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4) + new AttackMove(Moves.GIGA_IMPACT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4) .attr(RechargeAttr), - new SelfStatusMove(Moves.NASTY_PLOT, Type.DARK, -1, 20, -1, 0, 4) + new SelfStatusMove(Moves.NASTY_PLOT, PokemonType.DARK, -1, 20, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], 2, true), - new AttackMove(Moves.BULLET_PUNCH, Type.STEEL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4) + new AttackMove(Moves.BULLET_PUNCH, PokemonType.STEEL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4) .punchingMove(), - new AttackMove(Moves.AVALANCHE, Type.ICE, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 4) + new AttackMove(Moves.AVALANCHE, PokemonType.ICE, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 4) .attr(TurnDamagedDoublePowerAttr), - new AttackMove(Moves.ICE_SHARD, Type.ICE, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4) + new AttackMove(Moves.ICE_SHARD, PokemonType.ICE, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4) .makesContact(false), - new AttackMove(Moves.SHADOW_CLAW, Type.GHOST, MoveCategory.PHYSICAL, 70, 100, 15, -1, 0, 4) + new AttackMove(Moves.SHADOW_CLAW, PokemonType.GHOST, MoveCategory.PHYSICAL, 70, 100, 15, -1, 0, 4) .attr(HighCritAttr), - new AttackMove(Moves.THUNDER_FANG, Type.ELECTRIC, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) + new AttackMove(Moves.THUNDER_FANG, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) .attr(FlinchAttr) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .bitingMove(), - new AttackMove(Moves.ICE_FANG, Type.ICE, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) + new AttackMove(Moves.ICE_FANG, PokemonType.ICE, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) .attr(FlinchAttr) .attr(StatusEffectAttr, StatusEffect.FREEZE) .bitingMove(), - new AttackMove(Moves.FIRE_FANG, Type.FIRE, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) + new AttackMove(Moves.FIRE_FANG, PokemonType.FIRE, MoveCategory.PHYSICAL, 65, 95, 15, 10, 0, 4) .attr(FlinchAttr) .attr(StatusEffectAttr, StatusEffect.BURN) .bitingMove(), - new AttackMove(Moves.SHADOW_SNEAK, Type.GHOST, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4), - new AttackMove(Moves.MUD_BOMB, Type.GROUND, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4) + new AttackMove(Moves.SHADOW_SNEAK, PokemonType.GHOST, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4), + new AttackMove(Moves.MUD_BOMB, PokemonType.GROUND, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4) .attr(StatStageChangeAttr, [ Stat.ACC ], -1) .ballBombMove(), - new AttackMove(Moves.PSYCHO_CUT, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) + new AttackMove(Moves.PSYCHO_CUT, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) .attr(HighCritAttr) .slicingMove() .makesContact(false), - new AttackMove(Moves.ZEN_HEADBUTT, Type.PSYCHIC, MoveCategory.PHYSICAL, 80, 90, 15, 20, 0, 4) + new AttackMove(Moves.ZEN_HEADBUTT, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 80, 90, 15, 20, 0, 4) .attr(FlinchAttr), - new AttackMove(Moves.MIRROR_SHOT, Type.STEEL, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4) + new AttackMove(Moves.MIRROR_SHOT, PokemonType.STEEL, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.FLASH_CANNON, Type.STEEL, MoveCategory.SPECIAL, 80, 100, 10, 10, 0, 4) + new AttackMove(Moves.FLASH_CANNON, PokemonType.STEEL, MoveCategory.SPECIAL, 80, 100, 10, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new AttackMove(Moves.ROCK_CLIMB, Type.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, 20, 0, 4) + new AttackMove(Moves.ROCK_CLIMB, PokemonType.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, 20, 0, 4) .attr(ConfuseAttr), - new StatusMove(Moves.DEFOG, Type.FLYING, -1, 15, -1, 0, 4) + new StatusMove(Moves.DEFOG, PokemonType.FLYING, -1, 15, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.EVA ], -1) .attr(ClearWeatherAttr, WeatherType.FOG) .attr(ClearTerrainAttr) .attr(RemoveScreensAttr, false) - .attr(RemoveArenaTrapAttr, true), - new StatusMove(Moves.TRICK_ROOM, Type.PSYCHIC, -1, 5, -1, -7, 4) + .attr(RemoveArenaTrapAttr, true) + .attr(RemoveArenaTagsAttr, [ ArenaTagType.MIST, ArenaTagType.SAFEGUARD ], false) + .reflectable(), + new StatusMove(Moves.TRICK_ROOM, PokemonType.PSYCHIC, -1, 5, -1, -7, 4) .attr(AddArenaTagAttr, ArenaTagType.TRICK_ROOM, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.DRACO_METEOR, Type.DRAGON, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) + new AttackMove(Moves.DRACO_METEOR, PokemonType.DRAGON, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true), - new AttackMove(Moves.DISCHARGE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) + new AttackMove(Moves.DISCHARGE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.LAVA_PLUME, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) + new AttackMove(Moves.LAVA_PLUME, PokemonType.FIRE, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.BURN) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.LEAF_STORM, Type.GRASS, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) + new AttackMove(Moves.LEAF_STORM, PokemonType.GRASS, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true), - new AttackMove(Moves.POWER_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 4), - new AttackMove(Moves.ROCK_WRECKER, Type.ROCK, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4) + new AttackMove(Moves.POWER_WHIP, PokemonType.GRASS, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 4), + new AttackMove(Moves.ROCK_WRECKER, PokemonType.ROCK, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4) .attr(RechargeAttr) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.CROSS_POISON, Type.POISON, MoveCategory.PHYSICAL, 70, 100, 20, 10, 0, 4) + new AttackMove(Moves.CROSS_POISON, PokemonType.POISON, MoveCategory.PHYSICAL, 70, 100, 20, 10, 0, 4) .attr(HighCritAttr) .attr(StatusEffectAttr, StatusEffect.POISON) .slicingMove(), - new AttackMove(Moves.GUNK_SHOT, Type.POISON, MoveCategory.PHYSICAL, 120, 80, 5, 30, 0, 4) + new AttackMove(Moves.GUNK_SHOT, PokemonType.POISON, MoveCategory.PHYSICAL, 120, 80, 5, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), - new AttackMove(Moves.IRON_HEAD, Type.STEEL, MoveCategory.PHYSICAL, 80, 100, 15, 30, 0, 4) + new AttackMove(Moves.IRON_HEAD, PokemonType.STEEL, MoveCategory.PHYSICAL, 80, 100, 15, 30, 0, 4) .attr(FlinchAttr), - new AttackMove(Moves.MAGNET_BOMB, Type.STEEL, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 4) + new AttackMove(Moves.MAGNET_BOMB, PokemonType.STEEL, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 4) .makesContact(false) .ballBombMove(), - new AttackMove(Moves.STONE_EDGE, Type.ROCK, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 4) + new AttackMove(Moves.STONE_EDGE, PokemonType.ROCK, MoveCategory.PHYSICAL, 100, 80, 5, -1, 0, 4) .attr(HighCritAttr) .makesContact(false), - new StatusMove(Moves.CAPTIVATE, Type.NORMAL, 100, 20, -1, 0, 4) + new StatusMove(Moves.CAPTIVATE, PokemonType.NORMAL, 100, 20, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2) .condition((user, target, move) => target.isOppositeGender(user)) - .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.STEALTH_ROCK, Type.ROCK, -1, 20, -1, 0, 4) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new StatusMove(Moves.STEALTH_ROCK, PokemonType.ROCK, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.STEALTH_ROCK) - .target(MoveTarget.ENEMY_SIDE), - new AttackMove(Moves.GRASS_KNOT, Type.GRASS, MoveCategory.SPECIAL, -1, 100, 20, -1, 0, 4) + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), + new AttackMove(Moves.GRASS_KNOT, PokemonType.GRASS, MoveCategory.SPECIAL, -1, 100, 20, -1, 0, 4) .attr(WeightPowerAttr) .makesContact(), - new AttackMove(Moves.CHATTER, Type.FLYING, MoveCategory.SPECIAL, 65, 100, 20, 100, 0, 4) + new AttackMove(Moves.CHATTER, PokemonType.FLYING, MoveCategory.SPECIAL, 65, 100, 20, 100, 0, 4) .attr(ConfuseAttr) .soundBased(), - new AttackMove(Moves.JUDGMENT, Type.NORMAL, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 4) + new AttackMove(Moves.JUDGMENT, PokemonType.NORMAL, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 4) .attr(FormChangeItemTypeAttr), - new AttackMove(Moves.BUG_BITE, Type.BUG, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) + new AttackMove(Moves.BUG_BITE, PokemonType.BUG, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) .attr(StealEatBerryAttr), - new AttackMove(Moves.CHARGE_BEAM, Type.ELECTRIC, MoveCategory.SPECIAL, 50, 90, 10, 70, 0, 4) + new AttackMove(Moves.CHARGE_BEAM, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 50, 90, 10, 70, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true), - new AttackMove(Moves.WOOD_HAMMER, Type.GRASS, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4) + new AttackMove(Moves.WOOD_HAMMER, PokemonType.GRASS, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4) .attr(RecoilAttr, false, 0.33) .recklessMove(), - new AttackMove(Moves.AQUA_JET, Type.WATER, MoveCategory.PHYSICAL, 40, 100, 20, -1, 1, 4), - new AttackMove(Moves.ATTACK_ORDER, Type.BUG, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 4) + new AttackMove(Moves.AQUA_JET, PokemonType.WATER, MoveCategory.PHYSICAL, 40, 100, 20, -1, 1, 4), + new AttackMove(Moves.ATTACK_ORDER, PokemonType.BUG, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 4) .attr(HighCritAttr) .makesContact(false), - new SelfStatusMove(Moves.DEFEND_ORDER, Type.BUG, -1, 10, -1, 0, 4) + new SelfStatusMove(Moves.DEFEND_ORDER, PokemonType.BUG, -1, 10, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, true), - new SelfStatusMove(Moves.HEAL_ORDER, Type.BUG, -1, 5, -1, 0, 4) + new SelfStatusMove(Moves.HEAL_ORDER, PokemonType.BUG, -1, 5, -1, 0, 4) .attr(HealAttr, 0.5) .triageMove(), - new AttackMove(Moves.HEAD_SMASH, Type.ROCK, MoveCategory.PHYSICAL, 150, 80, 5, -1, 0, 4) + new AttackMove(Moves.HEAD_SMASH, PokemonType.ROCK, MoveCategory.PHYSICAL, 150, 80, 5, -1, 0, 4) .attr(RecoilAttr, false, 0.5) .recklessMove(), - new AttackMove(Moves.DOUBLE_HIT, Type.NORMAL, MoveCategory.PHYSICAL, 35, 90, 10, -1, 0, 4) + new AttackMove(Moves.DOUBLE_HIT, PokemonType.NORMAL, MoveCategory.PHYSICAL, 35, 90, 10, -1, 0, 4) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.ROAR_OF_TIME, Type.DRAGON, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 4) + new AttackMove(Moves.ROAR_OF_TIME, PokemonType.DRAGON, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 4) .attr(RechargeAttr), - new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4) + new AttackMove(Moves.SPACIAL_REND, PokemonType.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4) .attr(HighCritAttr), - new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4) - .attr(SacrificialAttrOnHit) + new SelfStatusMove(Moves.LUNAR_DANCE, PokemonType.PSYCHIC, -1, 10, -1, 0, 4) + .attr(SacrificialFullRestoreAttr, true, "moveTriggers:lunarDanceRestore") .danceMove() .triageMove() - .unimplemented(), - new AttackMove(Moves.CRUSH_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) + .condition(failIfLastInPartyCondition), + new AttackMove(Moves.CRUSH_GRIP, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .attr(OpponentHighHpPowerAttr, 120), - new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4) + new AttackMove(Moves.MAGMA_STORM, PokemonType.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4) .attr(TrapAttr, BattlerTagType.MAGMA_STORM), - new StatusMove(Moves.DARK_VOID, Type.DARK, 80, 10, -1, 0, 4) //Accuracy from Generations 4-6 + new StatusMove(Moves.DARK_VOID, PokemonType.DARK, 80, 10, -1, 0, 4) //Accuracy from Generations 4-6 .attr(StatusEffectAttr, StatusEffect.SLEEP) - .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.SEED_FLARE, Type.GRASS, MoveCategory.SPECIAL, 120, 85, 5, 40, 0, 4) + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), + new AttackMove(Moves.SEED_FLARE, PokemonType.GRASS, MoveCategory.SPECIAL, 120, 85, 5, 40, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), - new AttackMove(Moves.OMINOUS_WIND, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 4) + new AttackMove(Moves.OMINOUS_WIND, PokemonType.GHOST, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .windMove(), - new ChargingAttackMove(Moves.SHADOW_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) + new ChargingAttackMove(Moves.SHADOW_FORCE, PokemonType.GHOST, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) .chargeText(i18next.t("moveTriggers:vanishedInstantly", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.HIDDEN) - .ignoresProtect() - .ignoresVirtual(), - new SelfStatusMove(Moves.HONE_CLAWS, Type.DARK, -1, 15, -1, 0, 5) + .ignoresProtect(), + new SelfStatusMove(Moves.HONE_CLAWS, PokemonType.DARK, -1, 15, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.ACC ], 1, true), - new StatusMove(Moves.WIDE_GUARD, Type.ROCK, -1, 10, -1, 3, 5) + new StatusMove(Moves.WIDE_GUARD, PokemonType.ROCK, -1, 10, -1, 3, 5) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.WIDE_GUARD, 1, true, true) .condition(failIfLastCondition), - new StatusMove(Moves.GUARD_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) + new StatusMove(Moves.GUARD_SPLIT, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .attr(AverageStatsAttr, [ Stat.DEF, Stat.SPDEF ], "moveTriggers:sharedGuard"), - new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) + new StatusMove(Moves.POWER_SPLIT, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .attr(AverageStatsAttr, [ Stat.ATK, Stat.SPATK ], "moveTriggers:sharedPower"), - new StatusMove(Moves.WONDER_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5) + new StatusMove(Moves.WONDER_ROOM, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES) .unimplemented(), - new AttackMove(Moves.PSYSHOCK, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) + new AttackMove(Moves.PSYSHOCK, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(DefDefAttr), - new AttackMove(Moves.VENOSHOCK, Type.POISON, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) + new AttackMove(Moves.VENOSHOCK, PokemonType.POISON, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status && (target.status.effect === StatusEffect.POISON || target.status.effect === StatusEffect.TOXIC) ? 2 : 1), - new SelfStatusMove(Moves.AUTOTOMIZE, Type.STEEL, -1, 15, -1, 0, 5) + new SelfStatusMove(Moves.AUTOTOMIZE, PokemonType.STEEL, -1, 15, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true) .attr(AddBattlerTagAttr, BattlerTagType.AUTOTOMIZED, true), - new SelfStatusMove(Moves.RAGE_POWDER, Type.BUG, -1, 20, -1, 2, 5) + new SelfStatusMove(Moves.RAGE_POWDER, PokemonType.BUG, -1, 20, -1, 2, 5) .powderMove() .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, true), - new StatusMove(Moves.TELEKINESIS, Type.PSYCHIC, -1, 15, -1, 0, 5) + new StatusMove(Moves.TELEKINESIS, PokemonType.PSYCHIC, -1, 15, -1, 0, 5) .condition(failOnGravityCondition) .condition((_user, target, _move) => ![ Species.DIGLETT, Species.DUGTRIO, Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, Species.SANDYGAST, Species.PALOSSAND, Species.WIGLETT, Species.WUGTRIO ].includes(target.species.speciesId)) .condition((_user, target, _move) => !(target.species.speciesId === Species.GENGAR && target.getFormKey() === "mega")) .condition((_user, target, _move) => Utils.isNullOrUndefined(target.getTag(BattlerTagType.INGRAIN)) && Utils.isNullOrUndefined(target.getTag(BattlerTagType.IGNORE_FLYING))) .attr(AddBattlerTagAttr, BattlerTagType.TELEKINESIS, false, true, 3) - .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, false, true, 3), - new StatusMove(Moves.MAGIC_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5) + .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, false, true, 3) + .reflectable(), + new StatusMove(Moves.MAGIC_ROOM, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES) .unimplemented(), - new AttackMove(Moves.SMACK_DOWN, Type.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5) + new AttackMove(Moves.SMACK_DOWN, PokemonType.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [ BattlerTagType.FLYING, BattlerTagType.FLOATING, BattlerTagType.TELEKINESIS ]) .attr(HitsTagAttr, BattlerTagType.FLYING) .makesContact(false), - new AttackMove(Moves.STORM_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) + new AttackMove(Moves.STORM_THROW, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) .attr(CritOnlyAttr), - new AttackMove(Moves.FLAME_BURST, Type.FIRE, MoveCategory.SPECIAL, 70, 100, 15, -1, 0, 5) + new AttackMove(Moves.FLAME_BURST, PokemonType.FIRE, MoveCategory.SPECIAL, 70, 100, 15, -1, 0, 5) .attr(FlameBurstAttr), - new AttackMove(Moves.SLUDGE_WAVE, Type.POISON, MoveCategory.SPECIAL, 95, 100, 10, 10, 0, 5) + new AttackMove(Moves.SLUDGE_WAVE, PokemonType.POISON, MoveCategory.SPECIAL, 95, 100, 10, 10, 0, 5) .attr(StatusEffectAttr, StatusEffect.POISON) .target(MoveTarget.ALL_NEAR_OTHERS), - new SelfStatusMove(Moves.QUIVER_DANCE, Type.BUG, -1, 20, -1, 0, 5) + new SelfStatusMove(Moves.QUIVER_DANCE, PokemonType.BUG, -1, 20, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .danceMove(), - new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) + new AttackMove(Moves.HEAVY_SLAM, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) .attr(AlwaysHitMinimizeAttr) .attr(CompareWeightPowerAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED), - new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) + new AttackMove(Moves.SYNCHRONOISE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) .target(MoveTarget.ALL_NEAR_OTHERS) .condition(unknownTypeCondition) .attr(hitsSameTypeAttr), - new AttackMove(Moves.ELECTRO_BALL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5) + new AttackMove(Moves.ELECTRO_BALL, PokemonType.ELECTRIC, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 5) .attr(ElectroBallPowerAttr) .ballBombMove(), - new StatusMove(Moves.SOAK, Type.WATER, 100, 20, -1, 0, 5) - .attr(ChangeTypeAttr, Type.WATER), - new AttackMove(Moves.FLAME_CHARGE, Type.FIRE, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 5) + new StatusMove(Moves.SOAK, PokemonType.WATER, 100, 20, -1, 0, 5) + .attr(ChangeTypeAttr, PokemonType.WATER) + .reflectable(), + new AttackMove(Moves.FLAME_CHARGE, PokemonType.FIRE, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true), - new SelfStatusMove(Moves.COIL, Type.POISON, -1, 20, -1, 0, 5) + new SelfStatusMove(Moves.COIL, PokemonType.POISON, -1, 20, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.ACC ], 1, true), - new AttackMove(Moves.LOW_SWEEP, Type.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 20, 100, 0, 5) + new AttackMove(Moves.LOW_SWEEP, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new AttackMove(Moves.ACID_SPRAY, Type.POISON, MoveCategory.SPECIAL, 40, 100, 20, 100, 0, 5) + new AttackMove(Moves.ACID_SPRAY, PokemonType.POISON, MoveCategory.SPECIAL, 40, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) .ballBombMove(), - new AttackMove(Moves.FOUL_PLAY, Type.DARK, MoveCategory.PHYSICAL, 95, 100, 15, -1, 0, 5) + new AttackMove(Moves.FOUL_PLAY, PokemonType.DARK, MoveCategory.PHYSICAL, 95, 100, 15, -1, 0, 5) .attr(TargetAtkUserAtkAttr), - new StatusMove(Moves.SIMPLE_BEAM, Type.NORMAL, 100, 15, -1, 0, 5) - .attr(AbilityChangeAttr, Abilities.SIMPLE), - new StatusMove(Moves.ENTRAINMENT, Type.NORMAL, 100, 15, -1, 0, 5) - .attr(AbilityGiveAttr), - new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5) + new StatusMove(Moves.SIMPLE_BEAM, PokemonType.NORMAL, 100, 15, -1, 0, 5) + .attr(AbilityChangeAttr, Abilities.SIMPLE) + .reflectable(), + new StatusMove(Moves.ENTRAINMENT, PokemonType.NORMAL, 100, 15, -1, 0, 5) + .attr(AbilityGiveAttr) + .reflectable(), + new StatusMove(Moves.AFTER_YOU, PokemonType.NORMAL, -1, 15, -1, 0, 5) .ignoresProtect() .ignoresSubstitute() .target(MoveTarget.NEAR_OTHER) .condition(failIfSingleBattle) .condition((user, target, move) => !target.turnData.acted) .attr(AfterYouAttr), - new AttackMove(Moves.ROUND, Type.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) - .soundBased() - .partial(), // No effect implemented - new AttackMove(Moves.ECHOED_VOICE, Type.NORMAL, MoveCategory.SPECIAL, 40, 100, 15, -1, 0, 5) + new AttackMove(Moves.ROUND, PokemonType.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) + .attr(CueNextRoundAttr) + .attr(RoundPowerAttr) + .soundBased(), + new AttackMove(Moves.ECHOED_VOICE, PokemonType.NORMAL, MoveCategory.SPECIAL, 40, 100, 15, -1, 0, 5) .attr(ConsecutiveUseMultiBasePowerAttr, 5, false) .soundBased(), - new AttackMove(Moves.CHIP_AWAY, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 5) + new AttackMove(Moves.CHIP_AWAY, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 5) .attr(IgnoreOpponentStatStagesAttr), - new AttackMove(Moves.CLEAR_SMOG, Type.POISON, MoveCategory.SPECIAL, 50, -1, 15, -1, 0, 5) + new AttackMove(Moves.CLEAR_SMOG, PokemonType.POISON, MoveCategory.SPECIAL, 50, -1, 15, -1, 0, 5) .attr(ResetStatsAttr, false), - new AttackMove(Moves.STORED_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 20, 100, 10, -1, 0, 5) + new AttackMove(Moves.STORED_POWER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 20, 100, 10, -1, 0, 5) .attr(PositiveStatStagePowerAttr), - new StatusMove(Moves.QUICK_GUARD, Type.FIGHTING, -1, 15, -1, 3, 5) + new StatusMove(Moves.QUICK_GUARD, PokemonType.FIGHTING, -1, 15, -1, 3, 5) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.QUICK_GUARD, 1, true, true) .condition(failIfLastCondition), - new SelfStatusMove(Moves.ALLY_SWITCH, Type.PSYCHIC, -1, 15, -1, 2, 5) + new SelfStatusMove(Moves.ALLY_SWITCH, PokemonType.PSYCHIC, -1, 15, -1, 2, 5) .ignoresProtect() .unimplemented(), - new AttackMove(Moves.SCALD, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 5) + new AttackMove(Moves.SCALD, PokemonType.WATER, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 5) .attr(HealStatusEffectAttr, false, StatusEffect.FREEZE) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN), - new SelfStatusMove(Moves.SHELL_SMASH, Type.NORMAL, -1, 15, -1, 0, 5) + new SelfStatusMove(Moves.SHELL_SMASH, PokemonType.NORMAL, -1, 15, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], 2, true) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true), - new StatusMove(Moves.HEAL_PULSE, Type.PSYCHIC, -1, 10, -1, 0, 5) + new StatusMove(Moves.HEAL_PULSE, PokemonType.PSYCHIC, -1, 10, -1, 0, 5) .attr(HealAttr, 0.5, false, false) .pulseMove() - .triageMove(), - new AttackMove(Moves.HEX, Type.GHOST, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) + .triageMove() + .reflectable(), + new AttackMove(Moves.HEX, PokemonType.GHOST, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) .attr( MovePowerMultiplierAttr, (user, target, move) => target.status || target.hasAbility(Abilities.COMATOSE) ? 2 : 1), - new ChargingAttackMove(Moves.SKY_DROP, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) + new ChargingAttackMove(Moves.SKY_DROP, PokemonType.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) .chargeText(i18next.t("moveTriggers:tookTargetIntoSky", { pokemonName: "{USER}", targetName: "{TARGET}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) .condition(failOnGravityCondition) .condition((user, target, move) => !target.getTag(BattlerTagType.SUBSTITUTE)) - .ignoresVirtual() .partial(), // Should immobilize the target, Flying types should take no damage. cf https://bulbapedia.bulbagarden.net/wiki/Sky_Drop_(move) and https://www.smogon.com/dex/sv/moves/sky-drop/ - new SelfStatusMove(Moves.SHIFT_GEAR, Type.STEEL, -1, 10, -1, 0, 5) + new SelfStatusMove(Moves.SHIFT_GEAR, PokemonType.STEEL, -1, 10, -1, 0, 5) .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 - new AttackMove(Moves.INCINERATE, Type.FIRE, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) + new AttackMove(Moves.CIRCLE_THROW, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5) + .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) + .hidesTarget(), + new AttackMove(Moves.INCINERATE, PokemonType.FIRE, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) .target(MoveTarget.ALL_NEAR_ENEMIES) .attr(RemoveHeldItemAttr, true), - new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5) - .unimplemented(), - new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5) + new StatusMove(Moves.QUASH, PokemonType.DARK, 100, 15, -1, 0, 5) + .condition(failIfSingleBattle) + .condition((user, target, move) => !target.turnData.acted) + .attr(ForceLastAttr), + new AttackMove(Moves.ACROBATICS, PokemonType.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5) .attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().filter(i => i.isTransferable).reduce((v, m) => v + m.stackCount, 0))), - new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5) + new StatusMove(Moves.REFLECT_TYPE, PokemonType.NORMAL, -1, 15, -1, 0, 5) .ignoresSubstitute() .attr(CopyTypeAttr), - new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5) + new AttackMove(Moves.RETALIATE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5) .attr(MovePowerMultiplierAttr, (user, target, move) => { - const turn = user.scene.currentBattle.turn; - const lastPlayerFaint = user.scene.currentBattle.playerFaintsHistory[user.scene.currentBattle.playerFaintsHistory.length - 1]; - const lastEnemyFaint = user.scene.currentBattle.enemyFaintsHistory[user.scene.currentBattle.enemyFaintsHistory.length - 1]; + const turn = globalScene.currentBattle.turn; + const lastPlayerFaint = globalScene.currentBattle.playerFaintsHistory[globalScene.currentBattle.playerFaintsHistory.length - 1]; + const lastEnemyFaint = globalScene.currentBattle.enemyFaintsHistory[globalScene.currentBattle.enemyFaintsHistory.length - 1]; return ( (lastPlayerFaint !== undefined && turn - lastPlayerFaint.turn === 1 && user.isPlayer()) || (lastEnemyFaint !== undefined && turn - lastEnemyFaint.turn === 1 && !user.isPlayer()) ) ? 2 : 1; }), - new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5) + new AttackMove(Moves.FINAL_GAMBIT, PokemonType.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5) .attr(UserHpDamageAttr) .attr(SacrificialAttrOnHit), - new StatusMove(Moves.BESTOW, Type.NORMAL, -1, 15, -1, 0, 5) + new StatusMove(Moves.BESTOW, PokemonType.NORMAL, -1, 15, -1, 0, 5) .ignoresProtect() .ignoresSubstitute() .unimplemented(), - new AttackMove(Moves.INFERNO, Type.FIRE, MoveCategory.SPECIAL, 100, 50, 5, 100, 0, 5) + new AttackMove(Moves.INFERNO, PokemonType.FIRE, MoveCategory.SPECIAL, 100, 50, 5, 100, 0, 5) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.WATER_PLEDGE, Type.WATER, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) + new AttackMove(Moves.WATER_PLEDGE, PokemonType.WATER, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(AwaitCombinedPledgeAttr) .attr(CombinedPledgeTypeAttr) .attr(CombinedPledgePowerAttr) @@ -8821,7 +9786,7 @@ export function initMoves() { .attr(AddPledgeEffectAttr, ArenaTagType.WATER_FIRE_PLEDGE, Moves.FIRE_PLEDGE, true) .attr(AddPledgeEffectAttr, ArenaTagType.GRASS_WATER_PLEDGE, Moves.GRASS_PLEDGE) .attr(BypassRedirectAttr, true), - new AttackMove(Moves.FIRE_PLEDGE, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) + new AttackMove(Moves.FIRE_PLEDGE, PokemonType.FIRE, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(AwaitCombinedPledgeAttr) .attr(CombinedPledgeTypeAttr) .attr(CombinedPledgePowerAttr) @@ -8829,7 +9794,7 @@ export function initMoves() { .attr(AddPledgeEffectAttr, ArenaTagType.FIRE_GRASS_PLEDGE, Moves.GRASS_PLEDGE) .attr(AddPledgeEffectAttr, ArenaTagType.WATER_FIRE_PLEDGE, Moves.WATER_PLEDGE, true) .attr(BypassRedirectAttr, true), - new AttackMove(Moves.GRASS_PLEDGE, Type.GRASS, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) + new AttackMove(Moves.GRASS_PLEDGE, PokemonType.GRASS, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5) .attr(AwaitCombinedPledgeAttr) .attr(CombinedPledgeTypeAttr) .attr(CombinedPledgePowerAttr) @@ -8837,292 +9802,300 @@ export function initMoves() { .attr(AddPledgeEffectAttr, ArenaTagType.GRASS_WATER_PLEDGE, Moves.WATER_PLEDGE) .attr(AddPledgeEffectAttr, ArenaTagType.FIRE_GRASS_PLEDGE, Moves.FIRE_PLEDGE) .attr(BypassRedirectAttr, true), - new AttackMove(Moves.VOLT_SWITCH, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 5) + new AttackMove(Moves.VOLT_SWITCH, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 5) .attr(ForceSwitchOutAttr, true), - new AttackMove(Moves.STRUGGLE_BUG, Type.BUG, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 5) + new AttackMove(Moves.STRUGGLE_BUG, PokemonType.BUG, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.BULLDOZE, Type.GROUND, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 5) + new AttackMove(Moves.BULLDOZE, PokemonType.GROUND, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() ? 0.5 : 1) .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.FROST_BREATH, Type.ICE, MoveCategory.SPECIAL, 60, 90, 10, 100, 0, 5) + new AttackMove(Moves.FROST_BREATH, PokemonType.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 - new SelfStatusMove(Moves.WORK_UP, Type.NORMAL, -1, 30, -1, 0, 5) + new AttackMove(Moves.DRAGON_TAIL, PokemonType.DRAGON, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5) + .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) + .hidesTarget(), + new SelfStatusMove(Moves.WORK_UP, PokemonType.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) + new AttackMove(Moves.ELECTROWEB, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.WILD_CHARGE, Type.ELECTRIC, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5) + new AttackMove(Moves.WILD_CHARGE, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5) .attr(RecoilAttr) .recklessMove(), - new AttackMove(Moves.DRILL_RUN, Type.GROUND, MoveCategory.PHYSICAL, 80, 95, 10, -1, 0, 5) + new AttackMove(Moves.DRILL_RUN, PokemonType.GROUND, MoveCategory.PHYSICAL, 80, 95, 10, -1, 0, 5) .attr(HighCritAttr), - new AttackMove(Moves.DUAL_CHOP, Type.DRAGON, MoveCategory.PHYSICAL, 40, 90, 15, -1, 0, 5) + new AttackMove(Moves.DUAL_CHOP, PokemonType.DRAGON, MoveCategory.PHYSICAL, 40, 90, 15, -1, 0, 5) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.HEART_STAMP, Type.PSYCHIC, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 5) + new AttackMove(Moves.HEART_STAMP, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 5) .attr(FlinchAttr), - new AttackMove(Moves.HORN_LEECH, Type.GRASS, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 5) + new AttackMove(Moves.HORN_LEECH, PokemonType.GRASS, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 5) .attr(HitHealAttr) .triageMove(), - new AttackMove(Moves.SACRED_SWORD, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5) + new AttackMove(Moves.SACRED_SWORD, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5) .attr(IgnoreOpponentStatStagesAttr) .slicingMove(), - new AttackMove(Moves.RAZOR_SHELL, Type.WATER, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 5) + new AttackMove(Moves.RAZOR_SHELL, PokemonType.WATER, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 5) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .slicingMove(), - new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) + new AttackMove(Moves.HEAT_CRASH, PokemonType.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) .attr(AlwaysHitMinimizeAttr) .attr(CompareWeightPowerAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED), - new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5) + new AttackMove(Moves.LEAF_TORNADO, PokemonType.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.STEAMROLLER, Type.BUG, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 5) + new AttackMove(Moves.STEAMROLLER, PokemonType.BUG, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 5) .attr(AlwaysHitMinimizeAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .attr(FlinchAttr), - new SelfStatusMove(Moves.COTTON_GUARD, Type.GRASS, -1, 10, -1, 0, 5) + new SelfStatusMove(Moves.COTTON_GUARD, PokemonType.GRASS, -1, 10, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.DEF ], 3, true), - new AttackMove(Moves.NIGHT_DAZE, Type.DARK, MoveCategory.SPECIAL, 85, 95, 10, 40, 0, 5) + new AttackMove(Moves.NIGHT_DAZE, PokemonType.DARK, MoveCategory.SPECIAL, 85, 95, 10, 40, 0, 5) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), - new AttackMove(Moves.PSYSTRIKE, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 5) + new AttackMove(Moves.PSYSTRIKE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 5) .attr(DefDefAttr), - new AttackMove(Moves.TAIL_SLAP, Type.NORMAL, MoveCategory.PHYSICAL, 25, 85, 10, -1, 0, 5) + new AttackMove(Moves.TAIL_SLAP, PokemonType.NORMAL, MoveCategory.PHYSICAL, 25, 85, 10, -1, 0, 5) .attr(MultiHitAttr), - new AttackMove(Moves.HURRICANE, Type.FLYING, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 5) + new AttackMove(Moves.HURRICANE, PokemonType.FLYING, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 5) .attr(ThunderAccuracyAttr) .attr(ConfuseAttr) .attr(HitsTagAttr, BattlerTagType.FLYING) .windMove(), - new AttackMove(Moves.HEAD_CHARGE, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 5) + new AttackMove(Moves.HEAD_CHARGE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 5) .attr(RecoilAttr) .recklessMove(), - new AttackMove(Moves.GEAR_GRIND, Type.STEEL, MoveCategory.PHYSICAL, 50, 85, 15, -1, 0, 5) + new AttackMove(Moves.GEAR_GRIND, PokemonType.STEEL, MoveCategory.PHYSICAL, 50, 85, 15, -1, 0, 5) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.SEARING_SHOT, Type.FIRE, MoveCategory.SPECIAL, 100, 100, 5, 30, 0, 5) + new AttackMove(Moves.SEARING_SHOT, PokemonType.FIRE, MoveCategory.SPECIAL, 100, 100, 5, 30, 0, 5) .attr(StatusEffectAttr, StatusEffect.BURN) .ballBombMove() .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.TECHNO_BLAST, Type.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 5) + new AttackMove(Moves.TECHNO_BLAST, PokemonType.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 5) .attr(TechnoBlastTypeAttr), - new AttackMove(Moves.RELIC_SONG, Type.NORMAL, MoveCategory.SPECIAL, 75, 100, 10, 10, 0, 5) + new AttackMove(Moves.RELIC_SONG, PokemonType.NORMAL, MoveCategory.SPECIAL, 75, 100, 10, 10, 0, 5) .attr(StatusEffectAttr, StatusEffect.SLEEP) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.SECRET_SWORD, Type.FIGHTING, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 5) + new AttackMove(Moves.SECRET_SWORD, PokemonType.FIGHTING, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 5) .attr(DefDefAttr) .slicingMove(), - new AttackMove(Moves.GLACIATE, Type.ICE, MoveCategory.SPECIAL, 65, 95, 10, 100, 0, 5) + new AttackMove(Moves.GLACIATE, PokemonType.ICE, MoveCategory.SPECIAL, 65, 95, 10, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.BOLT_STRIKE, Type.ELECTRIC, MoveCategory.PHYSICAL, 130, 85, 5, 20, 0, 5) + new AttackMove(Moves.BOLT_STRIKE, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 130, 85, 5, 20, 0, 5) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.BLUE_FLARE, Type.FIRE, MoveCategory.SPECIAL, 130, 85, 5, 20, 0, 5) + new AttackMove(Moves.BLUE_FLARE, PokemonType.FIRE, MoveCategory.SPECIAL, 130, 85, 5, 20, 0, 5) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.FIERY_DANCE, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 50, 0, 5) + new AttackMove(Moves.FIERY_DANCE, PokemonType.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 50, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) .danceMove(), - new ChargingAttackMove(Moves.FREEZE_SHOCK, Type.ICE, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 5) + new ChargingAttackMove(Moves.FREEZE_SHOCK, PokemonType.ICE, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 5) .chargeText(i18next.t("moveTriggers:becameCloakedInFreezingLight", { pokemonName: "{USER}" })) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .makesContact(false), - new ChargingAttackMove(Moves.ICE_BURN, Type.ICE, MoveCategory.SPECIAL, 140, 90, 5, 30, 0, 5) + new ChargingAttackMove(Moves.ICE_BURN, PokemonType.ICE, MoveCategory.SPECIAL, 140, 90, 5, 30, 0, 5) .chargeText(i18next.t("moveTriggers:becameCloakedInFreezingAir", { pokemonName: "{USER}" })) - .attr(StatusEffectAttr, StatusEffect.BURN) - .ignoresVirtual(), - new AttackMove(Moves.SNARL, Type.DARK, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) + .attr(StatusEffectAttr, StatusEffect.BURN), + new AttackMove(Moves.SNARL, PokemonType.DARK, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.ICICLE_CRASH, Type.ICE, MoveCategory.PHYSICAL, 85, 90, 10, 30, 0, 5) + new AttackMove(Moves.ICICLE_CRASH, PokemonType.ICE, MoveCategory.PHYSICAL, 85, 90, 10, 30, 0, 5) .attr(FlinchAttr) .makesContact(false), - new AttackMove(Moves.V_CREATE, Type.FIRE, MoveCategory.PHYSICAL, 180, 95, 5, -1, 0, 5) + new AttackMove(Moves.V_CREATE, PokemonType.FIRE, MoveCategory.PHYSICAL, 180, 95, 5, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF, Stat.SPD ], -1, true), - new AttackMove(Moves.FUSION_FLARE, Type.FIRE, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 5) + new AttackMove(Moves.FUSION_FLARE, PokemonType.FIRE, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 5) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(LastMoveDoublePowerAttr, Moves.FUSION_BOLT), - new AttackMove(Moves.FUSION_BOLT, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 5) + new AttackMove(Moves.FUSION_BOLT, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 5) .attr(LastMoveDoublePowerAttr, Moves.FUSION_FLARE) .makesContact(false), - new AttackMove(Moves.FLYING_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) + new AttackMove(Moves.FLYING_PRESS, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 95, 10, -1, 0, 6) .attr(AlwaysHitMinimizeAttr) .attr(FlyingTypeMultiplierAttr) .attr(HitsTagForDoubleDamageAttr, BattlerTagType.MINIMIZED) .condition(failOnGravityCondition), - new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) + new StatusMove(Moves.MAT_BLOCK, PokemonType.FIGHTING, -1, 10, -1, 0, 6) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.MAT_BLOCK, 1, true, true) .condition(new FirstMoveCondition()) .condition(failIfLastCondition), - new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) + new AttackMove(Moves.BELCH, PokemonType.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) .condition((user, target, move) => user.battleData.berriesEaten.length > 0), - new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, -1, 0, 6) + new StatusMove(Moves.ROTOTILLER, PokemonType.GROUND, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) .condition((user, target, move) => { // If any fielded pokémon is grass-type and grounded. - return [ ...user.scene.getEnemyParty(), ...user.scene.getParty() ].some((poke) => poke.isOfType(Type.GRASS) && poke.isGrounded()); + return [ ...globalScene.getEnemyParty(), ...globalScene.getPlayerParty() ].some((poke) => poke.isOfType(PokemonType.GRASS) && poke.isGrounded()); }) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, (user, target, move) => target.isOfType(Type.GRASS) && target.isGrounded()), - new StatusMove(Moves.STICKY_WEB, Type.BUG, -1, 20, -1, 0, 6) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => target.isOfType(PokemonType.GRASS) && target.isGrounded() }), + new StatusMove(Moves.STICKY_WEB, PokemonType.BUG, -1, 20, -1, 0, 6) .attr(AddArenaTrapTagAttr, ArenaTagType.STICKY_WEB) - .target(MoveTarget.ENEMY_SIDE), - new AttackMove(Moves.FELL_STINGER, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), + new AttackMove(Moves.FELL_STINGER, PokemonType.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) .attr(PostVictoryStatStageChangeAttr, [ Stat.ATK ], 3, true ), - new ChargingAttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + new ChargingAttackMove(Moves.PHANTOM_FORCE, PokemonType.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .chargeText(i18next.t("moveTriggers:vanishedInstantly", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.HIDDEN) - .ignoresProtect() - .ignoresVirtual(), - new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GHOST) - .edgeCase(), // Weird interaction with Forest's Curse, reflect type, burn up - new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, -1, 0, 6) + .ignoresProtect(), + new StatusMove(Moves.TRICK_OR_TREAT, PokemonType.GHOST, 100, 20, -1, 0, 6) + .attr(AddTypeAttr, PokemonType.GHOST) + .reflectable(), + new StatusMove(Moves.NOBLE_ROAR, PokemonType.NORMAL, 100, 30, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1) - .soundBased(), - new StatusMove(Moves.ION_DELUGE, Type.ELECTRIC, -1, 25, -1, 1, 6) + .soundBased() + .reflectable(), + new StatusMove(Moves.ION_DELUGE, PokemonType.ELECTRIC, -1, 25, -1, 1, 6) .attr(AddArenaTagAttr, ArenaTagType.ION_DELUGE) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.PARABOLIC_CHARGE, Type.ELECTRIC, MoveCategory.SPECIAL, 65, 100, 20, -1, 0, 6) + new AttackMove(Moves.PARABOLIC_CHARGE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 65, 100, 20, -1, 0, 6) .attr(HitHealAttr) .target(MoveTarget.ALL_NEAR_OTHERS) .triageMove(), - new StatusMove(Moves.FORESTS_CURSE, Type.GRASS, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GRASS) - .edgeCase(), // Weird interaction with Trick or Treat, reflect type, burn up - new AttackMove(Moves.PETAL_BLIZZARD, Type.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 6) + new StatusMove(Moves.FORESTS_CURSE, PokemonType.GRASS, 100, 20, -1, 0, 6) + .attr(AddTypeAttr, PokemonType.GRASS) + .reflectable(), + new AttackMove(Moves.PETAL_BLIZZARD, PokemonType.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 6) .windMove() .makesContact(false) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.FREEZE_DRY, Type.ICE, MoveCategory.SPECIAL, 70, 100, 20, 10, 0, 6) + new AttackMove(Moves.FREEZE_DRY, PokemonType.ICE, MoveCategory.SPECIAL, 70, 100, 20, 10, 0, 6) .attr(StatusEffectAttr, StatusEffect.FREEZE) - .attr(WaterSuperEffectTypeMultiplierAttr) - .edgeCase(), // This currently just multiplies the move's power instead of changing its effectiveness. It also doesn't account for abilities that modify type effectiveness such as tera shell. - new AttackMove(Moves.DISARMING_VOICE, Type.FAIRY, MoveCategory.SPECIAL, 40, -1, 15, -1, 0, 6) + .attr(FreezeDryAttr), + new AttackMove(Moves.DISARMING_VOICE, PokemonType.FAIRY, MoveCategory.SPECIAL, 40, -1, 15, -1, 0, 6) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, -1, 0, 6) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, null, true, true, MoveEffectTrigger.PRE_APPLY) + new StatusMove(Moves.PARTING_SHOT, PokemonType.DARK, 100, 20, -1, 0, 6) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, { trigger: MoveEffectTrigger.PRE_APPLY }) .attr(ForceSwitchOutAttr, true) - .soundBased(), - new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6) - .attr(InvertStatsAttr), - new AttackMove(Moves.DRAINING_KISS, Type.FAIRY, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 6) + .soundBased() + .reflectable(), + new StatusMove(Moves.TOPSY_TURVY, PokemonType.DARK, -1, 20, -1, 0, 6) + .attr(InvertStatsAttr) + .reflectable(), + new AttackMove(Moves.DRAINING_KISS, PokemonType.FAIRY, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 6) .attr(HitHealAttr, 0.75) .makesContact() .triageMove(), - new StatusMove(Moves.CRAFTY_SHIELD, Type.FAIRY, -1, 10, -1, 3, 6) + new StatusMove(Moves.CRAFTY_SHIELD, PokemonType.FAIRY, -1, 10, -1, 3, 6) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true) .condition(failIfLastCondition), - new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, -1, 0, 6) + new StatusMove(Moves.FLOWER_SHIELD, PokemonType.FAIRY, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) - .attr(StatStageChangeAttr, [ Stat.DEF ], 1, false, (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag)), - new StatusMove(Moves.GRASSY_TERRAIN, Type.GRASS, -1, 10, -1, 0, 6) + .attr(StatStageChangeAttr, [ Stat.DEF ], 1, false, { condition: (user, target, move) => target.getTypes().includes(PokemonType.GRASS) && !target.getTag(SemiInvulnerableTag) }), + new StatusMove(Moves.GRASSY_TERRAIN, PokemonType.GRASS, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.GRASSY) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.MISTY_TERRAIN, Type.FAIRY, -1, 10, -1, 0, 6) + new StatusMove(Moves.MISTY_TERRAIN, PokemonType.FAIRY, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.MISTY) .target(MoveTarget.BOTH_SIDES), - new StatusMove(Moves.ELECTRIFY, Type.ELECTRIC, -1, 20, -1, 0, 6) + new StatusMove(Moves.ELECTRIFY, PokemonType.ELECTRIC, -1, 20, -1, 0, 6) .attr(AddBattlerTagAttr, BattlerTagType.ELECTRIFIED, false, true), - new AttackMove(Moves.PLAY_ROUGH, Type.FAIRY, MoveCategory.PHYSICAL, 90, 90, 10, 10, 0, 6) + new AttackMove(Moves.PLAY_ROUGH, PokemonType.FAIRY, MoveCategory.PHYSICAL, 90, 90, 10, 10, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.FAIRY_WIND, Type.FAIRY, MoveCategory.SPECIAL, 40, 100, 30, -1, 0, 6) + new AttackMove(Moves.FAIRY_WIND, PokemonType.FAIRY, MoveCategory.SPECIAL, 40, 100, 30, -1, 0, 6) .windMove(), - new AttackMove(Moves.MOONBLAST, Type.FAIRY, MoveCategory.SPECIAL, 95, 100, 15, 30, 0, 6) + new AttackMove(Moves.MOONBLAST, PokemonType.FAIRY, MoveCategory.SPECIAL, 95, 100, 15, 30, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1), - new AttackMove(Moves.BOOMBURST, Type.NORMAL, MoveCategory.SPECIAL, 140, 100, 10, -1, 0, 6) + new AttackMove(Moves.BOOMBURST, PokemonType.NORMAL, MoveCategory.SPECIAL, 140, 100, 10, -1, 0, 6) .soundBased() .target(MoveTarget.ALL_NEAR_OTHERS), - new StatusMove(Moves.FAIRY_LOCK, Type.FAIRY, -1, 10, -1, 0, 6) + new StatusMove(Moves.FAIRY_LOCK, PokemonType.FAIRY, -1, 10, -1, 0, 6) .ignoresSubstitute() + .ignoresProtect() .target(MoveTarget.BOTH_SIDES) - .unimplemented(), - new SelfStatusMove(Moves.KINGS_SHIELD, Type.STEEL, -1, 10, -1, 4, 6) + .attr(AddArenaTagAttr, ArenaTagType.FAIRY_LOCK, 2, true), + new SelfStatusMove(Moves.KINGS_SHIELD, PokemonType.STEEL, -1, 10, -1, 4, 6) .attr(ProtectAttr, BattlerTagType.KINGS_SHIELD) .condition(failIfLastCondition), - new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, -1, 0, 6) + new StatusMove(Moves.PLAY_NICE, PokemonType.NORMAL, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) - .ignoresSubstitute(), - new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, -1, 0, 6) + .ignoresSubstitute() + .reflectable(), + new StatusMove(Moves.CONFIDE, PokemonType.NORMAL, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) - .soundBased(), - new AttackMove(Moves.DIAMOND_STORM, Type.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6) - .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true, undefined, undefined, undefined, undefined, true) + .soundBased() + .reflectable(), + new AttackMove(Moves.DIAMOND_STORM, PokemonType.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6) + .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true, { firstTargetOnly: true }) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.STEAM_ERUPTION, Type.WATER, MoveCategory.SPECIAL, 110, 95, 5, 30, 0, 6) + new AttackMove(Moves.STEAM_ERUPTION, PokemonType.WATER, MoveCategory.SPECIAL, 110, 95, 5, 30, 0, 6) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(HealStatusEffectAttr, false, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.HYPERSPACE_HOLE, Type.PSYCHIC, MoveCategory.SPECIAL, 80, -1, 5, -1, 0, 6) + new AttackMove(Moves.HYPERSPACE_HOLE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, -1, 5, -1, 0, 6) .ignoresProtect() .ignoresSubstitute(), - new AttackMove(Moves.WATER_SHURIKEN, Type.WATER, MoveCategory.SPECIAL, 15, 100, 20, -1, 1, 6) + new AttackMove(Moves.WATER_SHURIKEN, PokemonType.WATER, MoveCategory.SPECIAL, 15, 100, 20, -1, 1, 6) .attr(MultiHitAttr) .attr(WaterShurikenPowerAttr) .attr(WaterShurikenMultiHitTypeAttr), - new AttackMove(Moves.MYSTICAL_FIRE, Type.FIRE, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 6) + new AttackMove(Moves.MYSTICAL_FIRE, PokemonType.FIRE, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1), - new SelfStatusMove(Moves.SPIKY_SHIELD, Type.GRASS, -1, 10, -1, 4, 6) + new SelfStatusMove(Moves.SPIKY_SHIELD, PokemonType.GRASS, -1, 10, -1, 4, 6) .attr(ProtectAttr, BattlerTagType.SPIKY_SHIELD) .condition(failIfLastCondition), - new StatusMove(Moves.AROMATIC_MIST, Type.FAIRY, -1, 20, -1, 0, 6) + new StatusMove(Moves.AROMATIC_MIST, PokemonType.FAIRY, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPDEF ], 1) .ignoresSubstitute() + .condition(failIfSingleBattle) .target(MoveTarget.NEAR_ALLY), - new StatusMove(Moves.EERIE_IMPULSE, Type.ELECTRIC, 100, 15, -1, 0, 6) - .attr(StatStageChangeAttr, [ Stat.SPATK ], -2), - new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, -1, 0, 6) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], -1, false, (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) + new StatusMove(Moves.EERIE_IMPULSE, PokemonType.ELECTRIC, 100, 15, -1, 0, 6) + .attr(StatStageChangeAttr, [ Stat.SPATK ], -2) + .reflectable(), + new StatusMove(Moves.VENOM_DRENCH, PokemonType.POISON, 100, 20, -1, 0, 6) + .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) + .reflectable(), + new StatusMove(Moves.POWDER, PokemonType.BUG, 100, 20, -1, 1, 6) + .attr(AddBattlerTagAttr, BattlerTagType.POWDER, false, true) .ignoresSubstitute() .powderMove() - .unimplemented(), - new ChargingSelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6) + .reflectable(), + new ChargingSelfStatusMove(Moves.GEOMANCY, PokemonType.FAIRY, -1, 10, -1, 0, 6) .chargeText(i18next.t("moveTriggers:isChargingPower", { pokemonName: "{USER}" })) - .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true) - .ignoresVirtual(), - new StatusMove(Moves.MAGNETIC_FLUX, Type.ELECTRIC, -1, 20, -1, 0, 6) - .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, false, (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false))) + .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true), + new StatusMove(Moves.MAGNETIC_FLUX, PokemonType.ELECTRIC, -1, 20, -1, 0, 6) + .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, false, { condition: (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false)) }) .ignoresSubstitute() .target(MoveTarget.USER_AND_ALLIES) .condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS ].find(a => p.hasAbility(a, false)))), - new StatusMove(Moves.HAPPY_HOUR, Type.NORMAL, -1, 30, -1, 0, 6) // No animation + new StatusMove(Moves.HAPPY_HOUR, PokemonType.NORMAL, -1, 30, -1, 0, 6) // No animation .attr(AddArenaTagAttr, ArenaTagType.HAPPY_HOUR, null, true) .target(MoveTarget.USER_SIDE), - new StatusMove(Moves.ELECTRIC_TERRAIN, Type.ELECTRIC, -1, 10, -1, 0, 6) + new StatusMove(Moves.ELECTRIC_TERRAIN, PokemonType.ELECTRIC, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.ELECTRIC) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.DAZZLING_GLEAM, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) + new AttackMove(Moves.DAZZLING_GLEAM, PokemonType.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) .target(MoveTarget.ALL_NEAR_ENEMIES), - new SelfStatusMove(Moves.CELEBRATE, Type.NORMAL, -1, 40, -1, 0, 6), - new StatusMove(Moves.HOLD_HANDS, Type.NORMAL, -1, 40, -1, 0, 6) + new SelfStatusMove(Moves.CELEBRATE, PokemonType.NORMAL, -1, 40, -1, 0, 6) + .attr(CelebrateAttr), + new StatusMove(Moves.HOLD_HANDS, PokemonType.NORMAL, -1, 40, -1, 0, 6) .ignoresSubstitute() .target(MoveTarget.NEAR_ALLY), - new StatusMove(Moves.BABY_DOLL_EYES, Type.FAIRY, 100, 30, -1, 1, 6) - .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.NUZZLE, Type.ELECTRIC, MoveCategory.PHYSICAL, 20, 100, 20, 100, 0, 6) + new StatusMove(Moves.BABY_DOLL_EYES, PokemonType.FAIRY, 100, 30, -1, 1, 6) + .attr(StatStageChangeAttr, [ Stat.ATK ], -1) + .reflectable(), + new AttackMove(Moves.NUZZLE, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 20, 100, 20, 100, 0, 6) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.HOLD_BACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 6) + new AttackMove(Moves.HOLD_BACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 6) .attr(SurviveDamageAttr), - new AttackMove(Moves.INFESTATION, Type.BUG, MoveCategory.SPECIAL, 20, 100, 20, -1, 0, 6) + new AttackMove(Moves.INFESTATION, PokemonType.BUG, MoveCategory.SPECIAL, 20, 100, 20, -1, 0, 6) .makesContact() .attr(TrapAttr, BattlerTagType.INFESTATION), - new AttackMove(Moves.POWER_UP_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 20, 100, 0, 6) + new AttackMove(Moves.POWER_UP_PUNCH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 20, 100, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true) .punchingMove(), - new AttackMove(Moves.OBLIVION_WING, Type.FLYING, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) + new AttackMove(Moves.OBLIVION_WING, PokemonType.FLYING, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) .attr(HitHealAttr, 0.75) .triageMove(), - new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + new AttackMove(Moves.THOUSAND_ARROWS, PokemonType.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(HitsTagAttr, BattlerTagType.FLYING) @@ -9131,763 +10104,718 @@ export function initMoves() { .attr(RemoveBattlerTagAttr, [ BattlerTagType.FLYING, BattlerTagType.FLOATING, BattlerTagType.TELEKINESIS ]) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.THOUSAND_WAVES, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + new AttackMove(Moves.THOUSAND_WAVES, PokemonType.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.LANDS_WRATH, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + new AttackMove(Moves.LANDS_WRATH, PokemonType.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.LIGHT_OF_RUIN, Type.FAIRY, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 6) + new AttackMove(Moves.LIGHT_OF_RUIN, PokemonType.FAIRY, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 6) .attr(RecoilAttr, false, 0.5) .recklessMove(), - new AttackMove(Moves.ORIGIN_PULSE, Type.WATER, MoveCategory.SPECIAL, 110, 85, 10, -1, 0, 6) + new AttackMove(Moves.ORIGIN_PULSE, PokemonType.WATER, MoveCategory.SPECIAL, 110, 85, 10, -1, 0, 6) .pulseMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.PRECIPICE_BLADES, Type.GROUND, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 6) + new AttackMove(Moves.PRECIPICE_BLADES, PokemonType.GROUND, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 6) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.DRAGON_ASCENT, Type.FLYING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 6) + new AttackMove(Moves.DRAGON_ASCENT, PokemonType.FLYING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true), - new AttackMove(Moves.HYPERSPACE_FURY, Type.DARK, MoveCategory.PHYSICAL, 100, -1, 5, -1, 0, 6) + new AttackMove(Moves.HYPERSPACE_FURY, PokemonType.DARK, MoveCategory.PHYSICAL, 100, -1, 5, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true) .ignoresSubstitute() .makesContact(false) .ignoresProtect(), /* Unused */ - new AttackMove(Moves.BREAKNECK_BLITZ__PHYSICAL, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.BREAKNECK_BLITZ__SPECIAL, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.ALL_OUT_PUMMELING__PHYSICAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.ALL_OUT_PUMMELING__SPECIAL, Type.FIGHTING, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.SUPERSONIC_SKYSTRIKE__PHYSICAL, Type.FLYING, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.SUPERSONIC_SKYSTRIKE__SPECIAL, Type.FLYING, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.ACID_DOWNPOUR__PHYSICAL, Type.POISON, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.ACID_DOWNPOUR__SPECIAL, Type.POISON, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.TECTONIC_RAGE__PHYSICAL, Type.GROUND, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.TECTONIC_RAGE__SPECIAL, Type.GROUND, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.CONTINENTAL_CRUSH__PHYSICAL, Type.ROCK, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.CONTINENTAL_CRUSH__SPECIAL, Type.ROCK, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.SAVAGE_SPIN_OUT__PHYSICAL, Type.BUG, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.SAVAGE_SPIN_OUT__SPECIAL, Type.BUG, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.NEVER_ENDING_NIGHTMARE__PHYSICAL, Type.GHOST, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.NEVER_ENDING_NIGHTMARE__SPECIAL, Type.GHOST, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.CORKSCREW_CRASH__PHYSICAL, Type.STEEL, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.CORKSCREW_CRASH__SPECIAL, Type.STEEL, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.INFERNO_OVERDRIVE__PHYSICAL, Type.FIRE, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.INFERNO_OVERDRIVE__SPECIAL, Type.FIRE, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.HYDRO_VORTEX__PHYSICAL, Type.WATER, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.HYDRO_VORTEX__SPECIAL, Type.WATER, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.BLOOM_DOOM__PHYSICAL, Type.GRASS, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.BLOOM_DOOM__SPECIAL, Type.GRASS, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.GIGAVOLT_HAVOC__PHYSICAL, Type.ELECTRIC, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.GIGAVOLT_HAVOC__SPECIAL, Type.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.SHATTERED_PSYCHE__PHYSICAL, Type.PSYCHIC, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.SHATTERED_PSYCHE__SPECIAL, Type.PSYCHIC, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.SUBZERO_SLAMMER__PHYSICAL, Type.ICE, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.SUBZERO_SLAMMER__SPECIAL, Type.ICE, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.DEVASTATING_DRAKE__PHYSICAL, Type.DRAGON, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.DEVASTATING_DRAKE__SPECIAL, Type.DRAGON, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.BLACK_HOLE_ECLIPSE__PHYSICAL, Type.DARK, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.BLACK_HOLE_ECLIPSE__SPECIAL, Type.DARK, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.TWINKLE_TACKLE__PHYSICAL, Type.FAIRY, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.TWINKLE_TACKLE__SPECIAL, Type.FAIRY, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.CATASTROPIKA, Type.ELECTRIC, MoveCategory.PHYSICAL, 210, -1, 1, -1, 0, 7) - .unimplemented() - .ignoresVirtual(), + new AttackMove(Moves.BREAKNECK_BLITZ__PHYSICAL, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.BREAKNECK_BLITZ__SPECIAL, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.ALL_OUT_PUMMELING__PHYSICAL, PokemonType.FIGHTING, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.ALL_OUT_PUMMELING__SPECIAL, PokemonType.FIGHTING, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.SUPERSONIC_SKYSTRIKE__PHYSICAL, PokemonType.FLYING, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.SUPERSONIC_SKYSTRIKE__SPECIAL, PokemonType.FLYING, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.ACID_DOWNPOUR__PHYSICAL, PokemonType.POISON, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.ACID_DOWNPOUR__SPECIAL, PokemonType.POISON, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.TECTONIC_RAGE__PHYSICAL, PokemonType.GROUND, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.TECTONIC_RAGE__SPECIAL, PokemonType.GROUND, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.CONTINENTAL_CRUSH__PHYSICAL, PokemonType.ROCK, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.CONTINENTAL_CRUSH__SPECIAL, PokemonType.ROCK, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.SAVAGE_SPIN_OUT__PHYSICAL, PokemonType.BUG, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.SAVAGE_SPIN_OUT__SPECIAL, PokemonType.BUG, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.NEVER_ENDING_NIGHTMARE__PHYSICAL, PokemonType.GHOST, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.NEVER_ENDING_NIGHTMARE__SPECIAL, PokemonType.GHOST, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.CORKSCREW_CRASH__PHYSICAL, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.CORKSCREW_CRASH__SPECIAL, PokemonType.STEEL, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.INFERNO_OVERDRIVE__PHYSICAL, PokemonType.FIRE, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.INFERNO_OVERDRIVE__SPECIAL, PokemonType.FIRE, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.HYDRO_VORTEX__PHYSICAL, PokemonType.WATER, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.HYDRO_VORTEX__SPECIAL, PokemonType.WATER, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.BLOOM_DOOM__PHYSICAL, PokemonType.GRASS, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.BLOOM_DOOM__SPECIAL, PokemonType.GRASS, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.GIGAVOLT_HAVOC__PHYSICAL, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.GIGAVOLT_HAVOC__SPECIAL, PokemonType.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.SHATTERED_PSYCHE__PHYSICAL, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.SHATTERED_PSYCHE__SPECIAL, PokemonType.PSYCHIC, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.SUBZERO_SLAMMER__PHYSICAL, PokemonType.ICE, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.SUBZERO_SLAMMER__SPECIAL, PokemonType.ICE, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.DEVASTATING_DRAKE__PHYSICAL, PokemonType.DRAGON, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.DEVASTATING_DRAKE__SPECIAL, PokemonType.DRAGON, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.BLACK_HOLE_ECLIPSE__PHYSICAL, PokemonType.DARK, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.BLACK_HOLE_ECLIPSE__SPECIAL, PokemonType.DARK, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.TWINKLE_TACKLE__PHYSICAL, PokemonType.FAIRY, MoveCategory.PHYSICAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.TWINKLE_TACKLE__SPECIAL, PokemonType.FAIRY, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.CATASTROPIKA, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 210, -1, 1, -1, 0, 7) + .unimplemented(), /* End Unused */ - new SelfStatusMove(Moves.SHORE_UP, Type.GROUND, -1, 5, -1, 0, 7) + new SelfStatusMove(Moves.SHORE_UP, PokemonType.GROUND, -1, 5, -1, 0, 7) .attr(SandHealAttr) .triageMove(), - new AttackMove(Moves.FIRST_IMPRESSION, Type.BUG, MoveCategory.PHYSICAL, 90, 100, 10, -1, 2, 7) + new AttackMove(Moves.FIRST_IMPRESSION, PokemonType.BUG, MoveCategory.PHYSICAL, 90, 100, 10, -1, 2, 7) .condition(new FirstMoveCondition()), - new SelfStatusMove(Moves.BANEFUL_BUNKER, Type.POISON, -1, 10, -1, 4, 7) + new SelfStatusMove(Moves.BANEFUL_BUNKER, PokemonType.POISON, -1, 10, -1, 4, 7) .attr(ProtectAttr, BattlerTagType.BANEFUL_BUNKER) .condition(failIfLastCondition), - new AttackMove(Moves.SPIRIT_SHACKLE, Type.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 7) + new AttackMove(Moves.SPIRIT_SHACKLE, PokemonType.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false), - new AttackMove(Moves.DARKEST_LARIAT, Type.DARK, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) + new AttackMove(Moves.DARKEST_LARIAT, PokemonType.DARK, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) .attr(IgnoreOpponentStatStagesAttr), - new AttackMove(Moves.SPARKLING_ARIA, Type.WATER, MoveCategory.SPECIAL, 90, 100, 10, 100, 0, 7) + new AttackMove(Moves.SPARKLING_ARIA, PokemonType.WATER, MoveCategory.SPECIAL, 90, 100, 10, 100, 0, 7) .attr(HealStatusEffectAttr, false, StatusEffect.BURN) .soundBased() .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.ICE_HAMMER, Type.ICE, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 7) + new AttackMove(Moves.ICE_HAMMER, PokemonType.ICE, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 7) .attr(StatStageChangeAttr, [ Stat.SPD ], -1, true) .punchingMove(), - new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7) - .attr(BoostHealAttr, 0.5, 2 / 3, true, false, (user, target, move) => user.scene.arena.terrain?.terrainType === TerrainType.GRASSY) - .triageMove(), - new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7), - new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, -1, 0, 7) + new StatusMove(Moves.FLORAL_HEALING, PokemonType.FAIRY, -1, 10, -1, 0, 7) + .attr(BoostHealAttr, 0.5, 2 / 3, true, false, (user, target, move) => globalScene.arena.terrain?.terrainType === TerrainType.GRASSY) + .triageMove() + .reflectable(), + new AttackMove(Moves.HIGH_HORSEPOWER, PokemonType.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7), + new StatusMove(Moves.STRENGTH_SAP, PokemonType.GRASS, 100, 10, -1, 0, 7) .attr(HitHealAttr, null, Stat.ATK) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .condition((user, target, move) => target.getStatStage(Stat.ATK) > -6) - .triageMove(), - new ChargingAttackMove(Moves.SOLAR_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7) + .triageMove() + .reflectable(), + new ChargingAttackMove(Moves.SOLAR_BLADE, PokemonType.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7) .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]) .attr(AntiSunlightPowerDecreaseAttr) .slicingMove(), - new AttackMove(Moves.LEAFAGE, Type.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 7) + new AttackMove(Moves.LEAFAGE, PokemonType.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 7) .makesContact(false), - new StatusMove(Moves.SPOTLIGHT, Type.NORMAL, -1, 15, -1, 3, 7) - .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, false), - new StatusMove(Moves.TOXIC_THREAD, Type.POISON, 100, 20, -1, 0, 7) + new StatusMove(Moves.SPOTLIGHT, PokemonType.NORMAL, -1, 15, -1, 3, 7) + .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, false) + .condition(failIfSingleBattle) + .reflectable(), + new StatusMove(Moves.TOXIC_THREAD, PokemonType.POISON, 100, 20, -1, 0, 7) .attr(StatusEffectAttr, StatusEffect.POISON) - .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new SelfStatusMove(Moves.LASER_FOCUS, Type.NORMAL, -1, 30, -1, 0, 7) + .attr(StatStageChangeAttr, [ Stat.SPD ], -1) + .reflectable(), + new SelfStatusMove(Moves.LASER_FOCUS, PokemonType.NORMAL, -1, 30, -1, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_CRIT, true, false), - new StatusMove(Moves.GEAR_UP, Type.STEEL, -1, 20, -1, 0, 7) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false))) + new StatusMove(Moves.GEAR_UP, PokemonType.STEEL, -1, 20, -1, 0, 7) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false)) }) .ignoresSubstitute() .target(MoveTarget.USER_AND_ALLIES) .condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS ].find(a => p.hasAbility(a, false)))), - new AttackMove(Moves.THROAT_CHOP, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) + new AttackMove(Moves.THROAT_CHOP, PokemonType.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.THROAT_CHOPPED), - new AttackMove(Moves.POLLEN_PUFF, Type.BUG, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) + new AttackMove(Moves.POLLEN_PUFF, PokemonType.BUG, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .attr(StatusCategoryOnAllyAttr) .attr(HealOnAllyAttr, 0.5, true, false) .ballBombMove(), - new AttackMove(Moves.ANCHOR_SHOT, Type.STEEL, MoveCategory.PHYSICAL, 80, 100, 20, 100, 0, 7) + new AttackMove(Moves.ANCHOR_SHOT, PokemonType.STEEL, MoveCategory.PHYSICAL, 80, 100, 20, 100, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true), - new StatusMove(Moves.PSYCHIC_TERRAIN, Type.PSYCHIC, -1, 10, -1, 0, 7) + new StatusMove(Moves.PSYCHIC_TERRAIN, PokemonType.PSYCHIC, -1, 10, -1, 0, 7) .attr(TerrainChangeAttr, TerrainType.PSYCHIC) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.LUNGE, Type.BUG, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) + new AttackMove(Moves.LUNGE, PokemonType.BUG, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.FIRE_LASH, Type.FIRE, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) + new AttackMove(Moves.FIRE_LASH, PokemonType.FIRE, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.POWER_TRIP, Type.DARK, MoveCategory.PHYSICAL, 20, 100, 10, -1, 0, 7) + new AttackMove(Moves.POWER_TRIP, PokemonType.DARK, MoveCategory.PHYSICAL, 20, 100, 10, -1, 0, 7) .attr(PositiveStatStagePowerAttr), - new AttackMove(Moves.BURN_UP, Type.FIRE, MoveCategory.SPECIAL, 130, 100, 5, -1, 0, 7) + new AttackMove(Moves.BURN_UP, PokemonType.FIRE, MoveCategory.SPECIAL, 130, 100, 5, -1, 0, 7) .condition((user) => { const userTypes = user.getTypes(true); - return userTypes.includes(Type.FIRE); + return userTypes.includes(PokemonType.FIRE); }) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(AddBattlerTagAttr, BattlerTagType.BURNED_UP, true, false) - .attr(RemoveTypeAttr, Type.FIRE, (user) => { - user.scene.queueMessage(i18next.t("moveTriggers:burnedItselfOut", { pokemonName: getPokemonNameWithAffix(user) })); + .attr(RemoveTypeAttr, PokemonType.FIRE, (user) => { + globalScene.queueMessage(i18next.t("moveTriggers:burnedItselfOut", { pokemonName: getPokemonNameWithAffix(user) })); }), - new StatusMove(Moves.SPEED_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 7) + new StatusMove(Moves.SPEED_SWAP, PokemonType.PSYCHIC, -1, 10, -1, 0, 7) .attr(SwapStatAttr, Stat.SPD) .ignoresSubstitute(), - new AttackMove(Moves.SMART_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7), - new StatusMove(Moves.PURIFY, Type.POISON, -1, 20, -1, 0, 7) + new AttackMove(Moves.SMART_STRIKE, PokemonType.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7), + new StatusMove(Moves.PURIFY, PokemonType.POISON, -1, 20, -1, 0, 7) .condition( (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect!)) // TODO: is this bang correct? .attr(HealAttr, 0.5) - .attr(HealStatusEffectAttr, false, ...getNonVolatileStatusEffects()) - .triageMove(), - new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) + .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) + .triageMove() + .reflectable(), + new AttackMove(Moves.REVELATION_DANCE, PokemonType.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .danceMove() .attr(MatchUserTypeAttr), - new AttackMove(Moves.CORE_ENFORCER, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 7) + new AttackMove(Moves.CORE_ENFORCER, PokemonType.DRAGON, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 7) .target(MoveTarget.ALL_NEAR_ENEMIES) .attr(SuppressAbilitiesIfActedAttr), - new AttackMove(Moves.TROP_KICK, Type.GRASS, MoveCategory.PHYSICAL, 70, 100, 15, 100, 0, 7) + new AttackMove(Moves.TROP_KICK, PokemonType.GRASS, MoveCategory.PHYSICAL, 70, 100, 15, 100, 0, 7) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new StatusMove(Moves.INSTRUCT, Type.PSYCHIC, -1, 15, -1, 0, 7) + new StatusMove(Moves.INSTRUCT, PokemonType.PSYCHIC, -1, 15, -1, 0, 7) .ignoresSubstitute() - .unimplemented(), - new AttackMove(Moves.BEAK_BLAST, Type.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, -3, 7) + .attr(RepeatMoveAttr) + // incorrect interactions with Gigaton Hammer, Blood Moon & Torment + // Also has incorrect interactions with Dancer due to the latter + // erroneously adding copied moves to move history. + .edgeCase(), + new AttackMove(Moves.BEAK_BLAST, PokemonType.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, -3, 7) .attr(BeakBlastHeaderAttr) .ballBombMove() .makesContact(false), - new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7) - .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, null, true, false, MoveEffectTrigger.HIT, true) + new AttackMove(Moves.CLANGING_SCALES, PokemonType.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7) + .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, { firstTargetOnly: true }) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.DRAGON_HAMMER, Type.DRAGON, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 7), - new AttackMove(Moves.BRUTAL_SWING, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 7) + new AttackMove(Moves.DRAGON_HAMMER, PokemonType.DRAGON, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 7), + new AttackMove(Moves.BRUTAL_SWING, PokemonType.DARK, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 7) .target(MoveTarget.ALL_NEAR_OTHERS), - new StatusMove(Moves.AURORA_VEIL, Type.ICE, -1, 20, -1, 0, 7) - .condition((user, target, move) => (user.scene.arena.weather?.weatherType === WeatherType.HAIL || user.scene.arena.weather?.weatherType === WeatherType.SNOW) && !user.scene.arena.weather?.isEffectSuppressed(user.scene)) + new StatusMove(Moves.AURORA_VEIL, PokemonType.ICE, -1, 20, -1, 0, 7) + .condition((user, target, move) => (globalScene.arena.weather?.weatherType === WeatherType.HAIL || globalScene.arena.weather?.weatherType === WeatherType.SNOW) && !globalScene.arena.weather?.isEffectSuppressed()) .attr(AddArenaTagAttr, ArenaTagType.AURORA_VEIL, 5, true) .target(MoveTarget.USER_SIDE), /* Unused */ - new AttackMove(Moves.SINISTER_ARROW_RAID, Type.GHOST, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7) + new AttackMove(Moves.SINISTER_ARROW_RAID, PokemonType.GHOST, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7) + .unimplemented() .makesContact(false) - .edgeCase() // I assume it's because the user needs spirit shackle and decidueye - .ignoresVirtual(), - new AttackMove(Moves.MALICIOUS_MOONSAULT, Type.DARK, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7) + .edgeCase(), // I assume it's because the user needs spirit shackle and decidueye + new AttackMove(Moves.MALICIOUS_MOONSAULT, PokemonType.DARK, MoveCategory.PHYSICAL, 180, -1, 1, -1, 0, 7) + .unimplemented() .attr(AlwaysHitMinimizeAttr) .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) - .edgeCase() // I assume it's because it needs darkest lariat and incineroar - .ignoresVirtual(), - new AttackMove(Moves.OCEANIC_OPERETTA, Type.WATER, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) - .edgeCase() // I assume it's because it needs sparkling aria and primarina - .ignoresVirtual(), - new AttackMove(Moves.GUARDIAN_OF_ALOLA, Type.FAIRY, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .edgeCase(), // I assume it's because it needs darkest lariat and incineroar + new AttackMove(Moves.OCEANIC_OPERETTA, PokemonType.WATER, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.SOUL_STEALING_7_STAR_STRIKE, Type.GHOST, MoveCategory.PHYSICAL, 195, -1, 1, -1, 0, 7) + .edgeCase(), // I assume it's because it needs sparkling aria and primarina + new AttackMove(Moves.GUARDIAN_OF_ALOLA, PokemonType.FAIRY, MoveCategory.SPECIAL, -1, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.SOUL_STEALING_7_STAR_STRIKE, PokemonType.GHOST, MoveCategory.PHYSICAL, 195, -1, 1, -1, 0, 7) + .unimplemented(), + new AttackMove(Moves.STOKED_SPARKSURFER, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 175, -1, 1, 100, 0, 7) .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.STOKED_SPARKSURFER, Type.ELECTRIC, MoveCategory.SPECIAL, 175, -1, 1, 100, 0, 7) - .edgeCase() // I assume it's because it needs thunderbolt and Alola Raichu - .ignoresVirtual(), - new AttackMove(Moves.PULVERIZING_PANCAKE, Type.NORMAL, MoveCategory.PHYSICAL, 210, -1, 1, -1, 0, 7) - .edgeCase() // I assume it's because it needs giga impact and snorlax - .ignoresVirtual(), - new SelfStatusMove(Moves.EXTREME_EVOBOOST, Type.NORMAL, -1, 1, -1, 0, 7) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true) - .ignoresVirtual(), - new AttackMove(Moves.GENESIS_SUPERNOVA, Type.PSYCHIC, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) - .attr(TerrainChangeAttr, TerrainType.PSYCHIC) - .ignoresVirtual(), + .edgeCase(), // I assume it's because it needs thunderbolt and Alola Raichu + new AttackMove(Moves.PULVERIZING_PANCAKE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 210, -1, 1, -1, 0, 7) + .unimplemented() + .edgeCase(), // I assume it's because it needs giga impact and snorlax + new SelfStatusMove(Moves.EXTREME_EVOBOOST, PokemonType.NORMAL, -1, 1, -1, 0, 7) + .unimplemented() + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true), + new AttackMove(Moves.GENESIS_SUPERNOVA, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) + .unimplemented() + .attr(TerrainChangeAttr, TerrainType.PSYCHIC), /* End Unused */ - new AttackMove(Moves.SHELL_TRAP, Type.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, -3, 7) + new AttackMove(Moves.SHELL_TRAP, PokemonType.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, -3, 7) .attr(AddBattlerTagHeaderAttr, BattlerTagType.SHELL_TRAP) .target(MoveTarget.ALL_NEAR_ENEMIES) // Fails if the user was not hit by a physical attack during the turn .condition((user, target, move) => user.getTag(ShellTrapTag)?.activated === true), - new AttackMove(Moves.FLEUR_CANNON, Type.FAIRY, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 7) + new AttackMove(Moves.FLEUR_CANNON, PokemonType.FAIRY, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 7) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true), - new AttackMove(Moves.PSYCHIC_FANGS, Type.PSYCHIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) + new AttackMove(Moves.PSYCHIC_FANGS, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) .bitingMove() .attr(RemoveScreensAttr), - new AttackMove(Moves.STOMPING_TANTRUM, Type.GROUND, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 7) + new AttackMove(Moves.STOMPING_TANTRUM, PokemonType.GROUND, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 7) .attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1), - new AttackMove(Moves.SHADOW_BONE, Type.GHOST, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7) + new AttackMove(Moves.SHADOW_BONE, PokemonType.GHOST, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) .makesContact(false), - new AttackMove(Moves.ACCELEROCK, Type.ROCK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 1, 7), - new AttackMove(Moves.LIQUIDATION, Type.WATER, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7) + new AttackMove(Moves.ACCELEROCK, PokemonType.ROCK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 1, 7), + new AttackMove(Moves.LIQUIDATION, PokemonType.WATER, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.PRISMATIC_LASER, Type.PSYCHIC, MoveCategory.SPECIAL, 160, 100, 10, -1, 0, 7) + new AttackMove(Moves.PRISMATIC_LASER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 160, 100, 10, -1, 0, 7) .attr(RechargeAttr), - new AttackMove(Moves.SPECTRAL_THIEF, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 7) - .ignoresSubstitute() - .partial(), // Does not steal stats - new AttackMove(Moves.SUNSTEEL_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 7) - .ignoresAbilities() - .edgeCase(), // Should not ignore abilities when called virtually (metronome) - new AttackMove(Moves.MOONGEIST_BEAM, Type.GHOST, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) - .ignoresAbilities() - .edgeCase(), // Should not ignore abilities when called virtually (metronome) - new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, -1, 0, 7) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1), - new AttackMove(Moves.ZING_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7) + new AttackMove(Moves.SPECTRAL_THIEF, PokemonType.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 7) + .attr(SpectralThiefAttr) + .ignoresSubstitute(), + new AttackMove(Moves.SUNSTEEL_STRIKE, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 7) + .ignoresAbilities(), + new AttackMove(Moves.MOONGEIST_BEAM, PokemonType.GHOST, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) + .ignoresAbilities(), + new StatusMove(Moves.TEARFUL_LOOK, PokemonType.NORMAL, -1, 20, -1, 0, 7) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1) + .reflectable(), + new AttackMove(Moves.ZING_ZAP, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7) .attr(FlinchAttr), - new AttackMove(Moves.NATURES_MADNESS, Type.FAIRY, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 7) + new AttackMove(Moves.NATURES_MADNESS, PokemonType.FAIRY, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 7) .attr(TargetHalfHpDamageAttr), - new AttackMove(Moves.MULTI_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 7) + new AttackMove(Moves.MULTI_ATTACK, PokemonType.NORMAL, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 7) .attr(FormChangeItemTypeAttr), /* Unused */ - new AttackMove(Moves.TEN_MILLION_VOLT_THUNDERBOLT, Type.ELECTRIC, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) - .edgeCase() // I assume it's because it needs thunderbolt and pikachu in a cap - .ignoresVirtual(), + new AttackMove(Moves.TEN_MILLION_VOLT_THUNDERBOLT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 195, -1, 1, -1, 0, 7) + .unimplemented() + .edgeCase(), // I assume it's because it needs thunderbolt and pikachu in a cap /* End Unused */ - new AttackMove(Moves.MIND_BLOWN, Type.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 7) + new AttackMove(Moves.MIND_BLOWN, PokemonType.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 7) .condition(failIfDampCondition) .attr(HalfSacrificialAttr) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.PLASMA_FISTS, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 15, -1, 0, 7) + new AttackMove(Moves.PLASMA_FISTS, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 100, 100, 15, -1, 0, 7) .attr(AddArenaTagAttr, ArenaTagType.ION_DELUGE, 1) .punchingMove(), - new AttackMove(Moves.PHOTON_GEYSER, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) + new AttackMove(Moves.PHOTON_GEYSER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) .attr(PhotonGeyserCategoryAttr) - .ignoresAbilities() - .edgeCase(), // Should not ignore abilities when called virtually (metronome) + .ignoresAbilities(), /* Unused */ - new AttackMove(Moves.LIGHT_THAT_BURNS_THE_SKY, Type.PSYCHIC, MoveCategory.SPECIAL, 200, -1, 1, -1, 0, 7) + new AttackMove(Moves.LIGHT_THAT_BURNS_THE_SKY, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 200, -1, 1, -1, 0, 7) + .unimplemented() .attr(PhotonGeyserCategoryAttr) - .ignoresAbilities() - .ignoresVirtual(), - new AttackMove(Moves.SEARING_SUNRAZE_SMASH, Type.STEEL, MoveCategory.PHYSICAL, 200, -1, 1, -1, 0, 7) - .ignoresAbilities() - .ignoresVirtual(), - new AttackMove(Moves.MENACING_MOONRAZE_MAELSTROM, Type.GHOST, MoveCategory.SPECIAL, 200, -1, 1, -1, 0, 7) - .ignoresAbilities() - .ignoresVirtual(), - new AttackMove(Moves.LETS_SNUGGLE_FOREVER, Type.FAIRY, MoveCategory.PHYSICAL, 190, -1, 1, -1, 0, 7) - .edgeCase() // I assume it needs play rough and mimikyu - .ignoresVirtual(), - new AttackMove(Moves.SPLINTERED_STORMSHARDS, Type.ROCK, MoveCategory.PHYSICAL, 190, -1, 1, -1, 0, 7) + .ignoresAbilities(), + new AttackMove(Moves.SEARING_SUNRAZE_SMASH, PokemonType.STEEL, MoveCategory.PHYSICAL, 200, -1, 1, -1, 0, 7) + .unimplemented() + .ignoresAbilities(), + new AttackMove(Moves.MENACING_MOONRAZE_MAELSTROM, PokemonType.GHOST, MoveCategory.SPECIAL, 200, -1, 1, -1, 0, 7) + .unimplemented() + .ignoresAbilities(), + new AttackMove(Moves.LETS_SNUGGLE_FOREVER, PokemonType.FAIRY, MoveCategory.PHYSICAL, 190, -1, 1, -1, 0, 7) + .unimplemented() + .edgeCase(), // I assume it needs play rough and mimikyu + new AttackMove(Moves.SPLINTERED_STORMSHARDS, PokemonType.ROCK, MoveCategory.PHYSICAL, 190, -1, 1, -1, 0, 7) + .unimplemented() .attr(ClearTerrainAttr) - .makesContact(false) - .ignoresVirtual(), - new AttackMove(Moves.CLANGOROUS_SOULBLAZE, Type.DRAGON, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true, undefined, undefined, undefined, undefined, true) + .makesContact(false), + new AttackMove(Moves.CLANGOROUS_SOULBLAZE, PokemonType.DRAGON, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) + .unimplemented() + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true, { firstTargetOnly: true }) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES) - .edgeCase() // I assume it needs clanging scales and Kommo-O - .ignoresVirtual(), + .edgeCase(), // I assume it needs clanging scales and Kommo-O /* End Unused */ - new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 50, 100, 15, -1, 2, 7) //LGPE Implementation + new AttackMove(Moves.ZIPPY_ZAP, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 50, 100, 15, -1, 2, 7) // LGPE Implementation .attr(CritOnlyAttr), - new AttackMove(Moves.SPLISHY_SPLASH, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7) + new AttackMove(Moves.SPLISHY_SPLASH, PokemonType.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.FLOATY_FALL, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, 30, 0, 7) + new AttackMove(Moves.FLOATY_FALL, PokemonType.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, 30, 0, 7) .attr(FlinchAttr), - new AttackMove(Moves.PIKA_PAPOW, Type.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 20, -1, 0, 7) + new AttackMove(Moves.PIKA_PAPOW, PokemonType.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 20, -1, 0, 7) .attr(FriendshipPowerAttr), - new AttackMove(Moves.BOUNCY_BUBBLE, Type.WATER, MoveCategory.SPECIAL, 60, 100, 20, -1, 0, 7) - .attr(HitHealAttr, 1.0) - .triageMove() - .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.BUZZY_BUZZ, Type.ELECTRIC, MoveCategory.SPECIAL, 60, 100, 20, 100, 0, 7) + new AttackMove(Moves.BOUNCY_BUBBLE, PokemonType.WATER, MoveCategory.SPECIAL, 60, 100, 20, -1, 0, 7) + .attr(HitHealAttr, 1) + .triageMove(), + new AttackMove(Moves.BUZZY_BUZZ, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 60, 100, 20, 100, 0, 7) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.SIZZLY_SLIDE, Type.FIRE, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 7) + new AttackMove(Moves.SIZZLY_SLIDE, PokemonType.FIRE, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 7) .attr(StatusEffectAttr, StatusEffect.BURN), - new AttackMove(Moves.GLITZY_GLOW, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 95, 15, -1, 0, 7) + new AttackMove(Moves.GLITZY_GLOW, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 95, 15, -1, 0, 7) .attr(AddArenaTagAttr, ArenaTagType.LIGHT_SCREEN, 5, false, true), - new AttackMove(Moves.BADDY_BAD, Type.DARK, MoveCategory.SPECIAL, 80, 95, 15, -1, 0, 7) + new AttackMove(Moves.BADDY_BAD, PokemonType.DARK, MoveCategory.SPECIAL, 80, 95, 15, -1, 0, 7) .attr(AddArenaTagAttr, ArenaTagType.REFLECT, 5, false, true), - new AttackMove(Moves.SAPPY_SEED, Type.GRASS, MoveCategory.PHYSICAL, 100, 90, 10, 100, 0, 7) + new AttackMove(Moves.SAPPY_SEED, PokemonType.GRASS, MoveCategory.PHYSICAL, 100, 90, 10, 100, 0, 7) .attr(LeechSeedAttr) .makesContact(false), - new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7) + new AttackMove(Moves.FREEZY_FROST, PokemonType.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7) .attr(ResetStatsAttr, true), - new AttackMove(Moves.SPARKLY_SWIRL, Type.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7) + new AttackMove(Moves.SPARKLY_SWIRL, PokemonType.FAIRY, MoveCategory.SPECIAL, 120, 85, 5, -1, 0, 7) .attr(PartyStatusCureAttr, null, Abilities.NONE), - new AttackMove(Moves.VEEVEE_VOLLEY, Type.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7) + new AttackMove(Moves.VEEVEE_VOLLEY, PokemonType.NORMAL, MoveCategory.PHYSICAL, -1, -1, 20, -1, 0, 7) .attr(FriendshipPowerAttr), - new AttackMove(Moves.DOUBLE_IRON_BASH, Type.STEEL, MoveCategory.PHYSICAL, 60, 100, 5, 30, 0, 7) + new AttackMove(Moves.DOUBLE_IRON_BASH, PokemonType.STEEL, MoveCategory.PHYSICAL, 60, 100, 5, 30, 0, 7) .attr(MultiHitAttr, MultiHitType._2) .attr(FlinchAttr) .punchingMove(), /* Unused */ - new SelfStatusMove(Moves.MAX_GUARD, Type.NORMAL, -1, 10, -1, 4, 8) + new SelfStatusMove(Moves.MAX_GUARD, PokemonType.NORMAL, -1, 10, -1, 4, 8) + .unimplemented() .attr(ProtectAttr) - .condition(failIfLastCondition) - .ignoresVirtual(), + .condition(failIfLastCondition), /* End Unused */ - new AttackMove(Moves.DYNAMAX_CANNON, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) + new AttackMove(Moves.DYNAMAX_CANNON, PokemonType.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) .attr(MovePowerMultiplierAttr, (user, target, move) => { // Move is only stronger against overleveled foes. - if (target.level > target.scene.getMaxExpLevel()) { + if (target.level > globalScene.getMaxExpLevel()) { const dynamaxCannonPercentMarginBeforeFullDamage = 0.05; // How much % above MaxExpLevel of wave will the target need to be to take full damage. // The move's power scales as the margin is approached, reaching double power when it does or goes over it. - return 1 + Math.min(1, (target.level - target.scene.getMaxExpLevel()) / (target.scene.getMaxExpLevel() * dynamaxCannonPercentMarginBeforeFullDamage)); + return 1 + Math.min(1, (target.level - globalScene.getMaxExpLevel()) / (globalScene.getMaxExpLevel() * dynamaxCannonPercentMarginBeforeFullDamage)); } else { return 1; } }) - .attr(DiscourageFrequentUseAttr) - .ignoresVirtual(), + .attr(DiscourageFrequentUseAttr), - new AttackMove(Moves.SNIPE_SHOT, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 8) + new AttackMove(Moves.SNIPE_SHOT, PokemonType.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 8) .attr(HighCritAttr) .attr(BypassRedirectAttr), - new AttackMove(Moves.JAW_LOCK, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) + new AttackMove(Moves.JAW_LOCK, PokemonType.DARK, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) .attr(JawLockAttr) .bitingMove(), - new SelfStatusMove(Moves.STUFF_CHEEKS, Type.NORMAL, -1, 10, -1, 0, 8) + new SelfStatusMove(Moves.STUFF_CHEEKS, PokemonType.NORMAL, -1, 10, -1, 0, 8) .attr(EatBerryAttr) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true) .condition((user) => { - const userBerries = user.scene.findModifiers(m => m instanceof BerryModifier, user.isPlayer()); + const userBerries = globalScene.findModifiers(m => m instanceof BerryModifier, user.isPlayer()); return userBerries.length > 0; }) .edgeCase(), // Stuff Cheeks should not be selectable when the user does not have a berry, see wiki - new SelfStatusMove(Moves.NO_RETREAT, Type.FIGHTING, -1, 5, -1, 0, 8) + new SelfStatusMove(Moves.NO_RETREAT, PokemonType.FIGHTING, -1, 5, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .attr(AddBattlerTagAttr, BattlerTagType.NO_RETREAT, true, false) .condition((user, target, move) => user.getTag(TrappedTag)?.sourceMove !== Moves.NO_RETREAT), // fails if the user is currently trapped by No Retreat - new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8) + new StatusMove(Moves.TAR_SHOT, PokemonType.ROCK, 100, 15, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) - .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false), - new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8) - .attr(ChangeTypeAttr, Type.PSYCHIC) - .powderMove(), - new AttackMove(Moves.DRAGON_DARTS, Type.DRAGON, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 8) + .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false) + .reflectable(), + new StatusMove(Moves.MAGIC_POWDER, PokemonType.PSYCHIC, 100, 20, -1, 0, 8) + .attr(ChangeTypeAttr, PokemonType.PSYCHIC) + .powderMove() + .reflectable(), + new AttackMove(Moves.DRAGON_DARTS, PokemonType.DRAGON, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._2) .makesContact(false) .partial(), // smart targetting is unimplemented - new StatusMove(Moves.TEATIME, Type.NORMAL, -1, 10, -1, 0, 8) + new StatusMove(Moves.TEATIME, PokemonType.NORMAL, -1, 10, -1, 0, 8) .attr(EatBerryAttr) .target(MoveTarget.ALL), - new StatusMove(Moves.OCTOLOCK, Type.FIGHTING, 100, 15, -1, 0, 8) + new StatusMove(Moves.OCTOLOCK, PokemonType.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) + new AttackMove(Moves.BOLT_BEAK, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) .attr(FirstAttackDoublePowerAttr), - new AttackMove(Moves.FISHIOUS_REND, Type.WATER, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) + new AttackMove(Moves.FISHIOUS_REND, PokemonType.WATER, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) .attr(FirstAttackDoublePowerAttr) .bitingMove(), - new StatusMove(Moves.COURT_CHANGE, Type.NORMAL, 100, 10, -1, 0, 8) + new StatusMove(Moves.COURT_CHANGE, PokemonType.NORMAL, 100, 10, -1, 0, 8) .attr(SwapArenaTagsAttr, [ ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.MIST, ArenaTagType.REFLECT, ArenaTagType.SPIKES, ArenaTagType.STEALTH_ROCK, ArenaTagType.STICKY_WEB, ArenaTagType.TAILWIND, ArenaTagType.TOXIC_SPIKES ]), - new AttackMove(Moves.MAX_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + /* Unused */ + new AttackMove(Moves.MAX_FLARE, PokemonType.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_FLUTTERBY, Type.BUG, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_FLUTTERBY, PokemonType.BUG, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_LIGHTNING, Type.ELECTRIC, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_LIGHTNING, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_STRIKE, Type.NORMAL, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_STRIKE, PokemonType.NORMAL, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_KNUCKLE, Type.FIGHTING, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_KNUCKLE, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_PHANTASM, Type.GHOST, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_PHANTASM, PokemonType.GHOST, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_HAILSTORM, Type.ICE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_HAILSTORM, PokemonType.ICE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_OOZE, Type.POISON, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_OOZE, PokemonType.POISON, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_GEYSER, Type.WATER, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_GEYSER, PokemonType.WATER, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_AIRSTREAM, Type.FLYING, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_AIRSTREAM, PokemonType.FLYING, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_STARFALL, Type.FAIRY, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_STARFALL, PokemonType.FAIRY, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_WYRMWIND, Type.DRAGON, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_WYRMWIND, PokemonType.DRAGON, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_MINDSTORM, Type.PSYCHIC, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_MINDSTORM, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_ROCKFALL, Type.ROCK, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_ROCKFALL, PokemonType.ROCK, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_QUAKE, Type.GROUND, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_QUAKE, PokemonType.GROUND, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_DARKNESS, Type.DARK, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_DARKNESS, PokemonType.DARK, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_OVERGROWTH, Type.GRASS, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_OVERGROWTH, PokemonType.GRASS, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), - new AttackMove(Moves.MAX_STEELSPIKE, Type.STEEL, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + .unimplemented(), + new AttackMove(Moves.MAX_STEELSPIKE, PokemonType.STEEL, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) - .unimplemented() - .ignoresVirtual(), + .unimplemented(), /* End Unused */ - new SelfStatusMove(Moves.CLANGOROUS_SOUL, Type.DRAGON, 100, 5, -1, 0, 8) + new SelfStatusMove(Moves.CLANGOROUS_SOUL, PokemonType.DRAGON, 100, 5, -1, 0, 8) .attr(CutHpStatStageBoostAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, 3) .soundBased() .danceMove(), - new AttackMove(Moves.BODY_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) + new AttackMove(Moves.BODY_PRESS, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) .attr(DefAtkAttr), - new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, -1, 0, 8) + new StatusMove(Moves.DECORATE, PokemonType.FAIRY, -1, 15, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 2) .ignoresProtect(), - new AttackMove(Moves.DRUM_BEATING, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) + new AttackMove(Moves.DRUM_BEATING, PokemonType.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .makesContact(false), - new AttackMove(Moves.SNAP_TRAP, Type.GRASS, MoveCategory.PHYSICAL, 35, 100, 15, -1, 0, 8) + new AttackMove(Moves.SNAP_TRAP, PokemonType.GRASS, MoveCategory.PHYSICAL, 35, 100, 15, -1, 0, 8) .attr(TrapAttr, BattlerTagType.SNAP_TRAP), - new AttackMove(Moves.PYRO_BALL, Type.FIRE, MoveCategory.PHYSICAL, 120, 90, 5, 10, 0, 8) + new AttackMove(Moves.PYRO_BALL, PokemonType.FIRE, MoveCategory.PHYSICAL, 120, 90, 5, 10, 0, 8) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .ballBombMove() .makesContact(false), - new AttackMove(Moves.BEHEMOTH_BLADE, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 8) + new AttackMove(Moves.BEHEMOTH_BLADE, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 8) .slicingMove(), - new AttackMove(Moves.BEHEMOTH_BASH, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 8), - new AttackMove(Moves.AURA_WHEEL, Type.ELECTRIC, MoveCategory.PHYSICAL, 110, 100, 10, 100, 0, 8) + new AttackMove(Moves.BEHEMOTH_BASH, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 8), + new AttackMove(Moves.AURA_WHEEL, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 110, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true) .makesContact(false) .attr(AuraWheelTypeAttr), - new AttackMove(Moves.BREAKING_SWIPE, Type.DRAGON, MoveCategory.PHYSICAL, 60, 100, 15, 100, 0, 8) + new AttackMove(Moves.BREAKING_SWIPE, PokemonType.DRAGON, MoveCategory.PHYSICAL, 60, 100, 15, 100, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.BRANCH_POKE, Type.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 8), - new AttackMove(Moves.OVERDRIVE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8) + new AttackMove(Moves.BRANCH_POKE, PokemonType.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 8), + new AttackMove(Moves.OVERDRIVE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.APPLE_ACID, Type.GRASS, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) + new AttackMove(Moves.APPLE_ACID, PokemonType.GRASS, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), - new AttackMove(Moves.GRAV_APPLE, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) + new AttackMove(Moves.GRAV_APPLE, PokemonType.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTag(ArenaTagType.GRAVITY) ? 1.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTag(ArenaTagType.GRAVITY) ? 1.5 : 1) .makesContact(false), - new AttackMove(Moves.SPIRIT_BREAK, Type.FAIRY, MoveCategory.PHYSICAL, 75, 100, 15, 100, 0, 8) + new AttackMove(Moves.SPIRIT_BREAK, PokemonType.FAIRY, MoveCategory.PHYSICAL, 75, 100, 15, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1), - new AttackMove(Moves.STRANGE_STEAM, Type.FAIRY, MoveCategory.SPECIAL, 90, 95, 10, 20, 0, 8) + new AttackMove(Moves.STRANGE_STEAM, PokemonType.FAIRY, MoveCategory.SPECIAL, 90, 95, 10, 20, 0, 8) .attr(ConfuseAttr), - new StatusMove(Moves.LIFE_DEW, Type.WATER, -1, 10, -1, 0, 8) + new StatusMove(Moves.LIFE_DEW, PokemonType.WATER, -1, 10, -1, 0, 8) .attr(HealAttr, 0.25, true, false) .target(MoveTarget.USER_AND_ALLIES) .ignoresProtect(), - new SelfStatusMove(Moves.OBSTRUCT, Type.DARK, 100, 10, -1, 4, 8) + new SelfStatusMove(Moves.OBSTRUCT, PokemonType.DARK, 100, 10, -1, 4, 8) .attr(ProtectAttr, BattlerTagType.OBSTRUCT) .condition(failIfLastCondition), - new AttackMove(Moves.FALSE_SURRENDER, Type.DARK, MoveCategory.PHYSICAL, 80, -1, 10, -1, 0, 8), - new AttackMove(Moves.METEOR_ASSAULT, Type.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 5, -1, 0, 8) + new AttackMove(Moves.FALSE_SURRENDER, PokemonType.DARK, MoveCategory.PHYSICAL, 80, -1, 10, -1, 0, 8), + new AttackMove(Moves.METEOR_ASSAULT, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 150, 100, 5, -1, 0, 8) .attr(RechargeAttr) .makesContact(false), - new AttackMove(Moves.ETERNABEAM, Type.DRAGON, MoveCategory.SPECIAL, 160, 90, 5, -1, 0, 8) + new AttackMove(Moves.ETERNABEAM, PokemonType.DRAGON, MoveCategory.SPECIAL, 160, 90, 5, -1, 0, 8) .attr(RechargeAttr), - new AttackMove(Moves.STEEL_BEAM, Type.STEEL, MoveCategory.SPECIAL, 140, 95, 5, -1, 0, 8) + new AttackMove(Moves.STEEL_BEAM, PokemonType.STEEL, MoveCategory.SPECIAL, 140, 95, 5, -1, 0, 8) .attr(HalfSacrificialAttr), - new AttackMove(Moves.EXPANDING_FORCE, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.PSYCHIC && user.isGrounded() ? 1.5 : 1) - .attr(VariableTargetAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.PSYCHIC && user.isGrounded() ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER), - new AttackMove(Moves.STEEL_ROLLER, Type.STEEL, MoveCategory.PHYSICAL, 130, 100, 5, -1, 0, 8) + new AttackMove(Moves.EXPANDING_FORCE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8) + .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.PSYCHIC && user.isGrounded() ? 1.5 : 1) + .attr(VariableTargetAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.PSYCHIC && user.isGrounded() ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER), + new AttackMove(Moves.STEEL_ROLLER, PokemonType.STEEL, MoveCategory.PHYSICAL, 130, 100, 5, -1, 0, 8) .attr(ClearTerrainAttr) - .condition((user, target, move) => !!user.scene.arena.terrain), - new AttackMove(Moves.SCALE_SHOT, Type.DRAGON, MoveCategory.PHYSICAL, 25, 90, 20, -1, 0, 8) - .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true, null, true, false, MoveEffectTrigger.HIT, false, true) - .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, null, true, false, MoveEffectTrigger.HIT, false, true) + .condition((user, target, move) => !!globalScene.arena.terrain), + new AttackMove(Moves.SCALE_SHOT, PokemonType.DRAGON, MoveCategory.PHYSICAL, 25, 90, 20, -1, 0, 8) + .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true, { lastHitOnly: true }) + .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, { lastHitOnly: true }) .attr(MultiHitAttr) .makesContact(false), - new ChargingAttackMove(Moves.METEOR_BEAM, Type.ROCK, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 8) + new ChargingAttackMove(Moves.METEOR_BEAM, PokemonType.ROCK, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 8) .chargeText(i18next.t("moveTriggers:isOverflowingWithSpacePower", { pokemonName: "{USER}" })) - .chargeAttr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) - .ignoresVirtual(), - new AttackMove(Moves.SHELL_SIDE_ARM, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) + .chargeAttr(StatStageChangeAttr, [ Stat.SPATK ], 1, true), + new AttackMove(Moves.SHELL_SIDE_ARM, PokemonType.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) .attr(ShellSideArmCategoryAttr) .attr(StatusEffectAttr, StatusEffect.POISON) .partial(), // Physical version of the move does not make contact - new AttackMove(Moves.MISTY_EXPLOSION, Type.FAIRY, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) + new AttackMove(Moves.MISTY_EXPLOSION, PokemonType.FAIRY, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) .attr(SacrificialAttr) .target(MoveTarget.ALL_NEAR_OTHERS) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.MISTY && user.isGrounded() ? 1.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.MISTY && user.isGrounded() ? 1.5 : 1) .condition(failIfDampCondition) .makesContact(false), - new AttackMove(Moves.GRASSY_GLIDE, Type.GRASS, MoveCategory.PHYSICAL, 55, 100, 20, -1, 0, 8) - .attr(IncrementMovePriorityAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.GRASSY && user.isGrounded()), - new AttackMove(Moves.RISING_VOLTAGE, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 8) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.ELECTRIC && target.isGrounded() ? 2 : 1), - new AttackMove(Moves.TERRAIN_PULSE, Type.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 8) + new AttackMove(Moves.GRASSY_GLIDE, PokemonType.GRASS, MoveCategory.PHYSICAL, 55, 100, 20, -1, 0, 8) + .attr(IncrementMovePriorityAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.GRASSY && user.isGrounded()), + new AttackMove(Moves.RISING_VOLTAGE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 8) + .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.ELECTRIC && target.isGrounded() ? 2 : 1), + new AttackMove(Moves.TERRAIN_PULSE, PokemonType.NORMAL, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 8) .attr(TerrainPulseTypeAttr) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() !== TerrainType.NONE && user.isGrounded() ? 2 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() !== TerrainType.NONE && user.isGrounded() ? 2 : 1) .pulseMove(), - new AttackMove(Moves.SKITTER_SMACK, Type.BUG, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) + new AttackMove(Moves.SKITTER_SMACK, PokemonType.BUG, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1), - new AttackMove(Moves.BURNING_JEALOUSY, Type.FIRE, MoveCategory.SPECIAL, 70, 100, 5, 100, 0, 8) + new AttackMove(Moves.BURNING_JEALOUSY, PokemonType.FIRE, MoveCategory.SPECIAL, 70, 100, 5, 100, 0, 8) .attr(StatusIfBoostedAttr, StatusEffect.BURN) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.LASH_OUT, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) + new AttackMove(Moves.LASH_OUT, PokemonType.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) .attr(MovePowerMultiplierAttr, (user, _target, _move) => user.turnData.statStagesDecreased ? 2 : 1), - new AttackMove(Moves.POLTERGEIST, Type.GHOST, MoveCategory.PHYSICAL, 110, 90, 5, -1, 0, 8) - .attr(AttackedByItemAttr) + new AttackMove(Moves.POLTERGEIST, PokemonType.GHOST, MoveCategory.PHYSICAL, 110, 90, 5, -1, 0, 8) + .condition(failIfNoTargetHeldItemsCondition) + .attr(PreMoveMessageAttr, attackedByItemMessageFunc) .makesContact(false), - new StatusMove(Moves.CORROSIVE_GAS, Type.POISON, 100, 40, -1, 0, 8) + new StatusMove(Moves.CORROSIVE_GAS, PokemonType.POISON, 100, 40, -1, 0, 8) .target(MoveTarget.ALL_NEAR_OTHERS) + .reflectable() .unimplemented(), - new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, -1, 0, 8) + new StatusMove(Moves.COACHING, PokemonType.FIGHTING, -1, 10, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1) - .target(MoveTarget.NEAR_ALLY), - new AttackMove(Moves.FLIP_TURN, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 8) + .target(MoveTarget.NEAR_ALLY) + .condition(failIfSingleBattle), + new AttackMove(Moves.FLIP_TURN, PokemonType.WATER, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 8) .attr(ForceSwitchOutAttr, true), - new AttackMove(Moves.TRIPLE_AXEL, Type.ICE, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 8) + new AttackMove(Moves.TRIPLE_AXEL, PokemonType.ICE, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._3) .attr(MultiHitPowerIncrementAttr, 3) .checkAllHits(), - new AttackMove(Moves.DUAL_WINGBEAT, Type.FLYING, MoveCategory.PHYSICAL, 40, 90, 10, -1, 0, 8) + new AttackMove(Moves.DUAL_WINGBEAT, PokemonType.FLYING, MoveCategory.PHYSICAL, 40, 90, 10, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._2), - new AttackMove(Moves.SCORCHING_SANDS, Type.GROUND, MoveCategory.SPECIAL, 70, 100, 10, 30, 0, 8) + new AttackMove(Moves.SCORCHING_SANDS, PokemonType.GROUND, MoveCategory.SPECIAL, 70, 100, 10, 30, 0, 8) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(HealStatusEffectAttr, false, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN), - new StatusMove(Moves.JUNGLE_HEALING, Type.GRASS, -1, 10, -1, 0, 8) + new StatusMove(Moves.JUNGLE_HEALING, PokemonType.GRASS, -1, 10, -1, 0, 8) .attr(HealAttr, 0.25, true, false) - .attr(HealStatusEffectAttr, false, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) + .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) .target(MoveTarget.USER_AND_ALLIES), - new AttackMove(Moves.WICKED_BLOW, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) + new AttackMove(Moves.WICKED_BLOW, PokemonType.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) .attr(CritOnlyAttr) .punchingMove(), - new AttackMove(Moves.SURGING_STRIKES, Type.WATER, MoveCategory.PHYSICAL, 25, 100, 5, -1, 0, 8) + new AttackMove(Moves.SURGING_STRIKES, PokemonType.WATER, MoveCategory.PHYSICAL, 25, 100, 5, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._3) .attr(CritOnlyAttr) .punchingMove(), - new AttackMove(Moves.THUNDER_CAGE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 90, 15, -1, 0, 8) + new AttackMove(Moves.THUNDER_CAGE, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 80, 90, 15, -1, 0, 8) .attr(TrapAttr, BattlerTagType.THUNDER_CAGE), - new AttackMove(Moves.DRAGON_ENERGY, Type.DRAGON, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 8) + new AttackMove(Moves.DRAGON_ENERGY, PokemonType.DRAGON, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 8) .attr(HpPowerAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.FREEZING_GLARE, Type.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 8) + new AttackMove(Moves.FREEZING_GLARE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 8) .attr(StatusEffectAttr, StatusEffect.FREEZE), - new AttackMove(Moves.FIERY_WRATH, Type.DARK, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) + new AttackMove(Moves.FIERY_WRATH, PokemonType.DARK, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) .attr(FlinchAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.THUNDEROUS_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 8) + new AttackMove(Moves.THUNDEROUS_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), - new AttackMove(Moves.GLACIAL_LANCE, Type.ICE, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8) + new AttackMove(Moves.GLACIAL_LANCE, PokemonType.ICE, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .makesContact(false), - new AttackMove(Moves.ASTRAL_BARRAGE, Type.GHOST, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 8) + new AttackMove(Moves.ASTRAL_BARRAGE, PokemonType.GHOST, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.EERIE_SPELL, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 5, 100, 0, 8) + new AttackMove(Moves.EERIE_SPELL, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 5, 100, 0, 8) .attr(AttackReducePpMoveAttr, 3) .soundBased(), - new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8) + new AttackMove(Moves.DIRE_CLAW, PokemonType.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8) .attr(MultiStatusEffectAttr, [ StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP ]), - new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) + new AttackMove(Moves.PSYSHIELD_BASH, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), - new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, -1, 0, 8) + new SelfStatusMove(Moves.POWER_SHIFT, PokemonType.NORMAL, -1, 10, -1, 0, 8) .target(MoveTarget.USER) .attr(ShiftStatAttr, Stat.ATK, Stat.DEF), - new AttackMove(Moves.STONE_AXE, Type.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) + new AttackMove(Moves.STONE_AXE, PokemonType.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) .attr(AddArenaTrapTagHitAttr, ArenaTagType.STEALTH_ROCK) .slicingMove(), - new AttackMove(Moves.SPRINGTIDE_STORM, Type.FAIRY, MoveCategory.SPECIAL, 100, 80, 5, 30, 0, 8) + new AttackMove(Moves.SPRINGTIDE_STORM, PokemonType.FAIRY, MoveCategory.SPECIAL, 100, 80, 5, 30, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.MYSTICAL_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 70, 90, 10, 100, 0, 8) + new AttackMove(Moves.MYSTICAL_POWER, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 70, 90, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true), - new AttackMove(Moves.RAGING_FURY, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) + new AttackMove(Moves.RAGING_FURY, PokemonType.FIRE, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) .makesContact(false) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .attr(NoEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), - new AttackMove(Moves.WAVE_CRASH, Type.WATER, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) + new AttackMove(Moves.WAVE_CRASH, PokemonType.WATER, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) .attr(RecoilAttr, false, 0.33) .recklessMove(), - new AttackMove(Moves.CHLOROBLAST, Type.GRASS, MoveCategory.SPECIAL, 150, 95, 5, -1, 0, 8) + new AttackMove(Moves.CHLOROBLAST, PokemonType.GRASS, MoveCategory.SPECIAL, 150, 95, 5, -1, 0, 8) .attr(RecoilAttr, true, 0.5), - new AttackMove(Moves.MOUNTAIN_GALE, Type.ICE, MoveCategory.PHYSICAL, 100, 85, 10, 30, 0, 8) + new AttackMove(Moves.MOUNTAIN_GALE, PokemonType.ICE, MoveCategory.PHYSICAL, 100, 85, 10, 30, 0, 8) .makesContact(false) .attr(FlinchAttr), - new SelfStatusMove(Moves.VICTORY_DANCE, Type.FIGHTING, -1, 10, -1, 0, 8) + new SelfStatusMove(Moves.VICTORY_DANCE, PokemonType.FIGHTING, -1, 10, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPD ], 1, true) .danceMove(), - new AttackMove(Moves.HEADLONG_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8) + new AttackMove(Moves.HEADLONG_RUSH, PokemonType.GROUND, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true) .punchingMove(), - new AttackMove(Moves.BARB_BARRAGE, Type.POISON, MoveCategory.PHYSICAL, 60, 100, 10, 50, 0, 8) + new AttackMove(Moves.BARB_BARRAGE, PokemonType.POISON, MoveCategory.PHYSICAL, 60, 100, 10, 50, 0, 8) .makesContact(false) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status && (target.status.effect === StatusEffect.POISON || target.status.effect === StatusEffect.TOXIC) ? 2 : 1) .attr(StatusEffectAttr, StatusEffect.POISON), - new AttackMove(Moves.ESPER_WING, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) + new AttackMove(Moves.ESPER_WING, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) .attr(HighCritAttr) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true), - new AttackMove(Moves.BITTER_MALICE, Type.GHOST, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 8) + new AttackMove(Moves.BITTER_MALICE, PokemonType.GHOST, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new SelfStatusMove(Moves.SHELTER, Type.STEEL, -1, 10, 100, 0, 8) + new SelfStatusMove(Moves.SHELTER, PokemonType.STEEL, -1, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), - new AttackMove(Moves.TRIPLE_ARROWS, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 30, 0, 8) + new AttackMove(Moves.TRIPLE_ARROWS, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 30, 0, 8) .makesContact(false) .attr(HighCritAttr) - .attr(StatStageChangeAttr, [ Stat.DEF ], -1, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 50) + .attr(StatStageChangeAttr, [ Stat.DEF ], -1, false, { effectChanceOverride: 50 }) .attr(FlinchAttr), - new AttackMove(Moves.INFERNAL_PARADE, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 15, 30, 0, 8) + new AttackMove(Moves.INFERNAL_PARADE, PokemonType.GHOST, MoveCategory.SPECIAL, 60, 100, 15, 30, 0, 8) .attr(StatusEffectAttr, StatusEffect.BURN) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status ? 2 : 1), - new AttackMove(Moves.CEASELESS_EDGE, Type.DARK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) + new AttackMove(Moves.CEASELESS_EDGE, PokemonType.DARK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) .attr(AddArenaTrapTagHitAttr, ArenaTagType.SPIKES) .slicingMove(), - new AttackMove(Moves.BLEAKWIND_STORM, Type.FLYING, MoveCategory.SPECIAL, 100, 80, 10, 30, 0, 8) + new AttackMove(Moves.BLEAKWIND_STORM, PokemonType.FLYING, MoveCategory.SPECIAL, 100, 80, 10, 30, 0, 8) .attr(StormAccuracyAttr) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.WILDBOLT_STORM, Type.ELECTRIC, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) + new AttackMove(Moves.WILDBOLT_STORM, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) .attr(StormAccuracyAttr) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.SANDSEAR_STORM, Type.GROUND, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) + new AttackMove(Moves.SANDSEAR_STORM, PokemonType.GROUND, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8) .attr(StormAccuracyAttr) .attr(StatusEffectAttr, StatusEffect.BURN) .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.LUNAR_BLESSING, Type.PSYCHIC, -1, 5, -1, 0, 8) + new StatusMove(Moves.LUNAR_BLESSING, PokemonType.PSYCHIC, -1, 5, -1, 0, 8) .attr(HealAttr, 0.25, true, false) - .attr(HealStatusEffectAttr, false, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) + .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) .target(MoveTarget.USER_AND_ALLIES) .triageMove(), - new SelfStatusMove(Moves.TAKE_HEART, Type.PSYCHIC, -1, 10, -1, 0, 8) + new SelfStatusMove(Moves.TAKE_HEART, PokemonType.PSYCHIC, -1, 10, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF ], 1, true) - .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP), + .attr(HealStatusEffectAttr, true, [ StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP ]), /* Unused - new AttackMove(Moves.G_MAX_WILDFIRE, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.G_MAX_WILDFIRE, PokemonType.Fire, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), new AttackMove(Moves.G_MAX_BEFUDDLE, Type.BUG, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) @@ -9962,7 +10890,7 @@ export function initMoves() { new AttackMove(Moves.G_MAX_FOAM_BURST, Type.WATER, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), - new AttackMove(Moves.G_MAX_CENTIFERNO, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.G_MAX_CENTIFERNO, PokemonType.Fire, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), new AttackMove(Moves.G_MAX_VINE_LASH, Type.GRASS, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) @@ -9974,7 +10902,7 @@ export function initMoves() { new AttackMove(Moves.G_MAX_DRUM_SOLO, Type.GRASS, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), - new AttackMove(Moves.G_MAX_FIREBALL, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) + new AttackMove(Moves.G_MAX_FIREBALL, PokemonType.Fire, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), new AttackMove(Moves.G_MAX_HYDROSNIPE, Type.WATER, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) @@ -9987,57 +10915,56 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_ENEMIES) .unimplemented(), End Unused */ - new AttackMove(Moves.TERA_BLAST, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) + new AttackMove(Moves.TERA_BLAST, PokemonType.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) .attr(TeraMoveCategoryAttr) .attr(TeraBlastTypeAttr) .attr(TeraBlastPowerAttr) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR)) - .partial(), /** Does not ignore abilities that affect stats, relevant in determining the move's category {@see TeraMoveCategoryAttr} */ - new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized && user.isOfType(PokemonType.STELLAR) }), + new SelfStatusMove(Moves.SILK_TRAP, PokemonType.BUG, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.SILK_TRAP) .condition(failIfLastCondition), - new AttackMove(Moves.AXE_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 90, 10, 30, 0, 9) + new AttackMove(Moves.AXE_KICK, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 120, 90, 10, 30, 0, 9) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) .attr(ConfuseAttr) .recklessMove(), - new AttackMove(Moves.LAST_RESPECTS, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) - .attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? user.scene.currentBattle.playerFaints : user.scene.currentBattle.enemyFaints, 100)) + new AttackMove(Moves.LAST_RESPECTS, PokemonType.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) + .attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? globalScene.arena.playerFaints : globalScene.currentBattle.enemyFaints, 100)) .makesContact(false), - new AttackMove(Moves.LUMINA_CRASH, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) + new AttackMove(Moves.LUMINA_CRASH, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), - new AttackMove(Moves.ORDER_UP, Type.DRAGON, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) - .makesContact(false) - .partial(), // No effect implemented (requires Commander) - new AttackMove(Moves.JET_PUNCH, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 15, -1, 1, 9) + new AttackMove(Moves.ORDER_UP, PokemonType.DRAGON, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) + .attr(OrderUpStatBoostAttr) + .makesContact(false), + new AttackMove(Moves.JET_PUNCH, PokemonType.WATER, MoveCategory.PHYSICAL, 60, 100, 15, -1, 1, 9) .punchingMove(), - new StatusMove(Moves.SPICY_EXTRACT, Type.GRASS, -1, 15, -1, 0, 9) + new StatusMove(Moves.SPICY_EXTRACT, PokemonType.GRASS, -1, 15, -1, 0, 9) .attr(StatStageChangeAttr, [ Stat.ATK ], 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -2), - new AttackMove(Moves.SPIN_OUT, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) + new AttackMove(Moves.SPIN_OUT, PokemonType.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPD ], -2, true), - new AttackMove(Moves.POPULATION_BOMB, Type.NORMAL, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 9) + new AttackMove(Moves.POPULATION_BOMB, PokemonType.NORMAL, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._10) .slicingMove() .checkAllHits(), - new AttackMove(Moves.ICE_SPINNER, Type.ICE, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) + new AttackMove(Moves.ICE_SPINNER, PokemonType.ICE, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) .attr(ClearTerrainAttr), - new AttackMove(Moves.GLAIVE_RUSH, Type.DRAGON, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) + new AttackMove(Moves.GLAIVE_RUSH, PokemonType.DRAGON, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_GET_HIT, true, false, 0, 0, true) .attr(AddBattlerTagAttr, BattlerTagType.RECEIVE_DOUBLE_DAMAGE, true, false, 0, 0, true) .condition((user, target, move) => { - return !(target.getTag(BattlerTagType.PROTECTED)?.tagType === "PROTECTED" || target.scene.arena.getTag(ArenaTagType.MAT_BLOCK)?.tagType === "MAT_BLOCK"); + return !(target.getTag(BattlerTagType.PROTECTED)?.tagType === "PROTECTED" || globalScene.arena.getTag(ArenaTagType.MAT_BLOCK)?.tagType === "MAT_BLOCK"); }), - new StatusMove(Moves.REVIVAL_BLESSING, Type.NORMAL, -1, 1, -1, 0, 9) + new StatusMove(Moves.REVIVAL_BLESSING, PokemonType.NORMAL, -1, 1, -1, 0, 9) .triageMove() .attr(RevivalBlessingAttr) .target(MoveTarget.USER), - new AttackMove(Moves.SALT_CURE, Type.ROCK, MoveCategory.PHYSICAL, 40, 100, 15, 100, 0, 9) + new AttackMove(Moves.SALT_CURE, PokemonType.ROCK, MoveCategory.PHYSICAL, 40, 100, 15, 100, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.SALT_CURED) .makesContact(false), - new AttackMove(Moves.TRIPLE_DIVE, Type.WATER, MoveCategory.PHYSICAL, 30, 95, 10, -1, 0, 9) + new AttackMove(Moves.TRIPLE_DIVE, PokemonType.WATER, MoveCategory.PHYSICAL, 30, 95, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._3), - new AttackMove(Moves.MORTAL_SPIN, Type.POISON, MoveCategory.PHYSICAL, 30, 100, 15, 100, 0, 9) + new AttackMove(Moves.MORTAL_SPIN, PokemonType.POISON, MoveCategory.PHYSICAL, 30, 100, 15, 100, 0, 9) .attr(LapseBattlerTagAttr, [ BattlerTagType.BIND, BattlerTagType.WRAP, @@ -10054,176 +10981,176 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.POISON) .attr(RemoveArenaTrapAttr) .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.DOODLE, Type.NORMAL, 100, 10, -1, 0, 9) + new StatusMove(Moves.DOODLE, PokemonType.NORMAL, 100, 10, -1, 0, 9) .attr(AbilityCopyAttr, true), - new SelfStatusMove(Moves.FILLET_AWAY, Type.NORMAL, -1, 10, -1, 0, 9) + new SelfStatusMove(Moves.FILLET_AWAY, PokemonType.NORMAL, -1, 10, -1, 0, 9) .attr(CutHpStatStageBoostAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], 2, 2), - new AttackMove(Moves.KOWTOW_CLEAVE, Type.DARK, MoveCategory.PHYSICAL, 85, -1, 10, -1, 0, 9) + new AttackMove(Moves.KOWTOW_CLEAVE, PokemonType.DARK, MoveCategory.PHYSICAL, 85, -1, 10, -1, 0, 9) .slicingMove(), - new AttackMove(Moves.FLOWER_TRICK, Type.GRASS, MoveCategory.PHYSICAL, 70, -1, 10, 100, 0, 9) + new AttackMove(Moves.FLOWER_TRICK, PokemonType.GRASS, MoveCategory.PHYSICAL, 70, -1, 10, 100, 0, 9) .attr(CritOnlyAttr) .makesContact(false), - new AttackMove(Moves.TORCH_SONG, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) + new AttackMove(Moves.TORCH_SONG, PokemonType.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) .soundBased(), - new AttackMove(Moves.AQUA_STEP, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) + new AttackMove(Moves.AQUA_STEP, PokemonType.WATER, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true) .danceMove(), - new AttackMove(Moves.RAGING_BULL, Type.NORMAL, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9) + new AttackMove(Moves.RAGING_BULL, PokemonType.NORMAL, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9) .attr(RagingBullTypeAttr) .attr(RemoveScreensAttr), - new AttackMove(Moves.MAKE_IT_RAIN, Type.STEEL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) + new AttackMove(Moves.MAKE_IT_RAIN, PokemonType.STEEL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(MoneyAttr) - .attr(StatStageChangeAttr, [ Stat.SPATK ], -1, true, null, true, false, MoveEffectTrigger.HIT, true) + .attr(StatStageChangeAttr, [ Stat.SPATK ], -1, true, { firstTargetOnly: true }) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.PSYBLADE, Type.PSYCHIC, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.ELECTRIC && user.isGrounded() ? 1.5 : 1) + new AttackMove(Moves.PSYBLADE, PokemonType.PSYCHIC, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) + .attr(MovePowerMultiplierAttr, (user, target, move) => globalScene.arena.getTerrainType() === TerrainType.ELECTRIC && user.isGrounded() ? 1.5 : 1) .slicingMove(), - new AttackMove(Moves.HYDRO_STEAM, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 9) + new AttackMove(Moves.HYDRO_STEAM, PokemonType.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 9) .attr(IgnoreWeatherTypeDebuffAttr, WeatherType.SUNNY) - .attr(MovePowerMultiplierAttr, (user, target, move) => [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(user.scene.arena.weather?.weatherType!) && !user.scene.arena.weather?.isEffectSuppressed(user.scene) ? 1.5 : 1), // TODO: is this bang correct? - new AttackMove(Moves.RUINATION, Type.DARK, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 9) + .attr(MovePowerMultiplierAttr, (user, target, move) => [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(globalScene.arena.weather?.weatherType!) && !globalScene.arena.weather?.isEffectSuppressed() ? 1.5 : 1), // TODO: is this bang correct? + new AttackMove(Moves.RUINATION, PokemonType.DARK, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 9) .attr(TargetHalfHpDamageAttr), - new AttackMove(Moves.COLLISION_COURSE, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) + new AttackMove(Moves.COLLISION_COURSE, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2 ? 5461 / 4096 : 1), - new AttackMove(Moves.ELECTRO_DRIFT, Type.ELECTRIC, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 9) + new AttackMove(Moves.ELECTRO_DRIFT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2 ? 5461 / 4096 : 1) .makesContact(), - new SelfStatusMove(Moves.SHED_TAIL, Type.NORMAL, -1, 10, -1, 0, 9) - .attr(AddSubstituteAttr, 0.5) - .attr(ForceSwitchOutAttr, true, SwitchType.SHED_TAIL), - new SelfStatusMove(Moves.CHILLY_RECEPTION, Type.ICE, -1, 10, -1, 0, 9) + new SelfStatusMove(Moves.SHED_TAIL, PokemonType.NORMAL, -1, 10, -1, 0, 9) + .attr(AddSubstituteAttr, 0.5, true) + .attr(ForceSwitchOutAttr, true, SwitchType.SHED_TAIL) + .condition(failIfLastInPartyCondition), + new SelfStatusMove(Moves.CHILLY_RECEPTION, PokemonType.ICE, -1, 10, -1, 0, 9) .attr(PreMoveMessageAttr, (user, move) => i18next.t("moveTriggers:chillyReception", { pokemonName: getPokemonNameWithAffix(user) })) .attr(ChillyReceptionAttr, true), - new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, -1, 0, 9) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true, null, true, true) + new SelfStatusMove(Moves.TIDY_UP, PokemonType.NORMAL, -1, 10, -1, 0, 9) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true) .attr(RemoveArenaTrapAttr, true) .attr(RemoveAllSubstitutesAttr), - new StatusMove(Moves.SNOWSCAPE, Type.ICE, -1, 10, -1, 0, 9) + new StatusMove(Moves.SNOWSCAPE, PokemonType.ICE, -1, 10, -1, 0, 9) .attr(WeatherChangeAttr, WeatherType.SNOW) .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.POUNCE, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9) + new AttackMove(Moves.POUNCE, PokemonType.BUG, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPD ], -1), - new AttackMove(Moves.TRAILBLAZE, Type.GRASS, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9) + new AttackMove(Moves.TRAILBLAZE, PokemonType.GRASS, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true), - new AttackMove(Moves.CHILLING_WATER, Type.WATER, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 9) + new AttackMove(Moves.CHILLING_WATER, PokemonType.WATER, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.ATK ], -1), - new AttackMove(Moves.HYPER_DRILL, Type.NORMAL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) + new AttackMove(Moves.HYPER_DRILL, PokemonType.NORMAL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) .ignoresProtect(), - new AttackMove(Moves.TWIN_BEAM, Type.PSYCHIC, MoveCategory.SPECIAL, 40, 100, 10, -1, 0, 9) + new AttackMove(Moves.TWIN_BEAM, PokemonType.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) - .attr(HitCountPowerAttr) + new AttackMove(Moves.RAGE_FIST, PokemonType.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) + .edgeCase() // Counter incorrectly increases on confusion self-hits + .attr(RageFistPowerAttr) .punchingMove(), - new AttackMove(Moves.ARMOR_CANNON, Type.FIRE, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) + new AttackMove(Moves.ARMOR_CANNON, PokemonType.FIRE, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true), - new AttackMove(Moves.BITTER_BLADE, Type.FIRE, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9) + new AttackMove(Moves.BITTER_BLADE, PokemonType.FIRE, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9) .attr(HitHealAttr) .slicingMove() .triageMove(), - new AttackMove(Moves.DOUBLE_SHOCK, Type.ELECTRIC, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) + new AttackMove(Moves.DOUBLE_SHOCK, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) .condition((user) => { const userTypes = user.getTypes(true); - return userTypes.includes(Type.ELECTRIC); + return userTypes.includes(PokemonType.ELECTRIC); }) .attr(AddBattlerTagAttr, BattlerTagType.DOUBLE_SHOCKED, true, false) - .attr(RemoveTypeAttr, Type.ELECTRIC, (user) => { - user.scene.queueMessage(i18next.t("moveTriggers:usedUpAllElectricity", { pokemonName: getPokemonNameWithAffix(user) })); + .attr(RemoveTypeAttr, PokemonType.ELECTRIC, (user) => { + globalScene.queueMessage(i18next.t("moveTriggers:usedUpAllElectricity", { pokemonName: getPokemonNameWithAffix(user) })); }), - new AttackMove(Moves.GIGATON_HAMMER, Type.STEEL, MoveCategory.PHYSICAL, 160, 100, 5, -1, 0, 9) + new AttackMove(Moves.GIGATON_HAMMER, PokemonType.STEEL, MoveCategory.PHYSICAL, 160, 100, 5, -1, 0, 9) .makesContact(false) .condition((user, target, move) => { const turnMove = user.getLastXMoves(1); return !turnMove.length || turnMove[0].move !== move.id || turnMove[0].result !== MoveResult.SUCCESS; }), // TODO Add Instruct/Encore interaction - new AttackMove(Moves.COMEUPPANCE, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) + new AttackMove(Moves.COMEUPPANCE, PokemonType.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) .attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5) .redirectCounter() .target(MoveTarget.ATTACKER), - new AttackMove(Moves.AQUA_CUTTER, Type.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9) + new AttackMove(Moves.AQUA_CUTTER, PokemonType.WATER, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 9) .attr(HighCritAttr) .slicingMove() .makesContact(false), - new AttackMove(Moves.BLAZING_TORQUE, Type.FIRE, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 9) + new AttackMove(Moves.BLAZING_TORQUE, PokemonType.FIRE, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 9) .attr(StatusEffectAttr, StatusEffect.BURN) .makesContact(false), - new AttackMove(Moves.WICKED_TORQUE, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 10, 10, 0, 9) + new AttackMove(Moves.WICKED_TORQUE, PokemonType.DARK, MoveCategory.PHYSICAL, 80, 100, 10, 10, 0, 9) .attr(StatusEffectAttr, StatusEffect.SLEEP) .makesContact(false), - new AttackMove(Moves.NOXIOUS_TORQUE, Type.POISON, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) + new AttackMove(Moves.NOXIOUS_TORQUE, PokemonType.POISON, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), - new AttackMove(Moves.COMBAT_TORQUE, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) + new AttackMove(Moves.COMBAT_TORQUE, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .makesContact(false), - new AttackMove(Moves.MAGICAL_TORQUE, Type.FAIRY, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) + new AttackMove(Moves.MAGICAL_TORQUE, PokemonType.FAIRY, MoveCategory.PHYSICAL, 100, 100, 10, 30, 0, 9) .attr(ConfuseAttr) .makesContact(false), - new AttackMove(Moves.BLOOD_MOON, Type.NORMAL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 9) + new AttackMove(Moves.BLOOD_MOON, PokemonType.NORMAL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 9) .condition((user, target, move) => { const turnMove = user.getLastXMoves(1); return !turnMove.length || turnMove[0].move !== move.id || turnMove[0].result !== MoveResult.SUCCESS; }), // TODO Add Instruct/Encore interaction - new AttackMove(Moves.MATCHA_GOTCHA, Type.GRASS, MoveCategory.SPECIAL, 80, 90, 15, 20, 0, 9) + new AttackMove(Moves.MATCHA_GOTCHA, PokemonType.GRASS, MoveCategory.SPECIAL, 80, 90, 15, 20, 0, 9) .attr(HitHealAttr) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(HealStatusEffectAttr, false, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .target(MoveTarget.ALL_NEAR_ENEMIES) .triageMove(), - new AttackMove(Moves.SYRUP_BOMB, Type.GRASS, MoveCategory.SPECIAL, 60, 85, 10, -1, 0, 9) + new AttackMove(Moves.SYRUP_BOMB, PokemonType.GRASS, MoveCategory.SPECIAL, 60, 85, 10, -1, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.SYRUP_BOMB, false, false, 3) .ballBombMove(), - new AttackMove(Moves.IVY_CUDGEL, Type.GRASS, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 9) + new AttackMove(Moves.IVY_CUDGEL, PokemonType.GRASS, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 9) .attr(IvyCudgelTypeAttr) .attr(HighCritAttr) .makesContact(false), - new ChargingAttackMove(Moves.ELECTRO_SHOT, Type.ELECTRIC, MoveCategory.SPECIAL, 130, 100, 10, 100, 0, 9) + new ChargingAttackMove(Moves.ELECTRO_SHOT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 130, 100, 10, 100, 0, 9) .chargeText(i18next.t("moveTriggers:absorbedElectricity", { pokemonName: "{USER}" })) .chargeAttr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) - .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.RAIN, WeatherType.HEAVY_RAIN ]) - .ignoresVirtual(), - new AttackMove(Moves.TERA_STARSTORM, Type.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) + .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.RAIN, WeatherType.HEAVY_RAIN ]), + new AttackMove(Moves.TERA_STARSTORM, PokemonType.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(TeraMoveCategoryAttr) .attr(TeraStarstormTypeAttr) - .attr(VariableTargetAttr, (user, target, move) => (user.hasFusionSpecies(Species.TERAPAGOS) || user.species.speciesId === Species.TERAPAGOS) && user.isTerastallized() ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER) + .attr(VariableTargetAttr, (user, target, move) => user.hasSpecies(Species.TERAPAGOS) && user.isTerastallized ? MoveTarget.ALL_NEAR_ENEMIES : MoveTarget.NEAR_OTHER) .partial(), /** Does not ignore abilities that affect stats, relevant in determining the move's category {@see TeraMoveCategoryAttr} */ - new AttackMove(Moves.FICKLE_BEAM, Type.DRAGON, MoveCategory.SPECIAL, 80, 100, 5, 30, 0, 9) + new AttackMove(Moves.FICKLE_BEAM, PokemonType.DRAGON, MoveCategory.SPECIAL, 80, 100, 5, 30, 0, 9) .attr(PreMoveMessageAttr, doublePowerChanceMessageFunc) .attr(DoublePowerChanceAttr), - new SelfStatusMove(Moves.BURNING_BULWARK, Type.FIRE, -1, 10, -1, 4, 9) + new SelfStatusMove(Moves.BURNING_BULWARK, PokemonType.FIRE, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.BURNING_BULWARK) .condition(failIfLastCondition), - new AttackMove(Moves.THUNDERCLAP, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9) - .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? - new AttackMove(Moves.MIGHTY_CLEAVE, Type.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9) + new AttackMove(Moves.THUNDERCLAP, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9) + .condition((user, target, move) => globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? + new AttackMove(Moves.MIGHTY_CLEAVE, PokemonType.ROCK, MoveCategory.PHYSICAL, 95, 100, 5, -1, 0, 9) .slicingMove() .ignoresProtect(), - new AttackMove(Moves.TACHYON_CUTTER, Type.STEEL, MoveCategory.SPECIAL, 50, -1, 10, -1, 0, 9) + new AttackMove(Moves.TACHYON_CUTTER, PokemonType.STEEL, MoveCategory.SPECIAL, 50, -1, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._2) .slicingMove(), - new AttackMove(Moves.HARD_PRESS, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) + new AttackMove(Moves.HARD_PRESS, PokemonType.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9) .attr(OpponentHighHpPowerAttr, 100), - new StatusMove(Moves.DRAGON_CHEER, Type.DRAGON, -1, 15, -1, 0, 9) + new StatusMove(Moves.DRAGON_CHEER, PokemonType.DRAGON, -1, 15, -1, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.DRAGON_CHEER, false, true) .target(MoveTarget.NEAR_ALLY), - new AttackMove(Moves.ALLURING_VOICE, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) + new AttackMove(Moves.ALLURING_VOICE, PokemonType.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9) .attr(AddBattlerTagIfBoostedAttr, BattlerTagType.CONFUSED) .soundBased(), - new AttackMove(Moves.TEMPER_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 9) + new AttackMove(Moves.TEMPER_FLARE, PokemonType.FIRE, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1), - new AttackMove(Moves.SUPERCELL_SLAM, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 95, 15, -1, 0, 9) + new AttackMove(Moves.SUPERCELL_SLAM, PokemonType.ELECTRIC, MoveCategory.PHYSICAL, 100, 95, 15, -1, 0, 9) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) .recklessMove(), - new AttackMove(Moves.PSYCHIC_NOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 9) + new AttackMove(Moves.PSYCHIC_NOISE, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 9) .soundBased() .attr(AddBattlerTagAttr, BattlerTagType.HEAL_BLOCK, false, false, 2), - new AttackMove(Moves.UPPER_HAND, Type.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 15, 100, 3, 9) + new AttackMove(Moves.UPPER_HAND, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 15, 100, 3, 9) .attr(FlinchAttr) - .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].priority > 0 ) // TODO: is this bang correct? - .partial(), // Should also apply when target move priority increased by ability ex. gale wings - new AttackMove(Moves.MALIGNANT_CHAIN, Type.POISON, MoveCategory.SPECIAL, 100, 100, 5, 50, 0, 9) + .condition(new UpperHandCondition()), + new AttackMove(Moves.MALIGNANT_CHAIN, PokemonType.POISON, MoveCategory.SPECIAL, 100, 100, 5, 50, 0, 9) .attr(StatusEffectAttr, StatusEffect.TOXIC) ); allMoves.map(m => { diff --git a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts index f0155b4f2a4..6cea85346b3 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -1,15 +1,22 @@ -import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { trainerConfigs, } from "#app/data/trainer-config"; +import { globalScene } from "#app/global-scene"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { trainerConfigs } from "#app/data/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { TrainerType } from "#enums/trainer-type"; import { Species } from "#enums/species"; import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { randSeedInt } from "#app/utils"; import i18next from "i18next"; -import { IEggOptions } from "#app/data/egg"; +import type { IEggOptions } from "#app/data/egg"; import { EggSourceType } from "#enums/egg-source-types"; import { EggTier } from "#enums/egg-type"; import { PartyHealPhase } from "#app/phases/party-heal-phase"; @@ -25,163 +32,172 @@ const namespace = "mysteryEncounters/aTrainersTest"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3816 | GitHub Issue #3816} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ATrainersTestEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.A_TRAINERS_TEST) - .withEncounterTier(MysteryEncounterTier.ROGUE) - .withSceneWaveRangeRequirement(100, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withIntroSpriteConfigs([]) // These are set in onInit() - .withIntroDialogue([ +export const ATrainersTestEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.A_TRAINERS_TEST, +) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withSceneWaveRangeRequirement(100, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withIntroSpriteConfigs([]) // These are set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withAutoHideIntroVisuals(false) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + + // Randomly pick from 1 of the 5 stat trainers to spawn + let trainerType: TrainerType; + let spriteKeys: { spriteKey: any; fileRoot: any }; + let trainerNameKey: string; + switch (randSeedInt(5)) { + case 1: + trainerType = TrainerType.CHERYL; + spriteKeys = getSpriteKeysFromSpecies(Species.BLISSEY); + trainerNameKey = "cheryl"; + break; + case 2: + trainerType = TrainerType.MARLEY; + spriteKeys = getSpriteKeysFromSpecies(Species.ARCANINE); + trainerNameKey = "marley"; + break; + case 3: + trainerType = TrainerType.MIRA; + spriteKeys = getSpriteKeysFromSpecies(Species.ALAKAZAM, false, 1); + trainerNameKey = "mira"; + break; + case 4: + trainerType = TrainerType.RILEY; + spriteKeys = getSpriteKeysFromSpecies(Species.LUCARIO, false, 1); + trainerNameKey = "riley"; + break; + default: + trainerType = TrainerType.BUCK; + spriteKeys = getSpriteKeysFromSpecies(Species.CLAYDOL); + trainerNameKey = "buck"; + break; + } + + // Dialogue and tokens for trainer + encounter.dialogue.intro = [ { - text: `${namespace}:intro`, + speaker: `trainerNames:${trainerNameKey}`, + text: `${namespace}:${trainerNameKey}.intro_dialogue`, }, - ]) - .withAutoHideIntroVisuals(false) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; + ]; + encounter.options[0].dialogue!.selected = [ + { + speaker: `trainerNames:${trainerNameKey}`, + text: `${namespace}:${trainerNameKey}.accept`, + }, + ]; + encounter.options[1].dialogue!.selected = [ + { + speaker: `trainerNames:${trainerNameKey}`, + text: `${namespace}:${trainerNameKey}.decline`, + }, + ]; - // Randomly pick from 1 of the 5 stat trainers to spawn - let trainerType: TrainerType; - let spriteKeys; - let trainerNameKey: string; - switch (randSeedInt(5)) { - default: - case 0: - trainerType = TrainerType.BUCK; - spriteKeys = getSpriteKeysFromSpecies(Species.CLAYDOL); - trainerNameKey = "buck"; - break; - case 1: - trainerType = TrainerType.CHERYL; - spriteKeys = getSpriteKeysFromSpecies(Species.BLISSEY); - trainerNameKey = "cheryl"; - break; - case 2: - trainerType = TrainerType.MARLEY; - spriteKeys = getSpriteKeysFromSpecies(Species.ARCANINE); - trainerNameKey = "marley"; - break; - case 3: - trainerType = TrainerType.MIRA; - spriteKeys = getSpriteKeysFromSpecies(Species.ALAKAZAM, false, 1); - trainerNameKey = "mira"; - break; - case 4: - trainerType = TrainerType.RILEY; - spriteKeys = getSpriteKeysFromSpecies(Species.LUCARIO, false, 1); - trainerNameKey = "riley"; - break; - } + encounter.setDialogueToken("statTrainerName", i18next.t(`trainerNames:${trainerNameKey}`)); + const eggDescription = `${i18next.t(`${namespace}:title`)}:\n${i18next.t(`trainerNames:${trainerNameKey}`)}`; + encounter.misc = { + trainerType, + trainerNameKey, + trainerEggDescription: eggDescription, + }; - // Dialogue and tokens for trainer - encounter.dialogue.intro = [ + // Trainer config + const trainerConfig = trainerConfigs[trainerType].clone(); + const trainerSpriteKey = trainerConfig.getSpriteKey(); + encounter.enemyPartyConfigs.push({ + levelAdditiveModifier: 1, + trainerConfig: trainerConfig, + }); + + encounter.spriteConfigs = [ + { + spriteKey: spriteKeys.spriteKey, + fileRoot: spriteKeys.fileRoot, + hasShadow: true, + repeat: true, + isPokemon: true, + x: 22, + y: -2, + yShadow: -2, + }, + { + spriteKey: trainerSpriteKey, + fileRoot: "trainer", + hasShadow: true, + disableAnimation: true, + x: -24, + y: 4, + yShadow: 4, + }, + ]; + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withIntroDialogue() + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + }, + async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Battle the stat trainer for an Egg and great rewards + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + + await transitionMysteryEncounterIntroVisuals(); + + const eggOptions: IEggOptions = { + pulled: false, + sourceType: EggSourceType.EVENT, + eggDescriptor: encounter.misc.trainerEggDescription, + tier: EggTier.EPIC, + }; + encounter.setDialogueToken("eggType", i18next.t(`${namespace}:eggTypes.epic`)); + setEncounterRewards( { - speaker: `trainerNames:${trainerNameKey}`, - text: `${namespace}:${trainerNameKey}.intro_dialogue` - } - ]; - encounter.options[0].dialogue!.selected = [ - { - speaker: `trainerNames:${trainerNameKey}`, - text: `${namespace}:${trainerNameKey}.accept` - } - ]; - encounter.options[1].dialogue!.selected = [ - { - speaker: `trainerNames:${trainerNameKey}`, - text: `${namespace}:${trainerNameKey}.decline` - } - ]; - - encounter.setDialogueToken("statTrainerName", i18next.t(`trainerNames:${trainerNameKey}`)); - const eggDescription = i18next.t(`${namespace}:title`) + ":\n" + i18next.t(`trainerNames:${trainerNameKey}`); - encounter.misc = { trainerType, trainerNameKey, trainerEggDescription: eggDescription }; - - // Trainer config - const trainerConfig = trainerConfigs[trainerType].clone(); - const trainerSpriteKey = trainerConfig.getSpriteKey(); - encounter.enemyPartyConfigs.push({ - levelAdditiveModifier: 1, - trainerConfig: trainerConfig - }); - - encounter.spriteConfigs = [ - { - spriteKey: spriteKeys.spriteKey, - fileRoot: spriteKeys.fileRoot, - hasShadow: true, - repeat: true, - isPokemon: true, - x: 22, - y: -2, - yShadow: -2 + guaranteedModifierTypeFuncs: [modifierTypes.SACRED_ASH], + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA], + fillRemaining: true, }, - { - spriteKey: trainerSpriteKey, - fileRoot: "trainer", - hasShadow: true, - disableAnimation: true, - x: -24, - y: 4, - yShadow: 4 - } - ]; + [eggOptions], + ); + await initBattleWithEnemyConfig(config); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + }, + async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Full heal party + globalScene.unshiftPhase(new PartyHealPhase(true)); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withIntroDialogue() - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip` - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Battle the stat trainer for an Egg and great rewards - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - - await transitionMysteryEncounterIntroVisuals(scene); - - const eggOptions: IEggOptions = { - scene, - pulled: false, - sourceType: EggSourceType.EVENT, - eggDescriptor: encounter.misc.trainerEggDescription, - tier: EggTier.EPIC - }; - encounter.setDialogueToken("eggType", i18next.t(`${namespace}:eggTypes.epic`)); - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.SACRED_ASH ], guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ULTRA ], fillRemaining: true }, [ eggOptions ]); - await initBattleWithEnemyConfig(scene, config); - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip` - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Full heal party - scene.unshiftPhase(new PartyHealPhase(scene, true)); - - const eggOptions: IEggOptions = { - scene, - pulled: false, - sourceType: EggSourceType.EVENT, - eggDescriptor: encounter.misc.trainerEggDescription, - tier: EggTier.RARE - }; - encounter.setDialogueToken("eggType", i18next.t(`${namespace}:eggTypes.rare`)); - setEncounterRewards(scene, { fillRemaining: false, rerollMultiplier: -1 }, [ eggOptions ]); - leaveEncounterWithoutBattle(scene); - } - ) - .withOutroDialogue([ - { - text: `${namespace}:outro` - } - ]) - .build(); + const eggOptions: IEggOptions = { + pulled: false, + sourceType: EggSourceType.EVENT, + eggDescriptor: encounter.misc.trainerEggDescription, + tier: EggTier.RARE, + }; + encounter.setDialogueToken("eggType", i18next.t(`${namespace}:eggTypes.rare`)); + setEncounterRewards({ fillRemaining: false, rerollMultiplier: -1 }, [eggOptions]); + leaveEncounterWithoutBattle(); + }, + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index c53b802bb22..ca44782691d 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -1,10 +1,20 @@ -import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon, { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; -import { BerryModifierType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type Pokemon from "#app/field/pokemon"; +import { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; +import type { BerryModifierType, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { PersistentModifierRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -16,11 +26,15 @@ import { Moves } from "#enums/moves"; import { BattlerTagType } from "#enums/battler-tag-type"; import { randInt } from "#app/utils"; import { BattlerIndex } from "#app/battle"; -import { applyModifierTypeToPlayerPokemon, catchPokemon, getHighestLevelPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + applyModifierTypeToPlayerPokemon, + catchPokemon, + getHighestLevelPlayerPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { TrainerSlot } from "#app/data/trainer-config"; -import { PokeballType } from "#app/data/pokeball"; -import HeldModifierConfig from "#app/interfaces/held-modifier-config"; -import { BerryType } from "#enums/berry-type"; +import { PokeballType } from "#enums/pokeball"; +import type HeldModifierConfig from "#app/interfaces/held-modifier-config"; +import type { BerryType } from "#enums/berry-type"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; @@ -34,420 +48,439 @@ const namespace = "mysteryEncounters/absoluteAvarice"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3805 | GitHub Issue #3805} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const AbsoluteAvariceEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.ABSOLUTE_AVARICE) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Must have at least 4 berries to spawn - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - // This sprite has the shadow - spriteKey: "", - fileRoot: "", - species: Species.GREEDENT, - hasShadow: true, - alpha: 0.001, - repeat: true, - x: -5 - }, - { - spriteKey: "", - fileRoot: "", - species: Species.GREEDENT, - hasShadow: false, - repeat: true, - x: -5 - }, - { - spriteKey: "lum_berry", - fileRoot: "items", - isItem: true, - x: 7, - y: -14, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "salac_berry", - fileRoot: "items", - isItem: true, - x: 2, - y: 4, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "lansat_berry", - fileRoot: "items", - isItem: true, - x: 32, - y: 5, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "liechi_berry", - fileRoot: "items", - isItem: true, - x: 6, - y: -5, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "sitrus_berry", - fileRoot: "items", - isItem: true, - x: 7, - y: 8, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "enigma_berry", - fileRoot: "items", - isItem: true, - x: 26, - y: -4, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "leppa_berry", - fileRoot: "items", - isItem: true, - x: 16, - y: -27, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "petaya_berry", - fileRoot: "items", - isItem: true, - x: 30, - y: -17, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "ganlon_berry", - fileRoot: "items", - isItem: true, - x: 16, - y: -11, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "apicot_berry", - fileRoot: "items", - isItem: true, - x: 14, - y: -2, - hidden: true, - disableAnimation: true - }, - { - spriteKey: "starf_berry", - fileRoot: "items", - isItem: true, - x: 18, - y: 9, - hidden: true, - disableAnimation: true - }, - ]) - .withHideWildIntroMessage(true) - .withAutoHideIntroVisuals(false) - .withIntroDialogue([ - { - text: `${namespace}:intro`, +export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.ABSOLUTE_AVARICE, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Must have at least 4 berries to spawn + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + // This sprite has the shadow + spriteKey: "", + fileRoot: "", + species: Species.GREEDENT, + hasShadow: true, + alpha: 0.001, + repeat: true, + x: -5, + }, + { + spriteKey: "", + fileRoot: "", + species: Species.GREEDENT, + hasShadow: false, + repeat: true, + x: -5, + }, + { + spriteKey: "lum_berry", + fileRoot: "items", + isItem: true, + x: 7, + y: -14, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "salac_berry", + fileRoot: "items", + isItem: true, + x: 2, + y: 4, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "lansat_berry", + fileRoot: "items", + isItem: true, + x: 32, + y: 5, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "liechi_berry", + fileRoot: "items", + isItem: true, + x: 6, + y: -5, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "sitrus_berry", + fileRoot: "items", + isItem: true, + x: 7, + y: 8, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "enigma_berry", + fileRoot: "items", + isItem: true, + x: 26, + y: -4, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "leppa_berry", + fileRoot: "items", + isItem: true, + x: 16, + y: -27, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "petaya_berry", + fileRoot: "items", + isItem: true, + x: 30, + y: -17, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "ganlon_berry", + fileRoot: "items", + isItem: true, + x: 16, + y: -11, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "apicot_berry", + fileRoot: "items", + isItem: true, + x: 14, + y: -2, + hidden: true, + disableAnimation: true, + }, + { + spriteKey: "starf_berry", + fileRoot: "items", + isItem: true, + x: 18, + y: 9, + hidden: true, + disableAnimation: true, + }, + ]) + .withHideWildIntroMessage(true) + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + + globalScene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav"); + globalScene.loadSe("Follow Me", "battle_anims", "Follow Me.mp3"); + + // Get all player berry items, remove from party, and store reference + const berryItems = globalScene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + + // Sort berries by party member ID to more easily re-add later if necessary + const berryItemsMap = new Map(); + globalScene.getPlayerParty().forEach(pokemon => { + const pokemonBerries = berryItems.filter(b => b.pokemonId === pokemon.id); + if (pokemonBerries?.length > 0) { + berryItemsMap.set(pokemon.id, pokemonBerries); } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; + }); - scene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav"); - scene.loadSe("Follow Me", "battle_anims", "Follow Me.mp3"); + encounter.misc = { berryItemsMap }; - // Get all player berry items, remove from party, and store reference - const berryItems = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + // Generates copies of the stolen berries to put on the Greedent + const bossModifierConfigs: HeldModifierConfig[] = []; + berryItems.forEach(berryMod => { + // Can't define stack count on a ModifierType, have to just create separate instances for each stack + // Overflow berries will be "lost" on the boss, but it's un-catchable anyway + for (let i = 0; i < berryMod.stackCount; i++) { + const modifierType = generateModifierType(modifierTypes.BERRY, [ + berryMod.berryType, + ]) as PokemonHeldItemModifierType; + bossModifierConfigs.push({ modifier: modifierType }); + } + }); - // Sort berries by party member ID to more easily re-add later if necessary - const berryItemsMap = new Map(); - scene.getParty().forEach(pokemon => { - const pokemonBerries = berryItems.filter(b => b.pokemonId === pokemon.id); - if (pokemonBerries?.length > 0) { - berryItemsMap.set(pokemon.id, pokemonBerries); - } - }); + // Do NOT remove the real berries yet or else it will be persisted in the session data - encounter.misc = { berryItemsMap }; + // SpDef buff below wave 50, +1 to all stats otherwise + const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = + globalScene.currentBattle.waveIndex < 50 ? [Stat.SPDEF] : [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; - // Generates copies of the stolen berries to put on the Greedent - const bossModifierConfigs: HeldModifierConfig[] = []; - berryItems.forEach(berryMod => { - // Can't define stack count on a ModifierType, have to just create separate instances for each stack - // Overflow berries will be "lost" on the boss, but it's un-catchable anyway - for (let i = 0; i < berryMod.stackCount; i++) { - const modifierType = generateModifierType(scene, modifierTypes.BERRY, [ berryMod.berryType ]) as PokemonHeldItemModifierType; - bossModifierConfigs.push({ modifier: modifierType }); - } - }); + // Calculate boss mon + const config: EnemyPartyConfig = { + levelAdditiveModifier: 1, + pokemonConfigs: [ + { + 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], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(`${namespace}:option.1.boss_enraged`); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1), + ); + }, + }, + ], + }; - // Do NOT remove the real berries yet or else it will be persisted in the session data + encounter.enemyPartyConfigs = [config]; + encounter.setDialogueToken("greedentName", getPokemonSpecies(Species.GREEDENT).getName()); - // SpDef buff below wave 50, +1 to all stats otherwise - const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = scene.currentBattle.waveIndex < 50 ? - [ Stat.SPDEF ] : - [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + return true; + }) + .withOnVisualsStart(() => { + doGreedentSpriteSteal(); + doBerrySpritePile(); - // Calculate boss mon - const config: EnemyPartyConfig = { - levelAdditiveModifier: 1, - pokemonConfigs: [ + // Remove the berries from the party + // Session has been safely saved at this point, so data won't be lost + const berryItems = globalScene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + berryItems.forEach(berryMod => { + globalScene.removeModifier(berryMod); + }); + + globalScene.updateModifiers(true); + + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ { - species: getPokemonSpecies(Species.GREEDENT), - isBoss: true, - bossSegments: 3, - moveSet: [ Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.CRUNCH ], - modifierConfigs: bossModifierConfigs, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:option.1.boss_enraged`); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withOptionPhase(async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + + // Provides 1x Reviver Seed to each party member at end of battle + const revSeed = generateModifierType(modifierTypes.REVIVER_SEED); + encounter.setDialogueToken( + "foodReward", + revSeed?.name ?? i18next.t("modifierType:ModifierType.REVIVER_SEED.name"), + ); + const givePartyPokemonReviverSeeds = () => { + const party = globalScene.getPlayerParty(); + party.forEach(p => { + const heldItems = p.getHeldItems(); + if (revSeed && !heldItems.some(item => item instanceof PokemonInstantReviveModifier)) { + const seedModifier = revSeed.newModifier(p); + globalScene.addModifier(seedModifier, false, false, false, true); + } + }); + queueEncounterMessage(`${namespace}:option.1.food_stash`); + }; + + setEncounterRewards({ fillRemaining: true }, undefined, givePartyPokemonReviverSeeds); + encounter.startOfBattleEffects.push({ + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY], + move: new PokemonMove(Moves.STUFF_CHEEKS), + ignorePp: true, + }); + + await transitionMysteryEncounterIntroVisuals(true, true, 500); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const berryMap = encounter.misc.berryItemsMap; + + // Returns 2/5 of the berries stolen to each Pokemon + const party = globalScene.getPlayerParty(); + party.forEach(pokemon => { + const stolenBerries: BerryModifier[] = berryMap.get(pokemon.id); + const berryTypesAsArray: BerryType[] = []; + stolenBerries?.forEach(bMod => berryTypesAsArray.push(...new Array(bMod.stackCount).fill(bMod.berryType))); + const returnedBerryCount = Math.floor(((berryTypesAsArray.length ?? 0) * 2) / 5); + + if (returnedBerryCount > 0) { + for (let i = 0; i < returnedBerryCount; i++) { + // Shuffle remaining berry types and pop + Phaser.Math.RND.shuffle(berryTypesAsArray); + const randBerryType = berryTypesAsArray.pop(); + + const berryModType = generateModifierType(modifierTypes.BERRY, [randBerryType]) as BerryModifierType; + applyModifierTypeToPlayerPokemon(pokemon, berryModType); } } + }); + await globalScene.updateModifiers(true); + + await transitionMysteryEncounterIntroVisuals(true, true, 500); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, ], - }; + }) + .withPreOptionPhase(async () => { + // Animate berries being eaten + doGreedentEatBerries(); + doBerrySpritePile(true); + return true; + }) + .withOptionPhase(async () => { + // Let it have the food + // Greedent joins the team, level equal to 2 below highest party member (shiny locked) + const level = getHighestLevelPlayerPokemon(false, true).level - 2; + const greedent = new EnemyPokemon(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; - encounter.enemyPartyConfigs = [ config ]; - encounter.setDialogueToken("greedentName", getPokemonSpecies(Species.GREEDENT).getName()); + await transitionMysteryEncounterIntroVisuals(true, true, 500); + await catchPokemon(greedent, null, PokeballType.POKEBALL, false); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .build(); - return true; - }) - .withOnVisualsStart((scene: BattleScene) => { - doGreedentSpriteSteal(scene); - doBerrySpritePile(scene); - - // Remove the berries from the party - // Session has been safely saved at this point, so data won't be lost - const berryItems = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; - berryItems.forEach(berryMod => { - scene.removeModifier(berryMod); - }); - - scene.updateModifiers(true); - - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - // Pick battle - const encounter = scene.currentBattle.mysteryEncounter!; - - // Provides 1x Reviver Seed to each party member at end of battle - const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED); - encounter.setDialogueToken("foodReward", revSeed?.name ?? i18next.t("modifierType:ModifierType.REVIVER_SEED.name")); - const givePartyPokemonReviverSeeds = () => { - const party = scene.getParty(); - party.forEach(p => { - const heldItems = p.getHeldItems(); - if (revSeed && !heldItems.some(item => item instanceof PokemonInstantReviveModifier)) { - const seedModifier = revSeed.newModifier(p); - scene.addModifier(seedModifier, false, false, false, true); - } - }); - queueEncounterMessage(scene, `${namespace}:option.1.food_stash`); - }; - - setEncounterRewards(scene, { fillRemaining: true }, undefined, givePartyPokemonReviverSeeds); - encounter.startOfBattleEffects.push({ - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.ENEMY ], - move: new PokemonMove(Moves.STUFF_CHEEKS), - ignorePp: true - }); - - await transitionMysteryEncounterIntroVisuals(scene, true, true, 500); - await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const berryMap = encounter.misc.berryItemsMap; - - // Returns 2/5 of the berries stolen to each Pokemon - const party = scene.getParty(); - party.forEach(pokemon => { - const stolenBerries: BerryModifier[] = berryMap.get(pokemon.id); - const berryTypesAsArray: BerryType[] = []; - stolenBerries?.forEach(bMod => berryTypesAsArray.push(...new Array(bMod.stackCount).fill(bMod.berryType))); - const returnedBerryCount = Math.floor((berryTypesAsArray.length ?? 0) * 2 / 5); - - if (returnedBerryCount > 0) { - for (let i = 0; i < returnedBerryCount; i++) { - // Shuffle remaining berry types and pop - Phaser.Math.RND.shuffle(berryTypesAsArray); - const randBerryType = berryTypesAsArray.pop(); - - const berryModType = generateModifierType(scene, modifierTypes.BERRY, [ randBerryType ]) as BerryModifierType; - applyModifierTypeToPlayerPokemon(scene, pokemon, berryModType); - } - } - }); - await scene.updateModifiers(true); - - await transitionMysteryEncounterIntroVisuals(scene, true, true, 500); - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Animate berries being eaten - doGreedentEatBerries(scene); - doBerrySpritePile(scene, true); - return true; - }) - .withOptionPhase(async (scene: BattleScene) => { - // Let it have the food - // Greedent joins the team, level equal to 2 below highest party member - const level = getHighestLevelPlayerPokemon(scene, false, true).level - 2; - const greedent = new EnemyPokemon(scene, getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false); - greedent.moveset = [ new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF) ]; - greedent.passive = true; - - await transitionMysteryEncounterIntroVisuals(scene, true, true, 500); - await catchPokemon(scene, greedent, null, PokeballType.POKEBALL, false); - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .build(); - -function doGreedentSpriteSteal(scene: BattleScene) { +function doGreedentSpriteSteal() { const shakeDelay = 50; const slideDelay = 500; - const greedentSprites = scene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(1); + const greedentSprites = globalScene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(1); - scene.playSound("battle_anims/Follow Me"); - scene.tweens.chain({ + globalScene.playSound("battle_anims/Follow Me"); + globalScene.tweens.chain({ targets: greedentSprites, tweens: [ - { // Slide Greedent diagonally + { + // Slide Greedent diagonally duration: slideDelay, ease: "Cubic.easeOut", y: "+=75", x: "-=65", - scale: 1.1 + scale: 1.1, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Shake + { + // Shake duration: shakeDelay, ease: "Cubic.easeOut", yoyo: true, x: (randInt(2) > 0 ? "-=" : "+=") + 5, y: (randInt(2) > 0 ? "-=" : "+=") + 5, }, - { // Slide Greedent diagonally + { + // Slide Greedent diagonally duration: slideDelay, ease: "Cubic.easeOut", y: "-=75", x: "+=65", - scale: 1 + scale: 1, }, - { // Bounce at the end + { + // Bounce at the end duration: 300, ease: "Cubic.easeOut", yoyo: true, y: "-=20", loop: 1, - } - ] + }, + ], }); } -function doGreedentEatBerries(scene: BattleScene) { - const greedentSprites = scene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(1); +function doGreedentEatBerries() { + const greedentSprites = globalScene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(1); let index = 1; - scene.tweens.add({ + globalScene.tweens.add({ targets: greedentSprites, duration: 150, ease: "Cubic.easeOut", @@ -455,29 +488,39 @@ function doGreedentEatBerries(scene: BattleScene) { y: "-=8", loop: 5, onStart: () => { - scene.playSound("battle_anims/PRSFX- Bug Bite"); + globalScene.playSound("battle_anims/PRSFX- Bug Bite"); }, onLoop: () => { if (index % 2 === 0) { - scene.playSound("battle_anims/PRSFX- Bug Bite"); + globalScene.playSound("battle_anims/PRSFX- Bug Bite"); } index++; - } + }, }); } /** - * - * @param scene * @param isEat Default false. Will "create" pile when false, and remove pile when true. */ -function doBerrySpritePile(scene: BattleScene, isEat: boolean = false) { +function doBerrySpritePile(isEat = false) { const berryAddDelay = 150; - let animationOrder = [ "starf", "sitrus", "lansat", "salac", "apicot", "enigma", "liechi", "ganlon", "lum", "petaya", "leppa" ]; + let animationOrder = [ + "starf", + "sitrus", + "lansat", + "salac", + "apicot", + "enigma", + "liechi", + "ganlon", + "lum", + "petaya", + "leppa", + ]; if (isEat) { animationOrder = animationOrder.reverse(); } - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; animationOrder.forEach((berry, i) => { const introVisualsIndex = encounter.spriteConfigs.findIndex(config => config.spriteKey?.includes(berry)); let sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite; @@ -486,7 +529,7 @@ function doBerrySpritePile(scene: BattleScene, isEat: boolean = false) { sprite = sprites[0]; tintSprite = sprites[1]; } - scene.time.delayedCall(berryAddDelay * i + 400, () => { + globalScene.time.delayedCall(berryAddDelay * i + 400, () => { if (sprite) { sprite.setVisible(!isEat); } @@ -496,23 +539,23 @@ function doBerrySpritePile(scene: BattleScene, isEat: boolean = false) { // Animate Petaya berry falling off the pile if (berry === "petaya" && sprite && tintSprite && !isEat) { - scene.time.delayedCall(200, () => { - doBerryBounce(scene, [ sprite, tintSprite ], 30, 500); + globalScene.time.delayedCall(200, () => { + doBerryBounce([sprite, tintSprite], 30, 500); }); } }); }); } -function doBerryBounce(scene: BattleScene, berrySprites: Phaser.GameObjects.Sprite[], yd: number, baseBounceDuration: number) { +function doBerryBounce(berrySprites: Phaser.GameObjects.Sprite[], yd: number, baseBounceDuration: number) { let bouncePower = 1; let bounceYOffset = yd; const doBounce = () => { - scene.tweens.add({ + globalScene.tweens.add({ targets: berrySprites, y: "+=" + bounceYOffset, - x: { value: "+=" + (bouncePower * bouncePower * 10), ease: "Linear" }, + x: { value: "+=" + bouncePower * bouncePower * 10, ease: "Linear" }, duration: bouncePower * baseBounceDuration, ease: "Cubic.easeIn", onComplete: () => { @@ -521,16 +564,16 @@ function doBerryBounce(scene: BattleScene, berrySprites: Phaser.GameObjects.Spri if (bouncePower) { bounceYOffset = bounceYOffset * bouncePower; - scene.tweens.add({ + globalScene.tweens.add({ targets: berrySprites, y: "-=" + bounceYOffset, - x: { value: "+=" + (bouncePower * bouncePower * 10), ease: "Linear" }, + x: { value: "+=" + bouncePower * bouncePower * 10, ease: "Linear" }, duration: bouncePower * baseBounceDuration, ease: "Cubic.easeOut", - onComplete: () => doBounce() + onComplete: () => doBounce(), }); } - } + }, }); }; diff --git a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts index 1e20b73e351..b66052cfd16 100644 --- a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts +++ b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts @@ -1,11 +1,21 @@ -import { generateModifierType, leaveEncounterWithoutBattle, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + leaveEncounterWithoutBattle, + setEncounterExp, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { AbilityRequirement, CombinationPokemonRequirement, MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { + AbilityRequirement, + CombinationPokemonRequirement, + MoveRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { getHighestStatTotalPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { EXTORTION_ABILITIES, EXTORTION_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import { getPokemonSpecies } from "#app/data/pokemon-species"; @@ -32,153 +42,152 @@ const MONEY_MAXIMUM_MULTIPLIER = 30; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3808 | GitHub Issue #3808} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const AnOfferYouCantRefuseEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party - .withIntroSpriteConfigs([ - { - spriteKey: Species.LIEPARD.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: 0, - y: -4, - yShadow: -4 - }, - { - spriteKey: "rich_kid_m", - fileRoot: "trainer", - hasShadow: true, - x: 2, - y: 5, - yShadow: 5 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const pokemon = getHighestStatTotalPlayerPokemon(scene, true, true); +export const AnOfferYouCantRefuseEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party + .withIntroSpriteConfigs([ + { + spriteKey: Species.LIEPARD.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 0, + y: -4, + yShadow: -4, + }, + { + spriteKey: "rich_kid_m", + fileRoot: "trainer", + hasShadow: true, + x: 2, + y: 5, + yShadow: 5, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const pokemon = getHighestStatTotalPlayerPokemon(true, true); - const baseSpecies = pokemon.getSpeciesForm().getRootSpeciesId(); - const starterValue: number = speciesStarterCosts[baseSpecies] ?? 1; - const multiplier = Math.max(MONEY_MAXIMUM_MULTIPLIER / 10 * starterValue, MONEY_MINIMUM_MULTIPLIER); - const price = scene.getWaveMoneyAmount(multiplier); + const baseSpecies = pokemon.getSpeciesForm().getRootSpeciesId(); + const starterValue: number = speciesStarterCosts[baseSpecies] ?? 1; + const multiplier = Math.max((MONEY_MAXIMUM_MULTIPLIER / 10) * starterValue, MONEY_MINIMUM_MULTIPLIER); + const price = globalScene.getWaveMoneyAmount(multiplier); - encounter.setDialogueToken("strongestPokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("price", price.toString()); + encounter.setDialogueToken("strongestPokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("price", price.toString()); - // Store pokemon and price - encounter.misc = { - pokemon: pokemon, - price: price - }; + // Store pokemon and price + encounter.misc = { + pokemon: pokemon, + price: price, + }; - // If player meets the combo OR requirements for option 2, populate the token - const opt2Req = encounter.options[1].primaryPokemonRequirements[0]; - if (opt2Req.meetsRequirement(scene)) { - const abilityToken = encounter.dialogueTokens["option2PrimaryAbility"]; - const moveToken = encounter.dialogueTokens["option2PrimaryMove"]; - if (abilityToken) { - encounter.setDialogueToken("moveOrAbility", abilityToken); - } else if (moveToken) { - encounter.setDialogueToken("moveOrAbility", moveToken); - } + // If player meets the combo OR requirements for option 2, populate the token + const opt2Req = encounter.options[1].primaryPokemonRequirements[0]; + if (opt2Req.meetsRequirement()) { + const abilityToken = encounter.dialogueTokens["option2PrimaryAbility"]; + const moveToken = encounter.dialogueTokens["option2PrimaryMove"]; + if (abilityToken) { + encounter.setDialogueToken("moveOrAbility", abilityToken); + } else if (moveToken) { + encounter.setDialogueToken("moveOrAbility", moveToken); } + } - const shinyCharm = generateModifierType(scene, modifierTypes.SHINY_CHARM); - encounter.setDialogueToken("itemName", shinyCharm?.name ?? i18next.t("modifierType:ModifierType.SHINY_CHARM.name")); - encounter.setDialogueToken("liepardName", getPokemonSpecies(Species.LIEPARD).getName()); + const shinyCharm = generateModifierType(modifierTypes.SHINY_CHARM); + encounter.setDialogueToken("itemName", shinyCharm?.name ?? i18next.t("modifierType:ModifierType.SHINY_CHARM.name")); + encounter.setDialogueToken("liepardName", getPokemonSpecies(Species.LIEPARD).getName()); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - speaker: `${namespace}:speaker`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Update money and remove pokemon from party - updatePlayerMoney(scene, encounter.misc.price); - scene.removePokemonFromPlayerParty(encounter.misc.pokemon); - return true; - }) - .withOptionPhase(async (scene: BattleScene) => { - // Give the player a Shiny Charm - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.SHINY_CHARM)); - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement( - CombinationPokemonRequirement.Some( - new MoveRequirement(EXTORTION_MOVES, true), - new AbilityRequirement(EXTORTION_ABILITIES, true) - ) - ) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.tooltip_disabled`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - // Extort the rich kid for money - const encounter = scene.currentBattle.mysteryEncounter!; - // Update money and remove pokemon from party - updatePlayerMoney(scene, encounter.misc.price); - - setEncounterExp(scene, encounter.options[1].primaryPokemon!.id, getPokemonSpecies(Species.LIEPARD).baseExp, true); - - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + speaker: `${namespace}:speaker`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Update money and remove pokemon from party + updatePlayerMoney(encounter.misc.price); + globalScene.removePokemonFromPlayerParty(encounter.misc.pokemon); + return true; + }) + .withOptionPhase(async () => { + // Give the player a Shiny Charm + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.SHINY_CHARM)); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + new MoveRequirement(EXTORTION_MOVES, true), + new AbilityRequirement(EXTORTION_ABILITIES, true), + ), + ) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + disabledButtonTooltip: `${namespace}:option.2.tooltip_disabled`, selected: [ { speaker: `${namespace}:speaker`, - text: `${namespace}:option.3.selected`, + text: `${namespace}:option.2.selected`, }, ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + }) + .withOptionPhase(async () => { + // Extort the rich kid for money + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Update money and remove pokemon from party + updatePlayerMoney(encounter.misc.price); + + setEncounterExp(encounter.options[1].primaryPokemon!.id, getPokemonSpecies(Species.LIEPARD).baseExp, true); + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 095f8a8473b..94e27e32773 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -1,29 +1,35 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { - EnemyPartyConfig, generateModifierType, generateModifierTypeOption, + generateModifierType, + generateModifierTypeOption, + getRandomEncounterSpecies, initBattleWithEnemyConfig, - leaveEncounterWithoutBattle, setEncounterExp, - setEncounterRewards + leaveEncounterWithoutBattle, + setEncounterExp, + setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon, { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; -import { - BerryModifierType, - getPartyLuckValue, - ModifierPoolType, - ModifierTypeOption, modifierTypes, - regenerateModifierPoolThresholds, -} from "#app/modifier/modifier-type"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import type { BerryModifierType, ModifierTypeOption } from "#app/modifier/modifier-type"; +import { ModifierPoolType, modifierTypes, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { TrainerSlot } from "#app/data/trainer-config"; -import { applyModifierTypeToPlayerPokemon, getEncounterPokemonLevelForWave, getHighestStatPlayerPokemon, getSpriteKeysFromPokemon, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + applyModifierTypeToPlayerPokemon, + getEncounterPokemonLevelForWave, + getHighestStatPlayerPokemon, + getSpriteKeysFromPokemon, + STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import PokemonData from "#app/system/pokemon-data"; import { BerryModifier } from "#app/modifier/modifier"; import i18next from "#app/plugins/i18n"; @@ -40,239 +46,296 @@ const namespace = "mysteryEncounters/berriesAbound"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3810 | GitHub Issue #3810} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const BerriesAboundEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.BERRIES_ABOUND) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const BerriesAboundEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.BERRIES_ABOUND, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - const level = getEncounterPokemonLevelForWave(scene, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); - encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + // Calculate boss mon + const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); + const bossPokemon = getRandomEncounterSpecies(level, true); + encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { level: level, - species: bossSpecies, + species: bossPokemon.species, dataSource: new PokemonData(bossPokemon), - isBoss: true - }], - }; - encounter.enemyPartyConfigs = [ config ]; - - // Calculate the number of extra berries that player receives - // 10-40: 2, 40-120: 4, 120-160: 5, 160-180: 7 - const numBerries = - scene.currentBattle.waveIndex > 160 ? 7 - : scene.currentBattle.waveIndex > 120 ? 5 - : scene.currentBattle.waveIndex > 40 ? 4 : 2; - regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); - encounter.misc = { numBerries }; - - const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); - encounter.spriteConfigs = [ - { - spriteKey: "berries_abound_bush", - fileRoot: "mystery-encounters", - x: 25, - y: -6, - yShadow: -7, - disableAnimation: true, - hasShadow: true + isBoss: true, }, - { - spriteKey: spriteKey, - fileRoot: fileRoot, - hasShadow: true, - tint: 0.25, - x: -5, - repeat: true, - isPokemon: true - } - ]; + ], + }; + encounter.enemyPartyConfigs = [config]; - // Get fastest party pokemon for option 2 - const fastestPokemon = getHighestStatPlayerPokemon(scene, PERMANENT_STATS[Stat.SPD], true, false); - encounter.misc.fastestPokemon = fastestPokemon; - encounter.misc.enemySpeed = bossPokemon.getStat(Stat.SPD); - encounter.setDialogueToken("fastestPokemon", fastestPokemon.getNameToRender()); + // Calculate the number of extra berries that player receives + // 10-40: 2, 40-120: 4, 120-160: 5, 160-180: 7 + const numBerries = + globalScene.currentBattle.waveIndex > 160 + ? 7 + : globalScene.currentBattle.waveIndex > 120 + ? 5 + : globalScene.currentBattle.waveIndex > 40 + ? 4 + : 2; + regenerateModifierPoolThresholds(globalScene.getPlayerParty(), ModifierPoolType.PLAYER, 0); + encounter.misc = { numBerries }; - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); + encounter.spriteConfigs = [ { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], + spriteKey: "berries_abound_bush", + fileRoot: "mystery-encounters", + x: 25, + y: -6, + yShadow: -7, + disableAnimation: true, + hasShadow: true, }, - async (scene: BattleScene) => { - // Pick battle - const encounter = scene.currentBattle.mysteryEncounter!; - const numBerries = encounter.misc.numBerries; + { + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + tint: 0.25, + x: -5, + repeat: true, + isPokemon: true, + isShiny: bossPokemon.shiny, + variant: bossPokemon.variant, + }, + ]; - const doBerryRewards = () => { - const berryText = i18next.t(`${namespace}:berries`); + // Get fastest party pokemon for option 2 + const fastestPokemon = getHighestStatPlayerPokemon(PERMANENT_STATS[Stat.SPD], true, false); + encounter.misc.fastestPokemon = fastestPokemon; + encounter.misc.enemySpeed = bossPokemon.getStat(Stat.SPD); + encounter.setDialogueToken("fastestPokemon", fastestPokemon.getNameToRender()); - scene.playSound("item_fanfare"); - queueEncounterMessage(scene, i18next.t("battle:rewardGainCount", { modifierName: berryText, count: numBerries })); + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + const numBerries = encounter.misc.numBerries; - // Generate a random berry and give it to the first Pokemon with room for it - for (let i = 0; i < numBerries; i++) { - tryGiveBerry(scene); - } - }; + const doBerryRewards = () => { + const berryText = i18next.t(`${namespace}:berries`); + + globalScene.playSound("item_fanfare"); + queueEncounterMessage( + i18next.t("battle:rewardGainCount", { + modifierName: berryText, + count: numBerries, + }), + ); + + // Generate a random berry and give it to the first Pokemon with room for it + for (let i = 0; i < numBerries; i++) { + tryGiveBerry(); + } + }; + + const shopOptions: ModifierTypeOption[] = []; + for (let i = 0; i < 5; i++) { + // Generate shop berries + const mod = generateModifierTypeOption(modifierTypes.BERRY); + if (mod) { + shopOptions.push(mod); + } + } + + setEncounterRewards( + { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, + undefined, + doBerryRewards, + ); + await initBattleWithEnemyConfig(globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + }) + .withOptionPhase(async () => { + // Pick race for berries + const encounter = globalScene.currentBattle.mysteryEncounter!; + const fastestPokemon: PlayerPokemon = encounter.misc.fastestPokemon; + const enemySpeed: number = encounter.misc.enemySpeed; + const speedDiff = fastestPokemon.getStat(Stat.SPD) / (enemySpeed * 1.1); + const numBerries: number = encounter.misc.numBerries; const shopOptions: ModifierTypeOption[] = []; for (let i = 0; i < 5; i++) { // Generate shop berries - const mod = generateModifierTypeOption(scene, modifierTypes.BERRY); + const mod = generateModifierTypeOption(modifierTypes.BERRY); if (mod) { shopOptions.push(mod); } } - setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doBerryRewards); - await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip` - }) - .withOptionPhase(async (scene: BattleScene) => { - // Pick race for berries - const encounter = scene.currentBattle.mysteryEncounter!; - const fastestPokemon: PlayerPokemon = encounter.misc.fastestPokemon; - const enemySpeed: number = encounter.misc.enemySpeed; - const speedDiff = fastestPokemon.getStat(Stat.SPD) / (enemySpeed * 1.1); - const numBerries: number = encounter.misc.numBerries; + if (speedDiff < 1) { + // Caught and attacked by boss, gets +1 to all stats at start of fight + const doBerryRewards = () => { + const berryText = i18next.t(`${namespace}:berries`); - const shopOptions: ModifierTypeOption[] = []; - for (let i = 0; i < 5; i++) { - // Generate shop berries - const mod = generateModifierTypeOption(scene, modifierTypes.BERRY); - if (mod) { - shopOptions.push(mod); + globalScene.playSound("item_fanfare"); + queueEncounterMessage( + i18next.t("battle:rewardGainCount", { + modifierName: berryText, + count: numBerries, + }), + ); + + // Generate a random berry and give it to the first Pokemon with room for it + for (let i = 0; i < numBerries; i++) { + tryGiveBerry(); } + }; + + // Defense/Spd buffs below wave 50, +1 to all stats otherwise + const statChangesForBattle: ( + | Stat.ATK + | Stat.DEF + | Stat.SPATK + | Stat.SPDEF + | Stat.SPD + | Stat.ACC + | Stat.EVA + )[] = + globalScene.currentBattle.waveIndex < 50 + ? [Stat.DEF, Stat.SPDEF, Stat.SPD] + : [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; + + const config = globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; + config.pokemonConfigs![0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + config.pokemonConfigs![0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { + queueEncounterMessage(`${namespace}:option.2.boss_enraged`); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1), + ); + }; + setEncounterRewards( + { + guaranteedModifierTypeOptions: shopOptions, + fillRemaining: false, + }, + undefined, + doBerryRewards, + ); + await showEncounterText(`${namespace}:option.2.selected_bad`); + await initBattleWithEnemyConfig(config); + return; + } + // Gains 1 berry for every 10% faster the player's pokemon is than the enemy, up to a max of numBerries, minimum of 2 + const numBerriesGrabbed = Math.max(Math.min(Math.round((speedDiff - 1) / 0.08), numBerries), 2); + encounter.setDialogueToken("numBerries", String(numBerriesGrabbed)); + const doFasterBerryRewards = () => { + const berryText = i18next.t(`${namespace}:berries`); + + globalScene.playSound("item_fanfare"); + queueEncounterMessage( + i18next.t("battle:rewardGainCount", { + modifierName: berryText, + count: numBerriesGrabbed, + }), + ); + + // Generate a random berry and give it to the first Pokemon with room for it (trying to give to fastest first) + for (let i = 0; i < numBerriesGrabbed; i++) { + tryGiveBerry(fastestPokemon); } + }; - if (speedDiff < 1) { - // Caught and attacked by boss, gets +1 to all stats at start of fight - const doBerryRewards = () => { - const berryText = i18next.t(`${namespace}:berries`); - - scene.playSound("item_fanfare"); - queueEncounterMessage(scene, i18next.t("battle:rewardGainCount", { modifierName: berryText, count: numBerries })); - - // Generate a random berry and give it to the first Pokemon with room for it - for (let i = 0; i < numBerries; i++) { - tryGiveBerry(scene); - } - }; - - // Defense/Spd buffs below wave 50, +1 to all stats otherwise - const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = scene.currentBattle.waveIndex < 50 ? - [ Stat.DEF, Stat.SPDEF, Stat.SPD ] : - [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; - - const config = scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; - config.pokemonConfigs![0].tags = [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ]; - config.pokemonConfigs![0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:option.2.boss_enraged`); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); - }; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doBerryRewards); - await showEncounterText(scene, `${namespace}:option.2.selected_bad`); - await initBattleWithEnemyConfig(scene, config); - return; - } else { - // Gains 1 berry for every 10% faster the player's pokemon is than the enemy, up to a max of numBerries, minimum of 2 - const numBerriesGrabbed = Math.max(Math.min(Math.round((speedDiff - 1) / 0.08), numBerries), 2); - encounter.setDialogueToken("numBerries", String(numBerriesGrabbed)); - const doFasterBerryRewards = () => { - const berryText = i18next.t(`${namespace}:berries`); - - scene.playSound("item_fanfare"); - queueEncounterMessage(scene, i18next.t("battle:rewardGainCount", { modifierName: berryText, count: numBerriesGrabbed })); - - // Generate a random berry and give it to the first Pokemon with room for it (trying to give to fastest first) - for (let i = 0; i < numBerriesGrabbed; i++) { - tryGiveBerry(scene, fastestPokemon); - } - }; - - setEncounterExp(scene, fastestPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); - setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doFasterBerryRewards); - await showEncounterText(scene, `${namespace}:option.2.selected`); - leaveEncounterWithoutBattle(scene); - } - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ + setEncounterExp(fastestPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); + setEncounterRewards( { - text: `${namespace}:option.3.selected`, + guaranteedModifierTypeOptions: shopOptions, + fillRemaining: false, }, - ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + undefined, + doFasterBerryRewards, + ); + await showEncounterText(`${namespace}:option.2.selected`); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); -function tryGiveBerry(scene: BattleScene, prioritizedPokemon?: PlayerPokemon) { - const berryType = randSeedInt(Object.keys(BerryType).filter(s => !isNaN(Number(s))).length) as BerryType; - const berry = generateModifierType(scene, modifierTypes.BERRY, [ berryType ]) as BerryModifierType; +function tryGiveBerry(prioritizedPokemon?: PlayerPokemon) { + const berryType = randSeedInt(Object.keys(BerryType).filter(s => !Number.isNaN(Number(s))).length) as BerryType; + const berry = generateModifierType(modifierTypes.BERRY, [berryType]) as BerryModifierType; - const party = scene.getParty(); + const party = globalScene.getPlayerParty(); // Will try to apply to prioritized pokemon first, then do normal application method if it fails if (prioritizedPokemon) { - const heldBerriesOfType = scene.findModifier(m => m instanceof BerryModifier - && m.pokemonId === prioritizedPokemon.id && (m as BerryModifier).berryType === berryType, true) as BerryModifier; + const heldBerriesOfType = globalScene.findModifier( + m => + m instanceof BerryModifier && + m.pokemonId === prioritizedPokemon.id && + (m as BerryModifier).berryType === berryType, + true, + ) as BerryModifier; - if (!heldBerriesOfType || heldBerriesOfType.getStackCount() < heldBerriesOfType.getMaxStackCount(scene)) { - applyModifierTypeToPlayerPokemon(scene, prioritizedPokemon, berry); + if (!heldBerriesOfType || heldBerriesOfType.getStackCount() < heldBerriesOfType.getMaxStackCount()) { + applyModifierTypeToPlayerPokemon(prioritizedPokemon, berry); return; } } // Iterate over the party until berry was successfully given for (const pokemon of party) { - const heldBerriesOfType = scene.findModifier(m => m instanceof BerryModifier - && m.pokemonId === pokemon.id && (m as BerryModifier).berryType === berryType, true) as BerryModifier; + const heldBerriesOfType = globalScene.findModifier( + m => m instanceof BerryModifier && m.pokemonId === pokemon.id && (m as BerryModifier).berryType === berryType, + true, + ) as BerryModifier; - if (!heldBerriesOfType || heldBerriesOfType.getStackCount() < heldBerriesOfType.getMaxStackCount(scene)) { - applyModifierTypeToPlayerPokemon(scene, pokemon, berry); + if (!heldBerriesOfType || heldBerriesOfType.getStackCount() < heldBerriesOfType.getMaxStackCount()) { + applyModifierTypeToPlayerPokemon(pokemon, berry); return; } } diff --git a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts index e24eadb56c7..15cba1fa103 100644 --- a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -1,5 +1,6 @@ +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { - EnemyPartyConfig, generateModifierType, + generateModifierType, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, @@ -17,38 +18,42 @@ import { } from "#app/data/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { TrainerType } from "#enums/trainer-type"; import { Species } from "#enums/species"; -import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import { getEncounterText, showEncounterDialogue } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { Moves } from "#enums/moves"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { AttackTypeBoosterHeldItemTypeRequirement, CombinationPokemonRequirement, HeldItemRequirement, - TypeRequirement + TypeRequirement, } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { Type } from "#app/data/type"; -import { AttackTypeBoosterModifierType, ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; +import { PokemonType } from "#enums/pokemon-type"; +import type { AttackTypeBoosterModifierType, ModifierTypeOption } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { AttackTypeBoosterModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, GigantamaxAccessModifier, MegaEvolutionAccessModifier, - PokemonHeldItemModifier } from "#app/modifier/modifier"; import i18next from "i18next"; import MoveInfoOverlay from "#app/ui/move-info-overlay"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; @@ -79,7 +84,7 @@ const POOL_1_POKEMON = [ Species.CHARJABUG, Species.RIBOMBEE, Species.SPIDOPS, - Species.LOKIX + Species.LOKIX, ]; const POOL_2_POKEMON = [ @@ -108,26 +113,26 @@ const POOL_2_POKEMON = [ Species.KLEAVOR, ]; -const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ +const POOL_3_POKEMON: { species: Species; formIndex?: number }[] = [ { species: Species.PINSIR, - formIndex: 1 + formIndex: 1, }, { species: Species.SCIZOR, - formIndex: 1 + formIndex: 1, }, { species: Species.HERACROSS, - formIndex: 1 + formIndex: 1, }, { species: Species.ORBEETLE, - formIndex: 1 + formIndex: 1, }, { species: Species.CENTISKORCH, - formIndex: 1 + formIndex: 1, }, { species: Species.DURANT, @@ -140,35 +145,19 @@ const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ }, ]; -const POOL_4_POKEMON = [ - Species.GENESECT, - Species.SLITHER_WING, - Species.BUZZWOLE, - Species.PHEROMOSA -]; +const POOL_4_POKEMON = [Species.GENESECT, Species.SLITHER_WING, Species.BUZZWOLE, Species.PHEROMOSA]; const PHYSICAL_TUTOR_MOVES = [ Moves.MEGAHORN, Moves.X_SCISSOR, Moves.ATTACK_ORDER, Moves.PIN_MISSILE, - Moves.FIRST_IMPRESSION + Moves.FIRST_IMPRESSION, ]; -const SPECIAL_TUTOR_MOVES = [ - Moves.SILVER_WIND, - Moves.BUG_BUZZ, - Moves.SIGNAL_BEAM, - Moves.POLLEN_PUFF -]; +const SPECIAL_TUTOR_MOVES = [Moves.SILVER_WIND, Moves.BUG_BUZZ, Moves.SIGNAL_BEAM, Moves.POLLEN_PUFF]; -const STATUS_TUTOR_MOVES = [ - Moves.STRING_SHOT, - Moves.STICKY_WEB, - Moves.SILK_TRAP, - Moves.RAGE_POWDER, - Moves.HEAL_ORDER -]; +const STATUS_TUTOR_MOVES = [Moves.STRING_SHOT, Moves.STICKY_WEB, Moves.SILK_TRAP, Moves.RAGE_POWDER, Moves.HEAL_ORDER]; const MISC_TUTOR_MOVES = [ Moves.BUG_BITE, @@ -177,166 +166,172 @@ const MISC_TUTOR_MOVES = [ Moves.QUIVER_DANCE, Moves.TAIL_GLOW, Moves.INFESTATION, - Moves.U_TURN + Moves.U_TURN, ]; /** * Wave breakpoints that determine how strong to make the Bug-Type Superfan's team */ -const WAVE_LEVEL_BREAKPOINTS = [ 30, 50, 70, 100, 120, 140, 160 ]; +const WAVE_LEVEL_BREAKPOINTS = [30, 50, 70, 100, 120, 140, 160]; /** * Bug Type Superfan encounter. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3820 | GitHub Issue #3820} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const BugTypeSuperfanEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.BUG_TYPE_SUPERFAN) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withPrimaryPokemonRequirement( - CombinationPokemonRequirement.Some( - // Must have at least 1 Bug type on team, OR have a bug item somewhere on the team - new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), - new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1), - new TypeRequirement(Type.BUG, false, 1) - ) - ) - .withMaxAllowedEncounters(1) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withIntroSpriteConfigs([]) // These are set in onInit() - .withAutoHideIntroVisuals(false) - .withIntroDialogue([ +export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.BUG_TYPE_SUPERFAN, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + // Must have at least 1 Bug type on team, OR have a bug item somewhere on the team + new HeldItemRequirement(["BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier"], 1), + new AttackTypeBoosterHeldItemTypeRequirement(PokemonType.BUG, 1), + new TypeRequirement(PokemonType.BUG, false, 1), + ), + ) + .withMaxAllowedEncounters(1) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withIntroSpriteConfigs([]) // These are set in onInit() + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Calculates what trainers are available for battle in the encounter + + // Bug type superfan trainer config + const config = getTrainerConfigForWave(globalScene.currentBattle.waveIndex); + const spriteKey = config.getSpriteKey(); + encounter.enemyPartyConfigs.push({ + trainerConfig: config, + female: true, + }); + + let beedrillKeys: { spriteKey: string; fileRoot: string }, butterfreeKeys: { spriteKey: string; fileRoot: string }; + if (globalScene.currentBattle.waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) { + beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false); + butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false); + } else { + // Mega Beedrill/Gmax Butterfree + beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false, 1); + butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false, 1); + } + + encounter.spriteConfigs = [ { - text: `${namespace}:intro`, + spriteKey: beedrillKeys.spriteKey, + fileRoot: beedrillKeys.fileRoot, + hasShadow: true, + repeat: true, + isPokemon: true, + x: -30, + tint: 0.15, + y: -4, + yShadow: -4, }, { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, + spriteKey: butterfreeKeys.spriteKey, + fileRoot: butterfreeKeys.fileRoot, + hasShadow: true, + repeat: true, + isPokemon: true, + x: 30, + tint: 0.15, + y: -4, + yShadow: -4, }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Calculates what trainers are available for battle in the encounter - - // Bug type superfan trainer config - const config = getTrainerConfigForWave(scene.currentBattle.waveIndex); - const spriteKey = config.getSpriteKey(); - encounter.enemyPartyConfigs.push({ - trainerConfig: config, - female: true, - }); - - let beedrillKeys: { spriteKey: string, fileRoot: string }, butterfreeKeys: { spriteKey: string, fileRoot: string }; - if (scene.currentBattle.waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) { - beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false); - butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false); - } else { - // Mega Beedrill/Gmax Butterfree - beedrillKeys = getSpriteKeysFromSpecies(Species.BEEDRILL, false, 1); - butterfreeKeys = getSpriteKeysFromSpecies(Species.BUTTERFREE, false, 1); - } - - encounter.spriteConfigs = [ - { - spriteKey: beedrillKeys.spriteKey, - fileRoot: beedrillKeys.fileRoot, - hasShadow: true, - repeat: true, - isPokemon: true, - x: -30, - tint: 0.15, - y: -4, - yShadow: -4 - }, - { - spriteKey: butterfreeKeys.spriteKey, - fileRoot: butterfreeKeys.fileRoot, - hasShadow: true, - repeat: true, - isPokemon: true, - x: 30, - tint: 0.15, - y: -4, - yShadow: -4 - }, - { - spriteKey: spriteKey, - fileRoot: "trainer", - hasShadow: true, - x: 4, - y: 7, - yShadow: 7 - }, - ]; - - const requiredItems = [ - generateModifierType(scene, modifierTypes.QUICK_CLAW), - generateModifierType(scene, modifierTypes.GRIP_CLAW), - generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.BUG ]), - ]; - - const requiredItemString = requiredItems.map(m => m?.name ?? "unknown").join("/"); - encounter.setDialogueToken("requiredBugItems", requiredItemString); - - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.1.selected`, - }, - ], + spriteKey: spriteKey, + fileRoot: "trainer", + hasShadow: true, + x: 4, + y: 7, + yShadow: 7, }, - async (scene: BattleScene) => { - // Select battle the bug trainer - const encounter = scene.currentBattle.mysteryEncounter!; - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + ]; - // Init the moves available for tutor - const moveTutorOptions: PokemonMove[] = []; - moveTutorOptions.push(new PokemonMove(PHYSICAL_TUTOR_MOVES[randSeedInt(PHYSICAL_TUTOR_MOVES.length)])); - moveTutorOptions.push(new PokemonMove(SPECIAL_TUTOR_MOVES[randSeedInt(SPECIAL_TUTOR_MOVES.length)])); - moveTutorOptions.push(new PokemonMove(STATUS_TUTOR_MOVES[randSeedInt(STATUS_TUTOR_MOVES.length)])); - moveTutorOptions.push(new PokemonMove(MISC_TUTOR_MOVES[randSeedInt(MISC_TUTOR_MOVES.length)])); - encounter.misc = { - moveTutorOptions - }; + const requiredItems = [ + generateModifierType(modifierTypes.QUICK_CLAW), + generateModifierType(modifierTypes.GRIP_CLAW), + generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [PokemonType.BUG]), + ]; - // Assigns callback that teaches move before continuing to rewards - encounter.onRewards = doBugTypeMoveTutor; + const requiredItemString = requiredItems.map(m => m?.name ?? "unknown").join("/"); + encounter.setDialogueToken("requiredBugItems", requiredItemString); - setEncounterRewards(scene, { fillRemaining: true }); - await transitionMysteryEncounterIntroVisuals(scene, true, true); - await initBattleWithEnemyConfig(scene, config); - } - ) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withPrimaryPokemonRequirement(new TypeRequirement(Type.BUG, false, 1)) // Must have 1 Bug type on team + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Select battle the bug trainer + const encounter = globalScene.currentBattle.mysteryEncounter!; + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + + // Init the moves available for tutor + const moveTutorOptions: PokemonMove[] = []; + moveTutorOptions.push(new PokemonMove(PHYSICAL_TUTOR_MOVES[randSeedInt(PHYSICAL_TUTOR_MOVES.length)])); + moveTutorOptions.push(new PokemonMove(SPECIAL_TUTOR_MOVES[randSeedInt(SPECIAL_TUTOR_MOVES.length)])); + moveTutorOptions.push(new PokemonMove(STATUS_TUTOR_MOVES[randSeedInt(STATUS_TUTOR_MOVES.length)])); + moveTutorOptions.push(new PokemonMove(MISC_TUTOR_MOVES[randSeedInt(MISC_TUTOR_MOVES.length)])); + encounter.misc = { + moveTutorOptions, + }; + + // Assigns callback that teaches move before continuing to rewards + encounter.onRewards = doBugTypeMoveTutor; + + setEncounterRewards({ fillRemaining: true }); + await transitionMysteryEncounterIntroVisuals(true, true); + await initBattleWithEnemyConfig(config); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new TypeRequirement(PokemonType.BUG, false, 1)) // Must have 1 Bug type on team .withDialogue({ buttonLabel: `${namespace}:option.2.label`, buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip` + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, }) - .withPreOptionPhase(async (scene: BattleScene) => { + .withPreOptionPhase(async () => { // Player shows off their bug types - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; // Player gets different rewards depending on the number of bug types they have - const numBugTypes = scene.getParty().filter(p => p.isOfType(Type.BUG, true)).length; - const numBugTypesText = i18next.t(`${namespace}:numBugTypes`, { count: numBugTypes }); + const numBugTypes = globalScene.getPlayerParty().filter(p => p.isOfType(PokemonType.BUG, true)).length; + const numBugTypesText = i18next.t(`${namespace}:numBugTypes`, { + count: numBugTypes, + }); encounter.setDialogueToken("numBugTypes", numBugTypesText); if (numBugTypes < 2) { - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.SUPER_LURE, modifierTypes.GREAT_BALL ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.SUPER_LURE, modifierTypes.GREAT_BALL], + fillRemaining: false, + }); encounter.selectedOption!.dialogue!.selected = [ { speaker: `${namespace}:speaker`, @@ -344,7 +339,10 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = }, ]; } else if (numBugTypes < 4) { - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.QUICK_CLAW, modifierTypes.MAX_LURE, modifierTypes.ULTRA_BALL ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.QUICK_CLAW, modifierTypes.MAX_LURE, modifierTypes.ULTRA_BALL], + fillRemaining: false, + }); encounter.selectedOption!.dialogue!.selected = [ { speaker: `${namespace}:speaker`, @@ -352,7 +350,10 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = }, ]; } else if (numBugTypes < 6) { - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.GRIP_CLAW, modifierTypes.MAX_LURE, modifierTypes.ROGUE_BALL ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.GRIP_CLAW, modifierTypes.MAX_LURE, modifierTypes.ROGUE_BALL], + fillRemaining: false, + }); encounter.selectedOption!.dialogue!.selected = [ { speaker: `${namespace}:speaker`, @@ -362,28 +363,28 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = } else { // If the player has any evolution/form change items that are valid for their party, // spawn one of those items in addition to Dynamax Band, Mega Band, and Master Ball - const modifierOptions: ModifierTypeOption[] = [ generateModifierTypeOption(scene, modifierTypes.MASTER_BALL)! ]; + const modifierOptions: ModifierTypeOption[] = [generateModifierTypeOption(modifierTypes.MASTER_BALL)!]; const specialOptions: ModifierTypeOption[] = []; - if (!scene.findModifier(m => m instanceof MegaEvolutionAccessModifier)) { - modifierOptions.push(generateModifierTypeOption(scene, modifierTypes.MEGA_BRACELET)!); + if (!globalScene.findModifier(m => m instanceof MegaEvolutionAccessModifier)) { + modifierOptions.push(generateModifierTypeOption(modifierTypes.MEGA_BRACELET)!); } - if (!scene.findModifier(m => m instanceof GigantamaxAccessModifier)) { - modifierOptions.push(generateModifierTypeOption(scene, modifierTypes.DYNAMAX_BAND)!); + if (!globalScene.findModifier(m => m instanceof GigantamaxAccessModifier)) { + modifierOptions.push(generateModifierTypeOption(modifierTypes.DYNAMAX_BAND)!); } - const nonRareEvolutionModifier = generateModifierTypeOption(scene, modifierTypes.EVOLUTION_ITEM); + const nonRareEvolutionModifier = generateModifierTypeOption(modifierTypes.EVOLUTION_ITEM); if (nonRareEvolutionModifier) { specialOptions.push(nonRareEvolutionModifier); } - const rareEvolutionModifier = generateModifierTypeOption(scene, modifierTypes.RARE_EVOLUTION_ITEM); + const rareEvolutionModifier = generateModifierTypeOption(modifierTypes.RARE_EVOLUTION_ITEM); if (rareEvolutionModifier) { specialOptions.push(rareEvolutionModifier); } - const formChangeModifier = generateModifierTypeOption(scene, modifierTypes.FORM_CHANGE_ITEM); + const formChangeModifier = generateModifierTypeOption(modifierTypes.FORM_CHANGE_ITEM); if (formChangeModifier) { specialOptions.push(formChangeModifier); } - const rareFormChangeModifier = generateModifierTypeOption(scene, modifierTypes.RARE_FORM_CHANGE_ITEM); + const rareFormChangeModifier = generateModifierTypeOption(modifierTypes.RARE_FORM_CHANGE_ITEM); if (rareFormChangeModifier) { specialOptions.push(rareFormChangeModifier); } @@ -391,7 +392,10 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = modifierOptions.push(specialOptions[randSeedInt(specialOptions.length)]); } - setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifierOptions, fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeOptions: modifierOptions, + fillRemaining: false, + }); encounter.selectedOption!.dialogue!.selected = [ { speaker: `${namespace}:speaker`, @@ -400,19 +404,20 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = ]; } }) - .withOptionPhase(async (scene: BattleScene) => { + .withOptionPhase(async () => { // Player shows off their bug types - leaveEncounterWithoutBattle(scene); + leaveEncounterWithoutBattle(); }) - .build()) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withPrimaryPokemonRequirement( CombinationPokemonRequirement.Some( // Meets one or both of the below reqs - new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), - new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1) - ) + new HeldItemRequirement(["BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier"], 1), + new AttackTypeBoosterHeldItemTypeRequirement(PokemonType.BUG, 1), + ), ) .withDialogue({ buttonLabel: `${namespace}:option.3.label`, @@ -429,16 +434,19 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = ], secondOptionPrompt: `${namespace}:option.3.select_prompt`, }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; const onPokemonSelected = (pokemon: PlayerPokemon) => { // Get Pokemon held items and filter for valid ones const validItems = pokemon.getHeldItems().filter(item => { - return (item instanceof BypassSpeedChanceModifier || - item instanceof ContactHeldItemTransferChanceModifier || - (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === Type.BUG)) && - item.isTransferable; + return ( + (item instanceof BypassSpeedChanceModifier || + item instanceof ContactHeldItemTransferChanceModifier || + (item instanceof AttackTypeBoosterModifier && + (item.type as AttackTypeBoosterModifierType).moveType === PokemonType.BUG)) && + item.isTransferable + ); }); return validItems.map((modifier: PokemonHeldItemModifier) => { @@ -461,43 +469,48 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = const selectableFilter = (pokemon: Pokemon) => { // If pokemon has valid item, it can be selected const hasValidItem = pokemon.getHeldItems().some(item => { - return item instanceof BypassSpeedChanceModifier || + return ( + item instanceof BypassSpeedChanceModifier || item instanceof ContactHeldItemTransferChanceModifier || - (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === Type.BUG); + (item instanceof AttackTypeBoosterModifier && + (item.type as AttackTypeBoosterModifierType).moveType === PokemonType.BUG) + ); }); if (!hasValidItem) { - return getEncounterText(scene, `${namespace}:option.3.invalid_selection`) ?? null; + return getEncounterText(`${namespace}:option.3.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; const modifier = encounter.misc.chosenModifier; + const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; - // Remove the modifier if its stacks go to 0 - modifier.stackCount -= 1; - if (modifier.stackCount === 0) { - scene.removeModifier(modifier); - } - scene.updateModifiers(true, true); + chosenPokemon.loseHeldItem(modifier, false); + globalScene.updateModifiers(true, true); - const bugNet = generateModifierTypeOption(scene, modifierTypes.MYSTERY_ENCOUNTER_GOLDEN_BUG_NET)!; + const bugNet = generateModifierTypeOption(modifierTypes.MYSTERY_ENCOUNTER_GOLDEN_BUG_NET)!; bugNet.type.tier = ModifierTier.ROGUE; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [ bugNet ], guaranteedModifierTypeFuncs: [ modifierTypes.REVIVER_SEED ], fillRemaining: false }); - leaveEncounterWithoutBattle(scene, true); + setEncounterRewards({ + guaranteedModifierTypeOptions: [bugNet], + guaranteedModifierTypeFuncs: [modifierTypes.REVIVER_SEED], + fillRemaining: false, + }); + leaveEncounterWithoutBattle(true); }) - .build()) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - }, - ]) - .build(); + .build(), + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); function getTrainerConfigForWave(waveIndex: number) { // Bug type superfan trainer config @@ -511,156 +524,209 @@ function getTrainerConfigForWave(waveIndex: number) { if (waveIndex < WAVE_LEVEL_BREAKPOINTS[0]) { // Use default template (2 AVG) config - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)); + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true)); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[1]) { config .setPartyTemplates(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true)); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[2]) { config .setPartyTemplates(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true)) .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[3]) { config .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true)) .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[4]) { config .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ pool3Mon.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon.formIndex)) { - p.formIndex = pool3Mon.formIndex; + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; p.generateAndPopulateMoveset(); p.generateName(); - } - })); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[5]) { pool3Copy = randSeedShuffle(pool3Copy); const pool3Mon2 = pool3Copy.pop()!; config .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ pool3Mon.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon.formIndex)) { - p.formIndex = pool3Mon.formIndex; - p.generateAndPopulateMoveset(); - p.generateName(); - } - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ pool3Mon2.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon2.formIndex)) { - p.formIndex = pool3Mon2.formIndex; - p.generateAndPopulateMoveset(); - p.generateName(); - } - })); + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([pool3Mon2.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon2.formIndex)) { + p.formIndex = pool3Mon2.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ); } else if (waveIndex < WAVE_LEVEL_BREAKPOINTS[6]) { config - .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG))) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ pool3Mon.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon.formIndex)) { - p.formIndex = pool3Mon.formIndex; + .setPartyTemplates( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + ) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; p.generateAndPopulateMoveset(); p.generateName(); - } - })) + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ) .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_4_POKEMON, TrainerSlot.TRAINER, true)); } else { pool3Copy = randSeedShuffle(pool3Copy); const pool3Mon2 = pool3Copy.pop()!; config - .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG))) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ pool3Mon.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon.formIndex)) { - p.formIndex = pool3Mon.formIndex; + .setPartyTemplates( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + ) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BEEDRILL], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 1; p.generateAndPopulateMoveset(); p.generateName(); - } - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ pool3Mon2.species ], TrainerSlot.TRAINER, true, p => { - if (!isNullOrUndefined(pool3Mon2.formIndex)) { - p.formIndex = pool3Mon2.formIndex; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUTTERFREE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 1; p.generateAndPopulateMoveset(); p.generateName(); - } - })) + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([pool3Mon2.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon2.formIndex)) { + p.formIndex = pool3Mon2.formIndex; + p.generateAndPopulateMoveset(); + p.generateName(); + } + }), + ) .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_4_POKEMON, TrainerSlot.TRAINER, true)); } return config; } -function doBugTypeMoveTutor(scene: BattleScene): Promise { +function doBugTypeMoveTutor(): Promise { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO explain return new Promise(async resolve => { - const moveOptions = scene.currentBattle.mysteryEncounter!.misc.moveTutorOptions; - await showEncounterDialogue(scene, `${namespace}:battle_won`, `${namespace}:speaker`); + const moveOptions = globalScene.currentBattle.mysteryEncounter!.misc.moveTutorOptions; + await showEncounterDialogue(`${namespace}:battle_won`, `${namespace}:speaker`); const overlayScale = 1; - const moveInfoOverlay = new MoveInfoOverlay(scene, { + const moveInfoOverlay = new MoveInfoOverlay({ delayVisibility: false, scale: overlayScale, onSide: true, right: true, x: 1, y: -MoveInfoOverlay.getHeight(overlayScale, true) - 1, - width: (scene.game.canvas.width / 6) - 2, + width: globalScene.game.canvas.width / 6 - 2, }); - scene.ui.add(moveInfoOverlay); + globalScene.ui.add(moveInfoOverlay); const optionSelectItems = moveOptions.map((move: PokemonMove) => { const option: OptionSelectItem = { @@ -683,7 +749,12 @@ function doBugTypeMoveTutor(scene: BattleScene): Promise { moveInfoOverlay.setVisible(false); }; - const result = await selectOptionThenPokemon(scene, optionSelectItems, `${namespace}:teach_move_prompt`, undefined, onHoverOverCancel); + const result = await selectOptionThenPokemon( + optionSelectItems, + `${namespace}:teach_move_prompt`, + undefined, + onHoverOverCancel, + ); // let forceExit = !!result; if (!result) { moveInfoOverlay.active = false; @@ -694,7 +765,9 @@ function doBugTypeMoveTutor(scene: BattleScene): Promise { // Option select complete, handle if they are learning a move if (result && result.selectedOptionIndex < moveOptions.length) { - scene.unshiftPhase(new LearnMovePhase(scene, result.selectedPokemonIndex, moveOptions[result.selectedOptionIndex].moveId)); + globalScene.unshiftPhase( + new LearnMovePhase(result.selectedPokemonIndex, moveOptions[result.selectedOptionIndex].moveId), + ); } // Complete battle and go to rewards diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index c4b03660bde..2b499d938cd 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -1,33 +1,48 @@ -import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, } from "#app/data/trainer-config"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + loadCustomMovesForEncounter, + selectPokemonForOption, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#app/data/trainer-config"; import { ModifierTier } from "#app/modifier/modifier-tier"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { ModifierPoolType, modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Abilities } from "#enums/abilities"; -import { applyAbilityOverrideToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { Type } from "#app/data/type"; +import { + applyAbilityOverrideToPokemon, + applyModifierTypeToPlayerPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { PokemonType } from "#enums/pokemon-type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { randSeedInt, randSeedShuffle } from "#app/utils"; import { showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; -import { OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler"; -import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import type { OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import { Ability } from "#app/data/ability"; import { BerryModifier } from "#app/modifier/modifier"; import { BerryType } from "#enums/berry-type"; import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { EncounterBattleAnim } from "#app/data/battle-anims"; -import { MoveCategory } from "#app/data/move"; +import { MoveCategory } from "#enums/MoveCategory"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { EncounterAnim } from "#enums/encounter-anims"; @@ -51,7 +66,7 @@ const RANDOM_ABILITY_POOL = [ Abilities.MISTY_SURGE, Abilities.MAGICIAN, Abilities.SHEER_FORCE, - Abilities.PRANKSTER + Abilities.PRANKSTER, ]; /** @@ -59,423 +74,454 @@ const RANDOM_ABILITY_POOL = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3807 | GitHub Issue #3807} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ClowningAroundEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withDisallowedChallenges(Challenges.SINGLE_TYPE) - .withSceneWaveRangeRequirement(80, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withAnimations(EncounterAnim.SMOKESCREEN) - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: Species.MR_MIME.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: -25, - tint: 0.3, - y: -3, - yShadow: -3 - }, - { - spriteKey: Species.BLACEPHALON.toString(), - fileRoot: "pokemon/exp", - hasShadow: true, - repeat: true, - x: 25, - tint: 0.3, - y: -3, - yShadow: -3 - }, - { - spriteKey: "harlequin", - fileRoot: "trainer", - hasShadow: true, - x: 0, - y: 2, - yShadow: 2 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker` - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.CLOWNING_AROUND, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withDisallowedChallenges(Challenges.SINGLE_TYPE) + .withSceneWaveRangeRequirement(80, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withAnimations(EncounterAnim.SMOKESCREEN) + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: Species.MR_MIME.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: -25, + tint: 0.3, + y: -3, + yShadow: -3, + }, + { + spriteKey: Species.BLACEPHALON.toString(), + fileRoot: "pokemon/exp", + hasShadow: true, + repeat: true, + x: 25, + tint: 0.3, + y: -3, + yShadow: -3, + }, + { + spriteKey: "harlequin", + fileRoot: "trainer", + hasShadow: true, + x: 0, + y: 2, + yShadow: 2, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - const clownTrainerType = TrainerType.HARLEQUIN; - const clownConfig = trainerConfigs[clownTrainerType].clone(); - const clownPartyTemplate = new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)); - clownConfig.setPartyTemplates(clownPartyTemplate); - clownConfig.setDoubleOnly(); - // @ts-ignore - clownConfig.partyTemplateFunc = null; // Overrides party template func if it exists + const clownTrainerType = TrainerType.HARLEQUIN; + const clownConfig = trainerConfigs[clownTrainerType].clone(); + const clownPartyTemplate = new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ); + clownConfig.setPartyTemplates(clownPartyTemplate); + clownConfig.setDoubleOnly(); + // @ts-ignore + clownConfig.partyTemplateFunc = null; // Overrides party template func if it exists - // Generate random ability for Blacephalon from pool - const ability = RANDOM_ABILITY_POOL[randSeedInt(RANDOM_ABILITY_POOL.length)]; - encounter.setDialogueToken("ability", new Ability(ability, 3).name); - encounter.misc = { ability }; + // Generate random ability for Blacephalon from pool + const ability = RANDOM_ABILITY_POOL[randSeedInt(RANDOM_ABILITY_POOL.length)]; + encounter.setDialogueToken("ability", new Ability(ability, 3).name); + encounter.misc = { ability }; - encounter.enemyPartyConfigs.push({ - trainerConfig: clownConfig, - pokemonConfigs: [ // Overrides first 2 pokemon to be Mr. Mime and Blacephalon + // Decide the random types for Blacephalon. They should not be the same. + const firstType: number = randSeedInt(18); + let secondType: number = randSeedInt(17); + if (secondType >= firstType) { + secondType++; + } + + encounter.enemyPartyConfigs.push({ + trainerConfig: clownConfig, + pokemonConfigs: [ + // Overrides first 2 pokemon to be Mr. Mime and Blacephalon + { + species: getPokemonSpecies(Species.MR_MIME), + isBoss: true, + moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC], + }, + { + // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter + species: getPokemonSpecies(Species.BLACEPHALON), + customPokemonData: new CustomPokemonData({ + ability: ability, + types: [firstType, secondType], + }), + isBoss: true, + moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN], + }, + ], + doubleBattle: true, + }); + + // Load animations/sfx for start of fight moves + loadCustomMovesForEncounter([Moves.ROLE_PLAY, Moves.TAUNT]); + + encounter.setDialogueToken("blacephalonName", getPokemonSpecies(Species.BLACEPHALON).getName()); + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ { - species: getPokemonSpecies(Species.MR_MIME), - isBoss: true, - moveSet: [ Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC ] - }, - { // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter - species: getPokemonSpecies(Species.BLACEPHALON), - customPokemonData: new CustomPokemonData({ ability: ability, types: [ randSeedInt(18), randSeedInt(18) ]}), - isBoss: true, - moveSet: [ Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN ] + text: `${namespace}:option.1.selected`, + speaker: `${namespace}:speaker`, }, ], - doubleBattle: true - }); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn battle + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Load animations/sfx for start of fight moves - loadCustomMovesForEncounter(scene, [ Moves.ROLE_PLAY, Moves.TAUNT ]); + setEncounterRewards({ fillRemaining: true }); - encounter.setDialogueToken("blacephalonName", getPokemonSpecies(Species.BLACEPHALON).getName()); + // TODO: when Magic Room and Wonder Room are implemented, add those to start of battle + encounter.startOfBattleEffects.push( + { + // Mr. Mime copies the Blacephalon's random ability + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY_2], + move: new PokemonMove(Moves.ROLE_PLAY), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.TAUNT), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER_2], + move: new PokemonMove(Moves.TAUNT), + ignorePp: true, + }, + ); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - speaker: `${namespace}:speaker` - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Spawn battle - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + await transitionMysteryEncounterIntroVisuals(); + await initBattleWithEnemyConfig(config); + }) + .withPostOptionPhase(async (): Promise => { + // After the battle, offer the player the opportunity to permanently swap ability + const abilityWasSwapped = await handleSwapAbility(); + if (abilityWasSwapped) { + await showEncounterText(`${namespace}:option.1.ability_gained`); + } - setEncounterRewards(scene, { fillRemaining: true }); + // Play animations once ability swap is complete + // Trainer sprite that is shown at end of battle is not the same as mystery encounter intro visuals + globalScene.tweens.add({ + targets: globalScene.currentBattle.trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 250, + }); + const background = new EncounterBattleAnim( + EncounterAnim.SMOKESCREEN, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + background.playWithoutTargets(230, 40, 2); + return true; + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + speaker: `${namespace}:speaker`, + }, + { + text: `${namespace}:option.2.selected_2`, + }, + { + text: `${namespace}:option.2.selected_3`, + speaker: `${namespace}:speaker`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Swap player's items on pokemon with the most items + // Item comparisons look at whichever Pokemon has the greatest number of TRANSFERABLE, non-berry items + // So Vitamins, form change items, etc. are not included + const encounter = globalScene.currentBattle.mysteryEncounter!; - // TODO: when Magic Room and Wonder Room are implemented, add those to start of battle - encounter.startOfBattleEffects.push( - { // Mr. Mime copies the Blacephalon's random ability - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.ENEMY_2 ], - move: new PokemonMove(Moves.ROLE_PLAY), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.TAUNT), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [ BattlerIndex.PLAYER_2 ], - move: new PokemonMove(Moves.TAUNT), - ignorePp: true - }); + const party = globalScene.getPlayerParty(); + let mostHeldItemsPokemon = party[0]; + let count = mostHeldItemsPokemon + .getHeldItems() + .filter(m => m.isTransferable && !(m instanceof BerryModifier)) + .reduce((v, m) => v + m.stackCount, 0); - await transitionMysteryEncounterIntroVisuals(scene); - await initBattleWithEnemyConfig(scene, config); - }) - .withPostOptionPhase(async (scene: BattleScene): Promise => { - // After the battle, offer the player the opportunity to permanently swap ability - const abilityWasSwapped = await handleSwapAbility(scene); - if (abilityWasSwapped) { - await showEncounterText(scene, `${namespace}:option.1.ability_gained`); - } - - // Play animations once ability swap is complete - // Trainer sprite that is shown at end of battle is not the same as mystery encounter intro visuals - scene.tweens.add({ - targets: scene.currentBattle.trainer, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 250 - }); - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); - background.playWithoutTargets(scene, 230, 40, 2); - return true; - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - speaker: `${namespace}:speaker` - }, - { - text: `${namespace}:option.2.selected_2`, - }, - { - text: `${namespace}:option.2.selected_3`, - speaker: `${namespace}:speaker` - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Swap player's items on pokemon with the most items - // Item comparisons look at whichever Pokemon has the greatest number of TRANSFERABLE, non-berry items - // So Vitamins, form change items, etc. are not included - const encounter = scene.currentBattle.mysteryEncounter!; - - const party = scene.getParty(); - let mostHeldItemsPokemon = party[0]; - let count = mostHeldItemsPokemon.getHeldItems() + for (const pokemon of party) { + const nextCount = pokemon + .getHeldItems() .filter(m => m.isTransferable && !(m instanceof BerryModifier)) .reduce((v, m) => v + m.stackCount, 0); + if (nextCount > count) { + mostHeldItemsPokemon = pokemon; + count = nextCount; + } + } - party.forEach(pokemon => { - const nextCount = pokemon.getHeldItems() - .filter(m => m.isTransferable && !(m instanceof BerryModifier)) - .reduce((v, m) => v + m.stackCount, 0); - if (nextCount > count) { - mostHeldItemsPokemon = pokemon; - count = nextCount; - } - }); + encounter.setDialogueToken("switchPokemon", mostHeldItemsPokemon.getNameToRender()); - encounter.setDialogueToken("switchPokemon", mostHeldItemsPokemon.getNameToRender()); + const items = mostHeldItemsPokemon.getHeldItems(); - const items = mostHeldItemsPokemon.getHeldItems(); + // Shuffles Berries (if they have any) + let numBerries = 0; + for (const m of items.filter(m => m instanceof BerryModifier)) { + numBerries += m.stackCount; + globalScene.removeModifier(m); + } - // Shuffles Berries (if they have any) - let numBerries = 0; - items.filter(m => m instanceof BerryModifier) - .forEach(m => { - numBerries += m.stackCount; - scene.removeModifier(m); - }); + generateItemsOfTier(mostHeldItemsPokemon, numBerries, "Berries"); - 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; - // Shuffle Transferable held items in the same tier (only shuffles Ultra and Rogue atm) - let numUltra = 0; - let numRogue = 0; - items.filter(m => m.isTransferable && !(m instanceof BerryModifier)) - .forEach(m => { - const type = m.type.withTierFromPool(); - const tier = type.tier ?? ModifierTier.ULTRA; - if (type.id === "GOLDEN_EGG" || tier === ModifierTier.ROGUE) { - numRogue += m.stackCount; - scene.removeModifier(m); - } else if (type.id === "LUCKY_EGG" || tier === ModifierTier.ULTRA) { - numUltra += m.stackCount; - scene.removeModifier(m); - } - }); + for (const m of items.filter(m => m.isTransferable && !(m instanceof BerryModifier))) { + const type = m.type.withTierFromPool(ModifierPoolType.PLAYER, party); + const tier = type.tier ?? ModifierTier.ULTRA; + if (type.id === "GOLDEN_EGG" || tier === ModifierTier.ROGUE) { + numRogue += m.stackCount; + globalScene.removeModifier(m); + } else if (type.id === "LUCKY_EGG" || type.id === "SOOTHE_BELL" || tier === ModifierTier.ULTRA) { + numUltra += m.stackCount; + globalScene.removeModifier(m); + } + } - generateItemsOfTier(scene, mostHeldItemsPokemon, numUltra, ModifierTier.ULTRA); - generateItemsOfTier(scene, mostHeldItemsPokemon, numRogue, ModifierTier.ROGUE); - }) - .withOptionPhase(async (scene: BattleScene) => { - leaveEncounterWithoutBattle(scene, true); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Play animations - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); - background.playWithoutTargets(scene, 230, 40, 2); - await transitionMysteryEncounterIntroVisuals(scene, true, true, 200); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - speaker: `${namespace}:speaker` - }, - { - text: `${namespace}:option.3.selected_2`, - }, - { - text: `${namespace}:option.3.selected_3`, - speaker: `${namespace}:speaker` - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Randomize the second type of all player's pokemon - // If the pokemon does not normally have a second type, it will gain 1 - for (const pokemon of scene.getParty()) { - const originalTypes = pokemon.getTypes(false, false, true); + generateItemsOfTier(mostHeldItemsPokemon, numUltra, ModifierTier.ULTRA); + generateItemsOfTier(mostHeldItemsPokemon, numRogue, ModifierTier.ROGUE); + }) + .withOptionPhase(async () => { + leaveEncounterWithoutBattle(true); + }) + .withPostOptionPhase(async () => { + // Play animations + const background = new EncounterBattleAnim( + EncounterAnim.SMOKESCREEN, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + background.playWithoutTargets(230, 40, 2); + await transitionMysteryEncounterIntroVisuals(true, true, 200); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + speaker: `${namespace}:speaker`, + }, + { + text: `${namespace}:option.3.selected_2`, + }, + { + text: `${namespace}:option.3.selected_3`, + speaker: `${namespace}:speaker`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Randomize the second type of all player's pokemon + // If the pokemon does not normally have a second type, it will gain 1 + for (const pokemon of globalScene.getPlayerParty()) { + const originalTypes = pokemon.getTypes(false, false, true); - // If the Pokemon has non-status moves that don't match the Pokemon's type, prioritizes those as the new type - // Makes the "randomness" of the shuffle slightly less punishing - let priorityTypes = pokemon.moveset - .filter(move => move && !originalTypes.includes(move.getMove().type) && move.getMove().category !== MoveCategory.STATUS) - .map(move => move!.getMove().type); - if (priorityTypes?.length > 0) { - priorityTypes = [ ...new Set(priorityTypes) ].sort(); - priorityTypes = randSeedShuffle(priorityTypes); - } + // If the Pokemon has non-status moves that don't match the Pokemon's type, prioritizes those as the new type + // Makes the "randomness" of the shuffle slightly less punishing + let priorityTypes = pokemon.moveset + .filter( + move => + move && !originalTypes.includes(move.getMove().type) && move.getMove().category !== MoveCategory.STATUS, + ) + .map(move => move!.getMove().type); + if (priorityTypes?.length > 0) { + priorityTypes = [...new Set(priorityTypes)].sort(); + priorityTypes = randSeedShuffle(priorityTypes); + } - const newTypes = [ originalTypes[0] ]; - let secondType: Type | null = null; - while (secondType === null || secondType === newTypes[0] || originalTypes.includes(secondType)) { - if (priorityTypes.length > 0) { - secondType = priorityTypes.pop() ?? null; - } else { - secondType = randSeedInt(18) as Type; - } - } - newTypes.push(secondType); - - // Apply the type changes (to both base and fusion, if pokemon is fused) - if (!pokemon.customPokemonData) { - pokemon.customPokemonData = new CustomPokemonData(); - } - pokemon.customPokemonData.types = newTypes; - if (pokemon.isFusion()) { - if (!pokemon.fusionCustomPokemonData) { - pokemon.fusionCustomPokemonData = new CustomPokemonData(); - } - pokemon.fusionCustomPokemonData.types = newTypes; + const newTypes = [PokemonType.UNKNOWN]; + let secondType: PokemonType | null = null; + while (secondType === null || secondType === newTypes[0] || originalTypes.includes(secondType)) { + if (priorityTypes.length > 0) { + secondType = priorityTypes.pop() ?? null; + } else { + secondType = randSeedInt(18) as PokemonType; } } - }) - .withOptionPhase(async (scene: BattleScene) => { - leaveEncounterWithoutBattle(scene, true); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Play animations - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); - background.playWithoutTargets(scene, 230, 40, 2); - await transitionMysteryEncounterIntroVisuals(scene, true, true, 200); - }) - .build() - ) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - }, - ]) - .build(); + newTypes.push(secondType); -async function handleSwapAbility(scene: BattleScene) { + // Apply the type changes (to both base and fusion, if pokemon is fused) + if (!pokemon.customPokemonData) { + pokemon.customPokemonData = new CustomPokemonData(); + } + pokemon.customPokemonData.types = newTypes; + if (pokemon.isFusion()) { + if (!pokemon.fusionCustomPokemonData) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(); + } + pokemon.fusionCustomPokemonData.types = newTypes; + } + } + }) + .withOptionPhase(async () => { + leaveEncounterWithoutBattle(true); + }) + .withPostOptionPhase(async () => { + // Play animations + const background = new EncounterBattleAnim( + EncounterAnim.SMOKESCREEN, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + background.playWithoutTargets(230, 40, 2); + await transitionMysteryEncounterIntroVisuals(true, true, 200); + }) + .build(), + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); + +async function handleSwapAbility() { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor return new Promise(async resolve => { - await showEncounterDialogue(scene, `${namespace}:option.1.apply_ability_dialogue`, `${namespace}:speaker`); - await showEncounterText(scene, `${namespace}:option.1.apply_ability_message`); + await showEncounterDialogue(`${namespace}:option.1.apply_ability_dialogue`, `${namespace}:speaker`); + await showEncounterText(`${namespace}:option.1.apply_ability_message`); - scene.ui.setMode(Mode.MESSAGE).then(() => { - displayYesNoOptions(scene, resolve); + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + displayYesNoOptions(resolve); }); }); } -function displayYesNoOptions(scene: BattleScene, resolve) { - showEncounterText(scene, `${namespace}:option.1.ability_prompt`, null, 500, false); +function displayYesNoOptions(resolve) { + showEncounterText(`${namespace}:option.1.ability_prompt`, null, 500, false); const fullOptions = [ { label: i18next.t("menu:yes"), handler: () => { - onYesAbilitySwap(scene, resolve); + onYesAbilitySwap(resolve); return true; - } + }, }, { label: i18next.t("menu:no"), handler: () => { resolve(false); return true; - } - } + }, + }, ]; const config: OptionSelectConfig = { options: fullOptions, maxOptions: 7, - yOffset: 0 + yOffset: 0, }; - scene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); + globalScene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); } -function onYesAbilitySwap(scene: BattleScene, resolve) { +function onYesAbilitySwap(resolve) { const onPokemonSelected = (pokemon: PlayerPokemon) => { // Do ability swap - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; applyAbilityOverrideToPokemon(pokemon, encounter.misc.ability); encounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender()); - scene.ui.setMode(Mode.MESSAGE).then(() => resolve(true)); + globalScene.ui.setMode(Mode.MESSAGE).then(() => resolve(true)); }; const onPokemonNotSelected = () => { - scene.ui.setMode(Mode.MESSAGE).then(() => { - displayYesNoOptions(scene, resolve); + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + displayYesNoOptions(resolve); }); }; - selectPokemonForOption(scene, onPokemonSelected, onPokemonNotSelected); + selectPokemonForOption(onPokemonSelected, onPokemonNotSelected); } -function generateItemsOfTier(scene: BattleScene, pokemon: PlayerPokemon, numItems: number, tier: ModifierTier | "Berries") { +function generateItemsOfTier(pokemon: PlayerPokemon, numItems: number, tier: ModifierTier | "Berries") { // These pools have to be defined at runtime so that modifierTypes exist // Pools have instances of the modifier type equal to the max stacks that modifier can be applied to any one pokemon // This is to prevent "over-generating" a random item of a certain type during item swaps const ultraPool = [ - [ modifierTypes.REVIVER_SEED, 1 ], - [ modifierTypes.GOLDEN_PUNCH, 5 ], - [ modifierTypes.ATTACK_TYPE_BOOSTER, 99 ], - [ modifierTypes.QUICK_CLAW, 3 ], - [ modifierTypes.WIDE_LENS, 3 ] + [modifierTypes.REVIVER_SEED, 1], + [modifierTypes.GOLDEN_PUNCH, 5], + [modifierTypes.ATTACK_TYPE_BOOSTER, 99], + [modifierTypes.QUICK_CLAW, 3], + [modifierTypes.WIDE_LENS, 3], ]; const roguePool = [ - [ 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 ], - [ modifierTypes.KINGS_ROCK, 3 ], - [ modifierTypes.GRIP_CLAW, 5 ] + [modifierTypes.LEFTOVERS, 4], + [modifierTypes.SHELL_BELL, 4], + [modifierTypes.SOUL_DEW, 10], + [modifierTypes.SCOPE_LENS, 1], + [modifierTypes.BATON, 1], + [modifierTypes.FOCUS_BAND, 5], + [modifierTypes.KINGS_ROCK, 3], + [modifierTypes.GRIP_CLAW, 5], ]; const berryPool = [ - [ BerryType.APICOT, 3 ], - [ BerryType.ENIGMA, 2 ], - [ BerryType.GANLON, 3 ], - [ BerryType.LANSAT, 3 ], - [ BerryType.LEPPA, 2 ], - [ BerryType.LIECHI, 3 ], - [ BerryType.LUM, 2 ], - [ BerryType.PETAYA, 3 ], - [ BerryType.SALAC, 2 ], - [ BerryType.SITRUS, 2 ], - [ BerryType.STARF, 3 ] + [BerryType.APICOT, 3], + [BerryType.ENIGMA, 2], + [BerryType.GANLON, 3], + [BerryType.LANSAT, 3], + [BerryType.LEPPA, 2], + [BerryType.LIECHI, 3], + [BerryType.LUM, 2], + [BerryType.PETAYA, 3], + [BerryType.SALAC, 2], + [BerryType.SITRUS, 2], + [BerryType.STARF, 3], ]; let pool: any[]; @@ -494,11 +540,11 @@ function generateItemsOfTier(scene: BattleScene, pokemon: PlayerPokemon, numItem const newItemType = pool[randIndex]; let newMod: PokemonHeldItemModifierType; if (tier === "Berries") { - newMod = generateModifierType(scene, modifierTypes.BERRY, [ newItemType[0] ]) as PokemonHeldItemModifierType; + newMod = generateModifierType(modifierTypes.BERRY, [newItemType[0]]) as PokemonHeldItemModifierType; } else { - newMod = generateModifierType(scene, newItemType[0]) as PokemonHeldItemModifierType; + newMod = generateModifierType(newItemType[0]) as PokemonHeldItemModifierType; } - applyModifierTypeToPlayerPokemon(scene, pokemon, newMod); + applyModifierTypeToPlayerPokemon(pokemon, newMod); // Decrement max stacks and remove from pool if at max newItemType[1]--; if (newItemType[1] <= 0) { diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index 55d7ce0e92d..91f168371cf 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -1,32 +1,45 @@ -import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { Moves } from "#enums/moves"; -import { TrainerSlot } from "#app/data/trainer-config"; -import PokemonData from "#app/system/pokemon-data"; -import { Biome } from "#enums/biome"; +import { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; import { EncounterBattleAnim } from "#app/data/battle-anims"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { DANCING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; -import { BattlerIndex } from "#app/battle"; -import { catchPokemon, getEncounterPokemonLevelForWave, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { PokeballType } from "#enums/pokeball"; +import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + catchPokemon, + getEncounterPokemonLevelForWave, + STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { TrainerSlot } from "#app/data/trainer-config"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; +import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { modifierTypes } from "#app/modifier/modifier-type"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; -import { Stat } from "#enums/stat"; +import PokemonData from "#app/system/pokemon-data"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Biome } from "#enums/biome"; import { EncounterAnim } from "#enums/encounter-anims"; -import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; +import { Moves } from "#enums/moves"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { PokeballType } from "#enums/pokeball"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; import i18next from "i18next"; /** the i18n namespace for this encounter */ @@ -40,7 +53,7 @@ const BAILE_STYLE_BIOMES = [ Biome.WASTELAND, Biome.MOUNTAIN, Biome.BADLANDS, - Biome.DESERT + Biome.DESERT, ]; // Electric form @@ -51,7 +64,7 @@ const POM_POM_STYLE_BIOMES = [ Biome.LABORATORY, Biome.SLUM, Biome.METROPOLIS, - Biome.DOJO + Biome.DOJO, ]; // Psychic form @@ -62,7 +75,7 @@ const PAU_STYLE_BIOMES = [ Biome.PLAINS, Biome.GRASS, Biome.TALL_GRASS, - Biome.FOREST + Biome.FOREST, ]; // Ghost form @@ -73,7 +86,7 @@ const SENSU_STYLE_BIOMES = [ Biome.ABYSS, Biome.GRAVEYARD, Biome.LAKE, - Biome.TEMPLE + Biome.TEMPLE, ]; /** @@ -81,240 +94,264 @@ const SENSU_STYLE_BIOMES = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3823 | GitHub Issue #3823} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DancingLessonsEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DANCING_LESSONS) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withIntroSpriteConfigs([]) // Uses a real Pokemon sprite instead of ME Intro Visuals - .withAnimations(EncounterAnim.DANCE) - .withHideWildIntroMessage(true) - .withAutoHideIntroVisuals(false) - .withCatchAllowed(true) - .withFleeAllowed(false) - .withOnVisualsStart((scene: BattleScene) => { - const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon()!, scene.getParty()[0]); - danceAnim.play(scene); - - return true; - }) - .withIntroDialogue([ - { - text: `${namespace}:intro`, +export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.DANCING_LESSONS, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withIntroSpriteConfigs([]) // Uses a real Pokemon sprite instead of ME Intro Visuals + .withAnimations(EncounterAnim.DANCE) + .withHideWildIntroMessage(true) + .withAutoHideIntroVisuals(false) + .withCatchAllowed(true) + .withFleeAllowed(false) + .withOnVisualsStart(() => { + const oricorio = globalScene.getEnemyPokemon()!; + const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, oricorio, globalScene.getPlayerPokemon()!); + danceAnim.play(false, () => { + if (oricorio.shiny) { + oricorio.sparkle(); } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; + }); + return true; + }) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - const species = getPokemonSpecies(Species.ORICORIO); - const level = getEncounterPokemonLevelForWave(scene, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const enemyPokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, false); - if (!enemyPokemon.moveset.some(m => m && m.getMove().id === Moves.REVELATION_DANCE)) { - if (enemyPokemon.moveset.length < 4) { - enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE)); - } else { - enemyPokemon.moveset[0] = new PokemonMove(Moves.REVELATION_DANCE); - } - } - - // Set the form index based on the biome - // Defaults to Baile style if somehow nothing matches - const currentBiome = scene.arena.biomeType; - if (BAILE_STYLE_BIOMES.includes(currentBiome)) { - enemyPokemon.formIndex = 0; - } else if (POM_POM_STYLE_BIOMES.includes(currentBiome)) { - enemyPokemon.formIndex = 1; - } else if (PAU_STYLE_BIOMES.includes(currentBiome)) { - enemyPokemon.formIndex = 2; - } else if (SENSU_STYLE_BIOMES.includes(currentBiome)) { - enemyPokemon.formIndex = 3; + const species = getPokemonSpecies(Species.ORICORIO); + const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); + const enemyPokemon = new EnemyPokemon(species, level, TrainerSlot.NONE, false); + if (!enemyPokemon.moveset.some(m => m && m.getMove().id === Moves.REVELATION_DANCE)) { + if (enemyPokemon.moveset.length < 4) { + enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE)); } else { - enemyPokemon.formIndex = 0; + enemyPokemon.moveset[0] = new PokemonMove(Moves.REVELATION_DANCE); } + } - const oricorioData = new PokemonData(enemyPokemon); - const oricorio = scene.addEnemyPokemon(species, level, TrainerSlot.NONE, false, oricorioData); + // Set the form index based on the biome + // Defaults to Baile style if somehow nothing matches + const currentBiome = globalScene.arena.biomeType; + if (BAILE_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 0; + } else if (POM_POM_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 1; + } else if (PAU_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 2; + } else if (SENSU_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 3; + } else { + enemyPokemon.formIndex = 0; + } - // Adds a real Pokemon sprite to the field (required for the animation) - scene.getEnemyParty().forEach(enemyPokemon => { - scene.field.remove(enemyPokemon, true); - }); - scene.currentBattle.enemyParty = [ oricorio ]; - scene.field.add(oricorio); - // Spawns on offscreen field - oricorio.x -= 300; - encounter.loadAssets.push(oricorio.loadAssets()); + const oricorioData = new PokemonData(enemyPokemon); + const oricorio = globalScene.addEnemyPokemon(species, level, TrainerSlot.NONE, false, false, oricorioData); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + // Adds a real Pokemon sprite to the field (required for the animation) + for (const enemyPokemon of globalScene.getEnemyParty()) { + enemyPokemon.leaveField(true, true, true); + } + globalScene.currentBattle.enemyParty = [oricorio]; + globalScene.field.add(oricorio); + // Spawns on offscreen field + oricorio.x -= 300; + encounter.loadAssets.push(oricorio.loadAssets()); + + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { species: species, dataSource: oricorioData, isBoss: true, // Gets +1 to all stats except SPD on battle start - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:option.1.boss_enraged`); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF ], 1)); + queueEncounterMessage(`${namespace}:option.1.boss_enraged`); + globalScene.unshiftPhase( + new StatStageChangePhase( + pokemon.getBattlerIndex(), + true, + [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF], + 1, + ), + ); + }, + }, + ], + }; + encounter.enemyPartyConfigs = [config]; + encounter.misc = { + oricorioData, + }; + + encounter.setDialogueToken("oricorioName", getPokemonSpecies(Species.ORICORIO).getName()); + + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withOptionPhase(async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + + encounter.startOfBattleEffects.push({ + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.REVELATION_DANCE), + ignorePp: true, + }); + + await hideOricorioPokemon(); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.BATON], + fillRemaining: true, + }); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Learn its Dance + const encounter = globalScene.currentBattle.mysteryEncounter!; + + const onPokemonSelected = (pokemon: PlayerPokemon) => { + encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); + globalScene.unshiftPhase( + new LearnMovePhase(globalScene.getPlayerParty().indexOf(pokemon), Moves.REVELATION_DANCE), + ); + + // Play animation again to "learn" the dance + const danceAnim = new EncounterBattleAnim( + EncounterAnim.DANCE, + globalScene.getEnemyPokemon()!, + globalScene.getPlayerPokemon(), + ); + danceAnim.play(); + }; + + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + // Learn its Dance + await hideOricorioPokemon(); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(DANCING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, + secondOptionPrompt: `${namespace}:option.3.select_prompt`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Open menu for selecting pokemon with a Dancing move + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for nature selection + return pokemon.moveset + .filter(move => move && DANCING_MOVES.includes(move.getMove().id)) + .map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and second option selected + encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("selectedMove", move.getName()); + encounter.misc.selectedMove = move; + + return true; + }, + }; + return option; + }); + }; + + // Only challenge legal/unfainted Pokemon that have a Dancing move can be selected + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + if (!pokemon.isAllowedInBattle()) { + return ( + i18next.t("partyUiHandler:cantBeUsed", { + pokemonName: pokemon.getNameToRender(), + }) ?? null + ); } - }], - }; - encounter.enemyPartyConfigs = [ config ]; - encounter.misc = { - oricorioData - }; - - encounter.setDialogueToken("oricorioName", getPokemonSpecies(Species.ORICORIO).getName()); - - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - // Pick battle - const encounter = scene.currentBattle.mysteryEncounter!; - - encounter.startOfBattleEffects.push({ - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.REVELATION_DANCE), - ignorePp: true - }); - - await hideOricorioPokemon(scene); - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.BATON ], fillRemaining: true }); - await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Learn its Dance - const encounter = scene.currentBattle.mysteryEncounter!; - - const onPokemonSelected = (pokemon: PlayerPokemon) => { - encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - scene.unshiftPhase(new LearnMovePhase(scene, scene.getParty().indexOf(pokemon), Moves.REVELATION_DANCE)); - - // Play animation again to "learn" the dance - const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon()!, scene.getPlayerPokemon()); - danceAnim.play(scene); - }; - - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Learn its Dance - await hideOricorioPokemon(scene); - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(DANCING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - secondOptionPrompt: `${namespace}:option.3.select_prompt`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Open menu for selecting pokemon with a Dancing move - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for nature selection - return pokemon.moveset - .filter(move => move && DANCING_MOVES.includes(move.getMove().id)) - .map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and second option selected - encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("selectedMove", move.getName()); - encounter.misc.selectedMove = move; - - return true; - }, - }; - return option; - }); - }; - - // Only challenge legal/unfainted Pokemon that have a Dancing move can be selected - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon meets primary pokemon reqs, it can be selected - if (!pokemon.isAllowedInBattle()) { - return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.getNameToRender() }) ?? null; - } - const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon); - if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Show the Oricorio a dance, and recruit it - const encounter = scene.currentBattle.mysteryEncounter!; - const oricorio = encounter.misc.oricorioData.toPokemon(scene); - oricorio.passive = true; - - // Ensure the Oricorio's moveset gains the Dance move the player used - const move = encounter.misc.selectedMove?.getMove().id; - if (!oricorio.moveset.some(m => m.getMove().id === move)) { - if (oricorio.moveset.length < 4) { - oricorio.moveset.push(new PokemonMove(move)); - } else { - oricorio.moveset[3] = new PokemonMove(move); - } + const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon); + if (!meetsReqs) { + return getEncounterText(`${namespace}:invalid_selection`) ?? null; } - await hideOricorioPokemon(scene); - await catchPokemon(scene, oricorio, null, PokeballType.POKEBALL, false); - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .build(); + return null; + }; -function hideOricorioPokemon(scene: BattleScene) { + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + // Show the Oricorio a dance, and recruit it + const encounter = globalScene.currentBattle.mysteryEncounter!; + const oricorio = encounter.misc.oricorioData.toPokemon(); + oricorio.passive = true; + + // Ensure the Oricorio's moveset gains the Dance move the player used + const move = encounter.misc.selectedMove?.getMove().id; + if (!oricorio.moveset.some(m => m.getMove().id === move)) { + if (oricorio.moveset.length < 4) { + oricorio.moveset.push(new PokemonMove(move)); + } else { + oricorio.moveset[3] = new PokemonMove(move); + } + } + + await hideOricorioPokemon(); + await catchPokemon(oricorio, null, PokeballType.POKEBALL, false); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .build(); + +function hideOricorioPokemon() { return new Promise(resolve => { - const oricorioSprite = scene.getEnemyParty()[0]; - scene.tweens.add({ + const oricorioSprite = globalScene.getEnemyParty()[0]; + globalScene.tweens.add({ targets: oricorioSprite, x: "+=16", y: "-=16", @@ -322,9 +359,9 @@ function hideOricorioPokemon(scene: BattleScene) { ease: "Sine.easeInOut", duration: 750, onComplete: () => { - scene.field.remove(oricorioSprite, true); + globalScene.field.remove(oricorioSprite, true); resolve(); - } + }, }); }); } diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 8a814b58248..6c4c8f26deb 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -1,18 +1,24 @@ -import { Type } from "#app/data/type"; +import type { PokemonType } from "#enums/pokemon-type"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { modifierTypes } from "#app/modifier/modifier-type"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { 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 type { EnemyPartyConfig, EnemyPokemonConfig } from "../utils/encounter-phase-utils"; +import { initBattleWithEnemyConfig, leaveEncounterWithoutBattle } from "../utils/encounter-phase-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"; -import { PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; +import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { PokemonFormChangeItemModifier } from "#app/modifier/modifier"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { Challenges } from "#enums/challenges"; @@ -90,131 +96,132 @@ const excludedBosses = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3806 | GitHub Issue #3806} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DarkDealEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DARK_DEAL) - .withEncounterTier(MysteryEncounterTier.ROGUE) - .withIntroSpriteConfigs([ - { - spriteKey: "dark_deal_scientist", - fileRoot: "mystery-encounters", - hasShadow: true, - }, - { - spriteKey: "dark_deal_porygon", - fileRoot: "mystery-encounters", - hasShadow: true, - repeat: true, - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .withSceneWaveRangeRequirement(30, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party - .withCatchAllowed(true) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.1.selected_dialogue`, - }, - { - text: `${namespace}:option.1.selected_message`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens - // Will never return last battle able mon and instead pick fainted/unable to battle - const removedPokemon = getRandomPlayerPokemon(scene, true, false, true); - - // Get all the pokemon's held items - const modifiers = removedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); - scene.removePokemonFromPlayerParty(removedPokemon); - - const encounter = scene.currentBattle.mysteryEncounter!; - encounter.setDialogueToken("pokeName", removedPokemon.getNameToRender()); - - // Store removed pokemon types - encounter.misc = { - removedTypes: removedPokemon.getTypes(), - modifiers - }; - }) - .withOptionPhase(async (scene: BattleScene) => { - // Give the player 5 Rogue Balls - const encounter = scene.currentBattle.mysteryEncounter!; - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ROGUE_BALL)); - - // Start encounter with random legendary (7-10 starter strength) that has level additive - // If this is a mono-type challenge, always ensure the required type is filtered for - let bossTypes: Type[] = encounter.misc.removedTypes; - const singleTypeChallenges = scene.gameMode.challenges.filter(c => c.value && c.id === Challenges.SINGLE_TYPE); - if (scene.gameMode.isChallenge && singleTypeChallenges.length > 0) { - bossTypes = singleTypeChallenges.map(c => (c.value - 1) as Type); - } - - const bossModifiers: PokemonHeldItemModifier[] = encounter.misc.modifiers; - // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ - 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 pokemonConfig: EnemyPokemonConfig = { - species: bossSpecies, - isBoss: true, - modifierConfigs: bossModifiers.map(m => { - return { - modifier: m, - stackCount: m.getStackCount(), - }; - }) - }; - if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) { - pokemonConfig.formIndex = 0; - } - const config: EnemyPartyConfig = { - pokemonConfigs: [ pokemonConfig ], - }; - await initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, +export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.DARK_DEAL, +) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withIntroSpriteConfigs([ + { + spriteKey: "dark_deal_scientist", + fileRoot: "mystery-encounters", + hasShadow: true, + }, + { + spriteKey: "dark_deal_porygon", + fileRoot: "mystery-encounters", + hasShadow: true, + repeat: true, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withSceneWaveRangeRequirement(30, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 pokemon in party + .withCatchAllowed(true) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { speaker: `${namespace}:speaker`, - text: `${namespace}:option.2.selected`, + text: `${namespace}:option.1.selected_dialogue`, + }, + { + text: `${namespace}:option.1.selected_message`, }, ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .withOutroDialogue([ - { - text: `${namespace}:outro` - } - ]) - .build(); + }) + .withPreOptionPhase(async () => { + // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens + // Will never return last battle able mon and instead pick fainted/unable to battle + const removedPokemon = getRandomPlayerPokemon(true, false, true); + + // Get all the pokemon's held items + const modifiers = removedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); + globalScene.removePokemonFromPlayerParty(removedPokemon); + + const encounter = globalScene.currentBattle.mysteryEncounter!; + encounter.setDialogueToken("pokeName", removedPokemon.getNameToRender()); + + // Store removed pokemon types + encounter.misc = { + removedTypes: removedPokemon.getTypes(), + modifiers, + }; + }) + .withOptionPhase(async () => { + // Give the player 5 Rogue Balls + const encounter = globalScene.currentBattle.mysteryEncounter!; + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.ROGUE_BALL)); + + // Start encounter with random legendary (7-10 starter strength) that has level additive + // If this is a mono-type challenge, always ensure the required type is filtered for + let bossTypes: PokemonType[] = encounter.misc.removedTypes; + const singleTypeChallenges = globalScene.gameMode.challenges.filter( + c => c.value && c.id === Challenges.SINGLE_TYPE, + ); + if (globalScene.gameMode.isChallenge && singleTypeChallenges.length > 0) { + bossTypes = singleTypeChallenges.map(c => (c.value - 1) as PokemonType); + } + + const bossModifiers: PokemonHeldItemModifier[] = encounter.misc.modifiers; + // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ + const roll = randSeedInt(100); + const starterTier: number | [number, number] = roll >= 65 ? 6 : roll >= 15 ? 7 : roll >= 5 ? 8 : [9, 10]; + const bossSpecies = getPokemonSpecies(getRandomSpeciesByStarterCost(starterTier, excludedBosses, bossTypes)); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true, + modifierConfigs: bossModifiers.map(m => { + return { + modifier: m, + stackCount: m.getStackCount(), + }; + }), + }; + if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) { + pokemonConfig.formIndex = 0; + } + const config: EnemyPartyConfig = { + pokemonConfigs: [pokemonConfig], + }; + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index d5f9388b56c..c1486ff100b 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -1,28 +1,48 @@ -import { generateModifierType, leaveEncounterWithoutBattle, selectPokemonForOption, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { + CombinationPokemonRequirement, + HeldItemRequirement, + MoneyRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { + generateModifierType, + leaveEncounterWithoutBattle, + selectPokemonForOption, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; +import type { PokemonHeldItemModifier, PokemonInstantReviveModifier } from "#app/modifier/modifier"; +import { + BerryModifier, + HealingBoosterModifier, + LevelIncrementBoosterModifier, + MoneyMultiplierModifier, + PreserveBerryModifier, +} from "#app/modifier/modifier"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; +import i18next from "#app/plugins/i18n"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { randSeedItem } from "#app/utils"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { CombinationPokemonRequirement, HeldItemRequirement, MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { BerryModifier, HealingBoosterModifier, LevelIncrementBoosterModifier, MoneyMultiplierModifier, PokemonHeldItemModifier, PreserveBerryModifier } from "#app/modifier/modifier"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; -import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import i18next from "#app/plugins/i18n"; -import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounters/delibirdy"; /** Berries only */ -const OPTION_2_ALLOWED_MODIFIERS = [ "BerryModifier", "PokemonInstantReviveModifier" ]; +const OPTION_2_ALLOWED_MODIFIERS = ["BerryModifier", "PokemonInstantReviveModifier"]; /** Disallowed items are berries, Reviver Seeds, and Vitamins (form change items and fusion items are not PokemonHeldItemModifiers) */ const OPTION_3_DISALLOWED_MODIFIERS = [ @@ -30,290 +50,335 @@ const OPTION_3_DISALLOWED_MODIFIERS = [ "PokemonInstantReviveModifier", "TerastallizeModifier", "PokemonBaseStatModifier", - "PokemonBaseStatTotalModifier" + "PokemonBaseStatTotalModifier", ]; const DELIBIRDY_MONEY_PRICE_MULTIPLIER = 2; +const doEventReward = () => { + const event_buff = globalScene.eventManager.getDelibirdyBuff(); + if (event_buff.length > 0) { + const candidates = event_buff.filter(c => { + const mtype = generateModifierType(modifierTypes[c]); + const existingCharm = globalScene.findModifier(m => m.type.id === mtype?.id); + return !(existingCharm && existingCharm.getStackCount() >= existingCharm.getMaxStackCount()); + }); + if (candidates.length > 0) { + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes[randSeedItem(candidates)])); + } else { + // At max stacks, give a Voucher instead + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.VOUCHER)); + } + } +}; + /** * Delibird-y encounter. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3804 | GitHub Issue #3804} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DelibirdyEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DELIBIRDY) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, DELIBIRDY_MONEY_PRICE_MULTIPLIER)) // Must have enough money for it to spawn at the very least - .withPrimaryPokemonRequirement( - CombinationPokemonRequirement.Some( - // Must also have either option 2 or 3 available to spawn - new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS), - new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true) - ) - ) - .withIntroSpriteConfigs([ - { - spriteKey: "", - fileRoot: "", - species: Species.DELIBIRD, - hasShadow: true, - repeat: true, - startFrame: 38, - scale: 0.94 - }, - { - spriteKey: "", - fileRoot: "", - species: Species.DELIBIRD, - hasShadow: true, - repeat: true, - scale: 1.06 - }, - { - spriteKey: "", - fileRoot: "", - species: Species.DELIBIRD, - hasShadow: true, - repeat: true, - startFrame: 65, - x: 1, - y: 5, - yShadow: 5 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - } - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - encounter.setDialogueToken("delibirdName", getPokemonSpecies(Species.DELIBIRD).getName()); +export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.DELIBIRDY, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, DELIBIRDY_MONEY_PRICE_MULTIPLIER)) // Must have enough money for it to spawn at the very least + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + // Must also have either option 2 or 3 available to spawn + new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS), + new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true), + ), + ) + .withIntroSpriteConfigs([ + { + spriteKey: "", + fileRoot: "", + species: Species.DELIBIRD, + hasShadow: true, + repeat: true, + startFrame: 38, + scale: 0.94, + }, + { + spriteKey: "", + fileRoot: "", + species: Species.DELIBIRD, + hasShadow: true, + repeat: true, + scale: 1.06, + }, + { + spriteKey: "", + fileRoot: "", + species: Species.DELIBIRD, + hasShadow: true, + repeat: true, + startFrame: 65, + x: 1, + y: 5, + yShadow: 5, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + encounter.setDialogueToken("delibirdName", getPokemonSpecies(Species.DELIBIRD).getName()); - scene.loadBgm("mystery_encounter_delibirdy", "mystery_encounter_delibirdy.mp3"); - return true; - }) - .withOnVisualsStart((scene: BattleScene) => { - scene.fadeAndSwitchBgm("mystery_encounter_delibirdy"); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, DELIBIRDY_MONEY_PRICE_MULTIPLIER) // Must have money to spawn - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney, true, false); - return true; - }) - .withOptionPhase(async (scene: BattleScene) => { - // Give the player an Amulet Coin - // Check if the player has max stacks of that item already - const existing = scene.findModifier(m => m instanceof MoneyMultiplierModifier) as MoneyMultiplierModifier; + globalScene.loadBgm("mystery_encounter_delibirdy", "mystery_encounter_delibirdy.mp3"); + return true; + }) + .withOnVisualsStart(() => { + globalScene.fadeAndSwitchBgm("mystery_encounter_delibirdy"); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, DELIBIRDY_MONEY_PRICE_MULTIPLIER) // Must have money to spawn + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + updatePlayerMoney(-(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney, true, false); + return true; + }) + .withOptionPhase(async () => { + // Give the player an Amulet Coin + // Check if the player has max stacks of that item already + const existing = globalScene.findModifier(m => m instanceof MoneyMultiplierModifier) as MoneyMultiplierModifier; - if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { + if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { + // At max stacks, give the first party pokemon a Shell Bell instead + const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(globalScene.getPlayerPokemon()!, shellBell); + globalScene.playSound("item_fanfare"); + await showEncounterText( + i18next.t("battle:rewardGain", { modifierName: shellBell.name }), + null, + undefined, + true, + ); + doEventReward(); + } else { + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.AMULET_COIN)); + doEventReward(); + } + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS)) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + secondOptionPrompt: `${namespace}:option.2.select_prompt`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Get Pokemon held items and filter for valid ones + const validItems = pokemon.getHeldItems().filter(it => { + return OPTION_2_ALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable; + }); + + return validItems.map((modifier: PokemonHeldItemModifier) => { + const option: OptionSelectItem = { + label: modifier.type.name, + handler: () => { + // Pokemon and item selected + encounter.setDialogueToken("chosenItem", modifier.type.name); + encounter.misc = { + chosenPokemon: pokemon, + chosenModifier: modifier, + }; + return true; + }, + }; + return option; + }); + }; + + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon has valid item, it can be selected + const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(pokemon); + if (!meetsReqs) { + return getEncounterText(`${namespace}:invalid_selection`) ?? null; + } + + return null; + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const modifier: BerryModifier | PokemonInstantReviveModifier = encounter.misc.chosenModifier; + const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; + + // Give the player a Candy Jar if they gave a Berry, and a Berry Pouch for Reviver Seed + if (modifier instanceof BerryModifier) { + // Check if the player has max stacks of that Candy Jar already + const existing = globalScene.findModifier( + m => m instanceof LevelIncrementBoosterModifier, + ) as LevelIncrementBoosterModifier; + + if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; - await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); + const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(globalScene.getPlayerPokemon()!, shellBell); + globalScene.playSound("item_fanfare"); + await showEncounterText( + i18next.t("battle:rewardGain", { + modifierName: shellBell.name, + }), + null, + undefined, + true, + ); + doEventReward(); } else { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.AMULET_COIN)); + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.CANDY_JAR)); + doEventReward(); } + } else { + // Check if the player has max stacks of that Berry Pouch already + const existing = globalScene.findModifier(m => m instanceof PreserveBerryModifier) as PreserveBerryModifier; - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS)) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - secondOptionPrompt: `${namespace}:option.2.select_prompt`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Get Pokemon held items and filter for valid ones - const validItems = pokemon.getHeldItems().filter((it) => { - return OPTION_2_ALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable; - }); - - return validItems.map((modifier: PokemonHeldItemModifier) => { - const option: OptionSelectItem = { - label: modifier.type.name, - handler: () => { - // Pokemon and item selected - encounter.setDialogueToken("chosenItem", modifier.type.name); - encounter.misc = { - chosenPokemon: pokemon, - chosenModifier: modifier, - }; - return true; - }, - }; - return option; - }); - }; - - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon has valid item, it can be selected - const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(scene, pokemon); - if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const modifier: BerryModifier | HealingBoosterModifier = encounter.misc.chosenModifier; - - // Give the player a Candy Jar if they gave a Berry, and a Berry Pouch for Reviver Seed - if (modifier instanceof BerryModifier) { - // Check if the player has max stacks of that Candy Jar already - const existing = scene.findModifier(m => m instanceof LevelIncrementBoosterModifier) as LevelIncrementBoosterModifier; - - if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { - // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; - await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); - } else { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); - } - } else { - // Check if the player has max stacks of that Berry Pouch already - const existing = scene.findModifier(m => m instanceof PreserveBerryModifier) as PreserveBerryModifier; - - if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { - // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; - await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); - } else { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); - } - } - - // Remove the modifier if its stacks go to 0 - modifier.stackCount -= 1; - if (modifier.stackCount === 0) { - scene.removeModifier(modifier); - } - - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true)) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - secondOptionPrompt: `${namespace}:option.3.select_prompt`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Get Pokemon held items and filter for valid ones - const validItems = pokemon.getHeldItems().filter((it) => { - return !OPTION_3_DISALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable; - }); - - return validItems.map((modifier: PokemonHeldItemModifier) => { - const option: OptionSelectItem = { - label: modifier.type.name, - handler: () => { - // Pokemon and item selected - encounter.setDialogueToken("chosenItem", modifier.type.name); - encounter.misc = { - chosenPokemon: pokemon, - chosenModifier: modifier, - }; - return true; - }, - }; - return option; - }); - }; - - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon has valid item, it can be selected - const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon); - if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const modifier = encounter.misc.chosenModifier; - - // Check if the player has max stacks of Healing Charm already - const existing = scene.findModifier(m => m instanceof HealingBoosterModifier) as HealingBoosterModifier; - - if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { + if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; - await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); + const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(globalScene.getPlayerPokemon()!, shellBell); + globalScene.playSound("item_fanfare"); + await showEncounterText( + i18next.t("battle:rewardGain", { + modifierName: shellBell.name, + }), + null, + undefined, + true, + ); + doEventReward(); } else { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.BERRY_POUCH)); + doEventReward(); + } + } + + chosenPokemon.loseHeldItem(modifier, false); + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true)) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + secondOptionPrompt: `${namespace}:option.3.select_prompt`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Get Pokemon held items and filter for valid ones + const validItems = pokemon.getHeldItems().filter(it => { + return ( + !OPTION_3_DISALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem) && it.isTransferable + ); + }); + + return validItems.map((modifier: PokemonHeldItemModifier) => { + const option: OptionSelectItem = { + label: modifier.type.name, + handler: () => { + // Pokemon and item selected + encounter.setDialogueToken("chosenItem", modifier.type.name); + encounter.misc = { + chosenPokemon: pokemon, + chosenModifier: modifier, + }; + return true; + }, + }; + return option; + }); + }; + + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon has valid item, it can be selected + const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(pokemon); + if (!meetsReqs) { + return getEncounterText(`${namespace}:invalid_selection`) ?? null; } - // Remove the modifier if its stacks go to 0 - modifier.stackCount -= 1; - if (modifier.stackCount === 0) { - scene.removeModifier(modifier); - } + return null; + }; - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .build(); + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const modifier = encounter.misc.chosenModifier; + const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; + + // Check if the player has max stacks of Healing Charm already + const existing = globalScene.findModifier(m => m instanceof HealingBoosterModifier) as HealingBoosterModifier; + + if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { + // At max stacks, give the first party pokemon a Shell Bell instead + const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(globalScene.getPlayerParty()[0], shellBell); + globalScene.playSound("item_fanfare"); + await showEncounterText( + i18next.t("battle:rewardGain", { modifierName: shellBell.name }), + null, + undefined, + true, + ); + doEventReward(); + } else { + globalScene.unshiftPhase(new ModifierRewardPhase(modifierTypes.HEALING_CHARM)); + doEventReward(); + } + + chosenPokemon.loseHeldItem(modifier, false); + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts index 10034d19263..9b8e2e24d12 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -2,14 +2,13 @@ import { leaveEncounterWithoutBattle, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { ModifierTypeFunc, modifierTypes } from "#app/modifier/modifier-type"; +import type { ModifierTypeFunc } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { - MysteryEncounterBuilder, -} from "#app/data/mystery-encounters/mystery-encounter"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; @@ -21,145 +20,158 @@ const namespace = "mysteryEncounters/departmentStoreSale"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3797 | GitHub Issue #3797} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DepartmentStoreSaleEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100) - .withIntroSpriteConfigs([ - { - spriteKey: "department_store_sale_lady", - fileRoot: "mystery-encounters", - hasShadow: true, - x: -20, - }, - { - spriteKey: "", - fileRoot: "", - species: Species.FURFROU, - hasShadow: true, - repeat: true, - x: 30, - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .withAutoHideIntroVisuals(false) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - }, - async (scene: BattleScene) => { - // Choose TMs - const modifiers: ModifierTypeFunc[] = []; - let i = 0; - while (i < 5) { - // 2/2/1 weight on TM rarity - const roll = randSeedInt(5); - if (roll < 2) { - modifiers.push(modifierTypes.TM_COMMON); - } else if (roll < 4) { - modifiers.push(modifierTypes.TM_GREAT); - } else { - modifiers.push(modifierTypes.TM_ULTRA); - } - i++; +export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.DEPARTMENT_STORE_SALE, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100) + .withIntroSpriteConfigs([ + { + spriteKey: "department_store_sale_lady", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -20, + }, + { + spriteKey: "", + fileRoot: "", + species: Species.FURFROU, + hasShadow: true, + repeat: true, + x: 30, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .withAutoHideIntroVisuals(false) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + }, + async () => { + // Choose TMs + const modifiers: ModifierTypeFunc[] = []; + let i = 0; + while (i < 5) { + // 2/2/1 weight on TM rarity + const roll = randSeedInt(5); + if (roll < 2) { + modifiers.push(modifierTypes.TM_COMMON); + } else if (roll < 4) { + modifiers.push(modifierTypes.TM_GREAT); + } else { + modifiers.push(modifierTypes.TM_ULTRA); } - - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); - leaveEncounterWithoutBattle(scene); + i++; } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - }, - async (scene: BattleScene) => { - // Choose Vitamins - const modifiers: ModifierTypeFunc[] = []; - let i = 0; - while (i < 3) { - // 2/1 weight on base stat booster vs PP Up - const roll = randSeedInt(3); - if (roll === 0) { - modifiers.push(modifierTypes.PP_UP); - } else { - modifiers.push(modifierTypes.BASE_STAT_BOOSTER); - } - i++; + + setEncounterRewards({ + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + }, + async () => { + // Choose Vitamins + const modifiers: ModifierTypeFunc[] = []; + let i = 0; + while (i < 3) { + // 2/1 weight on base stat booster vs PP Up + const roll = randSeedInt(3); + if (roll === 0) { + modifiers.push(modifierTypes.PP_UP); + } else { + modifiers.push(modifierTypes.BASE_STAT_BOOSTER); } - - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); - leaveEncounterWithoutBattle(scene); + i++; } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - }, - async (scene: BattleScene) => { - // Choose X Items - const modifiers: ModifierTypeFunc[] = []; - let i = 0; - while (i < 5) { - // 4/1 weight on base stat booster vs Dire Hit - const roll = randSeedInt(5); - if (roll === 0) { - modifiers.push(modifierTypes.DIRE_HIT); - } else { - modifiers.push(modifierTypes.TEMP_STAT_STAGE_BOOSTER); - } - i++; + + setEncounterRewards({ + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + }, + async () => { + // Choose X Items + const modifiers: ModifierTypeFunc[] = []; + let i = 0; + while (i < 5) { + // 4/1 weight on base stat booster vs Dire Hit + const roll = randSeedInt(5); + if (roll === 0) { + modifiers.push(modifierTypes.DIRE_HIT); + } else { + modifiers.push(modifierTypes.TEMP_STAT_STAGE_BOOSTER); } - - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); - leaveEncounterWithoutBattle(scene); + i++; } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.4.label`, - buttonTooltip: `${namespace}:option.4.tooltip`, - }, - async (scene: BattleScene) => { - // Choose Pokeballs - const modifiers: ModifierTypeFunc[] = []; - let i = 0; - while (i < 4) { - // 10/30/20/5 weight on pokeballs - const roll = randSeedInt(65); - if (roll < 10) { - modifiers.push(modifierTypes.POKEBALL); - } else if (roll < 40) { - modifiers.push(modifierTypes.GREAT_BALL); - } else if (roll < 60) { - modifiers.push(modifierTypes.ULTRA_BALL); - } else { - modifiers.push(modifierTypes.ROGUE_BALL); - } - i++; + + setEncounterRewards({ + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.4.label`, + buttonTooltip: `${namespace}:option.4.tooltip`, + }, + async () => { + // Choose Pokeballs + const modifiers: ModifierTypeFunc[] = []; + let i = 0; + while (i < 4) { + // 10/30/20/5 weight on pokeballs + const roll = randSeedInt(65); + if (roll < 10) { + modifiers.push(modifierTypes.POKEBALL); + } else if (roll < 40) { + modifiers.push(modifierTypes.GREAT_BALL); + } else if (roll < 60) { + modifiers.push(modifierTypes.ULTRA_BALL); + } else { + modifiers.push(modifierTypes.ROGUE_BALL); } + i++; + } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); - leaveEncounterWithoutBattle(scene); - } - ) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - } - ]) - .build(); + setEncounterRewards({ + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index bf5fb28163b..a1964aa5ab4 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -1,12 +1,19 @@ -import { MoveCategory } from "#app/data/move"; +import { MoveCategory } from "#enums/MoveCategory"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { + generateModifierTypeOption, + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterExp, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { Stat } from "#enums/stat"; @@ -21,183 +28,190 @@ const namespace = "mysteryEncounters/fieldTrip"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3794 | GitHub Issue #3794} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FieldTripEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIELD_TRIP) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100) - .withIntroSpriteConfigs([ - { - spriteKey: "preschooler_m", - fileRoot: "trainer", - hasShadow: true, - }, - { - spriteKey: "field_trip_teacher", - fileRoot: "mystery-encounters", - hasShadow: true, - }, - { - spriteKey: "preschooler_f", - fileRoot: "trainer", - hasShadow: true, - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .withAutoHideIntroVisuals(false) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - secondOptionPrompt: `${namespace}:second_option_prompt`, - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for Pokemon move valid for this option - return pokemon.moveset.map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and move selected - encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:physical`)); - pokemonAndMoveChosen(scene, pokemon, move, MoveCategory.PHYSICAL); - return true; - }, - }; - return option; - }); - }; +export const FieldTripEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FIELD_TRIP, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[0], 100) + .withIntroSpriteConfigs([ + { + spriteKey: "preschooler_m", + fileRoot: "trainer", + hasShadow: true, + }, + { + spriteKey: "field_trip_teacher", + fileRoot: "mystery-encounters", + hasShadow: true, + }, + { + spriteKey: "preschooler_f", + fileRoot: "trainer", + hasShadow: true, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .withAutoHideIntroVisuals(false) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + secondOptionPrompt: `${namespace}:second_option_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:physical`)); + pokemonAndMoveChosen(pokemon, move, MoveCategory.PHYSICAL); + return true; + }, + }; + return option; + }); + }; - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - if (encounter.misc.correctMove) { - const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.ATK ])!, - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.DEF ])!, - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPD ])!, - generateModifierTypeOption(scene, modifierTypes.DIRE_HIT)!, - generateModifierTypeOption(scene, modifierTypes.RARER_CANDY)!, - ]; + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + if (encounter.misc.correctMove) { + const modifiers = [ + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.ATK])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.DEF])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPD])!, + generateModifierTypeOption(modifierTypes.DIRE_HIT)!, + generateModifierTypeOption(modifierTypes.RARER_CANDY)!, + ]; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); - } + setEncounterRewards({ + guaranteedModifierTypeOptions: modifiers, + fillRemaining: false, + }); + } - leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - secondOptionPrompt: `${namespace}:second_option_prompt`, - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for Pokemon move valid for this option - return pokemon.moveset.map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and move selected - encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:special`)); - pokemonAndMoveChosen(scene, pokemon, move, MoveCategory.SPECIAL); - return true; - }, - }; - return option; - }); - }; + leaveEncounterWithoutBattle(!encounter.misc.correctMove); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + secondOptionPrompt: `${namespace}:second_option_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:special`)); + pokemonAndMoveChosen(pokemon, move, MoveCategory.SPECIAL); + return true; + }, + }; + return option; + }); + }; - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - if (encounter.misc.correctMove) { - const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPATK ])!, - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPDEF ])!, - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPD ])!, - generateModifierTypeOption(scene, modifierTypes.DIRE_HIT)!, - generateModifierTypeOption(scene, modifierTypes.RARER_CANDY)!, - ]; + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + if (encounter.misc.correctMove) { + const modifiers = [ + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPATK])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPDEF])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPD])!, + generateModifierTypeOption(modifierTypes.DIRE_HIT)!, + generateModifierTypeOption(modifierTypes.RARER_CANDY)!, + ]; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); - } + setEncounterRewards({ + guaranteedModifierTypeOptions: modifiers, + fillRemaining: false, + }); + } - leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - secondOptionPrompt: `${namespace}:second_option_prompt`, - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for Pokemon move valid for this option - return pokemon.moveset.map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and move selected - encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:status`)); - pokemonAndMoveChosen(scene, pokemon, move, MoveCategory.STATUS); - return true; - }, - }; - return option; - }); - }; + leaveEncounterWithoutBattle(!encounter.misc.correctMove); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + secondOptionPrompt: `${namespace}:second_option_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + encounter.setDialogueToken("moveCategory", i18next.t(`${namespace}:status`)); + pokemonAndMoveChosen(pokemon, move, MoveCategory.STATUS); + return true; + }, + }; + return option; + }); + }; - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - if (encounter.misc.correctMove) { - const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.ACC ])!, - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_STAGE_BOOSTER, [ Stat.SPD ])!, - generateModifierTypeOption(scene, modifierTypes.GREAT_BALL)!, - generateModifierTypeOption(scene, modifierTypes.IV_SCANNER)!, - generateModifierTypeOption(scene, modifierTypes.RARER_CANDY)!, - ]; + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + if (encounter.misc.correctMove) { + const modifiers = [ + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.ACC])!, + generateModifierTypeOption(modifierTypes.TEMP_STAT_STAGE_BOOSTER, [Stat.SPD])!, + generateModifierTypeOption(modifierTypes.GREAT_BALL)!, + generateModifierTypeOption(modifierTypes.IV_SCANNER)!, + generateModifierTypeOption(modifierTypes.RARER_CANDY)!, + ]; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); - } + setEncounterRewards({ + guaranteedModifierTypeOptions: modifiers, + fillRemaining: false, + }); + } - leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); - }) - .build() - ) - .build(); + leaveEncounterWithoutBattle(!encounter.misc.correctMove); + }) + .build(), + ) + .build(); -function pokemonAndMoveChosen(scene: BattleScene, pokemon: PlayerPokemon, move: PokemonMove, correctMoveCategory: MoveCategory) { - const encounter = scene.currentBattle.mysteryEncounter!; +function pokemonAndMoveChosen(pokemon: PlayerPokemon, move: PokemonMove, correctMoveCategory: MoveCategory) { + const encounter = globalScene.currentBattle.mysteryEncounter!; const correctMove = move.getMove().category === correctMoveCategory; encounter.setDialogueToken("pokeName", pokemon.getNameToRender()); encounter.setDialogueToken("move", move.getName()); @@ -214,7 +228,10 @@ function pokemonAndMoveChosen(scene: BattleScene, pokemon: PlayerPokemon, move: text: `${namespace}:incorrect_exp`, }, ]; - setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); + setEncounterExp( + globalScene.getPlayerParty().map(p => p.id), + 50, + ); } else { encounter.selectedOption!.dialogue!.selected = [ { @@ -228,7 +245,7 @@ function pokemonAndMoveChosen(scene: BattleScene, pokemon: PlayerPokemon, move: text: `${namespace}:correct_exp`, }, ]; - setEncounterExp(scene, [ pokemon.id ], 100); + setEncounterExp([pokemon.id], 100); } encounter.misc = { correctMove: correctMove, diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 5c16e5d8564..d9bd6983d97 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -1,23 +1,43 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { EnemyPartyConfig, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { AttackTypeBoosterModifierType, modifierTypes, } from "#app/modifier/modifier-type"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initBattleWithEnemyConfig, + loadCustomMovesForEncounter, + leaveEncounterWithoutBattle, + setEncounterExp, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + generateModifierType, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; -import { AbilityRequirement, CombinationPokemonRequirement, TypeRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { + AbilityRequirement, + CombinationPokemonRequirement, + TypeRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { Species } from "#enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Gender } from "#app/data/gender"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { BattlerIndex } from "#app/battle"; -import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import { Moves } from "#enums/moves"; import { EncounterBattleAnim } from "#app/data/battle-anims"; -import { WeatherType } from "#app/data/weather"; +import { WeatherType } from "#enums/weather-type"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; -import { StatusEffect } from "#app/data/status-effect"; +import { StatusEffect } from "#enums/status-effect"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { applyAbilityOverrideToPokemon, applyDamageToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + applyAbilityOverrideToPokemon, + applyDamageToPokemon, + applyModifierTypeToPlayerPokemon, +} 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 { EncounterAnim } from "#enums/encounter-anims"; @@ -44,231 +64,247 @@ const DAMAGE_PERCENTAGE: number = 20; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3814 | GitHub Issue #3814} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FieryFalloutEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIERY_FALLOUT) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(40, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withCatchAllowed(true) - .withIntroSpriteConfigs([]) // Set in onInit() - .withAnimations(EncounterAnim.MAGMA_BG, EncounterAnim.MAGMA_SPOUT) - .withAutoHideIntroVisuals(false) - .withFleeAllowed(false) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FIERY_FALLOUT, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(40, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withCatchAllowed(true) + .withIntroSpriteConfigs([]) // Set in onInit() + .withAnimations(EncounterAnim.MAGMA_BG, EncounterAnim.MAGMA_SPOUT) + .withAutoHideIntroVisuals(false) + .withFleeAllowed(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mons - const volcaronaSpecies = getPokemonSpecies(Species.VOLCARONA); - const config: EnemyPartyConfig = { - pokemonConfigs: [ - { - species: volcaronaSpecies, - isBoss: false, - gender: Gender.MALE, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPDEF, Stat.SPD ], 1)); - } - }, - { - species: volcaronaSpecies, - isBoss: false, - gender: Gender.FEMALE, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPDEF, Stat.SPD ], 1)); - } - } - ], - doubleBattle: true, - disableSwitch: true, - }; - encounter.enemyPartyConfigs = [ config ]; - - // Load hidden Volcarona sprites - encounter.spriteConfigs = [ + // Calculate boss mons + const volcaronaSpecies = getPokemonSpecies(Species.VOLCARONA); + const config: EnemyPartyConfig = { + pokemonConfigs: [ { - spriteKey: "", - fileRoot: "", - species: Species.VOLCARONA, - repeat: true, - hidden: true, - hasShadow: true, - x: -20, - startFrame: 20 + species: volcaronaSpecies, + isBoss: false, + gender: Gender.MALE, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.SPDEF, Stat.SPD], 1), + ); + }, }, { - spriteKey: "", - fileRoot: "", - species: Species.VOLCARONA, - repeat: true, - hidden: true, - hasShadow: true, - x: 20 + species: volcaronaSpecies, + isBoss: false, + gender: Gender.FEMALE, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.SPDEF, Stat.SPD], 1), + ); + }, }, - ]; + ], + doubleBattle: true, + disableSwitch: true, + }; + encounter.enemyPartyConfigs = [config]; - // Load animations/sfx for Volcarona moves - loadCustomMovesForEncounter(scene, [ Moves.FIRE_SPIN, Moves.QUIVER_DANCE ]); - - scene.arena.trySetWeather(WeatherType.SUNNY, true); - - encounter.setDialogueToken("volcaronaName", getPokemonSpecies(Species.VOLCARONA).getName()); - - return true; - }) - .withOnVisualsStart((scene: BattleScene) => { - // Play animations - const background = new EncounterBattleAnim(EncounterAnim.MAGMA_BG, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); - background.playWithoutTargets(scene, 200, 70, 2, 3); - const animation = new EncounterBattleAnim(EncounterAnim.MAGMA_SPOUT, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); - animation.playWithoutTargets(scene, 80, 100, 2); - scene.time.delayedCall(600, () => { - animation.playWithoutTargets(scene, -20, 100, 2); - }); - scene.time.delayedCall(1200, () => { - animation.playWithoutTargets(scene, 140, 150, 2); - }); - - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( + // Load hidden Volcarona sprites + encounter.spriteConfigs = [ { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, + spriteKey: "", + fileRoot: "", + species: Species.VOLCARONA, + repeat: true, + hidden: true, + hasShadow: true, + x: -20, + startFrame: 20, + }, + { + spriteKey: "", + fileRoot: "", + species: Species.VOLCARONA, + repeat: true, + hidden: true, + hasShadow: true, + x: 20, + }, + ]; + + // Load animations/sfx for Volcarona moves + loadCustomMovesForEncounter([Moves.FIRE_SPIN, Moves.QUIVER_DANCE]); + + globalScene.arena.trySetWeather(WeatherType.SUNNY, true); + + encounter.setDialogueToken("volcaronaName", getPokemonSpecies(Species.VOLCARONA).getName()); + + return true; + }) + .withOnVisualsStart(() => { + // Play animations + const background = new EncounterBattleAnim( + EncounterAnim.MAGMA_BG, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + background.playWithoutTargets(200, 70, 2, 3); + const animation = new EncounterBattleAnim( + EncounterAnim.MAGMA_SPOUT, + globalScene.getPlayerPokemon()!, + globalScene.getPlayerPokemon(), + ); + animation.playWithoutTargets(80, 100, 2); + globalScene.time.delayedCall(600, () => { + animation.playWithoutTargets(-20, 100, 2); + }); + globalScene.time.delayedCall(1200, () => { + animation.playWithoutTargets(140, 150, 2); + }); + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + setEncounterRewards({ fillRemaining: true }, undefined, () => giveLeadPokemonAttackTypeBoostItem()); + + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.FIRE_SPIN), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER_2], + move: new PokemonMove(Moves.FIRE_SPIN), + ignorePp: true, + }, + ); + await initBattleWithEnemyConfig(globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Damage non-fire types and burn 1 random non-fire type member + give it Heatproof + const encounter = globalScene.currentBattle.mysteryEncounter!; + const nonFireTypes = globalScene + .getPlayerParty() + .filter(p => p.isAllowedInBattle() && !p.getTypes().includes(PokemonType.FIRE)); + + for (const pkm of nonFireTypes) { + const percentage = DAMAGE_PERCENTAGE / 100; + const damage = Math.floor(pkm.getMaxHp() * percentage); + applyDamageToPokemon(pkm, damage); + } + + // Burn random member + const burnable = nonFireTypes.filter( + p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status.effect) || p.status.effect === StatusEffect.NONE, + ); + if (burnable?.length > 0) { + const roll = randSeedInt(burnable.length); + const chosenPokemon = burnable[roll]; + if (chosenPokemon.trySetStatus(StatusEffect.BURN)) { + // Burn applied + encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender()); + encounter.setDialogueToken("abilityName", new Ability(Abilities.HEATPROOF, 3).name); + queueEncounterMessage(`${namespace}:option.2.target_burned`); + + // Also permanently change the burned Pokemon's ability to Heatproof + applyAbilityOverrideToPokemon(chosenPokemon, Abilities.HEATPROOF); + } + } + + // No rewards + leaveEncounterWithoutBattle(true); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + new TypeRequirement(PokemonType.FIRE, true, 1), + new AbilityRequirement(FIRE_RESISTANT_ABILITIES, true), + ), + ) // Will set option3PrimaryName dialogue token automatically + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, selected: [ { - text: `${namespace}:option.1.selected`, + text: `${namespace}:option.3.selected`, }, ], - }, - async (scene: BattleScene) => { - // Pick battle - const encounter = scene.currentBattle.mysteryEncounter!; - setEncounterRewards(scene, { fillRemaining: true }, undefined, () => giveLeadPokemonAttackTypeBoostItem(scene)); + }) + .withPreOptionPhase(async () => { + // Do NOT await this, to prevent player from repeatedly pressing options + transitionMysteryEncounterIntroVisuals(false, false, 2000); + }) + .withOptionPhase(async () => { + // Fire types help calm the Volcarona + const encounter = globalScene.currentBattle.mysteryEncounter!; + await transitionMysteryEncounterIntroVisuals(); + setEncounterRewards({ fillRemaining: true }, undefined, () => { + giveLeadPokemonAttackTypeBoostItem(); + }); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.FIRE_SPIN), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [ BattlerIndex.PLAYER_2 ], - move: new PokemonMove(Moves.FIRE_SPIN), - ignorePp: true - }); - await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Damage non-fire types and burn 1 random non-fire type member + give it Heatproof - const encounter = scene.currentBattle.mysteryEncounter!; - const nonFireTypes = scene.getParty().filter((p) => p.isAllowedInBattle() && !p.getTypes().includes(Type.FIRE)); + const primary = encounter.options[2].primaryPokemon!; - for (const pkm of nonFireTypes) { - const percentage = DAMAGE_PERCENTAGE / 100; - const damage = Math.floor(pkm.getMaxHp() * percentage); - applyDamageToPokemon(scene, pkm, damage); - } + setEncounterExp([primary.id], getPokemonSpecies(Species.VOLCARONA).baseExp * 2); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .build(); - // Burn random member - const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status.effect) || p.status.effect === StatusEffect.NONE); - if (burnable?.length > 0) { - const roll = randSeedInt(burnable.length); - const chosenPokemon = burnable[roll]; - if (chosenPokemon.trySetStatus(StatusEffect.BURN)) { - // Burn applied - encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender()); - encounter.setDialogueToken("abilityName", new Ability(Abilities.HEATPROOF, 3).name); - queueEncounterMessage(scene, `${namespace}:option.2.target_burned`); - - // Also permanently change the burned Pokemon's ability to Heatproof - applyAbilityOverrideToPokemon(chosenPokemon, Abilities.HEATPROOF); - } - } - - // No rewards - leaveEncounterWithoutBattle(scene, true); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement( - CombinationPokemonRequirement.Some( - new TypeRequirement(Type.FIRE, true, 1), - new AbilityRequirement(FIRE_RESISTANT_ABILITIES, true) - ) - ) // Will set option3PrimaryName dialogue token automatically - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Do NOT await this, to prevent player from repeatedly pressing options - transitionMysteryEncounterIntroVisuals(scene, false, false, 2000); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Fire types help calm the Volcarona - const encounter = scene.currentBattle.mysteryEncounter!; - await transitionMysteryEncounterIntroVisuals(scene); - setEncounterRewards(scene, - { fillRemaining: true }, - undefined, - () => { - giveLeadPokemonAttackTypeBoostItem(scene); - }); - - const primary = encounter.options[2].primaryPokemon!; - - setEncounterExp(scene, [ primary.id ], getPokemonSpecies(Species.VOLCARONA).baseExp * 2); - leaveEncounterWithoutBattle(scene); - }) - .build() - ) - .build(); - -function giveLeadPokemonAttackTypeBoostItem(scene: BattleScene) { +function giveLeadPokemonAttackTypeBoostItem() { // Give first party pokemon attack type boost item for free at end of battle - const leadPokemon = scene.getParty()?.[0]; + const leadPokemon = globalScene.getPlayerParty()?.[0]; if (leadPokemon) { // Generate type booster held item, default to Charcoal if item fails to generate - let boosterModifierType = generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER) as AttackTypeBoosterModifierType; + let boosterModifierType = generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER) as AttackTypeBoosterModifierType; if (!boosterModifierType) { - boosterModifierType = generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.FIRE ]) as AttackTypeBoosterModifierType; + boosterModifierType = generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ + PokemonType.FIRE, + ]) as AttackTypeBoosterModifierType; } - applyModifierTypeToPlayerPokemon(scene, leadPokemon, boosterModifierType); + applyModifierTypeToPlayerPokemon(leadPokemon, boosterModifierType); - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; encounter.setDialogueToken("itemName", boosterModifierType.name); encounter.setDialogueToken("leadPokemon", leadPokemon.getNameToRender()); - queueEncounterMessage(scene, `${namespace}:found_item`); + queueEncounterMessage(`${namespace}:found_item`); } } 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 889868519d2..595d13cf727 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -1,28 +1,33 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { - EnemyPartyConfig, + getRandomEncounterSpecies, initBattleWithEnemyConfig, - leaveEncounterWithoutBattle, setEncounterExp, - setEncounterRewards + leaveEncounterWithoutBattle, + setEncounterExp, + setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { ModifierTier } from "#app/modifier/modifier-tier"; +import type { ModifierTypeOption } from "#app/modifier/modifier-type"; import { - getPartyLuckValue, getPlayerModifierTypeOptions, ModifierPoolType, - ModifierTypeOption, regenerateModifierPoolThresholds, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { TrainerSlot } from "#app/data/trainer-config"; -import { getEncounterPokemonLevelForWave, getSpriteKeysFromPokemon, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + getEncounterPokemonLevelForWave, + getSpriteKeysFromPokemon, + STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import PokemonData from "#app/system/pokemon-data"; import { BattlerTagType } from "#enums/battler-tag-type"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -38,151 +43,163 @@ const namespace = "mysteryEncounters/fightOrFlight"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3795 | GitHub Issue #3795} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FightOrFlightEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIGHT_OR_FLIGHT) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FIGHT_OR_FLIGHT, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - const level = getEncounterPokemonLevelForWave(scene, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); - encounter.setDialogueToken("enemyPokemon", bossPokemon.getNameToRender()); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + // Calculate boss mon + const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); + const bossPokemon = getRandomEncounterSpecies(level, true); + encounter.setDialogueToken("enemyPokemon", bossPokemon.getNameToRender()); + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { level: level, - species: bossSpecies, + species: bossPokemon.species, dataSource: new PokemonData(bossPokemon), isBoss: true, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:option.1.stat_boost`); + queueEncounterMessage(`${namespace}:option.1.stat_boost`); // Randomly boost 1 stat 2 stages // Cannot boost Spd, Acc, or Evasion - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ randSeedInt(4, 1) ], 2)); - } - }], - }; - encounter.enemyPartyConfigs = [ config ]; - - // Calculate item - // Waves 10-40 GREAT, 60-120 ULTRA, 120-160 ROGUE, 160-180 MASTER - const tier = - scene.currentBattle.waveIndex > 160 - ? ModifierTier.MASTER - : scene.currentBattle.waveIndex > 120 - ? ModifierTier.ROGUE - : scene.currentBattle.waveIndex > 40 - ? ModifierTier.ULTRA - : ModifierTier.GREAT; - regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); - let item: ModifierTypeOption | null = null; - // TMs and Candy Jar excluded from possible rewards as they're too swingy in value for a singular item reward - while (!item || item.type.id.includes("TM_") || item.type.id === "CANDY_JAR") { - item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [ tier ], allowLuckUpgrades: false })[0]; - } - encounter.setDialogueToken("itemName", item.type.name); - encounter.misc = item; - - const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); - encounter.spriteConfigs = [ - { - spriteKey: item.type.iconImage, - fileRoot: "items", - hasShadow: false, - x: 35, - y: -5, - scale: 0.75, - isItem: true, - disableAnimation: true + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, [randSeedInt(4, 1)], 2)); + }, }, - { - spriteKey: spriteKey, - fileRoot: fileRoot, - hasShadow: true, - tint: 0.25, - x: -5, - repeat: true, - isPokemon: true - }, - ]; + ], + }; + encounter.enemyPartyConfigs = [config]; + // Calculate item + // Waves 10-40 GREAT, 60-120 ULTRA, 120-160 ROGUE, 160-180 MASTER + const tier = + globalScene.currentBattle.waveIndex > 160 + ? ModifierTier.MASTER + : globalScene.currentBattle.waveIndex > 120 + ? ModifierTier.ROGUE + : globalScene.currentBattle.waveIndex > 40 + ? ModifierTier.ULTRA + : ModifierTier.GREAT; + regenerateModifierPoolThresholds(globalScene.getPlayerParty(), ModifierPoolType.PLAYER, 0); + let item: ModifierTypeOption | null = null; + // TMs and Candy Jar excluded from possible rewards as they're too swingy in value for a singular item reward + while (!item || item.type.id.includes("TM_") || item.type.id === "CANDY_JAR") { + item = getPlayerModifierTypeOptions(1, globalScene.getPlayerParty(), [], { + guaranteedModifierTiers: [tier], + allowLuckUpgrades: false, + })[0]; + } + encounter.setDialogueToken("itemName", item.type.name); + encounter.misc = item; + + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); + encounter.spriteConfigs = [ + { + spriteKey: item.type.iconImage, + fileRoot: "items", + hasShadow: false, + x: 35, + y: -5, + scale: 0.75, + isItem: true, + disableAnimation: true, + }, + { + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + tint: 0.25, + x: -5, + repeat: true, + isPokemon: true, + isShiny: bossPokemon.shiny, + variant: bossPokemon.variant, + }, + ]; + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle + // Pokemon will randomly boost 1 stat by 2 stages + const item = globalScene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption; + setEncounterRewards({ + guaranteedModifierTypeOptions: [item], + fillRemaining: false, + }); + await initBattleWithEnemyConfig(globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withOptionPhase(async () => { + // Pick steal + const encounter = globalScene.currentBattle.mysteryEncounter!; + const item = globalScene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption; + setEncounterRewards({ + guaranteedModifierTypeOptions: [item], + fillRemaining: false, + }); + + // Use primaryPokemon to execute the thievery + const primaryPokemon = encounter.options[1].primaryPokemon!; + setEncounterExp(primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Pick battle - // Pokemon will randomly boost 1 stat by 2 stages - const item = scene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [ item ], fillRemaining: false }); - await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected` - } - ] - }) - .withOptionPhase(async (scene: BattleScene) => { - // Pick steal - const encounter = scene.currentBattle.mysteryEncounter!; - const item = scene.currentBattle.mysteryEncounter!.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [ item ], fillRemaining: false }); - - // Use primaryPokemon to execute the thievery - const primaryPokemon = encounter.options[1].primaryPokemon!; - setEncounterExp(scene, primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); - leaveEncounterWithoutBattle(scene); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + }, + ) + .build(); 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 b843a929c08..c95810b94d0 100644 --- a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts +++ b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts @@ -1,10 +1,19 @@ -import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { TrainerSlot } from "#app/data/trainer-config"; -import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { FieldPosition } from "#app/field/pokemon"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -32,66 +41,65 @@ const namespace = "mysteryEncounters/funAndGames"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3819 | GitHub Issue #3819} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FunAndGamesEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FUN_AND_GAMES) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, 1.5)) // Cost equal to 1 Max Potion to play - .withAutoHideIntroVisuals(false) - // Allows using move without a visible enemy pokemon - .withBattleAnimationsWithoutTargets(true) - // The Wobbuffet won't use moves - .withSkipEnemyBattleTurns(true) - // Will skip COMMAND selection menu and go straight to FIGHT (move select) menu - .withSkipToFightInput(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: "fun_and_games_game", - fileRoot: "mystery-encounters", - hasShadow: false, - x: 0, - y: 6, - }, - { - spriteKey: "fun_and_games_wobbuffet", - fileRoot: "mystery-encounters", - hasShadow: true, - x: -28, - y: 6, - yShadow: 6 - }, - { - spriteKey: "fun_and_games_man", - fileRoot: "mystery-encounters", - hasShadow: true, - x: 40, - y: 6, - yShadow: 6 - }, - ]) - .withIntroDialogue([ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - scene.loadBgm("mystery_encounter_fun_and_games", "mystery_encounter_fun_and_games.mp3"); - encounter.setDialogueToken("wobbuffetName", getPokemonSpecies(Species.WOBBUFFET).getName()); - return true; - }) - .withOnVisualsStart((scene: BattleScene) => { - scene.fadeAndSwitchBgm("mystery_encounter_fun_and_games"); - return true; - }) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) +export const FunAndGamesEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FUN_AND_GAMES, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, 1.5)) // Cost equal to 1 Max Potion to play + .withAutoHideIntroVisuals(false) + // The Wobbuffet won't use moves + .withSkipEnemyBattleTurns(true) + // Will skip COMMAND selection menu and go straight to FIGHT (move select) menu + .withSkipToFightInput(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: "fun_and_games_game", + fileRoot: "mystery-encounters", + hasShadow: false, + x: 0, + y: 6, + }, + { + spriteKey: "fun_and_games_wobbuffet", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -28, + y: 6, + yShadow: 6, + }, + { + spriteKey: "fun_and_games_man", + fileRoot: "mystery-encounters", + hasShadow: true, + x: 40, + y: 6, + yShadow: 6, + }, + ]) + .withIntroDialogue([ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + globalScene.loadBgm("mystery_encounter_fun_and_games", "mystery_encounter_fun_and_games.mp3"); + encounter.setDialogueToken("wobbuffetName", getPokemonSpecies(Species.WOBBUFFET).getName()); + return true; + }) + .withOnVisualsStart(() => { + globalScene.fadeAndSwitchBgm("mystery_encounter_fun_and_games"); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneRequirement(new MoneyRequirement(0, 1.5)) // Cost equal to 1 Max Potion .withDialogue({ buttonLabel: `${namespace}:option.1.label`, @@ -102,9 +110,9 @@ export const FunAndGamesEncounter: MysteryEncounter = }, ], }) - .withPreOptionPhase(async (scene: BattleScene) => { + .withPreOptionPhase(async () => { // Select Pokemon for minigame - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; const onPokemonSelected = (pokemon: PlayerPokemon) => { encounter.misc = { playerPokemon: pokemon, @@ -113,59 +121,64 @@ export const FunAndGamesEncounter: MysteryEncounter = // Only Pokemon that are not KOed/legal can be selected const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}:invalid_selection`); + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); }; - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); }) - .withOptionPhase(async (scene: BattleScene) => { + .withOptionPhase(async () => { // Start minigame - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; encounter.misc.turnsRemaining = 3; // Update money const moneyCost = (encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney; - updatePlayerMoney(scene, -moneyCost, true, false); - await showEncounterText(scene, i18next.t("mysteryEncounterMessages:paid_money", { amount: moneyCost })); + updatePlayerMoney(-moneyCost, true, false); + await showEncounterText( + i18next.t("mysteryEncounterMessages:paid_money", { + amount: moneyCost, + }), + ); // Handlers for battle events encounter.onTurnStart = handleNextTurn; // triggered during TurnInitPhase encounter.doContinueEncounter = handleLoseMinigame; // triggered during MysteryEncounterRewardsPhase, post VictoryPhase if the player KOs Wobbuffet - hideShowmanIntroSprite(scene); - await summonPlayerPokemon(scene); - await showWobbuffetHealthBar(scene); + hideShowmanIntroSprite(); + await summonPlayerPokemon(); + await showWobbuffetHealthBar(); return true; }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - await transitionMysteryEncounterIntroVisuals(scene, true, true); - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + await transitionMysteryEncounterIntroVisuals(true, true); + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); -async function summonPlayerPokemon(scene: BattleScene) { +async function summonPlayerPokemon() { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor return new Promise(async resolve => { - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; const playerPokemon = encounter.misc.playerPokemon; // Swaps the chosen Pokemon and the first player's lead Pokemon in the party - const party = scene.getParty(); + const party = globalScene.getPlayerParty(); const chosenIndex = party.indexOf(playerPokemon); if (chosenIndex !== 0) { const leadPokemon = party[0]; @@ -175,36 +188,48 @@ async function summonPlayerPokemon(scene: BattleScene) { // Do trainer summon animation let playerAnimationPromise: Promise | undefined; - scene.ui.showText(i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(playerPokemon) })); - scene.pbTray.hide(); - scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); - scene.time.delayedCall(562, () => { - scene.trainer.setFrame("2"); - scene.time.delayedCall(64, () => { - scene.trainer.setFrame("3"); + globalScene.ui.showText( + i18next.t("battle:playerGo", { + pokemonName: getPokemonNameWithAffix(playerPokemon), + }), + ); + globalScene.pbTray.hide(); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); + globalScene.time.delayedCall(562, () => { + globalScene.trainer.setFrame("2"); + globalScene.time.delayedCall(64, () => { + globalScene.trainer.setFrame("3"); }); }); - scene.tweens.add({ - targets: scene.trainer, + globalScene.tweens.add({ + targets: globalScene.trainer, x: -36, duration: 1000, - onComplete: () => scene.trainer.setVisible(false) + onComplete: () => globalScene.trainer.setVisible(false), }); - scene.time.delayedCall(750, () => { - playerAnimationPromise = summonPlayerPokemonAnimation(scene, playerPokemon); + globalScene.time.delayedCall(750, () => { + playerAnimationPromise = summonPlayerPokemonAnimation(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); - wobbuffet.ivs = [ 0, 0, 0, 0, 0, 0 ]; + globalScene.currentBattle.enemyParty = []; + const wobbuffet = globalScene.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); wobbuffet.setVisible(false); wobbuffet.calculateStats(); - scene.currentBattle.enemyParty[0] = wobbuffet; - scene.gameData.setPokemonSeen(wobbuffet, true); + globalScene.currentBattle.enemyParty[0] = wobbuffet; + globalScene.gameData.setPokemonSeen(wobbuffet, true); await wobbuffet.loadAssets(); const id = setInterval(checkPlayerAnimationPromise, 500); async function checkPlayerAnimationPromise() { @@ -217,37 +242,38 @@ async function summonPlayerPokemon(scene: BattleScene) { }); } -function handleLoseMinigame(scene: BattleScene) { +function handleLoseMinigame() { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor return new Promise(async resolve => { // Check Wobbuffet is still alive - const wobbuffet = scene.getEnemyPokemon(); + const wobbuffet = globalScene.getEnemyPokemon(); if (!wobbuffet || wobbuffet.isFainted(true) || wobbuffet.hp === 0) { // Player loses // End the battle if (wobbuffet) { wobbuffet.hideInfo(); - scene.field.remove(wobbuffet); + wobbuffet.leaveField(); } - transitionMysteryEncounterIntroVisuals(scene, true, true); - scene.currentBattle.enemyParty = []; - scene.currentBattle.mysteryEncounter!.doContinueEncounter = undefined; - leaveEncounterWithoutBattle(scene, true); - await showEncounterText(scene, `${namespace}:ko`); - const reviveCost = scene.getWaveMoneyAmount(1.5); - updatePlayerMoney(scene, -reviveCost, true, false); + transitionMysteryEncounterIntroVisuals(true, true); + globalScene.currentBattle.enemyParty = []; + globalScene.currentBattle.mysteryEncounter!.doContinueEncounter = undefined; + leaveEncounterWithoutBattle(true); + await showEncounterText(`${namespace}:ko`); + const reviveCost = globalScene.getWaveMoneyAmount(1.5); + updatePlayerMoney(-reviveCost, true, false); } resolve(); }); } -function handleNextTurn(scene: BattleScene) { - const encounter = scene.currentBattle.mysteryEncounter!; +function handleNextTurn() { + const encounter = globalScene.currentBattle.mysteryEncounter!; - const wobbuffet = scene.getEnemyPokemon(); + const wobbuffet = globalScene.getEnemyPokemon(); if (!wobbuffet) { // Should never be triggered, just handling the edge case - handleLoseMinigame(scene); + handleLoseMinigame(); return true; } if (encounter.misc.turnsRemaining <= 0) { @@ -257,15 +283,24 @@ function handleNextTurn(scene: BattleScene) { let isHealPhase = false; if (healthRatio < 0.03) { // Grand prize - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.MULTI_LENS ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.MULTI_LENS], + fillRemaining: false, + }); resultMessageKey = `${namespace}:best_result`; } else if (healthRatio < 0.15) { // 2nd prize - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.SCOPE_LENS ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.SCOPE_LENS], + fillRemaining: false, + }); resultMessageKey = `${namespace}:great_result`; } else if (healthRatio < 0.33) { // 3rd prize - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.WIDE_LENS ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.WIDE_LENS], + fillRemaining: false, + }); resultMessageKey = `${namespace}:good_result`; } else { // No prize @@ -275,56 +310,55 @@ function handleNextTurn(scene: BattleScene) { // End the battle wobbuffet.hideInfo(); - scene.field.remove(wobbuffet); - scene.currentBattle.enemyParty = []; - scene.currentBattle.mysteryEncounter!.doContinueEncounter = undefined; - leaveEncounterWithoutBattle(scene, isHealPhase); + wobbuffet.leaveField(); + globalScene.currentBattle.enemyParty = []; + globalScene.currentBattle.mysteryEncounter!.doContinueEncounter = undefined; + leaveEncounterWithoutBattle(isHealPhase); // Must end the TurnInit phase prematurely so battle phases aren't added to queue - queueEncounterMessage(scene, `${namespace}:end_game`); - queueEncounterMessage(scene, resultMessageKey); + queueEncounterMessage(`${namespace}:end_game`); + queueEncounterMessage(resultMessageKey); // Skip remainder of TurnInitPhase return true; - } else { - if (encounter.misc.turnsRemaining < 3) { - // Display charging messages on turns that aren't the initial turn - queueEncounterMessage(scene, `${namespace}:charging_continue`); - } - queueEncounterMessage(scene, `${namespace}:turn_remaining_${encounter.misc.turnsRemaining}`); - encounter.misc.turnsRemaining--; } + if (encounter.misc.turnsRemaining < 3) { + // Display charging messages on turns that aren't the initial turn + queueEncounterMessage(`${namespace}:charging_continue`); + } + queueEncounterMessage(`${namespace}:turn_remaining_${encounter.misc.turnsRemaining}`); + encounter.misc.turnsRemaining--; // Don't skip remainder of TurnInitPhase return false; } -async function showWobbuffetHealthBar(scene: BattleScene) { - const wobbuffet = scene.getEnemyPokemon()!; +async function showWobbuffetHealthBar() { + const wobbuffet = globalScene.getEnemyPokemon()!; - scene.add.existing(wobbuffet); - scene.field.add(wobbuffet); + globalScene.add.existing(wobbuffet); + globalScene.field.add(wobbuffet); - const playerPokemon = scene.getPlayerPokemon() as Pokemon; - if (playerPokemon?.visible) { - scene.field.moveBelow(wobbuffet, playerPokemon); + const playerPokemon = globalScene.getPlayerPokemon() as Pokemon; + if (playerPokemon?.isOnField()) { + globalScene.field.moveBelow(wobbuffet, playerPokemon); } // Show health bar and trigger cry wobbuffet.showInfo(); - scene.time.delayedCall(1000, () => { + globalScene.time.delayedCall(1000, () => { wobbuffet.cry(); }); wobbuffet.resetSummonData(); // Track the HP change across turns - scene.currentBattle.mysteryEncounter!.misc.wobbuffetHealth = wobbuffet.hp; + globalScene.currentBattle.mysteryEncounter!.misc.wobbuffetHealth = wobbuffet.hp; } -function summonPlayerPokemonAnimation(scene: BattleScene, pokemon: PlayerPokemon): Promise { +function summonPlayerPokemonAnimation(pokemon: PlayerPokemon): Promise { return new Promise(resolve => { - const pokeball = scene.addFieldSprite(36, 80, "pb", getPokeballAtlasKey(pokemon.pokeball)); + const pokeball = globalScene.addFieldSprite(36, 80, "pb", getPokeballAtlasKey(pokemon.pokeball)); pokeball.setVisible(false); pokeball.setOrigin(0.5, 0.625); - scene.field.add(pokeball); + globalScene.field.add(pokeball); pokemon.setFieldPosition(FieldPosition.CENTER, 0); @@ -332,32 +366,32 @@ function summonPlayerPokemonAnimation(scene: BattleScene, pokemon: PlayerPokemon pokeball.setVisible(true); - scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, duration: 650, - x: 100 + fpOffset[0] + x: 100 + fpOffset[0], }); - scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, duration: 150, ease: "Cubic.easeOut", y: 70 + fpOffset[1], onComplete: () => { - scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, duration: 500, ease: "Cubic.easeIn", angle: 1440, y: 132 + fpOffset[1], onComplete: () => { - scene.playSound("se/pb_rel"); + globalScene.playSound("se/pb_rel"); pokeball.destroy(); - scene.add.existing(pokemon); - scene.field.add(pokemon); - addPokeballOpenParticles(scene, pokemon.x, pokemon.y - 16, pokemon.pokeball); - scene.updateModifiers(true); - scene.updateFieldScale(); + globalScene.add.existing(pokemon); + globalScene.field.add(pokemon); + addPokeballOpenParticles(pokemon.x, pokemon.y - 16, pokemon.pokeball); + globalScene.updateModifiers(true); + globalScene.updateFieldScale(); pokemon.showInfo(); pokemon.playAnim(); pokemon.setVisible(true); @@ -365,8 +399,8 @@ function summonPlayerPokemonAnimation(scene: BattleScene, pokemon: PlayerPokemon pokemon.setScale(0.5); pokemon.tint(getPokeballTintColor(pokemon.pokeball)); pokemon.untint(250, "Sine.easeIn"); - scene.updateFieldScale(); - scene.tweens.add({ + globalScene.updateFieldScale(); + globalScene.tweens.add({ targets: pokemon, duration: 250, ease: "Sine.easeIn", @@ -375,46 +409,46 @@ function summonPlayerPokemonAnimation(scene: BattleScene, pokemon: PlayerPokemon pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); pokemon.getSprite().clearTint(); pokemon.resetSummonData(); - scene.time.delayedCall(1000, () => { + globalScene.time.delayedCall(1000, () => { if (pokemon.isShiny()) { - scene.unshiftPhase(new ShinySparklePhase(scene, pokemon.getBattlerIndex())); + globalScene.unshiftPhase(new ShinySparklePhase(pokemon.getBattlerIndex())); } pokemon.resetTurnData(); - scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); - scene.pushPhase(new PostSummonPhase(scene, pokemon.getBattlerIndex())); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + globalScene.pushPhase(new PostSummonPhase(pokemon.getBattlerIndex())); resolve(); }); - } + }, }); - } + }, }); - } + }, }); }); } -function hideShowmanIntroSprite(scene: BattleScene) { - const carnivalGame = scene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(0)[0]; - const wobbuffet = scene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(1)[0]; - const showMan = scene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(2)[0]; +function hideShowmanIntroSprite() { + const carnivalGame = globalScene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(0)[0]; + const wobbuffet = globalScene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(1)[0]; + const showMan = globalScene.currentBattle.mysteryEncounter!.introVisuals?.getSpriteAtIndex(2)[0]; // Hide the showman - scene.tweens.add({ + globalScene.tweens.add({ targets: showMan, x: "+=16", y: "-=16", alpha: 0, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); // Slide the Wobbuffet and Game over slightly - scene.tweens.add({ - targets: [ wobbuffet, carnivalGame ], + globalScene.tweens.add({ + targets: [wobbuffet, carnivalGame], x: "+=16", ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); } 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 376bdf0c95d..a81392941ba 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -1,30 +1,51 @@ -import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { TrainerSlot, } from "#app/data/trainer-config"; +import { + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { TrainerSlot } from "#app/data/trainer-config"; import { ModifierTier } from "#app/modifier/modifier-tier"; -import { getPlayerModifierTypeOptions, ModifierPoolType, ModifierTypeOption, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import { MusicPreference } from "#app/system/settings/settings"; +import type { ModifierTypeOption } from "#app/modifier/modifier-type"; +import { + getPlayerModifierTypeOptions, + ModifierPoolType, + regenerateModifierPoolThresholds, +} from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { Species } from "#enums/species"; -import PokemonSpecies, { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; 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 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"; +import { NumberHolder, isNullOrUndefined, randInt, randSeedInt, randSeedShuffle } from "#app/utils"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; +import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { + HiddenAbilityRateBoosterModifier, + PokemonFormChangeItemModifier, + ShinyRateBoosterModifier, + SpeciesStatBoosterModifier, +} from "#app/modifier/modifier"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import PokemonData from "#app/system/pokemon-data"; import i18next from "i18next"; import { Gender, getGenderSymbol } from "#app/data/gender"; import { getNatureName } from "#app/data/nature"; -import { getPokeballAtlasKey, getPokeballTintColor, PokeballType } from "#app/data/pokeball"; +import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball"; import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; 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"; @@ -35,15 +56,15 @@ const WONDER_TRADE_SHINY_CHANCE = 512; const MAX_WONDER_TRADE_SHINY_CHANCE = 4096; const LEGENDARY_TRADE_POOLS = { - 1: [ Species.RATTATA, Species.PIDGEY, Species.WEEDLE ], - 2: [ Species.SENTRET, Species.HOOTHOOT, Species.LEDYBA ], - 3: [ Species.POOCHYENA, Species.ZIGZAGOON, Species.TAILLOW ], - 4: [ Species.BIDOOF, Species.STARLY, Species.KRICKETOT ], - 5: [ Species.PATRAT, Species.PURRLOIN, Species.PIDOVE ], - 6: [ Species.BUNNELBY, Species.LITLEO, Species.SCATTERBUG ], - 7: [ Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF ], - 8: [ Species.SKWOVET, Species.WOOLOO, Species.ROOKIDEE ], - 9: [ Species.LECHONK, Species.FIDOUGH, Species.TAROUNTULA ] + 1: [Species.RATTATA, Species.PIDGEY, Species.WEEDLE], + 2: [Species.SENTRET, Species.HOOTHOOT, Species.LEDYBA], + 3: [Species.POOCHYENA, Species.ZIGZAGOON, Species.TAILLOW], + 4: [Species.BIDOOF, Species.STARLY, Species.KRICKETOT], + 5: [Species.PATRAT, Species.PURRLOIN, Species.PIDOVE], + 6: [Species.BUNNELBY, Species.LITLEO, Species.SCATTERBUG], + 7: [Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF], + 8: [Species.SKWOVET, Species.WOOLOO, Species.ROOKIDEE], + 9: [Species.LECHONK, Species.FIDOUGH, Species.TAROUNTULA], }; /** Exclude Paradox mons as they aren't considered legendary/mythical */ @@ -67,7 +88,7 @@ const EXCLUDED_TRADE_SPECIES = [ Species.IRON_VALIANT, Species.IRON_LEAVES, Species.IRON_BOULDER, - Species.IRON_CROWN + Species.IRON_CROWN, ]; /** @@ -75,374 +96,415 @@ const EXCLUDED_TRADE_SPECIES = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3812 | GitHub Issue #3812} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const GlobalTradeSystemEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.GLOBAL_TRADE_SYSTEM) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: "global_trade_system", - fileRoot: "mystery-encounters", - hasShadow: true, - disableAnimation: true, - x: 3, - y: 5, - yShadow: 1 - } - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.GLOBAL_TRADE_SYSTEM, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: "global_trade_system", + fileRoot: "mystery-encounters", + hasShadow: true, + disableAnimation: true, + x: 3, + y: 5, + yShadow: 1, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Load bgm - let bgmKey: string; - if (scene.musicPreference === 0) { - bgmKey = "mystery_encounter_gen_5_gts"; - scene.loadBgm(bgmKey, `${bgmKey}.mp3`); - } else { - // Mixed option - bgmKey = "mystery_encounter_gen_6_gts"; - scene.loadBgm(bgmKey, `${bgmKey}.mp3`); - } + // Load bgm + let bgmKey: string; + if (globalScene.musicPreference === MusicPreference.GENFIVE) { + bgmKey = "mystery_encounter_gen_5_gts"; + globalScene.loadBgm(bgmKey, `${bgmKey}.mp3`); + } else { + // Mixed option + bgmKey = "mystery_encounter_gen_6_gts"; + globalScene.loadBgm(bgmKey, `${bgmKey}.mp3`); + } - // Load possible trade options - // Maps current party member's id to 3 EnemyPokemon objects - // None of the trade options can be the same species - const tradeOptionsMap: Map = getPokemonTradeOptions(scene); - encounter.misc = { - tradeOptionsMap, - bgmKey - }; + // Load possible trade options + // Maps current party member's id to 3 EnemyPokemon objects + // None of the trade options can be the same species + const tradeOptionsMap: Map = getPokemonTradeOptions(); + encounter.misc = { + tradeOptionsMap, + bgmKey, + }; - return true; - }) - .withOnVisualsStart((scene: BattleScene) => { - scene.fadeAndSwitchBgm(scene.currentBattle.mysteryEncounter!.misc.bgmKey); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - secondOptionPrompt: `${namespace}:option.1.trade_options_prompt`, - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Get the trade species options for the selected pokemon - const tradeOptionsMap: Map = encounter.misc.tradeOptionsMap; - const tradeOptions = tradeOptionsMap.get(pokemon.id); - if (!tradeOptions) { - return []; - } - - return tradeOptions.map((tradePokemon: EnemyPokemon) => { - const option: OptionSelectItem = { - label: tradePokemon.getNameToRender(), - handler: () => { - // Pokemon trade selected - encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("received", tradePokemon.getNameToRender()); - encounter.misc.tradedPokemon = pokemon; - encounter.misc.receivedPokemon = tradePokemon; - return true; - }, - onHover: () => { - const formName = tradePokemon.species.forms && tradePokemon.species.forms.length > tradePokemon.formIndex ? tradePokemon.species.forms[tradePokemon.formIndex].formName : null; - const line1 = i18next.t("pokemonInfoContainer:ability") + " " + tradePokemon.getAbility().name + (tradePokemon.getGender() !== Gender.GENDERLESS ? " | " + i18next.t("pokemonInfoContainer:gender") + " " + getGenderSymbol(tradePokemon.getGender()) : ""); - const line2 = i18next.t("pokemonInfoContainer:nature") + " " + getNatureName(tradePokemon.getNature()) + (formName ? " | " + i18next.t("pokemonInfoContainer:form") + " " + formName : ""); - showEncounterText(scene, `${line1}\n${line2}`, 0, 0, false); - }, - }; - return option; - }); - }; - - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const tradedPokemon: PlayerPokemon = encounter.misc.tradedPokemon; - const receivedPokemonData: EnemyPokemon = encounter.misc.receivedPokemon; - const modifiers = tradedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier) && !(m instanceof SpeciesStatBoosterModifier)); - - // Generate a trainer name - const traderName = generateRandomTraderName(); - encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - - // Remove the original party member from party - scene.removePokemonFromPlayerParty(tradedPokemon, false); - - // Set data properly, then generate the new Pokemon's assets - receivedPokemonData.passive = tradedPokemon.passive; - // Pokeball to Ultra ball, randomly - receivedPokemonData.pokeball = randInt(4) as PokeballType; - const dataSource = new PokemonData(receivedPokemonData); - const newPlayerPokemon = scene.addPlayerPokemon(receivedPokemonData.species, receivedPokemonData.level, dataSource.abilityIndex, dataSource.formIndex, dataSource.gender, dataSource.shiny, dataSource.variant, dataSource.ivs, dataSource.nature, dataSource); - scene.getParty().push(newPlayerPokemon); - await newPlayerPokemon.loadAssets(); - - for (const mod of modifiers) { - mod.pokemonId = newPlayerPokemon.id; - scene.addModifier(mod, true, false, false, true); + return true; + }) + .withOnVisualsStart(() => { + globalScene.fadeAndSwitchBgm(globalScene.currentBattle.mysteryEncounter!.misc.bgmKey); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + secondOptionPrompt: `${namespace}:option.1.trade_options_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Get the trade species options for the selected pokemon + const tradeOptionsMap: Map = encounter.misc.tradeOptionsMap; + const tradeOptions = tradeOptionsMap.get(pokemon.id); + if (!tradeOptions) { + return []; } - // Show the trade animation - await showTradeBackground(scene); - await doPokemonTradeSequence(scene, tradedPokemon, newPlayerPokemon); - await showEncounterText(scene, `${namespace}:trade_received`, null, 0, true, 4000); - scene.playBgm(encounter.misc.bgmKey); - await addPokemonDataToDexAndValidateAchievements(scene, newPlayerPokemon); - await hideTradeBackground(scene); - tradedPokemon.destroy(); + return tradeOptions.map((tradePokemon: EnemyPokemon) => { + const option: OptionSelectItem = { + label: tradePokemon.getNameToRender(), + handler: () => { + // Pokemon trade selected + encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("received", tradePokemon.getNameToRender()); + encounter.misc.tradedPokemon = pokemon; + encounter.misc.receivedPokemon = tradePokemon; + return true; + }, + onHover: () => { + const formName = + tradePokemon.species.forms && tradePokemon.species.forms.length > tradePokemon.formIndex + ? tradePokemon.species.forms[tradePokemon.formIndex].formName + : null; + const line1 = `${i18next.t("pokemonInfoContainer:ability")} ${tradePokemon.getAbility().name}${ + tradePokemon.getGender() !== Gender.GENDERLESS + ? ` | ${i18next.t("pokemonInfoContainer:gender")} ${getGenderSymbol(tradePokemon.getGender())}` + : "" + }`; + const line2 = + i18next.t("pokemonInfoContainer:nature") + + " " + + getNatureName(tradePokemon.getNature()) + + (formName ? ` | ${i18next.t("pokemonInfoContainer:form")} ${formName}` : ""); + showEncounterText(`${line1}\n${line2}`, 0, 0, false); + }, + }; + return option; + }); + }; - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Randomly generate a Wonder Trade pokemon - const randomTradeOption = generateTradeOption(scene.getParty().map(p => p.species)); - 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); - if (scene.eventManager.isEventActive()) { - shinyThreshold.value *= scene.eventManager.getShinyMultiplier(); - } - scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const tradedPokemon: PlayerPokemon = encounter.misc.tradedPokemon; + const receivedPokemonData: EnemyPokemon = encounter.misc.receivedPokemon; + const modifiers = tradedPokemon + .getHeldItems() + .filter(m => !(m instanceof PokemonFormChangeItemModifier) && !(m instanceof SpeciesStatBoosterModifier)); - // Base shiny chance of 512/65536 -> 1/128, affected by events and Shiny Charms - // Maximum shiny chance of 4096/65536 -> 1/16, cannot improve further after that - const shinyChance = Math.min(shinyThreshold.value, MAX_WONDER_TRADE_SHINY_CHANCE); + // Generate a trainer name + const traderName = generateRandomTraderName(); + encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - tradePokemon.trySetShinySeed(shinyChance, false); + // Remove the original party member from party + globalScene.removePokemonFromPlayerParty(tradedPokemon, false); + + // Set data properly, then generate the new Pokemon's assets + receivedPokemonData.passive = tradedPokemon.passive; + // Pokeball to Ultra ball, randomly + receivedPokemonData.pokeball = randInt(4) as PokeballType; + const dataSource = new PokemonData(receivedPokemonData); + const newPlayerPokemon = globalScene.addPlayerPokemon( + receivedPokemonData.species, + receivedPokemonData.level, + dataSource.abilityIndex, + dataSource.formIndex, + dataSource.gender, + dataSource.shiny, + dataSource.variant, + dataSource.ivs, + dataSource.nature, + dataSource, + ); + globalScene.getPlayerParty().push(newPlayerPokemon); + await newPlayerPokemon.loadAssets(); + + for (const mod of modifiers) { + mod.pokemonId = newPlayerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + + // Show the trade animation + await showTradeBackground(); + await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon); + await showEncounterText(`${namespace}:trade_received`, null, 0, true, 4000); + globalScene.playBgm(encounter.misc.bgmKey); + await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon); + await hideTradeBackground(); + tradedPokemon.destroy(); + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Randomly generate a Wonder Trade pokemon + const randomTradeOption = generateTradeOption(globalScene.getPlayerParty().map(p => p.species)); + const tradePokemon = new EnemyPokemon(randomTradeOption, pokemon.level, TrainerSlot.NONE, false); + // Extra shiny roll at 1/128 odds (boosted by events and charms) + if (!tradePokemon.shiny) { + const shinyThreshold = new NumberHolder(WONDER_TRADE_SHINY_CHANCE); + if (globalScene.eventManager.isEventActive()) { + shinyThreshold.value *= globalScene.eventManager.getShinyMultiplier(); } + globalScene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); - // Extra HA roll at base 1/64 odds (boosted by events and charms) - const hiddenIndex = tradePokemon.species.ability2 ? 2 : 1; - if (tradePokemon.species.abilityHidden) { - if (tradePokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new IntegerHolder(64); - scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + // Base shiny chance of 512/65536 -> 1/128, affected by events and Shiny Charms + // Maximum shiny chance of 4096/65536 -> 1/16, cannot improve further after that + const shinyChance = Math.min(shinyThreshold.value, MAX_WONDER_TRADE_SHINY_CHANCE); - const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); + tradePokemon.trySetShinySeed(shinyChance, false); + } - if (hasHiddenAbility) { - tradePokemon.abilityIndex = hiddenIndex; + // Extra HA roll at base 1/64 odds (boosted by events and charms) + const hiddenIndex = tradePokemon.species.ability2 ? 2 : 1; + if (tradePokemon.species.abilityHidden) { + if (tradePokemon.abilityIndex < hiddenIndex) { + const hiddenAbilityChance = new NumberHolder(64); + globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + + const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); + + if (hasHiddenAbility) { + tradePokemon.abilityIndex = hiddenIndex; + } + } + } + + // If Pokemon is still not shiny or with HA, give the Pokemon a random Common egg move in its moveset + if (!tradePokemon.shiny && (!tradePokemon.species.abilityHidden || tradePokemon.abilityIndex < hiddenIndex)) { + const eggMoves = tradePokemon.getEggMoves(); + if (eggMoves) { + // Cannot gen the rare egg move, only 1 of the first 3 common moves + const eggMove = eggMoves[randSeedInt(3)]; + if (!tradePokemon.moveset.some(m => m?.moveId === eggMove)) { + if (tradePokemon.moveset.length < 4) { + tradePokemon.moveset.push(new PokemonMove(eggMove)); + } else { + const eggMoveIndex = randSeedInt(4); + tradePokemon.moveset[eggMoveIndex] = new PokemonMove(eggMove); } } } - - // If Pokemon is still not shiny or with HA, give the Pokemon a random Common egg move in its moveset - if (!tradePokemon.shiny && (!tradePokemon.species.abilityHidden || tradePokemon.abilityIndex < hiddenIndex)) { - const eggMoves = tradePokemon.getEggMoves(); - if (eggMoves) { - // Cannot gen the rare egg move, only 1 of the first 3 common moves - const eggMove = eggMoves[randSeedInt(3)]; - if (!tradePokemon.moveset.some(m => m?.moveId === eggMove)) { - if (tradePokemon.moveset.length < 4) { - tradePokemon.moveset.push(new PokemonMove(eggMove)); - } else { - const eggMoveIndex = randSeedInt(4); - tradePokemon.moveset[eggMoveIndex] = new PokemonMove(eggMove); - } - } - } - } - - encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("received", tradePokemon.getNameToRender()); - encounter.misc.tradedPokemon = pokemon; - encounter.misc.receivedPokemon = tradePokemon; - }; - - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const tradedPokemon: PlayerPokemon = encounter.misc.tradedPokemon; - const receivedPokemonData: EnemyPokemon = encounter.misc.receivedPokemon; - const modifiers = tradedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier) && !(m instanceof SpeciesStatBoosterModifier)); - - // Generate a trainer name - const traderName = generateRandomTraderName(); - encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - - // Remove the original party member from party - scene.removePokemonFromPlayerParty(tradedPokemon, false); - - // Set data properly, then generate the new Pokemon's assets - receivedPokemonData.passive = tradedPokemon.passive; - receivedPokemonData.pokeball = randInt(4) as PokeballType; - const dataSource = new PokemonData(receivedPokemonData); - const newPlayerPokemon = scene.addPlayerPokemon(receivedPokemonData.species, receivedPokemonData.level, dataSource.abilityIndex, dataSource.formIndex, dataSource.gender, dataSource.shiny, dataSource.variant, dataSource.ivs, dataSource.nature, dataSource); - scene.getParty().push(newPlayerPokemon); - await newPlayerPokemon.loadAssets(); - - for (const mod of modifiers) { - mod.pokemonId = newPlayerPokemon.id; - scene.addModifier(mod, true, false, false, true); } - // Show the trade animation - await showTradeBackground(scene); - await doPokemonTradeSequence(scene, tradedPokemon, newPlayerPokemon); - await showEncounterText(scene, `${namespace}:trade_received`, null, 0, true, 4000); - scene.playBgm(encounter.misc.bgmKey); - await addPokemonDataToDexAndValidateAchievements(scene, newPlayerPokemon); - await hideTradeBackground(scene); - tradedPokemon.destroy(); + encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("received", tradePokemon.getNameToRender()); + encounter.misc.tradedPokemon = pokemon; + encounter.misc.receivedPokemon = tradePokemon; + }; - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - secondOptionPrompt: `${namespace}:option.3.trade_options_prompt`, - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Get Pokemon held items and filter for valid ones - const validItems = pokemon.getHeldItems().filter((it) => { - return it.isTransferable; - }); + return selectPokemonForOption(onPokemonSelected); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const tradedPokemon: PlayerPokemon = encounter.misc.tradedPokemon; + const receivedPokemonData: EnemyPokemon = encounter.misc.receivedPokemon; + const modifiers = tradedPokemon + .getHeldItems() + .filter(m => !(m instanceof PokemonFormChangeItemModifier) && !(m instanceof SpeciesStatBoosterModifier)); - return validItems.map((modifier: PokemonHeldItemModifier) => { - const option: OptionSelectItem = { - label: modifier.type.name, - handler: () => { - // Pokemon and item selected - encounter.setDialogueToken("chosenItem", modifier.type.name); - encounter.misc.chosenModifier = modifier; - return true; - }, - }; - return option; - }); - }; + // Generate a trainer name + const traderName = generateRandomTraderName(); + encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon has items to trade - const meetsReqs = pokemon.getHeldItems().filter((it) => { + // Remove the original party member from party + globalScene.removePokemonFromPlayerParty(tradedPokemon, false); + + // Set data properly, then generate the new Pokemon's assets + receivedPokemonData.passive = tradedPokemon.passive; + receivedPokemonData.pokeball = randInt(4) as PokeballType; + const dataSource = new PokemonData(receivedPokemonData); + const newPlayerPokemon = globalScene.addPlayerPokemon( + receivedPokemonData.species, + receivedPokemonData.level, + dataSource.abilityIndex, + dataSource.formIndex, + dataSource.gender, + dataSource.shiny, + dataSource.variant, + dataSource.ivs, + dataSource.nature, + dataSource, + ); + globalScene.getPlayerParty().push(newPlayerPokemon); + await newPlayerPokemon.loadAssets(); + + for (const mod of modifiers) { + mod.pokemonId = newPlayerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + + // Show the trade animation + await showTradeBackground(); + await doPokemonTradeSequence(tradedPokemon, newPlayerPokemon); + await showEncounterText(`${namespace}:trade_received`, null, 0, true, 4000); + globalScene.playBgm(encounter.misc.bgmKey); + await addPokemonDataToDexAndValidateAchievements(newPlayerPokemon); + await hideTradeBackground(); + tradedPokemon.destroy(); + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + secondOptionPrompt: `${namespace}:option.3.trade_options_prompt`, + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Get Pokemon held items and filter for valid ones + const validItems = pokemon.getHeldItems().filter(it => { + return it.isTransferable; + }); + + return validItems.map((modifier: PokemonHeldItemModifier) => { + const option: OptionSelectItem = { + label: modifier.type.name, + handler: () => { + // Pokemon and item selected + encounter.setDialogueToken("chosenItem", modifier.type.name); + encounter.misc.chosenModifier = modifier; + encounter.misc.chosenPokemon = pokemon; + return true; + }, + }; + return option; + }); + }; + + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon has items to trade + const meetsReqs = + pokemon.getHeldItems().filter(it => { return it.isTransferable; }).length > 0; - if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:option.3.invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const modifier = encounter.misc.chosenModifier; - - // Check tier of the traded item, the received item will be one tier up - const type = modifier.type.withTierFromPool(); - let tier = type.tier ?? ModifierTier.GREAT; - // Eggs and White Herb are not in the pool - if (type.id === "WHITE_HERB") { - tier = ModifierTier.GREAT; - } else if (type.id === "LUCKY_EGG") { - tier = ModifierTier.ULTRA; - } else if (type.id === "GOLDEN_EGG") { - tier = ModifierTier.ROGUE; - } - // Increment tier by 1 - if (tier < ModifierTier.MASTER) { - tier++; + if (!meetsReqs) { + return getEncounterText(`${namespace}:option.3.invalid_selection`) ?? null; } - regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); - let item: ModifierTypeOption | null = null; - // TMs excluded from possible rewards - while (!item || item.type.id.includes("TM_")) { - item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [ tier ], allowLuckUpgrades: false })[0]; - } + return null; + }; - encounter.setDialogueToken("itemName", item.type.name); - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [ item ], fillRemaining: false }); + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const modifier = encounter.misc.chosenModifier as PokemonHeldItemModifier; + const party = globalScene.getPlayerParty(); + const chosenPokemon: PlayerPokemon = encounter.misc.chosenPokemon; - // Remove the chosen modifier if its stacks go to 0 - modifier.stackCount -= 1; - if (modifier.stackCount === 0) { - scene.removeModifier(modifier); - } - await scene.updateModifiers(true, true); + // Check tier of the traded item, the received item will be one tier up + const type = modifier.type.withTierFromPool(ModifierPoolType.PLAYER, party); + let tier = type.tier ?? ModifierTier.GREAT; + // Eggs and White Herb are not in the pool + if (type.id === "WHITE_HERB") { + tier = ModifierTier.GREAT; + } else if (type.id === "LUCKY_EGG") { + tier = ModifierTier.ULTRA; + } else if (type.id === "GOLDEN_EGG") { + tier = ModifierTier.ROGUE; + } + // Increment tier by 1 + if (tier < ModifierTier.MASTER) { + tier++; + } - // Generate a trainer name - const traderName = generateRandomTraderName(); - encounter.setDialogueToken("tradeTrainerName", traderName.trim()); - await showEncounterText(scene, `${namespace}:item_trade_selected`); - leaveEncounterWithoutBattle(scene); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.4.label`, - buttonTooltip: `${namespace}:option.4.tooltip`, - selected: [ - { - text: `${namespace}:option.4.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + regenerateModifierPoolThresholds(party, ModifierPoolType.PLAYER, 0); + let item: ModifierTypeOption | null = null; + // TMs excluded from possible rewards + while (!item || item.type.id.includes("TM_")) { + item = getPlayerModifierTypeOptions(1, party, [], { + guaranteedModifierTiers: [tier], + allowLuckUpgrades: false, + })[0]; + } -function getPokemonTradeOptions(scene: BattleScene): Map { + encounter.setDialogueToken("itemName", item.type.name); + setEncounterRewards({ + guaranteedModifierTypeOptions: [item], + fillRemaining: false, + }); + + chosenPokemon.loseHeldItem(modifier, false); + await globalScene.updateModifiers(true, true); + + // Generate a trainer name + const traderName = generateRandomTraderName(); + encounter.setDialogueToken("tradeTrainerName", traderName.trim()); + await showEncounterText(`${namespace}:item_trade_selected`); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.4.label`, + buttonTooltip: `${namespace}:option.4.tooltip`, + selected: [ + { + text: `${namespace}:option.4.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); + +function getPokemonTradeOptions(): Map { const tradeOptionsMap: Map = new Map(); // Starts by filtering out any current party members as valid resulting species - const alreadyUsedSpecies: PokemonSpecies[] = scene.getParty().map(p => p.species); + const alreadyUsedSpecies: PokemonSpecies[] = globalScene.getPlayerParty().map(p => p.species); - scene.getParty().forEach(pokemon => { + for (const pokemon of globalScene.getPlayerParty()) { // If the party member is legendary/mythical, the only trade options available are always pulled from generation-specific legendary trade pools if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) { const generation = pokemon.species.generation; const tradeOptions: EnemyPokemon[] = LEGENDARY_TRADE_POOLS[generation].map(s => { const pokemonSpecies = getPokemonSpecies(s); - return new EnemyPokemon(scene, pokemonSpecies, 5, TrainerSlot.NONE, false); + return new EnemyPokemon(pokemonSpecies, 5, TrainerSlot.NONE, false); }); tradeOptionsMap.set(pokemon.id, tradeOptions); } else { - const originalBst = pokemon.calculateBaseStats().reduce((a, b) => a + b, 0); + const originalBst = pokemon.getSpeciesForm().getBaseStatTotal(); const tradeOptions: PokemonSpecies[] = []; for (let i = 0; i < 3; i++) { @@ -452,11 +514,14 @@ function getPokemonTradeOptions(scene: BattleScene): Map } // Add trade options to map - tradeOptionsMap.set(pokemon.id, tradeOptions.map(s => { - return new EnemyPokemon(scene, s, pokemon.level, TrainerSlot.NONE, false); - })); + tradeOptionsMap.set( + pokemon.id, + tradeOptions.map(s => { + return new EnemyPokemon(s, pokemon.level, TrainerSlot.NONE, false); + }), + ); } - }); + } return tradeOptionsMap; } @@ -471,13 +536,12 @@ function generateTradeOption(alreadyUsedSpecies: PokemonSpecies[], originalBst?: } while (isNullOrUndefined(newSpecies)) { // Get all non-legendary species that fall within the Bst range requirements - let validSpecies = allSpecies - .filter(s => { - const isLegendaryOrMythical = s.legendary || s.subLegendary || s.mythical; - const speciesBst = s.getBaseStatTotal(); - const bstInRange = speciesBst >= bstMin && speciesBst <= bstCap; - return !isLegendaryOrMythical && bstInRange && !EXCLUDED_TRADE_SPECIES.includes(s.speciesId); - }); + let validSpecies = allSpecies.filter(s => { + const isLegendaryOrMythical = s.legendary || s.subLegendary || s.mythical; + const speciesBst = s.getBaseStatTotal(); + const bstInRange = speciesBst >= bstMin && speciesBst <= bstCap; + return !isLegendaryOrMythical && bstInRange && !EXCLUDED_TRADE_SPECIES.includes(s.speciesId); + }); // There must be at least 20 species available before it will choose one if (validSpecies?.length > 20) { @@ -496,65 +560,70 @@ function generateTradeOption(alreadyUsedSpecies: PokemonSpecies[], originalBst?: return newSpecies!; } -function showTradeBackground(scene: BattleScene) { +function showTradeBackground() { return new Promise(resolve => { - const tradeContainer = scene.add.container(0, -scene.game.canvas.height / 6); + const tradeContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); tradeContainer.setName("Trade Background"); - const flyByStaticBg = scene.add.rectangle(0, 0, scene.game.canvas.width / 6, scene.game.canvas.height / 6, 0); + const flyByStaticBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0, + ); flyByStaticBg.setName("Black Background"); flyByStaticBg.setOrigin(0, 0); flyByStaticBg.setVisible(false); tradeContainer.add(flyByStaticBg); - const tradeBaseBg = scene.add.image(0, 0, "default_bg"); + const tradeBaseBg = globalScene.add.image(0, 0, "default_bg"); tradeBaseBg.setName("Trade Background Image"); tradeBaseBg.setOrigin(0, 0); tradeContainer.add(tradeBaseBg); - scene.fieldUI.add(tradeContainer); - scene.fieldUI.bringToTop(tradeContainer); + globalScene.fieldUI.add(tradeContainer); + globalScene.fieldUI.bringToTop(tradeContainer); tradeContainer.setVisible(true); tradeContainer.alpha = 0; - scene.tweens.add({ + globalScene.tweens.add({ targets: tradeContainer, alpha: 1, duration: 500, ease: "Sine.easeInOut", onComplete: () => { resolve(); - } + }, }); }); } -function hideTradeBackground(scene: BattleScene) { +function hideTradeBackground() { return new Promise(resolve => { - const transformationContainer = scene.fieldUI.getByName("Trade Background"); + const transformationContainer = globalScene.fieldUI.getByName("Trade Background"); - scene.tweens.add({ + globalScene.tweens.add({ targets: transformationContainer, alpha: 0, duration: 1000, ease: "Sine.easeInOut", onComplete: () => { - scene.fieldUI.remove(transformationContainer, true); + globalScene.fieldUI.remove(transformationContainer, true); resolve(); - } + }, }); }); } /** * Initiates an "evolution-like" animation to transform a previousPokemon (presumably from the player's party) into a new one, not necessarily an evolution species. - * @param scene * @param tradedPokemon * @param receivedPokemon */ -function doPokemonTradeSequence(scene: BattleScene, tradedPokemon: PlayerPokemon, receivedPokemon: PlayerPokemon) { +function doPokemonTradeSequence(tradedPokemon: PlayerPokemon, receivedPokemon: PlayerPokemon) { return new Promise(resolve => { - const tradeContainer = scene.fieldUI.getByName("Trade Background") as Phaser.GameObjects.Container; + const tradeContainer = globalScene.fieldUI.getByName("Trade Background") as Phaser.GameObjects.Container; const tradeBaseBg = tradeContainer.getByName("Trade Background Image") as Phaser.GameObjects.Image; let tradedPokemonSprite: Phaser.GameObjects.Sprite; @@ -563,8 +632,16 @@ function doPokemonTradeSequence(scene: BattleScene, tradedPokemon: PlayerPokemon let receivedPokemonTintSprite: Phaser.GameObjects.Sprite; const getPokemonSprite = () => { - const ret = scene.addPokemonSprite(tradedPokemon, tradeBaseBg.displayWidth / 2, tradeBaseBg.displayHeight / 2, "pkmn__sub"); - ret.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const ret = globalScene.addPokemonSprite( + tradedPokemon, + tradeBaseBg.displayWidth / 2, + tradeBaseBg.displayHeight / 2, + "pkmn__sub", + ); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); return ret; }; @@ -580,14 +657,25 @@ function doPokemonTradeSequence(scene: BattleScene, tradedPokemon: PlayerPokemon receivedPokemonTintSprite.setVisible(false); receivedPokemonTintSprite.setTintFill(getPokeballTintColor(receivedPokemon.pokeball)); - [ tradedPokemonSprite, tradedPokemonTintSprite ].map(sprite => { - sprite.play(tradedPokemon.getSpriteKey(true)); - sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()) }); + [tradedPokemonSprite, tradedPokemonTintSprite].map(sprite => { + const spriteKey = tradedPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(tradedPokemon.getTeraType()), + isTerastallized: tradedPokemon.isTerastallized, + }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", tradedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", tradedPokemon.shiny); sprite.setPipelineData("variant", tradedPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (tradedPokemon.summonData?.speciesForm) { k += "Base"; } @@ -595,14 +683,25 @@ function doPokemonTradeSequence(scene: BattleScene, tradedPokemon: PlayerPokemon }); }); - [ receivedPokemonSprite, receivedPokemonTintSprite ].map(sprite => { - sprite.play(receivedPokemon.getSpriteKey(true)); - sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()) }); + [receivedPokemonSprite, receivedPokemonTintSprite].map(sprite => { + const spriteKey = receivedPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(tradedPokemon.getTeraType()), + isTerastallized: tradedPokemon.isTerastallized, + }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", receivedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", receivedPokemon.shiny); sprite.setPipelineData("variant", receivedPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (receivedPokemon.summonData?.speciesForm) { k += "Base"; } @@ -612,46 +711,56 @@ function doPokemonTradeSequence(scene: BattleScene, tradedPokemon: PlayerPokemon // Traded pokemon pokeball const tradedPbAtlasKey = getPokeballAtlasKey(tradedPokemon.pokeball); - const tradedPokeball: Phaser.GameObjects.Sprite = scene.add.sprite(tradeBaseBg.displayWidth / 2, tradeBaseBg.displayHeight / 2, "pb", tradedPbAtlasKey); + const tradedPokeball: Phaser.GameObjects.Sprite = globalScene.add.sprite( + tradeBaseBg.displayWidth / 2, + tradeBaseBg.displayHeight / 2, + "pb", + tradedPbAtlasKey, + ); tradedPokeball.setVisible(false); tradeContainer.add(tradedPokeball); // Received pokemon pokeball const receivedPbAtlasKey = getPokeballAtlasKey(receivedPokemon.pokeball); - const receivedPokeball: Phaser.GameObjects.Sprite = scene.add.sprite(tradeBaseBg.displayWidth / 2, tradeBaseBg.displayHeight / 2, "pb", receivedPbAtlasKey); + const receivedPokeball: Phaser.GameObjects.Sprite = globalScene.add.sprite( + tradeBaseBg.displayWidth / 2, + tradeBaseBg.displayHeight / 2, + "pb", + receivedPbAtlasKey, + ); receivedPokeball.setVisible(false); tradeContainer.add(receivedPokeball); - scene.tweens.add({ + globalScene.tweens.add({ targets: tradedPokemonSprite, alpha: 1, ease: "Cubic.easeInOut", duration: 500, onComplete: async () => { - scene.fadeOutBgm(1000, false); - await showEncounterText(scene, `${namespace}:pokemon_trade_selected`); + globalScene.fadeOutBgm(1000, false); + await showEncounterText(`${namespace}:pokemon_trade_selected`); tradedPokemon.cry(); - scene.playBgm("evolution"); - await showEncounterText(scene, `${namespace}:pokemon_trade_goodbye`); + globalScene.playBgm("evolution"); + await showEncounterText(`${namespace}:pokemon_trade_goodbye`); tradedPokeball.setAlpha(0); tradedPokeball.setVisible(true); - scene.tweens.add({ + globalScene.tweens.add({ targets: tradedPokeball, alpha: 1, ease: "Cubic.easeInOut", duration: 250, onComplete: () => { tradedPokeball.setTexture("pb", `${tradedPbAtlasKey}_opening`); - scene.time.delayedCall(17, () => tradedPokeball.setTexture("pb", `${tradedPbAtlasKey}_open`)); - scene.playSound("se/pb_rel"); + globalScene.time.delayedCall(17, () => tradedPokeball.setTexture("pb", `${tradedPbAtlasKey}_open`)); + globalScene.playSound("se/pb_rel"); tradedPokemonTintSprite.setVisible(true); // TODO: need to add particles to fieldUI instead of field - // addPokeballOpenParticles(scene, tradedPokemon.x, tradedPokemon.y, tradedPokemon.pokeball); + // addPokeballOpenParticles(tradedPokemon.x, tradedPokemon.y, tradedPokemon.pokeball); - scene.tweens.add({ - targets: [ tradedPokemonTintSprite, tradedPokemonSprite ], + globalScene.tweens.add({ + targets: [tradedPokemonTintSprite, tradedPokemonSprite], duration: 500, ease: "Sine.easeIn", scale: 0.25, @@ -659,47 +768,56 @@ function doPokemonTradeSequence(scene: BattleScene, tradedPokemon: PlayerPokemon tradedPokemonSprite.setVisible(false); tradedPokeball.setTexture("pb", `${tradedPbAtlasKey}_opening`); tradedPokemonTintSprite.setVisible(false); - scene.playSound("se/pb_catch"); - scene.time.delayedCall(17, () => tradedPokeball.setTexture("pb", `${tradedPbAtlasKey}`)); + globalScene.playSound("se/pb_catch"); + globalScene.time.delayedCall(17, () => tradedPokeball.setTexture("pb", `${tradedPbAtlasKey}`)); - scene.tweens.add({ + globalScene.tweens.add({ targets: tradedPokeball, y: "+=10", duration: 200, delay: 250, ease: "Cubic.easeIn", onComplete: () => { - scene.playSound("se/pb_bounce_1"); + globalScene.playSound("se/pb_bounce_1"); - scene.tweens.add({ + globalScene.tweens.add({ targets: tradedPokeball, y: "-=100", duration: 200, delay: 1000, ease: "Cubic.easeInOut", onStart: () => { - scene.playSound("se/pb_throw"); + globalScene.playSound("se/pb_throw"); }, onComplete: async () => { - await doPokemonTradeFlyBySequence(scene, tradedPokemonSprite, receivedPokemonSprite); - await doTradeReceivedSequence(scene, receivedPokemon, receivedPokemonSprite, receivedPokemonTintSprite, receivedPokeball, receivedPbAtlasKey); + await doPokemonTradeFlyBySequence(tradedPokemonSprite, receivedPokemonSprite); + await doTradeReceivedSequence( + receivedPokemon, + receivedPokemonSprite, + receivedPokemonTintSprite, + receivedPokeball, + receivedPbAtlasKey, + ); resolve(); - } + }, }); - } + }, }); - } + }, }); - } + }, }); - } + }, }); }); } -function doPokemonTradeFlyBySequence(scene: BattleScene, tradedPokemonSprite: Phaser.GameObjects.Sprite, receivedPokemonSprite: Phaser.GameObjects.Sprite) { +function doPokemonTradeFlyBySequence( + tradedPokemonSprite: Phaser.GameObjects.Sprite, + receivedPokemonSprite: Phaser.GameObjects.Sprite, +) { return new Promise(resolve => { - const tradeContainer = scene.fieldUI.getByName("Trade Background") as Phaser.GameObjects.Container; + const tradeContainer = globalScene.fieldUI.getByName("Trade Background") as Phaser.GameObjects.Container; const tradeBaseBg = tradeContainer.getByName("Trade Background Image") as Phaser.GameObjects.Image; const flyByStaticBg = tradeContainer.getByName("Black Background") as Phaser.GameObjects.Rectangle; flyByStaticBg.setVisible(true); @@ -710,7 +828,7 @@ function doPokemonTradeFlyBySequence(scene: BattleScene, tradedPokemonSprite: Ph tradedPokemonSprite.y = 200; tradedPokemonSprite.scale = 1; tradedPokemonSprite.setVisible(true); - receivedPokemonSprite.x = tradeBaseBg.displayWidth * 3 / 4; + receivedPokemonSprite.x = (tradeBaseBg.displayWidth * 3) / 4; receivedPokemonSprite.y = -200; receivedPokemonSprite.scale = 1; receivedPokemonSprite.setVisible(true); @@ -720,69 +838,75 @@ function doPokemonTradeFlyBySequence(scene: BattleScene, tradedPokemonSprite: Ph const BASE_ANIM_DURATION = 1000; // Fade out trade background - scene.tweens.add({ + globalScene.tweens.add({ targets: tradeBaseBg, alpha: 0, ease: "Cubic.easeInOut", duration: FADE_DELAY, onComplete: () => { - scene.tweens.add({ - targets: [ receivedPokemonSprite, tradedPokemonSprite ], + globalScene.tweens.add({ + targets: [receivedPokemonSprite, tradedPokemonSprite], y: tradeBaseBg.displayWidth / 2 - 100, ease: "Cubic.easeInOut", duration: BASE_ANIM_DURATION * 3, onComplete: () => { - scene.tweens.add({ + globalScene.tweens.add({ targets: receivedPokemonSprite, x: tradeBaseBg.displayWidth / 4, ease: "Cubic.easeInOut", duration: BASE_ANIM_DURATION / 2, - delay: ANIM_DELAY + delay: ANIM_DELAY, }); - scene.tweens.add({ + globalScene.tweens.add({ targets: tradedPokemonSprite, - x: tradeBaseBg.displayWidth * 3 / 4, + x: (tradeBaseBg.displayWidth * 3) / 4, ease: "Cubic.easeInOut", duration: BASE_ANIM_DURATION / 2, delay: ANIM_DELAY, onComplete: () => { - scene.tweens.add({ + globalScene.tweens.add({ targets: receivedPokemonSprite, y: "+=200", ease: "Cubic.easeInOut", duration: BASE_ANIM_DURATION * 2, delay: ANIM_DELAY, }); - scene.tweens.add({ + globalScene.tweens.add({ targets: tradedPokemonSprite, y: "-=200", ease: "Cubic.easeInOut", duration: BASE_ANIM_DURATION * 2, delay: ANIM_DELAY, onComplete: () => { - scene.tweens.add({ + globalScene.tweens.add({ targets: tradeBaseBg, alpha: 1, ease: "Cubic.easeInOut", duration: FADE_DELAY, onComplete: () => { resolve(); - } + }, }); - } + }, }); - } + }, }); - } + }, }); - } + }, }); }); } -function doTradeReceivedSequence(scene: BattleScene, receivedPokemon: PlayerPokemon, receivedPokemonSprite: Phaser.GameObjects.Sprite, receivedPokemonTintSprite: Phaser.GameObjects.Sprite, receivedPokeballSprite: Phaser.GameObjects.Sprite, receivedPbAtlasKey: string) { +function doTradeReceivedSequence( + receivedPokemon: PlayerPokemon, + receivedPokemonSprite: Phaser.GameObjects.Sprite, + receivedPokemonTintSprite: Phaser.GameObjects.Sprite, + receivedPokeballSprite: Phaser.GameObjects.Sprite, + receivedPbAtlasKey: string, +) { return new Promise(resolve => { - const tradeContainer = scene.fieldUI.getByName("Trade Background") as Phaser.GameObjects.Container; + const tradeContainer = globalScene.fieldUI.getByName("Trade Background") as Phaser.GameObjects.Container; const tradeBaseBg = tradeContainer.getByName("Trade Background Image") as Phaser.GameObjects.Image; receivedPokemonSprite.setVisible(false); @@ -796,22 +920,30 @@ 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 = globalScene.add.sprite(receivedPokemonSprite.x, receivedPokemonSprite.y, "shiny"); + pokemonShinySparkle.setVisible(false); + tradeContainer.add(pokemonShinySparkle); + } + const BASE_ANIM_DURATION = 1000; // Pokeball falls to the screen - scene.playSound("se/pb_throw"); - scene.tweens.add({ + globalScene.playSound("se/pb_throw"); + globalScene.tweens.add({ targets: receivedPokeballSprite, y: "+=100", ease: "Cubic.easeInOut", duration: BASE_ANIM_DURATION, onComplete: () => { - scene.playSound("se/pb_bounce_1"); - scene.time.delayedCall(100, () => scene.playSound("se/pb_bounce_1")); + globalScene.playSound("se/pb_bounce_1"); + globalScene.time.delayedCall(100, () => globalScene.playSound("se/pb_bounce_1")); - scene.time.delayedCall(2000, () => { - scene.playSound("se/pb_rel"); - scene.fadeOutBgm(500, false); + globalScene.time.delayedCall(2000, () => { + globalScene.playSound("se/pb_rel"); + globalScene.fadeOutBgm(500, false); receivedPokemon.cry(); receivedPokemonTintSprite.scale = 0.25; receivedPokemonTintSprite.alpha = 1; @@ -820,26 +952,31 @@ function doTradeReceivedSequence(scene: BattleScene, receivedPokemon: PlayerPoke receivedPokemonTintSprite.alpha = 1; receivedPokemonTintSprite.setVisible(true); receivedPokeballSprite.setTexture("pb", `${receivedPbAtlasKey}_opening`); - scene.time.delayedCall(17, () => receivedPokeballSprite.setTexture("pb", `${receivedPbAtlasKey}_open`)); - scene.tweens.add({ + globalScene.time.delayedCall(17, () => receivedPokeballSprite.setTexture("pb", `${receivedPbAtlasKey}_open`)); + globalScene.tweens.add({ targets: receivedPokemonSprite, duration: 250, ease: "Sine.easeOut", - scale: 1 + scale: 1, }); - scene.tweens.add({ + globalScene.tweens.add({ targets: receivedPokemonTintSprite, duration: 250, ease: "Sine.easeOut", scale: 1, alpha: 0, onComplete: () => { + if (receivedPokemon.shiny) { + globalScene.time.delayedCall(500, () => { + doShinySparkleAnim(pokemonShinySparkle, receivedPokemon.variant); + }); + } receivedPokeballSprite.destroy(); - scene.time.delayedCall(2000, () => resolve()); - } + globalScene.time.delayedCall(2000, () => resolve()); + }, }); }); - } + }, }); }); } @@ -853,7 +990,7 @@ function generateRandomTraderName() { } // Some trainers have 2 gendered pools, some do not const genderedPool = trainerTypePool[randInt(trainerTypePool.length)]; - const trainerNameString = genderedPool instanceof Array ? genderedPool[randInt(genderedPool.length)] : genderedPool; + const trainerNameString = Array.isArray(genderedPool) ? genderedPool[randInt(genderedPool.length)] : genderedPool; // Some names have an '&' symbol and need to be trimmed to a single name instead of a double name const trainerNames = trainerNameString.split(" & "); return trainerNames[randInt(trainerNames.length)]; diff --git a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts index 8e7ea52a967..97fd5783ebb 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -2,8 +2,9 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { leaveEncounterWithoutBattle, setEncounterExp } from "../utils/encounter-phase-utils"; import { applyDamageToPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; @@ -28,7 +29,9 @@ const namespace = "mysteryEncounters/lostAtSea"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3793 | GitHub Issue #3793} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.LOST_AT_SEA) +export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.LOST_AT_SEA, +) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) .withIntroSpriteConfigs([ @@ -41,8 +44,8 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ]) .withIntroDialogue([{ text: `${namespace}:intro` }]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; encounter.setDialogueToken("damagePercentage", String(DAMAGE_PERCENTAGE)); encounter.setDialogueToken("option1RequiredMove", new PokemonMove(OPTION_1_REQUIRED_MOVE).getName()); @@ -56,8 +59,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withQuery(`${namespace}:query`) .withOption( // Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back/ - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .withDialogue({ buttonLabel: `${namespace}:option.1.label`, @@ -70,13 +72,12 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ], }) - .withOptionPhase(async (scene: BattleScene) => handlePokemonGuidingYouPhase(scene)) - .build() + .withOptionPhase(async () => handlePokemonGuidingYouPhase()) + .build(), ) .withOption( //Option 2: Use a (non fainted) pokemon that can learn fly to guide you back. - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .withDialogue({ buttonLabel: `${namespace}:option.2.label`, @@ -89,8 +90,8 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ], }) - .withOptionPhase(async (scene: BattleScene) => handlePokemonGuidingYouPhase(scene)) - .build() + .withOptionPhase(async () => handlePokemonGuidingYouPhase()) + .build(), ) .withSimpleOption( // Option 3: Wander aimlessly @@ -103,19 +104,19 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ], }, - async (scene: BattleScene) => { - const allowedPokemon = scene.getParty().filter((p) => p.isAllowedInBattle()); + async () => { + const allowedPokemon = globalScene.getPlayerParty().filter(p => p.isAllowedInBattle()); for (const pkm of allowedPokemon) { const percentage = DAMAGE_PERCENTAGE / 100; const damage = Math.floor(pkm.getMaxHp() * percentage); - applyDamageToPokemon(scene, pkm, damage); + applyDamageToPokemon(pkm, damage); } - leaveEncounterWithoutBattle(scene); + leaveEncounterWithoutBattle(); return true; - } + }, ) .withOutroDialogue([ { @@ -126,19 +127,17 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with /** * Generic handler for using a guiding pokemon to guide you back. - * - * @param scene Battle scene */ -function handlePokemonGuidingYouPhase(scene: BattleScene) { +function handlePokemonGuidingYouPhase() { const laprasSpecies = getPokemonSpecies(Species.LAPRAS); - const { mysteryEncounter } = scene.currentBattle; + const { mysteryEncounter } = globalScene.currentBattle; if (mysteryEncounter?.selectedOption?.primaryPokemon?.id) { - setEncounterExp(scene, mysteryEncounter.selectedOption.primaryPokemon.id, laprasSpecies.baseExp, true); + setEncounterExp(mysteryEncounter.selectedOption.primaryPokemon.id, laprasSpecies.baseExp, true); } else { console.warn("Lost at sea: No guide pokemon found but pokemon guides player. huh!?"); } - leaveEncounterWithoutBattle(scene); + leaveEncounterWithoutBattle(); return true; } diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 7fdd29d36a2..bf60e982b15 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -1,5 +1,5 @@ +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { - EnemyPartyConfig, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; @@ -13,9 +13,10 @@ import { ModifierTier } from "#app/modifier/modifier-tier"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import * as Utils from "#app/utils"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; @@ -27,195 +28,202 @@ const namespace = "mysteryEncounters/mysteriousChallengers"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3801 | GitHub Issue #3801} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const MysteriousChallengersEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withIntroSpriteConfigs([]) // These are set in onInit() - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Calculates what trainers are available for battle in the encounter +export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.MYSTERIOUS_CHALLENGERS, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withIntroSpriteConfigs([]) // These are set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Calculates what trainers are available for battle in the encounter - // Normal difficulty trainer is randomly pulled from biome - const normalTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); - const normalConfig = trainerConfigs[normalTrainerType].clone(); - let female = false; - if (normalConfig.hasGenders) { - female = !!Utils.randSeedInt(2); - } - const normalSpriteKey = normalConfig.getSpriteKey(female, normalConfig.doubleOnly); - encounter.enemyPartyConfigs.push({ - trainerConfig: normalConfig, - female: female, + // Normal difficulty trainer is randomly pulled from biome + const normalTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex); + const normalConfig = trainerConfigs[normalTrainerType].clone(); + let female = false; + if (normalConfig.hasGenders) { + female = !!Utils.randSeedInt(2); + } + const normalSpriteKey = normalConfig.getSpriteKey(female, normalConfig.doubleOnly); + encounter.enemyPartyConfigs.push({ + trainerConfig: normalConfig, + female: female, + }); + + // Hard difficulty trainer is another random trainer, but with AVERAGE_BALANCED config + // Number of mons is based off wave: 1-20 is 2, 20-40 is 3, etc. capping at 6 after wave 100 + let retries = 0; + let hardTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex); + while (retries < 5 && hardTrainerType === normalTrainerType) { + // Will try to use a different trainer from the normal trainer type + hardTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex); + retries++; + } + const hardTemplate = new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), + new TrainerPartyTemplate( + Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 20), 5), + PartyMemberStrength.AVERAGE, + false, + true, + ), + ); + const hardConfig = trainerConfigs[hardTrainerType].clone(); + hardConfig.setPartyTemplates(hardTemplate); + female = false; + if (hardConfig.hasGenders) { + female = !!Utils.randSeedInt(2); + } + const hardSpriteKey = hardConfig.getSpriteKey(female, hardConfig.doubleOnly); + encounter.enemyPartyConfigs.push({ + trainerConfig: hardConfig, + levelAdditiveModifier: 1, + female: female, + }); + + // Brutal trainer is pulled from pool of boss trainers (gym leaders) for the biome + // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons + const brutalTrainerType = globalScene.arena.randomTrainerType(globalScene.currentBattle.waveIndex, true); + const e4Template = trainerPartyTemplates.ELITE_FOUR; + const brutalConfig = trainerConfigs[brutalTrainerType].clone(); + brutalConfig.title = trainerConfigs[brutalTrainerType].title; + brutalConfig.setPartyTemplates(e4Template); + // @ts-ignore + brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func + female = false; + if (brutalConfig.hasGenders) { + female = !!Utils.randSeedInt(2); + } + const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); + encounter.enemyPartyConfigs.push({ + trainerConfig: brutalConfig, + levelAdditiveModifier: 1.5, + female: female, + }); + + encounter.spriteConfigs = [ + { + spriteKey: normalSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1, + }, + { + spriteKey: hardSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1, + }, + { + spriteKey: brutalSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1, + }, + ]; + + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }, + async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn standard trainer battle with memory mushroom reward + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], + fillRemaining: true, }); - // Hard difficulty trainer is another random trainer, but with AVERAGE_BALANCED config - // Number of mons is based off wave: 1-20 is 2, 20-40 is 3, etc. capping at 6 after wave 100 - let retries = 0; - let hardTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); - while (retries < 5 && hardTrainerType === normalTrainerType) { - // Will try to use a different trainer from the normal trainer type - hardTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); - retries++; - } - const hardTemplate = new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), - new TrainerPartyTemplate( - Math.min(Math.ceil(scene.currentBattle.waveIndex / 20), 5), - PartyMemberStrength.AVERAGE, - false, - true - ) - ); - const hardConfig = trainerConfigs[hardTrainerType].clone(); - hardConfig.setPartyTemplates(hardTemplate); - female = false; - if (hardConfig.hasGenders) { - female = !!Utils.randSeedInt(2); - } - const hardSpriteKey = hardConfig.getSpriteKey(female, hardConfig.doubleOnly); - encounter.enemyPartyConfigs.push({ - trainerConfig: hardConfig, - levelAdditiveModifier: 1, - female: female, + // Seed offsets to remove possibility of different trainers having exact same teams + let initBattlePromise: Promise; + globalScene.executeWithSeedOffset(() => { + initBattlePromise = initBattleWithEnemyConfig(config); + }, globalScene.currentBattle.waveIndex * 10); + await initBattlePromise!; + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }, + async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn hard fight + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; + + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], + fillRemaining: true, }); - // Brutal trainer is pulled from pool of boss trainers (gym leaders) for the biome - // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons - const brutalTrainerType = scene.arena.randomTrainerType( - scene.currentBattle.waveIndex, - true - ); - const e4Template = trainerPartyTemplates.ELITE_FOUR; - const brutalConfig = trainerConfigs[brutalTrainerType].clone(); - brutalConfig.title = trainerConfigs[brutalTrainerType].title; - brutalConfig.setPartyTemplates(e4Template); - // @ts-ignore - brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func - female = false; - if (brutalConfig.hasGenders) { - female = !!Utils.randSeedInt(2); - } - const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); - encounter.enemyPartyConfigs.push({ - trainerConfig: brutalConfig, - levelAdditiveModifier: 1.5, - female: female, + // Seed offsets to remove possibility of different trainers having exact same teams + let initBattlePromise: Promise; + globalScene.executeWithSeedOffset(() => { + initBattlePromise = initBattleWithEnemyConfig(config); + }, globalScene.currentBattle.waveIndex * 100); + await initBattlePromise!; + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }, + async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn brutal fight + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; + + // To avoid player level snowballing from picking this option + encounter.expMultiplier = 0.9; + + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], + fillRemaining: true, }); - encounter.spriteConfigs = [ - { - spriteKey: normalSpriteKey, - fileRoot: "trainer", - hasShadow: true, - tint: 1, - }, - { - spriteKey: hardSpriteKey, - fileRoot: "trainer", - hasShadow: true, - tint: 1, - }, - { - spriteKey: brutalSpriteKey, - fileRoot: "trainer", - hasShadow: true, - tint: 1, - }, - ]; - - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Spawn standard trainer battle with memory mushroom reward - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM ], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let initBattlePromise: Promise; - scene.executeWithSeedOffset(() => { - initBattlePromise = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 10); - await initBattlePromise!; - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Spawn hard fight - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; - - setEncounterRewards(scene, { guaranteedModifierTiers: [ ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let initBattlePromise: Promise; - scene.executeWithSeedOffset(() => { - initBattlePromise = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 100); - await initBattlePromise!; - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Spawn brutal fight - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; - - // To avoid player level snowballing from picking this option - encounter.expMultiplier = 0.9; - - setEncounterRewards(scene, { guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT ], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let initBattlePromise: Promise; - scene.executeWithSeedOffset(() => { - initBattlePromise = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 1000); - await initBattlePromise!; - } - ) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - }, - ]) - .build(); + // Seed offsets to remove possibility of different trainers having exact same teams + let initBattlePromise: Promise; + globalScene.executeWithSeedOffset(() => { + initBattlePromise = initBattleWithEnemyConfig(config); + }, globalScene.currentBattle.waveIndex * 1000); + await initBattlePromise!; + }, + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 693d935ae17..c295e36749a 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -1,19 +1,29 @@ -import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { getHighestLevelPlayerPokemon, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { ModifierTier } from "#app/modifier/modifier-tier"; -import { randSeedInt } from "#app/utils"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + getHighestLevelPlayerPokemon, + koPlayerPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; -import { GameOverPhase } from "#app/phases/game-over-phase"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { GameOverPhase } from "#app/phases/game-over-phase"; +import { randSeedInt } from "#app/utils"; +import { Moves } from "#enums/moves"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; /** i18n namespace for encounter */ const namespace = "mysteryEncounters/mysteriousChest"; @@ -30,182 +40,181 @@ const MASTER_REWARDS_PERCENT = 5; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3796 | GitHub Issue #3796} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const MysteriousChestEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withAutoHideIntroVisuals(false) - .withCatchAllowed(true) - .withIntroSpriteConfigs([ - { - spriteKey: "mysterious_chest_blue", - fileRoot: "mystery-encounters", - hasShadow: true, - y: 8, - yShadow: 6, - alpha: 1, - disableAnimation: true, // Re-enabled after option select - }, - { - spriteKey: "mysterious_chest_red", - fileRoot: "mystery-encounters", - hasShadow: false, - y: 8, - yShadow: 6, - alpha: 0, - disableAnimation: true, // Re-enabled after option select - } - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +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([ + { + spriteKey: "mysterious_chest_blue", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 8, + yShadow: 6, + alpha: 1, + disableAnimation: true, // Re-enabled after option select + }, + { + spriteKey: "mysterious_chest_red", + fileRoot: "mystery-encounters", + hasShadow: false, + y: 8, + yShadow: 6, + alpha: 0, + disableAnimation: true, // Re-enabled after option select + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - const config: EnemyPartyConfig = { - levelAdditiveModifier: 0.5, - disableSwitch: true, - pokemonConfigs: [ - { - species: getPokemonSpecies(Species.GIMMIGHOUL), - formIndex: 0, - isBoss: true, - moveSet: [ Moves.NASTY_PLOT, Moves.SHADOW_BALL, Moves.POWER_GEM, Moves.THIEF ] - } - ], - }; + // Calculate boss mon + const config: EnemyPartyConfig = { + levelAdditiveModifier: 0.5, + disableSwitch: true, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.GIMMIGHOUL), + formIndex: 0, + isBoss: true, + moveSet: [Moves.NASTY_PLOT, Moves.SHADOW_BALL, Moves.POWER_GEM, Moves.THIEF], + }, + ], + }; - encounter.enemyPartyConfigs = [ config ]; + encounter.enemyPartyConfigs = [config]; - encounter.setDialogueToken("gimmighoulName", getPokemonSpecies(Species.GIMMIGHOUL).getName()); - encounter.setDialogueToken("trapPercent", TRAP_PERCENT.toString()); - encounter.setDialogueToken("commonPercent", COMMON_REWARDS_PERCENT.toString()); - encounter.setDialogueToken("ultraPercent", ULTRA_REWARDS_PERCENT.toString()); - encounter.setDialogueToken("roguePercent", ROGUE_REWARDS_PERCENT.toString()); - encounter.setDialogueToken("masterPercent", MASTER_REWARDS_PERCENT.toString()); + encounter.setDialogueToken("gimmighoulName", getPokemonSpecies(Species.GIMMIGHOUL).getName()); + encounter.setDialogueToken("trapPercent", TRAP_PERCENT.toString()); + encounter.setDialogueToken("commonPercent", COMMON_REWARDS_PERCENT.toString()); + encounter.setDialogueToken("ultraPercent", ULTRA_REWARDS_PERCENT.toString()); + encounter.setDialogueToken("roguePercent", ROGUE_REWARDS_PERCENT.toString()); + encounter.setDialogueToken("masterPercent", MASTER_REWARDS_PERCENT.toString()); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Play animation - const encounter = scene.currentBattle.mysteryEncounter!; - const introVisuals = encounter.introVisuals!; - - // Determine roll first - const roll = randSeedInt(RAND_LENGTH); - encounter.misc = { - roll - }; - - if (roll < TRAP_PERCENT) { - // Chest is springing trap, change to red chest sprite - const blueChestSprites = introVisuals.getSpriteAtIndex(0); - const redChestSprites = introVisuals.getSpriteAtIndex(1); - redChestSprites[0].setAlpha(1); - blueChestSprites[0].setAlpha(0.001); - } - introVisuals.spriteConfigs[0].disableAnimation = false; - introVisuals.spriteConfigs[1].disableAnimation = false; - introVisuals.playAnim(); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Open the chest - const encounter = scene.currentBattle.mysteryEncounter!; - const roll = encounter.misc.roll; - if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT) { - // Choose between 2 COMMON / 2 GREAT tier items (20%) - setEncounterRewards(scene, { - guaranteedModifierTiers: [ - ModifierTier.COMMON, - ModifierTier.COMMON, - ModifierTier.GREAT, - ModifierTier.GREAT, - ], - }); - // Display result message then proceed to rewards - queueEncounterMessage(scene, `${namespace}:option.1.normal`); - leaveEncounterWithoutBattle(scene); - } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT) { - // Choose between 3 ULTRA tier items (30%) - setEncounterRewards(scene, { - guaranteedModifierTiers: [ - ModifierTier.ULTRA, - ModifierTier.ULTRA, - ModifierTier.ULTRA, - ], - }); - // Display result message then proceed to rewards - queueEncounterMessage(scene, `${namespace}:option.1.good`); - leaveEncounterWithoutBattle(scene); - } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT - ROGUE_REWARDS_PERCENT) { - // Choose between 2 ROGUE tier items (10%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE ]}); - // Display result message then proceed to rewards - queueEncounterMessage(scene, `${namespace}:option.1.great`); - leaveEncounterWithoutBattle(scene); - } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT - ROGUE_REWARDS_PERCENT - MASTER_REWARDS_PERCENT) { - // Choose 1 MASTER tier item (5%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ ModifierTier.MASTER ]}); - // Display result message then proceed to rewards - queueEncounterMessage(scene, `${namespace}:option.1.amazing`); - leaveEncounterWithoutBattle(scene); - } else { - // Your highest level unfainted Pokemon gets OHKO. Start battle against a Gimmighoul (35%) - const highestLevelPokemon = getHighestLevelPlayerPokemon(scene, true, false); - koPlayerPokemon(scene, highestLevelPokemon); - - encounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender()); - await showEncounterText(scene, `${namespace}:option.1.bad`); - - // Handle game over edge case - const allowedPokemon = scene.getParty().filter(p => p.isAllowedInBattle()); - if (allowedPokemon.length === 0) { - // If there are no longer any legal pokemon in the party, game over. - scene.clearPhaseQueue(); - scene.unshiftPhase(new GameOverPhase(scene)); - } else { - // Show which Pokemon was KOed, then start battle against Gimmighoul - await transitionMysteryEncounterIntroVisuals(scene, true, true, 500); - setEncounterRewards(scene, { fillRemaining: true }); - await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); - } - } - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.2.selected`, + text: `${namespace}:option.1.selected`, }, ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + }) + .withPreOptionPhase(async () => { + // Play animation + const encounter = globalScene.currentBattle.mysteryEncounter!; + const introVisuals = encounter.introVisuals!; + + // Determine roll first + const roll = randSeedInt(RAND_LENGTH); + encounter.misc = { + roll, + }; + + if (roll < TRAP_PERCENT) { + // Chest is springing trap, change to red chest sprite + const blueChestSprites = introVisuals.getSpriteAtIndex(0); + const redChestSprites = introVisuals.getSpriteAtIndex(1); + redChestSprites[0].setAlpha(1); + blueChestSprites[0].setAlpha(0.001); + } + introVisuals.spriteConfigs[0].disableAnimation = false; + introVisuals.spriteConfigs[1].disableAnimation = false; + introVisuals.playAnim(); + }) + .withOptionPhase(async () => { + // Open the chest + const encounter = globalScene.currentBattle.mysteryEncounter!; + const roll = encounter.misc.roll; + if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT) { + // Choose between 2 COMMON / 2 GREAT tier items (20%) + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.GREAT], + }); + // Display result message then proceed to rewards + queueEncounterMessage(`${namespace}:option.1.normal`); + leaveEncounterWithoutBattle(); + } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT) { + // Choose between 3 ULTRA tier items (30%) + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA], + }); + // Display result message then proceed to rewards + queueEncounterMessage(`${namespace}:option.1.good`); + leaveEncounterWithoutBattle(); + } else if (roll >= RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT - ROGUE_REWARDS_PERCENT) { + // Choose between 2 ROGUE tier items (10%) + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE], + }); + // Display result message then proceed to rewards + queueEncounterMessage(`${namespace}:option.1.great`); + leaveEncounterWithoutBattle(); + } else if ( + roll >= + RAND_LENGTH - COMMON_REWARDS_PERCENT - ULTRA_REWARDS_PERCENT - ROGUE_REWARDS_PERCENT - MASTER_REWARDS_PERCENT + ) { + // Choose 1 MASTER tier item (5%) + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.MASTER], + }); + // Display result message then proceed to rewards + queueEncounterMessage(`${namespace}:option.1.amazing`); + leaveEncounterWithoutBattle(); + } else { + // Your highest level unfainted Pokemon gets OHKO. Start battle against a Gimmighoul (35%) + const highestLevelPokemon = getHighestLevelPlayerPokemon(true, false); + koPlayerPokemon(highestLevelPokemon); + + encounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender()); + await showEncounterText(`${namespace}:option.1.bad`); + + // Handle game over edge case + const allowedPokemon = globalScene.getPokemonAllowedInBattle(); + if (allowedPokemon.length === 0) { + // If there are no longer any legal pokemon in the party, game over. + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new GameOverPhase()); + } else { + // Show which Pokemon was KOed, then start battle against Gimmighoul + await transitionMysteryEncounterIntroVisuals(true, true, 500); + setEncounterRewards({ fillRemaining: true }); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + } + } + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index 092d2ab2673..61b48353997 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -1,8 +1,16 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterExp, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -10,7 +18,8 @@ import { Stat } from "#enums/stat"; import { CHARMING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import { showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import i18next from "i18next"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { isPokemonValidForEncounterOptionSelection } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; @@ -22,70 +31,71 @@ const namespace = "mysteryEncounters/partTimer"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3813 | GitHub Issue #3813} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const PartTimerEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.PART_TIMER) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withIntroSpriteConfigs([ - { - spriteKey: "part_timer_crate", - fileRoot: "mystery-encounters", - hasShadow: false, - y: 6, - x: 15 - }, - { - spriteKey: "worker_f", - fileRoot: "trainer", - hasShadow: true, - x: -18, - y: 4 - } - ]) - .withAutoHideIntroVisuals(false) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .withOnInit((scene: BattleScene) => { - // Load sfx - scene.loadSe("PRSFX- Horn Drill1", "battle_anims", "PRSFX- Horn Drill1.wav"); - scene.loadSe("PRSFX- Horn Drill3", "battle_anims", "PRSFX- Horn Drill3.wav"); - scene.loadSe("PRSFX- Guillotine2", "battle_anims", "PRSFX- Guillotine2.wav"); - scene.loadSe("PRSFX- Heavy Slam2", "battle_anims", "PRSFX- Heavy Slam2.wav"); +export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.PART_TIMER, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withIntroSpriteConfigs([ + { + spriteKey: "part_timer_crate", + fileRoot: "mystery-encounters", + hasShadow: false, + y: 6, + x: 15, + }, + { + spriteKey: "worker_f", + fileRoot: "trainer", + hasShadow: true, + x: -18, + y: 4, + }, + ]) + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withOnInit(() => { + // Load sfx + globalScene.loadSe("PRSFX- Horn Drill1", "battle_anims", "PRSFX- Horn Drill1.wav"); + globalScene.loadSe("PRSFX- Horn Drill3", "battle_anims", "PRSFX- Horn Drill3.wav"); + globalScene.loadSe("PRSFX- Guillotine2", "battle_anims", "PRSFX- Guillotine2.wav"); + globalScene.loadSe("PRSFX- Heavy Slam2", "battle_anims", "PRSFX- Heavy Slam2.wav"); - scene.loadSe("PRSFX- Agility", "battle_anims", "PRSFX- Agility.wav"); - scene.loadSe("PRSFX- Extremespeed1", "battle_anims", "PRSFX- Extremespeed1.wav"); - scene.loadSe("PRSFX- Accelerock1", "battle_anims", "PRSFX- Accelerock1.wav"); + globalScene.loadSe("PRSFX- Agility", "battle_anims", "PRSFX- Agility.wav"); + globalScene.loadSe("PRSFX- Extremespeed1", "battle_anims", "PRSFX- Extremespeed1.wav"); + globalScene.loadSe("PRSFX- Accelerock1", "battle_anims", "PRSFX- Accelerock1.wav"); - scene.loadSe("PRSFX- Captivate", "battle_anims", "PRSFX- Captivate.wav"); - scene.loadSe("PRSFX- Attract2", "battle_anims", "PRSFX- Attract2.wav"); - scene.loadSe("PRSFX- Aurora Veil2", "battle_anims", "PRSFX- Aurora Veil2.wav"); + globalScene.loadSe("PRSFX- Captivate", "battle_anims", "PRSFX- Captivate.wav"); + globalScene.loadSe("PRSFX- Attract2", "battle_anims", "PRSFX- Attract2.wav"); + globalScene.loadSe("PRSFX- Aurora Veil2", "battle_anims", "PRSFX- Aurora Veil2.wav"); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option.1.label`, buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.1.selected` - } - ] + text: `${namespace}:option.1.selected`, + }, + ], }) - .withPreOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; + .withPreOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; const onPokemonSelected = (pokemon: PlayerPokemon) => { encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); @@ -93,73 +103,77 @@ export const PartTimerEncounter: MysteryEncounter = // Calculate the "baseline" stat value (90 base stat, 16 IVs, neutral nature, same level as pokemon) to compare // Resulting money is 2.5 * (% difference from baseline), with minimum of 1 and maximum of 4. // Calculation from Pokemon.calculateStats - const baselineValue = Math.floor(((2 * 90 + 16) * pokemon.level) * 0.01) + 5; + const baselineValue = Math.floor((2 * 90 + 16) * pokemon.level * 0.01) + 5; const percentDiff = (pokemon.getStat(Stat.SPD) - baselineValue) / baselineValue; const moneyMultiplier = Math.min(Math.max(2.5 * (1 + percentDiff), 1), 4); encounter.misc = { - moneyMultiplier + moneyMultiplier, }; // Reduce all PP to 2 (if they started at greater than 2) - pokemon.moveset.forEach(move => { + for (const move of pokemon.moveset) { if (move) { const newPpUsed = move.getMovePp() - 2; move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; } - }); + } - setEncounterExp(scene, pokemon.id, 100); + setEncounterExp(pokemon.id, 100); // Hide intro visuals - transitionMysteryEncounterIntroVisuals(scene, true, false); + transitionMysteryEncounterIntroVisuals(true, false); // Play sfx for "working" - doDeliverySfx(scene); + doDeliverySfx(); }; // Only Pokemon non-KOd pokemon can be selected const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}:invalid_selection`); + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); }; - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); }) - .withOptionPhase(async (scene: BattleScene) => { + .withOptionPhase(async () => { // Pick Deliveries // Bring visuals back in - await transitionMysteryEncounterIntroVisuals(scene, false, false); + await transitionMysteryEncounterIntroVisuals(false, false); - const moneyMultiplier = scene.currentBattle.mysteryEncounter!.misc.moneyMultiplier; + const moneyMultiplier = globalScene.currentBattle.mysteryEncounter!.misc.moneyMultiplier; // Give money and do dialogue if (moneyMultiplier > 2.5) { - await showEncounterDialogue(scene, `${namespace}:job_complete_good`, `${namespace}:speaker`); + await showEncounterDialogue(`${namespace}:job_complete_good`, `${namespace}:speaker`); } else { - await showEncounterDialogue(scene, `${namespace}:job_complete_bad`, `${namespace}:speaker`); + await showEncounterDialogue(`${namespace}:job_complete_bad`, `${namespace}:speaker`); } - const moneyChange = scene.getWaveMoneyAmount(moneyMultiplier); - updatePlayerMoney(scene, moneyChange, true, false); - await showEncounterText(scene, i18next.t("mysteryEncounterMessages:receive_money", { amount: moneyChange })); - await showEncounterText(scene, `${namespace}:pokemon_tired`); + const moneyChange = globalScene.getWaveMoneyAmount(moneyMultiplier); + updatePlayerMoney(moneyChange, true, false); + await showEncounterText( + i18next.t("mysteryEncounterMessages:receive_money", { + amount: moneyChange, + }), + ); + await showEncounterText(`${namespace}:pokemon_tired`); - setEncounterRewards(scene, { fillRemaining: true }); - leaveEncounterWithoutBattle(scene); + setEncounterRewards({ fillRemaining: true }); + leaveEncounterWithoutBattle(); }) - .build() - ) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option.2.label`, buttonTooltip: `${namespace}:option.2.tooltip`, selected: [ { - text: `${namespace}:option.2.selected` - } - ] + text: `${namespace}:option.2.selected`, + }, + ], }) - .withPreOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; + .withPreOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; const onPokemonSelected = (pokemon: PlayerPokemon) => { encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); @@ -167,168 +181,176 @@ export const PartTimerEncounter: MysteryEncounter = // Calculate the "baseline" stat value (75 base stat, 16 IVs, neutral nature, same level as pokemon) to compare // Resulting money is 2.5 * (% difference from baseline), with minimum of 1 and maximum of 4. // Calculation from Pokemon.calculateStats - const baselineHp = Math.floor(((2 * 75 + 16) * pokemon.level) * 0.01) + pokemon.level + 10; - const baselineAtkDef = Math.floor(((2 * 75 + 16) * pokemon.level) * 0.01) + 5; + const baselineHp = Math.floor((2 * 75 + 16) * pokemon.level * 0.01) + pokemon.level + 10; + const baselineAtkDef = Math.floor((2 * 75 + 16) * pokemon.level * 0.01) + 5; const baselineValue = baselineHp + 1.5 * (baselineAtkDef * 2); - const strongestValue = pokemon.getStat(Stat.HP) + 1.5 * (pokemon.getStat(Stat.ATK) + pokemon.getStat(Stat.DEF)); + const strongestValue = + pokemon.getStat(Stat.HP) + 1.5 * (pokemon.getStat(Stat.ATK) + pokemon.getStat(Stat.DEF)); const percentDiff = (strongestValue - baselineValue) / baselineValue; const moneyMultiplier = Math.min(Math.max(2.5 * (1 + percentDiff), 1), 4); encounter.misc = { - moneyMultiplier + moneyMultiplier, }; // Reduce all PP to 2 (if they started at greater than 2) - pokemon.moveset.forEach(move => { + for (const move of pokemon.moveset) { if (move) { const newPpUsed = move.getMovePp() - 2; move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; } - }); + } - setEncounterExp(scene, pokemon.id, 100); + setEncounterExp(pokemon.id, 100); // Hide intro visuals - transitionMysteryEncounterIntroVisuals(scene, true, false); + transitionMysteryEncounterIntroVisuals(true, false); // Play sfx for "working" - doStrongWorkSfx(scene); + doStrongWorkSfx(); }; // Only Pokemon non-KOd pokemon can be selected const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}:invalid_selection`); + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); }; - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); }) - .withOptionPhase(async (scene: BattleScene) => { + .withOptionPhase(async () => { // Pick Move Warehouse items // Bring visuals back in - await transitionMysteryEncounterIntroVisuals(scene, false, false); + await transitionMysteryEncounterIntroVisuals(false, false); - const moneyMultiplier = scene.currentBattle.mysteryEncounter!.misc.moneyMultiplier; + const moneyMultiplier = globalScene.currentBattle.mysteryEncounter!.misc.moneyMultiplier; // Give money and do dialogue if (moneyMultiplier > 2.5) { - await showEncounterDialogue(scene, `${namespace}:job_complete_good`, `${namespace}:speaker`); + await showEncounterDialogue(`${namespace}:job_complete_good`, `${namespace}:speaker`); } else { - await showEncounterDialogue(scene, `${namespace}:job_complete_bad`, `${namespace}:speaker`); + await showEncounterDialogue(`${namespace}:job_complete_bad`, `${namespace}:speaker`); } - const moneyChange = scene.getWaveMoneyAmount(moneyMultiplier); - updatePlayerMoney(scene, moneyChange, true, false); - await showEncounterText(scene, i18next.t("mysteryEncounterMessages:receive_money", { amount: moneyChange })); - await showEncounterText(scene, `${namespace}:pokemon_tired`); + const moneyChange = globalScene.getWaveMoneyAmount(moneyMultiplier); + updatePlayerMoney(moneyChange, true, false); + await showEncounterText( + i18next.t("mysteryEncounterMessages:receive_money", { + amount: moneyChange, + }), + ); + await showEncounterText(`${namespace}:pokemon_tired`); - setEncounterRewards(scene, { fillRemaining: true }); - leaveEncounterWithoutBattle(scene); + setEncounterRewards({ fillRemaining: true }); + leaveEncounterWithoutBattle(); }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const selectedPokemon = encounter.selectedOption?.primaryPokemon!; - encounter.setDialogueToken("selectedPokemon", selectedPokemon.getNameToRender()); + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const selectedPokemon = encounter.selectedOption?.primaryPokemon!; + encounter.setDialogueToken("selectedPokemon", selectedPokemon.getNameToRender()); - // Reduce all PP to 2 (if they started at greater than 2) - selectedPokemon.moveset.forEach(move => { - if (move) { - const newPpUsed = move.getMovePp() - 2; - move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; - } - }); + // Reduce all PP to 2 (if they started at greater than 2) + for (const move of selectedPokemon.moveset) { + if (move) { + const newPpUsed = move.getMovePp() - 2; + move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + } + } - setEncounterExp(scene, selectedPokemon.id, 100); + setEncounterExp(selectedPokemon.id, 100); - // Hide intro visuals - transitionMysteryEncounterIntroVisuals(scene, true, false); - // Play sfx for "working" - doSalesSfx(scene); - return true; - }) - .withOptionPhase(async (scene: BattleScene) => { - // Assist with Sales - // Bring visuals back in - await transitionMysteryEncounterIntroVisuals(scene, false, false); + // Hide intro visuals + transitionMysteryEncounterIntroVisuals(true, false); + // Play sfx for "working" + doSalesSfx(); + return true; + }) + .withOptionPhase(async () => { + // Assist with Sales + // Bring visuals back in + await transitionMysteryEncounterIntroVisuals(false, false); - // Give money and do dialogue - await showEncounterDialogue(scene, `${namespace}:job_complete_good`, `${namespace}:speaker`); - const moneyChange = scene.getWaveMoneyAmount(2.5); - updatePlayerMoney(scene, moneyChange, true, false); - await showEncounterText(scene, i18next.t("mysteryEncounterMessages:receive_money", { amount: moneyChange })); - await showEncounterText(scene, `${namespace}:pokemon_tired`); + // Give money and do dialogue + await showEncounterDialogue(`${namespace}:job_complete_good`, `${namespace}:speaker`); + const moneyChange = globalScene.getWaveMoneyAmount(2.5); + updatePlayerMoney(moneyChange, true, false); + await showEncounterText( + i18next.t("mysteryEncounterMessages:receive_money", { + amount: moneyChange, + }), + ); + await showEncounterText(`${namespace}:pokemon_tired`); - setEncounterRewards(scene, { fillRemaining: true }); - leaveEncounterWithoutBattle(scene); - }) - .build() - ) - .withOutroDialogue([ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:outro`, - } - ]) - .build(); + setEncounterRewards({ fillRemaining: true }); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withOutroDialogue([ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:outro`, + }, + ]) + .build(); -function doStrongWorkSfx(scene: BattleScene) { - scene.playSound("battle_anims/PRSFX- Horn Drill1"); - scene.playSound("battle_anims/PRSFX- Horn Drill1"); +function doStrongWorkSfx() { + globalScene.playSound("battle_anims/PRSFX- Horn Drill1"); + globalScene.playSound("battle_anims/PRSFX- Horn Drill1"); - scene.time.delayedCall(1000, () => { - scene.playSound("battle_anims/PRSFX- Guillotine2"); + globalScene.time.delayedCall(1000, () => { + globalScene.playSound("battle_anims/PRSFX- Guillotine2"); }); - scene.time.delayedCall(2000, () => { - scene.playSound("battle_anims/PRSFX- Heavy Slam2"); + globalScene.time.delayedCall(2000, () => { + globalScene.playSound("battle_anims/PRSFX- Heavy Slam2"); }); - scene.time.delayedCall(2500, () => { - scene.playSound("battle_anims/PRSFX- Guillotine2"); + globalScene.time.delayedCall(2500, () => { + globalScene.playSound("battle_anims/PRSFX- Guillotine2"); }); } -function doDeliverySfx(scene: BattleScene) { - scene.playSound("battle_anims/PRSFX- Accelerock1"); +function doDeliverySfx() { + globalScene.playSound("battle_anims/PRSFX- Accelerock1"); - scene.time.delayedCall(1500, () => { - scene.playSound("battle_anims/PRSFX- Extremespeed1"); + globalScene.time.delayedCall(1500, () => { + globalScene.playSound("battle_anims/PRSFX- Extremespeed1"); }); - scene.time.delayedCall(2000, () => { - scene.playSound("battle_anims/PRSFX- Extremespeed1"); + globalScene.time.delayedCall(2000, () => { + globalScene.playSound("battle_anims/PRSFX- Extremespeed1"); }); - scene.time.delayedCall(2250, () => { - scene.playSound("battle_anims/PRSFX- Agility"); + globalScene.time.delayedCall(2250, () => { + globalScene.playSound("battle_anims/PRSFX- Agility"); }); } -function doSalesSfx(scene: BattleScene) { - scene.playSound("battle_anims/PRSFX- Captivate"); +function doSalesSfx() { + globalScene.playSound("battle_anims/PRSFX- Captivate"); - scene.time.delayedCall(1500, () => { - scene.playSound("battle_anims/PRSFX- Attract2"); + globalScene.time.delayedCall(1500, () => { + globalScene.playSound("battle_anims/PRSFX- Attract2"); }); - scene.time.delayedCall(2000, () => { - scene.playSound("battle_anims/PRSFX- Aurora Veil2"); + globalScene.time.delayedCall(2000, () => { + globalScene.playSound("battle_anims/PRSFX- Aurora Veil2"); }); - scene.time.delayedCall(3000, () => { - scene.playSound("battle_anims/PRSFX- Attract2"); + globalScene.time.delayedCall(3000, () => { + globalScene.playSound("battle_anims/PRSFX- Attract2"); }); } diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 0ee3c57b0a2..f231e4abdb8 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -1,17 +1,30 @@ -import { initSubsequentOptionSelect, leaveEncounterWithoutBattle, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initSubsequentOptionSelect, + leaveEncounterWithoutBattle, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; -import MysteryEncounterOption, { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import type MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { TrainerSlot } from "#app/data/trainer-config"; import { HiddenAbilityRateBoosterModifier, IvScannerModifier } from "#app/modifier/modifier"; -import { EnemyPokemon } from "#app/field/pokemon"; -import { PokeballType } from "#app/data/pokeball"; +import type { EnemyPokemon } from "#app/field/pokemon"; +import { PokeballType } from "#enums/pokeball"; import { PlayerGender } from "#enums/player-gender"; -import { IntegerHolder, randSeedInt } from "#app/utils"; +import { NumberHolder, randSeedInt } from "#app/utils"; +import type PokemonSpecies from "#app/data/pokemon-species"; import { 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,11 +32,12 @@ 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"; -const TRAINER_THROW_ANIMATION_TIMES = [ 512, 184, 768 ]; +const TRAINER_THROW_ANIMATION_TIMES = [512, 184, 768]; const SAFARI_MONEY_MULTIPLIER = 2; @@ -34,36 +48,37 @@ const NUM_SAFARI_ENCOUNTERS = 3; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3800 | GitHub Issue #3800} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const SafariZoneEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: "safari_zone", - fileRoot: "mystery-encounters", - hasShadow: false, - x: 4, - y: 6 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - scene.currentBattle.mysteryEncounter?.setDialogueToken("numEncounters", NUM_SAFARI_ENCOUNTERS.toString()); - return true; - }) - .withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) +export const SafariZoneEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.SAFARI_ZONE, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: "safari_zone", + fileRoot: "mystery-encounters", + hasShadow: false, + x: 4, + y: 6, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + globalScene.currentBattle.mysteryEncounter?.setDialogueToken("numEncounters", NUM_SAFARI_ENCOUNTERS.toString()); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneRequirement(new MoneyRequirement(0, SAFARI_MONEY_MULTIPLIER)) // Cost equal to 1 Max Revive .withDialogue({ buttonLabel: `${namespace}:option.1.label`, @@ -74,46 +89,49 @@ export const SafariZoneEncounter: MysteryEncounter = }, ], }) - .withOptionPhase(async (scene: BattleScene) => { + .withOptionPhase(async () => { // Start safari encounter - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; encounter.continuousEncounter = true; encounter.misc = { - safariPokemonRemaining: NUM_SAFARI_ENCOUNTERS + safariPokemonRemaining: NUM_SAFARI_ENCOUNTERS, }; - updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); + updatePlayerMoney(-(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); // Load bait/mud assets - scene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav"); - scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims", "PRSFX- Sludge Bomb2.wav"); - scene.loadSe("PRSFX- Taunt2", "battle_anims", "PRSFX- Taunt2.wav"); - scene.loadAtlas("safari_zone_bait", "mystery-encounters"); - scene.loadAtlas("safari_zone_mud", "mystery-encounters"); + globalScene.loadSe("PRSFX- Bug Bite", "battle_anims", "PRSFX- Bug Bite.wav"); + globalScene.loadSe("PRSFX- Sludge Bomb2", "battle_anims", "PRSFX- Sludge Bomb2.wav"); + globalScene.loadSe("PRSFX- Taunt2", "battle_anims", "PRSFX- Taunt2.wav"); + globalScene.loadAtlas("safari_zone_bait", "mystery-encounters"); + globalScene.loadAtlas("safari_zone_mud", "mystery-encounters"); // Clear enemy party - scene.currentBattle.enemyParty = []; - await transitionMysteryEncounterIntroVisuals(scene); - await summonSafariPokemon(scene); - initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, hideDescription: true }); + globalScene.currentBattle.enemyParty = []; + await transitionMysteryEncounterIntroVisuals(); + await summonSafariPokemon(); + initSubsequentOptionSelect({ + overrideOptions: safariZoneGameOptions, + hideDescription: true, + }); return true; }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); /** * SAFARI ZONE MINIGAME OPTIONS @@ -131,43 +149,45 @@ export const SafariZoneEncounter: MysteryEncounter = * Flee chance = fleeRate / 255 */ const safariZoneGameOptions: MysteryEncounterOption[] = [ - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari.1.label`, buttonTooltip: `${namespace}:safari.1.tooltip`, selected: [ { text: `${namespace}:safari.1.selected`, - } + }, ], }) - .withOptionPhase(async (scene: BattleScene) => { + .withOptionPhase(async () => { // Throw a ball option - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; const pokemon = encounter.misc.pokemon; - const catchResult = await throwPokeball(scene, pokemon); + const catchResult = await throwPokeball(pokemon); if (catchResult) { // You caught pokemon // Check how many safari pokemon left if (encounter.misc.safariPokemonRemaining > 0) { - await summonSafariPokemon(scene); - initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: 0, hideDescription: true }); + await summonSafariPokemon(); + initSubsequentOptionSelect({ + overrideOptions: safariZoneGameOptions, + startingCursorIndex: 0, + hideDescription: true, + }); } else { // End safari mode encounter.continuousEncounter = false; - leaveEncounterWithoutBattle(scene, true); + leaveEncounterWithoutBattle(true); } } else { // Pokemon catch failed, end turn - await doEndTurn(scene, 0); + await doEndTurn(0); } return true; }) .build(), - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari.2.label`, buttonTooltip: `${namespace}:safari.2.tooltip`, @@ -177,27 +197,26 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ }, ], }) - .withOptionPhase(async (scene: BattleScene) => { + .withOptionPhase(async () => { // Throw bait option - const pokemon = scene.currentBattle.mysteryEncounter!.misc.pokemon; - await throwBait(scene, pokemon); + const pokemon = globalScene.currentBattle.mysteryEncounter!.misc.pokemon; + await throwBait(pokemon); // 100% chance to increase catch stage +2 - tryChangeCatchStage(scene, 2); + tryChangeCatchStage(2); // 80% chance to increase flee stage +1 - const fleeChangeResult = tryChangeFleeStage(scene, 1, 8); + const fleeChangeResult = tryChangeFleeStage(1, 8); if (!fleeChangeResult) { - await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari.busy_eating`) ?? "", null, 1000, false ); + await showEncounterText(getEncounterText(`${namespace}:safari.busy_eating`) ?? "", null, 1000, false); } else { - await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari.eating`) ?? "", null, 1000, false); + await showEncounterText(getEncounterText(`${namespace}:safari.eating`) ?? "", null, 1000, false); } - await doEndTurn(scene, 1); + await doEndTurn(1); return true; }) .build(), - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari.3.label`, buttonTooltip: `${namespace}:safari.3.tooltip`, @@ -207,91 +226,97 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ }, ], }) - .withOptionPhase(async (scene: BattleScene) => { + .withOptionPhase(async () => { // Throw mud option - const pokemon = scene.currentBattle.mysteryEncounter!.misc.pokemon; - await throwMud(scene, pokemon); + const pokemon = globalScene.currentBattle.mysteryEncounter!.misc.pokemon; + await throwMud(pokemon); // 100% chance to decrease flee stage -2 - tryChangeFleeStage(scene, -2); + tryChangeFleeStage(-2); // 80% chance to decrease catch stage -1 - const catchChangeResult = tryChangeCatchStage(scene, -1, 8); + const catchChangeResult = tryChangeCatchStage(-1, 8); if (!catchChangeResult) { - await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari.beside_itself_angry`) ?? "", null, 1000, false ); + await showEncounterText(getEncounterText(`${namespace}:safari.beside_itself_angry`) ?? "", null, 1000, false); } else { - await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari.angry`) ?? "", null, 1000, false ); + await showEncounterText(getEncounterText(`${namespace}:safari.angry`) ?? "", null, 1000, false); } - await doEndTurn(scene, 2); + await doEndTurn(2); return true; }) .build(), - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari.4.label`, buttonTooltip: `${namespace}:safari.4.tooltip`, }) - .withOptionPhase(async (scene: BattleScene) => { + .withOptionPhase(async () => { // Flee option - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; const pokemon = encounter.misc.pokemon; - await doPlayerFlee(scene, pokemon); + await doPlayerFlee(pokemon); // Check how many safari pokemon left if (encounter.misc.safariPokemonRemaining > 0) { - await summonSafariPokemon(scene); - initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: 3, hideDescription: true }); + await summonSafariPokemon(); + initSubsequentOptionSelect({ + overrideOptions: safariZoneGameOptions, + startingCursorIndex: 3, + hideDescription: true, + }); } else { // End safari mode encounter.continuousEncounter = false; - leaveEncounterWithoutBattle(scene, true); + leaveEncounterWithoutBattle(true); } return true; }) - .build() + .build(), ]; -async function summonSafariPokemon(scene: BattleScene) { - const encounter = scene.currentBattle.mysteryEncounter!; +async function summonSafariPokemon() { + const encounter = globalScene.currentBattle.mysteryEncounter!; // Message pokemon remaining encounter.setDialogueToken("remainingCount", encounter.misc.safariPokemonRemaining); - scene.queueMessage(getEncounterText(scene, `${namespace}:safari.remaining_count`) ?? "", null, true); + globalScene.queueMessage(getEncounterText(`${namespace}:safari.remaining_count`) ?? "", null, true); // Generate pokemon using safariPokemonRemaining so they are always the same pokemon no matter how many turns are taken // Safari pokemon roll twice on shiny and HA chances, but are otherwise normal - let enemySpecies; - let pokemon; - scene.executeWithSeedOffset(() => { - enemySpecies = getPokemonSpecies(getRandomSpeciesByStarterTier([ 0, 5 ], undefined, undefined, false, false, false)); - const level = scene.currentBattle.getLevelForWave(); - enemySpecies = getPokemonSpecies(enemySpecies.getWildSpeciesForLevel(level, true, false, scene.gameMode)); - pokemon = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, false); + let enemySpecies: PokemonSpecies; + let pokemon: any; + globalScene.executeWithSeedOffset( + () => { + enemySpecies = getSafariSpeciesSpawn(); + const level = globalScene.currentBattle.getLevelForWave(); + enemySpecies = getPokemonSpecies(enemySpecies.getWildSpeciesForLevel(level, true, false, globalScene.gameMode)); + pokemon = globalScene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, false); - // Roll shiny twice - if (!pokemon.shiny) { - pokemon.trySetShinySeed(); - } + // Roll shiny twice + if (!pokemon.shiny) { + pokemon.trySetShinySeed(); + } - // Roll HA twice - if (pokemon.species.abilityHidden) { - const hiddenIndex = pokemon.species.ability2 ? 2 : 1; - if (pokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new IntegerHolder(256); - scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + // Roll HA twice + if (pokemon.species.abilityHidden) { + const hiddenIndex = pokemon.species.ability2 ? 2 : 1; + if (pokemon.abilityIndex < hiddenIndex) { + const hiddenAbilityChance = new NumberHolder(256); + globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); - const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); + const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); - if (hasHiddenAbility) { - pokemon.abilityIndex = hiddenIndex; + if (hasHiddenAbility) { + pokemon.abilityIndex = hiddenIndex; + } } } - } - pokemon.calculateStats(); + pokemon.calculateStats(); - scene.currentBattle.enemyParty.unshift(pokemon); - }, scene.currentBattle.waveIndex * 1000 * encounter.misc.safariPokemonRemaining); + globalScene.currentBattle.enemyParty.unshift(pokemon); + }, + globalScene.currentBattle.waveIndex * 1000 * encounter.misc.safariPokemonRemaining, + ); - scene.gameData.setPokemonSeen(pokemon, true); + globalScene.gameData.setPokemonSeen(pokemon, true); await pokemon.loadAssets(); // Reset safari catch and flee rates @@ -300,7 +325,7 @@ async function summonSafariPokemon(scene: BattleScene) { encounter.misc.pokemon = pokemon; encounter.misc.safariPokemonRemaining -= 1; - scene.unshiftPhase(new SummonPhase(scene, 0, false)); + globalScene.unshiftPhase(new SummonPhase(0, false)); encounter.setDialogueToken("pokemonName", getPokemonNameWithAffix(pokemon)); @@ -309,58 +334,62 @@ async function summonSafariPokemon(scene: BattleScene) { // shows up and the IV scanner breaks. For now, we place the IV scanner code // separately so that at least the IV scanner works. - const ivScannerModifier = scene.findModifier(m => m instanceof IvScannerModifier); + const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { - scene.pushPhase(new ScanIvsPhase(scene, pokemon.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6))); + globalScene.pushPhase(new ScanIvsPhase(pokemon.getBattlerIndex())); } } -function throwPokeball(scene: BattleScene, pokemon: EnemyPokemon): Promise { +function throwPokeball(pokemon: EnemyPokemon): Promise { const baseCatchRate = pokemon.species.catchRate; // Catch stage ranges from -6 to +6 (like stat boost stages) - const safariCatchStage = scene.currentBattle.mysteryEncounter!.misc.catchStage; + const safariCatchStage = globalScene.currentBattle.mysteryEncounter!.misc.catchStage; // Catch modifier ranges from 2/8 (-6 stage) to 8/2 (+6) - const safariModifier = (2 + Math.min(Math.max(safariCatchStage, 0), 6)) / (2 - Math.max(Math.min(safariCatchStage, 0), -6)); + const safariModifier = + (2 + Math.min(Math.max(safariCatchStage, 0), 6)) / (2 - Math.max(Math.min(safariCatchStage, 0), -6)); // Catch rate same as safari ball const pokeballMultiplier = 1.5; const catchRate = Math.round(baseCatchRate * pokeballMultiplier * safariModifier); const ballTwitchRate = Math.round(1048560 / Math.sqrt(Math.sqrt(16711680 / catchRate))); - return trainerThrowPokeball(scene, pokemon, PokeballType.POKEBALL, ballTwitchRate); + return trainerThrowPokeball(pokemon, PokeballType.POKEBALL, ballTwitchRate); } -async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { +async function throwBait(pokemon: EnemyPokemon): Promise { const originalY: number = pokemon.y; const fpOffset = pokemon.getFieldPositionOffset(); - const bait: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "safari_zone_bait", "0001.png"); + const bait: Phaser.GameObjects.Sprite = globalScene.addFieldSprite(16 + 75, 80 + 25, "safari_zone_bait", "0001.png"); bait.setOrigin(0.5, 0.625); - scene.field.add(bait); + globalScene.field.add(bait); return new Promise(resolve => { - scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); - scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { - scene.playSound("se/pb_throw"); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); + globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { + globalScene.playSound("se/pb_throw"); // Trainer throw frames - scene.trainer.setFrame("2"); - scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[1], () => { - scene.trainer.setFrame("3"); - scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[2], () => { - scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + globalScene.trainer.setFrame("2"); + globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[1], () => { + globalScene.trainer.setFrame("3"); + globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[2], () => { + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); }); }); // Pokeball move and catch logic - scene.tweens.add({ + globalScene.tweens.add({ targets: bait, x: { value: 210 + fpOffset[0], ease: "Linear" }, y: { value: 55 + fpOffset[1], ease: "Cubic.easeOut" }, duration: 500, onComplete: () => { - let index = 1; - scene.time.delayedCall(768, () => { - scene.tweens.add({ + globalScene.time.delayedCall(768, () => { + globalScene.tweens.add({ targets: pokemon, duration: 150, ease: "Cubic.easeOut", @@ -368,12 +397,12 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { - scene.playSound("battle_anims/PRSFX- Bug Bite"); + globalScene.playSound("battle_anims/PRSFX- Bug Bite"); bait.setFrame("0002.png"); }, onLoop: () => { if (index % 2 === 0) { - scene.playSound("battle_anims/PRSFX- Bug Bite"); + globalScene.playSound("battle_anims/PRSFX- Bug Bite"); } if (index === 4) { bait.setFrame("0003.png"); @@ -381,68 +410,72 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { - scene.time.delayedCall(256, () => { + globalScene.time.delayedCall(256, () => { bait.destroy(); resolve(true); }); - } + }, }); }); - } + }, }); }); }); } -async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { +async function throwMud(pokemon: EnemyPokemon): Promise { const originalY: number = pokemon.y; const fpOffset = pokemon.getFieldPositionOffset(); - const mud: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 35, "safari_zone_mud", "0001.png"); + const mud: Phaser.GameObjects.Sprite = globalScene.addFieldSprite(16 + 75, 80 + 35, "safari_zone_mud", "0001.png"); mud.setOrigin(0.5, 0.625); - scene.field.add(mud); + globalScene.field.add(mud); return new Promise(resolve => { - scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); - scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { - scene.playSound("se/pb_throw"); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); + globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { + globalScene.playSound("se/pb_throw"); // Trainer throw frames - scene.trainer.setFrame("2"); - scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[1], () => { - scene.trainer.setFrame("3"); - scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[2], () => { - scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + globalScene.trainer.setFrame("2"); + globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[1], () => { + globalScene.trainer.setFrame("3"); + globalScene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[2], () => { + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); }); }); // Mud throw and splat - scene.tweens.add({ + globalScene.tweens.add({ targets: mud, x: { value: 230 + fpOffset[0], ease: "Linear" }, y: { value: 55 + fpOffset[1], ease: "Cubic.easeOut" }, duration: 500, onComplete: () => { // Mud frame 2 - scene.playSound("battle_anims/PRSFX- Sludge Bomb2"); + globalScene.playSound("battle_anims/PRSFX- Sludge Bomb2"); mud.setFrame("0002.png"); // Mud splat - scene.time.delayedCall(200, () => { + globalScene.time.delayedCall(200, () => { mud.setFrame("0003.png"); - scene.time.delayedCall(400, () => { + globalScene.time.delayedCall(400, () => { mud.setFrame("0004.png"); }); }); // Fade mud then angry animation - scene.tweens.add({ + globalScene.tweens.add({ targets: mud, alpha: 0, ease: "Cubic.easeIn", duration: 1000, onComplete: () => { mud.destroy(); - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemon, duration: 300, ease: "Cubic.easeOut", @@ -450,18 +483,18 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { - scene.playSound("battle_anims/PRSFX- Taunt2"); + globalScene.playSound("battle_anims/PRSFX- Taunt2"); }, onLoop: () => { - scene.playSound("battle_anims/PRSFX- Taunt2"); + globalScene.playSound("battle_anims/PRSFX- Taunt2"); }, onComplete: () => { resolve(true); - } + }, }); - } + }, }); - } + }, }); }); }); @@ -470,59 +503,76 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise= chance) { return false; } - const currentFleeStage = scene.currentBattle.mysteryEncounter!.misc.fleeStage ?? 0; - scene.currentBattle.mysteryEncounter!.misc.fleeStage = Math.min(Math.max(currentFleeStage + change, -6), 6); + const currentFleeStage = globalScene.currentBattle.mysteryEncounter!.misc.fleeStage ?? 0; + globalScene.currentBattle.mysteryEncounter!.misc.fleeStage = Math.min(Math.max(currentFleeStage + change, -6), 6); return true; } -function tryChangeCatchStage(scene: BattleScene, change: number, chance?: number): boolean { +function tryChangeCatchStage(change: number, chance?: number): boolean { if (chance && randSeedInt(10) >= chance) { return false; } - const currentCatchStage = scene.currentBattle.mysteryEncounter!.misc.catchStage ?? 0; - scene.currentBattle.mysteryEncounter!.misc.catchStage = Math.min(Math.max(currentCatchStage + change, -6), 6); + const currentCatchStage = globalScene.currentBattle.mysteryEncounter!.misc.catchStage ?? 0; + globalScene.currentBattle.mysteryEncounter!.misc.catchStage = Math.min(Math.max(currentCatchStage + change, -6), 6); return true; } -async function doEndTurn(scene: BattleScene, cursorIndex: number) { +async function doEndTurn(cursorIndex: number) { // First cleanup and destroy old Pokemon objects that were left in the enemyParty // They are left in enemyParty temporarily so that VictoryPhase properly handles EXP - const party = scene.getEnemyParty(); + const party = globalScene.getEnemyParty(); if (party.length > 1) { for (let i = 1; i < party.length; i++) { party[i].destroy(); } - scene.currentBattle.enemyParty = party.slice(0, 1); + globalScene.currentBattle.enemyParty = party.slice(0, 1); } - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; const pokemon = encounter.misc.pokemon; const isFlee = isPokemonFlee(pokemon, encounter.misc.fleeStage); if (isFlee) { // Pokemon flees! - await doPokemonFlee(scene, pokemon); + await doPokemonFlee(pokemon); // Check how many safari pokemon left if (encounter.misc.safariPokemonRemaining > 0) { - await summonSafariPokemon(scene); - initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: true }); + await summonSafariPokemon(); + initSubsequentOptionSelect({ + overrideOptions: safariZoneGameOptions, + startingCursorIndex: cursorIndex, + hideDescription: true, + }); } else { // End safari mode encounter.continuousEncounter = false; - leaveEncounterWithoutBattle(scene, true); + leaveEncounterWithoutBattle(true); } } else { - scene.queueMessage(getEncounterText(scene, `${namespace}:safari.watching`) ?? "", 0, null, 1000); - initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: true }); + globalScene.queueMessage(getEncounterText(`${namespace}:safari.watching`) ?? "", 0, null, 1000); + initSubsequentOptionSelect({ + 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/shady-vitamin-dealer-encounter.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts index 8dd730492b1..b9476d49fec 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -1,18 +1,30 @@ -import { generateModifierType, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import { + generateModifierType, + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterExp, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { applyDamageToPokemon, applyModifierTypeToPlayerPokemon, isPokemonValidForEncounterOptionSelection } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + applyDamageToPokemon, + applyModifierTypeToPlayerPokemon, + isPokemonValidForEncounterOptionSelection, +} 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 { Nature } from "#enums/nature"; +import type { Nature } from "#enums/nature"; import { getNatureName } from "#app/data/nature"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import i18next from "i18next"; @@ -28,201 +40,204 @@ const VITAMIN_DEALER_EXPENSIVE_PRICE_MULTIPLIER = 5; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3798 | GitHub Issue #3798} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ShadyVitaminDealerEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER)) // Must have the money for at least the cheap deal - .withPrimaryPokemonHealthRatioRequirement([ 0.51, 1 ]) // At least 1 Pokemon must have above half HP - .withIntroSpriteConfigs([ - { - spriteKey: Species.KROOKODILE.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: 12, - y: -5, - yShadow: -5 - }, - { - spriteKey: "shady_vitamin_dealer", - fileRoot: "mystery-encounters", - hasShadow: true, - x: -12, - y: 3, - yShadow: 3 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Update money - updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); - // Calculate modifiers and dialogue tokens - const modifiers = [ - generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER)!, - generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER)!, - ]; - encounter.setDialogueToken("boost1", modifiers[0].name); - encounter.setDialogueToken("boost2", modifiers[1].name); - encounter.misc = { - chosenPokemon: pokemon, - modifiers: modifiers, - }; - }; - - // Only Pokemon that can gain benefits are above half HP with no status - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon meets primary pokemon reqs, it can be selected - if (!pokemon.isAllowed()) { - return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.getNameToRender() }) ?? null; - } - if (!encounter.pokemonMeetsPrimaryRequirements(scene, pokemon)) { - return getEncounterText(scene, `${namespace}:invalid_selection`) ?? null; - } - - return null; - }; - - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Choose Cheap Option - const encounter = scene.currentBattle.mysteryEncounter!; - const chosenPokemon = encounter.misc.chosenPokemon; - const modifiers = encounter.misc.modifiers; - - for (const modType of modifiers) { - await applyModifierTypeToPlayerPokemon(scene, chosenPokemon, modType); - } - - leaveEncounterWithoutBattle(scene, true); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Damage and status applied after dealer leaves (to make thematic sense) - const encounter = scene.currentBattle.mysteryEncounter!; - const chosenPokemon = encounter.misc.chosenPokemon as PlayerPokemon; - - // Pokemon takes half max HP damage and nature is randomized (does not update dex) - applyDamageToPokemon(scene, chosenPokemon, Math.floor(chosenPokemon.getMaxHp() / 2)); - - const currentNature = chosenPokemon.nature; - let newNature = randSeedInt(25) as Nature; - while (newNature === currentNature) { - newNature = randSeedInt(25) as Nature; - } - - chosenPokemon.customPokemonData.nature = newNature; - encounter.setDialogueToken("newNature", getNatureName(newNature)); - queueEncounterMessage(scene, `${namespace}:cheap_side_effects`); - setEncounterExp(scene, [ chosenPokemon.id ], 100); - await chosenPokemon.updateInfo(); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, VITAMIN_DEALER_EXPENSIVE_PRICE_MULTIPLIER) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Update money - updatePlayerMoney(scene, -(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); - // Calculate modifiers and dialogue tokens - const modifiers = [ - generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER)!, - generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER)!, - ]; - encounter.setDialogueToken("boost1", modifiers[0].name); - encounter.setDialogueToken("boost2", modifiers[1].name); - encounter.misc = { - chosenPokemon: pokemon, - modifiers: modifiers, - }; - }; - - // Only Pokemon that can gain benefits are unfainted - const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}:invalid_selection`); - }; - - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Choose Expensive Option - const encounter = scene.currentBattle.mysteryEncounter!; - const chosenPokemon = encounter.misc.chosenPokemon; - const modifiers = encounter.misc.modifiers; - - for (const modType of modifiers) { - await applyModifierTypeToPlayerPokemon(scene, chosenPokemon, modType); - } - - leaveEncounterWithoutBattle(scene, true); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Status applied after dealer leaves (to make thematic sense) - const encounter = scene.currentBattle.mysteryEncounter!; - const chosenPokemon = encounter.misc.chosenPokemon; - - queueEncounterMessage(scene, `${namespace}:no_bad_effects`); - setEncounterExp(scene, [ chosenPokemon.id ], 100); - - await chosenPokemon.updateInfo(); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, +export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.SHADY_VITAMIN_DEALER, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER)) // Must have the money for at least the cheap deal + .withPrimaryPokemonHealthRatioRequirement([0.51, 1]) // At least 1 Pokemon must have above half HP + .withIntroSpriteConfigs([ + { + spriteKey: Species.KROOKODILE.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 12, + y: -5, + yShadow: -5, + }, + { + spriteKey: "shady_vitamin_dealer", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -12, + y: 3, + yShadow: 3, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.3.selected`, - speaker: `${namespace}:speaker` + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + updatePlayerMoney(-(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); + // Calculate modifiers and dialogue tokens + const modifiers = [ + generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, + generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers, + }; + }; + + // Only Pokemon that can gain benefits are above half HP with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + if (!pokemon.isAllowedInChallenge()) { + return ( + i18next.t("partyUiHandler:cantBeUsed", { + pokemonName: pokemon.getNameToRender(), + }) ?? null + ); } - ] - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + if (!encounter.pokemonMeetsPrimaryRequirements(pokemon)) { + return getEncounterText(`${namespace}:invalid_selection`) ?? null; + } + + return null; + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + // Choose Cheap Option + const encounter = globalScene.currentBattle.mysteryEncounter!; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; + + for (const modType of modifiers) { + await applyModifierTypeToPlayerPokemon(chosenPokemon, modType); + } + + leaveEncounterWithoutBattle(true); + }) + .withPostOptionPhase(async () => { + // Damage and status applied after dealer leaves (to make thematic sense) + const encounter = globalScene.currentBattle.mysteryEncounter!; + const chosenPokemon = encounter.misc.chosenPokemon as PlayerPokemon; + + // Pokemon takes half max HP damage and nature is randomized (does not update dex) + applyDamageToPokemon(chosenPokemon, Math.floor(chosenPokemon.getMaxHp() / 2)); + + const currentNature = chosenPokemon.nature; + let newNature = randSeedInt(25) as Nature; + while (newNature === currentNature) { + newNature = randSeedInt(25) as Nature; + } + + chosenPokemon.setCustomNature(newNature); + encounter.setDialogueToken("newNature", getNatureName(newNature)); + queueEncounterMessage(`${namespace}:cheap_side_effects`); + setEncounterExp([chosenPokemon.id], 100); + await chosenPokemon.updateInfo(); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, VITAMIN_DEALER_EXPENSIVE_PRICE_MULTIPLIER) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + updatePlayerMoney(-(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); + // Calculate modifiers and dialogue tokens + const modifiers = [ + generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, + generateModifierType(modifierTypes.BASE_STAT_BOOSTER)!, + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers, + }; + }; + + // Only Pokemon that can gain benefits are unfainted + const selectableFilter = (pokemon: Pokemon) => { + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + // Choose Expensive Option + const encounter = globalScene.currentBattle.mysteryEncounter!; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; + + for (const modType of modifiers) { + await applyModifierTypeToPlayerPokemon(chosenPokemon, modType); + } + + leaveEncounterWithoutBattle(true); + }) + .withPostOptionPhase(async () => { + // Status applied after dealer leaves (to make thematic sense) + const encounter = globalScene.currentBattle.mysteryEncounter!; + const chosenPokemon = encounter.misc.chosenPokemon; + + queueEncounterMessage(`${namespace}:no_bad_effects`); + setEncounterExp([chosenPokemon.id], 100); + + await chosenPokemon.updateInfo(); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + speaker: `${namespace}:speaker`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 8ea19e1225b..bfa1204a8ba 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -1,13 +1,23 @@ import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; -import { StatusEffect } from "#app/data/status-effect"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import { StatusEffect } from "#enums/status-effect"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; +import type { EnemyPartyConfig, EnemyPokemonConfig } from "../utils/encounter-phase-utils"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + loadCustomMovesForEncounter, + setEncounterExp, + setEncounterRewards, +} from "../utils/encounter-phase-utils"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { Moves } from "#enums/moves"; import { BattlerIndex } from "#app/battle"; @@ -28,140 +38,148 @@ const namespace = "mysteryEncounters/slumberingSnorlax"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3815 | GitHub Issue #3815} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const SlumberingSnorlaxEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SLUMBERING_SNORLAX) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: Species.SNORLAX.toString(), - fileRoot: "pokemon", - hasShadow: true, - tint: 0.25, - scale: 1.25, - repeat: true, - y: 5, - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - console.log(encounter); +export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.SLUMBERING_SNORLAX, +) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: Species.SNORLAX.toString(), + fileRoot: "pokemon", + hasShadow: true, + tint: 0.25, + scale: 1.25, + repeat: true, + y: 5, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + console.log(encounter); - // Calculate boss mon - const bossSpecies = getPokemonSpecies(Species.SNORLAX); - const pokemonConfig: EnemyPokemonConfig = { - species: bossSpecies, - isBoss: true, - 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: [ - { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.SITRUS ]) as PokemonHeldItemModifierType, - stackCount: 2 - }, - { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.ENIGMA ]) as PokemonHeldItemModifierType, - stackCount: 2 - }, - ], - customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), - aiType: AiType.SMART // Required to ensure Snorlax uses Sleep Talk while it is asleep - }; - const config: EnemyPartyConfig = { - levelAdditiveModifier: 0.5, - pokemonConfigs: [ pokemonConfig ], - }; - encounter.enemyPartyConfigs = [ config ]; + // Calculate boss mon + const bossSpecies = getPokemonSpecies(Species.SNORLAX); + 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: [ + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + ], + customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), + aiType: AiType.SMART, // Required to ensure Snorlax uses Sleep Talk while it is asleep + }; + const config: EnemyPartyConfig = { + levelAdditiveModifier: 0.5, + pokemonConfigs: [pokemonConfig], + }; + encounter.enemyPartyConfigs = [config]; - // Load animations/sfx for Snorlax fight start moves - loadCustomMovesForEncounter(scene, [ Moves.SNORE ]); + // Load animations/sfx for Snorlax fight start moves + loadCustomMovesForEncounter([Moves.SNORE]); - encounter.setDialogueToken("snorlaxName", getPokemonSpecies(Species.SNORLAX).getName()); + encounter.setDialogueToken("snorlaxName", getPokemonSpecies(Species.SNORLAX).getName()); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], + fillRemaining: true, + }); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.SNORE), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.SNORE), + ignorePp: true, + }, + ); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Fall asleep waiting for Snorlax + // Full heal party + globalScene.unshiftPhase(new PartyHealPhase(true)); + queueEncounterMessage(`${namespace}:option.2.rest_result`); + leaveEncounterWithoutBattle(); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, selected: [ { - text: `${namespace}:option.1.selected`, + text: `${namespace}:option.3.selected`, }, ], - }, - async (scene: BattleScene) => { - // Pick battle - const encounter = scene.currentBattle.mysteryEncounter!; - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.LEFTOVERS ], fillRemaining: true }); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.SNORE), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.SNORE), - ignorePp: true - }); - await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Fall asleep waiting for Snorlax - // Full heal party - scene.unshiftPhase(new PartyHealPhase(scene, true)); - queueEncounterMessage(scene, `${namespace}:option.2.rest_result`); - leaveEncounterWithoutBattle(scene); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected` - } - ] - }) - .withOptionPhase(async (scene: BattleScene) => { - // Steal the Snorlax's Leftovers - const instance = scene.currentBattle.mysteryEncounter!; - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.LEFTOVERS ], fillRemaining: false }); - // Snorlax exp to Pokemon that did the stealing - setEncounterExp(scene, instance.primaryPokemon!.id, getPokemonSpecies(Species.SNORLAX).baseExp); - leaveEncounterWithoutBattle(scene); - }) - .build() - ) - .build(); + }) + .withOptionPhase(async () => { + // Steal the Snorlax's Leftovers + const instance = globalScene.currentBattle.mysteryEncounter!; + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], + fillRemaining: false, + }); + // Snorlax exp to Pokemon that did the stealing + setEncounterExp(instance.primaryPokemon!.id, getPokemonSpecies(Species.SNORLAX).baseExp); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index e8f11f02e18..c7220192caa 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -1,10 +1,20 @@ -import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierTypeOption, + initBattleWithEnemyConfig, + setEncounterExp, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MoneyRequirement, WaveModulusRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { EnemyPokemon } from "#app/field/pokemon"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import PokemonData from "#app/system/pokemon-data"; @@ -12,7 +22,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { Biome } from "#enums/biome"; import { getBiomeKey } from "#app/field/arena"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getPartyLuckValue, modifierTypes } from "#app/modifier/modifier-type"; import { TrainerSlot } from "#app/data/trainer-config"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -20,227 +30,250 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; -import { getEncounterPokemonLevelForWave, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + getEncounterPokemonLevelForWave, + STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounters/teleportingHijinks"; const MONEY_COST_MULTIPLIER = 1.75; -const BIOME_CANDIDATES = [ Biome.SPACE, Biome.FAIRY_CAVE, Biome.LABORATORY, Biome.ISLAND, Biome.WASTELAND, Biome.DOJO ]; -const MACHINE_INTERFACING_TYPES = [ Type.ELECTRIC, Type.STEEL ]; +const BIOME_CANDIDATES = [Biome.SPACE, Biome.FAIRY_CAVE, Biome.LABORATORY, Biome.ISLAND, Biome.WASTELAND, Biome.DOJO]; +const MACHINE_INTERFACING_TYPES = [PokemonType.ELECTRIC, PokemonType.STEEL]; /** * Teleporting Hijinks encounter. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3817 | GitHub Issue #3817} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TeleportingHijinksEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TELEPORTING_HIJINKS) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new WaveModulusRequirement([ 1, 2, 3 ], 10)) // Must be in first 3 waves after boss wave - .withSceneRequirement(new MoneyRequirement(0, MONEY_COST_MULTIPLIER)) // Must be able to pay teleport cost - .withAutoHideIntroVisuals(false) - .withCatchAllowed(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: "teleporting_hijinks_teleporter", - fileRoot: "mystery-encounters", - hasShadow: true, - x: 4, - y: 4, - yShadow: 1 - } - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const price = scene.getWaveMoneyAmount(MONEY_COST_MULTIPLIER); - encounter.setDialogueToken("price", price.toString()); - encounter.misc = { - price - }; +export const TeleportingHijinksEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.TELEPORTING_HIJINKS, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new WaveModulusRequirement([1, 2, 3], 10)) // Must be in first 3 waves after boss wave + .withSceneRequirement(new MoneyRequirement(0, MONEY_COST_MULTIPLIER)) // Must be able to pay teleport cost + .withAutoHideIntroVisuals(false) + .withCatchAllowed(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: "teleporting_hijinks_teleporter", + fileRoot: "mystery-encounters", + hasShadow: true, + x: 4, + y: 4, + yShadow: 1, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const price = globalScene.getWaveMoneyAmount(MONEY_COST_MULTIPLIER); + encounter.setDialogueToken("price", price.toString()); + encounter.misc = { + price, + }; - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, MONEY_COST_MULTIPLIER) // Must be able to pay teleport cost - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - } - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Update money - updatePlayerMoney(scene, -scene.currentBattle.mysteryEncounter!.misc.price, true, false); - }) - .withOptionPhase(async (scene: BattleScene) => { - const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(scene); - setEncounterRewards(scene, { fillRemaining: true }); - await initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPokemonTypeRequirement(MACHINE_INTERFACING_TYPES, true, 1) // Must have Steel or Electric type - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - } - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(scene); - setEncounterRewards(scene, { fillRemaining: true }); - setEncounterExp(scene, scene.currentBattle.mysteryEncounter!.selectedOption!.primaryPokemon!.id, 100); - await initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, MONEY_COST_MULTIPLIER) // Must be able to pay teleport cost + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.3.selected`, + text: `${namespace}:option.1.selected`, }, ], - }, - async (scene: BattleScene) => { - // Inspect the Machine - const encounter = scene.currentBattle.mysteryEncounter!; + }) + .withPreOptionPhase(async () => { + // Update money + updatePlayerMoney(-globalScene.currentBattle.mysteryEncounter!.misc.price, true, false); + }) + .withOptionPhase(async () => { + const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(); + setEncounterRewards({ fillRemaining: true }); + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPokemonTypeRequirement(MACHINE_INTERFACING_TYPES, true, 1) // Must have Steel or Electric type + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(); + setEncounterRewards({ fillRemaining: true }); + setEncounterExp(globalScene.currentBattle.mysteryEncounter!.selectedOption!.primaryPokemon!.id, 100); + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Inspect the Machine + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Init enemy - const level = getEncounterPokemonLevelForWave(scene, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); - encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + // Init enemy + const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); + const bossSpecies = globalScene.arena.randomSpecies( + globalScene.currentBattle.waveIndex, + level, + 0, + getPartyLuckValue(globalScene.getPlayerParty()), + true, + ); + const bossPokemon = new EnemyPokemon(bossSpecies, level, TrainerSlot.NONE, true); + encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { level: level, species: bossSpecies, dataSource: new PokemonData(bossPokemon), isBoss: true, - }], - }; + }, + ], + }; - const magnet = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.STEEL ])!; - const metalCoat = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.ELECTRIC ])!; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [ magnet, metalCoat ], fillRemaining: true }); - await transitionMysteryEncounterIntroVisuals(scene, true, true); - await initBattleWithEnemyConfig(scene, config); - } - ) - .build(); + const magnet = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [PokemonType.STEEL])!; + const metalCoat = generateModifierTypeOption(modifierTypes.ATTACK_TYPE_BOOSTER, [PokemonType.ELECTRIC])!; + setEncounterRewards({ + guaranteedModifierTypeOptions: [magnet, metalCoat], + fillRemaining: true, + }); + await transitionMysteryEncounterIntroVisuals(true, true); + await initBattleWithEnemyConfig(config); + }, + ) + .build(); -async function doBiomeTransitionDialogueAndBattleInit(scene: BattleScene) { - const encounter = scene.currentBattle.mysteryEncounter!; +async function doBiomeTransitionDialogueAndBattleInit() { + const encounter = globalScene.currentBattle.mysteryEncounter!; // Calculate new biome (cannot be current biome) - const filteredBiomes = BIOME_CANDIDATES.filter(b => scene.arena.biomeType !== b); + const filteredBiomes = BIOME_CANDIDATES.filter(b => globalScene.arena.biomeType !== b); const newBiome = filteredBiomes[randSeedInt(filteredBiomes.length)]; // Show dialogue and transition biome - await showEncounterText(scene, `${namespace}:transport`); - await Promise.all([ animateBiomeChange(scene, newBiome), transitionMysteryEncounterIntroVisuals(scene) ]); - scene.playBgm(); - await showEncounterText(scene, `${namespace}:attacked`); + await showEncounterText(`${namespace}:transport`); + await Promise.all([animateBiomeChange(newBiome), transitionMysteryEncounterIntroVisuals()]); + globalScene.updateBiomeWaveText(); + globalScene.playBgm(); + await showEncounterText(`${namespace}:attacked`); // Init enemy - const level = getEncounterPokemonLevelForWave(scene, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); + const level = getEncounterPokemonLevelForWave(STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER); + const bossSpecies = globalScene.arena.randomSpecies( + globalScene.currentBattle.waveIndex, + level, + 0, + getPartyLuckValue(globalScene.getPlayerParty()), + true, + ); + const bossPokemon = new EnemyPokemon(bossSpecies, level, TrainerSlot.NONE, true); encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); // Defense/Spd buffs below wave 50, +1 to all stats otherwise - const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = scene.currentBattle.waveIndex < 50 ? - [ Stat.DEF, Stat.SPDEF, Stat.SPD ] : - [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = + globalScene.currentBattle.waveIndex < 50 + ? [Stat.DEF, Stat.SPDEF, Stat.SPD] + : [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; const config: EnemyPartyConfig = { - pokemonConfigs: [{ - level: level, - species: bossSpecies, - dataSource: new PokemonData(bossPokemon), - isBoss: true, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:boss_enraged`); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); - } - }], + pokemonConfigs: [ + { + level: level, + species: bossSpecies, + dataSource: new PokemonData(bossPokemon), + isBoss: true, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(`${namespace}:boss_enraged`); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); + }, + }, + ], }; return config; } -async function animateBiomeChange(scene: BattleScene, nextBiome: Biome) { +async function animateBiomeChange(nextBiome: Biome) { return new Promise(resolve => { - scene.tweens.add({ - targets: [ scene.arenaEnemy, scene.lastEnemyTrainer ], + globalScene.tweens.add({ + targets: [globalScene.arenaEnemy, globalScene.lastEnemyTrainer], x: "+=300", duration: 2000, onComplete: () => { - scene.newArena(nextBiome); + globalScene.newArena(nextBiome); const biomeKey = getBiomeKey(nextBiome); const bgTexture = `${biomeKey}_bg`; - scene.arenaBgTransition.setTexture(bgTexture); - scene.arenaBgTransition.setAlpha(0); - scene.arenaBgTransition.setVisible(true); - scene.arenaPlayerTransition.setBiome(nextBiome); - scene.arenaPlayerTransition.setAlpha(0); - scene.arenaPlayerTransition.setVisible(true); + globalScene.arenaBgTransition.setTexture(bgTexture); + globalScene.arenaBgTransition.setAlpha(0); + globalScene.arenaBgTransition.setVisible(true); + globalScene.arenaPlayerTransition.setBiome(nextBiome); + globalScene.arenaPlayerTransition.setAlpha(0); + globalScene.arenaPlayerTransition.setVisible(true); - scene.tweens.add({ - targets: [ scene.arenaPlayer, scene.arenaBgTransition, scene.arenaPlayerTransition ], + globalScene.tweens.add({ + targets: [globalScene.arenaPlayer, globalScene.arenaBgTransition, globalScene.arenaPlayerTransition], duration: 1000, ease: "Sine.easeInOut", - alpha: (target: any) => target === scene.arenaPlayer ? 0 : 1, + alpha: (target: any) => (target === globalScene.arenaPlayer ? 0 : 1), onComplete: () => { - scene.arenaBg.setTexture(bgTexture); - scene.arenaPlayer.setBiome(nextBiome); - scene.arenaPlayer.setAlpha(1); - scene.arenaEnemy.setBiome(nextBiome); - scene.arenaEnemy.setAlpha(1); - scene.arenaNextEnemy.setBiome(nextBiome); - scene.arenaBgTransition.setVisible(false); - scene.arenaPlayerTransition.setVisible(false); - if (scene.lastEnemyTrainer) { - scene.lastEnemyTrainer.destroy(); + globalScene.arenaBg.setTexture(bgTexture); + globalScene.arenaPlayer.setBiome(nextBiome); + globalScene.arenaPlayer.setAlpha(1); + globalScene.arenaEnemy.setBiome(nextBiome); + globalScene.arenaEnemy.setAlpha(1); + globalScene.arenaNextEnemy.setBiome(nextBiome); + globalScene.arenaBgTransition.setVisible(false); + globalScene.arenaPlayerTransition.setVisible(false); + if (globalScene.lastEnemyTrainer) { + globalScene.lastEnemyTrainer.destroy(); } resolve(); - scene.tweens.add({ - targets: scene.arenaEnemy, + globalScene.tweens.add({ + targets: globalScene.arenaEnemy, x: "-=300", }); - } + }, }); - } + }, }); }); } 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 610209f8aad..2b29046f738 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 @@ -1,9 +1,15 @@ -import { EnemyPartyConfig, generateModifierType, handleMysteryEncounterBattleFailed, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + handleMysteryEncounterBattleFailed, + initBattleWithEnemyConfig, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs } from "#app/data/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { randSeedShuffle } from "#app/utils"; -import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import type MysteryEncounter from "../mystery-encounter"; +import { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { Biome } from "#enums/biome"; @@ -14,18 +20,17 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; import { Nature } from "#enums/nature"; import { Moves } from "#enums/moves"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { IEggOptions } from "#app/data/egg"; +import type { IEggOptions } from "#app/data/egg"; 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 "#app/data/type"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { PokemonType } from "#enums/pokemon-type"; import { getPokeballTintColor } from "#app/data/pokeball"; -import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/theExpertPokemonBreeder"; @@ -38,7 +43,7 @@ const FINAL_STAGE_EVOLUTION_WAVE = 75; const FRIENDSHIP_ADDED = 20; -class BreederSpeciesEvolution { +class BreederSpeciesEvolution { species: Species; evolution: number; @@ -49,29 +54,65 @@ class BreederSpeciesEvolution { } const POOL_1_POKEMON: (Species | BreederSpeciesEvolution)[][] = [ - [ Species.MUNCHLAX, new BreederSpeciesEvolution(Species.SNORLAX, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.HAPPINY, new BreederSpeciesEvolution(Species.CHANSEY, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.BLISSEY, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.MAGBY, new BreederSpeciesEvolution(Species.MAGMAR, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.MAGMORTAR, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.ELEKID, new BreederSpeciesEvolution(Species.ELECTABUZZ, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.ELECTIVIRE, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.RIOLU, new BreederSpeciesEvolution(Species.LUCARIO, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.BUDEW, new BreederSpeciesEvolution(Species.ROSELIA, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.ROSERADE, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.TOXEL, new BreederSpeciesEvolution(Species.TOXTRICITY, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.MIME_JR, new BreederSpeciesEvolution(Species.GALAR_MR_MIME, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.MR_RIME, FINAL_STAGE_EVOLUTION_WAVE) ] + [Species.MUNCHLAX, new BreederSpeciesEvolution(Species.SNORLAX, SECOND_STAGE_EVOLUTION_WAVE)], + [ + Species.HAPPINY, + new BreederSpeciesEvolution(Species.CHANSEY, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.BLISSEY, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + Species.MAGBY, + new BreederSpeciesEvolution(Species.MAGMAR, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.MAGMORTAR, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + Species.ELEKID, + new BreederSpeciesEvolution(Species.ELECTABUZZ, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.ELECTIVIRE, FINAL_STAGE_EVOLUTION_WAVE), + ], + [Species.RIOLU, new BreederSpeciesEvolution(Species.LUCARIO, SECOND_STAGE_EVOLUTION_WAVE)], + [ + Species.BUDEW, + new BreederSpeciesEvolution(Species.ROSELIA, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.ROSERADE, FINAL_STAGE_EVOLUTION_WAVE), + ], + [Species.TOXEL, new BreederSpeciesEvolution(Species.TOXTRICITY, SECOND_STAGE_EVOLUTION_WAVE)], + [ + Species.MIME_JR, + new BreederSpeciesEvolution(Species.GALAR_MR_MIME, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.MR_RIME, FINAL_STAGE_EVOLUTION_WAVE), + ], ]; const POOL_2_POKEMON: (Species | BreederSpeciesEvolution)[][] = [ - [ Species.PICHU, new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.RAICHU, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.PICHU, new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.ALOLA_RAICHU, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.SMOOCHUM, new BreederSpeciesEvolution(Species.JYNX, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONLEE, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONCHAN, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONTOP, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.IGGLYBUFF, new BreederSpeciesEvolution(Species.JIGGLYPUFF, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.WIGGLYTUFF, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.AZURILL, new BreederSpeciesEvolution(Species.MARILL, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(Species.AZUMARILL, FINAL_STAGE_EVOLUTION_WAVE) ], - [ Species.WYNAUT, new BreederSpeciesEvolution(Species.WOBBUFFET, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.CHINGLING, new BreederSpeciesEvolution(Species.CHIMECHO, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.BONSLY, new BreederSpeciesEvolution(Species.SUDOWOODO, SECOND_STAGE_EVOLUTION_WAVE) ], - [ Species.MANTYKE, new BreederSpeciesEvolution(Species.MANTINE, SECOND_STAGE_EVOLUTION_WAVE) ] + [ + Species.PICHU, + new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.RAICHU, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + Species.PICHU, + new BreederSpeciesEvolution(Species.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.ALOLA_RAICHU, FINAL_STAGE_EVOLUTION_WAVE), + ], + [Species.SMOOCHUM, new BreederSpeciesEvolution(Species.JYNX, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONLEE, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONCHAN, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.TYROGUE, new BreederSpeciesEvolution(Species.HITMONTOP, SECOND_STAGE_EVOLUTION_WAVE)], + [ + Species.IGGLYBUFF, + new BreederSpeciesEvolution(Species.JIGGLYPUFF, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.WIGGLYTUFF, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + Species.AZURILL, + new BreederSpeciesEvolution(Species.MARILL, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(Species.AZUMARILL, FINAL_STAGE_EVOLUTION_WAVE), + ], + [Species.WYNAUT, new BreederSpeciesEvolution(Species.WOBBUFFET, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.CHINGLING, new BreederSpeciesEvolution(Species.CHIMECHO, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.BONSLY, new BreederSpeciesEvolution(Species.SUDOWOODO, SECOND_STAGE_EVOLUTION_WAVE)], + [Species.MANTYKE, new BreederSpeciesEvolution(Species.MANTINE, SECOND_STAGE_EVOLUTION_WAVE)], ]; /** @@ -79,361 +120,425 @@ const POOL_2_POKEMON: (Species | BreederSpeciesEvolution)[][] = [ * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3818 | GitHub Issue #3818} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TheExpertPokemonBreederEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withScenePartySizeRequirement(4, 6, true) // Must have at least 4 legal pokemon in party - .withIntroSpriteConfigs([]) // These are set in onInit() - .withIntroDialogue([ +export const TheExpertPokemonBreederEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(4, 6, true) // Must have at least 4 legal pokemon in party + .withIntroSpriteConfigs([]) // These are set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: trainerNameKey, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const waveIndex = globalScene.currentBattle.waveIndex; + // Calculates what trainers are available for battle in the encounter + + // If player is in space biome, uses special "Space" version of the trainer + encounter.enemyPartyConfigs = [getPartyConfig()]; + + const cleffaSpecies = + waveIndex < FIRST_STAGE_EVOLUTION_WAVE + ? Species.CLEFFA + : waveIndex < FINAL_STAGE_EVOLUTION_WAVE + ? Species.CLEFAIRY + : Species.CLEFABLE; + encounter.spriteConfigs = [ { - text: `${namespace}:intro`, + spriteKey: cleffaSpecies.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 14, + y: -2, + yShadow: -2, }, { - speaker: trainerNameKey, - text: `${namespace}:intro_dialogue`, + spriteKey: "expert_pokemon_breeder", + fileRoot: "trainer", + hasShadow: true, + x: -14, + y: 4, + yShadow: 2, }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const waveIndex = scene.currentBattle.waveIndex; - // Calculates what trainers are available for battle in the encounter + ]; - // If player is in space biome, uses special "Space" version of the trainer - encounter.enemyPartyConfigs = [ - getPartyConfig(scene) - ]; + // Determine the 3 pokemon the player can battle with + let partyCopy = globalScene.getPlayerParty().slice(0); + partyCopy = partyCopy.filter(p => p.isAllowedInBattle()).sort((a, b) => a.friendship - b.friendship); - const cleffaSpecies = waveIndex < FIRST_STAGE_EVOLUTION_WAVE ? Species.CLEFFA : waveIndex < FINAL_STAGE_EVOLUTION_WAVE ? Species.CLEFAIRY : Species.CLEFABLE; - encounter.spriteConfigs = [ - { - spriteKey: cleffaSpecies.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: 14, - y: -2, - yShadow: -2 - }, - { - spriteKey: "expert_pokemon_breeder", - fileRoot: "trainer", - hasShadow: true, - x: -14, - y: 4, - yShadow: 2 - }, - ]; + const pokemon1 = partyCopy[0]; + const pokemon2 = partyCopy[1]; + const pokemon3 = partyCopy[2]; + encounter.setDialogueToken("pokemon1Name", pokemon1.getNameToRender()); + encounter.setDialogueToken("pokemon2Name", pokemon2.getNameToRender()); + encounter.setDialogueToken("pokemon3Name", pokemon3.getNameToRender()); - // Determine the 3 pokemon the player can battle with - let partyCopy = scene.getParty().slice(0); - partyCopy = partyCopy - .filter(p => p.isAllowedInBattle()) - .sort((a, b) => a.friendship - b.friendship); + // Dialogue and egg calcs for Pokemon 1 + const [pokemon1CommonEggs, pokemon1RareEggs] = calculateEggRewardsForPokemon(pokemon1); + let pokemon1Tooltip = getEncounterText(`${namespace}:option.1.tooltip_base`)!; + if (pokemon1RareEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon1RareEggs, + rarity: i18next.t("egg:greatTier"), + }); + pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon1RareEggs", eggsText); + } + if (pokemon1CommonEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon1CommonEggs, + rarity: i18next.t("egg:defaultTier"), + }); + pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon1CommonEggs", eggsText); + } + encounter.options[0].dialogue!.buttonTooltip = pokemon1Tooltip; - const pokemon1 = partyCopy[0]; - const pokemon2 = partyCopy[1]; - const pokemon3 = partyCopy[2]; - encounter.setDialogueToken("pokemon1Name", pokemon1.getNameToRender()); - encounter.setDialogueToken("pokemon2Name", pokemon2.getNameToRender()); - encounter.setDialogueToken("pokemon3Name", pokemon3.getNameToRender()); + // Dialogue and egg calcs for Pokemon 2 + const [pokemon2CommonEggs, pokemon2RareEggs] = calculateEggRewardsForPokemon(pokemon2); + let pokemon2Tooltip = getEncounterText(`${namespace}:option.2.tooltip_base`)!; + if (pokemon2RareEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon2RareEggs, + rarity: i18next.t("egg:greatTier"), + }); + pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon2RareEggs", eggsText); + } + if (pokemon2CommonEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon2CommonEggs, + rarity: i18next.t("egg:defaultTier"), + }); + pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon2CommonEggs", eggsText); + } + encounter.options[1].dialogue!.buttonTooltip = pokemon2Tooltip; - // Dialogue and egg calcs for Pokemon 1 - const [ pokemon1CommonEggs, pokemon1RareEggs ] = calculateEggRewardsForPokemon(pokemon1); - let pokemon1Tooltip = getEncounterText(scene, `${namespace}:option.1.tooltip_base`)!; - if (pokemon1RareEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon1RareEggs, rarity: i18next.t("egg:greatTier") }); - pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon1RareEggs", eggsText); - } - if (pokemon1CommonEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon1CommonEggs, rarity: i18next.t("egg:defaultTier") }); - pokemon1Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon1CommonEggs", eggsText); - } - encounter.options[0].dialogue!.buttonTooltip = pokemon1Tooltip; + // Dialogue and egg calcs for Pokemon 3 + const [pokemon3CommonEggs, pokemon3RareEggs] = calculateEggRewardsForPokemon(pokemon3); + let pokemon3Tooltip = getEncounterText(`${namespace}:option.3.tooltip_base`)!; + if (pokemon3RareEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon3RareEggs, + rarity: i18next.t("egg:greatTier"), + }); + pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon3RareEggs", eggsText); + } + if (pokemon3CommonEggs > 0) { + const eggsText = i18next.t(`${namespace}:numEggs`, { + count: pokemon3CommonEggs, + rarity: i18next.t("egg:defaultTier"), + }); + pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { + eggs: eggsText, + }); + encounter.setDialogueToken("pokemon3CommonEggs", eggsText); + } + encounter.options[2].dialogue!.buttonTooltip = pokemon3Tooltip; - // Dialogue and egg calcs for Pokemon 2 - const [ pokemon2CommonEggs, pokemon2RareEggs ] = calculateEggRewardsForPokemon(pokemon2); - let pokemon2Tooltip = getEncounterText(scene, `${namespace}:option.2.tooltip_base`)!; - if (pokemon2RareEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon2RareEggs, rarity: i18next.t("egg:greatTier") }); - pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon2RareEggs", eggsText); - } - if (pokemon2CommonEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon2CommonEggs, rarity: i18next.t("egg:defaultTier") }); - pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon2CommonEggs", eggsText); - } - encounter.options[1].dialogue!.buttonTooltip = pokemon2Tooltip; + encounter.misc = { + pokemon1, + pokemon1CommonEggs, + pokemon1RareEggs, + pokemon2, + pokemon2CommonEggs, + pokemon2RareEggs, + pokemon3, + pokemon3CommonEggs, + pokemon3RareEggs, + }; - // Dialogue and egg calcs for Pokemon 3 - const [ pokemon3CommonEggs, pokemon3RareEggs ] = calculateEggRewardsForPokemon(pokemon3); - let pokemon3Tooltip = getEncounterText(scene, `${namespace}:option.3.tooltip_base`)!; - if (pokemon3RareEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon3RareEggs, rarity: i18next.t("egg:greatTier") }); - pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon3RareEggs", eggsText); - } - if (pokemon3CommonEggs > 0) { - const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon3CommonEggs, rarity: i18next.t("egg:defaultTier") }); - pokemon3Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon3CommonEggs", eggsText); - } - encounter.options[2].dialogue!.buttonTooltip = pokemon3Tooltip; + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + selected: [ + { + speaker: trainerNameKey, + text: `${namespace}:option.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn battle with first pokemon + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - encounter.misc = { - pokemon1, - pokemon1CommonEggs, - pokemon1RareEggs, - pokemon2, - pokemon2CommonEggs, - pokemon2RareEggs, - pokemon3, - pokemon3CommonEggs, - pokemon3RareEggs - }; + const { pokemon1, pokemon1CommonEggs, pokemon1RareEggs } = encounter.misc; + encounter.misc.chosenPokemon = pokemon1; + encounter.setDialogueToken("chosenPokemon", pokemon1.getNameToRender()); + const eggOptions = getEggOptions(pokemon1CommonEggs, pokemon1RareEggs); + setEncounterRewards( + { + guaranteedModifierTypeFuncs: [modifierTypes.SOOTHE_BELL], + fillRemaining: true, + }, + eggOptions, + () => doPostEncounterCleanup(), + ); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - selected: [ - { - speaker: trainerNameKey, - text: `${namespace}:option.selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Spawn battle with first pokemon - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + // Remove all Pokemon from the party except the chosen Pokemon + removePokemonFromPartyAndStoreHeldItems(encounter, pokemon1); - const { pokemon1, pokemon1CommonEggs, pokemon1RareEggs } = encounter.misc; - encounter.misc.chosenPokemon = pokemon1; - encounter.setDialogueToken("chosenPokemon", pokemon1.getNameToRender()); - const eggOptions = getEggOptions(scene, pokemon1CommonEggs, pokemon1RareEggs); - setEncounterRewards(scene, - { guaranteedModifierTypeFuncs: [ modifierTypes.SOOTHE_BELL ], fillRemaining: true }, - eggOptions, - () => doPostEncounterCleanup(scene)); + // Configure outro dialogue for egg rewards + encounter.dialogue.outro = [ + { + speaker: trainerNameKey, + text: `${namespace}:outro`, + }, + ]; + if (encounter.dialogueTokens.hasOwnProperty("pokemon1CommonEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon1CommonEggs"], + }), + }); + } + if (encounter.dialogueTokens.hasOwnProperty("pokemon1RareEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon1RareEggs"], + }), + }); + } - // Remove all Pokemon from the party except the chosen Pokemon - removePokemonFromPartyAndStoreHeldItems(scene, encounter, pokemon1); + encounter.onGameOver = onGameOver; + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + selected: [ + { + speaker: trainerNameKey, + text: `${namespace}:option.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn battle with second pokemon + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Configure outro dialogue for egg rewards - encounter.dialogue.outro = [ - { - speaker: trainerNameKey, - text: `${namespace}:outro`, - }, - ]; - if (encounter.dialogueTokens.hasOwnProperty("pokemon1CommonEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon1CommonEggs"] }), - }); - } - if (encounter.dialogueTokens.hasOwnProperty("pokemon1RareEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon1RareEggs"] }), - }); - } + const { pokemon2, pokemon2CommonEggs, pokemon2RareEggs } = encounter.misc; + encounter.misc.chosenPokemon = pokemon2; + encounter.setDialogueToken("chosenPokemon", pokemon2.getNameToRender()); + const eggOptions = getEggOptions(pokemon2CommonEggs, pokemon2RareEggs); + setEncounterRewards( + { + guaranteedModifierTypeFuncs: [modifierTypes.SOOTHE_BELL], + fillRemaining: true, + }, + eggOptions, + () => doPostEncounterCleanup(), + ); - encounter.onGameOver = onGameOver; - await initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - selected: [ - { - speaker: trainerNameKey, - text: `${namespace}:option.selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Spawn battle with second pokemon - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + // Remove all Pokemon from the party except the chosen Pokemon + removePokemonFromPartyAndStoreHeldItems(encounter, pokemon2); - const { pokemon2, pokemon2CommonEggs, pokemon2RareEggs } = encounter.misc; - encounter.misc.chosenPokemon = pokemon2; - encounter.setDialogueToken("chosenPokemon", pokemon2.getNameToRender()); - const eggOptions = getEggOptions(scene, pokemon2CommonEggs, pokemon2RareEggs); - setEncounterRewards(scene, - { guaranteedModifierTypeFuncs: [ modifierTypes.SOOTHE_BELL ], fillRemaining: true }, - eggOptions, - () => doPostEncounterCleanup(scene)); + // Configure outro dialogue for egg rewards + encounter.dialogue.outro = [ + { + speaker: trainerNameKey, + text: `${namespace}:outro`, + }, + ]; + if (encounter.dialogueTokens.hasOwnProperty("pokemon2CommonEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon2CommonEggs"], + }), + }); + } + if (encounter.dialogueTokens.hasOwnProperty("pokemon2RareEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon2RareEggs"], + }), + }); + } - // Remove all Pokemon from the party except the chosen Pokemon - removePokemonFromPartyAndStoreHeldItems(scene, encounter, pokemon2); + encounter.onGameOver = onGameOver; + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + selected: [ + { + speaker: trainerNameKey, + text: `${namespace}:option.selected`, + }, + ], + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Spawn battle with third pokemon + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Configure outro dialogue for egg rewards - encounter.dialogue.outro = [ - { - speaker: trainerNameKey, - text: `${namespace}:outro`, - }, - ]; - if (encounter.dialogueTokens.hasOwnProperty("pokemon2CommonEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon2CommonEggs"] }), - }); - } - if (encounter.dialogueTokens.hasOwnProperty("pokemon2RareEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon2RareEggs"] }), - }); - } + const { pokemon3, pokemon3CommonEggs, pokemon3RareEggs } = encounter.misc; + encounter.misc.chosenPokemon = pokemon3; + encounter.setDialogueToken("chosenPokemon", pokemon3.getNameToRender()); + const eggOptions = getEggOptions(pokemon3CommonEggs, pokemon3RareEggs); + setEncounterRewards( + { + guaranteedModifierTypeFuncs: [modifierTypes.SOOTHE_BELL], + fillRemaining: true, + }, + eggOptions, + () => doPostEncounterCleanup(), + ); - encounter.onGameOver = onGameOver; - await initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - selected: [ - { - speaker: trainerNameKey, - text: `${namespace}:option.selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Spawn battle with third pokemon - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + // Remove all Pokemon from the party except the chosen Pokemon + removePokemonFromPartyAndStoreHeldItems(encounter, pokemon3); - const { pokemon3, pokemon3CommonEggs, pokemon3RareEggs } = encounter.misc; - encounter.misc.chosenPokemon = pokemon3; - encounter.setDialogueToken("chosenPokemon", pokemon3.getNameToRender()); - const eggOptions = getEggOptions(scene, pokemon3CommonEggs, pokemon3RareEggs); - setEncounterRewards(scene, - { guaranteedModifierTypeFuncs: [ modifierTypes.SOOTHE_BELL ], fillRemaining: true }, - eggOptions, - () => doPostEncounterCleanup(scene)); + // Configure outro dialogue for egg rewards + encounter.dialogue.outro = [ + { + speaker: trainerNameKey, + text: `${namespace}:outro`, + }, + ]; + if (encounter.dialogueTokens.hasOwnProperty("pokemon3CommonEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon3CommonEggs"], + }), + }); + } + if (encounter.dialogueTokens.hasOwnProperty("pokemon3RareEggs")) { + encounter.dialogue.outro.push({ + text: i18next.t(`${namespace}:gained_eggs`, { + numEggs: encounter.dialogueTokens["pokemon3RareEggs"], + }), + }); + } - // Remove all Pokemon from the party except the chosen Pokemon - removePokemonFromPartyAndStoreHeldItems(scene, encounter, pokemon3); + encounter.onGameOver = onGameOver; + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOutroDialogue([ + { + speaker: trainerNameKey, + text: `${namespace}:outro`, + }, + ]) + .build(); - // Configure outro dialogue for egg rewards - encounter.dialogue.outro = [ - { - speaker: trainerNameKey, - text: `${namespace}:outro`, - }, - ]; - if (encounter.dialogueTokens.hasOwnProperty("pokemon3CommonEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon3CommonEggs"] }), - }); - } - if (encounter.dialogueTokens.hasOwnProperty("pokemon3RareEggs")) { - encounter.dialogue.outro.push({ - text: i18next.t(`${namespace}:gained_eggs`, { numEggs: encounter.dialogueTokens["pokemon3RareEggs"] }), - }); - } - - encounter.onGameOver = onGameOver; - await initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withOutroDialogue([ - { - speaker: trainerNameKey, - text: `${namespace}:outro`, - }, - ]) - .build(); - -function getPartyConfig(scene: BattleScene): EnemyPartyConfig { +function getPartyConfig(): EnemyPartyConfig { // Bug type superfan trainer config - const waveIndex = scene.currentBattle.waveIndex; + const waveIndex = globalScene.currentBattle.waveIndex; const breederConfig = trainerConfigs[TrainerType.EXPERT_POKEMON_BREEDER].clone(); breederConfig.name = i18next.t(trainerNameKey); // First mon is *always* this special cleffa - const cleffaSpecies = waveIndex < FIRST_STAGE_EVOLUTION_WAVE ? Species.CLEFFA : waveIndex < FINAL_STAGE_EVOLUTION_WAVE ? Species.CLEFAIRY : Species.CLEFABLE; + const cleffaSpecies = + waveIndex < FIRST_STAGE_EVOLUTION_WAVE + ? Species.CLEFFA + : waveIndex < FINAL_STAGE_EVOLUTION_WAVE + ? Species.CLEFAIRY + : Species.CLEFABLE; const baseConfig: EnemyPartyConfig = { trainerType: TrainerType.EXPERT_POKEMON_BREEDER, pokemonConfigs: [ { - nickname: i18next.t(`${namespace}:cleffa_1_nickname`, { speciesName: getPokemonSpecies(cleffaSpecies).getName() }), + nickname: i18next.t(`${namespace}:cleffa_1_nickname`, { + speciesName: getPokemonSpecies(cleffaSpecies).getName(), + }), species: getPokemonSpecies(cleffaSpecies), isBoss: false, abilityIndex: 1, // Magic Guard shiny: false, nature: Nature.ADAMANT, - moveSet: [ Moves.METEOR_MASH, Moves.FIRE_PUNCH, Moves.ICE_PUNCH, Moves.THUNDER_PUNCH ], - ivs: [ 31, 31, 31, 31, 31, 31 ], - modifierConfigs: [ - { - modifier: generateModifierType(scene, modifierTypes.TERA_SHARD, [ Type.STEEL ]) as PokemonHeldItemModifierType, - } - ] - } - ] + moveSet: [Moves.METEOR_MASH, Moves.FIRE_PUNCH, Moves.ICE_PUNCH, Moves.THUNDER_PUNCH], + ivs: [31, 31, 31, 31, 31, 31], + tera: PokemonType.STEEL, + }, + ], }; - if (scene.arena.biomeType === Biome.SPACE) { + if (globalScene.arena.biomeType === Biome.SPACE) { // All 3 members always Cleffa line, but different configs - baseConfig.pokemonConfigs!.push({ - nickname: i18next.t(`${namespace}:cleffa_2_nickname`, { speciesName: getPokemonSpecies(cleffaSpecies).getName() }), - species: getPokemonSpecies(cleffaSpecies), - isBoss: false, - abilityIndex: 1, // Magic Guard - shiny: true, - variant: 1, - nature: Nature.MODEST, - moveSet: [ Moves.MOONBLAST, Moves.MYSTICAL_FIRE, Moves.ICE_BEAM, Moves.THUNDERBOLT ], - ivs: [ 31, 31, 31, 31, 31, 31 ] - }, - { - nickname: i18next.t(`${namespace}:cleffa_3_nickname`, { speciesName: getPokemonSpecies(cleffaSpecies).getName() }), - species: getPokemonSpecies(cleffaSpecies), - isBoss: false, - abilityIndex: 2, // Friend Guard / Unaware - shiny: true, - variant: 2, - nature: Nature.BOLD, - moveSet: [ Moves.TRI_ATTACK, Moves.STORED_POWER, Moves.TAKE_HEART, Moves.MOONLIGHT ], - ivs: [ 31, 31, 31, 31, 31, 31 ] - }); + baseConfig.pokemonConfigs!.push( + { + nickname: i18next.t(`${namespace}:cleffa_2_nickname`, { + speciesName: getPokemonSpecies(cleffaSpecies).getName(), + }), + species: getPokemonSpecies(cleffaSpecies), + isBoss: false, + abilityIndex: 1, // Magic Guard + shiny: true, + variant: 1, + nature: Nature.MODEST, + moveSet: [Moves.MOONBLAST, Moves.MYSTICAL_FIRE, Moves.ICE_BEAM, Moves.THUNDERBOLT], + ivs: [31, 31, 31, 31, 31, 31], + }, + { + nickname: i18next.t(`${namespace}:cleffa_3_nickname`, { + speciesName: getPokemonSpecies(cleffaSpecies).getName(), + }), + species: getPokemonSpecies(cleffaSpecies), + isBoss: false, + abilityIndex: 2, // Friend Guard / Unaware + shiny: true, + variant: 2, + nature: Nature.BOLD, + moveSet: [Moves.TRI_ATTACK, Moves.STORED_POWER, Moves.TAKE_HEART, Moves.MOONLIGHT], + ivs: [31, 31, 31, 31, 31, 31], + }, + ); } else { // Second member from pool 1 const pool1Species = getSpeciesFromPool(POOL_1_POKEMON, waveIndex); // Third member from pool 2 const pool2Species = getSpeciesFromPool(POOL_2_POKEMON, waveIndex); - baseConfig.pokemonConfigs!.push({ - species: getPokemonSpecies(pool1Species), - isBoss: false, - ivs: [ 31, 31, 31, 31, 31, 31 ] - }, - { - species: getPokemonSpecies(pool2Species), - isBoss: false, - ivs: [ 31, 31, 31, 31, 31, 31 ] - }); + baseConfig.pokemonConfigs!.push( + { + species: getPokemonSpecies(pool1Species), + isBoss: false, + ivs: [31, 31, 31, 31, 31, 31], + }, + { + species: getPokemonSpecies(pool2Species), + isBoss: false, + ivs: [31, 31, 31, 31, 31, 31], + }, + ); } return baseConfig; @@ -450,7 +555,7 @@ function getSpeciesFromPool(speciesPool: (Species | BreederSpeciesEvolution)[][] } function calculateEggRewardsForPokemon(pokemon: PlayerPokemon): [number, number] { - const bst = pokemon.calculateBaseStats().reduce((a, b) => a + b, 0); + const bst = pokemon.getSpeciesForm().getBaseStatTotal(); // 1 point for every 20 points below 680 BST the pokemon is, (max 18, min 1) const pointsFromBst = Math.min(Math.max(Math.floor((680 - bst) / 20), 1), 18); @@ -474,32 +579,30 @@ function calculateEggRewardsForPokemon(pokemon: PlayerPokemon): [number, number] // 1 Common egg for every point leftover numCommons += totalPoints % 4; - return [ numCommons, numRares ]; + return [numCommons, numRares]; } -function getEggOptions(scene: BattleScene, commonEggs: number, rareEggs: number) { +function getEggOptions(commonEggs: number, rareEggs: number) { const eggDescription = i18next.t(`${namespace}:title`) + ":\n" + i18next.t(trainerNameKey); const eggOptions: IEggOptions[] = []; if (commonEggs > 0) { for (let i = 0; i < commonEggs; i++) { eggOptions.push({ - scene, pulled: false, sourceType: EggSourceType.EVENT, eggDescriptor: eggDescription, - tier: EggTier.COMMON + tier: EggTier.COMMON, }); } } if (rareEggs > 0) { for (let i = 0; i < rareEggs; i++) { eggOptions.push({ - scene, pulled: false, sourceType: EggSourceType.EVENT, eggDescriptor: eggDescription, - tier: EggTier.RARE + tier: EggTier.RARE, }); } } @@ -507,42 +610,33 @@ function getEggOptions(scene: BattleScene, commonEggs: number, rareEggs: number) return eggOptions; } -function removePokemonFromPartyAndStoreHeldItems(scene: BattleScene, encounter: MysteryEncounter, chosenPokemon: PlayerPokemon) { - const party = scene.getParty(); +function removePokemonFromPartyAndStoreHeldItems(encounter: MysteryEncounter, chosenPokemon: PlayerPokemon) { + const party = globalScene.getPlayerParty(); const chosenIndex = party.indexOf(chosenPokemon); party[chosenIndex] = party[0]; party[0] = chosenPokemon; - encounter.misc.originalParty = scene.getParty().slice(1); - encounter.misc.originalPartyHeldItems = encounter.misc.originalParty - .map(p => p.getHeldItems()); - scene["party"] = [ - chosenPokemon - ]; + encounter.misc.originalParty = globalScene.getPlayerParty().slice(1); + encounter.misc.originalPartyHeldItems = encounter.misc.originalParty.map(p => p.getHeldItems()); + globalScene["party"] = [chosenPokemon]; } -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!; +function restorePartyAndHeldItems() { + const encounter = globalScene.currentBattle.mysteryEncounter!; // Restore original party - scene.getParty().push(...encounter.misc.originalParty); + globalScene.getPlayerParty().push(...encounter.misc.originalParty); // Restore held items const originalHeldItems = encounter.misc.originalPartyHeldItems; - originalHeldItems.forEach((pokemonHeldItemsList: PokemonHeldItemModifier[]) => { - pokemonHeldItemsList.forEach(heldItem => { - scene.addModifier(heldItem, true, false, false, true); - }); - }); - scene.updateModifiers(true); + for (const pokemonHeldItemsList of originalHeldItems) { + for (const heldItem of pokemonHeldItemsList) { + globalScene.addModifier(heldItem, true, false, false, true); + } + } + globalScene.updateModifiers(true); } -function onGameOver(scene: BattleScene) { - const encounter = scene.currentBattle.mysteryEncounter!; +function onGameOver() { + const encounter = globalScene.currentBattle.mysteryEncounter!; encounter.dialogue.outro = [ { @@ -552,8 +646,8 @@ function onGameOver(scene: BattleScene) { ]; // Restore original party, player loses all friendship with chosen mon (it remains fainted) - restorePartyAndHeldItems(scene); - const chosenPokemon = encounter.misc.chosenPokemon; + restorePartyAndHeldItems(); + const chosenPokemon = encounter.misc.chosenPokemon; chosenPokemon.friendship = 0; // Clear all rewards that would have been earned @@ -563,33 +657,33 @@ function onGameOver(scene: BattleScene) { encounter.misc.encounterFailed = true; // Revert BGM - scene.playBgm(scene.arena.bgm); + globalScene.playBgm(globalScene.arena.bgm); // Clear any leftover battle phases - scene.clearPhaseQueue(); - scene.clearPhaseQueueSplice(); + globalScene.clearPhaseQueue(); + globalScene.clearPhaseQueueSplice(); // Return enemy Pokemon - const pokemon = scene.getEnemyPokemon(); + const pokemon = globalScene.getEnemyPokemon(); if (pokemon) { - scene.playSound("se/pb_rel"); + globalScene.playSound("se/pb_rel"); pokemon.hideInfo(); pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, "Sine.easeIn"); - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemon, duration: 250, ease: "Sine.easeIn", scale: 0.5, onComplete: () => { - scene.field.remove(pokemon, true); - } + pokemon.leaveField(true, true, true); + }, }); } // Show the enemy trainer - scene.time.delayedCall(250, () => { - const sprites = scene.currentBattle.trainer?.getSprites(); - const tintSprites = scene.currentBattle.trainer?.getTintSprites(); + globalScene.time.delayedCall(250, () => { + const sprites = globalScene.currentBattle.trainer?.getSprites(); + const tintSprites = globalScene.currentBattle.trainer?.getTintSprites(); if (sprites && tintSprites) { for (let i = 0; i < sprites.length; i++) { sprites[i].setVisible(true); @@ -598,29 +692,26 @@ function onGameOver(scene: BattleScene) { tintSprites[i].clearTint(); } } - scene.tweens.add({ - targets: scene.currentBattle.trainer, + globalScene.tweens.add({ + targets: globalScene.currentBattle.trainer, x: "-=16", y: "+=16", alpha: 1, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); }); - - handleMysteryEncounterBattleFailed(scene, true); + handleMysteryEncounterBattleFailed(true); return false; } -function doPostEncounterCleanup(scene: BattleScene) { - const encounter = scene.currentBattle.mysteryEncounter!; +function doPostEncounterCleanup() { + const encounter = globalScene.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); + restorePartyAndHeldItems(); } } 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 95f359547e4..fb55c55a1a3 100644 --- a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -1,15 +1,26 @@ -import { leaveEncounterWithoutBattle, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + leaveEncounterWithoutBattle, + transitionMysteryEncounterIntroVisuals, + updatePlayerMoney, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { 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 { + catchPokemon, + getRandomSpeciesByStarterCost, + getSpriteKeysFromPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import type PokemonSpecies from "#app/data/pokemon-species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; import { Species } from "#enums/species"; -import { PokeballType } from "#app/data/pokeball"; -import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { PokeballType } from "#enums/pokeball"; +import type { EnemyPokemon } from "#app/field/pokemon"; +import { PlayerPokemon } from "#app/field/pokemon"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { showEncounterDialogue } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import PokemonData from "#app/system/pokemon-data"; @@ -17,6 +28,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"; @@ -31,136 +43,149 @@ const SHINY_MAGIKARP_WEIGHT = 100; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3799 | GitHub Issue #3799} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ThePokemonSalesmanEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_POKEMON_SALESMAN) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new MoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: "pokemon_salesman", - fileRoot: "mystery-encounters", - hasShadow: true - } - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.THE_POKEMON_SALESMAN, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withSceneRequirement(new MoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: "pokemon_salesman", + fileRoot: "mystery-encounters", + hasShadow: true, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - let species = getPokemonSpecies(getRandomSpeciesByStarterTier([ 0, 5 ], undefined, undefined, false, false, false)); - let tries = 0; + 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)); - tries++; - } + // Reroll any species that don't have HAs + while ((isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE) && tries < 5) { + 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 - species = getPokemonSpecies(Species.MAGIKARP); - const hiddenIndex = species.ability2 ? 2 : 1; - pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex, undefined, true, 0); - } else { - const hiddenIndex = species.ability2 ? 2 : 1; - pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex); - } - pokemon.generateAndPopulateMoveset(); + 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 with random variant + species = getPokemonSpecies(Species.MAGIKARP); + pokemon = new PlayerPokemon(species, 5, 2, species.formIndex, undefined, true); + } else { + pokemon = new PlayerPokemon(species, 5, 2, species.formIndex); + } + pokemon.generateAndPopulateMoveset(); - const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); - encounter.spriteConfigs.push({ - spriteKey: spriteKey, - fileRoot: fileRoot, - hasShadow: true, - repeat: true, - isPokemon: true - }); + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); + encounter.spriteConfigs.push({ + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + repeat: true, + isPokemon: true, + isShiny: pokemon.shiny, + variant: pokemon.variant, + }); - const starterTier = speciesStarterCosts[species.speciesId]; - // Prices decrease by starter tier less than 5, but only reduces cost by half at max - let priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER * (Math.max(starterTier, 2.5) / 5); - if (pokemon.shiny) { - // Always max price for shiny (flip HA back to normal), and add special messaging - priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER; - pokemon.abilityIndex = 0; - encounter.dialogue.encounterOptionsDialogue!.description = `${namespace}:description_shiny`; - encounter.options[0].dialogue!.buttonTooltip = `${namespace}:option.1.tooltip_shiny`; - } - const price = scene.getWaveMoneyAmount(priceMultiplier); - encounter.setDialogueToken("purchasePokemon", pokemon.getNameToRender()); - encounter.setDialogueToken("price", price.toString()); - encounter.misc = { - price: price, - pokemon: pokemon - }; + const starterTier = speciesStarterCosts[species.speciesId]; + // Prices decrease by starter tier less than 5, but only reduces cost by half at max + let priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER * (Math.max(starterTier, 2.5) / 5); + if (pokemon.shiny) { + // Always max price for shiny (flip HA back to normal), and add special messaging + priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER; + pokemon.abilityIndex = 0; + encounter.dialogue.encounterOptionsDialogue!.description = `${namespace}:description_shiny`; + encounter.options[0].dialogue!.buttonTooltip = `${namespace}:option.1.tooltip_shiny`; + } + const price = globalScene.getWaveMoneyAmount(priceMultiplier); + encounter.setDialogueToken("purchasePokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("price", price.toString()); + encounter.misc = { + price: price, + pokemon: pokemon, + }; - pokemon.calculateStats(); + pokemon.calculateStats(); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withHasDexProgress(true) - .withSceneMoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected_message`, - } - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const price = encounter.misc.price; - const purchasedPokemon = encounter.misc.pokemon as PlayerPokemon; - - // Update money - updatePlayerMoney(scene, -price, true, false); - - // Show dialogue - await showEncounterDialogue(scene, `${namespace}:option.1.selected_dialogue`, `${namespace}:speaker`); - await transitionMysteryEncounterIntroVisuals(scene); - - // "Catch" purchased pokemon - const data = new PokemonData(purchasedPokemon); - data.player = false; - await catchPokemon(scene, data.toPokemon(scene) as EnemyPokemon, null, PokeballType.POKEBALL, true, true); - - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withHasDexProgress(true) + .withSceneMoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.2.selected`, + text: `${namespace}:option.1.selected_message`, }, ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const price = encounter.misc.price; + const purchasedPokemon = encounter.misc.pokemon as PlayerPokemon; + + // Update money + updatePlayerMoney(-price, true, false); + + // Show dialogue + await showEncounterDialogue(`${namespace}:option.1.selected_dialogue`, `${namespace}:speaker`); + await transitionMysteryEncounterIntroVisuals(); + + // "Catch" purchased pokemon + const data = new PokemonData(purchasedPokemon); + data.player = false; + await catchPokemon(data.toPokemon() as EnemyPokemon, null, PokeballType.POKEBALL, true, true); + + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .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 397d2af9522..e54df048430 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -1,12 +1,23 @@ -import { EnemyPartyConfig, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { modifierTypes, PokemonHeldItemModifierType, } from "#app/modifier/modifier-type"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initBattleWithEnemyConfig, + loadCustomMovesForEncounter, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, + generateModifierType, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Species } from "#enums/species"; -import { Nature } from "#app/data/nature"; -import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import { Nature } from "#enums/nature"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { modifyPlayerPokemonBST } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { Moves } from "#enums/moves"; @@ -31,178 +42,188 @@ const BST_INCREASE_VALUE = 10; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3803 | GitHub Issue #3803} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TheStrongStuffEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_STRONG_STUFF) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withScenePartySizeRequirement(3, 6) // Must have at least 3 pokemon in party - .withMaxAllowedEncounters(1) - .withHideWildIntroMessage(true) - .withAutoHideIntroVisuals(false) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: "berry_juice", - fileRoot: "items", - hasShadow: true, - isItem: true, - scale: 1.25, - x: -15, - y: 3, - disableAnimation: true - }, - { - spriteKey: Species.SHUCKLE.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - scale: 1.25, - x: 20, - y: 10, - yShadow: 7 - }, - ]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.THE_STRONG_STUFF, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(3, 6) // Must have at least 3 pokemon in party + .withMaxAllowedEncounters(1) + .withHideWildIntroMessage(true) + .withAutoHideIntroVisuals(false) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: "berry_juice", + fileRoot: "items", + hasShadow: true, + isItem: true, + scale: 1.25, + x: -15, + y: 3, + disableAnimation: true, + }, + { + spriteKey: Species.SHUCKLE.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + scale: 1.25, + x: 20, + y: 10, + yShadow: 7, + }, + ]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - const config: EnemyPartyConfig = { - levelAdditiveModifier: 1, - disableSwitch: true, - pokemonConfigs: [ - { - species: getPokemonSpecies(Species.SHUCKLE), - isBoss: true, - bossSegments: 5, - customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), - nature: Nature.BOLD, - moveSet: [ Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER ], - modifierConfigs: [ - { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.SITRUS ]) as PokemonHeldItemModifierType - }, - { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.ENIGMA ]) as PokemonHeldItemModifierType - }, - { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.APICOT ]) as PokemonHeldItemModifierType - }, - { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.GANLON ]) as PokemonHeldItemModifierType - }, - { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.LUM ]) as PokemonHeldItemModifierType, - stackCount: 2 - } - ], - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:option.2.stat_boost`); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.DEF, Stat.SPDEF ], 2)); - } - } - ], - }; + // Calculate boss mon + const config: EnemyPartyConfig = { + levelAdditiveModifier: 1, + disableSwitch: true, + pokemonConfigs: [ + { + 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], + modifierConfigs: [ + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType, + }, + { + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + ], + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(`${namespace}:option.2.stat_boost`); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, [Stat.DEF, Stat.SPDEF], 2), + ); + }, + }, + ], + }; - encounter.enemyPartyConfigs = [ config ]; + encounter.enemyPartyConfigs = [config]; - loadCustomMovesForEncounter(scene, [ Moves.GASTRO_ACID, Moves.STEALTH_ROCK ]); + loadCustomMovesForEncounter([Moves.GASTRO_ACID, Moves.STEALTH_ROCK]); - encounter.setDialogueToken("shuckleName", getPokemonSpecies(Species.SHUCKLE).getName()); + encounter.setDialogueToken("shuckleName", getPokemonSpecies(Species.SHUCKLE).getName()); + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + // Do blackout and hide intro visuals during blackout + globalScene.time.delayedCall(750, () => { + transitionMysteryEncounterIntroVisuals(true, true, 50); + }); + + // -15 to all base stats of highest BST (halved for HP), +10 to all base stats of rest of party (halved for HP) + // Sort party by bst + const sortedParty = globalScene + .getPlayerParty() + .slice(0) + .sort((pokemon1, pokemon2) => { + const pokemon1Bst = pokemon1.getSpeciesForm().getBaseStatTotal(); + const pokemon2Bst = pokemon2.getSpeciesForm().getBaseStatTotal(); + return pokemon2Bst - pokemon1Bst; + }); + + sortedParty.forEach((pokemon, index) => { + if (index < 2) { + // -15 to the two highest BST mons + modifyPlayerPokemonBST(pokemon, -HIGH_BST_REDUCTION_VALUE); + encounter.setDialogueToken("highBstPokemon" + (index + 1), pokemon.getNameToRender()); + } else { + // +10 for the rest + modifyPlayerPokemonBST(pokemon, BST_INCREASE_VALUE); + } + }); + + encounter.setDialogueToken("reductionValue", HIGH_BST_REDUCTION_VALUE.toString()); + encounter.setDialogueToken("increaseValue", BST_INCREASE_VALUE.toString()); + await showEncounterText(`${namespace}:option.1.selected_2`, null, undefined, true); + + encounter.dialogue.outro = [ + { + text: `${namespace}:outro`, + }, + ]; + setEncounterRewards({ fillRemaining: true }); + leaveEncounterWithoutBattle(true); return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected` - } - ] - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - // Do blackout and hide intro visuals during blackout - scene.time.delayedCall(750, () => { - transitionMysteryEncounterIntroVisuals(scene, true, true, 50); - }); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.SOUL_DEW], + fillRemaining: true, + }); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.GASTRO_ACID), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.STEALTH_ROCK), + ignorePp: true, + }, + ); - // -15 to all base stats of highest BST (halved for HP), +10 to all base stats of rest of party (halved for HP) - // Sort party by bst - const sortedParty = scene.getParty().slice(0) - .sort((pokemon1, pokemon2) => { - const pokemon1Bst = pokemon1.calculateBaseStats().reduce((a, b) => a + b, 0); - const pokemon2Bst = pokemon2.calculateBaseStats().reduce((a, b) => a + b, 0); - return pokemon2Bst - pokemon1Bst; - }); - - sortedParty.forEach((pokemon, index) => { - if (index < 2) { - // -15 to the two highest BST mons - modifyPlayerPokemonBST(pokemon, -HIGH_BST_REDUCTION_VALUE); - encounter.setDialogueToken("highBstPokemon" + (index + 1), pokemon.getNameToRender()); - } else { - // +10 for the rest - modifyPlayerPokemonBST(pokemon, BST_INCREASE_VALUE); - } - }); - - encounter.setDialogueToken("reductionValue", HIGH_BST_REDUCTION_VALUE.toString()); - encounter.setDialogueToken("increaseValue", BST_INCREASE_VALUE.toString()); - await showEncounterText(scene, `${namespace}:option.1.selected_2`, null, undefined, true); - - encounter.dialogue.outro = [ - { - text: `${namespace}:outro`, - } - ]; - setEncounterRewards(scene, { fillRemaining: true }); - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Pick battle - const encounter = scene.currentBattle.mysteryEncounter!; - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.SOUL_DEW ], fillRemaining: true }); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.GASTRO_ACID), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.STEALTH_ROCK), - ignorePp: true - }); - - encounter.dialogue.outro = []; - await transitionMysteryEncounterIntroVisuals(scene, true, true, 500); - await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); - } - ) - .build(); + encounter.dialogue.outro = []; + await transitionMysteryEncounterIntroVisuals(true, true, 500); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }, + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts index bf322802f81..aca04ad50ed 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -1,8 +1,18 @@ -import { EnemyPartyConfig, generateModifierType, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + generateModifierTypeOption, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { TrainerType } from "#enums/trainer-type"; import { Species } from "#enums/species"; @@ -10,10 +20,10 @@ import { Abilities } from "#enums/abilities"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Moves } from "#enums/moves"; import { Nature } from "#enums/nature"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { BerryType } from "#enums/berry-type"; import { Stat } from "#enums/stat"; -import { SpeciesFormChangeManualTrigger } from "#app/data/pokemon-forms"; +import { SpeciesFormChangeAbilityTrigger } from "#app/data/pokemon-forms"; import { applyPostBattleInitAbAttrs, PostBattleInitAbAttr } from "#app/data/ability"; import { showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; @@ -23,6 +33,7 @@ import { ReturnPhase } from "#app/phases/return-phase"; import i18next from "i18next"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; +import { BattlerTagType } from "#enums/battler-tag-type"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/theWinstrateChallenge"; @@ -32,144 +43,152 @@ const namespace = "mysteryEncounters/theWinstrateChallenge"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3821 | GitHub Issue #3821} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TheWinstrateChallengeEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_WINSTRATE_CHALLENGE) - .withEncounterTier(MysteryEncounterTier.ROGUE) - .withSceneWaveRangeRequirement(100, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withIntroSpriteConfigs([ - { - spriteKey: "vito", - fileRoot: "trainer", - hasShadow: false, - x: 16, - y: -4 - }, - { - spriteKey: "vivi", - fileRoot: "trainer", - hasShadow: false, - x: -14, - y: -4 - }, - { - spriteKey: "victor", - fileRoot: "trainer", - hasShadow: true, - x: -32 - }, - { - spriteKey: "victoria", - fileRoot: "trainer", - hasShadow: true, - x: 40, - }, - { - spriteKey: "vicky", - fileRoot: "trainer", - hasShadow: true, - x: 3, - y: 5, - yShadow: 5 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .withAutoHideIntroVisuals(false) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const TheWinstrateChallengeEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.THE_WINSTRATE_CHALLENGE, +) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withSceneWaveRangeRequirement(100, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withIntroSpriteConfigs([ + { + spriteKey: "vito", + fileRoot: "trainer", + hasShadow: false, + x: 16, + y: -4, + }, + { + spriteKey: "vivi", + fileRoot: "trainer", + hasShadow: false, + x: -14, + y: -4, + }, + { + spriteKey: "victor", + fileRoot: "trainer", + hasShadow: true, + x: -32, + }, + { + spriteKey: "victoria", + fileRoot: "trainer", + hasShadow: true, + x: 40, + }, + { + spriteKey: "vicky", + fileRoot: "trainer", + hasShadow: true, + x: 3, + y: 5, + yShadow: 5, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .withAutoHideIntroVisuals(false) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Loaded back to front for pop() operations - encounter.enemyPartyConfigs.push(getVitoTrainerConfig(scene)); - encounter.enemyPartyConfigs.push(getVickyTrainerConfig(scene)); - encounter.enemyPartyConfigs.push(getViviTrainerConfig(scene)); - encounter.enemyPartyConfigs.push(getVictoriaTrainerConfig(scene)); - encounter.enemyPartyConfigs.push(getVictorTrainerConfig(scene)); + // Loaded back to front for pop() operations + encounter.enemyPartyConfigs.push(getVitoTrainerConfig()); + encounter.enemyPartyConfigs.push(getVickyTrainerConfig()); + encounter.enemyPartyConfigs.push(getViviTrainerConfig()); + encounter.enemyPartyConfigs.push(getVictoriaTrainerConfig()); + encounter.enemyPartyConfigs.push(getVictorTrainerConfig()); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.1.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Spawn 5 trainer battles back to back with Macho Brace in rewards - scene.currentBattle.mysteryEncounter!.doContinueEncounter = async (scene: BattleScene) => { - await endTrainerBattleAndShowDialogue(scene); - }; - await transitionMysteryEncounterIntroVisuals(scene, true, false); - await spawnNextTrainerOrEndEncounter(scene); - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - speaker: `${namespace}:speaker`, - text: `${namespace}:option.2.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Refuse the challenge, they full heal the party and give the player a Rarer Candy - scene.unshiftPhase(new PartyHealPhase(scene, true)); - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.RARER_CANDY ], fillRemaining: false }); - leaveEncounterWithoutBattle(scene); - } - ) - .build(); + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Spawn 5 trainer battles back to back with Macho Brace in rewards + globalScene.currentBattle.mysteryEncounter!.doContinueEncounter = async () => { + await endTrainerBattleAndShowDialogue(); + }; + await transitionMysteryEncounterIntroVisuals(true, false); + await spawnNextTrainerOrEndEncounter(); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Refuse the challenge, they full heal the party and give the player a Rarer Candy + globalScene.unshiftPhase(new PartyHealPhase(true)); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [modifierTypes.RARER_CANDY], + fillRemaining: false, + }); + leaveEncounterWithoutBattle(); + }, + ) + .build(); -async function spawnNextTrainerOrEndEncounter(scene: BattleScene) { - const encounter = scene.currentBattle.mysteryEncounter!; +async function spawnNextTrainerOrEndEncounter() { + const encounter = globalScene.currentBattle.mysteryEncounter!; const nextConfig = encounter.enemyPartyConfigs.pop(); if (!nextConfig) { - await transitionMysteryEncounterIntroVisuals(scene, false, false); - await showEncounterDialogue(scene, `${namespace}:victory`, `${namespace}:speaker`); + await transitionMysteryEncounterIntroVisuals(false, false); + await showEncounterDialogue(`${namespace}:victory`, `${namespace}:speaker`); // Give 10x Voucher const newModifier = modifierTypes.VOUCHER_PREMIUM().newModifier(); - await scene.addModifier(newModifier); - scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name })); + globalScene.addModifier(newModifier); + globalScene.playSound("item_fanfare"); + await showEncounterText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name })); - await showEncounterDialogue(scene, `${namespace}:victory_2`, `${namespace}:speaker`); - scene.ui.clearText(); // Clears "Winstrate" title from screen as rewards get animated in - const machoBrace = generateModifierTypeOption(scene, modifierTypes.MYSTERY_ENCOUNTER_MACHO_BRACE)!; + await showEncounterDialogue(`${namespace}:victory_2`, `${namespace}:speaker`); + globalScene.ui.clearText(); // Clears "Winstrate" title from screen as rewards get animated in + const machoBrace = generateModifierTypeOption(modifierTypes.MYSTERY_ENCOUNTER_MACHO_BRACE)!; machoBrace.type.tier = ModifierTier.MASTER; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [ machoBrace ], fillRemaining: false }); + setEncounterRewards({ + guaranteedModifierTypeOptions: [machoBrace], + fillRemaining: false, + }); encounter.doContinueEncounter = undefined; - leaveEncounterWithoutBattle(scene, false, MysteryEncounterMode.NO_BATTLE); + leaveEncounterWithoutBattle(false, MysteryEncounterMode.NO_BATTLE); } else { - await initBattleWithEnemyConfig(scene, nextConfig); + await initBattleWithEnemyConfig(nextConfig); } } -function endTrainerBattleAndShowDialogue(scene: BattleScene): Promise { +function endTrainerBattleAndShowDialogue(): Promise { + // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO: Consider refactoring to avoid async promise executor return new Promise(async resolve => { - if (scene.currentBattle.mysteryEncounter!.enemyPartyConfigs.length === 0) { + if (globalScene.currentBattle.mysteryEncounter!.enemyPartyConfigs.length === 0) { // Battle is over - const trainer = scene.currentBattle.trainer; + const trainer = globalScene.currentBattle.trainer; if (trainer) { - scene.tweens.add({ + globalScene.tweens.add({ targets: trainer, x: "+=16", y: "-=16", @@ -177,37 +196,44 @@ function endTrainerBattleAndShowDialogue(scene: BattleScene): Promise { ease: "Sine.easeInOut", duration: 750, onComplete: () => { - scene.field.remove(trainer, true); - } + globalScene.field.remove(trainer, true); + }, }); } - await spawnNextTrainerOrEndEncounter(scene); + await spawnNextTrainerOrEndEncounter(); resolve(); // Wait for all dialogue/post battle stuff to complete before resolving } else { - scene.arena.resetArenaEffects(); - const playerField = scene.getPlayerField(); - playerField.forEach((_, p) => scene.unshiftPhase(new ReturnPhase(scene, p))); + globalScene.arena.resetArenaEffects(); + const playerField = globalScene.getPlayerField(); + for (const pokemon of playerField) { + pokemon.lapseTag(BattlerTagType.COMMANDED); + } + playerField.forEach((_, p) => globalScene.unshiftPhase(new ReturnPhase(p))); - for (const pokemon of scene.getParty()) { + for (const pokemon of globalScene.getPlayerParty()) { // Only trigger form change when Eiscue is in Noice form // Hardcoded Eiscue for now in case it is fused with another pokemon - if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) { - scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + if ( + pokemon.species.speciesId === Species.EISCUE && + pokemon.hasAbility(Abilities.ICE_FACE) && + pokemon.formIndex === 1 + ) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger); } pokemon.resetBattleData(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); } - scene.unshiftPhase(new ShowTrainerPhase(scene)); + globalScene.unshiftPhase(new ShowTrainerPhase()); // Hide the trainer and init next battle - const trainer = scene.currentBattle.trainer; + const trainer = globalScene.currentBattle.trainer; // Unassign previous trainer from battle so it isn't destroyed before animation completes - scene.currentBattle.trainer = null; - await spawnNextTrainerOrEndEncounter(scene); + globalScene.currentBattle.trainer = null; + await spawnNextTrainerOrEndEncounter(); if (trainer) { - scene.tweens.add({ + globalScene.tweens.add({ targets: trainer, x: "+=16", y: "-=16", @@ -215,16 +241,16 @@ function endTrainerBattleAndShowDialogue(scene: BattleScene): Promise { ease: "Sine.easeInOut", duration: 750, onComplete: () => { - scene.field.remove(trainer, true); + globalScene.field.remove(trainer, true); resolve(); - } + }, }); } } }); } -function getVictorTrainerConfig(scene: BattleScene): EnemyPartyConfig { +function getVictorTrainerConfig(): EnemyPartyConfig { return { trainerType: TrainerType.VICTOR, pokemonConfigs: [ @@ -233,42 +259,42 @@ function getVictorTrainerConfig(scene: BattleScene): EnemyPartyConfig { isBoss: false, abilityIndex: 0, // Guts nature: Nature.ADAMANT, - moveSet: [ Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK ], + moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, - isTransferable: false + modifier: generateModifierType(modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, + isTransferable: false, }, { - modifier: generateModifierType(scene, modifierTypes.FOCUS_BAND) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.FOCUS_BAND) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false + isTransferable: false, }, - ] + ], }, { species: getPokemonSpecies(Species.OBSTAGOON), isBoss: false, abilityIndex: 1, // Guts nature: Nature.ADAMANT, - moveSet: [ Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH ], + moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, - isTransferable: false + modifier: generateModifierType(modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, + isTransferable: false, }, { - modifier: generateModifierType(scene, modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false - } - ] - } - ] + isTransferable: false, + }, + ], + }, + ], }; } -function getVictoriaTrainerConfig(scene: BattleScene): EnemyPartyConfig { +function getVictoriaTrainerConfig(): EnemyPartyConfig { return { trainerType: TrainerType.VICTORIA, pokemonConfigs: [ @@ -277,43 +303,47 @@ function getVictoriaTrainerConfig(scene: BattleScene): EnemyPartyConfig { isBoss: false, abilityIndex: 0, // Natural Cure nature: Nature.CALM, - moveSet: [ Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER ], + moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType, - isTransferable: false + modifier: generateModifierType(modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType, + isTransferable: false, }, { - modifier: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false - } - ] + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.GARDEVOIR), isBoss: false, formIndex: 1, nature: Nature.TIMID, - moveSet: [ Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP ], + moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.PSYCHIC ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ + PokemonType.PSYCHIC, + ]) as PokemonHeldItemModifierType, stackCount: 1, - isTransferable: false + isTransferable: false, }, { - modifier: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.FAIRY ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, [ + PokemonType.FAIRY, + ]) as PokemonHeldItemModifierType, stackCount: 1, - isTransferable: false - } - ] - } - ] + isTransferable: false, + }, + ], + }, + ], }; } -function getViviTrainerConfig(scene: BattleScene): EnemyPartyConfig { +function getViviTrainerConfig(): EnemyPartyConfig { return { trainerType: TrainerType.VIVI, pokemonConfigs: [ @@ -322,57 +352,57 @@ function getViviTrainerConfig(scene: BattleScene): EnemyPartyConfig { isBoss: false, abilityIndex: 3, // Lightning Rod nature: Nature.ADAMANT, - moveSet: [ Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST ], + moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.LUM ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false + isTransferable: false, }, { - modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [ Stat.HP ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, stackCount: 4, - isTransferable: false - } - ] + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.BRELOOM), isBoss: false, abilityIndex: 1, // Poison Heal nature: Nature.JOLLY, - moveSet: [ Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH ], + moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [ Stat.HP ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, stackCount: 4, - isTransferable: false + isTransferable: false, }, { - modifier: generateModifierType(scene, modifierTypes.TOXIC_ORB) as PokemonHeldItemModifierType, - isTransferable: false - } - ] + modifier: generateModifierType(modifierTypes.TOXIC_ORB) as PokemonHeldItemModifierType, + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.CAMERUPT), isBoss: false, formIndex: 1, nature: Nature.CALM, - moveSet: [ Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT ], + moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, stackCount: 3, - isTransferable: false + isTransferable: false, }, - ] - } - ] + ], + }, + ], }; } -function getVickyTrainerConfig(scene: BattleScene): EnemyPartyConfig { +function getVickyTrainerConfig(): EnemyPartyConfig { return { trainerType: TrainerType.VICKY, pokemonConfigs: [ @@ -381,19 +411,19 @@ function getVickyTrainerConfig(scene: BattleScene): EnemyPartyConfig { isBoss: false, formIndex: 1, nature: Nature.IMPISH, - moveSet: [ Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH ], + moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType, - isTransferable: false - } - ] - } - ] + modifier: generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType, + isTransferable: false, + }, + ], + }, + ], }; } -function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig { +function getVitoTrainerConfig(): EnemyPartyConfig { return { trainerType: TrainerType.VITO, pokemonConfigs: [ @@ -402,110 +432,110 @@ function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig { isBoss: false, abilityIndex: 0, // Soundproof nature: Nature.MODEST, - moveSet: [ Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE ], + moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [ Stat.SPD ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false - } - ] + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.SWALOT), isBoss: false, abilityIndex: 2, // Gluttony nature: Nature.QUIET, - moveSet: [ Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE ], + moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.SITRUS ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.APICOT ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.GANLON ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.STARF ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.STARF]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.SALAC ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.SALAC]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.LUM ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.LANSAT ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LANSAT]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.LIECHI ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LIECHI]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.PETAYA ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.PETAYA]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.ENIGMA ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, stackCount: 2, }, { - modifier: generateModifierType(scene, modifierTypes.BERRY, [ BerryType.LEPPA ]) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.BERRY, [BerryType.LEPPA]) as PokemonHeldItemModifierType, stackCount: 2, - } - ] + }, + ], }, { species: getPokemonSpecies(Species.DODRIO), isBoss: false, abilityIndex: 2, // Tangled Feet nature: Nature.JOLLY, - moveSet: [ Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF ], + moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false - } - ] + isTransferable: false, + }, + ], }, { species: getPokemonSpecies(Species.ALAKAZAM), isBoss: false, formIndex: 1, nature: Nature.BOLD, - moveSet: [ Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT ], + moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false + isTransferable: false, }, - ] + ], }, { species: getPokemonSpecies(Species.DARMANITAN), isBoss: false, abilityIndex: 0, // Sheer Force nature: Nature.IMPISH, - moveSet: [ Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE ], + moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE], modifierConfigs: [ { - modifier: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, + modifier: generateModifierType(modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, stackCount: 2, - isTransferable: false + isTransferable: false, }, - ] - } - ] + ], + }, + ], }; } diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 03341a713f2..cc56f3efa42 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -1,26 +1,36 @@ -import { Ability, allAbilities } from "#app/data/ability"; -import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { getNatureName, Nature } from "#app/data/nature"; +import type { Ability } from "#app/data/ability"; +import { allAbilities } from "#app/data/ability"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { getNatureName } from "#app/data/nature"; import { speciesStarterCosts } from "#app/data/balance/starters"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { AbilityAttr } from "#app/system/game-data"; import PokemonData from "#app/system/pokemon-data"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { isNullOrUndefined, randSeedShuffle } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import HeldModifierConfig from "#app/interfaces/held-modifier-config"; +import type HeldModifierConfig from "#app/interfaces/held-modifier-config"; import i18next from "i18next"; import { getStatKey } from "#enums/stat"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { isPokemonValidForEncounterOptionSelection } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import type { Nature } from "#enums/nature"; /** The i18n namespace for the encounter */ const namespace = "mysteryEncounters/trainingSession"; @@ -30,360 +40,350 @@ const namespace = "mysteryEncounters/trainingSession"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3802 | GitHub Issue #3802} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TrainingSessionEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRAINING_SESSION) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 unfainted pokemon in party - .withFleeAllowed(false) - .withHideWildIntroMessage(true) - .withPreventGameStatsUpdates(true) // Do not count the Pokemon as seen or defeated since it is ours - .withIntroSpriteConfigs([ - { - spriteKey: "training_session_gear", - fileRoot: "mystery-encounters", - hasShadow: true, - y: 6, - x: 5, - yShadow: -2 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - } - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - encounter.misc = { - playerPokemon: pokemon, +export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.TRAINING_SESSION, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 unfainted pokemon in party + .withFleeAllowed(false) + .withHideWildIntroMessage(true) + .withPreventGameStatsUpdates(true) // Do not count the Pokemon as seen or defeated since it is ours + .withIntroSpriteConfigs([ + { + spriteKey: "training_session_gear", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 6, + x: 5, + yShadow: -2, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + encounter.misc = { + playerPokemon: pokemon, + }; + }; + + // Only Pokemon that are not KOed/legal can be trained + const selectableFilter = (pokemon: Pokemon) => { + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); + }; + + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + + // Spawn light training session with chosen pokemon + // Every 50 waves, add +1 boss segment, capping at 5 + const segments = Math.min(2 + Math.floor(globalScene.currentBattle.waveIndex / 50), 5); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig(playerPokemon, segments, modifiers); + globalScene.removePokemonFromPlayerParty(playerPokemon, false); + + const onBeforeRewardsPhase = () => { + encounter.setDialogueToken("stat1", "-"); + encounter.setDialogueToken("stat2", "-"); + // Add the pokemon back to party with IV boost + let ivIndexes: any[] = []; + playerPokemon.ivs.forEach((iv, index) => { + if (iv < 31) { + ivIndexes.push({ iv: iv, index: index }); + } + }); + + // Improves 2 random non-maxed IVs + // +10 if IV is < 10, +5 if between 10-20, and +3 if > 20 + // A 0-4 starting IV will cap in 6 encounters (assuming you always rolled that IV) + // 5-14 starting IV caps in 5 encounters + // 15-19 starting IV caps in 4 encounters + // 20-24 starting IV caps in 3 encounters + // 25-27 starting IV caps in 2 encounters + let improvedCount = 0; + while (ivIndexes.length > 0 && improvedCount < 2) { + ivIndexes = randSeedShuffle(ivIndexes); + const ivToChange = ivIndexes.pop(); + let newVal = ivToChange.iv; + if (improvedCount === 0) { + encounter.setDialogueToken("stat1", i18next.t(getStatKey(ivToChange.index)) ?? ""); + } else { + encounter.setDialogueToken("stat2", i18next.t(getStatKey(ivToChange.index)) ?? ""); + } + + // Corrects required encounter breakpoints to be continuous for all IV values + if (ivToChange.iv <= 21 && ivToChange.iv - (1 % 5) === 0) { + newVal += 1; + } + + newVal += ivToChange.iv <= 10 ? 10 : ivToChange.iv <= 20 ? 5 : 3; + newVal = Math.min(newVal, 31); + playerPokemon.ivs[ivToChange.index] = newVal; + improvedCount++; + } + + if (improvedCount > 0) { + playerPokemon.calculateStats(); + globalScene.gameData.updateSpeciesDexIvs(playerPokemon.species.getRootSpeciesId(true), playerPokemon.ivs); + globalScene.gameData.setPokemonCaught(playerPokemon, false); + } + + // Add pokemon and mods back + globalScene.getPlayerParty().push(playerPokemon); + for (const mod of modifiers.value) { + mod.pokemonId = playerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + globalScene.updateModifiers(true); + queueEncounterMessage(`${namespace}:option.1.finished`); + }; + + setEncounterRewards({ fillRemaining: true }, undefined, onBeforeRewardsPhase); + + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + secondOptionPrompt: `${namespace}:option.2.select_prompt`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + // Open menu for selecting pokemon and Nature + const encounter = globalScene.currentBattle.mysteryEncounter!; + const natures = new Array(25).fill(null).map((_val, i) => i as Nature); + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for nature selection + return natures.map((nature: Nature) => { + const option: OptionSelectItem = { + label: getNatureName(nature, true, true, true, globalScene.uiTheme), + handler: () => { + // Pokemon and second option selected + encounter.setDialogueToken("nature", getNatureName(nature)); + encounter.misc = { + playerPokemon: pokemon, + chosenNature: nature, + }; + return true; + }, }; - }; + return option; + }); + }; - // Only Pokemon that are not KOed/legal can be trained - const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}:invalid_selection`); - }; + // Only Pokemon that are not KOed/legal can be trained + const selectableFilter = (pokemon: Pokemon) => { + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); + }; - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; - // Spawn light training session with chosen pokemon - // Every 50 waves, add +1 boss segment, capping at 5 - const segments = Math.min( - 2 + Math.floor(scene.currentBattle.waveIndex / 50), - 5 - ); - const modifiers = new ModifiersHolder(); - const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); - scene.removePokemonFromPlayerParty(playerPokemon, false); + // Spawn medium training session with chosen pokemon + // Every 40 waves, add +1 boss segment, capping at 6 + const segments = Math.min(2 + Math.floor(globalScene.currentBattle.waveIndex / 40), 6); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig(playerPokemon, segments, modifiers); + globalScene.removePokemonFromPlayerParty(playerPokemon, false); - const onBeforeRewardsPhase = () => { - encounter.setDialogueToken("stat1", "-"); - encounter.setDialogueToken("stat2", "-"); - // Add the pokemon back to party with IV boost - let ivIndexes: any[] = []; - playerPokemon.ivs.forEach((iv, index) => { - if (iv < 31) { - ivIndexes.push({ iv: iv, index: index }); - } - }); + const onBeforeRewardsPhase = () => { + queueEncounterMessage(`${namespace}:option.2.finished`); + // Add the pokemon back to party with Nature change + playerPokemon.setCustomNature(encounter.misc.chosenNature); + globalScene.gameData.unlockSpeciesNature(playerPokemon.species, encounter.misc.chosenNature); - // Improves 2 random non-maxed IVs - // +10 if IV is < 10, +5 if between 10-20, and +3 if > 20 - // A 0-4 starting IV will cap in 6 encounters (assuming you always rolled that IV) - // 5-14 starting IV caps in 5 encounters - // 15-19 starting IV caps in 4 encounters - // 20-24 starting IV caps in 3 encounters - // 25-27 starting IV caps in 2 encounters - let improvedCount = 0; - while (ivIndexes.length > 0 && improvedCount < 2) { - ivIndexes = randSeedShuffle(ivIndexes); - const ivToChange = ivIndexes.pop(); - let newVal = ivToChange.iv; - if (improvedCount === 0) { - encounter.setDialogueToken( - "stat1", - i18next.t(getStatKey(ivToChange.index)) ?? "" - ); - } else { - encounter.setDialogueToken( - "stat2", - i18next.t(getStatKey(ivToChange.index)) ?? "" - ); - } + // Add pokemon and modifiers back + globalScene.getPlayerParty().push(playerPokemon); + for (const mod of modifiers.value) { + mod.pokemonId = playerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + globalScene.updateModifiers(true); + }; - // Corrects required encounter breakpoints to be continuous for all IV values - if (ivToChange.iv <= 21 && ivToChange.iv - (1 % 5) === 0) { - newVal += 1; - } + setEncounterRewards({ fillRemaining: true }, undefined, onBeforeRewardsPhase); - newVal += ivToChange.iv <= 10 ? 10 : ivToChange.iv <= 20 ? 5 : 3; - newVal = Math.min(newVal, 31); - playerPokemon.ivs[ivToChange.index] = newVal; - improvedCount++; - } + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + secondOptionPrompt: `${namespace}:option.3.select_prompt`, + selected: [ + { + text: `${namespace}:option.selected`, + }, + ], + }) + .withPreOptionPhase(async (): Promise => { + // Open menu for selecting pokemon and ability to learn + const encounter = globalScene.currentBattle.mysteryEncounter!; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for ability selection + const speciesForm = pokemon.getFusionSpeciesForm() + ? pokemon.getFusionSpeciesForm() + : pokemon.getSpeciesForm(); + const abilityCount = speciesForm.getAbilityCount(); + const abilities: Ability[] = new Array(abilityCount) + .fill(null) + .map((_val, i) => allAbilities[speciesForm.getAbility(i)]); - if (improvedCount > 0) { - playerPokemon.calculateStats(); - scene.gameData.updateSpeciesDexIvs(playerPokemon.species.getRootSpeciesId(true), playerPokemon.ivs); - scene.gameData.setPokemonCaught(playerPokemon, false); - } - - // Add pokemon and mods back - scene.getParty().push(playerPokemon); - for (const mod of modifiers.value) { - mod.pokemonId = playerPokemon.id; - scene.addModifier(mod, true, false, false, true); - } - scene.updateModifiers(true); - queueEncounterMessage(scene, `${namespace}:option.1.finished`); - }; - - setEncounterRewards(scene, { fillRemaining: true }, undefined, onBeforeRewardsPhase); - - await initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - secondOptionPrompt: `${namespace}:option.2.select_prompt`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - // Open menu for selecting pokemon and Nature - const encounter = scene.currentBattle.mysteryEncounter!; - const natures = new Array(25).fill(null).map((val, i) => i as Nature); - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for nature selection - return natures.map((nature: Nature) => { + const optionSelectItems: OptionSelectItem[] = []; + abilities.forEach((ability: Ability, index) => { + if (!optionSelectItems.some(o => o.label === ability.name)) { const option: OptionSelectItem = { - label: getNatureName(nature, true, true, true, scene.uiTheme), + label: ability.name, handler: () => { - // Pokemon and second option selected - encounter.setDialogueToken("nature", getNatureName(nature)); + // Pokemon and ability selected + encounter.setDialogueToken("ability", ability.name); encounter.misc = { playerPokemon: pokemon, - chosenNature: nature, + abilityIndex: index, }; return true; }, + onHover: () => { + showEncounterText(ability.description, 0, 0, false); + }, }; - return option; - }); - }; - - // Only Pokemon that are not KOed/legal can be trained - const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}:invalid_selection`); - }; - - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; - - // Spawn medium training session with chosen pokemon - // Every 40 waves, add +1 boss segment, capping at 6 - const segments = Math.min(2 + Math.floor(scene.currentBattle.waveIndex / 40), 6); - const modifiers = new ModifiersHolder(); - const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); - scene.removePokemonFromPlayerParty(playerPokemon, false); - - const onBeforeRewardsPhase = () => { - queueEncounterMessage(scene, `${namespace}:option.2.finished`); - // Add the pokemon back to party with Nature change - playerPokemon.setNature(encounter.misc.chosenNature); - scene.gameData.setPokemonCaught(playerPokemon, false); - - // Add pokemon and modifiers back - scene.getParty().push(playerPokemon); - for (const mod of modifiers.value) { - mod.pokemonId = playerPokemon.id; - scene.addModifier(mod, true, false, false, true); + optionSelectItems.push(option); } - scene.updateModifiers(true); - }; + }); - setEncounterRewards(scene, { fillRemaining: true }, undefined, onBeforeRewardsPhase); + return optionSelectItems; + }; - await initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - secondOptionPrompt: `${namespace}:option.3.select_prompt`, - selected: [ - { - text: `${namespace}:option.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - // Open menu for selecting pokemon and ability to learn - const encounter = scene.currentBattle.mysteryEncounter!; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for ability selection - const speciesForm = !!pokemon.getFusionSpeciesForm() - ? pokemon.getFusionSpeciesForm() - : pokemon.getSpeciesForm(); - const abilityCount = speciesForm.getAbilityCount(); - const abilities: Ability[] = new Array(abilityCount) - .fill(null) - .map((val, i) => allAbilities[speciesForm.getAbility(i)]); + // Only Pokemon that are not KOed/legal can be trained + const selectableFilter = (pokemon: Pokemon) => { + return isPokemonValidForEncounterOptionSelection(pokemon, `${namespace}:invalid_selection`); + }; - const optionSelectItems: OptionSelectItem[] = []; - abilities.forEach((ability: Ability, index) => { - if (!optionSelectItems.some(o => o.label === ability.name)) { - const option: OptionSelectItem = { - label: ability.name, - handler: () => { - // Pokemon and ability selected - encounter.setDialogueToken("ability", ability.name); - encounter.misc = { - playerPokemon: pokemon, - abilityIndex: index, - }; - return true; - }, - onHover: () => { - showEncounterText(scene, ability.description, 0, 0, false); - }, - }; - optionSelectItems.push(option); - } - }); + return selectPokemonForOption(onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async () => { + const encounter = globalScene.currentBattle.mysteryEncounter!; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; - return optionSelectItems; - }; + // Spawn hard training session with chosen pokemon + // Every 30 waves, add +1 boss segment, capping at 6 + // Also starts with +1 to all stats + const segments = Math.min(2 + Math.floor(globalScene.currentBattle.waveIndex / 30), 6); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig(playerPokemon, segments, modifiers); + config.pokemonConfigs![0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + globalScene.removePokemonFromPlayerParty(playerPokemon, false); - // Only Pokemon that are not KOed/legal can be trained - const selectableFilter = (pokemon: Pokemon) => { - return isPokemonValidForEncounterOptionSelection(pokemon, scene, `${namespace}:invalid_selection`); - }; + const onBeforeRewardsPhase = () => { + queueEncounterMessage(`${namespace}:option.3.finished`); + // Add the pokemon back to party with ability change + const abilityIndex = encounter.misc.abilityIndex; - return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; - const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + if (playerPokemon.getFusionSpeciesForm()) { + playerPokemon.fusionAbilityIndex = abilityIndex; - // Spawn hard training session with chosen pokemon - // Every 30 waves, add +1 boss segment, capping at 6 - // Also starts with +1 to all stats - const segments = Math.min(2 + Math.floor(scene.currentBattle.waveIndex / 30), 6); - const modifiers = new ModifiersHolder(); - const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); - config.pokemonConfigs![0].tags = [ - BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON, - ]; - scene.removePokemonFromPlayerParty(playerPokemon, false); - - const onBeforeRewardsPhase = () => { - queueEncounterMessage(scene, `${namespace}:option.3.finished`); - // Add the pokemon back to party with ability change - const abilityIndex = encounter.misc.abilityIndex; - - if (!!playerPokemon.getFusionSpeciesForm()) { - playerPokemon.fusionAbilityIndex = abilityIndex; - - // Only update the fusion's dex data if the Pokemon is already caught in dex (ignore rentals) - const rootFusionSpecies = playerPokemon.fusionSpecies?.getRootSpeciesId(); - if (!isNullOrUndefined(rootFusionSpecies) - && speciesStarterCosts.hasOwnProperty(rootFusionSpecies) - && !!scene.gameData.dexData[rootFusionSpecies].caughtAttr) { - scene.gameData.starterData[rootFusionSpecies].abilityAttr |= playerPokemon.fusionAbilityIndex !== 1 || playerPokemon.fusionSpecies?.ability2 + // Only update the fusion's dex data if the Pokemon is already caught in dex (ignore rentals) + const rootFusionSpecies = playerPokemon.fusionSpecies?.getRootSpeciesId(); + if ( + !isNullOrUndefined(rootFusionSpecies) && + speciesStarterCosts.hasOwnProperty(rootFusionSpecies) && + !!globalScene.gameData.dexData[rootFusionSpecies].caughtAttr + ) { + globalScene.gameData.starterData[rootFusionSpecies].abilityAttr |= + playerPokemon.fusionAbilityIndex !== 1 || playerPokemon.fusionSpecies?.ability2 ? 1 << playerPokemon.fusionAbilityIndex : AbilityAttr.ABILITY_HIDDEN; - } - } else { - playerPokemon.abilityIndex = abilityIndex; } + } else { + playerPokemon.abilityIndex = abilityIndex; + } - playerPokemon.calculateStats(); - scene.gameData.setPokemonCaught(playerPokemon, false); + playerPokemon.calculateStats(); + globalScene.gameData.setPokemonCaught(playerPokemon, false); - // Add pokemon and mods back - scene.getParty().push(playerPokemon); - for (const mod of modifiers.value) { - mod.pokemonId = playerPokemon.id; - scene.addModifier(mod, true, false, false, true); - } - scene.updateModifiers(true); - }; + // Add pokemon and mods back + globalScene.getPlayerParty().push(playerPokemon); + for (const mod of modifiers.value) { + mod.pokemonId = playerPokemon.id; + globalScene.addModifier(mod, true, false, false, true); + } + globalScene.updateModifiers(true); + }; - setEncounterRewards(scene, { fillRemaining: true }, undefined, onBeforeRewardsPhase); + setEncounterRewards({ fillRemaining: true }, undefined, onBeforeRewardsPhase); - await initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.4.label`, - buttonTooltip: `${namespace}:option.4.tooltip`, - selected: [ - { - text: `${namespace}:option.4.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + await initBattleWithEnemyConfig(config); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.4.label`, + buttonTooltip: `${namespace}:option.4.tooltip`, + selected: [ + { + text: `${namespace}:option.4.selected`, + }, + ], + }, + async () => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); -function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segments: number, modifiers: ModifiersHolder): EnemyPartyConfig { +function getEnemyConfig(playerPokemon: PlayerPokemon, segments: number, modifiers: ModifiersHolder): EnemyPartyConfig { playerPokemon.resetSummonData(); // Passes modifiers by reference modifiers.value = playerPokemon.getHeldItems(); - const modifierConfigs = modifiers.value.map((mod) => { + const modifierConfigs = modifiers.value.map(mod => { return { modifier: mod.clone(), isTransferable: false, - stackCount: mod.stackCount + stackCount: mod.stackCount, }; }) as HeldModifierConfig[]; @@ -405,6 +405,4 @@ function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segmen class ModifiersHolder { public value: PokemonHeldItemModifier[] = []; - - constructor() {} } 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 d3c16ce2122..1c617aa2c7f 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -1,8 +1,18 @@ -import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import type { EnemyPartyConfig, EnemyPokemonConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + loadCustomMovesForEncounter, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -31,204 +41,243 @@ const SHOP_ITEM_COST_MULTIPLIER = 2.5; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3809 | GitHub Issue #3809} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TrashToTreasureEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRASH_TO_TREASURE) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(60, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) - .withMaxAllowedEncounters(1) - .withFleeAllowed(false) - .withIntroSpriteConfigs([ - { - spriteKey: Species.GARBODOR.toString() + "-gigantamax", - fileRoot: "pokemon", - hasShadow: false, - disableAnimation: true, - scale: 1.5, - y: 8, - tint: 0.4 - } - ]) - .withAutoHideIntroVisuals(false) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.TRASH_TO_TREASURE, +) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(60, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES[1]) + .withMaxAllowedEncounters(1) + .withFleeAllowed(false) + .withIntroSpriteConfigs([ + { + spriteKey: Species.GARBODOR.toString() + "-gigantamax", + fileRoot: "pokemon", + hasShadow: false, + disableAnimation: true, + scale: 1.5, + y: 8, + tint: 0.4, + }, + ]) + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - const bossSpecies = getPokemonSpecies(Species.GARBODOR); - const pokemonConfig: EnemyPokemonConfig = { - species: bossSpecies, - isBoss: true, - formIndex: 1, // Gmax - bossSegmentModifier: 1, // +1 Segment from normal - moveSet: [ Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH ] - }; - const config: EnemyPartyConfig = { - levelAdditiveModifier: 0.5, - pokemonConfigs: [ pokemonConfig ], - disableSwitch: true - }; - encounter.enemyPartyConfigs = [ config ]; + // 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], + }; + const config: EnemyPartyConfig = { + levelAdditiveModifier: 0.5, + pokemonConfigs: [pokemonConfig], + disableSwitch: true, + }; + encounter.enemyPartyConfigs = [config]; - // Load animations/sfx for Garbodor fight start moves - loadCustomMovesForEncounter(scene, [ Moves.TOXIC, Moves.AMNESIA ]); + // Load animations/sfx for Garbodor fight start moves + loadCustomMovesForEncounter([Moves.TOXIC, Moves.AMNESIA]); - scene.loadSe("PRSFX- Dig2", "battle_anims", "PRSFX- Dig2.wav"); - scene.loadSe("PRSFX- Venom Drench", "battle_anims", "PRSFX- Venom Drench.wav"); + globalScene.loadSe("PRSFX- Dig2", "battle_anims", "PRSFX- Dig2.wav"); + globalScene.loadSe("PRSFX- Venom Drench", "battle_anims", "PRSFX- Venom Drench.wav"); - encounter.setDialogueToken("costMultiplier", SHOP_ITEM_COST_MULTIPLIER.toString()); + encounter.setDialogueToken("costMultiplier", SHOP_ITEM_COST_MULTIPLIER.toString()); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Play Dig2 and then Venom Drench sfx - doGarbageDig(scene); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Gain 2 Leftovers and 2 Shell Bell - await transitionMysteryEncounterIntroVisuals(scene); - await tryApplyDigRewardItems(scene); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Play Dig2 and then Venom Drench sfx + doGarbageDig(); + }) + .withOptionPhase(async () => { + // Gain 2 Leftovers and 2 Shell Bell + await transitionMysteryEncounterIntroVisuals(); + await tryApplyDigRewardItems(); - const blackSludge = generateModifierType(scene, modifierTypes.MYSTERY_ENCOUNTER_BLACK_SLUDGE, [ SHOP_ITEM_COST_MULTIPLIER ]); - const modifier = blackSludge?.newModifier(); - if (modifier) { - await scene.addModifier(modifier, false, false, false, true); - scene.playSound("battle_anims/PRSFX- Venom Drench", { volume: 2 }); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: modifier.type.name }), null, undefined, true); - } + const blackSludge = generateModifierType(modifierTypes.MYSTERY_ENCOUNTER_BLACK_SLUDGE, [ + SHOP_ITEM_COST_MULTIPLIER, + ]); + const modifier = blackSludge?.newModifier(); + if (modifier) { + await globalScene.addModifier(modifier, false, false, false, true); + globalScene.playSound("battle_anims/PRSFX- Venom Drench", { + volume: 2, + }); + await showEncounterText( + i18next.t("battle:rewardGain", { + modifierName: modifier.type.name, + }), + null, + undefined, + true, + ); + } - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - // Investigate garbage, battle Gmax Garbodor - scene.setFieldScale(0.75); - await showEncounterText(scene, `${namespace}:option.2.selected_2`); - await transitionMysteryEncounterIntroVisuals(scene); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }) + .withOptionPhase(async () => { + // Investigate garbage, battle Gmax Garbodor + globalScene.setFieldScale(0.75); + await showEncounterText(`${namespace}:option.2.selected_2`); + await transitionMysteryEncounterIntroVisuals(); - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; - setEncounterRewards(scene, { guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT ], fillRemaining: true }); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.PLAYER ], - move: new PokemonMove(Moves.TOXIC), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.ENEMY ], - move: new PokemonMove(Moves.AMNESIA), - ignorePp: true - }); - await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); - }) - .build() - ) - .build(); + setEncounterRewards({ + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], + fillRemaining: true, + }); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.TOXIC), + ignorePp: true, + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY], + move: new PokemonMove(Moves.AMNESIA), + ignorePp: true, + }, + ); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }) + .build(), + ) + .build(); -async function tryApplyDigRewardItems(scene: BattleScene) { - const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; - const leftovers = generateModifierType(scene, modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType; +async function tryApplyDigRewardItems() { + const shellBell = generateModifierType(modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; + const leftovers = generateModifierType(modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType; - const party = scene.getParty(); + const party = globalScene.getPlayerParty(); // Iterate over the party until an item was successfully given // First leftovers for (const pokemon of party) { - const heldItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const heldItems = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; const existingLeftovers = heldItems.find(m => m instanceof TurnHealModifier) as TurnHealModifier; - if (!existingLeftovers || existingLeftovers.getStackCount() < existingLeftovers.getMaxStackCount(scene)) { - await applyModifierTypeToPlayerPokemon(scene, pokemon, leftovers); + if (!existingLeftovers || existingLeftovers.getStackCount() < existingLeftovers.getMaxStackCount()) { + await applyModifierTypeToPlayerPokemon(pokemon, leftovers); break; } } // Second leftovers for (const pokemon of party) { - const heldItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const heldItems = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; const existingLeftovers = heldItems.find(m => m instanceof TurnHealModifier) as TurnHealModifier; - if (!existingLeftovers || existingLeftovers.getStackCount() < existingLeftovers.getMaxStackCount(scene)) { - await applyModifierTypeToPlayerPokemon(scene, pokemon, leftovers); + if (!existingLeftovers || existingLeftovers.getStackCount() < existingLeftovers.getMaxStackCount()) { + await applyModifierTypeToPlayerPokemon(pokemon, leftovers); break; } } - scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGainCount", { modifierName: leftovers.name, count: 2 }), null, undefined, true); + globalScene.playSound("item_fanfare"); + await showEncounterText( + i18next.t("battle:rewardGainCount", { + modifierName: leftovers.name, + count: 2, + }), + null, + undefined, + true, + ); // First Shell bell for (const pokemon of party) { - const heldItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const heldItems = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; const existingShellBell = heldItems.find(m => m instanceof HitHealModifier) as HitHealModifier; - if (!existingShellBell || existingShellBell.getStackCount() < existingShellBell.getMaxStackCount(scene)) { - await applyModifierTypeToPlayerPokemon(scene, pokemon, shellBell); + if (!existingShellBell || existingShellBell.getStackCount() < existingShellBell.getMaxStackCount()) { + await applyModifierTypeToPlayerPokemon(pokemon, shellBell); break; } } // Second Shell bell for (const pokemon of party) { - const heldItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const heldItems = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; const existingShellBell = heldItems.find(m => m instanceof HitHealModifier) as HitHealModifier; - if (!existingShellBell || existingShellBell.getStackCount() < existingShellBell.getMaxStackCount(scene)) { - await applyModifierTypeToPlayerPokemon(scene, pokemon, shellBell); + if (!existingShellBell || existingShellBell.getStackCount() < existingShellBell.getMaxStackCount()) { + await applyModifierTypeToPlayerPokemon(pokemon, shellBell); break; } } - scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGainCount", { modifierName: shellBell.name, count: 2 }), null, undefined, true); + globalScene.playSound("item_fanfare"); + await showEncounterText( + i18next.t("battle:rewardGainCount", { + modifierName: shellBell.name, + count: 2, + }), + null, + undefined, + true, + ); } -function doGarbageDig(scene: BattleScene) { - scene.playSound("battle_anims/PRSFX- Dig2"); - scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME, () => { - scene.playSound("battle_anims/PRSFX- Dig2"); - scene.playSound("battle_anims/PRSFX- Venom Drench", { volume: 2 }); +function doGarbageDig() { + globalScene.playSound("battle_anims/PRSFX- Dig2"); + globalScene.time.delayedCall(SOUND_EFFECT_WAIT_TIME, () => { + globalScene.playSound("battle_anims/PRSFX- Dig2"); + globalScene.playSound("battle_anims/PRSFX- Venom Drench", { volume: 2 }); }); - scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME * 2, () => { - scene.playSound("battle_anims/PRSFX- Dig2"); + globalScene.time.delayedCall(SOUND_EFFECT_WAIT_TIME * 2, () => { + globalScene.playSound("battle_anims/PRSFX- Dig2"); }); } diff --git a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts index b7ce3bab48c..ed1866c7a1b 100644 --- a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts +++ b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts @@ -1,21 +1,36 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + getRandomEncounterSpecies, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterExp, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { CHARMING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -import Pokemon, { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; -import { getPartyLuckValue } from "#app/modifier/modifier-type"; +import type Pokemon from "#app/field/pokemon"; +import type { EnemyPokemon } from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; -import { MoveRequirement, PersistentModifierRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { + MoveRequirement, + PersistentModifierRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { TrainerSlot } from "#app/data/trainer-config"; -import { catchPokemon, getHighestLevelPlayerPokemon, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { + catchPokemon, + getHighestLevelPlayerPokemon, + getSpriteKeysFromPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import PokemonData from "#app/system/pokemon-data"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; -import { Moves } from "#enums/moves"; +import type { Moves } from "#enums/moves"; import { BattlerIndex } from "#app/battle"; -import { SelfStatusMove } from "#app/data/move"; +import { SelfStatusMove } from "#app/data/moves/move"; import { PokeballType } from "#enums/pokeball"; import { BattlerTagType } from "#enums/battler-tag-type"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -32,220 +47,228 @@ const namespace = "mysteryEncounters/uncommonBreed"; * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3811 | GitHub Issue #3811} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const UncommonBreedEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.UNCOMMON_BREED) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withFleeAllowed(false) - .withIntroSpriteConfigs([]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter!; +export const UncommonBreedEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.UNCOMMON_BREED, +) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withFleeAllowed(false) + .withIntroSpriteConfigs([]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + ]) + .withOnInit(() => { + const encounter = globalScene.currentBattle.mysteryEncounter!; - // Calculate boss mon - // Level equal to 2 below highest party member - const level = getHighestLevelPlayerPokemon(scene, false, true).level - 2; - const species = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); - const pokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, true); + // Calculate boss mon + // Level equal to 2 below highest party member + const level = getHighestLevelPlayerPokemon(false, true).level - 2; + const pokemon = getRandomEncounterSpecies(level, true, true); - // Pokemon will always have one of its egg moves in its moveset - const eggMoves = pokemon.getEggMoves(); - if (eggMoves) { - const eggMoveIndex = randSeedInt(4); - const randomEggMove: Moves = eggMoves[eggMoveIndex]; - encounter.misc = { - eggMove: randomEggMove, - pokemon: pokemon - }; - if (pokemon.moveset.length < 4) { - pokemon.moveset.push(new PokemonMove(randomEggMove)); - } else { - pokemon.moveset[0] = new PokemonMove(randomEggMove); - } + // Pokemon will always have one of its egg moves in its moveset + const eggMoves = pokemon.getEggMoves(); + if (eggMoves) { + const eggMoveIndex = randSeedInt(4); + const randomEggMove: Moves = eggMoves[eggMoveIndex]; + encounter.misc = { + eggMove: randomEggMove, + pokemon: pokemon, + }; + if (pokemon.moveset.length < 4) { + pokemon.moveset.push(new PokemonMove(randomEggMove)); } else { - encounter.misc.pokemon = pokemon; + pokemon.moveset[0] = new PokemonMove(randomEggMove); } + } else { + encounter.misc.pokemon = pokemon; + } - // Defense/Spd buffs below wave 50, +1 to all stats otherwise - const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = scene.currentBattle.waveIndex < 50 ? - [ Stat.DEF, Stat.SPDEF, Stat.SPD ] : - [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + // Defense/Spd buffs below wave 50, +1 to all stats otherwise + const statChangesForBattle: (Stat.ATK | Stat.DEF | Stat.SPATK | Stat.SPDEF | Stat.SPD | Stat.ACC | Stat.EVA)[] = + globalScene.currentBattle.waveIndex < 50 + ? [Stat.DEF, Stat.SPDEF, Stat.SPD] + : [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; - const config: EnemyPartyConfig = { - pokemonConfigs: [{ + const config: EnemyPartyConfig = { + pokemonConfigs: [ + { level: level, - species: species, + species: pokemon.species, dataSource: new PokemonData(pokemon), isBoss: false, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:option.1.stat_boost`); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, statChangesForBattle, 1)); - } - }], - }; - encounter.enemyPartyConfigs = [ config ]; - - const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); - encounter.spriteConfigs = [ - { - spriteKey: spriteKey, - fileRoot: fileRoot, - hasShadow: true, - x: -5, - repeat: true, - isPokemon: true + queueEncounterMessage(`${namespace}:option.1.stat_boost`); + globalScene.unshiftPhase( + new StatStageChangePhase(pokemon.getBattlerIndex(), true, statChangesForBattle, 1), + ); + }, }, - ]; + ], + }; + encounter.enemyPartyConfigs = [config]; - encounter.setDialogueToken("enemyPokemon", pokemon.getNameToRender()); - scene.loadSe("PRSFX- Spotlight2", "battle_anims", "PRSFX- Spotlight2.wav"); - return true; - }) - .withOnVisualsStart((scene: BattleScene) => { - // Animate the pokemon - const encounter = scene.currentBattle.mysteryEncounter!; - const pokemonSprite = encounter.introVisuals!.getSprites(); - - scene.tweens.add({ // Bounce at the end - targets: pokemonSprite, - duration: 300, - ease: "Cubic.easeOut", - yoyo: true, - y: "-=20", - loop: 1, - }); - - scene.time.delayedCall(500, () => scene.playSound("battle_anims/PRSFX- Spotlight2")); - return true; - }) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withSimpleOption( + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); + encounter.spriteConfigs = [ { - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + x: -5, + repeat: true, + isPokemon: true, + isShiny: pokemon.shiny, + variant: pokemon.variant, + }, + ]; + + encounter.setDialogueToken("enemyPokemon", pokemon.getNameToRender()); + globalScene.loadSe("PRSFX- Spotlight2", "battle_anims", "PRSFX- Spotlight2.wav"); + return true; + }) + .withOnVisualsStart(() => { + // Animate the pokemon + const encounter = globalScene.currentBattle.mysteryEncounter!; + const pokemonSprite = encounter.introVisuals!.getSprites(); + + // Bounce at the end, then shiny sparkle if the Pokemon is shiny + globalScene.tweens.add({ + targets: pokemonSprite, + duration: 300, + ease: "Cubic.easeOut", + yoyo: true, + y: "-=20", + loop: 1, + onComplete: () => encounter.introVisuals?.playShinySparkles(), + }); + + globalScene.time.delayedCall(500, () => globalScene.playSound("battle_anims/PRSFX- Spotlight2")); + return true; + }) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }, + async () => { + // Pick battle + const encounter = globalScene.currentBattle.mysteryEncounter!; + + const eggMove = encounter.misc.eggMove; + if (!isNullOrUndefined(eggMove)) { + // Check what type of move the egg move is to determine target + const pokemonMove = new PokemonMove(eggMove); + const move = pokemonMove.getMove(); + const target = move instanceof SelfStatusMove ? BattlerIndex.ENEMY : BattlerIndex.PLAYER; + + encounter.startOfBattleEffects.push({ + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [target], + move: pokemonMove, + ignorePp: true, + }); + } + + setEncounterRewards({ fillRemaining: true }); + await initBattleWithEnemyConfig(encounter.enemyPartyConfigs[0]); + }, + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, selected: [ { - text: `${namespace}:option.1.selected`, + text: `${namespace}:option.2.selected`, }, ], - }, - async (scene: BattleScene) => { - // Pick battle - const encounter = scene.currentBattle.mysteryEncounter!; + }) + .withOptionPhase(async () => { + // Give it some food - const eggMove = encounter.misc.eggMove; - if (!isNullOrUndefined(eggMove)) { - // Check what type of move the egg move is to determine target - const pokemonMove = new PokemonMove(eggMove); - const move = pokemonMove.getMove(); - const target = move instanceof SelfStatusMove ? BattlerIndex.ENEMY : BattlerIndex.PLAYER; - - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ target ], - move: pokemonMove, - ignorePp: true - }); + // Remove 4 random berries from player's party + // Get all player berry items, remove from party, and store reference + const berryItems: BerryModifier[] = globalScene.findModifiers( + m => m instanceof BerryModifier, + ) as BerryModifier[]; + for (let i = 0; i < 4; i++) { + const index = randSeedInt(berryItems.length); + const randBerry = berryItems[index]; + randBerry.stackCount--; + if (randBerry.stackCount === 0) { + globalScene.removeModifier(randBerry); + berryItems.splice(index, 1); + } } + await globalScene.updateModifiers(true, true); - setEncounterRewards(scene, { fillRemaining: true }); - await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); - } - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected` - } - ] - }) - .withOptionPhase(async (scene: BattleScene) => { - // Give it some food + // Pokemon joins the team, with 2 egg moves + const encounter = globalScene.currentBattle.mysteryEncounter!; + const pokemon = encounter.misc.pokemon; - // Remove 4 random berries from player's party - // Get all player berry items, remove from party, and store reference - const berryItems: BerryModifier[] = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; - for (let i = 0; i < 4; i++) { - const index = randSeedInt(berryItems.length); - const randBerry = berryItems[index]; - randBerry.stackCount--; - if (randBerry.stackCount === 0) { - scene.removeModifier(randBerry); - berryItems.splice(index, 1); - } - } - await scene.updateModifiers(true, true); + // Give 1 additional egg move + givePokemonExtraEggMove(pokemon, encounter.misc.eggMove); - // Pokemon joins the team, with 2 egg moves - const encounter = scene.currentBattle.mysteryEncounter!; - const pokemon = encounter.misc.pokemon; + await catchPokemon(pokemon, null, PokeballType.POKEBALL, false); + setEncounterRewards({ fillRemaining: true }); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }) + .withOptionPhase(async () => { + // Attract the pokemon with a move + // Pokemon joins the team, with 2 egg moves and IVs rolled an additional time + const encounter = globalScene.currentBattle.mysteryEncounter!; + const pokemon = encounter.misc.pokemon; - // Give 1 additional egg move - givePokemonExtraEggMove(pokemon, encounter.misc.eggMove); + // Give 1 additional egg move + givePokemonExtraEggMove(pokemon, encounter.misc.eggMove); - await catchPokemon(scene, pokemon, null, PokeballType.POKEBALL, false); - setEncounterRewards(scene, { fillRemaining: true }); - leaveEncounterWithoutBattle(scene); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected` - } - ] - }) - .withOptionPhase(async (scene: BattleScene) => { - // Attract the pokemon with a move - // Pokemon joins the team, with 2 egg moves and IVs rolled an additional time - const encounter = scene.currentBattle.mysteryEncounter!; - const pokemon = encounter.misc.pokemon; + // Roll IVs a second time + pokemon.ivs = pokemon.ivs.map(iv => { + const newValue = randSeedInt(31); + return newValue > iv ? newValue : iv; + }); - // Give 1 additional egg move - givePokemonExtraEggMove(pokemon, encounter.misc.eggMove); - - // Roll IVs a second time - pokemon.ivs = pokemon.ivs.map(iv => { - const newValue = randSeedInt(31); - return newValue > iv ? newValue : iv; - }); - - await catchPokemon(scene, pokemon, null, PokeballType.POKEBALL, false); - if (encounter.selectedOption?.primaryPokemon?.id) { - setEncounterExp(scene, encounter.selectedOption.primaryPokemon.id, pokemon.getExpValue(), false); - } - setEncounterRewards(scene, { fillRemaining: true }); - leaveEncounterWithoutBattle(scene); - }) - .build() - ) - .build(); + await catchPokemon(pokemon, null, PokeballType.POKEBALL, false); + if (encounter.selectedOption?.primaryPokemon?.id) { + setEncounterExp(encounter.selectedOption.primaryPokemon.id, pokemon.getExpValue(), false); + } + setEncounterRewards({ fillRemaining: true }); + leaveEncounterWithoutBattle(); + }) + .build(), + ) + .build(); function givePokemonExtraEggMove(pokemon: EnemyPokemon, previousEggMove: Moves) { const eggMoves = pokemon.getEggMoves(); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 2ecba6ce658..758e3fabd76 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -1,22 +1,37 @@ -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, } from "../utils/encounter-phase-utils"; +import type { EnemyPartyConfig, EnemyPokemonConfig } from "../utils/encounter-phase-utils"; +import { + generateModifierType, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards, +} from "../utils/encounter-phase-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; -import { IntegerHolder, isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; -import PokemonSpecies, { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; -import { HiddenAbilityRateBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; +import { NumberHolder, isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; +import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { HiddenAbilityRateBoosterModifier, PokemonFormChangeItemModifier } from "#app/modifier/modifier"; import { achvs } from "#app/system/achv"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; -import { doPokemonTransformationSequence, TransformationScreenPosition } from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; +import { + doPokemonTransformationSequence, + TransformationScreenPosition, +} from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; import { getLevelTotalExp } from "#app/data/exp"; import { Stat } from "#enums/stat"; import { Challenges } from "#enums/challenges"; @@ -25,7 +40,7 @@ import { PlayerGender } from "#enums/player-gender"; import { TrainerType } from "#enums/trainer-type"; import PokemonData from "#app/system/pokemon-data"; import { Nature } from "#enums/nature"; -import HeldModifierConfig from "#app/interfaces/held-modifier-config"; +import type HeldModifierConfig from "#app/interfaces/held-modifier-config"; import { trainerConfigs, TrainerPartyTemplate } from "#app/data/trainer-config"; import { PartyMemberStrength } from "#enums/party-member-strength"; @@ -97,229 +112,260 @@ const PERCENT_LEVEL_LOSS_ON_REFUSE = 10; * Value ranges of the resulting species BST transformations after adding values to original species * 2 Pokemon in the party use this range */ -const HIGH_BST_TRANSFORM_BASE_VALUES: [number, number] = [ 90, 110 ]; +const HIGH_BST_TRANSFORM_BASE_VALUES: [number, number] = [90, 110]; /** * Value ranges of the resulting species BST transformations after adding values to original species * All remaining Pokemon in the party use this range */ -const STANDARD_BST_TRANSFORM_BASE_VALUES: [number, number] = [ 40, 50 ]; +const STANDARD_BST_TRANSFORM_BASE_VALUES: [number, number] = [40, 50]; /** * Weird Dream encounter. * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3822 | GitHub Issue #3822} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const WeirdDreamEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM) - .withEncounterTier(MysteryEncounterTier.ROGUE) - .withDisallowedChallenges(Challenges.SINGLE_TYPE, Challenges.SINGLE_GENERATION) - // TODO: should reset minimum wave to 10 when there are more Rogue tiers in pool. Matching Dark Deal minimum for now. - .withSceneWaveRangeRequirement(30, 140) - .withIntroSpriteConfigs([ - { - spriteKey: "weird_dream_woman", - fileRoot: "mystery-encounters", - hasShadow: true, - y: 11, - yShadow: 6, - x: 4 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}:intro`, - }, - { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, - }, - ]) - .setLocalizationKey(`${namespace}`) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - .withOnInit((scene: BattleScene) => { - scene.loadBgm("mystery_encounter_weird_dream", "mystery_encounter_weird_dream.mp3"); +export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.WEIRD_DREAM, +) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withDisallowedChallenges(Challenges.SINGLE_TYPE, Challenges.SINGLE_GENERATION) + // TODO: should reset minimum wave to 10 when there are more Rogue tiers in pool. Matching Dark Deal minimum for now. + .withSceneWaveRangeRequirement(30, 140) + .withIntroSpriteConfigs([ + { + spriteKey: "weird_dream_woman", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 11, + yShadow: 6, + x: 4, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + }, + ]) + .setLocalizationKey(`${namespace}`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit(() => { + globalScene.loadBgm("mystery_encounter_weird_dream", "mystery_encounter_weird_dream.mp3"); - // Calculate all the newly transformed Pokemon and begin asset load - const teamTransformations = getTeamTransformations(scene); - const loadAssets = teamTransformations.map(t => (t.newPokemon as PlayerPokemon).loadAssets()); - scene.currentBattle.mysteryEncounter!.misc = { - teamTransformations, - loadAssets + // Calculate all the newly transformed Pokemon and begin asset load + const teamTransformations = getTeamTransformations(); + const loadAssets = teamTransformations.map(t => (t.newPokemon as PlayerPokemon).loadAssets()); + globalScene.currentBattle.mysteryEncounter!.misc = { + teamTransformations, + loadAssets, + }; + + return true; + }) + .withOnVisualsStart(() => { + globalScene.fadeAndSwitchBgm("mystery_encounter_weird_dream"); + return true; + }) + .withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }) + .withPreOptionPhase(async () => { + // Play the animation as the player goes through the dialogue + globalScene.time.delayedCall(1000, () => { + doShowDreamBackground(); + }); + + for (const transformation of globalScene.currentBattle.mysteryEncounter!.misc.teamTransformations) { + globalScene.removePokemonFromPlayerParty(transformation.previousPokemon, false); + globalScene.getPlayerParty().push(transformation.newPokemon); + } + }) + .withOptionPhase(async () => { + // Starts cutscene dialogue, but does not await so that cutscene plays as player goes through dialogue + const cutsceneDialoguePromise = showEncounterText(`${namespace}:option.1.cutscene`); + + // Change the entire player's party + // Wait for all new Pokemon assets to be loaded before showing transformation animations + await Promise.all(globalScene.currentBattle.mysteryEncounter!.misc.loadAssets); + const transformations = globalScene.currentBattle.mysteryEncounter!.misc.teamTransformations; + + // If there are 1-3 transformations, do them centered back to back + // Otherwise, the first 3 transformations are executed side-by-side, then any remaining 1-3 transformations occur in those same respective positions + if (transformations.length <= 3) { + for (const transformation of transformations) { + const pokemon1 = transformation.previousPokemon; + const pokemon2 = transformation.newPokemon; + + await doPokemonTransformationSequence(pokemon1, pokemon2, TransformationScreenPosition.CENTER); + } + } else { + await doSideBySideTransformations(transformations); + } + + // Make sure player has finished cutscene dialogue + await cutsceneDialoguePromise; + + doHideDreamBackground(); + await showEncounterText(`${namespace}:option.1.dream_complete`); + + await doNewTeamPostProcess(transformations); + setEncounterRewards({ + guaranteedModifierTypeFuncs: [ + modifierTypes.MEMORY_MUSHROOM, + modifierTypes.ROGUE_BALL, + modifierTypes.MINT, + modifierTypes.MINT, + modifierTypes.MINT, + ], + fillRemaining: false, + }); + leaveEncounterWithoutBattle(true); + }) + .build(), + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }, + async () => { + // Battle your "future" team for some item rewards + const transformations: PokemonTransformation[] = + globalScene.currentBattle.mysteryEncounter!.misc.teamTransformations; + + // Uses the pokemon that player's party would have transformed into + const enemyPokemonConfigs: EnemyPokemonConfig[] = []; + for (const transformation of transformations) { + const newPokemon = transformation.newPokemon; + const previousPokemon = transformation.previousPokemon; + + await postProcessTransformedPokemon(previousPokemon, newPokemon, newPokemon.species.getRootSpeciesId(), true); + + const dataSource = new PokemonData(newPokemon); + dataSource.player = false; + + // Copy held items to new pokemon + const newPokemonHeldItemConfigs: HeldModifierConfig[] = []; + for (const item of transformation.heldItems) { + newPokemonHeldItemConfigs.push({ + modifier: item.clone() as PokemonHeldItemModifier, + stackCount: item.getStackCount(), + isTransferable: false, + }); + } + // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats + if (shouldGetOldGateau(newPokemon)) { + const stats = getOldGateauBoostedStats(newPokemon); + newPokemonHeldItemConfigs.push({ + modifier: generateModifierType(modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU, [ + OLD_GATEAU_STATS_UP, + stats, + ]) as PokemonHeldItemModifierType, + stackCount: 1, + isTransferable: false, + }); + } + + const enemyConfig: EnemyPokemonConfig = { + species: transformation.newSpecies, + isBoss: newPokemon.getSpeciesForm().getBaseStatTotal() > NON_LEGENDARY_BST_THRESHOLD, + level: previousPokemon.level, + dataSource: dataSource, + modifierConfigs: newPokemonHeldItemConfigs, + }; + + enemyPokemonConfigs.push(enemyConfig); + } + + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; + const trainerConfig = + trainerConfigs[ + genderIndex === PlayerGender.FEMALE ? TrainerType.FUTURE_SELF_F : TrainerType.FUTURE_SELF_M + ].clone(); + trainerConfig.setPartyTemplates(new TrainerPartyTemplate(transformations.length, PartyMemberStrength.STRONG)); + const enemyPartyConfig: EnemyPartyConfig = { + trainerConfig: trainerConfig, + pokemonConfigs: enemyPokemonConfigs, + female: genderIndex === PlayerGender.FEMALE, }; - return true; - }) - .withOnVisualsStart((scene: BattleScene) => { - scene.fadeAndSwitchBgm("mystery_encounter_weird_dream"); - return true; - }) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue({ - buttonLabel: `${namespace}:option.1.label`, - buttonTooltip: `${namespace}:option.1.tooltip`, - selected: [ - { - text: `${namespace}:option.1.selected`, - } + const onBeforeRewards = () => { + // Before battle rewards, unlock the passive on a pokemon in the player's team for the rest of the run (not permanently) + // One random pokemon will get its passive unlocked + const passiveDisabledPokemon = globalScene.getPlayerParty().filter(p => !p.passive); + if (passiveDisabledPokemon?.length > 0) { + const enablePassiveMon = passiveDisabledPokemon[randSeedInt(passiveDisabledPokemon.length)]; + enablePassiveMon.passive = true; + enablePassiveMon.updateInfo(true); + } + }; + + setEncounterRewards( + { + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.GREAT, + ModifierTier.GREAT, ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Play the animation as the player goes through the dialogue - scene.time.delayedCall(1000, () => { - doShowDreamBackground(scene); - }); + fillRemaining: false, + }, + undefined, + onBeforeRewards, + ); - for (const transformation of scene.currentBattle.mysteryEncounter!.misc.teamTransformations) { - scene.removePokemonFromPlayerParty(transformation.previousPokemon, false); - scene.getParty().push(transformation.newPokemon); - } - }) - .withOptionPhase(async (scene: BattleScene) => { - // Starts cutscene dialogue, but does not await so that cutscene plays as player goes through dialogue - const cutsceneDialoguePromise = showEncounterText(scene, `${namespace}:option.1.cutscene`); + await showEncounterText(`${namespace}:option.2.selected_2`, null, undefined, true); + await initBattleWithEnemyConfig(enemyPartyConfig); + }, + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }, + async () => { + // Leave, reduce party levels by 10% + for (const pokemon of globalScene.getPlayerParty()) { + pokemon.level = Math.max(Math.ceil(((100 - PERCENT_LEVEL_LOSS_ON_REFUSE) / 100) * pokemon.level), 1); + pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate); + pokemon.levelExp = 0; - // Change the entire player's party - // Wait for all new Pokemon assets to be loaded before showing transformation animations - await Promise.all(scene.currentBattle.mysteryEncounter!.misc.loadAssets); - const transformations = scene.currentBattle.mysteryEncounter!.misc.teamTransformations; - - // If there are 1-3 transformations, do them centered back to back - // Otherwise, the first 3 transformations are executed side-by-side, then any remaining 1-3 transformations occur in those same respective positions - if (transformations.length <= 3) { - for (const transformation of transformations) { - const pokemon1 = transformation.previousPokemon; - const pokemon2 = transformation.newPokemon; - - await doPokemonTransformationSequence(scene, pokemon1, pokemon2, TransformationScreenPosition.CENTER); - } - } else { - await doSideBySideTransformations(scene, transformations); - } - - // Make sure player has finished cutscene dialogue - await cutsceneDialoguePromise; - - doHideDreamBackground(scene); - await showEncounterText(scene, `${namespace}:option.1.dream_complete`); - - await doNewTeamPostProcess(scene, transformations); - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.ROGUE_BALL, modifierTypes.MINT, modifierTypes.MINT, modifierTypes.MINT ], fillRemaining: false }); - leaveEncounterWithoutBattle(scene, true); - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip`, - selected: [ - { - text: `${namespace}:option.2.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Battle your "future" team for some item rewards - const transformations: PokemonTransformation[] = scene.currentBattle.mysteryEncounter!.misc.teamTransformations; - - // Uses the pokemon that player's party would have transformed into - const enemyPokemonConfigs: EnemyPokemonConfig[] = []; - for (const transformation of transformations) { - const newPokemon = transformation.newPokemon; - const previousPokemon = transformation.previousPokemon; - - await postProcessTransformedPokemon(scene, previousPokemon, newPokemon, newPokemon.species.getRootSpeciesId(), true); - - const dataSource = new PokemonData(newPokemon); - dataSource.player = false; - - // Copy held items to new pokemon - const newPokemonHeldItemConfigs: HeldModifierConfig[] = []; - for (const item of transformation.heldItems) { - newPokemonHeldItemConfigs.push({ - modifier: item.clone() as PokemonHeldItemModifier, - stackCount: item.getStackCount(), - isTransferable: false - }); - } - // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats - if (shouldGetOldGateau(newPokemon)) { - const stats = getOldGateauBoostedStats(newPokemon); - newPokemonHeldItemConfigs.push({ - modifier: generateModifierType(scene, modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU, [ OLD_GATEAU_STATS_UP, stats ]) as PokemonHeldItemModifierType, - stackCount: 1, - isTransferable: false - }); - } - - const enemyConfig: EnemyPokemonConfig = { - species: transformation.newSpecies, - isBoss: newPokemon.getSpeciesForm().getBaseStatTotal() > NON_LEGENDARY_BST_THRESHOLD, - level: previousPokemon.level, - dataSource: dataSource, - modifierConfigs: newPokemonHeldItemConfigs - }; - - enemyPokemonConfigs.push(enemyConfig); - } - - const genderIndex = scene.gameData.gender ?? PlayerGender.UNSET; - const trainerConfig = trainerConfigs[genderIndex === PlayerGender.FEMALE ? TrainerType.FUTURE_SELF_F : TrainerType.FUTURE_SELF_M].clone(); - trainerConfig.setPartyTemplates(new TrainerPartyTemplate(transformations.length, PartyMemberStrength.STRONG)); - const enemyPartyConfig: EnemyPartyConfig = { - trainerConfig: trainerConfig, - pokemonConfigs: enemyPokemonConfigs, - female: genderIndex === PlayerGender.FEMALE - }; - - const onBeforeRewards = () => { - // Before battle rewards, unlock the passive on a pokemon in the player's team for the rest of the run (not permanently) - // One random pokemon will get its passive unlocked - const passiveDisabledPokemon = scene.getParty().filter(p => !p.passive); - if (passiveDisabledPokemon?.length > 0) { - const enablePassiveMon = passiveDisabledPokemon[randSeedInt(passiveDisabledPokemon.length)]; - enablePassiveMon.passive = true; - enablePassiveMon.updateInfo(true); - } - }; - - setEncounterRewards(scene, { guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], fillRemaining: false }, undefined, onBeforeRewards); - - await showEncounterText(scene, `${namespace}:option.2.selected_2`, null, undefined, true); - await initBattleWithEnemyConfig(scene, enemyPartyConfig); + pokemon.calculateStats(); + pokemon.getBattleInfo().setLevel(pokemon.level); + await pokemon.updateInfo(); } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option.3.label`, - buttonTooltip: `${namespace}:option.3.tooltip`, - selected: [ - { - text: `${namespace}:option.3.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Leave, reduce party levels by 10% - for (const pokemon of scene.getParty()) { - pokemon.level = Math.max(Math.ceil((100 - PERCENT_LEVEL_LOSS_ON_REFUSE) / 100 * pokemon.level), 1); - pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate); - pokemon.levelExp = 0; - pokemon.calculateStats(); - await pokemon.updateInfo(); - } - - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); + leaveEncounterWithoutBattle(true); + return true; + }, + ) + .build(); interface PokemonTransformation { previousPokemon: PlayerPokemon; @@ -328,13 +374,13 @@ interface PokemonTransformation { heldItems: PokemonHeldItemModifier[]; } -function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { - const party = scene.getParty(); +function getTeamTransformations(): PokemonTransformation[] { + const party = globalScene.getPlayerParty(); // Removes all pokemon from the party const alreadyUsedSpecies: PokemonSpecies[] = party.map(p => p.species); const pokemonTransformations: PokemonTransformation[] = party.map(p => { return { - previousPokemon: p + previousPokemon: p, } as PokemonTransformation; }); @@ -350,9 +396,11 @@ function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { for (let i = 0; i < numPokemon; i++) { const removed = removedPokemon[i]; const index = pokemonTransformations.findIndex(p => p.previousPokemon.id === removed.id); - pokemonTransformations[index].heldItems = removed.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); + pokemonTransformations[index].heldItems = removed + .getHeldItems() + .filter(m => !(m instanceof PokemonFormChangeItemModifier)); - const bst = removed.calculateBaseStats().reduce((a, b) => a + b, 0); + const bst = removed.getSpeciesForm().getBaseStatTotal(); let newBstRange: [number, number]; if (i < 2) { newBstRange = HIGH_BST_TRANSFORM_BASE_VALUES; @@ -360,7 +408,13 @@ function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { newBstRange = STANDARD_BST_TRANSFORM_BASE_VALUES; } - const newSpecies = getTransformedSpecies(bst, newBstRange, hasPokemonInSuperLegendaryBstThreshold, hasPokemonInLegendaryBstThreshold, alreadyUsedSpecies); + const newSpecies = getTransformedSpecies( + bst, + newBstRange, + hasPokemonInSuperLegendaryBstThreshold, + hasPokemonInLegendaryBstThreshold, + alreadyUsedSpecies, + ); const newSpeciesBst = newSpecies.getBaseStatTotal(); if (newSpeciesBst > SUPER_LEGENDARY_BST_THRESHOLD) { @@ -370,7 +424,6 @@ function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { hasPokemonInLegendaryBstThreshold = true; } - pokemonTransformations[index].newSpecies = newSpecies; console.log("New species: " + JSON.stringify(newSpecies)); alreadyUsedSpecies.push(newSpecies); @@ -378,37 +431,43 @@ function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { for (const transformation of pokemonTransformations) { const newAbilityIndex = randSeedInt(transformation.newSpecies.getAbilityCount()); - transformation.newPokemon = scene.addPlayerPokemon(transformation.newSpecies, transformation.previousPokemon.level, newAbilityIndex, undefined); + transformation.newPokemon = globalScene.addPlayerPokemon( + transformation.newSpecies, + transformation.previousPokemon.level, + newAbilityIndex, + undefined, + ); } return pokemonTransformations; } -async function doNewTeamPostProcess(scene: BattleScene, transformations: PokemonTransformation[]) { +async function doNewTeamPostProcess(transformations: PokemonTransformation[]) { let atLeastOneNewStarter = false; for (const transformation of transformations) { const previousPokemon = transformation.previousPokemon; const newPokemon = transformation.newPokemon; const speciesRootForm = newPokemon.species.getRootSpeciesId(); - if (await postProcessTransformedPokemon(scene, previousPokemon, newPokemon, speciesRootForm)) { + if (await postProcessTransformedPokemon(previousPokemon, newPokemon, speciesRootForm)) { atLeastOneNewStarter = true; } // Copy old items to new pokemon for (const item of transformation.heldItems) { item.pokemonId = newPokemon.id; - await scene.addModifier(item, false, false, false, true); + globalScene.addModifier(item, false, false, false, true); } // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats if (shouldGetOldGateau(newPokemon)) { const stats = getOldGateauBoostedStats(newPokemon); - const modType = modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU() - .generateType(scene.getParty(), [ OLD_GATEAU_STATS_UP, stats ]) + const modType = modifierTypes + .MYSTERY_ENCOUNTER_OLD_GATEAU() + .generateType(globalScene.getPlayerParty(), [OLD_GATEAU_STATS_UP, stats]) ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU); const modifier = modType?.newModifier(newPokemon); if (modifier) { - await scene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); } } @@ -417,7 +476,7 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon } // One random pokemon will get its passive unlocked - const passiveDisabledPokemon = scene.getParty().filter(p => !p.passive); + const passiveDisabledPokemon = globalScene.getPlayerParty().filter(p => !p.passive); if (passiveDisabledPokemon?.length > 0) { const enablePassiveMon = passiveDisabledPokemon[randSeedInt(passiveDisabledPokemon.length)]; enablePassiveMon.passive = true; @@ -426,27 +485,31 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon // If at least one new starter was unlocked, play 1 fanfare if (atLeastOneNewStarter) { - scene.playSound("level_up_fanfare"); + globalScene.playSound("level_up_fanfare"); } } /** * Applies special changes to the newly transformed pokemon, such as passing previous moves, gaining egg moves, etc. * Returns whether the transformed pokemon unlocks a new starter for the player. - * @param scene * @param previousPokemon * @param newPokemon * @param speciesRootForm * @param forBattle Default `false`. If false, will perform achievements and dex unlocks for the player. */ -async function postProcessTransformedPokemon(scene: BattleScene, previousPokemon: PlayerPokemon, newPokemon: PlayerPokemon, speciesRootForm: Species, forBattle: boolean = false): Promise { +async function postProcessTransformedPokemon( + previousPokemon: PlayerPokemon, + newPokemon: PlayerPokemon, + speciesRootForm: Species, + forBattle = false, +): Promise { let isNewStarter = false; // Roll HA a second time if (newPokemon.species.abilityHidden) { const hiddenIndex = newPokemon.species.ability2 ? 2 : 1; if (newPokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new IntegerHolder(256); - scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + const hiddenAbilityChance = new NumberHolder(256); + globalScene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); @@ -463,31 +526,41 @@ async function postProcessTransformedPokemon(scene: BattleScene, previousPokemon }); // Roll a neutral nature - newPokemon.nature = [ Nature.HARDY, Nature.DOCILE, Nature.BASHFUL, Nature.QUIRKY, Nature.SERIOUS ][randSeedInt(5)]; + newPokemon.nature = [Nature.HARDY, Nature.DOCILE, Nature.BASHFUL, Nature.QUIRKY, Nature.SERIOUS][randSeedInt(5)]; // For pokemon at/below 570 BST or any shiny pokemon, unlock it permanently as if you had caught it - if (!forBattle && (newPokemon.getSpeciesForm().getBaseStatTotal() <= NON_LEGENDARY_BST_THRESHOLD || newPokemon.isShiny())) { - if (newPokemon.getSpeciesForm().abilityHidden && newPokemon.abilityIndex === newPokemon.getSpeciesForm().getAbilityCount() - 1) { - scene.validateAchv(achvs.HIDDEN_ABILITY); + if ( + !forBattle && + (newPokemon.getSpeciesForm().getBaseStatTotal() <= NON_LEGENDARY_BST_THRESHOLD || newPokemon.isShiny()) + ) { + if ( + newPokemon.getSpeciesForm().abilityHidden && + newPokemon.abilityIndex === newPokemon.getSpeciesForm().getAbilityCount() - 1 + ) { + globalScene.validateAchv(achvs.HIDDEN_ABILITY); } if (newPokemon.species.subLegendary) { - scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + globalScene.validateAchv(achvs.CATCH_SUB_LEGENDARY); } if (newPokemon.species.legendary) { - scene.validateAchv(achvs.CATCH_LEGENDARY); + globalScene.validateAchv(achvs.CATCH_LEGENDARY); } if (newPokemon.species.mythical) { - scene.validateAchv(achvs.CATCH_MYTHICAL); + globalScene.validateAchv(achvs.CATCH_MYTHICAL); } - scene.gameData.updateSpeciesDexIvs(newPokemon.species.getRootSpeciesId(true), newPokemon.ivs); - const newStarterUnlocked = await scene.gameData.setPokemonCaught(newPokemon, true, false, false); + globalScene.gameData.updateSpeciesDexIvs(newPokemon.species.getRootSpeciesId(true), newPokemon.ivs); + const newStarterUnlocked = await globalScene.gameData.setPokemonCaught(newPokemon, true, false, false); if (newStarterUnlocked) { isNewStarter = true; - await showEncounterText(scene, i18next.t("battle:addedAsAStarter", { pokemonName: getPokemonSpecies(speciesRootForm).getName() })); + await showEncounterText( + i18next.t("battle:addedAsAStarter", { + pokemonName: getPokemonSpecies(speciesRootForm).getName(), + }), + ); } } @@ -503,8 +576,8 @@ async function postProcessTransformedPokemon(scene: BattleScene, previousPokemon }); // For pokemon that the player owns (including ones just caught), gain a candy - if (!forBattle && !!scene.gameData.dexData[speciesRootForm].caughtAttr) { - scene.gameData.addStarterCandy(getPokemonSpecies(speciesRootForm), 1); + if (!forBattle && !!globalScene.gameData.dexData[speciesRootForm].caughtAttr) { + globalScene.gameData.addStarterCandy(getPokemonSpecies(speciesRootForm), 1); } // Set the moveset of the new pokemon to be the same as previous, but with 1 egg move and 1 (attempted) STAB move of the new species @@ -514,17 +587,17 @@ async function postProcessTransformedPokemon(scene: BattleScene, previousPokemon newPokemon.moveset = previousPokemon.moveset.slice(0); - const newEggMoveIndex = await addEggMoveToNewPokemonMoveset(scene, newPokemon, speciesRootForm, forBattle); + const newEggMoveIndex = await addEggMoveToNewPokemonMoveset(newPokemon, speciesRootForm, forBattle); // Try to add a favored STAB move (might fail if Pokemon already knows a bunch of moves from newPokemonGeneratedMoveset) addFavoredMoveToNewPokemonMoveset(newPokemon, newPokemonGeneratedMoveset, newEggMoveIndex); // Randomize the second type of the pokemon // If the pokemon does not normally have a second type, it will gain 1 - const newTypes = [ newPokemon.getTypes()[0] ]; - let newType = randSeedInt(18) as Type; + const newTypes = [PokemonType.UNKNOWN]; + let newType = randSeedInt(18) as PokemonType; while (newType === newTypes[0]) { - newType = randSeedInt(18) as Type; + newType = randSeedInt(18) as PokemonType; } newTypes.push(newType); if (!newPokemon.customPokemonData) { @@ -561,23 +634,30 @@ function getOldGateauBoostedStats(pokemon: Pokemon): Stat[] { return stats; } - -function getTransformedSpecies(originalBst: number, bstSearchRange: [number, number], hasPokemonBstHigherThan600: boolean, hasPokemonBstBetween570And600: boolean, alreadyUsedSpecies: PokemonSpecies[]): PokemonSpecies { +function getTransformedSpecies( + originalBst: number, + bstSearchRange: [number, number], + hasPokemonBstHigherThan600: boolean, + hasPokemonBstBetween570And600: boolean, + alreadyUsedSpecies: PokemonSpecies[], +): PokemonSpecies { let newSpecies: PokemonSpecies | undefined; while (isNullOrUndefined(newSpecies)) { const bstCap = originalBst + bstSearchRange[1]; const bstMin = Math.max(originalBst + bstSearchRange[0], 0); // Get any/all species that fall within the Bst range requirements - let validSpecies = allSpecies - .filter(s => { - const speciesBst = s.getBaseStatTotal(); - const bstInRange = speciesBst >= bstMin && speciesBst <= bstCap; - // Checks that a Pokemon has not already been added in the +600 or 570-600 slots; - const validBst = (!hasPokemonBstBetween570And600 || (speciesBst < NON_LEGENDARY_BST_THRESHOLD || speciesBst > SUPER_LEGENDARY_BST_THRESHOLD)) && - (!hasPokemonBstHigherThan600 || speciesBst <= SUPER_LEGENDARY_BST_THRESHOLD); - return bstInRange && validBst && !EXCLUDED_TRANSFORMATION_SPECIES.includes(s.speciesId); - }); + let validSpecies = allSpecies.filter(s => { + const speciesBst = s.getBaseStatTotal(); + const bstInRange = speciesBst >= bstMin && speciesBst <= bstCap; + // Checks that a Pokemon has not already been added in the +600 or 570-600 slots; + const validBst = + (!hasPokemonBstBetween570And600 || + speciesBst < NON_LEGENDARY_BST_THRESHOLD || + speciesBst > SUPER_LEGENDARY_BST_THRESHOLD) && + (!hasPokemonBstHigherThan600 || speciesBst <= SUPER_LEGENDARY_BST_THRESHOLD); + return bstInRange && validBst && !EXCLUDED_TRANSFORMATION_SPECIES.includes(s.speciesId); + }); // There must be at least 20 species available before it will choose one if (validSpecies?.length > 20) { @@ -596,73 +676,78 @@ function getTransformedSpecies(originalBst: number, bstSearchRange: [number, num return newSpecies; } -function doShowDreamBackground(scene: BattleScene) { - const transformationContainer = scene.add.container(0, -scene.game.canvas.height / 6); +function doShowDreamBackground() { + const transformationContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); transformationContainer.name = "Dream Background"; // In case it takes a bit for video to load - const transformationStaticBg = scene.add.rectangle(0, 0, scene.game.canvas.width / 6, scene.game.canvas.height / 6, 0); + const transformationStaticBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0, + ); transformationStaticBg.setName("Black Background"); transformationStaticBg.setOrigin(0, 0); transformationContainer.add(transformationStaticBg); transformationStaticBg.setVisible(true); - const transformationVideoBg: Phaser.GameObjects.Video = scene.add.video(0, 0, "evo_bg").stop(); + const transformationVideoBg: Phaser.GameObjects.Video = globalScene.add.video(0, 0, "evo_bg").stop(); transformationVideoBg.setLoop(true); transformationVideoBg.setOrigin(0, 0); transformationVideoBg.setScale(0.4359673025); transformationContainer.add(transformationVideoBg); - scene.fieldUI.add(transformationContainer); - scene.fieldUI.bringToTop(transformationContainer); + globalScene.fieldUI.add(transformationContainer); + globalScene.fieldUI.bringToTop(transformationContainer); transformationVideoBg.play(); transformationContainer.setVisible(true); transformationContainer.alpha = 0; - scene.tweens.add({ + globalScene.tweens.add({ targets: transformationContainer, alpha: 1, duration: 3000, - ease: "Sine.easeInOut" + ease: "Sine.easeInOut", }); } -function doHideDreamBackground(scene: BattleScene) { - const transformationContainer = scene.fieldUI.getByName("Dream Background"); +function doHideDreamBackground() { + const transformationContainer = globalScene.fieldUI.getByName("Dream Background"); - scene.tweens.add({ + globalScene.tweens.add({ targets: transformationContainer, alpha: 0, duration: 3000, ease: "Sine.easeInOut", onComplete: () => { - scene.fieldUI.remove(transformationContainer, true); - } + globalScene.fieldUI.remove(transformationContainer, true); + }, }); } -function doSideBySideTransformations(scene: BattleScene, transformations: PokemonTransformation[]) { +function doSideBySideTransformations(transformations: PokemonTransformation[]) { return new Promise(resolve => { const allTransformationPromises: Promise[] = []; for (let i = 0; i < 3; i++) { const delay = i * 4000; - scene.time.delayedCall(delay, () => { + globalScene.time.delayedCall(delay, () => { const transformation = transformations[i]; const pokemon1 = transformation.previousPokemon; const pokemon2 = transformation.newPokemon; const screenPosition = i as TransformationScreenPosition; - const transformationPromise = doPokemonTransformationSequence(scene, pokemon1, pokemon2, screenPosition) - .then(() => { - if (transformations.length > i + 3) { - const nextTransformationAtPosition = transformations[i + 3]; - const nextPokemon1 = nextTransformationAtPosition.previousPokemon; - const nextPokemon2 = nextTransformationAtPosition.newPokemon; + const transformationPromise = doPokemonTransformationSequence(pokemon1, pokemon2, screenPosition).then(() => { + if (transformations.length > i + 3) { + const nextTransformationAtPosition = transformations[i + 3]; + const nextPokemon1 = nextTransformationAtPosition.previousPokemon; + const nextPokemon2 = nextTransformationAtPosition.newPokemon; - allTransformationPromises.push(doPokemonTransformationSequence(scene, nextPokemon1, nextPokemon2, screenPosition)); - } - }); + allTransformationPromises.push(doPokemonTransformationSequence(nextPokemon1, nextPokemon2, screenPosition)); + } + }); allTransformationPromises.push(transformationPromise); }); } @@ -681,15 +766,18 @@ function doSideBySideTransformations(scene: BattleScene, transformations: Pokemo /** * Returns index of the new egg move within the Pokemon's moveset (not the index of the move in `speciesEggMoves`) - * @param scene * @param newPokemon * @param speciesRootForm */ -async function addEggMoveToNewPokemonMoveset(scene: BattleScene, newPokemon: PlayerPokemon, speciesRootForm: Species, forBattle: boolean = false): Promise { +async function addEggMoveToNewPokemonMoveset( + newPokemon: PlayerPokemon, + speciesRootForm: Species, + forBattle = false, +): Promise { let eggMoveIndex: null | number = null; const eggMoves = newPokemon.getEggMoves()?.slice(0); if (eggMoves) { - const eggMoveIndices = randSeedShuffle([ 0, 1, 2, 3 ]); + const eggMoveIndices = randSeedShuffle([0, 1, 2, 3]); let randomEggMoveIndex = eggMoveIndices.pop(); let randomEggMove = !isNullOrUndefined(randomEggMoveIndex) ? eggMoves[randomEggMoveIndex] : null; let retries = 0; @@ -711,8 +799,12 @@ async function addEggMoveToNewPokemonMoveset(scene: BattleScene, newPokemon: Pla } // For pokemon that the player owns (including ones just caught), unlock the egg move - if (!forBattle && !isNullOrUndefined(randomEggMoveIndex) && !!scene.gameData.dexData[speciesRootForm].caughtAttr) { - await scene.gameData.setEggMoveUnlocked(getPokemonSpecies(speciesRootForm), randomEggMoveIndex, true); + if ( + !forBattle && + !isNullOrUndefined(randomEggMoveIndex) && + !!globalScene.gameData.dexData[speciesRootForm].caughtAttr + ) { + await globalScene.gameData.setEggMoveUnlocked(getPokemonSpecies(speciesRootForm), randomEggMoveIndex, true); } } } @@ -726,11 +818,18 @@ async function addEggMoveToNewPokemonMoveset(scene: BattleScene, newPokemon: Pla * @param newPokemonGeneratedMoveset * @param newEggMoveIndex */ -function addFavoredMoveToNewPokemonMoveset(newPokemon: PlayerPokemon, newPokemonGeneratedMoveset: (PokemonMove | null)[], newEggMoveIndex: number | null) { +function addFavoredMoveToNewPokemonMoveset( + newPokemon: PlayerPokemon, + newPokemonGeneratedMoveset: (PokemonMove | null)[], + newEggMoveIndex: number | null, +) { let favoredMove: PokemonMove | null = null; for (const move of newPokemonGeneratedMoveset) { // Needs to match first type, second type will be replaced - if (move?.getMove().type === newPokemon.getTypes()[0] && !newPokemon.moveset.some(m => m?.moveId === move?.moveId)) { + if ( + move?.getMove().type === newPokemon.getTypes()[0] && + !newPokemon.moveset.some(m => m?.moveId === move?.moveId) + ) { favoredMove = move; break; } diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index e0ba8512d34..71e1b382f61 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,4 +1,4 @@ -import { TextStyle } from "#app/ui/text"; +import type { TextStyle } from "#app/ui/text"; export class TextDisplay { speaker?: string; @@ -72,4 +72,3 @@ export default class MysteryEncounterDialogue { encounterOptionsDialogue?: EncounterOptionsDialogue; outro?: TextDisplay[]; } - diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index ffae71b9555..f360658c2dc 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -1,15 +1,22 @@ -import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; -import { Moves } from "#app/enums/moves"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import BattleScene from "#app/battle-scene"; -import { Type } from "../type"; -import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement, TypeRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { CanLearnMoveRequirement, CanLearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; +import type { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; +import type { Moves } from "#app/enums/moves"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { globalScene } from "#app/global-scene"; +import type { PokemonType } from "#enums/pokemon-type"; +import { + EncounterPokemonRequirement, + EncounterSceneRequirement, + MoneyRequirement, + TypeRequirement, +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import type { CanLearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; +import { CanLearnMoveRequirement } from "./requirements/can-learn-move-requirement"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; - -export type OptionPhaseCallback = (scene: BattleScene) => Promise; +// biome-ignore lint/suspicious/noConfusingVoidType: void unions in callbacks are OK +export type OptionPhaseCallback = () => Promise; /** * Used by {@linkcode MysteryEncounterOptionBuilder} class to define required/optional properties on the {@linkcode MysteryEncounterOption} class when building. @@ -69,26 +76,36 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { * Returns true if option contains any {@linkcode EncounterRequirement}s, false otherwise. */ hasRequirements(): boolean { - return this.requirements.length > 0 || this.primaryPokemonRequirements.length > 0 || this.secondaryPokemonRequirements.length > 0; + return ( + this.requirements.length > 0 || + this.primaryPokemonRequirements.length > 0 || + this.secondaryPokemonRequirements.length > 0 + ); } /** * Returns true if all {@linkcode EncounterRequirement}s for the option are met - * @param scene */ - meetsRequirements(scene: BattleScene): boolean { - return !this.requirements.some(requirement => !requirement.meetsRequirement(scene)) - && this.meetsSupportingRequirementAndSupportingPokemonSelected(scene) - && this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene); + meetsRequirements(): boolean { + return ( + !this.requirements.some(requirement => !requirement.meetsRequirement()) && + this.meetsSupportingRequirementAndSupportingPokemonSelected() && + this.meetsPrimaryRequirementAndPrimaryPokemonSelected() + ); } /** * Returns true if all PRIMARY {@linkcode EncounterRequirement}s for the option are met - * @param scene * @param pokemon */ - pokemonMeetsPrimaryRequirements(scene: BattleScene, pokemon: Pokemon): boolean { - return !this.primaryPokemonRequirements.some(req => !req.queryParty(scene.getParty()).map(p => p.id).includes(pokemon.id)); + pokemonMeetsPrimaryRequirements(pokemon: Pokemon): boolean { + return !this.primaryPokemonRequirements.some( + req => + !req + .queryParty(globalScene.getPlayerParty()) + .map(p => p.id) + .includes(pokemon.id), + ); } /** @@ -96,16 +113,15 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { * AND there is a valid Pokemon assigned to {@linkcode primaryPokemon}. * If both {@linkcode primaryPokemonRequirements} and {@linkcode secondaryPokemonRequirements} are defined, * can cause scenarios where there are not enough Pokemon that are sufficient for all requirements. - * @param scene */ - meetsPrimaryRequirementAndPrimaryPokemonSelected(scene: BattleScene): boolean { + meetsPrimaryRequirementAndPrimaryPokemonSelected(): boolean { if (!this.primaryPokemonRequirements || this.primaryPokemonRequirements.length === 0) { return true; } - let qualified: PlayerPokemon[] = scene.getParty(); + let qualified: PlayerPokemon[] = globalScene.getPlayerParty(); for (const req of this.primaryPokemonRequirements) { - if (req.meetsRequirement(scene)) { - const queryParty = req.queryParty(scene.getParty()); + if (req.meetsRequirement()) { + const queryParty = req.queryParty(globalScene.getPlayerParty()); qualified = qualified.filter(pkmn => queryParty.includes(pkmn)); } else { this.primaryPokemon = undefined; @@ -126,27 +142,26 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { } else { overlap.push(qp); } - } if (truePrimaryPool.length > 0) { // always choose from the non-overlapping pokemon first this.primaryPokemon = truePrimaryPool[randSeedInt(truePrimaryPool.length)]; return true; - } else { - // if there are multiple overlapping pokemon, we're okay - just choose one and take it out of the supporting pokemon pool - if (overlap.length > 1 || (this.secondaryPokemon.length - overlap.length >= 1)) { - this.primaryPokemon = overlap[randSeedInt(overlap.length)]; - this.secondaryPokemon = this.secondaryPokemon.filter((supp) => supp !== this.primaryPokemon); - return true; - } - console.log("Mystery Encounter Edge Case: Requirement not met due to primay pokemon overlapping with support pokemon. There's no valid primary pokemon left."); - return false; } - } else { - // Just pick the first qualifying Pokemon - this.primaryPokemon = qualified[0]; - return true; + // if there are multiple overlapping pokemon, we're okay - just choose one and take it out of the supporting pokemon pool + if (overlap.length > 1 || this.secondaryPokemon.length - overlap.length >= 1) { + this.primaryPokemon = overlap[randSeedInt(overlap.length)]; + this.secondaryPokemon = this.secondaryPokemon.filter(supp => supp !== this.primaryPokemon); + return true; + } + console.log( + "Mystery Encounter Edge Case: Requirement not met due to primay pokemon overlapping with support pokemon. There's no valid primary pokemon left.", + ); + return false; } + // Just pick the first qualifying Pokemon + this.primaryPokemon = qualified[0]; + return true; } /** @@ -154,18 +169,17 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { * AND there is a valid Pokemon assigned to {@linkcode secondaryPokemon} (if applicable). * If both {@linkcode primaryPokemonRequirements} and {@linkcode secondaryPokemonRequirements} are defined, * can cause scenarios where there are not enough Pokemon that are sufficient for all requirements. - * @param scene */ - meetsSupportingRequirementAndSupportingPokemonSelected(scene: BattleScene): boolean { + meetsSupportingRequirementAndSupportingPokemonSelected(): boolean { if (!this.secondaryPokemonRequirements || this.secondaryPokemonRequirements.length === 0) { this.secondaryPokemon = []; return true; } - let qualified: PlayerPokemon[] = scene.getParty(); + let qualified: PlayerPokemon[] = globalScene.getPlayerParty(); for (const req of this.secondaryPokemonRequirements) { - if (req.meetsRequirement(scene)) { - const queryParty = req.queryParty(scene.getParty()); + if (req.meetsRequirement()) { + const queryParty = req.queryParty(globalScene.getPlayerParty()); qualified = qualified.filter(pkmn => queryParty.includes(pkmn)); } else { this.secondaryPokemon = []; @@ -182,12 +196,14 @@ export class MysteryEncounterOptionBuilder implements Partial { + static newOptionWithMode( + optionMode: MysteryEncounterOptionMode, + ): MysteryEncounterOptionBuilder & Pick { return Object.assign(new MysteryEncounterOptionBuilder(), { optionMode }); } @@ -199,7 +215,9 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withSceneRequirement( + requirement: EncounterSceneRequirement, + ): this & Required> { if (requirement instanceof EncounterPokemonRequirement) { Error("Incorrectly added pokemon requirement as scene requirement."); } @@ -218,7 +236,9 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withPreOptionPhase( + onPreOptionPhase: OptionPhaseCallback, + ): this & Required> { return Object.assign(this, { onPreOptionPhase: onPreOptionPhase }); } @@ -230,7 +250,9 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withPostOptionPhase( + onPostOptionPhase: OptionPhaseCallback, + ): this & Required> { return Object.assign(this, { onPostOptionPhase: onPostOptionPhase }); } @@ -238,13 +260,17 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withPrimaryPokemonRequirement( + requirement: EncounterPokemonRequirement, + ): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } this.primaryPokemonRequirements.push(requirement); - return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); + return Object.assign(this, { + primaryPokemonRequirements: this.primaryPokemonRequirements, + }); } /** @@ -256,8 +282,15 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withSecondaryPokemonRequirement( + requirement: EncounterPokemonRequirement, + excludePrimaryFromSecondaryRequirements = true, + ): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSecondaryRequirements = excludePrimaryFromSecondaryRequirements; - return Object.assign(this, { secondaryPokemonRequirements: this.secondaryPokemonRequirements }); + return Object.assign(this, { + secondaryPokemonRequirements: this.secondaryPokemonRequirements, + }); } /** diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 91ea0c5be19..e9398547740 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -1,40 +1,38 @@ -import { PlayerPokemon } from "#app/field/pokemon"; -import BattleScene from "#app/battle-scene"; -import { isNullOrUndefined } from "#app/utils"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import { TimeOfDay } from "#enums/time-of-day"; -import { Nature } from "#app/data/nature"; -import { EvolutionItem, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; -import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; -import { StatusEffect } from "#app/data/status-effect"; -import { Type } from "#app/data/type"; -import { WeatherType } from "#app/data/weather"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { AttackTypeBoosterModifier } from "#app/modifier/modifier"; -import { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type"; -import { SpeciesFormKey } from "#enums/species-form-key"; +import { globalScene } from "#app/global-scene"; import { allAbilities } from "#app/data/ability"; +import { EvolutionItem, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; +import { Nature } from "#enums/nature"; +import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; +import { StatusEffect } from "#enums/status-effect"; +import { PokemonType } from "#enums/pokemon-type"; +import { WeatherType } from "#enums/weather-type"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import { AttackTypeBoosterModifier } from "#app/modifier/modifier"; +import type { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type"; +import { isNullOrUndefined } from "#app/utils"; +import type { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import { SpeciesFormKey } from "#enums/species-form-key"; +import { TimeOfDay } from "#enums/time-of-day"; export interface EncounterRequirement { - meetsRequirement(scene: BattleScene): boolean; // Boolean to see if a requirement is met - getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string]; + meetsRequirement(): boolean; // Boolean to see if a requirement is met + getDialogueToken(pokemon?: PlayerPokemon): [string, string]; } export abstract class EncounterSceneRequirement implements EncounterRequirement { /** * Returns whether the EncounterSceneRequirement's... requirements, are met by the given scene - * @param partyPokemon */ - abstract meetsRequirement(scene: BattleScene): boolean; + abstract meetsRequirement(): boolean; /** * Returns a dialogue token key/value pair for a given Requirement. * Should be overridden by child Requirement classes. - * @param scene * @param pokemon */ - abstract getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string]; + abstract getDialogueToken(pokemon?: PlayerPokemon): [string, string]; } /** @@ -61,34 +59,31 @@ export class CombinationSceneRequirement extends EncounterSceneRequirement { /** * Checks if all/any requirements are met (depends on {@linkcode isAnd}) - * @param scene The {@linkcode BattleScene} to check against * @returns true if all/any requirements are met (depends on {@linkcode isAnd}) */ - override meetsRequirement(scene: BattleScene): boolean { + override meetsRequirement(): boolean { return this.isAnd - ? this.requirements.every(req => req.meetsRequirement(scene)) - : this.requirements.some(req => req.meetsRequirement(scene)); + ? this.requirements.every(req => req.meetsRequirement()) + : this.requirements.some(req => req.meetsRequirement()); } /** * Retrieves a dialogue token key/value pair for the given {@linkcode EncounterSceneRequirement | requirements}. - * @param scene The {@linkcode BattleScene} to check against * @param pokemon The {@linkcode PlayerPokemon} to check against * @returns A dialogue token key/value pair * @throws An {@linkcode Error} if {@linkcode isAnd} is `true` (not supported) */ - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { if (this.isAnd) { throw new Error("Not implemented (Sorry)"); - } else { - for (const req of this.requirements) { - if (req.meetsRequirement(scene)) { - return req.getDialogueToken(scene, pokemon); - } - } - - return this.requirements[0].getDialogueToken(scene, pokemon); } + for (const req of this.requirements) { + if (req.meetsRequirement()) { + return req.getDialogueToken(pokemon); + } + } + + return this.requirements[0].getDialogueToken(pokemon); } } @@ -98,9 +93,8 @@ export abstract class EncounterPokemonRequirement implements EncounterRequiremen /** * Returns whether the EncounterPokemonRequirement's... requirements, are met by the given scene - * @param partyPokemon */ - abstract meetsRequirement(scene: BattleScene): boolean; + abstract meetsRequirement(): boolean; /** * Returns all party members that are compatible with this requirement. For non pokemon related requirements, the entire party is returned. @@ -111,10 +105,9 @@ export abstract class EncounterPokemonRequirement implements EncounterRequiremen /** * Returns a dialogue token key/value pair for a given Requirement. * Should be overridden by child Requirement classes. - * @param scene * @param pokemon */ - abstract getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string]; + abstract getDialogueToken(pokemon?: PlayerPokemon): [string, string]; } /** @@ -143,13 +136,12 @@ export class CombinationPokemonRequirement extends EncounterPokemonRequirement { /** * Checks if all/any requirements are met (depends on {@linkcode isAnd}) - * @param scene The {@linkcode BattleScene} to check against * @returns true if all/any requirements are met (depends on {@linkcode isAnd}) */ - override meetsRequirement(scene: BattleScene): boolean { + override meetsRequirement(): boolean { return this.isAnd - ? this.requirements.every(req => req.meetsRequirement(scene)) - : this.requirements.some(req => req.meetsRequirement(scene)); + ? this.requirements.every(req => req.meetsRequirement()) + : this.requirements.some(req => req.meetsRequirement()); } /** @@ -160,31 +152,28 @@ export class CombinationPokemonRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (this.isAnd) { return this.requirements.reduce((relevantPokemon, req) => req.queryParty(relevantPokemon), partyPokemon); - } else { - const matchingRequirement = this.requirements.find(req => req.queryParty(partyPokemon).length > 0); - return matchingRequirement ? matchingRequirement.queryParty(partyPokemon) : []; } + const matchingRequirement = this.requirements.find(req => req.queryParty(partyPokemon).length > 0); + return matchingRequirement ? matchingRequirement.queryParty(partyPokemon) : []; } /** * Retrieves a dialogue token key/value pair for the given {@linkcode EncounterPokemonRequirement | requirements}. - * @param scene The {@linkcode BattleScene} to check against * @param pokemon The {@linkcode PlayerPokemon} to check against * @returns A dialogue token key/value pair * @throws An {@linkcode Error} if {@linkcode isAnd} is `true` (not supported) */ - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { if (this.isAnd) { throw new Error("Not implemented (Sorry)"); - } else { - for (const req of this.requirements) { - if (req.meetsRequirement(scene)) { - return req.getDialogueToken(scene, pokemon); - } - } - - return this.requirements[0].getDialogueToken(scene, pokemon); } + for (const req of this.requirements) { + if (req.meetsRequirement()) { + return req.getDialogueToken(pokemon); + } + } + + return this.requirements[0].getDialogueToken(pokemon); } } @@ -200,12 +189,19 @@ export class PreviousEncounterRequirement extends EncounterSceneRequirement { this.previousEncounterRequirement = previousEncounterRequirement; } - override meetsRequirement(scene: BattleScene): boolean { - return scene.mysteryEncounterSaveData.encounteredEvents.some(e => e.type === this.previousEncounterRequirement); + override meetsRequirement(): boolean { + return globalScene.mysteryEncounterSaveData.encounteredEvents.some( + e => e.type === this.previousEncounterRequirement, + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return [ "previousEncounter", scene.mysteryEncounterSaveData.encounteredEvents.find(e => e.type === this.previousEncounterRequirement)?.[0].toString() ?? "" ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return [ + "previousEncounter", + globalScene.mysteryEncounterSaveData.encounteredEvents + .find(e => e.type === this.previousEncounterRequirement)?.[0] + .toString() ?? "", + ]; } } @@ -222,18 +218,21 @@ export class WaveRangeRequirement extends EncounterSceneRequirement { this.waveRange = waveRange; } - override meetsRequirement(scene: BattleScene): boolean { + override meetsRequirement(): boolean { if (!isNullOrUndefined(this.waveRange) && this.waveRange[0] <= this.waveRange[1]) { - const waveIndex = scene.currentBattle.waveIndex; - if (waveIndex >= 0 && (this.waveRange[0] >= 0 && this.waveRange[0] > waveIndex) || (this.waveRange[1] >= 0 && this.waveRange[1] < waveIndex)) { + const waveIndex = globalScene.currentBattle.waveIndex; + if ( + (waveIndex >= 0 && this.waveRange[0] >= 0 && this.waveRange[0] > waveIndex) || + (this.waveRange[1] >= 0 && this.waveRange[1] < waveIndex) + ) { return false; } } return true; } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return [ "waveIndex", scene.currentBattle.waveIndex.toString() ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["waveIndex", globalScene.currentBattle.waveIndex.toString()]; } } @@ -257,12 +256,12 @@ export class WaveModulusRequirement extends EncounterSceneRequirement { this.modulusValue = modulusValue; } - override meetsRequirement(scene: BattleScene): boolean { - return this.waveModuli.includes(scene.currentBattle.waveIndex % this.modulusValue); + override meetsRequirement(): boolean { + return this.waveModuli.includes(globalScene.currentBattle.waveIndex % this.modulusValue); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return [ "waveIndex", scene.currentBattle.waveIndex.toString() ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["waveIndex", globalScene.currentBattle.waveIndex.toString()]; } } @@ -271,20 +270,24 @@ export class TimeOfDayRequirement extends EncounterSceneRequirement { constructor(timeOfDay: TimeOfDay | TimeOfDay[]) { super(); - this.requiredTimeOfDay = Array.isArray(timeOfDay) ? timeOfDay : [ timeOfDay ]; + this.requiredTimeOfDay = Array.isArray(timeOfDay) ? timeOfDay : [timeOfDay]; } - override meetsRequirement(scene: BattleScene): boolean { - const timeOfDay = scene.arena?.getTimeOfDay(); - if (!isNullOrUndefined(timeOfDay) && this.requiredTimeOfDay?.length > 0 && !this.requiredTimeOfDay.includes(timeOfDay)) { + override meetsRequirement(): boolean { + const timeOfDay = globalScene.arena?.getTimeOfDay(); + if ( + !isNullOrUndefined(timeOfDay) && + this.requiredTimeOfDay?.length > 0 && + !this.requiredTimeOfDay.includes(timeOfDay) + ) { return false; } return true; } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return [ "timeOfDay", TimeOfDay[scene.arena.getTimeOfDay()].toLocaleLowerCase() ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["timeOfDay", TimeOfDay[globalScene.arena.getTimeOfDay()].toLocaleLowerCase()]; } } @@ -293,25 +296,29 @@ export class WeatherRequirement extends EncounterSceneRequirement { constructor(weather: WeatherType | WeatherType[]) { super(); - this.requiredWeather = Array.isArray(weather) ? weather : [ weather ]; + this.requiredWeather = Array.isArray(weather) ? weather : [weather]; } - override meetsRequirement(scene: BattleScene): boolean { - const currentWeather = scene.arena.weather?.weatherType; - if (!isNullOrUndefined(currentWeather) && this.requiredWeather?.length > 0 && !this.requiredWeather.includes(currentWeather!)) { + override meetsRequirement(): boolean { + const currentWeather = globalScene.arena.weather?.weatherType; + if ( + !isNullOrUndefined(currentWeather) && + this.requiredWeather?.length > 0 && + !this.requiredWeather.includes(currentWeather!) + ) { return false; } return true; } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const currentWeather = scene.arena.weather?.weatherType; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + const currentWeather = globalScene.arena.weather?.weatherType; let token = ""; if (!isNullOrUndefined(currentWeather)) { token = WeatherType[currentWeather].replace("_", " ").toLocaleLowerCase(); } - return [ "weather", token ]; + return ["weather", token]; } } @@ -331,10 +338,15 @@ export class PartySizeRequirement extends EncounterSceneRequirement { this.excludeDisallowedPokemon = excludeDisallowedPokemon; } - override meetsRequirement(scene: BattleScene): boolean { + override meetsRequirement(): boolean { if (!isNullOrUndefined(this.partySizeRange) && this.partySizeRange[0] <= this.partySizeRange[1]) { - const partySize = this.excludeDisallowedPokemon ? scene.getParty().filter(p => p.isAllowedInBattle()).length : scene.getParty().length; - if (partySize >= 0 && (this.partySizeRange[0] >= 0 && this.partySizeRange[0] > partySize) || (this.partySizeRange[1] >= 0 && this.partySizeRange[1] < partySize)) { + const partySize = this.excludeDisallowedPokemon + ? globalScene.getPokemonAllowedInBattle().length + : globalScene.getPlayerParty().length; + if ( + (partySize >= 0 && this.partySizeRange[0] >= 0 && this.partySizeRange[0] > partySize) || + (this.partySizeRange[1] >= 0 && this.partySizeRange[1] < partySize) + ) { return false; } } @@ -342,8 +354,8 @@ export class PartySizeRequirement extends EncounterSceneRequirement { return true; } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return [ "partySize", scene.getParty().length.toString() ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["partySize", globalScene.getPlayerParty().length.toString()]; } } @@ -351,32 +363,32 @@ export class PersistentModifierRequirement extends EncounterSceneRequirement { requiredHeldItemModifiers: string[]; minNumberOfItems: number; - constructor(heldItem: string | string[], minNumberOfItems: number = 1) { + constructor(heldItem: string | string[], minNumberOfItems = 1) { super(); this.minNumberOfItems = minNumberOfItems; - this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [ heldItem ]; + this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [heldItem]; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon) || this.requiredHeldItemModifiers?.length < 0) { return false; } let modifierCount = 0; - this.requiredHeldItemModifiers.forEach(modifier => { - const matchingMods = scene.findModifiers(m => m.constructor.name === modifier); + for (const modifier of this.requiredHeldItemModifiers) { + const matchingMods = globalScene.findModifiers(m => m.constructor.name === modifier); if (matchingMods?.length > 0) { - matchingMods.forEach(matchingMod => { + for (const matchingMod of matchingMods) { modifierCount += matchingMod.stackCount; - }); + } } - }); + } return modifierCount >= this.minNumberOfItems; } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return [ "requiredItem", this.requiredHeldItemModifiers[0] ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + return ["requiredItem", this.requiredHeldItemModifiers[0]]; } } @@ -390,21 +402,24 @@ export class MoneyRequirement extends EncounterSceneRequirement { this.scalingMultiplier = scalingMultiplier ?? 0; } - override meetsRequirement(scene: BattleScene): boolean { - const money = scene.money; + override meetsRequirement(): boolean { + const money = globalScene.money; if (isNullOrUndefined(money)) { return false; } if (this.scalingMultiplier > 0) { - this.requiredMoney = scene.getWaveMoneyAmount(this.scalingMultiplier); + this.requiredMoney = globalScene.getWaveMoneyAmount(this.scalingMultiplier); } return !(this.requiredMoney > 0 && this.requiredMoney > money); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const value = this.scalingMultiplier > 0 ? scene.getWaveMoneyAmount(this.scalingMultiplier).toString() : this.requiredMoney.toString(); - return [ "money", value ]; + override getDialogueToken(_pokemon?: PlayerPokemon): [string, string] { + const value = + this.scalingMultiplier > 0 + ? globalScene.getWaveMoneyAmount(this.scalingMultiplier).toString() + : this.requiredMoney.toString(); + return ["money", value]; } } @@ -413,15 +428,15 @@ export class SpeciesRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(species: Species | Species[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(species: Species | Species[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredSpecies = Array.isArray(species) ? species : [ species ]; + this.requiredSpecies = Array.isArray(species) ? species : [species]; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon) || this.requiredSpecies?.length < 0) { return false; } @@ -430,36 +445,38 @@ export class SpeciesRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredSpecies.filter((species) => pokemon.species.speciesId === species).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed speciess - return partyPokemon.filter((pokemon) => this.requiredSpecies.filter((species) => pokemon.species.speciesId === species).length === 0); + return partyPokemon.filter( + pokemon => this.requiredSpecies.filter(species => pokemon.species.speciesId === species).length > 0, + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed speciess + return partyPokemon.filter( + pokemon => this.requiredSpecies.filter(species => pokemon.species.speciesId === species).length === 0, + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { if (pokemon?.species.speciesId && this.requiredSpecies.includes(pokemon.species.speciesId)) { - return [ "species", Species[pokemon.species.speciesId] ]; + return ["species", Species[pokemon.species.speciesId]]; } - return [ "species", "" ]; + return ["species", ""]; } } - export class NatureRequirement extends EncounterPokemonRequirement { requiredNature: Nature[]; minNumberOfPokemon: number; invertQuery: boolean; - constructor(nature: Nature | Nature[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(nature: Nature | Nature[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredNature = Array.isArray(nature) ? nature : [ nature ]; + this.requiredNature = Array.isArray(nature) ? nature : [nature]; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon) || this.requiredNature?.length < 0) { return false; } @@ -468,44 +485,43 @@ export class NatureRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredNature.filter((nature) => pokemon.nature === nature).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed natures - return partyPokemon.filter((pokemon) => this.requiredNature.filter((nature) => pokemon.nature === nature).length === 0); + return partyPokemon.filter(pokemon => this.requiredNature.filter(nature => pokemon.nature === nature).length > 0); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed natures + return partyPokemon.filter(pokemon => this.requiredNature.filter(nature => pokemon.nature === nature).length === 0); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { if (!isNullOrUndefined(pokemon?.nature) && this.requiredNature.includes(pokemon.nature)) { - return [ "nature", Nature[pokemon.nature] ]; + return ["nature", Nature[pokemon.nature]]; } - return [ "nature", "" ]; + return ["nature", ""]; } } export class TypeRequirement extends EncounterPokemonRequirement { - requiredType: Type[]; + requiredType: PokemonType[]; excludeFainted: boolean; minNumberOfPokemon: number; invertQuery: boolean; - constructor(type: Type | Type[], excludeFainted: boolean = true, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(type: PokemonType | PokemonType[], excludeFainted = true, minNumberOfPokemon = 1, invertQuery = false) { super(); this.excludeFainted = excludeFainted; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredType = Array.isArray(type) ? type : [ type ]; + this.requiredType = Array.isArray(type) ? type : [type]; } - override meetsRequirement(scene: BattleScene): boolean { - let partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + let partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon)) { return false; } if (this.excludeFainted) { - partyPokemon = partyPokemon.filter((pokemon) => !pokemon.isFainted()); + partyPokemon = partyPokemon.filter(pokemon => !pokemon.isFainted()); } return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; @@ -513,39 +529,41 @@ export class TypeRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredType.filter((type) => pokemon.getTypes().includes(type)).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed types - return partyPokemon.filter((pokemon) => this.requiredType.filter((type) => pokemon.getTypes().includes(type)).length === 0); + return partyPokemon.filter( + pokemon => this.requiredType.filter(type => pokemon.getTypes().includes(type)).length > 0, + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed types + return partyPokemon.filter( + pokemon => this.requiredType.filter(type => pokemon.getTypes().includes(type)).length === 0, + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const includedTypes = this.requiredType.filter((ty) => pokemon?.getTypes().includes(ty)); + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + const includedTypes = this.requiredType.filter(ty => pokemon?.getTypes().includes(ty)); if (includedTypes.length > 0) { - return [ "type", Type[includedTypes[0]] ]; + return ["type", PokemonType[includedTypes[0]]]; } - return [ "type", "" ]; + return ["type", ""]; } } - export class MoveRequirement extends EncounterPokemonRequirement { requiredMoves: Moves[] = []; minNumberOfPokemon: number; invertQuery: boolean; excludeDisallowedPokemon: boolean; - constructor(moves: Moves | Moves[], excludeDisallowedPokemon: boolean, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(moves: Moves | Moves[], excludeDisallowedPokemon: boolean, minNumberOfPokemon = 1, invertQuery = false) { super(); this.excludeDisallowedPokemon = excludeDisallowedPokemon; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredMoves = Array.isArray(moves) ? moves : [ moves ]; + this.requiredMoves = Array.isArray(moves) ? moves : [moves]; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon) || this.requiredMoves?.length < 0) { return false; } @@ -555,25 +573,27 @@ export class MoveRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { // get the Pokemon with at least one move in the required moves list - return partyPokemon.filter((pokemon) => - (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) - && pokemon.moveset.some((move) => move?.moveId && this.requiredMoves.includes(move.moveId))); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed moves - return partyPokemon.filter((pokemon) => - (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) - && !pokemon.moveset.some((move) => move?.moveId && this.requiredMoves.includes(move.moveId))); + return partyPokemon.filter( + pokemon => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && + pokemon.moveset.some(move => move?.moveId && this.requiredMoves.includes(move.moveId)), + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed moves + return partyPokemon.filter( + pokemon => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && + !pokemon.moveset.some(move => move?.moveId && this.requiredMoves.includes(move.moveId)), + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const includedMoves = pokemon?.moveset.filter((move) => move?.moveId && this.requiredMoves.includes(move.moveId)); + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + const includedMoves = pokemon?.moveset.filter(move => move?.moveId && this.requiredMoves.includes(move.moveId)); if (includedMoves && includedMoves.length > 0 && includedMoves[0]) { - return [ "move", includedMoves[0].getName() ]; + return ["move", includedMoves[0].getName()]; } - return [ "move", "" ]; + return ["move", ""]; } - } /** @@ -586,15 +606,15 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(learnableMove: Moves | Moves[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(learnableMove: Moves | Moves[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredMoves = Array.isArray(learnableMove) ? learnableMove : [ learnableMove ]; + this.requiredMoves = Array.isArray(learnableMove) ? learnableMove : [learnableMove]; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon) || this.requiredMoves?.length < 0) { return false; } @@ -603,21 +623,31 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove)).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed learnableMoves - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove)).length === 0); + return partyPokemon.filter( + pokemon => + this.requiredMoves.filter(learnableMove => + pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove), + ).length > 0, + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed learnableMoves + return partyPokemon.filter( + pokemon => + this.requiredMoves.filter(learnableMove => + pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove), + ).length === 0, + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const includedCompatMoves = this.requiredMoves.filter((reqMove) => pokemon?.compatibleTms.filter((tm) => !pokemon.moveset.find(m => m?.moveId === tm)).includes(reqMove)); + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + const includedCompatMoves = this.requiredMoves.filter(reqMove => + pokemon?.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(reqMove), + ); if (includedCompatMoves.length > 0) { - return [ "compatibleMove", Moves[includedCompatMoves[0]] ]; + return ["compatibleMove", Moves[includedCompatMoves[0]]]; } - return [ "compatibleMove", "" ]; + return ["compatibleMove", ""]; } - } export class AbilityRequirement extends EncounterPokemonRequirement { @@ -626,16 +656,21 @@ export class AbilityRequirement extends EncounterPokemonRequirement { invertQuery: boolean; excludeDisallowedPokemon: boolean; - constructor(abilities: Abilities | Abilities[], excludeDisallowedPokemon: boolean, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor( + abilities: Abilities | Abilities[], + excludeDisallowedPokemon: boolean, + minNumberOfPokemon = 1, + invertQuery = false, + ) { super(); this.excludeDisallowedPokemon = excludeDisallowedPokemon; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredAbilities = Array.isArray(abilities) ? abilities : [ abilities ]; + this.requiredAbilities = Array.isArray(abilities) ? abilities : [abilities]; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon) || this.requiredAbilities?.length < 0) { return false; } @@ -644,23 +679,26 @@ export class AbilityRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => - (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) - && this.requiredAbilities.some((ability) => pokemon.hasAbility(ability, false))); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilities - return partyPokemon.filter((pokemon) => - (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) - && this.requiredAbilities.filter((ability) => pokemon.hasAbility(ability, false)).length === 0); + return partyPokemon.filter( + pokemon => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && + this.requiredAbilities.some(ability => pokemon.hasAbility(ability, false)), + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilities + return partyPokemon.filter( + pokemon => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) && + this.requiredAbilities.filter(ability => pokemon.hasAbility(ability, false)).length === 0, + ); } - override getDialogueToken(_scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { const matchingAbility = this.requiredAbilities.find(a => pokemon?.hasAbility(a, false)); if (!isNullOrUndefined(matchingAbility)) { - return [ "ability", allAbilities[matchingAbility].name ]; + return ["ability", allAbilities[matchingAbility].name]; } - return [ "ability", "" ]; + return ["ability", ""]; } } @@ -669,15 +707,15 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredStatusEffect = Array.isArray(statusEffect) ? statusEffect : [ statusEffect ]; + this.requiredStatusEffect = Array.isArray(statusEffect) ? statusEffect : [statusEffect]; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon) || this.requiredStatusEffect?.length < 0) { return false; } @@ -688,44 +726,50 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => { - return this.requiredStatusEffect.some((statusEffect) => { + return partyPokemon.filter(pokemon => { + return this.requiredStatusEffect.some(statusEffect => { if (statusEffect === StatusEffect.NONE) { // StatusEffect.NONE also checks for null or undefined status - return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === statusEffect; - } else { - return pokemon.status?.effect === statusEffect; - } - }); - }); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed StatusEffects - return partyPokemon.filter((pokemon) => { - return !this.requiredStatusEffect.some((statusEffect) => { - if (statusEffect === StatusEffect.NONE) { - // StatusEffect.NONE also checks for null or undefined status - return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === statusEffect; - } else { - return pokemon.status?.effect === statusEffect; + return ( + isNullOrUndefined(pokemon.status) || + isNullOrUndefined(pokemon.status.effect) || + pokemon.status.effect === statusEffect + ); } + return pokemon.status?.effect === statusEffect; }); }); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed StatusEffects + return partyPokemon.filter(pokemon => { + return !this.requiredStatusEffect.some(statusEffect => { + if (statusEffect === StatusEffect.NONE) { + // StatusEffect.NONE also checks for null or undefined status + return ( + isNullOrUndefined(pokemon.status) || + isNullOrUndefined(pokemon.status.effect) || + pokemon.status.effect === statusEffect + ); + } + return pokemon.status?.effect === statusEffect; + }); + }); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const reqStatus = this.requiredStatusEffect.filter((a) => { + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + const reqStatus = this.requiredStatusEffect.filter(a => { if (a === StatusEffect.NONE) { - return isNullOrUndefined(pokemon?.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === a; + return ( + isNullOrUndefined(pokemon?.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === a + ); } return pokemon!.status?.effect === a; }); if (reqStatus.length > 0) { - return [ "status", StatusEffect[reqStatus[0]] ]; + return ["status", StatusEffect[reqStatus[0]]]; } - return [ "status", "" ]; + return ["status", ""]; } - } /** @@ -738,15 +782,15 @@ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequiremen minNumberOfPokemon: number; invertQuery: boolean; - constructor(formChangeItem: FormChangeItem | FormChangeItem[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(formChangeItem: FormChangeItem | FormChangeItem[], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredFormChangeItem = Array.isArray(formChangeItem) ? formChangeItem : [ formChangeItem ]; + this.requiredFormChangeItem = Array.isArray(formChangeItem) ? formChangeItem : [formChangeItem]; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon) || this.requiredFormChangeItem?.length < 0) { return false; } @@ -754,63 +798,16 @@ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequiremen } filterByForm(pokemon, formChangeItem) { - if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) + if ( + pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) && // Get all form changes for this species with an item trigger, including any compound triggers - && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger)) + pokemonFormChanges[pokemon.species.speciesId] + .filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger)) // Returns true if any form changes match this item - .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) - .flat().flatMap(fc => fc.item).includes(formChangeItem)) { - return true; - } else { - return false; - } - } - - override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { - if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed formChangeItems - return partyPokemon.filter((pokemon) => this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)).length === 0); - } - } - - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const requiredItems = this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)); - if (requiredItems.length > 0) { - return [ "formChangeItem", FormChangeItem[requiredItems[0]] ]; - } - return [ "formChangeItem", "" ]; - } - -} - -export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { - requiredEvolutionItem: EvolutionItem[]; - minNumberOfPokemon: number; - invertQuery: boolean; - - constructor(evolutionItems: EvolutionItem | EvolutionItem[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { - super(); - this.minNumberOfPokemon = minNumberOfPokemon; - this.invertQuery = invertQuery; - this.requiredEvolutionItem = Array.isArray(evolutionItems) ? evolutionItems : [ evolutionItems ]; - } - - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); - if (isNullOrUndefined(partyPokemon) || this.requiredEvolutionItem?.length < 0) { - return false; - } - return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; - } - - filterByEvo(pokemon, evolutionItem) { - if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) { - return true; - } else if (pokemon.isFusion() && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + .flatMap(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) + .flatMap(fc => fc.item) + .includes(formChangeItem) + ) { return true; } return false; @@ -818,19 +815,92 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredEvolutionItem.filter((evolutionItem) => this.filterByEvo(pokemon, evolutionItem)).length > 0); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed evolutionItemss - return partyPokemon.filter((pokemon) => this.requiredEvolutionItem.filter((evolutionItems) => this.filterByEvo(pokemon, evolutionItems)).length === 0); + return partyPokemon.filter( + pokemon => + this.requiredFormChangeItem.filter(formChangeItem => this.filterByForm(pokemon, formChangeItem)).length > 0, + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed formChangeItems + return partyPokemon.filter( + pokemon => + this.requiredFormChangeItem.filter(formChangeItem => this.filterByForm(pokemon, formChangeItem)).length === 0, + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const requiredItems = this.requiredEvolutionItem.filter((evoItem) => this.filterByEvo(pokemon, evoItem)); + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + const requiredItems = this.requiredFormChangeItem.filter(formChangeItem => + this.filterByForm(pokemon, formChangeItem), + ); if (requiredItems.length > 0) { - return [ "evolutionItem", EvolutionItem[requiredItems[0]] ]; + return ["formChangeItem", FormChangeItem[requiredItems[0]]]; } - return [ "evolutionItem", "" ]; + return ["formChangeItem", ""]; + } +} + +export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { + requiredEvolutionItem: EvolutionItem[]; + minNumberOfPokemon: number; + invertQuery: boolean; + + constructor(evolutionItems: EvolutionItem | EvolutionItem[], minNumberOfPokemon = 1, invertQuery = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + this.requiredEvolutionItem = Array.isArray(evolutionItems) ? evolutionItems : [evolutionItems]; + } + + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); + if (isNullOrUndefined(partyPokemon) || this.requiredEvolutionItem?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + filterByEvo(pokemon, evolutionItem) { + if ( + pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && + pokemonEvolutions[pokemon.species.speciesId].filter( + e => e.item === evolutionItem && (!e.condition || e.condition.predicate(pokemon)), + ).length && + pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX + ) { + return true; + } + if ( + pokemon.isFusion() && + pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && + pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter( + e => e.item === evolutionItem && (!e.condition || e.condition.predicate(pokemon)), + ).length && + pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX + ) { + return true; + } + return false; + } + + override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter( + pokemon => + this.requiredEvolutionItem.filter(evolutionItem => this.filterByEvo(pokemon, evolutionItem)).length > 0, + ); + } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed evolutionItemss + return partyPokemon.filter( + pokemon => + this.requiredEvolutionItem.filter(evolutionItems => this.filterByEvo(pokemon, evolutionItems)).length === 0, + ); + } + + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + const requiredItems = this.requiredEvolutionItem.filter(evoItem => this.filterByEvo(pokemon, evoItem)); + if (requiredItems.length > 0) { + return ["evolutionItem", EvolutionItem[requiredItems[0]]]; + } + return ["evolutionItem", ""]; } } @@ -840,16 +910,16 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { invertQuery: boolean; requireTransferable: boolean; - constructor(heldItem: string | string[], minNumberOfPokemon: number = 1, invertQuery: boolean = false, requireTransferable: boolean = true) { + constructor(heldItem: string | string[], minNumberOfPokemon = 1, invertQuery = false, requireTransferable = true) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [ heldItem ]; + this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [heldItem]; this.requireTransferable = requireTransferable; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon)) { return false; } @@ -858,49 +928,62 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredHeldItemModifiers.some((heldItem) => { - return pokemon.getHeldItems().some((it) => { - return it.constructor.name === heldItem && (!this.requireTransferable || it.isTransferable); - }); - })); - } else { - // for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers - // E.g. functions as a blacklist - return partyPokemon.filter((pokemon) => pokemon.getHeldItems().filter((it) => { - return !this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem) - && (!this.requireTransferable || it.isTransferable); - }).length > 0); + return partyPokemon.filter(pokemon => + this.requiredHeldItemModifiers.some(heldItem => { + return pokemon.getHeldItems().some(it => { + return it.constructor.name === heldItem && (!this.requireTransferable || it.isTransferable); + }); + }), + ); } + // for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers + // E.g. functions as a blacklist + return partyPokemon.filter( + pokemon => + pokemon.getHeldItems().filter(it => { + return ( + !this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem) && + (!this.requireTransferable || it.isTransferable) + ); + }).length > 0, + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const requiredItems = pokemon?.getHeldItems().filter((it) => { - return this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem) - && (!this.requireTransferable || it.isTransferable); + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + const requiredItems = pokemon?.getHeldItems().filter(it => { + return ( + this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem) && + (!this.requireTransferable || it.isTransferable) + ); }); if (requiredItems && requiredItems.length > 0) { - return [ "heldItem", requiredItems[0].type.name ]; + return ["heldItem", requiredItems[0].type.name]; } - return [ "heldItem", "" ]; + return ["heldItem", ""]; } } export class AttackTypeBoosterHeldItemTypeRequirement extends EncounterPokemonRequirement { - requiredHeldItemTypes: Type[]; + requiredHeldItemTypes: PokemonType[]; minNumberOfPokemon: number; invertQuery: boolean; requireTransferable: boolean; - constructor(heldItemTypes: Type | Type[], minNumberOfPokemon: number = 1, invertQuery: boolean = false, requireTransferable: boolean = true) { + constructor( + heldItemTypes: PokemonType | PokemonType[], + minNumberOfPokemon = 1, + invertQuery = false, + requireTransferable = true, + ) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredHeldItemTypes = Array.isArray(heldItemTypes) ? heldItemTypes : [ heldItemTypes ]; + this.requiredHeldItemTypes = Array.isArray(heldItemTypes) ? heldItemTypes : [heldItemTypes]; this.requireTransferable = requireTransferable; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + override meetsRequirement(): boolean { + const partyPokemon = globalScene.getPlayerParty(); if (isNullOrUndefined(partyPokemon)) { return false; } @@ -909,36 +992,48 @@ export class AttackTypeBoosterHeldItemTypeRequirement extends EncounterPokemonRe override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredHeldItemTypes.some((heldItemType) => { - return pokemon.getHeldItems().some((it) => { - return it instanceof AttackTypeBoosterModifier - && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType - && (!this.requireTransferable || it.isTransferable); - }); - })); - } else { - // for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers - // E.g. functions as a blacklist - return partyPokemon.filter((pokemon) => pokemon.getHeldItems().filter((it) => { - return !this.requiredHeldItemTypes.some(heldItemType => - it instanceof AttackTypeBoosterModifier - && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType - && (!this.requireTransferable || it.isTransferable)); - }).length > 0); + return partyPokemon.filter(pokemon => + this.requiredHeldItemTypes.some(heldItemType => { + return pokemon.getHeldItems().some(it => { + return ( + it instanceof AttackTypeBoosterModifier && + (it.type as AttackTypeBoosterModifierType).moveType === heldItemType && + (!this.requireTransferable || it.isTransferable) + ); + }); + }), + ); } + // for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers + // E.g. functions as a blacklist + return partyPokemon.filter( + pokemon => + pokemon.getHeldItems().filter(it => { + return !this.requiredHeldItemTypes.some( + heldItemType => + it instanceof AttackTypeBoosterModifier && + (it.type as AttackTypeBoosterModifierType).moveType === heldItemType && + (!this.requireTransferable || it.isTransferable), + ); + }).length > 0, + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const requiredItems = pokemon?.getHeldItems().filter((it) => { - return this.requiredHeldItemTypes.some(heldItemType => - it instanceof AttackTypeBoosterModifier - && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType) - && (!this.requireTransferable || it.isTransferable); + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + const requiredItems = pokemon?.getHeldItems().filter(it => { + return ( + this.requiredHeldItemTypes.some( + heldItemType => + it instanceof AttackTypeBoosterModifier && + (it.type as AttackTypeBoosterModifierType).moveType === heldItemType, + ) && + (!this.requireTransferable || it.isTransferable) + ); }); if (requiredItems && requiredItems.length > 0) { - return [ "heldItem", requiredItems[0].type.name ]; + return ["heldItem", requiredItems[0].type.name]; } - return [ "heldItem", "" ]; + return ["heldItem", ""]; } } @@ -947,17 +1042,17 @@ export class LevelRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(requiredLevelRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(requiredLevelRange: [number, number], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; this.requiredLevelRange = requiredLevelRange; } - override meetsRequirement(scene: BattleScene): boolean { + override meetsRequirement(): boolean { // Party Pokemon inside required level range if (!isNullOrUndefined(this.requiredLevelRange) && this.requiredLevelRange[0] <= this.requiredLevelRange[1]) { - const partyPokemon = scene.getParty(); + const partyPokemon = globalScene.getPlayerParty(); const pokemonInRange = this.queryParty(partyPokemon); if (pokemonInRange.length < this.minNumberOfPokemon) { return false; @@ -968,15 +1063,18 @@ export class LevelRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => pokemon.level >= this.requiredLevelRange[0] && pokemon.level <= this.requiredLevelRange[1]); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredLevelRanges - return partyPokemon.filter((pokemon) => pokemon.level < this.requiredLevelRange[0] || pokemon.level > this.requiredLevelRange[1]); + return partyPokemon.filter( + pokemon => pokemon.level >= this.requiredLevelRange[0] && pokemon.level <= this.requiredLevelRange[1], + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredLevelRanges + return partyPokemon.filter( + pokemon => pokemon.level < this.requiredLevelRange[0] || pokemon.level > this.requiredLevelRange[1], + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return [ "level", pokemon?.level.toString() ?? "" ]; + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + return ["level", pokemon?.level.toString() ?? ""]; } } @@ -985,17 +1083,20 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(requiredFriendshipRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(requiredFriendshipRange: [number, number], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; this.requiredFriendshipRange = requiredFriendshipRange; } - override meetsRequirement(scene: BattleScene): boolean { + override meetsRequirement(): boolean { // Party Pokemon inside required friendship range - if (!isNullOrUndefined(this.requiredFriendshipRange) && this.requiredFriendshipRange[0] <= this.requiredFriendshipRange[1]) { - const partyPokemon = scene.getParty(); + if ( + !isNullOrUndefined(this.requiredFriendshipRange) && + this.requiredFriendshipRange[0] <= this.requiredFriendshipRange[1] + ) { + const partyPokemon = globalScene.getPlayerParty(); const pokemonInRange = this.queryParty(partyPokemon); if (pokemonInRange.length < this.minNumberOfPokemon) { return false; @@ -1006,15 +1107,21 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => pokemon.friendship >= this.requiredFriendshipRange[0] && pokemon.friendship <= this.requiredFriendshipRange[1]); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredFriendshipRanges - return partyPokemon.filter((pokemon) => pokemon.friendship < this.requiredFriendshipRange[0] || pokemon.friendship > this.requiredFriendshipRange[1]); + return partyPokemon.filter( + pokemon => + pokemon.friendship >= this.requiredFriendshipRange[0] && + pokemon.friendship <= this.requiredFriendshipRange[1], + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredFriendshipRanges + return partyPokemon.filter( + pokemon => + pokemon.friendship < this.requiredFriendshipRange[0] || pokemon.friendship > this.requiredFriendshipRange[1], + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return [ "friendship", pokemon?.friendship.toString() ?? "" ]; + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + return ["friendship", pokemon?.friendship.toString() ?? ""]; } } @@ -1028,17 +1135,17 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(requiredHealthRange: [number, number], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; this.requiredHealthRange = requiredHealthRange; } - override meetsRequirement(scene: BattleScene): boolean { + override meetsRequirement(): boolean { // Party Pokemon's health inside required health range if (!isNullOrUndefined(this.requiredHealthRange) && this.requiredHealthRange[0] <= this.requiredHealthRange[1]) { - const partyPokemon = scene.getParty(); + const partyPokemon = globalScene.getPlayerParty(); const pokemonInRange = this.queryParty(partyPokemon); if (pokemonInRange.length < this.minNumberOfPokemon) { return false; @@ -1049,21 +1156,25 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => { - return pokemon.getHpRatio() >= this.requiredHealthRange[0] && pokemon.getHpRatio() <= this.requiredHealthRange[1]; + return partyPokemon.filter(pokemon => { + return ( + pokemon.getHpRatio() >= this.requiredHealthRange[0] && pokemon.getHpRatio() <= this.requiredHealthRange[1] + ); }); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredHealthRanges - return partyPokemon.filter((pokemon) => pokemon.getHpRatio() < this.requiredHealthRange[0] || pokemon.getHpRatio() > this.requiredHealthRange[1]); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredHealthRanges + return partyPokemon.filter( + pokemon => + pokemon.getHpRatio() < this.requiredHealthRange[0] || pokemon.getHpRatio() > this.requiredHealthRange[1], + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { const hpRatio = pokemon?.getHpRatio(); if (!isNullOrUndefined(hpRatio)) { - return [ "healthRatio", Math.floor(hpRatio * 100).toString() + "%" ]; + return ["healthRatio", Math.floor(hpRatio * 100).toString() + "%"]; } - return [ "healthRatio", "" ]; + return ["healthRatio", ""]; } } @@ -1072,17 +1183,17 @@ export class WeightRequirement extends EncounterPokemonRequirement { minNumberOfPokemon: number; invertQuery: boolean; - constructor(requiredWeightRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(requiredWeightRange: [number, number], minNumberOfPokemon = 1, invertQuery = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; this.requiredWeightRange = requiredWeightRange; } - override meetsRequirement(scene: BattleScene): boolean { + override meetsRequirement(): boolean { // Party Pokemon's weight inside required weight range if (!isNullOrUndefined(this.requiredWeightRange) && this.requiredWeightRange[0] <= this.requiredWeightRange[1]) { - const partyPokemon = scene.getParty(); + const partyPokemon = globalScene.getPlayerParty(); const pokemonInRange = this.queryParty(partyPokemon); if (pokemonInRange.length < this.minNumberOfPokemon) { return false; @@ -1093,15 +1204,18 @@ export class WeightRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => pokemon.getWeight() >= this.requiredWeightRange[0] && pokemon.getWeight() <= this.requiredWeightRange[1]); - } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredWeightRanges - return partyPokemon.filter((pokemon) => pokemon.getWeight() < this.requiredWeightRange[0] || pokemon.getWeight() > this.requiredWeightRange[1]); + return partyPokemon.filter( + pokemon => + pokemon.getWeight() >= this.requiredWeightRange[0] && pokemon.getWeight() <= this.requiredWeightRange[1], + ); } + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredWeightRanges + return partyPokemon.filter( + pokemon => pokemon.getWeight() < this.requiredWeightRange[0] || pokemon.getWeight() > this.requiredWeightRange[1], + ); } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return [ "weight", pokemon?.getWeight().toString() ?? "" ]; + override getDialogueToken(pokemon?: PlayerPokemon): [string, string] { + return ["weight", pokemon?.getWeight().toString() ?? ""]; } } - diff --git a/src/data/mystery-encounters/mystery-encounter-save-data.ts b/src/data/mystery-encounters/mystery-encounter-save-data.ts index 259fbff7b85..7c8110628f0 100644 --- a/src/data/mystery-encounters/mystery-encounter-save-data.ts +++ b/src/data/mystery-encounters/mystery-encounter-save-data.ts @@ -1,7 +1,7 @@ -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT } from "#app/data/mystery-encounters/mystery-encounters"; import { isNullOrUndefined } from "#app/utils"; -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import type { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; export class SeenEncounterData { type: MysteryEncounterType; diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index c045ee51bd7..53e976cda8a 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -1,21 +1,33 @@ -import { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import type { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { capitalizeFirstLetter, isNullOrUndefined } from "#app/utils"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "#app/field/mystery-encounter-intro"; +import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import type { MysteryEncounterSpriteConfig } from "#app/field/mystery-encounter-intro"; +import MysteryEncounterIntroVisuals from "#app/field/mystery-encounter-intro"; import * as Utils from "#app/utils"; -import { StatusEffect } from "../status-effect"; -import MysteryEncounterDialogue, { OptionTextDisplay } from "./mystery-encounter-dialogue"; -import MysteryEncounterOption, { MysteryEncounterOptionBuilder, OptionPhaseCallback } from "./mystery-encounter-option"; -import { EncounterPokemonRequirement, EncounterSceneRequirement, HealthRatioRequirement, PartySizeRequirement, StatusEffectRequirement, WaveRangeRequirement } from "./mystery-encounter-requirements"; -import { BattlerIndex } from "#app/battle"; +import type { StatusEffect } from "#enums/status-effect"; +import type { OptionTextDisplay } from "./mystery-encounter-dialogue"; +import type MysteryEncounterDialogue from "./mystery-encounter-dialogue"; +import type { OptionPhaseCallback } from "./mystery-encounter-option"; +import type MysteryEncounterOption from "./mystery-encounter-option"; +import { MysteryEncounterOptionBuilder } from "./mystery-encounter-option"; +import { + EncounterPokemonRequirement, + EncounterSceneRequirement, + HealthRatioRequirement, + PartySizeRequirement, + StatusEffectRequirement, + WaveRangeRequirement, +} from "./mystery-encounter-requirements"; +import type { BattlerIndex } from "#app/battle"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { GameModes } from "#app/game-mode"; -import { EncounterAnim } from "#enums/encounter-anims"; -import { Challenges } from "#enums/challenges"; +import type { GameModes } from "#app/game-mode"; +import type { EncounterAnim } from "#enums/encounter-anims"; +import type { Challenges } from "#enums/challenges"; +import { globalScene } from "#app/global-scene"; export interface EncounterStartOfBattleEffect { sourcePokemon?: Pokemon; @@ -55,11 +67,11 @@ export interface IMysteryEncounter { skipToFightInput: boolean; preventGameStatsUpdates: boolean; - onInit?: (scene: BattleScene) => boolean; - onVisualsStart?: (scene: BattleScene) => boolean; - doEncounterExp?: (scene: BattleScene) => boolean; - doEncounterRewards?: (scene: BattleScene) => boolean; - doContinueEncounter?: (scene: BattleScene) => Promise; + onInit?: () => boolean; + onVisualsStart?: () => boolean; + doEncounterExp?: () => boolean; + doEncounterRewards?: () => boolean; + doContinueEncounter?: () => Promise; requirements: EncounterSceneRequirement[]; primaryPokemonRequirements: EncounterPokemonRequirement[]; @@ -159,24 +171,24 @@ export default class MysteryEncounter implements IMysteryEncounter { // #region Event callback functions /** Event when Encounter is first loaded, use it for data conditioning */ - onInit?: (scene: BattleScene) => boolean; + onInit?: () => boolean; /** Event when battlefield visuals have finished sliding in and the encounter dialogue begins */ - onVisualsStart?: (scene: BattleScene) => boolean; + onVisualsStart?: () => boolean; /** Event triggered prior to {@linkcode CommandPhase}, during {@linkcode TurnInitPhase} */ - onTurnStart?: (scene: BattleScene) => boolean; + onTurnStart?: () => boolean; /** Event prior to any rewards logic in {@linkcode MysteryEncounterRewardsPhase} */ - onRewards?: (scene: BattleScene) => Promise; + onRewards?: () => Promise; /** Will provide the player party EXP before rewards are displayed for that wave */ - doEncounterExp?: (scene: BattleScene) => boolean; + doEncounterExp?: () => boolean; /** Will provide the player a rewards shop for that wave */ - doEncounterRewards?: (scene: BattleScene) => boolean; + doEncounterRewards?: () => boolean; /** Will execute callback during VictoryPhase of a continuousEncounter */ - doContinueEncounter?: (scene: BattleScene) => Promise; + doContinueEncounter?: () => Promise; /** * Can perform special logic when a ME battle is lost, before GameOver/battle retry prompt. * Should return `true` if it is treated as "real" Game Over, `false` if not. */ - onGameOver?: (scene: BattleScene) => boolean; + onGameOver?: () => boolean; /** * Requirements @@ -271,9 +283,12 @@ export default class MysteryEncounter implements IMysteryEncounter { this.encounterTier = this.encounterTier ?? MysteryEncounterTier.COMMON; this.localizationKey = this.localizationKey ?? ""; this.dialogue = this.dialogue ?? {}; - this.spriteConfigs = this.spriteConfigs ? [ ...this.spriteConfigs ] : []; + this.spriteConfigs = this.spriteConfigs ? [...this.spriteConfigs] : []; // Default max is 1 for ROGUE encounters, 2 for others - this.maxAllowedEncounters = this.maxAllowedEncounters ?? this.encounterTier === MysteryEncounterTier.ROGUE ? DEFAULT_MAX_ALLOWED_ROGUE_ENCOUNTERS : DEFAULT_MAX_ALLOWED_ENCOUNTERS; + this.maxAllowedEncounters = + (this.maxAllowedEncounters ?? this.encounterTier === MysteryEncounterTier.ROGUE) + ? DEFAULT_MAX_ALLOWED_ROGUE_ENCOUNTERS + : DEFAULT_MAX_ALLOWED_ENCOUNTERS; this.encounterMode = MysteryEncounterMode.DEFAULT; this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = this.hideBattleIntroMessage ?? false; @@ -296,13 +311,12 @@ export default class MysteryEncounter implements IMysteryEncounter { /** * Checks if the current scene state meets the requirements for the {@linkcode MysteryEncounter} to spawn * This is used to filter the pool of encounters down to only the ones with all requirements met - * @param scene * @returns */ - meetsRequirements(scene: BattleScene): boolean { - const sceneReq = !this.requirements.some(requirement => !requirement.meetsRequirement(scene)); - const secReqs = this.meetsSecondaryRequirementAndSecondaryPokemonSelected(scene); // secondary is checked first to handle cases of primary overlapping with secondary - const priReqs = this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene); + meetsRequirements(): boolean { + const sceneReq = !this.requirements.some(requirement => !requirement.meetsRequirement()); + const secReqs = this.meetsSecondaryRequirementAndSecondaryPokemonSelected(); // secondary is checked first to handle cases of primary overlapping with secondary + const priReqs = this.meetsPrimaryRequirementAndPrimaryPokemonSelected(); return sceneReq && secReqs && priReqs; } @@ -310,11 +324,16 @@ export default class MysteryEncounter implements IMysteryEncounter { /** * Checks if a specific player pokemon meets all given primary EncounterPokemonRequirements * Used automatically as part of {@linkcode meetsRequirements}, but can also be used to manually check certain Pokemon where needed - * @param scene * @param pokemon */ - pokemonMeetsPrimaryRequirements(scene: BattleScene, pokemon: Pokemon): boolean { - return !this.primaryPokemonRequirements.some(req => !req.queryParty(scene.getParty()).map(p => p.id).includes(pokemon.id)); + pokemonMeetsPrimaryRequirements(pokemon: Pokemon): boolean { + return !this.primaryPokemonRequirements.some( + req => + !req + .queryParty(globalScene.getPlayerParty()) + .map(p => p.id) + .includes(pokemon.id), + ); } /** @@ -322,22 +341,21 @@ export default class MysteryEncounter implements IMysteryEncounter { * AND there is a valid Pokemon assigned to {@linkcode primaryPokemon}. * If both {@linkcode primaryPokemonRequirements} and {@linkcode secondaryPokemonRequirements} are defined, * can cause scenarios where there are not enough Pokemon that are sufficient for all requirements. - * @param scene */ - private meetsPrimaryRequirementAndPrimaryPokemonSelected(scene: BattleScene): boolean { + private meetsPrimaryRequirementAndPrimaryPokemonSelected(): boolean { if (!this.primaryPokemonRequirements || this.primaryPokemonRequirements.length === 0) { - const activeMon = scene.getParty().filter(p => p.isActive(true)); + const activeMon = globalScene.getPlayerParty().filter(p => p.isActive(true)); if (activeMon.length > 0) { this.primaryPokemon = activeMon[0]; } else { - this.primaryPokemon = scene.getParty().filter(p => p.isAllowedInBattle())[0]; + this.primaryPokemon = globalScene.getPlayerParty().filter(p => p.isAllowedInBattle())[0]; } return true; } - let qualified: PlayerPokemon[] = scene.getParty(); + let qualified: PlayerPokemon[] = globalScene.getPlayerParty(); for (const req of this.primaryPokemonRequirements) { - if (req.meetsRequirement(scene)) { - qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); + if (req.meetsRequirement()) { + qualified = qualified.filter(pkmn => req.queryParty(globalScene.getPlayerParty()).includes(pkmn)); } else { this.primaryPokemon = undefined; return false; @@ -357,28 +375,27 @@ export default class MysteryEncounter implements IMysteryEncounter { } else { overlap.push(qp); } - } if (truePrimaryPool.length > 0) { // Always choose from the non-overlapping pokemon first this.primaryPokemon = truePrimaryPool[Utils.randSeedInt(truePrimaryPool.length, 0)]; return true; - } else { - // If there are multiple overlapping pokemon, we're okay - just choose one and take it out of the primary pokemon pool - if (overlap.length > 1 || (this.secondaryPokemon.length - overlap.length >= 1)) { - // is this working? - this.primaryPokemon = overlap[Utils.randSeedInt(overlap.length, 0)]; - this.secondaryPokemon = this.secondaryPokemon.filter((supp) => supp !== this.primaryPokemon); - return true; - } - console.log("Mystery Encounter Edge Case: Requirement not met due to primary pokemon overlapping with secondary pokemon. There's no valid primary pokemon left."); - return false; } - } else { - // this means we CAN have the same pokemon be a primary and secondary pokemon, so just choose any qualifying one randomly. - this.primaryPokemon = qualified[Utils.randSeedInt(qualified.length, 0)]; - return true; + // If there are multiple overlapping pokemon, we're okay - just choose one and take it out of the primary pokemon pool + if (overlap.length > 1 || this.secondaryPokemon.length - overlap.length >= 1) { + // is this working? + this.primaryPokemon = overlap[Utils.randSeedInt(overlap.length, 0)]; + this.secondaryPokemon = this.secondaryPokemon.filter(supp => supp !== this.primaryPokemon); + return true; + } + console.log( + "Mystery Encounter Edge Case: Requirement not met due to primary pokemon overlapping with secondary pokemon. There's no valid primary pokemon left.", + ); + return false; } + // this means we CAN have the same pokemon be a primary and secondary pokemon, so just choose any qualifying one randomly. + this.primaryPokemon = qualified[Utils.randSeedInt(qualified.length, 0)]; + return true; } /** @@ -386,18 +403,17 @@ export default class MysteryEncounter implements IMysteryEncounter { * AND there is a valid Pokemon assigned to {@linkcode secondaryPokemon} (if applicable). * If both {@linkcode primaryPokemonRequirements} and {@linkcode secondaryPokemonRequirements} are defined, * can cause scenarios where there are not enough Pokemon that are sufficient for all requirements. - * @param scene */ - private meetsSecondaryRequirementAndSecondaryPokemonSelected(scene: BattleScene): boolean { + private meetsSecondaryRequirementAndSecondaryPokemonSelected(): boolean { if (!this.secondaryPokemonRequirements || this.secondaryPokemonRequirements.length === 0) { this.secondaryPokemon = []; return true; } - let qualified: PlayerPokemon[] = scene.getParty(); + let qualified: PlayerPokemon[] = globalScene.getPlayerParty(); for (const req of this.secondaryPokemonRequirements) { - if (req.meetsRequirement(scene)) { - qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); + if (req.meetsRequirement()) { + qualified = qualified.filter(pkmn => req.queryParty(globalScene.getPlayerParty()).includes(pkmn)); } else { this.secondaryPokemon = []; return false; @@ -409,10 +425,9 @@ export default class MysteryEncounter implements IMysteryEncounter { /** * Initializes encounter intro sprites based on the sprite configs defined in spriteConfigs - * @param scene */ - initIntroVisuals(scene: BattleScene): void { - this.introVisuals = new MysteryEncounterIntroVisuals(scene, this); + initIntroVisuals(): void { + this.introVisuals = new MysteryEncounterIntroVisuals(this); } /** @@ -420,11 +435,11 @@ export default class MysteryEncounter implements IMysteryEncounter { * Will use the first support pokemon in list * For multiple support pokemon in the dialogue token, it will have to be overridden. */ - populateDialogueTokensFromRequirements(scene: BattleScene): void { - this.meetsRequirements(scene); + populateDialogueTokensFromRequirements(): void { + this.meetsRequirements(); if (this.requirements?.length > 0) { for (const req of this.requirements) { - const dialogueToken = req.getDialogueToken(scene); + const dialogueToken = req.getDialogueToken(); if (dialogueToken?.length === 2) { this.setDialogueToken(...dialogueToken); } @@ -434,7 +449,7 @@ export default class MysteryEncounter implements IMysteryEncounter { this.setDialogueToken("primaryName", this.primaryPokemon.getNameToRender()); for (const req of this.primaryPokemonRequirements) { if (!req.invertQuery) { - const value = req.getDialogueToken(scene, this.primaryPokemon); + const value = req.getDialogueToken(this.primaryPokemon); if (value?.length === 2) { this.setDialogueToken("primary" + capitalizeFirstLetter(value[0]), value[1]); } @@ -445,7 +460,7 @@ export default class MysteryEncounter implements IMysteryEncounter { this.setDialogueToken("secondaryName", this.secondaryPokemon[0].getNameToRender()); for (const req of this.secondaryPokemonRequirements) { if (!req.invertQuery) { - const value = req.getDialogueToken(scene, this.secondaryPokemon[0]); + const value = req.getDialogueToken(this.secondaryPokemon[0]); if (value?.length === 2) { this.setDialogueToken("primary" + capitalizeFirstLetter(value[0]), value[1]); } @@ -457,11 +472,11 @@ export default class MysteryEncounter implements IMysteryEncounter { // Dialogue tokens for options for (let i = 0; i < this.options.length; i++) { const opt = this.options[i]; - opt.meetsRequirements(scene); + opt.meetsRequirements(); const j = i + 1; if (opt.requirements.length > 0) { for (const req of opt.requirements) { - const dialogueToken = req.getDialogueToken(scene); + const dialogueToken = req.getDialogueToken(); if (dialogueToken?.length === 2) { this.setDialogueToken("option" + j + capitalizeFirstLetter(dialogueToken[0]), dialogueToken[1]); } @@ -471,7 +486,7 @@ export default class MysteryEncounter implements IMysteryEncounter { this.setDialogueToken("option" + j + "PrimaryName", opt.primaryPokemon.getNameToRender()); for (const req of opt.primaryPokemonRequirements) { if (!req.invertQuery) { - const value = req.getDialogueToken(scene, opt.primaryPokemon); + const value = req.getDialogueToken(opt.primaryPokemon); if (value?.length === 2) { this.setDialogueToken("option" + j + "Primary" + capitalizeFirstLetter(value[0]), value[1]); } @@ -482,7 +497,7 @@ export default class MysteryEncounter implements IMysteryEncounter { this.setDialogueToken("option" + j + "SecondaryName", opt.secondaryPokemon[0].getNameToRender()); for (const req of opt.secondaryPokemonRequirements) { if (!req.invertQuery) { - const value = req.getDialogueToken(scene, opt.secondaryPokemon[0]); + const value = req.getDialogueToken(opt.secondaryPokemon[0]); if (value?.length === 2) { this.setDialogueToken("option" + j + "Secondary" + capitalizeFirstLetter(value[0]), value[1]); } @@ -518,10 +533,9 @@ export default class MysteryEncounter implements IMysteryEncounter { /** * Maintains seed offset for RNG consistency * Increments if the same {@linkcode MysteryEncounter} has multiple option select cycles - * @param scene */ - updateSeedOffset(scene: BattleScene) { - const currentOffset = this.seedOffset ?? scene.currentBattle.waveIndex * 1000; + updateSeedOffset() { + const currentOffset = this.seedOffset ?? globalScene.currentBattle.waveIndex * 1000; this.seedOffset = currentOffset + 512; } } @@ -534,28 +548,28 @@ export class MysteryEncounterBuilder implements Partial { options: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]]; enemyPartyConfigs: EnemyPartyConfig[] = []; - localizationKey: string = ""; + localizationKey = ""; dialogue: MysteryEncounterDialogue = {}; requirements: EncounterSceneRequirement[] = []; primaryPokemonRequirements: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements: EncounterPokemonRequirement[] = []; - excludePrimaryFromSupportRequirements: boolean = true; + excludePrimaryFromSupportRequirements = true; dialogueTokens: Record = {}; - hideBattleIntroMessage: boolean = false; - autoHideIntroVisuals: boolean = true; - enterIntroVisualsFromRight: boolean = false; - continuousEncounter: boolean = false; - catchAllowed: boolean = false; - fleeAllowed: boolean = true; - lockEncounterRewardTiers: boolean = false; - startOfBattleEffectsComplete: boolean = false; - hasBattleAnimationsWithoutTargets: boolean = false; - skipEnemyBattleTurns: boolean = false; - skipToFightInput: boolean = false; - preventGameStatsUpdates: boolean = false; - maxAllowedEncounters: number = 3; - expMultiplier: number = 1; + hideBattleIntroMessage = false; + autoHideIntroVisuals = true; + enterIntroVisualsFromRight = false; + continuousEncounter = false; + catchAllowed = false; + fleeAllowed = true; + lockEncounterRewardTiers = false; + startOfBattleEffectsComplete = false; + hasBattleAnimationsWithoutTargets = false; + skipEnemyBattleTurns = false; + skipToFightInput = false; + preventGameStatsUpdates = false; + maxAllowedEncounters = 3; + expMultiplier = 1; /** * REQUIRED @@ -567,7 +581,9 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterType * @returns this */ - static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { + static withEncounterType( + encounterType: MysteryEncounterType, + ): MysteryEncounterBuilder & Pick { return Object.assign(new MysteryEncounterBuilder(), { encounterType }); } @@ -581,12 +597,11 @@ export class MysteryEncounterBuilder implements Partial { */ withOption(option: MysteryEncounterOption): this & Pick { if (!this.options) { - const options = [ option ]; + const options = [option]; return Object.assign(this, { options }); - } else { - this.options.push(option); - return this; } + this.options.push(option); + return this; } /** @@ -599,8 +614,16 @@ export class MysteryEncounterBuilder implements Partial { * @param callback {@linkcode OptionPhaseCallback} * @returns */ - withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { - return this.withOption(MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); + withSimpleOption( + dialogue: OptionTextDisplay, + callback: OptionPhaseCallback, + ): this & Pick { + return this.withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue(dialogue) + .withOptionPhase(callback) + .build(), + ); } /** @@ -613,12 +636,17 @@ export class MysteryEncounterBuilder implements Partial { * @param callback {@linkcode OptionPhaseCallback} * @returns */ - withSimpleDexProgressOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { - return this.withOption(MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withHasDexProgress(true) - .withDialogue(dialogue) - .withOptionPhase(callback).build()); + withSimpleDexProgressOption( + dialogue: OptionTextDisplay, + callback: OptionPhaseCallback, + ): this & Pick { + return this.withOption( + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue(dialogue) + .withOptionPhase(callback) + .build(), + ); } /** @@ -627,7 +655,9 @@ export class MysteryEncounterBuilder implements Partial { * @param spriteConfigs * @returns */ - withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { + withIntroSpriteConfigs( + spriteConfigs: MysteryEncounterSpriteConfig[], + ): this & Pick { return Object.assign(this, { spriteConfigs: spriteConfigs }); } @@ -636,7 +666,13 @@ export class MysteryEncounterBuilder implements Partial { return this; } - withIntro({ spriteConfigs, dialogue } : {spriteConfigs: MysteryEncounterSpriteConfig[], dialogue?: MysteryEncounterDialogue["intro"]}) { + withIntro({ + spriteConfigs, + dialogue, + }: { + spriteConfigs: MysteryEncounterSpriteConfig[]; + dialogue?: MysteryEncounterDialogue["intro"]; + }) { return this.withIntroSpriteConfigs(spriteConfigs).withIntroDialogue(dialogue); } @@ -677,8 +713,10 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterAnimations * @returns */ - withAnimations(...encounterAnimations: EncounterAnim[]): this & Required> { - const animations = Array.isArray(encounterAnimations) ? encounterAnimations : [ encounterAnimations ]; + withAnimations( + ...encounterAnimations: EncounterAnim[] + ): this & Required> { + const animations = Array.isArray(encounterAnimations) ? encounterAnimations : [encounterAnimations]; return Object.assign(this, { encounterAnimations: animations }); } @@ -687,8 +725,10 @@ export class MysteryEncounterBuilder implements Partial { * @returns * @param disallowedGameModes */ - withDisallowedGameModes(...disallowedGameModes: GameModes[]): this & Required> { - const gameModes = Array.isArray(disallowedGameModes) ? disallowedGameModes : [ disallowedGameModes ]; + withDisallowedGameModes( + ...disallowedGameModes: GameModes[] + ): this & Required> { + const gameModes = Array.isArray(disallowedGameModes) ? disallowedGameModes : [disallowedGameModes]; return Object.assign(this, { disallowedGameModes: gameModes }); } @@ -697,8 +737,10 @@ export class MysteryEncounterBuilder implements Partial { * @returns * @param disallowedChallenges */ - withDisallowedChallenges(...disallowedChallenges: Challenges[]): this & Required> { - const challenges = Array.isArray(disallowedChallenges) ? disallowedChallenges : [ disallowedChallenges ]; + withDisallowedChallenges( + ...disallowedChallenges: Challenges[] + ): this & Required> { + const challenges = Array.isArray(disallowedChallenges) ? disallowedChallenges : [disallowedChallenges]; return Object.assign(this, { disallowedChallenges: challenges }); } @@ -708,7 +750,9 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @param continuousEncounter */ - withContinuousEncounter(continuousEncounter: boolean): this & Required> { + withContinuousEncounter( + continuousEncounter: boolean, + ): this & Required> { return Object.assign(this, { continuousEncounter: continuousEncounter }); } @@ -718,7 +762,9 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @param hasBattleAnimationsWithoutTargets */ - withBattleAnimationsWithoutTargets(hasBattleAnimationsWithoutTargets: boolean): this & Required> { + withBattleAnimationsWithoutTargets( + hasBattleAnimationsWithoutTargets: boolean, + ): this & Required> { return Object.assign(this, { hasBattleAnimationsWithoutTargets }); } @@ -728,7 +774,9 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @param skipEnemyBattleTurns */ - withSkipEnemyBattleTurns(skipEnemyBattleTurns: boolean): this & Required> { + withSkipEnemyBattleTurns( + skipEnemyBattleTurns: boolean, + ): this & Required> { return Object.assign(this, { skipEnemyBattleTurns }); } @@ -745,7 +793,9 @@ export class MysteryEncounterBuilder implements Partial { * If true, will prevent updating {@linkcode GameStats} for encountering and/or defeating Pokemon * Default `false` */ - withPreventGameStatsUpdates(preventGameStatsUpdates: boolean): this & Required> { + withPreventGameStatsUpdates( + preventGameStatsUpdates: boolean, + ): this & Required> { return Object.assign(this, { preventGameStatsUpdates }); } @@ -754,7 +804,9 @@ export class MysteryEncounterBuilder implements Partial { * @param maxAllowedEncounters * @returns */ - withMaxAllowedEncounters(maxAllowedEncounters: number): this & Required> { + withMaxAllowedEncounters( + maxAllowedEncounters: number, + ): this & Required> { return Object.assign(this, { maxAllowedEncounters: maxAllowedEncounters }); } @@ -765,7 +817,9 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement * @returns */ - withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { + withSceneRequirement( + requirement: EncounterSceneRequirement, + ): this & Required> { if (requirement instanceof EncounterPokemonRequirement) { Error("Incorrectly added pokemon requirement as scene requirement."); } @@ -781,7 +835,7 @@ export class MysteryEncounterBuilder implements Partial { * @returns */ withSceneWaveRangeRequirement(min: number, max?: number): this & Required> { - return this.withSceneRequirement(new WaveRangeRequirement([ min, max ?? min ])); + return this.withSceneRequirement(new WaveRangeRequirement([min, max ?? min])); } /** @@ -792,8 +846,12 @@ export class MysteryEncounterBuilder implements Partial { * @param excludeDisallowedPokemon if true, only counts allowed (legal in Challenge/unfainted) mons * @returns */ - withScenePartySizeRequirement(min: number, max?: number, excludeDisallowedPokemon: boolean = false): this & Required> { - return this.withSceneRequirement(new PartySizeRequirement([ min, max ?? min ], excludeDisallowedPokemon)); + withScenePartySizeRequirement( + min: number, + max?: number, + excludeDisallowedPokemon = false, + ): this & Required> { + return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min], excludeDisallowedPokemon)); } /** @@ -802,13 +860,17 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement {@linkcode EncounterPokemonRequirement} * @returns */ - withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { + withPrimaryPokemonRequirement( + requirement: EncounterPokemonRequirement, + ): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } this.primaryPokemonRequirements.push(requirement); - return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); + return Object.assign(this, { + primaryPokemonRequirements: this.primaryPokemonRequirements, + }); } /** @@ -819,8 +881,14 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { - return this.withPrimaryPokemonRequirement(new StatusEffectRequirement(statusEffect, minNumberOfPokemon, invertQuery)); + withPrimaryPokemonStatusEffectRequirement( + statusEffect: StatusEffect | StatusEffect[], + minNumberOfPokemon = 1, + invertQuery = false, + ): this & Required> { + return this.withPrimaryPokemonRequirement( + new StatusEffectRequirement(statusEffect, minNumberOfPokemon, invertQuery), + ); } /** @@ -831,21 +899,33 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { - return this.withPrimaryPokemonRequirement(new HealthRatioRequirement(requiredHealthRange, minNumberOfPokemon, invertQuery)); + withPrimaryPokemonHealthRatioRequirement( + requiredHealthRange: [number, number], + minNumberOfPokemon = 1, + invertQuery = false, + ): this & Required> { + return this.withPrimaryPokemonRequirement( + new HealthRatioRequirement(requiredHealthRange, minNumberOfPokemon, invertQuery), + ); } // TODO: Maybe add an optional parameter for excluding primary pokemon from the support cast? // ex. if your only grass type pokemon, a snivy, is chosen as primary, if the support pokemon requires a grass type, the event won't trigger because // it's already been - withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { + withSecondaryPokemonRequirement( + requirement: EncounterPokemonRequirement, + excludePrimaryFromSecondaryRequirements = false, + ): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSupportRequirements = excludePrimaryFromSecondaryRequirements; - return Object.assign(this, { excludePrimaryFromSecondaryRequirements: this.excludePrimaryFromSupportRequirements, secondaryPokemonRequirements: this.secondaryPokemonRequirements }); + return Object.assign(this, { + excludePrimaryFromSecondaryRequirements: this.excludePrimaryFromSupportRequirements, + secondaryPokemonRequirements: this.secondaryPokemonRequirements, + }); } /** @@ -858,7 +938,7 @@ export class MysteryEncounterBuilder implements Partial { * @param doEncounterRewards Synchronous callback function to perform during rewards phase of the encounter * @returns */ - withRewards(doEncounterRewards: (scene: BattleScene) => boolean): this & Required> { + withRewards(doEncounterRewards: () => boolean): this & Required> { return Object.assign(this, { doEncounterRewards: doEncounterRewards }); } @@ -872,7 +952,7 @@ export class MysteryEncounterBuilder implements Partial { * @param doEncounterExp Synchronous callback function to perform during rewards phase of the encounter * @returns */ - withExp(doEncounterExp: (scene: BattleScene) => boolean): this & Required> { + withExp(doEncounterExp: () => boolean): this & Required> { return Object.assign(this, { doEncounterExp: doEncounterExp }); } @@ -883,7 +963,7 @@ export class MysteryEncounterBuilder implements Partial { * @param onInit Synchronous callback function to perform as soon as the encounter is selected for the next phase * @returns */ - withOnInit(onInit: (scene: BattleScene) => boolean): this & Required> { + withOnInit(onInit: () => boolean): this & Required> { return Object.assign(this, { onInit }); } @@ -893,7 +973,7 @@ export class MysteryEncounterBuilder implements Partial { * @param onVisualsStart Synchronous callback function to perform as soon as the enemy field finishes sliding in * @returns */ - withOnVisualsStart(onVisualsStart: (scene: BattleScene) => boolean): this & Required> { + withOnVisualsStart(onVisualsStart: () => boolean): this & Required> { return Object.assign(this, { onVisualsStart: onVisualsStart }); } @@ -920,15 +1000,21 @@ export class MysteryEncounterBuilder implements Partial { * @param hideBattleIntroMessage If `true`, will not show the trainerAppeared/wildAppeared/bossAppeared message for an encounter * @returns */ - withHideWildIntroMessage(hideBattleIntroMessage: boolean): this & Required> { - return Object.assign(this, { hideBattleIntroMessage: hideBattleIntroMessage }); + withHideWildIntroMessage( + hideBattleIntroMessage: boolean, + ): this & Required> { + return Object.assign(this, { + hideBattleIntroMessage: hideBattleIntroMessage, + }); } /** * @param autoHideIntroVisuals If `false`, will not hide the intro visuals that are displayed at the beginning of encounter * @returns */ - withAutoHideIntroVisuals(autoHideIntroVisuals: boolean): this & Required> { + withAutoHideIntroVisuals( + autoHideIntroVisuals: boolean, + ): this & Required> { return Object.assign(this, { autoHideIntroVisuals: autoHideIntroVisuals }); } @@ -937,8 +1023,12 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @returns */ - withEnterIntroVisualsFromRight(enterIntroVisualsFromRight: boolean): this & Required> { - return Object.assign(this, { enterIntroVisualsFromRight: enterIntroVisualsFromRight }); + withEnterIntroVisualsFromRight( + enterIntroVisualsFromRight: boolean, + ): this & Required> { + return Object.assign(this, { + enterIntroVisualsFromRight: enterIntroVisualsFromRight, + }); } /** @@ -955,7 +1045,7 @@ export class MysteryEncounterBuilder implements Partial { encounterOptionsDialogue: { ...encounterOptionsDialogue, title, - } + }, }; return this; @@ -975,7 +1065,7 @@ export class MysteryEncounterBuilder implements Partial { encounterOptionsDialogue: { ...encounterOptionsDialogue, description, - } + }, }; return this; @@ -995,7 +1085,7 @@ export class MysteryEncounterBuilder implements Partial { encounterOptionsDialogue: { ...encounterOptionsDialogue, query, - } + }, }; return this; diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 8c1c3bf6de4..354f69d0ca3 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -10,7 +10,7 @@ import { MysteriousChestEncounter } from "./encounters/mysterious-chest-encounte import { ShadyVitaminDealerEncounter } from "./encounters/shady-vitamin-dealer-encounter"; import { SlumberingSnorlaxEncounter } from "./encounters/slumbering-snorlax-encounter"; import { TrainingSessionEncounter } from "./encounters/training-session-encounter"; -import MysteryEncounter from "./mystery-encounter"; +import type MysteryEncounter from "./mystery-encounter"; import { SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; @@ -80,7 +80,7 @@ export const EXTREME_ENCOUNTER_BIOMES = [ Biome.WASTELAND, Biome.ABYSS, Biome.SPACE, - Biome.END + Biome.END, ]; export const NON_EXTREME_ENCOUNTER_BIOMES = [ @@ -108,7 +108,7 @@ export const NON_EXTREME_ENCOUNTER_BIOMES = [ Biome.SLUM, Biome.SNOWY_FOREST, Biome.ISLAND, - Biome.LABORATORY + Biome.LABORATORY, ]; /** @@ -147,7 +147,7 @@ export const HUMAN_TRANSITABLE_BIOMES = [ Biome.SLUM, Biome.SNOWY_FOREST, Biome.ISLAND, - Biome.LABORATORY + Biome.LABORATORY, ]; /** @@ -168,16 +168,17 @@ export const CIVILIZATION_ENCOUNTER_BIOMES = [ Biome.FACTORY, Biome.CONSTRUCTION_SITE, Biome.SLUM, - Biome.ISLAND + Biome.ISLAND, ]; -export const allMysteryEncounters: { [encounterType: number]: MysteryEncounter } = {}; - +export const allMysteryEncounters: { + [encounterType: number]: MysteryEncounter; +} = {}; const extremeBiomeEncounters: MysteryEncounterType[] = []; const nonExtremeBiomeEncounters: MysteryEncounterType[] = [ - MysteryEncounterType.FIELD_TRIP, + // MysteryEncounterType.FIELD_TRIP, Disabled MysteryEncounterType.DANCING_LESSONS, // Is also in BADLANDS, DESERT, VOLCANO, WASTELAND, ABYSS ]; @@ -185,16 +186,16 @@ const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS, MysteryEncounterType.SHADY_VITAMIN_DEALER, MysteryEncounterType.THE_POKEMON_SALESMAN, - MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, + // MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, Disabled MysteryEncounterType.THE_WINSTRATE_CHALLENGE, - MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER + MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER, ]; const civilizationBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.DEPARTMENT_STORE_SALE, MysteryEncounterType.PART_TIMER, MysteryEncounterType.FUN_AND_GAMES, - MysteryEncounterType.GLOBAL_TRADE_SYSTEM + MysteryEncounterType.GLOBAL_TRADE_SYSTEM, ]; /** @@ -213,7 +214,7 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.WEIRD_DREAM, MysteryEncounterType.TELEPORTING_HIJINKS, MysteryEncounterType.BUG_TYPE_SUPERFAN, - MysteryEncounterType.UNCOMMON_BREED + MysteryEncounterType.UNCOMMON_BREED, ]; /** @@ -224,72 +225,40 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ * that biome groups do not cover */ export const mysteryEncountersByBiome = new Map([ - [ Biome.TOWN, []], - [ Biome.PLAINS, [ - MysteryEncounterType.SLUMBERING_SNORLAX, - MysteryEncounterType.ABSOLUTE_AVARICE - ]], - [ Biome.GRASS, [ - MysteryEncounterType.SLUMBERING_SNORLAX, - MysteryEncounterType.ABSOLUTE_AVARICE - ]], - [ Biome.TALL_GRASS, [ - MysteryEncounterType.ABSOLUTE_AVARICE - ]], - [ Biome.METROPOLIS, []], - [ Biome.FOREST, [ - MysteryEncounterType.SAFARI_ZONE, - MysteryEncounterType.ABSOLUTE_AVARICE - ]], - [ Biome.SEA, [ - MysteryEncounterType.LOST_AT_SEA - ]], - [ Biome.SWAMP, [ - MysteryEncounterType.SAFARI_ZONE - ]], - [ Biome.BEACH, []], - [ Biome.LAKE, []], - [ Biome.SEABED, []], - [ Biome.MOUNTAIN, []], - [ Biome.BADLANDS, [ - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.CAVE, [ - MysteryEncounterType.THE_STRONG_STUFF - ]], - [ Biome.DESERT, [ - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.ICE_CAVE, []], - [ Biome.MEADOW, []], - [ Biome.POWER_PLANT, []], - [ Biome.VOLCANO, [ - MysteryEncounterType.FIERY_FALLOUT, - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.GRAVEYARD, []], - [ Biome.DOJO, []], - [ Biome.FACTORY, []], - [ Biome.RUINS, []], - [ Biome.WASTELAND, [ - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.ABYSS, [ - MysteryEncounterType.DANCING_LESSONS - ]], - [ Biome.SPACE, [ - MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER - ]], - [ Biome.CONSTRUCTION_SITE, []], - [ Biome.JUNGLE, [ - MysteryEncounterType.SAFARI_ZONE - ]], - [ Biome.FAIRY_CAVE, []], - [ Biome.TEMPLE, []], - [ Biome.SLUM, []], - [ Biome.SNOWY_FOREST, []], - [ Biome.ISLAND, []], - [ Biome.LABORATORY, []] + [Biome.TOWN, []], + [Biome.PLAINS, [MysteryEncounterType.SLUMBERING_SNORLAX, MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.GRASS, [MysteryEncounterType.SLUMBERING_SNORLAX, MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.TALL_GRASS, [MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.METROPOLIS, []], + [Biome.FOREST, [MysteryEncounterType.SAFARI_ZONE, MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]], + [Biome.SWAMP, [MysteryEncounterType.SAFARI_ZONE]], + [Biome.BEACH, []], + [Biome.LAKE, []], + [Biome.SEABED, []], + [Biome.MOUNTAIN, []], + [Biome.BADLANDS, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.CAVE, [MysteryEncounterType.THE_STRONG_STUFF]], + [Biome.DESERT, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.ICE_CAVE, []], + [Biome.MEADOW, []], + [Biome.POWER_PLANT, []], + [Biome.VOLCANO, [MysteryEncounterType.FIERY_FALLOUT, MysteryEncounterType.DANCING_LESSONS]], + [Biome.GRAVEYARD, []], + [Biome.DOJO, []], + [Biome.FACTORY, []], + [Biome.RUINS, []], + [Biome.WASTELAND, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.ABYSS, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.SPACE, [MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER]], + [Biome.CONSTRUCTION_SITE, []], + [Biome.JUNGLE, [MysteryEncounterType.SAFARI_ZONE]], + [Biome.FAIRY_CAVE, []], + [Biome.TEMPLE, []], + [Biome.SLUM, []], + [Biome.SNOWY_FOREST, []], + [Biome.ISLAND, []], + [Biome.LABORATORY, []], ]); export function initMysteryEncounters() { @@ -364,7 +333,7 @@ export function initMysteryEncounters() { // Add ANY biome encounters to biome map // eslint-disable-next-line - let encounterBiomeTableLog = ""; + let _encounterBiomeTableLog = ""; mysteryEncountersByBiome.forEach((biomeEncounters, biome) => { anyBiomeEncounters.forEach(encounter => { if (!biomeEncounters.includes(encounter)) { @@ -372,7 +341,10 @@ export function initMysteryEncounters() { } }); - encounterBiomeTableLog += `${getBiomeName(biome).toUpperCase()}: [${biomeEncounters.map(type => MysteryEncounterType[type].toString().toLowerCase()).sort().join(", ")}]\n`; + _encounterBiomeTableLog += `${getBiomeName(biome).toUpperCase()}: [${biomeEncounters + .map(type => MysteryEncounterType[type].toString().toLowerCase()) + .sort() + .join(", ")}]\n`; }); //console.debug("All Mystery Encounters by Biome:\n" + encounterBiomeTableLog); diff --git a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts index f34d383dbbc..a7ffe3e26ca 100644 --- a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts +++ b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts @@ -1,8 +1,9 @@ -import BattleScene from "#app/battle-scene"; -import { Moves } from "#app/enums/moves"; -import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import type { Moves } from "#app/enums/moves"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import { isNullOrUndefined } from "#app/utils"; import { EncounterPokemonRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { globalScene } from "#app/global-scene"; /** * {@linkcode CanLearnMoveRequirement} options @@ -28,7 +29,7 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { constructor(requiredMoves: Moves | Moves[], options: CanLearnMoveRequirementOptions = {}) { super(); - this.requiredMoves = Array.isArray(requiredMoves) ? requiredMoves : [ requiredMoves ]; + this.requiredMoves = Array.isArray(requiredMoves) ? requiredMoves : [requiredMoves]; this.excludeLevelMoves = options.excludeLevelMoves ?? false; this.excludeTmMoves = options.excludeTmMoves ?? false; @@ -38,8 +39,10 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { this.invertQuery = options.invertQuery ?? false; } - override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty().filter((pkm) => (this.includeFainted ? pkm.isAllowed() : pkm.isAllowedInBattle())); + override meetsRequirement(): boolean { + const partyPokemon = globalScene + .getPlayerParty() + .filter(pkm => (this.includeFainted ? pkm.isAllowedInChallenge() : pkm.isAllowedInBattle())); if (isNullOrUndefined(partyPokemon) || this.requiredMoves?.length < 0) { return false; @@ -50,25 +53,24 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => + return partyPokemon.filter(pokemon => // every required move should be included - this.requiredMoves.every((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) - ); - } else { - return partyPokemon.filter( - (pokemon) => - // none of the "required" moves should be included - !this.requiredMoves.some((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) + this.requiredMoves.every(requiredMove => this.getAllPokemonMoves(pokemon).includes(requiredMove)), ); } + return partyPokemon.filter( + pokemon => + // none of the "required" moves should be included + !this.requiredMoves.some(requiredMove => this.getAllPokemonMoves(pokemon).includes(requiredMove)), + ); } - override getDialogueToken(_scene: BattleScene, _pokemon?: PlayerPokemon): [string, string] { - return [ "requiredMoves", this.requiredMoves.map(m => new PokemonMove(m).getName()).join(", ") ]; + override getDialogueToken(__pokemon?: PlayerPokemon): [string, string] { + return ["requiredMoves", this.requiredMoves.map(m => new PokemonMove(m).getName()).join(", ")]; } private getPokemonLevelMoves(pkm: PlayerPokemon): Moves[] { - return pkm.getLevelMoves().map(([ _level, move ]) => move); + return pkm.getLevelMoves().map(([_level, move]) => move); } private getAllPokemonMoves(pkm: PlayerPokemon): Moves[] { diff --git a/src/data/mystery-encounters/requirements/requirement-groups.ts b/src/data/mystery-encounters/requirements/requirement-groups.ts index 76bbb8f03a7..d9d62819fa6 100644 --- a/src/data/mystery-encounters/requirements/requirement-groups.ts +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -4,14 +4,7 @@ import { Abilities } from "#enums/abilities"; /** * Moves that "steal" things */ -export const STEALING_MOVES = [ - Moves.PLUCK, - Moves.COVET, - Moves.KNOCK_OFF, - Moves.THIEF, - Moves.TRICK, - Moves.SWITCHEROO -]; +export const STEALING_MOVES = [Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO]; /** * Moves that "charm" someone @@ -24,7 +17,7 @@ export const CHARMING_MOVES = [ Moves.ATTRACT, Moves.SWEET_SCENT, Moves.CAPTIVATE, - Moves.AROMATIC_MIST + Moves.AROMATIC_MIST, ]; /** @@ -42,7 +35,7 @@ export const DANCING_MOVES = [ Moves.QUIVER_DANCE, Moves.SWORDS_DANCE, Moves.TEETER_DANCE, - Moves.VICTORY_DANCE + Moves.VICTORY_DANCE, ]; /** @@ -60,7 +53,7 @@ export const DISTRACTION_MOVES = [ Moves.CAPTIVATE, Moves.RAGE_POWDER, Moves.SUBSTITUTE, - Moves.SHED_TAIL + Moves.SHED_TAIL, ]; /** @@ -79,7 +72,7 @@ export const PROTECTING_MOVES = [ Moves.CRAFTY_SHIELD, Moves.SPIKY_SHIELD, Moves.OBSTRUCT, - Moves.DETECT + Moves.DETECT, ]; /** @@ -116,7 +109,7 @@ export const EXTORTION_ABILITIES = [ Abilities.ARENA_TRAP, Abilities.SHADOW_TAG, Abilities.SUCTION_CUPS, - Abilities.STICKY_HOLD + Abilities.STICKY_HOLD, ]; /** @@ -133,5 +126,5 @@ export const FIRE_RESISTANT_ABILITIES = [ Abilities.MAGMA_ARMOR, Abilities.WATER_VEIL, Abilities.STEAM_ENGINE, - Abilities.PRIMORDIAL_SEA + Abilities.PRIMORDIAL_SEA, ]; diff --git a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts index c4d5e47cb05..94790145687 100644 --- a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts @@ -1,40 +1,41 @@ -import BattleScene from "#app/battle-scene"; -import { getTextWithColors, TextStyle } from "#app/ui/text"; +import { globalScene } from "#app/global-scene"; +import type { TextStyle } from "#app/ui/text"; +import { getTextWithColors } from "#app/ui/text"; import { UiTheme } from "#enums/ui-theme"; import { isNullOrUndefined } from "#app/utils"; import i18next from "i18next"; /** - * Will inject all relevant dialogue tokens that exist in the {@linkcode BattleScene.currentBattle.mysteryEncounter.dialogueTokens}, into i18n text. + * Will inject all relevant dialogue tokens that exist in the {@linkcode BattlegScene.currentBattle.mysteryEncounter.dialogueTokens}, into i18n text. * Also adds BBCodeText fragments for colored text, if applicable - * @param scene * @param keyOrString * @param primaryStyle Can define a text style to be applied to the entire string. Must be defined for BBCodeText styles to be applied correctly - * @param uiTheme */ -export function getEncounterText(scene: BattleScene, keyOrString?: string, primaryStyle?: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string | null { +export function getEncounterText(keyOrString?: string, primaryStyle?: TextStyle): string | null { if (isNullOrUndefined(keyOrString)) { return null; } - let textString: string | null = getTextWithDialogueTokens(scene, keyOrString); + const uiTheme = globalScene.uiTheme ?? UiTheme.DEFAULT; + + let textString: string | null = getTextWithDialogueTokens(keyOrString); // Can only color the text if a Primary Style is defined // primaryStyle is applied to all text that does not have its own specified style if (primaryStyle && textString) { - textString = getTextWithColors(textString, primaryStyle, uiTheme); + textString = getTextWithColors(textString, primaryStyle, uiTheme, true); } return textString; } /** - * Helper function to inject {@linkcode BattleScene.currentBattle.mysteryEncounter.dialogueTokens} into a given content string + * Helper function to inject {@linkcode globalScene.currentBattle.mysteryEncounter.dialogueTokens} into a given content string * @param scene * @param keyOrString */ -function getTextWithDialogueTokens(scene: BattleScene, keyOrString: string): string | null { - const tokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; +function getTextWithDialogueTokens(keyOrString: string): string | null { + const tokens = globalScene.currentBattle?.mysteryEncounter?.dialogueTokens; if (i18next.exists(keyOrString, tokens)) { return i18next.t(keyOrString, tokens) as string; @@ -48,9 +49,9 @@ function getTextWithDialogueTokens(scene: BattleScene, keyOrString: string): str * @param scene * @param contentKey */ -export function queueEncounterMessage(scene: BattleScene, contentKey: string): void { - const text: string | null = getEncounterText(scene, contentKey); - scene.queueMessage(text ?? "", null, true); +export function queueEncounterMessage(contentKey: string): void { + const text: string | null = getEncounterText(contentKey); + globalScene.queueMessage(text ?? "", null, true); } /** @@ -62,10 +63,16 @@ export function queueEncounterMessage(scene: BattleScene, contentKey: string): v * @param callbackDelay * @param promptDelay */ -export function showEncounterText(scene: BattleScene, contentKey: string, delay: number | null = null, callbackDelay: number = 0, prompt: boolean = true, promptDelay: number | null = null): Promise { +export function showEncounterText( + contentKey: string, + delay: number | null = null, + callbackDelay = 0, + prompt = true, + promptDelay: number | null = null, +): Promise { return new Promise(resolve => { - const text: string | null = getEncounterText(scene, contentKey); - scene.ui.showText(text ?? "", delay, () => resolve(), callbackDelay, prompt, promptDelay); + const text: string | null = getEncounterText(contentKey); + globalScene.ui.showText(text ?? "", delay, () => resolve(), callbackDelay, prompt, promptDelay); }); } @@ -77,10 +84,15 @@ export function showEncounterText(scene: BattleScene, contentKey: string, delay: * @param speakerContentKey * @param callbackDelay */ -export function showEncounterDialogue(scene: BattleScene, textContentKey: string, speakerContentKey: string, delay: number | null = null, callbackDelay: number = 0): Promise { +export function showEncounterDialogue( + textContentKey: string, + speakerContentKey: string, + delay: number | null = null, + callbackDelay = 0, +): Promise { return new Promise(resolve => { - const text: string | null = getEncounterText(scene, textContentKey); - const speaker: string | null = getEncounterText(scene, speakerContentKey); - scene.ui.showDialogue(text ?? "", speaker ?? "", delay, () => resolve(), callbackDelay); + const text: string | null = getEncounterText(textContentKey); + const speaker: string | null = getEncounterText(speakerContentKey); + globalScene.ui.showDialogue(text ?? "", speaker ?? "", delay, () => resolve(), callbackDelay); }); } diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 5cd2fbffd5f..d37ac340a7c 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -1,34 +1,55 @@ -import Battle, { BattlerIndex, BattleType } from "#app/battle"; +import type Battle from "#app/battle"; +import { BattlerIndex, BattleType } from "#app/battle"; import { biomeLinks, BiomePoolTier } from "#app/data/balance/biomes"; -import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; -import { AVERAGE_ENCOUNTERS_PER_RUN_TARGET, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; +import type MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; +import { + AVERAGE_ENCOUNTERS_PER_RUN_TARGET, + WEIGHT_INCREMENT_ON_SPAWN_MISS, +} from "#app/data/mystery-encounters/mystery-encounters"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import Pokemon, { AiType, FieldPosition, PlayerPokemon, PokemonMove, PokemonSummonData } from "#app/field/pokemon"; -import { CustomModifierSettings, ModifierPoolType, ModifierType, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; -import { MysteryEncounterBattlePhase, MysteryEncounterBattleStartCleanupPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; -import PokemonData from "#app/system/pokemon-data"; -import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; -import { PartyOption, PartyUiMode, PokemonSelectFilter } from "#app/ui/party-ui-handler"; +import type { AiType, PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { EnemyPokemon, FieldPosition, PokemonMove, PokemonSummonData } from "#app/field/pokemon"; +import type { CustomModifierSettings, ModifierType } from "#app/modifier/modifier-type"; +import { + getPartyLuckValue, + ModifierPoolType, + ModifierTypeGenerator, + ModifierTypeOption, + modifierTypes, + regenerateModifierPoolThresholds, +} from "#app/modifier/modifier-type"; +import { + MysteryEncounterBattlePhase, + MysteryEncounterBattleStartCleanupPhase, + MysteryEncounterPhase, + MysteryEncounterRewardsPhase, +} from "#app/phases/mystery-encounter-phases"; +import type PokemonData from "#app/system/pokemon-data"; +import type { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import type { PartyOption, PokemonSelectFilter } from "#app/ui/party-ui-handler"; +import { PartyUiMode } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; -import { isNullOrUndefined } from "#app/utils"; -import { BattlerTagType } from "#enums/battler-tag-type"; +import { isNullOrUndefined, randSeedInt, randSeedItem } from "#app/utils"; +import type { BattlerTagType } from "#enums/battler-tag-type"; import { Biome } from "#enums/biome"; -import { TrainerType } from "#enums/trainer-type"; +import type { TrainerType } from "#enums/trainer-type"; import i18next from "i18next"; -import BattleScene from "#app/battle-scene"; import Trainer, { TrainerVariant } from "#app/field/trainer"; -import { Gender } from "#app/data/gender"; -import { Nature } from "#app/data/nature"; -import { Moves } from "#enums/moves"; +import type { Gender } from "#app/data/gender"; +import type { Nature } from "#enums/nature"; +import type { Moves } from "#enums/moves"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; -import { Status, StatusEffect } from "#app/data/status-effect"; -import { TrainerConfig, trainerConfigs, TrainerSlot } from "#app/data/trainer-config"; -import PokemonSpecies from "#app/data/pokemon-species"; -import { Egg, IEggOptions } from "#app/data/egg"; -import { CustomPokemonData } from "#app/data/custom-pokemon-data"; -import HeldModifierConfig from "#app/interfaces/held-modifier-config"; +import { Status } from "#app/data/status-effect"; +import type { TrainerConfig } from "#app/data/trainer-config"; +import { trainerConfigs, TrainerSlot } from "#app/data/trainer-config"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import type { IEggOptions } from "#app/data/egg"; +import { Egg } from "#app/data/egg"; +import type { CustomPokemonData } from "#app/data/custom-pokemon-data"; +import type HeldModifierConfig from "#app/interfaces/held-modifier-config"; import { MovePhase } from "#app/phases/move-phase"; import { EggLapsePhase } from "#app/phases/egg-lapse-phase"; import { TrainerVictoryPhase } from "#app/phases/trainer-victory-phase"; @@ -36,33 +57,39 @@ import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { GameOverPhase } from "#app/phases/game-over-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { PartyExpPhase } from "#app/phases/party-exp-phase"; -import { Variant } from "#app/data/variant"; +import type { Variant } from "#app/data/variant"; +import { StatusEffect } from "#enums/status-effect"; +import { globalScene } from "#app/global-scene"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { PokemonType } from "#enums/pokemon-type"; +import { getNatureName } from "#app/data/nature"; +import { getPokemonNameWithAffix } from "#app/messages"; /** * Animates exclamation sprite over trainer's head at start of encounter * @param scene */ -export function doTrainerExclamation(scene: BattleScene) { - const exclamationSprite = scene.add.sprite(0, 0, "encounter_exclaim"); +export function doTrainerExclamation() { + const exclamationSprite = globalScene.add.sprite(0, 0, "encounter_exclaim"); exclamationSprite.setName("exclamation"); - scene.field.add(exclamationSprite); - scene.field.moveTo(exclamationSprite, scene.field.getAll().length - 1); + globalScene.field.add(exclamationSprite); + globalScene.field.moveTo(exclamationSprite, globalScene.field.getAll().length - 1); exclamationSprite.setVisible(true); exclamationSprite.setPosition(110, 68); - scene.tweens.add({ + globalScene.tweens.add({ targets: exclamationSprite, y: "-=25", ease: "Cubic.easeOut", duration: 300, yoyo: true, onComplete: () => { - scene.time.delayedCall(800, () => { - scene.field.remove(exclamationSprite, true); + globalScene.time.delayedCall(800, () => { + globalScene.field.remove(exclamationSprite, true); }); - } + }, }); - scene.playSound("battle_anims/GEN8- Exclaim", { volume: 0.7 }); + globalScene.playSound("battle_anims/GEN8- Exclaim", { volume: 0.7 }); } export interface EnemyPokemonConfig { @@ -89,6 +116,7 @@ export interface EnemyPokemonConfig { modifierConfigs?: HeldModifierConfig[]; tags?: BattlerTagType[]; dataSource?: PokemonData; + tera?: PokemonType; aiType?: AiType; } @@ -113,14 +141,13 @@ export interface EnemyPartyConfig { * Generates an enemy party for a mystery encounter battle * This will override and replace any standard encounter generation logic * Useful for tailoring specific battles to mystery encounters - * @param scene Battle Scene * @param partyConfig Can pass various customizable attributes for the enemy party, see EnemyPartyConfig */ -export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: EnemyPartyConfig): Promise { +export async function initBattleWithEnemyConfig(partyConfig: EnemyPartyConfig): Promise { const loaded: boolean = false; const loadEnemyAssets: Promise[] = []; - const battle: Battle = scene.currentBattle; + const battle: Battle = globalScene.currentBattle; let doubleBattle: boolean = partyConfig?.doubleBattle ?? false; @@ -129,34 +156,46 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: const partyTrainerConfig = partyConfig?.trainerConfig; let trainerConfig: TrainerConfig; if (!isNullOrUndefined(trainerType) || partyTrainerConfig) { - scene.currentBattle.mysteryEncounter!.encounterMode = MysteryEncounterMode.TRAINER_BATTLE; - if (scene.currentBattle.trainer) { - scene.currentBattle.trainer.setVisible(false); - scene.currentBattle.trainer.destroy(); + globalScene.currentBattle.mysteryEncounter!.encounterMode = MysteryEncounterMode.TRAINER_BATTLE; + if (globalScene.currentBattle.trainer) { + globalScene.currentBattle.trainer.setVisible(false); + globalScene.currentBattle.trainer.destroy(); } trainerConfig = partyTrainerConfig ? partyTrainerConfig : trainerConfigs[trainerType!]; const doubleTrainer = trainerConfig.doubleOnly || (trainerConfig.hasDouble && !!partyConfig.doubleBattle); doubleBattle = doubleTrainer; - const trainerFemale = isNullOrUndefined(partyConfig.female) ? !!(Utils.randSeedInt(2)) : partyConfig.female; - const newTrainer = new Trainer(scene, trainerConfig.trainerType, doubleTrainer ? TrainerVariant.DOUBLE : trainerFemale ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, undefined, undefined, undefined, trainerConfig); + const trainerFemale = isNullOrUndefined(partyConfig.female) ? !!Utils.randSeedInt(2) : partyConfig.female; + const newTrainer = new Trainer( + trainerConfig.trainerType, + doubleTrainer ? TrainerVariant.DOUBLE : trainerFemale ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, + undefined, + undefined, + undefined, + trainerConfig, + ); newTrainer.x += 300; newTrainer.setVisible(false); - scene.field.add(newTrainer); - scene.currentBattle.trainer = newTrainer; + globalScene.field.add(newTrainer); + globalScene.currentBattle.trainer = newTrainer; loadEnemyAssets.push(newTrainer.loadAssets().then(() => newTrainer.initSprite())); - battle.enemyLevels = scene.currentBattle.trainer.getPartyLevels(scene.currentBattle.waveIndex); + battle.enemyLevels = globalScene.currentBattle.trainer.getPartyLevels(globalScene.currentBattle.waveIndex); } else { // Wild - scene.currentBattle.mysteryEncounter!.encounterMode = MysteryEncounterMode.WILD_BATTLE; - const numEnemies = partyConfig?.pokemonConfigs && partyConfig.pokemonConfigs.length > 0 ? partyConfig?.pokemonConfigs?.length : doubleBattle ? 2 : 1; - battle.enemyLevels = new Array(numEnemies).fill(null).map(() => scene.currentBattle.getLevelForWave()); + globalScene.currentBattle.mysteryEncounter!.encounterMode = MysteryEncounterMode.WILD_BATTLE; + const numEnemies = + partyConfig?.pokemonConfigs && partyConfig.pokemonConfigs.length > 0 + ? partyConfig?.pokemonConfigs?.length + : doubleBattle + ? 2 + : 1; + battle.enemyLevels = new Array(numEnemies).fill(null).map(() => globalScene.currentBattle.getLevelForWave()); } - scene.getEnemyParty().forEach(enemyPokemon => { - scene.field.remove(enemyPokemon, true); + globalScene.getEnemyParty().forEach(enemyPokemon => { + enemyPokemon.leaveField(true, true, true); }); battle.enemyParty = []; battle.double = doubleBattle; @@ -167,12 +206,12 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: // levelAdditiveModifier value of 0.5 will halve the modifier scaling, 2 will double it, etc. // Leaving null/undefined will disable level scaling const mult: number = !isNullOrUndefined(partyConfig.levelAdditiveModifier) ? partyConfig.levelAdditiveModifier : 0; - const additive = Math.max(Math.round((scene.currentBattle.waveIndex / 10) * mult), 0); + const additive = Math.max(Math.round((globalScene.currentBattle.waveIndex / 10) * mult), 0); battle.enemyLevels = battle.enemyLevels.map(level => level + additive); battle.enemyLevels.forEach((level, e) => { - let enemySpecies; - let dataSource; + let enemySpecies: PokemonSpecies | undefined; + let dataSource: PokemonData | undefined; let isBoss = false; if (!loaded) { if ((!isNullOrUndefined(trainerType) || trainerConfig) && battle.trainer) { @@ -183,7 +222,14 @@ 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] = globalScene.addEnemyPokemon( + enemySpecies, + level, + TrainerSlot.TRAINER, + isBoss, + false, + dataSource, + ); } else { battle.enemyParty[e] = battle.trainer.genPartyMember(e); } @@ -195,17 +241,24 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemySpecies = config.species; isBoss = config.isBoss; if (isBoss) { - scene.currentBattle.mysteryEncounter!.encounterMode = MysteryEncounterMode.BOSS_BATTLE; + globalScene.currentBattle.mysteryEncounter!.encounterMode = MysteryEncounterMode.BOSS_BATTLE; } } else { - enemySpecies = scene.randomSpecies(battle.waveIndex, level, true); + enemySpecies = globalScene.randomSpecies(battle.waveIndex, level, true); } - battle.enemyParty[e] = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, isBoss, dataSource); + battle.enemyParty[e] = globalScene.addEnemyPokemon( + enemySpecies, + level, + TrainerSlot.NONE, + isBoss, + false, + dataSource, + ); } } - const enemyPokemon = scene.getEnemyParty()[e]; + const enemyPokemon = globalScene.getEnemyParty()[e]; // Make sure basic data is clean enemyPokemon.hp = enemyPokemon.getMaxHp(); @@ -217,8 +270,8 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemyPokemon.resetSummonData(); } - if (!loaded && isNullOrUndefined(partyConfig.countAsSeen) || partyConfig.countAsSeen) { - scene.gameData.setPokemonSeen(enemyPokemon, true, !!(trainerType || trainerConfig)); + if ((!loaded && isNullOrUndefined(partyConfig.countAsSeen)) || partyConfig.countAsSeen) { + globalScene.gameData.setPokemonSeen(enemyPokemon, true, !!(trainerType || trainerConfig)); } if (partyConfig?.pokemonConfigs && e < partyConfig.pokemonConfigs.length) { @@ -256,7 +309,9 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: // Set Boss if (config.isBoss) { - let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments! : scene.getEncounterBossSegments(scene.currentBattle.waveIndex, level, enemySpecies, true); + let segments = !isNullOrUndefined(config.bossSegments) + ? config.bossSegments! + : globalScene.getEncounterBossSegments(globalScene.currentBattle.waveIndex, level, enemySpecies, true); if (!isNullOrUndefined(config.bossSegmentModifier)) { segments += config.bossSegmentModifier; } @@ -283,7 +338,11 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: if (statusEffects) { // Default to cureturn 3 for sleep const status = Array.isArray(statusEffects) ? statusEffects[0] : statusEffects; - const cureTurn = Array.isArray(statusEffects) ? statusEffects[1] : statusEffects === StatusEffect.SLEEP ? 3 : undefined; + const cureTurn = Array.isArray(statusEffects) + ? statusEffects[1] + : statusEffects === StatusEffect.SLEEP + ? 3 + : undefined; enemyPokemon.status = new Status(status, 0, cureTurn); } @@ -321,6 +380,14 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: tags.forEach(tag => enemyPokemon.addTag(tag)); } + // Set tera + if (config.tera && config.tera !== PokemonType.UNKNOWN) { + enemyPokemon.teraType = config.tera; + if (battle.trainer) { + battle.trainer.config.setInstantTera(e); + } + } + // mysteryEncounterBattleEffects will only be used IFF MYSTERY_ENCOUNTER_POST_SUMMON tag is applied if (config.mysteryEncounterBattleEffects) { enemyPokemon.mysteryEncounterBattleEffects = config.mysteryEncounterBattleEffects; @@ -339,10 +406,34 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: loadEnemyAssets.push(enemyPokemon.loadAssets()); - console.log(`Pokemon: ${enemyPokemon.name}`, `Species ID: ${enemyPokemon.species.speciesId}`, `Stats: ${enemyPokemon.stats}`, `Ability: ${enemyPokemon.getAbility().name}`, `Passive Ability: ${enemyPokemon.getPassiveAbility().name}`); + const stats: string[] = [ + `HP: ${enemyPokemon.stats[0]} (${enemyPokemon.ivs[0]})`, + ` Atk: ${enemyPokemon.stats[1]} (${enemyPokemon.ivs[1]})`, + ` Def: ${enemyPokemon.stats[2]} (${enemyPokemon.ivs[2]})`, + ` Spatk: ${enemyPokemon.stats[3]} (${enemyPokemon.ivs[3]})`, + ` Spdef: ${enemyPokemon.stats[4]} (${enemyPokemon.ivs[4]})`, + ` Spd: ${enemyPokemon.stats[5]} (${enemyPokemon.ivs[5]})`, + ]; + const moveset: string[] = []; + enemyPokemon.getMoveset().forEach(move => { + moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR + }); + + console.log( + `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, + `| Species ID: ${enemyPokemon.species.speciesId}`, + `| Nature: ${getNatureName(enemyPokemon.nature, true, true, true)}`, + ); + console.log(`Stats (IVs): ${stats}`); + console.log( + `Ability: ${enemyPokemon.getAbility().name}`, + `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}`, + ); + console.log("Moveset:", moveset); }); - scene.pushPhase(new MysteryEncounterBattlePhase(scene, partyConfig.disableSwitch)); + globalScene.pushPhase(new MysteryEncounterBattlePhase(partyConfig.disableSwitch)); await Promise.all(loadEnemyAssets); battle.enemyParty.forEach((enemyPokemon_2, e_1) => { @@ -356,11 +447,14 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } }); if (!loaded) { - regenerateModifierPoolThresholds(scene.getEnemyField(), battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD); + regenerateModifierPoolThresholds( + globalScene.getEnemyField(), + battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, + ); const customModifierTypes = partyConfig?.pokemonConfigs ?.filter(config => config?.modifierConfigs) .map(config => config.modifierConfigs!); - scene.generateEnemyModifiers(customModifierTypes); + globalScene.generateEnemyModifiers(customModifierTypes); } } @@ -369,45 +463,53 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: * See: [startOfBattleEffects](IMysteryEncounter.startOfBattleEffects) for more details * * This promise does not need to be awaited on if called in an encounter onInit (will just load lazily) - * @param scene * @param moves */ -export function loadCustomMovesForEncounter(scene: BattleScene, moves: Moves | Moves[]) { - moves = Array.isArray(moves) ? moves : [ moves ]; - return Promise.all(moves.map(move => initMoveAnim(scene, move))) - .then(() => loadMoveAnimAssets(scene, moves)); +export function loadCustomMovesForEncounter(moves: Moves | Moves[]) { + moves = Array.isArray(moves) ? moves : [moves]; + return Promise.all(moves.map(move => initMoveAnim(move))).then(() => loadMoveAnimAssets(moves)); } /** * Will update player money, and animate change (sound optional) - * @param scene * @param changeValue * @param playSound * @param showMessage */ -export function updatePlayerMoney(scene: BattleScene, changeValue: number, playSound: boolean = true, showMessage: boolean = true) { - scene.money = Math.min(Math.max(scene.money + changeValue, 0), Number.MAX_SAFE_INTEGER); - scene.updateMoneyText(); - scene.animateMoneyChanged(false); +export function updatePlayerMoney(changeValue: number, playSound = true, showMessage = true) { + globalScene.money = Math.min(Math.max(globalScene.money + changeValue, 0), Number.MAX_SAFE_INTEGER); + globalScene.updateMoneyText(); + globalScene.animateMoneyChanged(false); if (playSound) { - scene.playSound("se/buy"); + globalScene.playSound("se/buy"); } if (showMessage) { if (changeValue < 0) { - scene.queueMessage(i18next.t("mysteryEncounterMessages:paid_money", { amount: -changeValue }), null, true); + globalScene.queueMessage( + i18next.t("mysteryEncounterMessages:paid_money", { + amount: -changeValue, + }), + null, + true, + ); } else { - scene.queueMessage(i18next.t("mysteryEncounterMessages:receive_money", { amount: changeValue }), null, true); + globalScene.queueMessage( + i18next.t("mysteryEncounterMessages:receive_money", { + amount: changeValue, + }), + null, + true, + ); } } } /** * Converts modifier bullshit to an actual item - * @param scene Battle Scene * @param modifier * @param pregenArgs Can specify BerryType for berries, TM for TMs, AttackBoostType for item, etc. */ -export function generateModifierType(scene: BattleScene, modifier: () => ModifierType, pregenArgs?: any[]): ModifierType | null { +export function generateModifierType(modifier: () => ModifierType, pregenArgs?: any[]): ModifierType | null { const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifier); if (!modifierId) { return null; @@ -418,19 +520,23 @@ export function generateModifierType(scene: BattleScene, modifier: () => Modifie // Populates item id and tier (order matters) result = result .withIdFromFunc(modifierTypes[modifierId]) - .withTierFromPool(); + .withTierFromPool(ModifierPoolType.PLAYER, globalScene.getPlayerParty()); - return result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; + return result instanceof ModifierTypeGenerator + ? result.generateType(globalScene.getPlayerParty(), pregenArgs) + : result; } /** * Converts modifier bullshit to an actual item - * @param scene - Battle Scene * @param modifier * @param pregenArgs - can specify BerryType for berries, TM for TMs, AttackBoostType for item, etc. */ -export function generateModifierTypeOption(scene: BattleScene, modifier: () => ModifierType, pregenArgs?: any[]): ModifierTypeOption | null { - const result = generateModifierType(scene, modifier, pregenArgs); +export function generateModifierTypeOption( + modifier: () => ModifierType, + pregenArgs?: any[], +): ModifierTypeOption | null { + const result = generateModifierType(modifier, pregenArgs); if (result) { return new ModifierTypeOption(result, 0); } @@ -439,86 +545,105 @@ export function generateModifierTypeOption(scene: BattleScene, modifier: () => M /** * This function is intended for use inside onPreOptionPhase() of an encounter option - * @param scene * @param onPokemonSelected - Any logic that needs to be performed when Pokemon is chosen * If a second option needs to be selected, onPokemonSelected should return a OptionSelectItem[] object * @param onPokemonNotSelected - Any logic that needs to be performed if no Pokemon is chosen * @param selectablePokemonFilter */ -export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], onPokemonNotSelected?: () => void, selectablePokemonFilter?: PokemonSelectFilter): Promise { +export function selectPokemonForOption( + // biome-ignore lint/suspicious/noConfusingVoidType: Takes a function that either returns void or an array of OptionSelectItem + onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], + onPokemonNotSelected?: () => void, + selectablePokemonFilter?: PokemonSelectFilter, +): Promise { return new Promise(resolve => { - const modeToSetOnExit = scene.ui.getMode(); + const modeToSetOnExit = globalScene.ui.getMode(); // Open party screen to choose pokemon - scene.ui.setMode(Mode.PARTY, PartyUiMode.SELECT, -1, (slotIndex: number, option: PartyOption) => { - if (slotIndex < scene.getParty().length) { - scene.ui.setMode(modeToSetOnExit).then(() => { - const pokemon = scene.getParty()[slotIndex]; - const secondaryOptions = onPokemonSelected(pokemon); - if (!secondaryOptions) { - scene.currentBattle.mysteryEncounter!.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - resolve(true); - return; - } + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.SELECT, + -1, + (slotIndex: number, _option: PartyOption) => { + if (slotIndex < globalScene.getPlayerParty().length) { + globalScene.ui.setMode(modeToSetOnExit).then(() => { + const pokemon = globalScene.getPlayerParty()[slotIndex]; + const secondaryOptions = onPokemonSelected(pokemon); + if (!secondaryOptions) { + globalScene.currentBattle.mysteryEncounter!.setDialogueToken( + "selectedPokemon", + pokemon.getNameToRender(), + ); + resolve(true); + return; + } - // There is a second option to choose after selecting the Pokemon - scene.ui.setMode(Mode.MESSAGE).then(() => { - const displayOptions = () => { - // Always appends a cancel option to bottom of options - const fullOptions = secondaryOptions.map(option => { - // Update handler to resolve promise - const onSelect = option.handler; - option.handler = () => { - onSelect(); - scene.currentBattle.mysteryEncounter!.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - resolve(true); - return true; + // There is a second option to choose after selecting the Pokemon + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + const displayOptions = () => { + // Always appends a cancel option to bottom of options + const fullOptions = secondaryOptions + .map(option => { + // Update handler to resolve promise + const onSelect = option.handler; + option.handler = () => { + onSelect(); + globalScene.currentBattle.mysteryEncounter!.setDialogueToken( + "selectedPokemon", + pokemon.getNameToRender(), + ); + resolve(true); + return true; + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + globalScene.ui.clearText(); + globalScene.ui.setMode(modeToSetOnExit); + resolve(false); + return true; + }, + onHover: () => { + showEncounterText(i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); + }, + }); + + const config: OptionSelectConfig = { + options: fullOptions, + maxOptions: 7, + yOffset: 0, + supportHover: true, }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - scene.ui.clearText(); - scene.ui.setMode(modeToSetOnExit); - resolve(false); - return true; - }, - onHover: () => { - showEncounterText(scene, i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); - } - }); - const config: OptionSelectConfig = { - options: fullOptions, - maxOptions: 7, - yOffset: 0, - supportHover: true + // Do hover over the starting selection option + if (fullOptions[0].onHover) { + fullOptions[0].onHover(); + } + globalScene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); }; - // Do hover over the starting selection option - if (fullOptions[0].onHover) { - fullOptions[0].onHover(); + const textPromptKey = + globalScene.currentBattle.mysteryEncounter?.selectedOption?.dialogue?.secondOptionPrompt; + if (!textPromptKey) { + displayOptions(); + } else { + showEncounterText(textPromptKey).then(() => displayOptions()); } - scene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); - }; - - const textPromptKey = scene.currentBattle.mysteryEncounter?.selectedOption?.dialogue?.secondOptionPrompt; - if (!textPromptKey) { - displayOptions(); - } else { - showEncounterText(scene, textPromptKey).then(() => displayOptions()); - } + }); }); - }); - } else { - scene.ui.setMode(modeToSetOnExit).then(() => { - if (onPokemonNotSelected) { - onPokemonNotSelected(); - } - resolve(false); - }); - } - }, selectablePokemonFilter); + } else { + globalScene.ui.setMode(modeToSetOnExit).then(() => { + if (onPokemonNotSelected) { + onPokemonNotSelected(); + } + resolve(false); + }); + } + }, + selectablePokemonFilter, + ); }); } @@ -528,33 +653,38 @@ interface PokemonAndOptionSelected { } /** - * This function is intended for use inside onPreOptionPhase() of an encounter option - * @param scene - * If a second option needs to be selected, onPokemonSelected should return a OptionSelectItem[] object + * This function is intended for use inside `onPreOptionPhase()` of an encounter option + * + * If a second option needs to be selected, `onPokemonSelected` should return a {@linkcode OptionSelectItem}`[]` object * @param options * @param optionSelectPromptKey * @param selectablePokemonFilter * @param onHoverOverCancelOption */ -export function selectOptionThenPokemon(scene: BattleScene, options: OptionSelectItem[], optionSelectPromptKey: string, selectablePokemonFilter?: PokemonSelectFilter, onHoverOverCancelOption?: () => void): Promise { +export function selectOptionThenPokemon( + options: OptionSelectItem[], + optionSelectPromptKey: string, + selectablePokemonFilter?: PokemonSelectFilter, + onHoverOverCancelOption?: () => void, +): Promise { return new Promise(resolve => { - const modeToSetOnExit = scene.ui.getMode(); + const modeToSetOnExit = globalScene.ui.getMode(); const displayOptions = (config: OptionSelectConfig) => { - scene.ui.setMode(Mode.MESSAGE).then(() => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { if (!optionSelectPromptKey) { // Do hover over the starting selection option if (fullOptions[0].onHover) { fullOptions[0].onHover(); } - scene.ui.setMode(Mode.OPTION_SELECT, config); + globalScene.ui.setMode(Mode.OPTION_SELECT, config); } else { - showEncounterText(scene, optionSelectPromptKey).then(() => { + showEncounterText(optionSelectPromptKey).then(() => { // Do hover over the starting selection option if (fullOptions[0].onHover) { fullOptions[0].onHover(); } - scene.ui.setMode(Mode.OPTION_SELECT, config); + globalScene.ui.setMode(Mode.OPTION_SELECT, config); }); } }); @@ -562,51 +692,62 @@ export function selectOptionThenPokemon(scene: BattleScene, options: OptionSelec const selectPokemonAfterOption = (selectedOptionIndex: number) => { // Open party screen to choose a Pokemon - scene.ui.setMode(Mode.PARTY, PartyUiMode.SELECT, -1, (slotIndex: number, option: PartyOption) => { - if (slotIndex < scene.getParty().length) { - // Pokemon and option selected - scene.ui.setMode(modeToSetOnExit).then(() => { - const result: PokemonAndOptionSelected = { selectedPokemonIndex: slotIndex, selectedOptionIndex: selectedOptionIndex }; - resolve(result); - }); - } else { - // Back to first option select screen - displayOptions(config); - } - }, selectablePokemonFilter); + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.SELECT, + -1, + (slotIndex: number, _option: PartyOption) => { + if (slotIndex < globalScene.getPlayerParty().length) { + // Pokemon and option selected + globalScene.ui.setMode(modeToSetOnExit).then(() => { + const result: PokemonAndOptionSelected = { + selectedPokemonIndex: slotIndex, + selectedOptionIndex: selectedOptionIndex, + }; + resolve(result); + }); + } else { + // Back to first option select screen + displayOptions(config); + } + }, + selectablePokemonFilter, + ); }; // Always appends a cancel option to bottom of options - const fullOptions = options.map((option, index) => { - // Update handler to resolve promise - const onSelect = option.handler; - option.handler = () => { - onSelect(); - selectPokemonAfterOption(index); - return true; - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - scene.ui.clearText(); - scene.ui.setMode(modeToSetOnExit); - resolve(null); - return true; - }, - onHover: () => { - if (onHoverOverCancelOption) { - onHoverOverCancelOption(); - } - showEncounterText(scene, i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); - } - }); + const fullOptions = options + .map((option, index) => { + // Update handler to resolve promise + const onSelect = option.handler; + option.handler = () => { + onSelect(); + selectPokemonAfterOption(index); + return true; + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + globalScene.ui.clearText(); + globalScene.ui.setMode(modeToSetOnExit); + resolve(null); + return true; + }, + onHover: () => { + if (onHoverOverCancelOption) { + onHoverOverCancelOption(); + } + showEncounterText(i18next.t("mysteryEncounterMessages:cancel_option"), 0, 0, false); + }, + }); const config: OptionSelectConfig = { options: fullOptions, maxOptions: 7, yOffset: 0, - supportHover: true + supportHover: true, }; displayOptions(config); @@ -616,27 +757,30 @@ export function selectOptionThenPokemon(scene: BattleScene, options: OptionSelec /** * Will initialize reward phases to follow the mystery encounter * Can have shop displayed or skipped - * @param scene - Battle Scene * @param customShopRewards - adds a shop phase with the specified rewards / reward tiers * @param eggRewards * @param preRewardsCallback - can execute an arbitrary callback before the new phases if necessary (useful for updating items/party/injecting new phases before {@linkcode MysteryEncounterRewardsPhase}) */ -export function setEncounterRewards(scene: BattleScene, customShopRewards?: CustomModifierSettings, eggRewards?: IEggOptions[], preRewardsCallback?: Function) { - scene.currentBattle.mysteryEncounter!.doEncounterRewards = (scene: BattleScene) => { +export function setEncounterRewards( + customShopRewards?: CustomModifierSettings, + eggRewards?: IEggOptions[], + preRewardsCallback?: Function, +) { + globalScene.currentBattle.mysteryEncounter!.doEncounterRewards = () => { if (preRewardsCallback) { preRewardsCallback(); } if (customShopRewards) { - scene.unshiftPhase(new SelectModifierPhase(scene, 0, undefined, customShopRewards)); + globalScene.unshiftPhase(new SelectModifierPhase(0, undefined, customShopRewards)); } else { - scene.tryRemovePhase(p => p instanceof SelectModifierPhase); + globalScene.tryRemovePhase(p => p instanceof SelectModifierPhase); } if (eggRewards) { eggRewards.forEach(eggOptions => { const egg = new Egg(eggOptions); - egg.addEggToGameData(scene); + egg.addEggToGameData(); }); } @@ -647,10 +791,11 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust /** * Will initialize exp phases into the phase queue (these are in addition to any combat or other exp earned) * Exp Share and Exp Balance will still function as normal - * @param scene - Battle Scene * @param participantId - id/s of party pokemon that get full exp value. Other party members will receive Exp Share amounts * @param baseExpValue - gives exp equivalent to a pokemon of the wave index's level. + * * Guidelines: + * ```md * 36 - Sunkern (lowest in game) * 62-64 - regional starter base evos * 100 - Scyther @@ -659,14 +804,15 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust * 290 - trio legendaries * 340 - box legendaries * 608 - Blissey (highest in game) + * ``` * https://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_effort_value_yield_(Generation_IX) * @param useWaveIndex - set to false when directly passing the the full exp value instead of baseExpValue */ -export function setEncounterExp(scene: BattleScene, participantId: number | number[], baseExpValue: number, useWaveIndex: boolean = true) { - const participantIds = Array.isArray(participantId) ? participantId : [ participantId ]; +export function setEncounterExp(participantId: number | number[], baseExpValue: number, useWaveIndex = true) { + const participantIds = Array.isArray(participantId) ? participantId : [participantId]; - scene.currentBattle.mysteryEncounter!.doEncounterExp = (scene: BattleScene) => { - scene.unshiftPhase(new PartyExpPhase(scene, baseExpValue, useWaveIndex, new Set(participantIds))); + globalScene.currentBattle.mysteryEncounter!.doEncounterExp = () => { + globalScene.unshiftPhase(new PartyExpPhase(baseExpValue, useWaveIndex, new Set(participantIds))); return true; }; @@ -685,60 +831,67 @@ export class OptionSelectSettings { /** * Can be used to queue a new series of Options to select for an Encounter * MUST be used only in onOptionPhase, will not work in onPreOptionPhase or onPostOptionPhase - * @param scene * @param optionSelectSettings */ -export function initSubsequentOptionSelect(scene: BattleScene, optionSelectSettings: OptionSelectSettings) { - scene.pushPhase(new MysteryEncounterPhase(scene, optionSelectSettings)); +export function initSubsequentOptionSelect(optionSelectSettings: OptionSelectSettings) { + globalScene.pushPhase(new MysteryEncounterPhase(optionSelectSettings)); } /** * Can be used to exit an encounter without any battles or followup * Will skip any shops and rewards, and queue the next encounter phase as normal - * @param scene * @param addHealPhase - when true, will add a shop phase to end of encounter with 0 rewards but healing items are available * @param encounterMode - Can set custom encounter mode if necessary (may be required for forcing Pokemon to return before next phase) */ -export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: boolean = false, encounterMode: MysteryEncounterMode = MysteryEncounterMode.NO_BATTLE) { - scene.currentBattle.mysteryEncounter!.encounterMode = encounterMode; - scene.clearPhaseQueue(); - scene.clearPhaseQueueSplice(); - handleMysteryEncounterVictory(scene, addHealPhase); +export function leaveEncounterWithoutBattle( + addHealPhase = false, + encounterMode: MysteryEncounterMode = MysteryEncounterMode.NO_BATTLE, +) { + globalScene.currentBattle.mysteryEncounter!.encounterMode = encounterMode; + globalScene.clearPhaseQueue(); + globalScene.clearPhaseQueueSplice(); + handleMysteryEncounterVictory(addHealPhase); } /** * - * @param scene * @param addHealPhase - Adds an empty shop phase to allow player to purchase healing items * @param doNotContinue - default `false`. If set to true, will not end the battle and continue to next wave */ -export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: boolean = false, doNotContinue: boolean = false) { - const allowedPkm = scene.getParty().filter((pkm) => pkm.isAllowedInBattle()); +export function handleMysteryEncounterVictory(addHealPhase = false, doNotContinue = false) { + const allowedPkm = globalScene.getPlayerParty().filter(pkm => pkm.isAllowedInBattle()); if (allowedPkm.length === 0) { - scene.clearPhaseQueue(); - scene.unshiftPhase(new GameOverPhase(scene)); + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new GameOverPhase()); return; } // If in repeated encounter variant, do nothing // Variant must eventually be swapped in order to handle "true" end of the encounter - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; if (encounter.continuousEncounter || doNotContinue) { return; - } else if (encounter.encounterMode === MysteryEncounterMode.NO_BATTLE) { - 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)); + } + if (encounter.encounterMode === MysteryEncounterMode.NO_BATTLE) { + globalScene.pushPhase(new MysteryEncounterRewardsPhase(addHealPhase)); + globalScene.pushPhase(new EggLapsePhase()); + } else if ( + !globalScene + .getEnemyParty() + .find(p => + encounter.encounterMode !== MysteryEncounterMode.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true), + ) + ) { + globalScene.pushPhase(new BattleEndPhase(true)); if (encounter.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { - scene.pushPhase(new TrainerVictoryPhase(scene)); + globalScene.pushPhase(new TrainerVictoryPhase()); } - if (scene.gameMode.isEndless || !scene.gameMode.isWaveFinal(scene.currentBattle.waveIndex)) { - scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); + if (globalScene.gameMode.isEndless || !globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) { + globalScene.pushPhase(new MysteryEncounterRewardsPhase(addHealPhase)); if (!encounter.doContinueEncounter) { // Only lapse eggs once for multi-battle encounters - scene.pushPhase(new EggLapsePhase(scene)); + globalScene.pushPhase(new EggLapsePhase()); } } } @@ -746,48 +899,47 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: /** * Similar to {@linkcode handleMysteryEncounterVictory}, but for cases where the player lost a battle or failed a challenge - * @param scene * @param addHealPhase */ -export function handleMysteryEncounterBattleFailed(scene: BattleScene, addHealPhase: boolean = false, doNotContinue: boolean = false) { - const allowedPkm = scene.getParty().filter((pkm) => pkm.isAllowedInBattle()); +export function handleMysteryEncounterBattleFailed(addHealPhase = false, doNotContinue = false) { + const allowedPkm = globalScene.getPlayerParty().filter(pkm => pkm.isAllowedInBattle()); if (allowedPkm.length === 0) { - scene.clearPhaseQueue(); - scene.unshiftPhase(new GameOverPhase(scene)); + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new GameOverPhase()); return; } // If in repeated encounter variant, do nothing // Variant must eventually be swapped in order to handle "true" end of the encounter - const encounter = scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; if (encounter.continuousEncounter || doNotContinue) { return; - } else if (encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE) { - scene.pushPhase(new BattleEndPhase(scene, false)); + } + if (encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE) { + globalScene.pushPhase(new BattleEndPhase(false)); } - scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); + globalScene.pushPhase(new MysteryEncounterRewardsPhase(addHealPhase)); if (!encounter.doContinueEncounter) { // Only lapse eggs once for multi-battle encounters - scene.pushPhase(new EggLapsePhase(scene)); + globalScene.pushPhase(new EggLapsePhase()); } } /** * - * @param scene * @param hide - If true, performs ease out and hide visuals. If false, eases in visuals. Defaults to true * @param destroy - If true, will destroy visuals ONLY ON HIDE TRANSITION. Does nothing on show. Defaults to true * @param duration */ -export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: boolean = true, destroy: boolean = true, duration: number = 750): Promise { +export function transitionMysteryEncounterIntroVisuals(hide = true, destroy = true, duration = 750): Promise { return new Promise(resolve => { - const introVisuals = scene.currentBattle.mysteryEncounter!.introVisuals; - const enemyPokemon = scene.getEnemyField(); + const introVisuals = globalScene.currentBattle.mysteryEncounter!.introVisuals; + const enemyPokemon = globalScene.getEnemyField(); if (enemyPokemon) { - scene.currentBattle.enemyParty = []; + globalScene.currentBattle.enemyParty = []; } if (introVisuals) { if (!hide) { @@ -799,8 +951,8 @@ export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: } // Transition - scene.tweens.add({ - targets: [ introVisuals, enemyPokemon ], + globalScene.tweens.add({ + targets: [introVisuals, enemyPokemon], x: `${hide ? "+" : "-"}=16`, y: `${hide ? "-" : "+"}=16`, alpha: hide ? 0 : 1, @@ -808,16 +960,16 @@ export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: duration, onComplete: () => { if (hide && destroy) { - scene.field.remove(introVisuals, true); + globalScene.field.remove(introVisuals, true); enemyPokemon.forEach(pokemon => { - scene.field.remove(pokemon, true); + pokemon.leaveField(true, true, true); }); - scene.currentBattle.mysteryEncounter!.introVisuals = undefined; + globalScene.currentBattle.mysteryEncounter!.introVisuals = undefined; } resolve(true); - } + }, }); } else { resolve(true); @@ -828,36 +980,41 @@ export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: /** * Will queue moves for any pokemon to use before the first CommandPhase of a battle * Mostly useful for allowing {@linkcode MysteryEncounter} enemies to "cheat" and use moves before the first turn - * @param scene */ -export function handleMysteryEncounterBattleStartEffects(scene: BattleScene) { - const encounter = scene.currentBattle.mysteryEncounter; - if (scene.currentBattle.isBattleMysteryEncounter() && encounter && encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE && !encounter.startOfBattleEffectsComplete) { +export function handleMysteryEncounterBattleStartEffects() { + const encounter = globalScene.currentBattle.mysteryEncounter; + if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + encounter && + encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE && + !encounter.startOfBattleEffectsComplete + ) { const effects = encounter.startOfBattleEffects; effects.forEach(effect => { - let source; + let source: EnemyPokemon | Pokemon; if (effect.sourcePokemon) { source = effect.sourcePokemon; } else if (!isNullOrUndefined(effect.sourceBattlerIndex)) { if (effect.sourceBattlerIndex === BattlerIndex.ATTACKER) { - source = scene.getEnemyField()[0]; + source = globalScene.getEnemyField()[0]; } else if (effect.sourceBattlerIndex === BattlerIndex.ENEMY) { - source = scene.getEnemyField()[0]; + source = globalScene.getEnemyField()[0]; } else if (effect.sourceBattlerIndex === BattlerIndex.ENEMY_2) { - source = scene.getEnemyField()[1]; + source = globalScene.getEnemyField()[1]; } else if (effect.sourceBattlerIndex === BattlerIndex.PLAYER) { - source = scene.getPlayerField()[0]; + source = globalScene.getPlayerField()[0]; } else if (effect.sourceBattlerIndex === BattlerIndex.PLAYER_2) { - source = scene.getPlayerField()[1]; + source = globalScene.getPlayerField()[1]; } } else { - source = scene.getEnemyField()[0]; + source = globalScene.getEnemyField()[0]; } - scene.pushPhase(new MovePhase(scene, source, effect.targets, effect.move, effect.followUp, effect.ignorePp)); + // @ts-ignore: source cannot be undefined + globalScene.pushPhase(new MovePhase(source, effect.targets, effect.move, effect.followUp, effect.ignorePp)); }); // Pseudo turn end phase to reset flinch states, Endure, etc. - scene.pushPhase(new MysteryEncounterBattleStartCleanupPhase(scene)); + globalScene.pushPhase(new MysteryEncounterBattleStartCleanupPhase()); encounter.startOfBattleEffectsComplete = true; } @@ -866,40 +1023,98 @@ export function handleMysteryEncounterBattleStartEffects(scene: BattleScene) { /** * Can queue extra phases or logic during {@linkcode TurnInitPhase} * Should mostly just be used for injecting custom phases into the battle system on turn start - * @param scene * @return boolean - if true, will skip the remainder of the {@linkcode TurnInitPhase} */ -export function handleMysteryEncounterTurnStartEffects(scene: BattleScene): boolean { - const encounter = scene.currentBattle.mysteryEncounter; - if (scene.currentBattle.isBattleMysteryEncounter() && encounter && encounter.onTurnStart) { - return encounter.onTurnStart(scene); +export function handleMysteryEncounterTurnStartEffects(): boolean { + const encounter = globalScene.currentBattle.mysteryEncounter; + if (globalScene.currentBattle.isBattleMysteryEncounter() && encounter && encounter.onTurnStart) { + return encounter.onTurnStart(); } return false; } +/** + * Helper function for encounters such as {@linkcode UncommonBreedEncounter} which call for a random species including event encounters. + * If the mon is from the event encounter list, it will do an extra shiny roll. + * @param level the level of the mon, which differs between MEs + * @param isBoss whether the mon should be a Boss + * @param rerollHidden whether the mon should get an extra roll for Hidden Ability + * @returns {@linkcode EnemyPokemon} for the requested encounter + */ +export function getRandomEncounterSpecies(level: number, isBoss = false, rerollHidden = false): EnemyPokemon { + let bossSpecies: PokemonSpecies; + let isEventEncounter = false; + const eventEncounters = globalScene.eventManager.getEventEncounters(); + let formIndex: number | undefined; + + if (eventEncounters.length > 0 && randSeedInt(2) === 1) { + const eventEncounter = randSeedItem(eventEncounters); + const levelSpecies = getPokemonSpecies(eventEncounter.species).getWildSpeciesForLevel( + level, + !eventEncounter.blockEvolution, + isBoss, + globalScene.gameMode, + ); + isEventEncounter = true; + bossSpecies = getPokemonSpecies(levelSpecies); + formIndex = eventEncounter.formIndex; + } else { + bossSpecies = globalScene.arena.randomSpecies( + globalScene.currentBattle.waveIndex, + level, + 0, + getPartyLuckValue(globalScene.getPlayerParty()), + isBoss, + ); + } + const ret = new EnemyPokemon(bossSpecies, level, TrainerSlot.NONE, isBoss); + if (formIndex) { + ret.formIndex = formIndex; + } + + //Reroll shiny for event encounters + if (isEventEncounter && !ret.shiny) { + ret.trySetShinySeed(); + } + //Reroll hidden ability + if (rerollHidden && ret.abilityIndex !== 2 && ret.species.abilityHidden) { + ret.tryRerollHiddenAbilitySeed(); + } + + return ret; +} + /** * TODO: remove once encounter spawn rate is finalized * Just a helper function to calculate aggregate stats for MEs in a Classic run - * @param scene * @param baseSpawnWeight */ -export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: number) { +export function calculateMEAggregateStats(baseSpawnWeight: number) { const numRuns = 1000; let run = 0; - const biomes = Object.keys(Biome).filter(key => isNaN(Number(key))); - const alwaysPickTheseBiomes = [ Biome.ISLAND, Biome.ABYSS, Biome.WASTELAND, Biome.FAIRY_CAVE, Biome.TEMPLE, Biome.LABORATORY, Biome.SPACE, Biome.WASTELAND ]; + const biomes = Object.keys(Biome).filter(key => Number.isNaN(Number(key))); + const alwaysPickTheseBiomes = [ + Biome.ISLAND, + Biome.ABYSS, + Biome.WASTELAND, + Biome.FAIRY_CAVE, + Biome.TEMPLE, + Biome.LABORATORY, + Biome.SPACE, + Biome.WASTELAND, + ]; const calculateNumEncounters = (): any[] => { let encounterRate = baseSpawnWeight; // BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT - const numEncounters = [ 0, 0, 0, 0 ]; + const numEncounters = [0, 0, 0, 0]; let mostRecentEncounterWave = 0; - const encountersByBiome = new Map(biomes.map(b => [ b, 0 ])); - const validMEfloorsByBiome = new Map(biomes.map(b => [ b, 0 ])); + const encountersByBiome = new Map(biomes.map(b => [b, 0])); + const validMEfloorsByBiome = new Map(biomes.map(b => [b, 0])); let currentBiome = Biome.TOWN; - let currentArena = scene.newArena(currentBiome); - scene.setSeed(Utils.randomString(24)); - scene.resetSeed(); + let currentArena = globalScene.newArena(currentBiome); + globalScene.setSeed(Utils.randomString(24)); + globalScene.resetSeed(); for (let i = 10; i < 180; i++) { // Boss if (i % 10 === 0) { @@ -910,12 +1125,12 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n if (i % 10 === 1) { if (Array.isArray(biomeLinks[currentBiome])) { let biomes: Biome[]; - scene.executeWithSeedOffset(() => { + globalScene.executeWithSeedOffset(() => { biomes = (biomeLinks[currentBiome] as (Biome | [Biome, number])[]) .filter(b => { return !Array.isArray(b) || !Utils.randSeedInt(b[1]); }) - .map(b => !Array.isArray(b) ? b : b[0]); + .map(b => (!Array.isArray(b) ? b : b[0])); }, i * 100); if (biomes! && biomes.length > 0) { const specialBiomes = biomes.filter(b => alwaysPickTheseBiomes.includes(b)); @@ -926,25 +1141,25 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n } } } else if (biomeLinks.hasOwnProperty(currentBiome)) { - currentBiome = (biomeLinks[currentBiome] as Biome); + currentBiome = biomeLinks[currentBiome] as Biome; } else { if (!(i % 50)) { currentBiome = Biome.END; } else { - currentBiome = scene.generateRandomBiome(i); + currentBiome = globalScene.generateRandomBiome(i); } } - currentArena = scene.newArena(currentBiome); + currentArena = globalScene.newArena(currentBiome); } // Fixed battle - if (scene.gameMode.isFixedBattle(i)) { + if (globalScene.gameMode.isFixedBattle(i)) { continue; } // Trainer - if (scene.gameMode.isWaveTrainer(i, currentArena)) { + if (globalScene.gameMode.isWaveTrainer(i, currentArena)) { continue; } @@ -955,12 +1170,12 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n // If total number of encounters is lower than expected for the run, slightly favor a new encounter // Do the reverse as well - const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (180 - 10) * (i - 10); + const expectedEncountersByFloor = (AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (180 - 10)) * (i - 10); const currentRunDiffFromAvg = expectedEncountersByFloor - numEncounters.reduce((a, b) => a + b); const favoredEncounterRate = encounterRate + currentRunDiffFromAvg * 15; // If the most recent ME was 3 or fewer waves ago, can never spawn a ME - const canSpawn = (i - mostRecentEncounterWave) > 3; + const canSpawn = i - mostRecentEncounterWave > 3; if (canSpawn && roll < favoredEncounterRate) { mostRecentEncounterWave = i; @@ -968,7 +1183,7 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n // Calculate encounter rarity // Common / Uncommon / Rare / Super Rare (base is out of 128) - const tierWeights = [ 66, 40, 19, 3 ]; + const tierWeights = [66, 40, 19, 3]; // Adjust tier weights by currently encountered events (pity system that lowers odds of multiple Common/Great) tierWeights[0] = tierWeights[0] - 6 * numEncounters[0]; @@ -980,22 +1195,28 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n const uncommonThreshold = totalWeight - tierWeights[0] - tierWeights[1]; // 64 - 32 - 16 = 16 const rareThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; // 64 - 32 - 16 - 10 = 6 - tierValue > commonThreshold ? ++numEncounters[0] : tierValue > uncommonThreshold ? ++numEncounters[1] : tierValue > rareThreshold ? ++numEncounters[2] : ++numEncounters[3]; + tierValue > commonThreshold + ? ++numEncounters[0] + : tierValue > uncommonThreshold + ? ++numEncounters[1] + : tierValue > rareThreshold + ? ++numEncounters[2] + : ++numEncounters[3]; encountersByBiome.set(Biome[currentBiome], (encountersByBiome.get(Biome[currentBiome]) ?? 0) + 1); } else { encounterRate += WEIGHT_INCREMENT_ON_SPAWN_MISS; } } - return [ numEncounters, encountersByBiome, validMEfloorsByBiome ]; + return [numEncounters, encountersByBiome, validMEfloorsByBiome]; }; const encounterRuns: number[][] = []; const encountersByBiomeRuns: Map[] = []; const validFloorsByBiome: Map[] = []; while (run < numRuns) { - scene.executeWithSeedOffset(() => { - const [ numEncounters, encountersByBiome, validMEfloorsByBiome ] = calculateNumEncounters(); + globalScene.executeWithSeedOffset(() => { + const [numEncounters, encountersByBiome, validMEfloorsByBiome] = calculateNumEncounters(); encounterRuns.push(numEncounters); encountersByBiomeRuns.push(encountersByBiome); validFloorsByBiome.push(validMEfloorsByBiome); @@ -1036,43 +1257,49 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n let stats = `Starting weight: ${baseSpawnWeight}\nAverage MEs per run: ${totalMean}\nStandard Deviation: ${totalStd}\nAvg Commons: ${commonMean}\nAvg Greats: ${uncommonMean}\nAvg Ultras: ${rareMean}\nAvg Rogues: ${superRareMean}\n`; - const meanEncountersPerRunPerBiomeSorted = [ ...meanEncountersPerRunPerBiome.entries() ].sort((e1, e2) => e2[1] - e1[1]); - meanEncountersPerRunPerBiomeSorted.forEach(value => stats = stats + `${value[0]}: avg valid floors ${meanMEFloorsPerRunPerBiome.get(value[0])}, avg MEs ${value[1]},\n`); + const meanEncountersPerRunPerBiomeSorted = [...meanEncountersPerRunPerBiome.entries()].sort( + (e1, e2) => e2[1] - e1[1], + ); + + for (const value of meanEncountersPerRunPerBiomeSorted) { + stats += value[0] + "avg valid floors " + meanMEFloorsPerRunPerBiome.get(value[0]) + ", avg MEs ${value[1]},\n"; + } console.log(stats); } - /** * TODO: remove once encounter spawn rate is finalized * Just a helper function to calculate aggregate stats for MEs in a Classic run - * @param scene * @param luckValue - 0 to 14 */ -export function calculateRareSpawnAggregateStats(scene: BattleScene, luckValue: number) { +export function calculateRareSpawnAggregateStats(luckValue: number) { const numRuns = 1000; let run = 0; const calculateNumRareEncounters = (): any[] => { - const bossEncountersByRarity = [ 0, 0, 0, 0 ]; - scene.setSeed(Utils.randomString(24)); - scene.resetSeed(); + const bossEncountersByRarity = [0, 0, 0, 0]; + globalScene.setSeed(Utils.randomString(24)); + globalScene.resetSeed(); // There are 12 wild boss floors for (let i = 0; i < 12; i++) { // Roll boss tier // luck influences encounter rarity let luckModifier = 0; - if (!isNaN(luckValue)) { + if (!Number.isNaN(luckValue)) { luckModifier = luckValue * 0.5; } const tierValue = Utils.randSeedInt(64 - luckModifier); - const tier = tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; + const tier = + tierValue >= 20 + ? BiomePoolTier.BOSS + : tierValue >= 6 + ? BiomePoolTier.BOSS_RARE + : tierValue >= 1 + ? BiomePoolTier.BOSS_SUPER_RARE + : BiomePoolTier.BOSS_ULTRA_RARE; switch (tier) { - default: - case BiomePoolTier.BOSS: - ++bossEncountersByRarity[0]; - break; case BiomePoolTier.BOSS_RARE: ++bossEncountersByRarity[1]; break; @@ -1082,6 +1309,10 @@ export function calculateRareSpawnAggregateStats(scene: BattleScene, luckValue: case BiomePoolTier.BOSS_ULTRA_RARE: ++bossEncountersByRarity[3]; break; + case BiomePoolTier.BOSS: + default: + ++bossEncountersByRarity[0]; + break; } } @@ -1090,7 +1321,7 @@ export function calculateRareSpawnAggregateStats(scene: BattleScene, luckValue: const encounterRuns: number[][] = []; while (run < numRuns) { - scene.executeWithSeedOffset(() => { + globalScene.executeWithSeedOffset(() => { const bossEncountersByRarity = calculateNumRareEncounters(); encounterRuns.push(bossEncountersByRarity); }, 1000 * run); diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index b1adc478ab0..275078dbace 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -1,28 +1,43 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import i18next from "i18next"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; -import Pokemon, { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; -import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "#app/data/pokeball"; +import type { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { + doPokeballBounceAnim, + getPokeballAtlasKey, + getPokeballCatchMultiplier, + getPokeballTintColor, +} from "#app/data/pokeball"; import { PlayerGender } from "#enums/player-gender"; import { addPokeballCaptureStars, addPokeballOpenParticles } from "#app/field/anims"; -import { getStatusEffectCatchRateMultiplier, StatusEffect } from "#app/data/status-effect"; +import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; import { achvs } from "#app/system/achv"; import { Mode } from "#app/ui/ui"; -import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; +import type { PartyOption } from "#app/ui/party-ui-handler"; +import { PartyUiMode } from "#app/ui/party-ui-handler"; import { Species } from "#enums/species"; -import { Type } from "#app/data/type"; -import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; +import type { PokemonType } from "#enums/pokemon-type"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; -import { getEncounterText, queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { + getEncounterText, + queueEncounterMessage, + showEncounterText, +} from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { Gender } from "#app/data/gender"; -import { PermanentStat } from "#enums/stat"; +import type { PermanentStat } from "#enums/stat"; import { VictoryPhase } from "#app/phases/victory-phase"; import { SummaryUiMode } from "#app/ui/summary-ui-handler"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; -import { Abilities } from "#enums/abilities"; +import type { Abilities } from "#enums/abilities"; +import type { PokeballType } from "#enums/pokeball"; +import { StatusEffect } from "#enums/status-effect"; /** Will give +1 level every 10 waves */ export const STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER = 1; @@ -35,42 +50,67 @@ export const STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER = 1; * @param shiny * @param variant */ -export function getSpriteKeysFromSpecies(species: Species, female?: boolean, formIndex?: number, shiny?: boolean, variant?: number): { spriteKey: string, fileRoot: string } { - const spriteKey = getPokemonSpecies(species).getSpriteKey(female ?? false, formIndex ?? 0, shiny ?? false, variant ?? 0); - const fileRoot = getPokemonSpecies(species).getSpriteAtlasPath(female ?? false, formIndex ?? 0, shiny ?? false, variant ?? 0); +export function getSpriteKeysFromSpecies( + species: Species, + female?: boolean, + formIndex?: number, + shiny?: boolean, + variant?: number, +): { spriteKey: string; fileRoot: string } { + const spriteKey = getPokemonSpecies(species).getSpriteKey( + female ?? false, + formIndex ?? 0, + shiny ?? false, + variant ?? 0, + ); + const fileRoot = getPokemonSpecies(species).getSpriteAtlasPath( + female ?? false, + formIndex ?? 0, + shiny ?? false, + variant ?? 0, + ); return { spriteKey, fileRoot }; } /** * Gets the sprite key and file root for a given Pokemon (accounts for gender, shiny, variants, forms, and experimental) - * @param pokemon */ -export function getSpriteKeysFromPokemon(pokemon: Pokemon): { spriteKey: string, fileRoot: string } { - const spriteKey = pokemon.getSpeciesForm().getSpriteKey(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); - const fileRoot = pokemon.getSpeciesForm().getSpriteAtlasPath(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); +export function getSpriteKeysFromPokemon(pokemon: Pokemon): { + spriteKey: string; + fileRoot: string; +} { + const spriteKey = pokemon + .getSpeciesForm() + .getSpriteKey(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); + const fileRoot = pokemon + .getSpeciesForm() + .getSpriteAtlasPath(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); return { spriteKey, fileRoot }; } /** - * Will never remove the player's last non-fainted Pokemon (if they only have 1) + * Will never remove the player's last non-fainted Pokemon (if they only have 1). * Otherwise, picks a Pokemon completely at random and removes from the party - * @param scene - * @param isAllowed Default false. If true, only picks from legal mons. If no legal mons are found (or there is 1, with `doNotReturnLastAllowedMon = true), will return a mon that is not allowed. - * @param isFainted Default false. If true, includes fainted mons. - * @param doNotReturnLastAllowedMon Default false. If true, will never return the last unfainted pokemon in the party. Useful when this function is being used to determine what Pokemon to remove from the party (Don't want to remove last unfainted) + * @param isAllowed Default `false`. If `true`, only picks from legal mons. If no legal mons are found (or there is 1, with `doNotReturnLastAllowedMon = true`), will return a mon that is not allowed. + * @param isFainted Default `false`. If `true`, includes fainted mons. + * @param doNotReturnLastAllowedMon Default `false`. If `true`, will never return the last unfainted pokemon in the party. Useful when this function is being used to determine what Pokemon to remove from the party (Don't want to remove last unfainted) * @returns */ -export function getRandomPlayerPokemon(scene: BattleScene, isAllowed: boolean = false, isFainted: boolean = false, doNotReturnLastAllowedMon: boolean = false): PlayerPokemon { - const party = scene.getParty(); +export function getRandomPlayerPokemon( + isAllowed = false, + isFainted = false, + doNotReturnLastAllowedMon = false, +): PlayerPokemon { + const party = globalScene.getPlayerParty(); let chosenIndex: number; let chosenPokemon: PlayerPokemon | null = null; - const fullyLegalMons = party.filter(p => (!isAllowed || p.isAllowed()) && (isFainted || !p.isFainted())); - const allowedOnlyMons = party.filter(p => p.isAllowed()); + const fullyLegalMons = party.filter(p => (!isAllowed || p.isAllowedInChallenge()) && (isFainted || !p.isFainted())); + const allowedOnlyMons = party.filter(p => p.isAllowedInChallenge()); if (doNotReturnLastAllowedMon && fullyLegalMons.length === 1) { // If there is only 1 legal/unfainted mon left, select from fainted legal mons - const faintedLegalMons = party.filter(p => (!isAllowed || p.isAllowed()) && p.isFainted()); + const faintedLegalMons = party.filter(p => (!isAllowed || p.isAllowedInChallenge()) && p.isFainted()); if (faintedLegalMons.length > 0) { chosenIndex = randSeedInt(faintedLegalMons.length); chosenPokemon = faintedLegalMons[chosenIndex]; @@ -100,19 +140,19 @@ export function getRandomPlayerPokemon(scene: BattleScene, isAllowed: boolean = * @param isFainted Default false. If true, includes fainted mons. * @returns */ -export function getHighestLevelPlayerPokemon(scene: BattleScene, isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon { - const party = scene.getParty(); +export function getHighestLevelPlayerPokemon(isAllowed = false, isFainted = false): PlayerPokemon { + const party = globalScene.getPlayerParty(); let pokemon: PlayerPokemon | null = null; for (const p of party) { - if (isAllowed && !p.isAllowed()) { + if (isAllowed && !p.isAllowedInChallenge()) { continue; } if (!isFainted && p.isFainted()) { continue; } - pokemon = pokemon ? pokemon?.level < p?.level ? p : pokemon : p; + pokemon = pokemon ? (pokemon?.level < p?.level ? p : pokemon) : p; } return pokemon!; @@ -126,19 +166,19 @@ export function getHighestLevelPlayerPokemon(scene: BattleScene, isAllowed: bool * @param isFainted Default false. If true, includes fainted mons. * @returns */ -export function getHighestStatPlayerPokemon(scene: BattleScene, stat: PermanentStat, isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon { - const party = scene.getParty(); +export function getHighestStatPlayerPokemon(stat: PermanentStat, isAllowed = false, isFainted = false): PlayerPokemon { + const party = globalScene.getPlayerParty(); let pokemon: PlayerPokemon | null = null; for (const p of party) { - if (isAllowed && !p.isAllowed()) { + if (isAllowed && !p.isAllowedInChallenge()) { continue; } if (!isFainted && p.isFainted()) { continue; } - pokemon = pokemon ? pokemon.getStat(stat) < p?.getStat(stat) ? p : pokemon : p; + pokemon = pokemon ? (pokemon.getStat(stat) < p?.getStat(stat) ? p : pokemon) : p; } return pokemon!; @@ -151,19 +191,19 @@ export function getHighestStatPlayerPokemon(scene: BattleScene, stat: PermanentS * @param isFainted Default false. If true, includes fainted mons. * @returns */ -export function getLowestLevelPlayerPokemon(scene: BattleScene, isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon { - const party = scene.getParty(); +export function getLowestLevelPlayerPokemon(isAllowed = false, isFainted = false): PlayerPokemon { + const party = globalScene.getPlayerParty(); let pokemon: PlayerPokemon | null = null; for (const p of party) { - if (isAllowed && !p.isAllowed()) { + if (isAllowed && !p.isAllowedInChallenge()) { continue; } if (!isFainted && p.isFainted()) { continue; } - pokemon = pokemon ? pokemon?.level > p?.level ? p : pokemon : p; + pokemon = pokemon ? (pokemon?.level > p?.level ? p : pokemon) : p; } return pokemon!; @@ -176,19 +216,19 @@ export function getLowestLevelPlayerPokemon(scene: BattleScene, isAllowed: boole * @param isFainted Default false. If true, includes fainted mons. * @returns */ -export function getHighestStatTotalPlayerPokemon(scene: BattleScene, isAllowed: boolean = false, isFainted: boolean = false): PlayerPokemon { - const party = scene.getParty(); +export function getHighestStatTotalPlayerPokemon(isAllowed = false, isFainted = false): PlayerPokemon { + const party = globalScene.getPlayerParty(); let pokemon: PlayerPokemon | null = null; for (const p of party) { - if (isAllowed && !p.isAllowed()) { + if (isAllowed && !p.isAllowedInChallenge()) { continue; } if (!isFainted && p.isFainted()) { continue; } - pokemon = pokemon ? pokemon?.stats.reduce((a, b) => a + b) < p?.stats.reduce((a, b) => a + b) ? p : pokemon : p; + pokemon = pokemon ? (pokemon?.stats.reduce((a, b) => a + b) < p?.stats.reduce((a, b) => a + b) ? p : pokemon) : p; } return pokemon!; @@ -205,28 +245,40 @@ 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?: PokemonType[], + allowSubLegendary = true, + allowLegendary = true, + allowMythical = true, +): Species { let min = Array.isArray(starterTiers) ? starterTiers[0] : starterTiers; let max = Array.isArray(starterTiers) ? starterTiers[1] : starterTiers; let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarterCosts) - .map(s => [ parseInt(s) as Species, speciesStarterCosts[s] as number ]) + .map(s => [Number.parseInt(s) as Species, speciesStarterCosts[s] as number]) .filter(s => { const pokemonSpecies = getPokemonSpecies(s[0]); - return pokemonSpecies && (!excludedSpecies || !excludedSpecies.includes(s[0])) - && (allowSubLegendary || !pokemonSpecies.subLegendary) - && (allowLegendary || !pokemonSpecies.legendary) - && (allowMythical || !pokemonSpecies.mythical); + return ( + pokemonSpecies && + (!excludedSpecies || !excludedSpecies.includes(s[0])) && + (allowSubLegendary || !pokemonSpecies.subLegendary) && + (allowLegendary || !pokemonSpecies.legendary) && + (allowMythical || !pokemonSpecies.mythical) + ); }) - .map(s => [ getPokemonSpecies(s[0]), s[1] ]); + .map(s => [getPokemonSpecies(s[0]), s[1]]); if (types && types.length > 0) { - filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || (!isNullOrUndefined(s[0].type2) && types.includes(s[0].type2))); + filteredSpecies = filteredSpecies.filter( + s => types.includes(s[0].type1) || (!isNullOrUndefined(s[0].type2) && types.includes(s[0].type2)), + ); } // If no filtered mons exist at specified starter tiers, will expand starter search range until there are // Starts by decrementing starter tier min until it is 0, then increments tier max up to 10 - let tryFilterStarterTiers: [PokemonSpecies, number][] = filteredSpecies.filter(s => (s[1] >= min && s[1] <= max)); + let tryFilterStarterTiers: [PokemonSpecies, number][] = filteredSpecies.filter(s => s[1] >= min && s[1] <= max); while (tryFilterStarterTiers.length === 0 && !(min === 0 && max === 10)) { if (min > 0) { min--; @@ -251,11 +303,15 @@ export function getRandomSpeciesByStarterTier(starterTiers: number | [number, nu * @param scene the battle scene * @param pokemon the player pokemon to KO */ -export function koPlayerPokemon(scene: BattleScene, pokemon: PlayerPokemon) { +export function koPlayerPokemon(pokemon: PlayerPokemon) { pokemon.hp = 0; pokemon.trySetStatus(StatusEffect.FAINT); pokemon.updateInfo(); - queueEncounterMessage(scene, i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + queueEncounterMessage( + i18next.t("battle:fainted", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } /** @@ -267,11 +323,11 @@ export function koPlayerPokemon(scene: BattleScene, pokemon: PlayerPokemon) { * @param value the hp change amount. Positive for heal. Negative for damage * */ -function applyHpChangeToPokemon(scene: BattleScene, pokemon: PlayerPokemon, value: number) { +function applyHpChangeToPokemon(pokemon: PlayerPokemon, value: number) { const hpChange = Math.round(pokemon.hp + value); const nextHp = Math.max(Math.min(hpChange, pokemon.getMaxHp()), 0); if (nextHp === 0) { - koPlayerPokemon(scene, pokemon); + koPlayerPokemon(pokemon); } else { pokemon.hp = nextHp; } @@ -284,12 +340,17 @@ function applyHpChangeToPokemon(scene: BattleScene, pokemon: PlayerPokemon, valu * @param damage the amount of damage to apply * @see {@linkcode applyHpChangeToPokemon} */ -export function applyDamageToPokemon(scene: BattleScene, pokemon: PlayerPokemon, damage: number) { +export function applyDamageToPokemon(pokemon: PlayerPokemon, damage: number) { if (damage <= 0) { - console.warn("Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead."); + console.warn( + "Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead.", + ); } - - applyHpChangeToPokemon(scene, pokemon, -damage); + // 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(pokemon, -damage); } /** @@ -299,12 +360,14 @@ export function applyDamageToPokemon(scene: BattleScene, pokemon: PlayerPokemon, * @param heal the amount of heal to apply * @see {@linkcode applyHpChangeToPokemon} */ -export function applyHealToPokemon(scene: BattleScene, pokemon: PlayerPokemon, heal: number) { +export function applyHealToPokemon(pokemon: PlayerPokemon, heal: number) { if (heal <= 0) { - console.warn("Damaging pokemon with `applyHealToPokemon` is not recommended! Please use `applyDamageToPokemon` instead."); + console.warn( + "Damaging pokemon with `applyHealToPokemon` is not recommended! Please use `applyDamageToPokemon` instead.", + ); } - applyHpChangeToPokemon(scene, pokemon, heal); + applyHpChangeToPokemon(pokemon, heal); } /** @@ -314,12 +377,13 @@ export function applyHealToPokemon(scene: BattleScene, pokemon: PlayerPokemon, h * @param value */ export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: number) { - const modType = modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE() - .generateType(pokemon.scene.getParty(), [ value ]) + const modType = modifierTypes + .MYSTERY_ENCOUNTER_SHUCKLE_JUICE() + .generateType(globalScene.getPlayerParty(), [value]) ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE); const modifier = modType?.newModifier(pokemon); if (modifier) { - await pokemon.scene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); pokemon.calculateStats(); } } @@ -332,27 +396,32 @@ export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: numb * @param modType * @param fallbackModifierType */ -export async function applyModifierTypeToPlayerPokemon(scene: BattleScene, pokemon: PlayerPokemon, modType: PokemonHeldItemModifierType, fallbackModifierType?: PokemonHeldItemModifierType) { +export async function applyModifierTypeToPlayerPokemon( + pokemon: PlayerPokemon, + modType: PokemonHeldItemModifierType, + fallbackModifierType?: PokemonHeldItemModifierType, +) { // Check if the Pokemon has max stacks of that item already const modifier = modType.newModifier(pokemon); - const existing = scene.findModifier(m => ( - m instanceof PokemonHeldItemModifier && - m.type.id === modType.id && - m.pokemonId === pokemon.id && - m.matchType(modifier) - )) as PokemonHeldItemModifier; + const existing = globalScene.findModifier( + m => + m instanceof PokemonHeldItemModifier && + m.type.id === modType.id && + m.pokemonId === pokemon.id && + m.matchType(modifier), + ) as PokemonHeldItemModifier; // At max stacks - if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { + if (existing && existing.getStackCount() >= existing.getMaxStackCount()) { if (!fallbackModifierType) { return; } // Apply fallback - return applyModifierTypeToPlayerPokemon(scene, pokemon, fallbackModifierType); + return applyModifierTypeToPlayerPokemon(pokemon, fallbackModifierType); } - await scene.addModifier(modifier, false, false, false, true); + globalScene.addModifier(modifier, false, false, false, true); } /** @@ -366,7 +435,11 @@ export async function applyModifierTypeToPlayerPokemon(scene: BattleScene, pokem * @param pokeballType * @param ballTwitchRate - can pass custom ball catch rates (for special events, like safari) */ -export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, pokeballType: PokeballType, ballTwitchRate?: number): Promise { +export function trainerThrowPokeball( + pokemon: EnemyPokemon, + pokeballType: PokeballType, + ballTwitchRate?: number, +): Promise { const originalY: number = pokemon.y; if (!ballTwitchRate) { @@ -381,43 +454,47 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, const fpOffset = pokemon.getFieldPositionOffset(); const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); - const pokeball: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "pb", pokeballAtlasKey); + const pokeball: Phaser.GameObjects.Sprite = globalScene.addFieldSprite(16 + 75, 80 + 25, "pb", pokeballAtlasKey); pokeball.setOrigin(0.5, 0.625); - scene.field.add(pokeball); + globalScene.field.add(pokeball); - scene.time.delayedCall(300, () => { - scene.field.moveBelow(pokeball as Phaser.GameObjects.GameObject, pokemon); + globalScene.time.delayedCall(300, () => { + globalScene.field.moveBelow(pokeball as Phaser.GameObjects.GameObject, pokemon); }); return new Promise(resolve => { - scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); - scene.time.delayedCall(512, () => { - scene.playSound("se/pb_throw"); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); + globalScene.time.delayedCall(512, () => { + globalScene.playSound("se/pb_throw"); // Trainer throw frames - scene.trainer.setFrame("2"); - scene.time.delayedCall(256, () => { - scene.trainer.setFrame("3"); - scene.time.delayedCall(768, () => { - scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + globalScene.trainer.setFrame("2"); + globalScene.time.delayedCall(256, () => { + globalScene.trainer.setFrame("3"); + globalScene.time.delayedCall(768, () => { + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`, + ); }); }); // Pokeball move and catch logic - scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, x: { value: 236 + fpOffset[0], ease: "Linear" }, y: { value: 16 + fpOffset[1], ease: "Cubic.easeOut" }, duration: 500, onComplete: () => { pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); - scene.playSound("se/pb_rel"); + globalScene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + globalScene.playSound("se/pb_rel"); pokemon.tint(getPokeballTintColor(pokeballType)); - addPokeballOpenParticles(scene, pokeball.x, pokeball.y, pokeballType); + addPokeballOpenParticles(pokeball.x, pokeball.y, pokeballType); - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemon, duration: 500, ease: "Sine.easeIn", @@ -426,13 +503,13 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, onComplete: () => { pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); pokemon.setVisible(false); - scene.playSound("se/pb_catch"); - scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}`)); + globalScene.playSound("se/pb_catch"); + globalScene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}`)); const doShake = () => { let shakeCount = 0; const pbX = pokeball.x; - const shakeCounter = scene.tweens.addCounter({ + const shakeCounter = globalScene.tweens.addCounter({ from: 0, to: 1, repeat: 4, @@ -451,50 +528,50 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, onRepeat: () => { if (!pokemon.species.isObtainable()) { shakeCounter.stop(); - failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); + failCatch(pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); } else if (shakeCount++ < 3) { if (randSeedInt(65536) < ballTwitchRate) { - scene.playSound("se/pb_move"); + globalScene.playSound("se/pb_move"); } else { shakeCounter.stop(); - failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); + failCatch(pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); } } else { - scene.playSound("se/pb_lock"); - addPokeballCaptureStars(scene, pokeball); + globalScene.playSound("se/pb_lock"); + addPokeballCaptureStars(pokeball); - const pbTint = scene.add.sprite(pokeball.x, pokeball.y, "pb", "pb"); + const pbTint = globalScene.add.sprite(pokeball.x, pokeball.y, "pb", "pb"); pbTint.setOrigin(pokeball.originX, pokeball.originY); pbTint.setTintFill(0); pbTint.setAlpha(0); - scene.field.add(pbTint); - scene.tweens.add({ + globalScene.field.add(pbTint); + globalScene.tweens.add({ targets: pbTint, alpha: 0.375, duration: 200, easing: "Sine.easeOut", onComplete: () => { - scene.tweens.add({ + globalScene.tweens.add({ targets: pbTint, alpha: 0, duration: 200, easing: "Sine.easeIn", - onComplete: () => pbTint.destroy() + onComplete: () => pbTint.destroy(), }); - } + }, }); } }, onComplete: () => { - catchPokemon(scene, pokemon, pokeball, pokeballType).then(() => resolve(true)); - } + catchPokemon(pokemon, pokeball, pokeballType).then(() => resolve(true)); + }, }); }; - scene.time.delayedCall(250, () => doPokeballBounceAnim(scene, pokeball, 16, 72, 350, doShake)); - } + globalScene.time.delayedCall(250, () => doPokeballBounceAnim(pokeball, 16, 72, 350, doShake)); + }, }); - } + }, }); }); }); @@ -508,9 +585,14 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, * @param pokeball * @param pokeballType */ -function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType) { +function failCatch( + pokemon: EnemyPokemon, + originalY: number, + pokeball: Phaser.GameObjects.Sprite, + pokeballType: PokeballType, +) { return new Promise(resolve => { - scene.playSound("se/pb_rel"); + globalScene.playSound("se/pb_rel"); pokemon.setY(originalY); if (pokemon.status?.effect !== StatusEffect.SLEEP) { pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); @@ -521,19 +603,27 @@ function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + globalScene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemon, duration: 250, ease: "Sine.easeOut", - scale: 1 + scale: 1, }); - scene.currentBattle.lastUsedPokeball = pokeballType; - removePb(scene, pokeball); + globalScene.currentBattle.lastUsedPokeball = pokeballType; + removePb(pokeball); - scene.ui.showText(i18next.t("battle:pokemonBrokeFree", { pokemonName: pokemon.getNameToRender() }), null, () => resolve(), null, true); + globalScene.ui.showText( + i18next.t("battle:pokemonBrokeFree", { + pokemonName: pokemon.getNameToRender(), + }), + null, + () => resolve(), + null, + true, + ); }); } @@ -546,56 +636,65 @@ function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, * @param showCatchObtainMessage * @param isObtain */ -export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite | null, pokeballType: PokeballType, showCatchObtainMessage: boolean = true, isObtain: boolean = false): Promise { +export async function catchPokemon( + pokemon: EnemyPokemon, + pokeball: Phaser.GameObjects.Sprite | null, + pokeballType: PokeballType, + showCatchObtainMessage = true, + isObtain = false, +): Promise { const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); - if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { - scene.validateAchv(achvs.HIDDEN_ABILITY); + if ( + speciesForm.abilityHidden && + (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1 + ) { + globalScene.validateAchv(achvs.HIDDEN_ABILITY); } if (pokemon.species.subLegendary) { - scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + globalScene.validateAchv(achvs.CATCH_SUB_LEGENDARY); } if (pokemon.species.legendary) { - scene.validateAchv(achvs.CATCH_LEGENDARY); + globalScene.validateAchv(achvs.CATCH_LEGENDARY); } if (pokemon.species.mythical) { - scene.validateAchv(achvs.CATCH_MYTHICAL); + globalScene.validateAchv(achvs.CATCH_MYTHICAL); } - scene.pokemonInfoContainer.show(pokemon, true); + globalScene.pokemonInfoContainer.show(pokemon, true); - scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); + globalScene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); return new Promise(resolve => { const doPokemonCatchMenu = () => { const end = () => { // Ensure the pokemon is in the enemy party in all situations - if (!scene.getEnemyParty().some(p => p.id === pokemon.id)) { - scene.getEnemyParty().push(pokemon); + if (!globalScene.getEnemyParty().some(p => p.id === pokemon.id)) { + globalScene.getEnemyParty().push(pokemon); } - scene.unshiftPhase(new VictoryPhase(scene, pokemon.id, true)); - scene.pokemonInfoContainer.hide(); + globalScene.unshiftPhase(new VictoryPhase(pokemon.id, true)); + globalScene.pokemonInfoContainer.hide(); if (pokeball) { - removePb(scene, pokeball); + removePb(pokeball); } resolve(); }; const removePokemon = () => { if (pokemon) { - scene.field.remove(pokemon, true); + pokemon.leaveField(false, true, true); } }; const addToParty = (slotIndex?: number) => { const newPokemon = pokemon.addToParty(pokeballType, slotIndex); - const modifiers = scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); - if (scene.getParty().filter(p => p.isShiny()).length === 6) { - scene.validateAchv(achvs.SHINY_PARTY); + const modifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); + if (globalScene.getPlayerParty().filter(p => p.isShiny()).length === 6) { + globalScene.validateAchv(achvs.SHINY_PARTY); } - Promise.all(modifiers.map(m => scene.addModifier(m, true))).then(() => { - scene.updateModifiers(true); + Promise.all(modifiers.map(m => globalScene.addModifier(m, true))).then(() => { + globalScene.updateModifiers(true); removePokemon(); if (newPokemon) { newPokemon.loadAssets().then(end); @@ -604,35 +703,70 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po } }); }; - Promise.all([ pokemon.hideInfo(), scene.gameData.setPokemonCaught(pokemon) ]).then(() => { - if (scene.getParty().length === 6) { + Promise.all([pokemon.hideInfo(), globalScene.gameData.setPokemonCaught(pokemon)]).then(() => { + if (globalScene.getPlayerParty().length === 6) { const promptRelease = () => { - scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.getNameToRender() }), null, () => { - scene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); - scene.ui.setMode(Mode.CONFIRM, () => { - const newPokemon = scene.addPlayerPokemon(pokemon.species, pokemon.level, pokemon.abilityIndex, pokemon.formIndex, pokemon.gender, pokemon.shiny, pokemon.variant, pokemon.ivs, pokemon.nature, pokemon); - scene.ui.setMode(Mode.SUMMARY, newPokemon, 0, SummaryUiMode.DEFAULT, () => { - scene.ui.setMode(Mode.MESSAGE).then(() => { - promptRelease(); - }); - }, false); - }, () => { - scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, 0, (slotIndex: integer, _option: PartyOption) => { - scene.ui.setMode(Mode.MESSAGE).then(() => { - if (slotIndex < 6) { - addToParty(slotIndex); - } else { - promptRelease(); - } - }); - }); - }, () => { - scene.ui.setMode(Mode.MESSAGE).then(() => { - removePokemon(); - end(); - }); - }, "fullParty"); - }); + globalScene.ui.showText( + i18next.t("battle:partyFull", { + pokemonName: pokemon.getNameToRender(), + }), + null, + () => { + globalScene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + const newPokemon = globalScene.addPlayerPokemon( + pokemon.species, + pokemon.level, + pokemon.abilityIndex, + pokemon.formIndex, + pokemon.gender, + pokemon.shiny, + pokemon.variant, + pokemon.ivs, + pokemon.nature, + pokemon, + ); + globalScene.ui.setMode( + Mode.SUMMARY, + newPokemon, + 0, + SummaryUiMode.DEFAULT, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + promptRelease(); + }); + }, + false, + ); + }, + () => { + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.RELEASE, + 0, + (slotIndex: number, _option: PartyOption) => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + if (slotIndex < 6) { + addToParty(slotIndex); + } else { + promptRelease(); + } + }); + }, + ); + }, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + removePokemon(); + end(); + }); + }, + "fullParty", + ); + }, + ); }; promptRelease(); } else { @@ -642,7 +776,15 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po }; if (showCatchObtainMessage) { - scene.ui.showText(i18next.t(isObtain ? "battle:pokemonObtained" : "battle:pokemonCaught", { pokemonName: pokemon.getNameToRender() }), null, doPokemonCatchMenu, 0, true); + globalScene.ui.showText( + i18next.t(isObtain ? "battle:pokemonObtained" : "battle:pokemonCaught", { + pokemonName: pokemon.getNameToRender(), + }), + null, + doPokemonCatchMenu, + 0, + true, + ); } else { doPokemonCatchMenu(); } @@ -654,9 +796,9 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po * @param scene * @param pokeball */ -function removePb(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite) { +function removePb(pokeball: Phaser.GameObjects.Sprite) { if (pokeball) { - scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, duration: 250, delay: 250, @@ -664,7 +806,7 @@ function removePb(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite) { alpha: 0, onComplete: () => { pokeball.destroy(); - } + }, }); } } @@ -674,11 +816,11 @@ function removePb(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite) { * @param scene * @param pokemon */ -export async function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { +export async function doPokemonFlee(pokemon: EnemyPokemon): Promise { await new Promise(resolve => { - scene.playSound("se/flee"); + globalScene.playSound("se/flee"); // Ease pokemon out - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemon, x: "+=16", y: "-=16", @@ -688,12 +830,18 @@ export async function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): scale: pokemon.getSpriteScale(), onComplete: () => { pokemon.setVisible(false); - scene.field.remove(pokemon, true); - showEncounterText(scene, i18next.t("battle:pokemonFled", { pokemonName: pokemon.getNameToRender() }), null, 600, false) - .then(() => { - resolve(); - }); - } + pokemon.leaveField(true, true, true); + showEncounterText( + i18next.t("battle:pokemonFled", { + pokemonName: pokemon.getNameToRender(), + }), + null, + 600, + false, + ).then(() => { + resolve(); + }); + }, }); }); } @@ -703,10 +851,10 @@ export async function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): * @param scene * @param pokemon */ -export function doPlayerFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { +export function doPlayerFlee(pokemon: EnemyPokemon): Promise { return new Promise(resolve => { // Ease pokemon out - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemon, x: "+=16", y: "-=16", @@ -716,12 +864,18 @@ export function doPlayerFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise scale: pokemon.getSpriteScale(), onComplete: () => { pokemon.setVisible(false); - scene.field.remove(pokemon, true); - showEncounterText(scene, i18next.t("battle:playerFled", { pokemonName: pokemon.getNameToRender() }), null, 600, false) - .then(() => { - resolve(); - }); - } + pokemon.leaveField(true, true, true); + showEncounterText( + i18next.t("battle:playerFled", { + pokemonName: pokemon.getNameToRender(), + }), + null, + 600, + false, + ).then(() => { + resolve(); + }); + }, }); }); } @@ -730,33 +884,33 @@ export function doPlayerFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise * Bug Species and their corresponding weights */ const GOLDEN_BUG_NET_SPECIES_POOL: [Species, number][] = [ - [ Species.SCYTHER, 40 ], - [ Species.SCIZOR, 40 ], - [ Species.KLEAVOR, 40 ], - [ Species.PINSIR, 40 ], - [ Species.HERACROSS, 40 ], - [ Species.YANMA, 40 ], - [ Species.YANMEGA, 40 ], - [ Species.SHUCKLE, 40 ], - [ Species.ANORITH, 40 ], - [ Species.ARMALDO, 40 ], - [ Species.ESCAVALIER, 40 ], - [ Species.ACCELGOR, 40 ], - [ Species.JOLTIK, 40 ], - [ Species.GALVANTULA, 40 ], - [ Species.DURANT, 40 ], - [ Species.LARVESTA, 40 ], - [ Species.VOLCARONA, 40 ], - [ Species.DEWPIDER, 40 ], - [ Species.ARAQUANID, 40 ], - [ Species.WIMPOD, 40 ], - [ Species.GOLISOPOD, 40 ], - [ Species.SIZZLIPEDE, 40 ], - [ Species.CENTISKORCH, 40 ], - [ Species.NYMBLE, 40 ], - [ Species.LOKIX, 40 ], - [ Species.BUZZWOLE, 1 ], - [ Species.PHEROMOSA, 1 ], + [Species.SCYTHER, 40], + [Species.SCIZOR, 40], + [Species.KLEAVOR, 40], + [Species.PINSIR, 40], + [Species.HERACROSS, 40], + [Species.YANMA, 40], + [Species.YANMEGA, 40], + [Species.SHUCKLE, 40], + [Species.ANORITH, 40], + [Species.ARMALDO, 40], + [Species.ESCAVALIER, 40], + [Species.ACCELGOR, 40], + [Species.JOLTIK, 40], + [Species.GALVANTULA, 40], + [Species.DURANT, 40], + [Species.LARVESTA, 40], + [Species.VOLCARONA, 40], + [Species.DEWPIDER, 40], + [Species.ARAQUANID, 40], + [Species.WIMPOD, 40], + [Species.GOLISOPOD, 40], + [Species.SIZZLIPEDE, 40], + [Species.CENTISKORCH, 40], + [Species.NYMBLE, 40], + [Species.LOKIX, 40], + [Species.BUZZWOLE, 1], + [Species.PHEROMOSA, 1], ]; /** @@ -785,35 +939,38 @@ export function getGoldenBugNetSpecies(level: number): PokemonSpecies { * @param scene * @param levelAdditiveModifier Default 0. will add +(1 level / 10 waves * levelAdditiveModifier) to the level calculation */ -export function getEncounterPokemonLevelForWave(scene: BattleScene, levelAdditiveModifier: number = 0) { - const currentBattle = scene.currentBattle; +export function getEncounterPokemonLevelForWave(levelAdditiveModifier = 0) { + const currentBattle = globalScene.currentBattle; const baseLevel = currentBattle.getLevelForWave(); // Add a level scaling modifier that is (+1 level per 10 waves) * levelAdditiveModifier return baseLevel + Math.max(Math.round((currentBattle.waveIndex / 10) * levelAdditiveModifier), 0); } -export async function addPokemonDataToDexAndValidateAchievements(scene: BattleScene, pokemon: PlayerPokemon) { +export async function addPokemonDataToDexAndValidateAchievements(pokemon: PlayerPokemon) { const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); - if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { - scene.validateAchv(achvs.HIDDEN_ABILITY); + if ( + speciesForm.abilityHidden && + (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1 + ) { + globalScene.validateAchv(achvs.HIDDEN_ABILITY); } if (pokemon.species.subLegendary) { - scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + globalScene.validateAchv(achvs.CATCH_SUB_LEGENDARY); } if (pokemon.species.legendary) { - scene.validateAchv(achvs.CATCH_LEGENDARY); + globalScene.validateAchv(achvs.CATCH_LEGENDARY); } if (pokemon.species.mythical) { - scene.validateAchv(achvs.CATCH_MYTHICAL); + globalScene.validateAchv(achvs.CATCH_MYTHICAL); } - scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); - return scene.gameData.setPokemonCaught(pokemon, true, false, false); + globalScene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); + return globalScene.gameData.setPokemonCaught(pokemon, true, false, false); } /** @@ -825,12 +982,19 @@ export async function addPokemonDataToDexAndValidateAchievements(scene: BattleSc * @param scene * @param invalidSelectionKey */ -export function isPokemonValidForEncounterOptionSelection(pokemon: Pokemon, scene: BattleScene, invalidSelectionKey: string): string | null { - if (!pokemon.isAllowed()) { - return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.getNameToRender() }) ?? null; +export function isPokemonValidForEncounterOptionSelection( + pokemon: Pokemon, + invalidSelectionKey: string, +): string | null { + if (!pokemon.isAllowedInChallenge()) { + return ( + i18next.t("partyUiHandler:cantBeUsed", { + pokemonName: pokemon.getNameToRender(), + }) ?? null + ); } if (!pokemon.isAllowedInBattle()) { - return getEncounterText(scene, invalidSelectionKey) ?? null; + return getEncounterText(invalidSelectionKey) ?? null; } return null; diff --git a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts index fcadb101817..15085bb2bf8 100644 --- a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts +++ b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts @@ -1,13 +1,13 @@ -import BattleScene from "#app/battle-scene"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; import { getFrameMs } from "#app/utils"; import { cos, sin } from "#app/field/anims"; import { getTypeRgb } from "#app/data/type"; +import { globalScene } from "#app/global-scene"; export enum TransformationScreenPosition { CENTER, LEFT, - RIGHT + RIGHT, } /** @@ -17,10 +17,14 @@ export enum TransformationScreenPosition { * @param transformPokemon * @param screenPosition */ -export function doPokemonTransformationSequence(scene: BattleScene, previousPokemon: PlayerPokemon, transformPokemon: PlayerPokemon, screenPosition: TransformationScreenPosition) { +export function doPokemonTransformationSequence( + previousPokemon: PlayerPokemon, + transformPokemon: PlayerPokemon, + screenPosition: TransformationScreenPosition, +) { return new Promise(resolve => { - const transformationContainer = scene.fieldUI.getByName("Dream Background") as Phaser.GameObjects.Container; - const transformationBaseBg = scene.add.image(0, 0, "default_bg"); + const transformationContainer = globalScene.fieldUI.getByName("Dream Background") as Phaser.GameObjects.Container; + const transformationBaseBg = globalScene.add.image(0, 0, "default_bg"); transformationBaseBg.setOrigin(0, 0); transformationBaseBg.setVisible(false); transformationContainer.add(transformationBaseBg); @@ -30,14 +34,26 @@ export function doPokemonTransformationSequence(scene: BattleScene, previousPoke let pokemonEvoSprite: Phaser.GameObjects.Sprite; let pokemonEvoTintSprite: Phaser.GameObjects.Sprite; - const xOffset = screenPosition === TransformationScreenPosition.CENTER ? 0 : - screenPosition === TransformationScreenPosition.RIGHT ? 100 : -100; + const xOffset = + screenPosition === TransformationScreenPosition.CENTER + ? 0 + : screenPosition === TransformationScreenPosition.RIGHT + ? 100 + : -100; // Centered transformations occur at a lower y Position const yOffset = screenPosition !== TransformationScreenPosition.CENTER ? -15 : 0; const getPokemonSprite = () => { - const ret = scene.addPokemonSprite(previousPokemon, transformationBaseBg.displayWidth / 2 + xOffset, transformationBaseBg.displayHeight / 2 + yOffset, "pkmn__sub"); - ret.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const ret = globalScene.addPokemonSprite( + previousPokemon, + transformationBaseBg.displayWidth / 2 + xOffset, + transformationBaseBg.displayHeight / 2 + yOffset, + "pkmn__sub", + ); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); return ret; }; @@ -48,19 +64,30 @@ export function doPokemonTransformationSequence(scene: BattleScene, previousPoke pokemonSprite.setAlpha(0); pokemonTintSprite.setAlpha(0); - pokemonTintSprite.setTintFill(0xFFFFFF); + pokemonTintSprite.setTintFill(0xffffff); pokemonEvoSprite.setVisible(false); pokemonEvoTintSprite.setVisible(false); - pokemonEvoTintSprite.setTintFill(0xFFFFFF); + pokemonEvoTintSprite.setTintFill(0xffffff); - [ pokemonSprite, pokemonTintSprite, pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { - sprite.play(previousPokemon.getSpriteKey(true)); - sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(previousPokemon.getTeraType()) }); + [pokemonSprite, pokemonTintSprite, pokemonEvoSprite, pokemonEvoTintSprite].map(sprite => { + const spriteKey = previousPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(previousPokemon.getTeraType()), + isTerastallized: previousPokemon.isTerastallized, + }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", previousPokemon.getSpriteKey()); sprite.setPipelineData("shiny", previousPokemon.shiny); sprite.setPipelineData("variant", previousPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (previousPokemon.summonData?.speciesForm) { k += "Base"; } @@ -68,13 +95,19 @@ export function doPokemonTransformationSequence(scene: BattleScene, previousPoke }); }); - [ pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { - sprite.play(transformPokemon.getSpriteKey(true)); + [pokemonEvoSprite, pokemonEvoTintSprite].map(sprite => { + 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); sprite.setPipelineData("variant", transformPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (transformPokemon.summonData?.speciesForm) { k += "Base"; } @@ -82,14 +115,14 @@ export function doPokemonTransformationSequence(scene: BattleScene, previousPoke }); }); - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemonSprite, alpha: 1, ease: "Cubic.easeInOut", duration: 2000, onComplete: () => { - doSpiralUpward(scene, transformationBaseBg, transformationContainer, xOffset, yOffset); - scene.tweens.addCounter({ + doSpiralUpward(transformationBaseBg, transformationContainer, xOffset, yOffset); + globalScene.tweens.addCounter({ from: 0, to: 1, duration: 1000, @@ -98,26 +131,26 @@ export function doPokemonTransformationSequence(scene: BattleScene, previousPoke }, onComplete: () => { pokemonSprite.setVisible(false); - scene.time.delayedCall(700, () => { - doArcDownward(scene, transformationBaseBg, transformationContainer, xOffset, yOffset); - scene.time.delayedCall(1000, () => { + globalScene.time.delayedCall(700, () => { + doArcDownward(transformationBaseBg, transformationContainer, xOffset, yOffset); + globalScene.time.delayedCall(1000, () => { pokemonEvoTintSprite.setScale(0.25); pokemonEvoTintSprite.setVisible(true); - doCycle(scene, 1.5, 6, pokemonTintSprite, pokemonEvoTintSprite).then(() => { + doCycle(1.5, 6, pokemonTintSprite, pokemonEvoTintSprite).then(() => { pokemonEvoSprite.setVisible(true); - doCircleInward(scene, transformationBaseBg, transformationContainer, xOffset, yOffset); + doCircleInward(transformationBaseBg, transformationContainer, xOffset, yOffset); - scene.time.delayedCall(900, () => { - scene.tweens.add({ + globalScene.time.delayedCall(900, () => { + globalScene.tweens.add({ targets: pokemonEvoTintSprite, alpha: 0, duration: 1500, delay: 150, easing: "Sine.easeIn", onComplete: () => { - scene.time.delayedCall(3000, () => { + globalScene.time.delayedCall(3000, () => { resolve(); - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemonEvoSprite, alpha: 0, duration: 2000, @@ -127,18 +160,18 @@ export function doPokemonTransformationSequence(scene: BattleScene, previousPoke previousPokemon.destroy(); transformPokemon.setVisible(false); transformPokemon.setAlpha(1); - } + }, }); }); - } + }, }); }); }); }); }); - } + }, }); - } + }, }); }); } @@ -151,22 +184,33 @@ export function doPokemonTransformationSequence(scene: BattleScene, previousPoke * @param xOffset * @param yOffset */ -function doSpiralUpward(scene: BattleScene, transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doSpiralUpward( + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { let f = 0; - scene.tweens.addCounter({ + globalScene.tweens.addCounter({ repeat: 64, duration: getFrameMs(1), onRepeat: () => { if (f < 64) { if (!(f & 7)) { for (let i = 0; i < 4; i++) { - doSpiralUpwardParticle(scene, (f & 120) * 2 + i * 64, transformationBaseBg, transformationContainer, xOffset, yOffset); + doSpiralUpwardParticle( + (f & 120) * 2 + i * 64, + transformationBaseBg, + transformationContainer, + xOffset, + yOffset, + ); } } f++; } - } + }, }); } @@ -178,22 +222,27 @@ function doSpiralUpward(scene: BattleScene, transformationBaseBg: Phaser.GameObj * @param xOffset * @param yOffset */ -function doArcDownward(scene: BattleScene, transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doArcDownward( + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { let f = 0; - scene.tweens.addCounter({ + globalScene.tweens.addCounter({ repeat: 96, duration: getFrameMs(1), onRepeat: () => { if (f < 96) { if (f < 6) { for (let i = 0; i < 9; i++) { - doArcDownParticle(scene, i * 16, transformationBaseBg, transformationContainer, xOffset, yOffset); + doArcDownParticle(i * 16, transformationBaseBg, transformationContainer, xOffset, yOffset); } } f++; } - } + }, }); } @@ -205,17 +254,22 @@ function doArcDownward(scene: BattleScene, transformationBaseBg: Phaser.GameObje * @param pokemonTintSprite * @param pokemonEvoTintSprite */ -function doCycle(scene: BattleScene, l: number, lastCycle: number, pokemonTintSprite: Phaser.GameObjects.Sprite, pokemonEvoTintSprite: Phaser.GameObjects.Sprite): Promise { +function doCycle( + l: number, + lastCycle: number, + pokemonTintSprite: Phaser.GameObjects.Sprite, + pokemonEvoTintSprite: Phaser.GameObjects.Sprite, +): Promise { return new Promise(resolve => { const isLastCycle = l === lastCycle; - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemonTintSprite, scale: 0.25, ease: "Cubic.easeInOut", duration: 500 / l, - yoyo: !isLastCycle + yoyo: !isLastCycle, }); - scene.tweens.add({ + globalScene.tweens.add({ targets: pokemonEvoTintSprite, scale: 1, ease: "Cubic.easeInOut", @@ -223,12 +277,12 @@ function doCycle(scene: BattleScene, l: number, lastCycle: number, pokemonTintSp yoyo: !isLastCycle, onComplete: () => { if (l < lastCycle) { - doCycle(scene, l + 0.5, lastCycle, pokemonTintSprite, pokemonEvoTintSprite).then(success => resolve(success)); + doCycle(l + 0.5, lastCycle, pokemonTintSprite, pokemonEvoTintSprite).then(success => resolve(success)); } else { pokemonTintSprite.setVisible(false); resolve(true); } - } + }, }); }); } @@ -241,24 +295,29 @@ function doCycle(scene: BattleScene, l: number, lastCycle: number, pokemonTintSp * @param xOffset * @param yOffset */ -function doCircleInward(scene: BattleScene, transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doCircleInward( + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { let f = 0; - scene.tweens.addCounter({ + globalScene.tweens.addCounter({ repeat: 48, duration: getFrameMs(1), onRepeat: () => { if (!f) { for (let i = 0; i < 16; i++) { - doCircleInwardParticle(scene, i * 16, 4, transformationBaseBg, transformationContainer, xOffset, yOffset); + doCircleInwardParticle(i * 16, 4, transformationBaseBg, transformationContainer, xOffset, yOffset); } } else if (f === 32) { for (let i = 0; i < 16; i++) { - doCircleInwardParticle(scene, i * 16, 8, transformationBaseBg, transformationContainer, xOffset, yOffset); + doCircleInwardParticle(i * 16, 8, transformationBaseBg, transformationContainer, xOffset, yOffset); } } f++; - } + }, }); } @@ -271,20 +330,26 @@ function doCircleInward(scene: BattleScene, transformationBaseBg: Phaser.GameObj * @param xOffset * @param yOffset */ -function doSpiralUpwardParticle(scene: BattleScene, trigIndex: number, transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doSpiralUpwardParticle( + trigIndex: number, + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { const initialX = transformationBaseBg.displayWidth / 2 + xOffset; - const particle = scene.add.image(initialX, 0, "evo_sparkle"); + const particle = globalScene.add.image(initialX, 0, "evo_sparkle"); transformationContainer.add(particle); let f = 0; let amp = 48; - const particleTimer = scene.tweens.addCounter({ + const particleTimer = globalScene.tweens.addCounter({ repeat: -1, duration: getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -292,7 +357,7 @@ function doSpiralUpwardParticle(scene: BattleScene, trigIndex: number, transform particle.setPosition(initialX, 88 - (f * f) / 80 + yOffset); particle.y += sin(trigIndex, amp) / 4; particle.x += cos(trigIndex, amp); - particle.setScale(1 - (f / 80)); + particle.setScale(1 - f / 80); trigIndex += 4; if (f & 1) { amp--; @@ -316,21 +381,27 @@ function doSpiralUpwardParticle(scene: BattleScene, trigIndex: number, transform * @param xOffset * @param yOffset */ -function doArcDownParticle(scene: BattleScene, trigIndex: number, transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doArcDownParticle( + trigIndex: number, + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { const initialX = transformationBaseBg.displayWidth / 2 + xOffset; - const particle = scene.add.image(initialX, 0, "evo_sparkle"); + const particle = globalScene.add.image(initialX, 0, "evo_sparkle"); particle.setScale(0.5); transformationContainer.add(particle); let f = 0; let amp = 8; - const particleTimer = scene.tweens.addCounter({ + const particleTimer = globalScene.tweens.addCounter({ repeat: -1, duration: getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -359,20 +430,27 @@ function doArcDownParticle(scene: BattleScene, trigIndex: number, transformation * @param xOffset * @param yOffset */ -function doCircleInwardParticle(scene: BattleScene, trigIndex: number, speed: number, transformationBaseBg: Phaser.GameObjects.Image, transformationContainer: Phaser.GameObjects.Container, xOffset: number, yOffset: number) { +function doCircleInwardParticle( + trigIndex: number, + speed: number, + transformationBaseBg: Phaser.GameObjects.Image, + transformationContainer: Phaser.GameObjects.Container, + xOffset: number, + yOffset: number, +) { const initialX = transformationBaseBg.displayWidth / 2 + xOffset; const initialY = transformationBaseBg.displayHeight / 2 + yOffset; - const particle = scene.add.image(initialX, initialY, "evo_sparkle"); + const particle = globalScene.add.image(initialX, initialY, "evo_sparkle"); transformationContainer.add(particle); let amp = 120; - const particleTimer = scene.tweens.addCounter({ + const particleTimer = globalScene.tweens.addCounter({ repeat: -1, duration: getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { diff --git a/src/data/nature.ts b/src/data/nature.ts index edac06f1a4f..e23d92c14b0 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -3,15 +3,19 @@ import { TextStyle, getBBCodeFrag } from "../ui/text"; import { Nature } from "#enums/nature"; import { UiTheme } from "#enums/ui-theme"; import i18next from "i18next"; -import { Stat, EFFECTIVE_STATS, getShortenedStatKey } from "#app/enums/stat"; +import { Stat, EFFECTIVE_STATS, getShortenedStatKey } from "#enums/stat"; -export { Nature }; - -export function getNatureName(nature: Nature, includeStatEffects: boolean = false, forStarterSelect: boolean = false, ignoreBBCode: boolean = false, uiTheme: UiTheme = UiTheme.DEFAULT): string { +export function getNatureName( + nature: Nature, + includeStatEffects = false, + forStarterSelect = false, + ignoreBBCode = false, + uiTheme: UiTheme = UiTheme.DEFAULT, +): string { let ret = Utils.toReadableString(Nature[nature]); //Translating nature - if (i18next.exists("nature:" + ret)) { - ret = i18next.t("nature:" + ret as any); + if (i18next.exists(`nature:${ret}`)) { + ret = i18next.t(`nature:${ret}` as any); } if (includeStatEffects) { let increasedStat: Stat | null = null; @@ -25,7 +29,9 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals } } const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW; - const getTextFrag = !ignoreBBCode ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) : (text: string, style: TextStyle) => text; + const getTextFrag = !ignoreBBCode + ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) + : (text: string, _style: TextStyle) => text; if (increasedStat && decreasedStat) { ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${i18next.t(getShortenedStatKey(increasedStat))}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${i18next.t(getShortenedStatKey(decreasedStat))}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`; } else { diff --git a/src/data/pokeball.ts b/src/data/pokeball.ts index 57a78e2cd61..b0744237755 100644 --- a/src/data/pokeball.ts +++ b/src/data/pokeball.ts @@ -1,10 +1,10 @@ +import { globalScene } from "#app/global-scene"; +import { CriticalCatchChanceBoosterModifier } from "#app/modifier/modifier"; +import { NumberHolder } from "#app/utils"; import { PokeballType } from "#enums/pokeball"; -import BattleScene from "../battle-scene"; import i18next from "i18next"; -export { PokeballType }; - -export const MAX_PER_TYPE_POKEBALLS: integer = 99; +export const MAX_PER_TYPE_POKEBALLS: number = 99; export function getPokeballAtlasKey(type: PokeballType): string { switch (type) { @@ -82,20 +82,61 @@ export function getPokeballTintColor(type: PokeballType): number { } } -export function doPokeballBounceAnim(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite, y1: number, y2: number, baseBounceDuration: integer, callback: Function) { +/** + * Gets the critical capture chance based on number of mons registered in Dex and modified {@link https://bulbapedia.bulbagarden.net/wiki/Catch_rate Catch rate} + * Formula from {@link https://www.dragonflycave.com/mechanics/gen-vi-vii-capturing Dragonfly Cave Gen 6 Capture Mechanics page} + * @param modifiedCatchRate the modified catch rate as calculated in {@linkcode AttemptCapturePhase} + * @returns the chance of getting a critical capture, out of 256 + */ +export function getCriticalCaptureChance(modifiedCatchRate: number): number { + if (globalScene.gameMode.isFreshStartChallenge()) { + return 0; + } + const dexCount = globalScene.gameData.getSpeciesCount(d => !!d.caughtAttr); + const catchingCharmMultiplier = new NumberHolder(1); + globalScene.findModifier(m => m instanceof CriticalCatchChanceBoosterModifier)?.apply(catchingCharmMultiplier); + const dexMultiplier = + globalScene.gameMode.isDaily || dexCount > 800 + ? 2.5 + : dexCount > 600 + ? 2 + : dexCount > 400 + ? 1.5 + : dexCount > 200 + ? 1 + : dexCount > 100 + ? 0.5 + : 0; + return Math.floor((catchingCharmMultiplier.value * dexMultiplier * Math.min(255, modifiedCatchRate)) / 6); +} + +// TODO: fix Function annotations +export function doPokeballBounceAnim( + pokeball: Phaser.GameObjects.Sprite, + y1: number, + y2: number, + baseBounceDuration: number, + // biome-ignore lint/complexity/noBannedTypes: TODO + callback: Function, + isCritical = false, +) { let bouncePower = 1; let bounceYOffset = y1; let bounceY = y2; const yd = y2 - y1; + const x0 = pokeball.x; + const x1 = x0 + 3; + const x2 = x0 - 3; + let critShakes = 4; const doBounce = () => { - scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, y: y2, duration: bouncePower * baseBounceDuration, ease: "Cubic.easeIn", onComplete: () => { - scene.playSound("se/pb_bounce_1", { volume: bouncePower }); + globalScene.playSound("se/pb_bounce_1", { volume: bouncePower }); bouncePower = bouncePower > 0.01 ? bouncePower * 0.5 : 0; @@ -103,19 +144,54 @@ export function doPokeballBounceAnim(scene: BattleScene, pokeball: Phaser.GameOb bounceYOffset = yd * bouncePower; bounceY = y2 - bounceYOffset; - scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, y: bounceY, duration: bouncePower * baseBounceDuration, ease: "Cubic.easeOut", - onComplete: () => doBounce() + onComplete: () => doBounce(), }); } else if (callback) { callback(); } - } + }, }); }; - doBounce(); + const doCritShake = () => { + globalScene.tweens.add({ + targets: pokeball, + x: x2, + duration: 125, + ease: "Linear", + onComplete: () => { + globalScene.tweens.add({ + targets: pokeball, + x: x1, + duration: 125, + ease: "Linear", + onComplete: () => { + critShakes--; + if (critShakes > 0) { + doCritShake(); + } else { + globalScene.tweens.add({ + targets: pokeball, + x: x0, + duration: 60, + ease: "Linear", + onComplete: () => globalScene.time.delayedCall(500, doBounce), + }); + } + }, + }); + }, + }); + }; + + if (isCritical) { + globalScene.time.delayedCall(500, doCritShake); + } else { + doBounce(); + } } diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 7cc20d50fb9..4636e68d6d6 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -1,18 +1,19 @@ -import { PokemonFormChangeItemModifier, TerastallizeModifier } from "../modifier/modifier"; -import Pokemon from "../field/pokemon"; -import { StatusEffect } from "./status-effect"; -import { MoveCategory, allMoves } from "./move"; -import { Type } from "./type"; -import { Constructor, nil } from "#app/utils"; +import { PokemonFormChangeItemModifier } from "../modifier/modifier"; +import type Pokemon from "../field/pokemon"; +import { StatusEffect } from "#enums/status-effect"; +import { allMoves } from "./moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; +import type { Constructor, nil } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { TimeOfDay } from "#enums/time-of-day"; +import type { TimeOfDay } from "#enums/time-of-day"; import { getPokemonNameWithAffix } from "#app/messages"; import i18next from "i18next"; -import { WeatherType } from "./weather"; +import { WeatherType } from "#enums/weather-type"; import { Challenges } from "#app/enums/challenges"; import { SpeciesFormKey } from "#enums/species-form-key"; +import { globalScene } from "#app/global-scene"; export enum FormChangeItem { NONE, @@ -112,7 +113,7 @@ export enum FormChangeItem { DRACO_PLATE, DREAD_PLATE, PIXIE_PLATE, - BLANK_PLATE, // TODO: Find a potential use for this + BLANK_PLATE, // TODO: Find a potential use for this LEGEND_PLATE, // TODO: Find a potential use for this FIGHTING_MEMORY, FLYING_MEMORY, @@ -131,7 +132,7 @@ export enum FormChangeItem { DRAGON_MEMORY, DARK_MEMORY, FAIRY_MEMORY, - NORMAL_MEMORY // TODO: Find a potential use for this + NORMAL_MEMORY, // TODO: Find a potential use for this } export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean; @@ -145,7 +146,14 @@ export class SpeciesFormChange { public quiet: boolean; public readonly conditions: SpeciesFormChangeCondition[]; - constructor(speciesId: Species, preFormKey: string, evoFormKey: string, trigger: SpeciesFormChangeTrigger, quiet: boolean = false, ...conditions: SpeciesFormChangeCondition[]) { + constructor( + speciesId: Species, + preFormKey: string, + evoFormKey: string, + trigger: SpeciesFormChangeTrigger, + quiet = false, + ...conditions: SpeciesFormChangeCondition[] + ) { this.speciesId = speciesId; this.preFormKey = preFormKey; this.formKey = evoFormKey; @@ -211,7 +219,9 @@ export class SpeciesFormChangeCondition { } export abstract class SpeciesFormChangeTrigger { - canChange(pokemon: Pokemon): boolean { + public description = ""; + + canChange(_pokemon: Pokemon): boolean { return true; } @@ -220,17 +230,22 @@ export abstract class SpeciesFormChangeTrigger { } } -export class SpeciesFormChangeManualTrigger extends SpeciesFormChangeTrigger { - canChange(pokemon: Pokemon): boolean { - return true; - } +export class SpeciesFormChangeManualTrigger extends SpeciesFormChangeTrigger {} + +export class SpeciesFormChangeAbilityTrigger extends SpeciesFormChangeTrigger { + public description: string = i18next.t("pokemonEvolutions:Forms.ability"); } export class SpeciesFormChangeCompoundTrigger { + public description = ""; public triggers: SpeciesFormChangeTrigger[]; constructor(...triggers: SpeciesFormChangeTrigger[]) { this.triggers = triggers; + this.description = this.triggers + .filter(trigger => trigger?.description?.length > 0) + .map(trigger => trigger.description) + .join(", "); } canChange(pokemon: Pokemon): boolean { @@ -252,14 +267,27 @@ export class SpeciesFormChangeItemTrigger extends SpeciesFormChangeTrigger { public item: FormChangeItem; public active: boolean; - constructor(item: FormChangeItem, active: boolean = true) { + constructor(item: FormChangeItem, active = true) { super(); this.item = item; this.active = active; + this.description = this.active + ? i18next.t("pokemonEvolutions:Forms.item", { + item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`), + }) + : i18next.t("pokemonEvolutions:Forms.deactivateItem", { + item: i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.item]}`), + }); } canChange(pokemon: Pokemon): boolean { - return !!pokemon.scene.findModifier(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id && m.formChangeItem === this.item && m.active === this.active); + return !!globalScene.findModifier( + m => + m instanceof PokemonFormChangeItemModifier && + m.pokemonId === pokemon.id && + m.formChangeItem === this.item && + m.active === this.active, + ); } } @@ -269,19 +297,23 @@ export class SpeciesFormChangeTimeOfDayTrigger extends SpeciesFormChangeTrigger constructor(...timesOfDay: TimeOfDay[]) { super(); this.timesOfDay = timesOfDay; + this.description = i18next.t("pokemonEvolutions:Forms.timeOfDay"); } - canChange(pokemon: Pokemon): boolean { - return this.timesOfDay.indexOf(pokemon.scene.arena.getTimeOfDay()) > -1; + canChange(_pokemon: Pokemon): boolean { + return this.timesOfDay.indexOf(globalScene.arena.getTimeOfDay()) > -1; } } export class SpeciesFormChangeActiveTrigger extends SpeciesFormChangeTrigger { public active: boolean; - constructor(active: boolean = false) { + constructor(active = false) { super(); this.active = active; + this.description = this.active + ? i18next.t("pokemonEvolutions:Forms.enter") + : i18next.t("pokemonEvolutions:Forms.leave"); } canChange(pokemon: Pokemon): boolean { @@ -293,17 +325,18 @@ export class SpeciesFormChangeStatusEffectTrigger extends SpeciesFormChangeTrigg public statusEffects: StatusEffect[]; public invert: boolean; - constructor(statusEffects: StatusEffect | StatusEffect[], invert: boolean = false) { + constructor(statusEffects: StatusEffect | StatusEffect[], invert = false) { super(); if (!Array.isArray(statusEffects)) { - statusEffects = [ statusEffects ]; + statusEffects = [statusEffects]; } this.statusEffects = statusEffects; this.invert = invert; + this.description = i18next.t("pokemonEvolutions:Forms.statusEffect"); } canChange(pokemon: Pokemon): boolean { - return (this.statusEffects.indexOf(pokemon.status?.effect || StatusEffect.NONE) > -1) !== this.invert; + return this.statusEffects.indexOf(pokemon.status?.effect || StatusEffect.NONE) > -1 !== this.invert; } } @@ -311,14 +344,26 @@ export class SpeciesFormChangeMoveLearnedTrigger extends SpeciesFormChangeTrigge public move: Moves; public known: boolean; - constructor(move: Moves, known: boolean = true) { + constructor(move: Moves, known = true) { super(); this.move = move; this.known = known; + const moveKey = Moves[this.move] + .split("_") + .filter(f => f) + .map((f, i) => (i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase())) + .join("") as unknown as string; + this.description = known + ? i18next.t("pokemonEvolutions:Forms.moveLearned", { + move: i18next.t(`move:${moveKey}.name`), + }) + : i18next.t("pokemonEvolutions:Forms.moveForgotten", { + move: i18next.t(`move:${moveKey}.name`), + }); } canChange(pokemon: Pokemon): boolean { - return (!!pokemon.moveset.filter(m => m?.moveId === this.move).length) === this.known; + return !!pokemon.moveset.filter(m => m?.moveId === this.move).length === this.known; } } @@ -326,7 +371,7 @@ export abstract class SpeciesFormChangeMoveTrigger extends SpeciesFormChangeTrig public movePredicate: (m: Moves) => boolean; public used: boolean; - constructor(move: Moves | ((m: Moves) => boolean), used: boolean = true) { + constructor(move: Moves | ((m: Moves) => boolean), used = true) { super(); this.movePredicate = typeof move === "function" ? move : (m: Moves) => m === move; this.used = used; @@ -334,25 +379,34 @@ export abstract class SpeciesFormChangeMoveTrigger extends SpeciesFormChangeTrig } export class SpeciesFormChangePreMoveTrigger extends SpeciesFormChangeMoveTrigger { + description = i18next.t("pokemonEvolutions:Forms.preMove"); + canChange(pokemon: Pokemon): boolean { - const command = pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; + const command = globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; return !!command?.move && this.movePredicate(command.move.move) === this.used; } } export class SpeciesFormChangePostMoveTrigger extends SpeciesFormChangeMoveTrigger { + description = i18next.t("pokemonEvolutions:Forms.postMove"); + canChange(pokemon: Pokemon): boolean { - return pokemon.summonData && !!pokemon.getLastXMoves(1).filter(m => this.movePredicate(m.move)).length === this.used; + return ( + pokemon.summonData && !!pokemon.getLastXMoves(1).filter(m => this.movePredicate(m.move)).length === this.used + ); } } export class MeloettaFormChangePostMoveTrigger extends SpeciesFormChangePostMoveTrigger { override canChange(pokemon: Pokemon): boolean { - if (pokemon.scene.gameMode.hasChallenge(Challenges.SINGLE_TYPE)) { + if (globalScene.gameMode.hasChallenge(Challenges.SINGLE_TYPE)) { return false; - } else { - return super.canChange(pokemon); } + // 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); } } @@ -362,10 +416,15 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { constructor(formKey: string) { super(); this.formKey = formKey; + this.description = ""; } canChange(pokemon: Pokemon): boolean { - return this.formKey === pokemon.species.forms[pokemon.scene.getSpeciesFormIndex(pokemon.species, pokemon.gender, pokemon.getNature(), true)].formKey; + return ( + this.formKey === + pokemon.species.forms[globalScene.getSpeciesFormIndex(pokemon.species, pokemon.gender, pokemon.getNature(), true)] + .formKey + ); } } @@ -375,22 +434,7 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { * @extends SpeciesFormChangeTrigger */ export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger { - /** The Tera type that triggers the form change */ - private teraType: Type; - - constructor(teraType: Type) { - super(); - this.teraType = teraType; - } - - /** - * Checks if the associated Pokémon has the required Tera Shard that matches with the associated Tera type. - * @param {Pokemon} pokemon the Pokémon that is trying to do the form change - * @returns `true` if the Pokémon can change forms, `false` otherwise - */ - canChange(pokemon: Pokemon): boolean { - return !!pokemon.scene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id && m.teraType === this.teraType); - } + description = i18next.t("pokemonEvolutions:Forms.tera"); } /** @@ -399,9 +443,7 @@ export class SpeciesFormChangeTeraTrigger extends SpeciesFormChangeTrigger { * @extends SpeciesFormChangeTrigger */ export class SpeciesFormChangeLapseTeraTrigger extends SpeciesFormChangeTrigger { - canChange(pokemon: Pokemon): boolean { - return !!pokemon.scene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === pokemon.id); - } + description = i18next.t("pokemonEvolutions:Forms.teraLapse"); } /** @@ -419,6 +461,7 @@ export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger { super(); this.ability = ability; this.weathers = weathers; + this.description = i18next.t("pokemonEvolutions:Forms.weather"); } /** @@ -428,11 +471,16 @@ export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger { * @returns `true` if the Pokemon can change forms, `false` otherwise */ canChange(pokemon: Pokemon): boolean { - const currentWeather = pokemon.scene.arena.weather?.weatherType ?? WeatherType.NONE; - const isWeatherSuppressed = pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene); + const currentWeather = globalScene.arena.weather?.weatherType ?? WeatherType.NONE; + const isWeatherSuppressed = globalScene.arena.weather?.isEffectSuppressed(); const isAbilitySuppressed = pokemon.summonData.abilitySuppressed; - return !isAbilitySuppressed && !isWeatherSuppressed && (pokemon.hasAbility(this.ability) && this.weathers.includes(currentWeather)); + return ( + !isAbilitySuppressed && + !isWeatherSuppressed && + pokemon.hasAbility(this.ability) && + this.weathers.includes(currentWeather) + ); } } @@ -452,6 +500,7 @@ export class SpeciesFormChangeRevertWeatherFormTrigger extends SpeciesFormChange super(); this.ability = ability; this.weathers = weathers; + this.description = i18next.t("pokemonEvolutions:Forms.weatherRevert"); } /** @@ -462,8 +511,8 @@ export class SpeciesFormChangeRevertWeatherFormTrigger extends SpeciesFormChange */ canChange(pokemon: Pokemon): boolean { if (pokemon.hasAbility(this.ability, false, true)) { - const currentWeather = pokemon.scene.arena.weather?.weatherType ?? WeatherType.NONE; - const isWeatherSuppressed = pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene); + const currentWeather = globalScene.arena.weather?.weatherType ?? WeatherType.NONE; + const isWeatherSuppressed = globalScene.arena.weather?.isEffectSuppressed(); const isAbilitySuppressed = pokemon.summonData.abilitySuppressed; const summonDataAbility = pokemon.summonData.ability; const isAbilityChanged = summonDataAbility !== this.ability && summonDataAbility !== Abilities.NONE; @@ -482,16 +531,27 @@ export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: Specie const isEmax = formChange.formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1; const isRevert = !isMega && formChange.formKey === pokemon.species.forms[0].formKey; if (isMega) { - return i18next.t("battlePokemonForm:megaChange", { preName, pokemonName: pokemon.name }); + return i18next.t("battlePokemonForm:megaChange", { + preName, + pokemonName: pokemon.name, + }); } if (isGmax) { - return i18next.t("battlePokemonForm:gigantamaxChange", { preName, pokemonName: pokemon.name }); + return i18next.t("battlePokemonForm:gigantamaxChange", { + preName, + pokemonName: pokemon.name, + }); } if (isEmax) { - return i18next.t("battlePokemonForm:eternamaxChange", { preName, pokemonName: pokemon.name }); + return i18next.t("battlePokemonForm:eternamaxChange", { + preName, + pokemonName: pokemon.name, + }); } if (isRevert) { - return i18next.t("battlePokemonForm:revertChange", { pokemonName: getPokemonNameWithAffix(pokemon) }); + return i18next.t("battlePokemonForm:revertChange", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } if (pokemon.getAbility().id === Abilities.DISGUISE) { return i18next.t("battlePokemonForm:disguiseChange"); @@ -506,13 +566,14 @@ export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: Specie * @returns A {@linkcode SpeciesFormChangeCondition} checking if that species is registered as caught */ function getSpeciesDependentFormChangeCondition(species: Species): SpeciesFormChangeCondition { - return new SpeciesFormChangeCondition(p => !!p.scene.gameData.dexData[species].caughtAttr); + return new SpeciesFormChangeCondition(_p => !!globalScene.gameData.dexData[species].caughtAttr); } interface PokemonFormChanges { - [key: string]: SpeciesFormChange[] + [key: string]: SpeciesFormChange[]; } +// biome-ignore format: manually formatted export const pokemonFormChanges: PokemonFormChanges = { [Species.VENUSAUR]: [ new SpeciesFormChange(Species.VENUSAUR, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.VENUSAURITE)), @@ -727,27 +788,27 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.SHAYMIN, "land", "sky", new SpeciesFormChangeItemTrigger(FormChangeItem.GRACIDEA)), ], [Species.ARCEUS]: [ - new SpeciesFormChange(Species.ARCEUS, "normal", "fighting", new SpeciesFormChangeItemTrigger(FormChangeItem.FIST_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "flying", new SpeciesFormChangeItemTrigger(FormChangeItem.SKY_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "poison", new SpeciesFormChangeItemTrigger(FormChangeItem.TOXIC_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "ground", new SpeciesFormChangeItemTrigger(FormChangeItem.EARTH_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "rock", new SpeciesFormChangeItemTrigger(FormChangeItem.STONE_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "bug", new SpeciesFormChangeItemTrigger(FormChangeItem.INSECT_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "ghost", new SpeciesFormChangeItemTrigger(FormChangeItem.SPOOKY_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "steel", new SpeciesFormChangeItemTrigger(FormChangeItem.IRON_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "fire", new SpeciesFormChangeItemTrigger(FormChangeItem.FLAME_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "water", new SpeciesFormChangeItemTrigger(FormChangeItem.SPLASH_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "grass", new SpeciesFormChangeItemTrigger(FormChangeItem.MEADOW_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "electric", new SpeciesFormChangeItemTrigger(FormChangeItem.ZAP_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "psychic", new SpeciesFormChangeItemTrigger(FormChangeItem.MIND_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICICLE_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "dragon", new SpeciesFormChangeItemTrigger(FormChangeItem.DRACO_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "dark", new SpeciesFormChangeItemTrigger(FormChangeItem.DREAD_PLATE)), - new SpeciesFormChange(Species.ARCEUS, "normal", "fairy", new SpeciesFormChangeItemTrigger(FormChangeItem.PIXIE_PLATE)) + new SpeciesFormChange(Species.ARCEUS, "normal", "fighting", new SpeciesFormChangeItemTrigger(FormChangeItem.FIST_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "flying", new SpeciesFormChangeItemTrigger(FormChangeItem.SKY_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "poison", new SpeciesFormChangeItemTrigger(FormChangeItem.TOXIC_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "ground", new SpeciesFormChangeItemTrigger(FormChangeItem.EARTH_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "rock", new SpeciesFormChangeItemTrigger(FormChangeItem.STONE_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "bug", new SpeciesFormChangeItemTrigger(FormChangeItem.INSECT_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "ghost", new SpeciesFormChangeItemTrigger(FormChangeItem.SPOOKY_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "steel", new SpeciesFormChangeItemTrigger(FormChangeItem.IRON_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "fire", new SpeciesFormChangeItemTrigger(FormChangeItem.FLAME_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "water", new SpeciesFormChangeItemTrigger(FormChangeItem.SPLASH_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "grass", new SpeciesFormChangeItemTrigger(FormChangeItem.MEADOW_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "electric", new SpeciesFormChangeItemTrigger(FormChangeItem.ZAP_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "psychic", new SpeciesFormChangeItemTrigger(FormChangeItem.MIND_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICICLE_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "dragon", new SpeciesFormChangeItemTrigger(FormChangeItem.DRACO_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "dark", new SpeciesFormChangeItemTrigger(FormChangeItem.DREAD_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), + new SpeciesFormChange(Species.ARCEUS, "normal", "fairy", new SpeciesFormChangeItemTrigger(FormChangeItem.PIXIE_PLATE), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.MULTITYPE))), ], [Species.DARMANITAN]: [ - new SpeciesFormChange(Species.DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.DARMANITAN, "zen", "", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.DARMANITAN, "", "zen", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.DARMANITAN, "zen", "", new SpeciesFormChangeAbilityTrigger(), true) ], [Species.GARBODOR]: [ new SpeciesFormChange(Species.GARBODOR, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) @@ -766,8 +827,8 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.KYUREM, "", "white", new SpeciesFormChangeItemTrigger(FormChangeItem.LIGHT_STONE), false, getSpeciesDependentFormChangeCondition(Species.RESHIRAM)) ], [Species.KELDEO]: [ - new SpeciesFormChange(Species.KELDEO, "ordinary", "resolute", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD)), - new SpeciesFormChange(Species.KELDEO, "resolute", "ordinary", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD, false)) + new SpeciesFormChange(Species.KELDEO, "ordinary", "resolute", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD), false, new SpeciesFormChangeCondition(() => globalScene.gameMode.isDaily !== true)), + new SpeciesFormChange(Species.KELDEO, "resolute", "ordinary", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD, false), false, new SpeciesFormChangeCondition(() => globalScene.gameMode.isDaily !== true)) ], [Species.MELOETTA]: [ new SpeciesFormChange(Species.MELOETTA, "aria", "pirouette", new MeloettaFormChangePostMoveTrigger(Moves.RELIC_SONG), true), @@ -780,12 +841,12 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.GENESECT, "", "douse", new SpeciesFormChangeItemTrigger(FormChangeItem.DOUSE_DRIVE)) ], [Species.GRENINJA]: [ - new SpeciesFormChange(Species.GRENINJA, "battle-bond", "ash", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.GRENINJA, "ash", "battle-bond", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.GRENINJA, "battle-bond", "ash", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.GRENINJA, "ash", "battle-bond", new SpeciesFormChangeAbilityTrigger(), true) ], [Species.PALAFIN] : [ - new SpeciesFormChange(Species.PALAFIN, "zero", "hero", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.PALAFIN, "hero", "zero", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.PALAFIN, "zero", "hero", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.PALAFIN, "hero", "zero", new SpeciesFormChangeAbilityTrigger(), true) ], [Species.AEGISLASH]: [ new SpeciesFormChange(Species.AEGISLASH, "blade", "shield", new SpeciesFormChangePreMoveTrigger(Moves.KINGS_SHIELD), true, new SpeciesFormChangeCondition(p => p.hasAbility(Abilities.STANCE_CHANGE))), @@ -797,10 +858,10 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.XERNEAS, "active", "neutral", new SpeciesFormChangeActiveTrigger(false), true) ], [Species.ZYGARDE]: [ - new SpeciesFormChange(Species.ZYGARDE, "50-pc", "complete", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.ZYGARDE, "complete", "50-pc", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.ZYGARDE, "10-pc", "10-complete", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.ZYGARDE, "10-complete", "10-pc", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.ZYGARDE, "50-pc", "complete", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.ZYGARDE, "complete", "50-pc", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.ZYGARDE, "10-pc", "10-complete", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.ZYGARDE, "10-complete", "10-pc", new SpeciesFormChangeAbilityTrigger(), true) ], [Species.DIANCIE]: [ new SpeciesFormChange(Species.DIANCIE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.DIANCITE)) @@ -809,47 +870,47 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.HOOPA, "", "unbound", new SpeciesFormChangeItemTrigger(FormChangeItem.PRISON_BOTTLE)) ], [Species.WISHIWASHI]: [ - new SpeciesFormChange(Species.WISHIWASHI, "", "school", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.WISHIWASHI, "school", "", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.WISHIWASHI, "", "school", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.WISHIWASHI, "school", "", new SpeciesFormChangeAbilityTrigger(), true) ], [Species.SILVALLY]: [ - new SpeciesFormChange(Species.SILVALLY, "normal", "fighting", new SpeciesFormChangeItemTrigger(FormChangeItem.FIGHTING_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "flying", new SpeciesFormChangeItemTrigger(FormChangeItem.FLYING_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "poison", new SpeciesFormChangeItemTrigger(FormChangeItem.POISON_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "ground", new SpeciesFormChangeItemTrigger(FormChangeItem.GROUND_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "rock", new SpeciesFormChangeItemTrigger(FormChangeItem.ROCK_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "bug", new SpeciesFormChangeItemTrigger(FormChangeItem.BUG_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "ghost", new SpeciesFormChangeItemTrigger(FormChangeItem.GHOST_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "steel", new SpeciesFormChangeItemTrigger(FormChangeItem.STEEL_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "fire", new SpeciesFormChangeItemTrigger(FormChangeItem.FIRE_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "water", new SpeciesFormChangeItemTrigger(FormChangeItem.WATER_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "grass", new SpeciesFormChangeItemTrigger(FormChangeItem.GRASS_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "electric", new SpeciesFormChangeItemTrigger(FormChangeItem.ELECTRIC_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "psychic", new SpeciesFormChangeItemTrigger(FormChangeItem.PSYCHIC_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICE_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "dragon", new SpeciesFormChangeItemTrigger(FormChangeItem.DRAGON_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "dark", new SpeciesFormChangeItemTrigger(FormChangeItem.DARK_MEMORY)), - new SpeciesFormChange(Species.SILVALLY, "normal", "fairy", new SpeciesFormChangeItemTrigger(FormChangeItem.FAIRY_MEMORY)) + new SpeciesFormChange(Species.SILVALLY, "normal", "fighting", new SpeciesFormChangeItemTrigger(FormChangeItem.FIGHTING_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "flying", new SpeciesFormChangeItemTrigger(FormChangeItem.FLYING_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "poison", new SpeciesFormChangeItemTrigger(FormChangeItem.POISON_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "ground", new SpeciesFormChangeItemTrigger(FormChangeItem.GROUND_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "rock", new SpeciesFormChangeItemTrigger(FormChangeItem.ROCK_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "bug", new SpeciesFormChangeItemTrigger(FormChangeItem.BUG_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "ghost", new SpeciesFormChangeItemTrigger(FormChangeItem.GHOST_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "steel", new SpeciesFormChangeItemTrigger(FormChangeItem.STEEL_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "fire", new SpeciesFormChangeItemTrigger(FormChangeItem.FIRE_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "water", new SpeciesFormChangeItemTrigger(FormChangeItem.WATER_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "grass", new SpeciesFormChangeItemTrigger(FormChangeItem.GRASS_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "electric", new SpeciesFormChangeItemTrigger(FormChangeItem.ELECTRIC_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "psychic", new SpeciesFormChangeItemTrigger(FormChangeItem.PSYCHIC_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICE_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "dragon", new SpeciesFormChangeItemTrigger(FormChangeItem.DRAGON_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "dark", new SpeciesFormChangeItemTrigger(FormChangeItem.DARK_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))), + new SpeciesFormChange(Species.SILVALLY, "normal", "fairy", new SpeciesFormChangeItemTrigger(FormChangeItem.FAIRY_MEMORY), true, new SpeciesFormChangeCondition((p) => p.hasAbility(Abilities.RKS_SYSTEM))) ], [Species.MINIOR]: [ - new SpeciesFormChange(Species.MINIOR, "red-meteor", "red", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "red", "red-meteor", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "orange-meteor", "orange", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "orange", "orange-meteor", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "yellow-meteor", "yellow", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "yellow", "yellow-meteor", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "green-meteor", "green", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "green", "green-meteor", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "blue-meteor", "blue", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "blue", "blue-meteor", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "indigo-meteor", "indigo", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "indigo", "indigo-meteor", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "violet-meteor", "violet", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, "violet", "violet-meteor", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.MINIOR, "red-meteor", "red", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "red", "red-meteor", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "orange-meteor", "orange", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "orange", "orange-meteor", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "yellow-meteor", "yellow", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "yellow", "yellow-meteor", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "green-meteor", "green", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "green", "green-meteor", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "blue-meteor", "blue", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "blue", "blue-meteor", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "indigo-meteor", "indigo", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "indigo", "indigo-meteor", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "violet-meteor", "violet", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "violet", "violet-meteor", new SpeciesFormChangeAbilityTrigger(), true) ], [Species.MIMIKYU]: [ - new SpeciesFormChange(Species.MIMIKYU, "disguised", "busted", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MIMIKYU, "busted", "disguised", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.MIMIKYU, "disguised", "busted", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MIMIKYU, "busted", "disguised", new SpeciesFormChangeAbilityTrigger(), true) ], [Species.NECROZMA]: [ new SpeciesFormChange(Species.NECROZMA, "", "dawn-wings", new SpeciesFormChangeItemTrigger(FormChangeItem.N_LUNARIZER), false, getSpeciesDependentFormChangeCondition(Species.LUNALA)), @@ -891,10 +952,10 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.SANDACONDA, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.CRAMORANT]: [ - new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)), - new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeManualTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)), - new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeManualTrigger, true), - new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeManualTrigger, true), + new SpeciesFormChange(Species.CRAMORANT, "", "gulping", new SpeciesFormChangeAbilityTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() >= .5)), + new SpeciesFormChange(Species.CRAMORANT, "", "gorging", new SpeciesFormChangeAbilityTrigger, true, new SpeciesFormChangeCondition(p => p.getHpRatio() < .5)), + new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeAbilityTrigger, true), + new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeAbilityTrigger, true), new SpeciesFormChange(Species.CRAMORANT, "gulping", "", new SpeciesFormChangeActiveTrigger(false), true), new SpeciesFormChange(Species.CRAMORANT, "gorging", "", new SpeciesFormChangeActiveTrigger(false), true) ], @@ -925,12 +986,12 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.ALCREMIE, "rainbow-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.EISCUE]: [ - new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.EISCUE, "", "no-ice", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.EISCUE, "no-ice", "", new SpeciesFormChangeAbilityTrigger(), true) ], [Species.MORPEKO]: [ - new SpeciesFormChange(Species.MORPEKO, "full-belly", "hangry", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MORPEKO, "hangry", "full-belly", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.MORPEKO, "full-belly", "hangry", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.MORPEKO, "hangry", "full-belly", new SpeciesFormChangeAbilityTrigger(), true) ], [Species.COPPERAJAH]: [ new SpeciesFormChange(Species.COPPERAJAH, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) @@ -963,37 +1024,44 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.OGERPON, "teal-mask", "wellspring-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.WELLSPRING_MASK)), new SpeciesFormChange(Species.OGERPON, "teal-mask", "hearthflame-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.HEARTHFLAME_MASK)), new SpeciesFormChange(Species.OGERPON, "teal-mask", "cornerstone-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.CORNERSTONE_MASK)), - new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(Type.GRASS)), - new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.GRASS)), - new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(Type.WATER)), - new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.WATER)), - new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(Type.FIRE)), - new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.FIRE)), - new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(Type.ROCK)), - new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.ROCK)) + new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeLapseTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeLapseTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeLapseTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeLapseTeraTrigger(), true) ], [Species.TERAPAGOS]: [ - new SpeciesFormChange(Species.TERAPAGOS, "", "terastal", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(Type.STELLAR)), - new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true, new SpeciesFormChangeCondition(p => p.getTeraType() !== Type.STELLAR)) + new SpeciesFormChange(Species.TERAPAGOS, "", "terastal", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeTeraTrigger(), true), + new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeLapseTeraTrigger(), true) ], [Species.GALAR_DARMANITAN]: [ - new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.GALAR_DARMANITAN, "zen", "", new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeAbilityTrigger(), true), + new SpeciesFormChange(Species.GALAR_DARMANITAN, "zen", "", new SpeciesFormChangeAbilityTrigger(), true) ], }; export function initPokemonForms() { const formChangeKeys = Object.keys(pokemonFormChanges); - formChangeKeys.forEach(pk => { + for (const pk of formChangeKeys) { const formChanges = pokemonFormChanges[pk]; const newFormChanges: SpeciesFormChange[] = []; for (const fc of formChanges) { const itemTrigger = fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger; if (itemTrigger && !formChanges.find(c => fc.formKey === c.preFormKey && fc.preFormKey === c.formKey)) { - newFormChanges.push(new SpeciesFormChange(fc.speciesId, fc.formKey, fc.preFormKey, new SpeciesFormChangeItemTrigger(itemTrigger.item, false))); + newFormChanges.push( + new SpeciesFormChange( + fc.speciesId, + fc.formKey, + fc.preFormKey, + new SpeciesFormChangeItemTrigger(itemTrigger.item, false), + ), + ); } } formChanges.push(...newFormChanges); - }); + } } diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 96d1eb430fb..1bf97209613 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1,41 +1,82 @@ -import { Localizable } from "#app/interfaces/locales"; +import type { Localizable } from "#app/interfaces/locales"; import { Abilities } from "#enums/abilities"; import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; import i18next from "i18next"; -import BattleScene, { AnySound } from "#app/battle-scene"; -import { GameMode } from "#app/game-mode"; -import { StarterMoveset } from "#app/system/game-data"; +import type { AnySound } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import type { GameMode } from "#app/game-mode"; +import { DexAttr, type StarterMoveset } from "#app/system/game-data"; import * as Utils from "#app/utils"; import { uncatchableSpecies } from "#app/data/balance/biomes"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { GrowthRate } from "#app/data/exp"; -import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import { Type } from "#app/data/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 type { EvolutionLevel } from "#app/data/balance/pokemon-evolutions"; +import { + SpeciesWildEvolutionDelay, + pokemonEvolutions, + pokemonPrevolutions, +} from "#app/data/balance/pokemon-evolutions"; +import { PokemonType } from "#enums/pokemon-type"; +import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; +import { + pokemonFormLevelMoves, + pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, + pokemonSpeciesLevelMoves, +} from "#app/data/balance/pokemon-level-moves"; +import type { Stat } from "#enums/stat"; +import type { Variant, VariantSet } from "#app/data/variant"; +import { variantData } from "#app/data/variant"; import { speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { SpeciesFormKey } from "#enums/species-form-key"; +import { starterPassiveAbilities } from "#app/data/balance/passives"; export enum Region { NORMAL, ALOLA, GALAR, HISUI, - PALDEA + PALDEA, } +// TODO: this is horrible and will need to be removed once a refactor/cleanup of forms is executed. +export const normalForm: Species[] = [ + Species.PIKACHU, + Species.RAICHU, + Species.EEVEE, + Species.JOLTEON, + Species.FLAREON, + Species.VAPOREON, + Species.ESPEON, + Species.UMBREON, + Species.LEAFEON, + Species.GLACEON, + Species.SYLVEON, + Species.PICHU, + Species.ROTOM, + Species.DIALGA, + Species.PALKIA, + Species.KYUREM, + Species.GENESECT, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.ROCKRUFF, + Species.NECROZMA, + Species.MAGEARNA, + Species.MARSHADOW, + Species.CRAMORANT, + Species.ZARUDE, + Species.CALYREX, +]; + /** * Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode Species} enum given * @param species The species to fetch * @returns The associated {@linkcode PokemonSpecies} object */ -export function getPokemonSpecies(species: Species | Species[] | undefined): PokemonSpecies { - if (!species) { - throw new Error("`species` must not be undefined in `getPokemonSpecies()`"); - } +export function getPokemonSpecies(species: Species | Species[]): PokemonSpecies { // If a special pool (named trainers) is used here it CAN happen that they have a array as species (which means choose one of those two). So we catch that with this code block if (Array.isArray(species)) { // Pick a random species from the list @@ -47,10 +88,11 @@ export function getPokemonSpecies(species: Species | Species[] | undefined): Pok return allSpecies[species - 1]; } -export function getPokemonSpeciesForm(species: Species, formIndex: integer): PokemonSpeciesForm { - const retSpecies: PokemonSpecies = species >= 2000 - ? allSpecies.find(s => s.speciesId === species)! // TODO: is the bang correct? - : allSpecies[species - 1]; +export function getPokemonSpeciesForm(species: Species, formIndex: number): PokemonSpeciesForm { + const retSpecies: PokemonSpecies = + species >= 2000 + ? allSpecies.find(s => s.speciesId === species)! // TODO: is the bang correct? + : allSpecies[species - 1]; if (formIndex < retSpecies.forms?.length) { return retSpecies.forms[formIndex]; } @@ -61,8 +103,8 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): const fragAPattern = /([a-z]{2}.*?[aeiou(?:y$)\-\']+)(.*?)$/i; const fragBPattern = /([a-z]{2}.*?[aeiou(?:y$)\-\'])(.*?)$/i; - const [ speciesAPrefixMatch, speciesBPrefixMatch ] = [ speciesAName, speciesBName ].map(n => /^(?:[^ ]+) /.exec(n)); - const [ speciesAPrefix, speciesBPrefix ] = [ speciesAPrefixMatch, speciesBPrefixMatch ].map(m => m ? m[0] : ""); + const [speciesAPrefixMatch, speciesBPrefixMatch] = [speciesAName, speciesBName].map(n => /^(?:[^ ]+) /.exec(n)); + const [speciesAPrefix, speciesBPrefix] = [speciesAPrefixMatch, speciesBPrefixMatch].map(m => (m ? m[0] : "")); if (speciesAPrefix) { speciesAName = speciesAName.slice(speciesAPrefix.length); @@ -71,8 +113,8 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): speciesBName = speciesBName.slice(speciesBPrefix.length); } - const [ speciesASuffixMatch, speciesBSuffixMatch ] = [ speciesAName, speciesBName ].map(n => / (?:[^ ]+)$/.exec(n)); - const [ speciesASuffix, speciesBSuffix ] = [ speciesASuffixMatch, speciesBSuffixMatch ].map(m => m ? m[0] : ""); + const [speciesASuffixMatch, speciesBSuffixMatch] = [speciesAName, speciesBName].map(n => / (?:[^ ]+)$/.exec(n)); + const [speciesASuffix, speciesBSuffix] = [speciesASuffixMatch, speciesBSuffixMatch].map(m => (m ? m[0] : "")); if (speciesASuffix) { speciesAName = speciesAName.slice(0, -speciesASuffix.length); @@ -90,9 +132,7 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): let fragA: string; let fragB: string; - fragA = splitNameA.length === 1 - ? fragAMatch ? fragAMatch[1] : speciesAName - : splitNameA[splitNameA.length - 1]; + fragA = splitNameA.length === 1 ? (fragAMatch ? fragAMatch[1] : speciesAName) : splitNameA[splitNameA.length - 1]; if (splitNameB.length === 1) { if (fragBMatch) { @@ -129,26 +169,44 @@ export type PokemonSpeciesFilter = (species: PokemonSpecies) => boolean; export abstract class PokemonSpeciesForm { public speciesId: Species; - public formIndex: integer; - public generation: integer; - public type1: Type; - public type2: Type | null; - public height: number; - public weight: number; - public ability1: Abilities; - public ability2: Abilities; - public abilityHidden: Abilities; - public baseTotal: integer; - public baseStats: integer[]; - public catchRate: integer; - public baseFriendship: integer; - public baseExp: integer; - public genderDiffs: boolean; - public isStarterSelectable: boolean; + protected _formIndex: number; + protected _generation: number; + readonly type1: PokemonType; + readonly type2: PokemonType | null; + readonly height: number; + readonly weight: number; + readonly ability1: Abilities; + readonly ability2: Abilities; + readonly abilityHidden: Abilities; + readonly baseTotal: number; + readonly baseStats: number[]; + readonly catchRate: number; + readonly baseFriendship: number; + readonly baseExp: number; + readonly genderDiffs: boolean; + readonly isStarterSelectable: boolean; - constructor(type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, - baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs: boolean, isStarterSelectable: boolean) { + constructor( + type1: PokemonType, + type2: PokemonType | null, + height: number, + weight: number, + ability1: Abilities, + ability2: Abilities, + abilityHidden: Abilities, + baseTotal: number, + baseHp: number, + baseAtk: number, + baseDef: number, + baseSpatk: number, + baseSpdef: number, + baseSpd: number, + catchRate: number, + baseFriendship: number, + baseExp: number, + genderDiffs: boolean, + isStarterSelectable: boolean, + ) { this.type1 = type1; this.type2 = type2; this.height = height; @@ -157,7 +215,7 @@ export abstract class PokemonSpeciesForm { this.ability2 = ability2 === Abilities.NONE ? ability1 : ability2; this.abilityHidden = abilityHidden; this.baseTotal = baseTotal; - this.baseStats = [ baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd ]; + this.baseStats = [baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd]; this.catchRate = catchRate; this.baseFriendship = baseFriendship; this.baseExp = baseExp; @@ -172,7 +230,7 @@ export abstract class PokemonSpeciesForm { * @param forStarter boolean to get the nonbaby form of a starter * @returns The species */ - getRootSpeciesId(forStarter: boolean = false): Species { + getRootSpeciesId(forStarter = false): Species { let ret = this.speciesId; while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarterCosts.hasOwnProperty(ret))) { ret = pokemonPrevolutions[ret]; @@ -180,7 +238,23 @@ export abstract class PokemonSpeciesForm { return ret; } - isOfType(type: integer): boolean { + get generation(): number { + return this._generation; + } + + set generation(generation: number) { + this._generation = generation; + } + + get formIndex(): number { + return this._formIndex; + } + + set formIndex(formIndex: number) { + this._formIndex = formIndex; + } + + isOfType(type: number): boolean { return this.type1 === type || (this.type2 !== null && this.type2 === type); } @@ -188,7 +262,7 @@ export abstract class PokemonSpeciesForm { * Method to get the total number of abilities a Pokemon species has. * @returns Number of abilities */ - getAbilityCount(): integer { + getAbilityCount(): number { return this.abilityHidden !== Abilities.NONE ? 3 : 2; } @@ -197,7 +271,7 @@ export abstract class PokemonSpeciesForm { * @param abilityIndex Which ability to get (should only be 0-2) * @returns The id of the Ability */ - getAbility(abilityIndex: integer): Abilities { + getAbility(abilityIndex: number): Abilities { let ret: Abilities; if (abilityIndex === 0) { ret = this.ability1; @@ -209,8 +283,39 @@ export abstract class PokemonSpeciesForm { return ret; } + /** + * Method to get the passive ability of a Pokemon species + * @param formIndex The form index to use, defaults to form for this species instance + * @returns The id of the ability + */ + getPassiveAbility(formIndex?: number): Abilities { + if (Utils.isNullOrUndefined(formIndex)) { + formIndex = this.formIndex; + } + let starterSpeciesId = this.speciesId; + while ( + !(starterSpeciesId in starterPassiveAbilities) || + !(formIndex in starterPassiveAbilities[starterSpeciesId]) + ) { + if (pokemonPrevolutions.hasOwnProperty(starterSpeciesId)) { + starterSpeciesId = pokemonPrevolutions[starterSpeciesId]; + } else { + // If we've reached the base species and still haven't found a matching ability, use form 0 if possible + if (0 in starterPassiveAbilities[starterSpeciesId]) { + return starterPassiveAbilities[starterSpeciesId][0]; + } + console.log("No passive ability found for %s, using run away", this.speciesId); + return Abilities.RUN_AWAY; + } + } + return starterPassiveAbilities[starterSpeciesId][formIndex]; + } + getLevelMoves(): LevelMoves { - if (pokemonSpeciesFormLevelMoves.hasOwnProperty(this.speciesId) && pokemonSpeciesFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex)) { + if ( + pokemonSpeciesFormLevelMoves.hasOwnProperty(this.speciesId) && + pokemonSpeciesFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex) + ) { return pokemonSpeciesFormLevelMoves[this.speciesId][this.formIndex].slice(0); } return pokemonSpeciesLevelMoves[this.speciesId].slice(0); @@ -221,7 +326,7 @@ export abstract class PokemonSpeciesForm { } isObtainable(): boolean { - return (this.generation <= 9 || pokemonPrevolutions.hasOwnProperty(this.speciesId)); + return this.generation <= 9 || pokemonPrevolutions.hasOwnProperty(this.speciesId); } isCatchable(): boolean { @@ -233,7 +338,7 @@ export abstract class PokemonSpeciesForm { } isTrainerForbidden(): boolean { - return [ Species.ETERNAL_FLOETTE, Species.BLOODMOON_URSALUNA ].includes(this.speciesId); + return [Species.ETERNAL_FLOETTE, Species.BLOODMOON_URSALUNA].includes(this.speciesId); } isRareRegional(): boolean { @@ -277,43 +382,43 @@ export abstract class PokemonSpeciesForm { return ret; } - getSpriteAtlasPath(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { - const spriteId = this.getSpriteId(female, formIndex, shiny, variant).replace(/\_{2}/g, "/"); + getSpriteAtlasPath(female: boolean, formIndex?: number, shiny?: boolean, variant?: number, back?: boolean): string { + const spriteId = this.getSpriteId(female, formIndex, shiny, variant, back).replace(/\_{2}/g, "/"); return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } - getSpriteId(female: boolean, formIndex?: integer, shiny?: boolean, variant: integer = 0, back?: boolean): string { + getSpriteId(female: boolean, formIndex?: number, shiny?: boolean, variant = 0, back?: boolean): string { if (formIndex === undefined || this instanceof PokemonForm) { formIndex = this.formIndex; } const formSpriteKey = this.getFormSpriteKey(formIndex); - const showGenderDiffs = this.genderDiffs && female && ![ SpeciesFormKey.MEGA, SpeciesFormKey.GIGANTAMAX ].find(k => formSpriteKey === k); + const showGenderDiffs = + this.genderDiffs && female && ![SpeciesFormKey.MEGA, SpeciesFormKey.GIGANTAMAX].find(k => formSpriteKey === k); const baseSpriteKey = `${showGenderDiffs ? "female__" : ""}${this.speciesId}${formSpriteKey ? `-${formSpriteKey}` : ""}`; let config = variantData; - `${back ? "back__" : ""}${baseSpriteKey}`.split("__").map(p => config ? config = config[p] : null); + `${back ? "back__" : ""}${baseSpriteKey}`.split("__").map(p => (config ? (config = config[p]) : null)); const variantSet = config as VariantSet; return `${back ? "back__" : ""}${shiny && (!variantSet || (!variant && !variantSet[variant || 0])) ? "shiny__" : ""}${baseSpriteKey}${shiny && variantSet && variantSet[variant] === 2 ? `_${variant + 1}` : ""}`; } - getSpriteKey(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { - return `pkmn__${this.getSpriteId(female, formIndex, shiny, variant)}`; + getSpriteKey(female: boolean, formIndex?: number, shiny?: boolean, variant?: number, back?: boolean): string { + return `pkmn__${this.getSpriteId(female, formIndex, shiny, variant, back)}`; } - abstract getFormSpriteKey(formIndex?: integer): string; - + abstract getFormSpriteKey(formIndex?: number): string; /** * Variant Data key/index is either species id or species id followed by -formkey * @param formIndex optional form index for pokemon with different forms * @returns species id if no additional forms, index with formkey if a pokemon with a form */ - getVariantDataIndex(formIndex?: integer) { + getVariantDataIndex(formIndex?: number) { let formkey: string | null = null; - let variantDataIndex: integer | string = this.speciesId; + let variantDataIndex: number | string = this.speciesId; const species = getPokemonSpecies(this.speciesId); if (species.forms.length > 0 && formIndex !== undefined) { formkey = species.forms[formIndex]?.getFormSpriteKey(formIndex); @@ -324,13 +429,14 @@ export abstract class PokemonSpeciesForm { return variantDataIndex; } - getIconAtlasKey(formIndex?: integer, shiny?: boolean, variant?: integer): string { + getIconAtlasKey(formIndex?: number, shiny?: boolean, variant?: number): string { const variantDataIndex = this.getVariantDataIndex(formIndex); - const isVariant = shiny && variantData[variantDataIndex] && (variant !== undefined && variantData[variantDataIndex][variant]); + const isVariant = + shiny && variantData[variantDataIndex] && variant !== undefined && variantData[variantDataIndex][variant]; return `pokemon_icons_${this.generation}${isVariant ? "v" : ""}`; } - getIconId(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { + getIconId(female: boolean, formIndex?: number, shiny?: boolean, variant?: number): string { if (formIndex === undefined) { formIndex = this.formIndex; } @@ -339,13 +445,20 @@ export abstract class PokemonSpeciesForm { let ret = this.speciesId.toString(); - const isVariant = shiny && variantData[variantDataIndex] && (variant !== undefined && variantData[variantDataIndex][variant]); + const isVariant = + shiny && variantData[variantDataIndex] && variant !== undefined && variantData[variantDataIndex][variant]; if (shiny && !isVariant) { ret += "s"; } switch (this.speciesId) { + case Species.DODUO: + case Species.DODRIO: + case Species.MEGANIUM: + case Species.TORCHIC: + case Species.COMBUSKEN: + case Species.BLAZIKEN: case Species.HIPPOPOTAS: case Species.HIPPOWDON: case Species.UNFEZANT: @@ -379,7 +492,7 @@ export abstract class PokemonSpeciesForm { return ret; } - getCryKey(formIndex?: integer): string { + getCryKey(formIndex?: number): string { let speciesId = this.speciesId; if (this.speciesId > 2000) { switch (this.speciesId) { @@ -398,7 +511,9 @@ export abstract class PokemonSpeciesForm { const forms = getPokemonSpecies(speciesId).forms; if (forms.length) { if (formIndex !== undefined && formIndex >= forms.length) { - console.warn(`Attempted accessing form with index ${formIndex} of species ${getPokemonSpecies(speciesId).getName()} with only ${forms.length || 0} forms`); + console.warn( + `Attempted accessing form with index ${formIndex} of species ${getPokemonSpecies(speciesId).getName()} with only ${forms.length || 0} forms`, + ); formIndex = Math.min(formIndex, forms.length - 1); } const formKey = forms[formIndex || 0].formKey; @@ -443,19 +558,22 @@ export abstract class PokemonSpeciesForm { break; } } - return ret; + return `cry/${ret}`; } - validateStarterMoveset(moveset: StarterMoveset, eggMoves: integer): boolean { + validateStarterMoveset(moveset: StarterMoveset, eggMoves: number): boolean { const rootSpeciesId = this.getRootSpeciesId(); for (const moveId of moveset) { if (speciesEggMoves.hasOwnProperty(rootSpeciesId)) { const eggMoveIndex = speciesEggMoves[rootSpeciesId].findIndex(m => m === moveId); - if (eggMoveIndex > -1 && (eggMoves & (1 << eggMoveIndex))) { + if (eggMoveIndex > -1 && eggMoves & (1 << eggMoveIndex)) { continue; } } - if (pokemonFormLevelMoves.hasOwnProperty(this.speciesId) && pokemonFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex)) { + if ( + pokemonFormLevelMoves.hasOwnProperty(this.speciesId) && + pokemonFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex) + ) { if (!pokemonFormLevelMoves[this.speciesId][this.formIndex].find(lm => lm[0] <= 5 && lm[1] === moveId)) { return false; } @@ -467,55 +585,47 @@ export abstract class PokemonSpeciesForm { return true; } - loadAssets(scene: BattleScene, female: boolean, formIndex?: integer, shiny?: boolean, variant?: Variant, startLoad?: boolean): Promise { + loadAssets( + female: boolean, + formIndex?: number, + shiny?: boolean, + variant?: Variant, + startLoad?: boolean, + back?: boolean, + ): Promise { return new Promise(resolve => { - const spriteKey = this.getSpriteKey(female, formIndex, shiny, variant); - scene.loadPokemonAtlas(spriteKey, this.getSpriteAtlasPath(female, formIndex, shiny, variant)); - scene.load.audio(`cry/${this.getCryKey(formIndex)}`, `audio/cry/${this.getCryKey(formIndex)}.m4a`); - scene.load.once(Phaser.Loader.Events.COMPLETE, () => { + const spriteKey = this.getSpriteKey(female, formIndex, shiny, variant, back); + globalScene.loadPokemonAtlas(spriteKey, this.getSpriteAtlasPath(female, formIndex, shiny, variant, back)); + globalScene.load.audio(`${this.getCryKey(formIndex)}`, `audio/${this.getCryKey(formIndex)}.m4a`); + globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => { const originalWarn = console.warn; // Ignore warnings for missing frames, because there will be a lot console.warn = () => {}; - const frameNames = scene.anims.generateFrameNames(spriteKey, { zeroPad: 4, suffix: ".png", start: 1, end: 400 }); + const frameNames = globalScene.anims.generateFrameNames(spriteKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: 400, + }); console.warn = originalWarn; - if (!(scene.anims.exists(spriteKey))) { - scene.anims.create({ - key: this.getSpriteKey(female, formIndex, shiny, variant), + if (!globalScene.anims.exists(spriteKey)) { + globalScene.anims.create({ + key: this.getSpriteKey(female, formIndex, shiny, variant, back), frames: frameNames, - frameRate: 12, - repeat: -1 + frameRate: 10, + repeat: -1, }); } else { - scene.anims.get(spriteKey).frameRate = 12; + globalScene.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; - } - resolve(); + const spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant, back) + .replace("variant/", "") + .replace(/_[1-3]$/, ""); + globalScene.loadPokemonVariantAssets(spriteKey, spritePath, variant).then(() => resolve()); }); if (startLoad) { - if (!scene.load.isLoading()) { - scene.load.start(); + if (!globalScene.load.isLoading()) { + globalScene.load.start(); } } else { resolve(); @@ -523,28 +633,28 @@ export abstract class PokemonSpeciesForm { }); } - cry(scene: BattleScene, soundConfig?: Phaser.Types.Sound.SoundConfig, ignorePlay?: boolean): AnySound { + cry(soundConfig?: Phaser.Types.Sound.SoundConfig, ignorePlay?: boolean): AnySound { const cryKey = this.getCryKey(this.formIndex); - let cry: AnySound | null = scene.sound.get(cryKey) as AnySound; + let cry: AnySound | null = globalScene.sound.get(cryKey) as AnySound; if (cry?.pendingRemove) { cry = null; } - cry = scene.playSound(`cry/${(cry ?? cryKey)}`, soundConfig); + cry = globalScene.playSound(cry ?? cryKey, soundConfig); if (ignorePlay) { cry.stop(); } return cry; } - generateCandyColors(scene: BattleScene): integer[][] { - const sourceTexture = scene.textures.get(this.getSpriteKey(false)); + generateCandyColors(): number[][] { + const sourceTexture = globalScene.textures.get(this.getSpriteKey(false)); const sourceFrame = sourceTexture.frames[sourceTexture.firstFrame]; const sourceImage = sourceTexture.getSourceImage() as HTMLImageElement; const canvas = document.createElement("canvas"); - const spriteColors: integer[][] = []; + const spriteColors: number[][] = []; const context = canvas.getContext("2d"); const frame = sourceFrame; @@ -559,19 +669,26 @@ export abstract class PokemonSpeciesForm { for (let i = 0; i < pixelData.length; i += 4) { if (pixelData[i + 3]) { const pixel = pixelData.slice(i, i + 4); - const [ r, g, b, a ] = pixel; + const [r, g, b, a] = pixel; if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { - spriteColors.push([ r, g, b, a ]); + spriteColors.push([r, g, b, a]); } } } for (let i = 0; i < pixelData.length; i += 4) { - const total = pixelData.slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); + const total = pixelData.slice(i, i + 3).reduce((total: number, value: number) => total + value, 0); if (!total) { continue; } - pixelColors.push(argbFromRgba({ r: pixelData[i], g: pixelData[i + 1], b: pixelData[i + 2], a: pixelData[i + 3] })); + pixelColors.push( + argbFromRgba({ + r: pixelData[i], + g: pixelData[i + 1], + b: pixelData[i + 2], + a: pixelData[i + 3], + }), + ); } } @@ -580,35 +697,83 @@ export abstract class PokemonSpeciesForm { const originalRandom = Math.random; Math.random = () => Phaser.Math.RND.realInRange(0, 1); - scene.executeWithSeedOffset(() => { - paletteColors = QuantizerCelebi.quantize(pixelColors, 2); - }, 0, "This result should not vary"); + globalScene.executeWithSeedOffset( + () => { + paletteColors = QuantizerCelebi.quantize(pixelColors, 2); + }, + 0, + "This result should not vary", + ); Math.random = originalRandom; - return Array.from(paletteColors.keys()).map(c => Object.values(rgbaFromArgb(c)) as integer[]); + return Array.from(paletteColors.keys()).map(c => Object.values(rgbaFromArgb(c)) as number[]); } } export default class PokemonSpecies extends PokemonSpeciesForm implements Localizable { public name: string; - public subLegendary: boolean; - public legendary: boolean; - public mythical: boolean; - public species: string; - public growthRate: GrowthRate; - public malePercent: number | null; - public genderDiffs: boolean; - public canChangeForm: boolean; - public forms: PokemonForm[]; + readonly subLegendary: boolean; + readonly legendary: boolean; + readonly mythical: boolean; + readonly species: string; + readonly growthRate: GrowthRate; + readonly malePercent: number | null; + readonly genderDiffs: boolean; + readonly canChangeForm: boolean; + readonly forms: PokemonForm[]; - constructor(id: Species, generation: integer, subLegendary: boolean, legendary: boolean, mythical: boolean, species: string, - type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, - baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, growthRate: GrowthRate, malePercent: number | null, - genderDiffs: boolean, canChangeForm?: boolean, ...forms: PokemonForm[]) { - super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, - catchRate, baseFriendship, baseExp, genderDiffs, false); + constructor( + id: Species, + generation: number, + subLegendary: boolean, + legendary: boolean, + mythical: boolean, + species: string, + type1: PokemonType, + type2: PokemonType | null, + height: number, + weight: number, + ability1: Abilities, + ability2: Abilities, + abilityHidden: Abilities, + baseTotal: number, + baseHp: number, + baseAtk: number, + baseDef: number, + baseSpatk: number, + baseSpdef: number, + baseSpd: number, + catchRate: number, + baseFriendship: number, + baseExp: number, + growthRate: GrowthRate, + malePercent: number | null, + genderDiffs: boolean, + canChangeForm?: boolean, + ...forms: PokemonForm[] + ) { + super( + type1, + type2, + height, + weight, + ability1, + ability2, + abilityHidden, + baseTotal, + baseHp, + baseAtk, + baseDef, + baseSpatk, + baseSpdef, + baseSpd, + catchRate, + baseFriendship, + baseExp, + genderDiffs, + false, + ); this.speciesId = id; this.formIndex = 0; this.generation = generation; @@ -631,7 +796,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali }); } - getName(formIndex?: integer): string { + getName(formIndex?: number): string { if (formIndex !== undefined && this.forms.length) { const form = this.forms[formIndex]; let key: string | null; @@ -652,21 +817,110 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } if (key) { - return i18next.t(`battlePokemonForm:${key}`, { pokemonName: this.name }); + return i18next.t(`battlePokemonForm:${key}`, { + pokemonName: this.name, + }); } } return this.name; } + /** + * Find the name of species with proper attachments for regionals and separate starter forms (Floette, Ursaluna) + * @returns a string with the region name or other form name attached + */ + getExpandedSpeciesName(): string { + if (this.speciesId < 2000) { + return this.name; // Other special cases could be put here too + } + // Everything beyond this point essentially follows the pattern of FORMNAME_SPECIES + return i18next.t(`pokemonForm:appendForm.${Species[this.speciesId].split("_")[0]}`, { pokemonName: this.name }); + } + + /** + * Find the form name for species with just one form (regional variants, Floette, Ursaluna) + * @param formIndex The form index to check (defaults to 0) + * @param append Whether to append the species name to the end (defaults to false) + * @returns the pokemon-form locale key for the single form name ("Alolan Form", "Eternal Flower" etc) + */ + getFormNameToDisplay(formIndex = 0, append = false): string { + const formKey = this.forms?.[formIndex!]?.formKey; + const formText = Utils.capitalizeString(formKey, "-", false, false) || ""; + const speciesName = Utils.capitalizeString(Species[this.speciesId], "_", true, false); + let ret = ""; + + const region = this.getRegion(); + if (this.speciesId === Species.ARCEUS) { + ret = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); + } else if ( + [ + SpeciesFormKey.MEGA, + SpeciesFormKey.MEGA_X, + SpeciesFormKey.MEGA_Y, + SpeciesFormKey.PRIMAL, + SpeciesFormKey.GIGANTAMAX, + SpeciesFormKey.GIGANTAMAX_RAPID, + SpeciesFormKey.GIGANTAMAX_SINGLE, + SpeciesFormKey.ETERNAMAX, + ].includes(formKey as SpeciesFormKey) + ) { + return append + ? i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: this.name }) + : i18next.t(`pokemonForm:battleForm.${formKey}`); + } else if ( + region === Region.NORMAL || + (this.speciesId === Species.GALAR_DARMANITAN && formIndex > 0) || + this.speciesId === Species.PALDEA_TAUROS + ) { + // More special cases can be added here + const i18key = `pokemonForm:${speciesName}${formText}`; + if (i18next.exists(i18key)) { + ret = i18next.t(i18key); + } else { + const rootSpeciesName = Utils.capitalizeString(Species[this.getRootSpeciesId()], "_", true, false); + const i18RootKey = `pokemonForm:${rootSpeciesName}${formText}`; + ret = i18next.exists(i18RootKey) ? i18next.t(i18RootKey) : formText; + } + } else if (append) { + // Everything beyond this has an expanded name + return this.getExpandedSpeciesName(); + } else if (this.speciesId === Species.ETERNAL_FLOETTE) { + // Not a real form, so the key is made up + return i18next.t("pokemonForm:floetteEternalFlower"); + } else if (this.speciesId === Species.BLOODMOON_URSALUNA) { + // Not a real form, so the key is made up + return i18next.t("pokemonForm:ursalunaBloodmoon"); + } else { + // Only regional forms should be left at this point + return i18next.t(`pokemonForm:regionalForm.${Region[region]}`); + } + return append + ? i18next.t("pokemonForm:appendForm.GENERIC", { + pokemonName: this.name, + formName: ret, + }) + : ret; + } + localize(): void { this.name = i18next.t(`pokemon:${Species[this.speciesId].toLowerCase()}`); } - getWildSpeciesForLevel(level: integer, allowEvolving: boolean, isBoss: boolean, gameMode: GameMode): Species { - return this.getSpeciesForLevel(level, allowEvolving, false, (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0)); + getWildSpeciesForLevel(level: number, allowEvolving: boolean, isBoss: boolean, gameMode: GameMode): Species { + return this.getSpeciesForLevel( + level, + allowEvolving, + false, + (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0), + ); } - getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength, currentWave: number = 0): Species { + getTrainerSpeciesForLevel( + level: number, + allowEvolving = false, + strength: PartyMemberStrength, + currentWave = 0, + ): Species { return this.getSpeciesForLevel(level, allowEvolving, true, strength, currentWave); } @@ -686,9 +940,9 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali * The calculation with evolution delay is a weighted average of the easeIn and easeOut functions where preferredMinLevel is the denominator. * This also means a lower value of x will lead to a higher evolution chance. * @param strength {@linkcode PartyMemberStrength} The strength of the party member in question - * @returns {@linkcode integer} The level difference from expected evolution level tolerated for a mon to be unevolved. Lower value = higher evolution chance. + * @returns {@linkcode number} The level difference from expected evolution level tolerated for a mon to be unevolved. Lower value = higher evolution chance. */ - private getStrengthLevelDiff(strength: PartyMemberStrength): integer { + private getStrengthLevelDiff(strength: PartyMemberStrength): number { switch (Math.min(strength, PartyMemberStrength.STRONGER)) { case PartyMemberStrength.WEAKEST: return 60; @@ -705,7 +959,13 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER, currentWave: number = 0): Species { + getSpeciesForLevel( + level: number, + allowEvolving = false, + forTrainer = false, + strength: PartyMemberStrength = PartyMemberStrength.WEAKER, + currentWave = 0, + ): Species { const prevolutionLevels = this.getPrevolutionLevels(); if (prevolutionLevels.length) { @@ -717,7 +977,14 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } } - if (!allowEvolving || !pokemonEvolutions.hasOwnProperty(this.speciesId)) { + if ( + // If evolutions shouldn't happen, add more cases here :) + !allowEvolving || + !pokemonEvolutions.hasOwnProperty(this.speciesId) || + (globalScene.currentBattle?.waveIndex === 20 && + globalScene.gameMode.isClassic && + globalScene.currentBattle.trainer) + ) { return this.speciesId; } @@ -750,20 +1017,32 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali const maxLevelDiff = this.getStrengthLevelDiff(strength); //The maximum distance from the evolution level tolerated for the mon to not evolve const minChance: number = 0.875 - 0.125 * strength; - evolutionChance = Math.min(minChance + easeInFunc(Math.min(level - ev.level, maxLevelDiff) / maxLevelDiff) * (1 - minChance), 1); + evolutionChance = Math.min( + minChance + easeInFunc(Math.min(level - ev.level, maxLevelDiff) / maxLevelDiff) * (1 - minChance), + 1, + ); } } else { - const preferredMinLevel = Math.max((ev.level - 1) + (ev.wildDelay!) * this.getStrengthLevelDiff(strength), 1); // TODO: is the bang correct? + const preferredMinLevel = Math.max(ev.level - 1 + ev.wildDelay! * this.getStrengthLevelDiff(strength), 1); // TODO: is the bang correct? let evolutionLevel = Math.max(ev.level > 1 ? ev.level : Math.floor(preferredMinLevel / 2), 1); if (ev.level <= 1 && pokemonPrevolutions.hasOwnProperty(this.speciesId)) { - const prevolutionLevel = pokemonEvolutions[pokemonPrevolutions[this.speciesId]].find(ev => ev.speciesId === this.speciesId)!.level; // TODO: is the bang correct? + const prevolutionLevel = pokemonEvolutions[pokemonPrevolutions[this.speciesId]].find( + ev => ev.speciesId === this.speciesId, + )!.level; // TODO: is the bang correct? if (prevolutionLevel > 1) { evolutionLevel = prevolutionLevel; } } - evolutionChance = Math.min(0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + 0.35 * easeOutFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5)), 1); + evolutionChance = Math.min( + 0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + + 0.35 * + easeOutFunc( + Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5), + ), + 1, + ); } } @@ -776,14 +1055,14 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali if (evolutionChance > 0) { if (isRegionalEvolution) { - evolutionChance /= (evolutionSpecies.isRareRegional() ? 16 : 4); + evolutionChance /= evolutionSpecies.isRareRegional() ? 16 : 4; } totalWeight += evolutionChance; evolutionPool.set(totalWeight, ev.speciesId); - if ((1 - evolutionChance) < noEvolutionChance) { + if (1 - evolutionChance < noEvolutionChance) { noEvolutionChance = 1 - evolutionChance; } } @@ -797,7 +1076,14 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali for (const weight of evolutionPool.keys()) { if (randValue < weight) { - return getPokemonSpecies(evolutionPool.get(weight)).getSpeciesForLevel(level, true, forTrainer, strength, currentWave); + // TODO: this entire function is dumb and should be changed, adding a `!` here for now until then + return getPokemonSpecies(evolutionPool.get(weight)!).getSpeciesForLevel( + level, + true, + forTrainer, + strength, + currentWave, + ); } } @@ -813,7 +1099,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali for (const e of pokemonEvolutions[this.speciesId]) { const speciesId = e.speciesId; const level = e.level; - evolutionLevels.push([ speciesId, level ]); + evolutionLevels.push([speciesId, level]); //console.log(Species[speciesId], getPokemonSpecies(speciesId), getPokemonSpecies(speciesId).getEvolutionLevels()); const nextEvolutionLevels = getPokemonSpecies(speciesId).getEvolutionLevels(); for (const npl of nextEvolutionLevels) { @@ -831,10 +1117,14 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali const allEvolvingPokemon = Object.keys(pokemonEvolutions); for (const p of allEvolvingPokemon) { for (const e of pokemonEvolutions[p]) { - if (e.speciesId === this.speciesId && (!this.forms.length || !e.evoFormKey || e.evoFormKey === this.forms[this.formIndex].formKey) && prevolutionLevels.every(pe => pe[0] !== parseInt(p))) { - const speciesId = parseInt(p) as Species; + if ( + e.speciesId === this.speciesId && + (!this.forms.length || !e.evoFormKey || e.evoFormKey === this.forms[this.formIndex].formKey) && + prevolutionLevels.every(pe => pe[0] !== Number.parseInt(p)) + ) { + const speciesId = Number.parseInt(p) as Species; const level = e.level; - prevolutionLevels.push([ speciesId, level ]); + prevolutionLevels.push([speciesId, level]); const subPrevolutionLevels = getPokemonSpecies(speciesId).getPrevolutionLevels(); for (const spl of subPrevolutionLevels) { prevolutionLevels.push(spl); @@ -847,21 +1137,53 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } // This could definitely be written better and more accurate to the getSpeciesForLevel logic, but it is only for generating movesets for evolved Pokemon - getSimulatedEvolutionChain(currentLevel: integer, forTrainer: boolean = false, isBoss: boolean = false, player: boolean = false): EvolutionLevel[] { + getSimulatedEvolutionChain( + currentLevel: number, + forTrainer = false, + isBoss = false, + player = false, + ): EvolutionLevel[] { const ret: EvolutionLevel[] = []; if (pokemonPrevolutions.hasOwnProperty(this.speciesId)) { const prevolutionLevels = this.getPrevolutionLevels().reverse(); - const levelDiff = player ? 0 : forTrainer || isBoss ? forTrainer && isBoss ? 2.5 : 5 : 10; - ret.push([ prevolutionLevels[0][0], 1 ]); + const levelDiff = player ? 0 : forTrainer || isBoss ? (forTrainer && isBoss ? 2.5 : 5) : 10; + ret.push([prevolutionLevels[0][0], 1]); for (let l = 1; l < prevolutionLevels.length; l++) { - const evolution = pokemonEvolutions[prevolutionLevels[l - 1][0]].find(e => e.speciesId === prevolutionLevels[l][0]); - ret.push([ prevolutionLevels[l][0], Math.min(Math.max((evolution?.level!) + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max((evolution?.wildDelay!), 0.5) * 5) - 1, 2, (evolution?.level!)), currentLevel - 1) ]); // TODO: are those bangs correct? + const evolution = pokemonEvolutions[prevolutionLevels[l - 1][0]].find( + e => e.speciesId === prevolutionLevels[l][0], + ); + ret.push([ + prevolutionLevels[l][0], + Math.min( + Math.max( + evolution?.level! + + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max(evolution?.wildDelay!, 0.5) * 5) - + 1, + 2, + evolution?.level!, + ), + currentLevel - 1, + ), + ]); // TODO: are those bangs correct? } const lastPrevolutionLevel = ret[prevolutionLevels.length - 1][1]; - const evolution = pokemonEvolutions[prevolutionLevels[prevolutionLevels.length - 1][0]].find(e => e.speciesId === this.speciesId); - ret.push([ this.speciesId, Math.min(Math.max(lastPrevolutionLevel + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max((evolution?.wildDelay!), 0.5) * 5), lastPrevolutionLevel + 1, (evolution?.level!)), currentLevel) ]); // TODO: are those bangs correct? + const evolution = pokemonEvolutions[prevolutionLevels[prevolutionLevels.length - 1][0]].find( + e => e.speciesId === this.speciesId, + ); + ret.push([ + this.speciesId, + Math.min( + Math.max( + lastPrevolutionLevel + + Math.round(Utils.randSeedGauss(0.5, 1 + levelDiff * 0.2) * Math.max(evolution?.wildDelay!, 0.5) * 5), + lastPrevolutionLevel + 1, + evolution?.level!, + ), + currentLevel, + ), + ]); // TODO: are those bangs correct? } else { - ret.push([ this.speciesId, 1 ]); + ret.push([this.speciesId, 1]); } return ret; @@ -870,17 +1192,22 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali getCompatibleFusionSpeciesFilter(): PokemonSpeciesFilter { const hasEvolution = pokemonEvolutions.hasOwnProperty(this.speciesId); const hasPrevolution = pokemonPrevolutions.hasOwnProperty(this.speciesId); - const pseudoLegendary = this.subLegendary; + const subLegendary = this.subLegendary; const legendary = this.legendary; const mythical = this.mythical; return species => { - return (pseudoLegendary || legendary || mythical || - (pokemonEvolutions.hasOwnProperty(species.speciesId) === hasEvolution - && pokemonPrevolutions.hasOwnProperty(species.speciesId) === hasPrevolution)) - && species.subLegendary === pseudoLegendary - && species.legendary === legendary - && species.mythical === mythical - && (this.isTrainerForbidden() || !species.isTrainerForbidden()); + return ( + (subLegendary || + legendary || + mythical || + (pokemonEvolutions.hasOwnProperty(species.speciesId) === hasEvolution && + pokemonPrevolutions.hasOwnProperty(species.speciesId) === hasPrevolution)) && + species.subLegendary === subLegendary && + species.legendary === legendary && + species.mythical === mythical && + (this.isTrainerForbidden() || !species.isTrainerForbidden()) && + species.speciesId !== Species.DITTO + ); }; } @@ -899,14 +1226,48 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return variantData.hasOwnProperty(variantDataIndex) || variantData.hasOwnProperty(this.speciesId); } - getFormSpriteKey(formIndex?: integer) { - if (this.forms.length && (formIndex !== undefined && formIndex >= this.forms.length)) { - console.warn(`Attempted accessing form with index ${formIndex} of species ${this.getName()} with only ${this.forms.length || 0} forms`); + getFormSpriteKey(formIndex?: number) { + if (this.forms.length && formIndex !== undefined && formIndex >= this.forms.length) { + console.warn( + `Attempted accessing form with index ${formIndex} of species ${this.getName()} with only ${this.forms.length || 0} forms`, + ); formIndex = Math.min(formIndex, this.forms.length - 1); } - return this.forms?.length - ? this.forms[formIndex || 0].getFormSpriteKey() - : ""; + return this.forms?.length ? this.forms[formIndex || 0].getFormSpriteKey() : ""; + } + + /** + * Generates a {@linkcode bigint} corresponding to the maximum unlocks possible for this species, + * taking into account if the species has a male/female gender, and which variants are implemented. + * @returns {@linkcode bigint} Maximum unlocks, can be compared with {@linkcode DexEntry.caughtAttr}. + */ + getFullUnlocksData(): bigint { + let caughtAttr = 0n; + caughtAttr += DexAttr.NON_SHINY; + caughtAttr += DexAttr.SHINY; + if (this.malePercent !== null) { + if (this.malePercent > 0) { + caughtAttr += DexAttr.MALE; + } + if (this.malePercent < 100) { + caughtAttr += DexAttr.FEMALE; + } + } + caughtAttr += DexAttr.DEFAULT_VARIANT; + if (this.hasVariants()) { + caughtAttr += DexAttr.VARIANT_2; + caughtAttr += DexAttr.VARIANT_3; + } + + // Summing successive bigints for each obtainable form + caughtAttr += + this?.forms?.length > 1 + ? this.forms + .map((f, index) => (f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index))) + .reduce((acc, val) => acc + val, 0n) + : DexAttr.DEFAULT_FORM; + + return caughtAttr; } } @@ -914,1861 +1275,1879 @@ export class PokemonForm extends PokemonSpeciesForm { public formName: string; public formKey: string; public formSpriteKey: string | null; + public isUnobtainable: boolean; // This is a collection of form keys that have in-run form changes, but should still be separately selectable from the start screen - private starterSelectableKeys: string[] = [ "10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet" ]; + private starterSelectableKeys: string[] = [ + "10", + "50", + "10-pc", + "50-pc", + "red", + "orange", + "yellow", + "green", + "blue", + "indigo", + "violet", + ]; - constructor(formName: string, formKey: string, type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, - baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs?: boolean, formSpriteKey?: string | null, isStarterSelectable?: boolean, ) { - super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, - catchRate, baseFriendship, baseExp, !!genderDiffs, (!!isStarterSelectable || !formKey)); + constructor( + formName: string, + formKey: string, + type1: PokemonType, + type2: PokemonType | null, + height: number, + weight: number, + ability1: Abilities, + ability2: Abilities, + abilityHidden: Abilities, + baseTotal: number, + baseHp: number, + baseAtk: number, + baseDef: number, + baseSpatk: number, + baseSpdef: number, + baseSpd: number, + catchRate: number, + baseFriendship: number, + baseExp: number, + genderDiffs = false, + formSpriteKey: string | null = null, + isStarterSelectable = false, + isUnobtainable = false, + ) { + super( + type1, + type2, + height, + weight, + ability1, + ability2, + abilityHidden, + baseTotal, + baseHp, + baseAtk, + baseDef, + baseSpatk, + baseSpdef, + baseSpd, + catchRate, + baseFriendship, + baseExp, + genderDiffs, + isStarterSelectable || !formKey, + ); this.formName = formName; this.formKey = formKey; - this.formSpriteKey = formSpriteKey !== undefined ? formSpriteKey : null; + this.formSpriteKey = formSpriteKey; + this.isUnobtainable = isUnobtainable; } - getFormSpriteKey(_formIndex?: integer) { + getFormSpriteKey(_formIndex?: number) { return this.formSpriteKey !== null ? this.formSpriteKey : this.formKey; } } -export const noStarterFormKeys: string[] = [ - SpeciesFormKey.MEGA, - SpeciesFormKey.MEGA_X, - SpeciesFormKey.MEGA_Y, - SpeciesFormKey.PRIMAL, - SpeciesFormKey.ORIGIN, - SpeciesFormKey.THERIAN, - SpeciesFormKey.GIGANTAMAX, - SpeciesFormKey.GIGANTAMAX_RAPID, - SpeciesFormKey.GIGANTAMAX_SINGLE, - SpeciesFormKey.ETERNAMAX -].map(k => k.toString()); - /** -* Method to get the daily list of starters with Pokerus. -* @param scene {@linkcode BattleScene} used as part of RNG -* @returns A list of starters with Pokerus -*/ -export function getPokerusStarters(scene: BattleScene): PokemonSpecies[] { + * Method to get the daily list of starters with Pokerus. + * @returns A list of starters with Pokerus + */ +export function getPokerusStarters(): PokemonSpecies[] { const pokerusStarters: PokemonSpecies[] = []; const date = new Date(); date.setUTCHours(0, 0, 0, 0); - scene.executeWithSeedOffset(() => { - while (pokerusStarters.length < POKERUS_STARTER_COUNT) { - const randomSpeciesId = parseInt(Utils.randSeedItem(Object.keys(speciesStarterCosts)), 10); - const species = getPokemonSpecies(randomSpeciesId); - if (!pokerusStarters.includes(species)) { - pokerusStarters.push(species); + globalScene.executeWithSeedOffset( + () => { + while (pokerusStarters.length < POKERUS_STARTER_COUNT) { + const randomSpeciesId = Number.parseInt(Utils.randSeedItem(Object.keys(speciesStarterCosts)), 10); + const species = getPokemonSpecies(randomSpeciesId); + if (!pokerusStarters.includes(species)) { + pokerusStarters.push(species); + } } - } - }, 0, date.getTime().toString()); + }, + 0, + date.getTime().toString(), + ); return pokerusStarters; } export const allSpecies: PokemonSpecies[] = []; +// biome-ignore format: manually formatted export function initSpecies() { allSpecies.push( - new PokemonSpecies(Species.BULBASAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 0.7, 6.9, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.IVYSAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 1, 13, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 405, 60, 62, 63, 80, 80, 60, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.VENUSAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, - new PokemonForm("Normal", "", Type.GRASS, Type.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GRASS, Type.POISON, 2.4, 155.5, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 625, 80, 100, 123, 122, 120, 80, 45, 50, 263, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.POISON, 24, 999.9, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.EFFECT_SPORE, 625, 120, 82, 98, 130, 115, 80, 45, 50, 263, true), - ), - new PokemonSpecies(Species.CHARMANDER, 1, false, false, false, "Lizard Pokémon", Type.FIRE, null, 0.6, 8.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 309, 39, 52, 43, 60, 50, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CHARMELEON, 1, false, false, false, "Flame Pokémon", Type.FIRE, null, 1.1, 19, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 405, 58, 64, 58, 80, 65, 80, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CHARIZARD, 1, false, false, false, "Flame Pokémon", Type.FIRE, Type.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.FIRE, Type.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, false, null, true), - new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, Type.FIRE, Type.DRAGON, 1.7, 110.5, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 634, 78, 130, 111, 130, 85, 100, 45, 50, 267), - new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, Type.FIRE, Type.FLYING, 1.7, 100.5, Abilities.DROUGHT, Abilities.NONE, Abilities.DROUGHT, 634, 78, 104, 78, 159, 115, 100, 45, 50, 267), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.FLYING, 28, 999.9, Abilities.BERSERK, Abilities.NONE, Abilities.BERSERK, 634, 118, 84, 93, 139, 100, 100, 45, 50, 267), - ), - new PokemonSpecies(Species.SQUIRTLE, 1, false, false, false, "Tiny Turtle Pokémon", Type.WATER, null, 0.5, 9, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 314, 44, 48, 65, 50, 64, 43, 45, 50, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.WARTORTLE, 1, false, false, false, "Turtle Pokémon", Type.WATER, null, 1, 22.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 405, 59, 63, 80, 65, 80, 58, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.BLASTOISE, 1, false, false, false, "Shellfish Pokémon", Type.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, null, 1.6, 101.1, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.MEGA_LAUNCHER, 630, 79, 103, 120, 135, 115, 78, 45, 50, 265), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.STEEL, 25, 999.9, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.SHELL_ARMOR, 630, 119, 83, 135, 115, 110, 68, 45, 50, 265), - ), - new PokemonSpecies(Species.CATERPIE, 1, false, false, false, "Worm Pokémon", Type.BUG, null, 0.3, 2.9, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 30, 35, 20, 20, 45, 255, 50, 39, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.METAPOD, 1, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.7, 9.9, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.FLYING, 17, 999.9, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.COMPOUND_EYES, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true), - ), - new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", Type.BUG, Type.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", Type.BUG, Type.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEEDRILL, 1, false, false, false, "Poison Bee Pokémon", Type.BUG, Type.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 178, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.BUG, Type.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 178, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.POISON, 1.4, 40.5, Abilities.ADAPTABILITY, Abilities.NONE, Abilities.ADAPTABILITY, 495, 65, 150, 40, 15, 80, 145, 45, 70, 178), - ), - new PokemonSpecies(Species.PIDGEY, 1, false, false, false, "Tiny Bird Pokémon", Type.NORMAL, Type.FLYING, 0.3, 1.8, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 251, 40, 45, 40, 35, 35, 56, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PIDGEOTTO, 1, false, false, false, "Bird Pokémon", Type.NORMAL, Type.FLYING, 1.1, 30, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 349, 63, 60, 55, 50, 50, 71, 120, 70, 122, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PIDGEOT, 1, false, false, false, "Bird Pokémon", Type.NORMAL, Type.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 216, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.NORMAL, Type.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 216, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, Type.FLYING, 2.2, 50.5, Abilities.NO_GUARD, Abilities.NO_GUARD, Abilities.NO_GUARD, 579, 83, 80, 80, 135, 80, 121, 45, 70, 216), - ), - new PokemonSpecies(Species.RATTATA, 1, false, false, false, "Mouse Pokémon", Type.NORMAL, null, 0.3, 3.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.RATICATE, 1, false, false, false, "Mouse Pokémon", Type.NORMAL, null, 0.7, 18.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 413, 55, 81, 60, 50, 70, 97, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SPEAROW, 1, false, false, false, "Tiny Bird Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2, Abilities.KEEN_EYE, Abilities.NONE, Abilities.SNIPER, 262, 40, 60, 30, 31, 31, 70, 255, 70, 52, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FEAROW, 1, false, false, false, "Beak Pokémon", Type.NORMAL, Type.FLYING, 1.2, 38, Abilities.KEEN_EYE, Abilities.NONE, Abilities.SNIPER, 442, 65, 90, 65, 61, 61, 100, 90, 70, 155, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.EKANS, 1, false, false, false, "Snake Pokémon", Type.POISON, null, 2, 6.9, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 288, 35, 60, 44, 40, 54, 55, 255, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ARBOK, 1, false, false, false, "Cobra Pokémon", Type.POISON, null, 3.5, 65, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 448, 60, 95, 69, 65, 79, 80, 90, 70, 157, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PIKACHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true), - new PokemonForm("Partner", "partner", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), - new PokemonForm("Cosplay", "cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Cool Cosplay", "cool-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Beauty Cosplay", "beauty-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Cute Cosplay", "cute-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Smart Cosplay", "smart-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Tough Cosplay", "tough-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, null, 21, 999.9, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.LIGHTNING_ROD, 530, 125, 95, 60, 90, 70, 90, 190, 50, 112), //+100 BST from Partner Form - ), - new PokemonSpecies(Species.RAICHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.8, 30, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 485, 60, 90, 55, 90, 80, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SANDSHREW, 1, false, false, false, "Mouse Pokémon", Type.GROUND, null, 0.6, 12, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 300, 50, 75, 85, 20, 30, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SANDSLASH, 1, false, false, false, "Mouse Pokémon", Type.GROUND, null, 1, 29.5, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 450, 75, 100, 110, 45, 55, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.NIDORAN_F, 1, false, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.4, 7, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 275, 55, 47, 52, 40, 40, 41, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.NIDORINA, 1, false, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.8, 20, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 365, 70, 62, 67, 55, 55, 56, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.NIDOQUEEN, 1, false, false, false, "Drill Pokémon", Type.POISON, Type.GROUND, 1.3, 60, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.SHEER_FORCE, 505, 90, 92, 87, 75, 85, 76, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.NIDORAN_M, 1, false, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.5, 9, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 273, 46, 57, 40, 40, 40, 50, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 100, false), - new PokemonSpecies(Species.NIDORINO, 1, false, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.9, 19.5, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 365, 61, 72, 57, 55, 55, 65, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 100, false), - new PokemonSpecies(Species.NIDOKING, 1, false, false, false, "Drill Pokémon", Type.POISON, Type.GROUND, 1.4, 62, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.SHEER_FORCE, 505, 81, 102, 77, 85, 75, 85, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 100, false), - new PokemonSpecies(Species.CLEFAIRY, 1, false, false, false, "Fairy Pokémon", Type.FAIRY, null, 0.6, 7.5, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.FRIEND_GUARD, 323, 70, 45, 48, 60, 65, 35, 150, 140, 113, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.CLEFABLE, 1, false, false, false, "Fairy Pokémon", Type.FAIRY, null, 1.3, 40, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.UNAWARE, 483, 95, 70, 73, 95, 90, 60, 25, 140, 242, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.VULPIX, 1, false, false, false, "Fox Pokémon", Type.FIRE, null, 0.6, 9.9, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.DROUGHT, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(Species.NINETALES, 1, false, false, false, "Fox Pokémon", Type.FIRE, null, 1.1, 19.9, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.DROUGHT, 505, 73, 76, 75, 81, 100, 100, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(Species.JIGGLYPUFF, 1, false, false, false, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 0.5, 5.5, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRIEND_GUARD, 270, 115, 45, 20, 45, 25, 20, 170, 50, 95, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.WIGGLYTUFF, 1, false, false, false, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 1, 12, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRISK, 435, 140, 70, 45, 85, 50, 45, 50, 50, 218, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.ZUBAT, 1, false, false, false, "Bat Pokémon", Type.POISON, Type.FLYING, 0.8, 7.5, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 245, 40, 45, 35, 30, 40, 55, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.GOLBAT, 1, false, false, false, "Bat Pokémon", Type.POISON, Type.FLYING, 1.6, 55, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 455, 75, 80, 70, 65, 75, 90, 90, 50, 159, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.ODDISH, 1, false, false, false, "Weed Pokémon", Type.GRASS, Type.POISON, 0.5, 5.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.RUN_AWAY, 320, 45, 50, 55, 75, 65, 30, 255, 50, 64, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GLOOM, 1, false, false, false, "Weed Pokémon", Type.GRASS, Type.POISON, 0.8, 8.6, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.STENCH, 395, 60, 65, 70, 85, 75, 40, 120, 50, 138, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.VILEPLUME, 1, false, false, false, "Flower Pokémon", Type.GRASS, Type.POISON, 1.2, 18.6, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.EFFECT_SPORE, 490, 75, 80, 85, 110, 90, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.PARAS, 1, false, false, false, "Mushroom Pokémon", Type.BUG, Type.GRASS, 0.3, 5.4, Abilities.EFFECT_SPORE, Abilities.DRY_SKIN, Abilities.DAMP, 285, 35, 70, 55, 45, 55, 25, 190, 70, 57, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PARASECT, 1, false, false, false, "Mushroom Pokémon", Type.BUG, Type.GRASS, 1, 29.5, Abilities.EFFECT_SPORE, Abilities.DRY_SKIN, Abilities.DAMP, 405, 60, 95, 80, 60, 80, 30, 75, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VENONAT, 1, false, false, false, "Insect Pokémon", Type.BUG, Type.POISON, 1, 30, Abilities.COMPOUND_EYES, Abilities.TINTED_LENS, Abilities.RUN_AWAY, 305, 60, 55, 50, 40, 55, 45, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VENOMOTH, 1, false, false, false, "Poison Moth Pokémon", Type.BUG, Type.POISON, 1.5, 12.5, Abilities.SHIELD_DUST, Abilities.TINTED_LENS, Abilities.WONDER_SKIN, 450, 70, 65, 60, 90, 75, 90, 75, 70, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DIGLETT, 1, false, false, false, "Mole Pokémon", Type.GROUND, null, 0.2, 0.8, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 265, 10, 55, 25, 35, 45, 95, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUGTRIO, 1, false, false, false, "Mole Pokémon", Type.GROUND, null, 0.7, 33.3, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MEOWTH, 1, false, false, false, "Scratch Cat Pokémon", Type.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 33, 999.9, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 540, 115, 110, 65, 65, 70, 115, 255, 50, 58), //+100 BST from Persian - ), - new PokemonSpecies(Species.PERSIAN, 1, false, false, false, "Classy Cat Pokémon", Type.NORMAL, null, 1, 32, Abilities.LIMBER, Abilities.TECHNICIAN, Abilities.UNNERVE, 440, 65, 70, 60, 65, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PSYDUCK, 1, false, false, false, "Duck Pokémon", Type.WATER, null, 0.8, 19.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 320, 50, 52, 48, 65, 50, 55, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GOLDUCK, 1, false, false, false, "Duck Pokémon", Type.WATER, null, 1.7, 76.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 500, 80, 82, 78, 95, 80, 85, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MANKEY, 1, false, false, false, "Pig Monkey Pokémon", Type.FIGHTING, null, 0.5, 28, Abilities.VITAL_SPIRIT, Abilities.ANGER_POINT, Abilities.DEFIANT, 305, 40, 80, 35, 35, 45, 70, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PRIMEAPE, 1, false, false, false, "Pig Monkey Pokémon", Type.FIGHTING, null, 1, 32, Abilities.VITAL_SPIRIT, Abilities.ANGER_POINT, Abilities.DEFIANT, 455, 65, 105, 60, 60, 70, 95, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GROWLITHE, 1, false, false, false, "Puppy Pokémon", Type.FIRE, null, 0.7, 19, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.JUSTIFIED, 350, 55, 70, 45, 70, 50, 60, 190, 50, 70, GrowthRate.SLOW, 75, false), - new PokemonSpecies(Species.ARCANINE, 1, false, false, false, "Legendary Pokémon", Type.FIRE, null, 1.9, 155, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.JUSTIFIED, 555, 90, 110, 80, 100, 80, 95, 75, 50, 194, GrowthRate.SLOW, 75, false), - new PokemonSpecies(Species.POLIWAG, 1, false, false, false, "Tadpole Pokémon", Type.WATER, null, 0.6, 12.4, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 300, 40, 50, 40, 40, 40, 90, 255, 50, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.POLIWHIRL, 1, false, false, false, "Tadpole Pokémon", Type.WATER, null, 1, 20, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 385, 65, 65, 65, 50, 50, 90, 120, 50, 135, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.POLIWRATH, 1, false, false, false, "Tadpole Pokémon", Type.WATER, Type.FIGHTING, 1.3, 54, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 510, 90, 95, 95, 70, 90, 70, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ABRA, 1, false, false, false, "Psi Pokémon", Type.PSYCHIC, null, 0.9, 19.5, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 310, 25, 20, 15, 105, 55, 90, 200, 50, 62, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.KADABRA, 1, false, false, false, "Psi Pokémon", Type.PSYCHIC, null, 1.3, 56.5, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 400, 40, 35, 30, 120, 70, 105, 100, 50, 140, GrowthRate.MEDIUM_SLOW, 75, true), - new PokemonSpecies(Species.ALAKAZAM, 1, false, false, false, "Psi Pokémon", Type.PSYCHIC, null, 1.5, 48, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, GrowthRate.MEDIUM_SLOW, 75, true, true, - new PokemonForm("Normal", "", Type.PSYCHIC, null, 1.5, 48, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.PSYCHIC, null, 1.2, 48, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 600, 55, 50, 65, 175, 105, 150, 50, 50, 250, true), - ), - new PokemonSpecies(Species.MACHOP, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 0.8, 19.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 305, 70, 80, 50, 35, 35, 35, 180, 50, 61, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.MACHOKE, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 1.5, 70.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 405, 80, 100, 70, 50, 60, 45, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.MACHAMP, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false, true, - new PokemonForm("Normal", "", Type.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIGHTING, null, 25, 999.9, Abilities.GUTS, Abilities.GUTS, Abilities.GUTS, 605, 115, 170, 95, 65, 95, 65, 45, 50, 253), - ), - new PokemonSpecies(Species.BELLSPROUT, 1, false, false, false, "Flower Pokémon", Type.GRASS, Type.POISON, 0.7, 4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1, 6.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.VICTREEBEL, 1, false, false, false, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1.7, 15.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 490, 80, 105, 65, 100, 70, 70, 45, 70, 221, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TENTACOOL, 1, false, false, false, "Jellyfish Pokémon", Type.WATER, Type.POISON, 0.9, 45.5, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TENTACRUEL, 1, false, false, false, "Jellyfish Pokémon", Type.WATER, Type.POISON, 1.6, 55, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 515, 80, 70, 65, 80, 120, 100, 60, 50, 180, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GEODUDE, 1, false, false, false, "Rock Pokémon", Type.ROCK, Type.GROUND, 0.4, 20, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GRAVELER, 1, false, false, false, "Rock Pokémon", Type.ROCK, Type.GROUND, 1, 105, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GOLEM, 1, false, false, false, "Megaton Pokémon", Type.ROCK, Type.GROUND, 1.4, 300, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 495, 80, 120, 130, 55, 65, 45, 45, 70, 223, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PONYTA, 1, false, false, false, "Fire Horse Pokémon", Type.FIRE, null, 1, 30, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RAPIDASH, 1, false, false, false, "Fire Horse Pokémon", Type.FIRE, null, 1.7, 95, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SLOWPOKE, 1, false, false, false, "Dopey Pokémon", Type.WATER, Type.PSYCHIC, 1.2, 36, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SLOWBRO, 1, false, false, false, "Hermit Crab Pokémon", Type.WATER, Type.PSYCHIC, 1.6, 78.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.PSYCHIC, 1.6, 78.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, Type.PSYCHIC, 2, 120, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 590, 95, 75, 180, 130, 80, 30, 75, 50, 172), - ), - new PokemonSpecies(Species.MAGNEMITE, 1, false, false, false, "Magnet Pokémon", Type.ELECTRIC, Type.STEEL, 0.3, 6, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 325, 25, 35, 70, 95, 55, 45, 190, 50, 65, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.MAGNETON, 1, false, false, false, "Magnet Pokémon", Type.ELECTRIC, Type.STEEL, 1, 60, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 465, 50, 60, 95, 120, 70, 70, 60, 50, 163, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.FARFETCHD, 1, false, false, false, "Wild Duck Pokémon", Type.NORMAL, Type.FLYING, 0.8, 15, Abilities.KEEN_EYE, Abilities.INNER_FOCUS, Abilities.DEFIANT, 377, 52, 90, 55, 58, 62, 60, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DODUO, 1, false, false, false, "Twin Bird Pokémon", Type.NORMAL, Type.FLYING, 1.4, 39.2, Abilities.RUN_AWAY, Abilities.EARLY_BIRD, Abilities.TANGLED_FEET, 310, 35, 85, 45, 35, 35, 75, 190, 70, 62, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.DODRIO, 1, false, false, false, "Triple Bird Pokémon", Type.NORMAL, Type.FLYING, 1.8, 85.2, Abilities.RUN_AWAY, Abilities.EARLY_BIRD, Abilities.TANGLED_FEET, 470, 60, 110, 70, 60, 60, 110, 45, 70, 165, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SEEL, 1, false, false, false, "Sea Lion Pokémon", Type.WATER, null, 1.1, 90, Abilities.THICK_FAT, Abilities.HYDRATION, Abilities.ICE_BODY, 325, 65, 45, 55, 45, 70, 45, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DEWGONG, 1, false, false, false, "Sea Lion Pokémon", Type.WATER, Type.ICE, 1.7, 120, Abilities.THICK_FAT, Abilities.HYDRATION, Abilities.ICE_BODY, 475, 90, 70, 80, 70, 95, 70, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GRIMER, 1, false, false, false, "Sludge Pokémon", Type.POISON, null, 0.9, 30, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.POISON_TOUCH, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MUK, 1, false, false, false, "Sludge Pokémon", Type.POISON, null, 1.2, 30, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.POISON_TOUCH, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SHELLDER, 1, false, false, false, "Bivalve Pokémon", Type.WATER, null, 0.3, 4, Abilities.SHELL_ARMOR, Abilities.SKILL_LINK, Abilities.OVERCOAT, 305, 30, 65, 100, 45, 25, 40, 190, 50, 61, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CLOYSTER, 1, false, false, false, "Bivalve Pokémon", Type.WATER, Type.ICE, 1.5, 132.5, Abilities.SHELL_ARMOR, Abilities.SKILL_LINK, Abilities.OVERCOAT, 525, 50, 95, 180, 85, 45, 70, 60, 50, 184, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GASTLY, 1, false, false, false, "Gas Pokémon", Type.GHOST, Type.POISON, 1.3, 0.1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 310, 30, 35, 30, 100, 35, 80, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.HAUNTER, 1, false, false, false, "Gas Pokémon", Type.GHOST, Type.POISON, 1.6, 0.1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 405, 45, 50, 45, 115, 55, 95, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GENGAR, 1, false, false, false, "Shadow Pokémon", Type.GHOST, Type.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.GHOST, Type.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GHOST, Type.POISON, 1.4, 40.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.NONE, 600, 60, 65, 80, 170, 95, 130, 45, 50, 250), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GHOST, Type.POISON, 20, 999.9, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 600, 140, 65, 70, 140, 85, 100, 45, 50, 250), - ), - new PokemonSpecies(Species.ONIX, 1, false, false, false, "Rock Snake Pokémon", Type.ROCK, Type.GROUND, 8.8, 210, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.WEAK_ARMOR, 385, 35, 45, 160, 30, 45, 70, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DROWZEE, 1, false, false, false, "Hypnosis Pokémon", Type.PSYCHIC, null, 1, 32.4, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 328, 60, 48, 45, 43, 90, 42, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HYPNO, 1, false, false, false, "Hypnosis Pokémon", Type.PSYCHIC, null, 1.6, 75.6, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 483, 85, 73, 70, 73, 115, 67, 75, 70, 169, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.KRABBY, 1, false, false, false, "River Crab Pokémon", Type.WATER, null, 0.4, 6.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 325, 30, 105, 90, 25, 25, 50, 225, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KINGLER, 1, false, false, false, "Pincer Pokémon", Type.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 19, 999.9, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 575, 90, 155, 140, 50, 70, 70, 60, 50, 166), - ), - new PokemonSpecies(Species.VOLTORB, 1, false, false, false, "Ball Pokémon", Type.ELECTRIC, null, 0.5, 10.4, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.ELECTRODE, 1, false, false, false, "Ball Pokémon", Type.ELECTRIC, null, 1.2, 66.6, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.EXEGGCUTE, 1, false, false, false, "Egg Pokémon", Type.GRASS, Type.PSYCHIC, 0.4, 2.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HARVEST, 325, 60, 40, 80, 60, 45, 40, 90, 50, 65, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.EXEGGUTOR, 1, false, false, false, "Coconut Pokémon", Type.GRASS, Type.PSYCHIC, 2, 120, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HARVEST, 530, 95, 95, 85, 125, 75, 55, 45, 50, 186, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CUBONE, 1, false, false, false, "Lonely Pokémon", Type.GROUND, null, 0.4, 6.5, Abilities.ROCK_HEAD, Abilities.LIGHTNING_ROD, Abilities.BATTLE_ARMOR, 320, 50, 50, 95, 40, 50, 35, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MAROWAK, 1, false, false, false, "Bone Keeper Pokémon", Type.GROUND, null, 1, 45, Abilities.ROCK_HEAD, Abilities.LIGHTNING_ROD, Abilities.BATTLE_ARMOR, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HITMONLEE, 1, false, false, false, "Kicking Pokémon", Type.FIGHTING, null, 1.5, 49.8, Abilities.LIMBER, Abilities.RECKLESS, Abilities.UNBURDEN, 455, 50, 120, 53, 35, 110, 87, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.HITMONCHAN, 1, false, false, false, "Punching Pokémon", Type.FIGHTING, null, 1.4, 50.2, Abilities.KEEN_EYE, Abilities.IRON_FIST, Abilities.INNER_FOCUS, 455, 50, 105, 79, 35, 110, 76, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.LICKITUNG, 1, false, false, false, "Licking Pokémon", Type.NORMAL, null, 1.2, 65.5, Abilities.OWN_TEMPO, Abilities.OBLIVIOUS, Abilities.CLOUD_NINE, 385, 90, 55, 75, 60, 75, 30, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KOFFING, 1, false, false, false, "Poison Gas Pokémon", Type.POISON, null, 0.6, 1, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.STENCH, 340, 40, 65, 95, 60, 45, 35, 190, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WEEZING, 1, false, false, false, "Poison Gas Pokémon", Type.POISON, null, 1.2, 9.5, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.STENCH, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RHYHORN, 1, false, false, false, "Spikes Pokémon", Type.GROUND, Type.ROCK, 1, 115, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, Abilities.RECKLESS, 345, 80, 85, 95, 30, 30, 25, 120, 50, 69, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.RHYDON, 1, false, false, false, "Drill Pokémon", Type.GROUND, Type.ROCK, 1.9, 120, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, Abilities.RECKLESS, 485, 105, 130, 120, 45, 45, 40, 60, 50, 170, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.CHANSEY, 1, false, false, false, "Egg Pokémon", Type.NORMAL, null, 1.1, 34.6, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 450, 250, 5, 5, 35, 105, 50, 30, 140, 395, GrowthRate.FAST, 0, false), - new PokemonSpecies(Species.TANGELA, 1, false, false, false, "Vine Pokémon", Type.GRASS, null, 1, 35, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.REGENERATOR, 435, 65, 55, 115, 100, 40, 60, 45, 50, 87, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KANGASKHAN, 1, false, false, false, "Parent Pokémon", Type.NORMAL, null, 2.2, 80, Abilities.EARLY_BIRD, Abilities.SCRAPPY, Abilities.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, GrowthRate.MEDIUM_FAST, 0, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 2.2, 80, Abilities.EARLY_BIRD, Abilities.SCRAPPY, Abilities.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, null, 2.2, 100, Abilities.PARENTAL_BOND, Abilities.PARENTAL_BOND, Abilities.PARENTAL_BOND, 590, 105, 125, 100, 60, 100, 100, 45, 50, 172), - ), - new PokemonSpecies(Species.HORSEA, 1, false, false, false, "Dragon Pokémon", Type.WATER, null, 0.4, 8, Abilities.SWIFT_SWIM, Abilities.SNIPER, Abilities.DAMP, 295, 30, 40, 70, 70, 25, 60, 225, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SEADRA, 1, false, false, false, "Dragon Pokémon", Type.WATER, null, 1.2, 25, Abilities.POISON_POINT, Abilities.SNIPER, Abilities.DAMP, 440, 55, 65, 95, 95, 45, 85, 75, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GOLDEEN, 1, false, false, false, "Goldfish Pokémon", Type.WATER, null, 0.6, 15, Abilities.SWIFT_SWIM, Abilities.WATER_VEIL, Abilities.LIGHTNING_ROD, 320, 45, 67, 60, 35, 50, 63, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SEAKING, 1, false, false, false, "Goldfish Pokémon", Type.WATER, null, 1.3, 39, Abilities.SWIFT_SWIM, Abilities.WATER_VEIL, Abilities.LIGHTNING_ROD, 450, 80, 92, 65, 65, 80, 68, 60, 50, 158, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.STARYU, 1, false, false, false, "Star Shape Pokémon", Type.WATER, null, 0.8, 34.5, Abilities.ILLUMINATE, Abilities.NATURAL_CURE, Abilities.ANALYTIC, 340, 30, 45, 55, 70, 55, 85, 225, 50, 68, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.STARMIE, 1, false, false, false, "Mysterious Pokémon", Type.WATER, Type.PSYCHIC, 1.1, 80, Abilities.ILLUMINATE, Abilities.NATURAL_CURE, Abilities.ANALYTIC, 520, 60, 75, 85, 100, 85, 115, 60, 50, 182, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MR_MIME, 1, false, false, false, "Barrier Pokémon", Type.PSYCHIC, Type.FAIRY, 1.3, 54.5, Abilities.SOUNDPROOF, Abilities.FILTER, Abilities.TECHNICIAN, 460, 40, 45, 65, 100, 120, 90, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCYTHER, 1, false, false, false, "Mantis Pokémon", Type.BUG, Type.FLYING, 1.5, 56, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.STEADFAST, 500, 70, 110, 80, 55, 80, 105, 45, 50, 100, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.JYNX, 1, false, false, false, "Human Shape Pokémon", Type.ICE, Type.PSYCHIC, 1.4, 40.6, Abilities.OBLIVIOUS, Abilities.FOREWARN, Abilities.DRY_SKIN, 455, 65, 50, 35, 115, 95, 95, 45, 50, 159, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.ELECTABUZZ, 1, false, false, false, "Electric Pokémon", Type.ELECTRIC, null, 1.1, 30, Abilities.STATIC, Abilities.NONE, Abilities.VITAL_SPIRIT, 490, 65, 83, 57, 95, 85, 105, 45, 50, 172, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.MAGMAR, 1, false, false, false, "Spitfire Pokémon", Type.FIRE, null, 1.3, 44.5, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 495, 65, 95, 57, 100, 85, 93, 45, 50, 173, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.PINSIR, 1, false, false, false, "Stag Beetle Pokémon", Type.BUG, null, 1.5, 55, Abilities.HYPER_CUTTER, Abilities.MOLD_BREAKER, Abilities.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.BUG, null, 1.5, 55, Abilities.HYPER_CUTTER, Abilities.MOLD_BREAKER, Abilities.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.FLYING, 1.7, 59, Abilities.AERILATE, Abilities.AERILATE, Abilities.AERILATE, 600, 65, 155, 120, 65, 90, 105, 45, 50, 175), - ), - new PokemonSpecies(Species.TAUROS, 1, false, false, false, "Wild Bull Pokémon", Type.NORMAL, null, 1.4, 88.4, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.SHEER_FORCE, 490, 75, 100, 95, 40, 70, 110, 45, 50, 172, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.MAGIKARP, 1, false, false, false, "Fish Pokémon", Type.WATER, null, 0.9, 10, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.RATTLED, 200, 20, 10, 55, 15, 20, 80, 255, 50, 40, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.GYARADOS, 1, false, false, false, "Atrocious Pokémon", Type.WATER, Type.FLYING, 6.5, 235, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.WATER, Type.FLYING, 6.5, 235, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, Type.DARK, 6.5, 305, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, 640, 95, 155, 109, 70, 130, 81, 45, 50, 189, true), - ), - new PokemonSpecies(Species.LAPRAS, 1, false, false, false, "Transport Pokémon", Type.WATER, Type.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ICE, 24, 999.9, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, 635, 170, 85, 85, 105, 130, 60, 45, 50, 187), - ), - new PokemonSpecies(Species.DITTO, 1, false, false, false, "Transform Pokémon", Type.NORMAL, null, 0.3, 4, Abilities.LIMBER, Abilities.NONE, Abilities.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.EEVEE, 1, false, false, false, "Evolution Pokémon", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), - new PokemonForm("Partner", "partner", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 18, 999.9, Abilities.PROTEAN, Abilities.PROTEAN, Abilities.PROTEAN, 535, 110, 90, 70, 95, 85, 85, 45, 50, 65), //+100 BST from Partner Form - ), - new PokemonSpecies(Species.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", Type.WATER, null, 1, 29, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.JOLTEON, 1, false, false, false, "Lightning Pokémon", Type.ELECTRIC, null, 0.8, 24.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.QUICK_FEET, 525, 65, 65, 60, 110, 95, 130, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.FLAREON, 1, false, false, false, "Flame Pokémon", Type.FIRE, null, 0.9, 25, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.GUTS, 525, 65, 130, 60, 95, 110, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.PORYGON, 1, false, false, false, "Virtual Pokémon", Type.NORMAL, null, 0.8, 36.5, Abilities.TRACE, Abilities.DOWNLOAD, Abilities.ANALYTIC, 395, 65, 60, 70, 85, 75, 40, 45, 50, 79, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.OMANYTE, 1, false, false, false, "Spiral Pokémon", Type.ROCK, Type.WATER, 0.4, 7.5, Abilities.SWIFT_SWIM, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 355, 35, 40, 100, 90, 55, 35, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.OMASTAR, 1, false, false, false, "Spiral Pokémon", Type.ROCK, Type.WATER, 1, 35, Abilities.SWIFT_SWIM, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 495, 70, 60, 125, 115, 70, 55, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.KABUTO, 1, false, false, false, "Shellfish Pokémon", Type.ROCK, Type.WATER, 0.5, 11.5, Abilities.SWIFT_SWIM, Abilities.BATTLE_ARMOR, Abilities.WEAK_ARMOR, 355, 30, 80, 90, 55, 45, 55, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.KABUTOPS, 1, false, false, false, "Shellfish Pokémon", Type.ROCK, Type.WATER, 1.3, 40.5, Abilities.SWIFT_SWIM, Abilities.BATTLE_ARMOR, Abilities.WEAK_ARMOR, 495, 60, 115, 105, 65, 70, 80, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.AERODACTYL, 1, false, false, false, "Fossil Pokémon", Type.ROCK, Type.FLYING, 1.8, 59, Abilities.ROCK_HEAD, Abilities.PRESSURE, Abilities.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, GrowthRate.SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.ROCK, Type.FLYING, 1.8, 59, Abilities.ROCK_HEAD, Abilities.PRESSURE, Abilities.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ROCK, Type.FLYING, 2.1, 79, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 615, 80, 135, 85, 70, 95, 150, 45, 50, 180), - ), - new PokemonSpecies(Species.SNORLAX, 1, false, false, false, "Sleeping Pokémon", Type.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, GrowthRate.SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 35, 999.9, Abilities.HARVEST, Abilities.HARVEST, Abilities.HARVEST, 640, 200, 135, 80, 80, 125, 20, 25, 50, 189), - ), - new PokemonSpecies(Species.ARTICUNO, 1, true, false, false, "Freeze Pokémon", Type.ICE, Type.FLYING, 1.7, 55.4, Abilities.PRESSURE, Abilities.NONE, Abilities.SNOW_CLOAK, 580, 90, 85, 100, 95, 125, 85, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ZAPDOS, 1, true, false, false, "Electric Pokémon", Type.ELECTRIC, Type.FLYING, 1.6, 52.6, Abilities.PRESSURE, Abilities.NONE, Abilities.STATIC, 580, 90, 90, 85, 125, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MOLTRES, 1, true, false, false, "Flame Pokémon", Type.FIRE, Type.FLYING, 2, 60, Abilities.PRESSURE, Abilities.NONE, Abilities.FLAME_BODY, 580, 90, 100, 90, 125, 85, 90, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DRATINI, 1, false, false, false, "Dragon Pokémon", Type.DRAGON, null, 1.8, 3.3, Abilities.SHED_SKIN, Abilities.NONE, Abilities.MARVEL_SCALE, 300, 41, 64, 45, 50, 50, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAGONAIR, 1, false, false, false, "Dragon Pokémon", Type.DRAGON, null, 4, 16.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.MARVEL_SCALE, 420, 61, 84, 65, 70, 70, 70, 45, 35, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAGONITE, 1, false, false, false, "Dragon Pokémon", Type.DRAGON, Type.FLYING, 2.2, 210, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.MULTISCALE, 600, 91, 134, 95, 100, 100, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.MEWTWO, 1, false, true, false, "Genetic Pokémon", Type.PSYCHIC, null, 2, 122, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, null, 2, 122, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, false, null, true), - new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, Type.PSYCHIC, Type.FIGHTING, 2.3, 127, Abilities.STEADFAST, Abilities.NONE, Abilities.STEADFAST, 780, 106, 190, 100, 154, 100, 130, 3, 0, 340), - new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, Type.PSYCHIC, null, 1.5, 33, Abilities.INSOMNIA, Abilities.NONE, Abilities.INSOMNIA, 780, 106, 150, 70, 194, 120, 140, 3, 0, 340), - ), - new PokemonSpecies(Species.MEW, 1, false, false, true, "New Species Pokémon", Type.PSYCHIC, null, 0.4, 4, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.CHIKORITA, 2, false, false, false, "Leaf Pokémon", Type.GRASS, null, 0.9, 6.4, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 318, 45, 49, 65, 49, 65, 45, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.BAYLEEF, 2, false, false, false, "Leaf Pokémon", Type.GRASS, null, 1.2, 15.8, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 405, 60, 62, 80, 63, 80, 60, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MEGANIUM, 2, false, false, false, "Herb Pokémon", Type.GRASS, null, 1.8, 100.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 525, 80, 82, 100, 83, 100, 80, 45, 70, 236, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(Species.CYNDAQUIL, 2, false, false, false, "Fire Mouse Pokémon", Type.FIRE, null, 0.5, 7.9, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 309, 39, 52, 43, 60, 50, 65, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUILAVA, 2, false, false, false, "Volcano Pokémon", Type.FIRE, null, 0.9, 19, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 405, 58, 64, 58, 80, 65, 80, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TYPHLOSION, 2, false, false, false, "Volcano Pokémon", Type.FIRE, null, 1.7, 79.5, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 534, 78, 84, 78, 109, 85, 100, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TOTODILE, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 0.6, 9.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 314, 50, 65, 64, 44, 48, 43, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CROCONAW, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 1.1, 25, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 405, 65, 80, 80, 59, 63, 58, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FERALIGATR, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 2.3, 88.8, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 530, 85, 105, 100, 79, 83, 78, 45, 70, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SENTRET, 2, false, false, false, "Scout Pokémon", Type.NORMAL, null, 0.8, 6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 215, 35, 46, 34, 35, 45, 20, 255, 70, 43, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FURRET, 2, false, false, false, "Long Body Pokémon", Type.NORMAL, null, 1.8, 32.5, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 415, 85, 76, 64, 45, 55, 90, 90, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HOOTHOOT, 2, false, false, false, "Owl Pokémon", Type.NORMAL, Type.FLYING, 0.7, 21.2, Abilities.INSOMNIA, Abilities.KEEN_EYE, Abilities.TINTED_LENS, 262, 60, 30, 30, 36, 56, 50, 255, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.NOCTOWL, 2, false, false, false, "Owl Pokémon", Type.NORMAL, Type.FLYING, 1.6, 40.8, Abilities.INSOMNIA, Abilities.KEEN_EYE, Abilities.TINTED_LENS, 452, 100, 50, 50, 86, 96, 70, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LEDYBA, 2, false, false, false, "Five Star Pokémon", Type.BUG, Type.FLYING, 1, 10.8, Abilities.SWARM, Abilities.EARLY_BIRD, Abilities.RATTLED, 265, 40, 20, 30, 40, 80, 55, 255, 70, 53, GrowthRate.FAST, 50, true), - new PokemonSpecies(Species.LEDIAN, 2, false, false, false, "Five Star Pokémon", Type.BUG, Type.FLYING, 1.4, 35.6, Abilities.SWARM, Abilities.EARLY_BIRD, Abilities.IRON_FIST, 390, 55, 35, 50, 55, 110, 85, 90, 70, 137, GrowthRate.FAST, 50, true), - new PokemonSpecies(Species.SPINARAK, 2, false, false, false, "String Spit Pokémon", Type.BUG, Type.POISON, 0.5, 8.5, Abilities.SWARM, Abilities.INSOMNIA, Abilities.SNIPER, 250, 40, 60, 40, 40, 40, 30, 255, 70, 50, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.ARIADOS, 2, false, false, false, "Long Leg Pokémon", Type.BUG, Type.POISON, 1.1, 33.5, Abilities.SWARM, Abilities.INSOMNIA, Abilities.SNIPER, 400, 70, 90, 70, 60, 70, 40, 90, 70, 140, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.CROBAT, 2, false, false, false, "Bat Pokémon", Type.POISON, Type.FLYING, 1.8, 75, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 535, 85, 90, 80, 70, 80, 130, 90, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CHINCHOU, 2, false, false, false, "Angler Pokémon", Type.WATER, Type.ELECTRIC, 0.5, 12, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 330, 75, 38, 38, 56, 56, 67, 190, 50, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.LANTURN, 2, false, false, false, "Light Pokémon", Type.WATER, Type.ELECTRIC, 1.2, 22.5, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 460, 125, 58, 58, 76, 76, 67, 75, 50, 161, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PICHU, 2, false, false, false, "Tiny Mouse Pokémon", Type.ELECTRIC, null, 0.3, 2, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), - new PokemonForm("Spiky-Eared", "spiky", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), - ), - new PokemonSpecies(Species.CLEFFA, 2, false, false, false, "Star Shape Pokémon", Type.FAIRY, null, 0.3, 3, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.FRIEND_GUARD, 218, 50, 25, 28, 45, 55, 15, 150, 140, 44, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.IGGLYBUFF, 2, false, false, false, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 0.3, 1, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRIEND_GUARD, 210, 90, 30, 15, 40, 20, 15, 170, 50, 42, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.TOGEPI, 2, false, false, false, "Spike Ball Pokémon", Type.FAIRY, null, 0.3, 1.5, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 245, 35, 20, 65, 40, 65, 20, 190, 50, 49, GrowthRate.FAST, 87.5, false), - new PokemonSpecies(Species.TOGETIC, 2, false, false, false, "Happiness Pokémon", Type.FAIRY, Type.FLYING, 0.6, 3.2, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 405, 55, 40, 85, 80, 105, 40, 75, 50, 142, GrowthRate.FAST, 87.5, false), - new PokemonSpecies(Species.NATU, 2, false, false, false, "Tiny Bird Pokémon", Type.PSYCHIC, Type.FLYING, 0.2, 2, Abilities.SYNCHRONIZE, Abilities.EARLY_BIRD, Abilities.MAGIC_BOUNCE, 320, 40, 50, 45, 70, 45, 70, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.XATU, 2, false, false, false, "Mystic Pokémon", Type.PSYCHIC, Type.FLYING, 1.5, 15, Abilities.SYNCHRONIZE, Abilities.EARLY_BIRD, Abilities.MAGIC_BOUNCE, 470, 65, 75, 70, 95, 70, 95, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.MAREEP, 2, false, false, false, "Wool Pokémon", Type.ELECTRIC, null, 0.6, 7.8, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 280, 55, 40, 40, 65, 45, 35, 235, 70, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.FLAAFFY, 2, false, false, false, "Wool Pokémon", Type.ELECTRIC, null, 0.8, 13.3, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 365, 70, 55, 55, 80, 60, 45, 120, 70, 128, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.AMPHAROS, 2, false, false, false, "Light Pokémon", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 230, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 230, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ELECTRIC, Type.DRAGON, 1.4, 61.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 610, 90, 95, 105, 165, 110, 45, 45, 70, 230), - ), - new PokemonSpecies(Species.BELLOSSOM, 2, false, false, false, "Flower Pokémon", Type.GRASS, null, 0.4, 5.8, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HEALER, 490, 75, 80, 95, 90, 100, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MARILL, 2, false, false, false, "Aqua Mouse Pokémon", Type.WATER, Type.FAIRY, 0.4, 8.5, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 250, 70, 20, 50, 20, 50, 40, 190, 50, 88, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.AZUMARILL, 2, false, false, false, "Aqua Rabbit Pokémon", Type.WATER, Type.FAIRY, 0.8, 28.5, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 420, 100, 50, 80, 60, 80, 50, 75, 50, 210, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.SUDOWOODO, 2, false, false, false, "Imitation Pokémon", Type.ROCK, null, 1.2, 38, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.RATTLED, 410, 70, 100, 115, 30, 65, 30, 65, 50, 144, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.POLITOED, 2, false, false, false, "Frog Pokémon", Type.WATER, null, 1.1, 33.9, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.DRIZZLE, 500, 90, 75, 75, 90, 100, 70, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.HOPPIP, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.4, 0.5, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 250, 35, 35, 40, 35, 55, 50, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SKIPLOOM, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.6, 1, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 340, 55, 45, 50, 45, 65, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.JUMPLUFF, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.8, 3, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 460, 75, 55, 70, 55, 95, 110, 45, 70, 207, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.AIPOM, 2, false, false, false, "Long Tail Pokémon", Type.NORMAL, null, 0.8, 11.5, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.SKILL_LINK, 360, 55, 70, 55, 40, 55, 85, 45, 70, 72, GrowthRate.FAST, 50, true), - new PokemonSpecies(Species.SUNKERN, 2, false, false, false, "Seed Pokémon", Type.GRASS, null, 0.3, 1.8, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 180, 30, 30, 30, 30, 30, 30, 235, 70, 36, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SUNFLORA, 2, false, false, false, "Sun Pokémon", Type.GRASS, null, 0.8, 8.5, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 425, 75, 75, 55, 105, 85, 30, 120, 70, 149, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.YANMA, 2, false, false, false, "Clear Wing Pokémon", Type.BUG, Type.FLYING, 1.2, 38, Abilities.SPEED_BOOST, Abilities.COMPOUND_EYES, Abilities.FRISK, 390, 65, 65, 45, 75, 45, 95, 75, 70, 78, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WOOPER, 2, false, false, false, "Water Fish Pokémon", Type.WATER, Type.GROUND, 0.4, 8.5, Abilities.DAMP, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.QUAGSIRE, 2, false, false, false, "Water Fish Pokémon", Type.WATER, Type.GROUND, 1.4, 75, Abilities.DAMP, Abilities.WATER_ABSORB, Abilities.UNAWARE, 430, 95, 85, 85, 65, 65, 35, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.ESPEON, 2, false, false, false, "Sun Pokémon", Type.PSYCHIC, null, 0.9, 26.5, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.MAGIC_BOUNCE, 525, 65, 65, 60, 130, 95, 110, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.UMBREON, 2, false, false, false, "Moonlight Pokémon", Type.DARK, null, 1, 27, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.INNER_FOCUS, 525, 95, 65, 110, 60, 130, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.MURKROW, 2, false, false, false, "Darkness Pokémon", Type.DARK, Type.FLYING, 0.5, 2.1, Abilities.INSOMNIA, Abilities.SUPER_LUCK, Abilities.PRANKSTER, 405, 60, 85, 42, 85, 42, 91, 30, 35, 81, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SLOWKING, 2, false, false, false, "Royal Pokémon", Type.WATER, Type.PSYCHIC, 2, 79.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 80, 100, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MISDREAVUS, 2, false, false, false, "Screech Pokémon", Type.GHOST, null, 0.7, 1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 435, 60, 60, 60, 85, 85, 85, 45, 35, 87, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.UNOWN, 2, false, false, false, "Symbol Pokémon", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("A", "a", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("B", "b", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("C", "c", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("D", "d", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("E", "e", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("F", "f", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("G", "g", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("H", "h", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("I", "i", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("J", "j", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("K", "k", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("L", "l", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("M", "m", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("N", "n", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("O", "o", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("P", "p", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("Q", "q", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("R", "r", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("S", "s", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("T", "t", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("U", "u", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("V", "v", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("W", "w", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("X", "x", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("Y", "y", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("Z", "z", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("!", "exclamation", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("?", "question", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - ), - new PokemonSpecies(Species.WOBBUFFET, 2, false, false, false, "Patient Pokémon", Type.PSYCHIC, null, 1.3, 28.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.TELEPATHY, 405, 190, 33, 58, 33, 58, 33, 45, 50, 142, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.GIRAFARIG, 2, false, false, false, "Long Neck Pokémon", Type.NORMAL, Type.PSYCHIC, 1.5, 41.5, Abilities.INNER_FOCUS, Abilities.EARLY_BIRD, Abilities.SAP_SIPPER, 455, 70, 80, 65, 90, 65, 85, 60, 70, 159, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.PINECO, 2, false, false, false, "Bagworm Pokémon", Type.BUG, null, 0.6, 7.2, Abilities.STURDY, Abilities.NONE, Abilities.OVERCOAT, 290, 50, 65, 90, 35, 35, 15, 190, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FORRETRESS, 2, false, false, false, "Bagworm Pokémon", Type.BUG, Type.STEEL, 1.2, 125.8, Abilities.STURDY, Abilities.NONE, Abilities.OVERCOAT, 465, 75, 90, 140, 60, 60, 40, 75, 70, 163, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUNSPARCE, 2, false, false, false, "Land Snake Pokémon", Type.NORMAL, null, 1.5, 14, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 415, 100, 70, 70, 65, 65, 45, 190, 50, 145, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GLIGAR, 2, false, false, false, "Fly Scorpion Pokémon", Type.GROUND, Type.FLYING, 1.1, 64.8, Abilities.HYPER_CUTTER, Abilities.SAND_VEIL, Abilities.IMMUNITY, 430, 65, 75, 105, 35, 65, 85, 60, 70, 86, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.STEELIX, 2, false, false, false, "Iron Snake Pokémon", Type.STEEL, Type.GROUND, 9.2, 400, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.STEEL, Type.GROUND, 9.2, 400, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.STEEL, Type.GROUND, 10.5, 740, Abilities.SAND_FORCE, Abilities.SAND_FORCE, Abilities.SAND_FORCE, 610, 75, 125, 230, 55, 95, 30, 25, 50, 179, true), - ), - new PokemonSpecies(Species.SNUBBULL, 2, false, false, false, "Fairy Pokémon", Type.FAIRY, null, 0.6, 7.8, Abilities.INTIMIDATE, Abilities.RUN_AWAY, Abilities.RATTLED, 300, 60, 80, 50, 40, 40, 30, 190, 70, 60, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.GRANBULL, 2, false, false, false, "Fairy Pokémon", Type.FAIRY, null, 1.4, 48.7, Abilities.INTIMIDATE, Abilities.QUICK_FEET, Abilities.RATTLED, 450, 90, 120, 75, 60, 60, 45, 75, 70, 158, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.QWILFISH, 2, false, false, false, "Balloon Pokémon", Type.WATER, Type.POISON, 0.5, 3.9, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCIZOR, 2, false, false, false, "Pincer Pokémon", Type.BUG, Type.STEEL, 1.8, 118, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.BUG, Type.STEEL, 1.8, 118, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.STEEL, 2, 125, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 600, 70, 150, 140, 65, 100, 75, 25, 50, 175, true), - ), - new PokemonSpecies(Species.SHUCKLE, 2, false, false, false, "Mold Pokémon", Type.BUG, Type.ROCK, 0.6, 20.5, Abilities.STURDY, Abilities.GLUTTONY, Abilities.CONTRARY, 505, 20, 10, 230, 10, 230, 5, 190, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.HERACROSS, 2, false, false, false, "Single Horn Pokémon", Type.BUG, Type.FIGHTING, 1.5, 54, Abilities.SWARM, Abilities.GUTS, Abilities.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.BUG, Type.FIGHTING, 1.5, 54, Abilities.SWARM, Abilities.GUTS, Abilities.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.FIGHTING, 1.7, 62.5, Abilities.SKILL_LINK, Abilities.SKILL_LINK, Abilities.SKILL_LINK, 600, 80, 185, 115, 40, 105, 75, 45, 50, 175, true), - ), - new PokemonSpecies(Species.SNEASEL, 2, false, false, false, "Sharp Claw Pokémon", Type.DARK, Type.ICE, 0.9, 28, Abilities.INNER_FOCUS, Abilities.KEEN_EYE, Abilities.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.TEDDIURSA, 2, false, false, false, "Little Bear Pokémon", Type.NORMAL, null, 0.6, 8.8, Abilities.PICKUP, Abilities.QUICK_FEET, Abilities.HONEY_GATHER, 330, 60, 80, 50, 50, 50, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.URSARING, 2, false, false, false, "Hibernator Pokémon", Type.NORMAL, null, 1.8, 125.8, Abilities.GUTS, Abilities.QUICK_FEET, Abilities.UNNERVE, 500, 90, 130, 75, 75, 75, 55, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.SLUGMA, 2, false, false, false, "Lava Pokémon", Type.FIRE, null, 0.7, 35, Abilities.MAGMA_ARMOR, Abilities.FLAME_BODY, Abilities.WEAK_ARMOR, 250, 40, 40, 40, 70, 40, 20, 190, 70, 50, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MAGCARGO, 2, false, false, false, "Lava Pokémon", Type.FIRE, Type.ROCK, 0.8, 55, Abilities.MAGMA_ARMOR, Abilities.FLAME_BODY, Abilities.WEAK_ARMOR, 430, 60, 50, 120, 90, 80, 30, 75, 70, 151, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SWINUB, 2, false, false, false, "Pig Pokémon", Type.ICE, Type.GROUND, 0.4, 6.5, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 250, 50, 50, 40, 30, 30, 50, 225, 50, 50, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PILOSWINE, 2, false, false, false, "Swine Pokémon", Type.ICE, Type.GROUND, 1.1, 55.8, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 450, 100, 100, 80, 60, 60, 50, 75, 50, 158, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.CORSOLA, 2, false, false, false, "Coral Pokémon", Type.WATER, Type.ROCK, 0.6, 5, Abilities.HUSTLE, Abilities.NATURAL_CURE, Abilities.REGENERATOR, 410, 65, 55, 95, 65, 95, 35, 60, 50, 144, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.REMORAID, 2, false, false, false, "Jet Pokémon", Type.WATER, null, 0.6, 12, Abilities.HUSTLE, Abilities.SNIPER, Abilities.MOODY, 300, 35, 65, 35, 65, 35, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.OCTILLERY, 2, false, false, false, "Jet Pokémon", Type.WATER, null, 0.9, 28.5, Abilities.SUCTION_CUPS, Abilities.SNIPER, Abilities.MOODY, 480, 75, 105, 75, 105, 75, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.DELIBIRD, 2, false, false, false, "Delivery Pokémon", Type.ICE, Type.FLYING, 0.9, 16, Abilities.VITAL_SPIRIT, Abilities.HUSTLE, Abilities.INSOMNIA, 330, 45, 55, 45, 65, 45, 75, 45, 50, 116, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.MANTINE, 2, false, false, false, "Kite Pokémon", Type.WATER, Type.FLYING, 2.1, 220, Abilities.SWIFT_SWIM, Abilities.WATER_ABSORB, Abilities.WATER_VEIL, 485, 85, 40, 70, 80, 140, 70, 25, 50, 170, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SKARMORY, 2, false, false, false, "Armor Bird Pokémon", Type.STEEL, Type.FLYING, 1.7, 50.5, Abilities.KEEN_EYE, Abilities.STURDY, Abilities.WEAK_ARMOR, 465, 65, 80, 140, 40, 70, 70, 25, 50, 163, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HOUNDOUR, 2, false, false, false, "Dark Pokémon", Type.DARK, Type.FIRE, 0.6, 10.8, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 330, 45, 60, 30, 80, 50, 65, 120, 35, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HOUNDOOM, 2, false, false, false, "Dark Pokémon", Type.DARK, Type.FIRE, 1.4, 35, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.DARK, Type.FIRE, 1.4, 35, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DARK, Type.FIRE, 1.9, 49.5, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, 600, 75, 90, 90, 140, 90, 115, 45, 35, 175, true), - ), - new PokemonSpecies(Species.KINGDRA, 2, false, false, false, "Dragon Pokémon", Type.WATER, Type.DRAGON, 1.8, 152, Abilities.SWIFT_SWIM, Abilities.SNIPER, Abilities.DAMP, 540, 75, 95, 95, 95, 95, 85, 45, 50, 270, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PHANPY, 2, false, false, false, "Long Nose Pokémon", Type.GROUND, null, 0.5, 33.5, Abilities.PICKUP, Abilities.NONE, Abilities.SAND_VEIL, 330, 90, 60, 60, 40, 40, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DONPHAN, 2, false, false, false, "Armor Pokémon", Type.GROUND, null, 1.1, 120, Abilities.STURDY, Abilities.NONE, Abilities.SAND_VEIL, 500, 90, 120, 120, 60, 60, 50, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.PORYGON2, 2, false, false, false, "Virtual Pokémon", Type.NORMAL, null, 0.6, 32.5, Abilities.TRACE, Abilities.DOWNLOAD, Abilities.ANALYTIC, 515, 85, 80, 90, 105, 95, 60, 45, 50, 180, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.STANTLER, 2, false, false, false, "Big Horn Pokémon", Type.NORMAL, null, 1.4, 71.2, Abilities.INTIMIDATE, Abilities.FRISK, Abilities.SAP_SIPPER, 465, 73, 95, 62, 85, 65, 85, 45, 70, 163, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SMEARGLE, 2, false, false, false, "Painter Pokémon", Type.NORMAL, null, 1.2, 58, Abilities.OWN_TEMPO, Abilities.TECHNICIAN, Abilities.MOODY, 250, 55, 20, 35, 20, 45, 75, 45, 70, 88, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.TYROGUE, 2, false, false, false, "Scuffle Pokémon", Type.FIGHTING, null, 0.7, 21, Abilities.GUTS, Abilities.STEADFAST, Abilities.VITAL_SPIRIT, 210, 35, 35, 35, 35, 35, 35, 75, 50, 42, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.HITMONTOP, 2, false, false, false, "Handstand Pokémon", Type.FIGHTING, null, 1.4, 48, Abilities.INTIMIDATE, Abilities.TECHNICIAN, Abilities.STEADFAST, 455, 50, 95, 95, 35, 110, 70, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.SMOOCHUM, 2, false, false, false, "Kiss Pokémon", Type.ICE, Type.PSYCHIC, 0.4, 6, Abilities.OBLIVIOUS, Abilities.FOREWARN, Abilities.HYDRATION, 305, 45, 30, 15, 85, 65, 65, 45, 50, 61, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.ELEKID, 2, false, false, false, "Electric Pokémon", Type.ELECTRIC, null, 0.6, 23.5, Abilities.STATIC, Abilities.NONE, Abilities.VITAL_SPIRIT, 360, 45, 63, 37, 65, 55, 95, 45, 50, 72, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.MAGBY, 2, false, false, false, "Live Coal Pokémon", Type.FIRE, null, 0.7, 21.4, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 365, 45, 75, 37, 70, 55, 83, 45, 50, 73, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.MILTANK, 2, false, false, false, "Milk Cow Pokémon", Type.NORMAL, null, 1.2, 75.5, Abilities.THICK_FAT, Abilities.SCRAPPY, Abilities.SAP_SIPPER, 490, 95, 80, 105, 40, 70, 100, 45, 50, 172, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.BLISSEY, 2, false, false, false, "Happiness Pokémon", Type.NORMAL, null, 1.5, 46.8, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 540, 255, 10, 10, 75, 135, 55, 30, 140, 635, GrowthRate.FAST, 0, false), - new PokemonSpecies(Species.RAIKOU, 2, true, false, false, "Thunder Pokémon", Type.ELECTRIC, null, 1.9, 178, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 90, 85, 75, 115, 100, 115, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ENTEI, 2, true, false, false, "Volcano Pokémon", Type.FIRE, null, 2.1, 198, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 115, 115, 85, 90, 75, 100, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SUICUNE, 2, true, false, false, "Aurora Pokémon", Type.WATER, null, 2, 187, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 100, 75, 115, 90, 115, 85, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.LARVITAR, 2, false, false, false, "Rock Skin Pokémon", Type.ROCK, Type.GROUND, 0.6, 72, Abilities.GUTS, Abilities.NONE, Abilities.SAND_VEIL, 300, 50, 64, 50, 45, 50, 41, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PUPITAR, 2, false, false, false, "Hard Shell Pokémon", Type.ROCK, Type.GROUND, 1.2, 152, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 410, 70, 84, 70, 65, 70, 51, 45, 35, 144, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TYRANITAR, 2, false, false, false, "Armor Pokémon", Type.ROCK, Type.DARK, 2, 202, Abilities.SAND_STREAM, Abilities.NONE, Abilities.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.ROCK, Type.DARK, 2, 202, Abilities.SAND_STREAM, Abilities.NONE, Abilities.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ROCK, Type.DARK, 2.5, 255, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_STREAM, 700, 100, 164, 150, 95, 120, 71, 45, 35, 300), - ), - new PokemonSpecies(Species.LUGIA, 2, false, true, false, "Diving Pokémon", Type.PSYCHIC, Type.FLYING, 5.2, 216, Abilities.PRESSURE, Abilities.NONE, Abilities.MULTISCALE, 680, 106, 90, 130, 90, 154, 110, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.HO_OH, 2, false, true, false, "Rainbow Pokémon", Type.FIRE, Type.FLYING, 3.8, 199, Abilities.PRESSURE, Abilities.NONE, Abilities.REGENERATOR, 680, 106, 130, 90, 110, 154, 90, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CELEBI, 2, false, false, true, "Time Travel Pokémon", Type.PSYCHIC, Type.GRASS, 0.6, 5, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.TREECKO, 3, false, false, false, "Wood Gecko Pokémon", Type.GRASS, null, 0.5, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 310, 40, 45, 35, 65, 55, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.GROVYLE, 3, false, false, false, "Wood Gecko Pokémon", Type.GRASS, null, 0.9, 21.6, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 405, 50, 65, 45, 85, 65, 95, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SCEPTILE, 3, false, false, false, "Forest Pokémon", Type.GRASS, null, 1.7, 52.2, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.GRASS, null, 1.7, 52.2, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GRASS, Type.DRAGON, 1.9, 55.2, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.LIGHTNING_ROD, 630, 70, 110, 75, 145, 85, 145, 45, 50, 265), - ), - new PokemonSpecies(Species.TORCHIC, 3, false, false, false, "Chick Pokémon", Type.FIRE, null, 0.4, 2.5, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 310, 45, 60, 40, 70, 50, 45, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(Species.COMBUSKEN, 3, false, false, false, "Young Fowl Pokémon", Type.FIRE, Type.FIGHTING, 0.9, 19.5, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 405, 60, 85, 60, 85, 60, 55, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(Species.BLAZIKEN, 3, false, false, false, "Blaze Pokémon", Type.FIRE, Type.FIGHTING, 1.9, 52, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, true, true, - new PokemonForm("Normal", "", Type.FIRE, Type.FIGHTING, 1.9, 52, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.FIRE, Type.FIGHTING, 1.9, 52, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 630, 80, 160, 80, 130, 80, 100, 45, 50, 265, true), - ), - new PokemonSpecies(Species.MUDKIP, 3, false, false, false, "Mud Fish Pokémon", Type.WATER, null, 0.4, 7.6, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 310, 50, 70, 50, 50, 50, 40, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MARSHTOMP, 3, false, false, false, "Mud Fish Pokémon", Type.WATER, Type.GROUND, 0.7, 28, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 405, 70, 85, 70, 60, 70, 50, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SWAMPERT, 3, false, false, false, "Mud Fish Pokémon", Type.WATER, Type.GROUND, 1.5, 81.9, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.GROUND, 1.5, 81.9, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, Type.GROUND, 1.9, 102, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.SWIFT_SWIM, 635, 100, 150, 110, 95, 110, 70, 45, 50, 268), - ), - new PokemonSpecies(Species.POOCHYENA, 3, false, false, false, "Bite Pokémon", Type.DARK, null, 0.5, 13.6, Abilities.RUN_AWAY, Abilities.QUICK_FEET, Abilities.RATTLED, 220, 35, 55, 35, 30, 30, 35, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MIGHTYENA, 3, false, false, false, "Bite Pokémon", Type.DARK, null, 1, 37, Abilities.INTIMIDATE, Abilities.QUICK_FEET, Abilities.MOXIE, 420, 70, 90, 70, 60, 60, 70, 127, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ZIGZAGOON, 3, false, false, false, "Tiny Raccoon Pokémon", Type.NORMAL, null, 0.4, 17.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LINOONE, 3, false, false, false, "Rushing Pokémon", Type.NORMAL, null, 0.5, 32.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WURMPLE, 3, false, false, false, "Worm Pokémon", Type.BUG, null, 0.3, 3.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 45, 35, 20, 30, 20, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SILCOON, 3, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEAUTIFLY, 3, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1, 28.4, Abilities.SWARM, Abilities.NONE, Abilities.RIVALRY, 395, 60, 70, 50, 100, 50, 65, 45, 70, 178, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.CASCOON, 3, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.7, 11.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUSTOX, 3, false, false, false, "Poison Moth Pokémon", Type.BUG, Type.POISON, 1.2, 31.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.COMPOUND_EYES, 385, 60, 50, 70, 50, 90, 65, 45, 70, 173, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.LOTAD, 3, false, false, false, "Water Weed Pokémon", Type.WATER, Type.GRASS, 0.5, 2.6, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 220, 40, 30, 30, 40, 50, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LOMBRE, 3, false, false, false, "Jolly Pokémon", Type.WATER, Type.GRASS, 1.2, 32.5, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 340, 60, 50, 50, 60, 70, 50, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LUDICOLO, 3, false, false, false, "Carefree Pokémon", Type.WATER, Type.GRASS, 1.5, 55, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 480, 80, 70, 70, 90, 100, 70, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SEEDOT, 3, false, false, false, "Acorn Pokémon", Type.GRASS, null, 0.5, 4, Abilities.CHLOROPHYLL, Abilities.EARLY_BIRD, Abilities.PICKPOCKET, 220, 40, 40, 50, 30, 30, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.NUZLEAF, 3, false, false, false, "Wily Pokémon", Type.GRASS, Type.DARK, 1, 28, Abilities.CHLOROPHYLL, Abilities.EARLY_BIRD, Abilities.PICKPOCKET, 340, 70, 70, 40, 60, 40, 60, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SHIFTRY, 3, false, false, false, "Wicked Pokémon", Type.GRASS, Type.DARK, 1.3, 59.6, Abilities.CHLOROPHYLL, Abilities.WIND_RIDER, Abilities.PICKPOCKET, 480, 90, 100, 60, 90, 60, 80, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.TAILLOW, 3, false, false, false, "Tiny Swallow Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2.3, Abilities.GUTS, Abilities.NONE, Abilities.SCRAPPY, 270, 40, 55, 30, 30, 30, 85, 200, 70, 54, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SWELLOW, 3, false, false, false, "Swallow Pokémon", Type.NORMAL, Type.FLYING, 0.7, 19.8, Abilities.GUTS, Abilities.NONE, Abilities.SCRAPPY, 455, 60, 85, 60, 75, 50, 125, 45, 70, 159, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WINGULL, 3, false, false, false, "Seagull Pokémon", Type.WATER, Type.FLYING, 0.6, 9.5, Abilities.KEEN_EYE, Abilities.HYDRATION, Abilities.RAIN_DISH, 270, 40, 30, 30, 55, 30, 85, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PELIPPER, 3, false, false, false, "Water Bird Pokémon", Type.WATER, Type.FLYING, 1.2, 28, Abilities.KEEN_EYE, Abilities.DRIZZLE, Abilities.RAIN_DISH, 440, 60, 50, 100, 95, 70, 65, 45, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RALTS, 3, false, false, false, "Feeling Pokémon", Type.PSYCHIC, Type.FAIRY, 0.4, 6.6, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 198, 28, 25, 25, 45, 35, 40, 235, 35, 40, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.KIRLIA, 3, false, false, false, "Emotion Pokémon", Type.PSYCHIC, Type.FAIRY, 0.8, 20.2, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 278, 38, 35, 35, 65, 55, 50, 120, 35, 97, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GARDEVOIR, 3, false, false, false, "Embrace Pokémon", Type.PSYCHIC, Type.FAIRY, 1.6, 48.4, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, Type.FAIRY, 1.6, 48.4, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.PSYCHIC, Type.FAIRY, 1.6, 48.4, Abilities.PIXILATE, Abilities.PIXILATE, Abilities.PIXILATE, 618, 68, 85, 65, 165, 135, 100, 45, 35, 259), - ), - new PokemonSpecies(Species.SURSKIT, 3, false, false, false, "Pond Skater Pokémon", Type.BUG, Type.WATER, 0.5, 1.7, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.RAIN_DISH, 269, 40, 30, 32, 50, 52, 65, 200, 70, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MASQUERAIN, 3, false, false, false, "Eyeball Pokémon", Type.BUG, Type.FLYING, 0.8, 3.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.UNNERVE, 454, 70, 60, 62, 100, 82, 80, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SHROOMISH, 3, false, false, false, "Mushroom Pokémon", Type.GRASS, null, 0.4, 4.5, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.QUICK_FEET, 295, 60, 40, 60, 40, 60, 35, 255, 70, 59, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.BRELOOM, 3, false, false, false, "Mushroom Pokémon", Type.GRASS, Type.FIGHTING, 1.2, 39.2, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.TECHNICIAN, 460, 60, 130, 80, 60, 60, 70, 90, 70, 161, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.SLAKOTH, 3, false, false, false, "Slacker Pokémon", Type.NORMAL, null, 0.8, 24, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(Species.VIGOROTH, 3, false, false, false, "Wild Monkey Pokémon", Type.NORMAL, null, 1.4, 46.5, Abilities.VITAL_SPIRIT, Abilities.NONE, Abilities.INSOMNIA, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(Species.SLAKING, 3, false, false, false, "Lazy Pokémon", Type.NORMAL, null, 2, 130.5, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 670, 150, 160, 100, 95, 65, 100, 45, 70, 252, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(Species.NINCADA, 3, false, false, false, "Trainee Pokémon", Type.BUG, Type.GROUND, 0.5, 5.5, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.RUN_AWAY, 266, 31, 45, 90, 30, 30, 40, 255, 50, 53, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.NINJASK, 3, false, false, false, "Ninja Pokémon", Type.BUG, Type.FLYING, 0.8, 12, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.INFILTRATOR, 456, 61, 90, 45, 50, 50, 160, 120, 50, 160, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.SHEDINJA, 3, false, false, false, "Shed Pokémon", Type.BUG, Type.GHOST, 0.8, 1.2, Abilities.WONDER_GUARD, Abilities.NONE, Abilities.NONE, 236, 1, 90, 45, 30, 30, 40, 45, 50, 83, GrowthRate.ERRATIC, null, false), - new PokemonSpecies(Species.WHISMUR, 3, false, false, false, "Whisper Pokémon", Type.NORMAL, null, 0.6, 16.3, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.RATTLED, 240, 64, 51, 23, 51, 23, 28, 190, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LOUDRED, 3, false, false, false, "Big Voice Pokémon", Type.NORMAL, null, 1, 40.5, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.SCRAPPY, 360, 84, 71, 43, 71, 43, 48, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.EXPLOUD, 3, false, false, false, "Loud Noise Pokémon", Type.NORMAL, null, 1.5, 84, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.SCRAPPY, 490, 104, 91, 63, 91, 73, 68, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MAKUHITA, 3, false, false, false, "Guts Pokémon", Type.FIGHTING, null, 1, 86.4, Abilities.THICK_FAT, Abilities.GUTS, Abilities.SHEER_FORCE, 237, 72, 60, 30, 20, 30, 25, 180, 70, 47, GrowthRate.FLUCTUATING, 75, false), - new PokemonSpecies(Species.HARIYAMA, 3, false, false, false, "Arm Thrust Pokémon", Type.FIGHTING, null, 2.3, 253.8, Abilities.THICK_FAT, Abilities.GUTS, Abilities.SHEER_FORCE, 474, 144, 120, 60, 40, 60, 50, 200, 70, 166, GrowthRate.FLUCTUATING, 75, false), - new PokemonSpecies(Species.AZURILL, 3, false, false, false, "Polka Dot Pokémon", Type.NORMAL, Type.FAIRY, 0.2, 2, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 190, 50, 20, 40, 20, 40, 20, 150, 50, 38, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.NOSEPASS, 3, false, false, false, "Compass Pokémon", Type.ROCK, null, 1, 97, Abilities.STURDY, Abilities.MAGNET_PULL, Abilities.SAND_FORCE, 375, 30, 45, 135, 45, 90, 30, 255, 70, 75, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SKITTY, 3, false, false, false, "Kitten Pokémon", Type.NORMAL, null, 0.6, 11, Abilities.CUTE_CHARM, Abilities.NORMALIZE, Abilities.WONDER_SKIN, 260, 50, 45, 45, 35, 35, 50, 255, 70, 52, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.DELCATTY, 3, false, false, false, "Prim Pokémon", Type.NORMAL, null, 1.1, 32.6, Abilities.CUTE_CHARM, Abilities.NORMALIZE, Abilities.WONDER_SKIN, 400, 70, 65, 65, 55, 55, 90, 60, 70, 140, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.SABLEYE, 3, false, false, false, "Darkness Pokémon", Type.DARK, Type.GHOST, 0.5, 11, Abilities.KEEN_EYE, Abilities.STALL, Abilities.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.DARK, Type.GHOST, 0.5, 11, Abilities.KEEN_EYE, Abilities.STALL, Abilities.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DARK, Type.GHOST, 0.5, 161, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 480, 50, 85, 125, 85, 115, 20, 45, 35, 133), - ), - new PokemonSpecies(Species.MAWILE, 3, false, false, false, "Deceiver Pokémon", Type.STEEL, Type.FAIRY, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.INTIMIDATE, Abilities.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, GrowthRate.FAST, 50, false, true, - new PokemonForm("Normal", "", Type.STEEL, Type.FAIRY, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.INTIMIDATE, Abilities.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.STEEL, Type.FAIRY, 1, 23.5, Abilities.HUGE_POWER, Abilities.HUGE_POWER, Abilities.HUGE_POWER, 480, 50, 105, 125, 55, 95, 50, 45, 50, 133), - ), - new PokemonSpecies(Species.ARON, 3, false, false, false, "Iron Armor Pokémon", Type.STEEL, Type.ROCK, 0.4, 60, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 330, 50, 70, 100, 40, 40, 30, 180, 35, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.LAIRON, 3, false, false, false, "Iron Armor Pokémon", Type.STEEL, Type.ROCK, 0.9, 120, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 430, 60, 90, 140, 50, 50, 40, 90, 35, 151, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.AGGRON, 3, false, false, false, "Iron Armor Pokémon", Type.STEEL, Type.ROCK, 2.1, 360, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.STEEL, Type.ROCK, 2.1, 360, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.STEEL, null, 2.2, 395, Abilities.FILTER, Abilities.FILTER, Abilities.FILTER, 630, 70, 140, 230, 60, 80, 50, 45, 35, 265), - ), - new PokemonSpecies(Species.MEDITITE, 3, false, false, false, "Meditate Pokémon", Type.FIGHTING, Type.PSYCHIC, 0.6, 11.2, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 280, 30, 40, 55, 40, 55, 60, 180, 70, 56, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.MEDICHAM, 3, false, false, false, "Meditate Pokémon", Type.FIGHTING, Type.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.FIGHTING, Type.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.FIGHTING, Type.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.PURE_POWER, 510, 60, 100, 85, 80, 85, 100, 90, 70, 144, true), - ), - new PokemonSpecies(Species.ELECTRIKE, 3, false, false, false, "Lightning Pokémon", Type.ELECTRIC, null, 0.6, 15.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 295, 40, 45, 40, 65, 40, 65, 120, 50, 59, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.MANECTRIC, 3, false, false, false, "Discharge Pokémon", Type.ELECTRIC, null, 1.5, 40.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.5, 40.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ELECTRIC, null, 1.8, 44, Abilities.INTIMIDATE, Abilities.INTIMIDATE, Abilities.INTIMIDATE, 575, 70, 75, 80, 135, 80, 135, 45, 50, 166), - ), - new PokemonSpecies(Species.PLUSLE, 3, false, false, false, "Cheering Pokémon", Type.ELECTRIC, null, 0.4, 4.2, Abilities.PLUS, Abilities.NONE, Abilities.LIGHTNING_ROD, 405, 60, 50, 40, 85, 75, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MINUN, 3, false, false, false, "Cheering Pokémon", Type.ELECTRIC, null, 0.4, 4.2, Abilities.MINUS, Abilities.NONE, Abilities.VOLT_ABSORB, 405, 60, 40, 50, 75, 85, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VOLBEAT, 3, false, false, false, "Firefly Pokémon", Type.BUG, null, 0.7, 17.7, Abilities.ILLUMINATE, Abilities.SWARM, Abilities.PRANKSTER, 430, 65, 73, 75, 47, 85, 85, 150, 70, 151, GrowthRate.ERRATIC, 100, false), - new PokemonSpecies(Species.ILLUMISE, 3, false, false, false, "Firefly Pokémon", Type.BUG, null, 0.6, 17.7, Abilities.OBLIVIOUS, Abilities.TINTED_LENS, Abilities.PRANKSTER, 430, 65, 47, 75, 73, 85, 85, 150, 70, 151, GrowthRate.FLUCTUATING, 0, false), - new PokemonSpecies(Species.ROSELIA, 3, false, false, false, "Thorn Pokémon", Type.GRASS, Type.POISON, 0.3, 2, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.LEAF_GUARD, 400, 50, 60, 45, 100, 80, 65, 150, 50, 140, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.GULPIN, 3, false, false, false, "Stomach Pokémon", Type.POISON, null, 0.4, 10.3, Abilities.LIQUID_OOZE, Abilities.STICKY_HOLD, Abilities.GLUTTONY, 302, 70, 43, 53, 43, 53, 40, 225, 70, 60, GrowthRate.FLUCTUATING, 50, true), - new PokemonSpecies(Species.SWALOT, 3, false, false, false, "Poison Bag Pokémon", Type.POISON, null, 1.7, 80, Abilities.LIQUID_OOZE, Abilities.STICKY_HOLD, Abilities.GLUTTONY, 467, 100, 73, 83, 73, 83, 55, 75, 70, 163, GrowthRate.FLUCTUATING, 50, true), - new PokemonSpecies(Species.CARVANHA, 3, false, false, false, "Savage Pokémon", Type.WATER, Type.DARK, 0.8, 20.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 305, 45, 90, 20, 65, 20, 65, 225, 35, 61, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SHARPEDO, 3, false, false, false, "Brutal Pokémon", Type.WATER, Type.DARK, 1.8, 88.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.DARK, 1.8, 88.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, Type.DARK, 2.5, 130.3, Abilities.STRONG_JAW, Abilities.NONE, Abilities.STRONG_JAW, 560, 70, 140, 70, 110, 65, 105, 60, 35, 161), - ), - new PokemonSpecies(Species.WAILMER, 3, false, false, false, "Ball Whale Pokémon", Type.WATER, null, 2, 130, Abilities.WATER_VEIL, Abilities.OBLIVIOUS, Abilities.PRESSURE, 400, 130, 70, 35, 70, 35, 60, 125, 50, 80, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.WAILORD, 3, false, false, false, "Float Whale Pokémon", Type.WATER, null, 14.5, 398, Abilities.WATER_VEIL, Abilities.OBLIVIOUS, Abilities.PRESSURE, 500, 170, 90, 45, 90, 45, 60, 60, 50, 175, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.NUMEL, 3, false, false, false, "Numb Pokémon", Type.FIRE, Type.GROUND, 0.7, 24, Abilities.OBLIVIOUS, Abilities.SIMPLE, Abilities.OWN_TEMPO, 305, 60, 60, 40, 65, 45, 35, 255, 70, 61, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.CAMERUPT, 3, false, false, false, "Eruption Pokémon", Type.FIRE, Type.GROUND, 1.9, 220, Abilities.MAGMA_ARMOR, Abilities.SOLID_ROCK, Abilities.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", Type.FIRE, Type.GROUND, 1.9, 220, Abilities.MAGMA_ARMOR, Abilities.SOLID_ROCK, Abilities.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.FIRE, Type.GROUND, 2.5, 320.5, Abilities.SHEER_FORCE, Abilities.SHEER_FORCE, Abilities.SHEER_FORCE, 560, 70, 120, 100, 145, 105, 20, 150, 70, 161), - ), - new PokemonSpecies(Species.TORKOAL, 3, false, false, false, "Coal Pokémon", Type.FIRE, null, 0.5, 80.4, Abilities.WHITE_SMOKE, Abilities.DROUGHT, Abilities.SHELL_ARMOR, 470, 70, 85, 140, 85, 70, 20, 90, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SPOINK, 3, false, false, false, "Bounce Pokémon", Type.PSYCHIC, null, 0.7, 30.6, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.GLUTTONY, 330, 60, 25, 35, 70, 80, 60, 255, 70, 66, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.GRUMPIG, 3, false, false, false, "Manipulate Pokémon", Type.PSYCHIC, null, 0.9, 71.5, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.GLUTTONY, 470, 80, 45, 65, 90, 110, 80, 60, 70, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.SPINDA, 3, false, false, false, "Spot Panda Pokémon", Type.NORMAL, null, 1.1, 5, Abilities.OWN_TEMPO, Abilities.TANGLED_FEET, Abilities.CONTRARY, 360, 60, 60, 60, 60, 60, 60, 255, 70, 126, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.TRAPINCH, 3, false, false, false, "Ant Pit Pokémon", Type.GROUND, null, 0.7, 15, Abilities.HYPER_CUTTER, Abilities.ARENA_TRAP, Abilities.SHEER_FORCE, 290, 45, 100, 45, 45, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.VIBRAVA, 3, false, false, false, "Vibration Pokémon", Type.GROUND, Type.DRAGON, 1.1, 15.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 340, 50, 70, 50, 50, 50, 70, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.FLYGON, 3, false, false, false, "Mystic Pokémon", Type.GROUND, Type.DRAGON, 2, 82, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 80, 100, 80, 80, 80, 100, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CACNEA, 3, false, false, false, "Cactus Pokémon", Type.GRASS, null, 0.4, 51.3, Abilities.SAND_VEIL, Abilities.NONE, Abilities.WATER_ABSORB, 335, 50, 85, 40, 85, 40, 35, 190, 35, 67, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CACTURNE, 3, false, false, false, "Scarecrow Pokémon", Type.GRASS, Type.DARK, 1.3, 77.4, Abilities.SAND_VEIL, Abilities.NONE, Abilities.WATER_ABSORB, 475, 70, 115, 60, 115, 60, 55, 60, 35, 166, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SWABLU, 3, false, false, false, "Cotton Bird Pokémon", Type.NORMAL, Type.FLYING, 0.4, 1.2, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 310, 45, 40, 60, 40, 75, 50, 255, 50, 62, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.ALTARIA, 3, false, false, false, "Humming Pokémon", Type.DRAGON, Type.FLYING, 1.1, 20.6, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, GrowthRate.ERRATIC, 50, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.FLYING, 1.1, 20.6, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.FAIRY, 1.5, 20.6, Abilities.PIXILATE, Abilities.NONE, Abilities.PIXILATE, 590, 75, 110, 110, 110, 105, 80, 45, 50, 172), - ), - new PokemonSpecies(Species.ZANGOOSE, 3, false, false, false, "Cat Ferret Pokémon", Type.NORMAL, null, 1.3, 40.3, Abilities.IMMUNITY, Abilities.NONE, Abilities.TOXIC_BOOST, 458, 73, 115, 60, 60, 60, 90, 90, 70, 160, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.SEVIPER, 3, false, false, false, "Fang Snake Pokémon", Type.POISON, null, 2.7, 52.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.INFILTRATOR, 458, 73, 100, 60, 100, 60, 65, 90, 70, 160, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.LUNATONE, 3, false, false, false, "Meteorite Pokémon", Type.ROCK, Type.PSYCHIC, 1, 168, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 460, 90, 55, 65, 95, 85, 70, 45, 50, 161, GrowthRate.FAST, null, false), - new PokemonSpecies(Species.SOLROCK, 3, false, false, false, "Meteorite Pokémon", Type.ROCK, Type.PSYCHIC, 1.2, 154, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 460, 90, 95, 85, 55, 65, 70, 45, 50, 161, GrowthRate.FAST, null, false), - new PokemonSpecies(Species.BARBOACH, 3, false, false, false, "Whiskers Pokémon", Type.WATER, Type.GROUND, 0.4, 1.9, Abilities.OBLIVIOUS, Abilities.ANTICIPATION, Abilities.HYDRATION, 288, 50, 48, 43, 46, 41, 60, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WHISCASH, 3, false, false, false, "Whiskers Pokémon", Type.WATER, Type.GROUND, 0.9, 23.6, Abilities.OBLIVIOUS, Abilities.ANTICIPATION, Abilities.HYDRATION, 468, 110, 78, 73, 76, 71, 60, 75, 50, 164, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CORPHISH, 3, false, false, false, "Ruffian Pokémon", Type.WATER, null, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.ADAPTABILITY, 308, 43, 80, 65, 50, 35, 35, 205, 50, 62, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.CRAWDAUNT, 3, false, false, false, "Rogue Pokémon", Type.WATER, Type.DARK, 1.1, 32.8, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.ADAPTABILITY, 468, 63, 120, 85, 90, 55, 55, 155, 50, 164, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.BALTOY, 3, false, false, false, "Clay Doll Pokémon", Type.GROUND, Type.PSYCHIC, 0.5, 21.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 300, 40, 40, 55, 40, 70, 55, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.CLAYDOL, 3, false, false, false, "Clay Doll Pokémon", Type.GROUND, Type.PSYCHIC, 1.5, 108, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 500, 60, 70, 105, 70, 120, 75, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.LILEEP, 3, false, false, false, "Sea Lily Pokémon", Type.ROCK, Type.GRASS, 1, 23.8, Abilities.SUCTION_CUPS, Abilities.NONE, Abilities.STORM_DRAIN, 355, 66, 41, 77, 61, 87, 23, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.CRADILY, 3, false, false, false, "Barnacle Pokémon", Type.ROCK, Type.GRASS, 1.5, 60.4, Abilities.SUCTION_CUPS, Abilities.NONE, Abilities.STORM_DRAIN, 495, 86, 81, 97, 81, 107, 43, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.ANORITH, 3, false, false, false, "Old Shrimp Pokémon", Type.ROCK, Type.BUG, 0.7, 12.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.SWIFT_SWIM, 355, 45, 95, 50, 40, 50, 75, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.ARMALDO, 3, false, false, false, "Plate Pokémon", Type.ROCK, Type.BUG, 1.5, 68.2, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.SWIFT_SWIM, 495, 75, 125, 100, 70, 80, 45, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.FEEBAS, 3, false, false, false, "Fish Pokémon", Type.WATER, null, 0.6, 7.4, Abilities.SWIFT_SWIM, Abilities.OBLIVIOUS, Abilities.ADAPTABILITY, 200, 20, 15, 20, 10, 55, 80, 255, 50, 40, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.MILOTIC, 3, false, false, false, "Tender Pokémon", Type.WATER, null, 6.2, 162, Abilities.MARVEL_SCALE, Abilities.COMPETITIVE, Abilities.CUTE_CHARM, 540, 95, 60, 79, 100, 125, 81, 60, 50, 189, GrowthRate.ERRATIC, 50, true), - new PokemonSpecies(Species.CASTFORM, 3, false, false, false, "Weather Pokémon", Type.NORMAL, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal Form", "", Type.NORMAL, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, false, null, true), - new PokemonForm("Sunny Form", "sunny", Type.FIRE, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), - new PokemonForm("Rainy Form", "rainy", Type.WATER, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), - new PokemonForm("Snowy Form", "snowy", Type.ICE, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), - ), - new PokemonSpecies(Species.KECLEON, 3, false, false, false, "Color Swap Pokémon", Type.NORMAL, null, 1, 22, Abilities.COLOR_CHANGE, Abilities.NONE, Abilities.PROTEAN, 440, 60, 90, 70, 60, 120, 40, 200, 70, 154, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SHUPPET, 3, false, false, false, "Puppet Pokémon", Type.GHOST, null, 0.6, 2.3, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 295, 44, 75, 35, 63, 33, 45, 225, 35, 59, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.BANETTE, 3, false, false, false, "Marionette Pokémon", Type.GHOST, null, 1.1, 12.5, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, GrowthRate.FAST, 50, false, true, - new PokemonForm("Normal", "", Type.GHOST, null, 1.1, 12.5, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GHOST, null, 1.2, 13, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 555, 64, 165, 75, 93, 83, 75, 45, 35, 159), - ), - new PokemonSpecies(Species.DUSKULL, 3, false, false, false, "Requiem Pokémon", Type.GHOST, null, 0.8, 15, Abilities.LEVITATE, Abilities.NONE, Abilities.FRISK, 295, 20, 40, 90, 30, 90, 25, 190, 35, 59, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.DUSCLOPS, 3, false, false, false, "Beckon Pokémon", Type.GHOST, null, 1.6, 30.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 455, 40, 70, 130, 60, 130, 25, 90, 35, 159, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.TROPIUS, 3, false, false, false, "Fruit Pokémon", Type.GRASS, Type.FLYING, 2, 100, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.HARVEST, 460, 99, 68, 83, 72, 87, 51, 200, 70, 161, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CHIMECHO, 3, false, false, false, "Wind Chime Pokémon", Type.PSYCHIC, null, 0.6, 1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 455, 75, 50, 80, 95, 90, 65, 45, 70, 159, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.ABSOL, 3, false, false, false, "Disaster Pokémon", Type.DARK, null, 1.2, 47, Abilities.PRESSURE, Abilities.SUPER_LUCK, Abilities.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.DARK, null, 1.2, 47, Abilities.PRESSURE, Abilities.SUPER_LUCK, Abilities.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DARK, null, 1.2, 49, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 565, 65, 150, 60, 115, 60, 115, 30, 35, 163), - ), - new PokemonSpecies(Species.WYNAUT, 3, false, false, false, "Bright Pokémon", Type.PSYCHIC, null, 0.6, 14, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.TELEPATHY, 260, 95, 23, 48, 23, 48, 23, 125, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SNORUNT, 3, false, false, false, "Snow Hat Pokémon", Type.ICE, null, 0.7, 16.8, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 300, 50, 50, 50, 50, 50, 50, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GLALIE, 3, false, false, false, "Face Pokémon", Type.ICE, null, 1.5, 256.5, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.ICE, null, 1.5, 256.5, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ICE, null, 2.1, 350.2, Abilities.REFRIGERATE, Abilities.REFRIGERATE, Abilities.REFRIGERATE, 580, 80, 120, 80, 120, 80, 100, 75, 50, 168), - ), - new PokemonSpecies(Species.SPHEAL, 3, false, false, false, "Clap Pokémon", Type.ICE, Type.WATER, 0.8, 39.5, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 290, 70, 40, 50, 55, 50, 25, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SEALEO, 3, false, false, false, "Ball Roll Pokémon", Type.ICE, Type.WATER, 1.1, 87.6, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 410, 90, 60, 70, 75, 70, 45, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WALREIN, 3, false, false, false, "Ice Break Pokémon", Type.ICE, Type.WATER, 1.4, 150.6, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 530, 110, 80, 90, 95, 90, 65, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CLAMPERL, 3, false, false, false, "Bivalve Pokémon", Type.WATER, null, 0.4, 52.5, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.RATTLED, 345, 35, 64, 85, 74, 55, 32, 255, 70, 69, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.HUNTAIL, 3, false, false, false, "Deep Sea Pokémon", Type.WATER, null, 1.7, 27, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 485, 55, 104, 105, 94, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.GOREBYSS, 3, false, false, false, "South Sea Pokémon", Type.WATER, null, 1.8, 22.6, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.HYDRATION, 485, 55, 84, 105, 114, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.RELICANTH, 3, false, false, false, "Longevity Pokémon", Type.WATER, Type.ROCK, 1, 23.4, Abilities.SWIFT_SWIM, Abilities.ROCK_HEAD, Abilities.STURDY, 485, 100, 90, 130, 45, 65, 55, 25, 50, 170, GrowthRate.SLOW, 87.5, true), - new PokemonSpecies(Species.LUVDISC, 3, false, false, false, "Rendezvous Pokémon", Type.WATER, null, 0.6, 8.7, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.HYDRATION, 330, 43, 30, 55, 40, 65, 97, 225, 70, 116, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.BAGON, 3, false, false, false, "Rock Head Pokémon", Type.DRAGON, null, 0.6, 42.1, Abilities.ROCK_HEAD, Abilities.NONE, Abilities.SHEER_FORCE, 300, 45, 75, 60, 40, 30, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SHELGON, 3, false, false, false, "Endurance Pokémon", Type.DRAGON, null, 1.1, 110.5, Abilities.ROCK_HEAD, Abilities.NONE, Abilities.OVERCOAT, 420, 65, 95, 100, 60, 50, 50, 45, 35, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SALAMENCE, 3, false, false, false, "Dragon Pokémon", Type.DRAGON, Type.FLYING, 1.5, 102.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.FLYING, 1.5, 102.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.FLYING, 1.8, 112.6, Abilities.AERILATE, Abilities.NONE, Abilities.AERILATE, 700, 95, 145, 130, 120, 90, 120, 45, 35, 300), - ), - new PokemonSpecies(Species.BELDUM, 3, false, false, false, "Iron Ball Pokémon", Type.STEEL, Type.PSYCHIC, 0.6, 95.2, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 300, 40, 55, 80, 35, 60, 30, 45, 35, 60, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Frigibax - new PokemonSpecies(Species.METANG, 3, false, false, false, "Iron Claw Pokémon", Type.STEEL, Type.PSYCHIC, 1.2, 202.5, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 420, 60, 75, 100, 55, 80, 50, 25, 35, 147, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Arctibax - new PokemonSpecies(Species.METAGROSS, 3, false, false, false, "Iron Leg Pokémon", Type.STEEL, Type.PSYCHIC, 1.6, 550, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 10, 35, 300, GrowthRate.SLOW, null, false, true, //Custom Catchrate, matching Baxcalibur - new PokemonForm("Normal", "", Type.STEEL, Type.PSYCHIC, 1.6, 550, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 3, 35, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.STEEL, Type.PSYCHIC, 2.5, 942.9, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 700, 80, 145, 150, 105, 110, 110, 3, 35, 300), - ), - new PokemonSpecies(Species.REGIROCK, 3, true, false, false, "Rock Peak Pokémon", Type.ROCK, null, 1.7, 230, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.STURDY, 580, 80, 100, 200, 50, 100, 50, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.REGICE, 3, true, false, false, "Iceberg Pokémon", Type.ICE, null, 1.8, 175, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.ICE_BODY, 580, 80, 50, 100, 100, 200, 50, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.REGISTEEL, 3, true, false, false, "Iron Pokémon", Type.STEEL, null, 1.9, 205, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 580, 80, 75, 150, 75, 150, 50, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.LATIAS, 3, true, false, false, "Eon Pokémon", Type.DRAGON, Type.PSYCHIC, 1.4, 40, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.PSYCHIC, 1.4, 40, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.PSYCHIC, 1.8, 52, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 700, 80, 100, 120, 140, 150, 110, 3, 90, 300), - ), - new PokemonSpecies(Species.LATIOS, 3, true, false, false, "Eon Pokémon", Type.DRAGON, Type.PSYCHIC, 2, 60, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.PSYCHIC, 2, 60, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.PSYCHIC, 2.3, 70, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 700, 80, 130, 100, 160, 120, 110, 3, 90, 300), - ), - new PokemonSpecies(Species.KYOGRE, 3, false, true, false, "Sea Basin Pokémon", Type.WATER, null, 4.5, 352, Abilities.DRIZZLE, Abilities.NONE, Abilities.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.WATER, null, 4.5, 352, Abilities.DRIZZLE, Abilities.NONE, Abilities.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, false, null, true), - new PokemonForm("Primal", "primal", Type.WATER, null, 9.8, 430, Abilities.PRIMORDIAL_SEA, Abilities.NONE, Abilities.NONE, 770, 100, 150, 90, 180, 160, 90, 3, 0, 335), - ), - new PokemonSpecies(Species.GROUDON, 3, false, true, false, "Continent Pokémon", Type.GROUND, null, 3.5, 950, Abilities.DROUGHT, Abilities.NONE, Abilities.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.GROUND, null, 3.5, 950, Abilities.DROUGHT, Abilities.NONE, Abilities.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, false, null, true), - new PokemonForm("Primal", "primal", Type.GROUND, Type.FIRE, 5, 999.7, Abilities.DESOLATE_LAND, Abilities.NONE, Abilities.NONE, 770, 100, 180, 160, 150, 90, 90, 3, 0, 335), - ), - new PokemonSpecies(Species.RAYQUAZA, 3, false, true, false, "Sky High Pokémon", Type.DRAGON, Type.FLYING, 7, 206.5, Abilities.AIR_LOCK, Abilities.NONE, Abilities.NONE, 680, 105, 150, 90, 150, 90, 95, 45, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.FLYING, 7, 206.5, Abilities.AIR_LOCK, Abilities.NONE, Abilities.NONE, 680, 105, 150, 90, 150, 90, 95, 45, 0, 340, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.FLYING, 10.8, 392, Abilities.DELTA_STREAM, Abilities.NONE, Abilities.NONE, 780, 105, 180, 100, 180, 100, 115, 45, 0, 340), - ), - new PokemonSpecies(Species.JIRACHI, 3, false, false, true, "Wish Pokémon", Type.STEEL, Type.PSYCHIC, 0.3, 1.1, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DEOXYS, 3, false, false, true, "DNA Pokémon", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 270, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal Forme", "normal", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 270, false, "", true), - new PokemonForm("Attack Forme", "attack", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 180, 20, 180, 20, 150, 3, 0, 270), - new PokemonForm("Defense Forme", "defense", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 70, 160, 70, 160, 90, 3, 0, 270), - new PokemonForm("Speed Forme", "speed", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 95, 90, 95, 90, 180, 3, 0, 270), - ), - new PokemonSpecies(Species.TURTWIG, 4, false, false, false, "Tiny Leaf Pokémon", Type.GRASS, null, 0.4, 10.2, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 318, 55, 68, 64, 45, 55, 31, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.GROTLE, 4, false, false, false, "Grove Pokémon", Type.GRASS, null, 1.1, 97, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 405, 75, 89, 85, 55, 65, 36, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TORTERRA, 4, false, false, false, "Continent Pokémon", Type.GRASS, Type.GROUND, 2.2, 310, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 525, 95, 109, 105, 75, 85, 56, 45, 70, 236, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CHIMCHAR, 4, false, false, false, "Chimp Pokémon", Type.FIRE, null, 0.5, 6.2, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 309, 44, 58, 44, 58, 44, 61, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MONFERNO, 4, false, false, false, "Playful Pokémon", Type.FIRE, Type.FIGHTING, 0.9, 22, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 405, 64, 78, 52, 78, 52, 81, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.INFERNAPE, 4, false, false, false, "Flame Pokémon", Type.FIRE, Type.FIGHTING, 1.2, 55, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 534, 76, 104, 71, 104, 71, 108, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PIPLUP, 4, false, false, false, "Penguin Pokémon", Type.WATER, null, 0.4, 5.2, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 314, 53, 51, 53, 61, 56, 40, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PRINPLUP, 4, false, false, false, "Penguin Pokémon", Type.WATER, null, 0.8, 23, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 405, 64, 66, 68, 81, 76, 50, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.EMPOLEON, 4, false, false, false, "Emperor Pokémon", Type.WATER, Type.STEEL, 1.7, 84.5, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 530, 84, 86, 88, 111, 101, 60, 45, 70, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.STARLY, 4, false, false, false, "Starling Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2, Abilities.KEEN_EYE, Abilities.NONE, Abilities.RECKLESS, 245, 40, 55, 30, 30, 30, 60, 255, 70, 49, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.STARAVIA, 4, false, false, false, "Starling Pokémon", Type.NORMAL, Type.FLYING, 0.6, 15.5, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 340, 55, 75, 50, 40, 40, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.STARAPTOR, 4, false, false, false, "Predator Pokémon", Type.NORMAL, Type.FLYING, 1.2, 24.9, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 485, 85, 120, 70, 50, 60, 100, 45, 70, 218, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.BIDOOF, 4, false, false, false, "Plump Mouse Pokémon", Type.NORMAL, null, 0.5, 20, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 250, 59, 45, 40, 35, 40, 31, 255, 70, 50, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.BIBAREL, 4, false, false, false, "Beaver Pokémon", Type.NORMAL, Type.WATER, 1, 31.5, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 410, 79, 85, 60, 55, 60, 71, 127, 70, 144, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.KRICKETOT, 4, false, false, false, "Cricket Pokémon", Type.BUG, null, 0.3, 2.2, Abilities.SHED_SKIN, Abilities.NONE, Abilities.RUN_AWAY, 194, 37, 25, 41, 25, 41, 25, 255, 70, 39, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.KRICKETUNE, 4, false, false, false, "Cricket Pokémon", Type.BUG, null, 1, 25.5, Abilities.SWARM, Abilities.NONE, Abilities.TECHNICIAN, 384, 77, 85, 51, 55, 51, 65, 45, 70, 134, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.SHINX, 4, false, false, false, "Flash Pokémon", Type.ELECTRIC, null, 0.5, 9.5, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 263, 45, 65, 34, 40, 34, 45, 235, 50, 53, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.LUXIO, 4, false, false, false, "Spark Pokémon", Type.ELECTRIC, null, 0.9, 30.5, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 363, 60, 85, 49, 60, 49, 60, 120, 100, 127, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.LUXRAY, 4, false, false, false, "Gleam Eyes Pokémon", Type.ELECTRIC, null, 1.4, 42, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 523, 80, 120, 79, 95, 79, 70, 45, 50, 262, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.BUDEW, 4, false, false, false, "Bud Pokémon", Type.GRASS, Type.POISON, 0.2, 1.2, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.LEAF_GUARD, 280, 40, 30, 35, 50, 70, 55, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ROSERADE, 4, false, false, false, "Bouquet Pokémon", Type.GRASS, Type.POISON, 0.9, 14.5, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.TECHNICIAN, 515, 60, 70, 65, 125, 105, 90, 75, 50, 258, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.CRANIDOS, 4, false, false, false, "Head Butt Pokémon", Type.ROCK, null, 0.9, 31.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHEER_FORCE, 350, 67, 125, 40, 30, 30, 58, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.RAMPARDOS, 4, false, false, false, "Head Butt Pokémon", Type.ROCK, null, 1.6, 102.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHEER_FORCE, 495, 97, 165, 60, 65, 50, 58, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.SHIELDON, 4, false, false, false, "Shield Pokémon", Type.ROCK, Type.STEEL, 0.5, 57, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 350, 30, 42, 118, 42, 88, 30, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.BASTIODON, 4, false, false, false, "Shield Pokémon", Type.ROCK, Type.STEEL, 1.3, 149.5, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 495, 60, 52, 168, 47, 138, 30, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(Species.BURMY, 4, false, false, false, "Bagworm Pokémon", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Plant Cloak", "plant", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), - new PokemonForm("Sandy Cloak", "sandy", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), - new PokemonForm("Trash Cloak", "trash", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), - ), - new PokemonSpecies(Species.WORMADAM, 4, false, false, false, "Bagworm Pokémon", Type.BUG, Type.GRASS, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Plant Cloak", "plant", Type.BUG, Type.GRASS, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, false, null, true), - new PokemonForm("Sandy Cloak", "sandy", Type.BUG, Type.GROUND, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 79, 105, 59, 85, 36, 45, 70, 148, false, null, true), - new PokemonForm("Trash Cloak", "trash", Type.BUG, Type.STEEL, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 69, 95, 69, 95, 36, 45, 70, 148, false, null, true), - ), - new PokemonSpecies(Species.MOTHIM, 4, false, false, false, "Moth Pokémon", Type.BUG, Type.FLYING, 0.9, 23.3, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 424, 70, 94, 50, 94, 50, 66, 45, 70, 148, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.COMBEE, 4, false, false, false, "Tiny Bee Pokémon", Type.BUG, Type.FLYING, 0.3, 5.5, Abilities.HONEY_GATHER, Abilities.NONE, Abilities.HUSTLE, 244, 30, 30, 42, 30, 42, 70, 120, 50, 49, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(Species.VESPIQUEN, 4, false, false, false, "Beehive Pokémon", Type.BUG, Type.FLYING, 1.2, 38.5, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 474, 70, 80, 102, 80, 102, 40, 45, 50, 166, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.PACHIRISU, 4, false, false, false, "EleSquirrel Pokémon", Type.ELECTRIC, null, 0.4, 3.9, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.VOLT_ABSORB, 405, 60, 45, 70, 45, 90, 95, 200, 100, 142, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.BUIZEL, 4, false, false, false, "Sea Weasel Pokémon", Type.WATER, null, 0.7, 29.5, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 330, 55, 65, 35, 60, 30, 85, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.FLOATZEL, 4, false, false, false, "Sea Weasel Pokémon", Type.WATER, null, 1.1, 33.5, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 495, 85, 105, 55, 85, 50, 115, 75, 70, 173, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.CHERUBI, 4, false, false, false, "Cherry Pokémon", Type.GRASS, null, 0.4, 3.3, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.NONE, 275, 45, 35, 45, 62, 53, 35, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CHERRIM, 4, false, false, false, "Blossom Pokémon", Type.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Overcast Form", "overcast", Type.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, false, null, true), - new PokemonForm("Sunshine Form", "sunshine", Type.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158), - ), - new PokemonSpecies(Species.SHELLOS, 4, false, false, false, "Sea Slug Pokémon", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("East Sea", "east", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), - new PokemonForm("West Sea", "west", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), - ), - new PokemonSpecies(Species.GASTRODON, 4, false, false, false, "Sea Slug Pokémon", Type.WATER, Type.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("East Sea", "east", Type.WATER, Type.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), - new PokemonForm("West Sea", "west", Type.WATER, Type.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), - ), - new PokemonSpecies(Species.AMBIPOM, 4, false, false, false, "Long Tail Pokémon", Type.NORMAL, null, 1.2, 20.3, Abilities.TECHNICIAN, Abilities.PICKUP, Abilities.SKILL_LINK, 482, 75, 100, 66, 60, 66, 115, 45, 100, 169, GrowthRate.FAST, 50, true), - new PokemonSpecies(Species.DRIFLOON, 4, false, false, false, "Balloon Pokémon", Type.GHOST, Type.FLYING, 0.4, 1.2, Abilities.AFTERMATH, Abilities.UNBURDEN, Abilities.FLARE_BOOST, 348, 90, 50, 34, 60, 44, 70, 125, 50, 70, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.DRIFBLIM, 4, false, false, false, "Blimp Pokémon", Type.GHOST, Type.FLYING, 1.2, 15, Abilities.AFTERMATH, Abilities.UNBURDEN, Abilities.FLARE_BOOST, 498, 150, 80, 44, 90, 54, 80, 60, 50, 174, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.BUNEARY, 4, false, false, false, "Rabbit Pokémon", Type.NORMAL, null, 0.4, 5.5, Abilities.RUN_AWAY, Abilities.KLUTZ, Abilities.LIMBER, 350, 55, 66, 44, 44, 56, 85, 190, 0, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LOPUNNY, 4, false, false, false, "Rabbit Pokémon", Type.NORMAL, null, 1.2, 33.3, Abilities.CUTE_CHARM, Abilities.KLUTZ, Abilities.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 1.2, 33.3, Abilities.CUTE_CHARM, Abilities.KLUTZ, Abilities.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, Type.FIGHTING, 1.3, 28.3, Abilities.SCRAPPY, Abilities.SCRAPPY, Abilities.SCRAPPY, 580, 65, 136, 94, 54, 96, 135, 60, 140, 168), - ), - new PokemonSpecies(Species.MISMAGIUS, 4, false, false, false, "Magical Pokémon", Type.GHOST, null, 0.9, 4.4, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 495, 60, 60, 60, 105, 105, 105, 45, 35, 173, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.HONCHKROW, 4, false, false, false, "Big Boss Pokémon", Type.DARK, Type.FLYING, 0.9, 27.3, Abilities.INSOMNIA, Abilities.SUPER_LUCK, Abilities.MOXIE, 505, 100, 125, 52, 105, 52, 71, 30, 35, 177, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GLAMEOW, 4, false, false, false, "Catty Pokémon", Type.NORMAL, null, 0.5, 3.9, Abilities.LIMBER, Abilities.OWN_TEMPO, Abilities.KEEN_EYE, 310, 49, 55, 42, 42, 37, 85, 190, 70, 62, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.PURUGLY, 4, false, false, false, "Tiger Cat Pokémon", Type.NORMAL, null, 1, 43.8, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.DEFIANT, 452, 71, 82, 64, 64, 59, 112, 75, 70, 158, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.CHINGLING, 4, false, false, false, "Bell Pokémon", Type.PSYCHIC, null, 0.2, 0.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 285, 45, 30, 50, 65, 50, 45, 120, 70, 57, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.STUNKY, 4, false, false, false, "Skunk Pokémon", Type.POISON, Type.DARK, 0.4, 19.2, Abilities.STENCH, Abilities.AFTERMATH, Abilities.KEEN_EYE, 329, 63, 63, 47, 41, 41, 74, 225, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SKUNTANK, 4, false, false, false, "Skunk Pokémon", Type.POISON, Type.DARK, 1, 38, Abilities.STENCH, Abilities.AFTERMATH, Abilities.KEEN_EYE, 479, 103, 93, 67, 71, 61, 84, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BRONZOR, 4, false, false, false, "Bronze Pokémon", Type.STEEL, Type.PSYCHIC, 0.5, 60.5, Abilities.LEVITATE, Abilities.HEATPROOF, Abilities.HEAVY_METAL, 300, 57, 24, 86, 24, 86, 23, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.BRONZONG, 4, false, false, false, "Bronze Bell Pokémon", Type.STEEL, Type.PSYCHIC, 1.3, 187, Abilities.LEVITATE, Abilities.HEATPROOF, Abilities.HEAVY_METAL, 500, 67, 89, 116, 79, 116, 33, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.BONSLY, 4, false, false, false, "Bonsai Pokémon", Type.ROCK, null, 0.5, 15, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.RATTLED, 290, 50, 80, 95, 10, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MIME_JR, 4, false, false, false, "Mime Pokémon", Type.PSYCHIC, Type.FAIRY, 0.6, 13, Abilities.SOUNDPROOF, Abilities.FILTER, Abilities.TECHNICIAN, 310, 20, 25, 45, 70, 90, 60, 145, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HAPPINY, 4, false, false, false, "Playhouse Pokémon", Type.NORMAL, null, 0.6, 24.4, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.FRIEND_GUARD, 220, 100, 5, 5, 15, 65, 30, 130, 140, 110, GrowthRate.FAST, 0, false), - new PokemonSpecies(Species.CHATOT, 4, false, false, false, "Music Note Pokémon", Type.NORMAL, Type.FLYING, 0.5, 1.9, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 411, 76, 65, 45, 92, 42, 91, 30, 35, 144, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SPIRITOMB, 4, false, false, false, "Forbidden Pokémon", Type.GHOST, Type.DARK, 1, 108, Abilities.PRESSURE, Abilities.NONE, Abilities.INFILTRATOR, 485, 50, 92, 108, 92, 108, 35, 100, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GIBLE, 4, false, false, false, "Land Shark Pokémon", Type.DRAGON, Type.GROUND, 0.7, 20.5, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 300, 58, 70, 45, 40, 45, 42, 45, 50, 60, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.GABITE, 4, false, false, false, "Cave Pokémon", Type.DRAGON, Type.GROUND, 1.4, 56, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 410, 68, 90, 65, 50, 55, 82, 45, 50, 144, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.GARCHOMP, 4, false, false, false, "Mach Pokémon", Type.DRAGON, Type.GROUND, 1.9, 95, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.GROUND, 1.9, 95, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.GROUND, 1.9, 95, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SAND_FORCE, 700, 108, 170, 115, 120, 95, 92, 45, 50, 300, true), - ), - new PokemonSpecies(Species.MUNCHLAX, 4, false, false, false, "Big Eater Pokémon", Type.NORMAL, null, 0.6, 105, Abilities.PICKUP, Abilities.THICK_FAT, Abilities.GLUTTONY, 390, 135, 85, 40, 40, 85, 5, 50, 50, 78, GrowthRate.SLOW, 87.5, false), - new PokemonSpecies(Species.RIOLU, 4, false, false, false, "Emanation Pokémon", Type.FIGHTING, null, 0.7, 20.2, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.PRANKSTER, 285, 40, 70, 40, 35, 40, 60, 75, 50, 57, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.LUCARIO, 4, false, false, false, "Aura Pokémon", Type.FIGHTING, Type.STEEL, 1.2, 54, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.FIGHTING, Type.STEEL, 1.2, 54, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.FIGHTING, Type.STEEL, 1.3, 57.5, Abilities.ADAPTABILITY, Abilities.ADAPTABILITY, Abilities.ADAPTABILITY, 625, 70, 145, 88, 140, 70, 112, 45, 50, 184), - ), - new PokemonSpecies(Species.HIPPOPOTAS, 4, false, false, false, "Hippo Pokémon", Type.GROUND, null, 0.8, 49.5, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_FORCE, 330, 68, 72, 78, 38, 42, 32, 140, 50, 66, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.HIPPOWDON, 4, false, false, false, "Heavyweight Pokémon", Type.GROUND, null, 2, 300, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_FORCE, 525, 108, 112, 118, 68, 72, 47, 60, 50, 184, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.SKORUPI, 4, false, false, false, "Scorpion Pokémon", Type.POISON, Type.BUG, 0.8, 12, Abilities.BATTLE_ARMOR, Abilities.SNIPER, Abilities.KEEN_EYE, 330, 40, 50, 90, 30, 55, 65, 120, 50, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAPION, 4, false, false, false, "Ogre Scorpion Pokémon", Type.POISON, Type.DARK, 1.3, 61.5, Abilities.BATTLE_ARMOR, Abilities.SNIPER, Abilities.KEEN_EYE, 500, 70, 90, 110, 60, 75, 95, 45, 50, 175, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CROAGUNK, 4, false, false, false, "Toxic Mouth Pokémon", Type.POISON, Type.FIGHTING, 0.7, 23, Abilities.ANTICIPATION, Abilities.DRY_SKIN, Abilities.POISON_TOUCH, 300, 48, 61, 40, 61, 40, 50, 140, 100, 60, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.TOXICROAK, 4, false, false, false, "Toxic Mouth Pokémon", Type.POISON, Type.FIGHTING, 1.3, 44.4, Abilities.ANTICIPATION, Abilities.DRY_SKIN, Abilities.POISON_TOUCH, 490, 83, 106, 65, 86, 65, 85, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.CARNIVINE, 4, false, false, false, "Bug Catcher Pokémon", Type.GRASS, null, 1.4, 27, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 454, 74, 100, 72, 90, 72, 46, 200, 70, 159, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.FINNEON, 4, false, false, false, "Wing Fish Pokémon", Type.WATER, null, 0.4, 7, Abilities.SWIFT_SWIM, Abilities.STORM_DRAIN, Abilities.WATER_VEIL, 330, 49, 49, 56, 49, 61, 66, 190, 70, 66, GrowthRate.ERRATIC, 50, true), - new PokemonSpecies(Species.LUMINEON, 4, false, false, false, "Neon Pokémon", Type.WATER, null, 1.2, 24, Abilities.SWIFT_SWIM, Abilities.STORM_DRAIN, Abilities.WATER_VEIL, 460, 69, 69, 76, 69, 86, 91, 75, 70, 161, GrowthRate.ERRATIC, 50, true), - new PokemonSpecies(Species.MANTYKE, 4, false, false, false, "Kite Pokémon", Type.WATER, Type.FLYING, 1, 65, Abilities.SWIFT_SWIM, Abilities.WATER_ABSORB, Abilities.WATER_VEIL, 345, 45, 20, 50, 60, 120, 50, 25, 50, 69, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SNOVER, 4, false, false, false, "Frost Tree Pokémon", Type.GRASS, Type.ICE, 1, 50.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 334, 60, 62, 50, 62, 60, 40, 120, 50, 67, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.ABOMASNOW, 4, false, false, false, "Frost Tree Pokémon", Type.GRASS, Type.ICE, 2.2, 135.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", Type.GRASS, Type.ICE, 2.2, 135.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GRASS, Type.ICE, 2.7, 185, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SNOW_WARNING, 594, 90, 132, 105, 132, 105, 30, 60, 50, 173, true), - ), - new PokemonSpecies(Species.WEAVILE, 4, false, false, false, "Sharp Claw Pokémon", Type.DARK, Type.ICE, 1.1, 34, Abilities.PRESSURE, Abilities.NONE, Abilities.PICKPOCKET, 510, 70, 120, 65, 45, 85, 125, 45, 35, 179, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.MAGNEZONE, 4, false, false, false, "Magnet Area Pokémon", Type.ELECTRIC, Type.STEEL, 1.2, 180, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 535, 70, 70, 115, 130, 90, 60, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.LICKILICKY, 4, false, false, false, "Licking Pokémon", Type.NORMAL, null, 1.7, 140, Abilities.OWN_TEMPO, Abilities.OBLIVIOUS, Abilities.CLOUD_NINE, 515, 110, 85, 95, 80, 95, 50, 30, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RHYPERIOR, 4, false, false, false, "Drill Pokémon", Type.GROUND, Type.ROCK, 2.4, 282.8, Abilities.LIGHTNING_ROD, Abilities.SOLID_ROCK, Abilities.RECKLESS, 535, 115, 140, 130, 55, 55, 40, 30, 50, 268, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.TANGROWTH, 4, false, false, false, "Vine Pokémon", Type.GRASS, null, 2, 128.6, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.REGENERATOR, 535, 100, 100, 125, 110, 50, 50, 30, 50, 187, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.ELECTIVIRE, 4, false, false, false, "Thunderbolt Pokémon", Type.ELECTRIC, null, 1.8, 138.6, Abilities.MOTOR_DRIVE, Abilities.NONE, Abilities.VITAL_SPIRIT, 540, 75, 123, 67, 95, 85, 95, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.MAGMORTAR, 4, false, false, false, "Blast Pokémon", Type.FIRE, null, 1.6, 68, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 540, 75, 95, 67, 125, 95, 83, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(Species.TOGEKISS, 4, false, false, false, "Jubilee Pokémon", Type.FAIRY, Type.FLYING, 1.5, 38, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 545, 85, 50, 95, 120, 115, 80, 30, 50, 273, GrowthRate.FAST, 87.5, false), - new PokemonSpecies(Species.YANMEGA, 4, false, false, false, "Ogre Darner Pokémon", Type.BUG, Type.FLYING, 1.9, 51.5, Abilities.SPEED_BOOST, Abilities.TINTED_LENS, Abilities.FRISK, 515, 86, 76, 86, 116, 56, 95, 30, 70, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LEAFEON, 4, false, false, false, "Verdant Pokémon", Type.GRASS, null, 1, 25.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 65, 110, 130, 60, 65, 95, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.GLACEON, 4, false, false, false, "Fresh Snow Pokémon", Type.ICE, null, 0.8, 25.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.ICE_BODY, 525, 65, 60, 110, 130, 95, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.GLISCOR, 4, false, false, false, "Fang Scorpion Pokémon", Type.GROUND, Type.FLYING, 2, 42.5, Abilities.HYPER_CUTTER, Abilities.SAND_VEIL, Abilities.POISON_HEAL, 510, 75, 95, 125, 45, 75, 95, 30, 70, 179, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MAMOSWINE, 4, false, false, false, "Twin Tusk Pokémon", Type.ICE, Type.GROUND, 2.5, 291, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 530, 110, 130, 80, 70, 60, 80, 50, 50, 265, GrowthRate.SLOW, 50, true), - new PokemonSpecies(Species.PORYGON_Z, 4, false, false, false, "Virtual Pokémon", Type.NORMAL, null, 0.9, 34, Abilities.ADAPTABILITY, Abilities.DOWNLOAD, Abilities.ANALYTIC, 535, 85, 80, 70, 135, 75, 90, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.GALLADE, 4, false, false, false, "Blade Pokémon", Type.PSYCHIC, Type.FIGHTING, 1.6, 52, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, Type.FIGHTING, 1.6, 52, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.PSYCHIC, Type.FIGHTING, 1.6, 56.4, Abilities.SHARPNESS, Abilities.SHARPNESS, Abilities.SHARPNESS, 618, 68, 165, 95, 65, 115, 110, 45, 35, 259), - ), - new PokemonSpecies(Species.PROBOPASS, 4, false, false, false, "Compass Pokémon", Type.ROCK, Type.STEEL, 1.4, 340, Abilities.STURDY, Abilities.MAGNET_PULL, Abilities.SAND_FORCE, 525, 60, 55, 145, 75, 150, 40, 60, 70, 184, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUSKNOIR, 4, false, false, false, "Gripper Pokémon", Type.GHOST, null, 2.2, 106.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 525, 45, 100, 135, 65, 135, 45, 45, 35, 263, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.FROSLASS, 4, false, false, false, "Snow Land Pokémon", Type.ICE, Type.GHOST, 1.3, 26.6, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.CURSED_BODY, 480, 70, 80, 70, 80, 70, 110, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.ROTOM, 4, false, false, false, "Plasma Pokémon", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Normal", "", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, false, null, true), - new PokemonForm("Heat", "heat", Type.ELECTRIC, Type.FIRE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), - new PokemonForm("Wash", "wash", Type.ELECTRIC, Type.WATER, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), - new PokemonForm("Frost", "frost", Type.ELECTRIC, Type.ICE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), - new PokemonForm("Fan", "fan", Type.ELECTRIC, Type.FLYING, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), - new PokemonForm("Mow", "mow", Type.ELECTRIC, Type.GRASS, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), - ), - new PokemonSpecies(Species.UXIE, 4, true, false, false, "Knowledge Pokémon", Type.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 75, 75, 130, 75, 130, 95, 3, 140, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MESPRIT, 4, true, false, false, "Emotion Pokémon", Type.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 80, 105, 105, 105, 105, 80, 3, 140, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.AZELF, 4, true, false, false, "Willpower Pokémon", Type.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 75, 125, 70, 125, 70, 115, 3, 140, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DIALGA, 4, false, true, false, "Temporal Pokémon", Type.STEEL, Type.DRAGON, 5.4, 683, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.STEEL, Type.DRAGON, 5.4, 683, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", Type.STEEL, Type.DRAGON, 7, 848.7, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 100, 120, 150, 120, 90, 3, 0, 340), - ), - new PokemonSpecies(Species.PALKIA, 4, false, true, false, "Spatial Pokémon", Type.WATER, Type.DRAGON, 4.2, 336, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.WATER, Type.DRAGON, 4.2, 336, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", Type.WATER, Type.DRAGON, 6.3, 659, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 100, 100, 150, 120, 120, 3, 0, 340), - ), - new PokemonSpecies(Species.HEATRAN, 4, true, false, false, "Lava Dome Pokémon", Type.FIRE, Type.STEEL, 1.7, 430, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 600, 91, 90, 106, 130, 106, 77, 3, 100, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Altered Forme", "altered", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), - ), - new PokemonSpecies(Species.CRESSELIA, 4, true, false, false, "Lunar Pokémon", Type.PSYCHIC, null, 1.5, 85.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", Type.WATER, null, 0.4, 3.1, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 216, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MANAPHY, 4, false, false, true, "Seafaring Pokémon", Type.WATER, null, 0.3, 1.4, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 70, 270, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DARKRAI, 4, false, false, true, "Pitch-Black Pokémon", Type.DARK, null, 1.5, 50.5, Abilities.BAD_DREAMS, Abilities.NONE, Abilities.NONE, 600, 70, 90, 90, 135, 90, 125, 3, 0, 270, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SHAYMIN, 4, false, false, true, "Gratitude Pokémon", Type.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, GrowthRate.MEDIUM_SLOW, null, false, true, - new PokemonForm("Land Forme", "land", Type.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, false, null, true), - new PokemonForm("Sky Forme", "sky", Type.GRASS, Type.FLYING, 0.4, 5.2, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 103, 75, 120, 75, 127, 45, 100, 270), - ), - new PokemonSpecies(Species.ARCEUS, 4, false, false, true, "Alpha Pokémon", Type.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "normal", Type.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324, false, null, true), - new PokemonForm("Fighting", "fighting", Type.FIGHTING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Flying", "flying", Type.FLYING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Poison", "poison", Type.POISON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Ground", "ground", Type.GROUND, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Rock", "rock", Type.ROCK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Bug", "bug", Type.BUG, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Ghost", "ghost", Type.GHOST, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Steel", "steel", Type.STEEL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Fire", "fire", Type.FIRE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Water", "water", Type.WATER, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Grass", "grass", Type.GRASS, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Electric", "electric", Type.ELECTRIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Psychic", "psychic", Type.PSYCHIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Ice", "ice", Type.ICE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Dragon", "dragon", Type.DRAGON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Dark", "dark", Type.DARK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Fairy", "fairy", Type.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - ), - new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SERVINE, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.8, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SERPERIOR, 5, false, false, false, "Regal Pokémon", Type.GRASS, null, 3.3, 63, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TEPIG, 5, false, false, false, "Fire Pig Pokémon", Type.FIRE, null, 0.5, 9.9, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 308, 65, 63, 45, 45, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PIGNITE, 5, false, false, false, "Fire Pig Pokémon", Type.FIRE, Type.FIGHTING, 1, 55.5, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 418, 90, 93, 55, 70, 55, 55, 45, 70, 146, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.EMBOAR, 5, false, false, false, "Mega Fire Pig Pokémon", Type.FIRE, Type.FIGHTING, 1.6, 150, Abilities.BLAZE, Abilities.NONE, Abilities.RECKLESS, 528, 110, 123, 65, 100, 65, 65, 45, 70, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.OSHAWOTT, 5, false, false, false, "Sea Otter Pokémon", Type.WATER, null, 0.5, 5.9, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 308, 55, 55, 45, 63, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DEWOTT, 5, false, false, false, "Discipline Pokémon", Type.WATER, null, 0.8, 24.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 413, 75, 75, 60, 83, 60, 60, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SAMUROTT, 5, false, false, false, "Formidable Pokémon", Type.WATER, null, 1.5, 94.6, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 528, 95, 100, 85, 108, 70, 70, 45, 70, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PATRAT, 5, false, false, false, "Scout Pokémon", Type.NORMAL, null, 0.5, 11.6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.ANALYTIC, 255, 45, 55, 39, 35, 39, 42, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WATCHOG, 5, false, false, false, "Lookout Pokémon", Type.NORMAL, null, 1.1, 27, Abilities.ILLUMINATE, Abilities.KEEN_EYE, Abilities.ANALYTIC, 420, 60, 85, 69, 60, 69, 77, 255, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LILLIPUP, 5, false, false, false, "Puppy Pokémon", Type.NORMAL, null, 0.4, 4.1, Abilities.VITAL_SPIRIT, Abilities.PICKUP, Abilities.RUN_AWAY, 275, 45, 60, 45, 25, 45, 55, 255, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.HERDIER, 5, false, false, false, "Loyal Dog Pokémon", Type.NORMAL, null, 0.9, 14.7, Abilities.INTIMIDATE, Abilities.SAND_RUSH, Abilities.SCRAPPY, 370, 65, 80, 65, 35, 65, 60, 120, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.STOUTLAND, 5, false, false, false, "Big-Hearted Pokémon", Type.NORMAL, null, 1.2, 61, Abilities.INTIMIDATE, Abilities.SAND_RUSH, Abilities.SCRAPPY, 500, 85, 110, 90, 45, 90, 80, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PURRLOIN, 5, false, false, false, "Devious Pokémon", Type.DARK, null, 0.4, 10.1, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.PRANKSTER, 281, 41, 50, 37, 50, 37, 66, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LIEPARD, 5, false, false, false, "Cruel Pokémon", Type.DARK, null, 1.1, 37.5, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.PRANKSTER, 446, 64, 88, 50, 88, 50, 106, 90, 50, 156, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PANSAGE, 5, false, false, false, "Grass Monkey Pokémon", Type.GRASS, null, 0.6, 10.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.OVERGROW, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SIMISAGE, 5, false, false, false, "Thorn Monkey Pokémon", Type.GRASS, null, 1.1, 30.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.OVERGROW, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.PANSEAR, 5, false, false, false, "High Temp Pokémon", Type.FIRE, null, 0.6, 11, Abilities.GLUTTONY, Abilities.NONE, Abilities.BLAZE, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SIMISEAR, 5, false, false, false, "Ember Pokémon", Type.FIRE, null, 1, 28, Abilities.GLUTTONY, Abilities.NONE, Abilities.BLAZE, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.PANPOUR, 5, false, false, false, "Spray Pokémon", Type.WATER, null, 0.6, 13.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.TORRENT, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SIMIPOUR, 5, false, false, false, "Geyser Pokémon", Type.WATER, null, 1, 29, Abilities.GLUTTONY, Abilities.NONE, Abilities.TORRENT, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.MUNNA, 5, false, false, false, "Dream Eater Pokémon", Type.PSYCHIC, null, 0.6, 23.3, Abilities.FOREWARN, Abilities.SYNCHRONIZE, Abilities.TELEPATHY, 292, 76, 25, 45, 67, 55, 24, 190, 50, 58, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.MUSHARNA, 5, false, false, false, "Drowsing Pokémon", Type.PSYCHIC, null, 1.1, 60.5, Abilities.FOREWARN, Abilities.SYNCHRONIZE, Abilities.TELEPATHY, 487, 116, 55, 85, 107, 95, 29, 75, 50, 170, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.PIDOVE, 5, false, false, false, "Tiny Pigeon Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2.1, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 264, 50, 55, 50, 36, 30, 43, 255, 50, 53, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TRANQUILL, 5, false, false, false, "Wild Pigeon Pokémon", Type.NORMAL, Type.FLYING, 0.6, 15, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 358, 62, 77, 62, 50, 42, 65, 120, 50, 125, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.UNFEZANT, 5, false, false, false, "Proud Pokémon", Type.NORMAL, Type.FLYING, 1.2, 29, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 488, 80, 115, 80, 65, 55, 93, 45, 50, 244, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.BLITZLE, 5, false, false, false, "Electrified Pokémon", Type.ELECTRIC, null, 0.8, 29.8, Abilities.LIGHTNING_ROD, Abilities.MOTOR_DRIVE, Abilities.SAP_SIPPER, 295, 45, 60, 32, 50, 32, 76, 190, 70, 59, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ZEBSTRIKA, 5, false, false, false, "Thunderbolt Pokémon", Type.ELECTRIC, null, 1.6, 79.5, Abilities.LIGHTNING_ROD, Abilities.MOTOR_DRIVE, Abilities.SAP_SIPPER, 497, 75, 100, 63, 80, 63, 116, 75, 70, 174, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ROGGENROLA, 5, false, false, false, "Mantle Pokémon", Type.ROCK, null, 0.4, 18, Abilities.STURDY, Abilities.WEAK_ARMOR, Abilities.SAND_FORCE, 280, 55, 75, 85, 25, 25, 15, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.BOLDORE, 5, false, false, false, "Ore Pokémon", Type.ROCK, null, 0.9, 102, Abilities.STURDY, Abilities.WEAK_ARMOR, Abilities.SAND_FORCE, 390, 70, 105, 105, 50, 40, 20, 120, 50, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GIGALITH, 5, false, false, false, "Compressed Pokémon", Type.ROCK, null, 1.7, 260, Abilities.STURDY, Abilities.SAND_STREAM, Abilities.SAND_FORCE, 515, 85, 135, 130, 60, 80, 25, 45, 50, 258, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WOOBAT, 5, false, false, false, "Bat Pokémon", Type.PSYCHIC, Type.FLYING, 0.4, 2.1, Abilities.UNAWARE, Abilities.KLUTZ, Abilities.SIMPLE, 323, 65, 45, 43, 55, 43, 72, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SWOOBAT, 5, false, false, false, "Courting Pokémon", Type.PSYCHIC, Type.FLYING, 0.9, 10.5, Abilities.UNAWARE, Abilities.KLUTZ, Abilities.SIMPLE, 425, 67, 57, 55, 77, 55, 114, 45, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DRILBUR, 5, false, false, false, "Mole Pokémon", Type.GROUND, null, 0.3, 8.5, Abilities.SAND_RUSH, Abilities.SAND_FORCE, Abilities.MOLD_BREAKER, 328, 60, 85, 40, 30, 45, 68, 120, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.EXCADRILL, 5, false, false, false, "Subterrene Pokémon", Type.GROUND, Type.STEEL, 0.7, 40.4, Abilities.SAND_RUSH, Abilities.SAND_FORCE, Abilities.MOLD_BREAKER, 508, 110, 135, 60, 50, 65, 88, 60, 50, 178, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AUDINO, 5, false, false, false, "Hearing Pokémon", Type.NORMAL, null, 1.1, 31, Abilities.HEALER, Abilities.REGENERATOR, Abilities.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, GrowthRate.FAST, 50, false, true, - new PokemonForm("Normal", "", Type.NORMAL, null, 1.1, 31, Abilities.HEALER, Abilities.REGENERATOR, Abilities.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, Type.FAIRY, 1.5, 32, Abilities.REGENERATOR, Abilities.REGENERATOR, Abilities.REGENERATOR, 545, 103, 60, 126, 80, 126, 50, 255, 50, 390), //Custom Ability, base form Hidden Ability - ), - new PokemonSpecies(Species.TIMBURR, 5, false, false, false, "Muscular Pokémon", Type.FIGHTING, null, 0.6, 12.5, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 305, 75, 80, 55, 25, 35, 35, 180, 70, 61, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.GURDURR, 5, false, false, false, "Muscular Pokémon", Type.FIGHTING, null, 1.2, 40, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 405, 85, 105, 85, 40, 50, 40, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.CONKELDURR, 5, false, false, false, "Muscular Pokémon", Type.FIGHTING, null, 1.4, 87, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 505, 105, 140, 95, 55, 65, 45, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(Species.TYMPOLE, 5, false, false, false, "Tadpole Pokémon", Type.WATER, null, 0.5, 4.5, Abilities.SWIFT_SWIM, Abilities.HYDRATION, Abilities.WATER_ABSORB, 294, 50, 50, 40, 50, 40, 64, 255, 50, 59, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PALPITOAD, 5, false, false, false, "Vibration Pokémon", Type.WATER, Type.GROUND, 0.8, 17, Abilities.SWIFT_SWIM, Abilities.HYDRATION, Abilities.WATER_ABSORB, 384, 75, 65, 55, 65, 55, 69, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SEISMITOAD, 5, false, false, false, "Vibration Pokémon", Type.WATER, Type.GROUND, 1.5, 62, Abilities.SWIFT_SWIM, Abilities.POISON_TOUCH, Abilities.WATER_ABSORB, 509, 105, 95, 75, 85, 75, 74, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.THROH, 5, false, false, false, "Judo Pokémon", Type.FIGHTING, null, 1.3, 55.5, Abilities.GUTS, Abilities.INNER_FOCUS, Abilities.MOLD_BREAKER, 465, 120, 100, 85, 30, 85, 45, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.SAWK, 5, false, false, false, "Karate Pokémon", Type.FIGHTING, null, 1.4, 51, Abilities.STURDY, Abilities.INNER_FOCUS, Abilities.MOLD_BREAKER, 465, 75, 125, 75, 30, 75, 85, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.SEWADDLE, 5, false, false, false, "Sewing Pokémon", Type.BUG, Type.GRASS, 0.3, 2.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 310, 45, 53, 70, 40, 60, 42, 255, 70, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SWADLOON, 5, false, false, false, "Leaf-Wrapped Pokémon", Type.BUG, Type.GRASS, 0.5, 7.3, Abilities.LEAF_GUARD, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 380, 55, 63, 90, 50, 80, 42, 120, 70, 133, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LEAVANNY, 5, false, false, false, "Nurturing Pokémon", Type.BUG, Type.GRASS, 1.2, 20.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 500, 75, 103, 80, 70, 80, 92, 45, 70, 225, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.VENIPEDE, 5, false, false, false, "Centipede Pokémon", Type.BUG, Type.POISON, 0.4, 5.3, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 260, 30, 45, 59, 30, 39, 57, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.WHIRLIPEDE, 5, false, false, false, "Curlipede Pokémon", Type.BUG, Type.POISON, 1.2, 58.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 360, 40, 55, 99, 40, 79, 47, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SCOLIPEDE, 5, false, false, false, "Megapede Pokémon", Type.BUG, Type.POISON, 2.5, 200.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 485, 60, 100, 89, 55, 69, 112, 45, 50, 243, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.COTTONEE, 5, false, false, false, "Cotton Puff Pokémon", Type.GRASS, Type.FAIRY, 0.3, 0.6, Abilities.PRANKSTER, Abilities.INFILTRATOR, Abilities.CHLOROPHYLL, 280, 40, 27, 60, 37, 50, 66, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WHIMSICOTT, 5, false, false, false, "Windveiled Pokémon", Type.GRASS, Type.FAIRY, 0.7, 6.6, Abilities.PRANKSTER, Abilities.INFILTRATOR, Abilities.CHLOROPHYLL, 480, 60, 67, 85, 77, 75, 116, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PETILIL, 5, false, false, false, "Bulb Pokémon", Type.GRASS, null, 0.5, 6.6, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 280, 45, 35, 50, 70, 50, 30, 190, 50, 56, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.LILLIGANT, 5, false, false, false, "Flowering Pokémon", Type.GRASS, null, 1.1, 16.3, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 480, 70, 60, 75, 110, 75, 90, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.BASCULIN, 5, false, false, false, "Hostile Pokémon", Type.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Red-Striped Form", "red-striped", Type.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), - new PokemonForm("Blue-Striped Form", "blue-striped", Type.WATER, null, 1, 18, Abilities.ROCK_HEAD, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), - new PokemonForm("White-Striped Form", "white-striped", Type.WATER, null, 1, 18, Abilities.RATTLED, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), - ), - new PokemonSpecies(Species.SANDILE, 5, false, false, false, "Desert Croc Pokémon", Type.GROUND, Type.DARK, 0.7, 15.2, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 292, 50, 72, 35, 35, 35, 65, 180, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.KROKOROK, 5, false, false, false, "Desert Croc Pokémon", Type.GROUND, Type.DARK, 1, 33.4, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 351, 60, 82, 45, 45, 45, 74, 90, 50, 123, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.KROOKODILE, 5, false, false, false, "Intimidation Pokémon", Type.GROUND, Type.DARK, 1.5, 96.3, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 519, 95, 117, 80, 65, 70, 92, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DARUMAKA, 5, false, false, false, "Zen Charm Pokémon", Type.FIRE, null, 0.6, 37.5, Abilities.HUSTLE, Abilities.NONE, Abilities.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DARMANITAN, 5, false, false, false, "Blazing Pokémon", Type.FIRE, null, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Standard Mode", "", Type.FIRE, null, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), - new PokemonForm("Zen Mode", "zen", Type.FIRE, Type.PSYCHIC, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 30, 105, 140, 105, 55, 60, 50, 168), - ), - new PokemonSpecies(Species.MARACTUS, 5, false, false, false, "Cactus Pokémon", Type.GRASS, null, 1, 28, Abilities.WATER_ABSORB, Abilities.CHLOROPHYLL, Abilities.STORM_DRAIN, 461, 75, 86, 67, 106, 67, 60, 255, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DWEBBLE, 5, false, false, false, "Rock Inn Pokémon", Type.BUG, Type.ROCK, 0.3, 14.5, Abilities.STURDY, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 325, 50, 65, 85, 35, 35, 55, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CRUSTLE, 5, false, false, false, "Stone Home Pokémon", Type.BUG, Type.ROCK, 1.4, 200, Abilities.STURDY, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 485, 70, 105, 125, 65, 75, 45, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCRAGGY, 5, false, false, false, "Shedding Pokémon", Type.DARK, Type.FIGHTING, 0.6, 11.8, Abilities.SHED_SKIN, Abilities.MOXIE, Abilities.INTIMIDATE, 348, 50, 75, 70, 35, 70, 48, 180, 35, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCRAFTY, 5, false, false, false, "Hoodlum Pokémon", Type.DARK, Type.FIGHTING, 1.1, 30, Abilities.SHED_SKIN, Abilities.MOXIE, Abilities.INTIMIDATE, 488, 65, 90, 115, 45, 115, 58, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SIGILYPH, 5, false, false, false, "Avianoid Pokémon", Type.PSYCHIC, Type.FLYING, 1.4, 14, Abilities.WONDER_SKIN, Abilities.MAGIC_GUARD, Abilities.TINTED_LENS, 490, 72, 58, 80, 103, 80, 97, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.YAMASK, 5, false, false, false, "Spirit Pokémon", Type.GHOST, null, 0.5, 1.5, Abilities.MUMMY, Abilities.NONE, Abilities.NONE, 303, 38, 30, 85, 55, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.COFAGRIGUS, 5, false, false, false, "Coffin Pokémon", Type.GHOST, null, 1.7, 76.5, Abilities.MUMMY, Abilities.NONE, Abilities.NONE, 483, 58, 50, 145, 95, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TIRTOUGA, 5, false, false, false, "Prototurtle Pokémon", Type.WATER, Type.ROCK, 0.7, 16.5, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 355, 54, 78, 103, 53, 45, 22, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.CARRACOSTA, 5, false, false, false, "Prototurtle Pokémon", Type.WATER, Type.ROCK, 1.2, 81, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 495, 74, 108, 133, 83, 65, 32, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.ARCHEN, 5, false, false, false, "First Bird Pokémon", Type.ROCK, Type.FLYING, 0.5, 9.5, Abilities.DEFEATIST, Abilities.NONE, Abilities.EMERGENCY_EXIT, 401, 55, 112, 45, 74, 45, 70, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden - new PokemonSpecies(Species.ARCHEOPS, 5, false, false, false, "First Bird Pokémon", Type.ROCK, Type.FLYING, 1.4, 32, Abilities.DEFEATIST, Abilities.NONE, Abilities.EMERGENCY_EXIT, 567, 75, 140, 65, 112, 65, 110, 45, 50, 177, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden - new PokemonSpecies(Species.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", Type.POISON, null, 0.6, 31, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.POISON, Type.STEEL, 21, 999.9, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, 574, 135, 125, 102, 57, 102, 53, 60, 50, 166), - ), - new PokemonSpecies(Species.ZORUA, 5, false, false, false, "Tricky Fox Pokémon", Type.DARK, null, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 40, 65, 40, 80, 40, 65, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.ZOROARK, 5, false, false, false, "Illusion Fox Pokémon", Type.DARK, null, 1.6, 81.1, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 60, 105, 60, 120, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MINCCINO, 5, false, false, false, "Chinchilla Pokémon", Type.NORMAL, null, 0.4, 5.8, Abilities.CUTE_CHARM, Abilities.TECHNICIAN, Abilities.SKILL_LINK, 300, 55, 50, 40, 40, 40, 75, 255, 50, 60, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.CINCCINO, 5, false, false, false, "Scarf Pokémon", Type.NORMAL, null, 0.5, 7.5, Abilities.CUTE_CHARM, Abilities.TECHNICIAN, Abilities.SKILL_LINK, 470, 75, 95, 60, 65, 60, 115, 60, 50, 165, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.GOTHITA, 5, false, false, false, "Fixation Pokémon", Type.PSYCHIC, null, 0.4, 5.8, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 290, 45, 30, 50, 55, 65, 45, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 25, false), - new PokemonSpecies(Species.GOTHORITA, 5, false, false, false, "Manipulate Pokémon", Type.PSYCHIC, null, 0.7, 18, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 390, 60, 45, 70, 75, 85, 55, 100, 50, 137, GrowthRate.MEDIUM_SLOW, 25, false), - new PokemonSpecies(Species.GOTHITELLE, 5, false, false, false, "Astral Body Pokémon", Type.PSYCHIC, null, 1.5, 44, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 490, 70, 55, 95, 95, 110, 65, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 25, false), - new PokemonSpecies(Species.SOLOSIS, 5, false, false, false, "Cell Pokémon", Type.PSYCHIC, null, 0.3, 1, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 290, 45, 30, 40, 105, 50, 20, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DUOSION, 5, false, false, false, "Mitosis Pokémon", Type.PSYCHIC, null, 0.6, 8, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 370, 65, 40, 50, 125, 60, 30, 100, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.REUNICLUS, 5, false, false, false, "Multiplying Pokémon", Type.PSYCHIC, null, 1, 20.1, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 490, 110, 65, 75, 125, 85, 30, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DUCKLETT, 5, false, false, false, "Water Bird Pokémon", Type.WATER, Type.FLYING, 0.5, 5.5, Abilities.KEEN_EYE, Abilities.BIG_PECKS, Abilities.HYDRATION, 305, 62, 44, 50, 44, 50, 55, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SWANNA, 5, false, false, false, "White Bird Pokémon", Type.WATER, Type.FLYING, 1.3, 24.2, Abilities.KEEN_EYE, Abilities.BIG_PECKS, Abilities.HYDRATION, 473, 75, 87, 63, 87, 63, 98, 45, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VANILLITE, 5, false, false, false, "Fresh Snow Pokémon", Type.ICE, null, 0.4, 5.7, Abilities.ICE_BODY, Abilities.SNOW_CLOAK, Abilities.WEAK_ARMOR, 305, 36, 50, 50, 65, 60, 44, 255, 50, 61, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.VANILLISH, 5, false, false, false, "Icy Snow Pokémon", Type.ICE, null, 1.1, 41, Abilities.ICE_BODY, Abilities.SNOW_CLOAK, Abilities.WEAK_ARMOR, 395, 51, 65, 65, 80, 75, 59, 120, 50, 138, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.VANILLUXE, 5, false, false, false, "Snowstorm Pokémon", Type.ICE, null, 1.3, 57.5, Abilities.ICE_BODY, Abilities.SNOW_WARNING, Abilities.WEAK_ARMOR, 535, 71, 95, 85, 110, 95, 79, 45, 50, 268, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DEERLING, 5, false, false, false, "Season Pokémon", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Spring Form", "spring", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - new PokemonForm("Summer Form", "summer", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - new PokemonForm("Autumn Form", "autumn", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - new PokemonForm("Winter Form", "winter", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - ), - new PokemonSpecies(Species.SAWSBUCK, 5, false, false, false, "Season Pokémon", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Spring Form", "spring", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - new PokemonForm("Summer Form", "summer", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - new PokemonForm("Autumn Form", "autumn", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - new PokemonForm("Winter Form", "winter", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - ), - new PokemonSpecies(Species.EMOLGA, 5, false, false, false, "Sky Squirrel Pokémon", Type.ELECTRIC, Type.FLYING, 0.4, 5, Abilities.STATIC, Abilities.NONE, Abilities.MOTOR_DRIVE, 428, 55, 75, 60, 75, 60, 103, 200, 50, 150, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KARRABLAST, 5, false, false, false, "Clamping Pokémon", Type.BUG, null, 0.5, 5.9, Abilities.SWARM, Abilities.SHED_SKIN, Abilities.NO_GUARD, 315, 50, 75, 45, 40, 45, 60, 200, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ESCAVALIER, 5, false, false, false, "Cavalry Pokémon", Type.BUG, Type.STEEL, 1, 33, Abilities.SWARM, Abilities.SHELL_ARMOR, Abilities.OVERCOAT, 495, 70, 135, 105, 60, 105, 20, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FOONGUS, 5, false, false, false, "Mushroom Pokémon", Type.GRASS, Type.POISON, 0.2, 1, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.REGENERATOR, 294, 69, 55, 45, 55, 55, 15, 190, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AMOONGUSS, 5, false, false, false, "Mushroom Pokémon", Type.GRASS, Type.POISON, 0.6, 10.5, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.REGENERATOR, 464, 114, 85, 70, 85, 80, 30, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FRILLISH, 5, false, false, false, "Floating Pokémon", Type.WATER, Type.GHOST, 1.2, 33, Abilities.WATER_ABSORB, Abilities.CURSED_BODY, Abilities.DAMP, 335, 55, 40, 50, 65, 85, 40, 190, 50, 67, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.JELLICENT, 5, false, false, false, "Floating Pokémon", Type.WATER, Type.GHOST, 2.2, 135, Abilities.WATER_ABSORB, Abilities.CURSED_BODY, Abilities.DAMP, 480, 100, 60, 70, 85, 105, 60, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(Species.ALOMOMOLA, 5, false, false, false, "Caring Pokémon", Type.WATER, null, 1.2, 31.6, Abilities.HEALER, Abilities.HYDRATION, Abilities.REGENERATOR, 470, 165, 75, 80, 40, 45, 65, 75, 70, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.JOLTIK, 5, false, false, false, "Attaching Pokémon", Type.BUG, Type.ELECTRIC, 0.1, 0.6, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 319, 50, 47, 50, 57, 50, 65, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALVANTULA, 5, false, false, false, "EleSpider Pokémon", Type.BUG, Type.ELECTRIC, 0.8, 14.3, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 472, 70, 77, 60, 97, 60, 108, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", Type.GRASS, Type.STEEL, 0.6, 18.8, Abilities.IRON_BARBS, Abilities.NONE, Abilities.IRON_BARBS, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FERROTHORN, 5, false, false, false, "Thorn Pod Pokémon", Type.GRASS, Type.STEEL, 1, 110, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 489, 74, 94, 131, 54, 116, 20, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.KLINK, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.3, 21, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 300, 40, 55, 70, 45, 60, 30, 130, 50, 60, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.KLANG, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.6, 51, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 440, 60, 80, 95, 70, 85, 50, 60, 50, 154, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.KLINKLANG, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.6, 81, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 520, 60, 100, 115, 70, 85, 90, 30, 50, 260, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(Species.TYNAMO, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 0.2, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 275, 35, 55, 40, 45, 40, 60, 190, 70, 55, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.EELEKTRIK, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 1.2, 22, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 405, 65, 85, 70, 75, 70, 40, 60, 70, 142, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.EELEKTROSS, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 2.1, 80.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 85, 115, 80, 105, 80, 50, 30, 70, 232, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ELGYEM, 5, false, false, false, "Cerebral Pokémon", Type.PSYCHIC, null, 0.5, 9, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 335, 55, 55, 55, 85, 55, 30, 255, 50, 67, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEHEEYEM, 5, false, false, false, "Cerebral Pokémon", Type.PSYCHIC, null, 1, 34.5, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 485, 75, 75, 75, 125, 95, 40, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LITWICK, 5, false, false, false, "Candle Pokémon", Type.GHOST, Type.FIRE, 0.3, 3.1, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 275, 50, 30, 55, 65, 55, 20, 190, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LAMPENT, 5, false, false, false, "Lamp Pokémon", Type.GHOST, Type.FIRE, 0.6, 13, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 370, 60, 40, 60, 95, 60, 55, 90, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CHANDELURE, 5, false, false, false, "Luring Pokémon", Type.GHOST, Type.FIRE, 1, 34.3, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 520, 60, 55, 90, 145, 90, 80, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.AXEW, 5, false, false, false, "Tusk Pokémon", Type.DRAGON, null, 0.6, 18, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 320, 46, 87, 60, 30, 40, 57, 75, 35, 64, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.FRAXURE, 5, false, false, false, "Axe Jaw Pokémon", Type.DRAGON, null, 1, 36, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 410, 66, 117, 70, 40, 50, 67, 60, 35, 144, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HAXORUS, 5, false, false, false, "Axe Jaw Pokémon", Type.DRAGON, null, 1.8, 105.5, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 540, 76, 147, 90, 60, 70, 97, 45, 35, 270, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CUBCHOO, 5, false, false, false, "Chill Pokémon", Type.ICE, null, 0.5, 8.5, Abilities.SNOW_CLOAK, Abilities.SLUSH_RUSH, Abilities.RATTLED, 305, 55, 70, 40, 60, 40, 40, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEARTIC, 5, false, false, false, "Freezing Pokémon", Type.ICE, null, 2.6, 260, Abilities.SNOW_CLOAK, Abilities.SLUSH_RUSH, Abilities.SWIFT_SWIM, 505, 95, 130, 80, 70, 80, 50, 60, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CRYOGONAL, 5, false, false, false, "Crystallizing Pokémon", Type.ICE, null, 1.1, 148, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 80, 50, 50, 95, 135, 105, 25, 50, 180, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.SHELMET, 5, false, false, false, "Snail Pokémon", Type.BUG, null, 0.4, 7.7, Abilities.HYDRATION, Abilities.SHELL_ARMOR, Abilities.OVERCOAT, 305, 50, 40, 85, 40, 65, 25, 200, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ACCELGOR, 5, false, false, false, "Shell Out Pokémon", Type.BUG, null, 0.8, 25.3, Abilities.HYDRATION, Abilities.STICKY_HOLD, Abilities.UNBURDEN, 495, 80, 70, 40, 100, 60, 145, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.STUNFISK, 5, false, false, false, "Trap Pokémon", Type.GROUND, Type.ELECTRIC, 0.7, 11, Abilities.STATIC, Abilities.LIMBER, Abilities.SAND_VEIL, 471, 109, 66, 84, 81, 99, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MIENFOO, 5, false, false, false, "Martial Arts Pokémon", Type.FIGHTING, null, 0.9, 20, Abilities.INNER_FOCUS, Abilities.REGENERATOR, Abilities.RECKLESS, 350, 45, 85, 50, 55, 50, 65, 180, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MIENSHAO, 5, false, false, false, "Martial Arts Pokémon", Type.FIGHTING, null, 1.4, 35.5, Abilities.INNER_FOCUS, Abilities.REGENERATOR, Abilities.RECKLESS, 510, 65, 125, 60, 95, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DRUDDIGON, 5, false, false, false, "Cave Pokémon", Type.DRAGON, null, 1.6, 139, Abilities.ROUGH_SKIN, Abilities.SHEER_FORCE, Abilities.MOLD_BREAKER, 485, 77, 120, 90, 60, 90, 48, 45, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GOLETT, 5, false, false, false, "Automaton Pokémon", Type.GROUND, Type.GHOST, 1, 92, Abilities.IRON_FIST, Abilities.KLUTZ, Abilities.NO_GUARD, 303, 59, 74, 50, 35, 50, 35, 190, 50, 61, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.GOLURK, 5, false, false, false, "Automaton Pokémon", Type.GROUND, Type.GHOST, 2.8, 330, Abilities.IRON_FIST, Abilities.KLUTZ, Abilities.NO_GUARD, 483, 89, 124, 80, 55, 80, 55, 90, 50, 169, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.PAWNIARD, 5, false, false, false, "Sharp Blade Pokémon", Type.DARK, Type.STEEL, 0.5, 10.2, Abilities.DEFIANT, Abilities.INNER_FOCUS, Abilities.PRESSURE, 340, 45, 85, 70, 40, 40, 60, 120, 35, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BISHARP, 5, false, false, false, "Sword Blade Pokémon", Type.DARK, Type.STEEL, 1.6, 70, Abilities.DEFIANT, Abilities.INNER_FOCUS, Abilities.PRESSURE, 490, 65, 125, 100, 60, 70, 70, 45, 35, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BOUFFALANT, 5, false, false, false, "Bash Buffalo Pokémon", Type.NORMAL, null, 1.6, 94.6, Abilities.RECKLESS, Abilities.SAP_SIPPER, Abilities.SOUNDPROOF, 490, 95, 110, 95, 40, 95, 55, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RUFFLET, 5, false, false, false, "Eaglet Pokémon", Type.NORMAL, Type.FLYING, 0.5, 10.5, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.HUSTLE, 350, 70, 83, 50, 37, 50, 60, 190, 50, 70, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.BRAVIARY, 5, false, false, false, "Valiant Pokémon", Type.NORMAL, Type.FLYING, 1.5, 41, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.DEFIANT, 510, 100, 123, 75, 57, 75, 80, 60, 50, 179, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.VULLABY, 5, false, false, false, "Diapered Pokémon", Type.DARK, Type.FLYING, 0.5, 9, Abilities.BIG_PECKS, Abilities.OVERCOAT, Abilities.WEAK_ARMOR, 370, 70, 55, 75, 45, 65, 60, 190, 35, 74, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.MANDIBUZZ, 5, false, false, false, "Bone Vulture Pokémon", Type.DARK, Type.FLYING, 1.2, 39.5, Abilities.BIG_PECKS, Abilities.OVERCOAT, Abilities.WEAK_ARMOR, 510, 110, 65, 105, 55, 95, 80, 60, 35, 179, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.HEATMOR, 5, false, false, false, "Anteater Pokémon", Type.FIRE, null, 1.4, 58, Abilities.GLUTTONY, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, 484, 85, 97, 66, 105, 66, 65, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DURANT, 5, false, false, false, "Iron Ant Pokémon", Type.BUG, Type.STEEL, 0.3, 33, Abilities.SWARM, Abilities.HUSTLE, Abilities.TRUANT, 484, 58, 109, 112, 48, 48, 109, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DEINO, 5, false, false, false, "Irate Pokémon", Type.DARK, Type.DRAGON, 0.8, 17.3, Abilities.HUSTLE, Abilities.NONE, Abilities.NONE, 300, 52, 65, 50, 45, 50, 38, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ZWEILOUS, 5, false, false, false, "Hostile Pokémon", Type.DARK, Type.DRAGON, 1.4, 50, Abilities.HUSTLE, Abilities.NONE, Abilities.NONE, 420, 72, 85, 70, 65, 70, 58, 45, 35, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HYDREIGON, 5, false, false, false, "Brutal Pokémon", Type.DARK, Type.DRAGON, 1.8, 160, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 92, 105, 90, 125, 90, 98, 45, 35, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.LARVESTA, 5, false, false, false, "Torch Pokémon", Type.BUG, Type.FIRE, 1.1, 28.8, Abilities.FLAME_BODY, Abilities.NONE, Abilities.SWARM, 360, 55, 85, 55, 50, 55, 60, 45, 50, 72, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.VOLCARONA, 5, false, false, false, "Sun Pokémon", Type.BUG, Type.FIRE, 1.6, 46, Abilities.FLAME_BODY, Abilities.NONE, Abilities.SWARM, 550, 85, 60, 65, 135, 105, 100, 15, 50, 275, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.COBALION, 5, true, false, false, "Iron Will Pokémon", Type.STEEL, Type.FIGHTING, 2.1, 250, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 90, 129, 90, 72, 108, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TERRAKION, 5, true, false, false, "Cavern Pokémon", Type.ROCK, Type.FIGHTING, 1.9, 260, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 129, 90, 72, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.VIRIZION, 5, true, false, false, "Grassland Pokémon", Type.GRASS, Type.FIGHTING, 2, 200, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 90, 72, 90, 129, 108, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TORNADUS, 5, true, false, false, "Cyclone Pokémon", Type.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), - new PokemonForm("Therian Forme", "therian", Type.FLYING, null, 1.4, 63, Abilities.REGENERATOR, Abilities.NONE, Abilities.REGENERATOR, 580, 79, 100, 80, 110, 90, 121, 3, 90, 290), - ), - new PokemonSpecies(Species.THUNDURUS, 5, true, false, false, "Bolt Strike Pokémon", Type.ELECTRIC, Type.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.ELECTRIC, Type.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), - new PokemonForm("Therian Forme", "therian", Type.ELECTRIC, Type.FLYING, 3, 61, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.VOLT_ABSORB, 580, 79, 105, 70, 145, 80, 101, 3, 90, 290), - ), - new PokemonSpecies(Species.RESHIRAM, 5, false, true, false, "Vast White Pokémon", Type.DRAGON, Type.FIRE, 3.2, 330, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 680, 100, 120, 100, 150, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ZEKROM, 5, false, true, false, "Deep Black Pokémon", Type.DRAGON, Type.ELECTRIC, 2.9, 345, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 680, 100, 150, 120, 120, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.LANDORUS, 5, true, false, false, "Abundance Pokémon", Type.GROUND, Type.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.GROUND, Type.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, false, null, true), - new PokemonForm("Therian Forme", "therian", Type.GROUND, Type.FLYING, 1.3, 68, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 89, 145, 90, 105, 80, 91, 3, 90, 300), - ), - new PokemonSpecies(Species.KYUREM, 5, false, true, false, "Boundary Pokémon", Type.DRAGON, Type.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.DRAGON, Type.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, false, null, true), - new PokemonForm("Black", "black", Type.DRAGON, Type.ICE, 3.3, 325, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 700, 125, 170, 100, 120, 90, 95, 3, 0, 330), - new PokemonForm("White", "white", Type.DRAGON, Type.ICE, 3.6, 325, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 700, 125, 120, 90, 170, 100, 95, 3, 0, 330), - ), - new PokemonSpecies(Species.KELDEO, 5, false, false, true, "Colt Pokémon", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false, true, - new PokemonForm("Ordinary Form", "ordinary", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, false, null, true), - new PokemonForm("Resolute", "resolute", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290), - ), - new PokemonSpecies(Species.MELOETTA, 5, false, false, true, "Melody Pokémon", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 270, GrowthRate.SLOW, null, false, true, - new PokemonForm("Aria Forme", "aria", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 270, false, null, true), - new PokemonForm("Pirouette Forme", "pirouette", Type.NORMAL, Type.FIGHTING, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 128, 90, 77, 77, 128, 3, 100, 270, false, null, true), - ), - new PokemonSpecies(Species.GENESECT, 5, false, false, true, "Paleozoic Pokémon", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, false, null, true), - new PokemonForm("Shock Drive", "shock", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - new PokemonForm("Burn Drive", "burn", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - new PokemonForm("Chill Drive", "chill", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - new PokemonForm("Douse Drive", "douse", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - ), - new PokemonSpecies(Species.CHESPIN, 6, false, false, false, "Spiny Nut Pokémon", Type.GRASS, null, 0.4, 9, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 313, 56, 61, 65, 48, 45, 38, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUILLADIN, 6, false, false, false, "Spiny Armor Pokémon", Type.GRASS, null, 0.7, 29, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 405, 61, 78, 95, 56, 58, 57, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CHESNAUGHT, 6, false, false, false, "Spiny Armor Pokémon", Type.GRASS, Type.FIGHTING, 1.6, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 530, 88, 107, 122, 74, 75, 64, 45, 70, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FENNEKIN, 6, false, false, false, "Fox Pokémon", Type.FIRE, null, 0.4, 9.4, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 307, 40, 45, 40, 62, 60, 60, 45, 70, 61, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.BRAIXEN, 6, false, false, false, "Fox Pokémon", Type.FIRE, null, 1, 14.5, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 409, 59, 59, 58, 90, 70, 73, 45, 70, 143, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DELPHOX, 6, false, false, false, "Fox Pokémon", Type.FIRE, Type.PSYCHIC, 1.5, 39, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 534, 75, 69, 72, 114, 100, 104, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FROAKIE, 6, false, false, false, "Bubble Frog Pokémon", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true), - ), - new PokemonSpecies(Species.FROGADIER, 6, false, false, false, "Bubble Frog Pokémon", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, "", true), - ), - new PokemonSpecies(Species.GRENINJA, 6, false, false, false, "Ninja Pokémon", Type.WATER, Type.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 239, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", Type.WATER, Type.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 239, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", Type.WATER, Type.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 530, 72, 95, 67, 103, 71, 122, 45, 70, 239, false, "", true), - new PokemonForm("Ash", "ash", Type.WATER, Type.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 640, 72, 145, 67, 153, 71, 132, 45, 70, 239), - ), - new PokemonSpecies(Species.BUNNELBY, 6, false, false, false, "Digging Pokémon", Type.NORMAL, null, 0.4, 5, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 237, 38, 36, 38, 32, 36, 57, 255, 50, 47, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DIGGERSBY, 6, false, false, false, "Digging Pokémon", Type.NORMAL, Type.GROUND, 1, 42.4, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 423, 85, 56, 77, 50, 77, 78, 127, 50, 148, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FLETCHLING, 6, false, false, false, "Tiny Robin Pokémon", Type.NORMAL, Type.FLYING, 0.3, 1.7, Abilities.BIG_PECKS, Abilities.NONE, Abilities.GALE_WINGS, 278, 45, 50, 43, 40, 38, 62, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.FLETCHINDER, 6, false, false, false, "Ember Pokémon", Type.FIRE, Type.FLYING, 0.7, 16, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 382, 62, 73, 55, 56, 52, 84, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TALONFLAME, 6, false, false, false, "Scorching Pokémon", Type.FIRE, Type.FLYING, 1.2, 24.5, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 499, 78, 81, 71, 74, 69, 126, 45, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SCATTERBUG, 6, false, false, false, "Scatterdust Pokémon", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Polar Pattern", "polar", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Tundra Pattern", "tundra", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Continental Pattern", "continental", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Garden Pattern", "garden", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Elegant Pattern", "elegant", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Modern Pattern", "modern", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Marine Pattern", "marine", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("River Pattern", "river", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Savanna Pattern", "savanna", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Sun Pattern", "sun", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Ocean Pattern", "ocean", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Jungle Pattern", "jungle", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Fancy Pattern", "fancy", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - ), - new PokemonSpecies(Species.SPEWPA, 6, false, false, false, "Scatterdust Pokémon", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.SHED_SKIN, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Polar Pattern", "polar", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Tundra Pattern", "tundra", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Continental Pattern", "continental", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Garden Pattern", "garden", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Elegant Pattern", "elegant", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Modern Pattern", "modern", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Marine Pattern", "marine", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("River Pattern", "river", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Savanna Pattern", "savanna", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Sun Pattern", "sun", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Ocean Pattern", "ocean", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Jungle Pattern", "jungle", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Fancy Pattern", "fancy", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - ), - new PokemonSpecies(Species.VIVILLON, 6, false, false, false, "Scale Pokémon", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Polar Pattern", "polar", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Tundra Pattern", "tundra", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Continental Pattern", "continental", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Garden Pattern", "garden", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Elegant Pattern", "elegant", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Modern Pattern", "modern", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Marine Pattern", "marine", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("River Pattern", "river", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Savanna Pattern", "savanna", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Sun Pattern", "sun", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Ocean Pattern", "ocean", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Jungle Pattern", "jungle", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Fancy Pattern", "fancy", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - ), - new PokemonSpecies(Species.LITLEO, 6, false, false, false, "Lion Cub Pokémon", Type.FIRE, Type.NORMAL, 0.6, 13.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 369, 62, 50, 58, 73, 54, 72, 220, 70, 74, GrowthRate.MEDIUM_SLOW, 12.5, false), - new PokemonSpecies(Species.PYROAR, 6, false, false, false, "Royal Pokémon", Type.FIRE, Type.NORMAL, 1.5, 81.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 507, 86, 68, 72, 109, 66, 106, 65, 70, 177, GrowthRate.MEDIUM_SLOW, 12.5, true), - new PokemonSpecies(Species.FLABEBE, 6, false, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("White Flower", "white", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - ), - new PokemonSpecies(Species.FLOETTE, 6, false, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("White Flower", "white", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - ), - new PokemonSpecies(Species.FLORGES, 6, false, false, false, "Garden Pokémon", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), - new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), - new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), - new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), - new PokemonForm("White Flower", "white", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), - ), - new PokemonSpecies(Species.SKIDDO, 6, false, false, false, "Mount Pokémon", Type.GRASS, null, 0.9, 31, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 350, 66, 65, 48, 62, 57, 52, 200, 70, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GOGOAT, 6, false, false, false, "Mount Pokémon", Type.GRASS, null, 1.7, 91, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 531, 123, 100, 62, 97, 81, 68, 45, 70, 186, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PANCHAM, 6, false, false, false, "Playful Pokémon", Type.FIGHTING, null, 0.6, 8, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 348, 67, 82, 62, 46, 48, 43, 220, 50, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PANGORO, 6, false, false, false, "Daunting Pokémon", Type.FIGHTING, Type.DARK, 2.1, 136, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 495, 95, 124, 78, 69, 71, 58, 65, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FURFROU, 6, false, false, false, "Poodle Pokémon", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Natural Form", "", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Heart Trim", "heart", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Star Trim", "star", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Diamond Trim", "diamond", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Debutante Trim", "debutante", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Matron Trim", "matron", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Dandy Trim", "dandy", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("La Reine Trim", "la-reine", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Kabuki Trim", "kabuki", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Pharaoh Trim", "pharaoh", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - ), - new PokemonSpecies(Species.ESPURR, 6, false, false, false, "Restraint Pokémon", Type.PSYCHIC, null, 0.3, 3.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.OWN_TEMPO, 355, 62, 48, 54, 63, 60, 68, 190, 50, 71, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MEOWSTIC, 6, false, false, false, "Constraint Pokémon", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, "", true), - new PokemonForm("Female", "female", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.COMPETITIVE, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, null, true), - ), - new PokemonSpecies(Species.HONEDGE, 6, false, false, false, "Sword Pokémon", Type.STEEL, Type.GHOST, 0.8, 2, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 325, 45, 80, 100, 35, 37, 28, 180, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DOUBLADE, 6, false, false, false, "Sword Pokémon", Type.STEEL, Type.GHOST, 0.8, 4.5, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 448, 59, 110, 150, 45, 49, 35, 90, 50, 157, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AEGISLASH, 6, false, false, false, "Royal Sword Pokémon", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Shield Forme", "shield", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, false, "", true), - new PokemonForm("Blade Forme", "blade", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 140, 50, 140, 50, 60, 45, 50, 250), - ), - new PokemonSpecies(Species.SPRITZEE, 6, false, false, false, "Perfume Pokémon", Type.FAIRY, null, 0.2, 0.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 341, 78, 52, 60, 63, 65, 23, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AROMATISSE, 6, false, false, false, "Fragrance Pokémon", Type.FAIRY, null, 0.8, 15.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 462, 101, 72, 72, 99, 89, 29, 140, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SWIRLIX, 6, false, false, false, "Cotton Candy Pokémon", Type.FAIRY, null, 0.4, 3.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.UNBURDEN, 341, 62, 48, 66, 59, 57, 49, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SLURPUFF, 6, false, false, false, "Meringue Pokémon", Type.FAIRY, null, 0.8, 5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.UNBURDEN, 480, 82, 80, 86, 85, 75, 72, 140, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.INKAY, 6, false, false, false, "Revolving Pokémon", Type.DARK, Type.PSYCHIC, 0.4, 3.5, Abilities.CONTRARY, Abilities.SUCTION_CUPS, Abilities.INFILTRATOR, 288, 53, 54, 53, 37, 46, 45, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MALAMAR, 6, false, false, false, "Overturning Pokémon", Type.DARK, Type.PSYCHIC, 1.5, 47, Abilities.CONTRARY, Abilities.SUCTION_CUPS, Abilities.INFILTRATOR, 482, 86, 92, 88, 68, 75, 73, 80, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BINACLE, 6, false, false, false, "Two-Handed Pokémon", Type.ROCK, Type.WATER, 0.5, 31, Abilities.TOUGH_CLAWS, Abilities.SNIPER, Abilities.PICKPOCKET, 306, 42, 52, 67, 39, 56, 50, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BARBARACLE, 6, false, false, false, "Collective Pokémon", Type.ROCK, Type.WATER, 1.3, 96, Abilities.TOUGH_CLAWS, Abilities.SNIPER, Abilities.PICKPOCKET, 500, 72, 105, 115, 54, 86, 68, 45, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SKRELP, 6, false, false, false, "Mock Kelp Pokémon", Type.POISON, Type.WATER, 0.5, 7.3, Abilities.POISON_POINT, Abilities.POISON_TOUCH, Abilities.ADAPTABILITY, 320, 50, 60, 60, 60, 60, 30, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DRAGALGE, 6, false, false, false, "Mock Kelp Pokémon", Type.POISON, Type.DRAGON, 1.8, 81.5, Abilities.POISON_POINT, Abilities.POISON_TOUCH, Abilities.ADAPTABILITY, 494, 65, 75, 90, 97, 123, 44, 55, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CLAUNCHER, 6, false, false, false, "Water Gun Pokémon", Type.WATER, null, 0.5, 8.3, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.NONE, 330, 50, 53, 62, 58, 63, 44, 225, 50, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CLAWITZER, 6, false, false, false, "Howitzer Pokémon", Type.WATER, null, 1.3, 35.3, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.NONE, 500, 71, 73, 88, 120, 89, 59, 55, 50, 100, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HELIOPTILE, 6, false, false, false, "Generator Pokémon", Type.ELECTRIC, Type.NORMAL, 0.5, 6, Abilities.DRY_SKIN, Abilities.SAND_VEIL, Abilities.SOLAR_POWER, 289, 44, 38, 33, 61, 43, 70, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HELIOLISK, 6, false, false, false, "Generator Pokémon", Type.ELECTRIC, Type.NORMAL, 1, 21, Abilities.DRY_SKIN, Abilities.SAND_VEIL, Abilities.SOLAR_POWER, 481, 62, 55, 52, 109, 94, 109, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TYRUNT, 6, false, false, false, "Royal Heir Pokémon", Type.ROCK, Type.DRAGON, 0.8, 26, Abilities.STRONG_JAW, Abilities.NONE, Abilities.STURDY, 362, 58, 89, 77, 45, 45, 48, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.TYRANTRUM, 6, false, false, false, "Despot Pokémon", Type.ROCK, Type.DRAGON, 2.5, 270, Abilities.STRONG_JAW, Abilities.NONE, Abilities.ROCK_HEAD, 521, 82, 121, 119, 69, 59, 71, 45, 50, 182, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.AMAURA, 6, false, false, false, "Tundra Pokémon", Type.ROCK, Type.ICE, 1.3, 25.2, Abilities.REFRIGERATE, Abilities.NONE, Abilities.SNOW_WARNING, 362, 77, 59, 50, 67, 63, 46, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.AURORUS, 6, false, false, false, "Tundra Pokémon", Type.ROCK, Type.ICE, 2.7, 225, Abilities.REFRIGERATE, Abilities.NONE, Abilities.SNOW_WARNING, 521, 123, 77, 72, 99, 92, 58, 45, 50, 104, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SYLVEON, 6, false, false, false, "Intertwining Pokémon", Type.FAIRY, null, 1, 23.5, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.PIXILATE, 525, 95, 65, 65, 110, 130, 60, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.HAWLUCHA, 6, false, false, false, "Wrestling Pokémon", Type.FIGHTING, Type.FLYING, 0.8, 21.5, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.MOLD_BREAKER, 500, 78, 92, 75, 74, 63, 118, 100, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DEDENNE, 6, false, false, false, "Antenna Pokémon", Type.ELECTRIC, Type.FAIRY, 0.2, 2.2, Abilities.CHEEK_POUCH, Abilities.PICKUP, Abilities.PLUS, 431, 67, 58, 57, 81, 67, 101, 180, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CARBINK, 6, false, false, false, "Jewel Pokémon", Type.ROCK, Type.FAIRY, 0.3, 5.7, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.STURDY, 500, 50, 50, 150, 50, 150, 50, 60, 50, 100, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GOOMY, 6, false, false, false, "Soft Tissue Pokémon", Type.DRAGON, null, 0.3, 2.8, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 300, 45, 50, 35, 55, 75, 40, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SLIGGOO, 6, false, false, false, "Soft Tissue Pokémon", Type.DRAGON, null, 0.8, 17.5, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 452, 68, 75, 53, 83, 113, 60, 45, 35, 158, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GOODRA, 6, false, false, false, "Dragon Pokémon", Type.DRAGON, null, 2, 150.5, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 600, 90, 100, 70, 110, 150, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.KLEFKI, 6, false, false, false, "Key Ring Pokémon", Type.STEEL, Type.FAIRY, 0.2, 3, Abilities.PRANKSTER, Abilities.NONE, Abilities.MAGICIAN, 470, 57, 80, 91, 80, 87, 75, 75, 50, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.PHANTUMP, 6, false, false, false, "Stump Pokémon", Type.GHOST, Type.GRASS, 0.4, 7, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 309, 43, 70, 48, 50, 60, 38, 120, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TREVENANT, 6, false, false, false, "Elder Tree Pokémon", Type.GHOST, Type.GRASS, 1.5, 71, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 474, 85, 110, 76, 65, 82, 56, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PUMPKABOO, 6, false, false, false, "Pumpkin Pokémon", Type.GHOST, Type.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Average Size", "", Type.GHOST, Type.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, false, null, true), - new PokemonForm("Small Size", "small", Type.GHOST, Type.GRASS, 0.3, 3.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 44, 66, 70, 44, 55, 56, 120, 50, 67, false, "", true), - new PokemonForm("Large Size", "large", Type.GHOST, Type.GRASS, 0.5, 7.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 54, 66, 70, 44, 55, 46, 120, 50, 67, false, "", true), - new PokemonForm("Super Size", "super", Type.GHOST, Type.GRASS, 0.8, 15, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 59, 66, 70, 44, 55, 41, 120, 50, 67, false, "", true), - ), - new PokemonSpecies(Species.GOURGEIST, 6, false, false, false, "Pumpkin Pokémon", Type.GHOST, Type.GRASS, 0.9, 12.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Average Size", "", Type.GHOST, Type.GRASS, 0.9, 12.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, false, null, true), - new PokemonForm("Small Size", "small", Type.GHOST, Type.GRASS, 0.7, 9.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 55, 85, 122, 58, 75, 99, 60, 50, 173, false, "", true), - new PokemonForm("Large Size", "large", Type.GHOST, Type.GRASS, 1.1, 14, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 75, 95, 122, 58, 75, 69, 60, 50, 173, false, "", true), - new PokemonForm("Super Size", "super", Type.GHOST, Type.GRASS, 1.7, 39, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 85, 100, 122, 58, 75, 54, 60, 50, 173, false, "", true), - ), - new PokemonSpecies(Species.BERGMITE, 6, false, false, false, "Ice Chunk Pokémon", Type.ICE, null, 1, 99.5, Abilities.OWN_TEMPO, Abilities.ICE_BODY, Abilities.STURDY, 304, 55, 69, 85, 32, 35, 28, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.AVALUGG, 6, false, false, false, "Iceberg Pokémon", Type.ICE, null, 2, 505, Abilities.OWN_TEMPO, Abilities.ICE_BODY, Abilities.STURDY, 514, 95, 117, 184, 44, 46, 28, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.NOIBAT, 6, false, false, false, "Sound Wave Pokémon", Type.FLYING, Type.DRAGON, 0.5, 8, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 245, 40, 30, 35, 45, 40, 55, 190, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.NOIVERN, 6, false, false, false, "Sound Wave Pokémon", Type.FLYING, Type.DRAGON, 1.5, 85, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 535, 85, 70, 80, 97, 80, 123, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.XERNEAS, 6, false, true, false, "Life Pokémon", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Neutral Mode", "neutral", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, false, null, true), - new PokemonForm("Active Mode", "active", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340) - ), - new PokemonSpecies(Species.YVELTAL, 6, false, true, false, "Destruction Pokémon", Type.DARK, Type.FLYING, 5.8, 203, Abilities.DARK_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ZYGARDE, 6, false, true, false, "Order Pokémon", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("50% Forme", "50", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), - new PokemonForm("10% Forme", "10", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300, false, null, true), - new PokemonForm("50% Forme Power Construct", "50-pc", Type.DRAGON, Type.GROUND, 5, 305, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), - new PokemonForm("10% Forme Power Construct", "10-pc", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300, false, "10", true), - new PokemonForm("Complete Forme (50% PC)", "complete", Type.DRAGON, Type.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 300), - new PokemonForm("Complete Forme (10% PC)", "10-complete", Type.DRAGON, Type.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 300, false, "complete"), - ), - new PokemonSpecies(Species.DIANCIE, 6, false, false, true, "Jewel Pokémon", Type.ROCK, Type.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.ROCK, Type.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ROCK, Type.FAIRY, 1.1, 27.8, Abilities.MAGIC_BOUNCE, Abilities.NONE, Abilities.NONE, 700, 50, 160, 110, 160, 110, 110, 3, 50, 300), - ), - new PokemonSpecies(Species.HOOPA, 6, false, false, true, "Mischief Pokémon", Type.PSYCHIC, Type.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 270, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hoopa Confined", "", Type.PSYCHIC, Type.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 270, false, null, true), - new PokemonForm("Hoopa Unbound", "unbound", Type.PSYCHIC, Type.DARK, 6.5, 490, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 680, 80, 160, 60, 170, 130, 80, 3, 100, 270), - ), - new PokemonSpecies(Species.VOLCANION, 6, false, false, true, "Steam Pokémon", Type.FIRE, Type.WATER, 1.7, 195, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 600, 80, 110, 120, 130, 90, 70, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ROWLET, 7, false, false, false, "Grass Quill Pokémon", Type.GRASS, Type.FLYING, 0.3, 1.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 320, 68, 55, 55, 50, 50, 42, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DARTRIX, 7, false, false, false, "Blade Quill Pokémon", Type.GRASS, Type.FLYING, 0.7, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 420, 78, 75, 75, 70, 70, 52, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DECIDUEYE, 7, false, false, false, "Arrow Quill Pokémon", Type.GRASS, Type.GHOST, 1.6, 36.6, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 530, 78, 107, 75, 100, 100, 70, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.LITTEN, 7, false, false, false, "Fire Cat Pokémon", Type.FIRE, null, 0.4, 4.3, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 320, 45, 65, 40, 60, 40, 70, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TORRACAT, 7, false, false, false, "Fire Cat Pokémon", Type.FIRE, null, 0.7, 25, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 420, 65, 85, 50, 80, 50, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.INCINEROAR, 7, false, false, false, "Heel Pokémon", Type.FIRE, Type.DARK, 1.8, 83, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 530, 95, 115, 90, 80, 90, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.POPPLIO, 7, false, false, false, "Sea Lion Pokémon", Type.WATER, null, 0.4, 7.5, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 320, 50, 54, 54, 66, 56, 40, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.BRIONNE, 7, false, false, false, "Pop Star Pokémon", Type.WATER, null, 0.6, 17.5, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 420, 60, 69, 69, 91, 81, 50, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PRIMARINA, 7, false, false, false, "Soloist Pokémon", Type.WATER, Type.FAIRY, 1.8, 44, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 530, 80, 74, 74, 126, 116, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PIKIPEK, 7, false, false, false, "Woodpecker Pokémon", Type.NORMAL, Type.FLYING, 0.3, 1.2, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 265, 35, 75, 30, 30, 30, 65, 255, 70, 53, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TRUMBEAK, 7, false, false, false, "Bugle Beak Pokémon", Type.NORMAL, Type.FLYING, 0.6, 14.8, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 355, 55, 85, 50, 40, 50, 75, 120, 70, 124, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TOUCANNON, 7, false, false, false, "Cannon Pokémon", Type.NORMAL, Type.FLYING, 1.1, 26, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.SHEER_FORCE, 485, 80, 120, 75, 75, 75, 60, 45, 70, 218, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.YUNGOOS, 7, false, false, false, "Loitering Pokémon", Type.NORMAL, null, 0.4, 6, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 253, 48, 70, 30, 30, 30, 45, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GUMSHOOS, 7, false, false, false, "Stakeout Pokémon", Type.NORMAL, null, 0.7, 14.2, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 418, 88, 110, 60, 55, 60, 45, 127, 70, 146, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GRUBBIN, 7, false, false, false, "Larva Pokémon", Type.BUG, null, 0.4, 4.4, Abilities.SWARM, Abilities.NONE, Abilities.NONE, 300, 47, 62, 45, 55, 45, 46, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CHARJABUG, 7, false, false, false, "Battery Pokémon", Type.BUG, Type.ELECTRIC, 0.5, 10.5, Abilities.BATTERY, Abilities.NONE, Abilities.NONE, 400, 57, 82, 95, 55, 75, 36, 120, 50, 140, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.VIKAVOLT, 7, false, false, false, "Stag Beetle Pokémon", Type.BUG, Type.ELECTRIC, 1.5, 45, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 500, 77, 70, 90, 145, 75, 43, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CRABRAWLER, 7, false, false, false, "Boxing Pokémon", Type.FIGHTING, null, 0.6, 7, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 338, 47, 82, 57, 42, 47, 63, 225, 70, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CRABOMINABLE, 7, false, false, false, "Woolly Crab Pokémon", Type.FIGHTING, Type.ICE, 1.7, 180, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 478, 97, 132, 77, 62, 67, 43, 60, 70, 167, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ORICORIO, 7, false, false, false, "Dancing Pokémon", Type.FIRE, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, GrowthRate.MEDIUM_FAST, 25, false, false, - new PokemonForm("Baile Style", "baile", Type.FIRE, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, "", true), - new PokemonForm("Pom-Pom Style", "pompom", Type.ELECTRIC, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), - new PokemonForm("Pau Style", "pau", Type.PSYCHIC, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), - new PokemonForm("Sensu Style", "sensu", Type.GHOST, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), - ), - new PokemonSpecies(Species.CUTIEFLY, 7, false, false, false, "Bee Fly Pokémon", Type.BUG, Type.FAIRY, 0.1, 0.2, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 304, 40, 45, 40, 55, 40, 84, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RIBOMBEE, 7, false, false, false, "Bee Fly Pokémon", Type.BUG, Type.FAIRY, 0.2, 0.5, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 464, 60, 55, 60, 95, 70, 124, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ROCKRUFF, 7, false, false, false, "Puppy Pokémon", Type.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, null, true), - new PokemonForm("Own Tempo", "own-tempo", Type.ROCK, null, 0.5, 9.2, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.OWN_TEMPO, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, "", true), - ), - new PokemonSpecies(Species.LYCANROC, 7, false, false, false, "Wolf Pokémon", Type.ROCK, null, 0.8, 25, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Midday Form", "midday", Type.ROCK, null, 0.8, 25, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, false, "", true), - new PokemonForm("Midnight Form", "midnight", Type.ROCK, null, 1.1, 25, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.NO_GUARD, 487, 85, 115, 75, 55, 75, 82, 90, 50, 170, false, null, true), - new PokemonForm("Dusk Form", "dusk", Type.ROCK, null, 0.8, 25, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 487, 75, 117, 65, 55, 65, 110, 90, 50, 170, false, null, true), - ), - new PokemonSpecies(Species.WISHIWASHI, 7, false, false, false, "Small Fry Pokémon", Type.WATER, null, 0.2, 0.3, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, GrowthRate.FAST, 50, false, false, - new PokemonForm("Solo Form", "", Type.WATER, null, 0.2, 0.3, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, false, null, true), - new PokemonForm("School", "school", Type.WATER, null, 8.2, 78.6, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 620, 45, 140, 130, 140, 135, 30, 60, 50, 61), - ), - new PokemonSpecies(Species.MAREANIE, 7, false, false, false, "Brutal Star Pokémon", Type.POISON, Type.WATER, 0.4, 8, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 305, 50, 53, 62, 43, 52, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TOXAPEX, 7, false, false, false, "Brutal Star Pokémon", Type.POISON, Type.WATER, 0.7, 14.5, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 495, 50, 63, 152, 53, 142, 35, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MUDBRAY, 7, false, false, false, "Donkey Pokémon", Type.GROUND, null, 1, 110, Abilities.OWN_TEMPO, Abilities.STAMINA, Abilities.INNER_FOCUS, 385, 70, 100, 70, 45, 55, 45, 190, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MUDSDALE, 7, false, false, false, "Draft Horse Pokémon", Type.GROUND, null, 2.5, 920, Abilities.OWN_TEMPO, Abilities.STAMINA, Abilities.INNER_FOCUS, 500, 100, 125, 100, 55, 85, 35, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DEWPIDER, 7, false, false, false, "Water Bubble Pokémon", Type.WATER, Type.BUG, 0.3, 4, Abilities.WATER_BUBBLE, Abilities.NONE, Abilities.WATER_ABSORB, 269, 38, 40, 52, 40, 72, 27, 200, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ARAQUANID, 7, false, false, false, "Water Bubble Pokémon", Type.WATER, Type.BUG, 1.8, 82, Abilities.WATER_BUBBLE, Abilities.NONE, Abilities.WATER_ABSORB, 454, 68, 70, 92, 50, 132, 42, 100, 50, 159, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FOMANTIS, 7, false, false, false, "Sickle Grass Pokémon", Type.GRASS, null, 0.3, 1.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CONTRARY, 250, 40, 55, 35, 50, 35, 35, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LURANTIS, 7, false, false, false, "Bloom Sickle Pokémon", Type.GRASS, null, 0.9, 18.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CONTRARY, 480, 70, 105, 90, 80, 90, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MORELULL, 7, false, false, false, "Illuminating Pokémon", Type.GRASS, Type.FAIRY, 0.2, 1.5, Abilities.ILLUMINATE, Abilities.EFFECT_SPORE, Abilities.RAIN_DISH, 285, 40, 35, 55, 65, 75, 15, 190, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SHIINOTIC, 7, false, false, false, "Illuminating Pokémon", Type.GRASS, Type.FAIRY, 1, 11.5, Abilities.ILLUMINATE, Abilities.EFFECT_SPORE, Abilities.RAIN_DISH, 405, 60, 45, 80, 90, 100, 30, 75, 50, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SALANDIT, 7, false, false, false, "Toxic Lizard Pokémon", Type.POISON, Type.FIRE, 0.6, 4.8, Abilities.CORROSION, Abilities.NONE, Abilities.OBLIVIOUS, 320, 48, 44, 40, 71, 40, 77, 120, 50, 64, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.SALAZZLE, 7, false, false, false, "Toxic Lizard Pokémon", Type.POISON, Type.FIRE, 1.2, 22.2, Abilities.CORROSION, Abilities.NONE, Abilities.OBLIVIOUS, 480, 68, 64, 60, 111, 60, 117, 45, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.STUFFUL, 7, false, false, false, "Flailing Pokémon", Type.NORMAL, Type.FIGHTING, 0.5, 6.8, Abilities.FLUFFY, Abilities.KLUTZ, Abilities.CUTE_CHARM, 340, 70, 75, 50, 45, 50, 50, 140, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEWEAR, 7, false, false, false, "Strong Arm Pokémon", Type.NORMAL, Type.FIGHTING, 2.1, 135, Abilities.FLUFFY, Abilities.KLUTZ, Abilities.UNNERVE, 500, 120, 125, 80, 55, 60, 60, 70, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BOUNSWEET, 7, false, false, false, "Fruit Pokémon", Type.GRASS, null, 0.3, 3.2, Abilities.LEAF_GUARD, Abilities.OBLIVIOUS, Abilities.SWEET_VEIL, 210, 42, 30, 38, 30, 38, 32, 235, 50, 42, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.STEENEE, 7, false, false, false, "Fruit Pokémon", Type.GRASS, null, 0.7, 8.2, Abilities.LEAF_GUARD, Abilities.OBLIVIOUS, Abilities.SWEET_VEIL, 290, 52, 40, 48, 40, 48, 62, 120, 50, 102, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.TSAREENA, 7, false, false, false, "Fruit Pokémon", Type.GRASS, null, 1.2, 21.4, Abilities.LEAF_GUARD, Abilities.QUEENLY_MAJESTY, Abilities.SWEET_VEIL, 510, 72, 120, 98, 50, 98, 72, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.COMFEY, 7, false, false, false, "Posy Picker Pokémon", Type.FAIRY, null, 0.1, 0.3, Abilities.FLOWER_VEIL, Abilities.TRIAGE, Abilities.NATURAL_CURE, 485, 51, 52, 90, 82, 110, 100, 60, 50, 170, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.ORANGURU, 7, false, false, false, "Sage Pokémon", Type.NORMAL, Type.PSYCHIC, 1.5, 76, Abilities.INNER_FOCUS, Abilities.TELEPATHY, Abilities.SYMBIOSIS, 490, 90, 60, 80, 90, 110, 60, 45, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PASSIMIAN, 7, false, false, false, "Teamwork Pokémon", Type.FIGHTING, null, 2, 82.8, Abilities.RECEIVER, Abilities.NONE, Abilities.DEFIANT, 490, 100, 120, 90, 40, 60, 80, 45, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.WIMPOD, 7, false, false, false, "Turn Tail Pokémon", Type.BUG, Type.WATER, 0.5, 12, Abilities.WIMP_OUT, Abilities.NONE, Abilities.RUN_AWAY, 230, 25, 35, 40, 20, 30, 80, 90, 50, 46, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden - new PokemonSpecies(Species.GOLISOPOD, 7, false, false, false, "Hard Scale Pokémon", Type.BUG, Type.WATER, 2, 108, Abilities.EMERGENCY_EXIT, Abilities.NONE, Abilities.ANTICIPATION, 530, 75, 125, 140, 60, 90, 40, 45, 50, 186, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden - new PokemonSpecies(Species.SANDYGAST, 7, false, false, false, "Sand Heap Pokémon", Type.GHOST, Type.GROUND, 0.5, 70, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 320, 55, 55, 80, 70, 45, 15, 140, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PALOSSAND, 7, false, false, false, "Sand Castle Pokémon", Type.GHOST, Type.GROUND, 1.3, 250, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 480, 85, 75, 110, 100, 75, 35, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PYUKUMUKU, 7, false, false, false, "Sea Cucumber Pokémon", Type.WATER, null, 0.3, 1.2, Abilities.INNARDS_OUT, Abilities.NONE, Abilities.UNAWARE, 410, 55, 60, 130, 30, 130, 5, 60, 50, 144, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.TYPE_NULL, 7, true, false, false, "Synthetic Pokémon", Type.NORMAL, null, 1.9, 120.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.NONE, 534, 95, 95, 95, 95, 95, 59, 3, 0, 107, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SILVALLY, 7, true, false, false, "Synthetic Pokémon", Type.NORMAL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, GrowthRate.SLOW, null, false, false, - new PokemonForm("Type: Normal", "normal", Type.NORMAL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, false, "", true), - new PokemonForm("Type: Fighting", "fighting", Type.FIGHTING, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Flying", "flying", Type.FLYING, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Poison", "poison", Type.POISON, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Ground", "ground", Type.GROUND, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Rock", "rock", Type.ROCK, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Bug", "bug", Type.BUG, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Ghost", "ghost", Type.GHOST, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Steel", "steel", Type.STEEL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Fire", "fire", Type.FIRE, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Water", "water", Type.WATER, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Grass", "grass", Type.GRASS, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Electric", "electric", Type.ELECTRIC, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Psychic", "psychic", Type.PSYCHIC, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Ice", "ice", Type.ICE, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Dragon", "dragon", Type.DRAGON, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Dark", "dark", Type.DARK, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Fairy", "fairy", Type.FAIRY, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - ), - new PokemonSpecies(Species.MINIOR, 7, false, false, false, "Meteor Pokémon", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, GrowthRate.MEDIUM_SLOW, null, false, false, - new PokemonForm("Red Meteor Form", "red-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Orange Meteor Form", "orange-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Yellow Meteor Form", "yellow-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Green Meteor Form", "green-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Blue Meteor Form", "blue-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Indigo Meteor Form", "indigo-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Violet Meteor Form", "violet-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), - new PokemonForm("Red Core Form", "red", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), - new PokemonForm("Orange Core Form", "orange", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), - new PokemonForm("Yellow Core Form", "yellow", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), - new PokemonForm("Green Core Form", "green", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), - new PokemonForm("Blue Core Form", "blue", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), - new PokemonForm("Indigo Core Form", "indigo", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), - new PokemonForm("Violet Core Form", "violet", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), - ), - new PokemonSpecies(Species.KOMALA, 7, false, false, false, "Drowsing Pokémon", Type.NORMAL, null, 0.4, 19.9, Abilities.COMATOSE, Abilities.NONE, Abilities.NONE, 480, 65, 115, 65, 75, 95, 65, 45, 70, 168, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TURTONATOR, 7, false, false, false, "Blast Turtle Pokémon", Type.FIRE, Type.DRAGON, 2, 212, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.NONE, 485, 60, 78, 135, 91, 85, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TOGEDEMARU, 7, false, false, false, "Roly-Poly Pokémon", Type.ELECTRIC, Type.STEEL, 0.3, 3.3, Abilities.IRON_BARBS, Abilities.LIGHTNING_ROD, Abilities.STURDY, 435, 65, 98, 63, 40, 73, 96, 180, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MIMIKYU, 7, false, false, false, "Disguise Pokémon", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Disguised Form", "disguised", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, null, true), - new PokemonForm("Busted Form", "busted", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167), - ), - new PokemonSpecies(Species.BRUXISH, 7, false, false, false, "Gnash Teeth Pokémon", Type.WATER, Type.PSYCHIC, 0.9, 19, Abilities.DAZZLING, Abilities.STRONG_JAW, Abilities.WONDER_SKIN, 475, 68, 105, 70, 70, 70, 92, 80, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DRAMPA, 7, false, false, false, "Placid Pokémon", Type.NORMAL, Type.DRAGON, 3, 185, Abilities.BERSERK, Abilities.SAP_SIPPER, Abilities.CLOUD_NINE, 485, 78, 60, 85, 135, 91, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DHELMISE, 7, false, false, false, "Sea Creeper Pokémon", Type.GHOST, Type.GRASS, 3.9, 210, Abilities.STEELWORKER, Abilities.NONE, Abilities.NONE, 517, 70, 131, 100, 86, 90, 40, 25, 50, 181, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.JANGMO_O, 7, false, false, false, "Scaly Pokémon", Type.DRAGON, null, 0.6, 29.7, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 300, 45, 55, 65, 45, 45, 45, 45, 50, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HAKAMO_O, 7, false, false, false, "Scaly Pokémon", Type.DRAGON, Type.FIGHTING, 1.2, 47, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 420, 55, 75, 90, 65, 70, 65, 45, 50, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.KOMMO_O, 7, false, false, false, "Scaly Pokémon", Type.DRAGON, Type.FIGHTING, 1.6, 78.2, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 600, 75, 110, 125, 100, 105, 85, 45, 50, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TAPU_KOKO, 7, true, false, false, "Land Spirit Pokémon", Type.ELECTRIC, Type.FAIRY, 1.8, 20.5, Abilities.ELECTRIC_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 115, 85, 95, 75, 130, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TAPU_LELE, 7, true, false, false, "Land Spirit Pokémon", Type.PSYCHIC, Type.FAIRY, 1.2, 18.6, Abilities.PSYCHIC_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 85, 75, 130, 115, 95, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TAPU_BULU, 7, true, false, false, "Land Spirit Pokémon", Type.GRASS, Type.FAIRY, 1.9, 45.5, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 130, 115, 85, 95, 75, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TAPU_FINI, 7, true, false, false, "Land Spirit Pokémon", Type.WATER, Type.FAIRY, 1.3, 21.2, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 75, 115, 95, 130, 85, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.COSMOG, 7, true, false, false, "Nebula Pokémon", Type.PSYCHIC, null, 0.2, 0.1, Abilities.UNAWARE, Abilities.NONE, Abilities.NONE, 200, 43, 29, 31, 29, 31, 37, 45, 0, 40, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.COSMOEM, 7, true, false, false, "Protostar Pokémon", Type.PSYCHIC, null, 0.1, 999.9, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 400, 43, 29, 131, 29, 131, 37, 45, 0, 140, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SOLGALEO, 7, false, true, false, "Sunne Pokémon", Type.PSYCHIC, Type.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.LUNALA, 7, false, true, false, "Moone Pokémon", Type.PSYCHIC, Type.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.NIHILEGO, 7, true, false, false, "Parasite Pokémon", Type.ROCK, Type.POISON, 1.2, 55.5, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 109, 53, 47, 127, 131, 103, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.BUZZWOLE, 7, true, false, false, "Swollen Pokémon", Type.BUG, Type.FIGHTING, 2.4, 333.6, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 107, 139, 139, 53, 53, 79, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.PHEROMOSA, 7, true, false, false, "Lissome Pokémon", Type.BUG, Type.FIGHTING, 1.8, 25, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 71, 137, 37, 137, 37, 151, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.XURKITREE, 7, true, false, false, "Glowing Pokémon", Type.ELECTRIC, null, 3.8, 100, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 83, 89, 71, 173, 71, 83, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CELESTEELA, 7, true, false, false, "Launch Pokémon", Type.STEEL, Type.FLYING, 9.2, 999.9, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 97, 101, 103, 107, 101, 61, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.KARTANA, 7, true, false, false, "Drawn Sword Pokémon", Type.GRASS, Type.STEEL, 0.3, 0.1, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 59, 181, 131, 59, 31, 109, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GUZZLORD, 7, true, false, false, "Junkivore Pokémon", Type.DARK, Type.DRAGON, 5.5, 888, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 223, 101, 53, 97, 53, 43, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.NECROZMA, 7, false, true, false, "Prism Pokémon", Type.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, false, null, true), - new PokemonForm("Dusk Mane", "dusk-mane", Type.PSYCHIC, Type.STEEL, 3.8, 460, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 157, 127, 113, 109, 77, 255, 0, 300), - new PokemonForm("Dawn Wings", "dawn-wings", Type.PSYCHIC, Type.GHOST, 4.2, 350, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 113, 109, 157, 127, 77, 255, 0, 300), - new PokemonForm("Ultra", "ultra", Type.PSYCHIC, Type.DRAGON, 7.5, 230, Abilities.NEUROFORCE, Abilities.NONE, Abilities.NONE, 754, 97, 167, 97, 167, 97, 129, 255, 0, 300), - ), - new PokemonSpecies(Species.MAGEARNA, 7, false, false, true, "Artificial Pokémon", Type.STEEL, Type.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.STEEL, Type.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), - new PokemonForm("Original", "original", Type.STEEL, Type.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), - ), - new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true), - new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300) - ), - new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, Type.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.STAKATAKA, 7, true, false, false, "Rampart Pokémon", Type.ROCK, Type.STEEL, 5.5, 820, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 61, 131, 211, 53, 101, 13, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.BLACEPHALON, 7, true, false, false, "Fireworks Pokémon", Type.FIRE, Type.GHOST, 1.8, 13, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 53, 127, 53, 151, 79, 107, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ZERAORA, 7, false, false, true, "Thunderclap Pokémon", Type.ELECTRIC, null, 1.5, 44.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.NONE, 600, 88, 112, 75, 102, 80, 143, 3, 0, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MELTAN, 7, false, false, true, "Hex Nut Pokémon", Type.STEEL, null, 0.2, 8, Abilities.MAGNET_PULL, Abilities.NONE, Abilities.NONE, 300, 46, 65, 65, 55, 35, 34, 3, 0, 150, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MELMETAL, 7, false, false, true, "Hex Nut Pokémon", Type.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, null, 25, 999.9, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 700, 175, 165, 155, 85, 75, 45, 3, 0, 300), - ), - new PokemonSpecies(Species.GROOKEY, 8, false, false, false, "Chimp Pokémon", Type.GRASS, null, 0.3, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 310, 50, 65, 50, 40, 40, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.THWACKEY, 8, false, false, false, "Beat Pokémon", Type.GRASS, null, 0.7, 14, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 420, 70, 85, 70, 55, 60, 80, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.RILLABOOM, 8, false, false, false, "Drummer Pokémon", Type.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, null, 28, 999.9, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.GRASSY_SURGE, 630, 125, 150, 105, 85, 85, 80, 45, 50, 265), - ), - new PokemonSpecies(Species.SCORBUNNY, 8, false, false, false, "Rabbit Pokémon", Type.FIRE, null, 0.3, 4.5, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 310, 50, 71, 40, 40, 40, 69, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.RABOOT, 8, false, false, false, "Rabbit Pokémon", Type.FIRE, null, 0.6, 9, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 420, 65, 86, 60, 55, 60, 94, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CINDERACE, 8, false, false, false, "Striker Pokémon", Type.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, null, 27, 999.9, Abilities.LIBERO, Abilities.NONE, Abilities.LIBERO, 630, 100, 146, 80, 90, 80, 134, 45, 50, 265), - ), - new PokemonSpecies(Species.SOBBLE, 8, false, false, false, "Water Lizard Pokémon", Type.WATER, null, 0.3, 4, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 310, 50, 40, 40, 70, 40, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DRIZZILE, 8, false, false, false, "Water Lizard Pokémon", Type.WATER, null, 0.7, 11.5, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 420, 65, 60, 55, 95, 55, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.INTELEON, 8, false, false, false, "Secret Agent Pokémon", Type.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", Type.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 40, 999.9, Abilities.SNIPER, Abilities.NONE, Abilities.SNIPER, 630, 95, 97, 77, 147, 77, 137, 45, 50, 265), - ), - new PokemonSpecies(Species.SKWOVET, 8, false, false, false, "Cheeky Pokémon", Type.NORMAL, null, 0.3, 2.5, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 275, 70, 55, 55, 35, 35, 25, 255, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GREEDENT, 8, false, false, false, "Greedy Pokémon", Type.NORMAL, null, 0.6, 6, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 460, 120, 95, 95, 55, 75, 20, 90, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ROOKIDEE, 8, false, false, false, "Tiny Bird Pokémon", Type.FLYING, null, 0.2, 1.8, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 245, 38, 47, 35, 33, 35, 57, 255, 50, 49, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CORVISQUIRE, 8, false, false, false, "Raven Pokémon", Type.FLYING, null, 0.8, 16, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 365, 68, 67, 55, 43, 55, 77, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CORVIKNIGHT, 8, false, false, false, "Raven Pokémon", Type.FLYING, Type.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.FLYING, Type.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FLYING, Type.STEEL, 14, 999.9, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, 595, 128, 102, 140, 53, 95, 77, 45, 50, 248), - ), - new PokemonSpecies(Species.BLIPBUG, 8, false, false, false, "Larva Pokémon", Type.BUG, null, 0.4, 8, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 180, 25, 20, 20, 25, 45, 45, 255, 50, 36, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DOTTLER, 8, false, false, false, "Radome Pokémon", Type.BUG, Type.PSYCHIC, 0.4, 19.5, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 335, 50, 35, 80, 50, 90, 30, 120, 50, 117, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ORBEETLE, 8, false, false, false, "Seven Spot Pokémon", Type.BUG, Type.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.BUG, Type.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.PSYCHIC, 14, 999.9, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 605, 90, 45, 130, 110, 140, 90, 45, 50, 253), - ), - new PokemonSpecies(Species.NICKIT, 8, false, false, false, "Fox Pokémon", Type.DARK, null, 0.6, 8.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 245, 40, 28, 28, 47, 52, 50, 255, 50, 49, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.THIEVUL, 8, false, false, false, "Fox Pokémon", Type.DARK, null, 1.2, 19.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 455, 70, 58, 58, 87, 92, 90, 127, 50, 159, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.GOSSIFLEUR, 8, false, false, false, "Flowering Pokémon", Type.GRASS, null, 0.4, 2.2, Abilities.COTTON_DOWN, Abilities.REGENERATOR, Abilities.EFFECT_SPORE, 250, 40, 40, 60, 40, 60, 10, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ELDEGOSS, 8, false, false, false, "Cotton Bloom Pokémon", Type.GRASS, null, 0.5, 2.5, Abilities.COTTON_DOWN, Abilities.REGENERATOR, Abilities.EFFECT_SPORE, 460, 60, 50, 90, 80, 120, 60, 75, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WOOLOO, 8, false, false, false, "Sheep Pokémon", Type.NORMAL, null, 0.6, 6, Abilities.FLUFFY, Abilities.RUN_AWAY, Abilities.BULLETPROOF, 270, 42, 40, 55, 40, 45, 48, 255, 50, 122, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUBWOOL, 8, false, false, false, "Sheep Pokémon", Type.NORMAL, null, 1.3, 43, Abilities.FLUFFY, Abilities.STEADFAST, Abilities.BULLETPROOF, 490, 72, 80, 100, 60, 90, 88, 127, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CHEWTLE, 8, false, false, false, "Snapping Pokémon", Type.WATER, null, 0.3, 8.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 284, 50, 64, 50, 38, 38, 44, 255, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DREDNAW, 8, false, false, false, "Bite Pokémon", Type.WATER, Type.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.WATER, Type.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ROCK, 24, 999.9, Abilities.STRONG_JAW, Abilities.STRONG_JAW, Abilities.STRONG_JAW, 585, 115, 145, 115, 43, 83, 84, 75, 50, 170), - ), - new PokemonSpecies(Species.YAMPER, 8, false, false, false, "Puppy Pokémon", Type.ELECTRIC, null, 0.3, 13.5, Abilities.BALL_FETCH, Abilities.NONE, Abilities.RATTLED, 270, 59, 45, 50, 40, 50, 26, 255, 50, 54, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.BOLTUND, 8, false, false, false, "Dog Pokémon", Type.ELECTRIC, null, 1, 34, Abilities.STRONG_JAW, Abilities.NONE, Abilities.COMPETITIVE, 490, 69, 90, 60, 90, 60, 121, 45, 50, 172, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.ROLYCOLY, 8, false, false, false, "Coal Pokémon", Type.ROCK, null, 0.3, 12, Abilities.STEAM_ENGINE, Abilities.HEATPROOF, Abilities.FLASH_FIRE, 240, 30, 40, 50, 40, 50, 30, 255, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CARKOL, 8, false, false, false, "Coal Pokémon", Type.ROCK, Type.FIRE, 1.1, 78, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 410, 80, 60, 90, 60, 70, 50, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.COALOSSAL, 8, false, false, false, "Coal Pokémon", Type.ROCK, Type.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.ROCK, Type.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ROCK, Type.FIRE, 42, 999.9, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, 610, 140, 95, 130, 95, 110, 40, 45, 50, 255), - ), - new PokemonSpecies(Species.APPLIN, 8, false, false, false, "Apple Core Pokémon", Type.GRASS, Type.DRAGON, 0.2, 0.5, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.BULLETPROOF, 260, 40, 40, 80, 40, 40, 20, 255, 50, 52, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.FLAPPLE, 8, false, false, false, "Apple Wing Pokémon", Type.GRASS, Type.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, - new PokemonForm("Normal", "", Type.GRASS, Type.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 999.9, Abilities.HUSTLE, Abilities.HUSTLE, Abilities.HUSTLE, 585, 90, 130, 100, 85, 80, 100, 45, 50, 170), - ), - new PokemonSpecies(Species.APPLETUN, 8, false, false, false, "Apple Nectar Pokémon", Type.GRASS, Type.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, - new PokemonForm("Normal", "", Type.GRASS, Type.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 999.9, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 585, 130, 75, 115, 125, 115, 25, 45, 50, 170), - ), - new PokemonSpecies(Species.SILICOBRA, 8, false, false, false, "Sand Snake Pokémon", Type.GROUND, null, 2.2, 7.6, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 315, 52, 57, 75, 35, 50, 46, 255, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SANDACONDA, 8, false, false, false, "Sand Snake Pokémon", Type.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GROUND, null, 22, 999.9, Abilities.SAND_SPIT, Abilities.SAND_SPIT, Abilities.SAND_SPIT, 610, 117, 137, 140, 55, 80, 81, 120, 50, 179), - ), - new PokemonSpecies(Species.CRAMORANT, 8, false, false, false, "Gulp Pokémon", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, false, null, true), - new PokemonForm("Gulping Form", "gulping", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), - new PokemonForm("Gorging Form", "gorging", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), - ), - new PokemonSpecies(Species.ARROKUDA, 8, false, false, false, "Rush Pokémon", Type.WATER, null, 0.5, 1, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.PROPELLER_TAIL, 280, 41, 63, 40, 40, 30, 66, 255, 50, 56, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.BARRASKEWDA, 8, false, false, false, "Skewer Pokémon", Type.WATER, null, 1.3, 30, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.PROPELLER_TAIL, 490, 61, 123, 60, 60, 50, 136, 60, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TOXEL, 8, false, false, false, "Baby Pokémon", Type.ELECTRIC, Type.POISON, 0.4, 11, Abilities.RATTLED, Abilities.STATIC, Abilities.KLUTZ, 242, 40, 38, 35, 54, 35, 40, 75, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TOXTRICITY, 8, false, false, false, "Punk Pokémon", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Amped Form", "amped", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "", true), - new PokemonForm("Low-Key Form", "lowkey", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.MINUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "lowkey", true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, Type.POISON, 24, 999.9, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, 602, 114, 98, 82, 144, 82, 82, 45, 50, 176), - ), - new PokemonSpecies(Species.SIZZLIPEDE, 8, false, false, false, "Radiator Pokémon", Type.FIRE, Type.BUG, 0.7, 1, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 305, 50, 65, 45, 50, 50, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CENTISKORCH, 8, false, false, false, "Radiator Pokémon", Type.FIRE, Type.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.FIRE, Type.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.BUG, 75, 999.9, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, 625, 140, 145, 75, 90, 100, 75, 75, 50, 184), - ), - new PokemonSpecies(Species.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", Type.FIGHTING, null, 0.6, 4, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", Type.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SINISTEA, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), - ), - new PokemonSpecies(Species.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), - ), - new PokemonSpecies(Species.HATENNA, 8, false, false, false, "Calm Pokémon", Type.PSYCHIC, null, 0.4, 3.4, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", Type.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.HATTERENE, 8, false, false, false, "Silent Pokémon", Type.PSYCHIC, Type.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, Type.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.PSYCHIC, Type.FAIRY, 26, 999.9, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 610, 97, 90, 105, 146, 122, 50, 45, 50, 255), - ), - new PokemonSpecies(Species.IMPIDIMP, 8, false, false, false, "Wily Pokémon", Type.DARK, Type.FAIRY, 0.4, 5.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 265, 45, 45, 30, 55, 40, 50, 255, 50, 53, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.MORGREM, 8, false, false, false, "Devious Pokémon", Type.DARK, Type.FAIRY, 0.8, 12.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 370, 65, 60, 45, 75, 55, 70, 120, 50, 130, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(Species.GRIMMSNARL, 8, false, false, false, "Bulk Up Pokémon", Type.DARK, Type.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, GrowthRate.MEDIUM_FAST, 100, false, true, - new PokemonForm("Normal", "", Type.DARK, Type.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.DARK, Type.FAIRY, 32, 999.9, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 610, 135, 138, 77, 110, 85, 65, 45, 50, 255), - ), - new PokemonSpecies(Species.OBSTAGOON, 8, false, false, false, "Blocking Pokémon", Type.DARK, Type.NORMAL, 1.6, 46, Abilities.RECKLESS, Abilities.GUTS, Abilities.DEFIANT, 520, 93, 90, 101, 60, 81, 95, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PERRSERKER, 8, false, false, false, "Viking Pokémon", Type.STEEL, null, 0.8, 28, Abilities.BATTLE_ARMOR, Abilities.TOUGH_CLAWS, Abilities.STEELY_SPIRIT, 440, 70, 110, 100, 50, 60, 50, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CURSOLA, 8, false, false, false, "Coral Pokémon", Type.GHOST, null, 1, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.PERISH_BODY, 510, 60, 95, 50, 145, 130, 30, 30, 50, 179, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.SIRFETCHD, 8, false, false, false, "Wild Duck Pokémon", Type.FIGHTING, null, 0.8, 117, Abilities.STEADFAST, Abilities.NONE, Abilities.SCRAPPY, 507, 62, 135, 95, 68, 82, 65, 45, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MR_RIME, 8, false, false, false, "Comedian Pokémon", Type.ICE, Type.PSYCHIC, 1.5, 58.2, Abilities.TANGLED_FEET, Abilities.SCREEN_CLEANER, Abilities.ICE_BODY, 520, 80, 85, 75, 110, 100, 70, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RUNERIGUS, 8, false, false, false, "Grudge Pokémon", Type.GROUND, Type.GHOST, 1.6, 66.6, Abilities.WANDERING_SPIRIT, Abilities.NONE, Abilities.NONE, 483, 58, 95, 145, 50, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.MILCERY, 8, false, false, false, "Cream Pokémon", Type.FAIRY, null, 0.2, 0.3, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 270, 45, 40, 40, 50, 61, 34, 200, 50, 54, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.ALCREMIE, 8, false, false, false, "Cream Pokémon", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, GrowthRate.MEDIUM_FAST, 0, false, true, - new PokemonForm("Vanilla Cream", "vanilla-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, "", true), - new PokemonForm("Ruby Cream", "ruby-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Matcha Cream", "matcha-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Mint Cream", "mint-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Lemon Cream", "lemon-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Salted Cream", "salted-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Ruby Swirl", "ruby-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Caramel Swirl", "caramel-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Rainbow Swirl", "rainbow-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FAIRY, null, 30, 999.9, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 595, 135, 60, 75, 130, 131, 64, 100, 50, 173), - ), - new PokemonSpecies(Species.FALINKS, 8, false, false, false, "Formation Pokémon", Type.FIGHTING, null, 3, 62, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.DEFIANT, 470, 65, 100, 100, 70, 60, 75, 45, 50, 165, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.PINCURCHIN, 8, false, false, false, "Sea Urchin Pokémon", Type.ELECTRIC, null, 0.3, 1, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.ELECTRIC_SURGE, 435, 48, 101, 95, 91, 85, 15, 75, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SNOM, 8, false, false, false, "Worm Pokémon", Type.ICE, Type.BUG, 0.3, 3.8, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.ICE_SCALES, 185, 30, 25, 35, 45, 30, 20, 190, 50, 37, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FROSMOTH, 8, false, false, false, "Frost Moth Pokémon", Type.ICE, Type.BUG, 1.3, 42, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.ICE_SCALES, 475, 70, 65, 60, 125, 90, 65, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.STONJOURNER, 8, false, false, false, "Big Rock Pokémon", Type.ROCK, null, 2.5, 520, Abilities.POWER_SPOT, Abilities.NONE, Abilities.NONE, 470, 100, 125, 135, 20, 20, 70, 60, 50, 165, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.EISCUE, 8, false, false, false, "Penguin Pokémon", Type.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, GrowthRate.SLOW, 50, false, false, - new PokemonForm("Ice Face", "", Type.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, false, null, true), - new PokemonForm("No Ice", "no-ice", Type.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 70, 65, 50, 130, 60, 50, 165), - ), - new PokemonSpecies(Species.INDEEDEE, 8, false, false, false, "Emotion Pokémon", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, GrowthRate.FAST, 50, false, false, - new PokemonForm("Male", "male", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, false, "", true), - new PokemonForm("Female", "female", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.OWN_TEMPO, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 70, 55, 65, 95, 105, 85, 30, 140, 166, false, null, true), - ), - new PokemonSpecies(Species.MORPEKO, 8, false, false, false, "Two-Sided Pokémon", Type.ELECTRIC, Type.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Full Belly Mode", "full-belly", Type.ELECTRIC, Type.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, false, "", true), - new PokemonForm("Hangry Mode", "hangry", Type.ELECTRIC, Type.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153), - ), - new PokemonSpecies(Species.CUFANT, 8, false, false, false, "Copperderm Pokémon", Type.STEEL, null, 1.2, 100, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 330, 72, 80, 49, 40, 49, 40, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.COPPERAJAH, 8, false, false, false, "Copperderm Pokémon", Type.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.GROUND, 23, 999.9, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 600, 167, 155, 89, 80, 89, 20, 90, 50, 175), - ), - new PokemonSpecies(Species.DRACOZOLT, 8, false, false, false, "Fossil Pokémon", Type.ELECTRIC, Type.DRAGON, 1.8, 190, Abilities.VOLT_ABSORB, Abilities.HUSTLE, Abilities.SAND_RUSH, 505, 90, 100, 90, 80, 70, 75, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ARCTOZOLT, 8, false, false, false, "Fossil Pokémon", Type.ELECTRIC, Type.ICE, 2.3, 150, Abilities.VOLT_ABSORB, Abilities.STATIC, Abilities.SLUSH_RUSH, 505, 90, 100, 90, 90, 80, 55, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DRACOVISH, 8, false, false, false, "Fossil Pokémon", Type.WATER, Type.DRAGON, 2.3, 215, Abilities.WATER_ABSORB, Abilities.STRONG_JAW, Abilities.SAND_RUSH, 505, 90, 90, 100, 70, 80, 75, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ARCTOVISH, 8, false, false, false, "Fossil Pokémon", Type.WATER, Type.ICE, 2, 175, Abilities.WATER_ABSORB, Abilities.ICE_BODY, Abilities.SLUSH_RUSH, 505, 90, 90, 100, 80, 90, 55, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DURALUDON, 8, false, false, false, "Alloy Pokémon", Type.STEEL, Type.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.STEEL, Type.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.DRAGON, 43, 999.9, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 635, 100, 110, 120, 175, 60, 70, 45, 50, 187), - ), - new PokemonSpecies(Species.DREEPY, 8, false, false, false, "Lingering Pokémon", Type.DRAGON, Type.GHOST, 0.5, 2, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 270, 28, 60, 30, 40, 30, 82, 45, 50, 54, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAKLOAK, 8, false, false, false, "Caretaker Pokémon", Type.DRAGON, Type.GHOST, 1.4, 11, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 410, 68, 80, 50, 60, 50, 102, 45, 50, 144, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.DRAGAPULT, 8, false, false, false, "Stealth Pokémon", Type.DRAGON, Type.GHOST, 3, 50, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 600, 88, 120, 75, 100, 75, 142, 45, 50, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ZACIAN, 8, false, true, false, "Warrior Pokémon", Type.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hero of Many Battles", "hero-of-many-battles", Type.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), - new PokemonForm("Crowned", "crowned", Type.FAIRY, Type.STEEL, 2.8, 355, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 700, 92, 150, 115, 80, 115, 148, 10, 0, 335), - ), - new PokemonSpecies(Species.ZAMAZENTA, 8, false, true, false, "Warrior Pokémon", Type.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hero of Many Battles", "hero-of-many-battles", Type.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), - new PokemonForm("Crowned", "crowned", Type.FIGHTING, Type.STEEL, 2.9, 785, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 335), - ), - new PokemonSpecies(Species.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, false, null, true), - new PokemonForm("E-Max", "eternamax", Type.POISON, Type.DRAGON, 100, 999.9, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345), - ), - new PokemonSpecies(Species.KUBFU, 8, true, false, false, "Wushu Pokémon", Type.FIGHTING, null, 0.6, 12, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.NONE, 385, 60, 90, 60, 53, 50, 72, 3, 50, 77, GrowthRate.SLOW, 87.5, false), - new PokemonSpecies(Species.URSHIFU, 8, true, false, false, "Wushu Pokémon", Type.FIGHTING, Type.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, - new PokemonForm("Single Strike Style", "single-strike", Type.FIGHTING, Type.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, "", true), - new PokemonForm("Rapid Strike Style", "rapid-strike", Type.FIGHTING, Type.WATER, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, null, true), - new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, Type.FIGHTING, Type.DARK, 29, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), - new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, Type.FIGHTING, Type.WATER, 26, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), - ), - new PokemonSpecies(Species.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), - new PokemonForm("Dada", "dada", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), - ), - new PokemonSpecies(Species.REGIELEKI, 8, true, false, false, "Electron Pokémon", Type.ELECTRIC, null, 1.2, 145, Abilities.TRANSISTOR, Abilities.NONE, Abilities.NONE, 580, 80, 100, 50, 100, 50, 200, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.REGIDRAGO, 8, true, false, false, "Dragon Orb Pokémon", Type.DRAGON, null, 2.1, 200, Abilities.DRAGONS_MAW, Abilities.NONE, Abilities.NONE, 580, 200, 100, 50, 100, 50, 80, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GLASTRIER, 8, true, false, false, "Wild Horse Pokémon", Type.ICE, null, 2.2, 800, Abilities.CHILLING_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 145, 130, 65, 110, 30, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SPECTRIER, 8, true, false, false, "Swift Horse Pokémon", Type.GHOST, null, 2, 44.5, Abilities.GRIM_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 65, 60, 145, 80, 130, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CALYREX, 8, false, true, false, "King Pokémon", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, false, null, true), - new PokemonForm("Ice", "ice", Type.PSYCHIC, Type.ICE, 2.4, 809.1, Abilities.AS_ONE_GLASTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 250), - new PokemonForm("Shadow", "shadow", Type.PSYCHIC, Type.GHOST, 2.4, 53.6, Abilities.AS_ONE_SPECTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 250), - ), - new PokemonSpecies(Species.WYRDEER, 8, false, false, false, "Big Horn Pokémon", Type.NORMAL, Type.PSYCHIC, 1.8, 95.1, Abilities.INTIMIDATE, Abilities.FRISK, Abilities.SAP_SIPPER, 525, 103, 105, 72, 105, 75, 65, 135, 50, 263, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.KLEAVOR, 8, false, false, false, "Axe Pokémon", Type.BUG, Type.ROCK, 1.8, 89, Abilities.SWARM, Abilities.SHEER_FORCE, Abilities.SHARPNESS, 500, 70, 135, 95, 45, 70, 85, 115, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.URSALUNA, 8, false, false, false, "Peat Pokémon", Type.GROUND, Type.NORMAL, 2.4, 290, Abilities.GUTS, Abilities.BULLETPROOF, Abilities.UNNERVE, 550, 130, 140, 105, 45, 80, 50, 75, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BASCULEGION, 8, false, false, false, "Big Fish Pokémon", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, false, "", true), - new PokemonForm("Female", "female", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 92, 65, 100, 75, 78, 135, 50, 265, false, null, true), - ), - new PokemonSpecies(Species.SNEASLER, 8, false, false, false, "Free Climb Pokémon", Type.FIGHTING, Type.POISON, 1.3, 43, Abilities.PRESSURE, Abilities.UNBURDEN, Abilities.POISON_TOUCH, 510, 80, 130, 60, 40, 80, 120, 135, 50, 102, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.OVERQWIL, 8, false, false, false, "Pin Cluster Pokémon", Type.DARK, Type.POISON, 2.5, 60.5, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 510, 85, 115, 95, 65, 65, 85, 135, 50, 179, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ENAMORUS, 8, true, false, false, "Love-Hate Pokémon", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, false, null, true), - new PokemonForm("Therian Forme", "therian", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.OVERCOAT, Abilities.NONE, Abilities.OVERCOAT, 580, 74, 115, 110, 135, 100, 46, 3, 50, 116), - ), - new PokemonSpecies(Species.SPRIGATITO, 9, false, false, false, "Grass Cat Pokémon", Type.GRASS, null, 0.4, 4.1, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 310, 40, 61, 54, 45, 45, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FLORAGATO, 9, false, false, false, "Grass Cat Pokémon", Type.GRASS, null, 0.9, 12.2, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 410, 61, 80, 63, 60, 63, 83, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MEOWSCARADA, 9, false, false, false, "Magician Pokémon", Type.GRASS, Type.DARK, 1.5, 31.2, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 530, 76, 110, 70, 81, 70, 123, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FUECOCO, 9, false, false, false, "Fire Croc Pokémon", Type.FIRE, null, 0.4, 9.8, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 310, 67, 45, 59, 63, 40, 36, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CROCALOR, 9, false, false, false, "Fire Croc Pokémon", Type.FIRE, null, 1, 30.7, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 411, 81, 55, 78, 90, 58, 49, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SKELEDIRGE, 9, false, false, false, "Singer Pokémon", Type.FIRE, Type.GHOST, 1.6, 326.5, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 530, 104, 75, 100, 110, 75, 66, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUAXLY, 9, false, false, false, "Duckling Pokémon", Type.WATER, null, 0.5, 6.1, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 310, 55, 65, 45, 50, 45, 50, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUAXWELL, 9, false, false, false, "Practicing Pokémon", Type.WATER, null, 1.2, 21.5, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 410, 70, 85, 65, 65, 60, 65, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.QUAQUAVAL, 9, false, false, false, "Dancer Pokémon", Type.WATER, Type.FIGHTING, 1.8, 61.9, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 530, 85, 120, 80, 85, 75, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.LECHONK, 9, false, false, false, "Hog Pokémon", Type.NORMAL, null, 0.5, 10.2, Abilities.AROMA_VEIL, Abilities.GLUTTONY, Abilities.THICK_FAT, 254, 54, 45, 40, 35, 45, 35, 255, 50, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.OINKOLOGNE, 9, false, false, false, "Hog Pokémon", Type.NORMAL, null, 1, 120, Abilities.LINGERING_AROMA, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", Type.NORMAL, null, 1, 120, Abilities.LINGERING_AROMA, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, false, "", true), - new PokemonForm("Female", "female", Type.NORMAL, null, 1, 120, Abilities.AROMA_VEIL, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 115, 90, 70, 59, 90, 65, 100, 50, 171, false, null, true), - ), - new PokemonSpecies(Species.TAROUNTULA, 9, false, false, false, "String Ball Pokémon", Type.BUG, null, 0.3, 4, Abilities.INSOMNIA, Abilities.NONE, Abilities.STAKEOUT, 210, 35, 41, 45, 29, 40, 20, 255, 50, 42, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.SPIDOPS, 9, false, false, false, "Trap Pokémon", Type.BUG, null, 1, 16.5, Abilities.INSOMNIA, Abilities.NONE, Abilities.STAKEOUT, 404, 60, 79, 92, 52, 86, 35, 120, 50, 141, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.NYMBLE, 9, false, false, false, "Grasshopper Pokémon", Type.BUG, null, 0.2, 1, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 210, 33, 46, 40, 21, 25, 45, 190, 20, 42, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.LOKIX, 9, false, false, false, "Grasshopper Pokémon", Type.BUG, Type.DARK, 1, 17.5, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 450, 71, 102, 78, 52, 55, 92, 30, 0, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PAWMI, 9, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.3, 2.5, Abilities.STATIC, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 240, 45, 50, 20, 40, 25, 60, 190, 50, 48, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PAWMO, 9, false, false, false, "Mouse Pokémon", Type.ELECTRIC, Type.FIGHTING, 0.4, 6.5, Abilities.VOLT_ABSORB, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 350, 60, 75, 40, 50, 40, 85, 80, 50, 123, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.PAWMOT, 9, false, false, false, "Hands-On Pokémon", Type.ELECTRIC, Type.FIGHTING, 0.9, 41, Abilities.VOLT_ABSORB, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 490, 70, 115, 70, 70, 60, 105, 45, 50, 245, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TANDEMAUS, 9, false, false, false, "Couple Pokémon", Type.NORMAL, null, 0.3, 1.8, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.OWN_TEMPO, 305, 50, 50, 45, 40, 45, 75, 150, 50, 61, GrowthRate.FAST, null, false), - new PokemonSpecies(Species.MAUSHOLD, 9, false, false, false, "Family Pokémon", Type.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165, GrowthRate.FAST, null, false, false, - new PokemonForm("Family of Four", "four", Type.NORMAL, null, 0.3, 2.8, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), - new PokemonForm("Family of Three", "three", Type.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), - ), - new PokemonSpecies(Species.FIDOUGH, 9, false, false, false, "Puppy Pokémon", Type.FAIRY, null, 0.3, 10.9, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.KLUTZ, 312, 37, 55, 70, 30, 55, 65, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DACHSBUN, 9, false, false, false, "Dog Pokémon", Type.FAIRY, null, 0.5, 14.9, Abilities.WELL_BAKED_BODY, Abilities.NONE, Abilities.AROMA_VEIL, 477, 57, 80, 115, 50, 80, 95, 90, 50, 167, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SMOLIV, 9, false, false, false, "Olive Pokémon", Type.GRASS, Type.NORMAL, 0.3, 6.5, Abilities.EARLY_BIRD, Abilities.NONE, Abilities.HARVEST, 260, 41, 35, 45, 58, 51, 30, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.DOLLIV, 9, false, false, false, "Olive Pokémon", Type.GRASS, Type.NORMAL, 0.6, 11.9, Abilities.EARLY_BIRD, Abilities.NONE, Abilities.HARVEST, 354, 52, 53, 60, 78, 78, 33, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ARBOLIVA, 9, false, false, false, "Olive Pokémon", Type.GRASS, Type.NORMAL, 1.4, 48.2, Abilities.SEED_SOWER, Abilities.NONE, Abilities.HARVEST, 510, 78, 69, 90, 125, 109, 39, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SQUAWKABILLY, 9, false, false, false, "Parrot Pokémon", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, GrowthRate.ERRATIC, 50, false, false, - new PokemonForm("Green Plumage", "green-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - new PokemonForm("Blue Plumage", "blue-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - new PokemonForm("Yellow Plumage", "yellow-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - new PokemonForm("White Plumage", "white-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - ), - new PokemonSpecies(Species.NACLI, 9, false, false, false, "Rock Salt Pokémon", Type.ROCK, null, 0.4, 16, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 280, 55, 55, 75, 35, 35, 25, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.NACLSTACK, 9, false, false, false, "Rock Salt Pokémon", Type.ROCK, null, 0.6, 105, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 355, 60, 60, 100, 35, 65, 35, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GARGANACL, 9, false, false, false, "Rock Salt Pokémon", Type.ROCK, null, 2.3, 240, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 500, 100, 100, 130, 45, 90, 35, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CHARCADET, 9, false, false, false, "Fire Child Pokémon", Type.FIRE, null, 0.6, 10.5, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 255, 40, 50, 40, 50, 40, 35, 90, 50, 51, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ARMAROUGE, 9, false, false, false, "Fire Warrior Pokémon", Type.FIRE, Type.PSYCHIC, 1.5, 85, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.WEAK_ARMOR, 525, 85, 60, 100, 125, 80, 75, 25, 20, 263, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.CERULEDGE, 9, false, false, false, "Fire Blades Pokémon", Type.FIRE, Type.GHOST, 1.6, 62, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.WEAK_ARMOR, 525, 75, 125, 80, 60, 100, 85, 25, 20, 263, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TADBULB, 9, false, false, false, "EleTadpole Pokémon", Type.ELECTRIC, null, 0.3, 0.4, Abilities.OWN_TEMPO, Abilities.STATIC, Abilities.DAMP, 272, 61, 31, 41, 59, 35, 45, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BELLIBOLT, 9, false, false, false, "EleFrog Pokémon", Type.ELECTRIC, null, 1.2, 113, Abilities.ELECTROMORPHOSIS, Abilities.STATIC, Abilities.DAMP, 495, 109, 64, 91, 103, 83, 45, 50, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WATTREL, 9, false, false, false, "Storm Petrel Pokémon", Type.ELECTRIC, Type.FLYING, 0.4, 3.6, Abilities.WIND_POWER, Abilities.VOLT_ABSORB, Abilities.COMPETITIVE, 280, 40, 40, 35, 55, 40, 70, 180, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.KILOWATTREL, 9, false, false, false, "Frigatebird Pokémon", Type.ELECTRIC, Type.FLYING, 1.4, 38.6, Abilities.WIND_POWER, Abilities.VOLT_ABSORB, Abilities.COMPETITIVE, 490, 70, 70, 60, 105, 60, 125, 90, 50, 172, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MASCHIFF, 9, false, false, false, "Rascal Pokémon", Type.DARK, null, 0.5, 16, Abilities.INTIMIDATE, Abilities.RUN_AWAY, Abilities.STAKEOUT, 340, 60, 78, 60, 40, 51, 51, 150, 50, 68, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.MABOSSTIFF, 9, false, false, false, "Boss Pokémon", Type.DARK, null, 1.1, 61, Abilities.INTIMIDATE, Abilities.GUARD_DOG, Abilities.STAKEOUT, 505, 80, 120, 90, 60, 70, 85, 75, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.SHROODLE, 9, false, false, false, "Toxic Mouse Pokémon", Type.POISON, Type.NORMAL, 0.2, 0.7, Abilities.UNBURDEN, Abilities.PICKPOCKET, Abilities.PRANKSTER, 290, 40, 65, 35, 40, 35, 75, 190, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GRAFAIAI, 9, false, false, false, "Toxic Monkey Pokémon", Type.POISON, Type.NORMAL, 0.7, 27.2, Abilities.UNBURDEN, Abilities.POISON_TOUCH, Abilities.PRANKSTER, 485, 63, 95, 65, 80, 72, 110, 90, 50, 170, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.BRAMBLIN, 9, false, false, false, "Tumbleweed Pokémon", Type.GRASS, Type.GHOST, 0.6, 0.6, Abilities.WIND_RIDER, Abilities.NONE, Abilities.INFILTRATOR, 275, 40, 65, 30, 45, 35, 60, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BRAMBLEGHAST, 9, false, false, false, "Tumbleweed Pokémon", Type.GRASS, Type.GHOST, 1.2, 6, Abilities.WIND_RIDER, Abilities.NONE, Abilities.INFILTRATOR, 480, 55, 115, 70, 80, 70, 90, 45, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TOEDSCOOL, 9, false, false, false, "Woodear Pokémon", Type.GROUND, Type.GRASS, 0.9, 33, Abilities.MYCELIUM_MIGHT, Abilities.NONE, Abilities.NONE, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TOEDSCRUEL, 9, false, false, false, "Woodear Pokémon", Type.GROUND, Type.GRASS, 1.9, 58, Abilities.MYCELIUM_MIGHT, Abilities.NONE, Abilities.NONE, 515, 80, 70, 65, 80, 120, 100, 90, 50, 180, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.KLAWF, 9, false, false, false, "Ambush Pokémon", Type.ROCK, null, 1.3, 79, Abilities.ANGER_SHELL, Abilities.SHELL_ARMOR, Abilities.REGENERATOR, 450, 70, 100, 115, 35, 55, 75, 120, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CAPSAKID, 9, false, false, false, "Spicy Pepper Pokémon", Type.GRASS, null, 0.3, 3, Abilities.CHLOROPHYLL, Abilities.INSOMNIA, Abilities.KLUTZ, 304, 50, 62, 40, 62, 40, 50, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.SCOVILLAIN, 9, false, false, false, "Spicy Pepper Pokémon", Type.GRASS, Type.FIRE, 0.9, 15, Abilities.CHLOROPHYLL, Abilities.INSOMNIA, Abilities.MOODY, 486, 65, 108, 65, 108, 65, 75, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.RELLOR, 9, false, false, false, "Rolling Pokémon", Type.BUG, null, 0.2, 1, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.SHED_SKIN, 270, 41, 50, 60, 31, 58, 30, 190, 50, 54, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.RABSCA, 9, false, false, false, "Rolling Pokémon", Type.BUG, Type.PSYCHIC, 0.3, 3.5, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.TELEPATHY, 470, 75, 50, 85, 115, 100, 45, 45, 50, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.FLITTLE, 9, false, false, false, "Frill Pokémon", Type.PSYCHIC, null, 0.2, 1.5, Abilities.ANTICIPATION, Abilities.FRISK, Abilities.SPEED_BOOST, 255, 30, 35, 30, 55, 30, 75, 120, 50, 51, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ESPATHRA, 9, false, false, false, "Ostrich Pokémon", Type.PSYCHIC, null, 1.9, 90, Abilities.OPPORTUNIST, Abilities.FRISK, Abilities.SPEED_BOOST, 481, 95, 60, 60, 101, 60, 105, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.TINKATINK, 9, false, false, false, "Metalsmith Pokémon", Type.FAIRY, Type.STEEL, 0.4, 8.9, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 297, 50, 45, 45, 35, 64, 58, 190, 50, 59, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.TINKATUFF, 9, false, false, false, "Hammer Pokémon", Type.FAIRY, Type.STEEL, 0.7, 59.1, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 380, 65, 55, 55, 45, 82, 78, 90, 50, 133, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.TINKATON, 9, false, false, false, "Hammer Pokémon", Type.FAIRY, Type.STEEL, 0.7, 112.8, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 506, 85, 75, 77, 70, 105, 94, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(Species.WIGLETT, 9, false, false, false, "Garden Eel Pokémon", Type.WATER, null, 1.2, 1.8, Abilities.GOOEY, Abilities.RATTLED, Abilities.SAND_VEIL, 245, 10, 55, 25, 35, 25, 95, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.WUGTRIO, 9, false, false, false, "Garden Eel Pokémon", Type.WATER, null, 1.2, 5.4, Abilities.GOOEY, Abilities.RATTLED, Abilities.SAND_VEIL, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BOMBIRDIER, 9, false, false, false, "Item Drop Pokémon", Type.FLYING, Type.DARK, 1.5, 42.9, Abilities.BIG_PECKS, Abilities.KEEN_EYE, Abilities.ROCKY_PAYLOAD, 485, 70, 103, 85, 60, 85, 82, 25, 50, 243, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.FINIZEN, 9, false, false, false, "Dolphin Pokémon", Type.WATER, null, 1.3, 60.2, Abilities.WATER_VEIL, Abilities.NONE, Abilities.NONE, 315, 70, 45, 40, 45, 40, 75, 200, 50, 63, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.PALAFIN, 9, false, false, false, "Dolphin Pokémon", Type.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.NONE, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Zero Form", "zero", Type.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, false, null, true), - new PokemonForm("Hero Form", "hero", Type.WATER, null, 1.8, 97.4, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 650, 100, 160, 97, 106, 87, 100, 45, 50, 160), - ), - new PokemonSpecies(Species.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", Type.STEEL, Type.POISON, 1, 35, Abilities.OVERCOAT, Abilities.NONE, Abilities.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", Type.STEEL, Type.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.STEEL, Type.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, false, null, true), - new PokemonForm("Segin Starmobile", "segin-starmobile", Type.STEEL, Type.DARK, 1.8, 240, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - new PokemonForm("Schedar Starmobile", "schedar-starmobile", Type.STEEL, Type.FIRE, 1.8, 240, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - new PokemonForm("Navi Starmobile", "navi-starmobile", Type.STEEL, Type.POISON, 1.8, 240, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.TOXIC_DEBRIS, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", Type.STEEL, Type.FAIRY, 1.8, 240, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - new PokemonForm("Caph Starmobile", "caph-starmobile", Type.STEEL, Type.FIGHTING, 1.8, 240, Abilities.STAMINA, Abilities.NONE, Abilities.STAMINA, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), - ), - new PokemonSpecies(Species.CYCLIZAR, 9, false, false, false, "Mount Pokémon", Type.DRAGON, Type.NORMAL, 1.6, 63, Abilities.SHED_SKIN, Abilities.NONE, Abilities.REGENERATOR, 501, 70, 95, 65, 85, 65, 121, 190, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ORTHWORM, 9, false, false, false, "Earthworm Pokémon", Type.STEEL, null, 2.5, 310, Abilities.EARTH_EATER, Abilities.NONE, Abilities.SAND_VEIL, 480, 70, 85, 145, 60, 55, 65, 25, 50, 240, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GLIMMET, 9, false, false, false, "Ore Pokémon", Type.ROCK, Type.POISON, 0.7, 8, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.CORROSION, 350, 48, 35, 42, 105, 60, 60, 70, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GLIMMORA, 9, false, false, false, "Ore Pokémon", Type.ROCK, Type.POISON, 1.5, 45, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.CORROSION, 525, 83, 55, 90, 130, 81, 86, 25, 50, 184, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GREAVARD, 9, false, false, false, "Ghost Dog Pokémon", Type.GHOST, null, 0.6, 35, Abilities.PICKUP, Abilities.NONE, Abilities.FLUFFY, 290, 50, 61, 60, 30, 55, 34, 120, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.HOUNDSTONE, 9, false, false, false, "Ghost Dog Pokémon", Type.GHOST, null, 2, 15, Abilities.SAND_RUSH, Abilities.NONE, Abilities.FLUFFY, 488, 72, 101, 100, 50, 97, 68, 60, 50, 171, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.FLAMIGO, 9, false, false, false, "Synchronize Pokémon", Type.FLYING, Type.FIGHTING, 1.6, 37, Abilities.SCRAPPY, Abilities.TANGLED_FEET, Abilities.COSTAR, 500, 82, 115, 74, 75, 64, 90, 100, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CETODDLE, 9, false, false, false, "Terra Whale Pokémon", Type.ICE, null, 1.2, 45, Abilities.THICK_FAT, Abilities.SNOW_CLOAK, Abilities.SHEER_FORCE, 334, 108, 68, 45, 30, 40, 43, 150, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.CETITAN, 9, false, false, false, "Terra Whale Pokémon", Type.ICE, null, 4.5, 700, Abilities.THICK_FAT, Abilities.SLUSH_RUSH, Abilities.SHEER_FORCE, 521, 170, 113, 65, 45, 55, 73, 50, 50, 182, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.VELUZA, 9, false, false, false, "Jettison Pokémon", Type.WATER, Type.PSYCHIC, 2.5, 90, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHARPNESS, 478, 90, 102, 73, 78, 65, 70, 100, 50, 167, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.DONDOZO, 9, false, false, false, "Big Catfish Pokémon", Type.WATER, null, 12, 220, Abilities.UNAWARE, Abilities.OBLIVIOUS, Abilities.WATER_VEIL, 530, 150, 100, 115, 65, 65, 35, 25, 50, 265, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.TATSUGIRI, 9, false, false, false, "Mimicry Pokémon", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, GrowthRate.MEDIUM_SLOW, 50, false, false, - new PokemonForm("Curly Form", "curly", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), - new PokemonForm("Droopy Form", "droopy", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), - new PokemonForm("Stretchy Form", "stretchy", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), - ), - new PokemonSpecies(Species.ANNIHILAPE, 9, false, false, false, "Rage Monkey Pokémon", Type.FIGHTING, Type.GHOST, 1.2, 56, Abilities.VITAL_SPIRIT, Abilities.INNER_FOCUS, Abilities.DEFIANT, 535, 110, 115, 80, 50, 90, 90, 45, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.CLODSIRE, 9, false, false, false, "Spiny Fish Pokémon", Type.POISON, Type.GROUND, 1.8, 223, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 430, 130, 75, 60, 45, 100, 20, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FARIGIRAF, 9, false, false, false, "Long Neck Pokémon", Type.NORMAL, Type.PSYCHIC, 3.2, 160, Abilities.CUD_CHEW, Abilities.ARMOR_TAIL, Abilities.SAP_SIPPER, 520, 120, 90, 70, 110, 70, 60, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUDUNSPARCE, 9, false, false, false, "Land Snake Pokémon", Type.NORMAL, null, 3.6, 39.2, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Two-Segment Form", "two-segment", Type.NORMAL, null, 3.6, 39.2, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, false, ""), - new PokemonForm("Three-Segment Form", "three-segment", Type.NORMAL, null, 4.5, 47.4, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182), - ), - new PokemonSpecies(Species.KINGAMBIT, 9, false, false, false, "Big Blade Pokémon", Type.DARK, Type.STEEL, 2, 120, Abilities.DEFIANT, Abilities.SUPREME_OVERLORD, Abilities.PRESSURE, 550, 100, 135, 120, 60, 85, 50, 25, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GREAT_TUSK, 9, false, false, false, "Paradox Pokémon", Type.GROUND, Type.FIGHTING, 2.2, 320, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 115, 131, 131, 53, 53, 87, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SCREAM_TAIL, 9, false, false, false, "Paradox Pokémon", Type.FAIRY, Type.PSYCHIC, 1.2, 8, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 115, 65, 99, 65, 115, 111, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.BRUTE_BONNET, 9, false, false, false, "Paradox Pokémon", Type.GRASS, Type.DARK, 1.2, 21, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 111, 127, 99, 79, 99, 55, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.FLUTTER_MANE, 9, false, false, false, "Paradox Pokémon", Type.GHOST, Type.FAIRY, 1.4, 4, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 55, 55, 55, 135, 135, 135, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SLITHER_WING, 9, false, false, false, "Paradox Pokémon", Type.BUG, Type.FIGHTING, 3.2, 92, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 85, 135, 79, 85, 105, 81, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SANDY_SHOCKS, 9, false, false, false, "Paradox Pokémon", Type.ELECTRIC, Type.GROUND, 2.3, 60, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 85, 81, 97, 121, 85, 101, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_TREADS, 9, false, false, false, "Paradox Pokémon", Type.GROUND, Type.STEEL, 0.9, 240, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 90, 112, 120, 72, 70, 106, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_BUNDLE, 9, false, false, false, "Paradox Pokémon", Type.ICE, Type.WATER, 0.6, 11, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 56, 80, 114, 124, 60, 136, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_HANDS, 9, false, false, false, "Paradox Pokémon", Type.FIGHTING, Type.ELECTRIC, 1.8, 380.7, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 154, 140, 108, 50, 68, 50, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_JUGULIS, 9, false, false, false, "Paradox Pokémon", Type.DARK, Type.FLYING, 1.3, 111, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 94, 80, 86, 122, 80, 108, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_MOTH, 9, false, false, false, "Paradox Pokémon", Type.FIRE, Type.POISON, 1.2, 36, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 80, 70, 60, 140, 110, 110, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_THORNS, 9, false, false, false, "Paradox Pokémon", Type.ROCK, Type.ELECTRIC, 1.6, 303, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 100, 134, 110, 70, 84, 72, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.FRIGIBAX, 9, false, false, false, "Ice Fin Pokémon", Type.DRAGON, Type.ICE, 0.5, 17, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 320, 65, 75, 45, 35, 45, 55, 45, 50, 64, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ARCTIBAX, 9, false, false, false, "Ice Fin Pokémon", Type.DRAGON, Type.ICE, 0.8, 30, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 423, 90, 95, 66, 45, 65, 62, 25, 50, 148, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.BAXCALIBUR, 9, false, false, false, "Ice Dragon Pokémon", Type.DRAGON, Type.ICE, 2.1, 210, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 600, 115, 145, 92, 75, 86, 87, 10, 50, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.GIMMIGHOUL, 9, false, false, false, "Coin Chest Pokémon", Type.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, GrowthRate.SLOW, null, false, false, - new PokemonForm("Chest Form", "chest", Type.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, false, "", true), - new PokemonForm("Roaming Form", "roaming", Type.GHOST, null, 0.1, 1, Abilities.RUN_AWAY, Abilities.NONE, Abilities.NONE, 300, 45, 30, 25, 75, 45, 80, 45, 50, 60, false, null, true), - ), - new PokemonSpecies(Species.GHOLDENGO, 9, false, false, false, "Coin Entity Pokémon", Type.STEEL, Type.GHOST, 1.2, 30, Abilities.GOOD_AS_GOLD, Abilities.NONE, Abilities.NONE, 550, 87, 60, 95, 133, 91, 84, 45, 50, 275, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.WO_CHIEN, 9, true, false, false, "Ruinous Pokémon", Type.DARK, Type.GRASS, 1.5, 74.2, Abilities.TABLETS_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 85, 85, 100, 95, 135, 70, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CHIEN_PAO, 9, true, false, false, "Ruinous Pokémon", Type.DARK, Type.ICE, 1.9, 152.2, Abilities.SWORD_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 80, 120, 80, 90, 65, 135, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TING_LU, 9, true, false, false, "Ruinous Pokémon", Type.DARK, Type.GROUND, 2.7, 699.7, Abilities.VESSEL_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 155, 110, 125, 55, 80, 45, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.CHI_YU, 9, true, false, false, "Ruinous Pokémon", Type.DARK, Type.FIRE, 0.4, 4.9, Abilities.BEADS_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 55, 80, 80, 135, 120, 100, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ROARING_MOON, 9, false, false, false, "Paradox Pokémon", Type.DRAGON, Type.DARK, 2, 380, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 105, 139, 71, 55, 101, 119, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_VALIANT, 9, false, false, false, "Paradox Pokémon", Type.FAIRY, Type.FIGHTING, 1.4, 35, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 74, 130, 90, 120, 60, 116, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.KORAIDON, 9, false, true, false, "Paradox Pokémon", Type.FIGHTING, Type.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Apex Build", "apex-build", Type.FIGHTING, Type.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), - new PokemonForm("Limited Build", "limited-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), - new PokemonForm("Sprinting Build", "sprinting-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), - new PokemonForm("Swimming Build", "swimming-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), - new PokemonForm("Gliding Build", "gliding-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), - ), - new PokemonSpecies(Species.MIRAIDON, 9, false, true, false, "Paradox Pokémon", Type.ELECTRIC, Type.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Ultimate Mode", "ultimate-mode", Type.ELECTRIC, Type.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), - new PokemonForm("Low-Power Mode", "low-power-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), - new PokemonForm("Drive Mode", "drive-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), - new PokemonForm("Aquatic Mode", "aquatic-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), - new PokemonForm("Glide Mode", "glide-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), - ), - new PokemonSpecies(Species.WALKING_WAKE, 9, false, false, false, "Paradox Pokémon", Type.WATER, Type.DRAGON, 3.5, 280, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 99, 83, 91, 125, 83, 109, 10, 0, 295, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Gouging Fire and Raging Bolt - new PokemonSpecies(Species.IRON_LEAVES, 9, false, false, false, "Paradox Pokémon", Type.GRASS, Type.PSYCHIC, 1.5, 125, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 130, 88, 70, 108, 104, 10, 0, 295, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Iron Boulder and Iron Crown - new PokemonSpecies(Species.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", Type.GRASS, Type.DRAGON, 0.4, 9.7, Abilities.SUPERSWEET_SYRUP, Abilities.GLUTTONY, Abilities.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.POLTCHAGEIST, 9, false, false, false, "Matcha Pokémon", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.SLOW, null, false, false, - new PokemonForm("Counterfeit Form", "counterfeit", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), - new PokemonForm("Artisan Form", "artisan", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), - ), - new PokemonSpecies(Species.SINISTCHA, 9, false, false, false, "Matcha Pokémon", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, GrowthRate.SLOW, null, false, false, - new PokemonForm("Unremarkable Form", "unremarkable", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), - new PokemonForm("Masterpiece Form", "masterpiece", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), - ), - new PokemonSpecies(Species.OKIDOGI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.FIGHTING, 1.8, 92.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.MUNKIDORI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.PSYCHIC, 1, 12.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.FEZANDIPITI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.FAIRY, 1.4, 30.1, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.OGERPON, 9, true, false, false, "Mask Pokémon", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false, - new PokemonForm("Teal Mask", "teal-mask", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, false, null, true), - new PokemonForm("Wellspring Mask", "wellspring-mask", Type.GRASS, Type.WATER, 1.2, 39.8, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Hearthflame Mask", "hearthflame-mask", Type.GRASS, Type.FIRE, 1.2, 39.8, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Cornerstone Mask", "cornerstone-mask", Type.GRASS, Type.ROCK, 1.2, 39.8, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Teal Mask Terastallized", "teal-mask-tera", Type.GRASS, null, 1.2, 39.8, Abilities.EMBODY_ASPECT_TEAL, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Wellspring Mask Terastallized", "wellspring-mask-tera", Type.GRASS, Type.WATER, 1.2, 39.8, Abilities.EMBODY_ASPECT_WELLSPRING, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Hearthflame Mask Terastallized", "hearthflame-mask-tera", Type.GRASS, Type.FIRE, 1.2, 39.8, Abilities.EMBODY_ASPECT_HEARTHFLAME, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Cornerstone Mask Terastallized", "cornerstone-mask-tera", Type.GRASS, Type.ROCK, 1.2, 39.8, Abilities.EMBODY_ASPECT_CORNERSTONE, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - ), - new PokemonSpecies(Species.ARCHALUDON, 9, false, false, false, "Alloy Pokémon", Type.STEEL, Type.DRAGON, 2, 60, Abilities.STAMINA, Abilities.STURDY, Abilities.STALWART, 600, 90, 105, 130, 125, 65, 85, 10, 50, 300, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HYDRAPPLE, 9, false, false, false, "Apple Hydra Pokémon", Type.GRASS, Type.DRAGON, 1.8, 93, Abilities.SUPERSWEET_SYRUP, Abilities.REGENERATOR, Abilities.STICKY_HOLD, 540, 106, 80, 110, 120, 80, 44, 10, 50, 270, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(Species.GOUGING_FIRE, 9, false, false, false, "Paradox Pokémon", Type.FIRE, Type.DRAGON, 3.5, 590, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 105, 115, 121, 65, 93, 91, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.RAGING_BOLT, 9, false, false, false, "Paradox Pokémon", Type.ELECTRIC, Type.DRAGON, 5.2, 480, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 125, 73, 91, 137, 89, 75, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_BOULDER, 9, false, false, false, "Paradox Pokémon", Type.ROCK, Type.PSYCHIC, 1.5, 162.5, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 120, 80, 68, 108, 124, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.IRON_CROWN, 9, false, false, false, "Paradox Pokémon", Type.STEEL, Type.PSYCHIC, 1.6, 156, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 72, 100, 122, 108, 98, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.TERAPAGOS, 9, false, true, false, "Tera Pokémon", Type.NORMAL, null, 0.2, 6.5, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, GrowthRate.SLOW, 50, false, false, - new PokemonForm("Normal Form", "", Type.NORMAL, null, 0.2, 6.5, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, false, null, true), - new PokemonForm("Terastal Form", "terastal", Type.NORMAL, null, 0.3, 16, Abilities.TERA_SHELL, Abilities.NONE, Abilities.NONE, 600, 95, 95, 110, 105, 110, 85, 5, 50, 90), - new PokemonForm("Stellar Form", "stellar", Type.NORMAL, null, 1.7, 77, Abilities.TERAFORM_ZERO, Abilities.NONE, Abilities.NONE, 700, 160, 105, 110, 130, 110, 85, 5, 50, 90), - ), - new PokemonSpecies(Species.PECHARUNT, 9, false, false, true, "Subjugation Pokémon", Type.POISON, Type.GHOST, 0.3, 0.3, Abilities.POISON_PUPPETEER, Abilities.NONE, Abilities.NONE, 600, 88, 88, 160, 88, 88, 88, 3, 0, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.ALOLA_RATTATA, 7, false, false, false, "Mouse Pokémon", Type.DARK, Type.NORMAL, 0.3, 3.8, Abilities.GLUTTONY, Abilities.HUSTLE, Abilities.THICK_FAT, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_RATICATE, 7, false, false, false, "Mouse Pokémon", Type.DARK, Type.NORMAL, 0.7, 25.5, Abilities.GLUTTONY, Abilities.HUSTLE, Abilities.THICK_FAT, 413, 75, 71, 70, 40, 80, 77, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_RAICHU, 7, false, false, false, "Mouse Pokémon", Type.ELECTRIC, Type.PSYCHIC, 0.7, 21, Abilities.SURGE_SURFER, Abilities.NONE, Abilities.NONE, 485, 60, 85, 50, 95, 85, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_SANDSHREW, 7, false, false, false, "Mouse Pokémon", Type.ICE, Type.STEEL, 0.7, 40, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SLUSH_RUSH, 300, 50, 75, 90, 10, 35, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_SANDSLASH, 7, false, false, false, "Mouse Pokémon", Type.ICE, Type.STEEL, 1.2, 55, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SLUSH_RUSH, 450, 75, 100, 120, 25, 65, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_VULPIX, 7, false, false, false, "Fox Pokémon", Type.ICE, null, 0.6, 9.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SNOW_WARNING, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(Species.ALOLA_NINETALES, 7, false, false, false, "Fox Pokémon", Type.ICE, Type.FAIRY, 1.1, 19.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SNOW_WARNING, 505, 73, 67, 75, 81, 100, 109, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(Species.ALOLA_DIGLETT, 7, false, false, false, "Mole Pokémon", Type.GROUND, Type.STEEL, 0.2, 1, Abilities.SAND_VEIL, Abilities.TANGLING_HAIR, Abilities.SAND_FORCE, 265, 10, 55, 30, 35, 45, 90, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_DUGTRIO, 7, false, false, false, "Mole Pokémon", Type.GROUND, Type.STEEL, 0.7, 66.6, Abilities.SAND_VEIL, Abilities.TANGLING_HAIR, Abilities.SAND_FORCE, 425, 35, 100, 60, 50, 70, 110, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_MEOWTH, 7, false, false, false, "Scratch Cat Pokémon", Type.DARK, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.RATTLED, 290, 40, 35, 35, 50, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_PERSIAN, 7, false, false, false, "Classy Cat Pokémon", Type.DARK, null, 1.1, 33, Abilities.FUR_COAT, Abilities.TECHNICIAN, Abilities.RATTLED, 440, 65, 60, 60, 75, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_GEODUDE, 7, false, false, false, "Rock Pokémon", Type.ROCK, Type.ELECTRIC, 0.4, 20.3, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ALOLA_GRAVELER, 7, false, false, false, "Rock Pokémon", Type.ROCK, Type.ELECTRIC, 1, 110, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ALOLA_GOLEM, 7, false, false, false, "Megaton Pokémon", Type.ROCK, Type.ELECTRIC, 1.7, 316, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 495, 80, 120, 130, 55, 65, 45, 45, 70, 223, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.ALOLA_GRIMER, 7, false, false, false, "Sludge Pokémon", Type.POISON, Type.DARK, 0.7, 42, Abilities.POISON_TOUCH, Abilities.GLUTTONY, Abilities.POWER_OF_ALCHEMY, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_MUK, 7, false, false, false, "Sludge Pokémon", Type.POISON, Type.DARK, 1, 52, Abilities.POISON_TOUCH, Abilities.GLUTTONY, Abilities.POWER_OF_ALCHEMY, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ALOLA_EXEGGUTOR, 7, false, false, false, "Coconut Pokémon", Type.GRASS, Type.DRAGON, 10.9, 415.6, Abilities.FRISK, Abilities.NONE, Abilities.HARVEST, 530, 95, 105, 85, 125, 75, 45, 45, 50, 186, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.ALOLA_MAROWAK, 7, false, false, false, "Bone Keeper Pokémon", Type.FIRE, Type.GHOST, 1, 34, Abilities.CURSED_BODY, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ETERNAL_FLOETTE, 6, true, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 551, 74, 65, 67, 125, 128, 92, 120, 70, 130, GrowthRate.MEDIUM_FAST, 0, false), //Marked as Sub-Legend, for casing purposes - new PokemonSpecies(Species.GALAR_MEOWTH, 8, false, false, false, "Scratch Cat Pokémon", Type.STEEL, null, 0.4, 7.5, Abilities.PICKUP, Abilities.TOUGH_CLAWS, Abilities.UNNERVE, 290, 50, 65, 55, 40, 40, 40, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_PONYTA, 8, false, false, false, "Fire Horse Pokémon", Type.PSYCHIC, null, 0.8, 24, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_RAPIDASH, 8, false, false, false, "Fire Horse Pokémon", Type.PSYCHIC, Type.FAIRY, 1.7, 80, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_SLOWPOKE, 8, false, false, false, "Dopey Pokémon", Type.PSYCHIC, null, 1.2, 36, Abilities.GLUTTONY, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_SLOWBRO, 8, false, false, false, "Hermit Crab Pokémon", Type.POISON, Type.PSYCHIC, 1.6, 70.5, Abilities.QUICK_DRAW, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 100, 95, 100, 70, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_FARFETCHD, 8, false, false, false, "Wild Duck Pokémon", Type.FIGHTING, null, 0.8, 42, Abilities.STEADFAST, Abilities.NONE, Abilities.SCRAPPY, 377, 52, 95, 55, 58, 62, 55, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_WEEZING, 8, false, false, false, "Poison Gas Pokémon", Type.POISON, Type.FAIRY, 3, 16, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.MISTY_SURGE, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_MR_MIME, 8, false, false, false, "Barrier Pokémon", Type.ICE, Type.PSYCHIC, 1.4, 56.8, Abilities.VITAL_SPIRIT, Abilities.SCREEN_CLEANER, Abilities.ICE_BODY, 460, 50, 65, 65, 90, 90, 100, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_ARTICUNO, 8, true, false, false, "Freeze Pokémon", Type.PSYCHIC, Type.FLYING, 1.7, 50.9, Abilities.COMPETITIVE, Abilities.NONE, Abilities.NONE, 580, 90, 85, 85, 125, 100, 95, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GALAR_ZAPDOS, 8, true, false, false, "Electric Pokémon", Type.FIGHTING, Type.FLYING, 1.6, 58.2, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 580, 90, 125, 90, 85, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GALAR_MOLTRES, 8, true, false, false, "Flame Pokémon", Type.DARK, Type.FLYING, 2, 66, Abilities.BERSERK, Abilities.NONE, Abilities.NONE, 580, 90, 85, 90, 100, 125, 90, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.GALAR_SLOWKING, 8, false, false, false, "Royal Pokémon", Type.POISON, Type.PSYCHIC, 1.8, 79.5, Abilities.CURIOUS_MEDICINE, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 65, 80, 110, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_CORSOLA, 8, false, false, false, "Coral Pokémon", Type.GHOST, null, 0.6, 0.5, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 410, 60, 55, 100, 65, 100, 30, 60, 50, 144, GrowthRate.FAST, 25, false), - new PokemonSpecies(Species.GALAR_ZIGZAGOON, 8, false, false, false, "Tiny Raccoon Pokémon", Type.DARK, Type.NORMAL, 0.4, 17.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_LINOONE, 8, false, false, false, "Rushing Pokémon", Type.DARK, Type.NORMAL, 0.5, 32.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_DARUMAKA, 8, false, false, false, "Zen Charm Pokémon", Type.ICE, null, 0.7, 40, Abilities.HUSTLE, Abilities.NONE, Abilities.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GALAR_DARMANITAN, 8, false, false, false, "Blazing Pokémon", Type.ICE, null, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Standard Mode", "", Type.ICE, null, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), - new PokemonForm("Zen Mode", "zen", Type.ICE, Type.FIRE, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 160, 55, 30, 55, 135, 60, 50, 189), - ), - new PokemonSpecies(Species.GALAR_YAMASK, 8, false, false, false, "Spirit Pokémon", Type.GROUND, Type.GHOST, 0.5, 1.5, Abilities.WANDERING_SPIRIT, Abilities.NONE, Abilities.NONE, 303, 38, 55, 85, 30, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GALAR_STUNFISK, 8, false, false, false, "Trap Pokémon", Type.GROUND, Type.STEEL, 0.7, 20.5, Abilities.MIMICRY, Abilities.NONE, Abilities.NONE, 471, 109, 81, 99, 66, 84, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HISUI_GROWLITHE, 8, false, false, false, "Puppy Pokémon", Type.FIRE, Type.ROCK, 0.8, 22.7, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.ROCK_HEAD, 350, 60, 75, 45, 65, 50, 55, 190, 50, 70, GrowthRate.SLOW, 75, false), - new PokemonSpecies(Species.HISUI_ARCANINE, 8, false, false, false, "Legendary Pokémon", Type.FIRE, Type.ROCK, 2, 168, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.ROCK_HEAD, 555, 95, 115, 80, 95, 80, 90, 85, 50, 194, GrowthRate.SLOW, 75, false), - new PokemonSpecies(Species.HISUI_VOLTORB, 8, false, false, false, "Ball Pokémon", Type.ELECTRIC, Type.GRASS, 0.5, 13, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 80, 66, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.HISUI_ELECTRODE, 8, false, false, false, "Ball Pokémon", Type.ELECTRIC, Type.GRASS, 1.2, 81, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(Species.HISUI_TYPHLOSION, 8, false, false, false, "Volcano Pokémon", Type.FIRE, Type.GHOST, 1.6, 69.8, Abilities.BLAZE, Abilities.NONE, Abilities.FRISK, 534, 73, 84, 78, 119, 85, 95, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.HISUI_QWILFISH, 8, false, false, false, "Balloon Pokémon", Type.DARK, Type.POISON, 0.5, 3.9, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HISUI_SNEASEL, 8, false, false, false, "Sharp Claw Pokémon", Type.FIGHTING, Type.POISON, 0.9, 27, Abilities.INNER_FOCUS, Abilities.KEEN_EYE, Abilities.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.HISUI_SAMUROTT, 8, false, false, false, "Formidable Pokémon", Type.WATER, Type.DARK, 1.5, 58.2, Abilities.TORRENT, Abilities.NONE, Abilities.SHARPNESS, 528, 90, 108, 80, 100, 65, 85, 45, 80, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.HISUI_LILLIGANT, 8, false, false, false, "Flowering Pokémon", Type.GRASS, Type.FIGHTING, 1.2, 19.2, Abilities.CHLOROPHYLL, Abilities.HUSTLE, Abilities.LEAF_GUARD, 480, 70, 105, 75, 50, 75, 105, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(Species.HISUI_ZORUA, 8, false, false, false, "Tricky Fox Pokémon", Type.NORMAL, Type.GHOST, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 35, 60, 40, 85, 40, 70, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.HISUI_ZOROARK, 8, false, false, false, "Illusion Fox Pokémon", Type.NORMAL, Type.GHOST, 1.6, 83, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 55, 100, 60, 125, 60, 110, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.HISUI_BRAVIARY, 8, false, false, false, "Valiant Pokémon", Type.PSYCHIC, Type.FLYING, 1.7, 43.4, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.TINTED_LENS, 510, 110, 83, 70, 112, 70, 65, 60, 50, 179, GrowthRate.SLOW, 100, false), - new PokemonSpecies(Species.HISUI_SLIGGOO, 8, false, false, false, "Soft Tissue Pokémon", Type.STEEL, Type.DRAGON, 0.7, 68.5, Abilities.SAP_SIPPER, Abilities.SHELL_ARMOR, Abilities.GOOEY, 452, 58, 75, 83, 83, 113, 40, 45, 35, 158, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HISUI_GOODRA, 8, false, false, false, "Dragon Pokémon", Type.STEEL, Type.DRAGON, 1.7, 334.1, Abilities.SAP_SIPPER, Abilities.SHELL_ARMOR, Abilities.GOOEY, 600, 80, 100, 100, 110, 150, 60, 45, 35, 270, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.HISUI_AVALUGG, 8, false, false, false, "Iceberg Pokémon", Type.ICE, Type.ROCK, 1.4, 262.4, Abilities.STRONG_JAW, Abilities.ICE_BODY, Abilities.STURDY, 514, 95, 127, 184, 34, 36, 38, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.HISUI_DECIDUEYE, 8, false, false, false, "Arrow Quill Pokémon", Type.GRASS, Type.FIGHTING, 1.6, 37, Abilities.OVERGROW, Abilities.NONE, Abilities.SCRAPPY, 530, 88, 112, 80, 95, 95, 60, 45, 50, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.PALDEA_TAUROS, 9, false, false, false, "Wild Bull Pokémon", Type.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, GrowthRate.SLOW, 100, false, false, - new PokemonForm("Combat Breed", "combat", Type.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, "", true), - new PokemonForm("Blaze Breed", "blaze", Type.FIGHTING, Type.FIRE, 1.4, 85, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), - new PokemonForm("Aqua Breed", "aqua", Type.FIGHTING, Type.WATER, 1.4, 110, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), - ), - new PokemonSpecies(Species.PALDEA_WOOPER, 9, false, false, false, "Water Fish Pokémon", Type.POISON, Type.GROUND, 0.4, 11, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BLOODMOON_URSALUNA, 9, true, false, false, "Peat Pokémon", Type.GROUND, Type.NORMAL, 2.7, 333, Abilities.MINDS_EYE, Abilities.NONE, Abilities.NONE, 555, 113, 70, 120, 135, 65, 52, 75, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), //Marked as Sub-Legend, for casing purposes + new PokemonSpecies(Species.BULBASAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 6.9, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.IVYSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 13, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 405, 60, 62, 63, 80, 80, 60, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.VENUSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.POISON, 2.4, 155.5, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 625, 80, 100, 123, 122, 120, 80, 45, 50, 263, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.POISON, 24, 999.9, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.EFFECT_SPORE, 625, 120, 82, 98, 130, 115, 80, 45, 50, 263, true), + ), + new PokemonSpecies(Species.CHARMANDER, 1, false, false, false, "Lizard Pokémon", PokemonType.FIRE, null, 0.6, 8.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 309, 39, 52, 43, 60, 50, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CHARMELEON, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, null, 1.1, 19, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 405, 58, 64, 58, 80, 65, 80, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CHARIZARD, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, false, null, true), + new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, PokemonType.FIRE, PokemonType.DRAGON, 1.7, 110.5, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 634, 78, 130, 111, 130, 85, 100, 45, 50, 267), + new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, PokemonType.FIRE, PokemonType.FLYING, 1.7, 100.5, Abilities.DROUGHT, Abilities.NONE, Abilities.DROUGHT, 634, 78, 104, 78, 159, 115, 100, 45, 50, 267), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.FLYING, 28, 999.9, Abilities.BERSERK, Abilities.NONE, Abilities.BERSERK, 634, 118, 84, 93, 139, 100, 100, 45, 50, 267), + ), + new PokemonSpecies(Species.SQUIRTLE, 1, false, false, false, "Tiny Turtle Pokémon", PokemonType.WATER, null, 0.5, 9, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 314, 44, 48, 65, 50, 64, 43, 45, 50, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.WARTORTLE, 1, false, false, false, "Turtle Pokémon", PokemonType.WATER, null, 1, 22.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 405, 59, 63, 80, 65, 80, 58, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.BLASTOISE, 1, false, false, false, "Shellfish Pokémon", PokemonType.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, null, 1.6, 101.1, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.MEGA_LAUNCHER, 630, 79, 103, 120, 135, 115, 78, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.STEEL, 25, 999.9, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.SHELL_ARMOR, 630, 119, 83, 135, 115, 110, 68, 45, 50, 265), + ), + new PokemonSpecies(Species.CATERPIE, 1, false, false, false, "Worm Pokémon", PokemonType.BUG, null, 0.3, 2.9, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 30, 35, 20, 20, 45, 255, 50, 39, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.METAPOD, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.7, 9.9, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.FLYING, 17, 999.9, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.COMPOUND_EYES, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true), + ), + new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", PokemonType.BUG, PokemonType.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, PokemonType.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEEDRILL, 1, false, false, false, "Poison Bee Pokémon", PokemonType.BUG, PokemonType.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.POISON, 1.4, 40.5, Abilities.ADAPTABILITY, Abilities.NONE, Abilities.ADAPTABILITY, 495, 65, 150, 40, 15, 80, 145, 45, 70, 198), + ), + new PokemonSpecies(Species.PIDGEY, 1, false, false, false, "Tiny Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.8, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 251, 40, 45, 40, 35, 35, 56, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PIDGEOTTO, 1, false, false, false, "Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.1, 30, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 349, 63, 60, 55, 50, 50, 71, 120, 70, 122, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PIDGEOT, 1, false, false, false, "Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, PokemonType.FLYING, 2.2, 50.5, Abilities.NO_GUARD, Abilities.NO_GUARD, Abilities.NO_GUARD, 579, 83, 80, 80, 135, 80, 121, 45, 70, 240), + ), + new PokemonSpecies(Species.RATTATA, 1, false, false, false, "Mouse Pokémon", PokemonType.NORMAL, null, 0.3, 3.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.RATICATE, 1, false, false, false, "Mouse Pokémon", PokemonType.NORMAL, null, 0.7, 18.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 413, 55, 81, 60, 50, 70, 97, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SPEAROW, 1, false, false, false, "Tiny Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2, Abilities.KEEN_EYE, Abilities.NONE, Abilities.SNIPER, 262, 40, 60, 30, 31, 31, 70, 255, 70, 52, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FEAROW, 1, false, false, false, "Beak Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 38, Abilities.KEEN_EYE, Abilities.NONE, Abilities.SNIPER, 442, 65, 90, 65, 61, 61, 100, 90, 70, 155, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.EKANS, 1, false, false, false, "Snake Pokémon", PokemonType.POISON, null, 2, 6.9, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 288, 35, 60, 44, 40, 54, 55, 255, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ARBOK, 1, false, false, false, "Cobra Pokémon", PokemonType.POISON, null, 3.5, 65, Abilities.INTIMIDATE, Abilities.SHED_SKIN, Abilities.UNNERVE, 448, 60, 95, 69, 65, 79, 80, 90, 70, 157, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PIKACHU, 1, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true), + new PokemonForm("Partner", "partner", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), + new PokemonForm("Cosplay", "cosplay", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Cool Cosplay", "cool-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Beauty Cosplay", "beauty-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Cute Cosplay", "cute-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Smart Cosplay", "smart-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Tough Cosplay", "tough-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ELECTRIC, null, 21, 999.9, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.LIGHTNING_ROD, 530, 125, 95, 60, 90, 70, 90, 190, 50, 112), //+100 BST from Partner Form + ), + new PokemonSpecies(Species.RAICHU, 1, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.8, 30, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 485, 60, 90, 55, 90, 80, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SANDSHREW, 1, false, false, false, "Mouse Pokémon", PokemonType.GROUND, null, 0.6, 12, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 300, 50, 75, 85, 20, 30, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SANDSLASH, 1, false, false, false, "Mouse Pokémon", PokemonType.GROUND, null, 1, 29.5, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 450, 75, 100, 110, 45, 55, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.NIDORAN_F, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.4, 7, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 275, 55, 47, 52, 40, 40, 41, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.NIDORINA, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.8, 20, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 365, 70, 62, 67, 55, 55, 56, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.NIDOQUEEN, 1, false, false, false, "Drill Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.3, 60, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.SHEER_FORCE, 505, 90, 92, 87, 75, 85, 76, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.NIDORAN_M, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.5, 9, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 273, 46, 57, 40, 40, 40, 50, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 100, false), + new PokemonSpecies(Species.NIDORINO, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.9, 19.5, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.HUSTLE, 365, 61, 72, 57, 55, 55, 65, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 100, false), + new PokemonSpecies(Species.NIDOKING, 1, false, false, false, "Drill Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.4, 62, Abilities.POISON_POINT, Abilities.RIVALRY, Abilities.SHEER_FORCE, 505, 81, 102, 77, 85, 75, 85, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 100, false), + new PokemonSpecies(Species.CLEFAIRY, 1, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 0.6, 7.5, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.FRIEND_GUARD, 323, 70, 45, 48, 60, 65, 35, 150, 140, 113, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.CLEFABLE, 1, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 1.3, 40, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.UNAWARE, 483, 95, 70, 73, 95, 90, 60, 25, 140, 242, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.VULPIX, 1, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 0.6, 9.9, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.DROUGHT, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(Species.NINETALES, 1, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 1.1, 19.9, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.DROUGHT, 505, 73, 76, 75, 81, 100, 100, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(Species.JIGGLYPUFF, 1, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.5, 5.5, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRIEND_GUARD, 270, 115, 45, 20, 45, 25, 20, 170, 50, 95, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.WIGGLYTUFF, 1, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 1, 12, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRISK, 435, 140, 70, 45, 85, 50, 45, 50, 50, 218, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.ZUBAT, 1, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 0.8, 7.5, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 245, 40, 45, 35, 30, 40, 55, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.GOLBAT, 1, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 1.6, 55, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 455, 75, 80, 70, 65, 75, 90, 90, 50, 159, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.ODDISH, 1, false, false, false, "Weed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.5, 5.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.RUN_AWAY, 320, 45, 50, 55, 75, 65, 30, 255, 50, 64, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GLOOM, 1, false, false, false, "Weed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.8, 8.6, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.STENCH, 395, 60, 65, 70, 85, 75, 40, 120, 50, 138, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.VILEPLUME, 1, false, false, false, "Flower Pokémon", PokemonType.GRASS, PokemonType.POISON, 1.2, 18.6, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.EFFECT_SPORE, 490, 75, 80, 85, 110, 90, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.PARAS, 1, false, false, false, "Mushroom Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.3, 5.4, Abilities.EFFECT_SPORE, Abilities.DRY_SKIN, Abilities.DAMP, 285, 35, 70, 55, 45, 55, 25, 190, 70, 57, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PARASECT, 1, false, false, false, "Mushroom Pokémon", PokemonType.BUG, PokemonType.GRASS, 1, 29.5, Abilities.EFFECT_SPORE, Abilities.DRY_SKIN, Abilities.DAMP, 405, 60, 95, 80, 60, 80, 30, 75, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VENONAT, 1, false, false, false, "Insect Pokémon", PokemonType.BUG, PokemonType.POISON, 1, 30, Abilities.COMPOUND_EYES, Abilities.TINTED_LENS, Abilities.RUN_AWAY, 305, 60, 55, 50, 40, 55, 45, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VENOMOTH, 1, false, false, false, "Poison Moth Pokémon", PokemonType.BUG, PokemonType.POISON, 1.5, 12.5, Abilities.SHIELD_DUST, Abilities.TINTED_LENS, Abilities.WONDER_SKIN, 450, 70, 65, 60, 90, 75, 90, 75, 70, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DIGLETT, 1, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.2, 0.8, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 265, 10, 55, 25, 35, 45, 95, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUGTRIO, 1, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.7, 33.3, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MEOWTH, 1, false, false, false, "Scratch Cat Pokémon", PokemonType.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 33, 999.9, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 540, 115, 110, 65, 65, 70, 115, 255, 50, 58), //+100 BST from Persian + ), + new PokemonSpecies(Species.PERSIAN, 1, false, false, false, "Classy Cat Pokémon", PokemonType.NORMAL, null, 1, 32, Abilities.LIMBER, Abilities.TECHNICIAN, Abilities.UNNERVE, 440, 65, 70, 60, 65, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PSYDUCK, 1, false, false, false, "Duck Pokémon", PokemonType.WATER, null, 0.8, 19.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 320, 50, 52, 48, 65, 50, 55, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GOLDUCK, 1, false, false, false, "Duck Pokémon", PokemonType.WATER, null, 1.7, 76.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 500, 80, 82, 78, 95, 80, 85, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MANKEY, 1, false, false, false, "Pig Monkey Pokémon", PokemonType.FIGHTING, null, 0.5, 28, Abilities.VITAL_SPIRIT, Abilities.ANGER_POINT, Abilities.DEFIANT, 305, 40, 80, 35, 35, 45, 70, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PRIMEAPE, 1, false, false, false, "Pig Monkey Pokémon", PokemonType.FIGHTING, null, 1, 32, Abilities.VITAL_SPIRIT, Abilities.ANGER_POINT, Abilities.DEFIANT, 455, 65, 105, 60, 60, 70, 95, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GROWLITHE, 1, false, false, false, "Puppy Pokémon", PokemonType.FIRE, null, 0.7, 19, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.JUSTIFIED, 350, 55, 70, 45, 70, 50, 60, 190, 50, 70, GrowthRate.SLOW, 75, false), + new PokemonSpecies(Species.ARCANINE, 1, false, false, false, "Legendary Pokémon", PokemonType.FIRE, null, 1.9, 155, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.JUSTIFIED, 555, 90, 110, 80, 100, 80, 95, 75, 50, 194, GrowthRate.SLOW, 75, false), + new PokemonSpecies(Species.POLIWAG, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 0.6, 12.4, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 300, 40, 50, 40, 40, 40, 90, 255, 50, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.POLIWHIRL, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 1, 20, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 385, 65, 65, 65, 50, 50, 90, 120, 50, 135, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.POLIWRATH, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.3, 54, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.SWIFT_SWIM, 510, 90, 95, 95, 70, 90, 70, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ABRA, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 0.9, 19.5, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 310, 25, 20, 15, 105, 55, 90, 200, 50, 62, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.KADABRA, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 1.3, 56.5, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 400, 40, 35, 30, 120, 70, 105, 100, 50, 140, GrowthRate.MEDIUM_SLOW, 75, true), + new PokemonSpecies(Species.ALAKAZAM, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 1.5, 48, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, GrowthRate.MEDIUM_SLOW, 75, true, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 1.5, 48, Abilities.SYNCHRONIZE, Abilities.INNER_FOCUS, Abilities.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, null, 1.2, 48, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 600, 55, 50, 65, 175, 105, 150, 50, 50, 250, true), + ), + new PokemonSpecies(Species.MACHOP, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 0.8, 19.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 305, 70, 80, 50, 35, 35, 35, 180, 50, 61, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.MACHOKE, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.5, 70.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 405, 80, 100, 70, 50, 60, 45, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.MACHAMP, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false, true, + new PokemonForm("Normal", "", PokemonType.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIGHTING, null, 25, 999.9, Abilities.GUTS, Abilities.GUTS, Abilities.GUTS, 605, 115, 170, 95, 65, 95, 65, 45, 50, 253), + ), + new PokemonSpecies(Species.BELLSPROUT, 1, false, false, false, "Flower Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 6.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.VICTREEBEL, 1, false, false, false, "Flycatcher Pokémon", PokemonType.GRASS, PokemonType.POISON, 1.7, 15.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 490, 80, 105, 65, 100, 70, 70, 45, 70, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TENTACOOL, 1, false, false, false, "Jellyfish Pokémon", PokemonType.WATER, PokemonType.POISON, 0.9, 45.5, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TENTACRUEL, 1, false, false, false, "Jellyfish Pokémon", PokemonType.WATER, PokemonType.POISON, 1.6, 55, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 515, 80, 70, 65, 80, 120, 100, 60, 50, 180, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GEODUDE, 1, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.GROUND, 0.4, 20, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GRAVELER, 1, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1, 105, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GOLEM, 1, false, false, false, "Megaton Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1.4, 300, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 495, 80, 120, 130, 55, 65, 45, 45, 70, 248, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PONYTA, 1, false, false, false, "Fire Horse Pokémon", PokemonType.FIRE, null, 1, 30, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RAPIDASH, 1, false, false, false, "Fire Horse Pokémon", PokemonType.FIRE, null, 1.7, 95, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SLOWPOKE, 1, false, false, false, "Dopey Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.2, 36, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SLOWBRO, 1, false, false, false, "Hermit Crab Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.6, 78.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.PSYCHIC, 1.6, 78.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.PSYCHIC, 2, 120, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 590, 95, 75, 180, 130, 80, 30, 75, 50, 172), + ), + new PokemonSpecies(Species.MAGNEMITE, 1, false, false, false, "Magnet Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 0.3, 6, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 325, 25, 35, 70, 95, 55, 45, 190, 50, 65, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.MAGNETON, 1, false, false, false, "Magnet Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 1, 60, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 465, 50, 60, 95, 120, 70, 70, 60, 50, 163, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.FARFETCHD, 1, false, false, false, "Wild Duck Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.8, 15, Abilities.KEEN_EYE, Abilities.INNER_FOCUS, Abilities.DEFIANT, 377, 52, 90, 55, 58, 62, 60, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DODUO, 1, false, false, false, "Twin Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.4, 39.2, Abilities.RUN_AWAY, Abilities.EARLY_BIRD, Abilities.TANGLED_FEET, 310, 35, 85, 45, 35, 35, 75, 190, 70, 62, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.DODRIO, 1, false, false, false, "Triple Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.8, 85.2, Abilities.RUN_AWAY, Abilities.EARLY_BIRD, Abilities.TANGLED_FEET, 470, 60, 110, 70, 60, 60, 110, 45, 70, 165, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SEEL, 1, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, null, 1.1, 90, Abilities.THICK_FAT, Abilities.HYDRATION, Abilities.ICE_BODY, 325, 65, 45, 55, 45, 70, 45, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DEWGONG, 1, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, PokemonType.ICE, 1.7, 120, Abilities.THICK_FAT, Abilities.HYDRATION, Abilities.ICE_BODY, 475, 90, 70, 80, 70, 95, 70, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GRIMER, 1, false, false, false, "Sludge Pokémon", PokemonType.POISON, null, 0.9, 30, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.POISON_TOUCH, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MUK, 1, false, false, false, "Sludge Pokémon", PokemonType.POISON, null, 1.2, 30, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.POISON_TOUCH, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SHELLDER, 1, false, false, false, "Bivalve Pokémon", PokemonType.WATER, null, 0.3, 4, Abilities.SHELL_ARMOR, Abilities.SKILL_LINK, Abilities.OVERCOAT, 305, 30, 65, 100, 45, 25, 40, 190, 50, 61, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CLOYSTER, 1, false, false, false, "Bivalve Pokémon", PokemonType.WATER, PokemonType.ICE, 1.5, 132.5, Abilities.SHELL_ARMOR, Abilities.SKILL_LINK, Abilities.OVERCOAT, 525, 50, 95, 180, 85, 45, 70, 60, 50, 184, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GASTLY, 1, false, false, false, "Gas Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.3, 0.1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 310, 30, 35, 30, 100, 35, 80, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.HAUNTER, 1, false, false, false, "Gas Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.6, 0.1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 405, 45, 50, 45, 115, 55, 95, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GENGAR, 1, false, false, false, "Shadow Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GHOST, PokemonType.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GHOST, PokemonType.POISON, 1.4, 40.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.NONE, 600, 60, 65, 80, 170, 95, 130, 45, 50, 250), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GHOST, PokemonType.POISON, 20, 999.9, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 600, 140, 65, 70, 140, 85, 100, 45, 50, 250), + ), + new PokemonSpecies(Species.ONIX, 1, false, false, false, "Rock Snake Pokémon", PokemonType.ROCK, PokemonType.GROUND, 8.8, 210, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.WEAK_ARMOR, 385, 35, 45, 160, 30, 45, 70, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DROWZEE, 1, false, false, false, "Hypnosis Pokémon", PokemonType.PSYCHIC, null, 1, 32.4, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 328, 60, 48, 45, 43, 90, 42, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HYPNO, 1, false, false, false, "Hypnosis Pokémon", PokemonType.PSYCHIC, null, 1.6, 75.6, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 483, 85, 73, 70, 73, 115, 67, 75, 70, 169, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.KRABBY, 1, false, false, false, "River Crab Pokémon", PokemonType.WATER, null, 0.4, 6.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 325, 30, 105, 90, 25, 25, 50, 225, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KINGLER, 1, false, false, false, "Pincer Pokémon", PokemonType.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 19, 999.9, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 575, 90, 155, 140, 50, 70, 70, 60, 50, 166), + ), + new PokemonSpecies(Species.VOLTORB, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 0.5, 10.4, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.ELECTRODE, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 1.2, 66.6, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.EXEGGCUTE, 1, false, false, false, "Egg Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 0.4, 2.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HARVEST, 325, 60, 40, 80, 60, 45, 40, 90, 50, 65, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.EXEGGUTOR, 1, false, false, false, "Coconut Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 2, 120, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HARVEST, 530, 95, 95, 85, 125, 75, 55, 45, 50, 186, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CUBONE, 1, false, false, false, "Lonely Pokémon", PokemonType.GROUND, null, 0.4, 6.5, Abilities.ROCK_HEAD, Abilities.LIGHTNING_ROD, Abilities.BATTLE_ARMOR, 320, 50, 50, 95, 40, 50, 35, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MAROWAK, 1, false, false, false, "Bone Keeper Pokémon", PokemonType.GROUND, null, 1, 45, Abilities.ROCK_HEAD, Abilities.LIGHTNING_ROD, Abilities.BATTLE_ARMOR, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HITMONLEE, 1, false, false, false, "Kicking Pokémon", PokemonType.FIGHTING, null, 1.5, 49.8, Abilities.LIMBER, Abilities.RECKLESS, Abilities.UNBURDEN, 455, 50, 120, 53, 35, 110, 87, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.HITMONCHAN, 1, false, false, false, "Punching Pokémon", PokemonType.FIGHTING, null, 1.4, 50.2, Abilities.KEEN_EYE, Abilities.IRON_FIST, Abilities.INNER_FOCUS, 455, 50, 105, 79, 35, 110, 76, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.LICKITUNG, 1, false, false, false, "Licking Pokémon", PokemonType.NORMAL, null, 1.2, 65.5, Abilities.OWN_TEMPO, Abilities.OBLIVIOUS, Abilities.CLOUD_NINE, 385, 90, 55, 75, 60, 75, 30, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KOFFING, 1, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, null, 0.6, 1, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.STENCH, 340, 40, 65, 95, 60, 45, 35, 190, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WEEZING, 1, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, null, 1.2, 9.5, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.STENCH, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RHYHORN, 1, false, false, false, "Spikes Pokémon", PokemonType.GROUND, PokemonType.ROCK, 1, 115, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, Abilities.RECKLESS, 345, 80, 85, 95, 30, 30, 25, 120, 50, 69, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.RHYDON, 1, false, false, false, "Drill Pokémon", PokemonType.GROUND, PokemonType.ROCK, 1.9, 120, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, Abilities.RECKLESS, 485, 105, 130, 120, 45, 45, 40, 60, 50, 170, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.CHANSEY, 1, false, false, false, "Egg Pokémon", PokemonType.NORMAL, null, 1.1, 34.6, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 450, 250, 5, 5, 35, 105, 50, 30, 140, 395, GrowthRate.FAST, 0, false), + new PokemonSpecies(Species.TANGELA, 1, false, false, false, "Vine Pokémon", PokemonType.GRASS, null, 1, 35, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.REGENERATOR, 435, 65, 55, 115, 100, 40, 60, 45, 50, 87, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KANGASKHAN, 1, false, false, false, "Parent Pokémon", PokemonType.NORMAL, null, 2.2, 80, Abilities.EARLY_BIRD, Abilities.SCRAPPY, Abilities.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, GrowthRate.MEDIUM_FAST, 0, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 2.2, 80, Abilities.EARLY_BIRD, Abilities.SCRAPPY, Abilities.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, null, 2.2, 100, Abilities.PARENTAL_BOND, Abilities.PARENTAL_BOND, Abilities.PARENTAL_BOND, 590, 105, 125, 100, 60, 100, 100, 45, 50, 172), + ), + new PokemonSpecies(Species.HORSEA, 1, false, false, false, "Dragon Pokémon", PokemonType.WATER, null, 0.4, 8, Abilities.SWIFT_SWIM, Abilities.SNIPER, Abilities.DAMP, 295, 30, 40, 70, 70, 25, 60, 225, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SEADRA, 1, false, false, false, "Dragon Pokémon", PokemonType.WATER, null, 1.2, 25, Abilities.POISON_POINT, Abilities.SNIPER, Abilities.DAMP, 440, 55, 65, 95, 95, 45, 85, 75, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GOLDEEN, 1, false, false, false, "Goldfish Pokémon", PokemonType.WATER, null, 0.6, 15, Abilities.SWIFT_SWIM, Abilities.WATER_VEIL, Abilities.LIGHTNING_ROD, 320, 45, 67, 60, 35, 50, 63, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SEAKING, 1, false, false, false, "Goldfish Pokémon", PokemonType.WATER, null, 1.3, 39, Abilities.SWIFT_SWIM, Abilities.WATER_VEIL, Abilities.LIGHTNING_ROD, 450, 80, 92, 65, 65, 80, 68, 60, 50, 158, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.STARYU, 1, false, false, false, "Star Shape Pokémon", PokemonType.WATER, null, 0.8, 34.5, Abilities.ILLUMINATE, Abilities.NATURAL_CURE, Abilities.ANALYTIC, 340, 30, 45, 55, 70, 55, 85, 225, 50, 68, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.STARMIE, 1, false, false, false, "Mysterious Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.1, 80, Abilities.ILLUMINATE, Abilities.NATURAL_CURE, Abilities.ANALYTIC, 520, 60, 75, 85, 100, 85, 115, 60, 50, 182, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MR_MIME, 1, false, false, false, "Barrier Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.3, 54.5, Abilities.SOUNDPROOF, Abilities.FILTER, Abilities.TECHNICIAN, 460, 40, 45, 65, 100, 120, 90, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCYTHER, 1, false, false, false, "Mantis Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.5, 56, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.STEADFAST, 500, 70, 110, 80, 55, 80, 105, 45, 50, 100, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.JYNX, 1, false, false, false, "Human Shape Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.4, 40.6, Abilities.OBLIVIOUS, Abilities.FOREWARN, Abilities.DRY_SKIN, 455, 65, 50, 35, 115, 95, 95, 45, 50, 159, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.ELECTABUZZ, 1, false, false, false, "Electric Pokémon", PokemonType.ELECTRIC, null, 1.1, 30, Abilities.STATIC, Abilities.NONE, Abilities.VITAL_SPIRIT, 490, 65, 83, 57, 95, 85, 105, 45, 50, 172, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.MAGMAR, 1, false, false, false, "Spitfire Pokémon", PokemonType.FIRE, null, 1.3, 44.5, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 495, 65, 95, 57, 100, 85, 93, 45, 50, 173, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.PINSIR, 1, false, false, false, "Stag Beetle Pokémon", PokemonType.BUG, null, 1.5, 55, Abilities.HYPER_CUTTER, Abilities.MOLD_BREAKER, Abilities.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.BUG, null, 1.5, 55, Abilities.HYPER_CUTTER, Abilities.MOLD_BREAKER, Abilities.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.FLYING, 1.7, 59, Abilities.AERILATE, Abilities.AERILATE, Abilities.AERILATE, 600, 65, 155, 120, 65, 90, 105, 45, 50, 175), + ), + new PokemonSpecies(Species.TAUROS, 1, false, false, false, "Wild Bull Pokémon", PokemonType.NORMAL, null, 1.4, 88.4, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.SHEER_FORCE, 490, 75, 100, 95, 40, 70, 110, 45, 50, 172, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.MAGIKARP, 1, false, false, false, "Fish Pokémon", PokemonType.WATER, null, 0.9, 10, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.RATTLED, 200, 20, 10, 55, 15, 20, 80, 255, 50, 40, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.GYARADOS, 1, false, false, false, "Atrocious Pokémon", PokemonType.WATER, PokemonType.FLYING, 6.5, 235, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.FLYING, 6.5, 235, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.DARK, 6.5, 305, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, 640, 95, 155, 109, 70, 130, 81, 45, 50, 189, true), + ), + new PokemonSpecies(Species.LAPRAS, 1, false, false, false, "Transport Pokémon", PokemonType.WATER, PokemonType.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ICE, 24, 999.9, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, Abilities.SHIELD_DUST, 635, 170, 85, 85, 105, 130, 60, 45, 50, 187), + ), + new PokemonSpecies(Species.DITTO, 1, false, false, false, "Transform Pokémon", PokemonType.NORMAL, null, 0.3, 4, Abilities.LIMBER, Abilities.NONE, Abilities.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.EEVEE, 1, false, false, false, "Evolution Pokémon", PokemonType.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), + new PokemonForm("Partner", "partner", PokemonType.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 18, 999.9, Abilities.PROTEAN, Abilities.PROTEAN, Abilities.PROTEAN, 535, 110, 90, 70, 95, 85, 85, 45, 50, 65), //+100 BST from Partner Form + ), + new PokemonSpecies(Species.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", PokemonType.WATER, null, 1, 29, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.JOLTEON, 1, false, false, false, "Lightning Pokémon", PokemonType.ELECTRIC, null, 0.8, 24.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.QUICK_FEET, 525, 65, 65, 60, 110, 95, 130, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.FLAREON, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, null, 0.9, 25, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.GUTS, 525, 65, 130, 60, 95, 110, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.PORYGON, 1, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.8, 36.5, Abilities.TRACE, Abilities.DOWNLOAD, Abilities.ANALYTIC, 395, 65, 60, 70, 85, 75, 40, 45, 50, 79, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.OMANYTE, 1, false, false, false, "Spiral Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.4, 7.5, Abilities.SWIFT_SWIM, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 355, 35, 40, 100, 90, 55, 35, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.OMASTAR, 1, false, false, false, "Spiral Pokémon", PokemonType.ROCK, PokemonType.WATER, 1, 35, Abilities.SWIFT_SWIM, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 495, 70, 60, 125, 115, 70, 55, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.KABUTO, 1, false, false, false, "Shellfish Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.5, 11.5, Abilities.SWIFT_SWIM, Abilities.BATTLE_ARMOR, Abilities.WEAK_ARMOR, 355, 30, 80, 90, 55, 45, 55, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.KABUTOPS, 1, false, false, false, "Shellfish Pokémon", PokemonType.ROCK, PokemonType.WATER, 1.3, 40.5, Abilities.SWIFT_SWIM, Abilities.BATTLE_ARMOR, Abilities.WEAK_ARMOR, 495, 60, 115, 105, 65, 70, 80, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.AERODACTYL, 1, false, false, false, "Fossil Pokémon", PokemonType.ROCK, PokemonType.FLYING, 1.8, 59, Abilities.ROCK_HEAD, Abilities.PRESSURE, Abilities.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, GrowthRate.SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FLYING, 1.8, 59, Abilities.ROCK_HEAD, Abilities.PRESSURE, Abilities.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ROCK, PokemonType.FLYING, 2.1, 79, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 615, 80, 135, 85, 70, 95, 150, 45, 50, 180), + ), + new PokemonSpecies(Species.SNORLAX, 1, false, false, false, "Sleeping Pokémon", PokemonType.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, GrowthRate.SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 35, 999.9, Abilities.HARVEST, Abilities.HARVEST, Abilities.HARVEST, 640, 200, 135, 80, 80, 125, 20, 25, 50, 189), + ), + new PokemonSpecies(Species.ARTICUNO, 1, true, false, false, "Freeze Pokémon", PokemonType.ICE, PokemonType.FLYING, 1.7, 55.4, Abilities.PRESSURE, Abilities.NONE, Abilities.SNOW_CLOAK, 580, 90, 85, 100, 95, 125, 85, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ZAPDOS, 1, true, false, false, "Electric Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.6, 52.6, Abilities.PRESSURE, Abilities.NONE, Abilities.STATIC, 580, 90, 90, 85, 125, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MOLTRES, 1, true, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FLYING, 2, 60, Abilities.PRESSURE, Abilities.NONE, Abilities.FLAME_BODY, 580, 90, 100, 90, 125, 85, 90, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DRATINI, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 1.8, 3.3, Abilities.SHED_SKIN, Abilities.NONE, Abilities.MARVEL_SCALE, 300, 41, 64, 45, 50, 50, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAGONAIR, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 4, 16.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.MARVEL_SCALE, 420, 61, 84, 65, 70, 70, 70, 45, 35, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAGONITE, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 2.2, 210, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.MULTISCALE, 600, 91, 134, 95, 100, 100, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.MEWTWO, 1, false, true, false, "Genetic Pokémon", PokemonType.PSYCHIC, null, 2, 122, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 2, 122, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, false, null, true), + new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, PokemonType.PSYCHIC, PokemonType.FIGHTING, 2.3, 127, Abilities.STEADFAST, Abilities.NONE, Abilities.STEADFAST, 780, 106, 190, 100, 154, 100, 130, 3, 0, 340), + new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, PokemonType.PSYCHIC, null, 1.5, 33, Abilities.INSOMNIA, Abilities.NONE, Abilities.INSOMNIA, 780, 106, 150, 70, 194, 120, 140, 3, 0, 340), + ), + new PokemonSpecies(Species.MEW, 1, false, false, true, "New Species Pokémon", PokemonType.PSYCHIC, null, 0.4, 4, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.CHIKORITA, 2, false, false, false, "Leaf Pokémon", PokemonType.GRASS, null, 0.9, 6.4, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 318, 45, 49, 65, 49, 65, 45, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.BAYLEEF, 2, false, false, false, "Leaf Pokémon", PokemonType.GRASS, null, 1.2, 15.8, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 405, 60, 62, 80, 63, 80, 60, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MEGANIUM, 2, false, false, false, "Herb Pokémon", PokemonType.GRASS, null, 1.8, 100.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 525, 80, 82, 100, 83, 100, 80, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(Species.CYNDAQUIL, 2, false, false, false, "Fire Mouse Pokémon", PokemonType.FIRE, null, 0.5, 7.9, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 309, 39, 52, 43, 60, 50, 65, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUILAVA, 2, false, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 0.9, 19, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 405, 58, 64, 58, 80, 65, 80, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TYPHLOSION, 2, false, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 1.7, 79.5, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 534, 78, 84, 78, 109, 85, 100, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TOTODILE, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 0.6, 9.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 314, 50, 65, 64, 44, 48, 43, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CROCONAW, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 1.1, 25, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 405, 65, 80, 80, 59, 63, 58, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FERALIGATR, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 2.3, 88.8, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 530, 85, 105, 100, 79, 83, 78, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SENTRET, 2, false, false, false, "Scout Pokémon", PokemonType.NORMAL, null, 0.8, 6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 215, 35, 46, 34, 35, 45, 20, 255, 70, 43, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FURRET, 2, false, false, false, "Long Body Pokémon", PokemonType.NORMAL, null, 1.8, 32.5, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 415, 85, 76, 64, 45, 55, 90, 90, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HOOTHOOT, 2, false, false, false, "Owl Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.7, 21.2, Abilities.INSOMNIA, Abilities.KEEN_EYE, Abilities.TINTED_LENS, 262, 60, 30, 30, 36, 56, 50, 255, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.NOCTOWL, 2, false, false, false, "Owl Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.6, 40.8, Abilities.INSOMNIA, Abilities.KEEN_EYE, Abilities.TINTED_LENS, 452, 100, 50, 50, 86, 96, 70, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LEDYBA, 2, false, false, false, "Five Star Pokémon", PokemonType.BUG, PokemonType.FLYING, 1, 10.8, Abilities.SWARM, Abilities.EARLY_BIRD, Abilities.RATTLED, 265, 40, 20, 30, 40, 80, 55, 255, 70, 53, GrowthRate.FAST, 50, true), + new PokemonSpecies(Species.LEDIAN, 2, false, false, false, "Five Star Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.4, 35.6, Abilities.SWARM, Abilities.EARLY_BIRD, Abilities.IRON_FIST, 390, 55, 35, 50, 55, 110, 85, 90, 70, 137, GrowthRate.FAST, 50, true), + new PokemonSpecies(Species.SPINARAK, 2, false, false, false, "String Spit Pokémon", PokemonType.BUG, PokemonType.POISON, 0.5, 8.5, Abilities.SWARM, Abilities.INSOMNIA, Abilities.SNIPER, 250, 40, 60, 40, 40, 40, 30, 255, 70, 50, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.ARIADOS, 2, false, false, false, "Long Leg Pokémon", PokemonType.BUG, PokemonType.POISON, 1.1, 33.5, Abilities.SWARM, Abilities.INSOMNIA, Abilities.SNIPER, 400, 70, 90, 70, 60, 70, 40, 90, 70, 140, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.CROBAT, 2, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 1.8, 75, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.INFILTRATOR, 535, 85, 90, 80, 70, 80, 130, 90, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CHINCHOU, 2, false, false, false, "Angler Pokémon", PokemonType.WATER, PokemonType.ELECTRIC, 0.5, 12, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 330, 75, 38, 38, 56, 56, 67, 190, 50, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.LANTURN, 2, false, false, false, "Light Pokémon", PokemonType.WATER, PokemonType.ELECTRIC, 1.2, 22.5, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 460, 125, 58, 58, 76, 76, 67, 75, 50, 161, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PICHU, 2, false, false, false, "Tiny Mouse Pokémon", PokemonType.ELECTRIC, null, 0.3, 2, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), + new PokemonForm("Spiky-Eared", "spiky", PokemonType.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), + ), + new PokemonSpecies(Species.CLEFFA, 2, false, false, false, "Star Shape Pokémon", PokemonType.FAIRY, null, 0.3, 3, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.FRIEND_GUARD, 218, 50, 25, 28, 45, 55, 15, 150, 140, 44, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.IGGLYBUFF, 2, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.3, 1, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRIEND_GUARD, 210, 90, 30, 15, 40, 20, 15, 170, 50, 42, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.TOGEPI, 2, false, false, false, "Spike Ball Pokémon", PokemonType.FAIRY, null, 0.3, 1.5, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 245, 35, 20, 65, 40, 65, 20, 190, 50, 49, GrowthRate.FAST, 87.5, false), + new PokemonSpecies(Species.TOGETIC, 2, false, false, false, "Happiness Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 0.6, 3.2, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 405, 55, 40, 85, 80, 105, 40, 75, 50, 142, GrowthRate.FAST, 87.5, false), + new PokemonSpecies(Species.NATU, 2, false, false, false, "Tiny Bird Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.2, 2, Abilities.SYNCHRONIZE, Abilities.EARLY_BIRD, Abilities.MAGIC_BOUNCE, 320, 40, 50, 45, 70, 45, 70, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.XATU, 2, false, false, false, "Mystic Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.5, 15, Abilities.SYNCHRONIZE, Abilities.EARLY_BIRD, Abilities.MAGIC_BOUNCE, 470, 65, 75, 70, 95, 70, 95, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.MAREEP, 2, false, false, false, "Wool Pokémon", PokemonType.ELECTRIC, null, 0.6, 7.8, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 280, 55, 40, 40, 65, 45, 35, 235, 70, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.FLAAFFY, 2, false, false, false, "Wool Pokémon", PokemonType.ELECTRIC, null, 0.8, 13.3, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 365, 70, 55, 55, 80, 60, 45, 120, 70, 128, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.AMPHAROS, 2, false, false, false, "Light Pokémon", PokemonType.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ELECTRIC, PokemonType.DRAGON, 1.4, 61.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 610, 90, 95, 105, 165, 110, 45, 45, 70, 255), + ), + new PokemonSpecies(Species.BELLOSSOM, 2, false, false, false, "Flower Pokémon", PokemonType.GRASS, null, 0.4, 5.8, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HEALER, 490, 75, 80, 95, 90, 100, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MARILL, 2, false, false, false, "Aqua Mouse Pokémon", PokemonType.WATER, PokemonType.FAIRY, 0.4, 8.5, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 250, 70, 20, 50, 20, 50, 40, 190, 50, 88, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.AZUMARILL, 2, false, false, false, "Aqua Rabbit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 0.8, 28.5, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 420, 100, 50, 80, 60, 80, 50, 75, 50, 210, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.SUDOWOODO, 2, false, false, false, "Imitation Pokémon", PokemonType.ROCK, null, 1.2, 38, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.RATTLED, 410, 70, 100, 115, 30, 65, 30, 65, 50, 144, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.POLITOED, 2, false, false, false, "Frog Pokémon", PokemonType.WATER, null, 1.1, 33.9, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.DRIZZLE, 500, 90, 75, 75, 90, 100, 70, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.HOPPIP, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.4, 0.5, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 250, 35, 35, 40, 35, 55, 50, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SKIPLOOM, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.6, 1, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 340, 55, 45, 50, 45, 65, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.JUMPLUFF, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.8, 3, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 460, 75, 55, 70, 55, 95, 110, 45, 70, 230, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.AIPOM, 2, false, false, false, "Long Tail Pokémon", PokemonType.NORMAL, null, 0.8, 11.5, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.SKILL_LINK, 360, 55, 70, 55, 40, 55, 85, 45, 70, 72, GrowthRate.FAST, 50, true), + new PokemonSpecies(Species.SUNKERN, 2, false, false, false, "Seed Pokémon", PokemonType.GRASS, null, 0.3, 1.8, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 180, 30, 30, 30, 30, 30, 30, 235, 70, 36, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SUNFLORA, 2, false, false, false, "Sun Pokémon", PokemonType.GRASS, null, 0.8, 8.5, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 425, 75, 75, 55, 105, 85, 30, 120, 70, 149, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.YANMA, 2, false, false, false, "Clear Wing Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 38, Abilities.SPEED_BOOST, Abilities.COMPOUND_EYES, Abilities.FRISK, 390, 65, 65, 45, 75, 45, 95, 75, 70, 78, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WOOPER, 2, false, false, false, "Water Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.4, 8.5, Abilities.DAMP, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.QUAGSIRE, 2, false, false, false, "Water Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.4, 75, Abilities.DAMP, Abilities.WATER_ABSORB, Abilities.UNAWARE, 430, 95, 85, 85, 65, 65, 35, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.ESPEON, 2, false, false, false, "Sun Pokémon", PokemonType.PSYCHIC, null, 0.9, 26.5, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.MAGIC_BOUNCE, 525, 65, 65, 60, 130, 95, 110, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.UMBREON, 2, false, false, false, "Moonlight Pokémon", PokemonType.DARK, null, 1, 27, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.INNER_FOCUS, 525, 95, 65, 110, 60, 130, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.MURKROW, 2, false, false, false, "Darkness Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.5, 2.1, Abilities.INSOMNIA, Abilities.SUPER_LUCK, Abilities.PRANKSTER, 405, 60, 85, 42, 85, 42, 91, 30, 35, 81, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SLOWKING, 2, false, false, false, "Royal Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 2, 79.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 80, 100, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MISDREAVUS, 2, false, false, false, "Screech Pokémon", PokemonType.GHOST, null, 0.7, 1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 435, 60, 60, 60, 85, 85, 85, 45, 35, 87, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.UNOWN, 2, false, false, false, "Symbol Pokémon", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, GrowthRate.MEDIUM_FAST, null, false, false, + new PokemonForm("A", "a", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("B", "b", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("C", "c", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("D", "d", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("E", "e", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("F", "f", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("G", "g", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("H", "h", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("I", "i", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("J", "j", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("K", "k", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("L", "l", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("M", "m", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("N", "n", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("O", "o", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("P", "p", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Q", "q", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("R", "r", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("S", "s", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("T", "t", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("U", "u", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("V", "v", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("W", "w", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("X", "x", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Y", "y", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Z", "z", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("!", "exclamation", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("?", "question", PokemonType.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + ), + new PokemonSpecies(Species.WOBBUFFET, 2, false, false, false, "Patient Pokémon", PokemonType.PSYCHIC, null, 1.3, 28.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.TELEPATHY, 405, 190, 33, 58, 33, 58, 33, 45, 50, 142, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.GIRAFARIG, 2, false, false, false, "Long Neck Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.5, 41.5, Abilities.INNER_FOCUS, Abilities.EARLY_BIRD, Abilities.SAP_SIPPER, 455, 70, 80, 65, 90, 65, 85, 60, 70, 159, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.PINECO, 2, false, false, false, "Bagworm Pokémon", PokemonType.BUG, null, 0.6, 7.2, Abilities.STURDY, Abilities.NONE, Abilities.OVERCOAT, 290, 50, 65, 90, 35, 35, 15, 190, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FORRETRESS, 2, false, false, false, "Bagworm Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.2, 125.8, Abilities.STURDY, Abilities.NONE, Abilities.OVERCOAT, 465, 75, 90, 140, 60, 60, 40, 75, 70, 163, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUNSPARCE, 2, false, false, false, "Land Snake Pokémon", PokemonType.NORMAL, null, 1.5, 14, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 415, 100, 70, 70, 65, 65, 45, 190, 50, 145, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GLIGAR, 2, false, false, false, "Fly Scorpion Pokémon", PokemonType.GROUND, PokemonType.FLYING, 1.1, 64.8, Abilities.HYPER_CUTTER, Abilities.SAND_VEIL, Abilities.IMMUNITY, 430, 65, 75, 105, 35, 65, 85, 60, 70, 86, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.STEELIX, 2, false, false, false, "Iron Snake Pokémon", PokemonType.STEEL, PokemonType.GROUND, 9.2, 400, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.GROUND, 9.2, 400, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, PokemonType.GROUND, 10.5, 740, Abilities.SAND_FORCE, Abilities.SAND_FORCE, Abilities.SAND_FORCE, 610, 75, 125, 230, 55, 95, 30, 25, 50, 179, true), + ), + new PokemonSpecies(Species.SNUBBULL, 2, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 0.6, 7.8, Abilities.INTIMIDATE, Abilities.RUN_AWAY, Abilities.RATTLED, 300, 60, 80, 50, 40, 40, 30, 190, 70, 60, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.GRANBULL, 2, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 1.4, 48.7, Abilities.INTIMIDATE, Abilities.QUICK_FEET, Abilities.RATTLED, 450, 90, 120, 75, 60, 60, 45, 75, 70, 158, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.QWILFISH, 2, false, false, false, "Balloon Pokémon", PokemonType.WATER, PokemonType.POISON, 0.5, 3.9, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCIZOR, 2, false, false, false, "Pincer Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.8, 118, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.STEEL, 1.8, 118, Abilities.SWARM, Abilities.TECHNICIAN, Abilities.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.STEEL, 2, 125, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 600, 70, 150, 140, 65, 100, 75, 25, 50, 175, true), + ), + new PokemonSpecies(Species.SHUCKLE, 2, false, false, false, "Mold Pokémon", PokemonType.BUG, PokemonType.ROCK, 0.6, 20.5, Abilities.STURDY, Abilities.GLUTTONY, Abilities.CONTRARY, 505, 20, 10, 230, 10, 230, 5, 190, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.HERACROSS, 2, false, false, false, "Single Horn Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.5, 54, Abilities.SWARM, Abilities.GUTS, Abilities.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.FIGHTING, 1.5, 54, Abilities.SWARM, Abilities.GUTS, Abilities.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.FIGHTING, 1.7, 62.5, Abilities.SKILL_LINK, Abilities.SKILL_LINK, Abilities.SKILL_LINK, 600, 80, 185, 115, 40, 105, 75, 45, 50, 175, true), + ), + new PokemonSpecies(Species.SNEASEL, 2, false, false, false, "Sharp Claw Pokémon", PokemonType.DARK, PokemonType.ICE, 0.9, 28, Abilities.INNER_FOCUS, Abilities.KEEN_EYE, Abilities.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.TEDDIURSA, 2, false, false, false, "Little Bear Pokémon", PokemonType.NORMAL, null, 0.6, 8.8, Abilities.PICKUP, Abilities.QUICK_FEET, Abilities.HONEY_GATHER, 330, 60, 80, 50, 50, 50, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.URSARING, 2, false, false, false, "Hibernator Pokémon", PokemonType.NORMAL, null, 1.8, 125.8, Abilities.GUTS, Abilities.QUICK_FEET, Abilities.UNNERVE, 500, 90, 130, 75, 75, 75, 55, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.SLUGMA, 2, false, false, false, "Lava Pokémon", PokemonType.FIRE, null, 0.7, 35, Abilities.MAGMA_ARMOR, Abilities.FLAME_BODY, Abilities.WEAK_ARMOR, 250, 40, 40, 40, 70, 40, 20, 190, 70, 50, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MAGCARGO, 2, false, false, false, "Lava Pokémon", PokemonType.FIRE, PokemonType.ROCK, 0.8, 55, Abilities.MAGMA_ARMOR, Abilities.FLAME_BODY, Abilities.WEAK_ARMOR, 430, 60, 50, 120, 90, 80, 30, 75, 70, 151, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SWINUB, 2, false, false, false, "Pig Pokémon", PokemonType.ICE, PokemonType.GROUND, 0.4, 6.5, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 250, 50, 50, 40, 30, 30, 50, 225, 50, 50, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PILOSWINE, 2, false, false, false, "Swine Pokémon", PokemonType.ICE, PokemonType.GROUND, 1.1, 55.8, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 450, 100, 100, 80, 60, 60, 50, 75, 50, 158, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.CORSOLA, 2, false, false, false, "Coral Pokémon", PokemonType.WATER, PokemonType.ROCK, 0.6, 5, Abilities.HUSTLE, Abilities.NATURAL_CURE, Abilities.REGENERATOR, 410, 65, 55, 95, 65, 95, 35, 60, 50, 144, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.REMORAID, 2, false, false, false, "Jet Pokémon", PokemonType.WATER, null, 0.6, 12, Abilities.HUSTLE, Abilities.SNIPER, Abilities.MOODY, 300, 35, 65, 35, 65, 35, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.OCTILLERY, 2, false, false, false, "Jet Pokémon", PokemonType.WATER, null, 0.9, 28.5, Abilities.SUCTION_CUPS, Abilities.SNIPER, Abilities.MOODY, 480, 75, 105, 75, 105, 75, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.DELIBIRD, 2, false, false, false, "Delivery Pokémon", PokemonType.ICE, PokemonType.FLYING, 0.9, 16, Abilities.VITAL_SPIRIT, Abilities.HUSTLE, Abilities.INSOMNIA, 330, 45, 55, 45, 65, 45, 75, 45, 50, 116, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.MANTINE, 2, false, false, false, "Kite Pokémon", PokemonType.WATER, PokemonType.FLYING, 2.1, 220, Abilities.SWIFT_SWIM, Abilities.WATER_ABSORB, Abilities.WATER_VEIL, 485, 85, 40, 70, 80, 140, 70, 25, 50, 170, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SKARMORY, 2, false, false, false, "Armor Bird Pokémon", PokemonType.STEEL, PokemonType.FLYING, 1.7, 50.5, Abilities.KEEN_EYE, Abilities.STURDY, Abilities.WEAK_ARMOR, 465, 65, 80, 140, 40, 70, 70, 25, 50, 163, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HOUNDOUR, 2, false, false, false, "Dark Pokémon", PokemonType.DARK, PokemonType.FIRE, 0.6, 10.8, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 330, 45, 60, 30, 80, 50, 65, 120, 35, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HOUNDOOM, 2, false, false, false, "Dark Pokémon", PokemonType.DARK, PokemonType.FIRE, 1.4, 35, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.FIRE, 1.4, 35, Abilities.EARLY_BIRD, Abilities.FLASH_FIRE, Abilities.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DARK, PokemonType.FIRE, 1.9, 49.5, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, 600, 75, 90, 90, 140, 90, 115, 45, 35, 175, true), + ), + new PokemonSpecies(Species.KINGDRA, 2, false, false, false, "Dragon Pokémon", PokemonType.WATER, PokemonType.DRAGON, 1.8, 152, Abilities.SWIFT_SWIM, Abilities.SNIPER, Abilities.DAMP, 540, 75, 95, 95, 95, 95, 85, 45, 50, 270, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PHANPY, 2, false, false, false, "Long Nose Pokémon", PokemonType.GROUND, null, 0.5, 33.5, Abilities.PICKUP, Abilities.NONE, Abilities.SAND_VEIL, 330, 90, 60, 60, 40, 40, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DONPHAN, 2, false, false, false, "Armor Pokémon", PokemonType.GROUND, null, 1.1, 120, Abilities.STURDY, Abilities.NONE, Abilities.SAND_VEIL, 500, 90, 120, 120, 60, 60, 50, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.PORYGON2, 2, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.6, 32.5, Abilities.TRACE, Abilities.DOWNLOAD, Abilities.ANALYTIC, 515, 85, 80, 90, 105, 95, 60, 45, 50, 180, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.STANTLER, 2, false, false, false, "Big Horn Pokémon", PokemonType.NORMAL, null, 1.4, 71.2, Abilities.INTIMIDATE, Abilities.FRISK, Abilities.SAP_SIPPER, 465, 73, 95, 62, 85, 65, 85, 45, 70, 163, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SMEARGLE, 2, false, false, false, "Painter Pokémon", PokemonType.NORMAL, null, 1.2, 58, Abilities.OWN_TEMPO, Abilities.TECHNICIAN, Abilities.MOODY, 250, 55, 20, 35, 20, 45, 75, 45, 70, 88, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.TYROGUE, 2, false, false, false, "Scuffle Pokémon", PokemonType.FIGHTING, null, 0.7, 21, Abilities.GUTS, Abilities.STEADFAST, Abilities.VITAL_SPIRIT, 210, 35, 35, 35, 35, 35, 35, 75, 50, 42, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.HITMONTOP, 2, false, false, false, "Handstand Pokémon", PokemonType.FIGHTING, null, 1.4, 48, Abilities.INTIMIDATE, Abilities.TECHNICIAN, Abilities.STEADFAST, 455, 50, 95, 95, 35, 110, 70, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.SMOOCHUM, 2, false, false, false, "Kiss Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 0.4, 6, Abilities.OBLIVIOUS, Abilities.FOREWARN, Abilities.HYDRATION, 305, 45, 30, 15, 85, 65, 65, 45, 50, 61, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.ELEKID, 2, false, false, false, "Electric Pokémon", PokemonType.ELECTRIC, null, 0.6, 23.5, Abilities.STATIC, Abilities.NONE, Abilities.VITAL_SPIRIT, 360, 45, 63, 37, 65, 55, 95, 45, 50, 72, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.MAGBY, 2, false, false, false, "Live Coal Pokémon", PokemonType.FIRE, null, 0.7, 21.4, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 365, 45, 75, 37, 70, 55, 83, 45, 50, 73, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.MILTANK, 2, false, false, false, "Milk Cow Pokémon", PokemonType.NORMAL, null, 1.2, 75.5, Abilities.THICK_FAT, Abilities.SCRAPPY, Abilities.SAP_SIPPER, 490, 95, 80, 105, 40, 70, 100, 45, 50, 172, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.BLISSEY, 2, false, false, false, "Happiness Pokémon", PokemonType.NORMAL, null, 1.5, 46.8, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 540, 255, 10, 10, 75, 135, 55, 30, 140, 608, GrowthRate.FAST, 0, false), + new PokemonSpecies(Species.RAIKOU, 2, true, false, false, "Thunder Pokémon", PokemonType.ELECTRIC, null, 1.9, 178, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 90, 85, 75, 115, 100, 115, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ENTEI, 2, true, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 2.1, 198, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 115, 115, 85, 90, 75, 100, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SUICUNE, 2, true, false, false, "Aurora Pokémon", PokemonType.WATER, null, 2, 187, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 100, 75, 115, 90, 115, 85, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.LARVITAR, 2, false, false, false, "Rock Skin Pokémon", PokemonType.ROCK, PokemonType.GROUND, 0.6, 72, Abilities.GUTS, Abilities.NONE, Abilities.SAND_VEIL, 300, 50, 64, 50, 45, 50, 41, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PUPITAR, 2, false, false, false, "Hard Shell Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1.2, 152, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 410, 70, 84, 70, 65, 70, 51, 45, 35, 144, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TYRANITAR, 2, false, false, false, "Armor Pokémon", PokemonType.ROCK, PokemonType.DARK, 2, 202, Abilities.SAND_STREAM, Abilities.NONE, Abilities.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.DARK, 2, 202, Abilities.SAND_STREAM, Abilities.NONE, Abilities.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ROCK, PokemonType.DARK, 2.5, 255, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_STREAM, 700, 100, 164, 150, 95, 120, 71, 45, 35, 300), + ), + new PokemonSpecies(Species.LUGIA, 2, false, true, false, "Diving Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 5.2, 216, Abilities.PRESSURE, Abilities.NONE, Abilities.MULTISCALE, 680, 106, 90, 130, 90, 154, 110, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.HO_OH, 2, false, true, false, "Rainbow Pokémon", PokemonType.FIRE, PokemonType.FLYING, 3.8, 199, Abilities.PRESSURE, Abilities.NONE, Abilities.REGENERATOR, 680, 106, 130, 90, 110, 154, 90, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CELEBI, 2, false, false, true, "Time Travel Pokémon", PokemonType.PSYCHIC, PokemonType.GRASS, 0.6, 5, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.TREECKO, 3, false, false, false, "Wood Gecko Pokémon", PokemonType.GRASS, null, 0.5, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 310, 40, 45, 35, 65, 55, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.GROVYLE, 3, false, false, false, "Wood Gecko Pokémon", PokemonType.GRASS, null, 0.9, 21.6, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 405, 50, 65, 45, 85, 65, 95, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SCEPTILE, 3, false, false, false, "Forest Pokémon", PokemonType.GRASS, null, 1.7, 52.2, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, null, 1.7, 52.2, Abilities.OVERGROW, Abilities.NONE, Abilities.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.DRAGON, 1.9, 55.2, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.LIGHTNING_ROD, 630, 70, 110, 75, 145, 85, 145, 45, 50, 265), + ), + new PokemonSpecies(Species.TORCHIC, 3, false, false, false, "Chick Pokémon", PokemonType.FIRE, null, 0.4, 2.5, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 310, 45, 60, 40, 70, 50, 45, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(Species.COMBUSKEN, 3, false, false, false, "Young Fowl Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 0.9, 19.5, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 405, 60, 85, 60, 85, 60, 55, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(Species.BLAZIKEN, 3, false, false, false, "Blaze Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, true, true, + new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, Abilities.BLAZE, Abilities.NONE, Abilities.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 630, 80, 160, 80, 130, 80, 100, 45, 50, 265, true), + ), + new PokemonSpecies(Species.MUDKIP, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, null, 0.4, 7.6, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 310, 50, 70, 50, 50, 50, 40, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MARSHTOMP, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.7, 28, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 405, 70, 85, 70, 60, 70, 50, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SWAMPERT, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.5, 81.9, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.GROUND, 1.5, 81.9, Abilities.TORRENT, Abilities.NONE, Abilities.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.GROUND, 1.9, 102, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.SWIFT_SWIM, 635, 100, 150, 110, 95, 110, 70, 45, 50, 268), + ), + new PokemonSpecies(Species.POOCHYENA, 3, false, false, false, "Bite Pokémon", PokemonType.DARK, null, 0.5, 13.6, Abilities.RUN_AWAY, Abilities.QUICK_FEET, Abilities.RATTLED, 220, 35, 55, 35, 30, 30, 35, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MIGHTYENA, 3, false, false, false, "Bite Pokémon", PokemonType.DARK, null, 1, 37, Abilities.INTIMIDATE, Abilities.QUICK_FEET, Abilities.MOXIE, 420, 70, 90, 70, 60, 60, 70, 127, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ZIGZAGOON, 3, false, false, false, "Tiny Raccoon Pokémon", PokemonType.NORMAL, null, 0.4, 17.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LINOONE, 3, false, false, false, "Rushing Pokémon", PokemonType.NORMAL, null, 0.5, 32.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WURMPLE, 3, false, false, false, "Worm Pokémon", PokemonType.BUG, null, 0.3, 3.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 45, 35, 20, 30, 20, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SILCOON, 3, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEAUTIFLY, 3, false, false, false, "Butterfly Pokémon", PokemonType.BUG, PokemonType.FLYING, 1, 28.4, Abilities.SWARM, Abilities.NONE, Abilities.RIVALRY, 395, 60, 70, 50, 100, 50, 65, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.CASCOON, 3, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.7, 11.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUSTOX, 3, false, false, false, "Poison Moth Pokémon", PokemonType.BUG, PokemonType.POISON, 1.2, 31.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.COMPOUND_EYES, 385, 60, 50, 70, 50, 90, 65, 45, 70, 193, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.LOTAD, 3, false, false, false, "Water Weed Pokémon", PokemonType.WATER, PokemonType.GRASS, 0.5, 2.6, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 220, 40, 30, 30, 40, 50, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LOMBRE, 3, false, false, false, "Jolly Pokémon", PokemonType.WATER, PokemonType.GRASS, 1.2, 32.5, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 340, 60, 50, 50, 60, 70, 50, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LUDICOLO, 3, false, false, false, "Carefree Pokémon", PokemonType.WATER, PokemonType.GRASS, 1.5, 55, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 480, 80, 70, 70, 90, 100, 70, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SEEDOT, 3, false, false, false, "Acorn Pokémon", PokemonType.GRASS, null, 0.5, 4, Abilities.CHLOROPHYLL, Abilities.EARLY_BIRD, Abilities.PICKPOCKET, 220, 40, 40, 50, 30, 30, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.NUZLEAF, 3, false, false, false, "Wily Pokémon", PokemonType.GRASS, PokemonType.DARK, 1, 28, Abilities.CHLOROPHYLL, Abilities.EARLY_BIRD, Abilities.PICKPOCKET, 340, 70, 70, 40, 60, 40, 60, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SHIFTRY, 3, false, false, false, "Wicked Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.3, 59.6, Abilities.CHLOROPHYLL, Abilities.WIND_RIDER, Abilities.PICKPOCKET, 480, 90, 100, 60, 90, 60, 80, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.TAILLOW, 3, false, false, false, "Tiny Swallow Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2.3, Abilities.GUTS, Abilities.NONE, Abilities.SCRAPPY, 270, 40, 55, 30, 30, 30, 85, 200, 70, 54, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SWELLOW, 3, false, false, false, "Swallow Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.7, 19.8, Abilities.GUTS, Abilities.NONE, Abilities.SCRAPPY, 455, 60, 85, 60, 75, 50, 125, 45, 70, 159, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WINGULL, 3, false, false, false, "Seagull Pokémon", PokemonType.WATER, PokemonType.FLYING, 0.6, 9.5, Abilities.KEEN_EYE, Abilities.HYDRATION, Abilities.RAIN_DISH, 270, 40, 30, 30, 55, 30, 85, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PELIPPER, 3, false, false, false, "Water Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 1.2, 28, Abilities.KEEN_EYE, Abilities.DRIZZLE, Abilities.RAIN_DISH, 440, 60, 50, 100, 95, 70, 65, 45, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RALTS, 3, false, false, false, "Feeling Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.4, 6.6, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 198, 28, 25, 25, 45, 35, 40, 235, 35, 40, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.KIRLIA, 3, false, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.8, 20.2, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 278, 38, 35, 35, 65, 55, 50, 120, 35, 97, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GARDEVOIR, 3, false, false, false, "Embrace Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, Abilities.SYNCHRONIZE, Abilities.TRACE, Abilities.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, Abilities.PIXILATE, Abilities.PIXILATE, Abilities.PIXILATE, 618, 68, 85, 65, 165, 135, 100, 45, 35, 259), + ), + new PokemonSpecies(Species.SURSKIT, 3, false, false, false, "Pond Skater Pokémon", PokemonType.BUG, PokemonType.WATER, 0.5, 1.7, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.RAIN_DISH, 269, 40, 30, 32, 50, 52, 65, 200, 70, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MASQUERAIN, 3, false, false, false, "Eyeball Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.8, 3.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.UNNERVE, 454, 70, 60, 62, 100, 82, 80, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SHROOMISH, 3, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, null, 0.4, 4.5, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.QUICK_FEET, 295, 60, 40, 60, 40, 60, 35, 255, 70, 59, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.BRELOOM, 3, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.2, 39.2, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.TECHNICIAN, 460, 60, 130, 80, 60, 60, 70, 90, 70, 161, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.SLAKOTH, 3, false, false, false, "Slacker Pokémon", PokemonType.NORMAL, null, 0.8, 24, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(Species.VIGOROTH, 3, false, false, false, "Wild Monkey Pokémon", PokemonType.NORMAL, null, 1.4, 46.5, Abilities.VITAL_SPIRIT, Abilities.NONE, Abilities.INSOMNIA, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(Species.SLAKING, 3, false, false, false, "Lazy Pokémon", PokemonType.NORMAL, null, 2, 130.5, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 670, 150, 160, 100, 95, 65, 100, 45, 70, 285, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(Species.NINCADA, 3, false, false, false, "Trainee Pokémon", PokemonType.BUG, PokemonType.GROUND, 0.5, 5.5, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.RUN_AWAY, 266, 31, 45, 90, 30, 30, 40, 255, 50, 53, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.NINJASK, 3, false, false, false, "Ninja Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.8, 12, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.INFILTRATOR, 456, 61, 90, 45, 50, 50, 160, 120, 50, 160, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.SHEDINJA, 3, false, false, false, "Shed Pokémon", PokemonType.BUG, PokemonType.GHOST, 0.8, 1.2, Abilities.WONDER_GUARD, Abilities.NONE, Abilities.NONE, 236, 1, 90, 45, 30, 30, 40, 45, 50, 83, GrowthRate.ERRATIC, null, false), + new PokemonSpecies(Species.WHISMUR, 3, false, false, false, "Whisper Pokémon", PokemonType.NORMAL, null, 0.6, 16.3, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.RATTLED, 240, 64, 51, 23, 51, 23, 28, 190, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LOUDRED, 3, false, false, false, "Big Voice Pokémon", PokemonType.NORMAL, null, 1, 40.5, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.SCRAPPY, 360, 84, 71, 43, 71, 43, 48, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.EXPLOUD, 3, false, false, false, "Loud Noise Pokémon", PokemonType.NORMAL, null, 1.5, 84, Abilities.SOUNDPROOF, Abilities.NONE, Abilities.SCRAPPY, 490, 104, 91, 63, 91, 73, 68, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MAKUHITA, 3, false, false, false, "Guts Pokémon", PokemonType.FIGHTING, null, 1, 86.4, Abilities.THICK_FAT, Abilities.GUTS, Abilities.SHEER_FORCE, 237, 72, 60, 30, 20, 30, 25, 180, 70, 47, GrowthRate.FLUCTUATING, 75, false), + new PokemonSpecies(Species.HARIYAMA, 3, false, false, false, "Arm Thrust Pokémon", PokemonType.FIGHTING, null, 2.3, 253.8, Abilities.THICK_FAT, Abilities.GUTS, Abilities.SHEER_FORCE, 474, 144, 120, 60, 40, 60, 50, 200, 70, 166, GrowthRate.FLUCTUATING, 75, false), + new PokemonSpecies(Species.AZURILL, 3, false, false, false, "Polka Dot Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.2, 2, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 190, 50, 20, 40, 20, 40, 20, 150, 50, 38, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.NOSEPASS, 3, false, false, false, "Compass Pokémon", PokemonType.ROCK, null, 1, 97, Abilities.STURDY, Abilities.MAGNET_PULL, Abilities.SAND_FORCE, 375, 30, 45, 135, 45, 90, 30, 255, 70, 75, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SKITTY, 3, false, false, false, "Kitten Pokémon", PokemonType.NORMAL, null, 0.6, 11, Abilities.CUTE_CHARM, Abilities.NORMALIZE, Abilities.WONDER_SKIN, 260, 50, 45, 45, 35, 35, 50, 255, 70, 52, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.DELCATTY, 3, false, false, false, "Prim Pokémon", PokemonType.NORMAL, null, 1.1, 32.6, Abilities.CUTE_CHARM, Abilities.NORMALIZE, Abilities.WONDER_SKIN, 400, 70, 65, 65, 55, 55, 90, 60, 70, 140, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.SABLEYE, 3, false, false, false, "Darkness Pokémon", PokemonType.DARK, PokemonType.GHOST, 0.5, 11, Abilities.KEEN_EYE, Abilities.STALL, Abilities.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.GHOST, 0.5, 11, Abilities.KEEN_EYE, Abilities.STALL, Abilities.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DARK, PokemonType.GHOST, 0.5, 161, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 480, 50, 85, 125, 85, 115, 20, 45, 35, 133), + ), + new PokemonSpecies(Species.MAWILE, 3, false, false, false, "Deceiver Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.INTIMIDATE, Abilities.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, GrowthRate.FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.FAIRY, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.INTIMIDATE, Abilities.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, PokemonType.FAIRY, 1, 23.5, Abilities.HUGE_POWER, Abilities.HUGE_POWER, Abilities.HUGE_POWER, 480, 50, 105, 125, 55, 95, 50, 45, 50, 133), + ), + new PokemonSpecies(Species.ARON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 0.4, 60, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 330, 50, 70, 100, 40, 40, 30, 180, 35, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.LAIRON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 0.9, 120, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 430, 60, 90, 140, 50, 50, 40, 90, 35, 151, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.AGGRON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 2.1, 360, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.ROCK, 2.1, 360, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, null, 2.2, 395, Abilities.FILTER, Abilities.FILTER, Abilities.FILTER, 630, 70, 140, 230, 60, 80, 50, 45, 35, 265), + ), + new PokemonSpecies(Species.MEDITITE, 3, false, false, false, "Meditate Pokémon", PokemonType.FIGHTING, PokemonType.PSYCHIC, 0.6, 11.2, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 280, 30, 40, 55, 40, 55, 60, 180, 70, 56, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.MEDICHAM, 3, false, false, false, "Meditate Pokémon", PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, Abilities.PURE_POWER, Abilities.NONE, Abilities.PURE_POWER, 510, 60, 100, 85, 80, 85, 100, 90, 70, 144, true), + ), + new PokemonSpecies(Species.ELECTRIKE, 3, false, false, false, "Lightning Pokémon", PokemonType.ELECTRIC, null, 0.6, 15.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 295, 40, 45, 40, 65, 40, 65, 120, 50, 59, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.MANECTRIC, 3, false, false, false, "Discharge Pokémon", PokemonType.ELECTRIC, null, 1.5, 40.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 1.5, 40.2, Abilities.STATIC, Abilities.LIGHTNING_ROD, Abilities.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ELECTRIC, null, 1.8, 44, Abilities.INTIMIDATE, Abilities.INTIMIDATE, Abilities.INTIMIDATE, 575, 70, 75, 80, 135, 80, 135, 45, 50, 166), + ), + new PokemonSpecies(Species.PLUSLE, 3, false, false, false, "Cheering Pokémon", PokemonType.ELECTRIC, null, 0.4, 4.2, Abilities.PLUS, Abilities.NONE, Abilities.LIGHTNING_ROD, 405, 60, 50, 40, 85, 75, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MINUN, 3, false, false, false, "Cheering Pokémon", PokemonType.ELECTRIC, null, 0.4, 4.2, Abilities.MINUS, Abilities.NONE, Abilities.VOLT_ABSORB, 405, 60, 40, 50, 75, 85, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VOLBEAT, 3, false, false, false, "Firefly Pokémon", PokemonType.BUG, null, 0.7, 17.7, Abilities.ILLUMINATE, Abilities.SWARM, Abilities.PRANKSTER, 430, 65, 73, 75, 47, 85, 85, 150, 70, 151, GrowthRate.ERRATIC, 100, false), + new PokemonSpecies(Species.ILLUMISE, 3, false, false, false, "Firefly Pokémon", PokemonType.BUG, null, 0.6, 17.7, Abilities.OBLIVIOUS, Abilities.TINTED_LENS, Abilities.PRANKSTER, 430, 65, 47, 75, 73, 85, 85, 150, 70, 151, GrowthRate.FLUCTUATING, 0, false), + new PokemonSpecies(Species.ROSELIA, 3, false, false, false, "Thorn Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.3, 2, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.LEAF_GUARD, 400, 50, 60, 45, 100, 80, 65, 150, 50, 140, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.GULPIN, 3, false, false, false, "Stomach Pokémon", PokemonType.POISON, null, 0.4, 10.3, Abilities.LIQUID_OOZE, Abilities.STICKY_HOLD, Abilities.GLUTTONY, 302, 70, 43, 53, 43, 53, 40, 225, 70, 60, GrowthRate.FLUCTUATING, 50, true), + new PokemonSpecies(Species.SWALOT, 3, false, false, false, "Poison Bag Pokémon", PokemonType.POISON, null, 1.7, 80, Abilities.LIQUID_OOZE, Abilities.STICKY_HOLD, Abilities.GLUTTONY, 467, 100, 73, 83, 73, 83, 55, 75, 70, 163, GrowthRate.FLUCTUATING, 50, true), + new PokemonSpecies(Species.CARVANHA, 3, false, false, false, "Savage Pokémon", PokemonType.WATER, PokemonType.DARK, 0.8, 20.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 305, 45, 90, 20, 65, 20, 65, 225, 35, 61, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SHARPEDO, 3, false, false, false, "Brutal Pokémon", PokemonType.WATER, PokemonType.DARK, 1.8, 88.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DARK, 1.8, 88.8, Abilities.ROUGH_SKIN, Abilities.NONE, Abilities.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.DARK, 2.5, 130.3, Abilities.STRONG_JAW, Abilities.NONE, Abilities.STRONG_JAW, 560, 70, 140, 70, 110, 65, 105, 60, 35, 161), + ), + new PokemonSpecies(Species.WAILMER, 3, false, false, false, "Ball Whale Pokémon", PokemonType.WATER, null, 2, 130, Abilities.WATER_VEIL, Abilities.OBLIVIOUS, Abilities.PRESSURE, 400, 130, 70, 35, 70, 35, 60, 125, 50, 80, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.WAILORD, 3, false, false, false, "Float Whale Pokémon", PokemonType.WATER, null, 14.5, 398, Abilities.WATER_VEIL, Abilities.OBLIVIOUS, Abilities.PRESSURE, 500, 170, 90, 45, 90, 45, 60, 60, 50, 175, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.NUMEL, 3, false, false, false, "Numb Pokémon", PokemonType.FIRE, PokemonType.GROUND, 0.7, 24, Abilities.OBLIVIOUS, Abilities.SIMPLE, Abilities.OWN_TEMPO, 305, 60, 60, 40, 65, 45, 35, 255, 70, 61, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.CAMERUPT, 3, false, false, false, "Eruption Pokémon", PokemonType.FIRE, PokemonType.GROUND, 1.9, 220, Abilities.MAGMA_ARMOR, Abilities.SOLID_ROCK, Abilities.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.GROUND, 1.9, 220, Abilities.MAGMA_ARMOR, Abilities.SOLID_ROCK, Abilities.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIRE, PokemonType.GROUND, 2.5, 320.5, Abilities.SHEER_FORCE, Abilities.SHEER_FORCE, Abilities.SHEER_FORCE, 560, 70, 120, 100, 145, 105, 20, 150, 70, 161), + ), + new PokemonSpecies(Species.TORKOAL, 3, false, false, false, "Coal Pokémon", PokemonType.FIRE, null, 0.5, 80.4, Abilities.WHITE_SMOKE, Abilities.DROUGHT, Abilities.SHELL_ARMOR, 470, 70, 85, 140, 85, 70, 20, 90, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SPOINK, 3, false, false, false, "Bounce Pokémon", PokemonType.PSYCHIC, null, 0.7, 30.6, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.GLUTTONY, 330, 60, 25, 35, 70, 80, 60, 255, 70, 66, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.GRUMPIG, 3, false, false, false, "Manipulate Pokémon", PokemonType.PSYCHIC, null, 0.9, 71.5, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.GLUTTONY, 470, 80, 45, 65, 90, 110, 80, 60, 70, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.SPINDA, 3, false, false, false, "Spot Panda Pokémon", PokemonType.NORMAL, null, 1.1, 5, Abilities.OWN_TEMPO, Abilities.TANGLED_FEET, Abilities.CONTRARY, 360, 60, 60, 60, 60, 60, 60, 255, 70, 126, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.TRAPINCH, 3, false, false, false, "Ant Pit Pokémon", PokemonType.GROUND, null, 0.7, 15, Abilities.HYPER_CUTTER, Abilities.ARENA_TRAP, Abilities.SHEER_FORCE, 290, 45, 100, 45, 45, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.VIBRAVA, 3, false, false, false, "Vibration Pokémon", PokemonType.GROUND, PokemonType.DRAGON, 1.1, 15.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 340, 50, 70, 50, 50, 50, 70, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.FLYGON, 3, false, false, false, "Mystic Pokémon", PokemonType.GROUND, PokemonType.DRAGON, 2, 82, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 80, 100, 80, 80, 80, 100, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CACNEA, 3, false, false, false, "Cactus Pokémon", PokemonType.GRASS, null, 0.4, 51.3, Abilities.SAND_VEIL, Abilities.NONE, Abilities.WATER_ABSORB, 335, 50, 85, 40, 85, 40, 35, 190, 35, 67, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CACTURNE, 3, false, false, false, "Scarecrow Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.3, 77.4, Abilities.SAND_VEIL, Abilities.NONE, Abilities.WATER_ABSORB, 475, 70, 115, 60, 115, 60, 55, 60, 35, 166, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SWABLU, 3, false, false, false, "Cotton Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.4, 1.2, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 310, 45, 40, 60, 40, 75, 50, 255, 50, 62, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.ALTARIA, 3, false, false, false, "Humming Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 1.1, 20.6, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, GrowthRate.ERRATIC, 50, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 1.1, 20.6, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FAIRY, 1.5, 20.6, Abilities.PIXILATE, Abilities.NONE, Abilities.PIXILATE, 590, 75, 110, 110, 110, 105, 80, 45, 50, 172), + ), + new PokemonSpecies(Species.ZANGOOSE, 3, false, false, false, "Cat Ferret Pokémon", PokemonType.NORMAL, null, 1.3, 40.3, Abilities.IMMUNITY, Abilities.NONE, Abilities.TOXIC_BOOST, 458, 73, 115, 60, 60, 60, 90, 90, 70, 160, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.SEVIPER, 3, false, false, false, "Fang Snake Pokémon", PokemonType.POISON, null, 2.7, 52.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.INFILTRATOR, 458, 73, 100, 60, 100, 60, 65, 90, 70, 160, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.LUNATONE, 3, false, false, false, "Meteorite Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1, 168, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 460, 90, 55, 65, 95, 85, 70, 45, 50, 161, GrowthRate.FAST, null, false), + new PokemonSpecies(Species.SOLROCK, 3, false, false, false, "Meteorite Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1.2, 154, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 460, 90, 95, 85, 55, 65, 70, 45, 50, 161, GrowthRate.FAST, null, false), + new PokemonSpecies(Species.BARBOACH, 3, false, false, false, "Whiskers Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.4, 1.9, Abilities.OBLIVIOUS, Abilities.ANTICIPATION, Abilities.HYDRATION, 288, 50, 48, 43, 46, 41, 60, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WHISCASH, 3, false, false, false, "Whiskers Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.9, 23.6, Abilities.OBLIVIOUS, Abilities.ANTICIPATION, Abilities.HYDRATION, 468, 110, 78, 73, 76, 71, 60, 75, 50, 164, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CORPHISH, 3, false, false, false, "Ruffian Pokémon", PokemonType.WATER, null, 0.6, 11.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.ADAPTABILITY, 308, 43, 80, 65, 50, 35, 35, 205, 50, 62, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.CRAWDAUNT, 3, false, false, false, "Rogue Pokémon", PokemonType.WATER, PokemonType.DARK, 1.1, 32.8, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.ADAPTABILITY, 468, 63, 120, 85, 90, 55, 55, 155, 50, 164, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.BALTOY, 3, false, false, false, "Clay Doll Pokémon", PokemonType.GROUND, PokemonType.PSYCHIC, 0.5, 21.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 300, 40, 40, 55, 40, 70, 55, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.CLAYDOL, 3, false, false, false, "Clay Doll Pokémon", PokemonType.GROUND, PokemonType.PSYCHIC, 1.5, 108, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 500, 60, 70, 105, 70, 120, 75, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.LILEEP, 3, false, false, false, "Sea Lily Pokémon", PokemonType.ROCK, PokemonType.GRASS, 1, 23.8, Abilities.SUCTION_CUPS, Abilities.NONE, Abilities.STORM_DRAIN, 355, 66, 41, 77, 61, 87, 23, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.CRADILY, 3, false, false, false, "Barnacle Pokémon", PokemonType.ROCK, PokemonType.GRASS, 1.5, 60.4, Abilities.SUCTION_CUPS, Abilities.NONE, Abilities.STORM_DRAIN, 495, 86, 81, 97, 81, 107, 43, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.ANORITH, 3, false, false, false, "Old Shrimp Pokémon", PokemonType.ROCK, PokemonType.BUG, 0.7, 12.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.SWIFT_SWIM, 355, 45, 95, 50, 40, 50, 75, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.ARMALDO, 3, false, false, false, "Plate Pokémon", PokemonType.ROCK, PokemonType.BUG, 1.5, 68.2, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.SWIFT_SWIM, 495, 75, 125, 100, 70, 80, 45, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.FEEBAS, 3, false, false, false, "Fish Pokémon", PokemonType.WATER, null, 0.6, 7.4, Abilities.SWIFT_SWIM, Abilities.OBLIVIOUS, Abilities.ADAPTABILITY, 200, 20, 15, 20, 10, 55, 80, 255, 50, 40, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.MILOTIC, 3, false, false, false, "Tender Pokémon", PokemonType.WATER, null, 6.2, 162, Abilities.MARVEL_SCALE, Abilities.COMPETITIVE, Abilities.CUTE_CHARM, 540, 95, 60, 79, 100, 125, 81, 60, 50, 189, GrowthRate.ERRATIC, 50, true), + new PokemonSpecies(Species.CASTFORM, 3, false, false, false, "Weather Pokémon", PokemonType.NORMAL, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal Form", "", PokemonType.NORMAL, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, false, null, true), + new PokemonForm("Sunny Form", "sunny", PokemonType.FIRE, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), + new PokemonForm("Rainy Form", "rainy", PokemonType.WATER, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), + new PokemonForm("Snowy Form", "snowy", PokemonType.ICE, null, 0.3, 0.8, Abilities.FORECAST, Abilities.NONE, Abilities.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), + ), + new PokemonSpecies(Species.KECLEON, 3, false, false, false, "Color Swap Pokémon", PokemonType.NORMAL, null, 1, 22, Abilities.COLOR_CHANGE, Abilities.NONE, Abilities.PROTEAN, 440, 60, 90, 70, 60, 120, 40, 200, 70, 154, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SHUPPET, 3, false, false, false, "Puppet Pokémon", PokemonType.GHOST, null, 0.6, 2.3, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 295, 44, 75, 35, 63, 33, 45, 225, 35, 59, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.BANETTE, 3, false, false, false, "Marionette Pokémon", PokemonType.GHOST, null, 1.1, 12.5, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, GrowthRate.FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GHOST, null, 1.1, 12.5, Abilities.INSOMNIA, Abilities.FRISK, Abilities.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GHOST, null, 1.2, 13, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 555, 64, 165, 75, 93, 83, 75, 45, 35, 159), + ), + new PokemonSpecies(Species.DUSKULL, 3, false, false, false, "Requiem Pokémon", PokemonType.GHOST, null, 0.8, 15, Abilities.LEVITATE, Abilities.NONE, Abilities.FRISK, 295, 20, 40, 90, 30, 90, 25, 190, 35, 59, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.DUSCLOPS, 3, false, false, false, "Beckon Pokémon", PokemonType.GHOST, null, 1.6, 30.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 455, 40, 70, 130, 60, 130, 25, 90, 35, 159, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.TROPIUS, 3, false, false, false, "Fruit Pokémon", PokemonType.GRASS, PokemonType.FLYING, 2, 100, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.HARVEST, 460, 99, 68, 83, 72, 87, 51, 200, 70, 161, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CHIMECHO, 3, false, false, false, "Wind Chime Pokémon", PokemonType.PSYCHIC, null, 0.6, 1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 455, 75, 50, 80, 95, 90, 65, 45, 70, 159, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.ABSOL, 3, false, false, false, "Disaster Pokémon", PokemonType.DARK, null, 1.2, 47, Abilities.PRESSURE, Abilities.SUPER_LUCK, Abilities.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.DARK, null, 1.2, 47, Abilities.PRESSURE, Abilities.SUPER_LUCK, Abilities.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DARK, null, 1.2, 49, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 565, 65, 150, 60, 115, 60, 115, 30, 35, 163), + ), + new PokemonSpecies(Species.WYNAUT, 3, false, false, false, "Bright Pokémon", PokemonType.PSYCHIC, null, 0.6, 14, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.TELEPATHY, 260, 95, 23, 48, 23, 48, 23, 125, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SNORUNT, 3, false, false, false, "Snow Hat Pokémon", PokemonType.ICE, null, 0.7, 16.8, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 300, 50, 50, 50, 50, 50, 50, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GLALIE, 3, false, false, false, "Face Pokémon", PokemonType.ICE, null, 1.5, 256.5, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ICE, null, 1.5, 256.5, Abilities.INNER_FOCUS, Abilities.ICE_BODY, Abilities.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ICE, null, 2.1, 350.2, Abilities.REFRIGERATE, Abilities.REFRIGERATE, Abilities.REFRIGERATE, 580, 80, 120, 80, 120, 80, 100, 75, 50, 168), + ), + new PokemonSpecies(Species.SPHEAL, 3, false, false, false, "Clap Pokémon", PokemonType.ICE, PokemonType.WATER, 0.8, 39.5, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 290, 70, 40, 50, 55, 50, 25, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SEALEO, 3, false, false, false, "Ball Roll Pokémon", PokemonType.ICE, PokemonType.WATER, 1.1, 87.6, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 410, 90, 60, 70, 75, 70, 45, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WALREIN, 3, false, false, false, "Ice Break Pokémon", PokemonType.ICE, PokemonType.WATER, 1.4, 150.6, Abilities.THICK_FAT, Abilities.ICE_BODY, Abilities.OBLIVIOUS, 530, 110, 80, 90, 95, 90, 65, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CLAMPERL, 3, false, false, false, "Bivalve Pokémon", PokemonType.WATER, null, 0.4, 52.5, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.RATTLED, 345, 35, 64, 85, 74, 55, 32, 255, 70, 69, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.HUNTAIL, 3, false, false, false, "Deep Sea Pokémon", PokemonType.WATER, null, 1.7, 27, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 485, 55, 104, 105, 94, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.GOREBYSS, 3, false, false, false, "South Sea Pokémon", PokemonType.WATER, null, 1.8, 22.6, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.HYDRATION, 485, 55, 84, 105, 114, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.RELICANTH, 3, false, false, false, "Longevity Pokémon", PokemonType.WATER, PokemonType.ROCK, 1, 23.4, Abilities.SWIFT_SWIM, Abilities.ROCK_HEAD, Abilities.STURDY, 485, 100, 90, 130, 45, 65, 55, 25, 50, 170, GrowthRate.SLOW, 87.5, true), + new PokemonSpecies(Species.LUVDISC, 3, false, false, false, "Rendezvous Pokémon", PokemonType.WATER, null, 0.6, 8.7, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.HYDRATION, 330, 43, 30, 55, 40, 65, 97, 225, 70, 116, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.BAGON, 3, false, false, false, "Rock Head Pokémon", PokemonType.DRAGON, null, 0.6, 42.1, Abilities.ROCK_HEAD, Abilities.NONE, Abilities.SHEER_FORCE, 300, 45, 75, 60, 40, 30, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SHELGON, 3, false, false, false, "Endurance Pokémon", PokemonType.DRAGON, null, 1.1, 110.5, Abilities.ROCK_HEAD, Abilities.NONE, Abilities.OVERCOAT, 420, 65, 95, 100, 60, 50, 50, 45, 35, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SALAMENCE, 3, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 1.5, 102.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 1.5, 102.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FLYING, 1.8, 112.6, Abilities.AERILATE, Abilities.NONE, Abilities.AERILATE, 700, 95, 145, 130, 120, 90, 120, 45, 35, 300), + ), + new PokemonSpecies(Species.BELDUM, 3, false, false, false, "Iron Ball Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.6, 95.2, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 300, 40, 55, 80, 35, 60, 30, 45, 35, 60, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Frigibax + new PokemonSpecies(Species.METANG, 3, false, false, false, "Iron Claw Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.2, 202.5, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 420, 60, 75, 100, 55, 80, 50, 25, 35, 147, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Arctibax + new PokemonSpecies(Species.METAGROSS, 3, false, false, false, "Iron Leg Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 550, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 10, 35, 300, GrowthRate.SLOW, null, false, true, //Custom Catchrate, matching Baxcalibur + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 550, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 3, 35, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, PokemonType.PSYCHIC, 2.5, 942.9, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 700, 80, 145, 150, 105, 110, 110, 3, 35, 300), + ), + new PokemonSpecies(Species.REGIROCK, 3, true, false, false, "Rock Peak Pokémon", PokemonType.ROCK, null, 1.7, 230, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.STURDY, 580, 80, 100, 200, 50, 100, 50, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.REGICE, 3, true, false, false, "Iceberg Pokémon", PokemonType.ICE, null, 1.8, 175, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.ICE_BODY, 580, 80, 50, 100, 100, 200, 50, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.REGISTEEL, 3, true, false, false, "Iron Pokémon", PokemonType.STEEL, null, 1.9, 205, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.LIGHT_METAL, 580, 80, 75, 150, 75, 150, 50, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.LATIAS, 3, true, false, false, "Eon Pokémon", PokemonType.DRAGON, PokemonType.PSYCHIC, 1.4, 40, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, GrowthRate.SLOW, 0, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.PSYCHIC, 1.4, 40, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.PSYCHIC, 1.8, 52, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 700, 80, 100, 120, 140, 150, 110, 3, 90, 300), + ), + new PokemonSpecies(Species.LATIOS, 3, true, false, false, "Eon Pokémon", PokemonType.DRAGON, PokemonType.PSYCHIC, 2, 60, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.PSYCHIC, 2, 60, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.PSYCHIC, 2.3, 70, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 700, 80, 130, 100, 160, 120, 110, 3, 90, 300), + ), + new PokemonSpecies(Species.KYOGRE, 3, false, true, false, "Sea Basin Pokémon", PokemonType.WATER, null, 4.5, 352, Abilities.DRIZZLE, Abilities.NONE, Abilities.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 4.5, 352, Abilities.DRIZZLE, Abilities.NONE, Abilities.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, false, null, true), + new PokemonForm("Primal", "primal", PokemonType.WATER, null, 9.8, 430, Abilities.PRIMORDIAL_SEA, Abilities.NONE, Abilities.NONE, 770, 100, 150, 90, 180, 160, 90, 3, 0, 335), + ), + new PokemonSpecies(Species.GROUDON, 3, false, true, false, "Continent Pokémon", PokemonType.GROUND, null, 3.5, 950, Abilities.DROUGHT, Abilities.NONE, Abilities.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.GROUND, null, 3.5, 950, Abilities.DROUGHT, Abilities.NONE, Abilities.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, false, null, true), + new PokemonForm("Primal", "primal", PokemonType.GROUND, PokemonType.FIRE, 5, 999.7, Abilities.DESOLATE_LAND, Abilities.NONE, Abilities.NONE, 770, 100, 180, 160, 150, 90, 90, 3, 0, 335), + ), + new PokemonSpecies(Species.RAYQUAZA, 3, false, true, false, "Sky High Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 7, 206.5, Abilities.AIR_LOCK, Abilities.NONE, Abilities.NONE, 680, 105, 150, 90, 150, 90, 95, 45, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 7, 206.5, Abilities.AIR_LOCK, Abilities.NONE, Abilities.NONE, 680, 105, 150, 90, 150, 90, 95, 45, 0, 340, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FLYING, 10.8, 392, Abilities.DELTA_STREAM, Abilities.NONE, Abilities.NONE, 780, 105, 180, 100, 180, 100, 115, 45, 0, 340), + ), + new PokemonSpecies(Species.JIRACHI, 3, false, false, true, "Wish Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.3, 1.1, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DEOXYS, 3, false, false, true, "DNA Pokémon", PokemonType.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal Forme", "normal", PokemonType.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, false, "", true), + new PokemonForm("Attack Forme", "attack", PokemonType.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 180, 20, 180, 20, 150, 3, 0, 300), + new PokemonForm("Defense Forme", "defense", PokemonType.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 70, 160, 70, 160, 90, 3, 0, 300), + new PokemonForm("Speed Forme", "speed", PokemonType.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 95, 90, 95, 90, 180, 3, 0, 300), + ), + new PokemonSpecies(Species.TURTWIG, 4, false, false, false, "Tiny Leaf Pokémon", PokemonType.GRASS, null, 0.4, 10.2, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 318, 55, 68, 64, 45, 55, 31, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.GROTLE, 4, false, false, false, "Grove Pokémon", PokemonType.GRASS, null, 1.1, 97, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 405, 75, 89, 85, 55, 65, 36, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TORTERRA, 4, false, false, false, "Continent Pokémon", PokemonType.GRASS, PokemonType.GROUND, 2.2, 310, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 525, 95, 109, 105, 75, 85, 56, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CHIMCHAR, 4, false, false, false, "Chimp Pokémon", PokemonType.FIRE, null, 0.5, 6.2, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 309, 44, 58, 44, 58, 44, 61, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MONFERNO, 4, false, false, false, "Playful Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 0.9, 22, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 405, 64, 78, 52, 78, 52, 81, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.INFERNAPE, 4, false, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.2, 55, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 534, 76, 104, 71, 104, 71, 108, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PIPLUP, 4, false, false, false, "Penguin Pokémon", PokemonType.WATER, null, 0.4, 5.2, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 314, 53, 51, 53, 61, 56, 40, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PRINPLUP, 4, false, false, false, "Penguin Pokémon", PokemonType.WATER, null, 0.8, 23, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 405, 64, 66, 68, 81, 76, 50, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.EMPOLEON, 4, false, false, false, "Emperor Pokémon", PokemonType.WATER, PokemonType.STEEL, 1.7, 84.5, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 530, 84, 86, 88, 111, 101, 60, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.STARLY, 4, false, false, false, "Starling Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2, Abilities.KEEN_EYE, Abilities.NONE, Abilities.RECKLESS, 245, 40, 55, 30, 30, 30, 60, 255, 70, 49, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.STARAVIA, 4, false, false, false, "Starling Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 15.5, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 340, 55, 75, 50, 40, 40, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.STARAPTOR, 4, false, false, false, "Predator Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 24.9, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 485, 85, 120, 70, 50, 60, 100, 45, 70, 243, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.BIDOOF, 4, false, false, false, "Plump Mouse Pokémon", PokemonType.NORMAL, null, 0.5, 20, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 250, 59, 45, 40, 35, 40, 31, 255, 70, 50, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.BIBAREL, 4, false, false, false, "Beaver Pokémon", PokemonType.NORMAL, PokemonType.WATER, 1, 31.5, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 410, 79, 85, 60, 55, 60, 71, 127, 70, 144, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.KRICKETOT, 4, false, false, false, "Cricket Pokémon", PokemonType.BUG, null, 0.3, 2.2, Abilities.SHED_SKIN, Abilities.NONE, Abilities.RUN_AWAY, 194, 37, 25, 41, 25, 41, 25, 255, 70, 39, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.KRICKETUNE, 4, false, false, false, "Cricket Pokémon", PokemonType.BUG, null, 1, 25.5, Abilities.SWARM, Abilities.NONE, Abilities.TECHNICIAN, 384, 77, 85, 51, 55, 51, 65, 45, 70, 134, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.SHINX, 4, false, false, false, "Flash Pokémon", PokemonType.ELECTRIC, null, 0.5, 9.5, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 263, 45, 65, 34, 40, 34, 45, 235, 50, 53, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.LUXIO, 4, false, false, false, "Spark Pokémon", PokemonType.ELECTRIC, null, 0.9, 30.5, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 363, 60, 85, 49, 60, 49, 60, 120, 100, 127, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.LUXRAY, 4, false, false, false, "Gleam Eyes Pokémon", PokemonType.ELECTRIC, null, 1.4, 42, Abilities.RIVALRY, Abilities.INTIMIDATE, Abilities.GUTS, 523, 80, 120, 79, 95, 79, 70, 45, 50, 262, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.BUDEW, 4, false, false, false, "Bud Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.2, 1.2, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.LEAF_GUARD, 280, 40, 30, 35, 50, 70, 55, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ROSERADE, 4, false, false, false, "Bouquet Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.9, 14.5, Abilities.NATURAL_CURE, Abilities.POISON_POINT, Abilities.TECHNICIAN, 515, 60, 70, 65, 125, 105, 90, 75, 50, 258, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.CRANIDOS, 4, false, false, false, "Head Butt Pokémon", PokemonType.ROCK, null, 0.9, 31.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHEER_FORCE, 350, 67, 125, 40, 30, 30, 58, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.RAMPARDOS, 4, false, false, false, "Head Butt Pokémon", PokemonType.ROCK, null, 1.6, 102.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHEER_FORCE, 495, 97, 165, 60, 65, 50, 58, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.SHIELDON, 4, false, false, false, "Shield Pokémon", PokemonType.ROCK, PokemonType.STEEL, 0.5, 57, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 350, 30, 42, 118, 42, 88, 30, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.BASTIODON, 4, false, false, false, "Shield Pokémon", PokemonType.ROCK, PokemonType.STEEL, 1.3, 149.5, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 495, 60, 52, 168, 47, 138, 30, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(Species.BURMY, 4, false, false, false, "Bagworm Pokémon", PokemonType.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Plant Cloak", "plant", PokemonType.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), + new PokemonForm("Sandy Cloak", "sandy", PokemonType.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), + new PokemonForm("Trash Cloak", "trash", PokemonType.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), + ), + new PokemonSpecies(Species.WORMADAM, 4, false, false, false, "Bagworm Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, 0, false, false, + new PokemonForm("Plant Cloak", "plant", PokemonType.BUG, PokemonType.GRASS, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, false, null, true), + new PokemonForm("Sandy Cloak", "sandy", PokemonType.BUG, PokemonType.GROUND, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 79, 105, 59, 85, 36, 45, 70, 148, false, null, true), + new PokemonForm("Trash Cloak", "trash", PokemonType.BUG, PokemonType.STEEL, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 69, 95, 69, 95, 36, 45, 70, 148, false, null, true), + ), + new PokemonSpecies(Species.MOTHIM, 4, false, false, false, "Moth Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.9, 23.3, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 424, 70, 94, 50, 94, 50, 66, 45, 70, 148, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.COMBEE, 4, false, false, false, "Tiny Bee Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.3, 5.5, Abilities.HONEY_GATHER, Abilities.NONE, Abilities.HUSTLE, 244, 30, 30, 42, 30, 42, 70, 120, 50, 49, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(Species.VESPIQUEN, 4, false, false, false, "Beehive Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 38.5, Abilities.PRESSURE, Abilities.NONE, Abilities.UNNERVE, 474, 70, 80, 102, 80, 102, 40, 45, 50, 166, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.PACHIRISU, 4, false, false, false, "EleSquirrel Pokémon", PokemonType.ELECTRIC, null, 0.4, 3.9, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.VOLT_ABSORB, 405, 60, 45, 70, 45, 90, 95, 200, 100, 142, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.BUIZEL, 4, false, false, false, "Sea Weasel Pokémon", PokemonType.WATER, null, 0.7, 29.5, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 330, 55, 65, 35, 60, 30, 85, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.FLOATZEL, 4, false, false, false, "Sea Weasel Pokémon", PokemonType.WATER, null, 1.1, 33.5, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.WATER_VEIL, 495, 85, 105, 55, 85, 50, 115, 75, 70, 173, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.CHERUBI, 4, false, false, false, "Cherry Pokémon", PokemonType.GRASS, null, 0.4, 3.3, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.NONE, 275, 45, 35, 45, 62, 53, 35, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CHERRIM, 4, false, false, false, "Blossom Pokémon", PokemonType.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Overcast Form", "overcast", PokemonType.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, false, null, true), + new PokemonForm("Sunshine Form", "sunshine", PokemonType.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158), + ), + new PokemonSpecies(Species.SHELLOS, 4, false, false, false, "Sea Slug Pokémon", PokemonType.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("East Sea", "east", PokemonType.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), + new PokemonForm("West Sea", "west", PokemonType.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), + ), + new PokemonSpecies(Species.GASTRODON, 4, false, false, false, "Sea Slug Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("East Sea", "east", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), + new PokemonForm("West Sea", "west", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), + ), + new PokemonSpecies(Species.AMBIPOM, 4, false, false, false, "Long Tail Pokémon", PokemonType.NORMAL, null, 1.2, 20.3, Abilities.TECHNICIAN, Abilities.PICKUP, Abilities.SKILL_LINK, 482, 75, 100, 66, 60, 66, 115, 45, 100, 169, GrowthRate.FAST, 50, true), + new PokemonSpecies(Species.DRIFLOON, 4, false, false, false, "Balloon Pokémon", PokemonType.GHOST, PokemonType.FLYING, 0.4, 1.2, Abilities.AFTERMATH, Abilities.UNBURDEN, Abilities.FLARE_BOOST, 348, 90, 50, 34, 60, 44, 70, 125, 50, 70, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.DRIFBLIM, 4, false, false, false, "Blimp Pokémon", PokemonType.GHOST, PokemonType.FLYING, 1.2, 15, Abilities.AFTERMATH, Abilities.UNBURDEN, Abilities.FLARE_BOOST, 498, 150, 80, 44, 90, 54, 80, 60, 50, 174, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(Species.BUNEARY, 4, false, false, false, "Rabbit Pokémon", PokemonType.NORMAL, null, 0.4, 5.5, Abilities.RUN_AWAY, Abilities.KLUTZ, Abilities.LIMBER, 350, 55, 66, 44, 44, 56, 85, 190, 0, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LOPUNNY, 4, false, false, false, "Rabbit Pokémon", PokemonType.NORMAL, null, 1.2, 33.3, Abilities.CUTE_CHARM, Abilities.KLUTZ, Abilities.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 1.2, 33.3, Abilities.CUTE_CHARM, Abilities.KLUTZ, Abilities.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, PokemonType.FIGHTING, 1.3, 28.3, Abilities.SCRAPPY, Abilities.SCRAPPY, Abilities.SCRAPPY, 580, 65, 136, 94, 54, 96, 135, 60, 140, 168), + ), + new PokemonSpecies(Species.MISMAGIUS, 4, false, false, false, "Magical Pokémon", PokemonType.GHOST, null, 0.9, 4.4, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 495, 60, 60, 60, 105, 105, 105, 45, 35, 173, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.HONCHKROW, 4, false, false, false, "Big Boss Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.9, 27.3, Abilities.INSOMNIA, Abilities.SUPER_LUCK, Abilities.MOXIE, 505, 100, 125, 52, 105, 52, 71, 30, 35, 177, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GLAMEOW, 4, false, false, false, "Catty Pokémon", PokemonType.NORMAL, null, 0.5, 3.9, Abilities.LIMBER, Abilities.OWN_TEMPO, Abilities.KEEN_EYE, 310, 49, 55, 42, 42, 37, 85, 190, 70, 62, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.PURUGLY, 4, false, false, false, "Tiger Cat Pokémon", PokemonType.NORMAL, null, 1, 43.8, Abilities.THICK_FAT, Abilities.OWN_TEMPO, Abilities.DEFIANT, 452, 71, 82, 64, 64, 59, 112, 75, 70, 158, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.CHINGLING, 4, false, false, false, "Bell Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 285, 45, 30, 50, 65, 50, 45, 120, 70, 57, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.STUNKY, 4, false, false, false, "Skunk Pokémon", PokemonType.POISON, PokemonType.DARK, 0.4, 19.2, Abilities.STENCH, Abilities.AFTERMATH, Abilities.KEEN_EYE, 329, 63, 63, 47, 41, 41, 74, 225, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SKUNTANK, 4, false, false, false, "Skunk Pokémon", PokemonType.POISON, PokemonType.DARK, 1, 38, Abilities.STENCH, Abilities.AFTERMATH, Abilities.KEEN_EYE, 479, 103, 93, 67, 71, 61, 84, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BRONZOR, 4, false, false, false, "Bronze Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.5, 60.5, Abilities.LEVITATE, Abilities.HEATPROOF, Abilities.HEAVY_METAL, 300, 57, 24, 86, 24, 86, 23, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.BRONZONG, 4, false, false, false, "Bronze Bell Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.3, 187, Abilities.LEVITATE, Abilities.HEATPROOF, Abilities.HEAVY_METAL, 500, 67, 89, 116, 79, 116, 33, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.BONSLY, 4, false, false, false, "Bonsai Pokémon", PokemonType.ROCK, null, 0.5, 15, Abilities.STURDY, Abilities.ROCK_HEAD, Abilities.RATTLED, 290, 50, 80, 95, 10, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MIME_JR, 4, false, false, false, "Mime Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.6, 13, Abilities.SOUNDPROOF, Abilities.FILTER, Abilities.TECHNICIAN, 310, 20, 25, 45, 70, 90, 60, 145, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HAPPINY, 4, false, false, false, "Playhouse Pokémon", PokemonType.NORMAL, null, 0.6, 24.4, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.FRIEND_GUARD, 220, 100, 5, 5, 15, 65, 30, 130, 140, 110, GrowthRate.FAST, 0, false), + new PokemonSpecies(Species.CHATOT, 4, false, false, false, "Music Note Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.5, 1.9, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 411, 76, 65, 45, 92, 42, 91, 30, 35, 144, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SPIRITOMB, 4, false, false, false, "Forbidden Pokémon", PokemonType.GHOST, PokemonType.DARK, 1, 108, Abilities.PRESSURE, Abilities.NONE, Abilities.INFILTRATOR, 485, 50, 92, 108, 92, 108, 35, 100, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GIBLE, 4, false, false, false, "Land Shark Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 0.7, 20.5, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 300, 58, 70, 45, 40, 45, 42, 45, 50, 60, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.GABITE, 4, false, false, false, "Cave Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 1.4, 56, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 410, 68, 90, 65, 50, 55, 82, 45, 50, 144, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.GARCHOMP, 4, false, false, false, "Mach Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, Abilities.SAND_VEIL, Abilities.NONE, Abilities.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SAND_FORCE, 700, 108, 170, 115, 120, 95, 92, 45, 50, 300, true), + ), + new PokemonSpecies(Species.MUNCHLAX, 4, false, false, false, "Big Eater Pokémon", PokemonType.NORMAL, null, 0.6, 105, Abilities.PICKUP, Abilities.THICK_FAT, Abilities.GLUTTONY, 390, 135, 85, 40, 40, 85, 5, 50, 50, 78, GrowthRate.SLOW, 87.5, false), + new PokemonSpecies(Species.RIOLU, 4, false, false, false, "Emanation Pokémon", PokemonType.FIGHTING, null, 0.7, 20.2, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.PRANKSTER, 285, 40, 70, 40, 35, 40, 60, 75, 50, 57, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.LUCARIO, 4, false, false, false, "Aura Pokémon", PokemonType.FIGHTING, PokemonType.STEEL, 1.2, 54, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.STEEL, 1.2, 54, Abilities.STEADFAST, Abilities.INNER_FOCUS, Abilities.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIGHTING, PokemonType.STEEL, 1.3, 57.5, Abilities.ADAPTABILITY, Abilities.ADAPTABILITY, Abilities.ADAPTABILITY, 625, 70, 145, 88, 140, 70, 112, 45, 50, 184), + ), + new PokemonSpecies(Species.HIPPOPOTAS, 4, false, false, false, "Hippo Pokémon", PokemonType.GROUND, null, 0.8, 49.5, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_FORCE, 330, 68, 72, 78, 38, 42, 32, 140, 50, 66, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.HIPPOWDON, 4, false, false, false, "Heavyweight Pokémon", PokemonType.GROUND, null, 2, 300, Abilities.SAND_STREAM, Abilities.NONE, Abilities.SAND_FORCE, 525, 108, 112, 118, 68, 72, 47, 60, 50, 184, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.SKORUPI, 4, false, false, false, "Scorpion Pokémon", PokemonType.POISON, PokemonType.BUG, 0.8, 12, Abilities.BATTLE_ARMOR, Abilities.SNIPER, Abilities.KEEN_EYE, 330, 40, 50, 90, 30, 55, 65, 120, 50, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAPION, 4, false, false, false, "Ogre Scorpion Pokémon", PokemonType.POISON, PokemonType.DARK, 1.3, 61.5, Abilities.BATTLE_ARMOR, Abilities.SNIPER, Abilities.KEEN_EYE, 500, 70, 90, 110, 60, 75, 95, 45, 50, 175, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CROAGUNK, 4, false, false, false, "Toxic Mouth Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 0.7, 23, Abilities.ANTICIPATION, Abilities.DRY_SKIN, Abilities.POISON_TOUCH, 300, 48, 61, 40, 61, 40, 50, 140, 100, 60, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.TOXICROAK, 4, false, false, false, "Toxic Mouth Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 1.3, 44.4, Abilities.ANTICIPATION, Abilities.DRY_SKIN, Abilities.POISON_TOUCH, 490, 83, 106, 65, 86, 65, 85, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.CARNIVINE, 4, false, false, false, "Bug Catcher Pokémon", PokemonType.GRASS, null, 1.4, 27, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 454, 74, 100, 72, 90, 72, 46, 200, 70, 159, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.FINNEON, 4, false, false, false, "Wing Fish Pokémon", PokemonType.WATER, null, 0.4, 7, Abilities.SWIFT_SWIM, Abilities.STORM_DRAIN, Abilities.WATER_VEIL, 330, 49, 49, 56, 49, 61, 66, 190, 70, 66, GrowthRate.ERRATIC, 50, true), + new PokemonSpecies(Species.LUMINEON, 4, false, false, false, "Neon Pokémon", PokemonType.WATER, null, 1.2, 24, Abilities.SWIFT_SWIM, Abilities.STORM_DRAIN, Abilities.WATER_VEIL, 460, 69, 69, 76, 69, 86, 91, 75, 70, 161, GrowthRate.ERRATIC, 50, true), + new PokemonSpecies(Species.MANTYKE, 4, false, false, false, "Kite Pokémon", PokemonType.WATER, PokemonType.FLYING, 1, 65, Abilities.SWIFT_SWIM, Abilities.WATER_ABSORB, Abilities.WATER_VEIL, 345, 45, 20, 50, 60, 120, 50, 25, 50, 69, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SNOVER, 4, false, false, false, "Frost Tree Pokémon", PokemonType.GRASS, PokemonType.ICE, 1, 50.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 334, 60, 62, 50, 62, 60, 40, 120, 50, 67, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.ABOMASNOW, 4, false, false, false, "Frost Tree Pokémon", PokemonType.GRASS, PokemonType.ICE, 2.2, 135.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.ICE, 2.2, 135.5, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.ICE, 2.7, 185, Abilities.SNOW_WARNING, Abilities.NONE, Abilities.SNOW_WARNING, 594, 90, 132, 105, 132, 105, 30, 60, 50, 173, true), + ), + new PokemonSpecies(Species.WEAVILE, 4, false, false, false, "Sharp Claw Pokémon", PokemonType.DARK, PokemonType.ICE, 1.1, 34, Abilities.PRESSURE, Abilities.NONE, Abilities.PICKPOCKET, 510, 70, 120, 65, 45, 85, 125, 45, 35, 179, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.MAGNEZONE, 4, false, false, false, "Magnet Area Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 1.2, 180, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.ANALYTIC, 535, 70, 70, 115, 130, 90, 60, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.LICKILICKY, 4, false, false, false, "Licking Pokémon", PokemonType.NORMAL, null, 1.7, 140, Abilities.OWN_TEMPO, Abilities.OBLIVIOUS, Abilities.CLOUD_NINE, 515, 110, 85, 95, 80, 95, 50, 30, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RHYPERIOR, 4, false, false, false, "Drill Pokémon", PokemonType.GROUND, PokemonType.ROCK, 2.4, 282.8, Abilities.LIGHTNING_ROD, Abilities.SOLID_ROCK, Abilities.RECKLESS, 535, 115, 140, 130, 55, 55, 40, 30, 50, 268, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.TANGROWTH, 4, false, false, false, "Vine Pokémon", PokemonType.GRASS, null, 2, 128.6, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.REGENERATOR, 535, 100, 100, 125, 110, 50, 50, 30, 50, 187, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.ELECTIVIRE, 4, false, false, false, "Thunderbolt Pokémon", PokemonType.ELECTRIC, null, 1.8, 138.6, Abilities.MOTOR_DRIVE, Abilities.NONE, Abilities.VITAL_SPIRIT, 540, 75, 123, 67, 95, 85, 95, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.MAGMORTAR, 4, false, false, false, "Blast Pokémon", PokemonType.FIRE, null, 1.6, 68, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 540, 75, 95, 67, 125, 95, 83, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(Species.TOGEKISS, 4, false, false, false, "Jubilee Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 1.5, 38, Abilities.HUSTLE, Abilities.SERENE_GRACE, Abilities.SUPER_LUCK, 545, 85, 50, 95, 120, 115, 80, 30, 50, 273, GrowthRate.FAST, 87.5, false), + new PokemonSpecies(Species.YANMEGA, 4, false, false, false, "Ogre Darner Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.9, 51.5, Abilities.SPEED_BOOST, Abilities.TINTED_LENS, Abilities.FRISK, 515, 86, 76, 86, 116, 56, 95, 30, 70, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LEAFEON, 4, false, false, false, "Verdant Pokémon", PokemonType.GRASS, null, 1, 25.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 65, 110, 130, 60, 65, 95, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.GLACEON, 4, false, false, false, "Fresh Snow Pokémon", PokemonType.ICE, null, 0.8, 25.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.ICE_BODY, 525, 65, 60, 110, 130, 95, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.GLISCOR, 4, false, false, false, "Fang Scorpion Pokémon", PokemonType.GROUND, PokemonType.FLYING, 2, 42.5, Abilities.HYPER_CUTTER, Abilities.SAND_VEIL, Abilities.POISON_HEAL, 510, 75, 95, 125, 45, 75, 95, 30, 70, 179, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MAMOSWINE, 4, false, false, false, "Twin Tusk Pokémon", PokemonType.ICE, PokemonType.GROUND, 2.5, 291, Abilities.OBLIVIOUS, Abilities.SNOW_CLOAK, Abilities.THICK_FAT, 530, 110, 130, 80, 70, 60, 80, 50, 50, 265, GrowthRate.SLOW, 50, true), + new PokemonSpecies(Species.PORYGON_Z, 4, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.9, 34, Abilities.ADAPTABILITY, Abilities.DOWNLOAD, Abilities.ANALYTIC, 535, 85, 80, 70, 135, 75, 90, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.GALLADE, 4, false, false, false, "Blade Pokémon", PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 52, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 52, Abilities.STEADFAST, Abilities.SHARPNESS, Abilities.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 56.4, Abilities.SHARPNESS, Abilities.SHARPNESS, Abilities.SHARPNESS, 618, 68, 165, 95, 65, 115, 110, 45, 35, 259), + ), + new PokemonSpecies(Species.PROBOPASS, 4, false, false, false, "Compass Pokémon", PokemonType.ROCK, PokemonType.STEEL, 1.4, 340, Abilities.STURDY, Abilities.MAGNET_PULL, Abilities.SAND_FORCE, 525, 60, 55, 145, 75, 150, 40, 60, 70, 184, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUSKNOIR, 4, false, false, false, "Gripper Pokémon", PokemonType.GHOST, null, 2.2, 106.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 525, 45, 100, 135, 65, 135, 45, 45, 35, 263, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.FROSLASS, 4, false, false, false, "Snow Land Pokémon", PokemonType.ICE, PokemonType.GHOST, 1.3, 26.6, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.CURSED_BODY, 480, 70, 80, 70, 80, 70, 110, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.ROTOM, 4, false, false, false, "Plasma Pokémon", PokemonType.ELECTRIC, PokemonType.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, GrowthRate.MEDIUM_FAST, null, false, false, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, PokemonType.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, false, null, true), + new PokemonForm("Heat", "heat", PokemonType.ELECTRIC, PokemonType.FIRE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + new PokemonForm("Wash", "wash", PokemonType.ELECTRIC, PokemonType.WATER, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + new PokemonForm("Frost", "frost", PokemonType.ELECTRIC, PokemonType.ICE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + new PokemonForm("Fan", "fan", PokemonType.ELECTRIC, PokemonType.FLYING, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + new PokemonForm("Mow", "mow", PokemonType.ELECTRIC, PokemonType.GRASS, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + ), + new PokemonSpecies(Species.UXIE, 4, true, false, false, "Knowledge Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 75, 75, 130, 75, 130, 95, 3, 140, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MESPRIT, 4, true, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 80, 105, 105, 105, 105, 80, 3, 140, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.AZELF, 4, true, false, false, "Willpower Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 75, 125, 70, 125, 70, 115, 3, 140, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DIALGA, 4, false, true, false, "Temporal Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 5.4, 683, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.DRAGON, 5.4, 683, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, false, null, true), + new PokemonForm("Origin Forme", "origin", PokemonType.STEEL, PokemonType.DRAGON, 7, 848.7, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 100, 100, 120, 150, 120, 90, 3, 0, 340), + ), + new PokemonSpecies(Species.PALKIA, 4, false, true, false, "Spatial Pokémon", PokemonType.WATER, PokemonType.DRAGON, 4.2, 336, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DRAGON, 4.2, 336, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, false, null, true), + new PokemonForm("Origin Forme", "origin", PokemonType.WATER, PokemonType.DRAGON, 6.3, 659, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 90, 100, 100, 150, 120, 120, 3, 0, 340), + ), + new PokemonSpecies(Species.HEATRAN, 4, true, false, false, "Lava Dome Pokémon", PokemonType.FIRE, PokemonType.STEEL, 1.7, 430, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 600, 91, 90, 106, 130, 106, 77, 3, 100, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", PokemonType.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", PokemonType.GHOST, PokemonType.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Altered Forme", "altered", PokemonType.GHOST, PokemonType.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, false, null, true), + new PokemonForm("Origin Forme", "origin", PokemonType.GHOST, PokemonType.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.LEVITATE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), + ), + new PokemonSpecies(Species.CRESSELIA, 4, true, false, false, "Lunar Pokémon", PokemonType.PSYCHIC, null, 1.5, 85.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", PokemonType.WATER, null, 0.4, 3.1, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 240, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MANAPHY, 4, false, false, true, "Seafaring Pokémon", PokemonType.WATER, null, 0.3, 1.4, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 70, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DARKRAI, 4, false, false, true, "Pitch-Black Pokémon", PokemonType.DARK, null, 1.5, 50.5, Abilities.BAD_DREAMS, Abilities.NONE, Abilities.NONE, 600, 70, 90, 90, 135, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SHAYMIN, 4, false, false, true, "Gratitude Pokémon", PokemonType.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false, true, + new PokemonForm("Land Forme", "land", PokemonType.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, false, null, true), + new PokemonForm("Sky Forme", "sky", PokemonType.GRASS, PokemonType.FLYING, 0.4, 5.2, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 103, 75, 120, 75, 127, 45, 100, 300), + ), + new PokemonSpecies(Species.ARCEUS, 4, false, false, true, "Alpha Pokémon", PokemonType.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "normal", PokemonType.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, true), + new PokemonForm("Fighting", "fighting", PokemonType.FIGHTING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Flying", "flying", PokemonType.FLYING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Poison", "poison", PokemonType.POISON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ground", "ground", PokemonType.GROUND, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Rock", "rock", PokemonType.ROCK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Bug", "bug", PokemonType.BUG, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ghost", "ghost", PokemonType.GHOST, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Steel", "steel", PokemonType.STEEL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Fire", "fire", PokemonType.FIRE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Water", "water", PokemonType.WATER, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Grass", "grass", PokemonType.GRASS, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Electric", "electric", PokemonType.ELECTRIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Psychic", "psychic", PokemonType.PSYCHIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ice", "ice", PokemonType.ICE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Dragon", "dragon", PokemonType.DRAGON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Dark", "dark", PokemonType.DARK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Fairy", "fairy", PokemonType.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("???", "unknown", PokemonType.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, false, true), + ), + new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", PokemonType.PSYCHIC, PokemonType.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", PokemonType.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SERVINE, 5, false, false, false, "Grass Snake Pokémon", PokemonType.GRASS, null, 0.8, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SERPERIOR, 5, false, false, false, "Regal Pokémon", PokemonType.GRASS, null, 3.3, 63, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TEPIG, 5, false, false, false, "Fire Pig Pokémon", PokemonType.FIRE, null, 0.5, 9.9, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 308, 65, 63, 45, 45, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PIGNITE, 5, false, false, false, "Fire Pig Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1, 55.5, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 418, 90, 93, 55, 70, 55, 55, 45, 70, 146, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.EMBOAR, 5, false, false, false, "Mega Fire Pig Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.6, 150, Abilities.BLAZE, Abilities.NONE, Abilities.RECKLESS, 528, 110, 123, 65, 100, 65, 65, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.OSHAWOTT, 5, false, false, false, "Sea Otter Pokémon", PokemonType.WATER, null, 0.5, 5.9, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 308, 55, 55, 45, 63, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DEWOTT, 5, false, false, false, "Discipline Pokémon", PokemonType.WATER, null, 0.8, 24.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 413, 75, 75, 60, 83, 60, 60, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SAMUROTT, 5, false, false, false, "Formidable Pokémon", PokemonType.WATER, null, 1.5, 94.6, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 528, 95, 100, 85, 108, 70, 70, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PATRAT, 5, false, false, false, "Scout Pokémon", PokemonType.NORMAL, null, 0.5, 11.6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.ANALYTIC, 255, 45, 55, 39, 35, 39, 42, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WATCHOG, 5, false, false, false, "Lookout Pokémon", PokemonType.NORMAL, null, 1.1, 27, Abilities.ILLUMINATE, Abilities.KEEN_EYE, Abilities.ANALYTIC, 420, 60, 85, 69, 60, 69, 77, 255, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LILLIPUP, 5, false, false, false, "Puppy Pokémon", PokemonType.NORMAL, null, 0.4, 4.1, Abilities.VITAL_SPIRIT, Abilities.PICKUP, Abilities.RUN_AWAY, 275, 45, 60, 45, 25, 45, 55, 255, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.HERDIER, 5, false, false, false, "Loyal Dog Pokémon", PokemonType.NORMAL, null, 0.9, 14.7, Abilities.INTIMIDATE, Abilities.SAND_RUSH, Abilities.SCRAPPY, 370, 65, 80, 65, 35, 65, 60, 120, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.STOUTLAND, 5, false, false, false, "Big-Hearted Pokémon", PokemonType.NORMAL, null, 1.2, 61, Abilities.INTIMIDATE, Abilities.SAND_RUSH, Abilities.SCRAPPY, 500, 85, 110, 90, 45, 90, 80, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PURRLOIN, 5, false, false, false, "Devious Pokémon", PokemonType.DARK, null, 0.4, 10.1, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.PRANKSTER, 281, 41, 50, 37, 50, 37, 66, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LIEPARD, 5, false, false, false, "Cruel Pokémon", PokemonType.DARK, null, 1.1, 37.5, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.PRANKSTER, 446, 64, 88, 50, 88, 50, 106, 90, 50, 156, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PANSAGE, 5, false, false, false, "Grass Monkey Pokémon", PokemonType.GRASS, null, 0.6, 10.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.OVERGROW, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SIMISAGE, 5, false, false, false, "Thorn Monkey Pokémon", PokemonType.GRASS, null, 1.1, 30.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.OVERGROW, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.PANSEAR, 5, false, false, false, "High Temp Pokémon", PokemonType.FIRE, null, 0.6, 11, Abilities.GLUTTONY, Abilities.NONE, Abilities.BLAZE, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SIMISEAR, 5, false, false, false, "Ember Pokémon", PokemonType.FIRE, null, 1, 28, Abilities.GLUTTONY, Abilities.NONE, Abilities.BLAZE, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.PANPOUR, 5, false, false, false, "Spray Pokémon", PokemonType.WATER, null, 0.6, 13.5, Abilities.GLUTTONY, Abilities.NONE, Abilities.TORRENT, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SIMIPOUR, 5, false, false, false, "Geyser Pokémon", PokemonType.WATER, null, 1, 29, Abilities.GLUTTONY, Abilities.NONE, Abilities.TORRENT, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.MUNNA, 5, false, false, false, "Dream Eater Pokémon", PokemonType.PSYCHIC, null, 0.6, 23.3, Abilities.FOREWARN, Abilities.SYNCHRONIZE, Abilities.TELEPATHY, 292, 76, 25, 45, 67, 55, 24, 190, 50, 58, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.MUSHARNA, 5, false, false, false, "Drowsing Pokémon", PokemonType.PSYCHIC, null, 1.1, 60.5, Abilities.FOREWARN, Abilities.SYNCHRONIZE, Abilities.TELEPATHY, 487, 116, 55, 85, 107, 95, 29, 75, 50, 170, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.PIDOVE, 5, false, false, false, "Tiny Pigeon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2.1, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 264, 50, 55, 50, 36, 30, 43, 255, 50, 53, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TRANQUILL, 5, false, false, false, "Wild Pigeon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 15, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 358, 62, 77, 62, 50, 42, 65, 120, 50, 125, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.UNFEZANT, 5, false, false, false, "Proud Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 29, Abilities.BIG_PECKS, Abilities.SUPER_LUCK, Abilities.RIVALRY, 488, 80, 115, 80, 65, 55, 93, 45, 50, 244, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.BLITZLE, 5, false, false, false, "Electrified Pokémon", PokemonType.ELECTRIC, null, 0.8, 29.8, Abilities.LIGHTNING_ROD, Abilities.MOTOR_DRIVE, Abilities.SAP_SIPPER, 295, 45, 60, 32, 50, 32, 76, 190, 70, 59, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ZEBSTRIKA, 5, false, false, false, "Thunderbolt Pokémon", PokemonType.ELECTRIC, null, 1.6, 79.5, Abilities.LIGHTNING_ROD, Abilities.MOTOR_DRIVE, Abilities.SAP_SIPPER, 497, 75, 100, 63, 80, 63, 116, 75, 70, 174, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ROGGENROLA, 5, false, false, false, "Mantle Pokémon", PokemonType.ROCK, null, 0.4, 18, Abilities.STURDY, Abilities.WEAK_ARMOR, Abilities.SAND_FORCE, 280, 55, 75, 85, 25, 25, 15, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.BOLDORE, 5, false, false, false, "Ore Pokémon", PokemonType.ROCK, null, 0.9, 102, Abilities.STURDY, Abilities.WEAK_ARMOR, Abilities.SAND_FORCE, 390, 70, 105, 105, 50, 40, 20, 120, 50, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GIGALITH, 5, false, false, false, "Compressed Pokémon", PokemonType.ROCK, null, 1.7, 260, Abilities.STURDY, Abilities.SAND_STREAM, Abilities.SAND_FORCE, 515, 85, 135, 130, 60, 80, 25, 45, 50, 258, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WOOBAT, 5, false, false, false, "Bat Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.4, 2.1, Abilities.UNAWARE, Abilities.KLUTZ, Abilities.SIMPLE, 323, 65, 45, 43, 55, 43, 72, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SWOOBAT, 5, false, false, false, "Courting Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.9, 10.5, Abilities.UNAWARE, Abilities.KLUTZ, Abilities.SIMPLE, 425, 67, 57, 55, 77, 55, 114, 45, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DRILBUR, 5, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.3, 8.5, Abilities.SAND_RUSH, Abilities.SAND_FORCE, Abilities.MOLD_BREAKER, 328, 60, 85, 40, 30, 45, 68, 120, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.EXCADRILL, 5, false, false, false, "Subterrene Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 40.4, Abilities.SAND_RUSH, Abilities.SAND_FORCE, Abilities.MOLD_BREAKER, 508, 110, 135, 60, 50, 65, 88, 60, 50, 178, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AUDINO, 5, false, false, false, "Hearing Pokémon", PokemonType.NORMAL, null, 1.1, 31, Abilities.HEALER, Abilities.REGENERATOR, Abilities.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, GrowthRate.FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 1.1, 31, Abilities.HEALER, Abilities.REGENERATOR, Abilities.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, PokemonType.FAIRY, 1.5, 32, Abilities.REGENERATOR, Abilities.REGENERATOR, Abilities.REGENERATOR, 545, 103, 60, 126, 80, 126, 50, 255, 50, 390), //Custom Ability, base form Hidden Ability + ), + new PokemonSpecies(Species.TIMBURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 0.6, 12.5, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 305, 75, 80, 55, 25, 35, 35, 180, 70, 61, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.GURDURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 1.2, 40, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 405, 85, 105, 85, 40, 50, 40, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.CONKELDURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 1.4, 87, Abilities.GUTS, Abilities.SHEER_FORCE, Abilities.IRON_FIST, 505, 105, 140, 95, 55, 65, 45, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(Species.TYMPOLE, 5, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 0.5, 4.5, Abilities.SWIFT_SWIM, Abilities.HYDRATION, Abilities.WATER_ABSORB, 294, 50, 50, 40, 50, 40, 64, 255, 50, 59, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.PALPITOAD, 5, false, false, false, "Vibration Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.8, 17, Abilities.SWIFT_SWIM, Abilities.HYDRATION, Abilities.WATER_ABSORB, 384, 75, 65, 55, 65, 55, 69, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SEISMITOAD, 5, false, false, false, "Vibration Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.5, 62, Abilities.SWIFT_SWIM, Abilities.POISON_TOUCH, Abilities.WATER_ABSORB, 509, 105, 95, 75, 85, 75, 74, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.THROH, 5, false, false, false, "Judo Pokémon", PokemonType.FIGHTING, null, 1.3, 55.5, Abilities.GUTS, Abilities.INNER_FOCUS, Abilities.MOLD_BREAKER, 465, 120, 100, 85, 30, 85, 45, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.SAWK, 5, false, false, false, "Karate Pokémon", PokemonType.FIGHTING, null, 1.4, 51, Abilities.STURDY, Abilities.INNER_FOCUS, Abilities.MOLD_BREAKER, 465, 75, 125, 75, 30, 75, 85, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.SEWADDLE, 5, false, false, false, "Sewing Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.3, 2.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 310, 45, 53, 70, 40, 60, 42, 255, 70, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SWADLOON, 5, false, false, false, "Leaf-Wrapped Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.5, 7.3, Abilities.LEAF_GUARD, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 380, 55, 63, 90, 50, 80, 42, 120, 70, 133, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LEAVANNY, 5, false, false, false, "Nurturing Pokémon", PokemonType.BUG, PokemonType.GRASS, 1.2, 20.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 500, 75, 103, 80, 70, 80, 92, 45, 70, 250, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.VENIPEDE, 5, false, false, false, "Centipede Pokémon", PokemonType.BUG, PokemonType.POISON, 0.4, 5.3, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 260, 30, 45, 59, 30, 39, 57, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.WHIRLIPEDE, 5, false, false, false, "Curlipede Pokémon", PokemonType.BUG, PokemonType.POISON, 1.2, 58.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 360, 40, 55, 99, 40, 79, 47, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SCOLIPEDE, 5, false, false, false, "Megapede Pokémon", PokemonType.BUG, PokemonType.POISON, 2.5, 200.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 485, 60, 100, 89, 55, 69, 112, 45, 50, 243, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.COTTONEE, 5, false, false, false, "Cotton Puff Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.3, 0.6, Abilities.PRANKSTER, Abilities.INFILTRATOR, Abilities.CHLOROPHYLL, 280, 40, 27, 60, 37, 50, 66, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WHIMSICOTT, 5, false, false, false, "Windveiled Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.7, 6.6, Abilities.PRANKSTER, Abilities.INFILTRATOR, Abilities.CHLOROPHYLL, 480, 60, 67, 85, 77, 75, 116, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PETILIL, 5, false, false, false, "Bulb Pokémon", PokemonType.GRASS, null, 0.5, 6.6, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 280, 45, 35, 50, 70, 50, 30, 190, 50, 56, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.LILLIGANT, 5, false, false, false, "Flowering Pokémon", PokemonType.GRASS, null, 1.1, 16.3, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 480, 70, 60, 75, 110, 75, 90, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.BASCULIN, 5, false, false, false, "Hostile Pokémon", PokemonType.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Red-Striped Form", "red-striped", PokemonType.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), + new PokemonForm("Blue-Striped Form", "blue-striped", PokemonType.WATER, null, 1, 18, Abilities.ROCK_HEAD, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), + new PokemonForm("White-Striped Form", "white-striped", PokemonType.WATER, null, 1, 18, Abilities.RATTLED, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), + ), + new PokemonSpecies(Species.SANDILE, 5, false, false, false, "Desert Croc Pokémon", PokemonType.GROUND, PokemonType.DARK, 0.7, 15.2, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 292, 50, 72, 35, 35, 35, 65, 180, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.KROKOROK, 5, false, false, false, "Desert Croc Pokémon", PokemonType.GROUND, PokemonType.DARK, 1, 33.4, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 351, 60, 82, 45, 45, 45, 74, 90, 50, 123, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.KROOKODILE, 5, false, false, false, "Intimidation Pokémon", PokemonType.GROUND, PokemonType.DARK, 1.5, 96.3, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 519, 95, 117, 80, 65, 70, 92, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DARUMAKA, 5, false, false, false, "Zen Charm Pokémon", PokemonType.FIRE, null, 0.6, 37.5, Abilities.HUSTLE, Abilities.NONE, Abilities.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DARMANITAN, 5, false, false, false, "Blazing Pokémon", PokemonType.FIRE, null, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Standard Mode", "", PokemonType.FIRE, null, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), + new PokemonForm("Zen Mode", "zen", PokemonType.FIRE, PokemonType.PSYCHIC, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 30, 105, 140, 105, 55, 60, 50, 189), + ), + new PokemonSpecies(Species.MARACTUS, 5, false, false, false, "Cactus Pokémon", PokemonType.GRASS, null, 1, 28, Abilities.WATER_ABSORB, Abilities.CHLOROPHYLL, Abilities.STORM_DRAIN, 461, 75, 86, 67, 106, 67, 60, 255, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DWEBBLE, 5, false, false, false, "Rock Inn Pokémon", PokemonType.BUG, PokemonType.ROCK, 0.3, 14.5, Abilities.STURDY, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 325, 50, 65, 85, 35, 35, 55, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CRUSTLE, 5, false, false, false, "Stone Home Pokémon", PokemonType.BUG, PokemonType.ROCK, 1.4, 200, Abilities.STURDY, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 485, 70, 105, 125, 65, 75, 45, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCRAGGY, 5, false, false, false, "Shedding Pokémon", PokemonType.DARK, PokemonType.FIGHTING, 0.6, 11.8, Abilities.SHED_SKIN, Abilities.MOXIE, Abilities.INTIMIDATE, 348, 50, 75, 70, 35, 70, 48, 180, 35, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCRAFTY, 5, false, false, false, "Hoodlum Pokémon", PokemonType.DARK, PokemonType.FIGHTING, 1.1, 30, Abilities.SHED_SKIN, Abilities.MOXIE, Abilities.INTIMIDATE, 488, 65, 90, 115, 45, 115, 58, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SIGILYPH, 5, false, false, false, "Avianoid Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.4, 14, Abilities.WONDER_SKIN, Abilities.MAGIC_GUARD, Abilities.TINTED_LENS, 490, 72, 58, 80, 103, 80, 97, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.YAMASK, 5, false, false, false, "Spirit Pokémon", PokemonType.GHOST, null, 0.5, 1.5, Abilities.MUMMY, Abilities.NONE, Abilities.NONE, 303, 38, 30, 85, 55, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.COFAGRIGUS, 5, false, false, false, "Coffin Pokémon", PokemonType.GHOST, null, 1.7, 76.5, Abilities.MUMMY, Abilities.NONE, Abilities.NONE, 483, 58, 50, 145, 95, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TIRTOUGA, 5, false, false, false, "Prototurtle Pokémon", PokemonType.WATER, PokemonType.ROCK, 0.7, 16.5, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 355, 54, 78, 103, 53, 45, 22, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.CARRACOSTA, 5, false, false, false, "Prototurtle Pokémon", PokemonType.WATER, PokemonType.ROCK, 1.2, 81, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 495, 74, 108, 133, 83, 65, 32, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.ARCHEN, 5, false, false, false, "First Bird Pokémon", PokemonType.ROCK, PokemonType.FLYING, 0.5, 9.5, Abilities.DEFEATIST, Abilities.NONE, Abilities.WIMP_OUT, 401, 55, 112, 45, 74, 45, 70, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden + new PokemonSpecies(Species.ARCHEOPS, 5, false, false, false, "First Bird Pokémon", PokemonType.ROCK, PokemonType.FLYING, 1.4, 32, Abilities.DEFEATIST, Abilities.NONE, Abilities.EMERGENCY_EXIT, 567, 75, 140, 65, 112, 65, 110, 45, 50, 177, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden + new PokemonSpecies(Species.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", PokemonType.POISON, null, 0.6, 31, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", PokemonType.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.POISON, PokemonType.STEEL, 21, 999.9, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, 574, 135, 125, 102, 57, 102, 53, 60, 50, 166), + ), + new PokemonSpecies(Species.ZORUA, 5, false, false, false, "Tricky Fox Pokémon", PokemonType.DARK, null, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 40, 65, 40, 80, 40, 65, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.ZOROARK, 5, false, false, false, "Illusion Fox Pokémon", PokemonType.DARK, null, 1.6, 81.1, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 60, 105, 60, 120, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MINCCINO, 5, false, false, false, "Chinchilla Pokémon", PokemonType.NORMAL, null, 0.4, 5.8, Abilities.CUTE_CHARM, Abilities.TECHNICIAN, Abilities.SKILL_LINK, 300, 55, 50, 40, 40, 40, 75, 255, 50, 60, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.CINCCINO, 5, false, false, false, "Scarf Pokémon", PokemonType.NORMAL, null, 0.5, 7.5, Abilities.CUTE_CHARM, Abilities.TECHNICIAN, Abilities.SKILL_LINK, 470, 75, 95, 60, 65, 60, 115, 60, 50, 165, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.GOTHITA, 5, false, false, false, "Fixation Pokémon", PokemonType.PSYCHIC, null, 0.4, 5.8, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 290, 45, 30, 50, 55, 65, 45, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 25, false), + new PokemonSpecies(Species.GOTHORITA, 5, false, false, false, "Manipulate Pokémon", PokemonType.PSYCHIC, null, 0.7, 18, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 390, 60, 45, 70, 75, 85, 55, 100, 50, 137, GrowthRate.MEDIUM_SLOW, 25, false), + new PokemonSpecies(Species.GOTHITELLE, 5, false, false, false, "Astral Body Pokémon", PokemonType.PSYCHIC, null, 1.5, 44, Abilities.FRISK, Abilities.COMPETITIVE, Abilities.SHADOW_TAG, 490, 70, 55, 95, 95, 110, 65, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 25, false), + new PokemonSpecies(Species.SOLOSIS, 5, false, false, false, "Cell Pokémon", PokemonType.PSYCHIC, null, 0.3, 1, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 290, 45, 30, 40, 105, 50, 20, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DUOSION, 5, false, false, false, "Mitosis Pokémon", PokemonType.PSYCHIC, null, 0.6, 8, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 370, 65, 40, 50, 125, 60, 30, 100, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.REUNICLUS, 5, false, false, false, "Multiplying Pokémon", PokemonType.PSYCHIC, null, 1, 20.1, Abilities.OVERCOAT, Abilities.MAGIC_GUARD, Abilities.REGENERATOR, 490, 110, 65, 75, 125, 85, 30, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DUCKLETT, 5, false, false, false, "Water Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 0.5, 5.5, Abilities.KEEN_EYE, Abilities.BIG_PECKS, Abilities.HYDRATION, 305, 62, 44, 50, 44, 50, 55, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SWANNA, 5, false, false, false, "White Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 1.3, 24.2, Abilities.KEEN_EYE, Abilities.BIG_PECKS, Abilities.HYDRATION, 473, 75, 87, 63, 87, 63, 98, 45, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VANILLITE, 5, false, false, false, "Fresh Snow Pokémon", PokemonType.ICE, null, 0.4, 5.7, Abilities.ICE_BODY, Abilities.SNOW_CLOAK, Abilities.WEAK_ARMOR, 305, 36, 50, 50, 65, 60, 44, 255, 50, 61, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.VANILLISH, 5, false, false, false, "Icy Snow Pokémon", PokemonType.ICE, null, 1.1, 41, Abilities.ICE_BODY, Abilities.SNOW_CLOAK, Abilities.WEAK_ARMOR, 395, 51, 65, 65, 80, 75, 59, 120, 50, 138, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.VANILLUXE, 5, false, false, false, "Snowstorm Pokémon", PokemonType.ICE, null, 1.3, 57.5, Abilities.ICE_BODY, Abilities.SNOW_WARNING, Abilities.WEAK_ARMOR, 535, 71, 95, 85, 110, 95, 79, 45, 50, 268, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DEERLING, 5, false, false, false, "Season Pokémon", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Spring Form", "spring", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + new PokemonForm("Summer Form", "summer", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + new PokemonForm("Autumn Form", "autumn", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + new PokemonForm("Winter Form", "winter", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + ), + new PokemonSpecies(Species.SAWSBUCK, 5, false, false, false, "Season Pokémon", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Spring Form", "spring", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), + new PokemonForm("Summer Form", "summer", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), + new PokemonForm("Autumn Form", "autumn", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), + new PokemonForm("Winter Form", "winter", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), + ), + new PokemonSpecies(Species.EMOLGA, 5, false, false, false, "Sky Squirrel Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 0.4, 5, Abilities.STATIC, Abilities.NONE, Abilities.MOTOR_DRIVE, 428, 55, 75, 60, 75, 60, 103, 200, 50, 150, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KARRABLAST, 5, false, false, false, "Clamping Pokémon", PokemonType.BUG, null, 0.5, 5.9, Abilities.SWARM, Abilities.SHED_SKIN, Abilities.NO_GUARD, 315, 50, 75, 45, 40, 45, 60, 200, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ESCAVALIER, 5, false, false, false, "Cavalry Pokémon", PokemonType.BUG, PokemonType.STEEL, 1, 33, Abilities.SWARM, Abilities.SHELL_ARMOR, Abilities.OVERCOAT, 495, 70, 135, 105, 60, 105, 20, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FOONGUS, 5, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.2, 1, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.REGENERATOR, 294, 69, 55, 45, 55, 55, 15, 190, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AMOONGUSS, 5, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.6, 10.5, Abilities.EFFECT_SPORE, Abilities.NONE, Abilities.REGENERATOR, 464, 114, 85, 70, 85, 80, 30, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FRILLISH, 5, false, false, false, "Floating Pokémon", PokemonType.WATER, PokemonType.GHOST, 1.2, 33, Abilities.WATER_ABSORB, Abilities.CURSED_BODY, Abilities.DAMP, 335, 55, 40, 50, 65, 85, 40, 190, 50, 67, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.JELLICENT, 5, false, false, false, "Floating Pokémon", PokemonType.WATER, PokemonType.GHOST, 2.2, 135, Abilities.WATER_ABSORB, Abilities.CURSED_BODY, Abilities.DAMP, 480, 100, 60, 70, 85, 105, 60, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.ALOMOMOLA, 5, false, false, false, "Caring Pokémon", PokemonType.WATER, null, 1.2, 31.6, Abilities.HEALER, Abilities.HYDRATION, Abilities.REGENERATOR, 470, 165, 75, 80, 40, 45, 65, 75, 70, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.JOLTIK, 5, false, false, false, "Attaching Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.1, 0.6, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 319, 50, 47, 50, 57, 50, 65, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALVANTULA, 5, false, false, false, "EleSpider Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.8, 14.3, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 472, 70, 77, 60, 97, 60, 108, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", PokemonType.GRASS, PokemonType.STEEL, 0.6, 18.8, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FERROTHORN, 5, false, false, false, "Thorn Pod Pokémon", PokemonType.GRASS, PokemonType.STEEL, 1, 110, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 489, 74, 94, 131, 54, 116, 20, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.KLINK, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.3, 21, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 300, 40, 55, 70, 45, 60, 30, 130, 50, 60, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.KLANG, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.6, 51, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 440, 60, 80, 95, 70, 85, 50, 60, 50, 154, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.KLINKLANG, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.6, 81, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 520, 60, 100, 115, 70, 85, 90, 30, 50, 260, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(Species.TYNAMO, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 0.2, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 275, 35, 55, 40, 45, 40, 60, 190, 70, 55, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.EELEKTRIK, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 1.2, 22, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 405, 65, 85, 70, 75, 70, 40, 60, 70, 142, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.EELEKTROSS, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 2.1, 80.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 85, 115, 80, 105, 80, 50, 30, 70, 258, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ELGYEM, 5, false, false, false, "Cerebral Pokémon", PokemonType.PSYCHIC, null, 0.5, 9, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 335, 55, 55, 55, 85, 55, 30, 255, 50, 67, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEHEEYEM, 5, false, false, false, "Cerebral Pokémon", PokemonType.PSYCHIC, null, 1, 34.5, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 485, 75, 75, 75, 125, 95, 40, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LITWICK, 5, false, false, false, "Candle Pokémon", PokemonType.GHOST, PokemonType.FIRE, 0.3, 3.1, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 275, 50, 30, 55, 65, 55, 20, 190, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LAMPENT, 5, false, false, false, "Lamp Pokémon", PokemonType.GHOST, PokemonType.FIRE, 0.6, 13, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 370, 60, 40, 60, 95, 60, 55, 90, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CHANDELURE, 5, false, false, false, "Luring Pokémon", PokemonType.GHOST, PokemonType.FIRE, 1, 34.3, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 520, 60, 55, 90, 145, 90, 80, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.AXEW, 5, false, false, false, "Tusk Pokémon", PokemonType.DRAGON, null, 0.6, 18, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 320, 46, 87, 60, 30, 40, 57, 75, 35, 64, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.FRAXURE, 5, false, false, false, "Axe Jaw Pokémon", PokemonType.DRAGON, null, 1, 36, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 410, 66, 117, 70, 40, 50, 67, 60, 35, 144, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HAXORUS, 5, false, false, false, "Axe Jaw Pokémon", PokemonType.DRAGON, null, 1.8, 105.5, Abilities.RIVALRY, Abilities.MOLD_BREAKER, Abilities.UNNERVE, 540, 76, 147, 90, 60, 70, 97, 45, 35, 270, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CUBCHOO, 5, false, false, false, "Chill Pokémon", PokemonType.ICE, null, 0.5, 8.5, Abilities.SNOW_CLOAK, Abilities.SLUSH_RUSH, Abilities.RATTLED, 305, 55, 70, 40, 60, 40, 40, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEARTIC, 5, false, false, false, "Freezing Pokémon", PokemonType.ICE, null, 2.6, 260, Abilities.SNOW_CLOAK, Abilities.SLUSH_RUSH, Abilities.SWIFT_SWIM, 505, 95, 130, 80, 70, 80, 50, 60, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CRYOGONAL, 5, false, false, false, "Crystallizing Pokémon", PokemonType.ICE, null, 1.1, 148, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 80, 50, 50, 95, 135, 105, 25, 50, 180, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.SHELMET, 5, false, false, false, "Snail Pokémon", PokemonType.BUG, null, 0.4, 7.7, Abilities.HYDRATION, Abilities.SHELL_ARMOR, Abilities.OVERCOAT, 305, 50, 40, 85, 40, 65, 25, 200, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ACCELGOR, 5, false, false, false, "Shell Out Pokémon", PokemonType.BUG, null, 0.8, 25.3, Abilities.HYDRATION, Abilities.STICKY_HOLD, Abilities.UNBURDEN, 495, 80, 70, 40, 100, 60, 145, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.STUNFISK, 5, false, false, false, "Trap Pokémon", PokemonType.GROUND, PokemonType.ELECTRIC, 0.7, 11, Abilities.STATIC, Abilities.LIMBER, Abilities.SAND_VEIL, 471, 109, 66, 84, 81, 99, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MIENFOO, 5, false, false, false, "Martial Arts Pokémon", PokemonType.FIGHTING, null, 0.9, 20, Abilities.INNER_FOCUS, Abilities.REGENERATOR, Abilities.RECKLESS, 350, 45, 85, 50, 55, 50, 65, 180, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MIENSHAO, 5, false, false, false, "Martial Arts Pokémon", PokemonType.FIGHTING, null, 1.4, 35.5, Abilities.INNER_FOCUS, Abilities.REGENERATOR, Abilities.RECKLESS, 510, 65, 125, 60, 95, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DRUDDIGON, 5, false, false, false, "Cave Pokémon", PokemonType.DRAGON, null, 1.6, 139, Abilities.ROUGH_SKIN, Abilities.SHEER_FORCE, Abilities.MOLD_BREAKER, 485, 77, 120, 90, 60, 90, 48, 45, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GOLETT, 5, false, false, false, "Automaton Pokémon", PokemonType.GROUND, PokemonType.GHOST, 1, 92, Abilities.IRON_FIST, Abilities.KLUTZ, Abilities.NO_GUARD, 303, 59, 74, 50, 35, 50, 35, 190, 50, 61, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.GOLURK, 5, false, false, false, "Automaton Pokémon", PokemonType.GROUND, PokemonType.GHOST, 2.8, 330, Abilities.IRON_FIST, Abilities.KLUTZ, Abilities.NO_GUARD, 483, 89, 124, 80, 55, 80, 55, 90, 50, 169, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.PAWNIARD, 5, false, false, false, "Sharp Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 0.5, 10.2, Abilities.DEFIANT, Abilities.INNER_FOCUS, Abilities.PRESSURE, 340, 45, 85, 70, 40, 40, 60, 120, 35, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BISHARP, 5, false, false, false, "Sword Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 1.6, 70, Abilities.DEFIANT, Abilities.INNER_FOCUS, Abilities.PRESSURE, 490, 65, 125, 100, 60, 70, 70, 45, 35, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BOUFFALANT, 5, false, false, false, "Bash Buffalo Pokémon", PokemonType.NORMAL, null, 1.6, 94.6, Abilities.RECKLESS, Abilities.SAP_SIPPER, Abilities.SOUNDPROOF, 490, 95, 110, 95, 40, 95, 55, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RUFFLET, 5, false, false, false, "Eaglet Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.5, 10.5, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.HUSTLE, 350, 70, 83, 50, 37, 50, 60, 190, 50, 70, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.BRAVIARY, 5, false, false, false, "Valiant Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 41, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.DEFIANT, 510, 100, 123, 75, 57, 75, 80, 60, 50, 179, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.VULLABY, 5, false, false, false, "Diapered Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.5, 9, Abilities.BIG_PECKS, Abilities.OVERCOAT, Abilities.WEAK_ARMOR, 370, 70, 55, 75, 45, 65, 60, 190, 35, 74, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.MANDIBUZZ, 5, false, false, false, "Bone Vulture Pokémon", PokemonType.DARK, PokemonType.FLYING, 1.2, 39.5, Abilities.BIG_PECKS, Abilities.OVERCOAT, Abilities.WEAK_ARMOR, 510, 110, 65, 105, 55, 95, 80, 60, 35, 179, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.HEATMOR, 5, false, false, false, "Anteater Pokémon", PokemonType.FIRE, null, 1.4, 58, Abilities.GLUTTONY, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, 484, 85, 97, 66, 105, 66, 65, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DURANT, 5, false, false, false, "Iron Ant Pokémon", PokemonType.BUG, PokemonType.STEEL, 0.3, 33, Abilities.SWARM, Abilities.HUSTLE, Abilities.TRUANT, 484, 58, 109, 112, 48, 48, 109, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DEINO, 5, false, false, false, "Irate Pokémon", PokemonType.DARK, PokemonType.DRAGON, 0.8, 17.3, Abilities.HUSTLE, Abilities.NONE, Abilities.NONE, 300, 52, 65, 50, 45, 50, 38, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ZWEILOUS, 5, false, false, false, "Hostile Pokémon", PokemonType.DARK, PokemonType.DRAGON, 1.4, 50, Abilities.HUSTLE, Abilities.NONE, Abilities.NONE, 420, 72, 85, 70, 65, 70, 58, 45, 35, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HYDREIGON, 5, false, false, false, "Brutal Pokémon", PokemonType.DARK, PokemonType.DRAGON, 1.8, 160, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 600, 92, 105, 90, 125, 90, 98, 45, 35, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.LARVESTA, 5, false, false, false, "Torch Pokémon", PokemonType.BUG, PokemonType.FIRE, 1.1, 28.8, Abilities.FLAME_BODY, Abilities.NONE, Abilities.SWARM, 360, 55, 85, 55, 50, 55, 60, 45, 50, 72, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.VOLCARONA, 5, false, false, false, "Sun Pokémon", PokemonType.BUG, PokemonType.FIRE, 1.6, 46, Abilities.FLAME_BODY, Abilities.NONE, Abilities.SWARM, 550, 85, 60, 65, 135, 105, 100, 15, 50, 275, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.COBALION, 5, true, false, false, "Iron Will Pokémon", PokemonType.STEEL, PokemonType.FIGHTING, 2.1, 250, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 90, 129, 90, 72, 108, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TERRAKION, 5, true, false, false, "Cavern Pokémon", PokemonType.ROCK, PokemonType.FIGHTING, 1.9, 260, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 129, 90, 72, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.VIRIZION, 5, true, false, false, "Grassland Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 2, 200, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 90, 72, 90, 129, 108, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TORNADUS, 5, true, false, false, "Cyclone Pokémon", PokemonType.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Incarnate Forme", "incarnate", PokemonType.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), + new PokemonForm("Therian Forme", "therian", PokemonType.FLYING, null, 1.4, 63, Abilities.REGENERATOR, Abilities.NONE, Abilities.REGENERATOR, 580, 79, 100, 80, 110, 90, 121, 3, 90, 290), + ), + new PokemonSpecies(Species.THUNDURUS, 5, true, false, false, "Bolt Strike Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Incarnate Forme", "incarnate", PokemonType.ELECTRIC, PokemonType.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), + new PokemonForm("Therian Forme", "therian", PokemonType.ELECTRIC, PokemonType.FLYING, 3, 61, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.VOLT_ABSORB, 580, 79, 105, 70, 145, 80, 101, 3, 90, 290), + ), + new PokemonSpecies(Species.RESHIRAM, 5, false, true, false, "Vast White Pokémon", PokemonType.DRAGON, PokemonType.FIRE, 3.2, 330, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 680, 100, 120, 100, 150, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ZEKROM, 5, false, true, false, "Deep Black Pokémon", PokemonType.DRAGON, PokemonType.ELECTRIC, 2.9, 345, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 680, 100, 150, 120, 120, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.LANDORUS, 5, true, false, false, "Abundance Pokémon", PokemonType.GROUND, PokemonType.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Incarnate Forme", "incarnate", PokemonType.GROUND, PokemonType.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, false, null, true), + new PokemonForm("Therian Forme", "therian", PokemonType.GROUND, PokemonType.FLYING, 1.3, 68, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 89, 145, 90, 105, 80, 91, 3, 90, 300), + ), + new PokemonSpecies(Species.KYUREM, 5, false, true, false, "Boundary Pokémon", PokemonType.DRAGON, PokemonType.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, false, null, true), + new PokemonForm("Black", "black", PokemonType.DRAGON, PokemonType.ICE, 3.3, 325, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 700, 125, 170, 100, 120, 90, 95, 3, 0, 350), + new PokemonForm("White", "white", PokemonType.DRAGON, PokemonType.ICE, 3.6, 325, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 700, 125, 120, 90, 170, 100, 95, 3, 0, 350), + ), + new PokemonSpecies(Species.KELDEO, 5, false, false, true, "Colt Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false, true, + new PokemonForm("Ordinary Form", "ordinary", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, false, null, true), + new PokemonForm("Resolute", "resolute", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290), + ), + new PokemonSpecies(Species.MELOETTA, 5, false, false, true, "Melody Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Aria Forme", "aria", PokemonType.NORMAL, PokemonType.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 300, false, null, true), + new PokemonForm("Pirouette Forme", "pirouette", PokemonType.NORMAL, PokemonType.FIGHTING, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 128, 90, 77, 77, 128, 3, 100, 300, false, null, true), + ), + new PokemonSpecies(Species.GENESECT, 5, false, false, true, "Paleozoic Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, false, null, true), + new PokemonForm("Shock Drive", "shock", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + new PokemonForm("Burn Drive", "burn", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + new PokemonForm("Chill Drive", "chill", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + new PokemonForm("Douse Drive", "douse", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + ), + new PokemonSpecies(Species.CHESPIN, 6, false, false, false, "Spiny Nut Pokémon", PokemonType.GRASS, null, 0.4, 9, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 313, 56, 61, 65, 48, 45, 38, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUILLADIN, 6, false, false, false, "Spiny Armor Pokémon", PokemonType.GRASS, null, 0.7, 29, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 405, 61, 78, 95, 56, 58, 57, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CHESNAUGHT, 6, false, false, false, "Spiny Armor Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.6, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 530, 88, 107, 122, 74, 75, 64, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FENNEKIN, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 0.4, 9.4, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 307, 40, 45, 40, 62, 60, 60, 45, 70, 61, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.BRAIXEN, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 1, 14.5, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 409, 59, 59, 58, 90, 70, 73, 45, 70, 143, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DELPHOX, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, PokemonType.PSYCHIC, 1.5, 39, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 534, 75, 69, 72, 114, 100, 104, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FROAKIE, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false, false, + new PokemonForm("Normal", "", PokemonType.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, null, true), + new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true), + ), + new PokemonSpecies(Species.FROGADIER, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false, false, + new PokemonForm("Normal", "", PokemonType.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, null, true), + new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, "", true), + ), + new PokemonSpecies(Species.GRENINJA, 6, false, false, false, "Ninja Pokémon", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, false, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, null, true), + new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, "", true), + new PokemonForm("Ash", "ash", PokemonType.WATER, PokemonType.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 640, 72, 145, 67, 153, 71, 132, 45, 70, 265), + ), + new PokemonSpecies(Species.BUNNELBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, null, 0.4, 5, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 237, 38, 36, 38, 32, 36, 57, 255, 50, 47, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DIGGERSBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, PokemonType.GROUND, 1, 42.4, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 423, 85, 56, 77, 50, 77, 78, 127, 50, 148, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FLETCHLING, 6, false, false, false, "Tiny Robin Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.7, Abilities.BIG_PECKS, Abilities.NONE, Abilities.GALE_WINGS, 278, 45, 50, 43, 40, 38, 62, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.FLETCHINDER, 6, false, false, false, "Ember Pokémon", PokemonType.FIRE, PokemonType.FLYING, 0.7, 16, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 382, 62, 73, 55, 56, 52, 84, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TALONFLAME, 6, false, false, false, "Scorching Pokémon", PokemonType.FIRE, PokemonType.FLYING, 1.2, 24.5, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 499, 78, 81, 71, 74, 69, 126, 45, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SCATTERBUG, 6, false, false, false, "Scatterdust Pokémon", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Meadow Pattern", "meadow", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Icy Snow Pattern", "icy-snow", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Polar Pattern", "polar", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Tundra Pattern", "tundra", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Continental Pattern", "continental", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Garden Pattern", "garden", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Elegant Pattern", "elegant", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Modern Pattern", "modern", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Marine Pattern", "marine", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Archipelago Pattern", "archipelago", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("High Plains Pattern", "high-plains", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Sandstorm Pattern", "sandstorm", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("River Pattern", "river", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Monsoon Pattern", "monsoon", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Savanna Pattern", "savanna", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Sun Pattern", "sun", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Ocean Pattern", "ocean", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Jungle Pattern", "jungle", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Fancy Pattern", "fancy", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Poké Ball Pattern", "poke-ball", PokemonType.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + ), + new PokemonSpecies(Species.SPEWPA, 6, false, false, false, "Scatterdust Pokémon", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.SHED_SKIN, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Meadow Pattern", "meadow", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Icy Snow Pattern", "icy-snow", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Polar Pattern", "polar", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Tundra Pattern", "tundra", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Continental Pattern", "continental", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Garden Pattern", "garden", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Elegant Pattern", "elegant", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Modern Pattern", "modern", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Marine Pattern", "marine", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Archipelago Pattern", "archipelago", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("High Plains Pattern", "high-plains", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Sandstorm Pattern", "sandstorm", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("River Pattern", "river", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Monsoon Pattern", "monsoon", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Savanna Pattern", "savanna", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Sun Pattern", "sun", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Ocean Pattern", "ocean", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Jungle Pattern", "jungle", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Fancy Pattern", "fancy", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Poké Ball Pattern", "poke-ball", PokemonType.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + ), + new PokemonSpecies(Species.VIVILLON, 6, false, false, false, "Scale Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Meadow Pattern", "meadow", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Icy Snow Pattern", "icy-snow", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Polar Pattern", "polar", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Tundra Pattern", "tundra", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Continental Pattern", "continental", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Garden Pattern", "garden", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Elegant Pattern", "elegant", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Modern Pattern", "modern", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Marine Pattern", "marine", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Archipelago Pattern", "archipelago", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("High Plains Pattern", "high-plains", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Sandstorm Pattern", "sandstorm", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("River Pattern", "river", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Monsoon Pattern", "monsoon", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Savanna Pattern", "savanna", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Sun Pattern", "sun", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Ocean Pattern", "ocean", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Jungle Pattern", "jungle", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Fancy Pattern", "fancy", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Poké Ball Pattern", "poke-ball", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + ), + new PokemonSpecies(Species.LITLEO, 6, false, false, false, "Lion Cub Pokémon", PokemonType.FIRE, PokemonType.NORMAL, 0.6, 13.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 369, 62, 50, 58, 73, 54, 72, 220, 70, 74, GrowthRate.MEDIUM_SLOW, 12.5, false), + new PokemonSpecies(Species.PYROAR, 6, false, false, false, "Royal Pokémon", PokemonType.FIRE, PokemonType.NORMAL, 1.5, 81.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 507, 86, 68, 72, 109, 66, 106, 65, 70, 177, GrowthRate.MEDIUM_SLOW, 12.5, true), + new PokemonSpecies(Species.FLABEBE, 6, false, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, GrowthRate.MEDIUM_FAST, 0, false, false, + new PokemonForm("Red Flower", "red", PokemonType.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("Yellow Flower", "yellow", PokemonType.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("Orange Flower", "orange", PokemonType.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("Blue Flower", "blue", PokemonType.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("White Flower", "white", PokemonType.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + ), + new PokemonSpecies(Species.FLOETTE, 6, false, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, GrowthRate.MEDIUM_FAST, 0, false, false, + new PokemonForm("Red Flower", "red", PokemonType.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + new PokemonForm("Yellow Flower", "yellow", PokemonType.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + new PokemonForm("Orange Flower", "orange", PokemonType.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + new PokemonForm("Blue Flower", "blue", PokemonType.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + new PokemonForm("White Flower", "white", PokemonType.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + ), + new PokemonSpecies(Species.FLORGES, 6, false, false, false, "Garden Pokémon", PokemonType.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, GrowthRate.MEDIUM_FAST, 0, false, false, + new PokemonForm("Red Flower", "red", PokemonType.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("Yellow Flower", "yellow", PokemonType.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("Orange Flower", "orange", PokemonType.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("Blue Flower", "blue", PokemonType.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("White Flower", "white", PokemonType.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + ), + new PokemonSpecies(Species.SKIDDO, 6, false, false, false, "Mount Pokémon", PokemonType.GRASS, null, 0.9, 31, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 350, 66, 65, 48, 62, 57, 52, 200, 70, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GOGOAT, 6, false, false, false, "Mount Pokémon", PokemonType.GRASS, null, 1.7, 91, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 531, 123, 100, 62, 97, 81, 68, 45, 70, 186, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PANCHAM, 6, false, false, false, "Playful Pokémon", PokemonType.FIGHTING, null, 0.6, 8, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 348, 67, 82, 62, 46, 48, 43, 220, 50, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PANGORO, 6, false, false, false, "Daunting Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 2.1, 136, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 495, 95, 124, 78, 69, 71, 58, 65, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FURFROU, 6, false, false, false, "Poodle Pokémon", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Natural Form", "", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Heart Trim", "heart", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Star Trim", "star", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Diamond Trim", "diamond", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Debutante Trim", "debutante", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Matron Trim", "matron", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Dandy Trim", "dandy", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("La Reine Trim", "la-reine", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Kabuki Trim", "kabuki", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Pharaoh Trim", "pharaoh", PokemonType.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + ), + new PokemonSpecies(Species.ESPURR, 6, false, false, false, "Restraint Pokémon", PokemonType.PSYCHIC, null, 0.3, 3.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.OWN_TEMPO, 355, 62, 48, 54, 63, 60, 68, 190, 50, 71, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MEOWSTIC, 6, false, false, false, "Constraint Pokémon", PokemonType.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Male", "male", PokemonType.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, "", true), + new PokemonForm("Female", "female", PokemonType.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.COMPETITIVE, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, null, true), + ), + new PokemonSpecies(Species.HONEDGE, 6, false, false, false, "Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 0.8, 2, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 325, 45, 80, 100, 35, 37, 28, 180, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DOUBLADE, 6, false, false, false, "Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 0.8, 4.5, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 448, 59, 110, 150, 45, 49, 35, 90, 50, 157, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AEGISLASH, 6, false, false, false, "Royal Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Shield Forme", "shield", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, false, "", true), + new PokemonForm("Blade Forme", "blade", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 140, 50, 140, 50, 60, 45, 50, 250), + ), + new PokemonSpecies(Species.SPRITZEE, 6, false, false, false, "Perfume Pokémon", PokemonType.FAIRY, null, 0.2, 0.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 341, 78, 52, 60, 63, 65, 23, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AROMATISSE, 6, false, false, false, "Fragrance Pokémon", PokemonType.FAIRY, null, 0.8, 15.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 462, 101, 72, 72, 99, 89, 29, 140, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SWIRLIX, 6, false, false, false, "Cotton Candy Pokémon", PokemonType.FAIRY, null, 0.4, 3.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.UNBURDEN, 341, 62, 48, 66, 59, 57, 49, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SLURPUFF, 6, false, false, false, "Meringue Pokémon", PokemonType.FAIRY, null, 0.8, 5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.UNBURDEN, 480, 82, 80, 86, 85, 75, 72, 140, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.INKAY, 6, false, false, false, "Revolving Pokémon", PokemonType.DARK, PokemonType.PSYCHIC, 0.4, 3.5, Abilities.CONTRARY, Abilities.SUCTION_CUPS, Abilities.INFILTRATOR, 288, 53, 54, 53, 37, 46, 45, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MALAMAR, 6, false, false, false, "Overturning Pokémon", PokemonType.DARK, PokemonType.PSYCHIC, 1.5, 47, Abilities.CONTRARY, Abilities.SUCTION_CUPS, Abilities.INFILTRATOR, 482, 86, 92, 88, 68, 75, 73, 80, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BINACLE, 6, false, false, false, "Two-Handed Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.5, 31, Abilities.TOUGH_CLAWS, Abilities.SNIPER, Abilities.PICKPOCKET, 306, 42, 52, 67, 39, 56, 50, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BARBARACLE, 6, false, false, false, "Collective Pokémon", PokemonType.ROCK, PokemonType.WATER, 1.3, 96, Abilities.TOUGH_CLAWS, Abilities.SNIPER, Abilities.PICKPOCKET, 500, 72, 105, 115, 54, 86, 68, 45, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SKRELP, 6, false, false, false, "Mock Kelp Pokémon", PokemonType.POISON, PokemonType.WATER, 0.5, 7.3, Abilities.POISON_POINT, Abilities.POISON_TOUCH, Abilities.ADAPTABILITY, 320, 50, 60, 60, 60, 60, 30, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DRAGALGE, 6, false, false, false, "Mock Kelp Pokémon", PokemonType.POISON, PokemonType.DRAGON, 1.8, 81.5, Abilities.POISON_POINT, Abilities.POISON_TOUCH, Abilities.ADAPTABILITY, 494, 65, 75, 90, 97, 123, 44, 55, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CLAUNCHER, 6, false, false, false, "Water Gun Pokémon", PokemonType.WATER, null, 0.5, 8.3, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.NONE, 330, 50, 53, 62, 58, 63, 44, 225, 50, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CLAWITZER, 6, false, false, false, "Howitzer Pokémon", PokemonType.WATER, null, 1.3, 35.3, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.NONE, 500, 71, 73, 88, 120, 89, 59, 55, 50, 100, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HELIOPTILE, 6, false, false, false, "Generator Pokémon", PokemonType.ELECTRIC, PokemonType.NORMAL, 0.5, 6, Abilities.DRY_SKIN, Abilities.SAND_VEIL, Abilities.SOLAR_POWER, 289, 44, 38, 33, 61, 43, 70, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HELIOLISK, 6, false, false, false, "Generator Pokémon", PokemonType.ELECTRIC, PokemonType.NORMAL, 1, 21, Abilities.DRY_SKIN, Abilities.SAND_VEIL, Abilities.SOLAR_POWER, 481, 62, 55, 52, 109, 94, 109, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TYRUNT, 6, false, false, false, "Royal Heir Pokémon", PokemonType.ROCK, PokemonType.DRAGON, 0.8, 26, Abilities.STRONG_JAW, Abilities.NONE, Abilities.STURDY, 362, 58, 89, 77, 45, 45, 48, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.TYRANTRUM, 6, false, false, false, "Despot Pokémon", PokemonType.ROCK, PokemonType.DRAGON, 2.5, 270, Abilities.STRONG_JAW, Abilities.NONE, Abilities.ROCK_HEAD, 521, 82, 121, 119, 69, 59, 71, 45, 50, 182, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.AMAURA, 6, false, false, false, "Tundra Pokémon", PokemonType.ROCK, PokemonType.ICE, 1.3, 25.2, Abilities.REFRIGERATE, Abilities.NONE, Abilities.SNOW_WARNING, 362, 77, 59, 50, 67, 63, 46, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.AURORUS, 6, false, false, false, "Tundra Pokémon", PokemonType.ROCK, PokemonType.ICE, 2.7, 225, Abilities.REFRIGERATE, Abilities.NONE, Abilities.SNOW_WARNING, 521, 123, 77, 72, 99, 92, 58, 45, 50, 104, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SYLVEON, 6, false, false, false, "Intertwining Pokémon", PokemonType.FAIRY, null, 1, 23.5, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.PIXILATE, 525, 95, 65, 65, 110, 130, 60, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.HAWLUCHA, 6, false, false, false, "Wrestling Pokémon", PokemonType.FIGHTING, PokemonType.FLYING, 0.8, 21.5, Abilities.LIMBER, Abilities.UNBURDEN, Abilities.MOLD_BREAKER, 500, 78, 92, 75, 74, 63, 118, 100, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DEDENNE, 6, false, false, false, "Antenna Pokémon", PokemonType.ELECTRIC, PokemonType.FAIRY, 0.2, 2.2, Abilities.CHEEK_POUCH, Abilities.PICKUP, Abilities.PLUS, 431, 67, 58, 57, 81, 67, 101, 180, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CARBINK, 6, false, false, false, "Jewel Pokémon", PokemonType.ROCK, PokemonType.FAIRY, 0.3, 5.7, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.STURDY, 500, 50, 50, 150, 50, 150, 50, 60, 50, 100, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GOOMY, 6, false, false, false, "Soft Tissue Pokémon", PokemonType.DRAGON, null, 0.3, 2.8, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 300, 45, 50, 35, 55, 75, 40, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SLIGGOO, 6, false, false, false, "Soft Tissue Pokémon", PokemonType.DRAGON, null, 0.8, 17.5, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 452, 68, 75, 53, 83, 113, 60, 45, 35, 158, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GOODRA, 6, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 2, 150.5, Abilities.SAP_SIPPER, Abilities.HYDRATION, Abilities.GOOEY, 600, 90, 100, 70, 110, 150, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.KLEFKI, 6, false, false, false, "Key Ring Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 0.2, 3, Abilities.PRANKSTER, Abilities.NONE, Abilities.MAGICIAN, 470, 57, 80, 91, 80, 87, 75, 75, 50, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.PHANTUMP, 6, false, false, false, "Stump Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.4, 7, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 309, 43, 70, 48, 50, 60, 38, 120, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TREVENANT, 6, false, false, false, "Elder Tree Pokémon", PokemonType.GHOST, PokemonType.GRASS, 1.5, 71, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 474, 85, 110, 76, 65, 82, 56, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PUMPKABOO, 6, false, false, false, "Pumpkin Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Average Size", "", PokemonType.GHOST, PokemonType.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, false, null, true), + new PokemonForm("Small Size", "small", PokemonType.GHOST, PokemonType.GRASS, 0.3, 3.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 44, 66, 70, 44, 55, 56, 120, 50, 67, false, "", true), + new PokemonForm("Large Size", "large", PokemonType.GHOST, PokemonType.GRASS, 0.5, 7.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 54, 66, 70, 44, 55, 46, 120, 50, 67, false, "", true), + new PokemonForm("Super Size", "super", PokemonType.GHOST, PokemonType.GRASS, 0.8, 15, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 59, 66, 70, 44, 55, 41, 120, 50, 67, false, "", true), + ), + new PokemonSpecies(Species.GOURGEIST, 6, false, false, false, "Pumpkin Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.9, 12.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Average Size", "", PokemonType.GHOST, PokemonType.GRASS, 0.9, 12.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, false, null, true), + new PokemonForm("Small Size", "small", PokemonType.GHOST, PokemonType.GRASS, 0.7, 9.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 55, 85, 122, 58, 75, 99, 60, 50, 173, false, "", true), + new PokemonForm("Large Size", "large", PokemonType.GHOST, PokemonType.GRASS, 1.1, 14, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 75, 95, 122, 58, 75, 69, 60, 50, 173, false, "", true), + new PokemonForm("Super Size", "super", PokemonType.GHOST, PokemonType.GRASS, 1.7, 39, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 85, 100, 122, 58, 75, 54, 60, 50, 173, false, "", true), + ), + new PokemonSpecies(Species.BERGMITE, 6, false, false, false, "Ice Chunk Pokémon", PokemonType.ICE, null, 1, 99.5, Abilities.OWN_TEMPO, Abilities.ICE_BODY, Abilities.STURDY, 304, 55, 69, 85, 32, 35, 28, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.AVALUGG, 6, false, false, false, "Iceberg Pokémon", PokemonType.ICE, null, 2, 505, Abilities.OWN_TEMPO, Abilities.ICE_BODY, Abilities.STURDY, 514, 95, 117, 184, 44, 46, 28, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.NOIBAT, 6, false, false, false, "Sound Wave Pokémon", PokemonType.FLYING, PokemonType.DRAGON, 0.5, 8, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 245, 40, 30, 35, 45, 40, 55, 190, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.NOIVERN, 6, false, false, false, "Sound Wave Pokémon", PokemonType.FLYING, PokemonType.DRAGON, 1.5, 85, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 535, 85, 70, 80, 97, 80, 123, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.XERNEAS, 6, false, true, false, "Life Pokémon", PokemonType.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Neutral Mode", "neutral", PokemonType.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, false, null, true), + new PokemonForm("Active Mode", "active", PokemonType.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340) + ), + new PokemonSpecies(Species.YVELTAL, 6, false, true, false, "Destruction Pokémon", PokemonType.DARK, PokemonType.FLYING, 5.8, 203, Abilities.DARK_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ZYGARDE, 6, false, true, false, "Order Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("50% Forme", "50", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), + new PokemonForm("10% Forme", "10", PokemonType.DRAGON, PokemonType.GROUND, 1.2, 33.5, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 243, false, null, true), + new PokemonForm("50% Forme Power Construct", "50-pc", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), + new PokemonForm("10% Forme Power Construct", "10-pc", PokemonType.DRAGON, PokemonType.GROUND, 1.2, 33.5, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 243, false, "10", true), + new PokemonForm("Complete Forme (50% PC)", "complete", PokemonType.DRAGON, PokemonType.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354), + new PokemonForm("Complete Forme (10% PC)", "10-complete", PokemonType.DRAGON, PokemonType.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354, false, "complete"), + ), + new PokemonSpecies(Species.DIANCIE, 6, false, false, true, "Jewel Pokémon", PokemonType.ROCK, PokemonType.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ROCK, PokemonType.FAIRY, 1.1, 27.8, Abilities.MAGIC_BOUNCE, Abilities.NONE, Abilities.NONE, 700, 50, 160, 110, 160, 110, 110, 3, 50, 300), + ), + new PokemonSpecies(Species.HOOPA, 6, false, false, true, "Mischief Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Hoopa Confined", "", PokemonType.PSYCHIC, PokemonType.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, false, null, true), + new PokemonForm("Hoopa Unbound", "unbound", PokemonType.PSYCHIC, PokemonType.DARK, 6.5, 490, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 680, 80, 160, 60, 170, 130, 80, 3, 100, 340), + ), + new PokemonSpecies(Species.VOLCANION, 6, false, false, true, "Steam Pokémon", PokemonType.FIRE, PokemonType.WATER, 1.7, 195, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 600, 80, 110, 120, 130, 90, 70, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ROWLET, 7, false, false, false, "Grass Quill Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.3, 1.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 320, 68, 55, 55, 50, 50, 42, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DARTRIX, 7, false, false, false, "Blade Quill Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.7, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 420, 78, 75, 75, 70, 70, 52, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DECIDUEYE, 7, false, false, false, "Arrow Quill Pokémon", PokemonType.GRASS, PokemonType.GHOST, 1.6, 36.6, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 530, 78, 107, 75, 100, 100, 70, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.LITTEN, 7, false, false, false, "Fire Cat Pokémon", PokemonType.FIRE, null, 0.4, 4.3, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 320, 45, 65, 40, 60, 40, 70, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TORRACAT, 7, false, false, false, "Fire Cat Pokémon", PokemonType.FIRE, null, 0.7, 25, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 420, 65, 85, 50, 80, 50, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.INCINEROAR, 7, false, false, false, "Heel Pokémon", PokemonType.FIRE, PokemonType.DARK, 1.8, 83, Abilities.BLAZE, Abilities.NONE, Abilities.INTIMIDATE, 530, 95, 115, 90, 80, 90, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.POPPLIO, 7, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, null, 0.4, 7.5, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 320, 50, 54, 54, 66, 56, 40, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.BRIONNE, 7, false, false, false, "Pop Star Pokémon", PokemonType.WATER, null, 0.6, 17.5, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 420, 60, 69, 69, 91, 81, 50, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PRIMARINA, 7, false, false, false, "Soloist Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.8, 44, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 530, 80, 74, 74, 126, 116, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PIKIPEK, 7, false, false, false, "Woodpecker Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.2, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 265, 35, 75, 30, 30, 30, 65, 255, 70, 53, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TRUMBEAK, 7, false, false, false, "Bugle Beak Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 14.8, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 355, 55, 85, 50, 40, 50, 75, 120, 70, 124, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TOUCANNON, 7, false, false, false, "Cannon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.1, 26, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.SHEER_FORCE, 485, 80, 120, 75, 75, 75, 60, 45, 70, 243, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.YUNGOOS, 7, false, false, false, "Loitering Pokémon", PokemonType.NORMAL, null, 0.4, 6, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 253, 48, 70, 30, 30, 30, 45, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GUMSHOOS, 7, false, false, false, "Stakeout Pokémon", PokemonType.NORMAL, null, 0.7, 14.2, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 418, 88, 110, 60, 55, 60, 45, 127, 70, 146, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GRUBBIN, 7, false, false, false, "Larva Pokémon", PokemonType.BUG, null, 0.4, 4.4, Abilities.SWARM, Abilities.NONE, Abilities.NONE, 300, 47, 62, 45, 55, 45, 46, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CHARJABUG, 7, false, false, false, "Battery Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.5, 10.5, Abilities.BATTERY, Abilities.NONE, Abilities.NONE, 400, 57, 82, 95, 55, 75, 36, 120, 50, 140, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.VIKAVOLT, 7, false, false, false, "Stag Beetle Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 1.5, 45, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 500, 77, 70, 90, 145, 75, 43, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CRABRAWLER, 7, false, false, false, "Boxing Pokémon", PokemonType.FIGHTING, null, 0.6, 7, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 338, 47, 82, 57, 42, 47, 63, 225, 70, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CRABOMINABLE, 7, false, false, false, "Woolly Crab Pokémon", PokemonType.FIGHTING, PokemonType.ICE, 1.7, 180, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 478, 97, 132, 77, 62, 67, 43, 60, 70, 167, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ORICORIO, 7, false, false, false, "Dancing Pokémon", PokemonType.FIRE, PokemonType.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, GrowthRate.MEDIUM_FAST, 25, false, false, + new PokemonForm("Baile Style", "baile", PokemonType.FIRE, PokemonType.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, "", true), + new PokemonForm("Pom-Pom Style", "pompom", PokemonType.ELECTRIC, PokemonType.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), + new PokemonForm("Pau Style", "pau", PokemonType.PSYCHIC, PokemonType.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), + new PokemonForm("Sensu Style", "sensu", PokemonType.GHOST, PokemonType.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), + ), + new PokemonSpecies(Species.CUTIEFLY, 7, false, false, false, "Bee Fly Pokémon", PokemonType.BUG, PokemonType.FAIRY, 0.1, 0.2, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 304, 40, 45, 40, 55, 40, 84, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RIBOMBEE, 7, false, false, false, "Bee Fly Pokémon", PokemonType.BUG, PokemonType.FAIRY, 0.2, 0.5, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 464, 60, 55, 60, 95, 70, 124, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ROCKRUFF, 7, false, false, false, "Puppy Pokémon", PokemonType.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Normal", "", PokemonType.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, null, true), + new PokemonForm("Own Tempo", "own-tempo", PokemonType.ROCK, null, 0.5, 9.2, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.OWN_TEMPO, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, "", true), + ), + new PokemonSpecies(Species.LYCANROC, 7, false, false, false, "Wolf Pokémon", PokemonType.ROCK, null, 0.8, 25, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Midday Form", "midday", PokemonType.ROCK, null, 0.8, 25, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, false, "", true), + new PokemonForm("Midnight Form", "midnight", PokemonType.ROCK, null, 1.1, 25, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.NO_GUARD, 487, 85, 115, 75, 55, 75, 82, 90, 50, 170, false, null, true), + new PokemonForm("Dusk Form", "dusk", PokemonType.ROCK, null, 0.8, 25, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 487, 75, 117, 65, 55, 65, 110, 90, 50, 170, false, null, true), + ), + new PokemonSpecies(Species.WISHIWASHI, 7, false, false, false, "Small Fry Pokémon", PokemonType.WATER, null, 0.2, 0.3, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, GrowthRate.FAST, 50, false, false, + new PokemonForm("Solo Form", "", PokemonType.WATER, null, 0.2, 0.3, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, false, null, true), + new PokemonForm("School", "school", PokemonType.WATER, null, 8.2, 78.6, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 620, 45, 140, 130, 140, 135, 30, 60, 50, 217), + ), + new PokemonSpecies(Species.MAREANIE, 7, false, false, false, "Brutal Star Pokémon", PokemonType.POISON, PokemonType.WATER, 0.4, 8, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 305, 50, 53, 62, 43, 52, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TOXAPEX, 7, false, false, false, "Brutal Star Pokémon", PokemonType.POISON, PokemonType.WATER, 0.7, 14.5, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 495, 50, 63, 152, 53, 142, 35, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MUDBRAY, 7, false, false, false, "Donkey Pokémon", PokemonType.GROUND, null, 1, 110, Abilities.OWN_TEMPO, Abilities.STAMINA, Abilities.INNER_FOCUS, 385, 70, 100, 70, 45, 55, 45, 190, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MUDSDALE, 7, false, false, false, "Draft Horse Pokémon", PokemonType.GROUND, null, 2.5, 920, Abilities.OWN_TEMPO, Abilities.STAMINA, Abilities.INNER_FOCUS, 500, 100, 125, 100, 55, 85, 35, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DEWPIDER, 7, false, false, false, "Water Bubble Pokémon", PokemonType.WATER, PokemonType.BUG, 0.3, 4, Abilities.WATER_BUBBLE, Abilities.NONE, Abilities.WATER_ABSORB, 269, 38, 40, 52, 40, 72, 27, 200, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ARAQUANID, 7, false, false, false, "Water Bubble Pokémon", PokemonType.WATER, PokemonType.BUG, 1.8, 82, Abilities.WATER_BUBBLE, Abilities.NONE, Abilities.WATER_ABSORB, 454, 68, 70, 92, 50, 132, 42, 100, 50, 159, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FOMANTIS, 7, false, false, false, "Sickle Grass Pokémon", PokemonType.GRASS, null, 0.3, 1.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CONTRARY, 250, 40, 55, 35, 50, 35, 35, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LURANTIS, 7, false, false, false, "Bloom Sickle Pokémon", PokemonType.GRASS, null, 0.9, 18.5, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.CONTRARY, 480, 70, 105, 90, 80, 90, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MORELULL, 7, false, false, false, "Illuminating Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.2, 1.5, Abilities.ILLUMINATE, Abilities.EFFECT_SPORE, Abilities.RAIN_DISH, 285, 40, 35, 55, 65, 75, 15, 190, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SHIINOTIC, 7, false, false, false, "Illuminating Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 1, 11.5, Abilities.ILLUMINATE, Abilities.EFFECT_SPORE, Abilities.RAIN_DISH, 405, 60, 45, 80, 90, 100, 30, 75, 50, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SALANDIT, 7, false, false, false, "Toxic Lizard Pokémon", PokemonType.POISON, PokemonType.FIRE, 0.6, 4.8, Abilities.CORROSION, Abilities.NONE, Abilities.OBLIVIOUS, 320, 48, 44, 40, 71, 40, 77, 120, 50, 64, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.SALAZZLE, 7, false, false, false, "Toxic Lizard Pokémon", PokemonType.POISON, PokemonType.FIRE, 1.2, 22.2, Abilities.CORROSION, Abilities.NONE, Abilities.OBLIVIOUS, 480, 68, 64, 60, 111, 60, 117, 45, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.STUFFUL, 7, false, false, false, "Flailing Pokémon", PokemonType.NORMAL, PokemonType.FIGHTING, 0.5, 6.8, Abilities.FLUFFY, Abilities.KLUTZ, Abilities.CUTE_CHARM, 340, 70, 75, 50, 45, 50, 50, 140, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BEWEAR, 7, false, false, false, "Strong Arm Pokémon", PokemonType.NORMAL, PokemonType.FIGHTING, 2.1, 135, Abilities.FLUFFY, Abilities.KLUTZ, Abilities.UNNERVE, 500, 120, 125, 80, 55, 60, 60, 70, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BOUNSWEET, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 0.3, 3.2, Abilities.LEAF_GUARD, Abilities.OBLIVIOUS, Abilities.SWEET_VEIL, 210, 42, 30, 38, 30, 38, 32, 235, 50, 42, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.STEENEE, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 0.7, 8.2, Abilities.LEAF_GUARD, Abilities.OBLIVIOUS, Abilities.SWEET_VEIL, 290, 52, 40, 48, 40, 48, 62, 120, 50, 102, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.TSAREENA, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 1.2, 21.4, Abilities.LEAF_GUARD, Abilities.QUEENLY_MAJESTY, Abilities.SWEET_VEIL, 510, 72, 120, 98, 50, 98, 72, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.COMFEY, 7, false, false, false, "Posy Picker Pokémon", PokemonType.FAIRY, null, 0.1, 0.3, Abilities.FLOWER_VEIL, Abilities.TRIAGE, Abilities.NATURAL_CURE, 485, 51, 52, 90, 82, 110, 100, 60, 50, 170, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.ORANGURU, 7, false, false, false, "Sage Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.5, 76, Abilities.INNER_FOCUS, Abilities.TELEPATHY, Abilities.SYMBIOSIS, 490, 90, 60, 80, 90, 110, 60, 45, 50, 172, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PASSIMIAN, 7, false, false, false, "Teamwork Pokémon", PokemonType.FIGHTING, null, 2, 82.8, Abilities.RECEIVER, Abilities.NONE, Abilities.DEFIANT, 490, 100, 120, 90, 40, 60, 80, 45, 50, 172, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.WIMPOD, 7, false, false, false, "Turn Tail Pokémon", PokemonType.BUG, PokemonType.WATER, 0.5, 12, Abilities.WIMP_OUT, Abilities.NONE, Abilities.RUN_AWAY, 230, 25, 35, 40, 20, 30, 80, 90, 50, 46, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden + new PokemonSpecies(Species.GOLISOPOD, 7, false, false, false, "Hard Scale Pokémon", PokemonType.BUG, PokemonType.WATER, 2, 108, Abilities.EMERGENCY_EXIT, Abilities.NONE, Abilities.ANTICIPATION, 530, 75, 125, 140, 60, 90, 40, 45, 50, 186, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden + new PokemonSpecies(Species.SANDYGAST, 7, false, false, false, "Sand Heap Pokémon", PokemonType.GHOST, PokemonType.GROUND, 0.5, 70, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 320, 55, 55, 80, 70, 45, 15, 140, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PALOSSAND, 7, false, false, false, "Sand Castle Pokémon", PokemonType.GHOST, PokemonType.GROUND, 1.3, 250, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 480, 85, 75, 110, 100, 75, 35, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PYUKUMUKU, 7, false, false, false, "Sea Cucumber Pokémon", PokemonType.WATER, null, 0.3, 1.2, Abilities.INNARDS_OUT, Abilities.NONE, Abilities.UNAWARE, 410, 55, 60, 130, 30, 130, 5, 60, 50, 144, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.TYPE_NULL, 7, true, false, false, "Synthetic Pokémon", PokemonType.NORMAL, null, 1.9, 120.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.NONE, 534, 95, 95, 95, 95, 95, 59, 3, 0, 107, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SILVALLY, 7, true, false, false, "Synthetic Pokémon", PokemonType.NORMAL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, GrowthRate.SLOW, null, false, false, + new PokemonForm("Type: Normal", "normal", PokemonType.NORMAL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, false, "", true), + new PokemonForm("Type: Fighting", "fighting", PokemonType.FIGHTING, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Flying", "flying", PokemonType.FLYING, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Poison", "poison", PokemonType.POISON, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Ground", "ground", PokemonType.GROUND, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Rock", "rock", PokemonType.ROCK, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Bug", "bug", PokemonType.BUG, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Ghost", "ghost", PokemonType.GHOST, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Steel", "steel", PokemonType.STEEL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Fire", "fire", PokemonType.FIRE, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Water", "water", PokemonType.WATER, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Grass", "grass", PokemonType.GRASS, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Electric", "electric", PokemonType.ELECTRIC, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Psychic", "psychic", PokemonType.PSYCHIC, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Ice", "ice", PokemonType.ICE, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Dragon", "dragon", PokemonType.DRAGON, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Dark", "dark", PokemonType.DARK, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Fairy", "fairy", PokemonType.FAIRY, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + ), + new PokemonSpecies(Species.MINIOR, 7, false, false, false, "Meteor Pokémon", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, GrowthRate.MEDIUM_SLOW, null, false, false, + new PokemonForm("Red Meteor Form", "red-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Orange Meteor Form", "orange-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Yellow Meteor Form", "yellow-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Green Meteor Form", "green-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Blue Meteor Form", "blue-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Indigo Meteor Form", "indigo-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Violet Meteor Form", "violet-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Red Core Form", "red", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Orange Core Form", "orange", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Yellow Core Form", "yellow", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Green Core Form", "green", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Blue Core Form", "blue", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Indigo Core Form", "indigo", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Violet Core Form", "violet", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + ), + new PokemonSpecies(Species.KOMALA, 7, false, false, false, "Drowsing Pokémon", PokemonType.NORMAL, null, 0.4, 19.9, Abilities.COMATOSE, Abilities.NONE, Abilities.NONE, 480, 65, 115, 65, 75, 95, 65, 45, 70, 168, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TURTONATOR, 7, false, false, false, "Blast Turtle Pokémon", PokemonType.FIRE, PokemonType.DRAGON, 2, 212, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.NONE, 485, 60, 78, 135, 91, 85, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TOGEDEMARU, 7, false, false, false, "Roly-Poly Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 0.3, 3.3, Abilities.IRON_BARBS, Abilities.LIGHTNING_ROD, Abilities.STURDY, 435, 65, 98, 63, 40, 73, 96, 180, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MIMIKYU, 7, false, false, false, "Disguise Pokémon", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Disguised Form", "disguised", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, null, true), + new PokemonForm("Busted Form", "busted", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167), + ), + new PokemonSpecies(Species.BRUXISH, 7, false, false, false, "Gnash Teeth Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 0.9, 19, Abilities.DAZZLING, Abilities.STRONG_JAW, Abilities.WONDER_SKIN, 475, 68, 105, 70, 70, 70, 92, 80, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DRAMPA, 7, false, false, false, "Placid Pokémon", PokemonType.NORMAL, PokemonType.DRAGON, 3, 185, Abilities.BERSERK, Abilities.SAP_SIPPER, Abilities.CLOUD_NINE, 485, 78, 60, 85, 135, 91, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DHELMISE, 7, false, false, false, "Sea Creeper Pokémon", PokemonType.GHOST, PokemonType.GRASS, 3.9, 210, Abilities.STEELWORKER, Abilities.NONE, Abilities.NONE, 517, 70, 131, 100, 86, 90, 40, 25, 50, 181, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.JANGMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, null, 0.6, 29.7, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 300, 45, 55, 65, 45, 45, 45, 45, 50, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HAKAMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, PokemonType.FIGHTING, 1.2, 47, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 420, 55, 75, 90, 65, 70, 65, 45, 50, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.KOMMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, PokemonType.FIGHTING, 1.6, 78.2, Abilities.BULLETPROOF, Abilities.SOUNDPROOF, Abilities.OVERCOAT, 600, 75, 110, 125, 100, 105, 85, 45, 50, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TAPU_KOKO, 7, true, false, false, "Land Spirit Pokémon", PokemonType.ELECTRIC, PokemonType.FAIRY, 1.8, 20.5, Abilities.ELECTRIC_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 115, 85, 95, 75, 130, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TAPU_LELE, 7, true, false, false, "Land Spirit Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.2, 18.6, Abilities.PSYCHIC_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 85, 75, 130, 115, 95, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TAPU_BULU, 7, true, false, false, "Land Spirit Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 1.9, 45.5, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 130, 115, 85, 95, 75, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TAPU_FINI, 7, true, false, false, "Land Spirit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.3, 21.2, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 75, 115, 95, 130, 85, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.COSMOG, 7, true, false, false, "Nebula Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.1, Abilities.UNAWARE, Abilities.NONE, Abilities.NONE, 200, 43, 29, 31, 29, 31, 37, 45, 0, 40, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.COSMOEM, 7, true, false, false, "Protostar Pokémon", PokemonType.PSYCHIC, null, 0.1, 999.9, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 400, 43, 29, 131, 29, 131, 37, 45, 0, 140, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SOLGALEO, 7, false, true, false, "Sunne Pokémon", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.LUNALA, 7, false, true, false, "Moone Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.NIHILEGO, 7, true, false, false, "Parasite Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.2, 55.5, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 109, 53, 47, 127, 131, 103, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.BUZZWOLE, 7, true, false, false, "Swollen Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 2.4, 333.6, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 107, 139, 139, 53, 53, 79, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.PHEROMOSA, 7, true, false, false, "Lissome Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.8, 25, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 71, 137, 37, 137, 37, 151, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.XURKITREE, 7, true, false, false, "Glowing Pokémon", PokemonType.ELECTRIC, null, 3.8, 100, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 83, 89, 71, 173, 71, 83, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CELESTEELA, 7, true, false, false, "Launch Pokémon", PokemonType.STEEL, PokemonType.FLYING, 9.2, 999.9, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 97, 101, 103, 107, 101, 61, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.KARTANA, 7, true, false, false, "Drawn Sword Pokémon", PokemonType.GRASS, PokemonType.STEEL, 0.3, 0.1, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 59, 181, 131, 59, 31, 109, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GUZZLORD, 7, true, false, false, "Junkivore Pokémon", PokemonType.DARK, PokemonType.DRAGON, 5.5, 888, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 223, 101, 53, 97, 53, 43, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.NECROZMA, 7, false, true, false, "Prism Pokémon", PokemonType.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, false, null, true), + new PokemonForm("Dusk Mane", "dusk-mane", PokemonType.PSYCHIC, PokemonType.STEEL, 3.8, 460, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 157, 127, 113, 109, 77, 255, 0, 340), + new PokemonForm("Dawn Wings", "dawn-wings", PokemonType.PSYCHIC, PokemonType.GHOST, 4.2, 350, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 113, 109, 157, 127, 77, 255, 0, 340), + new PokemonForm("Ultra", "ultra", PokemonType.PSYCHIC, PokemonType.DRAGON, 7.5, 230, Abilities.NEUROFORCE, Abilities.NONE, Abilities.NONE, 754, 97, 167, 97, 167, 97, 129, 255, 0, 377), + ), + new PokemonSpecies(Species.MAGEARNA, 7, false, false, true, "Artificial Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), + new PokemonForm("Original", "original", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), + ), + new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true), + new PokemonForm("Zenith", "zenith", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true) + ), + new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, PokemonType.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.STAKATAKA, 7, true, false, false, "Rampart Pokémon", PokemonType.ROCK, PokemonType.STEEL, 5.5, 820, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 61, 131, 211, 53, 101, 13, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.BLACEPHALON, 7, true, false, false, "Fireworks Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.8, 13, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 53, 127, 53, 151, 79, 107, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ZERAORA, 7, false, false, true, "Thunderclap Pokémon", PokemonType.ELECTRIC, null, 1.5, 44.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.NONE, 600, 88, 112, 75, 102, 80, 143, 3, 0, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MELTAN, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 0.2, 8, Abilities.MAGNET_PULL, Abilities.NONE, Abilities.NONE, 300, 46, 65, 65, 55, 35, 34, 3, 0, 150, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MELMETAL, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, null, 25, 999.9, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 700, 175, 165, 155, 85, 75, 45, 3, 0, 300), + ), + new PokemonSpecies(Species.GROOKEY, 8, false, false, false, "Chimp Pokémon", PokemonType.GRASS, null, 0.3, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 310, 50, 65, 50, 40, 40, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.THWACKEY, 8, false, false, false, "Beat Pokémon", PokemonType.GRASS, null, 0.7, 14, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 420, 70, 85, 70, 55, 60, 80, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.RILLABOOM, 8, false, false, false, "Drummer Pokémon", PokemonType.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, null, 28, 999.9, Abilities.GRASSY_SURGE, Abilities.NONE, Abilities.GRASSY_SURGE, 630, 125, 150, 105, 85, 85, 80, 45, 50, 265), + ), + new PokemonSpecies(Species.SCORBUNNY, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.3, 4.5, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 310, 50, 71, 40, 40, 40, 69, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.RABOOT, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.6, 9, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 420, 65, 86, 60, 55, 60, 94, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CINDERACE, 8, false, false, false, "Striker Pokémon", PokemonType.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, null, 27, 999.9, Abilities.LIBERO, Abilities.NONE, Abilities.LIBERO, 630, 100, 146, 80, 90, 80, 134, 45, 50, 265), + ), + new PokemonSpecies(Species.SOBBLE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.3, 4, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 310, 50, 40, 40, 70, 40, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.DRIZZILE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.7, 11.5, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 420, 65, 60, 55, 95, 55, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.INTELEON, 8, false, false, false, "Secret Agent Pokémon", PokemonType.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 40, 999.9, Abilities.SNIPER, Abilities.NONE, Abilities.SNIPER, 630, 95, 97, 77, 147, 77, 137, 45, 50, 265), + ), + new PokemonSpecies(Species.SKWOVET, 8, false, false, false, "Cheeky Pokémon", PokemonType.NORMAL, null, 0.3, 2.5, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 275, 70, 55, 55, 35, 35, 25, 255, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GREEDENT, 8, false, false, false, "Greedy Pokémon", PokemonType.NORMAL, null, 0.6, 6, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 460, 120, 95, 95, 55, 75, 20, 90, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ROOKIDEE, 8, false, false, false, "Tiny Bird Pokémon", PokemonType.FLYING, null, 0.2, 1.8, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 245, 38, 47, 35, 33, 35, 57, 255, 50, 49, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CORVISQUIRE, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, null, 0.8, 16, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 365, 68, 67, 55, 43, 55, 77, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CORVIKNIGHT, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FLYING, PokemonType.STEEL, 14, 999.9, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, 595, 128, 102, 140, 53, 95, 77, 45, 50, 248), + ), + new PokemonSpecies(Species.BLIPBUG, 8, false, false, false, "Larva Pokémon", PokemonType.BUG, null, 0.4, 8, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 180, 25, 20, 20, 25, 45, 45, 255, 50, 36, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DOTTLER, 8, false, false, false, "Radome Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 19.5, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 335, 50, 35, 80, 50, 90, 30, 120, 50, 117, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ORBEETLE, 8, false, false, false, "Seven Spot Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.PSYCHIC, 14, 999.9, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 605, 90, 45, 130, 110, 140, 90, 45, 50, 253), + ), + new PokemonSpecies(Species.NICKIT, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 0.6, 8.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 245, 40, 28, 28, 47, 52, 50, 255, 50, 49, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.THIEVUL, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 1.2, 19.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 455, 70, 58, 58, 87, 92, 90, 127, 50, 159, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.GOSSIFLEUR, 8, false, false, false, "Flowering Pokémon", PokemonType.GRASS, null, 0.4, 2.2, Abilities.COTTON_DOWN, Abilities.REGENERATOR, Abilities.EFFECT_SPORE, 250, 40, 40, 60, 40, 60, 10, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ELDEGOSS, 8, false, false, false, "Cotton Bloom Pokémon", PokemonType.GRASS, null, 0.5, 2.5, Abilities.COTTON_DOWN, Abilities.REGENERATOR, Abilities.EFFECT_SPORE, 460, 60, 50, 90, 80, 120, 60, 75, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WOOLOO, 8, false, false, false, "Sheep Pokémon", PokemonType.NORMAL, null, 0.6, 6, Abilities.FLUFFY, Abilities.RUN_AWAY, Abilities.BULLETPROOF, 270, 42, 40, 55, 40, 45, 48, 255, 50, 122, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUBWOOL, 8, false, false, false, "Sheep Pokémon", PokemonType.NORMAL, null, 1.3, 43, Abilities.FLUFFY, Abilities.STEADFAST, Abilities.BULLETPROOF, 490, 72, 80, 100, 60, 90, 88, 127, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CHEWTLE, 8, false, false, false, "Snapping Pokémon", PokemonType.WATER, null, 0.3, 8.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 284, 50, 64, 50, 38, 38, 44, 255, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DREDNAW, 8, false, false, false, "Bite Pokémon", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ROCK, 24, 999.9, Abilities.STRONG_JAW, Abilities.STRONG_JAW, Abilities.STRONG_JAW, 585, 115, 145, 115, 43, 83, 84, 75, 50, 170), + ), + new PokemonSpecies(Species.YAMPER, 8, false, false, false, "Puppy Pokémon", PokemonType.ELECTRIC, null, 0.3, 13.5, Abilities.BALL_FETCH, Abilities.NONE, Abilities.RATTLED, 270, 59, 45, 50, 40, 50, 26, 255, 50, 54, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.BOLTUND, 8, false, false, false, "Dog Pokémon", PokemonType.ELECTRIC, null, 1, 34, Abilities.STRONG_JAW, Abilities.NONE, Abilities.COMPETITIVE, 490, 69, 90, 60, 90, 60, 121, 45, 50, 172, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.ROLYCOLY, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, null, 0.3, 12, Abilities.STEAM_ENGINE, Abilities.HEATPROOF, Abilities.FLASH_FIRE, 240, 30, 40, 50, 40, 50, 30, 255, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CARKOL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 1.1, 78, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 410, 80, 60, 90, 60, 70, 50, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.COALOSSAL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ROCK, PokemonType.FIRE, 42, 999.9, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, 610, 140, 95, 130, 95, 110, 40, 45, 50, 255), + ), + new PokemonSpecies(Species.APPLIN, 8, false, false, false, "Apple Core Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.2, 0.5, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.BULLETPROOF, 260, 40, 40, 80, 40, 40, 20, 255, 50, 52, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.FLAPPLE, 8, false, false, false, "Apple Wing Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.DRAGON, 24, 999.9, Abilities.HUSTLE, Abilities.HUSTLE, Abilities.HUSTLE, 585, 90, 130, 100, 85, 80, 100, 45, 50, 170), + ), + new PokemonSpecies(Species.APPLETUN, 8, false, false, false, "Apple Nectar Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.DRAGON, 24, 999.9, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 585, 130, 75, 115, 125, 115, 25, 45, 50, 170), + ), + new PokemonSpecies(Species.SILICOBRA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 2.2, 7.6, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 315, 52, 57, 75, 35, 50, 46, 255, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SANDACONDA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GROUND, null, 22, 999.9, Abilities.SAND_SPIT, Abilities.SAND_SPIT, Abilities.SAND_SPIT, 610, 117, 137, 140, 55, 80, 81, 120, 50, 179), + ), + new PokemonSpecies(Species.CRAMORANT, 8, false, false, false, "Gulp Pokémon", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, false, null, true), + new PokemonForm("Gulping Form", "gulping", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), + new PokemonForm("Gorging Form", "gorging", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), + ), + new PokemonSpecies(Species.ARROKUDA, 8, false, false, false, "Rush Pokémon", PokemonType.WATER, null, 0.5, 1, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.PROPELLER_TAIL, 280, 41, 63, 40, 40, 30, 66, 255, 50, 56, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.BARRASKEWDA, 8, false, false, false, "Skewer Pokémon", PokemonType.WATER, null, 1.3, 30, Abilities.SWIFT_SWIM, Abilities.NONE, Abilities.PROPELLER_TAIL, 490, 61, 123, 60, 60, 50, 136, 60, 50, 172, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TOXEL, 8, false, false, false, "Baby Pokémon", PokemonType.ELECTRIC, PokemonType.POISON, 0.4, 11, Abilities.RATTLED, Abilities.STATIC, Abilities.KLUTZ, 242, 40, 38, 35, 54, 35, 40, 75, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TOXTRICITY, 8, false, false, false, "Punk Pokémon", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Amped Form", "amped", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "", true), + new PokemonForm("Low-Key Form", "lowkey", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.MINUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "lowkey", true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ELECTRIC, PokemonType.POISON, 24, 999.9, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, 602, 114, 98, 82, 144, 82, 82, 45, 50, 176), + ), + new PokemonSpecies(Species.SIZZLIPEDE, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 0.7, 1, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 305, 50, 65, 45, 50, 50, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CENTISKORCH, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.BUG, 75, 999.9, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, 625, 140, 145, 75, 90, 100, 75, 75, 50, 184), + ), + new PokemonSpecies(Species.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", PokemonType.FIGHTING, null, 0.6, 4, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", PokemonType.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SINISTEA, 8, false, false, false, "Black Tea Pokémon", PokemonType.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false, + new PokemonForm("Phony Form", "phony", PokemonType.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), + new PokemonForm("Antique Form", "antique", PokemonType.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true, true), + ), + new PokemonSpecies(Species.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", PokemonType.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false, + new PokemonForm("Phony Form", "phony", PokemonType.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), + new PokemonForm("Antique Form", "antique", PokemonType.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true, true), + ), + new PokemonSpecies(Species.HATENNA, 8, false, false, false, "Calm Pokémon", PokemonType.PSYCHIC, null, 0.4, 3.4, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", PokemonType.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), + new PokemonSpecies(Species.HATTERENE, 8, false, false, false, "Silent Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, GrowthRate.SLOW, 0, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.PSYCHIC, PokemonType.FAIRY, 26, 999.9, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 610, 97, 90, 105, 146, 122, 50, 45, 50, 255), + ), + new PokemonSpecies(Species.IMPIDIMP, 8, false, false, false, "Wily Pokémon", PokemonType.DARK, PokemonType.FAIRY, 0.4, 5.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 265, 45, 45, 30, 55, 40, 50, 255, 50, 53, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.MORGREM, 8, false, false, false, "Devious Pokémon", PokemonType.DARK, PokemonType.FAIRY, 0.8, 12.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 370, 65, 60, 45, 75, 55, 70, 120, 50, 130, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(Species.GRIMMSNARL, 8, false, false, false, "Bulk Up Pokémon", PokemonType.DARK, PokemonType.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, GrowthRate.MEDIUM_FAST, 100, false, true, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.DARK, PokemonType.FAIRY, 32, 999.9, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 610, 135, 138, 77, 110, 85, 65, 45, 50, 255), + ), + new PokemonSpecies(Species.OBSTAGOON, 8, false, false, false, "Blocking Pokémon", PokemonType.DARK, PokemonType.NORMAL, 1.6, 46, Abilities.RECKLESS, Abilities.GUTS, Abilities.DEFIANT, 520, 93, 90, 101, 60, 81, 95, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PERRSERKER, 8, false, false, false, "Viking Pokémon", PokemonType.STEEL, null, 0.8, 28, Abilities.BATTLE_ARMOR, Abilities.TOUGH_CLAWS, Abilities.STEELY_SPIRIT, 440, 70, 110, 100, 50, 60, 50, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CURSOLA, 8, false, false, false, "Coral Pokémon", PokemonType.GHOST, null, 1, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.PERISH_BODY, 510, 60, 95, 50, 145, 130, 30, 30, 50, 179, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.SIRFETCHD, 8, false, false, false, "Wild Duck Pokémon", PokemonType.FIGHTING, null, 0.8, 117, Abilities.STEADFAST, Abilities.NONE, Abilities.SCRAPPY, 507, 62, 135, 95, 68, 82, 65, 45, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MR_RIME, 8, false, false, false, "Comedian Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.5, 58.2, Abilities.TANGLED_FEET, Abilities.SCREEN_CLEANER, Abilities.ICE_BODY, 520, 80, 85, 75, 110, 100, 70, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RUNERIGUS, 8, false, false, false, "Grudge Pokémon", PokemonType.GROUND, PokemonType.GHOST, 1.6, 66.6, Abilities.WANDERING_SPIRIT, Abilities.NONE, Abilities.NONE, 483, 58, 95, 145, 50, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.MILCERY, 8, false, false, false, "Cream Pokémon", PokemonType.FAIRY, null, 0.2, 0.3, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 270, 45, 40, 40, 50, 61, 34, 200, 50, 54, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.ALCREMIE, 8, false, false, false, "Cream Pokémon", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, GrowthRate.MEDIUM_FAST, 0, false, true, + new PokemonForm("Vanilla Cream", "vanilla-cream", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, "", true), + new PokemonForm("Ruby Cream", "ruby-cream", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Matcha Cream", "matcha-cream", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Mint Cream", "mint-cream", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Lemon Cream", "lemon-cream", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Salted Cream", "salted-cream", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Ruby Swirl", "ruby-swirl", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Caramel Swirl", "caramel-swirl", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Rainbow Swirl", "rainbow-swirl", PokemonType.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FAIRY, null, 30, 999.9, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 595, 135, 60, 75, 130, 131, 64, 100, 50, 173), + ), + new PokemonSpecies(Species.FALINKS, 8, false, false, false, "Formation Pokémon", PokemonType.FIGHTING, null, 3, 62, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.DEFIANT, 470, 65, 100, 100, 70, 60, 75, 45, 50, 165, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.PINCURCHIN, 8, false, false, false, "Sea Urchin Pokémon", PokemonType.ELECTRIC, null, 0.3, 1, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.ELECTRIC_SURGE, 435, 48, 101, 95, 91, 85, 15, 75, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SNOM, 8, false, false, false, "Worm Pokémon", PokemonType.ICE, PokemonType.BUG, 0.3, 3.8, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.ICE_SCALES, 185, 30, 25, 35, 45, 30, 20, 190, 50, 37, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FROSMOTH, 8, false, false, false, "Frost Moth Pokémon", PokemonType.ICE, PokemonType.BUG, 1.3, 42, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.ICE_SCALES, 475, 70, 65, 60, 125, 90, 65, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.STONJOURNER, 8, false, false, false, "Big Rock Pokémon", PokemonType.ROCK, null, 2.5, 520, Abilities.POWER_SPOT, Abilities.NONE, Abilities.NONE, 470, 100, 125, 135, 20, 20, 70, 60, 50, 165, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.EISCUE, 8, false, false, false, "Penguin Pokémon", PokemonType.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, GrowthRate.SLOW, 50, false, false, + new PokemonForm("Ice Face", "", PokemonType.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, false, null, true), + new PokemonForm("No Ice", "no-ice", PokemonType.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 70, 65, 50, 130, 60, 50, 165), + ), + new PokemonSpecies(Species.INDEEDEE, 8, false, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, GrowthRate.FAST, 50, false, false, + new PokemonForm("Male", "male", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, false, "", true), + new PokemonForm("Female", "female", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, Abilities.OWN_TEMPO, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 70, 55, 65, 95, 105, 85, 30, 140, 166, false, null, true), + ), + new PokemonSpecies(Species.MORPEKO, 8, false, false, false, "Two-Sided Pokémon", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Full Belly Mode", "full-belly", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, false, "", true), + new PokemonForm("Hangry Mode", "hangry", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153), + ), + new PokemonSpecies(Species.CUFANT, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 1.2, 100, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 330, 72, 80, 49, 40, 49, 40, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.COPPERAJAH, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.GROUND, 23, 999.9, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 600, 167, 155, 89, 80, 89, 20, 90, 50, 175), + ), + new PokemonSpecies(Species.DRACOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 1.8, 190, Abilities.VOLT_ABSORB, Abilities.HUSTLE, Abilities.SAND_RUSH, 505, 90, 100, 90, 80, 70, 75, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ARCTOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.ICE, 2.3, 150, Abilities.VOLT_ABSORB, Abilities.STATIC, Abilities.SLUSH_RUSH, 505, 90, 100, 90, 90, 80, 55, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DRACOVISH, 8, false, false, false, "Fossil Pokémon", PokemonType.WATER, PokemonType.DRAGON, 2.3, 215, Abilities.WATER_ABSORB, Abilities.STRONG_JAW, Abilities.SAND_RUSH, 505, 90, 90, 100, 70, 80, 75, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ARCTOVISH, 8, false, false, false, "Fossil Pokémon", PokemonType.WATER, PokemonType.ICE, 2, 175, Abilities.WATER_ABSORB, Abilities.ICE_BODY, Abilities.SLUSH_RUSH, 505, 90, 90, 100, 80, 90, 55, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.DURALUDON, 8, false, false, false, "Alloy Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.DRAGON, 43, 999.9, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 635, 100, 110, 120, 175, 60, 70, 45, 50, 187), + ), + new PokemonSpecies(Species.DREEPY, 8, false, false, false, "Lingering Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 0.5, 2, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 270, 28, 60, 30, 40, 30, 82, 45, 50, 54, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAKLOAK, 8, false, false, false, "Caretaker Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 1.4, 11, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 410, 68, 80, 50, 60, 50, 102, 45, 50, 144, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.DRAGAPULT, 8, false, false, false, "Stealth Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 3, 50, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 600, 88, 120, 75, 100, 75, 142, 45, 50, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ZACIAN, 8, false, true, false, "Warrior Pokémon", PokemonType.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, + new PokemonForm("Hero of Many Battles", "hero-of-many-battles", PokemonType.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), + new PokemonForm("Crowned", "crowned", PokemonType.FAIRY, PokemonType.STEEL, 2.8, 355, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 700, 92, 150, 115, 80, 115, 148, 10, 0, 360), + ), + new PokemonSpecies(Species.ZAMAZENTA, 8, false, true, false, "Warrior Pokémon", PokemonType.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, + new PokemonForm("Hero of Many Battles", "hero-of-many-battles", PokemonType.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), + new PokemonForm("Crowned", "crowned", PokemonType.FIGHTING, PokemonType.STEEL, 2.9, 785, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 360), + ), + new PokemonSpecies(Species.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", PokemonType.POISON, PokemonType.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.POISON, PokemonType.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, false, null, true), + new PokemonForm("E-Max", "eternamax", PokemonType.POISON, PokemonType.DRAGON, 100, 999.9, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345), + ), + new PokemonSpecies(Species.KUBFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, null, 0.6, 12, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.NONE, 385, 60, 90, 60, 53, 50, 72, 3, 50, 77, GrowthRate.SLOW, 87.5, false), + new PokemonSpecies(Species.URSHIFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, + new PokemonForm("Single Strike Style", "single-strike", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, "", true), + new PokemonForm("Rapid Strike Style", "rapid-strike", PokemonType.FIGHTING, PokemonType.WATER, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, null, true), + new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, PokemonType.FIGHTING, PokemonType.DARK, 29, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), + new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, PokemonType.FIGHTING, PokemonType.WATER, 26, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), + ), + new PokemonSpecies(Species.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), + new PokemonForm("Dada", "dada", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), + ), + new PokemonSpecies(Species.REGIELEKI, 8, true, false, false, "Electron Pokémon", PokemonType.ELECTRIC, null, 1.2, 145, Abilities.TRANSISTOR, Abilities.NONE, Abilities.NONE, 580, 80, 100, 50, 100, 50, 200, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.REGIDRAGO, 8, true, false, false, "Dragon Orb Pokémon", PokemonType.DRAGON, null, 2.1, 200, Abilities.DRAGONS_MAW, Abilities.NONE, Abilities.NONE, 580, 200, 100, 50, 100, 50, 80, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GLASTRIER, 8, true, false, false, "Wild Horse Pokémon", PokemonType.ICE, null, 2.2, 800, Abilities.CHILLING_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 145, 130, 65, 110, 30, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SPECTRIER, 8, true, false, false, "Swift Horse Pokémon", PokemonType.GHOST, null, 2, 44.5, Abilities.GRIM_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 65, 60, 145, 80, 130, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CALYREX, 8, false, true, false, "King Pokémon", PokemonType.PSYCHIC, PokemonType.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, false, null, true), + new PokemonForm("Ice", "ice", PokemonType.PSYCHIC, PokemonType.ICE, 2.4, 809.1, Abilities.AS_ONE_GLASTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 340), + new PokemonForm("Shadow", "shadow", PokemonType.PSYCHIC, PokemonType.GHOST, 2.4, 53.6, Abilities.AS_ONE_SPECTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 340), + ), + new PokemonSpecies(Species.WYRDEER, 8, false, false, false, "Big Horn Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.8, 95.1, Abilities.INTIMIDATE, Abilities.FRISK, Abilities.SAP_SIPPER, 525, 103, 105, 72, 105, 75, 65, 135, 50, 263, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.KLEAVOR, 8, false, false, false, "Axe Pokémon", PokemonType.BUG, PokemonType.ROCK, 1.8, 89, Abilities.SWARM, Abilities.SHEER_FORCE, Abilities.SHARPNESS, 500, 70, 135, 95, 45, 70, 85, 115, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.URSALUNA, 8, false, false, false, "Peat Pokémon", PokemonType.GROUND, PokemonType.NORMAL, 2.4, 290, Abilities.GUTS, Abilities.BULLETPROOF, Abilities.UNNERVE, 550, 130, 140, 105, 45, 80, 50, 75, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BASCULEGION, 8, false, false, false, "Big Fish Pokémon", PokemonType.WATER, PokemonType.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Male", "male", PokemonType.WATER, PokemonType.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, false, "", true), + new PokemonForm("Female", "female", PokemonType.WATER, PokemonType.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 92, 65, 100, 75, 78, 135, 50, 265, false, null, true), + ), + new PokemonSpecies(Species.SNEASLER, 8, false, false, false, "Free Climb Pokémon", PokemonType.FIGHTING, PokemonType.POISON, 1.3, 43, Abilities.PRESSURE, Abilities.UNBURDEN, Abilities.POISON_TOUCH, 510, 80, 130, 60, 40, 80, 120, 135, 50, 102, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.OVERQWIL, 8, false, false, false, "Pin Cluster Pokémon", PokemonType.DARK, PokemonType.POISON, 2.5, 60.5, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 510, 85, 115, 95, 65, 65, 85, 135, 50, 179, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ENAMORUS, 8, true, false, false, "Love-Hate Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, GrowthRate.SLOW, 0, false, true, + new PokemonForm("Incarnate Forme", "incarnate", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, false, null, true), + new PokemonForm("Therian Forme", "therian", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, Abilities.OVERCOAT, Abilities.NONE, Abilities.OVERCOAT, 580, 74, 115, 110, 135, 100, 46, 3, 50, 116), + ), + new PokemonSpecies(Species.SPRIGATITO, 9, false, false, false, "Grass Cat Pokémon", PokemonType.GRASS, null, 0.4, 4.1, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 310, 40, 61, 54, 45, 45, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FLORAGATO, 9, false, false, false, "Grass Cat Pokémon", PokemonType.GRASS, null, 0.9, 12.2, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 410, 61, 80, 63, 60, 63, 83, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.MEOWSCARADA, 9, false, false, false, "Magician Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.5, 31.2, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 530, 76, 110, 70, 81, 70, 123, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FUECOCO, 9, false, false, false, "Fire Croc Pokémon", PokemonType.FIRE, null, 0.4, 9.8, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 310, 67, 45, 59, 63, 40, 36, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CROCALOR, 9, false, false, false, "Fire Croc Pokémon", PokemonType.FIRE, null, 1, 30.7, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 411, 81, 55, 78, 90, 58, 49, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SKELEDIRGE, 9, false, false, false, "Singer Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 326.5, Abilities.BLAZE, Abilities.NONE, Abilities.UNAWARE, 530, 104, 75, 100, 110, 75, 66, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUAXLY, 9, false, false, false, "Duckling Pokémon", PokemonType.WATER, null, 0.5, 6.1, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 310, 55, 65, 45, 50, 45, 50, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUAXWELL, 9, false, false, false, "Practicing Pokémon", PokemonType.WATER, null, 1.2, 21.5, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 410, 70, 85, 65, 65, 60, 65, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.QUAQUAVAL, 9, false, false, false, "Dancer Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.8, 61.9, Abilities.TORRENT, Abilities.NONE, Abilities.MOXIE, 530, 85, 120, 80, 85, 75, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.LECHONK, 9, false, false, false, "Hog Pokémon", PokemonType.NORMAL, null, 0.5, 10.2, Abilities.AROMA_VEIL, Abilities.GLUTTONY, Abilities.THICK_FAT, 254, 54, 45, 40, 35, 45, 35, 255, 50, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.OINKOLOGNE, 9, false, false, false, "Hog Pokémon", PokemonType.NORMAL, null, 1, 120, Abilities.LINGERING_AROMA, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Male", "male", PokemonType.NORMAL, null, 1, 120, Abilities.LINGERING_AROMA, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, false, "", true), + new PokemonForm("Female", "female", PokemonType.NORMAL, null, 1, 120, Abilities.AROMA_VEIL, Abilities.GLUTTONY, Abilities.THICK_FAT, 489, 115, 90, 70, 59, 90, 65, 100, 50, 171, false, null, true), + ), + new PokemonSpecies(Species.TAROUNTULA, 9, false, false, false, "String Ball Pokémon", PokemonType.BUG, null, 0.3, 4, Abilities.INSOMNIA, Abilities.NONE, Abilities.STAKEOUT, 210, 35, 41, 45, 29, 40, 20, 255, 50, 42, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.SPIDOPS, 9, false, false, false, "Trap Pokémon", PokemonType.BUG, null, 1, 16.5, Abilities.INSOMNIA, Abilities.NONE, Abilities.STAKEOUT, 404, 60, 79, 92, 52, 86, 35, 120, 50, 141, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.NYMBLE, 9, false, false, false, "Grasshopper Pokémon", PokemonType.BUG, null, 0.2, 1, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 210, 33, 46, 40, 21, 25, 45, 190, 20, 42, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.LOKIX, 9, false, false, false, "Grasshopper Pokémon", PokemonType.BUG, PokemonType.DARK, 1, 17.5, Abilities.SWARM, Abilities.NONE, Abilities.TINTED_LENS, 450, 71, 102, 78, 52, 55, 92, 30, 0, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PAWMI, 9, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.3, 2.5, Abilities.STATIC, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 240, 45, 50, 20, 40, 25, 60, 190, 50, 48, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PAWMO, 9, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, PokemonType.FIGHTING, 0.4, 6.5, Abilities.VOLT_ABSORB, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 350, 60, 75, 40, 50, 40, 85, 80, 50, 123, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.PAWMOT, 9, false, false, false, "Hands-On Pokémon", PokemonType.ELECTRIC, PokemonType.FIGHTING, 0.9, 41, Abilities.VOLT_ABSORB, Abilities.NATURAL_CURE, Abilities.IRON_FIST, 490, 70, 115, 70, 70, 60, 105, 45, 50, 245, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TANDEMAUS, 9, false, false, false, "Couple Pokémon", PokemonType.NORMAL, null, 0.3, 1.8, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.OWN_TEMPO, 305, 50, 50, 45, 40, 45, 75, 150, 50, 61, GrowthRate.FAST, null, false), + new PokemonSpecies(Species.MAUSHOLD, 9, false, false, false, "Family Pokémon", PokemonType.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165, GrowthRate.FAST, null, false, false, + new PokemonForm("Family of Four", "four", PokemonType.NORMAL, null, 0.3, 2.8, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), + new PokemonForm("Family of Three", "three", PokemonType.NORMAL, null, 0.3, 2.3, Abilities.FRIEND_GUARD, Abilities.CHEEK_POUCH, Abilities.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), + ), + new PokemonSpecies(Species.FIDOUGH, 9, false, false, false, "Puppy Pokémon", PokemonType.FAIRY, null, 0.3, 10.9, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.KLUTZ, 312, 37, 55, 70, 30, 55, 65, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DACHSBUN, 9, false, false, false, "Dog Pokémon", PokemonType.FAIRY, null, 0.5, 14.9, Abilities.WELL_BAKED_BODY, Abilities.NONE, Abilities.AROMA_VEIL, 477, 57, 80, 115, 50, 80, 95, 90, 50, 167, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SMOLIV, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 0.3, 6.5, Abilities.EARLY_BIRD, Abilities.NONE, Abilities.HARVEST, 260, 41, 35, 45, 58, 51, 30, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.DOLLIV, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 0.6, 11.9, Abilities.EARLY_BIRD, Abilities.NONE, Abilities.HARVEST, 354, 52, 53, 60, 78, 78, 33, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ARBOLIVA, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 1.4, 48.2, Abilities.SEED_SOWER, Abilities.NONE, Abilities.HARVEST, 510, 78, 69, 90, 125, 109, 39, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SQUAWKABILLY, 9, false, false, false, "Parrot Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, GrowthRate.ERRATIC, 50, false, false, + new PokemonForm("Green Plumage", "green-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + new PokemonForm("Blue Plumage", "blue-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + new PokemonForm("Yellow Plumage", "yellow-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + new PokemonForm("White Plumage", "white-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + ), + new PokemonSpecies(Species.NACLI, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 0.4, 16, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 280, 55, 55, 75, 35, 35, 25, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.NACLSTACK, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 0.6, 105, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 355, 60, 60, 100, 35, 65, 35, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GARGANACL, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 2.3, 240, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 500, 100, 100, 130, 45, 90, 35, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CHARCADET, 9, false, false, false, "Fire Child Pokémon", PokemonType.FIRE, null, 0.6, 10.5, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 255, 40, 50, 40, 50, 40, 35, 90, 50, 51, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ARMAROUGE, 9, false, false, false, "Fire Warrior Pokémon", PokemonType.FIRE, PokemonType.PSYCHIC, 1.5, 85, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.WEAK_ARMOR, 525, 85, 60, 100, 125, 80, 75, 25, 20, 263, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.CERULEDGE, 9, false, false, false, "Fire Blades Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 62, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.WEAK_ARMOR, 525, 75, 125, 80, 60, 100, 85, 25, 20, 263, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TADBULB, 9, false, false, false, "EleTadpole Pokémon", PokemonType.ELECTRIC, null, 0.3, 0.4, Abilities.OWN_TEMPO, Abilities.STATIC, Abilities.DAMP, 272, 61, 31, 41, 59, 35, 45, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BELLIBOLT, 9, false, false, false, "EleFrog Pokémon", PokemonType.ELECTRIC, null, 1.2, 113, Abilities.ELECTROMORPHOSIS, Abilities.STATIC, Abilities.DAMP, 495, 109, 64, 91, 103, 83, 45, 50, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WATTREL, 9, false, false, false, "Storm Petrel Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 0.4, 3.6, Abilities.WIND_POWER, Abilities.VOLT_ABSORB, Abilities.COMPETITIVE, 280, 40, 40, 35, 55, 40, 70, 180, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.KILOWATTREL, 9, false, false, false, "Frigatebird Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.4, 38.6, Abilities.WIND_POWER, Abilities.VOLT_ABSORB, Abilities.COMPETITIVE, 490, 70, 70, 60, 105, 60, 125, 90, 50, 172, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MASCHIFF, 9, false, false, false, "Rascal Pokémon", PokemonType.DARK, null, 0.5, 16, Abilities.INTIMIDATE, Abilities.RUN_AWAY, Abilities.STAKEOUT, 340, 60, 78, 60, 40, 51, 51, 150, 50, 68, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.MABOSSTIFF, 9, false, false, false, "Boss Pokémon", PokemonType.DARK, null, 1.1, 61, Abilities.INTIMIDATE, Abilities.GUARD_DOG, Abilities.STAKEOUT, 505, 80, 120, 90, 60, 70, 85, 75, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.SHROODLE, 9, false, false, false, "Toxic Mouse Pokémon", PokemonType.POISON, PokemonType.NORMAL, 0.2, 0.7, Abilities.UNBURDEN, Abilities.PICKPOCKET, Abilities.PRANKSTER, 290, 40, 65, 35, 40, 35, 75, 190, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GRAFAIAI, 9, false, false, false, "Toxic Monkey Pokémon", PokemonType.POISON, PokemonType.NORMAL, 0.7, 27.2, Abilities.UNBURDEN, Abilities.POISON_TOUCH, Abilities.PRANKSTER, 485, 63, 95, 65, 80, 72, 110, 90, 50, 170, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.BRAMBLIN, 9, false, false, false, "Tumbleweed Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.6, 0.6, Abilities.WIND_RIDER, Abilities.NONE, Abilities.INFILTRATOR, 275, 40, 65, 30, 45, 35, 60, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BRAMBLEGHAST, 9, false, false, false, "Tumbleweed Pokémon", PokemonType.GRASS, PokemonType.GHOST, 1.2, 6, Abilities.WIND_RIDER, Abilities.NONE, Abilities.INFILTRATOR, 480, 55, 115, 70, 80, 70, 90, 45, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TOEDSCOOL, 9, false, false, false, "Woodear Pokémon", PokemonType.GROUND, PokemonType.GRASS, 0.9, 33, Abilities.MYCELIUM_MIGHT, Abilities.NONE, Abilities.NONE, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TOEDSCRUEL, 9, false, false, false, "Woodear Pokémon", PokemonType.GROUND, PokemonType.GRASS, 1.9, 58, Abilities.MYCELIUM_MIGHT, Abilities.NONE, Abilities.NONE, 515, 80, 70, 65, 80, 120, 100, 90, 50, 180, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.KLAWF, 9, false, false, false, "Ambush Pokémon", PokemonType.ROCK, null, 1.3, 79, Abilities.ANGER_SHELL, Abilities.SHELL_ARMOR, Abilities.REGENERATOR, 450, 70, 100, 115, 35, 55, 75, 120, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CAPSAKID, 9, false, false, false, "Spicy Pepper Pokémon", PokemonType.GRASS, null, 0.3, 3, Abilities.CHLOROPHYLL, Abilities.INSOMNIA, Abilities.KLUTZ, 304, 50, 62, 40, 62, 40, 50, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.SCOVILLAIN, 9, false, false, false, "Spicy Pepper Pokémon", PokemonType.GRASS, PokemonType.FIRE, 0.9, 15, Abilities.CHLOROPHYLL, Abilities.INSOMNIA, Abilities.MOODY, 486, 65, 108, 65, 108, 65, 75, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.RELLOR, 9, false, false, false, "Rolling Pokémon", PokemonType.BUG, null, 0.2, 1, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.SHED_SKIN, 270, 41, 50, 60, 31, 58, 30, 190, 50, 54, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.RABSCA, 9, false, false, false, "Rolling Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.3, 3.5, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.TELEPATHY, 470, 75, 50, 85, 115, 100, 45, 45, 50, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.FLITTLE, 9, false, false, false, "Frill Pokémon", PokemonType.PSYCHIC, null, 0.2, 1.5, Abilities.ANTICIPATION, Abilities.FRISK, Abilities.SPEED_BOOST, 255, 30, 35, 30, 55, 30, 75, 120, 50, 51, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ESPATHRA, 9, false, false, false, "Ostrich Pokémon", PokemonType.PSYCHIC, null, 1.9, 90, Abilities.OPPORTUNIST, Abilities.FRISK, Abilities.SPEED_BOOST, 481, 95, 60, 60, 101, 60, 105, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.TINKATINK, 9, false, false, false, "Metalsmith Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.4, 8.9, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 297, 50, 45, 45, 35, 64, 58, 190, 50, 59, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.TINKATUFF, 9, false, false, false, "Hammer Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.7, 59.1, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 380, 65, 55, 55, 45, 82, 78, 90, 50, 133, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.TINKATON, 9, false, false, false, "Hammer Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.7, 112.8, Abilities.MOLD_BREAKER, Abilities.OWN_TEMPO, Abilities.PICKPOCKET, 506, 85, 75, 77, 70, 105, 94, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(Species.WIGLETT, 9, false, false, false, "Garden Eel Pokémon", PokemonType.WATER, null, 1.2, 1.8, Abilities.GOOEY, Abilities.RATTLED, Abilities.SAND_VEIL, 245, 10, 55, 25, 35, 25, 95, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WUGTRIO, 9, false, false, false, "Garden Eel Pokémon", PokemonType.WATER, null, 1.2, 5.4, Abilities.GOOEY, Abilities.RATTLED, Abilities.SAND_VEIL, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BOMBIRDIER, 9, false, false, false, "Item Drop Pokémon", PokemonType.FLYING, PokemonType.DARK, 1.5, 42.9, Abilities.BIG_PECKS, Abilities.KEEN_EYE, Abilities.ROCKY_PAYLOAD, 485, 70, 103, 85, 60, 85, 82, 25, 50, 243, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.FINIZEN, 9, false, false, false, "Dolphin Pokémon", PokemonType.WATER, null, 1.3, 60.2, Abilities.WATER_VEIL, Abilities.NONE, Abilities.NONE, 315, 70, 45, 40, 45, 40, 75, 200, 50, 63, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.PALAFIN, 9, false, false, false, "Dolphin Pokémon", PokemonType.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.NONE, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Zero Form", "zero", PokemonType.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, false, null, true), + new PokemonForm("Hero Form", "hero", PokemonType.WATER, null, 1.8, 97.4, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 650, 100, 160, 97, 106, 87, 100, 45, 50, 160), + ), + new PokemonSpecies(Species.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1, 35, Abilities.OVERCOAT, Abilities.NONE, Abilities.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, false, null, true), + new PokemonForm("Segin Starmobile", "segin-starmobile", PokemonType.STEEL, PokemonType.DARK, 1.8, 240, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Schedar Starmobile", "schedar-starmobile", PokemonType.STEEL, PokemonType.FIRE, 1.8, 240, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Navi Starmobile", "navi-starmobile", PokemonType.STEEL, PokemonType.POISON, 1.8, 240, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.TOXIC_DEBRIS, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", PokemonType.STEEL, PokemonType.FAIRY, 1.8, 240, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Caph Starmobile", "caph-starmobile", PokemonType.STEEL, PokemonType.FIGHTING, 1.8, 240, Abilities.STAMINA, Abilities.NONE, Abilities.STAMINA, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + ), + new PokemonSpecies(Species.CYCLIZAR, 9, false, false, false, "Mount Pokémon", PokemonType.DRAGON, PokemonType.NORMAL, 1.6, 63, Abilities.SHED_SKIN, Abilities.NONE, Abilities.REGENERATOR, 501, 70, 95, 65, 85, 65, 121, 190, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ORTHWORM, 9, false, false, false, "Earthworm Pokémon", PokemonType.STEEL, null, 2.5, 310, Abilities.EARTH_EATER, Abilities.NONE, Abilities.SAND_VEIL, 480, 70, 85, 145, 60, 55, 65, 25, 50, 240, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GLIMMET, 9, false, false, false, "Ore Pokémon", PokemonType.ROCK, PokemonType.POISON, 0.7, 8, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.CORROSION, 350, 48, 35, 42, 105, 60, 60, 70, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GLIMMORA, 9, false, false, false, "Ore Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.5, 45, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.CORROSION, 525, 83, 55, 90, 130, 81, 86, 25, 50, 184, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GREAVARD, 9, false, false, false, "Ghost Dog Pokémon", PokemonType.GHOST, null, 0.6, 35, Abilities.PICKUP, Abilities.NONE, Abilities.FLUFFY, 290, 50, 61, 60, 30, 55, 34, 120, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.HOUNDSTONE, 9, false, false, false, "Ghost Dog Pokémon", PokemonType.GHOST, null, 2, 15, Abilities.SAND_RUSH, Abilities.NONE, Abilities.FLUFFY, 488, 72, 101, 100, 50, 97, 68, 60, 50, 171, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.FLAMIGO, 9, false, false, false, "Synchronize Pokémon", PokemonType.FLYING, PokemonType.FIGHTING, 1.6, 37, Abilities.SCRAPPY, Abilities.TANGLED_FEET, Abilities.COSTAR, 500, 82, 115, 74, 75, 64, 90, 100, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CETODDLE, 9, false, false, false, "Terra Whale Pokémon", PokemonType.ICE, null, 1.2, 45, Abilities.THICK_FAT, Abilities.SNOW_CLOAK, Abilities.SHEER_FORCE, 334, 108, 68, 45, 30, 40, 43, 150, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.CETITAN, 9, false, false, false, "Terra Whale Pokémon", PokemonType.ICE, null, 4.5, 700, Abilities.THICK_FAT, Abilities.SLUSH_RUSH, Abilities.SHEER_FORCE, 521, 170, 113, 65, 45, 55, 73, 50, 50, 182, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.VELUZA, 9, false, false, false, "Jettison Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 2.5, 90, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHARPNESS, 478, 90, 102, 73, 78, 65, 70, 100, 50, 167, GrowthRate.FAST, 50, false), + new PokemonSpecies(Species.DONDOZO, 9, false, false, false, "Big Catfish Pokémon", PokemonType.WATER, null, 12, 220, Abilities.UNAWARE, Abilities.OBLIVIOUS, Abilities.WATER_VEIL, 530, 150, 100, 115, 65, 65, 35, 25, 50, 265, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.TATSUGIRI, 9, false, false, false, "Mimicry Pokémon", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, GrowthRate.MEDIUM_SLOW, 50, false, false, + new PokemonForm("Curly Form", "curly", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), + new PokemonForm("Droopy Form", "droopy", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), + new PokemonForm("Stretchy Form", "stretchy", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), + ), + new PokemonSpecies(Species.ANNIHILAPE, 9, false, false, false, "Rage Monkey Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 1.2, 56, Abilities.VITAL_SPIRIT, Abilities.INNER_FOCUS, Abilities.DEFIANT, 535, 110, 115, 80, 50, 90, 90, 45, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.CLODSIRE, 9, false, false, false, "Spiny Fish Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.8, 223, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 430, 130, 75, 60, 45, 100, 20, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FARIGIRAF, 9, false, false, false, "Long Neck Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 3.2, 160, Abilities.CUD_CHEW, Abilities.ARMOR_TAIL, Abilities.SAP_SIPPER, 520, 120, 90, 70, 110, 70, 60, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.DUDUNSPARCE, 9, false, false, false, "Land Snake Pokémon", PokemonType.NORMAL, null, 3.6, 39.2, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Two-Segment Form", "two-segment", PokemonType.NORMAL, null, 3.6, 39.2, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, false, ""), + new PokemonForm("Three-Segment Form", "three-segment", PokemonType.NORMAL, null, 4.5, 47.4, Abilities.SERENE_GRACE, Abilities.RUN_AWAY, Abilities.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182), + ), + new PokemonSpecies(Species.KINGAMBIT, 9, false, false, false, "Big Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 2, 120, Abilities.DEFIANT, Abilities.SUPREME_OVERLORD, Abilities.PRESSURE, 550, 100, 135, 120, 60, 85, 50, 25, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GREAT_TUSK, 9, false, false, false, "Paradox Pokémon", PokemonType.GROUND, PokemonType.FIGHTING, 2.2, 320, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 115, 131, 131, 53, 53, 87, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SCREAM_TAIL, 9, false, false, false, "Paradox Pokémon", PokemonType.FAIRY, PokemonType.PSYCHIC, 1.2, 8, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 115, 65, 99, 65, 115, 111, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.BRUTE_BONNET, 9, false, false, false, "Paradox Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.2, 21, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 111, 127, 99, 79, 99, 55, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.FLUTTER_MANE, 9, false, false, false, "Paradox Pokémon", PokemonType.GHOST, PokemonType.FAIRY, 1.4, 4, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 55, 55, 55, 135, 135, 135, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SLITHER_WING, 9, false, false, false, "Paradox Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 3.2, 92, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 85, 135, 79, 85, 105, 81, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.SANDY_SHOCKS, 9, false, false, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.GROUND, 2.3, 60, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 570, 85, 81, 97, 121, 85, 101, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_TREADS, 9, false, false, false, "Paradox Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.9, 240, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 90, 112, 120, 72, 70, 106, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_BUNDLE, 9, false, false, false, "Paradox Pokémon", PokemonType.ICE, PokemonType.WATER, 0.6, 11, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 56, 80, 114, 124, 60, 136, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_HANDS, 9, false, false, false, "Paradox Pokémon", PokemonType.FIGHTING, PokemonType.ELECTRIC, 1.8, 380.7, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 154, 140, 108, 50, 68, 50, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_JUGULIS, 9, false, false, false, "Paradox Pokémon", PokemonType.DARK, PokemonType.FLYING, 1.3, 111, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 94, 80, 86, 122, 80, 108, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_MOTH, 9, false, false, false, "Paradox Pokémon", PokemonType.FIRE, PokemonType.POISON, 1.2, 36, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 80, 70, 60, 140, 110, 110, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_THORNS, 9, false, false, false, "Paradox Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1.6, 303, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 570, 100, 134, 110, 70, 84, 72, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.FRIGIBAX, 9, false, false, false, "Ice Fin Pokémon", PokemonType.DRAGON, PokemonType.ICE, 0.5, 17, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 320, 65, 75, 45, 35, 45, 55, 45, 50, 64, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ARCTIBAX, 9, false, false, false, "Ice Fin Pokémon", PokemonType.DRAGON, PokemonType.ICE, 0.8, 30, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 423, 90, 95, 66, 45, 65, 62, 25, 50, 148, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.BAXCALIBUR, 9, false, false, false, "Ice Dragon Pokémon", PokemonType.DRAGON, PokemonType.ICE, 2.1, 210, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 600, 115, 145, 92, 75, 86, 87, 10, 50, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.GIMMIGHOUL, 9, false, false, false, "Coin Chest Pokémon", PokemonType.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, GrowthRate.SLOW, null, false, false, + new PokemonForm("Chest Form", "chest", PokemonType.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, false, "", true), + new PokemonForm("Roaming Form", "roaming", PokemonType.GHOST, null, 0.1, 1, Abilities.RUN_AWAY, Abilities.NONE, Abilities.NONE, 300, 45, 30, 25, 75, 45, 80, 45, 50, 60, false, null, true), + ), + new PokemonSpecies(Species.GHOLDENGO, 9, false, false, false, "Coin Entity Pokémon", PokemonType.STEEL, PokemonType.GHOST, 1.2, 30, Abilities.GOOD_AS_GOLD, Abilities.NONE, Abilities.NONE, 550, 87, 60, 95, 133, 91, 84, 45, 50, 275, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.WO_CHIEN, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.GRASS, 1.5, 74.2, Abilities.TABLETS_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 85, 85, 100, 95, 135, 70, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CHIEN_PAO, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.ICE, 1.9, 152.2, Abilities.SWORD_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 80, 120, 80, 90, 65, 135, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TING_LU, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.GROUND, 2.7, 699.7, Abilities.VESSEL_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 155, 110, 125, 55, 80, 45, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.CHI_YU, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.FIRE, 0.4, 4.9, Abilities.BEADS_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 55, 80, 80, 135, 120, 100, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ROARING_MOON, 9, false, false, false, "Paradox Pokémon", PokemonType.DRAGON, PokemonType.DARK, 2, 380, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 105, 139, 71, 55, 101, 119, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_VALIANT, 9, false, false, false, "Paradox Pokémon", PokemonType.FAIRY, PokemonType.FIGHTING, 1.4, 35, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 74, 130, 90, 120, 60, 116, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.KORAIDON, 9, false, true, false, "Paradox Pokémon", PokemonType.FIGHTING, PokemonType.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, + new PokemonForm("Apex Build", "apex-build", PokemonType.FIGHTING, PokemonType.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), + ), + new PokemonSpecies(Species.MIRAIDON, 9, false, true, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, + new PokemonForm("Ultimate Mode", "ultimate-mode", PokemonType.ELECTRIC, PokemonType.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), + ), + new PokemonSpecies(Species.WALKING_WAKE, 9, false, false, false, "Paradox Pokémon", PokemonType.WATER, PokemonType.DRAGON, 3.5, 280, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 99, 83, 91, 125, 83, 109, 10, 0, 295, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Gouging Fire and Raging Bolt + new PokemonSpecies(Species.IRON_LEAVES, 9, false, false, false, "Paradox Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 1.5, 125, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 130, 88, 70, 108, 104, 10, 0, 295, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Iron Boulder and Iron Crown + new PokemonSpecies(Species.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 9.7, Abilities.SUPERSWEET_SYRUP, Abilities.GLUTTONY, Abilities.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.POLTCHAGEIST, 9, false, false, false, "Matcha Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.SLOW, null, false, false, + new PokemonForm("Counterfeit Form", "counterfeit", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), + new PokemonForm("Artisan Form", "artisan", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), + ), + new PokemonSpecies(Species.SINISTCHA, 9, false, false, false, "Matcha Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, GrowthRate.SLOW, null, false, false, + new PokemonForm("Unremarkable Form", "unremarkable", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), + new PokemonForm("Masterpiece Form", "masterpiece", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), + ), + new PokemonSpecies(Species.OKIDOGI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 1.8, 92.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.MUNKIDORI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1, 12.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.FEZANDIPITI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.FAIRY, 1.4, 30.1, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.OGERPON, 9, true, false, false, "Mask Pokémon", PokemonType.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false, + new PokemonForm("Teal Mask", "teal-mask", PokemonType.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, false, null, true), + new PokemonForm("Wellspring Mask", "wellspring-mask", PokemonType.GRASS, PokemonType.WATER, 1.2, 39.8, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Hearthflame Mask", "hearthflame-mask", PokemonType.GRASS, PokemonType.FIRE, 1.2, 39.8, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Cornerstone Mask", "cornerstone-mask", PokemonType.GRASS, PokemonType.ROCK, 1.2, 39.8, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Teal Mask Terastallized", "teal-mask-tera", PokemonType.GRASS, null, 1.2, 39.8, Abilities.EMBODY_ASPECT_TEAL, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Wellspring Mask Terastallized", "wellspring-mask-tera", PokemonType.GRASS, PokemonType.WATER, 1.2, 39.8, Abilities.EMBODY_ASPECT_WELLSPRING, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Hearthflame Mask Terastallized", "hearthflame-mask-tera", PokemonType.GRASS, PokemonType.FIRE, 1.2, 39.8, Abilities.EMBODY_ASPECT_HEARTHFLAME, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Cornerstone Mask Terastallized", "cornerstone-mask-tera", PokemonType.GRASS, PokemonType.ROCK, 1.2, 39.8, Abilities.EMBODY_ASPECT_CORNERSTONE, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + ), + new PokemonSpecies(Species.ARCHALUDON, 9, false, false, false, "Alloy Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 2, 60, Abilities.STAMINA, Abilities.STURDY, Abilities.STALWART, 600, 90, 105, 130, 125, 65, 85, 10, 50, 300, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HYDRAPPLE, 9, false, false, false, "Apple Hydra Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 1.8, 93, Abilities.SUPERSWEET_SYRUP, Abilities.REGENERATOR, Abilities.STICKY_HOLD, 540, 106, 80, 110, 120, 80, 44, 10, 50, 270, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(Species.GOUGING_FIRE, 9, false, false, false, "Paradox Pokémon", PokemonType.FIRE, PokemonType.DRAGON, 3.5, 590, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 105, 115, 121, 65, 93, 91, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.RAGING_BOLT, 9, false, false, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 5.2, 480, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 125, 73, 91, 137, 89, 75, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_BOULDER, 9, false, false, false, "Paradox Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1.5, 162.5, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 120, 80, 68, 108, 124, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.IRON_CROWN, 9, false, false, false, "Paradox Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 156, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 72, 100, 122, 108, 98, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TERAPAGOS, 9, false, true, false, "Tera Pokémon", PokemonType.NORMAL, null, 0.2, 6.5, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, GrowthRate.SLOW, 50, false, false, + new PokemonForm("Normal Form", "", PokemonType.NORMAL, null, 0.2, 6.5, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, false, null, true), + new PokemonForm("Terastal Form", "terastal", PokemonType.NORMAL, null, 0.3, 16, Abilities.TERA_SHELL, Abilities.NONE, Abilities.NONE, 600, 95, 95, 110, 105, 110, 85, 5, 50, 120), + new PokemonForm("Stellar Form", "stellar", PokemonType.NORMAL, null, 1.7, 77, Abilities.TERAFORM_ZERO, Abilities.NONE, Abilities.NONE, 700, 160, 105, 110, 130, 110, 85, 5, 50, 140), + ), + new PokemonSpecies(Species.PECHARUNT, 9, false, false, true, "Subjugation Pokémon", PokemonType.POISON, PokemonType.GHOST, 0.3, 0.3, Abilities.POISON_PUPPETEER, Abilities.NONE, Abilities.NONE, 600, 88, 88, 160, 88, 88, 88, 3, 0, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.ALOLA_RATTATA, 7, false, false, false, "Mouse Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.3, 3.8, Abilities.GLUTTONY, Abilities.HUSTLE, Abilities.THICK_FAT, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_RATICATE, 7, false, false, false, "Mouse Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.7, 25.5, Abilities.GLUTTONY, Abilities.HUSTLE, Abilities.THICK_FAT, 413, 75, 71, 70, 40, 80, 77, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_RAICHU, 7, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, PokemonType.PSYCHIC, 0.7, 21, Abilities.SURGE_SURFER, Abilities.NONE, Abilities.NONE, 485, 60, 85, 50, 95, 85, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_SANDSHREW, 7, false, false, false, "Mouse Pokémon", PokemonType.ICE, PokemonType.STEEL, 0.7, 40, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SLUSH_RUSH, 300, 50, 75, 90, 10, 35, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_SANDSLASH, 7, false, false, false, "Mouse Pokémon", PokemonType.ICE, PokemonType.STEEL, 1.2, 55, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SLUSH_RUSH, 450, 75, 100, 120, 25, 65, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_VULPIX, 7, false, false, false, "Fox Pokémon", PokemonType.ICE, null, 0.6, 9.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SNOW_WARNING, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(Species.ALOLA_NINETALES, 7, false, false, false, "Fox Pokémon", PokemonType.ICE, PokemonType.FAIRY, 1.1, 19.9, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.SNOW_WARNING, 505, 73, 67, 75, 81, 100, 109, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(Species.ALOLA_DIGLETT, 7, false, false, false, "Mole Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.2, 1, Abilities.SAND_VEIL, Abilities.TANGLING_HAIR, Abilities.SAND_FORCE, 265, 10, 55, 30, 35, 45, 90, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_DUGTRIO, 7, false, false, false, "Mole Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 66.6, Abilities.SAND_VEIL, Abilities.TANGLING_HAIR, Abilities.SAND_FORCE, 425, 35, 100, 60, 50, 70, 110, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_MEOWTH, 7, false, false, false, "Scratch Cat Pokémon", PokemonType.DARK, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.RATTLED, 290, 40, 35, 35, 50, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_PERSIAN, 7, false, false, false, "Classy Cat Pokémon", PokemonType.DARK, null, 1.1, 33, Abilities.FUR_COAT, Abilities.TECHNICIAN, Abilities.RATTLED, 440, 65, 60, 60, 75, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_GEODUDE, 7, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 0.4, 20.3, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ALOLA_GRAVELER, 7, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1, 110, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ALOLA_GOLEM, 7, false, false, false, "Megaton Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1.7, 316, Abilities.MAGNET_PULL, Abilities.STURDY, Abilities.GALVANIZE, 495, 80, 120, 130, 55, 65, 45, 45, 70, 223, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.ALOLA_GRIMER, 7, false, false, false, "Sludge Pokémon", PokemonType.POISON, PokemonType.DARK, 0.7, 42, Abilities.POISON_TOUCH, Abilities.GLUTTONY, Abilities.POWER_OF_ALCHEMY, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_MUK, 7, false, false, false, "Sludge Pokémon", PokemonType.POISON, PokemonType.DARK, 1, 52, Abilities.POISON_TOUCH, Abilities.GLUTTONY, Abilities.POWER_OF_ALCHEMY, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ALOLA_EXEGGUTOR, 7, false, false, false, "Coconut Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 10.9, 415.6, Abilities.FRISK, Abilities.NONE, Abilities.HARVEST, 530, 95, 105, 85, 125, 75, 45, 45, 50, 186, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.ALOLA_MAROWAK, 7, false, false, false, "Bone Keeper Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1, 34, Abilities.CURSED_BODY, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.ETERNAL_FLOETTE, 6, true, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 551, 74, 65, 67, 125, 128, 92, 120, 70, 243, GrowthRate.MEDIUM_FAST, 0, false), //Marked as Sub-Legend, for casing purposes + new PokemonSpecies(Species.GALAR_MEOWTH, 8, false, false, false, "Scratch Cat Pokémon", PokemonType.STEEL, null, 0.4, 7.5, Abilities.PICKUP, Abilities.TOUGH_CLAWS, Abilities.UNNERVE, 290, 50, 65, 55, 40, 40, 40, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_PONYTA, 8, false, false, false, "Fire Horse Pokémon", PokemonType.PSYCHIC, null, 0.8, 24, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_RAPIDASH, 8, false, false, false, "Fire Horse Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.7, 80, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_SLOWPOKE, 8, false, false, false, "Dopey Pokémon", PokemonType.PSYCHIC, null, 1.2, 36, Abilities.GLUTTONY, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_SLOWBRO, 8, false, false, false, "Hermit Crab Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1.6, 70.5, Abilities.QUICK_DRAW, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 100, 95, 100, 70, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_FARFETCHD, 8, false, false, false, "Wild Duck Pokémon", PokemonType.FIGHTING, null, 0.8, 42, Abilities.STEADFAST, Abilities.NONE, Abilities.SCRAPPY, 377, 52, 95, 55, 58, 62, 55, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_WEEZING, 8, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, PokemonType.FAIRY, 3, 16, Abilities.LEVITATE, Abilities.NEUTRALIZING_GAS, Abilities.MISTY_SURGE, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_MR_MIME, 8, false, false, false, "Barrier Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.4, 56.8, Abilities.VITAL_SPIRIT, Abilities.SCREEN_CLEANER, Abilities.ICE_BODY, 460, 50, 65, 65, 90, 90, 100, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_ARTICUNO, 8, true, false, false, "Freeze Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.7, 50.9, Abilities.COMPETITIVE, Abilities.NONE, Abilities.NONE, 580, 90, 85, 85, 125, 100, 95, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GALAR_ZAPDOS, 8, true, false, false, "Electric Pokémon", PokemonType.FIGHTING, PokemonType.FLYING, 1.6, 58.2, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 580, 90, 125, 90, 85, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GALAR_MOLTRES, 8, true, false, false, "Flame Pokémon", PokemonType.DARK, PokemonType.FLYING, 2, 66, Abilities.BERSERK, Abilities.NONE, Abilities.NONE, 580, 90, 85, 90, 100, 125, 90, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.GALAR_SLOWKING, 8, false, false, false, "Royal Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1.8, 79.5, Abilities.CURIOUS_MEDICINE, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 65, 80, 110, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_CORSOLA, 8, false, false, false, "Coral Pokémon", PokemonType.GHOST, null, 0.6, 0.5, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 410, 60, 55, 100, 65, 100, 30, 60, 50, 144, GrowthRate.FAST, 25, false), + new PokemonSpecies(Species.GALAR_ZIGZAGOON, 8, false, false, false, "Tiny Raccoon Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.4, 17.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_LINOONE, 8, false, false, false, "Rushing Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.5, 32.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_DARUMAKA, 8, false, false, false, "Zen Charm Pokémon", PokemonType.ICE, null, 0.7, 40, Abilities.HUSTLE, Abilities.NONE, Abilities.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GALAR_DARMANITAN, 8, false, false, false, "Blazing Pokémon", PokemonType.ICE, null, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Standard Mode", "", PokemonType.ICE, null, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), + new PokemonForm("Zen Mode", "zen", PokemonType.ICE, PokemonType.FIRE, 1.7, 120, Abilities.GORILLA_TACTICS, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 160, 55, 30, 55, 135, 60, 50, 189), + ), + new PokemonSpecies(Species.GALAR_YAMASK, 8, false, false, false, "Spirit Pokémon", PokemonType.GROUND, PokemonType.GHOST, 0.5, 1.5, Abilities.WANDERING_SPIRIT, Abilities.NONE, Abilities.NONE, 303, 38, 55, 85, 30, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.GALAR_STUNFISK, 8, false, false, false, "Trap Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 20.5, Abilities.MIMICRY, Abilities.NONE, Abilities.NONE, 471, 109, 81, 99, 66, 84, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HISUI_GROWLITHE, 8, false, false, false, "Puppy Pokémon", PokemonType.FIRE, PokemonType.ROCK, 0.8, 22.7, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.ROCK_HEAD, 350, 60, 75, 45, 65, 50, 55, 190, 50, 70, GrowthRate.SLOW, 75, false), + new PokemonSpecies(Species.HISUI_ARCANINE, 8, false, false, false, "Legendary Pokémon", PokemonType.FIRE, PokemonType.ROCK, 2, 168, Abilities.INTIMIDATE, Abilities.FLASH_FIRE, Abilities.ROCK_HEAD, 555, 95, 115, 80, 95, 80, 90, 85, 50, 194, GrowthRate.SLOW, 75, false), + new PokemonSpecies(Species.HISUI_VOLTORB, 8, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, PokemonType.GRASS, 0.5, 13, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 80, 66, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.HISUI_ELECTRODE, 8, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, PokemonType.GRASS, 1.2, 81, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(Species.HISUI_TYPHLOSION, 8, false, false, false, "Volcano Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 69.8, Abilities.BLAZE, Abilities.NONE, Abilities.FRISK, 534, 73, 84, 78, 119, 85, 95, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.HISUI_QWILFISH, 8, false, false, false, "Balloon Pokémon", PokemonType.DARK, PokemonType.POISON, 0.5, 3.9, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HISUI_SNEASEL, 8, false, false, false, "Sharp Claw Pokémon", PokemonType.FIGHTING, PokemonType.POISON, 0.9, 27, Abilities.INNER_FOCUS, Abilities.KEEN_EYE, Abilities.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.HISUI_SAMUROTT, 8, false, false, false, "Formidable Pokémon", PokemonType.WATER, PokemonType.DARK, 1.5, 58.2, Abilities.TORRENT, Abilities.NONE, Abilities.SHARPNESS, 528, 90, 108, 80, 100, 65, 85, 45, 80, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.HISUI_LILLIGANT, 8, false, false, false, "Flowering Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.2, 19.2, Abilities.CHLOROPHYLL, Abilities.HUSTLE, Abilities.LEAF_GUARD, 480, 70, 105, 75, 50, 75, 105, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(Species.HISUI_ZORUA, 8, false, false, false, "Tricky Fox Pokémon", PokemonType.NORMAL, PokemonType.GHOST, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 35, 60, 40, 85, 40, 70, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.HISUI_ZOROARK, 8, false, false, false, "Illusion Fox Pokémon", PokemonType.NORMAL, PokemonType.GHOST, 1.6, 83, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 55, 100, 60, 125, 60, 110, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.HISUI_BRAVIARY, 8, false, false, false, "Valiant Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.7, 43.4, Abilities.KEEN_EYE, Abilities.SHEER_FORCE, Abilities.TINTED_LENS, 510, 110, 83, 70, 112, 70, 65, 60, 50, 179, GrowthRate.SLOW, 100, false), + new PokemonSpecies(Species.HISUI_SLIGGOO, 8, false, false, false, "Soft Tissue Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 0.7, 68.5, Abilities.SAP_SIPPER, Abilities.SHELL_ARMOR, Abilities.GOOEY, 452, 58, 75, 83, 83, 113, 40, 45, 35, 158, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HISUI_GOODRA, 8, false, false, false, "Dragon Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 1.7, 334.1, Abilities.SAP_SIPPER, Abilities.SHELL_ARMOR, Abilities.GOOEY, 600, 80, 100, 100, 110, 150, 60, 45, 35, 270, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.HISUI_AVALUGG, 8, false, false, false, "Iceberg Pokémon", PokemonType.ICE, PokemonType.ROCK, 1.4, 262.4, Abilities.STRONG_JAW, Abilities.ICE_BODY, Abilities.STURDY, 514, 95, 127, 184, 34, 36, 38, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.HISUI_DECIDUEYE, 8, false, false, false, "Arrow Quill Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.6, 37, Abilities.OVERGROW, Abilities.NONE, Abilities.SCRAPPY, 530, 88, 112, 80, 95, 95, 60, 45, 50, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.PALDEA_TAUROS, 9, false, false, false, "Wild Bull Pokémon", PokemonType.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, GrowthRate.SLOW, 100, false, false, + new PokemonForm("Combat Breed", "combat", PokemonType.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, "", true), + new PokemonForm("Blaze Breed", "blaze", PokemonType.FIGHTING, PokemonType.FIRE, 1.4, 85, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), + new PokemonForm("Aqua Breed", "aqua", PokemonType.FIGHTING, PokemonType.WATER, 1.4, 110, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), + ), + new PokemonSpecies(Species.PALDEA_WOOPER, 9, false, false, false, "Water Fish Pokémon", PokemonType.POISON, PokemonType.GROUND, 0.4, 11, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.BLOODMOON_URSALUNA, 9, true, false, false, "Peat Pokémon", PokemonType.GROUND, PokemonType.NORMAL, 2.7, 333, Abilities.MINDS_EYE, Abilities.NONE, Abilities.NONE, 555, 113, 70, 120, 135, 65, 52, 75, 50, 278, GrowthRate.MEDIUM_FAST, 50, false), //Marked as Sub-Legend, for casing purposes ); } - -// TODO: Remove -{ - //setTimeout(() => { - /*for (let tc of Object.keys(trainerConfigs)) { - console.log(TrainerType[tc], !trainerConfigs[tc].speciesFilter ? 'all' : [...new Set(allSpecies.filter(s => s.generation <= 9).filter(trainerConfigs[tc].speciesFilter).map(s => { - while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) - s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); - return s; - }))].map(s => s.name)); - } - - const speciesFilter = (species: PokemonSpecies) => !species.legendary && !species.pseudoLegendary && !species.mythical && species.baseTotal >= 540; - console.log(!speciesFilter ? 'all' : [...new Set(allSpecies.filter(s => s.generation <= 9).filter(speciesFilter).map(s => { - while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) - s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); - return s; - }))].map(s => s.name));*/ - //}, 1000); -} diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index 1f00ce0d555..9fd71d9d95b 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -185,26 +185,38 @@ const seasonalSplashMessages: Season[] = [ name: "Halloween", start: "09-15", end: "10-31", - messages: [ "halloween.pumpkabooAbout", "halloween.mayContainSpiders", "halloween.spookyScarySkeledirge", "halloween.gourgeistUsedTrickOrTreat", "halloween.letsSnuggleForever" ], + messages: [ + "halloween.pumpkabooAbout", + "halloween.mayContainSpiders", + "halloween.spookyScarySkeledirge", + "halloween.gourgeistUsedTrickOrTreat", + "halloween.letsSnuggleForever", + ], }, { name: "XMAS", start: "12-01", end: "12-26", - messages: [ "xmas.happyHolidays", "xmas.unaffilicatedWithDelibirdServices", "xmas.delibirdSeason", "xmas.diamondsFromTheSky", "xmas.holidayStylePikachuNotIncluded" ], + messages: [ + "xmas.happyHolidays", + "xmas.unaffilicatedWithDelibirdServices", + "xmas.delibirdSeason", + "xmas.diamondsFromTheSky", + "xmas.holidayStylePikachuNotIncluded", + ], }, { name: "New Year's", start: "01-01", end: "01-31", - messages: [ "newYears.happyNewYear" ], + messages: ["newYears.happyNewYear"], }, ]; //#endregion export function getSplashMessages(): string[] { - const splashMessages: string[] = [ ...commonSplashMessages ]; + const splashMessages: string[] = [...commonSplashMessages]; console.log("use seasonal splash messages", USE_SEASONAL_SPLASH_MESSAGES); if (USE_SEASONAL_SPLASH_MESSAGES) { // add seasonal splash messages if the season is active @@ -215,13 +227,13 @@ export function getSplashMessages(): string[] { if (now >= startDate && now <= endDate) { console.log(`Adding ${messages.length} ${name} splash messages (weight: x${SEASONAL_WEIGHT_MULTIPLIER})`); - messages.forEach((message) => { + for (const message of messages) { const weightedMessage = Array(SEASONAL_WEIGHT_MULTIPLIER).fill(message); splashMessages.push(...weightedMessage); - }); + } } } } - return splashMessages.map((message) => `splashMessages:${message}`); + return splashMessages.map(message => `splashMessages:${message}`); } diff --git a/src/data/status-effect.ts b/src/data/status-effect.ts index 56e754ac407..fe4fa380d46 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -1,16 +1,15 @@ import { randIntRange } from "#app/utils"; import { StatusEffect } from "#enums/status-effect"; -import i18next, { ParseKeys } from "i18next"; - -export { StatusEffect }; +import type { ParseKeys } from "i18next"; +import i18next from "i18next"; export class Status { public effect: StatusEffect; /** Toxic damage is `1/16 max HP * toxicTurnCount` */ - public toxicTurnCount: number = 0; + public toxicTurnCount = 0; public sleepTurnsRemaining?: number; - constructor(effect: StatusEffect, toxicTurnCount: number = 0, sleepTurnsRemaining?: number) { + constructor(effect: StatusEffect, toxicTurnCount = 0, sleepTurnsRemaining?: number) { this.effect = effect; this.toxicTurnCount = toxicTurnCount; this.sleepTurnsRemaining = sleepTurnsRemaining; @@ -24,7 +23,9 @@ export class Status { } isPostTurn(): boolean { - return this.effect === StatusEffect.POISON || this.effect === StatusEffect.TOXIC || this.effect === StatusEffect.BURN; + return ( + this.effect === StatusEffect.POISON || this.effect === StatusEffect.TOXIC || this.effect === StatusEffect.BURN + ); } } @@ -47,17 +48,24 @@ function getStatusEffectMessageKey(statusEffect: StatusEffect | undefined): stri } } -export function getStatusEffectObtainText(statusEffect: StatusEffect | undefined, pokemonNameWithAffix: string, sourceText?: string): string { +export function getStatusEffectObtainText( + statusEffect: StatusEffect | undefined, + pokemonNameWithAffix: string, + sourceText?: string, +): string { if (statusEffect === StatusEffect.NONE) { return ""; } if (!sourceText) { - const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtain`as ParseKeys; + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtain` as ParseKeys; return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } - const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtainSource`as ParseKeys; - return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix, sourceText: sourceText }); + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtainSource` as ParseKeys; + return i18next.t(i18nKey, { + pokemonNameWithAffix: pokemonNameWithAffix, + sourceText: sourceText, + }); } export function getStatusEffectActivationText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { @@ -108,17 +116,17 @@ export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect): } /** -* Returns a random non-volatile StatusEffect -*/ + * Returns a random non-volatile StatusEffect + */ export function generateRandomStatusEffect(): StatusEffect { return randIntRange(1, 6); } /** -* Returns a random non-volatile StatusEffect between the two provided -* @param statusEffectA The first StatusEffect -* @param statusEffectA The second StatusEffect -*/ + * Returns a random non-volatile StatusEffect between the two provided + * @param statusEffectA The first StatusEffect + * @param statusEffectA The second StatusEffect + */ export function getRandomStatusEffect(statusEffectA: StatusEffect, statusEffectB: StatusEffect): StatusEffect { if (statusEffectA === StatusEffect.NONE || statusEffectA === StatusEffect.FAINT) { return statusEffectB; @@ -131,10 +139,10 @@ export function getRandomStatusEffect(statusEffectA: StatusEffect, statusEffectB } /** -* Returns a random non-volatile StatusEffect between the two provided -* @param statusA The first Status -* @param statusB The second Status -*/ + * Returns a random non-volatile StatusEffect between the two provided + * @param statusA The first Status + * @param statusB The second Status + */ export function getRandomStatus(statusA: Status | null, statusB: Status | null): Status | null { if (!statusA || statusA.effect === StatusEffect.NONE || statusA.effect === StatusEffect.FAINT) { return statusB; @@ -143,7 +151,6 @@ export function getRandomStatus(statusA: Status | null, statusB: Status | null): return statusA; } - return randIntRange(0, 2) ? statusA : statusB; } @@ -151,19 +158,19 @@ export function getRandomStatus(statusA: Status | null, statusB: Status | null): * Gets all non volatile status effects * @returns A list containing all non volatile status effects */ -export function getNonVolatileStatusEffects():Array { +export function getNonVolatileStatusEffects(): Array { return [ StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.PARALYSIS, StatusEffect.SLEEP, StatusEffect.FREEZE, - StatusEffect.BURN + StatusEffect.BURN, ]; } /** - * Returns whether a statuss effect is non volatile. + * Returns whether a status effect is non volatile. * Non-volatile status condition is a status that remains after being switched out. * @param status The status to check */ diff --git a/src/data/terrain.ts b/src/data/terrain.ts index d8ee8d67925..894fb8a7955 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -1,10 +1,8 @@ -import Pokemon from "../field/pokemon"; -import Move from "./move"; -import { Type } from "./type"; -import * as Utils from "../utils"; -import { ChangeMovePriorityAbAttr, applyAbAttrs } from "./ability"; -import { ProtectAttr } from "./move"; -import { BattlerIndex } from "#app/battle"; +import type Pokemon from "../field/pokemon"; +import type Move from "./moves/move"; +import { PokemonType } from "#enums/pokemon-type"; +import { ProtectAttr } from "./moves/move"; +import type { BattlerIndex } from "#app/battle"; import i18next from "i18next"; export enum TerrainType { @@ -12,14 +10,14 @@ export enum TerrainType { MISTY, ELECTRIC, GRASSY, - PSYCHIC + PSYCHIC, } export class Terrain { public terrainType: TerrainType; - public turnsLeft: integer; + public turnsLeft: number; - constructor(terrainType: TerrainType, turnsLeft?: integer) { + constructor(terrainType: TerrainType, turnsLeft?: number) { this.terrainType = terrainType; this.turnsLeft = turnsLeft || 0; } @@ -32,20 +30,20 @@ export class Terrain { return true; } - getAttackTypeMultiplier(attackType: Type): number { + getAttackTypeMultiplier(attackType: PokemonType): number { switch (this.terrainType) { case TerrainType.ELECTRIC: - if (attackType === Type.ELECTRIC) { + if (attackType === PokemonType.ELECTRIC) { return 1.3; } break; case TerrainType.GRASSY: - if (attackType === Type.GRASS) { + if (attackType === PokemonType.GRASS) { return 1.3; } break; case TerrainType.PSYCHIC: - if (attackType === Type.PSYCHIC) { + if (attackType === PokemonType.PSYCHIC) { return 1.3; } break; @@ -58,10 +56,11 @@ export class Terrain { switch (this.terrainType) { case TerrainType.PSYCHIC: if (!move.hasAttr(ProtectAttr)) { - const priority = new Utils.IntegerHolder(move.priority); - applyAbAttrs(ChangeMovePriorityAbAttr, user, null, false, move, priority); // Cancels move if the move has positive priority and targets a Pokemon grounded on the Psychic Terrain - return priority.value > 0 && user.getOpponents().some(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()); + return ( + move.getPriority(user) > 0 && + user.getOpponents().some(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()) + ); } } @@ -84,18 +83,17 @@ export function getTerrainName(terrainType: TerrainType): string { return ""; } - -export function getTerrainColor(terrainType: TerrainType): [ integer, integer, integer ] { +export function getTerrainColor(terrainType: TerrainType): [number, number, number] { switch (terrainType) { case TerrainType.MISTY: - return [ 232, 136, 200 ]; + return [232, 136, 200]; case TerrainType.ELECTRIC: - return [ 248, 248, 120 ]; + return [248, 248, 120]; case TerrainType.GRASSY: - return [ 120, 200, 80 ]; + return [120, 200, 80]; case TerrainType.PSYCHIC: - return [ 160, 64, 160 ]; + return [160, 64, 160]; } - return [ 0, 0, 0 ]; + return [0, 0, 0]; } diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index bc69b611075..3884aa05b13 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1,14 +1,19 @@ -import BattleScene, { startingWave } from "#app/battle-scene"; -import { ModifierTypeFunc, modifierTypes } from "#app/modifier/modifier-type"; -import { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; +import { startingWave } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import type { ModifierTypeFunc } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import type { EnemyPokemon } from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import * as Utils from "#app/utils"; -import { PokeballType } from "#app/data/pokeball"; +import { PokeballType } from "#enums/pokeball"; import { pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import PokemonSpecies, { getPokemonSpecies, PokemonSpeciesFilter } from "#app/data/pokemon-species"; +import type { PokemonSpeciesFilter } from "#app/data/pokemon-species"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; import { tmSpecies } from "#app/data/balance/tms"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { doubleBattleDialogue } from "#app/data/dialogue"; -import { PersistentModifier } from "#app/modifier/modifier"; +import type { PersistentModifier } from "#app/modifier/modifier"; import { TrainerVariant } from "#app/field/trainer"; import { getIsInitialized, initI18n } from "#app/plugins/i18n"; import i18next from "i18next"; @@ -17,52 +22,54 @@ import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { Gender } from "#app/data/gender"; +import { signatureSpecies } from "./balance/signature-species"; /** Minimum BST for Pokemon generated onto the Elite Four's teams */ const ELITE_FOUR_MINIMUM_BST = 460; -/** Minimum BST for Pokemon generated onto the E4 Champion's team */ -const CHAMPION_MINIMUM_BST = 508; + +/** The wave at which (non-Paldean) Gym Leaders start having Tera mons*/ +const GYM_LEADER_TERA_WAVE = 100; export enum TrainerPoolTier { - COMMON, - UNCOMMON, - RARE, - SUPER_RARE, - ULTRA_RARE + COMMON, + UNCOMMON, + RARE, + SUPER_RARE, + ULTRA_RARE, } export interface TrainerTierPools { - [key: integer]: Species[] + [key: number]: Species[]; } export enum TrainerSlot { - NONE, - TRAINER, - TRAINER_PARTNER + NONE, + TRAINER, + TRAINER_PARTNER, } export class TrainerPartyTemplate { - public size: integer; + public size: number; public strength: PartyMemberStrength; public sameSpecies: boolean; public balanced: boolean; - constructor(size: integer, strength: PartyMemberStrength, sameSpecies?: boolean, balanced?: boolean) { + constructor(size: number, strength: PartyMemberStrength, sameSpecies?: boolean, balanced?: boolean) { this.size = size; this.strength = strength; this.sameSpecies = !!sameSpecies; this.balanced = !!balanced; } - getStrength(index: integer): PartyMemberStrength { + getStrength(_index: number): PartyMemberStrength { return this.strength; } - isSameSpecies(index: integer): boolean { + isSameSpecies(_index: number): boolean { return this.sameSpecies; } - isBalanced(index: integer): boolean { + isBalanced(_index: number): boolean { return this.balanced; } } @@ -71,14 +78,17 @@ export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate { public templates: TrainerPartyTemplate[]; constructor(...templates: TrainerPartyTemplate[]) { - super(templates.reduce((total: integer, template: TrainerPartyTemplate) => { - total += template.size; - return total; - }, 0), PartyMemberStrength.AVERAGE); + super( + templates.reduce((total: number, template: TrainerPartyTemplate) => { + total += template.size; + return total; + }, 0), + PartyMemberStrength.AVERAGE, + ); this.templates = templates; } - getStrength(index: integer): PartyMemberStrength { + getStrength(index: number): PartyMemberStrength { let t = 0; for (const template of this.templates) { if (t + template.size > index) { @@ -90,7 +100,7 @@ export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate { return super.getStrength(index); } - isSameSpecies(index: integer): boolean { + isSameSpecies(index: number): boolean { let t = 0; for (const template of this.templates) { if (t + template.size > index) { @@ -102,7 +112,7 @@ export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate { return super.isSameSpecies(index); } - isBalanced(index: integer): boolean { + isBalanced(index: number): boolean { let t = 0; for (const template of this.templates) { if (t + template.size > index) { @@ -116,22 +126,52 @@ export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate { } export const trainerPartyTemplates = { - ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), ONE_AVG: new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), ONE_STRONG: new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), ONE_STRONGER: new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), TWO_WEAKER: new TrainerPartyTemplate(2, PartyMemberStrength.WEAKER), TWO_WEAK: new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), - TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true)), - TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), + ), + TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), TWO_AVG: new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), - TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true)), + TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), + ), TWO_STRONG: new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), THREE_WEAK: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK), THREE_WEAK_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, true), @@ -151,30 +191,123 @@ export const trainerPartyTemplates = { SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true), SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), - GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - GYM_LEADER_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - GYM_LEADER_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - GYM_LEADER_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - GYM_LEADER_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), + GYM_LEADER_1: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + GYM_LEADER_2: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + GYM_LEADER_3: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + GYM_LEADER_4: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), + GYM_LEADER_5: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), - ELITE_FOUR: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), + ELITE_FOUR: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), - CHAMPION: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), new TrainerPartyTemplate(5, PartyMemberStrength.STRONG, false, true)), + CHAMPION: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(4, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(2, PartyMemberStrength.STRONGER, false, true), + ), - RIVAL: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - RIVAL_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), - RIVAL_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), - RIVAL_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), - RIVAL_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - RIVAL_6: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)) + RIVAL: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ), + RIVAL_2: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), + ), + RIVAL_3: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), + ), + RIVAL_4: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true), + ), + RIVAL_5: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ), + RIVAL_6: new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), }; -type PartyTemplateFunc = (scene: BattleScene) => TrainerPartyTemplate; -type PartyMemberFunc = (scene: BattleScene, level: integer, strength: PartyMemberStrength) => EnemyPokemon; +type PartyTemplateFunc = () => TrainerPartyTemplate; +type PartyMemberFunc = (level: number, strength: PartyMemberStrength) => EnemyPokemon; type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[]; +type GenAIFunc = (party: EnemyPokemon[]) => void; export interface PartyMemberFuncs { - [key: integer]: PartyMemberFunc + [key: number]: PartyMemberFunc; +} + +export enum TeraAIMode { + NO_TERA, + INSTANT_TERA, + SMART_TERA, +} + +/** + * Stores data and helper functions about a trainers AI options. + */ +export class TrainerAI { + public teraMode: TeraAIMode = TeraAIMode.NO_TERA; + public instantTeras: number[]; + + /** + * @param canTerastallize Whether this trainer is allowed to tera + */ + constructor(teraMode: TeraAIMode = TeraAIMode.NO_TERA) { + this.teraMode = teraMode; + this.instantTeras = []; + } + + /** + * Checks if a trainer can tera + * @returns Whether this trainer can currently tera + */ + public canTerastallize() { + return this.teraMode !== TeraAIMode.NO_TERA; + } + + /** + * Sets a pokemon on this AI to just instantly Tera on first move used + * @param index The index of the pokemon to instantly tera. + */ + public setInstantTera(index: number) { + this.teraMode = TeraAIMode.INSTANT_TERA; + this.instantTeras.push(index); + } } export class TrainerConfig { @@ -185,14 +318,14 @@ export class TrainerConfig { public nameDouble: string; public title: string; public titleDouble: string; - public hasGenders: boolean = false; - public hasDouble: boolean = false; - public hasCharSprite: boolean = false; - public doubleOnly: boolean = false; - public moneyMultiplier: number = 1; - public isBoss: boolean = false; - public hasStaticParty: boolean = false; - public useSameSeedForAllMembers: boolean = false; + public hasGenders = false; + public hasDouble = false; + public hasCharSprite = false; + public doubleOnly = false; + public moneyMultiplier = 1; + public isBoss = false; + public hasStaticParty = false; + public useSameSeedForAllMembers = false; public mixedBattleBgm: string; public battleBgm: string; public encounterBgm: string; @@ -200,14 +333,17 @@ export class TrainerConfig { public doubleEncounterBgm: string; public victoryBgm: string; public genModifiersFunc: GenModifiersFunc; + public genAIFuncs: GenAIFunc[] = []; public modifierRewardFuncs: ModifierTypeFunc[] = []; public partyTemplates: TrainerPartyTemplate[]; public partyTemplateFunc: PartyTemplateFunc; + public eventRewardFuncs: ModifierTypeFunc[] = []; public partyMemberFuncs: PartyMemberFuncs = {}; public speciesPools: TrainerTierPools; public speciesFilter: PokemonSpeciesFilter; - public specialtyTypes: Type[] = []; - public hasVoucher: boolean = false; + public specialtyType: PokemonType; + public hasVoucher = false; + public trainerAI: TrainerAI; public encounterMessages: string[] = []; public victoryMessages: string[] = []; @@ -223,19 +359,22 @@ export class TrainerConfig { constructor(trainerType: TrainerType, allowLegendaries?: boolean) { this.trainerType = trainerType; + this.trainerAI = new TrainerAI(); this.name = Utils.toReadableString(TrainerType[this.getDerivedType()]); this.battleBgm = "battle_trainer"; this.mixedBattleBgm = "battle_trainer"; this.victoryBgm = "victory_trainer"; - this.partyTemplates = [ trainerPartyTemplates.TWO_AVG ]; - this.speciesFilter = species => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden(); + this.partyTemplates = [trainerPartyTemplates.TWO_AVG]; + this.speciesFilter = species => + (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && + !species.isTrainerForbidden(); } getKey(): string { return TrainerType[this.getDerivedType()].toString().toLowerCase(); } - getSpriteKey(female?: boolean, isDouble: boolean = false): string { + getSpriteKey(female?: boolean, isDouble = false): string { let ret = this.getKey(); if (this.hasGenders) { ret += `_${female ? "f" : "m"}`; @@ -286,16 +425,14 @@ export class TrainerConfig { // Get the title from the i18n file this.title = i18next.t(`titles:${title}`); - return this; } - /** - * Returns the derived trainer type for a given trainer type. - * @param trainerTypeToDeriveFrom - The trainer type to derive from. (If null, the this.trainerType property will be used.) - * @returns {TrainerType} - The derived trainer type. - */ + * Returns the derived trainer type for a given trainer type. + * @param trainerTypeToDeriveFrom - The trainer type to derive from. (If null, the this.trainerType property will be used.) + * @returns {TrainerType} - The derived trainer type. + */ getDerivedType(trainerTypeToDeriveFrom: TrainerType | null = null): TrainerType { let trainerType = trainerTypeToDeriveFrom ? trainerTypeToDeriveFrom : this.trainerType; switch (trainerType) { @@ -364,11 +501,11 @@ export class TrainerConfig { } /** - * Sets the configuration for trainers with genders, including the female name and encounter background music (BGM). - * @param {string} [nameFemale] The name of the female trainer. If 'Ivy', a localized name will be assigned. - * @param {TrainerType | string} [femaleEncounterBgm] The encounter BGM for the female trainer, which can be a TrainerType or a string. - * @returns {TrainerConfig} The updated TrainerConfig instance. - **/ + * Sets the configuration for trainers with genders, including the female name and encounter background music (BGM). + * @param {string} [nameFemale] The name of the female trainer. If 'Ivy', a localized name will be assigned. + * @param {TrainerType | string} [femaleEncounterBgm] The encounter BGM for the female trainer, which can be a TrainerType or a string. + * @returns {TrainerConfig} The updated TrainerConfig instance. + **/ setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig { // If the female name is 'Ivy' (the rival), assign a localized name. if (nameFemale === "Ivy") { @@ -391,9 +528,10 @@ export class TrainerConfig { if (femaleEncounterBgm) { // If the BGM is a TrainerType (number), convert it to a string, replace underscores with spaces, and convert to lowercase. // Otherwise, assign the provided string as the BGM. - this.femaleEncounterBgm = typeof femaleEncounterBgm === "number" - ? TrainerType[femaleEncounterBgm].toString().replace(/_/g, " ").toLowerCase() - : femaleEncounterBgm; + this.femaleEncounterBgm = + typeof femaleEncounterBgm === "number" + ? TrainerType[femaleEncounterBgm].toString().replace(/_/g, " ").toLowerCase() + : femaleEncounterBgm; } // Return the updated TrainerConfig instance. @@ -401,25 +539,28 @@ export class TrainerConfig { } /** - * Sets the configuration for trainers with double battles, including the name of the double trainer and the encounter BGM. - * @param nameDouble The name of the double trainer (e.g., "Ace Duo" for Trainer Class Doubles or "red_blue_double" for NAMED trainer doubles). - * @param doubleEncounterBgm The encounter BGM for the double trainer, which can be a TrainerType or a string. - * @returns {TrainerConfig} The updated TrainerConfig instance. - */ + * Sets the configuration for trainers with double battles, including the name of the double trainer and the encounter BGM. + * @param nameDouble The name of the double trainer (e.g., "Ace Duo" for Trainer Class Doubles or "red_blue_double" for NAMED trainer doubles). + * @param doubleEncounterBgm The encounter BGM for the double trainer, which can be a TrainerType or a string. + * @returns {TrainerConfig} The updated TrainerConfig instance. + */ setHasDouble(nameDouble: string, doubleEncounterBgm?: TrainerType | string): TrainerConfig { this.hasDouble = true; this.nameDouble = nameDouble; if (doubleEncounterBgm) { - this.doubleEncounterBgm = typeof doubleEncounterBgm === "number" ? TrainerType[doubleEncounterBgm].toString().replace(/\_/g, " ").toLowerCase() : doubleEncounterBgm; + this.doubleEncounterBgm = + typeof doubleEncounterBgm === "number" + ? TrainerType[doubleEncounterBgm].toString().replace(/\_/g, " ").toLowerCase() + : doubleEncounterBgm; } return this; } /** - * Sets the trainer type for double battles. - * @param trainerTypeDouble The TrainerType of the partner in a double battle. - * @returns {TrainerConfig} The updated TrainerConfig instance. - */ + * Sets the trainer type for double battles. + * @param trainerTypeDouble The TrainerType of the partner in a double battle. + * @returns {TrainerConfig} The updated TrainerConfig instance. + */ setDoubleTrainerType(trainerTypeDouble: TrainerType): TrainerConfig { this.trainerTypeDouble = trainerTypeDouble; this.setDoubleMessages(this.nameDouble); @@ -427,9 +568,9 @@ export class TrainerConfig { } /** - * Sets the encounter and victory messages for double trainers. - * @param nameDouble - The name of the pair (e.g. "red_blue_double"). - */ + * Sets the encounter and victory messages for double trainers. + * @param nameDouble - The name of the pair (e.g. "red_blue_double"). + */ setDoubleMessages(nameDouble: string) { // Check if there is double battle dialogue for this trainer if (doubleBattleDialogue[nameDouble]) { @@ -441,10 +582,10 @@ export class TrainerConfig { } /** - * Sets the title for double trainers - * @param titleDouble The key for the title in the i18n file. (e.g., "champion_double"). - * @returns {TrainerConfig} The updated TrainerConfig instance. - */ + * Sets the title for double trainers + * @param titleDouble The key for the title in the i18n file. (e.g., "champion_double"). + * @returns {TrainerConfig} The updated TrainerConfig instance. + */ setDoubleTitle(titleDouble: string): TrainerConfig { // First check if i18n is initialized if (!getIsInitialized()) { @@ -501,7 +642,8 @@ export class TrainerConfig { } setEncounterBgm(encounterBgm: TrainerType | string): TrainerConfig { - this.encounterBgm = typeof encounterBgm === "number" ? TrainerType[encounterBgm].toString().toLowerCase() : encounterBgm; + this.encounterBgm = + typeof encounterBgm === "number" ? TrainerType[encounterBgm].toString().toLowerCase() : encounterBgm; return this; } @@ -520,13 +662,15 @@ export class TrainerConfig { return this; } - setPartyMemberFunc(slotIndex: integer, partyMemberFunc: PartyMemberFunc): TrainerConfig { + setPartyMemberFunc(slotIndex: number, partyMemberFunc: PartyMemberFunc): TrainerConfig { this.partyMemberFuncs[slotIndex] = partyMemberFunc; return this; } setSpeciesPools(speciesPools: TrainerTierPools | Species[]): TrainerConfig { - this.speciesPools = (Array.isArray(speciesPools) ? { [TrainerPoolTier.COMMON]: speciesPools } : speciesPools) as unknown as TrainerTierPools; + this.speciesPools = (Array.isArray(speciesPools) + ? { [TrainerPoolTier.COMMON]: speciesPools } + : speciesPools) as unknown as TrainerTierPools; return this; } @@ -536,8 +680,8 @@ export class TrainerConfig { return this; } - setSpecialtyTypes(...specialtyTypes: Type[]): TrainerConfig { - this.specialtyTypes = specialtyTypes; + setSpecialtyType(specialtyType: PokemonType): TrainerConfig { + this.specialtyType = specialtyType; return this; } @@ -546,6 +690,64 @@ export class TrainerConfig { return this; } + /** + * Sets random pokemon from the trainer's team to instant tera. Also sets Tera type to specialty type and checks for Shedinja as appropriate. + * @param count A callback (yucky) to see how many teras should be used + * @param slot Optional, a specified slot that should be terastallized. Wraps to match party size (-1 will get the last slot and so on). + * @returns this + */ + setRandomTeraModifiers(count: () => number, slot?: number): TrainerConfig { + this.genAIFuncs.push((party: EnemyPokemon[]) => { + const shedinjaCanTera = !this.hasSpecialtyType() || this.specialtyType === PokemonType.BUG; // Better to check one time than 6 + const partyMemberIndexes = new Array(party.length) + .fill(null) + .map((_, i) => i) + .filter(i => shedinjaCanTera || party[i].species.speciesId !== Species.SHEDINJA); // Shedinja can only Tera on Bug specialty type (or no specialty type) + const setPartySlot = !Utils.isNullOrUndefined(slot) ? Phaser.Math.Wrap(slot, 0, party.length) : -1; // If we have a tera slot defined, wrap it to party size. + for (let t = 0; t < Math.min(count(), party.length); t++) { + const randomIndex = + partyMemberIndexes.indexOf(setPartySlot) > -1 ? setPartySlot : Utils.randSeedItem(partyMemberIndexes); + partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); + if (this.hasSpecialtyType()) { + party[randomIndex].teraType = this.specialtyType; + } + this.trainerAI.setInstantTera(randomIndex); + } + }); + return this; + } + + /** + * Sets a specific pokemon to instantly Tera + * @param index The index within the team to have instant Tera. + * @returns this + */ + setInstantTera(index: number): TrainerConfig { + this.trainerAI.setInstantTera(index); + return this; + } + + // function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: Type[]): PersistentModifier[] { + // const ret: PersistentModifier[] = []; + // const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); + // for (let t = 0; t < Math.min(count, party.length); t++) { + // const randomIndex = Utils.randSeedItem(partyMemberIndexes); + // partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); + // ret.push(modifierTypes.TERA_SHARD().generateType([], [ Utils.randSeedItem(types ? types : party[randomIndex].getTypes()) ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct? + // } + // return ret; + // } + + setEventModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { + this.eventRewardFuncs = modifierTypeFuncs.map(func => () => { + const modifierTypeFunc = func(); + const modifierType = modifierTypeFunc(); + modifierType.withIdFromFunc(modifierTypeFunc); + return modifierType; + }); + return this; + } + setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => { const modifierTypeFunc = func(); @@ -557,109 +759,421 @@ export class TrainerConfig { } /** - * Returns the pool of species for an evil team admin - * @param team - The evil team the admin belongs to. - * @returns {TrainerTierPools} - */ + * Returns the pool of species for an evil team admin + * @param team - The evil team the admin belongs to. + * @returns {TrainerTierPools} + */ speciesPoolPerEvilTeamAdmin(team): TrainerTierPools { team = team.toLowerCase(); switch (team) { case "rocket": { return { - [TrainerPoolTier.COMMON]: [ Species.RATTATA, Species.KOFFING, Species.EKANS, Species.ZUBAT, Species.MAGIKARP, Species.HOUNDOUR, Species.ONIX, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.DROWZEE, Species.VILEPLUME ], - [TrainerPoolTier.UNCOMMON]: [ Species.PORYGON, Species.MANKEY, Species.MAGNEMITE, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO, Species.MAGBY, Species.ELEKID ], - [TrainerPoolTier.RARE]: [ Species.DRATINI, Species.LARVITAR ] + [TrainerPoolTier.COMMON]: [ + Species.RATICATE, + Species.ARBOK, + Species.VILEPLUME, + Species.ARCANINE, + Species.GENGAR, + Species.HYPNO, + Species.ELECTRODE, + Species.EXEGGUTOR, + Species.CUBONE, + Species.KOFFING, + Species.GYARADOS, + Species.CROBAT, + Species.STEELIX, + Species.HOUNDOOM, + Species.HONCHKROW, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.OMASTAR, + Species.KABUTOPS, + Species.MAGNEZONE, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.PORYGON_Z, + Species.ANNIHILAPE, + Species.ALOLA_SANDSLASH, + Species.ALOLA_PERSIAN, + Species.ALOLA_GOLEM, + Species.ALOLA_MUK, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.RARE]: [Species.DRAGONITE, Species.TYRANITAR], }; } case "magma": { return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.BALTOY, Species.ROLYCOLY, Species.GLIGAR, Species.TORKOAL, Species.HOUNDOUR, Species.MAGBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.TRAPINCH, Species.SILICOBRA, Species.RHYHORN, Species.ANORITH, Species.LILEEP, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], - [TrainerPoolTier.RARE]: [ Species.CAPSAKID, Species.CHARCADET ] + [TrainerPoolTier.COMMON]: [ + Species.ARCANINE, + Species.MAGCARGO, + Species.HOUNDOOM, + Species.TORKOAL, + Species.SOLROCK, + Species.CLAYDOL, + Species.HIPPOWDON, + Species.MAGMORTAR, + Species.GLISCOR, + Species.COALOSSAL, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.AGGRON, + Species.FLYGON, + Species.CRADILY, + Species.ARMALDO, + Species.RHYPERIOR, + Species.TURTONATOR, + Species.SANDACONDA, + Species.TOEDSCRUEL, + Species.HISUI_ARCANINE, + ], + [TrainerPoolTier.RARE]: [Species.CHARCADET, Species.SCOVILLAIN], }; } case "aqua": { return { - [TrainerPoolTier.COMMON]: [ Species.CORPHISH, Species.SPHEAL, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.LOTAD, Species.WAILMER, Species.REMORAID, Species.BARBOACH ], - [TrainerPoolTier.UNCOMMON]: [ Species.MANTYKE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.DHELMISE, Species.CLOBBOPUS, Species.FEEBAS, Species.PALDEA_WOOPER, Species.HORSEA, Species.SKRELP ], - [TrainerPoolTier.RARE]: [ Species.DONDOZO, Species.BASCULEGION ] + [TrainerPoolTier.COMMON]: [ + Species.TENTACRUEL, + Species.LANTURN, + Species.AZUMARILL, + Species.QUAGSIRE, + Species.OCTILLERY, + Species.LUDICOLO, + Species.PELIPPER, + Species.WAILORD, + Species.WHISCASH, + Species.CRAWDAUNT, + Species.WALREIN, + Species.CLAMPERL, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.QUAGSIRE, + Species.MANTINE, + Species.KINGDRA, + Species.MILOTIC, + Species.DRAGALGE, + Species.DHELMISE, + Species.BARRASKEWDA, + Species.GRAPPLOCT, + Species.OVERQWIL, + ], + [TrainerPoolTier.RARE]: [Species.BASCULEGION, Species.DONDOZO], }; } case "galactic": { return { - [TrainerPoolTier.COMMON]: [ Species.BRONZOR, Species.SWINUB, Species.YANMA, Species.LICKITUNG, Species.TANGELA, Species.MAGBY, Species.ELEKID, Species.SKORUPI, Species.ZUBAT, Species.MURKROW, Species.MAGIKARP, Species.VOLTORB ], - [TrainerPoolTier.UNCOMMON]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.DUSKULL, Species.ROTOM, Species.HISUI_VOLTORB, Species.GLIGAR, Species.ABRA ], - [TrainerPoolTier.RARE]: [ Species.URSALUNA, Species.HISUI_LILLIGANT, Species.SPIRITOMB, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ + Species.ELECTRODE, + Species.GYARADOS, + Species.CROBAT, + Species.HONCHKROW, + Species.BRONZONG, + Species.DRAPION, + Species.LICKILICKY, + Species.TANGROWTH, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.YANMEGA, + Species.MAMOSWINE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.ALAKAZAM, + Species.WEAVILE, + Species.GLISCOR, + Species.DUSKNOIR, + Species.ROTOM, + Species.OVERQWIL, + Species.HISUI_ARCANINE, + Species.HISUI_ELECTRODE, + ], + [TrainerPoolTier.RARE]: [Species.SPIRITOMB, Species.URSALUNA, Species.SNEASLER, Species.HISUI_LILLIGANT], }; } case "plasma": { return { - [TrainerPoolTier.COMMON]: [ Species.YAMASK, Species.ROGGENROLA, Species.JOLTIK, Species.TYMPOLE, Species.FRILLISH, Species.FERROSEED, Species.SANDILE, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.CUBCHOO, Species.VANILLITE ], - [TrainerPoolTier.UNCOMMON]: [ Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.TYNAMO, Species.GALAR_DARUMAKA, Species.GOLETT, Species.MIENFOO, Species.DURANT, Species.SIGILYPH ], - [TrainerPoolTier.RARE]: [ Species.HISUI_ZORUA, Species.AXEW, Species.DEINO, Species.HISUI_BRAVIARY ] + [TrainerPoolTier.COMMON]: [ + Species.GIGALITH, + Species.CONKELDURR, + Species.SEISMITOAD, + Species.KROOKODILE, + Species.DARMANITAN, + Species.COFAGRIGUS, + Species.VANILLUXE, + Species.AMOONGUSS, + Species.JELLICENT, + Species.GALVANTULA, + Species.FERROTHORN, + Species.BEARTIC, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.EXCADRILL, + Species.SIGILYPH, + Species.ZOROARK, + Species.KLINKLANG, + Species.EELEKTROSS, + Species.MIENSHAO, + Species.GOLURK, + Species.BISHARP, + Species.MANDIBUZZ, + Species.DURANT, + Species.GALAR_DARMANITAN, + ], + [TrainerPoolTier.RARE]: [Species.HAXORUS, Species.HYDREIGON, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY], + }; + } + case "plasma_2": { + return { + [TrainerPoolTier.COMMON]: [ + Species.MUK, + Species.ELECTRODE, + Species.BRONZONG, + Species.MAGNEZONE, + Species.PORYGON_Z, + Species.MUSHARNA, + Species.REUNICLUS, + Species.GALVANTULA, + Species.FERROTHORN, + Species.EELEKTROSS, + Species.BEHEEYEM, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.METAGROSS, + Species.ROTOM, + Species.CARRACOSTA, + Species.ARCHEOPS, + Species.GOLURK, + Species.DURANT, + Species.VIKAVOLT, + Species.ORBEETLE, + Species.REVAVROOM, + Species.ALOLA_MUK, + Species.HISUI_ELECTRODE, + ], + [TrainerPoolTier.RARE]: [Species.ELECTIVIRE, Species.MAGMORTAR, Species.BISHARP, Species.ARCHALUDON], }; } case "flare": { return { - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.FOONGUS, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO ], - [TrainerPoolTier.RARE]: [ Species.NOIBAT, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO ] + [TrainerPoolTier.COMMON]: [ + Species.MANECTRIC, + Species.DRAPION, + Species.LIEPARD, + Species.AMOONGUSS, + Species.DIGGERSBY, + Species.TALONFLAME, + Species.PYROAR, + Species.PANGORO, + Species.MEOWSTIC, + Species.MALAMAR, + Species.CLAWITZER, + Species.HELIOLISK, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.HOUNDOOM, + Species.WEAVILE, + Species.CHANDELURE, + Species.AEGISLASH, + Species.BARBARACLE, + Species.DRAGALGE, + Species.GOODRA, + Species.TREVENANT, + Species.GOURGEIST, + ], + [TrainerPoolTier.RARE]: [Species.NOIVERN, Species.HISUI_GOODRA, Species.HISUI_AVALUGG], }; } case "aether": { return { - [TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU, Species.BLIPBUG, Species.GIRAFARIG, Species.ORANGURU ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.MEDITITE, Species.BELDUM, Species.HATENNA, Species.INKAY, Species.RALTS, Species.GALAR_MR_MIME ], - [TrainerPoolTier.RARE]: [ Species.ARMAROUGE, Species.HISUI_BRAVIARY, Species.PORYGON ] + [TrainerPoolTier.COMMON]: [ + Species.ALAKAZAM, + Species.SLOWBRO, + Species.EXEGGUTOR, + Species.XATU, + Species.CLAYDOL, + Species.BEHEEYEM, + Species.ORANGURU, + Species.BRUXISH, + Species.ORBEETLE, + Species.FARIGIRAF, + Species.ALOLA_RAICHU, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.KIRLIA, + Species.MEDICHAM, + Species.METAGROSS, + Species.MALAMAR, + Species.HATTERENE, + Species.MR_RIME, + Species.GALAR_SLOWKING, + ], + [TrainerPoolTier.RARE]: [Species.PORYGON_Z, Species.ARMAROUGE, Species.HISUI_BRAVIARY], }; } case "skull": { return { - [TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.FOMANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING, Species.STUNKY, Species.CROAGUNK, Species.NIDORAN_F ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.SKORUPI, Species.PALDEA_WOOPER, Species.VULLABY, Species.HISUI_QWILFISH, Species.GLIMMET ], - [TrainerPoolTier.RARE]: [ Species.SKRELP, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ + Species.NIDOQUEEN, + Species.GENGAR, + Species.KOFFING, + Species.CROBAT, + Species.ROSERADE, + Species.SKUNTANK, + Species.TOXICROAK, + Species.SCOLIPEDE, + Species.TOXAPEX, + Species.LURANTIS, + Species.ALOLA_MUK, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.DRAPION, + Species.MANDIBUZZ, + Species.OVERQWIL, + Species.GLIMMORA, + Species.CLODSIRE, + Species.GALAR_SLOWBRO, + ], + [TrainerPoolTier.RARE]: [Species.DRAGALGE, Species.SNEASLER], }; } case "macro": { return { - [TrainerPoolTier.COMMON]: [ Species.HATENNA, Species.FEEBAS, Species.BOUNSWEET, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS, Species.VULPIX, Species.FRILLISH, Species.ODDISH, Species.SINISTEA ], - [TrainerPoolTier.UNCOMMON]: [ Species.VULLABY, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.APPLIN ], - [TrainerPoolTier.RARE]: [ Species.TINKATINK, Species.HISUI_LILLIGANT ] + [TrainerPoolTier.COMMON]: [ + Species.NINETALES, + Species.BELLOSSOM, + Species.MILOTIC, + Species.FROSLASS, + Species.GOTHITELLE, + Species.JELLICENT, + Species.SALAZZLE, + Species.TSAREENA, + Species.POLTEAGEIST, + Species.HATTERENE, + Species.GALAR_RAPIDASH, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TOGEKISS, + Species.MANDIBUZZ, + Species.TOXAPEX, + Species.APPLETUN, + Species.CURSOLA, + Species.ALOLA_NINETALES, + ], + [TrainerPoolTier.RARE]: [Species.TINKATON, Species.HISUI_LILLIGANT], }; } case "star_1": { return { - [TrainerPoolTier.COMMON]: [ Species.MURKROW, Species.SEEDOT, Species.CACNEA, Species.STUNKY, Species.SANDILE, Species.NYMBLE, Species.MASCHIFF, Species.GALAR_ZIGZAGOON ], - [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.SNEASEL, Species.CORPHISH, Species.ZORUA, Species.INKAY, Species.BOMBIRDIER ], - [TrainerPoolTier.RARE]: [ Species.DEINO, Species.SPRIGATITO ] + [TrainerPoolTier.COMMON]: [ + Species.SHIFTRY, + Species.CACTURNE, + Species.HONCHKROW, + Species.SKUNTANK, + Species.KROOKODILE, + Species.OBSTAGOON, + Species.LOKIX, + Species.MABOSSTIFF, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.UMBREON, + Species.CRAWDAUNT, + Species.WEAVILE, + Species.ZOROARK, + Species.MALAMAR, + Species.BOMBIRDIER, + ], + [TrainerPoolTier.RARE]: [Species.HYDREIGON, Species.MEOWSCARADA], }; } case "star_2": { return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.HOUNDOUR, Species.NUMEL, Species.LITWICK, Species.FLETCHLING, Species.LITLEO, Species.ROLYCOLY, Species.CAPSAKID ], - [TrainerPoolTier.UNCOMMON]: [ Species.PONYTA, Species.FLAREON, Species.MAGBY, Species.TORKOAL, Species.SALANDIT, Species.TURTONATOR ], - [TrainerPoolTier.RARE]: [ Species.LARVESTA, Species.FUECOCO ] + [TrainerPoolTier.COMMON]: [ + Species.ARCANINE, + Species.HOUNDOOM, + Species.CAMERUPT, + Species.CHANDELURE, + Species.TALONFLAME, + Species.PYROAR, + Species.COALOSSAL, + Species.SCOVILLAIN, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.RAPIDASH, + Species.FLAREON, + Species.TORKOAL, + Species.MAGMORTAR, + Species.SALAZZLE, + Species.TURTONATOR, + ], + [TrainerPoolTier.RARE]: [Species.VOLCARONA, Species.SKELEDIRGE], }; } case "star_3": { return { - [TrainerPoolTier.COMMON]: [ Species.ZUBAT, Species.GRIMER, Species.STUNKY, Species.FOONGUS, Species.MAREANIE, Species.TOXEL, Species.SHROODLE, Species.PALDEA_WOOPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.GASTLY, Species.SEVIPER, Species.SKRELP, Species.ALOLA_GRIMER, Species.GALAR_SLOWPOKE, Species.HISUI_QWILFISH ], - [TrainerPoolTier.RARE]: [ Species.GLIMMET, Species.BULBASAUR ] + [TrainerPoolTier.COMMON]: [ + Species.MUK, + Species.CROBAT, + Species.SKUNTANK, + Species.AMOONGUSS, + Species.TOXAPEX, + Species.TOXTRICITY, + Species.GRAFAIAI, + Species.CLODSIRE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.GENGAR, + Species.SEVIPER, + Species.DRAGALGE, + Species.OVERQWIL, + Species.ALOLA_MUK, + Species.GALAR_SLOWBRO, + ], + [TrainerPoolTier.RARE]: [Species.GLIMMORA, Species.VENUSAUR], }; } case "star_4": { return { - [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.IGGLYBUFF, Species.AZURILL, Species.COTTONEE, Species.FLABEBE, Species.HATENNA, Species.IMPIDIMP, Species.TINKATINK ], - [TrainerPoolTier.UNCOMMON]: [ Species.TOGEPI, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_VULPIX ], - [TrainerPoolTier.RARE]: [ Species.GALAR_PONYTA, Species.POPPLIO ] + [TrainerPoolTier.COMMON]: [ + Species.CLEFABLE, + Species.WIGGLYTUFF, + Species.AZUMARILL, + Species.WHIMSICOTT, + Species.FLORGES, + Species.HATTERENE, + Species.GRIMMSNARL, + Species.TINKATON, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TOGEKISS, + Species.GARDEVOIR, + Species.SYLVEON, + Species.KLEFKI, + Species.MIMIKYU, + Species.ALOLA_NINETALES, + ], + [TrainerPoolTier.RARE]: [Species.GALAR_RAPIDASH, Species.PRIMARINA], }; } case "star_5": { return { - [TrainerPoolTier.COMMON]: [ Species.SHROOMISH, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.SCRAGGY, Species.MIENFOO, Species.PAWMI, Species.PALDEA_TAUROS ], - [TrainerPoolTier.UNCOMMON]: [ Species.RIOLU, Species.TIMBURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], - [TrainerPoolTier.RARE]: [ Species.JANGMO_O, Species.QUAXLY ] + [TrainerPoolTier.COMMON]: [ + Species.BRELOOM, + Species.HARIYAMA, + Species.MEDICHAM, + Species.TOXICROAK, + Species.SCRAFTY, + Species.MIENSHAO, + Species.PAWMOT, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.LUCARIO, + Species.CONKELDURR, + Species.HAWLUCHA, + Species.PASSIMIAN, + Species.FALINKS, + Species.FLAMIGO, + ], + [TrainerPoolTier.RARE]: [Species.KOMMO_O, Species.QUAQUAVAL], }; } } @@ -669,16 +1183,27 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for an evil team admin. - * @param title The title of the evil team admin. - * @param poolName The evil team the admin belongs to. - * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. - * @returns {TrainerConfig} The updated TrainerConfig instance. - * **/ - initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[],): TrainerConfig { + * Initializes the trainer configuration for an evil team admin. + * @param title The title of the evil team admin. + * @param poolName The evil team the admin belongs to. + * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. + * @param specialtyType The specialty Type of the admin, if they have one + * @returns {TrainerConfig} The updated TrainerConfig instance. + * **/ + initForEvilTeamAdmin( + title: string, + poolName: string, + signatureSpecies: (Species | Species[])[], + specialtyType?: PokemonType, + ): TrainerConfig { if (!getIsInitialized()) { initI18n(); } + + if (!Utils.isNullOrUndefined(specialtyType)) { + this.setSpecialtyType(specialtyType); + } + this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); // Set the species pools for the evil team admin. @@ -686,7 +1211,7 @@ export class TrainerConfig { signatureSpecies.forEach((speciesPool, s) => { if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; + speciesPool = [speciesPool]; } this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); @@ -706,28 +1231,16 @@ export class TrainerConfig { /** * Initializes the trainer configuration for a Stat Trainer, as part of the Trainer's Test Mystery Encounter. - * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. - * @param {Type[]} specialtyTypes The specialty types for the Stat Trainer. - * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). + * @param _isMale Whether the stat trainer is Male or Female (for localization of the title). * @returns {TrainerConfig} The updated TrainerConfig instance. **/ - initForStatTrainer(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + initForStatTrainer(_isMale = false): TrainerConfig { if (!getIsInitialized()) { initI18n(); } this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR); - signatureSpecies.forEach((speciesPool, s) => { - if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; - } - this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); - }); - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); - } const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); this.setMoneyMultiplier(2); @@ -742,13 +1255,18 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. - * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. - * @param {Type[]} specialtyTypes The specialty types for the evil team Leader. - * @param boolean Whether or not this is the rematch fight - * @returns {TrainerConfig} The updated TrainerConfig instance. - * **/ - initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, ...specialtyTypes: Type[]): TrainerConfig { + * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. + * @param {Species | Species[]} signatureSpecies The signature species for the evil team leader. + * @param {PokemonType} specialtyType The specialty type for the evil team Leader. + * @param boolean Whether or not this is the rematch fight + * @returns {TrainerConfig} The updated TrainerConfig instance. + * **/ + initForEvilTeamLeader( + title: string, + signatureSpecies: (Species | Species[])[], + rematch = false, + specialtyType?: PokemonType, + ): TrainerConfig { if (!getIsInitialized()) { initI18n(); } @@ -759,13 +1277,13 @@ export class TrainerConfig { } signatureSpecies.forEach((speciesPool, s) => { if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; + speciesPool = [speciesPool]; } this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); + if (!Utils.isNullOrUndefined(specialtyType)) { + this.setSpeciesFilter(p => p.isOfType(specialtyType)); + this.setSpecialtyType(specialtyType); } const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); @@ -781,13 +1299,21 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for a Gym Leader. - * @param {Species | Species[]} signatureSpecies The signature species for the Gym Leader. - * @param {Type[]} specialtyTypes The specialty types for the Gym Leader. - * @param isMale Whether the Gym Leader is Male or Not (for localization of the title). - * @returns {TrainerConfig} The updated TrainerConfig instance. - * **/ - initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + * Initializes the trainer configuration for a Gym Leader. + * @param {Species | Species[]} signatureSpecies The signature species for the Gym Leader. Added to party in reverse order. + * @param isMale Whether the Gym Leader is Male or Not (for localization of the title). + * @param {PokemonType} specialtyType The specialty type for the Gym Leader. + * @param ignoreMinTeraWave Whether the Gym Leader always uses Tera (true), or only Teras after {@linkcode GYM_LEADER_TERA_WAVE} (false). Defaults to false. + * @param teraSlot Optional, sets the party member in this slot to Terastallize. Wraps based on party size. + * @returns {TrainerConfig} The updated TrainerConfig instance. + * **/ + initForGymLeader( + signatureSpecies: (Species | Species[])[], + isMale: boolean, + specialtyType: PokemonType, + ignoreMinTeraWave = false, + teraSlot?: number, + ): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -800,17 +1326,15 @@ export class TrainerConfig { signatureSpecies.forEach((speciesPool, s) => { // Ensure speciesPool is an array. if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; + speciesPool = [speciesPool]; } // Set a function to get a random party member from the species pool. this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); - // If specialty types are provided, set species filter and specialty types. - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); - } + // If specialty type is provided, set species filter and specialty type. + this.setSpeciesFilter(p => p.isOfType(specialtyType)); + this.setSpecialtyType(specialtyType); // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); @@ -829,22 +1353,28 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_gym"); this.setVictoryBgm("victory_gym"); - this.setGenModifiersFunc(party => { - const waveIndex = party[0].scene.currentBattle.waveIndex; - return getRandomTeraModifiers(party, waveIndex >= 100 ? 1 : 0, specialtyTypes.length ? specialtyTypes : undefined); - }); + this.setRandomTeraModifiers( + () => (ignoreMinTeraWave || globalScene.currentBattle.waveIndex >= GYM_LEADER_TERA_WAVE ? 1 : 0), + teraSlot, + ); return this; } /** - * Initializes the trainer configuration for an Elite Four member. - * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. - * @param {Type[]} specialtyTypes The specialty types for the Elite Four member. - * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). - * @returns {TrainerConfig} The updated TrainerConfig instance. - **/ - initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + * Initializes the trainer configuration for an Elite Four member. + * @param {Species | Species[]} signatureSpecies The signature species for the Elite Four member. + * @param isMale Whether the Elite Four Member is Male or Female (for localization of the title). + * @param specialtyType {PokemonType} The specialty type for the Elite Four member. + * @param teraSlot Optional, sets the party member in this slot to Terastallize. + * @returns {TrainerConfig} The updated TrainerConfig instance. + **/ + initForEliteFour( + signatureSpecies: (Species | Species[])[], + isMale: boolean, + specialtyType?: PokemonType, + teraSlot?: number, + ): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -857,16 +1387,16 @@ export class TrainerConfig { signatureSpecies.forEach((speciesPool, s) => { // Ensure speciesPool is an array. if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; + speciesPool = [speciesPool]; } // Set a function to get a random party member from the species pool. this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); }); - // Set species filter and specialty types if provided, otherwise filter by base total. - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.some(t => p.isOfType(t)) && p.baseTotal >= ELITE_FOUR_MINIMUM_BST); - this.setSpecialtyTypes(...specialtyTypes); + // Set species filter and specialty type if provided, otherwise filter by base total. + if (!Utils.isNullOrUndefined(specialtyType)) { + this.setSpeciesFilter(p => p.isOfType(specialtyType) && p.baseTotal >= ELITE_FOUR_MINIMUM_BST); + this.setSpecialtyType(specialtyType); } else { this.setSpeciesFilter(p => p.baseTotal >= ELITE_FOUR_MINIMUM_BST); } @@ -888,18 +1418,18 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_unova_elite"); this.setVictoryBgm("victory_gym"); - this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 2, specialtyTypes.length ? specialtyTypes : undefined)); + this.setRandomTeraModifiers(() => 1, teraSlot); return this; } /** - * Initializes the trainer configuration for a Champion. - * @param {Species | Species[]} signatureSpecies The signature species for the Champion. - * @param isMale Whether the Champion is Male or Female (for localization of the title). - * @returns {TrainerConfig} The updated TrainerConfig instance. - **/ - initForChampion(signatureSpecies: (Species | Species[])[], isMale: boolean): TrainerConfig { + * Initializes the trainer configuration for a Champion. + * @param {Species | Species[]} signatureSpecies The signature species for the Champion. + * @param isMale Whether the Champion is Male or Female (for localization of the title). + * @returns {TrainerConfig} The updated TrainerConfig instance. + **/ + initForChampion(isMale: boolean): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { initI18n(); @@ -908,18 +1438,6 @@ export class TrainerConfig { // Set the party templates for the Champion. this.setPartyTemplates(trainerPartyTemplates.CHAMPION); - // Set up party members with their corresponding species. - signatureSpecies.forEach((speciesPool, s) => { - // Ensure speciesPool is an array. - if (!Array.isArray(speciesPool)) { - speciesPool = [ speciesPool ]; - } - // Set a function to get a random party member from the species pool. - this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); - }); - - this.setSpeciesFilter(p => p.baseTotal >= CHAMPION_MINIMUM_BST); - // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); @@ -930,7 +1448,6 @@ export class TrainerConfig { this.setTitle("champion_female"); } - // Configure various properties for the Champion. this.setMoneyMultiplier(10); this.setBoss(); @@ -938,7 +1455,6 @@ export class TrainerConfig { this.setHasVoucher(true); this.setBattleBgm("battle_champion_alder"); this.setVictoryBgm("victory_champion"); - this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 3)); return this; } @@ -958,11 +1474,11 @@ export class TrainerConfig { } /** - * Retrieves the title for the trainer based on the provided trainer slot and variant. - * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE. - * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title. - * @returns {string} - The title of the trainer. - **/ + * Retrieves the title for the trainer based on the provided trainer slot and variant. + * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE. + * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title. + * @returns {string} - The title of the trainer. + **/ getTitle(trainerSlot: TrainerSlot = TrainerSlot.NONE, variant: TrainerVariant): string { const ret = this.name; @@ -976,82 +1492,89 @@ export class TrainerConfig { // If the name is already set if (this.nameFemale) { // Check if the variant is either female or this is for the partner in a double battle - if (variant === TrainerVariant.FEMALE || (variant === TrainerVariant.DOUBLE && trainerSlot === TrainerSlot.TRAINER_PARTNER)) { + if ( + variant === TrainerVariant.FEMALE || + (variant === TrainerVariant.DOUBLE && trainerSlot === TrainerSlot.TRAINER_PARTNER) + ) { return this.nameFemale; } - } else + } // Check if !variant is true, if so return the name, else return the name with _female appended - if (variant) { - if (!getIsInitialized()) { - initI18n(); - } - // Check if the female version exists in the i18n file - if (i18next.exists(`trainerClasses:${this.name.toLowerCase()}`)) { - // If it does, return - return ret + "_female"; - } else { - // If it doesn't, we do not do anything and go to the normal return - // This is to prevent the game from displaying an error if a female version of the trainer does not exist in the localization - } + else if (variant) { + if (!getIsInitialized()) { + initI18n(); } + // Check if the female version exists in the i18n file + if (i18next.exists(`trainerClasses:${this.name.toLowerCase()}`)) { + // If it does, return + return ret + "_female"; + } + } } return ret; } - loadAssets(scene: BattleScene, variant: TrainerVariant): Promise { + loadAssets(variant: TrainerVariant): Promise { return new Promise(resolve => { const isDouble = variant === TrainerVariant.DOUBLE; const trainerKey = this.getSpriteKey(variant === TrainerVariant.FEMALE, false); const partnerTrainerKey = this.getSpriteKey(true, true); - scene.loadAtlas(trainerKey, "trainer"); + globalScene.loadAtlas(trainerKey, "trainer"); if (isDouble) { - scene.loadAtlas(partnerTrainerKey, "trainer"); + globalScene.loadAtlas(partnerTrainerKey, "trainer"); } - scene.load.once(Phaser.Loader.Events.COMPLETE, () => { + globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => { const originalWarn = console.warn; // Ignore warnings for missing frames, because there will be a lot - console.warn = () => { - }; - const frameNames = scene.anims.generateFrameNames(trainerKey, { + console.warn = () => {}; + const frameNames = globalScene.anims.generateFrameNames(trainerKey, { zeroPad: 4, suffix: ".png", start: 1, - end: 128 + end: 128, }); const partnerFrameNames = isDouble - ? scene.anims.generateFrameNames(partnerTrainerKey, { - zeroPad: 4, - suffix: ".png", - start: 1, - end: 128 - }) + ? globalScene.anims.generateFrameNames(partnerTrainerKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: 128, + }) : ""; console.warn = originalWarn; - if (!(scene.anims.exists(trainerKey))) { - scene.anims.create({ + if (!globalScene.anims.exists(trainerKey)) { + globalScene.anims.create({ key: trainerKey, frames: frameNames, frameRate: 24, - repeat: -1 + repeat: -1, }); } - if (isDouble && !(scene.anims.exists(partnerTrainerKey))) { - scene.anims.create({ + if (isDouble && !globalScene.anims.exists(partnerTrainerKey)) { + globalScene.anims.create({ key: partnerTrainerKey, frames: partnerFrameNames, frameRate: 24, - repeat: -1 + repeat: -1, }); } resolve(); }); - if (!scene.load.isLoading()) { - scene.load.start(); + if (!globalScene.load.isLoading()) { + globalScene.load.start(); } }); } + /** + * Helper function to check if a specialty type is set + * @returns true if specialtyType is defined and not Type.UNKNOWN + */ + hasSpecialtyType(): boolean { + return !Utils.isNullOrUndefined(this.specialtyType) && this.specialtyType !== PokemonType.UNKNOWN; + } + /** * Creates a shallow copy of a trainer config so that it can be modified without affecting the {@link trainerConfigs} source map */ @@ -1086,16 +1609,14 @@ export class TrainerConfig { clone = this.partyTemplateFunc ? clone.setPartyTemplateFunc(this.partyTemplateFunc) : clone; if (this.partyMemberFuncs) { - Object.keys(this.partyMemberFuncs).forEach((index) => { - clone = clone.setPartyMemberFunc(parseInt(index, 10), this.partyMemberFuncs[index]); + Object.keys(this.partyMemberFuncs).forEach(index => { + clone = clone.setPartyMemberFunc(Number.parseInt(index, 10), this.partyMemberFuncs[index]); }); } clone = this.speciesPools ? clone.setSpeciesPools(this.speciesPools) : clone; clone = this.speciesFilter ? clone.setSpeciesFilter(this.speciesFilter) : clone; - if (this.specialtyTypes) { - clone.specialtyTypes = this.specialtyTypes.slice(0); - } + clone.specialtyType = this.specialtyType; clone.encounterMessages = this.encounterMessages?.slice(0); clone.victoryMessages = this.victoryMessages?.slice(0); @@ -1116,1390 +1637,4199 @@ export class TrainerConfig { let t = 0; interface TrainerConfigs { - [key: integer]: TrainerConfig + [key: number]: TrainerConfig; } /** * The function to get variable strength grunts - * @param scene the singleton scene being passed in * @returns the correct TrainerPartyTemplate */ -function getEvilGruntPartyTemplate(scene: BattleScene): TrainerPartyTemplate { - const waveIndex = scene.currentBattle?.waveIndex; +function getEvilGruntPartyTemplate(): TrainerPartyTemplate { + const waveIndex = globalScene.currentBattle?.waveIndex; if (waveIndex < 40) { return trainerPartyTemplates.TWO_AVG; - } else if (waveIndex < 63) { - return trainerPartyTemplates.THREE_AVG; - } else if (waveIndex < 65) { - return trainerPartyTemplates.TWO_AVG_ONE_STRONG; - } else if (waveIndex < 112) { - return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger - } else { - return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger } + if (waveIndex < 63) { + return trainerPartyTemplates.THREE_AVG; + } + if (waveIndex < 65) { + return trainerPartyTemplates.TWO_AVG_ONE_STRONG; + } + if (waveIndex < 112) { + return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger + } + return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger } -function getWavePartyTemplate(scene: BattleScene, ...templates: TrainerPartyTemplate[]) { - return templates[Math.min(Math.max(Math.ceil((scene.gameMode.getWaveForDifficulty(scene.currentBattle?.waveIndex || startingWave, true) - 20) / 30), 0), templates.length - 1)]; +function getWavePartyTemplate(...templates: TrainerPartyTemplate[]) { + return templates[ + Math.min( + Math.max( + Math.ceil( + (globalScene.gameMode.getWaveForDifficulty(globalScene.currentBattle?.waveIndex || startingWave, true) - 20) / + 30, + ), + 0, + ), + templates.length - 1, + ) + ]; } -function getGymLeaderPartyTemplate(scene: BattleScene) { - return getWavePartyTemplate(scene, trainerPartyTemplates.GYM_LEADER_1, trainerPartyTemplates.GYM_LEADER_2, trainerPartyTemplates.GYM_LEADER_3, trainerPartyTemplates.GYM_LEADER_4, trainerPartyTemplates.GYM_LEADER_5); +function getGymLeaderPartyTemplate() { + return getWavePartyTemplate( + trainerPartyTemplates.GYM_LEADER_1, + trainerPartyTemplates.GYM_LEADER_2, + trainerPartyTemplates.GYM_LEADER_3, + trainerPartyTemplates.GYM_LEADER_4, + trainerPartyTemplates.GYM_LEADER_5, + ); } /** * Randomly selects one of the `Species` from `speciesPool`, determines its evolution, level, and strength. - * Then adds Pokemon to scene. + * Then adds Pokemon to globalScene. * @param speciesPool * @param trainerSlot * @param ignoreEvolution * @param postProcess */ -export function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void) { - return (scene: BattleScene, level: number, strength: PartyMemberStrength) => { +export function getRandomPartyMemberFunc( + speciesPool: Species[], + trainerSlot: TrainerSlot = TrainerSlot.TRAINER, + ignoreEvolution = false, + postProcess?: (enemyPokemon: EnemyPokemon) => void, +) { + return (level: number, strength: PartyMemberStrength) => { let species = Utils.randSeedItem(speciesPool); if (!ignoreEvolution) { - species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex); + species = getPokemonSpecies(species).getTrainerSpeciesForLevel( + level, + true, + strength, + globalScene.currentBattle.waveIndex, + ); } - return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess); + return globalScene.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 (level: number, strength: PartyMemberStrength) => { + const waveIndex = globalScene.currentBattle.waveIndex; + const species = getPokemonSpecies( + globalScene + .randomSpecies(waveIndex, level, false, speciesFilter) + .getTrainerSpeciesForLevel(level, true, strength, waveIndex), + ); + + return globalScene.addEnemyPokemon(species, level, trainerSlot, undefined, false, undefined, postProcess); }; } -function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: Type[]): PersistentModifier[] { - const ret: PersistentModifier[] = []; - const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); - for (let t = 0; t < Math.min(count, party.length); t++) { - const randomIndex = Utils.randSeedItem(partyMemberIndexes); - partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); - ret.push(modifierTypes.TERA_SHARD().generateType([], [ Utils.randSeedItem(types ? types : party[randomIndex].getTypes()) ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct? - } - return ret; -} - -type SignatureSpecies = { - [key in string]: (Species | Species[])[]; -}; - -/* - * The signature species for each Gym Leader, Elite Four member, and Champion. - * The key is the trainer type, and the value is an array of Species or Species arrays. - * This is in a separate const so it can be accessed from other places and not just the trainerConfigs - */ -export const signatureSpecies: SignatureSpecies = { - BROCK: [ Species.GEODUDE, Species.ONIX ], - MISTY: [ Species.STARYU, Species.PSYDUCK ], - LT_SURGE: [ Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ ], - ERIKA: [ Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP ], - JANINE: [ Species.VENONAT, Species.SPINARAK, Species.ZUBAT ], - SABRINA: [ Species.ABRA, Species.MR_MIME, Species.ESPEON ], - BLAINE: [ Species.GROWLITHE, Species.PONYTA, Species.MAGMAR ], - GIOVANNI: [ Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F ], - FALKNER: [ Species.PIDGEY, Species.HOOTHOOT, Species.DODUO ], - BUGSY: [ Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR ], - WHITNEY: [ Species.GIRAFARIG, Species.MILTANK ], - MORTY: [ Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE ], - CHUCK: [ Species.POLIWRATH, Species.MANKEY ], - JASMINE: [ Species.MAGNEMITE, Species.STEELIX ], - PRYCE: [ Species.SEEL, Species.SWINUB ], - CLAIR: [ Species.DRATINI, Species.HORSEA, Species.GYARADOS ], - ROXANNE: [ Species.GEODUDE, Species.NOSEPASS ], - BRAWLY: [ Species.MACHOP, Species.MAKUHITA ], - WATTSON: [ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ], - FLANNERY: [ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ], - NORMAN: [ Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN ], - WINONA: [ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ], - TATE: [ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ], - LIZA: [ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ], - JUAN: [ Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH ], - ROARK: [ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ], - GARDENIA: [ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ], - MAYLENE: [ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ], - CRASHER_WAKE: [ Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP ], - FANTINA: [ Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB ], - BYRON: [ Species.SHIELDON, Species.BRONZOR, Species.AGGRON ], - CANDICE: [ Species.SNEASEL, Species.SNOVER, Species.SNORUNT ], - VOLKNER: [ Species.SHINX, Species.CHINCHOU, Species.ROTOM ], - CILAN: [ Species.PANSAGE, Species.COTTONEE, Species.PETILIL ], - CHILI: [ Species.PANSEAR, Species.DARUMAKA, Species.HEATMOR ], - CRESS: [ Species.PANPOUR, Species.BASCULIN, Species.TYMPOLE ], - CHEREN: [ Species.LILLIPUP, Species.MINCCINO, Species.PATRAT ], - LENORA: [ Species.KANGASKHAN, Species.DEERLING, Species.AUDINO ], - ROXIE: [ Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI ], - BURGH: [ Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST ], - ELESA: [ Species.EMOLGA, Species.BLITZLE, Species.JOLTIK ], - CLAY: [ Species.DRILBUR, Species.SANDILE, Species.GOLETT ], - SKYLA: [ Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET ], - BRYCEN: [ Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO ], - DRAYDEN: [ Species.DRUDDIGON, Species.AXEW, Species.DEINO ], - MARLON: [ Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA ], - VIOLA: [ Species.SURSKIT, Species.SCATTERBUG ], - GRANT: [ Species.AMAURA, Species.TYRUNT ], - KORRINA: [ Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO ], - RAMOS: [ Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT ], - CLEMONT: [ Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA ], - VALERIE: [ Species.SYLVEON, Species.MAWILE, Species.MR_MIME ], - OLYMPIA: [ Species.ESPURR, Species.SIGILYPH, Species.SLOWKING ], - WULFRIC: [ Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL ], - MILO: [ Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET ], - NESSA: [ Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD ], - KABU: [ Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL ], - BEA: [ Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS ], - ALLISTER: [ Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY ], - OPAL: [ Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING ], - BEDE: [ Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR ], - GORDIE: [ Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE ], - MELONY: [ Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME ], - PIERS: [ Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY ], - MARNIE: [ Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO ], - RAIHAN: [ Species.DURALUDON, Species.TURTONATOR, Species.GOOMY ], - KATY: [ Species.NYMBLE, Species.TAROUNTULA, Species.HERACROSS ], - BRASSIUS: [ Species.SMOLIV, Species.SHROOMISH, Species.ODDISH ], - IONO: [ Species.TADBULB, Species.WATTREL, Species.VOLTORB ], - KOFU: [ Species.VELUZA, Species.WIGLETT, Species.WINGULL ], - LARRY: [ Species.STARLY, Species.DUNSPARCE, Species.KOMALA ], - RYME: [ Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ], - TULIP: [ Species.GIRAFARIG, Species.FLITTLE, Species.RALTS ], - GRUSHA: [ Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO ], - LORELEI: [ Species.JYNX, [ Species.SLOWBRO, Species.GALAR_SLOWBRO ], Species.LAPRAS, [ Species.ALOLA_SANDSLASH, Species.CLOYSTER ]], - BRUNO: [ Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [ Species.ALOLA_GOLEM, Species.GOLEM ]], - AGATHA: [ Species.GENGAR, [ Species.ARBOK, Species.WEEZING ], Species.CROBAT, Species.ALOLA_MAROWAK ], - LANCE: [ Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR ], - WILL: [ Species.XATU, Species.JYNX, [ Species.SLOWBRO, Species.SLOWKING ], Species.EXEGGUTOR ], - KOGA: [[ Species.WEEZING, Species.MUK ], [ Species.VENOMOTH, Species.ARIADOS ], Species.CROBAT, Species.TENTACRUEL ], - KAREN: [ Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE ], - SIDNEY: [[ Species.SHIFTRY, Species.CACTURNE ], [ Species.SHARPEDO, Species.CRAWDAUNT ], Species.ABSOL, Species.MIGHTYENA ], - PHOEBE: [ Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [ Species.MISMAGIUS, Species.DRIFBLIM ]], - GLACIA: [ Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW ], - DRAKE: [ Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA ], - AARON: [[ Species.SCIZOR, Species.KLEAVOR ], Species.HERACROSS, [ Species.VESPIQUEN, Species.YANMEGA ], Species.DRAPION ], - BERTHA: [ Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR ], - FLINT: [[ Species.FLAREON, Species.RAPIDASH ], Species.MAGMORTAR, [ Species.STEELIX, Species.LOPUNNY ], Species.INFERNAPE ], - LUCIAN: [ Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [ Species.ALAKAZAM, Species.ESPEON ]], - SHAUNTAL: [ Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT ], - MARSHAL: [ Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK ], - GRIMSLEY: [ Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE ], - CAITLIN: [ Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS ], - MALVA: [ Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME ], - SIEBOLD: [ Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE ], - WIKSTROM: [ Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH ], - DRASNA: [ Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN ], - HALA: [ Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, [ Species.POLIWRATH, Species.ANNIHILAPE ]], - MOLAYNE: [ Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO ], - OLIVIA: [ Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC ], - ACEROLA: [[ Species.BANETTE, Species.DRIFBLIM ], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND ], - KAHILI: [[ Species.BRAVIARY, Species.MANDIBUZZ ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON ], - MARNIE_ELITE: [ Species.MORPEKO, Species.LIEPARD, [ Species.TOXICROAK, Species.SCRAFTY ], Species.GRIMMSNARL ], - NESSA_ELITE: [ Species.GOLISOPOD, [ Species.PELIPPER, Species.QUAGSIRE ], Species.TOXAPEX, Species.DREDNAW ], - BEA_ELITE: [ Species.HAWLUCHA, [ Species.GRAPPLOCT, Species.SIRFETCHD ], Species.FALINKS, Species.MACHAMP ], - ALLISTER_ELITE: [ Species.DUSKNOIR, [ Species.POLTEAGEIST, Species.RUNERIGUS ], Species.CURSOLA, Species.GENGAR ], - RAIHAN_ELITE: [ Species.GOODRA, [ Species.TORKOAL, Species.TURTONATOR ], Species.FLYGON, Species.ARCHALUDON ], - RIKA: [ Species.WHISCASH, [ Species.DONPHAN, Species.DUGTRIO ], Species.CAMERUPT, Species.CLODSIRE ], - POPPY: [ Species.COPPERAJAH, Species.BRONZONG, Species.CORVIKNIGHT, Species.TINKATON ], - LARRY_ELITE: [ Species.STARAPTOR, Species.FLAMIGO, Species.ALTARIA, Species.TROPIUS ], - HASSEL: [ Species.NOIVERN, [ Species.FLAPPLE, Species.APPLETUN ], Species.DRAGALGE, Species.BAXCALIBUR ], - CRISPIN: [ Species.TALONFLAME, Species.CAMERUPT, Species.MAGMORTAR, Species.BLAZIKEN ], - AMARYS: [ Species.SKARMORY, Species.EMPOLEON, Species.SCIZOR, Species.METAGROSS ], - LACEY: [ Species.EXCADRILL, Species.PRIMARINA, [ Species.ALCREMIE, Species.GRANBULL ], Species.WHIMSICOTT ], - DRAYTON: [ Species.DRAGONITE, Species.ARCHALUDON, Species.HAXORUS, Species.SCEPTILE ], - BLUE: [[ Species.GYARADOS, Species.EXEGGUTOR, Species.ARCANINE ], Species.HO_OH, [ Species.RHYPERIOR, Species.MAGNEZONE ]], // Alakazam lead, Mega Pidgeot - RED: [ Species.LUGIA, Species.SNORLAX, [ Species.ESPEON, Species.UMBREON, Species.SYLVEON ]], // GMax Pikachu lead, Mega gen 1 starter - LANCE_CHAMPION: [ Species.DRAGONITE, Species.KINGDRA, Species.ALOLA_EXEGGUTOR ], // Aerodactyl lead, Mega Latias/Latios - STEVEN: [ Species.AGGRON, [ Species.ARMALDO, Species.CRADILY ], Species.DIALGA ], // Skarmory lead, Mega Metagross - WALLACE: [ Species.MILOTIC, Species.PALKIA, Species.LUDICOLO ], // Pelipper lead, Mega Swampert - CYNTHIA: [ Species.GIRATINA, Species.LUCARIO, Species.TOGEKISS ], // Spiritomb lead, Mega Garchomp - ALDER: [ Species.VOLCARONA, Species.ZEKROM, [ Species.ACCELGOR, Species.ESCAVALIER ], Species.KELDEO ], // Bouffalant/Braviary lead - IRIS: [ Species.HAXORUS, Species.RESHIRAM, Species.ARCHEOPS ], // Druddigon lead, Gmax Lapras - DIANTHA: [ Species.HAWLUCHA, Species.XERNEAS, Species.GOODRA ], // Gourgeist lead, Mega Gardevoir - HAU: [[ Species.SOLGALEO, Species.LUNALA ], Species.NOIVERN, [ Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA ], [ Species.TAPU_BULU, Species.TAPU_FINI, Species.TAPU_KOKO, Species.TAPU_LELE ]], // Alola Raichu lead - LEON: [ Species.DRAGAPULT, Species.ZACIAN, Species.AEGISLASH ], // Rillaboom/Cinderace/Inteleon lead, GMax Charizard - GEETA: [ Species.MIRAIDON, [ Species.ESPATHRA, Species.VELUZA ], [ Species.AVALUGG, Species.HISUI_AVALUGG ], Species.KINGAMBIT ], // Glimmora lead - NEMONA: [ Species.KORAIDON, Species.PAWMOT, [ Species.DUDUNSPARCE, Species.ORTHWORM ], [ Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ]], // Lycanroc lead - KIERAN: [[ Species.GRIMMSNARL, Species.INCINEROAR, Species.PORYGON_Z ], Species.OGERPON, Species.TERAPAGOS, Species.HYDRAPPLE ], // Poliwrath/Politoed lead -}; - export const trainerConfigs: TrainerConfigs = { [TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(), - [TrainerType.ACE_TRAINER]: new TrainerConfig(++t).setHasGenders("Ace Trainer Female").setHasDouble("Ace Duo").setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) - .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.THREE_WEAK_BALANCED, trainerPartyTemplates.FOUR_WEAK_BALANCED, trainerPartyTemplates.FIVE_WEAK_BALANCED, trainerPartyTemplates.SIX_WEAK_BALANCED)), - [TrainerType.ARTIST]: new TrainerConfig(++t).setEncounterBgm(TrainerType.RICH).setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG) - .setSpeciesPools([ Species.SMEARGLE ]), - [TrainerType.BACKERS]: new TrainerConfig(++t).setHasGenders("Backers").setDoubleOnly().setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble("Backpackers").setSpeciesFilter(s => s.isOfType(Type.FLYING) || s.isOfType(Type.ROCK)).setEncounterBgm(TrainerType.BACKPACKER) - .setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.ONE_WEAK_ONE_STRONG, trainerPartyTemplates.ONE_AVG_ONE_STRONG) + [TrainerType.ACE_TRAINER]: new TrainerConfig(++t) + .setHasGenders("Ace Trainer Female") + .setHasDouble("Ace Duo") + .setMoneyMultiplier(2.25) + .setEncounterBgm(TrainerType.ACE_TRAINER) + .setPartyTemplateFunc(() => + getWavePartyTemplate( + trainerPartyTemplates.THREE_WEAK_BALANCED, + trainerPartyTemplates.FOUR_WEAK_BALANCED, + trainerPartyTemplates.FIVE_WEAK_BALANCED, + trainerPartyTemplates.SIX_WEAK_BALANCED, + ), + ), + [TrainerType.ARTIST]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.RICH) + .setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG) + .setSpeciesPools([Species.SMEARGLE]), + [TrainerType.BACKERS]: new TrainerConfig(++t) + .setHasGenders("Backers") + .setDoubleOnly() + .setEncounterBgm(TrainerType.CYCLIST), + [TrainerType.BACKPACKER]: new TrainerConfig(++t) + .setHasGenders("Backpacker Female") + .setHasDouble("Backpackers") + .setSpeciesFilter(s => s.isOfType(PokemonType.FLYING) || s.isOfType(PokemonType.ROCK)) + .setEncounterBgm(TrainerType.BACKPACKER) + .setPartyTemplates( + trainerPartyTemplates.ONE_STRONG, + trainerPartyTemplates.ONE_WEAK_ONE_STRONG, + trainerPartyTemplates.ONE_AVG_ONE_STRONG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO ], - [TrainerPoolTier.UNCOMMON]: [ Species.GIRAFARIG, Species.ZANGOOSE, Species.SEVIPER, Species.CUBCHOO, Species.PANCHAM, Species.SKIDDO, Species.MUDBRAY ], - [TrainerPoolTier.RARE]: [ Species.TAUROS, Species.STANTLER, Species.DARUMAKA, Species.BOUFFALANT, Species.DEERLING, Species.IMPIDIMP ], - [TrainerPoolTier.SUPER_RARE]: [ Species.GALAR_DARUMAKA, Species.TEDDIURSA ] + [TrainerPoolTier.COMMON]: [ + Species.RHYHORN, + Species.AIPOM, + Species.MAKUHITA, + Species.MAWILE, + Species.NUMEL, + Species.LILLIPUP, + Species.SANDILE, + Species.WOOLOO, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.GIRAFARIG, + Species.ZANGOOSE, + Species.SEVIPER, + Species.CUBCHOO, + Species.PANCHAM, + Species.SKIDDO, + Species.MUDBRAY, + ], + [TrainerPoolTier.RARE]: [ + Species.TAUROS, + Species.STANTLER, + Species.DARUMAKA, + Species.BOUFFALANT, + Species.DEERLING, + Species.IMPIDIMP, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.GALAR_DARUMAKA, Species.TEDDIURSA], }), - [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(Type.GRASS) || s.isOfType(Type.FIRE)), + [TrainerType.BAKER]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.CLERK) + .setMoneyMultiplier(1.35) + .setSpeciesFilter(s => s.isOfType(PokemonType.GRASS) || s.isOfType(PokemonType.FIRE)), [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY), - [TrainerType.BIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON)), - [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.FIGHTING) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG) + [TrainerType.BIKER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpeciesFilter(s => s.isOfType(PokemonType.POISON)), + [TrainerType.BLACK_BELT]: new TrainerConfig(++t) + .setHasGenders("Battle Girl", TrainerType.PSYCHIC) + .setHasDouble("Crush Kin") + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpecialtyType(PokemonType.FIGHTING) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_ONE_STRONG, + trainerPartyTemplates.THREE_AVG, + trainerPartyTemplates.TWO_AVG_ONE_STRONG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR ], - [TrainerPoolTier.UNCOMMON]: [ Species.MANKEY, Species.POLIWRATH, Species.TYROGUE, Species.BRELOOM, Species.SCRAGGY, Species.MIENFOO, Species.PANCHAM, Species.STUFFUL, Species.CRABRAWLER ], - [TrainerPoolTier.RARE]: [ Species.HERACROSS, Species.RIOLU, Species.THROH, Species.SAWK, Species.PASSIMIAN, Species.CLOBBOPUS ], - [TrainerPoolTier.SUPER_RARE]: [ Species.HITMONTOP, Species.INFERNAPE, Species.GALLADE, Species.HAWLUCHA, Species.HAKAMO_O ], - [TrainerPoolTier.ULTRA_RARE]: [ Species.KUBFU ] + [TrainerPoolTier.COMMON]: [ + Species.NIDORAN_F, + Species.NIDORAN_M, + Species.MACHOP, + Species.MAKUHITA, + Species.MEDITITE, + Species.CROAGUNK, + Species.TIMBURR, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.MANKEY, + Species.POLIWRATH, + Species.TYROGUE, + Species.BRELOOM, + Species.SCRAGGY, + Species.MIENFOO, + Species.PANCHAM, + Species.STUFFUL, + Species.CRABRAWLER, + ], + [TrainerPoolTier.RARE]: [ + Species.HERACROSS, + Species.RIOLU, + Species.THROH, + Species.SAWK, + Species.PASSIMIAN, + Species.CLOBBOPUS, + ], + [TrainerPoolTier.SUPER_RARE]: [ + Species.HITMONTOP, + Species.INFERNAPE, + Species.GALLADE, + Species.HAWLUCHA, + Species.HAKAMO_O, + ], + [TrainerPoolTier.ULTRA_RARE]: [Species.KUBFU], }), - [TrainerType.BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(1.325).setEncounterBgm(TrainerType.POKEFAN).setHasGenders("Breeder Female").setHasDouble("Breeders") - .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.FIVE_WEAKER, trainerPartyTemplates.SIX_WEAKER)) + [TrainerType.BREEDER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.325) + .setEncounterBgm(TrainerType.POKEFAN) + .setHasGenders("Breeder Female") + .setHasDouble("Breeders") + .setPartyTemplateFunc(() => + getWavePartyTemplate( + trainerPartyTemplates.FOUR_WEAKER, + trainerPartyTemplates.FIVE_WEAKER, + trainerPartyTemplates.SIX_WEAKER, + ), + ) .setSpeciesFilter(s => s.baseTotal < 450), - [TrainerType.CLERK]: new TrainerConfig(++t).setHasGenders("Clerk Female").setHasDouble("Colleagues").setEncounterBgm(TrainerType.CLERK) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG) + [TrainerType.CLERK]: new TrainerConfig(++t) + .setHasGenders("Clerk Female") + .setHasDouble("Colleagues") + .setEncounterBgm(TrainerType.CLERK) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.ONE_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_ONE_AVG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.MEOWTH, Species.PSYDUCK, Species.BUDEW, Species.PIDOVE, Species.CINCCINO, Species.LITLEO ], - [TrainerPoolTier.UNCOMMON]: [ Species.JIGGLYPUFF, Species.MAGNEMITE, Species.MARILL, Species.COTTONEE, Species.SKIDDO ], - [TrainerPoolTier.RARE]: [ Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE ] + [TrainerPoolTier.COMMON]: [ + Species.MEOWTH, + Species.PSYDUCK, + Species.BUDEW, + Species.PIDOVE, + Species.CINCCINO, + Species.LITLEO, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.JIGGLYPUFF, + Species.MAGNEMITE, + Species.MARILL, + Species.COTTONEE, + Species.SKIDDO, + ], + [TrainerPoolTier.RARE]: [Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE], }), - [TrainerType.CYCLIST]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setHasGenders("Cyclist Female").setHasDouble("Cyclists").setEncounterBgm(TrainerType.CYCLIST) + [TrainerType.CYCLIST]: new TrainerConfig(++t) + .setMoneyMultiplier(1.3) + .setHasGenders("Cyclist Female") + .setHasDouble("Cyclists") + .setEncounterBgm(TrainerType.CYCLIST) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND ], - [TrainerPoolTier.UNCOMMON]: [ Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL ], - [TrainerPoolTier.RARE]: [ Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.ACCELGOR, Species.DREEPY ] + [TrainerPoolTier.COMMON]: [Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND], + [TrainerPoolTier.UNCOMMON]: [Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL], + [TrainerPoolTier.RARE]: [Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA], + [TrainerPoolTier.SUPER_RARE]: [Species.ACCELGOR, Species.DREEPY], }), - [TrainerType.DANCER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CYCLIST) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME) + [TrainerType.DANCER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.55) + .setEncounterBgm(TrainerType.CYCLIST) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.ONE_AVG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW ], - [TrainerPoolTier.UNCOMMON]: [ Species.SPINDA, Species.SWABLU, Species.MARACTUS, ], - [TrainerPoolTier.RARE]: [ Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO ], - [TrainerPoolTier.SUPER_RARE]: [ Species.POPPLIO ] + [TrainerPoolTier.COMMON]: [Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW], + [TrainerPoolTier.UNCOMMON]: [Species.SPINDA, Species.SWABLU, Species.MARACTUS], + [TrainerPoolTier.RARE]: [Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO], + [TrainerPoolTier.SUPER_RARE]: [Species.POPPLIO], }), [TrainerType.DEPOT_AGENT]: new TrainerConfig(++t).setMoneyMultiplier(1.45).setEncounterBgm(TrainerType.CLERK), - [TrainerType.DOCTOR]: new TrainerConfig(++t).setHasGenders("Nurse", "lass").setHasDouble("Medical Team").setMoneyMultiplier(3).setEncounterBgm(TrainerType.CLERK) + [TrainerType.DOCTOR]: new TrainerConfig(++t) + .setHasGenders("Nurse", "lass") + .setHasDouble("Medical Team") + .setMoneyMultiplier(3) + .setEncounterBgm(TrainerType.CLERK) .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.HEAL_PULSE)), - [TrainerType.FIREBREATHER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK) - .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SMOG) || s.isOfType(Type.FIRE)), - [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyTypes(Type.WATER) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER) + [TrainerType.FIREBREATHER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SMOG) || s.isOfType(PokemonType.FIRE)), + [TrainerType.FISHERMAN]: new TrainerConfig(++t) + .setMoneyMultiplier(1.25) + .setEncounterBgm(TrainerType.BACKPACKER) + .setSpecialtyType(PokemonType.WATER) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + trainerPartyTemplates.ONE_AVG, + trainerPartyTemplates.THREE_WEAK_SAME, + trainerPartyTemplates.ONE_STRONG, + trainerPartyTemplates.SIX_WEAKER, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA ], - [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.SHELLDER, Species.KRABBY, Species.HORSEA, Species.CARVANHA, Species.BARBOACH, Species.CORPHISH, Species.FINNEON, Species.TYMPOLE, Species.BASCULIN, Species.FRILLISH, Species.INKAY ], - [TrainerPoolTier.RARE]: [ Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO ] + [TrainerPoolTier.COMMON]: [ + Species.TENTACOOL, + Species.MAGIKARP, + Species.GOLDEEN, + Species.STARYU, + Species.REMORAID, + Species.SKRELP, + Species.CLAUNCHER, + Species.ARROKUDA, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.POLIWAG, + Species.SHELLDER, + Species.KRABBY, + Species.HORSEA, + Species.CARVANHA, + Species.BARBOACH, + Species.CORPHISH, + Species.FINNEON, + Species.TYMPOLE, + Species.BASCULIN, + Species.FRILLISH, + Species.INKAY, + ], + [TrainerPoolTier.RARE]: [ + Species.CHINCHOU, + Species.CORSOLA, + Species.WAILMER, + Species.BARBOACH, + Species.CLAMPERL, + Species.LUVDISC, + Species.MANTYKE, + Species.ALOMOMOLA, + Species.TATSUGIRI, + Species.VELUZA, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO], }), - [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)), - [TrainerType.HARLEQUIN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.PSYCHIC).setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1), - [TrainerType.HIKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.BACKPACKER) - .setPartyTemplates(trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.ONE_STRONG) + [TrainerType.GUITARIST]: new TrainerConfig(++t) + .setMoneyMultiplier(1.2) + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpecialtyType(PokemonType.ELECTRIC) + .setSpeciesFilter(s => s.isOfType(PokemonType.ELECTRIC)), + [TrainerType.HARLEQUIN]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.PSYCHIC) + .setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1), + [TrainerType.HIKER]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.BACKPACKER) + .setPartyTemplates( + trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, + trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.FOUR_WEAK, + trainerPartyTemplates.ONE_STRONG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SANDSHREW, Species.DIGLETT, Species.GEODUDE, Species.MACHOP, Species.ARON, Species.ROGGENROLA, Species.DRILBUR, Species.NACLI ], - [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.RHYHORN, Species.ONIX, Species.CUBONE, Species.WOOBAT, Species.SWINUB, Species.NOSEPASS, Species.HIPPOPOTAS, Species.DWEBBLE, Species.KLAWF, Species.TOEDSCOOL ], - [TrainerPoolTier.RARE]: [ Species.TORKOAL, Species.TRAPINCH, Species.BARBOACH, Species.GOLETT, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.GALAR_STUNFISK, Species.PALDEA_WOOPER ], - [TrainerPoolTier.SUPER_RARE]: [ Species.MAGBY, Species.LARVITAR ] + [TrainerPoolTier.COMMON]: [ + Species.SANDSHREW, + Species.DIGLETT, + Species.GEODUDE, + Species.MACHOP, + Species.ARON, + Species.ROGGENROLA, + Species.DRILBUR, + Species.NACLI, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.ZUBAT, + Species.RHYHORN, + Species.ONIX, + Species.CUBONE, + Species.WOOBAT, + Species.SWINUB, + Species.NOSEPASS, + Species.HIPPOPOTAS, + Species.DWEBBLE, + Species.KLAWF, + Species.TOEDSCOOL, + ], + [TrainerPoolTier.RARE]: [ + Species.TORKOAL, + Species.TRAPINCH, + Species.BARBOACH, + Species.GOLETT, + Species.ALOLA_DIGLETT, + Species.ALOLA_GEODUDE, + Species.GALAR_STUNFISK, + Species.PALDEA_WOOPER, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.MAGBY, Species.LARVITAR], }), - [TrainerType.HOOLIGANS]: new TrainerConfig(++t).setDoubleOnly().setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON) || s.isOfType(Type.DARK)), + [TrainerType.HOOLIGANS]: new TrainerConfig(++t) + .setDoubleOnly() + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpeciesFilter(s => s.isOfType(PokemonType.POISON) || s.isOfType(PokemonType.DARK)), [TrainerType.HOOPSTER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.INFIELDER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.JANITOR]: new TrainerConfig(++t).setMoneyMultiplier(1.1).setEncounterBgm(TrainerType.CLERK), [TrainerType.LINEBACKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.MAID]: new TrainerConfig(++t).setMoneyMultiplier(1.6).setEncounterBgm(TrainerType.RICH), - [TrainerType.MUSICIAN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SING)), - [TrainerType.HEX_MANIAC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PSYCHIC) - .setPartyTemplates(trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_AVG_ONE_STRONG, trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_STRONG) - .setSpeciesFilter(s => s.isOfType(Type.GHOST)), + [TrainerType.MUSICIAN]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SING)), + [TrainerType.HEX_MANIAC]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .setEncounterBgm(TrainerType.PSYCHIC) + .setPartyTemplates( + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.ONE_AVG_ONE_STRONG, + trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, + trainerPartyTemplates.THREE_AVG, + trainerPartyTemplates.TWO_STRONG, + ) + .setSpeciesFilter(s => s.isOfType(PokemonType.GHOST)), [TrainerType.NURSERY_AIDE]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm("lass"), - [TrainerType.OFFICER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CLERK) - .setPartyTemplates(trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG) + [TrainerType.OFFICER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.55) + .setEncounterBgm(TrainerType.CLERK) + .setPartyTemplates( + trainerPartyTemplates.ONE_AVG, + trainerPartyTemplates.ONE_STRONG, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.VULPIX, Species.GROWLITHE, Species.SNUBBULL, Species.POOCHYENA, Species.ELECTRIKE, Species.LILLIPUP, Species.YAMPER, Species.FIDOUGH ], - [TrainerPoolTier.UNCOMMON]: [ Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF ], - [TrainerPoolTier.RARE]: [ Species.JOLTEON, Species.RIOLU ], + [TrainerPoolTier.COMMON]: [ + Species.VULPIX, + Species.GROWLITHE, + Species.SNUBBULL, + Species.POOCHYENA, + Species.ELECTRIKE, + Species.LILLIPUP, + Species.YAMPER, + Species.FIDOUGH, + ], + [TrainerPoolTier.UNCOMMON]: [Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF], + [TrainerPoolTier.RARE]: [Species.JOLTEON, Species.RIOLU], [TrainerPoolTier.SUPER_RARE]: [], - [TrainerPoolTier.ULTRA_RARE]: [ Species.ENTEI, Species.SUICUNE, Species.RAIKOU ] + [TrainerPoolTier.ULTRA_RARE]: [Species.ENTEI, Species.SUICUNE, Species.RAIKOU], }), - [TrainerType.PARASOL_LADY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY).setSpeciesFilter(s => s.isOfType(Type.WATER)), - [TrainerType.PILOT]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), - [TrainerType.POKEFAN]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("PokéFan").setHasGenders("PokéFan Female").setHasDouble("PokéFan Family").setEncounterBgm(TrainerType.POKEFAN) - .setPartyTemplates(trainerPartyTemplates.SIX_WEAKER, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.FOUR_WEAK_SAME, trainerPartyTemplates.FIVE_WEAK, trainerPartyTemplates.SIX_WEAKER_SAME), - [TrainerType.PRESCHOOLER]: new TrainerConfig(++t).setMoneyMultiplier(0.2).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Preschooler Female", "lass").setHasDouble("Preschoolers") - .setPartyTemplates(trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.FIVE_WEAKER) + [TrainerType.PARASOL_LADY]: new TrainerConfig(++t) + .setMoneyMultiplier(1.55) + .setEncounterBgm(TrainerType.PARASOL_LADY) + .setSpeciesFilter(s => s.isOfType(PokemonType.WATER)), + [TrainerType.PILOT]: new TrainerConfig(++t) + .setEncounterBgm(TrainerType.CLERK) + .setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), + [TrainerType.POKEFAN]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setName("PokéFan") + .setHasGenders("PokéFan Female") + .setHasDouble("PokéFan Family") + .setEncounterBgm(TrainerType.POKEFAN) + .setPartyTemplates( + trainerPartyTemplates.SIX_WEAKER, + trainerPartyTemplates.FOUR_WEAK, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.ONE_STRONG, + trainerPartyTemplates.FOUR_WEAK_SAME, + trainerPartyTemplates.FIVE_WEAK, + trainerPartyTemplates.SIX_WEAKER_SAME, + ), + [TrainerType.PRESCHOOLER]: new TrainerConfig(++t) + .setMoneyMultiplier(0.2) + .setEncounterBgm(TrainerType.YOUNGSTER) + .setHasGenders("Preschooler Female", "lass") + .setHasDouble("Preschoolers") + .setPartyTemplates( + trainerPartyTemplates.THREE_WEAK, + trainerPartyTemplates.FOUR_WEAKER, + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + trainerPartyTemplates.FIVE_WEAKER, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CATERPIE, Species.PICHU, Species.SANDSHREW, Species.LEDYBA, Species.BUDEW, Species.BURMY, Species.WOOLOO, Species.PAWMI, Species.SMOLIV ], - [TrainerPoolTier.UNCOMMON]: [ Species.EEVEE, Species.CLEFFA, Species.IGGLYBUFF, Species.SWINUB, Species.WOOPER, Species.DRIFLOON, Species.DEDENNE, Species.STUFFUL ], - [TrainerPoolTier.RARE]: [ Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DARUMAKA, Species.TINKATINK ], + [TrainerPoolTier.COMMON]: [ + Species.CATERPIE, + Species.PICHU, + Species.SANDSHREW, + Species.LEDYBA, + Species.BUDEW, + Species.BURMY, + Species.WOOLOO, + Species.PAWMI, + Species.SMOLIV, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.EEVEE, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.SWINUB, + Species.WOOPER, + Species.DRIFLOON, + Species.DEDENNE, + Species.STUFFUL, + ], + [TrainerPoolTier.RARE]: [Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS], + [TrainerPoolTier.SUPER_RARE]: [Species.DARUMAKA, Species.TINKATINK], }), - [TrainerType.PSYCHIC]: new TrainerConfig(++t).setHasGenders("Psychic Female").setHasDouble("Psychics").setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.PSYCHIC) - .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, trainerPartyTemplates.ONE_STRONGER) + [TrainerType.PSYCHIC]: new TrainerConfig(++t) + .setHasGenders("Psychic Female") + .setHasDouble("Psychics") + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.PSYCHIC) + .setPartyTemplates( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, + trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, + trainerPartyTemplates.ONE_STRONGER, + ) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.ABRA, Species.DROWZEE, Species.RALTS, Species.SPOINK, Species.GOTHITA, Species.SOLOSIS, Species.BLIPBUG, Species.ESPURR, Species.HATENNA ], - [TrainerPoolTier.UNCOMMON]: [ Species.MIME_JR, Species.EXEGGCUTE, Species.MEDITITE, Species.NATU, Species.EXEGGCUTE, Species.WOOBAT, Species.INKAY, Species.ORANGURU ], - [TrainerPoolTier.RARE]: [ Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC ], - [TrainerPoolTier.SUPER_RARE]: [ Species.BELDUM, Species.ESPEON, Species.STANTLER ], + [TrainerPoolTier.COMMON]: [ + Species.ABRA, + Species.DROWZEE, + Species.RALTS, + Species.SPOINK, + Species.GOTHITA, + Species.SOLOSIS, + Species.BLIPBUG, + Species.ESPURR, + Species.HATENNA, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.MIME_JR, + Species.EXEGGCUTE, + Species.MEDITITE, + Species.NATU, + Species.EXEGGCUTE, + Species.WOOBAT, + Species.INKAY, + Species.ORANGURU, + ], + [TrainerPoolTier.RARE]: [Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC], + [TrainerPoolTier.SUPER_RARE]: [Species.BELDUM, Species.ESPEON, Species.STANTLER], }), - [TrainerType.RANGER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("Pokémon Ranger").setEncounterBgm(TrainerType.BACKPACKER).setHasGenders("Pokémon Ranger Female").setHasDouble("Pokémon Rangers") + [TrainerType.RANGER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setName("Pokémon Ranger") + .setEncounterBgm(TrainerType.BACKPACKER) + .setHasGenders("Pokémon Ranger Female") + .setHasDouble("Pokémon Rangers") .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PICHU, Species.GROWLITHE, Species.PONYTA, Species.ZIGZAGOON, Species.SEEDOT, Species.BIDOOF, Species.RIOLU, Species.SEWADDLE, Species.SKIDDO, Species.SALANDIT, Species.YAMPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.AZURILL, Species.TAUROS, Species.MAREEP, Species.FARFETCHD, Species.TEDDIURSA, Species.SHROOMISH, Species.ELECTRIKE, Species.BUDEW, Species.BUIZEL, Species.MUDBRAY, Species.STUFFUL ], - [TrainerPoolTier.RARE]: [ Species.EEVEE, Species.SCYTHER, Species.KANGASKHAN, Species.RALTS, Species.MUNCHLAX, Species.ZORUA, Species.PALDEA_TAUROS, Species.TINKATINK, Species.CYCLIZAR, Species.FLAMIGO ], - [TrainerPoolTier.SUPER_RARE]: [ Species.LARVESTA ], + [TrainerPoolTier.COMMON]: [ + Species.PICHU, + Species.GROWLITHE, + Species.PONYTA, + Species.ZIGZAGOON, + Species.SEEDOT, + Species.BIDOOF, + Species.RIOLU, + Species.SEWADDLE, + Species.SKIDDO, + Species.SALANDIT, + Species.YAMPER, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.AZURILL, + Species.TAUROS, + Species.MAREEP, + Species.FARFETCHD, + Species.TEDDIURSA, + Species.SHROOMISH, + Species.ELECTRIKE, + Species.BUDEW, + Species.BUIZEL, + Species.MUDBRAY, + Species.STUFFUL, + ], + [TrainerPoolTier.RARE]: [ + Species.EEVEE, + Species.SCYTHER, + Species.KANGASKHAN, + Species.RALTS, + Species.MUNCHLAX, + Species.ZORUA, + Species.PALDEA_TAUROS, + Species.TINKATINK, + Species.CYCLIZAR, + Species.FLAMIGO, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.LARVESTA], }), - [TrainerType.RICH]: new TrainerConfig(++t).setMoneyMultiplier(5).setName("Gentleman").setHasGenders("Madame").setHasDouble("Rich Couple"), - [TrainerType.RICH_KID]: new TrainerConfig(++t).setMoneyMultiplier(3.75).setName("Rich Boy").setHasGenders("Lady").setHasDouble("Rich Kids").setEncounterBgm(TrainerType.RICH), - [TrainerType.ROUGHNECK]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.DARK)), - [TrainerType.SAILOR]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.BACKPACKER).setSpeciesFilter(s => s.isOfType(Type.WATER) || s.isOfType(Type.FIGHTING)), - [TrainerType.SCIENTIST]: new TrainerConfig(++t).setHasGenders("Scientist Female").setHasDouble("Scientists").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.SCIENTIST) + [TrainerType.RICH]: new TrainerConfig(++t) + .setMoneyMultiplier(5) + .setName("Gentleman") + .setHasGenders("Madame") + .setHasDouble("Rich Couple"), + [TrainerType.RICH_KID]: new TrainerConfig(++t) + .setMoneyMultiplier(3.75) + .setName("Rich Boy") + .setHasGenders("Lady") + .setHasDouble("Rich Kids") + .setEncounterBgm(TrainerType.RICH), + [TrainerType.ROUGHNECK]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.ROUGHNECK) + .setSpeciesFilter(s => s.isOfType(PokemonType.DARK)), + [TrainerType.SAILOR]: new TrainerConfig(++t) + .setMoneyMultiplier(1.4) + .setEncounterBgm(TrainerType.BACKPACKER) + .setSpeciesFilter(s => s.isOfType(PokemonType.WATER) || s.isOfType(PokemonType.FIGHTING)), + [TrainerType.SCIENTIST]: new TrainerConfig(++t) + .setHasGenders("Scientist Female") + .setHasDouble("Scientists") + .setMoneyMultiplier(1.7) + .setEncounterBgm(TrainerType.SCIENTIST) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING ], - [TrainerPoolTier.UNCOMMON]: [ Species.BALTOY, Species.BRONZOR, Species.FERROSEED, Species.KLINK, Species.CHARJABUG, Species.BLIPBUG, Species.HELIOPTILE ], - [TrainerPoolTier.RARE]: [ Species.ABRA, Species.DITTO, Species.PORYGON, Species.ELEKID, Species.SOLOSIS, Species.GALAR_WEEZING ], - [TrainerPoolTier.SUPER_RARE]: [ Species.OMANYTE, Species.KABUTO, Species.AERODACTYL, Species.LILEEP, Species.ANORITH, Species.CRANIDOS, Species.SHIELDON, Species.TIRTOUGA, Species.ARCHEN, Species.ARCTOVISH, Species.ARCTOZOLT, Species.DRACOVISH, Species.DRACOZOLT ], - [TrainerPoolTier.ULTRA_RARE]: [ Species.ROTOM, Species.MELTAN ] + [TrainerPoolTier.COMMON]: [Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING], + [TrainerPoolTier.UNCOMMON]: [ + Species.BALTOY, + Species.BRONZOR, + Species.FERROSEED, + Species.KLINK, + Species.CHARJABUG, + Species.BLIPBUG, + Species.HELIOPTILE, + ], + [TrainerPoolTier.RARE]: [ + Species.ABRA, + Species.DITTO, + Species.PORYGON, + Species.ELEKID, + Species.SOLOSIS, + Species.GALAR_WEEZING, + ], + [TrainerPoolTier.SUPER_RARE]: [ + Species.OMANYTE, + Species.KABUTO, + Species.AERODACTYL, + Species.LILEEP, + Species.ANORITH, + Species.CRANIDOS, + Species.SHIELDON, + Species.TIRTOUGA, + Species.ARCHEN, + Species.ARCTOVISH, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.DRACOZOLT, + ], + [TrainerPoolTier.ULTRA_RARE]: [Species.ROTOM, Species.MELTAN], }), [TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)), + [TrainerType.SNOW_WORKER]: new TrainerConfig(++t) + .setName("Worker") + .setHasDouble("Workers") + .setMoneyMultiplier(1.7) + .setEncounterBgm(TrainerType.CLERK) + .setSpeciesFilter(s => s.isOfType(PokemonType.ICE) || s.isOfType(PokemonType.STEEL)), [TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", "lass").setHasDouble("School Kids") + [TrainerType.SCHOOL_KID]: new TrainerConfig(++t) + .setMoneyMultiplier(0.75) + .setEncounterBgm(TrainerType.YOUNGSTER) + .setHasGenders("School Kid Female", "lass") + .setHasDouble("School Kids") .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING ], - [TrainerPoolTier.UNCOMMON]: [ Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE ], - [TrainerPoolTier.RARE]: [ Species.TANGELA, Species.EEVEE, Species.YANMA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.TADBULB ] + [TrainerPoolTier.COMMON]: [ + Species.ODDISH, + Species.EXEGGCUTE, + Species.TEDDIURSA, + Species.WURMPLE, + Species.RALTS, + Species.SHROOMISH, + Species.FLETCHLING, + ], + [TrainerPoolTier.UNCOMMON]: [Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE], + [TrainerPoolTier.RARE]: [Species.TANGELA, Species.EEVEE, Species.YANMA], + [TrainerPoolTier.SUPER_RARE]: [Species.TADBULB], }), - [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyTypes(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)), - [TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers() - .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE ], TrainerSlot.TRAINER_PARTNER)) + [TrainerType.SWIMMER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.3) + .setEncounterBgm(TrainerType.PARASOL_LADY) + .setHasGenders("Swimmer Female") + .setHasDouble("Swimmers") + .setSpecialtyType(PokemonType.WATER) + .setSpeciesFilter(s => s.isOfType(PokemonType.WATER)), + [TrainerType.TWINS]: new TrainerConfig(++t) + .setDoubleOnly() + .setMoneyMultiplier(0.65) + .setUseSameSeedForAllMembers() + .setPartyTemplateFunc(() => + getWavePartyTemplate( + trainerPartyTemplates.TWO_WEAK, + trainerPartyTemplates.TWO_AVG, + trainerPartyTemplates.TWO_STRONG, + ), + ) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([ + Species.PLUSLE, + Species.VOLBEAT, + Species.PACHIRISU, + Species.SILCOON, + Species.METAPOD, + Species.IGGLYBUFF, + Species.PETILIL, + Species.EEVEE, + ]), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.MINUN, + Species.ILLUMISE, + Species.EMOLGA, + Species.CASCOON, + Species.KAKUNA, + Species.CLEFFA, + Species.COTTONEE, + Species.EEVEE, + ], + TrainerSlot.TRAINER_PARTNER, + ), + ) .setEncounterBgm(TrainerType.TWINS), - [TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble("Veteran Duo").setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(Type.DRAGON)), - [TrainerType.WAITER]: new TrainerConfig(++t).setHasGenders("Waitress").setHasDouble("Restaurant Staff").setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.CLERK) + [TrainerType.VETERAN]: new TrainerConfig(++t) + .setHasGenders("Veteran Female") + .setHasDouble("Veteran Duo") + .setMoneyMultiplier(2.5) + .setEncounterBgm(TrainerType.ACE_TRAINER) + .setSpeciesFilter(s => s.isOfType(PokemonType.DRAGON)), + [TrainerType.WAITER]: new TrainerConfig(++t) + .setHasGenders("Waitress") + .setHasDouble("Restaurant Staff") + .setMoneyMultiplier(1.5) + .setEncounterBgm(TrainerType.CLERK) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO ], - [TrainerPoolTier.UNCOMMON]: [ Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE ], - [TrainerPoolTier.RARE]: [ Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST ] + [TrainerPoolTier.COMMON]: [ + Species.CLEFFA, + Species.CHATOT, + Species.PANSAGE, + Species.PANSEAR, + Species.PANPOUR, + Species.MINCCINO, + ], + [TrainerPoolTier.UNCOMMON]: [Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE], + [TrainerPoolTier.RARE]: [Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST], }), - [TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble("Workers").setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(Type.ROCK) || s.isOfType(Type.STEEL)), - [TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Lass", "lass").setHasDouble("Beginners").setPartyTemplates(trainerPartyTemplates.TWO_WEAKER) - .setSpeciesPools( - [ Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP ] + [TrainerType.WORKER]: new TrainerConfig(++t) + .setHasGenders("Worker Female") + .setHasDouble("Workers") + .setEncounterBgm(TrainerType.CLERK) + .setMoneyMultiplier(1.7) + .setSpeciesFilter(s => s.isOfType(PokemonType.ROCK) || s.isOfType(PokemonType.STEEL)), + [TrainerType.YOUNGSTER]: new TrainerConfig(++t) + .setMoneyMultiplier(0.5) + .setEncounterBgm(TrainerType.YOUNGSTER) + .setHasGenders("Lass", "lass") + .setHasDouble("Beginners") + .setPartyTemplates(trainerPartyTemplates.TWO_WEAKER) + .setSpeciesPools([ + Species.CATERPIE, + Species.WEEDLE, + Species.RATTATA, + Species.SENTRET, + Species.POOCHYENA, + Species.ZIGZAGOON, + Species.WURMPLE, + Species.BIDOOF, + Species.PATRAT, + Species.LILLIPUP, + ]), + [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Rocket Grunt Female") + .setHasDouble("Rocket Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.WEEDLE, + Species.RATTATA, + Species.EKANS, + Species.SANDSHREW, + Species.ZUBAT, + Species.ODDISH, + Species.GEODUDE, + Species.SLOWPOKE, + Species.GRIMER, + Species.KOFFING, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.MANKEY, + Species.GROWLITHE, + Species.MAGNEMITE, + Species.GASTLY, + Species.VOLTORB, + Species.EXEGGCUTE, + Species.CUBONE, + Species.LICKITUNG, + Species.SCYTHER, + Species.TAUROS, + Species.GYARADOS, + Species.MURKROW, + Species.ELEKID, + Species.MAGBY, + ], + [TrainerPoolTier.RARE]: [ + Species.PORYGON, + Species.OMANYTE, + Species.KABUTO, + Species.ALOLA_RATTATA, + Species.ALOLA_SANDSHREW, + Species.ALOLA_MEOWTH, + Species.ALOLA_GEODUDE, + Species.ALOLA_GRIMER, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR], + }), + [TrainerType.ARCHER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("rocket_admin", "rocket", [Species.HOUNDOOM]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.ARIANA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("rocket_admin_female", "rocket", [Species.ARBOK]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.PROTON]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("rocket_admin", "rocket", [Species.CROBAT]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.PETREL]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("rocket_admin", "rocket", [Species.WEEZING]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_rocket_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Magma Grunt Female") + .setHasDouble("Magma Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.DIGLETT, + Species.GROWLITHE, + Species.SLUGMA, + Species.MAGBY, + Species.POOCHYENA, + Species.ZIGZAGOON, + Species.NUMEL, + Species.TORKOAL, + Species.BALTOY, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.RHYHORN, + Species.GLIGAR, + Species.PHANPY, + Species.SOLROCK, + Species.HIPPOPOTAS, + Species.HEATMOR, + Species.ROLYCOLY, + Species.SILICOBRA, + ], + [TrainerPoolTier.RARE]: [ + Species.ARON, + Species.TRAPINCH, + Species.LILEEP, + Species.ANORITH, + Species.TURTONATOR, + Species.TOEDSCOOL, + Species.HISUI_GROWLITHE, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.CHARCADET, Species.CAPSAKID], + }), + [TrainerType.TABITHA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("magma_admin", "magma", [Species.CAMERUPT]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.COURTNEY]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("magma_admin_female", "magma", [Species.CAMERUPT]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Aqua Grunt Female") + .setHasDouble("Aqua Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.QWILFISH, + Species.REMORAID, + Species.ZIGZAGOON, + Species.LOTAD, + Species.CARVANHA, + Species.WAILMER, + Species.BARBOACH, + Species.CORPHISH, + Species.SPHEAL, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TENTACOOL, + Species.HORSEA, + Species.CHINCHOU, + Species.WOOPER, + Species.WINGULL, + Species.AZURILL, + Species.CLAMPERL, + Species.CLOBBOPUS, + ], + [TrainerPoolTier.RARE]: [ + Species.MANTYKE, + Species.SKRELP, + Species.DHELMISE, + Species.ARROKUDA, + Species.HISUI_QWILFISH, + Species.PALDEA_WOOPER, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.BASCULEGION, Species.DONDOZO], + }), + [TrainerType.MATT]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("aqua_admin", "aqua", [Species.SHARPEDO]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.SHELLY]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("aqua_admin_female", "aqua", [Species.SHARPEDO]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aqua_magma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Galactic Grunt Female") + .setHasDouble("Galactic Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_galactic_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.WURMPLE, + Species.SHINX, + Species.BURMY, + Species.DRIFLOON, + Species.GLAMEOW, + Species.STUNKY, + Species.BRONZOR, + Species.CROAGUNK, + Species.CARNIVINE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.ZUBAT, + Species.LICKITUNG, + Species.RHYHORN, + Species.TANGELA, + Species.YANMA, + Species.GLIGAR, + Species.SWINUB, + Species.SKORUPI, + ], + [TrainerPoolTier.RARE]: [ + Species.SNEASEL, + Species.ELEKID, + Species.MAGBY, + Species.DUSKULL, + Species.HISUI_GROWLITHE, + Species.HISUI_QWILFISH, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.SPIRITOMB, Species.ROTOM, Species.HISUI_SNEASEL], + }), + [TrainerType.JUPITER]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.SKUNTANK]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_galactic_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.MARS]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.PURUGLY]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_galactic_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.SATURN]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("galactic_commander", "galactic", [Species.TOXICROAK]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_galactic_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Plasma Grunt Female") + .setHasDouble("Plasma Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_plasma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.PATRAT, + Species.LILLIPUP, + Species.PURRLOIN, + Species.WOOBAT, + Species.TYMPOLE, + Species.SANDILE, + Species.SCRAGGY, + Species.TRUBBISH, + Species.VANILLITE, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.TIMBURR, + Species.VENIPEDE, + Species.DARUMAKA, + Species.FOONGUS, + Species.FRILLISH, + Species.JOLTIK, + Species.KLINK, + Species.CUBCHOO, + Species.GOLETT, + ], + [TrainerPoolTier.RARE]: [ + Species.DRILBUR, + Species.ZORUA, + Species.MIENFOO, + Species.PAWNIARD, + Species.BOUFFALANT, + Species.RUFFLET, + Species.VULLABY, + Species.DURANT, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.AXEW, Species.DRUDDIGON, Species.DEINO, Species.HISUI_ZORUA], + }), + [TrainerType.ZINZOLIN]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_plasma_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.COLRESS]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("plasma_boss", "plasma_2", [Species.KLINKLANG]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_colress") + .setMixedBattleBgm("battle_colress") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Flare Grunt Female") + .setHasDouble("Flare Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_flare_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.PONYTA, + Species.HOUNDOUR, + Species.SKORUPI, + Species.CROAGUNK, + Species.SCRAGGY, + Species.FLETCHLING, + Species.SCATTERBUG, + Species.LITLEO, + Species.ESPURR, + Species.INKAY, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.POOCHYENA, + Species.ELECTRIKE, + Species.PURRLOIN, + Species.FOONGUS, + Species.PANCHAM, + Species.BINACLE, + Species.SKRELP, + Species.CLAUNCHER, + Species.HELIOPTILE, + Species.PHANTUMP, + Species.PUMPKABOO, + ], + [TrainerPoolTier.RARE]: [Species.SNEASEL, Species.LITWICK, Species.PAWNIARD, Species.SLIGGOO], + [TrainerPoolTier.SUPER_RARE]: [Species.NOIBAT, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG], + }), + [TrainerType.BRYONY]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_flare_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.XEROSIC]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("flare_admin", "flare", [Species.MALAMAR]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_flare_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Aether Grunt Female") + .setHasDouble("Aether Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aether_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.CORSOLA, + Species.LILLIPUP, + Species.PIKIPEK, + Species.YUNGOOS, + Species.ROCKRUFF, + Species.MORELULL, + Species.BOUNSWEET, + Species.COMFEY, + Species.KOMALA, + Species.TOGEDEMARU, + Species.ALOLA_RAICHU, + Species.ALOLA_DIGLETT, + Species.ALOLA_GEODUDE, + Species.ALOLA_EXEGGUTOR, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.POLIWAG, + Species.CRABRAWLER, + Species.ORICORIO, + Species.CUTIEFLY, + Species.WISHIWASHI, + Species.MUDBRAY, + Species.STUFFUL, + Species.ORANGURU, + Species.PASSIMIAN, + Species.PYUKUMUKU, + Species.MINIOR, + Species.BRUXISH, + Species.ALOLA_SANDSHREW, + Species.ALOLA_VULPIX, + Species.ALOLA_MAROWAK, + ], + [TrainerPoolTier.RARE]: [ + Species.MAGNEMITE, + Species.TURTONATOR, + Species.MIMIKYU, + Species.DRAMPA, + Species.GALAR_CORSOLA, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.PORYGON, Species.JANGMO_O], + }), + [TrainerType.FABA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("aether_admin", "aether", [Species.HYPNO]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_aether_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Skull Grunt Female") + .setHasDouble("Skull Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_skull_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.EKANS, + Species.DROWZEE, + Species.KOFFING, + Species.SPINARAK, + Species.SCRAGGY, + Species.TRUBBISH, + Species.MAREANIE, + Species.SALANDIT, + Species.ALOLA_RATTATA, + Species.ALOLA_MEOWTH, + Species.ALOLA_GRIMER, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.ZUBAT, + Species.GASTLY, + Species.HOUNDOUR, + Species.SABLEYE, + Species.VENIPEDE, + Species.SANDILE, + Species.VULLABY, + Species.PANCHAM, + Species.FOMANTIS, + Species.ALOLA_MAROWAK, + ], + [TrainerPoolTier.RARE]: [ + Species.PAWNIARD, + Species.WISHIWASHI, + Species.SANDYGAST, + Species.MIMIKYU, + Species.DHELMISE, + Species.NYMBLE, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.GRUBBIN, Species.DEWPIDER], + }), + [TrainerType.PLUMERIA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("skull_admin", "skull", [Species.SALAZZLE]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_skull_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Macro Grunt Female") + .setHasDouble("Macro Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_macro_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.STEELIX, + Species.MAWILE, + Species.FERROSEED, + Species.KLINK, + Species.SKWOVET, + Species.ROOKIDEE, + Species.CRAMORANT, + Species.CUFANT, + Species.GALAR_MEOWTH, + Species.GALAR_ZIGZAGOON, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.MAGNEMITE, + Species.RIOLU, + Species.DRILBUR, + Species.APPLIN, + Species.ARROKUDA, + Species.SINISTEA, + Species.HATENNA, + Species.GALAR_PONYTA, + Species.GALAR_YAMASK, + ], + [TrainerPoolTier.RARE]: [ + Species.SCIZOR, + Species.BELDUM, + Species.HONEDGE, + Species.FALINKS, + Species.GALAR_FARFETCHD, + Species.GALAR_MR_MIME, + Species.GALAR_DARUMAKA, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.DURALUDON, Species.DREEPY], + }), + [TrainerType.OLEANA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("macro_admin", "macro", [Species.GARBODOR]) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_oleana") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), + [TrainerType.STAR_GRUNT]: new TrainerConfig(++t) + .setHasGenders("Star Grunt Female") + .setHasDouble("Star Grunts") + .setMoneyMultiplier(1.0) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_grunt") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + Species.DUNSPARCE, + Species.HOUNDOUR, + Species.AZURILL, + Species.GULPIN, + Species.FOONGUS, + Species.FLETCHLING, + Species.LITLEO, + Species.FLABEBE, + Species.CRABRAWLER, + Species.NYMBLE, + Species.PAWMI, + Species.FIDOUGH, + Species.SQUAWKABILLY, + Species.MASCHIFF, + Species.SHROODLE, + Species.KLAWF, + Species.WIGLETT, + Species.PALDEA_WOOPER, + ], + [TrainerPoolTier.UNCOMMON]: [ + Species.KOFFING, + Species.EEVEE, + Species.GIRAFARIG, + Species.RALTS, + Species.TORKOAL, + Species.SEVIPER, + Species.SCRAGGY, + Species.ZORUA, + Species.MIMIKYU, + Species.IMPIDIMP, + Species.FALINKS, + Species.CAPSAKID, + Species.TINKATINK, + Species.BOMBIRDIER, + Species.CYCLIZAR, + Species.FLAMIGO, + Species.PALDEA_TAUROS, + ], + [TrainerPoolTier.RARE]: [ + Species.MANKEY, + Species.PAWNIARD, + Species.CHARCADET, + Species.FLITTLE, + Species.VAROOM, + Species.ORTHWORM, + ], + [TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO, Species.GIMMIGHOUL], + }), + [TrainerType.GIACOMO]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_1", [Species.KINGAMBIT], PokemonType.DARK) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Segin Starmobile + p.moveset = [ + new PokemonMove(Moves.WICKED_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), + ), + [TrainerType.MELA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_2", [Species.ARMAROUGE], PokemonType.FIRE) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 2; // Schedar Starmobile + p.moveset = [ + new PokemonMove(Moves.BLAZING_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), + ), + [TrainerType.ATTICUS]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_3", [Species.REVAVROOM], PokemonType.POISON) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 3; // Navi Starmobile + p.moveset = [ + new PokemonMove(Moves.NOXIOUS_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), + ), + [TrainerType.ORTEGA]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_4", [Species.DACHSBUN], PokemonType.FAIRY) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 4; // Ruchbah Starmobile + p.moveset = [ + new PokemonMove(Moves.MAGICAL_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), + ), + [TrainerType.ERI]: new TrainerConfig(++t) + .setMoneyMultiplier(1.5) + .initForEvilTeamAdmin("star_admin", "star_5", [Species.ANNIHILAPE], PokemonType.FIGHTING) + .setEncounterBgm(TrainerType.PLASMA_GRUNT) + .setBattleBgm("battle_plasma_grunt") + .setMixedBattleBgm("battle_star_admin") + .setVictoryBgm("victory_team_plasma") + .setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = 5; // Caph Starmobile + p.moveset = [ + new PokemonMove(Moves.COMBAT_TORQUE), + new PokemonMove(Moves.SPIN_OUT), + new PokemonMove(Moves.SHIFT_GEAR), + new PokemonMove(Moves.HIGH_HORSEPOWER), + ]; + }), ), - [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH, Species.SLOWPOKE ], - [TrainerPoolTier.UNCOMMON]: [ Species.GYARADOS, Species.LICKITUNG, Species.TAUROS, Species.MANKEY, Species.SCYTHER, Species.ELEKID, Species.MAGBY, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.MAGNEMITE ], - [TrainerPoolTier.RARE]: [ Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DRATINI, Species.LARVITAR ] - }), - [TrainerType.ARCHER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.HOUNDOOM ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.ARIANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin_female", "rocket", [ Species.ARBOK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.PROTON]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.CROBAT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.PETREL]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.WEEZING ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.GROWLITHE, Species.BALTOY ], - [TrainerPoolTier.UNCOMMON]: [ Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR, Species.RHYHORN, Species.HEATMOR ], - [TrainerPoolTier.RARE]: [ Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], - [TrainerPoolTier.SUPER_RARE]: [ Species.CAPSAKID, Species.CHARCADET ] - }), - [TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL, Species.REMORAID, Species.QWILFISH, Species.BARBOACH ], - [TrainerPoolTier.UNCOMMON]: [ Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.CLOBBOPUS, Species.HORSEA ], - [TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.DHELMISE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.PALDEA_WOOPER, Species.SKRELP ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.BASCULEGION ] - }), - [TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.SHELLY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin_female", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY, Species.CARNIVINE ], - [TrainerPoolTier.UNCOMMON]: [ Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.ZUBAT, Species.YANMA, Species.SKORUPI, Species.GLIGAR, Species.SWINUB ], - [TrainerPoolTier.RARE]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL ], - [TrainerPoolTier.SUPER_RARE]: [ Species.ROTOM, Species.SPIRITOMB, Species.HISUI_SNEASEL ] - }), - [TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.SKUNTANK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.PURUGLY ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [ Species.TOXICROAK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH, Species.TYMPOLE ], - [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.JOLTIK, Species.CUBCHOO, Species.KLINK ], - [TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.RUFFLET, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.MIENFOO, Species.DURANT, Species.BOUFFALANT ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DRUDDIGON, Species.HISUI_ZORUA, Species.AXEW, Species.DEINO ] - }), - [TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [ Species.CRYOGONAL ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.ROOD]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [ Species.SWOOBAT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK, Species.SCATTERBUG, Species.ESPURR ], - [TrainerPoolTier.UNCOMMON]: [ Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.PANCHAM, Species.PURRLOIN, Species.POOCHYENA, Species.BINACLE, Species.CLAUNCHER, Species.PUMPKABOO, Species.PHANTUMP, Species.FOONGUS ], - [TrainerPoolTier.RARE]: [ Species.LITWICK, Species.SNEASEL, Species.PAWNIARD, Species.SLIGGOO ], - [TrainerPoolTier.SUPER_RARE]: [ Species.NOIBAT, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG ] - }), - [TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [ Species.LIEPARD ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [ Species.MALAMAR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.ALOLA_EXEGGUTOR, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_RAICHU, Species.BOUNSWEET, Species.LILLIPUP, Species.KOMALA, Species.MORELULL, Species.COMFEY, Species.TOGEDEMARU ], - [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.BRUXISH, Species.MINIOR, Species.WISHIWASHI, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.CRABRAWLER, Species.CUTIEFLY, Species.ORICORIO, Species.MUDBRAY, Species.PYUKUMUKU, Species.ALOLA_MAROWAK ], - [TrainerPoolTier.RARE]: [ Species.GALAR_CORSOLA, Species.TURTONATOR, Species.MIMIKYU, Species.MAGNEMITE, Species.DRAMPA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.JANGMO_O, Species.PORYGON ] - }), - [TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [ Species.HYPNO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.EKANS, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH, Species.DROWZEE ], - [TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.HOUNDOUR, Species.ALOLA_MAROWAK, Species.GASTLY, Species.PANCHAM, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY ], - [TrainerPoolTier.RARE]: [ Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.WISHIWASHI, Species.NYMBLE ], - [TrainerPoolTier.SUPER_RARE]: [ Species.GRUBBIN, Species.DEWPIDER ] - }), - [TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [ Species.SALAZZLE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CUFANT, Species.GALAR_MEOWTH, Species.KLINK, Species.ROOKIDEE, Species.CRAMORANT, Species.GALAR_ZIGZAGOON, Species.SKWOVET, Species.STEELIX, Species.MAWILE, Species.FERROSEED ], - [TrainerPoolTier.UNCOMMON]: [ Species.DRILBUR, Species.MAGNEMITE, Species.HATENNA, Species.ARROKUDA, Species.APPLIN, Species.GALAR_PONYTA, Species.GALAR_YAMASK, Species.SINISTEA, Species.RIOLU ], - [TrainerPoolTier.RARE]: [ Species.FALINKS, Species.BELDUM, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.HONEDGE, Species.SCIZOR, Species.GALAR_DARUMAKA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DURALUDON, Species.DREEPY ] - }), - [TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [ Species.GARBODOR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)), - [TrainerType.STAR_GRUNT]: new TrainerConfig(++t).setHasGenders("Star Grunt Female").setHasDouble("Star Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.DUNSPARCE, Species.HOUNDOUR, Species.AZURILL, Species.GULPIN, Species.FOONGUS, Species.FLETCHLING, Species.LITLEO, Species.FLABEBE, Species.CRABRAWLER, Species.NYMBLE, Species.PAWMI, Species.FIDOUGH, Species.SQUAWKABILLY, Species.MASCHIFF, Species.SHROODLE, Species.KLAWF, Species.WIGLETT, Species.PALDEA_WOOPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.KOFFING, Species.EEVEE, Species.GIRAFARIG, Species.RALTS, Species.TORKOAL, Species.SEVIPER, Species.SCRAGGY, Species.ZORUA, Species.MIMIKYU, Species.IMPIDIMP, Species.FALINKS, Species.CAPSAKID, Species.TINKATINK, Species.BOMBIRDIER, Species.CYCLIZAR, Species.FLAMIGO, Species.PALDEA_TAUROS ], - [TrainerPoolTier.RARE]: [ Species.MANKEY, Species.PAWNIARD, Species.CHARCADET, Species.FLITTLE, Species.VAROOM, Species.ORTHWORM ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.GIMMIGHOUL ] - }), - [TrainerType.GIACOMO]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_1", [ Species.KINGAMBIT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Segin Starmobile - p.moveset = [ new PokemonMove(Moves.WICKED_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.MELA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_2", [ Species.ARMAROUGE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 2; // Schedar Starmobile - p.moveset = [ new PokemonMove(Moves.BLAZING_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.ATTICUS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_3", [ Species.REVAVROOM ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 3; // Navi Starmobile - p.moveset = [ new PokemonMove(Moves.NOXIOUS_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.ORTEGA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_4", [ Species.DACHSBUN ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 4; // Ruchbah Starmobile - p.moveset = [ new PokemonMove(Moves.MAGICAL_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.ERI]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("star_admin", "star_5", [ Species.ANNIHILAPE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_star_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 5; // Caph Starmobile - p.moveset = [ new PokemonMove(Moves.COMBAT_TORQUE), new PokemonMove(Moves.SPIN_OUT), new PokemonMove(Moves.SHIFT_GEAR), new PokemonMove(Moves.HIGH_HORSEPOWER) ]; - })), - [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], true, Type.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ERIKA"], false, Type.GRASS).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JANINE"], false, Type.POISON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SABRINA"], false, Type.PSYCHIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BLAINE"], true, Type.FIRE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GIOVANNI"], true, Type.DARK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FALKNER"], true, Type.FLYING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BUGSY"], true, Type.BUG).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WHITNEY"], false, Type.NORMAL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MORTY"], true, Type.GHOST).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHUCK"], true, Type.FIGHTING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JASMINE"], false, Type.STEEL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PRYCE"], true, Type.ICE).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAIR"], false, Type.DRAGON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXANNE"], false, Type.ROCK).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRAWLY"], true, Type.FIGHTING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WATTSON"], true, Type.ELECTRIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FLANNERY"], false, Type.FIRE).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["NORMAN"], true, Type.NORMAL).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WINONA"], false, Type.FLYING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TATE"], true, Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("tate_liza_double").setDoubleTrainerType(TrainerType.LIZA).setDoubleTitle("gym_leader_double"), - [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LIZA"], false, Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("liza_tate_double").setDoubleTrainerType(TrainerType.TATE).setDoubleTitle("gym_leader_double"), - [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JUAN"], true, Type.WATER).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"), - [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROARK"], true, Type.ROCK).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GARDENIA"], false, Type.GRASS).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MAYLENE"], false, Type.FIGHTING).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRASHER_WAKE"], true, Type.WATER).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FANTINA"], false, Type.GHOST).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BYRON"], true, Type.STEEL).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CANDICE"], false, Type.ICE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VOLKNER"], true, Type.ELECTRIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CILAN"], true, Type.GRASS).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHILI"], true, Type.FIRE).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRESS"], true, Type.WATER).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHEREN"], true, Type.NORMAL).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LENORA"], false, Type.NORMAL).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXIE"], false, Type.POISON).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BURGH"], true, Type.BUG).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ELESA"], false, Type.ELECTRIC).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAY"], true, Type.GROUND).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SKYLA"], false, Type.FLYING).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRYCEN"], true, Type.ICE).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["DRAYDEN"], true, Type.DRAGON).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MARLON"], true, Type.WATER).setMixedBattleBgm("battle_unova_gym"), - [TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VIOLA"], false, Type.BUG).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRANT"], true, Type.ROCK).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KORRINA"], false, Type.FIGHTING).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RAMOS"], true, Type.GRASS).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLEMONT"], true, Type.ELECTRIC).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VALERIE"], false, Type.FAIRY).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OLYMPIA"], false, Type.PSYCHIC).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WULFRIC"], true, Type.ICE).setMixedBattleBgm("battle_kalos_gym"), - [TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MILO"], true, Type.GRASS).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.NESSA]: new TrainerConfig(++t).setName("Nessa").initForGymLeader(signatureSpecies["NESSA"], false, Type.WATER).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KABU"], true, Type.FIRE).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.BEA]: new TrainerConfig(++t).setName("Bea").initForGymLeader(signatureSpecies["BEA"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.ALLISTER]: new TrainerConfig(++t).setName("Allister").initForGymLeader(signatureSpecies["ALLISTER"], true, Type.GHOST).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OPAL"], false, Type.FAIRY).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BEDE"], true, Type.FAIRY).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GORDIE"], true, Type.ROCK).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MELONY"], false, Type.ICE).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], true, Type.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), - [TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], false, Type.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"), - [TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_gym"), - [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, Type.BUG).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, Type.GRASS).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, Type.ELECTRIC).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, Type.WATER).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, Type.NORMAL).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, Type.GHOST).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, Type.PSYCHIC).setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, Type.ICE).setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)) + .initForGymLeader(signatureSpecies["BROCK"], true, PokemonType.ROCK) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.MISTY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MISTY"], false, PokemonType.WATER) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.LT_SURGE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["LT_SURGE"], true, PokemonType.ELECTRIC) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.ERIKA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ERIKA"], false, PokemonType.GRASS) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.JANINE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["JANINE"], false, PokemonType.POISON) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.SABRINA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["SABRINA"], false, PokemonType.PSYCHIC) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.BLAINE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BLAINE"], true, PokemonType.FIRE) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.GIOVANNI]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GIOVANNI"], true, PokemonType.DARK) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.FALKNER]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["FALKNER"], true, PokemonType.FLYING) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.BUGSY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BUGSY"], true, PokemonType.BUG) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.WHITNEY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["WHITNEY"], false, PokemonType.NORMAL) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.MORTY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MORTY"], true, PokemonType.GHOST) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.CHUCK]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CHUCK"], true, PokemonType.FIGHTING) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.JASMINE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["JASMINE"], false, PokemonType.STEEL) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.PRYCE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["PRYCE"], true, PokemonType.ICE) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.CLAIR]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CLAIR"], false, PokemonType.DRAGON) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.ROXANNE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ROXANNE"], false, PokemonType.ROCK) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.BRAWLY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BRAWLY"], true, PokemonType.FIGHTING) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.WATTSON]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["WATTSON"], true, PokemonType.ELECTRIC) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.FLANNERY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["FLANNERY"], false, PokemonType.FIRE) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.NORMAN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["NORMAN"], true, PokemonType.NORMAL) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.WINONA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["WINONA"], false, PokemonType.FLYING) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.TATE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["TATE"], true, PokemonType.PSYCHIC) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym") + .setHasDouble("tate_liza_double") + .setDoubleTrainerType(TrainerType.LIZA) + .setDoubleTitle("gym_leader_double"), + [TrainerType.LIZA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["LIZA"], false, PokemonType.PSYCHIC) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym") + .setHasDouble("liza_tate_double") + .setDoubleTrainerType(TrainerType.TATE) + .setDoubleTitle("gym_leader_double"), + [TrainerType.JUAN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["JUAN"], true, PokemonType.WATER) + .setBattleBgm("battle_hoenn_gym") + .setMixedBattleBgm("battle_hoenn_gym"), + [TrainerType.ROARK]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ROARK"], true, PokemonType.ROCK) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.GARDENIA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GARDENIA"], false, PokemonType.GRASS) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.MAYLENE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MAYLENE"], false, PokemonType.FIGHTING) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CRASHER_WAKE"], true, PokemonType.WATER) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.FANTINA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["FANTINA"], false, PokemonType.GHOST) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.BYRON]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BYRON"], true, PokemonType.STEEL) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.CANDICE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CANDICE"], false, PokemonType.ICE) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.VOLKNER]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["VOLKNER"], true, PokemonType.ELECTRIC) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.CILAN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CILAN"], true, PokemonType.GRASS) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CHILI]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CHILI"], true, PokemonType.FIRE) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CRESS]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CRESS"], true, PokemonType.WATER) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CHEREN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CHEREN"], true, PokemonType.NORMAL) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.LENORA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["LENORA"], false, PokemonType.NORMAL) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.ROXIE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ROXIE"], false, PokemonType.POISON) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.BURGH]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BURGH"], true, PokemonType.BUG) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.ELESA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["ELESA"], false, PokemonType.ELECTRIC) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.CLAY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CLAY"], true, PokemonType.GROUND) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.SKYLA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["SKYLA"], false, PokemonType.FLYING) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.BRYCEN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BRYCEN"], true, PokemonType.ICE) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.DRAYDEN]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["DRAYDEN"], true, PokemonType.DRAGON) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.MARLON]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MARLON"], true, PokemonType.WATER) + .setMixedBattleBgm("battle_unova_gym"), + [TrainerType.VIOLA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["VIOLA"], false, PokemonType.BUG) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.GRANT]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GRANT"], true, PokemonType.ROCK) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.KORRINA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["KORRINA"], false, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.RAMOS]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["RAMOS"], true, PokemonType.GRASS) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.CLEMONT]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["CLEMONT"], true, PokemonType.ELECTRIC) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.VALERIE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["VALERIE"], false, PokemonType.FAIRY) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.OLYMPIA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["OLYMPIA"], false, PokemonType.PSYCHIC) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.WULFRIC]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["WULFRIC"], true, PokemonType.ICE) + .setMixedBattleBgm("battle_kalos_gym"), + [TrainerType.MILO]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MILO"], true, PokemonType.GRASS) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.NESSA]: new TrainerConfig(++t) + .setName("Nessa") + .initForGymLeader(signatureSpecies["NESSA"], false, PokemonType.WATER) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.KABU]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["KABU"], true, PokemonType.FIRE) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.BEA]: new TrainerConfig(++t) + .setName("Bea") + .initForGymLeader(signatureSpecies["BEA"], false, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.ALLISTER]: new TrainerConfig(++t) + .setName("Allister") + .initForGymLeader(signatureSpecies["ALLISTER"], true, PokemonType.GHOST) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.OPAL]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["OPAL"], false, PokemonType.FAIRY) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.BEDE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BEDE"], true, PokemonType.FAIRY) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.GORDIE]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GORDIE"], true, PokemonType.ROCK) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.MELONY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["MELONY"], false, PokemonType.ICE) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.PIERS]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["PIERS"], true, PokemonType.DARK) + .setHasDouble("piers_marnie_double") + .setDoubleTrainerType(TrainerType.MARNIE) + .setDoubleTitle("gym_leader_double") + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.MARNIE]: new TrainerConfig(++t) + .setName("Marnie") + .initForGymLeader(signatureSpecies["MARNIE"], false, PokemonType.DARK) + .setHasDouble("marnie_piers_double") + .setDoubleTrainerType(TrainerType.PIERS) + .setDoubleTitle("gym_leader_double") + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.RAIHAN]: new TrainerConfig(++t) + .setName("Raihan") + .initForGymLeader(signatureSpecies["RAIHAN"], true, PokemonType.DRAGON) + .setMixedBattleBgm("battle_galar_gym"), + [TrainerType.KATY]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["KATY"], false, PokemonType.BUG, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.BRASSIUS]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["BRASSIUS"], true, PokemonType.GRASS, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.IONO]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["IONO"], false, PokemonType.ELECTRIC, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.KOFU]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["KOFU"], true, PokemonType.WATER, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.LARRY]: new TrainerConfig(++t) + .setName("Larry") + .initForGymLeader(signatureSpecies["LARRY"], true, PokemonType.NORMAL, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.RYME]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["RYME"], false, PokemonType.GHOST, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.TULIP]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["TULIP"], false, PokemonType.PSYCHIC, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), + [TrainerType.GRUSHA]: new TrainerConfig(++t) + .initForGymLeader(signatureSpecies["GRUSHA"], true, PokemonType.ICE, true, -1) + .setMixedBattleBgm("battle_paldea_gym"), - [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], false, Type.ICE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], true, Type.FIGHTING).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AGATHA"], false, Type.GHOST).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour(signatureSpecies["LANCE"], true, Type.DRAGON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), - [TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WILL"], true, Type.PSYCHIC).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KOGA"], true, Type.POISON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAREN"], false, Type.DARK).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"), - [TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIDNEY"], true, Type.DARK).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["PHOEBE"], false, Type.GHOST).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GLACIA"], false, Type.ICE).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], true, Type.DRAGON).setMixedBattleBgm("battle_hoenn_elite"), - [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], true, Type.BUG).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], false, Type.GROUND).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, Type.FIRE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], true, Type.PSYCHIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"), - [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], false, Type.GHOST).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], true, Type.FIGHTING).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GRIMSLEY"], true, Type.DARK).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CAITLIN"], false, Type.PSYCHIC).setMixedBattleBgm("battle_unova_elite"), - [TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MALVA"], false, Type.FIRE).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIEBOLD"], true, Type.WATER).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WIKSTROM"], true, Type.STEEL).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRASNA"], false, Type.DRAGON).setMixedBattleBgm("battle_kalos_elite"), - [TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HALA"], true, Type.FIGHTING).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MOLAYNE"], true, Type.STEEL).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["OLIVIA"], false, Type.ROCK).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["ACEROLA"], false, Type.GHOST).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAHILI"], false, Type.FLYING).setMixedBattleBgm("battle_alola_elite"), - [TrainerType.MARNIE_ELITE]: new TrainerConfig(++t).setName("Marnie").initForEliteFour(signatureSpecies["MARNIE_ELITE"], false, Type.DARK).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.NESSA_ELITE]: new TrainerConfig(++t).setName("Nessa").initForEliteFour(signatureSpecies["NESSA_ELITE"], false, Type.WATER).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, Type.GHOST).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_elite"), - [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, Type.GROUND).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, Type.STEEL).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, Type.NORMAL, Type.FLYING).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, Type.DRAGON).setMixedBattleBgm("battle_paldea_elite"), - [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, Type.FIRE).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, Type.STEEL).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, Type.FAIRY).setMixedBattleBgm("battle_bb_elite"), - [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, Type.DRAGON).setMixedBattleBgm("battle_bb_elite"), + [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)) + .initForEliteFour(signatureSpecies["LORELEI"], false, PokemonType.ICE) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.BRUNO]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["BRUNO"], true, PokemonType.FIGHTING) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.AGATHA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["AGATHA"], false, PokemonType.GHOST) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.LANCE]: new TrainerConfig(++t) + .setName("Lance") + .initForEliteFour(signatureSpecies["LANCE"], true, PokemonType.DRAGON) + .setBattleBgm("battle_kanto_gym") + .setMixedBattleBgm("battle_kanto_gym"), + [TrainerType.WILL]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["WILL"], true, PokemonType.PSYCHIC) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.KOGA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["KOGA"], true, PokemonType.POISON) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.KAREN]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["KAREN"], false, PokemonType.DARK) + .setBattleBgm("battle_johto_gym") + .setMixedBattleBgm("battle_johto_gym"), + [TrainerType.SIDNEY]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["SIDNEY"], true, PokemonType.DARK) + .setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.PHOEBE]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["PHOEBE"], false, PokemonType.GHOST) + .setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.GLACIA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["GLACIA"], false, PokemonType.ICE) + .setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.DRAKE]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["DRAKE"], true, PokemonType.DRAGON) + .setMixedBattleBgm("battle_hoenn_elite"), + [TrainerType.AARON]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["AARON"], true, PokemonType.BUG) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.BERTHA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["BERTHA"], false, PokemonType.GROUND) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.FLINT]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["FLINT"], true, PokemonType.FIRE, 3) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.LUCIAN]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["LUCIAN"], true, PokemonType.PSYCHIC) + .setBattleBgm("battle_sinnoh_gym") + .setMixedBattleBgm("battle_sinnoh_gym"), + [TrainerType.SHAUNTAL]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["SHAUNTAL"], false, PokemonType.GHOST) + .setMixedBattleBgm("battle_unova_elite"), + [TrainerType.MARSHAL]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["MARSHAL"], true, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_unova_elite"), + [TrainerType.GRIMSLEY]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["GRIMSLEY"], true, PokemonType.DARK) + .setMixedBattleBgm("battle_unova_elite"), + [TrainerType.CAITLIN]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["CAITLIN"], false, PokemonType.PSYCHIC) + .setMixedBattleBgm("battle_unova_elite"), + [TrainerType.MALVA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["MALVA"], false, PokemonType.FIRE) + .setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.SIEBOLD]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["SIEBOLD"], true, PokemonType.WATER) + .setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.WIKSTROM]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["WIKSTROM"], true, PokemonType.STEEL) + .setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.DRASNA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["DRASNA"], false, PokemonType.DRAGON) + .setMixedBattleBgm("battle_kalos_elite"), + [TrainerType.HALA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["HALA"], true, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.MOLAYNE]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["MOLAYNE"], true, PokemonType.STEEL) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.OLIVIA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["OLIVIA"], false, PokemonType.ROCK) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.ACEROLA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["ACEROLA"], false, PokemonType.GHOST) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.KAHILI]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["KAHILI"], false, PokemonType.FLYING) + .setMixedBattleBgm("battle_alola_elite"), + [TrainerType.MARNIE_ELITE]: new TrainerConfig(++t) + .setName("Marnie") + .initForEliteFour(signatureSpecies["MARNIE_ELITE"], false, PokemonType.DARK) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.NESSA_ELITE]: new TrainerConfig(++t) + .setName("Nessa") + .initForEliteFour(signatureSpecies["NESSA_ELITE"], false, PokemonType.WATER) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.BEA_ELITE]: new TrainerConfig(++t) + .setName("Bea") + .initForEliteFour(signatureSpecies["BEA_ELITE"], false, PokemonType.FIGHTING) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t) + .setName("Allister") + .initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, PokemonType.GHOST) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t) + .setName("Raihan") + .initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, PokemonType.DRAGON) + .setMixedBattleBgm("battle_galar_elite"), + [TrainerType.RIKA]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["RIKA"], false, PokemonType.GROUND, 5) + .setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.POPPY]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["POPPY"], false, PokemonType.STEEL, 5) + .setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.LARRY_ELITE]: new TrainerConfig(++t) + .setName("Larry") + .initForEliteFour(signatureSpecies["LARRY_ELITE"], true, PokemonType.FLYING, 5) + .setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.HASSEL]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["HASSEL"], true, PokemonType.DRAGON, 5) + .setMixedBattleBgm("battle_paldea_elite"), + [TrainerType.CRISPIN]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["CRISPIN"], true, PokemonType.FIRE, 5) + .setMixedBattleBgm("battle_bb_elite"), + [TrainerType.AMARYS]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["AMARYS"], false, PokemonType.STEEL, 5) + .setMixedBattleBgm("battle_bb_elite"), + [TrainerType.LACEY]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["LACEY"], false, PokemonType.FAIRY, 5) + .setMixedBattleBgm("battle_bb_elite"), + [TrainerType.DRAYTON]: new TrainerConfig(++t) + .initForEliteFour(signatureSpecies["DRAYTON"], true, PokemonType.DRAGON, 5) + .setMixedBattleBgm("battle_bb_elite"), - [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(signatureSpecies["BLUE"], true).setBattleBgm("battle_kanto_champion").setMixedBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Pidgeot - p.generateAndPopulateMoveset(); - p.generateName(); - })), - [TrainerType.RED]: new TrainerConfig(++t).initForChampion(signatureSpecies["RED"], true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PIKACHU ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 8; // G-Max Pikachu - p.generateAndPopulateMoveset(); - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Venusaur, Mega Charizard X, or Mega Blastoise - p.generateAndPopulateMoveset(); - p.generateName(); - })), - [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(signatureSpecies["LANCE_CHAMPION"], true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AERODACTYL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LATIAS, Species.LATIOS ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Latias or Mega Latios - p.generateAndPopulateMoveset(); - p.generateName(); - })), - [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"], true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SKARMORY ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.METAGROSS ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Metagross - p.generateAndPopulateMoveset(); - p.generateName(); - })), - [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"], true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { - p.abilityIndex = 1; // Drizzle - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.SWAMPERT ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Swampert - p.generateAndPopulateMoveset(); - p.generateName(); - })), - [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(signatureSpecies["CYNTHIA"], false).setBattleBgm("battle_sinnoh_champion").setMixedBattleBgm("battle_sinnoh_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SPIRITOMB ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GARCHOMP ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Garchomp - p.generateAndPopulateMoveset(); - p.generateName(); - })), - [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(signatureSpecies["ALDER"], true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder").setMixedBattleBgm("battle_champion_alder") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BOUFFALANT, Species.BRAVIARY ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })), - [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(signatureSpecies["IRIS"], false).setBattleBgm("battle_champion_iris").setMixedBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.DRUDDIGON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LAPRAS ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // G-Max Lapras - p.generateAndPopulateMoveset(); - p.generateName(); - })), - [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(signatureSpecies["DIANTHA"], false).setMixedBattleBgm("battle_kalos_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GOURGEIST ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GARDEVOIR ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Gardevoir - p.generateAndPopulateMoveset(); - p.generateName(); - })), - [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(signatureSpecies["HAU"], true).setMixedBattleBgm("battle_alola_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALOLA_RAICHU ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })), - [TrainerType.LEON]: new TrainerConfig(++t).initForChampion(signatureSpecies["LEON"], true).setMixedBattleBgm("battle_galar_champion") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.RILLABOOM, Species.CINDERACE, Species.INTELEON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CHARIZARD ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 3; // G-Max Charizard - p.generateAndPopulateMoveset(); - p.generateName(); - })), - [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(signatureSpecies["GEETA"], false).setMixedBattleBgm("battle_champion_geeta") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GLIMMORA ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })), - [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(signatureSpecies["NEMONA"], false).setMixedBattleBgm("battle_champion_nemona") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LYCANROC ], TrainerSlot.TRAINER, true, p => { - p.formIndex = 0; // Midday form - p.generateAndPopulateMoveset(); - })), - [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(signatureSpecies["KIERAN"], true).setMixedBattleBgm("battle_champion_kieran") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.POLIWRATH, Species.POLITOED ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - })), - - [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) - .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL ], TrainerSlot.TRAINER, true)), - [TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2) - .setModifierRewardFuncs(() => modifierTypes.EXP_SHARE) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)), - [TrainerType.RIVAL_3]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_3) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) - .setSpeciesFilter(species => species.baseTotal >= 540), - [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setMixedBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) - .setSpeciesFilter(species => species.baseTotal >= 540) - .setGenModifiersFunc(party => { - const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ starter.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; // TODO: is the bang correct? - }), - [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, - p => p.setBoss(true, 2))) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) - .setSpeciesFilter(species => species.baseTotal >= 540) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 3); - p.pokeball = PokeballType.MASTER_BALL; - p.shiny = true; - p.variant = 1; - })) - .setGenModifiersFunc(party => { - const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ starter.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; //TODO: is the bang correct? - }), - [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, - p => { - p.setBoss(true, 3); + [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)) + .initForChampion(true) + .setBattleBgm("battle_kanto_champion") + .setMixedBattleBgm("battle_kanto_champion") + .setHasDouble("blue_red_double") + .setDoubleTrainerType(TrainerType.RED) + .setDoubleTitle("champion_double") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALAKAZAM])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MACHAMP])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.HO_OH], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true, - p => { + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.RHYPERIOR, Species.ELECTIVIRE, Species.MAGMORTAR])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [Species.ARCANINE, Species.EXEGGUTOR, Species.GYARADOS], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }, + ), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.PIDGEOT], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Pidgeot + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setInstantTera(3), // Tera Ground or Rock Rhyperior / Electric Electivire / Fire Magmortar + [TrainerType.RED]: new TrainerConfig(++t) + .initForChampion(true) + .setBattleBgm("battle_johto_champion") + .setMixedBattleBgm("battle_johto_champion") + .setHasDouble("red_blue_double") + .setDoubleTrainerType(TrainerType.BLUE) + .setDoubleTitle("champion_double") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.PIKACHU], TrainerSlot.TRAINER, true, p => { + p.formIndex = 8; // G-Max Pikachu + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.ESPEON, Species.UMBREON, Species.SYLVEON])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.LUGIA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.SNORLAX], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc( + [Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE], + TrainerSlot.TRAINER, + true, + p => { + p.formIndex = 1; // Mega Venusaur, Mega Charizard X, or Mega Blastoise + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + }, + ), + ) + .setInstantTera(3), // Tera Grass Meganium / Fire Typhlosion / Water Feraligatr + [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t) + .setName("Lance") + .initForChampion(true) + .setBattleBgm("battle_johto_champion") + .setMixedBattleBgm("battle_johto_champion") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GYARADOS, Species.KINGDRA])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.AERODACTYL])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SALAMENCE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Salamence + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.CHARIZARD])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.TYRANITAR, Species.GARCHOMP, Species.KOMMO_O], TrainerSlot.TRAINER, true, p => { + p.teraType = PokemonType.DRAGON; + p.abilityIndex = p.species.speciesId === Species.KOMMO_O ? 1 : 2; // Soundproof Kommo-o, Unnerve Tyranitar, Rough Skin Garchomp + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.DRAGONITE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }), + ) + .setInstantTera(4), // Tera Dragon Tyranitar / Garchomp / Kommo-o + [TrainerType.STEVEN]: new TrainerConfig(++t) + .initForChampion(true) + .setBattleBgm("battle_hoenn_champion_g5") + .setMixedBattleBgm("battle_hoenn_champion_g6") + .setHasDouble("steven_wallace_double") + .setDoubleTrainerType(TrainerType.WALLACE) + .setDoubleTitle("champion_double") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SKARMORY])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CRADILY, Species.ARMALDO])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.AGGRON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GOLURK, Species.RUNERIGUS])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.REGIROCK, Species.REGICE, Species.REGISTEEL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.METAGROSS], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Metagross + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setInstantTera(4), // Tera Rock Regirock / Ice Regice / Steel Registeel + [TrainerType.WALLACE]: new TrainerConfig(++t) + .initForChampion(true) + .setBattleBgm("battle_hoenn_champion_g5") + .setMixedBattleBgm("battle_hoenn_champion_g6") + .setHasDouble("wallace_steven_double") + .setDoubleTrainerType(TrainerType.STEVEN) + .setDoubleTitle("champion_double") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 1; // Drizzle + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LUDICOLO])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.LATIAS, Species.LATIOS], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Latios or Mega Latias + p.generateAndPopulateMoveset(); + p.generateName(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.SWAMPERT, Species.GASTRODON, Species.SEISMITOAD])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.REGIELEKI, Species.REGIDRAGO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.MILOTIC], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + p.setBoss(true, 2); + }), + ) + .setInstantTera(4), // Tera Electric Regieleki / Dragon Regidrago + [TrainerType.CYNTHIA]: new TrainerConfig(++t) + .initForChampion(false) + .setBattleBgm("battle_sinnoh_champion") + .setMixedBattleBgm("battle_sinnoh_champion") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.SPIRITOMB], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LUCARIO])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.GIRATINA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc( + [Species.MILOTIC, Species.ROSERADE, Species.HISUI_ARCANINE], + TrainerSlot.TRAINER, + true, + p => { + p.teraType = p.species.type1; + }, + ), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.TOGEKISS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GARCHOMP], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Garchomp + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.FEMALE; + }), + ) + .setInstantTera(3), // Tera Water Milotic / Grass Roserade / Fire Hisuian Arcanine + [TrainerType.ALDER]: new TrainerConfig(++t) + .initForChampion(true) + .setHasDouble("alder_iris_double") + .setDoubleTrainerType(TrainerType.IRIS) + .setDoubleTitle("champion_double") + .setBattleBgm("battle_champion_alder") + .setMixedBattleBgm("battle_champion_alder") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BOUFFALANT, Species.BRAVIARY])) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [Species.HISUI_LILLIGANT, Species.HISUI_ZOROARK, Species.BASCULEGION], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }, + ), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.ZEKROM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.KELDEO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [Species.CHANDELURE, Species.KROOKODILE, Species.REUNICLUS, Species.CONKELDURR], + TrainerSlot.TRAINER, + true, + p => { + p.teraType = p.species.speciesId === Species.KROOKODILE ? PokemonType.DARK : p.species.type1; + }, + ), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.VOLCARONA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }), + ) + .setInstantTera(4), // Tera Ghost Chandelure / Dark Krookodile / Psychic Reuniclus / Fighting Conkeldurr + [TrainerType.IRIS]: new TrainerConfig(++t) + .initForChampion(false) + .setBattleBgm("battle_champion_iris") + .setMixedBattleBgm("battle_champion_iris") + .setHasDouble("iris_alder_double") + .setDoubleTrainerType(TrainerType.ALDER) + .setDoubleTitle("champion_double") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.DRUDDIGON])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.ARCHEOPS])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.RESHIRAM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc( + [Species.SALAMENCE, Species.HYDREIGON, Species.ARCHALUDON], + TrainerSlot.TRAINER, + true, + p => { + p.teraType = PokemonType.DRAGON; + }, + ), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.LAPRAS], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // G-Max Lapras + p.generateAndPopulateMoveset(); + p.generateName(); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.HAXORUS], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 1; // Mold Breaker + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + p.setBoss(true, 2); + }), + ) + .setInstantTera(3), // Tera Dragon Salamence / Hydreigon / Archaludon + [TrainerType.DIANTHA]: new TrainerConfig(++t) + .initForChampion(false) + .setMixedBattleBgm("battle_kalos_champion") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.HAWLUCHA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.TREVENANT, Species.GOURGEIST])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.XERNEAS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TYRANTRUM, Species.AURORUS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus + p.teraType = p.species.type2!; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.GOODRA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GARDEVOIR], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Gardevoir + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.FEMALE; + }), + ) + .setInstantTera(3), // Tera Dragon Tyrantrum / Ice Aurorus + [TrainerType.KUKUI]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_champion_kukui") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.LYCANROC], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 2; // Dusk Lycanroc + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MAGNEZONE, Species.ALOLA_NINETALES])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc( + [Species.TORNADUS, Species.THUNDURUS, Species.LANDORUS], + TrainerSlot.TRAINER, + true, + p => { + p.formIndex = 1; // Therian Formes + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }, + ), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TAPU_KOKO, Species.TAPU_FINI], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.SNORLAX], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // G-Max Snorlax + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.INCINEROAR, Species.HISUI_DECIDUEYE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.teraType = p.species.type2!; + }), + ) + .setInstantTera(5), // Tera Dark Incineroar / Fighting Hisuian Decidueye + [TrainerType.HAU]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_alola_champion") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ALOLA_RAICHU], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.NOIVERN])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SOLGALEO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TAPU_LELE, Species.TAPU_BULU], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.teraType = p.species.type1; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.ZYGARDE], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Zygarde 10% forme, Aura Break + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.DECIDUEYE, Species.PRIMARINA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + p.gender = p.species.speciesId === Species.PRIMARINA ? Gender.FEMALE : Gender.MALE; + }), + ) + .setInstantTera(3), // Tera Psychic Tapu Lele / Grass Tapu Bulu + [TrainerType.LEON]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_galar_champion") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.AEGISLASH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.RHYPERIOR, Species.SEISMITOAD, Species.MR_RIME])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.ZACIAN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DRAGAPULT])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [Species.RILLABOOM, Species.CINDERACE, Species.INTELEON], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + }, + ), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.CHARIZARD], TrainerSlot.TRAINER, true, p => { + p.formIndex = 3; // G-Max Charizard + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setInstantTera(3), // Tera Dragapult to Ghost or Dragon + [TrainerType.MUSTARD]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_mustard") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CORVIKNIGHT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.KOMMO_O], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.teraType = PokemonType.PSYCHIC; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.GALAR_DARMANITAN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.BLASTOISE, Species.VENUSAUR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.setBoss(true, 2); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.URSHIFU], TrainerSlot.TRAINER, true, p => { + p.formIndex = Utils.randSeedInt(2, 2); // Random G-Max Urshifu + p.generateAndPopulateMoveset(); + p.generateName(); + p.gender = Gender.MALE; + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setInstantTera(2), // Tera Psychic Galar-Slowbro / Galar-Slowking + [TrainerType.GEETA]: new TrainerConfig(++t) + .initForChampion(false) + .setMixedBattleBgm("battle_champion_geeta") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.GLIMMORA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.ESPATHRA, Species.VELUZA])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.MIRAIDON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.BAXCALIBUR])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA])) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.KINGAMBIT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Supreme Overlord + p.teraType = PokemonType.FLYING; + }), + ) + .setInstantTera(5), // Tera Flying Kingambit + [TrainerType.NEMONA]: new TrainerConfig(++t) + .initForChampion(false) + .setMixedBattleBgm("battle_champion_nemona") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.LYCANROC], TrainerSlot.TRAINER, true, p => { + p.formIndex = 0; // Midday form + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PAWMOT])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.KORAIDON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GHOLDENGO])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.ARMAROUGE, Species.CERULEDGE], TrainerSlot.TRAINER, true, p => { + p.teraType = p.species.type2!; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc( + [Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }, + ), + ) + .setInstantTera(4), // Tera Psychic Armarouge / Ghost Ceruledge + [TrainerType.KIERAN]: new TrainerConfig(++t) + .initForChampion(true) + .setMixedBattleBgm("battle_champion_kieran") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.POLIWRATH, Species.POLITOED], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.INCINEROAR, Species.GRIMMSNARL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = p.species.speciesId === Species.INCINEROAR ? 2 : 0; // Intimidate Incineroar, Prankster Grimmsnarl + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.TERAPAGOS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.URSALUNA, Species.BLOODMOON_URSALUNA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.OGERPON], TrainerSlot.TRAINER, true, p => { + p.formIndex = Utils.randSeedInt(4); // Random Ogerpon Tera Mask + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.IVY_CUDGEL)) { + // Check if Ivy Cudgel is in the moveset, if not, replace the first move with Ivy Cudgel. + p.moveset[0] = new PokemonMove(Moves.IVY_CUDGEL); + } + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.HYDRAPPLE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.setBoss(true, 2); + }), + ) + .setInstantTera(4), // Tera Ogerpon + + [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setStaticParty() + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival") + .setMixedBattleBgm("battle_rival") + .setPartyTemplates(trainerPartyTemplates.RIVAL) + .setModifierRewardFuncs( + () => modifierTypes.SUPER_EXP_CHARM, + () => modifierTypes.EXP_SHARE, + ) + .setEventModifierRewardFuncs( + () => modifierTypes.SHINY_CHARM, + () => modifierTypes.ABILITY_CHARM, + () => modifierTypes.CATCHING_CHARM, + ) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.BULBASAUR, + Species.CHARMANDER, + Species.SQUIRTLE, + Species.CHIKORITA, + Species.CYNDAQUIL, + Species.TOTODILE, + Species.TREECKO, + Species.TORCHIC, + Species.MUDKIP, + Species.TURTWIG, + Species.CHIMCHAR, + Species.PIPLUP, + Species.SNIVY, + Species.TEPIG, + Species.OSHAWOTT, + Species.CHESPIN, + Species.FENNEKIN, + Species.FROAKIE, + Species.ROWLET, + Species.LITTEN, + Species.POPPLIO, + Species.GROOKEY, + Species.SCORBUNNY, + Species.SOBBLE, + Species.SPRIGATITO, + Species.FUECOCO, + Species.QUAXLY, + ], + TrainerSlot.TRAINER, + true, + p => (p.abilityIndex = 0), + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEY, + Species.HOOTHOOT, + Species.TAILLOW, + Species.STARLY, + Species.PIDOVE, + Species.FLETCHLING, + Species.PIKIPEK, + Species.ROOKIDEE, + Species.WATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ), + [TrainerType.RIVAL_2]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setStaticParty() + .setMoneyMultiplier(1.25) + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival") + .setMixedBattleBgm("battle_rival") + .setPartyTemplates(trainerPartyTemplates.RIVAL_2) + .setModifierRewardFuncs(() => modifierTypes.EXP_SHARE) + .setEventModifierRewardFuncs(() => modifierTypes.SHINY_CHARM) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.IVYSAUR, + Species.CHARMELEON, + Species.WARTORTLE, + Species.BAYLEEF, + Species.QUILAVA, + Species.CROCONAW, + Species.GROVYLE, + Species.COMBUSKEN, + Species.MARSHTOMP, + Species.GROTLE, + Species.MONFERNO, + Species.PRINPLUP, + Species.SERVINE, + Species.PIGNITE, + Species.DEWOTT, + Species.QUILLADIN, + Species.BRAIXEN, + Species.FROGADIER, + Species.DARTRIX, + Species.TORRACAT, + Species.BRIONNE, + Species.THWACKEY, + Species.RABOOT, + Species.DRIZZILE, + Species.FLORAGATO, + Species.CROCALOR, + Species.QUAXWELL, + ], + TrainerSlot.TRAINER, + true, + p => (p.abilityIndex = 0), + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOTTO, + Species.HOOTHOOT, + Species.TAILLOW, + Species.STARAVIA, + Species.TRANQUILL, + Species.FLETCHINDER, + Species.TRUMBEAK, + Species.CORVISQUIRE, + Species.WATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ), + [TrainerType.RIVAL_3]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setStaticParty() + .setMoneyMultiplier(1.5) + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival") + .setMixedBattleBgm("battle_rival") + .setPartyTemplates(trainerPartyTemplates.RIVAL_3) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.VENUSAUR, + Species.CHARIZARD, + Species.BLASTOISE, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.FERALIGATR, + Species.SCEPTILE, + Species.BLAZIKEN, + Species.SWAMPERT, + Species.TORTERRA, + Species.INFERNAPE, + Species.EMPOLEON, + Species.SERPERIOR, + Species.EMBOAR, + Species.SAMUROTT, + Species.CHESNAUGHT, + Species.DELPHOX, + Species.GRENINJA, + Species.DECIDUEYE, + Species.INCINEROAR, + Species.PRIMARINA, + Species.RILLABOOM, + Species.CINDERACE, + Species.INTELEON, + Species.MEOWSCARADA, + Species.SKELEDIRGE, + Species.QUAQUAVAL, + ], + TrainerSlot.TRAINER, + true, + p => (p.abilityIndex = 0), + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOT, + Species.NOCTOWL, + Species.SWELLOW, + Species.STARAPTOR, + Species.UNFEZANT, + Species.TALONFLAME, + Species.TOUCANNON, + Species.CORVIKNIGHT, + Species.KILOWATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ) + .setSpeciesFilter(species => species.baseTotal >= 540), + [TrainerType.RIVAL_4]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setBoss() + .setStaticParty() + .setMoneyMultiplier(1.75) + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival_2") + .setMixedBattleBgm("battle_rival_2") + .setPartyTemplates(trainerPartyTemplates.RIVAL_4) + .setModifierRewardFuncs(() => modifierTypes.TERA_ORB) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.VENUSAUR, + Species.CHARIZARD, + Species.BLASTOISE, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.FERALIGATR, + Species.SCEPTILE, + Species.BLAZIKEN, + Species.SWAMPERT, + Species.TORTERRA, + Species.INFERNAPE, + Species.EMPOLEON, + Species.SERPERIOR, + Species.EMBOAR, + Species.SAMUROTT, + Species.CHESNAUGHT, + Species.DELPHOX, + Species.GRENINJA, + Species.DECIDUEYE, + Species.INCINEROAR, + Species.PRIMARINA, + Species.RILLABOOM, + Species.CINDERACE, + Species.INTELEON, + Species.MEOWSCARADA, + Species.SKELEDIRGE, + Species.QUAQUAVAL, + ], + TrainerSlot.TRAINER, + true, + p => { + p.abilityIndex = 0; + p.teraType = p.species.type1; + }, + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOT, + Species.NOCTOWL, + Species.SWELLOW, + Species.STARAPTOR, + Species.UNFEZANT, + Species.TALONFLAME, + Species.TOUCANNON, + Species.CORVIKNIGHT, + Species.KILOWATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ) + .setSpeciesFilter(species => species.baseTotal >= 540) + .setInstantTera(0), // Tera starter to primary type + [TrainerType.RIVAL_5]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setBoss() + .setStaticParty() + .setMoneyMultiplier(2.25) + .setEncounterBgm(TrainerType.RIVAL) + .setBattleBgm("battle_rival_3") + .setMixedBattleBgm("battle_rival_3") + .setPartyTemplates(trainerPartyTemplates.RIVAL_5) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.VENUSAUR, + Species.CHARIZARD, + Species.BLASTOISE, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.FERALIGATR, + Species.SCEPTILE, + Species.BLAZIKEN, + Species.SWAMPERT, + Species.TORTERRA, + Species.INFERNAPE, + Species.EMPOLEON, + Species.SERPERIOR, + Species.EMBOAR, + Species.SAMUROTT, + Species.CHESNAUGHT, + Species.DELPHOX, + Species.GRENINJA, + Species.DECIDUEYE, + Species.INCINEROAR, + Species.PRIMARINA, + Species.RILLABOOM, + Species.CINDERACE, + Species.INTELEON, + Species.MEOWSCARADA, + Species.SKELEDIRGE, + Species.QUAQUAVAL, + ], + TrainerSlot.TRAINER, + true, + p => { + p.setBoss(true, 2); + p.abilityIndex = 0; + p.teraType = p.species.type1; + }, + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOT, + Species.NOCTOWL, + Species.SWELLOW, + Species.STARAPTOR, + Species.UNFEZANT, + Species.TALONFLAME, + Species.TOUCANNON, + Species.CORVIKNIGHT, + Species.KILOWATTREL, + ], + TrainerSlot.TRAINER, + true, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ) + .setSpeciesFilter(species => species.baseTotal >= 540) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.pokeball = PokeballType.MASTER_BALL; + p.shiny = true; + p.variant = 1; + }), + ) + .setInstantTera(0), // Tera starter to primary type + [TrainerType.RIVAL_6]: new TrainerConfig(++t) + .setName("Finn") + .setHasGenders("Ivy") + .setHasCharSprite() + .setTitle("Rival") + .setBoss() + .setStaticParty() + .setMoneyMultiplier(3) + .setEncounterBgm("final") + .setBattleBgm("battle_rival_3") + .setMixedBattleBgm("battle_rival_3") + .setPartyTemplates(trainerPartyTemplates.RIVAL_6) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc( + [ + Species.VENUSAUR, + Species.CHARIZARD, + Species.BLASTOISE, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.FERALIGATR, + Species.SCEPTILE, + Species.BLAZIKEN, + Species.SWAMPERT, + Species.TORTERRA, + Species.INFERNAPE, + Species.EMPOLEON, + Species.SERPERIOR, + Species.EMBOAR, + Species.SAMUROTT, + Species.CHESNAUGHT, + Species.DELPHOX, + Species.GRENINJA, + Species.DECIDUEYE, + Species.INCINEROAR, + Species.PRIMARINA, + Species.RILLABOOM, + Species.CINDERACE, + Species.INTELEON, + Species.MEOWSCARADA, + Species.SKELEDIRGE, + Species.QUAQUAVAL, + ], + TrainerSlot.TRAINER, + true, + p => { + p.setBoss(true, 3); + p.abilityIndex = 0; + p.teraType = p.species.type1; + p.generateAndPopulateMoveset(); + }, + ), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc( + [ + Species.PIDGEOT, + Species.NOCTOWL, + Species.SWELLOW, + Species.STARAPTOR, + Species.UNFEZANT, + Species.TALONFLAME, + Species.TOUCANNON, + Species.CORVIKNIGHT, + Species.KILOWATTREL, + ], + TrainerSlot.TRAINER, + true, + p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + }, + ), + ) + .setPartyMemberFunc( + 2, + getSpeciesFilterRandomPartyMemberFunc( + (species: PokemonSpecies) => + !pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + species.baseTotal >= 450, + ), + ) + .setSpeciesFilter(species => species.baseTotal >= 540) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => { + p.setBoss(); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + p.shiny = true; + p.variant = 1; + p.formIndex = 1; // Mega Rayquaza + p.generateName(); + }), + ) + .setInstantTera(0), // Tera starter to primary type + + [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig((t = TrainerType.ROCKET_BOSS_GIOVANNI_1)) + .setName("Giovanni") + .initForEvilTeamLeader("Rocket Boss", []) + .setMixedBattleBgm("battle_rocket_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.PERSIAN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.DUGTRIO, Species.ALOLA_DUGTRIO])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.HONCHKROW])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.NIDOQUEEN, Species.NIDOKING])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.RHYPERIOR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.KANGASKHAN], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) - .setSpeciesFilter(species => species.baseTotal >= 540) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - p.shiny = true; - p.variant = 1; - p.formIndex = 1; // Mega Rayquaza - p.generateName(); - })) - .setGenModifiersFunc(party => { - const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ starter.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; // TODO: is the bang correct? - }), - - [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN, Species.ALOLA_PERSIAN ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DUGTRIO, Species.ALOLA_DUGTRIO ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HONCHKROW ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.NIDOKING, Species.NIDOQUEEN ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Kangaskhan - p.generateName(); - })), - [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.IRON_THORNS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.EXCADRILL, Species.GARCHOMP ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Kangaskhan - p.generateName(); - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => { - //Storm Drain Gastrodon, Water Absorb Seismitoad - if (p.species.speciesId === Species.GASTRODON) { - p.abilityIndex = 0; - } else if (p.species.speciesId === Species.SEISMITOAD) { - p.abilityIndex = 2; - } - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MEWTWO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss", []).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIGHTYENA ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.WEEZING, Species.GALAR_WEEZING ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MAGMORTAR, Species.TORKOAL ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.FLYGON ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Camerupt - p.generateName(); - p.gender = Gender.MALE; - })), - [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK, Species.TYPHLOSION ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.TORKOAL, Species.NINETALES ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Drought - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SHIFTRY, Species.SCOVILLAIN ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 0; // Chlorophyll - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Camerupt - p.generateName(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", []).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LINOONE ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.PELIPPER ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MUK, Species.ALOLA_MUK ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TENTACRUEL ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RELICANTH, Species.WAILORD ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Sharpedo - p.generateName(); - p.gender = Gender.MALE; - })), - [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.EMPOLEON, Species.LUDICOLO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Drizzle - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.BEARTIC, Species.ARMALDO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Swift Swim - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.OVERQWIL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Swift Swim - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Sharpedo - p.generateName(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", []).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Houndoom - p.generateName(); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.MALE; - })), - [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", [], true).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ELECTRODE, Species.HISUI_ELECTRODE ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.ROARING_MOON ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Houndoom - p.generateName(); - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.WEAVILE, Species.SNEASLER ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DARKRAI ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", []).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.COFAGRIGUS, Species.RUNERIGUS ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BOUFFALANT ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SEISMITOAD, Species.CARRACOSTA ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.EELEKTROSS, Species.GALVANTULA ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.VOLCARONA ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDREIGON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.MALE; - })), - [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", [], true).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GENESECT ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = Utils.randSeedInt(4, 1); // Shock, Burn, Chill, or Douse Drive - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BASCULEGION, Species.JELLICENT ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - p.formIndex = 0; - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.SLITHER_WING ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - if (p.species.speciesId === Species.HYDREIGON) { + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Kangaskhan + p.generateName(); + }), + ), + [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t) + .setName("Giovanni") + .initForEvilTeamLeader("Rocket Boss", [], true) + .setMixedBattleBgm("battle_rocket_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.TYRANITAR], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.GASTRODON, Species.SEISMITOAD], TrainerSlot.TRAINER, true, p => { + if (p.species.speciesId === Species.GASTRODON) { + p.abilityIndex = 0; // Storm Drain + } else if (p.species.speciesId === Species.SEISMITOAD) { + p.abilityIndex = 2; // Water Absorb + } + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.GARCHOMP, Species.EXCADRILL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + if (p.species.speciesId === Species.GARCHOMP) { + p.abilityIndex = 2; // Rough Skin + } else if (p.species.speciesId === Species.EXCADRILL) { + p.abilityIndex = 0; // Sand Rush + } + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.RHYPERIOR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.KANGASKHAN], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Kangaskhan + p.generateName(); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.MEWTWO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.MAXIE]: new TrainerConfig(++t) + .setName("Maxie") + .initForEvilTeamLeader("Magma Boss", []) + .setMixedBattleBgm("battle_aqua_magma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SOLROCK])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.TALONFLAME])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.WEEZING, Species.GALAR_WEEZING])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TORKOAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Drought + }), + ) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.DONPHAN])) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.CAMERUPT], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Camerupt + p.generateName(); p.gender = Gender.MALE; - } else if (p.species.speciesId === Species.IRON_JUGULIS) { - p.gender = Gender.GENDERLESS; - } - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", []).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CLAWITZER, Species.DRAGALGE ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HELIOLISK, Species.MALAMAR ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Gyarados - p.generateName(); - p.gender = Gender.MALE; - })), - [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", [], true).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SCREAM_TAIL, Species.FLUTTER_MANE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.IRON_MOTH ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Gyardos - p.generateName(); - p.gender = Gender.MALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.LUSAMINE]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", []).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LILLIGANT, Species.HISUI_LILLIGANT ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BEWEAR ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })), - [TrainerType.LUSAMINE_2]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", [], true).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CLEFABLE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.STAKATAKA, Species.CELESTEELA, Species.GUZZLORD ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PHEROMOSA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NECROZMA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.GUZMA]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", []).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LOKIX, Species.YANMEGA ], TrainerSlot.TRAINER, true, p => { - //Tinted Lens Lokix, Tinted Lens Yanmega - if (p.species.speciesId === Species.LOKIX) { - p.abilityIndex = 2; - } else if (p.species.speciesId === Species.YANMEGA) { - p.abilityIndex = 1; - } - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HERACROSS ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ], TrainerSlot.TRAINER, true, p => { - //Technician Scizor, Sharpness Kleavor - if (p.species.speciesId === Species.SCIZOR) { - p.abilityIndex = 1; - } else if (p.species.speciesId === Species.KLEAVOR) { - p.abilityIndex = 2; - } - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALVANTULA, Species.VIKAVOLT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 1; // Mega Pinsir - p.pokeball = PokeballType.ULTRA_BALL; - p.generateName(); - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; - p.pokeball = PokeballType.ULTRA_BALL; - })), - [TrainerType.GUZMA_2]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", [], true).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; //Anticipation - p.gender = Gender.MALE; - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ], TrainerSlot.TRAINER, true, p => { - //Technician Scizor, Sharpness Kleavor - if (p.species.speciesId === Species.SCIZOR) { - p.abilityIndex = 1; - } else if (p.species.speciesId === Species.KLEAVOR) { - p.abilityIndex = 2; - } - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HISUI_SAMUROTT, Species.CRAWDAUNT ], TrainerSlot.TRAINER, true, p => { - p.abilityIndex = 2; //Sharpness Hisui Samurott, Adaptability Crawdaunt - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.BUZZWOLE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.formIndex = 1; - p.generateAndPopulateMoveset(); - p.generateName(); - p.pokeball = PokeballType.ULTRA_BALL; - })), - [TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.FERROTHORN, Species.ESCAVALIER ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PERRSERKER, Species.KLINKLANG ])) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 1; // G-Max Copperajah - p.generateName(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.FEMALE; - })), - [TrainerType.ROSE_2]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", [], true).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOVISH, Species.DRACOZOLT ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; //Strong Jaw Dracovish, Hustle Dracozolt - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 1; // G-Max Copperajah - p.generateName(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.FEMALE; - })), - [TrainerType.PENNY]: new TrainerConfig(++t).setName("Cassiopeia").initForEvilTeamLeader("Star Boss", []).setMixedBattleBgm("battle_star_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VAPOREON, Species.JOLTEON, Species.FLAREON ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESPEON, Species.UMBREON ], TrainerSlot.TRAINER, true, p => { - p.abilityIndex = 2; // Magic Bounce Espeon, Inner Focus Umbreon - p.generateAndPopulateMoveset(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.LEAFEON, Species.GLACEON ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.ROTOM ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = Utils.randSeedInt(5, 1); // Heat, Wash, Frost, Fan, or Mow - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SYLVEON ], TrainerSlot.TRAINER, true, p => { - p.abilityIndex = 2; // Pixilate - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.EEVEE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 2; // G-Max Eevee - p.pokeball = PokeballType.ULTRA_BALL; - p.generateName(); - })) - .setGenModifiersFunc(party => { - const teraPokemon = party[4]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; //TODO: is the bang correct? - }), - [TrainerType.PENNY_2]: new TrainerConfig(++t).setName("Cassiopeia").initForEvilTeamLeader("Star Boss", [], true).setMixedBattleBgm("battle_star_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SYLVEON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.abilityIndex = 2; // Pixilate - p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ENTEI, Species.RAIKOU, Species.SUICUNE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.WALKING_WAKE, Species.GOUGING_FIRE, Species.RAGING_BOLT ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { - p.formIndex = Utils.randSeedInt(5, 1); //Random Starmobile form - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.EEVEE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 2; - p.generateName(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.ZAMAZENTA ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setGenModifiersFunc(party => { - const teraPokemon = party[0]; - return [ modifierTypes.TERA_SHARD().generateType([], [ teraPokemon.species.type1 ])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(teraPokemon) as PersistentModifier ]; //TODO: is the bang correct? - }), - [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer([], true) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 3); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.COALOSSAL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - if (p.species.speciesId === Species.VENUSAUR) { - p.formIndex = 2; // Gmax - p.abilityIndex = 2; // Venusaur gets Chlorophyll - } else { + }), + ), + [TrainerType.MAXIE_2]: new TrainerConfig(++t) + .setName("Maxie") + .initForEvilTeamLeader("Magma Boss", [], true) + .setMixedBattleBgm("battle_aqua_magma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.TYPHLOSION, Species.SOLROCK], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.NINETALES, Species.TORKOAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.NINETALES) { + p.abilityIndex = 2; // Drought + } else if (p.species.speciesId === Species.TORKOAL) { + p.abilityIndex = 1; // Drought + } + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SCOVILLAIN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 0; // Chlorophyll + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.GREAT_TUSK], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.CAMERUPT], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Camerupt + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GROUDON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.ARCHIE]: new TrainerConfig(++t) + .setName("Archie") + .initForEvilTeamLeader("Aqua Boss", []) + .setMixedBattleBgm("battle_aqua_magma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.LUDICOLO])) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Drizzle + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MUK, Species.ALOLA_MUK])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.WAILORD])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.QWILFISH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Swift Swim + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Sharpedo + p.generateName(); + p.gender = Gender.MALE; + }), + ), + [TrainerType.ARCHIE_2]: new TrainerConfig(++t) + .setName("Archie") + .initForEvilTeamLeader("Aqua Boss", [], true) + .setMixedBattleBgm("battle_aqua_magma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.LUDICOLO, Species.EMPOLEON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.POLITOED, Species.PELIPPER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.POLITOED) { + p.abilityIndex = 2; // Drizzle + } else if (p.species.speciesId === Species.PELIPPER) { + p.abilityIndex = 1; // Drizzle + } + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.DHELMISE])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.OVERQWIL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Swift Swim + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Sharpedo + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.KYOGRE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.CYRUS]: new TrainerConfig(++t) + .setName("Cyrus") + .initForEvilTeamLeader("Galactic Boss", []) + .setMixedBattleBgm("battle_galactic_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GYARADOS])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HONCHKROW, Species.HISUI_BRAVIARY])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MAGNEZONE])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.UXIE, Species.MESPRIT, Species.AZELF])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.HOUNDOOM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Houndoom + p.generateName(); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.WEAVILE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.MALE; + }), + ), + [TrainerType.CYRUS_2]: new TrainerConfig(++t) + .setName("Cyrus") + .initForEvilTeamLeader("Galactic Boss", [], true) + .setMixedBattleBgm("battle_galactic_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CROBAT], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MAGNEZONE])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.UXIE, Species.MESPRIT, Species.AZELF], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.HOUNDOOM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Houndoom + p.generateName(); + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.WEAVILE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.DIALGA, Species.PALKIA], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.GHETSIS]: new TrainerConfig(++t) + .setName("Ghetsis") + .initForEvilTeamLeader("Plasma Boss", []) + .setMixedBattleBgm("battle_plasma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.COFAGRIGUS])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.SEISMITOAD])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.GALVANTULA, Species.EELEKTROSS])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DRAPION, Species.TOXICROAK])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.KINGAMBIT])) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.HYDREIGON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.MALE; + }), + ), + [TrainerType.GHETSIS_2]: new TrainerConfig(++t) + .setName("Ghetsis") + .initForEvilTeamLeader("Plasma Boss", [], true) + .setMixedBattleBgm("battle_plasma_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.RUNERIGUS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.JELLICENT, Species.BASCULEGION], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + p.formIndex = 0; + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.KINGAMBIT])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.VOLCARONA, Species.IRON_MOTH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.HYDREIGON, Species.IRON_JUGULIS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + if (p.species.speciesId === Species.HYDREIGON) { + p.gender = Gender.MALE; + } else if (p.species.speciesId === Species.IRON_JUGULIS) { + p.gender = Gender.GENDERLESS; + } + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.KYUREM], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.LYSANDRE]: new TrainerConfig(++t) + .setName("Lysandre") + .initForEvilTeamLeader("Flare Boss", []) + .setMixedBattleBgm("battle_flare_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.MIENSHAO])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HONCHKROW, Species.TALONFLAME])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.PYROAR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.DRAGALGE, Species.CLAWITZER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.GALLADE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Sharpness + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GYARADOS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Gyarados + p.generateName(); + p.gender = Gender.MALE; + }), + ), + [TrainerType.LYSANDRE_2]: new TrainerConfig(++t) + .setName("Lysandre") + .initForEvilTeamLeader("Flare Boss", [], true) + .setMixedBattleBgm("battle_flare_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.PYROAR], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.DRAGALGE, Species.CLAWITZER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.AEGISLASH, Species.HISUI_GOODRA])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.IRON_VALIANT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.GYARADOS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; // Mega Gyarados + p.generateName(); + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.ZYGARDE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + p.formIndex = 0; // 50% Forme, Aura Break + }), + ), + [TrainerType.LUSAMINE]: new TrainerConfig(++t) + .setName("Lusamine") + .initForEvilTeamLeader("Aether Boss", []) + .setMixedBattleBgm("battle_aether_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CLEFABLE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LILLIGANT, Species.HISUI_LILLIGANT])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MILOTIC, Species.PRIMARINA])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.BEWEAR])) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.NIHILEGO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ), + [TrainerType.LUSAMINE_2]: new TrainerConfig(++t) + .setName("Lusamine") + .initForEvilTeamLeader("Aether Boss", [], true) + .setMixedBattleBgm("battle_aether_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CLEFABLE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MILOTIC, Species.PRIMARINA])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SILVALLY], TrainerSlot.TRAINER, true, p => { + p.formIndex = Utils.randSeedInt(18); // Random Silvally Form + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.MULTI_ATTACK)) { + // Check if Multi Attack is in the moveset, if not, replace the first move with Multi Attack. + p.moveset[0] = new PokemonMove(Moves.MULTI_ATTACK); + } + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.PHEROMOSA], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.NIHILEGO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.NECROZMA], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 2; // Dawn Wings + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.GUZMA]: new TrainerConfig(++t) + .setName("Guzma") + .initForEvilTeamLeader("Skull Boss", []) + .setMixedBattleBgm("battle_skull_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.YANMEGA, Species.LOKIX], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.YANMEGA) { + p.abilityIndex = 1; // Tinted Lens + } else if (p.species.speciesId === Species.LOKIX) { + p.abilityIndex = 2; // Tinted Lens + } + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HERACROSS])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SCIZOR, Species.KLEAVOR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.SCIZOR) { + p.abilityIndex = 1; // Technician + } else if (p.species.speciesId === Species.KLEAVOR) { + p.abilityIndex = 2; // Sharpness + } + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GALVANTULA, Species.VIKAVOLT])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.PINSIR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega Pinsir + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.GOLISOPOD], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.gender = Gender.MALE; + }), + ), + [TrainerType.GUZMA_2]: new TrainerConfig(++t) + .setName("Guzma") + .initForEvilTeamLeader("Skull Boss", [], true) + .setMixedBattleBgm("battle_skull_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.GOLISOPOD], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Anticipation + p.gender = Gender.MALE; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.BUZZWOLE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.CRAWDAUNT, Species.HISUI_SAMUROTT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Sharpness Hisuian Samurott, Adaptability Crawdaunt + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.XURKITREE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.GENESECT], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = Utils.randSeedInt(4, 1); // Shock, Burn, Chill, or Douse Drive + if (!p.moveset.some(move => !Utils.isNullOrUndefined(move) && move.moveId === Moves.TECHNO_BLAST)) { + // Check if Techno Blast is in the moveset, if not, replace the first move with Techno Blast. + p.moveset[0] = new PokemonMove(Moves.TECHNO_BLAST); + } + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.PINSIR], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 1; // Mega Pinsir + p.generateAndPopulateMoveset(); + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ), + [TrainerType.ROSE]: new TrainerConfig(++t) + .setName("Rose") + .initForEvilTeamLeader("Macro Boss", []) + .setMixedBattleBgm("battle_macro_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ARCHALUDON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.ESCAVALIER, Species.FERROTHORN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.SIRFETCHD, Species.MR_RIME], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.CORVIKNIGHT], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.KLINKLANG, Species.PERRSERKER], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.COPPERAJAH], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; // G-Max Copperajah + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.FEMALE; + }), + ), + [TrainerType.ROSE_2]: new TrainerConfig(++t) + .setName("Rose") + .initForEvilTeamLeader("Macro Boss", [], true) + .setMixedBattleBgm("battle_macro_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ARCHALUDON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.AEGISLASH, Species.GHOLDENGO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.DRACOZOLT, Species.DRACOVISH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Strong Jaw Dracovish, Hustle Dracozolt + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.MELMETAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES], + TrainerSlot.TRAINER, + true, + p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }, + ), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.COPPERAJAH], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; // G-Max Copperajah + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.FEMALE; + }), + ), + [TrainerType.PENNY]: new TrainerConfig(++t) + .setName("Cassiopeia") + .initForEvilTeamLeader("Star Boss", []) + .setMixedBattleBgm("battle_star_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.JOLTEON, Species.LEAFEON])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.VAPOREON, Species.UMBREON])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.ESPEON, Species.GLACEON])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.FLAREON])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.SYLVEON], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 2; // Pixilate + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.EEVEE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 2; // G-Max Eevee + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + }), + ) + .setInstantTera(4), // Tera Fairy Sylveon + [TrainerType.PENNY_2]: new TrainerConfig(++t) + .setName("Cassiopeia") + .initForEvilTeamLeader("Star Boss", [], true) + .setMixedBattleBgm("battle_star_boss") + .setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.SYLVEON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.abilityIndex = 2; // Pixilate + p.generateAndPopulateMoveset(); + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.ROTOM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = Utils.randSeedInt(5, 1); // Heat, Wash, Frost, Fan, or Mow + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.RAIKOU, Species.ENTEI, Species.SUICUNE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.REVAVROOM], TrainerSlot.TRAINER, true, p => { + p.formIndex = Utils.randSeedInt(5, 1); // Random Starmobile form + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }), + ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([Species.ZAMAZENTA], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.EEVEE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 2; + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setInstantTera(0), // Tera Fairy Sylveon + [TrainerType.BUCK]: new TrainerConfig(++t) + .setName("Buck") + .initForStatTrainer(true) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.CLAYDOL], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.VENUSAUR, Species.COALOSSAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + if (p.species.speciesId === Species.VENUSAUR) { + p.formIndex = 2; // Gmax + p.abilityIndex = 2; // Venusaur gets Chlorophyll + } else { + p.formIndex = 1; // Gmax + } + p.generateName(); + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.AGGRON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega + p.generateName(); + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([Species.TORKOAL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Drought + }), + ) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GREAT_TUSK], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.HEATRAN], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.CHERYL]: new TrainerConfig(++t) + .setName("Cheryl") + .initForStatTrainer() + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.BLISSEY], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.SNORLAX, Species.LAPRAS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; p.formIndex = 1; // Gmax - } - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AGGRON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 1; // Mega - p.generateName(); - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Drought - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GREAT_TUSK ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HEATRAN ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.CHERYL]: new TrainerConfig(++t).setName("Cheryl").initForStatTrainer([], false) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BLISSEY ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 3); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.SNORLAX, Species.LAPRAS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - p.formIndex = 1; // Gmax - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AUDINO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 1; // Mega - p.generateName(); - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.IRON_HANDS ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CRESSELIA, Species.ENAMORUS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.ENAMORUS) { - p.formIndex = 1; // Therian p.generateName(); - } - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.MARLEY]: new TrainerConfig(++t).setName("Marley").initForStatTrainer([], false) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCANINE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 3); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CINDERACE, Species.INTELEON ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - p.formIndex = 1; // Gmax - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AERODACTYL ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.formIndex = 1; // Mega - p.generateName(); - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGAPULT ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.IRON_BUNDLE ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.REGIELEKI ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.MIRA]: new TrainerConfig(++t).setName("Mira").initForStatTrainer([], false) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 1; - p.pokeball = PokeballType.ULTRA_BALL; - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GENGAR, Species.HATTERENE ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - p.formIndex = p.species.speciesId === Species.GENGAR ? 2 : 1; // Gmax - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.FLUTTER_MANE ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HYDREIGON ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.MAGNEZONE ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.LATIOS, Species.LATIAS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.RILEY]: new TrainerConfig(++t).setName("Riley").initForStatTrainer([], true) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LUCARIO ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 1; - p.pokeball = PokeballType.ULTRA_BALL; - p.generateName(); - })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.RILLABOOM, Species.CENTISKORCH ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.GREAT_BALL; - p.formIndex = 1; // Gmax - p.generateName(); - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TYRANITAR ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.ROARING_MOON ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.URSALUNA ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.REGIGIGAS, Species.LANDORUS ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - if (p.species.speciesId === Species.LANDORUS) { - p.formIndex = 1; // Therian + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.AUDINO], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega p.generateName(); - } - p.pokeball = PokeballType.MASTER_BALL; - })), - [TrainerType.VICTOR]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Victor") + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GOODRA], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.IRON_HANDS], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.CRESSELIA, Species.ENAMORUS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.ENAMORUS) { + p.formIndex = 1; // Therian + p.generateName(); + } + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.MARLEY]: new TrainerConfig(++t) + .setName("Marley") + .initForStatTrainer() + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ARCANINE], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.CINDERACE, Species.INTELEON], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = 1; // Gmax + p.generateName(); + }), + ) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([Species.AERODACTYL], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega + p.generateName(); + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DRAGAPULT], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.IRON_BUNDLE], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.REGIELEKI], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.MIRA]: new TrainerConfig(++t) + .setName("Mira") + .initForStatTrainer() + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.ALAKAZAM], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.GENGAR, Species.HATTERENE], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = p.species.speciesId === Species.GENGAR ? 2 : 1; // Gmax + p.generateName(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.FLUTTER_MANE], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.HYDREIGON], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.MAGNEZONE], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.LATIOS, Species.LATIAS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.RILEY]: new TrainerConfig(++t) + .setName("Riley") + .initForStatTrainer(true) + .setPartyMemberFunc( + 0, + getRandomPartyMemberFunc([Species.LUCARIO], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + }), + ) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([Species.RILLABOOM, Species.CENTISKORCH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = 1; // Gmax + p.generateName(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.TYRANITAR], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.ROARING_MOON], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.URSALUNA], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([Species.REGIGIGAS, Species.LANDORUS], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.LANDORUS) { + p.formIndex = 1; // Therian + p.generateName(); + } + p.pokeball = PokeballType.MASTER_BALL; + }), + ), + [TrainerType.VICTOR]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Victor") .setMoneyMultiplier(1) // The Winstrate trainers have total money multiplier of 6 .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), - [TrainerType.VICTORIA]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Victoria") + [TrainerType.VICTORIA]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Victoria") .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), - [TrainerType.VIVI]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vivi") + [TrainerType.VIVI]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Vivi") .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.TWO_AVG_ONE_STRONG), - [TrainerType.VICKY]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vicky") + [TrainerType.VICKY]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Vicky") .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.ONE_AVG), - [TrainerType.VITO]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vito") + [TrainerType.VITO]: new TrainerConfig(++t) + .setTitle("The Winstrates") + .setLocalizedName("Vito") .setMoneyMultiplier(2) - .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG))), - [TrainerType.BUG_TYPE_SUPERFAN]: new TrainerConfig(++t).setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) + .setPartyTemplates( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), + ), + ), + [TrainerType.BUG_TYPE_SUPERFAN]: new TrainerConfig(++t) + .setMoneyMultiplier(2.25) + .setEncounterBgm(TrainerType.ACE_TRAINER) .setPartyTemplates(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE)), - [TrainerType.EXPERT_POKEMON_BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(3).setEncounterBgm(TrainerType.ACE_TRAINER).setLocalizedName("Expert Pokemon Breeder") + [TrainerType.EXPERT_POKEMON_BREEDER]: new TrainerConfig(++t) + .setMoneyMultiplier(3) + .setEncounterBgm(TrainerType.ACE_TRAINER) + .setLocalizedName("Expert Pokemon Breeder") .setPartyTemplates(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE)), [TrainerType.FUTURE_SELF_M]: new TrainerConfig(++t) .setMoneyMultiplier(0) @@ -2516,6 +5846,5 @@ export const trainerConfigs: TrainerConfigs = { .setMixedBattleBgm("mystery_encounter_weird_dream") .setVictoryBgm("mystery_encounter_weird_dream") .setLocalizedName("Future Self F") - .setPartyTemplates(new TrainerPartyTemplate(6, PartyMemberStrength.STRONG)) + .setPartyTemplates(new TrainerPartyTemplate(6, PartyMemberStrength.STRONG)), }; - diff --git a/src/data/trainer-names.ts b/src/data/trainer-names.ts index d075b7121f2..c72356d88ae 100644 --- a/src/data/trainer-names.ts +++ b/src/data/trainer-names.ts @@ -6,7 +6,7 @@ class TrainerNameConfig { public femaleUrls: string[] | null; constructor(type: TrainerType, ...urls: string[]) { - this.urls = urls.length ? urls : [ Utils.toReadableString(TrainerType[type]).replace(/ /g, "_") ]; + this.urls = urls.length ? urls : [Utils.toReadableString(TrainerType[type]).replace(/ /g, "_")]; } hasGenderVariant(...femaleUrls: string[]): TrainerNameConfig { @@ -16,11 +16,11 @@ class TrainerNameConfig { } interface TrainerNameConfigs { - [key: integer]: TrainerNameConfig + [key: number]: TrainerNameConfig; } // used in a commented code -// eslint-disable-next-line @typescript-eslint/no-unused-vars +// biome-ignore lint/correctness/noUnusedVariables: Used by commented code const trainerNameConfigs: TrainerNameConfigs = { [TrainerType.ACE_TRAINER]: new TrainerNameConfig(TrainerType.ACE_TRAINER), [TrainerType.ARTIST]: new TrainerNameConfig(TrainerType.ARTIST), @@ -71,65 +71,2663 @@ const trainerNameConfigs: TrainerNameConfigs = { [TrainerType.VETERAN]: new TrainerNameConfig(TrainerType.VETERAN), [TrainerType.WAITER]: new TrainerNameConfig(TrainerType.WAITER).hasGenderVariant("Waitress"), [TrainerType.WORKER]: new TrainerNameConfig(TrainerType.WORKER), - [TrainerType.YOUNGSTER]: new TrainerNameConfig(TrainerType.YOUNGSTER).hasGenderVariant("Lass") + [TrainerType.YOUNGSTER]: new TrainerNameConfig(TrainerType.YOUNGSTER).hasGenderVariant("Lass"), }; export const trainerNamePools = { - [TrainerType.ACE_TRAINER]: [[ "Aaron", "Allen", "Blake", "Brian", "Gaven", "Jake", "Kevin", "Mike", "Nick", "Paul", "Ryan", "Sean", "Darin", "Albert", "Berke", "Clyde", "Edgar", "George", "Leroy", "Owen", "Parker", "Randall", "Ruben", "Samuel", "Vincent", "Warren", "Wilton", "Zane", "Alfred", "Braxton", "Felix", "Gerald", "Jonathan", "Leonel", "Marcel", "Mitchell", "Quincy", "Roderick", "Colby", "Rolando", "Yuji", "Abel", "Anton", "Arthur", "Cesar", "Dalton", "Dennis", "Ernest", "Garrett", "Graham", "Henry", "Isaiah", "Jonah", "Jose", "Keenan", "Micah", "Omar", "Quinn", "Rodolfo", "Saul", "Sergio", "Skylar", "Stefan", "Zachery", "Alton", "Arabella", "Bonita", "Cal", "Cody", "French", "Kobe", "Paulo", "Shaye", "Austin", "Beckett", "Charlie", "Corky", "David", "Dwayne", "Elmer", "Jesse", "Jared", "Johan", "Jordan", "Kipp", "Lou", "Terry", "Tom", "Webster", "Billy", "Doyle", "Enzio", "Geoff", "Grant", "Kelsey", "Miguel", "Pierce", "Ray", "Santino", "Shel", "Adelbert", "Bence", "Emil", "Evan", "Mathis", "Maxim", "Neil", "Rico", "Robbie", "Theo", "Viktor", "Benedict", "Cornelius", "Hisato", "Leopold", "Neville", "Vito", "Chase", "Cole", "Hiroshi", "Jackson", "Jim", "Kekoa", "Makana", "Yuki", "Elwood", "Seth", "Alvin", "Arjun", "Arnold", "Cameron", "Carl", "Carlton", "Christopher", "Dave", "Dax", "Dominic", "Edmund", "Finn", "Fred", "Garret", "Grayson", "Jace", "Jaxson", "Jay", "Jirard", "Johnson", "Kayden", "Kite", "Louis", "Mac", "Marty", "Percy", "Raymond", "Ronnie", "Satch", "Tim", "Zach", "Conner", "Vince", "Bedro", "Boda", "Botan", "Daras", "Dury", "Herton", "Rewn", "Stum", "Tock", "Trilo", "Berki", "Cruik", "Dazon", "Desid", "Dillot", "Farfin", "Forgon", "Hebel", "Morfon", "Moril", "Shadd", "Vanhub", "Bardo", "Carben", "Degin", "Gorps", "Klept", "Lask", "Malex", "Mopar", "Niled", "Noxon", "Teslor", "Tetil" ], [ "Beth", "Carol", "Cybil", "Emma", "Fran", "Gwen", "Irene", "Jenn", "Joyce", "Kate", "Kelly", "Lois", "Lola", "Megan", "Quinn", "Reena", "Cara", "Alexa", "Brooke", "Caroline", "Elaine", "Hope", "Jennifer", "Jody", "Julie", "Lori", "Mary", "Michelle", "Shannon", "Wendy", "Alexia", "Alicia", "Athena", "Carolina", "Cristin", "Darcy", "Dianne", "Halle", "Jazmyn", "Katelynn", "Keira", "Marley", "Allyson", "Kathleen", "Naomi", "Alyssa", "Ariana", "Brandi", "Breanna", "Brenda", "Brenna", "Catherine", "Clarice", "Dana", "Deanna", "Destiny", "Jamie", "Jasmin", "Kassandra", "Laura", "Maria", "Mariah", "Maya", "Meagan", "Mikayla", "Monique", "Natasha", "Olivia", "Sandra", "Savannah", "Sydney", "Moira", "Piper", "Salma", "Allison", "Beverly", "Cathy", "Cheyenne", "Clara", "Dara", "Eileen", "Glinda", "Junko", "Lena", "Lucille", "Mariana", "Olwen", "Shanta", "Stella", "Angi", "Belle", "Chandra", "Cora", "Eve", "Jacqueline", "Jeanne", "Juliet", "Kathrine", "Layla", "Lucca", "Melina", "Miki", "Nina", "Sable", "Shelly", "Summer", "Trish", "Vicki", "Alanza", "Cordelia", "Hilde", "Imelda", "Michele", "Mireille", "Claudia", "Constance", "Harriet", "Honor", "Melba", "Portia", "Alexis", "Angela", "Karla", "Lindsey", "Tori", "Sheri", "Jada", "Kailee", "Amanda", "Annie", "Kindra", "Kyla", "Sofia", "Yvette", "Becky", "Flora", "Gloria", "Buna", "Ferda", "Lehan", "Liqui", "Lomen", "Neira", "Atilo", "Detta", "Gilly", "Gosney", "Levens", "Moden", "Rask", "Rateis", "Rosno", "Tynan", "Veron", "Zoel", "Cida", "Dibsin", "Dodin", "Ebson", "Equin", "Flostin", "Gabsen", "Halsion", "Hileon", "Quelor", "Rapeel", "Roze", "Tensin" ]], - [TrainerType.ARTIST]: [[ "Ismael", "William", "Horton", "Pierre", "Zach", "Gough", "Salvador", "Vincent", "Duncan" ], [ "Georgia" ]], - [TrainerType.BACKERS]: [[ "Alf & Fred", "Hawk & Dar", "Joe & Ross", "Les & Web", "Masa & Yas", "Stu & Art" ], [ "Ai & Ciel", "Ami & Eira", "Cam & Abby", "Fey & Sue", "Kat & Phae", "Kay & Ali", "Ava & Aya", "Cleo & Rio", "May & Mal" ]], - [TrainerType.BACKPACKER]: [[ "Alexander", "Carlos", "Herman", "Jerome", "Keane", "Kelsey", "Kiyo", "Michael", "Nate", "Peter", "Sam", "Stephen", "Talon", "Terrance", "Toru", "Waylon", "Boone", "Clifford", "Ivan", "Kendall", "Lowell", "Randall", "Reece", "Roland", "Shane", "Walt", "Farid", "Heike", "Joren", "Lane", "Roderick", "Darnell", "Deon", "Emory", "Graeme", "Grayson", "Aitor", "Alex", "Arturo", "Asier", "Jaime", "Jonathan", "Julio", "Kevin", "Kosuke", "Lander", "Markel", "Mateo", "Nil", "Pau", "Samuel" ], [ "Anna", "Corin", "Elaine", "Emi", "Jill", "Kumiko", "Liz", "Lois", "Lora", "Molly", "Patty", "Ruth", "Vicki", "Annie", "Blossom", "Clara", "Eileen", "Mae", "Myra", "Rachel", "Tami", "Ashley", "Mikiko", "Kiana", "Perdy", "Maria", "Yuho", "Peren", "Barbara", "Diane" ]], - [TrainerType.BAKER]: [ "Chris", "Jenn", "Lilly" ], - [TrainerType.BEAUTY]: [ "Cassie", "Julia", "Olivia", "Samantha", "Valerie", "Victoria", "Bridget", "Connie", "Jessica", "Johanna", "Melissa", "Sheila", "Shirley", "Tiffany", "Namiko", "Thalia", "Grace", "Lola", "Lori", "Maura", "Tamia", "Cyndy", "Devon", "Gabriella", "Harley", "Lindsay", "Nicola", "Callie", "Charlotte", "Kassandra", "December", "Fleming", "Nikola", "Aimee", "Anais", "Brigitte", "Cassandra", "Andrea", "Brittney", "Carolyn", "Krystal", "Alexis", "Alice", "Aina", "Anya", "Arianna", "Aubrey", "Beverly", "Camille", "Beauty", "Evette", "Hansol", "Haruka", "Jill", "Jo", "Lana", "Lois", "Lucy", "Mai", "Nickie", "Nicole", "Prita", "Rose", "Shelly", "Suzy", "Tessa", "Anita", "Alissa", "Rita", "Cudsy", "Eloff", "Miru", "Minot", "Nevah", "Niven", "Ogoin" ], - [TrainerType.BIKER]: [ "Charles", "Dwayne", "Glenn", "Harris", "Joel", "Riley", "Zeke", "Alex", "Billy", "Ernest", "Gerald", "Hideo", "Isaac", "Jared", "Jaren", "Jaxon", "Jordy", "Lao", "Lukas", "Malik", "Nikolas", "Ricardo", "Ruben", "Virgil", "William", "Aiden", "Dale", "Dan", "Jacob", "Markey", "Reese", "Teddy", "Theron", "Jeremy", "Morgann", "Phillip", "Philip", "Stanley", "Dillon" ], - [TrainerType.BLACK_BELT]: [[ "Kenji", "Lao", "Lung", "Nob", "Wai", "Yoshi", "Atsushi", "Daisuke", "Hideki", "Hitoshi", "Kiyo", "Koichi", "Koji", "Yuji", "Cristian", "Rhett", "Takao", "Theodore", "Zander", "Aaron", "Hugh", "Mike", "Nicolas", "Shea", "Takashi", "Adam", "Carl", "Colby", "Darren", "David", "Davon", "Derek", "Eddie", "Gregory", "Griffin", "Jarrett", "Jeffery", "Kendal", "Kyle", "Luke", "Miles", "Nathaniel", "Philip", "Rafael", "Ray", "Ricky", "Sean", "Willie", "Ander", "Manford", "Benjamin", "Corey", "Edward", "Grant", "Jay", "Kendrew", "Kentaro", "Ryder", "Teppei", "Thomas", "Tyrone", "Andrey", "Donny", "Drago", "Gordon", "Grigor", "Jeriel", "Kenneth", "Martell", "Mathis", "Rich", "Rocky", "Rodrigo", "Wesley", "Zachery", "Alonzo", "Cadoc", "Gunnar", "Igor", "Killian", "Markus", "Ricardo", "Yanis", "Banting", "Clayton", "Duane", "Earl", "Greg", "Roy", "Terry", "Tracy", "Walter", "Alvaro", "Curtis", "Francis", "Ross", "Brice", "Cheng", "Dudley", "Eric", "Kano", "Masahiro", "Randy", "Ryuji", "Steve", "Tadashi", "Wong", "Yuen", "Brian", "Carter", "Reece", "Nick", "Yang" ], [ "Cora", "Cyndy", "Jill", "Laura", "Sadie", "Tessa", "Vivian", "Aisha", "Callie", "Danielle", "Helene", "Jocelyn", "Lilith", "Paula", "Reyna", "Helen", "Kelsey", "Tyler", "Amy", "Chandra", "Hillary", "Janie", "Lee", "Maggie", "Mikiko", "Miriam", "Sharon", "Susie", "Xiao", "Alize", "Azra", "Brenda", "Chalina", "Chan", "Glinda", "Maki", "Tia", "Tiffany", "Wendy", "Andrea", "Gabrielle", "Gerardine", "Hailey", "Hedvig", "Justine", "Kinsey", "Sigrid", "Veronique", "Tess" ]], - [TrainerType.BREEDER]: [[ "Isaac", "Myles", "Salvadore", "Albert", "Kahlil", "Eustace", "Galen", "Owen", "Addison", "Marcus", "Foster", "Cory", "Glenn", "Jay", "Wesley", "William", "Adrian", "Bradley", "Jaime" ], [ "Allison", "Alize", "Bethany", "Lily", "Lydia", "Gabrielle", "Jayden", "Pat", "Veronica", "Amber", "Jennifer", "Kaylee", "Adelaide", "Brooke", "Ethel", "April", "Irene", "Magnolia", "Amala", "Mercy", "Amanda", "Ikue", "Savannah", "Yuka", "Chloe", "Debra", "Denise", "Elena" ]], - [TrainerType.CLERK]: [[ "Chaz", "Clemens", "Doug", "Fredric", "Ivan", "Isaac", "Nelson", "Wade", "Warren", "Augustin", "Gilligan", "Cody", "Jeremy", "Shane", "Dugal", "Royce", "Ronald" ], [ "Alberta", "Ingrid", "Katie", "Piper", "Trisha", "Wren", "Britney", "Lana", "Jessica", "Kristen", "Michelle", "Gabrielle" ]], - [TrainerType.CYCLIST]: [[ "Axel", "James", "John", "Ryan", "Hector", "Jeremiah" ], [ "Kayla", "Megan", "Nicole", "Rachel", "Krissa", "Adelaide" ]], - [TrainerType.DANCER]: [ "Brian", "Davey", "Dirk", "Edmond", "Mickey", "Raymond", "Cara", "Julia", "Maika", "Mireille", "Ronda", "Zoe" ], - [TrainerType.DEPOT_AGENT]: [ "Josh", "Hank", "Vincent" ], - [TrainerType.DOCTOR]: [[ "Hank", "Jerry", "Jules", "Logan", "Wayne", "Braid", "Derek", "Heath", "Julius", "Kit", "Graham" ], [ "Kirsten", "Sachiko", "Shery", "Carol", "Dixie", "Mariah" ]], - [TrainerType.FIREBREATHER]: [ "Bill", "Burt", "Cliff", "Dick", "Lyle", "Ned", "Otis", "Ray", "Richard", "Walt" ], - [TrainerType.FISHERMAN]: [ "Andre", "Arnold", "Barney", "Chris", "Edgar", "Henry", "Jonah", "Justin", "Kyle", "Martin", "Marvin", "Ralph", "Raymond", "Scott", "Stephen", "Wilton", "Tully", "Andrew", "Barny", "Carter", "Claude", "Dale", "Elliot", "Eugene", "Ivan", "Ned", "Nolan", "Roger", "Ronald", "Wade", "Wayne", "Darian", "Kai", "Chip", "Hank", "Kaden", "Tommy", "Tylor", "Alec", "Brett", "Cameron", "Cody", "Cole", "Cory", "Erick", "George", "Joseph", "Juan", "Kenneth", "Luc", "Miguel", "Travis", "Walter", "Zachary", "Josh", "Gideon", "Kyler", "Liam", "Murphy", "Bruce", "Damon", "Devon", "Hubert", "Jones", "Lydon", "Mick", "Pete", "Sean", "Sid", "Vince", "Bucky", "Dean", "Eustace", "Kenzo", "Leroy", "Mack", "Ryder", "Ewan", "Finn", "Murray", "Seward", "Shad", "Wharton", "Finley", "Fisher", "Fisk", "River", "Sheaffer", "Timin", "Carl", "Ernest", "Hal", "Herbert", "Hisato", "Mike", "Vernon", "Harriet", "Marina", "Chase" ], - [TrainerType.GUITARIST]: [ "Anna", "Beverly", "January", "Tina", "Alicia", "Claudia", "Julia", "Lidia", "Mireia", "Noelia", "Sara", "Sheila", "Tatiana" ], - [TrainerType.HARLEQUIN]: [ "Charley", "Ian", "Jack", "Kerry", "Louis", "Pat", "Paul", "Rick", "Anders", "Clarence", "Gary" ], - [TrainerType.HIKER]: [ "Anthony", "Bailey", "Benjamin", "Daniel", "Erik", "Jim", "Kenny", "Leonard", "Michael", "Parry", "Phillip", "Russell", "Sidney", "Tim", "Timothy", "Alan", "Brice", "Clark", "Eric", "Lenny", "Lucas", "Mike", "Trent", "Devan", "Eli", "Marc", "Sawyer", "Allen", "Daryl", "Dudley", "Earl", "Franklin", "Jeremy", "Marcos", "Nob", "Oliver", "Wayne", "Alexander", "Damon", "Jonathan", "Justin", "Kevin", "Lorenzo", "Louis", "Maurice", "Nicholas", "Reginald", "Robert", "Theodore", "Bruce", "Clarke", "Devin", "Dwight", "Edwin", "Eoin", "Noland", "Russel", "Andy", "Bret", "Darrell", "Gene", "Hardy", "Hugh", "Jebediah", "Jeremiah", "Kit", "Neil", "Terrell", "Don", "Doug", "Hunter", "Jared", "Jerome", "Keith", "Manuel", "Markus", "Otto", "Shelby", "Stephen", "Teppei", "Tobias", "Wade", "Zaiem", "Aaron", "Alain", "Bergin", "Bernard", "Brent", "Corwin", "Craig", "Delmon", "Dunstan", "Orestes", "Ross", "Davian", "Calhoun", "David", "Gabriel", "Ryan", "Thomas", "Travis", "Zachary", "Anuhea", "Barnaby", "Claus", "Collin", "Colson", "Dexter", "Dillan", "Eugine", "Farkas", "Hisato", "Julius", "Kenji", "Irwin", "Lionel", "Paul", "Richter", "Valentino", "Donald", "Douglas", "Kevyn", "Chester" ], //["Angela","Carla","Celia","Daniela","Estela","Fatima","Helena","Leire","Lucia","Luna","Manuela","Mar","Marina","Miyu","Nancy","Nerea","Paula","Rocio","Yanira"] - [TrainerType.HOOLIGANS]: [ "Jim & Cas", "Rob & Sal" ], - [TrainerType.HOOPSTER]: [ "Bobby", "John", "Lamarcus", "Derrick", "Nicolas" ], - [TrainerType.INFIELDER]: [ "Alex", "Connor", "Todd" ], - [TrainerType.JANITOR]: [ "Caleb", "Geoff", "Brady", "Felix", "Orville", "Melvin", "Shawn" ], - [TrainerType.LINEBACKER]: [ "Bob", "Dan", "Jonah" ], - [TrainerType.MAID]: [ "Belinda", "Sophie", "Emily", "Elena", "Clare", "Alica", "Tanya", "Tammy" ], - [TrainerType.MUSICIAN]: [ "Boris", "Preston", "Charles", "Clyde", "Vincent", "Dalton", "Kirk", "Shawn", "Fabian", "Fernando", "Joseph", "Marcos", "Arturo", "Jerry", "Lonnie", "Tony" ], - [TrainerType.NURSERY_AIDE]: [ "Autumn", "Briana", "Leah", "Miho", "Ethel", "Hollie", "Ilse", "June", "Kimya", "Rosalyn" ], - [TrainerType.OFFICER]: [ "Dirk", "Keith", "Alex", "Bobby", "Caleb", "Danny", "Dylan", "Thomas", "Daniel", "Jeff", "Braven", "Dell", "Neagle", "Haruki", "Mitchell", "Raymond" ], - [TrainerType.PARASOL_LADY]: [ "Angelica", "Clarissa", "Madeline", "Akari", "Annabell", "Kayley", "Rachel", "Alexa", "Sabrina", "April", "Gwyneth", "Laura", "Lumi", "Mariah", "Melita", "Nicole", "Tihana", "Ingrid", "Tyra" ], - [TrainerType.PILOT]: [ "Chase", "Leonard", "Ted", "Elron", "Ewing", "Flynn", "Winslow" ], - [TrainerType.POKEFAN]: [[ "Alex", "Allan", "Brandon", "Carter", "Colin", "Derek", "Jeremy", "Joshua", "Rex", "Robert", "Trevor", "William", "Colton", "Miguel", "Francisco", "Kaleb", "Leonard", "Boone", "Elliot", "Jude", "Norbert", "Corey", "Gabe", "Baxter" ], [ "Beverly", "Georgia", "Jaime", "Ruth", "Isabel", "Marissa", "Vanessa", "Annika", "Bethany", "Kimberly", "Meredith", "Rebekah", "Eleanor", "Darcy", "Lydia", "Sachiko", "Abigail", "Agnes", "Lydie", "Roisin", "Tara", "Carmen", "Janet" ]], - [TrainerType.PRESCHOOLER]: [[ "Billy", "Doyle", "Evan", "Homer", "Tully", "Albert", "Buster", "Greg", "Ike", "Jojo", "Tyrone", "Adrian", "Oliver", "Hayden", "Hunter", "Kaleb", "Liam", "Dylan" ], [ "Juliet", "Mia", "Sarah", "Wendy", "Winter", "Chrissy", "Eva", "Lin", "Samantha", "Ella", "Lily", "Natalie", "Ailey", "Hannah", "Malia", "Kindra", "Nancy" ]], - [TrainerType.PSYCHIC]: [[ "Fidel", "Franklin", "Gilbert", "Greg", "Herman", "Jared", "Mark", "Nathan", "Norman", "Phil", "Richard", "Rodney", "Cameron", "Edward", "Fritz", "Joshua", "Preston", "Virgil", "William", "Alvaro", "Blake", "Cedric", "Keenan", "Nicholas", "Dario", "Johan", "Lorenzo", "Tyron", "Bryce", "Corbin", "Deandre", "Elijah", "Kody", "Landon", "Maxwell", "Mitchell", "Sterling", "Eli", "Nelson", "Vernon", "Gaven", "Gerard", "Low", "Micki", "Perry", "Rudolf", "Tommy", "Al", "Nandor", "Tully", "Arthur", "Emanuel", "Franz", "Harry", "Paschal", "Robert", "Sayid", "Angelo", "Anton", "Arin", "Avery", "Danny", "Frasier", "Harrison", "Jaime", "Ross", "Rui", "Vlad", "Mason" ], [ "Alexis", "Hannah", "Jacki", "Jaclyn", "Kayla", "Maura", "Samantha", "Alix", "Brandi", "Edie", "Macey", "Mariella", "Marlene", "Laura", "Rodette", "Abigail", "Brittney", "Chelsey", "Daisy", "Desiree", "Kendra", "Lindsey", "Rachael", "Valencia", "Belle", "Cybil", "Doreen", "Dua", "Future", "Lin", "Madhu", "Alia", "Ena", "Joyce", "Lynette", "Olesia", "Sarah" ]], - [TrainerType.RANGER]: [[ "Carlos", "Jackson", "Sebastian", "Gav", "Lorenzo", "Logan", "Nicolas", "Trenton", "Deshawn", "Dwayne", "Jeffery", "Kyler", "Taylor", "Alain", "Claude", "Crofton", "Forrest", "Harry", "Jaden", "Keith", "Lewis", "Miguel", "Pedro", "Ralph", "Richard", "Bret", "Daryl", "Eddie", "Johan", "Leaf", "Louis", "Maxwell", "Parker", "Rick", "Steve", "Bjorn", "Chaise", "Dean", "Lee", "Maurice", "Nash", "Ralf", "Reed", "Shinobu", "Silas" ], [ "Catherine", "Jenna", "Sophia", "Merdith", "Nora", "Beth", "Chelsea", "Katelyn", "Madeline", "Allison", "Ashlee", "Felicia", "Krista", "Annie", "Audra", "Brenda", "Chloris", "Eliza", "Heidi", "Irene", "Mary", "Mylene", "Shanti", "Shelly", "Thalia", "Anja", "Briana", "Dianna", "Elaine", "Elle", "Hillary", "Katie", "Lena", "Lois", "Malory", "Melita", "Mikiko", "Naoko", "Serenity", "Ambre", "Brooke", "Clementine", "Melina", "Petra", "Twiggy" ]], - [TrainerType.RICH]: [[ "Alfred", "Edward", "Gregory", "Preston", "Thomas", "Tucker", "Walter", "Clifford", "Everett", "Micah", "Nate", "Pierre", "Terrance", "Arthur", "Brooks", "Emanuel", "Lamar", "Jeremy", "Leonardo", "Milton", "Frederic", "Renaud", "Robert", "Yan", "Daniel", "Sheldon", "Stonewall", "Gerald", "Ronald", "Smith", "Stanley", "Reginald", "Orson", "Wilco", "Caden", "Glenn" ], [ "Rebecca", "Reina", "Cassandra", "Emilia", "Grace", "Marian", "Elizabeth", "Kathleen", "Sayuri", "Caroline", "Judy" ]], - [TrainerType.RICH_KID]: [[ "Garret", "Winston", "Dawson", "Enrique", "Jason", "Roman", "Trey", "Liam", "Anthony", "Brad", "Cody", "Manuel", "Martin", "Pierce", "Rolan", "Keenan", "Filbert", "Antoin", "Cyus", "Diek", "Dugo", "Flitz", "Jurek", "Lond", "Perd", "Quint", "Basto", "Benit", "Brot", "Denc", "Guyit", "Marcon", "Perc", "Puros", "Roex", "Sainz", "Symin", "Tark", "Venak" ], [ "Anette", "Brianna", "Cindy", "Colleen", "Daphne", "Elizabeth", "Naomi", "Sarah", "Charlotte", "Gillian", "Jacki", "Lady", "Melissa", "Celeste", "Colette", "Elizandra", "Isabel", "Lynette", "Magnolia", "Sophie", "Lina", "Dulcie", "Auro", "Brin", "Caril", "Eloos", "Gwin", "Illa", "Kowly", "Rima", "Ristin", "Vesey", "Brena", "Deasy", "Denslon", "Kylet", "Nemi", "Rene", "Sanol", "Stouner", "Sturk", "Talmen", "Zoila" ]], - [TrainerType.ROUGHNECK]: [ "Camron", "Corey", "Gabriel", "Isaiah", "Jamal", "Koji", "Luke", "Paxton", "Raul", "Zeek", "Kirby", "Chance", "Dave", "Fletcher", "Johnny", "Reese", "Joey", "Ricky", "Silvester", "Martin" ], - [TrainerType.SAILOR]: [ "Alberto", "Bost", "Brennan", "Brenden", "Claude", "Cory", "Damian", "Dirk", "Duncan", "Dwayne", "Dylan", "Eddie", "Edmond", "Elijah", "Ernest", "Eugene", "Garrett", "Golos", "Gratin", "Grestly", "Harry", "Hols", "Hudson", "Huey", "Jebol", "Jeff", "Leonald", "Luther", "Kelvin", "Kenneth", "Kent", "Knook", "Marc", "Mifis", "Monar", "Morkor", "Ordes", "Oxlin", "Parker", "Paul", "Philip", "Roberto", "Samson", "Skyler", "Stanly", "Tebu", "Terrell", "Trevor", "Yasu", "Zachariah" ], - [TrainerType.SCIENTIST]: [[ "Jed", "Marc", "Mitch", "Rich", "Ross", "Beau", "Braydon", "Connor", "Ed", "Ivan", "Jerry", "Jose", "Joshua", "Parker", "Rodney", "Taylor", "Ted", "Travis", "Zackery", "Darrius", "Emilio", "Fredrick", "Shaun", "Stefano", "Travon", "Daniel", "Garett", "Gregg", "Linden", "Lowell", "Trenton", "Dudley", "Luke", "Markus", "Nathan", "Orville", "Randall", "Ron", "Ronald", "Simon", "Steve", "William", "Franklin", "Clarke", "Jacques", "Terrance", "Ernst", "Justus", "Ikaika", "Jayson", "Kyle", "Reid", "Tyrone", "Adam", "Albert", "Alphonse", "Cory", "Donnie", "Elton", "Francis", "Gordon", "Herbert", "Humphrey", "Jordan", "Julian", "Keaton", "Levi", "Melvin", "Murray", "West", "Craig", "Coren", "Dubik", "Kotan", "Lethco", "Mante", "Mort", "Myron", "Odlow", "Ribek", "Roeck", "Vogi", "Vonder", "Zogo", "Doimo", "Doton", "Durel", "Hildon", "Kukla", "Messa", "Nanot", "Platen", "Raburn", "Reman", "Acrod", "Coffy", "Elrok", "Foss", "Hardig", "Hombol", "Hospel", "Kaller", "Klots", "Krilok", "Limar", "Loket", "Mesak", "Morbit", "Newin", "Orill", "Tabor", "Tekot" ], [ "Blythe", "Chan", "Kathrine", "Marie", "Maria", "Naoko", "Samantha", "Satomi", "Shannon", "Athena", "Caroline", "Lumi", "Lumina", "Marissa", "Sonia" ]], - [TrainerType.SMASHER]: [ "Aspen", "Elena", "Mari", "Amy", "Lizzy" ], - [TrainerType.SNOW_WORKER]: [[ "Braden", "Brendon", "Colin", "Conrad", "Dillan", "Gary", "Gerardo", "Holden", "Jackson", "Mason", "Quentin", "Willy", "Noel", "Arnold", "Brady", "Brand", "Cairn", "Cliff", "Don", "Eddie", "Felix", "Filipe", "Glenn", "Gus", "Heath", "Matthew", "Patton", "Rich", "Rob", "Ryan", "Scott", "Shelby", "Sterling", "Tyler", "Victor", "Zack", "Friedrich", "Herman", "Isaac", "Leo", "Maynard", "Mitchell", "Morgann", "Nathan", "Niel", "Pasqual", "Paul", "Tavarius", "Tibor", "Dimitri", "Narek", "Yusif", "Frank", "Jeff", "Vaclav", "Ovid", "Francis", "Keith", "Russel", "Sangon", "Toway", "Bomber", "Chean", "Demit", "Hubor", "Kebile", "Laber", "Ordo", "Retay", "Ronix", "Wagel", "Dobit", "Kaster", "Lobel", "Releo", "Saken", "Rustix" ], [ "Georgia", "Sandra", "Yvonne" ]], - [TrainerType.STRIKER]: [ "Marco", "Roberto", "Tony" ], - [TrainerType.SCHOOL_KID]: [[ "Alan", "Billy", "Chad", "Danny", "Dudley", "Jack", "Joe", "Johnny", "Kipp", "Nate", "Ricky", "Tommy", "Jerry", "Paul", "Ted", "Chance", "Esteban", "Forrest", "Harrison", "Connor", "Sherman", "Torin", "Travis", "Al", "Carter", "Edgar", "Jem", "Sammy", "Shane", "Shayne", "Alvin", "Keston", "Neil", "Seymour", "William", "Carson", "Clark", "Nolan" ], [ "Georgia", "Karen", "Meiko", "Christine", "Mackenzie", "Tiera", "Ann", "Gina", "Lydia", "Marsha", "Millie", "Sally", "Serena", "Silvia", "Alberta", "Cassie", "Mara", "Rita", "Georgie", "Meena", "Nitzel" ]], - [TrainerType.SWIMMER]: [[ "Berke", "Cameron", "Charlie", "George", "Harold", "Jerome", "Kirk", "Mathew", "Parker", "Randall", "Seth", "Simon", "Tucker", "Austin", "Barry", "Chad", "Cody", "Darrin", "David", "Dean", "Douglas", "Franklin", "Gilbert", "Herman", "Jack", "Luis", "Matthew", "Reed", "Richard", "Rodney", "Roland", "Spencer", "Stan", "Tony", "Clarence", "Declan", "Dominik", "Harrison", "Kevin", "Leonardo", "Nolen", "Pete", "Santiago", "Axle", "Braden", "Finn", "Garrett", "Mymo", "Reece", "Samir", "Toby", "Adrian", "Colton", "Dillon", "Erik", "Evan", "Francisco", "Glenn", "Kurt", "Oscar", "Ricardo", "Sam", "Sheltin", "Troy", "Vincent", "Wade", "Wesley", "Duane", "Elmo", "Esteban", "Frankie", "Ronald", "Tyson", "Bart", "Matt", "Tim", "Wright", "Jeffery", "Kyle", "Alessandro", "Estaban", "Kieran", "Ramses", "Casey", "Dakota", "Jared", "Kalani", "Keoni", "Lawrence", "Logan", "Robert", "Roddy", "Yasu", "Derek", "Jacob", "Bruce", "Clayton" ], [ "Briana", "Dawn", "Denise", "Diana", "Elaine", "Kara", "Kaylee", "Lori", "Nicole", "Nikki", "Paula", "Susie", "Wendy", "Alice", "Beth", "Beverly", "Brenda", "Dana", "Debra", "Grace", "Jenny", "Katie", "Laurel", "Linda", "Missy", "Sharon", "Tanya", "Tara", "Tisha", "Carlee", "Imani", "Isabelle", "Kyla", "Sienna", "Abigail", "Amara", "Anya", "Connie", "Maria", "Melissa", "Nora", "Shirley", "Shania", "Tiffany", "Aubree", "Cassandra", "Claire", "Crystal", "Erica", "Gabrielle", "Haley", "Jessica", "Joanna", "Lydia", "Mallory", "Mary", "Miranda", "Paige", "Sophia", "Vanessa", "Chelan", "Debbie", "Joy", "Kendra", "Leona", "Mina", "Caroline", "Joyce", "Larissa", "Rebecca", "Tyra", "Dara", "Desiree", "Kaoru", "Ruth", "Coral", "Genevieve", "Isla", "Marissa", "Romy", "Sheryl", "Alexandria", "Alicia", "Chelsea", "Jade", "Kelsie", "Laura", "Portia", "Shelby", "Sara", "Tiare", "Kyra", "Natasha", "Layla", "Scarlett", "Cora" ]], - [TrainerType.TWINS]: [ "Amy & May", "Jo & Zoe", "Meg & Peg", "Ann & Anne", "Lea & Pia", "Amy & Liv", "Gina & Mia", "Miu & Yuki", "Tori & Tia", "Eli & Anne", "Jen & Kira", "Joy & Meg", "Kiri & Jan", "Miu & Mia", "Emma & Lil", "Liv & Liz", "Teri & Tia", "Amy & Mimi", "Clea & Gil", "Day & Dani", "Kay & Tia", "Tori & Til", "Saya & Aya", "Emy & Lin", "Kumi & Amy", "Mayo & May", "Ally & Amy", "Lia & Lily", "Rae & Ula", "Sola & Ana", "Tara & Val", "Faith & Joy", "Nana & Nina" ], - [TrainerType.VETERAN]: [[ "Armando", "Brenden", "Brian", "Clayton", "Edgar", "Emanuel", "Grant", "Harlan", "Terrell", "Arlen", "Chester", "Hugo", "Martell", "Ray", "Shaun", "Abraham", "Carter", "Claude", "Jerry", "Lucius", "Murphy", "Rayne", "Ron", "Sinan", "Sterling", "Vincent", "Zach", "Gerard", "Gilles", "Louis", "Timeo", "Akira", "Don", "Eric", "Harry", "Leon", "Roger", "Angus", "Aristo", "Brone", "Johnny" ], [ "Julia", "Karla", "Kim", "Sayuri", "Tiffany", "Cathy", "Cecile", "Chloris", "Denae", "Gina", "Maya", "Oriana", "Portia", "Rhona", "Rosaline", "Catrina", "Inga", "Trisha", "Heather", "Lynn", "Sheri", "Alonsa", "Ella", "Leticia", "Kiara" ]], - [TrainerType.WAITER]: [[ "Bert", "Clint", "Maxwell", "Lou" ], [ "Kati", "Aurora", "Bonita", "Flo", "Tia", "Jan", "Olwen", "Paget", "Paula", "Talia" ]], - [TrainerType.WORKER]: [[ "Braden", "Brendon", "Colin", "Conrad", "Dillan", "Gary", "Gerardo", "Holden", "Jackson", "Mason", "Quentin", "Willy", "Noel", "Arnold", "Brady", "Brand", "Cairn", "Cliff", "Don", "Eddie", "Felix", "Filipe", "Glenn", "Gus", "Heath", "Matthew", "Patton", "Rich", "Rob", "Ryan", "Scott", "Shelby", "Sterling", "Tyler", "Victor", "Zack", "Friedrich", "Herman", "Isaac", "Leo", "Maynard", "Mitchell", "Morgann", "Nathan", "Niel", "Pasqual", "Paul", "Tavarius", "Tibor", "Dimitri", "Narek", "Yusif", "Frank", "Jeff", "Vaclav", "Ovid", "Francis", "Keith", "Russel", "Sangon", "Toway", "Bomber", "Chean", "Demit", "Hubor", "Kebile", "Laber", "Ordo", "Retay", "Ronix", "Wagel", "Dobit", "Kaster", "Lobel", "Releo", "Saken", "Rustix" ], [ "Georgia", "Sandra", "Yvonne" ]], - [TrainerType.YOUNGSTER]: [[ "Albert", "Gordon", "Ian", "Jason", "Jimmy", "Mikey", "Owen", "Samuel", "Warren", "Allen", "Ben", "Billy", "Calvin", "Dillion", "Eddie", "Joey", "Josh", "Neal", "Timmy", "Tommy", "Breyden", "Deandre", "Demetrius", "Dillon", "Jaylen", "Johnson", "Shigenobu", "Chad", "Cole", "Cordell", "Dan", "Dave", "Destin", "Nash", "Tyler", "Yasu", "Austin", "Dallas", "Darius", "Donny", "Jonathon", "Logan", "Michael", "Oliver", "Sebastian", "Tristan", "Wayne", "Norman", "Roland", "Regis", "Abe", "Astor", "Keita", "Kenneth", "Kevin", "Kyle", "Lester", "Masao", "Nicholas", "Parker", "Wes", "Zachary", "Cody", "Henley", "Jaye", "Karl", "Kenny", "Masahiro", "Pedro", "Petey", "Sinclair", "Terrell", "Waylon", "Aidan", "Anthony", "David", "Jacob", "Jayden", "Cutler", "Ham", "Caleb", "Kai", "Honus", "Kenway", "Bret", "Chris", "Cid", "Dennis", "Easton", "Ken", "Robby", "Ronny", "Shawn", "Benjamin", "Jake", "Travis", "Adan", "Aday", "Beltran", "Elian", "Hernan", "Julen", "Luka", "Roi", "Bernie", "Dustin", "Jonathan", "Wyatt" ], [ "Alice", "Bridget", "Carrie", "Connie", "Dana", "Ellen", "Krise", "Laura", "Linda", "Michelle", "Shannon", "Andrea", "Crissy", "Janice", "Robin", "Sally", "Tiana", "Haley", "Ali", "Ann", "Dalia", "Dawn", "Iris", "Joana", "Julia", "Kay", "Lisa", "Megan", "Mikaela", "Miriam", "Paige", "Reli", "Blythe", "Briana", "Caroline", "Cassidy", "Kaitlin", "Madeline", "Molly", "Natalie", "Samantha", "Sarah", "Cathy", "Dye", "Eri", "Eva", "Fey", "Kara", "Lurleen", "Maki", "Mali", "Maya", "Miki", "Sibyl", "Daya", "Diana", "Flo", "Helia", "Henrietta", "Isabel", "Mai", "Persephone", "Serena", "Anna", "Charlotte", "Elin", "Elsa", "Lise", "Sara", "Suzette", "Audrey", "Emmy", "Isabella", "Madison", "Rika", "Rylee", "Salla", "Ellie", "Alexandra", "Amy", "Lass", "Brittany", "Chel", "Cindy", "Dianne", "Emily", "Emma", "Evelyn", "Hana", "Harleen", "Hazel", "Jocelyn", "Katrina", "Kimberly", "Lina", "Marge", "Mila", "Mizuki", "Rena", "Sal", "Satoko", "Summer", "Tomoe", "Vicky", "Yue", "Yumi", "Lauren", "Rei", "Riley", "Lois", "Nancy", "Tammy", "Terry" ]], - [TrainerType.HEX_MANIAC]: [ "Kindra", "Patricia", "Tammy", "Tasha", "Valerie", "Alaina", "Kathleen", "Leah", "Makie", "Sylvia", "Anina", "Arachna", "Carrie", "Desdemona", "Josette", "Luna", "Melanie", "Osanna", "Raziah" ], + [TrainerType.ACE_TRAINER]: [ + [ + "Aaron", + "Allen", + "Blake", + "Brian", + "Gaven", + "Jake", + "Kevin", + "Mike", + "Nick", + "Paul", + "Ryan", + "Sean", + "Darin", + "Albert", + "Berke", + "Clyde", + "Edgar", + "George", + "Leroy", + "Owen", + "Parker", + "Randall", + "Ruben", + "Samuel", + "Vincent", + "Warren", + "Wilton", + "Zane", + "Alfred", + "Braxton", + "Felix", + "Gerald", + "Jonathan", + "Leonel", + "Marcel", + "Mitchell", + "Quincy", + "Roderick", + "Colby", + "Rolando", + "Yuji", + "Abel", + "Anton", + "Arthur", + "Cesar", + "Dalton", + "Dennis", + "Ernest", + "Garrett", + "Graham", + "Henry", + "Isaiah", + "Jonah", + "Jose", + "Keenan", + "Micah", + "Omar", + "Quinn", + "Rodolfo", + "Saul", + "Sergio", + "Skylar", + "Stefan", + "Zachery", + "Alton", + "Arabella", + "Bonita", + "Cal", + "Cody", + "French", + "Kobe", + "Paulo", + "Shaye", + "Austin", + "Beckett", + "Charlie", + "Corky", + "David", + "Dwayne", + "Elmer", + "Jesse", + "Jared", + "Johan", + "Jordan", + "Kipp", + "Lou", + "Terry", + "Tom", + "Webster", + "Billy", + "Doyle", + "Enzio", + "Geoff", + "Grant", + "Kelsey", + "Miguel", + "Pierce", + "Ray", + "Santino", + "Shel", + "Adelbert", + "Bence", + "Emil", + "Evan", + "Mathis", + "Maxim", + "Neil", + "Rico", + "Robbie", + "Theo", + "Viktor", + "Benedict", + "Cornelius", + "Hisato", + "Leopold", + "Neville", + "Vito", + "Chase", + "Cole", + "Hiroshi", + "Jackson", + "Jim", + "Kekoa", + "Makana", + "Yuki", + "Elwood", + "Seth", + "Alvin", + "Arjun", + "Arnold", + "Cameron", + "Carl", + "Carlton", + "Christopher", + "Dave", + "Dax", + "Dominic", + "Edmund", + "Finn", + "Fred", + "Garret", + "Grayson", + "Jace", + "Jaxson", + "Jay", + "Jirard", + "Johnson", + "Kayden", + "Kite", + "Louis", + "Mac", + "Marty", + "Percy", + "Raymond", + "Ronnie", + "Satch", + "Tim", + "Zach", + "Conner", + "Vince", + "Bedro", + "Boda", + "Botan", + "Daras", + "Dury", + "Herton", + "Rewn", + "Stum", + "Tock", + "Trilo", + "Berki", + "Cruik", + "Dazon", + "Desid", + "Dillot", + "Farfin", + "Forgon", + "Hebel", + "Morfon", + "Moril", + "Shadd", + "Vanhub", + "Bardo", + "Carben", + "Degin", + "Gorps", + "Klept", + "Lask", + "Malex", + "Mopar", + "Niled", + "Noxon", + "Teslor", + "Tetil", + ], + [ + "Beth", + "Carol", + "Cybil", + "Emma", + "Fran", + "Gwen", + "Irene", + "Jenn", + "Joyce", + "Kate", + "Kelly", + "Lois", + "Lola", + "Megan", + "Quinn", + "Reena", + "Cara", + "Alexa", + "Brooke", + "Caroline", + "Elaine", + "Hope", + "Jennifer", + "Jody", + "Julie", + "Lori", + "Mary", + "Michelle", + "Shannon", + "Wendy", + "Alexia", + "Alicia", + "Athena", + "Carolina", + "Cristin", + "Darcy", + "Dianne", + "Halle", + "Jazmyn", + "Katelynn", + "Keira", + "Marley", + "Allyson", + "Kathleen", + "Naomi", + "Alyssa", + "Ariana", + "Brandi", + "Breanna", + "Brenda", + "Brenna", + "Catherine", + "Clarice", + "Dana", + "Deanna", + "Destiny", + "Jamie", + "Jasmin", + "Kassandra", + "Laura", + "Maria", + "Mariah", + "Maya", + "Meagan", + "Mikayla", + "Monique", + "Natasha", + "Olivia", + "Sandra", + "Savannah", + "Sydney", + "Moira", + "Piper", + "Salma", + "Allison", + "Beverly", + "Cathy", + "Cheyenne", + "Clara", + "Dara", + "Eileen", + "Glinda", + "Junko", + "Lena", + "Lucille", + "Mariana", + "Olwen", + "Shanta", + "Stella", + "Angi", + "Belle", + "Chandra", + "Cora", + "Eve", + "Jacqueline", + "Jeanne", + "Juliet", + "Kathrine", + "Layla", + "Lucca", + "Melina", + "Miki", + "Nina", + "Sable", + "Shelly", + "Summer", + "Trish", + "Vicki", + "Alanza", + "Cordelia", + "Hilde", + "Imelda", + "Michele", + "Mireille", + "Claudia", + "Constance", + "Harriet", + "Honor", + "Melba", + "Portia", + "Alexis", + "Angela", + "Karla", + "Lindsey", + "Tori", + "Sheri", + "Jada", + "Kailee", + "Amanda", + "Annie", + "Kindra", + "Kyla", + "Sofia", + "Yvette", + "Becky", + "Flora", + "Gloria", + "Buna", + "Ferda", + "Lehan", + "Liqui", + "Lomen", + "Neira", + "Atilo", + "Detta", + "Gilly", + "Gosney", + "Levens", + "Moden", + "Rask", + "Rateis", + "Rosno", + "Tynan", + "Veron", + "Zoel", + "Cida", + "Dibsin", + "Dodin", + "Ebson", + "Equin", + "Flostin", + "Gabsen", + "Halsion", + "Hileon", + "Quelor", + "Rapeel", + "Roze", + "Tensin", + ], + ], + [TrainerType.ARTIST]: [ + ["Ismael", "William", "Horton", "Pierre", "Zach", "Gough", "Salvador", "Vincent", "Duncan"], + ["Georgia"], + ], + [TrainerType.BACKERS]: [ + ["Alf & Fred", "Hawk & Dar", "Joe & Ross", "Les & Web", "Masa & Yas", "Stu & Art"], + [ + "Ai & Ciel", + "Ami & Eira", + "Cam & Abby", + "Fey & Sue", + "Kat & Phae", + "Kay & Ali", + "Ava & Aya", + "Cleo & Rio", + "May & Mal", + ], + ], + [TrainerType.BACKPACKER]: [ + [ + "Alexander", + "Carlos", + "Herman", + "Jerome", + "Keane", + "Kelsey", + "Kiyo", + "Michael", + "Nate", + "Peter", + "Sam", + "Stephen", + "Talon", + "Terrance", + "Toru", + "Waylon", + "Boone", + "Clifford", + "Ivan", + "Kendall", + "Lowell", + "Randall", + "Reece", + "Roland", + "Shane", + "Walt", + "Farid", + "Heike", + "Joren", + "Lane", + "Roderick", + "Darnell", + "Deon", + "Emory", + "Graeme", + "Grayson", + "Aitor", + "Alex", + "Arturo", + "Asier", + "Jaime", + "Jonathan", + "Julio", + "Kevin", + "Kosuke", + "Lander", + "Markel", + "Mateo", + "Nil", + "Pau", + "Samuel", + ], + [ + "Anna", + "Corin", + "Elaine", + "Emi", + "Jill", + "Kumiko", + "Liz", + "Lois", + "Lora", + "Molly", + "Patty", + "Ruth", + "Vicki", + "Annie", + "Blossom", + "Clara", + "Eileen", + "Mae", + "Myra", + "Rachel", + "Tami", + "Ashley", + "Mikiko", + "Kiana", + "Perdy", + "Maria", + "Yuho", + "Peren", + "Barbara", + "Diane", + ], + ], + [TrainerType.BAKER]: ["Chris", "Jenn", "Lilly"], + [TrainerType.BEAUTY]: [ + "Cassie", + "Julia", + "Olivia", + "Samantha", + "Valerie", + "Victoria", + "Bridget", + "Connie", + "Jessica", + "Johanna", + "Melissa", + "Sheila", + "Shirley", + "Tiffany", + "Namiko", + "Thalia", + "Grace", + "Lola", + "Lori", + "Maura", + "Tamia", + "Cyndy", + "Devon", + "Gabriella", + "Harley", + "Lindsay", + "Nicola", + "Callie", + "Charlotte", + "Kassandra", + "December", + "Fleming", + "Nikola", + "Aimee", + "Anais", + "Brigitte", + "Cassandra", + "Andrea", + "Brittney", + "Carolyn", + "Krystal", + "Alexis", + "Alice", + "Aina", + "Anya", + "Arianna", + "Aubrey", + "Beverly", + "Camille", + "Beauty", + "Evette", + "Hansol", + "Haruka", + "Jill", + "Jo", + "Lana", + "Lois", + "Lucy", + "Mai", + "Nickie", + "Nicole", + "Prita", + "Rose", + "Shelly", + "Suzy", + "Tessa", + "Anita", + "Alissa", + "Rita", + "Cudsy", + "Eloff", + "Miru", + "Minot", + "Nevah", + "Niven", + "Ogoin", + ], + [TrainerType.BIKER]: [ + "Charles", + "Dwayne", + "Glenn", + "Harris", + "Joel", + "Riley", + "Zeke", + "Alex", + "Billy", + "Ernest", + "Gerald", + "Hideo", + "Isaac", + "Jared", + "Jaren", + "Jaxon", + "Jordy", + "Lao", + "Lukas", + "Malik", + "Nikolas", + "Ricardo", + "Ruben", + "Virgil", + "William", + "Aiden", + "Dale", + "Dan", + "Jacob", + "Markey", + "Reese", + "Teddy", + "Theron", + "Jeremy", + "Morgann", + "Phillip", + "Philip", + "Stanley", + "Dillon", + ], + [TrainerType.BLACK_BELT]: [ + [ + "Kenji", + "Lao", + "Lung", + "Nob", + "Wai", + "Yoshi", + "Atsushi", + "Daisuke", + "Hideki", + "Hitoshi", + "Kiyo", + "Koichi", + "Koji", + "Yuji", + "Cristian", + "Rhett", + "Takao", + "Theodore", + "Zander", + "Aaron", + "Hugh", + "Mike", + "Nicolas", + "Shea", + "Takashi", + "Adam", + "Carl", + "Colby", + "Darren", + "David", + "Davon", + "Derek", + "Eddie", + "Gregory", + "Griffin", + "Jarrett", + "Jeffery", + "Kendal", + "Kyle", + "Luke", + "Miles", + "Nathaniel", + "Philip", + "Rafael", + "Ray", + "Ricky", + "Sean", + "Willie", + "Ander", + "Manford", + "Benjamin", + "Corey", + "Edward", + "Grant", + "Jay", + "Kendrew", + "Kentaro", + "Ryder", + "Teppei", + "Thomas", + "Tyrone", + "Andrey", + "Donny", + "Drago", + "Gordon", + "Grigor", + "Jeriel", + "Kenneth", + "Martell", + "Mathis", + "Rich", + "Rocky", + "Rodrigo", + "Wesley", + "Zachery", + "Alonzo", + "Cadoc", + "Gunnar", + "Igor", + "Killian", + "Markus", + "Ricardo", + "Yanis", + "Banting", + "Clayton", + "Duane", + "Earl", + "Greg", + "Roy", + "Terry", + "Tracy", + "Walter", + "Alvaro", + "Curtis", + "Francis", + "Ross", + "Brice", + "Cheng", + "Dudley", + "Eric", + "Kano", + "Masahiro", + "Randy", + "Ryuji", + "Steve", + "Tadashi", + "Wong", + "Yuen", + "Brian", + "Carter", + "Reece", + "Nick", + "Yang", + ], + [ + "Cora", + "Cyndy", + "Jill", + "Laura", + "Sadie", + "Tessa", + "Vivian", + "Aisha", + "Callie", + "Danielle", + "Helene", + "Jocelyn", + "Lilith", + "Paula", + "Reyna", + "Helen", + "Kelsey", + "Tyler", + "Amy", + "Chandra", + "Hillary", + "Janie", + "Lee", + "Maggie", + "Mikiko", + "Miriam", + "Sharon", + "Susie", + "Xiao", + "Alize", + "Azra", + "Brenda", + "Chalina", + "Chan", + "Glinda", + "Maki", + "Tia", + "Tiffany", + "Wendy", + "Andrea", + "Gabrielle", + "Gerardine", + "Hailey", + "Hedvig", + "Justine", + "Kinsey", + "Sigrid", + "Veronique", + "Tess", + ], + ], + [TrainerType.BREEDER]: [ + [ + "Isaac", + "Myles", + "Salvadore", + "Albert", + "Kahlil", + "Eustace", + "Galen", + "Owen", + "Addison", + "Marcus", + "Foster", + "Cory", + "Glenn", + "Jay", + "Wesley", + "William", + "Adrian", + "Bradley", + "Jaime", + ], + [ + "Allison", + "Alize", + "Bethany", + "Lily", + "Lydia", + "Gabrielle", + "Jayden", + "Pat", + "Veronica", + "Amber", + "Jennifer", + "Kaylee", + "Adelaide", + "Brooke", + "Ethel", + "April", + "Irene", + "Magnolia", + "Amala", + "Mercy", + "Amanda", + "Ikue", + "Savannah", + "Yuka", + "Chloe", + "Debra", + "Denise", + "Elena", + ], + ], + [TrainerType.CLERK]: [ + [ + "Chaz", + "Clemens", + "Doug", + "Fredric", + "Ivan", + "Isaac", + "Nelson", + "Wade", + "Warren", + "Augustin", + "Gilligan", + "Cody", + "Jeremy", + "Shane", + "Dugal", + "Royce", + "Ronald", + ], + [ + "Alberta", + "Ingrid", + "Katie", + "Piper", + "Trisha", + "Wren", + "Britney", + "Lana", + "Jessica", + "Kristen", + "Michelle", + "Gabrielle", + ], + ], + [TrainerType.CYCLIST]: [ + ["Axel", "James", "John", "Ryan", "Hector", "Jeremiah"], + ["Kayla", "Megan", "Nicole", "Rachel", "Krissa", "Adelaide"], + ], + [TrainerType.DANCER]: [ + "Brian", + "Davey", + "Dirk", + "Edmond", + "Mickey", + "Raymond", + "Cara", + "Julia", + "Maika", + "Mireille", + "Ronda", + "Zoe", + ], + [TrainerType.DEPOT_AGENT]: ["Josh", "Hank", "Vincent"], + [TrainerType.DOCTOR]: [ + ["Hank", "Jerry", "Jules", "Logan", "Wayne", "Braid", "Derek", "Heath", "Julius", "Kit", "Graham"], + ["Kirsten", "Sachiko", "Shery", "Carol", "Dixie", "Mariah"], + ], + [TrainerType.FIREBREATHER]: ["Bill", "Burt", "Cliff", "Dick", "Lyle", "Ned", "Otis", "Ray", "Richard", "Walt"], + [TrainerType.FISHERMAN]: [ + "Andre", + "Arnold", + "Barney", + "Chris", + "Edgar", + "Henry", + "Jonah", + "Justin", + "Kyle", + "Martin", + "Marvin", + "Ralph", + "Raymond", + "Scott", + "Stephen", + "Wilton", + "Tully", + "Andrew", + "Barny", + "Carter", + "Claude", + "Dale", + "Elliot", + "Eugene", + "Ivan", + "Ned", + "Nolan", + "Roger", + "Ronald", + "Wade", + "Wayne", + "Darian", + "Kai", + "Chip", + "Hank", + "Kaden", + "Tommy", + "Tylor", + "Alec", + "Brett", + "Cameron", + "Cody", + "Cole", + "Cory", + "Erick", + "George", + "Joseph", + "Juan", + "Kenneth", + "Luc", + "Miguel", + "Travis", + "Walter", + "Zachary", + "Josh", + "Gideon", + "Kyler", + "Liam", + "Murphy", + "Bruce", + "Damon", + "Devon", + "Hubert", + "Jones", + "Lydon", + "Mick", + "Pete", + "Sean", + "Sid", + "Vince", + "Bucky", + "Dean", + "Eustace", + "Kenzo", + "Leroy", + "Mack", + "Ryder", + "Ewan", + "Finn", + "Murray", + "Seward", + "Shad", + "Wharton", + "Finley", + "Fisher", + "Fisk", + "River", + "Sheaffer", + "Timin", + "Carl", + "Ernest", + "Hal", + "Herbert", + "Hisato", + "Mike", + "Vernon", + "Harriet", + "Marina", + "Chase", + ], + [TrainerType.GUITARIST]: [ + "Anna", + "Beverly", + "January", + "Tina", + "Alicia", + "Claudia", + "Julia", + "Lidia", + "Mireia", + "Noelia", + "Sara", + "Sheila", + "Tatiana", + ], + [TrainerType.HARLEQUIN]: [ + "Charley", + "Ian", + "Jack", + "Kerry", + "Louis", + "Pat", + "Paul", + "Rick", + "Anders", + "Clarence", + "Gary", + ], + [TrainerType.HIKER]: [ + "Anthony", + "Bailey", + "Benjamin", + "Daniel", + "Erik", + "Jim", + "Kenny", + "Leonard", + "Michael", + "Parry", + "Phillip", + "Russell", + "Sidney", + "Tim", + "Timothy", + "Alan", + "Brice", + "Clark", + "Eric", + "Lenny", + "Lucas", + "Mike", + "Trent", + "Devan", + "Eli", + "Marc", + "Sawyer", + "Allen", + "Daryl", + "Dudley", + "Earl", + "Franklin", + "Jeremy", + "Marcos", + "Nob", + "Oliver", + "Wayne", + "Alexander", + "Damon", + "Jonathan", + "Justin", + "Kevin", + "Lorenzo", + "Louis", + "Maurice", + "Nicholas", + "Reginald", + "Robert", + "Theodore", + "Bruce", + "Clarke", + "Devin", + "Dwight", + "Edwin", + "Eoin", + "Noland", + "Russel", + "Andy", + "Bret", + "Darrell", + "Gene", + "Hardy", + "Hugh", + "Jebediah", + "Jeremiah", + "Kit", + "Neil", + "Terrell", + "Don", + "Doug", + "Hunter", + "Jared", + "Jerome", + "Keith", + "Manuel", + "Markus", + "Otto", + "Shelby", + "Stephen", + "Teppei", + "Tobias", + "Wade", + "Zaiem", + "Aaron", + "Alain", + "Bergin", + "Bernard", + "Brent", + "Corwin", + "Craig", + "Delmon", + "Dunstan", + "Orestes", + "Ross", + "Davian", + "Calhoun", + "David", + "Gabriel", + "Ryan", + "Thomas", + "Travis", + "Zachary", + "Anuhea", + "Barnaby", + "Claus", + "Collin", + "Colson", + "Dexter", + "Dillan", + "Eugine", + "Farkas", + "Hisato", + "Julius", + "Kenji", + "Irwin", + "Lionel", + "Paul", + "Richter", + "Valentino", + "Donald", + "Douglas", + "Kevyn", + "Chester", + ], //["Angela","Carla","Celia","Daniela","Estela","Fatima","Helena","Leire","Lucia","Luna","Manuela","Mar","Marina","Miyu","Nancy","Nerea","Paula","Rocio","Yanira"] + [TrainerType.HOOLIGANS]: ["Jim & Cas", "Rob & Sal"], + [TrainerType.HOOPSTER]: ["Bobby", "John", "Lamarcus", "Derrick", "Nicolas"], + [TrainerType.INFIELDER]: ["Alex", "Connor", "Todd"], + [TrainerType.JANITOR]: ["Caleb", "Geoff", "Brady", "Felix", "Orville", "Melvin", "Shawn"], + [TrainerType.LINEBACKER]: ["Bob", "Dan", "Jonah"], + [TrainerType.MAID]: ["Belinda", "Sophie", "Emily", "Elena", "Clare", "Alica", "Tanya", "Tammy"], + [TrainerType.MUSICIAN]: [ + "Boris", + "Preston", + "Charles", + "Clyde", + "Vincent", + "Dalton", + "Kirk", + "Shawn", + "Fabian", + "Fernando", + "Joseph", + "Marcos", + "Arturo", + "Jerry", + "Lonnie", + "Tony", + ], + [TrainerType.NURSERY_AIDE]: [ + "Autumn", + "Briana", + "Leah", + "Miho", + "Ethel", + "Hollie", + "Ilse", + "June", + "Kimya", + "Rosalyn", + ], + [TrainerType.OFFICER]: [ + "Dirk", + "Keith", + "Alex", + "Bobby", + "Caleb", + "Danny", + "Dylan", + "Thomas", + "Daniel", + "Jeff", + "Braven", + "Dell", + "Neagle", + "Haruki", + "Mitchell", + "Raymond", + ], + [TrainerType.PARASOL_LADY]: [ + "Angelica", + "Clarissa", + "Madeline", + "Akari", + "Annabell", + "Kayley", + "Rachel", + "Alexa", + "Sabrina", + "April", + "Gwyneth", + "Laura", + "Lumi", + "Mariah", + "Melita", + "Nicole", + "Tihana", + "Ingrid", + "Tyra", + ], + [TrainerType.PILOT]: ["Chase", "Leonard", "Ted", "Elron", "Ewing", "Flynn", "Winslow"], + [TrainerType.POKEFAN]: [ + [ + "Alex", + "Allan", + "Brandon", + "Carter", + "Colin", + "Derek", + "Jeremy", + "Joshua", + "Rex", + "Robert", + "Trevor", + "William", + "Colton", + "Miguel", + "Francisco", + "Kaleb", + "Leonard", + "Boone", + "Elliot", + "Jude", + "Norbert", + "Corey", + "Gabe", + "Baxter", + ], + [ + "Beverly", + "Georgia", + "Jaime", + "Ruth", + "Isabel", + "Marissa", + "Vanessa", + "Annika", + "Bethany", + "Kimberly", + "Meredith", + "Rebekah", + "Eleanor", + "Darcy", + "Lydia", + "Sachiko", + "Abigail", + "Agnes", + "Lydie", + "Roisin", + "Tara", + "Carmen", + "Janet", + ], + ], + [TrainerType.PRESCHOOLER]: [ + [ + "Billy", + "Doyle", + "Evan", + "Homer", + "Tully", + "Albert", + "Buster", + "Greg", + "Ike", + "Jojo", + "Tyrone", + "Adrian", + "Oliver", + "Hayden", + "Hunter", + "Kaleb", + "Liam", + "Dylan", + ], + [ + "Juliet", + "Mia", + "Sarah", + "Wendy", + "Winter", + "Chrissy", + "Eva", + "Lin", + "Samantha", + "Ella", + "Lily", + "Natalie", + "Ailey", + "Hannah", + "Malia", + "Kindra", + "Nancy", + ], + ], + [TrainerType.PSYCHIC]: [ + [ + "Fidel", + "Franklin", + "Gilbert", + "Greg", + "Herman", + "Jared", + "Mark", + "Nathan", + "Norman", + "Phil", + "Richard", + "Rodney", + "Cameron", + "Edward", + "Fritz", + "Joshua", + "Preston", + "Virgil", + "William", + "Alvaro", + "Blake", + "Cedric", + "Keenan", + "Nicholas", + "Dario", + "Johan", + "Lorenzo", + "Tyron", + "Bryce", + "Corbin", + "Deandre", + "Elijah", + "Kody", + "Landon", + "Maxwell", + "Mitchell", + "Sterling", + "Eli", + "Nelson", + "Vernon", + "Gaven", + "Gerard", + "Low", + "Micki", + "Perry", + "Rudolf", + "Tommy", + "Al", + "Nandor", + "Tully", + "Arthur", + "Emanuel", + "Franz", + "Harry", + "Paschal", + "Robert", + "Sayid", + "Angelo", + "Anton", + "Arin", + "Avery", + "Danny", + "Frasier", + "Harrison", + "Jaime", + "Ross", + "Rui", + "Vlad", + "Mason", + ], + [ + "Alexis", + "Hannah", + "Jacki", + "Jaclyn", + "Kayla", + "Maura", + "Samantha", + "Alix", + "Brandi", + "Edie", + "Macey", + "Mariella", + "Marlene", + "Laura", + "Rodette", + "Abigail", + "Brittney", + "Chelsey", + "Daisy", + "Desiree", + "Kendra", + "Lindsey", + "Rachael", + "Valencia", + "Belle", + "Cybil", + "Doreen", + "Dua", + "Future", + "Lin", + "Madhu", + "Alia", + "Ena", + "Joyce", + "Lynette", + "Olesia", + "Sarah", + ], + ], + [TrainerType.RANGER]: [ + [ + "Carlos", + "Jackson", + "Sebastian", + "Gav", + "Lorenzo", + "Logan", + "Nicolas", + "Trenton", + "Deshawn", + "Dwayne", + "Jeffery", + "Kyler", + "Taylor", + "Alain", + "Claude", + "Crofton", + "Forrest", + "Harry", + "Jaden", + "Keith", + "Lewis", + "Miguel", + "Pedro", + "Ralph", + "Richard", + "Bret", + "Daryl", + "Eddie", + "Johan", + "Leaf", + "Louis", + "Maxwell", + "Parker", + "Rick", + "Steve", + "Bjorn", + "Chaise", + "Dean", + "Lee", + "Maurice", + "Nash", + "Ralf", + "Reed", + "Shinobu", + "Silas", + ], + [ + "Catherine", + "Jenna", + "Sophia", + "Merdith", + "Nora", + "Beth", + "Chelsea", + "Katelyn", + "Madeline", + "Allison", + "Ashlee", + "Felicia", + "Krista", + "Annie", + "Audra", + "Brenda", + "Chloris", + "Eliza", + "Heidi", + "Irene", + "Mary", + "Mylene", + "Shanti", + "Shelly", + "Thalia", + "Anja", + "Briana", + "Dianna", + "Elaine", + "Elle", + "Hillary", + "Katie", + "Lena", + "Lois", + "Malory", + "Melita", + "Mikiko", + "Naoko", + "Serenity", + "Ambre", + "Brooke", + "Clementine", + "Melina", + "Petra", + "Twiggy", + ], + ], + [TrainerType.RICH]: [ + [ + "Alfred", + "Edward", + "Gregory", + "Preston", + "Thomas", + "Tucker", + "Walter", + "Clifford", + "Everett", + "Micah", + "Nate", + "Pierre", + "Terrance", + "Arthur", + "Brooks", + "Emanuel", + "Lamar", + "Jeremy", + "Leonardo", + "Milton", + "Frederic", + "Renaud", + "Robert", + "Yan", + "Daniel", + "Sheldon", + "Stonewall", + "Gerald", + "Ronald", + "Smith", + "Stanley", + "Reginald", + "Orson", + "Wilco", + "Caden", + "Glenn", + ], + [ + "Rebecca", + "Reina", + "Cassandra", + "Emilia", + "Grace", + "Marian", + "Elizabeth", + "Kathleen", + "Sayuri", + "Caroline", + "Judy", + ], + ], + [TrainerType.RICH_KID]: [ + [ + "Garret", + "Winston", + "Dawson", + "Enrique", + "Jason", + "Roman", + "Trey", + "Liam", + "Anthony", + "Brad", + "Cody", + "Manuel", + "Martin", + "Pierce", + "Rolan", + "Keenan", + "Filbert", + "Antoin", + "Cyus", + "Diek", + "Dugo", + "Flitz", + "Jurek", + "Lond", + "Perd", + "Quint", + "Basto", + "Benit", + "Brot", + "Denc", + "Guyit", + "Marcon", + "Perc", + "Puros", + "Roex", + "Sainz", + "Symin", + "Tark", + "Venak", + ], + [ + "Anette", + "Brianna", + "Cindy", + "Colleen", + "Daphne", + "Elizabeth", + "Naomi", + "Sarah", + "Charlotte", + "Gillian", + "Jacki", + "Lady", + "Melissa", + "Celeste", + "Colette", + "Elizandra", + "Isabel", + "Lynette", + "Magnolia", + "Sophie", + "Lina", + "Dulcie", + "Auro", + "Brin", + "Caril", + "Eloos", + "Gwin", + "Illa", + "Kowly", + "Rima", + "Ristin", + "Vesey", + "Brena", + "Deasy", + "Denslon", + "Kylet", + "Nemi", + "Rene", + "Sanol", + "Stouner", + "Sturk", + "Talmen", + "Zoila", + ], + ], + [TrainerType.ROUGHNECK]: [ + "Camron", + "Corey", + "Gabriel", + "Isaiah", + "Jamal", + "Koji", + "Luke", + "Paxton", + "Raul", + "Zeek", + "Kirby", + "Chance", + "Dave", + "Fletcher", + "Johnny", + "Reese", + "Joey", + "Ricky", + "Silvester", + "Martin", + ], + [TrainerType.SAILOR]: [ + "Alberto", + "Bost", + "Brennan", + "Brenden", + "Claude", + "Cory", + "Damian", + "Dirk", + "Duncan", + "Dwayne", + "Dylan", + "Eddie", + "Edmond", + "Elijah", + "Ernest", + "Eugene", + "Garrett", + "Golos", + "Gratin", + "Grestly", + "Harry", + "Hols", + "Hudson", + "Huey", + "Jebol", + "Jeff", + "Leonald", + "Luther", + "Kelvin", + "Kenneth", + "Kent", + "Knook", + "Marc", + "Mifis", + "Monar", + "Morkor", + "Ordes", + "Oxlin", + "Parker", + "Paul", + "Philip", + "Roberto", + "Samson", + "Skyler", + "Stanly", + "Tebu", + "Terrell", + "Trevor", + "Yasu", + "Zachariah", + ], + [TrainerType.SCIENTIST]: [ + [ + "Jed", + "Marc", + "Mitch", + "Rich", + "Ross", + "Beau", + "Braydon", + "Connor", + "Ed", + "Ivan", + "Jerry", + "Jose", + "Joshua", + "Parker", + "Rodney", + "Taylor", + "Ted", + "Travis", + "Zackery", + "Darrius", + "Emilio", + "Fredrick", + "Shaun", + "Stefano", + "Travon", + "Daniel", + "Garett", + "Gregg", + "Linden", + "Lowell", + "Trenton", + "Dudley", + "Luke", + "Markus", + "Nathan", + "Orville", + "Randall", + "Ron", + "Ronald", + "Simon", + "Steve", + "William", + "Franklin", + "Clarke", + "Jacques", + "Terrance", + "Ernst", + "Justus", + "Ikaika", + "Jayson", + "Kyle", + "Reid", + "Tyrone", + "Adam", + "Albert", + "Alphonse", + "Cory", + "Donnie", + "Elton", + "Francis", + "Gordon", + "Herbert", + "Humphrey", + "Jordan", + "Julian", + "Keaton", + "Levi", + "Melvin", + "Murray", + "West", + "Craig", + "Coren", + "Dubik", + "Kotan", + "Lethco", + "Mante", + "Mort", + "Myron", + "Odlow", + "Ribek", + "Roeck", + "Vogi", + "Vonder", + "Zogo", + "Doimo", + "Doton", + "Durel", + "Hildon", + "Kukla", + "Messa", + "Nanot", + "Platen", + "Raburn", + "Reman", + "Acrod", + "Coffy", + "Elrok", + "Foss", + "Hardig", + "Hombol", + "Hospel", + "Kaller", + "Klots", + "Krilok", + "Limar", + "Loket", + "Mesak", + "Morbit", + "Newin", + "Orill", + "Tabor", + "Tekot", + ], + [ + "Blythe", + "Chan", + "Kathrine", + "Marie", + "Maria", + "Naoko", + "Samantha", + "Satomi", + "Shannon", + "Athena", + "Caroline", + "Lumi", + "Lumina", + "Marissa", + "Sonia", + ], + ], + [TrainerType.SMASHER]: ["Aspen", "Elena", "Mari", "Amy", "Lizzy"], + [TrainerType.SNOW_WORKER]: [ + [ + "Braden", + "Brendon", + "Colin", + "Conrad", + "Dillan", + "Gary", + "Gerardo", + "Holden", + "Jackson", + "Mason", + "Quentin", + "Willy", + "Noel", + "Arnold", + "Brady", + "Brand", + "Cairn", + "Cliff", + "Don", + "Eddie", + "Felix", + "Filipe", + "Glenn", + "Gus", + "Heath", + "Matthew", + "Patton", + "Rich", + "Rob", + "Ryan", + "Scott", + "Shelby", + "Sterling", + "Tyler", + "Victor", + "Zack", + "Friedrich", + "Herman", + "Isaac", + "Leo", + "Maynard", + "Mitchell", + "Morgann", + "Nathan", + "Niel", + "Pasqual", + "Paul", + "Tavarius", + "Tibor", + "Dimitri", + "Narek", + "Yusif", + "Frank", + "Jeff", + "Vaclav", + "Ovid", + "Francis", + "Keith", + "Russel", + "Sangon", + "Toway", + "Bomber", + "Chean", + "Demit", + "Hubor", + "Kebile", + "Laber", + "Ordo", + "Retay", + "Ronix", + "Wagel", + "Dobit", + "Kaster", + "Lobel", + "Releo", + "Saken", + "Rustix", + ], + ["Georgia", "Sandra", "Yvonne"], + ], + [TrainerType.STRIKER]: ["Marco", "Roberto", "Tony"], + [TrainerType.SCHOOL_KID]: [ + [ + "Alan", + "Billy", + "Chad", + "Danny", + "Dudley", + "Jack", + "Joe", + "Johnny", + "Kipp", + "Nate", + "Ricky", + "Tommy", + "Jerry", + "Paul", + "Ted", + "Chance", + "Esteban", + "Forrest", + "Harrison", + "Connor", + "Sherman", + "Torin", + "Travis", + "Al", + "Carter", + "Edgar", + "Jem", + "Sammy", + "Shane", + "Shayne", + "Alvin", + "Keston", + "Neil", + "Seymour", + "William", + "Carson", + "Clark", + "Nolan", + ], + [ + "Georgia", + "Karen", + "Meiko", + "Christine", + "Mackenzie", + "Tiera", + "Ann", + "Gina", + "Lydia", + "Marsha", + "Millie", + "Sally", + "Serena", + "Silvia", + "Alberta", + "Cassie", + "Mara", + "Rita", + "Georgie", + "Meena", + "Nitzel", + ], + ], + [TrainerType.SWIMMER]: [ + [ + "Berke", + "Cameron", + "Charlie", + "George", + "Harold", + "Jerome", + "Kirk", + "Mathew", + "Parker", + "Randall", + "Seth", + "Simon", + "Tucker", + "Austin", + "Barry", + "Chad", + "Cody", + "Darrin", + "David", + "Dean", + "Douglas", + "Franklin", + "Gilbert", + "Herman", + "Jack", + "Luis", + "Matthew", + "Reed", + "Richard", + "Rodney", + "Roland", + "Spencer", + "Stan", + "Tony", + "Clarence", + "Declan", + "Dominik", + "Harrison", + "Kevin", + "Leonardo", + "Nolen", + "Pete", + "Santiago", + "Axle", + "Braden", + "Finn", + "Garrett", + "Mymo", + "Reece", + "Samir", + "Toby", + "Adrian", + "Colton", + "Dillon", + "Erik", + "Evan", + "Francisco", + "Glenn", + "Kurt", + "Oscar", + "Ricardo", + "Sam", + "Sheltin", + "Troy", + "Vincent", + "Wade", + "Wesley", + "Duane", + "Elmo", + "Esteban", + "Frankie", + "Ronald", + "Tyson", + "Bart", + "Matt", + "Tim", + "Wright", + "Jeffery", + "Kyle", + "Alessandro", + "Estaban", + "Kieran", + "Ramses", + "Casey", + "Dakota", + "Jared", + "Kalani", + "Keoni", + "Lawrence", + "Logan", + "Robert", + "Roddy", + "Yasu", + "Derek", + "Jacob", + "Bruce", + "Clayton", + ], + [ + "Briana", + "Dawn", + "Denise", + "Diana", + "Elaine", + "Kara", + "Kaylee", + "Lori", + "Nicole", + "Nikki", + "Paula", + "Susie", + "Wendy", + "Alice", + "Beth", + "Beverly", + "Brenda", + "Dana", + "Debra", + "Grace", + "Jenny", + "Katie", + "Laurel", + "Linda", + "Missy", + "Sharon", + "Tanya", + "Tara", + "Tisha", + "Carlee", + "Imani", + "Isabelle", + "Kyla", + "Sienna", + "Abigail", + "Amara", + "Anya", + "Connie", + "Maria", + "Melissa", + "Nora", + "Shirley", + "Shania", + "Tiffany", + "Aubree", + "Cassandra", + "Claire", + "Crystal", + "Erica", + "Gabrielle", + "Haley", + "Jessica", + "Joanna", + "Lydia", + "Mallory", + "Mary", + "Miranda", + "Paige", + "Sophia", + "Vanessa", + "Chelan", + "Debbie", + "Joy", + "Kendra", + "Leona", + "Mina", + "Caroline", + "Joyce", + "Larissa", + "Rebecca", + "Tyra", + "Dara", + "Desiree", + "Kaoru", + "Ruth", + "Coral", + "Genevieve", + "Isla", + "Marissa", + "Romy", + "Sheryl", + "Alexandria", + "Alicia", + "Chelsea", + "Jade", + "Kelsie", + "Laura", + "Portia", + "Shelby", + "Sara", + "Tiare", + "Kyra", + "Natasha", + "Layla", + "Scarlett", + "Cora", + ], + ], + [TrainerType.TWINS]: [ + "Amy & May", + "Jo & Zoe", + "Meg & Peg", + "Ann & Anne", + "Lea & Pia", + "Amy & Liv", + "Gina & Mia", + "Miu & Yuki", + "Tori & Tia", + "Eli & Anne", + "Jen & Kira", + "Joy & Meg", + "Kiri & Jan", + "Miu & Mia", + "Emma & Lil", + "Liv & Liz", + "Teri & Tia", + "Amy & Mimi", + "Clea & Gil", + "Day & Dani", + "Kay & Tia", + "Tori & Til", + "Saya & Aya", + "Emy & Lin", + "Kumi & Amy", + "Mayo & May", + "Ally & Amy", + "Lia & Lily", + "Rae & Ula", + "Sola & Ana", + "Tara & Val", + "Faith & Joy", + "Nana & Nina", + ], + [TrainerType.VETERAN]: [ + [ + "Armando", + "Brenden", + "Brian", + "Clayton", + "Edgar", + "Emanuel", + "Grant", + "Harlan", + "Terrell", + "Arlen", + "Chester", + "Hugo", + "Martell", + "Ray", + "Shaun", + "Abraham", + "Carter", + "Claude", + "Jerry", + "Lucius", + "Murphy", + "Rayne", + "Ron", + "Sinan", + "Sterling", + "Vincent", + "Zach", + "Gerard", + "Gilles", + "Louis", + "Timeo", + "Akira", + "Don", + "Eric", + "Harry", + "Leon", + "Roger", + "Angus", + "Aristo", + "Brone", + "Johnny", + ], + [ + "Julia", + "Karla", + "Kim", + "Sayuri", + "Tiffany", + "Cathy", + "Cecile", + "Chloris", + "Denae", + "Gina", + "Maya", + "Oriana", + "Portia", + "Rhona", + "Rosaline", + "Catrina", + "Inga", + "Trisha", + "Heather", + "Lynn", + "Sheri", + "Alonsa", + "Ella", + "Leticia", + "Kiara", + ], + ], + [TrainerType.WAITER]: [ + ["Bert", "Clint", "Maxwell", "Lou"], + ["Kati", "Aurora", "Bonita", "Flo", "Tia", "Jan", "Olwen", "Paget", "Paula", "Talia"], + ], + [TrainerType.WORKER]: [ + [ + "Braden", + "Brendon", + "Colin", + "Conrad", + "Dillan", + "Gary", + "Gerardo", + "Holden", + "Jackson", + "Mason", + "Quentin", + "Willy", + "Noel", + "Arnold", + "Brady", + "Brand", + "Cairn", + "Cliff", + "Don", + "Eddie", + "Felix", + "Filipe", + "Glenn", + "Gus", + "Heath", + "Matthew", + "Patton", + "Rich", + "Rob", + "Ryan", + "Scott", + "Shelby", + "Sterling", + "Tyler", + "Victor", + "Zack", + "Friedrich", + "Herman", + "Isaac", + "Leo", + "Maynard", + "Mitchell", + "Morgann", + "Nathan", + "Niel", + "Pasqual", + "Paul", + "Tavarius", + "Tibor", + "Dimitri", + "Narek", + "Yusif", + "Frank", + "Jeff", + "Vaclav", + "Ovid", + "Francis", + "Keith", + "Russel", + "Sangon", + "Toway", + "Bomber", + "Chean", + "Demit", + "Hubor", + "Kebile", + "Laber", + "Ordo", + "Retay", + "Ronix", + "Wagel", + "Dobit", + "Kaster", + "Lobel", + "Releo", + "Saken", + "Rustix", + ], + ["Georgia", "Sandra", "Yvonne"], + ], + [TrainerType.YOUNGSTER]: [ + [ + "Albert", + "Gordon", + "Ian", + "Jason", + "Jimmy", + "Mikey", + "Owen", + "Samuel", + "Warren", + "Allen", + "Ben", + "Billy", + "Calvin", + "Dillion", + "Eddie", + "Joey", + "Josh", + "Neal", + "Timmy", + "Tommy", + "Breyden", + "Deandre", + "Demetrius", + "Dillon", + "Jaylen", + "Johnson", + "Shigenobu", + "Chad", + "Cole", + "Cordell", + "Dan", + "Dave", + "Destin", + "Nash", + "Tyler", + "Yasu", + "Austin", + "Dallas", + "Darius", + "Donny", + "Jonathon", + "Logan", + "Michael", + "Oliver", + "Sebastian", + "Tristan", + "Wayne", + "Norman", + "Roland", + "Regis", + "Abe", + "Astor", + "Keita", + "Kenneth", + "Kevin", + "Kyle", + "Lester", + "Masao", + "Nicholas", + "Parker", + "Wes", + "Zachary", + "Cody", + "Henley", + "Jaye", + "Karl", + "Kenny", + "Masahiro", + "Pedro", + "Petey", + "Sinclair", + "Terrell", + "Waylon", + "Aidan", + "Anthony", + "David", + "Jacob", + "Jayden", + "Cutler", + "Ham", + "Caleb", + "Kai", + "Honus", + "Kenway", + "Bret", + "Chris", + "Cid", + "Dennis", + "Easton", + "Ken", + "Robby", + "Ronny", + "Shawn", + "Benjamin", + "Jake", + "Travis", + "Adan", + "Aday", + "Beltran", + "Elian", + "Hernan", + "Julen", + "Luka", + "Roi", + "Bernie", + "Dustin", + "Jonathan", + "Wyatt", + ], + [ + "Alice", + "Bridget", + "Carrie", + "Connie", + "Dana", + "Ellen", + "Krise", + "Laura", + "Linda", + "Michelle", + "Shannon", + "Andrea", + "Crissy", + "Janice", + "Robin", + "Sally", + "Tiana", + "Haley", + "Ali", + "Ann", + "Dalia", + "Dawn", + "Iris", + "Joana", + "Julia", + "Kay", + "Lisa", + "Megan", + "Mikaela", + "Miriam", + "Paige", + "Reli", + "Blythe", + "Briana", + "Caroline", + "Cassidy", + "Kaitlin", + "Madeline", + "Molly", + "Natalie", + "Samantha", + "Sarah", + "Cathy", + "Dye", + "Eri", + "Eva", + "Fey", + "Kara", + "Lurleen", + "Maki", + "Mali", + "Maya", + "Miki", + "Sibyl", + "Daya", + "Diana", + "Flo", + "Helia", + "Henrietta", + "Isabel", + "Mai", + "Persephone", + "Serena", + "Anna", + "Charlotte", + "Elin", + "Elsa", + "Lise", + "Sara", + "Suzette", + "Audrey", + "Emmy", + "Isabella", + "Madison", + "Rika", + "Rylee", + "Salla", + "Ellie", + "Alexandra", + "Amy", + "Lass", + "Brittany", + "Chel", + "Cindy", + "Dianne", + "Emily", + "Emma", + "Evelyn", + "Hana", + "Harleen", + "Hazel", + "Jocelyn", + "Katrina", + "Kimberly", + "Lina", + "Marge", + "Mila", + "Mizuki", + "Rena", + "Sal", + "Satoko", + "Summer", + "Tomoe", + "Vicky", + "Yue", + "Yumi", + "Lauren", + "Rei", + "Riley", + "Lois", + "Nancy", + "Tammy", + "Terry", + ], + ], + [TrainerType.HEX_MANIAC]: [ + "Kindra", + "Patricia", + "Tammy", + "Tasha", + "Valerie", + "Alaina", + "Kathleen", + "Leah", + "Makie", + "Sylvia", + "Anina", + "Arachna", + "Carrie", + "Desdemona", + "Josette", + "Luna", + "Melanie", + "Osanna", + "Raziah", + ], }; // function used in a commented code -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function fetchAndPopulateTrainerNames(url: string, parser: DOMParser, trainerNames: Set, femaleTrainerNames: Set, forceFemale: boolean = false) { +// biome-ignore lint/correctness/noUnusedVariables: TODO make this into a script instead of having it be in src/data... +function fetchAndPopulateTrainerNames( + url: string, + parser: DOMParser, + trainerNames: Set, + femaleTrainerNames: Set, + forceFemale = false, +) { return new Promise(resolve => { fetch(`https://bulbapedia.bulbagarden.net/wiki/${url}_(Trainer_class)`) .then(response => response.text()) @@ -140,19 +2738,21 @@ function fetchAndPopulateTrainerNames(url: string, parser: DOMParser, trainerNam if (!trainerListHeader) { return []; } - const elements = [ ...(trainerListHeader?.parentElement?.childNodes ?? []) ]; + const elements = [...(trainerListHeader?.parentElement?.childNodes ?? [])]; const startChildIndex = elements.indexOf(trainerListHeader); const endChildIndex = elements.findIndex(h => h.nodeName === "H2" && elements.indexOf(h) > startChildIndex); - const tables = elements.filter(t => { - if (t.nodeName !== "TABLE" || t["className"] !== "expandable") { - return false; - } - const childIndex = elements.indexOf(t); - return childIndex > startChildIndex && childIndex < endChildIndex; - }).map(t => t as Element); + const tables = elements + .filter(t => { + if (t.nodeName !== "TABLE" || t["className"] !== "expandable") { + return false; + } + const childIndex = elements.indexOf(t); + return childIndex > startChildIndex && childIndex < endChildIndex; + }) + .map(t => t as Element); console.log(url, tables); for (const table of tables) { - const trainerRows = [ ...table.querySelectorAll("tr:not(:first-child)") ].filter(r => r.children.length === 9); + const trainerRows = [...table.querySelectorAll("tr:not(:first-child)")].filter(r => r.children.length === 9); for (const row of trainerRows) { const nameCell = row.firstElementChild; if (!nameCell) { diff --git a/src/data/type.ts b/src/data/type.ts index 483ec068d3c..c9bf346fb85 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -1,287 +1,266 @@ -export enum Type { - UNKNOWN = -1, - NORMAL = 0, - FIGHTING, - FLYING, - POISON, - GROUND, - ROCK, - BUG, - GHOST, - STEEL, - FIRE, - WATER, - GRASS, - ELECTRIC, - PSYCHIC, - ICE, - DRAGON, - DARK, - FAIRY, - STELLAR -} +import { PokemonType } from "#enums/pokemon-type"; export type TypeDamageMultiplier = 0 | 0.125 | 0.25 | 0.5 | 1 | 2 | 4 | 8; -export function getTypeDamageMultiplier(attackType: Type, defType: Type): TypeDamageMultiplier { - if (attackType === Type.UNKNOWN || defType === Type.UNKNOWN) { +export function getTypeDamageMultiplier(attackType: PokemonType, defType: PokemonType): TypeDamageMultiplier { + if (attackType === PokemonType.UNKNOWN || defType === PokemonType.UNKNOWN) { return 1; } switch (defType) { - case Type.NORMAL: + case PokemonType.NORMAL: switch (attackType) { - case Type.FIGHTING: + case PokemonType.FIGHTING: return 2; - case Type.GHOST: + case PokemonType.GHOST: return 0; default: return 1; } - case Type.FIGHTING: + case PokemonType.FIGHTING: switch (attackType) { - case Type.FLYING: - case Type.PSYCHIC: - case Type.FAIRY: + case PokemonType.FLYING: + case PokemonType.PSYCHIC: + case PokemonType.FAIRY: return 2; - case Type.ROCK: - case Type.BUG: - case Type.DARK: + case PokemonType.ROCK: + case PokemonType.BUG: + case PokemonType.DARK: return 0.5; default: return 1; } - case Type.FLYING: + case PokemonType.FLYING: switch (attackType) { - case Type.ROCK: - case Type.ELECTRIC: - case Type.ICE: + case PokemonType.ROCK: + case PokemonType.ELECTRIC: + case PokemonType.ICE: return 2; - case Type.FIGHTING: - case Type.BUG: - case Type.GRASS: + case PokemonType.FIGHTING: + case PokemonType.BUG: + case PokemonType.GRASS: return 0.5; - case Type.GROUND: + case PokemonType.GROUND: return 0; default: return 1; } - case Type.POISON: + case PokemonType.POISON: switch (attackType) { - case Type.GROUND: - case Type.PSYCHIC: + case PokemonType.GROUND: + case PokemonType.PSYCHIC: return 2; - case Type.FIGHTING: - case Type.POISON: - case Type.BUG: - case Type.GRASS: - case Type.FAIRY: + case PokemonType.FIGHTING: + case PokemonType.POISON: + case PokemonType.BUG: + case PokemonType.GRASS: + case PokemonType.FAIRY: return 0.5; default: return 1; } - case Type.GROUND: + case PokemonType.GROUND: switch (attackType) { - case Type.WATER: - case Type.GRASS: - case Type.ICE: + case PokemonType.WATER: + case PokemonType.GRASS: + case PokemonType.ICE: return 2; - case Type.POISON: - case Type.ROCK: + case PokemonType.POISON: + case PokemonType.ROCK: return 0.5; - case Type.ELECTRIC: + case PokemonType.ELECTRIC: return 0; default: return 1; } - case Type.ROCK: + case PokemonType.ROCK: switch (attackType) { - case Type.FIGHTING: - case Type.GROUND: - case Type.STEEL: - case Type.WATER: - case Type.GRASS: + case PokemonType.FIGHTING: + case PokemonType.GROUND: + case PokemonType.STEEL: + case PokemonType.WATER: + case PokemonType.GRASS: return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.POISON: - case Type.FIRE: + case PokemonType.NORMAL: + case PokemonType.FLYING: + case PokemonType.POISON: + case PokemonType.FIRE: return 0.5; default: return 1; } - case Type.BUG: + case PokemonType.BUG: switch (attackType) { - case Type.FLYING: - case Type.ROCK: - case Type.FIRE: + case PokemonType.FLYING: + case PokemonType.ROCK: + case PokemonType.FIRE: return 2; - case Type.FIGHTING: - case Type.GROUND: - case Type.GRASS: + case PokemonType.FIGHTING: + case PokemonType.GROUND: + case PokemonType.GRASS: return 0.5; default: return 1; } - case Type.GHOST: + case PokemonType.GHOST: switch (attackType) { - case Type.GHOST: - case Type.DARK: + case PokemonType.GHOST: + case PokemonType.DARK: return 2; - case Type.POISON: - case Type.BUG: + case PokemonType.POISON: + case PokemonType.BUG: return 0.5; - case Type.NORMAL: - case Type.FIGHTING: + case PokemonType.NORMAL: + case PokemonType.FIGHTING: return 0; default: return 1; } - case Type.STEEL: + case PokemonType.STEEL: switch (attackType) { - case Type.FIGHTING: - case Type.GROUND: - case Type.FIRE: + case PokemonType.FIGHTING: + case PokemonType.GROUND: + case PokemonType.FIRE: return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.ROCK: - case Type.BUG: - case Type.STEEL: - case Type.GRASS: - case Type.PSYCHIC: - case Type.ICE: - case Type.DRAGON: - case Type.FAIRY: + case PokemonType.NORMAL: + case PokemonType.FLYING: + case PokemonType.ROCK: + case PokemonType.BUG: + case PokemonType.STEEL: + case PokemonType.GRASS: + case PokemonType.PSYCHIC: + case PokemonType.ICE: + case PokemonType.DRAGON: + case PokemonType.FAIRY: return 0.5; - case Type.POISON: + case PokemonType.POISON: return 0; default: return 1; } - case Type.FIRE: + case PokemonType.FIRE: switch (attackType) { - case Type.GROUND: - case Type.ROCK: - case Type.WATER: + case PokemonType.GROUND: + case PokemonType.ROCK: + case PokemonType.WATER: return 2; - case Type.BUG: - case Type.STEEL: - case Type.FIRE: - case Type.GRASS: - case Type.ICE: - case Type.FAIRY: + case PokemonType.BUG: + case PokemonType.STEEL: + case PokemonType.FIRE: + case PokemonType.GRASS: + case PokemonType.ICE: + case PokemonType.FAIRY: return 0.5; default: return 1; } - case Type.WATER: + case PokemonType.WATER: switch (attackType) { - case Type.GRASS: - case Type.ELECTRIC: + case PokemonType.GRASS: + case PokemonType.ELECTRIC: return 2; - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.ICE: + case PokemonType.STEEL: + case PokemonType.FIRE: + case PokemonType.WATER: + case PokemonType.ICE: return 0.5; default: return 1; } - case Type.GRASS: + case PokemonType.GRASS: switch (attackType) { - case Type.FLYING: - case Type.POISON: - case Type.BUG: - case Type.FIRE: - case Type.ICE: + case PokemonType.FLYING: + case PokemonType.POISON: + case PokemonType.BUG: + case PokemonType.FIRE: + case PokemonType.ICE: return 2; - case Type.GROUND: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: + case PokemonType.GROUND: + case PokemonType.WATER: + case PokemonType.GRASS: + case PokemonType.ELECTRIC: return 0.5; default: return 1; } - case Type.ELECTRIC: + case PokemonType.ELECTRIC: switch (attackType) { - case Type.GROUND: + case PokemonType.GROUND: return 2; - case Type.FLYING: - case Type.STEEL: - case Type.ELECTRIC: + case PokemonType.FLYING: + case PokemonType.STEEL: + case PokemonType.ELECTRIC: return 0.5; default: return 1; } - case Type.PSYCHIC: + case PokemonType.PSYCHIC: switch (attackType) { - case Type.BUG: - case Type.GHOST: - case Type.DARK: + case PokemonType.BUG: + case PokemonType.GHOST: + case PokemonType.DARK: return 2; - case Type.FIGHTING: - case Type.PSYCHIC: + case PokemonType.FIGHTING: + case PokemonType.PSYCHIC: return 0.5; default: return 1; } - case Type.ICE: + case PokemonType.ICE: switch (attackType) { - case Type.FIGHTING: - case Type.ROCK: - case Type.STEEL: - case Type.FIRE: + case PokemonType.FIGHTING: + case PokemonType.ROCK: + case PokemonType.STEEL: + case PokemonType.FIRE: return 2; - case Type.ICE: + case PokemonType.ICE: return 0.5; default: return 1; } - case Type.DRAGON: + case PokemonType.DRAGON: switch (attackType) { - case Type.ICE: - case Type.DRAGON: - case Type.FAIRY: + case PokemonType.ICE: + case PokemonType.DRAGON: + case PokemonType.FAIRY: return 2; - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: + case PokemonType.FIRE: + case PokemonType.WATER: + case PokemonType.GRASS: + case PokemonType.ELECTRIC: return 0.5; default: return 1; } - case Type.DARK: + case PokemonType.DARK: switch (attackType) { - case Type.FIGHTING: - case Type.BUG: - case Type.FAIRY: + case PokemonType.FIGHTING: + case PokemonType.BUG: + case PokemonType.FAIRY: return 2; - case Type.GHOST: - case Type.DARK: + case PokemonType.GHOST: + case PokemonType.DARK: return 0.5; - case Type.PSYCHIC: + case PokemonType.PSYCHIC: return 0; default: return 1; } - case Type.FAIRY: + case PokemonType.FAIRY: switch (attackType) { - case Type.POISON: - case Type.STEEL: + case PokemonType.POISON: + case PokemonType.STEEL: return 2; - case Type.FIGHTING: - case Type.BUG: - case Type.DARK: + case PokemonType.FIGHTING: + case PokemonType.BUG: + case PokemonType.DARK: return 0.5; - case Type.DRAGON: + case PokemonType.DRAGON: return 0; default: return 1; } - case Type.STELLAR: + case PokemonType.STELLAR: return 1; } @@ -292,7 +271,10 @@ export function getTypeDamageMultiplier(attackType: Type, defType: Type): TypeDa * Retrieve the color corresponding to a specific damage multiplier * @returns A color or undefined if the default color should be used */ -export function getTypeDamageMultiplierColor(multiplier: TypeDamageMultiplier, side: "defense" | "offense"): string | undefined { +export function getTypeDamageMultiplierColor( + multiplier: TypeDamageMultiplier, + side: "defense" | "offense", +): string | undefined { if (side === "offense") { switch (multiplier) { case 0: @@ -312,7 +294,8 @@ export function getTypeDamageMultiplierColor(multiplier: TypeDamageMultiplier, s case 8: return "#52C200"; } - } else if (side === "defense") { + } + if (side === "defense") { switch (multiplier) { case 0: return "#B1B100"; @@ -334,47 +317,47 @@ export function getTypeDamageMultiplierColor(multiplier: TypeDamageMultiplier, s } } -export function getTypeRgb(type: Type): [ integer, integer, integer ] { +export function getTypeRgb(type: PokemonType): [number, number, number] { switch (type) { - case Type.NORMAL: - return [ 168, 168, 120 ]; - case Type.FIGHTING: - return [ 192, 48, 40 ]; - case Type.FLYING: - return [ 168, 144, 240 ]; - case Type.POISON: - return [ 160, 64, 160 ]; - case Type.GROUND: - return [ 224, 192, 104 ]; - case Type.ROCK: - return [ 184, 160, 56 ]; - case Type.BUG: - return [ 168, 184, 32 ]; - case Type.GHOST: - return [ 112, 88, 152 ]; - case Type.STEEL: - return [ 184, 184, 208 ]; - case Type.FIRE: - return [ 240, 128, 48 ]; - case Type.WATER: - return [ 104, 144, 240 ]; - case Type.GRASS: - return [ 120, 200, 80 ]; - case Type.ELECTRIC: - return [ 248, 208, 48 ]; - case Type.PSYCHIC: - return [ 248, 88, 136 ]; - case Type.ICE: - return [ 152, 216, 216 ]; - case Type.DRAGON: - return [ 112, 56, 248 ]; - case Type.DARK: - return [ 112, 88, 72 ]; - case Type.FAIRY: - return [ 232, 136, 200 ]; - case Type.STELLAR: - return [ 255, 255, 255 ]; + case PokemonType.NORMAL: + return [168, 168, 120]; + case PokemonType.FIGHTING: + return [192, 48, 40]; + case PokemonType.FLYING: + return [168, 144, 240]; + case PokemonType.POISON: + return [160, 64, 160]; + case PokemonType.GROUND: + return [224, 192, 104]; + case PokemonType.ROCK: + return [184, 160, 56]; + case PokemonType.BUG: + return [168, 184, 32]; + case PokemonType.GHOST: + return [112, 88, 152]; + case PokemonType.STEEL: + return [184, 184, 208]; + case PokemonType.FIRE: + return [240, 128, 48]; + case PokemonType.WATER: + return [104, 144, 240]; + case PokemonType.GRASS: + return [120, 200, 80]; + case PokemonType.ELECTRIC: + return [248, 208, 48]; + case PokemonType.PSYCHIC: + return [248, 88, 136]; + case PokemonType.ICE: + return [152, 216, 216]; + case PokemonType.DRAGON: + return [112, 56, 248]; + case PokemonType.DARK: + return [112, 88, 72]; + case PokemonType.FAIRY: + return [232, 136, 200]; + case PokemonType.STELLAR: + return [255, 255, 255]; default: - return [ 0, 0, 0 ]; + return [0, 0, 0]; } } diff --git a/src/data/variant.ts b/src/data/variant.ts index 13869635f1e..13c11b0bb40 100644 --- a/src/data/variant.ts +++ b/src/data/variant.ts @@ -8,7 +8,7 @@ export const variantData: any = {}; export const variantColorCache = {}; -export function getVariantTint(variant: Variant): integer { +export function getVariantTint(variant: Variant): number { switch (variant) { case 0: return 0xf8c020; @@ -19,7 +19,7 @@ export function getVariantTint(variant: Variant): integer { } } -export function getVariantIcon(variant: Variant): integer { +export function getVariantIcon(variant: Variant): number { switch (variant) { case 0: return VariantTier.STANDARD; diff --git a/src/data/weather.ts b/src/data/weather.ts index 20c03af77c8..c2b0263c9f6 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -1,21 +1,22 @@ import { Biome } from "#enums/biome"; import { WeatherType } from "#enums/weather-type"; import { getPokemonNameWithAffix } from "../messages"; -import Pokemon from "../field/pokemon"; -import { Type } from "./type"; -import Move, { AttackMove } from "./move"; +import type Pokemon from "../field/pokemon"; +import { PokemonType } from "#enums/pokemon-type"; +import type Move from "./moves/move"; +import { AttackMove } from "./moves/move"; import * as Utils from "../utils"; -import BattleScene from "../battle-scene"; import { SuppressWeatherEffectAbAttr } from "./ability"; import { TerrainType, getTerrainName } from "./terrain"; import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; +import type { Arena } from "#app/field/arena"; -export { WeatherType }; export class Weather { public weatherType: WeatherType; - public turnsLeft: integer; + public turnsLeft: number; - constructor(weatherType: WeatherType, turnsLeft?: integer) { + constructor(weatherType: WeatherType, turnsLeft?: number) { this.weatherType = weatherType; this.turnsLeft = !this.isImmutable() ? turnsLeft || 0 : 0; } @@ -52,34 +53,34 @@ export class Weather { return false; } - isTypeDamageImmune(type: Type): boolean { + isTypeDamageImmune(type: PokemonType): boolean { switch (this.weatherType) { case WeatherType.SANDSTORM: - return type === Type.GROUND || type === Type.ROCK || type === Type.STEEL; + return type === PokemonType.GROUND || type === PokemonType.ROCK || type === PokemonType.STEEL; case WeatherType.HAIL: - return type === Type.ICE; + return type === PokemonType.ICE; } return false; } - getAttackTypeMultiplier(attackType: Type): number { + getAttackTypeMultiplier(attackType: PokemonType): number { switch (this.weatherType) { case WeatherType.SUNNY: case WeatherType.HARSH_SUN: - if (attackType === Type.FIRE) { + if (attackType === PokemonType.FIRE) { return 1.5; } - if (attackType === Type.WATER) { + if (attackType === PokemonType.WATER) { return 0.5; } break; case WeatherType.RAIN: case WeatherType.HEAVY_RAIN: - if (attackType === Type.FIRE) { + if (attackType === PokemonType.FIRE) { return 0.5; } - if (attackType === Type.WATER) { + if (attackType === PokemonType.WATER) { return 1.5; } break; @@ -93,21 +94,25 @@ export class Weather { switch (this.weatherType) { case WeatherType.HARSH_SUN: - return move instanceof AttackMove && moveType === Type.WATER; + return move instanceof AttackMove && moveType === PokemonType.WATER; case WeatherType.HEAVY_RAIN: - return move instanceof AttackMove && moveType === Type.FIRE; + return move instanceof AttackMove && moveType === PokemonType.FIRE; } return false; } - isEffectSuppressed(scene: BattleScene): boolean { - const field = scene.getField(true); + isEffectSuppressed(): boolean { + const field = globalScene.getField(true); for (const pokemon of field) { - let suppressWeatherEffectAbAttr: SuppressWeatherEffectAbAttr | null = pokemon.getAbility().getAttrs(SuppressWeatherEffectAbAttr)[0]; + let suppressWeatherEffectAbAttr: SuppressWeatherEffectAbAttr | null = pokemon + .getAbility() + .getAttrs(SuppressWeatherEffectAbAttr)[0]; if (!suppressWeatherEffectAbAttr) { - suppressWeatherEffectAbAttr = pokemon.hasPassive() ? pokemon.getPassiveAbility().getAttrs(SuppressWeatherEffectAbAttr)[0] : null; + suppressWeatherEffectAbAttr = pokemon.hasPassive() + ? pokemon.getPassiveAbility().getAttrs(SuppressWeatherEffectAbAttr)[0] + : null; } if (suppressWeatherEffectAbAttr && (!this.isImmutable() || suppressWeatherEffectAbAttr.affectsImmutable)) { return true; @@ -171,9 +176,13 @@ export function getWeatherLapseMessage(weatherType: WeatherType): string | null export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokemon): string | null { switch (weatherType) { case WeatherType.SANDSTORM: - return i18next.t("weather:sandstormDamageMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("weather:sandstormDamageMessage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); case WeatherType.HAIL: - return i18next.t("weather:hailDamageMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("weather:hailDamageMessage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } return null; @@ -204,6 +213,28 @@ export function getWeatherClearMessage(weatherType: WeatherType): string | null return null; } +export function getLegendaryWeatherContinuesMessage(weatherType: WeatherType): string | null { + switch (weatherType) { + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunContinueMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainContinueMessage"); + case WeatherType.STRONG_WINDS: + return i18next.t("weather:strongWindsContinueMessage"); + } + return null; +} + +export function getWeatherBlockMessage(weatherType: WeatherType): string { + switch (weatherType) { + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunEffectMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainEffectMessage"); + } + return i18next.t("weather:defaultEffectMessage"); +} + export function getTerrainStartMessage(terrainType: TerrainType): string | null { switch (terrainType) { case TerrainType.MISTY: @@ -238,24 +269,27 @@ export function getTerrainClearMessage(terrainType: TerrainType): string | null export function getTerrainBlockMessage(pokemon: Pokemon, terrainType: TerrainType): string { if (terrainType === TerrainType.MISTY) { - return i18next.t("terrain:mistyBlockMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + return i18next.t("terrain:mistyBlockMessage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }); } - return i18next.t("terrain:defaultBlockMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), terrainName: getTerrainName(terrainType) }); + return i18next.t("terrain:defaultBlockMessage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + terrainName: getTerrainName(terrainType), + }); } -interface WeatherPoolEntry { +export interface WeatherPoolEntry { weatherType: WeatherType; - weight: integer; + weight: number; } -export function getRandomWeatherType(arena: any /* Importing from arena causes a circular dependency */): WeatherType { +export function getRandomWeatherType(arena: Arena): WeatherType { let weatherPool: WeatherPoolEntry[] = []; const hasSun = arena.getTimeOfDay() < 2; switch (arena.biomeType) { case Biome.GRASS: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 7 } - ]; + weatherPool = [{ weatherType: WeatherType.NONE, weight: 7 }]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 3 }); } @@ -272,26 +306,26 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a case Biome.FOREST: weatherPool = [ { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 5 } + { weatherType: WeatherType.RAIN, weight: 5 }, ]; break; case Biome.SEA: weatherPool = [ { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.RAIN, weight: 12 } + { weatherType: WeatherType.RAIN, weight: 12 }, ]; break; case Biome.SWAMP: weatherPool = [ { weatherType: WeatherType.NONE, weight: 3 }, { weatherType: WeatherType.RAIN, weight: 4 }, - { weatherType: WeatherType.FOG, weight: 1 } + { weatherType: WeatherType.FOG, weight: 1 }, ]; break; case Biome.BEACH: weatherPool = [ { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 3 } + { weatherType: WeatherType.RAIN, weight: 3 }, ]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); @@ -301,27 +335,23 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a weatherPool = [ { weatherType: WeatherType.NONE, weight: 10 }, { weatherType: WeatherType.RAIN, weight: 5 }, - { weatherType: WeatherType.FOG, weight: 1 } + { weatherType: WeatherType.FOG, weight: 1 }, ]; break; case Biome.SEABED: - weatherPool = [ - { weatherType: WeatherType.RAIN, weight: 1 } - ]; + weatherPool = [{ weatherType: WeatherType.RAIN, weight: 1 }]; break; case Biome.BADLANDS: weatherPool = [ { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.SANDSTORM, weight: 2 } + { weatherType: WeatherType.SANDSTORM, weight: 2 }, ]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); } break; case Biome.DESERT: - weatherPool = [ - { weatherType: WeatherType.SANDSTORM, weight: 2 } - ]; + weatherPool = [{ weatherType: WeatherType.SANDSTORM, weight: 2 }]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); } @@ -330,37 +360,38 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a weatherPool = [ { weatherType: WeatherType.NONE, weight: 3 }, { weatherType: WeatherType.SNOW, weight: 4 }, - { weatherType: WeatherType.HAIL, weight: 1 } + { weatherType: WeatherType.HAIL, weight: 1 }, ]; break; case Biome.MEADOW: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 2 } - ]; + weatherPool = [{ weatherType: WeatherType.NONE, weight: 2 }]; if (hasSun) { weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); } case Biome.VOLCANO: weatherPool = [ - { weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE, weight: 1 } + { + weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE, + weight: 1, + }, ]; break; case Biome.GRAVEYARD: weatherPool = [ { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.FOG, weight: 1 } + { weatherType: WeatherType.FOG, weight: 1 }, ]; break; case Biome.JUNGLE: weatherPool = [ { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 2 } + { weatherType: WeatherType.RAIN, weight: 2 }, ]; break; case Biome.SNOWY_FOREST: weatherPool = [ { weatherType: WeatherType.SNOW, weight: 7 }, - { weatherType: WeatherType.HAIL, weight: 1 } + { weatherType: WeatherType.HAIL, weight: 1 }, ]; break; case Biome.ISLAND: @@ -374,9 +405,15 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a break; } + if (arena.biomeType === Biome.TOWN && globalScene.eventManager.isEventActive()) { + globalScene.eventManager.getWeather()?.map(w => weatherPool.push(w)); + } + if (weatherPool.length > 1) { let totalWeight = 0; - weatherPool.forEach(w => totalWeight += w.weight); + for (const w of weatherPool) { + totalWeight += w.weight; + } const rand = Utils.randSeedInt(totalWeight); let w = 0; @@ -388,7 +425,5 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a } } - return weatherPool.length - ? weatherPool[0].weatherType - : WeatherType.NONE; + return weatherPool.length ? weatherPool[0].weatherType : WeatherType.NONE; } diff --git a/src/debug.js b/src/debug.js index e0f27332d3d..6ddf6046c7a 100644 --- a/src/debug.js +++ b/src/debug.js @@ -3,7 +3,9 @@ export function getData() { if (!dataStr) { return null; } - return JSON.parse(atob(dataStr), (k, v) => k.endsWith("Attr") && ![ "natureAttr", "abilityAttr", "passiveAttr" ].includes(k) ? BigInt(v) : v); + return JSON.parse(atob(dataStr), (k, v) => + k.endsWith("Attr") && !["natureAttr", "abilityAttr", "passiveAttr"].includes(k) ? BigInt(v) : v, + ); } export function getSession() { diff --git a/src/enums/MoveCategory.ts b/src/enums/MoveCategory.ts new file mode 100644 index 00000000000..0408655e6db --- /dev/null +++ b/src/enums/MoveCategory.ts @@ -0,0 +1,5 @@ +export enum MoveCategory { + PHYSICAL, + SPECIAL, + STATUS +} diff --git a/src/enums/MoveEffectTrigger.ts b/src/enums/MoveEffectTrigger.ts new file mode 100644 index 00000000000..1e7753d94fa --- /dev/null +++ b/src/enums/MoveEffectTrigger.ts @@ -0,0 +1,7 @@ +export enum MoveEffectTrigger { + PRE_APPLY, + POST_APPLY, + HIT, + /** Triggers one time after all target effects have applied */ + POST_TARGET +} diff --git a/src/enums/MoveFlags.ts b/src/enums/MoveFlags.ts new file mode 100644 index 00000000000..0fc85fddec6 --- /dev/null +++ b/src/enums/MoveFlags.ts @@ -0,0 +1,46 @@ +export enum MoveFlags { + NONE = 0, + MAKES_CONTACT = 1 << 0, + IGNORE_PROTECT = 1 << 1, + /** + * Sound-based moves have the following effects: + * - Pokemon with the {@linkcode Abilities.SOUNDPROOF Soundproof Ability} are unaffected by other Pokemon's sound-based moves. + * - Pokemon affected by {@linkcode Moves.THROAT_CHOP Throat Chop} cannot use sound-based moves for two turns. + * - Sound-based moves used by a Pokemon with {@linkcode Abilities.LIQUID_VOICE Liquid Voice} become Water-type moves. + * - Sound-based moves used by a Pokemon with {@linkcode Abilities.PUNK_ROCK Punk Rock} are boosted by 30%. Pokemon with Punk Rock also take half damage from sound-based moves. + * - All sound-based moves (except Howl) can hit Pokemon behind an active {@linkcode Moves.SUBSTITUTE Substitute}. + * + * cf https://bulbapedia.bulbagarden.net/wiki/Sound-based_move + */ + SOUND_BASED = 1 << 2, + HIDE_USER = 1 << 3, + HIDE_TARGET = 1 << 4, + BITING_MOVE = 1 << 5, + PULSE_MOVE = 1 << 6, + PUNCHING_MOVE = 1 << 7, + SLICING_MOVE = 1 << 8, + /** + * Indicates a move should be affected by {@linkcode Abilities.RECKLESS} + * @see {@linkcode Move.recklessMove()} + */ + RECKLESS_MOVE = 1 << 9, + /** Indicates a move should be affected by {@linkcode Abilities.BULLETPROOF} */ + BALLBOMB_MOVE = 1 << 10, + /** Grass types and pokemon with {@linkcode Abilities.OVERCOAT} are immune to powder moves */ + POWDER_MOVE = 1 << 11, + /** Indicates a move should trigger {@linkcode Abilities.DANCER} */ + DANCE_MOVE = 1 << 12, + /** Indicates a move should trigger {@linkcode Abilities.WIND_RIDER} */ + WIND_MOVE = 1 << 13, + /** Indicates a move should trigger {@linkcode Abilities.TRIAGE} */ + TRIAGE_MOVE = 1 << 14, + IGNORE_ABILITIES = 1 << 15, + /** Enables all hits of a multi-hit move to be accuracy checked individually */ + CHECK_ALL_HITS = 1 << 16, + /** Indicates a move is able to bypass its target's Substitute (if the target has one) */ + IGNORE_SUBSTITUTE = 1 << 17, + /** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */ + REDIRECT_COUNTER = 1 << 18, + /** Indicates a move is able to be reflected by {@linkcode Abilities.MAGIC_BOUNCE} and {@linkcode Moves.MAGIC_COAT} */ + REFLECTABLE = 1 << 19 +} diff --git a/src/enums/MoveTarget.ts b/src/enums/MoveTarget.ts new file mode 100644 index 00000000000..615628cf4e8 --- /dev/null +++ b/src/enums/MoveTarget.ts @@ -0,0 +1,29 @@ +export enum MoveTarget { + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_the_user Moves that target the User} */ + USER, + OTHER, + ALL_OTHERS, + NEAR_OTHER, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_Pok%C3%A9mon Moves that target all adjacent Pokemon} */ + ALL_NEAR_OTHERS, + NEAR_ENEMY, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_adjacent_foes Moves that target all adjacent foes} */ + ALL_NEAR_ENEMIES, + RANDOM_NEAR_ENEMY, + ALL_ENEMIES, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Counterattacks Counterattacks} */ + ATTACKER, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_one_adjacent_ally Moves that target one adjacent ally} */ + NEAR_ALLY, + ALLY, + USER_OR_NEAR_ALLY, + USER_AND_ALLIES, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Moves_that_target_all_Pok%C3%A9mon Moves that target all Pokemon} */ + ALL, + USER_SIDE, + /** {@link https://bulbapedia.bulbagarden.net/wiki/Category:Entry_hazard-creating_moves Entry hazard-creating moves} */ + ENEMY_SIDE, + BOTH_SIDES, + PARTY, + CURSE +} diff --git a/src/enums/MultiHitType.ts b/src/enums/MultiHitType.ts new file mode 100644 index 00000000000..27e8214112e --- /dev/null +++ b/src/enums/MultiHitType.ts @@ -0,0 +1,7 @@ +export enum MultiHitType { + _2, + _2_TO_5, + _3, + _10, + BEAT_UP +} diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index c73f4ec2ae5..4180aa00ef5 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -28,4 +28,6 @@ export enum ArenaTagType { FIRE_GRASS_PLEDGE = "FIRE_GRASS_PLEDGE", WATER_FIRE_PLEDGE = "WATER_FIRE_PLEDGE", GRASS_WATER_PLEDGE = "GRASS_WATER_PLEDGE", + FAIRY_LOCK = "FAIRY_LOCK", + NEUTRALIZING_GAS = "NEUTRALIZING_GAS" } diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 680dedb93cc..719b08c5b81 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -74,6 +74,7 @@ export enum BattlerTagType { DRAGON_CHEER = "DRAGON_CHEER", NO_RETREAT = "NO_RETREAT", GORILLA_TACTICS = "GORILLA_TACTICS", + UNBURDEN = "UNBURDEN", THROAT_CHOPPED = "THROAT_CHOPPED", TAR_SHOT = "TAR_SHOT", BURNED_UP = "BURNED_UP", @@ -87,5 +88,11 @@ export enum BattlerTagType { IMPRISON = "IMPRISON", SYRUP_BOMB = "SYRUP_BOMB", ELECTRIFIED = "ELECTRIFIED", - TELEKINESIS = "TELEKINESIS" + TELEKINESIS = "TELEKINESIS", + COMMANDED = "COMMANDED", + GRUDGE = "GRUDGE", + PSYCHO_SHIFT = "PSYCHO_SHIFT", + ENDURE_TOKEN = "ENDURE_TOKEN", + POWDER = "POWDER", + MAGIC_COAT = "MAGIC_COAT", } diff --git a/src/enums/buttons.ts b/src/enums/buttons.ts index fe26023f8e7..f828b280d45 100644 --- a/src/enums/buttons.ts +++ b/src/enums/buttons.ts @@ -13,7 +13,7 @@ export enum Button { CYCLE_GENDER, CYCLE_ABILITY, CYCLE_NATURE, - V, + CYCLE_TERA, SPEED_UP, - SLOW_DOWN + SLOW_DOWN, } diff --git a/src/enums/challenges.ts b/src/enums/challenges.ts index c4dc7460dfe..7b506a61a2f 100644 --- a/src/enums/challenges.ts +++ b/src/enums/challenges.ts @@ -5,4 +5,5 @@ export enum Challenges { LOWER_STARTER_POINTS, FRESH_START, INVERSE_BATTLE, + FLIP_STAT, } diff --git a/src/enums/pokemon-anim-type.ts b/src/enums/pokemon-anim-type.ts index 5a0a0c2f622..b153fb2e652 100644 --- a/src/enums/pokemon-anim-type.ts +++ b/src/enums/pokemon-anim-type.ts @@ -12,5 +12,15 @@ export enum PokemonAnimType { * Removes a Pokemon's Substitute doll from the field. * The Pokemon then moves back to its original position. */ - SUBSTITUTE_REMOVE + SUBSTITUTE_REMOVE, + /** + * Brings Tatsugiri and Dondozo to the center of the field, with + * Tatsugiri jumping into the Dondozo's mouth + */ + COMMANDER_APPLY, + /** + * Dondozo "spits out" Tatsugiri, moving Tatsugiri back to its original + * field position. + */ + COMMANDER_REMOVE } diff --git a/src/enums/pokemon-type.ts b/src/enums/pokemon-type.ts new file mode 100644 index 00000000000..eca02bae275 --- /dev/null +++ b/src/enums/pokemon-type.ts @@ -0,0 +1,22 @@ +export enum PokemonType { + UNKNOWN = -1, + NORMAL = 0, + FIGHTING, + FLYING, + POISON, + GROUND, + ROCK, + BUG, + GHOST, + STEEL, + FIRE, + WATER, + GRASS, + ELECTRIC, + PSYCHIC, + ICE, + DRAGON, + DARK, + FAIRY, + STELLAR +} diff --git a/src/enums/stat.ts b/src/enums/stat.ts index 6b3f7dc6d79..a2b81b7e64b 100644 --- a/src/enums/stat.ts +++ b/src/enums/stat.ts @@ -48,9 +48,11 @@ export type TempBattleStat = typeof TEMP_BATTLE_STATS[number]; export function getStatStageChangeDescriptionKey(stages: number, isIncrease: boolean) { if (stages === 1) { return isIncrease ? "battle:statRose" : "battle:statFell"; - } else if (stages === 2) { + } + if (stages === 2) { return isIncrease ? "battle:statSharplyRose" : "battle:statHarshlyFell"; - } else if (stages > 2 && stages <= 6) { + } + if (stages > 2 && stages <= 6) { return isIncrease ? "battle:statRoseDrastically" : "battle:statSeverelyFell"; } return isIncrease ? "battle:statWontGoAnyHigher" : "battle:statWontGoAnyLower"; diff --git a/src/enums/switch-type.ts b/src/enums/switch-type.ts index b25ba6ad119..d55872ae83b 100644 --- a/src/enums/switch-type.ts +++ b/src/enums/switch-type.ts @@ -3,10 +3,14 @@ * or {@linkcode SwitchSummonPhase} will carry out. */ export enum SwitchType { + /** Switchout specifically for when combat starts and the player is prompted if they will switch Pokemon */ + INITIAL_SWITCH, /** Basic switchout where the Pokemon to switch in is selected */ SWITCH, /** 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/enums/trainer-type.ts b/src/enums/trainer-type.ts index 708faf69196..e22dc5d81c7 100644 --- a/src/enums/trainer-type.ts +++ b/src/enums/trainer-type.ts @@ -68,7 +68,7 @@ export enum TrainerType { SATURN, PLASMA_GRUNT, ZINZOLIN, - ROOD, + COLRESS, FLARE_GRUNT, BRYONY, XEROSIC, @@ -243,8 +243,10 @@ export enum TrainerType { ALDER, IRIS, DIANTHA, + KUKUI, HAU, LEON, + MUSTARD, GEETA, NEMONA, KIERAN, diff --git a/src/events/arena.ts b/src/events/arena.ts index c05e67d353c..ad77289b76b 100644 --- a/src/events/arena.ts +++ b/src/events/arena.ts @@ -1,7 +1,7 @@ -import { ArenaTagSide } from "#app/data/arena-tag"; -import { ArenaTagType } from "#enums/arena-tag-type"; -import { TerrainType } from "#app/data/terrain"; -import { WeatherType } from "#app/data/weather"; +import type { ArenaTagSide } from "#app/data/arena-tag"; +import type { ArenaTagType } from "#enums/arena-tag-type"; +import type { TerrainType } from "#app/data/terrain"; +import type { WeatherType } from "#enums/weather-type"; /** Alias for all {@linkcode ArenaEvent} type strings */ export enum ArenaEventType { @@ -32,7 +32,7 @@ export class ArenaEvent extends Event { /** * Container class for {@linkcode ArenaEventType.WEATHER_CHANGED} events * @extends ArenaEvent -*/ + */ export class WeatherChangedEvent extends ArenaEvent { /** The {@linkcode WeatherType} being overridden */ public oldWeatherType: WeatherType; @@ -48,7 +48,7 @@ export class WeatherChangedEvent extends ArenaEvent { /** * Container class for {@linkcode ArenaEventType.TERRAIN_CHANGED} events * @extends ArenaEvent -*/ + */ export class TerrainChangedEvent extends ArenaEvent { /** The {@linkcode TerrainType} being overridden */ public oldTerrainType: TerrainType; @@ -65,7 +65,7 @@ export class TerrainChangedEvent extends ArenaEvent { /** * Container class for {@linkcode ArenaEventType.TAG_ADDED} events * @extends ArenaEvent -*/ + */ export class TagAddedEvent extends ArenaEvent { /** The {@linkcode ArenaTagType} being added */ public arenaTagType: ArenaTagType; @@ -76,7 +76,13 @@ export class TagAddedEvent extends ArenaEvent { /** The maximum amount of layers of the arena trap. */ public arenaTagMaxLayers: number; - constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaTagSide, duration: number, arenaTagLayers?: number, arenaTagMaxLayers?: number) { + constructor( + arenaTagType: ArenaTagType, + arenaTagSide: ArenaTagSide, + duration: number, + arenaTagLayers?: number, + arenaTagMaxLayers?: number, + ) { super(ArenaEventType.TAG_ADDED, duration); this.arenaTagType = arenaTagType; @@ -88,7 +94,7 @@ export class TagAddedEvent extends ArenaEvent { /** * Container class for {@linkcode ArenaEventType.TAG_REMOVED} events * @extends ArenaEvent -*/ + */ export class TagRemovedEvent extends ArenaEvent { /** The {@linkcode ArenaTagType} being removed */ public arenaTagType: ArenaTagType; diff --git a/src/events/battle-scene.ts b/src/events/battle-scene.ts index b2e4461f8d0..83d260bd7d2 100644 --- a/src/events/battle-scene.ts +++ b/src/events/battle-scene.ts @@ -1,5 +1,5 @@ -import Move from "../data/move"; -import { BerryModifier } from "../modifier/modifier"; +import type Move from "../data/moves/move"; +import type { BerryModifier } from "../modifier/modifier"; /** Alias for all {@linkcode BattleScene} events */ export enum BattleSceneEventType { @@ -34,7 +34,7 @@ export enum BattleSceneEventType { * Triggers after a turn ends in battle * @see {@linkcode TurnEndEvent} */ - TURN_END = "onTurnEnd", + TURN_END = "onTurnEnd", /** * Triggers when a new {@linkcode Arena} is created during initialization @@ -46,7 +46,7 @@ export enum BattleSceneEventType { /** * Container class for {@linkcode BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED} events * @extends Event -*/ + */ export class CandyUpgradeNotificationChangedEvent extends Event { /** The new value the setting was changed to */ public newValue: number; @@ -60,7 +60,7 @@ export class CandyUpgradeNotificationChangedEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.MOVE_USED} events * @extends Event -*/ + */ export class MoveUsedEvent extends Event { /** The ID of the {@linkcode Pokemon} that used the {@linkcode Move} */ public pokemonId: number; @@ -79,7 +79,7 @@ export class MoveUsedEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.BERRY_USED} events * @extends Event -*/ + */ export class BerryUsedEvent extends Event { /** The {@linkcode BerryModifier} being used */ public berryModifier: BerryModifier; @@ -93,7 +93,7 @@ export class BerryUsedEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.ENCOUNTER_PHASE} events * @extends Event -*/ + */ export class EncounterPhaseEvent extends Event { constructor() { super(BattleSceneEventType.ENCOUNTER_PHASE); @@ -102,7 +102,7 @@ export class EncounterPhaseEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.TURN_INIT} events * @extends Event -*/ + */ export class TurnInitEvent extends Event { constructor() { super(BattleSceneEventType.TURN_INIT); @@ -111,7 +111,7 @@ export class TurnInitEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.TURN_END} events * @extends Event -*/ + */ export class TurnEndEvent extends Event { /** The amount of turns in the current battle */ public turnCount: number; @@ -124,7 +124,7 @@ export class TurnEndEvent extends Event { /** * Container class for {@linkcode BattleSceneEventType.NEW_ARENA} events * @extends Event -*/ + */ export class NewArenaEvent extends Event { constructor() { super(BattleSceneEventType.NEW_ARENA); diff --git a/src/events/egg.ts b/src/events/egg.ts index b30c37a25e8..a0c26c82883 100644 --- a/src/events/egg.ts +++ b/src/events/egg.ts @@ -3,16 +3,16 @@ export enum EggEventType { * Triggers when egg count is changed. * @see {@linkcode MoveUsedEvent} */ - EGG_COUNT_CHANGED = "onEggCountChanged" + EGG_COUNT_CHANGED = "onEggCountChanged", } /** * Container class for {@linkcode EggEventType.EGG_COUNT_CHANGED} events * @extends Event -*/ + */ export class EggCountChangedEvent extends Event { /** The updated egg count. */ - public eggCount: integer; + public eggCount: number; constructor(eggCount: number) { super(EggEventType.EGG_COUNT_CHANGED); diff --git a/src/field/anims.ts b/src/field/anims.ts index c73c52027c5..cd6209dddff 100644 --- a/src/field/anims.ts +++ b/src/field/anims.ts @@ -1,79 +1,84 @@ -import BattleScene from "../battle-scene"; -import { PokeballType } from "../data/pokeball"; -import * as Utils from "../utils"; +import { globalScene } from "#app/global-scene"; +import { PokeballType } from "#enums/pokeball"; +import type { Variant } from "#app/data/variant"; +import { getFrameMs, randGauss } from "#app/utils"; -export function addPokeballOpenParticles(scene: BattleScene, x: number, y: number, pokeballType: PokeballType): void { +export function addPokeballOpenParticles(x: number, y: number, pokeballType: PokeballType): void { switch (pokeballType) { case PokeballType.POKEBALL: - doDefaultPbOpenParticles(scene, x, y, 48); + doDefaultPbOpenParticles(x, y, 48); break; case PokeballType.GREAT_BALL: - doDefaultPbOpenParticles(scene, x, y, 96); + doDefaultPbOpenParticles(x, y, 96); break; case PokeballType.ULTRA_BALL: - doUbOpenParticles(scene, x, y, 8); + doUbOpenParticles(x, y, 8); break; case PokeballType.ROGUE_BALL: - doUbOpenParticles(scene, x, y, 10); + doUbOpenParticles(x, y, 10); break; case PokeballType.MASTER_BALL: - doMbOpenParticles(scene, x, y); + doMbOpenParticles(x, y); break; } } -function doDefaultPbOpenParticles(scene: BattleScene, x: number, y: number, radius: number) { - const pbOpenParticlesFrameNames = scene.anims.generateFrameNames("pb_particles", { start: 0, end: 3, suffix: ".png" }); - if (!(scene.anims.exists("pb_open_particle"))) { - scene.anims.create({ +function doDefaultPbOpenParticles(x: number, y: number, radius: number) { + const pbOpenParticlesFrameNames = globalScene.anims.generateFrameNames("pb_particles", { + start: 0, + end: 3, + suffix: ".png", + }); + if (!globalScene.anims.exists("pb_open_particle")) { + globalScene.anims.create({ key: "pb_open_particle", frames: pbOpenParticlesFrameNames, frameRate: 16, - repeat: -1 + repeat: -1, }); } - const addParticle = (index: integer) => { - const particle = scene.add.sprite(x, y, "pb_open_particle"); - scene.field.add(particle); + const addParticle = (index: number) => { + const particle = globalScene.add.sprite(x, y, "pb_open_particle"); + globalScene.field.add(particle); const angle = index * 45; - const [ xCoord, yCoord ] = [ radius * Math.cos(angle * Math.PI / 180), radius * Math.sin(angle * Math.PI / 180) ]; - scene.tweens.add({ + const [xCoord, yCoord] = [radius * Math.cos((angle * Math.PI) / 180), radius * Math.sin((angle * Math.PI) / 180)]; + globalScene.tweens.add({ targets: particle, x: x + xCoord, y: y + yCoord, - duration: 575 + duration: 575, }); particle.play({ key: "pb_open_particle", startFrame: (index + 3) % 4, - frameRate: Math.floor(16 * scene.gameSpeed) + frameRate: Math.floor(16 * globalScene.gameSpeed), }); - scene.tweens.add({ + globalScene.tweens.add({ targets: particle, delay: 500, duration: 75, alpha: 0, ease: "Sine.easeIn", - onComplete: () => particle.destroy() + onComplete: () => particle.destroy(), }); }; let particleCount = 0; - scene.time.addEvent({ + globalScene.time.addEvent({ delay: 20, repeat: 16, - callback: () => addParticle(++particleCount) + callback: () => addParticle(++particleCount), }); } -function doUbOpenParticles(scene: BattleScene, x: number, y: number, frameIndex: integer) { +function doUbOpenParticles(x: number, y: number, frameIndex: number) { const particles: Phaser.GameObjects.Image[] = []; for (let i = 0; i < 10; i++) { - particles.push(doFanOutParticle(scene, i * 25, x, y, 1, 1, 5, frameIndex)); + particles.push(doFanOutParticle(i * 25, x, y, 1, 1, 5, frameIndex)); } - scene.tweens.add({ + globalScene.tweens.add({ targets: particles, delay: 750, duration: 250, @@ -83,18 +88,18 @@ function doUbOpenParticles(scene: BattleScene, x: number, y: number, frameIndex: for (const particle of particles) { particle.destroy(); } - } + }, }); } -function doMbOpenParticles(scene: BattleScene, x: number, y: number) { +function doMbOpenParticles(x: number, y: number) { const particles: Phaser.GameObjects.Image[] = []; for (let j = 0; j < 2; j++) { for (let i = 0; i < 8; i++) { - particles.push(doFanOutParticle(scene, i * 32, x, y, j ? 1 : 2, j ? 2 : 1, 8, 4)); + particles.push(doFanOutParticle(i * 32, x, y, j ? 1 : 2, j ? 2 : 1, 8, 4)); } - scene.tweens.add({ + globalScene.tweens.add({ targets: particles, delay: 750, duration: 250, @@ -104,16 +109,24 @@ function doMbOpenParticles(scene: BattleScene, x: number, y: number) { for (const particle of particles) { particle.destroy(); } - } + }, }); } } -function doFanOutParticle(scene: BattleScene, trigIndex: integer, x: integer, y: integer, xSpeed: integer, ySpeed: integer, angle: integer, frameIndex: integer): Phaser.GameObjects.Image { +function doFanOutParticle( + trigIndex: number, + x: number, + y: number, + xSpeed: number, + ySpeed: number, + angle: number, + frameIndex: number, +): Phaser.GameObjects.Image { let f = 0; - const particle = scene.add.image(x, y, "pb_particles", `${frameIndex}.png`); - scene.field.add(particle); + const particle = globalScene.add.image(x, y, "pb_particles", `${frameIndex}.png`); + globalScene.field.add(particle); const updateParticle = () => { if (!particle.scene) { @@ -121,67 +134,98 @@ function doFanOutParticle(scene: BattleScene, trigIndex: integer, x: integer, y: } particle.x = x + sin(trigIndex, f * xSpeed); particle.y = y + cos(trigIndex, f * ySpeed); - trigIndex = (trigIndex + angle); + trigIndex = trigIndex + angle; f++; }; - const particleTimer = scene.tweens.addCounter({ + const particleTimer = globalScene.tweens.addCounter({ repeat: -1, - duration: Utils.getFrameMs(1), + duration: getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); return particle; } -export function addPokeballCaptureStars(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite): void { +export function addPokeballCaptureStars(pokeball: Phaser.GameObjects.Sprite): void { const addParticle = () => { - const particle = scene.add.sprite(pokeball.x, pokeball.y, "pb_particles", "4.png"); + const particle = globalScene.add.sprite(pokeball.x, pokeball.y, "pb_particles", "4.png"); particle.setOrigin(pokeball.originX, pokeball.originY); particle.setAlpha(0.5); - scene.field.add(particle); + globalScene.field.add(particle); - scene.tweens.add({ + globalScene.tweens.add({ targets: particle, y: pokeball.y - 10, ease: "Sine.easeOut", duration: 250, onComplete: () => { - scene.tweens.add({ + globalScene.tweens.add({ targets: particle, y: pokeball.y, alpha: 0, ease: "Sine.easeIn", - duration: 250 + duration: 250, }); - } + }, }); - const dist = Utils.randGauss(25); - scene.tweens.add({ + const dist = randGauss(25); + globalScene.tweens.add({ targets: particle, x: pokeball.x + dist, - duration: 500 + duration: 500, }); - scene.tweens.add({ + globalScene.tweens.add({ targets: particle, alpha: 0, delay: 425, duration: 75, - onComplete: () => particle.destroy() + onComplete: () => particle.destroy(), }); }; new Array(3).fill(null).map(() => addParticle()); } -export function sin(index: integer, amplitude: integer): number { +export function sin(index: number, amplitude: number): number { return amplitude * Math.sin(index * (Math.PI / 128)); } -export function cos(index: integer, amplitude: integer): number { +export function cos(index: number, amplitude: number): 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(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 (!globalScene.anims.exists(animationKey)) { + const frameNames = globalScene.anims.generateFrameNames(spriteKey, { + suffix: ".png", + end: 34, + }); + globalScene.anims.create({ + key: `sparkle${keySuffix}`, + frames: frameNames, + frameRate: 32, + showOnStart: true, + hideOnComplete: true, + }); + } + + // Play the animation + sparkleSprite.play(animationKey); + globalScene.playSound("se/sparkle"); +} diff --git a/src/field/arena.ts b/src/field/arena.ts index 7bfdf9a0000..997b80b3237 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -1,22 +1,39 @@ -import BattleScene from "#app/battle-scene"; -import { biomePokemonPools, BiomePoolTier, BiomeTierTrainerPools, biomeTrainerPools, PokemonPools } from "#app/data/balance/biomes"; -import { Constructor } from "#app/utils"; +import { globalScene } from "#app/global-scene"; +import type { BiomeTierTrainerPools, PokemonPools } from "#app/data/balance/biomes"; +import { biomePokemonPools, BiomePoolTier, biomeTrainerPools } from "#app/data/balance/biomes"; +import type { Constructor } from "#app/utils"; import * as Utils from "#app/utils"; -import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; -import { getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage, Weather, WeatherType } from "#app/data/weather"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { + getTerrainClearMessage, + getTerrainStartMessage, + getWeatherClearMessage, + getWeatherStartMessage, + getLegendaryWeatherContinuesMessage, + Weather, +} from "#app/data/weather"; import { CommonAnim } from "#app/data/battle-anims"; -import { Type } from "#app/data/type"; -import Move from "#app/data/move"; -import { ArenaTag, ArenaTagSide, ArenaTrapTag, getArenaTag } from "#app/data/arena-tag"; -import { BattlerIndex } from "#app/battle"; +import type { PokemonType } from "#enums/pokemon-type"; +import type Move from "#app/data/moves/move"; +import type { ArenaTag } from "#app/data/arena-tag"; +import { ArenaTagSide, ArenaTrapTag, getArenaTag } from "#app/data/arena-tag"; +import type { BattlerIndex } from "#app/battle"; import { Terrain, TerrainType } from "#app/data/terrain"; -import { applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs, PostTerrainChangeAbAttr, PostWeatherChangeAbAttr } from "#app/data/ability"; -import Pokemon from "#app/field/pokemon"; +import { + applyAbAttrs, + applyPostTerrainChangeAbAttrs, + applyPostWeatherChangeAbAttrs, + PostTerrainChangeAbAttr, + PostWeatherChangeAbAttr, + TerrainEventTypeChangeAbAttr, +} from "#app/data/ability"; +import type Pokemon from "#app/field/pokemon"; import Overrides from "#app/overrides"; import { TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; -import { ArenaTagType } from "#enums/arena-tag-type"; +import type { ArenaTagType } from "#enums/arena-tag-type"; import { Biome } from "#enums/biome"; -import { Moves } from "#enums/moves"; +import type { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; import { TrainerType } from "#enums/trainer-type"; @@ -24,9 +41,9 @@ import { Abilities } from "#enums/abilities"; import { SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "#app/data/pokemon-forms"; import { CommonAnimPhase } from "#app/phases/common-anim-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; +import { WeatherType } from "#enums/weather-type"; export class Arena { - public scene: BattleScene; public biomeType: Biome; public weather: Weather | null; public terrain: Terrain | null; @@ -34,6 +51,12 @@ export class Arena { public bgm: string; public ignoreAbilities: boolean; public ignoringEffectSource: BattlerIndex | null; + public playerTerasUsed: number; + /** + * Saves the number of times a party pokemon faints during a arena encounter. + * {@linkcode globalScene.currentBattle.enemyFaints} is the corresponding faint counter for the enemy (this resets every wave). + */ + public playerFaints: number; private lastTimeOfDay: TimeOfDay; @@ -42,24 +65,25 @@ export class Arena { public readonly eventTarget: EventTarget = new EventTarget(); - constructor(scene: BattleScene, biome: Biome, bgm: string) { - this.scene = scene; + constructor(biome: Biome, bgm: string, playerFaints = 0) { this.biomeType = biome; this.tags = []; this.bgm = bgm; this.trainerPool = biomeTrainerPools[biome]; this.updatePoolsForTimeOfDay(); + this.playerTerasUsed = 0; + this.playerFaints = playerFaints; } init() { const biomeKey = getBiomeKey(this.biomeType); - this.scene.arenaPlayer.setBiome(this.biomeType); - this.scene.arenaPlayerTransition.setBiome(this.biomeType); - this.scene.arenaEnemy.setBiome(this.biomeType); - this.scene.arenaNextEnemy.setBiome(this.biomeType); - this.scene.arenaBg.setTexture(`${biomeKey}_bg`); - this.scene.arenaBgTransition.setTexture(`${biomeKey}_bg`); + globalScene.arenaPlayer.setBiome(this.biomeType); + globalScene.arenaPlayerTransition.setBiome(this.biomeType); + globalScene.arenaEnemy.setBiome(this.biomeType); + globalScene.arenaNextEnemy.setBiome(this.biomeType); + globalScene.arenaBg.setTexture(`${biomeKey}_bg`); + globalScene.arenaBgTransition.setTexture(`${biomeKey}_bg`); // Redo this on initialize because during save/load the current wave isn't always // set correctly during construction @@ -71,19 +95,29 @@ export class Arena { if (timeOfDay !== this.lastTimeOfDay) { this.pokemonPool = {}; for (const tier of Object.keys(biomePokemonPools[this.biomeType])) { - this.pokemonPool[tier] = Object.assign([], biomePokemonPools[this.biomeType][tier][TimeOfDay.ALL]).concat(biomePokemonPools[this.biomeType][tier][timeOfDay]); + this.pokemonPool[tier] = Object.assign([], biomePokemonPools[this.biomeType][tier][TimeOfDay.ALL]).concat( + biomePokemonPools[this.biomeType][tier][timeOfDay], + ); } this.lastTimeOfDay = timeOfDay; } } - randomSpecies(waveIndex: integer, level: integer, attempt?: integer, luckValue?: integer, isBoss?: boolean): PokemonSpecies { - const overrideSpecies = this.scene.gameMode.getOverrideSpecies(waveIndex); + randomSpecies( + waveIndex: number, + level: number, + attempt?: number, + luckValue?: number, + isBoss?: boolean, + ): PokemonSpecies { + const overrideSpecies = globalScene.gameMode.getOverrideSpecies(waveIndex); if (overrideSpecies) { return overrideSpecies; } - const isBossSpecies = !!this.scene.getEncounterBossSegments(waveIndex, level) && !!this.pokemonPool[BiomePoolTier.BOSS].length - && (this.biomeType !== Biome.END || this.scene.gameMode.isClassic || this.scene.gameMode.isWaveFinal(waveIndex)); + const isBossSpecies = + !!globalScene.getEncounterBossSegments(waveIndex, level) && + !!this.pokemonPool[BiomePoolTier.BOSS].length && + (this.biomeType !== Biome.END || globalScene.gameMode.isClassic || globalScene.gameMode.isWaveFinal(waveIndex)); const randVal = isBossSpecies ? 64 : 512; // luck influences encounter rarity let luckModifier = 0; @@ -92,8 +126,22 @@ export class Arena { } const tierValue = Utils.randSeedInt(randVal - luckModifier); let tier = !isBossSpecies - ? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE - : tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; + ? tierValue >= 156 + ? BiomePoolTier.COMMON + : tierValue >= 32 + ? BiomePoolTier.UNCOMMON + : tierValue >= 6 + ? BiomePoolTier.RARE + : tierValue >= 1 + ? BiomePoolTier.SUPER_RARE + : BiomePoolTier.ULTRA_RARE + : tierValue >= 20 + ? BiomePoolTier.BOSS + : tierValue >= 6 + ? BiomePoolTier.BOSS_RARE + : tierValue >= 1 + ? BiomePoolTier.BOSS_SUPER_RARE + : BiomePoolTier.BOSS_ULTRA_RARE; console.log(BiomePoolTier[tier]); while (!this.pokemonPool[tier].length) { console.log(`Downgraded rarity tier from ${BiomePoolTier[tier]} to ${BiomePoolTier[tier - 1]}`); @@ -103,7 +151,7 @@ export class Arena { let ret: PokemonSpecies; let regen = false; if (!tierPool.length) { - ret = this.scene.randomSpecies(waveIndex, level); + ret = globalScene.randomSpecies(waveIndex, level); } else { const entry = tierPool[Utils.randSeedInt(tierPool.length)]; let species: Species; @@ -112,7 +160,7 @@ export class Arena { } else { const levelThresholds = Object.keys(entry); for (let l = levelThresholds.length - 1; l >= 0; l--) { - const levelThreshold = parseInt(levelThresholds[l]); + const levelThreshold = Number.parseInt(levelThresholds[l]); if (level >= levelThreshold) { const speciesIds = entry[levelThreshold]; if (speciesIds.length > 1) { @@ -129,13 +177,13 @@ export class Arena { if (ret.subLegendary || ret.legendary || ret.mythical) { switch (true) { - case (ret.baseTotal >= 720): + case ret.baseTotal >= 720: regen = level < 90; break; - case (ret.baseTotal >= 670): + case ret.baseTotal >= 670: regen = level < 70; break; - case (ret.baseTotal >= 580): + case ret.baseTotal >= 580: regen = level < 50; break; default: @@ -150,7 +198,7 @@ export class Arena { return this.randomSpecies(waveIndex, level, (attempt || 0) + 1); } - const newSpeciesId = ret.getWildSpeciesForLevel(level, true, isBoss ?? isBossSpecies, this.scene.gameMode); + const newSpeciesId = ret.getWildSpeciesForLevel(level, true, isBoss ?? isBossSpecies, globalScene.gameMode); if (newSpeciesId !== ret.speciesId) { console.log("Replaced", Species[ret.speciesId], "with", Species[newSpeciesId]); ret = getPokemonSpecies(newSpeciesId); @@ -158,14 +206,29 @@ export class Arena { return ret; } - randomTrainerType(waveIndex: integer, isBoss: boolean = false): TrainerType { - const isTrainerBoss = !!this.trainerPool[BiomePoolTier.BOSS].length - && (this.scene.gameMode.isTrainerBoss(waveIndex, this.biomeType, this.scene.offsetGym) || isBoss); + randomTrainerType(waveIndex: number, isBoss = false): TrainerType { + const isTrainerBoss = + !!this.trainerPool[BiomePoolTier.BOSS].length && + (globalScene.gameMode.isTrainerBoss(waveIndex, this.biomeType, globalScene.offsetGym) || isBoss); console.log(isBoss, this.trainerPool); const tierValue = Utils.randSeedInt(!isTrainerBoss ? 512 : 64); let tier = !isTrainerBoss - ? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE - : tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; + ? tierValue >= 156 + ? BiomePoolTier.COMMON + : tierValue >= 32 + ? BiomePoolTier.UNCOMMON + : tierValue >= 6 + ? BiomePoolTier.RARE + : tierValue >= 1 + ? BiomePoolTier.SUPER_RARE + : BiomePoolTier.ULTRA_RARE + : tierValue >= 20 + ? BiomePoolTier.BOSS + : tierValue >= 6 + ? BiomePoolTier.BOSS_RARE + : tierValue >= 1 + ? BiomePoolTier.BOSS_SUPER_RARE + : BiomePoolTier.BOSS_ULTRA_RARE; console.log(BiomePoolTier[tier]); while (tier && !this.trainerPool[tier].length) { console.log(`Downgraded trainer rarity tier from ${BiomePoolTier[tier]} to ${BiomePoolTier[tier - 1]}`); @@ -175,7 +238,7 @@ export class Arena { return !tierPool.length ? TrainerType.BREEDER : tierPool[Utils.randSeedInt(tierPool.length)]; } - getSpeciesFormIndex(species: PokemonSpecies): integer { + getSpeciesFormIndex(species: PokemonSpecies): number { switch (species.speciesId) { case Species.BURMY: case Species.WORMADAM: @@ -217,66 +280,6 @@ export class Arena { return 0; } - getTypeForBiome() { - switch (this.biomeType) { - case Biome.TOWN: - case Biome.PLAINS: - case Biome.METROPOLIS: - return Type.NORMAL; - case Biome.GRASS: - case Biome.TALL_GRASS: - return Type.GRASS; - case Biome.FOREST: - case Biome.JUNGLE: - return Type.BUG; - case Biome.SLUM: - case Biome.SWAMP: - return Type.POISON; - case Biome.SEA: - case Biome.BEACH: - case Biome.LAKE: - case Biome.SEABED: - return Type.WATER; - case Biome.MOUNTAIN: - return Type.FLYING; - case Biome.BADLANDS: - return Type.GROUND; - case Biome.CAVE: - case Biome.DESERT: - return Type.ROCK; - case Biome.ICE_CAVE: - case Biome.SNOWY_FOREST: - return Type.ICE; - case Biome.MEADOW: - case Biome.FAIRY_CAVE: - case Biome.ISLAND: - return Type.FAIRY; - case Biome.POWER_PLANT: - return Type.ELECTRIC; - case Biome.VOLCANO: - return Type.FIRE; - case Biome.GRAVEYARD: - case Biome.TEMPLE: - return Type.GHOST; - case Biome.DOJO: - case Biome.CONSTRUCTION_SITE: - return Type.FIGHTING; - case Biome.FACTORY: - case Biome.LABORATORY: - return Type.STEEL; - case Biome.RUINS: - case Biome.SPACE: - return Type.PSYCHIC; - case Biome.WASTELAND: - case Biome.END: - return Type.DRAGON; - case Biome.ABYSS: - return Type.DARK; - default: - return Type.UNKNOWN; - } - } - getBgTerrainColorRatioForBiome(): number { switch (this.biomeType) { case Biome.SPACE: @@ -295,11 +298,16 @@ export class Arena { */ trySetWeatherOverride(weather: WeatherType): boolean { this.weather = new Weather(weather, 0); - this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.SUNNY + (weather - 1))); - this.scene.queueMessage(getWeatherStartMessage(weather)!); // TODO: is this bang correct? + globalScene.unshiftPhase(new CommonAnimPhase(undefined, undefined, CommonAnim.SUNNY + (weather - 1))); + globalScene.queueMessage(getWeatherStartMessage(weather)!); // TODO: is this bang correct? return true; } + /** Returns weather or not the weather can be changed to {@linkcode weather} */ + canSetWeather(weather: WeatherType): boolean { + return !(this.weather?.weatherType === (weather || undefined)); + } + /** * Attempts to set a new weather to the battle * @param weather {@linkcode WeatherType} new {@linkcode WeatherType} to set @@ -311,26 +319,44 @@ export class Arena { return this.trySetWeatherOverride(Overrides.WEATHER_OVERRIDE); } - if (this.weather?.weatherType === (weather || undefined)) { + if (!this.canSetWeather(weather)) { return false; } const oldWeatherType = this.weather?.weatherType || WeatherType.NONE; - this.weather = weather ? new Weather(weather, hasPokemonSource ? 5 : 0) : null; - this.eventTarget.dispatchEvent(new WeatherChangedEvent(oldWeatherType, this.weather?.weatherType!, this.weather?.turnsLeft!)); // TODO: is this bang correct? - - if (this.weather) { - this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.SUNNY + (weather - 1), true)); - this.scene.queueMessage(getWeatherStartMessage(weather)!); // TODO: is this bang correct? - } else { - this.scene.queueMessage(getWeatherClearMessage(oldWeatherType)!); // TODO: is this bang correct? + if ( + this.weather?.isImmutable() && + ![WeatherType.HARSH_SUN, WeatherType.HEAVY_RAIN, WeatherType.STRONG_WINDS, WeatherType.NONE].includes(weather) + ) { + globalScene.unshiftPhase( + new CommonAnimPhase(undefined, undefined, CommonAnim.SUNNY + (oldWeatherType - 1), true), + ); + globalScene.queueMessage(getLegendaryWeatherContinuesMessage(oldWeatherType)!); + return false; } - this.scene.getField(true).filter(p => p.isOnField()).map(pokemon => { - pokemon.findAndRemoveTags(t => "weatherTypes" in t && !(t.weatherTypes as WeatherType[]).find(t => t === weather)); - applyPostWeatherChangeAbAttrs(PostWeatherChangeAbAttr, pokemon, weather); - }); + this.weather = weather ? new Weather(weather, hasPokemonSource ? 5 : 0) : null; + this.eventTarget.dispatchEvent( + new WeatherChangedEvent(oldWeatherType, this.weather?.weatherType!, this.weather?.turnsLeft!), + ); // TODO: is this bang correct? + + if (this.weather) { + globalScene.unshiftPhase(new CommonAnimPhase(undefined, undefined, CommonAnim.SUNNY + (weather - 1), true)); + globalScene.queueMessage(getWeatherStartMessage(weather)!); // TODO: is this bang correct? + } else { + globalScene.queueMessage(getWeatherClearMessage(oldWeatherType)!); // TODO: is this bang correct? + } + + globalScene + .getField(true) + .filter(p => p.isOnField()) + .map(pokemon => { + pokemon.findAndRemoveTags( + t => "weatherTypes" in t && !(t.weatherTypes as WeatherType[]).find(t => t === weather), + ); + applyPostWeatherChangeAbAttrs(PostWeatherChangeAbAttr, pokemon, weather); + }); return true; } @@ -339,13 +365,13 @@ export class Arena { * Function to trigger all weather based form changes */ triggerWeatherBasedFormChanges(): void { - this.scene.getField(true).forEach( p => { - const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM); - const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM); + globalScene.getField(true).forEach(p => { + const isCastformWithForecast = p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM; + const isCherrimWithFlowerGift = p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM; if (isCastformWithForecast || isCherrimWithFlowerGift) { - new ShowAbilityPhase(this.scene, p.getBattlerIndex()); - this.scene.triggerPokemonFormChange(p, SpeciesFormChangeWeatherTrigger); + new ShowAbilityPhase(p.getBattlerIndex()); + globalScene.triggerPokemonFormChange(p, SpeciesFormChangeWeatherTrigger); } }); } @@ -354,59 +380,78 @@ export class Arena { * Function to trigger all weather based form changes back into their normal forms */ triggerWeatherBasedFormChangesToNormal(): void { - this.scene.getField(true).forEach( p => { - const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM); - const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT, false, true) && p.species.speciesId === Species.CHERRIM); + globalScene.getField(true).forEach(p => { + const isCastformWithForecast = + p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM; + const isCherrimWithFlowerGift = + p.hasAbility(Abilities.FLOWER_GIFT, false, true) && p.species.speciesId === Species.CHERRIM; if (isCastformWithForecast || isCherrimWithFlowerGift) { - new ShowAbilityPhase(this.scene, p.getBattlerIndex()); - return this.scene.triggerPokemonFormChange(p, SpeciesFormChangeRevertWeatherFormTrigger); + new ShowAbilityPhase(p.getBattlerIndex()); + return globalScene.triggerPokemonFormChange(p, SpeciesFormChangeRevertWeatherFormTrigger); } }); } - trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim: boolean = false): boolean { - if (this.terrain?.terrainType === (terrain || undefined)) { + /** Returns whether or not the terrain can be set to {@linkcode terrain} */ + canSetTerrain(terrain: TerrainType): boolean { + return !(this.terrain?.terrainType === (terrain || undefined)); + } + + trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim = false): boolean { + if (!this.canSetTerrain(terrain)) { return false; } const oldTerrainType = this.terrain?.terrainType || TerrainType.NONE; this.terrain = terrain ? new Terrain(terrain, hasPokemonSource ? 5 : 0) : null; - this.eventTarget.dispatchEvent(new TerrainChangedEvent(oldTerrainType, this.terrain?.terrainType!, this.terrain?.turnsLeft!)); // TODO: are those bangs correct? + this.eventTarget.dispatchEvent( + new TerrainChangedEvent(oldTerrainType, this.terrain?.terrainType!, this.terrain?.turnsLeft!), + ); // TODO: are those bangs correct? if (this.terrain) { if (!ignoreAnim) { - this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.MISTY_TERRAIN + (terrain - 1))); + globalScene.unshiftPhase(new CommonAnimPhase(undefined, undefined, CommonAnim.MISTY_TERRAIN + (terrain - 1))); } - this.scene.queueMessage(getTerrainStartMessage(terrain)!); // TODO: is this bang correct? + globalScene.queueMessage(getTerrainStartMessage(terrain)!); // TODO: is this bang correct? } else { - this.scene.queueMessage(getTerrainClearMessage(oldTerrainType)!); // TODO: is this bang correct? + globalScene.queueMessage(getTerrainClearMessage(oldTerrainType)!); // TODO: is this bang correct? } - this.scene.getField(true).filter(p => p.isOnField()).map(pokemon => { - pokemon.findAndRemoveTags(t => "terrainTypes" in t && !(t.terrainTypes as TerrainType[]).find(t => t === terrain)); - applyPostTerrainChangeAbAttrs(PostTerrainChangeAbAttr, pokemon, terrain); - }); + globalScene + .getField(true) + .filter(p => p.isOnField()) + .map(pokemon => { + pokemon.findAndRemoveTags( + t => "terrainTypes" in t && !(t.terrainTypes as TerrainType[]).find(t => t === terrain), + ); + applyPostTerrainChangeAbAttrs(PostTerrainChangeAbAttr, pokemon, terrain); + applyAbAttrs(TerrainEventTypeChangeAbAttr, pokemon, null, false); + }); return true; } public isMoveWeatherCancelled(user: Pokemon, move: Move): boolean { - return !!this.weather && !this.weather.isEffectSuppressed(this.scene) && this.weather.isMoveWeatherCancelled(user, move); + return !!this.weather && !this.weather.isEffectSuppressed() && this.weather.isMoveWeatherCancelled(user, move); } public isMoveTerrainCancelled(user: Pokemon, targets: BattlerIndex[], move: Move): boolean { return !!this.terrain && this.terrain.isMoveTerrainCancelled(user, targets, move); } + public getWeatherType(): WeatherType { + return this.weather?.weatherType ?? WeatherType.NONE; + } + public getTerrainType(): TerrainType { return this.terrain?.terrainType ?? TerrainType.NONE; } - getAttackTypeMultiplier(attackType: Type, grounded: boolean): number { + getAttackTypeMultiplier(attackType: PokemonType, grounded: boolean): number { let weatherMultiplier = 1; - if (this.weather && !this.weather.isEffectSuppressed(this.scene)) { + if (this.weather && !this.weather.isEffectSuppressed()) { weatherMultiplier = this.weather.getAttackTypeMultiplier(attackType); } @@ -422,7 +467,7 @@ export class Arena { * Gets the denominator for the chance for a trainer spawn * @returns n where 1/n is the chance of a trainer battle */ - getTrainerChance(): integer { + getTrainerChance(): number { switch (this.biomeType) { case Biome.METROPOLIS: return 2; @@ -472,7 +517,7 @@ export class Arena { return TimeOfDay.NIGHT; } - const waveCycle = ((this.scene.currentBattle?.waveIndex || 0) + this.scene.waveCycleOffset) % 40; + const waveCycle = ((globalScene.currentBattle?.waveIndex || 0) + globalScene.waveCycleOffset) % 40; if (waveCycle < 15) { return TimeOfDay.DAY; @@ -507,49 +552,46 @@ export class Arena { } } - overrideTint(): [integer, integer, integer] { + overrideTint(): [number, number, number] { switch (Overrides.ARENA_TINT_OVERRIDE) { case TimeOfDay.DUSK: - return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [integer, integer, integer]; - break; - case (TimeOfDay.NIGHT): - return [ 64, 64, 64 ]; - break; + return [98, 48, 73].map(c => Math.round((c + 128) / 2)) as [number, number, number]; + case TimeOfDay.NIGHT: + return [64, 64, 64]; case TimeOfDay.DAWN: case TimeOfDay.DAY: default: - return [ 128, 128, 128 ]; - break; + return [128, 128, 128]; } } - getDayTint(): [integer, integer, integer] { + getDayTint(): [number, number, number] { if (Overrides.ARENA_TINT_OVERRIDE !== null) { return this.overrideTint(); } switch (this.biomeType) { case Biome.ABYSS: - return [ 64, 64, 64 ]; + return [64, 64, 64]; default: - return [ 128, 128, 128 ]; + return [128, 128, 128]; } } - getDuskTint(): [integer, integer, integer] { + getDuskTint(): [number, number, number] { if (Overrides.ARENA_TINT_OVERRIDE) { return this.overrideTint(); } if (!this.isOutside()) { - return [ 0, 0, 0 ]; + return [0, 0, 0]; } switch (this.biomeType) { default: - return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [integer, integer, integer]; + return [98, 48, 73].map(c => Math.round((c + 128) / 2)) as [number, number, number]; } } - getNightTint(): [integer, integer, integer] { + getNightTint(): [number, number, number] { if (Overrides.ARENA_TINT_OVERRIDE) { return this.overrideTint(); } @@ -561,12 +603,12 @@ export class Arena { } if (!this.isOutside()) { - return [ 64, 64, 64 ]; + return [64, 64, 64]; } switch (this.biomeType) { default: - return [ 48, 48, 98 ]; + return [48, 48, 98]; } } @@ -582,10 +624,16 @@ export class Arena { * @param simulated if `true`, this applies arena tags without changing game state * @param args array of parameters that the called upon tags may need */ - applyTagsForSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide, simulated: boolean, ...args: unknown[]): void { - let tags = typeof tagType === "string" - ? this.tags.filter(t => t.tagType === tagType) - : this.tags.filter(t => t instanceof tagType); + applyTagsForSide( + tagType: ArenaTagType | Constructor, + side: ArenaTagSide, + simulated: boolean, + ...args: unknown[] + ): void { + let tags = + typeof tagType === "string" + ? this.tags.filter(t => t.tagType === tagType) + : this.tags.filter(t => t instanceof tagType); if (side !== ArenaTagSide.BOTH) { tags = tags.filter(t => t.side === side); } @@ -614,7 +662,15 @@ export class Arena { * @param targetIndex The {@linkcode BattlerIndex} of the target pokemon * @returns `false` if there already exists a tag of this type in the Arena */ - addTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, side: ArenaTagSide = ArenaTagSide.BOTH, quiet: boolean = false, targetIndex?: BattlerIndex): boolean { + addTag( + tagType: ArenaTagType, + turnCount: number, + sourceMove: Moves | undefined, + sourceId: number, + side: ArenaTagSide = ArenaTagSide.BOTH, + quiet = false, + targetIndex?: BattlerIndex, + ): boolean { const existingTag = this.getTagOnSide(tagType, side); if (existingTag) { existingTag.onOverlap(this); @@ -630,12 +686,14 @@ export class Arena { // creates a new tag object const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side); if (newTag) { - this.tags.push(newTag); newTag.onAdd(this, quiet); + this.tags.push(newTag); const { layers = 0, maxLayers = 0 } = newTag instanceof ArenaTrapTag ? newTag : {}; - this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount, layers, maxLayers)); + this.eventTarget.dispatchEvent( + new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount, layers, maxLayers), + ); } return true; @@ -650,7 +708,7 @@ export class Arena { return this.getTagOnSide(tagType, ArenaTagSide.BOTH); } - hasTag(tagType: ArenaTagType) : boolean { + hasTag(tagType: ArenaTagType): boolean { return !!this.getTag(tagType); } @@ -663,9 +721,13 @@ export class Arena { * @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there */ getTagOnSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide): ArenaTag | undefined { - return typeof(tagType) === "string" - ? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)) - : this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); + return typeof tagType === "string" + ? this.tags.find( + t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side), + ) + : this.tags.find( + t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side), + ); } /** @@ -684,16 +746,20 @@ export class Arena { * @returns array of {@linkcode ArenaTag}s from which the Arena's tags return `true` and apply to the given side */ findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] { - return this.tags.filter(t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); + return this.tags.filter( + t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side), + ); } lapseTags(): void { - this.tags.filter(t => !(t.lapse(this))).forEach(t => { - t.onRemove(this); - this.tags.splice(this.tags.indexOf(t), 1); + this.tags + .filter(t => !t.lapse(this)) + .forEach(t => { + t.onRemove(this); + this.tags.splice(this.tags.indexOf(t), 1); - this.eventTarget.dispatchEvent(new TagRemovedEvent(t.tagType, t.side, t.turnCount)); - }); + this.eventTarget.dispatchEvent(new TagRemovedEvent(t.tagType, t.side, t.turnCount)); + }); } removeTag(tagType: ArenaTagType): boolean { @@ -708,7 +774,7 @@ export class Arena { return !!tag; } - removeTagOnSide(tagType: ArenaTagType, side: ArenaTagSide, quiet: boolean = false): boolean { + removeTagOnSide(tagType: ArenaTagType, side: ArenaTagSide, quiet = false): boolean { const tag = this.getTagOnSide(tagType, side); if (tag) { tag.onRemove(this, quiet); @@ -719,11 +785,12 @@ export class Arena { return !!tag; } - removeAllTags(): void { while (this.tags.length) { this.tags[0].onRemove(this); - this.eventTarget.dispatchEvent(new TagRemovedEvent(this.tags[0].tagType, this.tags[0].side, this.tags[0].turnCount)); + this.eventTarget.dispatchEvent( + new TagRemovedEvent(this.tags[0].tagType, this.tags[0].side, this.tags[0].turnCount), + ); this.tags.splice(0, 1); } @@ -738,13 +805,15 @@ export class Arena { this.trySetWeather(WeatherType.NONE, false); } this.trySetTerrain(TerrainType.NONE, false, true); + this.resetPlayerFaintCount(); this.removeAllTags(); } preloadBgm(): void { - this.scene.loadBgm(this.bgm); + globalScene.loadBgm(this.bgm); } + /** The loop point of any given biome track, read as seconds and milliseconds. */ getBgmLoopPoint(): number { switch (this.biomeType) { case Biome.TOWN: @@ -756,9 +825,9 @@ export class Arena { case Biome.TALL_GRASS: return 9.608; case Biome.METROPOLIS: - return 141.470; + return 141.47; case Biome.FOREST: - return 4.294; + return 0.341; case Biome.SEA: return 0.024; case Biome.SWAMP: @@ -768,17 +837,17 @@ export class Arena { case Biome.LAKE: return 7.215; case Biome.SEABED: - return 2.600; + return 2.6; case Biome.MOUNTAIN: return 4.018; case Biome.BADLANDS: - return 17.790; + return 17.79; case Biome.CAVE: - return 14.240; + return 14.24; case Biome.DESERT: return 1.143; case Biome.ICE_CAVE: - return 0.000; + return 0.0; case Biome.MEADOW: return 3.891; case Biome.POWER_PLANT: @@ -786,23 +855,23 @@ export class Arena { case Biome.VOLCANO: return 17.637; case Biome.GRAVEYARD: - return 3.232; + return 13.711; case Biome.DOJO: return 6.205; case Biome.FACTORY: return 4.985; case Biome.RUINS: - return 0.000; + return 0.0; case Biome.WASTELAND: return 6.336; case Biome.ABYSS: - return 5.130; + return 5.13; case Biome.SPACE: return 20.036; case Biome.CONSTRUCTION_SITE: return 1.222; case Biome.JUNGLE: - return 0.000; + return 0.0; case Biome.FAIRY_CAVE: return 4.542; case Biome.TEMPLE: @@ -812,14 +881,20 @@ export class Arena { case Biome.LABORATORY: return 114.862; case Biome.SLUM: - return 0.000; + return 0.0; case Biome.SNOWY_FOREST: return 3.047; + case Biome.END: + return 17.153; default: console.warn(`missing bgm loop-point for biome "${Biome[this.biomeType]}" (=${this.biomeType})`); return 0; } } + + resetPlayerFaintCount(): void { + this.playerFaints = 0; + } } export function getBiomeKey(biome: Biome): string { @@ -862,28 +937,29 @@ export function getBiomeHasProps(biomeType: Biome): boolean { export class ArenaBase extends Phaser.GameObjects.Container { public player: boolean; public biome: Biome; - public propValue: integer; + public propValue: number; public base: Phaser.GameObjects.Sprite; public props: Phaser.GameObjects.Sprite[]; - constructor(scene: BattleScene, player: boolean) { - super(scene, 0, 0); + constructor(player: boolean) { + super(globalScene, 0, 0); this.player = player; - this.base = scene.addFieldSprite(0, 0, "plains_a", undefined, 1); + this.base = globalScene.addFieldSprite(0, 0, "plains_a", undefined, 1); this.base.setOrigin(0, 0); - this.props = !player ? - new Array(3).fill(null).map(() => { - const ret = scene.addFieldSprite(0, 0, "plains_b", undefined, 1); - ret.setOrigin(0, 0); - ret.setVisible(false); - return ret; - }) : []; + this.props = !player + ? new Array(3).fill(null).map(() => { + const ret = globalScene.addFieldSprite(0, 0, "plains_b", undefined, 1); + ret.setOrigin(0, 0); + ret.setVisible(false); + return ret; + }) + : []; } - setBiome(biome: Biome, propValue?: integer): void { + setBiome(biome: Biome, propValue?: number): void { const hasProps = getBiomeHasProps(biome); const biomeKey = getBiomeKey(biome); const baseKey = `${biomeKey}_${this.player ? "a" : "b"}`; @@ -892,13 +968,18 @@ export class ArenaBase extends Phaser.GameObjects.Container { this.base.setTexture(baseKey); if (this.base.texture.frameTotal > 1) { - const baseFrameNames = this.scene.anims.generateFrameNames(baseKey, { zeroPad: 4, suffix: ".png", start: 1, end: this.base.texture.frameTotal - 1 }); - if (!(this.scene.anims.exists(baseKey))) { - this.scene.anims.create({ + const baseFrameNames = globalScene.anims.generateFrameNames(baseKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: this.base.texture.frameTotal - 1, + }); + if (!globalScene.anims.exists(baseKey)) { + globalScene.anims.create({ key: baseKey, frames: baseFrameNames, frameRate: 12, - repeat: -1 + repeat: -1, }); } this.base.play(baseKey); @@ -910,33 +991,40 @@ export class ArenaBase extends Phaser.GameObjects.Container { } if (!this.player) { - (this.scene as BattleScene).executeWithSeedOffset(() => { - this.propValue = propValue === undefined - ? hasProps ? Utils.randSeedInt(8) : 0 - : propValue; - this.props.forEach((prop, p) => { - const propKey = `${biomeKey}_b${hasProps ? `_${p + 1}` : ""}`; - prop.setTexture(propKey); + globalScene.executeWithSeedOffset( + () => { + this.propValue = propValue === undefined ? (hasProps ? Utils.randSeedInt(8) : 0) : propValue; + this.props.forEach((prop, p) => { + const propKey = `${biomeKey}_b${hasProps ? `_${p + 1}` : ""}`; + prop.setTexture(propKey); - if (hasProps && prop.texture.frameTotal > 1) { - const propFrameNames = this.scene.anims.generateFrameNames(propKey, { zeroPad: 4, suffix: ".png", start: 1, end: prop.texture.frameTotal - 1 }); - if (!(this.scene.anims.exists(propKey))) { - this.scene.anims.create({ - key: propKey, - frames: propFrameNames, - frameRate: 12, - repeat: -1 + if (hasProps && prop.texture.frameTotal > 1) { + const propFrameNames = globalScene.anims.generateFrameNames(propKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: prop.texture.frameTotal - 1, }); + if (!globalScene.anims.exists(propKey)) { + globalScene.anims.create({ + key: propKey, + frames: propFrameNames, + frameRate: 12, + repeat: -1, + }); + } + prop.play(propKey); + } else { + prop.stop(); } - prop.play(propKey); - } else { - prop.stop(); - } - prop.setVisible(hasProps && !!(this.propValue & (1 << p))); - this.add(prop); - }); - }, (this.scene as BattleScene).currentBattle?.waveIndex || 0, (this.scene as BattleScene).waveSeed); + prop.setVisible(hasProps && !!(this.propValue & (1 << p))); + this.add(prop); + }); + }, + globalScene.currentBattle?.waveIndex || 0, + globalScene.waveSeed, + ); } } } diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index 4ddcd2d3ee7..63da641a114 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -1,9 +1,12 @@ import { TextStyle, addTextObject } from "../ui/text"; -import Pokemon, { DamageResult, HitResult } from "./pokemon"; +import type { DamageResult } from "./pokemon"; +import type Pokemon from "./pokemon"; +import { HitResult } from "./pokemon"; import * as Utils from "../utils"; -import { BattlerIndex } from "../battle"; +import type { BattlerIndex } from "../battle"; +import { globalScene } from "#app/global-scene"; -type TextAndShadowArr = [ string | null, string | null ]; +type TextAndShadowArr = [string | null, string | null]; export default class DamageNumberHandler { private damageNumbers: Map; @@ -12,37 +15,45 @@ export default class DamageNumberHandler { this.damageNumbers = new Map(); } - add(target: Pokemon, amount: integer, result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, critical: boolean = false): void { - const scene = target.scene; - - if (!scene?.damageNumbersMode) { + add( + target: Pokemon, + amount: number, + result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, + critical = false, + ): void { + if (!globalScene?.damageNumbersMode) { return; } const battlerIndex = target.getBattlerIndex(); const baseScale = target.getSpriteScale() / 6; - const damageNumber = addTextObject(scene, target.x, -(scene.game.canvas.height / 6) + target.y - target.getSprite().height / 2, Utils.formatStat(amount, true), TextStyle.SUMMARY); + const damageNumber = addTextObject( + target.x, + -(globalScene.game.canvas.height / 6) + target.y - target.getSprite().height / 2, + Utils.formatStat(amount, true), + TextStyle.SUMMARY, + ); damageNumber.setName("text-damage-number"); damageNumber.setOrigin(0.5, 1); damageNumber.setScale(baseScale); - let [ textColor, shadowColor ] : TextAndShadowArr = [ null, null ]; + let [textColor, shadowColor]: TextAndShadowArr = [null, null]; switch (result) { case HitResult.SUPER_EFFECTIVE: - [ textColor, shadowColor ] = [ "#f8d030", "#b8a038" ]; + [textColor, shadowColor] = ["#f8d030", "#b8a038"]; break; case HitResult.NOT_VERY_EFFECTIVE: - [ textColor, shadowColor ] = [ "#f08030", "#c03028" ]; + [textColor, shadowColor] = ["#f08030", "#c03028"]; break; case HitResult.ONE_HIT_KO: - [ textColor, shadowColor ] = [ "#a040a0", "#483850" ]; + [textColor, shadowColor] = ["#a040a0", "#483850"]; break; case HitResult.HEAL: - [ textColor, shadowColor ] = [ "#78c850", "#588040" ]; + [textColor, shadowColor] = ["#78c850", "#588040"]; break; default: - [ textColor, shadowColor ] = [ "#ffffff", "#636363" ]; + [textColor, shadowColor] = ["#ffffff", "#636363"]; break; } @@ -58,7 +69,7 @@ export default class DamageNumberHandler { } } - scene.fieldUI.add(damageNumber); + globalScene.fieldUI.add(damageNumber); if (!this.damageNumbers.has(battlerIndex)) { this.damageNumbers.set(battlerIndex, []); @@ -71,14 +82,14 @@ export default class DamageNumberHandler { this.damageNumbers.get(battlerIndex)!.push(damageNumber); - if (scene.damageNumbersMode === 1) { - scene.tweens.add({ + if (globalScene.damageNumbersMode === 1) { + globalScene.tweens.add({ targets: damageNumber, duration: Utils.fixedInt(750), alpha: 1, - y: "-=32" + y: "-=32", }); - scene.tweens.add({ + globalScene.tweens.add({ delay: 375, targets: damageNumber, duration: Utils.fixedInt(625), @@ -87,14 +98,14 @@ export default class DamageNumberHandler { onComplete: () => { this.damageNumbers.get(battlerIndex)!.splice(this.damageNumbers.get(battlerIndex)!.indexOf(damageNumber), 1); damageNumber.destroy(true); - } + }, }); return; } damageNumber.setAlpha(0); - scene.tweens.chain({ + globalScene.tweens.chain({ targets: damageNumber, tweens: [ { @@ -103,7 +114,7 @@ export default class DamageNumberHandler { scaleX: 0.75 * baseScale, scaleY: 1.25 * baseScale, y: "-=16", - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(175), @@ -111,69 +122,71 @@ export default class DamageNumberHandler { scaleX: 0.875 * baseScale, scaleY: 1.125 * baseScale, y: "+=16", - ease: "Cubic.easeIn" + ease: "Cubic.easeIn", }, { duration: Utils.fixedInt(100), scaleX: 1.25 * baseScale, scaleY: 0.75 * baseScale, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(175), scaleX: 0.875 * baseScale, scaleY: 1.125 * baseScale, y: "-=8", - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(50), scaleX: 0.925 * baseScale, scaleY: 1.075 * baseScale, y: "+=8", - ease: "Cubic.easeIn" + ease: "Cubic.easeIn", }, { duration: Utils.fixedInt(100), scaleX: 1.125 * baseScale, scaleY: 0.875 * baseScale, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(175), scaleX: 0.925 * baseScale, scaleY: 1.075 * baseScale, y: "-=4", - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(50), scaleX: 0.975 * baseScale, scaleY: 1.025 * baseScale, y: "+=4", - ease: "Cubic.easeIn" + ease: "Cubic.easeIn", }, { duration: Utils.fixedInt(100), scaleX: 1.075 * baseScale, scaleY: 0.925 * baseScale, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { duration: Utils.fixedInt(25), scaleX: baseScale, scaleY: baseScale, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }, { delay: Utils.fixedInt(500), alpha: 0, onComplete: () => { - this.damageNumbers.get(battlerIndex)!.splice(this.damageNumbers.get(battlerIndex)!.indexOf(damageNumber), 1); + this.damageNumbers + .get(battlerIndex)! + .splice(this.damageNumbers.get(battlerIndex)!.indexOf(damageNumber), 1); damageNumber.destroy(true); - } - } - ] + }, + }, + ], }); } } diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 12bcace500c..649a969d415 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -1,9 +1,11 @@ -import { GameObjects } from "phaser"; -import BattleScene from "../battle-scene"; -import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; -import { Species } from "#enums/species"; +import type { GameObjects } from "phaser"; +import { globalScene } from "#app/global-scene"; +import type MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import type { Species } from "#enums/species"; import { isNullOrUndefined } from "#app/utils"; import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import type { Variant } from "#app/data/variant"; +import { doShinySparkleAnim } from "#app/field/anims"; import PlayAnimationConfig = Phaser.Types.Animations.PlayAnimationConfig; type KnownFileRoot = @@ -34,7 +36,7 @@ export class MysteryEncounterSpriteConfig { /** The sprite key (which is the image file name). e.g. "ace_trainer_f" */ spriteKey: string; /** Refer to [/public/images](../../public/images) directorty for all folder names */ - fileRoot: KnownFileRoot & string | string; + fileRoot: (KnownFileRoot & string) | string; /** Optional replacement for `spriteKey`/`fileRoot`. Just know this defaults to male/genderless, form 0, no shiny */ species?: Species; /** Enable shadow. Defaults to `false` */ @@ -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,19 +80,23 @@ 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); + constructor(encounter: MysteryEncounter) { + super(globalScene, -72, 76); this.encounter = encounter; this.enterFromRight = encounter.enterIntroVisualsFromRight ?? false; // Shallow copy configs to allow visual config updates at runtime without dirtying master copy of Encounter this.spriteConfigs = encounter.spriteConfigs.map(config => { const result = { - ...config + ...config, }; 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; @@ -99,16 +109,24 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } const getSprite = (spriteKey: string, hasShadow?: boolean, yShadow?: number) => { - const ret = this.scene.addFieldSprite(0, 0, spriteKey); + const ret = globalScene.addFieldSprite(0, 0, spriteKey); ret.setOrigin(0.5, 1); - ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, yShadowOffset: yShadow ?? 0 }); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: !!hasShadow, + yShadowOffset: yShadow ?? 0, + }); return ret; }; const getItemSprite = (spriteKey: string, hasShadow?: boolean, yShadow?: number) => { - const icon = this.scene.add.sprite(-19, 2, "items", spriteKey); + const icon = globalScene.add.sprite(-19, 2, "items", spriteKey); icon.setOrigin(0.5, 1); - icon.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, yShadowOffset: yShadow ?? 0 }); + icon.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: !!hasShadow, + yShadowOffset: yShadow ?? 0, + }); return icon; }; @@ -120,18 +138,39 @@ 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.spriteConfigs?.forEach((config) => { - const { spriteKey, isItem, hasShadow, scale, x, y, yShadow, alpha } = config; + this.shinySparkleSprites = []; + const shinySparkleSprites = globalScene.add.container(0, 0); + this.spriteConfigs?.forEach(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 = globalScene.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 +204,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 +217,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con this.add(sprite); this.add(tintSprite); }); + this.add(shinySparkleSprites); } /** @@ -184,18 +229,22 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con resolve(); } - this.spriteConfigs.forEach((config) => { + const shinyPromises: Promise[] = []; + this.spriteConfigs.forEach(config => { if (config.isPokemon) { - this.scene.loadPokemonAtlas(config.spriteKey, config.fileRoot); + globalScene.loadPokemonAtlas(config.spriteKey, config.fileRoot); + if (config.isShiny) { + shinyPromises.push(globalScene.loadPokemonVariantAssets(config.spriteKey, config.fileRoot, config.variant)); + } } else if (config.isItem) { - this.scene.loadAtlas("items", ""); + globalScene.loadAtlas("items", ""); } else { - this.scene.loadAtlas(config.spriteKey, config.fileRoot); + globalScene.loadAtlas(config.spriteKey, config.fileRoot); } }); - this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => { - this.spriteConfigs.every((config) => { + globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => { + this.spriteConfigs.every(config => { if (config.isItem) { return true; } @@ -203,28 +252,32 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const originalWarn = console.warn; // Ignore warnings for missing frames, because there will be a lot - console.warn = () => { - }; - const frameNames = this.scene.anims.generateFrameNames(config.spriteKey, { zeroPad: 4, suffix: ".png", start: 1, end: 128 }); + console.warn = () => {}; + const frameNames = globalScene.anims.generateFrameNames(config.spriteKey, { + zeroPad: 4, + suffix: ".png", + start: 1, + end: 128, + }); console.warn = originalWarn; - if (!(this.scene.anims.exists(config.spriteKey))) { - this.scene.anims.create({ + if (!globalScene.anims.exists(config.spriteKey)) { + globalScene.anims.create({ key: config.spriteKey, frames: frameNames, - frameRate: 12, - repeat: -1 + frameRate: 10, + repeat: -1, }); } return true; }); - resolve(); + Promise.all(shinyPromises).then(() => resolve()); }); - if (!this.scene.load.isLoading()) { - this.scene.load.start(); + if (!globalScene.load.isLoading()) { + globalScene.load.start(); } }); } @@ -240,11 +293,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); + } } }); @@ -268,7 +331,11 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con * @param animConfig {@linkcode Phaser.Types.Animations.PlayAnimationConfig} to pass to {@linkcode Phaser.GameObjects.Sprite.play} * @returns true if the sprite was able to be animated */ - tryPlaySprite(sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite, animConfig: Phaser.Types.Animations.PlayAnimationConfig): boolean { + tryPlaySprite( + sprite: Phaser.GameObjects.Sprite, + tintSprite: Phaser.GameObjects.Sprite, + animConfig: Phaser.Types.Animations.PlayAnimationConfig, + ): boolean { // Show an error in the console if there isn't a texture loaded if (sprite.texture.key === "__MISSING") { console.error(`No texture found for '${animConfig.key}'!`); @@ -288,6 +355,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) { + globalScene.time.delayedCall(500, () => { + doShinySparkleAnim(sparkleConfig.sprite, sparkleConfig.variant); + }); + } + } + /** * For sprites with animation and that do not have animation disabled, will begin frame animation */ @@ -303,7 +381,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const trainerAnimConfig: PlayAnimationConfig = { key: config.spriteKey, repeat: config?.repeat ? -1 : 0, - startFrame: config?.startFrame ?? 0 + startFrame: config?.startFrame ?? 0, }; this.tryPlaySprite(sprites[i], tintSprites[i], trainerAnimConfig); @@ -336,7 +414,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } const ret: Phaser.GameObjects.Sprite[] = []; - this.spriteConfigs.forEach((config, i) => { + this.spriteConfigs.forEach((_, i) => { ret.push(this.getAt(i * 2)); }); return ret; @@ -351,7 +429,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } const ret: Phaser.GameObjects.Sprite[] = []; - this.spriteConfigs.forEach((config, i) => { + this.spriteConfigs.forEach((_, i) => { ret.push(this.getAt(i * 2 + 1)); }); @@ -366,7 +444,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con * @param duration * @param ease */ - private tint(sprite, color: number, alpha?: number, duration?: integer, ease?: string): void { + private tint(sprite, color: number, alpha?: number, duration?: number, ease?: string): void { // const tintSprites = this.getTintSprites(); sprite.setTintFill(color); sprite.setVisible(true); @@ -374,11 +452,11 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con if (duration) { sprite.setAlpha(0); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: sprite, alpha: alpha || 1, duration: duration, - ease: ease || "Linear" + ease: ease || "Linear", }); } else { sprite.setAlpha(alpha); @@ -392,7 +470,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con * @param duration * @param ease */ - tintAll(color: number, alpha?: number, duration?: integer, ease?: string): void { + tintAll(color: number, alpha?: number, duration?: number, ease?: string): void { const tintSprites = this.getTintSprites(); tintSprites.map(tintSprite => { this.tint(tintSprite, color, alpha, duration, ease); @@ -405,9 +483,9 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con * @param duration * @param ease */ - private untint(sprite, duration: integer, ease?: string): void { + private untint(sprite, duration: number, ease?: string): void { if (duration) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: sprite, alpha: 0, duration: duration, @@ -415,7 +493,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con onComplete: () => { sprite.setVisible(false); sprite.setAlpha(1); - } + }, }); } else { sprite.setVisible(false); @@ -429,7 +507,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con * @param duration * @param ease */ - untintAll(duration: integer, ease?: string): void { + untintAll(duration: number, ease?: string): void { const tintSprites = this.getTintSprites(); tintSprites.map(tintSprite => { this.untint(tintSprite, duration, ease); @@ -441,16 +519,9 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con * @param value - true for visible, false for hidden */ setVisible(value: boolean): this { - this.getSprites().forEach(sprite => { + for (const sprite of this.getSprites()) { sprite.setVisible(value); - }); + } return super.setVisible(value); } } - -/** - * Interface is required so as not to override {@link Phaser.GameObjects.Container.scene} - */ -export default interface MysteryEncounterIntroVisuals { - scene: BattleScene -} diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index 2c4c295eaa4..0d5dcca7989 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -1,25 +1,27 @@ -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import Pokemon from "./pokemon"; import * as Utils from "../utils"; export default class PokemonSpriteSparkleHandler { private sprites: Set; - setup(scene: BattleScene): void { + setup(): void { this.sprites = new Set(); - scene.tweens.addCounter({ + globalScene.tweens.addCounter({ duration: Utils.fixedInt(200), from: 0, to: 1, yoyo: true, repeat: -1, - onRepeat: () => this.onLapse() + onRepeat: () => this.onLapse(), }); } onLapse(): void { - Array.from(this.sprites.values()).filter(s => !s.scene).map(s => this.sprites.delete(s)); + Array.from(this.sprites.values()) + .filter(s => !s.scene) + .map(s => this.sprites.delete(s)); for (const s of this.sprites.values()) { if (!s.pipelineData["teraColor"] || !(s.pipelineData["teraColor"] as number[]).find(c => c)) { continue; @@ -27,17 +29,24 @@ export default class PokemonSpriteSparkleHandler { if (!s.visible || (s.parentContainer instanceof Pokemon && !s.parentContainer.parentContainer)) { continue; } - const pokemon = s.parentContainer instanceof Pokemon ? s.parentContainer as Pokemon : null; + if (!(s.parentContainer instanceof Pokemon) || !(s.parentContainer as Pokemon).isTerastallized) { + continue; + } + const pokemon = s.parentContainer instanceof Pokemon ? (s.parentContainer as Pokemon) : null; const parent = (pokemon || s).parentContainer; const texture = s.texture; - const [ width, height ] = [ texture.source[0].width, texture.source[0].height ]; - const [ pixelX, pixelY ] = [ Utils.randInt(width), Utils.randInt(height) ]; + const [width, height] = [texture.source[0].width, texture.source[0].height]; + const [pixelX, pixelY] = [Utils.randInt(width), Utils.randInt(height)]; const ratioX = s.width / width; const ratioY = s.height / height; const pixel = texture.manager.getPixel(pixelX, pixelY, texture.key, "__BASE"); if (pixel?.alpha) { - const [ xOffset, yOffset ] = [ -s.originX * s.width, -s.originY * s.height ]; - const sparkle = (s.scene as BattleScene).addFieldSprite(((pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset), ((pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset), "tera_sparkle"); + const [xOffset, yOffset] = [-s.originX * s.width, -s.originY * s.height]; + const sparkle = globalScene.addFieldSprite( + (pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset, + (pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset, + "tera_sparkle", + ); sparkle.pipelineData["ignoreTimeTint"] = s.pipelineData["ignoreTimeTint"]; sparkle.setName("sprite-tera-sparkle"); sparkle.play("tera_sparkle"); @@ -49,7 +58,7 @@ export default class PokemonSpriteSparkleHandler { add(sprites: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void { if (!Array.isArray(sprites)) { - sprites = [ sprites ]; + sprites = [sprites]; } for (const s of sprites) { if (this.sprites.has(s)) { @@ -61,7 +70,7 @@ export default class PokemonSpriteSparkleHandler { remove(sprites: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void { if (!Array.isArray(sprites)) { - sprites = [ sprites ]; + sprites = [sprites]; } for (const s of sprites) { this.sprites.delete(s); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index d41c1f9eefa..890c6bab0d6 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1,41 +1,228 @@ import Phaser from "phaser"; -import BattleScene, { AnySound } from "#app/battle-scene"; -import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; +import type { AnySound } from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import type { Variant, VariantSet } from "#app/data/variant"; +import { variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; -import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "#app/ui/battle-info"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget, CombinedPledgeStabBoostAttr } from "#app/data/move"; -import { default as PokemonSpecies, PokemonSpeciesForm, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; -import { CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER, getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; -import { starterPassiveAbilities } from "#app/data/balance/passives"; -import { Constructor, isNullOrUndefined, randSeedInt } from "#app/utils"; +import BattleInfo, { + PlayerBattleInfo, + EnemyBattleInfo, +} from "#app/ui/battle-info"; +import type Move from "#app/data/moves/move"; +import { + HighCritAttr, + StatChangeBeforeDmgCalcAttr, + HitsTagAttr, + applyMoveAttrs, + FixedDamageAttr, + VariableAtkAttr, + allMoves, + TypelessAttr, + CritOnlyAttr, + getMoveTargets, + OneHitKOAttr, + VariableMoveTypeAttr, + VariableDefAttr, + AttackMove, + ModifiedDamageAttr, + VariableMoveTypeMultiplierAttr, + IgnoreOpponentStatStagesAttr, + SacrificialAttr, + VariableMoveCategoryAttr, + CounterDamageAttr, + StatStageChangeAttr, + RechargeAttr, + IgnoreWeatherTypeDebuffAttr, + BypassBurnDamageReductionAttr, + SacrificialAttrOnHit, + OneHitKOAccuracyAttr, + RespectAttackTypeImmunityAttr, + CombinedPledgeStabBoostAttr, + VariableMoveTypeChartAttr, + HpSplitAttr, +} from "#app/data/moves/move"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveCategory } from "#enums/MoveCategory"; +import type { PokemonSpeciesForm } from "#app/data/pokemon-species"; +import { + default as PokemonSpecies, + getFusedSpeciesName, + getPokemonSpecies, + getPokemonSpeciesForm, +} from "#app/data/pokemon-species"; +import { + getStarterValueFriendshipCap, + speciesStarterCosts, +} from "#app/data/balance/starters"; +import type { Constructor } from "#app/utils"; +import { isNullOrUndefined, randSeedInt, type nil } from "#app/utils"; import * as Utils from "#app/utils"; -import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "#app/data/type"; +import type { TypeDamageMultiplier } from "#app/data/type"; +import { getTypeDamageMultiplier, getTypeRgb } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getLevelTotalExp } from "#app/data/exp"; -import { Stat, type PermanentStat, type BattleStat, type EffectiveStat, PERMANENT_STATS, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; -import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier } from "#app/modifier/modifier"; -import { PokeballType } from "#app/data/pokeball"; +import { + Stat, + type PermanentStat, + type BattleStat, + type EffectiveStat, + PERMANENT_STATS, + BATTLE_STATS, + EFFECTIVE_STATS, +} from "#enums/stat"; +import { + DamageMoneyRewardModifier, + EnemyDamageBoosterModifier, + EnemyDamageReducerModifier, + EnemyEndureChanceModifier, + EnemyFusionChanceModifier, + HiddenAbilityRateBoosterModifier, + BaseStatModifier, + PokemonFriendshipBoosterModifier, + PokemonHeldItemModifier, + PokemonNatureWeightModifier, + ShinyRateBoosterModifier, + SurviveDamageModifier, + TempStatStageBoosterModifier, + TempCritBoosterModifier, + StatBoosterModifier, + CritBoosterModifier, + PokemonBaseStatFlatModifier, + PokemonBaseStatTotalModifier, + PokemonIncrementingStatModifier, + EvoTrackerModifier, + PokemonMultiHitModifier, +} from "#app/modifier/modifier"; +import { PokeballType } from "#enums/pokeball"; import { Gender } from "#app/data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; -import { Status, StatusEffect, getRandomStatus } from "#app/data/status-effect"; -import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; -import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "#app/data/balance/tms"; -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 "#app/data/weather"; -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 } from "#app/data/ability"; -import PokemonData from "#app/system/pokemon-data"; +import { Status, getRandomStatus } from "#app/data/status-effect"; +import type { + SpeciesFormEvolution, + SpeciesEvolutionCondition, +} from "#app/data/balance/pokemon-evolutions"; +import { + pokemonEvolutions, + pokemonPrevolutions, + FusionSpeciesFormEvolution, +} from "#app/data/balance/pokemon-evolutions"; +import { + reverseCompatibleTms, + tmSpecies, + tmPoolTiers, +} from "#app/data/balance/tms"; +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 type { SuppressAbilitiesTag } from "#app/data/arena-tag"; +import type { Ability, AbAttr } from "#app/data/ability"; +import { + StatMultiplierAbAttr, + BlockCritAbAttr, + BonusCritAbAttr, + BypassBurnDamageReductionAbAttr, + FieldPriorityMoveImmunityAbAttr, + IgnoreOpponentStatStagesAbAttr, + MoveImmunityAbAttr, + PreDefendFullHpEndureAbAttr, + ReceivedMoveDamageMultiplierAbAttr, + StabBoostAbAttr, + StatusEffectImmunityAbAttr, + TypeImmunityAbAttr, + WeightMultiplierAbAttr, + allAbilities, + applyAbAttrs, + applyStatMultiplierAbAttrs, + applyPreApplyBattlerTagAbAttrs, + applyPreAttackAbAttrs, + applyPreDefendAbAttrs, + applyPreSetStatusAbAttrs, + UnsuppressableAbilityAbAttr, + 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, + applyOnGainAbAttrs, + PreLeaveFieldAbAttr, + applyPreLeaveFieldAbAttrs, + applyOnLoseAbAttrs, + PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, +} from "#app/data/ability"; +import type 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 type { PartyOption } from "#app/ui/party-ui-handler"; +import PartyUiHandler, { 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 type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; +import { + EVOLVE_MOVE, + 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"; -import { Nature, getNatureStatMultiplier } from "#app/data/nature"; -import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "#app/data/pokemon-forms"; +import type { StarterDataEntry, StarterMoveset } from "#app/system/game-data"; +import { DexAttr } from "#app/system/game-data"; +import { + QuantizerCelebi, + argbFromRgba, + rgbaFromArgb, +} from "@material/material-color-utilities"; +import { getNatureStatMultiplier } from "#app/data/nature"; +import type { SpeciesFormChange } from "#app/data/pokemon-forms"; +import { + SpeciesFormChangeActiveTrigger, + SpeciesFormChangeLapseTeraTrigger, + SpeciesFormChangeMoveLearnedTrigger, + SpeciesFormChangePostMoveTrigger, + SpeciesFormChangeStatusEffectTrigger, +} from "#app/data/pokemon-forms"; import { TerrainType } from "#app/data/terrain"; -import { TrainerSlot } from "#app/data/trainer-config"; +import type { TrainerSlot } from "#app/data/trainer-config"; import Overrides from "#app/overrides"; import i18next from "i18next"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; @@ -45,12 +232,12 @@ import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattleSpec } from "#enums/battle-spec"; import { BattlerTagType } from "#enums/battler-tag-type"; -import { BerryType } from "#enums/berry-type"; +import type { BerryType } from "#enums/berry-type"; 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"; @@ -58,62 +245,82 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; -import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; import { Challenges } from "#enums/challenges"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { SwitchType } from "#enums/switch-type"; 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 { + 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, LEFT, - RIGHT + RIGHT, } export default abstract class Pokemon extends Phaser.GameObjects.Container { - public id: integer; + public id: number; public name: string; public nickname: string; public species: PokemonSpecies; - public formIndex: integer; - public abilityIndex: integer; + public formIndex: number; + public abilityIndex: number; public passive: boolean; public shiny: boolean; public variant: Variant; public pokeball: PokeballType; protected battleInfo: BattleInfo; - public level: integer; - public exp: integer; - public levelExp: integer; + public level: number; + public exp: number; + public levelExp: number; public gender: Gender; - public hp: integer; - public stats: integer[]; - public ivs: integer[]; + public hp: number; + public stats: number[]; + public ivs: number[]; public nature: Nature; public moveset: (PokemonMove | null)[]; public status: Status | null; - public friendship: integer; - public metLevel: integer; + public friendship: number; + public metLevel: number; public metBiome: Biome | -1; public metSpecies: Species; public metWave: number; - public luck: integer; + public luck: number; public pauseEvolutions: boolean; public pokerus: boolean; public switchOutStatus: boolean; - public evoCounter: integer; + public evoCounter: number; + public teraType: PokemonType; + public isTerastallized: boolean; + public stellarTypesBoosted: PokemonType[]; public fusionSpecies: PokemonSpecies | null; - public fusionFormIndex: integer; - public fusionAbilityIndex: integer; + public fusionFormIndex: number; + public fusionAbilityIndex: number; public fusionShiny: boolean; public fusionVariant: Variant; public fusionGender: Gender; - public fusionLuck: integer; + public fusionLuck: number; public fusionCustomPokemonData: CustomPokemonData | null; + public fusionTeraType: PokemonType; private summonDataPrimer: PokemonSummonData | null; @@ -135,16 +342,35 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { private shinySparkle: Phaser.GameObjects.Sprite; - constructor(scene: BattleScene, x: number, y: number, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) { - super(scene, x, y); + constructor( + x: number, + y: number, + species: PokemonSpecies, + level: number, + abilityIndex?: number, + formIndex?: number, + gender?: Gender, + shiny?: boolean, + variant?: Variant, + ivs?: number[], + nature?: Nature, + dataSource?: Pokemon | PokemonData, + ) { + super(globalScene, x, y); if (!species.isObtainable() && this.isPlayer()) { throw `Cannot create a player Pokemon for species '${species.getName(formIndex)}'`; } - const hiddenAbilityChance = new Utils.IntegerHolder(BASE_HIDDEN_ABILITY_CHANCE); + const hiddenAbilityChance = new Utils.NumberHolder( + BASE_HIDDEN_ABILITY_CHANCE, + ); if (!this.hasTrainer()) { - this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + globalScene.applyModifiers( + HiddenAbilityRateBoosterModifier, + true, + hiddenAbilityChance, + ); } this.species = species; @@ -164,7 +390,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.abilityIndex = 2; } else { // If there is no hidden ability or species does not have a hidden ability - this.abilityIndex = species.ability2 !== species.ability1 ? randAbilityIndex : 0; // Use random ability index if species has a second ability, otherwise use 0 + this.abilityIndex = + species.ability2 !== species.ability1 ? randAbilityIndex : 0; // Use random ability index if species has a second ability, otherwise use 0 } } if (formIndex !== undefined) { @@ -179,7 +406,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (variant !== undefined) { this.variant = variant; } - this.exp = dataSource?.exp || getLevelTotalExp(this.level, species.growthRate); + this.exp = + dataSource?.exp || getLevelTotalExp(this.level, species.growthRate); this.levelExp = dataSource?.levelExp || 0; if (dataSource) { this.id = dataSource.id; @@ -190,20 +418,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.variant === undefined) { this.variant = 0; } - this.nature = dataSource.nature || 0 as Nature; + this.nature = dataSource.nature || (0 as Nature); this.nickname = dataSource.nickname; this.moveset = dataSource.moveset; this.status = dataSource.status!; // TODO: is this bang correct? - this.friendship = dataSource.friendship !== undefined ? dataSource.friendship : this.species.baseFriendship; + this.friendship = + dataSource.friendship !== undefined + ? dataSource.friendship + : this.species.baseFriendship; this.metLevel = dataSource.metLevel || 5; this.luck = dataSource.luck; this.metBiome = dataSource.metBiome; - this.metSpecies = dataSource.metSpecies ?? (this.metBiome !== -1 ? this.species.speciesId : this.species.getRootSpeciesId(true)); + this.metSpecies = + dataSource.metSpecies ?? + (this.metBiome !== -1 + ? this.species.speciesId + : this.species.getRootSpeciesId(true)); this.metWave = dataSource.metWave ?? (this.metBiome === -1 ? -1 : 0); this.pauseEvolutions = dataSource.pauseEvolutions; this.pokerus = !!dataSource.pokerus; this.evoCounter = dataSource.evoCounter ?? 0; - this.fusionSpecies = dataSource.fusionSpecies instanceof PokemonSpecies ? dataSource.fusionSpecies : dataSource.fusionSpecies ? getPokemonSpecies(dataSource.fusionSpecies) : null; + this.fusionSpecies = + dataSource.fusionSpecies instanceof PokemonSpecies + ? dataSource.fusionSpecies + : dataSource.fusionSpecies + ? getPokemonSpecies(dataSource.fusionSpecies) + : null; this.fusionFormIndex = dataSource.fusionFormIndex; this.fusionAbilityIndex = dataSource.fusionAbilityIndex; this.fusionShiny = dataSource.fusionShiny; @@ -211,8 +451,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionGender = dataSource.fusionGender; this.fusionLuck = dataSource.fusionLuck; this.fusionCustomPokemonData = dataSource.fusionCustomPokemonData; + this.fusionTeraType = dataSource.fusionTeraType; this.usedTMs = dataSource.usedTMs ?? []; - this.customPokemonData = new CustomPokemonData(dataSource.customPokemonData); + this.customPokemonData = new CustomPokemonData( + dataSource.customPokemonData, + ); + this.teraType = dataSource.teraType; + this.isTerastallized = dataSource.isTerastallized; + this.stellarTypesBoosted = dataSource.stellarTypesBoosted ?? []; } else { this.id = Utils.randSeedInt(4294967296); this.ivs = ivs || Utils.getIvsFromId(this.id); @@ -222,7 +468,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (this.formIndex === undefined) { - this.formIndex = this.scene.getSpeciesFormIndex(species, this.gender, this.nature, this.isPlayer()); + this.formIndex = globalScene.getSpeciesFormIndex( + species, + this.gender, + this.nature, + this.isPlayer(), + ); } if (this.shiny === undefined) { @@ -230,7 +481,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (this.variant === undefined) { - this.variant = this.shiny ? this.generateVariant() : 0; + this.variant = this.shiny ? this.generateShinyVariant() : 0; } this.customPokemonData = new CustomPokemonData(); @@ -243,15 +494,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.friendship = species.baseFriendship; this.metLevel = level; - this.metBiome = scene.currentBattle ? scene.arena.biomeType : -1; + this.metBiome = globalScene.currentBattle + ? globalScene.arena.biomeType + : -1; this.metSpecies = species.speciesId; - this.metWave = scene.currentBattle ? scene.currentBattle.waveIndex : -1; + this.metWave = globalScene.currentBattle + ? globalScene.currentBattle.waveIndex + : -1; this.pokerus = false; if (level > 1) { - const fused = new Utils.BooleanHolder(scene.gameMode.isSplicedOnly); + const fused = new Utils.BooleanHolder( + globalScene.gameMode.isSplicedOnly, + ); if (!fused.value && !this.isPlayer() && !this.hasTrainer()) { - this.scene.applyModifier(EnemyFusionChanceModifier, false, fused); + globalScene.applyModifier(EnemyFusionChanceModifier, false, fused); } if (fused.value) { @@ -259,8 +516,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.generateFusionSpecies(); } } - this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0); + this.luck = + (this.shiny ? this.variant + 1 : 0) + + (this.fusionShiny ? this.fusionVariant + 1 : 0); this.fusionLuck = this.luck; + + this.teraType = Utils.randSeedItem(this.getTypes(false, false, true)); + this.isTerastallized = false; + this.stellarTypesBoosted = []; } this.generateName(); @@ -274,7 +537,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - getNameToRender() { try { if (this.nickname) { @@ -292,12 +554,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.initBattleInfo(); - this.scene.fieldUI.addAt(this.battleInfo, 0); + globalScene.fieldUI.addAt(this.battleInfo, 0); const getSprite = (hasShadow?: boolean) => { - const ret = this.scene.addPokemonSprite(this, 0, 0, `pkmn__${this.isPlayer() ? "back__" : ""}sub`, undefined, true); + const ret = globalScene.addPokemonSprite( + this, + 0, + 0, + `pkmn__${this.isPlayer() ? "back__" : ""}sub`, + undefined, + true, + ); ret.setOrigin(0.5, 1); - ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, teraColor: getTypeRgb(this.getTeraType()) }); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: !!hasShadow, + teraColor: getTypeRgb(this.getTeraType()), + isTerastallized: this.isTerastallized, + }); return ret; }; @@ -319,49 +593,75 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { abstract initBattleInfo(): void; isOnField(): boolean { - if (!this.scene) { + if (!globalScene) { return false; } - return this.scene.field.getIndex(this) > -1; - } - - isFainted(checkStatus?: boolean): boolean { - return !this.hp && (!checkStatus || this.status?.effect === StatusEffect.FAINT); + if (this.switchOutStatus) { + return false; + } + return globalScene.field.getIndex(this) > -1; } /** - * Check if this pokemon is both not fainted (or a fled wild pokemon) and allowed to be in battle. - * This is frequently a better alternative to {@link isFainted} - * @returns {boolean} True if pokemon is allowed in battle + * Checks if a pokemon is fainted (ie: its `hp <= 0`). + * It's usually better to call {@linkcode isAllowedInBattle()} + * @param checkStatus `true` to also check that the pokemon's status is {@linkcode StatusEffect.FAINT} + * @returns `true` if the pokemon is fainted */ - isAllowedInBattle(): boolean { - return !this.isFainted() && this.isAllowed(); + public isFainted(checkStatus = false): boolean { + return ( + this.hp <= 0 && + (!checkStatus || this.status?.effect === StatusEffect.FAINT) + ); } /** - * Check if this pokemon is allowed (no challenge exclusion) - * This is frequently a better alternative to {@link isFainted} - * @returns {boolean} True if pokemon is allowed in battle + * Check if this pokemon is both not fainted and allowed to be in battle based on currently active challenges. + * @returns {boolean} `true` if pokemon is allowed in battle */ - isAllowed(): boolean { + public isAllowedInBattle(): boolean { + return !this.isFainted() && this.isAllowedInChallenge(); + } + + /** + * Check if this pokemon is allowed based on any active challenges. + * It's usually better to call {@linkcode isAllowedInBattle()} + * @returns {boolean} `true` if pokemon is allowed in battle + */ + public isAllowedInChallenge(): boolean { const challengeAllowed = new Utils.BooleanHolder(true); - applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, this, challengeAllowed); + applyChallenges( + globalScene.gameMode, + ChallengeType.POKEMON_IN_BATTLE, + this, + challengeAllowed, + ); return challengeAllowed.value; } - isActive(onField?: boolean): boolean { - if (!this.scene) { + /** + * Checks if the pokemon is allowed in battle (ie: not fainted, and allowed under any active challenges). + * @param onField `true` to also check if the pokemon is currently on the field, defaults to `false` + * @returns `true` if the pokemon is "active". Returns `false` if there is no active {@linkcode BattleScene} + */ + public isActive(onField = false): boolean { + if (!globalScene) { return false; } - return this.isAllowedInBattle() && !!this.scene && (!onField || this.isOnField()); + return this.isAllowedInBattle() && (!onField || this.isOnField()); } getDexAttr(): bigint { let ret = 0n; ret |= this.gender !== Gender.FEMALE ? DexAttr.MALE : DexAttr.FEMALE; ret |= !this.shiny ? DexAttr.NON_SHINY : DexAttr.SHINY; - ret |= this.variant >= 2 ? DexAttr.VARIANT_3 : this.variant === 1 ? DexAttr.VARIANT_2 : DexAttr.DEFAULT_VARIANT; - ret |= this.scene.gameData.getFormAttr(this.formIndex); + ret |= + this.variant >= 2 + ? DexAttr.VARIANT_3 + : this.variant === 1 + ? DexAttr.VARIANT_2 + : DexAttr.DEFAULT_VARIANT; + ret |= globalScene.gameData.getFormAttr(this.formIndex); return ret; } @@ -375,7 +675,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.name = this.species.getName(this.formIndex); return; } - this.name = getFusedSpeciesName(this.species.getName(this.formIndex), this.fusionSpecies.getName(this.fusionFormIndex)); + this.name = getFusedSpeciesName( + this.species.getName(this.formIndex), + this.fusionSpecies.getName(this.fusionFormIndex), + ); if (this.battleInfo) { this.updateInfo(true); } @@ -385,95 +688,194 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { abstract hasTrainer(): boolean; - abstract getFieldIndex(): integer; + abstract getFieldIndex(): number; abstract getBattlerIndex(): BattlerIndex; - loadAssets(ignoreOverride: boolean = true): Promise { + loadAssets(ignoreOverride = true): Promise { return new Promise(resolve => { const moveIds = this.getMoveset().map(m => m!.getMove().id); // TODO: is this bang correct? - Promise.allSettled(moveIds.map(m => initMoveAnim(this.scene, m))) - .then(() => { - loadMoveAnimAssets(this.scene, moveIds); - this.getSpeciesForm().loadAssets(this.scene, this.getGender() === Gender.FEMALE, this.formIndex, this.shiny, this.variant); - if (this.isPlayer() || this.getFusionSpeciesForm()) { - this.scene.loadPokemonAtlas(this.getBattleSpriteKey(true, ignoreOverride), this.getBattleSpriteAtlasPath(true, ignoreOverride)); - } - if (this.getFusionSpeciesForm()) { - this.getFusionSpeciesForm().loadAssets(this.scene, this.getFusionGender() === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant); - this.scene.loadPokemonAtlas(this.getFusionBattleSpriteKey(true, ignoreOverride), this.getFusionBattleSpriteAtlasPath(true, ignoreOverride)); - } - this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => { - if (this.isPlayer()) { - const originalWarn = console.warn; - // Ignore warnings for missing frames, because there will be a lot - console.warn = () => {}; - const battleFrameNames = this.scene.anims.generateFrameNames(this.getBattleSpriteKey(), { zeroPad: 4, suffix: ".png", start: 1, end: 400 }); - console.warn = originalWarn; - if (!(this.scene.anims.exists(this.getBattleSpriteKey()))) { - this.scene.anims.create({ - key: this.getBattleSpriteKey(), - frames: battleFrameNames, - frameRate: 12, - repeat: -1 - }); - } + Promise.allSettled(moveIds.map(m => initMoveAnim(m))).then(() => { + loadMoveAnimAssets(moveIds); + this.getSpeciesForm().loadAssets( + this.getGender() === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + ); + if (this.isPlayer() || this.getFusionSpeciesForm()) { + globalScene.loadPokemonAtlas( + this.getBattleSpriteKey(true, ignoreOverride), + this.getBattleSpriteAtlasPath(true, ignoreOverride), + ); + } + if (this.getFusionSpeciesForm()) { + this.getFusionSpeciesForm().loadAssets( + this.getFusionGender() === Gender.FEMALE, + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + ); + globalScene.loadPokemonAtlas( + this.getFusionBattleSpriteKey(true, ignoreOverride), + this.getFusionBattleSpriteAtlasPath(true, ignoreOverride), + ); + } + globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => { + if (this.isPlayer()) { + const originalWarn = console.warn; + // Ignore warnings for missing frames, because there will be a lot + console.warn = () => {}; + const battleFrameNames = globalScene.anims.generateFrameNames( + this.getBattleSpriteKey(), + { zeroPad: 4, suffix: ".png", start: 1, end: 400 }, + ); + console.warn = originalWarn; + if (!globalScene.anims.exists(this.getBattleSpriteKey())) { + globalScene.anims.create({ + key: this.getBattleSpriteKey(), + frames: battleFrameNames, + frameRate: 10, + repeat: -1, + }); } - this.playAnim(); - const updateFusionPaletteAndResolve = () => { - this.updateFusionPalette(); - if (this.summonData?.speciesForm) { - this.updateFusionPalette(true); - } - resolve(); - }; - if (this.shiny) { - const populateVariantColors = (key: string, back: boolean = false): Promise => { - return new Promise(resolve => { - const battleSpritePath = this.getBattleSpriteAtlasPath(back, ignoreOverride).replace("variant/", "").replace(/_[1-3]$/, ""); - let config = variantData; - const useExpSprite = this.scene.experimentalSprites && this.scene.hasExpSprite(this.getBattleSpriteKey(back, ignoreOverride)); - battleSpritePath.split("/").map(p => config ? config = config[p] : null); - const variantSet: VariantSet = config as VariantSet; - if (variantSet && variantSet[this.variant] === 1) { - if (variantColorCache.hasOwnProperty(key)) { - return resolve(); - } - this.scene.cachedFetch(`./images/pokemon/variant/${useExpSprite ? "exp/" : ""}${battleSpritePath}.json`). - then(res => { - // Prevent the JSON from processing if it failed to load - if (!res.ok) { - console.error(`Could not load ${res.url}!`); - return; - } - return res.json(); - }).then(c => { - variantColorCache[key] = c; - resolve(); - }); - } else { - resolve(); + } + this.playAnim(); + const updateFusionPaletteAndResolve = () => { + this.updateFusionPalette(); + if (this.summonData?.speciesForm) { + this.updateFusionPalette(true); + } + resolve(); + }; + if (this.shiny) { + const populateVariantColors = ( + isBackSprite = false, + ): Promise => { + return new Promise(async resolve => { + const battleSpritePath = this.getBattleSpriteAtlasPath( + isBackSprite, + ignoreOverride, + ) + .replace("variant/", "") + .replace(/_[1-3]$/, ""); + let config = variantData; + const useExpSprite = + globalScene.experimentalSprites && + globalScene.hasExpSprite( + this.getBattleSpriteKey(isBackSprite, ignoreOverride), + ); + battleSpritePath + .split("/") + .map(p => (config ? (config = config[p]) : null)); + const variantSet: VariantSet = config as VariantSet; + if (variantSet && variantSet[this.variant] === 1) { + const cacheKey = this.getBattleSpriteKey(isBackSprite); + if (!variantColorCache.hasOwnProperty(cacheKey)) { + await this.populateVariantColorCache( + cacheKey, + useExpSprite, + battleSpritePath, + ); } - }); - }; - if (this.isPlayer()) { - Promise.all([ populateVariantColors(this.getBattleSpriteKey(false)), populateVariantColors(this.getBattleSpriteKey(true), true) ]).then(() => updateFusionPaletteAndResolve()); - } else { - populateVariantColors(this.getBattleSpriteKey(false)).then(() => updateFusionPaletteAndResolve()); - } + } + resolve(); + }); + }; + if (this.isPlayer()) { + Promise.all([ + populateVariantColors(false), + populateVariantColors(true), + ]).then(() => updateFusionPaletteAndResolve()); } else { - updateFusionPaletteAndResolve(); + populateVariantColors(false).then(() => + updateFusionPaletteAndResolve(), + ); } - }); - if (!this.scene.load.isLoading()) { - this.scene.load.start(); + } else { + updateFusionPaletteAndResolve(); } }); + if (!globalScene.load.isLoading()) { + globalScene.load.start(); + } + }); }); } + /** + * Gracefully handle errors loading a variant sprite. Log if it fails and attempt to fall back on + * non-experimental sprites before giving up. + * + * @param cacheKey the cache key for the variant color sprite + * @param attemptedSpritePath the sprite path that failed to load + * @param useExpSprite was the attempted sprite experimental + * @param battleSpritePath the filename of the sprite + * @param optionalParams any additional params to log + */ + async fallbackVariantColor( + cacheKey: string, + attemptedSpritePath: string, + useExpSprite: boolean, + battleSpritePath: string, + ...optionalParams: any[] + ) { + console.warn(`Could not load ${attemptedSpritePath}!`, ...optionalParams); + if (useExpSprite) { + await this.populateVariantColorCache(cacheKey, false, battleSpritePath); + } + } + + /** + * Attempt to process variant sprite. + * + * @param cacheKey the cache key for the variant color sprite + * @param useExpSprite should the experimental sprite be used + * @param battleSpritePath the filename of the sprite + */ + async populateVariantColorCache( + cacheKey: string, + useExpSprite: boolean, + battleSpritePath: string, + ) { + const spritePath = `./images/pokemon/variant/${useExpSprite ? "exp/" : ""}${battleSpritePath}.json`; + return globalScene + .cachedFetch(spritePath) + .then(res => { + // Prevent the JSON from processing if it failed to load + if (!res.ok) { + return this.fallbackVariantColor( + cacheKey, + res.url, + useExpSprite, + battleSpritePath, + res.status, + res.statusText, + ); + } + return res.json(); + }) + .catch(error => { + return this.fallbackVariantColor( + cacheKey, + spritePath, + useExpSprite, + battleSpritePath, + error, + ); + }) + .then(c => { + if (!isNullOrUndefined(c)) { + variantColorCache[cacheKey] = c; + } + }); + } + getFormKey(): string { - if (!this.species.forms.length || this.species.forms.length <= this.formIndex) { + if ( + !this.species.forms.length || + this.species.forms.length <= this.formIndex + ) { return ""; } return this.species.forms[this.formIndex].formKey; @@ -483,7 +885,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.fusionSpecies) { return null; } - if (!this.fusionSpecies.forms.length || this.fusionSpecies.forms.length <= this.fusionFormIndex) { + if ( + !this.fusionSpecies.forms.length || + this.fusionSpecies.forms.length <= this.fusionFormIndex + ) { return ""; } return this.fusionSpecies.forms[this.fusionFormIndex].formKey; @@ -495,23 +900,42 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getBattleSpriteAtlasPath(back?: boolean, ignoreOverride?: boolean): string { - const spriteId = this.getBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, "/"); + const spriteId = this.getBattleSpriteId(back, ignoreOverride).replace( + /\_{2}/g, + "/", + ); return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } getSpriteId(ignoreOverride?: boolean): string { - return this.getSpeciesForm(ignoreOverride).getSpriteId(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.shiny, this.variant); + return this.getSpeciesForm(ignoreOverride).getSpriteId( + this.getGender(ignoreOverride) === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + ); } getBattleSpriteId(back?: boolean, ignoreOverride?: boolean): string { if (back === undefined) { back = this.isPlayer(); } - return this.getSpeciesForm(ignoreOverride).getSpriteId(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.shiny, this.variant, back); + return this.getSpeciesForm(ignoreOverride).getSpriteId( + this.getGender(ignoreOverride) === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + back, + ); } getSpriteKey(ignoreOverride?: boolean): string { - return this.getSpeciesForm(ignoreOverride).getSpriteKey(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.shiny, this.variant); + return this.getSpeciesForm(ignoreOverride).getSpriteKey( + this.getGender(ignoreOverride) === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + ); } getBattleSpriteKey(back?: boolean, ignoreOverride?: boolean): string { @@ -519,38 +943,73 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getFusionSpriteId(ignoreOverride?: boolean): string { - return this.getFusionSpeciesForm(ignoreOverride).getSpriteId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant); + return this.getFusionSpeciesForm(ignoreOverride).getSpriteId( + this.getFusionGender(ignoreOverride) === Gender.FEMALE, + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + ); } getFusionBattleSpriteId(back?: boolean, ignoreOverride?: boolean): string { if (back === undefined) { back = this.isPlayer(); } - return this.getFusionSpeciesForm(ignoreOverride).getSpriteId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant, back); + return this.getFusionSpeciesForm(ignoreOverride).getSpriteId( + this.getFusionGender(ignoreOverride) === Gender.FEMALE, + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + back, + ); } getFusionBattleSpriteKey(back?: boolean, ignoreOverride?: boolean): string { return `pkmn__${this.getFusionBattleSpriteId(back, ignoreOverride)}`; } - getFusionBattleSpriteAtlasPath(back?: boolean, ignoreOverride?: boolean): string { - return this.getFusionBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, "/"); + getFusionBattleSpriteAtlasPath( + back?: boolean, + ignoreOverride?: boolean, + ): string { + return this.getFusionBattleSpriteId(back, ignoreOverride).replace( + /\_{2}/g, + "/", + ); } getIconAtlasKey(ignoreOverride?: boolean): string { - return this.getSpeciesForm(ignoreOverride).getIconAtlasKey(this.formIndex, this.shiny, this.variant); + return this.getSpeciesForm(ignoreOverride).getIconAtlasKey( + this.formIndex, + this.shiny, + this.variant, + ); } getFusionIconAtlasKey(ignoreOverride?: boolean): string { - return this.getFusionSpeciesForm(ignoreOverride).getIconAtlasKey(this.fusionFormIndex, this.fusionShiny, this.fusionVariant); + return this.getFusionSpeciesForm(ignoreOverride).getIconAtlasKey( + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + ); } getIconId(ignoreOverride?: boolean): string { - return this.getSpeciesForm(ignoreOverride).getIconId(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.shiny, this.variant); + return this.getSpeciesForm(ignoreOverride).getIconId( + this.getGender(ignoreOverride) === Gender.FEMALE, + this.formIndex, + this.shiny, + this.variant, + ); } getFusionIconId(ignoreOverride?: boolean): string { - return this.getFusionSpeciesForm(ignoreOverride).getIconId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant); + return this.getFusionSpeciesForm(ignoreOverride).getIconId( + this.getFusionGender(ignoreOverride) === Gender.FEMALE, + this.fusionFormIndex, + this.fusionShiny, + this.fusionVariant, + ); } getSpeciesForm(ignoreOverride?: boolean): PokemonSpeciesForm { @@ -568,7 +1027,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!ignoreOverride && this.summonData?.speciesForm) { return this.summonData.fusionSpeciesForm; } - if (!this.fusionSpecies?.forms?.length || this.fusionFormIndex >= this.fusionSpecies?.forms.length) { + if ( + !this.fusionSpecies?.forms?.length || + this.fusionFormIndex >= this.fusionSpecies?.forms.length + ) { //@ts-ignore return this.fusionSpecies; // TODO: I don't even know how to fix this... A complete cluster of classes involved + null } @@ -581,15 +1043,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getTintSprite(): Phaser.GameObjects.Sprite | null { return !this.maskEnabled - ? this.getAt(1) as Phaser.GameObjects.Sprite + ? (this.getAt(1) as Phaser.GameObjects.Sprite) : this.maskSprite; } getSpriteScale(): number { const formKey = this.getFormKey(); - if (this.isMax() === true || formKey === "segin-starmobile" || formKey === "schedar-starmobile" || formKey === "navi-starmobile" || formKey === "ruchbah-starmobile" || formKey === "caph-starmobile") { + if ( + this.isMax() === true || + formKey === "segin-starmobile" || + formKey === "schedar-starmobile" || + formKey === "navi-starmobile" || + formKey === "ruchbah-starmobile" || + formKey === "caph-starmobile" + ) { return 1.5; - } else if (this.customPokemonData.spriteScale > 0) { + } + if (this.customPokemonData.spriteScale > 0) { return this.customPokemonData.spriteScale; } return 1; @@ -612,10 +1082,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getHeldItems(): PokemonHeldItemModifier[] { - if (!this.scene) { + if (!globalScene) { return []; } - return this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.id, this.isPlayer()) as PokemonHeldItemModifier[]; + return globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.id, + this.isPlayer(), + ) as PokemonHeldItemModifier[]; } updateScale(): void { @@ -623,26 +1096,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } updateSpritePipelineData(): void { - [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType())); + [this.getSprite(), this.getTintSprite()] + .filter(s => !!s) + .map(s => { + s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType()); + s.pipelineData["isTerastallized"] = this.isTerastallized; + }); this.updateInfo(true); } initShinySparkle(): void { - const keySuffix = this.variant ? `_${this.variant + 1}` : ""; - const key = `shiny${keySuffix}`; - const shinySparkle = this.scene.addFieldSprite(0, 0, key); + const shinySparkle = globalScene.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; @@ -656,13 +1122,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param animConfig {@linkcode String} to pass to {@linkcode Phaser.GameObjects.Sprite.play} * @returns true if the sprite was able to be animated */ - tryPlaySprite(sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite, key: string): boolean { + tryPlaySprite( + sprite: Phaser.GameObjects.Sprite, + tintSprite: Phaser.GameObjects.Sprite, + key: string, + ): boolean { // Catch errors when trying to play an animation that doesn't exist try { sprite.play(key); tintSprite.play(key); } catch (error: unknown) { - console.error(`Couldn't play animation for '${key}'!\nIs the image for this Pokemon missing?\n`, error); + console.error( + `Couldn't play animation for '${key}'!\nIs the image for this Pokemon missing?\n`, + error, + ); return false; } @@ -671,17 +1144,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } playAnim(): void { - this.tryPlaySprite(this.getSprite(), this.getTintSprite()!, this.getBattleSpriteKey()); // TODO: is the bag correct? + this.tryPlaySprite( + this.getSprite(), + this.getTintSprite()!, + this.getBattleSpriteKey(), + ); // TODO: is the bag correct? } - getFieldPositionOffset(): [ number, number ] { + getFieldPositionOffset(): [number, number] { switch (this.fieldPosition) { case FieldPosition.CENTER: - return [ 0, 0 ]; + return [0, 0]; case FieldPosition.LEFT: - return [ -32, -8 ]; + return [-32, -8]; case FieldPosition.RIGHT: - return [ 32, 0 ]; + return [32, 0]; } } @@ -691,8 +1168,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @see {@linkcode SubstituteTag} * @see {@linkcode getFieldPositionOffset} */ - getSubstituteOffset(): [ number, number ] { - return this.isPlayer() ? [ -30, 10 ] : [ 30, -10 ]; + getSubstituteOffset(): [number, number] { + return this.isPlayer() ? [-30, 10] : [30, -10]; } /** @@ -708,8 +1185,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } // During the Pokemon's MoveEffect phase, the offset is removed to put the Pokemon "in focus" - const currentPhase = this.scene.getCurrentPhase(); - if (currentPhase instanceof MoveEffectPhase && currentPhase.getPokemon() === this) { + const currentPhase = globalScene.getCurrentPhase(); + if ( + currentPhase instanceof MoveEffectPhase && + currentPhase.getPokemon() === this + ) { return false; } return true; @@ -726,7 +1206,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - setFieldPosition(fieldPosition: FieldPosition, duration?: integer): Promise { + setFieldPosition( + fieldPosition: FieldPosition, + duration?: number, + ): Promise { return new Promise(resolve => { if (fieldPosition === this.fieldPosition) { resolve(); @@ -749,17 +1232,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (duration) { // TODO: can this use stricter typing? - const targets: any[] = [ this ]; + const targets: any[] = [this]; if (subTag?.sprite) { targets.push(subTag.sprite); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: targets, x: (_target, _key, value: number) => value + relX, y: (_target, _key, value: number) => value + relY, duration: duration, ease: "Sine.easeOut", - onComplete: () => resolve() + onComplete: () => resolve(), }); } else { this.x += relX; @@ -777,7 +1260,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param bypassSummonData prefer actual stats (`true` by default) or in-battle overriden stats (`false`) * @returns the numeric values of the {@linkcode Pokemon}'s stats */ - getStats(bypassSummonData: boolean = true): number[] { + getStats(bypassSummonData = true): number[] { if (!bypassSummonData && this.summonData?.stats) { return this.summonData.stats; } @@ -790,8 +1273,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param bypassSummonData prefer actual stats (`true` by default) or in-battle overridden stats (`false`) * @returns the numeric value of the desired {@linkcode Stat} */ - getStat(stat: PermanentStat, bypassSummonData: boolean = true): number { - if (!bypassSummonData && this.summonData && (this.summonData.stats[stat] !== 0)) { + getStat(stat: PermanentStat, bypassSummonData = true): number { + if ( + !bypassSummonData && + this.summonData && + this.summonData.stats[stat] !== 0 + ) { return this.summonData.stats[stat]; } return this.stats[stat]; @@ -805,7 +1292,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param value the desired numeric value * @param bypassSummonData write to actual stats (`true` by default) or in-battle overridden stats (`false`) */ - setStat(stat: PermanentStat, value: number, bypassSummonData: boolean = true): void { + setStat(stat: PermanentStat, value: number, bypassSummonData = true): void { if (value >= 0) { if (!bypassSummonData && this.summonData) { this.summonData.stats[stat] = value; @@ -820,7 +1307,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns the numeric values of the {@linkcode Pokemon}'s in-battle stat stages if available, a fresh stat stage array otherwise */ getStatStages(): number[] { - return this.summonData ? this.summonData.statStages : [ 0, 0, 0, 0, 0, 0, 0 ]; + return this.summonData ? this.summonData.statStages : [0, 0, 0, 0, 0, 0, 0]; } /** @@ -857,13 +1344,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns the final critical-hit stage value */ getCritStage(source: Pokemon, move: Move): number { - const critStage = new Utils.IntegerHolder(0); + const critStage = new Utils.NumberHolder(0); applyMoveAttrs(HighCritAttr, source, this, move, critStage); - this.scene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critStage); - this.scene.applyModifiers(TempCritBoosterModifier, source.isPlayer(), critStage); + globalScene.applyModifiers( + CritBoosterModifier, + source.isPlayer(), + source, + critStage, + ); + globalScene.applyModifiers( + TempCritBoosterModifier, + source.isPlayer(), + critStage, + ); const bonusCrit = new Utils.BooleanHolder(false); //@ts-ignore - if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus. + if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { + // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus. if (bonusCrit.value) { critStage.value += 1; } @@ -871,7 +1368,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const critBoostTag = source.getTag(CritBoostTag); if (critBoostTag) { if (critBoostTag instanceof DragonCheerTag) { - critStage.value += critBoostTag.typesOnAdd.includes(Type.DRAGON) ? 2 : 1; + critStage.value += critBoostTag.typesOnAdd.includes(PokemonType.DRAGON) + ? 2 + : 1; } else { critStage.value += 2; } @@ -892,25 +1391,67 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOppAbility during an attack, determines whether the opposing Pokemon's abilities should be ignored during the stat calculation. * @param isCritical determines whether a critical hit has occurred or not (`false` by default) * @param simulated if `true`, nullifies any effects that produce any changes to game state from triggering + * @param ignoreHeldItems determines whether this Pokemon's held items should be ignored during the stat calculation, default `false` * @returns the final in-battle value of a stat */ - getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreAbility: boolean = false, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): integer { + getEffectiveStat( + stat: EffectiveStat, + opponent?: Pokemon, + move?: Move, + ignoreAbility = false, + ignoreOppAbility = false, + isCritical = false, + simulated = true, + ignoreHeldItems = false, + ): number { const statValue = new Utils.NumberHolder(this.getStat(stat, false)); - this.scene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); + if (!ignoreHeldItems) { + globalScene.applyModifiers( + StatBoosterModifier, + this.isPlayer(), + this, + stat, + statValue, + ); + } // The Ruin abilities here are never ignored, but they reveal themselves on summon anyway const fieldApplied = new Utils.BooleanHolder(false); - for (const pokemon of this.scene.getField(true)) { - applyFieldStatMultiplierAbAttrs(FieldMultiplyStatAbAttr, pokemon, stat, statValue, this, fieldApplied, simulated); + for (const pokemon of globalScene.getField(true)) { + applyFieldStatMultiplierAbAttrs( + FieldMultiplyStatAbAttr, + pokemon, + stat, + statValue, + this, + fieldApplied, + simulated, + ); if (fieldApplied.value) { break; } } if (!ignoreAbility) { - applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, stat, statValue, simulated); + applyStatMultiplierAbAttrs( + StatMultiplierAbAttr, + this, + stat, + statValue, + simulated, + ); } - let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, ignoreOppAbility, isCritical, simulated); + let ret = + statValue.value * + this.getStatStageMultiplier( + stat, + opponent, + move, + ignoreOppAbility, + isCritical, + simulated, + ignoreHeldItems, + ); switch (stat) { case Stat.ATK: @@ -919,23 +1460,31 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } break; case Stat.DEF: - if (this.isOfType(Type.ICE) && this.scene.arena.weather?.weatherType === WeatherType.SNOW) { + if ( + this.isOfType(PokemonType.ICE) && + globalScene.arena.weather?.weatherType === WeatherType.SNOW + ) { ret *= 1.5; } break; case Stat.SPATK: break; case Stat.SPDEF: - if (this.isOfType(Type.ROCK) && this.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) { + if ( + this.isOfType(PokemonType.ROCK) && + globalScene.arena.weather?.weatherType === WeatherType.SANDSTORM + ) { ret *= 1.5; } break; case Stat.SPD: const side = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - if (this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, side)) { + if (globalScene.arena.getTagOnSide(ArenaTagType.TAILWIND, side)) { ret *= 2; } - if (this.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, side)) { + if ( + globalScene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, side) + ) { ret >>= 2; } @@ -945,10 +1494,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.status && this.status.effect === StatusEffect.PARALYSIS) { ret >>= 1; } + if ( + this.getTag(BattlerTagType.UNBURDEN) && + this.hasAbility(Abilities.UNBURDEN) + ) { + ret *= 2; + } break; } - const highestStatBoost = this.findTag(t => t instanceof HighestStatBoostTag && (t as HighestStatBoostTag).stat === stat) as HighestStatBoostTag; + const highestStatBoost = this.findTag( + t => + t instanceof HighestStatBoostTag && + (t as HighestStatBoostTag).stat === stat, + ) as HighestStatBoostTag; if (highestStatBoost) { ret *= highestStatBoost.multiplier; } @@ -958,17 +1517,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { calculateStats(): void { if (!this.stats) { - this.stats = [ 0, 0, 0, 0, 0, 0 ]; + this.stats = [0, 0, 0, 0, 0, 0]; } // Get and manipulate base stats const baseStats = this.calculateBaseStats(); // Using base stats, calculate and store stats one by one for (const s of PERMANENT_STATS) { - const statHolder = new Utils.IntegerHolder(Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01)); + const statHolder = new Utils.NumberHolder( + Math.floor((2 * baseStats[s] + this.ivs[s]) * this.level * 0.01), + ); if (s === Stat.HP) { statHolder.value = statHolder.value + this.level + 10; - this.scene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder); + globalScene.applyModifier( + PokemonIncrementingStatModifier, + this.isPlayer(), + this, + s, + statHolder, + ); if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) { statHolder.value = 1; } @@ -982,15 +1549,37 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } else { statHolder.value += 5; - const natureStatMultiplier = new Utils.NumberHolder(getNatureStatMultiplier(this.getNature(), s)); - this.scene.applyModifier(PokemonNatureWeightModifier, this.isPlayer(), this, natureStatMultiplier); + const natureStatMultiplier = new Utils.NumberHolder( + getNatureStatMultiplier(this.getNature(), s), + ); + globalScene.applyModifier( + PokemonNatureWeightModifier, + this.isPlayer(), + this, + natureStatMultiplier, + ); if (natureStatMultiplier.value !== 1) { - statHolder.value = Math.max(Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"](statHolder.value * natureStatMultiplier.value), 1); + statHolder.value = Math.max( + Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"]( + statHolder.value * natureStatMultiplier.value, + ), + 1, + ); } - this.scene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, s, statHolder); + globalScene.applyModifier( + PokemonIncrementingStatModifier, + this.isPlayer(), + this, + s, + statHolder, + ); } - statHolder.value = Phaser.Math.Clamp(statHolder.value, 1, Number.MAX_SAFE_INTEGER); + statHolder.value = Phaser.Math.Clamp( + statHolder.value, + 1, + Number.MAX_SAFE_INTEGER, + ); this.setStat(s, statHolder.value); } @@ -998,28 +1587,58 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { calculateBaseStats(): number[] { const baseStats = this.getSpeciesForm(true).baseStats.slice(0); + applyChallenges( + globalScene.gameMode, + ChallengeType.FLIP_STAT, + this, + baseStats, + ); // Shuckle Juice - this.scene.applyModifiers(PokemonBaseStatTotalModifier, this.isPlayer(), this, baseStats); + globalScene.applyModifiers( + PokemonBaseStatTotalModifier, + this.isPlayer(), + this, + baseStats, + ); // Old Gateau - this.scene.applyModifiers(PokemonBaseStatFlatModifier, this.isPlayer(), this, baseStats); + globalScene.applyModifiers( + PokemonBaseStatFlatModifier, + this.isPlayer(), + this, + baseStats, + ); if (this.isFusion()) { const fusionBaseStats = this.getFusionSpeciesForm(true).baseStats; + applyChallenges( + globalScene.gameMode, + ChallengeType.FLIP_STAT, + this, + fusionBaseStats, + ); + for (const s of PERMANENT_STATS) { baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2); } - } else if (this.scene.gameMode.isSplicedOnly) { + } else if (globalScene.gameMode.isSplicedOnly) { for (const s of PERMANENT_STATS) { baseStats[s] = Math.ceil(baseStats[s] / 2); } } // Vitamins - this.scene.applyModifiers(BaseStatModifier, this.isPlayer(), this, baseStats); + globalScene.applyModifiers( + BaseStatModifier, + this.isPlayer(), + this, + baseStats, + ); return baseStats; } getNature(): Nature { - return this.customPokemonData.nature !== -1 ? this.customPokemonData.nature : this.nature; + return this.customPokemonData.nature !== -1 + ? this.customPokemonData.nature + : this.nature; } setNature(nature: Nature): void { @@ -1027,6 +1646,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.calculateStats(); } + setCustomNature(nature: Nature): void { + this.customPokemonData.nature = nature; + this.calculateStats(); + } + generateNature(naturePool?: Nature[]): void { if (naturePool === undefined) { naturePool = Utils.getEnumValues(Nature); @@ -1039,15 +1663,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.hp >= this.getMaxHp(); } - getMaxHp(): integer { + getMaxHp(): number { return this.getStat(Stat.HP); } - getInverseHp(): integer { + /** Returns the amount of hp currently missing from this {@linkcode Pokemon} (max - current) */ + getInverseHp(): number { return this.getMaxHp() - this.hp; } - getHpRatio(precise: boolean = false): number { + getHpRatio(precise = false): number { return precise ? this.hp / this.getMaxHp() : Math.round((this.hp / this.getMaxHp()) * 100) / 100; @@ -1085,10 +1710,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getVariant(): Variant { - return !this.isFusion() ? this.variant : Math.max(this.variant, this.fusionVariant) as Variant; + return !this.isFusion() + ? this.variant + : (Math.max(this.variant, this.fusionVariant) as Variant); } - getLuck(): integer { + getLuck(): number { return this.luck + (this.isFusion() ? this.fusionLuck : 0); } @@ -1105,17 +1732,37 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.fusionSpecies?.speciesId === species; } + /** + * Checks if the {@linkcode Pokemon} has is the specified {@linkcode Species} or is fused with it. + * @param species the pokemon {@linkcode Species} to check + * @param formKey If provided, requires the species to be in that form + * @returns `true` if the pokemon is the species or is fused with it, `false` otherwise + */ + hasSpecies(species: Species, formKey?: string): boolean { + if (Utils.isNullOrUndefined(formKey)) { + return ( + this.species.speciesId === species || + this.fusionSpecies?.speciesId === species + ); + } + + return (this.species.speciesId === species && this.getFormKey() === formKey) || (this.fusionSpecies?.speciesId === species && this.getFusionFormKey() === formKey); + } + abstract isBoss(): boolean; getMoveset(ignoreOverride?: boolean): (PokemonMove | null)[] { - const ret = !ignoreOverride && this.summonData?.moveset - ? this.summonData.moveset - : this.moveset; + const ret = + !ignoreOverride && this.summonData?.moveset + ? this.summonData.moveset + : this.moveset; // Overrides moveset based on arrays specified in overrides.ts - let overrideArray: Moves | Array = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE; + let overrideArray: Moves | Array = this.isPlayer() + ? Overrides.MOVESET_OVERRIDE + : Overrides.OPP_MOVESET_OVERRIDE; if (!Array.isArray(overrideArray)) { - overrideArray = [ overrideArray ]; + overrideArray = [overrideArray]; } if (overrideArray.length > 0) { if (!this.isPlayer()) { @@ -1123,7 +1770,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } overrideArray.forEach((move: Moves, index: number) => { const ppUsed = this.moveset[index]?.ppUsed ?? 0; - this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp)); + this.moveset[index] = new PokemonMove( + move, + Math.min(ppUsed, allMoves[move].pp), + ); }); } @@ -1139,10 +1789,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { */ getUnlockedEggMoves(): Moves[] { const moves: Moves[] = []; - const species = this.metSpecies in speciesEggMoves ? this.metSpecies : this.getSpeciesForm(true).getRootSpeciesId(true); + const species = + this.metSpecies in speciesEggMoves + ? this.metSpecies + : this.getSpeciesForm(true).getRootSpeciesId(true); if (species in speciesEggMoves) { for (let i = 0; i < 4; i++) { - if (this.scene.gameData.starterData[species].eggMoves & (1 << i)) { + if (globalScene.gameData.starterData[species].eggMoves & (1 << i)) { moves.push(speciesEggMoves[species][i]); } } @@ -1159,31 +1812,44 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns an array of {@linkcode Moves}, the length of which is determined * by how many learnable moves there are for the {@linkcode Pokemon}. */ - getLearnableLevelMoves(): Moves[] { + public getLearnableLevelMoves(): Moves[] { let levelMoves = this.getLevelMoves(1, true, false, true).map(lm => lm[1]); - if (this.metBiome === -1 && !this.scene.gameMode.isFreshStartChallenge() && !this.scene.gameMode.isDaily) { + if ( + this.metBiome === -1 && + !globalScene.gameMode.isFreshStartChallenge() && + !globalScene.gameMode.isDaily + ) { levelMoves = this.getUnlockedEggMoves().concat(levelMoves); } if (Array.isArray(this.usedTMs) && this.usedTMs.length > 0) { - levelMoves = this.usedTMs.filter(m => !levelMoves.includes(m)).concat(levelMoves); + levelMoves = this.usedTMs + .filter(m => !levelMoves.includes(m)) + .concat(levelMoves); } - levelMoves = levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm)); + levelMoves = levelMoves.filter( + lm => !this.moveset.some(m => m?.moveId === lm), + ); return levelMoves; } /** * Gets the types of a pokemon - * @param includeTeraType boolean to include tera-formed type, default false - * @param forDefend boolean if the pokemon is defending from an attack - * @param ignoreOverride boolean if true, ignore ability changing effects - * @returns array of {@linkcode Type} + * @param includeTeraType - `true` to include tera-formed type; Default: `false` + * @param forDefend - `true` if the pokemon is defending from an attack; Default: `false` + * @param ignoreOverride - If `true`, ignore ability changing effects; Default: `false` + * @returns array of {@linkcode PokemonType} */ - getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride?: boolean): Type[] { - const types : Type[] = []; + public getTypes( + includeTeraType = false, + forDefend = false, + ignoreOverride = false, + ): PokemonType[] { + const types: PokemonType[] = []; - if (includeTeraType) { + if (includeTeraType && this.isTerastallized) { const teraType = this.getTeraType(); - if (teraType !== Type.UNKNOWN) { + if (this.isTerastallized && !(forDefend && teraType === PokemonType.STELLAR)) { + // Stellar tera uses its original types defensively types.push(teraType); if (forDefend) { return types; @@ -1192,72 +1858,100 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (!types.length || !includeTeraType) { - if (!ignoreOverride && this.summonData?.types && this.summonData.types.length > 0) { + if ( + !ignoreOverride && + this.summonData?.types && + this.summonData.types.length > 0 + ) { this.summonData.types.forEach(t => types.push(t)); - } else if (this.customPokemonData.types && this.customPokemonData.types.length > 0) { - // "Permanent" override for a Pokemon's normal types, currently only used by Mystery Encounters - types.push(this.customPokemonData.types[0]); - - // Fusing a Pokemon onto something with "permanently changed" types will still apply the fusion's types as normal - const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOverride); - if (fusionSpeciesForm) { - // Check if the fusion Pokemon also had "permanently changed" types - const fusionMETypes = this.fusionCustomPokemonData?.types; - if (fusionMETypes && fusionMETypes.length >= 2 && fusionMETypes[1] !== types[0]) { - types.push(fusionMETypes[1]); - } else if (fusionMETypes && fusionMETypes.length === 1 && fusionMETypes[0] !== types[0]) { - types.push(fusionMETypes[0]); - } else if (fusionSpeciesForm.type2 !== null && fusionSpeciesForm.type2 !== types[0]) { - types.push(fusionSpeciesForm.type2); - } else if (fusionSpeciesForm.type1 !== types[0]) { - types.push(fusionSpeciesForm.type1); - } - } - - if (types.length === 1 && this.customPokemonData.types.length >= 2) { - types.push(this.customPokemonData.types[1]); - } } else { const speciesForm = this.getSpeciesForm(ignoreOverride); - - types.push(speciesForm.type1); - const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOverride); + const customTypes = this.customPokemonData.types?.length > 0; + + // First type, checking for "permanently changed" types from ME + const firstType = + customTypes && this.customPokemonData.types[0] !== PokemonType.UNKNOWN + ? this.customPokemonData.types[0] + : speciesForm.type1; + types.push(firstType); + + // Second type + let secondType: PokemonType = PokemonType.UNKNOWN; + if (fusionSpeciesForm) { - // Check if the fusion Pokemon also had "permanently changed" types - // Otherwise, use standard fusion type logic - const fusionMETypes = this.fusionCustomPokemonData?.types; - if (fusionMETypes && fusionMETypes.length >= 2 && fusionMETypes[1] !== types[0]) { - types.push(fusionMETypes[1]); - } else if (fusionMETypes && fusionMETypes.length === 1 && fusionMETypes[0] !== types[0]) { - types.push(fusionMETypes[0]); - } else if (fusionSpeciesForm.type2 !== null && fusionSpeciesForm.type2 !== speciesForm.type1) { - types.push(fusionSpeciesForm.type2); - } else if (fusionSpeciesForm.type1 !== speciesForm.type1) { - types.push(fusionSpeciesForm.type1); + // Check if the fusion Pokemon also has permanent changes from ME when determining the fusion types + const fusionType1 = + this.fusionCustomPokemonData?.types && + this.fusionCustomPokemonData.types.length > 0 && + this.fusionCustomPokemonData.types[0] !== PokemonType.UNKNOWN + ? this.fusionCustomPokemonData.types[0] + : fusionSpeciesForm.type1; + const fusionType2 = + this.fusionCustomPokemonData?.types && + this.fusionCustomPokemonData.types.length > 1 && + this.fusionCustomPokemonData.types[1] !== PokemonType.UNKNOWN + ? this.fusionCustomPokemonData.types[1] + : fusionSpeciesForm.type2; + + // Assign second type if the fusion can provide one + if (fusionType2 !== null && fusionType2 !== types[0]) { + secondType = fusionType2; + } else if (fusionType1 !== types[0]) { + secondType = fusionType1; } + + if ( + secondType === PokemonType.UNKNOWN && + Utils.isNullOrUndefined(fusionType2) + ) { + // If second pokemon was monotype and shared its primary type + secondType = + customTypes && + this.customPokemonData.types.length > 1 && + this.customPokemonData.types[1] !== PokemonType.UNKNOWN + ? this.customPokemonData.types[1] + : (speciesForm.type2 ?? PokemonType.UNKNOWN); + } + } else { + // If not a fusion, just get the second type from the species, checking for permanent changes from ME + secondType = + customTypes && + this.customPokemonData.types.length > 1 && + this.customPokemonData.types[1] !== PokemonType.UNKNOWN + ? this.customPokemonData.types[1] + : (speciesForm.type2 ?? PokemonType.UNKNOWN); } - if (types.length === 1 && speciesForm.type2 !== null) { - types.push(speciesForm.type2); + if (secondType !== PokemonType.UNKNOWN) { + types.push(secondType); } } } - // this.scene potentially can be undefined for a fainted pokemon in doubles - // use optional chaining to avoid runtime errors - - if (!types.length) { // become UNKNOWN if no types are present - types.push(Type.UNKNOWN); + // become UNKNOWN if no types are present + if (!types.length) { + types.push(PokemonType.UNKNOWN); } - if (types.length > 1 && types.includes(Type.UNKNOWN)) { // remove UNKNOWN if other types are present - const index = types.indexOf(Type.UNKNOWN); + // remove UNKNOWN if other types are present + if (types.length > 1 && types.includes(PokemonType.UNKNOWN)) { + const index = types.indexOf(PokemonType.UNKNOWN); if (index !== -1) { types.splice(index, 1); } } + // the type added to Pokemon from moves like Forest's Curse or Trick Or Treat + if ( + !ignoreOverride && + this.summonData && + this.summonData.addedType && + !types.includes(this.summonData.addedType) + ) { + types.push(this.summonData.addedType); + } + // If both types are the same (can happen in weird custom typing scenarios), reduce to single type if (types.length > 1 && types[0] === types[1]) { types.splice(0, 1); @@ -1266,19 +1960,34 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return types; } - isOfType(type: Type, includeTeraType: boolean = true, forDefend: boolean = false, ignoreOverride?: boolean): boolean { - return !!this.getTypes(includeTeraType, forDefend, ignoreOverride).some(t => t === type); + /** + * Checks if the pokemon's typing includes the specified type + * @param type - {@linkcode PokemonType} to check + * @param includeTeraType - `true` to include tera-formed type; Default: `true` + * @param forDefend - `true` if the pokemon is defending from an attack; Default: `false` + * @param ignoreOverride - If `true`, ignore ability changing effects; Default: `false` + * @returns `true` if the Pokemon's type matches + */ + public isOfType( + type: PokemonType, + includeTeraType = true, + forDefend = false, + ignoreOverride = false, + ): boolean { + return this.getTypes(includeTeraType, forDefend, ignoreOverride).some( + t => t === type, + ); } /** * Gets the non-passive ability of the pokemon. This accounts for fusions and ability changing effects. - * This should rarely be called, most of the time {@link hasAbility} or {@link hasAbilityWithAttr} are better used as + * This should rarely be called, most of the time {@linkcode hasAbility} or {@linkcode hasAbilityWithAttr} are better used as * those check both the passive and non-passive abilities and account for ability suppression. - * @see {@link hasAbility} {@link hasAbilityWithAttr} Intended ways to check abilities in most cases - * @param {boolean} ignoreOverride If true, ignore ability changing effects - * @returns {Ability} The non-passive ability of the pokemon + * @see {@linkcode hasAbility} {@linkcode hasAbilityWithAttr} Intended ways to check abilities in most cases + * @param ignoreOverride - If `true`, ignore ability changing effects; Default: `false` + * @returns The non-passive {@linkcode Ability} of the pokemon */ - getAbility(ignoreOverride?: boolean): Ability { + public getAbility(ignoreOverride = false): Ability { if (!ignoreOverride && this.summonData?.ability) { return allAbilities[this.summonData.ability]; } @@ -1289,16 +1998,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return allAbilities[Overrides.OPP_ABILITY_OVERRIDE]; } if (this.isFusion()) { - if (!isNullOrUndefined(this.fusionCustomPokemonData?.ability) && this.fusionCustomPokemonData.ability !== -1) { + if ( + !isNullOrUndefined(this.fusionCustomPokemonData?.ability) && + this.fusionCustomPokemonData.ability !== -1 + ) { return allAbilities[this.fusionCustomPokemonData.ability]; - } else { - return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)]; } + return allAbilities[ + this.getFusionSpeciesForm(ignoreOverride).getAbility( + this.fusionAbilityIndex, + ) + ]; } - if (!isNullOrUndefined(this.customPokemonData.ability) && this.customPokemonData.ability !== -1) { + if ( + !isNullOrUndefined(this.customPokemonData.ability) && + this.customPokemonData.ability !== -1 + ) { return allAbilities[this.customPokemonData.ability]; } - let abilityId = this.getSpeciesForm(ignoreOverride).getAbility(this.abilityIndex); + let abilityId = this.getSpeciesForm(ignoreOverride).getAbility( + this.abilityIndex, + ); if (abilityId === Abilities.NONE) { abilityId = this.species.ability1; } @@ -1307,43 +2027,48 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Gets the passive ability of the pokemon. This should rarely be called, most of the time - * {@link hasAbility} or {@link hasAbilityWithAttr} are better used as those check both the passive and + * {@linkcode hasAbility} or {@linkcode hasAbilityWithAttr} are better used as those check both the passive and * non-passive abilities and account for ability suppression. - * @see {@link hasAbility} {@link hasAbilityWithAttr} Intended ways to check abilities in most cases - * @returns {Ability} The passive ability of the pokemon + * @see {@linkcode hasAbility} {@linkcode hasAbilityWithAttr} Intended ways to check abilities in most cases + * @returns The passive {@linkcode Ability} of the pokemon */ - getPassiveAbility(): Ability { + public getPassiveAbility(): Ability { if (Overrides.PASSIVE_ABILITY_OVERRIDE && this.isPlayer()) { return allAbilities[Overrides.PASSIVE_ABILITY_OVERRIDE]; } if (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE && !this.isPlayer()) { return allAbilities[Overrides.OPP_PASSIVE_ABILITY_OVERRIDE]; } - if (!isNullOrUndefined(this.customPokemonData.passive) && this.customPokemonData.passive !== -1) { + if ( + !isNullOrUndefined(this.customPokemonData.passive) && + this.customPokemonData.passive !== -1 + ) { return allAbilities[this.customPokemonData.passive]; } - let starterSpeciesId = this.species.speciesId; - while (pokemonPrevolutions.hasOwnProperty(starterSpeciesId)) { - starterSpeciesId = pokemonPrevolutions[starterSpeciesId]; - } - return allAbilities[starterPassiveAbilities[starterSpeciesId]]; + return allAbilities[this.species.getPassiveAbility(this.formIndex)]; } /** * Gets a list of all instances of a given ability attribute among abilities this pokemon has. * Accounts for all the various effects which can affect whether an ability will be present or * in effect, and both passive and non-passive. - * @param attrType {@linkcode AbAttr} The ability attribute to check for. - * @param canApply {@linkcode Boolean} If false, it doesn't check whether the ability is currently active - * @param ignoreOverride {@linkcode Boolean} If true, it ignores ability changing effects - * @returns A list of all the ability attributes on this ability. + * @param attrType - {@linkcode AbAttr} The ability attribute to check for. + * @param canApply - If `false`, it doesn't check whether the ability is currently active; Default `true` + * @param ignoreOverride - If `true`, it ignores ability changing effects; Default `false` + * @returns An array of all the ability attributes on this ability. */ - getAbilityAttrs(attrType: { new(...args: any[]): T }, canApply: boolean = true, ignoreOverride?: boolean): T[] { + public getAbilityAttrs( + attrType: { new (...args: any[]): T }, + canApply = true, + ignoreOverride = false, + ): T[] { const abilityAttrs: T[] = []; if (!canApply || this.canApplyAbility()) { - abilityAttrs.push(...this.getAbility(ignoreOverride).getAttrs(attrType)); + abilityAttrs.push( + ...this.getAbility(ignoreOverride).getAttrs(attrType), + ); } if (!canApply || this.canApplyAbility(true)) { @@ -1353,27 +2078,65 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return abilityAttrs; } + /** + * Sets the {@linkcode Pokemon}'s ability and activates it if it normally activates on summon + * + * Also clears primal weather if it is from the ability being changed + * @param ability New Ability + */ + public setTempAbility(ability: Ability, passive = false): void { + applyOnLoseAbAttrs(this, passive); + if (passive) { + this.summonData.passiveAbility = ability.id; + } else { + this.summonData.ability = ability.id; + } + applyOnGainAbAttrs(this, passive); + } + + /** + * Suppresses an ability and calls its onlose attributes + */ + public suppressAbility() { + [true, false].forEach(passive => applyOnLoseAbAttrs(this, passive)); + this.summonData.abilitySuppressed = true; + } + /** * Checks if a pokemon has a passive either from: * - bought with starter candy * - set by override * - is a boss pokemon - * @returns whether or not a pokemon should have a passive + * @returns `true` if the Pokemon has a passive */ - hasPassive(): boolean { + public hasPassive(): boolean { // returns override if valid for current case - if ((Overrides.PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && this.isPlayer()) || - (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && !this.isPlayer())) { + if ( + (Overrides.HAS_PASSIVE_ABILITY_OVERRIDE === false && this.isPlayer()) || + (Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE === false && !this.isPlayer()) + ) { + return false; + } + if ( + ((Overrides.PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE || + Overrides.HAS_PASSIVE_ABILITY_OVERRIDE) && + this.isPlayer()) || + ((Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE || + Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE) && + !this.isPlayer()) + ) { return true; } // Classic Final boss and Endless Minor/Major bosses do not have passive - const { currentBattle, gameMode } = this.scene; + const { currentBattle, gameMode } = globalScene; const waveIndex = currentBattle?.waveIndex; - if (this instanceof EnemyPokemon && + if ( + this instanceof EnemyPokemon && (currentBattle?.battleSpec === BattleSpec.FINAL_BOSS || - gameMode.isEndlessMinorBoss(waveIndex) || - gameMode.isEndlessMajorBoss(waveIndex))) { + gameMode.isEndlessMinorBoss(waveIndex) || + gameMode.isEndlessMajorBoss(waveIndex)) + ) { return false; } @@ -1382,41 +2145,63 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Checks whether an ability of a pokemon can be currently applied. This should rarely be - * directly called, as {@link hasAbility} and {@link hasAbilityWithAttr} already call this. - * @see {@link hasAbility} {@link hasAbilityWithAttr} Intended ways to check abilities in most cases - * @param {boolean} passive If true, check if passive can be applied instead of non-passive - * @returns {Ability} The passive ability of the pokemon + * directly called, as {@linkcode hasAbility} and {@linkcode hasAbilityWithAttr} already call this. + * @see {@linkcode hasAbility} {@linkcode hasAbilityWithAttr} Intended ways to check abilities in most cases + * @param passive If true, check if passive can be applied instead of non-passive + * @returns `true` if the ability can be applied */ - canApplyAbility(passive: boolean = false): boolean { + public canApplyAbility(passive = false): boolean { if (passive && !this.hasPassive()) { return false; } - const ability = (!passive ? this.getAbility() : this.getPassiveAbility()); + const ability = !passive ? this.getAbility() : this.getPassiveAbility(); if (this.isFusion() && ability.hasAttr(NoFusionAbilityAbAttr)) { return false; } - const arena = this.scene?.arena; - if (arena.ignoreAbilities && arena.ignoringEffectSource !== this.getBattlerIndex() && ability.isIgnorable) { + const arena = globalScene?.arena; + if ( + arena.ignoreAbilities && + arena.ignoringEffectSource !== this.getBattlerIndex() && + ability.isIgnorable + ) { return false; } - if (this.summonData?.abilitySuppressed && !ability.hasAttr(UnsuppressableAbilityAbAttr)) { + if ( + this.summonData?.abilitySuppressed && + !ability.hasAttr(UnsuppressableAbilityAbAttr) + ) { return false; } - if (this.isOnField() && !ability.hasAttr(SuppressFieldAbilitiesAbAttr)) { - const suppressed = new Utils.BooleanHolder(false); - this.scene.getField(true).filter(p => p !== this).map(p => { - if (p.getAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility()) { - p.getAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, false, false, suppressed, [ ability ])); - } - if (p.getPassiveAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility(true)) { - p.getPassiveAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, true, false, suppressed, [ ability ])); - } - }); - if (suppressed.value) { + const suppressAbilitiesTag = arena.getTag( + ArenaTagType.NEUTRALIZING_GAS, + ) as SuppressAbilitiesTag; + if ( + this.isOnField() && + suppressAbilitiesTag && + !suppressAbilitiesTag.isBeingRemoved() + ) { + const thisAbilitySuppressing = ability.hasAttr( + PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, + ); + const hasSuppressingAbility = this.hasAbilityWithAttr( + PreLeaveFieldRemoveSuppressAbilitiesSourceAbAttr, + false, + ); + // Neutralizing gas is up - suppress abilities unless they are unsuppressable or this pokemon is responsible for the gas + // (Balance decided that the other ability of a neutralizing gas pokemon should not be neutralized) + // If the ability itself is neutralizing gas, don't suppress it (handled through arena tag) + const unsuppressable = + ability.hasAttr(UnsuppressableAbilityAbAttr) || + thisAbilitySuppressing || + (hasSuppressingAbility && !suppressAbilitiesTag.shouldApplyToSelf()); + if (!unsuppressable) { return false; } } - return (!!this.hp || ability.isBypassFaint) && !ability.conditions.find(condition => !condition(this)); + return ( + (this.hp > 0 || ability.isBypassFaint) && + !ability.conditions.find(condition => !condition(this)) + ); } /** @@ -1428,11 +2213,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param {boolean} ignoreOverride If true, it ignores ability changing effects * @returns {boolean} Whether the ability is present and active */ - hasAbility(ability: Abilities, canApply: boolean = true, ignoreOverride?: boolean): boolean { - if (this.getAbility(ignoreOverride).id === ability && (!canApply || this.canApplyAbility())) { + public hasAbility( + ability: Abilities, + canApply = true, + ignoreOverride?: boolean, + ): boolean { + if ( + this.getAbility(ignoreOverride).id === ability && + (!canApply || this.canApplyAbility()) + ) { return true; } - if (this.getPassiveAbility().id === ability && this.hasPassive() && (!canApply || this.canApplyAbility(true))) { + if ( + this.getPassiveAbility().id === ability && + this.hasPassive() && + (!canApply || this.canApplyAbility(true)) + ) { return true; } return false; @@ -1448,11 +2244,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param {boolean} ignoreOverride If true, it ignores ability changing effects * @returns {boolean} Whether an ability with that attribute is present and active */ - hasAbilityWithAttr(attrType: Constructor, canApply: boolean = true, ignoreOverride?: boolean): boolean { - if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).hasAttr(attrType)) { + public hasAbilityWithAttr( + attrType: Constructor, + canApply = true, + ignoreOverride?: boolean, + ): boolean { + if ( + (!canApply || this.canApplyAbility()) && + this.getAbility(ignoreOverride).hasAttr(attrType) + ) { return true; } - if (this.hasPassive() && (!canApply || this.canApplyAbility(true)) && this.getPassiveAbility().hasAttr(attrType)) { + if ( + this.hasPassive() && + (!canApply || this.canApplyAbility(true)) && + this.getPassiveAbility().hasAttr(attrType) + ) { return true; } return false; @@ -1463,7 +2270,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * and then multiplicative modifiers happening after (Heavy Metal and Light Metal) * @returns the kg of the Pokemon (minimum of 0.1) */ - getWeight(): number { + public getWeight(): number { const autotomizedTag = this.getTag(AutotomizedTag); let weightRemoved = 0; if (!Utils.isNullOrUndefined(autotomizedTag)) { @@ -1478,76 +2285,132 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * Gets the tera-formed type of the pokemon, or UNKNOWN if not present - * @returns the {@linkcode Type} + * @returns the pokemon's current tera {@linkcode PokemonType} */ - getTeraType(): Type { - // this.scene can be undefined for a fainted mon in doubles - if (this.scene !== undefined) { - const teraModifier = this.scene.findModifier(m => m instanceof TerastallizeModifier - && m.pokemonId === this.id && !!m.getBattlesLeft(), this.isPlayer()) as TerastallizeModifier; - // return teraType - if (teraModifier) { - return teraModifier.teraType; + getTeraType(): PokemonType { + if (this.hasSpecies(Species.TERAPAGOS)) { + return PokemonType.STELLAR; + } + if (this.hasSpecies(Species.OGERPON)) { + const ogerponForm = + this.species.speciesId === Species.OGERPON + ? this.formIndex + : this.fusionFormIndex; + switch (ogerponForm) { + case 0: + case 4: + return PokemonType.GRASS; + case 1: + case 5: + return PokemonType.WATER; + case 2: + case 6: + return PokemonType.FIRE; + case 3: + case 7: + return PokemonType.ROCK; } } - // if scene is undefined, or if teraModifier is considered false, then return unknown type - return Type.UNKNOWN; + if (this.hasSpecies(Species.SHEDINJA)) { + return PokemonType.BUG; + } + return this.teraType; } - isTerastallized(): boolean { - return this.getTeraType() !== Type.UNKNOWN; - } - - isGrounded(): boolean { - return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.FLOATING) && !this.getTag(SemiInvulnerableTag)); + public isGrounded(): boolean { + return ( + !!this.getTag(GroundedTag) || + (!this.isOfType(PokemonType.FLYING, true, true) && + !this.hasAbility(Abilities.LEVITATE) && + !this.getTag(BattlerTagType.FLOATING) && + !this.getTag(SemiInvulnerableTag)) + ); } /** * Determines whether this Pokemon is prevented from running or switching due * to effects from moves and/or abilities. - * @param trappedAbMessages `string[]` If defined, ability trigger messages + * @param trappedAbMessages - If defined, ability trigger messages * (e.g. from Shadow Tag) are forwarded through this array. - * @param simulated `boolean` if `true`, applies abilities via simulated calls. - * @returns + * @param simulated - If `true`, applies abilities via simulated calls. + * @returns `true` if the pokemon is trapped */ - isTrapped(trappedAbMessages: string[] = [], simulated: boolean = true): boolean { - if (this.isOfType(Type.GHOST)) { + public isTrapped( + trappedAbMessages: string[] = [], + simulated = true, + ): boolean { + const commandedTag = this.getTag(BattlerTagType.COMMANDED); + if (commandedTag?.getSourcePokemon()?.isActive(true)) { + return true; + } + + if (this.isOfType(PokemonType.GHOST)) { return false; } const trappedByAbility = new Utils.BooleanHolder(false); - const opposingField = this.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField(); - - opposingField.forEach(opponent => - applyCheckTrappedAbAttrs(CheckTrappedAbAttr, opponent, trappedByAbility, this, trappedAbMessages, simulated) + /** + * 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() + ? globalScene.getEnemyField() + : globalScene.getPlayerField(); + const opposingField = opposingFieldUnfiltered.filter( + enemyPkm => enemyPkm.switchOutStatus === false, ); - return (trappedByAbility.value || !!this.getTag(TrappedTag)); + for (const opponent of opposingField) { + applyCheckTrappedAbAttrs( + CheckTrappedAbAttr, + opponent, + trappedByAbility, + this, + trappedAbMessages, + simulated, + ); + } + + const side = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + return ( + trappedByAbility.value || + !!this.getTag(TrappedTag) || + !!globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, side) + ); } /** * Calculates the type of a move when used by this Pokemon after * type-changing move and ability attributes have applied. - * @param move {@linkcode Move} The move being used. - * @param simulated If `true`, prevents showing abilities applied in this calculation. - * @returns the {@linkcode Type} of the move after attributes are applied + * @param move - {@linkcode Move} The move being used. + * @param simulated - If `true`, prevents showing abilities applied in this calculation. + * @returns The {@linkcode PokemonType} of the move after attributes are applied */ - getMoveType(move: Move, simulated: boolean = true): Type { + public getMoveType(move: Move, simulated = true): PokemonType { const moveTypeHolder = new Utils.NumberHolder(move.type); applyMoveAttrs(VariableMoveTypeAttr, this, null, move, moveTypeHolder); - applyPreAttackAbAttrs(MoveTypeChangeAbAttr, this, null, move, simulated, moveTypeHolder); + applyPreAttackAbAttrs( + MoveTypeChangeAbAttr, + this, + null, + move, + simulated, + moveTypeHolder, + ); - this.scene.arena.applyTags(ArenaTagType.ION_DELUGE, simulated, moveTypeHolder); + globalScene.arena.applyTags( + ArenaTagType.ION_DELUGE, + simulated, + moveTypeHolder, + ); if (this.getTag(BattlerTagType.ELECTRIFIED)) { - moveTypeHolder.value = Type.ELECTRIC; + moveTypeHolder.value = PokemonType.ELECTRIC; } - return moveTypeHolder.value as Type; + return moveTypeHolder.value as PokemonType; } - /** * Calculates the effectiveness of a move against the Pokémon. * This includes modifiers from move and ability attributes. @@ -1559,7 +2422,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * Currently only used by {@linkcode Pokemon.apply} to determine whether a "No effect" message should be shown. * @returns The type damage multiplier, indicating the effectiveness of the move */ - getMoveEffectiveness(source: Pokemon, move: Move, ignoreAbility: boolean = false, simulated: boolean = true, cancelled?: Utils.BooleanHolder): TypeDamageMultiplier { + getMoveEffectiveness( + source: Pokemon, + move: Move, + ignoreAbility = false, + simulated = true, + cancelled?: Utils.BooleanHolder, + ): TypeDamageMultiplier { if (!Utils.isNullOrUndefined(this.turnData?.moveEffectiveness)) { return this.turnData?.moveEffectiveness; } @@ -1569,36 +2438,84 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const moveType = source.getMoveType(move); - const typeMultiplier = new Utils.NumberHolder((move.category !== MoveCategory.STATUS || move.hasAttr(RespectAttackTypeImmunityAttr)) - ? this.getAttackTypeEffectiveness(moveType, source, false, simulated) - : 1); + const typeMultiplier = new Utils.NumberHolder( + move.category !== MoveCategory.STATUS || + move.hasAttr(RespectAttackTypeImmunityAttr) + ? this.getAttackTypeEffectiveness( + moveType, + source, + false, + simulated, + move, + ) + : 1, + ); - applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (this.getTypes(true, true).find(t => move.isTypeImmune(source, this, t))) { + applyMoveAttrs( + VariableMoveTypeMultiplierAttr, + source, + this, + move, + typeMultiplier, + ); + if ( + this.getTypes(true, true).find(t => move.isTypeImmune(source, this, t)) + ) { typeMultiplier.value = 0; } - if (this.getTag(TarShotTag) && (this.getMoveType(move) === Type.FIRE)) { + if (this.getTag(TarShotTag) && this.getMoveType(move) === PokemonType.FIRE) { typeMultiplier.value *= 2; } const cancelledHolder = cancelled ?? new Utils.BooleanHolder(false); if (!ignoreAbility) { - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + applyPreDefendAbAttrs( + TypeImmunityAbAttr, + this, + source, + move, + cancelledHolder, + simulated, + typeMultiplier, + ); if (!cancelledHolder.value) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + applyPreDefendAbAttrs( + MoveImmunityAbAttr, + this, + source, + move, + cancelledHolder, + simulated, + typeMultiplier, + ); } if (!cancelledHolder.value) { - const defendingSidePlayField = this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField(); - defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelledHolder)); + const defendingSidePlayField = this.isPlayer() + ? globalScene.getPlayerField() + : globalScene.getEnemyField(); + defendingSidePlayField.forEach(p => + applyPreDefendAbAttrs( + FieldPriorityMoveImmunityAbAttr, + p, + source, + move, + cancelledHolder, + ), + ); } } - const immuneTags = this.findTags(tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType); + const immuneTags = this.findTags( + tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType, + ); for (const tag of immuneTags) { - if (move && !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType)) { + if ( + move && + !move.getAttrs(HitsTagAttr).some(attr => attr.tagType === tag.tagType) + ) { typeMultiplier.value = 0; break; } @@ -1606,71 +2523,136 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Apply Tera Shell's effect to attacks after all immunities are accounted for if (!ignoreAbility && move.category !== MoveCategory.STATUS) { - applyPreDefendAbAttrs(FullHpResistTypeAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); + applyPreDefendAbAttrs( + FullHpResistTypeAbAttr, + this, + source, + move, + cancelledHolder, + simulated, + typeMultiplier, + ); } - if (move.category === MoveCategory.STATUS && move.hitsSubstitute(source, this)) { + if ( + move.category === MoveCategory.STATUS && + move.hitsSubstitute(source, this) + ) { typeMultiplier.value = 0; } - return (!cancelledHolder.value ? typeMultiplier.value : 0) as TypeDamageMultiplier; + return ( + !cancelledHolder.value ? typeMultiplier.value : 0 + ) as TypeDamageMultiplier; } /** * Calculates the move's type effectiveness multiplier based on the target's type/s. - * @param moveType {@linkcode Type} the type of the move being used + * @param moveType {@linkcode PokemonType} the type of the move being used * @param source {@linkcode Pokemon} the Pokemon using the move * @param ignoreStrongWinds whether or not this ignores strong winds (anticipation, forewarn, stealth rocks) * @param simulated tag to only apply the strong winds effect message when the move is used + * @param move (optional) the move whose type effectiveness is to be checked. Used for applying {@linkcode VariableMoveTypeChartAttr} * @returns a multiplier for the type effectiveness */ - getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true): TypeDamageMultiplier { - if (moveType === Type.STELLAR) { - return this.isTerastallized() ? 2 : 1; + getAttackTypeEffectiveness( + moveType: PokemonType, + source?: Pokemon, + ignoreStrongWinds = false, + simulated = true, + move?: Move, + ): TypeDamageMultiplier { + if (moveType === PokemonType.STELLAR) { + return this.isTerastallized ? 2 : 1; } const types = this.getTypes(true, true); - const arena = this.scene.arena; + const arena = globalScene.arena; // Handle flying v ground type immunity without removing flying type so effective types are still effective // Related to https://github.com/pagefaultgames/pokerogue/issues/524 - if (moveType === Type.GROUND && (this.isGrounded() || arena.hasTag(ArenaTagType.GRAVITY))) { - const flyingIndex = types.indexOf(Type.FLYING); + if ( + moveType === PokemonType.GROUND && + (this.isGrounded() || arena.hasTag(ArenaTagType.GRAVITY)) + ) { + const flyingIndex = types.indexOf(PokemonType.FLYING); if (flyingIndex > -1) { types.splice(flyingIndex, 1); } } - let multiplier = types.map(defType => { - const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType)); - applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier); - if (source) { - const ignoreImmunity = new Utils.BooleanHolder(false); - if (source.isActive(true) && source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr)) { - applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, simulated, moveType, defType); + let multiplier = types + .map(defType => { + const multiplier = new Utils.NumberHolder( + getTypeDamageMultiplier(moveType, defType), + ); + applyChallenges( + globalScene.gameMode, + ChallengeType.TYPE_EFFECTIVENESS, + multiplier, + ); + if (move) { + applyMoveAttrs( + VariableMoveTypeChartAttr, + null, + this, + move, + multiplier, + defType, + ); } - if (ignoreImmunity.value) { - if (multiplier.value === 0) { - return 1; + if (source) { + const ignoreImmunity = new Utils.BooleanHolder(false); + if ( + source.isActive(true) && + source.hasAbilityWithAttr(IgnoreTypeImmunityAbAttr) + ) { + applyAbAttrs( + IgnoreTypeImmunityAbAttr, + source, + ignoreImmunity, + simulated, + moveType, + defType, + ); + } + if (ignoreImmunity.value) { + if (multiplier.value === 0) { + return 1; + } + } + + const exposedTags = this.findTags( + tag => tag instanceof ExposedTag, + ) as ExposedTag[]; + if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) { + if (multiplier.value === 0) { + return 1; + } } } + return multiplier.value; + }) + .reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; - const exposedTags = this.findTags(tag => tag instanceof ExposedTag) as ExposedTag[]; - if (exposedTags.some(t => t.ignoreImmunity(defType, moveType))) { - if (multiplier.value === 0) { - return 1; - } - } - } - return multiplier.value; - }).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; - - const typeMultiplierAgainstFlying = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, Type.FLYING)); - applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, typeMultiplierAgainstFlying); + const typeMultiplierAgainstFlying = new Utils.NumberHolder( + getTypeDamageMultiplier(moveType, PokemonType.FLYING), + ); + applyChallenges( + globalScene.gameMode, + ChallengeType.TYPE_EFFECTIVENESS, + typeMultiplierAgainstFlying, + ); // Handle strong winds lowering effectiveness of types super effective against pure flying - if (!ignoreStrongWinds && arena.weather?.weatherType === WeatherType.STRONG_WINDS && !arena.weather.isEffectSuppressed(this.scene) && this.isOfType(Type.FLYING) && typeMultiplierAgainstFlying.value === 2) { + if ( + !ignoreStrongWinds && + arena.weather?.weatherType === WeatherType.STRONG_WINDS && + !arena.weather.isEffectSuppressed() && + this.isOfType(PokemonType.FLYING) && + typeMultiplierAgainstFlying.value === 2 + ) { multiplier /= 2; if (!simulated) { - this.scene.queueMessage(i18next.t("weather:strongWindsEffectMessage")); + globalScene.queueMessage(i18next.t("weather:strongWindsEffectMessage")); } } return multiplier as TypeDamageMultiplier; @@ -1686,22 +2668,35 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const types = this.getTypes(true); const enemyTypes = opponent.getTypes(true, true); /** Is this Pokemon faster than the opponent? */ - const outspeed = (this.isActive(true) ? this.getEffectiveStat(Stat.SPD, opponent) : this.getStat(Stat.SPD, false)) >= opponent.getEffectiveStat(Stat.SPD, this); + const outspeed = + (this.isActive(true) + ? this.getEffectiveStat(Stat.SPD, opponent) + : this.getStat(Stat.SPD, false)) >= + opponent.getEffectiveStat(Stat.SPD, this); /** * Based on how effective this Pokemon's types are offensively against the opponent's types. * This score is increased by 25 percent if this Pokemon is faster than the opponent. */ - let atkScore = opponent.getAttackTypeEffectiveness(types[0], this) * (outspeed ? 1.25 : 1); + let atkScore = + opponent.getAttackTypeEffectiveness(types[0], this) * + (outspeed ? 1.25 : 1); /** * Based on how effectively this Pokemon defends against the opponent's types. * This score cannot be higher than 4. */ - let defScore = 1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[0], opponent), 0.25); + let defScore = + 1 / + Math.max(this.getAttackTypeEffectiveness(enemyTypes[0], opponent), 0.25); if (types.length > 1) { atkScore *= opponent.getAttackTypeEffectiveness(types[1], this); } if (enemyTypes.length > 1) { - defScore *= (1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1], opponent), 0.25)); + defScore *= + 1 / + Math.max( + this.getAttackTypeEffectiveness(enemyTypes[1], opponent), + 0.25, + ); } /** * Based on this Pokemon's HP ratio compared to that of the opponent. @@ -1719,19 +2714,41 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (pokemonEvolutions.hasOwnProperty(this.species.speciesId)) { const evolutions = pokemonEvolutions[this.species.speciesId]; for (const e of evolutions) { - if (!e.item && this.level >= e.level && (isNullOrUndefined(e.preFormKey) || this.getFormKey() === e.preFormKey)) { - if (e.condition === null || (e.condition as SpeciesEvolutionCondition).predicate(this)) { + if ( + !e.item && + this.level >= e.level && + (isNullOrUndefined(e.preFormKey) || + this.getFormKey() === e.preFormKey) + ) { + if ( + e.condition === null || + (e.condition as SpeciesEvolutionCondition).predicate(this) + ) { return e; } } } } - if (this.isFusion() && this.fusionSpecies && pokemonEvolutions.hasOwnProperty(this.fusionSpecies.speciesId)) { - const fusionEvolutions = pokemonEvolutions[this.fusionSpecies.speciesId].map(e => new FusionSpeciesFormEvolution(this.species.speciesId, e)); + if ( + this.isFusion() && + this.fusionSpecies && + pokemonEvolutions.hasOwnProperty(this.fusionSpecies.speciesId) + ) { + const fusionEvolutions = pokemonEvolutions[ + this.fusionSpecies.speciesId + ].map(e => new FusionSpeciesFormEvolution(this.species.speciesId, e)); for (const fe of fusionEvolutions) { - if (!fe.item && this.level >= fe.level && (isNullOrUndefined(fe.preFormKey) || this.getFusionFormKey() === fe.preFormKey)) { - if (fe.condition === null || (fe.condition as SpeciesEvolutionCondition).predicate(this)) { + if ( + !fe.item && + this.level >= fe.level && + (isNullOrUndefined(fe.preFormKey) || + this.getFusionFormKey() === fe.preFormKey) + ) { + if ( + fe.condition === null || + (fe.condition as SpeciesEvolutionCondition).predicate(this) + ) { return fe; } } @@ -1743,50 +2760,131 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Gets all level up moves in a given range for a particular pokemon. - * @param {integer} startingLevel Don't include moves below this level + * @param {number} startingLevel Don't include moves below this level * @param {boolean} includeEvolutionMoves Whether to include evolution moves * @param {boolean} simulateEvolutionChain Whether to include moves from prior evolutions * @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?: number, + includeEvolutionMoves = false, + simulateEvolutionChain = false, + includeRelearnerMoves = 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); - + levelMoves.sort((lma: [number, number], lmb: [number, number]) => + lma[0] > lmb[0] ? 1 : lma[0] < lmb[0] ? -1 : 0, + ); /** * Filter out moves not within the correct level range(s) @@ -1796,10 +2894,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { levelMoves = levelMoves.filter(lm => { const level = lm[0]; const isRelearner = level < startingLevel; - const allowedEvolutionMove = (level === 0) && includeEvolutionMoves; + const allowedEvolutionMove = level === 0 && includeEvolutionMoves; - return !(level > this.level) - && (includeRelearnerMoves || !isRelearner || allowedEvolutionMove); + return ( + !(level > this.level) && + (includeRelearnerMoves || !isRelearner || allowedEvolutionMove) + ); }); /** @@ -1822,8 +2922,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param levelMoves the input array to search for non-duplicates from * @param ret the output array to be pushed into. */ - private getUniqueMoves(levelMoves: LevelMoves, ret: LevelMoves ): void { - const uniqueMoves : Moves[] = []; + private getUniqueMoves(levelMoves: LevelMoves, ret: LevelMoves): void { + const uniqueMoves: Moves[] = []; for (const lm of levelMoves) { if (!uniqueMoves.find(m => m === lm[1])) { uniqueMoves.push(lm[1]); @@ -1832,17 +2932,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - /** * Get a list of all egg moves * * @returns list of egg moves */ - getEggMoves() : Moves[] | undefined { + getEggMoves(): Moves[] | undefined { return speciesEggMoves[this.getSpeciesForm().getRootSpeciesId()]; } - setMove(moveIndex: integer, moveId: Moves): void { + setMove(moveIndex: number, moveId: Moves): void { const move = moveId ? new PokemonMove(moveId) : null; this.moveset[moveIndex] = move; if (this.summonData?.moveset) { @@ -1861,25 +2960,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @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) * @returns true if the Pokemon has been set as a shiny, false otherwise */ - trySetShiny(thresholdOverride?: integer): boolean { + trySetShiny(thresholdOverride?: number): boolean { // Shiny Pokemon should not spawn in the end biome in endless - if (this.scene.gameMode.isEndless && this.scene.arena.biomeType === Biome.END) { + if ( + globalScene.gameMode.isEndless && + globalScene.arena.biomeType === Biome.END + ) { return false; } - const rand1 = (this.id & 0xFFFF0000) >>> 16; - const rand2 = (this.id & 0x0000FFFF); + const rand1 = (this.id & 0xffff0000) >>> 16; + const rand2 = this.id & 0x0000ffff; - const E = this.scene.gameData.trainerId ^ this.scene.gameData.secretId; + const E = globalScene.gameData.trainerId ^ globalScene.gameData.secretId; const F = rand1 ^ rand2; - const shinyThreshold = new Utils.IntegerHolder(BASE_SHINY_CHANCE); + const shinyThreshold = new Utils.NumberHolder(BASE_SHINY_CHANCE); if (thresholdOverride === undefined) { - if (this.scene.eventManager.isEventActive()) { - shinyThreshold.value *= this.scene.eventManager.getShinyMultiplier(); + if (globalScene.eventManager.isEventActive()) { + shinyThreshold.value *= globalScene.eventManager.getShinyMultiplier(); } if (!this.hasTrainer()) { - this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); + globalScene.applyModifiers( + ShinyRateBoosterModifier, + true, + shinyThreshold, + ); } } else { shinyThreshold.value = thresholdOverride; @@ -1897,23 +3003,31 @@ 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) + * 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) * @param applyModifiersToOverride If {@linkcode thresholdOverride} is set and this is true, will apply Shiny Charm and event modifiers to {@linkcode thresholdOverride} - * @returns true if the Pokemon has been set as a shiny, false otherwise + * @returns `true` if the Pokemon has been set as a shiny, `false` otherwise */ - trySetShinySeed(thresholdOverride?: integer, applyModifiersToOverride?: boolean): boolean { - const shinyThreshold = new Utils.IntegerHolder(BASE_SHINY_CHANCE); + public trySetShinySeed( + thresholdOverride?: number, + applyModifiersToOverride?: boolean, + ): boolean { + const shinyThreshold = new Utils.NumberHolder(BASE_SHINY_CHANCE); if (thresholdOverride === undefined || applyModifiersToOverride) { if (thresholdOverride !== undefined && applyModifiersToOverride) { shinyThreshold.value = thresholdOverride; } - if (this.scene.eventManager.isEventActive()) { - shinyThreshold.value *= this.scene.eventManager.getShinyMultiplier(); + if (globalScene.eventManager.isEventActive()) { + shinyThreshold.value *= globalScene.eventManager.getShinyMultiplier(); } if (!this.hasTrainer()) { - this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); + globalScene.applyModifiers( + ShinyRateBoosterModifier, + true, + shinyThreshold, + ); } } else { shinyThreshold.value = thresholdOverride; @@ -1922,6 +3036,9 @@ 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(); } @@ -1929,13 +3046,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * Generates a variant - * Has a 10% of returning 2 (epic variant) - * And a 30% of returning 1 (rare variant) - * Returns 0 (basic shiny) if there is no variant or 60% of the time otherwise - * @returns the shiny variant + * Generates a shiny variant + * @returns `0-2`, with the following probabilities: + * - Has a 10% chance of returning `2` (epic variant) + * - Has a 30% chance of returning `1` (rare variant) + * - Has a 60% chance of returning `0` (basic shiny) */ - generateVariant(): Variant { + protected generateShinyVariant(): Variant { const formIndex: number = this.formIndex; let variantDataIndex: string | number = this.species.speciesId; if (this.species.forms.length > 0) { @@ -1945,52 +3062,131 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } // Checks if there is no variant data for both the index or index with form - if (!this.shiny || (!variantData.hasOwnProperty(variantDataIndex) && !variantData.hasOwnProperty(this.species.speciesId))) { + if ( + !this.shiny || + (!variantData.hasOwnProperty(variantDataIndex) && + !variantData.hasOwnProperty(this.species.speciesId)) + ) { return 0; } const rand = new Utils.NumberHolder(0); - this.scene.executeWithSeedOffset(() => { - rand.value = Utils.randSeedInt(10); - }, this.id, this.scene.waveSeed); + globalScene.executeWithSeedOffset( + () => { + rand.value = Utils.randSeedInt(10); + }, + this.id, + globalScene.waveSeed, + ); if (rand.value >= SHINY_VARIANT_CHANCE) { - return 0; // 6/10 - } else if (rand.value >= SHINY_EPIC_CHANCE) { - return 1; // 3/10 - } else { - return 2; // 1/10 + return 0; // 6/10 } + if (rand.value >= SHINY_EPIC_CHANCE) { + return 1; // 3/10 + } + return 2; // 1/10 } - generateFusionSpecies(forStarter?: boolean): void { - const hiddenAbilityChance = new Utils.IntegerHolder(BASE_HIDDEN_ABILITY_CHANCE); + /** + * Function that tries to set a Pokemon to have its hidden ability based on seed, if it exists. + * For manual use only, usually to roll a Pokemon's hidden ability chance a second time. + * + * The base hidden ability odds are {@linkcode BASE_HIDDEN_ABILITY_CHANCE} / `65536` + * @param thresholdOverride number that is divided by `2^16` (`65536`) to get the HA chance, overrides {@linkcode haThreshold} if set (bypassing HA rate modifiers such as Ability Charm) + * @param applyModifiersToOverride If {@linkcode thresholdOverride} is set and this is true, will apply Ability Charm to {@linkcode thresholdOverride} + * @returns `true` if the Pokemon has been set to have its hidden ability, `false` otherwise + */ + public tryRerollHiddenAbilitySeed( + thresholdOverride?: number, + applyModifiersToOverride?: boolean, + ): boolean { + if (!this.species.abilityHidden) { + return false; + } + const haThreshold = new Utils.NumberHolder(BASE_HIDDEN_ABILITY_CHANCE); + if (thresholdOverride === undefined || applyModifiersToOverride) { + if (thresholdOverride !== undefined && applyModifiersToOverride) { + haThreshold.value = thresholdOverride; + } + if (!this.hasTrainer()) { + globalScene.applyModifiers( + HiddenAbilityRateBoosterModifier, + true, + haThreshold, + ); + } + } else { + haThreshold.value = thresholdOverride; + } + + if (randSeedInt(65536) < haThreshold.value) { + this.abilityIndex = 2; + } + + return this.abilityIndex === 2; + } + + public generateFusionSpecies(forStarter?: boolean): void { + const hiddenAbilityChance = new Utils.NumberHolder( + BASE_HIDDEN_ABILITY_CHANCE, + ); if (!this.hasTrainer()) { - this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + globalScene.applyModifiers( + HiddenAbilityRateBoosterModifier, + true, + hiddenAbilityChance, + ); } const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value); const randAbilityIndex = Utils.randSeedInt(2); - const filter = !forStarter ? this.species.getCompatibleFusionSpeciesFilter() - : species => { - return pokemonEvolutions.hasOwnProperty(species.speciesId) - && !pokemonPrevolutions.hasOwnProperty(species.speciesId) - && !species.pseudoLegendary - && !species.legendary - && !species.mythical - && !species.isTrainerForbidden() - && species.speciesId !== this.species.speciesId; - }; + const filter = !forStarter + ? this.species.getCompatibleFusionSpeciesFilter() + : (species: PokemonSpecies) => { + return ( + pokemonEvolutions.hasOwnProperty(species.speciesId) && + !pokemonPrevolutions.hasOwnProperty(species.speciesId) && + !species.subLegendary && + !species.legendary && + !species.mythical && + !species.isTrainerForbidden() && + species.speciesId !== this.species.speciesId && + species.speciesId !== Species.DITTO + ); + }; let fusionOverride: PokemonSpecies | undefined = undefined; - if (forStarter && this instanceof PlayerPokemon && Overrides.STARTER_FUSION_SPECIES_OVERRIDE) { - fusionOverride = getPokemonSpecies(Overrides.STARTER_FUSION_SPECIES_OVERRIDE); - } else if (this instanceof EnemyPokemon && Overrides.OPP_FUSION_SPECIES_OVERRIDE) { + if ( + forStarter && + this instanceof PlayerPokemon && + Overrides.STARTER_FUSION_SPECIES_OVERRIDE + ) { + fusionOverride = getPokemonSpecies( + Overrides.STARTER_FUSION_SPECIES_OVERRIDE, + ); + } else if ( + this instanceof EnemyPokemon && + Overrides.OPP_FUSION_SPECIES_OVERRIDE + ) { fusionOverride = getPokemonSpecies(Overrides.OPP_FUSION_SPECIES_OVERRIDE); } - this.fusionSpecies = fusionOverride ?? this.scene.randomSpecies(this.scene.currentBattle?.waveIndex || 0, this.level, false, filter, true); - this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? 2 : this.fusionSpecies.ability2 !== this.fusionSpecies.ability1 ? randAbilityIndex : 0); + this.fusionSpecies = + fusionOverride ?? + globalScene.randomSpecies( + globalScene.currentBattle?.waveIndex || 0, + this.level, + false, + filter, + true, + ); + this.fusionAbilityIndex = + this.fusionSpecies.abilityHidden && hasHiddenAbility + ? 2 + : this.fusionSpecies.ability2 !== this.fusionSpecies.ability1 + ? randAbilityIndex + : 0; this.fusionShiny = this.shiny; this.fusionVariant = this.variant; @@ -2005,13 +3201,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - this.fusionFormIndex = this.scene.getSpeciesFormIndex(this.fusionSpecies, this.fusionGender, this.getNature(), true); + this.fusionFormIndex = globalScene.getSpeciesFormIndex( + this.fusionSpecies, + this.fusionGender, + this.getNature(), + true, + ); this.fusionLuck = this.luck; this.generateName(); } - clearFusionSpecies(): void { + public clearFusionSpecies(): void { this.fusionSpecies = null; this.fusionFormIndex = 0; this.fusionAbilityIndex = 0; @@ -2025,12 +3226,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.calculateStats(); } - generateAndPopulateMoveset(): void { + /** Generates a semi-random moveset for a Pokemon */ + public generateAndPopulateMoveset(): void { this.moveset = []; let movePool: [Moves, number][] = []; const allLevelMoves = this.getLevelMoves(1, true, true); if (!allLevelMoves) { - console.log(this.species.speciesId, "ERROR"); + console.warn( + "Error encountered trying to generate moveset for:", + this.species.name, + ); return; } @@ -2040,113 +3245,213 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { break; } let weight = levelMove[0]; - if (weight === 0) { // Evo Moves + // Evolution Moves + if (weight === 0) { weight = 50; } - if (weight === 1 && allMoves[levelMove[1]].power >= 80) { // Assume level 1 moves with 80+ BP are "move reminder" moves and bump their weight + // Assume level 1 moves with 80+ BP are "move reminder" moves and bump their weight + if (weight === 1 && allMoves[levelMove[1]].power >= 80) { weight = 40; } - if (allMoves[levelMove[1]].name.endsWith(" (N)")) { - weight /= 100; - } // Unimplemented level up moves are possible to generate, but 1% of their normal chance. - if (!movePool.some(m => m[0] === levelMove[1])) { - movePool.push([ levelMove[1], weight ]); + if ( + !movePool.some(m => m[0] === levelMove[1]) && + !allMoves[levelMove[1]].name.endsWith(" (N)") + ) { + movePool.push([levelMove[1], weight]); } } if (this.hasTrainer()) { const tms = Object.keys(tmSpecies); for (const tm of tms) { - const moveId = parseInt(tm) as Moves; + const moveId = Number.parseInt(tm) as Moves; let compatible = false; for (const p of tmSpecies[tm]) { if (Array.isArray(p)) { - if (p[0] === this.species.speciesId || (this.fusionSpecies && p[0] === this.fusionSpecies.speciesId) && p.slice(1).indexOf(this.species.forms[this.formIndex]) > -1) { + if ( + p[0] === this.species.speciesId || + (this.fusionSpecies && + p[0] === this.fusionSpecies.speciesId && + p.slice(1).indexOf(this.species.forms[this.formIndex]) > -1) + ) { compatible = true; break; } - } else if (p === this.species.speciesId || (this.fusionSpecies && p === this.fusionSpecies.speciesId)) { + } else if ( + p === this.species.speciesId || + (this.fusionSpecies && p === this.fusionSpecies.speciesId) + ) { compatible = true; break; } } - if (compatible && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { + if ( + compatible && + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") + ) { if (tmPoolTiers[moveId] === ModifierTier.COMMON && this.level >= 15) { - movePool.push([ moveId, 4 ]); - } else if (tmPoolTiers[moveId] === ModifierTier.GREAT && this.level >= 30) { - movePool.push([ moveId, 8 ]); - } else if (tmPoolTiers[moveId] === ModifierTier.ULTRA && this.level >= 50) { - movePool.push([ moveId, 14 ]); + movePool.push([moveId, 4]); + } else if ( + tmPoolTiers[moveId] === ModifierTier.GREAT && + this.level >= 30 + ) { + movePool.push([moveId, 8]); + } else if ( + tmPoolTiers[moveId] === ModifierTier.ULTRA && + this.level >= 50 + ) { + movePool.push([moveId, 14]); } } } - if (this.level >= 60) { // No egg moves below level 60 + // No egg moves below level 60 + if (this.level >= 60) { for (let i = 0; i < 3; i++) { const moveId = speciesEggMoves[this.species.getRootSpeciesId()][i]; - if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { - movePool.push([ moveId, 40 ]); + if ( + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") + ) { + movePool.push([moveId, 40]); } } const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3]; - if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()) { // No rare egg moves before e4 - movePool.push([ moveId, 30 ]); + // No rare egg moves before e4 + if ( + this.level >= 170 && + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") && + !this.isBoss() + ) { + movePool.push([moveId, 30]); } if (this.fusionSpecies) { for (let i = 0; i < 3; i++) { - const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i]; - if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { - movePool.push([ moveId, 40 ]); + const moveId = + speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i]; + if ( + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") + ) { + movePool.push([moveId, 40]); } } - const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3]; - if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()) {// No rare egg moves before e4 - movePool.push([ moveId, 30 ]); + const moveId = + speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3]; + // No rare egg moves before e4 + if ( + this.level >= 170 && + !movePool.some(m => m[0] === moveId) && + !allMoves[moveId].name.endsWith(" (N)") && + !this.isBoss() + ) { + movePool.push([moveId, 30]); } } } } - if (this.isBoss()) { // Bosses never get self ko moves + // Bosses never get self ko moves or Pain Split + if (this.isBoss()) { movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(SacrificialAttr)); + movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(HpSplitAttr)); } - movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(SacrificialAttrOnHit)); + movePool = movePool.filter( + m => !allMoves[m[0]].hasAttr(SacrificialAttrOnHit), + ); if (this.hasTrainer()) { // Trainers never get OHKO moves movePool = movePool.filter(m => !allMoves[m[0]].hasAttr(OneHitKOAttr)); // Half the weight of self KO moves - movePool = movePool.map(m => [ m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1) ]); - movePool = movePool.map(m => [ m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttrOnHit) ? 0.5 : 1) ]); + movePool = movePool.map(m => [ + m[0], + m[1] * (allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1), + ]); + movePool = movePool.map(m => [ + m[0], + m[1] * (allMoves[m[0]].hasAttr(SacrificialAttrOnHit) ? 0.5 : 1), + ]); // Trainers get a weight bump to stat buffing moves - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].getAttrs(StatStageChangeAttr).some(a => a.stages > 1 && a.selfTarget) ? 1.25 : 1) ]); + movePool = movePool.map(m => [ + m[0], + m[1] * + (allMoves[m[0]] + .getAttrs(StatStageChangeAttr) + .some(a => a.stages > 1 && a.selfTarget) + ? 1.25 + : 1), + ]); // Trainers get a weight decrease to multiturn moves - movePool = movePool.map(m => [ m[0], m[1] * (!!allMoves[m[0]].isChargingMove() || !!allMoves[m[0]].hasAttr(RechargeAttr) ? 0.7 : 1) ]); + movePool = movePool.map(m => [ + m[0], + m[1] * + (!!allMoves[m[0]].isChargingMove() || + !!allMoves[m[0]].hasAttr(RechargeAttr) + ? 0.7 + : 1), + ]); } // Weight towards higher power moves, by reducing the power of moves below the highest power. // Caps max power at 90 to avoid something like hyper beam ruining the stats. // This is a pretty soft weighting factor, although it is scaled with the weight multiplier. - const maxPower = Math.min(movePool.reduce((v, m) => Math.max(allMoves[m[0]].power, v), 40), 90); - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].power / maxPower, 1), 0.5)) ]); + const maxPower = Math.min( + movePool.reduce( + (v, m) => Math.max(allMoves[m[0]].calculateEffectivePower(), v), + 40, + ), + 90, + ); + movePool = movePool.map(m => [ + m[0], + m[1] * + (allMoves[m[0]].category === MoveCategory.STATUS + ? 1 + : Math.max( + Math.min(allMoves[m[0]].calculateEffectivePower() / maxPower, 1), + 0.5, + )), + ]); - // Weight damaging moves against the lower stat + // Weight damaging moves against the lower stat. This uses a non-linear relationship. + // If the higher stat is 1 - 1.09x higher, no change. At higher stat ~1.38x lower stat, off-stat moves have half weight. + // One third weight at ~1.58x higher, one quarter weight at ~1.73x higher, one fifth at ~1.87x, and one tenth at ~2.35x higher. const atk = this.getStat(Stat.ATK); const spAtk = this.getStat(Stat.SPATK); - const worseCategory: MoveCategory = atk > spAtk ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL; - const statRatio = worseCategory === MoveCategory.PHYSICAL ? atk / spAtk : spAtk / atk; - movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].category === worseCategory ? statRatio : 1) ]); + const worseCategory: MoveCategory = + atk > spAtk ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL; + const statRatio = + worseCategory === MoveCategory.PHYSICAL ? atk / spAtk : spAtk / atk; + movePool = movePool.map(m => [ + m[0], + m[1] * + (allMoves[m[0]].category === worseCategory + ? Math.min(Math.pow(statRatio, 3) * 1.3, 1) + : 1), + ]); - let weightMultiplier = 0.9; // The higher this is the more the game weights towards higher level moves. At 0 all moves are equal weight. + /** The higher this is the more the game weights towards higher level moves. At `0` all moves are equal weight. */ + let weightMultiplier = 0.9; if (this.hasTrainer()) { weightMultiplier += 0.7; } if (this.isBoss()) { weightMultiplier += 0.4; } - const baseWeights: [Moves, number][] = movePool.map(m => [ m[0], Math.ceil(Math.pow(m[1], weightMultiplier) * 100) ]); + const baseWeights: [Moves, number][] = movePool.map(m => [ + m[0], + Math.ceil(Math.pow(m[1], weightMultiplier) * 100), + ]); - if (this.hasTrainer() || this.isBoss()) { // Trainers and bosses always force a stab move - const stabMovePool = baseWeights.filter(m => allMoves[m[0]].category !== MoveCategory.STATUS && this.isOfType(allMoves[m[0]].type)); + // Trainers and bosses always force a stab move + if (this.hasTrainer() || this.isBoss()) { + const stabMovePool = baseWeights.filter( + m => + allMoves[m[0]].category !== MoveCategory.STATUS && + this.isOfType(allMoves[m[0]].type), + ); if (stabMovePool.length) { const totalWeight = stabMovePool.reduce((v, m) => v + m[1], 0); @@ -2157,8 +3462,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.moveset.push(new PokemonMove(stabMovePool[index][0], 0, 0)); } - } else { // Normal wild pokemon just force a random damaging move - const attackMovePool = baseWeights.filter(m => allMoves[m[0]].category !== MoveCategory.STATUS); + } else { + // Normal wild pokemon just force a random damaging move + const attackMovePool = baseWeights.filter( + m => allMoves[m[0]].category !== MoveCategory.STATUS, + ); if (attackMovePool.length) { const totalWeight = attackMovePool.reduce((v, m) => v + m[1], 0); let rand = Utils.randSeedInt(totalWeight); @@ -2170,14 +3478,49 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - while (baseWeights.length > this.moveset.length && this.moveset.length < 4) { + while ( + baseWeights.length > this.moveset.length && + this.moveset.length < 4 + ) { if (this.hasTrainer()) { // Sqrt the weight of any damaging moves with overlapping types. This is about a 0.05 - 0.1 multiplier. - // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights double if STAB. + // Other damaging moves 2x weight if 0-1 damaging moves, 0.5x if 2, 0.125x if 3. These weights get 20x if STAB. // Status moves remain unchanged on weight, this encourages 1-2 - movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)).map(m => [ m[0], this.moveset.some(mo => mo?.getMove().category !== MoveCategory.STATUS && mo?.getMove().type === allMoves[m[0]].type) ? Math.ceil(Math.sqrt(m[1])) : allMoves[m[0]].category !== MoveCategory.STATUS ? Math.ceil(m[1] / Math.max(Math.pow(4, this.moveset.filter(mo => (mo?.getMove().power!) > 1).length) / 8, 0.5) * (this.isOfType(allMoves[m[0]].type) ? 2 : 1)) : m[1] ]); // TODO: is this bang correct? - } else { // Non-trainer pokemon just use normal weights - movePool = baseWeights.filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)); + movePool = baseWeights + .filter(m => !this.moveset.some(mo => m[0] === mo?.moveId)) + .map(m => { + let ret: number; + if ( + this.moveset.some( + mo => + mo?.getMove().category !== MoveCategory.STATUS && + mo?.getMove().type === allMoves[m[0]].type, + ) + ) { + ret = Math.ceil(Math.sqrt(m[1])); + } else if (allMoves[m[0]].category !== MoveCategory.STATUS) { + ret = Math.ceil( + (m[1] / + Math.max( + Math.pow( + 4, + this.moveset.filter(mo => (mo?.getMove().power ?? 0) > 1) + .length, + ) / 8, + 0.5, + )) * + (this.isOfType(allMoves[m[0]].type) ? 20 : 1), + ); + } else { + ret = m[1]; + } + return [m[0], ret]; + }); + } else { + // Non-trainer pokemon just use normal weights + movePool = baseWeights.filter( + m => !this.moveset.some(mo => m[0] === mo?.moveId), + ); } const totalWeight = movePool.reduce((v, m) => v + m[1], 0); let rand = Utils.randSeedInt(totalWeight); @@ -2189,37 +3532,56 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } // Trigger FormChange, except for enemy Pokemon during Mystery Encounters, to avoid crashes - if (this.isPlayer() || !this.scene.currentBattle?.isBattleMysteryEncounter() || !this.scene.currentBattle?.mysteryEncounter) { - this.scene.triggerPokemonFormChange(this, SpeciesFormChangeMoveLearnedTrigger); + if ( + this.isPlayer() || + !globalScene.currentBattle?.isBattleMysteryEncounter() || + !globalScene.currentBattle?.mysteryEncounter + ) { + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangeMoveLearnedTrigger, + ); } } - trySelectMove(moveIndex: integer, ignorePp?: boolean): boolean { - const move = this.getMoveset().length > moveIndex - ? this.getMoveset()[moveIndex] - : null; - return move?.isUsable(this, ignorePp)!; // TODO: is this bang correct? + public trySelectMove(moveIndex: number, ignorePp?: boolean): boolean { + const move = + this.getMoveset().length > moveIndex + ? this.getMoveset()[moveIndex] + : null; + return move?.isUsable(this, ignorePp) ?? false; } showInfo(): void { if (!this.battleInfo.visible) { - const otherBattleInfo = this.scene.fieldUI.getAll().slice(0, 4).filter(ui => ui instanceof BattleInfo && ((ui as BattleInfo) instanceof PlayerBattleInfo) === this.isPlayer()).find(() => true); + const otherBattleInfo = globalScene.fieldUI + .getAll() + .slice(0, 4) + .filter( + ui => + ui instanceof BattleInfo && + (ui as BattleInfo) instanceof PlayerBattleInfo === this.isPlayer(), + ) + .find(() => true); if (!otherBattleInfo || !this.getFieldIndex()) { - this.scene.fieldUI.sendToBack(this.battleInfo); - this.scene.sendTextToBack(); // Push the top right text objects behind everything else + globalScene.fieldUI.sendToBack(this.battleInfo); + globalScene.sendTextToBack(); // Push the top right text objects behind everything else } else { - this.scene.fieldUI.moveAbove(this.battleInfo, otherBattleInfo); + globalScene.fieldUI.moveAbove(this.battleInfo, otherBattleInfo); } - this.battleInfo.setX(this.battleInfo.x + (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198)); + this.battleInfo.setX( + this.battleInfo.x + + (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198), + ); this.battleInfo.setVisible(true); if (this.isPlayer()) { this.battleInfo.expMaskRect.x += 150; } - this.scene.tweens.add({ - targets: [ this.battleInfo, this.battleInfo.expMaskRect ], + globalScene.tweens.add({ + targets: [this.battleInfo, this.battleInfo.expMaskRect], x: this.isPlayer() ? "-=150" : `+=${!this.isBoss() ? 150 : 246}`, duration: 1000, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }); } } @@ -2227,8 +3589,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { hideInfo(): Promise { return new Promise(resolve => { if (this.battleInfo && this.battleInfo.visible) { - this.scene.tweens.add({ - targets: [ this.battleInfo, this.battleInfo.expMaskRect ], + globalScene.tweens.add({ + targets: [this.battleInfo, this.battleInfo.expMaskRect], x: this.isPlayer() ? "+=150" : `-=${!this.isBoss() ? 150 : 246}`, duration: 500, ease: "Cubic.easeIn", @@ -2237,9 +3599,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.battleInfo.expMaskRect.x -= 150; } this.battleInfo.setVisible(false); - this.battleInfo.setX(this.battleInfo.x - (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198)); + this.battleInfo.setX( + this.battleInfo.x - + (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198), + ); resolve(); - } + }, }); } else { resolve(); @@ -2275,18 +3640,34 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.battleInfo.toggleFlyout(visible); } - addExp(exp: integer) { - const maxExpLevel = this.scene.getMaxExpLevel(); + /** + * Adds experience to this PlayerPokemon, subject to wave based level caps. + * @param exp The amount of experience to add + * @param ignoreLevelCap Whether to ignore level caps when adding experience (defaults to false) + */ + addExp(exp: number, ignoreLevelCap = false) { + const maxExpLevel = globalScene.getMaxExpLevel(ignoreLevelCap); const initialExp = this.exp; this.exp += exp; - while (this.level < maxExpLevel && this.exp >= getLevelTotalExp(this.level + 1, this.species.growthRate)) { + while ( + this.level < maxExpLevel && + this.exp >= getLevelTotalExp(this.level + 1, this.species.growthRate) + ) { this.level++; } if (this.level >= maxExpLevel) { - console.log(initialExp, this.exp, getLevelTotalExp(this.level, this.species.growthRate)); - this.exp = Math.max(getLevelTotalExp(this.level, this.species.growthRate), initialExp); + console.log( + initialExp, + this.exp, + getLevelTotalExp(this.level, this.species.growthRate), + ); + this.exp = Math.max( + getLevelTotalExp(this.level, this.species.growthRate), + initialExp, + ); } - this.levelExp = this.exp - getLevelTotalExp(this.level, this.species.growthRate); + this.levelExp = + this.exp - getLevelTotalExp(this.level, this.species.growthRate); } /** @@ -2298,7 +3679,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.isPlayer() !== target.isPlayer(); } - getOpponent(targetIndex: integer): Pokemon | null { + getOpponent(targetIndex: number): Pokemon | null { const ret = this.getOpponents()[targetIndex]; if (ret.summonData) { return ret; @@ -2307,7 +3688,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getOpponents(): Pokemon[] { - return ((this.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField()) as Pokemon[]).filter(p => p.isActive()); + return ( + (this.isPlayer() + ? globalScene.getEnemyField() + : globalScene.getPlayerField()) as Pokemon[] + ).filter(p => p.isActive()); } getOpponentDescriptor(): string { @@ -2315,11 +3700,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (opponents.length === 1) { return opponents[0].name; } - return this.isPlayer() ? i18next.t("arenaTag:opposingTeam") : i18next.t("arenaTag:yourTeam"); + return this.isPlayer() + ? i18next.t("arenaTag:opposingTeam") + : i18next.t("arenaTag:yourTeam"); } getAlly(): Pokemon { - return (this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.getFieldIndex() ? 0 : 1]; + return ( + this.isPlayer() + ? globalScene.getPlayerField() + : globalScene.getEnemyField() + )[this.getFieldIndex() ? 0 : 1]; } /** @@ -2328,7 +3719,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns An array of Pokémon on the allied field. */ getAlliedField(): Pokemon[] { - return this instanceof PlayerPokemon ? this.scene.getPlayerField() : this.scene.getEnemyField(); + return this instanceof PlayerPokemon + ? globalScene.getPlayerField() + : globalScene.getEnemyField(); } /** @@ -2342,10 +3735,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOppAbility determines whether the effects of the opponent's abilities (i.e. Unaware) should be ignored (`false` by default) * @param isCritical determines whether a critical hit has occurred or not (`false` by default) * @param simulated determines whether effects are applied without altering game state (`true` by default) + * @param ignoreHeldItems determines whether this Pokemon's held items should be ignored during the stat calculation, default `false` * @return the stat stage multiplier to be used for effective stat calculation */ - getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): number { - const statStage = new Utils.IntegerHolder(this.getStatStage(stat)); + getStatStageMultiplier( + stat: EffectiveStat, + opponent?: Pokemon, + move?: Move, + ignoreOppAbility = false, + isCritical = false, + simulated = true, + ignoreHeldItems = false, + ): number { + const statStage = new Utils.NumberHolder(this.getStatStage(stat)); const ignoreStatStage = new Utils.BooleanHolder(false); if (opponent) { @@ -2362,16 +3764,38 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } if (!ignoreOppAbility) { - applyAbAttrs(IgnoreOpponentStatStagesAbAttr, opponent, null, simulated, stat, ignoreStatStage); + applyAbAttrs( + IgnoreOpponentStatStagesAbAttr, + opponent, + null, + simulated, + stat, + ignoreStatStage, + ); } if (move) { - applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, opponent, move, ignoreStatStage); + applyMoveAttrs( + IgnoreOpponentStatStagesAttr, + this, + opponent, + move, + ignoreStatStage, + ); } } if (!ignoreStatStage.value) { - const statStageMultiplier = new Utils.NumberHolder(Math.max(2, 2 + statStage.value) / Math.max(2, 2 - statStage.value)); - this.scene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), stat, statStageMultiplier); + const statStageMultiplier = new Utils.NumberHolder( + Math.max(2, 2 + statStage.value) / Math.max(2, 2 - statStage.value), + ); + if (!ignoreHeldItems) { + globalScene.applyModifiers( + TempStatStageBoosterModifier, + this.isPlayer(), + stat, + statStageMultiplier, + ); + } return Math.min(statStageMultiplier.value, 4); } return 1; @@ -2393,19 +3817,48 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return 1; } - const userAccStage = new Utils.IntegerHolder(this.getStatStage(Stat.ACC)); - const targetEvaStage = new Utils.IntegerHolder(target.getStatStage(Stat.EVA)); + const userAccStage = new Utils.NumberHolder(this.getStatStage(Stat.ACC)); + const targetEvaStage = new Utils.NumberHolder( + target.getStatStage(Stat.EVA), + ); const ignoreAccStatStage = new Utils.BooleanHolder(false); const ignoreEvaStatStage = new Utils.BooleanHolder(false); - applyAbAttrs(IgnoreOpponentStatStagesAbAttr, target, null, false, Stat.ACC, ignoreAccStatStage); - applyAbAttrs(IgnoreOpponentStatStagesAbAttr, this, null, false, Stat.EVA, ignoreEvaStatStage); - applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, target, sourceMove, ignoreEvaStatStage); + applyAbAttrs( + IgnoreOpponentStatStagesAbAttr, + target, + null, + false, + Stat.ACC, + ignoreAccStatStage, + ); + applyAbAttrs( + IgnoreOpponentStatStagesAbAttr, + this, + null, + false, + Stat.EVA, + ignoreEvaStatStage, + ); + applyMoveAttrs( + IgnoreOpponentStatStagesAttr, + this, + target, + sourceMove, + ignoreEvaStatStage, + ); - this.scene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), Stat.ACC, userAccStage); + globalScene.applyModifiers( + TempStatStageBoosterModifier, + this.isPlayer(), + Stat.ACC, + userAccStage, + ); - userAccStage.value = ignoreAccStatStage.value ? 0 : Math.min(userAccStage.value, 6); + userAccStage.value = ignoreAccStatStage.value + ? 0 + : Math.min(userAccStage.value, 6); targetEvaStage.value = ignoreEvaStatStage.value ? 0 : targetEvaStage.value; if (target.findTag(t => t instanceof ExposedTag)) { @@ -2414,15 +3867,28 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const accuracyMultiplier = new Utils.NumberHolder(1); if (userAccStage.value !== targetEvaStage.value) { - accuracyMultiplier.value = userAccStage.value > targetEvaStage.value - ? (3 + Math.min(userAccStage.value - targetEvaStage.value, 6)) / 3 - : 3 / (3 + Math.min(targetEvaStage.value - userAccStage.value, 6)); + accuracyMultiplier.value = + userAccStage.value > targetEvaStage.value + ? (3 + Math.min(userAccStage.value - targetEvaStage.value, 6)) / 3 + : 3 / (3 + Math.min(targetEvaStage.value - userAccStage.value, 6)); } - applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, Stat.ACC, accuracyMultiplier, false, sourceMove); + applyStatMultiplierAbAttrs( + StatMultiplierAbAttr, + this, + Stat.ACC, + accuracyMultiplier, + false, + sourceMove, + ); const evasionMultiplier = new Utils.NumberHolder(1); - applyStatMultiplierAbAttrs(StatMultiplierAbAttr, target, Stat.EVA, evasionMultiplier); + applyStatMultiplierAbAttrs( + StatMultiplierAbAttr, + target, + Stat.EVA, + evasionMultiplier, + ); return accuracyMultiplier.value / evasionMultiplier.value; } @@ -2439,11 +3905,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param simulated if `true`, suppresses changes to game state during calculation (defaults to `true`). * @returns The move's base damage against this Pokemon when used by the source Pokemon. */ - getBaseDamage(source: Pokemon, move: Move, moveCategory: MoveCategory, ignoreAbility: boolean = false, ignoreSourceAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): number { + getBaseDamage( + source: Pokemon, + move: Move, + moveCategory: MoveCategory, + ignoreAbility = false, + ignoreSourceAbility = false, + isCritical = false, + simulated = true, + ): number { const isPhysical = moveCategory === MoveCategory.PHYSICAL; /** A base damage multiplier based on the source's level */ - const levelMultiplier = (2 * source.level / 5 + 2); + const levelMultiplier = (2 * source.level) / 5 + 2; /** The power of the move after power boosts from abilities, etc. have applied */ const power = move.calculateBattlePower(source, this, simulated); @@ -2452,25 +3926,53 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * The attacker's offensive stat for the given move's category. * Critical hits cause negative stat stages to be ignored. */ - const sourceAtk = new Utils.NumberHolder(source.getEffectiveStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, ignoreSourceAbility, ignoreAbility, isCritical, simulated)); + const sourceAtk = new Utils.NumberHolder( + source.getEffectiveStat( + isPhysical ? Stat.ATK : Stat.SPATK, + this, + undefined, + ignoreSourceAbility, + ignoreAbility, + isCritical, + simulated, + ), + ); applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); /** * This Pokemon's defensive stat for the given move's category. * Critical hits cause positive stat stages to be ignored. */ - const targetDef = new Utils.NumberHolder(this.getEffectiveStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, ignoreAbility, ignoreSourceAbility, isCritical, simulated)); + const targetDef = new Utils.NumberHolder( + this.getEffectiveStat( + isPhysical ? Stat.DEF : Stat.SPDEF, + source, + move, + ignoreAbility, + ignoreSourceAbility, + isCritical, + simulated, + ), + ); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); /** * The attack's base damage, as determined by the source's level, move power * and Attack stat as well as this Pokemon's Defense stat */ - const baseDamage = ((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2; + const baseDamage = + (levelMultiplier * power * sourceAtk.value) / targetDef.value / 50 + 2; /** Debug message for non-simulated calls (i.e. when damage is actually dealt) */ if (!simulated) { - console.log("base damage", baseDamage, move.name, power, sourceAtk.value, targetDef.value); + console.log( + "base damage", + baseDamage, + move.name, + power, + sourceAtk.value, + targetDef.value, + ); } return baseDamage; @@ -2489,12 +3991,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * - `result`: {@linkcode HitResult} indicates the attack's type effectiveness. * - `damage`: `number` the attack's final damage output. */ - getAttackDamage(source: Pokemon, move: Move, ignoreAbility: boolean = false, ignoreSourceAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): DamageCalculationResult { + getAttackDamage( + source: Pokemon, + move: Move, + ignoreAbility = false, + ignoreSourceAbility = false, + isCritical = false, + simulated = true, + ): DamageCalculationResult { const damage = new Utils.NumberHolder(0); - const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + const defendingSide = this.isPlayer() + ? ArenaTagSide.PLAYER + : ArenaTagSide.ENEMY; const variableCategory = new Utils.NumberHolder(move.category); - applyMoveAttrs(VariableMoveCategoryAttr, source, this, move, variableCategory); + applyMoveAttrs( + VariableMoveCategoryAttr, + source, + this, + move, + variableCategory, + ); const moveCategory = variableCategory.value as MoveCategory; /** The move's type after type-changing effects are applied */ @@ -2510,32 +4027,60 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * * Note that the source's abilities are not ignored here */ - const typeMultiplier = this.getMoveEffectiveness(source, move, ignoreAbility, simulated, cancelled); + const typeMultiplier = this.getMoveEffectiveness( + source, + move, + ignoreAbility, + simulated, + cancelled, + ); const isPhysical = moveCategory === MoveCategory.PHYSICAL; /** Combined damage multiplier from field effects such as weather, terrain, etc. */ - const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(moveType, source.isGrounded())); - applyMoveAttrs(IgnoreWeatherTypeDebuffAttr, source, this, move, arenaAttackTypeMultiplier); + const arenaAttackTypeMultiplier = new Utils.NumberHolder( + globalScene.arena.getAttackTypeMultiplier(moveType, source.isGrounded()), + ); + applyMoveAttrs( + IgnoreWeatherTypeDebuffAttr, + source, + this, + move, + arenaAttackTypeMultiplier, + ); - const isTypeImmune = (typeMultiplier * arenaAttackTypeMultiplier.value) === 0; + const isTypeImmune = typeMultiplier * arenaAttackTypeMultiplier.value === 0; if (cancelled.value || isTypeImmune) { return { cancelled: cancelled.value, - result: move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT, - damage: 0 + result: + move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT, + damage: 0, }; } - // 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); + globalScene.applyModifiers( + PokemonMultiHitModifier, + source.isPlayer(), + source, + move.id, + null, + multiLensMultiplier, + ); + fixedDamage.value = Utils.toDmgValue( + fixedDamage.value * multiLensMultiplier.value, + ); + return { cancelled: false, result: HitResult.EFFECTIVE, - damage: fixedDamage.value + damage: fixedDamage.value, }; } @@ -2546,7 +4091,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return { cancelled: false, result: HitResult.ONE_HIT_KO, - damage: this.hp + damage: this.hp, }; } @@ -2554,21 +4099,45 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * The attack's base damage, as determined by the source's level, move power * and Attack stat as well as this Pokemon's Defense stat */ - const baseDamage = this.getBaseDamage(source, move, moveCategory, ignoreAbility, ignoreSourceAbility, isCritical, simulated); + const baseDamage = this.getBaseDamage( + source, + move, + moveCategory, + ignoreAbility, + ignoreSourceAbility, + isCritical, + simulated, + ); /** 25% damage debuff on moves hitting more than one non-fainted target (regardless of immunities) */ const { targets, multiple } = getMoveTargets(source, move.id); const numTargets = multiple ? targets.length : 1; - const targetMultiplier = (numTargets > 1) ? 0.75 : 1; + const targetMultiplier = numTargets > 1 ? 0.75 : 1; - /** 0.25x multiplier if this is an added strike from the attacker's Parental Bond */ - const parentalBondMultiplier = new Utils.NumberHolder(1); + /** Multiplier for moves enhanced by Multi-Lens and/or Parental Bond */ + const multiStrikeEnhancementMultiplier = new Utils.NumberHolder(1); + globalScene.applyModifiers( + PokemonMultiHitModifier, + source.isPlayer(), + source, + move.id, + null, + multiStrikeEnhancementMultiplier, + ); if (!ignoreSourceAbility) { - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, simulated, numTargets, new Utils.IntegerHolder(0), parentalBondMultiplier); + applyPreAttackAbAttrs( + AddSecondStrikeAbAttr, + source, + this, + move, + simulated, + null, + multiStrikeEnhancementMultiplier, + ); } /** Doubles damage if this Pokemon's last move was Glaive Rush */ - const glaiveRushMultiplier = new Utils.IntegerHolder(1); + const glaiveRushMultiplier = new Utils.NumberHolder(1); if (this.getTag(BattlerTagType.RECEIVE_DOUBLE_DAMAGE)) { glaiveRushMultiplier.value = 2; } @@ -2581,18 +4150,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * A multiplier for random damage spread in the range [0.85, 1] * This is always 1 for simulated calls. */ - const randomMultiplier = simulated ? 1 : ((this.randSeedIntRange(85, 100)) / 100); + const randomMultiplier = simulated + ? 1 + : this.randSeedIntRange(85, 100) / 100; const sourceTypes = source.getTypes(); const sourceTeraType = source.getTeraType(); const matchesSourceType = sourceTypes.includes(moveType); /** A damage multiplier for when the attack is of the attacker's type and/or Tera type. */ const stabMultiplier = new Utils.NumberHolder(1); - if (matchesSourceType) { - stabMultiplier.value += 0.5; - } - applyMoveAttrs(CombinedPledgeStabBoostAttr, source, this, move, stabMultiplier); - if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === moveType) { + if (matchesSourceType && moveType !== PokemonType.STELLAR) { stabMultiplier.value += 0.5; } @@ -2600,15 +4167,53 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyAbAttrs(StabBoostAbAttr, source, null, simulated, stabMultiplier); } + applyMoveAttrs( + CombinedPledgeStabBoostAttr, + source, + this, + move, + stabMultiplier, + ); + + if ( + source.isTerastallized && + sourceTeraType === moveType && + moveType !== PokemonType.STELLAR + ) { + stabMultiplier.value += 0.5; + } + + if ( + source.isTerastallized && + source.getTeraType() === PokemonType.STELLAR && + (!source.stellarTypesBoosted.includes(moveType) || + source.hasSpecies(Species.TERAPAGOS)) + ) { + if (matchesSourceType) { + stabMultiplier.value += 0.5; + } else { + stabMultiplier.value += 0.2; + } + } + stabMultiplier.value = Math.min(stabMultiplier.value, 2.25); /** Halves damage if the attacker is using a physical attack while burned */ const burnMultiplier = new Utils.NumberHolder(1); - if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { + if ( + isPhysical && + source.status && + source.status.effect === StatusEffect.BURN + ) { if (!move.hasAttr(BypassBurnDamageReductionAttr)) { const burnDamageReductionCancelled = new Utils.BooleanHolder(false); if (!ignoreSourceAbility) { - applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled, simulated); + applyAbAttrs( + BypassBurnDamageReductionAbAttr, + source, + burnDamageReductionCancelled, + simulated, + ); } if (!burnDamageReductionCancelled.value) { burnMultiplier.value = 0.5; @@ -2618,7 +4223,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** Reduces damage if this Pokemon has a relevant screen (e.g. Light Screen for special attacks) */ const screenMultiplier = new Utils.NumberHolder(1); - this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, simulated, source, moveCategory, screenMultiplier); + + // Critical hits should bypass screens + if (!isCritical) { + globalScene.arena.applyTagsForSide( + WeakenMoveScreenTag, + defendingSide, + simulated, + source, + moveCategory, + screenMultiplier, + ); + } /** * For each {@linkcode HitsTagAttr} the move has, doubles the damage of the move if: @@ -2627,56 +4243,98 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * The move doubles damage when used against that tag */ const hitsTagMultiplier = new Utils.NumberHolder(1); - move.getAttrs(HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { - if (this.getTag(hta.tagType)) { - hitsTagMultiplier.value *= 2; - } - }); + move + .getAttrs(HitsTagAttr) + .filter(hta => hta.doubleDamage) + .forEach(hta => { + if (this.getTag(hta.tagType)) { + hitsTagMultiplier.value *= 2; + } + }); /** Halves damage if this Pokemon is grounded in Misty Terrain against a Dragon-type attack */ - const mistyTerrainMultiplier = (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && moveType === Type.DRAGON) - ? 0.5 - : 1; + const mistyTerrainMultiplier = + globalScene.arena.terrain?.terrainType === TerrainType.MISTY && + this.isGrounded() && + moveType === PokemonType.DRAGON + ? 0.5 + : 1; damage.value = Utils.toDmgValue( - baseDamage - * targetMultiplier - * parentalBondMultiplier.value - * arenaAttackTypeMultiplier.value - * glaiveRushMultiplier.value - * criticalMultiplier.value - * randomMultiplier - * stabMultiplier.value - * typeMultiplier - * burnMultiplier.value - * screenMultiplier.value - * hitsTagMultiplier.value - * mistyTerrainMultiplier + baseDamage * + targetMultiplier * + multiStrikeEnhancementMultiplier.value * + arenaAttackTypeMultiplier.value * + glaiveRushMultiplier.value * + criticalMultiplier.value * + randomMultiplier * + stabMultiplier.value * + typeMultiplier * + burnMultiplier.value * + screenMultiplier.value * + hitsTagMultiplier.value * + mistyTerrainMultiplier, ); /** Doubles damage if the attacker has Tinted Lens and is using a resisted move */ if (!ignoreSourceAbility) { - applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, move, simulated, damage); + applyPreAttackAbAttrs( + DamageBoostAbAttr, + source, + this, + move, + simulated, + damage, + ); } /** Apply the enemy's Damage and Resistance tokens */ if (!source.isPlayer()) { - this.scene.applyModifiers(EnemyDamageBoosterModifier, false, damage); + globalScene.applyModifiers(EnemyDamageBoosterModifier, false, damage); } if (!this.isPlayer()) { - this.scene.applyModifiers(EnemyDamageReducerModifier, false, damage); + globalScene.applyModifiers(EnemyDamageReducerModifier, false, damage); } /** Apply this Pokemon's post-calc defensive modifiers (e.g. Fur Coat) */ if (!ignoreAbility) { - applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, simulated, damage); + applyPreDefendAbAttrs( + ReceivedMoveDamageMultiplierAbAttr, + this, + source, + move, + cancelled, + simulated, + damage, + ); + + /** Additionally apply friend guard damage reduction if ally has it. */ + if (globalScene.currentBattle.double && this.getAlly()?.isActive(true)) { + applyPreDefendAbAttrs( + AlliedFieldDamageReductionAbAttr, + this.getAlly(), + source, + move, + cancelled, + simulated, + damage, + ); + } } // This attribute may modify damage arbitrarily, so be careful about changing its order of application. applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); if (this.isFullHp() && !ignoreAbility) { - applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, false, damage); + applyPreDefendAbAttrs( + PreDefendFullHpEndureAbAttr, + this, + source, + move, + cancelled, + false, + damage, + ); } // debug message for when damage is applied (i.e. not simulated) @@ -2696,7 +4354,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return { cancelled: cancelled.value, result: hitResult, - damage: damage.value + damage: damage.value, }; } @@ -2707,134 +4365,211 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns The {@linkcode HitResult} of the attack */ apply(source: Pokemon, move: Move): HitResult { - const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + const defendingSide = this.isPlayer() + ? ArenaTagSide.PLAYER + : ArenaTagSide.ENEMY; const moveCategory = new Utils.NumberHolder(move.category); applyMoveAttrs(VariableMoveCategoryAttr, source, this, move, moveCategory); if (moveCategory.value === MoveCategory.STATUS) { const cancelled = new Utils.BooleanHolder(false); - const typeMultiplier = this.getMoveEffectiveness(source, move, false, false, cancelled); + const typeMultiplier = this.getMoveEffectiveness( + source, + move, + false, + false, + cancelled, + ); if (!cancelled.value && typeMultiplier === 0) { - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); + globalScene.queueMessage( + i18next.t("battle:hitResultNoEffect", { + pokemonName: getPokemonNameWithAffix(this), + }), + ); } - return (typeMultiplier === 0) ? HitResult.NO_EFFECT : HitResult.STATUS; + return typeMultiplier === 0 ? HitResult.NO_EFFECT : HitResult.STATUS; + } + /** Determines whether the attack critically hits */ + let isCritical: boolean; + const critOnly = new Utils.BooleanHolder(false); + const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT); + applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly); + applyAbAttrs( + ConditionalCritAbAttr, + source, + null, + false, + critOnly, + this, + move, + ); + if (critOnly.value || critAlways) { + isCritical = true; } else { - /** Determines whether the attack critically hits */ - let isCritical: boolean; - const critOnly = new Utils.BooleanHolder(false); - const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT); - applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly); - applyAbAttrs(ConditionalCritAbAttr, source, null, false, critOnly, this, move); - if (critOnly.value || critAlways) { - isCritical = true; - } else { - const critChance = [ 24, 8, 2, 1 ][Math.max(0, Math.min(this.getCritStage(source, move), 3))]; - isCritical = critChance === 1 || !this.scene.randBattleSeedInt(critChance); - } + const critChance = [24, 8, 2, 1][ + Math.max(0, Math.min(this.getCritStage(source, move), 3)) + ]; + isCritical = + critChance === 1 || !globalScene.randBattleSeedInt(critChance); + } - const noCritTag = this.scene.arena.getTagOnSide(NoCritTag, defendingSide); - const blockCrit = new Utils.BooleanHolder(false); - applyAbAttrs(BlockCritAbAttr, this, null, false, blockCrit); - if (noCritTag || blockCrit.value || Overrides.NEVER_CRIT_OVERRIDE) { - isCritical = false; - } + const noCritTag = globalScene.arena.getTagOnSide(NoCritTag, defendingSide); + const blockCrit = new Utils.BooleanHolder(false); + applyAbAttrs(BlockCritAbAttr, this, null, false, blockCrit); + if (noCritTag || blockCrit.value || Overrides.NEVER_CRIT_OVERRIDE) { + isCritical = false; + } - const { cancelled, result, damage: dmg } = this.getAttackDamage(source, move, false, false, isCritical, false); + /** + * Applies stat changes from {@linkcode move} and gives it to {@linkcode source} + * before damage calculation + */ + applyMoveAttrs(StatChangeBeforeDmgCalcAttr, source, this, move); - const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === source.getMoveType(move)) as TypeBoostTag; - if (typeBoost?.oneUse) { - source.removeTag(typeBoost.tagType); - } + const { + cancelled, + result, + damage: dmg, + } = this.getAttackDamage(source, move, false, false, isCritical, false); - if (cancelled || result === HitResult.IMMUNE || result === HitResult.NO_EFFECT) { - source.stopMultiHit(this); + const typeBoost = source.findTag( + t => + t instanceof TypeBoostTag && t.boostedType === source.getMoveType(move), + ) as TypeBoostTag; + if (typeBoost?.oneUse) { + source.removeTag(typeBoost.tagType); + } - if (!cancelled) { - if (result === HitResult.IMMUNE) { - this.scene.queueMessage(i18next.t("battle:hitResultImmune", { pokemonName: getPokemonNameWithAffix(this) })); - } else { - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); - } - } - return result; - } + if ( + cancelled || + result === HitResult.IMMUNE || + result === HitResult.NO_EFFECT + ) { + source.stopMultiHit(this); - // In case of fatal damage, this tag would have gotten cleared before we could lapse it. - const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); - - const isOneHitKo = result === HitResult.ONE_HIT_KO; - - if (dmg) { - this.lapseTags(BattlerTagLapseType.HIT); - - const substitute = this.getTag(SubstituteTag); - const isBlockedBySubstitute = !!substitute && move.hitsSubstitute(source, this); - if (isBlockedBySubstitute) { - substitute.hp -= dmg; - } - if (!this.isPlayer() && dmg >= this.hp) { - this.scene.applyModifiers(EnemyEndureChanceModifier, false, this); - } - - /** - * We explicitly require to ignore the faint phase here, as we want to show the messages - * about the critical hit and the super effective/not very effective messages before the faint phase. - */ - const damage = this.damageAndUpdate(isBlockedBySubstitute ? 0 : dmg, result as DamageResult, isCritical, isOneHitKo, isOneHitKo, true); - - if (damage > 0) { - if (source.isPlayer()) { - this.scene.validateAchvs(DamageAchv, new Utils.NumberHolder(damage)); - if (damage > this.scene.gameData.gameStats.highestDamage) { - this.scene.gameData.gameStats.highestDamage = damage; - } - } - source.turnData.damageDealt += damage; - source.turnData.currDamageDealt = damage; - this.turnData.damageTaken += damage; - this.battleData.hitCount++; - 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()) { - this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, new Utils.NumberHolder(damage)); - } - } - } - - if (isCritical) { - this.scene.queueMessage(i18next.t("battle:hitResultCriticalHit")); - } - - // want to include is.Fainted() in case multi hit move ends early, still want to render message - if (source.turnData.hitsLeft === 1 || this.isFainted()) { - switch (result) { - case HitResult.SUPER_EFFECTIVE: - this.scene.queueMessage(i18next.t("battle:hitResultSuperEffective")); - break; - case HitResult.NOT_VERY_EFFECTIVE: - this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); - break; - case HitResult.ONE_HIT_KO: - this.scene.queueMessage(i18next.t("battle:hitResultOneHitKO")); - break; - } - } - - if (this.isFainted()) { - // set splice index here, so future scene queues happen before FaintedPhase - this.scene.setPhaseQueueSplice(); - if (!isNullOrUndefined(destinyTag) && dmg) { - // Destiny Bond will activate during FaintPhase - this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), isOneHitKo, destinyTag, source)); + if (!cancelled) { + if (result === HitResult.IMMUNE) { + globalScene.queueMessage( + i18next.t("battle:hitResultImmune", { + pokemonName: getPokemonNameWithAffix(this), + }), + ); } else { - this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), isOneHitKo)); + globalScene.queueMessage( + i18next.t("battle:hitResultNoEffect", { + pokemonName: getPokemonNameWithAffix(this), + }), + ); } - this.destroySubstitute(); - this.resetSummonData(); } - return result; } + + // In case of fatal damage, this tag would have gotten cleared before we could lapse it. + const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); + const grudgeTag = this.getTag(BattlerTagType.GRUDGE); + + const isOneHitKo = result === HitResult.ONE_HIT_KO; + + if (dmg) { + this.lapseTags(BattlerTagLapseType.HIT); + + const substitute = this.getTag(SubstituteTag); + const isBlockedBySubstitute = + !!substitute && move.hitsSubstitute(source, this); + if (isBlockedBySubstitute) { + substitute.hp -= dmg; + } + if (!this.isPlayer() && dmg >= this.hp) { + globalScene.applyModifiers(EnemyEndureChanceModifier, false, this); + } + + /** + * We explicitly require to ignore the faint phase here, as we want to show the messages + * about the critical hit and the super effective/not very effective messages before the faint phase. + */ + const damage = this.damageAndUpdate( + isBlockedBySubstitute ? 0 : dmg, + result as DamageResult, + isCritical, + isOneHitKo, + isOneHitKo, + true, + source, + ); + + if (damage > 0) { + if (source.isPlayer()) { + globalScene.validateAchvs(DamageAchv, new Utils.NumberHolder(damage)); + if (damage > globalScene.gameData.gameStats.highestDamage) { + globalScene.gameData.gameStats.highestDamage = damage; + } + } + source.turnData.totalDamageDealt += damage; + source.turnData.singleHitDamageDealt = damage; + this.turnData.damageTaken += damage; + this.battleData.hitCount++; + + 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()) { + globalScene.applyModifiers( + DamageMoneyRewardModifier, + true, + source, + new Utils.NumberHolder(damage), + ); + } + } + } + + if (isCritical) { + globalScene.queueMessage(i18next.t("battle:hitResultCriticalHit")); + } + + // want to include is.Fainted() in case multi hit move ends early, still want to render message + if (source.turnData.hitsLeft === 1 || this.isFainted()) { + switch (result) { + case HitResult.SUPER_EFFECTIVE: + globalScene.queueMessage(i18next.t("battle:hitResultSuperEffective")); + break; + case HitResult.NOT_VERY_EFFECTIVE: + globalScene.queueMessage( + i18next.t("battle:hitResultNotVeryEffective"), + ); + break; + case HitResult.ONE_HIT_KO: + globalScene.queueMessage(i18next.t("battle:hitResultOneHitKO")); + break; + } + } + + if (this.isFainted()) { + // set splice index here, so future scene queues happen before FaintedPhase + globalScene.setPhaseQueueSplice(); + globalScene.unshiftPhase( + new FaintPhase( + this.getBattlerIndex(), + isOneHitKo, + destinyTag, + grudgeTag, + source, + ), + ); + + this.destroySubstitute(); + this.lapseTag(BattlerTagType.COMMANDED); + this.resetSummonData(); + } + + return result; } /** @@ -2845,7 +4580,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreFaintPhase flag on wheter to add FaintPhase if pokemon after applying damage faints * @returns integer representing damage */ - damage(damage: integer, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false): integer { + damage( + damage: number, + _ignoreSegments = false, + preventEndure = false, + ignoreFaintPhase = false, + ): number { if (this.isFainted()) { return 0; } @@ -2856,9 +4596,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { surviveDamage.value = this.lapseTag(BattlerTagType.ENDURING); } else if (this.hp > 1 && this.getTag(BattlerTagType.STURDY)) { surviveDamage.value = this.lapseTag(BattlerTagType.STURDY); + } else if (this.hp >= 1 && this.getTag(BattlerTagType.ENDURE_TOKEN)) { + surviveDamage.value = this.lapseTag(BattlerTagType.ENDURE_TOKEN); } if (!surviveDamage.value) { - this.scene.applyModifiers(SurviveDamageModifier, this.isPlayer(), this, surviveDamage); + globalScene.applyModifiers( + SurviveDamageModifier, + this.isPlayer(), + this, + surviveDamage, + ); } if (surviveDamage.value) { damage = this.hp - 1; @@ -2875,12 +4622,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * * Once the MoveEffectPhase is over (and calls it's .end() function, shiftPhase() will reset the PhaseQueueSplice via clearPhaseQueueSplice() ) */ - this.scene.setPhaseQueueSplice(); - this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), preventEndure)); + globalScene.setPhaseQueueSplice(); + globalScene.unshiftPhase( + new FaintPhase(this.getBattlerIndex(), preventEndure), + ); this.destroySubstitute(); + this.lapseTag(BattlerTagType.COMMANDED); this.resetSummonData(); } - return damage; } @@ -2894,16 +4643,52 @@ 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): integer { - const damagePhase = new DamagePhase(this.scene, this.getBattlerIndex(), damage, result as DamageResult, critical); - this.scene.unshiftPhase(damagePhase); - damage = this.damage(damage, ignoreSegments, preventEndure, ignoreFaintPhase); + damageAndUpdate( + damage: number, + result?: DamageResult, + critical = false, + ignoreSegments = false, + preventEndure = false, + ignoreFaintPhase = false, + source?: Pokemon, + ): number { + const damagePhase = new DamageAnimPhase( + this.getBattlerIndex(), + damage, + result as DamageResult, + critical, + ); + globalScene.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); + /** + * 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; } - heal(amount: integer): integer { + heal(amount: number): number { const healAmount = Math.min(amount, this.getMaxHp() - this.hp); this.hp += healAmount; return healAmount; @@ -2918,6 +4703,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return maxForms.includes(this.getFormKey()) || (!!this.getFusionFormKey() && maxForms.includes(this.getFusionFormKey()!)); } + isMega(): boolean { + const megaForms = [ SpeciesFormKey.MEGA, SpeciesFormKey.MEGA_X, SpeciesFormKey.MEGA_Y, SpeciesFormKey.PRIMAL ] as string[]; + return megaForms.includes(this.getFormKey()) || (!!this.getFusionFormKey() && megaForms.includes(this.getFusionFormKey()!)); + } + canAddTag(tagType: BattlerTagType): boolean { if (this.getTag(tagType)) { return false; @@ -2926,15 +4716,34 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const stubTag = new BattlerTag(tagType, 0, 0); const cancelled = new Utils.BooleanHolder(false); - applyPreApplyBattlerTagAbAttrs(BattlerTagImmunityAbAttr, this, stubTag, cancelled, true); + applyPreApplyBattlerTagAbAttrs( + BattlerTagImmunityAbAttr, + this, + stubTag, + cancelled, + true, + ); const userField = this.getAlliedField(); - userField.forEach(pokemon => applyPreApplyBattlerTagAbAttrs(UserFieldBattlerTagImmunityAbAttr, pokemon, stubTag, cancelled, true)); + userField.forEach(pokemon => + applyPreApplyBattlerTagAbAttrs( + UserFieldBattlerTagImmunityAbAttr, + pokemon, + stubTag, + cancelled, + true, + ), + ); return !cancelled.value; } - addTag(tagType: BattlerTagType, turnCount: integer = 0, sourceMove?: Moves, sourceId?: integer): boolean { + addTag( + tagType: BattlerTagType, + turnCount = 0, + sourceMove?: Moves, + sourceId?: number, + ): boolean { const existingTag = this.getTag(tagType); if (existingTag) { existingTag.onOverlap(this); @@ -2944,10 +4753,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const newTag = getBattlerTag(tagType, turnCount, sourceMove!, sourceId!); // TODO: are the bangs correct? const cancelled = new Utils.BooleanHolder(false); - applyPreApplyBattlerTagAbAttrs(BattlerTagImmunityAbAttr, this, newTag, cancelled); + applyPreApplyBattlerTagAbAttrs( + BattlerTagImmunityAbAttr, + this, + newTag, + cancelled, + ); const userField = this.getAlliedField(); - userField.forEach(pokemon => applyPreApplyBattlerTagAbAttrs(UserFieldBattlerTagImmunityAbAttr, pokemon, newTag, cancelled)); + userField.forEach(pokemon => + applyPreApplyBattlerTagAbAttrs( + UserFieldBattlerTagImmunityAbAttr, + pokemon, + newTag, + cancelled, + ), + ); if (!cancelled.value && newTag.canAdd(this)) { this.summonData.tags.push(newTag); @@ -2960,29 +4781,28 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** @overload */ - getTag(tagType: BattlerTagType): BattlerTag | null; + getTag(tagType: BattlerTagType): BattlerTag | nil; /** @overload */ - getTag(tagType: Constructor): T | null; + getTag(tagType: Constructor): T | nil; - getTag(tagType: BattlerTagType | Constructor): BattlerTag | null { + getTag(tagType: BattlerTagType | Constructor): BattlerTag | nil { if (!this.summonData) { return null; } - return (tagType instanceof Function + return tagType instanceof Function ? this.summonData.tags.find(t => t instanceof tagType) - : this.summonData.tags.find(t => t.tagType === tagType) - )!; // TODO: is this bang correct? + : this.summonData.tags.find(t => t.tagType === tagType); } - findTag(tagFilter: ((tag: BattlerTag) => boolean)) { + findTag(tagFilter: (tag: BattlerTag) => boolean) { if (!this.summonData) { return null; } return this.summonData.tags.find(t => tagFilter(t)); } - findTags(tagFilter: ((tag: BattlerTag) => boolean)): BattlerTag[] { + findTags(tagFilter: (tag: BattlerTag) => boolean): BattlerTag[] { if (!this.summonData) { return []; } @@ -2990,9 +4810,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } lapseTag(tagType: BattlerTagType): boolean { + if (!this.summonData) { + return false; + } const tags = this.summonData.tags; const tag = tags.find(t => t.tagType === tagType); - if (tag && !(tag.lapse(this, BattlerTagLapseType.CUSTOM))) { + if (tag && !tag.lapse(this, BattlerTagLapseType.CUSTOM)) { tag.onRemove(this); tags.splice(tags.indexOf(tag), 1); } @@ -3000,14 +4823,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } lapseTags(lapseType: BattlerTagLapseType): void { + if (!this.summonData) { + return; + } const tags = this.summonData.tags; - tags.filter(t => lapseType === BattlerTagLapseType.FAINT || ((t.lapseTypes.some(lType => lType === lapseType)) && !(t.lapse(this, lapseType)))).forEach(t => { - t.onRemove(this); - tags.splice(tags.indexOf(t), 1); - }); + tags + .filter( + t => + lapseType === BattlerTagLapseType.FAINT || + (t.lapseTypes.some(lType => lType === lapseType) && + !t.lapse(this, lapseType)), + ) + .forEach(t => { + t.onRemove(this); + tags.splice(tags.indexOf(t), 1); + }); } removeTag(tagType: BattlerTagType): boolean { + if (!this.summonData) { + return false; + } const tags = this.summonData.tags; const tag = tags.find(t => t.tagType === tagType); if (tag) { @@ -3017,7 +4853,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return !!tag; } - findAndRemoveTags(tagFilter: ((tag: BattlerTag) => boolean)): boolean { + findAndRemoveTags(tagFilter: (tag: BattlerTag) => boolean): boolean { if (!this.summonData) { return false; } @@ -3031,16 +4867,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return true; } - removeTagsBySourceId(sourceId: integer): void { + removeTagsBySourceId(sourceId: number): void { this.findAndRemoveTags(t => t.isSourceLinked() && t.sourceId === sourceId); } - transferTagsBySourceId(sourceId: integer, newSourceId: integer): void { + transferTagsBySourceId(sourceId: number, newSourceId: number): void { if (!this.summonData) { return; } const tags = this.summonData.tags; - tags.filter(t => t.sourceId === sourceId).forEach(t => t.sourceId = newSourceId); + tags + .filter(t => t.sourceId === sourceId) + .forEach(t => (t.sourceId = newSourceId)); } /** @@ -3051,14 +4889,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Copy all stat stages for (const s of BATTLE_STATS) { const sourceStage = source.getStatStage(s); - if ((this instanceof PlayerPokemon) && (sourceStage === 6)) { - this.scene.validateAchv(achvs.TRANSFER_MAX_STAT_STAGE); + if (this instanceof PlayerPokemon && sourceStage === 6) { + globalScene.validateAchv(achvs.TRANSFER_MAX_STAT_STAGE); } this.setStatStage(s, sourceStage); } for (const tag of source.summonData.tags) { - if (!tag.isBatonPassable) { + if ( + !tag.isBatonPassable || + (tag.tagType === BattlerTagType.TELEKINESIS && + this.species.speciesId === Species.GENGAR && + this.getFormKey() === "mega") + ) { continue; } @@ -3095,10 +4938,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * * @see {@linkcode MoveRestrictionBattlerTag} */ - isMoveTargetRestricted(moveId: Moves, user: Pokemon, target: Pokemon): boolean { - for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) { - if ((tag as MoveRestrictionBattlerTag).isMoveTargetRestricted(moveId, user, target)) { - return (tag as MoveRestrictionBattlerTag !== null); + isMoveTargetRestricted( + moveId: Moves, + user: Pokemon, + target: Pokemon, + ): boolean { + for (const tag of this.findTags( + t => t instanceof MoveRestrictionBattlerTag, + )) { + if ( + (tag as MoveRestrictionBattlerTag).isMoveTargetRestricted( + moveId, + user, + target, + ) + ) { + return (tag as MoveRestrictionBattlerTag) !== null; } } return false; @@ -3112,32 +4967,63 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param {Pokemon} target {@linkcode Pokemon} the target of the move, optional and used when the target is a factor in the move's restricted status * @returns {MoveRestrictionBattlerTag | null} the first tag on this Pokemon that restricts the move, or `null` if the move is not restricted. */ - getRestrictingTag(moveId: Moves, user?: Pokemon, target?: Pokemon): MoveRestrictionBattlerTag | null { - for (const tag of this.findTags(t => t instanceof MoveRestrictionBattlerTag)) { + getRestrictingTag( + moveId: Moves, + user?: Pokemon, + target?: Pokemon, + ): MoveRestrictionBattlerTag | null { + for (const tag of this.findTags( + t => t instanceof MoveRestrictionBattlerTag, + )) { if ((tag as MoveRestrictionBattlerTag).isMoveRestricted(moveId, user)) { return tag as MoveRestrictionBattlerTag; - } else if (user && target && (tag as MoveRestrictionBattlerTag).isMoveTargetRestricted(moveId, user, target)) { + } + if ( + user && + target && + (tag as MoveRestrictionBattlerTag).isMoveTargetRestricted( + moveId, + user, + target, + ) + ) { return tag as MoveRestrictionBattlerTag; } } return null; } - getMoveHistory(): TurnMove[] { + public getMoveHistory(): TurnMove[] { return this.battleSummonData.moveHistory; } - pushMoveHistory(turnMove: TurnMove) { - turnMove.turn = this.scene.currentBattle?.turn; + public pushMoveHistory(turnMove: TurnMove): void { + if (!this.isOnField()) { + return; + } + turnMove.turn = globalScene.currentBattle?.turn; this.getMoveHistory().push(turnMove); } - getLastXMoves(turnCount: integer = 0): TurnMove[] { + /** + * Returns a list of the most recent move entries in this Pokemon's move history. + * The retrieved move entries are sorted in order from NEWEST to OLDEST. + * @param moveCount The number of move entries to retrieve. + * If negative, retrieve the Pokemon's entire move history (equivalent to reversing the output of {@linkcode getMoveHistory()}). + * Default is `1`. + * @returns A list of {@linkcode TurnMove}, as specified above. + */ + getLastXMoves(moveCount = 1): TurnMove[] { const moveHistory = this.getMoveHistory(); - return moveHistory.slice(turnCount >= 0 ? Math.max(moveHistory.length - (turnCount || 1), 0) : 0, moveHistory.length).reverse(); + if (moveCount >= 0) { + return moveHistory + .slice(Math.max(moveHistory.length - moveCount, 0)) + .reverse(); + } + return moveHistory.slice(0).reverse(); } - getMoveQueue(): QueuedMove[] { + getMoveQueue(): TurnMove[] { return this.summonData.moveQueue; } @@ -3146,43 +5032,73 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param {Pokemon} target If specified, this only cancels subsequent strikes against the given target */ stopMultiHit(target?: Pokemon): void { - const effectPhase = this.scene.getCurrentPhase(); - if (effectPhase instanceof MoveEffectPhase && effectPhase.getUserPokemon() === this) { + const effectPhase = globalScene.getCurrentPhase(); + if ( + effectPhase instanceof MoveEffectPhase && + effectPhase.getUserPokemon() === this + ) { effectPhase.stopMultiHit(target); } } changeForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { - this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); + this.formIndex = Math.max( + this.species.forms.findIndex(f => f.formKey === formChange.formKey), + 0, + ); this.generateName(); const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount) {// Shouldn't happen + if (this.abilityIndex >= abilityCount) { + // Shouldn't happen this.abilityIndex = abilityCount - 1; } - this.scene.gameData.setPokemonSeen(this, false); + globalScene.gameData.setPokemonSeen(this, false); this.setScale(this.getSpriteScale()); this.loadAssets().then(() => { this.calculateStats(); - this.scene.updateModifiers(this.isPlayer(), true); - Promise.all([ this.updateInfo(), this.scene.updateFieldScale() ]).then(() => resolve()); + globalScene.updateModifiers(this.isPlayer(), true); + Promise.all([this.updateInfo(), globalScene.updateFieldScale()]).then( + () => resolve(), + ); }); }); } - cry(soundConfig?: Phaser.Types.Sound.SoundConfig, sceneOverride?: BattleScene): AnySound { - const scene = sceneOverride || this.scene; - const cry = this.getSpeciesForm().cry(scene, soundConfig); + cry( + soundConfig?: Phaser.Types.Sound.SoundConfig, + sceneOverride?: BattleScene, + ): AnySound { + const scene = sceneOverride ?? globalScene; // TODO: is `sceneOverride` needed? + const cry = this.getSpeciesForm().cry(soundConfig); let duration = cry.totalDuration * 1000; - if (this.fusionSpecies && this.getSpeciesForm() !== this.getFusionSpeciesForm()) { - let fusionCry = this.getFusionSpeciesForm().cry(scene, soundConfig, true); + if ( + this.fusionSpecies && + this.getSpeciesForm() !== this.getFusionSpeciesForm() + ) { + let fusionCry = this.getFusionSpeciesForm().cry(soundConfig, true); duration = Math.min(duration, fusionCry.totalDuration * 1000); fusionCry.destroy(); scene.time.delayedCall(Utils.fixedInt(Math.ceil(duration * 0.4)), () => { try { - SoundFade.fadeOut(scene, cry, Utils.fixedInt(Math.ceil(duration * 0.2))); - fusionCry = this.getFusionSpeciesForm().cry(scene, Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0) }, soundConfig)); - SoundFade.fadeIn(scene, fusionCry, Utils.fixedInt(Math.ceil(duration * 0.2)), scene.masterVolume * scene.seVolume, 0); + SoundFade.fadeOut( + scene, + cry, + Utils.fixedInt(Math.ceil(duration * 0.2)), + ); + fusionCry = this.getFusionSpeciesForm().cry( + Object.assign( + { seek: Math.max(fusionCry.totalDuration * 0.4, 0) }, + soundConfig, + ), + ); + SoundFade.fadeIn( + scene, + fusionCry, + Utils.fixedInt(Math.ceil(duration * 0.2)), + scene.masterVolume * scene.fieldVolume, + 0, + ); } catch (err) { console.error(err); } @@ -3192,19 +5108,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return cry; } + // biome-ignore lint: there are a ton of issues.. faintCry(callback: Function): void { - if (this.fusionSpecies && this.getSpeciesForm() !== this.getFusionSpeciesForm()) { + if ( + this.fusionSpecies && + this.getSpeciesForm() !== this.getFusionSpeciesForm() + ) { return this.fusionFaintCry(callback); } - const key = `cry/${this.species.getCryKey(this.formIndex)}`; - //eslint-disable-next-line @typescript-eslint/no-unused-vars - let i = 0; + const key = this.species.getCryKey(this.formIndex); let rate = 0.85; - const cry = this.scene.playSound(key, { rate: rate }) as AnySound; + const cry = globalScene.playSound(key, { rate: rate }) as AnySound; + if (!cry || globalScene.fieldVolume === 0) { + return callback(); + } const sprite = this.getSprite(); const tintSprite = this.getTintSprite(); - const delay = Math.max(this.scene.sound.get(key).totalDuration * 50, 25); + const delay = Math.max(globalScene.sound.get(key).totalDuration * 50, 25); let frameProgress = 0; let frameThreshold: number; @@ -3212,36 +5133,36 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { sprite.anims.pause(); tintSprite?.anims.pause(); - let faintCryTimer : Phaser.Time.TimerEvent | null = this.scene.time.addEvent({ - delay: Utils.fixedInt(delay), - repeat: -1, - callback: () => { - ++i; - frameThreshold = sprite.anims.msPerFrame / rate; - frameProgress += delay; - while (frameProgress > frameThreshold) { - if (sprite.anims.duration) { - sprite.anims.nextFrame(); - tintSprite?.anims.nextFrame(); + let faintCryTimer: Phaser.Time.TimerEvent | null = + globalScene.time.addEvent({ + delay: Utils.fixedInt(delay), + repeat: -1, + callback: () => { + frameThreshold = sprite.anims.msPerFrame / rate; + frameProgress += delay; + while (frameProgress > frameThreshold) { + if (sprite.anims.duration) { + sprite.anims.nextFrame(); + tintSprite?.anims.nextFrame(); + } + frameProgress -= frameThreshold; } - frameProgress -= frameThreshold; - } - if (cry && !cry.pendingRemove) { - rate *= 0.99; - cry.setRate(rate); - } else { - faintCryTimer?.destroy(); - faintCryTimer = null; - if (callback) { - callback(); + if (cry && !cry.pendingRemove) { + rate *= 0.99; + cry.setRate(rate); + } else { + faintCryTimer?.destroy(); + faintCryTimer = null; + if (callback) { + callback(); + } } - } - } - }); + }, + }); // Failsafe - this.scene.time.delayedCall(Utils.fixedInt(3000), () => { - if (!faintCryTimer || !this.scene) { + globalScene.time.delayedCall(Utils.fixedInt(3000), () => { + if (!faintCryTimer || !globalScene) { return; } if (cry?.isPlaying) { @@ -3254,21 +5175,26 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } + // biome-ignore lint/complexity/noBannedTypes: Consider refactoring to change type of Function private fusionFaintCry(callback: Function): void { - const key = `cry/${this.species.getCryKey(this.formIndex)}`; + const key = this.species.getCryKey(this.formIndex); let i = 0; let rate = 0.85; - const cry = this.scene.playSound(key, { rate: rate }) as AnySound; + const cry = globalScene.playSound(key, { rate: rate }) as AnySound; const sprite = this.getSprite(); const tintSprite = this.getTintSprite(); let duration = cry.totalDuration * 1000; - const fusionCryKey = `cry/${this.fusionSpecies?.getCryKey(this.fusionFormIndex)}`; - let fusionCry = this.scene.playSound(fusionCryKey, { rate: rate }) as AnySound; + const fusionCryKey = this.fusionSpecies!.getCryKey(this.fusionFormIndex); + let fusionCry = globalScene.playSound(fusionCryKey, { + rate: rate, + }) as AnySound; + if (!cry || !fusionCry || globalScene.fieldVolume === 0) { + return callback(); + } fusionCry.stop(); duration = Math.min(duration, fusionCry.totalDuration * 1000); fusionCry.destroy(); - const delay = Math.max(duration * 0.05, 25); let transitionIndex = 0; @@ -3292,45 +5218,65 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { sprite.anims.pause(); tintSprite?.anims.pause(); - let faintCryTimer: Phaser.Time.TimerEvent | null = this.scene.time.addEvent({ - delay: Utils.fixedInt(delay), - repeat: -1, - callback: () => { - ++i; - frameThreshold = sprite.anims.msPerFrame / rate; - frameProgress += delay; - while (frameProgress > frameThreshold) { - if (sprite.anims.duration) { - sprite.anims.nextFrame(); - tintSprite?.anims.nextFrame(); + let faintCryTimer: Phaser.Time.TimerEvent | null = + globalScene.time.addEvent({ + delay: Utils.fixedInt(delay), + repeat: -1, + callback: () => { + ++i; + frameThreshold = sprite.anims.msPerFrame / rate; + frameProgress += delay; + while (frameProgress > frameThreshold) { + if (sprite.anims.duration) { + sprite.anims.nextFrame(); + tintSprite?.anims.nextFrame(); + } + frameProgress -= frameThreshold; } - frameProgress -= frameThreshold; - } - if (i === transitionIndex) { - SoundFade.fadeOut(this.scene, cry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2))); - fusionCry = this.scene.playSound(fusionCryKey, Object.assign({ seek: Math.max(fusionCry.totalDuration * 0.4, 0), rate: rate })); - SoundFade.fadeIn(this.scene, fusionCry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), this.scene.masterVolume * this.scene.seVolume, 0); - } - rate *= 0.99; - if (cry && !cry.pendingRemove) { - cry.setRate(rate); - } - if (fusionCry && !fusionCry.pendingRemove) { - fusionCry.setRate(rate); - } - if ((!cry || cry.pendingRemove) && (!fusionCry || fusionCry.pendingRemove)) { - faintCryTimer?.destroy(); - faintCryTimer = null; - if (callback) { - callback(); + if (i === transitionIndex && fusionCryKey) { + SoundFade.fadeOut( + globalScene, + cry, + Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), + ); + fusionCry = globalScene.playSound( + fusionCryKey, + Object.assign({ + seek: Math.max(fusionCry.totalDuration * 0.4, 0), + rate: rate, + }), + ); + SoundFade.fadeIn( + globalScene, + fusionCry, + Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), + globalScene.masterVolume * globalScene.fieldVolume, + 0, + ); } - } - } - }); + rate *= 0.99; + if (cry && !cry.pendingRemove) { + cry.setRate(rate); + } + if (fusionCry && !fusionCry.pendingRemove) { + fusionCry.setRate(rate); + } + if ( + (!cry || cry.pendingRemove) && + (!fusionCry || fusionCry.pendingRemove) + ) { + faintCryTimer?.destroy(); + faintCryTimer = null; + if (callback) { + callback(); + } + } + }, + }); // Failsafe - this.scene.time.delayedCall(Utils.fixedInt(3000), () => { - if (!faintCryTimer || !this.scene) { + globalScene.time.delayedCall(Utils.fixedInt(3000), () => { + if (!faintCryTimer || !globalScene) { return; } if (cry?.isPlaying) { @@ -3347,20 +5293,47 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } isOppositeGender(pokemon: Pokemon): boolean { - return this.gender !== Gender.GENDERLESS && pokemon.gender === (this.gender === Gender.MALE ? Gender.FEMALE : Gender.MALE); + 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 = false, + overrideStatus = false, + sourcePokemon: Pokemon | null = null, + ignoreField = 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 && + globalScene.arena.terrain?.terrainType === TerrainType.MISTY + ) { return false; } } - if (sourcePokemon && sourcePokemon !== this && this.isSafeguarded(sourcePokemon)) { + if ( + sourcePokemon && + sourcePokemon !== this && + this.isSafeguarded(sourcePokemon) + ) { return false; } @@ -3369,17 +5342,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { switch (effect) { case StatusEffect.POISON: case StatusEffect.TOXIC: - // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity + // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity const poisonImmunity = types.map(defType => { - // Check if the Pokemon is not immune to Poison/Toxic - if (defType !== Type.POISON && defType !== Type.STEEL) { + // Check if the Pokemon is not immune to Poison/Toxic + if (defType !== PokemonType.POISON && defType !== PokemonType.STEEL) { return false; } // Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity const cancelImmunity = new Utils.BooleanHolder(false); if (sourcePokemon) { - applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, false, effect, defType); + applyAbAttrs( + IgnoreTypeStatusEffectImmunityAbAttr, + sourcePokemon, + cancelImmunity, + false, + effect, + defType, + ); if (cancelImmunity.value) { return false; } @@ -3388,39 +5368,63 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return true; }); - if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL)) { + if (this.isOfType(PokemonType.POISON) || this.isOfType(PokemonType.STEEL)) { if (poisonImmunity.includes(true)) { return false; } } break; case StatusEffect.PARALYSIS: - if (this.isOfType(Type.ELECTRIC)) { + if (this.isOfType(PokemonType.ELECTRIC)) { return false; } break; case StatusEffect.SLEEP: - if (this.isGrounded() && this.scene.arena.terrain?.terrainType === TerrainType.ELECTRIC) { + if ( + this.isGrounded() && + globalScene.arena.terrain?.terrainType === TerrainType.ELECTRIC + ) { return false; } 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(PokemonType.ICE) || + (!ignoreField && + globalScene?.arena?.weather?.weatherType && + [WeatherType.SUNNY, WeatherType.HARSH_SUN].includes( + globalScene.arena.weather.weatherType, + )) + ) { return false; } break; case StatusEffect.BURN: - if (this.isOfType(Type.FIRE)) { + if (this.isOfType(PokemonType.FIRE)) { return false; } break; } const cancelled = new Utils.BooleanHolder(false); - applyPreSetStatusAbAttrs(StatusEffectImmunityAbAttr, this, effect, cancelled, quiet); + applyPreSetStatusAbAttrs( + StatusEffectImmunityAbAttr, + this, + effect, + cancelled, + quiet, + ); const userField = this.getAlliedField(); - userField.forEach(pokemon => applyPreSetStatusAbAttrs(UserFieldStatusEffectImmunityAbAttr, pokemon, effect, cancelled, quiet)); + userField.forEach(pokemon => + applyPreSetStatusAbAttrs( + UserFieldStatusEffectImmunityAbAttr, + pokemon, + effect, + cancelled, + quiet, + ), + ); if (cancelled.value) { return false; @@ -3429,10 +5433,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return true; } - trySetStatus(effect?: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon | null = null, turnsRemaining: number = 0, sourceText: string | null = null): boolean { + trySetStatus( + effect?: StatusEffect, + asPhase = false, + sourcePokemon: Pokemon | null = null, + turnsRemaining = 0, + sourceText: string | null = null, + ): boolean { if (!this.canSetStatus(effect, asPhase, false, sourcePokemon)) { return false; } + if (this.isFainted() && effect !== StatusEffect.FAINT) { + return false; + } /** * If this Pokemon falls asleep or freezes in the middle of a multi-hit attack, @@ -3443,7 +5456,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (asPhase) { - this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, turnsRemaining, sourceText, sourcePokemon)); + globalScene.unshiftPhase( + new ObtainStatusEffectPhase( + this.getBattlerIndex(), + effect, + turnsRemaining, + sourceText, + sourcePokemon, + ), + ); return true; } @@ -3459,10 +5480,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { BattlerTagType.UNDERGROUND, BattlerTagType.UNDERWATER, BattlerTagType.HIDDEN, - BattlerTagType.FLYING + BattlerTagType.FLYING, ]; - const tag = invulnerableTags.find((t) => this.getTag(t)); + const tag = invulnerableTags.find(t => this.getTag(t)); if (tag) { this.removeTag(tag); @@ -3475,27 +5496,36 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.status = new Status(effect, 0, sleepTurnsRemaining?.value); if (effect !== StatusEffect.FAINT) { - this.scene.triggerPokemonFormChange(this, SpeciesFormChangeStatusEffectTrigger, true); - applyPostSetStatusAbAttrs(PostSetStatusAbAttr, this, effect, sourcePokemon); + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangeStatusEffectTrigger, + true, + ); + applyPostSetStatusAbAttrs( + PostSetStatusAbAttr, + this, + effect, + sourcePokemon, + ); } return true; } /** - * Resets the status of a pokemon. - * @param revive Whether revive should be cured; defaults to true. - * @param confusion Whether resetStatus should include confusion or not; defaults to false. - * @param reloadAssets Whether to reload the assets or not; defaults to false. - */ - resetStatus(revive: boolean = true, confusion: boolean = false, reloadAssets: boolean = false): void { + * Resets the status of a pokemon. + * @param revive Whether revive should be cured; defaults to true. + * @param confusion Whether resetStatus should include confusion or not; defaults to false. + * @param reloadAssets Whether to reload the assets or not; defaults to false. + */ + resetStatus(revive = true, confusion = false, reloadAssets = false): void { const lastStatus = this.status?.effect; if (!revive && lastStatus === StatusEffect.FAINT) { return; } this.status = null; if (lastStatus === StatusEffect.SLEEP) { - this.setFrameRate(12); + this.setFrameRate(10); if (this.getTag(BattlerTagType.NIGHTMARE)) { this.lapseTag(BattlerTagType.NIGHTMARE); } @@ -3516,8 +5546,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns `true` if this Pokemon is protected by Safeguard; `false` otherwise. */ isSafeguarded(attacker: Pokemon): boolean { - const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - if (this.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, defendingSide)) { + const defendingSide = this.isPlayer() + ? ArenaTagSide.PLAYER + : ArenaTagSide.ENEMY; + if (globalScene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, defendingSide)) { const bypassed = new Utils.BooleanHolder(false); if (attacker) { applyAbAttrs(InfiltratorAbAttr, attacker, null, false, bypassed); @@ -3550,9 +5582,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } // If this Pokemon has a Substitute when loading in, play an animation to add its sprite if (this.getTag(SubstituteTag)) { - this.scene.triggerPokemonBattleAnim(this, PokemonAnimType.SUBSTITUTE_ADD); + globalScene.triggerPokemonBattleAnim( + this, + PokemonAnimType.SUBSTITUTE_ADD, + ); this.getTag(SubstituteTag)!.sourceInFocus = false; } + + // If this Pokemon has Commander and Dondozo as an active ally, hide this Pokemon's sprite. + if ( + this.hasAbilityWithAttr(CommanderAbAttr) && + globalScene.currentBattle.double && + this.getAlly()?.species.speciesId === Species.DONDOZO + ) { + this.setVisible(false); + } this.summonDataPrimer = null; } this.updateInfo(); @@ -3567,8 +5611,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.getTag(BattlerTagType.SEEDED)) { this.lapseTag(BattlerTagType.SEEDED); } - if (this.scene) { - this.scene.triggerPokemonFormChange(this, SpeciesFormChangePostMoveTrigger, true); + if (globalScene) { + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangePostMoveTrigger, + true, + ); + } + } + + resetTera(): void { + const wasTerastallized = this.isTerastallized; + this.isTerastallized = false; + this.stellarTypesBoosted = []; + if (wasTerastallized) { + this.updateSpritePipelineData(); + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangeLapseTeraTrigger, + ); } } @@ -3576,18 +5637,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.turnData = new PokemonTurnData(); } - getExpValue(): integer { + getExpValue(): number { // Logic to factor in victor level has been removed for balancing purposes, so the player doesn't have to focus on EXP maxxing - return ((this.getSpeciesForm().getBaseExp() * this.level) / 5 + 1); + return (this.getSpeciesForm().getBaseExp() * this.level) / 5 + 1; } - setFrameRate(frameRate: integer) { - this.scene.anims.get(this.getBattleSpriteKey()).frameRate = frameRate; - this.getSprite().play(this.getBattleSpriteKey()); - this.getTintSprite()?.play(this.getBattleSpriteKey()); + setFrameRate(frameRate: number) { + globalScene.anims.get(this.getBattleSpriteKey()).frameRate = frameRate; + 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) { + tint(color: number, alpha?: number, duration?: number, ease?: string) { const tintSprite = this.getTintSprite(); tintSprite?.setTintFill(color); tintSprite?.setVisible(true); @@ -3595,22 +5670,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (duration) { tintSprite?.setAlpha(0); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: tintSprite, alpha: alpha || 1, duration: duration, - ease: ease || "Linear" + ease: ease || "Linear", }); } else { tintSprite?.setAlpha(alpha); } } - untint(duration: integer, ease?: string) { + untint(duration: number, ease?: string) { const tintSprite = this.getTintSprite(); if (duration) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: tintSprite, alpha: 0, duration: duration, @@ -3618,7 +5693,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { onComplete: () => { tintSprite?.setVisible(false); tintSprite?.setAlpha(1); - } + }, }); } else { tintSprite?.setVisible(false); @@ -3630,9 +5705,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.maskEnabled) { this.maskSprite = this.getTintSprite(); this.maskSprite?.setVisible(true); - this.maskSprite?.setPosition(this.x * this.parentContainer.scale + this.parentContainer.x, - this.y * this.parentContainer.scale + this.parentContainer.y); - this.maskSprite?.setScale(this.getSpriteScale() * this.parentContainer.scale); + this.maskSprite?.setPosition( + this.x * this.parentContainer.scale + this.parentContainer.x, + this.y * this.parentContainer.scale + this.parentContainer.y, + ); + this.maskSprite?.setScale( + this.getSpriteScale() * this.parentContainer.scale, + ); this.maskEnabled = true; } } @@ -3649,81 +5728,147 @@ 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.shinySparkle, this.variant); } } updateFusionPalette(ignoreOveride?: boolean): void { if (!this.getFusionSpeciesForm(ignoreOveride)) { - [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => { - s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = []; - s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = []; - }); + [this.getSprite(), this.getTintSprite()] + .filter(s => !!s) + .map(s => { + s.pipelineData[ + `spriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}` + ] = []; + s.pipelineData[ + `fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}` + ] = []; + }); return; } const speciesForm = this.getSpeciesForm(ignoreOveride); const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOveride); - const spriteKey = speciesForm.getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant); - const backSpriteKey = speciesForm.getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant).replace("pkmn__", "pkmn__back__"); - const fusionSpriteKey = fusionSpeciesForm.getSpriteKey(this.getFusionGender(ignoreOveride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny, this.fusionVariant); - const fusionBackSpriteKey = fusionSpeciesForm.getSpriteKey(this.getFusionGender(ignoreOveride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny, this.fusionVariant).replace("pkmn__", "pkmn__back__"); + const spriteKey = speciesForm.getSpriteKey( + this.getGender(ignoreOveride) === Gender.FEMALE, + speciesForm.formIndex, + this.shiny, + this.variant, + ); + const backSpriteKey = speciesForm + .getSpriteKey( + this.getGender(ignoreOveride) === Gender.FEMALE, + speciesForm.formIndex, + this.shiny, + this.variant, + ) + .replace("pkmn__", "pkmn__back__"); + const fusionSpriteKey = fusionSpeciesForm.getSpriteKey( + this.getFusionGender(ignoreOveride) === Gender.FEMALE, + fusionSpeciesForm.formIndex, + this.fusionShiny, + this.fusionVariant, + ); + const fusionBackSpriteKey = fusionSpeciesForm + .getSpriteKey( + this.getFusionGender(ignoreOveride) === Gender.FEMALE, + fusionSpeciesForm.formIndex, + this.fusionShiny, + this.fusionVariant, + ) + .replace("pkmn__", "pkmn__back__"); - const sourceTexture = this.scene.textures.get(spriteKey); - const sourceBackTexture = this.scene.textures.get(backSpriteKey); - const fusionTexture = this.scene.textures.get(fusionSpriteKey); - const fusionBackTexture = this.scene.textures.get(fusionBackSpriteKey); + const sourceTexture = globalScene.textures.get(spriteKey); + const sourceBackTexture = globalScene.textures.get(backSpriteKey); + const fusionTexture = globalScene.textures.get(fusionSpriteKey); + const fusionBackTexture = globalScene.textures.get(fusionBackSpriteKey); - const [ sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(texture => texture.frames[texture.firstFrame]); - const [ sourceImage, sourceBackImage, fusionImage, fusionBackImage ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(i => i.getSourceImage() as HTMLImageElement); + const [sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame] = [ + sourceTexture, + sourceBackTexture, + fusionTexture, + fusionBackTexture, + ].map(texture => texture.frames[texture.firstFrame]); + const [sourceImage, sourceBackImage, fusionImage, fusionBackImage] = [ + sourceTexture, + sourceBackTexture, + fusionTexture, + fusionBackTexture, + ].map(i => i.getSourceImage() as HTMLImageElement); const canvas = document.createElement("canvas"); const backCanvas = document.createElement("canvas"); const fusionCanvas = document.createElement("canvas"); const fusionBackCanvas = document.createElement("canvas"); - const spriteColors: integer[][] = []; + const spriteColors: number[][] = []; const pixelData: Uint8ClampedArray[] = []; - [ canvas, backCanvas, fusionCanvas, fusionBackCanvas ].forEach((canv: HTMLCanvasElement, c: integer) => { - const context = canv.getContext("2d"); - const frame = [ sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame ][c]; - canv.width = frame.width; - canv.height = frame.height; + [canvas, backCanvas, fusionCanvas, fusionBackCanvas].forEach( + (canv: HTMLCanvasElement, c: number) => { + const context = canv.getContext("2d"); + const frame = [ + sourceFrame, + sourceBackFrame, + fusionFrame, + fusionBackFrame, + ][c]; + canv.width = frame.width; + canv.height = frame.height; - if (context) { - context.drawImage([ sourceImage, sourceBackImage, fusionImage, fusionBackImage ][c], frame.cutX, frame.cutY, frame.width, frame.height, 0, 0, frame.width, frame.height); - const imageData = context.getImageData(frame.cutX, frame.cutY, frame.width, frame.height); - pixelData.push(imageData.data); - } - }); + if (context) { + context.drawImage( + [sourceImage, sourceBackImage, fusionImage, fusionBackImage][c], + frame.cutX, + frame.cutY, + frame.width, + frame.height, + 0, + 0, + frame.width, + frame.height, + ); + const imageData = context.getImageData( + frame.cutX, + frame.cutY, + frame.width, + frame.height, + ); + pixelData.push(imageData.data); + } + }, + ); for (let f = 0; f < 2; f++) { const variantColors = variantColorCache[!f ? spriteKey : backSpriteKey]; - const variantColorSet = new Map(); + const variantColorSet = new Map(); if (this.shiny && variantColors && variantColors[this.variant]) { Object.keys(variantColors[this.variant]).forEach(k => { - variantColorSet.set(Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), Array.from(Object.values(Utils.rgbHexToRgba(variantColors[this.variant][k])))); + variantColorSet.set( + Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), + Array.from( + Object.values(Utils.rgbHexToRgba(variantColors[this.variant][k])), + ), + ); }); } for (let i = 0; i < pixelData[f].length; i += 4) { if (pixelData[f][i + 3]) { const pixel = pixelData[f].slice(i, i + 4); - let [ r, g, b, a ] = pixel; + let [r, g, b, a] = pixel; if (variantColors) { - const color = Utils.rgbaToInt([ r, g, b, a ]); + const color = Utils.rgbaToInt([r, g, b, a]); if (variantColorSet.has(color)) { const mappedPixel = variantColorSet.get(color); if (mappedPixel) { - [ r, g, b, a ] = mappedPixel; + [r, g, b, a] = mappedPixel; } } } if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { - spriteColors.push([ r, g, b, a ]); + spriteColors.push([r, g, b, a]); } } } @@ -3734,35 +5879,63 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const pixelColors: number[] = []; for (let f = 0; f < 2; f++) { for (let i = 0; i < pixelData[f].length; i += 4) { - const total = pixelData[f].slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); + const total = pixelData[f] + .slice(i, i + 3) + .reduce((total: number, value: number) => total + value, 0); if (!total) { continue; } - pixelColors.push(argbFromRgba({ r: pixelData[f][i], g: pixelData[f][i + 1], b: pixelData[f][i + 2], a: pixelData[f][i + 3] })); + pixelColors.push( + argbFromRgba({ + r: pixelData[f][i], + g: pixelData[f][i + 1], + b: pixelData[f][i + 2], + a: pixelData[f][i + 3], + }), + ); } } - const fusionPixelColors : number[] = []; + const fusionPixelColors: number[] = []; for (let f = 0; f < 2; f++) { - const variantColors = variantColorCache[!f ? fusionSpriteKey : fusionBackSpriteKey]; - const variantColorSet = new Map(); - if (this.fusionShiny && variantColors && variantColors[this.fusionVariant]) { - Object.keys(variantColors[this.fusionVariant]).forEach(k => { - variantColorSet.set(Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), Array.from(Object.values(Utils.rgbHexToRgba(variantColors[this.fusionVariant][k])))); - }); + const variantColors = + variantColorCache[!f ? fusionSpriteKey : fusionBackSpriteKey]; + const variantColorSet = new Map(); + if ( + this.fusionShiny && + variantColors && + variantColors[this.fusionVariant] + ) { + for (const k of Object.keys(variantColors[this.fusionVariant])) { + variantColorSet.set( + Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), + Array.from( + Object.values( + Utils.rgbHexToRgba(variantColors[this.fusionVariant][k]), + ), + ), + ); + } } for (let i = 0; i < pixelData[2 + f].length; i += 4) { - const total = pixelData[2 + f].slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); + const total = pixelData[2 + f] + .slice(i, i + 3) + .reduce((total: number, value: number) => total + value, 0); if (!total) { continue; } - let [ r, g, b, a ] = [ pixelData[2 + f][i], pixelData[2 + f][i + 1], pixelData[2 + f][i + 2], pixelData[2 + f][i + 3] ]; + let [r, g, b, a] = [ + pixelData[2 + f][i], + pixelData[2 + f][i + 1], + pixelData[2 + f][i + 2], + pixelData[2 + f][i + 3], + ]; if (variantColors) { - const color = Utils.rgbaToInt([ r, g, b, a ]); + const color = Utils.rgbaToInt([r, g, b, a]); if (variantColorSet.has(color)) { const mappedPixel = variantColorSet.get(color); if (mappedPixel) { - [ r, g, b, a ] = mappedPixel; + [r, g, b, a] = mappedPixel; } } } @@ -3770,40 +5943,57 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + if (fusionPixelColors.length === 0) { + // ERROR HANDLING IS NOT OPTIONAL BUDDY + console.log("Failed to create fusion palette"); + return; + } + let paletteColors: Map; let fusionPaletteColors: Map; const originalRandom = Math.random; Math.random = () => Phaser.Math.RND.realInRange(0, 1); - this.scene.executeWithSeedOffset(() => { - paletteColors = QuantizerCelebi.quantize(pixelColors, 4); - fusionPaletteColors = QuantizerCelebi.quantize(fusionPixelColors, 4); - }, 0, "This result should not vary"); + globalScene.executeWithSeedOffset( + () => { + paletteColors = QuantizerCelebi.quantize(pixelColors, 4); + fusionPaletteColors = QuantizerCelebi.quantize(fusionPixelColors, 4); + }, + 0, + "This result should not vary", + ); Math.random = originalRandom; - paletteColors = paletteColors!; // tell TS compiler that paletteColors is defined! - fusionPaletteColors = fusionPaletteColors!; // TS compiler that fusionPaletteColors is defined! - const [ palette, fusionPalette ] = [ paletteColors, fusionPaletteColors ] - .map(paletteColors => { - let keys = Array.from(paletteColors.keys()).sort((a: integer, b: integer) => paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1); - let rgbaColors: Map; + paletteColors = paletteColors!; // erroneously tell TS compiler that paletteColors is defined! + fusionPaletteColors = fusionPaletteColors!; // mischievously misinform TS compiler that fusionPaletteColors is defined! + const [palette, fusionPalette] = [paletteColors, fusionPaletteColors].map( + paletteColors => { + let keys = Array.from(paletteColors.keys()).sort( + (a: number, b: number) => + paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1, + ); + let rgbaColors: Map; let hsvColors: Map; - const mappedColors = new Map(); + const mappedColors = new Map(); do { mappedColors.clear(); - rgbaColors = keys.reduce((map: Map, k: number) => { - map.set(k, Object.values(rgbaFromArgb(k))); return map; - }, new Map()); - hsvColors = Array.from(rgbaColors.keys()).reduce((map: Map, k: number) => { - const rgb = rgbaColors.get(k)!.slice(0, 3); - map.set(k, Utils.rgbToHsv(rgb[0], rgb[1], rgb[2])); + rgbaColors = keys.reduce((map: Map, k: number) => { + map.set(k, Object.values(rgbaFromArgb(k))); return map; }, new Map()); + hsvColors = Array.from(rgbaColors.keys()).reduce( + (map: Map, k: number) => { + const rgb = rgbaColors.get(k)!.slice(0, 3); + map.set(k, Utils.rgbToHsv(rgb[0], rgb[1], rgb[2])); + return map; + }, + new Map(), + ); for (let c = keys.length - 1; c >= 0; c--) { const hsv = hsvColors.get(keys[c])!; @@ -3814,14 +6004,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (mappedColors.has(keys[c])) { mappedColors.get(keys[c])!.push(keys[c2]); } else { - mappedColors.set(keys[c], [ keys[c2] ]); + mappedColors.set(keys[c], [keys[c2]]); } break; } } } - mappedColors.forEach((values: integer[], key: integer) => { + mappedColors.forEach((values: number[], key: number) => { const keyColor = rgbaColors.get(key)!; const valueColors = values.map(v => rgbaColors.get(v)!); const color = keyColor.slice(0); @@ -3835,8 +6025,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } for (let c = 0; c < 3; c++) { - color[c] *= (paletteColors.get(key)! / count); - values.forEach((value: integer, i: integer) => { + color[c] *= paletteColors.get(key)! / count; + values.forEach((value: number, i: number) => { if (paletteColors.has(value)) { const valueCount = paletteColors.get(value)!; color[c] += valueColors[i][c] * (valueCount / count); @@ -3853,19 +6043,30 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - paletteColors.set(argbFromRgba({ r: color[0], g: color[1], b: color[2], a: color[3] }), count); + paletteColors.set( + argbFromRgba({ + r: color[0], + g: color[1], + b: color[2], + a: color[3], + }), + count, + ); }); - keys = Array.from(paletteColors.keys()).sort((a: integer, b: integer) => paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1); + keys = Array.from(paletteColors.keys()).sort( + (a: number, b: number) => + paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1, + ); } while (mappedColors.size); return keys.map(c => Object.values(rgbaFromArgb(c))); - } - ); + }, + ); const paletteDeltas: number[][] = []; - spriteColors.forEach((sc: integer[], i: integer) => { + spriteColors.forEach((sc: number[], i: number) => { paletteDeltas.push([]); for (let p = 0; p < palette.length; p++) { paletteDeltas[i].push(Utils.deltaRgb(sc, palette[p])); @@ -3876,31 +6077,43 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { for (let sc = 0; sc < spriteColors.length; sc++) { const delta = Math.min(...paletteDeltas[sc]); - const paletteIndex = Math.min(paletteDeltas[sc].findIndex(pd => pd === delta), fusionPalette.length - 1); + const paletteIndex = Math.min( + paletteDeltas[sc].findIndex(pd => pd === delta), + fusionPalette.length - 1, + ); if (delta < 255) { const ratio = easeFunc(delta / 255); - const color = [ 0, 0, 0, fusionSpriteColors[sc][3] ]; + const color = [0, 0, 0, fusionSpriteColors[sc][3]]; for (let c = 0; c < 3; c++) { - color[c] = Math.round((fusionSpriteColors[sc][c] * ratio) + (fusionPalette[paletteIndex][c] * (1 - ratio))); + color[c] = Math.round( + fusionSpriteColors[sc][c] * ratio + + fusionPalette[paletteIndex][c] * (1 - ratio), + ); } fusionSpriteColors[sc] = color; } } - [ this.getSprite(), this.getTintSprite() ].filter(s => !!s).map(s => { - s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = spriteColors; - s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = fusionSpriteColors; - }); + [this.getSprite(), this.getTintSprite()] + .filter(s => !!s) + .map(s => { + s.pipelineData[ + `spriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}` + ] = spriteColors; + s.pipelineData[ + `fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}` + ] = fusionSpriteColors; + }); canvas.remove(); fusionCanvas.remove(); } /** - * Generates a random number using the current battle's seed, or the global seed if `this.scene.currentBattle` is falsy + * Generates a random number using the current battle's seed, or the global seed if `globalScene.currentBattle` is falsy * * This calls either {@linkcode BattleScene.randBattleSeedInt}({@linkcode range}, {@linkcode min}) in `src/battle-scene.ts` - * which calls {@linkcode Battle.randSeedInt}(`scene`, {@linkcode range}, {@linkcode min}) in `src/battle.ts` + * which calls {@linkcode Battle.randSeedInt}({@linkcode range}, {@linkcode min}) in `src/battle.ts` * which calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts`, * or it directly calls {@linkcode Utils.randSeedInt randSeedInt}({@linkcode range}, {@linkcode min}) in `src/utils.ts` if there is no current battle * @@ -3908,20 +6121,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param min The minimum integer to pick, default `0` * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) */ - randSeedInt(range: integer, min: integer = 0): integer { - return this.scene.currentBattle - ? this.scene.randBattleSeedInt(range, min) + randSeedInt(range: number, min = 0): number { + return globalScene.currentBattle + ? globalScene.randBattleSeedInt(range, min) : Utils.randSeedInt(range, min); } /** - * Generates a random number using the current battle's seed, or the global seed if `this.scene.currentBattle` is falsy + * Generates a random number using the current battle's seed, or the global seed if `globalScene.currentBattle` is falsy * @param min The minimum integer to generate * @param max The maximum integer to generate * @returns a random integer between {@linkcode min} and {@linkcode max} inclusive */ - randSeedIntRange(min: integer, max: integer): integer { - return this.randSeedInt((max - min) + 1, min); + randSeedIntRange(min: number, max: number): number { + return this.randSeedInt(max - min + 1, min); } /** @@ -3931,20 +6144,30 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param hideInfo Indicates if this should also play the animation to hide the Pokemon's * info container. */ - leaveField(clearEffects: boolean = true, hideInfo: boolean = true) { + leaveField(clearEffects = true, hideInfo = true, destroy = false) { this.resetSprite(); this.resetTurnData(); + globalScene + .getField(true) + .filter(p => p !== this) + .forEach(p => p.removeTagsBySourceId(this.id)); + if (clearEffects) { this.destroySubstitute(); - this.resetSummonData(); - this.resetBattleData(); + this.resetSummonData(); // this also calls `resetBattleSummonData` } if (hideInfo) { this.hideInfo(); } - this.scene.field.remove(this); + // Trigger abilities that activate upon leaving the field + applyPreLeaveFieldAbAttrs(PreLeaveFieldAbAttr, this); this.setSwitchOutStatus(true); - this.scene.triggerPokemonFormChange(this, SpeciesFormChangeActiveTrigger, true); + globalScene.triggerPokemonFormChange( + this, + SpeciesFormChangeActiveTrigger, + true, + ); + globalScene.field.remove(this, destroy); } destroy(): void { @@ -3965,7 +6188,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { hasSameAbilityInRootForm(abilityIndex: number): boolean { const currentAbilityIndex = this.abilityIndex; const rootForm = getPokemonSpecies(this.species.getRootSpeciesId()); - return rootForm.getAbility(abilityIndex) === rootForm.getAbility(currentAbilityIndex); + return ( + rootForm.getAbility(abilityIndex) === + rootForm.getAbility(currentAbilityIndex) + ); } /** @@ -3986,17 +6212,62 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } return false; } -} -export default interface Pokemon { - scene: BattleScene + /** + * Reduces one of this Pokemon's held item stacks by 1, and removes the item if applicable. + * Does nothing if this Pokemon is somehow not the owner of the held item. + * @param heldItem The item stack to be reduced by 1. + * @param forBattle If `false`, do not trigger in-battle effects (such as Unburden) from losing the item. For example, set this to `false` if the Pokemon is giving away the held item for a Mystery Encounter. Default is `true`. + * @returns `true` if the item was removed successfully, `false` otherwise. + */ + public loseHeldItem( + heldItem: PokemonHeldItemModifier, + forBattle = true, + ): boolean { + if (heldItem.pokemonId === -1 || heldItem.pokemonId === this.id) { + heldItem.stackCount--; + if (heldItem.stackCount <= 0) { + globalScene.removeModifier(heldItem, !this.isPlayer()); + } + if (forBattle) { + applyPostItemLostAbAttrs(PostItemLostAbAttr, this, false); + } + return true; + } else { + return false; + } + } } export class PlayerPokemon extends Pokemon { public compatibleTms: Moves[]; - constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) { - super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); + constructor( + species: PokemonSpecies, + level: number, + abilityIndex?: number, + formIndex?: number, + gender?: Gender, + shiny?: boolean, + variant?: Variant, + ivs?: number[], + nature?: Nature, + dataSource?: Pokemon | PokemonData, + ) { + super( + 106, + 148, + species, + level, + abilityIndex, + formIndex, + gender, + shiny, + variant, + ivs, + nature, + dataSource, + ); if (Overrides.STATUS_OVERRIDE) { this.status = new Status(Overrides.STATUS_OVERRIDE, 0, 4); @@ -4014,7 +6285,7 @@ export class PlayerPokemon extends Pokemon { } if (!dataSource) { - if (this.scene.gameMode.isDaily) { + if (globalScene.gameMode.isDaily) { this.generateAndPopulateMoveset(); } else { this.moveset = []; @@ -4024,7 +6295,7 @@ export class PlayerPokemon extends Pokemon { } initBattleInfo(): void { - this.battleInfo = new PlayerBattleInfo(this.scene); + this.battleInfo = new PlayerBattleInfo(); this.battleInfo.initInfo(this); } @@ -4040,8 +6311,8 @@ export class PlayerPokemon extends Pokemon { return false; } - getFieldIndex(): integer { - return this.scene.getPlayerField().indexOf(this); + getFieldIndex(): number { + return globalScene.getPlayerField().indexOf(this); } getBattlerIndex(): BattlerIndex { @@ -4053,16 +6324,23 @@ export class PlayerPokemon extends Pokemon { const tms = Object.keys(tmSpecies); for (const tm of tms) { - const moveId = parseInt(tm) as Moves; + const moveId = Number.parseInt(tm) as Moves; let compatible = false; for (const p of tmSpecies[tm]) { if (Array.isArray(p)) { - const [ pkm, form ] = p; - if ((pkm === this.species.speciesId || this.fusionSpecies && pkm === this.fusionSpecies.speciesId) && form === this.getFormKey()) { + const [pkm, form] = p; + if ( + (pkm === this.species.speciesId || + (this.fusionSpecies && pkm === this.fusionSpecies.speciesId)) && + form === this.getFormKey() + ) { compatible = true; break; } - } else if (p === this.species.speciesId || (this.fusionSpecies && p === this.fusionSpecies.speciesId)) { + } else if ( + p === this.species.speciesId || + (this.fusionSpecies && p === this.fusionSpecies.speciesId) + ) { compatible = true; break; } @@ -4077,7 +6355,13 @@ export class PlayerPokemon extends Pokemon { } tryPopulateMoveset(moveset: StarterMoveset): boolean { - if (!this.getSpeciesForm().validateStarterMoveset(moveset, this.scene.gameData.starterData[this.species.getRootSpeciesId()].eggMoves)) { + if ( + !this.getSpeciesForm().validateStarterMoveset( + moveset, + globalScene.gameData.starterData[this.species.getRootSpeciesId()] + .eggMoves, + ) + ) { return false; } @@ -4097,86 +6381,94 @@ export class PlayerPokemon extends Pokemon { return new Promise(resolve => { this.leaveField(switchType === SwitchType.SWITCH); - this.scene.ui.setMode(Mode.PARTY, PartyUiMode.FAINT_SWITCH, this.getFieldIndex(), (slotIndex: integer, option: PartyOption) => { - if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { - this.scene.prependToPhase(new SwitchSummonPhase(this.scene, switchType, this.getFieldIndex(), slotIndex, false), MoveEndPhase); - } - this.scene.ui.setMode(Mode.MESSAGE).then(resolve); - }, PartyUiHandler.FilterNonFainted); + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.FAINT_SWITCH, + this.getFieldIndex(), + (slotIndex: number, option: PartyOption) => { + if ( + slotIndex >= globalScene.currentBattle.getBattlerCount() && + slotIndex < 6 + ) { + globalScene.prependToPhase( + new SwitchSummonPhase( + switchType, + this.getFieldIndex(), + slotIndex, + false, + ), + MoveEndPhase, + ); + } + globalScene.ui.setMode(Mode.MESSAGE).then(resolve); + }, + PartyUiHandler.FilterNonFainted, + ); }); } - 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); - const starterAmount = new Utils.IntegerHolder(Math.floor(friendship * (this.scene.gameMode.isClassic && friendship > 0 ? CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER : 1) / (fusionStarterSpeciesId ? 2 : 1))); - if (amount.value > 0) { - this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount); - this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, starterAmount); + addFriendship(friendship: number): void { + if (friendship > 0) { + const starterSpeciesId = this.species.getRootSpeciesId(); + const fusionStarterSpeciesId = + this.isFusion() && this.fusionSpecies + ? this.fusionSpecies.getRootSpeciesId() + : 0; + const starterData = [ + globalScene.gameData.starterData[starterSpeciesId], + fusionStarterSpeciesId + ? globalScene.gameData.starterData[fusionStarterSpeciesId] + : null, + ].filter(d => !!d); + const amount = new Utils.NumberHolder(friendship); + globalScene.applyModifier( + PokemonFriendshipBoosterModifier, + true, + this, + amount, + ); + const candyFriendshipMultiplier = globalScene.gameMode.isClassic + ? globalScene.eventManager.getClassicFriendshipMultiplier() + : 1; + const fusionReduction = fusionStarterSpeciesId + ? globalScene.eventManager.areFusionsBoosted() + ? 1.5 // Divide candy gain for fusions by 1.5 during events + : 2 // 2 for fusions outside events + : 1; // 1 for non-fused mons + const starterAmount = new Utils.NumberHolder( + Math.floor( + (amount.value * candyFriendshipMultiplier) / fusionReduction, + ), + ); + // Add friendship to this PlayerPokemon this.friendship = Math.min(this.friendship + amount.value, 255); if (this.friendship === 255) { - this.scene.validateAchv(achvs.MAX_FRIENDSHIP); + globalScene.validateAchv(achvs.MAX_FRIENDSHIP); } - starterData.forEach((sd: StarterDataEntry, i: integer) => { - const speciesId = !i ? starterSpeciesId : fusionStarterSpeciesId as Species; + // 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])) { - this.scene.gameData.addStarterCandy(getPokemonSpecies(speciesId), 1); + if ( + sd.friendship >= + getStarterValueFriendshipCap(speciesStarterCosts[speciesId]) + ) { + globalScene.gameData.addStarterCandy(getPokemonSpecies(speciesId), 1); sd.friendship = 0; } }); } 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); } } - /** - * Handles Revival Blessing when used by player. - * @returns Promise to revive a pokemon. - * @see {@linkcode RevivalBlessingAttr} - */ - revivalBlessing(): Promise { - return new Promise(resolve => { - this.scene.ui.setMode(Mode.PARTY, PartyUiMode.REVIVAL_BLESSING, this.getFieldIndex(), (slotIndex:integer, option: PartyOption) => { - if (slotIndex >= 0 && slotIndex < 6) { - const pokemon = this.scene.getParty()[slotIndex]; - if (!pokemon || !pokemon.isFainted()) { - resolve(); - } - pokemon.resetTurnData(); - pokemon.resetStatus(); - pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); - this.scene.queueMessage(i18next.t("moveTriggers:revivalBlessing", { pokemonName: pokemon.name }), 0, true); - - if (this.scene.currentBattle.double && this.scene.getParty().length > 1) { - const allyPokemon = this.getAlly(); - if (slotIndex <= 1) { - // Revived ally pokemon - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, true)); - this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); - } else if (allyPokemon.isFainted()) { - // Revived party pokemon, and ally pokemon is fainted - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, true)); - this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); - } - } - - } - this.scene.ui.setMode(Mode.MESSAGE).then(() => resolve()); - }, PartyUiHandler.FilterFainted); - }); - } - - getPossibleEvolution(evolution: SpeciesFormEvolution | null): Promise { + getPossibleEvolution( + evolution: SpeciesFormEvolution | null, + ): Promise { if (!evolution) { return new Promise(resolve => resolve(this)); } @@ -4188,19 +6480,60 @@ export class PlayerPokemon extends Pokemon { const originalFusionSpecies = this.fusionSpecies; const originalFusionFormIndex = this.fusionFormIndex; this.fusionSpecies = evolutionSpecies; - this.fusionFormIndex = evolution.evoFormKey !== null ? Math.max(evolutionSpecies.forms.findIndex(f => f.formKey === evolution.evoFormKey), 0) : this.fusionFormIndex; - ret = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); + this.fusionFormIndex = + evolution.evoFormKey !== null + ? Math.max( + evolutionSpecies.forms.findIndex( + f => f.formKey === evolution.evoFormKey, + ), + 0, + ) + : this.fusionFormIndex; + ret = globalScene.addPlayerPokemon( + this.species, + this.level, + this.abilityIndex, + this.formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + ); this.fusionSpecies = originalFusionSpecies; this.fusionFormIndex = originalFusionFormIndex; } else { - const formIndex = evolution.evoFormKey !== null && !isFusion ? Math.max(evolutionSpecies.forms.findIndex(f => f.formKey === evolution.evoFormKey), 0) : this.formIndex; - ret = this.scene.addPlayerPokemon(!isFusion ? evolutionSpecies : this.species, this.level, this.abilityIndex, formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); + const formIndex = + evolution.evoFormKey !== null && !isFusion + ? Math.max( + evolutionSpecies.forms.findIndex( + f => f.formKey === evolution.evoFormKey, + ), + 0, + ) + : this.formIndex; + ret = globalScene.addPlayerPokemon( + !isFusion ? evolutionSpecies : this.species, + this.level, + this.abilityIndex, + formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + ); } ret.loadAssets().then(() => resolve(ret)); }); } - evolve(evolution: SpeciesFormEvolution | null, preEvolution: PokemonSpeciesForm): Promise { + evolve( + evolution: SpeciesFormEvolution | null, + preEvolution: PokemonSpeciesForm, + ): Promise { if (!evolution) { return new Promise(resolve => resolve()); } @@ -4215,7 +6548,13 @@ export class PlayerPokemon extends Pokemon { this.fusionSpecies = getPokemonSpecies(evolution.speciesId); } if (evolution.preFormKey !== null) { - const formIndex = Math.max((!isFusion || !this.fusionSpecies ? this.species : this.fusionSpecies).forms.findIndex(f => f.formKey === evolution.evoFormKey), 0); + const formIndex = Math.max( + (!isFusion || !this.fusionSpecies + ? this.species + : this.fusionSpecies + ).forms.findIndex(f => f.formKey === evolution.evoFormKey), + 0, + ); if (!isFusion) { this.formIndex = formIndex; } else { @@ -4226,25 +6565,39 @@ export class PlayerPokemon extends Pokemon { if (!isFusion) { const abilityCount = this.getSpeciesForm().getAbilityCount(); const preEvoAbilityCount = preEvolution.getAbilityCount(); - if ([ 0, 1, 2 ].includes(this.abilityIndex)) { + if ([0, 1, 2].includes(this.abilityIndex)) { // Handles cases where a Pokemon with 3 abilities evolves into a Pokemon with 2 abilities (ie: Eevee -> any Eeveelution) - if (this.abilityIndex === 2 && preEvoAbilityCount === 3 && abilityCount === 2) { + if ( + this.abilityIndex === 2 && + preEvoAbilityCount === 3 && + abilityCount === 2 + ) { this.abilityIndex = 1; } - } else { // Prevent pokemon with an illegal ability value from breaking things - console.warn("this.abilityIndex is somehow an illegal value, please report this"); + } else { + // Prevent pokemon with an illegal ability value from breaking things + console.warn( + "this.abilityIndex is somehow an illegal value, please report this", + ); console.warn(this.abilityIndex); this.abilityIndex = 0; } - } else { // Do the same as above, but for fusions + } else { + // Do the same as above, but for fusions const abilityCount = this.getFusionSpeciesForm().getAbilityCount(); const preEvoAbilityCount = preEvolution.getAbilityCount(); - if ([ 0, 1, 2 ].includes(this.fusionAbilityIndex)) { - if (this.fusionAbilityIndex === 2 && preEvoAbilityCount === 3 && abilityCount === 2) { + if ([0, 1, 2].includes(this.fusionAbilityIndex)) { + if ( + this.fusionAbilityIndex === 2 && + preEvoAbilityCount === 3 && + abilityCount === 2 + ) { this.fusionAbilityIndex = 1; } } else { - console.warn("this.fusionAbilityIndex is somehow an illegal value, please report this"); + console.warn( + "this.fusionAbilityIndex is somehow an illegal value, please report this", + ); console.warn(this.fusionAbilityIndex); this.fusionAbilityIndex = 0; } @@ -4258,15 +6611,22 @@ export class PlayerPokemon extends Pokemon { }); }; if (preEvolution.speciesId === Species.GIMMIGHOUL) { - const evotracker = this.getHeldItems().filter(m => m instanceof EvoTrackerModifier)[0] ?? null; + const evotracker = + this.getHeldItems().filter(m => m instanceof EvoTrackerModifier)[0] ?? + null; if (evotracker) { - this.scene.removeModifier(evotracker); + globalScene.removeModifier(evotracker); } } - if (!this.scene.gameMode.isDaily || this.metBiome > -1) { - this.scene.gameData.updateSpeciesDexIvs(this.species.speciesId, this.ivs); - this.scene.gameData.setPokemonSeen(this, false); - this.scene.gameData.setPokemonCaught(this, false).then(() => updateAndResolve()); + if (!globalScene.gameMode.isDaily || this.metBiome > -1) { + globalScene.gameData.updateSpeciesDexIvs( + this.species.speciesId, + this.ivs, + ); + globalScene.gameData.setPokemonSeen(this, false); + globalScene.gameData + .setPokemonCaught(this, false) + .then(() => updateAndResolve()); } else { updateAndResolve(); } @@ -4276,16 +6636,30 @@ export class PlayerPokemon extends Pokemon { private handleSpecialEvolutions(evolution: SpeciesFormEvolution) { const isFusion = evolution instanceof FusionSpeciesFormEvolution; - const evoSpecies = (!isFusion ? this.species : this.fusionSpecies); - if (evoSpecies?.speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) { + const evoSpecies = !isFusion ? this.species : this.fusionSpecies; + if ( + evoSpecies?.speciesId === Species.NINCADA && + evolution.speciesId === Species.NINJASK + ) { const newEvolution = pokemonEvolutions[evoSpecies.speciesId][1]; if (newEvolution.condition?.predicate(this)) { - const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, undefined, this.shiny, this.variant, this.ivs, this.nature); + const newPokemon = globalScene.addPlayerPokemon( + this.species, + this.level, + this.abilityIndex, + this.formIndex, + undefined, + this.shiny, + this.variant, + this.ivs, + this.nature, + ); newPokemon.passive = this.passive; newPokemon.moveset = this.moveset.slice(); newPokemon.moveset = this.copyMoveset(); newPokemon.luck = this.luck; + newPokemon.gender = Gender.GENDERLESS; newPokemon.metLevel = this.metLevel; newPokemon.metBiome = this.metBiome; newPokemon.metSpecies = this.metSpecies; @@ -4297,71 +6671,80 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionVariant = this.fusionVariant; newPokemon.fusionGender = this.fusionGender; newPokemon.fusionLuck = this.fusionLuck; + newPokemon.fusionTeraType = this.fusionTeraType; newPokemon.usedTMs = this.usedTMs; + newPokemon.evoCounter = this.evoCounter; - this.scene.getParty().push(newPokemon); - newPokemon.evolve((!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)), evoSpecies); - const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === this.id, true) as PokemonHeldItemModifier[]; + globalScene.getPlayerParty().push(newPokemon); + newPokemon.evolve( + !isFusion + ? newEvolution + : new FusionSpeciesFormEvolution(this.id, newEvolution), + evoSpecies, + ); + const modifiers = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.id, + true, + ) as PokemonHeldItemModifier[]; modifiers.forEach(m => { const clonedModifier = m.clone() as PokemonHeldItemModifier; clonedModifier.pokemonId = newPokemon.id; - this.scene.addModifier(clonedModifier, true); + globalScene.addModifier(clonedModifier, true); }); - this.scene.updateModifiers(true); + globalScene.updateModifiers(true); } } } getPossibleForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { - const formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); - const ret = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); + const formIndex = Math.max( + this.species.forms.findIndex(f => f.formKey === formChange.formKey), + 0, + ); + const ret = globalScene.addPlayerPokemon( + this.species, + this.level, + this.abilityIndex, + formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + ); ret.loadAssets().then(() => resolve(ret)); }); } changeForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { - const previousFormIndex = this.formIndex; - this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); + this.formIndex = Math.max( + this.species.forms.findIndex(f => f.formKey === formChange.formKey), + 0, + ); this.generateName(); const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount) { // Shouldn't happen + if (this.abilityIndex >= abilityCount) { + // Shouldn't happen this.abilityIndex = abilityCount - 1; } - // In cases where a form change updates the type of a Pokemon from its previous form (Arceus, Silvally, Castform, etc.), - // persist that type change in customPokemonData if necessary - const baseForm = this.species.forms[previousFormIndex]; - const baseFormTypes = [ baseForm.type1, baseForm.type2 ]; - if (this.customPokemonData.types.length > 0) { - if (this.getSpeciesForm().type1 !== baseFormTypes[0]) { - this.customPokemonData.types[0] = this.getSpeciesForm().type1; - } - - const type2 = this.getSpeciesForm().type2; - if (!isNullOrUndefined(type2) && type2 !== baseFormTypes[1]) { - if (this.customPokemonData.types.length > 1) { - this.customPokemonData.types[1] = type2; - } else { - this.customPokemonData.types.push(type2); - } - } - } - this.compatibleTms.splice(0, this.compatibleTms.length); this.generateCompatibleTms(); const updateAndResolve = () => { this.loadAssets().then(() => { this.calculateStats(); - this.scene.updateModifiers(true, true); + globalScene.updateModifiers(true, true); this.updateInfo(true).then(() => resolve()); }); }; - if (!this.scene.gameMode.isDaily || this.metBiome > -1) { - this.scene.gameData.setPokemonSeen(this, false); - this.scene.gameData.setPokemonCaught(this, false).then(() => updateAndResolve()); + if (!globalScene.gameMode.isDaily || this.metBiome > -1) { + globalScene.gameData.setPokemonSeen(this, false); + globalScene.gameData + .setPokemonCaught(this, false) + .then(() => updateAndResolve()); } else { updateAndResolve(); } @@ -4374,70 +6757,81 @@ export class PlayerPokemon extends Pokemon { } /** - * Returns a Promise to fuse two PlayerPokemon together - * @param pokemon The PlayerPokemon to fuse to this one - */ - fuse(pokemon: PlayerPokemon): Promise { - return new Promise(resolve => { - this.fusionSpecies = pokemon.species; - this.fusionFormIndex = pokemon.formIndex; - this.fusionAbilityIndex = pokemon.abilityIndex; - this.fusionShiny = pokemon.shiny; - this.fusionVariant = pokemon.variant; - this.fusionGender = pokemon.gender; - this.fusionLuck = pokemon.luck; - this.fusionCustomPokemonData = pokemon.customPokemonData; - if ((pokemon.pauseEvolutions) || (this.pauseEvolutions)) { - this.pauseEvolutions = true; - } + * Returns a Promise to fuse two PlayerPokemon together + * @param pokemon The PlayerPokemon to fuse to this one + */ + fuse(pokemon: PlayerPokemon): void { + this.fusionSpecies = pokemon.species; + this.fusionFormIndex = pokemon.formIndex; + this.fusionAbilityIndex = pokemon.abilityIndex; + this.fusionShiny = pokemon.shiny; + this.fusionVariant = pokemon.variant; + this.fusionGender = pokemon.gender; + this.fusionLuck = pokemon.luck; + this.fusionCustomPokemonData = pokemon.customPokemonData; + this.evoCounter = Math.max(pokemon.evoCounter, this.evoCounter); + if (pokemon.pauseEvolutions || this.pauseEvolutions) { + this.pauseEvolutions = true; + } - this.scene.validateAchv(achvs.SPLICE); - this.scene.gameData.gameStats.pokemonFused++; + globalScene.validateAchv(achvs.SPLICE); + globalScene.gameData.gameStats.pokemonFused++; - // Store the average HP% that each Pokemon has - const maxHp = this.getMaxHp(); - const newHpPercent = ((pokemon.hp / pokemon.getMaxHp()) + (this.hp / maxHp)) / 2; + // Store the average HP% that each Pokemon has + const maxHp = this.getMaxHp(); + const newHpPercent = + (pokemon.hp / pokemon.getMaxHp() + this.hp / maxHp) / 2; - this.generateName(); - this.calculateStats(); + this.generateName(); + this.calculateStats(); - // Set this Pokemon's HP to the average % of both fusion components - this.hp = Math.round(maxHp * newHpPercent); - if (!this.isFainted()) { - // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum - this.hp = Math.min(this.hp, maxHp); - this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two - } else if (!pokemon.isFainted()) { - // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero - this.hp = Math.max(this.hp, 1); - this.status = pokemon.status; // Inherit the other Pokemon's status - } + // Set this Pokemon's HP to the average % of both fusion components + this.hp = Math.round(maxHp * newHpPercent); + if (!this.isFainted()) { + // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum + this.hp = Math.min(this.hp, maxHp); + this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two + } else if (!pokemon.isFainted()) { + // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero + this.hp = Math.max(this.hp, 1); + this.status = pokemon.status; // Inherit the other Pokemon's status + } - this.generateCompatibleTms(); - this.updateInfo(true); - const fusedPartyMemberIndex = this.scene.getParty().indexOf(pokemon); - let partyMemberIndex = this.scene.getParty().indexOf(this); - if (partyMemberIndex > fusedPartyMemberIndex) { - partyMemberIndex--; - } - const fusedPartyMemberHeldModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; - const transferModifiers: Promise[] = []; - for (const modifier of fusedPartyMemberHeldModifiers) { - transferModifiers.push(this.scene.tryTransferHeldItemModifier(modifier, this, false, modifier.getStackCount(), true, true)); - } - Promise.allSettled(transferModifiers).then(() => { - this.scene.updateModifiers(true, true).then(() => { - this.scene.removePartyMemberModifiers(fusedPartyMemberIndex); - this.scene.getParty().splice(fusedPartyMemberIndex, 1)[0]; - const newPartyMemberIndex = this.scene.getParty().indexOf(this); - pokemon.getMoveset(true).map(m => this.scene.unshiftPhase(new LearnMovePhase(this.scene, newPartyMemberIndex, m!.getMove().id))); // TODO: is the bang correct? - pokemon.destroy(); - this.updateFusionPalette(); - resolve(); - }); - }); - }); + this.generateCompatibleTms(); + this.updateInfo(true); + const fusedPartyMemberIndex = globalScene.getPlayerParty().indexOf(pokemon); + let partyMemberIndex = globalScene.getPlayerParty().indexOf(this); + if (partyMemberIndex > fusedPartyMemberIndex) { + partyMemberIndex--; + } + const fusedPartyMemberHeldModifiers = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id, + true, + ) as PokemonHeldItemModifier[]; + for (const modifier of fusedPartyMemberHeldModifiers) { + globalScene.tryTransferHeldItemModifier( + modifier, + this, + false, + modifier.getStackCount(), + true, + true, + false, + ); + } + globalScene.updateModifiers(true, true); + globalScene.removePartyMemberModifiers(fusedPartyMemberIndex); + globalScene.getPlayerParty().splice(fusedPartyMemberIndex, 1)[0]; + const newPartyMemberIndex = globalScene.getPlayerParty().indexOf(this); + pokemon + .getMoveset(true) + .map((m: PokemonMove) => + globalScene.unshiftPhase( + new LearnMovePhase(newPartyMemberIndex, m.getMove().id), + ), + ); + pokemon.destroy(); + this.updateFusionPalette(); } unfuse(): Promise { @@ -4451,9 +6845,21 @@ export class PlayerPokemon extends Pokemon { /** Returns a deep copy of this Pokemon's moveset array */ copyMoveset(): PokemonMove[] { - const newMoveset : PokemonMove[] = []; - this.moveset.forEach(move => - newMoveset.push(new PokemonMove(move!.moveId, 0, move!.ppUp, move!.virtual))); // TODO: are those bangs correct? + const newMoveset: PokemonMove[] = []; + this.moveset.forEach(move => { + // TODO: refactor `moveset` to not accept `null`s + if (move) { + newMoveset.push( + new PokemonMove( + move.moveId, + 0, + move.ppUp, + move.virtual, + move.maxPpOverride, + ), + ); + } + }); return newMoveset; } @@ -4462,16 +6868,37 @@ export class PlayerPokemon extends Pokemon { export class EnemyPokemon extends Pokemon { public trainerSlot: TrainerSlot; 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 */ + public bossSegments: number; + public bossSegmentIndex: number; + public initialTeamIndex: number; + /** 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( + species: PokemonSpecies, + level: number, + trainerSlot: TrainerSlot, + boss: boolean, + shinyLock = false, + dataSource?: PokemonData, + ) { + super( + 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.initialTeamIndex = globalScene.currentBattle?.enemyParty.length ?? 0; this.isPopulatedFromDataSource = !!dataSource; // if a dataSource is provided, then it was populated from dataSource if (boss) { this.setBoss(boss, dataSource?.bossSegments); @@ -4481,44 +6908,53 @@ export class EnemyPokemon extends Pokemon { this.status = new Status(Overrides.OPP_STATUS_OVERRIDE, 0, 4); } - if (Overrides.OPP_GENDER_OVERRIDE) { + if (Overrides.OPP_GENDER_OVERRIDE !== null) { this.gender = Overrides.OPP_GENDER_OVERRIDE; } const speciesId = this.species.speciesId; if ( - speciesId in Overrides.OPP_FORM_OVERRIDES - && Overrides.OPP_FORM_OVERRIDES[speciesId] - && this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]] + speciesId in Overrides.OPP_FORM_OVERRIDES && + !isNullOrUndefined(Overrides.OPP_FORM_OVERRIDES[speciesId]) && + this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]] ) { - this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId] ?? 0; + this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId]; } 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) { - this.variant = this.generateVariant(); + this.variant = this.generateShinyVariant(); if (Overrides.OPP_VARIANT_OVERRIDE !== null) { this.variant = Overrides.OPP_VARIANT_OVERRIDE; } } - this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0); + this.luck = + (this.shiny ? this.variant + 1 : 0) + + (this.fusionShiny ? this.fusionVariant + 1 : 0); let prevolution: Species; let speciesId = species.speciesId; while ((prevolution = pokemonPrevolutions[speciesId])) { - const evolution = pokemonEvolutions[prevolution].find(pe => pe.speciesId === speciesId && (!pe.evoFormKey || pe.evoFormKey === this.getFormKey())); + const evolution = pokemonEvolutions[prevolution].find( + pe => + pe.speciesId === speciesId && + (!pe.evoFormKey || pe.evoFormKey === this.getFormKey()), + ); if (evolution?.condition?.enforceFunc) { evolution.condition.enforceFunc(this); } @@ -4526,12 +6962,13 @@ export class EnemyPokemon extends Pokemon { } } - this.aiType = boss || this.hasTrainer() ? AiType.SMART : AiType.SMART_RANDOM; + this.aiType = + boss || this.hasTrainer() ? AiType.SMART : AiType.SMART_RANDOM; } initBattleInfo(): void { if (!this.battleInfo) { - this.battleInfo = new EnemyBattleInfo(this.scene); + this.battleInfo = new EnemyBattleInfo(); this.battleInfo.updateBossSegments(this); this.battleInfo.initInfo(this); } else { @@ -4546,9 +6983,16 @@ export class EnemyPokemon extends Pokemon { * @param boss if the pokemon is a boss * @param bossSegments amount of boss segments (health-bar segments) */ - setBoss(boss: boolean = true, bossSegments: integer = 0): void { + setBoss(boss = true, bossSegments = 0): void { if (boss) { - this.bossSegments = bossSegments || this.scene.getEncounterBossSegments(this.scene.currentBattle.waveIndex, this.level, this.species, true); + this.bossSegments = + bossSegments || + globalScene.getEncounterBossSegments( + globalScene.currentBattle.waveIndex, + this.level, + this.species, + true, + ); this.bossSegmentIndex = this.bossSegments - 1; } else { this.bossSegments = 0; @@ -4556,31 +7000,31 @@ export class EnemyPokemon extends Pokemon { } } - generateAndPopulateMoveset(formIndex?: integer): void { + generateAndPopulateMoveset(formIndex?: number): void { switch (true) { - case (this.species.speciesId === Species.SMEARGLE): + case this.species.speciesId === Species.SMEARGLE: this.moveset = [ new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.SKETCH), - new PokemonMove(Moves.SKETCH) + new PokemonMove(Moves.SKETCH), ]; break; - case (this.species.speciesId === Species.ETERNATUS): + case this.species.speciesId === Species.ETERNATUS: this.moveset = (formIndex !== undefined ? formIndex : this.formIndex) ? [ - new PokemonMove(Moves.DYNAMAX_CANNON), - new PokemonMove(Moves.CROSS_POISON), - new PokemonMove(Moves.FLAMETHROWER), - new PokemonMove(Moves.RECOVER, 0, -4) - ] + new PokemonMove(Moves.DYNAMAX_CANNON), + new PokemonMove(Moves.CROSS_POISON), + new PokemonMove(Moves.FLAMETHROWER), + new PokemonMove(Moves.RECOVER, 0, -4), + ] : [ - new PokemonMove(Moves.ETERNABEAM), - new PokemonMove(Moves.SLUDGE_BOMB), - new PokemonMove(Moves.FLAMETHROWER), - new PokemonMove(Moves.COSMIC_POWER) - ]; - if (this.scene.gameMode.hasChallenge(Challenges.INVERSE_BATTLE)) { + new PokemonMove(Moves.ETERNABEAM), + new PokemonMove(Moves.SLUDGE_BOMB), + new PokemonMove(Moves.FLAMETHROWER), + new PokemonMove(Moves.COSMIC_POWER), + ]; + if (globalScene.gameMode.hasChallenge(Challenges.INVERSE_BATTLE)) { this.moveset[2] = new PokemonMove(Moves.THUNDERBOLT); } break; @@ -4595,17 +7039,28 @@ export class EnemyPokemon extends Pokemon { * the Pokemon the move will target. * @returns this Pokemon's next move in the format {move, moveTargets} */ - getNextMove(): QueuedMove { + getNextMove(): TurnMove { // If this Pokemon has a move already queued, return it. - const queuedMove = this.getMoveQueue().length - ? this.getMoveset().find(m => m?.moveId === this.getMoveQueue()[0].move) - : null; - if (queuedMove) { - if (queuedMove.isUsable(this, this.getMoveQueue()[0].ignorePP)) { - return { move: queuedMove.moveId, targets: this.getMoveQueue()[0].targets, ignorePP: this.getMoveQueue()[0].ignorePP }; - } else { - this.getMoveQueue().shift(); - return this.getNextMove(); + const moveQueue = this.getMoveQueue(); + if (moveQueue.length !== 0) { + const queuedMove = moveQueue[0]; + if (queuedMove) { + const moveIndex = this.getMoveset().findIndex( + m => m?.moveId === queuedMove.move, + ); + if ( + (moveIndex > -1 && + this.getMoveset()[moveIndex]!.isUsable( + this, + queuedMove.ignorePP, + )) || + queuedMove.virtual + ) { + return queuedMove; + } else { + this.getMoveQueue().shift(); + return this.getNextMove(); + } } } @@ -4615,27 +7070,34 @@ export class EnemyPokemon extends Pokemon { if (movePool.length) { // If there's only 1 move in the move pool, use it. if (movePool.length === 1) { - return { move: movePool[0]!.moveId, targets: this.getNextTargets(movePool[0]!.moveId) }; // TODO: are the bangs correct? + return { + move: movePool[0]!.moveId, + targets: this.getNextTargets(movePool[0]!.moveId), + }; // TODO: are the bangs correct? } // If a move is forced because of Encore, use it. const encoreTag = this.getTag(EncoreTag) as EncoreTag; if (encoreTag) { const encoreMove = movePool.find(m => m?.moveId === encoreTag.moveId); if (encoreMove) { - return { move: encoreMove.moveId, targets: this.getNextTargets(encoreMove.moveId) }; + return { + move: encoreMove.moveId, + targets: this.getNextTargets(encoreMove.moveId), + }; } } switch (this.aiType) { case AiType.RANDOM: // No enemy should spawn with this AI type in-game - const moveId = movePool[this.scene.randBattleSeedInt(movePool.length)]!.moveId; // TODO: is the bang correct? + const moveId = + movePool[globalScene.randBattleSeedInt(movePool.length)]!.moveId; // TODO: is the bang correct? return { move: moveId, targets: this.getNextTargets(moveId) }; case AiType.SMART_RANDOM: case AiType.SMART: - /** - * Search this Pokemon's move pool for moves that will KO an opposing target. - * If there are any moves that can KO an opponent (i.e. a player Pokemon), - * those moves are the only ones considered for selection on this turn. - */ + /** + * Search this Pokemon's move pool for moves that will KO an opposing target. + * If there are any moves that can KO an opponent (i.e. a player Pokemon), + * those moves are the only ones considered for selection on this turn. + */ const koMoves = movePool.filter(pkmnMove => { if (!pkmnMove) { return false; @@ -4646,18 +7108,37 @@ export class EnemyPokemon extends Pokemon { return false; } - const fieldPokemon = this.scene.getField(); - const moveTargets = getMoveTargets(this, move.id).targets - .map(ind => fieldPokemon[ind]) + const fieldPokemon = globalScene.getField(); + const moveTargets = getMoveTargets(this, move.id) + .targets.map(ind => fieldPokemon[ind]) .filter(p => this.isPlayer() !== p.isPlayer()); // Only considers critical hits for crit-only moves or when this Pokemon is under the effect of Laser Focus - const isCritical = move.hasAttr(CritOnlyAttr) || !!this.getTag(BattlerTagType.ALWAYS_CRIT); + const isCritical = + move.hasAttr(CritOnlyAttr) || + !!this.getTag(BattlerTagType.ALWAYS_CRIT); - return move.category !== MoveCategory.STATUS - && moveTargets.some(p => { - const doesNotFail = move.applyConditions(this, p, move) || [ Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP ].includes(move.id); - return doesNotFail && p.getAttackDamage(this, move, !p.battleData.abilityRevealed, false, isCritical).damage >= p.hp; - }); + return ( + move.category !== MoveCategory.STATUS && + moveTargets.some(p => { + const doesNotFail = + move.applyConditions(this, p, move) || + [ + Moves.SUCKER_PUNCH, + Moves.UPPER_HAND, + Moves.THUNDERCLAP, + ].includes(move.id); + return ( + doesNotFail && + p.getAttackDamage( + this, + move, + !p.battleData.abilityRevealed, + false, + isCritical, + ).damage >= p.hp + ); + }) + ); }, this); if (koMoves.length > 0) { @@ -4665,47 +7146,64 @@ export class EnemyPokemon extends Pokemon { } /** - * Move selection is based on the move's calculated "benefit score" against the - * best possible target(s) (as determined by {@linkcode getNextTargets}). - * For more information on how benefit scores are calculated, see `docs/enemy-ai.md`. - */ + * Move selection is based on the move's calculated "benefit score" against the + * best possible target(s) (as determined by {@linkcode getNextTargets}). + * For more information on how benefit scores are calculated, see `docs/enemy-ai.md`. + */ const moveScores = movePool.map(() => 0); - const moveTargets = Object.fromEntries(movePool.map(m => [ m!.moveId, this.getNextTargets(m!.moveId) ])); // TODO: are those bangs correct? + const moveTargets = Object.fromEntries( + movePool.map(m => [m!.moveId, this.getNextTargets(m!.moveId)]), + ); // TODO: are those bangs correct? for (const m in movePool) { const pokemonMove = movePool[m]!; // TODO: is the bang correct? const move = pokemonMove.getMove(); let moveScore = moveScores[m]; - const targetScores: integer[] = []; + const targetScores: number[] = []; for (const mt of moveTargets[move.id]) { - // Prevent a target score from being calculated when the target is whoever attacks the user + // Prevent a target score from being calculated when the target is whoever attacks the user if (mt === BattlerIndex.ATTACKER) { break; } - const target = this.scene.getField()[mt]; + const target = globalScene.getField()[mt]; /** - * The "target score" of a move is given by the move's user benefit score + the move's target benefit score. - * If the target is an ally, the target benefit score is multiplied by -1. - */ - let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); + * The "target score" of a move is given by the move's user benefit score + the move's target benefit score. + * If the target is an ally, the target benefit score is multiplied by -1. + */ + let targetScore = + move.getUserBenefitScore(this, target, move) + + move.getTargetBenefitScore(this, target, move) * + (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); if (Number.isNaN(targetScore)) { console.error(`Move ${move.name} returned score of NaN`); targetScore = 0; } /** - * If this move is unimplemented, or the move is known to fail when used, set its - * target score to -20 - */ - if ((move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) && ![ Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP ].includes(move.id)) { + * If this move is unimplemented, or the move is known to fail when used, set its + * target score to -20 + */ + if ( + (move.name.endsWith(" (N)") || + !move.applyConditions(this, target, move)) && + ![ + Moves.SUCKER_PUNCH, + Moves.UPPER_HAND, + Moves.THUNDERCLAP, + ].includes(move.id) + ) { targetScore = -20; } else if (move instanceof AttackMove) { - /** - * Attack moves are given extra multipliers to their base benefit score based on - * the move's type effectiveness against the target and whether the move is a STAB move. - */ - const effectiveness = target.getMoveEffectiveness(this, move, !target.battleData?.abilityRevealed); + /** + * Attack moves are given extra multipliers to their base benefit score based on + * the move's type effectiveness against the target and whether the move is a STAB move. + */ + const effectiveness = target.getMoveEffectiveness( + this, + move, + !target.battleData?.abilityRevealed, + ); if (target.isPlayer() !== this.isPlayer()) { targetScore *= effectiveness; if (this.isOfType(move.type)) { @@ -4742,23 +7240,47 @@ export class EnemyPokemon extends Pokemon { }); let r = 0; if (this.aiType === AiType.SMART_RANDOM) { - // Has a 5/8 chance to select the best move, and a 3/8 chance to advance to the next best move (and repeat this roll) - while (r < sortedMovePool.length - 1 && this.scene.randBattleSeedInt(8) >= 5) { + // Has a 5/8 chance to select the best move, and a 3/8 chance to advance to the next best move (and repeat this roll) + while ( + r < sortedMovePool.length - 1 && + globalScene.randBattleSeedInt(8) >= 5 + ) { r++; } } else if (this.aiType === AiType.SMART) { - // The chance to advance to the next best move increases when the compared moves' scores are closer to each other. - while (r < sortedMovePool.length - 1 && (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) >= 0 - && this.scene.randBattleSeedInt(100) < Math.round((moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) * 50)) { + // The chance to advance to the next best move increases when the compared moves' scores are closer to each other. + while ( + r < sortedMovePool.length - 1 && + moveScores[movePool.indexOf(sortedMovePool[r + 1])] / + moveScores[movePool.indexOf(sortedMovePool[r])] >= + 0 && + globalScene.randBattleSeedInt(100) < + Math.round( + (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / + moveScores[movePool.indexOf(sortedMovePool[r])]) * + 50, + ) + ) { r++; } } - console.log(movePool.map(m => m!.getName()), moveScores, r, sortedMovePool.map(m => m!.getName())); // TODO: are those bangs correct? - return { move: sortedMovePool[r]!.moveId, targets: moveTargets[sortedMovePool[r]!.moveId] }; + console.log( + movePool.map(m => m!.getName()), + moveScores, + r, + sortedMovePool.map(m => m!.getName()), + ); // TODO: are those bangs correct? + return { + move: sortedMovePool[r]!.moveId, + targets: moveTargets[sortedMovePool[r]!.moveId], + }; } } - return { move: Moves.STRUGGLE, targets: this.getNextTargets(Moves.STRUGGLE) }; + return { + move: Moves.STRUGGLE, + targets: this.getNextTargets(Moves.STRUGGLE), + }; } /** @@ -4768,7 +7290,9 @@ export class EnemyPokemon extends Pokemon { */ getNextTargets(moveId: Moves): BattlerIndex[] { const moveTargets = getMoveTargets(this, moveId); - const targets = this.scene.getField(true).filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1); + const targets = globalScene + .getField(true) + .filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1); // If the move is multi-target, return all targets' indexes if (moveTargets.multiple) { return targets.map(p => p.getBattlerIndex()); @@ -4780,8 +7304,11 @@ export class EnemyPokemon extends Pokemon { * Get the move's target benefit score against each potential target. * For allies, this score is multiplied by -1. */ - const benefitScores = targets - .map(p => [ p.getBattlerIndex(), move.getTargetBenefitScore(this, p, move) * (p.isPlayer() === this.isPlayer() ? 1 : -1) ]); + const benefitScores = targets.map(p => [ + p.getBattlerIndex(), + move.getTargetBenefitScore(this, p, move) * + (p.isPlayer() === this.isPlayer() ? 1 : -1), + ]); const sortedBenefitScores = benefitScores.slice(0); sortedBenefitScores.sort((a, b) => { @@ -4794,7 +7321,7 @@ export class EnemyPokemon extends Pokemon { // Set target to BattlerIndex.ATTACKER when using a counter move // This is the same as when the player does so if (move.hasAttr(CounterDamageAttr)) { - return [ BattlerIndex.ATTACKER ]; + return [BattlerIndex.ATTACKER]; } return []; @@ -4811,14 +7338,16 @@ export class EnemyPokemon extends Pokemon { } // Remove any targets whose weights are less than half the max of the target weights from consideration - const benefitCutoffIndex = targetWeights.findIndex(s => s < targetWeights[0] / 2); + const benefitCutoffIndex = targetWeights.findIndex( + s => s < targetWeights[0] / 2, + ); if (benefitCutoffIndex > -1) { targetWeights = targetWeights.slice(0, benefitCutoffIndex); } - const thresholds: integer[] = []; - let totalWeight: integer = 0; - targetWeights.reduce((total: integer, w: integer) => { + const thresholds: number[] = []; + let totalWeight = 0; + targetWeights.reduce((total: number, w: number) => { total += w; thresholds.push(total); totalWeight = total; @@ -4830,8 +7359,8 @@ export class EnemyPokemon extends Pokemon { * then select the first target whose cumulative weight (with all previous targets' weights) * is greater than that random number. */ - const randValue = this.scene.randBattleSeedInt(totalWeight); - let targetIndex: integer = 0; + const randValue = globalScene.randBattleSeedInt(totalWeight); + let targetIndex = 0; thresholds.every((t, i) => { if (randValue >= t) { @@ -4842,7 +7371,7 @@ export class EnemyPokemon extends Pokemon { return false; }); - return [ sortedBenefitScores[targetIndex][0] ]; + return [sortedBenefitScores[targetIndex][0]]; } isPlayer() { @@ -4857,7 +7386,7 @@ export class EnemyPokemon extends Pokemon { return !!this.bossSegments; } - getBossSegmentIndex(): integer { + getBossSegmentIndex(): number { const segments = (this as EnemyPokemon).bossSegments; const segmentSize = this.getMaxHp() / segments; for (let s = segments - 1; s > 0; s--) { @@ -4870,14 +7399,17 @@ export class EnemyPokemon extends Pokemon { return 0; } - damage(damage: integer, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false): integer { + damage( + damage: number, + ignoreSegments = false, + preventEndure = false, + ignoreFaintPhase = false, + ): number { if (this.isFainted()) { return 0; } - let clearedBossSegmentIndex = this.isBoss() - ? this.bossSegmentIndex + 1 - : 0; + let clearedBossSegmentIndex = this.isBoss() ? this.bossSegmentIndex + 1 : 0; if (this.isBoss() && !ignoreSegments) { const segmentSize = this.getMaxHp() / this.bossSegments; @@ -4888,12 +7420,19 @@ export class EnemyPokemon extends Pokemon { if (this.hp - damage <= roundedHpThreshold) { const hpRemainder = this.hp - roundedHpThreshold; let segmentsBypassed = 0; - while (segmentsBypassed < this.bossSegmentIndex && this.canBypassBossSegments(segmentsBypassed + 1) && (damage - hpRemainder) >= Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1))) { + while ( + segmentsBypassed < this.bossSegmentIndex && + this.canBypassBossSegments(segmentsBypassed + 1) && + damage - hpRemainder >= + Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1)) + ) { segmentsBypassed++; //console.log('damage', damage, 'segment', segmentsBypassed + 1, 'segment size', segmentSize, 'damage needed', Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1))); } - damage = Utils.toDmgValue(this.hp - hpThreshold + segmentSize * segmentsBypassed); + damage = Utils.toDmgValue( + this.hp - hpThreshold + segmentSize * segmentsBypassed, + ); clearedBossSegmentIndex = s - segmentsBypassed; } break; @@ -4901,14 +7440,19 @@ export class EnemyPokemon extends Pokemon { } } - switch (this.scene.currentBattle.battleSpec) { + switch (globalScene.currentBattle.battleSpec) { case BattleSpec.FINAL_BOSS: if (!this.formIndex && this.bossSegmentIndex < 1) { damage = Math.min(damage, this.hp - 1); } } - const ret = super.damage(damage, ignoreSegments, preventEndure, ignoreFaintPhase); + const ret = super.damage( + damage, + ignoreSegments, + preventEndure, + ignoreFaintPhase, + ); if (this.isBoss()) { if (ignoreSegments) { @@ -4924,9 +7468,9 @@ export class EnemyPokemon extends Pokemon { return ret; } - canBypassBossSegments(segmentCount: integer = 1): boolean { - if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - if (!this.formIndex && (this.bossSegmentIndex - segmentCount) < 1) { + canBypassBossSegments(segmentCount = 1): boolean { + if (globalScene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + if (!this.formIndex && this.bossSegmentIndex - segmentCount < 1) { return false; } } @@ -4941,11 +7485,18 @@ export class EnemyPokemon extends Pokemon { * For Pokemon with 5 health segments or more, breaking the last two shields give +2 each * @param segmentIndex index of the segment to get down to (0 = no shield left, 1 = 1 shield left, etc.) */ - handleBossSegmentCleared(segmentIndex: integer): void { - while (this.bossSegmentIndex > 0 && segmentIndex - 1 < this.bossSegmentIndex) { + handleBossSegmentCleared(segmentIndex: number): void { + while ( + this.bossSegmentIndex > 0 && + segmentIndex - 1 < this.bossSegmentIndex + ) { // Filter out already maxed out stat stages and weigh the rest based on existing stats - const leftoverStats = EFFECTIVE_STATS.filter((s: EffectiveStat) => this.getStatStage(s) < 6); - const statWeights = leftoverStats.map((s: EffectiveStat) => this.getStat(s, false)); + const leftoverStats = EFFECTIVE_STATS.filter( + (s: EffectiveStat) => this.getStatStage(s) < 6, + ); + const statWeights = leftoverStats.map((s: EffectiveStat) => + this.getStat(s, false), + ); let boostedStat: EffectiveStat; const statThresholds: number[] = []; @@ -4976,33 +7527,22 @@ export class EnemyPokemon extends Pokemon { stages++; } - this.scene.unshiftPhase(new StatStageChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat! ], stages, true, true)); + globalScene.unshiftPhase( + new StatStageChangePhase( + this.getBattlerIndex(), + true, + [boostedStat!], + stages, + true, + true, + ), + ); this.bossSegmentIndex--; } } - heal(amount: integer): integer { - if (this.isBoss()) { - const amountRatio = amount / this.getMaxHp(); - const segmentBypassCount = Math.floor(amountRatio / (1 / this.bossSegments)); - const segmentSize = this.getMaxHp() / this.bossSegments; - for (let s = 1; s < this.bossSegments; s++) { - const hpThreshold = segmentSize * s; - if (this.hp <= Math.round(hpThreshold)) { - const healAmount = Math.min(amount, this.getMaxHp() - this.hp, Math.round(hpThreshold + (segmentSize * segmentBypassCount) - this.hp)); - this.hp += healAmount; - return healAmount; - } else if (s >= this.bossSegmentIndex) { - return super.heal(amount); - } - } - } - - return super.heal(amount); - } - - getFieldIndex(): integer { - return this.scene.getEnemyField().indexOf(this); + getFieldIndex(): number { + return globalScene.getEnemyField().indexOf(this); } getBattlerIndex(): BattlerIndex { @@ -5011,34 +7551,49 @@ export class EnemyPokemon extends Pokemon { /** * Add a new pokemon to the player's party (at `slotIndex` if set). - * If the first slot is replaced, the new pokemon's visibility will be set to `false`. + * The new pokemon's visibility will be set to `false`. * @param pokeballType the type of pokeball the pokemon was caught with * @param slotIndex an optional index to place the pokemon in the party * @returns the pokemon that was added or null if the pokemon could not be added */ - addToParty(pokeballType: PokeballType, slotIndex: number = -1) { - const party = this.scene.getParty(); + addToParty(pokeballType: PokeballType, slotIndex = -1) { + const party = globalScene.getPlayerParty(); let ret: PlayerPokemon | null = null; if (party.length < PLAYER_PARTY_MAX_SIZE) { this.pokeball = pokeballType; this.metLevel = this.level; - this.metBiome = this.scene.arena.biomeType; - this.metWave = this.scene.currentBattle.waveIndex; + this.metBiome = globalScene.arena.biomeType; + this.metWave = globalScene.currentBattle.waveIndex; this.metSpecies = this.species.speciesId; - const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); + const newPokemon = globalScene.addPlayerPokemon( + this.species, + this.level, + this.abilityIndex, + this.formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + ); if (Utils.isBetween(slotIndex, 0, PLAYER_PARTY_MAX_SIZE - 1)) { - if (slotIndex === 0) { - newPokemon.setVisible(false); // Hide if replaced with first pokemon - } party.splice(slotIndex, 0, newPokemon); } else { party.push(newPokemon); } + // Hide the Pokemon since it is not on the field + newPokemon.setVisible(false); + ret = newPokemon; - this.scene.triggerPokemonFormChange(newPokemon, SpeciesFormChangeActiveTrigger, true); + globalScene.triggerPokemonFormChange( + newPokemon, + SpeciesFormChangeActiveTrigger, + true, + ); } return ret; @@ -5047,15 +7602,10 @@ export class EnemyPokemon extends Pokemon { export interface TurnMove { move: Moves; - targets?: BattlerIndex[]; - result: MoveResult; + targets: BattlerIndex[]; + result?: MoveResult; virtual?: boolean; turn?: number; -} - -export interface QueuedMove { - move: Moves; - targets: BattlerIndex[]; ignorePP?: boolean; } @@ -5070,65 +7620,77 @@ export interface AttackMoveResult { export class PokemonSummonData { /** [Atk, Def, SpAtk, SpDef, Spd, Acc, Eva] */ - public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ]; - public moveQueue: QueuedMove[] = []; + public statStages: number[] = [0, 0, 0, 0, 0, 0, 0]; + public moveQueue: TurnMove[] = []; public tags: BattlerTag[] = []; - public abilitySuppressed: boolean = false; + public abilitySuppressed = false; public abilitiesApplied: Abilities[] = []; - public speciesForm: PokemonSpeciesForm | null; public fusionSpeciesForm: PokemonSpeciesForm; public ability: Abilities = Abilities.NONE; public passiveAbility: Abilities = Abilities.NONE; public gender: Gender; public fusionGender: Gender; - public stats: number[] = [ 0, 0, 0, 0, 0, 0 ]; + public stats: number[] = [0, 0, 0, 0, 0, 0]; public moveset: (PokemonMove | null)[]; // If not initialized this value will not be populated from save data. - public types: Type[] = []; + public types: PokemonType[] = []; + public addedType: PokemonType | null = null; } export class PokemonBattleData { - public hitCount: number = 0; - public endured: boolean = false; + /** counts the hits the pokemon received */ + public hitCount = 0; + /** used for {@linkcode Moves.RAGE_FIST} in order to save hit Counts received before Rage Fist is applied */ + public prevHitCount = 0; + public endured = false; public berriesEaten: BerryType[] = []; public abilitiesApplied: Abilities[] = []; - public abilityRevealed: boolean = false; + public abilityRevealed = false; } export class PokemonBattleSummonData { /** The number of turns the pokemon has passed since entering the battle */ - public turnCount: number = 1; + public turnCount = 1; /** The number of turns the pokemon has passed since the start of the wave */ - public waveTurnCount: number = 1; + public waveTurnCount = 1; /** The list of moves the pokemon has used since entering the battle */ public moveHistory: TurnMove[] = []; } export class PokemonTurnData { - public flinched: boolean = false; - public acted: boolean = false; - public hitCount: number = 0; + public flinched = false; + public acted = false; + /** How many times the move should hit the target(s) */ + public hitCount = 0; /** * - `-1` = Calculate how many hits are left * - `0` = Move is finished */ - public hitsLeft: number = -1; - public damageDealt: number = 0; - public currDamageDealt: number = 0; - public damageTaken: number = 0; + public hitsLeft = -1; + public totalDamageDealt = 0; + public singleHitDamageDealt = 0; + public damageTaken = 0; public attacksReceived: AttackMoveResult[] = []; public order: number; - public statStagesIncreased: boolean = false; - public statStagesDecreased: boolean = false; + public statStagesIncreased = false; + public statStagesDecreased = false; public moveEffectiveness: TypeDamageMultiplier | null = null; public combiningPledge?: Moves; + public switchedInThisTurn = false; + public failedRunAway = false; + public joinedRound = false; + /** + * Used to make sure multi-hits occur properly when the user is + * forced to act again in the same turn + */ + public extraTurns = 0; } export enum AiType { RANDOM, SMART_RANDOM, - SMART + SMART, } export enum MoveResult { @@ -5136,7 +7698,7 @@ export enum MoveResult { SUCCESS, FAIL, MISS, - OTHER + OTHER, } export enum HitResult { @@ -5150,10 +7712,15 @@ export enum HitResult { FAIL, MISS, OTHER, - IMMUNE + IMMUNE, } -export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | HitResult.NOT_VERY_EFFECTIVE | HitResult.ONE_HIT_KO | HitResult.OTHER; +export type DamageResult = + | HitResult.EFFECTIVE + | HitResult.SUPER_EFFECTIVE + | HitResult.NOT_VERY_EFFECTIVE + | HitResult.ONE_HIT_KO + | HitResult.OTHER; /** Interface containing the results of a damage calculation for a given move */ export interface DamageCalculationResult { @@ -5180,15 +7747,28 @@ export interface DamageCalculationResult { **/ export class PokemonMove { public moveId: Moves; - public ppUsed: integer; - public ppUp: integer; + public ppUsed: number; + public ppUp: number; public virtual: boolean; - constructor(moveId: Moves, ppUsed?: integer, ppUp?: integer, virtual?: boolean) { + /** + * If defined and nonzero, overrides the maximum PP of the move (e.g., due to move being copied by Transform). + * This also nullifies all effects of `ppUp`. + */ + public maxPpOverride?: number; + + constructor( + moveId: Moves, + ppUsed = 0, + ppUp = 0, + virtual = false, + maxPpOverride?: number, + ) { this.moveId = moveId; - this.ppUsed = ppUsed || 0; - this.ppUp = ppUp || 0; - this.virtual = !!virtual; + this.ppUsed = ppUsed; + this.ppUp = ppUp; + this.virtual = virtual; + this.maxPpOverride = maxPpOverride; } /** @@ -5200,8 +7780,16 @@ export class PokemonMove { * @param {boolean} ignoreRestrictionTags If `true`, skips the check for move restriction tags (see {@link MoveRestrictionBattlerTag}) * @returns `true` if the move can be selected and used by the Pokemon, otherwise `false`. */ - isUsable(pokemon: Pokemon, ignorePp: boolean = false, ignoreRestrictionTags: boolean = false): boolean { - if (this.moveId && !ignoreRestrictionTags && pokemon.isMoveRestricted(this.moveId, pokemon)) { + isUsable( + pokemon: Pokemon, + ignorePp = false, + ignoreRestrictionTags = false, + ): boolean { + if ( + this.moveId && + !ignoreRestrictionTags && + pokemon.isMoveRestricted(this.moveId, pokemon) + ) { return false; } @@ -5209,7 +7797,9 @@ export class PokemonMove { return false; } - return (ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1); + return ( + ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1 + ); } getMove(): Move { @@ -5220,16 +7810,19 @@ export class PokemonMove { * Sets {@link ppUsed} for this move and ensures the value does not exceed {@link getMovePp} * @param {number} count Amount of PP to use */ - usePp(count: number = 1) { + usePp(count = 1) { this.ppUsed = Math.min(this.ppUsed + count, this.getMovePp()); } - getMovePp(): integer { - return this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5); + getMovePp(): number { + return ( + this.maxPpOverride || + this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5) + ); } getPpRatio(): number { - return 1 - (this.ppUsed / this.getMovePp()); + return 1 - this.ppUsed / this.getMovePp(); } getName(): string { @@ -5237,11 +7830,17 @@ export class PokemonMove { } /** - * Copies an existing move or creates a valid PokemonMove object from json representing one - * @param {PokemonMove | any} source The data for the move to copy - * @return {PokemonMove} A valid pokemonmove object - */ + * Copies an existing move or creates a valid PokemonMove object from json representing one + * @param {PokemonMove | any} source The data for the move to copy + * @return {PokemonMove} A valid pokemonmove object + */ static loadMove(source: PokemonMove | any): PokemonMove { - return new PokemonMove(source.moveId, source.ppUsed, source.ppUp, source.virtual); + return new PokemonMove( + source.moveId, + source.ppUsed, + source.ppUp, + source.virtual, + source.maxPpOverride, + ); } } diff --git a/src/field/trainer.ts b/src/field/trainer.ts index b77a156f401..98919ebfa93 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -1,19 +1,19 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import type { TrainerConfig, TrainerPartyTemplate } from "#app/data/trainer-config"; import { - TrainerConfig, TrainerPartyCompoundTemplate, - TrainerPartyTemplate, TrainerPoolTier, TrainerSlot, trainerConfigs, trainerPartyTemplates, - signatureSpecies + TeraAIMode, } from "#app/data/trainer-config"; -import { EnemyPokemon } from "#app/field/pokemon"; +import type { EnemyPokemon } from "#app/field/pokemon"; import * as Utils from "#app/utils"; -import { PersistentModifier } from "#app/modifier/modifier"; +import type { PersistentModifier } from "#app/modifier/modifier"; import { trainerNamePools } from "#app/data/trainer-names"; import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; import { getIsInitialized, initI18n } from "#app/plugins/i18n"; @@ -21,22 +21,31 @@ import i18next from "i18next"; import { PartyMemberStrength } from "#enums/party-member-strength"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import { signatureSpecies } from "#app/data/balance/signature-species"; export enum TrainerVariant { - DEFAULT, - FEMALE, - DOUBLE + DEFAULT, + FEMALE, + DOUBLE, } export default class Trainer extends Phaser.GameObjects.Container { public config: TrainerConfig; public variant: TrainerVariant; - public partyTemplateIndex: integer; + public partyTemplateIndex: number; public name: string; public partnerName: string; + public originalIndexes: { [key: number]: number } = {}; - constructor(scene: BattleScene, trainerType: TrainerType, variant: TrainerVariant, partyTemplateIndex?: integer, name?: string, partnerName?: string, trainerConfigOverride?: TrainerConfig) { - super(scene, -72, 80); + constructor( + trainerType: TrainerType, + variant: TrainerVariant, + partyTemplateIndex?: number, + name?: string, + partnerName?: string, + trainerConfigOverride?: TrainerConfig, + ) { + super(globalScene, -72, 80); this.config = trainerConfigs.hasOwnProperty(trainerType) ? trainerConfigs[trainerType] : trainerConfigs[TrainerType.ACE_TRAINER]; @@ -46,17 +55,23 @@ export default class Trainer extends Phaser.GameObjects.Container { } this.variant = variant; - this.partyTemplateIndex = Math.min(partyTemplateIndex !== undefined ? partyTemplateIndex : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), - this.config.partyTemplates.length - 1); + this.partyTemplateIndex = Math.min( + partyTemplateIndex !== undefined + ? partyTemplateIndex + : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), + this.config.partyTemplates.length - 1, + ); if (trainerNamePools.hasOwnProperty(trainerType)) { const namePool = trainerNamePools[trainerType]; - this.name = name || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[variant === TrainerVariant.FEMALE ? 1 : 0] : namePool); + this.name = + name || + Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[variant === TrainerVariant.FEMALE ? 1 : 0] : namePool); if (variant === TrainerVariant.DOUBLE) { if (this.config.doubleOnly) { if (partnerName) { this.partnerName = partnerName; } else { - [ this.name, this.partnerName ] = this.name.split(" & "); + [this.name, this.partnerName] = this.name.split(" & "); } } else { this.partnerName = partnerName || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[1] : namePool); @@ -77,12 +92,21 @@ export default class Trainer extends Phaser.GameObjects.Container { break; } - console.log(Object.keys(trainerPartyTemplates)[Object.values(trainerPartyTemplates).indexOf(this.getPartyTemplate())]); + console.log( + Object.keys(trainerPartyTemplates)[Object.values(trainerPartyTemplates).indexOf(this.getPartyTemplate())], + ); const getSprite = (hasShadow?: boolean, forceFemale?: boolean) => { - const ret = this.scene.addFieldSprite(0, 0, this.config.getSpriteKey(variant === TrainerVariant.FEMALE || forceFemale, this.isDouble())); + const ret = globalScene.addFieldSprite( + 0, + 0, + this.config.getSpriteKey(variant === TrainerVariant.FEMALE || forceFemale, this.isDouble()), + ); ret.setOrigin(0.5, 1); - ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow }); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: !!hasShadow, + }); return ret; }; @@ -120,13 +144,13 @@ export default class Trainer extends Phaser.GameObjects.Container { * @param {boolean} includeTitle - Whether to include the title in the returned name. Defaults to false. * @returns {string} - The formatted name of the trainer. **/ - getName(trainerSlot: TrainerSlot = TrainerSlot.NONE, includeTitle: boolean = false): string { + getName(trainerSlot: TrainerSlot = TrainerSlot.NONE, includeTitle = false): string { // Get the base title based on the trainer slot and variant. let name = this.config.getTitle(trainerSlot, this.variant); // Determine the title to include based on the configuration and includeTitle flag. let title = includeTitle && this.config.title ? this.config.title : null; - const evilTeamTitles = [ "grunt" ]; + const evilTeamTitles = ["grunt"]; if (this.name === "" && evilTeamTitles.some(t => name.toLocaleLowerCase().includes(t))) { // This is a evil team grunt so we localize it by only using the "name" as the title title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, "_")}`); @@ -176,7 +200,6 @@ export default class Trainer extends Phaser.GameObjects.Container { return title ? `${title} ${name}` : name; } - isDouble(): boolean { return this.config.doubleOnly || this.variant === TrainerVariant.DOUBLE; } @@ -190,33 +213,48 @@ export default class Trainer extends Phaser.GameObjects.Container { } getEncounterBgm(): string { - return !this.variant ? this.config.encounterBgm : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleEncounterBgm : this.config.femaleEncounterBgm) || this.config.encounterBgm; + return !this.variant + ? this.config.encounterBgm + : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleEncounterBgm : this.config.femaleEncounterBgm) || + this.config.encounterBgm; } getEncounterMessages(): string[] { - return !this.variant ? this.config.encounterMessages : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleEncounterMessages : this.config.femaleEncounterMessages) || this.config.encounterMessages; + return !this.variant + ? this.config.encounterMessages + : (this.variant === TrainerVariant.DOUBLE + ? this.config.doubleEncounterMessages + : this.config.femaleEncounterMessages) || this.config.encounterMessages; } getVictoryMessages(): string[] { - return !this.variant ? this.config.victoryMessages : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleVictoryMessages : this.config.femaleVictoryMessages) || this.config.victoryMessages; + return !this.variant + ? this.config.victoryMessages + : (this.variant === TrainerVariant.DOUBLE + ? this.config.doubleVictoryMessages + : this.config.femaleVictoryMessages) || this.config.victoryMessages; } getDefeatMessages(): string[] { - return !this.variant ? this.config.defeatMessages : (this.variant === TrainerVariant.DOUBLE ? this.config.doubleDefeatMessages : this.config.femaleDefeatMessages) || this.config.defeatMessages; + return !this.variant + ? this.config.defeatMessages + : (this.variant === TrainerVariant.DOUBLE + ? this.config.doubleDefeatMessages + : this.config.femaleDefeatMessages) || this.config.defeatMessages; } getPartyTemplate(): TrainerPartyTemplate { if (this.config.partyTemplateFunc) { - return this.config.partyTemplateFunc(this.scene); + return this.config.partyTemplateFunc(); } return this.config.partyTemplates[this.partyTemplateIndex]; } - getPartyLevels(waveIndex: integer): integer[] { + getPartyLevels(waveIndex: number): number[] { const ret: number[] = []; const partyTemplate = this.getPartyTemplate(); - const difficultyWaveIndex = this.scene.gameMode.getWaveForDifficulty(waveIndex); + const difficultyWaveIndex = globalScene.gameMode.getWaveForDifficulty(waveIndex); const baseLevel = 1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2); if (this.isDouble() && partyTemplate.size < 2) { @@ -260,145 +298,175 @@ export default class Trainer extends Phaser.GameObjects.Container { return ret; } - genPartyMember(index: integer): EnemyPokemon { - const battle = this.scene.currentBattle; + genPartyMember(index: number): EnemyPokemon { + const battle = globalScene.currentBattle; const level = battle.enemyLevels?.[index]!; // TODO: is this bang correct? let ret: EnemyPokemon; - this.scene.executeWithSeedOffset(() => { - const template = this.getPartyTemplate(); - const strength: PartyMemberStrength = template.getStrength(index); + globalScene.executeWithSeedOffset( + () => { + const template = this.getPartyTemplate(); + const strength: PartyMemberStrength = template.getStrength(index); - - // If the battle is not one of the named trainer doubles - if (!(this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly)) { - - if (this.config.partyMemberFuncs.hasOwnProperty(index)) { - ret = this.config.partyMemberFuncs[index](this.scene, level, strength); - return; - } - if (this.config.partyMemberFuncs.hasOwnProperty(index - template.size)) { - ret = this.config.partyMemberFuncs[index - template.size](this.scene, level, template.getStrength(index)); - return; - } - } - let offset = 0; - - if (template instanceof TrainerPartyCompoundTemplate) { - for (const innerTemplate of template.templates) { - if (offset + innerTemplate.size > index) { - break; + // If the battle is not one of the named trainer doubles + if (!(this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly)) { + if (this.config.partyMemberFuncs.hasOwnProperty(index)) { + ret = this.config.partyMemberFuncs[index](level, strength); + return; + } + if (this.config.partyMemberFuncs.hasOwnProperty(index - template.size)) { + ret = this.config.partyMemberFuncs[index - template.size](level, template.getStrength(index)); + return; } - offset += innerTemplate.size; } - } + let offset = 0; - // Create an empty species pool (which will be set to one of the species pools based on the index) - let newSpeciesPool: Species[] = []; - let useNewSpeciesPool = false; - - // If we are in a double battle of named trainers, we need to use alternate species pools (generate half the party from each trainer) - if (this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly) { - - // Use the new species pool for this party generation - useNewSpeciesPool = true; - - - // Get the species pool for the partner trainer and the current trainer - const speciesPoolPartner = signatureSpecies[TrainerType[this.config.trainerTypeDouble]]; - const speciesPool = signatureSpecies[TrainerType[this.config.trainerType]]; - - - // Get the species that are already in the enemy party so we dont generate the same species twice - const AlreadyUsedSpecies = battle.enemyParty.map(p => p.species.speciesId); - - // Filter out the species that are already in the enemy party from the main trainer species pool - const speciesPoolFiltered = speciesPool.filter(species => { - // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is - if (Array.isArray(species)) { - return !species.some(s => AlreadyUsedSpecies.includes(s)); + if (template instanceof TrainerPartyCompoundTemplate) { + for (const innerTemplate of template.templates) { + if (offset + innerTemplate.size > index) { + break; + } + offset += innerTemplate.size; } - return !AlreadyUsedSpecies.includes(species); - }).flat(); + } - // Filter out the species that are already in the enemy party from the partner trainer species pool - const speciesPoolPartnerFiltered = speciesPoolPartner.filter(species => { - // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is - if (Array.isArray(species)) { - return !species.some(s => AlreadyUsedSpecies.includes(s)); - } - return !AlreadyUsedSpecies.includes(species); - }).flat(); + // Create an empty species pool (which will be set to one of the species pools based on the index) + let newSpeciesPool: Species[] = []; + let useNewSpeciesPool = false; + // If we are in a double battle of named trainers, we need to use alternate species pools (generate half the party from each trainer) + if (this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly) { + // Use the new species pool for this party generation + useNewSpeciesPool = true; - // If the index is even, use the species pool for the main trainer (that way he only uses his own pokemon in battle) - if (!(index % 2)) { - // Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza - if (index === 0 && (TrainerType[this.config.trainerType] === TrainerType[TrainerType.TATE])) { - newSpeciesPool = [ Species.SOLROCK ]; - } else if (index === 0 && (TrainerType[this.config.trainerType] === TrainerType[TrainerType.LIZA])) { - newSpeciesPool = [ Species.LUNATONE ]; + // Get the species pool for the partner trainer and the current trainer + const speciesPoolPartner = signatureSpecies[TrainerType[this.config.trainerTypeDouble]]; + const speciesPool = signatureSpecies[TrainerType[this.config.trainerType]]; + + // Get the species that are already in the enemy party so we dont generate the same species twice + const AlreadyUsedSpecies = battle.enemyParty.map(p => p.species.speciesId); + + // Filter out the species that are already in the enemy party from the main trainer species pool + const speciesPoolFiltered = speciesPool + .filter(species => { + // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is + if (Array.isArray(species)) { + return !species.some(s => AlreadyUsedSpecies.includes(s)); + } + return !AlreadyUsedSpecies.includes(species); + }) + .flat(); + + // Filter out the species that are already in the enemy party from the partner trainer species pool + const speciesPoolPartnerFiltered = speciesPoolPartner + .filter(species => { + // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is + if (Array.isArray(species)) { + return !species.some(s => AlreadyUsedSpecies.includes(s)); + } + return !AlreadyUsedSpecies.includes(species); + }) + .flat(); + + // If the index is even, use the species pool for the main trainer (that way he only uses his own pokemon in battle) + if (!(index % 2)) { + // Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza + if (index === 0 && TrainerType[this.config.trainerType] === TrainerType[TrainerType.TATE]) { + newSpeciesPool = [Species.SOLROCK]; + } else if (index === 0 && TrainerType[this.config.trainerType] === TrainerType[TrainerType.LIZA]) { + newSpeciesPool = [Species.LUNATONE]; + } else { + newSpeciesPool = speciesPoolFiltered; + } } else { - newSpeciesPool = speciesPoolFiltered; + // If the index is odd, use the species pool for the partner trainer (that way he only uses his own pokemon in battle) + // Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza + if (index === 1 && TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.TATE]) { + newSpeciesPool = [Species.SOLROCK]; + } else if (index === 1 && TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.LIZA]) { + newSpeciesPool = [Species.LUNATONE]; + } else { + newSpeciesPool = speciesPoolPartnerFiltered; + } } - } else { - // If the index is odd, use the species pool for the partner trainer (that way he only uses his own pokemon in battle) - // Since the only currently allowed double battle with named trainers is Tate & Liza, we need to make sure that Solrock is the first pokemon in the party for Tate and Lunatone for Liza - if (index === 1 && (TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.TATE])) { - newSpeciesPool = [ Species.SOLROCK ]; - } else if (index === 1 && (TrainerType[this.config.trainerTypeDouble] === TrainerType[TrainerType.LIZA])) { - newSpeciesPool = [ Species.LUNATONE ]; - } else { - newSpeciesPool = speciesPoolPartnerFiltered; + // Fallback for when the species pool is empty + if (newSpeciesPool.length === 0) { + // If all pokemon from this pool are already in the party, generate a random species + useNewSpeciesPool = false; } } - // Fallback for when the species pool is empty - if (newSpeciesPool.length === 0) { - // If all pokemon from this pool are already in the party, generate a random species - useNewSpeciesPool = false; + + // If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species + let species = useNewSpeciesPool + ? getPokemonSpecies(newSpeciesPool[Math.floor(Utils.randSeedInt(newSpeciesPool.length))]) + : template.isSameSpecies(index) && index > offset + ? getPokemonSpecies( + battle.enemyParty[offset].species.getTrainerSpeciesForLevel( + level, + false, + template.getStrength(offset), + globalScene.currentBattle.waveIndex, + ), + ) + : this.genNewPartyMemberSpecies(level, strength); + + // If the species is from newSpeciesPool, we need to adjust it based on the level and strength + if (newSpeciesPool) { + species = getPokemonSpecies( + species.getSpeciesForLevel(level, true, true, strength, globalScene.currentBattle.waveIndex), + ); } - } - // If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species - let species = useNewSpeciesPool - ? getPokemonSpecies(newSpeciesPool[Math.floor(Utils.randSeedInt(newSpeciesPool.length))]) - : template.isSameSpecies(index) && index > offset - ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset), this.scene.currentBattle.waveIndex)) - : this.genNewPartyMemberSpecies(level, strength); - - // If the species is from newSpeciesPool, we need to adjust it based on the level and strength - if (newSpeciesPool) { - species = getPokemonSpecies(species.getSpeciesForLevel(level, true, true, strength, this.scene.currentBattle.waveIndex)); - } - - ret = this.scene.addEnemyPokemon(species, level, !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); - }, this.config.hasStaticParty ? this.config.getDerivedType() + ((index + 1) << 8) : this.scene.currentBattle.waveIndex + (this.config.getDerivedType() << 10) + (((!this.config.useSameSeedForAllMembers ? index : 0) + 1) << 8)); + ret = globalScene.addEnemyPokemon( + species, + level, + !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ); + }, + this.config.hasStaticParty + ? this.config.getDerivedType() + ((index + 1) << 8) + : globalScene.currentBattle.waveIndex + + (this.config.getDerivedType() << 10) + + (((!this.config.useSameSeedForAllMembers ? index : 0) + 1) << 8), + ); return ret!; // TODO: is this bang correct? } - - genNewPartyMemberSpecies(level: integer, strength: PartyMemberStrength, attempt?: integer): PokemonSpecies { - const battle = this.scene.currentBattle; + genNewPartyMemberSpecies(level: number, strength: PartyMemberStrength, attempt?: number): PokemonSpecies { + const battle = globalScene.currentBattle; const template = this.getPartyTemplate(); let baseSpecies: PokemonSpecies; if (this.config.speciesPools) { const tierValue = Utils.randSeedInt(512); - let tier = tierValue >= 156 ? TrainerPoolTier.COMMON : tierValue >= 32 ? TrainerPoolTier.UNCOMMON : tierValue >= 6 ? TrainerPoolTier.RARE : tierValue >= 1 ? TrainerPoolTier.SUPER_RARE : TrainerPoolTier.ULTRA_RARE; + let tier = + tierValue >= 156 + ? TrainerPoolTier.COMMON + : tierValue >= 32 + ? TrainerPoolTier.UNCOMMON + : tierValue >= 6 + ? TrainerPoolTier.RARE + : tierValue >= 1 + ? TrainerPoolTier.SUPER_RARE + : TrainerPoolTier.ULTRA_RARE; console.log(TrainerPoolTier[tier]); while (!this.config.speciesPools.hasOwnProperty(tier) || !this.config.speciesPools[tier].length) { - console.log(`Downgraded trainer Pokemon rarity tier from ${TrainerPoolTier[tier]} to ${TrainerPoolTier[tier - 1]}`); + console.log( + `Downgraded trainer Pokemon rarity tier from ${TrainerPoolTier[tier]} to ${TrainerPoolTier[tier - 1]}`, + ); tier--; } const tierPool = this.config.speciesPools[tier]; baseSpecies = getPokemonSpecies(Utils.randSeedItem(tierPool)); } else { - baseSpecies = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); + baseSpecies = globalScene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); } - let ret = getPokemonSpecies(baseSpecies.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex)); + let ret = getPokemonSpecies( + baseSpecies.getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex), + ); let retry = false; console.log(ret.getName()); @@ -406,27 +474,34 @@ export default class Trainer extends Phaser.GameObjects.Container { if (pokemonPrevolutions.hasOwnProperty(baseSpecies.speciesId) && ret.speciesId !== baseSpecies.speciesId) { retry = true; } else if (template.isBalanced(battle.enemyParty.length)) { - const partyMemberTypes = battle.enemyParty.map(p => p.getTypes(true)).flat(); - if (partyMemberTypes.indexOf(ret.type1) > -1 || (ret.type2 !== null && partyMemberTypes.indexOf(ret.type2) > -1)) { + const partyMemberTypes = battle.enemyParty.flatMap(p => p.getTypes(true)); + if ( + partyMemberTypes.indexOf(ret.type1) > -1 || + (ret.type2 !== null && partyMemberTypes.indexOf(ret.type2) > -1) + ) { retry = true; } } - if (!retry && this.config.specialtyTypes.length && !this.config.specialtyTypes.find(t => ret.isOfType(t))) { + // Prompts reroll of party member species if doesn't fit specialty type. + // Can be removed by adding a type parameter to getTrainerSpeciesForLevel and filtering the list of evolutions for that type. + if (!retry && this.config.hasSpecialtyType() && !ret.isOfType(this.config.specialtyType)) { retry = true; console.log("Attempting reroll of species evolution to fit specialty type..."); let evoAttempt = 0; while (retry && evoAttempt++ < 10) { - ret = getPokemonSpecies(baseSpecies.getTrainerSpeciesForLevel(level, true, strength, this.scene.currentBattle.waveIndex)); + ret = getPokemonSpecies( + baseSpecies.getTrainerSpeciesForLevel(level, true, strength, globalScene.currentBattle.waveIndex), + ); console.log(ret.name); - if (this.config.specialtyTypes.find(t => ret.isOfType(t))) { + if (ret.isOfType(this.config.specialtyType)) { retry = false; } } } // Prompts reroll of party member species if species already present in the enemy party - if (this.checkDuplicateSpecies(ret, baseSpecies)) { + if (this.checkDuplicateSpecies(baseSpecies.speciesId)) { console.log("Duplicate species detected, prompting reroll..."); retry = true; } @@ -441,28 +516,37 @@ export default class Trainer extends Phaser.GameObjects.Container { /** * Checks if the enemy trainer already has the Pokemon species in their party - * @param {PokemonSpecies} species {@linkcode PokemonSpecies} - * @param {PokemonSpecies} baseSpecies {@linkcode PokemonSpecies} - baseSpecies of the Pokemon if species is forced to evolve + * @param baseSpecies - The base {@linkcode Species} of the current Pokemon * @returns `true` if the species is already present in the party */ - checkDuplicateSpecies(species: PokemonSpecies, baseSpecies: PokemonSpecies): boolean { - const staticPartyPokemon = (signatureSpecies[TrainerType[this.config.trainerType]] ?? []).flat(1); - - const currentPartySpecies = this.scene.getEnemyParty().map(p => { - return p.species.speciesId; + checkDuplicateSpecies(baseSpecies: Species): boolean { + const staticSpecies = (signatureSpecies[TrainerType[this.config.trainerType]] ?? []).flat(1).map(s => { + let root = s; + while (pokemonPrevolutions.hasOwnProperty(root)) { + root = pokemonPrevolutions[root]; + } + return root; }); - return currentPartySpecies.includes(species.speciesId) || staticPartyPokemon.includes(baseSpecies.speciesId); + + const currentSpecies = globalScene.getEnemyParty().map(p => { + return p.species.getRootSpeciesId(); + }); + + return currentSpecies.includes(baseSpecies) || staticSpecies.includes(baseSpecies); } - getPartyMemberMatchupScores(trainerSlot: TrainerSlot = TrainerSlot.NONE, forSwitch: boolean = false): [integer, integer][] { + getPartyMemberMatchupScores(trainerSlot: TrainerSlot = TrainerSlot.NONE, forSwitch = false): [number, number][] { if (trainerSlot && !this.isDouble()) { trainerSlot = TrainerSlot.NONE; } - const party = this.scene.getEnemyParty(); - const nonFaintedLegalPartyMembers = party.slice(this.scene.currentBattle.getBattlerCount()).filter(p => p.isAllowedInBattle()).filter(p => !trainerSlot || p.trainerSlot === trainerSlot); + const party = globalScene.getEnemyParty(); + const nonFaintedLegalPartyMembers = party + .slice(globalScene.currentBattle.getBattlerCount()) + .filter(p => p.isAllowedInBattle()) + .filter(p => !trainerSlot || p.trainerSlot === trainerSlot); const partyMemberScores = nonFaintedLegalPartyMembers.map(p => { - const playerField = this.scene.getPlayerField().filter(p => p.isAllowedInBattle()); + const playerField = globalScene.getPlayerField().filter(p => p.isAllowedInBattle()); let score = 0; if (playerField.length > 0) { @@ -474,17 +558,19 @@ export default class Trainer extends Phaser.GameObjects.Container { } score /= playerField.length; if (forSwitch && !p.isOnField()) { - this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); + globalScene.arena + .findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY) + .map(t => (score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p))); } } - return [ party.indexOf(p), score ]; - }) as [integer, integer][]; + return [party.indexOf(p), score]; + }) as [number, number][]; return partyMemberScores; } - getSortedPartyMemberMatchupScores(partyMemberScores: [integer, integer][] = this.getPartyMemberMatchupScores()) { + getSortedPartyMemberMatchupScores(partyMemberScores: [number, number][] = this.getPartyMemberMatchupScores()) { const sortedPartyMemberScores = partyMemberScores.slice(0); sortedPartyMemberScores.sort((a, b) => { const scoreA = a[1]; @@ -495,25 +581,33 @@ export default class Trainer extends Phaser.GameObjects.Container { return sortedPartyMemberScores; } - getNextSummonIndex(trainerSlot: TrainerSlot = TrainerSlot.NONE, partyMemberScores: [integer, integer][] = this.getPartyMemberMatchupScores(trainerSlot)): integer { + getNextSummonIndex( + trainerSlot: TrainerSlot = TrainerSlot.NONE, + partyMemberScores: [number, number][] = this.getPartyMemberMatchupScores(trainerSlot), + ): number { if (trainerSlot && !this.isDouble()) { trainerSlot = TrainerSlot.NONE; } const sortedPartyMemberScores = this.getSortedPartyMemberMatchupScores(partyMemberScores); - const maxScorePartyMemberIndexes = partyMemberScores.filter(pms => pms[1] === sortedPartyMemberScores[0][1]).map(pms => pms[0]); + const maxScorePartyMemberIndexes = partyMemberScores + .filter(pms => pms[1] === sortedPartyMemberScores[0][1]) + .map(pms => pms[0]); if (maxScorePartyMemberIndexes.length > 1) { - let rand: integer; - this.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(maxScorePartyMemberIndexes.length), this.scene.currentBattle.turn << 2); + let rand: number; + globalScene.executeWithSeedOffset( + () => (rand = Utils.randSeedInt(maxScorePartyMemberIndexes.length)), + globalScene.currentBattle.turn << 2, + ); return maxScorePartyMemberIndexes[rand!]; } return maxScorePartyMemberIndexes[0]; } - getPartyMemberModifierChanceMultiplier(index: integer): number { + getPartyMemberModifierChanceMultiplier(index: number): number { switch (this.getPartyTemplate().getStrength(index)) { case PartyMemberStrength.WEAKER: return 0.75; @@ -538,8 +632,15 @@ export default class Trainer extends Phaser.GameObjects.Container { return []; } + genAI(party: EnemyPokemon[]) { + if (this.config.genAIFuncs) { + this.config.genAIFuncs.forEach(f => f(party)); + } + console.log("Generated AI funcs"); + } + loadAssets(): Promise { - return this.config.loadAssets(this.scene, this.variant); + return this.config.loadAssets(this.variant); } initSprite(): void { @@ -555,7 +656,11 @@ export default class Trainer extends Phaser.GameObjects.Container { * @param animConfig {@linkcode Phaser.Types.Animations.PlayAnimationConfig} to pass to {@linkcode Phaser.GameObjects.Sprite.play} * @returns true if the sprite was able to be animated */ - tryPlaySprite(sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite, animConfig: Phaser.Types.Animations.PlayAnimationConfig): boolean { + tryPlaySprite( + sprite: Phaser.GameObjects.Sprite, + tintSprite: Phaser.GameObjects.Sprite, + animConfig: Phaser.Types.Animations.PlayAnimationConfig, + ): boolean { // Show an error in the console if there isn't a texture loaded if (sprite.texture.key === "__MISSING") { console.error(`No texture found for '${animConfig.key}'!`); @@ -579,7 +684,7 @@ export default class Trainer extends Phaser.GameObjects.Container { const trainerAnimConfig = { key: this.getKey(), repeat: 0, - startFrame: 0 + startFrame: 0, }; const sprites = this.getSprites(); const tintSprites = this.getTintSprites(); @@ -591,7 +696,7 @@ export default class Trainer extends Phaser.GameObjects.Container { const partnerTrainerAnimConfig = { key: this.getKey(true), repeat: 0, - startFrame: 0 + startFrame: 0, }; this.tryPlaySprite(sprites[1], tintSprites[1], partnerTrainerAnimConfig); @@ -599,9 +704,7 @@ export default class Trainer extends Phaser.GameObjects.Container { } getSprites(): Phaser.GameObjects.Sprite[] { - const ret: Phaser.GameObjects.Sprite[] = [ - this.getAt(0) - ]; + const ret: Phaser.GameObjects.Sprite[] = [this.getAt(0)]; if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) { ret.push(this.getAt(2)); } @@ -609,16 +712,14 @@ export default class Trainer extends Phaser.GameObjects.Container { } getTintSprites(): Phaser.GameObjects.Sprite[] { - const ret: Phaser.GameObjects.Sprite[] = [ - this.getAt(1) - ]; + const ret: Phaser.GameObjects.Sprite[] = [this.getAt(1)]; if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) { ret.push(this.getAt(3)); } return ret; } - tint(color: number, alpha?: number, duration?: integer, ease?: string): void { + tint(color: number, alpha?: number, duration?: number, ease?: string): void { const tintSprites = this.getTintSprites(); tintSprites.map(tintSprite => { tintSprite.setTintFill(color); @@ -627,11 +728,11 @@ export default class Trainer extends Phaser.GameObjects.Container { if (duration) { tintSprite.setAlpha(0); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: tintSprite, alpha: alpha || 1, duration: duration, - ease: ease || "Linear" + ease: ease || "Linear", }); } else { tintSprite.setAlpha(alpha); @@ -639,11 +740,11 @@ export default class Trainer extends Phaser.GameObjects.Container { }); } - untint(duration: integer, ease?: string): void { + untint(duration: number, ease?: string): void { const tintSprites = this.getTintSprites(); tintSprites.map(tintSprite => { if (duration) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: tintSprite, alpha: 0, duration: duration, @@ -651,7 +752,7 @@ export default class Trainer extends Phaser.GameObjects.Container { onComplete: () => { tintSprite.setVisible(false); tintSprite.setAlpha(1); - } + }, }); } else { tintSprite.setVisible(false); @@ -659,8 +760,18 @@ export default class Trainer extends Phaser.GameObjects.Container { } }); } -} -export default interface Trainer { - scene: BattleScene + /** + * Determines whether a Trainer should Terastallize their Pokemon + * @param pokemon {@linkcode EnemyPokemon} Trainer Pokemon in question + * @returns boolean Whether the EnemyPokemon should Terastalize this turn + */ + shouldTera(pokemon: EnemyPokemon): boolean { + if (this.config.trainerAI.teraMode === TeraAIMode.INSTANT_TERA) { + if (!pokemon.isTerastallized && this.config.trainerAI.instantTeras.includes(pokemon.initialTeamIndex)) { + return true; + } + } + return false; + } } diff --git a/src/game-mode.ts b/src/game-mode.ts index 8f1bb9356e6..9ab1674bcce 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -1,21 +1,25 @@ import i18next from "i18next"; -import { classicFixedBattles, FixedBattleConfig, FixedBattleConfigs } from "./battle"; -import BattleScene from "./battle-scene"; -import { allChallenges, applyChallenges, Challenge, ChallengeType, copyChallenge } from "./data/challenge"; -import PokemonSpecies, { allSpecies } from "./data/pokemon-species"; -import { Arena } from "./field/arena"; +import type { FixedBattleConfigs } from "./battle"; +import { classicFixedBattles, FixedBattleConfig } from "./battle"; +import type { Challenge } from "./data/challenge"; +import { allChallenges, applyChallenges, ChallengeType, copyChallenge } from "./data/challenge"; +import type PokemonSpecies from "./data/pokemon-species"; +import { allSpecies } from "./data/pokemon-species"; +import type { Arena } from "./field/arena"; import Overrides from "#app/overrides"; import * as Utils from "./utils"; import { Biome } from "#enums/biome"; import { Species } from "#enums/species"; import { Challenges } from "./enums/challenges"; +import { globalScene } from "#app/global-scene"; +import { getDailyStartingBiome } from "./data/daily-run"; export enum GameModes { CLASSIC, ENDLESS, SPLICED_ENDLESS, DAILY, - CHALLENGE + CHALLENGE, } interface GameModeConfig { @@ -33,8 +37,8 @@ interface GameModeConfig { } // Describes min and max waves for MEs in specific game modes -export const CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES: [number, number] = [ 10, 180 ]; -export const CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES: [number, number] = [ 10, 180 ]; +export const CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES: [number, number] = [10, 180]; +export const CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES: [number, number] = [10, 180]; export class GameMode implements GameModeConfig { public modeId: GameModes; @@ -87,7 +91,7 @@ export class GameMode implements GameModeConfig { * - 20 for Daily Runs * - 5 for all other modes */ - getStartingLevel(): integer { + getStartingLevel(): number { if (Overrides.STARTING_LEVEL_OVERRIDE) { return Overrides.STARTING_LEVEL_OVERRIDE; } @@ -104,27 +108,26 @@ export class GameMode implements GameModeConfig { * - override from overrides.ts * - 1000 */ - getStartingMoney(): integer { + getStartingMoney(): number { return Overrides.STARTING_MONEY_OVERRIDE || 1000; } /** - * @param scene current BattleScene * @returns either: * - random biome for Daily mode * - override from overrides.ts * - Town */ - getStartingBiome(scene: BattleScene): Biome { + getStartingBiome(): Biome { switch (this.modeId) { case GameModes.DAILY: - return scene.generateRandomBiome(this.getWaveForDifficulty(1)); + return getDailyStartingBiome(); default: return Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN; } } - getWaveForDifficulty(waveIndex: integer, ignoreCurveChanges: boolean = false): integer { + getWaveForDifficulty(waveIndex: number, ignoreCurveChanges = false): number { switch (this.modeId) { case GameModes.DAILY: return waveIndex + 30 + (!ignoreCurveChanges ? Math.floor(waveIndex / 5) : 0); @@ -136,24 +139,24 @@ export class GameMode implements GameModeConfig { /** * Determines whether or not to generate a trainer * @param waveIndex the current floor the player is on (trainer sprites fail to generate on X1 floors) - * @param arena the arena that contains the scene and functions - * @returns true if a trainer should be generated, false otherwise + * @param arena the current {@linkcode Arena} + * @returns `true` if a trainer should be generated, `false` otherwise */ - isWaveTrainer(waveIndex: integer, arena: Arena): boolean { + isWaveTrainer(waveIndex: number, arena: Arena): boolean { /** * Daily spawns trainers on floors 5, 15, 20, 25, 30, 35, 40, and 45 */ if (this.isDaily) { return waveIndex % 10 === 5 || (!(waveIndex % 10) && waveIndex > 10 && !this.isWaveFinal(waveIndex)); } - if ((waveIndex % 30) === (arena.scene.offsetGym ? 0 : 20) && !this.isWaveFinal(waveIndex)) { + if (waveIndex % 30 === (globalScene.offsetGym ? 0 : 20) && !this.isWaveFinal(waveIndex)) { return true; - } else if (waveIndex % 10 !== 1 && waveIndex % 10) { + } + if (waveIndex % 10 !== 1 && waveIndex % 10) { /** * Do not check X1 floors since there's a bug that stops trainer sprites from appearing * after a X0 full party heal */ - const trainerChance = arena.getTrainerChance(); let allowTrainerBattle = true; if (trainerChance) { @@ -163,11 +166,12 @@ export class GameMode implements GameModeConfig { if (w === waveIndex) { continue; } - if ((w % 30) === (arena.scene.offsetGym ? 0 : 20) || this.isFixedBattle(w)) { + if (w % 30 === (globalScene.offsetGym ? 0 : 20) || this.isFixedBattle(w)) { allowTrainerBattle = false; break; - } else if (w < waveIndex) { - arena.scene.executeWithSeedOffset(() => { + } + if (w < waveIndex) { + globalScene.executeWithSeedOffset(() => { const waveTrainerChance = arena.getTrainerChance(); if (!Utils.randSeedInt(waveTrainerChance)) { allowTrainerBattle = false; @@ -184,19 +188,27 @@ export class GameMode implements GameModeConfig { return false; } - isTrainerBoss(waveIndex: integer, biomeType: Biome, offsetGym: boolean): boolean { + isTrainerBoss(waveIndex: number, biomeType: Biome, offsetGym: boolean): boolean { switch (this.modeId) { case GameModes.DAILY: return waveIndex > 10 && waveIndex < 50 && !(waveIndex % 10); default: - return (waveIndex % 30) === (offsetGym ? 0 : 20) && (biomeType !== Biome.END || this.isClassic || this.isWaveFinal(waveIndex)); + return ( + waveIndex % 30 === (offsetGym ? 0 : 20) && + (biomeType !== Biome.END || this.isClassic || this.isWaveFinal(waveIndex)) + ); } } - getOverrideSpecies(waveIndex: integer): PokemonSpecies | null { + getOverrideSpecies(waveIndex: number): PokemonSpecies | null { if (this.isDaily && this.isWaveFinal(waveIndex)) { - const allFinalBossSpecies = allSpecies.filter(s => (s.subLegendary || s.legendary || s.mythical) - && s.baseTotal >= 600 && s.speciesId !== Species.ETERNATUS && s.speciesId !== Species.ARCEUS); + const allFinalBossSpecies = allSpecies.filter( + s => + (s.subLegendary || s.legendary || s.mythical) && + s.baseTotal >= 600 && + s.speciesId !== Species.ETERNATUS && + s.speciesId !== Species.ARCEUS, + ); return Utils.randSeedItem(allFinalBossSpecies); } @@ -209,7 +221,7 @@ export class GameMode implements GameModeConfig { * @param modeId game mode * @returns if the current wave is final for classic or daily OR a minor boss in endless */ - isWaveFinal(waveIndex: integer, modeId: GameModes = this.modeId): boolean { + isWaveFinal(waveIndex: number, modeId: GameModes = this.modeId): boolean { switch (modeId) { case GameModes.CLASSIC: case GameModes.CHALLENGE: @@ -223,69 +235,74 @@ export class GameMode implements GameModeConfig { } /** - * Every 10 waves is a boss battle - * @returns true if waveIndex is a multiple of 10 - */ - isBoss(waveIndex: integer): boolean { + * Every 10 waves is a boss battle + * @returns true if waveIndex is a multiple of 10 + */ + isBoss(waveIndex: number): boolean { return waveIndex % 10 === 0; } /** - * Every 50 waves of an Endless mode is a boss - * At this time it is paradox pokemon - * @returns true if waveIndex is a multiple of 50 in Endless - */ - isEndlessBoss(waveIndex: integer): boolean { - return !!(waveIndex % 50) && - (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); + * @returns `true` if the current battle is against classic mode's final boss + */ + isBattleClassicFinalBoss(waveIndex: number): boolean { + return (this.modeId === GameModes.CLASSIC || this.modeId === GameModes.CHALLENGE) && this.isWaveFinal(waveIndex); } /** - * Every 250 waves of an Endless mode is a minor boss - * At this time it is Eternatus - * @returns true if waveIndex is a multiple of 250 in Endless - */ - isEndlessMinorBoss(waveIndex: integer): boolean { - return waveIndex % 250 === 0 && - (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); + * Every 50 waves of an Endless mode is a boss + * At this time it is paradox pokemon + * @returns true if waveIndex is a multiple of 50 in Endless + */ + isEndlessBoss(waveIndex: number): boolean { + return waveIndex % 50 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); } /** - * Every 1000 waves of an Endless mode is a major boss - * At this time it is Eternamax Eternatus - * @returns true if waveIndex is a multiple of 1000 in Endless - */ - isEndlessMajorBoss(waveIndex: integer): boolean { - return waveIndex % 1000 === 0 && - (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); + * Every 250 waves of an Endless mode is a minor boss + * At this time it is Eternatus + * @returns true if waveIndex is a multiple of 250 in Endless + */ + isEndlessMinorBoss(waveIndex: number): boolean { + return waveIndex % 250 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); + } + + /** + * Every 1000 waves of an Endless mode is a major boss + * At this time it is Eternamax Eternatus + * @returns true if waveIndex is a multiple of 1000 in Endless + */ + isEndlessMajorBoss(waveIndex: number): boolean { + return waveIndex % 1000 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); } /** * Checks whether there is a fixed battle on this gamemode on a given wave. - * @param {integer} waveIndex The wave to check. + * @param {number} waveIndex The wave to check. * @returns {boolean} If this game mode has a fixed battle on this wave */ - isFixedBattle(waveIndex: integer): boolean { + isFixedBattle(waveIndex: number): boolean { const dummyConfig = new FixedBattleConfig(); - return this.battleConfig.hasOwnProperty(waveIndex) || applyChallenges(this, ChallengeType.FIXED_BATTLES, waveIndex, dummyConfig); + return ( + this.battleConfig.hasOwnProperty(waveIndex) || + applyChallenges(this, ChallengeType.FIXED_BATTLES, waveIndex, dummyConfig) + ); } /** * Returns the config for the fixed battle for a particular wave. - * @param {integer} waveIndex The wave to check. + * @param {number} waveIndex The wave to check. * @returns {boolean} The fixed battle for this wave. */ - getFixedBattle(waveIndex: integer): FixedBattleConfig { + getFixedBattle(waveIndex: number): FixedBattleConfig { const challengeConfig = new FixedBattleConfig(); if (applyChallenges(this, ChallengeType.FIXED_BATTLES, waveIndex, challengeConfig)) { return challengeConfig; - } else { - return this.battleConfig[waveIndex]; } + return this.battleConfig[waveIndex]; } - - getClearScoreBonus(): integer { + getClearScoreBonus(): number { switch (this.modeId) { case GameModes.CLASSIC: case GameModes.CHALLENGE: @@ -297,7 +314,7 @@ export class GameMode implements GameModeConfig { } } - getEnemyModifierChance(isBoss: boolean): integer { + getEnemyModifierChance(isBoss: boolean): number { switch (this.modeId) { case GameModes.CLASSIC: case GameModes.CHALLENGE: @@ -329,12 +346,12 @@ export class GameMode implements GameModeConfig { */ getMysteryEncounterLegalWaves(): [number, number] { switch (this.modeId) { - default: - return [ 0, 0 ]; case GameModes.CLASSIC: return CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES; case GameModes.CHALLENGE: return CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES; + default: + return [0, 0]; } } @@ -357,14 +374,40 @@ export class GameMode implements GameModeConfig { export function getGameMode(gameMode: GameModes): GameMode { switch (gameMode) { case GameModes.CLASSIC: - return new GameMode(GameModes.CLASSIC, { isClassic: true, hasTrainers: true, hasMysteryEncounters: true }, classicFixedBattles); + return new GameMode( + GameModes.CLASSIC, + { isClassic: true, hasTrainers: true, hasMysteryEncounters: true }, + classicFixedBattles, + ); case GameModes.ENDLESS: - return new GameMode(GameModes.ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true }); + return new GameMode(GameModes.ENDLESS, { + isEndless: true, + hasShortBiomes: true, + hasRandomBosses: true, + }); case GameModes.SPLICED_ENDLESS: - return new GameMode(GameModes.SPLICED_ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true, isSplicedOnly: true }); + return new GameMode(GameModes.SPLICED_ENDLESS, { + isEndless: true, + hasShortBiomes: true, + hasRandomBosses: true, + isSplicedOnly: true, + }); case GameModes.DAILY: - return new GameMode(GameModes.DAILY, { isDaily: true, hasTrainers: true, hasNoShop: true }); + return new GameMode(GameModes.DAILY, { + isDaily: true, + hasTrainers: true, + hasNoShop: true, + }); case GameModes.CHALLENGE: - return new GameMode(GameModes.CHALLENGE, { isClassic: true, hasTrainers: true, isChallenge: true, hasMysteryEncounters: true }, classicFixedBattles); + return new GameMode( + GameModes.CHALLENGE, + { + isClassic: true, + hasTrainers: true, + isChallenge: true, + hasMysteryEncounters: true, + }, + classicFixedBattles, + ); } } diff --git a/src/global-scene.ts b/src/global-scene.ts new file mode 100644 index 00000000000..76071bd7fac --- /dev/null +++ b/src/global-scene.ts @@ -0,0 +1,7 @@ +import type BattleScene from "#app/battle-scene"; + +export let globalScene: BattleScene; + +export function initGlobalScene(scene: BattleScene): void { + globalScene = scene; +} diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index 537d2870259..fb4555084ee 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -7,46 +7,42 @@ import pad_xbox360 from "./configs/inputs/pad_xbox360"; import pad_dualshock from "./configs/inputs/pad_dualshock"; import pad_procon from "./configs/inputs/pad_procon"; import { Mode } from "./ui/ui"; -import SettingsGamepadUiHandler from "./ui/settings/settings-gamepad-ui-handler"; -import SettingsKeyboardUiHandler from "./ui/settings/settings-keyboard-ui-handler"; +import type SettingsGamepadUiHandler from "./ui/settings/settings-gamepad-ui-handler"; +import type SettingsKeyboardUiHandler from "./ui/settings/settings-keyboard-ui-handler"; import cfg_keyboard_qwerty from "./configs/inputs/cfg_keyboard_qwerty"; -import { - assign, - getButtonWithKeycode, - getIconForLatestInput, swap, -} from "#app/configs/inputs/configHandler"; -import BattleScene from "./battle-scene"; -import { SettingGamepad } from "#app/system/settings/settings-gamepad"; -import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { assign, getButtonWithKeycode, getIconForLatestInput, swap } from "#app/configs/inputs/configHandler"; +import { globalScene } from "#app/global-scene"; +import type { SettingGamepad } from "#app/system/settings/settings-gamepad"; +import type { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import TouchControl from "#app/touch-controls"; import { Button } from "#enums/buttons"; import { Device } from "#enums/devices"; import MoveTouchControlsHandler from "./ui/settings/move-touch-controls-handler"; export interface DeviceMapping { - [key: string]: number; + [key: string]: number; } export interface IconsMapping { - [key: string]: string; + [key: string]: string; } export interface SettingMapping { - [key: string]: Button; + [key: string]: Button; } export interface MappingLayout { - [key: string]: SettingGamepad | SettingKeyboard | number; + [key: string]: SettingGamepad | SettingKeyboard | number; } export interface InterfaceConfig { - padID: string; - padType: string; - deviceMapping: DeviceMapping; - icons: IconsMapping; - settings: SettingMapping; - default: MappingLayout; - custom?: MappingLayout; + padID: string; + padType: string; + deviceMapping: DeviceMapping; + icons: IconsMapping; + settings: SettingMapping; + default: MappingLayout; + custom?: MappingLayout; } const repeatInputDelayMillis = 250; @@ -75,41 +71,35 @@ const repeatInputDelayMillis = 250; */ export class InputsController { private gamepads: Array = new Array(); - private scene: BattleScene; public events: Phaser.Events.EventEmitter; private buttonLock: Button[] = new Array(); private interactions: Map> = new Map(); private configs: Map = new Map(); - public gamepadSupport: boolean = true; + public gamepadSupport = true; public selectedDevice; - private disconnectedGamepads: Array = new Array(); + private disconnectedGamepads: Array = new Array(); - - public lastSource: string = "keyboard"; + public lastSource = "keyboard"; private inputInterval: NodeJS.Timeout[] = new Array(); private touchControls: TouchControl; public moveTouchControlsHandler: MoveTouchControlsHandler; /** - * Initializes a new instance of the game control system, setting up initial state and configurations. - * - * @param scene - The Phaser scene associated with this instance. - * - * @remarks - * This constructor initializes the game control system with necessary setups for handling inputs. - * It prepares an interactions array indexed by button identifiers and configures default states for each button. - * Specific buttons like MENU and STATS are set not to repeat their actions. - * It concludes by calling the `init` method to complete the setup. - */ - - constructor(scene: BattleScene) { - this.scene = scene; + * Initializes a new instance of the game control system, setting up initial state and configurations. + * + * @remarks + * This constructor initializes the game control system with necessary setups for handling inputs. + * It prepares an interactions array indexed by button identifiers and configures default states for each button. + * Specific buttons like MENU and STATS are set not to repeat their actions. + * It concludes by calling the `init` method to complete the setup. + */ + constructor() { this.selectedDevice = { [Device.GAMEPAD]: null, - [Device.KEYBOARD]: "default" + [Device.KEYBOARD]: "default", }; for (const b of Utils.getEnumValues(Button)) { @@ -126,71 +116,79 @@ export class InputsController { } /** - * Sets up event handlers and initializes gamepad and keyboard controls. - * - * @remarks - * This method configures event listeners for both gamepad and keyboard inputs. - * It handles gamepad connections/disconnections and button press events, and ensures keyboard controls are set up. - * Additionally, it manages the game's behavior when it loses focus to prevent unwanted game actions during this state. - */ + * Sets up event handlers and initializes gamepad and keyboard controls. + * + * @remarks + * This method configures event listeners for both gamepad and keyboard inputs. + * It handles gamepad connections/disconnections and button press events, and ensures keyboard controls are set up. + * Additionally, it manages the game's behavior when it loses focus to prevent unwanted game actions during this state. + */ init(): void { - this.events = this.scene.game.events; + this.events = globalScene.game.events; - this.scene.game.events.on(Phaser.Core.Events.BLUR, () => { + globalScene.game.events.on(Phaser.Core.Events.BLUR, () => { this.loseFocus(); }); - if (typeof this.scene.input.gamepad !== "undefined") { - this.scene.input.gamepad?.on("connected", function (thisGamepad) { - if (!thisGamepad) { - return; - } - this.refreshGamepads(); - this.setupGamepad(thisGamepad); - this.onReconnect(thisGamepad); - }, this); + if (typeof globalScene.input.gamepad !== "undefined") { + globalScene.input.gamepad?.on( + "connected", + function (thisGamepad) { + if (!thisGamepad) { + return; + } + this.refreshGamepads(); + this.setupGamepad(thisGamepad); + this.onReconnect(thisGamepad); + }, + this, + ); - this.scene.input.gamepad?.on("disconnected", function (thisGamepad) { - this.onDisconnect(thisGamepad); // when a gamepad is disconnected - }, this); + globalScene.input.gamepad?.on( + "disconnected", + function (thisGamepad) { + this.onDisconnect(thisGamepad); // when a gamepad is disconnected + }, + this, + ); // Check to see if the gamepad has already been setup by the browser - this.scene.input.gamepad?.refreshPads(); - if (this.scene.input.gamepad?.total) { + globalScene.input.gamepad?.refreshPads(); + if (globalScene.input.gamepad?.total) { this.refreshGamepads(); for (const thisGamepad of this.gamepads) { - this.scene.input.gamepad.emit("connected", thisGamepad); + globalScene.input.gamepad.emit("connected", thisGamepad); } } - this.scene.input.gamepad?.on("down", this.gamepadButtonDown, this); - this.scene.input.gamepad?.on("up", this.gamepadButtonUp, this); - this.scene.input.keyboard?.on("keydown", this.keyboardKeyDown, this); - this.scene.input.keyboard?.on("keyup", this.keyboardKeyUp, this); + globalScene.input.gamepad?.on("down", this.gamepadButtonDown, this); + globalScene.input.gamepad?.on("up", this.gamepadButtonUp, this); + globalScene.input.keyboard?.on("keydown", this.keyboardKeyDown, this); + globalScene.input.keyboard?.on("keyup", this.keyboardKeyUp, this); } - this.touchControls = new TouchControl(this.scene); + this.touchControls = new TouchControl(); this.moveTouchControlsHandler = new MoveTouchControlsHandler(this.touchControls); } /** - * Handles actions to take when the game loses focus, such as deactivating pressed keys. - * - * @remarks - * This method is triggered when the game or the browser tab loses focus. It ensures that any keys pressed are deactivated to prevent stuck keys affecting gameplay when the game is not active. - */ + * Handles actions to take when the game loses focus, such as deactivating pressed keys. + * + * @remarks + * This method is triggered when the game or the browser tab loses focus. It ensures that any keys pressed are deactivated to prevent stuck keys affecting gameplay when the game is not active. + */ loseFocus(): void { this.deactivatePressedKey(); this.touchControls.deactivatePressedKey(); } /** - * Enables or disables support for gamepad input. - * - * @param value - A boolean indicating whether gamepad support should be enabled (true) or disabled (false). - * - * @remarks - * This method toggles gamepad support. If disabled, it also ensures that all currently pressed gamepad buttons are deactivated to avoid stuck inputs. - */ + * Enables or disables support for gamepad input. + * + * @param value - A boolean indicating whether gamepad support should be enabled (true) or disabled (false). + * + * @remarks + * This method toggles gamepad support. If disabled, it also ensures that all currently pressed gamepad buttons are deactivated to avoid stuck inputs. + */ setGamepadSupport(value: boolean): void { if (value) { this.gamepadSupport = true; @@ -201,92 +199,92 @@ export class InputsController { } /** - * Sets the currently chosen gamepad and initializes related settings. - * This method first deactivates any active key presses and then initializes the gamepad settings. - * - * @param gamepad - The identifier of the gamepad to set as chosen. - */ - setChosenGamepad(gamepad: String): void { + * Sets the currently chosen gamepad and initializes related settings. + * This method first deactivates any active key presses and then initializes the gamepad settings. + * + * @param gamepad - The identifier of the gamepad to set as chosen. + */ + setChosenGamepad(gamepad: string): void { this.deactivatePressedKey(); this.initChosenGamepad(gamepad); } /** - * Sets the currently chosen keyboard layout and initializes related settings. - * - * @param layoutKeyboard - The identifier of the keyboard layout to set as chosen. - */ - setChosenKeyboardLayout(layoutKeyboard: String): void { + * Sets the currently chosen keyboard layout and initializes related settings. + * + * @param layoutKeyboard - The identifier of the keyboard layout to set as chosen. + */ + setChosenKeyboardLayout(layoutKeyboard: string): void { this.deactivatePressedKey(); this.initChosenLayoutKeyboard(layoutKeyboard); } /** - * Retrieves the identifiers of all connected gamepads, excluding any that are currently marked as disconnected. - * @returns Array An array of strings representing the IDs of the connected gamepads. - */ - getGamepadsName(): Array { + * Retrieves the identifiers of all connected gamepads, excluding any that are currently marked as disconnected. + * @returns Array An array of strings representing the IDs of the connected gamepads. + */ + getGamepadsName(): Array { return this.gamepads.filter(g => !this.disconnectedGamepads.includes(g.id)).map(g => g.id); } /** - * Initializes the chosen gamepad by setting its identifier in the local storage and updating the UI to reflect the chosen gamepad. - * If a gamepad name is provided, it uses that as the chosen gamepad; otherwise, it defaults to the currently chosen gamepad. - * @param gamepadName Optional parameter to specify the name of the gamepad to initialize as chosen. - */ - initChosenGamepad(gamepadName?: String): void { + * Initializes the chosen gamepad by setting its identifier in the local storage and updating the UI to reflect the chosen gamepad. + * If a gamepad name is provided, it uses that as the chosen gamepad; otherwise, it defaults to the currently chosen gamepad. + * @param gamepadName Optional parameter to specify the name of the gamepad to initialize as chosen. + */ + initChosenGamepad(gamepadName?: string): void { if (gamepadName) { this.selectedDevice[Device.GAMEPAD] = gamepadName.toLowerCase(); } - const handler = this.scene.ui?.handlers[Mode.SETTINGS_GAMEPAD] as SettingsGamepadUiHandler; - handler && handler.updateChosenGamepadDisplay(); + const handler = globalScene.ui?.handlers[Mode.SETTINGS_GAMEPAD] as SettingsGamepadUiHandler; + handler?.updateChosenGamepadDisplay(); } /** - * Initializes the chosen keyboard layout by setting its identifier in the local storage and updating the UI to reflect the chosen layout. - * If a layout name is provided, it uses that as the chosen layout; otherwise, it defaults to the currently chosen layout. - * @param layoutKeyboard Optional parameter to specify the name of the keyboard layout to initialize as chosen. - */ - initChosenLayoutKeyboard(layoutKeyboard?: String): void { + * Initializes the chosen keyboard layout by setting its identifier in the local storage and updating the UI to reflect the chosen layout. + * If a layout name is provided, it uses that as the chosen layout; otherwise, it defaults to the currently chosen layout. + * @param layoutKeyboard Optional parameter to specify the name of the keyboard layout to initialize as chosen. + */ + initChosenLayoutKeyboard(layoutKeyboard?: string): void { if (layoutKeyboard) { this.selectedDevice[Device.KEYBOARD] = layoutKeyboard.toLowerCase(); } - const handler = this.scene.ui?.handlers[Mode.SETTINGS_KEYBOARD] as SettingsKeyboardUiHandler; - handler && handler.updateChosenKeyboardDisplay(); + const handler = globalScene.ui?.handlers[Mode.SETTINGS_KEYBOARD] as SettingsKeyboardUiHandler; + handler?.updateChosenKeyboardDisplay(); } /** - * Handles the disconnection of a gamepad by adding its identifier to a list of disconnected gamepads. - * This is necessary because Phaser retains memory of previously connected gamepads, and without tracking - * disconnections, it would be impossible to determine the connection status of gamepads. This method ensures - * that disconnected gamepads are recognized and can be appropriately hidden in the gamepad selection menu. - * - * @param thisGamepad The gamepad that has been disconnected. - */ + * Handles the disconnection of a gamepad by adding its identifier to a list of disconnected gamepads. + * This is necessary because Phaser retains memory of previously connected gamepads, and without tracking + * disconnections, it would be impossible to determine the connection status of gamepads. This method ensures + * that disconnected gamepads are recognized and can be appropriately hidden in the gamepad selection menu. + * + * @param thisGamepad The gamepad that has been disconnected. + */ onDisconnect(thisGamepad: Phaser.Input.Gamepad.Gamepad): void { this.disconnectedGamepads.push(thisGamepad.id); } /** - * Updates the tracking of disconnected gamepads when a gamepad is reconnected. - * It removes the reconnected gamepad's identifier from the `disconnectedGamepads` array, - * effectively updating its status to connected. - * - * @param thisGamepad The gamepad that has been reconnected. - */ + * Updates the tracking of disconnected gamepads when a gamepad is reconnected. + * It removes the reconnected gamepad's identifier from the `disconnectedGamepads` array, + * effectively updating its status to connected. + * + * @param thisGamepad The gamepad that has been reconnected. + */ onReconnect(thisGamepad: Phaser.Input.Gamepad.Gamepad): void { this.disconnectedGamepads = this.disconnectedGamepads.filter(g => g !== thisGamepad.id); } /** - * Initializes or updates configurations for connected gamepads. - * It retrieves the names of all connected gamepads, sets up their configurations according to stored or default settings, - * and ensures these configurations are saved. If the connected gamepad is the currently chosen one, - * it reinitializes the chosen gamepad settings. - * - * @param thisGamepad The gamepad that is being set up. - */ - setupGamepad(thisGamepad: Phaser.Input.Gamepad.Gamepad): void { + * Initializes or updates configurations for connected gamepads. + * It retrieves the names of all connected gamepads, sets up their configurations according to stored or default settings, + * and ensures these configurations are saved. If the connected gamepad is the currently chosen one, + * it reinitializes the chosen gamepad settings. + * + * @param thisGamepad The gamepad that is being set up. + */ + setupGamepad(_thisGamepad: Phaser.Input.Gamepad.Gamepad): void { const allGamepads = this.getGamepadsName(); for (const gamepad of allGamepads) { const gamepadID = gamepad.toLowerCase(); @@ -296,49 +294,47 @@ export class InputsController { const config = deepCopy(this.getConfig(gamepadID)) as InterfaceConfig; config.custom = this.configs[gamepadID]?.custom || { ...config.default }; this.configs[gamepadID] = config; - this.scene.gameData?.saveMappingConfigs(gamepadID, this.configs[gamepadID]); + globalScene.gameData?.saveMappingConfigs(gamepadID, this.configs[gamepadID]); } this.lastSource = "gamepad"; - const handler = this.scene.ui?.handlers[Mode.SETTINGS_GAMEPAD] as SettingsGamepadUiHandler; - handler && handler.updateChosenGamepadDisplay(); + const handler = globalScene.ui?.handlers[Mode.SETTINGS_GAMEPAD] as SettingsGamepadUiHandler; + handler?.updateChosenGamepadDisplay(); } /** - * Initializes or updates configurations for connected keyboards. - */ + * Initializes or updates configurations for connected keyboards. + */ setupKeyboard(): void { - for (const layout of [ "default" ]) { + for (const layout of ["default"]) { const config = deepCopy(this.getConfigKeyboard(layout)) as InterfaceConfig; config.custom = this.configs[layout]?.custom || { ...config.default }; this.configs[layout] = config; - this.scene.gameData?.saveMappingConfigs(this.selectedDevice[Device.KEYBOARD], this.configs[layout]); + globalScene.gameData?.saveMappingConfigs(this.selectedDevice[Device.KEYBOARD], this.configs[layout]); } this.initChosenLayoutKeyboard(this.selectedDevice[Device.KEYBOARD]); } /** - * Refreshes and re-indexes the list of connected gamepads. - * - * @remarks - * This method updates the list of gamepads to exclude any that are undefined. - * It corrects the index of each gamepad to account for any previously undefined entries, - * ensuring that all gamepads are properly indexed and can be accurately referenced within the game. - */ + * Refreshes and re-indexes the list of connected gamepads. + * + * @remarks + * This method updates the list of gamepads to exclude any that are undefined. + * It corrects the index of each gamepad to account for any previously undefined entries, + * ensuring that all gamepads are properly indexed and can be accurately referenced within the game. + */ refreshGamepads(): void { // Sometimes, gamepads are undefined. For some reason. - this.gamepads = this.scene.input.gamepad?.gamepads.filter(function (el) { - return el !== null; - }) ?? []; + this.gamepads = globalScene.input.gamepad?.gamepads.filter(el => el !== null) ?? []; - for (const [ index, thisGamepad ] of this.gamepads.entries()) { + for (const [index, thisGamepad] of this.gamepads.entries()) { thisGamepad.index = index; // Overwrite the gamepad index, in case we had undefined gamepads earlier } } /** - * Ensures the keyboard is initialized by checking if there is an active configuration for the keyboard. - * If not, it sets up the keyboard with default configurations. - */ + * Ensures the keyboard is initialized by checking if there is an active configuration for the keyboard. + * If not, it sets up the keyboard with default configurations. + */ ensureKeyboardIsInit(): void { if (!this.getActiveConfig(Device.KEYBOARD)?.padID) { this.setupKeyboard(); @@ -346,10 +342,10 @@ export class InputsController { } /** - * Handles the keydown event for the keyboard. - * - * @param event The keyboard event. - */ + * Handles the keydown event for the keyboard. + * + * @param event The keyboard event. + */ keyboardKeyDown(event): void { this.lastSource = "keyboard"; this.ensureKeyboardIsInit(); @@ -374,10 +370,10 @@ export class InputsController { } /** - * Handles the keyup event for the keyboard. - * - * @param event The keyboard event. - */ + * Handles the keyup event for the keyboard. + * + * @param event The keyboard event. + */ keyboardKeyUp(event): void { this.lastSource = "keyboard"; const buttonUp = getButtonWithKeycode(this.getActiveConfig(Device.KEYBOARD), event.keyCode); @@ -393,15 +389,15 @@ export class InputsController { } /** - * Handles button press events on a gamepad. This method sets the gamepad as chosen on the first input if no gamepad is currently chosen. - * It checks if gamepad support is enabled and if the event comes from the chosen gamepad. If so, it maps the button press to a specific - * action using a custom configuration, emits an event for the button press, and records the time of the action. - * - * @param pad The gamepad on which the button was pressed. - * @param button The specific button that was pressed. - * @param value The intensity or value of the button press, if applicable. - */ - gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { + * Handles button press events on a gamepad. This method sets the gamepad as chosen on the first input if no gamepad is currently chosen. + * It checks if gamepad support is enabled and if the event comes from the chosen gamepad. If so, it maps the button press to a specific + * action using a custom configuration, emits an event for the button press, and records the time of the action. + * + * @param pad The gamepad on which the button was pressed. + * @param button The specific button that was pressed. + * @param value The intensity or value of the button press, if applicable. + */ + gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, _value: number): void { if (!this.configs[this.selectedDevice[Device.KEYBOARD]]?.padID) { this.setupKeyboard(); } @@ -409,7 +405,11 @@ export class InputsController { return; } this.lastSource = "gamepad"; - if (!this.selectedDevice[Device.GAMEPAD] || (this.scene.ui.getMode() !== Mode.GAMEPAD_BINDING && this.selectedDevice[Device.GAMEPAD] !== pad.id.toLowerCase())) { + if ( + !this.selectedDevice[Device.GAMEPAD] || + (globalScene.ui.getMode() !== Mode.GAMEPAD_BINDING && + this.selectedDevice[Device.GAMEPAD] !== pad.id.toLowerCase()) + ) { this.setChosenGamepad(pad.id); } if (!this.gamepadSupport || pad.id.toLowerCase() !== this.selectedDevice[Device.GAMEPAD].toLowerCase()) { @@ -441,15 +441,15 @@ export class InputsController { } /** - * Responds to a button release event on a gamepad by checking if the gamepad is supported and currently chosen. - * If conditions are met, it identifies the configured action for the button, emits an event signaling the button release, - * and clears the record of the button. - * - * @param pad The gamepad from which the button was released. - * @param button The specific button that was released. - * @param value The intensity or value of the button release, if applicable. - */ - gamepadButtonUp(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { + * Responds to a button release event on a gamepad by checking if the gamepad is supported and currently chosen. + * If conditions are met, it identifies the configured action for the button, emits an event signaling the button release, + * and clears the record of the button. + * + * @param pad The gamepad from which the button was released. + * @param button The specific button that was released. + * @param value The intensity or value of the button release, if applicable. + */ + gamepadButtonUp(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, _value: number): void { if (!pad) { return; } @@ -470,23 +470,26 @@ export class InputsController { } /** - * Retrieves the configuration object for a gamepad based on its identifier. The method identifies specific gamepad models - * based on substrings in the identifier and returns predefined configurations for recognized models. - * If no specific configuration matches, it defaults to a generic gamepad configuration. - * - * @param id The identifier string of the gamepad. - * @returns InterfaceConfig The configuration object corresponding to the identified gamepad type. - */ + * Retrieves the configuration object for a gamepad based on its identifier. The method identifies specific gamepad models + * based on substrings in the identifier and returns predefined configurations for recognized models. + * If no specific configuration matches, it defaults to a generic gamepad configuration. + * + * @param id The identifier string of the gamepad. + * @returns InterfaceConfig The configuration object corresponding to the identified gamepad type. + */ getConfig(id: string): InterfaceConfig { id = id.toLowerCase(); if (id.includes("081f") && id.includes("e401")) { return pad_unlicensedSNES; - } else if (id.includes("xbox") && id.includes("360")) { + } + if (id.includes("xbox") && id.includes("360")) { return pad_xbox360; - } else if (id.includes("054c")) { + } + if (id.includes("054c")) { return pad_dualshock; - } else if (id.includes("057e") && id.includes("2009")) { + } + if (id.includes("057e") && id.includes("2009")) { return pad_procon; } @@ -494,11 +497,11 @@ export class InputsController { } /** - * Retrieves the configuration object for a keyboard layout based on its identifier. - * - * @param id The identifier string of the keyboard layout. - * @returns InterfaceConfig The configuration object corresponding to the identified keyboard layout. - */ + * Retrieves the configuration object for a keyboard layout based on its identifier. + * + * @param id The identifier string of the keyboard layout. + * @returns InterfaceConfig The configuration object corresponding to the identified keyboard layout. + */ getConfigKeyboard(id: string): InterfaceConfig { if (id === "default") { return cfg_keyboard_qwerty; @@ -508,8 +511,8 @@ export class InputsController { } /** - * Deactivates all currently pressed keys. - */ + * Deactivates all currently pressed keys. + */ deactivatePressedKey(): void { for (const key of Object.keys(this.inputInterval)) { clearInterval(this.inputInterval[key]); @@ -518,11 +521,11 @@ export class InputsController { } /** - * Retrieves the active configuration for the currently chosen device. - * It checks if a specific device ID is stored in configurations and returns it. - * - * @returns InterfaceConfig The configuration object for the active gamepad, or null if not set. - */ + * Retrieves the active configuration for the currently chosen device. + * It checks if a specific device ID is stored in configurations and returns it. + * + * @returns InterfaceConfig The configuration object for the active gamepad, or null if not set. + */ getActiveConfig(device: Device) { if (this.configs[this.selectedDevice[device]]?.padID) { return this.configs[this.selectedDevice[device]]; @@ -540,9 +543,8 @@ export class InputsController { getLastSourceDevice(): Device { if (this.lastSource === "gamepad") { return Device.GAMEPAD; - } else { - return Device.KEYBOARD; } + return Device.KEYBOARD; } getLastSourceConfig() { @@ -559,16 +561,25 @@ export class InputsController { } /** - * Injects a custom mapping configuration into the configuration for a specific gamepad. - * If the device does not have an existing configuration, it initializes one first. - * - * @param selectedDevice The identifier of the device to configure. - * @param mappingConfigs The mapping configuration to apply to the device. - */ + * Injects a custom mapping configuration into the configuration for a specific gamepad. + * If the device does not have an existing configuration, it initializes one first. + * + * @param selectedDevice The identifier of the device to configure. + * @param mappingConfigs The mapping configuration to apply to the device. + */ injectConfig(selectedDevice: string, mappingConfigs): void { if (!this.configs[selectedDevice]) { this.configs[selectedDevice] = {}; } + // A proper way of handling migrating keybinds would be much better + const mappingOverrides = { + BUTTON_CYCLE_VARIANT: "BUTTON_CYCLE_TERA", + }; + for (const key in mappingConfigs.custom) { + if (mappingConfigs.custom[key] in mappingOverrides) { + mappingConfigs.custom[key] = mappingOverrides[mappingConfigs.custom[key]]; + } + } this.configs[selectedDevice].custom = mappingConfigs.custom; } @@ -581,18 +592,17 @@ export class InputsController { } /** - * Swaps a binding in the configuration. - * - * @param config The configuration object. - * @param settingName The name of the setting to swap. - * @param pressedButton The button that was pressed. - */ + * Swaps a binding in the configuration. + * + * @param config The configuration object. + * @param settingName The name of the setting to swap. + * @param pressedButton The button that was pressed. + */ assignBinding(config, settingName, pressedButton): boolean { this.deactivatePressedKey(); if (config.padType === "keyboard") { return assign(config, settingName, pressedButton); - } else { - return swap(config, settingName, pressedButton); } + return swap(config, settingName, pressedButton); } } diff --git a/src/interfaces/held-modifier-config.ts b/src/interfaces/held-modifier-config.ts index 2285babdbfd..5617cf2446a 100644 --- a/src/interfaces/held-modifier-config.ts +++ b/src/interfaces/held-modifier-config.ts @@ -1,5 +1,5 @@ -import { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; -import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; export default interface HeldModifierConfig { modifier: PokemonHeldItemModifierType | PokemonHeldItemModifier; diff --git a/src/interfaces/locales.ts b/src/interfaces/locales.ts index 4405095e0fe..2d26911f82f 100644 --- a/src/interfaces/locales.ts +++ b/src/interfaces/locales.ts @@ -1,93 +1,93 @@ export interface Localizable { - localize(): void; - } + localize(): void; +} export interface TranslationEntries { - [key: string]: string | { [key: string]: string } + [key: string]: string | { [key: string]: string }; } export interface SimpleTranslationEntries { - [key: string]: string - } + [key: string]: string; +} export interface MoveTranslationEntry { - name: string, - effect: string - } + name: string; + effect: string; +} export interface MoveTranslationEntries { - [key: string]: MoveTranslationEntry - } + [key: string]: MoveTranslationEntry; +} export interface AbilityTranslationEntry { - name: string, - description: string - } + name: string; + description: string; +} export interface AbilityTranslationEntries { - [key: string]: AbilityTranslationEntry - } + [key: string]: AbilityTranslationEntry; +} export interface ModifierTypeTranslationEntry { - name?: string, - description?: string, - extra?: SimpleTranslationEntries - } + name?: string; + description?: string; + extra?: SimpleTranslationEntries; +} export interface ModifierTypeTranslationEntries { - ModifierType: { [key: string]: ModifierTypeTranslationEntry }, - SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry }, - AttackTypeBoosterItem: SimpleTranslationEntries, - TempStatStageBoosterItem: SimpleTranslationEntries, - BaseStatBoosterItem: SimpleTranslationEntries, - EvolutionItem: SimpleTranslationEntries, - FormChangeItem: SimpleTranslationEntries, - } + ModifierType: { [key: string]: ModifierTypeTranslationEntry }; + SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry }; + AttackTypeBoosterItem: SimpleTranslationEntries; + TempStatStageBoosterItem: SimpleTranslationEntries; + BaseStatBoosterItem: SimpleTranslationEntries; + EvolutionItem: SimpleTranslationEntries; + FormChangeItem: SimpleTranslationEntries; +} export interface PokemonInfoTranslationEntries { - Stat: SimpleTranslationEntries, - Type: SimpleTranslationEntries, - } + Stat: SimpleTranslationEntries; + Type: SimpleTranslationEntries; +} export interface BerryTranslationEntry { - name: string, - effect: string, - } + name: string; + effect: string; +} export interface BerryTranslationEntries { - [key: string]: BerryTranslationEntry - } + [key: string]: BerryTranslationEntry; +} export interface StatusEffectTranslationEntries { - [key: string]: StatusEffectTranslationEntry + [key: string]: StatusEffectTranslationEntry; } export interface StatusEffectTranslationEntry { - name: string, - obtain: string, - obtainSource: string, - activation: string, - overlap: string, - heal: string - description: string, + name: string; + obtain: string; + obtainSource: string; + activation: string; + overlap: string; + heal: string; + description: string; } export interface AchievementTranslationEntry { - name?: string, - description?: string, - } + name?: string; + description?: string; +} export interface AchievementTranslationEntries { - [key: string]: AchievementTranslationEntry; - } + [key: string]: AchievementTranslationEntry; +} export interface DialogueTranslationEntry { - [key: number]: string; - } + [key: number]: string; +} export interface DialogueTranslationCategory { - [category: string]: DialogueTranslationEntry; - } + [category: string]: DialogueTranslationEntry; +} export interface DialogueTranslationEntries { - [trainertype: string]: DialogueTranslationCategory; - } + [trainertype: string]: DialogueTranslationCategory; +} diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 26936bcdaad..295dc318db4 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -5,12 +5,12 @@ import { SceneBase } from "#app/scene-base"; import { WindowVariant, getWindowVariantSuffix } from "#app/ui/ui-theme"; import { isMobile } from "#app/touch-controls"; import * as Utils from "#app/utils"; -import { initPokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import { initPokemonPrevolutions, initPokemonStarters } from "#app/data/balance/pokemon-evolutions"; import { initBiomes } from "#app/data/balance/biomes"; import { initEggMoves } from "#app/data/balance/egg-moves"; import { initPokemonForms } from "#app/data/pokemon-forms"; import { initSpecies } from "#app/data/pokemon-species"; -import { initMoves } from "#app/data/move"; +import { initMoves } from "#app/data/moves/move"; import { initAbilities } from "#app/data/ability"; import { initAchievements } from "#app/system/achv"; import { initTrainerTypeDialogue } from "#app/data/dialogue"; @@ -79,6 +79,7 @@ export class LoadingScene extends SceneBase { this.loadImage("icon_owned", "ui"); this.loadImage("icon_egg_move", "ui"); this.loadImage("ability_bar_left", "ui"); + this.loadImage("ability_bar_right", "ui"); this.loadImage("bgm_bar", "ui"); this.loadImage("party_exp_bar", "ui"); this.loadImage("achv_bar", "ui"); @@ -101,8 +102,12 @@ export class LoadingScene extends SceneBase { this.loadImage("icon_lock", "ui", "icon_lock.png"); this.loadImage("icon_stop", "ui", "icon_stop.png"); this.loadImage("icon_tera", "ui"); + this.loadImage("cursor_tera", "ui"); this.loadImage("type_tera", "ui"); this.loadAtlas("type_bgs", "ui"); + this.loadAtlas("button_tera", "ui"); + this.loadImage("mystery_egg", "ui"); + this.loadImage("normal_memory", "ui"); this.loadImage("dawn_icon_fg", "ui"); this.loadImage("dawn_icon_mg", "ui"); @@ -134,10 +139,10 @@ export class LoadingScene extends SceneBase { this.loadImage("summary_bg", "ui"); this.loadImage("summary_overlay_shiny", "ui"); this.loadImage("summary_profile", "ui"); - this.loadImage("summary_profile_prompt_z", "ui"); // The pixel Z button prompt - this.loadImage("summary_profile_prompt_a", "ui"); // The pixel A button prompt - this.loadImage("summary_profile_ability", "ui"); // Pixel text 'ABILITY' - this.loadImage("summary_profile_passive", "ui"); // Pixel text 'PASSIVE' + this.loadImage("summary_profile_prompt_z", "ui"); // The pixel Z button prompt + this.loadImage("summary_profile_prompt_a", "ui"); // The pixel A button prompt + this.loadImage("summary_profile_ability", "ui"); // Pixel text 'ABILITY' + this.loadImage("summary_profile_passive", "ui"); // Pixel text 'PASSIVE' this.loadImage("summary_status", "ui"); this.loadImage("summary_stats", "ui"); this.loadImage("summary_stats_overlay_exp", "ui"); @@ -154,6 +159,7 @@ export class LoadingScene extends SceneBase { this.loadImage("scroll_bar_handle", "ui"); this.loadImage("starter_container_bg", "ui"); this.loadImage("starter_select_bg", "ui"); + this.loadImage("pokedex_summary_bg", "ui"); this.loadImage("select_cursor", "ui"); this.loadImage("select_cursor_highlight", "ui"); this.loadImage("select_cursor_highlight_thick", "ui"); @@ -188,7 +194,7 @@ export class LoadingScene extends SceneBase { } if (getBiomeHasProps(bt)) { for (let p = 1; p <= 3; p++) { - const isPropAnimated = p === 3 && [ "power_plant", "end" ].find(b => b === btKey); + const isPropAnimated = p === 3 && ["power_plant", "end"].find(b => b === btKey); const propKey = `${btKey}_b_${p}`; if (!isPropAnimated) { this.loadImage(propKey, "arenas"); @@ -232,7 +238,7 @@ export class LoadingScene extends SceneBase { // Get current lang and load the types atlas for it. English will only load types while all other languages will load types and types_ const lang = i18next.resolvedLanguage; if (lang !== "en") { - if (Utils.verifyLang(lang)) { + if (Utils.hasAllLocalizedSprites(lang)) { this.loadAtlas(`statuses_${lang}`, ""); this.loadAtlas(`types_${lang}`, ""); } else { @@ -244,11 +250,11 @@ export class LoadingScene extends SceneBase { this.loadAtlas("statuses", ""); this.loadAtlas("types", ""); } - const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN" ]; + const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"]; if (lang && availableLangs.includes(lang)) { - this.loadImage("egg-update_" + lang, "events"); + this.loadImage(`pkmnday2025event-${lang}`, "events"); } else { - this.loadImage("egg-update_en", "events"); + this.loadImage("pkmnday2025event-en", "events"); } this.loadAtlas("statuses", ""); @@ -259,11 +265,11 @@ export class LoadingScene extends SceneBase { this.loadAtlas("egg_icons", "egg"); this.loadAtlas("egg_shard", "egg"); this.loadAtlas("egg_lightrays", "egg"); - Utils.getEnumKeys(GachaType).forEach(gt => { + for (const gt of Utils.getEnumKeys(GachaType)) { const key = gt.toLowerCase(); this.loadImage(`gacha_${key}`, "egg"); this.loadAtlas(`gacha_underlay_${key}`, "egg"); - }); + } this.loadImage("gacha_glass", "egg"); this.loadImage("gacha_eggs", "egg"); this.loadAtlas("gacha_hatch", "egg"); @@ -319,6 +325,7 @@ export class LoadingScene extends SceneBase { this.loadSe("pb_move"); this.loadSe("pb_catch"); this.loadSe("pb_lock"); + this.loadSe("crit_throw"); this.loadSe("pb_tray_enter"); this.loadSe("pb_tray_ball"); @@ -345,7 +352,11 @@ export class LoadingScene extends SceneBase { this.loadBgm("evolution", "bw/evolution.mp3"); this.loadBgm("evolution_fanfare", "bw/evolution_fanfare.mp3"); - this.load.plugin("rextexteditplugin", "https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rextexteditplugin.min.js", true); + this.load.plugin( + "rextexteditplugin", + "https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rextexteditplugin.min.js", + true, + ); this.loadLoadingScreen(); @@ -353,6 +364,7 @@ export class LoadingScene extends SceneBase { initVouchers(); initStatsKeys(); initPokemonPrevolutions(); + initPokemonStarters(); initBiomes(); initEggMoves(); initPokemonForms(); @@ -434,12 +446,22 @@ export class LoadingScene extends SceneBase { style: { font: "48px emerald", color: "#ffffff", - align: "center" + align: "center", }, }); disclaimerDescriptionText.setOrigin(0.5, 0.5); - loadingGraphics.push(bg, graphics, progressBar, progressBox, logo, percentText, assetText, disclaimerText, disclaimerDescriptionText); + loadingGraphics.push( + bg, + graphics, + progressBar, + progressBox, + logo, + percentText, + assetText, + disclaimerText, + disclaimerDescriptionText, + ); if (!mobile) { loadingGraphics.map(g => g.setVisible(false)); @@ -454,7 +476,9 @@ export class LoadingScene extends SceneBase { ease: "Sine.easeIn", onComplete: () => video.destroy(), }); - loadingGraphics.forEach(g => g.setVisible(true)); + for (const g of loadingGraphics) { + g.setVisible(true); + } }); intro.setOrigin(0, 0); intro.setScale(3); @@ -495,7 +519,9 @@ export class LoadingScene extends SceneBase { }); this.load.on(this.LOAD_EVENTS.COMPLETE, () => { - loadingGraphics.forEach(go => go.destroy()); + for (const go of loadingGraphics) { + go.destroy(); + } intro.destroy(); }); } diff --git a/src/main.ts b/src/main.ts index 92ee267bf65..3d3965cad08 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,9 +7,8 @@ import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin"; import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin"; import { initI18n } from "./plugins/i18n"; - // Catch global errors and display them in an alert so users can report the issue. -window.onerror = function (message, source, lineno, colno, error) { +window.onerror = (_message, _source, _lineno, _colno, error) => { console.error(error); // const errorString = `Received unhandled error. Open browser console and click OK to see details.\nError: ${message}\nSource: ${source}\nLine: ${lineno}\nColumn: ${colno}\nStack: ${error.stack}`; //alert(errorString); @@ -18,7 +17,7 @@ window.onerror = function (message, source, lineno, colno, error) { }; // Catch global promise rejections and display them in an alert so users can report the issue. -window.addEventListener("unhandledrejection", (event) => { +window.addEventListener("unhandledrejection", event => { // const errorString = `Received unhandled promise rejection. Open browser console and click OK to see details.\nReason: ${event.reason}`; console.error(event.reason); //alert(errorString); @@ -41,10 +40,10 @@ Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; document.fonts.load("16px emerald").then(() => document.fonts.load("10px pkmnems")); - +// biome-ignore lint/suspicious/noImplicitAnyLet: TODO let game; -const startGame = async () => { +const startGame = async (manifest?: any) => { await initI18n(); const LoadingScene = (await import("./loading-scene")).LoadingScene; const BattleScene = (await import("./battle-scene")).default; @@ -54,54 +53,63 @@ const startGame = async () => { scale: { width: 1920, height: 1080, - mode: Phaser.Scale.FIT + mode: Phaser.Scale.FIT, }, plugins: { - global: [{ - key: "rexInputTextPlugin", - plugin: InputTextPlugin, - start: true - }, { - key: "rexBBCodeTextPlugin", - plugin: BBCodeTextPlugin, - start: true - }, { - key: "rexTransitionImagePackPlugin", - plugin: TransitionImagePackPlugin, - start: true - }], - scene: [{ - key: "rexUI", - plugin: UIPlugin, - mapping: "rexUI" - }] + global: [ + { + key: "rexInputTextPlugin", + plugin: InputTextPlugin, + start: true, + }, + { + key: "rexBBCodeTextPlugin", + plugin: BBCodeTextPlugin, + start: true, + }, + { + key: "rexTransitionImagePackPlugin", + plugin: TransitionImagePackPlugin, + start: true, + }, + ], + scene: [ + { + key: "rexUI", + plugin: UIPlugin, + mapping: "rexUI", + }, + ], }, input: { mouse: { - target: "app" + target: "app", }, touch: { - target: "app" + target: "app", }, - gamepad: true + gamepad: true, }, dom: { - createContainer: true + createContainer: true, }, pixelArt: true, - pipeline: [ InvertPostFX ] as unknown as Phaser.Types.Core.PipelineConfig, - scene: [ LoadingScene, BattleScene ], - version: version + pipeline: [InvertPostFX] as unknown as Phaser.Types.Core.PipelineConfig, + scene: [LoadingScene, BattleScene], + version: version, }); game.sound.pauseOnBlur = false; + if (manifest) { + game["manifest"] = manifest; + } }; fetch("/manifest.json") .then(res => res.json()) .then(jsonResponse => { - startGame(); - game["manifest"] = jsonResponse.manifest; - }).catch(() => { + startGame(jsonResponse.manifest); + }) + .catch(() => { // Manifest not found (likely local build) startGame(); }); diff --git a/src/messages.ts b/src/messages.ts index 91f550918e5..e35b48f7226 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -1,5 +1,6 @@ +import { globalScene } from "#app/global-scene"; import { BattleSpec } from "#enums/battle-spec"; -import Pokemon from "./field/pokemon"; +import type Pokemon from "./field/pokemon"; import i18next from "i18next"; /** @@ -12,20 +13,22 @@ export function getPokemonNameWithAffix(pokemon: Pokemon | undefined): string { return "Missigno"; } - switch (pokemon.scene.currentBattle.battleSpec) { + switch (globalScene.currentBattle.battleSpec) { case BattleSpec.DEFAULT: return !pokemon.isPlayer() ? pokemon.hasTrainer() ? i18next.t("battle:foePokemonWithAffix", { - pokemonName: pokemon.getNameToRender(), - }) + pokemonName: pokemon.getNameToRender(), + }) : i18next.t("battle:wildPokemonWithAffix", { - pokemonName: pokemon.getNameToRender(), - }) + pokemonName: pokemon.getNameToRender(), + }) : pokemon.getNameToRender(); case BattleSpec.FINAL_BOSS: return !pokemon.isPlayer() - ? i18next.t("battle:foePokemonWithAffix", { pokemonName: pokemon.getNameToRender() }) + ? i18next.t("battle:foePokemonWithAffix", { + pokemonName: pokemon.getNameToRender(), + }) : pokemon.getNameToRender(); default: return pokemon.getNameToRender(); diff --git a/src/modifier/modifier-tier.ts b/src/modifier/modifier-tier.ts index 81bb1ad8ae5..d8a75e41b0a 100644 --- a/src/modifier/modifier-tier.ts +++ b/src/modifier/modifier-tier.ts @@ -4,5 +4,5 @@ export enum ModifierTier { ULTRA, ROGUE, MASTER, - LUXURY + LUXURY, } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 3e475c62590..3d2e67b0dc3 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,32 +1,130 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { EvolutionItem, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { tmPoolTiers, tmSpecies } from "#app/data/balance/tms"; import { getBerryEffectDescription, getBerryName } from "#app/data/berry"; -import { allMoves, AttackMove, selfStatLowerMoves } from "#app/data/move"; -import { getNatureName, getNatureStatMultiplier, Nature } from "#app/data/nature"; -import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS, PokeballType } from "#app/data/pokeball"; -import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; -import { getStatusEffectDescriptor, StatusEffect } from "#app/data/status-effect"; -import { Type } from "#app/data/type"; -import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { allMoves, AttackMove } from "#app/data/moves/move"; +import { getNatureName, getNatureStatMultiplier } from "#app/data/nature"; +import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; +import { + FormChangeItem, + pokemonFormChanges, + SpeciesFormChangeCondition, + SpeciesFormChangeItemTrigger, +} from "#app/data/pokemon-forms"; +import { getStatusEffectDescriptor } from "#app/data/status-effect"; +import { PokemonType } from "#enums/pokemon-type"; +import type { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { - AddPokeballModifier, AddVoucherModifier, AttackTypeBoosterModifier, BaseStatModifier, BerryModifier, BoostBugSpawnModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, CritBoosterModifier, DamageMoneyRewardModifier, DoubleBattleChanceBoosterModifier, EnemyAttackStatusEffectChanceModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, EvolutionItemModifier, EvolutionStatBoosterModifier, EvoTrackerModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, GigantamaxAccessModifier, HealingBoosterModifier, HealShopCostModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, IvScannerModifier, LevelIncrementBoosterModifier, LockModifierTiersModifier, MapModifier, MegaEvolutionAccessModifier, MoneyInterestModifier, MoneyMultiplierModifier, MoneyRewardModifier, MultipleParticipantExpBonusModifier, PokemonAllMovePpRestoreModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, PokemonInstantReviveModifier, PokemonLevelIncrementModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PokemonNatureChangeModifier, PokemonNatureWeightModifier, PokemonPpRestoreModifier, PokemonPpUpModifier, PokemonStatusHealModifier, PreserveBerryModifier, RememberMoveModifier, ResetNegativeStatStageModifier, ShinyRateBoosterModifier, SpeciesCritBoosterModifier, SpeciesStatBoosterModifier, SurviveDamageModifier, SwitchEffectTransferModifier, TempCritBoosterModifier, TempStatStageBoosterModifier, TerastallizeAccessModifier, TerastallizeModifier, TmModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier, type EnemyPersistentModifier, type Modifier, type PersistentModifier, TempExtraModifierModifier + AddPokeballModifier, + AddVoucherModifier, + AttackTypeBoosterModifier, + BaseStatModifier, + BerryModifier, + BoostBugSpawnModifier, + BypassSpeedChanceModifier, + ContactHeldItemTransferChanceModifier, + CritBoosterModifier, + DamageMoneyRewardModifier, + DoubleBattleChanceBoosterModifier, + EnemyAttackStatusEffectChanceModifier, + EnemyDamageBoosterModifier, + EnemyDamageReducerModifier, + EnemyEndureChanceModifier, + EnemyFusionChanceModifier, + EnemyStatusEffectHealChanceModifier, + EnemyTurnHealModifier, + EvolutionItemModifier, + EvolutionStatBoosterModifier, + EvoTrackerModifier, + ExpBalanceModifier, + ExpBoosterModifier, + ExpShareModifier, + ExtraModifierModifier, + FlinchChanceModifier, + FusePokemonModifier, + GigantamaxAccessModifier, + HealingBoosterModifier, + HealShopCostModifier, + HiddenAbilityRateBoosterModifier, + HitHealModifier, + IvScannerModifier, + LevelIncrementBoosterModifier, + LockModifierTiersModifier, + MapModifier, + MegaEvolutionAccessModifier, + MoneyInterestModifier, + MoneyMultiplierModifier, + MoneyRewardModifier, + MultipleParticipantExpBonusModifier, + PokemonAllMovePpRestoreModifier, + PokemonBaseStatFlatModifier, + PokemonBaseStatTotalModifier, + PokemonExpBoosterModifier, + PokemonFormChangeItemModifier, + PokemonFriendshipBoosterModifier, + PokemonHeldItemModifier, + PokemonHpRestoreModifier, + PokemonIncrementingStatModifier, + PokemonInstantReviveModifier, + PokemonLevelIncrementModifier, + PokemonMoveAccuracyBoosterModifier, + PokemonMultiHitModifier, + PokemonNatureChangeModifier, + PokemonNatureWeightModifier, + PokemonPpRestoreModifier, + PokemonPpUpModifier, + PokemonStatusHealModifier, + PreserveBerryModifier, + RememberMoveModifier, + ResetNegativeStatStageModifier, + ShinyRateBoosterModifier, + SpeciesCritBoosterModifier, + SpeciesStatBoosterModifier, + SurviveDamageModifier, + SwitchEffectTransferModifier, + TempCritBoosterModifier, + TempStatStageBoosterModifier, + TerastallizeAccessModifier, + TerrastalizeModifier, + TmModifier, + TurnHealModifier, + TurnHeldItemTransferModifier, + TurnStatusEffectModifier, + type EnemyPersistentModifier, + type Modifier, + type PersistentModifier, + TempExtraModifierModifier, + CriticalCatchChanceBoosterModifier, } from "#app/modifier/modifier"; import { ModifierTier } from "#app/modifier/modifier-tier"; import Overrides from "#app/overrides"; import { Unlockables } from "#app/system/unlockables"; import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "#app/system/voucher"; -import PartyUiHandler, { PokemonMoveSelectFilter, PokemonSelectFilter } from "#app/ui/party-ui-handler"; +import type { PokemonMoveSelectFilter, PokemonSelectFilter } from "#app/ui/party-ui-handler"; +import PartyUiHandler from "#app/ui/party-ui-handler"; import { getModifierTierTextTint } from "#app/ui/text"; -import { formatMoney, getEnumKeys, getEnumValues, IntegerHolder, NumberHolder, padInt, randSeedInt, randSeedItem } from "#app/utils"; +import { + formatMoney, + getEnumKeys, + getEnumValues, + isNullOrUndefined, + NumberHolder, + padInt, + randSeedInt, +} 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"; +import { Nature } from "#enums/nature"; +import { PokeballType } from "#enums/pokeball"; import { Species } from "#enums/species"; import { SpeciesFormKey } from "#enums/species-form-key"; -import { getStatKey, PermanentStat, Stat, TEMP_BATTLE_STATS, TempBattleStat } from "#enums/stat"; +import type { PermanentStat, TempBattleStat } from "#enums/stat"; +import { getStatKey, Stat, TEMP_BATTLE_STATS } from "#enums/stat"; +import { StatusEffect } from "#enums/status-effect"; import i18next from "i18next"; const outputModifierData = false; @@ -37,7 +135,7 @@ export enum ModifierPoolType { WILD, TRAINER, ENEMY_BUFF, - DAILY_STARTER + DAILY_STARTER, } type NewModifierFunc = (type: ModifierType, args: any[]) => Modifier; @@ -51,7 +149,13 @@ export class ModifierType { public tier: ModifierTier; protected newModifierFunc: NewModifierFunc | null; - constructor(localeKey: string | null, iconImage: string | null, newModifierFunc: NewModifierFunc | null, group?: string, soundName?: string) { + constructor( + localeKey: string | null, + iconImage: string | null, + newModifierFunc: NewModifierFunc | null, + group?: string, + soundName?: string, + ) { this.localeKey = localeKey!; // TODO: is this bang correct? this.iconImage = iconImage!; // TODO: is this bang correct? this.group = group!; // TODO: is this bang correct? @@ -63,7 +167,7 @@ export class ModifierType { return i18next.t(`${this.localeKey}.name` as any); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t(`${this.localeKey}.description` as any); } @@ -81,16 +185,16 @@ export class ModifierType { let poolTypes: ModifierPoolType[]; switch (poolType) { case ModifierPoolType.PLAYER: - poolTypes = [ poolType, ModifierPoolType.TRAINER, ModifierPoolType.WILD ]; + poolTypes = [poolType, ModifierPoolType.TRAINER, ModifierPoolType.WILD]; break; case ModifierPoolType.WILD: - poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.TRAINER ]; + poolTypes = [poolType, ModifierPoolType.PLAYER, ModifierPoolType.TRAINER]; break; case ModifierPoolType.TRAINER: - poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.WILD ]; + poolTypes = [poolType, ModifierPoolType.PLAYER, ModifierPoolType.WILD]; break; default: - poolTypes = [ poolType ]; + poolTypes = [poolType]; break; } // Try multiple pool types in case of stolen items @@ -121,22 +225,51 @@ export class ModifierType { * Populates item tier for ModifierType instance * Tier is a necessary field for items that appear in player shop (determines the Pokeball visual they use) * To find the tier, this function performs a reverse lookup of the item type in modifier pools + * It checks the weight of the item and will use the first tier for which the weight is greater than 0 + * This is to allow items to be in multiple item pools depending on the conditions, for example for events + * If all tiers have a weight of 0 for the item, the first tier where the item was found is used * @param poolType Default 'ModifierPoolType.PLAYER'. Which pool to lookup item tier from + * @param party optional. Needed to check the weight of modifiers with conditional weight (see {@linkcode WeightedModifierTypeWeightFunc}) + * if not provided or empty, the weight check will be ignored + * @param rerollCount Default `0`. Used to check the weight of modifiers with conditional weight (see {@linkcode WeightedModifierTypeWeightFunc}) */ - withTierFromPool(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierType { + withTierFromPool( + poolType: ModifierPoolType = ModifierPoolType.PLAYER, + party?: PlayerPokemon[], + rerollCount = 0, + ): ModifierType { + let defaultTier: undefined | ModifierTier; for (const tier of Object.values(getModifierPoolForType(poolType))) { for (const modifier of tier) { if (this.id === modifier.modifierType.id) { - this.tier = modifier.modifierType.tier; - return this; + let weight: number; + if (modifier.weight instanceof Function) { + weight = party ? modifier.weight(party, rerollCount) : 0; + } else { + weight = modifier.weight; + } + if (weight > 0) { + this.tier = modifier.modifierType.tier; + return this; + } + if (isNullOrUndefined(defaultTier)) { + // If weight is 0, keep track of the first tier where the item was found + defaultTier = modifier.modifierType.tier; + } } } } + // Didn't find a pool with weight > 0, fallback to first tier where the item was found, if any + if (defaultTier) { + this.tier = defaultTier; + } + return this; } newModifier(...args: any[]): Modifier | null { + // biome-ignore lint/complexity/useOptionalChain: Changing to optional would coerce null return into undefined return this.newModifierFunc && this.newModifierFunc(this, args); } } @@ -144,7 +277,7 @@ export class ModifierType { type ModifierTypeGeneratorFunc = (party: Pokemon[], pregenArgs?: any[]) => ModifierType | null; export class ModifierTypeGenerator extends ModifierType { - private genTypeFunc: ModifierTypeGeneratorFunc; + private genTypeFunc: ModifierTypeGeneratorFunc; constructor(genTypeFunc: ModifierTypeGeneratorFunc) { super(null, null, null); @@ -167,9 +300,9 @@ export interface GeneratedPersistentModifierType { class AddPokeballModifierType extends ModifierType { private pokeballType: PokeballType; - private count: integer; + private count: number; - constructor(iconImage: string, pokeballType: PokeballType, count: integer) { + constructor(iconImage: string, pokeballType: PokeballType, count: number) { super("", iconImage, (_type, _args) => new AddPokeballModifier(this, pokeballType, count), "pb", "se/pb_bounce_1"); this.pokeballType = pokeballType; this.count = count; @@ -177,42 +310,50 @@ class AddPokeballModifierType extends ModifierType { get name(): string { return i18next.t("modifierType:ModifierType.AddPokeballModifierType.name", { - "modifierCount": this.count, - "pokeballName": getPokeballName(this.pokeballType), + modifierCount: this.count, + pokeballName: getPokeballName(this.pokeballType), }); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.AddPokeballModifierType.description", { - "modifierCount": this.count, - "pokeballName": getPokeballName(this.pokeballType), - "catchRate": getPokeballCatchMultiplier(this.pokeballType) > -1 ? `${getPokeballCatchMultiplier(this.pokeballType)}x` : "100%", - "pokeballAmount": `${scene.pokeballCounts[this.pokeballType]}`, + modifierCount: this.count, + pokeballName: getPokeballName(this.pokeballType), + catchRate: + getPokeballCatchMultiplier(this.pokeballType) > -1 + ? `${getPokeballCatchMultiplier(this.pokeballType)}x` + : "100%", + pokeballAmount: `${globalScene.pokeballCounts[this.pokeballType]}`, }); } } class AddVoucherModifierType extends ModifierType { private voucherType: VoucherType; - private count: integer; + private count: number; - constructor(voucherType: VoucherType, count: integer) { - super("", getVoucherTypeIcon(voucherType), (_type, _args) => new AddVoucherModifier(this, voucherType, count), "voucher"); + constructor(voucherType: VoucherType, count: number) { + super( + "", + getVoucherTypeIcon(voucherType), + (_type, _args) => new AddVoucherModifier(this, voucherType, count), + "voucher", + ); this.count = count; this.voucherType = voucherType; } get name(): string { return i18next.t("modifierType:ModifierType.AddVoucherModifierType.name", { - "modifierCount": this.count, - "voucherTypeName": getVoucherTypeName(this.voucherType), + modifierCount: this.count, + voucherTypeName: getVoucherTypeName(this.voucherType), }); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.AddVoucherModifierType.description", { - "modifierCount": this.count, - "voucherTypeName": getVoucherTypeName(this.voucherType), + modifierCount: this.count, + voucherTypeName: getVoucherTypeName(this.voucherType), }); } } @@ -220,7 +361,14 @@ class AddVoucherModifierType extends ModifierType { export class PokemonModifierType extends ModifierType { public selectFilter: PokemonSelectFilter | undefined; - constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, group?: string, soundName?: string) { + constructor( + localeKey: string, + iconImage: string, + newModifierFunc: NewModifierFunc, + selectFilter?: PokemonSelectFilter, + group?: string, + soundName?: string, + ) { super(localeKey, iconImage, newModifierFunc, group, soundName); this.selectFilter = selectFilter; @@ -228,19 +376,38 @@ export class PokemonModifierType extends ModifierType { } export class PokemonHeldItemModifierType extends PokemonModifierType { - constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, group?: string, soundName?: string) { - super(localeKey, iconImage, newModifierFunc, (pokemon: PlayerPokemon) => { - const dummyModifier = this.newModifier(pokemon); - const matchingModifier = pokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(dummyModifier)) as PokemonHeldItemModifier; - const maxStackCount = dummyModifier.getMaxStackCount(pokemon.scene); - if (!maxStackCount) { - return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.inoperable", { "pokemonName": getPokemonNameWithAffix(pokemon) }); - } - if (matchingModifier && matchingModifier.stackCount === maxStackCount) { - return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", { "pokemonName": getPokemonNameWithAffix(pokemon) }); - } - return null; - }, group, soundName); + constructor( + localeKey: string, + iconImage: string, + newModifierFunc: NewModifierFunc, + group?: string, + soundName?: string, + ) { + super( + localeKey, + iconImage, + newModifierFunc, + (pokemon: PlayerPokemon) => { + const dummyModifier = this.newModifier(pokemon); + const matchingModifier = globalScene.findModifier( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(dummyModifier), + ) as PokemonHeldItemModifier; + const maxStackCount = dummyModifier.getMaxStackCount(); + if (!maxStackCount) { + return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.inoperable", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); + } + if (matchingModifier && matchingModifier.stackCount === maxStackCount) { + return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); + } + return null; + }, + group, + soundName, + ); } newModifier(...args: any[]): PokemonHeldItemModifier { @@ -248,31 +415,99 @@ export class PokemonHeldItemModifierType extends PokemonModifierType { } } -export class PokemonHpRestoreModifierType extends PokemonModifierType { - protected restorePoints: integer; - protected restorePercent: integer; - protected healStatus: boolean; +export class TerastallizeModifierType extends PokemonModifierType { + private teraType: PokemonType; - constructor(localeKey: string, iconImage: string, restorePoints: integer, restorePercent: integer, healStatus: boolean = false, newModifierFunc?: NewModifierFunc, selectFilter?: PokemonSelectFilter, group?: string) { - super(localeKey, iconImage, newModifierFunc || ((_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints, this.restorePercent, this.healStatus, false)), - selectFilter || ((pokemon: PlayerPokemon) => { - if (!pokemon.hp || (pokemon.isFullHp() && (!this.healStatus || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED))))) { + constructor(teraType: PokemonType) { + super( + "", + `${PokemonType[teraType].toLowerCase()}_tera_shard`, + (type, args) => new TerrastalizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), + (pokemon: PlayerPokemon) => { + if ( + [pokemon.species.speciesId, pokemon.fusionSpecies?.speciesId].filter( + s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA, + ).length > 0 + ) { return PartyUiHandler.NoEffectMessage; } return null; - }), group || "potion"); + }, + "tera_shard", + ); + + this.teraType = teraType; + } + + get name(): string { + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { + teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`), + }); + } + + getDescription(): string { + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { + teraType: i18next.t(`pokemonInfo:Type.${PokemonType[this.teraType]}`), + }); + } + + getPregenArgs(): any[] { + return [this.teraType]; + } +} + +export class PokemonHpRestoreModifierType extends PokemonModifierType { + protected restorePoints: number; + protected restorePercent: number; + protected healStatus: boolean; + + constructor( + localeKey: string, + iconImage: string, + restorePoints: number, + restorePercent: number, + healStatus = false, + newModifierFunc?: NewModifierFunc, + selectFilter?: PokemonSelectFilter, + group?: string, + ) { + super( + localeKey, + iconImage, + newModifierFunc || + ((_type, args) => + new PokemonHpRestoreModifier( + this, + (args[0] as PlayerPokemon).id, + this.restorePoints, + this.restorePercent, + this.healStatus, + false, + )), + selectFilter || + ((pokemon: PlayerPokemon) => { + if ( + !pokemon.hp || + (pokemon.isFullHp() && (!this.healStatus || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED)))) + ) { + return PartyUiHandler.NoEffectMessage; + } + return null; + }), + group || "potion", + ); this.restorePoints = restorePoints; this.restorePercent = restorePercent; this.healStatus = healStatus; } - getDescription(scene: BattleScene): string { + getDescription(): string { return this.restorePoints ? i18next.t("modifierType:ModifierType.PokemonHpRestoreModifierType.description", { - restorePoints: this.restorePoints, - restorePercent: this.restorePercent, - }) + restorePoints: this.restorePoints, + restorePercent: this.restorePercent, + }) : this.healStatus ? i18next.t("modifierType:ModifierType.PokemonHpRestoreModifierType.extra.fullyWithStatus") : i18next.t("modifierType:ModifierType.PokemonHpRestoreModifierType.extra.fully"); @@ -280,14 +515,23 @@ export class PokemonHpRestoreModifierType extends PokemonModifierType { } export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { - constructor(localeKey: string, iconImage: string, restorePercent: integer) { - super(localeKey, iconImage, 0, restorePercent, false, (_type, args) => new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, 0, this.restorePercent, false, true), - ((pokemon: PlayerPokemon) => { + constructor(localeKey: string, iconImage: string, restorePercent: number) { + super( + localeKey, + iconImage, + 0, + restorePercent, + false, + (_type, args) => + new PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, 0, this.restorePercent, false, true), + (pokemon: PlayerPokemon) => { if (!pokemon.isFainted()) { return PartyUiHandler.NoEffectMessage; } return null; - }), "revive"); + }, + "revive", + ); this.selectFilter = (pokemon: PlayerPokemon) => { if (pokemon.hp) { @@ -297,23 +541,29 @@ export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { }; } - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.PokemonReviveModifierType.description", { restorePercent: this.restorePercent }); + getDescription(): string { + return i18next.t("modifierType:ModifierType.PokemonReviveModifierType.description", { + restorePercent: this.restorePercent, + }); } } export class PokemonStatusHealModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, ((_type, args) => new PokemonStatusHealModifier(this, (args[0] as PlayerPokemon).id)), - ((pokemon: PlayerPokemon) => { + super( + localeKey, + iconImage, + (_type, args) => new PokemonStatusHealModifier(this, (args[0] as PlayerPokemon).id), + (pokemon: PlayerPokemon) => { if (!pokemon.hp || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED))) { return PartyUiHandler.NoEffectMessage; } return null; - })); + }, + ); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.PokemonStatusHealModifierType.description"); } } @@ -321,7 +571,14 @@ export class PokemonStatusHealModifierType extends PokemonModifierType { export abstract class PokemonMoveModifierType extends PokemonModifierType { public moveSelectFilter: PokemonMoveSelectFilter | undefined; - constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, selectFilter?: PokemonSelectFilter, moveSelectFilter?: PokemonMoveSelectFilter, group?: string) { + constructor( + localeKey: string, + iconImage: string, + newModifierFunc: NewModifierFunc, + selectFilter?: PokemonSelectFilter, + moveSelectFilter?: PokemonMoveSelectFilter, + group?: string, + ) { super(localeKey, iconImage, newModifierFunc, selectFilter, group); this.moveSelectFilter = moveSelectFilter; @@ -329,71 +586,91 @@ export abstract class PokemonMoveModifierType extends PokemonModifierType { } export class PokemonPpRestoreModifierType extends PokemonMoveModifierType { - protected restorePoints: integer; + protected restorePoints: number; - constructor(localeKey: string, iconImage: string, restorePoints: integer) { - super(localeKey, iconImage, (_type, args) => new PokemonPpRestoreModifier(this, (args[0] as PlayerPokemon).id, (args[1] as integer), this.restorePoints), + constructor(localeKey: string, iconImage: string, restorePoints: number) { + super( + localeKey, + iconImage, + (_type, args) => + new PokemonPpRestoreModifier(this, (args[0] as PlayerPokemon).id, args[1] as number, this.restorePoints), (_pokemon: PlayerPokemon) => { return null; - }, (pokemonMove: PokemonMove) => { + }, + (pokemonMove: PokemonMove) => { if (!pokemonMove.ppUsed) { return PartyUiHandler.NoEffectMessage; } return null; - }, "ether"); + }, + "ether", + ); this.restorePoints = restorePoints; } - getDescription(scene: BattleScene): string { + getDescription(): string { return this.restorePoints > -1 - ? i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.description", { restorePoints: this.restorePoints }) - : i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.extra.fully") - ; + ? i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.description", { + restorePoints: this.restorePoints, + }) + : i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.extra.fully"); } } export class PokemonAllMovePpRestoreModifierType extends PokemonModifierType { - protected restorePoints: integer; + protected restorePoints: number; - constructor(localeKey: string, iconImage: string, restorePoints: integer) { - super(localeKey, iconImage, (_type, args) => new PokemonAllMovePpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints), + constructor(localeKey: string, iconImage: string, restorePoints: number) { + super( + localeKey, + iconImage, + (_type, args) => new PokemonAllMovePpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints), (pokemon: PlayerPokemon) => { if (!pokemon.getMoveset().filter(m => m?.ppUsed).length) { return PartyUiHandler.NoEffectMessage; } return null; - }, "elixir"); + }, + "elixir", + ); this.restorePoints = restorePoints; } - getDescription(scene: BattleScene): string { + getDescription(): string { return this.restorePoints > -1 - ? i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.description", { restorePoints: this.restorePoints }) - : i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.extra.fully") - ; + ? i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.description", { + restorePoints: this.restorePoints, + }) + : i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.extra.fully"); } } export class PokemonPpUpModifierType extends PokemonMoveModifierType { - protected upPoints: integer; + protected upPoints: number; - constructor(localeKey: string, iconImage: string, upPoints: integer) { - super(localeKey, iconImage, (_type, args) => new PokemonPpUpModifier(this, (args[0] as PlayerPokemon).id, (args[1] as integer), this.upPoints), + constructor(localeKey: string, iconImage: string, upPoints: number) { + super( + localeKey, + iconImage, + (_type, args) => new PokemonPpUpModifier(this, (args[0] as PlayerPokemon).id, args[1] as number, this.upPoints), (_pokemon: PlayerPokemon) => { return null; - }, (pokemonMove: PokemonMove) => { - if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3) { + }, + (pokemonMove: PokemonMove) => { + if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3 || pokemonMove.maxPpOverride) { return PartyUiHandler.NoEffectMessage; } return null; - }, "ppUp"); + }, + "ppUp", + ); this.upPoints = upPoints; } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.PokemonPpUpModifierType.description", { upPoints: this.upPoints }); } } @@ -402,35 +679,53 @@ export class PokemonNatureChangeModifierType extends PokemonModifierType { protected nature: Nature; constructor(nature: Nature) { - super("", `mint_${getEnumKeys(Stat).find(s => getNatureStatMultiplier(nature, Stat[s]) > 1)?.toLowerCase() || "neutral" }`, ((_type, args) => new PokemonNatureChangeModifier(this, (args[0] as PlayerPokemon).id, this.nature)), - ((pokemon: PlayerPokemon) => { + super( + "", + `mint_${ + getEnumKeys(Stat) + .find(s => getNatureStatMultiplier(nature, Stat[s]) > 1) + ?.toLowerCase() || "neutral" + }`, + (_type, args) => new PokemonNatureChangeModifier(this, (args[0] as PlayerPokemon).id, this.nature), + (pokemon: PlayerPokemon) => { if (pokemon.getNature() === this.nature) { return PartyUiHandler.NoEffectMessage; } return null; - }), "mint"); + }, + "mint", + ); this.nature = nature; } get name(): string { - return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.name", { natureName: getNatureName(this.nature) }); + return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.name", { + natureName: getNatureName(this.nature), + }); } - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.description", { natureName: getNatureName(this.nature, true, true, true) }); + getDescription(): string { + return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.description", { + natureName: getNatureName(this.nature, true, true, true), + }); } } export class RememberMoveModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string, group?: string) { - super(localeKey, iconImage, (type, args) => new RememberMoveModifier(type, (args[0] as PlayerPokemon).id, (args[1] as integer)), + super( + localeKey, + iconImage, + (type, args) => new RememberMoveModifier(type, (args[0] as PlayerPokemon).id, args[1] as number), (pokemon: PlayerPokemon) => { if (!pokemon.getLearnableLevelMoves().length) { return PartyUiHandler.NoEffectMessage; } return null; - }, group); + }, + group, + ); } } @@ -443,9 +738,9 @@ export class DoubleBattleChanceBoosterModifierType extends ModifierType { this.maxBattles = maxBattles; } - getDescription(_scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.DoubleBattleChanceBoosterModifierType.description", { - battleCount: this.maxBattles + battleCount: this.maxBattles, }); } } @@ -461,22 +756,22 @@ export class TempStatStageBoosterModifierType extends ModifierType implements Ge this.stat = stat; this.nameKey = nameKey; - this.quantityKey = (stat !== Stat.ACC) ? "percentage" : "stage"; + this.quantityKey = stat !== Stat.ACC ? "percentage" : "stage"; } get name(): string { return i18next.t(`modifierType:TempStatStageBoosterItem.${this.nameKey}`); } - getDescription(_scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { stat: i18next.t(getStatKey(this.stat)), - amount: i18next.t(`modifierType:ModifierType.TempStatStageBoosterModifierType.extra.${this.quantityKey}`) + amount: i18next.t(`modifierType:ModifierType.TempStatStageBoosterModifierType.extra.${this.quantityKey}`), }); } getPregenArgs(): any[] { - return [ this.stat ]; + return [this.stat]; } } @@ -484,7 +779,12 @@ export class BerryModifierType extends PokemonHeldItemModifierType implements Ge private berryType: BerryType; constructor(berryType: BerryType) { - super("", `${BerryType[berryType].toLowerCase()}_berry`, (type, args) => new BerryModifier(type, (args[0] as Pokemon).id, berryType), "berry"); + super( + "", + `${BerryType[berryType].toLowerCase()}_berry`, + (type, args) => new BerryModifier(type, (args[0] as Pokemon).id, berryType), + "berry", + ); this.berryType = berryType; } @@ -493,79 +793,67 @@ export class BerryModifierType extends PokemonHeldItemModifierType implements Ge return getBerryName(this.berryType); } - getDescription(scene: BattleScene): string { + getDescription(): string { return getBerryEffectDescription(this.berryType); } getPregenArgs(): any[] { - return [ this.berryType ]; + return [this.berryType]; } } -function getAttackTypeBoosterItemName(type: Type) { - switch (type) { - case Type.NORMAL: - return "Silk Scarf"; - case Type.FIGHTING: - return "Black Belt"; - case Type.FLYING: - return "Sharp Beak"; - case Type.POISON: - return "Poison Barb"; - case Type.GROUND: - return "Soft Sand"; - case Type.ROCK: - return "Hard Stone"; - case Type.BUG: - return "Silver Powder"; - case Type.GHOST: - return "Spell Tag"; - case Type.STEEL: - return "Metal Coat"; - case Type.FIRE: - return "Charcoal"; - case Type.WATER: - return "Mystic Water"; - case Type.GRASS: - return "Miracle Seed"; - case Type.ELECTRIC: - return "Magnet"; - case Type.PSYCHIC: - return "Twisted Spoon"; - case Type.ICE: - return "Never-Melt Ice"; - case Type.DRAGON: - return "Dragon Fang"; - case Type.DARK: - return "Black Glasses"; - case Type.FAIRY: - return "Fairy Feather"; - } +enum AttackTypeBoosterItem { + SILK_SCARF, + BLACK_BELT, + SHARP_BEAK, + POISON_BARB, + SOFT_SAND, + HARD_STONE, + SILVER_POWDER, + SPELL_TAG, + METAL_COAT, + CHARCOAL, + MYSTIC_WATER, + MIRACLE_SEED, + MAGNET, + TWISTED_SPOON, + NEVER_MELT_ICE, + DRAGON_FANG, + BLACK_GLASSES, + FAIRY_FEATHER, } -export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { - public moveType: Type; - public boostPercent: integer; +export class AttackTypeBoosterModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ + public moveType: PokemonType; + public boostPercent: number; - constructor(moveType: Type, boostPercent: integer) { - super("", `${getAttackTypeBoosterItemName(moveType)?.replace(/[ \-]/g, "_").toLowerCase()}`, - (_type, args) => new AttackTypeBoosterModifier(this, (args[0] as Pokemon).id, moveType, boostPercent)); + constructor(moveType: PokemonType, boostPercent: number) { + super( + "", + `${AttackTypeBoosterItem[moveType]?.toLowerCase()}`, + (_type, args) => new AttackTypeBoosterModifier(this, (args[0] as Pokemon).id, moveType, boostPercent), + ); this.moveType = moveType; this.boostPercent = boostPercent; } get name(): string { - return i18next.t(`modifierType:AttackTypeBoosterItem.${getAttackTypeBoosterItemName(this.moveType)?.replace(/[ \-]/g, "_").toLowerCase()}`); + return i18next.t(`modifierType:AttackTypeBoosterItem.${AttackTypeBoosterItem[this.moveType]?.toLowerCase()}`); } - getDescription(scene: BattleScene): string { + getDescription(): string { // TODO: Need getTypeName? - return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", { moveType: i18next.t(`pokemonInfo:Type.${Type[this.moveType]}`) }); + return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", { + moveType: i18next.t(`pokemonInfo:Type.${PokemonType[this.moveType]}`), + }); } getPregenArgs(): any[] { - return [ this.moveType ]; + return [this.moveType]; } } @@ -576,29 +864,42 @@ export type SpeciesStatBoosterItem = keyof typeof SpeciesStatBoosterModifierType * @extends PokemonHeldItemModifierType * @implements GeneratedPersistentModifierType */ -export class SpeciesStatBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { +export class SpeciesStatBoosterModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ private key: SpeciesStatBoosterItem; constructor(key: SpeciesStatBoosterItem) { const item = SpeciesStatBoosterModifierTypeGenerator.items[key]; - super(`modifierType:SpeciesBoosterItem.${key}`, key.toLowerCase(), (type, args) => new SpeciesStatBoosterModifier(type, (args[0] as Pokemon).id, item.stats, item.multiplier, item.species)); + super( + `modifierType:SpeciesBoosterItem.${key}`, + key.toLowerCase(), + (type, args) => + new SpeciesStatBoosterModifier(type, (args[0] as Pokemon).id, item.stats, item.multiplier, item.species), + ); this.key = key; } getPregenArgs(): any[] { - return [ this.key ]; + return [this.key]; } } export class PokemonLevelIncrementModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, (_type, args) => new PokemonLevelIncrementModifier(this, (args[0] as PlayerPokemon).id), (_pokemon: PlayerPokemon) => null); + super( + localeKey, + iconImage, + (_type, args) => new PokemonLevelIncrementModifier(this, (args[0] as PlayerPokemon).id), + (_pokemon: PlayerPokemon) => null, + ); } - getDescription(scene: BattleScene): string { + getDescription(): string { let levels = 1; - const hasCandyJar = scene.modifiers.find(modifier => modifier instanceof LevelIncrementBoosterModifier); + const hasCandyJar = globalScene.modifiers.find(modifier => modifier instanceof LevelIncrementBoosterModifier); if (hasCandyJar) { levels += hasCandyJar.stackCount; } @@ -611,9 +912,9 @@ export class AllPokemonLevelIncrementModifierType extends ModifierType { super(localeKey, iconImage, (_type, _args) => new PokemonLevelIncrementModifier(this, -1)); } - getDescription(scene: BattleScene): string { + getDescription(): string { let levels = 1; - const hasCandyJar = scene.modifiers.find(modifier => modifier instanceof LevelIncrementBoosterModifier); + const hasCandyJar = globalScene.modifiers.find(modifier => modifier instanceof LevelIncrementBoosterModifier); if (hasCandyJar) { levels += hasCandyJar.stackCount; } @@ -621,7 +922,10 @@ export class AllPokemonLevelIncrementModifierType extends ModifierType { } } -export class BaseStatBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { +export class BaseStatBoosterModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ private stat: PermanentStat; private key: string; @@ -637,53 +941,77 @@ export class BaseStatBoosterModifierType extends PokemonHeldItemModifierType imp return i18next.t(`modifierType:BaseStatBoosterItem.${this.key}`); } - getDescription(_scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.BaseStatBoosterModifierType.description", { stat: i18next.t(getStatKey(this.stat)) }); + getDescription(): string { + return i18next.t("modifierType:ModifierType.BaseStatBoosterModifierType.description", { + stat: i18next.t(getStatKey(this.stat)), + }); } getPregenArgs(): any[] { - return [ this.stat ]; + return [this.stat]; } } /** * Shuckle Juice item */ -export class PokemonBaseStatTotalModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { - private readonly statModifier: integer; +export class PokemonBaseStatTotalModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ + private readonly statModifier: number; - constructor(statModifier: integer) { - super("modifierType:ModifierType.MYSTERY_ENCOUNTER_SHUCKLE_JUICE", "berry_juice", (_type, args) => new PokemonBaseStatTotalModifier(this, (args[0] as Pokemon).id, this.statModifier)); + constructor(statModifier: number) { + super( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_SHUCKLE_JUICE", + "berry_juice", + (_type, args) => new PokemonBaseStatTotalModifier(this, (args[0] as Pokemon).id, this.statModifier), + ); this.statModifier = statModifier; } - override getDescription(scene: BattleScene): string { + override getDescription(): string { return i18next.t("modifierType:ModifierType.PokemonBaseStatTotalModifierType.description", { - increaseDecrease: i18next.t(this.statModifier >= 0 ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.increase" : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.decrease"), - blessCurse: i18next.t(this.statModifier >= 0 ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.blessed" : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.cursed"), + increaseDecrease: i18next.t( + this.statModifier >= 0 + ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.increase" + : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.decrease", + ), + blessCurse: i18next.t( + this.statModifier >= 0 + ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.blessed" + : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.cursed", + ), statValue: this.statModifier, }); } public getPregenArgs(): any[] { - return [ this.statModifier ]; + return [this.statModifier]; } } /** * Old Gateau item */ -export class PokemonBaseStatFlatModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { - private readonly statModifier: integer; +export class PokemonBaseStatFlatModifierType + extends PokemonHeldItemModifierType + implements GeneratedPersistentModifierType +{ + private readonly statModifier: number; private readonly stats: Stat[]; - constructor(statModifier: integer, stats: Stat[]) { - super("modifierType:ModifierType.MYSTERY_ENCOUNTER_OLD_GATEAU", "old_gateau", (_type, args) => new PokemonBaseStatFlatModifier(this, (args[0] as Pokemon).id, this.statModifier, this.stats)); + constructor(statModifier: number, stats: Stat[]) { + super( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_OLD_GATEAU", + "old_gateau", + (_type, args) => new PokemonBaseStatFlatModifier(this, (args[0] as Pokemon).id, this.statModifier, this.stats), + ); this.statModifier = statModifier; this.stats = stats; } - override getDescription(scene: BattleScene): string { + override getDescription(): string { return i18next.t("modifierType:ModifierType.PokemonBaseStatFlatModifierType.description", { stats: this.stats.map(stat => i18next.t(getStatKey(stat))).join("/"), statValue: this.statModifier, @@ -691,7 +1019,7 @@ export class PokemonBaseStatFlatModifierType extends PokemonHeldItemModifierType } public getPregenArgs(): any[] { - return [ this.statModifier, this.stats ]; + return [this.statModifier, this.stats]; } } @@ -699,19 +1027,30 @@ class AllPokemonFullHpRestoreModifierType extends ModifierType { private descriptionKey: string; constructor(localeKey: string, iconImage: string, descriptionKey?: string, newModifierFunc?: NewModifierFunc) { - super(localeKey, iconImage, newModifierFunc || ((_type, _args) => new PokemonHpRestoreModifier(this, -1, 0, 100, false))); + super( + localeKey, + iconImage, + newModifierFunc || ((_type, _args) => new PokemonHpRestoreModifier(this, -1, 0, 100, false)), + ); this.descriptionKey = descriptionKey!; // TODO: is this bang correct? } - getDescription(scene: BattleScene): string { - return i18next.t(`${this.descriptionKey || "modifierType:ModifierType.AllPokemonFullHpRestoreModifierType"}.description` as any); + getDescription(): string { + return i18next.t( + `${this.descriptionKey || "modifierType:ModifierType.AllPokemonFullHpRestoreModifierType"}.description` as any, + ); } } class AllPokemonFullReviveModifierType extends AllPokemonFullHpRestoreModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, "modifierType:ModifierType.AllPokemonFullReviveModifierType", (_type, _args) => new PokemonHpRestoreModifier(this, -1, 0, 100, false, true)); + super( + localeKey, + iconImage, + "modifierType:ModifierType.AllPokemonFullReviveModifierType", + (_type, _args) => new PokemonHpRestoreModifier(this, -1, 0, 100, false, true), + ); } } @@ -726,10 +1065,10 @@ export class MoneyRewardModifierType extends ModifierType { this.moneyMultiplierDescriptorKey = moneyMultiplierDescriptorKey; } - getDescription(scene: BattleScene): string { - const moneyAmount = new IntegerHolder(scene.getWaveMoneyAmount(this.moneyMultiplier)); - scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); - const formattedMoney = formatMoney(scene.moneyFormat, moneyAmount.value); + getDescription(): string { + const moneyAmount = new NumberHolder(globalScene.getWaveMoneyAmount(this.moneyMultiplier)); + globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + const formattedMoney = formatMoney(globalScene.moneyFormat, moneyAmount.value); return i18next.t("modifierType:ModifierType.MoneyRewardModifierType.description", { moneyMultiplier: i18next.t(this.moneyMultiplierDescriptorKey as any), @@ -739,30 +1078,38 @@ export class MoneyRewardModifierType extends ModifierType { } export class ExpBoosterModifierType extends ModifierType { - private boostPercent: integer; + private boostPercent: number; - constructor(localeKey: string, iconImage: string, boostPercent: integer) { + constructor(localeKey: string, iconImage: string, boostPercent: number) { super(localeKey, iconImage, () => new ExpBoosterModifier(this, boostPercent)); this.boostPercent = boostPercent; } - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.ExpBoosterModifierType.description", { boostPercent: this.boostPercent }); + getDescription(): string { + return i18next.t("modifierType:ModifierType.ExpBoosterModifierType.description", { + boostPercent: this.boostPercent, + }); } } export class PokemonExpBoosterModifierType extends PokemonHeldItemModifierType { - private boostPercent: integer; + private boostPercent: number; - constructor(localeKey: string, iconImage: string, boostPercent: integer) { - super(localeKey, iconImage, (_type, args) => new PokemonExpBoosterModifier(this, (args[0] as Pokemon).id, boostPercent)); + constructor(localeKey: string, iconImage: string, boostPercent: number) { + super( + localeKey, + iconImage, + (_type, args) => new PokemonExpBoosterModifier(this, (args[0] as Pokemon).id, boostPercent), + ); this.boostPercent = boostPercent; } - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.PokemonExpBoosterModifierType.description", { boostPercent: this.boostPercent }); + getDescription(): string { + return i18next.t("modifierType:ModifierType.PokemonExpBoosterModifierType.description", { + boostPercent: this.boostPercent, + }); } } @@ -771,31 +1118,43 @@ export class PokemonFriendshipBoosterModifierType extends PokemonHeldItemModifie super(localeKey, iconImage, (_type, args) => new PokemonFriendshipBoosterModifier(this, (args[0] as Pokemon).id)); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.PokemonFriendshipBoosterModifierType.description"); } } export class PokemonMoveAccuracyBoosterModifierType extends PokemonHeldItemModifierType { - private amount: integer; + private amount: number; - constructor(localeKey: string, iconImage: string, amount: integer, group?: string, soundName?: string) { - super(localeKey, iconImage, (_type, args) => new PokemonMoveAccuracyBoosterModifier(this, (args[0] as Pokemon).id, amount), group, soundName); + constructor(localeKey: string, iconImage: string, amount: number, group?: string, soundName?: string) { + super( + localeKey, + iconImage, + (_type, args) => new PokemonMoveAccuracyBoosterModifier(this, (args[0] as Pokemon).id, amount), + group, + soundName, + ); this.amount = amount; } - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.PokemonMoveAccuracyBoosterModifierType.description", { accuracyAmount: this.amount }); + getDescription(): string { + return i18next.t("modifierType:ModifierType.PokemonMoveAccuracyBoosterModifierType.description", { + accuracyAmount: this.amount, + }); } } export class PokemonMultiHitModifierType extends PokemonHeldItemModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, (type, args) => new PokemonMultiHitModifier(type as PokemonMultiHitModifierType, (args[0] as Pokemon).id)); + super( + localeKey, + iconImage, + (type, args) => new PokemonMultiHitModifier(type as PokemonMultiHitModifierType, (args[0] as Pokemon).id), + ); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.PokemonMultiHitModifierType.description"); } } @@ -804,13 +1163,21 @@ export class TmModifierType extends PokemonModifierType { public moveId: Moves; constructor(moveId: Moves) { - super("", `tm_${Type[allMoves[moveId].type].toLowerCase()}`, (_type, args) => new TmModifier(this, (args[0] as PlayerPokemon).id), + super( + "", + `tm_${PokemonType[allMoves[moveId].type].toLowerCase()}`, + (_type, args) => new TmModifier(this, (args[0] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { - if (pokemon.compatibleTms.indexOf(moveId) === -1 || pokemon.getMoveset().filter(m => m?.moveId === moveId).length) { + if ( + pokemon.compatibleTms.indexOf(moveId) === -1 || + pokemon.getMoveset().filter(m => m?.moveId === moveId).length + ) { return PartyUiHandler.NoEffectMessage; } return null; - }, "tm"); + }, + "tm", + ); this.moveId = moveId; } @@ -822,8 +1189,13 @@ export class TmModifierType extends PokemonModifierType { }); } - getDescription(scene: BattleScene): string { - return i18next.t(scene.enableMoveInfo ? "modifierType:ModifierType.TmModifierTypeWithInfo.description" : "modifierType:ModifierType.TmModifierType.description", { moveName: allMoves[this.moveId].name }); + getDescription(): string { + return i18next.t( + globalScene.enableMoveInfo + ? "modifierType:ModifierType.TmModifierTypeWithInfo.description" + : "modifierType:ModifierType.TmModifierType.description", + { moveName: allMoves[this.moveId].name }, + ); } } @@ -831,18 +1203,41 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge public evolutionItem: EvolutionItem; constructor(evolutionItem: EvolutionItem) { - super("", EvolutionItem[evolutionItem].toLowerCase(), (_type, args) => new EvolutionItemModifier(this, (args[0] as PlayerPokemon).id), + super( + "", + EvolutionItem[evolutionItem].toLowerCase(), + (_type, args) => new EvolutionItemModifier(this, (args[0] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { - if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === this.evolutionItem - && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === null || e.preFormKey === pokemon.getFormKey())).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + if ( + pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && + pokemonEvolutions[pokemon.species.speciesId].filter( + e => + e.item === this.evolutionItem && + (!e.condition || e.condition.predicate(pokemon)) && + (e.preFormKey === null || e.preFormKey === pokemon.getFormKey()), + ).length && + pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX + ) { return null; - } else if (pokemon.isFusion() && pokemon.fusionSpecies && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === this.evolutionItem - && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === null || e.preFormKey === pokemon.getFusionFormKey())).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + } + if ( + pokemon.isFusion() && + pokemon.fusionSpecies && + pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && + pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter( + e => + e.item === this.evolutionItem && + (!e.condition || e.condition.predicate(pokemon)) && + (e.preFormKey === null || e.preFormKey === pokemon.getFusionFormKey()), + ).length && + pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX + ) { return null; } return PartyUiHandler.NoEffectMessage; - }); + }, + ); this.evolutionItem = evolutionItem; } @@ -851,12 +1246,12 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge return i18next.t(`modifierType:EvolutionItem.${EvolutionItem[this.evolutionItem]}`); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.EvolutionItemModifierType.description"); } getPregenArgs(): any[] { - return [ this.evolutionItem ]; + return [this.evolutionItem]; } } @@ -867,21 +1262,30 @@ export class FormChangeItemModifierType extends PokemonModifierType implements G public formChangeItem: FormChangeItem; constructor(formChangeItem: FormChangeItem) { - super("", FormChangeItem[formChangeItem].toLowerCase(), (_type, args) => new PokemonFormChangeItemModifier(this, (args[0] as PlayerPokemon).id, formChangeItem, true), + super( + "", + FormChangeItem[formChangeItem].toLowerCase(), + (_type, args) => new PokemonFormChangeItemModifier(this, (args[0] as PlayerPokemon).id, formChangeItem, true), (pokemon: PlayerPokemon) => { // Make sure the Pokemon has alternate forms - if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) + if ( + pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) && // Get all form changes for this species with an item trigger, including any compound triggers - && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger) && (fc.preFormKey === pokemon.getFormKey())) - // Returns true if any form changes match this item - .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) - .flat().flatMap(fc => fc.item).includes(this.formChangeItem) + pokemonFormChanges[pokemon.species.speciesId] + .filter( + fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger) && fc.preFormKey === pokemon.getFormKey(), + ) + // Returns true if any form changes match this item + .flatMap(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) + .flatMap(fc => fc.item) + .includes(this.formChangeItem) ) { return null; } return PartyUiHandler.NoEffectMessage; - }); + }, + ); this.formChangeItem = formChangeItem; } @@ -890,27 +1294,31 @@ export class FormChangeItemModifierType extends PokemonModifierType implements G return i18next.t(`modifierType:FormChangeItem.${FormChangeItem[this.formChangeItem]}`); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.FormChangeItemModifierType.description"); } getPregenArgs(): any[] { - return [ this.formChangeItem ]; + return [this.formChangeItem]; } } export class FusePokemonModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, (_type, args) => new FusePokemonModifier(this, (args[0] as PlayerPokemon).id, (args[1] as PlayerPokemon).id), + super( + localeKey, + iconImage, + (_type, args) => new FusePokemonModifier(this, (args[0] as PlayerPokemon).id, (args[1] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { if (pokemon.isFusion()) { return PartyUiHandler.NoEffectMessage; } return null; - }); + }, + ); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.FusePokemonModifierType.description"); } } @@ -918,20 +1326,27 @@ export class FusePokemonModifierType extends PokemonModifierType { class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Type)) { - return new AttackTypeBoosterModifierType(pregenArgs[0] as Type, 20); + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in PokemonType) { + return new AttackTypeBoosterModifierType(pregenArgs[0] as PokemonType, 20); } - const attackMoveTypes = party.map(p => p.getMoveset().map(m => m?.getMove()).filter(m => m instanceof AttackMove).map(m => m.type)).flat(); + const attackMoveTypes = party.flatMap(p => + p + .getMoveset() + .map(m => m?.getMove()) + .filter(m => m instanceof AttackMove) + .map(m => m.type), + ); if (!attackMoveTypes.length) { return null; } - const attackMoveTypeWeights = new Map(); + const attackMoveTypeWeights = new Map(); let totalWeight = 0; for (const t of attackMoveTypes) { if (attackMoveTypeWeights.has(t)) { - if (attackMoveTypeWeights.get(t)! < 3) { // attackMoveTypeWeights.has(t) was checked before + if (attackMoveTypeWeights.get(t)! < 3) { + // attackMoveTypeWeights.has(t) was checked before attackMoveTypeWeights.set(t, attackMoveTypeWeights.get(t)! + 1); } else { continue; @@ -946,7 +1361,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { return null; } - let type: Type; + let type: PokemonType; const randInt = randSeedInt(totalWeight); let weight = 0; @@ -972,7 +1387,7 @@ class BaseStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { [Stat.DEF]: "iron", [Stat.SPATK]: "calcium", [Stat.SPDEF]: "zinc", - [Stat.SPD]: "carbos" + [Stat.SPD]: "carbos", }; constructor() { @@ -993,12 +1408,12 @@ class TempStatStageBoosterModifierTypeGenerator extends ModifierTypeGenerator { [Stat.SPATK]: "x_sp_atk", [Stat.SPDEF]: "x_sp_def", [Stat.SPD]: "x_speed", - [Stat.ACC]: "x_accuracy" + [Stat.ACC]: "x_accuracy", }; constructor() { super((_party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && TEMP_BATTLE_STATS.includes(pregenArgs[0])) { + if (pregenArgs && pregenArgs.length === 1 && TEMP_BATTLE_STATS.includes(pregenArgs[0])) { return new TempStatStageBoosterModifierType(pregenArgs[0]); } const randStat: TempBattleStat = randSeedInt(Stat.ACC, Stat.ATK); @@ -1016,16 +1431,32 @@ class TempStatStageBoosterModifierTypeGenerator extends ModifierTypeGenerator { class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { /** Object comprised of the currently available species-based stat boosting held items */ public static readonly items = { - LIGHT_BALL: { stats: [ Stat.ATK, Stat.SPATK ], multiplier: 2, species: [ Species.PIKACHU ]}, - THICK_CLUB: { stats: [ Stat.ATK ], multiplier: 2, species: [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]}, - METAL_POWDER: { stats: [ Stat.DEF ], multiplier: 2, species: [ Species.DITTO ]}, - QUICK_POWDER: { stats: [ Stat.SPD ], multiplier: 2, species: [ Species.DITTO ]}, + LIGHT_BALL: { + stats: [Stat.ATK, Stat.SPATK], + multiplier: 2, + species: [Species.PIKACHU], + }, + THICK_CLUB: { + stats: [Stat.ATK], + multiplier: 2, + species: [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK], + }, + METAL_POWDER: { + stats: [Stat.DEF], + multiplier: 2, + species: [Species.DITTO], + }, + QUICK_POWDER: { + stats: [Stat.SPD], + multiplier: 2, + species: [Species.DITTO], + }, }; constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { const items = SpeciesStatBoosterModifierTypeGenerator.items; - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in items)) { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in items) { return new SpeciesStatBoosterModifierType(pregenArgs[0] as SpeciesStatBoosterItem); } @@ -1036,15 +1467,21 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { for (const p of party) { const speciesId = p.getSpeciesForm(true).speciesId; const fusionSpeciesId = p.isFusion() ? p.getFusionSpeciesForm(true).speciesId : null; - const hasFling = p.getMoveset(true).some(m => m?.moveId === Moves.FLING); + // TODO: Use commented boolean when Fling is implemented + const hasFling = false; /* p.getMoveset(true).some(m => m?.moveId === Moves.FLING) */ for (const i in values) { const checkedSpecies = values[i].species; const checkedStats = values[i].stats; // If party member already has the item being weighted currently, skip to the next item - const hasItem = p.getHeldItems().some(m => m instanceof SpeciesStatBoosterModifier - && (m as SpeciesStatBoosterModifier).contains(checkedSpecies[0], checkedStats[0])); + const hasItem = p + .getHeldItems() + .some( + m => + m instanceof SpeciesStatBoosterModifier && + (m as SpeciesStatBoosterModifier).contains(checkedSpecies[0], checkedStats[0]), + ); if (!hasItem) { if (checkedSpecies.includes(speciesId) || (!!fusionSpeciesId && checkedSpecies.includes(fusionSpeciesId))) { @@ -1086,11 +1523,20 @@ class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { class TmModifierTypeGenerator extends ModifierTypeGenerator { constructor(tier: ModifierTier) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Moves)) { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in Moves) { return new TmModifierType(pregenArgs[0] as Moves); } - const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m?.moveId === tm))); - const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i); + const partyMemberCompatibleTms = party.map(p => { + const previousLevelMoves = p.getLearnableLevelMoves(); + return (p as PlayerPokemon).compatibleTms.filter( + tm => !p.moveset.find(m => m?.moveId === tm) && !previousLevelMoves.find(lm => lm === tm), + ); + }); + const tierUniqueCompatibleTms = partyMemberCompatibleTms + .flat() + .filter(tm => tmPoolTiers[tm] === tier) + .filter(tm => !allMoves[tm].name.endsWith(" (N)")) + .filter((tm, i, array) => array.indexOf(tm) === i); if (!tierUniqueCompatibleTms.length) { return null; } @@ -1103,20 +1549,49 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator { class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { constructor(rare: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in EvolutionItem)) { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in EvolutionItem) { return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem); } const evolutionItemPool = [ - party.filter(p => pokemonEvolutions.hasOwnProperty(p.species.speciesId) && (!p.pauseEvolutions || p.species.speciesId === Species.SLOWPOKE || p.species.speciesId === Species.EEVEE)).map(p => { - const evolutions = pokemonEvolutions[p.species.speciesId]; - return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFormKey()) && (!e.condition || e.condition.predicate(p))); - }).flat(), - party.filter(p => p.isFusion() && p.fusionSpecies && pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId) && (!p.pauseEvolutions || p.fusionSpecies.speciesId === Species.SLOWPOKE || p.fusionSpecies.speciesId === Species.EEVEE)).map(p => { - const evolutions = pokemonEvolutions[p.fusionSpecies!.speciesId]; - return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFusionFormKey()) && (!e.condition || e.condition.predicate(p))); - }).flat() - ].flat().flatMap(e => e.item).filter(i => (!!i && i > 50) === rare); + party + .filter( + p => + pokemonEvolutions.hasOwnProperty(p.species.speciesId) && + (!p.pauseEvolutions || p.species.speciesId === Species.SLOWPOKE || p.species.speciesId === Species.EEVEE), + ) + .flatMap(p => { + const evolutions = pokemonEvolutions[p.species.speciesId]; + return evolutions.filter( + e => + e.item !== EvolutionItem.NONE && + (e.evoFormKey === null || (e.preFormKey || "") === p.getFormKey()) && + (!e.condition || e.condition.predicate(p)), + ); + }), + party + .filter( + p => + p.isFusion() && + p.fusionSpecies && + pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId) && + (!p.pauseEvolutions || + p.fusionSpecies.speciesId === Species.SLOWPOKE || + p.fusionSpecies.speciesId === Species.EEVEE), + ) + .flatMap(p => { + const evolutions = pokemonEvolutions[p.fusionSpecies!.speciesId]; + return evolutions.filter( + e => + e.item !== EvolutionItem.NONE && + (e.evoFormKey === null || (e.preFormKey || "") === p.getFusionFormKey()) && + (!e.condition || e.condition.predicate(p)), + ); + }), + ] + .flat() + .flatMap(e => e.item) + .filter(i => (!!i && i > 50) === rare); if (!evolutionItemPool.length) { return null; @@ -1130,46 +1605,77 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { constructor(isRareFormChangeItem: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in FormChangeItem) { return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); } - const formChangeItemPool = [ ...new Set(party.filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)).map(p => { - const formChanges = pokemonFormChanges[p.species.speciesId]; - let formChangeItemTriggers = formChanges.filter(fc => ((fc.formKey.indexOf(SpeciesFormKey.MEGA) === -1 && fc.formKey.indexOf(SpeciesFormKey.PRIMAL) === -1) || party[0].scene.getModifiers(MegaEvolutionAccessModifier).length) - && ((fc.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) === -1 && fc.formKey.indexOf(SpeciesFormKey.ETERNAMAX) === -1) || party[0].scene.getModifiers(GigantamaxAccessModifier).length) - && (!fc.conditions.length || fc.conditions.filter(cond => cond instanceof SpeciesFormChangeCondition && cond.predicate(p)).length) - && (fc.preFormKey === p.getFormKey())) - .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) - .filter(t => t && t.active && !p.scene.findModifier(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === p.id && m.formChangeItem === t.item)); + const formChangeItemPool = [ + ...new Set( + party + .filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)) + .flatMap(p => { + const formChanges = pokemonFormChanges[p.species.speciesId]; + let formChangeItemTriggers = formChanges + .filter( + fc => + ((fc.formKey.indexOf(SpeciesFormKey.MEGA) === -1 && + fc.formKey.indexOf(SpeciesFormKey.PRIMAL) === -1) || + globalScene.getModifiers(MegaEvolutionAccessModifier).length) && + ((fc.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) === -1 && + fc.formKey.indexOf(SpeciesFormKey.ETERNAMAX) === -1) || + globalScene.getModifiers(GigantamaxAccessModifier).length) && + (!fc.conditions.length || + fc.conditions.filter(cond => cond instanceof SpeciesFormChangeCondition && cond.predicate(p)) + .length) && + fc.preFormKey === p.getFormKey(), + ) + .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) + .filter( + t => + t?.active && + !globalScene.findModifier( + m => + m instanceof PokemonFormChangeItemModifier && + m.pokemonId === p.id && + m.formChangeItem === t.item, + ), + ); - if (p.species.speciesId === Species.NECROZMA) { - // technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break... - - let foundULTRA_Z = false, - foundN_LUNA = false, - foundN_SOLAR = false; - formChangeItemTriggers.forEach((fc, i) => { - switch (fc.item) { - case FormChangeItem.ULTRANECROZIUM_Z: - foundULTRA_Z = true; - break; - case FormChangeItem.N_LUNARIZER: - foundN_LUNA = true; - break; - case FormChangeItem.N_SOLARIZER: - foundN_SOLAR = true; - break; - } - }); - if (foundULTRA_Z && foundN_LUNA && foundN_SOLAR) { - // all three items are present -> user hasn't acquired any of the N_*ARIZERs -> block ULTRANECROZIUM_Z acquisition. - formChangeItemTriggers = formChangeItemTriggers.filter(fc => fc.item !== FormChangeItem.ULTRANECROZIUM_Z); - } - } - return formChangeItemTriggers; - }).flat()) - ].flat().flatMap(fc => fc.item).filter(i => (i && i < 100) === isRareFormChangeItem); + if (p.species.speciesId === Species.NECROZMA) { + // technically we could use a simplified version and check for formChanges.length > 3, but in case any code changes later, this might break... + let foundULTRA_Z = false, + foundN_LUNA = false, + foundN_SOLAR = false; + formChangeItemTriggers.forEach((fc, _i) => { + console.log("Checking ", fc.item); + switch (fc.item) { + case FormChangeItem.ULTRANECROZIUM_Z: + foundULTRA_Z = true; + break; + case FormChangeItem.N_LUNARIZER: + foundN_LUNA = true; + break; + case FormChangeItem.N_SOLARIZER: + foundN_SOLAR = true; + break; + } + }); + if (foundULTRA_Z && foundN_LUNA && foundN_SOLAR) { + // all three items are present -> user hasn't acquired any of the N_*ARIZERs -> block ULTRANECROZIUM_Z acquisition. + formChangeItemTriggers = formChangeItemTriggers.filter( + fc => fc.item !== FormChangeItem.ULTRANECROZIUM_Z, + ); + } else { + console.log("DID NOT FIND "); + } + } + return formChangeItemTriggers; + }), + ), + ] + .flat() + .flatMap(fc => fc.item) + .filter(i => (i && i < 100) === isRareFormChangeItem); // convert it into a set to remove duplicate values, which can appear when the same species with a potential form change is in the party. if (!formChangeItemPool.length) { @@ -1181,64 +1687,61 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { } } -export class TerastallizeModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { - private teraType: Type; - - constructor(teraType: Type) { - super("", `${Type[teraType].toLowerCase()}_tera_shard`, (type, args) => new TerastallizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), "tera_shard"); - - this.teraType = teraType; - } - - get name(): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); - } - - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); - } - - getPregenArgs(): any[] { - return [ this.teraType ]; - } -} - export class ContactHeldItemTransferChanceModifierType extends PokemonHeldItemModifierType { - private chancePercent: integer; + private chancePercent: number; - constructor(localeKey: string, iconImage: string, chancePercent: integer, group?: string, soundName?: string) { - super(localeKey, iconImage, (type, args) => new ContactHeldItemTransferChanceModifier(type, (args[0] as Pokemon).id, chancePercent), group, soundName); + constructor(localeKey: string, iconImage: string, chancePercent: number, group?: string, soundName?: string) { + super( + localeKey, + iconImage, + (type, args) => new ContactHeldItemTransferChanceModifier(type, (args[0] as Pokemon).id, chancePercent), + group, + soundName, + ); this.chancePercent = chancePercent; } - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.ContactHeldItemTransferChanceModifierType.description", { chancePercent: this.chancePercent }); + getDescription(): string { + return i18next.t("modifierType:ModifierType.ContactHeldItemTransferChanceModifierType.description", { + chancePercent: this.chancePercent, + }); } } export class TurnHeldItemTransferModifierType extends PokemonHeldItemModifierType { constructor(localeKey: string, iconImage: string, group?: string, soundName?: string) { - super(localeKey, iconImage, (type, args) => new TurnHeldItemTransferModifier(type, (args[0] as Pokemon).id), group, soundName); + super( + localeKey, + iconImage, + (type, args) => new TurnHeldItemTransferModifier(type, (args[0] as Pokemon).id), + group, + soundName, + ); } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.TurnHeldItemTransferModifierType.description"); } } export class EnemyAttackStatusEffectChanceModifierType extends ModifierType { - private chancePercent: integer; + private chancePercent: number; private effect: StatusEffect; - constructor(localeKey: string, iconImage: string, chancePercent: integer, effect: StatusEffect, stackCount?: integer) { - super(localeKey, iconImage, (type, args) => new EnemyAttackStatusEffectChanceModifier(type, effect, chancePercent, stackCount), "enemy_status_chance"); + constructor(localeKey: string, iconImage: string, chancePercent: number, effect: StatusEffect, stackCount?: number) { + super( + localeKey, + iconImage, + (type, _args) => new EnemyAttackStatusEffectChanceModifier(type, effect, chancePercent, stackCount), + "enemy_status_chance", + ); this.chancePercent = chancePercent; this.effect = effect; } - getDescription(scene: BattleScene): string { + getDescription(): string { return i18next.t("modifierType:ModifierType.EnemyAttackStatusEffectChanceModifierType.description", { chancePercent: this.chancePercent, statusEffect: getStatusEffectDescriptor(this.effect), @@ -1255,13 +1758,15 @@ export class EnemyEndureChanceModifierType extends ModifierType { this.chancePercent = chancePercent; } - getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.EnemyEndureChanceModifierType.description", { chancePercent: this.chancePercent }); + getDescription(): string { + return i18next.t("modifierType:ModifierType.EnemyEndureChanceModifierType.description", { + chancePercent: this.chancePercent, + }); } } export type ModifierTypeFunc = () => ModifierType; -type WeightedModifierTypeWeightFunc = (party: Pokemon[], rerollCount?: integer) => integer; +type WeightedModifierTypeWeightFunc = (party: Pokemon[], rerollCount?: number) => number; /** * High order function that returns a WeightedModifierTypeWeightFunc that will only be applied on @@ -1270,10 +1775,10 @@ type WeightedModifierTypeWeightFunc = (party: Pokemon[], rerollCount?: integer) * @param defaultWeight - ModifierType default weight * @returns A WeightedModifierTypeWeightFunc */ -function skipInClassicAfterWave(wave: integer, defaultWeight: integer): WeightedModifierTypeWeightFunc { - return (party: Pokemon[]) => { - const gameMode = party[0].scene.gameMode; - const currentWave = party[0].scene.currentBattle.waveIndex; +function skipInClassicAfterWave(wave: number, defaultWeight: number): WeightedModifierTypeWeightFunc { + return () => { + const gameMode = globalScene.gameMode; + const currentWave = globalScene.currentBattle.waveIndex; return gameMode.isClassic && currentWave >= wave ? 0 : defaultWeight; }; } @@ -1284,7 +1789,7 @@ function skipInClassicAfterWave(wave: integer, defaultWeight: integer): Weighted * @param defaultWeight ModifierType default weight * @returns A WeightedModifierTypeWeightFunc */ -function skipInLastClassicWaveOrDefault(defaultWeight: integer) : WeightedModifierTypeWeightFunc { +function skipInLastClassicWaveOrDefault(defaultWeight: number): WeightedModifierTypeWeightFunc { return skipInClassicAfterWave(199, defaultWeight); } @@ -1296,18 +1801,25 @@ function skipInLastClassicWaveOrDefault(defaultWeight: integer) : WeightedModifi * @returns A WeightedModifierTypeWeightFunc */ function lureWeightFunc(maxBattles: number, weight: number): WeightedModifierTypeWeightFunc { - return (party: Pokemon[]) => { - const lures = party[0].scene.getModifiers(DoubleBattleChanceBoosterModifier); - return !(party[0].scene.gameMode.isClassic && party[0].scene.currentBattle.waveIndex === 199) && (lures.length === 0 || lures.filter(m => m.getMaxBattles() === maxBattles && m.getBattleCount() >= maxBattles * 0.6).length === 0) ? weight : 0; + return () => { + const lures = globalScene.getModifiers(DoubleBattleChanceBoosterModifier); + return !(globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex === 199) && + (lures.length === 0 || + lures.filter(m => m.getMaxBattles() === maxBattles && m.getBattleCount() >= maxBattles * 0.6).length === 0) + ? weight + : 0; }; } - class WeightedModifierType { public modifierType: ModifierType; - public weight: integer | WeightedModifierTypeWeightFunc; - public maxWeight: integer; + public weight: number | WeightedModifierTypeWeightFunc; + public maxWeight: number | WeightedModifierTypeWeightFunc; - constructor(modifierTypeFunc: ModifierTypeFunc, weight: integer | WeightedModifierTypeWeightFunc, maxWeight?: integer) { + constructor( + modifierTypeFunc: ModifierTypeFunc, + weight: number | WeightedModifierTypeWeightFunc, + maxWeight?: number | WeightedModifierTypeWeightFunc, + ) { this.modifierType = modifierTypeFunc(); this.modifierType.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifierTypeFunc)!; // TODO: is this bang correct? this.weight = weight; @@ -1346,7 +1858,7 @@ export type GeneratorModifierOverride = { } | { name: keyof Pick; - type?: Type; + type?: PokemonType; } | { name: keyof Pick; @@ -1386,20 +1898,42 @@ export const modifierTypes = { FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(false), RARE_FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(true), - EVOLUTION_TRACKER_GIMMIGHOUL: () => new PokemonHeldItemModifierType("modifierType:ModifierType.EVOLUTION_TRACKER_GIMMIGHOUL", "relic_gold", - (type, args) => new EvoTrackerModifier(type, (args[0] as Pokemon).id, Species.GIMMIGHOUL, 10)), + EVOLUTION_TRACKER_GIMMIGHOUL: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.EVOLUTION_TRACKER_GIMMIGHOUL", + "relic_gold", + (type, args) => new EvoTrackerModifier(type, (args[0] as Pokemon).id, Species.GIMMIGHOUL, 10), + ), - MEGA_BRACELET: () => new ModifierType("modifierType:ModifierType.MEGA_BRACELET", "mega_bracelet", (type, _args) => new MegaEvolutionAccessModifier(type)), - DYNAMAX_BAND: () => new ModifierType("modifierType:ModifierType.DYNAMAX_BAND", "dynamax_band", (type, _args) => new GigantamaxAccessModifier(type)), - TERA_ORB: () => new ModifierType("modifierType:ModifierType.TERA_ORB", "tera_orb", (type, _args) => new TerastallizeAccessModifier(type)), + MEGA_BRACELET: () => + new ModifierType( + "modifierType:ModifierType.MEGA_BRACELET", + "mega_bracelet", + (type, _args) => new MegaEvolutionAccessModifier(type), + ), + DYNAMAX_BAND: () => + new ModifierType( + "modifierType:ModifierType.DYNAMAX_BAND", + "dynamax_band", + (type, _args) => new GigantamaxAccessModifier(type), + ), + TERA_ORB: () => + new ModifierType( + "modifierType:ModifierType.TERA_ORB", + "tera_orb", + (type, _args) => new TerastallizeAccessModifier(type), + ), MAP: () => new ModifierType("modifierType:ModifierType.MAP", "map", (type, _args) => new MapModifier(type)), POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.POTION", "potion", 20, 10), - SUPER_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.SUPER_POTION", "super_potion", 50, 25), - HYPER_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.HYPER_POTION", "hyper_potion", 200, 50), + SUPER_POTION: () => + new PokemonHpRestoreModifierType("modifierType:ModifierType.SUPER_POTION", "super_potion", 50, 25), + HYPER_POTION: () => + new PokemonHpRestoreModifierType("modifierType:ModifierType.HYPER_POTION", "hyper_potion", 200, 50), MAX_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.MAX_POTION", "max_potion", 0, 100), - FULL_RESTORE: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.FULL_RESTORE", "full_restore", 0, 100, true), + FULL_RESTORE: () => + new PokemonHpRestoreModifierType("modifierType:ModifierType.FULL_RESTORE", "full_restore", 0, 100, true), REVIVE: () => new PokemonReviveModifierType("modifierType:ModifierType.REVIVE", "revive", 50), MAX_REVIVE: () => new PokemonReviveModifierType("modifierType:ModifierType.MAX_REVIVE", "max_revive", 100), @@ -1408,8 +1942,18 @@ export const modifierTypes = { SACRED_ASH: () => new AllPokemonFullReviveModifierType("modifierType:ModifierType.SACRED_ASH", "sacred_ash"), - REVIVER_SEED: () => new PokemonHeldItemModifierType("modifierType:ModifierType.REVIVER_SEED", "reviver_seed", (type, args) => new PokemonInstantReviveModifier(type, (args[0] as Pokemon).id)), - WHITE_HERB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.WHITE_HERB", "white_herb", (type, args) => new ResetNegativeStatStageModifier(type, (args[0] as Pokemon).id)), + REVIVER_SEED: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.REVIVER_SEED", + "reviver_seed", + (type, args) => new PokemonInstantReviveModifier(type, (args[0] as Pokemon).id), + ), + WHITE_HERB: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.WHITE_HERB", + "white_herb", + (type, args) => new ResetNegativeStatStageModifier(type, (args[0] as Pokemon).id), + ), ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.ETHER", "ether", 10), MAX_ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.MAX_ETHER", "max_ether", -1), @@ -1432,61 +1976,72 @@ export const modifierTypes = { TEMP_STAT_STAGE_BOOSTER: () => new TempStatStageBoosterModifierTypeGenerator(), - DIRE_HIT: () => new class extends ModifierType { - getDescription(_scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { - stat: i18next.t("modifierType:ModifierType.DIRE_HIT.extra.raises"), - amount: i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.extra.stage") - }); - } - }("modifierType:ModifierType.DIRE_HIT", "dire_hit", (type, _args) => new TempCritBoosterModifier(type, 5)), + DIRE_HIT: () => + new (class extends ModifierType { + getDescription(): string { + return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { + stat: i18next.t("modifierType:ModifierType.DIRE_HIT.extra.raises"), + amount: i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.extra.stage"), + }); + } + })("modifierType:ModifierType.DIRE_HIT", "dire_hit", (type, _args) => new TempCritBoosterModifier(type, 5)), BASE_STAT_BOOSTER: () => new BaseStatBoosterModifierTypeGenerator(), ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(), - MINT: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Nature)) { - return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature); - } - return new PokemonNatureChangeModifierType(randSeedInt(getEnumValues(Nature).length) as Nature); - }), + MINT: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in Nature) { + return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature); + } + return new PokemonNatureChangeModifierType(randSeedInt(getEnumValues(Nature).length) as Nature); + }), - TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Type)) { - return new TerastallizeModifierType(pregenArgs[0] as Type); - } - if (!party[0].scene.getModifiers(TerastallizeAccessModifier).length) { - return null; - } - let type: Type; - if (!randSeedInt(3)) { - const partyMemberTypes = party.map(p => p.getTypes(false, false, true)).flat(); - type = randSeedItem(partyMemberTypes); - } else { - type = randSeedInt(64) ? randSeedInt(18) as Type : Type.STELLAR; - } - return new TerastallizeModifierType(type); - }), + TERA_SHARD: () => + new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in PokemonType) { + return new TerastallizeModifierType(pregenArgs[0] as PokemonType); + } + if (!globalScene.getModifiers(TerastallizeAccessModifier).length) { + return null; + } + const teraTypes: PokemonType[] = []; + for (const p of party) { + if (!(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA))) { + teraTypes.push(p.teraType); + } + } + let excludedType = PokemonType.UNKNOWN; + if (teraTypes.length > 0 && teraTypes.filter(t => t === teraTypes[0]).length === teraTypes.length) { + excludedType = teraTypes[0]; + } + let shardType = randSeedInt(64) ? (randSeedInt(18) as PokemonType) : PokemonType.STELLAR; + while (shardType === excludedType) { + shardType = randSeedInt(64) ? (randSeedInt(18) as PokemonType) : PokemonType.STELLAR; + } + return new TerastallizeModifierType(shardType); + }), - BERRY: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in BerryType)) { - return new BerryModifierType(pregenArgs[0] as BerryType); - } - const berryTypes = getEnumValues(BerryType); - let randBerryType: BerryType; - const rand = randSeedInt(12); - if (rand < 2) { - randBerryType = BerryType.SITRUS; - } else if (rand < 4) { - randBerryType = BerryType.LUM; - } else if (rand < 6) { - randBerryType = BerryType.LEPPA; - } else { - randBerryType = berryTypes[randSeedInt(berryTypes.length - 3) + 2]; - } - return new BerryModifierType(randBerryType); - }), + BERRY: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs && pregenArgs.length === 1 && pregenArgs[0] in BerryType) { + return new BerryModifierType(pregenArgs[0] as BerryType); + } + const berryTypes = getEnumValues(BerryType); + let randBerryType: BerryType; + const rand = randSeedInt(12); + if (rand < 2) { + randBerryType = BerryType.SITRUS; + } else if (rand < 4) { + randBerryType = BerryType.LUM; + } else if (rand < 6) { + randBerryType = BerryType.LEPPA; + } else { + randBerryType = berryTypes[randSeedInt(berryTypes.length - 3) + 2]; + } + return new BerryModifierType(randBerryType); + }), TM_COMMON: () => new TmModifierTypeGenerator(ModifierTier.COMMON), TM_GREAT: () => new TmModifierTypeGenerator(ModifierTier.GREAT), @@ -1494,270 +2049,767 @@ export const modifierTypes = { MEMORY_MUSHROOM: () => new RememberMoveModifierType("modifierType:ModifierType.MEMORY_MUSHROOM", "big_mushroom"), - EXP_SHARE: () => new ModifierType("modifierType:ModifierType.EXP_SHARE", "exp_share", (type, _args) => new ExpShareModifier(type)), - EXP_BALANCE: () => new ModifierType("modifierType:ModifierType.EXP_BALANCE", "exp_balance", (type, _args) => new ExpBalanceModifier(type)), + EXP_SHARE: () => + new ModifierType("modifierType:ModifierType.EXP_SHARE", "exp_share", (type, _args) => new ExpShareModifier(type)), + EXP_BALANCE: () => + new ModifierType( + "modifierType:ModifierType.EXP_BALANCE", + "exp_balance", + (type, _args) => new ExpBalanceModifier(type), + ), - OVAL_CHARM: () => new ModifierType("modifierType:ModifierType.OVAL_CHARM", "oval_charm", (type, _args) => new MultipleParticipantExpBonusModifier(type)), + OVAL_CHARM: () => + new ModifierType( + "modifierType:ModifierType.OVAL_CHARM", + "oval_charm", + (type, _args) => new MultipleParticipantExpBonusModifier(type), + ), EXP_CHARM: () => new ExpBoosterModifierType("modifierType:ModifierType.EXP_CHARM", "exp_charm", 25), SUPER_EXP_CHARM: () => new ExpBoosterModifierType("modifierType:ModifierType.SUPER_EXP_CHARM", "super_exp_charm", 60), - GOLDEN_EXP_CHARM: () => new ExpBoosterModifierType("modifierType:ModifierType.GOLDEN_EXP_CHARM", "golden_exp_charm", 100), + GOLDEN_EXP_CHARM: () => + new ExpBoosterModifierType("modifierType:ModifierType.GOLDEN_EXP_CHARM", "golden_exp_charm", 100), LUCKY_EGG: () => new PokemonExpBoosterModifierType("modifierType:ModifierType.LUCKY_EGG", "lucky_egg", 40), GOLDEN_EGG: () => new PokemonExpBoosterModifierType("modifierType:ModifierType.GOLDEN_EGG", "golden_egg", 100), SOOTHE_BELL: () => new PokemonFriendshipBoosterModifierType("modifierType:ModifierType.SOOTHE_BELL", "soothe_bell"), - SCOPE_LENS: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SCOPE_LENS", "scope_lens", (type, args) => new CritBoosterModifier(type, (args[0] as Pokemon).id, 1)), - LEEK: () => new PokemonHeldItemModifierType("modifierType:ModifierType.LEEK", "leek", (type, args) => new SpeciesCritBoosterModifier(type, (args[0] as Pokemon).id, 2, [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ])), + SCOPE_LENS: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.SCOPE_LENS", + "scope_lens", + (type, args) => new CritBoosterModifier(type, (args[0] as Pokemon).id, 1), + ), + LEEK: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.LEEK", + "leek", + (type, args) => + new SpeciesCritBoosterModifier(type, (args[0] as Pokemon).id, 2, [ + Species.FARFETCHD, + Species.GALAR_FARFETCHD, + Species.SIRFETCHD, + ]), + ), - EVIOLITE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.EVIOLITE", "eviolite", (type, args) => new EvolutionStatBoosterModifier(type, (args[0] as Pokemon).id, [ Stat.DEF, Stat.SPDEF ], 1.5)), + EVIOLITE: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.EVIOLITE", + "eviolite", + (type, args) => new EvolutionStatBoosterModifier(type, (args[0] as Pokemon).id, [Stat.DEF, Stat.SPDEF], 1.5), + ), - SOUL_DEW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SOUL_DEW", "soul_dew", (type, args) => new PokemonNatureWeightModifier(type, (args[0] as Pokemon).id)), + SOUL_DEW: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.SOUL_DEW", + "soul_dew", + (type, args) => new PokemonNatureWeightModifier(type, (args[0] as Pokemon).id), + ), - NUGGET: () => new MoneyRewardModifierType("modifierType:ModifierType.NUGGET", "nugget", 1, "modifierType:ModifierType.MoneyRewardModifierType.extra.small"), - BIG_NUGGET: () => new MoneyRewardModifierType("modifierType:ModifierType.BIG_NUGGET", "big_nugget", 2.5, "modifierType:ModifierType.MoneyRewardModifierType.extra.moderate"), - RELIC_GOLD: () => new MoneyRewardModifierType("modifierType:ModifierType.RELIC_GOLD", "relic_gold", 10, "modifierType:ModifierType.MoneyRewardModifierType.extra.large"), + NUGGET: () => + new MoneyRewardModifierType( + "modifierType:ModifierType.NUGGET", + "nugget", + 1, + "modifierType:ModifierType.MoneyRewardModifierType.extra.small", + ), + BIG_NUGGET: () => + new MoneyRewardModifierType( + "modifierType:ModifierType.BIG_NUGGET", + "big_nugget", + 2.5, + "modifierType:ModifierType.MoneyRewardModifierType.extra.moderate", + ), + RELIC_GOLD: () => + new MoneyRewardModifierType( + "modifierType:ModifierType.RELIC_GOLD", + "relic_gold", + 10, + "modifierType:ModifierType.MoneyRewardModifierType.extra.large", + ), - AMULET_COIN: () => new ModifierType("modifierType:ModifierType.AMULET_COIN", "amulet_coin", (type, _args) => new MoneyMultiplierModifier(type)), - GOLDEN_PUNCH: () => new PokemonHeldItemModifierType("modifierType:ModifierType.GOLDEN_PUNCH", "golden_punch", (type, args) => new DamageMoneyRewardModifier(type, (args[0] as Pokemon).id)), - COIN_CASE: () => new ModifierType("modifierType:ModifierType.COIN_CASE", "coin_case", (type, _args) => new MoneyInterestModifier(type)), + AMULET_COIN: () => + new ModifierType( + "modifierType:ModifierType.AMULET_COIN", + "amulet_coin", + (type, _args) => new MoneyMultiplierModifier(type), + ), + GOLDEN_PUNCH: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.GOLDEN_PUNCH", + "golden_punch", + (type, args) => new DamageMoneyRewardModifier(type, (args[0] as Pokemon).id), + ), + COIN_CASE: () => + new ModifierType( + "modifierType:ModifierType.COIN_CASE", + "coin_case", + (type, _args) => new MoneyInterestModifier(type), + ), - LOCK_CAPSULE: () => new ModifierType("modifierType:ModifierType.LOCK_CAPSULE", "lock_capsule", (type, _args) => new LockModifierTiersModifier(type)), + LOCK_CAPSULE: () => + new ModifierType( + "modifierType:ModifierType.LOCK_CAPSULE", + "lock_capsule", + (type, _args) => new LockModifierTiersModifier(type), + ), - GRIP_CLAW: () => new ContactHeldItemTransferChanceModifierType("modifierType:ModifierType.GRIP_CLAW", "grip_claw", 10), + GRIP_CLAW: () => + new ContactHeldItemTransferChanceModifierType("modifierType:ModifierType.GRIP_CLAW", "grip_claw", 10), WIDE_LENS: () => new PokemonMoveAccuracyBoosterModifierType("modifierType:ModifierType.WIDE_LENS", "wide_lens", 5), MULTI_LENS: () => new PokemonMultiHitModifierType("modifierType:ModifierType.MULTI_LENS", "zoom_lens"), - HEALING_CHARM: () => new ModifierType("modifierType:ModifierType.HEALING_CHARM", "healing_charm", (type, _args) => new HealingBoosterModifier(type, 1.1)), - CANDY_JAR: () => new ModifierType("modifierType:ModifierType.CANDY_JAR", "candy_jar", (type, _args) => new LevelIncrementBoosterModifier(type)), + HEALING_CHARM: () => + new ModifierType( + "modifierType:ModifierType.HEALING_CHARM", + "healing_charm", + (type, _args) => new HealingBoosterModifier(type, 1.1), + ), + CANDY_JAR: () => + new ModifierType( + "modifierType:ModifierType.CANDY_JAR", + "candy_jar", + (type, _args) => new LevelIncrementBoosterModifier(type), + ), - BERRY_POUCH: () => new ModifierType("modifierType:ModifierType.BERRY_POUCH", "berry_pouch", (type, _args) => new PreserveBerryModifier(type)), + BERRY_POUCH: () => + new ModifierType( + "modifierType:ModifierType.BERRY_POUCH", + "berry_pouch", + (type, _args) => new PreserveBerryModifier(type), + ), - FOCUS_BAND: () => new PokemonHeldItemModifierType("modifierType:ModifierType.FOCUS_BAND", "focus_band", (type, args) => new SurviveDamageModifier(type, (args[0] as Pokemon).id)), + FOCUS_BAND: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.FOCUS_BAND", + "focus_band", + (type, args) => new SurviveDamageModifier(type, (args[0] as Pokemon).id), + ), - QUICK_CLAW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.QUICK_CLAW", "quick_claw", (type, args) => new BypassSpeedChanceModifier(type, (args[0] as Pokemon).id)), + QUICK_CLAW: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.QUICK_CLAW", + "quick_claw", + (type, args) => new BypassSpeedChanceModifier(type, (args[0] as Pokemon).id), + ), - KINGS_ROCK: () => new PokemonHeldItemModifierType("modifierType:ModifierType.KINGS_ROCK", "kings_rock", (type, args) => new FlinchChanceModifier(type, (args[0] as Pokemon).id)), + KINGS_ROCK: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.KINGS_ROCK", + "kings_rock", + (type, args) => new FlinchChanceModifier(type, (args[0] as Pokemon).id), + ), - LEFTOVERS: () => new PokemonHeldItemModifierType("modifierType:ModifierType.LEFTOVERS", "leftovers", (type, args) => new TurnHealModifier(type, (args[0] as Pokemon).id)), - SHELL_BELL: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SHELL_BELL", "shell_bell", (type, args) => new HitHealModifier(type, (args[0] as Pokemon).id)), + LEFTOVERS: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.LEFTOVERS", + "leftovers", + (type, args) => new TurnHealModifier(type, (args[0] as Pokemon).id), + ), + SHELL_BELL: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.SHELL_BELL", + "shell_bell", + (type, args) => new HitHealModifier(type, (args[0] as Pokemon).id), + ), - TOXIC_ORB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.TOXIC_ORB", "toxic_orb", (type, args) => new TurnStatusEffectModifier(type, (args[0] as Pokemon).id)), - FLAME_ORB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.FLAME_ORB", "flame_orb", (type, args) => new TurnStatusEffectModifier(type, (args[0] as Pokemon).id)), + TOXIC_ORB: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.TOXIC_ORB", + "toxic_orb", + (type, args) => new TurnStatusEffectModifier(type, (args[0] as Pokemon).id), + ), + FLAME_ORB: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.FLAME_ORB", + "flame_orb", + (type, args) => new TurnStatusEffectModifier(type, (args[0] as Pokemon).id), + ), - BATON: () => new PokemonHeldItemModifierType("modifierType:ModifierType.BATON", "baton", (type, args) => new SwitchEffectTransferModifier(type, (args[0] as Pokemon).id)), + BATON: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.BATON", + "baton", + (type, args) => new SwitchEffectTransferModifier(type, (args[0] as Pokemon).id), + ), - SHINY_CHARM: () => new ModifierType("modifierType:ModifierType.SHINY_CHARM", "shiny_charm", (type, _args) => new ShinyRateBoosterModifier(type)), - ABILITY_CHARM: () => new ModifierType("modifierType:ModifierType.ABILITY_CHARM", "ability_charm", (type, _args) => new HiddenAbilityRateBoosterModifier(type)), + SHINY_CHARM: () => + new ModifierType( + "modifierType:ModifierType.SHINY_CHARM", + "shiny_charm", + (type, _args) => new ShinyRateBoosterModifier(type), + ), + ABILITY_CHARM: () => + new ModifierType( + "modifierType:ModifierType.ABILITY_CHARM", + "ability_charm", + (type, _args) => new HiddenAbilityRateBoosterModifier(type), + ), + CATCHING_CHARM: () => + new ModifierType( + "modifierType:ModifierType.CATCHING_CHARM", + "catching_charm", + (type, _args) => new CriticalCatchChanceBoosterModifier(type), + ), - IV_SCANNER: () => new ModifierType("modifierType:ModifierType.IV_SCANNER", "scanner", (type, _args) => new IvScannerModifier(type)), + IV_SCANNER: () => + new ModifierType("modifierType:ModifierType.IV_SCANNER", "scanner", (type, _args) => new IvScannerModifier(type)), DNA_SPLICERS: () => new FusePokemonModifierType("modifierType:ModifierType.DNA_SPLICERS", "dna_splicers"), - MINI_BLACK_HOLE: () => new TurnHeldItemTransferModifierType("modifierType:ModifierType.MINI_BLACK_HOLE", "mini_black_hole"), + MINI_BLACK_HOLE: () => + new TurnHeldItemTransferModifierType("modifierType:ModifierType.MINI_BLACK_HOLE", "mini_black_hole"), VOUCHER: () => new AddVoucherModifierType(VoucherType.REGULAR, 1), VOUCHER_PLUS: () => new AddVoucherModifierType(VoucherType.PLUS, 1), VOUCHER_PREMIUM: () => new AddVoucherModifierType(VoucherType.PREMIUM, 1), - GOLDEN_POKEBALL: () => new ModifierType("modifierType:ModifierType.GOLDEN_POKEBALL", "pb_gold", (type, _args) => new ExtraModifierModifier(type), undefined, "se/pb_bounce_1"), - SILVER_POKEBALL: () => new ModifierType("modifierType:ModifierType.SILVER_POKEBALL", "pb_silver", (type, _args) => new TempExtraModifierModifier(type, 100), undefined, "se/pb_bounce_1"), + GOLDEN_POKEBALL: () => + new ModifierType( + "modifierType:ModifierType.GOLDEN_POKEBALL", + "pb_gold", + (type, _args) => new ExtraModifierModifier(type), + undefined, + "se/pb_bounce_1", + ), + SILVER_POKEBALL: () => + new ModifierType( + "modifierType:ModifierType.SILVER_POKEBALL", + "pb_silver", + (type, _args) => new TempExtraModifierModifier(type, 100), + undefined, + "se/pb_bounce_1", + ), - ENEMY_DAMAGE_BOOSTER: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER", "wl_item_drop", (type, _args) => new EnemyDamageBoosterModifier(type, 5)), - ENEMY_DAMAGE_REDUCTION: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION", "wl_guard_spec", (type, _args) => new EnemyDamageReducerModifier(type, 2.5)), + ENEMY_DAMAGE_BOOSTER: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER", + "wl_item_drop", + (type, _args) => new EnemyDamageBoosterModifier(type, 5), + ), + ENEMY_DAMAGE_REDUCTION: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION", + "wl_guard_spec", + (type, _args) => new EnemyDamageReducerModifier(type, 2.5), + ), //ENEMY_SUPER_EFFECT_BOOSTER: () => new ModifierType('Type Advantage Token', 'Increases damage of super effective attacks by 30%', (type, _args) => new EnemySuperEffectiveDamageBoosterModifier(type, 30), 'wl_custom_super_effective'), - ENEMY_HEAL: () => new ModifierType("modifierType:ModifierType.ENEMY_HEAL", "wl_potion", (type, _args) => new EnemyTurnHealModifier(type, 2, 10)), - ENEMY_ATTACK_POISON_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_POISON_CHANCE", "wl_antidote", 5, StatusEffect.POISON, 10), - ENEMY_ATTACK_PARALYZE_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_PARALYZE_CHANCE", "wl_paralyze_heal", 2.5, StatusEffect.PARALYSIS, 10), - ENEMY_ATTACK_BURN_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_BURN_CHANCE", "wl_burn_heal", 5, StatusEffect.BURN, 10), - ENEMY_STATUS_EFFECT_HEAL_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_STATUS_EFFECT_HEAL_CHANCE", "wl_full_heal", (type, _args) => new EnemyStatusEffectHealChanceModifier(type, 2.5, 10)), - ENEMY_ENDURE_CHANCE: () => new EnemyEndureChanceModifierType("modifierType:ModifierType.ENEMY_ENDURE_CHANCE", "wl_reset_urge", 2), - ENEMY_FUSED_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_FUSED_CHANCE", "wl_custom_spliced", (type, _args) => new EnemyFusionChanceModifier(type, 1)), + ENEMY_HEAL: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_HEAL", + "wl_potion", + (type, _args) => new EnemyTurnHealModifier(type, 2, 10), + ), + ENEMY_ATTACK_POISON_CHANCE: () => + new EnemyAttackStatusEffectChanceModifierType( + "modifierType:ModifierType.ENEMY_ATTACK_POISON_CHANCE", + "wl_antidote", + 5, + StatusEffect.POISON, + 10, + ), + ENEMY_ATTACK_PARALYZE_CHANCE: () => + new EnemyAttackStatusEffectChanceModifierType( + "modifierType:ModifierType.ENEMY_ATTACK_PARALYZE_CHANCE", + "wl_paralyze_heal", + 2.5, + StatusEffect.PARALYSIS, + 10, + ), + ENEMY_ATTACK_BURN_CHANCE: () => + new EnemyAttackStatusEffectChanceModifierType( + "modifierType:ModifierType.ENEMY_ATTACK_BURN_CHANCE", + "wl_burn_heal", + 5, + StatusEffect.BURN, + 10, + ), + ENEMY_STATUS_EFFECT_HEAL_CHANCE: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_STATUS_EFFECT_HEAL_CHANCE", + "wl_full_heal", + (type, _args) => new EnemyStatusEffectHealChanceModifier(type, 2.5, 10), + ), + ENEMY_ENDURE_CHANCE: () => + new EnemyEndureChanceModifierType("modifierType:ModifierType.ENEMY_ENDURE_CHANCE", "wl_reset_urge", 2), + ENEMY_FUSED_CHANCE: () => + new ModifierType( + "modifierType:ModifierType.ENEMY_FUSED_CHANCE", + "wl_custom_spliced", + (type, _args) => new EnemyFusionChanceModifier(type, 1), + ), - MYSTERY_ENCOUNTER_SHUCKLE_JUICE: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { - return new PokemonBaseStatTotalModifierType(pregenArgs[0] as number); - } - return new PokemonBaseStatTotalModifierType(randSeedInt(20, 1)); - }), - MYSTERY_ENCOUNTER_OLD_GATEAU: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { - return new PokemonBaseStatFlatModifierType(pregenArgs[0] as number, pregenArgs[1] as Stat[]); - } - return new PokemonBaseStatFlatModifierType(randSeedInt(20, 1), [ Stat.HP, Stat.ATK, Stat.DEF ]); - }), - MYSTERY_ENCOUNTER_BLACK_SLUDGE: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) { - return new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", "black_sludge", (type, _args) => new HealShopCostModifier(type, pregenArgs[0] as number)); - } - return new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", "black_sludge", (type, _args) => new HealShopCostModifier(type, 2.5)); - }), - MYSTERY_ENCOUNTER_MACHO_BRACE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_MACHO_BRACE", "macho_brace", (type, args) => new PokemonIncrementingStatModifier(type, (args[0] as Pokemon).id)), - MYSTERY_ENCOUNTER_GOLDEN_BUG_NET: () => new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_GOLDEN_BUG_NET", "golden_net", (type, _args) => new BoostBugSpawnModifier(type)), + MYSTERY_ENCOUNTER_SHUCKLE_JUICE: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new PokemonBaseStatTotalModifierType(pregenArgs[0] as number); + } + return new PokemonBaseStatTotalModifierType(randSeedInt(20, 1)); + }), + MYSTERY_ENCOUNTER_OLD_GATEAU: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new PokemonBaseStatFlatModifierType(pregenArgs[0] as number, pregenArgs[1] as Stat[]); + } + return new PokemonBaseStatFlatModifierType(randSeedInt(20, 1), [Stat.HP, Stat.ATK, Stat.DEF]); + }), + MYSTERY_ENCOUNTER_BLACK_SLUDGE: () => + new ModifierTypeGenerator((_party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new ModifierType( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", + "black_sludge", + (type, _args) => new HealShopCostModifier(type, pregenArgs[0] as number), + ); + } + return new ModifierType( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", + "black_sludge", + (type, _args) => new HealShopCostModifier(type, 2.5), + ); + }), + MYSTERY_ENCOUNTER_MACHO_BRACE: () => + new PokemonHeldItemModifierType( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_MACHO_BRACE", + "macho_brace", + (type, args) => new PokemonIncrementingStatModifier(type, (args[0] as Pokemon).id), + ), + MYSTERY_ENCOUNTER_GOLDEN_BUG_NET: () => + new ModifierType( + "modifierType:ModifierType.MYSTERY_ENCOUNTER_GOLDEN_BUG_NET", + "golden_net", + (type, _args) => new BoostBugSpawnModifier(type), + ), }; interface ModifierPool { - [tier: string]: WeightedModifierType[] + [tier: string]: WeightedModifierType[]; } /** * Used to check if the player has max of a given ball type in Classic - * @param party The player's party, just used to access the scene * @param ballType The {@linkcode PokeballType} being checked * @returns boolean: true if the player has the maximum of a given ball type */ -function hasMaximumBalls(party: Pokemon[], ballType: PokeballType): boolean { - return (party[0].scene.gameMode.isClassic && party[0].scene.pokeballCounts[ballType] >= MAX_PER_TYPE_POKEBALLS); +function hasMaximumBalls(ballType: PokeballType): boolean { + return globalScene.gameMode.isClassic && globalScene.pokeballCounts[ballType] >= MAX_PER_TYPE_POKEBALLS; } const modifierPool: ModifierPool = { [ModifierTier.COMMON]: [ - new WeightedModifierType(modifierTypes.POKEBALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.POKEBALL)) ? 0 : 6, 6), + new WeightedModifierType(modifierTypes.POKEBALL, () => (hasMaximumBalls(PokeballType.POKEBALL) ? 0 : 6), 6), new WeightedModifierType(modifierTypes.RARE_CANDY, 2), - new WeightedModifierType(modifierTypes.POTION, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 10 || p.getHpRatio() <= 0.875) && !p.isFainted()).length, 3); - return thresholdPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.SUPER_POTION, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 25 || p.getHpRatio() <= 0.75) && !p.isFainted()).length, 3); - return thresholdPartyMemberCount; - }, 3), - new WeightedModifierType(modifierTypes.ETHER, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed >= Math.floor(m.getMovePp() / 2)).length).length, 3); - return thresholdPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.MAX_ETHER, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed >= Math.floor(m.getMovePp() / 2)).length).length, 3); - return thresholdPartyMemberCount; - }, 3), + new WeightedModifierType( + modifierTypes.POTION, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter(p => p.getInverseHp() >= 10 && p.getHpRatio() <= 0.875 && !p.isFainted()).length, + 3, + ); + return thresholdPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.SUPER_POTION, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter(p => p.getInverseHp() >= 25 && p.getHpRatio() <= 0.75 && !p.isFainted()).length, + 3, + ); + return thresholdPartyMemberCount; + }, + 3, + ), + new WeightedModifierType( + modifierTypes.ETHER, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && + p + .getMoveset() + .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .length, + ).length, + 3, + ); + return thresholdPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.MAX_ETHER, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && + p + .getMoveset() + .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .length, + ).length, + 3, + ); + return thresholdPartyMemberCount; + }, + 3, + ), new WeightedModifierType(modifierTypes.LURE, lureWeightFunc(10, 2)), new WeightedModifierType(modifierTypes.TEMP_STAT_STAGE_BOOSTER, 4), new WeightedModifierType(modifierTypes.BERRY, 2), new WeightedModifierType(modifierTypes.TM_COMMON, 2), ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); + return m; }), [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.GREAT_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.GREAT_BALL)) ? 0 : 6, 6), + new WeightedModifierType(modifierTypes.GREAT_BALL, () => (hasMaximumBalls(PokeballType.GREAT_BALL) ? 0 : 6), 6), new WeightedModifierType(modifierTypes.PP_UP, 2), - new WeightedModifierType(modifierTypes.FULL_HEAL, (party: Pokemon[]) => { - const statusEffectPartyMemberCount = Math.min(party.filter(p => p.hp && !!p.status && !p.getHeldItems().some(i => { - if (i instanceof TurnStatusEffectModifier) { - return (i as TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; - } - return false; - })).length, 3); - return statusEffectPartyMemberCount * 6; - }, 18), - new WeightedModifierType(modifierTypes.REVIVE, (party: Pokemon[]) => { - const faintedPartyMemberCount = Math.min(party.filter(p => p.isFainted()).length, 3); - return faintedPartyMemberCount * 9; - }, 27), - new WeightedModifierType(modifierTypes.MAX_REVIVE, (party: Pokemon[]) => { - const faintedPartyMemberCount = Math.min(party.filter(p => p.isFainted()).length, 3); - return faintedPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.SACRED_ASH, (party: Pokemon[]) => { - return party.filter(p => p.isFainted()).length >= Math.ceil(party.length / 2) ? 1 : 0; - }, 1), - new WeightedModifierType(modifierTypes.HYPER_POTION, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 100 || p.getHpRatio() <= 0.625) && !p.isFainted()).length, 3); - return thresholdPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.MAX_POTION, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 150 || p.getHpRatio() <= 0.5) && !p.isFainted()).length, 3); - return thresholdPartyMemberCount; - }, 3), - new WeightedModifierType(modifierTypes.FULL_RESTORE, (party: Pokemon[]) => { - const statusEffectPartyMemberCount = Math.min(party.filter(p => p.hp && !!p.status && !p.getHeldItems().some(i => { - if (i instanceof TurnStatusEffectModifier) { - return (i as TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; - } - return false; - })).length, 3); - const thresholdPartyMemberCount = Math.floor((Math.min(party.filter(p => (p.getInverseHp() >= 150 || p.getHpRatio() <= 0.5) && !p.isFainted()).length, 3) + statusEffectPartyMemberCount) / 2); - return thresholdPartyMemberCount; - }, 3), - new WeightedModifierType(modifierTypes.ELIXIR, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed >= Math.floor(m.getMovePp() / 2)).length).length, 3); - return thresholdPartyMemberCount * 3; - }, 9), - new WeightedModifierType(modifierTypes.MAX_ELIXIR, (party: Pokemon[]) => { - const thresholdPartyMemberCount = Math.min(party.filter(p => p.hp && p.getMoveset().filter(m => m?.ppUsed && (m.getMovePp() - m.ppUsed) <= 5 && m.ppUsed >= Math.floor(m.getMovePp() / 2)).length).length, 3); - return thresholdPartyMemberCount; - }, 3), + new WeightedModifierType( + modifierTypes.FULL_HEAL, + (party: Pokemon[]) => { + const statusEffectPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !!p.status && + !p.getHeldItems().some(i => { + if (i instanceof TurnStatusEffectModifier) { + return (i as TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; + } + return false; + }), + ).length, + 3, + ); + return statusEffectPartyMemberCount * 6; + }, + 18, + ), + new WeightedModifierType( + modifierTypes.REVIVE, + (party: Pokemon[]) => { + const faintedPartyMemberCount = Math.min(party.filter(p => p.isFainted()).length, 3); + return faintedPartyMemberCount * 9; + }, + 27, + ), + new WeightedModifierType( + modifierTypes.MAX_REVIVE, + (party: Pokemon[]) => { + const faintedPartyMemberCount = Math.min(party.filter(p => p.isFainted()).length, 3); + return faintedPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.SACRED_ASH, + (party: Pokemon[]) => { + return party.filter(p => p.isFainted()).length >= Math.ceil(party.length / 2) ? 1 : 0; + }, + 1, + ), + new WeightedModifierType( + modifierTypes.HYPER_POTION, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter(p => p.getInverseHp() >= 100 && p.getHpRatio() <= 0.625 && !p.isFainted()).length, + 3, + ); + return thresholdPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.MAX_POTION, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter(p => p.getInverseHp() >= 100 && p.getHpRatio() <= 0.5 && !p.isFainted()).length, + 3, + ); + return thresholdPartyMemberCount; + }, + 3, + ), + new WeightedModifierType( + modifierTypes.FULL_RESTORE, + (party: Pokemon[]) => { + const statusEffectPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !!p.status && + !p.getHeldItems().some(i => { + if (i instanceof TurnStatusEffectModifier) { + return (i as TurnStatusEffectModifier).getStatusEffect() === p.status?.effect; + } + return false; + }), + ).length, + 3, + ); + const thresholdPartyMemberCount = Math.floor( + (Math.min(party.filter(p => p.getInverseHp() >= 100 && p.getHpRatio() <= 0.5 && !p.isFainted()).length, 3) + + statusEffectPartyMemberCount) / + 2, + ); + return thresholdPartyMemberCount; + }, + 3, + ), + new WeightedModifierType( + modifierTypes.ELIXIR, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && + p + .getMoveset() + .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .length, + ).length, + 3, + ); + return thresholdPartyMemberCount * 3; + }, + 9, + ), + new WeightedModifierType( + modifierTypes.MAX_ELIXIR, + (party: Pokemon[]) => { + const thresholdPartyMemberCount = Math.min( + party.filter( + p => + p.hp && + !p.getHeldItems().some(m => m instanceof BerryModifier && m.berryType === BerryType.LEPPA) && + p + .getMoveset() + .filter(m => m?.ppUsed && m.getMovePp() - m.ppUsed <= 5 && m.ppUsed > Math.floor(m.getMovePp() / 2)) + .length, + ).length, + 3, + ); + return thresholdPartyMemberCount; + }, + 3, + ), new WeightedModifierType(modifierTypes.DIRE_HIT, 4), new WeightedModifierType(modifierTypes.SUPER_LURE, lureWeightFunc(15, 4)), new WeightedModifierType(modifierTypes.NUGGET, skipInLastClassicWaveOrDefault(5)), - 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.EVOLUTION_ITEM, + () => { + return Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 15), 8); + }, + 8, + ), + new WeightedModifierType( + modifierTypes.MAP, + () => (globalScene.gameMode.isClassic && globalScene.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)) { - return 0; - } - const highestPartyLevel = party.map(p => p.level).reduce((highestLevel: integer, level: integer) => Math.max(highestLevel, level), 1); - return Math.min(Math.ceil(highestPartyLevel / 20), 4); - }, 4), + new WeightedModifierType( + modifierTypes.MEMORY_MUSHROOM, + (party: Pokemon[]) => { + if (!party.find(p => p.getLearnableLevelMoves().length)) { + return 0; + } + const highestPartyLevel = party + .map(p => p.level) + .reduce((highestLevel: number, level: number) => Math.max(highestLevel, level), 1); + return Math.min(Math.ceil(highestPartyLevel / 20), 4); + }, + 4, + ), new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), - new WeightedModifierType(modifierTypes.TERA_SHARD, 1), - new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0), - new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1), + new WeightedModifierType(modifierTypes.TERA_SHARD, (party: Pokemon[]) => + party.filter( + p => !(p.hasSpecies(Species.TERAPAGOS) || p.hasSpecies(Species.OGERPON) || p.hasSpecies(Species.SHEDINJA)), + ).length > 0 + ? 1 + : 0, + ), + new WeightedModifierType( + modifierTypes.DNA_SPLICERS, + (party: Pokemon[]) => { + if (party.filter(p => !p.fusionSpecies).length > 1) { + if (globalScene.gameMode.isSplicedOnly) { + return 4; + } + if (globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) { + return 2; + } + } + return 0; + }, + 4, + ), + new WeightedModifierType( + modifierTypes.VOUCHER, + (_party: Pokemon[], rerollCount: number) => (!globalScene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0), + 1, + ), ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + m.setTier(ModifierTier.GREAT); + return m; }), [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ULTRA_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.ULTRA_BALL)) ? 0 : 15, 15), + new WeightedModifierType(modifierTypes.ULTRA_BALL, () => (hasMaximumBalls(PokeballType.ULTRA_BALL) ? 0 : 15), 15), new WeightedModifierType(modifierTypes.MAX_LURE, lureWeightFunc(30, 4)), new WeightedModifierType(modifierTypes.BIG_NUGGET, skipInLastClassicWaveOrDefault(12)), new WeightedModifierType(modifierTypes.PP_MAX, 3), new WeightedModifierType(modifierTypes.MINT, 4), - new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32), 32), - new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24), + new WeightedModifierType( + modifierTypes.RARE_EVOLUTION_ITEM, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 15) * 4, 32), + 32, + ), + new WeightedModifierType( + modifierTypes.FORM_CHANGE_ITEM, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 6, + 24, + ), new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)), new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => { - const { gameMode, gameData } = party[0].scene; + const { gameMode, gameData } = globalScene; 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; }), new WeightedModifierType(modifierTypes.SPECIES_STAT_BOOSTER, 12), - new WeightedModifierType(modifierTypes.LEEK, (party: Pokemon[]) => { - const checkedSpecies = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; - // If a party member doesn't already have a Leek and is one of the relevant species, Leek can appear - return party.some(p => !p.getHeldItems().some(i => i instanceof SpeciesCritBoosterModifier) - && (checkedSpecies.includes(p.getSpeciesForm(true).speciesId) - || (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; - }, 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; - }, 10), - new WeightedModifierType(modifierTypes.WHITE_HERB, (party: Pokemon[]) => { - const checkedAbilities = [ Abilities.WEAK_ARMOR, Abilities.CONTRARY, Abilities.MOODY, Abilities.ANGER_SHELL, Abilities.COMPETITIVE, Abilities.DEFIANT ]; - const weightMultiplier = party.filter( - p => !p.getHeldItems().some(i => i instanceof ResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) && - (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && selfStatLowerMoves.includes(m.moveId)))).length; - // If a party member has one of the above moves or abilities and doesn't have max herbs, the herb will appear more frequently - return 0 * (weightMultiplier ? 2 : 1) + (weightMultiplier ? weightMultiplier * 0 : 0); - }, 10), + new WeightedModifierType( + modifierTypes.LEEK, + (party: Pokemon[]) => { + const checkedSpecies = [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD]; + // If a party member doesn't already have a Leek and is one of the relevant species, Leek can appear + return party.some( + p => + !p.getHeldItems().some(i => i instanceof SpeciesCritBoosterModifier) && + (checkedSpecies.includes(p.getSpeciesForm(true).speciesId) || + (p.isFusion() && checkedSpecies.includes(p.getFusionSpeciesForm(true).speciesId))), + ) + ? 12 + : 0; + }, + 12, + ), + new WeightedModifierType( + modifierTypes.TOXIC_ORB, + (party: Pokemon[]) => { + return party.some(p => { + const isHoldingOrb = p.getHeldItems().some(i => i.type.id === "FLAME_ORB" || i.type.id === "TOXIC_ORB"); + + if (!isHoldingOrb) { + const moveset = p + .getMoveset(true) + .filter(m => !isNullOrUndefined(m)) + .map(m => m.moveId); + const canSetStatus = p.canSetStatus(StatusEffect.TOXIC, true, true, null, true); + + // 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 (Trick, Fling, Switcheroo) from comment when they are implemented + const hasItemMoves = [ + /* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */ + ].some(m => moveset.includes(m)); + + if (canSetStatus) { + // Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb + const hasGeneralAbility = [ + Abilities.QUICK_FEET, + Abilities.GUTS, + Abilities.MARVEL_SCALE, + Abilities.MAGIC_GUARD, + ].some(a => p.hasAbility(a, false, true)); + const hasSpecificAbility = [Abilities.TOXIC_BOOST, Abilities.POISON_HEAL].some(a => + p.hasAbility(a, false, true), + ); + const hasOppositeAbility = [Abilities.FLARE_BOOST].some(a => p.hasAbility(a, false, true)); + + return hasSpecificAbility || (hasGeneralAbility && !hasOppositeAbility) || hasStatusMoves; + } + return hasItemMoves; + } + + return false; + }) + ? 10 + : 0; + }, + 10, + ), + new WeightedModifierType( + modifierTypes.FLAME_ORB, + (party: Pokemon[]) => { + return party.some(p => { + const isHoldingOrb = p.getHeldItems().some(i => i.type.id === "FLAME_ORB" || i.type.id === "TOXIC_ORB"); + + if (!isHoldingOrb) { + const moveset = p + .getMoveset(true) + .filter(m => !isNullOrUndefined(m)) + .map(m => m.moveId); + const canSetStatus = p.canSetStatus(StatusEffect.BURN, true, true, null, true); + + // 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 (Trick, Fling, Switcheroo) from comment when they are implemented + const hasItemMoves = [ + /* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */ + ].some(m => moveset.includes(m)); + + if (canSetStatus) { + // Abilities that take advantage of obtaining the actual status effect, separated based on specificity to the orb + const hasGeneralAbility = [ + Abilities.QUICK_FEET, + Abilities.GUTS, + Abilities.MARVEL_SCALE, + Abilities.MAGIC_GUARD, + ].some(a => p.hasAbility(a, false, true)); + const hasSpecificAbility = [Abilities.FLARE_BOOST].some(a => p.hasAbility(a, false, true)); + const hasOppositeAbility = [Abilities.TOXIC_BOOST, Abilities.POISON_HEAL].some(a => + p.hasAbility(a, false, true), + ); + + return hasSpecificAbility || (hasGeneralAbility && !hasOppositeAbility) || hasStatusMoves; + } + return hasItemMoves; + } + + return false; + }) + ? 10 + : 0; + }, + 10, + ), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, skipInLastClassicWaveOrDefault(5)), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), @@ -1767,15 +2819,22 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.IV_SCANNER, skipInLastClassicWaveOrDefault(4)), new WeightedModifierType(modifierTypes.EXP_CHARM, skipInLastClassicWaveOrDefault(8)), new WeightedModifierType(modifierTypes.EXP_SHARE, skipInLastClassicWaveOrDefault(10)), - new WeightedModifierType(modifierTypes.EXP_BALANCE, skipInLastClassicWaveOrDefault(3)), - new WeightedModifierType(modifierTypes.TERA_ORB, (party: Pokemon[]) => Math.min(Math.max(Math.floor(party[0].scene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), + new WeightedModifierType( + modifierTypes.TERA_ORB, + () => + !globalScene.gameMode.isClassic + ? Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4) + : 0, + 4, + ), new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), - new WeightedModifierType(modifierTypes.WIDE_LENS, 4), + new WeightedModifierType(modifierTypes.WIDE_LENS, 7), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); + return m; }), [ModifierTier.ROGUE]: [ - new WeightedModifierType(modifierTypes.ROGUE_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.ROGUE_BALL)) ? 0 : 16, 16), + new WeightedModifierType(modifierTypes.ROGUE_BALL, () => (hasMaximumBalls(PokeballType.ROGUE_BALL) ? 0 : 16), 16), new WeightedModifierType(modifierTypes.RELIC_GOLD, skipInLastClassicWaveOrDefault(2)), new WeightedModifierType(modifierTypes.LEFTOVERS, 3), new WeightedModifierType(modifierTypes.SHELL_BELL, 3), @@ -1784,80 +2843,119 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SCOPE_LENS, 4), new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.SOUL_DEW, 7), - //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), - new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4), + new WeightedModifierType(modifierTypes.CATCHING_CHARM, () => (!globalScene.gameMode.isClassic ? 4 : 0), 4), new WeightedModifierType(modifierTypes.ABILITY_CHARM, skipInClassicAfterWave(189, 6)), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), - new WeightedModifierType(modifierTypes.LOCK_CAPSULE, (party: Pokemon[]) => party[0].scene.gameMode.isClassic ? 0 : 3), + new WeightedModifierType(modifierTypes.LOCK_CAPSULE, () => (globalScene.gameMode.isClassic ? 0 : 3)), new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, skipInLastClassicWaveOrDefault(8)), - new WeightedModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24), - new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), - new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), - new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, 3), + new WeightedModifierType( + modifierTypes.RARE_FORM_CHANGE_ITEM, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 6, + 24, + ), + new WeightedModifierType( + modifierTypes.MEGA_BRACELET, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 9, + 36, + ), + new WeightedModifierType( + modifierTypes.DYNAMAX_BAND, + () => Math.min(Math.ceil(globalScene.currentBattle.waveIndex / 50), 4) * 9, + 36, + ), + new WeightedModifierType( + modifierTypes.VOUCHER_PLUS, + (_party: Pokemon[], rerollCount: number) => + !globalScene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, + 3, + ), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); + return m; }), [ModifierTier.MASTER]: [ - new WeightedModifierType(modifierTypes.MASTER_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.MASTER_BALL)) ? 0 : 24, 24), + new WeightedModifierType(modifierTypes.MASTER_BALL, () => (hasMaximumBalls(PokeballType.MASTER_BALL) ? 0 : 24), 24), new WeightedModifierType(modifierTypes.SHINY_CHARM, 14), new WeightedModifierType(modifierTypes.HEALING_CHARM, 18), new WeightedModifierType(modifierTypes.MULTI_LENS, 18), - new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => - !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), - new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), - new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => (party[0].scene.gameMode.isDaily || (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.isUnlocked(Unlockables.MINI_BLACK_HOLE))) ? 1 : 0, 1), + new WeightedModifierType( + modifierTypes.VOUCHER_PREMIUM, + (_party: Pokemon[], rerollCount: number) => + !globalScene.gameMode.isDaily && !globalScene.gameMode.isEndless && !globalScene.gameMode.isSplicedOnly + ? Math.max(5 - rerollCount * 2, 0) + : 0, + 5, + ), + new WeightedModifierType( + modifierTypes.DNA_SPLICERS, + (party: Pokemon[]) => + !(globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) && + !globalScene.gameMode.isSplicedOnly && + party.filter(p => !p.fusionSpecies).length > 1 + ? 24 + : 0, + 24, + ), + new WeightedModifierType( + modifierTypes.MINI_BLACK_HOLE, + () => + globalScene.gameMode.isDaily || + (!globalScene.gameMode.isFreshStartChallenge() && globalScene.gameData.isUnlocked(Unlockables.MINI_BLACK_HOLE)) + ? 1 + : 0, + 1, + ), ].map(m => { - m.setTier(ModifierTier.MASTER); return m; - }) + m.setTier(ModifierTier.MASTER); + return m; + }), }; const wildModifierPool: ModifierPool = { - [ModifierTier.COMMON]: [ - new WeightedModifierType(modifierTypes.BERRY, 1) - ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + [ModifierTier.COMMON]: [new WeightedModifierType(modifierTypes.BERRY, 1)].map(m => { + m.setTier(ModifierTier.COMMON); + return m; }), - [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1) - ].map(m => { - m.setTier(ModifierTier.GREAT); return m; - }), - [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), - new WeightedModifierType(modifierTypes.WHITE_HERB, 0) - ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; - }), - [ModifierTier.ROGUE]: [ - new WeightedModifierType(modifierTypes.LUCKY_EGG, 4), - ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; - }), - [ModifierTier.MASTER]: [ - new WeightedModifierType(modifierTypes.GOLDEN_EGG, 1) - ].map(m => { - m.setTier(ModifierTier.MASTER); return m; - }) -}; - -const trainerModifierPool: ModifierPool = { - [ModifierTier.COMMON]: [ - new WeightedModifierType(modifierTypes.BERRY, 8), - new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3) - ].map(m => { - m.setTier(ModifierTier.COMMON); return m; - }), - [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), - ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + [ModifierTier.GREAT]: [new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1)].map(m => { + m.setTier(ModifierTier.GREAT); + return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), new WeightedModifierType(modifierTypes.WHITE_HERB, 0), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); + return m; + }), + [ModifierTier.ROGUE]: [new WeightedModifierType(modifierTypes.LUCKY_EGG, 4)].map(m => { + m.setTier(ModifierTier.ROGUE); + return m; + }), + [ModifierTier.MASTER]: [new WeightedModifierType(modifierTypes.GOLDEN_EGG, 1)].map(m => { + m.setTier(ModifierTier.MASTER); + return m; + }), +}; + +const trainerModifierPool: ModifierPool = { + [ModifierTier.COMMON]: [ + new WeightedModifierType(modifierTypes.BERRY, 8), + new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), + ].map(m => { + m.setTier(ModifierTier.COMMON); + return m; + }), + [ModifierTier.GREAT]: [new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3)].map(m => { + m.setTier(ModifierTier.GREAT); + return m; + }), + [ModifierTier.ULTRA]: [ + new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), + new WeightedModifierType(modifierTypes.WHITE_HERB, 0), + ].map(m => { + m.setTier(ModifierTier.ULTRA); + return m; }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.FOCUS_BAND, 2), @@ -1866,7 +2964,8 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.GRIP_CLAW, 1), new WeightedModifierType(modifierTypes.WIDE_LENS, 1), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); + return m; }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.KINGS_ROCK, 1), @@ -1874,8 +2973,9 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SHELL_BELL, 1), new WeightedModifierType(modifierTypes.SCOPE_LENS, 1), ].map(m => { - m.setTier(ModifierTier.MASTER); return m; - }) + m.setTier(ModifierTier.MASTER); + return m; + }), }; const enemyBuffModifierPool: ModifierPool = { @@ -1887,18 +2987,20 @@ const enemyBuffModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.ENEMY_ATTACK_BURN_CHANCE, 3), new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 9), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 4), - new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) + new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1), ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); + return m; }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 5), new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_REDUCTION, 5), new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 5), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 5), - new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) + new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1), ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + m.setTier(ModifierTier.GREAT); + return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 10), @@ -1906,16 +3008,19 @@ const enemyBuffModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.ENEMY_HEAL, 10), new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 10), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 10), - new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 5) + new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 5), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); + return m; }), - [ModifierTier.ROGUE]: [ ].map((m: WeightedModifierType) => { - m.setTier(ModifierTier.ROGUE); return m; + [ModifierTier.ROGUE]: [].map((m: WeightedModifierType) => { + m.setTier(ModifierTier.ROGUE); + return m; + }), + [ModifierTier.MASTER]: [].map((m: WeightedModifierType) => { + m.setTier(ModifierTier.MASTER); + return m; }), - [ModifierTier.MASTER]: [ ].map((m: WeightedModifierType) => { - m.setTier(ModifierTier.MASTER); return m; - }) }; const dailyStarterModifierPool: ModifierPool = { @@ -1923,12 +3028,12 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1), new WeightedModifierType(modifierTypes.BERRY, 3), ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); + return m; }), - [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5), - ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + [ModifierTier.GREAT]: [new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5)].map(m => { + m.setTier(ModifierTier.GREAT); + return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), @@ -1936,7 +3041,8 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SOUL_DEW, 1), new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 1), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); + return m; }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.GRIP_CLAW, 5), @@ -1945,14 +3051,16 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); + return m; }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.LEFTOVERS, 1), new WeightedModifierType(modifierTypes.SHELL_BELL, 1), ].map(m => { - m.setTier(ModifierTier.MASTER); return m; - }) + m.setTier(ModifierTier.MASTER); + return m; + }), }; export function getModifierType(modifierTypeFunc: ModifierTypeFunc): ModifierType { @@ -1967,13 +3075,16 @@ let modifierPoolThresholds = {}; let ignoredPoolIndexes = {}; let dailyStarterModifierPoolThresholds = {}; -let ignoredDailyStarterPoolIndexes = {}; // eslint-disable-line @typescript-eslint/no-unused-vars +// biome-ignore lint/correctness/noUnusedVariables: TODO explain why this is marked as OK +let ignoredDailyStarterPoolIndexes = {}; let enemyModifierPoolThresholds = {}; -let enemyIgnoredPoolIndexes = {}; // eslint-disable-line @typescript-eslint/no-unused-vars +// biome-ignore lint/correctness/noUnusedVariables: TODO explain why this is marked as OK +let enemyIgnoredPoolIndexes = {}; let enemyBuffModifierPoolThresholds = {}; -let enemyBuffIgnoredPoolIndexes = {}; // eslint-disable-line @typescript-eslint/no-unused-vars +// biome-ignore lint/correctness/noUnusedVariables: TODO explain why this is marked as OK +let enemyBuffIgnoredPoolIndexes = {}; export function getModifierPoolForType(poolType: ModifierPoolType): ModifierPool { let pool: ModifierPool; @@ -1997,66 +3108,82 @@ export function getModifierPoolForType(poolType: ModifierPoolType): ModifierPool return pool; } -const tierWeights = [ 768 / 1024, 195 / 1024, 48 / 1024, 12 / 1024, 1 / 1024 ]; +const tierWeights = [768 / 1024, 195 / 1024, 48 / 1024, 12 / 1024, 1 / 1024]; /** * Allows a unit test to check if an item exists in the Modifier Pool. Checks the pool directly, rather than attempting to reroll for the item. */ export const itemPoolChecks: Map = new Map(); -export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: ModifierPoolType, rerollCount: integer = 0) { +export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: ModifierPoolType, rerollCount = 0) { const pool = getModifierPoolForType(poolType); - itemPoolChecks.forEach((v, k) => { + itemPoolChecks.forEach((_v, k) => { itemPoolChecks.set(k, false); }); const ignoredIndexes = {}; const modifierTableData = {}; - const thresholds = Object.fromEntries(new Map(Object.keys(pool).map(t => { - ignoredIndexes[t] = []; - const thresholds = new Map(); - const tierModifierIds: string[] = []; - let tierMaxWeight = 0; - let i = 0; - pool[t].reduce((total: integer, modifierType: WeightedModifierType) => { - const weightedModifierType = modifierType as WeightedModifierType; - const existingModifiers = party[0].scene.findModifiers(m => m.type.id === weightedModifierType.modifierType.id, poolType === ModifierPoolType.PLAYER); - const itemModifierType = weightedModifierType.modifierType instanceof ModifierTypeGenerator - ? weightedModifierType.modifierType.generateType(party) - : weightedModifierType.modifierType; - const weight = !existingModifiers.length - || itemModifierType instanceof PokemonHeldItemModifierType - || itemModifierType instanceof FormChangeItemModifierType - || existingModifiers.find(m => m.stackCount < m.getMaxStackCount(party[0].scene, true)) - ? weightedModifierType.weight instanceof Function - ? (weightedModifierType.weight as Function)(party, rerollCount) - : weightedModifierType.weight as integer - : 0; - if (weightedModifierType.maxWeight) { - const modifierId = weightedModifierType.modifierType.id; - tierModifierIds.push(modifierId); - const outputWeight = useMaxWeightForOutput ? weightedModifierType.maxWeight : weight; - modifierTableData[modifierId] = { weight: outputWeight, tier: parseInt(t), tierPercent: 0, totalPercent: 0 }; - tierMaxWeight += outputWeight; - } - if (weight) { - total += weight; - } else { - ignoredIndexes[t].push(i++); - return total; - } - if (itemPoolChecks.has(modifierType.modifierType.id as ModifierTypeKeys)) { - itemPoolChecks.set(modifierType.modifierType.id as ModifierTypeKeys, true); - } - thresholds.set(total, i++); - return total; - }, 0); - for (const id of tierModifierIds) { - modifierTableData[id].tierPercent = Math.floor((modifierTableData[id].weight / tierMaxWeight) * 10000) / 100; - } - return [ t, Object.fromEntries(thresholds) ]; - }))); + const thresholds = Object.fromEntries( + new Map( + Object.keys(pool).map(t => { + ignoredIndexes[t] = []; + const thresholds = new Map(); + const tierModifierIds: string[] = []; + let tierMaxWeight = 0; + let i = 0; + pool[t].reduce((total: number, modifierType: WeightedModifierType) => { + const weightedModifierType = modifierType as WeightedModifierType; + const existingModifiers = globalScene.findModifiers( + m => m.type.id === weightedModifierType.modifierType.id, + poolType === ModifierPoolType.PLAYER, + ); + const itemModifierType = + weightedModifierType.modifierType instanceof ModifierTypeGenerator + ? weightedModifierType.modifierType.generateType(party) + : weightedModifierType.modifierType; + const weight = + !existingModifiers.length || + itemModifierType instanceof PokemonHeldItemModifierType || + itemModifierType instanceof FormChangeItemModifierType || + existingModifiers.find(m => m.stackCount < m.getMaxStackCount(true)) + ? weightedModifierType.weight instanceof Function + ? // biome-ignore lint/complexity/noBannedTypes: TODO: refactor to not use Function type + (weightedModifierType.weight as Function)(party, rerollCount) + : (weightedModifierType.weight as number) + : 0; + if (weightedModifierType.maxWeight) { + const modifierId = weightedModifierType.modifierType.id; + tierModifierIds.push(modifierId); + const outputWeight = useMaxWeightForOutput ? weightedModifierType.maxWeight : weight; + modifierTableData[modifierId] = { + weight: outputWeight, + tier: Number.parseInt(t), + tierPercent: 0, + totalPercent: 0, + }; + tierMaxWeight += outputWeight; + } + if (weight) { + total += weight; + } else { + ignoredIndexes[t].push(i++); + return total; + } + if (itemPoolChecks.has(modifierType.modifierType.id as ModifierTypeKeys)) { + itemPoolChecks.set(modifierType.modifierType.id as ModifierTypeKeys, true); + } + thresholds.set(total, i++); + return total; + }, 0); + for (const id of tierModifierIds) { + modifierTableData[id].tierPercent = Math.floor((modifierTableData[id].weight / tierMaxWeight) * 10000) / 100; + } + return [t, Object.fromEntries(thresholds)]; + }), + ), + ); for (const id of Object.keys(modifierTableData)) { - modifierTableData[id].totalPercent = Math.floor(modifierTableData[id].tierPercent * tierWeights[modifierTableData[id].tier] * 100) / 100; + modifierTableData[id].totalPercent = + Math.floor(modifierTableData[id].tierPercent * tierWeights[modifierTableData[id].tier] * 100) / 100; modifierTableData[id].tier = ModifierTier[modifierTableData[id].tier]; } if (outputModifierData) { @@ -2113,31 +3240,50 @@ export function getModifierTypeFuncById(id: string): ModifierTypeFunc { * - `rerollMultiplier?: number` If specified, can adjust the amount of money required for a shop reroll. If set to a negative value, the shop will not allow rerolls at all. * - `allowLuckUpgrades?: boolean` Default `true`, if `false` will prevent set item tiers from upgrading via luck */ -export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemon[], modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings): ModifierTypeOption[] { +export function getPlayerModifierTypeOptions( + count: number, + party: PlayerPokemon[], + modifierTiers?: ModifierTier[], + customModifierSettings?: CustomModifierSettings, +): ModifierTypeOption[] { const options: ModifierTypeOption[] = []; const retryCount = Math.min(count * 5, 50); if (!customModifierSettings) { new Array(count).fill(0).map((_, i) => { - options.push(getModifierTypeOptionWithRetry(options, retryCount, party, modifierTiers && modifierTiers.length > i ? modifierTiers[i] : undefined)); + options.push( + getModifierTypeOptionWithRetry( + options, + retryCount, + party, + modifierTiers && modifierTiers.length > i ? modifierTiers[i] : undefined, + ), + ); }); } else { // Guaranteed mod options first - if (customModifierSettings?.guaranteedModifierTypeOptions && customModifierSettings.guaranteedModifierTypeOptions.length > 0) { + if ( + customModifierSettings?.guaranteedModifierTypeOptions && + customModifierSettings.guaranteedModifierTypeOptions.length > 0 + ) { options.push(...customModifierSettings.guaranteedModifierTypeOptions!); } // Guaranteed mod functions second - if (customModifierSettings.guaranteedModifierTypeFuncs && customModifierSettings.guaranteedModifierTypeFuncs.length > 0) { - customModifierSettings.guaranteedModifierTypeFuncs!.forEach((mod, i) => { + if ( + customModifierSettings.guaranteedModifierTypeFuncs && + customModifierSettings.guaranteedModifierTypeFuncs.length > 0 + ) { + customModifierSettings.guaranteedModifierTypeFuncs!.forEach((mod, _i) => { const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === mod) as string; let guaranteedMod: ModifierType = modifierTypes[modifierId]?.(); // Populates item id and tier guaranteedMod = guaranteedMod .withIdFromFunc(modifierTypes[modifierId]) - .withTierFromPool(); + .withTierFromPool(ModifierPoolType.PLAYER, party); - const modType = guaranteedMod instanceof ModifierTypeGenerator ? guaranteedMod.generateType(party) : guaranteedMod; + const modType = + guaranteedMod instanceof ModifierTypeGenerator ? guaranteedMod.generateType(party) : guaranteedMod; if (modType) { const option = new ModifierTypeOption(modType, 0); options.push(option); @@ -2148,9 +3294,9 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo // Guaranteed tiers third if (customModifierSettings.guaranteedModifierTiers && customModifierSettings.guaranteedModifierTiers.length > 0) { const allowLuckUpgrades = customModifierSettings.allowLuckUpgrades ?? true; - customModifierSettings.guaranteedModifierTiers.forEach((tier) => { + for (const tier of customModifierSettings.guaranteedModifierTiers) { options.push(getModifierTypeOptionWithRetry(options, retryCount, party, tier, allowLuckUpgrades)); - }); + } } // Fill remaining @@ -2174,12 +3320,29 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo * @param tier If specified will generate item of tier * @param allowLuckUpgrades `true` to allow items to upgrade tiers (the little animation that plays and is affected by luck) */ -function getModifierTypeOptionWithRetry(existingOptions: ModifierTypeOption[], retryCount: integer, party: PlayerPokemon[], tier?: ModifierTier, allowLuckUpgrades?: boolean): ModifierTypeOption { +function getModifierTypeOptionWithRetry( + existingOptions: ModifierTypeOption[], + retryCount: number, + party: PlayerPokemon[], + tier?: ModifierTier, + allowLuckUpgrades?: boolean, +): ModifierTypeOption { allowLuckUpgrades = allowLuckUpgrades ?? true; let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, tier, undefined, 0, allowLuckUpgrades); let r = 0; - while (existingOptions.length && ++r < retryCount && existingOptions.filter(o => o.type.name === candidate?.type.name || o.type.group === candidate?.type.group).length) { - candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate?.type.tier ?? tier, candidate?.upgradeCount, 0, allowLuckUpgrades); + while ( + existingOptions.length && + ++r < retryCount && + existingOptions.filter(o => o.type.name === candidate?.type.name || o.type.group === candidate?.type.group).length + ) { + candidate = getNewModifierTypeOption( + party, + ModifierPoolType.PLAYER, + candidate?.type.tier ?? tier, + candidate?.upgradeCount, + 0, + allowLuckUpgrades, + ); } return candidate!; } @@ -2199,17 +3362,17 @@ export function overridePlayerModifierTypeOptions(options: ModifierTypeOption[], let modifierType: ModifierType | null = modifierFunc(); if (modifierType instanceof ModifierTypeGenerator) { - const pregenArgs = ("type" in override) && (override.type !== null) ? [ override.type ] : undefined; + const pregenArgs = "type" in override && override.type !== null ? [override.type] : undefined; modifierType = modifierType.generateType(party, pregenArgs); } if (modifierType) { - options[i].type = modifierType.withIdFromFunc(modifierFunc).withTierFromPool(); + options[i].type = modifierType.withIdFromFunc(modifierFunc).withTierFromPool(ModifierPoolType.PLAYER, party); } } } -export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, baseCost: integer): ModifierTypeOption[] { +export function getPlayerShopModifierTypeOptionsForWave(waveIndex: number, baseCost: number): ModifierTypeOption[] { if (!(waveIndex % 10)) { return []; } @@ -2218,7 +3381,7 @@ export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, base [ new ModifierTypeOption(modifierTypes.POTION(), 0, baseCost * 0.2), new ModifierTypeOption(modifierTypes.ETHER(), 0, baseCost * 0.4), - new ModifierTypeOption(modifierTypes.REVIVE(), 0, baseCost * 2) + new ModifierTypeOption(modifierTypes.REVIVE(), 0, baseCost * 2), ], [ new ModifierTypeOption(modifierTypes.SUPER_POTION(), 0, baseCost * 0.45), @@ -2226,28 +3389,27 @@ export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, base ], [ new ModifierTypeOption(modifierTypes.ELIXIR(), 0, baseCost), - new ModifierTypeOption(modifierTypes.MAX_ETHER(), 0, baseCost) + new ModifierTypeOption(modifierTypes.MAX_ETHER(), 0, baseCost), ], [ new ModifierTypeOption(modifierTypes.HYPER_POTION(), 0, baseCost * 0.8), new ModifierTypeOption(modifierTypes.MAX_REVIVE(), 0, baseCost * 2.75), - new ModifierTypeOption(modifierTypes.MEMORY_MUSHROOM(), 0, baseCost * 4) + new ModifierTypeOption(modifierTypes.MEMORY_MUSHROOM(), 0, baseCost * 4), ], [ new ModifierTypeOption(modifierTypes.MAX_POTION(), 0, baseCost * 1.5), - new ModifierTypeOption(modifierTypes.MAX_ELIXIR(), 0, baseCost * 2.5) + new ModifierTypeOption(modifierTypes.MAX_ELIXIR(), 0, baseCost * 2.5), ], - [ - new ModifierTypeOption(modifierTypes.FULL_RESTORE(), 0, baseCost * 2.25) - ], - [ - new ModifierTypeOption(modifierTypes.SACRED_ASH(), 0, baseCost * 10) - ] + [new ModifierTypeOption(modifierTypes.FULL_RESTORE(), 0, baseCost * 2.25)], + [new ModifierTypeOption(modifierTypes.SACRED_ASH(), 0, baseCost * 10)], ]; return options.slice(0, Math.ceil(Math.max(waveIndex + 10, 0) / 30)).flat(); } -export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: PersistentModifier[], scene: BattleScene): EnemyPersistentModifier { +export function getEnemyBuffModifierForWave( + tier: ModifierTier, + enemyModifiers: PersistentModifier[], +): EnemyPersistentModifier { let tierStackCount: number; switch (tier) { case ModifierTier.ULTRA: @@ -2265,7 +3427,11 @@ export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: let candidate = getNewModifierTypeOption([], ModifierPoolType.ENEMY_BUFF, tier); let r = 0; let matchingModifier: PersistentModifier | undefined; - while (++r < retryCount && (matchingModifier = enemyModifiers.find(m => m.type.id === candidate?.type?.id)) && matchingModifier.getMaxStackCount(scene) < matchingModifier.stackCount + (r < 10 ? tierStackCount : 1)) { + while ( + ++r < retryCount && + (matchingModifier = enemyModifiers.find(m => m.type.id === candidate?.type?.id)) && + matchingModifier.getMaxStackCount() < matchingModifier.stackCount + (r < 10 ? tierStackCount : 1) + ) { candidate = getNewModifierTypeOption([], ModifierPoolType.ENEMY_BUFF, tier); } @@ -2275,8 +3441,20 @@ export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: return modifier; } -export function getEnemyModifierTypesForWave(waveIndex: integer, count: integer, party: EnemyPokemon[], poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, upgradeChance: integer = 0): PokemonHeldItemModifierType[] { - const ret = new Array(count).fill(0).map(() => getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !randSeedInt(upgradeChance) ? 1 : 0)?.type as PokemonHeldItemModifierType); +export function getEnemyModifierTypesForWave( + waveIndex: number, + count: number, + party: EnemyPokemon[], + poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, + upgradeChance = 0, +): PokemonHeldItemModifierType[] { + const ret = new Array(count) + .fill(0) + .map( + () => + getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !randSeedInt(upgradeChance) ? 1 : 0) + ?.type as PokemonHeldItemModifierType, + ); if (!(waveIndex % 1000)) { ret.push(getModifierType(modifierTypes.MINI_BLACK_HOLE) as PokemonHeldItemModifierType); } @@ -2302,7 +3480,9 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[]): PokemonHeld tier = ModifierTier.MASTER; } - const modifier = getNewModifierTypeOption(party, ModifierPoolType.DAILY_STARTER, tier)?.type?.newModifier(p) as PokemonHeldItemModifier; + const modifier = getNewModifierTypeOption(party, ModifierPoolType.DAILY_STARTER, tier)?.type?.newModifier( + p, + ) as PokemonHeldItemModifier; ret.push(modifier); } } @@ -2319,7 +3499,14 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[]): PokemonHeld * @param retryCount Max allowed tries before the next tier down is checked for a valid ModifierType * @param allowLuckUpgrades Default true. If false, will not allow ModifierType to randomly upgrade to next tier */ -function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, tier?: ModifierTier, upgradeCount?: integer, retryCount: integer = 0, allowLuckUpgrades: boolean = true): ModifierTypeOption | null { +function getNewModifierTypeOption( + party: Pokemon[], + poolType: ModifierPoolType, + tier?: ModifierTier, + upgradeCount?: number, + retryCount = 0, + allowLuckUpgrades = true, +): ModifierTypeOption | null { const player = !poolType; const pool = getModifierPoolForType(poolType); let thresholds: object; @@ -2379,10 +3566,10 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, } else if (upgradeCount === undefined && player) { upgradeCount = 0; if (tier < ModifierTier.MASTER && allowLuckUpgrades) { - const partyShinyCount = party.filter(p => p.isShiny() && !p.isFainted()).length; - const upgradeOdds = Math.floor(32 / ((partyShinyCount + 2) / 2)); + const partyLuckValue = getPartyLuckValue(party); + const upgradeOdds = Math.floor(128 / ((partyLuckValue + 4) / 4)); while (modifierPool.hasOwnProperty(tier + upgradeCount + 1) && modifierPool[tier + upgradeCount + 1].length) { - if (!randSeedInt(upgradeOdds)) { + if (randSeedInt(upgradeOdds) < 4) { upgradeCount++; } else { break; @@ -2396,11 +3583,11 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, } const tierThresholds = Object.keys(thresholds[tier]); - const totalWeight = parseInt(tierThresholds[tierThresholds.length - 1]); + const totalWeight = Number.parseInt(tierThresholds[tierThresholds.length - 1]); const value = randSeedInt(totalWeight); - let index: integer | undefined; + let index: number | undefined; for (const t of tierThresholds) { - const threshold = parseInt(t); + const threshold = Number.parseInt(t); if (value < threshold) { index = thresholds[tier][threshold]; break; @@ -2414,7 +3601,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, if (player) { console.log(index, ignoredPoolIndexes[tier].filter(i => i <= index).length, ignoredPoolIndexes[tier]); } - let modifierType: ModifierType | null = (pool[tier][index]).modifierType; + let modifierType: ModifierType | null = pool[tier][index].modifierType; if (modifierType instanceof ModifierTypeGenerator) { modifierType = (modifierType as ModifierTypeGenerator).generateType(party); if (modifierType === null) { @@ -2440,10 +3627,10 @@ export function getDefaultModifierTypeForTier(tier: ModifierTier): ModifierType export class ModifierTypeOption { public type: ModifierType; - public upgradeCount: integer; - public cost: integer; + public upgradeCount: number; + public cost: number; - constructor(type: ModifierType, upgradeCount: integer, cost: number = 0) { + constructor(type: ModifierType, upgradeCount: number, cost = 0) { this.type = type; this.upgradeCount = upgradeCount; this.cost = Math.min(Math.round(cost), Number.MAX_SAFE_INTEGER); @@ -2455,24 +3642,34 @@ export class ModifierTypeOption { * @param party The player's party. * @returns A number between 0 and 14 based on the party's total luck value, or a random number between 0 and 14 if the player is in Daily Run mode. */ -export function getPartyLuckValue(party: Pokemon[]): integer { - if (party[0].scene.gameMode.isDaily) { +export function getPartyLuckValue(party: Pokemon[]): number { + if (globalScene.gameMode.isDaily) { const DailyLuck = new NumberHolder(0); - party[0].scene.executeWithSeedOffset(() => { - DailyLuck.value = randSeedInt(15); // Random number between 0 and 14 - }, 0, party[0].scene.seed); + globalScene.executeWithSeedOffset( + () => { + DailyLuck.value = randSeedInt(15); // Random number between 0 and 14 + }, + 0, + globalScene.seed, + ); return DailyLuck.value; } - const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() : 0) - .reduce((total: integer, value: integer) => total += value, 0), 0, 14); - return luck ?? 0; + const eventSpecies = globalScene.eventManager.getEventLuckBoostedSpecies(); + const luck = Phaser.Math.Clamp( + party + .map(p => (p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 1 : 0) : 0)) + .reduce((total: number, value: number) => (total += value), 0), + 0, + 14, + ); + return Math.min(globalScene.eventManager.getEventLuckBoost() + (luck ?? 0), 14); } -export function getLuckString(luckValue: integer): string { - return [ "D", "C", "C+", "B-", "B", "B+", "A-", "A", "A+", "A++", "S", "S+", "SS", "SS+", "SSS" ][luckValue]; +export function getLuckString(luckValue: number): string { + return ["D", "C", "C+", "B-", "B", "B+", "A-", "A", "A+", "A++", "S", "S+", "SS", "SS+", "SSS"][luckValue]; } -export function getLuckTextTint(luckValue: integer): integer { +export function getLuckTextTint(luckValue: number): number { let modifierTier: ModifierTier; if (luckValue > 11) { modifierTier = ModifierTier.LUXURY; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 11f16f103a5..a084474ddac 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1,36 +1,55 @@ -import type BattleScene from "#app/battle-scene"; -import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import { FusionSpeciesFormEvolution, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { getBerryEffectFunc, getBerryPredicate } from "#app/data/berry"; import { getLevelTotalExp } from "#app/data/exp"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; -import { type FormChangeItem, SpeciesFormChangeItemTrigger, SpeciesFormChangeLapseTeraTrigger, SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; +import { type FormChangeItem, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectHealText } from "#app/data/status-effect"; -import { Type } from "#app/data/type"; -import Pokemon, { type PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import Overrides from "#app/overrides"; import { EvolutionPhase } from "#app/phases/evolution-phase"; import { LearnMovePhase, LearnMoveType } from "#app/phases/learn-move-phase"; import { LevelUpPhase } from "#app/phases/level-up-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; -import { achvs } from "#app/system/achv"; 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 type { Moves } from "#enums/moves"; import type { Nature } from "#enums/nature"; import type { PokeballType } from "#enums/pokeball"; import { Species } from "#enums/species"; import { type PermanentStat, type TempBattleStat, BATTLE_STATS, Stat, TEMP_BATTLE_STATS } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; +import type { PokemonType } from "#enums/pokemon-type"; import i18next from "i18next"; -import { type DoubleBattleChanceBoosterModifierType, type EvolutionItemModifierType, type FormChangeItemModifierType, type ModifierOverride, type ModifierType, type PokemonBaseStatTotalModifierType, type PokemonExpBoosterModifierType, type PokemonFriendshipBoosterModifierType, type PokemonMoveAccuracyBoosterModifierType, type PokemonMultiHitModifierType, type TerastallizeModifierType, type TmModifierType, getModifierType, ModifierPoolType, ModifierTypeGenerator, modifierTypes, PokemonHeldItemModifierType } from "./modifier-type"; +import { + type DoubleBattleChanceBoosterModifierType, + type EvolutionItemModifierType, + type FormChangeItemModifierType, + type ModifierOverride, + type ModifierType, + type PokemonBaseStatTotalModifierType, + type PokemonExpBoosterModifierType, + type PokemonFriendshipBoosterModifierType, + type PokemonMoveAccuracyBoosterModifierType, + type PokemonMultiHitModifierType, + type TerastallizeModifierType, + type TmModifierType, + getModifierType, + ModifierPoolType, + ModifierTypeGenerator, + modifierTypes, + PokemonHeldItemModifierType, +} from "./modifier-type"; import { Color, ShadowColor } from "#enums/color"; import { FRIENDSHIP_GAIN_FROM_RARE_CANDY } from "#app/data/balance/starters"; +import { applyAbAttrs, CommanderAbAttr } from "#app/data/ability"; +import { globalScene } from "#app/global-scene"; export type ModifierPredicate = (modifier: Modifier) => boolean; @@ -45,27 +64,27 @@ export const modifierSortFunc = (a: Modifier, b: Modifier): number => { //First sort by pokemonID if (aId < bId) { return 1; - } else if (aId > bId) { + } + if (aId > bId) { return -1; - } else if (aId === bId) { + } + if (aId === bId) { //Then sort by item type if (typeNameMatch === 0) { return itemNameMatch; //Finally sort by item name - } else { - return typeNameMatch; } - } else { - return 0; + return typeNameMatch; } + return 0; }; export class ModifierBar extends Phaser.GameObjects.Container { private player: boolean; private modifierCache: PersistentModifier[]; - constructor(scene: BattleScene, enemy?: boolean) { - super(scene, 1 + (enemy ? 302 : 0), 2); + constructor(enemy?: boolean) { + super(globalScene, 1 + (enemy ? 302 : 0), 2); this.player = !enemy; this.setScale(0.5); @@ -76,19 +95,23 @@ export class ModifierBar extends Phaser.GameObjects.Container { * @param {PersistentModifier[]} modifiers - The list of modifiers to be displayed in the {@linkcode ModifierBar} * @param {boolean} hideHeldItems - If set to "true", only modifiers not assigned to a Pokémon are displayed */ - updateModifiers(modifiers: PersistentModifier[], hideHeldItems: boolean = false) { + updateModifiers(modifiers: PersistentModifier[], hideHeldItems = false) { this.removeAll(true); - const visibleIconModifiers = modifiers.filter(m => m.isIconVisible(this.scene as BattleScene)); - const nonPokemonSpecificModifiers = visibleIconModifiers.filter(m => !(m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); - const pokemonSpecificModifiers = visibleIconModifiers.filter(m => (m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); + const visibleIconModifiers = modifiers.filter(m => m.isIconVisible()); + const nonPokemonSpecificModifiers = visibleIconModifiers + .filter(m => !(m as PokemonHeldItemModifier).pokemonId) + .sort(modifierSortFunc); + const pokemonSpecificModifiers = visibleIconModifiers + .filter(m => (m as PokemonHeldItemModifier).pokemonId) + .sort(modifierSortFunc); - const sortedVisibleIconModifiers = hideHeldItems ? nonPokemonSpecificModifiers : nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); - - const thisArg = this; + const sortedVisibleIconModifiers = hideHeldItems + ? nonPokemonSpecificModifiers + : nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); sortedVisibleIconModifiers.forEach((modifier: PersistentModifier, i: number) => { - const icon = modifier.getIcon(this.scene as BattleScene); + const icon = modifier.getIcon(); if (i >= iconOverflowIndex) { icon.setVisible(false); } @@ -96,15 +119,15 @@ export class ModifierBar extends Phaser.GameObjects.Container { this.setModifierIconPosition(icon, sortedVisibleIconModifiers.length); icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 24), Phaser.Geom.Rectangle.Contains); icon.on("pointerover", () => { - (this.scene as BattleScene).ui.showTooltip(modifier.type.name, modifier.type.getDescription(this.scene as BattleScene)); + globalScene.ui.showTooltip(modifier.type.name, modifier.type.getDescription()); if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) { - thisArg.updateModifierOverflowVisibility(true); + this.updateModifierOverflowVisibility(true); } }); icon.on("pointerout", () => { - (this.scene as BattleScene).ui.hideTooltip(); + globalScene.ui.hideTooltip(); if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) { - thisArg.updateModifierOverflowVisibility(false); + this.updateModifierOverflowVisibility(false); } }); }); @@ -124,9 +147,9 @@ export class ModifierBar extends Phaser.GameObjects.Container { } setModifierIconPosition(icon: Phaser.GameObjects.Container, modifierCount: number) { - const rowIcons: number = 12 + 6 * Math.max((Math.ceil(Math.min(modifierCount, 24) / 12) - 2), 0); + const rowIcons: number = 12 + 6 * Math.max(Math.ceil(Math.min(modifierCount, 24) / 12) - 2, 0); - const x = (this.getIndex(icon) % rowIcons) * 26 / (rowIcons / 12); + const x = ((this.getIndex(icon) % rowIcons) * 26) / (rowIcons / 12); const y = Math.floor(this.getIndex(icon) / rowIcons) * 20; icon.setPosition(this.player ? x : -x, y); @@ -157,23 +180,23 @@ export abstract class Modifier { * Handles applying of {@linkcode Modifier} * @param args collection of all passed parameters */ - abstract apply(...args: unknown[]): boolean | Promise; + abstract apply(...args: unknown[]): boolean; } export abstract class PersistentModifier extends Modifier { public stackCount: number; public virtualStackCount: number; - constructor(type: ModifierType, stackCount?: number) { + constructor(type: ModifierType, stackCount = 1) { super(type); - this.stackCount = stackCount === undefined ? 1 : stackCount; + this.stackCount = stackCount; this.virtualStackCount = 0; } - add(modifiers: PersistentModifier[], virtual: boolean, scene: BattleScene): boolean { + add(modifiers: PersistentModifier[], virtual: boolean): boolean { for (const modifier of modifiers) { if (this.match(modifier)) { - return modifier.incrementStack(scene, this.stackCount, virtual); + return modifier.incrementStack(this.stackCount, virtual); } } @@ -191,8 +214,8 @@ export abstract class PersistentModifier extends Modifier { return []; } - incrementStack(scene: BattleScene, amount: number, virtual: boolean): boolean { - if (this.getStackCount() + amount <= this.getMaxStackCount(scene)) { + incrementStack(amount: number, virtual: boolean): boolean { + if (this.getStackCount() + amount <= this.getMaxStackCount()) { if (!virtual) { this.stackCount += amount; } else { @@ -208,26 +231,26 @@ export abstract class PersistentModifier extends Modifier { return this.stackCount + this.virtualStackCount; } - abstract getMaxStackCount(scene: BattleScene, forThreshold?: boolean): number; + abstract getMaxStackCount(forThreshold?: boolean): number; - isIconVisible(scene: BattleScene): boolean { + isIconVisible(): boolean { return true; } - getIcon(scene: BattleScene, forSummary?: boolean): Phaser.GameObjects.Container { - const container = scene.add.container(0, 0); + getIcon(_forSummary?: boolean): Phaser.GameObjects.Container { + const container = globalScene.add.container(0, 0); - const item = scene.add.sprite(0, 12, "items"); + const item = globalScene.add.sprite(0, 12, "items"); item.setFrame(this.type.iconImage); item.setOrigin(0, 0.5); container.add(item); - const stackText = this.getIconStackText(scene); + const stackText = this.getIconStackText(); if (stackText) { container.add(stackText); } - const virtualStackText = this.getIconStackText(scene, true); + const virtualStackText = this.getIconStackText(true); if (virtualStackText) { container.add(virtualStackText); } @@ -235,14 +258,14 @@ export abstract class PersistentModifier extends Modifier { return container; } - getIconStackText(scene: BattleScene, virtual?: boolean): Phaser.GameObjects.BitmapText | null { - if (this.getMaxStackCount(scene) === 1 || (virtual && !this.virtualStackCount)) { + getIconStackText(virtual?: boolean): Phaser.GameObjects.BitmapText | null { + if (this.getMaxStackCount() === 1 || (virtual && !this.virtualStackCount)) { return null; } - const text = scene.add.bitmapText(10, 15, "item-count", this.stackCount.toString(), 11); + const text = globalScene.add.bitmapText(10, 15, "item-count", this.stackCount.toString(), 11); text.letterSpacing = -0.5; - if (this.getStackCount() >= this.getMaxStackCount(scene)) { + if (this.getStackCount() >= this.getMaxStackCount()) { text.setTint(0xf89890); } text.setOrigin(0, 0); @@ -252,10 +275,6 @@ export abstract class PersistentModifier extends Modifier { } export abstract class ConsumableModifier extends Modifier { - constructor(type: ModifierType) { - super(type); - } - add(_modifiers: Modifier[]): boolean { return true; } @@ -277,9 +296,12 @@ export class AddPokeballModifier extends ConsumableModifier { * @param battleScene {@linkcode BattleScene} * @returns always `true` */ - override apply(battleScene: BattleScene): boolean { - const pokeballCounts = battleScene.pokeballCounts; - pokeballCounts[this.pokeballType] = Math.min(pokeballCounts[this.pokeballType] + this.count, MAX_PER_TYPE_POKEBALLS); + override apply(): boolean { + const pokeballCounts = globalScene.pokeballCounts; + pokeballCounts[this.pokeballType] = Math.min( + pokeballCounts[this.pokeballType] + this.count, + MAX_PER_TYPE_POKEBALLS, + ); return true; } @@ -301,8 +323,8 @@ export class AddVoucherModifier extends ConsumableModifier { * @param battleScene {@linkcode BattleScene} * @returns always `true` */ - override apply(battleScene: BattleScene): boolean { - const voucherCounts = battleScene.gameData.voucherCounts; + override apply(): boolean { + const voucherCounts = globalScene.gameData.voucherCounts; voucherCounts[this.voucherType] += this.count; return true; @@ -342,13 +364,13 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { * @param _scene N/A * @returns `true` if the modifier was successfully added or applied, false otherwise */ - add(modifiers: PersistentModifier[], _virtual: boolean, scene: BattleScene): boolean { + add(modifiers: PersistentModifier[], _virtual: boolean): boolean { for (const modifier of modifiers) { if (this.match(modifier)) { const modifierInstance = modifier as LapsingPersistentModifier; if (modifierInstance.getBattleCount() < modifierInstance.getMaxBattles()) { modifierInstance.resetBattleCount(); - scene.playSound("se/restore"); + globalScene.playSound("se/restore"); return true; } // should never get here @@ -370,8 +392,8 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { return this.battleCount > 0; } - getIcon(scene: BattleScene): Phaser.GameObjects.Container { - const container = super.getIcon(scene); + getIcon(): Phaser.GameObjects.Container { + const container = super.getIcon(); // Linear interpolation on hue const hue = Math.floor(120 * (this.battleCount / this.maxBattles) + 5); @@ -380,7 +402,7 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { const typeHex = hslToHex(hue, 0.5, 0.9); const strokeHex = hslToHex(hue, 0.7, 0.3); - const battleCountText = addTextObject(scene, 27, 0, this.battleCount.toString(), TextStyle.PARTY, { + const battleCountText = addTextObject(27, 0, this.battleCount.toString(), TextStyle.PARTY, { fontSize: "66px", color: typeHex, }); @@ -392,7 +414,7 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { return container; } - getIconStackText(_scene: BattleScene, _virtual?: boolean): Phaser.GameObjects.BitmapText | null { + getIconStackText(_virtual?: boolean): Phaser.GameObjects.BitmapText | null { return null; } @@ -417,10 +439,10 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { } getArgs(): any[] { - return [ this.maxBattles, this.battleCount ]; + return [this.maxBattles, this.battleCount]; } - getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number { + getMaxStackCount(_forThreshold?: boolean): number { // Must be an abitrary number greater than 1 return 2; } @@ -435,16 +457,17 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier { public override type: DoubleBattleChanceBoosterModifierType; - constructor(type: ModifierType, maxBattles:number, battleCount?: number, stackCount?: number) { - super(type, maxBattles, battleCount, stackCount); - } - match(modifier: Modifier): boolean { - return (modifier instanceof DoubleBattleChanceBoosterModifier) && (modifier.getMaxBattles() === this.getMaxBattles()); + return modifier instanceof DoubleBattleChanceBoosterModifier && modifier.getMaxBattles() === this.getMaxBattles(); } clone(): DoubleBattleChanceBoosterModifier { - return new DoubleBattleChanceBoosterModifier(this.type, this.getMaxBattles(), this.getBattleCount(), this.stackCount); + return new DoubleBattleChanceBoosterModifier( + this.type, + this.getMaxBattles(), + this.getBattleCount(), + this.stackCount, + ); } /** @@ -480,23 +503,29 @@ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { this.stat = stat; // Note that, because we want X Accuracy to maintain its original behavior, // it will increment as it did previously, directly to the stat stage. - this.boost = (stat !== Stat.ACC) ? 0.3 : 1; + this.boost = stat !== Stat.ACC ? 0.3 : 1; } match(modifier: Modifier): boolean { if (modifier instanceof TempStatStageBoosterModifier) { const modifierInstance = modifier as TempStatStageBoosterModifier; - return (modifierInstance.stat === this.stat); + return modifierInstance.stat === this.stat; } return false; } clone() { - return new TempStatStageBoosterModifier(this.type, this.stat, this.getMaxBattles(), this.getBattleCount(), this.stackCount); + return new TempStatStageBoosterModifier( + this.type, + this.stat, + this.getMaxBattles(), + this.getBattleCount(), + this.stackCount, + ); } getArgs(): any[] { - return [ this.stat, ...super.getArgs() ]; + return [this.stat, ...super.getArgs()]; } /** @@ -507,7 +536,9 @@ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { * @returns `true` if the modifier can be applied, false otherwise */ override shouldApply(tempBattleStat?: TempBattleStat, statLevel?: NumberHolder): boolean { - return !!tempBattleStat && !!statLevel && TEMP_BATTLE_STATS.includes(tempBattleStat) && (tempBattleStat === this.stat); + return ( + !!tempBattleStat && !!statLevel && TEMP_BATTLE_STATS.includes(tempBattleStat) && tempBattleStat === this.stat + ); } /** @@ -528,16 +559,12 @@ export class TempStatStageBoosterModifier extends LapsingPersistentModifier { * @see {@linkcode apply} */ export class TempCritBoosterModifier extends LapsingPersistentModifier { - constructor(type: ModifierType, maxBattles: number, battleCount?: number, stackCount?: number) { - super(type, maxBattles, battleCount, stackCount); - } - clone() { return new TempCritBoosterModifier(this.type, this.getMaxBattles(), this.getBattleCount(), this.stackCount); } match(modifier: Modifier): boolean { - return (modifier instanceof TempCritBoosterModifier); + return modifier instanceof TempCritBoosterModifier; } /** @@ -561,10 +588,6 @@ export class TempCritBoosterModifier extends LapsingPersistentModifier { } export class MapModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - clone(): MapModifier { return new MapModifier(this.type, this.stackCount); } @@ -573,16 +596,12 @@ export class MapModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 1; } } export class MegaEvolutionAccessModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - clone(): MegaEvolutionAccessModifier { return new MegaEvolutionAccessModifier(this.type, this.stackCount); } @@ -591,16 +610,12 @@ export class MegaEvolutionAccessModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 1; } } export class GigantamaxAccessModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - clone(): GigantamaxAccessModifier { return new GigantamaxAccessModifier(this.type, this.stackCount); } @@ -614,16 +629,12 @@ export class GigantamaxAccessModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 1; } } export class TerastallizeAccessModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - clone(): TerastallizeAccessModifier { return new TerastallizeAccessModifier(this.type, this.stackCount); } @@ -637,14 +648,14 @@ export class TerastallizeAccessModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 1; } } export abstract class PokemonHeldItemModifier extends PersistentModifier { public pokemonId: number; - public isTransferable: boolean = true; + public isTransferable = true; constructor(type: ModifierType, pokemonId: number, stackCount?: number) { super(type, stackCount); @@ -659,7 +670,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { } getArgs(): any[] { - return [ this.pokemonId ]; + return [this.pokemonId]; } /** @@ -679,33 +690,33 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { return !!pokemon && (this.pokemonId === -1 || pokemon.id === this.pokemonId); } - isIconVisible(scene: BattleScene): boolean { - return !!(this.getPokemon(scene)?.isOnField()); + isIconVisible(): boolean { + return !!this.getPokemon()?.isOnField(); } - getIcon(scene: BattleScene, forSummary?: boolean): Phaser.GameObjects.Container { - const container = !forSummary ? scene.add.container(0, 0) : super.getIcon(scene); + getIcon(forSummary?: boolean): Phaser.GameObjects.Container { + const container = !forSummary ? globalScene.add.container(0, 0) : super.getIcon(); if (!forSummary) { - const pokemon = this.getPokemon(scene); + const pokemon = this.getPokemon(); if (pokemon) { - const pokemonIcon = scene.addPokemonIcon(pokemon, -2, 10, 0, 0.5); + const pokemonIcon = globalScene.addPokemonIcon(pokemon, -2, 10, 0, 0.5); container.add(pokemonIcon); container.setName(pokemon.id.toString()); } - const item = scene.add.sprite(16, this.virtualStackCount ? 8 : 16, "items"); + const item = globalScene.add.sprite(16, this.virtualStackCount ? 8 : 16, "items"); item.setScale(0.5); item.setOrigin(0, 0.5); item.setTexture("items", this.type.iconImage); container.add(item); - const stackText = this.getIconStackText(scene); + const stackText = this.getIconStackText(); if (stackText) { container.add(stackText); } - const virtualStackText = this.getIconStackText(scene, true); + const virtualStackText = this.getIconStackText(true); if (virtualStackText) { container.add(virtualStackText); } @@ -716,37 +727,24 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { return container; } - getPokemon(scene: BattleScene): Pokemon | undefined { - return this.pokemonId ? scene.getPokemonById(this.pokemonId) ?? undefined : undefined; + getPokemon(): Pokemon | undefined { + return this.pokemonId ? (globalScene.getPokemonById(this.pokemonId) ?? undefined) : undefined; } getScoreMultiplier(): number { 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)[0]) { - return 1; - } - const sheerForceAffected = allMoves[pokemon.getLastXMoves(0)[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); + getMaxStackCount(forThreshold?: boolean): number { + const pokemon = this.getPokemon(); if (!pokemon) { return 0; } if (pokemon.isPlayer() && forThreshold) { - return scene.getParty().map(p => this.getMaxHeldItemCount(p)).reduce((stackCount: number, maxStackCount: number) => Math.max(stackCount, maxStackCount), 0); + return globalScene + .getPlayerParty() + .map(p => this.getMaxHeldItemCount(p)) + .reduce((stackCount: number, maxStackCount: number) => Math.max(stackCount, maxStackCount), 0); } return this.getMaxHeldItemCount(pokemon); } @@ -756,7 +754,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModifier { protected battlesLeft: number; - public isTransferable: boolean = false; + public isTransferable = false; constructor(type: ModifierType, pokemonId: number, battlesLeft?: number, stackCount?: number) { super(type, pokemonId, stackCount); @@ -775,15 +773,17 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi /** * Retrieve the {@linkcode Modifier | Modifiers} icon as a {@linkcode Phaser.GameObjects.Container | Container} - * @param scene The {@linkcode BattleScene} * @param forSummary `true` if the icon is for the summary screen * @returns the icon as a {@linkcode Phaser.GameObjects.Container | Container} */ - public getIcon(scene: BattleScene, forSummary?: boolean): Phaser.GameObjects.Container { - const container = super.getIcon(scene, forSummary); + public getIcon(forSummary?: boolean): Phaser.GameObjects.Container { + const container = super.getIcon(forSummary); - if (this.getPokemon(scene)?.isPlayer()) { - const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: "66px", color: Color.PINK }); + if (this.getPokemon()?.isPlayer()) { + const battleCountText = addTextObject(27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { + fontSize: "66px", + color: Color.PINK, + }); battleCountText.setShadow(0, 0); battleCountText.setStroke(ShadowColor.RED, 16); battleCountText.setOrigin(1, 0); @@ -797,73 +797,7 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi return this.battlesLeft; } - getMaxStackCount(scene: BattleScene, forThreshold?: boolean): number { - return 1; - } -} - -export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { - public override type: TerastallizeModifierType; - public teraType: Type; - public isTransferable: boolean = false; - - constructor(type: TerastallizeModifierType, pokemonId: number, teraType: Type, battlesLeft?: number, stackCount?: number) { - super(type, pokemonId, battlesLeft || 10, stackCount); - - this.teraType = teraType; - } - - matchType(modifier: Modifier): boolean { - if (modifier instanceof TerastallizeModifier && modifier.teraType === this.teraType) { - return true; - } - return false; - } - - clone(): TerastallizeModifier { - return new TerastallizeModifier(this.type, this.pokemonId, this.teraType, this.battlesLeft, this.stackCount); - } - - getArgs(): any[] { - return [ this.pokemonId, this.teraType, this.battlesLeft ]; - } - - /** - * Applies the {@linkcode TerastallizeModifier} to the specified {@linkcode Pokemon}. - * @param pokemon the {@linkcode Pokemon} to be terastallized - * @returns always `true` - */ - override apply(pokemon: Pokemon): boolean { - if (pokemon.isPlayer()) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeTeraTrigger); - pokemon.scene.validateAchv(achvs.TERASTALLIZE); - if (this.teraType === Type.STELLAR) { - pokemon.scene.validateAchv(achvs.STELLAR_TERASTALLIZE); - } - } - pokemon.updateSpritePipelineData(); - return true; - } - - /** - * Triggers {@linkcode LapsingPokemonHeldItemModifier.lapse} and if it returns `0` a form change is triggered. - * @param pokemon THe {@linkcode Pokemon} to be terastallized - * @returns the result of {@linkcode LapsingPokemonHeldItemModifier.lapse} - */ - public override lapse(pokemon: Pokemon): boolean { - const ret = super.lapse(pokemon); - if (!ret) { - pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeLapseTeraTrigger); - pokemon.updateSpritePipelineData(); - } - return ret; - } - - getScoreMultiplier(): number { - return 1.25; - } - - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxStackCount(_forThreshold?: boolean): number { return 1; } } @@ -876,7 +810,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { */ export class BaseStatModifier extends PokemonHeldItemModifier { protected stat: PermanentStat; - public isTransferable: boolean = false; + public isTransferable = false; constructor(type: ModifierType, pokemonId: number, stat: PermanentStat, stackCount?: number) { super(type, pokemonId, stackCount); @@ -931,7 +865,7 @@ export class BaseStatModifier extends PokemonHeldItemModifier { export class EvoTrackerModifier extends PokemonHeldItemModifier { protected species: Species; protected required: number; - public isTransferable: boolean = false; + public isTransferable = false; constructor(type: ModifierType, pokemonId: number, species: Species, required: number, stackCount?: number) { super(type, pokemonId, stackCount); @@ -940,7 +874,9 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { } matchType(modifier: Modifier): boolean { - return modifier instanceof EvoTrackerModifier && modifier.species === this.species && modifier.required === this.required; + return ( + modifier instanceof EvoTrackerModifier && modifier.species === this.species && modifier.required === this.required + ); } clone(): PersistentModifier { @@ -948,7 +884,7 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { } getArgs(): any[] { - return super.getArgs().concat([ this.species, this.required ]); + return super.getArgs().concat([this.species, this.required]); } /** @@ -959,19 +895,25 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { return true; } - getIconStackText(scene: BattleScene, virtual?: boolean): Phaser.GameObjects.BitmapText | null { - if (this.getMaxStackCount(scene) === 1 || (virtual && !this.virtualStackCount)) { + getIconStackText(virtual?: boolean): Phaser.GameObjects.BitmapText | null { + if (this.getMaxStackCount() === 1 || (virtual && !this.virtualStackCount)) { return null; } - const pokemon = scene.getPokemonById(this.pokemonId); + const pokemon = globalScene.getPokemonById(this.pokemonId); this.stackCount = pokemon - ? pokemon.evoCounter + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length - + pokemon.scene.findModifiers(m => m instanceof MoneyMultiplierModifier || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length + ? pokemon.evoCounter + + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length + + globalScene.findModifiers( + m => + m instanceof MoneyMultiplierModifier || + m instanceof ExtraModifierModifier || + m instanceof TempExtraModifierModifier, + ).length : this.stackCount; - const text = scene.add.bitmapText(10, 15, "item-count", this.stackCount.toString(), 11); + const text = globalScene.add.bitmapText(10, 15, "item-count", this.stackCount.toString(), 11); text.letterSpacing = -0.5; if (this.getStackCount() >= this.required) { text.setTint(0xf89890); @@ -982,8 +924,15 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { } getMaxHeldItemCount(pokemon: Pokemon): number { - this.stackCount = pokemon.evoCounter + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length - + pokemon.scene.findModifiers(m => m instanceof MoneyMultiplierModifier || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length; + this.stackCount = + pokemon.evoCounter + + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length + + globalScene.findModifiers( + m => + m instanceof MoneyMultiplierModifier || + m instanceof ExtraModifierModifier || + m instanceof TempExtraModifierModifier, + ).length; return 999; } } @@ -993,7 +942,7 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { */ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { public override type: PokemonBaseStatTotalModifierType; - public isTransferable: boolean = false; + public isTransferable = false; private statModifier: number; @@ -1045,7 +994,7 @@ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { return 1.2; } - override getMaxHeldItemCount(pokemon: Pokemon): number { + override getMaxHeldItemCount(_pokemon: Pokemon): number { return 2; } } @@ -1056,9 +1005,9 @@ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { private statModifier: number; private stats: Stat[]; - public isTransferable: boolean = false; + public isTransferable = false; - constructor (type: ModifierType, pokemonId: number, statModifier: number, stats: Stat[], stackCount?: number) { + constructor(type: ModifierType, pokemonId: number, statModifier: number, stats: Stat[], stackCount?: number) { super(type, pokemonId, stackCount); this.statModifier = statModifier; @@ -1066,7 +1015,11 @@ export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { } override matchType(modifier: Modifier): boolean { - return modifier instanceof PokemonBaseStatFlatModifier && modifier.statModifier === this.statModifier && this.stats.every(s => modifier.stats.some(stat => s === stat)); + return ( + modifier instanceof PokemonBaseStatFlatModifier && + modifier.statModifier === this.statModifier && + this.stats.every(s => modifier.stats.some(stat => s === stat)) + ); } override clone(): PersistentModifier { @@ -1074,7 +1027,7 @@ export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { } override getArgs(): any[] { - return [ ...super.getArgs(), this.statModifier, this.stats ]; + return [...super.getArgs(), this.statModifier, this.stats]; } /** @@ -1109,7 +1062,7 @@ export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { return 1.1; } - override getMaxHeldItemCount(pokemon: Pokemon): number { + override getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } } @@ -1118,11 +1071,7 @@ export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { * Currently used by Macho Brace item */ export class PokemonIncrementingStatModifier extends PokemonHeldItemModifier { - public isTransferable: boolean = false; - - constructor (type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } + public isTransferable = false; matchType(modifier: Modifier): boolean { return modifier instanceof PokemonIncrementingStatModifier; @@ -1178,7 +1127,7 @@ export class PokemonIncrementingStatModifier extends PokemonHeldItemModifier { return 1.2; } - getMaxHeldItemCount(pokemon?: Pokemon): number { + getMaxHeldItemCount(_pokemon?: Pokemon): number { return 50; } } @@ -1207,13 +1156,13 @@ export class StatBoosterModifier extends PokemonHeldItemModifier { } getArgs(): any[] { - return [ ...super.getArgs(), this.stats, this.multiplier ]; + return [...super.getArgs(), this.stats, this.multiplier]; } matchType(modifier: Modifier): boolean { if (modifier instanceof StatBoosterModifier) { const modifierInstance = modifier as StatBoosterModifier; - if ((modifierInstance.multiplier === this.multiplier) && (modifierInstance.stats.length === this.stats.length)) { + if (modifierInstance.multiplier === this.multiplier && modifierInstance.stats.length === this.stats.length) { return modifierInstance.stats.every((e, i) => e === this.stats[i]); } } @@ -1293,11 +1242,12 @@ export class EvolutionStatBoosterModifier extends StatBoosterModifier { override apply(pokemon: Pokemon, stat: Stat, statValue: NumberHolder): boolean { const isUnevolved = pokemon.getSpeciesForm(true).speciesId in pokemonEvolutions; - if (pokemon.isFusion() && (pokemon.getFusionSpeciesForm(true).speciesId in pokemonEvolutions) !== isUnevolved) { + if (pokemon.isFusion() && pokemon.getFusionSpeciesForm(true).speciesId in pokemonEvolutions !== isUnevolved) { // Half boost applied if pokemon is fused and either part of fusion is fully evolved statValue.value *= 1 + (this.multiplier - 1) / 2; return true; - } else if (isUnevolved) { + } + if (isUnevolved) { // Full boost applied if holder is unfused and unevolved or, if fused, both parts of fusion are unevolved return super.apply(pokemon, stat, statValue); } @@ -1316,18 +1266,32 @@ export class SpeciesStatBoosterModifier extends StatBoosterModifier { /** The species that the held item's stat boost(s) apply to */ private species: Species[]; - constructor(type: ModifierType, pokemonId: number, stats: Stat[], multiplier: number, species: Species[], stackCount?: number) { + constructor( + type: ModifierType, + pokemonId: number, + stats: Stat[], + multiplier: number, + species: Species[], + stackCount?: number, + ) { super(type, pokemonId, stats, multiplier, stackCount); this.species = species; } clone() { - return new SpeciesStatBoosterModifier(this.type, this.pokemonId, this.stats, this.multiplier, this.species, this.stackCount); + return new SpeciesStatBoosterModifier( + this.type, + this.pokemonId, + this.stats, + this.multiplier, + this.species, + this.stackCount, + ); } getArgs(): any[] { - return [ ...super.getArgs(), this.species ]; + return [...super.getArgs(), this.species]; } matchType(modifier: Modifier): boolean { @@ -1350,7 +1314,11 @@ export class SpeciesStatBoosterModifier extends StatBoosterModifier { * @returns `true` if the stat could be boosted, false otherwise */ override shouldApply(pokemon: Pokemon, stat: Stat, statValue: NumberHolder): boolean { - return super.shouldApply(pokemon, stat, statValue) && (this.species.includes(pokemon.getSpeciesForm(true).speciesId) || (pokemon.isFusion() && this.species.includes(pokemon.getFusionSpeciesForm(true).speciesId))); + return ( + super.shouldApply(pokemon, stat, statValue) && + (this.species.includes(pokemon.getSpeciesForm(true).speciesId) || + (pokemon.isFusion() && this.species.includes(pokemon.getFusionSpeciesForm(true).speciesId))) + ); } /** @@ -1428,11 +1396,17 @@ export class SpeciesCritBoosterModifier extends CritBoosterModifier { } clone() { - return new SpeciesCritBoosterModifier(this.type, this.pokemonId, this.stageIncrement, this.species, this.stackCount); + return new SpeciesCritBoosterModifier( + this.type, + this.pokemonId, + this.stageIncrement, + this.species, + this.stackCount, + ); } getArgs(): any[] { - return [ ...super.getArgs(), this.species ]; + return [...super.getArgs(), this.species]; } matchType(modifier: Modifier): boolean { @@ -1447,7 +1421,11 @@ export class SpeciesCritBoosterModifier extends CritBoosterModifier { * @returns `true` if the critical-hit level can be incremented, false otherwise */ override shouldApply(pokemon: Pokemon, critStage: NumberHolder): boolean { - return super.shouldApply(pokemon, critStage) && (this.species.includes(pokemon.getSpeciesForm(true).speciesId) || (pokemon.isFusion() && this.species.includes(pokemon.getFusionSpeciesForm(true).speciesId))); + return ( + super.shouldApply(pokemon, critStage) && + (this.species.includes(pokemon.getSpeciesForm(true).speciesId) || + (pokemon.isFusion() && this.species.includes(pokemon.getFusionSpeciesForm(true).speciesId))) + ); } } @@ -1455,10 +1433,10 @@ export class SpeciesCritBoosterModifier extends CritBoosterModifier { * Applies Specific Type item boosts (e.g., Magnet) */ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { - public moveType: Type; + public moveType: PokemonType; private boostMultiplier: number; - constructor(type: ModifierType, pokemonId: number, moveType: Type, boostPercent: number, stackCount?: number) { + constructor(type: ModifierType, pokemonId: number, moveType: PokemonType, boostPercent: number, stackCount?: number) { super(type, pokemonId, stackCount); this.moveType = moveType; @@ -1468,41 +1446,56 @@ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { matchType(modifier: Modifier): boolean { if (modifier instanceof AttackTypeBoosterModifier) { const attackTypeBoosterModifier = modifier as AttackTypeBoosterModifier; - return attackTypeBoosterModifier.moveType === this.moveType && attackTypeBoosterModifier.boostMultiplier === this.boostMultiplier; + return ( + attackTypeBoosterModifier.moveType === this.moveType && + attackTypeBoosterModifier.boostMultiplier === this.boostMultiplier + ); } return false; } clone() { - return new AttackTypeBoosterModifier(this.type, this.pokemonId, this.moveType, this.boostMultiplier * 100, this.stackCount); + return new AttackTypeBoosterModifier( + this.type, + this.pokemonId, + this.moveType, + this.boostMultiplier * 100, + this.stackCount, + ); } getArgs(): any[] { - return super.getArgs().concat([ this.moveType, this.boostMultiplier * 100 ]); + return super.getArgs().concat([this.moveType, this.boostMultiplier * 100]); } /** * Checks if {@linkcode AttackTypeBoosterModifier} should be applied * @param pokemon the {@linkcode Pokemon} that holds the held item - * @param moveType the {@linkcode Type} of the move being used + * @param moveType the {@linkcode PokemonType} of the move being used * @param movePower the {@linkcode NumberHolder} that holds the power of the move * @returns `true` if boosts should be applied to the move. */ - override shouldApply(pokemon?: Pokemon, moveType?: Type, movePower?: NumberHolder): boolean { - return super.shouldApply(pokemon, moveType, movePower) && typeof moveType === "number" && movePower instanceof NumberHolder; + override shouldApply(pokemon?: Pokemon, moveType?: PokemonType, movePower?: NumberHolder): boolean { + return ( + super.shouldApply(pokemon, moveType, movePower) && + typeof moveType === "number" && + movePower instanceof NumberHolder + ); } /** * Applies {@linkcode AttackTypeBoosterModifier} * @param pokemon {@linkcode Pokemon} that holds the held item - * @param moveType {@linkcode Type} of the move being used + * @param moveType {@linkcode PokemonType} of the move being used * @param movePower {@linkcode NumberHolder} that holds the power of the move * @returns `true` if boosts have been applied to the move. */ - override apply(_pokemon: Pokemon, moveType: Type, movePower: NumberHolder): boolean { + override apply(_pokemon: Pokemon, moveType: PokemonType, movePower: NumberHolder): boolean { if (moveType === this.moveType && movePower.value >= 1) { - (movePower as NumberHolder).value = Math.floor((movePower as NumberHolder).value * (1 + (this.getStackCount() * this.boostMultiplier))); + (movePower as NumberHolder).value = Math.floor( + (movePower as NumberHolder).value * (1 + this.getStackCount() * this.boostMultiplier), + ); return true; } @@ -1513,16 +1506,12 @@ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { return 1.2; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 99; } } export class SurviveDamageModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof SurviveDamageModifier; } @@ -1551,23 +1540,24 @@ export class SurviveDamageModifier extends PokemonHeldItemModifier { if (!surviveDamage.value && pokemon.randSeedInt(10) < this.getStackCount()) { surviveDamage.value = true; - pokemon.scene.queueMessage(i18next.t("modifier:surviveDamageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name })); + globalScene.queueMessage( + i18next.t("modifier:surviveDamageApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + ); return true; } return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 5; } } export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof BypassSpeedChanceModifier; } @@ -1595,11 +1585,17 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { override apply(pokemon: Pokemon, doBypassSpeed: BooleanHolder): boolean { if (!doBypassSpeed.value && pokemon.randSeedInt(10) < this.getStackCount()) { doBypassSpeed.value = true; - const isCommandFight = pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]?.command === Command.FIGHT; + const isCommandFight = + globalScene.currentBattle.turnCommands[pokemon.getBattlerIndex()]?.command === Command.FIGHT; const hasQuickClaw = this.type instanceof PokemonHeldItemModifierType && this.type.id === "QUICK_CLAW"; if (isCommandFight && hasQuickClaw) { - pokemon.scene.queueMessage(i18next.t("modifier:bypassSpeedChanceApply", { pokemonName: getPokemonNameWithAffix(pokemon), itemName: i18next.t("modifierType:ModifierType.QUICK_CLAW.name") })); + globalScene.queueMessage( + i18next.t("modifier:bypassSpeedChanceApply", { + pokemonName: getPokemonNameWithAffix(pokemon), + itemName: i18next.t("modifierType:ModifierType.QUICK_CLAW.name"), + }), + ); } return true; } @@ -1607,14 +1603,21 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 3; } } +/** + * 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) { @@ -1642,7 +1645,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; } @@ -1650,16 +1654,12 @@ export class FlinchChanceModifier extends PokemonHeldItemModifier { return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 3; } } export class TurnHealModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof TurnHealModifier; } @@ -1675,16 +1675,24 @@ export class TurnHealModifier extends PokemonHeldItemModifier { */ override apply(pokemon: Pokemon): boolean { if (!pokemon.isFullHp()) { - const scene = pokemon.scene; - scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - toDmgValue(pokemon.getMaxHp() / 16) * this.stackCount, i18next.t("modifier:turnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + toDmgValue(pokemon.getMaxHp() / 16) * this.stackCount, + i18next.t("modifier:turnHealApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + true, + ), + ); return true; } return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 4; } } @@ -1699,7 +1707,7 @@ export class TurnStatusEffectModifier extends PokemonHeldItemModifier { /** The status effect to be applied by the held item */ private effect: StatusEffect; - constructor (type: ModifierType, pokemonId: number, stackCount?: number) { + constructor(type: ModifierType, pokemonId: number, stackCount?: number) { super(type, pokemonId, stackCount); switch (type.id) { @@ -1739,7 +1747,7 @@ export class TurnStatusEffectModifier extends PokemonHeldItemModifier { return pokemon.trySetStatus(this.effect, true, undefined, undefined, this.type.name); } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } @@ -1749,10 +1757,6 @@ export class TurnStatusEffectModifier extends PokemonHeldItemModifier { } export class HitHealModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof HitHealModifier; } @@ -1767,25 +1771,29 @@ export class HitHealModifier extends PokemonHeldItemModifier { * @returns `true` if the {@linkcode Pokemon} was healed */ override apply(pokemon: Pokemon): boolean { - if (pokemon.turnData.damageDealt && !pokemon.isFullHp()) { - const scene = pokemon.scene; - scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - toDmgValue(pokemon.turnData.damageDealt / 8) * this.stackCount, i18next.t("modifier:hitHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); + if (pokemon.turnData.totalDamageDealt && !pokemon.isFullHp()) { + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + toDmgValue(pokemon.turnData.totalDamageDealt / 8) * this.stackCount, + i18next.t("modifier:hitHealApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + true, + ), + ); } return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 4; } } export class LevelIncrementBoosterModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier) { return modifier instanceof LevelIncrementBoosterModifier; } @@ -1814,7 +1822,7 @@ export class LevelIncrementBoosterModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene, forThreshold?: boolean): number { + getMaxStackCount(_forThreshold?: boolean): number { return 99; } } @@ -1858,7 +1866,7 @@ export class BerryModifier extends PokemonHeldItemModifier { */ override apply(pokemon: Pokemon): boolean { const preserve = new BooleanHolder(false); - pokemon.scene.applyModifiers(PreserveBerryModifier, pokemon.isPlayer(), pokemon, preserve); + globalScene.applyModifiers(PreserveBerryModifier, pokemon.isPlayer(), pokemon, preserve); getBerryEffectFunc(this.berryType)(pokemon); if (!preserve.value) { @@ -1868,8 +1876,8 @@ export class BerryModifier extends PokemonHeldItemModifier { return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { - if ([ BerryType.LUM, BerryType.LEPPA, BerryType.SITRUS, BerryType.ENIGMA ].includes(this.berryType)) { + getMaxHeldItemCount(_pokemon: Pokemon): number { + if ([BerryType.LUM, BerryType.LEPPA, BerryType.SITRUS, BerryType.ENIGMA].includes(this.berryType)) { return 2; } return 3; @@ -1877,10 +1885,6 @@ export class BerryModifier extends PokemonHeldItemModifier { } export class PreserveBerryModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier) { return modifier instanceof PreserveBerryModifier; } @@ -1913,16 +1917,12 @@ export class PreserveBerryModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 3; } } export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof PokemonInstantReviveModifier; } @@ -1937,14 +1937,33 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { * @returns always `true` */ override apply(pokemon: Pokemon): boolean { - pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - toDmgValue(pokemon.getMaxHp() / 2), i18next.t("modifier:pokemonInstantReviveApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), false, false, true)); + // Restore the Pokemon to half HP + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + toDmgValue(pokemon.getMaxHp() / 2), + i18next.t("modifier:pokemonInstantReviveApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + false, + false, + true, + ), + ); + // Remove the Pokemon's FAINT status pokemon.resetStatus(true, false, true); + + // Reapply Commander on the Pokemon's side of the field, if applicable + const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); + for (const p of field) { + applyAbAttrs(CommanderAbAttr, p, null, false); + } return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } } @@ -1956,10 +1975,6 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { * @see {@linkcode apply} */ export class ResetNegativeStatStageModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier) { return modifier instanceof ResetNegativeStatStageModifier; } @@ -1985,7 +2000,12 @@ export class ResetNegativeStatStageModifier extends PokemonHeldItemModifier { } if (statRestored) { - pokemon.scene.queueMessage(i18next.t("modifier:resetNegativeStatStageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name })); + globalScene.queueMessage( + i18next.t("modifier:resetNegativeStatStageApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }), + ); } return statRestored; } @@ -2019,10 +2039,45 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { * @param playerPokemon The {@linkcode PlayerPokemon} that consumes the item * @param args Additional arguments passed to {@linkcode ConsumablePokemonModifier.apply} */ - abstract override apply(playerPokemon: PlayerPokemon, ...args: unknown[]): boolean | Promise; + abstract override apply(playerPokemon: PlayerPokemon, ...args: unknown[]): boolean; - getPokemon(scene: BattleScene) { - return scene.getParty().find(p => p.id === this.pokemonId); + getPokemon() { + return globalScene.getPlayerParty().find(p => p.id === this.pokemonId); + } +} + +export class TerrastalizeModifier extends ConsumablePokemonModifier { + public override type: TerastallizeModifierType; + public teraType: PokemonType; + + constructor(type: TerastallizeModifierType, pokemonId: number, teraType: PokemonType) { + super(type, pokemonId); + + this.teraType = teraType; + } + + /** + * Checks if {@linkcode TerrastalizeModifier} should be applied + * @param playerPokemon The {@linkcode PlayerPokemon} that consumes the item + * @returns `true` if the {@linkcode TerrastalizeModifier} should be applied + */ + override shouldApply(playerPokemon?: PlayerPokemon): boolean { + return ( + super.shouldApply(playerPokemon) && + [playerPokemon?.species.speciesId, playerPokemon?.fusionSpecies?.speciesId].filter( + s => s === Species.TERAPAGOS || s === Species.OGERPON || s === Species.SHEDINJA, + ).length === 0 + ); + } + + /** + * Applies {@linkcode TerrastalizeModifier} + * @param pokemon The {@linkcode PlayerPokemon} that consumes the item + * @returns `true` if hp was restored + */ + override apply(pokemon: Pokemon): boolean { + pokemon.teraType = this.teraType; + return true; } } @@ -2032,7 +2087,14 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { private healStatus: boolean; public fainted: boolean; - constructor(type: ModifierType, pokemonId: number, restorePoints: number, restorePercent: number, healStatus: boolean, fainted?: boolean) { + constructor( + type: ModifierType, + pokemonId: number, + restorePoints: number, + restorePercent: number, + healStatus: boolean, + fainted?: boolean, + ) { super(type, pokemonId); this.restorePoints = restorePoints; @@ -2048,7 +2110,10 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { * @returns `true` if the {@linkcode PokemonHpRestoreModifier} should be applied */ override shouldApply(playerPokemon?: PlayerPokemon, multiplier?: number): boolean { - return super.shouldApply(playerPokemon) && (this.fainted || (!isNullOrUndefined(multiplier) && typeof(multiplier) === "number")); + return ( + super.shouldApply(playerPokemon) && + (this.fainted || (!isNullOrUndefined(multiplier) && typeof multiplier === "number")) + ); } /** @@ -2066,7 +2131,11 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { if (this.fainted || this.healStatus) { pokemon.resetStatus(true, true); } - pokemon.hp = Math.min(pokemon.hp + Math.max(Math.ceil(Math.max(Math.floor((this.restorePercent * 0.01) * pokemon.getMaxHp()), restorePoints)), 1), pokemon.getMaxHp()); + pokemon.hp = Math.min( + pokemon.hp + + Math.max(Math.ceil(Math.max(Math.floor(this.restorePercent * 0.01 * pokemon.getMaxHp()), restorePoints)), 1), + pokemon.getMaxHp(), + ); return true; } return false; @@ -2074,10 +2143,6 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { } export class PokemonStatusHealModifier extends ConsumablePokemonModifier { - constructor(type: ModifierType, pokemonId: number) { - super(type, pokemonId); - } - /** * Applies {@linkcode PokemonStatusHealModifier} * @param playerPokemon The {@linkcode PlayerPokemon} that gets healed from the status @@ -2166,7 +2231,7 @@ export class PokemonPpUpModifier extends ConsumablePokemonMoveModifier { override apply(playerPokemon: PlayerPokemon): boolean { const move = playerPokemon.getMoveset()[this.moveIndex]; - if (move) { + if (move && !move.maxPpOverride) { move.ppUp = Math.min(move.ppUp + this.upPoints, 3); } @@ -2189,24 +2254,14 @@ export class PokemonNatureChangeModifier extends ConsumablePokemonModifier { * @returns */ override apply(playerPokemon: PlayerPokemon): boolean { - playerPokemon.customPokemonData.nature = this.nature; - let speciesId = playerPokemon.species.speciesId; - playerPokemon.scene.gameData.dexData[speciesId].natureAttr |= 1 << (this.nature + 1); - - while (pokemonPrevolutions.hasOwnProperty(speciesId)) { - speciesId = pokemonPrevolutions[speciesId]; - playerPokemon.scene.gameData.dexData[speciesId].natureAttr |= 1 << (this.nature + 1); - } + playerPokemon.setCustomNature(this.nature); + globalScene.gameData.unlockSpeciesNature(playerPokemon.species, this.nature); return true; } } export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier { - constructor(type: ModifierType, pokemonId: number) { - super(type, pokemonId); - } - /** * Applies {@linkcode PokemonLevelIncrementModifier} * @param playerPokemon The {@linkcode PlayerPokemon} that should get levels incremented @@ -2214,17 +2269,23 @@ export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier { * @returns always `true` */ override apply(playerPokemon: PlayerPokemon, levelCount: NumberHolder = new NumberHolder(1)): boolean { - playerPokemon.scene.applyModifiers(LevelIncrementBoosterModifier, true, levelCount); + globalScene.applyModifiers(LevelIncrementBoosterModifier, true, levelCount); playerPokemon.level += levelCount.value; - if (playerPokemon.level <= playerPokemon.scene.getMaxExpLevel(true)) { + if (playerPokemon.level <= globalScene.getMaxExpLevel(true)) { playerPokemon.exp = getLevelTotalExp(playerPokemon.level, playerPokemon.species.growthRate); playerPokemon.levelExp = 0; } playerPokemon.addFriendship(FRIENDSHIP_GAIN_FROM_RARE_CANDY); - playerPokemon.scene.unshiftPhase(new LevelUpPhase(playerPokemon.scene, playerPokemon.scene.getParty().indexOf(playerPokemon), playerPokemon.level - levelCount.value, playerPokemon.level)); + globalScene.unshiftPhase( + new LevelUpPhase( + globalScene.getPlayerParty().indexOf(playerPokemon), + playerPokemon.level - levelCount.value, + playerPokemon.level, + ), + ); return true; } @@ -2233,18 +2294,15 @@ export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier { export class TmModifier extends ConsumablePokemonModifier { public override type: TmModifierType; - constructor(type: TmModifierType, pokemonId: number) { - super(type, pokemonId); - } - /** * Applies {@linkcode TmModifier} * @param playerPokemon The {@linkcode PlayerPokemon} that should learn the TM * @returns always `true` */ override apply(playerPokemon: PlayerPokemon): boolean { - - playerPokemon.scene.unshiftPhase(new LearnMovePhase(playerPokemon.scene, playerPokemon.scene.getParty().indexOf(playerPokemon), this.type.moveId, LearnMoveType.TM)); + globalScene.unshiftPhase( + new LearnMovePhase(globalScene.getPlayerParty().indexOf(playerPokemon), this.type.moveId, LearnMoveType.TM), + ); return true; } @@ -2265,8 +2323,14 @@ export class RememberMoveModifier extends ConsumablePokemonModifier { * @returns always `true` */ override apply(playerPokemon: PlayerPokemon, cost?: number): boolean { - - playerPokemon.scene.unshiftPhase(new LearnMovePhase(playerPokemon.scene, playerPokemon.scene.getParty().indexOf(playerPokemon), playerPokemon.getLearnableLevelMoves()[this.levelMoveIndex], LearnMoveType.MEMORY, cost)); + globalScene.unshiftPhase( + new LearnMovePhase( + globalScene.getPlayerParty().indexOf(playerPokemon), + playerPokemon.getLearnableLevelMoves()[this.levelMoveIndex], + LearnMoveType.MEMORY, + cost, + ), + ); return true; } @@ -2274,11 +2338,6 @@ export class RememberMoveModifier extends ConsumablePokemonModifier { export class EvolutionItemModifier extends ConsumablePokemonModifier { public override type: EvolutionItemModifierType; - - constructor(type: EvolutionItemModifierType, pokemonId: number) { - super(type, pokemonId); - } - /** * Applies {@linkcode EvolutionItemModifier} * @param playerPokemon The {@linkcode PlayerPokemon} that should evolve via item @@ -2286,22 +2345,28 @@ export class EvolutionItemModifier extends ConsumablePokemonModifier { */ override apply(playerPokemon: PlayerPokemon): boolean { let matchingEvolution = pokemonEvolutions.hasOwnProperty(playerPokemon.species.speciesId) - ? pokemonEvolutions[playerPokemon.species.speciesId].find(e => e.item === this.type.evolutionItem - && (e.evoFormKey === null || (e.preFormKey || "") === playerPokemon.getFormKey()) - && (!e.condition || e.condition.predicate(playerPokemon))) + ? pokemonEvolutions[playerPokemon.species.speciesId].find( + e => + e.item === this.type.evolutionItem && + (e.evoFormKey === null || (e.preFormKey || "") === playerPokemon.getFormKey()) && + (!e.condition || e.condition.predicate(playerPokemon)), + ) : null; if (!matchingEvolution && playerPokemon.isFusion()) { - matchingEvolution = pokemonEvolutions[playerPokemon.fusionSpecies!.speciesId].find(e => e.item === this.type.evolutionItem // TODO: is the bang correct? - && (e.evoFormKey === null || (e.preFormKey || "") === playerPokemon.getFusionFormKey()) - && (!e.condition || e.condition.predicate(playerPokemon))); + matchingEvolution = pokemonEvolutions[playerPokemon.fusionSpecies!.speciesId].find( + e => + e.item === this.type.evolutionItem && // TODO: is the bang correct? + (e.evoFormKey === null || (e.preFormKey || "") === playerPokemon.getFusionFormKey()) && + (!e.condition || e.condition.predicate(playerPokemon)), + ); if (matchingEvolution) { matchingEvolution = new FusionSpeciesFormEvolution(playerPokemon.species.speciesId, matchingEvolution); } } if (matchingEvolution) { - playerPokemon.scene.unshiftPhase(new EvolutionPhase(playerPokemon.scene, playerPokemon, matchingEvolution, playerPokemon.level - 1)); + globalScene.unshiftPhase(new EvolutionPhase(playerPokemon, matchingEvolution, playerPokemon.level - 1)); return true; } @@ -2325,7 +2390,9 @@ export class FusePokemonModifier extends ConsumablePokemonModifier { * @returns `true` if {@linkcode FusePokemonModifier} should be applied */ override shouldApply(playerPokemon?: PlayerPokemon, playerPokemon2?: PlayerPokemon): boolean { - return super.shouldApply(playerPokemon, playerPokemon2) && !!playerPokemon2 && this.fusePokemonId === playerPokemon2.id; + return ( + super.shouldApply(playerPokemon, playerPokemon2) && !!playerPokemon2 && this.fusePokemonId === playerPokemon2.id + ); } /** @@ -2334,17 +2401,13 @@ export class FusePokemonModifier extends ConsumablePokemonModifier { * @param playerPokemon2 {@linkcode PlayerPokemon} that should be fused with {@linkcode playerPokemon} * @returns always Promise */ - override async apply(playerPokemon: PlayerPokemon, playerPokemon2: PlayerPokemon): Promise { - await playerPokemon.fuse(playerPokemon2); + override apply(playerPokemon: PlayerPokemon, playerPokemon2: PlayerPokemon): boolean { + playerPokemon.fuse(playerPokemon2); return true; } } export class MultipleParticipantExpBonusModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof MultipleParticipantExpBonusModifier; } @@ -2361,7 +2424,7 @@ export class MultipleParticipantExpBonusModifier extends PersistentModifier { return new MultipleParticipantExpBonusModifier(this.type, this.stackCount); } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 5; } } @@ -2384,7 +2447,7 @@ export class HealingBoosterModifier extends PersistentModifier { } getArgs(): any[] { - return [ this.multiplier ]; + return [this.multiplier]; } /** @@ -2393,12 +2456,12 @@ export class HealingBoosterModifier extends PersistentModifier { * @returns always `true` */ override apply(healingMultiplier: NumberHolder): boolean { - healingMultiplier.value *= 1 + ((this.multiplier - 1) * this.getStackCount()); + healingMultiplier.value *= 1 + (this.multiplier - 1) * this.getStackCount(); return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 5; } } @@ -2425,7 +2488,7 @@ export class ExpBoosterModifier extends PersistentModifier { } getArgs(): any[] { - return [ this.boostMultiplier * 100 ]; + return [this.boostMultiplier * 100]; } /** @@ -2434,13 +2497,13 @@ export class ExpBoosterModifier extends PersistentModifier { * @returns always `true` */ override apply(boost: NumberHolder): boolean { - boost.value = Math.floor(boost.value * (1 + (this.getStackCount() * this.boostMultiplier))); + boost.value = Math.floor(boost.value * (1 + this.getStackCount() * this.boostMultiplier)); return true; } - getMaxStackCount(scene: BattleScene, forThreshold?: boolean): number { - return this.boostMultiplier < 1 ? this.boostMultiplier < 0.6 ? 99 : 30 : 10; + getMaxStackCount(_forThreshold?: boolean): number { + return this.boostMultiplier < 1 ? (this.boostMultiplier < 0.6 ? 99 : 30) : 10; } } @@ -2487,21 +2550,17 @@ export class PokemonExpBoosterModifier extends PokemonHeldItemModifier { * @returns always `true` */ override apply(_pokemon: Pokemon, boost: NumberHolder): boolean { - boost.value = Math.floor(boost.value * (1 + (this.getStackCount() * this.boostMultiplier))); + boost.value = Math.floor(boost.value * (1 + this.getStackCount() * this.boostMultiplier)); return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 99; } } export class ExpShareModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof ExpShareModifier; } @@ -2518,16 +2577,12 @@ export class ExpShareModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 5; } } export class ExpBalanceModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof ExpBalanceModifier; } @@ -2544,7 +2599,7 @@ export class ExpBalanceModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 4; } } @@ -2552,10 +2607,6 @@ export class ExpBalanceModifier extends PersistentModifier { export class PokemonFriendshipBoosterModifier extends PokemonHeldItemModifier { public override type: PokemonFriendshipBoosterModifierType; - constructor(type: PokemonFriendshipBoosterModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof PokemonFriendshipBoosterModifier; } @@ -2576,16 +2627,12 @@ export class PokemonFriendshipBoosterModifier extends PokemonHeldItemModifier { return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 3; } } export class PokemonNatureWeightModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof PokemonNatureWeightModifier; } @@ -2609,7 +2656,7 @@ export class PokemonNatureWeightModifier extends PokemonHeldItemModifier { return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 10; } } @@ -2661,7 +2708,7 @@ export class PokemonMoveAccuracyBoosterModifier extends PokemonHeldItemModifier return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 3; } } @@ -2669,10 +2716,6 @@ export class PokemonMoveAccuracyBoosterModifier extends PokemonHeldItemModifier export class PokemonMultiHitModifier extends PokemonHeldItemModifier { public override type: PokemonMultiHitModifierType; - constructor(type: PokemonMultiHitModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof PokemonMultiHitModifier; } @@ -2682,32 +2725,71 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { } /** - * Applies {@linkcode PokemonMultiHitModifier} - * @param _pokemon The {@linkcode Pokemon} using the move - * @param count {@linkcode NumberHolder} holding the number of items - * @param power {@linkcode NumberHolder} holding the power of the move + * For each stack, converts 25 percent of attack damage into an additional strike. + * @param pokemon The {@linkcode Pokemon} using the move + * @param moveId The {@linkcode Moves | identifier} for the move being used + * @param count {@linkcode NumberHolder} holding the move's hit count for this turn + * @param damageMultiplier {@linkcode NumberHolder} holding a damage multiplier applied to a strike of this move * @returns always `true` */ - override apply(_pokemon: Pokemon, count: NumberHolder, power: NumberHolder): boolean { - count.value *= (this.getStackCount() + 1); - - switch (this.getStackCount()) { - case 1: - power.value *= 0.4; - break; - case 2: - power.value *= 0.25; - break; - case 3: - power.value *= 0.175; - break; + override apply( + pokemon: Pokemon, + moveId: Moves, + count: NumberHolder | null = null, + damageMultiplier: NumberHolder | null = null, + ): boolean { + const move = allMoves[moveId]; + /** + * The move must meet Parental Bond's restrictions for this item + * to apply. This means + * - Only attacks are boosted + * - Multi-strike moves, charge moves, and self-sacrificial moves are not boosted + * (though Multi-Lens can still affect moves boosted by Parental Bond) + * - Multi-target moves are not boosted *unless* they can only hit a single Pokemon + * - Fling, Uproar, Rollout, Ice Ball, and Endeavor are not boosted + */ + if (!move.canBeMultiStrikeEnhanced(pokemon)) { + return false; } + if (!isNullOrUndefined(count)) { + return this.applyHitCountBoost(count); + } + if (!isNullOrUndefined(damageMultiplier)) { + return this.applyDamageModifier(pokemon, damageMultiplier); + } + + return false; + } + + /** Adds strikes to a move equal to the number of stacked Multi-Lenses */ + private applyHitCountBoost(count: NumberHolder): boolean { + count.value += this.getStackCount(); return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { - return 3; + /** + * If applied to the first hit of a move, sets the damage multiplier + * equal to (1 - the number of stacked Multi-Lenses). + * Additional strikes beyond that are given a 0.25x damage multiplier + */ + private applyDamageModifier(pokemon: Pokemon, damageMultiplier: NumberHolder): boolean { + if (pokemon.turnData.hitsLeft === pokemon.turnData.hitCount) { + // Reduce first hit by 25% for each stack count + damageMultiplier.value *= 1 - 0.25 * this.getStackCount(); + return true; + } + if (pokemon.turnData.hitCount - pokemon.turnData.hitsLeft !== this.getStackCount() + 1) { + // Deal 25% damage for each remaining Multi Lens hit + damageMultiplier.value *= 0.25; + return true; + } + // An extra hit not caused by Multi Lens -- assume it is Parental Bond + return false; + } + + getMaxHeldItemCount(_pokemon: Pokemon): number { + return 2; } } @@ -2715,9 +2797,15 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { public override type: FormChangeItemModifierType; public formChangeItem: FormChangeItem; public active: boolean; - public isTransferable: boolean = false; + public isTransferable = false; - constructor(type: FormChangeItemModifierType, pokemonId: number, formChangeItem: FormChangeItem, active: boolean, stackCount?: number) { + constructor( + type: FormChangeItemModifierType, + pokemonId: number, + formChangeItem: FormChangeItem, + active: boolean, + stackCount?: number, + ) { super(type, pokemonId, stackCount); this.formChangeItem = formChangeItem; this.active = active; @@ -2728,7 +2816,13 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { } clone(): PersistentModifier { - return new PokemonFormChangeItemModifier(this.type, this.pokemonId, this.formChangeItem, this.active, this.stackCount); + return new PokemonFormChangeItemModifier( + this.type, + this.pokemonId, + this.formChangeItem, + this.active, + this.stackCount, + ); } getArgs(): any[] { @@ -2748,7 +2842,7 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { this.active = false; } - const ret = pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger); + const ret = globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger); if (switchActive) { this.active = true; @@ -2757,7 +2851,7 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { return ret; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } } @@ -2773,21 +2867,24 @@ export class MoneyRewardModifier extends ConsumableModifier { /** * Applies {@linkcode MoneyRewardModifier} - * @param battleScene The current {@linkcode BattleScene} * @returns always `true` */ - override apply(battleScene: BattleScene): boolean { - const moneyAmount = new NumberHolder(battleScene.getWaveMoneyAmount(this.moneyMultiplier)); + override apply(): boolean { + const moneyAmount = new NumberHolder(globalScene.getWaveMoneyAmount(this.moneyMultiplier)); - battleScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); - battleScene.addMoney(moneyAmount.value); + globalScene.addMoney(moneyAmount.value); - battleScene.getParty().map(p => { + globalScene.getPlayerParty().map(p => { if (p.species?.speciesId === Species.GIMMIGHOUL || p.fusionSpecies?.speciesId === Species.GIMMIGHOUL) { - p.evoCounter ? p.evoCounter++ : p.evoCounter = 1; - const modifier = getModifierType(modifierTypes.EVOLUTION_TRACKER_GIMMIGHOUL).newModifier(p) as EvoTrackerModifier; - battleScene.addModifier(modifier); + p.evoCounter + ? (p.evoCounter += Math.min(Math.floor(this.moneyMultiplier), 3)) + : (p.evoCounter = Math.min(Math.floor(this.moneyMultiplier), 3)); + const modifier = getModifierType(modifierTypes.EVOLUTION_TRACKER_GIMMIGHOUL).newModifier( + p, + ) as EvoTrackerModifier; + globalScene.addModifier(modifier); } }); @@ -2796,10 +2893,6 @@ export class MoneyRewardModifier extends ConsumableModifier { } export class MoneyMultiplierModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof MoneyMultiplierModifier; } @@ -2819,16 +2912,12 @@ export class MoneyMultiplierModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 5; } } export class DamageMoneyRewardModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof DamageMoneyRewardModifier; } @@ -2843,42 +2932,39 @@ export class DamageMoneyRewardModifier extends PokemonHeldItemModifier { * @param multiplier {@linkcode NumberHolder} holding the multiplier value * @returns always `true` */ - override apply(pokemon: Pokemon, multiplier: NumberHolder): boolean { - const battleScene = pokemon.scene; + override apply(_pokemon: Pokemon, multiplier: NumberHolder): boolean { const moneyAmount = new NumberHolder(Math.floor(multiplier.value * (0.5 * this.getStackCount()))); - battleScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); - battleScene.addMoney(moneyAmount.value); + globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + globalScene.addMoney(moneyAmount.value); return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 5; } } export class MoneyInterestModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof MoneyInterestModifier; } /** * Applies {@linkcode MoneyInterestModifier} - * @param battleScene The current {@linkcode BattleScene} * @returns always `true` */ - override apply(battleScene: BattleScene): boolean { - const interestAmount = Math.floor(battleScene.money * 0.1 * this.getStackCount()); - battleScene.addMoney(interestAmount); + override apply(): boolean { + const interestAmount = Math.floor(globalScene.money * 0.1 * this.getStackCount()); + globalScene.addMoney(interestAmount); const userLocale = navigator.language || "en-US"; const formattedMoneyAmount = interestAmount.toLocaleString(userLocale); - const message = i18next.t("modifier:moneyInterestApply", { moneyAmount: formattedMoneyAmount, typeName: this.type.name }); - battleScene.queueMessage(message, undefined, true); + const message = i18next.t("modifier:moneyInterestApply", { + moneyAmount: formattedMoneyAmount, + typeName: this.type.name, + }); + globalScene.queueMessage(message, undefined, true); return true; } @@ -2887,16 +2973,12 @@ export class MoneyInterestModifier extends PersistentModifier { return new MoneyInterestModifier(this.type, this.stackCount); } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 5; } } export class HiddenAbilityRateBoosterModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof HiddenAbilityRateBoosterModifier; } @@ -2916,16 +2998,12 @@ export class HiddenAbilityRateBoosterModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 4; } } export class ShinyRateBoosterModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof ShinyRateBoosterModifier; } @@ -2945,16 +3023,40 @@ export class ShinyRateBoosterModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 4; } } -export class LockModifierTiersModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); +export class CriticalCatchChanceBoosterModifier extends PersistentModifier { + match(modifier: Modifier): boolean { + return modifier instanceof CriticalCatchChanceBoosterModifier; } + clone(): CriticalCatchChanceBoosterModifier { + return new CriticalCatchChanceBoosterModifier(this.type, this.stackCount); + } + + /** + * Applies {@linkcode CriticalCatchChanceBoosterModifier} + * @param boost {@linkcode NumberHolder} holding the boost value + * @returns always `true` + */ + override apply(boost: NumberHolder): boolean { + // 1 stack: 2x + // 2 stack: 2.5x + // 3 stack: 3x + boost.value *= 1.5 + this.getStackCount() / 2; + + return true; + } + + getMaxStackCount(): number { + return 3; + } +} + +export class LockModifierTiersModifier extends PersistentModifier { match(modifier: Modifier): boolean { return modifier instanceof LockModifierTiersModifier; } @@ -2971,7 +3073,7 @@ export class LockModifierTiersModifier extends PersistentModifier { return new LockModifierTiersModifier(this.type, this.stackCount); } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 1; } } @@ -3011,16 +3113,12 @@ export class HealShopCostModifier extends PersistentModifier { return super.getArgs().concat(this.shopMultiplier); } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 1; } } export class BoostBugSpawnModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof BoostBugSpawnModifier; } @@ -3037,16 +3135,12 @@ export class BoostBugSpawnModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 1; } } export class SwitchEffectTransferModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - matchType(modifier: Modifier): boolean { return modifier instanceof SwitchEffectTransferModifier; } @@ -3063,7 +3157,7 @@ export class SwitchEffectTransferModifier extends PokemonHeldItemModifier { return true; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } } @@ -3074,10 +3168,6 @@ export class SwitchEffectTransferModifier extends PokemonHeldItemModifier { * @see {@linkcode ContactHeldItemTransferChanceModifier} */ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } - /** * Determines the targets to transfer items from when this applies. * @param pokemon the {@linkcode Pokemon} holding this item @@ -3085,9 +3175,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { * @returns the opponents of the source {@linkcode Pokemon} */ getTargets(pokemon?: Pokemon, ..._args: unknown[]): Pokemon[] { - return pokemon instanceof Pokemon - ? pokemon.getOpponents() - : []; + return pokemon instanceof Pokemon ? pokemon.getOpponents() : []; } /** @@ -3112,16 +3200,22 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { return false; } - const poolType = pokemon.isPlayer() ? ModifierPoolType.PLAYER : pokemon.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; + const poolType = pokemon.isPlayer() + ? ModifierPoolType.PLAYER + : pokemon.hasTrainer() + ? ModifierPoolType.TRAINER + : ModifierPoolType.WILD; const transferredModifierTypes: ModifierType[] = []; - const itemModifiers = pokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === targetPokemon.id && m.isTransferable, targetPokemon.isPlayer()) as PokemonHeldItemModifier[]; - let highestItemTier = itemModifiers.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is this bang correct? + const itemModifiers = globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === targetPokemon.id && m.isTransferable, + targetPokemon.isPlayer(), + ) as PokemonHeldItemModifier[]; + let highestItemTier = itemModifiers + .map(m => m.type.getOrInferTier(poolType)) + .reduce((highestTier, tier) => Math.max(tier!, highestTier), 0); // TODO: is this bang correct? let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - const heldItemTransferPromises: Promise[] = []; - for (let i = 0; i < transferredItemCount; i++) { if (!tierItemModifiers.length) { while (highestItemTier-- && !tierItemModifiers.length) { @@ -3133,19 +3227,15 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { } const randItemIndex = pokemon.randSeedInt(itemModifiers.length); const randItem = itemModifiers[randItemIndex]; - heldItemTransferPromises.push(pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, false).then(success => { - if (success) { - transferredModifierTypes.push(randItem.type); - itemModifiers.splice(randItemIndex, 1); - } - })); + if (globalScene.tryTransferHeldItemModifier(randItem, pokemon, false)) { + transferredModifierTypes.push(randItem.type); + itemModifiers.splice(randItemIndex, 1); + } } - Promise.all(heldItemTransferPromises).then(() => { - for (const mt of transferredModifierTypes) { - pokemon.scene.queueMessage(this.getTransferMessage(pokemon, targetPokemon, mt)); - } - }); + for (const mt of transferredModifierTypes) { + globalScene.queueMessage(this.getTransferMessage(pokemon, targetPokemon, mt)); + } return !!transferredModifierTypes.length; } @@ -3161,10 +3251,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { * @see {@linkcode modifierTypes[MINI_BLACK_HOLE]} */ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { - isTransferable: boolean = true; - constructor(type: ModifierType, pokemonId: number, stackCount?: number) { - super(type, pokemonId, stackCount); - } + isTransferable = true; matchType(modifier: Modifier): boolean { return modifier instanceof TurnHeldItemTransferModifier; @@ -3179,10 +3266,15 @@ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { } getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierType): string { - return i18next.t("modifier:turnHeldItemTransferApply", { pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), itemName: item.name, pokemonName: pokemon.getNameToRender(), typeName: this.type.name }); + return i18next.t("modifier:turnHeldItemTransferApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), + itemName: item.name, + pokemonName: pokemon.getNameToRender(), + typeName: this.type.name, + }); } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 1; } @@ -3213,7 +3305,7 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif * @returns The target {@linkcode Pokemon} as array for further use in `apply` implementations */ override getTargets(_holderPokemon: Pokemon, targetPokemon: Pokemon): Pokemon[] { - return !!targetPokemon ? [ targetPokemon ] : []; + return targetPokemon ? [targetPokemon] : []; } matchType(modifier: Modifier): boolean { @@ -3229,21 +3321,26 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif } getTransferredItemCount(): number { - return Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount()) ? 1 : 0; + return Phaser.Math.RND.realInRange(0, 1) < this.chance * this.getStackCount() ? 1 : 0; } getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierType): string { - return i18next.t("modifier:contactHeldItemTransferApply", { pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), itemName: item.name, pokemonName: getPokemonNameWithAffix(pokemon), typeName: this.type.name }); + return i18next.t("modifier:contactHeldItemTransferApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(targetPokemon), + itemName: item.name, + pokemonName: getPokemonNameWithAffix(pokemon), + typeName: this.type.name, + }); } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 5; } } export class IvScannerModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); + constructor(type: ModifierType, _stackCount?: number) { + super(type); } match(modifier: Modifier): boolean { @@ -3251,7 +3348,7 @@ export class IvScannerModifier extends PersistentModifier { } clone(): IvScannerModifier { - return new IvScannerModifier(this.type, this.stackCount); + return new IvScannerModifier(this.type); } /** @@ -3259,19 +3356,15 @@ export class IvScannerModifier extends PersistentModifier { * @returns always `true` */ override apply(): boolean { - return true; + return true; //Dude are you kidding me } - getMaxStackCount(scene: BattleScene): number { - return 3; + getMaxStackCount(): number { + return 1; } } export class ExtraModifierModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - match(modifier: Modifier): boolean { return modifier instanceof ExtraModifierModifier; } @@ -3291,7 +3384,7 @@ export class ExtraModifierModifier extends PersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 3; } } @@ -3302,27 +3395,22 @@ export class ExtraModifierModifier extends PersistentModifier { * @see {@linkcode apply} */ export class TempExtraModifierModifier extends LapsingPersistentModifier { - constructor(type: ModifierType, maxBattles: number, battleCount?: number, stackCount?: number) { - super(type, maxBattles, battleCount, stackCount); - } - /** * Goes through existing modifiers for any that match Silver Pokeball, * which will then add the max count of the new item to the existing count of the current item. * If no existing Silver Pokeballs are found, will add a new one. * @param modifiers {@linkcode PersistentModifier} array of the player's modifiers * @param _virtual N/A - * @param scene * @returns true if the modifier was successfully added or applied, false otherwise */ - add(modifiers: PersistentModifier[], _virtual: boolean, scene: BattleScene): boolean { + add(modifiers: PersistentModifier[], _virtual: boolean): boolean { for (const modifier of modifiers) { if (this.match(modifier)) { const modifierInstance = modifier as TempExtraModifierModifier; const newBattleCount = this.getMaxBattles() + modifierInstance.getBattleCount(); modifierInstance.setNewBattleCount(newBattleCount); - scene.playSound("se/restore"); + globalScene.playSound("se/restore"); return true; } } @@ -3336,7 +3424,7 @@ export class TempExtraModifierModifier extends LapsingPersistentModifier { } match(modifier: Modifier): boolean { - return (modifier instanceof TempExtraModifierModifier); + return modifier instanceof TempExtraModifierModifier; } /** @@ -3351,11 +3439,7 @@ export class TempExtraModifierModifier extends LapsingPersistentModifier { } export abstract class EnemyPersistentModifier extends PersistentModifier { - constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); - } - - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 5; } } @@ -3375,18 +3459,18 @@ abstract class EnemyDamageMultiplierModifier extends EnemyPersistentModifier { * @returns always `true` */ override apply(multiplier: NumberHolder): boolean { - multiplier.value = Math.floor(multiplier.value * Math.pow(this.damageMultiplier, this.getStackCount())); + multiplier.value = toDmgValue(multiplier.value * Math.pow(this.damageMultiplier, this.getStackCount())); return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 99; } } export class EnemyDamageBoosterModifier extends EnemyDamageMultiplierModifier { - constructor(type: ModifierType, boostPercent: number, stackCount?: number) { + constructor(type: ModifierType, _boostPercent: number, stackCount?: number) { //super(type, 1 + ((boostPercent || 10) * 0.01), stackCount); super(type, 1.05, stackCount); // Hardcode multiplier temporarily } @@ -3400,16 +3484,16 @@ export class EnemyDamageBoosterModifier extends EnemyDamageMultiplierModifier { } getArgs(): any[] { - return [ (this.damageMultiplier - 1) * 100 ]; + return [(this.damageMultiplier - 1) * 100]; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 999; } } export class EnemyDamageReducerModifier extends EnemyDamageMultiplierModifier { - constructor(type: ModifierType, reductionPercent: number, stackCount?: number) { + constructor(type: ModifierType, _reductionPercent: number, stackCount?: number) { //super(type, 1 - ((reductionPercent || 5) * 0.01), stackCount); super(type, 0.975, stackCount); // Hardcode multiplier temporarily } @@ -3423,18 +3507,18 @@ export class EnemyDamageReducerModifier extends EnemyDamageMultiplierModifier { } getArgs(): any[] { - return [ (1 - this.damageMultiplier) * 100 ]; + return [(1 - this.damageMultiplier) * 100]; } - getMaxStackCount(scene: BattleScene): number { - return scene.currentBattle.waveIndex < 2000 ? super.getMaxStackCount(scene) : 999; + getMaxStackCount(): number { + return globalScene.currentBattle.waveIndex < 2000 ? super.getMaxStackCount() : 999; } } export class EnemyTurnHealModifier extends EnemyPersistentModifier { public healPercent: number; - constructor(type: ModifierType, healPercent: number, stackCount?: number) { + constructor(type: ModifierType, _healPercent: number, stackCount?: number) { super(type, stackCount); // Hardcode temporarily @@ -3450,7 +3534,7 @@ export class EnemyTurnHealModifier extends EnemyPersistentModifier { } getArgs(): any[] { - return [ this.healPercent ]; + return [this.healPercent]; } /** @@ -3460,16 +3544,27 @@ export class EnemyTurnHealModifier extends EnemyPersistentModifier { */ override apply(enemyPokemon: Pokemon): boolean { if (!enemyPokemon.isFullHp()) { - const scene = enemyPokemon.scene; - scene.unshiftPhase(new PokemonHealPhase(scene, enemyPokemon.getBattlerIndex(), - Math.max(Math.floor(enemyPokemon.getMaxHp() / (100 / this.healPercent)) * this.stackCount, 1), i18next.t("modifier:enemyTurnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(enemyPokemon) }), true, false, false, false, true)); + globalScene.unshiftPhase( + new PokemonHealPhase( + enemyPokemon.getBattlerIndex(), + Math.max(Math.floor(enemyPokemon.getMaxHp() / (100 / this.healPercent)) * this.stackCount, 1), + i18next.t("modifier:enemyTurnHealApply", { + pokemonNameWithAffix: getPokemonNameWithAffix(enemyPokemon), + }), + true, + false, + false, + false, + true, + ), + ); return true; } return false; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 10; } } @@ -3478,12 +3573,12 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi public effect: StatusEffect; public chance: number; - constructor(type: ModifierType, effect: StatusEffect, chancePercent: number, stackCount?: number) { + constructor(type: ModifierType, effect: StatusEffect, _chancePercent: number, stackCount?: number) { super(type, stackCount); this.effect = effect; //Hardcode temporarily - this.chance = .025 * ((this.effect === StatusEffect.BURN || this.effect === StatusEffect.POISON) ? 2 : 1); + this.chance = 0.025 * (this.effect === StatusEffect.BURN || this.effect === StatusEffect.POISON ? 2 : 1); } match(modifier: Modifier): boolean { @@ -3495,7 +3590,7 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi } getArgs(): any[] { - return [ this.effect, this.chance * 100 ]; + return [this.effect, this.chance * 100]; } /** @@ -3504,14 +3599,14 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi * @returns `true` if the {@linkcode Pokemon} was affected */ override apply(enemyPokemon: Pokemon): boolean { - if (Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount())) { + if (Phaser.Math.RND.realInRange(0, 1) < this.chance * this.getStackCount()) { return enemyPokemon.trySetStatus(this.effect, true); } return false; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 10; } } @@ -3519,11 +3614,11 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier { public chance: number; - constructor(type: ModifierType, chancePercent: number, stackCount?: number) { + constructor(type: ModifierType, _chancePercent: number, stackCount?: number) { super(type, stackCount); //Hardcode temporarily - this.chance = .025; + this.chance = 0.025; } match(modifier: Modifier): boolean { @@ -3535,7 +3630,7 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier } getArgs(): any[] { - return [ this.chance * 100 ]; + return [this.chance * 100]; } /** @@ -3544,8 +3639,10 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier * @returns `true` if the {@linkcode Pokemon} was healed */ override apply(enemyPokemon: Pokemon): boolean { - if (enemyPokemon.status && Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount())) { - enemyPokemon.scene.queueMessage(getStatusEffectHealText(enemyPokemon.status.effect, getPokemonNameWithAffix(enemyPokemon))); + if (enemyPokemon.status && Phaser.Math.RND.realInRange(0, 1) < this.chance * this.getStackCount()) { + globalScene.queueMessage( + getStatusEffectHealText(enemyPokemon.status.effect, getPokemonNameWithAffix(enemyPokemon)), + ); enemyPokemon.resetStatus(); enemyPokemon.updateInfo(); return true; @@ -3554,7 +3651,7 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier return false; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 10; } } @@ -3562,11 +3659,11 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier export class EnemyEndureChanceModifier extends EnemyPersistentModifier { public chance: number; - constructor(type: ModifierType, chancePercent?: number, stackCount?: number) { + constructor(type: ModifierType, _chancePercent?: number, stackCount?: number) { super(type, stackCount || 10); //Hardcode temporarily - this.chance = .02; + this.chance = 2; } match(modifier: Modifier) { @@ -3574,31 +3671,31 @@ export class EnemyEndureChanceModifier extends EnemyPersistentModifier { } clone() { - return new EnemyEndureChanceModifier(this.type, this.chance * 100, this.stackCount); + return new EnemyEndureChanceModifier(this.type, this.chance, this.stackCount); } getArgs(): any[] { - return [ this.chance * 100 ]; + return [this.chance]; } /** - * Applies {@linkcode EnemyEndureChanceModifier} - * @param target {@linkcode Pokemon} to apply the {@linkcode BattlerTagType.ENDURING} chance to + * Applies a chance of enduring a lethal hit of an attack + * @param target the {@linkcode Pokemon} to apply the {@linkcode BattlerTagType.ENDURING} chance to * @returns `true` if {@linkcode Pokemon} endured */ override apply(target: Pokemon): boolean { - if (target.battleData.endured || Phaser.Math.RND.realInRange(0, 1) >= (this.chance * this.getStackCount())) { + if (target.battleData.endured || target.randSeedInt(100) >= this.chance * this.getStackCount()) { return false; } - target.addTag(BattlerTagType.ENDURING, 1); + target.addTag(BattlerTagType.ENDURE_TOKEN, 1); target.battleData.endured = true; return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 10; } } @@ -3621,7 +3718,7 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { } getArgs(): any[] { - return [ this.chance * 100 ]; + return [this.chance * 100]; } /** @@ -3630,7 +3727,7 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { * @returns `true` if the {@linkcode EnemyPokemon} is a fusion */ override apply(isFusion: BooleanHolder): boolean { - if (Phaser.Math.RND.realInRange(0, 1) >= (this.chance * this.getStackCount())) { + if (Phaser.Math.RND.realInRange(0, 1) >= this.chance * this.getStackCount()) { return false; } @@ -3639,7 +3736,7 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { return true; } - getMaxStackCount(scene: BattleScene): number { + getMaxStackCount(): number { return 10; } } @@ -3648,79 +3745,82 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { * Uses either `MODIFIER_OVERRIDE` in overrides.ts to set {@linkcode PersistentModifier}s for either: * - The player * - The enemy - * @param scene current {@linkcode BattleScene} * @param isPlayer {@linkcode boolean} for whether the player (`true`) or enemy (`false`) is being overridden */ -export function overrideModifiers(scene: BattleScene, isPlayer: boolean = true): void { - const modifiersOverride: ModifierOverride[] = isPlayer ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE; - if (!modifiersOverride || modifiersOverride.length === 0 || !scene) { +export function overrideModifiers(isPlayer = true): void { + const modifiersOverride: ModifierOverride[] = isPlayer + ? Overrides.STARTING_MODIFIER_OVERRIDE + : Overrides.OPP_MODIFIER_OVERRIDE; + if (!modifiersOverride || modifiersOverride.length === 0 || !globalScene) { return; } // If it's the opponent, clear all of their current modifiers to avoid stacking if (!isPlayer) { - scene.clearEnemyModifiers(); + globalScene.clearEnemyModifiers(); } - modifiersOverride.forEach(item => { + for (const item of modifiersOverride) { const modifierFunc = modifierTypes[item.name]; let modifierType: ModifierType | null = modifierFunc(); if (modifierType instanceof ModifierTypeGenerator) { - const pregenArgs = ("type" in item) && (item.type !== null) ? [ item.type ] : undefined; + const pregenArgs = "type" in item && item.type !== null ? [item.type] : undefined; modifierType = modifierType.generateType([], pregenArgs); } - const modifier = modifierType && modifierType.withIdFromFunc(modifierFunc).newModifier() as PersistentModifier; + const modifier = modifierType && (modifierType.withIdFromFunc(modifierFunc).newModifier() as PersistentModifier); if (modifier) { modifier.stackCount = item.count || 1; if (isPlayer) { - scene.addModifier(modifier, true, false, false, true); + globalScene.addModifier(modifier, true, false, false, true); } else { - scene.addEnemyModifier(modifier, true, true); + globalScene.addEnemyModifier(modifier, true, true); } } - }); + } } /** * Uses either `HELD_ITEMS_OVERRIDE` in overrides.ts to set {@linkcode PokemonHeldItemModifier}s for either: * - The first member of the player's team when starting a new game * - An enemy {@linkcode Pokemon} being spawned in - * @param scene current {@linkcode BattleScene} * @param pokemon {@linkcode Pokemon} whose held items are being overridden * @param isPlayer {@linkcode boolean} for whether the {@linkcode pokemon} is the player's (`true`) or an enemy (`false`) */ -export function overrideHeldItems(scene: BattleScene, pokemon: Pokemon, isPlayer: boolean = true): void { - const heldItemsOverride: ModifierOverride[] = isPlayer ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE; - if (!heldItemsOverride || heldItemsOverride.length === 0 || !scene) { +export function overrideHeldItems(pokemon: Pokemon, isPlayer = true): void { + const heldItemsOverride: ModifierOverride[] = isPlayer + ? Overrides.STARTING_HELD_ITEMS_OVERRIDE + : Overrides.OPP_HELD_ITEMS_OVERRIDE; + if (!heldItemsOverride || heldItemsOverride.length === 0 || !globalScene) { return; } if (!isPlayer) { - scene.clearEnemyHeldItemModifiers(pokemon); + globalScene.clearEnemyHeldItemModifiers(pokemon); } - heldItemsOverride.forEach(item => { + for (const item of heldItemsOverride) { const modifierFunc = modifierTypes[item.name]; let modifierType: ModifierType | null = modifierFunc(); const qty = item.count || 1; if (modifierType instanceof ModifierTypeGenerator) { - const pregenArgs = ("type" in item) && (item.type !== null) ? [ item.type ] : undefined; + const pregenArgs = "type" in item && item.type !== null ? [item.type] : undefined; modifierType = modifierType.generateType([], pregenArgs); } - const heldItemModifier = modifierType && modifierType.withIdFromFunc(modifierFunc).newModifier(pokemon) as PokemonHeldItemModifier; + const heldItemModifier = + modifierType && (modifierType.withIdFromFunc(modifierFunc).newModifier(pokemon) as PokemonHeldItemModifier); if (heldItemModifier) { heldItemModifier.pokemonId = pokemon.id; heldItemModifier.stackCount = qty; if (isPlayer) { - scene.addModifier(heldItemModifier, true, false, false, true); + globalScene.addModifier(heldItemModifier, true, false, false, true); } else { - scene.addEnemyModifier(heldItemModifier, true, true); + globalScene.addEnemyModifier(heldItemModifier, true, true); } } - }); + } } diff --git a/src/overrides.ts b/src/overrides.ts index 6760db79205..882a634ff90 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -1,27 +1,37 @@ +import { type PokeballCounts } from "#app/battle-scene"; +import { EvolutionItem } from "#app/data/balance/pokemon-evolutions"; +import { Gender } from "#app/data/gender"; +import { FormChangeItem } from "#app/data/pokemon-forms"; +import { Variant } from "#app/data/variant"; +import { type ModifierOverride } from "#app/modifier/modifier-type"; +import { Unlockables } from "#app/system/unlockables"; import { Abilities } from "#enums/abilities"; +import { BerryType } from "#enums/berry-type"; import { Biome } from "#enums/biome"; import { EggTier } from "#enums/egg-type"; import { Moves } from "#enums/moves"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PokeballType } from "#enums/pokeball"; +import { PokemonType } from "#enums/pokemon-type"; import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; import { TimeOfDay } from "#enums/time-of-day"; import { VariantTier } from "#enums/variant-tier"; import { WeatherType } from "#enums/weather-type"; -import { type PokeballCounts } from "./battle-scene"; -import { Gender } from "./data/gender"; -import { Variant } from "./data/variant"; -import { type ModifierOverride } from "./modifier/modifier-type"; -import { Unlockables } from "./system/unlockables"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +/** + * This comment block exists to prevent IDEs from automatically removing unused imports + * {@linkcode BerryType}, {@linkcode EvolutionItem}, {@linkcode FormChangeItem} + * {@linkcode Stat}, {@linkcode PokemonType} + */ /** * Overrides that are using when testing different in game situations * * Any override added here will be used instead of the value in {@linkcode DefaultOverrides} * - * If an override name starts with "STARTING", it will apply when a new run begins + * If an override name starts with "STARTING", it will only apply when a new run begins. * * @example * ``` @@ -38,7 +48,7 @@ const overrides = {} satisfies Partial>; * --- * Defaults for Overrides that are used when testing different in game situations * - * If an override name starts with "STARTING", it will apply when a new run begins + * If an override name starts with "STARTING", it will only apply when a new run begins. */ class DefaultOverrides { // ----------------- @@ -46,13 +56,28 @@ class DefaultOverrides { // ----------------- /** a specific seed (default: a random string of 24 characters) */ readonly SEED_OVERRIDE: string = ""; + readonly DAILY_RUN_SEED_OVERRIDE: string | null = null; readonly WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; - readonly BATTLE_TYPE_OVERRIDE: "double" | "single" | null = null; + /** + * If `null`, ignore this override. + * + * If `"single"`, set every non-trainer battle to be a single battle. + * + * If `"double"`, set every battle (including trainer battles) to be a double battle. + * + * If `"even-doubles"`, follow the `"double"` rule on even wave numbers, and follow the `"single"` rule on odd wave numbers. + * + * If `"odd-doubles"`, follow the `"double"` rule on odd wave numbers, and follow the `"single"` rule on even wave numbers. + */ + readonly BATTLE_TYPE_OVERRIDE: BattleStyle | null = null; readonly STARTING_WAVE_OVERRIDE: number = 0; readonly STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null; - /** Multiplies XP gained by this value including 0. Set to null to ignore the override */ + /** Multiplies XP gained by this value including 0. Set to null to ignore the override. */ readonly XP_MULTIPLIER_OVERRIDE: number | null = null; + /** Sets the level cap to this number during experience gain calculations. Set to `0` to disable override & use normal wave-based level caps, + or any negative number to set it to 9 quadrillion (effectively disabling it). */ + readonly LEVEL_CAP_OVERRIDE: number = 0; readonly NEVER_CRIT_OVERRIDE: boolean = false; /** default 1000 */ readonly STARTING_MONEY_OVERRIDE: number = 0; @@ -75,6 +100,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; @@ -109,9 +136,10 @@ class DefaultOverrides { /** * This will override the species of the fusion */ - readonly STARTER_FUSION_SPECIES_OVERRIDE: Species | integer = 0; + readonly STARTER_FUSION_SPECIES_OVERRIDE: Species | number = 0; readonly ABILITY_OVERRIDE: Abilities = Abilities.NONE; readonly PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly HAS_PASSIVE_ABILITY_OVERRIDE: boolean | null = null; readonly STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; readonly GENDER_OVERRIDE: Gender | null = null; readonly MOVESET_OVERRIDE: Moves | Array = []; @@ -129,10 +157,11 @@ class DefaultOverrides { /** * This will override the species of the fusion only when the opponent is already a fusion */ - readonly OPP_FUSION_SPECIES_OVERRIDE: Species | integer = 0; + readonly OPP_FUSION_SPECIES_OVERRIDE: Species | number = 0; readonly OPP_LEVEL_OVERRIDE: number = 0; readonly OPP_ABILITY_OVERRIDE: Abilities = Abilities.NONE; readonly OPP_PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly OPP_HAS_PASSIVE_ABILITY_OVERRIDE: boolean | null = null; readonly OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; readonly OPP_GENDER_OVERRIDE: Gender | null = null; readonly OPP_MOVESET_OVERRIDE: Moves | Array = []; @@ -164,7 +193,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; @@ -229,3 +262,5 @@ export default { ...defaultOverrides, ...overrides } satisfies InstanceType; + +export type BattleStyle = "double" | "single" | "even-doubles" | "odd-doubles"; diff --git a/src/phase.ts b/src/phase.ts index 5cf91f2c478..20cc7cc4063 100644 --- a/src/phase.ts +++ b/src/phase.ts @@ -1,19 +1,9 @@ -import BattleScene from "./battle-scene"; +import { globalScene } from "#app/global-scene"; export class Phase { - protected scene: BattleScene; - - constructor(scene: BattleScene) { - this.scene = scene; - } - - start() { - if (this.scene.abilityBar.shown) { - this.scene.abilityBar.resetAutoHideTimer(); - } - } + start() {} end() { - this.scene.shiftPhase(); + globalScene.shiftPhase(); } } diff --git a/src/phases/add-enemy-buff-modifier-phase.ts b/src/phases/add-enemy-buff-modifier-phase.ts index 451e6e2662c..7d91e64382a 100644 --- a/src/phases/add-enemy-buff-modifier-phase.ts +++ b/src/phases/add-enemy-buff-modifier-phase.ts @@ -1,26 +1,42 @@ -import BattleScene from "#app/battle-scene"; import { ModifierTier } from "#app/modifier/modifier-tier"; -import { regenerateModifierPoolThresholds, ModifierPoolType, getEnemyBuffModifierForWave } from "#app/modifier/modifier-type"; +import { + regenerateModifierPoolThresholds, + ModifierPoolType, + getEnemyBuffModifierForWave, +} from "#app/modifier/modifier-type"; import { EnemyPersistentModifier } from "#app/modifier/modifier"; import { Phase } from "#app/phase"; +import { globalScene } from "#app/global-scene"; export class AddEnemyBuffModifierPhase extends Phase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start() { super.start(); - const waveIndex = this.scene.currentBattle.waveIndex; - const tier = !(waveIndex % 1000) ? ModifierTier.ULTRA : !(waveIndex % 250) ? ModifierTier.GREAT : ModifierTier.COMMON; + const waveIndex = globalScene.currentBattle.waveIndex; + const tier = !(waveIndex % 1000) + ? ModifierTier.ULTRA + : !(waveIndex % 250) + ? ModifierTier.GREAT + : ModifierTier.COMMON; - regenerateModifierPoolThresholds(this.scene.getEnemyParty(), ModifierPoolType.ENEMY_BUFF); + regenerateModifierPoolThresholds(globalScene.getEnemyParty(), ModifierPoolType.ENEMY_BUFF); const count = Math.ceil(waveIndex / 250); for (let i = 0; i < count; i++) { - this.scene.addEnemyModifier(getEnemyBuffModifierForWave(tier, this.scene.findModifiers(m => m instanceof EnemyPersistentModifier, false), this.scene), true, true); + globalScene.addEnemyModifier( + getEnemyBuffModifierForWave( + tier, + globalScene.findModifiers(m => m instanceof EnemyPersistentModifier, false), + ), + true, + true, + ); } - this.scene.updateModifiers(false, true).then(() => this.end()); + globalScene.updateModifiers(false, true); + this.end(); } } diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts index 3e46fc792f0..6b905c2a07f 100644 --- a/src/phases/attempt-capture-phase.ts +++ b/src/phases/attempt-capture-phase.ts @@ -1,29 +1,37 @@ -import BattleScene from "#app/battle-scene"; import { BattlerIndex } from "#app/battle"; -import { getPokeballCatchMultiplier, getPokeballAtlasKey, getPokeballTintColor, doPokeballBounceAnim } from "#app/data/pokeball"; +import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; +import { SubstituteTag } from "#app/data/battler-tags"; +import { + doPokeballBounceAnim, + getPokeballAtlasKey, + getPokeballCatchMultiplier, + getPokeballTintColor, + getCriticalCaptureChance, +} from "#app/data/pokeball"; import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; -import { PokeballType } from "#app/enums/pokeball"; -import { StatusEffect } from "#app/enums/status-effect"; -import { addPokeballOpenParticles, addPokeballCaptureStars } from "#app/field/anims"; -import { EnemyPokemon } from "#app/field/pokemon"; +import { addPokeballCaptureStars, addPokeballOpenParticles } from "#app/field/anims"; +import type { EnemyPokemon } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { PokemonPhase } from "#app/phases/pokemon-phase"; +import { VictoryPhase } from "#app/phases/victory-phase"; import { achvs } from "#app/system/achv"; -import { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; +import type { PartyOption } from "#app/ui/party-ui-handler"; +import { PartyUiMode } from "#app/ui/party-ui-handler"; import { SummaryUiMode } from "#app/ui/summary-ui-handler"; import { Mode } from "#app/ui/ui"; +import type { PokeballType } from "#enums/pokeball"; +import { StatusEffect } from "#enums/status-effect"; import i18next from "i18next"; -import { PokemonPhase } from "./pokemon-phase"; -import { VictoryPhase } from "./victory-phase"; -import { SubstituteTag } from "#app/data/battler-tags"; +import { globalScene } from "#app/global-scene"; export class AttemptCapturePhase extends PokemonPhase { private pokeballType: PokeballType; private pokeball: Phaser.GameObjects.Sprite; private originalY: number; - constructor(scene: BattleScene, targetIndex: integer, pokeballType: PokeballType) { - super(scene, BattlerIndex.ENEMY + targetIndex); + constructor(targetIndex: number, pokeballType: PokeballType) { + super(BattlerIndex.ENEMY + targetIndex); this.pokeballType = pokeballType; } @@ -42,7 +50,7 @@ export class AttemptCapturePhase extends PokemonPhase { substitute.sprite.setVisible(false); } - this.scene.pokeballCounts[this.pokeballType]--; + globalScene.pokeballCounts[this.pokeballType]--; this.originalY = pokemon.y; @@ -51,58 +59,65 @@ export class AttemptCapturePhase extends PokemonPhase { const catchRate = pokemon.species.catchRate; const pokeballMultiplier = getPokeballCatchMultiplier(this.pokeballType); const statusMultiplier = pokemon.status ? getStatusEffectCatchRateMultiplier(pokemon.status.effect) : 1; - const x = Math.round((((_3m - _2h) * catchRate * pokeballMultiplier) / _3m) * statusMultiplier); - const y = Math.round(65536 / Math.sqrt(Math.sqrt(255 / x))); + const modifiedCatchRate = Math.round((((_3m - _2h) * catchRate * pokeballMultiplier) / _3m) * statusMultiplier); + const shakeProbability = Math.round(65536 / Math.pow(255 / modifiedCatchRate, 0.1875)); // Formula taken from gen 6 + const criticalCaptureChance = getCriticalCaptureChance(modifiedCatchRate); + const isCritical = pokemon.randSeedInt(256) < criticalCaptureChance; const fpOffset = pokemon.getFieldPositionOffset(); const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType); - this.pokeball = this.scene.addFieldSprite(16, 80, "pb", pokeballAtlasKey); + this.pokeball = globalScene.addFieldSprite(16, 80, "pb", pokeballAtlasKey); this.pokeball.setOrigin(0.5, 0.625); - this.scene.field.add(this.pokeball); + globalScene.field.add(this.pokeball); - this.scene.playSound("se/pb_throw"); - this.scene.time.delayedCall(300, () => { - this.scene.field.moveBelow(this.pokeball as Phaser.GameObjects.GameObject, pokemon); + globalScene.playSound(isCritical ? "se/crit_throw" : "se/pb_throw"); + globalScene.time.delayedCall(300, () => { + globalScene.field.moveBelow(this.pokeball as Phaser.GameObjects.GameObject, pokemon); }); - this.scene.tweens.add({ + globalScene.tweens.add({ + // Throw animation targets: this.pokeball, x: { value: 236 + fpOffset[0], ease: "Linear" }, y: { value: 16 + fpOffset[1], ease: "Cubic.easeOut" }, duration: 500, onComplete: () => { + // Ball opens this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); - this.scene.playSound("se/pb_rel"); + globalScene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + globalScene.playSound("se/pb_rel"); pokemon.tint(getPokeballTintColor(this.pokeballType)); - addPokeballOpenParticles(this.scene, this.pokeball.x, this.pokeball.y, this.pokeballType); + addPokeballOpenParticles(this.pokeball.x, this.pokeball.y, this.pokeballType); - this.scene.tweens.add({ + globalScene.tweens.add({ + // Mon enters ball targets: pokemon, duration: 500, ease: "Sine.easeIn", scale: 0.25, y: 20, onComplete: () => { + // Ball closes this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); pokemon.setVisible(false); - this.scene.playSound("se/pb_catch"); - this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}`)); + globalScene.playSound("se/pb_catch"); + globalScene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}`)); const doShake = () => { + // After the overall catch rate check, the game does 3 shake checks before confirming the catch. let shakeCount = 0; const pbX = this.pokeball.x; - const shakeCounter = this.scene.tweens.addCounter({ + const shakeCounter = globalScene.tweens.addCounter({ from: 0, to: 1, - repeat: 4, + repeat: isCritical ? 2 : 4, // Critical captures only perform 1 shake check yoyo: true, ease: "Cubic.easeOut", duration: 250, repeatDelay: 500, onUpdate: t => { - if (shakeCount && shakeCount < 4) { + if (shakeCount && shakeCount < (isCritical ? 2 : 4)) { const value = t.getValue(); const directionMultiplier = shakeCount % 2 === 1 ? 1 : -1; this.pokeball.setX(pbX + value * 4 * directionMultiplier); @@ -113,56 +128,69 @@ export class AttemptCapturePhase extends PokemonPhase { if (!pokemon.species.isObtainable()) { shakeCounter.stop(); this.failCatch(shakeCount); - } else if (shakeCount++ < 3) { - if (pokeballMultiplier === -1 || pokemon.randSeedInt(65536) < y) { - this.scene.playSound("se/pb_move"); + } else if (shakeCount++ < (isCritical ? 1 : 3)) { + // Shake check (skip check for critical or guaranteed captures, but still play the sound) + if ( + pokeballMultiplier === -1 || + isCritical || + modifiedCatchRate >= 255 || + pokemon.randSeedInt(65536) < shakeProbability + ) { + globalScene.playSound("se/pb_move"); } else { shakeCounter.stop(); this.failCatch(shakeCount); } + } else if (isCritical && pokemon.randSeedInt(65536) >= shakeProbability) { + // Above, perform the one shake check for critical captures after the ball shakes once + shakeCounter.stop(); + this.failCatch(shakeCount); } else { - this.scene.playSound("se/pb_lock"); - addPokeballCaptureStars(this.scene, this.pokeball); + globalScene.playSound("se/pb_lock"); + addPokeballCaptureStars(this.pokeball); - const pbTint = this.scene.add.sprite(this.pokeball.x, this.pokeball.y, "pb", "pb"); + const pbTint = globalScene.add.sprite(this.pokeball.x, this.pokeball.y, "pb", "pb"); pbTint.setOrigin(this.pokeball.originX, this.pokeball.originY); pbTint.setTintFill(0); pbTint.setAlpha(0); - this.scene.field.add(pbTint); - this.scene.tweens.add({ + globalScene.field.add(pbTint); + globalScene.tweens.add({ targets: pbTint, alpha: 0.375, duration: 200, easing: "Sine.easeOut", onComplete: () => { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pbTint, alpha: 0, duration: 200, easing: "Sine.easeIn", - onComplete: () => pbTint.destroy() + onComplete: () => pbTint.destroy(), }); - } + }, }); } }, onComplete: () => { this.catch(); - } + }, }); }; - this.scene.time.delayedCall(250, () => doPokeballBounceAnim(this.scene, this.pokeball, 16, 72, 350, doShake)); - } + // Ball bounces (handled in pokemon.ts) + globalScene.time.delayedCall(250, () => + doPokeballBounceAnim(this.pokeball, 16, 72, 350, doShake, isCritical), + ); + }, }); - } + }, }); } - failCatch(shakeCount: integer) { + failCatch(_shakeCount: number) { const pokemon = this.getPokemon(); - this.scene.playSound("se/pb_rel"); + globalScene.playSound("se/pb_rel"); pokemon.setY(this.originalY); if (pokemon.status?.effect !== StatusEffect.SLEEP) { pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); @@ -178,16 +206,16 @@ export class AttemptCapturePhase extends PokemonPhase { const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType); this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + globalScene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pokemon, duration: 250, ease: "Sine.easeOut", - scale: 1 + scale: 1, }); - this.scene.currentBattle.lastUsedPokeball = this.pokeballType; + globalScene.currentBattle.lastUsedPokeball = this.pokeballType; this.removePb(); this.end(); } @@ -197,103 +225,148 @@ export class AttemptCapturePhase extends PokemonPhase { const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); - if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { - this.scene.validateAchv(achvs.HIDDEN_ABILITY); + if ( + speciesForm.abilityHidden && + (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1 + ) { + globalScene.validateAchv(achvs.HIDDEN_ABILITY); } if (pokemon.species.subLegendary) { - this.scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + globalScene.validateAchv(achvs.CATCH_SUB_LEGENDARY); } if (pokemon.species.legendary) { - this.scene.validateAchv(achvs.CATCH_LEGENDARY); + globalScene.validateAchv(achvs.CATCH_LEGENDARY); } if (pokemon.species.mythical) { - this.scene.validateAchv(achvs.CATCH_MYTHICAL); + globalScene.validateAchv(achvs.CATCH_MYTHICAL); } - this.scene.pokemonInfoContainer.show(pokemon, true); + globalScene.pokemonInfoContainer.show(pokemon, true); - this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); + globalScene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); - this.scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { - const end = () => { - this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); - this.scene.pokemonInfoContainer.hide(); - this.removePb(); - this.end(); - }; - const removePokemon = () => { - this.scene.addFaintedEnemyScore(pokemon); - this.scene.getPlayerField().filter(p => p.isActive(true)).forEach(playerPokemon => playerPokemon.removeTagsBySourceId(pokemon.id)); - pokemon.hp = 0; - pokemon.trySetStatus(StatusEffect.FAINT); - this.scene.clearEnemyHeldItemModifiers(); - this.scene.field.remove(pokemon, true); - }; - const addToParty = (slotIndex?: number) => { - const newPokemon = pokemon.addToParty(this.pokeballType, slotIndex); - const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); - if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { - this.scene.validateAchv(achvs.SHINY_PARTY); - } - Promise.all(modifiers.map(m => this.scene.addModifier(m, true))).then(() => { - this.scene.updateModifiers(true); - removePokemon(); - if (newPokemon) { - newPokemon.loadAssets().then(end); + globalScene.ui.showText( + i18next.t("battle:pokemonCaught", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + null, + () => { + const end = () => { + globalScene.unshiftPhase(new VictoryPhase(this.battlerIndex)); + globalScene.pokemonInfoContainer.hide(); + this.removePb(); + this.end(); + }; + const removePokemon = () => { + globalScene.addFaintedEnemyScore(pokemon); + pokemon.hp = 0; + pokemon.trySetStatus(StatusEffect.FAINT); + globalScene.clearEnemyHeldItemModifiers(); + pokemon.leaveField(true, true, true); + }; + const addToParty = (slotIndex?: number) => { + const newPokemon = pokemon.addToParty(this.pokeballType, slotIndex); + const modifiers = globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); + if (globalScene.getPlayerParty().filter(p => p.isShiny()).length === PLAYER_PARTY_MAX_SIZE) { + globalScene.validateAchv(achvs.SHINY_PARTY); + } + Promise.all(modifiers.map(m => globalScene.addModifier(m, true))).then(() => { + globalScene.updateModifiers(true); + removePokemon(); + if (newPokemon) { + newPokemon.loadAssets().then(end); + } else { + end(); + } + }); + }; + Promise.all([pokemon.hideInfo(), globalScene.gameData.setPokemonCaught(pokemon)]).then(() => { + if (globalScene.getPlayerParty().length === PLAYER_PARTY_MAX_SIZE) { + const promptRelease = () => { + globalScene.ui.showText( + i18next.t("battle:partyFull", { + pokemonName: pokemon.getNameToRender(), + }), + null, + () => { + globalScene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + const newPokemon = globalScene.addPlayerPokemon( + pokemon.species, + pokemon.level, + pokemon.abilityIndex, + pokemon.formIndex, + pokemon.gender, + pokemon.shiny, + pokemon.variant, + pokemon.ivs, + pokemon.nature, + pokemon, + ); + globalScene.ui.setMode( + Mode.SUMMARY, + newPokemon, + 0, + SummaryUiMode.DEFAULT, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + promptRelease(); + }); + }, + false, + ); + }, + () => { + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.RELEASE, + this.fieldIndex, + (slotIndex: number, _option: PartyOption) => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + if (slotIndex < 6) { + addToParty(slotIndex); + } else { + promptRelease(); + } + }); + }, + ); + }, + () => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { + removePokemon(); + end(); + }); + }, + "fullParty", + ); + }, + ); + }; + promptRelease(); } else { - end(); + addToParty(); } }); - }; - Promise.all([ pokemon.hideInfo(), this.scene.gameData.setPokemonCaught(pokemon) ]).then(() => { - if (this.scene.getParty().length === 6) { - const promptRelease = () => { - this.scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.getNameToRender() }), null, () => { - this.scene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); - this.scene.ui.setMode(Mode.CONFIRM, () => { - const newPokemon = this.scene.addPlayerPokemon(pokemon.species, pokemon.level, pokemon.abilityIndex, pokemon.formIndex, pokemon.gender, pokemon.shiny, pokemon.variant, pokemon.ivs, pokemon.nature, pokemon); - this.scene.ui.setMode(Mode.SUMMARY, newPokemon, 0, SummaryUiMode.DEFAULT, () => { - this.scene.ui.setMode(Mode.MESSAGE).then(() => { - promptRelease(); - }); - }, false); - }, () => { - this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => { - this.scene.ui.setMode(Mode.MESSAGE).then(() => { - if (slotIndex < 6) { - addToParty(slotIndex); - } else { - promptRelease(); - } - }); - }); - }, () => { - this.scene.ui.setMode(Mode.MESSAGE).then(() => { - removePokemon(); - end(); - }); - }, "fullParty"); - }); - }; - promptRelease(); - } else { - addToParty(); - } - }); - }, 0, true); + }, + 0, + true, + ); } removePb() { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pokeball, duration: 250, delay: 250, ease: "Sine.easeIn", alpha: 0, - onComplete: () => this.pokeball.destroy() + onComplete: () => this.pokeball.destroy(), }); } } diff --git a/src/phases/attempt-run-phase.ts b/src/phases/attempt-run-phase.ts index e0dd7fa72fd..c9c0e23dabb 100644 --- a/src/phases/attempt-run-phase.ts +++ b/src/phases/attempt-run-phase.ts @@ -1,24 +1,24 @@ -import BattleScene from "#app/battle-scene"; import { applyAbAttrs, RunSuccessAbAttr } from "#app/data/ability"; import { Stat } from "#app/enums/stat"; import { StatusEffect } from "#app/enums/status-effect"; -import Pokemon, { PlayerPokemon, EnemyPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon, EnemyPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import i18next from "i18next"; import * as Utils from "#app/utils"; import { BattleEndPhase } from "./battle-end-phase"; import { NewBattlePhase } from "./new-battle-phase"; import { PokemonPhase } from "./pokemon-phase"; +import { globalScene } from "#app/global-scene"; export class AttemptRunPhase extends PokemonPhase { - constructor(scene: BattleScene, fieldIndex: number) { - super(scene, fieldIndex); - } + /** For testing purposes: this is to force the pokemon to fail and escape */ + public forceFailEscape = false; start() { super.start(); - const playerField = this.scene.getPlayerField(); - const enemyField = this.scene.getEnemyField(); + const playerField = globalScene.getPlayerField(); + const enemyField = globalScene.getEnemyField(); const playerPokemon = this.getPokemon(); @@ -28,30 +28,34 @@ export class AttemptRunPhase extends PokemonPhase { applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, false, escapeChance); - if (playerPokemon.randSeedInt(100) < escapeChance.value) { - this.scene.playSound("se/flee"); - this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); + if (playerPokemon.randSeedInt(100) < escapeChance.value && !this.forceFailEscape) { + globalScene.playSound("se/flee"); + globalScene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); - this.scene.tweens.add({ - targets: [ this.scene.arenaEnemy, enemyField ].flat(), + globalScene.tweens.add({ + targets: [globalScene.arenaEnemy, enemyField].flat(), alpha: 0, duration: 250, ease: "Sine.easeIn", - onComplete: () => enemyField.forEach(enemyPokemon => enemyPokemon.destroy()) + onComplete: () => + // biome-ignore lint/complexity/noForEach: TODO + enemyField.forEach(enemyPokemon => enemyPokemon.destroy()), }); - this.scene.clearEnemyHeldItemModifiers(); + globalScene.clearEnemyHeldItemModifiers(); + // biome-ignore lint/complexity/noForEach: TODO enemyField.forEach(enemyPokemon => { enemyPokemon.hideInfo().then(() => enemyPokemon.destroy()); enemyPokemon.hp = 0; enemyPokemon.trySetStatus(StatusEffect.FAINT); }); - this.scene.pushPhase(new BattleEndPhase(this.scene)); - this.scene.pushPhase(new NewBattlePhase(this.scene)); + globalScene.pushPhase(new BattleEndPhase(false)); + globalScene.pushPhase(new NewBattlePhase()); } else { - this.scene.queueMessage(i18next.t("battle:runAwayCannotEscape"), null, true, 500); + playerPokemon.turnData.failedRunAway = true; + globalScene.queueMessage(i18next.t("battle:runAwayCannotEscape"), null, true, 500); } this.end(); @@ -59,9 +63,15 @@ export class AttemptRunPhase extends PokemonPhase { attemptRunAway(playerField: PlayerPokemon[], enemyField: EnemyPokemon[], escapeChance: Utils.NumberHolder) { /** Sum of the speed of all enemy pokemon on the field */ - const enemySpeed = enemyField.reduce((total: number, enemyPokemon: Pokemon) => total + enemyPokemon.getStat(Stat.SPD), 0); + const enemySpeed = enemyField.reduce( + (total: number, enemyPokemon: Pokemon) => total + enemyPokemon.getStat(Stat.SPD), + 0, + ); /** Sum of the speed of all player pokemon on the field */ - const playerSpeed = playerField.reduce((total: number, playerPokemon: Pokemon) => total + playerPokemon.getStat(Stat.SPD), 0); + const playerSpeed = playerField.reduce( + (total: number, playerPokemon: Pokemon) => total + playerPokemon.getStat(Stat.SPD), + 0, + ); /* The way the escape chance works is by looking at the difference between your speed and the enemy field's average speed as a ratio. The higher this ratio, the higher your chance of success. * However, there is a cap for the ratio of your speed vs enemy speed which beyond that point, you won't gain any advantage. It also looks at how many times you've tried to escape. @@ -98,6 +108,10 @@ export class AttemptRunPhase extends PokemonPhase { const escapeSlope = (maxChance - minChance) / speedCap; // This will calculate the escape chance given all of the above and clamp it to the range of [`minChance`, `maxChance`] - escapeChance.value = Phaser.Math.Clamp(Math.round((escapeSlope * speedRatio) + minChance + (escapeBonus * this.scene.currentBattle.escapeAttempts++)), minChance, maxChance); + escapeChance.value = Phaser.Math.Clamp( + Math.round(escapeSlope * speedRatio + minChance + escapeBonus * globalScene.currentBattle.escapeAttempts++), + minChance, + maxChance, + ); } } diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts index bae61aa2288..a7158264ab7 100644 --- a/src/phases/battle-end-phase.ts +++ b/src/phases/battle-end-phase.ts @@ -1,15 +1,15 @@ +import { globalScene } from "#app/global-scene"; import { applyPostBattleAbAttrs, PostBattleAbAttr } from "#app/data/ability"; import { LapsingPersistentModifier, LapsingPokemonHeldItemModifier } from "#app/modifier/modifier"; import { BattlePhase } from "./battle-phase"; import { GameOverPhase } from "./game-over-phase"; -import BattleScene from "#app/battle-scene"; export class BattleEndPhase extends BattlePhase { /** If true, will increment battles won */ isVictory: boolean; - constructor(scene: BattleScene, isVictory: boolean = true) { - super(scene); + constructor(isVictory: boolean) { + super(); this.isVictory = isVictory; } @@ -17,51 +17,58 @@ export class BattleEndPhase extends BattlePhase { start() { super.start(); - if (this.isVictory) { - this.scene.currentBattle.addBattleScore(this.scene); + globalScene.gameData.gameStats.battles++; + if ( + globalScene.gameMode.isEndless && + globalScene.currentBattle.waveIndex + 1 > globalScene.gameData.gameStats.highestEndlessWave + ) { + globalScene.gameData.gameStats.highestEndlessWave = globalScene.currentBattle.waveIndex + 1; + } - 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; + if (this.isVictory) { + globalScene.currentBattle.addBattleScore(); + + if (globalScene.currentBattle.trainer) { + globalScene.gameData.gameStats.trainersDefeated++; } } // Endless graceful end - if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex >= 5850) { - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new GameOverPhase(this.scene, true)); + if (globalScene.gameMode.isEndless && globalScene.currentBattle.waveIndex >= 5850) { + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new GameOverPhase(true)); } - for (const pokemon of this.scene.getField()) { - if (pokemon && pokemon.battleSummonData) { + for (const pokemon of globalScene.getField()) { + if (pokemon?.battleSummonData) { pokemon.battleSummonData.waveTurnCount = 1; } } - for (const pokemon of this.scene.getParty().filter(p => p.isAllowedInBattle())) { - applyPostBattleAbAttrs(PostBattleAbAttr, pokemon); + for (const pokemon of globalScene.getPokemonAllowedInBattle()) { + applyPostBattleAbAttrs(PostBattleAbAttr, pokemon, false, this.isVictory); } - if (this.scene.currentBattle.moneyScattered) { - this.scene.currentBattle.pickUpScatteredMoney(this.scene); + if (globalScene.currentBattle.moneyScattered) { + globalScene.currentBattle.pickUpScatteredMoney(); } - this.scene.clearEnemyHeldItemModifiers(); + globalScene.clearEnemyHeldItemModifiers(); - const lapsingModifiers = this.scene.findModifiers(m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[]; + const lapsingModifiers = globalScene.findModifiers( + m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier, + ) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[]; for (const m of lapsingModifiers) { const args: any[] = []; if (m instanceof LapsingPokemonHeldItemModifier) { - args.push(this.scene.getPokemonById(m.pokemonId)); + args.push(globalScene.getPokemonById(m.pokemonId)); } if (!m.lapse(...args)) { - this.scene.removeModifier(m); + globalScene.removeModifier(m); } } - this.scene.updateModifiers().then(() => this.end()); + globalScene.updateModifiers(); + this.end(); } } diff --git a/src/phases/battle-phase.ts b/src/phases/battle-phase.ts index 11807fdc714..3fc2b9c0467 100644 --- a/src/phases/battle-phase.ts +++ b/src/phases/battle-phase.ts @@ -1,18 +1,18 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { TrainerSlot } from "#app/data/trainer-config"; import { Phase } from "#app/phase"; export class BattlePhase extends Phase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } showEnemyTrainer(trainerSlot: TrainerSlot = TrainerSlot.NONE): void { - const sprites = this.scene.currentBattle.trainer?.getSprites()!; // TODO: is this bang correct? - const tintSprites = this.scene.currentBattle.trainer?.getTintSprites()!; // TODO: is this bang correct? + const sprites = globalScene.currentBattle.trainer?.getSprites()!; // TODO: is this bang correct? + const tintSprites = globalScene.currentBattle.trainer?.getTintSprites()!; // TODO: is this bang correct? for (let i = 0; i < sprites.length; i++) { const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2; - [ sprites[i], tintSprites[i] ].map(sprite => { + [sprites[i], tintSprites[i]].map(sprite => { if (visible) { sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16; } @@ -24,24 +24,24 @@ export class BattlePhase extends Phase { sprites[i].clearTint(); tintSprites[i].clearTint(); } - this.scene.tweens.add({ - targets: this.scene.currentBattle.trainer, + globalScene.tweens.add({ + targets: globalScene.currentBattle.trainer, x: "-=16", y: "+=16", alpha: 1, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); } hideEnemyTrainer(): void { - this.scene.tweens.add({ - targets: this.scene.currentBattle.trainer, + globalScene.tweens.add({ + targets: globalScene.currentBattle.trainer, x: "+=16", y: "-=16", alpha: 0, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); } } diff --git a/src/phases/berry-phase.ts b/src/phases/berry-phase.ts index e419aa6692d..0048f8cd2f2 100644 --- a/src/phases/berry-phase.ts +++ b/src/phases/berry-phase.ts @@ -7,40 +7,42 @@ import i18next from "i18next"; import * as Utils from "#app/utils"; import { FieldPhase } from "./field-phase"; import { CommonAnimPhase } from "./common-anim-phase"; +import { globalScene } from "#app/global-scene"; /** The phase after attacks where the pokemon eat berries */ export class BerryPhase extends FieldPhase { start() { super.start(); - this.executeForAll((pokemon) => { - const hasUsableBerry = !!this.scene.findModifier((m) => { + this.executeForAll(pokemon => { + const hasUsableBerry = !!globalScene.findModifier(m => { return m instanceof BerryModifier && m.shouldApply(pokemon); }, pokemon.isPlayer()); if (hasUsableBerry) { const cancelled = new Utils.BooleanHolder(false); - pokemon.getOpponents().map((opp) => applyAbAttrs(PreventBerryUseAbAttr, opp, cancelled)); + pokemon.getOpponents().map(opp => applyAbAttrs(PreventBerryUseAbAttr, opp, cancelled)); if (cancelled.value) { - pokemon.scene.queueMessage(i18next.t("abilityTriggers:preventBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + globalScene.queueMessage( + i18next.t("abilityTriggers:preventBerryUse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + ); } else { - this.scene.unshiftPhase( - new CommonAnimPhase(this.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.USE_ITEM) + globalScene.unshiftPhase( + new CommonAnimPhase(pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.USE_ITEM), ); - for (const berryModifier of this.scene.applyModifiers(BerryModifier, pokemon.isPlayer(), pokemon)) { + for (const berryModifier of globalScene.applyModifiers(BerryModifier, pokemon.isPlayer(), pokemon)) { if (berryModifier.consumed) { - if (!--berryModifier.stackCount) { - this.scene.removeModifier(berryModifier); - } else { - berryModifier.consumed = false; - } + berryModifier.consumed = false; + pokemon.loseHeldItem(berryModifier); } - this.scene.eventTarget.dispatchEvent(new BerryUsedEvent(berryModifier)); // Announce a berry was used + globalScene.eventTarget.dispatchEvent(new BerryUsedEvent(berryModifier)); // Announce a berry was used } - this.scene.updateModifiers(pokemon.isPlayer()); + globalScene.updateModifiers(pokemon.isPlayer()); applyAbAttrs(HealFromBerryUseAbAttr, pokemon, new Utils.BooleanHolder(false)); } diff --git a/src/phases/check-status-effect-phase.ts b/src/phases/check-status-effect-phase.ts index 44918b54966..f59dfea9f02 100644 --- a/src/phases/check-status-effect-phase.ts +++ b/src/phases/check-status-effect-phase.ts @@ -1,21 +1,20 @@ import { PostTurnStatusEffectPhase } from "#app/phases/post-turn-status-effect-phase"; import { Phase } from "#app/phase"; -import { BattlerIndex } from "#app/battle"; -import BattleScene from "#app/battle-scene"; +import type { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; export class CheckStatusEffectPhase extends Phase { - private order : BattlerIndex[]; - constructor(scene : BattleScene, order : BattlerIndex[]) { - super(scene); - this.scene = scene; + private order: BattlerIndex[]; + constructor(order: BattlerIndex[]) { + super(); this.order = order; } start() { - const field = this.scene.getField(); + const field = globalScene.getField(); for (const o of this.order) { - if (field[o].status && field[o].status.isPostTurn()) { - this.scene.unshiftPhase(new PostTurnStatusEffectPhase(this.scene, o)); + if (field[o].status?.isPostTurn()) { + globalScene.unshiftPhase(new PostTurnStatusEffectPhase(o)); } } this.end(); diff --git a/src/phases/check-switch-phase.ts b/src/phases/check-switch-phase.ts index 8849d304435..ba4837fd7cc 100644 --- a/src/phases/check-switch-phase.ts +++ b/src/phases/check-switch-phase.ts @@ -1,21 +1,20 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { BattleStyle } from "#app/enums/battle-style"; import { BattlerTagType } from "#app/enums/battler-tag-type"; 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"; export class CheckSwitchPhase extends BattlePhase { - protected fieldIndex: integer; + protected fieldIndex: number; protected useName: boolean; - constructor(scene: BattleScene, fieldIndex: integer, useName: boolean) { - super(scene); + constructor(fieldIndex: number, useName: boolean) { + super(); this.fieldIndex = fieldIndex; this.useName = useName; @@ -24,39 +23,59 @@ export class CheckSwitchPhase extends BattlePhase { start() { super.start(); - const pokemon = this.scene.getPlayerField()[this.fieldIndex]; + const pokemon = globalScene.getPlayerField()[this.fieldIndex]; - if (this.scene.battleStyle === BattleStyle.SET) { - super.end(); - return; + // End this phase early... + + // ...if the user is playing in Set Mode + if (globalScene.battleStyle === BattleStyle.SET) { + return super.end(); } - if (this.scene.field.getAll().indexOf(pokemon) === -1) { - this.scene.unshiftPhase(new SummonMissingPhase(this.scene, this.fieldIndex)); - super.end(); - return; + // ...if the checked Pokemon is somehow not on the field + if (globalScene.field.getAll().indexOf(pokemon) === -1) { + globalScene.unshiftPhase(new SummonMissingPhase(this.fieldIndex)); + return super.end(); } - if (!this.scene.getParty().slice(1).filter(p => p.isActive()).length) { - super.end(); - return; + // ...if there are no other allowed Pokemon in the player's party to switch with + if ( + !globalScene + .getPlayerParty() + .slice(1) + .filter(p => p.isActive()).length + ) { + return super.end(); } - if (pokemon.getTag(BattlerTagType.FRENZY)) { - super.end(); - return; + // ...or if any player Pokemon has an effect that prevents the checked Pokemon from switching + if ( + pokemon.getTag(BattlerTagType.FRENZY) || + pokemon.isTrapped() || + globalScene.getPlayerField().some(p => p.getTag(BattlerTagType.COMMANDED)) + ) { + return super.end(); } - 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.SWITCH, this.fieldIndex, false, true)); - this.end(); - }, () => { - this.scene.ui.setMode(Mode.MESSAGE); - this.end(); - }); - }); + globalScene.ui.showText( + i18next.t("battle:switchQuestion", { + pokemonName: this.useName ? getPokemonNameWithAffix(pokemon) : i18next.t("battle:pokemon"), + }), + null, + () => { + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.unshiftPhase(new SwitchPhase(SwitchType.INITIAL_SWITCH, this.fieldIndex, false, true)); + this.end(); + }, + () => { + globalScene.ui.setMode(Mode.MESSAGE); + this.end(); + }, + ); + }, + ); } } diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 6d4d46c51c9..055d52e7a8b 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -1,14 +1,18 @@ -import BattleScene from "#app/battle-scene"; -import { TurnCommand, BattleType } from "#app/battle"; -import { TrappedTag, EncoreTag } from "#app/data/battler-tags"; -import { MoveTargetSet, getMoveTargets } from "#app/data/move"; +import { globalScene } from "#app/global-scene"; +import type { TurnCommand } from "#app/battle"; +import { BattleType } from "#app/battle"; +import type { EncoreTag } from "#app/data/battler-tags"; +import { TrappedTag } from "#app/data/battler-tags"; +import type { MoveTargetSet } from "#app/data/moves/move"; +import { getMoveTargets } from "#app/data/moves/move"; import { speciesStarterCosts } from "#app/data/balance/starters"; import { Abilities } from "#app/enums/abilities"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { Biome } from "#app/enums/biome"; import { Moves } from "#app/enums/moves"; -import { PokeballType } from "#app/enums/pokeball"; -import { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; +import { PokeballType } from "#enums/pokeball"; +import type { PlayerPokemon, TurnMove } from "#app/field/pokemon"; +import { FieldPosition } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; @@ -17,12 +21,14 @@ import { FieldPhase } from "./field-phase"; import { SelectTargetPhase } from "./select-target-phase"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { isNullOrUndefined } from "#app/utils"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; export class CommandPhase extends FieldPhase { - protected fieldIndex: integer; + protected fieldIndex: number; - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene); + constructor(fieldIndex: number) { + super(); this.fieldIndex = fieldIndex; } @@ -30,9 +36,21 @@ export class CommandPhase extends FieldPhase { start() { super.start(); - const commandUiHandler = this.scene.ui.handlers[Mode.COMMAND]; + globalScene.updateGameInfo(); + + const commandUiHandler = globalScene.ui.handlers[Mode.COMMAND]; + + // If one of these conditions is true, we always reset the cursor to Command.FIGHT + const cursorResetEvent = + globalScene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER || + globalScene.currentBattle.battleType === BattleType.TRAINER || + globalScene.arena.biomeType === Biome.END; + if (commandUiHandler) { - if (this.scene.currentBattle.turn === 1 || commandUiHandler.getCursor() === Command.POKEMON) { + if ( + (globalScene.currentBattle.turn === 1 && (!globalScene.commandCursorMemory || cursorResetEvent)) || + commandUiHandler.getCursor() === Command.POKEMON + ) { commandUiHandler.setCursor(Command.FIGHT); } else { commandUiHandler.setCursor(commandUiHandler.getCursor()); @@ -42,144 +60,275 @@ export class CommandPhase extends FieldPhase { if (this.fieldIndex) { // If we somehow are attempting to check the right pokemon but there's only one pokemon out // Switch back to the center pokemon. This can happen rarely in double battles with mid turn switching - if (this.scene.getPlayerField().filter(p => p.isActive()).length === 1) { + if (globalScene.getPlayerField().filter(p => p.isActive()).length === 1) { this.fieldIndex = FieldPosition.CENTER; } else { - const allyCommand = this.scene.currentBattle.turnCommands[this.fieldIndex - 1]; + const allyCommand = globalScene.currentBattle.turnCommands[this.fieldIndex - 1]; if (allyCommand?.command === Command.BALL || allyCommand?.command === Command.RUN) { - this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: allyCommand?.command, skip: true }; + globalScene.currentBattle.turnCommands[this.fieldIndex] = { + command: allyCommand?.command, + skip: true, + }; } } } - if (this.scene.currentBattle.turnCommands[this.fieldIndex]?.skip) { + // If the Pokemon has applied Commander's effects to its ally, skip this command + if ( + globalScene.currentBattle?.double && + this.getPokemon().getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === this.getPokemon() + ) { + globalScene.currentBattle.turnCommands[this.fieldIndex] = { + command: Command.FIGHT, + move: { move: Moves.NONE, targets: [] }, + skip: true, + }; + } + + // Checks if the Pokemon is under the effects of Encore. If so, Encore can end early if the encored move has no more PP. + const encoreTag = this.getPokemon().getTag(BattlerTagType.ENCORE) as EncoreTag; + if (encoreTag) { + this.getPokemon().lapseTag(BattlerTagType.ENCORE); + } + + if (globalScene.currentBattle.turnCommands[this.fieldIndex]?.skip) { return this.end(); } - const playerPokemon = this.scene.getPlayerField()[this.fieldIndex]; + const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; const moveQueue = playerPokemon.getMoveQueue(); - while (moveQueue.length && moveQueue[0] - && moveQueue[0].move && (!playerPokemon.getMoveset().find(m => m?.moveId === moveQueue[0].move) - || !playerPokemon.getMoveset()[playerPokemon.getMoveset().findIndex(m => m?.moveId === moveQueue[0].move)]!.isUsable(playerPokemon, moveQueue[0].ignorePP))) { // TODO: is the bang correct? + while ( + moveQueue.length && + moveQueue[0] && + moveQueue[0].move && + !moveQueue[0].virtual && + (!playerPokemon.getMoveset().find(m => m?.moveId === moveQueue[0].move) || + !playerPokemon + .getMoveset() + [playerPokemon.getMoveset().findIndex(m => m?.moveId === moveQueue[0].move)]!.isUsable( + playerPokemon, + moveQueue[0].ignorePP, + )) + ) { + // TODO: is the bang correct? moveQueue.shift(); } - if (moveQueue.length) { + if (moveQueue.length > 0) { const queuedMove = moveQueue[0]; if (!queuedMove.move) { - this.handleCommand(Command.FIGHT, -1, false); + this.handleCommand(Command.FIGHT, -1); } else { const moveIndex = playerPokemon.getMoveset().findIndex(m => m?.moveId === queuedMove.move); - if (moveIndex > -1 && playerPokemon.getMoveset()[moveIndex]!.isUsable(playerPokemon, queuedMove.ignorePP)) { // TODO: is the bang correct? - this.handleCommand(Command.FIGHT, moveIndex, queuedMove.ignorePP, { targets: queuedMove.targets, multiple: queuedMove.targets.length > 1 }); + if ( + (moveIndex > -1 && playerPokemon.getMoveset()[moveIndex]!.isUsable(playerPokemon, queuedMove.ignorePP)) || + queuedMove.virtual + ) { + // TODO: is the bang correct? + this.handleCommand(Command.FIGHT, moveIndex, queuedMove.ignorePP, queuedMove); } else { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); } } } else { - if (this.scene.currentBattle.isBattleMysteryEncounter() && this.scene.currentBattle.mysteryEncounter?.skipToFightInput) { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); + if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + globalScene.currentBattle.mysteryEncounter?.skipToFightInput + ) { + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.FIGHT, this.fieldIndex); } else { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); } } } - handleCommand(command: Command, cursor: integer, ...args: any[]): boolean { - const playerPokemon = this.scene.getPlayerField()[this.fieldIndex]; - let success: boolean; + handleCommand(command: Command, cursor: number, ...args: any[]): boolean { + const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; + let success = false; switch (command) { + case Command.TERA: case Command.FIGHT: let useStruggle = false; - if (cursor === -1 || - playerPokemon.trySelectMove(cursor, args[0] as boolean) || - (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m?.isUsable(playerPokemon)).length)) { - const moveId = !useStruggle ? cursor > -1 ? playerPokemon.getMoveset()[cursor]!.moveId : Moves.NONE : Moves.STRUGGLE; // TODO: is the bang correct? - const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args }; - const moveTargets: MoveTargetSet = args.length < 3 ? getMoveTargets(playerPokemon, moveId) : args[2]; + const turnMove: TurnMove | undefined = args.length === 2 ? (args[1] as TurnMove) : undefined; + if ( + cursor === -1 || + playerPokemon.trySelectMove(cursor, args[0] as boolean) || + (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m?.isUsable(playerPokemon)).length) + ) { + let moveId: Moves; + if (useStruggle) { + moveId = Moves.STRUGGLE; + } else if (turnMove !== undefined) { + moveId = turnMove.move; + } else if (cursor > -1) { + moveId = playerPokemon.getMoveset()[cursor]!.moveId; + } else { + moveId = Moves.NONE; + } + + const turnCommand: TurnCommand = { + command: Command.FIGHT, + cursor: cursor, + move: { move: moveId, targets: [], ignorePP: args[0] }, + args: args, + }; + const preTurnCommand: TurnCommand = { + command: command, + targets: [this.fieldIndex], + skip: command === Command.FIGHT, + }; + const moveTargets: MoveTargetSet = + turnMove === undefined + ? getMoveTargets(playerPokemon, moveId) + : { + targets: turnMove.targets, + multiple: turnMove.targets.length > 1, + }; if (!moveId) { - turnCommand.targets = [ this.fieldIndex ]; + turnCommand.targets = [this.fieldIndex]; } console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); if (moveTargets.targets.length > 1 && moveTargets.multiple) { - this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); + globalScene.unshiftPhase(new SelectTargetPhase(this.fieldIndex)); } if (moveTargets.targets.length <= 1 || moveTargets.multiple) { turnCommand.move!.targets = moveTargets.targets; //TODO: is the bang correct here? } else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { turnCommand.move!.targets = playerPokemon.getMoveQueue()[0].targets; //TODO: is the bang correct here? } else { - this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); + globalScene.unshiftPhase(new SelectTargetPhase(this.fieldIndex)); } - this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; + globalScene.currentBattle.preTurnCommands[this.fieldIndex] = preTurnCommand; + globalScene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; success = true; } else if (cursor < playerPokemon.getMoveset().length) { const move = playerPokemon.getMoveset()[cursor]!; //TODO: is this bang correct? - this.scene.ui.setMode(Mode.MESSAGE); + globalScene.ui.setMode(Mode.MESSAGE); // Decides between a Disabled, Not Implemented, or No PP translation message - const errorMessage = - playerPokemon.isMoveRestricted(move.moveId, playerPokemon) - ? playerPokemon.getRestrictingTag(move.moveId, playerPokemon)!.selectionDeniedText(playerPokemon, move.moveId) - : move.getName().endsWith(" (N)") ? "battle:moveNotImplemented" : "battle:moveNoPP"; + const errorMessage = playerPokemon.isMoveRestricted(move.moveId, playerPokemon) + ? playerPokemon + .getRestrictingTag(move.moveId, playerPokemon)! + .selectionDeniedText(playerPokemon, move.moveId) + : move.getName().endsWith(" (N)") + ? "battle:moveNotImplemented" + : "battle:moveNoPP"; const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator - this.scene.ui.showText(i18next.t(errorMessage, { moveName: moveName }), null, () => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); - }, null, true); + globalScene.ui.showText( + i18next.t(errorMessage, { moveName: moveName }), + null, + () => { + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.FIGHT, this.fieldIndex); + }, + null, + true, + ); } break; case Command.BALL: - const notInDex = (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1); - if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || this.scene.gameMode.isFreshStartChallenge() || notInDex )) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballTrainer"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (this.scene.currentBattle.isBattleMysteryEncounter() && !this.scene.currentBattle.mysteryEncounter!.catchAllowed) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballMysteryEncounter"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); + const notInDex = + globalScene + .getEnemyField() + .filter(p => p.isActive(true)) + .some(p => !globalScene.gameData.dexData[p.species.speciesId].caughtAttr) && + globalScene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1; + if ( + globalScene.arena.biomeType === Biome.END && + (!globalScene.gameMode.isClassic || globalScene.gameMode.isFreshStartChallenge() || notInDex) + ) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:noPokeballForce"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); + } else if (globalScene.currentBattle.battleType === BattleType.TRAINER) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:noPokeballTrainer"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); + } else if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + !globalScene.currentBattle.mysteryEncounter!.catchAllowed + ) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:noPokeballMysteryEncounter"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); } else { - const targets = this.scene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex()); + const targets = globalScene + .getEnemyField() + .filter(p => p.isActive(true)) + .map(p => p.getBattlerIndex()); if (targets.length > 1) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballMulti"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:noPokeballMulti"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); } else if (cursor < 5) { - const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true)); - if (targetPokemon?.isBoss() && targetPokemon?.bossSegmentIndex >= 1 && !targetPokemon?.hasAbility(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballStrong"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); + const targetPokemon = globalScene.getEnemyField().find(p => p.isActive(true)); + if ( + targetPokemon?.isBoss() && + targetPokemon?.bossSegmentIndex >= 1 && + !targetPokemon?.hasAbility(Abilities.WONDER_GUARD, false, true) && + cursor < PokeballType.MASTER_BALL + ) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:noPokeballStrong"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); } else { - this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.BALL, cursor: cursor }; - this.scene.currentBattle.turnCommands[this.fieldIndex]!.targets = targets; + globalScene.currentBattle.turnCommands[this.fieldIndex] = { + command: Command.BALL, + cursor: cursor, + }; + globalScene.currentBattle.turnCommands[this.fieldIndex]!.targets = targets; if (this.fieldIndex) { - this.scene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; + globalScene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; } success = true; } @@ -189,24 +338,44 @@ export class CommandPhase extends FieldPhase { case Command.POKEMON: case Command.RUN: const isSwitch = command === Command.POKEMON; - const { currentBattle, arena } = this.scene; + const { currentBattle, arena } = globalScene; const mysteryEncounterFleeAllowed = currentBattle.mysteryEncounter?.fleeAllowed; - if (!isSwitch && (arena.biomeType === Biome.END || (!isNullOrUndefined(mysteryEncounterFleeAllowed) && !mysteryEncounterFleeAllowed))) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noEscapeForce"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (!isSwitch && (currentBattle.battleType === BattleType.TRAINER || currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE)) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noEscapeTrainer"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); + if ( + !isSwitch && + (arena.biomeType === Biome.END || + (!isNullOrUndefined(mysteryEncounterFleeAllowed) && !mysteryEncounterFleeAllowed)) + ) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:noEscapeForce"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); + } else if ( + !isSwitch && + (currentBattle.battleType === BattleType.TRAINER || + currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) + ) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:noEscapeTrainer"), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, + null, + true, + ); } else { - const batonPass = isSwitch && args[0] as boolean; + const batonPass = isSwitch && (args[0] as boolean); const trappedAbMessages: string[] = []; if (batonPass || !playerPokemon.isTrapped(trappedAbMessages)) { currentBattle.turnCommands[this.fieldIndex] = isSwitch @@ -214,95 +383,92 @@ export class CommandPhase extends FieldPhase { : { command: Command.RUN }; success = true; if (!isSwitch && this.fieldIndex) { - currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; + currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; } } else if (trappedAbMessages.length > 0) { if (!isSwitch) { - this.scene.ui.setMode(Mode.MESSAGE); + globalScene.ui.setMode(Mode.MESSAGE); } - this.scene.ui.showText(trappedAbMessages[0], null, () => { - this.scene.ui.showText("", 0); - if (!isSwitch) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - } - }, null, true); - } else { - const trapTag = playerPokemon.getTag(TrappedTag); - - // trapTag should be defined at this point, but just in case... - if (!trapTag) { - currentBattle.turnCommands[this.fieldIndex] = isSwitch - ? { command: Command.POKEMON, cursor: cursor, args: args } - : { command: Command.RUN }; - break; - } - - if (!isSwitch) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - } - this.scene.ui.showText( - i18next.t("battle:noEscapePokemon", { - pokemonName: trapTag.sourceId && this.scene.getPokemonById(trapTag.sourceId) ? getPokemonNameWithAffix(this.scene.getPokemonById(trapTag.sourceId)!) : "", - moveName: trapTag.getMoveName(), - escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee") - }), + globalScene.ui.showText( + trappedAbMessages[0], null, () => { - this.scene.ui.showText("", 0); + globalScene.ui.showText("", 0); if (!isSwitch) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); } - }, null, true); + }, + null, + true, + ); + } else { + const trapTag = playerPokemon.getTag(TrappedTag); + const fairyLockTag = globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER); + + if (!trapTag && !fairyLockTag) { + i18next.t(`battle:noEscape${isSwitch ? "Switch" : "Flee"}`); + break; + } + if (!isSwitch) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(Mode.MESSAGE); + } + const showNoEscapeText = (tag: any) => { + globalScene.ui.showText( + i18next.t("battle:noEscapePokemon", { + pokemonName: + tag.sourceId && globalScene.getPokemonById(tag.sourceId) + ? getPokemonNameWithAffix(globalScene.getPokemonById(tag.sourceId)!) + : "", + moveName: tag.getMoveName(), + escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee"), + }), + null, + () => { + globalScene.ui.showText("", 0); + if (!isSwitch) { + globalScene.ui.setMode(Mode.COMMAND, this.fieldIndex); + } + }, + null, + true, + ); + }; + + if (trapTag) { + showNoEscapeText(trapTag); + } else if (fairyLockTag) { + showNoEscapeText(fairyLockTag); + } } } break; } - if (success!) { // TODO: is the bang correct? + if (success) { this.end(); } - return success!; // TODO: is the bang correct? + return success; } cancel() { if (this.fieldIndex) { - this.scene.unshiftPhase(new CommandPhase(this.scene, 0)); - this.scene.unshiftPhase(new CommandPhase(this.scene, 1)); + globalScene.unshiftPhase(new CommandPhase(0)); + globalScene.unshiftPhase(new CommandPhase(1)); this.end(); } } - checkFightOverride(): boolean { - const pokemon = this.getPokemon(); - - const encoreTag = pokemon.getTag(EncoreTag) as EncoreTag; - - if (!encoreTag) { - return false; - } - - const moveIndex = pokemon.getMoveset().findIndex(m => m?.moveId === encoreTag.moveId); - - if (moveIndex === -1 || !pokemon.getMoveset()[moveIndex]!.isUsable(pokemon)) { // TODO: is this bang correct? - return false; - } - - this.handleCommand(Command.FIGHT, moveIndex, false); - - return true; - } - - getFieldIndex(): integer { + getFieldIndex(): number { return this.fieldIndex; } getPokemon(): PlayerPokemon { - return this.scene.getPlayerField()[this.fieldIndex]; + return globalScene.getPlayerField()[this.fieldIndex]; } end() { - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + globalScene.ui.setMode(Mode.MESSAGE).then(() => super.end()); } } diff --git a/src/phases/common-anim-phase.ts b/src/phases/common-anim-phase.ts index c4071488eef..d32e93ea6aa 100644 --- a/src/phases/common-anim-phase.ts +++ b/src/phases/common-anim-phase.ts @@ -1,15 +1,16 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; -import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; +import type { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import type { CommonAnim } from "#app/data/battle-anims"; +import { CommonBattleAnim } from "#app/data/battle-anims"; import { PokemonPhase } from "./pokemon-phase"; export class CommonAnimPhase extends PokemonPhase { private anim: CommonAnim | null; - private targetIndex: integer | undefined; + private targetIndex: number | undefined; private playOnEmptyField: boolean; - constructor(scene: BattleScene, battlerIndex?: BattlerIndex, targetIndex?: BattlerIndex | undefined, anim?: CommonAnim, playOnEmptyField: boolean = false) { - super(scene, battlerIndex); + constructor(battlerIndex?: BattlerIndex, targetIndex?: BattlerIndex, anim?: CommonAnim, playOnEmptyField = false) { + super(battlerIndex); this.anim = anim!; // TODO: is this bang correct? this.targetIndex = targetIndex; @@ -21,8 +22,11 @@ export class CommonAnimPhase extends PokemonPhase { } start() { - const target = this.targetIndex !== undefined ? (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField())[this.targetIndex] : this.getPokemon(); - new CommonBattleAnim(this.anim, this.getPokemon(), target).play(this.scene, false, () => { + const target = + this.targetIndex !== undefined + ? (this.player ? globalScene.getEnemyField() : globalScene.getPlayerField())[this.targetIndex] + : this.getPokemon(); + new CommonBattleAnim(this.anim, this.getPokemon(), target).play(false, () => { this.end(); }); } diff --git a/src/phases/damage-anim-phase.ts b/src/phases/damage-anim-phase.ts new file mode 100644 index 00000000000..e31fe8c9475 --- /dev/null +++ b/src/phases/damage-anim-phase.ts @@ -0,0 +1,90 @@ +import { globalScene } from "#app/global-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 DamageAnimPhase extends PokemonPhase { + private amount: number; + private damageResult: DamageResult; + private critical: boolean; + + constructor(battlerIndex: BattlerIndex, amount: number, damageResult?: DamageResult, critical = false) { + super(battlerIndex); + + this.amount = amount; + this.damageResult = damageResult || HitResult.EFFECTIVE; + this.critical = critical; + } + + start() { + super.start(); + + if (this.damageResult === HitResult.ONE_HIT_KO) { + if (globalScene.moveAnimations) { + globalScene.toggleInvert(true); + } + globalScene.time.delayedCall(fixedInt(1000), () => { + globalScene.toggleInvert(false); + this.applyDamage(); + }); + return; + } + + this.applyDamage(); + } + + updateAmount(amount: number): void { + this.amount = amount; + } + + applyDamage() { + switch (this.damageResult) { + case HitResult.EFFECTIVE: + globalScene.playSound("se/hit"); + break; + case HitResult.SUPER_EFFECTIVE: + case HitResult.ONE_HIT_KO: + globalScene.playSound("se/hit_strong"); + break; + case HitResult.NOT_VERY_EFFECTIVE: + globalScene.playSound("se/hit_weak"); + break; + } + + if (this.amount) { + globalScene.damageNumberHandler.add(this.getPokemon(), this.amount, this.damageResult, this.critical); + } + + if (this.damageResult !== HitResult.OTHER && this.amount > 0) { + const flashTimer = globalScene.time.addEvent({ + delay: 100, + repeat: 5, + startAt: 200, + callback: () => { + this.getPokemon() + .getSprite() + .setVisible(flashTimer.repeatCount % 2 === 0); + if (!flashTimer.repeatCount) { + this.getPokemon() + .updateInfo() + .then(() => this.end()); + } + }, + }); + } else { + this.getPokemon() + .updateInfo() + .then(() => this.end()); + } + } + + override end() { + if (globalScene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + globalScene.initFinalBossPhaseTwo(this.getPokemon()); + } else { + super.end(); + } + } +} diff --git a/src/phases/damage-phase.ts b/src/phases/damage-phase.ts deleted file mode 100644 index 44e3dfd4182..00000000000 --- a/src/phases/damage-phase.ts +++ /dev/null @@ -1,84 +0,0 @@ -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"; - -export class DamagePhase extends PokemonPhase { - private amount: integer; - private damageResult: DamageResult; - private critical: boolean; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, amount: integer, damageResult?: DamageResult, critical: boolean = false) { - super(scene, battlerIndex); - - this.amount = amount; - this.damageResult = damageResult || HitResult.EFFECTIVE; - this.critical = critical; - } - - start() { - super.start(); - - if (this.damageResult === HitResult.ONE_HIT_KO) { - if (this.scene.moveAnimations) { - this.scene.toggleInvert(true); - } - this.scene.time.delayedCall(Utils.fixedInt(1000), () => { - this.scene.toggleInvert(false); - this.applyDamage(); - }); - return; - } - - this.applyDamage(); - } - - updateAmount(amount: integer): void { - this.amount = amount; - } - - applyDamage() { - switch (this.damageResult) { - case HitResult.EFFECTIVE: - this.scene.playSound("se/hit"); - break; - case HitResult.SUPER_EFFECTIVE: - case HitResult.ONE_HIT_KO: - this.scene.playSound("se/hit_strong"); - break; - case HitResult.NOT_VERY_EFFECTIVE: - this.scene.playSound("se/hit_weak"); - break; - } - - if (this.amount) { - this.scene.damageNumberHandler.add(this.getPokemon(), this.amount, this.damageResult, this.critical); - } - - if (this.damageResult !== HitResult.OTHER && this.amount > 0) { - const flashTimer = this.scene.time.addEvent({ - delay: 100, - repeat: 5, - startAt: 200, - callback: () => { - this.getPokemon().getSprite().setVisible(flashTimer.repeatCount % 2 === 0); - if (!flashTimer.repeatCount) { - this.getPokemon().updateInfo().then(() => this.end()); - } - } - }); - } else { - this.getPokemon().updateInfo().then(() => this.end()); - } - } - - override end() { - if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - this.scene.initFinalBossPhaseTwo(this.getPokemon()); - } else { - super.end(); - } - } -} diff --git a/src/phases/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts index 90aceeb46bc..49a408e8699 100644 --- a/src/phases/egg-hatch-phase.ts +++ b/src/phases/egg-hatch-phase.ts @@ -1,20 +1,20 @@ -import BattleScene, { AnySound } from "#app/battle-scene"; -import { Egg } from "#app/data/egg"; +import type { AnySound } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import type { Egg } from "#app/data/egg"; import { EggCountChangedEvent } from "#app/events/egg"; -import { PlayerPokemon } from "#app/field/pokemon"; -import { getPokemonNameWithAffix } from "#app/messages"; +import type { PlayerPokemon } from "#app/field/pokemon"; import { Phase } from "#app/phase"; import { achvs } from "#app/system/achv"; import EggCounterContainer from "#app/ui/egg-counter-container"; -import EggHatchSceneHandler from "#app/ui/egg-hatch-scene-handler"; +import type EggHatchSceneHandler from "#app/ui/egg-hatch-scene-handler"; import PokemonInfoContainer from "#app/ui/pokemon-info-container"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; 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 type { EggLapsePhase } from "./egg-lapse-phase"; +import type { EggHatchData } from "#app/data/egg-hatch-data"; +import { doShinySparkleAnim } from "#app/field/anims"; /** * Class that represents egg hatching @@ -26,7 +26,7 @@ export class EggHatchPhase extends Phase { private eggHatchData: EggHatchData; /** The number of eggs that are hatching */ - private eggsToHatchCount: integer; + private eggsToHatchCount: number; /** The container that lists how many eggs are hatching */ private eggCounterContainer: EggCounterContainer; @@ -57,7 +57,7 @@ export class EggHatchPhase extends Phase { /** The newly hatched {@link PlayerPokemon} */ private pokemon: PlayerPokemon; /** The index of which egg move is unlocked. 0-2 is common, 3 is rare */ - private eggMoveIndex: integer; + private eggMoveIndex: number; /** Internal booleans representing if the egg is hatched, able to be skipped, or skipped */ private hatched: boolean; private canSkip: boolean; @@ -66,8 +66,8 @@ export class EggHatchPhase extends Phase { private evolutionBgm: AnySound; private eggLapsePhase: EggLapsePhase; - constructor(scene: BattleScene, hatchScene: EggLapsePhase, egg: Egg, eggsToHatchCount: integer) { - super(scene); + constructor(hatchScene: EggLapsePhase, egg: Egg, eggsToHatchCount: number) { + super(); this.eggLapsePhase = hatchScene; this.egg = egg; this.eggsToHatchCount = eggsToHatchCount; @@ -76,37 +76,44 @@ export class EggHatchPhase extends Phase { start() { super.start(); - this.scene.ui.setModeForceTransition(Mode.EGG_HATCH_SCENE).then(() => { - + globalScene.ui.setModeForceTransition(Mode.EGG_HATCH_SCENE).then(() => { if (!this.egg) { return this.end(); } - const eggIndex = this.scene.gameData.eggs.findIndex(e => e.id === this.egg.id); + const eggIndex = globalScene.gameData.eggs.findIndex(e => e.id === this.egg.id); if (eggIndex === -1) { return this.end(); } - this.scene.gameData.eggs.splice(eggIndex, 1); + globalScene.gameData.eggs.splice(eggIndex, 1); - this.scene.fadeOutBgm(undefined, false); + globalScene.fadeOutBgm(undefined, false); - this.eggHatchHandler = this.scene.ui.getHandler() as EggHatchSceneHandler; + this.eggHatchHandler = globalScene.ui.getHandler() as EggHatchSceneHandler; this.eggHatchContainer = this.eggHatchHandler.eggHatchContainer; - this.eggHatchBg = this.scene.add.image(0, 0, "default_bg"); + this.eggHatchBg = globalScene.add.image(0, 0, "default_bg"); this.eggHatchBg.setOrigin(0, 0); this.eggHatchContainer.add(this.eggHatchBg); - this.eggContainer = this.scene.add.container(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2); + this.eggContainer = globalScene.add.container( + this.eggHatchBg.displayWidth / 2, + this.eggHatchBg.displayHeight / 2, + ); - this.eggSprite = this.scene.add.sprite(0, 0, "egg", `egg_${this.egg.getKey()}`); - this.eggCrackSprite = this.scene.add.sprite(0, 0, "egg_crack", "0"); + this.eggSprite = globalScene.add.sprite(0, 0, "egg", `egg_${this.egg.getKey()}`); + this.eggCrackSprite = globalScene.add.sprite(0, 0, "egg_crack", "0"); this.eggCrackSprite.setVisible(false); - this.eggLightraysOverlay = this.scene.add.sprite((-this.eggHatchBg.displayWidth / 2) + 4, -this.eggHatchBg.displayHeight / 2, "egg_lightrays", "3"); + this.eggLightraysOverlay = globalScene.add.sprite( + -this.eggHatchBg.displayWidth / 2 + 4, + -this.eggHatchBg.displayHeight / 2, + "egg_lightrays", + "3", + ); this.eggLightraysOverlay.setOrigin(0, 0); this.eggLightraysOverlay.setVisible(false); @@ -115,28 +122,41 @@ export class EggHatchPhase extends Phase { this.eggContainer.add(this.eggLightraysOverlay); this.eggHatchContainer.add(this.eggContainer); - this.eggCounterContainer = new EggCounterContainer(this.scene, this.eggsToHatchCount); + this.eggCounterContainer = new EggCounterContainer(this.eggsToHatchCount); this.eggHatchContainer.add(this.eggCounterContainer); const getPokemonSprite = () => { - const ret = this.scene.add.sprite(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2, "pkmn__sub"); - ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const ret = globalScene.add.sprite( + this.eggHatchBg.displayWidth / 2, + this.eggHatchBg.displayHeight / 2, + "pkmn__sub", + ); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); return ret; }; this.eggHatchContainer.add((this.pokemonSprite = getPokemonSprite())); - this.pokemonShinySparkle = this.scene.add.sprite(this.pokemonSprite.x, this.pokemonSprite.y, "shiny"); + this.pokemonShinySparkle = globalScene.add.sprite(this.pokemonSprite.x, this.pokemonSprite.y, "shiny"); this.pokemonShinySparkle.setVisible(false); this.eggHatchContainer.add(this.pokemonShinySparkle); - this.eggHatchOverlay = this.scene.add.rectangle(0, -this.scene.game.canvas.height / 6, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0xFFFFFF); + this.eggHatchOverlay = globalScene.add.rectangle( + 0, + -globalScene.game.canvas.height / 6, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0xffffff, + ); this.eggHatchOverlay.setOrigin(0, 0); this.eggHatchOverlay.setAlpha(0); - this.scene.fieldUI.add(this.eggHatchOverlay); + globalScene.fieldUI.add(this.eggHatchOverlay); - this.infoContainer = new PokemonInfoContainer(this.scene); + this.infoContainer = new PokemonInfoContainer(); this.infoContainer.setup(); this.eggHatchContainer.add(this.infoContainer); @@ -154,13 +174,13 @@ export class EggHatchPhase extends Phase { pokemon.loadAssets().then(() => { this.canSkip = true; - this.scene.time.delayedCall(1000, () => { + globalScene.time.delayedCall(1000, () => { if (!this.hatched) { - this.evolutionBgm = this.scene.playSoundWithoutBgm("evolution"); + this.evolutionBgm = globalScene.playSoundWithoutBgm("evolution"); } }); - this.scene.time.delayedCall(2000, () => { + globalScene.time.delayedCall(2000, () => { if (this.hatched) { return; } @@ -170,25 +190,25 @@ export class EggHatchPhase extends Phase { if (this.hatched) { return; } - this.scene.time.delayedCall(1000, () => { + globalScene.time.delayedCall(1000, () => { if (this.hatched) { return; } this.doSpray(2, this.eggSprite.displayHeight / -4); this.eggCrackSprite.setFrame("1"); - this.scene.time.delayedCall(125, () => this.eggCrackSprite.setFrame("2")); + globalScene.time.delayedCall(125, () => this.eggCrackSprite.setFrame("2")); this.doEggShake(4).then(() => { if (this.hatched) { return; } - this.scene.time.delayedCall(1000, () => { + globalScene.time.delayedCall(1000, () => { if (this.hatched) { return; } - this.scene.playSound("se/egg_crack"); + globalScene.playSound("se/egg_crack"); this.doSpray(4); this.eggCrackSprite.setFrame("3"); - this.scene.time.delayedCall(125, () => this.eggCrackSprite.setFrame("4")); + globalScene.time.delayedCall(125, () => this.eggCrackSprite.setFrame("4")); this.doEggShake(8, 2).then(() => { if (!this.hatched) { this.doHatch(); @@ -204,10 +224,10 @@ export class EggHatchPhase extends Phase { } end() { - if (this.scene.findPhase((p) => p instanceof EggHatchPhase)) { + if (globalScene.findPhase(p => p instanceof EggHatchPhase)) { this.eggHatchHandler.clear(); } else { - this.scene.time.delayedCall(250, () => this.scene.setModifiersVisible(true)); + globalScene.time.delayedCall(250, () => globalScene.setModifiersVisible(true)); } super.end(); } @@ -219,7 +239,7 @@ export class EggHatchPhase extends Phase { * @param count the current number of times this function has been called. * @returns nothing since it's a Promise */ - doEggShake(intensity: number, repeatCount?: integer, count?: integer): Promise { + doEggShake(intensity: number, repeatCount?: number, count?: number): Promise { return new Promise(resolve => { if (repeatCount === undefined) { repeatCount = 0; @@ -227,33 +247,34 @@ export class EggHatchPhase extends Phase { if (count === undefined) { count = 0; } - this.scene.playSound("se/pb_move"); - this.scene.tweens.add({ + globalScene.playSound("se/pb_move"); + globalScene.tweens.add({ targets: this.eggContainer, x: `-=${intensity / (count ? 1 : 2)}`, ease: "Sine.easeInOut", duration: 125, onComplete: () => { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.eggContainer, x: `+=${intensity}`, ease: "Sine.easeInOut", duration: 250, onComplete: () => { count!++; - if (count! < repeatCount!) { // we know they are defined + if (count! < repeatCount!) { + // we know they are defined return this.doEggShake(intensity, repeatCount, count).then(() => resolve()); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.eggContainer, x: `-=${intensity / 2}`, ease: "Sine.easeInOut", duration: 125, - onComplete: () => resolve() + onComplete: () => resolve(), }); - } + }, }); - } + }, }); }); } @@ -285,14 +306,16 @@ export class EggHatchPhase extends Phase { this.canSkip = false; this.hatched = true; if (this.evolutionBgm) { - SoundFade.fadeOut(this.scene, this.evolutionBgm, Utils.fixedInt(100)); + SoundFade.fadeOut(globalScene, this.evolutionBgm, Utils.fixedInt(100)); } for (let e = 0; e < 5; e++) { - this.scene.time.delayedCall(Utils.fixedInt(375 * e), () => this.scene.playSound("se/egg_hatch", { volume: 1 - (e * 0.2) })); + globalScene.time.delayedCall(Utils.fixedInt(375 * e), () => + globalScene.playSound("se/egg_hatch", { volume: 1 - e * 0.2 }), + ); } this.eggLightraysOverlay.setVisible(true); this.eggLightraysOverlay.play("egg_lightrays"); - this.scene.tweens.add({ + globalScene.tweens.add({ duration: Utils.fixedInt(125), targets: this.eggHatchOverlay, alpha: 1, @@ -300,9 +323,9 @@ export class EggHatchPhase extends Phase { onComplete: () => { this.skipped = false; this.canSkip = true; - } + }, }); - this.scene.time.delayedCall(Utils.fixedInt(1500), () => { + globalScene.time.delayedCall(Utils.fixedInt(1500), () => { this.canSkip = false; if (!this.skipped) { this.doReveal(); @@ -317,56 +340,72 @@ export class EggHatchPhase extends Phase { // set the previous dex data so info container can show new unlocks in egg summary const isShiny = this.pokemon.isShiny(); if (this.pokemon.species.subLegendary) { - this.scene.validateAchv(achvs.HATCH_SUB_LEGENDARY); + globalScene.validateAchv(achvs.HATCH_SUB_LEGENDARY); } if (this.pokemon.species.legendary) { - this.scene.validateAchv(achvs.HATCH_LEGENDARY); + globalScene.validateAchv(achvs.HATCH_LEGENDARY); } if (this.pokemon.species.mythical) { - this.scene.validateAchv(achvs.HATCH_MYTHICAL); + globalScene.validateAchv(achvs.HATCH_MYTHICAL); } if (isShiny) { - this.scene.validateAchv(achvs.HATCH_SHINY); + globalScene.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); this.pokemonSprite.setPipelineData("variant", this.pokemon.variant); this.pokemonSprite.setVisible(true); - this.scene.time.delayedCall(Utils.fixedInt(250), () => { + globalScene.time.delayedCall(Utils.fixedInt(250), () => { this.eggsToHatchCount--; this.eggHatchHandler.eventTarget.dispatchEvent(new EggCountChangedEvent(this.eggsToHatchCount)); 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"); + globalScene.time.delayedCall(Utils.fixedInt(500), () => { + doShinySparkleAnim(this.pokemonShinySparkle, this.pokemon.variant); }); } - this.scene.time.delayedCall(Utils.fixedInt(!this.skipped ? !isShiny ? 1250 : 1750 : !isShiny ? 250 : 750), () => { - this.infoContainer.show(this.pokemon, false, this.skipped ? 2 : 1); + globalScene.time.delayedCall( + Utils.fixedInt(!this.skipped ? (!isShiny ? 1250 : 1750) : !isShiny ? 250 : 750), + () => { + this.infoContainer.show(this.pokemon, false, this.skipped ? 2 : 1); - this.scene.playSoundWithoutBgm("evolution_fanfare"); + globalScene.playSoundWithoutBgm("evolution_fanfare"); - this.scene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: getPokemonNameWithAffix(this.pokemon) }), null, () => { - this.scene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); - this.scene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { - this.scene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then((value) => { - this.eggHatchData.setEggMoveUnlocked(value); - this.scene.ui.showText("", 0); - this.end(); - }); - }); - }, null, true, 3000); - }); + globalScene.ui.showText( + i18next.t("egg:hatchFromTheEgg", { + pokemonName: this.pokemon.species.getExpandedSpeciesName(), + }), + null, + () => { + globalScene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); + globalScene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { + globalScene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then(value => { + this.eggHatchData.setEggMoveUnlocked(value); + globalScene.ui.showText("", 0); + this.end(); + }); + }); + }, + null, + true, + 3000, + ); + }, + ); }); - this.scene.tweens.add({ + globalScene.tweens.add({ duration: Utils.fixedInt(this.skipped ? 500 : 3000), targets: this.eggHatchOverlay, alpha: 0, - ease: "Cubic.easeOut" + ease: "Cubic.easeOut", }); } @@ -376,7 +415,7 @@ export class EggHatchPhase extends Phase { * @param amplitude Scaling * @returns a number */ - sin(index: integer, amplitude: integer): number { + sin(index: number, amplitude: number): number { return amplitude * Math.sin(index * (Math.PI / 128)); } @@ -385,13 +424,13 @@ export class EggHatchPhase extends Phase { * @param intensity number of times this is repeated (this is a badly named variable) * @param offsetY how much to offset the Y coordinates */ - doSpray(intensity: integer, offsetY?: number) { - this.scene.tweens.addCounter({ + doSpray(intensity: number, offsetY?: number) { + globalScene.tweens.addCounter({ repeat: intensity, duration: Utils.getFrameMs(1), onRepeat: () => { this.doSprayParticle(Utils.randInt(8), offsetY || 0); - } + }, }); } @@ -400,11 +439,11 @@ export class EggHatchPhase extends Phase { * @param trigIndex Used to modify the particle's vertical speed, is a random number from 0-7 * @param offsetY how much to offset the Y coordinate */ - doSprayParticle(trigIndex: integer, offsetY: number) { + doSprayParticle(trigIndex: number, offsetY: number) { const initialX = this.eggHatchBg.displayWidth / 2; const initialY = this.eggHatchBg.displayHeight / 2 + offsetY; const shardKey = !this.egg.isManaphyEgg() ? this.egg.tier.toString() : "1"; - const particle = this.scene.add.image(initialX, initialY, "egg_shard", `${shardKey}_${Math.floor(trigIndex / 2)}`); + const particle = globalScene.add.image(initialX, initialY, "egg_shard", `${shardKey}_${Math.floor(trigIndex / 2)}`); this.eggHatchContainer.add(particle); let f = 0; @@ -412,12 +451,12 @@ export class EggHatchPhase extends Phase { const speed = 3 - Utils.randInt(8); const amp = 24 + Utils.randInt(32); - const particleTimer = this.scene.tweens.addCounter({ + const particleTimer = globalScene.tweens.addCounter({ repeat: -1, duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -427,7 +466,7 @@ export class EggHatchPhase extends Phase { particle.setPosition(initialX + (speed * f) / 3, initialY + yOffset); particle.y += -this.sin(trigIndex, amp); if (f > 108) { - particle.setScale((1 - (f - 108) / 20)); + particle.setScale(1 - (f - 108) / 20); } trigIndex += 2 * speedMultiplier; f += speedMultiplier; @@ -440,7 +479,6 @@ export class EggHatchPhase extends Phase { updateParticle(); } - /** * Generates a Pokemon to be hatched by the egg * Also stores the generated pokemon in this.eggHatchData diff --git a/src/phases/egg-lapse-phase.ts b/src/phases/egg-lapse-phase.ts index 4c57be09b79..397eb970fec 100644 --- a/src/phases/egg-lapse-phase.ts +++ b/src/phases/egg-lapse-phase.ts @@ -1,12 +1,13 @@ -import BattleScene from "#app/battle-scene"; -import { Egg, EGG_SEED } from "#app/data/egg"; +import { globalScene } from "#app/global-scene"; +import type { Egg } from "#app/data/egg"; +import { EGG_SEED } from "#app/data/egg"; import { Phase } from "#app/phase"; import i18next from "i18next"; import Overrides from "#app/overrides"; import { EggHatchPhase } from "./egg-hatch-phase"; import { Mode } from "#app/ui/ui"; import { achvs } from "#app/system/achv"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; import { EggSummaryPhase } from "./egg-summary-phase"; import { EggHatchData } from "#app/data/egg-hatch-data"; @@ -15,43 +16,57 @@ import { EggHatchData } from "#app/data/egg-hatch-data"; * Also handles prompts for skipping animation, and calling the egg summary phase */ export class EggLapsePhase extends Phase { - private eggHatchData: EggHatchData[] = []; private readonly minEggsToSkip: number = 2; - constructor(scene: BattleScene) { - super(scene); - } start() { super.start(); - const eggsToHatch: Egg[] = this.scene.gameData.eggs.filter((egg: Egg) => { + const eggsToHatch: Egg[] = globalScene.gameData.eggs.filter((egg: Egg) => { return Overrides.EGG_IMMEDIATE_HATCH_OVERRIDE ? true : --egg.hatchWaves < 1; }); const eggsToHatchCount: number = eggsToHatch.length; this.eggHatchData = []; if (eggsToHatchCount > 0) { - 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.setModeWithoutClear(Mode.CONFIRM, () => { - this.hatchEggsSkipped(eggsToHatch); - this.showSummary(); - }, () => { - this.hatchEggsRegular(eggsToHatch); - this.end(); + if (eggsToHatchCount >= this.minEggsToSkip && globalScene.eggSkipPreference === 1) { + globalScene.ui.showText( + i18next.t("battle:eggHatching"), + 0, + () => { + // show prompt for skip, blocking inputs for 1 second + globalScene.ui.showText( + i18next.t("battle:eggSkipPrompt", { + eggsToHatch: eggsToHatchCount, + }), + 0, + ); + globalScene.ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + this.hatchEggsSkipped(eggsToHatch); + this.showSummary(); + }, + () => { + this.hatchEggsRegular(eggsToHatch); + this.end(); + }, + null, + null, + null, + 1000, + true, + ); }, - null, null, null, 1000, true - ); - }, 100, true); - } else if (eggsToHatchCount >= this.minEggsToSkip && this.scene.eggSkipPreference === 2) { - this.scene.queueMessage(i18next.t("battle:eggHatching")); + 100, + true, + ); + } else if (eggsToHatchCount >= this.minEggsToSkip && globalScene.eggSkipPreference === 2) { + globalScene.queueMessage(i18next.t("battle:eggHatching")); this.hatchEggsSkipped(eggsToHatch); this.showSummary(); } else { // regular hatches, no summary - this.scene.queueMessage(i18next.t("battle:eggHatching")); + globalScene.queueMessage(i18next.t("battle:eggHatching")); this.hatchEggsRegular(eggsToHatch); this.end(); } @@ -67,7 +82,7 @@ export class EggLapsePhase extends Phase { hatchEggsRegular(eggsToHatch: Egg[]) { let eggsToHatchCount: number = eggsToHatch.length; for (const egg of eggsToHatch) { - this.scene.unshiftPhase(new EggHatchPhase(this.scene, this, egg, eggsToHatchCount)); + globalScene.unshiftPhase(new EggHatchPhase(this, egg, eggsToHatchCount)); eggsToHatchCount--; } } @@ -83,7 +98,7 @@ export class EggLapsePhase extends Phase { } showSummary() { - this.scene.unshiftPhase(new EggSummaryPhase(this.scene, this.eggHatchData)); + globalScene.unshiftPhase(new EggSummaryPhase(this.eggHatchData)); this.end(); } @@ -93,11 +108,11 @@ export class EggLapsePhase extends Phase { * @param egg egg to hatch */ hatchEggSilently(egg: Egg) { - const eggIndex = this.scene.gameData.eggs.findIndex(e => e.id === egg.id); + const eggIndex = globalScene.gameData.eggs.findIndex(e => e.id === egg.id); if (eggIndex === -1) { return this.end(); } - this.scene.gameData.eggs.splice(eggIndex, 1); + globalScene.gameData.eggs.splice(eggIndex, 1); const data = this.generatePokemon(egg); const pokemon = data.pokemon; @@ -106,18 +121,17 @@ export class EggLapsePhase extends Phase { } if (pokemon.species.subLegendary) { - this.scene.validateAchv(achvs.HATCH_SUB_LEGENDARY); + globalScene.validateAchv(achvs.HATCH_SUB_LEGENDARY); } if (pokemon.species.legendary) { - this.scene.validateAchv(achvs.HATCH_LEGENDARY); + globalScene.validateAchv(achvs.HATCH_LEGENDARY); } if (pokemon.species.mythical) { - this.scene.validateAchv(achvs.HATCH_MYTHICAL); + globalScene.validateAchv(achvs.HATCH_MYTHICAL); } if (pokemon.isShiny()) { - this.scene.validateAchv(achvs.HATCH_SHINY); + globalScene.validateAchv(achvs.HATCH_SHINY); } - } /** @@ -128,14 +142,16 @@ export class EggLapsePhase extends Phase { generatePokemon(egg: Egg): EggHatchData { let ret: PlayerPokemon; let newHatchData: EggHatchData; - this.scene.executeWithSeedOffset(() => { - ret = egg.generatePlayerPokemon(this.scene); - newHatchData = new EggHatchData(this.scene, ret, egg.eggMoveIndex); - newHatchData.setDex(); - this.eggHatchData.push(newHatchData); - - }, egg.id, EGG_SEED.toString()); + globalScene.executeWithSeedOffset( + () => { + ret = egg.generatePlayerPokemon(); + newHatchData = new EggHatchData(ret, egg.eggMoveIndex); + newHatchData.setDex(); + this.eggHatchData.push(newHatchData); + }, + egg.id, + EGG_SEED.toString(), + ); return newHatchData!; } - } diff --git a/src/phases/egg-summary-phase.ts b/src/phases/egg-summary-phase.ts index b673eb4887b..9d9259d1e67 100644 --- a/src/phases/egg-summary-phase.ts +++ b/src/phases/egg-summary-phase.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; import { Mode } from "#app/ui/ui"; -import { EggHatchData } from "#app/data/egg-hatch-data"; +import type { EggHatchData } from "#app/data/egg-hatch-data"; /** * Class that represents the egg summary phase @@ -11,8 +11,8 @@ import { EggHatchData } from "#app/data/egg-hatch-data"; export class EggSummaryPhase extends Phase { private eggHatchData: EggHatchData[]; - constructor(scene: BattleScene, eggHatchData: EggHatchData[]) { - super(scene); + constructor(eggHatchData: EggHatchData[]) { + super(); this.eggHatchData = eggHatchData; } @@ -22,10 +22,9 @@ export class EggSummaryPhase extends Phase { // updates next pokemon once the current update has been completed const updateNextPokemon = (i: number) => { if (i >= this.eggHatchData.length) { - this.scene.ui.setModeForceTransition(Mode.EGG_HATCH_SUMMARY, this.eggHatchData).then(() => { - this.scene.fadeOutBgm(undefined, false); + globalScene.ui.setModeForceTransition(Mode.EGG_HATCH_SUMMARY, this.eggHatchData).then(() => { + globalScene.fadeOutBgm(undefined, false); }); - } else { this.eggHatchData[i].setDex(); this.eggHatchData[i].updatePokemon().then(() => { @@ -36,12 +35,11 @@ export class EggSummaryPhase extends Phase { } }; updateNextPokemon(0); - } end() { - this.scene.time.delayedCall(250, () => this.scene.setModifiersVisible(true)); - this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => { + globalScene.time.delayedCall(250, () => globalScene.setModifiersVisible(true)); + globalScene.ui.setModeForceTransition(Mode.MESSAGE).then(() => { super.end(); }); } diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index b7071c4cc6f..5decab522b5 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -1,47 +1,50 @@ -import BattleScene from "#app/battle-scene"; import { BattlerIndex, BattleType } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; import { applyAbAttrs, SyncEncounterNatureAbAttr } from "#app/data/ability"; +import { initEncounterAnims, loadEncounterAnimAssets } from "#app/data/battle-anims"; import { getCharVariantFromDialogue } from "#app/data/dialogue"; +import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { doTrainerExclamation } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { getGoldenBugNetSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { TrainerSlot } from "#app/data/trainer-config"; import { getRandomWeatherType } from "#app/data/weather"; -import { BattleSpec } from "#app/enums/battle-spec"; -import { PlayerGender } from "#app/enums/player-gender"; -import { Species } from "#app/enums/species"; import { EncounterPhaseEvent } from "#app/events/battle-scene"; -import Pokemon, { FieldPosition } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { FieldPosition } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; -import { ModifierPoolType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import { BoostBugSpawnModifier, IvScannerModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier"; +import { ModifierPoolType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import Overrides from "#app/overrides"; +import { BattlePhase } from "#app/phases/battle-phase"; +import { CheckSwitchPhase } from "#app/phases/check-switch-phase"; +import { GameOverPhase } from "#app/phases/game-over-phase"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { PostSummonPhase } from "#app/phases/post-summon-phase"; +import { ReturnPhase } from "#app/phases/return-phase"; +import { ScanIvsPhase } from "#app/phases/scan-ivs-phase"; +import { ShinySparklePhase } from "#app/phases/shiny-sparkle-phase"; +import { SummonPhase } from "#app/phases/summon-phase"; +import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; import { achvs } from "#app/system/achv"; import { handleTutorial, Tutorial } from "#app/tutorial"; import { Mode } from "#app/ui/ui"; -import i18next from "i18next"; -import { BattlePhase } from "./battle-phase"; -import * as Utils from "#app/utils"; -import { randSeedInt } from "#app/utils"; -import { CheckSwitchPhase } from "./check-switch-phase"; -import { GameOverPhase } from "./game-over-phase"; -import { PostSummonPhase } from "./post-summon-phase"; -import { ReturnPhase } from "./return-phase"; -import { ScanIvsPhase } from "./scan-ivs-phase"; -import { ShinySparklePhase } from "./shiny-sparkle-phase"; -import { SummonPhase } from "./summon-phase"; -import { ToggleDoublePositionPhase } from "./toggle-double-position-phase"; -import Overrides from "#app/overrides"; -import { initEncounterAnims, loadEncounterAnimAssets } from "#app/data/battle-anims"; -import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; -import { doTrainerExclamation } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; -import { getGoldenBugNetSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { randSeedInt, randSeedItem } from "#app/utils"; +import { BattleSpec } from "#enums/battle-spec"; 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"; +import { getNatureName } from "#app/data/nature"; export class EncounterPhase extends BattlePhase { private loaded: boolean; - constructor(scene: BattleScene, loaded?: boolean) { - super(scene); + constructor(loaded?: boolean) { + super(); this.loaded = !!loaded; } @@ -49,26 +52,26 @@ export class EncounterPhase extends BattlePhase { start() { super.start(); - this.scene.updateGameInfo(); + globalScene.updateGameInfo(); - this.scene.initSession(); + globalScene.initSession(); - this.scene.eventTarget.dispatchEvent(new EncounterPhaseEvent()); + globalScene.eventTarget.dispatchEvent(new EncounterPhaseEvent()); // Failsafe if players somehow skip floor 200 in classic mode - if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) { - this.scene.unshiftPhase(new GameOverPhase(this.scene)); + if (globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex > 200) { + globalScene.unshiftPhase(new GameOverPhase()); } const loadEnemyAssets: Promise[] = []; - const battle = this.scene.currentBattle; + const battle = globalScene.currentBattle; // Generate and Init Mystery Encounter if (battle.isBattleMysteryEncounter() && !battle.mysteryEncounter) { - this.scene.executeWithSeedOffset(() => { + globalScene.executeWithSeedOffset(() => { const currentSessionEncounterType = battle.mysteryEncounterType; - battle.mysteryEncounter = this.scene.getMysteryEncounter(currentSessionEncounterType); + battle.mysteryEncounter = globalScene.getMysteryEncounter(currentSessionEncounterType); }, battle.waveIndex * 16); } const mysteryEncounter = battle.mysteryEncounter; @@ -76,21 +79,23 @@ export class EncounterPhase extends BattlePhase { // If ME has an onInit() function, call it // Usually used for calculating rand data before initializing anything visual // Also prepopulates any dialogue tokens from encounter/option requirements - this.scene.executeWithSeedOffset(() => { + globalScene.executeWithSeedOffset(() => { if (mysteryEncounter.onInit) { - mysteryEncounter.onInit(this.scene); + mysteryEncounter.onInit(); } - mysteryEncounter.populateDialogueTokensFromRequirements(this.scene); + mysteryEncounter.populateDialogueTokensFromRequirements(); }, battle.waveIndex); // Add any special encounter animations to load if (mysteryEncounter.encounterAnimations && mysteryEncounter.encounterAnimations.length > 0) { - loadEnemyAssets.push(initEncounterAnims(this.scene, mysteryEncounter.encounterAnimations).then(() => loadEncounterAnimAssets(this.scene, true))); + loadEnemyAssets.push( + initEncounterAnims(mysteryEncounter.encounterAnimations).then(() => loadEncounterAnimAssets(true)), + ); } // Add intro visuals for mystery encounter - mysteryEncounter.initIntroVisuals(this.scene); - this.scene.field.add(mysteryEncounter.introVisuals!); + mysteryEncounter.initIntroVisuals(); + globalScene.field.add(mysteryEncounter.introVisuals!); } let totalBst = 0; @@ -102,37 +107,63 @@ export class EncounterPhase extends BattlePhase { } if (!this.loaded) { if (battle.battleType === BattleType.TRAINER) { + //resets hitRecCount during Trainer ecnounter + for (const pokemon of globalScene.getPlayerParty()) { + if (pokemon) { + pokemon.customPokemonData.resetHitReceivedCount(); + } + } battle.enemyParty[e] = battle.trainer?.genPartyMember(e)!; // TODO:: is the bang correct here? } else { - let enemySpecies = this.scene.randomSpecies(battle.waveIndex, level, true); + let enemySpecies = globalScene.randomSpecies(battle.waveIndex, level, true); // If player has golden bug net, rolls 10% chance to replace non-boss wave wild species from the golden bug net bug pool - if (this.scene.findModifier(m => m instanceof BoostBugSpawnModifier) - && !this.scene.gameMode.isBoss(battle.waveIndex) - && this.scene.arena.biomeType !== Biome.END - && randSeedInt(10) === 0) { + if ( + globalScene.findModifier(m => m instanceof BoostBugSpawnModifier) && + !globalScene.gameMode.isBoss(battle.waveIndex) && + globalScene.arena.biomeType !== Biome.END && + randSeedInt(10) === 0 + ) { enemySpecies = getGoldenBugNetSpecies(level); } - battle.enemyParty[e] = this.scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, !!this.scene.getEncounterBossSegments(battle.waveIndex, level, enemySpecies)); - if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + battle.enemyParty[e] = globalScene.addEnemyPokemon( + enemySpecies, + level, + TrainerSlot.NONE, + !!globalScene.getEncounterBossSegments(battle.waveIndex, level, enemySpecies), + ); + if (globalScene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { battle.enemyParty[e].ivs = new Array(6).fill(31); } - this.scene.getParty().slice(0, !battle.double ? 1 : 2).reverse().forEach(playerPokemon => { - applyAbAttrs(SyncEncounterNatureAbAttr, playerPokemon, null, false, battle.enemyParty[e]); - }); + // biome-ignore lint/complexity/noForEach: Improves readability + globalScene + .getPlayerParty() + .slice(0, !battle.double ? 1 : 2) + .reverse() + .forEach(playerPokemon => { + applyAbAttrs(SyncEncounterNatureAbAttr, playerPokemon, null, false, battle.enemyParty[e]); + }); } } - const enemyPokemon = this.scene.getEnemyParty()[e]; + const enemyPokemon = globalScene.getEnemyParty()[e]; if (e < (battle.double ? 2 : 1)) { enemyPokemon.setX(-66 + enemyPokemon.getFieldPositionOffset()[0]); enemyPokemon.resetSummonData(); } if (!this.loaded) { - this.scene.gameData.setPokemonSeen(enemyPokemon, true, battle.battleType === BattleType.TRAINER || battle?.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE); + globalScene.gameData.setPokemonSeen( + enemyPokemon, + true, + battle.battleType === BattleType.TRAINER || + battle?.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE, + ); } if (enemyPokemon.species.speciesId === Species.ETERNATUS) { - if (this.scene.gameMode.isClassic && (battle.battleSpec === BattleSpec.FINAL_BOSS || this.scene.gameMode.isWaveFinal(battle.waveIndex))) { + if ( + globalScene.gameMode.isClassic && + (battle.battleSpec === BattleSpec.FINAL_BOSS || globalScene.gameMode.isWaveFinal(battle.waveIndex)) + ) { if (battle.battleSpec !== BattleSpec.FINAL_BOSS) { enemyPokemon.formIndex = 1; enemyPokemon.updateScale(); @@ -141,10 +172,6 @@ export class EncounterPhase extends BattlePhase { } else if (!(battle.waveIndex % 1000)) { enemyPokemon.formIndex = 1; enemyPokemon.updateScale(); - const bossMBH = this.scene.findModifier(m => m instanceof TurnHeldItemTransferModifier && m.pokemonId === enemyPokemon.id, false) as TurnHeldItemTransferModifier; - this.scene.removeModifier(bossMBH!); - bossMBH?.setTransferrableFalse(); - this.scene.addEnemyModifier(bossMBH!); } } @@ -152,32 +179,62 @@ export class EncounterPhase extends BattlePhase { loadEnemyAssets.push(enemyPokemon.loadAssets()); - console.log(`Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, `Species ID: ${enemyPokemon.species.speciesId}`, `Stats: ${enemyPokemon.stats}`, `Ability: ${enemyPokemon.getAbility().name}`, `Passive Ability: ${enemyPokemon.getPassiveAbility().name}`); + const stats: string[] = [ + `HP: ${enemyPokemon.stats[0]} (${enemyPokemon.ivs[0]})`, + ` Atk: ${enemyPokemon.stats[1]} (${enemyPokemon.ivs[1]})`, + ` Def: ${enemyPokemon.stats[2]} (${enemyPokemon.ivs[2]})`, + ` Spatk: ${enemyPokemon.stats[3]} (${enemyPokemon.ivs[3]})`, + ` Spdef: ${enemyPokemon.stats[4]} (${enemyPokemon.ivs[4]})`, + ` Spd: ${enemyPokemon.stats[5]} (${enemyPokemon.ivs[5]})`, + ]; + const moveset: string[] = []; + for (const move of enemyPokemon.getMoveset()) { + moveset.push(move!.getName()); // TODO: remove `!` after moveset-null removal PR + } + + console.log( + `Pokemon: ${getPokemonNameWithAffix(enemyPokemon)}`, + `| Species ID: ${enemyPokemon.species.speciesId}`, + `| Nature: ${getNatureName(enemyPokemon.nature, true, true, true)}`, + ); + console.log(`Stats (IVs): ${stats}`); + console.log( + `Ability: ${enemyPokemon.getAbility().name}`, + `| Passive Ability${enemyPokemon.hasPassive() ? "" : " (inactive)"}: ${enemyPokemon.getPassiveAbility().name}`, + `${enemyPokemon.isBoss() ? `| Boss Bars: ${enemyPokemon.bossSegments}` : ""}`, + ); + console.log("Moveset:", moveset); return true; }); - if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { - this.scene.validateAchv(achvs.SHINY_PARTY); + if (globalScene.getPlayerParty().filter(p => p.isShiny()).length === PLAYER_PARTY_MAX_SIZE) { + globalScene.validateAchv(achvs.SHINY_PARTY); } if (battle.battleType === BattleType.TRAINER) { loadEnemyAssets.push(battle.trainer?.loadAssets().then(() => battle.trainer?.initSprite())!); // TODO: is this bang correct? } else if (battle.isBattleMysteryEncounter()) { if (battle.mysteryEncounter?.introVisuals) { - loadEnemyAssets.push(battle.mysteryEncounter.introVisuals.loadAssets().then(() => battle.mysteryEncounter!.introVisuals!.initSprite())); + loadEnemyAssets.push( + battle.mysteryEncounter.introVisuals + .loadAssets() + .then(() => battle.mysteryEncounter!.introVisuals!.initSprite()), + ); } if (battle.mysteryEncounter?.loadAssets && battle.mysteryEncounter.loadAssets.length > 0) { loadEnemyAssets.push(...battle.mysteryEncounter.loadAssets); } // Load Mystery Encounter Exclamation bubble and sfx - loadEnemyAssets.push(new Promise(resolve => { - this.scene.loadSe("GEN8- Exclaim", "battle_anims", "GEN8- Exclaim.wav"); - this.scene.loadImage("encounter_exclaim", "mystery-encounters"); - this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); - if (!this.scene.load.isLoading()) { - this.scene.load.start(); - } - })); + loadEnemyAssets.push( + new Promise(resolve => { + globalScene.loadSe("GEN8- Exclaim", "battle_anims", "GEN8- Exclaim.wav"); + globalScene.loadImage("encounter_exclaim", "mystery-encounters"); + globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); + if (!globalScene.load.isLoading()) { + globalScene.load.start(); + } + }), + ); } else { const overridedBossSegments = Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1; // for double battles, reduce the health segments for boss Pokemon unless there is an override @@ -185,7 +242,10 @@ export class EncounterPhase extends BattlePhase { for (const enemyPokemon of battle.enemyParty) { // If the enemy pokemon is a boss and wasn't populated from data source, then update the number of segments if (enemyPokemon.isBoss() && !enemyPokemon.isPopulatedFromDataSource) { - enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst))); + enemyPokemon.setBoss( + true, + Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst)), + ); enemyPokemon.initBattleInfo(); } } @@ -199,16 +259,16 @@ export class EncounterPhase extends BattlePhase { } if (e < (battle.double ? 2 : 1)) { if (battle.battleType === BattleType.WILD) { - this.scene.field.add(enemyPokemon); + globalScene.field.add(enemyPokemon); battle.seenEnemyPartyMemberIds.add(enemyPokemon.id); - const playerPokemon = this.scene.getPlayerPokemon(); - if (playerPokemon?.visible) { - this.scene.field.moveBelow(enemyPokemon as Pokemon, playerPokemon); + const playerPokemon = globalScene.getPlayerPokemon(); + if (playerPokemon?.isOnField()) { + globalScene.field.moveBelow(enemyPokemon as Pokemon, playerPokemon); } enemyPokemon.tint(0, 0.5); } else if (battle.battleType === BattleType.TRAINER) { enemyPokemon.setVisible(false); - this.scene.currentBattle.trainer?.tint(0, 0.5); + globalScene.currentBattle.trainer?.tint(0, 0.5); } if (battle.double) { enemyPokemon.setFieldPosition(e ? FieldPosition.RIGHT : FieldPosition.LEFT); @@ -218,178 +278,217 @@ 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(); + regenerateModifierPoolThresholds( + globalScene.getEnemyField(), + battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, + ); + globalScene.generateEnemyModifiers(); + overrideModifiers(false); + + for (const enemy of globalScene.getEnemyField()) { + overrideHeldItems(enemy, false); + } } - this.scene.ui.setMode(Mode.MESSAGE).then(() => { + if (battle.battleType === BattleType.TRAINER) { + globalScene.currentBattle.trainer!.genAI(globalScene.getEnemyParty()); + } + + globalScene.ui.setMode(Mode.MESSAGE).then(() => { if (!this.loaded) { this.trySetWeatherIfNewBiome(); // Set weather before session gets saved - this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || (this.scene.lastSavePlayTime ?? 0) >= 300).then(success => { - this.scene.disableMenu = false; - if (!success) { - return this.scene.reset(true); - } - this.doEncounter(); - this.scene.resetSeed(); - }); + // Game syncs to server on waves X1 and X6 (As of 1.2.0) + globalScene.gameData + .saveAll(true, battle.waveIndex % 5 === 1 || (globalScene.lastSavePlayTime ?? 0) >= 300) + .then(success => { + globalScene.disableMenu = false; + if (!success) { + return globalScene.reset(true); + } + this.doEncounter(); + globalScene.resetSeed(); + }); } else { this.doEncounter(); - this.scene.resetSeed(); + globalScene.resetSeed(); } }); }); } doEncounter() { - this.scene.playBgm(undefined, true); - this.scene.updateModifiers(false); - this.scene.setFieldScale(1); + globalScene.playBgm(undefined, true); + globalScene.updateModifiers(false); + globalScene.setFieldScale(1); - /*if (startingWave > 10) { - for (let m = 0; m < Math.min(Math.floor(startingWave / 10), 99); m++) - this.scene.addModifier(getPlayerModifierTypeOptionsForWave((m + 1) * 10, 1, this.scene.getParty())[0].type.newModifier(), true); - this.scene.updateModifiers(true); - }*/ - - const { battleType, waveIndex } = this.scene.currentBattle; - if (this.scene.isMysteryEncounterValidForWave(battleType, waveIndex) && !this.scene.currentBattle.isBattleMysteryEncounter()) { + const { battleType, waveIndex } = globalScene.currentBattle; + if ( + globalScene.isMysteryEncounterValidForWave(battleType, waveIndex) && + !globalScene.currentBattle.isBattleMysteryEncounter() + ) { // Increment ME spawn chance if an ME could have spawned but did not // Only do this AFTER session has been saved to avoid duplicating increments - this.scene.mysteryEncounterSaveData.encounterSpawnChance += WEIGHT_INCREMENT_ON_SPAWN_MISS; + globalScene.mysteryEncounterSaveData.encounterSpawnChance += WEIGHT_INCREMENT_ON_SPAWN_MISS; } - for (const pokemon of this.scene.getParty()) { + for (const pokemon of globalScene.getPlayerParty()) { if (pokemon) { pokemon.resetBattleData(); } } - const enemyField = this.scene.getEnemyField(); - this.scene.tweens.add({ - targets: [ this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer ].flat(), - x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300, + const enemyField = globalScene.getEnemyField(); + globalScene.tweens.add({ + targets: [ + globalScene.arenaEnemy, + globalScene.currentBattle.trainer, + enemyField, + globalScene.arenaPlayer, + globalScene.trainer, + ].flat(), + x: (_target, _key, value, fieldIndex: number) => (fieldIndex < 2 + enemyField.length ? value + 300 : value - 300), duration: 2000, onComplete: () => { if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); } - } + }, }); - const encounterIntroVisuals = this.scene.currentBattle?.mysteryEncounter?.introVisuals; + const encounterIntroVisuals = globalScene.currentBattle?.mysteryEncounter?.introVisuals; if (encounterIntroVisuals) { const enterFromRight = encounterIntroVisuals.enterFromRight; if (enterFromRight) { encounterIntroVisuals.x += 500; } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: encounterIntroVisuals, x: enterFromRight ? "-=200" : "+=300", - duration: 2000 + duration: 2000, }); } } getEncounterMessage(): string { - const enemyField = this.scene.getEnemyField(); + const enemyField = globalScene.getEnemyField(); - if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - return i18next.t("battle:bossAppeared", { bossName: getPokemonNameWithAffix(enemyField[0]) }); + if (globalScene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + return i18next.t("battle:bossAppeared", { + bossName: getPokemonNameWithAffix(enemyField[0]), + }); } - if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - if (this.scene.currentBattle.double) { - return i18next.t("battle:trainerAppearedDouble", { trainerName: this.scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); - - } else { - return i18next.t("battle:trainerAppeared", { trainerName: this.scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); + if (globalScene.currentBattle.battleType === BattleType.TRAINER) { + if (globalScene.currentBattle.double) { + return i18next.t("battle:trainerAppearedDouble", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }); } + return i18next.t("battle:trainerAppeared", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }); } return enemyField.length === 1 - ? i18next.t("battle:singleWildAppeared", { pokemonName: enemyField[0].getNameToRender() }) - : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].getNameToRender(), pokemonName2: enemyField[1].getNameToRender() }); + ? i18next.t("battle:singleWildAppeared", { + pokemonName: enemyField[0].getNameToRender(), + }) + : i18next.t("battle:multiWildAppeared", { + pokemonName1: enemyField[0].getNameToRender(), + pokemonName2: enemyField[1].getNameToRender(), + }); } - doEncounterCommon(showEncounterMessage: boolean = true) { - const enemyField = this.scene.getEnemyField(); + doEncounterCommon(showEncounterMessage = true) { + const enemyField = globalScene.getEnemyField(); - if (this.scene.currentBattle.battleType === BattleType.WILD) { - enemyField.forEach(enemyPokemon => { + if (globalScene.currentBattle.battleType === BattleType.WILD) { + for (const enemyPokemon of enemyField) { enemyPokemon.untint(100, "Sine.easeOut"); enemyPokemon.cry(); enemyPokemon.showInfo(); if (enemyPokemon.isShiny()) { - this.scene.validateAchv(achvs.SEE_SHINY); + globalScene.validateAchv(achvs.SEE_SHINY); } - }); - this.scene.updateFieldScale(); + } + globalScene.updateFieldScale(); if (showEncounterMessage) { - this.scene.ui.showText(this.getEncounterMessage(), null, () => this.end(), 1500); + globalScene.ui.showText(this.getEncounterMessage(), null, () => this.end(), 1500); } else { this.end(); } - } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - const trainer = this.scene.currentBattle.trainer; + } else if (globalScene.currentBattle.battleType === BattleType.TRAINER) { + const trainer = globalScene.currentBattle.trainer; trainer?.untint(100, "Sine.easeOut"); trainer?.playAnim(); const doSummon = () => { - this.scene.currentBattle.started = true; - this.scene.playBgm(undefined); - this.scene.pbTray.showPbTray(this.scene.getParty()); - this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); + globalScene.currentBattle.started = true; + globalScene.playBgm(undefined); + globalScene.pbTray.showPbTray(globalScene.getPlayerParty()); + globalScene.pbTrayEnemy.showPbTray(globalScene.getEnemyParty()); const doTrainerSummon = () => { this.hideEnemyTrainer(); - const availablePartyMembers = this.scene.getEnemyParty().filter(p => !p.isFainted()).length; - this.scene.unshiftPhase(new SummonPhase(this.scene, 0, false)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) { - this.scene.unshiftPhase(new SummonPhase(this.scene, 1, false)); + const availablePartyMembers = globalScene.getEnemyParty().filter(p => !p.isFainted()).length; + globalScene.unshiftPhase(new SummonPhase(0, false)); + if (globalScene.currentBattle.double && availablePartyMembers > 1) { + globalScene.unshiftPhase(new SummonPhase(1, false)); } this.end(); }; if (showEncounterMessage) { - this.scene.ui.showText(this.getEncounterMessage(), null, doTrainerSummon, 1500, true); + globalScene.ui.showText(this.getEncounterMessage(), null, doTrainerSummon, 1500, true); } else { doTrainerSummon(); } }; - const encounterMessages = this.scene.currentBattle.trainer?.getEncounterMessages(); + const encounterMessages = globalScene.currentBattle.trainer?.getEncounterMessages(); if (!encounterMessages?.length) { doSummon(); } else { let message: string; - this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.waveIndex); + globalScene.executeWithSeedOffset( + () => (message = randSeedItem(encounterMessages)), + globalScene.currentBattle.waveIndex, + ); message = message!; // tell TS compiler it's defined now const showDialogueAndSummon = () => { - this.scene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => { - this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => doSummon())); + globalScene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => { + globalScene.charSprite.hide().then(() => globalScene.hideFieldOverlay(250).then(() => doSummon())); }); }; - if (this.scene.currentBattle.trainer?.config.hasCharSprite && !this.scene.ui.shouldSkipDialogue(message)) { - this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); // TODO: is this bang correct? + if (globalScene.currentBattle.trainer?.config.hasCharSprite && !globalScene.ui.shouldSkipDialogue(message)) { + globalScene + .showFieldOverlay(500) + .then(() => + globalScene.charSprite + .showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])) + .then(() => showDialogueAndSummon()), + ); // TODO: is this bang correct? } else { showDialogueAndSummon(); } } - } else if (this.scene.currentBattle.isBattleMysteryEncounter() && this.scene.currentBattle.mysteryEncounter) { - const encounter = this.scene.currentBattle.mysteryEncounter; + } else if (globalScene.currentBattle.isBattleMysteryEncounter() && globalScene.currentBattle.mysteryEncounter) { + const encounter = globalScene.currentBattle.mysteryEncounter; const introVisuals = encounter.introVisuals; introVisuals?.playAnim(); if (encounter.onVisualsStart) { - encounter.onVisualsStart(this.scene); + encounter.onVisualsStart(); + } else if (encounter.spriteConfigs && introVisuals) { + // If the encounter doesn't have any special visual intro, show sparkle for shiny Pokemon + introVisuals.playShinySparkles(); } const doEncounter = () => { const doShowEncounterOptions = () => { - this.scene.ui.clearText(); - this.scene.ui.getMessageHandler().hideNameText(); + globalScene.ui.clearText(); + globalScene.ui.getMessageHandler().hideNameText(); - this.scene.unshiftPhase(new MysteryEncounterPhase(this.scene)); + globalScene.unshiftPhase(new MysteryEncounterPhase()); this.end(); }; @@ -403,13 +502,20 @@ export class EncounterPhase extends BattlePhase { const showNextDialogue = () => { const nextAction = i === introDialogue.length - 1 ? doShowEncounterOptions : showNextDialogue; const dialogue = introDialogue[i]; - const title = getEncounterText(this.scene, dialogue?.speaker); - const text = getEncounterText(this.scene, dialogue.text)!; + const title = getEncounterText(dialogue?.speaker); + const text = getEncounterText(dialogue.text)!; i++; if (title) { - this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0); + globalScene.ui.showDialogue( + text, + title, + null, + nextAction, + 0, + i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0, + ); } else { - this.scene.ui.showText(text, null, nextAction, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0, true); + globalScene.ui.showText(text, null, nextAction, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } }; @@ -427,106 +533,143 @@ export class EncounterPhase extends BattlePhase { if (!encounterMessage) { doEncounter(); } else { - doTrainerExclamation(this.scene); - this.scene.ui.showDialogue(encounterMessage, "???", null, () => { - this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => doEncounter())); + doTrainerExclamation(); + globalScene.ui.showDialogue(encounterMessage, "???", null, () => { + globalScene.charSprite.hide().then(() => globalScene.hideFieldOverlay(250).then(() => doEncounter())); }); } } } end() { - const enemyField = this.scene.getEnemyField(); + const enemyField = globalScene.getEnemyField(); enemyField.forEach((enemyPokemon, e) => { if (enemyPokemon.isShiny()) { - this.scene.unshiftPhase(new ShinySparklePhase(this.scene, BattlerIndex.ENEMY + e)); + globalScene.unshiftPhase(new ShinySparklePhase(BattlerIndex.ENEMY + e)); + } + /** This sets Eternatus' held item to be untransferrable, preventing it from being stolen */ + if ( + enemyPokemon.species.speciesId === Species.ETERNATUS && + (globalScene.gameMode.isBattleClassicFinalBoss(globalScene.currentBattle.waveIndex) || + globalScene.gameMode.isEndlessMajorBoss(globalScene.currentBattle.waveIndex)) + ) { + const enemyMBH = globalScene.findModifier( + m => m instanceof TurnHeldItemTransferModifier, + false, + ) as TurnHeldItemTransferModifier; + if (enemyMBH) { + globalScene.removeModifier(enemyMBH, true); + enemyMBH.setTransferrableFalse(); + globalScene.addEnemyModifier(enemyMBH); + } } }); - if (![ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(this.scene.currentBattle.battleType)) { - enemyField.map(p => this.scene.pushConditionalPhase(new PostSummonPhase(this.scene, p.getBattlerIndex()), () => { - // if there is not a player party, we can't continue - if (!this.scene.getParty()?.length) { - return false; - } - // how many player pokemon are on the field ? - const pokemonsOnFieldCount = this.scene.getParty().filter(p => p.isOnField()).length; - // if it's a 2vs1, there will never be a 2nd pokemon on our field even - const requiredPokemonsOnField = Math.min(this.scene.getParty().filter((p) => !p.isFainted()).length, 2); - // if it's a double, there should be 2, otherwise 1 - if (this.scene.currentBattle.double) { - return pokemonsOnFieldCount === requiredPokemonsOnField; - } - return pokemonsOnFieldCount === 1; - })); - const ivScannerModifier = this.scene.findModifier(m => m instanceof IvScannerModifier); + if (![BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(globalScene.currentBattle.battleType)) { + enemyField.map(p => + globalScene.pushConditionalPhase(new PostSummonPhase(p.getBattlerIndex()), () => { + // if there is not a player party, we can't continue + if (!globalScene.getPlayerParty().length) { + return false; + } + // how many player pokemon are on the field ? + const pokemonsOnFieldCount = globalScene.getPlayerParty().filter(p => p.isOnField()).length; + // if it's a 2vs1, there will never be a 2nd pokemon on our field even + const requiredPokemonsOnField = Math.min(globalScene.getPlayerParty().filter(p => !p.isFainted()).length, 2); + // if it's a double, there should be 2, otherwise 1 + if (globalScene.currentBattle.double) { + return pokemonsOnFieldCount === requiredPokemonsOnField; + } + return pokemonsOnFieldCount === 1; + }), + ); + const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { - enemyField.map(p => this.scene.pushPhase(new ScanIvsPhase(this.scene, p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex()))); } } if (!this.loaded) { - const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()); + const availablePartyMembers = globalScene.getPokemonAllowedInBattle(); if (!availablePartyMembers[0].isOnField()) { - this.scene.pushPhase(new SummonPhase(this.scene, 0)); + globalScene.pushPhase(new SummonPhase(0)); } - if (this.scene.currentBattle.double) { + if (globalScene.currentBattle.double) { if (availablePartyMembers.length > 1) { - this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true)); + globalScene.pushPhase(new ToggleDoublePositionPhase(true)); if (!availablePartyMembers[1].isOnField()) { - this.scene.pushPhase(new SummonPhase(this.scene, 1)); + globalScene.pushPhase(new SummonPhase(1)); } } } else { if (availablePartyMembers.length > 1 && availablePartyMembers[1].isOnField()) { - this.scene.pushPhase(new ReturnPhase(this.scene, 1)); + globalScene.pushPhase(new ReturnPhase(1)); } - this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, false)); + globalScene.pushPhase(new ToggleDoublePositionPhase(false)); } - if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { - const minPartySize = this.scene.currentBattle.double ? 2 : 1; + if ( + globalScene.currentBattle.battleType !== BattleType.TRAINER && + (globalScene.currentBattle.waveIndex > 1 || !globalScene.gameMode.isDaily) + ) { + const minPartySize = globalScene.currentBattle.double ? 2 : 1; if (availablePartyMembers.length > minPartySize) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); - if (this.scene.currentBattle.double) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); + globalScene.pushPhase(new CheckSwitchPhase(0, globalScene.currentBattle.double)); + if (globalScene.currentBattle.double) { + globalScene.pushPhase(new CheckSwitchPhase(1, globalScene.currentBattle.double)); } } } } - handleTutorial(this.scene, Tutorial.Access_Menu).then(() => super.end()); + handleTutorial(Tutorial.Access_Menu).then(() => super.end()); } tryOverrideForBattleSpec(): boolean { - switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - const enemy = this.scene.getEnemyPokemon(); - this.scene.ui.showText(this.getEncounterMessage(), null, () => { - const localizationKey = "battleSpecDialogue:encounter"; - if (this.scene.ui.shouldSkipDialogue(localizationKey)) { - // Logging mirrors logging found in dialogue-ui-handler - console.log(`Dialogue ${localizationKey} skipped`); - this.doEncounterCommon(false); - } else { - const count = 5643853 + this.scene.gameData.gameStats.classicSessionsPlayed; - // The line below checks if an English ordinal is necessary or not based on whether an entry for encounterLocalizationKey exists in the language or not. - const ordinalUsed = !i18next.exists(localizationKey, { fallbackLng: []}) || i18next.resolvedLanguage === "en" ? i18next.t("battleSpecDialogue:key", { count: count, ordinal: true }) : ""; - const cycleCount = count.toLocaleString() + ordinalUsed; - const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; - const genderStr = PlayerGender[genderIndex].toLowerCase(); - const encounterDialogue = i18next.t(localizationKey, { context: genderStr, cycleCount: cycleCount }); - if (!this.scene.gameData.getSeenDialogues()[localizationKey]) { - this.scene.gameData.saveSeenDialogue(localizationKey); - } - this.scene.ui.showDialogue(encounterDialogue, enemy?.species.name, null, () => { + switch (globalScene.currentBattle.battleSpec) { + case BattleSpec.FINAL_BOSS: { + const enemy = globalScene.getEnemyPokemon(); + globalScene.ui.showText( + this.getEncounterMessage(), + null, + () => { + const localizationKey = "battleSpecDialogue:encounter"; + if (globalScene.ui.shouldSkipDialogue(localizationKey)) { + // Logging mirrors logging found in dialogue-ui-handler + console.log(`Dialogue ${localizationKey} skipped`); this.doEncounterCommon(false); - }); - } - }, 1500, true); + } else { + const count = 5643853 + globalScene.gameData.gameStats.classicSessionsPlayed; + // The line below checks if an English ordinal is necessary or not based on whether an entry for encounterLocalizationKey exists in the language or not. + const ordinalUsed = + !i18next.exists(localizationKey, { fallbackLng: [] }) || i18next.resolvedLanguage === "en" + ? i18next.t("battleSpecDialogue:key", { + count: count, + ordinal: true, + }) + : ""; + const cycleCount = count.toLocaleString() + ordinalUsed; + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; + const genderStr = PlayerGender[genderIndex].toLowerCase(); + const encounterDialogue = i18next.t(localizationKey, { + context: genderStr, + cycleCount: cycleCount, + }); + if (!globalScene.gameData.getSeenDialogues()[localizationKey]) { + globalScene.gameData.saveSeenDialogue(localizationKey); + } + globalScene.ui.showDialogue(encounterDialogue, enemy?.species.name, null, () => { + this.doEncounterCommon(false); + }); + } + }, + 1500, + true, + ); return true; + } } return false; } @@ -541,7 +684,7 @@ export class EncounterPhase extends BattlePhase { */ trySetWeatherIfNewBiome(): void { if (!this.loaded) { - this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); + globalScene.arena.trySetWeather(getRandomWeatherType(globalScene.arena), false); } } } diff --git a/src/phases/end-card-phase.ts b/src/phases/end-card-phase.ts index 274a745017a..41775248b67 100644 --- a/src/phases/end-card-phase.ts +++ b/src/phases/end-card-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { PlayerGender } from "#app/enums/player-gender"; import { Phase } from "#app/phase"; import { addTextObject, TextStyle } from "#app/ui/text"; @@ -7,34 +7,44 @@ import i18next from "i18next"; export class EndCardPhase extends Phase { public endCard: Phaser.GameObjects.Image; public text: Phaser.GameObjects.Text; - - constructor(scene: BattleScene) { - super(scene); - } - start(): void { super.start(); - this.scene.ui.getMessageHandler().bg.setVisible(false); - this.scene.ui.getMessageHandler().nameBoxContainer.setVisible(false); + globalScene.ui.getMessageHandler().bg.setVisible(false); + globalScene.ui.getMessageHandler().nameBoxContainer.setVisible(false); - this.endCard = this.scene.add.image(0, 0, `end_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}`); + this.endCard = globalScene.add.image( + 0, + 0, + `end_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}`, + ); this.endCard.setOrigin(0); this.endCard.setScale(0.5); - this.scene.field.add(this.endCard); + globalScene.field.add(this.endCard); - this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, i18next.t("battle:congratulations"), TextStyle.SUMMARY, { fontSize: "128px" }); + this.text = addTextObject( + globalScene.game.canvas.width / 12, + globalScene.game.canvas.height / 6 - 16, + i18next.t("battle:congratulations"), + TextStyle.SUMMARY, + { fontSize: "128px" }, + ); this.text.setOrigin(0.5); - this.scene.field.add(this.text); + globalScene.field.add(this.text); - this.scene.ui.clearText(); + globalScene.ui.clearText(); - this.scene.ui.fadeIn(1000).then(() => { - - this.scene.ui.showText("", null, () => { - this.scene.ui.getMessageHandler().bg.setVisible(true); - this.end(); - }, null, true); + globalScene.ui.fadeIn(1000).then(() => { + globalScene.ui.showText( + "", + null, + () => { + globalScene.ui.getMessageHandler().bg.setVisible(true); + this.end(); + }, + null, + true, + ); }); } } diff --git a/src/phases/end-evolution-phase.ts b/src/phases/end-evolution-phase.ts index 8a6ce52553d..e0bdc7e0d68 100644 --- a/src/phases/end-evolution-phase.ts +++ b/src/phases/end-evolution-phase.ts @@ -1,16 +1,11 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; import { Mode } from "#app/ui/ui"; export class EndEvolutionPhase extends Phase { - - constructor(scene: BattleScene) { - super(scene); - } - start() { super.start(); - this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => this.end()); + globalScene.ui.setModeForceTransition(Mode.MESSAGE).then(() => this.end()); } } diff --git a/src/phases/enemy-command-phase.ts b/src/phases/enemy-command-phase.ts index 3647a237ef1..2e4861aacfc 100644 --- a/src/phases/enemy-command-phase.ts +++ b/src/phases/enemy-command-phase.ts @@ -1,7 +1,9 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { BattlerIndex } from "#app/battle"; import { Command } from "#app/ui/command-ui-handler"; import { FieldPhase } from "./field-phase"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; /** * Phase for determining an enemy AI's action for the next turn. @@ -13,14 +15,14 @@ import { FieldPhase } from "./field-phase"; * @see {@linkcode EnemyPokemon.getNextMove} */ export class EnemyCommandPhase extends FieldPhase { - protected fieldIndex: integer; - protected skipTurn: boolean = false; + protected fieldIndex: number; + protected skipTurn = false; - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene); + constructor(fieldIndex: number) { + super(); this.fieldIndex = fieldIndex; - if (this.scene.currentBattle.mysteryEncounter?.skipEnemyBattleTurns) { + if (globalScene.currentBattle.mysteryEncounter?.skipEnemyBattleTurns) { this.skipTurn = true; } } @@ -28,21 +30,29 @@ export class EnemyCommandPhase extends FieldPhase { start() { super.start(); - const enemyPokemon = this.scene.getEnemyField()[this.fieldIndex]; + const enemyPokemon = globalScene.getEnemyField()[this.fieldIndex]; - const battle = this.scene.currentBattle; + const battle = globalScene.currentBattle; const trainer = battle.trainer; + if ( + battle.double && + enemyPokemon.hasAbility(Abilities.COMMANDER) && + enemyPokemon.getAlly().getTag(BattlerTagType.COMMANDED) + ) { + this.skipTurn = true; + } + /** - * If the enemy has a trainer, decide whether or not the enemy should switch - * to another member in its party. - * - * This block compares the active enemy Pokemon's {@linkcode Pokemon.getMatchupScore | matchup score} - * against the active player Pokemon with the enemy party's other non-fainted Pokemon. If a party - * member's matchup score is 3x the active enemy's score (or 2x for "boss" trainers), - * the enemy will switch to that Pokemon. - */ + * If the enemy has a trainer, decide whether or not the enemy should switch + * to another member in its party. + * + * This block compares the active enemy Pokemon's {@linkcode Pokemon.getMatchupScore | matchup score} + * against the active player Pokemon with the enemy party's other non-fainted Pokemon. If a party + * member's matchup score is 3x the active enemy's score (or 2x for "boss" trainers), + * the enemy will switch to that Pokemon. + */ if (trainer && !enemyPokemon.getMoveQueue().length) { const opponents = enemyPokemon.getOpponents(); @@ -51,17 +61,21 @@ export class EnemyCommandPhase extends FieldPhase { if (partyMemberScores.length) { const matchupScores = opponents.map(opp => enemyPokemon.getMatchupScore(opp)); - const matchupScore = matchupScores.reduce((total, score) => total += score, 0) / matchupScores.length; + const matchupScore = matchupScores.reduce((total, score) => (total += score), 0) / matchupScores.length; const sortedPartyMemberScores = trainer.getSortedPartyMemberMatchupScores(partyMemberScores); - const switchMultiplier = 1 - (battle.enemySwitchCounter ? Math.pow(0.1, (1 / battle.enemySwitchCounter)) : 0); + const switchMultiplier = 1 - (battle.enemySwitchCounter ? Math.pow(0.1, 1 / battle.enemySwitchCounter) : 0); if (sortedPartyMemberScores[0][1] * switchMultiplier >= matchupScore * (trainer.config.isBoss ? 2 : 3)) { const index = trainer.getNextSummonIndex(enemyPokemon.trainerSlot, partyMemberScores); - battle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = - { command: Command.POKEMON, cursor: index, args: [ false ], skip: this.skipTurn }; + battle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { + command: Command.POKEMON, + cursor: index, + args: [false], + skip: this.skipTurn, + }; battle.enemySwitchCounter++; @@ -74,10 +88,17 @@ export class EnemyCommandPhase extends FieldPhase { /** Select a move to use (and a target to use it against, if applicable) */ const nextMove = enemyPokemon.getNextMove(); - this.scene.currentBattle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = - { command: Command.FIGHT, move: nextMove, skip: this.skipTurn }; + if (trainer?.shouldTera(enemyPokemon)) { + globalScene.currentBattle.preTurnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { command: Command.TERA }; + } - this.scene.currentBattle.enemySwitchCounter = Math.max(this.scene.currentBattle.enemySwitchCounter - 1, 0); + globalScene.currentBattle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { + command: Command.FIGHT, + move: nextMove, + skip: this.skipTurn, + }; + + globalScene.currentBattle.enemySwitchCounter = Math.max(globalScene.currentBattle.enemySwitchCounter - 1, 0); this.end(); } diff --git a/src/phases/enemy-party-member-pokemon-phase.ts b/src/phases/enemy-party-member-pokemon-phase.ts index bb34f53b475..5c701f7d73a 100644 --- a/src/phases/enemy-party-member-pokemon-phase.ts +++ b/src/phases/enemy-party-member-pokemon-phase.ts @@ -1,10 +1,9 @@ -import BattleScene from "#app/battle-scene"; -import { EnemyPokemon } from "#app/field/pokemon"; +import type { EnemyPokemon } from "#app/field/pokemon"; import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase"; export abstract class EnemyPartyMemberPokemonPhase extends PartyMemberPokemonPhase { - constructor(scene: BattleScene, partyMemberIndex: integer) { - super(scene, partyMemberIndex, false); + constructor(partyMemberIndex: number) { + super(partyMemberIndex, false); } getEnemyPokemon(): EnemyPokemon { diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index 59b73fe9e11..bb283fa8139 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -1,23 +1,33 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { Phase } from "#app/phase"; -import BattleScene from "#app/battle-scene"; -import { SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; -import EvolutionSceneHandler from "#app/ui/evolution-scene-handler"; +import type { AnySound } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import type { SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; +import { FusionSpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; +import type 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 { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { LearnMoveSituation } 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; - protected lastLevel: integer; + protected lastLevel: number; + + private preEvolvedPokemonName: string; private evolution: SpeciesFormEvolution | null; + private fusionSpeciesEvolved: boolean; // Whether the evolution is of the fused species + private evolutionBgm: AnySound; + private evolutionHandler: EvolutionSceneHandler; protected evolutionContainer: Phaser.GameObjects.Container; protected evolutionBaseBg: Phaser.GameObjects.Image; @@ -29,12 +39,13 @@ export class EvolutionPhase extends Phase { protected pokemonEvoSprite: Phaser.GameObjects.Sprite; protected pokemonEvoTintSprite: Phaser.GameObjects.Sprite; - constructor(scene: BattleScene, pokemon: PlayerPokemon, evolution: SpeciesFormEvolution | null, lastLevel: integer) { - super(scene); + constructor(pokemon: PlayerPokemon, evolution: SpeciesFormEvolution | null, lastLevel: number) { + super(); this.pokemon = pokemon; this.evolution = evolution; this.lastLevel = lastLevel; + this.fusionSpeciesEvolved = evolution instanceof FusionSpeciesFormEvolution; } validate(): boolean { @@ -42,42 +53,55 @@ export class EvolutionPhase extends Phase { } setMode(): Promise { - return this.scene.ui.setModeForceTransition(Mode.EVOLUTION_SCENE); + return globalScene.ui.setModeForceTransition(Mode.EVOLUTION_SCENE); } start() { super.start(); this.setMode().then(() => { - if (!this.validate()) { return this.end(); } - this.scene.fadeOutBgm(undefined, false); + globalScene.fadeOutBgm(undefined, false); - const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; + this.evolutionHandler = globalScene.ui.getHandler() as EvolutionSceneHandler; - this.evolutionContainer = evolutionHandler.evolutionContainer; + this.evolutionContainer = this.evolutionHandler.evolutionContainer; - this.evolutionBaseBg = this.scene.add.image(0, 0, "default_bg"); + this.evolutionBaseBg = globalScene.add.image(0, 0, "default_bg"); this.evolutionBaseBg.setOrigin(0, 0); this.evolutionContainer.add(this.evolutionBaseBg); - this.evolutionBg = this.scene.add.video(0, 0, "evo_bg").stop(); + this.evolutionBg = globalScene.add.video(0, 0, "evo_bg").stop(); this.evolutionBg.setOrigin(0, 0); this.evolutionBg.setScale(0.4359673025); this.evolutionBg.setVisible(false); this.evolutionContainer.add(this.evolutionBg); - this.evolutionBgOverlay = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0x262626); + this.evolutionBgOverlay = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0x262626, + ); this.evolutionBgOverlay.setOrigin(0, 0); this.evolutionBgOverlay.setAlpha(0); this.evolutionContainer.add(this.evolutionBgOverlay); const getPokemonSprite = () => { - const ret = this.scene.addPokemonSprite(this.pokemon, this.evolutionBaseBg.displayWidth / 2, this.evolutionBaseBg.displayHeight / 2, "pkmn__sub"); - ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const ret = globalScene.addPokemonSprite( + this.pokemon, + this.evolutionBaseBg.displayWidth / 2, + this.evolutionBaseBg.displayHeight / 2, + "pkmn__sub", + ); + ret.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); return ret; }; @@ -87,203 +111,286 @@ export class EvolutionPhase extends Phase { this.evolutionContainer.add((this.pokemonEvoTintSprite = getPokemonSprite())); this.pokemonTintSprite.setAlpha(0); - this.pokemonTintSprite.setTintFill(0xFFFFFF); + this.pokemonTintSprite.setTintFill(0xffffff); this.pokemonEvoSprite.setVisible(false); this.pokemonEvoTintSprite.setVisible(false); - this.pokemonEvoTintSprite.setTintFill(0xFFFFFF); + this.pokemonEvoTintSprite.setTintFill(0xffffff); - this.evolutionOverlay = this.scene.add.rectangle(0, -this.scene.game.canvas.height / 6, this.scene.game.canvas.width / 6, (this.scene.game.canvas.height / 6) - 48, 0xFFFFFF); + this.evolutionOverlay = globalScene.add.rectangle( + 0, + -globalScene.game.canvas.height / 6, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6 - 48, + 0xffffff, + ); this.evolutionOverlay.setOrigin(0, 0); this.evolutionOverlay.setAlpha(0); - this.scene.ui.add(this.evolutionOverlay); + globalScene.ui.add(this.evolutionOverlay); - [ this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { - sprite.play(this.pokemon.getSpriteKey(true)); - sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); + [this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite].map(sprite => { + const spriteKey = this.pokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(this.pokemon.getTeraType()), + isTerastallized: this.pokemon.isTerastallized, + }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); sprite.setPipelineData("shiny", this.pokemon.shiny); sprite.setPipelineData("variant", this.pokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (this.pokemon.summonData?.speciesForm) { k += "Base"; } sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]; }); }); - + this.preEvolvedPokemonName = getPokemonNameWithAffix(this.pokemon); this.doEvolution(); }); } doEvolution(): void { - const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; - const preName = getPokemonNameWithAffix(this.pokemon); + globalScene.ui.showText( + i18next.t("menu:evolving", { pokemonName: this.preEvolvedPokemonName }), + null, + () => { + this.pokemon.cry(); - this.scene.ui.showText(i18next.t("menu:evolving", { pokemonName: preName }), null, () => { - this.pokemon.cry(); - - this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { - - [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { - sprite.play(evolvedPokemon.getSpriteKey(true)); - sprite.setPipelineData("ignoreTimeTint", true); - sprite.setPipelineData("spriteKey", evolvedPokemon.getSpriteKey()); - sprite.setPipelineData("shiny", evolvedPokemon.shiny); - sprite.setPipelineData("variant", evolvedPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { - if (evolvedPokemon.summonData?.speciesForm) { - k += "Base"; + this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { + [this.pokemonEvoSprite, this.pokemonEvoTintSprite].map(sprite => { + const spriteKey = evolvedPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); } - sprite.pipelineData[k] = evolvedPokemon.getSprite().pipelineData[k]; + + sprite.setPipelineData("ignoreTimeTint", true); + sprite.setPipelineData("spriteKey", evolvedPokemon.getSpriteKey()); + sprite.setPipelineData("shiny", evolvedPokemon.shiny); + sprite.setPipelineData("variant", evolvedPokemon.variant); + ["spriteColors", "fusionSpriteColors"].map(k => { + if (evolvedPokemon.summonData?.speciesForm) { + k += "Base"; + } + sprite.pipelineData[k] = evolvedPokemon.getSprite().pipelineData[k]; + }); }); - }); - this.scene.time.delayedCall(1000, () => { - const evolutionBgm = this.scene.playSoundWithoutBgm("evolution"); - this.scene.tweens.add({ - targets: this.evolutionBgOverlay, - alpha: 1, - delay: 500, - duration: 1500, - ease: "Sine.easeOut", - onComplete: () => { - this.scene.time.delayedCall(1000, () => { - this.scene.tweens.add({ - targets: this.evolutionBgOverlay, - alpha: 0, - duration: 250 + globalScene.time.delayedCall(1000, () => { + this.evolutionBgm = globalScene.playSoundWithoutBgm("evolution"); + globalScene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 1, + delay: 500, + duration: 1500, + ease: "Sine.easeOut", + onComplete: () => { + globalScene.time.delayedCall(1000, () => { + globalScene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 0, + duration: 250, + }); + this.evolutionBg.setVisible(true); + this.evolutionBg.play(); }); - this.evolutionBg.setVisible(true); - this.evolutionBg.play(); - }); - this.scene.playSound("se/charge"); - this.doSpiralUpward(); - this.scene.tweens.addCounter({ - from: 0, - to: 1, - duration: 2000, - onUpdate: t => { - this.pokemonTintSprite.setAlpha(t.getValue()); - }, - onComplete: () => { - this.pokemonSprite.setVisible(false); - this.scene.time.delayedCall(1100, () => { - this.scene.playSound("se/beam"); - this.doArcDownward(); - this.scene.time.delayedCall(1500, () => { - this.pokemonEvoTintSprite.setScale(0.25); - this.pokemonEvoTintSprite.setVisible(true); - evolutionHandler.canCancel = true; - this.doCycle(1).then(success => { - if (!success) { - - this.pokemonSprite.setVisible(true); - this.pokemonTintSprite.setScale(1); - this.scene.tweens.add({ - targets: [ this.evolutionBg, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ], - alpha: 0, - duration: 250, - onComplete: () => { - this.evolutionBg.setVisible(false); - } - }); - - SoundFade.fadeOut(this.scene, evolutionBgm, 100); - - this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); - - this.scene.ui.showText(i18next.t("menu:stoppedEvolving", { pokemonName: preName }), null, () => { - this.scene.ui.showText(i18next.t("menu:pauseEvolutionsQuestion", { pokemonName: preName }), null, () => { - const end = () => { - this.scene.ui.showText("", 0); - this.scene.playBgm(); - evolvedPokemon.destroy(); - this.end(); - }; - this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { - this.scene.ui.revertMode(); - this.pokemon.pauseEvolutions = true; - this.scene.ui.showText(i18next.t("menu:evolutionsPaused", { pokemonName: preName }), null, end, 3000); - }, () => { - this.scene.ui.revertMode(); - this.scene.time.delayedCall(3000, end); - }); - }); - }, null, true); - return; - } - - this.scene.playSound("se/sparkle"); - this.pokemonEvoSprite.setVisible(true); - this.doCircleInward(); - this.scene.time.delayedCall(900, () => { - evolutionHandler.canCancel = false; - - this.pokemon.evolve(this.evolution, this.pokemon.species).then(() => { - const levelMoves = this.pokemon.getLevelMoves(this.lastLevel + 1, true); - for (const lm of levelMoves) { - this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.scene.getParty().indexOf(this.pokemon), lm[1])); - } - this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); - - this.scene.playSound("se/shine"); - this.doSpray(); - this.scene.tweens.add({ - targets: this.evolutionOverlay, - alpha: 1, - duration: 250, - easing: "Sine.easeIn", - onComplete: () => { - this.evolutionBgOverlay.setAlpha(1); - this.evolutionBg.setVisible(false); - this.scene.tweens.add({ - targets: [ this.evolutionOverlay, this.pokemonEvoTintSprite ], - alpha: 0, - duration: 2000, - delay: 150, - easing: "Sine.easeIn", - onComplete: () => { - this.scene.tweens.add({ - targets: this.evolutionBgOverlay, - alpha: 0, - duration: 250, - onComplete: () => { - SoundFade.fadeOut(this.scene, evolutionBgm, 100); - this.scene.time.delayedCall(250, () => { - this.pokemon.cry(); - this.scene.time.delayedCall(1250, () => { - this.scene.playSoundWithoutBgm("evolution_fanfare"); - - evolvedPokemon.destroy(); - this.scene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: preName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000)); - this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm()); - }); - }); - } - }); - } - }); - } - }); - }); + globalScene.playSound("se/charge"); + this.doSpiralUpward(); + globalScene.tweens.addCounter({ + from: 0, + to: 1, + duration: 2000, + onUpdate: t => { + this.pokemonTintSprite.setAlpha(t.getValue()); + }, + onComplete: () => { + this.pokemonSprite.setVisible(false); + globalScene.time.delayedCall(1100, () => { + globalScene.playSound("se/beam"); + this.doArcDownward(); + globalScene.time.delayedCall(1500, () => { + this.pokemonEvoTintSprite.setScale(0.25); + this.pokemonEvoTintSprite.setVisible(true); + this.evolutionHandler.canCancel = true; + this.doCycle(1).then(success => { + if (success) { + this.handleSuccessEvolution(evolvedPokemon); + } else { + this.handleFailedEvolution(evolvedPokemon); + } }); }); }); - }); - } - }); - } + }, + }); + }, + }); }); }); + }, + 1000, + ); + } + + /** + * Handles a failed/stopped evolution + * @param evolvedPokemon - The evolved Pokemon + */ + private handleFailedEvolution(evolvedPokemon: Pokemon): void { + this.pokemonSprite.setVisible(true); + this.pokemonTintSprite.setScale(1); + globalScene.tweens.add({ + targets: [this.evolutionBg, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite], + alpha: 0, + duration: 250, + onComplete: () => { + this.evolutionBg.setVisible(false); + }, + }); + + SoundFade.fadeOut(globalScene, this.evolutionBgm, 100); + + globalScene.unshiftPhase(new EndEvolutionPhase()); + + globalScene.ui.showText( + i18next.t("menu:stoppedEvolving", { + pokemonName: this.preEvolvedPokemonName, + }), + null, + () => { + globalScene.ui.showText( + i18next.t("menu:pauseEvolutionsQuestion", { + pokemonName: this.preEvolvedPokemonName, + }), + null, + () => { + const end = () => { + globalScene.ui.showText("", 0); + globalScene.playBgm(); + evolvedPokemon.destroy(); + this.end(); + }; + globalScene.ui.setOverlayMode( + Mode.CONFIRM, + () => { + globalScene.ui.revertMode(); + this.pokemon.pauseEvolutions = true; + globalScene.ui.showText( + i18next.t("menu:evolutionsPaused", { + pokemonName: this.preEvolvedPokemonName, + }), + null, + end, + 3000, + ); + }, + () => { + globalScene.ui.revertMode(); + globalScene.time.delayedCall(3000, end); + }, + ); + }, + ); + }, + null, + true, + ); + } + + /** + * Handles a successful evolution + * @param evolvedPokemon - The evolved Pokemon + */ + private handleSuccessEvolution(evolvedPokemon: Pokemon): void { + globalScene.playSound("se/sparkle"); + this.pokemonEvoSprite.setVisible(true); + this.doCircleInward(); + + const onEvolutionComplete = () => { + SoundFade.fadeOut(globalScene, this.evolutionBgm, 100); + globalScene.time.delayedCall(250, () => { + this.pokemon.cry(); + globalScene.time.delayedCall(1250, () => { + globalScene.playSoundWithoutBgm("evolution_fanfare"); + + evolvedPokemon.destroy(); + globalScene.ui.showText( + i18next.t("menu:evolutionDone", { + pokemonName: this.preEvolvedPokemonName, + evolvedPokemonName: this.pokemon.species.getExpandedSpeciesName(), + }), + null, + () => this.end(), + null, + true, + Utils.fixedInt(4000), + ); + globalScene.time.delayedCall(Utils.fixedInt(4250), () => globalScene.playBgm()); + }); }); - }, 1000); + }; + + globalScene.time.delayedCall(900, () => { + this.evolutionHandler.canCancel = false; + + this.pokemon.evolve(this.evolution, this.pokemon.species).then(() => { + 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) { + globalScene.unshiftPhase(new LearnMovePhase(globalScene.getPlayerParty().indexOf(this.pokemon), lm[1])); + } + globalScene.unshiftPhase(new EndEvolutionPhase()); + + globalScene.playSound("se/shine"); + this.doSpray(); + globalScene.tweens.add({ + targets: this.evolutionOverlay, + alpha: 1, + duration: 250, + easing: "Sine.easeIn", + onComplete: () => { + this.evolutionBgOverlay.setAlpha(1); + this.evolutionBg.setVisible(false); + globalScene.tweens.add({ + targets: [this.evolutionOverlay, this.pokemonEvoTintSprite], + alpha: 0, + duration: 2000, + delay: 150, + easing: "Sine.easeIn", + onComplete: () => { + globalScene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 0, + duration: 250, + onComplete: onEvolutionComplete, + }); + }, + }); + }, + }); + }); + }); } doSpiralUpward() { let f = 0; - this.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ repeat: 64, duration: Utils.getFrameMs(1), onRepeat: () => { @@ -295,14 +402,14 @@ export class EvolutionPhase extends Phase { } f++; } - } + }, }); } doArcDownward() { let f = 0; - this.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ repeat: 96, duration: Utils.getFrameMs(1), onRepeat: () => { @@ -314,29 +421,28 @@ export class EvolutionPhase extends Phase { } f++; } - } + }, }); } - doCycle(l: number, lastCycle: integer = 15): Promise { + doCycle(l: number, lastCycle = 15): Promise { return new Promise(resolve => { - const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; const isLastCycle = l === lastCycle; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pokemonTintSprite, scale: 0.25, ease: "Cubic.easeInOut", duration: 500 / l, - yoyo: !isLastCycle + yoyo: !isLastCycle, }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pokemonEvoTintSprite, scale: 1, ease: "Cubic.easeInOut", duration: 500 / l, yoyo: !isLastCycle, onComplete: () => { - if (evolutionHandler.cancelled) { + if (this.evolutionHandler.cancelled) { return resolve(false); } if (l < lastCycle) { @@ -345,7 +451,7 @@ export class EvolutionPhase extends Phase { this.pokemonTintSprite.setVisible(false); resolve(true); } - } + }, }); }); } @@ -353,7 +459,7 @@ export class EvolutionPhase extends Phase { doCircleInward() { let f = 0; - this.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ repeat: 48, duration: Utils.getFrameMs(1), onRepeat: () => { @@ -367,14 +473,14 @@ export class EvolutionPhase extends Phase { } } f++; - } + }, }); } doSpray() { let f = 0; - this.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ repeat: 48, duration: Utils.getFrameMs(1), onRepeat: () => { @@ -386,24 +492,24 @@ export class EvolutionPhase extends Phase { this.doSprayParticle(Utils.randInt(8)); } f++; - } + }, }); } - doSpiralUpwardParticle(trigIndex: integer) { + doSpiralUpwardParticle(trigIndex: number) { const initialX = this.evolutionBaseBg.displayWidth / 2; - const particle = this.scene.add.image(initialX, 0, "evo_sparkle"); + const particle = globalScene.add.image(initialX, 0, "evo_sparkle"); this.evolutionContainer.add(particle); let f = 0; let amp = 48; - const particleTimer = this.scene.tweens.addCounter({ + const particleTimer = globalScene.tweens.addCounter({ repeat: -1, duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -411,7 +517,7 @@ export class EvolutionPhase extends Phase { particle.setPosition(initialX, 88 - (f * f) / 80); particle.y += sin(trigIndex, amp) / 4; particle.x += cos(trigIndex, amp); - particle.setScale(1 - (f / 80)); + particle.setScale(1 - f / 80); trigIndex += 4; if (f & 1) { amp--; @@ -426,21 +532,21 @@ export class EvolutionPhase extends Phase { updateParticle(); } - doArcDownParticle(trigIndex: integer) { + doArcDownParticle(trigIndex: number) { const initialX = this.evolutionBaseBg.displayWidth / 2; - const particle = this.scene.add.image(initialX, 0, "evo_sparkle"); + const particle = globalScene.add.image(initialX, 0, "evo_sparkle"); particle.setScale(0.5); this.evolutionContainer.add(particle); let f = 0; let amp = 8; - const particleTimer = this.scene.tweens.addCounter({ + const particleTimer = globalScene.tweens.addCounter({ repeat: -1, duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -459,20 +565,20 @@ export class EvolutionPhase extends Phase { updateParticle(); } - doCircleInwardParticle(trigIndex: integer, speed: integer) { + doCircleInwardParticle(trigIndex: number, speed: number) { const initialX = this.evolutionBaseBg.displayWidth / 2; const initialY = this.evolutionBaseBg.displayHeight / 2; - const particle = this.scene.add.image(initialX, initialY, "evo_sparkle"); + const particle = globalScene.add.image(initialX, initialY, "evo_sparkle"); this.evolutionContainer.add(particle); let amp = 120; - const particleTimer = this.scene.tweens.addCounter({ + const particleTimer = globalScene.tweens.addCounter({ repeat: -1, duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -491,10 +597,10 @@ export class EvolutionPhase extends Phase { updateParticle(); } - doSprayParticle(trigIndex: integer) { + doSprayParticle(trigIndex: number) { const initialX = this.evolutionBaseBg.displayWidth / 2; const initialY = this.evolutionBaseBg.displayHeight / 2; - const particle = this.scene.add.image(initialX, initialY, "evo_sparkle"); + const particle = globalScene.add.image(initialX, initialY, "evo_sparkle"); this.evolutionContainer.add(particle); let f = 0; @@ -502,12 +608,12 @@ export class EvolutionPhase extends Phase { const speed = 3 - Utils.randInt(8); const amp = 48 + Utils.randInt(64); - const particleTimer = this.scene.tweens.addCounter({ + const particleTimer = globalScene.tweens.addCounter({ repeat: -1, duration: Utils.getFrameMs(1), onRepeat: () => { updateParticle(); - } + }, }); const updateParticle = () => { @@ -518,7 +624,7 @@ export class EvolutionPhase extends Phase { particle.setPosition(initialX + (speed * f) / 3, initialY + yOffset); particle.y += -sin(trigIndex, amp); if (f > 108) { - particle.setScale((1 - (f - 108) / 20)); + particle.setScale(1 - (f - 108) / 20); } trigIndex++; f++; diff --git a/src/phases/exp-phase.ts b/src/phases/exp-phase.ts index 81982980d2a..092482d4c18 100644 --- a/src/phases/exp-phase.ts +++ b/src/phases/exp-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { getPokemonNameWithAffix } from "#app/messages"; import { ExpBoosterModifier } from "#app/modifier/modifier"; import i18next from "i18next"; @@ -9,8 +9,8 @@ import { LevelUpPhase } from "./level-up-phase"; export class ExpPhase extends PlayerPartyMemberPokemonPhase { private expValue: number; - constructor(scene: BattleScene, partyMemberIndex: integer, expValue: number) { - super(scene, partyMemberIndex); + constructor(partyMemberIndex: number, expValue: number) { + super(partyMemberIndex); this.expValue = expValue; } @@ -20,16 +20,25 @@ export class ExpPhase extends PlayerPartyMemberPokemonPhase { const pokemon = this.getPokemon(); const exp = new Utils.NumberHolder(this.expValue); - this.scene.applyModifiers(ExpBoosterModifier, true, exp); + globalScene.applyModifiers(ExpBoosterModifier, true, exp); exp.value = Math.floor(exp.value); - this.scene.ui.showText(i18next.t("battle:expGain", { pokemonName: getPokemonNameWithAffix(pokemon), exp: exp.value }), null, () => { - const lastLevel = pokemon.level; - pokemon.addExp(exp.value); - const newLevel = pokemon.level; - if (newLevel > lastLevel) { - this.scene.unshiftPhase(new LevelUpPhase(this.scene, this.partyMemberIndex, lastLevel, newLevel)); - } - pokemon.updateInfo().then(() => this.end()); - }, null, true); + globalScene.ui.showText( + i18next.t("battle:expGain", { + pokemonName: getPokemonNameWithAffix(pokemon), + exp: exp.value, + }), + null, + () => { + const lastLevel = pokemon.level; + pokemon.addExp(exp.value); + const newLevel = pokemon.level; + if (newLevel > lastLevel) { + globalScene.unshiftPhase(new LevelUpPhase(this.partyMemberIndex, lastLevel, newLevel)); + } + pokemon.updateInfo().then(() => this.end()); + }, + null, + true, + ); } } diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 794bd99ed72..16c7fc45e40 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -1,24 +1,35 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex, BattleType } from "#app/battle"; -import { applyPostFaintAbAttrs, PostFaintAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr } from "#app/data/ability"; -import { BattlerTagLapseType, DestinyBondTag } from "#app/data/battler-tags"; +import type { BattlerIndex } from "#app/battle"; +import { BattleType } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import { + applyPostFaintAbAttrs, + applyPostKnockOutAbAttrs, + applyPostVictoryAbAttrs, + PostFaintAbAttr, + PostKnockOutAbAttr, + PostVictoryAbAttr, +} from "#app/data/ability"; +import type { DestinyBondTag, GrudgeTag } from "#app/data/battler-tags"; +import { BattlerTagLapseType } from "#app/data/battler-tags"; import { battleSpecDialogue } from "#app/data/dialogue"; -import { allMoves, PostVictoryStatStageChangeAttr } from "#app/data/move"; +import { allMoves, PostVictoryStatStageChangeAttr } from "#app/data/moves/move"; +import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; import { BattleSpec } from "#app/enums/battle-spec"; import { StatusEffect } from "#app/enums/status-effect"; -import Pokemon, { PokemonMove, EnemyPokemon, PlayerPokemon, HitResult } from "#app/field/pokemon"; +import type { EnemyPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { HitResult, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; 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"; import { SwitchSummonPhase } from "./switch-summon-phase"; import { ToggleDoublePositionPhase } from "./toggle-double-position-phase"; -import { GameOverPhase } from "./game-over-phase"; -import { SwitchPhase } from "./switch-phase"; import { VictoryPhase } from "./victory-phase"; -import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; -import { SwitchType } from "#enums/switch-type"; import { isNullOrUndefined } from "#app/utils"; import { FRIENDSHIP_LOSS_FROM_FAINT } from "#app/data/balance/starters"; @@ -31,36 +42,56 @@ export class FaintPhase extends PokemonPhase { /** * Destiny Bond tag belonging to the currently fainting Pokemon, if applicable */ - private destinyTag?: DestinyBondTag; + private destinyTag?: DestinyBondTag | null; /** - * The source Pokemon that dealt fatal damage and should get KO'd by Destiny Bond, if applicable + * Grudge tag belonging to the currently fainting Pokemon, if applicable + */ + private grudgeTag?: GrudgeTag | null; + + /** + * The source Pokemon that dealt fatal damage */ private source?: Pokemon; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, preventEndure: boolean = false, destinyTag?: DestinyBondTag, source?: Pokemon) { - super(scene, battlerIndex); + constructor( + battlerIndex: BattlerIndex, + preventEndure = false, + destinyTag?: DestinyBondTag | null, + grudgeTag?: GrudgeTag | null, + source?: Pokemon, + ) { + super(battlerIndex); this.preventEndure = preventEndure; this.destinyTag = destinyTag; + this.grudgeTag = grudgeTag; this.source = source; } start() { super.start(); + const faintPokemon = this.getPokemon(); + if (!isNullOrUndefined(this.destinyTag) && !isNullOrUndefined(this.source)) { this.destinyTag.lapse(this.source, BattlerTagLapseType.CUSTOM); } + if (!isNullOrUndefined(this.grudgeTag) && !isNullOrUndefined(this.source)) { + this.grudgeTag.lapse(faintPokemon, BattlerTagLapseType.CUSTOM, this.source); + } + if (!this.preventEndure) { - const instantReviveModifier = this.scene.applyModifier(PokemonInstantReviveModifier, this.player, this.getPokemon()) as PokemonInstantReviveModifier; + const instantReviveModifier = globalScene.applyModifier( + PokemonInstantReviveModifier, + this.player, + faintPokemon, + ) as PokemonInstantReviveModifier; if (instantReviveModifier) { - if (!--instantReviveModifier.stackCount) { - this.scene.removeModifier(instantReviveModifier); - } - this.scene.updateModifiers(this.player); + faintPokemon.loseHeldItem(instantReviveModifier); + globalScene.updateModifiers(this.player); return this.end(); } } @@ -71,10 +102,10 @@ export class FaintPhase extends PokemonPhase { * involved in combat, it needs to be counted as a participant so the other party pokemon can get their EXP, * so the fainted pokemon has been included. */ - this.scene.getPlayerField().forEach((pokemon, i) => { + globalScene.getPlayerField().forEach((pokemon, i) => { if (pokemon?.isActive() || pokemon?.isFainted()) { if (pokemon.isPlayer()) { - this.scene.currentBattle.addParticipant(pokemon as PlayerPokemon); + globalScene.currentBattle.addParticipant(pokemon as PlayerPokemon); } } }); @@ -87,30 +118,53 @@ export class FaintPhase extends PokemonPhase { doFaint(): void { const pokemon = this.getPokemon(); - - // Track total times pokemon have been KO'd for supreme overlord/last respects + // Track total times pokemon have been KO'd for Last Respects/Supreme Overlord if (pokemon.isPlayer()) { - this.scene.currentBattle.playerFaints += 1; - this.scene.currentBattle.playerFaintsHistory.push({ pokemon: pokemon, turn: this.scene.currentBattle.turn }); + globalScene.arena.playerFaints += 1; + globalScene.currentBattle.playerFaintsHistory.push({ + pokemon: pokemon, + turn: globalScene.currentBattle.turn, + }); } else { - this.scene.currentBattle.enemyFaints += 1; - this.scene.currentBattle.enemyFaintsHistory.push({ pokemon: pokemon, turn: this.scene.currentBattle.turn }); + globalScene.currentBattle.enemyFaints += 1; + globalScene.currentBattle.enemyFaintsHistory.push({ + pokemon: pokemon, + turn: globalScene.currentBattle.turn, + }); } - this.scene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + globalScene.queueMessage( + i18next.t("battle:fainted", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + }), + null, + true, + ); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + + pokemon.resetTera(); if (pokemon.turnData?.attacksReceived?.length) { const lastAttack = pokemon.turnData.attacksReceived[0]; - applyPostFaintAbAttrs(PostFaintAbAttr, pokemon, this.scene.getPokemonById(lastAttack.sourceId)!, new PokemonMove(lastAttack.move).getMove(), lastAttack.result); // TODO: is this bang correct? - } else { //If killed by indirect damage, apply post-faint abilities without providing a last move + applyPostFaintAbAttrs( + PostFaintAbAttr, + pokemon, + globalScene.getPokemonById(lastAttack.sourceId)!, + new PokemonMove(lastAttack.move).getMove(), + lastAttack.result, + ); // TODO: is this bang correct? + } else { + //If killed by indirect damage, apply post-faint abilities without providing a last move applyPostFaintAbAttrs(PostFaintAbAttr, pokemon); } - const alivePlayField = this.scene.getField(true); - alivePlayField.forEach(p => applyPostKnockOutAbAttrs(PostKnockOutAbAttr, p, pokemon)); + const alivePlayField = globalScene.getField(true); + for (const p of alivePlayField) { + applyPostKnockOutAbAttrs(PostKnockOutAbAttr, p, pokemon); + } if (pokemon.turnData?.attacksReceived?.length) { - const defeatSource = this.scene.getPokemonById(pokemon.turnData.attacksReceived[0].sourceId); + const defeatSource = this.source; + if (defeatSource?.isOnField()) { applyPostVictoryAbAttrs(PostVictoryAbAttr, defeatSource); const pvmove = allMoves[pokemon.turnData.attacksReceived[0].move]; @@ -125,39 +179,46 @@ export class FaintPhase extends PokemonPhase { if (this.player) { /** The total number of Pokemon in the player's party that can legally fight */ - const legalPlayerPokemon = this.scene.getParty().filter(p => p.isAllowedInBattle()); + const legalPlayerPokemon = globalScene.getPokemonAllowedInBattle(); /** The total number of legal player Pokemon that aren't currently on the field */ const legalPlayerPartyPokemon = legalPlayerPokemon.filter(p => !p.isActive(true)); if (!legalPlayerPokemon.length) { /** If the player doesn't have any legal Pokemon, end the game */ - this.scene.unshiftPhase(new GameOverPhase(this.scene)); - } else if (this.scene.currentBattle.double && legalPlayerPokemon.length === 1 && legalPlayerPartyPokemon.length === 0) { + globalScene.unshiftPhase(new GameOverPhase()); + } else if ( + globalScene.currentBattle.double && + legalPlayerPokemon.length === 1 && + legalPlayerPartyPokemon.length === 0 + ) { /** * If the player has exactly one Pokemon in total at this point in a double battle, and that Pokemon * is already on the field, unshift a phase that moves that Pokemon to center position. */ - this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); } else if (legalPlayerPartyPokemon.length > 0) { /** * If previous conditions weren't met, and the player has at least 1 legal Pokemon off the field, * push a phase that prompts the player to summon a Pokemon from their party. */ - this.scene.pushPhase(new SwitchPhase(this.scene, SwitchType.SWITCH, this.fieldIndex, true, false)); + globalScene.pushPhase(new SwitchPhase(SwitchType.SWITCH, this.fieldIndex, true, false)); } } else { - this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); - if ([ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(this.scene.currentBattle.battleType)) { - const hasReservePartyMember = !!this.scene.getEnemyParty().filter(p => p.isActive() && !p.isOnField() && p.trainerSlot === (pokemon as EnemyPokemon).trainerSlot).length; + globalScene.unshiftPhase(new VictoryPhase(this.battlerIndex)); + if ([BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(globalScene.currentBattle.battleType)) { + const hasReservePartyMember = !!globalScene + .getEnemyParty() + .filter(p => p.isActive() && !p.isOnField() && p.trainerSlot === (pokemon as EnemyPokemon).trainerSlot) + .length; if (hasReservePartyMember) { - this.scene.pushPhase(new SwitchSummonPhase(this.scene, SwitchType.SWITCH, this.fieldIndex, -1, false, false)); + globalScene.pushPhase(new SwitchSummonPhase(SwitchType.SWITCH, this.fieldIndex, -1, false, false)); } } } // in double battles redirect potential moves off fainted pokemon - if (this.scene.currentBattle.double) { + if (globalScene.currentBattle.double) { const allyPokemon = pokemon.getAlly(); - this.scene.redirectPokemonMoves(pokemon, allyPokemon); + globalScene.redirectPokemonMoves(pokemon, allyPokemon); } pokemon.faintCry(() => { @@ -165,43 +226,46 @@ export class FaintPhase extends PokemonPhase { pokemon.addFriendship(-FRIENDSHIP_LOSS_FROM_FAINT); } pokemon.hideInfo(); - this.scene.playSound("se/faint"); - this.scene.tweens.add({ + globalScene.playSound("se/faint"); + globalScene.tweens.add({ targets: pokemon, duration: 500, y: pokemon.y + 150, ease: "Sine.easeIn", onComplete: () => { - pokemon.resetSprite(); pokemon.lapseTags(BattlerTagLapseType.FAINT); - this.scene.getField(true).filter(p => p !== pokemon).forEach(p => p.removeTagsBySourceId(pokemon.id)); pokemon.y -= 150; pokemon.trySetStatus(StatusEffect.FAINT); if (pokemon.isPlayer()) { - this.scene.currentBattle.removeFaintedParticipant(pokemon as PlayerPokemon); + globalScene.currentBattle.removeFaintedParticipant(pokemon as PlayerPokemon); } else { - this.scene.addFaintedEnemyScore(pokemon as EnemyPokemon); - this.scene.currentBattle.addPostBattleLoot(pokemon as EnemyPokemon); + globalScene.addFaintedEnemyScore(pokemon as EnemyPokemon); + globalScene.currentBattle.addPostBattleLoot(pokemon as EnemyPokemon); } - this.scene.field.remove(pokemon); + pokemon.leaveField(); this.end(); - } + }, }); }); } tryOverrideForBattleSpec(): boolean { - switch (this.scene.currentBattle.battleSpec) { + switch (globalScene.currentBattle.battleSpec) { case BattleSpec.FINAL_BOSS: if (!this.player) { const enemy = this.getPokemon(); if (enemy.formIndex) { - this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, enemy.species.name, null, () => this.doFaint()); + globalScene.ui.showDialogue( + battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, + enemy.species.name, + null, + () => this.doFaint(), + ); } else { - // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase + // 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)); + globalScene.unshiftPhase(new DamageAnimPhase(enemy.getBattlerIndex(), 0, HitResult.OTHER)); this.end(); } return true; diff --git a/src/phases/field-phase.ts b/src/phases/field-phase.ts index 46c3c4983b4..98c1ced510f 100644 --- a/src/phases/field-phase.ts +++ b/src/phases/field-phase.ts @@ -1,11 +1,14 @@ -import Pokemon from "#app/field/pokemon"; +import { globalScene } from "#app/global-scene"; +import type Pokemon from "#app/field/pokemon"; import { BattlePhase } from "./battle-phase"; type PokemonFunc = (pokemon: Pokemon) => void; export abstract class FieldPhase extends BattlePhase { executeForAll(func: PokemonFunc): void { - const field = this.scene.getField(true).filter(p => p.summonData); - field.forEach(pokemon => func(pokemon)); + const field = globalScene.getField(true).filter(p => p.summonData); + for (const pokemon of field) { + func(pokemon); + } } } diff --git a/src/phases/form-change-phase.ts b/src/phases/form-change-phase.ts index 410163a70e4..e0ec4e87600 100644 --- a/src/phases/form-change-phase.ts +++ b/src/phases/form-change-phase.ts @@ -1,10 +1,11 @@ -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import * as Utils from "../utils"; import { achvs } from "../system/achv"; -import { SpeciesFormChange, getSpeciesFormChangeMessage } from "../data/pokemon-forms"; -import { PlayerPokemon } from "../field/pokemon"; +import type { SpeciesFormChange } from "../data/pokemon-forms"; +import { getSpeciesFormChangeMessage } from "../data/pokemon-forms"; +import type { PlayerPokemon } from "../field/pokemon"; import { Mode } from "../ui/ui"; -import PartyUiHandler from "../ui/party-ui-handler"; +import type PartyUiHandler from "../ui/party-ui-handler"; import { getPokemonNameWithAffix } from "../messages"; import { EndEvolutionPhase } from "./end-evolution-phase"; import { EvolutionPhase } from "./evolution-phase"; @@ -15,8 +16,8 @@ export class FormChangePhase extends EvolutionPhase { private formChange: SpeciesFormChange; private modal: boolean; - constructor(scene: BattleScene, pokemon: PlayerPokemon, formChange: SpeciesFormChange, modal: boolean) { - super(scene, pokemon, null, 0); + constructor(pokemon: PlayerPokemon, formChange: SpeciesFormChange, modal: boolean) { + super(pokemon, null, 0); this.formChange = formChange; this.modal = modal; @@ -30,21 +31,26 @@ export class FormChangePhase extends EvolutionPhase { if (!this.modal) { return super.setMode(); } - return this.scene.ui.setOverlayMode(Mode.EVOLUTION_SCENE); + return globalScene.ui.setOverlayMode(Mode.EVOLUTION_SCENE); } doEvolution(): void { const preName = getPokemonNameWithAffix(this.pokemon); this.pokemon.getPossibleForm(this.formChange).then(transformedPokemon => { + [this.pokemonEvoSprite, this.pokemonEvoTintSprite].map(sprite => { + const spriteKey = transformedPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } - [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { - sprite.play(transformedPokemon.getSpriteKey(true)); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", transformedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", transformedPokemon.shiny); sprite.setPipelineData("variant", transformedPokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { if (transformedPokemon.summonData?.speciesForm) { k += "Base"; } @@ -52,26 +58,26 @@ export class FormChangePhase extends EvolutionPhase { }); }); - this.scene.time.delayedCall(250, () => { - this.scene.tweens.add({ + globalScene.time.delayedCall(250, () => { + globalScene.tweens.add({ targets: this.evolutionBgOverlay, alpha: 1, delay: 500, duration: 1500, ease: "Sine.easeOut", onComplete: () => { - this.scene.time.delayedCall(1000, () => { - this.scene.tweens.add({ + globalScene.time.delayedCall(1000, () => { + globalScene.tweens.add({ targets: this.evolutionBgOverlay, alpha: 0, - duration: 250 + duration: 250, }); this.evolutionBg.setVisible(true); this.evolutionBg.play(); }); - this.scene.playSound("se/charge"); + globalScene.playSound("se/charge"); this.doSpiralUpward(); - this.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ from: 0, to: 1, duration: 2000, @@ -80,25 +86,25 @@ export class FormChangePhase extends EvolutionPhase { }, onComplete: () => { this.pokemonSprite.setVisible(false); - this.scene.time.delayedCall(1100, () => { - this.scene.playSound("se/beam"); + globalScene.time.delayedCall(1100, () => { + globalScene.playSound("se/beam"); this.doArcDownward(); - this.scene.time.delayedCall(1000, () => { + globalScene.time.delayedCall(1000, () => { this.pokemonEvoTintSprite.setScale(0.25); this.pokemonEvoTintSprite.setVisible(true); this.doCycle(1, 1).then(_success => { - this.scene.playSound("se/sparkle"); + globalScene.playSound("se/sparkle"); this.pokemonEvoSprite.setVisible(true); this.doCircleInward(); - this.scene.time.delayedCall(900, () => { + globalScene.time.delayedCall(900, () => { this.pokemon.changeForm(this.formChange).then(() => { if (!this.modal) { - this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); + globalScene.unshiftPhase(new EndEvolutionPhase()); } - this.scene.playSound("se/shine"); + globalScene.playSound("se/shine"); this.doSpray(); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.evolutionOverlay, alpha: 1, duration: 250, @@ -106,52 +112,66 @@ export class FormChangePhase extends EvolutionPhase { onComplete: () => { this.evolutionBgOverlay.setAlpha(1); this.evolutionBg.setVisible(false); - this.scene.tweens.add({ - targets: [ this.evolutionOverlay, this.pokemonEvoTintSprite ], + globalScene.tweens.add({ + targets: [this.evolutionOverlay, this.pokemonEvoTintSprite], alpha: 0, duration: 2000, delay: 150, easing: "Sine.easeIn", onComplete: () => { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.evolutionBgOverlay, alpha: 0, duration: 250, onComplete: () => { - this.scene.time.delayedCall(250, () => { + globalScene.time.delayedCall(250, () => { this.pokemon.cry(); - this.scene.time.delayedCall(1250, () => { + globalScene.time.delayedCall(1250, () => { let playEvolutionFanfare = false; if (this.formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1) { - this.scene.validateAchv(achvs.MEGA_EVOLVE); + globalScene.validateAchv(achvs.MEGA_EVOLVE); playEvolutionFanfare = true; - } else if (this.formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1 || this.formChange.formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1) { - this.scene.validateAchv(achvs.GIGANTAMAX); + } else if ( + this.formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1 || + this.formChange.formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1 + ) { + globalScene.validateAchv(achvs.GIGANTAMAX); playEvolutionFanfare = true; } const delay = playEvolutionFanfare ? 4000 : 1750; - this.scene.playSoundWithoutBgm(playEvolutionFanfare ? "evolution_fanfare" : "minor_fanfare"); + globalScene.playSoundWithoutBgm( + playEvolutionFanfare ? "evolution_fanfare" : "minor_fanfare", + ); transformedPokemon.destroy(); - this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), null, true, Utils.fixedInt(delay)); - this.scene.time.delayedCall(Utils.fixedInt(delay + 250), () => this.scene.playBgm()); + globalScene.ui.showText( + getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), + null, + () => this.end(), + null, + true, + Utils.fixedInt(delay), + ); + globalScene.time.delayedCall(Utils.fixedInt(delay + 250), () => + globalScene.playBgm(), + ); }); }); - } + }, }); - } + }, }); - } + }, }); }); }); }); }); }); - } + }, }); - } + }, }); }); }); @@ -160,9 +180,9 @@ export class FormChangePhase extends EvolutionPhase { end(): void { this.pokemon.findAndRemoveTags(t => t.tagType === BattlerTagType.AUTOTOMIZED); if (this.modal) { - this.scene.ui.revertMode().then(() => { - if (this.scene.ui.getMode() === Mode.PARTY) { - const partyUiHandler = this.scene.ui.getHandler() as PartyUiHandler; + globalScene.ui.revertMode().then(() => { + if (globalScene.ui.getMode() === Mode.PARTY) { + const partyUiHandler = globalScene.ui.getHandler() as PartyUiHandler; partyUiHandler.clearPartySlots(); partyUiHandler.populatePartySlots(); } diff --git a/src/phases/game-over-modifier-reward-phase.ts b/src/phases/game-over-modifier-reward-phase.ts index a698e62e2e1..f3f2aebd67d 100644 --- a/src/phases/game-over-modifier-reward-phase.ts +++ b/src/phases/game-over-modifier-reward-phase.ts @@ -1,27 +1,31 @@ -import BattleScene from "#app/battle-scene"; -import { ModifierTypeFunc } from "#app/modifier/modifier-type"; +import { globalScene } from "#app/global-scene"; +import type { ModifierTypeFunc } from "#app/modifier/modifier-type"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { ModifierRewardPhase } from "./modifier-reward-phase"; export class GameOverModifierRewardPhase extends ModifierRewardPhase { - constructor(scene: BattleScene, modifierTypeFunc: ModifierTypeFunc) { - super(scene, modifierTypeFunc); - } - doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - this.scene.addModifier(newModifier).then(() => { - // Sound loaded into game as is - this.scene.playSound("level_up_fanfare"); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => { - this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); + globalScene.addModifier(newModifier); + // Sound loaded into game as is + globalScene.playSound("level_up_fanfare"); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.fadeIn(250).then(() => { + globalScene.ui.showText( + i18next.t("battle:rewardGain", { + modifierName: newModifier?.type.name, + }), + null, + () => { + globalScene.time.delayedCall(1500, () => globalScene.arenaBg.setVisible(true)); resolve(); - }, null, true, 1500); - }); + }, + null, + true, + 1500, + ); }); }); } diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index 9c444fc40f0..af948ad0632 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -1,11 +1,12 @@ import { clientSessionId } from "#app/account"; import { BattleType } from "#app/battle"; -import BattleScene from "#app/battle-scene"; -import { getCharVariantFromDialogue } from "#app/data/dialogue"; +import { globalScene } from "#app/global-scene"; import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; -import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; +import { getCharVariantFromDialogue } from "#app/data/dialogue"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; import { trainerConfigs } from "#app/data/trainer-config"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; import { BattlePhase } from "#app/phases/battle-phase"; import { CheckSwitchPhase } from "#app/phases/check-switch-phase"; @@ -23,146 +24,187 @@ import * as Utils from "#app/utils"; import { PlayerGender } from "#enums/player-gender"; import { TrainerType } from "#enums/trainer-type"; import i18next from "i18next"; +import type { 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 { - private victory: boolean; + private isVictory: boolean; private firstRibbons: PokemonSpecies[] = []; - constructor(scene: BattleScene, victory?: boolean) { - super(scene); + constructor(isVictory = false) { + super(); - this.victory = !!victory; + this.isVictory = isVictory; } start() { super.start(); // Failsafe if players somehow skip floor 200 in classic mode - if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) { - this.victory = true; + if (globalScene.gameMode.isClassic && globalScene.currentBattle.waveIndex > 200) { + this.isVictory = true; } // Handle Mystery Encounter special Game Over cases // Situations such as when player lost a battle, but it isn't treated as full Game Over - if (!this.victory && this.scene.currentBattle.mysteryEncounter?.onGameOver && !this.scene.currentBattle.mysteryEncounter.onGameOver(this.scene)) { + if ( + !this.isVictory && + globalScene.currentBattle.mysteryEncounter?.onGameOver && + !globalScene.currentBattle.mysteryEncounter.onGameOver() + ) { // Do not end the game return this.end(); } // Otherwise, continue standard Game Over logic - if (this.victory && this.scene.gameMode.isEndless) { - const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + if (this.isVictory && globalScene.gameMode.isEndless) { + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderStr = PlayerGender[genderIndex].toLowerCase(); - this.scene.ui.showDialogue(i18next.t("miscDialogue:ending_endless", { context: genderStr }), i18next.t("miscDialogue:ending_name"), 0, () => this.handleGameOver()); - } else if (this.victory || !this.scene.enableRetries) { + globalScene.ui.showDialogue( + i18next.t("miscDialogue:ending_endless", { context: genderStr }), + i18next.t("miscDialogue:ending_name"), + 0, + () => this.handleGameOver(), + ); + } else if (this.isVictory || !globalScene.enableRetries) { this.handleGameOver(); } else { - this.scene.ui.showText(i18next.t("battle:retryBattle"), null, () => { - this.scene.ui.setMode(Mode.CONFIRM, () => { - this.scene.ui.fadeOut(1250).then(() => { - this.scene.reset(); - this.scene.clearPhaseQueue(); - this.scene.gameData.loadSession(this.scene, this.scene.sessionSlotId).then(() => { - this.scene.pushPhase(new EncounterPhase(this.scene, true)); + globalScene.ui.showText(i18next.t("battle:retryBattle"), null, () => { + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + globalScene.ui.fadeOut(1250).then(() => { + globalScene.reset(); + globalScene.clearPhaseQueue(); + globalScene.gameData.loadSession(globalScene.sessionSlotId).then(() => { + globalScene.pushPhase(new EncounterPhase(true)); - const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()).length; + const availablePartyMembers = globalScene.getPokemonAllowedInBattle().length; - this.scene.pushPhase(new SummonPhase(this.scene, 0)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) { - this.scene.pushPhase(new SummonPhase(this.scene, 1)); - } - if (this.scene.currentBattle.waveIndex > 1 && this.scene.currentBattle.battleType !== BattleType.TRAINER) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); + globalScene.pushPhase(new SummonPhase(0)); + if (globalScene.currentBattle.double && availablePartyMembers > 1) { + globalScene.pushPhase(new SummonPhase(1)); + } + if ( + globalScene.currentBattle.waveIndex > 1 && + globalScene.currentBattle.battleType !== BattleType.TRAINER + ) { + globalScene.pushPhase(new CheckSwitchPhase(0, globalScene.currentBattle.double)); + if (globalScene.currentBattle.double && availablePartyMembers > 1) { + globalScene.pushPhase(new CheckSwitchPhase(1, globalScene.currentBattle.double)); + } } - } - this.scene.ui.fadeIn(1250); - this.end(); + globalScene.ui.fadeIn(1250); + this.end(); + }); }); - }); - }, () => this.handleGameOver(), false, 0, 0, 1000); + }, + () => this.handleGameOver(), + false, + 0, + 0, + 1000, + ); }); } } handleGameOver(): void { const doGameOver = (newClear: boolean) => { - this.scene.disableMenu = true; - this.scene.time.delayedCall(1000, () => { + globalScene.disableMenu = true; + globalScene.time.delayedCall(1000, () => { let firstClear = false; - if (this.victory && newClear) { - if (this.scene.gameMode.isClassic) { - firstClear = this.scene.validateAchv(achvs.CLASSIC_VICTORY); - this.scene.validateAchv(achvs.UNEVOLVED_CLASSIC_VICTORY); - this.scene.gameData.gameStats.sessionsWon++; - for (const pokemon of this.scene.getParty()) { + if (this.isVictory && newClear) { + if (globalScene.gameMode.isClassic) { + firstClear = globalScene.validateAchv(achvs.CLASSIC_VICTORY); + globalScene.validateAchv(achvs.UNEVOLVED_CLASSIC_VICTORY); + globalScene.gameData.gameStats.sessionsWon++; + for (const pokemon of globalScene.getPlayerParty()) { this.awardRibbon(pokemon); if (pokemon.species.getRootSpeciesId() !== pokemon.species.getRootSpeciesId(true)) { this.awardRibbon(pokemon, true); } } - } else if (this.scene.gameMode.isDaily && newClear) { - this.scene.gameData.gameStats.dailyRunSessionsWon++; + } else if (globalScene.gameMode.isDaily && newClear) { + globalScene.gameData.gameStats.dailyRunSessionsWon++; } } - this.scene.gameData.saveRunHistory(this.scene, this.scene.gameData.getSessionSaveData(this.scene), this.victory); - const fadeDuration = this.victory ? 10000 : 5000; - this.scene.fadeOutBgm(fadeDuration, true); - const activeBattlers = this.scene.getField().filter(p => p?.isActive(true)); - activeBattlers.map(p => p.hideInfo()); - this.scene.ui.fadeOut(fadeDuration).then(() => { - activeBattlers.map(a => a.setVisible(false)); - this.scene.setFieldScale(1, true); - this.scene.clearPhaseQueue(); - this.scene.ui.clearText(); - if (this.victory && this.scene.gameMode.isChallenge) { - this.scene.gameMode.challenges.forEach(c => this.scene.validateAchvs(ChallengeAchv, c)); + const fadeDuration = this.isVictory ? 10000 : 5000; + globalScene.fadeOutBgm(fadeDuration, true); + const activeBattlers = globalScene.getField().filter(p => p?.isActive(true)); + activeBattlers.map(p => p.hideInfo()); + globalScene.ui.fadeOut(fadeDuration).then(() => { + activeBattlers.map(a => a.setVisible(false)); + globalScene.setFieldScale(1, true); + globalScene.clearPhaseQueue(); + globalScene.ui.clearText(); + + if (this.isVictory && globalScene.gameMode.isChallenge) { + globalScene.gameMode.challenges.forEach(c => globalScene.validateAchvs(ChallengeAchv, c)); } const clear = (endCardPhase?: EndCardPhase) => { - if (newClear) { + if (this.isVictory && newClear) { this.handleUnlocks(); - } - if (this.victory && newClear) { + for (const species of this.firstRibbons) { - this.scene.unshiftPhase(new RibbonModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PLUS, species)); + globalScene.unshiftPhase(new RibbonModifierRewardPhase(modifierTypes.VOUCHER_PLUS, species)); } if (!firstClear) { - this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM)); + globalScene.unshiftPhase(new GameOverModifierRewardPhase(modifierTypes.VOUCHER_PREMIUM)); } } - this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase)); - this.end(); + this.getRunHistoryEntry().then(runHistoryEntry => { + globalScene.gameData.saveRunHistory(runHistoryEntry, this.isVictory); + globalScene.pushPhase(new PostGameOverPhase(endCardPhase)); + this.end(); + }); }; - if (this.victory && this.scene.gameMode.isClassic) { + if (this.isVictory && globalScene.gameMode.isClassic) { const dialogueKey = "miscDialogue:ending"; - if (!this.scene.ui.shouldSkipDialogue(dialogueKey)) { - this.scene.ui.fadeIn(500).then(() => { - const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + if (!globalScene.ui.shouldSkipDialogue(dialogueKey)) { + globalScene.ui.fadeIn(500).then(() => { + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderStr = PlayerGender[genderIndex].toLowerCase(); // Dialogue has to be retrieved so that the rival's expressions can be loaded and shown via getCharVariantFromDialogue const dialogue = i18next.t(dialogueKey, { context: genderStr }); - this.scene.charSprite.showCharacter(`rival_${this.scene.gameData.gender === PlayerGender.FEMALE ? "m" : "f"}`, getCharVariantFromDialogue(dialogue)).then(() => { - this.scene.ui.showDialogue(dialogueKey, this.scene.gameData.gender === PlayerGender.FEMALE ? trainerConfigs[TrainerType.RIVAL].name : trainerConfigs[TrainerType.RIVAL].nameFemale, null, () => { - this.scene.ui.fadeOut(500).then(() => { - this.scene.charSprite.hide().then(() => { - const endCardPhase = new EndCardPhase(this.scene); - this.scene.unshiftPhase(endCardPhase); - clear(endCardPhase); - }); - }); + globalScene.charSprite + .showCharacter( + `rival_${globalScene.gameData.gender === PlayerGender.FEMALE ? "m" : "f"}`, + getCharVariantFromDialogue(dialogue), + ) + .then(() => { + globalScene.ui.showDialogue( + dialogueKey, + globalScene.gameData.gender === PlayerGender.FEMALE + ? trainerConfigs[TrainerType.RIVAL].name + : trainerConfigs[TrainerType.RIVAL].nameFemale, + null, + () => { + globalScene.ui.fadeOut(500).then(() => { + globalScene.charSprite.hide().then(() => { + const endCardPhase = new EndCardPhase(); + globalScene.unshiftPhase(endCardPhase); + clear(endCardPhase); + }); + }); + }, + ); }); - }); }); } else { - const endCardPhase = new EndCardPhase(this.scene); - this.scene.unshiftPhase(endCardPhase); + const endCardPhase = new EndCardPhase(); + globalScene.unshiftPhase(endCardPhase); clear(endCardPhase); } } else { @@ -172,48 +214,90 @@ export class GameOverPhase extends BattlePhase { }); }; - /* Added a local check to see if the game is running offline on victory + /* Added a local check to see if the game is running offline If Online, execute apiFetch as intended - If Offline, execute offlineNewClear(), a localStorage implementation of newClear daily run checks */ - if (this.victory) { - if (!Utils.isLocal) { - Utils.apiFetch(`savedata/session/newclear?slot=${this.scene.sessionSlotId}&clientSessionId=${clientSessionId}`, true) - .then(response => response.json()) - .then(newClear => doGameOver(newClear)); - } else { - this.scene.gameData.offlineNewClear(this.scene).then(result => { - doGameOver(result); - }); - } + If Offline, execute offlineNewClear() only for victory, a localStorage implementation of newClear daily run checks */ + if (!Utils.isLocal || Utils.isLocalServerConnected) { + pokerogueApi.savedata.session + .newclear({ + slot: globalScene.sessionSlotId, + isVictory: this.isVictory, + clientSessionId: clientSessionId, + }) + .then(success => doGameOver(!!success)); + } else if (this.isVictory) { + globalScene.gameData.offlineNewClear().then(result => { + doGameOver(result); + }); } else { doGameOver(false); } } handleUnlocks(): void { - if (this.victory && this.scene.gameMode.isClassic) { - if (!this.scene.gameData.unlocks[Unlockables.ENDLESS_MODE]) { - this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.ENDLESS_MODE)); + if (this.isVictory && globalScene.gameMode.isClassic) { + if (!globalScene.gameData.unlocks[Unlockables.ENDLESS_MODE]) { + globalScene.unshiftPhase(new UnlockPhase(Unlockables.ENDLESS_MODE)); } - if (this.scene.getParty().filter(p => p.fusionSpecies).length && !this.scene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE]) { - this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.SPLICED_ENDLESS_MODE)); + if ( + globalScene.getPlayerParty().filter(p => p.fusionSpecies).length && + !globalScene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE] + ) { + globalScene.unshiftPhase(new UnlockPhase(Unlockables.SPLICED_ENDLESS_MODE)); } - if (!this.scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) { - this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.MINI_BLACK_HOLE)); + if (!globalScene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) { + globalScene.unshiftPhase(new UnlockPhase(Unlockables.MINI_BLACK_HOLE)); } - if (!this.scene.gameData.unlocks[Unlockables.EVIOLITE] && this.scene.getParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions)) { - this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.EVIOLITE)); + if ( + !globalScene.gameData.unlocks[Unlockables.EVIOLITE] && + globalScene.getPlayerParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions) + ) { + globalScene.unshiftPhase(new UnlockPhase(Unlockables.EVIOLITE)); } } } - awardRibbon(pokemon: Pokemon, forStarter: boolean = false): void { + awardRibbon(pokemon: Pokemon, forStarter = false): void { const speciesId = getPokemonSpecies(pokemon.species.speciesId); - const speciesRibbonCount = this.scene.gameData.incrementRibbonCount(speciesId, forStarter); + const speciesRibbonCount = globalScene.gameData.incrementRibbonCount(speciesId, forStarter); // first time classic win, award voucher if (speciesRibbonCount === 1) { this.firstRibbons.push(getPokemonSpecies(pokemon.species.getRootSpeciesId(forStarter))); } } -} + // TODO: Make function use existing getSessionSaveData() function and then modify the values from there. + /** + * Slightly modified version of {@linkcode GameData.getSessionSaveData}. + * @returns A promise containing the {@linkcode SessionSaveData} + */ + private async getRunHistoryEntry(): Promise { + const preWaveSessionData = await globalScene.gameData.getSession(globalScene.sessionSlotId); + return { + seed: globalScene.seed, + playTime: globalScene.sessionPlayTime, + gameMode: globalScene.gameMode.modeId, + party: globalScene.getPlayerParty().map(p => new PokemonData(p)), + enemyParty: globalScene.getEnemyParty().map(p => new PokemonData(p)), + modifiers: preWaveSessionData + ? preWaveSessionData.modifiers + : globalScene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)), + enemyModifiers: preWaveSessionData + ? preWaveSessionData.enemyModifiers + : globalScene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)), + arena: new ArenaData(globalScene.arena), + pokeballCounts: globalScene.pokeballCounts, + money: Math.floor(globalScene.money), + score: globalScene.score, + waveIndex: globalScene.currentBattle.waveIndex, + battleType: globalScene.currentBattle.battleType, + trainer: globalScene.currentBattle.trainer ? new TrainerData(globalScene.currentBattle.trainer) : null, + gameVersion: globalScene.game.config.gameVersion, + timestamp: new Date().getTime(), + challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), + mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, + mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, + playerFaints: globalScene.arena.playerFaints, + } as SessionSaveData; + } +} diff --git a/src/phases/hide-ability-phase.ts b/src/phases/hide-ability-phase.ts new file mode 100644 index 00000000000..0745b3f832a --- /dev/null +++ b/src/phases/hide-ability-phase.ts @@ -0,0 +1,27 @@ +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; +import { PokemonPhase } from "./pokemon-phase"; + +export class HideAbilityPhase extends PokemonPhase { + private passive: boolean; + + constructor(battlerIndex: BattlerIndex, passive = false) { + super(battlerIndex); + + this.passive = passive; + } + + start() { + super.start(); + + const pokemon = this.getPokemon(); + + if (pokemon) { + globalScene.abilityBar.hide().then(() => { + this.end(); + }); + } else { + this.end(); + } + } +} diff --git a/src/phases/hide-party-exp-bar-phase.ts b/src/phases/hide-party-exp-bar-phase.ts index 303650ea1ad..52cfd1f71d6 100644 --- a/src/phases/hide-party-exp-bar-phase.ts +++ b/src/phases/hide-party-exp-bar-phase.ts @@ -1,14 +1,10 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { BattlePhase } from "./battle-phase"; export class HidePartyExpBarPhase extends BattlePhase { - constructor(scene: BattleScene) { - super(scene); - } - start() { super.start(); - this.scene.partyExpBar.hide().then(() => this.end()); + globalScene.partyExpBar.hide().then(() => this.end()); } } diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts index fefda384092..7bed71b3363 100644 --- a/src/phases/learn-move-phase.ts +++ b/src/phases/learn-move-phase.ts @@ -1,6 +1,7 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; -import Move, { allMoves } from "#app/data/move"; +import type Move from "#app/data/moves/move"; +import { allMoves } from "#app/data/moves/move"; import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms"; import { Moves } from "#enums/moves"; import { getPokemonNameWithAffix } from "#app/messages"; @@ -10,7 +11,7 @@ import { SummaryUiMode } from "#app/ui/summary-ui-handler"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { PlayerPartyMemberPokemonPhase } from "#app/phases/player-party-member-pokemon-phase"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; export enum LearnMoveType { @@ -19,17 +20,22 @@ export enum LearnMoveType { /** For learning a move via Memory Mushroom */ MEMORY, /** For learning a move via TM */ - TM + TM, } export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { private moveId: Moves; private messageMode: Mode; - private learnMoveType; + private learnMoveType: LearnMoveType; private cost: number; - constructor(scene: BattleScene, partyMemberIndex: integer, moveId: Moves, learnMoveType: LearnMoveType = LearnMoveType.LEARN_MOVE, cost: number = -1) { - super(scene, partyMemberIndex); + constructor( + partyMemberIndex: number, + moveId: Moves, + learnMoveType: LearnMoveType = LearnMoveType.LEARN_MOVE, + cost = -1, + ) { + super(partyMemberIndex); this.moveId = moveId; this.learnMoveType = learnMoveType; this.cost = cost; @@ -48,8 +54,9 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { return this.end(); } - this.messageMode = this.scene.ui.getHandler() instanceof EvolutionSceneHandler ? Mode.EVOLUTION_SCENE : Mode.MESSAGE; - this.scene.ui.setMode(this.messageMode); + this.messageMode = + globalScene.ui.getHandler() instanceof EvolutionSceneHandler ? Mode.EVOLUTION_SCENE : Mode.MESSAGE; + globalScene.ui.setMode(this.messageMode); // If the Pokemon has less than 4 moves, the new move is added to the largest empty moveset index // If it has 4 moves, the phase then checks if the player wants to replace the move itself. if (currentMoveset.length < 4) { @@ -69,18 +76,27 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { * @param Pokemon The Pokemon learning the move */ async replaceMoveCheck(move: Move, pokemon: Pokemon) { - const learnMovePrompt = i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }); - const moveLimitReached = i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) }); - const shouldReplaceQ = i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }); - const preQText = [ learnMovePrompt, moveLimitReached ].join("$"); - await this.scene.ui.showTextPromise(preQText); - await this.scene.ui.showTextPromise(shouldReplaceQ, undefined, false); - await this.scene.ui.setModeWithoutClear(Mode.CONFIRM, + const learnMovePrompt = i18next.t("battle:learnMovePrompt", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: move.name, + }); + const moveLimitReached = i18next.t("battle:learnMoveLimitReached", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); + const shouldReplaceQ = i18next.t("battle:learnMoveReplaceQuestion", { + moveName: move.name, + }); + const preQText = [learnMovePrompt, moveLimitReached].join("$"); + await globalScene.ui.showTextPromise(preQText); + await globalScene.ui.showTextPromise(shouldReplaceQ, undefined, false); + await globalScene.ui.setModeWithoutClear( + Mode.CONFIRM, () => this.forgetMoveProcess(move, pokemon), // Yes - () => { // No - this.scene.ui.setMode(this.messageMode); + () => { + // No + globalScene.ui.setMode(this.messageMode); this.rejectMoveAndEnd(move, pokemon); - } + }, ); } @@ -96,17 +112,28 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { * @param Pokemon The Pokemon learning the move */ async forgetMoveProcess(move: Move, pokemon: Pokemon) { - this.scene.ui.setMode(this.messageMode); - await this.scene.ui.showTextPromise(i18next.t("battle:learnMoveForgetQuestion"), undefined, true); - await this.scene.ui.setModeWithoutClear(Mode.SUMMARY, pokemon, SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => { - if (moveIndex === 4) { - this.scene.ui.setMode(this.messageMode).then(() => this.rejectMoveAndEnd(move, pokemon)); - return; - } - const forgetSuccessText = i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex]!.getName() }); - const fullText = [ i18next.t("battle:countdownPoof"), forgetSuccessText, i18next.t("battle:learnMoveAnd") ].join("$"); - this.scene.ui.setMode(this.messageMode).then(() => this.learnMove(moveIndex, move, pokemon, fullText)); - }); + globalScene.ui.setMode(this.messageMode); + await globalScene.ui.showTextPromise(i18next.t("battle:learnMoveForgetQuestion"), undefined, true); + await globalScene.ui.setModeWithoutClear( + Mode.SUMMARY, + pokemon, + SummaryUiMode.LEARN_MOVE, + move, + (moveIndex: number) => { + if (moveIndex === 4) { + globalScene.ui.setMode(this.messageMode).then(() => this.rejectMoveAndEnd(move, pokemon)); + return; + } + const forgetSuccessText = i18next.t("battle:learnMoveForgetSuccess", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: pokemon.moveset[moveIndex]!.getName(), + }); + const fullText = [i18next.t("battle:countdownPoof"), forgetSuccessText, i18next.t("battle:learnMoveAnd")].join( + "$", + ); + globalScene.ui.setMode(this.messageMode).then(() => this.learnMove(moveIndex, move, pokemon, fullText)); + }, + ); } /** @@ -120,16 +147,30 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { * @param Pokemon The Pokemon learning the move */ async rejectMoveAndEnd(move: Move, pokemon: Pokemon) { - await this.scene.ui.showTextPromise(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), undefined, false); - this.scene.ui.setModeWithoutClear(Mode.CONFIRM, + await globalScene.ui.showTextPromise( + i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), + undefined, + false, + ); + globalScene.ui.setModeWithoutClear( + Mode.CONFIRM, () => { - this.scene.ui.setMode(this.messageMode); - this.scene.ui.showTextPromise(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), undefined, true).then(() => this.end()); + globalScene.ui.setMode(this.messageMode); + globalScene.ui + .showTextPromise( + i18next.t("battle:learnMoveNotLearned", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: move.name, + }), + undefined, + true, + ) + .then(() => this.end()); }, () => { - this.scene.ui.setMode(this.messageMode); + globalScene.ui.setMode(this.messageMode); this.replaceMoveCheck(move, pokemon); - } + }, ); } @@ -154,32 +195,41 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { pokemon.usedTMs = []; } pokemon.usedTMs.push(this.moveId); - this.scene.tryRemovePhase((phase) => phase instanceof SelectModifierPhase); + globalScene.tryRemovePhase(phase => phase instanceof SelectModifierPhase); } else if (this.learnMoveType === LearnMoveType.MEMORY) { if (this.cost !== -1) { if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { - this.scene.money -= this.cost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); + globalScene.money -= this.cost; + globalScene.updateMoneyText(); + globalScene.animateMoneyChanged(false); } - this.scene.playSound("se/buy"); + globalScene.playSound("se/buy"); } else { - this.scene.tryRemovePhase((phase) => phase instanceof SelectModifierPhase); + globalScene.tryRemovePhase(phase => phase instanceof SelectModifierPhase); } } pokemon.setMove(index, this.moveId); - initMoveAnim(this.scene, this.moveId).then(() => { - loadMoveAnimAssets(this.scene, [ this.moveId ], true); + initMoveAnim(this.moveId).then(() => { + loadMoveAnimAssets([this.moveId], true); + }); + globalScene.ui.setMode(this.messageMode); + const learnMoveText = i18next.t("battle:learnMove", { + pokemonName: getPokemonNameWithAffix(pokemon), + moveName: move.name, }); - this.scene.ui.setMode(this.messageMode); - const learnMoveText = i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }); if (textMessage) { - await this.scene.ui.showTextPromise(textMessage); + await globalScene.ui.showTextPromise(textMessage); } - this.scene.playSound("level_up_fanfare"); // Sound loaded into game as is - this.scene.ui.showText(learnMoveText, null, () => { - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); - this.end(); - }, this.messageMode === Mode.EVOLUTION_SCENE ? 1000 : undefined, true); + globalScene.playSound("level_up_fanfare"); // Sound loaded into game as is + globalScene.ui.showText( + learnMoveText, + null, + () => { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); + this.end(); + }, + this.messageMode === Mode.EVOLUTION_SCENE ? 1000 : undefined, + true, + ); } } diff --git a/src/phases/level-cap-phase.ts b/src/phases/level-cap-phase.ts index d1404e45010..567ac922124 100644 --- a/src/phases/level-cap-phase.ts +++ b/src/phases/level-cap-phase.ts @@ -1,20 +1,24 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { FieldPhase } from "./field-phase"; export class LevelCapPhase extends FieldPhase { - constructor(scene: BattleScene) { - super(scene); - } - start(): void { super.start(); - this.scene.ui.setMode(Mode.MESSAGE).then(() => { + globalScene.ui.setMode(Mode.MESSAGE).then(() => { // Sound loaded into game as is - this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:levelCapUp", { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true); + globalScene.playSound("level_up_fanfare"); + globalScene.ui.showText( + i18next.t("battle:levelCapUp", { + levelCap: globalScene.getMaxExpLevel(), + }), + null, + () => this.end(), + null, + true, + ); this.executeForAll(pokemon => pokemon.updateInfo(true)); }); } diff --git a/src/phases/level-up-phase.ts b/src/phases/level-up-phase.ts index a2fa8a16533..31c7fabf451 100644 --- a/src/phases/level-up-phase.ts +++ b/src/phases/level-up-phase.ts @@ -1,59 +1,79 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { ExpNotification } from "#app/enums/exp-notification"; -import { EvolutionPhase } from "#app/phases/evolution-phase"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; +import { EvolutionPhase } from "#app/phases/evolution-phase"; +import { LearnMovePhase } from "#app/phases/learn-move-phase"; +import { PlayerPartyMemberPokemonPhase } from "#app/phases/player-party-member-pokemon-phase"; import { LevelAchv } from "#app/system/achv"; +import { NumberHolder } from "#app/utils"; import i18next from "i18next"; -import * as Utils from "#app/utils"; -import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; -import { LearnMovePhase } from "./learn-move-phase"; export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { - private lastLevel: integer; - private level: integer; + protected lastLevel: number; + protected level: number; + protected pokemon: PlayerPokemon = this.getPlayerPokemon(); - constructor(scene: BattleScene, partyMemberIndex: integer, lastLevel: integer, level: integer) { - super(scene, partyMemberIndex); + constructor(partyMemberIndex: number, lastLevel: number, level: number) { + super(partyMemberIndex); this.lastLevel = lastLevel; this.level = level; - this.scene = scene; } - start() { + public override start() { super.start(); - if (this.level > this.scene.gameData.gameStats.highestLevel) { - this.scene.gameData.gameStats.highestLevel = this.level; + if (this.level > globalScene.gameData.gameStats.highestLevel) { + globalScene.gameData.gameStats.highestLevel = this.level; } - this.scene.validateAchvs(LevelAchv, new Utils.NumberHolder(this.level)); + globalScene.validateAchvs(LevelAchv, new NumberHolder(this.level)); - const pokemon = this.getPokemon(); - const prevStats = pokemon.stats.slice(0); - pokemon.calculateStats(); - pokemon.updateInfo(); - if (this.scene.expParty === ExpNotification.DEFAULT) { - this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:levelUp", { pokemonName: getPokemonNameWithAffix(this.getPokemon()), level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true); - } else if (this.scene.expParty === ExpNotification.SKIP) { + const prevStats = this.pokemon.stats.slice(0); + this.pokemon.calculateStats(); + this.pokemon.updateInfo(); + if (globalScene.expParty === ExpNotification.DEFAULT) { + globalScene.playSound("level_up_fanfare"); + globalScene.ui.showText( + i18next.t("battle:levelUp", { + pokemonName: getPokemonNameWithAffix(this.pokemon), + level: this.level, + }), + null, + () => + globalScene.ui + .getMessageHandler() + .promptLevelUpStats(this.partyMemberIndex, prevStats, false) + .then(() => this.end()), + null, + true, + ); + } else if (globalScene.expParty === ExpNotification.SKIP) { this.end(); } else { // we still want to display the stats if activated - this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()); - } - if (this.lastLevel < 100) { // this feels like an unnecessary optimization - const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1); - for (const lm of levelMoves) { - this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, lm[1])); - } - } - if (!pokemon.pauseEvolutions) { - const evolution = pokemon.getEvolution(); - if (evolution) { - this.scene.unshiftPhase(new EvolutionPhase(this.scene, pokemon as PlayerPokemon, evolution, this.lastLevel)); - } + globalScene.ui + .getMessageHandler() + .promptLevelUpStats(this.partyMemberIndex, prevStats, false) + .then(() => this.end()); } } + + public override end() { + if (this.lastLevel < 100) { + // this feels like an unnecessary optimization + const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1); + for (const lm of levelMoves) { + globalScene.unshiftPhase(new LearnMovePhase(this.partyMemberIndex, lm[1])); + } + } + if (!this.pokemon.pauseEvolutions) { + const evolution = this.pokemon.getEvolution(); + if (evolution) { + globalScene.unshiftPhase(new EvolutionPhase(this.pokemon, evolution, this.lastLevel)); + } + } + return super.end(); + } } diff --git a/src/phases/load-move-anim-phase.ts b/src/phases/load-move-anim-phase.ts new file mode 100644 index 00000000000..3d914f738a7 --- /dev/null +++ b/src/phases/load-move-anim-phase.ts @@ -0,0 +1,20 @@ +import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import type { Moves } from "#enums/moves"; +import { Phase } from "#app/phase"; + +/** + * Phase for synchronous move animation loading. + * Should be used when a move invokes another move that + * isn't already loaded (e.g. for Metronome) + */ +export class LoadMoveAnimPhase extends Phase { + constructor(protected moveId: Moves) { + super(); + } + + public override start(): void { + initMoveAnim(this.moveId) + .then(() => loadMoveAnimAssets([this.moveId], true)) + .then(() => this.end()); + } +} diff --git a/src/phases/login-phase.ts b/src/phases/login-phase.ts index ac1e68d1b0e..5cce6ca0298 100644 --- a/src/phases/login-phase.ts +++ b/src/phases/login-phase.ts @@ -1,5 +1,6 @@ import { updateUserInfo } from "#app/account"; -import BattleScene, { bypassLogin } from "#app/battle-scene"; +import { bypassLogin } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; import { handleTutorial, Tutorial } from "#app/tutorial"; import { Mode } from "#app/ui/ui"; @@ -11,8 +12,8 @@ import { UnavailablePhase } from "./unavailable-phase"; export class LoginPhase extends Phase { private showText: boolean; - constructor(scene: BattleScene, showText?: boolean) { - super(scene); + constructor(showText?: boolean) { + super(); this.showText = showText === undefined || !!showText; } @@ -22,95 +23,98 @@ export class LoginPhase extends Phase { const hasSession = !!Utils.getCookie(Utils.sessionIdKey); - this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); Utils.executeIf(bypassLogin || hasSession, updateUserInfo).then(response => { const success = response ? response[0] : false; const statusCode = response ? response[1] : null; if (!success) { if (!statusCode || statusCode === 400) { if (this.showText) { - this.scene.ui.showText(i18next.t("menu:logInOrCreateAccount")); + globalScene.ui.showText(i18next.t("menu:logInOrCreateAccount")); } - this.scene.playSound("menu_open"); + globalScene.playSound("menu_open"); const loadData = () => { updateUserInfo().then(success => { if (!success[0]) { Utils.removeCookie(Utils.sessionIdKey); - this.scene.reset(true, true); + globalScene.reset(true, true); return; } - this.scene.gameData.loadSystem().then(() => this.end()); + globalScene.gameData.loadSystem().then(() => this.end()); }); }; - this.scene.ui.setMode(Mode.LOGIN_FORM, { + globalScene.ui.setMode(Mode.LOGIN_FORM, { buttonActions: [ () => { - this.scene.ui.playSelect(); + globalScene.ui.playSelect(); loadData(); - }, () => { - this.scene.playSound("menu_open"); - this.scene.ui.setMode(Mode.REGISTRATION_FORM, { + }, + () => { + globalScene.playSound("menu_open"); + globalScene.ui.setMode(Mode.REGISTRATION_FORM, { buttonActions: [ () => { - this.scene.ui.playSelect(); + globalScene.ui.playSelect(); updateUserInfo().then(success => { if (!success[0]) { Utils.removeCookie(Utils.sessionIdKey); - this.scene.reset(true, true); + globalScene.reset(true, true); return; } this.end(); - } ); - }, () => { - this.scene.unshiftPhase(new LoginPhase(this.scene, false)); + }); + }, + () => { + globalScene.unshiftPhase(new LoginPhase(false)); this.end(); - } - ] + }, + ], }); - }, () => { + }, + () => { const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/discord/callback`); const discordId = import.meta.env.VITE_DISCORD_CLIENT_ID; const discordUrl = `https://discord.com/api/oauth2/authorize?client_id=${discordId}&redirect_uri=${redirectUri}&response_type=code&scope=identify&prompt=none`; window.open(discordUrl, "_self"); - }, () => { + }, + () => { const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/google/callback`); const googleId = import.meta.env.VITE_GOOGLE_CLIENT_ID; const googleUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${googleId}&redirect_uri=${redirectUri}&response_type=code&scope=openid`; window.open(googleUrl, "_self"); - } - ] + }, + ], }); } else if (statusCode === 401) { Utils.removeCookie(Utils.sessionIdKey); - this.scene.reset(true, true); + globalScene.reset(true, true); } else { - this.scene.unshiftPhase(new UnavailablePhase(this.scene)); + globalScene.unshiftPhase(new UnavailablePhase()); super.end(); } return null; - } else { - this.scene.gameData.loadSystem().then(success => { - if (success || bypassLogin) { - this.end(); - } else { - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(t("menu:failedToLoadSaveData")); - } - }); } + globalScene.gameData.loadSystem().then(success => { + if (success || bypassLogin) { + this.end(); + } else { + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText(t("menu:failedToLoadSaveData")); + } + }); }); } end(): void { - this.scene.ui.setMode(Mode.MESSAGE); + globalScene.ui.setMode(Mode.MESSAGE); - if (!this.scene.gameData.gender) { - this.scene.unshiftPhase(new SelectGenderPhase(this.scene)); + if (!globalScene.gameData.gender) { + globalScene.unshiftPhase(new SelectGenderPhase()); } - handleTutorial(this.scene, Tutorial.Intro).then(() => super.end()); + handleTutorial(Tutorial.Intro).then(() => super.end()); } } diff --git a/src/phases/message-phase.ts b/src/phases/message-phase.ts index 1d953801178..f671307d86a 100644 --- a/src/phases/message-phase.ts +++ b/src/phases/message-phase.ts @@ -1,15 +1,21 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; export class MessagePhase extends Phase { private text: string; - private callbackDelay: integer | null; + private callbackDelay: number | null; private prompt: boolean | null; - private promptDelay: integer | null; + private promptDelay: number | null; private speaker?: string; - constructor(scene: BattleScene, text: string, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null, speaker?: string) { - super(scene); + constructor( + text: string, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + speaker?: string, + ) { + super(); this.text = text; this.callbackDelay = callbackDelay!; // TODO: is this bang correct? @@ -23,22 +29,36 @@ export class MessagePhase extends Phase { if (this.text.indexOf("$") > -1) { const pageIndex = this.text.indexOf("$"); - this.scene.unshiftPhase(new MessagePhase(this.scene, this.text.slice(pageIndex + 1), this.callbackDelay, this.prompt, this.promptDelay, this.speaker)); + globalScene.unshiftPhase( + new MessagePhase( + this.text.slice(pageIndex + 1), + this.callbackDelay, + this.prompt, + this.promptDelay, + this.speaker, + ), + ); this.text = this.text.slice(0, pageIndex).trim(); } if (this.speaker) { - this.scene.ui.showDialogue(this.text, this.speaker, null, () => this.end(), this.callbackDelay || (this.prompt ? 0 : 1500), this.promptDelay ?? 0); + globalScene.ui.showDialogue( + this.text, + this.speaker, + null, + () => this.end(), + this.callbackDelay || (this.prompt ? 0 : 1500), + this.promptDelay ?? 0, + ); } else { - this.scene.ui.showText(this.text, null, () => this.end(), this.callbackDelay || (this.prompt ? 0 : 1500), this.prompt, this.promptDelay); + globalScene.ui.showText( + this.text, + null, + () => this.end(), + this.callbackDelay || (this.prompt ? 0 : 1500), + this.prompt, + this.promptDelay, + ); } } - - end() { - if (this.scene.abilityBar.shown) { - this.scene.abilityBar.hide(); - } - - super.end(); - } } diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts index 20a8366d9c6..c94c4deb819 100644 --- a/src/phases/modifier-reward-phase.ts +++ b/src/phases/modifier-reward-phase.ts @@ -1,13 +1,14 @@ -import BattleScene from "#app/battle-scene"; -import { ModifierType, ModifierTypeFunc, getModifierType } from "#app/modifier/modifier-type"; +import { globalScene } from "#app/global-scene"; +import type { ModifierType, ModifierTypeFunc } from "#app/modifier/modifier-type"; +import { getModifierType } from "#app/modifier/modifier-type"; import i18next from "i18next"; import { BattlePhase } from "./battle-phase"; export class ModifierRewardPhase extends BattlePhase { protected modifierType: ModifierType; - constructor(scene: BattleScene, modifierTypeFunc: ModifierTypeFunc) { - super(scene); + constructor(modifierTypeFunc: ModifierTypeFunc) { + super(); this.modifierType = getModifierType(modifierTypeFunc); } @@ -21,10 +22,17 @@ export class ModifierRewardPhase extends BattlePhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - this.scene.addModifier(newModifier).then(() => { - this.scene.playSound("item_fanfare"); - this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); - }); + globalScene.addModifier(newModifier); + globalScene.playSound("item_fanfare"); + globalScene.ui.showText( + i18next.t("battle:rewardGain", { + modifierName: newModifier?.type.name, + }), + null, + () => resolve(), + null, + true, + ); }); } } diff --git a/src/phases/money-reward-phase.ts b/src/phases/money-reward-phase.ts index 2f0a4f7b990..56f46d25f77 100644 --- a/src/phases/money-reward-phase.ts +++ b/src/phases/money-reward-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { ArenaTagType } from "#app/enums/arena-tag-type"; import { MoneyMultiplierModifier } from "#app/modifier/modifier"; import i18next from "i18next"; @@ -8,27 +8,29 @@ import { BattlePhase } from "./battle-phase"; export class MoneyRewardPhase extends BattlePhase { private moneyMultiplier: number; - constructor(scene: BattleScene, moneyMultiplier: number) { - super(scene); + constructor(moneyMultiplier: number) { + super(); this.moneyMultiplier = moneyMultiplier; } start() { - const moneyAmount = new Utils.IntegerHolder(this.scene.getWaveMoneyAmount(this.moneyMultiplier)); + const moneyAmount = new Utils.NumberHolder(globalScene.getWaveMoneyAmount(this.moneyMultiplier)); - this.scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); - if (this.scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { + if (globalScene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { moneyAmount.value *= 2; } - this.scene.addMoney(moneyAmount.value); + globalScene.addMoney(moneyAmount.value); const userLocale = navigator.language || "en-US"; const formattedMoneyAmount = moneyAmount.value.toLocaleString(userLocale); - const message = i18next.t("battle:moneyWon", { moneyAmount: formattedMoneyAmount }); + const message = i18next.t("battle:moneyWon", { + moneyAmount: formattedMoneyAmount, + }); - this.scene.ui.showText(message, null, () => this.end(), null, true); + globalScene.ui.showText(message, null, () => this.end(), null, true); } } diff --git a/src/phases/move-anim-phase.ts b/src/phases/move-anim-phase.ts new file mode 100644 index 00000000000..830e72cb8be --- /dev/null +++ b/src/phases/move-anim-phase.ts @@ -0,0 +1,20 @@ +import type { MoveAnim } from "#app/data/battle-anims"; +import { Phase } from "#app/phase"; + +/** + * Plays the given {@linkcode MoveAnim} sequentially. + */ +export class MoveAnimPhase extends Phase { + constructor( + protected anim: Anim, + protected onSubstitute = false, + ) { + super(); + } + + public override start(): void { + super.start(); + + this.anim.play(this.onSubstitute, () => this.end()); + } +} diff --git a/src/phases/move-anim-test-phase.ts b/src/phases/move-anim-test-phase.ts index e4b04ce5de6..e8b7c0c8fa7 100644 --- a/src/phases/move-anim-test-phase.ts +++ b/src/phases/move-anim-test-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { initMoveAnim, loadMoveAnimAssets, MoveAnim } from "#app/data/battle-anims"; -import { allMoves, SelfStatusMove } from "#app/data/move"; +import { allMoves, SelfStatusMove } from "#app/data/moves/move"; import { Moves } from "#app/enums/moves"; import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; @@ -8,8 +8,8 @@ import { BattlePhase } from "./battle-phase"; export class MoveAnimTestPhase extends BattlePhase { private moveQueue: Moves[]; - constructor(scene: BattleScene, moveQueue?: Moves[]) { - super(scene); + constructor(moveQueue?: Moves[]) { + super(); this.moveQueue = moveQueue || Utils.getEnumValues(Moves).slice(1); } @@ -24,23 +24,27 @@ export class MoveAnimTestPhase extends BattlePhase { if (moveId === undefined) { this.playMoveAnim(this.moveQueue.slice(0), true); return; - } else if (player) { + } + if (player) { console.log(Moves[moveId]); } - initMoveAnim(this.scene, moveId).then(() => { - loadMoveAnimAssets(this.scene, [ moveId ], true) - .then(() => { - const user = player ? this.scene.getPlayerPokemon()! : this.scene.getEnemyPokemon()!; - const target = (player !== (allMoves[moveId] instanceof SelfStatusMove)) ? this.scene.getEnemyPokemon()! : this.scene.getPlayerPokemon()!; - new MoveAnim(moveId, user, target.getBattlerIndex()).play(this.scene, allMoves[moveId].hitsSubstitute(user, target), () => { // TODO: are the bangs correct here? - if (player) { - this.playMoveAnim(moveQueue, false); - } else { - this.playMoveAnim(moveQueue, true); - } - }); + initMoveAnim(moveId).then(() => { + loadMoveAnimAssets([moveId], true).then(() => { + const user = player ? globalScene.getPlayerPokemon()! : globalScene.getEnemyPokemon()!; + const target = + player !== allMoves[moveId] instanceof SelfStatusMove + ? globalScene.getEnemyPokemon()! + : globalScene.getPlayerPokemon()!; + new MoveAnim(moveId, user, target.getBattlerIndex()).play(allMoves[moveId].hitsSubstitute(user, target), () => { + // TODO: are the bangs correct here? + if (player) { + this.playMoveAnim(moveQueue, false); + } else { + this.playMoveAnim(moveQueue, true); + } }); + }); }); } } diff --git a/src/phases/move-charge-phase.ts b/src/phases/move-charge-phase.ts index d1dc340b81b..26ad85bbe03 100644 --- a/src/phases/move-charge-phase.ts +++ b/src/phases/move-charge-phase.ts @@ -1,8 +1,10 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; import { MoveChargeAnim } from "#app/data/battle-anims"; -import { applyMoveChargeAttrs, MoveEffectAttr, InstantChargeAttr } from "#app/data/move"; -import Pokemon, { MoveResult, PokemonMove } from "#app/field/pokemon"; +import { applyMoveChargeAttrs, MoveEffectAttr, InstantChargeAttr } from "#app/data/moves/move"; +import type { PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { MoveResult } from "#app/field/pokemon"; import { BooleanHolder } from "#app/utils"; import { MovePhase } from "#app/phases/move-phase"; import { PokemonPhase } from "#app/phases/pokemon-phase"; @@ -19,8 +21,8 @@ export class MoveChargePhase extends PokemonPhase { /** The field index targeted by the move (Charging moves assume single target) */ public targetIndex: BattlerIndex; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, targetIndex: BattlerIndex, move: PokemonMove) { - super(scene, battlerIndex); + constructor(battlerIndex: BattlerIndex, targetIndex: BattlerIndex, move: PokemonMove) { + super(battlerIndex); this.move = move; this.targetIndex = targetIndex; } @@ -34,18 +36,17 @@ export class MoveChargePhase extends PokemonPhase { // If the target is somehow not defined, or the move is somehow not a ChargingMove, // immediately end this phase. - if (!target || !(move.isChargingMove())) { + if (!target || !move.isChargingMove()) { console.warn("Invalid parameters for MoveChargePhase"); return super.end(); } - new MoveChargeAnim(move.chargeAnim, move.id, user).play(this.scene, false, () => { + new MoveChargeAnim(move.chargeAnim, move.id, user).play(false, () => { move.showChargeText(user, target); - applyMoveChargeAttrs(MoveEffectAttr, user, target, move).then(() => { - user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); - this.end(); - }); + applyMoveChargeAttrs(MoveEffectAttr, user, target, move); + user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); + this.end(); }); } @@ -61,24 +62,28 @@ export class MoveChargePhase extends PokemonPhase { if (instantCharge.value) { // this MoveEndPhase will be duplicated by the queued MovePhase if not removed - this.scene.tryRemovePhase((phase) => phase instanceof MoveEndPhase && phase.getPokemon() === user); + globalScene.tryRemovePhase(phase => phase instanceof MoveEndPhase && phase.getPokemon() === user); // queue a new MovePhase for this move's attack phase - this.scene.unshiftPhase(new MovePhase(this.scene, user, [ this.targetIndex ], this.move, false)); + globalScene.unshiftPhase(new MovePhase(user, [this.targetIndex], this.move, false)); } else { - user.getMoveQueue().push({ move: move.id, targets: [ this.targetIndex ]}); + user.getMoveQueue().push({ move: move.id, targets: [this.targetIndex] }); } // Add this move's charging phase to the user's move history - user.pushMoveHistory({ move: this.move.moveId, targets: [ this.targetIndex ], result: MoveResult.OTHER }); + user.pushMoveHistory({ + move: this.move.moveId, + targets: [this.targetIndex], + result: MoveResult.OTHER, + }); } super.end(); } public getUserPokemon(): Pokemon { - return (this.player ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.fieldIndex]; + return (this.player ? globalScene.getPlayerField() : globalScene.getEnemyField())[this.fieldIndex]; } public getTargetPokemon(): Pokemon | undefined { - return this.scene.getField(true).find((p) => this.targetIndex === p.getBattlerIndex()); + return globalScene.getField(true).find(p => this.targetIndex === p.getBattlerIndex()); } } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 2b898f7d66b..4152fc243f0 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -1,28 +1,87 @@ -import BattleScene from "#app/battle-scene"; import { BattlerIndex } from "#app/battle"; -import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr, TypeImmunityAbAttr } from "#app/data/ability"; +import { globalScene } from "#app/global-scene"; +import { + AddSecondStrikeAbAttr, + AlwaysHitAbAttr, + applyPostAttackAbAttrs, + applyPostDamageAbAttrs, + applyPostDefendAbAttrs, + applyPreAttackAbAttrs, + IgnoreMoveEffectsAbAttr, + MaxMultiHitAbAttr, + PostAttackAbAttr, + PostDamageAbAttr, + PostDefendAbAttr, + ReflectStatusMoveAbAttr, + TypeImmunityAbAttr, +} from "#app/data/ability"; import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag"; import { MoveAnim } from "#app/data/battle-anims"; -import { BattlerTagLapseType, DamageProtectedTag, ProtectedTag, SemiInvulnerableTag, SubstituteTag } from "#app/data/battler-tags"; -import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, OneHitKOAttr, MoveEffectTrigger, MoveCategory, NoEffectAttr, HitsTagAttr, ToxicAccuracyAttr } from "#app/data/move"; +import { + BattlerTagLapseType, + DamageProtectedTag, + ProtectedTag, + SemiInvulnerableTag, + SubstituteTag, +} from "#app/data/battler-tags"; +import type { MoveAttr } from "#app/data/moves/move"; +import { + applyFilteredMoveAttrs, + applyMoveAttrs, + AttackMove, + DelayedAttackAttr, + FlinchAttr, + getMoveTargets, + HitsTagAttr, + MissEffectAttr, + MoveEffectAttr, + MultiHitAttr, + NoEffectAttr, + OneHitKOAttr, + OverrideMoveEffectAttr, + ToxicAccuracyAttr, + VariableTargetAttr, +} from "#app/data/moves/move"; +import { MoveEffectTrigger } from "#enums/MoveEffectTrigger"; +import { MoveFlags } from "#enums/MoveFlags"; +import { MoveTarget } from "#enums/MoveTarget"; +import { MoveCategory } from "#enums/MoveCategory"; import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { Moves } from "#app/enums/moves"; -import Pokemon, { PokemonMove, MoveResult, HitResult } from "#app/field/pokemon"; +import { PokemonType } from "#enums/pokemon-type"; +import { PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { HitResult, MoveResult } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; -import { PokemonMultiHitModifier, FlinchChanceModifier, EnemyAttackStatusEffectChanceModifier, ContactHeldItemTransferChanceModifier, HitHealModifier } from "#app/modifier/modifier"; +import { + ContactHeldItemTransferChanceModifier, + EnemyAttackStatusEffectChanceModifier, + FlinchChanceModifier, + HitHealModifier, + PokemonMultiHitModifier, +} from "#app/modifier/modifier"; +import { PokemonPhase } from "#app/phases/pokemon-phase"; +import { BooleanHolder, isNullOrUndefined, NumberHolder } from "#app/utils"; +import type { nil } from "#app/utils"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import type { Moves } from "#enums/moves"; import i18next from "i18next"; -import * as Utils from "#app/utils"; -import { PokemonPhase } from "./pokemon-phase"; -import { Type } from "#app/data/type"; +import type { Phase } from "#app/phase"; +import { ShowAbilityPhase } from "./show-ability-phase"; +import { MovePhase } from "./move-phase"; +import { MoveEndPhase } from "./move-end-phase"; export class MoveEffectPhase extends PokemonPhase { public move: PokemonMove; protected targets: BattlerIndex[]; + protected reflected = false; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove) { - super(scene, battlerIndex); + /** + * @param reflected Indicates that the move was reflected by the user due to magic coat or magic bounce + */ + constructor(battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove, reflected = false) { + super(battlerIndex); this.move = move; + this.reflected = reflected; /** * In double battles, if the right Pokemon selects a spread move and the left Pokemon dies * with no party members available to switch in, then the right Pokemon takes the index @@ -35,7 +94,7 @@ export class MoveEffectPhase extends PokemonPhase { this.targets = targets; } - start() { + public override start(): void { super.start(); /** The Pokemon using this phase's invoked move */ @@ -43,122 +102,267 @@ export class MoveEffectPhase extends PokemonPhase { /** All Pokemon targeted by this phase's invoked move */ const targets = this.getTargets(); - /** If the user was somehow removed from the field, end this phase */ - if (!user?.isOnField()) { + if (!user) { return super.end(); } + /** If an enemy used this move, set this as last enemy that used move or ability */ + if (!user.isPlayer()) { + globalScene.currentBattle.lastEnemyInvolved = this.fieldIndex; + } else { + globalScene.currentBattle.lastPlayerInvolved = this.fieldIndex; + } + + const isDelayedAttack = this.move.getMove().hasAttr(DelayedAttackAttr); + /** If the user was somehow removed from the field and it's not a delayed attack, end this phase */ + if (!user.isOnField()) { + if (!isDelayedAttack) { + return super.end(); + } else { + if (!user.scene) { + /** + * This happens if the Pokemon that used the delayed attack gets caught and released + * on the turn the attack would have triggered. Having access to the global scene + * in the future may solve this entirely, so for now we just cancel the hit + */ + return super.end(); + } + if (isNullOrUndefined(user.turnData)) { + user.resetTurnData(); + } + } + } + /** * Does an effect from this move override other effects on this turn? * e.g. Charging moves (Fly, etc.) on their first turn of use. */ - const overridden = new Utils.BooleanHolder(false); + const overridden = new BooleanHolder(false); /** The {@linkcode Move} object from {@linkcode allMoves} invoked by this phase */ const move = this.move.getMove(); // Assume single target for override - applyMoveAttrs(OverrideMoveEffectAttr, user, this.getTarget() ?? null, move, overridden, this.move.virtual).then(() => { - // If other effects were overriden, stop this phase before they can be applied - if (overridden.value) { - return this.end(); + applyMoveAttrs(OverrideMoveEffectAttr, user, this.getFirstTarget() ?? null, move, overridden, this.move.virtual); + + // If other effects were overriden, stop this phase before they can be applied + if (overridden.value) { + return this.end(); + } + + 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 + * effects of the move itself, Parental Bond, and Multi-Lens to do so. + */ + if (user.turnData.hitsLeft === -1) { + const hitCount = new NumberHolder(1); + // Assume single target for multi hit + applyMoveAttrs(MultiHitAttr, user, this.getFirstTarget() ?? null, move, hitCount); + // If Parental Bond is applicable, add another hit + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, hitCount, null); + // If Multi-Lens is applicable, add hits equal to the number of held Multi-Lenses + globalScene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, move.id, hitCount); + // Set the user's relevant turnData fields to reflect the final hit count + user.turnData.hitCount = hitCount.value; + user.turnData.hitsLeft = hitCount.value; + } + + /** + * Log to be entered into the user's move history once the move result is resolved. + * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully + * used in the sense of "Does it have an effect on the user?". + */ + const moveHistoryEntry = { + move: this.move.moveId, + targets: this.targets, + result: MoveResult.PENDING, + virtual: this.move.virtual, + }; + + /** + * Stores results of hit checks of the invoked move against all targets, organized by battler index. + * @see {@linkcode hitCheck} + */ + const targetHitChecks = Object.fromEntries(targets.map(p => [p.getBattlerIndex(), this.hitCheck(p)])); + const hasActiveTargets = targets.some(t => t.isActive(true)); + + /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ + const isImmune = + targets[0]?.hasAbilityWithAttr(TypeImmunityAbAttr) && + targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move) && + !targets[0]?.getTag(SemiInvulnerableTag); + + const mayBounce = + move.hasFlag(MoveFlags.REFLECTABLE) && + !this.reflected && + targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); + + /** + * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target + * (and not random target) and failed the hit check against its target (MISS), log the move + * as FAILed or MISSed (depending on the conditions above) and end this phase. + */ + if ( + !hasActiveTargets || + (!mayBounce && + !move.hasAttr(VariableTargetAttr) && + !move.isMultiTarget() && + !targetHitChecks[this.targets[0]] && + !targets[0].getTag(ProtectedTag) && + !isImmune) + ) { + this.stopMultiHit(); + if (hasActiveTargets) { + globalScene.queueMessage( + i18next.t("battle:attackMissed", { + pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "", + }), + ); + moveHistoryEntry.result = MoveResult.MISS; + applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); + } else { + globalScene.queueMessage(i18next.t("battle:attackFailed")); + moveHistoryEntry.result = MoveResult.FAIL; } + user.pushMoveHistory(moveHistoryEntry); + return this.end(); + } - user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); - - /** - * If this phase is for the first hit of the invoked move, - * resolve the move's total hit count. This block combines the - * effects of the move itself, Parental Bond, and Multi-Lens to do so. - */ - if (user.turnData.hitsLeft === -1) { - const hitCount = new Utils.IntegerHolder(1); - // Assume single target for multi hit - applyMoveAttrs(MultiHitAttr, user, this.getTarget() ?? null, move, hitCount); - // If Parental Bond is applicable, double the hit count - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, targets.length, hitCount, new Utils.IntegerHolder(0)); - // If Multi-Lens is applicable, multiply the hit count by 1 + the number of Multi-Lenses held by the user - if (move instanceof AttackMove && !move.hasAttr(FixedDamageAttr)) { - this.scene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, hitCount, new Utils.IntegerHolder(0)); - } - // Set the user's relevant turnData fields to reflect the final hit count - user.turnData.hitCount = hitCount.value; - user.turnData.hitsLeft = hitCount.value; - } - - /** - * Log to be entered into the user's move history once the move result is resolved. - * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully - * used in the sense of "Does it have an effect on the user?". - */ - const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; - - /** - * Stores results of hit checks of the invoked move against all targets, organized by battler index. - * @see {@linkcode hitCheck} - */ - const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); - const hasActiveTargets = targets.some(t => t.isActive(true)); - - /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ - const isImmune = targets[0].hasAbilityWithAttr(TypeImmunityAbAttr) && (targets[0].getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !targets[0].getTag(SemiInvulnerableTag); - - /** - * If no targets are left for the move to hit (FAIL), or the invoked move is single-target - * (and not random target) and failed the hit check against its target (MISS), log the move - * as FAILed or MISSed (depending on the conditions above) and end this phase. - */ - if (!hasActiveTargets || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { - this.stopMultiHit(); - if (hasActiveTargets) { - this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getTarget() ? getPokemonNameWithAffix(this.getTarget()!) : "" })); - moveHistoryEntry.result = MoveResult.MISS; - applyMoveAttrs(MissEffectAttr, user, null, move); - } else { - this.scene.queueMessage(i18next.t("battle:attackFailed")); - moveHistoryEntry.result = MoveResult.FAIL; - } - user.pushMoveHistory(moveHistoryEntry); - return this.end(); - } - - /** All move effect attributes are chained together in this array to be applied asynchronously. */ - const applyAttrs: Promise[] = []; - - const playOnEmptyField = this.scene.currentBattle?.mysteryEncounter?.hasBattleAnimationsWithoutTargets ?? false; - // Move animation only needs one target - new MoveAnim(move.id as Moves, user, this.getTarget()!.getBattlerIndex()!, playOnEmptyField).play(this.scene, move.hitsSubstitute(user, this.getTarget()!), () => { + const playOnEmptyField = globalScene.currentBattle?.mysteryEncounter?.hasBattleAnimationsWithoutTargets ?? false; + // Move animation only needs one target + new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play( + move.hitsSubstitute(user, this.getFirstTarget()!), + () => { /** Has the move successfully hit a target (for damage) yet? */ - let hasHit: boolean = false; - for (const target of targets) { + let hasHit = false; + // Prevent ENEMY_SIDE targeted moves from occurring twice in double battles + // and check which target will magic bounce. + const trueTargets: Pokemon[] = + move.moveTarget !== MoveTarget.ENEMY_SIDE + ? targets + : (() => { + const magicCoatTargets = targets.filter( + t => t.getTag(BattlerTagType.MAGIC_COAT) || t.hasAbilityWithAttr(ReflectStatusMoveAbAttr), + ); + + // only magic coat effect cares about order + if (!mayBounce || magicCoatTargets.length === 0) { + return [targets[0]]; + } + return [magicCoatTargets[0]]; + })(); + + const queuedPhases: Phase[] = []; + for (const target of trueTargets) { /** The {@linkcode ArenaTagSide} to which the target belongs */ const targetSide = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; /** Has the invoked move been cancelled by conditional protection (e.g Quick Guard)? */ - const hasConditionalProtectApplied = new Utils.BooleanHolder(false); + const hasConditionalProtectApplied = new BooleanHolder(false); /** Does the applied conditional protection bypass Protect-ignoring effects? */ - const bypassIgnoreProtect = new Utils.BooleanHolder(false); + const bypassIgnoreProtect = new BooleanHolder(false); /** If the move is not targeting a Pokemon on the user's side, try to apply conditional protection effects */ if (!this.move.getMove().isAllyTarget()) { - this.scene.arena.applyTagsForSide(ConditionalProtectTag, targetSide, false, hasConditionalProtectApplied, user, target, move.id, bypassIgnoreProtect); + globalScene.arena.applyTagsForSide( + ConditionalProtectTag, + targetSide, + false, + hasConditionalProtectApplied, + user, + target, + move.id, + bypassIgnoreProtect, + ); } /** Is the target protected by Protect, etc. or a relevant conditional protection effect? */ - const isProtected = (bypassIgnoreProtect.value || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target)) - && (hasConditionalProtectApplied.value || (!target.findTags(t => t instanceof DamageProtectedTag).length && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType))) - || (this.move.getMove().category !== MoveCategory.STATUS && target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType)))); + const isProtected = + ![MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES].includes(this.move.getMove().moveTarget) && + (bypassIgnoreProtect.value || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target)) && + (hasConditionalProtectApplied.value || + (!target.findTags(t => t instanceof DamageProtectedTag).length && + target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType))) || + (this.move.getMove().category !== MoveCategory.STATUS && + target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType)))); + + /** Is the target hidden by the effects of its Commander ability? */ + const isCommanding = + globalScene.currentBattle.double && + target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target; + + /** Is the target reflecting status moves from the magic coat move? */ + const isReflecting = !!target.getTag(BattlerTagType.MAGIC_COAT); + + /** Is the target's magic bounce ability not ignored and able to reflect this move? */ + const canMagicBounce = + !isReflecting && + !move.checkFlag(MoveFlags.IGNORE_ABILITIES, user, target) && + target.hasAbilityWithAttr(ReflectStatusMoveAbAttr); + + const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); + + /** Is the target reflecting the effect, not protected, and not in an semi-invulnerable state?*/ + const willBounce = + !isProtected && + !this.reflected && + !isCommanding && + move.hasFlag(MoveFlags.REFLECTABLE) && + (isReflecting || canMagicBounce) && + !semiInvulnerableTag; + + // If the move will bounce, then queue the bounce and move on to the next target + if (!target.switchOutStatus && willBounce) { + const newTargets = move.isMultiTarget() + ? getMoveTargets(target, move.id).targets + : [user.getBattlerIndex()]; + if (!isReflecting) { + queuedPhases.push( + new ShowAbilityPhase( + target.getBattlerIndex(), + target.getPassiveAbility().hasAttr(ReflectStatusMoveAbAttr), + ), + ); + } + + queuedPhases.push( + new MovePhase(target, newTargets, new PokemonMove(move.id, 0, 0, true), true, true, true), + ); + continue; + } /** Is the pokemon immune due to an ablility, and also not in a semi invulnerable state? */ - const isImmune = target.hasAbilityWithAttr(TypeImmunityAbAttr) && (target.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !target.getTag(SemiInvulnerableTag); + const isImmune = + target.hasAbilityWithAttr(TypeImmunityAbAttr) && + target.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move) && + !semiInvulnerableTag; /** * 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 (!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) { + globalScene.queueMessage( + i18next.t("battle:attackMissed", { + pokemonNameWithAffix: getPokemonNameWithAffix(target), + }), + ); + } if (moveHistoryEntry.result === MoveResult.PENDING) { moveHistoryEntry.result = MoveResult.MISS; } @@ -168,7 +372,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Does this phase represent the invoked move's first strike? */ - const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); + const firstHit = user.turnData.hitsLeft === user.turnData.hitCount; // Only log the move's result on the first strike if (firstHit) { @@ -200,7 +404,7 @@ export class MoveEffectPhase extends PokemonPhase { HitResult.EFFECTIVE, HitResult.SUPER_EFFECTIVE, HitResult.NOT_VERY_EFFECTIVE, - HitResult.ONE_HIT_KO + HitResult.ONE_HIT_KO, ].includes(hitResult); /** Is this target the first one hit by the move on its current strike? */ @@ -218,7 +422,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Does this phase represent the invoked move's last strike? */ - const lastHit = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()); + const lastHit = user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive(); /** * If the user can change forms by using the invoked move, @@ -226,118 +430,78 @@ export class MoveEffectPhase extends PokemonPhase { * (see Relic Song's interaction with Parental Bond when used by Meloetta). */ if (lastHit) { - this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); + globalScene.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. - * 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. - */ - applyAttrs.push(new Promise(resolve => { - // Apply all effects with PRE_MOVE triggers (if the target isn't immune to the move) - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit) && hitResult !== HitResult.NO_EFFECT, - user, target, move).then(() => { - // All other effects require the move to not have failed or have been cancelled to trigger - if (hitResult !== HitResult.FAIL) { - /** - * If the invoked move's effects are meant to trigger during the move's "charge turn," - * ignore all effects after this point. - * Otherwise, apply all self-targeted POST_APPLY effects. - */ - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY - && attr.selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, move).then(() => { - // All effects past this point require the move to have hit the target - if (hitResult !== HitResult.NO_EFFECT) { - // Apply all non-self-targeted POST_APPLY effects - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_APPLY - && !(attr as MoveEffectAttr).selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()).then(() => { - /** - * If the move hit, and the target doesn't have Shield Dust, - * apply the chance to flinch the target gained from King's Rock - */ - if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !move.hitsSubstitute(user, target)) { - const flinched = new Utils.BooleanHolder(false); - user.scene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); - if (flinched.value) { - target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); - } - } - // If the move was not protected against, apply all HIT effects - Utils.executeIf(!isProtected, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.HIT - && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit) && (!attr.firstTargetOnly || firstTarget), user, target, this.move.getMove()).then(() => { - // Apply the target's post-defend ability effects (as long as the target is active or can otherwise apply them) - return Utils.executeIf(!target.isFainted() || target.canApplyAbility(), () => applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult).then(() => { - // Only apply the following effects if the move was not deflected by a substitute - if (move.hitsSubstitute(user, target)) { - return resolve(); - } + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.PRE_APPLY && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit) && + hitResult !== HitResult.NO_EFFECT, + user, + target, + move, + ); - // If the invoked move is an enemy attack, apply the enemy's status effect-inflicting tokens - if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { - user.scene.applyShuffledModifiers(this.scene, EnemyAttackStatusEffectChanceModifier, false, target); - } - target.lapseTags(BattlerTagLapseType.AFTER_HIT); + if (hitResult !== HitResult.FAIL) { + this.applySelfTargetEffects(user, target, firstHit, lastHit); - })).then(() => { - // Apply the user's post-attack ability effects - applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult).then(() => { - /** - * If the invoked move is an attack, apply the user's chance to - * steal an item from the target granted by Grip Claw - */ - if (this.move.getMove() instanceof AttackMove) { - this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); - } - resolve(); - }); - }); - }) - ).then(() => resolve()); - }); - } else { - applyMoveAttrs(NoEffectAttr, user, null, move).then(() => resolve()); - } - }); - } else { - resolve(); - } - }); - })); + if (hitResult !== HitResult.NO_EFFECT) { + this.applyPostApplyEffects(user, target, firstHit, lastHit); + this.applyHeldItemFlinchCheck(user, target, dealsDamage); + this.applySuccessfulAttackEffects(user, target, firstHit, lastHit, !!isProtected, hitResult, firstTarget); + } else { + applyMoveAttrs(NoEffectAttr, user, null, move); + } + } + } + + // Apply queued phases + if (queuedPhases.length) { + globalScene.appendToPhase(queuedPhases, MoveEndPhase); } // Apply the move's POST_TARGET effects on the move's last hit, after all targeted effects have resolved - const postTarget = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()) ? - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : - null; - - if (!!postTarget) { - if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after - applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); - } else { // Otherwise, push a new asynchronous move effect - applyAttrs.push(postTarget); - } + if (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) { + applyFilteredMoveAttrs( + (attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, + user, + null, + move, + ); } - // Wait for all move effects to finish applying, then end this phase - Promise.allSettled(applyAttrs).then(() => { - /** - * Remove the target's substitute (if it exists and has expired) - * after all targeted effects have applied. - * This prevents blocked effects from applying until after this hit resolves. - */ - targets.forEach(target => { - const substitute = target.getTag(SubstituteTag); - if (!!substitute && substitute.hp <= 0) { - target.lapseTag(BattlerTagType.SUBSTITUTE); - } - }); - this.end(); + /** + * Remove the target's substitute (if it exists and has expired) + * after all targeted effects have applied. + * This prevents blocked effects from applying until after this hit resolves. + */ + targets.forEach(target => { + const substitute = target.getTag(SubstituteTag); + if (substitute && substitute.hp <= 0) { + target.lapseTag(BattlerTagType.SUBSTITUTE); + } }); - }); - }); + + const moveType = user.getMoveType(move, true); + if (move.category !== MoveCategory.STATUS && !user.stellarTypesBoosted.includes(moveType)) { + user.stellarTypesBoosted.push(moveType); + } + + this.end(); + }, + ); } - end() { + public override end(): void { const user = this.getUserPokemon(); /** * If this phase isn't for the invoked move's last strike, @@ -347,19 +511,19 @@ export class MoveEffectPhase extends PokemonPhase { * to the user. */ if (user) { - if (user.turnData.hitsLeft && --user.turnData.hitsLeft >= 1 && this.getTarget()?.isActive()) { - this.scene.unshiftPhase(this.getNewHitPhase()); + if (user.turnData.hitsLeft && --user.turnData.hitsLeft >= 1 && this.getFirstTarget()?.isActive()) { + globalScene.unshiftPhase(this.getNewHitPhase()); } else { // Queue message for number of hits made by multi-move // If multi-hit attack only hits once, still want to render a message const hitsTotal = user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0); if (hitsTotal > 1 || (user.turnData.hitsLeft && user.turnData.hitsLeft > 0)) { // If there are multiple hits, or if there are hits of the multi-hit move left - this.scene.queueMessage(i18next.t("battle:attackHitsCount", { count: hitsTotal })); + globalScene.queueMessage(i18next.t("battle:attackHitsCount", { count: hitsTotal })); } - this.scene.applyModifiers(HitHealModifier, this.player, user); + globalScene.applyModifiers(HitHealModifier, this.player, user); // Clear all cached move effectiveness values among targets - this.getTargets().forEach((target) => target.turnData.moveEffectiveness = null); + this.getTargets().forEach(target => (target.turnData.moveEffectiveness = null)); } } @@ -367,17 +531,175 @@ export class MoveEffectPhase extends PokemonPhase { } /** - * Resolves whether this phase's invoked move hits or misses the given target - * @param target {@linkcode Pokemon} the Pokemon targeted by the invoked move - * @returns `true` if the move does not miss the target; `false` otherwise - */ - hitCheck(target: Pokemon): boolean { + * Apply self-targeted effects that trigger `POST_APPLY` + * + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param firstHit - `true` if this is the first hit in a multi-hit attack + * @param lastHit - `true` if this is the last hit in a multi-hit attack + * @returns a function intended to be passed into a `then()` call. + */ + protected applySelfTargetEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.POST_APPLY && + attr.selfTarget && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit), + user, + target, + this.move.getMove(), + ); + } + + /** + * Applies non-self-targeted effects that trigger `POST_APPLY` + * (i.e. Smelling Salts curing Paralysis, and the forced switch from U-Turn, Dragon Tail, etc) + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param firstHit - `true` if this is the first hit in a multi-hit attack + * @param lastHit - `true` if this is the last hit in a multi-hit attack + * @returns a function intended to be passed into a `then()` call. + */ + protected applyPostApplyEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): void { + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.POST_APPLY && + !attr.selfTarget && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit), + user, + target, + this.move.getMove(), + ); + } + + /** + * Applies effects that trigger on HIT + * (i.e. Final Gambit, Power-Up Punch, Drain Punch) + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param firstHit - `true` if this is the first hit in a multi-hit attack + * @param lastHit - `true` if this is the last hit in a multi-hit attack + * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} + * @returns a function intended to be passed into a `then()` call. + */ + protected applyOnHitEffects( + user: Pokemon, + target: Pokemon, + firstHit: boolean, + lastHit: boolean, + firstTarget: boolean, + ): void { + applyFilteredMoveAttrs( + (attr: MoveAttr) => + attr instanceof MoveEffectAttr && + attr.trigger === MoveEffectTrigger.HIT && + (!attr.firstHitOnly || firstHit) && + (!attr.lastHitOnly || lastHit) && + (!attr.firstTargetOnly || firstTarget), + user, + target, + this.move.getMove(), + ); + } + + /** + * Applies reactive effects that occur when a Pokémon is hit. + * (i.e. Effect Spore, Disguise, Liquid Ooze, Beak Blast) + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param hitResult - The {@linkcode HitResult} of the attempted move + * @returns a `Promise` intended to be passed into a `then()` call. + */ + protected applyOnGetHitAbEffects(user: Pokemon, target: Pokemon, hitResult: HitResult): void { + if (!target.isFainted() || target.canApplyAbility()) { + applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult); + + if (!this.move.getMove().hitsSubstitute(user, target)) { + if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { + globalScene.applyShuffledModifiers(EnemyAttackStatusEffectChanceModifier, false, target); + } + + target.lapseTags(BattlerTagLapseType.AFTER_HIT); + } + } + } + + /** + * Applies all effects and attributes that require a move to connect with a target, + * namely reactive effects like Weak Armor, on-hit effects like that of Power-Up Punch, and item stealing effects + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param firstHit - `true` if this is the first hit in a multi-hit attack + * @param lastHit - `true` if this is the last hit in a multi-hit attack + * @param isProtected - `true` if the target is protected by effects such as Protect + * @param hitResult - The {@linkcode HitResult} of the attempted move + * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} + * @returns a function intended to be passed into a `then()` call. + */ + protected applySuccessfulAttackEffects( + user: Pokemon, + target: Pokemon, + firstHit: boolean, + lastHit: boolean, + isProtected: boolean, + hitResult: HitResult, + firstTarget: boolean, + ): void { + if (!isProtected) { + this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget); + this.applyOnGetHitAbEffects(user, target, hitResult); + applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult); + if (this.move.getMove() instanceof AttackMove) { + globalScene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); + } + } + } + + /** + * Handles checking for and applying Flinches + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param dealsDamage - `true` if the attempted move successfully dealt damage + * @returns a function intended to be passed into a `then()` call. + */ + protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean): void { + if (this.move.getMove().hasAttr(FlinchAttr)) { + return; + } + + if ( + dealsDamage && + !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && + !this.move.getMove().hitsSubstitute(user, target) + ) { + const flinched = new BooleanHolder(false); + globalScene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); + if (flinched.value) { + target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); + } + } + } + + /** + * Resolves whether this phase's invoked move hits the given target + * @param target - The {@linkcode Pokemon} targeted by the invoked move + * @returns `true` if the move hits the target + */ + public hitCheck(target: Pokemon): boolean { // Moves targeting the user and entry hazards can't miss - if ([ MoveTarget.USER, MoveTarget.ENEMY_SIDE ].includes(this.move.getMove().moveTarget)) { + if ([MoveTarget.USER, MoveTarget.ENEMY_SIDE].includes(this.move.getMove().moveTarget)) { return true; } - const user = this.getUserPokemon()!; // TODO: is this bang correct? + const user = this.getUserPokemon(); + + if (!user) { + return false; + } // Hit check only calculated on first hit for multi-hit moves unless flag is set to check all hits. // However, if an ability with the MaxMultiHitAbAttr, namely Skill Link, is present, act as a normal @@ -388,12 +710,7 @@ export class MoveEffectPhase extends PokemonPhase { } } - if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { - return true; - } - - // If the user should ignore accuracy on a target, check who the user targeted last turn and see if they match - if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + if (this.checkBypassAccAndInvuln(target)) { return true; } @@ -401,15 +718,16 @@ export class MoveEffectPhase extends PokemonPhase { return true; } - if (target.getTag(BattlerTagType.TELEKINESIS) && !target.getTag(SemiInvulnerableTag) && !this.move.getMove().hasAttr(OneHitKOAttr)) { + const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); + if ( + target.getTag(BattlerTagType.TELEKINESIS) && + !semiInvulnerableTag && + !this.move.getMove().hasAttr(OneHitKOAttr) + ) { return true; } - const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); - if (semiInvulnerableTag - && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType) - && !(this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(Type.POISON)) - ) { + if (semiInvulnerableTag && !this.checkBypassSemiInvuln(semiInvulnerableTag)) { return false; } @@ -422,60 +740,113 @@ export class MoveEffectPhase extends PokemonPhase { const accuracyMultiplier = user.getAccuracyMultiplier(target, this.move.getMove()); const rand = user.randSeedInt(100); - return rand < (moveAccuracy * accuracyMultiplier); + return rand < moveAccuracy * accuracyMultiplier; } - /** Returns the {@linkcode Pokemon} using this phase's invoked move */ - getUserPokemon(): Pokemon | undefined { - if (this.battlerIndex > BattlerIndex.ENEMY_2) { - return this.scene.getPokemonById(this.battlerIndex) ?? undefined; + /** + * Check whether the move should bypass *both* the accuracy *and* semi-invulnerable states. + * @param target - The {@linkcode Pokemon} targeted by the invoked move + * @returns `true` if the move should bypass accuracy and semi-invulnerability + * + * Accuracy and semi-invulnerability can be bypassed by: + * - An ability like {@linkcode Abilities.NO_GUARD | No Guard} + * - A poison type using {@linkcode Moves.TOXIC | Toxic} + * - A move like {@linkcode Moves.LOCK_ON | Lock-On} or {@linkcode Moves.MIND_READER | Mind Reader}. + * + * Does *not* check against effects {@linkcode Moves.GLAIVE_RUSH | Glaive Rush} status (which + * should not bypass semi-invulnerability), or interactions like Earthquake hitting against Dig, + * (which should not bypass the accuracy check). + * + * @see {@linkcode hitCheck} + */ + public checkBypassAccAndInvuln(target: Pokemon) { + const user = this.getUserPokemon(); + if (!user) { + return false; + } + if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { + return true; + } + if (this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(PokemonType.POISON)) { + return true; + } + // TODO: Fix lock on / mind reader check. + if ( + user.getTag(BattlerTagType.IGNORE_ACCURACY) && + (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1 + ) { + return true; } - return (this.player ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.fieldIndex]; } - /** Returns an array of all {@linkcode Pokemon} targeted by this phase's invoked move */ - getTargets(): Pokemon[] { - return this.scene.getField(true).filter(p => this.targets.indexOf(p.getBattlerIndex()) > -1); + /** + * Check whether the move is able to ignore the given `semiInvulnerableTag` + * @param semiInvulnerableTag - The semiInvulnerbale tag to check against + * @returns `true` if the move can ignore the semi-invulnerable state + */ + public checkBypassSemiInvuln(semiInvulnerableTag: SemiInvulnerableTag | nil): boolean { + if (!semiInvulnerableTag) { + return false; + } + const move = this.move.getMove(); + return move.getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType); } - /** Returns the first target of this phase's invoked move */ - getTarget(): Pokemon | undefined { + /** @returns The {@linkcode Pokemon} using this phase's invoked move */ + public getUserPokemon(): Pokemon | null { + if (this.battlerIndex > BattlerIndex.ENEMY_2) { + return globalScene.getPokemonById(this.battlerIndex); + } + return (this.player ? globalScene.getPlayerField() : globalScene.getEnemyField())[this.fieldIndex]; + } + + /** @returns An array of all {@linkcode Pokemon} targeted by this phase's invoked move */ + public getTargets(): Pokemon[] { + return globalScene.getField(true).filter(p => this.targets.indexOf(p.getBattlerIndex()) > -1); + } + + /** @returns The first target of this phase's invoked move */ + public getFirstTarget(): Pokemon | undefined { return this.getTargets()[0]; } /** * Removes the given {@linkcode Pokemon} from this phase's target list - * @param target {@linkcode Pokemon} the Pokemon to be removed + * @param target - The {@linkcode Pokemon} to be removed */ - removeTarget(target: Pokemon): void { + protected removeTarget(target: Pokemon): void { const targetIndex = this.targets.findIndex(ind => ind === target.getBattlerIndex()); if (targetIndex !== -1) { - this.targets.splice(this.targets.findIndex(ind => ind === target.getBattlerIndex()), 1); + this.targets.splice( + this.targets.findIndex(ind => ind === target.getBattlerIndex()), + 1, + ); } } /** * Prevents subsequent strikes of this phase's invoked move from occurring - * @param target {@linkcode Pokemon} if defined, only stop subsequent - * strikes against this Pokemon + * @param target - If defined, only stop subsequent strikes against this {@linkcode Pokemon} */ - stopMultiHit(target?: Pokemon): void { - /** If given a specific target, remove the target from subsequent strikes */ + public stopMultiHit(target?: Pokemon): void { + // If given a specific target, remove the target from subsequent strikes if (target) { this.removeTarget(target); } - /** - * If no target specified, or the specified target was the last of this move's - * targets, completely cancel all subsequent strikes. - */ - if (!target || this.targets.length === 0 ) { - this.getUserPokemon()!.turnData.hitCount = 1; // TODO: is the bang correct here? - this.getUserPokemon()!.turnData.hitsLeft = 1; // TODO: is the bang correct here? + const user = this.getUserPokemon(); + if (!user) { + return; + } + // If no target specified, or the specified target was the last of this move's + // targets, completely cancel all subsequent strikes. + if (!target || this.targets.length === 0) { + user.turnData.hitCount = 1; + user.turnData.hitsLeft = 1; } } - /** Returns a new MoveEffectPhase with the same properties as this phase */ - getNewHitPhase() { - return new MoveEffectPhase(this.scene, this.battlerIndex, this.targets, this.move); + /** @returns A new `MoveEffectPhase` with the same properties as this phase */ + protected getNewHitPhase(): MoveEffectPhase { + return new MoveEffectPhase(this.battlerIndex, this.targets, this.move); } } diff --git a/src/phases/move-end-phase.ts b/src/phases/move-end-phase.ts index e03f2ec14b0..4716370cc4e 100644 --- a/src/phases/move-end-phase.ts +++ b/src/phases/move-end-phase.ts @@ -1,13 +1,9 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; import { BattlerTagLapseType } from "#app/data/battler-tags"; import { PokemonPhase } from "./pokemon-phase"; export class MoveEndPhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { - super(scene, battlerIndex); - } - start() { super.start(); @@ -16,7 +12,7 @@ export class MoveEndPhase extends PokemonPhase { pokemon.lapseTags(BattlerTagLapseType.AFTER_MOVE); } - this.scene.arena.setIgnoreAbilities(false); + globalScene.arena.setIgnoreAbilities(false); this.end(); } diff --git a/src/phases/move-header-phase.ts b/src/phases/move-header-phase.ts index c307ff0be6e..c320df462d1 100644 --- a/src/phases/move-header-phase.ts +++ b/src/phases/move-header-phase.ts @@ -1,14 +1,14 @@ -import BattleScene from "#app/battle-scene"; -import { applyMoveAttrs, MoveHeaderAttr } from "#app/data/move"; -import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import { applyMoveAttrs, MoveHeaderAttr } from "#app/data/moves/move"; +import type { PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { BattlePhase } from "./battle-phase"; export class MoveHeaderPhase extends BattlePhase { public pokemon: Pokemon; public move: PokemonMove; - constructor(scene: BattleScene, pokemon: Pokemon, move: PokemonMove) { - super(scene); + constructor(pokemon: Pokemon, move: PokemonMove) { + super(); this.pokemon = pokemon; this.move = move; @@ -22,9 +22,8 @@ export class MoveHeaderPhase extends BattlePhase { super.start(); if (this.canMove()) { - applyMoveAttrs(MoveHeaderAttr, this.pokemon, null, this.move.getMove()).then(() => this.end()); - } else { - this.end(); + applyMoveAttrs(MoveHeaderAttr, this.pokemon, null, this.move.getMove()); } + this.end(); } } diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index a516fd8593d..f8edaa56981 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -1,29 +1,55 @@ import { BattlerIndex } from "#app/battle"; -import BattleScene from "#app/battle-scene"; -import { applyAbAttrs, applyPostMoveUsedAbAttrs, applyPreAttackAbAttrs, BlockRedirectAbAttr, IncreasePpAbAttr, PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr, ReduceStatusEffectDurationAbAttr } from "#app/data/ability"; +import { globalScene } from "#app/global-scene"; +import { + applyAbAttrs, + applyPostMoveUsedAbAttrs, + applyPreAttackAbAttrs, + BlockRedirectAbAttr, + IncreasePpAbAttr, + PokemonTypeChangeAbAttr, + PostMoveUsedAbAttr, + RedirectMoveAbAttr, + ReduceStatusEffectDurationAbAttr, +} from "#app/data/ability"; +import type { DelayedAttackTag } from "#app/data/arena-tag"; import { CommonAnim } from "#app/data/battle-anims"; import { BattlerTagLapseType, CenterOfAttentionTag } from "#app/data/battler-tags"; -import { allMoves, applyMoveAttrs, BypassRedirectAttr, BypassSleepAttr, CopyMoveAttr, HealStatusEffectAttr, MoveFlags, PreMoveMessageAttr } from "#app/data/move"; +import { + allMoves, + applyMoveAttrs, + BypassRedirectAttr, + BypassSleepAttr, + CopyMoveAttr, + DelayedAttackAttr, + frenzyMissFunc, + HealStatusEffectAttr, + PreMoveMessageAttr, + PreUseInterruptAttr, +} from "#app/data/moves/move"; +import { MoveFlags } from "#enums/MoveFlags"; import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect"; -import { Type } from "#app/data/type"; -import { getTerrainBlockMessage } from "#app/data/weather"; +import { PokemonType } from "#enums/pokemon-type"; +import { getTerrainBlockMessage, getWeatherBlockMessage } from "#app/data/weather"; import { MoveUsedEvent } from "#app/events/battle-scene"; -import Pokemon, { MoveResult, PokemonMove } from "#app/field/pokemon"; +import type { PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { MoveResult } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import Overrides from "#app/overrides"; import { BattlePhase } from "#app/phases/battle-phase"; import { CommonAnimPhase } from "#app/phases/common-anim-phase"; +import { MoveChargePhase } from "#app/phases/move-charge-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; -import { BooleanHolder, NumberHolder } from "#app/utils"; +import { NumberHolder } from "#app/utils"; import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { StatusEffect } from "#enums/status-effect"; import i18next from "i18next"; -import { MoveChargePhase } from "#app/phases/move-charge-phase"; export class MovePhase extends BattlePhase { protected _pokemon: Pokemon; @@ -31,8 +57,10 @@ export class MovePhase extends BattlePhase { protected _targets: BattlerIndex[]; protected followUp: boolean; protected ignorePp: boolean; - protected failed: boolean = false; - protected cancelled: boolean = false; + protected forcedLast: boolean; + protected failed = false; + protected cancelled = false; + protected reflected = false; public get pokemon(): Pokemon { return this._pokemon; @@ -59,17 +87,30 @@ export class MovePhase extends BattlePhase { } /** - * @param followUp Indicates that the move being uses is a "follow-up" - for example, a move being used by Metronome or Dancer. + * @param followUp Indicates that the move being used is a "follow-up" - for example, a move being used by Metronome or Dancer. * Follow-ups bypass a few failure conditions, including flinches, sleep/paralysis/freeze and volatile status checks, etc. + * @param reflected Indicates that the move was reflected by Magic Coat or Magic Bounce. + * Reflected moves cannot be reflected again and will not trigger Dancer. */ - constructor(scene: BattleScene, pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false) { - super(scene); + + constructor( + pokemon: Pokemon, + targets: BattlerIndex[], + move: PokemonMove, + followUp = false, + ignorePp = false, + reflected = false, + forcedLast = false, + ) { + super(); this.pokemon = pokemon; this.targets = targets; this.move = move; this.followUp = followUp; this.ignorePp = ignorePp; + this.reflected = reflected; + this.forcedLast = forcedLast; } /** @@ -77,8 +118,12 @@ export class MovePhase extends BattlePhase { * @param ignoreDisableTags `true` to not check if the move is disabled * @returns `true` if all the checks pass */ - public canMove(ignoreDisableTags: boolean = false): boolean { - return this.pokemon.isActive(true) && this.move.isUsable(this.pokemon, this.ignorePp, ignoreDisableTags) && !!this.targets.length; + public canMove(ignoreDisableTags = false): boolean { + return ( + this.pokemon.isActive(true) && + this.move.isUsable(this.pokemon, this.ignorePp, ignoreDisableTags) && + !!this.targets.length + ); } /**Signifies the current move should fail but still use PP */ @@ -91,6 +136,14 @@ export class MovePhase extends BattlePhase { this.cancelled = true; } + /** + * Shows whether the current move has been forced to the end of the turn + * Needed for speed order, see {@linkcode Moves.QUASH} + * */ + public isForcedLast(): boolean { + return this.forcedLast; + } + public start(): void { super.start(); @@ -98,12 +151,11 @@ export class MovePhase extends BattlePhase { // Check if move is unusable (e.g. because it's out of PP due to a mid-turn Spite). if (!this.canMove(true)) { - if (this.pokemon.isActive(true) && this.move.ppUsed >= this.move.getMovePp()) { + if (this.pokemon.isActive(true)) { this.fail(); this.showMoveText(); this.showFailedText(); } - return this.end(); } @@ -116,9 +168,9 @@ export class MovePhase extends BattlePhase { } // Check move to see if arena.ignoreAbilities should be true. - if (!this.followUp) { + if (!this.followUp || this.reflected) { if (this.move.getMove().checkFlag(MoveFlags.IGNORE_ABILITIES, this.pokemon, null)) { - this.scene.arena.setIgnoreAbilities(true, this.pokemon.getBattlerIndex()); + globalScene.arena.setIgnoreAbilities(true, this.pokemon.getBattlerIndex()); } } @@ -158,7 +210,7 @@ export class MovePhase extends BattlePhase { } public getActiveTargetPokemon(): Pokemon[] { - return this.scene.getField(true).filter(p => this.targets.includes(p.getBattlerIndex())); + return globalScene.getField(true).filter(p => this.targets.includes(p.getBattlerIndex())); } /** @@ -172,24 +224,34 @@ export class MovePhase extends BattlePhase { switch (this.pokemon.status.effect) { case StatusEffect.PARALYSIS: - activated = (!this.pokemon.randSeedInt(4) || Overrides.STATUS_ACTIVATION_OVERRIDE === true) && Overrides.STATUS_ACTIVATION_OVERRIDE !== false; + activated = + (!this.pokemon.randSeedInt(4) || Overrides.STATUS_ACTIVATION_OVERRIDE === true) && + Overrides.STATUS_ACTIVATION_OVERRIDE !== false; break; case StatusEffect.SLEEP: applyMoveAttrs(BypassSleepAttr, this.pokemon, null, this.move.getMove()); const turnsRemaining = new NumberHolder(this.pokemon.status.sleepTurnsRemaining ?? 0); - applyAbAttrs(ReduceStatusEffectDurationAbAttr, this.pokemon, null, false, this.pokemon.status.effect, turnsRemaining); + applyAbAttrs( + ReduceStatusEffectDurationAbAttr, + this.pokemon, + null, + false, + this.pokemon.status.effect, + turnsRemaining, + ); this.pokemon.status.sleepTurnsRemaining = turnsRemaining.value; healed = this.pokemon.status.sleepTurnsRemaining <= 0; activated = !healed && !this.pokemon.getTag(BattlerTagType.BYPASS_SLEEP); break; case StatusEffect.FREEZE: healed = - !!this.move.getMove().findAttr((attr) => - attr instanceof HealStatusEffectAttr - && attr.selfTarget - && attr.isOfEffect(StatusEffect.FREEZE)) - || (!this.pokemon.randSeedInt(5) && Overrides.STATUS_ACTIVATION_OVERRIDE !== true) - || Overrides.STATUS_ACTIVATION_OVERRIDE === false; + !!this.move + .getMove() + .findAttr( + attr => attr instanceof HealStatusEffectAttr && attr.selfTarget && attr.isOfEffect(StatusEffect.FREEZE), + ) || + (!this.pokemon.randSeedInt(5) && Overrides.STATUS_ACTIVATION_OVERRIDE !== true) || + Overrides.STATUS_ACTIVATION_OVERRIDE === false; activated = !healed; break; @@ -197,10 +259,20 @@ export class MovePhase extends BattlePhase { if (activated) { this.cancel(); - this.scene.queueMessage(getStatusEffectActivationText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); - this.scene.unshiftPhase(new CommonAnimPhase(this.scene, this.pokemon.getBattlerIndex(), undefined, CommonAnim.POISON + (this.pokemon.status.effect - 1))); + globalScene.queueMessage( + getStatusEffectActivationText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon)), + ); + globalScene.unshiftPhase( + new CommonAnimPhase( + this.pokemon.getBattlerIndex(), + undefined, + CommonAnim.POISON + (this.pokemon.status.effect - 1), + ), + ); } else if (healed) { - this.scene.queueMessage(getStatusEffectHealText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); + globalScene.queueMessage( + getStatusEffectHealText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon)), + ); this.pokemon.resetStatus(); this.pokemon.updateInfo(); } @@ -225,9 +297,46 @@ export class MovePhase extends BattlePhase { const moveQueue = this.pokemon.getMoveQueue(); // form changes happen even before we know that the move wll execute. - this.scene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangePreMoveTrigger); + globalScene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangePreMoveTrigger); - this.showMoveText(); + const isDelayedAttack = this.move.getMove().hasAttr(DelayedAttackAttr); + if (isDelayedAttack) { + // Check the player side arena if future sight is active + const futureSightTags = globalScene.arena.findTags(t => t.tagType === ArenaTagType.FUTURE_SIGHT); + const doomDesireTags = globalScene.arena.findTags(t => t.tagType === ArenaTagType.DOOM_DESIRE); + let fail = false; + const currentTargetIndex = targets[0].getBattlerIndex(); + for (const tag of futureSightTags) { + if ((tag as DelayedAttackTag).targetIndex === currentTargetIndex) { + fail = true; + break; + } + } + for (const tag of doomDesireTags) { + if ((tag as DelayedAttackTag).targetIndex === currentTargetIndex) { + fail = true; + break; + } + } + if (fail) { + this.showMoveText(); + this.showFailedText(); + return this.end(); + } + } + + let success = true; + // Check if there are any attributes that can interrupt the move, overriding the fail message. + for (const move of this.move.getMove().getAttrs(PreUseInterruptAttr)) { + if (move.apply(this.pokemon, targets[0], this.move.getMove())) { + success = false; + break; + } + } + + if (success) { + this.showMoveText(); + } if (moveQueue.length > 0) { // Using .shift here clears out two turn moves once they've been used @@ -243,12 +352,7 @@ export class MovePhase extends BattlePhase { const ppUsed = 1 + this.getPpIncreaseFromPressure(targets); this.move.usePp(ppUsed); - this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), this.move.ppUsed)); - } - - // Update the battle's "last move" pointer, unless we're currently mimicking a move. - if (!allMoves[this.move.moveId].hasAttr(CopyMoveAttr)) { - this.scene.currentBattle.lastMove = this.move.moveId; + globalScene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), this.move.ppUsed)); } /** @@ -268,11 +372,22 @@ export class MovePhase extends BattlePhase { * Move conditions assume the move has a single target * TODO: is this sustainable? */ - const passesConditions = move.applyConditions(this.pokemon, targets[0], move); - const failedDueToWeather: boolean = this.scene.arena.isMoveWeatherCancelled(this.pokemon, move); - const failedDueToTerrain: boolean = this.scene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, move); + let failedDueToTerrain = false; + let failedDueToWeather = false; + if (success) { + const passesConditions = move.applyConditions(this.pokemon, targets[0], move); + failedDueToWeather = globalScene.arena.isMoveWeatherCancelled(this.pokemon, move); + failedDueToTerrain = globalScene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, move); + success = passesConditions && !failedDueToWeather && !failedDueToTerrain; + } - const success = passesConditions && !failedDueToWeather && !failedDueToTerrain; + // Update the battle's "last move" pointer, unless we're currently mimicking a move. + if (!allMoves[this.move.moveId].hasAttr(CopyMoveAttr)) { + // The last move used is unaffected by moves that fail + if (success) { + globalScene.currentBattle.lastMove = this.move.moveId; + } + } /** * If the move has not failed, trigger ability-based user type changes and then execute it. @@ -282,22 +397,29 @@ export class MovePhase extends BattlePhase { */ if (success) { applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); - this.scene.unshiftPhase(new MoveEffectPhase(this.scene, this.pokemon.getBattlerIndex(), this.targets, this.move)); - + globalScene.unshiftPhase( + new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, this.move, this.reflected), + ); } else { - if ([ Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE ].includes(this.move.moveId)) { + if ([Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE].includes(this.move.moveId)) { applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); } - this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); + this.pokemon.pushMoveHistory({ + move: this.move.moveId, + targets: this.targets, + result: MoveResult.FAIL, + virtual: this.move.virtual, + }); + const failureMessage = move.getFailedText(this.pokemon, targets[0], move); let failedText: string | undefined; - const failureMessage = move.getFailedText(this.pokemon, targets[0], move, new BooleanHolder(false)); - if (failureMessage) { failedText = failureMessage; } else if (failedDueToTerrain) { - failedText = getTerrainBlockMessage(this.pokemon, this.scene.arena.getTerrainType()); + failedText = getTerrainBlockMessage(targets[0], globalScene.arena.getTerrainType()); + } else if (failedDueToWeather) { + failedText = getWeatherBlockMessage(globalScene.arena.getWeatherType()); } this.showFailedText(failedText); @@ -309,7 +431,7 @@ export class MovePhase extends BattlePhase { // Handle Dancer, which triggers immediately after a move is used (rather than waiting on `this.end()`). // Note that the `!this.followUp` check here prevents an infinite Dancer loop. if (this.move.getMove().hasFlag(MoveFlags.DANCE_MOVE) && !this.followUp) { - this.scene.getField(true).forEach(pokemon => { + globalScene.getField(true).forEach(pokemon => { applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets); }); } @@ -325,19 +447,18 @@ export class MovePhase extends BattlePhase { applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); this.showMoveText(); - this.scene.unshiftPhase(new MoveChargePhase(this.scene, this.pokemon.getBattlerIndex(), this.targets[0], this.move)); + globalScene.unshiftPhase(new MoveChargePhase(this.pokemon.getBattlerIndex(), this.targets[0], this.move)); } else { - this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); - - let failedText: string | undefined; - const failureMessage = move.getFailedText(this.pokemon, targets[0], move, new BooleanHolder(false)); - - if (failureMessage) { - failedText = failureMessage; - } + this.pokemon.pushMoveHistory({ + move: this.move.moveId, + targets: this.targets, + result: MoveResult.FAIL, + virtual: this.move.virtual, + }); + const failureMessage = move.getFailedText(this.pokemon, targets[0], move); this.showMoveText(); - this.showFailedText(failedText); + this.showFailedText(failureMessage ?? undefined); // Remove the user from its semi-invulnerable state (if applicable) this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); @@ -350,7 +471,7 @@ export class MovePhase extends BattlePhase { */ public end(): void { if (!this.followUp && this.canMove()) { - this.scene.unshiftPhase(new MoveEndPhase(this.scene, this.pokemon.getBattlerIndex())); + globalScene.unshiftPhase(new MoveEndPhase(this.pokemon.getBattlerIndex())); } super.end(); @@ -363,7 +484,9 @@ export class MovePhase extends BattlePhase { * TODO: This hardcodes the PP increase at 1 per opponent, rather than deferring to the ability. */ public getPpIncreaseFromPressure(targets: Pokemon[]): number { - const foesWithPressure = this.pokemon.getOpponents().filter(o => targets.includes(o) && o.isActive(true) && o.hasAbilityWithAttr(IncreasePpAbAttr)); + const foesWithPressure = this.pokemon + .getOpponents() + .filter(o => targets.includes(o) && o.isActive(true) && o.hasAbilityWithAttr(IncreasePpAbAttr)); return foesWithPressure.length; } @@ -378,10 +501,13 @@ export class MovePhase extends BattlePhase { const redirectTarget = new NumberHolder(currentTarget); // check move redirection abilities of every pokemon *except* the user. - this.scene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, false, this.move.moveId, redirectTarget)); + globalScene + .getField(true) + .filter(p => p !== this.pokemon) + .forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, false, this.move.moveId, redirectTarget, this.pokemon)); /** `true` if an Ability is responsible for redirecting the move to another target; `false` otherwise */ - let redirectedByAbility = (currentTarget !== redirectTarget.value); + let redirectedByAbility = currentTarget !== redirectTarget.value; // check for center-of-attention tags (note that this will override redirect abilities) this.pokemon.getOpponents().forEach(p => { @@ -389,7 +515,11 @@ export class MovePhase extends BattlePhase { // TODO: don't hardcode this interaction. // Handle interaction between the rage powder center-of-attention tag and moves used by grass types/overcoat-havers (which are immune to RP's redirect) - if (redirectTag && (!redirectTag.powder || (!this.pokemon.isOfType(Type.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT)))) { + if ( + redirectTag && + (!redirectTag.powder || + (!this.pokemon.isOfType(PokemonType.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT))) + ) { redirectTarget.value = p.getBattlerIndex(); redirectedByAbility = false; } @@ -397,7 +527,7 @@ export class MovePhase extends BattlePhase { if (currentTarget !== redirectTarget.value) { const bypassRedirectAttrs = this.move.getMove().getAttrs(BypassRedirectAttr); - bypassRedirectAttrs.forEach((attr) => { + bypassRedirectAttrs.forEach(attr => { if (!attr.abilitiesOnly || redirectedByAbility) { redirectTarget.value = currentTarget; } @@ -405,7 +535,12 @@ export class MovePhase extends BattlePhase { if (this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr)) { redirectTarget.value = currentTarget; - this.scene.unshiftPhase(new ShowAbilityPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr))); + globalScene.unshiftPhase( + new ShowAbilityPhase( + this.pokemon.getBattlerIndex(), + this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr), + ), + ); } this.targets[0] = redirectTarget.value; @@ -428,9 +563,9 @@ export class MovePhase extends BattlePhase { // account for metal burst and comeuppance hitting remaining targets in double battles // counterattack will redirect to remaining ally if original attacker faints - if (this.scene.currentBattle.double && this.move.getMove().hasFlag(MoveFlags.REDIRECT_COUNTER)) { - if (this.scene.getField()[this.targets[0]].hp === 0) { - const opposingField = this.pokemon.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField(); + if (globalScene.currentBattle.double && this.move.getMove().hasFlag(MoveFlags.REDIRECT_COUNTER)) { + if (globalScene.getField()[this.targets[0]].hp === 0) { + const opposingField = this.pokemon.isPlayer() ? globalScene.getEnemyField() : globalScene.getPlayerField(); this.targets[0] = opposingField.find(p => p.hp > 0)?.getBattlerIndex() ?? BattlerIndex.ATTACKER; } } @@ -467,10 +602,18 @@ export class MovePhase extends BattlePhase { this.move.usePp(); } - this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed)); + globalScene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed)); } - this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); + if (this.cancelled && this.pokemon.summonData?.tags?.find(t => t.tagType === BattlerTagType.FRENZY)) { + frenzyMissFunc(this.pokemon, this.move.getMove()); + } + + this.pokemon.pushMoveHistory({ + move: Moves.NONE, + result: MoveResult.FAIL, + targets: this.targets, + }); this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); this.pokemon.lapseTags(BattlerTagLapseType.AFTER_MOVE); @@ -483,7 +626,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; } @@ -492,14 +635,17 @@ export class MovePhase extends BattlePhase { return; } - this.scene.queueMessage(i18next.t("battle:useMove", { - pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), - moveName: this.move.getName() - }), 500); + globalScene.queueMessage( + i18next.t(this.reflected ? "battle:magicCoatActivated" : "battle:useMove", { + pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), + moveName: this.move.getName(), + }), + 500, + ); applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents()[0], this.move.getMove()); } - protected showFailedText(failedText?: string): void { - this.scene.queueMessage(failedText ?? i18next.t("battle:attackFailed")); + public showFailedText(failedText: string = i18next.t("battle:attackFailed")): void { + globalScene.queueMessage(failedText); } } diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 49e78fa5369..26012df191d 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -1,31 +1,33 @@ +import { BattlerTagLapseType } from "#app/data/battler-tags"; +import type { OptionPhaseCallback } from "#app/data/mystery-encounters/mystery-encounter-option"; +import type MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; +import { SeenEncounterData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; +import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { CheckSwitchPhase } from "#app/phases/check-switch-phase"; +import { GameOverPhase } from "#app/phases/game-over-phase"; +import { NewBattlePhase } from "#app/phases/new-battle-phase"; +import { PostTurnStatusEffectPhase } from "#app/phases/post-turn-status-effect-phase"; +import { ReturnPhase } from "#app/phases/return-phase"; +import { ScanIvsPhase } from "#app/phases/scan-ivs-phase"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import { SummonPhase } from "#app/phases/summon-phase"; +import { SwitchPhase } from "#app/phases/switch-phase"; +import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; +import { BattleSpec } from "#enums/battle-spec"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import { SwitchType } from "#enums/switch-type"; import i18next from "i18next"; -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; +import { getCharVariantFromDialogue } from "../data/dialogue"; +import type { OptionSelectSettings } from "../data/mystery-encounters/utils/encounter-phase-utils"; +import { transitionMysteryEncounterIntroVisuals } from "../data/mystery-encounters/utils/encounter-phase-utils"; +import { TrainerSlot } from "../data/trainer-config"; +import { IvScannerModifier } from "../modifier/modifier"; import { Phase } from "../phase"; import { Mode } from "../ui/ui"; -import { transitionMysteryEncounterIntroVisuals, OptionSelectSettings } from "../data/mystery-encounters/utils/encounter-phase-utils"; -import MysteryEncounterOption, { OptionPhaseCallback } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { getCharVariantFromDialogue } from "../data/dialogue"; -import { TrainerSlot } from "../data/trainer-config"; -import { BattleSpec } from "#enums/battle-spec"; -import { IvScannerModifier } from "../modifier/modifier"; import * as Utils from "../utils"; import { isNullOrUndefined } from "../utils"; -import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { BattlerTagLapseType } from "#app/data/battler-tags"; -import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; -import { PostTurnStatusEffectPhase } from "#app/phases/post-turn-status-effect-phase"; -import { SummonPhase } from "#app/phases/summon-phase"; -import { ScanIvsPhase } from "#app/phases/scan-ivs-phase"; -import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; -import { ReturnPhase } from "#app/phases/return-phase"; -import { CheckSwitchPhase } from "#app/phases/check-switch-phase"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; -import { NewBattlePhase } from "#app/phases/new-battle-phase"; -import { GameOverPhase } from "#app/phases/game-over-phase"; -import { SwitchPhase } from "#app/phases/switch-phase"; -import { SeenEncounterData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; -import { SwitchType } from "#enums/switch-type"; -import { BattlerTagType } from "#enums/battler-tag-type"; /** * Will handle (in order): @@ -42,11 +44,10 @@ export class MysteryEncounterPhase extends Phase { /** * Mostly useful for having repeated queries during a single encounter, where the queries and options may differ each time - * @param scene * @param optionSelectSettings allows overriding the typical options of an encounter with new ones */ - constructor(scene: BattleScene, optionSelectSettings?: OptionSelectSettings) { - super(scene); + constructor(optionSelectSettings?: OptionSelectSettings) { + super(); this.optionSelectSettings = optionSelectSettings; } @@ -57,20 +58,22 @@ export class MysteryEncounterPhase extends Phase { super.start(); // Clears out queued phases that are part of standard battle - this.scene.clearPhaseQueue(); - this.scene.clearPhaseQueueSplice(); + globalScene.clearPhaseQueue(); + globalScene.clearPhaseQueueSplice(); - const encounter = this.scene.currentBattle.mysteryEncounter!; - encounter.updateSeedOffset(this.scene); + const encounter = globalScene.currentBattle.mysteryEncounter!; + encounter.updateSeedOffset(); if (!this.optionSelectSettings) { // Sets flag that ME was encountered, only if this is not a followup option select phase // Can be used in later MEs to check for requirements to spawn, run history, etc. - this.scene.mysteryEncounterSaveData.encounteredEvents.push(new SeenEncounterData(encounter.encounterType, encounter.encounterTier, this.scene.currentBattle.waveIndex)); + globalScene.mysteryEncounterSaveData.encounteredEvents.push( + new SeenEncounterData(encounter.encounterType, encounter.encounterTier, globalScene.currentBattle.waveIndex), + ); } // Initiates encounter dialogue window and option select - this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, this.optionSelectSettings); + globalScene.ui.setMode(Mode.MYSTERY_ENCOUNTER, this.optionSelectSettings); } /** @@ -80,13 +83,16 @@ export class MysteryEncounterPhase extends Phase { */ handleOptionSelect(option: MysteryEncounterOption, index: number): boolean { // Set option selected flag - this.scene.currentBattle.mysteryEncounter!.selectedOption = option; + globalScene.currentBattle.mysteryEncounter!.selectedOption = option; if (!this.optionSelectSettings) { // Saves the selected option in the ME save data, only if this is not a followup option select phase // Can be used for analytics purposes to track what options are popular on certain encounters - const encounterSaveData = this.scene.mysteryEncounterSaveData.encounteredEvents[this.scene.mysteryEncounterSaveData.encounteredEvents.length - 1]; - if (encounterSaveData.type === this.scene.currentBattle.mysteryEncounter?.encounterType) { + const encounterSaveData = + globalScene.mysteryEncounterSaveData.encounteredEvents[ + globalScene.mysteryEncounterSaveData.encounteredEvents.length - 1 + ]; + if (encounterSaveData.type === globalScene.currentBattle.mysteryEncounter?.encounterType) { encounterSaveData.selectedOption = index; } } @@ -96,17 +102,16 @@ export class MysteryEncounterPhase extends Phase { } // Populate dialogue tokens for option requirements - this.scene.currentBattle.mysteryEncounter!.populateDialogueTokensFromRequirements(this.scene); + globalScene.currentBattle.mysteryEncounter!.populateDialogueTokensFromRequirements(); if (option.onPreOptionPhase) { - this.scene.executeWithSeedOffset(async () => { - return await option.onPreOptionPhase!(this.scene) - .then((result) => { - if (isNullOrUndefined(result) || result) { - this.continueEncounter(); - } - }); - }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset()); + globalScene.executeWithSeedOffset(async () => { + return await option.onPreOptionPhase!().then(result => { + if (isNullOrUndefined(result) || result) { + this.continueEncounter(); + } + }); + }, globalScene.currentBattle.mysteryEncounter?.getSeedOffset()); } else { this.continueEncounter(); } @@ -119,30 +124,37 @@ export class MysteryEncounterPhase extends Phase { */ continueEncounter() { const endDialogueAndContinueEncounter = () => { - this.scene.pushPhase(new MysteryEncounterOptionSelectedPhase(this.scene)); + globalScene.pushPhase(new MysteryEncounterOptionSelectedPhase()); this.end(); }; - const optionSelectDialogue = this.scene.currentBattle?.mysteryEncounter?.selectedOption?.dialogue; + const optionSelectDialogue = globalScene.currentBattle?.mysteryEncounter?.selectedOption?.dialogue; if (optionSelectDialogue?.selected && optionSelectDialogue.selected.length > 0) { // Handle intermediate dialogue (between player selection event and the onOptionSelect logic) - this.scene.ui.setMode(Mode.MESSAGE); + globalScene.ui.setMode(Mode.MESSAGE); const selectedDialogue = optionSelectDialogue.selected; let i = 0; const showNextDialogue = () => { const nextAction = i === selectedDialogue.length - 1 ? endDialogueAndContinueEncounter : showNextDialogue; const dialogue = selectedDialogue[i]; let title: string | null = null; - const text: string | null = getEncounterText(this.scene, dialogue.text); + const text: string | null = getEncounterText(dialogue.text); if (dialogue.speaker) { - title = getEncounterText(this.scene, dialogue.speaker); + title = getEncounterText(dialogue.speaker); } i++; if (title) { - this.scene.ui.showDialogue(text ?? "", title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); + globalScene.ui.showDialogue( + text ?? "", + title, + null, + nextAction, + 0, + i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, + ); } else { - this.scene.ui.showText(text ?? "", null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); + globalScene.ui.showText(text ?? "", null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } }; @@ -156,7 +168,7 @@ export class MysteryEncounterPhase extends Phase { * Ends phase */ end() { - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + globalScene.ui.setMode(Mode.MESSAGE).then(() => super.end()); } } @@ -170,9 +182,9 @@ export class MysteryEncounterPhase extends Phase { export class MysteryEncounterOptionSelectedPhase extends Phase { onOptionSelect: OptionPhaseCallback; - constructor(scene: BattleScene) { - super(scene); - this.onOptionSelect = this.scene.currentBattle.mysteryEncounter!.selectedOption!.onOptionPhase; + constructor() { + super(); + this.onOptionSelect = globalScene.currentBattle.mysteryEncounter!.selectedOption!.onOptionPhase; } /** @@ -184,20 +196,20 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { */ start() { super.start(); - if (this.scene.currentBattle.mysteryEncounter?.autoHideIntroVisuals) { - transitionMysteryEncounterIntroVisuals(this.scene).then(() => { - this.scene.executeWithSeedOffset(() => { - this.onOptionSelect(this.scene).finally(() => { + if (globalScene.currentBattle.mysteryEncounter?.autoHideIntroVisuals) { + transitionMysteryEncounterIntroVisuals().then(() => { + globalScene.executeWithSeedOffset(() => { + this.onOptionSelect().finally(() => { this.end(); }); - }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset() * 500); + }, globalScene.currentBattle.mysteryEncounter?.getSeedOffset() * 500); }); } else { - this.scene.executeWithSeedOffset(() => { - this.onOptionSelect(this.scene).finally(() => { + globalScene.executeWithSeedOffset(() => { + this.onOptionSelect().finally(() => { this.end(); }); - }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset() * 500); + }, globalScene.currentBattle.mysteryEncounter?.getSeedOffset() * 500); } } } @@ -209,10 +221,6 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { * See {@linkcode TurnEndPhase} for more details */ export class MysteryEncounterBattleStartCleanupPhase extends Phase { - constructor(scene: BattleScene) { - super(scene); - } - /** * Cleans up `TURN_END` tags, any {@linkcode PostTurnStatusEffectPhase}s, checks for Pokemon switches, then continues */ @@ -220,44 +228,49 @@ export class MysteryEncounterBattleStartCleanupPhase extends Phase { super.start(); // Lapse any residual flinches/endures but ignore all other turn-end battle tags - const includedLapseTags = [ BattlerTagType.FLINCHED, BattlerTagType.ENDURING ]; - const field = this.scene.getField(true).filter(p => p.summonData); + const includedLapseTags = [BattlerTagType.FLINCHED, BattlerTagType.ENDURING]; + const field = globalScene.getField(true).filter(p => p.summonData); field.forEach(pokemon => { const tags = pokemon.summonData.tags; - tags.filter(t => includedLapseTags.includes(t.tagType) - && t.lapseTypes.includes(BattlerTagLapseType.TURN_END) - && !(t.lapse(pokemon, BattlerTagLapseType.TURN_END))).forEach(t => { - t.onRemove(pokemon); - tags.splice(tags.indexOf(t), 1); - }); + tags + .filter( + t => + includedLapseTags.includes(t.tagType) && + t.lapseTypes.includes(BattlerTagLapseType.TURN_END) && + !t.lapse(pokemon, BattlerTagLapseType.TURN_END), + ) + .forEach(t => { + t.onRemove(pokemon); + tags.splice(tags.indexOf(t), 1); + }); }); // Remove any status tick phases - while (!!this.scene.findPhase(p => p instanceof PostTurnStatusEffectPhase)) { - this.scene.tryRemovePhase(p => p instanceof PostTurnStatusEffectPhase); + while (globalScene.findPhase(p => p instanceof PostTurnStatusEffectPhase)) { + globalScene.tryRemovePhase(p => p instanceof PostTurnStatusEffectPhase); } // The total number of Pokemon in the player's party that can legally fight - const legalPlayerPokemon = this.scene.getParty().filter(p => p.isAllowedInBattle()); + const legalPlayerPokemon = globalScene.getPokemonAllowedInBattle(); // The total number of legal player Pokemon that aren't currently on the field const legalPlayerPartyPokemon = legalPlayerPokemon.filter(p => !p.isActive(true)); if (!legalPlayerPokemon.length) { - this.scene.unshiftPhase(new GameOverPhase(this.scene)); + globalScene.unshiftPhase(new GameOverPhase()); return this.end(); } // Check for any KOd player mons and switch // For each fainted mon on the field, if there is a legal replacement, summon it - const playerField = this.scene.getPlayerField(); + const playerField = globalScene.getPlayerField(); playerField.forEach((pokemon, i) => { if (!pokemon.isAllowedInBattle() && legalPlayerPartyPokemon.length > i) { - this.scene.unshiftPhase(new SwitchPhase(this.scene, SwitchType.SWITCH, i, true, false)); + globalScene.unshiftPhase(new SwitchPhase(SwitchType.SWITCH, i, true, false)); } }); // THEN, if is a double battle, and player only has 1 summoned pokemon, center pokemon on field - if (this.scene.currentBattle.double && legalPlayerPokemon.length === 1 && legalPlayerPartyPokemon.length === 0) { - this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); + if (globalScene.currentBattle.double && legalPlayerPokemon.length === 1 && legalPlayerPartyPokemon.length === 0) { + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); } this.end(); @@ -274,8 +287,8 @@ export class MysteryEncounterBattleStartCleanupPhase extends Phase { export class MysteryEncounterBattlePhase extends Phase { disableSwitch: boolean; - constructor(scene: BattleScene, disableSwitch = false) { - super(scene); + constructor(disableSwitch = false) { + super(); this.disableSwitch = disableSwitch; } @@ -285,98 +298,112 @@ export class MysteryEncounterBattlePhase extends Phase { start() { super.start(); - this.doMysteryEncounterBattle(this.scene); + this.doMysteryEncounterBattle(); } /** * Gets intro battle message for new battle - * @param scene * @private */ - private getBattleMessage(scene: BattleScene): string { - const enemyField = scene.getEnemyField(); - const encounterMode = scene.currentBattle.mysteryEncounter!.encounterMode; + private getBattleMessage(): string { + const enemyField = globalScene.getEnemyField(); + const encounterMode = globalScene.currentBattle.mysteryEncounter!.encounterMode; - if (scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + if (globalScene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { return i18next.t("battle:bossAppeared", { bossName: enemyField[0].name }); } if (encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { - if (scene.currentBattle.double) { - return i18next.t("battle:trainerAppearedDouble", { trainerName: scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); - - } else { - return i18next.t("battle:trainerAppeared", { trainerName: scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); + if (globalScene.currentBattle.double) { + return i18next.t("battle:trainerAppearedDouble", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }); } + return i18next.t("battle:trainerAppeared", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }); } return enemyField.length === 1 - ? i18next.t("battle:singleWildAppeared", { pokemonName: enemyField[0].name }) - : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name }); + ? i18next.t("battle:singleWildAppeared", { + pokemonName: enemyField[0].name, + }) + : i18next.t("battle:multiWildAppeared", { + pokemonName1: enemyField[0].name, + pokemonName2: enemyField[1].name, + }); } /** * Queues {@linkcode SummonPhase}s for the new battle, and handles trainer animations/dialogue if it's a Trainer battle - * @param scene * @private */ - private doMysteryEncounterBattle(scene: BattleScene) { - const encounterMode = scene.currentBattle.mysteryEncounter!.encounterMode; + private doMysteryEncounterBattle() { + const encounterMode = globalScene.currentBattle.mysteryEncounter!.encounterMode; if (encounterMode === MysteryEncounterMode.WILD_BATTLE || encounterMode === MysteryEncounterMode.BOSS_BATTLE) { // Summons the wild/boss Pokemon if (encounterMode === MysteryEncounterMode.BOSS_BATTLE) { - scene.playBgm(undefined); + globalScene.playBgm(); } - const availablePartyMembers = scene.getEnemyParty().filter(p => !p.isFainted()).length; - scene.unshiftPhase(new SummonPhase(scene, 0, false)); - if (scene.currentBattle.double && availablePartyMembers > 1) { - scene.unshiftPhase(new SummonPhase(scene, 1, false)); + const availablePartyMembers = globalScene.getEnemyParty().filter(p => !p.isFainted()).length; + globalScene.unshiftPhase(new SummonPhase(0, false)); + if (globalScene.currentBattle.double && availablePartyMembers > 1) { + globalScene.unshiftPhase(new SummonPhase(1, false)); } - if (!scene.currentBattle.mysteryEncounter?.hideBattleIntroMessage) { - scene.ui.showText(this.getBattleMessage(scene), null, () => this.endBattleSetup(scene), 0); + if (!globalScene.currentBattle.mysteryEncounter?.hideBattleIntroMessage) { + globalScene.ui.showText(this.getBattleMessage(), null, () => this.endBattleSetup(), 0); } else { - this.endBattleSetup(scene); + this.endBattleSetup(); } } else if (encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { this.showEnemyTrainer(); const doSummon = () => { - scene.currentBattle.started = true; - scene.playBgm(undefined); - scene.pbTray.showPbTray(scene.getParty()); - scene.pbTrayEnemy.showPbTray(scene.getEnemyParty()); + globalScene.currentBattle.started = true; + globalScene.playBgm(); + globalScene.pbTray.showPbTray(globalScene.getPlayerParty()); + globalScene.pbTrayEnemy.showPbTray(globalScene.getEnemyParty()); const doTrainerSummon = () => { this.hideEnemyTrainer(); - const availablePartyMembers = scene.getEnemyParty().filter(p => !p.isFainted()).length; - scene.unshiftPhase(new SummonPhase(scene, 0, false)); - if (scene.currentBattle.double && availablePartyMembers > 1) { - scene.unshiftPhase(new SummonPhase(scene, 1, false)); + const availablePartyMembers = globalScene.getEnemyParty().filter(p => !p.isFainted()).length; + globalScene.unshiftPhase(new SummonPhase(0, false)); + if (globalScene.currentBattle.double && availablePartyMembers > 1) { + globalScene.unshiftPhase(new SummonPhase(1, false)); } - this.endBattleSetup(scene); + this.endBattleSetup(); }; - if (!scene.currentBattle.mysteryEncounter?.hideBattleIntroMessage) { - scene.ui.showText(this.getBattleMessage(scene), null, doTrainerSummon, 1000, true); + if (!globalScene.currentBattle.mysteryEncounter?.hideBattleIntroMessage) { + globalScene.ui.showText(this.getBattleMessage(), null, doTrainerSummon, 1000, true); } else { doTrainerSummon(); } }; - const encounterMessages = scene.currentBattle.trainer?.getEncounterMessages(); + const encounterMessages = globalScene.currentBattle.trainer?.getEncounterMessages(); if (!encounterMessages || !encounterMessages.length) { doSummon(); } else { - const trainer = this.scene.currentBattle.trainer; + const trainer = globalScene.currentBattle.trainer; let message: string; - scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.mysteryEncounter?.getSeedOffset()); + globalScene.executeWithSeedOffset( + () => (message = Utils.randSeedItem(encounterMessages)), + globalScene.currentBattle.mysteryEncounter?.getSeedOffset(), + ); message = message!; // tell TS compiler it's defined now const showDialogueAndSummon = () => { - scene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => { - scene.charSprite.hide().then(() => scene.hideFieldOverlay(250).then(() => doSummon())); + globalScene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => { + globalScene.charSprite.hide().then(() => globalScene.hideFieldOverlay(250).then(() => doSummon())); }); }; - if (this.scene.currentBattle.trainer?.config.hasCharSprite && !this.scene.ui.shouldSkipDialogue(message)) { - this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); // TODO: is this bang correct? + if (globalScene.currentBattle.trainer?.config.hasCharSprite && !globalScene.ui.shouldSkipDialogue(message)) { + globalScene + .showFieldOverlay(500) + .then(() => + globalScene.charSprite + .showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])) + .then(() => showDialogueAndSummon()), + ); // TODO: is this bang correct? } else { showDialogueAndSummon(); } @@ -386,48 +413,48 @@ export class MysteryEncounterBattlePhase extends Phase { /** * Initiate {@linkcode SummonPhase}s, {@linkcode ScanIvsPhase}, {@linkcode PostSummonPhase}s, etc. - * @param scene * @private */ - private endBattleSetup(scene: BattleScene) { - const enemyField = scene.getEnemyField(); - const encounterMode = scene.currentBattle.mysteryEncounter!.encounterMode; + private endBattleSetup() { + const enemyField = globalScene.getEnemyField(); + const encounterMode = globalScene.currentBattle.mysteryEncounter!.encounterMode; // PostSummon and ShinySparkle phases are handled by SummonPhase if (encounterMode !== MysteryEncounterMode.TRAINER_BATTLE) { - const ivScannerModifier = this.scene.findModifier(m => m instanceof IvScannerModifier); + const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { - enemyField.map(p => this.scene.pushPhase(new ScanIvsPhase(this.scene, p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex()))); } } - const availablePartyMembers = scene.getParty().filter(p => p.isAllowedInBattle()); + const availablePartyMembers = globalScene.getPlayerParty().filter(p => p.isAllowedInBattle()); if (!availablePartyMembers[0].isOnField()) { - scene.pushPhase(new SummonPhase(scene, 0)); + globalScene.pushPhase(new SummonPhase(0)); } - if (scene.currentBattle.double) { + if (globalScene.currentBattle.double) { if (availablePartyMembers.length > 1) { - scene.pushPhase(new ToggleDoublePositionPhase(scene, true)); + globalScene.pushPhase(new ToggleDoublePositionPhase(true)); if (!availablePartyMembers[1].isOnField()) { - scene.pushPhase(new SummonPhase(scene, 1)); + globalScene.pushPhase(new SummonPhase(1)); } } } else { if (availablePartyMembers.length > 1 && availablePartyMembers[1].isOnField()) { - scene.pushPhase(new ReturnPhase(scene, 1)); + globalScene.getPlayerField().forEach(pokemon => pokemon.lapseTag(BattlerTagType.COMMANDED)); + globalScene.pushPhase(new ReturnPhase(1)); } - scene.pushPhase(new ToggleDoublePositionPhase(scene, false)); + globalScene.pushPhase(new ToggleDoublePositionPhase(false)); } if (encounterMode !== MysteryEncounterMode.TRAINER_BATTLE && !this.disableSwitch) { - const minPartySize = scene.currentBattle.double ? 2 : 1; + const minPartySize = globalScene.currentBattle.double ? 2 : 1; if (availablePartyMembers.length > minPartySize) { - scene.pushPhase(new CheckSwitchPhase(scene, 0, scene.currentBattle.double)); - if (scene.currentBattle.double) { - scene.pushPhase(new CheckSwitchPhase(scene, 1, scene.currentBattle.double)); + globalScene.pushPhase(new CheckSwitchPhase(0, globalScene.currentBattle.double)); + if (globalScene.currentBattle.double) { + globalScene.pushPhase(new CheckSwitchPhase(1, globalScene.currentBattle.double)); } } } @@ -441,7 +468,7 @@ export class MysteryEncounterBattlePhase extends Phase { */ private showEnemyTrainer(): void { // Show enemy trainer - const trainer = this.scene.currentBattle.trainer; + const trainer = globalScene.currentBattle.trainer; if (!trainer) { return; } @@ -449,7 +476,7 @@ export class MysteryEncounterBattlePhase extends Phase { trainer.x += 16; trainer.y -= 16; trainer.setVisible(true); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: trainer, x: "-=16", y: "+=16", @@ -459,18 +486,18 @@ export class MysteryEncounterBattlePhase extends Phase { onComplete: () => { trainer.untint(100, "Sine.easeOut"); trainer.playAnim(); - } + }, }); } private hideEnemyTrainer(): void { - this.scene.tweens.add({ - targets: this.scene.currentBattle.trainer, + globalScene.tweens.add({ + targets: globalScene.currentBattle.trainer, x: "+=16", y: "-=16", alpha: 0, ease: "Sine.easeInOut", - duration: 750 + duration: 750, }); } } @@ -489,8 +516,8 @@ export class MysteryEncounterBattlePhase extends Phase { export class MysteryEncounterRewardsPhase extends Phase { addHealPhase: boolean; - constructor(scene: BattleScene, addHealPhase: boolean = false) { - super(scene); + constructor(addHealPhase = false) { + super(); this.addHealPhase = addHealPhase; } @@ -499,23 +526,23 @@ export class MysteryEncounterRewardsPhase extends Phase { */ start() { super.start(); - const encounter = this.scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; if (encounter.doContinueEncounter) { - encounter.doContinueEncounter(this.scene).then(() => { + encounter.doContinueEncounter().then(() => { this.end(); }); } else { - this.scene.executeWithSeedOffset(() => { + globalScene.executeWithSeedOffset(() => { if (encounter.onRewards) { - encounter.onRewards(this.scene).then(() => { + encounter.onRewards().then(() => { this.doEncounterRewardsAndContinue(); }); } else { this.doEncounterRewardsAndContinue(); } // Do not use ME's seedOffset for rewards, these should always be consistent with waveIndex (once per wave) - }, this.scene.currentBattle.waveIndex * 1000); + }, globalScene.currentBattle.waveIndex * 1000); } } @@ -523,20 +550,25 @@ export class MysteryEncounterRewardsPhase extends Phase { * Queues encounter EXP and rewards phases, {@linkcode PostMysteryEncounterPhase}, and ends phase */ doEncounterRewardsAndContinue() { - const encounter = this.scene.currentBattle.mysteryEncounter!; + const encounter = globalScene.currentBattle.mysteryEncounter!; if (encounter.doEncounterExp) { - encounter.doEncounterExp(this.scene); + encounter.doEncounterExp(); } if (encounter.doEncounterRewards) { - encounter.doEncounterRewards(this.scene); + encounter.doEncounterRewards(); } else if (this.addHealPhase) { - this.scene.tryRemovePhase(p => p instanceof SelectModifierPhase); - this.scene.unshiftPhase(new SelectModifierPhase(this.scene, 0, undefined, { fillRemaining: false, rerollMultiplier: -1 })); + globalScene.tryRemovePhase(p => p instanceof SelectModifierPhase); + globalScene.unshiftPhase( + new SelectModifierPhase(0, undefined, { + fillRemaining: false, + rerollMultiplier: -1, + }), + ); } - this.scene.pushPhase(new PostMysteryEncounterPhase(this.scene)); + globalScene.pushPhase(new PostMysteryEncounterPhase()); this.end(); } } @@ -552,9 +584,9 @@ export class PostMysteryEncounterPhase extends Phase { private readonly FIRST_DIALOGUE_PROMPT_DELAY = 750; onPostOptionSelect?: OptionPhaseCallback; - constructor(scene: BattleScene) { - super(scene); - this.onPostOptionSelect = this.scene.currentBattle.mysteryEncounter?.selectedOption?.onPostOptionPhase; + constructor() { + super(); + this.onPostOptionSelect = globalScene.currentBattle.mysteryEncounter?.selectedOption?.onPostOptionPhase; } /** @@ -564,14 +596,13 @@ export class PostMysteryEncounterPhase extends Phase { super.start(); if (this.onPostOptionSelect) { - this.scene.executeWithSeedOffset(async () => { - return await this.onPostOptionSelect!(this.scene) - .then((result) => { - if (isNullOrUndefined(result) || result) { - this.continueEncounter(); - } - }); - }, this.scene.currentBattle.mysteryEncounter?.getSeedOffset() * 2000); + globalScene.executeWithSeedOffset(async () => { + return await this.onPostOptionSelect!().then(result => { + if (isNullOrUndefined(result) || result) { + this.continueEncounter(); + } + }); + }, globalScene.currentBattle.mysteryEncounter?.getSeedOffset() * 2000); } else { this.continueEncounter(); } @@ -582,28 +613,35 @@ export class PostMysteryEncounterPhase extends Phase { */ continueEncounter() { const endPhase = () => { - this.scene.pushPhase(new NewBattlePhase(this.scene)); + globalScene.pushPhase(new NewBattlePhase()); this.end(); }; - const outroDialogue = this.scene.currentBattle?.mysteryEncounter?.dialogue?.outro; + const outroDialogue = globalScene.currentBattle?.mysteryEncounter?.dialogue?.outro; if (outroDialogue && outroDialogue.length > 0) { let i = 0; const showNextDialogue = () => { const nextAction = i === outroDialogue.length - 1 ? endPhase : showNextDialogue; const dialogue = outroDialogue[i]; let title: string | null = null; - const text: string | null = getEncounterText(this.scene, dialogue.text); + const text: string | null = getEncounterText(dialogue.text); if (dialogue.speaker) { - title = getEncounterText(this.scene, dialogue.speaker); + title = getEncounterText(dialogue.speaker); } i++; - this.scene.ui.setMode(Mode.MESSAGE); + globalScene.ui.setMode(Mode.MESSAGE); if (title) { - this.scene.ui.showDialogue(text ?? "", title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); + globalScene.ui.showDialogue( + text ?? "", + title, + null, + nextAction, + 0, + i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, + ); } else { - this.scene.ui.showText(text ?? "", null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); + globalScene.ui.showText(text ?? "", null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } }; diff --git a/src/phases/new-battle-phase.ts b/src/phases/new-battle-phase.ts index 5a422c9e6c7..8cdbdc5891a 100644 --- a/src/phases/new-battle-phase.ts +++ b/src/phases/new-battle-phase.ts @@ -1,10 +1,11 @@ +import { globalScene } from "#app/global-scene"; import { BattlePhase } from "./battle-phase"; export class NewBattlePhase extends BattlePhase { start() { super.start(); - this.scene.newBattle(); + globalScene.newBattle(); this.end(); } diff --git a/src/phases/new-biome-encounter-phase.ts b/src/phases/new-biome-encounter-phase.ts index eea591c3936..ed768742aac 100644 --- a/src/phases/new-biome-encounter-phase.ts +++ b/src/phases/new-biome-encounter-phase.ts @@ -1,34 +1,35 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { applyAbAttrs, PostBiomeChangeAbAttr } from "#app/data/ability"; import { getRandomWeatherType } from "#app/data/weather"; import { NextEncounterPhase } from "./next-encounter-phase"; export class NewBiomeEncounterPhase extends NextEncounterPhase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } doEncounter(): void { - this.scene.playBgm(undefined, true); + globalScene.playBgm(undefined, true); - for (const pokemon of this.scene.getParty()) { + for (const pokemon of globalScene.getPlayerParty()) { if (pokemon) { pokemon.resetBattleData(); + pokemon.customPokemonData.resetHitReceivedCount(); } } - for (const pokemon of this.scene.getParty().filter(p => p.isOnField())) { + for (const pokemon of globalScene.getPlayerParty().filter(p => p.isOnField())) { applyAbAttrs(PostBiomeChangeAbAttr, pokemon, null); } - const enemyField = this.scene.getEnemyField(); - const moveTargets: any[] = [ this.scene.arenaEnemy, enemyField ]; - const mysteryEncounter = this.scene.currentBattle?.mysteryEncounter?.introVisuals; + const enemyField = globalScene.getEnemyField(); + const moveTargets: any[] = [globalScene.arenaEnemy, enemyField]; + const mysteryEncounter = globalScene.currentBattle?.mysteryEncounter?.introVisuals; if (mysteryEncounter) { moveTargets.push(mysteryEncounter); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: moveTargets.flat(), x: "+=300", duration: 2000, @@ -36,7 +37,7 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); } - } + }, }); } @@ -44,6 +45,6 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { * Set biome weather. */ trySetWeatherIfNewBiome(): void { - this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); + globalScene.arena.trySetWeather(getRandomWeatherType(globalScene.arena), false); } } diff --git a/src/phases/next-encounter-phase.ts b/src/phases/next-encounter-phase.ts index 407d7c26b5d..e53f775f083 100644 --- a/src/phases/next-encounter-phase.ts +++ b/src/phases/next-encounter-phase.ts @@ -1,9 +1,9 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { EncounterPhase } from "./encounter-phase"; export class NextEncounterPhase extends EncounterPhase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start() { @@ -11,66 +11,71 @@ export class NextEncounterPhase extends EncounterPhase { } doEncounter(): void { - this.scene.playBgm(undefined, true); + globalScene.playBgm(undefined, true); - for (const pokemon of this.scene.getParty()) { + for (const pokemon of globalScene.getPlayerParty()) { if (pokemon) { pokemon.resetBattleData(); } } - this.scene.arenaNextEnemy.setBiome(this.scene.arena.biomeType); - this.scene.arenaNextEnemy.setVisible(true); + globalScene.arenaNextEnemy.setBiome(globalScene.arena.biomeType); + globalScene.arenaNextEnemy.setVisible(true); - const enemyField = this.scene.getEnemyField(); - const moveTargets: any[] = [ this.scene.arenaEnemy, this.scene.arenaNextEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.lastEnemyTrainer ]; - const lastEncounterVisuals = this.scene.lastMysteryEncounter?.introVisuals; + const enemyField = globalScene.getEnemyField(); + const moveTargets: any[] = [ + globalScene.arenaEnemy, + globalScene.arenaNextEnemy, + globalScene.currentBattle.trainer, + enemyField, + globalScene.lastEnemyTrainer, + ]; + const lastEncounterVisuals = globalScene.lastMysteryEncounter?.introVisuals; if (lastEncounterVisuals) { moveTargets.push(lastEncounterVisuals); } - const nextEncounterVisuals = this.scene.currentBattle.mysteryEncounter?.introVisuals; + const nextEncounterVisuals = globalScene.currentBattle.mysteryEncounter?.introVisuals; if (nextEncounterVisuals) { const enterFromRight = nextEncounterVisuals.enterFromRight; if (enterFromRight) { nextEncounterVisuals.x += 500; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: nextEncounterVisuals, x: "-=200", - duration: 2000 + duration: 2000, }); } else { moveTargets.push(nextEncounterVisuals); } } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: moveTargets.flat(), x: "+=300", duration: 2000, onComplete: () => { - this.scene.arenaEnemy.setBiome(this.scene.arena.biomeType); - this.scene.arenaEnemy.setX(this.scene.arenaNextEnemy.x); - this.scene.arenaEnemy.setAlpha(1); - this.scene.arenaNextEnemy.setX(this.scene.arenaNextEnemy.x - 300); - this.scene.arenaNextEnemy.setVisible(false); - if (this.scene.lastEnemyTrainer) { - this.scene.lastEnemyTrainer.destroy(); + globalScene.arenaEnemy.setBiome(globalScene.arena.biomeType); + globalScene.arenaEnemy.setX(globalScene.arenaNextEnemy.x); + globalScene.arenaEnemy.setAlpha(1); + globalScene.arenaNextEnemy.setX(globalScene.arenaNextEnemy.x - 300); + globalScene.arenaNextEnemy.setVisible(false); + if (globalScene.lastEnemyTrainer) { + globalScene.lastEnemyTrainer.destroy(); } if (lastEncounterVisuals) { - this.scene.field.remove(lastEncounterVisuals, true); - this.scene.lastMysteryEncounter!.introVisuals = undefined; + globalScene.field.remove(lastEncounterVisuals, true); + globalScene.lastMysteryEncounter!.introVisuals = undefined; } if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); } - } + }, }); } /** * Do nothing (since this is simply the next wave in the same biome). */ - trySetWeatherIfNewBiome(): void { - } + trySetWeatherIfNewBiome(): void {} } diff --git a/src/phases/obtain-status-effect-phase.ts b/src/phases/obtain-status-effect-phase.ts index 01384b932cb..a0c0c14e93f 100644 --- a/src/phases/obtain-status-effect-phase.ts +++ b/src/phases/obtain-status-effect-phase.ts @@ -1,9 +1,9 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; import { getStatusEffectObtainText, getStatusEffectOverlapText } from "#app/data/status-effect"; import { StatusEffect } from "#app/enums/status-effect"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { PokemonPhase } from "./pokemon-phase"; @@ -13,8 +13,14 @@ export class ObtainStatusEffectPhase extends PokemonPhase { private sourceText?: string | null; private sourcePokemon?: Pokemon | null; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, statusEffect?: StatusEffect, turnsRemaining?: number, sourceText?: string | null, sourcePokemon?: Pokemon | null) { - super(scene, battlerIndex); + constructor( + battlerIndex: BattlerIndex, + statusEffect?: StatusEffect, + turnsRemaining?: number, + sourceText?: string | null, + sourcePokemon?: Pokemon | null, + ) { + super(battlerIndex); this.statusEffect = statusEffect; this.turnsRemaining = turnsRemaining; @@ -30,14 +36,22 @@ export class ObtainStatusEffectPhase extends PokemonPhase { pokemon.status!.sleepTurnsRemaining = this.turnsRemaining; } pokemon.updateInfo(true); - new CommonBattleAnim(CommonAnim.POISON + (this.statusEffect! - 1), pokemon).play(this.scene, false, () => { - this.scene.queueMessage(getStatusEffectObtainText(this.statusEffect, getPokemonNameWithAffix(pokemon), this.sourceText ?? undefined)); + new CommonBattleAnim(CommonAnim.POISON + (this.statusEffect! - 1), pokemon).play(false, () => { + globalScene.queueMessage( + getStatusEffectObtainText( + this.statusEffect, + getPokemonNameWithAffix(pokemon), + this.sourceText ?? undefined, + ), + ); this.end(); }); return; } } else if (pokemon.status?.effect === this.statusEffect) { - this.scene.queueMessage(getStatusEffectOverlapText(this.statusEffect ?? StatusEffect.NONE, getPokemonNameWithAffix(pokemon))); + globalScene.queueMessage( + getStatusEffectOverlapText(this.statusEffect ?? StatusEffect.NONE, getPokemonNameWithAffix(pokemon)), + ); } this.end(); } diff --git a/src/phases/party-exp-phase.ts b/src/phases/party-exp-phase.ts index c5a254871ca..8fd9e1cf0f6 100644 --- a/src/phases/party-exp-phase.ts +++ b/src/phases/party-exp-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; /** @@ -10,8 +10,8 @@ export class PartyExpPhase extends Phase { useWaveIndexMultiplier?: boolean; pokemonParticipantIds?: Set; - constructor(scene: BattleScene, expValue: number, useWaveIndexMultiplier?: boolean, pokemonParticipantIds?: Set) { - super(scene); + constructor(expValue: number, useWaveIndexMultiplier?: boolean, pokemonParticipantIds?: Set) { + super(); this.expValue = expValue; this.useWaveIndexMultiplier = useWaveIndexMultiplier; @@ -24,7 +24,7 @@ export class PartyExpPhase extends Phase { start() { super.start(); - this.scene.applyPartyExp(this.expValue, false, this.useWaveIndexMultiplier, this.pokemonParticipantIds); + globalScene.applyPartyExp(this.expValue, false, this.useWaveIndexMultiplier, this.pokemonParticipantIds); this.end(); } diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts index e6ee11202df..d95400a3f48 100644 --- a/src/phases/party-heal-phase.ts +++ b/src/phases/party-heal-phase.ts @@ -1,12 +1,12 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; export class PartyHealPhase extends BattlePhase { private resumeBgm: boolean; - constructor(scene: BattleScene, resumeBgm: boolean) { - super(scene); + constructor(resumeBgm: boolean) { + super(); this.resumeBgm = resumeBgm; } @@ -14,27 +14,28 @@ export class PartyHealPhase extends BattlePhase { start() { super.start(); - const bgmPlaying = this.scene.isBgmPlaying(); + const bgmPlaying = globalScene.isBgmPlaying(); if (bgmPlaying) { - this.scene.fadeOutBgm(1000, false); + globalScene.fadeOutBgm(1000, false); } - this.scene.ui.fadeOut(1000).then(() => { - for (const pokemon of this.scene.getParty()) { + globalScene.ui.fadeOut(1000).then(() => { + for (const pokemon of globalScene.getPlayerParty()) { pokemon.hp = pokemon.getMaxHp(); pokemon.resetStatus(); for (const move of pokemon.moveset) { - move!.ppUsed = 0; // TODO: is this bang correct? + move!.ppUsed = 0; // TODO: is this bang correct? } pokemon.updateInfo(true); } - const healSong = this.scene.playSoundWithoutBgm("heal"); - this.scene.time.delayedCall(Utils.fixedInt(healSong.totalDuration * 1000), () => { + const healSong = globalScene.playSoundWithoutBgm("heal"); + globalScene.time.delayedCall(Utils.fixedInt(healSong.totalDuration * 1000), () => { healSong.destroy(); if (this.resumeBgm && bgmPlaying) { - this.scene.playBgm(); + globalScene.playBgm(); } - this.scene.ui.fadeIn(500).then(() => this.end()); + globalScene.ui.fadeIn(500).then(() => this.end()); }); }); + globalScene.arena.playerTerasUsed = 0; } } diff --git a/src/phases/party-member-pokemon-phase.ts b/src/phases/party-member-pokemon-phase.ts index 2b6ca01261d..a782eabda38 100644 --- a/src/phases/party-member-pokemon-phase.ts +++ b/src/phases/party-member-pokemon-phase.ts @@ -1,24 +1,22 @@ -import BattleScene from "#app/battle-scene"; -import Pokemon from "#app/field/pokemon"; +import { globalScene } from "#app/global-scene"; +import type Pokemon from "#app/field/pokemon"; import { FieldPhase } from "./field-phase"; export abstract class PartyMemberPokemonPhase extends FieldPhase { - protected partyMemberIndex: integer; - protected fieldIndex: integer; + protected partyMemberIndex: number; + protected fieldIndex: number; protected player: boolean; - constructor(scene: BattleScene, partyMemberIndex: integer, player: boolean) { - super(scene); + constructor(partyMemberIndex: number, player: boolean) { + super(); this.partyMemberIndex = partyMemberIndex; - this.fieldIndex = partyMemberIndex < this.scene.currentBattle.getBattlerCount() - ? partyMemberIndex - : -1; + this.fieldIndex = partyMemberIndex < globalScene.currentBattle.getBattlerCount() ? partyMemberIndex : -1; this.player = player; } getParty(): Pokemon[] { - return this.player ? this.scene.getParty() : this.scene.getEnemyParty(); + return this.player ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); } getPokemon(): Pokemon { diff --git a/src/phases/player-party-member-pokemon-phase.ts b/src/phases/player-party-member-pokemon-phase.ts index 87855b9334c..d97376a8614 100644 --- a/src/phases/player-party-member-pokemon-phase.ts +++ b/src/phases/player-party-member-pokemon-phase.ts @@ -1,10 +1,9 @@ -import BattleScene from "#app/battle-scene"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase"; export abstract class PlayerPartyMemberPokemonPhase extends PartyMemberPokemonPhase { - constructor(scene: BattleScene, partyMemberIndex: integer) { - super(scene, partyMemberIndex, true); + constructor(partyMemberIndex: number) { + super(partyMemberIndex, true); } getPlayerPokemon(): PlayerPokemon { diff --git a/src/phases/pokemon-anim-phase.ts b/src/phases/pokemon-anim-phase.ts index 26ae11d1026..b9c91508b5a 100644 --- a/src/phases/pokemon-anim-phase.ts +++ b/src/phases/pokemon-anim-phase.ts @@ -1,9 +1,10 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { SubstituteTag } from "#app/data/battler-tags"; -import { PokemonAnimType } from "#enums/pokemon-anim-type"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { BattlePhase } from "#app/phases/battle-phase"; - +import { isNullOrUndefined } from "#app/utils"; +import { PokemonAnimType } from "#enums/pokemon-anim-type"; +import { Species } from "#enums/species"; export class PokemonAnimPhase extends BattlePhase { /** The type of animation to play in this phase */ @@ -13,8 +14,8 @@ export class PokemonAnimPhase extends BattlePhase { /** Any other field sprites affected by this animation */ private fieldAssets: Phaser.GameObjects.Sprite[]; - constructor(scene: BattleScene, key: PokemonAnimType, pokemon: Pokemon, fieldAssets?: Phaser.GameObjects.Sprite[]) { - super(scene); + constructor(key: PokemonAnimType, pokemon: Pokemon, fieldAssets?: Phaser.GameObjects.Sprite[]) { + super(); this.key = key; this.pokemon = pokemon; @@ -37,52 +38,58 @@ export class PokemonAnimPhase extends BattlePhase { case PokemonAnimType.SUBSTITUTE_REMOVE: this.doSubstituteRemoveAnim(); break; + case PokemonAnimType.COMMANDER_APPLY: + this.doCommanderApplyAnim(); + break; + case PokemonAnimType.COMMANDER_REMOVE: + this.doCommanderRemoveAnim(); + break; default: this.end(); } } - doSubstituteAddAnim(): void { + private doSubstituteAddAnim(): void { const substitute = this.pokemon.getTag(SubstituteTag); - if (substitute === null) { + if (isNullOrUndefined(substitute)) { return this.end(); } const getSprite = () => { - const sprite = this.scene.addFieldSprite( + const sprite = globalScene.addFieldSprite( this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, - `pkmn${this.pokemon.isPlayer() ? "__back" : ""}__sub` + `pkmn${this.pokemon.isPlayer() ? "__back" : ""}__sub`, ); sprite.setOrigin(0.5, 1); - this.scene.field.add(sprite); + globalScene.field.add(sprite); return sprite; }; - const [ subSprite, subTintSprite ] = [ getSprite(), getSprite() ]; + const [subSprite, subTintSprite] = [getSprite(), getSprite()]; const subScale = this.pokemon.getSpriteScale() * (this.pokemon.isPlayer() ? 0.5 : 1); subSprite.setVisible(false); subSprite.setScale(subScale); - subTintSprite.setTintFill(0xFFFFFF); + subTintSprite.setTintFill(0xffffff); subTintSprite.setScale(0.01); if (this.pokemon.isPlayer()) { - this.scene.field.bringToTop(this.pokemon); + globalScene.field.bringToTop(this.pokemon); } - this.scene.playSound("PRSFX- Transform"); + globalScene.playSound("PRSFX- Transform"); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pokemon, duration: 500, x: this.pokemon.x + this.pokemon.getSubstituteOffset()[0], y: this.pokemon.y + this.pokemon.getSubstituteOffset()[1], alpha: 0.5, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: subTintSprite, delay: 250, scale: subScale, @@ -90,7 +97,7 @@ export class PokemonAnimPhase extends BattlePhase { duration: 500, onComplete: () => { subSprite.setVisible(true); - this.pokemon.scene.tweens.add({ + globalScene.tweens.add({ targets: subTintSprite, delay: 250, alpha: 0, @@ -100,13 +107,13 @@ export class PokemonAnimPhase extends BattlePhase { subTintSprite.destroy(); substitute.sprite = subSprite; this.end(); - } + }, }); - } + }, }); } - doSubstitutePreMoveAnim(): void { + private doSubstitutePreMoveAnim(): void { if (this.fieldAssets.length !== 1) { return this.end(); } @@ -116,14 +123,14 @@ export class PokemonAnimPhase extends BattlePhase { return this.end(); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: subSprite, alpha: 0, ease: "Sine.easeInOut", - duration: 500 + duration: 500, }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pokemon, x: subSprite.x, y: subSprite.y, @@ -131,11 +138,11 @@ export class PokemonAnimPhase extends BattlePhase { ease: "Sine.easeInOut", delay: 250, duration: 500, - onComplete: () => this.end() + onComplete: () => this.end(), }); } - doSubstitutePostMoveAnim(): void { + private doSubstitutePostMoveAnim(): void { if (this.fieldAssets.length !== 1) { return this.end(); } @@ -145,26 +152,26 @@ export class PokemonAnimPhase extends BattlePhase { return this.end(); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pokemon, x: subSprite.x + this.pokemon.getSubstituteOffset()[0], y: subSprite.y + this.pokemon.getSubstituteOffset()[1], alpha: 0.5, ease: "Sine.easeInOut", - duration: 500 + duration: 500, }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: subSprite, alpha: 1, ease: "Sine.easeInOut", delay: 250, duration: 500, - onComplete: () => this.end() + onComplete: () => this.end(), }); } - doSubstituteRemoveAnim(): void { + private doSubstituteRemoveAnim(): void { if (this.fieldAssets.length !== 1) { return this.end(); } @@ -175,46 +182,46 @@ export class PokemonAnimPhase extends BattlePhase { } const getSprite = () => { - const sprite = this.scene.addFieldSprite( + const sprite = globalScene.addFieldSprite( subSprite.x, subSprite.y, - `pkmn${this.pokemon.isPlayer() ? "__back" : ""}__sub` + `pkmn${this.pokemon.isPlayer() ? "__back" : ""}__sub`, ); sprite.setOrigin(0.5, 1); - this.scene.field.add(sprite); + globalScene.field.add(sprite); return sprite; }; const subTintSprite = getSprite(); const subScale = this.pokemon.getSpriteScale() * (this.pokemon.isPlayer() ? 0.5 : 1); subTintSprite.setAlpha(0); - subTintSprite.setTintFill(0xFFFFFF); + subTintSprite.setTintFill(0xffffff); subTintSprite.setScale(subScale); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: subTintSprite, alpha: 1, ease: "Sine.easeInOut", duration: 500, onComplete: () => { subSprite.destroy(); - const flashTimer = this.scene.time.addEvent({ + const flashTimer = globalScene.time.addEvent({ delay: 100, repeat: 7, startAt: 200, callback: () => { - this.scene.playSound("PRSFX- Substitute2.wav"); + globalScene.playSound("PRSFX- Substitute2.wav"); subTintSprite.setVisible(flashTimer.repeatCount % 2 === 0); if (!flashTimer.repeatCount) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: subTintSprite, scale: 0.01, ease: "Sine.cubicEaseIn", - duration: 500 + duration: 500, }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pokemon, x: this.pokemon.x - this.pokemon.getSubstituteOffset()[0], y: this.pokemon.y - this.pokemon.getSubstituteOffset()[1], @@ -225,12 +232,153 @@ export class PokemonAnimPhase extends BattlePhase { onComplete: () => { subTintSprite.destroy(); this.end(); - } + }, }); } - } + }, }); - } + }, + }); + } + + private doCommanderApplyAnim(): void { + if (!globalScene.currentBattle?.double) { + return this.end(); + } + const dondozo = this.pokemon.getAlly(); + + if (dondozo?.species?.speciesId !== Species.DONDOZO) { + return this.end(); + } + + const tatsugiriX = this.pokemon.x + this.pokemon.getSprite().x; + const tatsugiriY = this.pokemon.y + this.pokemon.getSprite().y; + + const getSourceSprite = () => { + const sprite = globalScene.addPokemonSprite( + this.pokemon, + tatsugiriX, + tatsugiriY, + this.pokemon.getSprite().texture, + this.pokemon.getSprite()!.frame.name, + true, + ); + ["spriteColors", "fusionSpriteColors"].map( + k => (sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]), + ); + sprite.setPipelineData("spriteKey", this.pokemon.getBattleSpriteKey()); + sprite.setPipelineData("shiny", this.pokemon.shiny); + sprite.setPipelineData("variant", this.pokemon.variant); + sprite.setPipelineData("ignoreFieldPos", true); + sprite.setOrigin(0.5, 1); + this.pokemon.getSprite().on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); + globalScene.field.add(sprite); + return sprite; + }; + + const sourceSprite = getSourceSprite(); + + this.pokemon.setVisible(false); + + const sourceFpOffset = this.pokemon.getFieldPositionOffset(); + const dondozoFpOffset = dondozo.getFieldPositionOffset(); + + globalScene.playSound("se/pb_throw"); + + globalScene.tweens.add({ + targets: sourceSprite, + duration: 375, + scale: 0.5, + x: { + value: tatsugiriX + (dondozoFpOffset[0] - sourceFpOffset[0]) / 2, + ease: "Linear", + }, + y: { + value: (this.pokemon.isPlayer() ? 100 : 65) + sourceFpOffset[1], + ease: "Sine.easeOut", + }, + onComplete: () => { + globalScene.field.bringToTop(dondozo); + globalScene.tweens.add({ + targets: sourceSprite, + duration: 375, + scale: 0.01, + x: { value: dondozo.x, ease: "Linear" }, + y: { value: dondozo.y + dondozo.height / 2, ease: "Sine.easeIn" }, + onComplete: () => { + sourceSprite.destroy(); + globalScene.playSound("battle_anims/PRSFX- Liquidation1.wav"); + globalScene.tweens.add({ + targets: dondozo, + duration: 250, + ease: "Sine.easeInOut", + scale: 0.85, + yoyo: true, + onComplete: () => this.end(), + }); + }, + }); + }, + }); + } + + private doCommanderRemoveAnim(): void { + // Note: unlike the other Commander animation, this is played through the + // Dondozo instead of the Tatsugiri. + const tatsugiri = this.pokemon.getAlly(); + if (isNullOrUndefined(tatsugiri)) { + console.warn("Aborting COMMANDER_REMOVE anim: Tatsugiri is undefined"); + return this.end(); + } + + const tatsuSprite = globalScene.addPokemonSprite( + tatsugiri, + this.pokemon.x + this.pokemon.getSprite().x, + this.pokemon.y + this.pokemon.getSprite().y + this.pokemon.height / 2, + tatsugiri.getSprite().texture, + tatsugiri.getSprite()!.frame.name, + true, + ); + ["spriteColors", "fusionSpriteColors"].map( + k => (tatsuSprite.pipelineData[k] = tatsugiri.getSprite().pipelineData[k]), + ); + tatsuSprite.setPipelineData("spriteKey", tatsugiri.getBattleSpriteKey()); + tatsuSprite.setPipelineData("shiny", tatsugiri.shiny); + tatsuSprite.setPipelineData("variant", tatsugiri.variant); + tatsuSprite.setPipelineData("ignoreFieldPos", true); + this.pokemon.getSprite().on("animationupdate", (_anim, frame) => tatsuSprite.setFrame(frame.textureFrame)); + + tatsuSprite.setOrigin(0.5, 1); + tatsuSprite.setScale(0.01); + + globalScene.field.add(tatsuSprite); + globalScene.field.bringToTop(this.pokemon); + tatsuSprite.setVisible(true); + + globalScene.tweens.add({ + targets: this.pokemon, + duration: 250, + ease: "Sine.easeInOut", + scale: 1.15, + yoyo: true, + onComplete: () => { + globalScene.playSound("battle_anims/PRSFX- Liquidation4.wav"); + globalScene.tweens.add({ + targets: tatsuSprite, + duration: 500, + scale: 1, + x: { value: tatsugiri.x + tatsugiri.getSprite().x, ease: "Linear" }, + y: { + value: tatsugiri.y + tatsugiri.getSprite().y, + ease: "Sine.easeIn", + }, + onComplete: () => { + tatsugiri.setVisible(true); + tatsuSprite.destroy(); + this.end(); + }, + }); + }, }); } } diff --git a/src/phases/pokemon-heal-phase.ts b/src/phases/pokemon-heal-phase.ts index dc0bd235bb5..ab49def5a3d 100644 --- a/src/phases/pokemon-heal-phase.ts +++ b/src/phases/pokemon-heal-phase.ts @@ -1,9 +1,10 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; import { CommonAnim } from "#app/data/battle-anims"; import { getStatusEffectHealText } from "#app/data/status-effect"; import { StatusEffect } from "#app/enums/status-effect"; -import { HitResult, DamageResult } from "#app/field/pokemon"; +import type { DamageResult } from "#app/field/pokemon"; +import { HitResult } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { HealingBoosterModifier } from "#app/modifier/modifier"; import { HealAchv } from "#app/system/achv"; @@ -11,19 +12,30 @@ import i18next from "i18next"; import * as Utils from "#app/utils"; import { CommonAnimPhase } from "./common-anim-phase"; import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { HealBlockTag } from "#app/data/battler-tags"; +import type { HealBlockTag } from "#app/data/battler-tags"; export class PokemonHealPhase extends CommonAnimPhase { - private hpHealed: integer; + private hpHealed: number; private message: string | null; private showFullHpMessage: boolean; private skipAnim: boolean; private revive: boolean; private healStatus: boolean; private preventFullHeal: boolean; + private fullRestorePP: boolean; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, hpHealed: integer, message: string | null, showFullHpMessage: boolean, skipAnim: boolean = false, revive: boolean = false, healStatus: boolean = false, preventFullHeal: boolean = false) { - super(scene, battlerIndex, undefined, CommonAnim.HEALTH_UP); + constructor( + battlerIndex: BattlerIndex, + hpHealed: number, + message: string | null, + showFullHpMessage: boolean, + skipAnim = false, + revive = false, + healStatus = false, + preventFullHeal = false, + fullRestorePP = false, + ) { + super(battlerIndex, undefined, CommonAnim.HEALTH_UP); this.hpHealed = hpHealed; this.message = message; @@ -32,6 +44,7 @@ export class PokemonHealPhase extends CommonAnimPhase { this.revive = revive; this.healStatus = healStatus; this.preventFullHeal = preventFullHeal; + this.fullRestorePP = fullRestorePP; } start() { @@ -50,18 +63,19 @@ export class PokemonHealPhase extends CommonAnimPhase { } const hasMessage = !!this.message; - const healOrDamage = (!pokemon.isFullHp() || this.hpHealed < 0); + const healOrDamage = !pokemon.isFullHp() || this.hpHealed < 0; const healBlock = pokemon.getTag(BattlerTagType.HEAL_BLOCK) as HealBlockTag; let lastStatusEffect = StatusEffect.NONE; if (healBlock && this.hpHealed > 0) { - this.scene.queueMessage(healBlock.onActivation(pokemon)); + globalScene.queueMessage(healBlock.onActivation(pokemon)); this.message = null; return super.end(); - } else if (healOrDamage) { - const hpRestoreMultiplier = new Utils.IntegerHolder(1); + } + if (healOrDamage) { + const hpRestoreMultiplier = new Utils.NumberHolder(1); if (!this.revive) { - this.scene.applyModifiers(HealingBoosterModifier, this.player, hpRestoreMultiplier); + globalScene.applyModifiers(HealingBoosterModifier, this.player, hpRestoreMultiplier); } const healAmount = new Utils.NumberHolder(Math.floor(this.hpHealed * hpRestoreMultiplier.value)); if (healAmount.value < 0) { @@ -70,37 +84,46 @@ export class PokemonHealPhase extends CommonAnimPhase { } // Prevent healing to full if specified (in case of healing tokens so Sturdy doesn't cause a softlock) if (this.preventFullHeal && pokemon.hp + healAmount.value >= pokemon.getMaxHp()) { - healAmount.value = (pokemon.getMaxHp() - pokemon.hp) - 1; + healAmount.value = pokemon.getMaxHp() - pokemon.hp - 1; } healAmount.value = pokemon.heal(healAmount.value); if (healAmount.value) { - this.scene.damageNumberHandler.add(pokemon, healAmount.value, HitResult.HEAL); + globalScene.damageNumberHandler.add(pokemon, healAmount.value, HitResult.HEAL); } if (pokemon.isPlayer()) { - this.scene.validateAchvs(HealAchv, healAmount); - if (healAmount.value > this.scene.gameData.gameStats.highestHeal) { - this.scene.gameData.gameStats.highestHeal = healAmount.value; + globalScene.validateAchvs(HealAchv, healAmount); + if (healAmount.value > globalScene.gameData.gameStats.highestHeal) { + globalScene.gameData.gameStats.highestHeal = healAmount.value; } } if (this.healStatus && !this.revive && pokemon.status) { lastStatusEffect = pokemon.status.effect; pokemon.resetStatus(); } + if (this.fullRestorePP) { + for (const move of this.getPokemon().getMoveset()) { + if (move) { + move.ppUsed = 0; + } + } + } pokemon.updateInfo().then(() => super.end()); } else if (this.healStatus && !this.revive && pokemon.status) { lastStatusEffect = pokemon.status.effect; pokemon.resetStatus(); pokemon.updateInfo().then(() => super.end()); } else if (this.showFullHpMessage) { - this.message = i18next.t("battle:hpIsFull", { pokemonName: getPokemonNameWithAffix(pokemon) }); + this.message = i18next.t("battle:hpIsFull", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } if (this.message) { - this.scene.queueMessage(this.message); + globalScene.queueMessage(this.message); } if (this.healStatus && lastStatusEffect && !hasMessage) { - this.scene.queueMessage(getStatusEffectHealText(lastStatusEffect, getPokemonNameWithAffix(pokemon))); + globalScene.queueMessage(getStatusEffectHealText(lastStatusEffect, getPokemonNameWithAffix(pokemon))); } if (!healOrDamage && !lastStatusEffect) { diff --git a/src/phases/pokemon-phase.ts b/src/phases/pokemon-phase.ts index b980c1d1719..3ca5f09f953 100644 --- a/src/phases/pokemon-phase.ts +++ b/src/phases/pokemon-phase.ts @@ -1,18 +1,21 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { BattlerIndex } from "#app/battle"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { FieldPhase } from "./field-phase"; export abstract class PokemonPhase extends FieldPhase { - protected battlerIndex: BattlerIndex | integer; + protected battlerIndex: BattlerIndex | number; public player: boolean; - public fieldIndex: integer; + public fieldIndex: number; - constructor(scene: BattleScene, battlerIndex?: BattlerIndex | integer) { - super(scene); + constructor(battlerIndex?: BattlerIndex | number) { + super(); if (battlerIndex === undefined) { - battlerIndex = scene.getField().find(p => p?.isActive())!.getBattlerIndex(); // TODO: is the bang correct here? + battlerIndex = globalScene + .getField() + .find(p => p?.isActive())! + .getBattlerIndex(); // TODO: is the bang correct here? } this.battlerIndex = battlerIndex; @@ -22,8 +25,8 @@ export abstract class PokemonPhase extends FieldPhase { getPokemon(): Pokemon { if (this.battlerIndex > BattlerIndex.ENEMY_2) { - return this.scene.getPokemonById(this.battlerIndex)!; //TODO: is this bang correct? + return globalScene.getPokemonById(this.battlerIndex)!; //TODO: is this bang correct? } - return this.scene.getField()[this.battlerIndex]!; //TODO: is this bang correct? + return globalScene.getField()[this.battlerIndex]!; //TODO: is this bang correct? } } diff --git a/src/phases/pokemon-transform-phase.ts b/src/phases/pokemon-transform-phase.ts new file mode 100644 index 00000000000..b33689321b5 --- /dev/null +++ b/src/phases/pokemon-transform-phase.ts @@ -0,0 +1,85 @@ +import type { BattlerIndex } from "#app/battle"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { EFFECTIVE_STATS, BATTLE_STATS } from "#enums/stat"; +import { PokemonMove } from "#app/field/pokemon"; +import { globalScene } from "#app/global-scene"; +import { PokemonPhase } from "./pokemon-phase"; +import { getPokemonNameWithAffix } from "#app/messages"; +import i18next from "i18next"; + +/** + * Transforms a Pokemon into another Pokemon on the field. + * Used for Transform (move) and Imposter (ability) + */ +export class PokemonTransformPhase extends PokemonPhase { + protected targetIndex: BattlerIndex; + private playSound: boolean; + + constructor(userIndex: BattlerIndex, targetIndex: BattlerIndex, playSound = false) { + super(userIndex); + + this.targetIndex = targetIndex; + this.playSound = playSound; + } + + public override start(): void { + const user = this.getPokemon(); + const target = globalScene.getField(true).find(p => p.getBattlerIndex() === this.targetIndex); + + if (!target) { + return this.end(); + } + + user.summonData.speciesForm = target.getSpeciesForm(); + user.summonData.ability = target.getAbility().id; + user.summonData.gender = target.getGender(); + + // Power Trick's effect is removed after using Transform + user.removeTag(BattlerTagType.POWER_TRICK); + + // Copy all stats (except HP) + for (const s of EFFECTIVE_STATS) { + user.setStat(s, target.getStat(s, false), false); + } + + // Copy all stat stages + for (const s of BATTLE_STATS) { + user.setStatStage(s, target.getStatStage(s)); + } + + user.summonData.moveset = target.getMoveset().map(m => { + if (m) { + // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. + return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); + } + console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`); + return new PokemonMove(Moves.NONE); + }); + user.summonData.types = target.getTypes(); + + const promises = [user.updateInfo()]; + + if (this.playSound) { + globalScene.playSound("battle_anims/PRSFX- Transform"); + } + + globalScene.queueMessage( + i18next.t("abilityTriggers:postSummonTransform", { + pokemonNameWithAffix: getPokemonNameWithAffix(user), + targetName: target.name, + }), + ); + + promises.push( + user.loadAssets(false).then(() => { + user.playAnim(); + user.updateInfo(); + // If the new ability activates immediately, it needs to happen after all the transform animations + user.setTempAbility(target.getAbility()); + }), + ); + + Promise.allSettled(promises).then(() => this.end()); + } +} diff --git a/src/phases/post-game-over-phase.ts b/src/phases/post-game-over-phase.ts index beeb30c7260..f86ec8496e0 100644 --- a/src/phases/post-game-over-phase.ts +++ b/src/phases/post-game-over-phase.ts @@ -1,13 +1,13 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; -import { EndCardPhase } from "./end-card-phase"; +import type { EndCardPhase } from "./end-card-phase"; import { TitlePhase } from "./title-phase"; export class PostGameOverPhase extends Phase { private endCardPhase: EndCardPhase | null; - constructor(scene: BattleScene, endCardPhase?: EndCardPhase) { - super(scene); + constructor(endCardPhase?: EndCardPhase) { + super(); this.endCardPhase = endCardPhase!; // TODO: is this bang correct? } @@ -16,24 +16,26 @@ export class PostGameOverPhase extends Phase { super.start(); const saveAndReset = () => { - this.scene.gameData.saveAll(this.scene, true, true, true).then(success => { + globalScene.gameData.saveAll(true, true, true).then(success => { if (!success) { - return this.scene.reset(true); + return globalScene.reset(true); } - this.scene.gameData.tryClearSession(this.scene, this.scene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { - if (!success[0]) { - return this.scene.reset(true); - } - this.scene.reset(); - this.scene.unshiftPhase(new TitlePhase(this.scene)); - this.end(); - }); + globalScene.gameData + .tryClearSession(globalScene.sessionSlotId) + .then((success: boolean | [boolean, boolean]) => { + if (!success[0]) { + return globalScene.reset(true); + } + globalScene.reset(); + globalScene.unshiftPhase(new TitlePhase()); + this.end(); + }); }); }; if (this.endCardPhase) { - this.scene.ui.fadeOut(500).then(() => { - this.scene.ui.getMessageHandler().bg.setVisible(true); + globalScene.ui.fadeOut(500).then(() => { + globalScene.ui.getMessageHandler().bg.setVisible(true); this.endCardPhase?.endCard.destroy(); this.endCardPhase?.text.destroy(); diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts index 3db98d9926c..a7aa9389505 100644 --- a/src/phases/post-summon-phase.ts +++ b/src/phases/post-summon-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; -import { applyPostSummonAbAttrs, PostSummonAbAttr } from "#app/data/ability"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; +import { applyAbAttrs, applyPostSummonAbAttrs, CommanderAbAttr, PostSummonAbAttr } from "#app/data/ability"; import { ArenaTrapTag } from "#app/data/arena-tag"; import { StatusEffect } from "#app/enums/status-effect"; import { PokemonPhase } from "./pokemon-phase"; @@ -8,10 +8,6 @@ import { MysteryEncounterPostSummonTag } from "#app/data/battler-tags"; import { BattlerTagType } from "#enums/battler-tag-type"; export class PostSummonPhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { - super(scene, battlerIndex); - } - start() { super.start(); @@ -20,13 +16,22 @@ export class PostSummonPhase extends PokemonPhase { if (pokemon.status?.effect === StatusEffect.TOXIC) { pokemon.status.toxicTurnCount = 0; } - this.scene.arena.applyTags(ArenaTrapTag, false, pokemon); + globalScene.arena.applyTags(ArenaTrapTag, false, pokemon); // If this is mystery encounter and has post summon phase tag, apply post summon effects - if (this.scene.currentBattle.isBattleMysteryEncounter() && pokemon.findTags(t => t instanceof MysteryEncounterPostSummonTag).length > 0) { + if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + pokemon.findTags(t => t instanceof MysteryEncounterPostSummonTag).length > 0 + ) { pokemon.lapseTag(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON); } - applyPostSummonAbAttrs(PostSummonAbAttr, pokemon).then(() => this.end()); + applyPostSummonAbAttrs(PostSummonAbAttr, pokemon); + const field = pokemon.isPlayer() ? globalScene.getPlayerField() : globalScene.getEnemyField(); + for (const p of field) { + 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 2efd992a2b5..f6341666e7e 100644 --- a/src/phases/post-turn-status-effect-phase.ts +++ b/src/phases/post-turn-status-effect-phase.ts @@ -1,6 +1,13 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, BlockNonDirectDamageAbAttr, BlockStatusDamageAbAttr, ReduceBurnDamageAbAttr } from "#app/data/ability"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; +import { + applyAbAttrs, + applyPostDamageAbAttrs, + BlockNonDirectDamageAbAttr, + BlockStatusDamageAbAttr, + PostDamageAbAttr, + ReduceBurnDamageAbAttr, +} from "#app/data/ability"; import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; import { getStatusEffectActivationText } from "#app/data/status-effect"; import { BattleSpec } from "#app/enums/battle-spec"; @@ -10,20 +17,23 @@ import * as Utils from "#app/utils"; import { PokemonPhase } from "./pokemon-phase"; export class PostTurnStatusEffectPhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { - super(scene, battlerIndex); + // biome-ignore lint/complexity/noUselessConstructor: Not unnecessary as it makes battlerIndex required + constructor(battlerIndex: BattlerIndex) { + super(battlerIndex); } 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); applyAbAttrs(BlockStatusDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - this.scene.queueMessage(getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + globalScene.queueMessage( + getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon)), + ); const damage = new Utils.NumberHolder(0); switch (pokemon.status.effect) { case StatusEffect.POISON: @@ -39,10 +49,11 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { } if (damage.value) { // Set preventEndure flag to avoid pokemon surviving thanks to focus band, sturdy, endure ... - this.scene.damageNumberHandler.add(this.getPokemon(), pokemon.damage(damage.value, false, true)); + globalScene.damageNumberHandler.add(this.getPokemon(), pokemon.damage(damage.value, false, true)); pokemon.updateInfo(); + applyPostDamageAbAttrs(PostDamageAbAttr, pokemon, damage.value, pokemon.hasPassive(), false, []); } - new CommonBattleAnim(CommonAnim.POISON + (pokemon.status.effect - 1), pokemon).play(this.scene, false, () => this.end()); + new CommonBattleAnim(CommonAnim.POISON + (pokemon.status.effect - 1), pokemon).play(false, () => this.end()); } else { this.end(); } @@ -52,8 +63,8 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { } override end() { - if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - this.scene.initFinalBossPhaseTwo(this.getPokemon()); + if (globalScene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + globalScene.initFinalBossPhaseTwo(this.getPokemon()); } else { super.end(); } diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index c28cc28b592..1512609abf9 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -1,21 +1,29 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { SemiInvulnerableTag } from "#app/data/battler-tags"; -import { SpeciesFormChange, getSpeciesFormChangeMessage } from "#app/data/pokemon-forms"; +import type { SpeciesFormChange } from "#app/data/pokemon-forms"; +import { getSpeciesFormChangeMessage, SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; import { getTypeRgb } from "#app/data/type"; import { BattleSpec } from "#app/enums/battle-spec"; import { BattlerTagType } from "#app/enums/battler-tag-type"; -import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { EnemyPokemon } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { BattlePhase } from "./battle-phase"; import { MovePhase } from "./move-phase"; import { PokemonHealPhase } from "./pokemon-heal-phase"; +import { + applyAbAttrs, + ClearTerrainAbAttr, + ClearWeatherAbAttr, + PostTeraFormChangeStatChangeAbAttr, +} from "#app/data/ability"; export class QuietFormChangePhase extends BattlePhase { protected pokemon: Pokemon; protected formChange: SpeciesFormChange; - constructor(scene: BattleScene, pokemon: Pokemon, formChange: SpeciesFormChange) { - super(scene); + constructor(pokemon: Pokemon, formChange: SpeciesFormChange) { + super(); this.pokemon = pokemon; this.formChange = formChange; } @@ -29,29 +37,53 @@ export class QuietFormChangePhase extends BattlePhase { const preName = getPokemonNameWithAffix(this.pokemon); - if (!this.pokemon.isOnField() || this.pokemon.getTag(SemiInvulnerableTag)) { - this.pokemon.changeForm(this.formChange).then(() => { - this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500); - }); + if (!this.pokemon.isOnField() || this.pokemon.getTag(SemiInvulnerableTag) || this.pokemon.isFainted()) { + if (this.pokemon.isPlayer() || this.pokemon.isActive()) { + this.pokemon.changeForm(this.formChange).then(() => { + globalScene.ui.showText( + getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), + null, + () => this.end(), + 1500, + ); + }); + } else { + this.end(); + } return; } 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"); + const sprite = globalScene.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(); - 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 => { + const spriteKey = this.pokemon.getBattleSpriteKey(); + try { + sprite.play(spriteKey).stop(); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + sprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + hasShadow: false, + teraColor: getTypeRgb(this.pokemon.getTeraType()), + isTerastallized: this.pokemon.isTerastallized, + }); + ["spriteColors", "fusionSpriteColors"].map(k => { if (this.pokemon.summonData?.speciesForm) { k += "Base"; } sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]; }); - this.scene.field.add(sprite); + globalScene.field.add(sprite); return sprite; }; - const [ pokemonTintSprite, pokemonFormTintSprite ] = [ getPokemonSprite(), getPokemonSprite() ]; + const [pokemonTintSprite, pokemonFormTintSprite] = [getPokemonSprite(), getPokemonSprite()]; this.pokemon.getSprite().on("animationupdate", (_anim, frame) => { if (frame.textureKey === pokemonTintSprite.texture.key) { @@ -62,13 +94,13 @@ export class QuietFormChangePhase extends BattlePhase { }); pokemonTintSprite.setAlpha(0); - pokemonTintSprite.setTintFill(0xFFFFFF); + pokemonTintSprite.setTintFill(0xffffff); pokemonFormTintSprite.setVisible(false); - pokemonFormTintSprite.setTintFill(0xFFFFFF); + pokemonFormTintSprite.setTintFill(0xffffff); - this.scene.playSound("battle_anims/PRSFX- Transform"); + globalScene.playSound("battle_anims/PRSFX- Transform"); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pokemonTintSprite, alpha: 1, duration: 1000, @@ -77,17 +109,22 @@ 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({ + globalScene.tweens.add({ targets: pokemonTintSprite, delay: 250, scale: 0.01, ease: "Cubic.easeInOut", duration: 500, - onComplete: () => pokemonTintSprite.destroy() + onComplete: () => pokemonTintSprite.destroy(), }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pokemonFormTintSprite, delay: 250, scale: this.pokemon.getSpriteScale(), @@ -95,7 +132,7 @@ export class QuietFormChangePhase extends BattlePhase { duration: 500, onComplete: () => { this.pokemon.setVisible(true); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pokemonFormTintSprite, delay: 250, alpha: 0, @@ -103,32 +140,44 @@ export class QuietFormChangePhase extends BattlePhase { duration: 1000, onComplete: () => { pokemonTintSprite.setVisible(false); - this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), 1500); - } + globalScene.ui.showText( + getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), + null, + () => this.end(), + 1500, + ); + }, }); - } + }, }); }); - } + }, }); } end(): void { this.pokemon.findAndRemoveTags(t => t.tagType === BattlerTagType.AUTOTOMIZED); - if (this.pokemon.scene?.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) { - this.scene.playBgm(); - this.scene.unshiftPhase(new PokemonHealPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true)); + if (globalScene?.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) { + globalScene.playBgm(); + globalScene.unshiftPhase( + new PokemonHealPhase(this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true), + ); this.pokemon.findAndRemoveTags(() => true); this.pokemon.bossSegments = 5; this.pokemon.bossSegmentIndex = 4; this.pokemon.initBattleInfo(); this.pokemon.cry(); - const movePhase = this.scene.findPhase(p => p instanceof MovePhase && p.pokemon === this.pokemon) as MovePhase; + const movePhase = globalScene.findPhase(p => p instanceof MovePhase && p.pokemon === this.pokemon) as MovePhase; if (movePhase) { movePhase.cancel(); } } + if (this.formChange.trigger instanceof SpeciesFormChangeTeraTrigger) { + applyAbAttrs(PostTeraFormChangeStatChangeAbAttr, this.pokemon, null); + applyAbAttrs(ClearWeatherAbAttr, this.pokemon, null); + applyAbAttrs(ClearTerrainAbAttr, this.pokemon, null); + } super.end(); } diff --git a/src/phases/reload-session-phase.ts b/src/phases/reload-session-phase.ts index f8a38105869..3a4a4e0e3a5 100644 --- a/src/phases/reload-session-phase.ts +++ b/src/phases/reload-session-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; @@ -6,19 +6,19 @@ import * as Utils from "#app/utils"; export class ReloadSessionPhase extends Phase { private systemDataStr: string | null; - constructor(scene: BattleScene, systemDataStr?: string) { - super(scene); + constructor(systemDataStr?: string) { + super(); this.systemDataStr = systemDataStr ?? null; } start(): void { - this.scene.ui.setMode(Mode.SESSION_RELOAD); + globalScene.ui.setMode(Mode.SESSION_RELOAD); let delayElapsed = false; let loaded = false; - this.scene.time.delayedCall(Utils.fixedInt(1500), () => { + globalScene.time.delayedCall(Utils.fixedInt(1500), () => { if (loaded) { this.end(); } else { @@ -26,14 +26,16 @@ export class ReloadSessionPhase extends Phase { } }); - this.scene.gameData.clearLocalData(); + globalScene.gameData.clearLocalData(); - (this.systemDataStr ? this.scene.gameData.initSystem(this.systemDataStr) : this.scene.gameData.loadSystem()).then(() => { - if (delayElapsed) { - this.end(); - } else { - loaded = true; - } - }); + (this.systemDataStr ? globalScene.gameData.initSystem(this.systemDataStr) : globalScene.gameData.loadSystem()).then( + () => { + if (delayElapsed) { + this.end(); + } else { + loaded = true; + } + }, + ); } } diff --git a/src/phases/return-phase.ts b/src/phases/return-phase.ts index eb587201585..6dee982a4f0 100644 --- a/src/phases/return-phase.ts +++ b/src/phases/return-phase.ts @@ -1,18 +1,18 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; import { SwitchType } from "#enums/switch-type"; import { SwitchSummonPhase } from "./switch-summon-phase"; export class ReturnPhase extends SwitchSummonPhase { - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene, SwitchType.SWITCH, fieldIndex, -1, true); + constructor(fieldIndex: number) { + super(SwitchType.SWITCH, fieldIndex, -1, true); } switchAndSummon(): void { this.end(); } - summon(): void { } + summon(): void {} onEnd(): void { const pokemon = this.getPokemon(); @@ -21,8 +21,8 @@ export class ReturnPhase extends SwitchSummonPhase { pokemon.resetTurnData(); pokemon.resetSummonData(); - this.scene.updateFieldScale(); + globalScene.updateFieldScale(); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger); } } diff --git a/src/phases/revival-blessing-phase.ts b/src/phases/revival-blessing-phase.ts new file mode 100644 index 00000000000..1ed63f76b64 --- /dev/null +++ b/src/phases/revival-blessing-phase.ts @@ -0,0 +1,67 @@ +import { SwitchType } from "#enums/switch-type"; +import { globalScene } from "#app/global-scene"; +import type { PartyOption } from "#app/ui/party-ui-handler"; +import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; +import { BattlePhase } from "#app/phases/battle-phase"; +import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; +import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; +import type { PlayerPokemon } from "#app/field/pokemon"; + +/** + * Sets the Party UI and handles the effect of Revival Blessing + * when used by one of the player's Pokemon. + */ +export class RevivalBlessingPhase extends BattlePhase { + constructor(protected user: PlayerPokemon) { + super(); + } + + public override start(): void { + globalScene.ui.setMode( + Mode.PARTY, + PartyUiMode.REVIVAL_BLESSING, + this.user.getFieldIndex(), + (slotIndex: integer, _option: PartyOption) => { + if (slotIndex >= 0 && slotIndex < 6) { + const pokemon = globalScene.getPlayerParty()[slotIndex]; + if (!pokemon || !pokemon.isFainted()) { + return this.end(); + } + + pokemon.resetTurnData(); + pokemon.resetStatus(); + pokemon.heal(Math.min(Utils.toDmgValue(0.5 * pokemon.getMaxHp()), pokemon.getMaxHp())); + globalScene.queueMessage( + i18next.t("moveTriggers:revivalBlessing", { + pokemonName: pokemon.name, + }), + 0, + true, + ); + + if (globalScene.currentBattle.double && globalScene.getPlayerParty().length > 1) { + const allyPokemon = this.user.getAlly(); + if (slotIndex <= 1) { + // Revived ally pokemon + globalScene.unshiftPhase( + new SwitchSummonPhase(SwitchType.SWITCH, pokemon.getFieldIndex(), slotIndex, false, true), + ); + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); + } else if (allyPokemon.isFainted()) { + // Revived party pokemon, and ally pokemon is fainted + globalScene.unshiftPhase( + new SwitchSummonPhase(SwitchType.SWITCH, allyPokemon.getFieldIndex(), slotIndex, false, true), + ); + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); + } + } + } + globalScene.ui.setMode(Mode.MESSAGE).then(() => this.end()); + }, + PartyUiHandler.FilterFainted, + ); + } +} diff --git a/src/phases/ribbon-modifier-reward-phase.ts b/src/phases/ribbon-modifier-reward-phase.ts index fabb3bfa1b1..0ee38250ce1 100644 --- a/src/phases/ribbon-modifier-reward-phase.ts +++ b/src/phases/ribbon-modifier-reward-phase.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene"; -import PokemonSpecies from "#app/data/pokemon-species"; -import { ModifierTypeFunc } from "#app/modifier/modifier-type"; +import { globalScene } from "#app/global-scene"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import type { ModifierTypeFunc } from "#app/modifier/modifier-type"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { ModifierRewardPhase } from "./modifier-reward-phase"; @@ -8,8 +8,8 @@ import { ModifierRewardPhase } from "./modifier-reward-phase"; export class RibbonModifierRewardPhase extends ModifierRewardPhase { private species: PokemonSpecies; - constructor(scene: BattleScene, modifierTypeFunc: ModifierTypeFunc, species: PokemonSpecies) { - super(scene, modifierTypeFunc); + constructor(modifierTypeFunc: ModifierTypeFunc, species: PokemonSpecies) { + super(modifierTypeFunc); this.species = species; } @@ -17,17 +17,23 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { doReward(): Promise { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); - this.scene.addModifier(newModifier).then(() => { - this.scene.playSound("level_up_fanfare"); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:beatModeFirstTime", { + globalScene.addModifier(newModifier); + globalScene.playSound("level_up_fanfare"); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:beatModeFirstTime", { speciesName: this.species.name, - gameMode: this.scene.gameMode.getName(), - newModifier: newModifier?.type.name - }), null, () => { + gameMode: globalScene.gameMode.getName(), + newModifier: newModifier?.type.name, + }), + null, + () => { resolve(); - }, null, true, 1500); - }); + }, + null, + true, + 1500, + ); }); } } diff --git a/src/phases/scan-ivs-phase.ts b/src/phases/scan-ivs-phase.ts index 5ec61d5eec6..2a2d68591ca 100644 --- a/src/phases/scan-ivs-phase.ts +++ b/src/phases/scan-ivs-phase.ts @@ -1,7 +1,6 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; -import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; -import { Stat } from "#app/enums/stat"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; +import { PERMANENT_STATS, Stat } from "#app/enums/stat"; import { getPokemonNameWithAffix } from "#app/messages"; import { getTextColor, TextStyle } from "#app/ui/text"; import { Mode } from "#app/ui/ui"; @@ -9,38 +8,32 @@ import i18next from "i18next"; import { PokemonPhase } from "./pokemon-phase"; export class ScanIvsPhase extends PokemonPhase { - private shownIvs: integer; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, shownIvs: integer) { - super(scene, battlerIndex); - - this.shownIvs = shownIvs; + constructor(battlerIndex: BattlerIndex) { + super(battlerIndex); } start() { super.start(); - if (!this.shownIvs) { - return this.end(); - } - const pokemon = this.getPokemon(); let enemyIvs: number[] = []; let statsContainer: Phaser.GameObjects.Sprite[] = []; let statsContainerLabels: Phaser.GameObjects.Sprite[] = []; - const enemyField = this.scene.getEnemyField(); - const uiTheme = (this.scene as BattleScene).uiTheme; // Assuming uiTheme is accessible + const enemyField = globalScene.getEnemyField(); + const uiTheme = globalScene.uiTheme; // Assuming uiTheme is accessible for (let e = 0; e < enemyField.length; e++) { enemyIvs = enemyField[e].ivs; - const currentIvs = this.scene.gameData.dexData[enemyField[e].species.getRootSpeciesId()].ivs; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists - const ivsToShow = this.scene.ui.getMessageHandler().getTopIvs(enemyIvs, this.shownIvs); + const currentIvs = globalScene.gameData.dexData[enemyField[e].species.getRootSpeciesId()].ivs; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists statsContainer = enemyField[e].getBattleInfo().getStatsValueContainer().list as Phaser.GameObjects.Sprite[]; statsContainerLabels = statsContainer.filter(m => m.name.indexOf("icon_stat_label") >= 0); for (let s = 0; s < statsContainerLabels.length; s++) { const ivStat = Stat[statsContainerLabels[s].frame.name]; - if (enemyIvs[ivStat] > currentIvs[ivStat] && ivsToShow.indexOf(Number(ivStat)) >= 0) { - const hexColour = enemyIvs[ivStat] === 31 ? getTextColor(TextStyle.PERFECT_IV, false, uiTheme) : getTextColor(TextStyle.SUMMARY_GREEN, false, uiTheme); + if (enemyIvs[ivStat] > currentIvs[ivStat] && PERMANENT_STATS.indexOf(Number(ivStat)) >= 0) { + const hexColour = + enemyIvs[ivStat] === 31 + ? getTextColor(TextStyle.PERFECT_IV, false, uiTheme) + : getTextColor(TextStyle.SUMMARY_GREEN, false, uiTheme); const hexTextColour = Phaser.Display.Color.HexStringToColor(hexColour).color; statsContainerLabels[s].setTint(hexTextColour); } @@ -48,20 +41,31 @@ export class ScanIvsPhase extends PokemonPhase { } } - if (!this.scene.hideIvs) { - this.scene.ui.showText(i18next.t("battle:ivScannerUseQuestion", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { - this.scene.ui.setMode(Mode.CONFIRM, () => { - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.clearText(); - new CommonBattleAnim(CommonAnim.LOCK_ON, pokemon, pokemon).play(this.scene, false, () => { - this.scene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs, this.shownIvs).then(() => this.end()); - }); - }, () => { - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.clearText(); - this.end(); - }); - }); + if (!globalScene.hideIvs) { + globalScene.ui.showText( + i18next.t("battle:ivScannerUseQuestion", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + null, + () => { + globalScene.ui.setMode( + Mode.CONFIRM, + () => { + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.clearText(); + globalScene.ui + .getMessageHandler() + .promptIvs(pokemon.id, pokemon.ivs) + .then(() => this.end()); + }, + () => { + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.clearText(); + this.end(); + }, + ); + }, + ); } else { this.end(); } diff --git a/src/phases/select-biome-phase.ts b/src/phases/select-biome-phase.ts index 817cd7bcd3d..6a11967832a 100644 --- a/src/phases/select-biome-phase.ts +++ b/src/phases/select-biome-phase.ts @@ -1,8 +1,8 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { biomeLinks, getBiomeName } from "#app/data/balance/biomes"; import { Biome } from "#app/enums/biome"; import { MoneyInterestModifier, MapModifier } from "#app/modifier/modifier"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { BattlePhase } from "./battle-phase"; import * as Utils from "#app/utils"; @@ -10,60 +10,64 @@ import { PartyHealPhase } from "./party-heal-phase"; import { SwitchBiomePhase } from "./switch-biome-phase"; export class SelectBiomePhase extends BattlePhase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start() { super.start(); - const currentBiome = this.scene.arena.biomeType; + const currentBiome = globalScene.arena.biomeType; const setNextBiome = (nextBiome: Biome) => { - if (this.scene.currentBattle.waveIndex % 10 === 1) { - this.scene.applyModifiers(MoneyInterestModifier, true, this.scene); - this.scene.unshiftPhase(new PartyHealPhase(this.scene, false)); + if (globalScene.currentBattle.waveIndex % 10 === 1) { + globalScene.applyModifiers(MoneyInterestModifier, true); + globalScene.unshiftPhase(new PartyHealPhase(false)); } - this.scene.unshiftPhase(new SwitchBiomePhase(this.scene, nextBiome)); + globalScene.unshiftPhase(new SwitchBiomePhase(nextBiome)); this.end(); }; - if ((this.scene.gameMode.isClassic && this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex + 9)) - || (this.scene.gameMode.isDaily && this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) - || (this.scene.gameMode.hasShortBiomes && !(this.scene.currentBattle.waveIndex % 50))) { + if ( + (globalScene.gameMode.isClassic && globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex + 9)) || + (globalScene.gameMode.isDaily && globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) || + (globalScene.gameMode.hasShortBiomes && !(globalScene.currentBattle.waveIndex % 50)) + ) { setNextBiome(Biome.END); - } else if (this.scene.gameMode.hasRandomBiomes) { + } else if (globalScene.gameMode.hasRandomBiomes) { setNextBiome(this.generateNextBiome()); } else if (Array.isArray(biomeLinks[currentBiome])) { let biomes: Biome[] = []; - this.scene.executeWithSeedOffset(() => { - biomes = (biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) + globalScene.executeWithSeedOffset(() => { + biomes = (biomeLinks[currentBiome] as (Biome | [Biome, number])[]) .filter(b => !Array.isArray(b) || !Utils.randSeedInt(b[1])) - .map(b => !Array.isArray(b) ? b : b[0]); - }, this.scene.currentBattle.waveIndex); - if (biomes.length > 1 && this.scene.findModifier(m => m instanceof MapModifier)) { + .map(b => (!Array.isArray(b) ? b : b[0])); + }, globalScene.currentBattle.waveIndex); + if (biomes.length > 1 && globalScene.findModifier(m => m instanceof MapModifier)) { let biomeChoices: Biome[] = []; - this.scene.executeWithSeedOffset(() => { - biomeChoices = (!Array.isArray(biomeLinks[currentBiome]) - ? [ biomeLinks[currentBiome] as Biome ] - : biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) - .filter((b, i) => !Array.isArray(b) || !Utils.randSeedInt(b[1])) - .map(b => Array.isArray(b) ? b[0] : b); - }, this.scene.currentBattle.waveIndex); + globalScene.executeWithSeedOffset(() => { + biomeChoices = ( + !Array.isArray(biomeLinks[currentBiome]) + ? [biomeLinks[currentBiome] as Biome] + : (biomeLinks[currentBiome] as (Biome | [Biome, number])[]) + ) + .filter((b, _i) => !Array.isArray(b) || !Utils.randSeedInt(b[1])) + .map(b => (Array.isArray(b) ? b[0] : b)); + }, globalScene.currentBattle.waveIndex); const biomeSelectItems = biomeChoices.map(b => { const ret: OptionSelectItem = { label: getBiomeName(b), handler: () => { - this.scene.ui.setMode(Mode.MESSAGE); + globalScene.ui.setMode(Mode.MESSAGE); setNextBiome(b); return true; - } + }, }; return ret; }); - this.scene.ui.setMode(Mode.OPTION_SELECT, { + globalScene.ui.setMode(Mode.OPTION_SELECT, { options: biomeSelectItems, - delay: 1000 + delay: 1000, }); } else { setNextBiome(biomes[Utils.randSeedInt(biomes.length)]); @@ -76,9 +80,9 @@ export class SelectBiomePhase extends BattlePhase { } generateNextBiome(): Biome { - if (!(this.scene.currentBattle.waveIndex % 50)) { + if (!(globalScene.currentBattle.waveIndex % 50)) { return Biome.END; } - return this.scene.generateRandomBiome(this.scene.currentBattle.waveIndex); + return globalScene.generateRandomBiome(globalScene.currentBattle.waveIndex); } } diff --git a/src/phases/select-challenge-phase.ts b/src/phases/select-challenge-phase.ts index 9450c60fec5..2a6797d3556 100644 --- a/src/phases/select-challenge-phase.ts +++ b/src/phases/select-challenge-phase.ts @@ -1,17 +1,17 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; import { Mode } from "#app/ui/ui"; export class SelectChallengePhase extends Phase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start() { super.start(); - this.scene.playBgm("menu"); + globalScene.playBgm("menu"); - this.scene.ui.setMode(Mode.CHALLENGE_SELECT); + globalScene.ui.setMode(Mode.CHALLENGE_SELECT); } } diff --git a/src/phases/select-gender-phase.ts b/src/phases/select-gender-phase.ts index 7f2c965f1d1..1c86536de53 100644 --- a/src/phases/select-gender-phase.ts +++ b/src/phases/select-gender-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { PlayerGender } from "#app/enums/player-gender"; import { Phase } from "#app/phase"; import { SettingKeys } from "#app/system/settings/settings"; @@ -6,41 +6,41 @@ import { Mode } from "#app/ui/ui"; import i18next from "i18next"; export class SelectGenderPhase extends Phase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start(): void { super.start(); - this.scene.ui.showText(i18next.t("menu:boyOrGirl"), null, () => { - this.scene.ui.setMode(Mode.OPTION_SELECT, { + globalScene.ui.showText(i18next.t("menu:boyOrGirl"), null, () => { + globalScene.ui.setMode(Mode.OPTION_SELECT, { options: [ { label: i18next.t("settings:boy"), handler: () => { - this.scene.gameData.gender = PlayerGender.MALE; - this.scene.gameData.saveSetting(SettingKeys.Player_Gender, 0); - this.scene.gameData.saveSystem().then(() => this.end()); + globalScene.gameData.gender = PlayerGender.MALE; + globalScene.gameData.saveSetting(SettingKeys.Player_Gender, 0); + globalScene.gameData.saveSystem().then(() => this.end()); return true; - } + }, }, { label: i18next.t("settings:girl"), handler: () => { - this.scene.gameData.gender = PlayerGender.FEMALE; - this.scene.gameData.saveSetting(SettingKeys.Player_Gender, 1); - this.scene.gameData.saveSystem().then(() => this.end()); + globalScene.gameData.gender = PlayerGender.FEMALE; + globalScene.gameData.saveSetting(SettingKeys.Player_Gender, 1); + globalScene.gameData.saveSystem().then(() => this.end()); return true; - } - } - ] + }, + }, + ], }); }); } end(): void { - this.scene.ui.setMode(Mode.MESSAGE); + globalScene.ui.setMode(Mode.MESSAGE); super.end(); } } diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index e5a60692bb4..11d448876d3 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -1,27 +1,52 @@ -import BattleScene from "#app/battle-scene"; -import { ModifierTier } from "#app/modifier/modifier-tier"; -import { regenerateModifierPoolThresholds, ModifierTypeOption, ModifierType, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, ModifierPoolType, getPlayerModifierTypeOptions } from "#app/modifier/modifier-type"; -import { ExtraModifierModifier, HealShopCostModifier, Modifier, PokemonHeldItemModifier, TempExtraModifierModifier } from "#app/modifier/modifier"; -import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; +import { globalScene } from "#app/global-scene"; +import type { ModifierTier } from "#app/modifier/modifier-tier"; +import type { ModifierTypeOption, ModifierType } from "#app/modifier/modifier-type"; +import { + regenerateModifierPoolThresholds, + getPlayerShopModifierTypeOptionsForWave, + PokemonModifierType, + FusePokemonModifierType, + PokemonMoveModifierType, + TmModifierType, + RememberMoveModifierType, + PokemonPpRestoreModifierType, + PokemonPpUpModifierType, + ModifierPoolType, + getPlayerModifierTypeOptions, +} from "#app/modifier/modifier-type"; +import type { Modifier } from "#app/modifier/modifier"; +import { + ExtraModifierModifier, + HealShopCostModifier, + PokemonHeldItemModifier, + TempExtraModifierModifier, +} from "#app/modifier/modifier"; +import type ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import * as Utils from "#app/utils"; import { BattlePhase } from "./battle-phase"; import Overrides from "#app/overrides"; -import { CustomModifierSettings } from "#app/modifier/modifier-type"; +import type { CustomModifierSettings } from "#app/modifier/modifier-type"; import { isNullOrUndefined, NumberHolder } from "#app/utils"; export class SelectModifierPhase extends BattlePhase { - private rerollCount: integer; + private rerollCount: number; private modifierTiers?: ModifierTier[]; private customModifierSettings?: CustomModifierSettings; private isCopy: boolean; private typeOptions: ModifierTypeOption[]; - constructor(scene: BattleScene, rerollCount: integer = 0, modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings, isCopy: boolean = false) { - super(scene); + constructor( + rerollCount = 0, + modifierTiers?: ModifierTier[], + customModifierSettings?: CustomModifierSettings, + isCopy = false, + ) { + super(); this.rerollCount = rerollCount; this.modifierTiers = modifierTiers; @@ -35,22 +60,23 @@ export class SelectModifierPhase extends BattlePhase { if (!this.rerollCount && !this.isCopy) { this.updateSeed(); } else if (this.rerollCount) { - this.scene.reroll = false; + globalScene.reroll = false; } - const party = this.scene.getParty(); + const party = globalScene.getPlayerParty(); if (!this.isCopy) { regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); } - const modifierCount = new Utils.IntegerHolder(3); + const modifierCount = new Utils.NumberHolder(3); if (this.isPlayer()) { - this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); - this.scene.applyModifiers(TempExtraModifierModifier, true, modifierCount); + globalScene.applyModifiers(ExtraModifierModifier, true, modifierCount); + globalScene.applyModifiers(TempExtraModifierModifier, true, modifierCount); } // If custom modifiers are specified, overrides default item count - if (!!this.customModifierSettings) { - const newItemCount = (this.customModifierSettings.guaranteedModifierTiers?.length || 0) + + if (this.customModifierSettings) { + const newItemCount = + (this.customModifierSettings.guaranteedModifierTiers?.length || 0) + (this.customModifierSettings.guaranteedModifierTypeOptions?.length || 0) + (this.customModifierSettings.guaranteedModifierTypeFuncs?.length || 0); if (this.customModifierSettings.fillRemaining) { @@ -63,66 +89,117 @@ export class SelectModifierPhase extends BattlePhase { this.typeOptions = this.getModifierTypeOptions(modifierCount.value); - const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { + const modifierSelectCallback = (rowCursor: number, cursor: number) => { if (rowCursor < 0 || cursor < 0) { - this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { - this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { - this.scene.ui.revertMode(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - }, () => this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers))); + globalScene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { + globalScene.ui.setOverlayMode( + Mode.CONFIRM, + () => { + globalScene.ui.revertMode(); + globalScene.ui.setMode(Mode.MESSAGE); + super.end(); + }, + () => + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ), + ); }); return false; } let modifierType: ModifierType; - let cost: integer; - const rerollCost = this.getRerollCost(this.scene.lockModifierTiers); + let cost: number; + const rerollCost = this.getRerollCost(globalScene.lockModifierTiers); switch (rowCursor) { case 0: switch (cursor) { case 0: - if (rerollCost < 0 || this.scene.money < rerollCost) { - this.scene.ui.playError(); + if (rerollCost < 0 || globalScene.money < rerollCost) { + globalScene.ui.playError(); return false; - } else { - this.scene.reroll = true; - this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, this.typeOptions.map(o => o.type?.tier).filter(t => t !== undefined) as ModifierTier[])); - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { - this.scene.money -= rerollCost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); - } - this.scene.playSound("se/buy"); } + globalScene.reroll = true; + globalScene.unshiftPhase( + new SelectModifierPhase( + this.rerollCount + 1, + this.typeOptions.map(o => o.type?.tier).filter(t => t !== undefined) as ModifierTier[], + ), + ); + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + globalScene.money -= rerollCost; + globalScene.updateMoneyText(); + globalScene.animateMoneyChanged(false); + } + globalScene.playSound("se/buy"); break; case 1: - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => { - if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { - const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.isTransferable && m.pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; - const itemModifier = itemModifiers[itemIndex]; - this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers)); - } - }, PartyUiHandler.FilterItemMaxStacks); + globalScene.ui.setModeWithoutClear( + Mode.PARTY, + PartyUiMode.MODIFIER_TRANSFER, + -1, + (fromSlotIndex: number, itemIndex: number, itemQuantity: number, toSlotIndex: number) => { + if ( + toSlotIndex !== undefined && + fromSlotIndex < 6 && + toSlotIndex < 6 && + fromSlotIndex !== toSlotIndex && + itemIndex > -1 + ) { + const itemModifiers = globalScene.findModifiers( + m => + m instanceof PokemonHeldItemModifier && + m.isTransferable && + m.pokemonId === party[fromSlotIndex].id, + ) as PokemonHeldItemModifier[]; + const itemModifier = itemModifiers[itemIndex]; + globalScene.tryTransferHeldItemModifier( + itemModifier, + party[toSlotIndex], + true, + itemQuantity, + undefined, + undefined, + false, + ); + } else { + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); + } + }, + PartyUiHandler.FilterItemMaxStacks, + ); break; case 2: - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers)); + globalScene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); }); break; case 3: if (rerollCost < 0) { // Reroll lock button is also disabled when reroll is disabled - this.scene.ui.playError(); + globalScene.ui.playError(); return false; } - this.scene.lockModifierTiers = !this.scene.lockModifierTiers; - const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - uiHandler.setRerollCost(this.getRerollCost(this.scene.lockModifierTiers)); + globalScene.lockModifierTiers = !globalScene.lockModifierTiers; + const uiHandler = globalScene.ui.getHandler() as ModifierSelectUiHandler; + uiHandler.setRerollCost(this.getRerollCost(globalScene.lockModifierTiers)); uiHandler.updateLockRaritiesText(); uiHandler.updateRerollCostText(); return false; @@ -130,8 +207,8 @@ export class SelectModifierPhase extends BattlePhase { return true; case 1: if (this.typeOptions.length === 0) { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE); + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.MESSAGE); super.end(); return true; } @@ -140,112 +217,152 @@ export class SelectModifierPhase extends BattlePhase { } break; default: - const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); - const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; + const shopOptions = getPlayerShopModifierTypeOptionsForWave( + globalScene.currentBattle.waveIndex, + globalScene.getWaveMoneyAmount(1), + ); + const shopOption = + shopOptions[ + rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT + ]; if (shopOption.type) { modifierType = shopOption.type; } // Apply Black Sludge to healing item cost const healingItemCost = new NumberHolder(shopOption.cost); - this.scene.applyModifier(HealShopCostModifier, true, healingItemCost); + globalScene.applyModifier(HealShopCostModifier, true, healingItemCost); cost = healingItemCost.value; break; } - if (cost! && (this.scene.money < cost) && !Overrides.WAIVE_ROLL_FEE_OVERRIDE) { // TODO: is the bang on cost correct? - this.scene.ui.playError(); + if (cost! && globalScene.money < cost && !Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + // TODO: is the bang on cost correct? + globalScene.ui.playError(); return false; } - const applyModifier = (modifier: Modifier, playSound: boolean = false) => { - const result = this.scene.addModifier(modifier, false, playSound, undefined, undefined, cost); + const applyModifier = (modifier: Modifier, playSound = false) => { + const result = globalScene.addModifier(modifier, false, playSound, undefined, undefined, cost); // Queue a copy of this phase when applying a TM or Memory Mushroom. // If the player selects either of these, then escapes out of consuming them, // they are returned to a shop in the same state. - if (modifier.type instanceof RememberMoveModifierType || - modifier.type instanceof TmModifierType) { - this.scene.unshiftPhase(this.copy()); + if (modifier.type instanceof RememberMoveModifierType || modifier.type instanceof TmModifierType) { + globalScene.unshiftPhase(this.copy()); } if (cost && !(modifier.type instanceof RememberMoveModifierType)) { - result.then(success => { - if (success) { - if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { - this.scene.money -= cost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); - } - this.scene.playSound("se/buy"); - (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); - } else { - this.scene.ui.playError(); + if (result) { + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + globalScene.money -= cost; + globalScene.updateMoneyText(); + globalScene.animateMoneyChanged(false); } - }); - } else { - const doEnd = () => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - }; - if (result instanceof Promise) { - result.then(() => doEnd()); + globalScene.playSound("se/buy"); + (globalScene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); } else { - doEnd(); + globalScene.ui.playError(); } + } else { + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.MESSAGE); + super.end(); } }; - if (modifierType! instanceof PokemonModifierType) { //TODO: is the bang correct? + if (modifierType! instanceof PokemonModifierType) { + //TODO: is the bang correct? if (modifierType instanceof FusePokemonModifierType) { - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: integer, spliceSlotIndex: integer) => { - if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex])!; //TODO: is the bang correct? - applyModifier(modifier, true); - }); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers)); - } - }, modifierType.selectFilter); + globalScene.ui.setModeWithoutClear( + Mode.PARTY, + PartyUiMode.SPLICE, + -1, + (fromSlotIndex: number, spliceSlotIndex: number) => { + if ( + spliceSlotIndex !== undefined && + fromSlotIndex < 6 && + spliceSlotIndex < 6 && + fromSlotIndex !== spliceSlotIndex + ) { + globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex])!; //TODO: is the bang correct? + applyModifier(modifier, true); + }); + } else { + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); + } + }, + modifierType.selectFilter, + ); } else { const pokemonModifierType = modifierType as PokemonModifierType; const isMoveModifier = modifierType instanceof PokemonMoveModifierType; const isTmModifier = modifierType instanceof TmModifierType; const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; - const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType); - const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER - : isTmModifier ? PartyUiMode.TM_MODIFIER - : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER + const isPpRestoreModifier = + modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType; + const partyUiMode = isMoveModifier + ? PartyUiMode.MOVE_MODIFIER + : isTmModifier + ? PartyUiMode.TM_MODIFIER + : isRememberMoveModifier + ? PartyUiMode.REMEMBER_MOVE_MODIFIER : PartyUiMode.MODIFIER; - const tmMoveId = isTmModifier - ? (modifierType as TmModifierType).moveId - : undefined; - this.scene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: integer, option: PartyOption) => { - if (slotIndex < 6) { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = !isMoveModifier - ? !isRememberMoveModifier - ? modifierType.newModifier(party[slotIndex]) - : modifierType.newModifier(party[slotIndex], option as integer) - : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); - applyModifier(modifier!, true); // TODO: is the bang correct? - }); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers)); - } - }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier); + const tmMoveId = isTmModifier ? (modifierType as TmModifierType).moveId : undefined; + globalScene.ui.setModeWithoutClear( + Mode.PARTY, + partyUiMode, + -1, + (slotIndex: number, option: PartyOption) => { + if (slotIndex < 6) { + globalScene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = !isMoveModifier + ? !isRememberMoveModifier + ? modifierType.newModifier(party[slotIndex]) + : modifierType.newModifier(party[slotIndex], option as number) + : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); + applyModifier(modifier!, true); // TODO: is the bang correct? + }); + } else { + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); + } + }, + pokemonModifierType.selectFilter, + modifierType instanceof PokemonMoveModifierType + ? (modifierType as PokemonMoveModifierType).moveSelectFilter + : undefined, + tmMoveId, + isPpRestoreModifier, + ); } } else { applyModifier(modifierType!.newModifier()!); // TODO: is the bang correct? } - return !cost!;// TODO: is the bang correct? + return !cost!; // TODO: is the bang correct? }; - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers)); + globalScene.ui.setMode( + Mode.MODIFIER_SELECT, + this.isPlayer(), + this.typeOptions, + modifierSelectCallback, + this.getRerollCost(globalScene.lockModifierTiers), + ); } updateSeed(): void { - this.scene.resetSeed(); + globalScene.resetSeed(); } isPlayer(): boolean { @@ -256,8 +373,9 @@ export class SelectModifierPhase extends BattlePhase { let baseValue = 0; if (Overrides.WAIVE_ROLL_FEE_OVERRIDE) { return baseValue; - } else if (lockRarities) { - const tierValues = [ 50, 125, 300, 750, 2000 ]; + } + if (lockRarities) { + const tierValues = [50, 125, 300, 750, 2000]; for (const opt of this.typeOptions) { baseValue += tierValues[opt.type.tier ?? 0]; } @@ -276,11 +394,14 @@ export class SelectModifierPhase extends BattlePhase { multiplier = this.customModifierSettings.rerollMultiplier; } - const baseMultiplier = Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * (2 ** this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER); + const baseMultiplier = Math.min( + Math.ceil(globalScene.currentBattle.waveIndex / 10) * baseValue * 2 ** this.rerollCount * multiplier, + Number.MAX_SAFE_INTEGER, + ); // Apply Black Sludge to reroll cost const modifiedRerollCost = new NumberHolder(baseMultiplier); - this.scene.applyModifier(HealShopCostModifier, true, modifiedRerollCost); + globalScene.applyModifier(HealShopCostModifier, true, modifiedRerollCost); return modifiedRerollCost.value; } @@ -288,21 +409,29 @@ export class SelectModifierPhase extends BattlePhase { return ModifierPoolType.PLAYER; } - getModifierTypeOptions(modifierCount: integer): ModifierTypeOption[] { - return getPlayerModifierTypeOptions(modifierCount, this.scene.getParty(), this.scene.lockModifierTiers ? this.modifierTiers : undefined, this.customModifierSettings); + getModifierTypeOptions(modifierCount: number): ModifierTypeOption[] { + return getPlayerModifierTypeOptions( + modifierCount, + globalScene.getPlayerParty(), + globalScene.lockModifierTiers ? this.modifierTiers : undefined, + this.customModifierSettings, + ); } copy(): SelectModifierPhase { return new SelectModifierPhase( - this.scene, this.rerollCount, this.modifierTiers, - { guaranteedModifierTypeOptions: this.typeOptions, rerollMultiplier: this.customModifierSettings?.rerollMultiplier, allowLuckUpgrades: false }, - true + { + guaranteedModifierTypeOptions: this.typeOptions, + rerollMultiplier: this.customModifierSettings?.rerollMultiplier, + allowLuckUpgrades: false, + }, + true, ); } - addModifier(modifier: Modifier): Promise { - return this.scene.addModifier(modifier, false, true); + addModifier(modifier: Modifier): boolean { + return globalScene.addModifier(modifier, false, true); } } diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts index 1692b5f2234..0f4360b0af6 100644 --- a/src/phases/select-starter-phase.ts +++ b/src/phases/select-starter-phase.ts @@ -1,39 +1,38 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { applyChallenges, ChallengeType } from "#app/data/challenge"; import { Gender } from "#app/data/gender"; import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { Species } from "#app/enums/species"; -import { PlayerPokemon } from "#app/field/pokemon"; -import { overrideModifiers, overrideHeldItems } from "#app/modifier/modifier"; -import { Phase } from "#app/phase"; -import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler"; -import { Starter } from "#app/ui/starter-select-ui-handler"; -import { Mode } from "#app/ui/ui"; -import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { TitlePhase } from "./title-phase"; +import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier"; import Overrides from "#app/overrides"; +import { Phase } from "#app/phase"; +import { TitlePhase } from "#app/phases/title-phase"; +import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler"; +import type { Starter } from "#app/ui/starter-select-ui-handler"; +import { Mode } from "#app/ui/ui"; +import type { Species } from "#enums/species"; +import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +import * as Utils from "../utils"; export class SelectStarterPhase extends Phase { - - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start() { super.start(); - this.scene.playBgm("menu"); + globalScene.playBgm("menu"); - this.scene.ui.setMode(Mode.STARTER_SELECT, (starters: Starter[]) => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: integer) => { + globalScene.ui.setMode(Mode.STARTER_SELECT, (starters: Starter[]) => { + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: number) => { if (slotId === -1) { - this.scene.clearPhaseQueue(); - this.scene.pushPhase(new TitlePhase(this.scene)); + globalScene.clearPhaseQueue(); + globalScene.pushPhase(new TitlePhase()); return this.end(); } - this.scene.sessionSlotId = slotId; + globalScene.sessionSlotId = slotId; this.initBattle(starters); }); }); @@ -44,34 +43,46 @@ export class SelectStarterPhase extends Phase { * @param starters {@linkcode Pokemon} with which to start the first battle */ initBattle(starters: Starter[]) { - const party = this.scene.getParty(); + const party = globalScene.getPlayerParty(); const loadPokemonAssets: Promise[] = []; - starters.forEach((starter: Starter, i: integer) => { + starters.forEach((starter: Starter, i: number) => { if (!i && Overrides.STARTER_SPECIES_OVERRIDE) { starter.species = getPokemonSpecies(Overrides.STARTER_SPECIES_OVERRIDE as Species); } - const starterProps = this.scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); + const starterProps = globalScene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); let starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); if ( starter.species.speciesId in Overrides.STARTER_FORM_OVERRIDES && + !Utils.isNullOrUndefined(Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]) && starter.species.forms[Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]!] ) { starterFormIndex = Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]!; } - let starterGender = starter.species.malePercent !== null - ? !starterProps.female ? Gender.MALE : Gender.FEMALE - : Gender.GENDERLESS; + let starterGender = + starter.species.malePercent !== null ? (!starterProps.female ? Gender.MALE : Gender.FEMALE) : Gender.GENDERLESS; if (Overrides.GENDER_OVERRIDE !== null) { starterGender = Overrides.GENDER_OVERRIDE; } - const starterIvs = this.scene.gameData.dexData[starter.species.speciesId].ivs.slice(0); - const starterPokemon = this.scene.addPlayerPokemon(starter.species, this.scene.gameMode.getStartingLevel(), starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, starterIvs, starter.nature); + const starterIvs = globalScene.gameData.dexData[starter.species.speciesId].ivs.slice(0); + const starterPokemon = globalScene.addPlayerPokemon( + starter.species, + globalScene.gameMode.getStartingLevel(), + starter.abilityIndex, + starterFormIndex, + starterGender, + starterProps.shiny, + starterProps.variant, + starterIvs, + starter.nature, + ); starter.moveset && starterPokemon.tryPopulateMoveset(starter.moveset); if (starter.passive) { starterPokemon.passive = true; } - starterPokemon.luck = this.scene.gameData.getDexAttrLuck(this.scene.gameData.dexData[starter.species.speciesId].caughtAttr); + starterPokemon.luck = globalScene.gameData.getDexAttrLuck( + globalScene.gameData.dexData[starter.species.speciesId].caughtAttr, + ); if (starter.pokerus) { starterPokemon.pokerus = true; } @@ -80,31 +91,37 @@ export class SelectStarterPhase extends Phase { starterPokemon.nickname = starter.nickname; } - if (this.scene.gameMode.isSplicedOnly || Overrides.STARTER_FUSION_OVERRIDE) { + if (!Utils.isNullOrUndefined(starter.teraType)) { + starterPokemon.teraType = starter.teraType; + } else { + starterPokemon.teraType = starterPokemon.species.type1; + } + + if (globalScene.gameMode.isSplicedOnly || Overrides.STARTER_FUSION_OVERRIDE) { starterPokemon.generateFusionSpecies(true); } starterPokemon.setVisible(false); - applyChallenges(this.scene.gameMode, ChallengeType.STARTER_MODIFY, starterPokemon); + applyChallenges(globalScene.gameMode, ChallengeType.STARTER_MODIFY, starterPokemon); party.push(starterPokemon); loadPokemonAssets.push(starterPokemon.loadAssets()); }); - overrideModifiers(this.scene); - overrideHeldItems(this.scene, party[0]); + overrideModifiers(); + overrideHeldItems(party[0]); Promise.all(loadPokemonAssets).then(() => { - SoundFade.fadeOut(this.scene, this.scene.sound.get("menu"), 500, true); - this.scene.time.delayedCall(500, () => this.scene.playBgm()); - if (this.scene.gameMode.isClassic) { - this.scene.gameData.gameStats.classicSessionsPlayed++; + SoundFade.fadeOut(globalScene, globalScene.sound.get("menu"), 500, true); + globalScene.time.delayedCall(500, () => globalScene.playBgm()); + if (globalScene.gameMode.isClassic) { + globalScene.gameData.gameStats.classicSessionsPlayed++; } else { - this.scene.gameData.gameStats.endlessSessionsPlayed++; + globalScene.gameData.gameStats.endlessSessionsPlayed++; } - this.scene.newBattle(); - this.scene.arena.init(); - this.scene.sessionPlayTime = 0; - this.scene.lastSavePlayTime = 0; + globalScene.newBattle(); + globalScene.arena.init(); + globalScene.sessionPlayTime = 0; + globalScene.lastSavePlayTime = 0; // Ensures Keldeo (or any future Pokemon that have this type of form change) starts in the correct form - this.scene.getParty().forEach((p: PlayerPokemon) => { - this.scene.triggerPokemonFormChange(p, SpeciesFormChangeMoveLearnedTrigger); + globalScene.getPlayerParty().forEach(p => { + globalScene.triggerPokemonFormChange(p, SpeciesFormChangeMoveLearnedTrigger); }); this.end(); }); diff --git a/src/phases/select-target-phase.ts b/src/phases/select-target-phase.ts index 6f11f984c4b..2042d0a3fcf 100644 --- a/src/phases/select-target-phase.ts +++ b/src/phases/select-target-phase.ts @@ -1,40 +1,42 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { CommandPhase } from "./command-phase"; import { PokemonPhase } from "./pokemon-phase"; import i18next from "#app/plugins/i18n"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; export class SelectTargetPhase extends PokemonPhase { - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene, fieldIndex); + constructor(fieldIndex: number) { + super(fieldIndex); } start() { super.start(); - const turnCommand = this.scene.currentBattle.turnCommands[this.fieldIndex]; + const turnCommand = globalScene.currentBattle.turnCommands[this.fieldIndex]; const move = turnCommand?.move?.move; - this.scene.ui.setMode(Mode.TARGET_SELECT, this.fieldIndex, move, (targets: BattlerIndex[]) => { - this.scene.ui.setMode(Mode.MESSAGE); - const fieldSide = this.scene.getField(); + globalScene.ui.setMode(Mode.TARGET_SELECT, this.fieldIndex, move, (targets: BattlerIndex[]) => { + globalScene.ui.setMode(Mode.MESSAGE); + const fieldSide = globalScene.getField(); const user = fieldSide[this.fieldIndex]; const moveObject = allMoves[move!]; if (moveObject && user.isMoveTargetRestricted(moveObject.id, user, fieldSide[targets[0]])) { - const errorMessage = user.getRestrictingTag(move!, user, fieldSide[targets[0]])!.selectionDeniedText(user, moveObject.id); - user.scene.queueMessage(i18next.t(errorMessage, { moveName: moveObject.name }), 0, true); + const errorMessage = user + .getRestrictingTag(move!, user, fieldSide[targets[0]])! + .selectionDeniedText(user, moveObject.id); + globalScene.queueMessage(i18next.t(errorMessage, { moveName: moveObject.name }), 0, true); targets = []; } if (targets.length < 1) { - this.scene.currentBattle.turnCommands[this.fieldIndex] = null; - this.scene.unshiftPhase(new CommandPhase(this.scene, this.fieldIndex)); + globalScene.currentBattle.turnCommands[this.fieldIndex] = null; + globalScene.unshiftPhase(new CommandPhase(this.fieldIndex)); } else { - turnCommand!.targets = targets; //TODO: is the bang correct here? + turnCommand!.targets = targets; //TODO: is the bang correct here? } if (turnCommand?.command === Command.BALL && this.fieldIndex) { - this.scene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; //TODO: is the bang correct here? + globalScene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; //TODO: is the bang correct here? } this.end(); }); diff --git a/src/phases/shiny-sparkle-phase.ts b/src/phases/shiny-sparkle-phase.ts index 49c60a82dd5..2540d98fb79 100644 --- a/src/phases/shiny-sparkle-phase.ts +++ b/src/phases/shiny-sparkle-phase.ts @@ -1,16 +1,16 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; import { PokemonPhase } from "./pokemon-phase"; export class ShinySparklePhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { - super(scene, battlerIndex); + constructor(battlerIndex: BattlerIndex) { + super(battlerIndex); } start() { super.start(); this.getPokemon().sparkle(); - this.scene.time.delayedCall(1000, () => this.end()); + globalScene.time.delayedCall(1000, () => this.end()); } } diff --git a/src/phases/show-ability-phase.ts b/src/phases/show-ability-phase.ts index cf34e327b4f..1b3c6dde568 100644 --- a/src/phases/show-ability-phase.ts +++ b/src/phases/show-ability-phase.ts @@ -1,29 +1,60 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; import { PokemonPhase } from "./pokemon-phase"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { HideAbilityPhase } from "#app/phases/hide-ability-phase"; export class ShowAbilityPhase extends PokemonPhase { private passive: boolean; + private pokemonName: string; + private abilityName: string; + private pokemonOnField: boolean; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, passive: boolean = false) { - super(scene, battlerIndex); + constructor(battlerIndex: BattlerIndex, passive = false) { + super(battlerIndex); this.passive = passive; + + const pokemon = this.getPokemon(); + if (pokemon) { + // Set these now as the pokemon object may change before the queued phase is run + this.pokemonName = getPokemonNameWithAffix(pokemon); + this.abilityName = (passive ? this.getPokemon().getPassiveAbility() : this.getPokemon().getAbility()).name; + this.pokemonOnField = true; + } else { + this.pokemonOnField = false; + } } start() { super.start(); + if (!this.pokemonOnField || !this.getPokemon()) { + return this.end(); + } + + // If the bar is already out, hide it before showing the new one + if (globalScene.abilityBar.isVisible()) { + globalScene.unshiftPhase(new HideAbilityPhase(this.battlerIndex, this.passive)); + globalScene.unshiftPhase(new ShowAbilityPhase(this.battlerIndex, this.passive)); + return this.end(); + } + const pokemon = this.getPokemon(); - if (pokemon) { - this.scene.abilityBar.showAbility(pokemon, this.passive); + if (!pokemon.isPlayer()) { + /** If its an enemy pokemon, list it as last enemy to use ability or move */ + globalScene.currentBattle.lastEnemyInvolved = pokemon.getBattlerIndex() % 2; + } else { + globalScene.currentBattle.lastPlayerInvolved = pokemon.getBattlerIndex() % 2; + } + globalScene.abilityBar.showAbility(this.pokemonName, this.abilityName, this.passive, this.player).then(() => { if (pokemon?.battleData) { pokemon.battleData.abilityRevealed = true; } - } - this.end(); + this.end(); + }); } } diff --git a/src/phases/show-party-exp-bar-phase.ts b/src/phases/show-party-exp-bar-phase.ts index f1783e7715f..568b8b615c8 100644 --- a/src/phases/show-party-exp-bar-phase.ts +++ b/src/phases/show-party-exp-bar-phase.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { ExpGainsSpeed } from "#app/enums/exp-gains-speed"; import { ExpNotification } from "#app/enums/exp-notification"; import { ExpBoosterModifier } from "#app/modifier/modifier"; @@ -10,8 +10,8 @@ import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-pha export class ShowPartyExpBarPhase extends PlayerPartyMemberPokemonPhase { private expValue: number; - constructor(scene: BattleScene, partyMemberIndex: integer, expValue: number) { - super(scene, partyMemberIndex); + constructor(partyMemberIndex: number, expValue: number) { + super(partyMemberIndex); this.expValue = expValue; } @@ -21,37 +21,39 @@ export class ShowPartyExpBarPhase extends PlayerPartyMemberPokemonPhase { const pokemon = this.getPokemon(); const exp = new Utils.NumberHolder(this.expValue); - this.scene.applyModifiers(ExpBoosterModifier, true, exp); + globalScene.applyModifiers(ExpBoosterModifier, true, exp); exp.value = Math.floor(exp.value); const lastLevel = pokemon.level; pokemon.addExp(exp.value); const newLevel = pokemon.level; if (newLevel > lastLevel) { - this.scene.unshiftPhase(new LevelUpPhase(this.scene, this.partyMemberIndex, lastLevel, newLevel)); + globalScene.unshiftPhase(new LevelUpPhase(this.partyMemberIndex, lastLevel, newLevel)); } - this.scene.unshiftPhase(new HidePartyExpBarPhase(this.scene)); + globalScene.unshiftPhase(new HidePartyExpBarPhase()); pokemon.updateInfo(); - if (this.scene.expParty === ExpNotification.SKIP) { + if (globalScene.expParty === ExpNotification.SKIP) { this.end(); - } else if (this.scene.expParty === ExpNotification.ONLY_LEVEL_UP) { - if (newLevel > lastLevel) { // this means if we level up + } else if (globalScene.expParty === ExpNotification.ONLY_LEVEL_UP) { + if (newLevel > lastLevel) { + // this means if we level up // instead of displaying the exp gain in the small frame, we display the new level // we use the same method for mode 0 & 1, by giving a parameter saying to display the exp or the level - this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, this.scene.expParty === ExpNotification.ONLY_LEVEL_UP, newLevel).then(() => { - setTimeout(() => this.end(), 800 / Math.pow(2, this.scene.expGainsSpeed)); - }); + globalScene.partyExpBar + .showPokemonExp(pokemon, exp.value, globalScene.expParty === ExpNotification.ONLY_LEVEL_UP, newLevel) + .then(() => { + setTimeout(() => this.end(), 800 / Math.pow(2, globalScene.expGainsSpeed)); + }); } else { this.end(); } - } else if (this.scene.expGainsSpeed < ExpGainsSpeed.SKIP) { - this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, false, newLevel).then(() => { - setTimeout(() => this.end(), 500 / Math.pow(2, this.scene.expGainsSpeed)); + } else if (globalScene.expGainsSpeed < ExpGainsSpeed.SKIP) { + globalScene.partyExpBar.showPokemonExp(pokemon, exp.value, false, newLevel).then(() => { + setTimeout(() => this.end(), 500 / Math.pow(2, globalScene.expGainsSpeed)); }); } else { this.end(); } - } } diff --git a/src/phases/show-trainer-phase.ts b/src/phases/show-trainer-phase.ts index 26ccddd53fc..740c11f5c5d 100644 --- a/src/phases/show-trainer-phase.ts +++ b/src/phases/show-trainer-phase.ts @@ -1,24 +1,24 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { PlayerGender } from "#app/enums/player-gender"; import { BattlePhase } from "./battle-phase"; export class ShowTrainerPhase extends BattlePhase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start() { super.start(); - this.scene.trainer.setVisible(true); + globalScene.trainer.setVisible(true); - this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + globalScene.trainer.setTexture(`trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); - this.scene.tweens.add({ - targets: this.scene.trainer, + globalScene.tweens.add({ + targets: globalScene.trainer, x: 106, duration: 1000, - onComplete: () => this.end() + onComplete: () => this.end(), }); } } diff --git a/src/phases/stat-stage-change-phase.ts b/src/phases/stat-stage-change-phase.ts index 2d4b3ce6c6f..71b50fa9dce 100644 --- a/src/phases/stat-stage-change-phase.ts +++ b/src/phases/stat-stage-change-phase.ts @@ -1,8 +1,18 @@ -import { BattlerIndex } from "#app/battle"; -import BattleScene from "#app/battle-scene"; -import { applyAbAttrs, applyPostStatStageChangeAbAttrs, applyPreStatStageChangeAbAttrs, PostStatStageChangeAbAttr, ProtectStatAbAttr, StatStageChangeCopyAbAttr, StatStageChangeMultiplierAbAttr } from "#app/data/ability"; +import { globalScene } from "#app/global-scene"; +import type { BattlerIndex } from "#app/battle"; +import { + applyAbAttrs, + applyPostStatStageChangeAbAttrs, + applyPreStatStageChangeAbAttrs, + PostStatStageChangeAbAttr, + ProtectStatAbAttr, + ReflectStatStageChangeAbAttr, + StatStageChangeCopyAbAttr, + StatStageChangeMultiplierAbAttr, +} from "#app/data/ability"; import { ArenaTagSide, MistTag } from "#app/data/arena-tag"; -import Pokemon from "#app/field/pokemon"; +import type { ArenaTag } from "#app/data/arena-tag"; +import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { ResetNegativeStatStageModifier } from "#app/modifier/modifier"; import { handleTutorial, Tutorial } from "#app/tutorial"; @@ -10,21 +20,39 @@ import { NumberHolder, BooleanHolder } from "#app/utils"; import i18next from "i18next"; import { PokemonPhase } from "./pokemon-phase"; import { Stat, type BattleStat, getStatKey, getStatStageChangeDescriptionKey } from "#enums/stat"; +import { OctolockTag } from "#app/data/battler-tags"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; -export type StatStageChangeCallback = (target: Pokemon | null, changed: BattleStat[], relativeChanges: number[]) => void; +export type StatStageChangeCallback = ( + target: Pokemon | null, + changed: BattleStat[], + relativeChanges: number[], +) => void; export class StatStageChangePhase extends PokemonPhase { private stats: BattleStat[]; private selfTarget: boolean; - private stages: integer; + private stages: number; private showMessage: boolean; private ignoreAbilities: boolean; private canBeCopied: boolean; private onChange: StatStageChangeCallback | null; + private comingFromMirrorArmorUser: boolean; + private comingFromStickyWeb: boolean; - - constructor(scene: BattleScene, battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], stages: integer, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true, onChange: StatStageChangeCallback | null = null) { - super(scene, battlerIndex); + constructor( + battlerIndex: BattlerIndex, + selfTarget: boolean, + stats: BattleStat[], + stages: number, + showMessage = true, + ignoreAbilities = false, + canBeCopied = true, + onChange: StatStageChangeCallback | null = null, + comingFromMirrorArmorUser = false, + comingFromStickyWeb = false, + ) { + super(battlerIndex); this.selfTarget = selfTarget; this.stats = stats; @@ -33,20 +61,67 @@ export class StatStageChangePhase extends PokemonPhase { this.ignoreAbilities = ignoreAbilities; this.canBeCopied = canBeCopied; this.onChange = onChange; + this.comingFromMirrorArmorUser = comingFromMirrorArmorUser; + this.comingFromStickyWeb = comingFromStickyWeb; } start() { - // Check if multiple stats are being changed at the same time, then run SSCPhase for each of them if (this.stats.length > 1) { for (let i = 0; i < this.stats.length; i++) { - const stat = [ this.stats[i] ]; - this.scene.unshiftPhase(new StatStageChangePhase(this.scene, this.battlerIndex, this.selfTarget, stat, this.stages, this.showMessage, this.ignoreAbilities, this.canBeCopied, this.onChange)); + const stat = [this.stats[i]]; + globalScene.unshiftPhase( + new StatStageChangePhase( + this.battlerIndex, + this.selfTarget, + stat, + this.stages, + this.showMessage, + this.ignoreAbilities, + this.canBeCopied, + this.onChange, + this.comingFromMirrorArmorUser, + ), + ); } return this.end(); } const pokemon = this.getPokemon(); + let opponentPokemon: Pokemon | undefined; + + /** Gets the position of last enemy or player pokemon that used ability or move, primarily for double battles involving Mirror Armor */ + if (pokemon.isPlayer()) { + /** If this SSCP is not from sticky web, then we find the opponent pokemon that last did something */ + if (!this.comingFromStickyWeb) { + opponentPokemon = globalScene.getEnemyField()[globalScene.currentBattle.lastEnemyInvolved]; + } else { + /** If this SSCP is from sticky web, then check if pokemon that last sucessfully used sticky web is on field */ + const stickyTagID = globalScene.arena.findTagsOnSide( + (t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB, + ArenaTagSide.PLAYER, + )[0].sourceId; + globalScene.getEnemyField().forEach(e => { + if (e.id === stickyTagID) { + opponentPokemon = e; + } + }); + } + } else { + if (!this.comingFromStickyWeb) { + opponentPokemon = globalScene.getPlayerField()[globalScene.currentBattle.lastPlayerInvolved]; + } else { + const stickyTagID = globalScene.arena.findTagsOnSide( + (t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB, + ArenaTagSide.ENEMY, + )[0].sourceId; + globalScene.getPlayerField().forEach(e => { + if (e.id === stickyTagID) { + opponentPokemon = e; + } + }); + } + } if (!pokemon.isActive(true)) { return this.end(); @@ -65,11 +140,34 @@ export class StatStageChangePhase extends PokemonPhase { if (!this.selfTarget && stages.value < 0) { // TODO: add a reference to the source of the stat change to fix Infiltrator interaction - this.scene.arena.applyTagsForSide(MistTag, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, false, null, false, cancelled); + globalScene.arena.applyTagsForSide( + MistTag, + pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, + false, + null, + cancelled, + ); } if (!cancelled.value && !this.selfTarget && stages.value < 0) { applyPreStatStageChangeAbAttrs(ProtectStatAbAttr, pokemon, stat, cancelled, simulate); + + /** Potential stat reflection due to Mirror Armor, does not apply to Octolock end of turn effect */ + if ( + opponentPokemon !== undefined && + !pokemon.findTag(t => t instanceof OctolockTag) && + !this.comingFromMirrorArmorUser + ) { + applyPreStatStageChangeAbAttrs( + ReflectStatStageChangeAbAttr, + pokemon, + stat, + cancelled, + simulate, + opponentPokemon, + this.stages, + ); + } } // If one stat stage decrease is cancelled, simulate the rest of the applications @@ -80,15 +178,20 @@ export class StatStageChangePhase extends PokemonPhase { return !cancelled.value; }); - const relLevels = filteredStats.map(s => (stages.value >= 1 ? Math.min(pokemon.getStatStage(s) + stages.value, 6) : Math.max(pokemon.getStatStage(s) + stages.value, -6)) - pokemon.getStatStage(s)); + const relLevels = filteredStats.map( + s => + (stages.value >= 1 + ? Math.min(pokemon.getStatStage(s) + stages.value, 6) + : Math.max(pokemon.getStatStage(s) + stages.value, -6)) - pokemon.getStatStage(s), + ); - this.onChange && this.onChange(this.getPokemon(), filteredStats, relLevels); + this.onChange?.(this.getPokemon(), filteredStats, relLevels); const end = () => { if (this.showMessage) { const messages = this.getStatStageChangeMessages(filteredStats, stages.value, relLevels); for (const message of messages) { - this.scene.queueMessage(message); + globalScene.queueMessage(message); } } @@ -119,68 +222,72 @@ export class StatStageChangePhase extends PokemonPhase { applyPostStatStageChangeAbAttrs(PostStatStageChangeAbAttr, pokemon, filteredStats, this.stages, this.selfTarget); // Look for any other stat change phases; if this is the last one, do White Herb check - const existingPhase = this.scene.findPhase(p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex); + const existingPhase = globalScene.findPhase( + p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex, + ); if (!(existingPhase instanceof StatStageChangePhase)) { // Apply White Herb if needed - const whiteHerb = this.scene.applyModifier(ResetNegativeStatStageModifier, this.player, pokemon) as ResetNegativeStatStageModifier; + const whiteHerb = globalScene.applyModifier( + ResetNegativeStatStageModifier, + this.player, + pokemon, + ) as ResetNegativeStatStageModifier; // If the White Herb was applied, consume it if (whiteHerb) { - whiteHerb.stackCount--; - if (whiteHerb.stackCount <= 0) { - this.scene.removeModifier(whiteHerb); - } - this.scene.updateModifiers(this.player); + pokemon.loseHeldItem(whiteHerb); + globalScene.updateModifiers(this.player); } } pokemon.updateInfo(); - handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end()); + handleTutorial(Tutorial.Stat_Change).then(() => super.end()); }; - if (relLevels.filter(l => l).length && this.scene.moveAnimations) { + if (relLevels.filter(l => l).length && globalScene.moveAnimations) { pokemon.enableMask(); const pokemonMaskSprite = pokemon.maskSprite; - const tileX = (this.player ? 106 : 236) * pokemon.getSpriteScale() * this.scene.field.scale; - const tileY = ((this.player ? 148 : 84) + (stages.value >= 1 ? 160 : 0)) * pokemon.getSpriteScale() * this.scene.field.scale; - const tileWidth = 156 * this.scene.field.scale * pokemon.getSpriteScale(); - const tileHeight = 316 * this.scene.field.scale * pokemon.getSpriteScale(); + const tileX = (this.player ? 106 : 236) * pokemon.getSpriteScale() * globalScene.field.scale; + const tileY = + ((this.player ? 148 : 84) + (stages.value >= 1 ? 160 : 0)) * pokemon.getSpriteScale() * globalScene.field.scale; + const tileWidth = 156 * globalScene.field.scale * pokemon.getSpriteScale(); + const tileHeight = 316 * globalScene.field.scale * pokemon.getSpriteScale(); // On increase, show the red sprite located at ATK // On decrease, show the blue sprite located at SPD const spriteColor = stages.value >= 1 ? Stat[Stat.ATK].toLowerCase() : Stat[Stat.SPD].toLowerCase(); - const statSprite = this.scene.add.tileSprite(tileX, tileY, tileWidth, tileHeight, "battle_stats", spriteColor); - statSprite.setPipeline(this.scene.fieldSpritePipeline); + const statSprite = globalScene.add.tileSprite(tileX, tileY, tileWidth, tileHeight, "battle_stats", spriteColor); + statSprite.setPipeline(globalScene.fieldSpritePipeline); statSprite.setAlpha(0); statSprite.setScale(6); statSprite.setOrigin(0.5, 1); - this.scene.playSound(`se/stat_${stages.value >= 1 ? "up" : "down"}`); + globalScene.playSound(`se/stat_${stages.value >= 1 ? "up" : "down"}`); - statSprite.setMask(new Phaser.Display.Masks.BitmapMask(this.scene, pokemonMaskSprite ?? undefined)); + statSprite.setMask(new Phaser.Display.Masks.BitmapMask(globalScene, pokemonMaskSprite ?? undefined)); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: statSprite, duration: 250, alpha: 0.8375, onComplete: () => { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: statSprite, delay: 1000, duration: 250, - alpha: 0 + alpha: 0, }); - } + }, }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: statSprite, duration: 1500, - y: `${stages.value >= 1 ? "-" : "+"}=${160 * 6}` + y: `${stages.value >= 1 ? "-" : "+"}=${160 * 6}`, }); - this.scene.time.delayedCall(1750, () => { + globalScene.time.delayedCall(1750, () => { pokemon.disableMask(); end(); }); @@ -190,31 +297,49 @@ export class StatStageChangePhase extends PokemonPhase { } aggregateStatStageChanges(): void { - const accEva: BattleStat[] = [ Stat.ACC, Stat.EVA ]; + const accEva: BattleStat[] = [Stat.ACC, Stat.EVA]; const isAccEva = accEva.some(s => this.stats.includes(s)); let existingPhase: StatStageChangePhase; if (this.stats.length === 1) { - while ((existingPhase = (this.scene.findPhase(p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex && p.stats.length === 1 - && (p.stats[0] === this.stats[0]) - && p.selfTarget === this.selfTarget && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatStageChangePhase))) { + while ( + (existingPhase = globalScene.findPhase( + p => + p instanceof StatStageChangePhase && + p.battlerIndex === this.battlerIndex && + p.stats.length === 1 && + p.stats[0] === this.stats[0] && + p.selfTarget === this.selfTarget && + p.showMessage === this.showMessage && + p.ignoreAbilities === this.ignoreAbilities, + ) as StatStageChangePhase) + ) { this.stages += existingPhase.stages; - if (!this.scene.tryRemovePhase(p => p === existingPhase)) { + if (!globalScene.tryRemovePhase(p => p === existingPhase)) { break; } } } - while ((existingPhase = (this.scene.findPhase(p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex && p.selfTarget === this.selfTarget - && (accEva.some(s => p.stats.includes(s)) === isAccEva) - && p.stages === this.stages && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatStageChangePhase))) { + while ( + (existingPhase = globalScene.findPhase( + p => + p instanceof StatStageChangePhase && + p.battlerIndex === this.battlerIndex && + p.selfTarget === this.selfTarget && + accEva.some(s => p.stats.includes(s)) === isAccEva && + p.stages === this.stages && + p.showMessage === this.showMessage && + p.ignoreAbilities === this.ignoreAbilities, + ) as StatStageChangePhase) + ) { this.stats.push(...existingPhase.stats); - if (!this.scene.tryRemovePhase(p => p === existingPhase)) { + if (!globalScene.tryRemovePhase(p => p === existingPhase)) { break; } } } - getStatStageChangeMessages(stats: BattleStat[], stages: integer, relStages: integer[]): string[] { + getStatStageChangeMessages(stats: BattleStat[], stages: number, relStages: number[]): string[] { const messages: string[] = []; const relStageStatIndexes = {}; @@ -231,21 +356,31 @@ export class StatStageChangePhase extends PokemonPhase { let statsFragment = ""; if (relStageStats.length > 1) { - statsFragment = relStageStats.length >= 5 - ? i18next.t("battle:stats") - : `${relStageStats.slice(0, -1).map(s => i18next.t(getStatKey(s))).join(", ")}${relStageStats.length > 2 ? "," : ""} ${i18next.t("battle:statsAnd")} ${i18next.t(getStatKey(relStageStats[relStageStats.length - 1]))}`; - messages.push(i18next.t(getStatStageChangeDescriptionKey(Math.abs(parseInt(rl)), stages >= 1), { - pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()), - stats: statsFragment, - count: relStageStats.length - })); + statsFragment = + relStageStats.length >= 5 + ? i18next.t("battle:stats") + : `${relStageStats + .slice(0, -1) + .map(s => i18next.t(getStatKey(s))) + .join( + ", ", + )}${relStageStats.length > 2 ? "," : ""} ${i18next.t("battle:statsAnd")} ${i18next.t(getStatKey(relStageStats[relStageStats.length - 1]))}`; + messages.push( + i18next.t(getStatStageChangeDescriptionKey(Math.abs(Number.parseInt(rl)), stages >= 1), { + pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()), + stats: statsFragment, + count: relStageStats.length, + }), + ); } else { statsFragment = i18next.t(getStatKey(relStageStats[0])); - messages.push(i18next.t(getStatStageChangeDescriptionKey(Math.abs(parseInt(rl)), stages >= 1), { - pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()), - stats: statsFragment, - count: relStageStats.length - })); + messages.push( + i18next.t(getStatStageChangeDescriptionKey(Math.abs(Number.parseInt(rl)), stages >= 1), { + pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()), + stats: statsFragment, + count: relStageStats.length, + }), + ); } }); diff --git a/src/phases/summon-missing-phase.ts b/src/phases/summon-missing-phase.ts index 83ac8779dd8..32bc7495dce 100644 --- a/src/phases/summon-missing-phase.ts +++ b/src/phases/summon-missing-phase.ts @@ -1,15 +1,19 @@ -import BattleScene from "#app/battle-scene"; import { getPokemonNameWithAffix } from "#app/messages"; import i18next from "i18next"; import { SummonPhase } from "./summon-phase"; +import { globalScene } from "#app/global-scene"; export class SummonMissingPhase extends SummonPhase { - constructor(scene: BattleScene, fieldIndex: integer) { - super(scene, fieldIndex); + constructor(fieldIndex: number) { + super(fieldIndex); } preSummon(): void { - this.scene.ui.showText(i18next.t("battle:sendOutPokemon", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); - this.scene.time.delayedCall(250, () => this.summon()); + globalScene.ui.showText( + i18next.t("battle:sendOutPokemon", { + pokemonName: getPokemonNameWithAffix(this.getPokemon()), + }), + ); + globalScene.time.delayedCall(250, () => this.summon()); } } diff --git a/src/phases/summon-phase.ts b/src/phases/summon-phase.ts index 119e550293c..31cd2645e68 100644 --- a/src/phases/summon-phase.ts +++ b/src/phases/summon-phase.ts @@ -1,11 +1,11 @@ -import BattleScene from "#app/battle-scene"; import { BattleType } from "#app/battle"; import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; import { TrainerSlot } from "#app/data/trainer-config"; import { PlayerGender } from "#app/enums/player-gender"; import { addPokeballOpenParticles } from "#app/field/anims"; -import Pokemon, { FieldPosition } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { FieldPosition } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import i18next from "i18next"; import { PartyMemberPokemonPhase } from "./party-member-pokemon-phase"; @@ -13,12 +13,13 @@ import { PostSummonPhase } from "./post-summon-phase"; import { GameOverPhase } from "./game-over-phase"; import { ShinySparklePhase } from "./shiny-sparkle-phase"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import { globalScene } from "#app/global-scene"; export class SummonPhase extends PartyMemberPokemonPhase { private loaded: boolean; - constructor(scene: BattleScene, fieldIndex: integer, player: boolean = true, loaded: boolean = false) { - super(scene, fieldIndex, player); + constructor(fieldIndex: number, player = true, loaded = false) { + super(fieldIndex, player); this.loaded = loaded; } @@ -30,13 +31,15 @@ export class SummonPhase extends PartyMemberPokemonPhase { } /** - * Sends out a Pokemon before the battle begins and shows the appropriate messages - */ + * Sends out a Pokemon before the battle begins and shows the appropriate messages + */ preSummon(): void { const partyMember = this.getPokemon(); // If the Pokemon about to be sent out is fainted, illegal under a challenge, or no longer in the party for some reason, switch to the first non-fainted legal Pokemon if (!partyMember.isAllowedInBattle() || (this.player && !this.getParty().some(p => p.id === partyMember.id))) { - console.warn("The Pokemon about to be sent out is fainted or illegal under a challenge. Attempting to resolve..."); + console.warn( + "The Pokemon about to be sent out is fainted or illegal under a challenge. Attempting to resolve...", + ); // First check if they're somehow still in play, if so remove them. if (partyMember.isOnField()) { @@ -50,45 +53,65 @@ export class SummonPhase extends PartyMemberPokemonPhase { if (legalIndex === -1) { console.error("Party Details:\n", party); console.error("All available Pokemon were fainted or illegal!"); - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new GameOverPhase(this.scene)); + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new GameOverPhase()); this.end(); return; } // Swaps the fainted Pokemon and the first non-fainted legal Pokemon in the party - [ party[this.partyMemberIndex], party[legalIndex] ] = [ party[legalIndex], party[this.partyMemberIndex] ]; - console.warn("Swapped %s %O with %s %O", getPokemonNameWithAffix(partyMember), partyMember, getPokemonNameWithAffix(party[0]), party[0]); + [party[this.partyMemberIndex], party[legalIndex]] = [party[legalIndex], party[this.partyMemberIndex]]; + console.warn( + "Swapped %s %O with %s %O", + getPokemonNameWithAffix(partyMember), + partyMember, + getPokemonNameWithAffix(party[0]), + party[0], + ); } if (this.player) { - this.scene.ui.showText(i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); + globalScene.ui.showText( + i18next.t("battle:playerGo", { + pokemonName: getPokemonNameWithAffix(this.getPokemon()), + }), + ); if (this.player) { - this.scene.pbTray.hide(); + globalScene.pbTray.hide(); } - this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); - this.scene.time.delayedCall(562, () => { - this.scene.trainer.setFrame("2"); - this.scene.time.delayedCall(64, () => { - this.scene.trainer.setFrame("3"); + globalScene.trainer.setTexture( + `trainer_${globalScene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`, + ); + globalScene.time.delayedCall(562, () => { + globalScene.trainer.setFrame("2"); + globalScene.time.delayedCall(64, () => { + globalScene.trainer.setFrame("3"); }); }); - this.scene.tweens.add({ - targets: this.scene.trainer, + globalScene.tweens.add({ + targets: globalScene.trainer, x: -36, duration: 1000, - onComplete: () => this.scene.trainer.setVisible(false) + onComplete: () => globalScene.trainer.setVisible(false), }); - this.scene.time.delayedCall(750, () => this.summon()); - } else if (this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { - const trainerName = this.scene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); + globalScene.time.delayedCall(750, () => this.summon()); + } else if ( + globalScene.currentBattle.battleType === BattleType.TRAINER || + globalScene.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE + ) { + const trainerName = globalScene.currentBattle.trainer?.getName( + !(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ); const pokemonName = this.getPokemon().getNameToRender(); - const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); + const message = i18next.t("battle:trainerSendOut", { + trainerName, + pokemonName, + }); - this.scene.pbTrayEnemy.hide(); - this.scene.ui.showText(message, null, () => this.summon()); - } else if (this.scene.currentBattle.isBattleMysteryEncounter()) { - this.scene.pbTrayEnemy.hide(); + globalScene.pbTrayEnemy.hide(); + globalScene.ui.showText(message, null, () => this.summon()); + } else if (globalScene.currentBattle.isBattleMysteryEncounter()) { + globalScene.pbTrayEnemy.hide(); this.summonWild(); } } @@ -99,55 +122,62 @@ export class SummonPhase extends PartyMemberPokemonPhase { summon(): void { const pokemon = this.getPokemon(); - const pokeball = this.scene.addFieldSprite(this.player ? 36 : 248, this.player ? 80 : 44, "pb", getPokeballAtlasKey(pokemon.pokeball)); + const pokeball = globalScene.addFieldSprite( + this.player ? 36 : 248, + this.player ? 80 : 44, + "pb", + getPokeballAtlasKey(pokemon.pokeball), + ); pokeball.setVisible(false); pokeball.setOrigin(0.5, 0.625); - this.scene.field.add(pokeball); + globalScene.field.add(pokeball); if (this.fieldIndex === 1) { pokemon.setFieldPosition(FieldPosition.RIGHT, 0); } else { const availablePartyMembers = this.getParty().filter(p => p.isAllowedInBattle()).length; - pokemon.setFieldPosition(!this.scene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); + pokemon.setFieldPosition( + !globalScene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT, + ); } const fpOffset = pokemon.getFieldPositionOffset(); pokeball.setVisible(true); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, duration: 650, - x: (this.player ? 100 : 236) + fpOffset[0] + x: (this.player ? 100 : 236) + fpOffset[0], }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, duration: 150, ease: "Cubic.easeOut", y: (this.player ? 70 : 34) + fpOffset[1], onComplete: () => { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pokeball, duration: 500, ease: "Cubic.easeIn", angle: 1440, y: (this.player ? 132 : 86) + fpOffset[1], onComplete: () => { - this.scene.playSound("se/pb_rel"); + globalScene.playSound("se/pb_rel"); pokeball.destroy(); - this.scene.add.existing(pokemon); - this.scene.field.add(pokemon); + globalScene.add.existing(pokemon); + globalScene.field.add(pokemon); if (!this.player) { - const playerPokemon = this.scene.getPlayerPokemon() as Pokemon; - if (playerPokemon?.visible) { - this.scene.field.moveBelow(pokemon, playerPokemon); + const playerPokemon = globalScene.getPlayerPokemon() as Pokemon; + if (playerPokemon?.isOnField()) { + globalScene.field.moveBelow(pokemon, playerPokemon); } - this.scene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); + globalScene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); } - addPokeballOpenParticles(this.scene, pokemon.x, pokemon.y - 16, pokemon.pokeball); - this.scene.updateModifiers(this.player); - this.scene.updateFieldScale(); + addPokeballOpenParticles(pokemon.x, pokemon.y - 16, pokemon.pokeball); + globalScene.updateModifiers(this.player); + globalScene.updateFieldScale(); pokemon.showInfo(); pokemon.playAnim(); pokemon.setVisible(true); @@ -155,8 +185,8 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.setScale(0.5); pokemon.tint(getPokeballTintColor(pokemon.pokeball)); pokemon.untint(250, "Sine.easeIn"); - this.scene.updateFieldScale(); - this.scene.tweens.add({ + globalScene.updateFieldScale(); + globalScene.tweens.add({ targets: pokemon, duration: 250, ease: "Sine.easeIn", @@ -165,12 +195,12 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); pokemon.getSprite().clearTint(); pokemon.resetSummonData(); - this.scene.time.delayedCall(1000, () => this.end()); - } + globalScene.time.delayedCall(1000, () => this.end()); + }, }); - } + }, }); - } + }, }); } @@ -186,20 +216,22 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.setFieldPosition(FieldPosition.RIGHT, 0); } else { const availablePartyMembers = this.getParty().filter(p => !p.isFainted()).length; - pokemon.setFieldPosition(!this.scene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); + pokemon.setFieldPosition( + !globalScene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT, + ); } - this.scene.add.existing(pokemon); - this.scene.field.add(pokemon); + globalScene.add.existing(pokemon); + globalScene.field.add(pokemon); if (!this.player) { - const playerPokemon = this.scene.getPlayerPokemon() as Pokemon; - if (playerPokemon?.visible) { - this.scene.field.moveBelow(pokemon, playerPokemon); + const playerPokemon = globalScene.getPlayerPokemon() as Pokemon; + if (playerPokemon?.isOnField()) { + globalScene.field.moveBelow(pokemon, playerPokemon); } - this.scene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); + globalScene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); } - this.scene.updateModifiers(this.player); - this.scene.updateFieldScale(); + globalScene.updateModifiers(this.player); + globalScene.updateFieldScale(); pokemon.showInfo(); pokemon.playAnim(); pokemon.setVisible(true); @@ -207,13 +239,13 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.setScale(0.75); pokemon.tint(getPokeballTintColor(pokemon.pokeball)); pokemon.untint(250, "Sine.easeIn"); - this.scene.updateFieldScale(); + globalScene.updateFieldScale(); pokemon.x += 16; pokemon.y -= 20; pokemon.alpha = 0; // Ease pokemon in - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pokemon, x: "-=16", y: "+=16", @@ -225,9 +257,9 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); pokemon.getSprite().clearTint(); pokemon.resetSummonData(); - this.scene.updateFieldScale(); - this.scene.time.delayedCall(1000, () => this.end()); - } + globalScene.updateFieldScale(); + globalScene.time.delayedCall(1000, () => this.end()); + }, }); } @@ -235,19 +267,23 @@ export class SummonPhase extends PartyMemberPokemonPhase { const pokemon = this.getPokemon(); if (pokemon.isShiny()) { - this.scene.unshiftPhase(new ShinySparklePhase(this.scene, pokemon.getBattlerIndex())); + globalScene.unshiftPhase(new ShinySparklePhase(pokemon.getBattlerIndex())); } pokemon.resetTurnData(); - if (!this.loaded || [ BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER ].includes(this.scene.currentBattle.battleType) || (this.scene.currentBattle.waveIndex % 10) === 1) { - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + if ( + !this.loaded || + [BattleType.TRAINER, BattleType.MYSTERY_ENCOUNTER].includes(globalScene.currentBattle.battleType) || + globalScene.currentBattle.waveIndex % 10 === 1 + ) { + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); this.queuePostSummon(); } } queuePostSummon(): void { - this.scene.pushPhase(new PostSummonPhase(this.scene, this.getPokemon().getBattlerIndex())); + globalScene.pushPhase(new PostSummonPhase(this.getPokemon().getBattlerIndex())); } end() { diff --git a/src/phases/switch-biome-phase.ts b/src/phases/switch-biome-phase.ts index 80a31794209..2dd2a642f43 100644 --- a/src/phases/switch-biome-phase.ts +++ b/src/phases/switch-biome-phase.ts @@ -1,13 +1,13 @@ -import BattleScene from "#app/battle-scene"; -import { Biome } from "#app/enums/biome"; +import { globalScene } from "#app/global-scene"; +import type { Biome } from "#app/enums/biome"; import { getBiomeKey } from "#app/field/arena"; import { BattlePhase } from "./battle-phase"; export class SwitchBiomePhase extends BattlePhase { private nextBiome: Biome; - constructor(scene: BattleScene, nextBiome: Biome) { - super(scene); + constructor(nextBiome: Biome) { + super(); this.nextBiome = nextBiome; } @@ -19,47 +19,47 @@ export class SwitchBiomePhase extends BattlePhase { return this.end(); } - this.scene.tweens.add({ - targets: [ this.scene.arenaEnemy, this.scene.lastEnemyTrainer ], + globalScene.tweens.add({ + targets: [globalScene.arenaEnemy, globalScene.lastEnemyTrainer], x: "+=300", duration: 2000, onComplete: () => { - this.scene.arenaEnemy.setX(this.scene.arenaEnemy.x - 600); + globalScene.arenaEnemy.setX(globalScene.arenaEnemy.x - 600); - this.scene.newArena(this.nextBiome); + globalScene.newArena(this.nextBiome); const biomeKey = getBiomeKey(this.nextBiome); const bgTexture = `${biomeKey}_bg`; - this.scene.arenaBgTransition.setTexture(bgTexture); - this.scene.arenaBgTransition.setAlpha(0); - this.scene.arenaBgTransition.setVisible(true); - this.scene.arenaPlayerTransition.setBiome(this.nextBiome); - this.scene.arenaPlayerTransition.setAlpha(0); - this.scene.arenaPlayerTransition.setVisible(true); + globalScene.arenaBgTransition.setTexture(bgTexture); + globalScene.arenaBgTransition.setAlpha(0); + globalScene.arenaBgTransition.setVisible(true); + globalScene.arenaPlayerTransition.setBiome(this.nextBiome); + globalScene.arenaPlayerTransition.setAlpha(0); + globalScene.arenaPlayerTransition.setVisible(true); - this.scene.tweens.add({ - targets: [ this.scene.arenaPlayer, this.scene.arenaBgTransition, this.scene.arenaPlayerTransition ], + globalScene.tweens.add({ + targets: [globalScene.arenaPlayer, globalScene.arenaBgTransition, globalScene.arenaPlayerTransition], duration: 1000, delay: 1000, ease: "Sine.easeInOut", - alpha: (target: any) => target === this.scene.arenaPlayer ? 0 : 1, + alpha: (target: any) => (target === globalScene.arenaPlayer ? 0 : 1), onComplete: () => { - this.scene.arenaBg.setTexture(bgTexture); - this.scene.arenaPlayer.setBiome(this.nextBiome); - this.scene.arenaPlayer.setAlpha(1); - this.scene.arenaEnemy.setBiome(this.nextBiome); - this.scene.arenaEnemy.setAlpha(1); - this.scene.arenaNextEnemy.setBiome(this.nextBiome); - this.scene.arenaBgTransition.setVisible(false); - this.scene.arenaPlayerTransition.setVisible(false); - if (this.scene.lastEnemyTrainer) { - this.scene.lastEnemyTrainer.destroy(); + globalScene.arenaBg.setTexture(bgTexture); + globalScene.arenaPlayer.setBiome(this.nextBiome); + globalScene.arenaPlayer.setAlpha(1); + globalScene.arenaEnemy.setBiome(this.nextBiome); + globalScene.arenaEnemy.setAlpha(1); + globalScene.arenaNextEnemy.setBiome(this.nextBiome); + globalScene.arenaBgTransition.setVisible(false); + globalScene.arenaPlayerTransition.setVisible(false); + if (globalScene.lastEnemyTrainer) { + globalScene.lastEnemyTrainer.destroy(); } this.end(); - } + }, }); - } + }, }); } } diff --git a/src/phases/switch-phase.ts b/src/phases/switch-phase.ts index f5ce2179715..8562309ede5 100644 --- a/src/phases/switch-phase.ts +++ b/src/phases/switch-phase.ts @@ -1,8 +1,9 @@ -import BattleScene from "#app/battle-scene"; -import { SwitchType } from "#enums/switch-type"; -import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; +import { globalScene } from "#app/global-scene"; +import PartyUiHandler, { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; 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"; /** @@ -10,23 +11,22 @@ import { SwitchSummonPhase } from "./switch-summon-phase"; * for the player (if a switch would be valid for the current battle state). */ export class SwitchPhase extends BattlePhase { - protected readonly fieldIndex: integer; + protected readonly fieldIndex: number; private readonly switchType: SwitchType; private readonly isModal: boolean; private readonly doReturn: boolean; /** - * Creates a new SwitchPhase - * @param scene {@linkcode BattleScene} Current battle scene - * @param switchType {@linkcode SwitchType} The type of switch logic this phase implements - * @param fieldIndex Field index to switch out - * @param isModal Indicates if the switch should be forced (true) or is - * optional (false). - * @param doReturn Indicates if the party member on the field should be - * recalled to ball or has already left the field. Passed to {@linkcode SwitchSummonPhase}. - */ - constructor(scene: BattleScene, switchType: SwitchType, fieldIndex: integer, isModal: boolean, doReturn: boolean) { - super(scene); + * Creates a new SwitchPhase + * @param switchType {@linkcode SwitchType} The type of switch logic this phase implements + * @param fieldIndex Field index to switch out + * @param isModal Indicates if the switch should be forced (true) or is + * optional (false). + * @param doReturn Indicates if the party member on the field should be + * recalled to ball or has already left the field. Passed to {@linkcode SwitchSummonPhase}. + */ + constructor(switchType: SwitchType, fieldIndex: number, isModal: boolean, doReturn: boolean) { + super(); this.switchType = switchType; this.fieldIndex = fieldIndex; @@ -38,7 +38,7 @@ export class SwitchPhase extends BattlePhase { super.start(); // Skip modal switch if impossible (no remaining party members that aren't in battle) - if (this.isModal && !this.scene.getParty().filter(p => p.isAllowedInBattle() && !p.isActive(true)).length) { + if (this.isModal && !globalScene.getPlayerParty().filter(p => p.isAllowedInBattle() && !p.isActive(true)).length) { return super.end(); } @@ -49,24 +49,40 @@ export class SwitchPhase extends BattlePhase { * if the mon should have already been returned but is still alive and well * on the field. see also; battle.test.ts */ - if (this.isModal && !this.doReturn && !this.scene.getParty()[this.fieldIndex].isFainted()) { + if (this.isModal && !this.doReturn && !globalScene.getPlayerParty()[this.fieldIndex].isFainted()) { return super.end(); } // Check if there is any space still in field - if (this.isModal && this.scene.getPlayerField().filter(p => p.isAllowedInBattle() && p.isActive(true)).length >= this.scene.currentBattle.getBattlerCount()) { + if ( + this.isModal && + globalScene.getPlayerField().filter(p => p.isAllowedInBattle() && p.isActive(true)).length >= + globalScene.currentBattle.getBattlerCount() + ) { return super.end(); } // Override field index to 0 in case of double battle where 2/3 remaining legal party members fainted at once - const fieldIndex = this.scene.currentBattle.getBattlerCount() === 1 || this.scene.getParty().filter(p => p.isAllowedInBattle()).length > 1 ? this.fieldIndex : 0; + const fieldIndex = + globalScene.currentBattle.getBattlerCount() === 1 || globalScene.getPokemonAllowedInBattle().length > 1 + ? this.fieldIndex + : 0; - 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) { - const switchType = (option === PartyOption.PASS_BATON) ? SwitchType.BATON_PASS : this.switchType; - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, switchType, fieldIndex, slotIndex, this.doReturn)); - } - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - }, PartyUiHandler.FilterNonFainted); + globalScene.ui.setMode( + Mode.PARTY, + this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, + fieldIndex, + (slotIndex: number, option: PartyOption) => { + if (slotIndex >= globalScene.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. + globalScene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); + const switchType = option === PartyOption.PASS_BATON ? SwitchType.BATON_PASS : this.switchType; + globalScene.unshiftPhase(new SwitchSummonPhase(switchType, fieldIndex, slotIndex, this.doReturn)); + } + globalScene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + }, + PartyUiHandler.FilterNonFainted, + ); } } diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts index 37652b3cfa4..48bcd0c4ebd 100644 --- a/src/phases/switch-summon-phase.ts +++ b/src/phases/switch-summon-phase.ts @@ -1,10 +1,10 @@ -import BattleScene from "#app/battle-scene"; -import { applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr } from "#app/data/ability"; -import { allMoves, ForceSwitchOutAttr } from "#app/data/move"; +import { globalScene } from "#app/global-scene"; +import { applyPreSwitchOutAbAttrs, PostDamageForceSwitchAbAttr, PreSwitchOutAbAttr } from "#app/data/ability"; +import { allMoves, ForceSwitchOutAttr } from "#app/data/moves/move"; import { getPokeballTintColor } from "#app/data/pokeball"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; import { TrainerSlot } from "#app/data/trainer-config"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { SwitchEffectTransferModifier } from "#app/modifier/modifier"; import { Command } from "#app/ui/command-ui-handler"; @@ -16,22 +16,21 @@ import { SwitchType } from "#enums/switch-type"; export class SwitchSummonPhase extends SummonPhase { private readonly switchType: SwitchType; - private readonly slotIndex: integer; + private readonly slotIndex: number; private readonly doReturn: boolean; private lastPokemon: Pokemon; /** - * Constructor for creating a new SwitchSummonPhase - * @param scene {@linkcode BattleScene} the scene the phase is associated with - * @param switchType the type of switch behavior - * @param fieldIndex integer representing position on the battle field - * @param slotIndex integer for the index of pokemon (in party of 6) to switch into - * @param doReturn boolean whether to render "comeback" dialogue - * @param player boolean if the switch is from the player - */ - constructor(scene: BattleScene, switchType: SwitchType, fieldIndex: integer, slotIndex: integer, doReturn: boolean, player?: boolean) { - super(scene, fieldIndex, player !== undefined ? player : true); + * Constructor for creating a new SwitchSummonPhase + * @param switchType the type of switch behavior + * @param fieldIndex integer representing position on the battle field + * @param slotIndex integer for the index of pokemon (in party of 6) to switch into + * @param doReturn boolean whether to render "comeback" dialogue + * @param player boolean if the switch is from the player + */ + constructor(switchType: SwitchType, fieldIndex: number, slotIndex: number, doReturn: boolean, player?: boolean) { + super(fieldIndex, player !== undefined ? player : true); this.switchType = switchType; this.slotIndex = slotIndex; @@ -46,74 +45,111 @@ export class SwitchSummonPhase extends SummonPhase { if (!this.player) { if (this.slotIndex === -1) { //@ts-ignore - this.slotIndex = this.scene.currentBattle.trainer?.getNextSummonIndex(!this.fieldIndex ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); // TODO: what would be the default trainer-slot fallback? + this.slotIndex = globalScene.currentBattle.trainer?.getNextSummonIndex( + !this.fieldIndex ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ); // TODO: what would be the default trainer-slot fallback? } if (this.slotIndex > -1) { this.showEnemyTrainer(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); - this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); + globalScene.pbTrayEnemy.showPbTray(globalScene.getEnemyParty()); } } - if (!this.doReturn || (this.slotIndex !== -1 && !(this.player ? this.scene.getParty() : this.scene.getEnemyParty())[this.slotIndex])) { + if ( + !this.doReturn || + (this.slotIndex !== -1 && + !(this.player ? globalScene.getPlayerParty() : globalScene.getEnemyParty())[this.slotIndex]) + ) { if (this.player) { return this.switchAndSummon(); - } else { - this.scene.time.delayedCall(750, () => this.switchAndSummon()); - return; } + globalScene.time.delayedCall(750, () => this.switchAndSummon()); + return; } const pokemon = this.getPokemon(); + (this.player ? globalScene.getEnemyField() : globalScene.getPlayerField()).forEach(enemyPokemon => + enemyPokemon.removeTagsBySourceId(pokemon.id), + ); - (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id)); - - if (this.switchType === SwitchType.SWITCH) { + if (this.switchType === SwitchType.SWITCH || this.switchType === SwitchType.INITIAL_SWITCH) { const substitute = pokemon.getTag(SubstituteTag); if (substitute) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: substitute.sprite, duration: 250, scale: substitute.sprite.scale * 0.5, ease: "Sine.easeIn", - onComplete: () => substitute.sprite.destroy() + onComplete: () => substitute.sprite.destroy(), }); } } - this.scene.ui.showText(this.player ? - i18next.t("battle:playerComeBack", { pokemonName: getPokemonNameWithAffix(pokemon) }) : - i18next.t("battle:trainerComeBack", { - trainerName: this.scene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), - pokemonName: pokemon.getNameToRender() - }) + globalScene.ui.showText( + this.player + ? i18next.t("battle:playerComeBack", { + pokemonName: getPokemonNameWithAffix(pokemon), + }) + : i18next.t("battle:trainerComeBack", { + trainerName: globalScene.currentBattle.trainer?.getName( + !(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ), + pokemonName: pokemon.getNameToRender(), + }), ); - this.scene.playSound("se/pb_rel"); + globalScene.playSound("se/pb_rel"); pokemon.hideInfo(); pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, "Sine.easeIn"); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: pokemon, duration: 250, ease: "Sine.easeIn", scale: 0.5, onComplete: () => { + globalScene.time.delayedCall(750, () => this.switchAndSummon()); pokemon.leaveField(this.switchType === SwitchType.SWITCH, false); - this.scene.time.delayedCall(750, () => this.switchAndSummon()); - } + }, }); } switchAndSummon() { - const party = this.player ? this.getParty() : this.scene.getEnemyParty(); + const party = this.player ? this.getParty() : globalScene.getEnemyParty(); const switchedInPokemon = party[this.slotIndex]; this.lastPokemon = this.getPokemon(); applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, this.lastPokemon); if (this.switchType === SwitchType.BATON_PASS && switchedInPokemon) { - (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedInPokemon.id)); - if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { - const batonPassModifier = this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier - && (m as SwitchEffectTransferModifier).pokemonId === this.lastPokemon.id) as SwitchEffectTransferModifier; - if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id)) { - this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedInPokemon, false); + (this.player ? globalScene.getEnemyField() : globalScene.getPlayerField()).forEach(enemyPokemon => + enemyPokemon.transferTagsBySourceId(this.lastPokemon.id, switchedInPokemon.id), + ); + if ( + !globalScene.findModifier( + m => + m instanceof SwitchEffectTransferModifier && + (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id, + ) + ) { + const batonPassModifier = globalScene.findModifier( + m => + m instanceof SwitchEffectTransferModifier && + (m as SwitchEffectTransferModifier).pokemonId === this.lastPokemon.id, + ) as SwitchEffectTransferModifier; + if ( + batonPassModifier && + !globalScene.findModifier( + m => + m instanceof SwitchEffectTransferModifier && + (m as SwitchEffectTransferModifier).pokemonId === switchedInPokemon.id, + ) + ) { + globalScene.tryTransferHeldItemModifier( + batonPassModifier, + switchedInPokemon, + false, + undefined, + undefined, + undefined, + false, + ); } } } @@ -121,12 +157,17 @@ export class SwitchSummonPhase extends SummonPhase { party[this.slotIndex] = this.lastPokemon; party[this.fieldIndex] = switchedInPokemon; const showTextAndSummon = () => { - this.scene.ui.showText(this.player ? - i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(switchedInPokemon) }) : - i18next.t("battle:trainerGo", { - trainerName: this.scene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), - pokemonName: this.getPokemon().getNameToRender() - }) + globalScene.ui.showText( + this.player + ? i18next.t("battle:playerGo", { + pokemonName: getPokemonNameWithAffix(switchedInPokemon), + }) + : i18next.t("battle:trainerGo", { + trainerName: globalScene.currentBattle.trainer?.getName( + !(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER, + ), + pokemonName: this.getPokemon().getNameToRender(), + }), ); /** * If this switch is passing a Substitute, make the switched Pokemon match the returned Pokemon's state as it left. @@ -140,7 +181,6 @@ export class SwitchSummonPhase extends SummonPhase { switchedInPokemon.setAlpha(0.5); } } else { - switchedInPokemon.resetBattleData(); switchedInPokemon.resetSummonData(); } this.summon(); @@ -148,9 +188,9 @@ export class SwitchSummonPhase extends SummonPhase { if (this.player) { showTextAndSummon(); } else { - this.scene.time.delayedCall(1500, () => { + globalScene.time.delayedCall(1500, () => { this.hideEnemyTrainer(); - this.scene.pbTrayEnemy.hide(); + globalScene.pbTrayEnemy.hide(); showTextAndSummon(); }); } @@ -164,15 +204,22 @@ export class SwitchSummonPhase extends SummonPhase { const pokemon = this.getPokemon(); - const moveId = this.lastPokemon?.scene.currentBattle.lastMove; + const moveId = globalScene.currentBattle.lastMove; const lastUsedMove = moveId ? allMoves[moveId] : undefined; - const currentCommand = pokemon.scene.currentBattle.turnCommands[this.fieldIndex]?.command; - const lastPokemonIsForceSwitchedAndNotFainted = lastUsedMove?.hasAttr(ForceSwitchOutAttr) && !this.lastPokemon.isFainted(); + const currentCommand = globalScene.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--; } @@ -186,14 +233,19 @@ export class SwitchSummonPhase extends SummonPhase { } } + if (this.switchType !== SwitchType.INITIAL_SWITCH) { + pokemon.resetTurnData(); + pokemon.turnData.switchedInThisTurn = true; + } + this.lastPokemon?.resetSummonData(); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); // Reverts to weather-based forms when weather suppressors (Cloud Nine/Air Lock) are switched out - this.scene.arena.triggerWeatherBasedFormChanges(); + globalScene.arena.triggerWeatherBasedFormChanges(); } queuePostSummon(): void { - this.scene.unshiftPhase(new PostSummonPhase(this.scene, this.getPokemon().getBattlerIndex())); + globalScene.unshiftPhase(new PostSummonPhase(this.getPokemon().getBattlerIndex())); } } diff --git a/src/phases/tera-phase.ts b/src/phases/tera-phase.ts new file mode 100644 index 00000000000..c9320daf12f --- /dev/null +++ b/src/phases/tera-phase.ts @@ -0,0 +1,53 @@ +import type Pokemon from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { BattlePhase } from "./battle-phase"; +import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; +import { PokemonType } from "#enums/pokemon-type"; +import { achvs } from "#app/system/achv"; +import { SpeciesFormChangeTeraTrigger } from "#app/data/pokemon-forms"; +import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; + +export class TeraPhase extends BattlePhase { + public pokemon: Pokemon; + + constructor(pokemon: Pokemon) { + super(); + + this.pokemon = pokemon; + } + + start() { + super.start(); + + globalScene.queueMessage( + i18next.t("battle:pokemonTerastallized", { + pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), + type: i18next.t(`pokemonInfo:Type.${PokemonType[this.pokemon.getTeraType()]}`), + }), + ); + new CommonBattleAnim(CommonAnim.TERASTALLIZE, this.pokemon).play(false, () => { + this.end(); + }); + } + + end() { + this.pokemon.isTerastallized = true; + this.pokemon.updateSpritePipelineData(); + + if (this.pokemon.isPlayer()) { + globalScene.arena.playerTerasUsed += 1; + } + + globalScene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangeTeraTrigger); + + if (this.pokemon.isPlayer()) { + globalScene.validateAchv(achvs.TERASTALLIZE); + if (this.pokemon.getTeraType() === PokemonType.STELLAR) { + globalScene.validateAchv(achvs.STELLAR_TERASTALLIZE); + } + } + + super.end(); + } +} diff --git a/src/phases/test-message-phase.ts b/src/phases/test-message-phase.ts index 464a5ed1f94..d5e74efd490 100644 --- a/src/phases/test-message-phase.ts +++ b/src/phases/test-message-phase.ts @@ -1,8 +1,7 @@ -import BattleScene from "#app/battle-scene"; import { MessagePhase } from "./message-phase"; export class TestMessagePhase extends MessagePhase { - constructor(scene: BattleScene, message: string) { - super(scene, message, null, true); + constructor(message: string) { + super(message, null, true); } } diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index 58683cf8ec8..5b69f8db45c 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -1,35 +1,40 @@ import { loggedInUser } from "#app/account"; -import BattleScene from "#app/battle-scene"; import { BattleType } from "#app/battle"; -import { getDailyRunStarters, fetchDailyRunSeed } from "#app/data/daily-run"; +import { fetchDailyRunSeed, getDailyRunStarters } from "#app/data/daily-run"; import { Gender } from "#app/data/gender"; import { getBiomeKey } from "#app/field/arena"; -import { GameModes, GameMode, getGameMode } from "#app/game-mode"; -import { regenerateModifierPoolThresholds, ModifierPoolType, modifierTypes, getDailyRunStarterModifiers } from "#app/modifier/modifier-type"; +import { GameMode, GameModes, getGameMode } from "#app/game-mode"; +import type { Modifier } from "#app/modifier/modifier"; +import { + getDailyRunStarterModifiers, + ModifierPoolType, + modifierTypes, + regenerateModifierPoolThresholds, +} from "#app/modifier/modifier-type"; import { Phase } from "#app/phase"; -import { SessionSaveData } from "#app/system/game-data"; +import type { SessionSaveData } from "#app/system/game-data"; import { Unlockables } from "#app/system/unlockables"; import { vouchers } from "#app/system/voucher"; -import { OptionSelectItem, OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler"; +import type { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { SaveSlotUiMode } from "#app/ui/save-slot-select-ui-handler"; import { Mode } from "#app/ui/ui"; -import i18next from "i18next"; import * as Utils from "#app/utils"; -import { Modifier } from "#app/modifier/modifier"; +import i18next from "i18next"; import { CheckSwitchPhase } from "./check-switch-phase"; import { EncounterPhase } from "./encounter-phase"; import { SelectChallengePhase } from "./select-challenge-phase"; import { SelectStarterPhase } from "./select-starter-phase"; import { SummonPhase } from "./summon-phase"; - +import { globalScene } from "#app/global-scene"; +import Overrides from "#app/overrides"; export class TitlePhase extends Phase { private loaded: boolean; private lastSessionData: SessionSaveData; public gameMode: GameModes; - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); this.loaded = false; } @@ -37,23 +42,26 @@ export class TitlePhase extends Phase { start(): void { super.start(); - this.scene.ui.clearText(); - this.scene.ui.fadeIn(250); + globalScene.ui.clearText(); + globalScene.ui.fadeIn(250); - this.scene.playBgm("title", true); + globalScene.playBgm("title", true); - this.scene.gameData.getSession(loggedInUser?.lastSessionSlot ?? -1).then(sessionData => { - if (sessionData) { - this.lastSessionData = sessionData; - const biomeKey = getBiomeKey(sessionData.arena.biome); - const bgTexture = `${biomeKey}_bg`; - this.scene.arenaBg.setTexture(bgTexture); - } - this.showOptions(); - }).catch(err => { - console.error(err); - this.showOptions(); - }); + globalScene.gameData + .getSession(loggedInUser?.lastSessionSlot ?? -1) + .then(sessionData => { + if (sessionData) { + this.lastSessionData = sessionData; + const biomeKey = getBiomeKey(sessionData.arena.biome); + const bgTexture = `${biomeKey}_bg`; + globalScene.arenaBg.setTexture(bgTexture); + } + this.showOptions(); + }) + .catch(err => { + console.error(err); + this.showOptions(); + }); } showOptions(): void { @@ -64,154 +72,177 @@ export class TitlePhase extends Phase { handler: () => { this.loadSaveSlot(this.lastSessionData || !loggedInUser ? -1 : loggedInUser.lastSessionSlot); return true; - } + }, }); } - options.push({ - label: i18next.t("menu:newGame"), - handler: () => { - const setModeAndEnd = (gameMode: GameModes) => { - this.gameMode = gameMode; - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.clearText(); - this.end(); - }; - const { gameData } = this.scene; - if (gameData.isUnlocked(Unlockables.ENDLESS_MODE)) { - const options: OptionSelectItem[] = [ - { - label: GameMode.getModeName(GameModes.CLASSIC), - handler: () => { - setModeAndEnd(GameModes.CLASSIC); - return true; - } + options.push( + { + label: i18next.t("menu:newGame"), + handler: () => { + const setModeAndEnd = (gameMode: GameModes) => { + this.gameMode = gameMode; + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.clearText(); + this.end(); + }; + const { gameData } = globalScene; + const options: OptionSelectItem[] = []; + options.push({ + label: GameMode.getModeName(GameModes.CLASSIC), + handler: () => { + setModeAndEnd(GameModes.CLASSIC); + return true; }, - { + }); + options.push({ + label: i18next.t("menu:dailyRun"), + handler: () => { + this.initDailyRun(); + return true; + }, + }); + if (gameData.isUnlocked(Unlockables.ENDLESS_MODE)) { + options.push({ label: GameMode.getModeName(GameModes.CHALLENGE), handler: () => { setModeAndEnd(GameModes.CHALLENGE); return true; - } - }, - { + }, + }); + options.push({ label: GameMode.getModeName(GameModes.ENDLESS), handler: () => { setModeAndEnd(GameModes.ENDLESS); return true; - } - } - ]; - if (gameData.isUnlocked(Unlockables.SPLICED_ENDLESS_MODE)) { - options.push({ - label: GameMode.getModeName(GameModes.SPLICED_ENDLESS), - handler: () => { - setModeAndEnd(GameModes.SPLICED_ENDLESS); - return true; - } + }, }); + if (gameData.isUnlocked(Unlockables.SPLICED_ENDLESS_MODE)) { + options.push({ + label: GameMode.getModeName(GameModes.SPLICED_ENDLESS), + handler: () => { + setModeAndEnd(GameModes.SPLICED_ENDLESS); + return true; + }, + }); + } } options.push({ label: i18next.t("menu:cancel"), handler: () => { - this.scene.clearPhaseQueue(); - this.scene.pushPhase(new TitlePhase(this.scene)); + globalScene.clearPhaseQueue(); + globalScene.pushPhase(new TitlePhase()); super.end(); return true; - } + }, }); - this.scene.ui.showText(i18next.t("menu:selectGameMode"), null, () => this.scene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options })); - } else { - this.gameMode = GameModes.CLASSIC; - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.clearText(); - this.end(); - } - return true; - } - }, - { - label: i18next.t("menu:loadGame"), - handler: () => { - this.scene.ui.setOverlayMode(Mode.SAVE_SLOT, SaveSlotUiMode.LOAD, - (slotId: integer) => { + globalScene.ui.showText(i18next.t("menu:selectGameMode"), null, () => + globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { + options: options, + }), + ); + return true; + }, + }, + { + label: i18next.t("menu:loadGame"), + handler: () => { + globalScene.ui.setOverlayMode(Mode.SAVE_SLOT, SaveSlotUiMode.LOAD, (slotId: number) => { if (slotId === -1) { return this.showOptions(); } this.loadSaveSlot(slotId); }); - return true; - } - }, - { - label: i18next.t("menu:dailyRun"), - handler: () => { - this.initDailyRun(); - return true; + return true; + }, }, - keepOpen: true - }, - { - label: i18next.t("menu:settings"), - handler: () => { - this.scene.ui.setOverlayMode(Mode.SETTINGS); - return true; + { + label: i18next.t("menu:runHistory"), + handler: () => { + globalScene.ui.setOverlayMode(Mode.RUN_HISTORY); + return true; + }, + keepOpen: true, }, - keepOpen: true - }); + { + label: i18next.t("menu:settings"), + handler: () => { + globalScene.ui.setOverlayMode(Mode.SETTINGS); + return true; + }, + keepOpen: true, + }, + ); const config: OptionSelectConfig = { options: options, noCancel: true, - yOffset: 47 + yOffset: 47, }; - this.scene.ui.setMode(Mode.TITLE, config); + globalScene.ui.setMode(Mode.TITLE, config); } - loadSaveSlot(slotId: integer): void { - this.scene.sessionSlotId = slotId > -1 || !loggedInUser ? slotId : loggedInUser.lastSessionSlot; - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.resetModeChain(); - this.scene.gameData.loadSession(this.scene, slotId, slotId === -1 ? this.lastSessionData : undefined).then((success: boolean) => { - if (success) { - this.loaded = true; - this.scene.ui.showText(i18next.t("menu:sessionSuccess"), null, () => this.end()); - } else { - this.end(); - } - }).catch(err => { - console.error(err); - this.scene.ui.showText(i18next.t("menu:failedToLoadSession"), null); - }); + loadSaveSlot(slotId: number): void { + globalScene.sessionSlotId = slotId > -1 || !loggedInUser ? slotId : loggedInUser.lastSessionSlot; + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.resetModeChain(); + globalScene.gameData + .loadSession(slotId, slotId === -1 ? this.lastSessionData : undefined) + .then((success: boolean) => { + if (success) { + this.loaded = true; + globalScene.ui.showText(i18next.t("menu:sessionSuccess"), null, () => this.end()); + } else { + this.end(); + } + }) + .catch(err => { + console.error(err); + globalScene.ui.showText(i18next.t("menu:failedToLoadSession"), null); + }); } initDailyRun(): void { - this.scene.ui.setMode(Mode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: integer) => { - this.scene.clearPhaseQueue(); + globalScene.ui.clearText(); + globalScene.ui.setMode(Mode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: number) => { + globalScene.clearPhaseQueue(); if (slotId === -1) { - this.scene.pushPhase(new TitlePhase(this.scene)); + globalScene.pushPhase(new TitlePhase()); return super.end(); } - this.scene.sessionSlotId = slotId; + globalScene.sessionSlotId = slotId; const generateDaily = (seed: string) => { - this.scene.gameMode = getGameMode(GameModes.DAILY); + globalScene.gameMode = getGameMode(GameModes.DAILY); - this.scene.setSeed(seed); - this.scene.resetSeed(0); + globalScene.setSeed(seed); + globalScene.resetSeed(0); - this.scene.money = this.scene.gameMode.getStartingMoney(); + globalScene.money = globalScene.gameMode.getStartingMoney(); - const starters = getDailyRunStarters(this.scene, seed); - const startingLevel = this.scene.gameMode.getStartingLevel(); + const starters = getDailyRunStarters(seed); + const startingLevel = globalScene.gameMode.getStartingLevel(); - const party = this.scene.getParty(); + const party = globalScene.getPlayerParty(); const loadPokemonAssets: Promise[] = []; for (const starter of starters) { - const starterProps = this.scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); + const starterProps = globalScene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); - const starterGender = starter.species.malePercent !== null - ? !starterProps.female ? Gender.MALE : Gender.FEMALE - : Gender.GENDERLESS; - const starterPokemon = this.scene.addPlayerPokemon(starter.species, startingLevel, starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, undefined, starter.nature); + const starterGender = + starter.species.malePercent !== null + ? !starterProps.female + ? Gender.MALE + : Gender.FEMALE + : Gender.GENDERLESS; + const starterPokemon = globalScene.addPlayerPokemon( + starter.species, + startingLevel, + starter.abilityIndex, + starterFormIndex, + starterGender, + starterProps.shiny, + starterProps.variant, + undefined, + starter.nature, + ); starterPokemon.setVisible(false); party.push(starterPokemon); loadPokemonAssets.push(starterPokemon.loadAssets()); @@ -219,84 +250,99 @@ export class TitlePhase extends Phase { regenerateModifierPoolThresholds(party, ModifierPoolType.DAILY_STARTER); - const modifiers: Modifier[] = Array(3).fill(null).map(() => modifierTypes.EXP_SHARE().withIdFromFunc(modifierTypes.EXP_SHARE).newModifier()) - .concat(Array(3).fill(null).map(() => modifierTypes.GOLDEN_EXP_CHARM().withIdFromFunc(modifierTypes.GOLDEN_EXP_CHARM).newModifier())) - .concat([ modifierTypes.MAP().withIdFromFunc(modifierTypes.MAP).newModifier() ]) + const modifiers: Modifier[] = Array(3) + .fill(null) + .map(() => modifierTypes.EXP_SHARE().withIdFromFunc(modifierTypes.EXP_SHARE).newModifier()) + .concat( + Array(3) + .fill(null) + .map(() => modifierTypes.GOLDEN_EXP_CHARM().withIdFromFunc(modifierTypes.GOLDEN_EXP_CHARM).newModifier()), + ) + .concat([modifierTypes.MAP().withIdFromFunc(modifierTypes.MAP).newModifier()]) .concat(getDailyRunStarterModifiers(party)) - .filter((m) => m !== null); + .filter(m => m !== null); for (const m of modifiers) { - this.scene.addModifier(m, true, false, false, true); + globalScene.addModifier(m, true, false, false, true); } - this.scene.updateModifiers(true, true); + globalScene.updateModifiers(true, true); Promise.all(loadPokemonAssets).then(() => { - this.scene.time.delayedCall(500, () => this.scene.playBgm()); - this.scene.gameData.gameStats.dailyRunSessionsPlayed++; - this.scene.newArena(this.scene.gameMode.getStartingBiome(this.scene)); - this.scene.newBattle(); - this.scene.arena.init(); - this.scene.sessionPlayTime = 0; - this.scene.lastSavePlayTime = 0; + globalScene.time.delayedCall(500, () => globalScene.playBgm()); + globalScene.gameData.gameStats.dailyRunSessionsPlayed++; + globalScene.newArena(globalScene.gameMode.getStartingBiome()); + globalScene.newBattle(); + globalScene.arena.init(); + globalScene.sessionPlayTime = 0; + globalScene.lastSavePlayTime = 0; this.end(); }); }; // If Online, calls seed fetch from db to generate daily run. If Offline, generates a daily run based on current date. - if (!Utils.isLocal) { - fetchDailyRunSeed().then(seed => { - if (seed) { - generateDaily(seed); - } else { - throw new Error("Daily run seed is null!"); - } - }).catch(err => { - console.error("Failed to load daily run:\n", err); - }); + if (!Utils.isLocal || Utils.isLocalServerConnected) { + fetchDailyRunSeed() + .then(seed => { + if (seed) { + generateDaily(seed); + } else { + throw new Error("Daily run seed is null!"); + } + }) + .catch(err => { + console.error("Failed to load daily run:\n", err); + }); } else { - generateDaily(btoa(new Date().toISOString().substring(0, 10))); + let seed: string = btoa(new Date().toISOString().substring(0, 10)); + if (!Utils.isNullOrUndefined(Overrides.DAILY_RUN_SEED_OVERRIDE)) { + seed = Overrides.DAILY_RUN_SEED_OVERRIDE; + } + generateDaily(seed); } }); } end(): void { - if (!this.loaded && !this.scene.gameMode.isDaily) { - this.scene.arena.preloadBgm(); - this.scene.gameMode = getGameMode(this.gameMode); + if (!this.loaded && !globalScene.gameMode.isDaily) { + globalScene.arena.preloadBgm(); + globalScene.gameMode = getGameMode(this.gameMode); if (this.gameMode === GameModes.CHALLENGE) { - this.scene.pushPhase(new SelectChallengePhase(this.scene)); + globalScene.pushPhase(new SelectChallengePhase()); } else { - this.scene.pushPhase(new SelectStarterPhase(this.scene)); + globalScene.pushPhase(new SelectStarterPhase()); } - this.scene.newArena(this.scene.gameMode.getStartingBiome(this.scene)); + globalScene.newArena(globalScene.gameMode.getStartingBiome()); } else { - this.scene.playBgm(); + globalScene.playBgm(); } - this.scene.pushPhase(new EncounterPhase(this.scene, this.loaded)); + globalScene.pushPhase(new EncounterPhase(this.loaded)); if (this.loaded) { - const availablePartyMembers = this.scene.getParty().filter(p => p.isAllowedInBattle()).length; + const availablePartyMembers = globalScene.getPokemonAllowedInBattle().length; - this.scene.pushPhase(new SummonPhase(this.scene, 0, true, true)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) { - this.scene.pushPhase(new SummonPhase(this.scene, 1, true, true)); + globalScene.pushPhase(new SummonPhase(0, true, true)); + if (globalScene.currentBattle.double && availablePartyMembers > 1) { + globalScene.pushPhase(new SummonPhase(1, true, true)); } - if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { - const minPartySize = this.scene.currentBattle.double ? 2 : 1; + if ( + globalScene.currentBattle.battleType !== BattleType.TRAINER && + (globalScene.currentBattle.waveIndex > 1 || !globalScene.gameMode.isDaily) + ) { + const minPartySize = globalScene.currentBattle.double ? 2 : 1; if (availablePartyMembers > minPartySize) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); - if (this.scene.currentBattle.double) { - this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); + globalScene.pushPhase(new CheckSwitchPhase(0, globalScene.currentBattle.double)); + if (globalScene.currentBattle.double) { + globalScene.pushPhase(new CheckSwitchPhase(1, globalScene.currentBattle.double)); } } } } - for (const achv of Object.keys(this.scene.gameData.achvUnlocks)) { + for (const achv of Object.keys(globalScene.gameData.achvUnlocks)) { if (vouchers.hasOwnProperty(achv) && achv !== "CLASSIC_VICTORY") { - this.scene.validateVoucher(vouchers[achv]); + globalScene.validateVoucher(vouchers[achv]); } } diff --git a/src/phases/toggle-double-position-phase.ts b/src/phases/toggle-double-position-phase.ts index 563af8575d7..37f47d5cf95 100644 --- a/src/phases/toggle-double-position-phase.ts +++ b/src/phases/toggle-double-position-phase.ts @@ -1,12 +1,12 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { FieldPosition } from "#app/field/pokemon"; import { BattlePhase } from "./battle-phase"; export class ToggleDoublePositionPhase extends BattlePhase { private double: boolean; - constructor(scene: BattleScene, double: boolean) { - super(scene); + constructor(double: boolean) { + super(); this.double = double; } @@ -14,16 +14,21 @@ export class ToggleDoublePositionPhase extends BattlePhase { start() { super.start(); - const playerPokemon = this.scene.getPlayerField().find(p => p.isActive(true)); + const playerPokemon = globalScene.getPlayerField().find(p => p.isActive(true)); if (playerPokemon) { - playerPokemon.setFieldPosition(this.double && this.scene.getParty().filter(p => p.isAllowedInBattle()).length > 1 ? FieldPosition.LEFT : FieldPosition.CENTER, 500).then(() => { - if (playerPokemon.getFieldIndex() === 1) { - const party = this.scene.getParty(); - party[1] = party[0]; - party[0] = playerPokemon; - } - this.end(); - }); + playerPokemon + .setFieldPosition( + this.double && globalScene.getPokemonAllowedInBattle().length > 1 ? FieldPosition.LEFT : FieldPosition.CENTER, + 500, + ) + .then(() => { + if (playerPokemon.getFieldIndex() === 1) { + const party = globalScene.getPlayerParty(); + party[1] = party[0]; + party[0] = playerPokemon; + } + this.end(); + }); } else { this.end(); } diff --git a/src/phases/trainer-message-test-phase.ts b/src/phases/trainer-message-test-phase.ts index d9e58473bd5..fa3f553cdd6 100644 --- a/src/phases/trainer-message-test-phase.ts +++ b/src/phases/trainer-message-test-phase.ts @@ -1,14 +1,14 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { trainerConfigs } from "#app/data/trainer-config"; -import { TrainerType } from "#app/enums/trainer-type"; +import type { TrainerType } from "#app/enums/trainer-type"; import { BattlePhase } from "./battle-phase"; import { TestMessagePhase } from "./test-message-phase"; export class TrainerMessageTestPhase extends BattlePhase { private trainerTypes: TrainerType[]; - constructor(scene: BattleScene, ...trainerTypes: TrainerType[]) { - super(scene); + constructor(...trainerTypes: TrainerType[]) { + super(); this.trainerTypes = trainerTypes; } @@ -19,21 +19,27 @@ export class TrainerMessageTestPhase extends BattlePhase { const testMessages: string[] = []; for (const t of Object.keys(trainerConfigs)) { - const type = parseInt(t); - if (this.trainerTypes.length && !this.trainerTypes.find(tt => tt === type as TrainerType)) { + const type = Number.parseInt(t); + if (this.trainerTypes.length && !this.trainerTypes.find(tt => tt === (type as TrainerType))) { continue; } const config = trainerConfigs[type]; - [ config.encounterMessages, config.femaleEncounterMessages, config.victoryMessages, config.femaleVictoryMessages, config.defeatMessages, config.femaleDefeatMessages ] - .map(messages => { - if (messages?.length) { - testMessages.push(...messages); - } - }); + [ + config.encounterMessages, + config.femaleEncounterMessages, + config.victoryMessages, + config.femaleVictoryMessages, + config.defeatMessages, + config.femaleDefeatMessages, + ].map(messages => { + if (messages?.length) { + testMessages.push(...messages); + } + }); } for (const message of testMessages) { - this.scene.pushPhase(new TestMessagePhase(this.scene, message)); + globalScene.pushPhase(new TestMessagePhase(message)); } this.end(); diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index fd48b91b1a1..024c1e3f837 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -1,4 +1,3 @@ -import BattleScene from "#app/battle-scene"; import { getCharVariantFromDialogue } from "#app/data/dialogue"; import { TrainerType } from "#app/enums/trainer-type"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -9,56 +8,122 @@ 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 { globalScene } from "#app/global-scene"; +import { Biome } from "#app/enums/biome"; +import { achvs } from "#app/system/achv"; export class TrainerVictoryPhase extends BattlePhase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start() { - this.scene.disableMenu = true; + globalScene.disableMenu = true; - this.scene.playBgm(this.scene.currentBattle.trainer?.config.victoryBgm); + globalScene.playBgm(globalScene.currentBattle.trainer?.config.victoryBgm); - this.scene.unshiftPhase(new MoneyRewardPhase(this.scene, this.scene.currentBattle.trainer?.config.moneyMultiplier!)); // TODO: is this bang correct? + globalScene.unshiftPhase(new MoneyRewardPhase(globalScene.currentBattle.trainer?.config.moneyMultiplier!)); // TODO: is this bang correct? - const modifierRewardFuncs = this.scene.currentBattle.trainer?.config.modifierRewardFuncs!; // TODO: is this bang correct? + const modifierRewardFuncs = globalScene.currentBattle.trainer?.config.modifierRewardFuncs!; // TODO: is this bang correct? for (const modifierRewardFunc of modifierRewardFuncs) { - this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, modifierRewardFunc)); + globalScene.unshiftPhase(new ModifierRewardPhase(modifierRewardFunc)); } - const trainerType = this.scene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct? + if (globalScene.eventManager.isEventActive()) { + for (const rewardFunc of globalScene.currentBattle.trainer?.config.eventRewardFuncs!) { + globalScene.unshiftPhase(new ModifierRewardPhase(rewardFunc)); + } + } + + const trainerType = globalScene.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])); + if ( + !globalScene.validateVoucher(vouchers[TrainerType[trainerType]]) && + globalScene.currentBattle.trainer?.config.isBoss + ) { + if (globalScene.eventManager.getUpgradeUnlockedVouchers()) { + globalScene.unshiftPhase( + new ModifierRewardPhase( + [ + modifierTypes.VOUCHER_PLUS, + modifierTypes.VOUCHER_PLUS, + modifierTypes.VOUCHER_PLUS, + modifierTypes.VOUCHER_PREMIUM, + ][vouchers[TrainerType[trainerType]].voucherType], + ), + ); + } else { + globalScene.unshiftPhase( + new ModifierRewardPhase( + [modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][ + vouchers[TrainerType[trainerType]].voucherType + ], + ), + ); + } } } + // Breeders in Space achievement + if ( + globalScene.arena.biomeType === Biome.SPACE && + (trainerType === TrainerType.BREEDER || trainerType === TrainerType.EXPERT_POKEMON_BREEDER) + ) { + globalScene.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? - let message: string; - this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(victoryMessages), this.scene.currentBattle.waveIndex); - message = message!; // tell TS compiler it's defined now + globalScene.ui.showText( + i18next.t("battle:trainerDefeated", { + trainerName: globalScene.currentBattle.trainer?.getName(TrainerSlot.NONE, true), + }), + null, + () => { + const victoryMessages = globalScene.currentBattle.trainer?.getVictoryMessages()!; // TODO: is this bang correct? + let message: string; + globalScene.executeWithSeedOffset( + () => (message = Utils.randSeedItem(victoryMessages)), + globalScene.currentBattle.waveIndex, + ); + message = message!; // tell TS compiler it's defined now - const showMessage = () => { - const originalFunc = showMessageOrEnd; - showMessageOrEnd = () => this.scene.ui.showDialogue(message, this.scene.currentBattle.trainer?.getName(TrainerSlot.TRAINER, true), null, originalFunc); - - showMessageOrEnd(); - }; - let showMessageOrEnd = () => this.end(); - if (victoryMessages?.length) { - if (this.scene.currentBattle.trainer?.config.hasCharSprite && !this.scene.ui.shouldSkipDialogue(message)) { + const showMessage = () => { const originalFunc = showMessageOrEnd; - showMessageOrEnd = () => this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => originalFunc())); - this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(this.scene.currentBattle.trainer?.getKey()!, getCharVariantFromDialogue(victoryMessages[0])).then(() => showMessage())); // TODO: is this bang correct? + showMessageOrEnd = () => + globalScene.ui.showDialogue( + message, + globalScene.currentBattle.trainer?.getName(TrainerSlot.TRAINER, true), + null, + originalFunc, + ); + + showMessageOrEnd(); + }; + let showMessageOrEnd = () => this.end(); + if (victoryMessages?.length) { + if (globalScene.currentBattle.trainer?.config.hasCharSprite && !globalScene.ui.shouldSkipDialogue(message)) { + const originalFunc = showMessageOrEnd; + showMessageOrEnd = () => + globalScene.charSprite.hide().then(() => globalScene.hideFieldOverlay(250).then(() => originalFunc())); + globalScene + .showFieldOverlay(500) + .then(() => + globalScene.charSprite + .showCharacter( + globalScene.currentBattle.trainer?.getKey()!, + getCharVariantFromDialogue(victoryMessages[0]), + ) + .then(() => showMessage()), + ); // TODO: is this bang correct? + } else { + showMessage(); + } } else { - showMessage(); + showMessageOrEnd(); } - } else { - showMessageOrEnd(); - } - }, null, true); + }, + null, + true, + ); this.showEnemyTrainer(); } diff --git a/src/phases/turn-end-phase.ts b/src/phases/turn-end-phase.ts index 60a2e6600db..c55f6d69a58 100644 --- a/src/phases/turn-end-phase.ts +++ b/src/phases/turn-end-phase.ts @@ -1,47 +1,63 @@ -import BattleScene from "#app/battle-scene"; import { applyPostTurnAbAttrs, PostTurnAbAttr } from "#app/data/ability"; import { BattlerTagLapseType } from "#app/data/battler-tags"; import { TerrainType } from "#app/data/terrain"; import { WeatherType } from "#app/enums/weather-type"; import { TurnEndEvent } from "#app/events/battle-scene"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; -import { TurnHealModifier, EnemyTurnHealModifier, EnemyStatusEffectHealChanceModifier, TurnStatusEffectModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier"; +import { + TurnHealModifier, + EnemyTurnHealModifier, + EnemyStatusEffectHealChanceModifier, + TurnStatusEffectModifier, + TurnHeldItemTransferModifier, +} from "#app/modifier/modifier"; import i18next from "i18next"; import { FieldPhase } from "./field-phase"; import { PokemonHealPhase } from "./pokemon-heal-phase"; +import { globalScene } from "#app/global-scene"; export class TurnEndPhase extends FieldPhase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start() { super.start(); - this.scene.currentBattle.incrementTurn(this.scene); - this.scene.eventTarget.dispatchEvent(new TurnEndEvent(this.scene.currentBattle.turn)); + globalScene.currentBattle.incrementTurn(); + globalScene.eventTarget.dispatchEvent(new TurnEndEvent(globalScene.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); + globalScene.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 (globalScene.arena.terrain?.terrainType === TerrainType.GRASSY && pokemon.isGrounded()) { + globalScene.unshiftPhase( + new PokemonHealPhase( + pokemon.getBattlerIndex(), + Math.max(pokemon.getMaxHp() >> 4, 1), + i18next.t("battle:turnEndHpRestore", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + true, + ), + ); + } + + if (!pokemon.isPlayer()) { + globalScene.applyModifiers(EnemyTurnHealModifier, false, pokemon); + globalScene.applyModifier(EnemyStatusEffectHealChanceModifier, false, pokemon); + } + + applyPostTurnAbAttrs(PostTurnAbAttr, pokemon); } - if (!pokemon.isPlayer()) { - this.scene.applyModifiers(EnemyTurnHealModifier, false, pokemon); - this.scene.applyModifier(EnemyStatusEffectHealChanceModifier, false, pokemon); - } + globalScene.applyModifiers(TurnStatusEffectModifier, pokemon.isPlayer(), pokemon); - applyPostTurnAbAttrs(PostTurnAbAttr, pokemon); - - this.scene.applyModifiers(TurnStatusEffectModifier, pokemon.isPlayer(), pokemon); - - this.scene.applyModifiers(TurnHeldItemTransferModifier, pokemon.isPlayer(), pokemon); + globalScene.applyModifiers(TurnHeldItemTransferModifier, pokemon.isPlayer(), pokemon); pokemon.battleSummonData.turnCount++; pokemon.battleSummonData.waveTurnCount++; @@ -49,15 +65,15 @@ export class TurnEndPhase extends FieldPhase { this.executeForAll(handlePokemon); - this.scene.arena.lapseTags(); + globalScene.arena.lapseTags(); - if (this.scene.arena.weather && !this.scene.arena.weather.lapse()) { - this.scene.arena.trySetWeather(WeatherType.NONE, false); - this.scene.arena.triggerWeatherBasedFormChangesToNormal(); + if (globalScene.arena.weather && !globalScene.arena.weather.lapse()) { + globalScene.arena.trySetWeather(WeatherType.NONE, false); + globalScene.arena.triggerWeatherBasedFormChangesToNormal(); } - if (this.scene.arena.terrain && !this.scene.arena.terrain.lapse()) { - this.scene.arena.trySetTerrain(TerrainType.NONE, false); + if (globalScene.arena.terrain && !globalScene.arena.terrain.lapse()) { + globalScene.arena.trySetTerrain(TerrainType.NONE, false); } this.end(); diff --git a/src/phases/turn-init-phase.ts b/src/phases/turn-init-phase.ts index 2f1b539cdcf..3104b65eb3f 100644 --- a/src/phases/turn-init-phase.ts +++ b/src/phases/turn-init-phase.ts @@ -1,36 +1,42 @@ -import BattleScene from "#app/battle-scene"; import { BattlerIndex } from "#app/battle"; +import { + handleMysteryEncounterBattleStartEffects, + handleMysteryEncounterTurnStartEffects, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { TurnInitEvent } from "#app/events/battle-scene"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; -import { FieldPhase } from "./field-phase"; -import { ToggleDoublePositionPhase } from "./toggle-double-position-phase"; import { CommandPhase } from "./command-phase"; import { EnemyCommandPhase } from "./enemy-command-phase"; +import { FieldPhase } from "./field-phase"; import { GameOverPhase } from "./game-over-phase"; +import { ToggleDoublePositionPhase } from "./toggle-double-position-phase"; import { TurnStartPhase } from "./turn-start-phase"; -import { handleMysteryEncounterBattleStartEffects, handleMysteryEncounterTurnStartEffects } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { globalScene } from "#app/global-scene"; export class TurnInitPhase extends FieldPhase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start() { super.start(); - this.scene.getPlayerField().forEach(p => { + globalScene.getPlayerField().forEach(p => { // If this pokemon is in play and evolved into something illegal under the current challenge, force a switch if (p.isOnField() && !p.isAllowedInBattle()) { - this.scene.queueMessage(i18next.t("challenges:illegalEvolution", { "pokemon": p.name }), null, true); + globalScene.queueMessage(i18next.t("challenges:illegalEvolution", { pokemon: p.name }), null, true); - const allowedPokemon = this.scene.getParty().filter(p => p.isAllowedInBattle()); + const allowedPokemon = globalScene.getPokemonAllowedInBattle(); if (!allowedPokemon.length) { // If there are no longer any legal pokemon in the party, game over. - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new GameOverPhase(this.scene)); - } else if (allowedPokemon.length >= this.scene.currentBattle.getBattlerCount() || (this.scene.currentBattle.double && !allowedPokemon[0].isActive(true))) { + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new GameOverPhase()); + } else if ( + allowedPokemon.length >= globalScene.currentBattle.getBattlerCount() || + (globalScene.currentBattle.double && !allowedPokemon[0].isActive(true)) + ) { // If there is at least one pokemon in the back that is legal to switch in, force a switch. p.switchOut(); } else { @@ -38,36 +44,35 @@ export class TurnInitPhase extends FieldPhase { // This should only happen in double battles. p.leaveField(); } - if (allowedPokemon.length === 1 && this.scene.currentBattle.double) { - this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); + if (allowedPokemon.length === 1 && globalScene.currentBattle.double) { + globalScene.unshiftPhase(new ToggleDoublePositionPhase(true)); } } }); - //this.scene.pushPhase(new MoveAnimTestPhase(this.scene)); - this.scene.eventTarget.dispatchEvent(new TurnInitEvent()); + globalScene.eventTarget.dispatchEvent(new TurnInitEvent()); - handleMysteryEncounterBattleStartEffects(this.scene); + handleMysteryEncounterBattleStartEffects(); // If true, will skip remainder of current phase (and not queue CommandPhases etc.) - if (handleMysteryEncounterTurnStartEffects(this.scene)) { + if (handleMysteryEncounterTurnStartEffects()) { this.end(); return; } - this.scene.getField().forEach((pokemon, i) => { + globalScene.getField().forEach((pokemon, i) => { if (pokemon?.isActive()) { if (pokemon.isPlayer()) { - this.scene.currentBattle.addParticipant(pokemon as PlayerPokemon); + globalScene.currentBattle.addParticipant(pokemon as PlayerPokemon); } pokemon.resetTurnData(); - this.scene.pushPhase(pokemon.isPlayer() ? new CommandPhase(this.scene, i) : new EnemyCommandPhase(this.scene, i - BattlerIndex.ENEMY)); + globalScene.pushPhase(pokemon.isPlayer() ? new CommandPhase(i) : new EnemyCommandPhase(i - BattlerIndex.ENEMY)); } }); - this.scene.pushPhase(new TurnStartPhase(this.scene)); + globalScene.pushPhase(new TurnStartPhase()); this.end(); } diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index 497d449912f..6065a0caf6e 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -1,9 +1,9 @@ -import BattleScene from "#app/battle-scene"; -import { applyAbAttrs, BypassSpeedChanceAbAttr, PreventBypassSpeedChanceAbAttr, ChangeMovePriorityAbAttr } from "#app/data/ability"; -import { allMoves, applyMoveAttrs, IncrementMovePriorityAttr, MoveHeaderAttr } from "#app/data/move"; +import { applyAbAttrs, BypassSpeedChanceAbAttr, PreventBypassSpeedChanceAbAttr } from "#app/data/ability"; +import { allMoves, MoveHeaderAttr } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; -import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import { BypassSpeedChanceModifier } from "#app/modifier/modifier"; import { Command } from "#app/ui/command-ui-handler"; import * as Utils from "#app/utils"; @@ -20,10 +20,12 @@ import { CheckStatusEffectPhase } from "#app/phases/check-status-effect-phase"; import { BattlerIndex } from "#app/battle"; import { TrickRoomTag } from "#app/data/arena-tag"; import { SwitchType } from "#enums/switch-type"; +import { globalScene } from "#app/global-scene"; +import { TeraPhase } from "./tera-phase"; export class TurnStartPhase extends FieldPhase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } /** @@ -32,20 +34,24 @@ export class TurnStartPhase extends FieldPhase { * @returns {@linkcode BattlerIndex[]} the battle indices of all pokemon on the field ordered by speed */ getSpeedOrder(): BattlerIndex[] { - const playerField = this.scene.getPlayerField().filter(p => p.isActive()) as Pokemon[]; - const enemyField = this.scene.getEnemyField().filter(p => p.isActive()) as Pokemon[]; + const playerField = globalScene.getPlayerField().filter(p => p.isActive()) as Pokemon[]; + const enemyField = globalScene.getEnemyField().filter(p => p.isActive()) as Pokemon[]; // We shuffle the list before sorting so speed ties produce random results let orderedTargets: Pokemon[] = playerField.concat(enemyField); // We seed it with the current turn to prevent an inconsistency where it // was varying based on how long since you last reloaded - this.scene.executeWithSeedOffset(() => { - orderedTargets = Utils.randSeedShuffle(orderedTargets); - }, this.scene.currentBattle.turn, this.scene.waveSeed); + globalScene.executeWithSeedOffset( + () => { + orderedTargets = Utils.randSeedShuffle(orderedTargets); + }, + globalScene.currentBattle.turn, + globalScene.waveSeed, + ); // Next, a check for Trick Room is applied to determine sort order. const speedReversed = new Utils.BooleanHolder(false); - this.scene.arena.applyTags(TrickRoomTag, false, speedReversed); + globalScene.arena.applyTags(TrickRoomTag, false, speedReversed); // Adjust the sort function based on whether Trick Room is active. orderedTargets.sort((a: Pokemon, b: Pokemon) => { @@ -70,54 +76,54 @@ export class TurnStartPhase extends FieldPhase { // This occurs before the main loop because of battles with more than two Pokemon const battlerBypassSpeed = {}; - this.scene.getField(true).filter(p => p.summonData).map(p => { - const bypassSpeed = new Utils.BooleanHolder(false); - const canCheckHeldItems = new Utils.BooleanHolder(true); - applyAbAttrs(BypassSpeedChanceAbAttr, p, null, false, bypassSpeed); - applyAbAttrs(PreventBypassSpeedChanceAbAttr, p, null, false, bypassSpeed, canCheckHeldItems); - if (canCheckHeldItems.value) { - this.scene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); - } - battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; - }); + globalScene + .getField(true) + .filter(p => p.summonData) + .map(p => { + const bypassSpeed = new Utils.BooleanHolder(false); + const canCheckHeldItems = new Utils.BooleanHolder(true); + applyAbAttrs(BypassSpeedChanceAbAttr, p, null, false, bypassSpeed); + applyAbAttrs(PreventBypassSpeedChanceAbAttr, p, null, false, bypassSpeed, canCheckHeldItems); + if (canCheckHeldItems.value) { + globalScene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); + } + battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; + }); // The function begins sorting orderedTargets based on command priority, move priority, and possible speed bypasses. // Non-FIGHT commands (SWITCH, BALL, RUN) have a higher command priority and will always occur before any FIGHT commands. moveOrder = moveOrder.slice(0); moveOrder.sort((a, b) => { - const aCommand = this.scene.currentBattle.turnCommands[a]; - const bCommand = this.scene.currentBattle.turnCommands[b]; + const aCommand = globalScene.currentBattle.turnCommands[a]; + const bCommand = globalScene.currentBattle.turnCommands[b]; if (aCommand?.command !== bCommand?.command) { if (aCommand?.command === Command.FIGHT) { return 1; - } else if (bCommand?.command === Command.FIGHT) { + } + if (bCommand?.command === Command.FIGHT) { return -1; } } else if (aCommand?.command === Command.FIGHT) { const aMove = allMoves[aCommand.move!.move]; const bMove = allMoves[bCommand!.move!.move]; - // The game now considers priority and applies the relevant move and ability attributes - const aPriority = new Utils.IntegerHolder(aMove.priority); - const bPriority = new Utils.IntegerHolder(bMove.priority); + const aUser = globalScene.getField(true).find(p => p.getBattlerIndex() === a)!; + const bUser = globalScene.getField(true).find(p => p.getBattlerIndex() === b)!; - applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a)!, null, aMove, aPriority); - applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b)!, null, bMove, bPriority); - - applyAbAttrs(ChangeMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a)!, null, false, aMove, aPriority); - applyAbAttrs(ChangeMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b)!, null, false, bMove, bPriority); + const aPriority = aMove.getPriority(aUser, false); + const bPriority = bMove.getPriority(bUser, false); // The game now checks for differences in priority levels. // If the moves share the same original priority bracket, it can check for differences in battlerBypassSpeed and return the result. // This conditional is used to ensure that Quick Claw can still activate with abilities like Stall and Mycelium Might (attack moves only) // Otherwise, the game returns the user of the move with the highest priority. - const isSameBracket = Math.ceil(aPriority.value) - Math.ceil(bPriority.value) === 0; - if (aPriority.value !== bPriority.value) { + const isSameBracket = Math.ceil(aPriority) - Math.ceil(bPriority) === 0; + if (aPriority !== bPriority) { if (isSameBracket && battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value) { return battlerBypassSpeed[a].value ? -1 : 1; } - return aPriority.value < bPriority.value ? 1 : -1; + return aPriority < bPriority ? 1 : -1; } } @@ -137,15 +143,28 @@ export class TurnStartPhase extends FieldPhase { start() { super.start(); - const field = this.scene.getField(); + const field = globalScene.getField(); const moveOrder = this.getCommandOrder(); let orderIndex = 0; - for (const o of moveOrder) { - + for (const o of this.getSpeedOrder()) { const pokemon = field[o]; - const turnCommand = this.scene.currentBattle.turnCommands[o]; + const preTurnCommand = globalScene.currentBattle.preTurnCommands[o]; + + if (preTurnCommand?.skip) { + continue; + } + + switch (preTurnCommand?.command) { + case Command.TERA: + globalScene.pushPhase(new TeraPhase(pokemon)); + } + } + + for (const o of moveOrder) { + const pokemon = field[o]; + const turnCommand = globalScene.currentBattle.turnCommands[o]; if (turnCommand?.skip) { continue; @@ -158,65 +177,85 @@ export class TurnStartPhase extends FieldPhase { if (!queuedMove) { continue; } - const move = pokemon.getMoveset().find(m => m?.moveId === queuedMove.move && m?.ppUsed < m?.getMovePp()) || new PokemonMove(queuedMove.move); + const move = + pokemon.getMoveset().find(m => m?.moveId === queuedMove.move && m?.ppUsed < m?.getMovePp()) || + new PokemonMove(queuedMove.move); if (move.getMove().hasAttr(MoveHeaderAttr)) { - this.scene.unshiftPhase(new MoveHeaderPhase(this.scene, pokemon, move)); + globalScene.unshiftPhase(new MoveHeaderPhase(pokemon, move)); } if (pokemon.isPlayer()) { if (turnCommand.cursor === -1) { - this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move));//TODO: is the bang correct here? + globalScene.pushPhase(new MovePhase(pokemon, turnCommand.targets || turnCommand.move!.targets, move)); //TODO: is the bang correct here? } else { - const playerPhase = new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP);//TODO: is the bang correct here? - this.scene.pushPhase(playerPhase); + const playerPhase = new MovePhase( + pokemon, + turnCommand.targets || turnCommand.move!.targets, + move, + false, + queuedMove.ignorePP, + ); //TODO: is the bang correct here? + globalScene.pushPhase(playerPhase); } } else { - this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP));//TODO: is the bang correct here? + globalScene.pushPhase( + new MovePhase( + pokemon, + turnCommand.targets || turnCommand.move!.targets, + move, + false, + queuedMove.ignorePP, + ), + ); //TODO: is the bang correct here? } break; case Command.BALL: - this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, turnCommand.targets![0] % 2, turnCommand.cursor!));//TODO: is the bang correct here? + globalScene.unshiftPhase(new AttemptCapturePhase(turnCommand.targets![0] % 2, turnCommand.cursor!)); //TODO: is the bang correct here? break; case Command.POKEMON: const switchType = turnCommand.args?.[0] ? SwitchType.BATON_PASS : SwitchType.SWITCH; - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, switchType, pokemon.getFieldIndex(), turnCommand.cursor!, true, pokemon.isPlayer())); + globalScene.unshiftPhase( + new SwitchSummonPhase(switchType, pokemon.getFieldIndex(), turnCommand.cursor!, true, pokemon.isPlayer()), + ); break; case Command.RUN: let runningPokemon = pokemon; - if (this.scene.currentBattle.double) { + if (globalScene.currentBattle.double) { const playerActivePokemon = field.filter(pokemon => { - if (!!pokemon) { + if (pokemon) { return pokemon.isPlayer() && pokemon.isActive(); - } else { - return; } + return; }); // if only one pokemon is alive, use that one if (playerActivePokemon.length > 1) { - // find which active pokemon has faster speed - const fasterPokemon = playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) ? playerActivePokemon[0] : playerActivePokemon[1]; + // find which active pokemon has faster speed + const fasterPokemon = + playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) + ? playerActivePokemon[0] + : playerActivePokemon[1]; // check if either active pokemon has the ability "Run Away" const hasRunAway = playerActivePokemon.find(p => p.hasAbility(Abilities.RUN_AWAY)); runningPokemon = hasRunAway !== undefined ? hasRunAway : fasterPokemon; } } - this.scene.unshiftPhase(new AttemptRunPhase(this.scene, runningPokemon.getFieldIndex())); + globalScene.unshiftPhase(new AttemptRunPhase(runningPokemon.getFieldIndex())); break; } } - this.scene.pushPhase(new WeatherEffectPhase(this.scene)); + globalScene.pushPhase(new WeatherEffectPhase()); + globalScene.pushPhase(new BerryPhase()); /** Add a new phase to check who should be taking status damage */ - this.scene.pushPhase(new CheckStatusEffectPhase(this.scene, moveOrder)); + globalScene.pushPhase(new CheckStatusEffectPhase(moveOrder)); - this.scene.pushPhase(new BerryPhase(this.scene)); - this.scene.pushPhase(new TurnEndPhase(this.scene)); + globalScene.pushPhase(new TurnEndPhase()); /** - * this.end() will call shiftPhase(), which dumps everything from PrependQueue (aka everything that is unshifted()) to the front - * of the queue and dequeues to start the next phase - * this is important since stuff like SwitchSummon, AttemptRun, AttemptCapture Phases break the "flow" and should take precedence - */ + * this.end() will call shiftPhase(), which dumps everything from PrependQueue (aka everything that is unshifted()) to the front + * of the queue and dequeues to start the next phase + * this is important since stuff like SwitchSummon, AttemptRun, AttemptCapture Phases break the "flow" and should take precedence + */ this.end(); } } diff --git a/src/phases/unavailable-phase.ts b/src/phases/unavailable-phase.ts index 59bfca7875e..c0b5d4224c5 100644 --- a/src/phases/unavailable-phase.ts +++ b/src/phases/unavailable-phase.ts @@ -1,16 +1,16 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; import { Mode } from "#app/ui/ui"; import { LoginPhase } from "./login-phase"; export class UnavailablePhase extends Phase { - constructor(scene: BattleScene) { - super(scene); + constructor() { + super(); } start(): void { - this.scene.ui.setMode(Mode.UNAVAILABLE, () => { - this.scene.unshiftPhase(new LoginPhase(this.scene, true)); + globalScene.ui.setMode(Mode.UNAVAILABLE, () => { + globalScene.unshiftPhase(new LoginPhase(true)); this.end(); }); } diff --git a/src/phases/unlock-phase.ts b/src/phases/unlock-phase.ts index 65060309a6c..b420a4b3a61 100644 --- a/src/phases/unlock-phase.ts +++ b/src/phases/unlock-phase.ts @@ -1,28 +1,38 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; -import { Unlockables, getUnlockableName } from "#app/system/unlockables"; +import type { Unlockables } from "#app/system/unlockables"; +import { getUnlockableName } from "#app/system/unlockables"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; export class UnlockPhase extends Phase { private unlockable: Unlockables; - constructor(scene: BattleScene, unlockable: Unlockables) { - super(scene); + constructor(unlockable: Unlockables) { + super(); this.unlockable = unlockable; } start(): void { - this.scene.time.delayedCall(2000, () => { - this.scene.gameData.unlocks[this.unlockable] = true; + globalScene.time.delayedCall(2000, () => { + globalScene.gameData.unlocks[this.unlockable] = true; // Sound loaded into game as is - this.scene.playSound("level_up_fanfare"); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:unlockedSomething", { unlockedThing: getUnlockableName(this.unlockable) }), null, () => { - this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); - this.end(); - }, null, true, 1500); + globalScene.playSound("level_up_fanfare"); + globalScene.ui.setMode(Mode.MESSAGE); + globalScene.ui.showText( + i18next.t("battle:unlockedSomething", { + unlockedThing: getUnlockableName(this.unlockable), + }), + null, + () => { + globalScene.time.delayedCall(1500, () => globalScene.arenaBg.setVisible(true)); + this.end(); + }, + null, + true, + 1500, + ); }); } } diff --git a/src/phases/victory-phase.ts b/src/phases/victory-phase.ts index 1faa31655df..78bf72195e8 100644 --- a/src/phases/victory-phase.ts +++ b/src/phases/victory-phase.ts @@ -1,6 +1,7 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex, BattleType, ClassicFixedBossWaves } from "#app/battle"; -import { CustomModifierSettings, modifierTypes } from "#app/modifier/modifier-type"; +import type { BattlerIndex } from "#app/battle"; +import { BattleType, ClassicFixedBossWaves } from "#app/battle"; +import type { CustomModifierSettings } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { BattleEndPhase } from "./battle-end-phase"; import { NewBattlePhase } from "./new-battle-phase"; import { PokemonPhase } from "./pokemon-phase"; @@ -11,13 +12,14 @@ import { ModifierRewardPhase } from "./modifier-reward-phase"; import { SelectModifierPhase } from "./select-modifier-phase"; import { TrainerVictoryPhase } from "./trainer-victory-phase"; import { handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { globalScene } from "#app/global-scene"; export class VictoryPhase extends PokemonPhase { /** If true, indicates that the phase is intended for EXP purposes only, and not to continue a battle to next phase */ isExpOnly: boolean; - constructor(scene: BattleScene, battlerIndex: BattlerIndex | integer, isExpOnly: boolean = false) { - super(scene, battlerIndex); + constructor(battlerIndex: BattlerIndex | number, isExpOnly = false) { + super(battlerIndex); this.isExpOnly = isExpOnly; } @@ -25,61 +27,86 @@ export class VictoryPhase extends PokemonPhase { start() { super.start(); - const isMysteryEncounter = this.scene.currentBattle.isBattleMysteryEncounter(); + const isMysteryEncounter = globalScene.currentBattle.isBattleMysteryEncounter(); // update Pokemon defeated count except for MEs that disable it - if (!isMysteryEncounter || !this.scene.currentBattle.mysteryEncounter?.preventGameStatsUpdates) { - this.scene.gameData.gameStats.pokemonDefeated++; + if (!isMysteryEncounter || !globalScene.currentBattle.mysteryEncounter?.preventGameStatsUpdates) { + globalScene.gameData.gameStats.pokemonDefeated++; } const expValue = this.getPokemon().getExpValue(); - this.scene.applyPartyExp(expValue, true); + globalScene.applyPartyExp(expValue, true); if (isMysteryEncounter) { - handleMysteryEncounterVictory(this.scene, false, this.isExpOnly); + handleMysteryEncounterVictory(false, this.isExpOnly); return this.end(); } - if (!this.scene.getEnemyParty().find(p => this.scene.currentBattle.battleType === BattleType.WILD ? p.isOnField() : !p?.isFainted(true))) { - this.scene.pushPhase(new BattleEndPhase(this.scene)); - if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - this.scene.pushPhase(new TrainerVictoryPhase(this.scene)); + if ( + !globalScene + .getEnemyParty() + .find(p => (globalScene.currentBattle.battleType === BattleType.WILD ? p.isOnField() : !p?.isFainted(true))) + ) { + globalScene.pushPhase(new BattleEndPhase(true)); + if (globalScene.currentBattle.battleType === BattleType.TRAINER) { + globalScene.pushPhase(new TrainerVictoryPhase()); } - if (this.scene.gameMode.isEndless || !this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) { - this.scene.pushPhase(new EggLapsePhase(this.scene)); - if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex === ClassicFixedBossWaves.EVIL_BOSS_2) { + if (globalScene.gameMode.isEndless || !globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) { + globalScene.pushPhase(new EggLapsePhase()); + if ( + globalScene.gameMode.isClassic && + globalScene.currentBattle.waveIndex === ClassicFixedBossWaves.EVIL_BOSS_2 + ) { // Should get Lock Capsule on 165 before shop phase so it can be used in the rewards shop - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.LOCK_CAPSULE)); + globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.LOCK_CAPSULE)); } - if (this.scene.currentBattle.waveIndex % 10) { - this.scene.pushPhase(new SelectModifierPhase(this.scene, undefined, undefined, this.getFixedBattleCustomModifiers())); - } else if (this.scene.gameMode.isDaily) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.EXP_CHARM)); - if (this.scene.currentBattle.waveIndex > 10 && !this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.GOLDEN_POKEBALL)); + if (globalScene.currentBattle.waveIndex % 10) { + globalScene.pushPhase(new SelectModifierPhase(undefined, undefined, this.getFixedBattleCustomModifiers())); + } else if (globalScene.gameMode.isDaily) { + globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.EXP_CHARM)); + if ( + globalScene.currentBattle.waveIndex > 10 && + !globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex) + ) { + globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.GOLDEN_POKEBALL)); } } else { - const superExpWave = !this.scene.gameMode.isEndless ? (this.scene.offsetGym ? 0 : 20) : 10; - if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex === 10) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.EXP_SHARE)); + const superExpWave = !globalScene.gameMode.isEndless ? (globalScene.offsetGym ? 0 : 20) : 10; + if (globalScene.gameMode.isEndless && globalScene.currentBattle.waveIndex === 10) { + globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.EXP_SHARE)); } - if (this.scene.currentBattle.waveIndex <= 750 && (this.scene.currentBattle.waveIndex <= 500 || (this.scene.currentBattle.waveIndex % 30) === superExpWave)) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, (this.scene.currentBattle.waveIndex % 30) !== superExpWave || this.scene.currentBattle.waveIndex > 250 ? modifierTypes.EXP_CHARM : modifierTypes.SUPER_EXP_CHARM)); + if ( + globalScene.currentBattle.waveIndex <= 750 && + (globalScene.currentBattle.waveIndex <= 500 || globalScene.currentBattle.waveIndex % 30 === superExpWave) + ) { + globalScene.pushPhase( + new ModifierRewardPhase( + globalScene.currentBattle.waveIndex % 30 !== superExpWave || globalScene.currentBattle.waveIndex > 250 + ? modifierTypes.EXP_CHARM + : modifierTypes.SUPER_EXP_CHARM, + ), + ); } - if (this.scene.currentBattle.waveIndex <= 150 && !(this.scene.currentBattle.waveIndex % 50)) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.GOLDEN_POKEBALL)); + if (globalScene.currentBattle.waveIndex <= 150 && !(globalScene.currentBattle.waveIndex % 50)) { + globalScene.pushPhase(new ModifierRewardPhase(modifierTypes.GOLDEN_POKEBALL)); } - if (this.scene.gameMode.isEndless && !(this.scene.currentBattle.waveIndex % 50)) { - this.scene.pushPhase(new ModifierRewardPhase(this.scene, !(this.scene.currentBattle.waveIndex % 250) ? modifierTypes.VOUCHER_PREMIUM : modifierTypes.VOUCHER_PLUS)); - this.scene.pushPhase(new AddEnemyBuffModifierPhase(this.scene)); + if (globalScene.gameMode.isEndless && !(globalScene.currentBattle.waveIndex % 50)) { + globalScene.pushPhase( + new ModifierRewardPhase( + !(globalScene.currentBattle.waveIndex % 250) + ? modifierTypes.VOUCHER_PREMIUM + : modifierTypes.VOUCHER_PLUS, + ), + ); + globalScene.pushPhase(new AddEnemyBuffModifierPhase()); } } - this.scene.pushPhase(new NewBattlePhase(this.scene)); + globalScene.pushPhase(new NewBattlePhase()); } else { - this.scene.currentBattle.battleType = BattleType.CLEAR; - this.scene.score += this.scene.gameMode.getClearScoreBonus(); - this.scene.updateScoreText(); - this.scene.pushPhase(new GameOverPhase(this.scene, true)); + globalScene.currentBattle.battleType = BattleType.CLEAR; + globalScene.score += globalScene.gameMode.getClearScoreBonus(); + globalScene.updateScoreText(); + globalScene.pushPhase(new GameOverPhase(true)); } } @@ -91,8 +118,8 @@ export class VictoryPhase extends PokemonPhase { * will pass those settings to the upcoming {@linkcode SelectModifierPhase}`. */ getFixedBattleCustomModifiers(): CustomModifierSettings | undefined { - const gameMode = this.scene.gameMode; - const waveIndex = this.scene.currentBattle.waveIndex; + const gameMode = globalScene.gameMode; + const waveIndex = globalScene.currentBattle.waveIndex; if (gameMode.isFixedBattle(waveIndex)) { return gameMode.getFixedBattle(waveIndex).customModifierRewardSettings; } diff --git a/src/phases/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts index b48ee342780..9199b7996bc 100644 --- a/src/phases/weather-effect-phase.ts +++ b/src/phases/weather-effect-phase.ts @@ -1,24 +1,38 @@ -import BattleScene from "#app/battle-scene"; -import { applyPreWeatherEffectAbAttrs, SuppressWeatherEffectAbAttr, PreWeatherDamageAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPostWeatherLapseAbAttrs, PostWeatherLapseAbAttr } from "#app/data/ability"; +import { globalScene } from "#app/global-scene"; +import { + applyPreWeatherEffectAbAttrs, + SuppressWeatherEffectAbAttr, + PreWeatherDamageAbAttr, + applyAbAttrs, + BlockNonDirectDamageAbAttr, + applyPostWeatherLapseAbAttrs, + PostWeatherLapseAbAttr, +} from "#app/data/ability"; import { CommonAnim } from "#app/data/battle-anims"; -import { Weather, getWeatherDamageMessage, getWeatherLapseMessage } from "#app/data/weather"; +import type { Weather } from "#app/data/weather"; +import { getWeatherDamageMessage, getWeatherLapseMessage } from "#app/data/weather"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { WeatherType } from "#app/enums/weather-type"; -import Pokemon, { HitResult } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { HitResult } from "#app/field/pokemon"; import * as Utils from "#app/utils"; import { CommonAnimPhase } from "./common-anim-phase"; export class WeatherEffectPhase extends CommonAnimPhase { public weather: Weather | null; - constructor(scene: BattleScene) { - super(scene, undefined, undefined, CommonAnim.SUNNY + ((scene?.arena?.weather?.weatherType || WeatherType.NONE) - 1)); - this.weather = scene?.arena?.weather; + constructor() { + super( + undefined, + undefined, + CommonAnim.SUNNY + ((globalScene?.arena?.weather?.weatherType || WeatherType.NONE) - 1), + ); + this.weather = globalScene?.arena?.weather; } start() { // Update weather state with any changes that occurred during the turn - this.weather = this.scene?.arena?.weather; + this.weather = globalScene?.arena?.weather; if (!this.weather) { this.end(); @@ -28,10 +42,11 @@ export class WeatherEffectPhase extends CommonAnimPhase { this.setAnimation(CommonAnim.SUNNY + (this.weather.weatherType - 1)); if (this.weather.isDamaging()) { - const cancelled = new Utils.BooleanHolder(false); - this.executeForAll((pokemon: Pokemon) => applyPreWeatherEffectAbAttrs(SuppressWeatherEffectAbAttr, pokemon, this.weather, cancelled)); + this.executeForAll((pokemon: Pokemon) => + applyPreWeatherEffectAbAttrs(SuppressWeatherEffectAbAttr, pokemon, this.weather, cancelled), + ); if (!cancelled.value) { const inflictDamage = (pokemon: Pokemon) => { @@ -40,18 +55,25 @@ export class WeatherEffectPhase extends CommonAnimPhase { applyPreWeatherEffectAbAttrs(PreWeatherDamageAbAttr, pokemon, this.weather, cancelled); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); - if (cancelled.value || pokemon.getTag(BattlerTagType.UNDERGROUND) || pokemon.getTag(BattlerTagType.UNDERWATER)) { + if ( + cancelled.value || + pokemon.getTag(BattlerTagType.UNDERGROUND) || + pokemon.getTag(BattlerTagType.UNDERWATER) + ) { return; } const damage = Utils.toDmgValue(pokemon.getMaxHp() / 16); - this.scene.queueMessage(getWeatherDamageMessage(this.weather?.weatherType!, pokemon)!); // TODO: are those bangs correct? + globalScene.queueMessage(getWeatherDamageMessage(this.weather?.weatherType!, pokemon)!); // TODO: are those bangs correct? pokemon.damageAndUpdate(damage, HitResult.EFFECTIVE, false, false, true); }; 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 +81,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)); + globalScene.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/pipelines/field-sprite.ts b/src/pipelines/field-sprite.ts index c370f5586e5..547281d7dee 100644 --- a/src/pipelines/field-sprite.ts +++ b/src/pipelines/field-sprite.ts @@ -1,4 +1,4 @@ -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import { TerrainType, getTerrainColor } from "../data/terrain"; import * as Utils from "../utils"; @@ -208,41 +208,54 @@ void main() { export default class FieldSpritePipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { constructor(game: Phaser.Game, config?: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig) { - super(config || { - game: game, - name: "field-sprite", - fragShader: spriteFragShader, - vertShader: spriteVertShader - }); + super( + config || { + game: game, + name: "field-sprite", + fragShader: spriteFragShader, + vertShader: spriteVertShader, + }, + ); } onPreRender(): void { this.set1f("time", 0); this.set1i("ignoreTimeTint", 0); this.set1f("terrainColorRatio", 0); - this.set3fv("terrainColor", [ 0, 0, 0 ]); + this.set3fv("terrainColor", [0, 0, 0]); } onBind(gameObject: Phaser.GameObjects.GameObject): void { super.onBind(); const sprite = gameObject as Phaser.GameObjects.Sprite | Phaser.GameObjects.NineSlice; - const scene = sprite.scene as BattleScene; const data = sprite.pipelineData; const ignoreTimeTint = data["ignoreTimeTint"] as boolean; - const terrainColorRatio = data["terrainColorRatio"] as number || 0; + const terrainColorRatio = (data["terrainColorRatio"] as number) || 0; - const time = scene.currentBattle?.waveIndex - ? ((scene.currentBattle.waveIndex + scene.waveCycleOffset) % 40) / 40 // ((new Date().getSeconds() * 1000 + new Date().getMilliseconds()) % 10000) / 10000 + const time = globalScene.currentBattle?.waveIndex + ? ((globalScene.currentBattle.waveIndex + globalScene.waveCycleOffset) % 40) / 40 // ((new Date().getSeconds() * 1000 + new Date().getMilliseconds()) % 10000) / 10000 : Utils.getCurrentTime(); this.set1f("time", time); this.set1i("ignoreTimeTint", ignoreTimeTint ? 1 : 0); - this.set1i("isOutside", scene.arena.isOutside() ? 1 : 0); - this.set3fv("dayTint", scene.arena.getDayTint().map(c => c / 255)); - this.set3fv("duskTint", scene.arena.getDuskTint().map(c => c / 255)); - this.set3fv("nightTint", scene.arena.getNightTint().map(c => c / 255)); - this.set3fv("terrainColor", getTerrainColor(scene.arena.terrain?.terrainType || TerrainType.NONE).map(c => c / 255)); + this.set1i("isOutside", globalScene.arena.isOutside() ? 1 : 0); + this.set3fv( + "dayTint", + globalScene.arena.getDayTint().map(c => c / 255), + ); + this.set3fv( + "duskTint", + globalScene.arena.getDuskTint().map(c => c / 255), + ); + this.set3fv( + "nightTint", + globalScene.arena.getNightTint().map(c => c / 255), + ); + this.set3fv( + "terrainColor", + getTerrainColor(globalScene.arena.terrain?.terrainType || TerrainType.NONE).map(c => c / 255), + ); this.set1f("terrainColorRatio", terrainColorRatio); } diff --git a/src/pipelines/invert.ts b/src/pipelines/invert.ts index 5d0161e8afa..a945d0c95aa 100644 --- a/src/pipelines/invert.ts +++ b/src/pipelines/invert.ts @@ -1,4 +1,4 @@ -import { Game } from "phaser"; +import type { Game } from "phaser"; const fragShader = ` precision mediump float; @@ -14,14 +14,12 @@ void main() `; export default class InvertPostFX extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { - constructor (game: Game) { + constructor(game: Game) { super({ game, name: "InvertPostFX", fragShader, - uniforms: [ - "uMainSampler" - ] + uniforms: ["uMainSampler"], } as Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); } } diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index 88d6ce2d387..439e35f711f 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -1,10 +1,10 @@ -import BattleScene from "../battle-scene"; import { variantColorCache } from "#app/data/variant"; -import Pokemon from "../field/pokemon"; -import Trainer from "../field/trainer"; +import MysteryEncounterIntroVisuals from "#app/field/mystery-encounter-intro"; +import Pokemon from "#app/field/pokemon"; +import Trainer from "#app/field/trainer"; +import { globalScene } from "#app/global-scene"; +import * as Utils from "#app/utils"; import FieldSpritePipeline from "./field-sprite"; -import * as Utils from "../utils"; -import MysteryEncounterIntroVisuals from "../field/mystery-encounter-intro"; const spriteFragShader = ` #ifdef GL_FRAGMENT_PRECISION_HIGH @@ -322,17 +322,17 @@ export default class SpritePipeline extends FieldSpritePipeline { game: game, name: "sprite", fragShader: spriteFragShader, - vertShader: spriteVertShader + vertShader: spriteVertShader, }); - this._tone = [ 0, 0, 0, 0 ]; + this._tone = [0, 0, 0, 0]; } onPreRender(): void { super.onPreRender(); this.set1f("teraTime", 0); - this.set3fv("teraColor", [ 0, 0, 0 ]); + this.set3fv("teraColor", [0, 0, 0]); this.set1i("hasShadow", 0); this.set1i("yCenter", 0); this.set2f("relPosition", 0, 0); @@ -347,31 +347,38 @@ export default class SpritePipeline extends FieldSpritePipeline { onBind(gameObject: Phaser.GameObjects.GameObject): void { super.onBind(gameObject); - const sprite = (gameObject as Phaser.GameObjects.Sprite); + const sprite = gameObject as Phaser.GameObjects.Sprite; const data = sprite.pipelineData; const tone = data["tone"] as number[]; - const teraColor = data["teraColor"] as integer[] ?? [ 0, 0, 0 ]; + const teraColor = (data["isTerastallized"] as boolean) ? ((data["teraColor"] as number[]) ?? [0, 0, 0]) : [0, 0, 0]; const hasShadow = data["hasShadow"] as boolean; const yShadowOffset = data["yShadowOffset"] as number; const ignoreFieldPos = data["ignoreFieldPos"] as boolean; const ignoreOverride = data["ignoreOverride"] as boolean; - const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer || sprite.parentContainer instanceof MysteryEncounterIntroVisuals; + const isEntityObj = + sprite.parentContainer instanceof Pokemon || + sprite.parentContainer instanceof Trainer || + sprite.parentContainer instanceof MysteryEncounterIntroVisuals; const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; - const position = isEntityObj - ? [ sprite.parentContainer.x, sprite.parentContainer.y ] - : [ sprite.x, sprite.y ]; + const position = isEntityObj ? [sprite.parentContainer.x, sprite.parentContainer.y] : [sprite.x, sprite.y]; if (field) { position[0] += field.x / field.scale; position[1] += field.y / field.scale; } - position[0] += -(sprite.width - (sprite.frame.width)) / 2 + sprite.frame.x + (!ignoreFieldPos ? (sprite.x - field.x) : 0); + position[0] += + -(sprite.width - sprite.frame.width) / 2 + sprite.frame.x + (!ignoreFieldPos ? sprite.x - field.x : 0); if (sprite.originY === 0.5) { - position[1] += (sprite.height / 2) * ((isEntityObj ? sprite.parentContainer : sprite).scale - 1) + (!ignoreFieldPos ? (sprite.y - field.y) : 0); + position[1] += + (sprite.height / 2) * ((isEntityObj ? sprite.parentContainer : sprite).scale - 1) + + (!ignoreFieldPos ? sprite.y - field.y : 0); } this.set1f("teraTime", (this.game.getTime() % 500000) / 500000); - this.set3fv("teraColor", teraColor.map(c => c / 255)); + this.set3fv( + "teraColor", + teraColor.map(c => c / 255), + ); this.set1i("hasShadow", hasShadow ? 1 : 0); this.set1i("yCenter", sprite.originY === 0.5 ? 1 : 0); this.set1f("fieldScale", field?.scale || 1); @@ -379,21 +386,34 @@ export default class SpritePipeline extends FieldSpritePipeline { this.set2f("texFrameUv", sprite.frame.u0, sprite.frame.v0); this.set2f("size", sprite.frame.width, sprite.height); this.set2f("texSize", sprite.texture.source[0].width, sprite.texture.source[0].height); - this.set1f("yOffset", sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); + this.set1f( + "yOffset", + sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale), + ); this.set1f("yShadowOffset", yShadowOffset ?? 0); this.set4fv("tone", tone); this.bindTexture(this.game.textures.get("tera").source[0].glTexture!, 1); // TODO: is this bang correct? - if ((gameObject.scene as BattleScene).fusionPaletteSwaps) { + if (globalScene.fusionPaletteSwaps) { const spriteColors = ((ignoreOverride && data["spriteColorsBase"]) || data["spriteColors"] || []) as number[][]; - const fusionSpriteColors = ((ignoreOverride && data["fusionSpriteColorsBase"]) || data["fusionSpriteColors"] || []) as number[][]; + const fusionSpriteColors = ((ignoreOverride && data["fusionSpriteColorsBase"]) || + data["fusionSpriteColors"] || + []) as number[][]; - const emptyColors = [ 0, 0, 0, 0 ]; - const flatSpriteColors: integer[] = []; - const flatFusionSpriteColors: integer[] = []; + const emptyColors = [0, 0, 0, 0]; + const flatSpriteColors: number[] = []; + const flatFusionSpriteColors: number[] = []; for (let c = 0; c < 32; c++) { - flatSpriteColors.splice(flatSpriteColors.length, 0, ...(c < spriteColors.length ? spriteColors[c] : emptyColors)); - flatFusionSpriteColors.splice(flatFusionSpriteColors.length, 0, ...(c < fusionSpriteColors.length ? fusionSpriteColors[c] : emptyColors)); + flatSpriteColors.splice( + flatSpriteColors.length, + 0, + ...(c < spriteColors.length ? spriteColors[c] : emptyColors), + ); + flatFusionSpriteColors.splice( + flatFusionSpriteColors.length, + 0, + ...(c < fusionSpriteColors.length ? fusionSpriteColors[c] : emptyColors), + ); } this.set4iv("spriteColors", flatSpriteColors.flat()); @@ -403,21 +423,30 @@ export default class SpritePipeline extends FieldSpritePipeline { onBatch(gameObject: Phaser.GameObjects.GameObject): void { if (gameObject) { - const sprite = (gameObject as Phaser.GameObjects.Sprite); + const sprite = gameObject as Phaser.GameObjects.Sprite; const data = sprite.pipelineData; - const variant: integer = data.hasOwnProperty("variant") + const variant: number = data.hasOwnProperty("variant") ? data["variant"] - : sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.variant + : sprite.parentContainer instanceof Pokemon + ? sprite.parentContainer.variant : 0; - let variantColors; + let variantColors: { [x: string]: string }[]; - const emptyColors = [ 0, 0, 0, 0 ]; - const flatBaseColors: integer[] = []; + const emptyColors = [0, 0, 0, 0]; + const flatBaseColors: number[] = []; const flatVariantColors: number[] = []; - if ((sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.shiny : !!data["shiny"]) - && (variantColors = variantColorCache[sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.getSprite().texture.key : data["spriteKey"]]) && variantColors.hasOwnProperty(variant)) { + if ( + (sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.shiny : !!data["shiny"]) && + (variantColors = + variantColorCache[ + sprite.parentContainer instanceof Pokemon + ? sprite.parentContainer.getSprite().texture.key + : data["spriteKey"] + ]) && + variantColors.hasOwnProperty(variant) + ) { const baseColors = Object.keys(variantColors[variant]); for (let c = 0; c < 32; c++) { if (c < baseColors.length) { @@ -444,30 +473,72 @@ export default class SpritePipeline extends FieldSpritePipeline { super.onBatch(gameObject); } - batchQuad(gameObject: Phaser.GameObjects.GameObject, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, - u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number | boolean, - texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): boolean { + batchQuad( + gameObject: Phaser.GameObjects.GameObject, + x0: number, + y0: number, + x1: number, + y1: number, + x2: number, + y2: number, + x3: number, + y3: number, + u0: number, + v0: number, + u1: number, + v1: number, + tintTL: number, + tintTR: number, + tintBL: number, + tintBR: number, + tintEffect: number | boolean, + texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, + unit?: number, + ): boolean { const sprite = gameObject as Phaser.GameObjects.Sprite; this.set1f("vCutoff", v1); const hasShadow = sprite.pipelineData["hasShadow"] as boolean; - const yShadowOffset = sprite.pipelineData["yShadowOffset"] as number ?? 0; + const yShadowOffset = (sprite.pipelineData["yShadowOffset"] as number) ?? 0; if (hasShadow) { - const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer || sprite.parentContainer instanceof MysteryEncounterIntroVisuals; + const isEntityObj = + sprite.parentContainer instanceof Pokemon || + sprite.parentContainer instanceof Trainer || + sprite.parentContainer instanceof MysteryEncounterIntroVisuals; const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; const fieldScaleRatio = field.scale / 6; - const baseY = (isEntityObj - ? sprite.parentContainer.y - : sprite.y + sprite.height) * 6 / fieldScaleRatio; - const bottomPadding = Math.ceil(sprite.height * 0.05 + Math.max(yShadowOffset, 0)) * 6 / fieldScaleRatio; + const baseY = ((isEntityObj ? sprite.parentContainer.y : sprite.y + sprite.height) * 6) / fieldScaleRatio; + const bottomPadding = (Math.ceil(sprite.height * 0.05 + Math.max(yShadowOffset, 0)) * 6) / fieldScaleRatio; const yDelta = (baseY - y1) / field.scale; y2 = y1 = baseY + bottomPadding; - const pixelHeight = (v1 - v0) / (sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); + const pixelHeight = + (v1 - v0) / (sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); v1 += (yDelta + bottomPadding / field.scale) * pixelHeight; } - return super.batchQuad(gameObject, x0, y0, x1, y1, x2, y2, x3, y3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, unit); + return super.batchQuad( + gameObject, + x0, + y0, + x1, + y1, + x2, + y2, + x3, + y3, + u0, + v0, + u1, + v1, + tintTL, + tintTR, + tintBL, + tintBR, + tintEffect, + texture, + unit, + ); } get tone(): number[] { diff --git a/src/plugins/api/api-base.ts b/src/plugins/api/api-base.ts new file mode 100644 index 00000000000..6a0eca56eaa --- /dev/null +++ b/src/plugins/api/api-base.ts @@ -0,0 +1,93 @@ +import { SESSION_ID_COOKIE_NAME } from "#app/constants"; +import { getCookie } from "#app/utils"; + +type DataType = "json" | "form-urlencoded"; + +export abstract class ApiBase { + //#region Fields + + public readonly ERR_GENERIC: string = "There was an error"; + + protected readonly base: string; + + //#region Public + + constructor(base: string) { + this.base = base; + } + + //#region Protected + + /** + * Send a GET request. + * @param path The path to send the request to. + */ + protected async doGet(path: string) { + return this.doFetch(path, { method: "GET" }); + } + + /** + * Send a POST request. + * @param path THe path to send the request to. + * @param bodyData The body-data to send. + * @param dataType The data-type of the {@linkcode bodyData}. + */ + protected async doPost(path: string, bodyData?: D, dataType: DataType = "json") { + let body: string | undefined = undefined; + const headers: HeadersInit = {}; + + if (bodyData) { + if (dataType === "json") { + body = typeof bodyData === "string" ? bodyData : JSON.stringify(bodyData); + headers["Content-Type"] = "application/json"; + } else if (dataType === "form-urlencoded") { + if (bodyData instanceof Object) { + body = this.toUrlSearchParams(bodyData).toString(); + } else { + console.warn("Could not add body data to form-urlencoded!", bodyData); + } + headers["Content-Type"] = "application/x-www-form-urlencoded"; + } else { + console.warn(`Unsupported data type: ${dataType}`); + body = String(bodyData); + headers["Content-Type"] = "text/plain"; + } + } + + return await this.doFetch(path, { method: "POST", body, headers }); + } + + /** + * A generic request helper. + * @param path The path to send the request to. + * @param config The request {@linkcode RequestInit | Configuration}. + */ + protected async doFetch(path: string, config: RequestInit): Promise { + config.headers = { + ...config.headers, + Authorization: getCookie(SESSION_ID_COOKIE_NAME), + "Content-Type": config.headers?.["Content-Type"] ?? "application/json", + }; + + if (import.meta.env.DEV) { + console.log(`Sending ${config.method ?? "GET"} request to: `, this.base + path, config); + } + + return await fetch(this.base + path, config); + } + + /** + * Helper to transform data to {@linkcode URLSearchParams} + * Any key with a value of `undefined` will be ignored. + * Any key with a value of `null` will be included. + * @param data the data to transform to {@linkcode URLSearchParams} + * @returns a {@linkcode URLSearchParams} representaton of {@linkcode data} + */ + protected toUrlSearchParams>(data: D) { + const arr = Object.entries(data) + .map(([key, value]) => (value !== undefined ? [key, String(value)] : [key, ""])) + .filter(([, value]) => value !== ""); + + return new URLSearchParams(arr); + } +} diff --git a/src/plugins/api/pokerogue-account-api.ts b/src/plugins/api/pokerogue-account-api.ts new file mode 100644 index 00000000000..bab74799677 --- /dev/null +++ b/src/plugins/api/pokerogue-account-api.ts @@ -0,0 +1,98 @@ +import type { + AccountInfoResponse, + AccountLoginRequest, + AccountLoginResponse, + AccountRegisterRequest, +} from "#app/@types/PokerogueAccountApi"; +import { SESSION_ID_COOKIE_NAME } from "#app/constants"; +import { ApiBase } from "#app/plugins/api/api-base"; +import { removeCookie, setCookie } from "#app/utils"; + +/** + * A wrapper for PokéRogue account API requests. + */ +export class PokerogueAccountApi extends ApiBase { + //#region Public + + /** + * Request the {@linkcode AccountInfoResponse | UserInfo} of the logged in user. + * The user is identified by the {@linkcode SESSION_ID_COOKIE_NAME | session cookie}. + */ + public async getInfo(): Promise<[data: AccountInfoResponse | null, status: number]> { + try { + const response = await this.doGet("/account/info"); + + if (response.ok) { + const resData = (await response.json()) as AccountInfoResponse; + return [resData, response.status]; + } + console.warn("Could not get account info!", response.status, response.statusText); + return [null, response.status]; + } catch (err) { + console.warn("Could not get account info!", err); + return [null, 500]; + } + } + + /** + * Register a new account. + * @param registerData The {@linkcode AccountRegisterRequest} to send + * @returns An error message if something went wrong + */ + public async register(registerData: AccountRegisterRequest) { + try { + const response = await this.doPost("/account/register", registerData, "form-urlencoded"); + + if (response.ok) { + return null; + } + return response.text(); + } catch (err) { + console.warn("Register failed!", err); + } + + return "Unknown error!"; + } + + /** + * Send a login request. + * Sets the session cookie on success. + * @param loginData The {@linkcode AccountLoginRequest} to send + * @returns An error message if something went wrong + */ + public async login(loginData: AccountLoginRequest) { + try { + const response = await this.doPost("/account/login", loginData, "form-urlencoded"); + + if (response.ok) { + const loginResponse = (await response.json()) as AccountLoginResponse; + setCookie(SESSION_ID_COOKIE_NAME, loginResponse.token); + return null; + } + console.warn("Login failed!", response.status, response.statusText); + return response.text(); + } catch (err) { + console.warn("Login failed!", err); + } + + return "Unknown error!"; + } + + /** + * Send a logout request. + * **Always** (no matter if failed or not) removes the session cookie. + */ + public async logout() { + try { + const response = await this.doGet("/account/logout"); + + if (!response.ok) { + throw new Error(`${response.status}: ${response.statusText}`); + } + } catch (err) { + console.warn("Log out failed!", err); + } + + removeCookie(SESSION_ID_COOKIE_NAME); // we are always clearing the cookie. + } +} diff --git a/src/plugins/api/pokerogue-admin-api.ts b/src/plugins/api/pokerogue-admin-api.ts new file mode 100644 index 00000000000..5923f286430 --- /dev/null +++ b/src/plugins/api/pokerogue-admin-api.ts @@ -0,0 +1,135 @@ +import type { + LinkAccountToDiscordIdRequest, + LinkAccountToGoogledIdRequest, + SearchAccountRequest, + SearchAccountResponse, + UnlinkAccountFromDiscordIdRequest, + UnlinkAccountFromGoogledIdRequest, +} from "#app/@types/PokerogueAdminApi"; +import { ApiBase } from "#app/plugins/api/api-base"; + +export class PokerogueAdminApi extends ApiBase { + public readonly ERR_USERNAME_NOT_FOUND: string = "Username not found!"; + + /** + * Links an account to a discord id. + * @param params The {@linkcode LinkAccountToDiscordIdRequest} to send + * @returns `null` if successful, error message if not + */ + public async linkAccountToDiscord(params: LinkAccountToDiscordIdRequest) { + try { + const response = await this.doPost("/admin/account/discordLink", params, "form-urlencoded"); + + if (response.ok) { + return null; + } + console.warn("Could not link account with discord!", response.status, response.statusText); + + if (response.status === 404) { + return this.ERR_USERNAME_NOT_FOUND; + } + } catch (err) { + console.warn("Could not link account with discord!", err); + } + + return this.ERR_GENERIC; + } + + /** + * Unlinks an account from a discord id. + * @param params The {@linkcode UnlinkAccountFromDiscordIdRequest} to send + * @returns `null` if successful, error message if not + */ + public async unlinkAccountFromDiscord(params: UnlinkAccountFromDiscordIdRequest) { + try { + const response = await this.doPost("/admin/account/discordUnlink", params, "form-urlencoded"); + + if (response.ok) { + return null; + } + console.warn("Could not unlink account from discord!", response.status, response.statusText); + + if (response.status === 404) { + return this.ERR_USERNAME_NOT_FOUND; + } + } catch (err) { + console.warn("Could not unlink account from discord!", err); + } + + return this.ERR_GENERIC; + } + + /** + * Links an account to a google id. + * @param params The {@linkcode LinkAccountToGoogledIdRequest} to send + * @returns `null` if successful, error message if not + */ + public async linkAccountToGoogleId(params: LinkAccountToGoogledIdRequest) { + try { + const response = await this.doPost("/admin/account/googleLink", params, "form-urlencoded"); + + if (response.ok) { + return null; + } + console.warn("Could not link account with google!", response.status, response.statusText); + + if (response.status === 404) { + return this.ERR_USERNAME_NOT_FOUND; + } + } catch (err) { + console.warn("Could not link account with google!", err); + } + + return this.ERR_GENERIC; + } + + /** + * Unlinks an account from a google id. + * @param params The {@linkcode UnlinkAccountFromGoogledIdRequest} to send + * @returns `null` if successful, error message if not + */ + public async unlinkAccountFromGoogleId(params: UnlinkAccountFromGoogledIdRequest) { + try { + const response = await this.doPost("/admin/account/googleUnlink", params, "form-urlencoded"); + + if (response.ok) { + return null; + } + console.warn("Could not unlink account from google!", response.status, response.statusText); + + if (response.status === 404) { + return this.ERR_USERNAME_NOT_FOUND; + } + } catch (err) { + console.warn("Could not unlink account from google!", err); + } + + return this.ERR_GENERIC; + } + + /** + * Search an account. + * @param params The {@linkcode SearchAccountRequest} to send + * @returns an array of {@linkcode SearchAccountResponse} and error. Both can be `undefined` + */ + public async searchAccount(params: SearchAccountRequest): Promise<[data?: SearchAccountResponse, error?: string]> { + try { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doGet(`/admin/account/adminSearch?${urlSearchParams}`); + + if (response.ok) { + const resData: SearchAccountResponse = await response.json(); + return [resData, undefined]; + } + console.warn("Could not find account!", response.status, response.statusText); + + if (response.status === 404) { + return [undefined, this.ERR_USERNAME_NOT_FOUND]; + } + } catch (err) { + console.warn("Could not find account!", err); + } + + return [undefined, this.ERR_GENERIC]; + } +} diff --git a/src/plugins/api/pokerogue-api.ts b/src/plugins/api/pokerogue-api.ts new file mode 100644 index 00000000000..c6dfae019a5 --- /dev/null +++ b/src/plugins/api/pokerogue-api.ts @@ -0,0 +1,81 @@ +import type { TitleStatsResponse } from "#app/@types/PokerogueApi"; +import { ApiBase } from "#app/plugins/api/api-base"; +import { PokerogueAccountApi } from "#app/plugins/api/pokerogue-account-api"; +import { PokerogueAdminApi } from "#app/plugins/api/pokerogue-admin-api"; +import { PokerogueDailyApi } from "#app/plugins/api/pokerogue-daily-api"; +import { PokerogueSavedataApi } from "#app/plugins/api/pokerogue-savedata-api"; + +/** + * A wrapper for PokéRogue API requests. + */ +export class PokerogueApi extends ApiBase { + //#region Fields∏ + + public readonly account: PokerogueAccountApi; + public readonly daily: PokerogueDailyApi; + public readonly admin: PokerogueAdminApi; + public readonly savedata: PokerogueSavedataApi; + + //#region Public + + constructor(base: string) { + super(base); + this.account = new PokerogueAccountApi(base); + this.daily = new PokerogueDailyApi(base); + this.admin = new PokerogueAdminApi(base); + this.savedata = new PokerogueSavedataApi(base); + } + + /** + * Request game title-stats. + */ + public async getGameTitleStats() { + try { + const response = await this.doGet("/game/titlestats"); + return (await response.json()) as TitleStatsResponse; + } catch (err) { + console.warn("Could not get game title stats!", err); + return null; + } + } + + /** + * Unlink the currently logged in user from Discord. + * @returns `true` if unlinking was successful, `false` if not + */ + public async unlinkDiscord() { + try { + const response = await this.doPost("/auth/discord/logout"); + if (response.ok) { + return true; + } + console.warn(`Discord unlink failed (${response.status}: ${response.statusText})`); + } catch (err) { + console.warn("Could not unlink Discord!", err); + } + + return false; + } + + /** + * Unlink the currently logged in user from Google. + * @returns `true` if unlinking was successful, `false` if not + */ + public async unlinkGoogle() { + try { + const response = await this.doPost("/auth/google/logout"); + if (response.ok) { + return true; + } + console.warn(`Google unlink failed (${response.status}: ${response.statusText})`); + } catch (err) { + console.warn("Could not unlink Google!", err); + } + + return false; + } + + //#endregion +} + +export const pokerogueApi = new PokerogueApi(import.meta.env.VITE_SERVER_URL ?? "http://localhost:8001"); diff --git a/src/plugins/api/pokerogue-daily-api.ts b/src/plugins/api/pokerogue-daily-api.ts new file mode 100644 index 00000000000..c9319ae7fdc --- /dev/null +++ b/src/plugins/api/pokerogue-daily-api.ts @@ -0,0 +1,57 @@ +import type { GetDailyRankingsPageCountRequest, GetDailyRankingsRequest } from "#app/@types/PokerogueDailyApi"; +import { ApiBase } from "#app/plugins/api/api-base"; +import type { RankingEntry } from "#app/ui/daily-run-scoreboard"; + +/** + * A wrapper for daily-run PokéRogue API requests. + */ +export class PokerogueDailyApi extends ApiBase { + //#region Public + + /** + * Request the daily-run seed. + * @returns The active daily-run seed as `string`. + */ + public async getSeed() { + try { + const response = await this.doGet("/daily/seed"); + return response.text(); + } catch (err) { + console.warn("Could not get daily-run seed!", err); + return null; + } + } + + /** + * Get the daily rankings for a {@linkcode ScoreboardCategory}. + * @param params The {@linkcode GetDailyRankingsRequest} to send + */ + public async getRankings(params: GetDailyRankingsRequest) { + try { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doGet(`/daily/rankings?${urlSearchParams}`); + + return (await response.json()) as RankingEntry[]; + } catch (err) { + console.warn("Could not get daily rankings!", err); + return null; + } + } + + /** + * Get the page count of the daily rankings for a {@linkcode ScoreboardCategory}. + * @param params The {@linkcode GetDailyRankingsPageCountRequest} to send. + */ + public async getRankingsPageCount(params: GetDailyRankingsPageCountRequest) { + try { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doGet(`/daily/rankingpagecount?${urlSearchParams}`); + const json = await response.json(); + + return Number(json); + } catch (err) { + console.warn("Could not get daily rankings page count!", err); + return 1; + } + } +} diff --git a/src/plugins/api/pokerogue-savedata-api.ts b/src/plugins/api/pokerogue-savedata-api.ts new file mode 100644 index 00000000000..b8531e82d4f --- /dev/null +++ b/src/plugins/api/pokerogue-savedata-api.ts @@ -0,0 +1,41 @@ +import type { UpdateAllSavedataRequest } from "#app/@types/PokerogueSavedataApi"; +import { MAX_INT_ATTR_VALUE } from "#app/constants"; +import { ApiBase } from "#app/plugins/api/api-base"; +import { PokerogueSessionSavedataApi } from "#app/plugins/api/pokerogue-session-savedata-api"; +import { PokerogueSystemSavedataApi } from "#app/plugins/api/pokerogue-system-savedata-api"; + +/** + * A wrapper for PokéRogue savedata API requests. + */ +export class PokerogueSavedataApi extends ApiBase { + //#region Fields + + public readonly system: PokerogueSystemSavedataApi; + public readonly session: PokerogueSessionSavedataApi; + + //#region Public + + constructor(base: string) { + super(base); + this.system = new PokerogueSystemSavedataApi(base); + this.session = new PokerogueSessionSavedataApi(base); + } + + /** + * Update all savedata + * @param bodyData The {@linkcode UpdateAllSavedataRequest | request data} to send + * @returns An error message if something went wrong + */ + public async updateAll(bodyData: UpdateAllSavedataRequest) { + try { + const rawBodyData = JSON.stringify(bodyData, (_k: any, v: any) => + typeof v === "bigint" ? (v <= MAX_INT_ATTR_VALUE ? Number(v) : v.toString()) : v, + ); + const response = await this.doPost("/savedata/updateall", rawBodyData); + return await response.text(); + } catch (err) { + console.warn("Could not update all savedata!", err); + return "Unknown error"; + } + } +} diff --git a/src/plugins/api/pokerogue-session-savedata-api.ts b/src/plugins/api/pokerogue-session-savedata-api.ts new file mode 100644 index 00000000000..e703d55a242 --- /dev/null +++ b/src/plugins/api/pokerogue-session-savedata-api.ts @@ -0,0 +1,114 @@ +import type { + ClearSessionSavedataRequest, + ClearSessionSavedataResponse, + DeleteSessionSavedataRequest, + GetSessionSavedataRequest, + NewClearSessionSavedataRequest, + UpdateSessionSavedataRequest, +} from "#app/@types/PokerogueSessionSavedataApi"; +import { ApiBase } from "#app/plugins/api/api-base"; +import type { SessionSaveData } from "#app/system/game-data"; + +/** + * A wrapper for PokéRogue session savedata API requests. + */ +export class PokerogueSessionSavedataApi extends ApiBase { + //#region Public + + /** + * Mark a session as cleared aka "newclear".\ + * *This is **NOT** the same as {@linkcode clear | clear()}.* + * @param params The {@linkcode NewClearSessionSavedataRequest} to send + * @returns The raw savedata as `string`. + */ + public async newclear(params: NewClearSessionSavedataRequest) { + try { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doGet(`/savedata/session/newclear?${urlSearchParams}`); + const json = await response.json(); + + return Boolean(json); + } catch (err) { + console.warn("Could not newclear session!", err); + return false; + } + } + + /** + * Get a session savedata. + * @param params The {@linkcode GetSessionSavedataRequest} to send + * @returns The session as `string` + */ + public async get(params: GetSessionSavedataRequest) { + try { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doGet(`/savedata/session/get?${urlSearchParams}`); + + return await response.text(); + } catch (err) { + console.warn("Could not get session savedata!", err); + return null; + } + } + + /** + * Update a session savedata. + * @param params The {@linkcode UpdateSessionSavedataRequest} to send + * @param rawSavedata The raw savedata (as `string`) + * @returns An error message if something went wrong + */ + public async update(params: UpdateSessionSavedataRequest, rawSavedata: string) { + try { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doPost(`/savedata/session/update?${urlSearchParams}`, rawSavedata); + + return await response.text(); + } catch (err) { + console.warn("Could not update session savedata!", err); + } + + return "Unknown Error!"; + } + + /** + * Delete a session savedata slot. + * @param params The {@linkcode DeleteSessionSavedataRequest} to send + * @returns An error message if something went wrong + */ + public async delete(params: DeleteSessionSavedataRequest) { + try { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doGet(`/savedata/session/delete?${urlSearchParams}`); + + if (response.ok) { + return null; + } + return await response.text(); + } catch (err) { + console.warn("Could not delete session savedata!", err); + return "Unknown error"; + } + } + + /** + * Clears the session savedata of the given slot.\ + * *This is **NOT** the same as {@linkcode newclear | newclear()}.* + * @param params The {@linkcode ClearSessionSavedataRequest} to send + * @param sessionData The {@linkcode SessionSaveData} object + */ + public async clear(params: ClearSessionSavedataRequest, sessionData: SessionSaveData) { + try { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doPost(`/savedata/session/clear?${urlSearchParams}`, sessionData); + + return (await response.json()) as ClearSessionSavedataResponse; + } catch (err) { + console.warn("Could not clear session savedata!", err); + } + + return { + error: "Unknown error", + success: false, + } as ClearSessionSavedataResponse; + } +} diff --git a/src/plugins/api/pokerogue-system-savedata-api.ts b/src/plugins/api/pokerogue-system-savedata-api.ts new file mode 100644 index 00000000000..659584776c4 --- /dev/null +++ b/src/plugins/api/pokerogue-system-savedata-api.ts @@ -0,0 +1,77 @@ +import type { + GetSystemSavedataRequest, + UpdateSystemSavedataRequest, + VerifySystemSavedataRequest, + VerifySystemSavedataResponse, +} from "#app/@types/PokerogueSystemSavedataApi"; +import { ApiBase } from "#app/plugins/api/api-base"; + +/** + * A wrapper for PokéRogue system savedata API requests. + */ +export class PokerogueSystemSavedataApi extends ApiBase { + //#region Public + + /** + * Get a system savedata. + * @param params The {@linkcode GetSystemSavedataRequest} to send + * @returns The system savedata as `string` or `null` on error + */ + public async get(params: GetSystemSavedataRequest) { + try { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doGet(`/savedata/system/get?${urlSearchParams}`); + const rawSavedata = await response.text(); + + return rawSavedata; + } catch (err) { + console.warn("Could not get system savedata!", err); + return null; + } + } + + /** + * Verify if the session is valid. + * If not the {@linkcode SystemSaveData} is returned. + * @param params The {@linkcode VerifySystemSavedataRequest} to send + * @returns A {@linkcode SystemSaveData} if **NOT** valid, otherwise `null`. + * + * TODO: add handling for errors + */ + public async verify(params: VerifySystemSavedataRequest) { + const urlSearchParams = this.toUrlSearchParams(params); + const response = await this.doGet(`/savedata/system/verify?${urlSearchParams}`); + + if (response.ok) { + const verifySavedata = (await response.json()) as VerifySystemSavedataResponse; + + if (!verifySavedata.valid) { + console.warn("Invalid system savedata!"); + return verifySavedata.systemData; + } + } else { + console.warn("System savedata verification failed!", response.status, response.statusText); + } + + return null; + } + + /** + * Update a system savedata. + * @param params The {@linkcode UpdateSystemSavedataRequest} to send + * @param rawSystemData The raw {@linkcode SystemSaveData} + * @returns An error message if something went wrong + */ + public async update(params: UpdateSystemSavedataRequest, rawSystemData: string) { + try { + const urSearchParams = this.toUrlSearchParams(params); + const response = await this.doPost(`/savedata/system/update?${urSearchParams}`, rawSystemData); + + return await response.text(); + } catch (err) { + console.warn("Could not update system savedata!", err); + } + + return "Unknown Error"; + } +} diff --git a/src/plugins/cache-busted-loader-plugin.ts b/src/plugins/cache-busted-loader-plugin.ts index 344da3eaa66..e5b1abb5903 100644 --- a/src/plugins/cache-busted-loader-plugin.ts +++ b/src/plugins/cache-busted-loader-plugin.ts @@ -15,7 +15,7 @@ export default class CacheBustedLoaderPlugin extends Phaser.Loader.LoaderPlugin addFile(file): void { if (!Array.isArray(file)) { - file = [ file ]; + file = [file]; } file.forEach(item => { diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index d24484bbf9d..92b0e15dbb9 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -1,4 +1,4 @@ -import { camelCaseToKebabCase, } from "#app/utils"; +import { camelCaseToKebabCase } from "#app/utils"; import i18next from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import HttpBackend from "i18next-http-backend"; @@ -8,9 +8,9 @@ import pkg from "../../package.json"; //#region Interfaces/Types interface LoadingFontFaceProperty { - face: FontFace, - extraOptions?: { [key:string]: any }, - only?: Array + face: FontFace; + extraOptions?: { [key: string]: any }; + only?: Array; } //#region Constants @@ -23,52 +23,70 @@ const unicodeRanges = { kana: "U+3040-30FF", CJKCommon: "U+2E80-2EFF,U+3000-303F,U+31C0-31EF,U+3200-32FF,U+3400-4DBF,U+F900-FAFF,U+FE30-FE4F", CJKIdeograph: "U+4E00-9FFF", - specialCharacters: "U+266A,U+2605,U+2665,U+2663" //♪.★,♥,♣ + specialCharacters: "U+266A,U+2605,U+2665,U+2663", //♪.★,♥,♣ }; const rangesByLanguage = { - korean: [ unicodeRanges.CJKCommon, unicodeRanges.hangul ].join(","), - chinese: [ unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.CJKIdeograph ].join(","), - japanese: [ unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.kana, unicodeRanges.CJKIdeograph ].join(",") + korean: [unicodeRanges.CJKCommon, unicodeRanges.hangul].join(","), + chinese: [unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.CJKIdeograph].join(","), + japanese: [unicodeRanges.CJKCommon, unicodeRanges.fullwidth, unicodeRanges.kana, unicodeRanges.CJKIdeograph].join( + ",", + ), }; const fonts: Array = [ // unicode (special character from PokePT) { - face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: unicodeRanges.specialCharacters }), + face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { + unicodeRange: unicodeRanges.specialCharacters, + }), }, { - face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: unicodeRanges.specialCharacters }), + face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { + unicodeRange: unicodeRanges.specialCharacters, + }), extraOptions: { sizeAdjust: "133%" }, }, // unicode (korean) { - face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: rangesByLanguage.korean }), + face: new FontFace("emerald", "url(./fonts/PokePT_Wansung.woff2)", { + unicodeRange: rangesByLanguage.korean, + }), }, { - face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { unicodeRange: rangesByLanguage.korean }), + face: new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.woff2)", { + unicodeRange: rangesByLanguage.korean, + }), extraOptions: { sizeAdjust: "133%" }, }, // unicode (chinese) { - face: new FontFace("emerald", "url(./fonts/unifont-15.1.05.subset.woff2)", { unicodeRange: rangesByLanguage.chinese }), + face: new FontFace("emerald", "url(./fonts/unifont-15.1.05.subset.woff2)", { + unicodeRange: rangesByLanguage.chinese, + }), extraOptions: { sizeAdjust: "70%", format: "woff2" }, - only: [ "en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca" ], + only: ["en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca"], }, { - face: new FontFace("pkmnems", "url(./fonts/unifont-15.1.05.subset.woff2)", { unicodeRange: rangesByLanguage.chinese }), + face: new FontFace("pkmnems", "url(./fonts/unifont-15.1.05.subset.woff2)", { + unicodeRange: rangesByLanguage.chinese, + }), extraOptions: { format: "woff2" }, - only: [ "en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca" ], + only: ["en", "es", "fr", "it", "de", "zh", "pt", "ko", "ca"], }, // japanese { - face: new FontFace("emerald", "url(./fonts/Galmuri11.subset.woff2)", { unicodeRange: rangesByLanguage.japanese }), + face: new FontFace("emerald", "url(./fonts/Galmuri11.subset.woff2)", { + unicodeRange: rangesByLanguage.japanese, + }), extraOptions: { sizeAdjust: "66%" }, - only: [ "ja" ], + only: ["ja"], }, { - face: new FontFace("pkmnems", "url(./fonts/Galmuri9.subset.woff2)", { unicodeRange: rangesByLanguage.japanese }), - only: [ "ja" ], + face: new FontFace("pkmnems", "url(./fonts/Galmuri9.subset.woff2)", { + unicodeRange: rangesByLanguage.japanese, + }), + only: ["ja"], }, ]; @@ -91,7 +109,7 @@ async function initFonts(language: string | undefined) { const results = await Promise.allSettled( fonts .filter(font => !font.only || font.only.some(exclude => language?.indexOf(exclude) === 0)) - .map(font => Object.assign(font.face, font.extraOptions ?? {}).load()) + .map(font => Object.assign(font.face, font.extraOptions ?? {}).load()), ); for (const result of results) { if (result.status === "fulfilled") { @@ -111,7 +129,7 @@ async function initFonts(language: string | undefined) { * @returns a money formatted string */ function i18nMoneyFormatter(amount: any): string { - if (isNaN(Number(amount))) { + if (Number.isNaN(Number(amount))) { console.warn(`i18nMoneyFormatter: value "${amount}" is not a number!`); } @@ -153,9 +171,9 @@ export async function initI18n(): Promise { i18next.use(new KoreanPostpositionProcessor()); await i18next.init({ fallbackLng: "en", - supportedLngs: [ "en", "es", "fr", "it", "de", "zh-CN", "zh-TW", "pt-BR", "ko", "ja", "ca-ES" ], + supportedLngs: ["en", "es-ES", "fr", "it", "de", "zh-CN", "zh-TW", "pt-BR", "ko", "ja", "ca-ES"], backend: { - loadPath(lng: string, [ ns ]: string[]) { + loadPath(lng: string, [ns]: string[]) { let fileName: string; if (namespaceMap[ns]) { fileName = namespaceMap[ns]; @@ -164,7 +182,7 @@ export async function initI18n(): Promise { } else { fileName = camelCaseToKebabCase(ns); } - return `/locales/${lng}/${fileName}.json?v=${pkg.version}`; + return `./locales/${lng}/${fileName}.json?v=${pkg.version}`; }, }, defaultNS: "menu", @@ -193,6 +211,7 @@ export async function initI18n(): Promise { "egg", "fightUiHandler", "filterBar", + "filterText", "gameMode", "gameStatsUiHandler", "growth", @@ -203,7 +222,9 @@ export async function initI18n(): Promise { "move", "nature", "pokeball", + "pokedexUiHandler", "pokemon", + "pokemonEvolutions", "pokemonForm", "pokemonInfo", "pokemonInfoContainer", @@ -258,16 +279,15 @@ export async function initI18n(): Promise { "mysteryEncounterMessages", ], detection: { - lookupLocalStorage: "prLang" + lookupLocalStorage: "prLang", }, debug: Number(import.meta.env.VITE_I18N_DEBUG) === 1, interpolation: { escapeValue: false, }, - postProcess: [ "korean-postposition" ], + postProcess: ["korean-postposition"], }); - if (i18next.services.formatter) { i18next.services.formatter.add("money", i18nMoneyFormatter); } diff --git a/src/plugins/vite/vite-minify-json-plugin.ts b/src/plugins/vite/vite-minify-json-plugin.ts index a638271562f..f14fdf7042d 100644 --- a/src/plugins/vite/vite-minify-json-plugin.ts +++ b/src/plugins/vite/vite-minify-json-plugin.ts @@ -1,6 +1,6 @@ import path from "path"; import fs from "fs"; -import { type Plugin as VitePlugin } from "vite"; +import type { Plugin as VitePlugin } from "vite"; /** * Crawl a directory (recursively if wanted) for json files and minifies found ones. @@ -8,7 +8,7 @@ import { type Plugin as VitePlugin } from "vite"; * @param recursive if true, will crawl subdirectories */ function applyToDir(dir: string, recursive?: boolean) { - const files = fs.readdirSync(dir).filter((file) => !/^\..*/.test(file)); + const files = fs.readdirSync(dir).filter(file => !/^\..*/.test(file)); for (const file of files) { const filePath = path.join(dir, file); @@ -41,9 +41,9 @@ export function minifyJsonPlugin(basePath: string | string[], recursive?: boolea }, async closeBundle() { console.log("Minifying JSON files..."); - const basePathes = Array.isArray(basePath) ? basePath : [ basePath ]; + const basePathes = Array.isArray(basePath) ? basePath : [basePath]; - basePathes.forEach((basePath) => { + basePathes.forEach(basePath => { const baseDir = path.resolve(buildDir, basePath); if (fs.existsSync(baseDir)) { applyToDir(baseDir, recursive); diff --git a/src/scene-base.ts b/src/scene-base.ts index 9af97b8e6d4..430a9bc8aac 100644 --- a/src/scene-base.ts +++ b/src/scene-base.ts @@ -12,11 +12,8 @@ export class SceneBase extends Phaser.Scene { */ public readonly scaledCanvas = { width: 1920 / 6, - height: 1080 / 6 + height: 1080 / 6, }; - constructor(config?: string | Phaser.Types.Scenes.SettingsConfig) { - super(config); - } getCachedUrl(url: string): string { const manifest = this.game["manifest"]; @@ -41,15 +38,21 @@ export class SceneBase extends Phaser.Scene { } } - loadSpritesheet(key: string, folder: string, size: integer, filename?: string) { + loadSpritesheet(key: string, folder: string, size: number, filename?: string) { if (!filename) { filename = `${key}.png`; } - this.load.spritesheet(key, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); + this.load.spritesheet(key, this.getCachedUrl(`images/${folder}/${filename}`), { + frameWidth: size, + frameHeight: size, + }); if (folder.startsWith("ui")) { legacyCompatibleImages.push(key); folder = folder.replace("ui", "ui/legacy"); - this.load.spritesheet(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); + this.load.spritesheet(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`), { + frameWidth: size, + frameHeight: size, + }); } } @@ -60,11 +63,19 @@ export class SceneBase extends Phaser.Scene { if (folder) { folder += "/"; } - this.load.atlas(key, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}${filenameRoot}.json`)); + this.load.atlas( + key, + this.getCachedUrl(`images/${folder}${filenameRoot}.png`), + this.getCachedUrl(`images/${folder}${filenameRoot}.json`), + ); if (folder.startsWith("ui")) { legacyCompatibleImages.push(key); folder = folder.replace("ui", "ui/legacy"); - this.load.atlas(`${key}_legacy`, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}${filenameRoot}.json`)); + this.load.atlas( + `${key}_legacy`, + this.getCachedUrl(`images/${folder}${filenameRoot}.png`), + this.getCachedUrl(`images/${folder}${filenameRoot}.json`), + ); } } @@ -78,7 +89,7 @@ export class SceneBase extends Phaser.Scene { folder += "/"; } if (!Array.isArray(filenames)) { - filenames = [ filenames ]; + filenames = [filenames]; } for (const f of filenames as string[]) { this.load.audio(folder + key, this.getCachedUrl(`audio/${folder}${f}`)); diff --git a/src/system/achv.ts b/src/system/achv.ts index 366813328e2..bd8595b2f94 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -1,21 +1,28 @@ -import { Modifier } from "typescript"; -import BattleScene from "../battle-scene"; +import type { Modifier } from "typescript"; import { TurnHeldItemTransferModifier } from "../modifier/modifier"; import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import i18next from "i18next"; import * as Utils from "../utils"; import { PlayerGender } from "#enums/player-gender"; -import { Challenge, FreshStartChallenge, SingleGenerationChallenge, SingleTypeChallenge, InverseBattleChallenge } from "#app/data/challenge"; -import { ConditionFn } from "#app/@types/common"; +import type { Challenge } from "#app/data/challenge"; +import { + FlipStatChallenge, + FreshStartChallenge, + SingleGenerationChallenge, + SingleTypeChallenge, + InverseBattleChallenge, +} from "#app/data/challenge"; +import type { ConditionFn } from "#app/@types/common"; import { Stat, getShortenedStatKey } from "#app/enums/stat"; import { Challenges } from "#app/enums/challenges"; +import { globalScene } from "#app/global-scene"; export enum AchvTier { COMMON, GREAT, ULTRA, ROGUE, - MASTER + MASTER, } export class Achv { @@ -24,7 +31,7 @@ export class Achv { public name: string; public description: string; public iconImage: string; - public score: integer; + public score: number; public secret: boolean; public hasParent: boolean; @@ -32,7 +39,14 @@ export class Achv { private conditionFunc: ConditionFn | undefined; - constructor(localizationKey:string, name: string, description: string, iconImage: string, score: integer, conditionFunc?: ConditionFn) { + constructor( + localizationKey: string, + name: string, + description: string, + iconImage: string, + score: number, + conditionFunc?: ConditionFn, + ) { this.name = name; this.description = description; this.iconImage = iconImage; @@ -49,7 +63,9 @@ export class Achv { getName(playerGender: PlayerGender = PlayerGender.UNSET): string { const genderStr = PlayerGender[playerGender].toLowerCase(); // Localization key is used to get the name of the achievement - return i18next.t(`achv:${this.localizationKey}.name`, { context: genderStr }); + return i18next.t(`achv:${this.localizationKey}.name`, { + context: genderStr, + }); } getDescription(): string { @@ -66,8 +82,8 @@ export class Achv { return this; } - validate(scene: BattleScene, args?: any[]): boolean { - return !this.conditionFunc || this.conditionFunc(scene, args); + validate(args?: any[]): boolean { + return !this.conditionFunc || this.conditionFunc(args); } getTier(): AchvTier { @@ -88,63 +104,104 @@ export class Achv { } export class MoneyAchv extends Achv { - moneyAmount: integer; + moneyAmount: number; - constructor(localizationKey: string, name: string, moneyAmount: integer, iconImage: string, score: integer) { - super(localizationKey, name, "", iconImage, score, (scene: BattleScene, _args: any[]) => scene.money >= this.moneyAmount); + constructor(localizationKey: string, name: string, moneyAmount: number, iconImage: string, score: number) { + super(localizationKey, name, "", iconImage, score, (_args: any[]) => globalScene.money >= this.moneyAmount); this.moneyAmount = moneyAmount; } } export class RibbonAchv extends Achv { - ribbonAmount: integer; + ribbonAmount: number; - constructor(localizationKey: string, name: string, ribbonAmount: integer, iconImage: string, score: integer) { - super(localizationKey, name, "", iconImage, score, (scene: BattleScene, _args: any[]) => scene.gameData.gameStats.ribbonsOwned >= this.ribbonAmount); + constructor(localizationKey: string, name: string, ribbonAmount: number, iconImage: string, score: number) { + super( + localizationKey, + name, + "", + iconImage, + score, + (_args: any[]) => globalScene.gameData.gameStats.ribbonsOwned >= this.ribbonAmount, + ); this.ribbonAmount = ribbonAmount; } } export class DamageAchv extends Achv { - damageAmount: integer; + damageAmount: number; - constructor(localizationKey: string, name: string, damageAmount: integer, iconImage: string, score: integer) { - super(localizationKey, name, "", iconImage, score, (_scene: BattleScene, args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.damageAmount); + constructor(localizationKey: string, name: string, damageAmount: number, iconImage: string, score: number) { + super( + localizationKey, + name, + "", + iconImage, + score, + (args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.damageAmount, + ); this.damageAmount = damageAmount; } } export class HealAchv extends Achv { - healAmount: integer; + healAmount: number; - constructor(localizationKey: string, name: string, healAmount: integer, iconImage: string, score: integer) { - super(localizationKey, name, "", iconImage, score, (_scene: BattleScene, args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.healAmount); + constructor(localizationKey: string, name: string, healAmount: number, iconImage: string, score: number) { + super( + localizationKey, + name, + "", + iconImage, + score, + (args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.healAmount, + ); this.healAmount = healAmount; } } export class LevelAchv extends Achv { - level: integer; + level: number; - constructor(localizationKey: string, name: string, level: integer, iconImage: string, score: integer) { - super(localizationKey, name, "", iconImage, score, (scene: BattleScene, args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.level); + constructor(localizationKey: string, name: string, level: number, iconImage: string, score: number) { + super( + localizationKey, + name, + "", + iconImage, + score, + (args: any[]) => (args[0] instanceof Utils.NumberHolder ? args[0].value : args[0]) >= this.level, + ); this.level = level; } } export class ModifierAchv extends Achv { - constructor(localizationKey: string, name: string, description: string, iconImage: string, score: integer, modifierFunc: (modifier: Modifier) => boolean) { - super(localizationKey, name, description, iconImage, score, (_scene: BattleScene, args: any[]) => modifierFunc((args[0] as Modifier))); + constructor( + localizationKey: string, + name: string, + description: string, + iconImage: string, + score: number, + modifierFunc: (modifier: Modifier) => boolean, + ) { + super(localizationKey, name, description, iconImage, score, (args: any[]) => modifierFunc(args[0] as Modifier)); } } export class ChallengeAchv extends Achv { - constructor(localizationKey: string, name: string, description: string, iconImage: string, score: integer, challengeFunc: (challenge: Challenge, scene: BattleScene) => boolean) { - super(localizationKey, name, description, iconImage, score, (_scene: BattleScene, args: any[]) => challengeFunc(args[0] as Challenge, _scene)); + constructor( + localizationKey: string, + name: string, + description: string, + iconImage: string, + score: number, + challengeFunc: (challenge: Challenge) => boolean, + ) { + super(localizationKey, name, description, iconImage, score, (args: any[]) => challengeFunc(args[0] as Challenge)); } } - /** * Get the description of an achievement from the localization file with all the necessary variables filled in * @param localizationKey The localization key of the achievement @@ -152,54 +209,122 @@ export class ChallengeAchv extends Achv { */ export function getAchievementDescription(localizationKey: string): string { // We need to get the player gender from the game data to add the correct prefix to the achievement name - const genderIndex = this?.scene?.gameData?.gender ?? PlayerGender.MALE; //TODO: why is `this` being used here!? We are not inside a scope (copied from original) + const genderIndex = globalScene?.gameData?.gender ?? PlayerGender.MALE; const genderStr = PlayerGender[genderIndex].toLowerCase(); switch (localizationKey) { case "10K_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._10K_MONEY.moneyAmount.toLocaleString("en-US") }); + return i18next.t("achv:MoneyAchv.description", { + context: genderStr, + moneyAmount: achvs._10K_MONEY.moneyAmount.toLocaleString("en-US"), + }); case "100K_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._100K_MONEY.moneyAmount.toLocaleString("en-US") }); + return i18next.t("achv:MoneyAchv.description", { + context: genderStr, + moneyAmount: achvs._100K_MONEY.moneyAmount.toLocaleString("en-US"), + }); case "1M_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._1M_MONEY.moneyAmount.toLocaleString("en-US") }); + return i18next.t("achv:MoneyAchv.description", { + context: genderStr, + moneyAmount: achvs._1M_MONEY.moneyAmount.toLocaleString("en-US"), + }); case "10M_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._10M_MONEY.moneyAmount.toLocaleString("en-US") }); + return i18next.t("achv:MoneyAchv.description", { + context: genderStr, + moneyAmount: achvs._10M_MONEY.moneyAmount.toLocaleString("en-US"), + }); case "250_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._250_DMG.damageAmount.toLocaleString("en-US") }); + return i18next.t("achv:DamageAchv.description", { + context: genderStr, + damageAmount: achvs._250_DMG.damageAmount.toLocaleString("en-US"), + }); case "1000_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._1000_DMG.damageAmount.toLocaleString("en-US") }); + return i18next.t("achv:DamageAchv.description", { + context: genderStr, + damageAmount: achvs._1000_DMG.damageAmount.toLocaleString("en-US"), + }); case "2500_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._2500_DMG.damageAmount.toLocaleString("en-US") }); + return i18next.t("achv:DamageAchv.description", { + context: genderStr, + damageAmount: achvs._2500_DMG.damageAmount.toLocaleString("en-US"), + }); case "10000_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._10000_DMG.damageAmount.toLocaleString("en-US") }); + return i18next.t("achv:DamageAchv.description", { + context: genderStr, + damageAmount: achvs._10000_DMG.damageAmount.toLocaleString("en-US"), + }); case "250_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._250_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + return i18next.t("achv:HealAchv.description", { + context: genderStr, + healAmount: achvs._250_HEAL.healAmount.toLocaleString("en-US"), + HP: i18next.t(getShortenedStatKey(Stat.HP)), + }); case "1000_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._1000_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + return i18next.t("achv:HealAchv.description", { + context: genderStr, + healAmount: achvs._1000_HEAL.healAmount.toLocaleString("en-US"), + HP: i18next.t(getShortenedStatKey(Stat.HP)), + }); case "2500_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._2500_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + return i18next.t("achv:HealAchv.description", { + context: genderStr, + healAmount: achvs._2500_HEAL.healAmount.toLocaleString("en-US"), + HP: i18next.t(getShortenedStatKey(Stat.HP)), + }); case "10000_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._10000_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + return i18next.t("achv:HealAchv.description", { + context: genderStr, + healAmount: achvs._10000_HEAL.healAmount.toLocaleString("en-US"), + HP: i18next.t(getShortenedStatKey(Stat.HP)), + }); case "LV_100": - return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_100.level }); + return i18next.t("achv:LevelAchv.description", { + context: genderStr, + level: achvs.LV_100.level, + }); case "LV_250": - return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_250.level }); + return i18next.t("achv:LevelAchv.description", { + context: genderStr, + level: achvs.LV_250.level, + }); case "LV_1000": - return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_1000.level }); + return i18next.t("achv:LevelAchv.description", { + context: genderStr, + level: achvs.LV_1000.level, + }); case "10_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "25_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "50_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "75_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "100_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + return i18next.t("achv:RibbonAchv.description", { + context: genderStr, + ribbonAmount: achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US"), + }); case "TRANSFER_MAX_STAT_STAGE": - return i18next.t("achv:TRANSFER_MAX_STAT_STAGE.description", { context: genderStr }); + return i18next.t("achv:TRANSFER_MAX_STAT_STAGE.description", { + context: genderStr, + }); case "MAX_FRIENDSHIP": - return i18next.t("achv:MAX_FRIENDSHIP.description", { context: genderStr }); + return i18next.t("achv:MAX_FRIENDSHIP.description", { + context: genderStr, + }); case "MEGA_EVOLVE": return i18next.t("achv:MEGA_EVOLVE.description", { context: genderStr }); case "GIGANTAMAX": @@ -207,55 +332,89 @@ export function getAchievementDescription(localizationKey: string): string { case "TERASTALLIZE": return i18next.t("achv:TERASTALLIZE.description", { context: genderStr }); case "STELLAR_TERASTALLIZE": - return i18next.t("achv:STELLAR_TERASTALLIZE.description", { context: genderStr }); + return i18next.t("achv:STELLAR_TERASTALLIZE.description", { + context: genderStr, + }); case "SPLICE": return i18next.t("achv:SPLICE.description", { context: genderStr }); case "MINI_BLACK_HOLE": - return i18next.t("achv:MINI_BLACK_HOLE.description", { context: genderStr }); + return i18next.t("achv:MINI_BLACK_HOLE.description", { + context: genderStr, + }); case "CATCH_MYTHICAL": - return i18next.t("achv:CATCH_MYTHICAL.description", { context: genderStr }); + return i18next.t("achv:CATCH_MYTHICAL.description", { + context: genderStr, + }); case "CATCH_SUB_LEGENDARY": - return i18next.t("achv:CATCH_SUB_LEGENDARY.description", { context: genderStr }); + return i18next.t("achv:CATCH_SUB_LEGENDARY.description", { + context: genderStr, + }); case "CATCH_LEGENDARY": - return i18next.t("achv:CATCH_LEGENDARY.description", { context: genderStr }); + return i18next.t("achv:CATCH_LEGENDARY.description", { + context: genderStr, + }); case "SEE_SHINY": return i18next.t("achv:SEE_SHINY.description", { context: genderStr }); case "SHINY_PARTY": return i18next.t("achv:SHINY_PARTY.description", { context: genderStr }); case "HATCH_MYTHICAL": - return i18next.t("achv:HATCH_MYTHICAL.description", { context: genderStr }); + return i18next.t("achv:HATCH_MYTHICAL.description", { + context: genderStr, + }); case "HATCH_SUB_LEGENDARY": - return i18next.t("achv:HATCH_SUB_LEGENDARY.description", { context: genderStr }); + return i18next.t("achv:HATCH_SUB_LEGENDARY.description", { + context: genderStr, + }); case "HATCH_LEGENDARY": - return i18next.t("achv:HATCH_LEGENDARY.description", { context: genderStr }); + return i18next.t("achv:HATCH_LEGENDARY.description", { + context: genderStr, + }); case "HATCH_SHINY": return i18next.t("achv:HATCH_SHINY.description", { context: genderStr }); case "HIDDEN_ABILITY": - return i18next.t("achv:HIDDEN_ABILITY.description", { context: genderStr }); + return i18next.t("achv:HIDDEN_ABILITY.description", { + context: genderStr, + }); case "PERFECT_IVS": return i18next.t("achv:PERFECT_IVS.description", { context: genderStr }); case "CLASSIC_VICTORY": - return i18next.t("achv:CLASSIC_VICTORY.description", { context: genderStr }); + return i18next.t("achv:CLASSIC_VICTORY.description", { + context: genderStr, + }); case "UNEVOLVED_CLASSIC_VICTORY": - return i18next.t("achv:UNEVOLVED_CLASSIC_VICTORY.description", { context: genderStr }); + return i18next.t("achv:UNEVOLVED_CLASSIC_VICTORY.description", { + context: genderStr, + }); case "MONO_GEN_ONE": return i18next.t("achv:MONO_GEN_ONE.description", { context: genderStr }); case "MONO_GEN_TWO": return i18next.t("achv:MONO_GEN_TWO.description", { context: genderStr }); case "MONO_GEN_THREE": - return i18next.t("achv:MONO_GEN_THREE.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_THREE.description", { + context: genderStr, + }); case "MONO_GEN_FOUR": - return i18next.t("achv:MONO_GEN_FOUR.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_FOUR.description", { + context: genderStr, + }); case "MONO_GEN_FIVE": - return i18next.t("achv:MONO_GEN_FIVE.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_FIVE.description", { + context: genderStr, + }); case "MONO_GEN_SIX": return i18next.t("achv:MONO_GEN_SIX.description", { context: genderStr }); case "MONO_GEN_SEVEN": - return i18next.t("achv:MONO_GEN_SEVEN.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_SEVEN.description", { + context: genderStr, + }); case "MONO_GEN_EIGHT": - return i18next.t("achv:MONO_GEN_EIGHT.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_EIGHT.description", { + context: genderStr, + }); case "MONO_GEN_NINE": - return i18next.t("achv:MONO_GEN_NINE.description", { context: genderStr }); + return i18next.t("achv:MONO_GEN_NINE.description", { + context: genderStr, + }); case "MONO_NORMAL": case "MONO_FIGHTING": case "MONO_FLYING": @@ -274,17 +433,27 @@ export function getAchievementDescription(localizationKey: string): string { case "MONO_DRAGON": case "MONO_DARK": case "MONO_FAIRY": - return i18next.t("achv:MonoType.description", { context: genderStr, "type": i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`) }); + return i18next.t("achv:MonoType.description", { + context: genderStr, + type: i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`), + }); case "FRESH_START": return i18next.t("achv:FRESH_START.description", { context: genderStr }); case "INVERSE_BATTLE": - return i18next.t("achv:INVERSE_BATTLE.description", { context: genderStr }); + return i18next.t("achv:INVERSE_BATTLE.description", { + context: genderStr, + }); + case "FLIP_STATS": + return i18next.t("achv:FLIP_STATS.description", { context: genderStr }); + case "FLIP_INVERSE": + return i18next.t("achv:FLIP_INVERSE.description", { context: genderStr }); case "BREEDERS_IN_SPACE": - return i18next.t("achv:BREEDERS_IN_SPACE.description", { context: genderStr }); + return i18next.t("achv:BREEDERS_IN_SPACE.description", { + context: genderStr, + }); default: return ""; } - } export const achvs = { @@ -308,62 +477,457 @@ export const achvs = { _50_RIBBONS: new RibbonAchv("50_RIBBONS", "", 50, "ultra_ribbon", 50).setSecret(true), _75_RIBBONS: new RibbonAchv("75_RIBBONS", "", 75, "rogue_ribbon", 75).setSecret(true), _100_RIBBONS: new RibbonAchv("100_RIBBONS", "", 100, "master_ribbon", 100).setSecret(true), - TRANSFER_MAX_STAT_STAGE: new Achv("TRANSFER_MAX_STAT_STAGE", "", "TRANSFER_MAX_STAT_STAGE.description", "baton", 20), + TRANSFER_MAX_STAT_STAGE: new Achv("TRANSFER_MAX_STAT_STAGE", "", "TRANSFER_MAX_STAT_STAGE.description", "baton", 20), MAX_FRIENDSHIP: new Achv("MAX_FRIENDSHIP", "", "MAX_FRIENDSHIP.description", "soothe_bell", 25), MEGA_EVOLVE: new Achv("MEGA_EVOLVE", "", "MEGA_EVOLVE.description", "mega_bracelet", 50), GIGANTAMAX: new Achv("GIGANTAMAX", "", "GIGANTAMAX.description", "dynamax_band", 50), - TERASTALLIZE: new Achv("TERASTALLIZE", "", "TERASTALLIZE.description", "tera_orb", 25), - STELLAR_TERASTALLIZE: new Achv("STELLAR_TERASTALLIZE", "", "STELLAR_TERASTALLIZE.description", "stellar_tera_shard", 25).setSecret(true), - SPLICE: new Achv("SPLICE", "", "SPLICE.description", "dna_splicers", 10), - MINI_BLACK_HOLE: new ModifierAchv("MINI_BLACK_HOLE", "", "MINI_BLACK_HOLE.description", "mini_black_hole", 25, modifier => modifier instanceof TurnHeldItemTransferModifier).setSecret(), - CATCH_MYTHICAL: new Achv("CATCH_MYTHICAL", "", "CATCH_MYTHICAL.description", "strange_ball", 50).setSecret(), - CATCH_SUB_LEGENDARY: new Achv("CATCH_SUB_LEGENDARY", "", "CATCH_SUB_LEGENDARY.description", "rb", 75).setSecret(), + TERASTALLIZE: new Achv("TERASTALLIZE", "", "TERASTALLIZE.description", "tera_orb", 25), + STELLAR_TERASTALLIZE: new Achv( + "STELLAR_TERASTALLIZE", + "", + "STELLAR_TERASTALLIZE.description", + "stellar_tera_shard", + 25, + ).setSecret(true), + SPLICE: new Achv("SPLICE", "", "SPLICE.description", "dna_splicers", 10), + MINI_BLACK_HOLE: new ModifierAchv( + "MINI_BLACK_HOLE", + "", + "MINI_BLACK_HOLE.description", + "mini_black_hole", + 25, + modifier => modifier instanceof TurnHeldItemTransferModifier, + ).setSecret(), + CATCH_MYTHICAL: new Achv("CATCH_MYTHICAL", "", "CATCH_MYTHICAL.description", "strange_ball", 50).setSecret(), + CATCH_SUB_LEGENDARY: new Achv("CATCH_SUB_LEGENDARY", "", "CATCH_SUB_LEGENDARY.description", "rb", 75).setSecret(), CATCH_LEGENDARY: new Achv("CATCH_LEGENDARY", "", "CATCH_LEGENDARY.description", "mb", 100).setSecret(), SEE_SHINY: new Achv("SEE_SHINY", "", "SEE_SHINY.description", "pb_gold", 75), SHINY_PARTY: new Achv("SHINY_PARTY", "", "SHINY_PARTY.description", "shiny_charm", 100).setSecret(true), HATCH_MYTHICAL: new Achv("HATCH_MYTHICAL", "", "HATCH_MYTHICAL.description", "mystery_egg", 75).setSecret(), - HATCH_SUB_LEGENDARY: new Achv("HATCH_SUB_LEGENDARY", "", "HATCH_SUB_LEGENDARY.description", "oval_stone", 100).setSecret(), - HATCH_LEGENDARY: new Achv("HATCH_LEGENDARY", "", "HATCH_LEGENDARY.description", "lucky_egg", 125).setSecret(), - HATCH_SHINY: new Achv("HATCH_SHINY", "", "HATCH_SHINY.description", "golden_egg", 100).setSecret(), - HIDDEN_ABILITY: new Achv("HIDDEN_ABILITY", "", "HIDDEN_ABILITY.description", "ability_charm", 75), - PERFECT_IVS: new Achv("PERFECT_IVS", "", "PERFECT_IVS.description", "blunder_policy", 100), - CLASSIC_VICTORY: new Achv("CLASSIC_VICTORY", "", "CLASSIC_VICTORY.description", "relic_crown", 150, c => c.gameData.gameStats.sessionsWon === 0), - UNEVOLVED_CLASSIC_VICTORY: new Achv("UNEVOLVED_CLASSIC_VICTORY", "", "UNEVOLVED_CLASSIC_VICTORY.description", "eviolite", 175, c => c.getParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions)), - MONO_GEN_ONE_VICTORY: new ChallengeAchv("MONO_GEN_ONE", "", "MONO_GEN_ONE.description", "ribbon_gen1", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 1 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GEN_TWO_VICTORY: new ChallengeAchv("MONO_GEN_TWO", "", "MONO_GEN_TWO.description", "ribbon_gen2", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 2 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GEN_THREE_VICTORY: new ChallengeAchv("MONO_GEN_THREE", "", "MONO_GEN_THREE.description", "ribbon_gen3", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 3 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GEN_FOUR_VICTORY: new ChallengeAchv("MONO_GEN_FOUR", "", "MONO_GEN_FOUR.description", "ribbon_gen4", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 4 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GEN_FIVE_VICTORY: new ChallengeAchv("MONO_GEN_FIVE", "", "MONO_GEN_FIVE.description", "ribbon_gen5", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 5 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GEN_SIX_VICTORY: new ChallengeAchv("MONO_GEN_SIX", "", "MONO_GEN_SIX.description", "ribbon_gen6", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 6 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GEN_SEVEN_VICTORY: new ChallengeAchv("MONO_GEN_SEVEN", "", "MONO_GEN_SEVEN.description", "ribbon_gen7", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 7 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GEN_EIGHT_VICTORY: new ChallengeAchv("MONO_GEN_EIGHT", "", "MONO_GEN_EIGHT.description", "ribbon_gen8", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 8 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GEN_NINE_VICTORY: new ChallengeAchv("MONO_GEN_NINE", "", "MONO_GEN_NINE.description", "ribbon_gen9", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 9 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_NORMAL: new ChallengeAchv("MONO_NORMAL", "", "MONO_NORMAL.description", "silk_scarf", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 1 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_FIGHTING: new ChallengeAchv("MONO_FIGHTING", "", "MONO_FIGHTING.description", "black_belt", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 2 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_FLYING: new ChallengeAchv("MONO_FLYING", "", "MONO_FLYING.description", "sharp_beak", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 3 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_POISON: new ChallengeAchv("MONO_POISON", "", "MONO_POISON.description", "poison_barb", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 4 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GROUND: new ChallengeAchv("MONO_GROUND", "", "MONO_GROUND.description", "soft_sand", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 5 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_ROCK: new ChallengeAchv("MONO_ROCK", "", "MONO_ROCK.description", "hard_stone", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 6 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_BUG: new ChallengeAchv("MONO_BUG", "", "MONO_BUG.description", "silver_powder", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 7 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GHOST: new ChallengeAchv("MONO_GHOST", "", "MONO_GHOST.description", "spell_tag", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 8 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_STEEL: new ChallengeAchv("MONO_STEEL", "", "MONO_STEEL.description", "metal_coat", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 9 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_FIRE: new ChallengeAchv("MONO_FIRE", "", "MONO_FIRE.description", "charcoal", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 10 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_WATER: new ChallengeAchv("MONO_WATER", "", "MONO_WATER.description", "mystic_water", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 11 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_GRASS: new ChallengeAchv("MONO_GRASS", "", "MONO_GRASS.description", "miracle_seed", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 12 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_ELECTRIC: new ChallengeAchv("MONO_ELECTRIC", "", "MONO_ELECTRIC.description", "magnet", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 13 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_PSYCHIC: new ChallengeAchv("MONO_PSYCHIC", "", "MONO_PSYCHIC.description", "twisted_spoon", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 14 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_ICE: new ChallengeAchv("MONO_ICE", "", "MONO_ICE.description", "never_melt_ice", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 15 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_DRAGON: new ChallengeAchv("MONO_DRAGON", "", "MONO_DRAGON.description", "dragon_fang", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 16 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - MONO_DARK: new ChallengeAchv("MONO_DARK", "", "MONO_DARK.description", "black_glasses", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 17 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), - 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(), + HATCH_SUB_LEGENDARY: new Achv( + "HATCH_SUB_LEGENDARY", + "", + "HATCH_SUB_LEGENDARY.description", + "oval_stone", + 100, + ).setSecret(), + HATCH_LEGENDARY: new Achv("HATCH_LEGENDARY", "", "HATCH_LEGENDARY.description", "lucky_egg", 125).setSecret(), + HATCH_SHINY: new Achv("HATCH_SHINY", "", "HATCH_SHINY.description", "golden_egg", 100).setSecret(), + HIDDEN_ABILITY: new Achv("HIDDEN_ABILITY", "", "HIDDEN_ABILITY.description", "ability_charm", 75), + PERFECT_IVS: new Achv("PERFECT_IVS", "", "PERFECT_IVS.description", "blunder_policy", 100), + CLASSIC_VICTORY: new Achv( + "CLASSIC_VICTORY", + "", + "CLASSIC_VICTORY.description", + "relic_crown", + 150, + _ => globalScene.gameData.gameStats.sessionsWon === 0, + ), + UNEVOLVED_CLASSIC_VICTORY: new Achv( + "UNEVOLVED_CLASSIC_VICTORY", + "", + "UNEVOLVED_CLASSIC_VICTORY.description", + "eviolite", + 175, + _ => globalScene.getPlayerParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions), + ), + MONO_GEN_ONE_VICTORY: new ChallengeAchv( + "MONO_GEN_ONE", + "", + "MONO_GEN_ONE.description", + "ribbon_gen1", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 1 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_TWO_VICTORY: new ChallengeAchv( + "MONO_GEN_TWO", + "", + "MONO_GEN_TWO.description", + "ribbon_gen2", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 2 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_THREE_VICTORY: new ChallengeAchv( + "MONO_GEN_THREE", + "", + "MONO_GEN_THREE.description", + "ribbon_gen3", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 3 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_FOUR_VICTORY: new ChallengeAchv( + "MONO_GEN_FOUR", + "", + "MONO_GEN_FOUR.description", + "ribbon_gen4", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 4 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_FIVE_VICTORY: new ChallengeAchv( + "MONO_GEN_FIVE", + "", + "MONO_GEN_FIVE.description", + "ribbon_gen5", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 5 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_SIX_VICTORY: new ChallengeAchv( + "MONO_GEN_SIX", + "", + "MONO_GEN_SIX.description", + "ribbon_gen6", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 6 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_SEVEN_VICTORY: new ChallengeAchv( + "MONO_GEN_SEVEN", + "", + "MONO_GEN_SEVEN.description", + "ribbon_gen7", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 7 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_EIGHT_VICTORY: new ChallengeAchv( + "MONO_GEN_EIGHT", + "", + "MONO_GEN_EIGHT.description", + "ribbon_gen8", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 8 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GEN_NINE_VICTORY: new ChallengeAchv( + "MONO_GEN_NINE", + "", + "MONO_GEN_NINE.description", + "ribbon_gen9", + 100, + c => + c instanceof SingleGenerationChallenge && + c.value === 9 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_NORMAL: new ChallengeAchv( + "MONO_NORMAL", + "", + "MONO_NORMAL.description", + "silk_scarf", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 1 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_FIGHTING: new ChallengeAchv( + "MONO_FIGHTING", + "", + "MONO_FIGHTING.description", + "black_belt", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 2 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_FLYING: new ChallengeAchv( + "MONO_FLYING", + "", + "MONO_FLYING.description", + "sharp_beak", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 3 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_POISON: new ChallengeAchv( + "MONO_POISON", + "", + "MONO_POISON.description", + "poison_barb", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 4 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GROUND: new ChallengeAchv( + "MONO_GROUND", + "", + "MONO_GROUND.description", + "soft_sand", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 5 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_ROCK: new ChallengeAchv( + "MONO_ROCK", + "", + "MONO_ROCK.description", + "hard_stone", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 6 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_BUG: new ChallengeAchv( + "MONO_BUG", + "", + "MONO_BUG.description", + "silver_powder", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 7 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GHOST: new ChallengeAchv( + "MONO_GHOST", + "", + "MONO_GHOST.description", + "spell_tag", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 8 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_STEEL: new ChallengeAchv( + "MONO_STEEL", + "", + "MONO_STEEL.description", + "metal_coat", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 9 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_FIRE: new ChallengeAchv( + "MONO_FIRE", + "", + "MONO_FIRE.description", + "charcoal", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 10 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_WATER: new ChallengeAchv( + "MONO_WATER", + "", + "MONO_WATER.description", + "mystic_water", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 11 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_GRASS: new ChallengeAchv( + "MONO_GRASS", + "", + "MONO_GRASS.description", + "miracle_seed", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 12 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_ELECTRIC: new ChallengeAchv( + "MONO_ELECTRIC", + "", + "MONO_ELECTRIC.description", + "magnet", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 13 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_PSYCHIC: new ChallengeAchv( + "MONO_PSYCHIC", + "", + "MONO_PSYCHIC.description", + "twisted_spoon", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 14 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_ICE: new ChallengeAchv( + "MONO_ICE", + "", + "MONO_ICE.description", + "never_melt_ice", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 15 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_DRAGON: new ChallengeAchv( + "MONO_DRAGON", + "", + "MONO_DRAGON.description", + "dragon_fang", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 16 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_DARK: new ChallengeAchv( + "MONO_DARK", + "", + "MONO_DARK.description", + "black_glasses", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 17 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + MONO_FAIRY: new ChallengeAchv( + "MONO_FAIRY", + "", + "MONO_FAIRY.description", + "fairy_feather", + 100, + c => + c instanceof SingleTypeChallenge && + c.value === 18 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + FRESH_START: new ChallengeAchv( + "FRESH_START", + "", + "FRESH_START.description", + "reviver_seed", + 100, + c => + c instanceof FreshStartChallenge && + c.value > 0 && + !globalScene.gameMode.challenges.some( + c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, + ), + ), + INVERSE_BATTLE: new ChallengeAchv( + "INVERSE_BATTLE", + "", + "INVERSE_BATTLE.description", + "inverse", + 100, + c => c instanceof InverseBattleChallenge && c.value > 0, + ), + FLIP_STATS: new ChallengeAchv( + "FLIP_STATS", + "", + "FLIP_STATS.description", + "dubious_disc", + 100, + c => c instanceof FlipStatChallenge && c.value > 0, + ), + FLIP_INVERSE: new ChallengeAchv( + "FLIP_INVERSE", + "", + "FLIP_INVERSE.description", + "cracked_pot", + 100, + c => + c instanceof FlipStatChallenge && + c.value > 0 && + globalScene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0), + ).setSecret(), + BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 50).setSecret(), }; export function initAchievements() { const achvKeys = Object.keys(achvs); - achvKeys.forEach((a: string, i: integer) => { + achvKeys.forEach((a: string, i: number) => { achvs[a].id = a; if (achvs[a].hasParent) { achvs[a].parentId = achvKeys[i - 1]; diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts index ba37de0ed0e..07396b31d1b 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -1,6 +1,7 @@ import { Arena } from "../field/arena"; -import { ArenaTag, loadArenaTag } from "../data/arena-tag"; -import { Biome } from "#enums/biome"; +import type { ArenaTag } from "../data/arena-tag"; +import { loadArenaTag } from "../data/arena-tag"; +import type { Biome } from "#enums/biome"; import { Weather } from "../data/weather"; import { Terrain } from "#app/data/terrain"; @@ -9,12 +10,22 @@ export default class ArenaData { public weather: Weather | null; public terrain: Terrain | null; public tags: ArenaTag[]; + public playerTerasUsed: number; constructor(source: Arena | any) { - const sourceArena = source instanceof Arena ? source as Arena : null; + const sourceArena = source instanceof Arena ? (source as Arena) : null; this.biome = sourceArena ? sourceArena.biomeType : source.biome; - this.weather = sourceArena ? sourceArena.weather : source.weather ? new Weather(source.weather.weatherType, source.weather.turnsLeft) : null; - this.terrain = sourceArena ? sourceArena.terrain : source.terrain ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) : null; + this.weather = sourceArena + ? sourceArena.weather + : source.weather + ? new Weather(source.weather.weatherType, source.weather.turnsLeft) + : null; + this.terrain = sourceArena + ? sourceArena.terrain + : source.terrain + ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) + : null; + this.playerTerasUsed = (sourceArena ? sourceArena.playerTerasUsed : source.playerTerasUsed) ?? 0; this.tags = []; if (source.tags) { diff --git a/src/system/challenge-data.ts b/src/system/challenge-data.ts index 394d63867be..87299ae653a 100644 --- a/src/system/challenge-data.ts +++ b/src/system/challenge-data.ts @@ -1,9 +1,10 @@ -import { Challenge, copyChallenge } from "#app/data/challenge"; +import type { Challenge } from "#app/data/challenge"; +import { copyChallenge } from "#app/data/challenge"; export default class ChallengeData { - public id: integer; - public value: integer; - public severity: integer; + public id: number; + public value: number; + public severity: number; constructor(source: Challenge | any) { this.id = source.id; diff --git a/src/system/egg-data.ts b/src/system/egg-data.ts index aa06316a61f..8fb8335bcf7 100644 --- a/src/system/egg-data.ts +++ b/src/system/egg-data.ts @@ -1,15 +1,15 @@ -import { EggTier } from "#enums/egg-type"; -import { Species } from "#enums/species"; -import { VariantTier } from "#enums/variant-tier"; +import type { EggTier } from "#enums/egg-type"; +import type { Species } from "#enums/species"; +import type { VariantTier } from "#enums/variant-tier"; import { EGG_SEED, Egg } from "../data/egg"; -import { EggSourceType } from "#app/enums/egg-source-types"; +import type { EggSourceType } from "#app/enums/egg-source-types"; export default class EggData { - public id: integer; + public id: number; public tier: EggTier; public sourceType: EggSourceType; - public hatchWaves: integer; - public timestamp: integer; + public hatchWaves: number; + public timestamp: number; public variantTier: VariantTier; public isShiny: boolean; public species: Species; @@ -17,9 +17,9 @@ export default class EggData { public overrideHiddenAbility: boolean; constructor(source: Egg | any) { - const sourceEgg = source instanceof Egg ? source as Egg : null; + const sourceEgg = source instanceof Egg ? (source as Egg) : null; this.id = sourceEgg ? sourceEgg.id : source.id; - this.tier = sourceEgg ? sourceEgg.tier : (source.tier ?? Math.floor(this.id / EGG_SEED)); + this.tier = sourceEgg ? sourceEgg.tier : (source.tier ?? Math.floor(this.id / EGG_SEED)); // legacy egg if (source.species === 0) { // check if it has a gachaType (deprecated) @@ -39,11 +39,25 @@ export default class EggData { toEgg(): Egg { // Species will be 0 if an old legacy is loaded from DB if (!this.species) { - return new Egg({ id: this.id, hatchWaves: this.hatchWaves, sourceType: this.sourceType, timestamp: this.timestamp, tier: Math.floor(this.id / EGG_SEED) }); - } else { - return new Egg({ id: this.id, tier: this.tier, sourceType: this.sourceType, hatchWaves: this.hatchWaves, - timestamp: this.timestamp, variantTier: this.variantTier, isShiny: this.isShiny, species: this.species, - eggMoveIndex: this.eggMoveIndex, overrideHiddenAbility: this.overrideHiddenAbility }); + return new Egg({ + id: this.id, + hatchWaves: this.hatchWaves, + sourceType: this.sourceType, + timestamp: this.timestamp, + tier: Math.floor(this.id / EGG_SEED), + }); } + return new Egg({ + id: this.id, + tier: this.tier, + sourceType: this.sourceType, + hatchWaves: this.hatchWaves, + timestamp: this.timestamp, + variantTier: this.variantTier, + isShiny: this.isShiny, + species: this.species, + eggMoveIndex: this.eggMoveIndex, + overrideHiddenAbility: this.overrideHiddenAbility, + }); } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index c00159a7fd7..82ad2276fef 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1,8 +1,12 @@ import i18next from "i18next"; -import BattleScene, { bypassLogin, PokeballCounts } from "#app/battle-scene"; -import Pokemon, { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import type { PokeballCounts } from "#app/battle-scene"; +import { bypassLogin } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import type { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys } from "#app/data/pokemon-species"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; import * as Utils from "#app/utils"; import Overrides from "#app/overrides"; @@ -17,27 +21,28 @@ import { trainerConfigs } from "#app/data/trainer-config"; import { resetSettings, setSetting, SettingKeys } from "#app/system/settings/settings"; import { achvs } from "#app/system/achv"; import EggData from "#app/system/egg-data"; -import { Egg } from "#app/data/egg"; +import type { Egg } from "#app/data/egg"; import { vouchers, VoucherType } from "#app/system/voucher"; import { AES, enc } from "crypto-js"; import { Mode } from "#app/ui/ui"; import { clientSessionId, loggedInUser, updateUserInfo } from "#app/account"; -import { Nature } from "#app/data/nature"; +import { Nature } from "#enums/nature"; import { GameStats } from "#app/system/game-stats"; import { Tutorial } from "#app/tutorial"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { TrainerVariant } from "#app/field/trainer"; -import { Variant } from "#app/data/variant"; +import type { Variant } from "#app/data/variant"; import { setSettingGamepad, SettingGamepad, settingGamepadDefaults } from "#app/system/settings/settings-gamepad"; -import { setSettingKeyboard, SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import type { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { setSettingKeyboard } from "#app/system/settings/settings-keyboard"; import { TagAddedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; import * as Modifier from "#app/modifier/modifier"; -import { StatusEffect } from "#app/data/status-effect"; +import { StatusEffect } from "#enums/status-effect"; import ChallengeData from "#app/system/challenge-data"; import { Device } from "#enums/devices"; import { GameDataType } from "#enums/game-data-type"; -import { Moves } from "#enums/moves"; +import type { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { applyChallenges, ChallengeType } from "#app/data/challenge"; @@ -45,27 +50,51 @@ import { WeatherType } from "#enums/weather-type"; import { TerrainType } from "#app/data/terrain"; import { ReloadSessionPhase } from "#app/phases/reload-session-phase"; import { RUN_HISTORY_LIMIT } from "#app/ui/run-history-ui-handler"; -import { applySessionVersionMigration, applySystemVersionMigration, applySettingsVersionMigration } from "./version_migration/version_converter"; +import { + applySessionVersionMigration, + applySystemVersionMigration, + applySettingsVersionMigration, +} from "./version_migration/version_converter"; import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { PokerogueApiClearSessionData } from "#app/@types/pokerogue-api"; +import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { ArenaTrapTag } from "#app/data/arena-tag"; +import { pokemonFormChanges } from "#app/data/pokemon-forms"; +import type { PokemonType } from "#enums/pokemon-type"; export const defaultStarterSpecies: Species[] = [ - Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, - Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, - Species.TREECKO, Species.TORCHIC, Species.MUDKIP, - Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, - Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, - Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, - Species.ROWLET, Species.LITTEN, Species.POPPLIO, - Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, - Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY + Species.BULBASAUR, + Species.CHARMANDER, + Species.SQUIRTLE, + Species.CHIKORITA, + Species.CYNDAQUIL, + Species.TOTODILE, + Species.TREECKO, + Species.TORCHIC, + Species.MUDKIP, + Species.TURTWIG, + Species.CHIMCHAR, + Species.PIPLUP, + Species.SNIVY, + Species.TEPIG, + Species.OSHAWOTT, + Species.CHESPIN, + Species.FENNEKIN, + Species.FROAKIE, + Species.ROWLET, + Species.LITTEN, + Species.POPPLIO, + Species.GROOKEY, + Species.SCORBUNNY, + Species.SOBBLE, + Species.SPRIGATITO, + Species.FUECOCO, + Species.QUAXLY, ]; const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary -export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): string { +export function getDataTypeKey(dataType: GameDataType, slotId = 0): string { switch (dataType) { case GameDataType.SYSTEM: return "data"; @@ -87,20 +116,20 @@ export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): str } export function encrypt(data: string, bypassLogin: boolean): string { - return (bypassLogin - ? (data: string) => btoa(data) - : (data: string) => AES.encrypt(data, saveKey))(data) as unknown as string; // TODO: is this correct? + return (bypassLogin ? (data: string) => btoa(data) : (data: string) => AES.encrypt(data, saveKey))( + data, + ) as unknown as string; // TODO: is this correct? } export function decrypt(data: string, bypassLogin: boolean): string { - return (bypassLogin - ? (data: string) => atob(data) - : (data: string) => AES.decrypt(data, saveKey).toString(enc.Utf8))(data); + return (bypassLogin ? (data: string) => atob(data) : (data: string) => AES.decrypt(data, saveKey).toString(enc.Utf8))( + data, + ); } export interface SystemSaveData { - trainerId: integer; - secretId: integer; + trainerId: number; + secretId: number; gender: PlayerGender; dexData: DexData; starterData: StarterData; @@ -111,14 +140,14 @@ export interface SystemSaveData { voucherCounts: VoucherCounts; eggs: EggData[]; gameVersion: string; - timestamp: integer; - eggPity: integer[]; - unlockPity: integer[]; + timestamp: number; + eggPity: number[]; + unlockPity: number[]; } export interface SessionSaveData { seed: string; - playTime: integer; + playTime: number; gameMode: GameModes; party: PokemonData[]; enemyParty: PokemonData[]; @@ -126,46 +155,50 @@ export interface SessionSaveData { enemyModifiers: PersistentModifierData[]; arena: ArenaData; pokeballCounts: PokeballCounts; - money: integer; - score: integer; - waveIndex: integer; + money: number; + score: number; + waveIndex: number; battleType: BattleType; trainer: TrainerData; gameVersion: string; - timestamp: integer; + timestamp: number; challenges: ChallengeData[]; mysteryEncounterType: MysteryEncounterType | -1; // Only defined when current wave is ME, mysteryEncounterSaveData: MysteryEncounterSaveData; + /** + * Counts the amount of pokemon fainted in your party during the current arena encounter. + */ + playerFaints: number; } interface Unlocks { - [key: integer]: boolean; + [key: number]: boolean; } interface AchvUnlocks { - [key: string]: integer + [key: string]: number; } interface VoucherUnlocks { - [key: string]: integer + [key: string]: number; } export interface VoucherCounts { - [type: string]: integer; + [type: string]: number; } export interface DexData { - [key: integer]: DexEntry + [key: number]: DexEntry; } export interface DexEntry { seenAttr: bigint; caughtAttr: bigint; - natureAttr: integer, - seenCount: integer; - caughtCount: integer; - hatchedCount: integer; - ivs: integer[]; + natureAttr: number; + seenCount: number; + caughtCount: number; + hatchedCount: number; + ivs: number[]; } export const DexAttr = { @@ -176,20 +209,20 @@ export const DexAttr = { DEFAULT_VARIANT: 16n, VARIANT_2: 32n, VARIANT_3: 64n, - DEFAULT_FORM: 128n + DEFAULT_FORM: 128n, }; export interface DexAttrProps { shiny: boolean; female: boolean; variant: Variant; - formIndex: integer; + formIndex: number; } export const AbilityAttr = { ABILITY_1: 1, ABILITY_2: 2, - ABILITY_HIDDEN: 4 + ABILITY_HIDDEN: 4, }; export type RunHistoryData = Record; @@ -201,78 +234,79 @@ export interface RunEntry { isFavorite: boolean; } -export type StarterMoveset = [ Moves ] | [ Moves, Moves ] | [ Moves, Moves, Moves ] | [ Moves, Moves, Moves, Moves ]; +export type StarterMoveset = [Moves] | [Moves, Moves] | [Moves, Moves, Moves] | [Moves, Moves, Moves, Moves]; export interface StarterFormMoveData { - [key: integer]: StarterMoveset + [key: number]: StarterMoveset; } export interface StarterMoveData { - [key: integer]: StarterMoveset | StarterFormMoveData + [key: number]: StarterMoveset | StarterFormMoveData; } export interface StarterAttributes { - nature?: integer; - ability?: integer; - variant?: integer; - form?: integer; + nature?: number; + ability?: number; + variant?: number; + form?: number; female?: boolean; shiny?: boolean; favorite?: boolean; nickname?: string; + tera?: PokemonType; } export interface StarterPreferences { - [key: integer]: StarterAttributes; + [key: number]: StarterAttributes; } // the latest data saved/loaded for the Starter Preferences. Required to reduce read/writes. Initialize as "{}", since this is the default value and no data needs to be stored if present. // if they ever add private static variables, move this into StarterPrefs -const StarterPrefers_DEFAULT : string = "{}"; -let StarterPrefers_private_latest : string = StarterPrefers_DEFAULT; +const StarterPrefers_DEFAULT: string = "{}"; +let StarterPrefers_private_latest: string = StarterPrefers_DEFAULT; +// called on starter selection show once +export function loadStarterPreferences(): StarterPreferences { + return JSON.parse( + (StarterPrefers_private_latest = + localStorage.getItem(`starterPrefs_${loggedInUser?.username}`) || StarterPrefers_DEFAULT), + ); +} + +// called on starter selection clear, always +export function saveStarterPreferences(prefs: StarterPreferences): void { + const pStr: string = JSON.stringify(prefs); + if (pStr !== StarterPrefers_private_latest) { + // something changed, store the update + localStorage.setItem(`starterPrefs_${loggedInUser?.username}`, pStr); + // update the latest prefs + StarterPrefers_private_latest = pStr; + } +} // This is its own class as StarterPreferences... // - don't need to be loaded on startup // - isn't stored with other data // - don't require to be encrypted // - shouldn't require calls outside of the starter selection -export class StarterPrefs { - // called on starter selection show once - static load(): StarterPreferences { - return JSON.parse( - StarterPrefers_private_latest = (localStorage.getItem(`starterPrefs_${loggedInUser?.username}`) || StarterPrefers_DEFAULT) - ); - } - - // called on starter selection clear, always - static save(prefs: StarterPreferences): void { - const pStr : string = JSON.stringify(prefs); - if (pStr !== StarterPrefers_private_latest) { - // something changed, store the update - localStorage.setItem(`starterPrefs_${loggedInUser?.username}`, pStr); - // update the latest prefs - StarterPrefers_private_latest = pStr; - } - } -} +export class StarterPrefs {} export interface StarterDataEntry { moveset: StarterMoveset | StarterFormMoveData | null; - eggMoves: integer; - candyCount: integer; - friendship: integer; - abilityAttr: integer; - passiveAttr: integer; - valueReduction: integer; - classicWinCount: integer; + eggMoves: number; + candyCount: number; + friendship: number; + abilityAttr: number; + passiveAttr: number; + valueReduction: number; + classicWinCount: number; } export interface StarterData { - [key: integer]: StarterDataEntry + [key: number]: StarterDataEntry; } export interface TutorialFlags { - [key: string]: boolean + [key: string]: boolean; } export interface SeenDialogues { @@ -294,14 +328,12 @@ const systemShortKeys = { abilityAttr: "$a", passiveAttr: "$pa", valueReduction: "$vr", - classicWinCount: "$wc" + classicWinCount: "$wc", }; export class GameData { - private scene: BattleScene; - - public trainerId: integer; - public secretId: integer; + public trainerId: number; + public secretId: number; public gender: PlayerGender; @@ -320,11 +352,10 @@ export class GameData { public voucherUnlocks: VoucherUnlocks; public voucherCounts: VoucherCounts; public eggs: Egg[]; - public eggPity: integer[]; - public unlockPity: integer[]; + public eggPity: number[]; + public unlockPity: number[]; - constructor(scene: BattleScene) { - this.scene = scene; + constructor() { this.loadSettings(); this.loadGamepadSettings(); this.loadMappingConfigs(); @@ -337,7 +368,7 @@ export class GameData { [Unlockables.ENDLESS_MODE]: false, [Unlockables.MINI_BLACK_HOLE]: false, [Unlockables.SPLICED_ENDLESS_MODE]: false, - [Unlockables.EVIOLITE]: false + [Unlockables.EVIOLITE]: false, }; this.achvUnlocks = {}; this.voucherUnlocks = {}; @@ -345,11 +376,11 @@ export class GameData { [VoucherType.REGULAR]: 0, [VoucherType.PLUS]: 0, [VoucherType.PREMIUM]: 0, - [VoucherType.GOLDEN]: 0 + [VoucherType.GOLDEN]: 0, }; this.eggs = []; - this.eggPity = [ 0, 0, 0, 0 ]; - this.unlockPity = [ 0, 0, 0, 0 ]; + this.eggPity = [0, 0, 0, 0]; + this.unlockPity = [0, 0, 0, 0]; this.initDexData(); this.initStarterData(); } @@ -367,10 +398,10 @@ export class GameData { voucherUnlocks: this.voucherUnlocks, voucherCounts: this.voucherCounts, eggs: this.eggs.map(e => new EggData(e)), - gameVersion: this.scene.game.config.gameVersion, + gameVersion: globalScene.game.config.gameVersion, timestamp: new Date().getTime(), eggPity: this.eggPity.slice(0), - unlockPity: this.unlockPity.slice(0) + unlockPity: this.unlockPity.slice(0), }; } @@ -388,31 +419,31 @@ export class GameData { public saveSystem(): Promise { return new Promise(resolve => { - this.scene.ui.savingIcon.show(); + globalScene.ui.savingIcon.show(); const data = this.getSystemSaveData(); const maxIntAttrValue = 0x80000000; - const systemData = JSON.stringify(data, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v); + const systemData = JSON.stringify(data, (_k: any, v: any) => + typeof v === "bigint" ? (v <= maxIntAttrValue ? Number(v) : v.toString()) : v, + ); localStorage.setItem(`data_${loggedInUser?.username}`, encrypt(systemData, bypassLogin)); if (!bypassLogin) { - Utils.apiPost(`savedata/system/update?clientSessionId=${clientSessionId}`, systemData, undefined, true) - .then(response => response.text()) - .then(error => { - this.scene.ui.savingIcon.hide(); - if (error) { - if (error.startsWith("session out of date")) { - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new ReloadSessionPhase(this.scene)); - } - console.error(error); - return resolve(false); + pokerogueApi.savedata.system.update({ clientSessionId }, systemData).then(error => { + globalScene.ui.savingIcon.hide(); + if (error) { + if (error.startsWith("session out of date")) { + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new ReloadSessionPhase()); } - resolve(true); - }); + console.error(error); + return resolve(false); + } + resolve(true); + }); } else { - this.scene.ui.savingIcon.hide(); + globalScene.ui.savingIcon.hide(); resolve(true); } @@ -428,24 +459,34 @@ export class GameData { } if (!bypassLogin) { - Utils.apiFetch(`savedata/system/get?clientSessionId=${clientSessionId}`, true) - .then(response => response.text()) - .then(response => { - if (!response.length || response[0] !== "{") { - if (response.startsWith("sql: no rows in result set")) { - this.scene.queueMessage("Save data could not be found. If this is a new account, you can safely ignore this message.", null, true); - return resolve(true); - } else if (response.indexOf("Too many connections") > -1) { - this.scene.queueMessage("Too many people are trying to connect and the server is overloaded. Please try again later.", null, true); - return resolve(false); - } - console.error(response); + pokerogueApi.savedata.system.get({ clientSessionId }).then(saveDataOrErr => { + if (!saveDataOrErr || saveDataOrErr.length === 0 || saveDataOrErr[0] !== "{") { + if (saveDataOrErr?.startsWith("sql: no rows in result set")) { + globalScene.queueMessage( + "Save data could not be found. If this is a new account, you can safely ignore this message.", + null, + true, + ); + return resolve(true); + } + if (saveDataOrErr?.includes("Too many connections")) { + globalScene.queueMessage( + "Too many people are trying to connect and the server is overloaded. Please try again later.", + null, + true, + ); return resolve(false); } + console.error(saveDataOrErr); + return resolve(false); + } - const cachedSystem = localStorage.getItem(`data_${loggedInUser?.username}`); - this.initSystem(response, cachedSystem ? AES.decrypt(cachedSystem, saveKey).toString(enc.Utf8) : undefined).then(resolve); - }); + const cachedSystem = localStorage.getItem(`data_${loggedInUser?.username}`); + this.initSystem( + saveDataOrErr, + cachedSystem ? AES.decrypt(cachedSystem, saveKey).toString(enc.Utf8) : undefined, + ).then(resolve); + }); } else { this.initSystem(decrypt(localStorage.getItem(`data_${loggedInUser?.username}`)!, bypassLogin)).then(resolve); // TODO: is this bang correct? } @@ -506,11 +547,11 @@ export class GameData { this.migrateStarterAbilities(systemData, this.starterData); - const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); + const starterIds = Object.keys(this.starterData).map(s => Number.parseInt(s) as Species); for (const s of starterIds) { - this.starterData[s].candyCount += this.dexData[s].caughtCount; - this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2; - if (this.dexData[s].caughtAttr & DexAttr.SHINY) { + this.starterData[s].candyCount += systemData.dexData[s].caughtCount; + this.starterData[s].candyCount += systemData.dexData[s].hatchedCount * 2; + if (systemData.dexData[s].caughtAttr & DexAttr.SHINY) { this.starterData[s].candyCount += 4; } } @@ -553,12 +594,10 @@ export class GameData { }); } - this.eggs = systemData.eggs - ? systemData.eggs.map(e => e.toEgg()) - : []; + this.eggs = systemData.eggs ? systemData.eggs.map(e => e.toEgg()) : []; - this.eggPity = systemData.eggPity ? systemData.eggPity.slice(0) : [ 0, 0, 0, 0 ]; - this.unlockPity = systemData.unlockPity ? systemData.unlockPity.slice(0) : [ 0, 0, 0, 0 ]; + this.eggPity = systemData.eggPity ? systemData.eggPity.slice(0) : [0, 0, 0, 0]; + this.unlockPity = systemData.unlockPity ? systemData.unlockPity.slice(0) : [0, 0, 0, 0]; this.dexData = Object.assign(this.dexData, systemData.dexData); this.consolidateDexData(this.dexData); @@ -576,10 +615,11 @@ export class GameData { * Retrieves current run history data, organized by time stamp. * At the moment, only retrievable from locale cache */ - async getRunHistoryData(scene: BattleScene): Promise { + async getRunHistoryData(): Promise { if (!Utils.isLocal) { /** * Networking Code DO NOT DELETE! + * Note: Might have to be migrated to `pokerogue-api.ts` * const response = await Utils.apiFetch("savedata/runHistory", true); const data = await response.json(); @@ -587,7 +627,7 @@ export class GameData { const lsItemKey = `runHistoryData_${loggedInUser?.username}`; const lsItem = localStorage.getItem(lsItemKey); if (lsItem) { - const cachedResponse = lsItem; + const cachedResponse = lsItem; if (cachedResponse) { const runHistory = JSON.parse(decrypt(cachedResponse, bypassLogin)); return runHistory; @@ -601,53 +641,52 @@ export class GameData { return cachedRHData; } */ - } else { - localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); - return {}; - } - } else { - const lsItemKey = `runHistoryData_${loggedInUser?.username}`; - const lsItem = localStorage.getItem(lsItemKey); - if (lsItem) { - const cachedResponse = lsItem; - if (cachedResponse) { - const runHistory : RunHistoryData = JSON.parse(decrypt(cachedResponse, bypassLogin)); - return runHistory; - } - return {}; - } else { - localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); - return {}; } + localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); + return {}; } + const lsItemKey = `runHistoryData_${loggedInUser?.username}`; + const lsItem = localStorage.getItem(lsItemKey); + if (lsItem) { + const cachedResponse = lsItem; + if (cachedResponse) { + const runHistory: RunHistoryData = JSON.parse(decrypt(cachedResponse, bypassLogin)); + return runHistory; + } + return {}; + } + localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, ""); + return {}; } /** * Saves a new entry to Run History - * @param scene: BattleScene object * @param runEntry: most recent SessionSaveData of the run * @param isVictory: result of the run * Arbitrary limit of 25 runs per player - Will delete runs, starting with the oldest one, if needed */ - async saveRunHistory(scene: BattleScene, runEntry : SessionSaveData, isVictory: boolean): Promise { - const runHistoryData = await this.getRunHistoryData(scene); + async saveRunHistory(runEntry: SessionSaveData, isVictory: boolean): Promise { + const runHistoryData = await this.getRunHistoryData(); // runHistoryData should always return run history or {} empty object let timestamps = Object.keys(runHistoryData).map(Number); // Arbitrary limit of 25 entries per user --> Can increase or decrease - while (timestamps.length >= RUN_HISTORY_LIMIT ) { - const oldestTimestamp = (Math.min.apply(Math, timestamps)).toString(); + while (timestamps.length >= RUN_HISTORY_LIMIT) { + const oldestTimestamp = Math.min.apply(Math, timestamps).toString(); delete runHistoryData[oldestTimestamp]; timestamps = Object.keys(runHistoryData).map(Number); } - const timestamp = (runEntry.timestamp).toString(); + const timestamp = runEntry.timestamp.toString(); runHistoryData[timestamp] = { entry: runEntry, isVictory: isVictory, isFavorite: false, }; - localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, encrypt(JSON.stringify(runHistoryData), bypassLogin)); + localStorage.setItem( + `runHistoryData_${loggedInUser?.username}`, + encrypt(JSON.stringify(runHistoryData), bypassLogin), + ); /** * Networking Code DO NOT DELETE * @@ -660,6 +699,7 @@ export class GameData { return false; } } + NOTE: should be adopted to `pokerogue-api.ts` */ return true; } @@ -668,7 +708,8 @@ export class GameData { return JSON.parse(dataStr, (k: string, v: any) => { if (k === "gameStats") { return new GameStats(v); - } else if (k === "eggs") { + } + if (k === "eggs") { const ret: EggData[] = []; if (v === null) { v = []; @@ -679,11 +720,11 @@ export class GameData { return ret; } - return k.endsWith("Attr") && ![ "natureAttr", "abilityAttr", "passiveAttr" ].includes(k) ? BigInt(v) : v; + return k.endsWith("Attr") && !["natureAttr", "abilityAttr", "passiveAttr"].includes(k) ? BigInt(v ?? 0) : v; }) as SystemSaveData; } - convertSystemDataStr(dataStr: string, shorten: boolean = false): string { + convertSystemDataStr(dataStr: string, shorten = false): string { if (!shorten) { // Account for past key oversight dataStr = dataStr.replace(/\$pAttr/g, "$pa"); @@ -704,12 +745,13 @@ export class GameData { return true; } - const response = await Utils.apiFetch(`savedata/system/verify?clientSessionId=${clientSessionId}`, true) - .then(response => response.json()); + const systemData = await pokerogueApi.savedata.system.verify({ + clientSessionId, + }); - if (!response.valid) { - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new ReloadSessionPhase(this.scene, JSON.stringify(response.systemData))); + if (systemData) { + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new ReloadSessionPhase(JSON.stringify(systemData))); this.clearLocalData(); return false; } @@ -733,16 +775,16 @@ export class GameData { * @param valueIndex index of the setting's option * @returns true */ - public saveSetting(setting: string, valueIndex: integer): boolean { + public saveSetting(setting: string, valueIndex: number): boolean { let settings: object = {}; if (localStorage.hasOwnProperty("settings")) { settings = JSON.parse(localStorage.getItem("settings")!); // TODO: is this bang correct? } - setSetting(this.scene, setting, valueIndex); + setSetting(setting, valueIndex); settings[setting] = valueIndex; - settings["gameVersion"] = this.scene.game.config.gameVersion; + settings["gameVersion"] = globalScene.game.config.gameVersion; localStorage.setItem("settings", JSON.stringify(settings)); @@ -757,17 +799,18 @@ export class GameData { * @returns `true` if the configurations are successfully saved. */ public saveMappingConfigs(deviceName: string, config): boolean { - const key = deviceName.toLowerCase(); // Convert the gamepad name to lowercase to use as a key - let mappingConfigs: object = {}; // Initialize an empty object to hold the mapping configurations - if (localStorage.hasOwnProperty("mappingConfigs")) {// Check if 'mappingConfigs' exists in localStorage + const key = deviceName.toLowerCase(); // Convert the gamepad name to lowercase to use as a key + let mappingConfigs: object = {}; // Initialize an empty object to hold the mapping configurations + if (localStorage.hasOwnProperty("mappingConfigs")) { + // Check if 'mappingConfigs' exists in localStorage mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")!); // TODO: is this bang correct? - } // Parse the existing 'mappingConfigs' from localStorage + } // Parse the existing 'mappingConfigs' from localStorage if (!mappingConfigs[key]) { mappingConfigs[key] = {}; - } // If there is no configuration for the given key, create an empty object for it - mappingConfigs[key].custom = config.custom; // Assign the custom configuration to the mapping configuration for the given key - localStorage.setItem("mappingConfigs", JSON.stringify(mappingConfigs)); // Save the updated mapping configurations back to localStorage - return true; // Return true to indicate the operation was successful + } // If there is no configuration for the given key, create an empty object for it + mappingConfigs[key].custom = config.custom; // Assign the custom configuration to the mapping configuration for the given key + localStorage.setItem("mappingConfigs", JSON.stringify(mappingConfigs)); // Save the updated mapping configurations back to localStorage + return true; // Return true to indicate the operation was successful } /** @@ -781,25 +824,28 @@ export class GameData { * for the corresponding gamepad or device key. The method then returns `true` to indicate success. */ public loadMappingConfigs(): boolean { - if (!localStorage.hasOwnProperty("mappingConfigs")) {// Check if 'mappingConfigs' exists in localStorage + if (!localStorage.hasOwnProperty("mappingConfigs")) { + // Check if 'mappingConfigs' exists in localStorage return false; - } // If 'mappingConfigs' does not exist, return false + } // If 'mappingConfigs' does not exist, return false - const mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")!); // Parse the existing 'mappingConfigs' from localStorage // TODO: is this bang correct? + const mappingConfigs = JSON.parse(localStorage.getItem("mappingConfigs")!); // Parse the existing 'mappingConfigs' from localStorage // TODO: is this bang correct? - for (const key of Object.keys(mappingConfigs)) {// Iterate over the keys of the mapping configurations - this.scene.inputController.injectConfig(key, mappingConfigs[key]); - } // Inject each configuration into the input controller for the corresponding key + for (const key of Object.keys(mappingConfigs)) { + // Iterate over the keys of the mapping configurations + globalScene.inputController.injectConfig(key, mappingConfigs[key]); + } // Inject each configuration into the input controller for the corresponding key - return true; // Return true to indicate the operation was successful + return true; // Return true to indicate the operation was successful } public resetMappingToFactory(): boolean { - if (!localStorage.hasOwnProperty("mappingConfigs")) {// Check if 'mappingConfigs' exists in localStorage + if (!localStorage.hasOwnProperty("mappingConfigs")) { + // Check if 'mappingConfigs' exists in localStorage return false; - } // If 'mappingConfigs' does not exist, return false + } // If 'mappingConfigs' does not exist, return false localStorage.removeItem("mappingConfigs"); - this.scene.inputController.resetConfigs(); + globalScene.inputController.resetConfigs(); return true; // TODO: is `true` the correct return value? } @@ -816,28 +862,37 @@ export class GameData { * to update the specified setting with the new value. Finally, it saves the updated settings back * to localStorage and returns `true` to indicate success. */ - public saveControlSetting(device: Device, localStoragePropertyName: string, setting: SettingGamepad|SettingKeyboard, settingDefaults, valueIndex: integer): boolean { - let settingsControls: object = {}; // Initialize an empty object to hold the gamepad settings + public saveControlSetting( + device: Device, + localStoragePropertyName: string, + setting: SettingGamepad | SettingKeyboard, + settingDefaults, + valueIndex: number, + ): boolean { + let settingsControls: object = {}; // Initialize an empty object to hold the gamepad settings - if (localStorage.hasOwnProperty(localStoragePropertyName)) { // Check if 'settingsControls' exists in localStorage - settingsControls = JSON.parse(localStorage.getItem(localStoragePropertyName)!); // Parse the existing 'settingsControls' from localStorage // TODO: is this bang correct? + if (localStorage.hasOwnProperty(localStoragePropertyName)) { + // Check if 'settingsControls' exists in localStorage + settingsControls = JSON.parse(localStorage.getItem(localStoragePropertyName)!); // Parse the existing 'settingsControls' from localStorage // TODO: is this bang correct? } if (device === Device.GAMEPAD) { - setSettingGamepad(this.scene, setting as SettingGamepad, valueIndex); // Set the gamepad setting in the current scene + setSettingGamepad(setting as SettingGamepad, valueIndex); } else if (device === Device.KEYBOARD) { - setSettingKeyboard(this.scene, setting as SettingKeyboard, valueIndex); // Set the keyboard setting in the current scene + setSettingKeyboard(setting as SettingKeyboard, valueIndex); } - Object.keys(settingDefaults).forEach(s => { // Iterate over the default gamepad settings - if (s === setting) {// If the current setting matches, update its value + Object.keys(settingDefaults).forEach(s => { + // Iterate over the default gamepad settings + if (s === setting) { + // If the current setting matches, update its value settingsControls[s] = valueIndex; } }); - localStorage.setItem(localStoragePropertyName, JSON.stringify(settingsControls)); // Save the updated gamepad settings back to localStorage + localStorage.setItem(localStoragePropertyName, JSON.stringify(settingsControls)); // Save the updated gamepad settings back to localStorage - return true; // Return true to indicate the operation was successful + return true; // Return true to indicate the operation was successful } /** @@ -845,7 +900,7 @@ export class GameData { * @returns true if succesful, false if not */ private loadSettings(): boolean { - resetSettings(this.scene); + resetSettings(); if (!localStorage.hasOwnProperty("settings")) { return false; @@ -856,14 +911,16 @@ export class GameData { applySettingsVersionMigration(settings); for (const setting of Object.keys(settings)) { - setSetting(this.scene, setting, settings[setting]); + setSetting(setting, settings[setting]); } return true; // TODO: is `true` the correct return value? } private loadGamepadSettings(): boolean { - Object.values(SettingGamepad).map(setting => setting as SettingGamepad).forEach(setting => setSettingGamepad(this.scene, setting, settingGamepadDefaults[setting])); + Object.values(SettingGamepad) + .map(setting => setting as SettingGamepad) + .forEach(setting => setSettingGamepad(setting, settingGamepadDefaults[setting])); if (!localStorage.hasOwnProperty("settingsGamepad")) { return false; @@ -871,7 +928,7 @@ export class GameData { const settingsGamepad = JSON.parse(localStorage.getItem("settingsGamepad")!); // TODO: is this bang correct? for (const setting of Object.keys(settingsGamepad)) { - setSettingGamepad(this.scene, setting as SettingGamepad, settingsGamepad[setting]); + setSettingGamepad(setting as SettingGamepad, settingsGamepad[setting]); } return true; // TODO: is `true` the correct return value? @@ -884,14 +941,16 @@ export class GameData { tutorials = JSON.parse(localStorage.getItem(key)!); // TODO: is this bang correct? } - Object.keys(Tutorial).map(t => t as Tutorial).forEach(t => { - const key = Tutorial[t]; - if (key === tutorial) { - tutorials[key] = flag; - } else { - tutorials[key] ??= false; - } - }); + Object.keys(Tutorial) + .map(t => t as Tutorial) + .forEach(t => { + const key = Tutorial[t]; + if (key === tutorial) { + tutorials[key] = flag; + } else { + tutorials[key] ??= false; + } + }); localStorage.setItem(key, JSON.stringify(tutorials)); @@ -901,7 +960,9 @@ export class GameData { public getTutorialFlags(): TutorialFlags { const key = getDataTypeKey(GameDataType.TUTORIALS); const ret: TutorialFlags = {}; - Object.values(Tutorial).map(tutorial => tutorial as Tutorial).forEach(tutorial => ret[Tutorial[tutorial]] = false); + Object.values(Tutorial) + .map(tutorial => tutorial as Tutorial) + .forEach(tutorial => (ret[Tutorial[tutorial]] = false)); if (!localStorage.hasOwnProperty(key)) { return ret; @@ -944,31 +1005,35 @@ export class GameData { return ret; } - public getSessionSaveData(scene: BattleScene): SessionSaveData { + public getSessionSaveData(): SessionSaveData { return { - seed: scene.seed, - playTime: scene.sessionPlayTime, - gameMode: scene.gameMode.modeId, - party: scene.getParty().map(p => new PokemonData(p)), - enemyParty: scene.getEnemyParty().map(p => new PokemonData(p)), - modifiers: scene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)), - enemyModifiers: scene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)), - arena: new ArenaData(scene.arena), - pokeballCounts: scene.pokeballCounts, - money: Math.floor(scene.money), - score: scene.score, - waveIndex: scene.currentBattle.waveIndex, - battleType: scene.currentBattle.battleType, - trainer: scene.currentBattle.battleType === BattleType.TRAINER ? new TrainerData(scene.currentBattle.trainer) : null, - gameVersion: scene.game.config.gameVersion, + seed: globalScene.seed, + playTime: globalScene.sessionPlayTime, + gameMode: globalScene.gameMode.modeId, + party: globalScene.getPlayerParty().map(p => new PokemonData(p)), + enemyParty: globalScene.getEnemyParty().map(p => new PokemonData(p)), + modifiers: globalScene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)), + enemyModifiers: globalScene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)), + arena: new ArenaData(globalScene.arena), + pokeballCounts: globalScene.pokeballCounts, + money: Math.floor(globalScene.money), + score: globalScene.score, + waveIndex: globalScene.currentBattle.waveIndex, + battleType: globalScene.currentBattle.battleType, + trainer: + globalScene.currentBattle.battleType === BattleType.TRAINER + ? new TrainerData(globalScene.currentBattle.trainer) + : null, + gameVersion: globalScene.game.config.gameVersion, timestamp: new Date().getTime(), - challenges: scene.gameMode.challenges.map(c => new ChallengeData(c)), - mysteryEncounterType: scene.currentBattle.mysteryEncounter?.encounterType ?? -1, - mysteryEncounterSaveData: scene.mysteryEncounterSaveData + challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), + mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, + mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, + playerFaints: globalScene.arena.playerFaints, } as SessionSaveData; } - getSession(slotId: integer): Promise { + getSession(slotId: number): Promise { return new Promise(async (resolve, reject) => { if (slotId < 0) { return resolve(null); @@ -984,18 +1049,19 @@ export class GameData { }; if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`)) { - Utils.apiFetch(`savedata/session/get?slot=${slotId}&clientSessionId=${clientSessionId}`, true) - .then(response => response.text()) - .then(async response => { - if (!response.length || response[0] !== "{") { - console.error(response); - return resolve(null); - } + pokerogueApi.savedata.session.get({ slot: slotId, clientSessionId }).then(async response => { + if (!response || response?.length === 0 || response?.[0] !== "{") { + console.error(response); + return resolve(null); + } - localStorage.setItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`, encrypt(response, bypassLogin)); + localStorage.setItem( + `sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`, + encrypt(response, bypassLogin), + ); - await handleSessionData(response); - }); + await handleSessionData(response); + }); } else { const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); if (sessionData) { @@ -1007,68 +1073,81 @@ export class GameData { }); } - loadSession(scene: BattleScene, slotId: integer, sessionData?: SessionSaveData): Promise { + loadSession(slotId: number, sessionData?: SessionSaveData): Promise { return new Promise(async (resolve, reject) => { try { const initSessionFromData = async (sessionData: SessionSaveData) => { console.debug(sessionData); - scene.gameMode = getGameMode(sessionData.gameMode || GameModes.CLASSIC); + globalScene.gameMode = getGameMode(sessionData.gameMode || GameModes.CLASSIC); if (sessionData.challenges) { - scene.gameMode.challenges = sessionData.challenges.map(c => c.toChallenge()); + globalScene.gameMode.challenges = sessionData.challenges.map(c => c.toChallenge()); } - scene.setSeed(sessionData.seed || scene.game.config.seed[0]); - scene.resetSeed(); + globalScene.setSeed(sessionData.seed || globalScene.game.config.seed[0]); + globalScene.resetSeed(); - console.log("Seed:", scene.seed); + console.log("Seed:", globalScene.seed); - scene.sessionPlayTime = sessionData.playTime || 0; - scene.lastSavePlayTime = 0; + globalScene.sessionPlayTime = sessionData.playTime || 0; + globalScene.lastSavePlayTime = 0; const loadPokemonAssets: Promise[] = []; - const party = scene.getParty(); + const party = globalScene.getPlayerParty(); party.splice(0, party.length); for (const p of sessionData.party) { - const pokemon = p.toPokemon(scene) as PlayerPokemon; + const pokemon = p.toPokemon() as PlayerPokemon; pokemon.setVisible(false); loadPokemonAssets.push(pokemon.loadAssets()); party.push(pokemon); } - Object.keys(scene.pokeballCounts).forEach((key: string) => { - scene.pokeballCounts[key] = sessionData.pokeballCounts[key] || 0; + Object.keys(globalScene.pokeballCounts).forEach((key: string) => { + globalScene.pokeballCounts[key] = sessionData.pokeballCounts[key] || 0; }); if (Overrides.POKEBALL_OVERRIDE.active) { - scene.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs; + globalScene.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs; } - scene.money = Math.floor(sessionData.money || 0); - scene.updateMoneyText(); + globalScene.money = Math.floor(sessionData.money || 0); + globalScene.updateMoneyText(); - if (scene.money > this.gameStats.highestMoney) { - this.gameStats.highestMoney = scene.money; + if (globalScene.money > this.gameStats.highestMoney) { + this.gameStats.highestMoney = globalScene.money; } - scene.score = sessionData.score; - scene.updateScoreText(); + globalScene.score = sessionData.score; + globalScene.updateScoreText(); - scene.mysteryEncounterSaveData = new MysteryEncounterSaveData(sessionData.mysteryEncounterSaveData); + globalScene.mysteryEncounterSaveData = new MysteryEncounterSaveData(sessionData.mysteryEncounterSaveData); - scene.newArena(sessionData.arena.biome); + globalScene.newArena(sessionData.arena.biome, sessionData.playerFaints); const battleType = sessionData.battleType || 0; const trainerConfig = sessionData.trainer ? trainerConfigs[sessionData.trainer.trainerType] : null; - const mysteryEncounterType = sessionData.mysteryEncounterType !== -1 ? sessionData.mysteryEncounterType : undefined; - const battle = scene.newBattle(sessionData.waveIndex, battleType, sessionData.trainer, battleType === BattleType.TRAINER ? trainerConfig?.doubleOnly || sessionData.trainer?.variant === TrainerVariant.DOUBLE : sessionData.enemyParty.length > 1, mysteryEncounterType)!; // TODO: is this bang correct? + const mysteryEncounterType = + sessionData.mysteryEncounterType !== -1 ? sessionData.mysteryEncounterType : undefined; + const battle = globalScene.newBattle( + sessionData.waveIndex, + battleType, + sessionData.trainer, + battleType === BattleType.TRAINER + ? trainerConfig?.doubleOnly || sessionData.trainer?.variant === TrainerVariant.DOUBLE + : sessionData.enemyParty.length > 1, + mysteryEncounterType, + )!; // TODO: is this bang correct? battle.enemyLevels = sessionData.enemyParty.map(p => p.level); - scene.arena.init(); + globalScene.arena.init(); sessionData.enemyParty.forEach((enemyData, e) => { - const enemyPokemon = enemyData.toPokemon(scene, battleType, e, sessionData.trainer?.variant === TrainerVariant.DOUBLE) as EnemyPokemon; + const enemyPokemon = enemyData.toPokemon( + battleType, + e, + sessionData.trainer?.variant === TrainerVariant.DOUBLE, + ) as EnemyPokemon; battle.enemyParty[e] = enemyPokemon; if (battleType === BattleType.WILD) { battle.seenEnemyPartyMemberIds.add(enemyPokemon.id); @@ -1077,41 +1156,57 @@ export class GameData { loadPokemonAssets.push(enemyPokemon.loadAssets()); }); - scene.arena.weather = sessionData.arena.weather; - scene.arena.eventTarget.dispatchEvent(new WeatherChangedEvent(WeatherType.NONE, scene.arena.weather?.weatherType!, scene.arena.weather?.turnsLeft!)); // TODO: is this bang correct? + globalScene.arena.weather = sessionData.arena.weather; + globalScene.arena.eventTarget.dispatchEvent( + new WeatherChangedEvent( + WeatherType.NONE, + globalScene.arena.weather?.weatherType!, + globalScene.arena.weather?.turnsLeft!, + ), + ); // TODO: is this bang correct? - scene.arena.terrain = sessionData.arena.terrain; - scene.arena.eventTarget.dispatchEvent(new TerrainChangedEvent(TerrainType.NONE, scene.arena.terrain?.terrainType!, scene.arena.terrain?.turnsLeft!)); // TODO: is this bang correct? + globalScene.arena.terrain = sessionData.arena.terrain; + globalScene.arena.eventTarget.dispatchEvent( + new TerrainChangedEvent( + TerrainType.NONE, + globalScene.arena.terrain?.terrainType!, + globalScene.arena.terrain?.turnsLeft!, + ), + ); // TODO: is this bang correct? - scene.arena.tags = sessionData.arena.tags; - if (scene.arena.tags) { - for (const tag of scene.arena.tags) { + globalScene.arena.playerTerasUsed = sessionData.arena.playerTerasUsed; + + globalScene.arena.tags = sessionData.arena.tags; + if (globalScene.arena.tags) { + for (const tag of globalScene.arena.tags) { if (tag instanceof ArenaTrapTag) { const { tagType, side, turnCount, layers, maxLayers } = tag as ArenaTrapTag; - scene.arena.eventTarget.dispatchEvent(new TagAddedEvent(tagType, side, turnCount, layers, maxLayers)); + globalScene.arena.eventTarget.dispatchEvent( + new TagAddedEvent(tagType, side, turnCount, layers, maxLayers), + ); } else { - scene.arena.eventTarget.dispatchEvent(new TagAddedEvent(tag.tagType, tag.side, tag.turnCount)); + globalScene.arena.eventTarget.dispatchEvent(new TagAddedEvent(tag.tagType, tag.side, tag.turnCount)); } } } for (const modifierData of sessionData.modifiers) { - const modifier = modifierData.toModifier(scene, Modifier[modifierData.className]); + const modifier = modifierData.toModifier(Modifier[modifierData.className]); if (modifier) { - scene.addModifier(modifier, true); + globalScene.addModifier(modifier, true); } } - scene.updateModifiers(true); + globalScene.updateModifiers(true); for (const enemyModifierData of sessionData.enemyModifiers) { - const modifier = enemyModifierData.toModifier(scene, Modifier[enemyModifierData.className]); + const modifier = enemyModifierData.toModifier(Modifier[enemyModifierData.className]); if (modifier) { - scene.addEnemyModifier(modifier, true); + globalScene.addEnemyModifier(modifier, true); } } - scene.updateModifiers(false); + globalScene.updateModifiers(false); Promise.all(loadPokemonAssets).then(() => resolve(true)); }; @@ -1138,7 +1233,7 @@ export class GameData { * @param slotId the slot to clear * @returns Promise with result `true` if the session was deleted successfully, `false` otherwise */ - deleteSession(slotId: integer): Promise { + deleteSession(slotId: number): Promise { return new Promise(resolve => { if (bypassLogin) { localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); @@ -1149,23 +1244,22 @@ export class GameData { if (success !== null && !success) { return resolve(false); } - Utils.apiFetch(`savedata/session/delete?slot=${slotId}&clientSessionId=${clientSessionId}`, true).then(response => { - if (response.ok) { - loggedInUser!.lastSessionSlot = -1; // TODO: is the bang correct? - localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); - resolve(true); - } - return response.text(); - }).then(error => { + pokerogueApi.savedata.session.delete({ slot: slotId, clientSessionId }).then(error => { if (error) { if (error.startsWith("session out of date")) { - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new ReloadSessionPhase(this.scene)); + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new ReloadSessionPhase()); } console.error(error); resolve(false); + } else { + if (loggedInUser) { + loggedInUser.lastSessionSlot = -1; + } + + localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); + resolve(true); } - resolve(true); }); }); }); @@ -1174,9 +1268,9 @@ export class GameData { /* Defines a localStorage item 'daily' to check on clears, offline implementation of savedata/newclear API If a GameModes clear other than Daily is checked, newClear = true as usual If a Daily mode is cleared, checks if it was already cleared before, based on seed, and returns true only to new daily clear runs */ - offlineNewClear(scene: BattleScene): Promise { + offlineNewClear(): Promise { return new Promise(resolve => { - const sessionData = this.getSessionSaveData(scene); + const sessionData = this.getSessionSaveData(); const seed = sessionData.seed; let daily: string[] = []; @@ -1185,55 +1279,52 @@ export class GameData { daily = JSON.parse(atob(localStorage.getItem("daily")!)); // TODO: is this bang correct? if (daily.includes(seed)) { return resolve(false); - } else { - daily.push(seed); - localStorage.setItem("daily", btoa(JSON.stringify(daily))); - return resolve(true); } - } else { daily.push(seed); localStorage.setItem("daily", btoa(JSON.stringify(daily))); return resolve(true); } - } else { + daily.push(seed); + localStorage.setItem("daily", btoa(JSON.stringify(daily))); return resolve(true); } + return resolve(true); }); } - /** * Attempt to clear session data after the end of a run * After session data is removed, attempt to update user info so the menu updates * To delete an unfinished run instead, use {@linkcode deleteSession} */ - async tryClearSession(scene: BattleScene, slotId: integer): Promise<[success: boolean, newClear: boolean]> { - let result: [boolean, boolean] = [ false, false ]; + async tryClearSession(slotId: number): Promise<[success: boolean, newClear: boolean]> { + let result: [boolean, boolean] = [false, false]; if (bypassLogin) { localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); - result = [ true, true ]; + result = [true, true]; } else { - const sessionData = this.getSessionSaveData(scene); - const response = await Utils.apiPost(`savedata/session/clear?slot=${slotId}&trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`, JSON.stringify(sessionData), undefined, true); + const sessionData = this.getSessionSaveData(); + const { trainerId } = this; + const jsonResponse = await pokerogueApi.savedata.session.clear( + { slot: slotId, trainerId, clientSessionId }, + sessionData, + ); - if (response.ok) { - loggedInUser!.lastSessionSlot = -1; // TODO: is the bang correct? - localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); - } - - const jsonResponse: PokerogueApiClearSessionData = await response.json(); - - if (!jsonResponse.error) { - result = [ true, jsonResponse.success ?? false ]; + if (!jsonResponse?.error) { + result = [true, jsonResponse?.success ?? false]; + if (loggedInUser) { + loggedInUser!.lastSessionSlot = -1; + } + localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser?.username}`); } else { - if (jsonResponse && jsonResponse.error?.startsWith("session out of date")) { - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new ReloadSessionPhase(this.scene)); + if (jsonResponse?.error?.startsWith("session out of date")) { + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new ReloadSessionPhase()); } console.error(jsonResponse); - result = [ false, false ]; + result = [false, false]; } } @@ -1244,12 +1335,6 @@ export class GameData { parseSessionData(dataStr: string): SessionSaveData { const sessionData = JSON.parse(dataStr, (k: string, v: any) => { - /*const versions = [ scene.game.config.gameVersion, sessionData.gameVersion || '0.0.0' ]; - - if (versions[0] !== versions[1]) { - const [ versionNumbers, oldVersionNumbers ] = versions.map(ver => ver.split('.').map(v => parseInt(v))); - }*/ - if (k === "party" || k === "enemyParty") { const ret: PokemonData[] = []; if (v === null) { @@ -1272,10 +1357,14 @@ export class GameData { v = []; } for (const md of v) { - if (md?.className === "ExpBalanceModifier") { // Temporarily limit EXP Balance until it gets reworked + if (md?.className === "ExpBalanceModifier") { + // Temporarily limit EXP Balance until it gets reworked md.stackCount = Math.min(md.stackCount, 4); } - if (md instanceof Modifier.EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE || md.effect === StatusEffect.SLEEP) { + if ( + (md instanceof Modifier.EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE) || + md.effect === StatusEffect.SLEEP + ) { continue; } ret.push(new PersistentModifierData(md, player)); @@ -1314,54 +1403,74 @@ export class GameData { return sessionData; } - saveAll(scene: BattleScene, skipVerification: boolean = false, sync: boolean = false, useCachedSession: boolean = false, useCachedSystem: boolean = false): Promise { + saveAll(skipVerification = false, sync = false, useCachedSession = false, useCachedSystem = false): Promise { return new Promise(resolve => { Utils.executeIf(!skipVerification, updateUserInfo).then(success => { if (success !== null && !success) { return resolve(false); } if (sync) { - this.scene.ui.savingIcon.show(); + globalScene.ui.savingIcon.show(); } - const sessionData = useCachedSession ? this.parseSessionData(decrypt(localStorage.getItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser?.username}`)!, bypassLogin)) : this.getSessionSaveData(scene); // TODO: is this bang correct? + const sessionData = useCachedSession + ? this.parseSessionData( + decrypt( + localStorage.getItem( + `sessionData${globalScene.sessionSlotId ? globalScene.sessionSlotId : ""}_${loggedInUser?.username}`, + )!, + bypassLogin, + ), + ) // TODO: is this bang correct? + : this.getSessionSaveData(); const maxIntAttrValue = 0x80000000; - const systemData = useCachedSystem ? this.parseSystemData(decrypt(localStorage.getItem(`data_${loggedInUser?.username}`)!, bypassLogin)) : this.getSystemSaveData(); // TODO: is this bang correct? + const systemData = useCachedSystem + ? this.parseSystemData(decrypt(localStorage.getItem(`data_${loggedInUser?.username}`)!, bypassLogin)) + : this.getSystemSaveData(); // TODO: is this bang correct? const request = { system: systemData, session: sessionData, - sessionSlotId: scene.sessionSlotId, - clientSessionId: clientSessionId + sessionSlotId: globalScene.sessionSlotId, + clientSessionId: clientSessionId, }; - localStorage.setItem(`data_${loggedInUser?.username}`, encrypt(JSON.stringify(systemData, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), bypassLogin)); + localStorage.setItem( + `data_${loggedInUser?.username}`, + encrypt( + JSON.stringify(systemData, (_k: any, v: any) => + typeof v === "bigint" ? (v <= maxIntAttrValue ? Number(v) : v.toString()) : v, + ), + bypassLogin, + ), + ); - localStorage.setItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser?.username}`, encrypt(JSON.stringify(sessionData), bypassLogin)); + localStorage.setItem( + `sessionData${globalScene.sessionSlotId ? globalScene.sessionSlotId : ""}_${loggedInUser?.username}`, + encrypt(JSON.stringify(sessionData), bypassLogin), + ); console.debug("Session data saved"); if (!bypassLogin && sync) { - Utils.apiPost("savedata/updateall", JSON.stringify(request, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), undefined, true) - .then(response => response.text()) - .then(error => { - if (sync) { - this.scene.lastSavePlayTime = 0; - this.scene.ui.savingIcon.hide(); + pokerogueApi.savedata.updateAll(request).then(error => { + if (sync) { + globalScene.lastSavePlayTime = 0; + globalScene.ui.savingIcon.hide(); + } + if (error) { + if (error.startsWith("session out of date")) { + globalScene.clearPhaseQueue(); + globalScene.unshiftPhase(new ReloadSessionPhase()); } - if (error) { - if (error.startsWith("session out of date")) { - this.scene.clearPhaseQueue(); - this.scene.unshiftPhase(new ReloadSessionPhase(this.scene)); - } - console.error(error); - return resolve(false); - } - resolve(true); - }); + console.error(error); + return resolve(false); + } + resolve(true); + }); } else { this.verify().then(success => { - this.scene.ui.savingIcon.hide(); + globalScene.ui.savingIcon.hide(); resolve(success); }); } @@ -1369,7 +1478,7 @@ export class GameData { }); } - public tryExportData(dataType: GameDataType, slotId: integer = 0): Promise { + public tryExportData(dataType: GameDataType, slotId = 0): Promise { return new Promise(resolve => { const dataKey: string = `${getDataTypeKey(dataType, slotId)}_${loggedInUser?.username}`; const handleData = (dataStr: string) => { @@ -1379,7 +1488,9 @@ export class GameData { break; } const encryptedData = AES.encrypt(dataStr, saveKey); - const blob = new Blob([ encryptedData.toString() ], { type: "text/json" }); + const blob = new Blob([encryptedData.toString()], { + type: "text/json", + }); const link = document.createElement("a"); link.href = window.URL.createObjectURL(blob); link.download = `${dataKey}.prsv`; @@ -1387,18 +1498,27 @@ export class GameData { link.remove(); }; if (!bypassLogin && dataType < GameDataType.SETTINGS) { - Utils.apiFetch(`savedata/${dataType === GameDataType.SYSTEM ? "system" : "session"}/get?clientSessionId=${clientSessionId}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ""}`, true) - .then(response => response.text()) - .then(response => { - if (!response.length || response[0] !== "{") { - console.error(response); - resolve(false); - return; - } + let promise: Promise = Promise.resolve(null); - handleData(response); - resolve(true); + if (dataType === GameDataType.SYSTEM) { + promise = pokerogueApi.savedata.system.get({ clientSessionId }); + } else if (dataType === GameDataType.SESSION) { + promise = pokerogueApi.savedata.session.get({ + slot: slotId, + clientSessionId, }); + } + + promise.then(response => { + if (!response?.length || response[0] !== "{") { + console.error(response); + resolve(false); + return; + } + + handleData(response); + resolve(true); + }); } else { const data = localStorage.getItem(dataKey); if (data) { @@ -1409,7 +1529,7 @@ export class GameData { }); } - public importData(dataType: GameDataType, slotId: integer = 0): void { + public importData(dataType: GameDataType, slotId = 0): void { const dataKey = `${getDataTypeKey(dataType, slotId)}_${loggedInUser?.username}`; let saveFile: any = document.getElementById("saveFile"); @@ -1422,95 +1542,121 @@ export class GameData { saveFile.type = "file"; saveFile.accept = ".prsv"; saveFile.style.display = "none"; - saveFile.addEventListener("change", - e => { - const reader = new FileReader(); + saveFile.addEventListener("change", e => { + const reader = new FileReader(); - reader.onload = (_ => { - return e => { - let dataName: string; - let dataStr = AES.decrypt(e.target?.result?.toString()!, saveKey).toString(enc.Utf8); // TODO: is this bang correct? - let valid = false; - try { - dataName = GameDataType[dataType].toLowerCase(); - switch (dataType) { - case GameDataType.SYSTEM: - dataStr = this.convertSystemDataStr(dataStr); - const systemData = this.parseSystemData(dataStr); - valid = !!systemData.dexData && !!systemData.timestamp; - break; - case GameDataType.SESSION: - const sessionData = this.parseSessionData(dataStr); - valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; - break; - case GameDataType.RUN_HISTORY: - const data = JSON.parse(dataStr); - const keys = Object.keys(data); - dataName = i18next.t("menuUiHandler:RUN_HISTORY").toLowerCase(); - keys.forEach((key) => { - const entryKeys = Object.keys(data[key]); - valid = [ "isFavorite", "isVictory", "entry" ].every(v => entryKeys.includes(v)) && entryKeys.length === 3; - }); - break; - case GameDataType.SETTINGS: - case GameDataType.TUTORIALS: - valid = true; - break; - } - } catch (ex) { - console.error(ex); + reader.onload = (_ => { + return e => { + let dataName: string; + let dataStr = AES.decrypt(e.target?.result?.toString()!, saveKey).toString(enc.Utf8); // TODO: is this bang correct? + let valid = false; + try { + dataName = GameDataType[dataType].toLowerCase(); + switch (dataType) { + case GameDataType.SYSTEM: + dataStr = this.convertSystemDataStr(dataStr); + const systemData = this.parseSystemData(dataStr); + valid = !!systemData.dexData && !!systemData.timestamp; + break; + case GameDataType.SESSION: + const sessionData = this.parseSessionData(dataStr); + valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; + break; + case GameDataType.RUN_HISTORY: + const data = JSON.parse(dataStr); + const keys = Object.keys(data); + dataName = i18next.t("menuUiHandler:RUN_HISTORY").toLowerCase(); + keys.forEach(key => { + const entryKeys = Object.keys(data[key]); + valid = + ["isFavorite", "isVictory", "entry"].every(v => entryKeys.includes(v)) && entryKeys.length === 3; + }); + break; + case GameDataType.SETTINGS: + case GameDataType.TUTORIALS: + valid = true; + break; } + } catch (ex) { + console.error(ex); + } - const displayError = (error: string) => this.scene.ui.showText(error, null, () => this.scene.ui.showText("", 0), Utils.fixedInt(1500)); - dataName = dataName!; // tell TS compiler that dataName is defined! + const displayError = (error: string) => + globalScene.ui.showText(error, null, () => globalScene.ui.showText("", 0), Utils.fixedInt(1500)); + dataName = dataName!; // tell TS compiler that dataName is defined! - if (!valid) { - return this.scene.ui.showText(`Your ${dataName} data could not be loaded. It may be corrupted.`, null, () => this.scene.ui.showText("", 0), Utils.fixedInt(1500)); - } + if (!valid) { + return globalScene.ui.showText( + `Your ${dataName} data could not be loaded. It may be corrupted.`, + null, + () => globalScene.ui.showText("", 0), + Utils.fixedInt(1500), + ); + } - this.scene.ui.showText(`Your ${dataName} data will be overridden and the page will reload. Proceed?`, null, () => { - this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { - localStorage.setItem(dataKey, encrypt(dataStr, bypassLogin)); + globalScene.ui.showText( + `Your ${dataName} data will be overridden and the page will reload. Proceed?`, + null, + () => { + globalScene.ui.setOverlayMode( + Mode.CONFIRM, + () => { + localStorage.setItem(dataKey, encrypt(dataStr, bypassLogin)); - if (!bypassLogin && dataType < GameDataType.SETTINGS) { - updateUserInfo().then(success => { - if (!success[0]) { - return displayError(`Could not contact the server. Your ${dataName} data could not be imported.`); - } - let url: string; - if (dataType === GameDataType.SESSION) { - url = `savedata/session/update?slot=${slotId}&trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`; - } else { - url = `savedata/system/update?trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`; - } - Utils.apiPost(url, dataStr, undefined, true) - .then(response => response.text()) - .then(error => { + if (!bypassLogin && dataType < GameDataType.SETTINGS) { + updateUserInfo().then(success => { + if (!success[0]) { + return displayError( + `Could not contact the server. Your ${dataName} data could not be imported.`, + ); + } + const { trainerId, secretId } = this; + let updatePromise: Promise; + if (dataType === GameDataType.SESSION) { + updatePromise = pokerogueApi.savedata.session.update( + { + slot: slotId, + trainerId, + secretId, + clientSessionId, + }, + dataStr, + ); + } else { + updatePromise = pokerogueApi.savedata.system.update( + { trainerId, secretId, clientSessionId }, + dataStr, + ); + } + updatePromise.then(error => { if (error) { console.error(error); - return displayError(`An error occurred while updating ${dataName} data. Please contact the administrator.`); + return displayError( + `An error occurred while updating ${dataName} data. Please contact the administrator.`, + ); } - window.location = window.location; + window.location.reload(); }); - }); - } else { - window.location = window.location; - } - }, () => { - this.scene.ui.revertMode(); - this.scene.ui.showText("", 0); - }, false, -98); - }); - }; - })((e.target as any).files[0]); + }); + } else { + window.location.reload(); + } + }, + () => { + globalScene.ui.revertMode(); + globalScene.ui.showText("", 0); + }, + false, + -98, + ); + }, + ); + }; + })((e.target as any).files[0]); - reader.readAsText((e.target as any).files[0]); - } - ); + reader.readAsText((e.target as any).files[0]); + }); saveFile.click(); - /*(this.scene.plugins.get('rexfilechooserplugin') as FileChooserPlugin).open({ accept: '.prsv' }) - .then(result => { - });*/ } private initDexData(): void { @@ -1518,20 +1664,31 @@ export class GameData { for (const species of allSpecies) { data[species.speciesId] = { - seenAttr: 0n, caughtAttr: 0n, natureAttr: 0, seenCount: 0, caughtCount: 0, hatchedCount: 0, ivs: [ 0, 0, 0, 0, 0, 0 ] + seenAttr: 0n, + caughtAttr: 0n, + natureAttr: 0, + seenCount: 0, + caughtCount: 0, + hatchedCount: 0, + ivs: [0, 0, 0, 0, 0, 0], }; } - const defaultStarterAttr = DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.FEMALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM; + const defaultStarterAttr = + DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.FEMALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM; const defaultStarterNatures: Nature[] = []; - this.scene.executeWithSeedOffset(() => { - const neutralNatures = [ Nature.HARDY, Nature.DOCILE, Nature.SERIOUS, Nature.BASHFUL, Nature.QUIRKY ]; - for (let s = 0; s < defaultStarterSpecies.length; s++) { - defaultStarterNatures.push(Utils.randSeedItem(neutralNatures)); - } - }, 0, "default"); + globalScene.executeWithSeedOffset( + () => { + const neutralNatures = [Nature.HARDY, Nature.DOCILE, Nature.SERIOUS, Nature.BASHFUL, Nature.QUIRKY]; + for (let s = 0; s < defaultStarterSpecies.length; s++) { + defaultStarterNatures.push(Utils.randSeedItem(neutralNatures)); + } + }, + 0, + "default", + ); for (let ds = 0; ds < defaultStarterSpecies.length; ds++) { const entry = data[defaultStarterSpecies[ds]] as DexEntry; @@ -1539,7 +1696,7 @@ export class GameData { entry.caughtAttr = defaultStarterAttr; entry.natureAttr = 1 << (defaultStarterNatures[ds] + 1); for (const i in entry.ivs) { - entry.ivs[i] = 10; + entry.ivs[i] = 15; } } @@ -1550,7 +1707,7 @@ export class GameData { private initStarterData(): void { const starterData: StarterData = {}; - const starterSpeciesIds = Object.keys(speciesStarterCosts).map(k => parseInt(k) as Species); + const starterSpeciesIds = Object.keys(speciesStarterCosts).map(k => Number.parseInt(k) as Species); for (const speciesId of starterSpeciesIds) { starterData[speciesId] = { @@ -1561,16 +1718,19 @@ export class GameData { abilityAttr: defaultStarterSpecies.includes(speciesId) ? AbilityAttr.ABILITY_1 : 0, passiveAttr: 0, valueReduction: 0, - classicWinCount: 0 + classicWinCount: 0, }; } this.starterData = starterData; } - setPokemonSeen(pokemon: Pokemon, incrementCount: boolean = true, trainer: boolean = false): void { + setPokemonSeen(pokemon: Pokemon, incrementCount = true, trainer = false): void { // Some Mystery Encounters block updates to these stats - if (this.scene.currentBattle?.isBattleMysteryEncounter() && this.scene.currentBattle.mysteryEncounter?.preventGameStatsUpdates) { + if ( + globalScene.currentBattle?.isBattleMysteryEncounter() && + globalScene.currentBattle.mysteryEncounter?.preventGameStatsUpdates + ) { return; } const dexEntry = this.dexData[pokemon.species.speciesId]; @@ -1599,15 +1759,14 @@ export class GameData { * @param showMessage * @returns `true` if Pokemon catch unlocked a new starter, `false` if Pokemon catch did not unlock a starter */ - setPokemonCaught(pokemon: Pokemon, incrementCount: boolean = true, fromEgg: boolean = false, showMessage: boolean = true): Promise { + setPokemonCaught(pokemon: Pokemon, incrementCount = true, fromEgg = false, showMessage = true): Promise { // If incrementCount === false (not a catch scenario), only update the pokemon's dex data if the Pokemon has already been marked as caught in dex // Prevents form changes, nature changes, etc. from unintentionally updating the dex data of a "rental" pokemon const speciesRootForm = pokemon.species.getRootSpeciesId(); - if (!incrementCount && !this.scene.gameData.dexData[speciesRootForm].caughtAttr) { + if (!incrementCount && !globalScene.gameData.dexData[speciesRootForm].caughtAttr) { return Promise.resolve(false); - } else { - return this.setPokemonSpeciesCaught(pokemon, pokemon.species, incrementCount, fromEgg, showMessage); } + return this.setPokemonSpeciesCaught(pokemon, pokemon.species, incrementCount, fromEgg, showMessage); } /** @@ -1619,25 +1778,57 @@ export class GameData { * @param showMessage * @returns `true` if Pokemon catch unlocked a new starter, `false` if Pokemon catch did not unlock a starter */ - setPokemonSpeciesCaught(pokemon: Pokemon, species: PokemonSpecies, incrementCount: boolean = true, fromEgg: boolean = false, showMessage: boolean = true): Promise { + setPokemonSpeciesCaught( + pokemon: Pokemon, + species: PokemonSpecies, + incrementCount = true, + fromEgg = false, + showMessage = true, + ): Promise { return new Promise(resolve => { const dexEntry = this.dexData[species.speciesId]; const caughtAttr = dexEntry.caughtAttr; const formIndex = pokemon.formIndex; - if (noStarterFormKeys.includes(pokemon.getFormKey())) { - pokemon.formIndex = 0; - } const dexAttr = pokemon.getDexAttr(); - pokemon.formIndex = formIndex; // Mark as caught dexEntry.caughtAttr |= dexAttr; + // If the caught form is a battleform, we want to also mark the base form as caught. + // This snippet assumes that the base form has formIndex equal to 0, which should be + // always true except for the case of Urshifu. + const formKey = pokemon.getFormKey(); + if (formIndex > 0) { + if (pokemon.species.speciesId === Species.URSHIFU) { + if (formIndex === 2) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } else if (formIndex === 3) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(1); + } + } else if (pokemon.species.speciesId === Species.ZYGARDE) { + if (formIndex === 4) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(2); + } else if (formIndex === 5) { + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(3); + } + } else { + const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) + ? pokemonFormChanges[species.speciesId] + : []; + const toCurrentFormChanges = allFormChanges.filter(f => f.formKey === formKey); + if (toCurrentFormChanges.length > 0) { + // Needs to do this or Castform can unlock the wrong form, etc. + dexEntry.caughtAttr |= globalScene.gameData.getFormAttr(0); + } + } + } + // Unlock ability if (speciesStarterCosts.hasOwnProperty(species.speciesId)) { - this.starterData[species.speciesId].abilityAttr |= pokemon.abilityIndex !== 1 || pokemon.species.ability2 - ? 1 << pokemon.abilityIndex - : AbilityAttr.ABILITY_HIDDEN; + this.starterData[species.speciesId].abilityAttr |= + pokemon.abilityIndex !== 1 || pokemon.species.ability2 + ? 1 << pokemon.abilityIndex + : AbilityAttr.ABILITY_HIDDEN; } // Unlock nature @@ -1676,15 +1867,24 @@ export class GameData { } } - if (!hasPrevolution && (!pokemon.scene.gameMode.isDaily || hasNewAttr || fromEgg)) { - this.addStarterCandy(species, (1 * (pokemon.isShiny() ? 5 * (1 << (pokemon.variant ?? 0)) : 1)) * (fromEgg || pokemon.isBoss() ? 2 : 1)); + if (!hasPrevolution && (!globalScene.gameMode.isDaily || hasNewAttr || fromEgg)) { + this.addStarterCandy( + species, + 1 * (pokemon.isShiny() ? 5 * (1 << (pokemon.variant ?? 0)) : 1) * (fromEgg || pokemon.isBoss() ? 2 : 1), + ); } } const checkPrevolution = (newStarter: boolean) => { if (hasPrevolution) { const prevolutionSpecies = pokemonPrevolutions[species.speciesId]; - this.setPokemonSpeciesCaught(pokemon, getPokemonSpecies(prevolutionSpecies), incrementCount, fromEgg, showMessage).then(result => resolve(result)); + this.setPokemonSpeciesCaught( + pokemon, + getPokemonSpecies(prevolutionSpecies), + incrementCount, + fromEgg, + showMessage, + ).then(result => resolve(result)); } else { resolve(newStarter); } @@ -1695,15 +1895,21 @@ export class GameData { resolve(true); return; } - this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), null, () => checkPrevolution(true), null, true); + globalScene.playSound("level_up_fanfare"); + globalScene.ui.showText( + i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), + null, + () => checkPrevolution(true), + null, + true, + ); } else { checkPrevolution(false); } }); } - incrementRibbonCount(species: PokemonSpecies, forStarter: boolean = false): integer { + incrementRibbonCount(species: PokemonSpecies, forStarter = false): number { const speciesIdToIncrement: Species = species.getRootSpeciesId(forStarter); if (!this.starterData[speciesIdToIncrement].classicWinCount) { @@ -1711,25 +1917,25 @@ export class GameData { } if (!this.starterData[speciesIdToIncrement].classicWinCount) { - this.scene.gameData.gameStats.ribbonsOwned++; + globalScene.gameData.gameStats.ribbonsOwned++; } - const ribbonsInStats: integer = this.scene.gameData.gameStats.ribbonsOwned; + const ribbonsInStats: number = globalScene.gameData.gameStats.ribbonsOwned; if (ribbonsInStats >= 100) { - this.scene.validateAchv(achvs._100_RIBBONS); + globalScene.validateAchv(achvs._100_RIBBONS); } if (ribbonsInStats >= 75) { - this.scene.validateAchv(achvs._75_RIBBONS); + globalScene.validateAchv(achvs._75_RIBBONS); } if (ribbonsInStats >= 50) { - this.scene.validateAchv(achvs._50_RIBBONS); + globalScene.validateAchv(achvs._50_RIBBONS); } if (ribbonsInStats >= 25) { - this.scene.validateAchv(achvs._25_RIBBONS); + globalScene.validateAchv(achvs._25_RIBBONS); } if (ribbonsInStats >= 10) { - this.scene.validateAchv(achvs._10_RIBBONS); + globalScene.validateAchv(achvs._10_RIBBONS); } return ++this.starterData[speciesIdToIncrement].classicWinCount; @@ -1741,11 +1947,11 @@ export class GameData { * @param species * @param count */ - addStarterCandy(species: PokemonSpecies, count: integer): void { + addStarterCandy(species: PokemonSpecies, count: number): void { // Only gain candies if the Pokemon has already been marked as caught in dex (ignore "rental" pokemon) const speciesRootForm = species.getRootSpeciesId(); - if (this.scene.gameData.dexData[speciesRootForm].caughtAttr) { - this.scene.candyBar.showStarterSpeciesCandy(species.speciesId, count); + if (globalScene.gameData.dexData[speciesRootForm].caughtAttr) { + globalScene.candyBar.showStarterSpeciesCandy(species.speciesId, count); this.starterData[species.speciesId].candyCount += count; } } @@ -1757,7 +1963,12 @@ export class GameData { * @param showMessage Default true. If true, will display message for unlocked egg move * @param prependSpeciesToMessage Default false. If true, will change message from "X Egg Move Unlocked!" to "Bulbasaur X Egg Move Unlocked!" */ - setEggMoveUnlocked(species: PokemonSpecies, eggMoveIndex: integer, showMessage: boolean = true, prependSpeciesToMessage: boolean = false): Promise { + setEggMoveUnlocked( + species: PokemonSpecies, + eggMoveIndex: number, + showMessage = true, + prependSpeciesToMessage = false, + ): Promise { return new Promise(resolve => { const speciesId = species.speciesId; if (!speciesEggMoves.hasOwnProperty(speciesId) || !speciesEggMoves[speciesId][eggMoveIndex]) { @@ -1781,19 +1992,48 @@ export class GameData { resolve(true); return; } - this.scene.playSound("level_up_fanfare"); + globalScene.playSound("level_up_fanfare"); const moveName = allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name; let message = prependSpeciesToMessage ? species.getName() + " " : ""; - message += eggMoveIndex === 3 ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) : i18next.t("egg:eggMoveUnlock", { moveName: moveName }); + message += + eggMoveIndex === 3 + ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) + : i18next.t("egg:eggMoveUnlock", { moveName: moveName }); - this.scene.ui.showText(message, null, () => resolve(true), null, true); + globalScene.ui.showText(message, null, () => resolve(true), null, true); }); } - updateSpeciesDexIvs(speciesId: Species, ivs: integer[]): void { + /** + * Checks whether the root species of a given {@PokemonSpecies} has been unlocked in the dex + */ + isRootSpeciesUnlocked(species: PokemonSpecies): boolean { + return !!this.dexData[species.getRootSpeciesId()]?.caughtAttr; + } + + /** + * Unlocks the given {@linkcode Nature} for a {@linkcode PokemonSpecies} and its prevolutions. + * Will fail silently if root species has not been unlocked + */ + unlockSpeciesNature(species: PokemonSpecies, nature: Nature): void { + if (!this.isRootSpeciesUnlocked(species)) { + return; + } + + //recursively unlock nature for species and prevolutions + const _unlockSpeciesNature = (speciesId: Species) => { + this.dexData[speciesId].natureAttr |= 1 << (nature + 1); + if (pokemonPrevolutions.hasOwnProperty(speciesId)) { + _unlockSpeciesNature(pokemonPrevolutions[speciesId]); + } + }; + _unlockSpeciesNature(species.speciesId); + } + + updateSpeciesDexIvs(speciesId: Species, ivs: number[]): void { let dexEntry: DexEntry; do { - dexEntry = this.scene.gameData.dexData[speciesId]; + dexEntry = globalScene.gameData.dexData[speciesId]; const dexIvs = dexEntry.ivs; for (let i = 0; i < dexIvs.length; i++) { if (dexIvs[i] < ivs[i]) { @@ -1801,12 +2041,12 @@ export class GameData { } } if (dexIvs.filter(iv => iv === 31).length === 6) { - this.scene.validateAchv(achvs.PERFECT_IVS); + globalScene.validateAchv(achvs.PERFECT_IVS); } } while (pokemonPrevolutions.hasOwnProperty(speciesId) && (speciesId = pokemonPrevolutions[speciesId])); } - getSpeciesCount(dexEntryPredicate: (entry: DexEntry) => boolean): integer { + getSpeciesCount(dexEntryPredicate: (entry: DexEntry) => boolean): number { const dexKeys = Object.keys(this.dexData); let speciesCount = 0; for (const s of dexKeys) { @@ -1817,7 +2057,7 @@ export class GameData { return speciesCount; } - getStarterCount(dexEntryPredicate: (entry: DexEntry) => boolean): integer { + getStarterCount(dexEntryPredicate: (entry: DexEntry) => boolean): number { const starterKeys = Object.keys(speciesStarterCosts); let starterCount = 0; for (const s of starterKeys) { @@ -1829,36 +2069,66 @@ export class GameData { return starterCount; } - getSpeciesDefaultDexAttr(species: PokemonSpecies, forSeen: boolean = false, optimistic: boolean = false): bigint { + getSpeciesDefaultDexAttr(species: PokemonSpecies, _forSeen = false, optimistic = false): bigint { let ret = 0n; const dexEntry = this.dexData[species.speciesId]; const attr = dexEntry.caughtAttr; - ret |= optimistic - ? attr & DexAttr.SHINY ? DexAttr.SHINY : DexAttr.NON_SHINY - : attr & DexAttr.NON_SHINY || !(attr & DexAttr.SHINY) ? DexAttr.NON_SHINY : DexAttr.SHINY; + if (optimistic) { + if (attr & DexAttr.SHINY) { + ret |= DexAttr.SHINY; + + if (attr & DexAttr.VARIANT_3) { + ret |= DexAttr.VARIANT_3; + } else if (attr & DexAttr.VARIANT_2) { + ret |= DexAttr.VARIANT_2; + } else { + ret |= DexAttr.DEFAULT_VARIANT; + } + } else { + ret |= DexAttr.NON_SHINY; + ret |= DexAttr.DEFAULT_VARIANT; + } + } else { + // Default to non shiny. Fallback to shiny if it's the only thing that's unlocked + ret |= attr & DexAttr.NON_SHINY || !(attr & DexAttr.SHINY) ? DexAttr.NON_SHINY : DexAttr.SHINY; + + if (attr & DexAttr.DEFAULT_VARIANT) { + ret |= DexAttr.DEFAULT_VARIANT; + } else if (attr & DexAttr.VARIANT_2) { + ret |= DexAttr.VARIANT_2; + } else if (attr & DexAttr.VARIANT_3) { + ret |= DexAttr.VARIANT_3; + } else { + ret |= DexAttr.DEFAULT_VARIANT; + } + } ret |= attr & DexAttr.MALE || !(attr & DexAttr.FEMALE) ? DexAttr.MALE : DexAttr.FEMALE; - ret |= optimistic - ? attr & DexAttr.SHINY ? attr & DexAttr.VARIANT_3 ? DexAttr.VARIANT_3 : attr & DexAttr.VARIANT_2 ? DexAttr.VARIANT_2 : DexAttr.DEFAULT_VARIANT : DexAttr.DEFAULT_VARIANT - : attr & DexAttr.DEFAULT_VARIANT ? DexAttr.DEFAULT_VARIANT : attr & DexAttr.VARIANT_2 ? DexAttr.VARIANT_2 : attr & DexAttr.VARIANT_3 ? DexAttr.VARIANT_3 : DexAttr.DEFAULT_VARIANT; ret |= this.getFormAttr(this.getFormIndex(attr)); return ret; } - getSpeciesDexAttrProps(species: PokemonSpecies, dexAttr: bigint): DexAttrProps { + getSpeciesDexAttrProps(_species: PokemonSpecies, dexAttr: bigint): DexAttrProps { const shiny = !(dexAttr & DexAttr.NON_SHINY); const female = !(dexAttr & DexAttr.MALE); - const variant = dexAttr & DexAttr.DEFAULT_VARIANT ? 0 : dexAttr & DexAttr.VARIANT_2 ? 1 : dexAttr & DexAttr.VARIANT_3 ? 2 : 0; + let variant: Variant = 0; + if (dexAttr & DexAttr.DEFAULT_VARIANT) { + variant = 0; + } else if (dexAttr & DexAttr.VARIANT_2) { + variant = 1; + } else if (dexAttr & DexAttr.VARIANT_3) { + variant = 2; + } const formIndex = this.getFormIndex(dexAttr); return { shiny, female, variant, - formIndex + formIndex, }; } - getStarterSpeciesDefaultAbilityIndex(species: PokemonSpecies): integer { + getStarterSpeciesDefaultAbilityIndex(species: PokemonSpecies): number { const abilityAttr = this.starterData[species.speciesId].abilityAttr; return abilityAttr & AbilityAttr.ABILITY_1 ? 0 : !species.ability2 || abilityAttr & AbilityAttr.ABILITY_2 ? 1 : 2; } @@ -1873,15 +2143,15 @@ export class GameData { return 0 as Nature; } - getSpeciesDefaultNatureAttr(species: PokemonSpecies): integer { - return 1 << (this.getSpeciesDefaultNature(species)); + getSpeciesDefaultNatureAttr(species: PokemonSpecies): number { + return 1 << this.getSpeciesDefaultNature(species); } - getDexAttrLuck(dexAttr: bigint): integer { - return dexAttr & DexAttr.SHINY ? dexAttr & DexAttr.VARIANT_3 ? 3 : dexAttr & DexAttr.VARIANT_2 ? 2 : 1 : 0; + getDexAttrLuck(dexAttr: bigint): number { + return dexAttr & DexAttr.SHINY ? (dexAttr & DexAttr.VARIANT_3 ? 3 : dexAttr & DexAttr.VARIANT_2 ? 2 : 1) : 0; } - getNaturesForAttr(natureAttr: integer = 0): Nature[] { + getNaturesForAttr(natureAttr = 0): Nature[] { const ret: Nature[] = []; for (let n = 0; n < 25; n++) { if (natureAttr & (1 << (n + 1))) { @@ -1909,12 +2179,12 @@ export class GameData { } const cost = new Utils.NumberHolder(value); - applyChallenges(this.scene.gameMode, ChallengeType.STARTER_COST, speciesId, cost); + applyChallenges(globalScene.gameMode, ChallengeType.STARTER_COST, speciesId, cost); return cost.value; } - getFormIndex(attr: bigint): integer { + getFormIndex(attr: bigint): number { if (!attr || attr < DexAttr.DEFAULT_FORM) { return 0; } @@ -1925,7 +2195,7 @@ export class GameData { return f; } - getFormAttr(formIndex: integer): bigint { + getFormAttr(formIndex: number): bigint { return BigInt(1) << BigInt(7 + formIndex); } @@ -1936,20 +2206,21 @@ export class GameData { entry.hatchedCount = 0; } if (!entry.hasOwnProperty("natureAttr") || (entry.caughtAttr && !entry.natureAttr)) { - entry.natureAttr = this.defaultDexData?.[k].natureAttr || (1 << Utils.randInt(25, 1)); + entry.natureAttr = this.defaultDexData?.[k].natureAttr || 1 << Utils.randInt(25, 1); } } } migrateStarterAbilities(systemData: SystemSaveData, initialStarterData?: StarterData): void { - const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); + const starterIds = Object.keys(this.starterData).map(s => Number.parseInt(s) as Species); const starterData = initialStarterData || systemData.starterData; const dexData = systemData.dexData; for (const s of starterIds) { const dexAttr = dexData[s].caughtAttr; - starterData[s].abilityAttr = (dexAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) - | (dexAttr & DexAttr.VARIANT_2 ? AbilityAttr.ABILITY_2 : 0) - | (dexAttr & DexAttr.VARIANT_3 ? AbilityAttr.ABILITY_HIDDEN : 0); + starterData[s].abilityAttr = + (dexAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) | + (dexAttr & DexAttr.VARIANT_2 ? AbilityAttr.ABILITY_2 : 0) | + (dexAttr & DexAttr.VARIANT_3 ? AbilityAttr.ABILITY_HIDDEN : 0); if (dexAttr) { if (!(dexAttr & DexAttr.DEFAULT_VARIANT)) { dexData[s].caughtAttr ^= DexAttr.DEFAULT_VARIANT; diff --git a/src/system/game-speed.ts b/src/system/game-speed.ts index 861c3d4705d..e2156c03728 100644 --- a/src/system/game-speed.ts +++ b/src/system/game-speed.ts @@ -1,7 +1,8 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import FadeIn from "phaser3-rex-plugins/plugins/audio/fade/FadeIn"; -import FadeOut from "phaser3-rex-plugins/plugins/audio/fade/FadeOut"; -import BattleScene from "../battle-scene"; +import type FadeIn from "phaser3-rex-plugins/plugins/audio/fade/FadeIn"; +import type FadeOut from "phaser3-rex-plugins/plugins/audio/fade/FadeOut"; +import type BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import * as Utils from "../utils"; type FadeIn = typeof FadeIn; @@ -14,7 +15,7 @@ export function initGameSpeed() { if (value instanceof Utils.FixedInt) { return (value as Utils.FixedInt).value; } - return thisArg.gameSpeed === 1 ? value : Math.ceil(value /= thisArg.gameSpeed); + return thisArg.gameSpeed === 1 ? value : Math.ceil((value /= thisArg.gameSpeed)); }; const originalAddEvent = this.time.addEvent; @@ -22,15 +23,21 @@ export function initGameSpeed() { if (!(config instanceof Phaser.Time.TimerEvent) && config.delay) { config.delay = transformValue(config.delay); } - return originalAddEvent.apply(this, [ config ]); + return originalAddEvent.apply(this, [config]); }; const originalTweensAdd = this.tweens.add; - this.tweens.add = function (config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain) { + this.tweens.add = function ( + config: + | Phaser.Types.Tweens.TweenBuilderConfig + | Phaser.Types.Tweens.TweenChainBuilderConfig + | Phaser.Tweens.Tween + | Phaser.Tweens.TweenChain, + ) { if (config.loopDelay) { config.loopDelay = transformValue(config.loopDelay as number); } - if (!(config instanceof Phaser.Tweens.TweenChain) ) { + if (!(config instanceof Phaser.Tweens.TweenChain)) { if (config.duration) { config.duration = transformValue(config.duration); } @@ -47,12 +54,12 @@ export function initGameSpeed() { } } } - return originalTweensAdd.apply(this, [ config ]); + return originalTweensAdd.apply(this, [config]); }; const originalTweensChain = this.tweens.chain; this.tweens.chain = function (config: Phaser.Types.Tweens.TweenChainBuilderConfig): Phaser.Tweens.TweenChain { if (config.tweens) { - config.tweens.forEach(t => { + for (const t of config.tweens) { if (t.duration) { t.duration = transformValue(t.duration); } @@ -68,9 +75,9 @@ export function initGameSpeed() { if (t.hold) { t.hold = transformValue(t.hold); } - }); + } } - return originalTweensChain.apply(this, [ config ]); + return originalTweensChain.apply(this, [config]); }; const originalAddCounter = this.tweens.addCounter; this.tweens.addCounter = function (config: Phaser.Types.Tweens.NumberTweenBuilderConfig) { @@ -89,23 +96,19 @@ export function initGameSpeed() { if (config.hold) { config.hold = transformValue(config.hold); } - return originalAddCounter.apply(this, [ config ]); + return originalAddCounter.apply(this, [config]); }; const originalFadeOut = SoundFade.fadeOut; - SoundFade.fadeOut = (( - scene: Phaser.Scene, - sound: Phaser.Sound.BaseSound, - duration: number, - destroy?: boolean - ) => originalFadeOut(scene, sound, transformValue(duration), destroy)) as FadeOut; + SoundFade.fadeOut = ((_scene: Phaser.Scene, sound: Phaser.Sound.BaseSound, duration: number, destroy?: boolean) => + originalFadeOut(globalScene, sound, transformValue(duration), destroy)) as FadeOut; const originalFadeIn = SoundFade.fadeIn; SoundFade.fadeIn = (( - scene: Phaser.Scene, + _scene: Phaser.Scene, sound: string | Phaser.Sound.BaseSound, duration: number, endVolume?: number, - startVolume?: number - ) => originalFadeIn(scene, sound, transformValue(duration), endVolume, startVolume)) as FadeIn; + startVolume?: number, + ) => originalFadeIn(globalScene, sound, transformValue(duration), endVolume, startVolume)) as FadeIn; } diff --git a/src/system/game-stats.ts b/src/system/game-stats.ts index a8b74f29bb7..5553a0332fc 100644 --- a/src/system/game-stats.ts +++ b/src/system/game-stats.ts @@ -1,43 +1,43 @@ -// public (.*?): integer; +// public (.*?): number; // this.$1 = source?.$1 || 0; export class GameStats { - public playTime: integer; - public battles: integer; - public classicSessionsPlayed: integer; - public sessionsWon: integer; - public ribbonsOwned: integer; - public dailyRunSessionsPlayed: integer; - public dailyRunSessionsWon: integer; - public endlessSessionsPlayed: integer; - public highestEndlessWave: integer; - public highestLevel: integer; - public highestMoney: integer; - public highestDamage: integer; - public highestHeal: integer; - public pokemonSeen: integer; - public pokemonDefeated: integer; - public pokemonCaught: integer; - public pokemonHatched: integer; - public subLegendaryPokemonSeen: integer; - public subLegendaryPokemonCaught: integer; - public subLegendaryPokemonHatched: integer; - public legendaryPokemonSeen: integer; - public legendaryPokemonCaught: integer; - public legendaryPokemonHatched: integer; - public mythicalPokemonSeen: integer; - public mythicalPokemonCaught: integer; - public mythicalPokemonHatched: integer; - public shinyPokemonSeen: integer; - public shinyPokemonCaught: integer; - public shinyPokemonHatched: integer; - public pokemonFused: integer; - public trainersDefeated: integer; - public eggsPulled: integer; - public rareEggsPulled: integer; - public epicEggsPulled: integer; - public legendaryEggsPulled: integer; - public manaphyEggsPulled: integer; + public playTime: number; + public battles: number; + public classicSessionsPlayed: number; + public sessionsWon: number; + public ribbonsOwned: number; + public dailyRunSessionsPlayed: number; + public dailyRunSessionsWon: number; + public endlessSessionsPlayed: number; + public highestEndlessWave: number; + public highestLevel: number; + public highestMoney: number; + public highestDamage: number; + public highestHeal: number; + public pokemonSeen: number; + public pokemonDefeated: number; + public pokemonCaught: number; + public pokemonHatched: number; + public subLegendaryPokemonSeen: number; + public subLegendaryPokemonCaught: number; + public subLegendaryPokemonHatched: number; + public legendaryPokemonSeen: number; + public legendaryPokemonCaught: number; + public legendaryPokemonHatched: number; + public mythicalPokemonSeen: number; + public mythicalPokemonCaught: number; + public mythicalPokemonHatched: number; + public shinyPokemonSeen: number; + public shinyPokemonCaught: number; + public shinyPokemonHatched: number; + public pokemonFused: number; + public trainersDefeated: number; + public eggsPulled: number; + public rareEggsPulled: number; + public epicEggsPulled: number; + public legendaryEggsPulled: number; + public manaphyEggsPulled: number; constructor(source?: any) { this.playTime = source?.playTime || 0; diff --git a/src/system/modifier-data.ts b/src/system/modifier-data.ts index 1514f7e3fb3..cbda45572ac 100644 --- a/src/system/modifier-data.ts +++ b/src/system/modifier-data.ts @@ -1,18 +1,19 @@ -import BattleScene from "../battle-scene"; -import { PersistentModifier } from "../modifier/modifier"; -import { GeneratedPersistentModifierType, ModifierType, ModifierTypeGenerator, getModifierTypeFuncById } from "../modifier/modifier-type"; +import { globalScene } from "#app/global-scene"; +import { PersistentModifier } from "#app/modifier/modifier"; +import type { GeneratedPersistentModifierType, ModifierType } from "#app/modifier/modifier-type"; +import { ModifierTypeGenerator, getModifierTypeFuncById } from "#app/modifier/modifier-type"; export default class ModifierData { public player: boolean; public typeId: string; public typePregenArgs: any[]; public args: any[]; - public stackCount: integer; + public stackCount: number; public className: string; constructor(source: PersistentModifier | any, player: boolean) { - const sourceModifier = source instanceof PersistentModifier ? source as PersistentModifier : null; + const sourceModifier = source instanceof PersistentModifier ? (source as PersistentModifier) : null; this.player = player; this.typeId = sourceModifier ? sourceModifier.type.id : source.typeId; if (sourceModifier) { @@ -27,7 +28,7 @@ export default class ModifierData { this.className = sourceModifier ? sourceModifier.constructor.name : source.className; } - toModifier(scene: BattleScene, constructor: any): PersistentModifier | null { + toModifier(_constructor: any): PersistentModifier | null { const typeFunc = getModifierTypeFuncById(this.typeId); if (!typeFunc) { return null; @@ -38,13 +39,19 @@ export default class ModifierData { type.id = this.typeId; if (type instanceof ModifierTypeGenerator) { - type = (type as ModifierTypeGenerator).generateType(this.player ? scene.getParty() : scene.getEnemyField(), this.typePregenArgs); + type = (type as ModifierTypeGenerator).generateType( + this.player ? globalScene.getPlayerParty() : globalScene.getEnemyField(), + this.typePregenArgs, + ); } - const ret = Reflect.construct(constructor, ([ type ] as any[]).concat(this.args).concat(this.stackCount)) as PersistentModifier; + const ret = Reflect.construct( + _constructor, + ([type] as any[]).concat(this.args).concat(this.stackCount), + ) as PersistentModifier; - if (ret.stackCount > ret.getMaxStackCount(scene)) { - ret.stackCount = ret.getMaxStackCount(scene); + if (ret.stackCount > ret.getMaxStackCount()) { + ret.stackCount = ret.getMaxStackCount(); } return ret; diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 421739a9da1..4e694bc1189 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -1,61 +1,66 @@ import { BattleType } from "../battle"; -import BattleScene from "../battle-scene"; -import { Gender } from "../data/gender"; -import { Nature } from "../data/nature"; -import { PokeballType } from "../data/pokeball"; +import { globalScene } from "#app/global-scene"; +import type { Gender } from "../data/gender"; +import type { Nature } from "#enums/nature"; +import type { PokeballType } from "#enums/pokeball"; import { getPokemonSpecies } from "../data/pokemon-species"; import { Status } from "../data/status-effect"; import Pokemon, { EnemyPokemon, PokemonMove, PokemonSummonData } from "../field/pokemon"; import { TrainerSlot } from "../data/trainer-config"; -import { Variant } from "#app/data/variant"; +import type { Variant } from "#app/data/variant"; import { loadBattlerTag } from "../data/battler-tags"; -import { Biome } from "#enums/biome"; +import type { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; +import type { Species } from "#enums/species"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; +import type { PokemonType } from "#enums/pokemon-type"; export default class PokemonData { - public id: integer; + public id: number; public player: boolean; public species: Species; public nickname: string; - public formIndex: integer; - public abilityIndex: integer; + public formIndex: number; + public abilityIndex: number; public passive: boolean; public shiny: boolean; public variant: Variant; public pokeball: PokeballType; - public level: integer; - public exp: integer; - public levelExp: integer; + public level: number; + public exp: number; + public levelExp: number; public gender: Gender; - public hp: integer; - public stats: integer[]; - public ivs: integer[]; + public hp: number; + public stats: number[]; + public ivs: number[]; public nature: Nature; public moveset: (PokemonMove | null)[]; public status: Status | null; - public friendship: integer; - public metLevel: integer; - public metBiome: Biome | -1; // -1 for starters + public friendship: number; + public metLevel: number; + public metBiome: Biome | -1; // -1 for starters public metSpecies: Species; - public metWave: number; // 0 for unknown (previous saves), -1 for starters - public luck: integer; + public metWave: number; // 0 for unknown (previous saves), -1 for starters + public luck: number; public pauseEvolutions: boolean; public pokerus: boolean; public usedTMs: Moves[]; - public evoCounter: integer; + public evoCounter: number; + public teraType: PokemonType; + public isTerastallized: boolean; + public stellarTypesBoosted: PokemonType[]; public fusionSpecies: Species; - public fusionFormIndex: integer; - public fusionAbilityIndex: integer; + public fusionFormIndex: number; + public fusionAbilityIndex: number; public fusionShiny: boolean; public fusionVariant: Variant; public fusionGender: Gender; - public fusionLuck: integer; + public fusionLuck: number; + public fusionTeraType: PokemonType; public boss: boolean; - public bossSegments?: integer; + public bossSegments?: number; public summonData: PokemonSummonData; @@ -68,7 +73,7 @@ export default class PokemonData { public mysteryEncounterPokemonData: CustomPokemonData | null; public fusionMysteryEncounterPokemonData: CustomPokemonData | null; - constructor(source: Pokemon | any, forHistory: boolean = false) { + constructor(source: Pokemon | any, forHistory = false) { const sourcePokemon = source instanceof Pokemon ? source : null; this.id = source.id; this.player = sourcePokemon ? sourcePokemon.isPlayer() : source.player; @@ -91,18 +96,22 @@ export default class PokemonData { } this.stats = source.stats; this.ivs = source.ivs; - this.nature = source.nature !== undefined ? source.nature : 0 as Nature; - this.friendship = source.friendship !== undefined ? source.friendship : getPokemonSpecies(this.species).baseFriendship; + this.nature = source.nature !== undefined ? source.nature : (0 as Nature); + this.friendship = + source.friendship !== undefined ? source.friendship : getPokemonSpecies(this.species).baseFriendship; this.metLevel = source.metLevel || 5; this.metBiome = source.metBiome !== undefined ? source.metBiome : -1; this.metSpecies = source.metSpecies; this.metWave = source.metWave ?? (this.metBiome === -1 ? -1 : 0); - this.luck = source.luck !== undefined ? source.luck : (source.shiny ? (source.variant + 1) : 0); + this.luck = source.luck !== undefined ? source.luck : source.shiny ? source.variant + 1 : 0; if (!forHistory) { this.pauseEvolutions = !!source.pauseEvolutions; this.evoCounter = source.evoCounter ?? 0; } this.pokerus = !!source.pokerus; + this.teraType = source.teraType as PokemonType; + this.isTerastallized = source.isTerastallized || false; + this.stellarTypesBoosted = source.stellarTypesBoosted || []; this.fusionSpecies = sourcePokemon ? sourcePokemon.fusionSpecies?.speciesId : source.fusionSpecies; this.fusionFormIndex = source.fusionFormIndex; @@ -110,16 +119,22 @@ export default class PokemonData { this.fusionShiny = source.fusionShiny; this.fusionVariant = source.fusionVariant; this.fusionGender = source.fusionGender; - this.fusionLuck = source.fusionLuck !== undefined ? source.fusionLuck : (source.fusionShiny ? source.fusionVariant + 1 : 0); + this.fusionLuck = + source.fusionLuck !== undefined ? source.fusionLuck : source.fusionShiny ? source.fusionVariant + 1 : 0; this.fusionCustomPokemonData = new CustomPokemonData(source.fusionCustomPokemonData); + this.fusionTeraType = (source.fusionTeraType ?? 0) as PokemonType; this.usedTMs = source.usedTMs ?? []; this.customPokemonData = new CustomPokemonData(source.customPokemonData); // Deprecated, but needed for session data migration this.natureOverride = source.natureOverride; - this.mysteryEncounterPokemonData = new CustomPokemonData(source.mysteryEncounterPokemonData); - this.fusionMysteryEncounterPokemonData = new CustomPokemonData(source.fusionMysteryEncounterPokemonData); + this.mysteryEncounterPokemonData = source.mysteryEncounterPokemonData + ? new CustomPokemonData(source.mysteryEncounterPokemonData) + : null; + this.fusionMysteryEncounterPokemonData = source.fusionMysteryEncounterPokemonData + ? new CustomPokemonData(source.fusionMysteryEncounterPokemonData) + : null; if (!forHistory) { this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss); @@ -135,7 +150,9 @@ export default class PokemonData { } } } else { - this.moveset = (source.moveset || [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL) ]).filter(m => m).map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); + this.moveset = (source.moveset || [new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL)]) + .filter(m => m) + .map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp, m.virtual, m.maxPpOverride)); if (!forHistory) { this.status = source.status ? new Status(source.status.effect, source.status.toxicTurnCount, source.status.sleepTurnsRemaining) @@ -163,15 +180,38 @@ export default class PokemonData { } } - toPokemon(scene: BattleScene, battleType?: BattleType, partyMemberIndex: integer = 0, double: boolean = false): Pokemon { + toPokemon(battleType?: BattleType, partyMemberIndex = 0, double = false): Pokemon { const species = getPokemonSpecies(this.species); const ret: Pokemon = this.player - ? scene.addPlayerPokemon(species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this, (playerPokemon) => { - if (this.nickname) { - 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); + ? globalScene.addPlayerPokemon( + species, + this.level, + this.abilityIndex, + this.formIndex, + this.gender, + this.shiny, + this.variant, + this.ivs, + this.nature, + this, + playerPokemon => { + if (this.nickname) { + playerPokemon.nickname = this.nickname; + } + }, + ) + : globalScene.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/session-history.ts b/src/system/session-history.ts index 85a300110d9..8eb81cb6efe 100644 --- a/src/system/session-history.ts +++ b/src/system/session-history.ts @@ -1,22 +1,22 @@ -import { GameModes } from "../game-mode"; -import PokemonData from "./pokemon-data"; -import PersistentModifierData from "./modifier-data"; +import type { GameModes } from "../game-mode"; +import type PokemonData from "./pokemon-data"; +import type PersistentModifierData from "./modifier-data"; export enum SessionHistoryResult { ACTIVE, WIN, - LOSS + LOSS, } export interface SessionHistory { seed: string; - playTime: integer; - result: SessionHistoryResult, + playTime: number; + result: SessionHistoryResult; gameMode: GameModes; party: PokemonData[]; modifiers: PersistentModifierData[]; - money: integer; - waveIndex: integer; + money: number; + waveIndex: number; gameVersion: string; - timestamp: integer; + timestamp: number; } diff --git a/src/system/settings/settings-gamepad.ts b/src/system/settings/settings-gamepad.ts index 322b2baac9e..f4a6bd465af 100644 --- a/src/system/settings/settings-gamepad.ts +++ b/src/system/settings/settings-gamepad.ts @@ -1,54 +1,54 @@ -import BattleScene from "../../battle-scene"; -import SettingsGamepadUiHandler from "../../ui/settings/settings-gamepad-ui-handler"; +import type SettingsGamepadUiHandler from "../../ui/settings/settings-gamepad-ui-handler"; import { Mode } from "../../ui/ui"; import { truncateString } from "../../utils"; import { Button } from "#enums/buttons"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { globalScene } from "#app/global-scene"; export enum SettingGamepad { - Controller = "CONTROLLER", - Gamepad_Support = "GAMEPAD_SUPPORT", - Button_Up = "BUTTON_UP", - Button_Down = "BUTTON_DOWN", - Button_Left = "BUTTON_LEFT", - Button_Right = "BUTTON_RIGHT", - Button_Action = "BUTTON_ACTION", - Button_Cancel = "BUTTON_CANCEL", - Button_Menu = "BUTTON_MENU", - Button_Stats = "BUTTON_STATS", - Button_Cycle_Form = "BUTTON_CYCLE_FORM", - Button_Cycle_Shiny = "BUTTON_CYCLE_SHINY", - Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", - Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", - Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", - Button_Cycle_Variant = "BUTTON_CYCLE_VARIANT", - Button_Speed_Up = "BUTTON_SPEED_UP", - Button_Slow_Down = "BUTTON_SLOW_DOWN", - Button_Submit = "BUTTON_SUBMIT", + Controller = "CONTROLLER", + Gamepad_Support = "GAMEPAD_SUPPORT", + Button_Up = "BUTTON_UP", + Button_Down = "BUTTON_DOWN", + Button_Left = "BUTTON_LEFT", + Button_Right = "BUTTON_RIGHT", + Button_Action = "BUTTON_ACTION", + Button_Cancel = "BUTTON_CANCEL", + Button_Menu = "BUTTON_MENU", + Button_Stats = "BUTTON_STATS", + Button_Cycle_Form = "BUTTON_CYCLE_FORM", + Button_Cycle_Shiny = "BUTTON_CYCLE_SHINY", + Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", + Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", + Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", + Button_Cycle_Tera = "BUTTON_CYCLE_TERA", + Button_Speed_Up = "BUTTON_SPEED_UP", + Button_Slow_Down = "BUTTON_SLOW_DOWN", + Button_Submit = "BUTTON_SUBMIT", } const pressAction = "Press action to assign"; export const settingGamepadOptions = { - [SettingGamepad.Controller]: [ "Default", "Change" ], - [SettingGamepad.Gamepad_Support]: [ "Auto", "Disabled" ], - [SettingGamepad.Button_Up]: [ `KEY ${Button.UP.toString()}`, pressAction ], - [SettingGamepad.Button_Down]: [ `KEY ${Button.DOWN.toString()}`, pressAction ], - [SettingGamepad.Button_Left]: [ `KEY ${Button.LEFT.toString()}`, pressAction ], - [SettingGamepad.Button_Right]: [ `KEY ${Button.RIGHT.toString()}`, pressAction ], - [SettingGamepad.Button_Action]: [ `KEY ${Button.ACTION.toString()}`, pressAction ], - [SettingGamepad.Button_Cancel]: [ `KEY ${Button.CANCEL.toString()}`, pressAction ], - [SettingGamepad.Button_Menu]: [ `KEY ${Button.MENU.toString()}`, pressAction ], - [SettingGamepad.Button_Stats]: [ `KEY ${Button.STATS.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Form]: [ `KEY ${Button.CYCLE_FORM.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Shiny]: [ `KEY ${Button.CYCLE_SHINY.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Gender]: [ `KEY ${Button.CYCLE_GENDER.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingGamepad.Button_Cycle_Variant]: [ `KEY ${Button.V.toString()}`, pressAction ], - [SettingGamepad.Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], - [SettingGamepad.Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], - [SettingGamepad.Button_Submit]: [ `KEY ${Button.SUBMIT.toString()}`, pressAction ], + [SettingGamepad.Controller]: ["Default", "Change"], + [SettingGamepad.Gamepad_Support]: ["Auto", "Disabled"], + [SettingGamepad.Button_Up]: [`KEY ${Button.UP.toString()}`, pressAction], + [SettingGamepad.Button_Down]: [`KEY ${Button.DOWN.toString()}`, pressAction], + [SettingGamepad.Button_Left]: [`KEY ${Button.LEFT.toString()}`, pressAction], + [SettingGamepad.Button_Right]: [`KEY ${Button.RIGHT.toString()}`, pressAction], + [SettingGamepad.Button_Action]: [`KEY ${Button.ACTION.toString()}`, pressAction], + [SettingGamepad.Button_Cancel]: [`KEY ${Button.CANCEL.toString()}`, pressAction], + [SettingGamepad.Button_Menu]: [`KEY ${Button.MENU.toString()}`, pressAction], + [SettingGamepad.Button_Stats]: [`KEY ${Button.STATS.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Form]: [`KEY ${Button.CYCLE_FORM.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Shiny]: [`KEY ${Button.CYCLE_SHINY.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Gender]: [`KEY ${Button.CYCLE_GENDER.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Ability]: [`KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Nature]: [`KEY ${Button.CYCLE_NATURE.toString()}`, pressAction], + [SettingGamepad.Button_Cycle_Tera]: [`KEY ${Button.CYCLE_TERA.toString()}`, pressAction], + [SettingGamepad.Button_Speed_Up]: [`KEY ${Button.SPEED_UP.toString()}`, pressAction], + [SettingGamepad.Button_Slow_Down]: [`KEY ${Button.SLOW_DOWN.toString()}`, pressAction], + [SettingGamepad.Button_Submit]: [`KEY ${Button.SUBMIT.toString()}`, pressAction], }; export const settingGamepadDefaults = { @@ -67,7 +67,7 @@ export const settingGamepadDefaults = { [SettingGamepad.Button_Cycle_Gender]: 0, [SettingGamepad.Button_Cycle_Ability]: 0, [SettingGamepad.Button_Cycle_Nature]: 0, - [SettingGamepad.Button_Cycle_Variant]: 0, + [SettingGamepad.Button_Cycle_Tera]: 0, [SettingGamepad.Button_Speed_Up]: 0, [SettingGamepad.Button_Slow_Down]: 0, [SettingGamepad.Button_Submit]: 0, @@ -80,12 +80,12 @@ export const settingGamepadBlackList = [ SettingKeyboard.Button_Right, ]; -export function setSettingGamepad(scene: BattleScene, setting: SettingGamepad, value: integer): boolean { +export function setSettingGamepad(setting: SettingGamepad, value: number): boolean { switch (setting) { case SettingGamepad.Gamepad_Support: - // if we change the value of the gamepad support, we call a method in the inputController to - // activate or deactivate the controller listener - scene.inputController.setGamepadSupport(settingGamepadOptions[setting][value] !== "Disabled"); + // if we change the value of the gamepad support, we call a method in the inputController to + // activate or deactivate the controller listener + globalScene.inputController.setGamepadSupport(settingGamepadOptions[setting][value] !== "Disabled"); break; case SettingGamepad.Button_Action: case SettingGamepad.Button_Cancel: @@ -96,18 +96,18 @@ export function setSettingGamepad(scene: BattleScene, setting: SettingGamepad, v case SettingGamepad.Button_Cycle_Gender: case SettingGamepad.Button_Cycle_Ability: case SettingGamepad.Button_Cycle_Nature: - case SettingGamepad.Button_Cycle_Variant: + case SettingGamepad.Button_Cycle_Tera: case SettingGamepad.Button_Speed_Up: case SettingGamepad.Button_Slow_Down: case SettingGamepad.Button_Submit: if (value) { - if (scene.ui) { - const cancelHandler = (success: boolean = false) : boolean => { - scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); + if (globalScene.ui) { + const cancelHandler = (success = false): boolean => { + globalScene.ui.revertMode(); + (globalScene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); return success; }; - scene.ui.setOverlayMode(Mode.GAMEPAD_BINDING, { + globalScene.ui.setOverlayMode(Mode.GAMEPAD_BINDING, { target: setting, cancelHandler: cancelHandler, }); @@ -116,27 +116,34 @@ export function setSettingGamepad(scene: BattleScene, setting: SettingGamepad, v break; case SettingGamepad.Controller: if (value) { - const gp = scene.inputController.getGamepadsName(); - if (scene.ui && gp) { + const gp = globalScene.inputController.getGamepadsName(); + if (globalScene.ui && gp) { const cancelHandler = () => { - scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsGamepadUiHandler).setOptionCursor(Object.values(SettingGamepad).indexOf(SettingGamepad.Controller), 0, true); - (scene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); + globalScene.ui.revertMode(); + (globalScene.ui.getHandler() as SettingsGamepadUiHandler).setOptionCursor( + Object.values(SettingGamepad).indexOf(SettingGamepad.Controller), + 0, + true, + ); + (globalScene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); return false; }; const changeGamepadHandler = (gamepad: string) => { - scene.inputController.setChosenGamepad(gamepad); + globalScene.inputController.setChosenGamepad(gamepad); cancelHandler(); return true; }; - scene.ui.setOverlayMode(Mode.OPTION_SELECT, { - options: [ ...gp.map((g: string) => ({ - label: truncateString(g, 30), // Truncate the gamepad name for display - handler: () => changeGamepadHandler(g) - })), { - label: "Cancel", - handler: cancelHandler, - }] + globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { + options: [ + ...gp.map((g: string) => ({ + label: truncateString(g, 30), // Truncate the gamepad name for display + handler: () => changeGamepadHandler(g), + })), + { + label: "Cancel", + handler: cancelHandler, + }, + ], }); return false; } diff --git a/src/system/settings/settings-keyboard.ts b/src/system/settings/settings-keyboard.ts index 97990f61c86..ffe8811e5d9 100644 --- a/src/system/settings/settings-keyboard.ts +++ b/src/system/settings/settings-keyboard.ts @@ -1,85 +1,85 @@ import { Button } from "#enums/buttons"; -import BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; -import SettingsKeyboardUiHandler from "#app/ui/settings/settings-keyboard-ui-handler"; +import type SettingsKeyboardUiHandler from "#app/ui/settings/settings-keyboard-ui-handler"; import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; export enum SettingKeyboard { - // Default_Layout = "DEFAULT_LAYOUT", - Button_Up = "BUTTON_UP", - Alt_Button_Up = "ALT_BUTTON_UP", - Button_Down = "BUTTON_DOWN", - Alt_Button_Down = "ALT_BUTTON_DOWN", - Button_Left = "BUTTON_LEFT", - Alt_Button_Left = "ALT_BUTTON_LEFT", - Button_Right = "BUTTON_RIGHT", - Alt_Button_Right = "ALT_BUTTON_RIGHT", - Button_Action = "BUTTON_ACTION", - Alt_Button_Action = "ALT_BUTTON_ACTION", - Button_Cancel = "BUTTON_CANCEL", - Alt_Button_Cancel = "ALT_BUTTON_CANCEL", - Button_Menu = "BUTTON_MENU", - Alt_Button_Menu = "ALT_BUTTON_MENU", - Button_Stats = "BUTTON_STATS", - Alt_Button_Stats = "ALT_BUTTON_STATS", - Button_Cycle_Form = "BUTTON_CYCLE_FORM", - Alt_Button_Cycle_Form = "ALT_BUTTON_CYCLE_FORM", - Button_Cycle_Shiny = "BUTTON_CYCLE_SHINY", - Alt_Button_Cycle_Shiny = "ALT_BUTTON_CYCLE_SHINY", - Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", - Alt_Button_Cycle_Gender = "ALT_BUTTON_CYCLE_GENDER", - Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", - Alt_Button_Cycle_Ability = "ALT_BUTTON_CYCLE_ABILITY", - Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", - Alt_Button_Cycle_Nature = "ALT_BUTTON_CYCLE_NATURE", - Button_Cycle_Variant = "BUTTON_CYCLE_VARIANT", - Alt_Button_Cycle_Variant = "ALT_BUTTON_CYCLE_VARIANT", - Button_Speed_Up = "BUTTON_SPEED_UP", - Alt_Button_Speed_Up = "ALT_BUTTON_SPEED_UP", - Button_Slow_Down = "BUTTON_SLOW_DOWN", - Alt_Button_Slow_Down = "ALT_BUTTON_SLOW_DOWN", - Button_Submit = "BUTTON_SUBMIT", - Alt_Button_Submit = "ALT_BUTTON_SUBMIT", + // Default_Layout = "DEFAULT_LAYOUT", + Button_Up = "BUTTON_UP", + Alt_Button_Up = "ALT_BUTTON_UP", + Button_Down = "BUTTON_DOWN", + Alt_Button_Down = "ALT_BUTTON_DOWN", + Button_Left = "BUTTON_LEFT", + Alt_Button_Left = "ALT_BUTTON_LEFT", + Button_Right = "BUTTON_RIGHT", + Alt_Button_Right = "ALT_BUTTON_RIGHT", + Button_Action = "BUTTON_ACTION", + Alt_Button_Action = "ALT_BUTTON_ACTION", + Button_Cancel = "BUTTON_CANCEL", + Alt_Button_Cancel = "ALT_BUTTON_CANCEL", + Button_Menu = "BUTTON_MENU", + Alt_Button_Menu = "ALT_BUTTON_MENU", + Button_Stats = "BUTTON_STATS", + Alt_Button_Stats = "ALT_BUTTON_STATS", + Button_Cycle_Form = "BUTTON_CYCLE_FORM", + Alt_Button_Cycle_Form = "ALT_BUTTON_CYCLE_FORM", + Button_Cycle_Shiny = "BUTTON_CYCLE_SHINY", + Alt_Button_Cycle_Shiny = "ALT_BUTTON_CYCLE_SHINY", + Button_Cycle_Gender = "BUTTON_CYCLE_GENDER", + Alt_Button_Cycle_Gender = "ALT_BUTTON_CYCLE_GENDER", + Button_Cycle_Ability = "BUTTON_CYCLE_ABILITY", + Alt_Button_Cycle_Ability = "ALT_BUTTON_CYCLE_ABILITY", + Button_Cycle_Nature = "BUTTON_CYCLE_NATURE", + Alt_Button_Cycle_Nature = "ALT_BUTTON_CYCLE_NATURE", + Button_Cycle_Tera = "BUTTON_CYCLE_TERA", + Alt_Button_Cycle_Tera = "ALT_BUTTON_CYCLE_TERA", + Button_Speed_Up = "BUTTON_SPEED_UP", + Alt_Button_Speed_Up = "ALT_BUTTON_SPEED_UP", + Button_Slow_Down = "BUTTON_SLOW_DOWN", + Alt_Button_Slow_Down = "ALT_BUTTON_SLOW_DOWN", + Button_Submit = "BUTTON_SUBMIT", + Alt_Button_Submit = "ALT_BUTTON_SUBMIT", } const pressAction = i18next.t("settings:pressToBind"); export const settingKeyboardOptions = { // [SettingKeyboard.Default_Layout]: ['Default'], - [SettingKeyboard.Button_Up]: [ `KEY ${Button.UP.toString()}`, pressAction ], - [SettingKeyboard.Button_Down]: [ `KEY ${Button.DOWN.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Up]: [ `KEY ${Button.UP.toString()}`, pressAction ], - [SettingKeyboard.Button_Left]: [ `KEY ${Button.LEFT.toString()}`, pressAction ], - [SettingKeyboard.Button_Right]: [ `KEY ${Button.RIGHT.toString()}`, pressAction ], - [SettingKeyboard.Button_Action]: [ `KEY ${Button.ACTION.toString()}`, pressAction ], - [SettingKeyboard.Button_Menu]: [ `KEY ${Button.MENU.toString()}`, pressAction ], - [SettingKeyboard.Button_Submit]: [ `KEY ${Button.SUBMIT.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Down]: [ `KEY ${Button.DOWN.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Left]: [ `KEY ${Button.LEFT.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Right]: [ `KEY ${Button.RIGHT.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Action]: [ `KEY ${Button.ACTION.toString()}`, pressAction ], - [SettingKeyboard.Button_Cancel]: [ `KEY ${Button.CANCEL.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cancel]: [ `KEY ${Button.CANCEL.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Menu]: [ `KEY ${Button.MENU.toString()}`, pressAction ], - [SettingKeyboard.Button_Stats]: [ `KEY ${Button.STATS.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Stats]: [ `KEY ${Button.STATS.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Form]: [ `KEY ${Button.CYCLE_FORM.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Form]: [ `KEY ${Button.CYCLE_FORM.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Shiny]: [ `KEY ${Button.CYCLE_SHINY.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Shiny]: [ `KEY ${Button.CYCLE_SHINY.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Gender]: [ `KEY ${Button.CYCLE_GENDER.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Gender]: [ `KEY ${Button.CYCLE_GENDER.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Ability]: [ `KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Nature]: [ `KEY ${Button.CYCLE_NATURE.toString()}`, pressAction ], - [SettingKeyboard.Button_Cycle_Variant]: [ `KEY ${Button.V.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Cycle_Variant]: [ `KEY ${Button.V.toString()}`, pressAction ], - [SettingKeyboard.Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Speed_Up]: [ `KEY ${Button.SPEED_UP.toString()}`, pressAction ], - [SettingKeyboard.Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Slow_Down]: [ `KEY ${Button.SLOW_DOWN.toString()}`, pressAction ], - [SettingKeyboard.Alt_Button_Submit]: [ `KEY ${Button.SUBMIT.toString()}`, pressAction ], + [SettingKeyboard.Button_Up]: [`KEY ${Button.UP.toString()}`, pressAction], + [SettingKeyboard.Button_Down]: [`KEY ${Button.DOWN.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Up]: [`KEY ${Button.UP.toString()}`, pressAction], + [SettingKeyboard.Button_Left]: [`KEY ${Button.LEFT.toString()}`, pressAction], + [SettingKeyboard.Button_Right]: [`KEY ${Button.RIGHT.toString()}`, pressAction], + [SettingKeyboard.Button_Action]: [`KEY ${Button.ACTION.toString()}`, pressAction], + [SettingKeyboard.Button_Menu]: [`KEY ${Button.MENU.toString()}`, pressAction], + [SettingKeyboard.Button_Submit]: [`KEY ${Button.SUBMIT.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Down]: [`KEY ${Button.DOWN.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Left]: [`KEY ${Button.LEFT.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Right]: [`KEY ${Button.RIGHT.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Action]: [`KEY ${Button.ACTION.toString()}`, pressAction], + [SettingKeyboard.Button_Cancel]: [`KEY ${Button.CANCEL.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cancel]: [`KEY ${Button.CANCEL.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Menu]: [`KEY ${Button.MENU.toString()}`, pressAction], + [SettingKeyboard.Button_Stats]: [`KEY ${Button.STATS.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Stats]: [`KEY ${Button.STATS.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Form]: [`KEY ${Button.CYCLE_FORM.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Form]: [`KEY ${Button.CYCLE_FORM.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Shiny]: [`KEY ${Button.CYCLE_SHINY.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Shiny]: [`KEY ${Button.CYCLE_SHINY.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Gender]: [`KEY ${Button.CYCLE_GENDER.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Gender]: [`KEY ${Button.CYCLE_GENDER.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Ability]: [`KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Ability]: [`KEY ${Button.CYCLE_ABILITY.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Nature]: [`KEY ${Button.CYCLE_NATURE.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Nature]: [`KEY ${Button.CYCLE_NATURE.toString()}`, pressAction], + [SettingKeyboard.Button_Cycle_Tera]: [`KEY ${Button.CYCLE_TERA.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Cycle_Tera]: [`KEY ${Button.CYCLE_TERA.toString()}`, pressAction], + [SettingKeyboard.Button_Speed_Up]: [`KEY ${Button.SPEED_UP.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Speed_Up]: [`KEY ${Button.SPEED_UP.toString()}`, pressAction], + [SettingKeyboard.Button_Slow_Down]: [`KEY ${Button.SLOW_DOWN.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Slow_Down]: [`KEY ${Button.SLOW_DOWN.toString()}`, pressAction], + [SettingKeyboard.Alt_Button_Submit]: [`KEY ${Button.SUBMIT.toString()}`, pressAction], }; export const settingKeyboardDefaults = { @@ -112,8 +112,8 @@ export const settingKeyboardDefaults = { [SettingKeyboard.Alt_Button_Cycle_Ability]: 0, [SettingKeyboard.Button_Cycle_Nature]: 0, [SettingKeyboard.Alt_Button_Cycle_Nature]: 0, - [SettingKeyboard.Button_Cycle_Variant]: 0, - [SettingKeyboard.Alt_Button_Cycle_Variant]: 0, + [SettingKeyboard.Button_Cycle_Tera]: 0, + [SettingKeyboard.Alt_Button_Cycle_Tera]: 0, [SettingKeyboard.Button_Speed_Up]: 0, [SettingKeyboard.Alt_Button_Speed_Up]: 0, [SettingKeyboard.Button_Slow_Down]: 0, @@ -132,8 +132,7 @@ export const settingKeyboardBlackList = [ SettingKeyboard.Button_Right, ]; - -export function setSettingKeyboard(scene: BattleScene, setting: SettingKeyboard, value: integer): boolean { +export function setSettingKeyboard(setting: SettingKeyboard, value: number): boolean { switch (setting) { case SettingKeyboard.Button_Up: case SettingKeyboard.Button_Down: @@ -148,7 +147,7 @@ export function setSettingKeyboard(scene: BattleScene, setting: SettingKeyboard, case SettingKeyboard.Button_Cycle_Gender: case SettingKeyboard.Button_Cycle_Ability: case SettingKeyboard.Button_Cycle_Nature: - case SettingKeyboard.Button_Cycle_Variant: + case SettingKeyboard.Button_Cycle_Tera: case SettingKeyboard.Button_Speed_Up: case SettingKeyboard.Button_Slow_Down: case SettingKeyboard.Alt_Button_Up: @@ -164,46 +163,24 @@ export function setSettingKeyboard(scene: BattleScene, setting: SettingKeyboard, case SettingKeyboard.Alt_Button_Cycle_Gender: case SettingKeyboard.Alt_Button_Cycle_Ability: case SettingKeyboard.Alt_Button_Cycle_Nature: - case SettingKeyboard.Alt_Button_Cycle_Variant: + case SettingKeyboard.Alt_Button_Cycle_Tera: case SettingKeyboard.Alt_Button_Speed_Up: case SettingKeyboard.Alt_Button_Slow_Down: case SettingKeyboard.Alt_Button_Submit: if (value) { - if (scene.ui) { - const cancelHandler = (success: boolean = false) : boolean => { - scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsKeyboardUiHandler).updateBindings(); + if (globalScene.ui) { + const cancelHandler = (success = false): boolean => { + globalScene.ui.revertMode(); + (globalScene.ui.getHandler() as SettingsKeyboardUiHandler).updateBindings(); return success; }; - scene.ui.setOverlayMode(Mode.KEYBOARD_BINDING, { + globalScene.ui.setOverlayMode(Mode.KEYBOARD_BINDING, { target: setting, cancelHandler: cancelHandler, }); } } break; - // case SettingKeyboard.Default_Layout: - // if (value && scene.ui) { - // const cancelHandler = () => { - // scene.ui.revertMode(); - // (scene.ui.getHandler() as SettingsKeyboardUiHandler).setOptionCursor(Object.values(SettingKeyboard).indexOf(SettingKeyboard.Default_Layout), 0, true); - // (scene.ui.getHandler() as SettingsKeyboardUiHandler).updateBindings(); - // return false; - // }; - // const changeKeyboardHandler = (keyboardLayout: string) => { - // scene.inputController.setChosenKeyboardLayout(keyboardLayout); - // cancelHandler(); - // return true; - // }; - // scene.ui.setOverlayMode(Mode.OPTION_SELECT, { - // options: [{ - // label: 'Default', - // handler: changeKeyboardHandler, - // }] - // }); - // return false; - // } } return true; - } diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index be440d5d93e..1a7279d371c 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -1,30 +1,27 @@ 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 SettingsUiHandler from "#app/ui/settings/settings-ui-handler"; +import { globalScene } from "#app/global-scene"; +import { hasTouchscreen } from "#app/touch-controls"; +import { updateWindowType } from "#app/ui/ui-theme"; +import { CandyUpgradeNotificationChangedEvent } from "#app/events/battle-scene"; +import type SettingsUiHandler from "#app/ui/settings/settings-ui-handler"; import { EaseType } from "#enums/ease-type"; import { MoneyFormat } from "#enums/money-format"; import { PlayerGender } from "#enums/player-gender"; -import { getIsInitialized, initI18n } from "#app/plugins/i18n"; -import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; +import { ShopCursorTarget } from "#enums/shop-cursor-target"; +import { isLocal } from "#app/utils"; -function getTranslation(key: string): string { - if (!getIsInitialized()) { - initI18n(); - } - return i18next.t(key); -} - -const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => i ? { - value: (i * 10).toString(), - label: (i * 10).toString(), -} : { - value: "Mute", - label: getTranslation("settings:mute") -}); +const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => + i + ? { + value: (i * 10).toString(), + label: (i * 10).toString(), + } + : { + value: "Mute", + label: i18next.t("settings:mute"), + }, +); const SHOP_OVERLAY_OPACITY_OPTIONS: SettingOption[] = new Array(9).fill(null).map((_, i) => { const value = ((i + 1) * 10).toString(); @@ -37,41 +34,55 @@ const SHOP_OVERLAY_OPACITY_OPTIONS: SettingOption[] = new Array(9).fill(null).ma const OFF_ON: SettingOption[] = [ { value: "Off", - label: i18next.t("settings:off") + label: i18next.t("settings:off"), }, { value: "On", - label: i18next.t("settings:on") - } + label: i18next.t("settings:on"), + }, ]; + const AUTO_DISABLED: SettingOption[] = [ { value: "Auto", - label: i18next.t("settings:auto") + label: i18next.t("settings:auto"), }, { value: "Disabled", - label: i18next.t("settings:disabled") - } + label: i18next.t("settings:disabled"), + }, +]; + +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", - label: i18next.t("settings:rewards") + label: i18next.t("settings:rewards"), }, { value: "Shop", - label: i18next.t("settings:shop") + label: i18next.t("settings:shop"), }, { value: "Reroll", - label: i18next.t("settings:reroll") + label: i18next.t("settings:reroll"), }, { value: "Check Team", - label: i18next.t("settings:checkTeam") - } + label: i18next.t("settings:checkTeam"), + }, ]; const shopCursorTargetIndexMap = SHOP_CURSOR_TARGET_OPTIONS.map(option => { @@ -95,25 +106,27 @@ const shopCursorTargetIndexMap = SHOP_CURSOR_TARGET_OPTIONS.map(option => { export enum SettingType { GENERAL, DISPLAY, - AUDIO + AUDIO, } type SettingOption = { - value: string, - label: string + value: string; + label: string; + needConfirmation?: boolean; + confirmationMessage?: string; }; export interface Setting { - key: string - label: string - options: SettingOption[] - default: number - type: SettingType - requireReload?: boolean + key: string; + label: string; + options: SettingOption[]; + default: number; + type: SettingType; + requireReload?: boolean; /** Whether the setting can be activated or not */ - activatable?: boolean + activatable?: boolean; /** Determines whether the setting should be hidden from the UI */ - isHidden?: () => boolean + isHidden?: () => boolean; } /** @@ -141,6 +154,8 @@ export const SettingKeys = { Move_Animations: "MOVE_ANIMATIONS", Show_Stats_on_Level_Up: "SHOW_LEVEL_UP_STATS", Shop_Cursor_Target: "SHOP_CURSOR_TARGET", + Command_Cursor_Memory: "COMMAND_CURSOR_MEMORY", + Dex_For_Devs: "DEX_FOR_DEVS", Candy_Upgrade_Notification: "CANDY_UPGRADE_NOTIFICATION", Candy_Upgrade_Display: "CANDY_UPGRADE_DISPLAY", Move_Info: "MOVE_INFO", @@ -157,12 +172,17 @@ export const SettingKeys = { Field_Volume: "FIELD_VOLUME", SE_Volume: "SE_VOLUME", UI_Volume: "UI_SOUND_EFFECTS", - Music_Preference: "MUSIC_PREFERENCE", + Battle_Music: "BATTLE_MUSIC", Show_BGM_Bar: "SHOW_BGM_BAR", Move_Touch_Controls: "MOVE_TOUCH_CONTROLS", - Shop_Overlay_Opacity: "SHOP_OVERLAY_OPACITY" + Shop_Overlay_Opacity: "SHOP_OVERLAY_OPACITY", }; +export enum MusicPreference { + GENFIVE, + ALLGENS, +} + /** * All Settings not related to controls */ @@ -173,39 +193,39 @@ export const Setting: Array = [ options: [ { value: "1", - label: "1x" + label: "1x", }, { value: "1.25", - label: "1.25x" + label: "1.25x", }, { value: "1.5", - label: "1.5x" + label: "1.5x", }, { value: "2", - label: "2x" + label: "2x", }, { value: "2.5", - label: "2.5x" + label: "2.5x", }, { value: "3", - label: "3x" + label: "3x", }, { value: "4", - label: "4x" + label: "4x", }, { value: "5", - label: "5x" - } + label: "5x", + }, ], default: 3, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.HP_Bar_Speed, @@ -213,23 +233,23 @@ export const Setting: Array = [ options: [ { value: "Normal", - label: i18next.t("settings:normal") + label: i18next.t("settings:normal"), }, { value: "Fast", - label: i18next.t("settings:fast") + label: i18next.t("settings:fast"), }, { value: "Faster", - label: i18next.t("settings:faster") + label: i18next.t("settings:faster"), }, { value: "Skip", - label: i18next.t("settings:skip") - } + label: i18next.t("settings:skip"), + }, ], default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.EXP_Gains_Speed, @@ -237,23 +257,23 @@ export const Setting: Array = [ options: [ { value: "Normal", - label: i18next.t("settings:normal") + label: i18next.t("settings:normal"), }, { value: "Fast", - label: i18next.t("settings:fast") + label: i18next.t("settings:fast"), }, { value: "Faster", - label: i18next.t("settings:faster") + label: i18next.t("settings:faster"), }, { value: "Skip", - label: i18next.t("settings:skip") - } + label: i18next.t("settings:skip"), + }, ], default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.EXP_Party_Display, @@ -261,26 +281,26 @@ export const Setting: Array = [ options: [ { value: "Normal", - label: i18next.t("settings:normal") + label: i18next.t("settings:normal"), }, { value: "Level Up Notification", - label: i18next.t("settings:levelUpNotifications") + label: i18next.t("settings:levelUpNotifications"), }, { value: "Skip", - label: i18next.t("settings:skip") - } + label: i18next.t("settings:skip"), + }, ], default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Skip_Seen_Dialogues, label: i18next.t("settings:skipSeenDialogues"), options: OFF_ON, default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Egg_Skip, @@ -288,19 +308,19 @@ export const Setting: Array = [ options: [ { value: "Never", - label: i18next.t("settings:never") + label: i18next.t("settings:never"), }, { value: "Ask", - label: i18next.t("settings:ask") + label: i18next.t("settings:ask"), }, { value: "Always", - label: i18next.t("settings:always") - } + label: i18next.t("settings:always"), + }, ], default: 1, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Battle_Style, @@ -308,50 +328,72 @@ export const Setting: Array = [ options: [ { value: "Switch", - label: i18next.t("settings:switch") + label: i18next.t("settings:switch"), }, { value: "Set", - label: i18next.t("settings:set") - } + label: i18next.t("settings:set"), + }, ], default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, + }, + { + key: SettingKeys.Command_Cursor_Memory, + label: i18next.t("settings:commandCursorMemory"), + options: OFF_ON, + default: 0, + type: SettingType.GENERAL, }, { key: SettingKeys.Enable_Retries, label: i18next.t("settings:enableRetries"), options: OFF_ON, default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Hide_IVs, label: i18next.t("settings:hideIvs"), options: OFF_ON, default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Tutorials, label: i18next.t("settings:tutorials"), options: OFF_ON, default: 1, - type: SettingType.GENERAL - }, - { - key: SettingKeys.Touch_Controls, - label: i18next.t("settings:touchControls"), - options: AUTO_DISABLED, - default: 0, - type: SettingType.GENERAL + type: SettingType.GENERAL, }, { key: SettingKeys.Vibration, label: i18next.t("settings:vibrations"), options: AUTO_DISABLED, default: 0, - type: SettingType.GENERAL + 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, @@ -359,16 +401,16 @@ export const Setting: Array = [ options: [ { value: "English", - label: "English" + label: "English", }, { value: "Change", - label: i18next.t("settings:change") - } + label: i18next.t("settings:change"), + }, ], default: 0, type: SettingType.DISPLAY, - requireReload: true + requireReload: true, }, { key: SettingKeys.UI_Theme, @@ -376,16 +418,16 @@ export const Setting: Array = [ options: [ { value: "Default", - label: i18next.t("settings:default") + label: i18next.t("settings:default"), }, { value: "Legacy", - label: i18next.t("settings:legacy") - } + label: i18next.t("settings:legacy"), + }, ], default: 0, type: SettingType.DISPLAY, - requireReload: true + requireReload: true, }, { key: SettingKeys.Window_Type, @@ -394,11 +436,11 @@ export const Setting: Array = [ const windowType = (i + 1).toString(); return { value: windowType, - label: windowType + label: windowType, }; }), default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Money_Format, @@ -406,15 +448,15 @@ export const Setting: Array = [ options: [ { value: "Normal", - label: i18next.t("settings:normal") + label: i18next.t("settings:normal"), }, { value: "Abbreviated", - label: i18next.t("settings:abbreviated") - } + label: i18next.t("settings:abbreviated"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Damage_Numbers, @@ -422,33 +464,33 @@ export const Setting: Array = [ options: [ { value: "Off", - label: i18next.t("settings:off") + label: i18next.t("settings:off"), }, { value: "Simple", - label: i18next.t("settings:simple") + label: i18next.t("settings:simple"), }, { value: "Fancy", - label: i18next.t("settings:fancy") - } + label: i18next.t("settings:fancy"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Move_Animations, label: i18next.t("settings:moveAnimations"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_Stats_on_Level_Up, label: i18next.t("settings:showStatsOnLevelUp"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Candy_Upgrade_Notification, @@ -456,19 +498,19 @@ export const Setting: Array = [ options: [ { value: "Off", - label: i18next.t("settings:off") + label: i18next.t("settings:off"), }, { value: "Passives Only", - label: i18next.t("settings:passivesOnly") + label: i18next.t("settings:passivesOnly"), }, { value: "On", - label: i18next.t("settings:on") - } + label: i18next.t("settings:on"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Candy_Upgrade_Display, @@ -476,37 +518,37 @@ export const Setting: Array = [ options: [ { value: "Icon", - label: i18next.t("settings:icon") + label: i18next.t("settings:icon"), }, { value: "Animation", - label: i18next.t("settings:animation") - } + label: i18next.t("settings:animation"), + }, ], default: 0, type: SettingType.DISPLAY, - requireReload: true + requireReload: true, }, { key: SettingKeys.Move_Info, label: i18next.t("settings:moveInfo"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_Moveset_Flyout, label: i18next.t("settings:showMovesetFlyout"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_Arena_Flyout, label: i18next.t("settings:showArenaFlyout"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_Time_Of_Day_Widget, @@ -522,15 +564,15 @@ export const Setting: Array = [ options: [ { value: "Bounce", - label: i18next.t("settings:bounce") + label: i18next.t("settings:bounce"), }, { value: "Back", - label: i18next.t("settings:timeOfDay_back") - } + label: i18next.t("settings:timeOfDay_back"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Sprite_Set, @@ -538,23 +580,23 @@ export const Setting: Array = [ options: [ { value: "Consistent", - label: i18next.t("settings:consistent") + label: i18next.t("settings:consistent"), }, { - value: "Mixed Animated", - label: i18next.t("settings:mixedAnimated") - } + value: "Experimental", + label: i18next.t("settings:experimental"), + }, ], default: 0, type: SettingType.DISPLAY, - requireReload: true + requireReload: true, }, { key: SettingKeys.Fusion_Palette_Swaps, label: i18next.t("settings:fusionPaletteSwaps"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Player_Gender, @@ -562,102 +604,88 @@ export const Setting: Array = [ options: [ { value: "Boy", - label: i18next.t("settings:boy") + label: i18next.t("settings:boy"), }, { value: "Girl", - label: i18next.t("settings:girl") - } + label: i18next.t("settings:girl"), + }, ], default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Type_Hints, label: i18next.t("settings:typeHints"), options: OFF_ON, default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Show_BGM_Bar, label: i18next.t("settings:showBgmBar"), options: OFF_ON, default: 1, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Master_Volume, label: i18next.t("settings:masterVolume"), options: VOLUME_OPTIONS, default: 5, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { key: SettingKeys.BGM_Volume, label: i18next.t("settings:bgmVolume"), options: VOLUME_OPTIONS, default: 10, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { key: SettingKeys.Field_Volume, label: i18next.t("settings:fieldVolume"), options: VOLUME_OPTIONS, default: 10, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { key: SettingKeys.SE_Volume, label: i18next.t("settings:seVolume"), options: VOLUME_OPTIONS, default: 10, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { key: SettingKeys.UI_Volume, label: i18next.t("settings:uiVolume"), options: VOLUME_OPTIONS, default: 10, - type: SettingType.AUDIO + type: SettingType.AUDIO, }, { - key: SettingKeys.Music_Preference, - label: i18next.t("settings:musicPreference"), + key: SettingKeys.Battle_Music, + label: i18next.t("settings:battleMusic"), options: [ { - value: "Consistent", - label: i18next.t("settings:consistent") + value: "Gen V", + label: i18next.t("settings:musicGenFive"), }, { - value: "Mixed", - label: i18next.t("settings:mixed") - } + value: "All Gens", + label: i18next.t("settings:musicAllGens"), + }, ], - default: 0, + default: MusicPreference.ALLGENS, 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() + requireReload: true, }, { key: SettingKeys.Shop_Cursor_Target, label: i18next.t("settings:shopCursorTarget"), options: SHOP_CURSOR_TARGET_OPTIONS, default: 0, - type: SettingType.DISPLAY + type: SettingType.DISPLAY, }, { key: SettingKeys.Shop_Overlay_Opacity, @@ -665,10 +693,20 @@ export const Setting: Array = [ options: SHOP_OVERLAY_OPACITY_OPTIONS, default: 7, type: SettingType.DISPLAY, - requireReload: false - } + requireReload: false, + }, ]; +if (isLocal) { + Setting.push({ + key: SettingKeys.Dex_For_Devs, + label: i18next.t("settings:dexForDevs"), + options: OFF_ON, + default: 0, + type: SettingType.GENERAL, + }); +} + /** * Return the index of a Setting * @param key SettingKey @@ -680,171 +718,180 @@ export function settingIndex(key: string) { /** * Resets all settings to their defaults - * @param scene current BattleScene */ -export function resetSettings(scene: BattleScene) { - Setting.forEach(s => setSetting(scene, s.key, s.default)); +export function resetSettings() { + for (const s of Setting) { + setSetting(s.key, s.default); + } } /** - * Updates a setting for current BattleScene - * @param scene current BattleScene + * Updates a setting * @param setting string ideally from SettingKeys * @param value value to update setting with * @returns true if successful, false if not */ -export function setSetting(scene: BattleScene, setting: string, value: integer): boolean { +export function setSetting(setting: string, value: number): boolean { const index: number = settingIndex(setting); if (index === -1) { return false; } switch (Setting[index].key) { case SettingKeys.Game_Speed: - scene.gameSpeed = parseFloat(Setting[index].options[value].value.replace("x", "")); + globalScene.gameSpeed = Number.parseFloat(Setting[index].options[value].value.replace("x", "")); break; case SettingKeys.Master_Volume: - scene.masterVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; - scene.updateSoundVolume(); + globalScene.masterVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.updateSoundVolume(); break; case SettingKeys.BGM_Volume: - scene.bgmVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; - scene.updateSoundVolume(); + globalScene.bgmVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.updateSoundVolume(); break; case SettingKeys.Field_Volume: - scene.fieldVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; - scene.updateSoundVolume(); + globalScene.fieldVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.updateSoundVolume(); break; case SettingKeys.SE_Volume: - scene.seVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; - scene.updateSoundVolume(); + globalScene.seVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.updateSoundVolume(); break; case SettingKeys.UI_Volume: - scene.uiVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + globalScene.uiVolume = value ? Number.parseInt(Setting[index].options[value].value) * 0.01 : 0; break; - case SettingKeys.Music_Preference: - scene.musicPreference = value; + case SettingKeys.Battle_Music: + globalScene.musicPreference = value; break; case SettingKeys.Damage_Numbers: - scene.damageNumbersMode = value; + globalScene.damageNumbersMode = value; break; case SettingKeys.UI_Theme: - scene.uiTheme = value; + globalScene.uiTheme = value; break; case SettingKeys.Window_Type: - updateWindowType(scene, parseInt(Setting[index].options[value].value)); + updateWindowType(Number.parseInt(Setting[index].options[value].value)); break; case SettingKeys.Tutorials: - scene.enableTutorials = Setting[index].options[value].value === "On"; + globalScene.enableTutorials = Setting[index].options[value].value === "On"; break; case SettingKeys.Move_Info: - scene.enableMoveInfo = Setting[index].options[value].value === "On"; + globalScene.enableMoveInfo = Setting[index].options[value].value === "On"; break; case SettingKeys.Enable_Retries: - scene.enableRetries = Setting[index].options[value].value === "On"; + globalScene.enableRetries = Setting[index].options[value].value === "On"; break; case SettingKeys.Hide_IVs: - scene.hideIvs = Setting[index].options[value].value === "On"; + globalScene.hideIvs = Setting[index].options[value].value === "On"; break; case SettingKeys.Skip_Seen_Dialogues: - scene.skipSeenDialogues = Setting[index].options[value].value === "On"; + globalScene.skipSeenDialogues = Setting[index].options[value].value === "On"; break; case SettingKeys.Egg_Skip: - scene.eggSkipPreference = value; + globalScene.eggSkipPreference = value; break; case SettingKeys.Battle_Style: - scene.battleStyle = value; + globalScene.battleStyle = value; break; case SettingKeys.Show_BGM_Bar: - scene.showBgmBar = Setting[index].options[value].value === "On"; + globalScene.showBgmBar = Setting[index].options[value].value === "On"; break; case SettingKeys.Candy_Upgrade_Notification: - if (scene.candyUpgradeNotification === value) { + if (globalScene.candyUpgradeNotification === value) { break; } - scene.candyUpgradeNotification = value; - scene.eventTarget.dispatchEvent(new CandyUpgradeNotificationChangedEvent(value)); + globalScene.candyUpgradeNotification = value; + globalScene.eventTarget.dispatchEvent(new CandyUpgradeNotificationChangedEvent(value)); break; case SettingKeys.Candy_Upgrade_Display: - scene.candyUpgradeDisplay = value; + globalScene.candyUpgradeDisplay = value; case SettingKeys.Money_Format: switch (Setting[index].options[value].value) { case "Normal": - scene.moneyFormat = MoneyFormat.NORMAL; + globalScene.moneyFormat = MoneyFormat.NORMAL; break; case "Abbreviated": - scene.moneyFormat = MoneyFormat.ABBREVIATED; + globalScene.moneyFormat = MoneyFormat.ABBREVIATED; break; } - scene.updateMoneyText(false); + globalScene.updateMoneyText(false); break; case SettingKeys.Sprite_Set: - scene.experimentalSprites = !!value; + globalScene.experimentalSprites = !!value; if (value) { - scene.initExpSprites(); + globalScene.initExpSprites(); } break; case SettingKeys.Move_Animations: - scene.moveAnimations = Setting[index].options[value].value === "On"; + globalScene.moveAnimations = Setting[index].options[value].value === "On"; break; case SettingKeys.Show_Moveset_Flyout: - scene.showMovesetFlyout = Setting[index].options[value].value === "On"; + globalScene.showMovesetFlyout = Setting[index].options[value].value === "On"; break; case SettingKeys.Show_Arena_Flyout: - scene.showArenaFlyout = Setting[index].options[value].value === "On"; + globalScene.showArenaFlyout = Setting[index].options[value].value === "On"; break; case SettingKeys.Show_Time_Of_Day_Widget: - scene.showTimeOfDayWidget = Setting[index].options[value].value === "On"; + globalScene.showTimeOfDayWidget = Setting[index].options[value].value === "On"; break; case SettingKeys.Time_Of_Day_Animation: - scene.timeOfDayAnimation = Setting[index].options[value].value === "Bounce" ? EaseType.BOUNCE : EaseType.BACK; + globalScene.timeOfDayAnimation = + Setting[index].options[value].value === "Bounce" ? EaseType.BOUNCE : EaseType.BACK; break; case SettingKeys.Show_Stats_on_Level_Up: - scene.showLevelUpStats = Setting[index].options[value].value === "On"; + globalScene.showLevelUpStats = Setting[index].options[value].value === "On"; break; - case SettingKeys.Shop_Cursor_Target: + case SettingKeys.Shop_Cursor_Target: { const selectedValue = shopCursorTargetIndexMap[value]; - scene.shopCursorTarget = selectedValue; + globalScene.shopCursorTarget = selectedValue; + break; + } + case SettingKeys.Command_Cursor_Memory: + globalScene.commandCursorMemory = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Dex_For_Devs: + globalScene.dexForDevs = Setting[index].options[value].value === "On"; break; case SettingKeys.EXP_Gains_Speed: - scene.expGainsSpeed = value; + globalScene.expGainsSpeed = value; break; case SettingKeys.EXP_Party_Display: - scene.expParty = value; + globalScene.expParty = value; break; case SettingKeys.HP_Bar_Speed: - scene.hpBarSpeed = value; + globalScene.hpBarSpeed = value; break; case SettingKeys.Fusion_Palette_Swaps: - scene.fusionPaletteSwaps = !!value; + globalScene.fusionPaletteSwaps = !!value; break; case SettingKeys.Player_Gender: - if (scene.gameData) { + if (globalScene.gameData) { const female = Setting[index].options[value].value === "Girl"; - scene.gameData.gender = female ? PlayerGender.FEMALE : PlayerGender.MALE; - scene.trainer.setTexture(scene.trainer.texture.key.replace(female ? "m" : "f", female ? "f" : "m")); + globalScene.gameData.gender = female ? PlayerGender.FEMALE : PlayerGender.MALE; + globalScene.trainer.setTexture(globalScene.trainer.texture.key.replace(female ? "m" : "f", female ? "f" : "m")); } else { return false; } break; - case SettingKeys.Touch_Controls: - scene.enableTouchControls = Setting[index].options[value].value !== "Disabled" && hasTouchscreen(); + case SettingKeys.Touch_Controls: { + globalScene.enableTouchControls = Setting[index].options[value].value !== "Disabled" && hasTouchscreen(); const touchControls = document.getElementById("touchControls"); if (touchControls) { - touchControls.classList.toggle("visible", scene.enableTouchControls); + touchControls.classList.toggle("visible", globalScene.enableTouchControls); } break; + } case SettingKeys.Vibration: - scene.enableVibration = Setting[index].options[value].value !== "Disabled" && hasTouchscreen(); + globalScene.enableVibration = Setting[index].options[value].value !== "Disabled" && hasTouchscreen(); break; case SettingKeys.Type_Hints: - scene.typeHints = Setting[index].options[value].value === "On"; + globalScene.typeHints = Setting[index].options[value].value === "On"; break; case SettingKeys.Language: if (value) { - if (scene.ui) { + if (globalScene.ui) { const cancelHandler = () => { - scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(0, 0, true); + globalScene.ui.revertMode(); + (globalScene.ui.getHandler() as SettingsUiHandler).setOptionCursor(-1, 0, true); }; const changeLocaleHandler = (locale: string): boolean => { try { @@ -859,47 +906,47 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): return false; } }; - scene.ui.setOverlayMode(Mode.OPTION_SELECT, { + globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: [ { label: "English", - handler: () => changeLocaleHandler("en") + handler: () => changeLocaleHandler("en"), }, { - label: "Español", - handler: () => changeLocaleHandler("es") + label: "Español (ES)", + handler: () => changeLocaleHandler("es-ES"), }, { label: "Italiano", - handler: () => changeLocaleHandler("it") + handler: () => changeLocaleHandler("it"), }, { label: "Français", - handler: () => changeLocaleHandler("fr") + handler: () => changeLocaleHandler("fr"), }, { label: "Deutsch", - handler: () => changeLocaleHandler("de") + handler: () => changeLocaleHandler("de"), }, { label: "Português (BR)", - handler: () => changeLocaleHandler("pt-BR") + handler: () => changeLocaleHandler("pt-BR"), }, { label: "简体中文", - handler: () => changeLocaleHandler("zh-CN") + handler: () => changeLocaleHandler("zh-CN"), }, { label: "繁體中文", - handler: () => changeLocaleHandler("zh-TW") + handler: () => changeLocaleHandler("zh-TW"), }, { label: "한국어", - handler: () => changeLocaleHandler("ko") + handler: () => changeLocaleHandler("ko"), }, { label: "日本語", - handler: () => changeLocaleHandler("ja") + handler: () => changeLocaleHandler("ja"), }, // { // label: "Català", @@ -907,17 +954,17 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): // }, { label: i18next.t("settings:back"), - handler: () => cancelHandler() - } + handler: () => cancelHandler(), + }, ], - maxOptions: 7 + maxOptions: 7, }); return false; } } break; case SettingKeys.Shop_Overlay_Opacity: - scene.updateShopOverlayOpacity(parseInt(Setting[index].options[value].value) * .01); + globalScene.updateShopOverlayOpacity(Number.parseInt(Setting[index].options[value].value) * 0.01); break; } diff --git a/src/system/trainer-data.ts b/src/system/trainer-data.ts index fc8a14488cc..48ab8d8d42a 100644 --- a/src/system/trainer-data.ts +++ b/src/system/trainer-data.ts @@ -1,24 +1,27 @@ -import BattleScene from "../battle-scene"; -import { TrainerType } from "#enums/trainer-type"; +import type { TrainerType } from "#enums/trainer-type"; import Trainer, { TrainerVariant } from "../field/trainer"; export default class TrainerData { public trainerType: TrainerType; public variant: TrainerVariant; - public partyTemplateIndex: integer; + public partyTemplateIndex: number; public name: string; public partnerName: string; constructor(source: Trainer | any) { - const sourceTrainer = source instanceof Trainer ? source as Trainer : null; + const sourceTrainer = source instanceof Trainer ? (source as Trainer) : null; this.trainerType = sourceTrainer ? sourceTrainer.config.trainerType : source.trainerType; - this.variant = source.hasOwnProperty("variant") ? source.variant : source.female ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; + this.variant = source.hasOwnProperty("variant") + ? source.variant + : source.female + ? TrainerVariant.FEMALE + : TrainerVariant.DEFAULT; this.partyTemplateIndex = source.partyMemberTemplateIndex; this.name = source.name; this.partnerName = source.partnerName; } - toTrainer(scene: BattleScene): Trainer { - return new Trainer(scene, this.trainerType, this.variant, this.partyTemplateIndex, this.name, this.partnerName); + toTrainer(): Trainer { + return new Trainer(this.trainerType, this.variant, this.partyTemplateIndex, this.name, this.partnerName); } } diff --git a/src/system/unlockables.ts b/src/system/unlockables.ts index 0a666e2c755..2c396aad1f9 100644 --- a/src/system/unlockables.ts +++ b/src/system/unlockables.ts @@ -5,7 +5,7 @@ export enum Unlockables { ENDLESS_MODE, MINI_BLACK_HOLE, SPLICED_ENDLESS_MODE, - EVIOLITE + EVIOLITE, } export function getUnlockableName(unlockable: Unlockables) { diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index e96afb5cbd4..3c5abc2cc18 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -1,4 +1,4 @@ -import { SessionSaveData, SystemSaveData } from "../game-data"; +import type { SessionSaveData, SystemSaveData } from "../game-data"; import { version } from "../../../package.json"; // --- v1.0.4 (and below) PATCHES --- // @@ -7,7 +7,10 @@ import * as v1_0_4 from "./versions/v1_0_4"; // --- v1.1.0 PATCHES --- // import * as v1_1_0 from "./versions/v1_1_0"; -const LATEST_VERSION = version.split(".").map(value => parseInt(value)); +// --- v1.7.0 PATCHES --- // +import * as v1_7_0 from "./versions/v1_7_0"; + +const LATEST_VERSION = version.split(".").map(value => Number.parseInt(value)); /** * Converts incoming {@linkcode SystemSaveData} that has a version below the @@ -20,7 +23,7 @@ const LATEST_VERSION = version.split(".").map(value => parseInt(value)); * @see {@link SystemVersionConverter} */ export function applySystemVersionMigration(data: SystemSaveData) { - const curVersion = data.gameVersion.split(".").map(value => parseInt(value)); + const curVersion = data.gameVersion.split(".").map(value => Number.parseInt(value)); if (!curVersion.every((value, index) => value === LATEST_VERSION[index])) { const converter = new SystemVersionConverter(); @@ -40,7 +43,7 @@ export function applySystemVersionMigration(data: SystemSaveData) { * @see {@link SessionVersionConverter} */ export function applySessionVersionMigration(data: SessionSaveData) { - const curVersion = data.gameVersion.split(".").map(value => parseInt(value)); + const curVersion = data.gameVersion.split(".").map(value => Number.parseInt(value)); if (!curVersion.every((value, index) => value === LATEST_VERSION[index])) { const converter = new SessionVersionConverter(); @@ -61,7 +64,7 @@ export function applySessionVersionMigration(data: SessionSaveData) { */ export function applySettingsVersionMigration(data: Object) { const gameVersion: string = data.hasOwnProperty("gameVersion") ? data["gameVersion"] : "1.0.0"; - const curVersion = gameVersion.split(".").map(value => parseInt(value)); + const curVersion = gameVersion.split(".").map(value => Number.parseInt(value)); if (!curVersion.every((value, index) => value === LATEST_VERSION[index])) { const converter = new SettingsVersionConverter(); @@ -98,8 +101,7 @@ abstract class VersionConverter { * body. * @param data The data to be operated on */ - applyStaticPreprocessors(_data: any): void { - } + applyStaticPreprocessors(_data: any): void {} /** * Uses the current version the incoming data to determine the starting point @@ -125,11 +127,11 @@ class SessionVersionConverter extends VersionConverter { } override applyMigration(data: SessionSaveData, curVersion: number[]): void { - const [ curMajor, curMinor, curPatch ] = curVersion; + const [curMajor, curMinor, curPatch] = curVersion; if (curMajor === 1) { if (curMinor === 0) { - if (curPatch <= 4) { + if (curPatch <= 5) { console.log("Applying v1.0.4 session data migration!"); this.callMigrators(data, v1_0_4.sessionMigrators); } @@ -138,6 +140,10 @@ class SessionVersionConverter extends VersionConverter { console.log("Applying v1.1.0 session data migration!"); this.callMigrators(data, v1_1_0.sessionMigrators); } + if (curMinor < 7) { + console.log("Applying v1.7.0 session data migration!"); + this.callMigrators(data, v1_7_0.sessionMigrators); + } } console.log(`Session data successfully migrated to v${version}!`); @@ -151,7 +157,7 @@ class SessionVersionConverter extends VersionConverter { */ class SystemVersionConverter extends VersionConverter { override applyMigration(data: SystemSaveData, curVersion: number[]): void { - const [ curMajor, curMinor, curPatch ] = curVersion; + const [curMajor, curMinor, curPatch] = curVersion; if (curMajor === 1) { if (curMinor === 0) { @@ -164,6 +170,10 @@ class SystemVersionConverter extends VersionConverter { console.log("Applying v1.1.0 system data migraton!"); this.callMigrators(data, v1_1_0.systemMigrators); } + if (curMinor < 7) { + console.log("Applying v1.7.0 system data migration!"); + this.callMigrators(data, v1_7_0.systemMigrators); + } } console.log(`System data successfully migrated to v${version}!`); @@ -177,7 +187,7 @@ class SystemVersionConverter extends VersionConverter { */ class SettingsVersionConverter extends VersionConverter { override applyMigration(data: Object, curVersion: number[]): void { - const [ curMajor, curMinor, curPatch ] = curVersion; + const [curMajor, curMinor, curPatch] = curVersion; if (curMajor === 1) { if (curMinor === 0) { @@ -190,8 +200,12 @@ class SettingsVersionConverter extends VersionConverter { console.log("Applying v1.1.0 settings data migraton!"); this.callMigrators(data, v1_1_0.settingsMigrators); } + if (curMinor < 7) { + console.log("Applying v1.7.0 settings data migration!"); + this.callMigrators(data, v1_7_0.settingsMigrators); + } } - console.log(`System data successfully migrated to v${version}!`); + console.log(`Settings data successfully migrated to v${version}!`); } } diff --git a/src/system/version_migration/versions/v1_0_4.ts b/src/system/version_migration/versions/v1_0_4.ts index f16b6bcb6bb..16bd9db9915 100644 --- a/src/system/version_migration/versions/v1_0_4.ts +++ b/src/system/version_migration/versions/v1_0_4.ts @@ -1,6 +1,9 @@ -import { SettingKeys } from "../../settings/settings"; -import { AbilityAttr, defaultStarterSpecies, DexAttr, SystemSaveData, SessionSaveData } from "../../game-data"; -import { allSpecies } from "../../../data/pokemon-species"; +import { SettingKeys } from "#app/system/settings/settings"; +import type { SystemSaveData, SessionSaveData } from "#app/system/game-data"; +import { AbilityAttr, defaultStarterSpecies, DexAttr } from "#app/system/game-data"; +import { allSpecies } from "#app/data/pokemon-species"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; +import { isNullOrUndefined } from "#app/utils"; export const systemMigrators = [ /** @@ -9,8 +12,9 @@ export const systemMigrators = [ */ function migrateAbilityData(data: SystemSaveData) { if (data.starterData && data.dexData) { + // biome-ignore lint/complexity/noForEach: Object.keys(data.starterData).forEach(sd => { - if (data.dexData[sd]?.caughtAttr && (data.starterData[sd] && !data.starterData[sd].abilityAttr)) { + if (data.dexData[sd]?.caughtAttr && data.starterData[sd] && !data.starterData[sd].abilityAttr) { data.starterData[sd].abilityAttr = 1; } }); @@ -22,22 +26,44 @@ export const systemMigrators = [ * @param data {@linkcode SystemSaveData} */ function fixLegendaryStats(data: SystemSaveData) { - if (data.gameStats && (data.gameStats.legendaryPokemonCaught !== undefined && data.gameStats.subLegendaryPokemonCaught === undefined)) { + if ( + data.gameStats && + data.gameStats.legendaryPokemonCaught !== undefined && + data.gameStats.subLegendaryPokemonCaught === undefined + ) { data.gameStats.subLegendaryPokemonSeen = 0; data.gameStats.subLegendaryPokemonCaught = 0; data.gameStats.subLegendaryPokemonHatched = 0; - allSpecies.filter(s => s.subLegendary).forEach(s => { - const dexEntry = data.dexData[s.speciesId]; - data.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount; - data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0); - data.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount; - data.gameStats.legendaryPokemonCaught = Math.max(data.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, 0); - data.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount; - data.gameStats.legendaryPokemonHatched = Math.max(data.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, 0); - }); - data.gameStats.subLegendaryPokemonSeen = Math.max(data.gameStats.subLegendaryPokemonSeen, data.gameStats.subLegendaryPokemonCaught); - data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen, data.gameStats.legendaryPokemonCaught); - data.gameStats.mythicalPokemonSeen = Math.max(data.gameStats.mythicalPokemonSeen, data.gameStats.mythicalPokemonCaught); + // biome-ignore lint/complexity/noForEach: + allSpecies + .filter(s => s.subLegendary) + .forEach(s => { + const dexEntry = data.dexData[s.speciesId]; + data.gameStats.subLegendaryPokemonSeen += dexEntry.seenCount; + data.gameStats.legendaryPokemonSeen = Math.max(data.gameStats.legendaryPokemonSeen - dexEntry.seenCount, 0); + data.gameStats.subLegendaryPokemonCaught += dexEntry.caughtCount; + data.gameStats.legendaryPokemonCaught = Math.max( + data.gameStats.legendaryPokemonCaught - dexEntry.caughtCount, + 0, + ); + data.gameStats.subLegendaryPokemonHatched += dexEntry.hatchedCount; + data.gameStats.legendaryPokemonHatched = Math.max( + data.gameStats.legendaryPokemonHatched - dexEntry.hatchedCount, + 0, + ); + }); + data.gameStats.subLegendaryPokemonSeen = Math.max( + data.gameStats.subLegendaryPokemonSeen, + data.gameStats.subLegendaryPokemonCaught, + ); + data.gameStats.legendaryPokemonSeen = Math.max( + data.gameStats.legendaryPokemonSeen, + data.gameStats.legendaryPokemonCaught, + ); + data.gameStats.mythicalPokemonSeen = Math.max( + data.gameStats.mythicalPokemonSeen, + data.gameStats.mythicalPokemonCaught, + ); } }, @@ -46,15 +72,17 @@ export const systemMigrators = [ * @param data {@linkcode SystemSaveData} */ function fixStarterData(data: SystemSaveData) { - for (const starterId of defaultStarterSpecies) { - if (data.starterData[starterId]?.abilityAttr) { - data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; - } - if (data.dexData[starterId]?.caughtAttr) { - data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; + if (!isNullOrUndefined(data.starterData)) { + for (const starterId of defaultStarterSpecies) { + if (data.starterData[starterId]?.abilityAttr) { + data.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; + } + if (data.dexData[starterId]?.caughtAttr) { + data.dexData[starterId].caughtAttr |= DexAttr.FEMALE; + } } } - } + }, ] as const; export const settingsMigrators = [ @@ -63,13 +91,16 @@ export const settingsMigrators = [ * SettingKeys.Shop_Cursor_Target}. * @param data the `settings` object */ + + // biome-ignore lint/complexity/noBannedTypes: TODO: fix the type to not be object... function fixRerollTarget(data: Object) { if (data.hasOwnProperty("REROLL_TARGET") && !data.hasOwnProperty(SettingKeys.Shop_Cursor_Target)) { data[SettingKeys.Shop_Cursor_Target] = data["REROLL_TARGET"]; + // biome-ignore lint/performance/noDelete: intentional delete data["REROLL_TARGET"]; localStorage.setItem("settings", JSON.stringify(data)); } - } + }, ] as const; export const sessionMigrators = [ @@ -80,7 +111,7 @@ export const sessionMigrators = [ * @param data {@linkcode SessionSaveData} */ function migrateModifiers(data: SessionSaveData) { - data.modifiers.forEach((m) => { + for (const m of data.modifiers) { if (m.className === "PokemonBaseStatModifier") { m.className = "BaseStatModifier"; } else if (m.className === "PokemonResetNegativeStatStageModifier") { @@ -97,13 +128,13 @@ export const sessionMigrators = [ m.typePregenArgs[0] = newStat; // From [ stat, battlesLeft ] to [ stat, maxBattles, battleCount ] - m.args = [ newStat, maxBattles, Math.min(m.args[1], maxBattles) ]; + m.args = [newStat, maxBattles, Math.min(m.args[1], maxBattles)]; } else { m.className = "TempCritBoosterModifier"; m.typePregenArgs = []; // From [ stat, battlesLeft ] to [ maxBattles, battleCount ] - m.args = [ maxBattles, Math.min(m.args[1], maxBattles) ]; + m.args = [maxBattles, Math.min(m.args[1], maxBattles)]; } } else if (m.className === "DoubleBattleChanceBoosterModifier" && m.args.length === 1) { let maxBattles: number; @@ -120,16 +151,39 @@ export const sessionMigrators = [ } // From [ battlesLeft ] to [ maxBattles, battleCount ] - m.args = [ maxBattles, Math.min(m.args[0], maxBattles) ]; + m.args = [maxBattles, Math.min(m.args[0], maxBattles)]; } - }); + } - data.enemyModifiers.forEach((m) => { + for (const m of data.enemyModifiers) { if (m.className === "PokemonBaseStatModifier") { m.className = "BaseStatModifier"; } else if (m.className === "PokemonResetNegativeStatStageModifier") { m.className = "ResetNegativeStatStageModifier"; } - }); - } + } + }, + /** + * Converts old Pokemon natureOverride and mysteryEncounterData + * to use the new conjoined {@linkcode Pokemon.customPokemonData} structure instead. + * @param data {@linkcode SessionSaveData} + */ + function migrateCustomPokemonDataAndNatureOverrides(data: SessionSaveData) { + // Fix Pokemon nature overrides and custom data migration + for (const pokemon of data.party) { + if (pokemon["mysteryEncounterPokemonData"]) { + pokemon.customPokemonData = new CustomPokemonData(pokemon["mysteryEncounterPokemonData"]); + pokemon["mysteryEncounterPokemonData"] = null; + } + if (pokemon["fusionMysteryEncounterPokemonData"]) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(pokemon["fusionMysteryEncounterPokemonData"]); + pokemon["fusionMysteryEncounterPokemonData"] = null; + } + pokemon.customPokemonData = pokemon.customPokemonData ?? new CustomPokemonData(); + if (!isNullOrUndefined(pokemon["natureOverride"]) && pokemon["natureOverride"] >= 0) { + pokemon.customPokemonData.nature = pokemon["natureOverride"]; + pokemon["natureOverride"] = -1; + } + } + }, ] as const; diff --git a/src/system/version_migration/versions/v1_1_0.ts b/src/system/version_migration/versions/v1_1_0.ts index aac554c4531..5d6247aeaa2 100644 --- a/src/system/version_migration/versions/v1_1_0.ts +++ b/src/system/version_migration/versions/v1_1_0.ts @@ -1,32 +1,5 @@ -import { SessionSaveData } from "../../game-data"; -import { CustomPokemonData } from "#app/data/custom-pokemon-data"; - export const systemMigrators = [] as const; export const settingsMigrators = [] as const; -export const sessionMigrators = [ - /** - * Converts old Pokemon natureOverride and mysteryEncounterData - * to use the new conjoined {@linkcode Pokemon.customPokemonData} structure instead. - * @param data {@linkcode SessionSaveData} - */ - function migrateCustomPokemonDataAndNatureOverrides(data: SessionSaveData) { - // Fix Pokemon nature overrides and custom data migration - data.party.forEach(pokemon => { - if (pokemon["mysteryEncounterPokemonData"]) { - pokemon.customPokemonData = new CustomPokemonData(pokemon["mysteryEncounterPokemonData"]); - pokemon["mysteryEncounterPokemonData"] = null; - } - if (pokemon["fusionMysteryEncounterPokemonData"]) { - pokemon.fusionCustomPokemonData = new CustomPokemonData(pokemon["fusionMysteryEncounterPokemonData"]); - pokemon["fusionMysteryEncounterPokemonData"] = null; - } - pokemon.customPokemonData = pokemon.customPokemonData ?? new CustomPokemonData(); - if (pokemon["natureOverride"] && pokemon["natureOverride"] >= 0) { - pokemon.customPokemonData.nature = pokemon["natureOverride"]; - pokemon["natureOverride"] = -1; - } - }); - } -] as const; +export const sessionMigrators = [] as const; diff --git a/src/system/version_migration/versions/v1_7_0.ts b/src/system/version_migration/versions/v1_7_0.ts new file mode 100644 index 00000000000..167cd974e56 --- /dev/null +++ b/src/system/version_migration/versions/v1_7_0.ts @@ -0,0 +1,77 @@ +import { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; +import { globalScene } from "#app/global-scene"; +import { DexAttr, type SessionSaveData, type SystemSaveData } from "#app/system/game-data"; +import * as Utils from "#app/utils"; + +export const systemMigrators = [ + /** + * If a starter is caught, but the only forms registered as caught are not starterSelectable, + * unlock the default form. + * @param data {@linkcode SystemSaveData} + */ + function migrateUnselectableForms(data: SystemSaveData) { + if (data.starterData && data.dexData) { + Object.keys(data.starterData).forEach(sd => { + const caughtAttr = data.dexData[sd]?.caughtAttr; + const speciesNumber = Number(sd); + if (!speciesNumber) { + // An unknown bug at some point in time caused some accounts to have starter data for pokedex number 0 which crashes + return; + } + const species = getPokemonSpecies(speciesNumber); + if (caughtAttr && species.forms?.length > 1) { + const selectableForms = species.forms.filter( + (form, formIndex) => form.isStarterSelectable && caughtAttr & globalScene.gameData.getFormAttr(formIndex), + ); + if (selectableForms.length === 0) { + data.dexData[sd].caughtAttr += DexAttr.DEFAULT_FORM; + } + } + }); + } + }, +] as const; + +export const settingsMigrators = [] as const; + +export const sessionMigrators = [ + function migrateTera(data: SessionSaveData) { + for (let i = 0; i < data.modifiers.length; ) { + if (data.modifiers[i].className === "TerastallizeModifier") { + data.party.forEach(p => { + if (p.id === data.modifiers[i].args[0]) { + p.teraType = data.modifiers[i].args[1]; + } + }); + data.modifiers.splice(i, 1); + } else { + i++; + } + } + + for (let i = 0; i < data.enemyModifiers.length; ) { + if (data.enemyModifiers[i].className === "TerastallizeModifier") { + data.enemyParty.forEach(p => { + if (p.id === data.enemyModifiers[i].args[0]) { + p.teraType = data.enemyModifiers[i].args[1]; + } + }); + data.enemyModifiers.splice(i, 1); + } else { + i++; + } + } + + data.party.forEach(p => { + if (Utils.isNullOrUndefined(p.teraType)) { + p.teraType = getPokemonSpeciesForm(p.species, p.formIndex).type1; + } + }); + + data.enemyParty.forEach(p => { + if (Utils.isNullOrUndefined(p.teraType)) { + p.teraType = getPokemonSpeciesForm(p.species, p.formIndex).type1; + } + }); + }, +] as const; diff --git a/src/system/voucher.ts b/src/system/voucher.ts index b38fd528c9f..39294bccf13 100644 --- a/src/system/voucher.ts +++ b/src/system/voucher.ts @@ -1,16 +1,15 @@ -import BattleScene from "../battle-scene"; import i18next from "i18next"; import { AchvTier, achvs, getAchievementDescription } from "./achv"; -import { PlayerGender } from "#enums/player-gender"; +import type { PlayerGender } from "#enums/player-gender"; import { TrainerType } from "#enums/trainer-type"; -import { ConditionFn } from "#app/@types/common"; +import type { ConditionFn } from "#app/@types/common"; import { trainerConfigs } from "#app/data/trainer-config"; export enum VoucherType { REGULAR, PLUS, PREMIUM, - GOLDEN + GOLDEN, } export class Voucher { @@ -26,16 +25,16 @@ export class Voucher { this.conditionFunc = conditionFunc; } - validate(scene: BattleScene, args?: any[]): boolean { - return !this.conditionFunc || this.conditionFunc(scene, args); + validate(args?: any[]): boolean { + return !this.conditionFunc || this.conditionFunc(args); } /** * Get the name of the voucher - * @param playerGender - this is ignored here. It's only there to match the signature of the function in the Achv class + * @param _playerGender - this is ignored here. It's only there to match the signature of the function in the Achv class * @returns the name of the voucher */ - getName(playerGender: PlayerGender): string { + getName(_playerGender: PlayerGender): string { return getVoucherTypeName(this.voucherType); } @@ -90,32 +89,32 @@ export interface Vouchers { export const vouchers: Vouchers = {}; export function initVouchers() { - for (const achv of [ achvs.CLASSIC_VICTORY ]) { - const voucherType = achv.score >= 150 - ? VoucherType.GOLDEN - : achv.score >= 100 - ? VoucherType.PREMIUM - : achv.score >= 75 - ? VoucherType.PLUS - : VoucherType.REGULAR; + for (const achv of [achvs.CLASSIC_VICTORY]) { + const voucherType = + achv.score >= 150 + ? VoucherType.GOLDEN + : achv.score >= 100 + ? VoucherType.PREMIUM + : achv.score >= 75 + ? VoucherType.PLUS + : VoucherType.REGULAR; vouchers[achv.id] = new Voucher(voucherType, getAchievementDescription(achv.localizationKey)); } - const bossTrainerTypes = Object.keys(trainerConfigs) - .filter(tt => trainerConfigs[tt].isBoss && trainerConfigs[tt].getDerivedType() !== TrainerType.RIVAL && trainerConfigs[tt].hasVoucher); + const bossTrainerTypes = Object.keys(trainerConfigs).filter( + tt => + trainerConfigs[tt].isBoss && + trainerConfigs[tt].getDerivedType() !== TrainerType.RIVAL && + trainerConfigs[tt].hasVoucher, + ); for (const trainerType of bossTrainerTypes) { - const voucherType = trainerConfigs[trainerType].moneyMultiplier < 10 - ? VoucherType.PLUS - : VoucherType.PREMIUM; + const voucherType = trainerConfigs[trainerType].moneyMultiplier < 10 ? VoucherType.PLUS : VoucherType.PREMIUM; const key = TrainerType[trainerType]; const trainerName = trainerConfigs[trainerType].name; const trainer = trainerConfigs[trainerType]; const title = trainer.title ? ` (${trainer.title})` : ""; - vouchers[key] = new Voucher( - voucherType, - `${i18next.t("voucher:defeatTrainer", { trainerName })} ${title}`, - ); + vouchers[key] = new Voucher(voucherType, `${i18next.t("voucher:defeatTrainer", { trainerName })} ${title}`); } const voucherKeys = Object.keys(vouchers); for (const k of voucherKeys) { diff --git a/src/test/abilities/arena_trap.test.ts b/src/test/abilities/arena_trap.test.ts deleted file mode 100644 index 5068fed6b77..00000000000 --- a/src/test/abilities/arena_trap.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -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"; - -describe("Abilities - Arena Trap", () => { - 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) - .ability(Abilities.ARENA_TRAP) - .enemySpecies(Species.RALTS) - .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.TELEPORT); - }); - - // TODO: Enable test when Issue #935 is addressed - it.todo("should not allow grounded Pokémon to flee", async () => { - game.override.battleType("single"); - - await game.classicMode.startBattle(); - - const enemy = game.scene.getEnemyPokemon(); - - game.move.select(Moves.SPLASH); - - await game.toNextTurn(); - - expect(enemy).toBe(game.scene.getEnemyPokemon()); - }); - - it("should guarantee double battle with any one LURE", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - ]) - .startingWave(2); - - await game.classicMode.startBattle(); - - expect(game.scene.getEnemyField().length).toBe(2); - }); -}); diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts deleted file mode 100644 index 3be29ea2dcf..00000000000 --- a/src/test/abilities/costar.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Stat } from "#enums/stat"; -import { Abilities } from "#app/enums/abilities"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; -import { CommandPhase } from "#app/phases/command-phase"; -import { MessagePhase } from "#app/phases/message-phase"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - - -describe("Abilities - COSTAR", () => { - 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("double"); - game.override.ability(Abilities.COSTAR); - game.override.moveset([ Moves.SPLASH, Moves.NASTY_PLOT ]); - game.override.enemyMoveset(Moves.SPLASH); - }); - - - test( - "ability copies positive stat stages", - async () => { - game.override.enemyAbility(Abilities.BALL_FETCH); - - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO ]); - - let [ leftPokemon, rightPokemon ] = game.scene.getPlayerField(); - - game.move.select(Moves.NASTY_PLOT); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); - await game.toNextTurn(); - - expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2); - expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(0); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(CommandPhase); - game.doSwitchPokemon(2); - await game.phaseInterceptor.to(MessagePhase); - - [ leftPokemon, rightPokemon ] = game.scene.getPlayerField(); - expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2); - expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(2); - }, - ); - - test( - "ability copies negative stat stages", - async () => { - game.override.enemyAbility(Abilities.INTIMIDATE); - - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO ]); - - let [ leftPokemon, rightPokemon ] = game.scene.getPlayerField(); - - expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); - expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(CommandPhase); - game.doSwitchPokemon(2); - await game.phaseInterceptor.to(MessagePhase); - - [ leftPokemon, rightPokemon ] = game.scene.getPlayerField(); - expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); - expect(rightPokemon.getStatStage(Stat.ATK)).toBe(-2); - }, - ); -}); diff --git a/src/test/abilities/dancer.test.ts b/src/test/abilities/dancer.test.ts deleted file mode 100644 index 8fa3d444f37..00000000000 --- a/src/test/abilities/dancer.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { MovePhase } from "#app/phases/move-phase"; -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 - Dancer", () => { - 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("double") - .moveset([ Moves.SWORDS_DANCE, Moves.SPLASH ]) - .enemySpecies(Species.MAGIKARP) - .enemyAbility(Abilities.DANCER) - .enemyMoveset([ Moves.VICTORY_DANCE ]); - }); - - // Reference Link: https://bulbapedia.bulbagarden.net/wiki/Dancer_(Ability) - - it("triggers when dance moves are used, doesn't consume extra PP", async () => { - await game.classicMode.startBattle([ Species.ORICORIO, Species.FEEBAS ]); - - const [ oricorio ] = game.scene.getPlayerField(); - - game.move.select(Moves.SPLASH); - game.move.select(Moves.SWORDS_DANCE, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); - await game.phaseInterceptor.to("MovePhase"); - // immediately copies ally move - await game.phaseInterceptor.to("MovePhase", false); - let currentPhase = game.scene.getCurrentPhase() as MovePhase; - expect(currentPhase.pokemon).toBe(oricorio); - expect(currentPhase.move.moveId).toBe(Moves.SWORDS_DANCE); - await game.phaseInterceptor.to("MoveEndPhase"); - await game.phaseInterceptor.to("MovePhase"); - // immediately copies enemy move - await game.phaseInterceptor.to("MovePhase", false); - currentPhase = game.scene.getCurrentPhase() as MovePhase; - expect(currentPhase.pokemon).toBe(oricorio); - expect(currentPhase.move.moveId).toBe(Moves.VICTORY_DANCE); - await game.phaseInterceptor.to("BerryPhase"); - - // doesn't use PP if copied move is also in moveset - expect(oricorio.moveset[0]?.ppUsed).toBe(0); - }); -}); diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts deleted file mode 100644 index aac1cb16d97..00000000000 --- a/src/test/abilities/libero.test.ts +++ /dev/null @@ -1,345 +0,0 @@ -import { allMoves } from "#app/data/move"; -import { Type } from "#app/data/type"; -import { Weather, WeatherType } from "#app/data/weather"; -import { PlayerPokemon } from "#app/field/pokemon"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { Abilities } from "#enums/abilities"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { Biome } from "#enums/biome"; -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, test, vi } from "vitest"; - - -describe("Abilities - Libero", () => { - 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.ability(Abilities.LIBERO); - game.override.startingLevel(100); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset([ Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE ]); - }); - - test( - "ability applies and changes a pokemon's type", - async () => { - game.override.moveset([ Moves.SPLASH ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - }, - ); - - test.skip( - "ability applies only once per switch in", - async () => { - game.override.moveset([ Moves.SPLASH, Moves.AGILITY ]); - - await game.startBattle([ Species.MAGIKARP, Species.BULBASAUR ]); - - let leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - - game.move.select(Moves.AGILITY); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.LIBERO)).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]]; - const moveType = Type[allMoves[Moves.AGILITY].type]; - expect(leadPokemonType).not.toBe(moveType); - - await game.toNextTurn(); - game.doSwitchPokemon(1); - await game.toNextTurn(); - game.doSwitchPokemon(1); - await game.toNextTurn(); - - leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - }, - ); - - test( - "ability applies correctly even if the pokemon's move has a variable type", - async () => { - game.override.moveset([ Moves.WEATHER_BALL ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.scene.arena.weather = new Weather(WeatherType.SUNNY); - game.move.select(Moves.WEATHER_BALL); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); - expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]], - moveType = Type[Type.FIRE]; - expect(leadPokemonType).toBe(moveType); - }, - ); - - test( - "ability applies correctly even if the type has changed by another ability", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.passiveAbility(Abilities.REFRIGERATE); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); - expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]], - moveType = Type[Type.ICE]; - expect(leadPokemonType).toBe(moveType); - }, - ); - - test( - "ability applies correctly even if the pokemon's move calls another move", - async () => { - game.override.moveset([ Moves.NATURE_POWER ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.scene.arena.biomeType = Biome.MOUNTAIN; - game.move.select(Moves.NATURE_POWER); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); - }, - ); - - test( - "ability applies correctly even if the pokemon's move is delayed / charging", - async () => { - game.override.moveset([ Moves.DIG ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.DIG); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); - }, - ); - - test( - "ability applies correctly even if the pokemon's move misses", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset(Moves.SPLASH); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TACKLE); - await game.move.forceMiss(); - await game.phaseInterceptor.to(TurnEndPhase); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon.isFullHp()).toBe(true); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); - - test( - "ability applies correctly even if the pokemon's move is protected against", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset([ Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); - - test( - "ability applies correctly even if the pokemon's move fails because of type immunity", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemySpecies(Species.GASTLY); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); - - test( - "ability is not applied if pokemon's type is the same as the move's type", - async () => { - game.override.moveset([ Moves.SPLASH ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - leadPokemon.summonData.types = [ allMoves[Moves.SPLASH].type ]; - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); - }, - ); - - test( - "ability is not applied if pokemon is terastallized", - async () => { - game.override.moveset([ Moves.SPLASH ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - vi.spyOn(leadPokemon, "isTerastallized").mockReturnValue(true); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); - }, - ); - - test( - "ability is not applied if pokemon uses struggle", - async () => { - game.override.moveset([ Moves.STRUGGLE ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.STRUGGLE); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); - }, - ); - - test( - "ability is not applied if the pokemon's move fails", - async () => { - game.override.moveset([ Moves.BURN_UP ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.BURN_UP); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); - }, - ); - - test( - "ability applies correctly even if the pokemon's Trick-or-Treat fails", - async () => { - game.override.moveset([ Moves.TRICK_OR_TREAT ]); - game.override.enemySpecies(Species.GASTLY); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TRICK_OR_TREAT); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); - }, - ); - - test( - "ability applies correctly and the pokemon curses itself", - async () => { - game.override.moveset([ Moves.CURSE ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.CURSE); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); - expect(leadPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); - }, - ); -}); - -function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Moves) { - expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); - expect(pokemon.getTypes()).toHaveLength(1); - const pokemonType = Type[pokemon.getTypes()[0]], - moveType = Type[allMoves[move].type]; - expect(pokemonType).toBe(moveType); -} diff --git a/src/test/abilities/magic_guard.test.ts b/src/test/abilities/magic_guard.test.ts deleted file mode 100644 index 8075eac66f2..00000000000 --- a/src/test/abilities/magic_guard.test.ts +++ /dev/null @@ -1,467 +0,0 @@ -import { ArenaTagSide, getArenaTag } from "#app/data/arena-tag"; -import { StatusEffect, getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; -import { WeatherType } from "#app/data/weather"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { Abilities } from "#enums/abilities"; -import { ArenaTagType } from "#enums/arena-tag-type"; -import { BattlerTagType } from "#enums/battler-tag-type"; -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 - Magic Guard", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - - /** Player Pokemon overrides */ - game.override.ability(Abilities.MAGIC_GUARD); - game.override.moveset([ Moves.SPLASH ]); - game.override.startingLevel(100); - - /** Enemy Pokemon overrides */ - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset(Moves.SPLASH); - game.override.enemyLevel(100); - }); - - //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(Ability) - - it( - "ability should prevent damage caused by weather", - async () => { - game.override.weather(WeatherType.SANDSTORM); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon).toBeDefined(); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) has not taken damage from weather - * - The enemy Pokemon (without Magic Guard) has taken damage from weather - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); - - it( - "ability should prevent damage caused by status effects but other non-damage effects still apply", - async () => { - //Toxic keeps track of the turn counters -> important that Magic Guard keeps track of post-Toxic turns - game.override.statusEffect(StatusEffect.POISON); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) has not taken damage from poison - * - The Pokemon's CatchRateMultiplier should be 1.5 - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(getStatusEffectCatchRateMultiplier(leadPokemon.status!.effect)).toBe(1.5); - } - ); - - it( - "ability effect should not persist when the ability is replaced", - async () => { - game.override.enemyMoveset([ Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED ]); - game.override.statusEffect(StatusEffect.POISON); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (that just lost its Magic Guard ability) has taken damage from poison - */ - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - } - ); - - - it("Magic Guard prevents damage caused by burn but other non-damaging effects are still applied", - async () => { - game.override.enemyStatusEffect(StatusEffect.BURN); - game.override.enemyAbility(Abilities.MAGIC_GUARD); - - await game.startBattle([ Species.MAGIKARP ]); - - game.move.select(Moves.SPLASH); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The enemy Pokemon (with Magic Guard) has not taken damage from burn - * - The enemy Pokemon's physical attack damage is halved (TBD) - * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 - */ - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); - } - ); - - it("Magic Guard prevents damage caused by toxic but other non-damaging effects are still applied", - async () => { - game.override.enemyStatusEffect(StatusEffect.TOXIC); - game.override.enemyAbility(Abilities.MAGIC_GUARD); - - await game.startBattle([ Species.MAGIKARP ]); - - game.move.select(Moves.SPLASH); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - const toxicStartCounter = enemyPokemon.status!.toxicTurnCount; - //should be 0 - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The enemy Pokemon (with Magic Guard) has not taken damage from toxic - * - The enemy Pokemon's status effect duration should be incremented - * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 - */ - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(enemyPokemon.status!.toxicTurnCount).toBeGreaterThan(toxicStartCounter); - expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); - } - ); - - - it("Magic Guard prevents damage caused by entry hazards", async () => { - //Adds and applies Spikes to both sides of the arena - const newTag = getArenaTag(ArenaTagType.SPIKES, 5, Moves.SPIKES, 0, 0, ArenaTagSide.BOTH)!; - game.scene.arena.tags.push(newTag); - - await game.startBattle([ Species.MAGIKARP ]); - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SPLASH); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) has not taken damage from spikes - * - The enemy Pokemon (without Magic Guard) has taken damage from spikes - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); - - it("Magic Guard does not prevent poison from Toxic Spikes", async () => { - //Adds and applies Spikes to both sides of the arena - const playerTag = getArenaTag(ArenaTagType.TOXIC_SPIKES, 5, Moves.TOXIC_SPIKES, 0, 0, ArenaTagSide.PLAYER)!; - const enemyTag = getArenaTag(ArenaTagType.TOXIC_SPIKES, 5, Moves.TOXIC_SPIKES, 0, 0, ArenaTagSide.ENEMY)!; - game.scene.arena.tags.push(playerTag); - game.scene.arena.tags.push(enemyTag); - - await game.startBattle([ Species.MAGIKARP ]); - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SPLASH); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - Both Pokemon gain the poison status effect - * - The player Pokemon (with Magic Guard) has not taken damage from poison - * - The enemy Pokemon (without Magic Guard) has taken damage from poison - */ - expect(leadPokemon.status!.effect).toBe(StatusEffect.POISON); - expect(enemyPokemon.status!.effect).toBe(StatusEffect.POISON); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); - - it("Magic Guard prevents against damage from volatile status effects", - async () => { - await game.startBattle([ Species.DUSKULL ]); - game.override.moveset([ Moves.CURSE ]); - game.override.enemyAbility(Abilities.MAGIC_GUARD); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.CURSE); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) has cut its HP to inflict curse - * - The enemy Pokemon (with Magic Guard) is cursed - * - The enemy Pokemon (with Magic Guard) does not lose HP from being cursed - */ - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - expect(enemyPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); - - it("Magic Guard prevents crash damage", async () => { - game.override.moveset([ Moves.HIGH_JUMP_KICK ]); - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.HIGH_JUMP_KICK); - await game.move.forceMiss(); - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) misses High Jump Kick but does not lose HP as a result - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); - - it("Magic Guard prevents damage from recoil", async () => { - game.override.moveset([ Moves.TAKE_DOWN ]); - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.TAKE_DOWN); - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) uses a recoil move but does not lose HP from recoil - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); - - it("Magic Guard does not prevent damage from Struggle's recoil", async () => { - game.override.moveset([ Moves.STRUGGLE ]); - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.STRUGGLE); - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) uses Struggle but does lose HP from Struggle's recoil - */ - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - } - ); - - //This tests different move attributes than the recoil tests above - it("Magic Guard prevents self-damage from attacking moves", async () => { - game.override.moveset([ Moves.STEEL_BEAM ]); - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.STEEL_BEAM); - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) uses a move with an HP cost but does not lose HP from using it - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); - - /* - it("Magic Guard does not prevent self-damage from confusion", async () => { - await game.startBattle([Species.MAGIKARP]); - - game.move.select(Moves.CHARM); - - await game.phaseInterceptor.to(TurnEndPhase); - }); -*/ - - it("Magic Guard does not prevent self-damage from non-attacking moves", async () => { - game.override.moveset([ Moves.BELLY_DRUM ]); - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.BELLY_DRUM); - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) uses a non-attacking move with an HP cost and thus loses HP from using it - */ - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - } - ); - - it("Magic Guard prevents damage from abilities with PostTurnHurtIfSleepingAbAttr", async () => { - //Tests the ability Bad Dreams - game.override.statusEffect(StatusEffect.SLEEP); - //enemy pokemon is given Spore just in case player pokemon somehow awakens during test - game.override.enemyMoveset([ Moves.SPORE, Moves.SPORE, Moves.SPORE, Moves.SPORE ]); - game.override.enemyAbility(Abilities.BAD_DREAMS); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - * - The player Pokemon is asleep - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(leadPokemon.status!.effect).toBe(StatusEffect.SLEEP); - } - ); - - it("Magic Guard prevents damage from abilities with PostFaintContactDamageAbAttr", async () => { - //Tests the abilities Innards Out/Aftermath - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyAbility(Abilities.AFTERMATH); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.hp = 1; - - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - * - The enemy Pokemon has fainted - */ - expect(enemyPokemon.hp).toBe(0); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); - - it("Magic Guard prevents damage from abilities with PostDefendContactDamageAbAttr", async () => { - //Tests the abilities Iron Barbs/Rough Skin - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyAbility(Abilities.IRON_BARBS); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - * - The player Pokemon's move should have connected - */ - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); - - it("Magic Guard prevents damage from abilities with ReverseDrainAbAttr", async () => { - //Tests the ability Liquid Ooze - game.override.moveset([ Moves.ABSORB ]); - game.override.enemyAbility(Abilities.LIQUID_OOZE); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.ABSORB); - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - * - The player Pokemon's move should have connected - */ - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); - - it("Magic Guard prevents HP loss from abilities with PostWeatherLapseDamageAbAttr", async () => { - //Tests the abilities Solar Power/Dry Skin - game.override.passiveAbility(Abilities.SOLAR_POWER); - game.override.weather(WeatherType.SUNNY); - - await game.startBattle([ Species.MAGIKARP ]); - const leadPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - /** - * Expect: - * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute - */ - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); -}); diff --git a/src/test/abilities/moody.test.ts b/src/test/abilities/moody.test.ts deleted file mode 100644 index 166f69b0fe3..00000000000 --- a/src/test/abilities/moody.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; -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 - Moody", () => { - 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") - .enemySpecies(Species.RATTATA) - .enemyAbility(Abilities.BALL_FETCH) - .ability(Abilities.MOODY) - .enemyMoveset(Moves.SPLASH) - .moveset(Moves.SPLASH); - }); - - it("should increase one stat stage by 2 and decrease a different stat stage by 1", - async () => { - await game.classicMode.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - - // Find the increased and decreased stats, make sure they are different. - const changedStats = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === 2 || playerPokemon.getStatStage(s) === -1); - - expect(changedStats).toBeTruthy(); - expect(changedStats.length).toBe(2); - expect(changedStats[0] !== changedStats[1]).toBeTruthy(); - }); - - it("should only increase one stat stage by 2 if all stat stages are at -6", - async () => { - await game.classicMode.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - - // Set all stat stages to -6 - vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(-6)); - - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - - // Should increase one stat stage by 2 (from -6, meaning it will be -4) - const increasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === -4); - - expect(increasedStat).toBeTruthy(); - expect(increasedStat.length).toBe(1); - }); - - it("should only decrease one stat stage by 1 stage if all stat stages are at 6", - async () => { - await game.classicMode.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - - // Set all stat stages to 6 - vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(6)); - - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - - // Should decrease one stat stage by 1 (from 6, meaning it will be 5) - const decreasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === 5); - - expect(decreasedStat).toBeTruthy(); - expect(decreasedStat.length).toBe(1); - }); -}); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts deleted file mode 100644 index 993a5eb8344..00000000000 --- a/src/test/abilities/parental_bond.test.ts +++ /dev/null @@ -1,523 +0,0 @@ -import { Stat } from "#enums/stat"; -import { StatusEffect } from "#app/data/status-effect"; -import { Type } from "#app/data/type"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { 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 - Parental Bond", () => { - 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.disableCrits(); - game.override.ability(Abilities.PARENTAL_BOND); - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyAbility(Abilities.FUR_COAT); - game.override.enemyMoveset(Moves.SPLASH); - game.override.startingLevel(100); - game.override.enemyLevel(100); - }); - - it( - "should add second strike to attack move", - async () => { - game.override.moveset([ Moves.TACKLE ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - let enemyStartingHp = enemyPokemon.hp; - - game.move.select(Moves.TACKLE); - - await game.phaseInterceptor.to("DamagePhase"); - const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; - enemyStartingHp = enemyPokemon.hp; - - await game.phaseInterceptor.to("BerryPhase", false); - - const secondStrikeDamage = enemyStartingHp - enemyPokemon.hp; - - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(secondStrikeDamage).toBe(toDmgValue(0.25 * firstStrikeDamage)); - } - ); - - it( - "should apply secondary effects to both strikes", - async () => { - game.override.moveset([ Moves.POWER_UP_PUNCH ]); - game.override.enemySpecies(Species.AMOONGUSS); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.POWER_UP_PUNCH); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - } - ); - - it( - "should not apply to Status moves", - async () => { - game.override.moveset([ Moves.BABY_DOLL_EYES ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.BABY_DOLL_EYES); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); - } - ); - - it( - "should not apply to multi-hit moves", - async () => { - game.override.moveset([ Moves.DOUBLE_HIT ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.DOUBLE_HIT); - await game.move.forceHit(); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.turnData.hitCount).toBe(2); - } - ); - - it( - "should not apply to self-sacrifice moves", - async () => { - game.override.moveset([ Moves.SELF_DESTRUCT ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SELF_DESTRUCT); - - await game.phaseInterceptor.to("DamagePhase", false); - - expect(leadPokemon.turnData.hitCount).toBe(1); - } - ); - - it( - "should not apply to Rollout", - async () => { - game.override.moveset([ Moves.ROLLOUT ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.ROLLOUT); - await game.move.forceHit(); - - await game.phaseInterceptor.to("DamagePhase", false); - - expect(leadPokemon.turnData.hitCount).toBe(1); - } - ); - - it( - "should not apply multiplier to fixed-damage moves", - async () => { - game.override.moveset([ Moves.DRAGON_RAGE ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.DRAGON_RAGE); - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 80); - } - ); - - it( - "should not apply multiplier to counter moves", - async () => { - game.override.moveset([ Moves.COUNTER ]); - game.override.enemyMoveset([ Moves.TACKLE ]); - - await game.classicMode.startBattle([ Species.SHUCKLE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.COUNTER); - await game.phaseInterceptor.to("DamagePhase"); - - const playerDamage = leadPokemon.getMaxHp() - leadPokemon.hp; - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 4 * playerDamage); - } - ); - - it( - "should not apply to multi-target moves", - async () => { - game.override.battleType("double"); - game.override.moveset([ Moves.EARTHQUAKE ]); - game.override.passiveAbility(Abilities.LEVITATE); - - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); - - const playerPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.EARTHQUAKE); - game.move.select(Moves.EARTHQUAKE, 1); - - await game.phaseInterceptor.to("BerryPhase", false); - - playerPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); - } - ); - - it( - "should apply to multi-target moves when hitting only one target", - async () => { - game.override.moveset([ Moves.EARTHQUAKE ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.EARTHQUAKE); - await game.phaseInterceptor.to("DamagePhase", false); - - expect(leadPokemon.turnData.hitCount).toBe(2); - } - ); - - it( - "should only trigger post-target move effects once", - async () => { - game.override.moveset([ Moves.MIND_BLOWN ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.MIND_BLOWN); - - await game.phaseInterceptor.to("DamagePhase", false); - - expect(leadPokemon.turnData.hitCount).toBe(2); - - // This test will time out if the user faints - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() / 2)); - } - ); - - it( - "Burn Up only removes type after the second strike", - async () => { - game.override.moveset([ Moves.BURN_UP ]); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.BURN_UP); - - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(enemyPokemon.hp).toBeGreaterThan(0); - expect(leadPokemon.isOfType(Type.FIRE)).toBe(true); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.isOfType(Type.FIRE)).toBe(false); - } - ); - - it( - "Moves boosted by this ability and Multi-Lens should strike 4 times", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.TACKLE); - - await game.phaseInterceptor.to("DamagePhase"); - - expect(leadPokemon.turnData.hitCount).toBe(4); - } - ); - - it( - "Super Fang boosted by this ability and Multi-Lens should strike twice", - async () => { - game.override.moveset([ Moves.SUPER_FANG ]); - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.SUPER_FANG); - await game.move.forceHit(); - - await game.phaseInterceptor.to("DamagePhase"); - - expect(leadPokemon.turnData.hitCount).toBe(2); - - await game.phaseInterceptor.to("MoveEndPhase", false); - - expect(enemyPokemon.hp).toBe(Math.ceil(enemyPokemon.getMaxHp() * 0.25)); - } - ); - - it( - "Seismic Toss boosted by this ability and Multi-Lens should strike twice", - async () => { - game.override.moveset([ Moves.SEISMIC_TOSS ]); - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - const enemyStartingHp = enemyPokemon.hp; - - game.move.select(Moves.SEISMIC_TOSS); - await game.move.forceHit(); - - await game.phaseInterceptor.to("DamagePhase"); - - expect(leadPokemon.turnData.hitCount).toBe(2); - - await game.phaseInterceptor.to("MoveEndPhase", false); - - expect(enemyPokemon.hp).toBe(enemyStartingHp - 200); - } - ); - - it( - "Hyper Beam boosted by this ability should strike twice, then recharge", - async () => { - game.override.moveset([ Moves.HYPER_BEAM ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.HYPER_BEAM); - await game.move.forceHit(); - - await game.phaseInterceptor.to("DamagePhase"); - - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); - - await game.phaseInterceptor.to("TurnEndPhase"); - - expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); - } - ); - - it( - "Anchor Shot boosted by this ability should only trap the target after the second hit", - async () => { - game.override.moveset([ Moves.ANCHOR_SHOT ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.ANCHOR_SHOT); - await game.move.forceHit(); - - await game.phaseInterceptor.to("DamagePhase"); - - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - - await game.phaseInterceptor.to("MoveEndPhase"); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - - await game.phaseInterceptor.to("TurnEndPhase"); - - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - } - ); - - it( - "Smack Down boosted by this ability should only ground the target after the second hit", - async () => { - game.override.moveset([ Moves.SMACK_DOWN ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.SMACK_DOWN); - await game.move.forceHit(); - - await game.phaseInterceptor.to("DamagePhase"); - - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - - await game.phaseInterceptor.to("TurnEndPhase"); - - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - } - ); - - it( - "U-turn boosted by this ability should strike twice before forcing a switch", - async () => { - game.override.moveset([ Moves.U_TURN ]); - - await game.classicMode.startBattle([ Species.MAGIKARP, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.U_TURN); - await game.move.forceHit(); - - await game.phaseInterceptor.to("MoveEffectPhase"); - expect(leadPokemon.turnData.hitCount).toBe(2); - - // This will cause this test to time out if the switch was forced on the first hit. - await game.phaseInterceptor.to("MoveEffectPhase", false); - } - ); - - it( - "Wake-Up Slap boosted by this ability should only wake up the target after the second hit", - async () => { - game.override.moveset([ Moves.WAKE_UP_SLAP ]).enemyStatusEffect(StatusEffect.SLEEP); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.WAKE_UP_SLAP); - await game.move.forceHit(); - - await game.phaseInterceptor.to("DamagePhase"); - - expect(leadPokemon.turnData.hitCount).toBe(2); - expect(enemyPokemon.status?.effect).toBe(StatusEffect.SLEEP); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon.status?.effect).toBeUndefined(); - } - ); - - it( - "should not cause user to hit into King's Shield more than once", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset([ Moves.KINGS_SHIELD ]); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.TACKLE); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(-1); - } - ); - - it( - "should not cause user to hit into Storm Drain more than once", - async () => { - game.override.moveset([ Moves.WATER_GUN ]); - game.override.enemyAbility(Abilities.STORM_DRAIN); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.WATER_GUN); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(1); - } - ); - - it( - "should not apply to multi-target moves with Multi-Lens", - async () => { - game.override.battleType("double"); - game.override.moveset([ Moves.EARTHQUAKE, Moves.SPLASH ]); - game.override.passiveAbility(Abilities.LEVITATE); - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); - - const enemyPokemon = game.scene.getEnemyField(); - - const enemyStartingHp = enemyPokemon.map(p => p.hp); - - game.move.select(Moves.EARTHQUAKE); - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to("DamagePhase"); - const enemyFirstHitDamage = enemyStartingHp.map((hp, i) => hp - enemyPokemon[i].hp); - - await game.phaseInterceptor.to("BerryPhase", false); - - enemyPokemon.forEach((p, i) => expect(enemyStartingHp[i] - p.hp).toBe(2 * enemyFirstHitDamage[i])); - } - ); -}); diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts deleted file mode 100644 index 1a9e7d4818a..00000000000 --- a/src/test/abilities/power_construct.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Status, StatusEffect } from "#app/data/status-effect"; -import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - - -describe("Abilities - POWER CONSTRUCT", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - const moveToUse = Moves.SPLASH; - game.override.battleType("single"); - game.override.ability(Abilities.POWER_CONSTRUCT); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - }); - - test( - "check if fainted 50% Power Construct Pokemon switches to base form on arena reset", - async () => { - const baseForm = 2, - completeForm = 4; - game.override.startingWave(4); - game.override.starterForms({ - [Species.ZYGARDE]: completeForm, - }); - - await game.classicMode.startBattle([ Species.MAGIKARP, Species.ZYGARDE ]); - - const zygarde = game.scene.getParty().find((p) => p.species.speciesId === Species.ZYGARDE); - expect(zygarde).not.toBe(undefined); - expect(zygarde!.formIndex).toBe(completeForm); - - zygarde!.hp = 0; - zygarde!.status = new Status(StatusEffect.FAINT); - expect(zygarde!.isFainted()).toBe(true); - - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); - - expect(zygarde!.formIndex).toBe(baseForm); - }, - ); - - test( - "check if fainted 10% Power Construct Pokemon switches to base form on arena reset", - async () => { - const baseForm = 3, - completeForm = 5; - game.override.startingWave(4); - game.override.starterForms({ - [Species.ZYGARDE]: completeForm, - }); - - await game.classicMode.startBattle([ Species.MAGIKARP, Species.ZYGARDE ]); - - const zygarde = game.scene.getParty().find((p) => p.species.speciesId === Species.ZYGARDE); - expect(zygarde).not.toBe(undefined); - expect(zygarde!.formIndex).toBe(completeForm); - - zygarde!.hp = 0; - zygarde!.status = new Status(StatusEffect.FAINT); - expect(zygarde!.isFainted()).toBe(true); - - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); - - expect(zygarde!.formIndex).toBe(baseForm); - }, - ); -}); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts deleted file mode 100644 index 5f86ec4c6e6..00000000000 --- a/src/test/abilities/protean.test.ts +++ /dev/null @@ -1,345 +0,0 @@ -import { allMoves } from "#app/data/move"; -import { Type } from "#app/data/type"; -import { Weather, WeatherType } from "#app/data/weather"; -import { PlayerPokemon } from "#app/field/pokemon"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { Abilities } from "#enums/abilities"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { Biome } from "#enums/biome"; -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, test, vi } from "vitest"; - - -describe("Abilities - Protean", () => { - 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.ability(Abilities.PROTEAN); - game.override.startingLevel(100); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset([ Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE ]); - }); - - test( - "ability applies and changes a pokemon's type", - async () => { - game.override.moveset([ Moves.SPLASH ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - }, - ); - - test.skip( - "ability applies only once per switch in", - async () => { - game.override.moveset([ Moves.SPLASH, Moves.AGILITY ]); - - await game.startBattle([ Species.MAGIKARP, Species.BULBASAUR ]); - - let leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - - game.move.select(Moves.AGILITY); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied.filter((a) => a === Abilities.PROTEAN)).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]]; - const moveType = Type[allMoves[Moves.AGILITY].type]; - expect(leadPokemonType).not.toBe(moveType); - - await game.toNextTurn(); - game.doSwitchPokemon(1); - await game.toNextTurn(); - game.doSwitchPokemon(1); - await game.toNextTurn(); - - leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); - }, - ); - - test( - "ability applies correctly even if the pokemon's move has a variable type", - async () => { - game.override.moveset([ Moves.WEATHER_BALL ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.scene.arena.weather = new Weather(WeatherType.SUNNY); - game.move.select(Moves.WEATHER_BALL); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); - expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]], - moveType = Type[Type.FIRE]; - expect(leadPokemonType).toBe(moveType); - }, - ); - - test( - "ability applies correctly even if the type has changed by another ability", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.passiveAbility(Abilities.REFRIGERATE); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); - expect(leadPokemon.getTypes()).toHaveLength(1); - const leadPokemonType = Type[leadPokemon.getTypes()[0]], - moveType = Type[Type.ICE]; - expect(leadPokemonType).toBe(moveType); - }, - ); - - test( - "ability applies correctly even if the pokemon's move calls another move", - async () => { - game.override.moveset([ Moves.NATURE_POWER ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.scene.arena.biomeType = Biome.MOUNTAIN; - game.move.select(Moves.NATURE_POWER); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); - }, - ); - - test( - "ability applies correctly even if the pokemon's move is delayed / charging", - async () => { - game.override.moveset([ Moves.DIG ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.DIG); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); - }, - ); - - test( - "ability applies correctly even if the pokemon's move misses", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset(Moves.SPLASH); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TACKLE); - await game.move.forceMiss(); - await game.phaseInterceptor.to(TurnEndPhase); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon.isFullHp()).toBe(true); - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); - - test( - "ability applies correctly even if the pokemon's move is protected against", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemyMoveset([ Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); - - test( - "ability applies correctly even if the pokemon's move fails because of type immunity", - async () => { - game.override.moveset([ Moves.TACKLE ]); - game.override.enemySpecies(Species.GASTLY); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); - }, - ); - - test( - "ability is not applied if pokemon's type is the same as the move's type", - async () => { - game.override.moveset([ Moves.SPLASH ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - leadPokemon.summonData.types = [ allMoves[Moves.SPLASH].type ]; - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); - }, - ); - - test( - "ability is not applied if pokemon is terastallized", - async () => { - game.override.moveset([ Moves.SPLASH ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - vi.spyOn(leadPokemon, "isTerastallized").mockReturnValue(true); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); - }, - ); - - test( - "ability is not applied if pokemon uses struggle", - async () => { - game.override.moveset([ Moves.STRUGGLE ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.STRUGGLE); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); - }, - ); - - test( - "ability is not applied if the pokemon's move fails", - async () => { - game.override.moveset([ Moves.BURN_UP ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.BURN_UP); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); - }, - ); - - test( - "ability applies correctly even if the pokemon's Trick-or-Treat fails", - async () => { - game.override.moveset([ Moves.TRICK_OR_TREAT ]); - game.override.enemySpecies(Species.GASTLY); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.TRICK_OR_TREAT); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); - }, - ); - - test( - "ability applies correctly and the pokemon curses itself", - async () => { - game.override.moveset([ Moves.CURSE ]); - - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - game.move.select(Moves.CURSE); - await game.phaseInterceptor.to(TurnEndPhase); - - testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); - expect(leadPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); - }, - ); -}); - -function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Moves) { - expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); - expect(pokemon.getTypes()).toHaveLength(1); - const pokemonType = Type[pokemon.getTypes()[0]], - moveType = Type[allMoves[move].type]; - expect(pokemonType).toBe(moveType); -} diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts deleted file mode 100644 index c62357f17af..00000000000 --- a/src/test/abilities/sand_veil.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { StatMultiplierAbAttr, allAbilities } from "#app/data/ability"; -import { Stat } from "#enums/stat"; -import { WeatherType } from "#app/data/weather"; -import { CommandPhase } from "#app/phases/command-phase"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import { MoveEndPhase } from "#app/phases/move-end-phase"; -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, test, vi } from "vitest"; - - -describe("Abilities - Sand Veil", () => { - 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 ]); - game.override.enemySpecies(Species.MEOWSCARADA); - game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset([ Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER ]); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override - .weather(WeatherType.SANDSTORM) - .battleType("double"); - }); - - test( - "ability should increase the evasiveness of the source", - async () => { - await game.startBattle([ Species.SNORLAX, Species.BLISSEY ]); - - const leadPokemon = game.scene.getPlayerField(); - - vi.spyOn(leadPokemon[0], "getAbility").mockReturnValue(allAbilities[Abilities.SAND_VEIL]); - - const sandVeilAttr = allAbilities[Abilities.SAND_VEIL].getAttrs(StatMultiplierAbAttr)[0]; - vi.spyOn(sandVeilAttr, "applyStatStage").mockImplementation( - (_pokemon, _passive, _simulated, stat, statValue, _args) => { - if (stat === Stat.EVA && game.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) { - statValue.value *= -1; // will make all attacks miss - return true; - } - return false; - } - ); - - expect(leadPokemon[0].hasAbility(Abilities.SAND_VEIL)).toBe(true); - expect(leadPokemon[1].hasAbility(Abilities.SAND_VEIL)).toBe(false); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - - await game.phaseInterceptor.to(MoveEndPhase, false); - - expect(leadPokemon[0].isFullHp()).toBe(true); - expect(leadPokemon[1].hp).toBeLessThan(leadPokemon[1].getMaxHp()); - } - ); -}); diff --git a/src/test/abilities/schooling.test.ts b/src/test/abilities/schooling.test.ts deleted file mode 100644 index aacc7bbd4c2..00000000000 --- a/src/test/abilities/schooling.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Status, StatusEffect } from "#app/data/status-effect"; -import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - - -describe("Abilities - SCHOOLING", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - const moveToUse = Moves.SPLASH; - game.override.battleType("single"); - game.override.ability(Abilities.SCHOOLING); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - }); - - test( - "check if fainted pokemon switches to base form on arena reset", - async () => { - const soloForm = 0, - schoolForm = 1; - game.override.startingWave(4); - game.override.starterForms({ - [Species.WISHIWASHI]: schoolForm, - }); - - await game.startBattle([ Species.MAGIKARP, Species.WISHIWASHI ]); - - const wishiwashi = game.scene.getParty().find((p) => p.species.speciesId === Species.WISHIWASHI)!; - expect(wishiwashi).not.toBe(undefined); - expect(wishiwashi.formIndex).toBe(schoolForm); - - wishiwashi.hp = 0; - wishiwashi.status = new Status(StatusEffect.FAINT); - expect(wishiwashi.isFainted()).toBe(true); - - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); - - expect(wishiwashi.formIndex).toBe(soloForm); - }, - ); -}); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts deleted file mode 100644 index 3155594c81d..00000000000 --- a/src/test/abilities/serene_grace.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -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"; - - -describe("Abilities - Serene Grace", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - 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 ]); - }); - - it("Move chance without Serene Grace", async () => { - const moveToUse = Moves.AIR_SLASH; - await game.startBattle([ - Species.PIDGEOT - ]); - - - game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; - expect(game.scene.getParty()[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 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.getTarget(), 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.getParty()[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.getTarget(), false); - expect(chance.value).toBe(60); - - }, 20000); - - //TODO King's Rock Interaction Unit Test -}); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts deleted file mode 100644 index a2600476d6d..00000000000 --- a/src/test/abilities/sheer_force.test.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, applyPostDefendAbAttrs, applyPreAttackAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr } 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"; - - -describe("Abilities - Sheer Force", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - 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 ]); - }); - - it("Sheer Force", async () => { - const moveToUse = Moves.AIR_SLASH; - game.override.ability(Abilities.SHEER_FORCE); - await game.startBattle([ - Species.PIDGEOT - ]); - - - game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; - expect(game.scene.getParty()[0].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.AIR_SLASH); - - //Verify the move is boosted and has no chance of secondary effects - const power = new Utils.IntegerHolder(move.power); - const chance = new Utils.IntegerHolder(move.chance); - - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getTarget()!, 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.startBattle([ - Species.PIDGEOT - ]); - - - game.scene.getEnemyParty()[0].stats[Stat.DEF] = 10000; - expect(game.scene.getParty()[0].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.BIND); - - //Binding moves and other exceptions are not affected by Sheer Force and have a chance.value of -1 - const power = new Utils.IntegerHolder(move.power); - const chance = new Utils.IntegerHolder(move.chance); - - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getTarget()!, 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.startBattle([ - Species.PIDGEOT - ]); - - - game.scene.getEnemyParty()[0].stats[Stat.DEF] = 10000; - expect(game.scene.getParty()[0].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 Utils.IntegerHolder(move.power); - const chance = new Utils.IntegerHolder(move.chance); - - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getTarget()!, 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.getEnemyParty()[0].stats[Stat.DEF] = 10000; - expect(game.scene.getParty()[0].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 Utils.IntegerHolder(move.power); - const chance = new Utils.IntegerHolder(move.chance); - const user = phase.getUserPokemon()!; - const target = phase.getTarget()!; - 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); - - it("Two Pokemon with abilities disabled by Sheer Force hitting each other should not cause a crash", async () => { - const moveToUse = Moves.CRUNCH; - game.override.enemyAbility(Abilities.COLOR_CHANGE) - .ability(Abilities.COLOR_CHANGE) - .moveset(moveToUse) - .enemyMoveset(moveToUse); - - await game.classicMode.startBattle([ - Species.PIDGEOT - ]); - - const pidgeot = game.scene.getParty()[0]; - const onix = game.scene.getEnemyParty()[0]; - - pidgeot.stats[Stat.DEF] = 10000; - onix.stats[Stat.DEF] = 10000; - - game.move.select(moveToUse); - await game.toNextTurn(); - - // Check that both Pokemon's Color Change activated - const expectedTypes = [ allMoves[moveToUse].type ]; - expect(pidgeot.getTypes()).toStrictEqual(expectedTypes); - expect(onix.getTypes()).toStrictEqual(expectedTypes); - }); - - //TODO King's Rock Interaction Unit Test -}); diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts deleted file mode 100644 index d3d72ac80a5..00000000000 --- a/src/test/abilities/shields_down.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Status, StatusEffect } from "#app/data/status-effect"; -import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - - -describe("Abilities - SHIELDS DOWN", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - const moveToUse = Moves.SPLASH; - game.override.battleType("single"); - game.override.ability(Abilities.SHIELDS_DOWN); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - }); - - test( - "check if fainted pokemon switched to base form on arena reset", - async () => { - const meteorForm = 0, - coreForm = 7; - game.override.startingWave(4); - game.override.starterForms({ - [Species.MINIOR]: coreForm, - }); - - await game.startBattle([ Species.MAGIKARP, Species.MINIOR ]); - - const minior = game.scene.getParty().find((p) => p.species.speciesId === Species.MINIOR)!; - expect(minior).not.toBe(undefined); - expect(minior.formIndex).toBe(coreForm); - - minior.hp = 0; - minior.status = new Status(StatusEffect.FAINT); - expect(minior.isFainted()).toBe(true); - - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); - - expect(minior.formIndex).toBe(meteorForm); - }, - ); -}); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts deleted file mode 100644 index 49384e69f83..00000000000 --- a/src/test/abilities/sturdy.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { EnemyPokemon } from "#app/field/pokemon"; -import { DamagePhase } from "#app/phases/damage-phase"; -import { MoveEndPhase } from "#app/phases/move-end-phase"; -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, test } from "vitest"; - - -describe("Abilities - Sturdy", () => { - 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.starterSpecies(Species.LUCARIO); - game.override.startingLevel(100); - game.override.moveset([ Moves.CLOSE_COMBAT, Moves.FISSURE ]); - - game.override.enemySpecies(Species.ARON); - game.override.enemyLevel(5); - game.override.enemyAbility(Abilities.STURDY); - }); - - test( - "Sturdy activates when user is at full HP", - async () => { - await game.startBattle(); - game.move.select(Moves.CLOSE_COMBAT); - await game.phaseInterceptor.to(MoveEndPhase); - expect(game.scene.getEnemyParty()[0].hp).toBe(1); - }, - ); - - test( - "Sturdy doesn't activate when user is not at full HP", - async () => { - await game.startBattle(); - - const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; - enemyPokemon.hp = enemyPokemon.getMaxHp() - 1; - - game.move.select(Moves.CLOSE_COMBAT); - await game.phaseInterceptor.to(DamagePhase); - - expect(enemyPokemon.hp).toBe(0); - expect(enemyPokemon.isFainted()).toBe(true); - }, - ); - - test( - "Sturdy pokemon should be immune to OHKO moves", - async () => { - await game.startBattle(); - game.move.select(Moves.FISSURE); - await game.phaseInterceptor.to(MoveEndPhase); - - const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; - expect(enemyPokemon.isFullHp()).toBe(true); - }, - ); - - test( - "Sturdy is ignored by pokemon with `Abilities.MOLD_BREAKER`", - async () => { - game.override.ability(Abilities.MOLD_BREAKER); - - await game.startBattle(); - game.move.select(Moves.CLOSE_COMBAT); - await game.phaseInterceptor.to(DamagePhase); - - const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; - expect(enemyPokemon.hp).toBe(0); - expect(enemyPokemon.isFainted()).toBe(true); - }, - ); - -}); diff --git a/src/test/abilities/tera_shell.test.ts b/src/test/abilities/tera_shell.test.ts deleted file mode 100644 index 01382d0fd9a..00000000000 --- a/src/test/abilities/tera_shell.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { Abilities } from "#app/enums/abilities"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; -import { HitResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - -describe("Abilities - Tera Shell", () => { - 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") - .ability(Abilities.TERA_SHELL) - .moveset([ Moves.SPLASH ]) - .enemySpecies(Species.SNORLAX) - .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset([ Moves.MACH_PUNCH ]) - .startingLevel(100) - .enemyLevel(100); - }); - - it( - "should change the effectiveness of non-resisted attacks when the source is at full HP", - async () => { - await game.classicMode.startBattle([ Species.SNORLAX ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "getMoveEffectiveness"); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.5); - - await game.toNextTurn(); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(2); - } - ); - - it( - "should not override type immunities", - async () => { - game.override.enemyMoveset([ Moves.SHADOW_SNEAK ]); - - await game.classicMode.startBattle([ Species.SNORLAX ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "getMoveEffectiveness"); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0); - } - ); - - it( - "should not override type multipliers less than 0.5x", - async () => { - game.override.enemyMoveset([ Moves.QUICK_ATTACK ]); - - await game.classicMode.startBattle([ Species.AGGRON ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "getMoveEffectiveness"); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.25); - } - ); - - it( - "should not affect the effectiveness of fixed-damage moves", - async () => { - game.override.enemyMoveset([ Moves.DRAGON_RAGE ]); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "apply"); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.EFFECTIVE); - expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp() - 40); - } - ); - - it( - "should change the effectiveness of all strikes of a multi-strike move", - async () => { - game.override.enemyMoveset([ Moves.DOUBLE_HIT ]); - - await game.classicMode.startBattle([ Species.SNORLAX ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(playerPokemon, "apply"); - - game.move.select(Moves.SPLASH); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.move.forceHit(); - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEffectPhase"); - expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.NOT_VERY_EFFECTIVE); - } - expect(playerPokemon.apply).toHaveReturnedTimes(2); - } - ); -}); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts deleted file mode 100644 index f8fa8a723fe..00000000000 --- a/src/test/abilities/unseen_fist.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -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 { BattlerTagType } from "#app/enums/battler-tag-type"; -import { BerryPhase } from "#app/phases/berry-phase"; - - -describe("Abilities - Unseen Fist", () => { - 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.starterSpecies(Species.URSHIFU); - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT ]); - game.override.startingLevel(100); - game.override.enemyLevel(100); - }); - - it( - "should cause a contact move to ignore Protect", - () => testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, true), - ); - - it( - "should not cause a non-contact move to ignore Protect", - () => testUnseenFistHitResult(game, Moves.ABSORB, Moves.PROTECT, false), - ); - - it( - "should not apply if the source has Long Reach", - () => { - game.override.passiveAbility(Abilities.LONG_REACH); - testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); - } - ); - - it( - "should cause a contact move to ignore Wide Guard", - () => testUnseenFistHitResult(game, Moves.BREAKING_SWIPE, Moves.WIDE_GUARD, true), - ); - - it( - "should not cause a non-contact move to ignore Wide Guard", - () => testUnseenFistHitResult(game, Moves.BULLDOZE, Moves.WIDE_GUARD, false), - ); - - it( - "should cause a contact move to ignore Protect, but not Substitute", - async () => { - game.override.enemyLevel(1); - game.override.moveset([ Moves.TACKLE ]); - - await game.startBattle(); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); - - game.move.select(Moves.TACKLE); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeUndefined(); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); -}); - -async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, protectMove: Moves, shouldSucceed: boolean = true): Promise { - game.override.moveset([ attackMove ]); - game.override.enemyMoveset([ protectMove, protectMove, protectMove, protectMove ]); - - await game.startBattle(); - - const leadPokemon = game.scene.getPlayerPokemon()!; - expect(leadPokemon).not.toBe(undefined); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon).not.toBe(undefined); - - const enemyStartingHp = enemyPokemon.hp; - - game.move.select(attackMove); - await game.phaseInterceptor.to(TurnEndPhase, false); - - if (shouldSucceed) { - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - } else { - expect(enemyPokemon.hp).toBe(enemyStartingHp); - } -} diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts deleted file mode 100644 index 2601954a9a4..00000000000 --- a/src/test/abilities/zen_mode.test.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { Stat } from "#enums/stat"; -import { BattlerIndex } from "#app/battle"; -import { DamagePhase } from "#app/phases/damage-phase"; -import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; -import { MessagePhase } from "#app/phases/message-phase"; -import { PostSummonPhase } from "#app/phases/post-summon-phase"; -import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; -import { SwitchPhase } from "#app/phases/switch-phase"; -import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { TurnInitPhase } from "#app/phases/turn-init-phase"; -import { TurnStartPhase } from "#app/phases/turn-start-phase"; -import { Mode } from "#app/ui/ui"; -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, test } from "vitest"; -import { Status, StatusEffect } from "#app/data/status-effect"; -import { SwitchType } from "#enums/switch-type"; - - -describe("Abilities - ZEN MODE", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - const moveToUse = Moves.SPLASH; - game.override.battleType("single"); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyAbility(Abilities.HYDRATION); - game.override.ability(Abilities.ZEN_MODE); - game.override.startingLevel(100); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - }); - - test( - "not enough damage to change form", - async () => { - const moveToUse = Moves.SPLASH; - await game.startBattle([ Species.DARMANITAN ]); - game.scene.getParty()[0].stats[Stat.HP] = 100; - game.scene.getParty()[0].hp = 100; - expect(game.scene.getParty()[0].formIndex).toBe(0); - - game.move.select(moveToUse); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to(DamagePhase, false); - // await game.phaseInterceptor.runFrom(DamagePhase).to(DamagePhase, false); - const damagePhase = game.scene.getCurrentPhase() as DamagePhase; - damagePhase.updateAmount(40); - await game.phaseInterceptor.runFrom(DamagePhase).to(TurnEndPhase, false); - expect(game.scene.getParty()[0].hp).toBeLessThan(100); - expect(game.scene.getParty()[0].formIndex).toBe(0); - }, - ); - - test( - "enough damage to change form", - async () => { - const moveToUse = Moves.SPLASH; - await game.startBattle([ Species.DARMANITAN ]); - game.scene.getParty()[0].stats[Stat.HP] = 1000; - game.scene.getParty()[0].hp = 100; - expect(game.scene.getParty()[0].formIndex).toBe(0); - - game.move.select(moveToUse); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to(QuietFormChangePhase); - await game.phaseInterceptor.to(TurnInitPhase, false); - expect(game.scene.getParty()[0].hp).not.toBe(100); - expect(game.scene.getParty()[0].formIndex).not.toBe(0); - }, - ); - - test( - "kill pokemon while on zen mode", - async () => { - const moveToUse = Moves.SPLASH; - await game.startBattle([ Species.DARMANITAN, Species.CHARIZARD ]); - game.scene.getParty()[0].stats[Stat.HP] = 1000; - game.scene.getParty()[0].hp = 100; - expect(game.scene.getParty()[0].formIndex).toBe(0); - - game.move.select(moveToUse); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to(DamagePhase, false); - // await game.phaseInterceptor.runFrom(DamagePhase).to(DamagePhase, false); - const damagePhase = game.scene.getCurrentPhase() as DamagePhase; - damagePhase.updateAmount(80); - await game.phaseInterceptor.runFrom(DamagePhase).to(QuietFormChangePhase); - expect(game.scene.getParty()[0].hp).not.toBe(100); - expect(game.scene.getParty()[0].formIndex).not.toBe(0); - await game.killPokemon(game.scene.getParty()[0]); - expect(game.scene.getParty()[0].isFainted()).toBe(true); - await game.phaseInterceptor.run(MessagePhase); - await game.phaseInterceptor.run(EnemyCommandPhase); - await game.phaseInterceptor.run(TurnStartPhase); - game.onNextPrompt("SwitchPhase", Mode.PARTY, () => { - game.scene.unshiftPhase(new SwitchSummonPhase(game.scene, SwitchType.SWITCH, 0, 1, false)); - game.scene.ui.setMode(Mode.MESSAGE); - }); - game.onNextPrompt("SwitchPhase", Mode.MESSAGE, () => { - game.endPhase(); - }); - await game.phaseInterceptor.run(SwitchPhase); - await game.phaseInterceptor.to(PostSummonPhase); - expect(game.scene.getParty()[1].formIndex).toBe(1); - }, - ); - - test( - "check if fainted pokemon switches to base form on arena reset", - async () => { - const baseForm = 0, - zenForm = 1; - game.override.startingWave(4); - game.override.starterForms({ - [Species.DARMANITAN]: zenForm, - }); - - await game.startBattle([ Species.MAGIKARP, Species.DARMANITAN ]); - - const darmanitan = game.scene.getParty().find((p) => p.species.speciesId === Species.DARMANITAN)!; - expect(darmanitan).not.toBe(undefined); - expect(darmanitan.formIndex).toBe(zenForm); - - darmanitan.hp = 0; - darmanitan.status = new Status(StatusEffect.FAINT); - expect(darmanitan.isFainted()).toBe(true); - - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(TurnEndPhase); - game.doSelectModifier(); - await game.phaseInterceptor.to(QuietFormChangePhase); - - expect(darmanitan.formIndex).toBe(baseForm); - }, - ); -}); diff --git a/src/test/battle/double_battle.test.ts b/src/test/battle/double_battle.test.ts deleted file mode 100644 index b7a5616d642..00000000000 --- a/src/test/battle/double_battle.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Status, StatusEffect } from "#app/data/status-effect"; -import { BattleEndPhase } from "#app/phases/battle-end-phase"; -import { TurnInitPhase } from "#app/phases/turn-init-phase"; -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("Double Battles", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - }); - - // double-battle player's pokemon both fainted in same round, then revive one, and next double battle summons two player's pokemon successfully. - // (There were bugs that either only summon one when can summon two, player stuck in switchPhase etc) - it("3v2 edge case: player summons 2 pokemon on the next battle after being fainted and revived", async () => { - game.override.battleType("double").enemyMoveset(Moves.SPLASH).moveset(Moves.SPLASH); - await game.startBattle([ - Species.BULBASAUR, - Species.CHARIZARD, - Species.SQUIRTLE, - ]); - - game.move.select(Moves.SPLASH); - game.move.select(Moves.SPLASH, 1); - - for (const pokemon of game.scene.getPlayerField()) { - pokemon.hp = 0; - pokemon.status = new Status(StatusEffect.FAINT); - expect(pokemon.isFainted()).toBe(true); - } - - await game.doKillOpponents(); - - await game.phaseInterceptor.to(BattleEndPhase); - game.doSelectModifier(); - - const charizard = game.scene.getParty().findIndex(p => p.species.speciesId === Species.CHARIZARD); - game.doRevivePokemon(charizard); - - await game.phaseInterceptor.to(TurnInitPhase); - expect(game.scene.getPlayerField().filter(p => !p.isFainted())).toHaveLength(2); - }, 20000); -}); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts deleted file mode 100644 index 208463e7064..00000000000 --- a/src/test/battle/error-handling.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -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("Error Handling", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - const moveToUse = Moves.SPLASH; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - game.override - .battleType("single") - .startingWave(3); - game.override.starterSpecies(Species.MEWTWO); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyAbility(Abilities.HYDRATION); - game.override.ability(Abilities.ZEN_MODE); - game.override.startingLevel(2000); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - }); - - it.skip("to next turn", async () => { - await game.startBattle(); - const turn = game.scene.currentBattle.turn; - game.move.select(moveToUse); - await game.toNextTurn(); - expect(game.scene.currentBattle.turn).toBeGreaterThan(turn); - }, 20000); -}); - diff --git a/src/test/battlerTags/octolock.test.ts b/src/test/battlerTags/octolock.test.ts deleted file mode 100644 index ebd92dc6401..00000000000 --- a/src/test/battlerTags/octolock.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -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 { 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"); - -describe("BattlerTag - OctolockTag", () => { - describe("lapse behavior", () => { - it("unshifts a StatStageChangePhase with expected stat stage changes", async () => { - const mockPokemon = { - scene: new BattleScene(), - getBattlerIndex: () => 0, - } as Pokemon; - - const subject = new OctolockTag(1); - - vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { - expect(phase).toBeInstanceOf(StatStageChangePhase); - expect((phase as StatStageChangePhase)["stages"]).toEqual(-1); - expect((phase as StatStageChangePhase)["stats"]).toEqual([ Stat.DEF, Stat.SPDEF ]); - }); - - subject.lapse(mockPokemon, BattlerTagLapseType.TURN_END); - - expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); - }); - }); - - 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/battlerTags/substitute.test.ts b/src/test/battlerTags/substitute.test.ts deleted file mode 100644 index af0aa63af89..00000000000 --- a/src/test/battlerTags/substitute.test.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; -import Pokemon, { MoveResult, PokemonTurnData, TurnMove, PokemonMove } from "#app/field/pokemon"; -import BattleScene from "#app/battle-scene"; -import { BattlerTagLapseType, BindTag, SubstituteTag } from "#app/data/battler-tags"; -import { Moves } from "#app/enums/moves"; -import { PokemonAnimType } from "#app/enums/pokemon-anim-type"; -import * as messages from "#app/messages"; -import { allMoves } from "#app/data/move"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; - -vi.mock("#app/battle-scene.js"); - -describe("BattlerTag - SubstituteTag", () => { - let mockPokemon: Pokemon; - - describe("onAdd behavior", () => { - beforeEach(() => { - mockPokemon = { - scene: new BattleScene(), - hp: 101, - id: 0, - getMaxHp: vi.fn().mockReturnValue(101) as Pokemon["getMaxHp"], - findAndRemoveTags: vi.fn().mockImplementation((tagFilter) => { - // simulate a Trapped tag set by another Pokemon, then expect the filter to catch it. - const trapTag = new BindTag(5, 0); - expect(tagFilter(trapTag)).toBeTruthy(); - return true; - }) as Pokemon["findAndRemoveTags"] - } as Pokemon; - - vi.spyOn(messages, "getPokemonNameWithAffix").mockReturnValue(""); - vi.spyOn(mockPokemon.scene, "getPokemonById").mockImplementation(pokemonId => mockPokemon.id === pokemonId ? mockPokemon : null); - }); - - it( - "sets the tag's HP to 1/4 of the source's max HP (rounded down)", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - - vi.spyOn(mockPokemon.scene, "triggerPokemonBattleAnim").mockReturnValue(true); - vi.spyOn(mockPokemon.scene, "queueMessage").mockReturnValue(); - - subject.onAdd(mockPokemon); - - expect(subject.hp).toBe(25); - } - ); - - it( - "triggers on-add effects that bring the source out of focus", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - - vi.spyOn(mockPokemon.scene, "triggerPokemonBattleAnim").mockImplementation( - (pokemon, battleAnimType, fieldAssets?, delayed?) => { - expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_ADD); - return true; - } - ); - - vi.spyOn(mockPokemon.scene, "queueMessage").mockReturnValue(); - - subject.onAdd(mockPokemon); - - expect(subject.sourceInFocus).toBeFalsy(); - expect(mockPokemon.scene.triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); - expect(mockPokemon.scene.queueMessage).toHaveBeenCalledTimes(1); - } - ); - - it( - "removes effects that trap the source", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - - vi.spyOn(mockPokemon.scene, "queueMessage").mockReturnValue(); - - subject.onAdd(mockPokemon); - expect(mockPokemon.findAndRemoveTags).toHaveBeenCalledTimes(1); - } - ); - }); - - describe("onRemove behavior", () => { - beforeEach(() => { - mockPokemon = { - scene: new BattleScene(), - hp: 101, - id: 0, - isFainted: vi.fn().mockReturnValue(false) as Pokemon["isFainted"] - } as Pokemon; - - vi.spyOn(messages, "getPokemonNameWithAffix").mockReturnValue(""); - }); - - it( - "triggers on-remove animation and message", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - subject.sourceInFocus = false; - - vi.spyOn(mockPokemon.scene, "triggerPokemonBattleAnim").mockImplementation( - (pokemon, battleAnimType, fieldAssets?, delayed?) => { - expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_REMOVE); - return true; - } - ); - - vi.spyOn(mockPokemon.scene, "queueMessage").mockReturnValue(); - - subject.onRemove(mockPokemon); - - expect(mockPokemon.scene.triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); - expect(mockPokemon.scene.queueMessage).toHaveBeenCalledTimes(1); - } - ); - }); - - describe("lapse behavior", () => { - beforeEach(() => { - mockPokemon = { - scene: new BattleScene(), - hp: 101, - id: 0, - turnData: { acted: true } as PokemonTurnData, - getLastXMoves: vi.fn().mockReturnValue([ { move: Moves.TACKLE, result: MoveResult.SUCCESS } as TurnMove ]) as Pokemon["getLastXMoves"], - } as Pokemon; - - vi.spyOn(messages, "getPokemonNameWithAffix").mockReturnValue(""); - }); - - it( - "PRE_MOVE lapse triggers pre-move animation", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - - vi.spyOn(mockPokemon.scene, "triggerPokemonBattleAnim").mockImplementation( - (pokemon, battleAnimType, fieldAssets?, delayed?) => { - expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_PRE_MOVE); - return true; - } - ); - - vi.spyOn(mockPokemon.scene, "queueMessage").mockReturnValue(); - - expect(subject.lapse(mockPokemon, BattlerTagLapseType.PRE_MOVE)).toBeTruthy(); - - expect(subject.sourceInFocus).toBeTruthy(); - expect(mockPokemon.scene.triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); - expect(mockPokemon.scene.queueMessage).not.toHaveBeenCalled(); - } - ); - - it( - "AFTER_MOVE lapse triggers post-move animation", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - - vi.spyOn(mockPokemon.scene, "triggerPokemonBattleAnim").mockImplementation( - (pokemon, battleAnimType, fieldAssets?, delayed?) => { - expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_POST_MOVE); - return true; - } - ); - - vi.spyOn(mockPokemon.scene, "queueMessage").mockReturnValue(); - - expect(subject.lapse(mockPokemon, BattlerTagLapseType.AFTER_MOVE)).toBeTruthy(); - - expect(subject.sourceInFocus).toBeFalsy(); - expect(mockPokemon.scene.triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); - expect(mockPokemon.scene.queueMessage).not.toHaveBeenCalled(); - } - ); - - /** TODO: Figure out how to mock a MoveEffectPhase correctly for this test */ - it.skip( - "HIT lapse triggers on-hit message", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - - vi.spyOn(mockPokemon.scene, "triggerPokemonBattleAnim").mockReturnValue(true); - vi.spyOn(mockPokemon.scene, "queueMessage").mockReturnValue(); - - const pokemonMove = { - getMove: vi.fn().mockReturnValue(allMoves[Moves.TACKLE]) as PokemonMove["getMove"] - } as PokemonMove; - - const moveEffectPhase = { - move: pokemonMove, - getUserPokemon: vi.fn().mockReturnValue(undefined) as MoveEffectPhase["getUserPokemon"] - } as MoveEffectPhase; - - vi.spyOn(mockPokemon.scene, "getCurrentPhase").mockReturnValue(moveEffectPhase); - vi.spyOn(allMoves[Moves.TACKLE], "hitsSubstitute").mockReturnValue(true); - - expect(subject.lapse(mockPokemon, BattlerTagLapseType.HIT)).toBeTruthy(); - - expect(mockPokemon.scene.triggerPokemonBattleAnim).not.toHaveBeenCalled(); - expect(mockPokemon.scene.queueMessage).toHaveBeenCalledTimes(1); - } - ); - - it( - "CUSTOM lapse flags the tag for removal", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - - vi.spyOn(mockPokemon.scene, "triggerPokemonBattleAnim").mockReturnValue(true); - vi.spyOn(mockPokemon.scene, "queueMessage").mockReturnValue(); - - expect(subject.lapse(mockPokemon, BattlerTagLapseType.CUSTOM)).toBeFalsy(); - } - ); - - it( - "Unsupported lapse type does nothing", - async () => { - const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); - - vi.spyOn(mockPokemon.scene, "triggerPokemonBattleAnim").mockReturnValue(true); - vi.spyOn(mockPokemon.scene, "queueMessage").mockReturnValue(); - - expect(subject.lapse(mockPokemon, BattlerTagLapseType.TURN_END)).toBeTruthy(); - - expect(mockPokemon.scene.triggerPokemonBattleAnim).not.toHaveBeenCalled(); - expect(mockPokemon.scene.queueMessage).not.toHaveBeenCalled(); - } - ); - }); -}); diff --git a/src/test/enemy_command.test.ts b/src/test/enemy_command.test.ts deleted file mode 100644 index 49419f5b34d..00000000000 --- a/src/test/enemy_command.test.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { allMoves, MoveCategory } from "#app/data/move"; -import { Abilities } from "#app/enums/abilities"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; -import { AiType, EnemyPokemon } from "#app/field/pokemon"; -import { randSeedInt } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - - -const NUM_TRIALS = 300; - -type MoveChoiceSet = { [key: number]: number }; - -function getEnemyMoveChoices(pokemon: EnemyPokemon, moveChoices: MoveChoiceSet): void { - // Use an unseeded random number generator in place of the mocked-out randBattleSeedInt - vi.spyOn(pokemon.scene, "randBattleSeedInt").mockImplementation((range, min?) => { - return randSeedInt(range, min); - }); - for (let i = 0; i < NUM_TRIALS; i++) { - const queuedMove = pokemon.getNextMove(); - moveChoices[queuedMove.move]++; - } - - for (const [ moveId, count ] of Object.entries(moveChoices)) { - console.log(`Move: ${allMoves[moveId].name} Count: ${count} (${count / NUM_TRIALS * 100}%)`); - } -} - -describe("Enemy Commands - Move Selection", () => { - 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 - .ability(Abilities.BALL_FETCH) - .enemyAbility(Abilities.BALL_FETCH); - }); - - it( - "should never use Status moves if an attack can KO", - async () => { - game.override - .enemySpecies(Species.ETERNATUS) - .enemyMoveset([ Moves.ETERNABEAM, Moves.SLUDGE_BOMB, Moves.DRAGON_DANCE, Moves.COSMIC_POWER ]) - .startingLevel(1) - .enemyLevel(100); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.aiType = AiType.SMART_RANDOM; - - const moveChoices: MoveChoiceSet = {}; - const enemyMoveset = enemyPokemon.getMoveset(); - enemyMoveset.forEach(mv => moveChoices[mv!.moveId] = 0); - getEnemyMoveChoices(enemyPokemon, moveChoices); - - enemyMoveset.forEach(mv => { - if (mv?.getMove().category === MoveCategory.STATUS) { - expect(moveChoices[mv.moveId]).toBe(0); - } - }); - } - ); - - it( - "should not select Last Resort if it would fail, even if the move KOs otherwise", - async () => { - game.override - .enemySpecies(Species.KANGASKHAN) - .enemyMoveset([ Moves.LAST_RESORT, Moves.GIGA_IMPACT, Moves.SPLASH, Moves.SWORDS_DANCE ]) - .startingLevel(1) - .enemyLevel(100); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - enemyPokemon.aiType = AiType.SMART_RANDOM; - - const moveChoices: MoveChoiceSet = {}; - const enemyMoveset = enemyPokemon.getMoveset(); - enemyMoveset.forEach(mv => moveChoices[mv!.moveId] = 0); - getEnemyMoveChoices(enemyPokemon, moveChoices); - - enemyMoveset.forEach(mv => { - if (mv?.getMove().category === MoveCategory.STATUS || mv?.moveId === Moves.LAST_RESORT) { - expect(moveChoices[mv.moveId]).toBe(0); - } - }); - } - ); -}); diff --git a/src/test/field/pokemon.test.ts b/src/test/field/pokemon.test.ts deleted file mode 100644 index aeaecab5874..00000000000 --- a/src/test/field/pokemon.test.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Species } from "#app/enums/species"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "../utils/gameManager"; -import { PokeballType } from "#app/enums/pokeball"; -import BattleScene from "#app/battle-scene"; -import { Moves } from "#app/enums/moves"; - -describe("Spec - Pokemon", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - }); - - it("should not crash when trying to set status of undefined", async () => { - await game.classicMode.runToSummon([ Species.ABRA ]); - - const pkm = game.scene.getPlayerPokemon()!; - expect(pkm).toBeDefined(); - - expect(pkm.trySetStatus(undefined)).toBe(true); - }); - - describe("Add To Party", () => { - let scene: BattleScene; - - beforeEach(async () => { - game.override.enemySpecies(Species.ZUBAT); - await game.classicMode.runToSummon([ Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA ]); // 5 Abra, only 1 slot left - scene = game.scene; - }); - - it("should append a new pokemon by default", async () => { - const zubat = scene.getEnemyPokemon()!; - zubat.addToParty(PokeballType.LUXURY_BALL); - - const party = scene.getParty(); - expect(party).toHaveLength(6); - party.forEach((pkm, index) =>{ - expect(pkm.species.speciesId).toBe(index === 5 ? Species.ZUBAT : Species.ABRA); - }); - }); - - it("should put a new pokemon into the passed slotIndex", async () => { - const slotIndex = 1; - const zubat = scene.getEnemyPokemon()!; - zubat.addToParty(PokeballType.LUXURY_BALL, slotIndex); - - const party = scene.getParty(); - expect(party).toHaveLength(6); - party.forEach((pkm, index) =>{ - expect(pkm.species.speciesId).toBe(index === slotIndex ? Species.ZUBAT : Species.ABRA); - }); - }); - }); - - it("should not share tms between different forms", async () => { - game.override.starterForms({ [Species.ROTOM]: 4 }); - - await game.classicMode.startBattle([ Species.ROTOM ]); - - const fanRotom = game.scene.getPlayerPokemon()!; - - expect(fanRotom.compatibleTms).not.toContain(Moves.BLIZZARD); - expect(fanRotom.compatibleTms).toContain(Moves.AIR_SLASH); - }); -}); diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts deleted file mode 100644 index 74158089c77..00000000000 --- a/src/test/items/thick_club.test.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { Stat } from "#enums/stat"; -import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; -import { modifierTypes } from "#app/modifier/modifier-type"; -import i18next from "#app/plugins/i18n"; -import * as Utils from "#app/utils"; -import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import Phase from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - -describe("Items - Thick Club", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phase.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - - game.override.battleType("single"); - }); - - it("THICK_CLUB activates in battle correctly", async() => { - game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); - const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ - Species.CUBONE - ]); - - const partyMember = game.scene.getParty()[0]; - - // Checking console log to make sure Thick Club is applied when getEffectiveStat (with the appropriate stat) is called - partyMember.getEffectiveStat(Stat.DEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); - - // Printing dummy console messages along the way so subsequent checks don't pass because of the first - console.log(""); - - partyMember.getEffectiveStat(Stat.SPDEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); - - console.log(""); - - partyMember.getEffectiveStat(Stat.ATK); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); - - console.log(""); - - partyMember.getEffectiveStat(Stat.SPATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); - - console.log(""); - - partyMember.getEffectiveStat(Stat.SPD); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); - }); - - it("THICK_CLUB held by CUBONE", async() => { - await game.startBattle([ - Species.CUBONE - ]); - - const partyMember = game.scene.getParty()[0]; - - const atkStat = partyMember.getStat(Stat.ATK); - - // Making sure modifier is not applied without holding item - const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(1); - - // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(2); - }, 20000); - - it("THICK_CLUB held by MAROWAK", async() => { - await game.startBattle([ - Species.MAROWAK - ]); - - const partyMember = game.scene.getParty()[0]; - - const atkStat = partyMember.getStat(Stat.ATK); - - // Making sure modifier is not applied without holding item - const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(1); - - // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(2); - }, 20000); - - it("THICK_CLUB held by ALOLA_MAROWAK", async() => { - await game.startBattle([ - Species.ALOLA_MAROWAK - ]); - - const partyMember = game.scene.getParty()[0]; - - const atkStat = partyMember.getStat(Stat.ATK); - - // Making sure modifier is not applied without holding item - const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(1); - - // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(2); - }, 20000); - - it("THICK_CLUB held by fused CUBONE line (base)", async() => { - // Randomly choose from the Cubone line - const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; - const randSpecies = Utils.randInt(species.length); - - await game.startBattle([ - species[randSpecies], - Species.PIKACHU - ]); - - const partyMember = game.scene.getParty()[0]; - const ally = game.scene.getParty()[1]; - - // Fuse party members (taken from PlayerPokemon.fuse(...) function) - partyMember.fusionSpecies = ally.species; - partyMember.fusionFormIndex = ally.formIndex; - partyMember.fusionAbilityIndex = ally.abilityIndex; - partyMember.fusionShiny = ally.shiny; - partyMember.fusionVariant = ally.variant; - partyMember.fusionGender = ally.gender; - partyMember.fusionLuck = ally.luck; - - const atkStat = partyMember.getStat(Stat.ATK); - - // Making sure modifier is not applied without holding item - const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(1); - - // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(2); - }, 20000); - - it("THICK_CLUB held by fused CUBONE line (part)", async() => { - // Randomly choose from the Cubone line - const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; - const randSpecies = Utils.randInt(species.length); - - await game.startBattle([ - Species.PIKACHU, - species[randSpecies] - ]); - - const partyMember = game.scene.getParty()[0]; - const ally = game.scene.getParty()[1]; - - // Fuse party members (taken from PlayerPokemon.fuse(...) function) - partyMember.fusionSpecies = ally.species; - partyMember.fusionFormIndex = ally.formIndex; - partyMember.fusionAbilityIndex = ally.abilityIndex; - partyMember.fusionShiny = ally.shiny; - partyMember.fusionVariant = ally.variant; - partyMember.fusionGender = ally.gender; - partyMember.fusionLuck = ally.luck; - - const atkStat = partyMember.getStat(Stat.ATK); - - // Making sure modifier is not applied without holding item - const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(1); - - // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(2); - }, 20000); - - it("THICK_CLUB not held by CUBONE", async() => { - await game.startBattle([ - Species.PIKACHU - ]); - - const partyMember = game.scene.getParty()[0]; - - const atkStat = partyMember.getStat(Stat.ATK); - - // Making sure modifier is not applied without holding item - const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(1); - - // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - - expect(atkValue.value / atkStat).toBe(1); - }, 20000); -}); diff --git a/src/test/moves/autotomize.test.ts b/src/test/moves/autotomize.test.ts deleted file mode 100644 index e15642b7ce5..00000000000 --- a/src/test/moves/autotomize.test.ts +++ /dev/null @@ -1,98 +0,0 @@ -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"; - -describe("Moves - Autotomize", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - const TIMEOUT = 20 * 1000; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - game.override - .moveset([ Moves.AUTOTOMIZE, Moves.KINGS_SHIELD, Moves.FALSE_SWIPE ]) - .battleType("single") - .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.SPLASH); - }); - - it("Autotomize should reduce weight", async () => { - const baseDracozoltWeight = 190; - const oneAutotomizeDracozoltWeight = 90; - const twoAutotomizeDracozoltWeight = 0.1; - const threeAutotomizeDracozoltWeight = 0.1; - - await game.classicMode.startBattle([ Species.DRACOZOLT ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - expect(playerPokemon.getWeight()).toBe(baseDracozoltWeight); - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(oneAutotomizeDracozoltWeight); - - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(twoAutotomizeDracozoltWeight); - - - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(threeAutotomizeDracozoltWeight); - }, TIMEOUT); - - it("Changing forms should revert weight", async () => { - const baseAegislashWeight = 53; - const autotomizeAegislashWeight = 0.1; - - await game.classicMode.startBattle([ Species.AEGISLASH ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - - expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); - - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); - - // Transform to sword form - game.move.select(Moves.FALSE_SWIPE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); - - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); - - // Transform to shield form - game.move.select(Moves.KINGS_SHIELD); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); - - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); - }, TIMEOUT); - - it("Autotomize should interact with light metal correctly", async () => { - const baseLightGroudonWeight = 475; - const autotomizeLightGroudonWeight = 425; - game.override.ability(Abilities.LIGHT_METAL); - await game.classicMode.startBattle([ Species.GROUDON ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - expect(playerPokemon.getWeight()).toBe(baseLightGroudonWeight); - game.move.select(Moves.AUTOTOMIZE); - await game.toNextTurn(); - expect(playerPokemon.getWeight()).toBe(autotomizeLightGroudonWeight); - }, TIMEOUT); -}); diff --git a/src/test/moves/baneful_bunker.test.ts b/src/test/moves/baneful_bunker.test.ts deleted file mode 100644 index a0fc0f21ee2..00000000000 --- a/src/test/moves/baneful_bunker.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { BattlerIndex } from "#app/battle"; -import { StatusEffect } from "#app/enums/status-effect"; - - -describe("Moves - Baneful Bunker", () => { - 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.moveset(Moves.SLASH); - - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset(Moves.BANEFUL_BUNKER); - - game.override.startingLevel(100); - game.override.enemyLevel(100); - }); - test( - "should protect the user and poison attackers that make contact", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.SLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); - } - ); - test( - "should protect the user and poison attackers that make contact, regardless of accuracy checks", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.SLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - await game.move.forceMiss(); - await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); - } - ); - - test( - "should not poison attackers that don't make contact", - async () => { - game.override.moveset(Moves.FLASH_CANNON); - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.FLASH_CANNON); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - await game.move.forceMiss(); - await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeFalsy(); - } - ); -}); diff --git a/src/test/moves/beak_blast.test.ts b/src/test/moves/beak_blast.test.ts deleted file mode 100644 index 0c1e7bbeed9..00000000000 --- a/src/test/moves/beak_blast.test.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { StatusEffect } from "#app/enums/status-effect"; -import { BerryPhase } from "#app/phases/berry-phase"; -import { MovePhase } from "#app/phases/move-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -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 - Beak Blast", () => { - 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") - .ability(Abilities.UNNERVE) - .moveset([ Moves.BEAK_BLAST ]) - .enemySpecies(Species.SNORLAX) - .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset([ Moves.TACKLE ]) - .startingLevel(100) - .enemyLevel(100); - }); - - it( - "should add a charge effect that burns attackers on contact", - async () => { - await game.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.BEAK_BLAST); - - await game.phaseInterceptor.to(MovePhase, false); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); - - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); - } - ); - - it( - "should still charge and burn opponents if the user is sleeping", - async () => { - game.override.statusEffect(StatusEffect.SLEEP); - - await game.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.BEAK_BLAST); - - await game.phaseInterceptor.to(MovePhase, false); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); - - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); - } - ); - - it( - "should not burn attackers that don't make contact", - async () => { - game.override.enemyMoveset([ Moves.WATER_GUN ]); - - await game.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.BEAK_BLAST); - - await game.phaseInterceptor.to(MovePhase, false); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); - - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); - } - ); - - it( - "should only hit twice with Multi-Lens", - async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - - await game.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.BEAK_BLAST); - - await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon.turnData.hitCount).toBe(2); - } - ); - - it( - "should be blocked by Protect", - async () => { - game.override.enemyMoveset([ Moves.PROTECT ]); - - await game.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.BEAK_BLAST); - - await game.phaseInterceptor.to(MovePhase, false); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); - - await game.phaseInterceptor.to(TurnEndPhase); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeUndefined(); - } - ); -}); diff --git a/src/test/moves/beat_up.test.ts b/src/test/moves/beat_up.test.ts deleted file mode 100644 index e51ac6ea452..00000000000 --- a/src/test/moves/beat_up.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { Abilities } from "#app/enums/abilities"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; -import { StatusEffect } from "#app/enums/status-effect"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - -describe("Moves - Beat Up", () => { - 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); - game.override.enemyLevel(100); - game.override.enemyMoveset([ Moves.SPLASH ]); - game.override.enemyAbility(Abilities.INSOMNIA); - - game.override.startingLevel(100); - game.override.moveset([ Moves.BEAT_UP ]); - }); - - it( - "should hit once for each healthy player Pokemon", - async () => { - await game.startBattle([ Species.MAGIKARP, Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.PIKACHU, Species.EEVEE ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - let enemyStartingHp = enemyPokemon.hp; - - game.move.select(Moves.BEAT_UP); - - await game.phaseInterceptor.to(MoveEffectPhase); - - expect(playerPokemon.turnData.hitCount).toBe(6); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - - while (playerPokemon.turnData.hitsLeft > 0) { - enemyStartingHp = enemyPokemon.hp; - await game.phaseInterceptor.to(MoveEffectPhase); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - } - } - ); - - it( - "should not count player Pokemon with status effects towards hit count", - async () => { - await game.startBattle([ Species.MAGIKARP, Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.PIKACHU, Species.EEVEE ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - - game.scene.getParty()[1].trySetStatus(StatusEffect.BURN); - - game.move.select(Moves.BEAT_UP); - - await game.phaseInterceptor.to(MoveEffectPhase); - - expect(playerPokemon.turnData.hitCount).toBe(5); - } - ); - - it( - "should hit twice for each player Pokemon if the user has Multi-Lens", - async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.startBattle([ Species.MAGIKARP, Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.PIKACHU, Species.EEVEE ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - let enemyStartingHp = enemyPokemon.hp; - - game.move.select(Moves.BEAT_UP); - - await game.phaseInterceptor.to(MoveEffectPhase); - - expect(playerPokemon.turnData.hitCount).toBe(12); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - - while (playerPokemon.turnData.hitsLeft > 0) { - enemyStartingHp = enemyPokemon.hp; - await game.phaseInterceptor.to(MoveEffectPhase); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - } - } - ); -}); diff --git a/src/test/moves/belly_drum.test.ts b/src/test/moves/belly_drum.test.ts deleted file mode 100644 index 0bed1248e7e..00000000000 --- a/src/test/moves/belly_drum.test.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { toDmgValue } from "#app/utils"; -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, test } from "vitest"; -import { Abilities } from "#app/enums/abilities"; - - -// RATIO : HP Cost of Move -const RATIO = 2; -// PREDAMAGE : Amount of extra HP lost -const PREDAMAGE = 15; - -describe("Moves - BELLY DRUM", () => { - 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 - .starterSpecies(Species.MAGIKARP) - .enemySpecies(Species.SNORLAX) - .startingLevel(100) - .enemyLevel(100) - .moveset([ Moves.BELLY_DRUM ]) - .enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.BALL_FETCH); - }); - - // Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Belly_Drum_(move) - - test("raises the user's ATK stat stage to its max, at the cost of 1/2 of its maximum HP", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - - game.move.select(Moves.BELLY_DRUM); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - } - ); - - test("will still take effect if an uninvolved stat stage is at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - - // Here - Stat.ATK -> -3 and Stat.SPATK -> 6 - leadPokemon.setStatStage(Stat.ATK, -3); - leadPokemon.setStatStage(Stat.SPATK, 6); - - game.move.select(Moves.BELLY_DRUM); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); - } - ); - - test("fails if the pokemon's ATK stat stage is at its maximum", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.setStatStage(Stat.ATK, 6); - - game.move.select(Moves.BELLY_DRUM); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - } - ); - - test("fails if the user's health is less than 1/2", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - leadPokemon.hp = hpLost - PREDAMAGE; - - game.move.select(Moves.BELLY_DRUM); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - } - ); -}); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts deleted file mode 100644 index 88c8c8cf011..00000000000 --- a/src/test/moves/ceaseless_edge.test.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; -import { allMoves } from "#app/data/move"; -import { Abilities } from "#app/enums/abilities"; -import { ArenaTagType } from "#app/enums/arena-tag-type"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -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, test, vi } from "vitest"; - - -describe("Moves - Ceaseless Edge", () => { - 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.RATTATA); - game.override.enemyAbility(Abilities.RUN_AWAY); - game.override.enemyPassiveAbility(Abilities.RUN_AWAY); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override.moveset([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); - - }); - - test( - "move should hit and apply spikes", - async () => { - await game.startBattle([ Species.ILLUMISE ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - const enemyStartingHp = enemyPokemon.hp; - - game.move.select(Moves.CEASELESS_EDGE); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Spikes should not have any layers before move effect is applied - const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); - - await game.phaseInterceptor.to(TurnEndPhase); - const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); - expect(tagAfter.layers).toBe(1); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - } - ); - - test( - "move should hit twice with multi lens and apply two layers of spikes", - async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS" }]); - await game.startBattle([ Species.ILLUMISE ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - const enemyStartingHp = enemyPokemon.hp; - - game.move.select(Moves.CEASELESS_EDGE); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Spikes should not have any layers before move effect is applied - const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); - - await game.phaseInterceptor.to(TurnEndPhase); - const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); - expect(tagAfter.layers).toBe(2); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - } - ); - - test( - "trainer - move should hit twice, apply two layers of spikes, force switch opponent - opponent takes damage", - async () => { - game.override.startingHeldItems([{ name: "MULTI_LENS" }]); - game.override.startingWave(5); - - await game.startBattle([ Species.ILLUMISE ]); - - game.move.select(Moves.CEASELESS_EDGE); - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Spikes should not have any layers before move effect is applied - const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); - - await game.phaseInterceptor.to(TurnEndPhase, false); - const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; - expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); - expect(tagAfter.layers).toBe(2); - - const hpBeforeSpikes = game.scene.currentBattle.enemyParty[1].hp; - // Check HP of pokemon that WILL BE switched in (index 1) - game.forceEnemyToSwitch(); - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase, false); - expect(game.scene.currentBattle.enemyParty[0].hp).toBeLessThan(hpBeforeSpikes); - } - ); -}); diff --git a/src/test/moves/clangorous_soul.test.ts b/src/test/moves/clangorous_soul.test.ts deleted file mode 100644 index 52e980cc4fa..00000000000 --- a/src/test/moves/clangorous_soul.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import { Stat } from "#enums/stat"; - - -/** HP Cost of Move */ -const RATIO = 3; -/** Amount of extra HP lost */ -const PREDAMAGE = 15; - -describe("Moves - Clangorous Soul", () => { - 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.starterSpecies(Species.MAGIKARP); - game.override.enemySpecies(Species.SNORLAX); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override.moveset([ Moves.CLANGOROUS_SOUL ]); - game.override.enemyMoveset(Moves.SPLASH); - }); - - //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move) - - it("raises the user's ATK, DEF, SPATK, SPDEF, and SPD stat stages by 1 each at the cost of 1/3 of its maximum HP", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); - - game.move.select(Moves.CLANGOROUS_SOUL); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(1); - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(1); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(1); - expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(1); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1); - } - ); - - it("will still take effect if one or more of the involved stat stages are not at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); - - //Here - Stat.SPD -> 0 and Stat.SPDEF -> 4 - leadPokemon.setStatStage(Stat.ATK, 6); - leadPokemon.setStatStage(Stat.DEF, 6); - leadPokemon.setStatStage(Stat.SPATK, 6); - leadPokemon.setStatStage(Stat.SPDEF, 4); - - game.move.select(Moves.CLANGOROUS_SOUL); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(5); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1); - } - ); - - it("fails if all stat stages involved are at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.setStatStage(Stat.ATK, 6); - leadPokemon.setStatStage(Stat.DEF, 6); - leadPokemon.setStatStage(Stat.SPATK, 6); - leadPokemon.setStatStage(Stat.SPDEF, 6); - leadPokemon.setStatStage(Stat.SPD, 6); - - game.move.select(Moves.CLANGOROUS_SOUL); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6); - } - ); - - it("fails if the user's health is less than 1/3", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); - leadPokemon.hp = hpLost - PREDAMAGE; - - game.move.select(Moves.CLANGOROUS_SOUL); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0); - } - ); -}); diff --git a/src/test/moves/crafty_shield.test.ts b/src/test/moves/crafty_shield.test.ts deleted file mode 100644 index 93dd4a02538..00000000000 --- a/src/test/moves/crafty_shield.test.ts +++ /dev/null @@ -1,123 +0,0 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Stat } from "#enums/stat"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { BerryPhase } from "#app/phases/berry-phase"; -import { CommandPhase } from "#app/phases/command-phase"; - - -describe("Moves - Crafty Shield", () => { - 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("double"); - - game.override.moveset([ Moves.CRAFTY_SHIELD, Moves.SPLASH, Moves.SWORDS_DANCE ]); - - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.GROWL ]); - game.override.enemyAbility(Abilities.INSOMNIA); - - game.override.startingLevel(100); - game.override.enemyLevel(100); - }); - - test( - "should protect the user and allies from status moves", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.CRAFTY_SHIELD); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); - } - ); - - test( - "should not protect the user and allies from attack moves", - async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); - - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.CRAFTY_SHIELD); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); - } - ); - - test( - "should protect the user and allies from moves that ignore other protection", - async () => { - game.override.enemySpecies(Species.DUSCLOPS); - game.override.enemyMoveset([ Moves.CURSE ]); - - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.CRAFTY_SHIELD); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.getTag(BattlerTagType.CURSED)).toBeUndefined()); - } - ); - - test( - "should not block allies' self-targeted moves", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.CRAFTY_SHIELD); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SWORDS_DANCE, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(leadPokemon[0].getStatStage(Stat.ATK)).toBe(0); - expect(leadPokemon[1].getStatStage(Stat.ATK)).toBe(2); - } - ); -}); diff --git a/src/test/moves/dragon_tail.test.ts b/src/test/moves/dragon_tail.test.ts deleted file mode 100644 index cf801eb42c1..00000000000 --- a/src/test/moves/dragon_tail.test.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; -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("Moves - Dragon Tail", () => { - 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") - .moveset([ Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER ]) - .enemySpecies(Species.WAILORD) - .enemyMoveset(Moves.SPLASH) - .startingLevel(5) - .enemyLevel(5); - - vi.spyOn(allMoves[Moves.DRAGON_TAIL], "accuracy", "get").mockReturnValue(100); - }); - - it("should cause opponent to flee, and not crash", async () => { - await game.classicMode.startBattle([ Species.DRATINI ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.DRAGON_TAIL); - - await game.phaseInterceptor.to("BerryPhase"); - - const isVisible = enemyPokemon.visible; - const hasFled = enemyPokemon.switchOutStatus; - expect(!isVisible && hasFled).toBe(true); - - // simply want to test that the game makes it this far without crashing - await game.phaseInterceptor.to("BattleEndPhase"); - }); - - it("should cause opponent to flee, display ability, and not crash", async () => { - game.override.enemyAbility(Abilities.ROUGH_SKIN); - await game.classicMode.startBattle([ Species.DRATINI ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.DRAGON_TAIL); - - await game.phaseInterceptor.to("BerryPhase"); - - const isVisible = enemyPokemon.visible; - const hasFled = enemyPokemon.switchOutStatus; - expect(!isVisible && hasFled).toBe(true); - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - }); - - it("should proceed without crashing in a double battle", async () => { - game.override - .battleType("double").enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.ROUGH_SKIN); - await game.classicMode.startBattle([ Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD ]); - - const leadPokemon = game.scene.getParty()[0]!; - - const enemyLeadPokemon = game.scene.getEnemyParty()[0]!; - const enemySecPokemon = game.scene.getEnemyParty()[1]!; - - game.move.select(Moves.DRAGON_TAIL, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to("TurnEndPhase"); - - const isVisibleLead = enemyLeadPokemon.visible; - const hasFledLead = enemyLeadPokemon.switchOutStatus; - const isVisibleSec = enemySecPokemon.visible; - const hasFledSec = enemySecPokemon.switchOutStatus; - expect(!isVisibleLead && hasFledLead && isVisibleSec && !hasFledSec).toBe(true); - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - - // second turn - game.move.select(Moves.FLAMETHROWER, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to("BerryPhase"); - expect(enemySecPokemon.hp).toBeLessThan(enemySecPokemon.getMaxHp()); - }); - - it("should redirect targets upon opponent flee", async () => { - game.override - .battleType("double") - .enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.ROUGH_SKIN); - await game.classicMode.startBattle([ Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD ]); - - const leadPokemon = game.scene.getParty()[0]!; - const secPokemon = game.scene.getParty()[1]!; - - const enemyLeadPokemon = game.scene.getEnemyParty()[0]!; - const enemySecPokemon = game.scene.getEnemyParty()[1]!; - - game.move.select(Moves.DRAGON_TAIL, 0, BattlerIndex.ENEMY); - // target the same pokemon, second move should be redirected after first flees - game.move.select(Moves.DRAGON_TAIL, 1, BattlerIndex.ENEMY); - - await game.phaseInterceptor.to("BerryPhase"); - - const isVisibleLead = enemyLeadPokemon.visible; - const hasFledLead = enemyLeadPokemon.switchOutStatus; - const isVisibleSec = enemySecPokemon.visible; - const hasFledSec = enemySecPokemon.switchOutStatus; - expect(!isVisibleLead && hasFledLead && !isVisibleSec && hasFledSec).toBe(true); - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - expect(secPokemon.hp).toBeLessThan(secPokemon.getMaxHp()); - expect(enemyLeadPokemon.hp).toBeLessThan(enemyLeadPokemon.getMaxHp()); - expect(enemySecPokemon.hp).toBeLessThan(enemySecPokemon.getMaxHp()); - }); - - it("doesn't switch out if the target has suction cups", async () => { - game.override.enemyAbility(Abilities.SUCTION_CUPS); - await game.classicMode.startBattle([ Species.REGIELEKI ]); - - const enemy = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.DRAGON_TAIL); - await game.phaseInterceptor.to("TurnEndPhase"); - - expect(enemy.isFullHp()).toBe(false); - }); - - it("should force a switch upon fainting an opponent normally", async () => { - game.override.startingWave(5) - .startingLevel(1000); // To make sure Dragon Tail KO's the opponent - await game.classicMode.startBattle([ Species.DRATINI ]); - - game.move.select(Moves.DRAGON_TAIL); - - await game.toNextTurn(); - - // Make sure the enemy switched to a healthy Pokemon - const enemy = game.scene.getEnemyPokemon()!; - expect(enemy).toBeDefined(); - expect(enemy.isFullHp()).toBe(true); - - // Make sure the enemy has a fainted Pokemon in their party and not on the field - const faintedEnemy = game.scene.getEnemyParty().find(p => !p.isAllowedInBattle()); - expect(faintedEnemy).toBeDefined(); - expect(game.scene.getEnemyField().length).toBe(1); - }); - - it("should not cause a softlock when activating an opponent trainer's reviver seed", async () => { - game.override.startingWave(5) - .enemyHeldItems([{ name: "REVIVER_SEED" }]) - .startingLevel(1000); // To make sure Dragon Tail KO's the opponent - await game.classicMode.startBattle([ Species.DRATINI ]); - - game.move.select(Moves.DRAGON_TAIL); - - await game.toNextTurn(); - - // Make sure the enemy field is not empty and has a revived Pokemon - const enemy = game.scene.getEnemyPokemon()!; - expect(enemy).toBeDefined(); - expect(enemy.hp).toBe(Math.floor(enemy.getMaxHp() / 2)); - expect(game.scene.getEnemyField().length).toBe(1); - }); - - it("should not cause a softlock when activating a player's reviver seed", async () => { - game.override.startingHeldItems([{ name: "REVIVER_SEED" }]) - .enemyMoveset(Moves.DRAGON_TAIL) - .enemyLevel(1000); // To make sure Dragon Tail KO's the player - await game.classicMode.startBattle([ Species.DRATINI, Species.BULBASAUR ]); - - game.move.select(Moves.SPLASH); - - await game.toNextTurn(); - - // Make sure the player's field is not empty and has a revived Pokemon - const dratini = game.scene.getPlayerPokemon()!; - expect(dratini).toBeDefined(); - expect(dratini.hp).toBe(Math.floor(dratini.getMaxHp() / 2)); - expect(game.scene.getPlayerField().length).toBe(1); - }); -}); diff --git a/src/test/moves/effectiveness.test.ts b/src/test/moves/effectiveness.test.ts deleted file mode 100644 index d1903c79844..00000000000 --- a/src/test/moves/effectiveness.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { allMoves } from "#app/data/move"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { TrainerSlot } from "#app/data/trainer-config"; -import { Type } from "#app/data/type"; -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 GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; - -function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Species, - 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 }]); - } - - const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5); - const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE); - - expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected); - user.destroy(); - target.destroy(); -} - -describe("Moves - Type Effectiveness", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - game = new GameManager(phaserGame); - TerastallizeModifier.prototype.apply = (args) => true; - - game.override.ability(Abilities.BALL_FETCH); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - it("Normal-type attacks are neutrally effective against Normal-type Pokemon", - () => testMoveEffectiveness(game, Moves.TACKLE, Species.SNORLAX, 1) - ); - - it("Normal-type attacks are not very effective against Steel-type Pokemon", - () => testMoveEffectiveness(game, Moves.TACKLE, Species.REGISTEEL, 0.5) - ); - - it("Normal-type attacks are doubly resisted by Steel/Rock-type Pokemon", - () => testMoveEffectiveness(game, Moves.TACKLE, Species.AGGRON, 0.25) - ); - - it("Normal-type attacks have no effect on Ghost-type Pokemon", - () => testMoveEffectiveness(game, Moves.TACKLE, Species.DUSCLOPS, 0) - ); - - it("Normal-type status moves are not affected by type matchups", - () => testMoveEffectiveness(game, Moves.GROWL, Species.DUSCLOPS, 1) - ); - - it("Electric-type attacks are super-effective against Water-type Pokemon", - () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.BLASTOISE, 2) - ); - - it("Electric-type attacks are doubly super-effective against Water/Flying-type Pokemon", - () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 4) - ); - - it("Electric-type attacks are negated by Volt Absorb", - () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 0, Abilities.VOLT_ABSORB) - ); - - it("Electric-type attacks are super-effective against Tera-Water Pokemon", - () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.EXCADRILL, 2, Abilities.BALL_FETCH, Type.WATER) - ); - - it("Powder moves have no effect on Grass-type Pokemon", - () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.AMOONGUSS, 0) - ); - - it("Powder moves have no effect on Tera-Grass Pokemon", - () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.GRASS) - ); - - it("Prankster-boosted status moves have no effect on Dark-type Pokemon", - () => { - game.override.ability(Abilities.PRANKSTER); - testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.MIGHTYENA, 0); - } - ); - - it("Prankster-boosted status moves have no effect on Tera-Dark Pokemon", - () => { - game.override.ability(Abilities.PRANKSTER); - testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.DARK); - } - ); -}); diff --git a/src/test/moves/fillet_away.test.ts b/src/test/moves/fillet_away.test.ts deleted file mode 100644 index aa3243270cb..00000000000 --- a/src/test/moves/fillet_away.test.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { toDmgValue } from "#app/utils"; -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, test } from "vitest"; - - -/** HP Cost of Move */ -const RATIO = 2; -/** Amount of extra HP lost */ -const PREDAMAGE = 15; - -describe("Moves - FILLET AWAY", () => { - 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.starterSpecies(Species.MAGIKARP); - game.override.enemySpecies(Species.SNORLAX); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override.moveset([ Moves.FILLET_AWAY ]); - game.override.enemyMoveset(Moves.SPLASH); - }); - - //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move) - - test("raises the user's ATK, SPATK, and SPD stat stages by 2 each, at the cost of 1/2 of its maximum HP", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - - game.move.select(Moves.FILLET_AWAY); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(2); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); - } - ); - - test("still takes effect if one or more of the involved stat stages are not at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - - //Here - Stat.SPD -> 0 and Stat.SPATK -> 3 - leadPokemon.setStatStage(Stat.ATK, 6); - leadPokemon.setStatStage(Stat.SPATK, 3); - - game.move.select(Moves.FILLET_AWAY); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(5); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); - } - ); - - test("fails if all stat stages involved are at max", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.setStatStage(Stat.ATK, 6); - leadPokemon.setStatStage(Stat.SPATK, 6); - leadPokemon.setStatStage(Stat.SPD, 6); - - game.move.select(Moves.FILLET_AWAY); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6); - } - ); - - test("fails if the user's health is less than 1/2", - async() => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); - leadPokemon.hp = hpLost - PREDAMAGE; - - game.move.select(Moves.FILLET_AWAY); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0); - expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0); - } - ); -}); diff --git a/src/test/moves/focus_punch.test.ts b/src/test/moves/focus_punch.test.ts deleted file mode 100644 index 386eb2537ee..00000000000 --- a/src/test/moves/focus_punch.test.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { BerryPhase } from "#app/phases/berry-phase"; -import { MessagePhase } from "#app/phases/message-phase"; -import { MoveHeaderPhase } from "#app/phases/move-header-phase"; -import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; -import { TurnStartPhase } from "#app/phases/turn-start-phase"; -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 - Focus Punch", () => { - 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") - .ability(Abilities.UNNERVE) - .moveset([ Moves.FOCUS_PUNCH ]) - .enemySpecies(Species.GROUDON) - .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset(Moves.SPLASH) - .startingLevel(100) - .enemyLevel(100); - }); - - it( - "should deal damage at the end of turn if uninterrupted", - async () => { - await game.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - const enemyStartingHp = enemyPokemon.hp; - - game.move.select(Moves.FOCUS_PUNCH); - - await game.phaseInterceptor.to(MessagePhase); - - expect(enemyPokemon.hp).toBe(enemyStartingHp); - expect(leadPokemon.getMoveHistory().length).toBe(0); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); - expect(leadPokemon.getMoveHistory().length).toBe(1); - expect(leadPokemon.turnData.damageDealt).toBe(enemyStartingHp - enemyPokemon.hp); - } - ); - - it( - "should fail if the user is hit", - async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); - - await game.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - const enemyStartingHp = enemyPokemon.hp; - - game.move.select(Moves.FOCUS_PUNCH); - - await game.phaseInterceptor.to(MessagePhase); - - expect(enemyPokemon.hp).toBe(enemyStartingHp); - expect(leadPokemon.getMoveHistory().length).toBe(0); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.hp).toBe(enemyStartingHp); - expect(leadPokemon.getMoveHistory().length).toBe(1); - expect(leadPokemon.turnData.damageDealt).toBe(0); - } - ); - - it( - "should be cancelled if the user falls asleep mid-turn", - async () => { - game.override.enemyMoveset([ Moves.SPORE ]); - - await game.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.FOCUS_PUNCH); - - await game.phaseInterceptor.to(MessagePhase); // Header message - - expect(leadPokemon.getMoveHistory().length).toBe(0); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(leadPokemon.getMoveHistory().length).toBe(1); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); - - it( - "should not queue its pre-move message before an enemy switches", - async () => { - /** Guarantee a Trainer battle with multiple enemy Pokemon */ - game.override.startingWave(25); - - await game.startBattle([ Species.CHARIZARD ]); - - game.forceEnemyToSwitch(); - game.move.select(Moves.FOCUS_PUNCH); - - await game.phaseInterceptor.to(TurnStartPhase); - - expect(game.scene.getCurrentPhase() instanceof SwitchSummonPhase).toBeTruthy(); - expect(game.scene.phaseQueue.find(phase => phase instanceof MoveHeaderPhase)).toBeDefined(); - } - ); -}); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts deleted file mode 100644 index fba7937f812..00000000000 --- a/src/test/moves/follow_me.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Stat } from "#enums/stat"; -import { BattlerIndex } from "#app/battle"; -import { Abilities } from "#app/enums/abilities"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -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, test } from "vitest"; - - -describe("Moves - Follow Me", () => { - 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("double"); - game.override.starterSpecies(Species.AMOONGUSS); - game.override.ability(Abilities.BALL_FETCH); - game.override.enemySpecies(Species.SNORLAX); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.FOLLOW_ME, Moves.SPLASH ]); - }); - - test( - "move should redirect enemy attacks to the user", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.FOLLOW_ME); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY); - - // Force both enemies to target the player Pokemon that did not use Follow Me - await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - - await game.phaseInterceptor.to(TurnEndPhase, false); - - expect(playerPokemon[0].hp).toBeLessThan(playerPokemon[0].getMaxHp()); - expect(playerPokemon[1].hp).toBe(playerPokemon[1].getMaxHp()); - } - ); - - test( - "move should redirect enemy attacks to the first ally that uses it", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.FOLLOW_ME); - game.move.select(Moves.FOLLOW_ME, 1); - - // Each player is targeted by an enemy - await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); - await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - - await game.phaseInterceptor.to(TurnEndPhase, false); - - playerPokemon.sort((a, b) => a.getEffectiveStat(Stat.SPD) - b.getEffectiveStat(Stat.SPD)); - - expect(playerPokemon[1].hp).toBeLessThan(playerPokemon[1].getMaxHp()); - expect(playerPokemon[0].hp).toBe(playerPokemon[0].getMaxHp()); - } - ); - - test( - "move effect should be bypassed by Stalwart", - async () => { - game.override.ability(Abilities.STALWART); - game.override.moveset([ Moves.QUICK_ATTACK ]); - - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - - // Target doesn't need to be specified if the move is self-targeted - await game.forceEnemyMove(Moves.FOLLOW_ME); - await game.forceEnemyMove(Moves.SPLASH); - - await game.phaseInterceptor.to(TurnEndPhase, false); - - // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); - } - ); - - test( - "move effect should be bypassed by Snipe Shot", - async () => { - game.override.moveset([ Moves.SNIPE_SHOT ]); - - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.SNIPE_SHOT, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SNIPE_SHOT, 1, BattlerIndex.ENEMY_2); - - await game.forceEnemyMove(Moves.FOLLOW_ME); - await game.forceEnemyMove(Moves.SPLASH); - - await game.phaseInterceptor.to(TurnEndPhase, false); - - // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); - } - ); -}); diff --git a/src/test/moves/freeze_dry.test.ts b/src/test/moves/freeze_dry.test.ts deleted file mode 100644 index c09d12fa597..00000000000 --- a/src/test/moves/freeze_dry.test.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { Abilities } from "#app/enums/abilities"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - -describe("Moves - Freeze-Dry", () => { - 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") - .enemySpecies(Species.MAGIKARP) - .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.SPLASH) - .starterSpecies(Species.FEEBAS) - .ability(Abilities.BALL_FETCH) - .moveset([ Moves.FREEZE_DRY ]); - }); - - it("should deal 2x damage to pure water types", async () => { - await game.classicMode.startBattle(); - - const enemy = game.scene.getEnemyPokemon()!; - vi.spyOn(enemy, "getMoveEffectiveness"); - - game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); - }); - - it("should deal 4x damage to water/flying types", async () => { - game.override.enemySpecies(Species.WINGULL); - await game.classicMode.startBattle(); - - const enemy = game.scene.getEnemyPokemon()!; - vi.spyOn(enemy, "getMoveEffectiveness"); - - game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); - }); - - it("should deal 1x damage to water/fire types", async () => { - game.override.enemySpecies(Species.VOLCANION); - await game.classicMode.startBattle(); - - const enemy = game.scene.getEnemyPokemon()!; - vi.spyOn(enemy, "getMoveEffectiveness"); - - game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(enemy.getMoveEffectiveness).toHaveReturnedWith(1); - }); - - // enable if this is ever fixed (lol) - it.todo("should deal 2x damage to water types under Normalize", async () => { - game.override.ability(Abilities.NORMALIZE); - await game.classicMode.startBattle(); - - const enemy = game.scene.getEnemyPokemon()!; - vi.spyOn(enemy, "getMoveEffectiveness"); - - game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); - }); - - // enable once Electrify is implemented (and the interaction is fixed, as above) - it.todo("should deal 2x damage to water types under Electrify", async () => { - game.override.enemyMoveset([ Moves.ELECTRIFY ]); - await game.classicMode.startBattle(); - - const enemy = game.scene.getEnemyPokemon()!; - vi.spyOn(enemy, "getMoveEffectiveness"); - - game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to("BerryPhase"); - - expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); - }); -}); diff --git a/src/test/moves/freezy_frost.test.ts b/src/test/moves/freezy_frost.test.ts deleted file mode 100644 index 09d7779474f..00000000000 --- a/src/test/moves/freezy_frost.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { Stat } from "#enums/stat"; -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"; -import { allMoves } from "#app/data/move"; -import { CommandPhase } from "#app/phases/command-phase"; - -describe("Moves - Freezy Frost", () => { - 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") - .enemySpecies(Species.RATTATA) - .enemyLevel(100) - .enemyMoveset([ Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL ]) - .enemyAbility(Abilities.BALL_FETCH) - .startingLevel(100) - .moveset([ Moves.FREEZY_FROST, Moves.HOWL, Moves.SPLASH ]) - .ability(Abilities.BALL_FETCH); - - vi.spyOn(allMoves[Moves.FREEZY_FROST], "accuracy", "get").mockReturnValue(100); - }); - - it( - "should clear stat changes of user and opponent", - async () => { - await game.classicMode.startBattle([ Species.SHUCKLE ]); - const user = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.HOWL); - await game.toNextTurn(); - - expect(user.getStatStage(Stat.ATK)).toBe(1); - expect(enemy.getStatStage(Stat.ATK)).toBe(1); - - game.move.select(Moves.FREEZY_FROST); - await game.toNextTurn(); - - expect(user.getStatStage(Stat.ATK)).toBe(0); - expect(enemy.getStatStage(Stat.ATK)).toBe(0); - }); - - it( - "should clear all stat changes even when enemy uses the move", - async () => { - game.override.enemyMoveset([ Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST ]); - await game.classicMode.startBattle([ Species.SHUCKLE ]); // Shuckle for slower Howl on first turn so Freezy Frost doesn't affect it. - const user = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.HOWL); - await game.toNextTurn(); - - const userAtkBefore = user.getStatStage(Stat.ATK); - expect(userAtkBefore).toBe(1); - - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(user.getStatStage(Stat.ATK)).toBe(0); - }); - - it( - "should clear all stat changes in double battle", - async () => { - game.override.battleType("double"); - await game.classicMode.startBattle([ Species.SHUCKLE, Species.RATTATA ]); - const [ leftPlayer, rightPlayer ] = game.scene.getPlayerField(); - const [ leftOpp, rightOpp ] = game.scene.getEnemyField(); - - game.move.select(Moves.HOWL, 0); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); - await game.toNextTurn(); - - expect(leftPlayer.getStatStage(Stat.ATK)).toBe(1); - expect(rightPlayer.getStatStage(Stat.ATK)).toBe(1); - expect(leftOpp.getStatStage(Stat.ATK)).toBe(2); // Both enemies use Howl - expect(rightOpp.getStatStage(Stat.ATK)).toBe(2); - - game.move.select(Moves.FREEZY_FROST, 0, leftOpp.getBattlerIndex()); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); - await game.toNextTurn(); - - expect(leftPlayer.getStatStage(Stat.ATK)).toBe(0); - expect(rightPlayer.getStatStage(Stat.ATK)).toBe(0); - expect(leftOpp.getStatStage(Stat.ATK)).toBe(0); - expect(rightOpp.getStatStage(Stat.ATK)).toBe(0); - }); -}); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts deleted file mode 100644 index af8440a0911..00000000000 --- a/src/test/moves/hyper_beam.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { allMoves } from "#app/data/move"; -import { Abilities } from "#app/enums/abilities"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; -import { BerryPhase } from "#app/phases/berry-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - -describe("Moves - Hyper Beam", () => { - 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.ability(Abilities.BALL_FETCH); - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.SPLASH ]); - game.override.enemyLevel(100); - - game.override.moveset([ Moves.HYPER_BEAM, Moves.TACKLE ]); - vi.spyOn(allMoves[Moves.HYPER_BEAM], "accuracy", "get").mockReturnValue(100); - }); - - it( - "should force the user to recharge on the next turn (and only that turn)", - async () => { - await game.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.HYPER_BEAM); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); - - const enemyPostAttackHp = enemyPokemon.hp; - - /** Game should progress without a new command from the player */ - await game.phaseInterceptor.to(TurnEndPhase); - - expect(enemyPokemon.hp).toBe(enemyPostAttackHp); - expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); - - game.move.select(Moves.TACKLE); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.hp).toBeLessThan(enemyPostAttackHp); - } - ); -}); diff --git a/src/test/moves/jaw_lock.test.ts b/src/test/moves/jaw_lock.test.ts deleted file mode 100644 index 30dbcac64a8..00000000000 --- a/src/test/moves/jaw_lock.test.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { Abilities } from "#app/enums/abilities"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { BerryPhase } from "#app/phases/berry-phase"; -import { FaintPhase } from "#app/phases/faint-phase"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#app/test/utils/gameManager"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - - -describe("Moves - Jaw Lock", () => { - 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") - .enemySpecies(Species.SNORLAX) - .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.JAW_LOCK, Moves.SPLASH ]) - .startingLevel(100) - .enemyLevel(100) - .disableCrits(); - }); - - it( - "should trap the move's user and target", - async () => { - await game.startBattle([ Species.BULBASAUR ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.JAW_LOCK); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - } - ); - - it( - "should not trap either pokemon if the target faints", - async () => { - game.override.enemyLevel(1); - await game.startBattle([ Species.BULBASAUR ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.JAW_LOCK); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - - await game.phaseInterceptor.to(MoveEffectPhase); - - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - - await game.phaseInterceptor.to(FaintPhase); - - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - } - ); - - it( - "should only trap the user until the target faints", - async () => { - await game.startBattle([ Species.BULBASAUR ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.JAW_LOCK); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - - await game.phaseInterceptor.to(MoveEffectPhase); - - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); - - await game.phaseInterceptor.to(TurnEndPhase); - - await game.doKillOpponents(); - - expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - } - ); - - it( - "should not trap other targets after the first target is trapped", - async () => { - game.override.battleType("double"); - - await game.startBattle([ Species.CHARMANDER, Species.BULBASAUR ]); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - - await game.phaseInterceptor.to(MoveEffectPhase); - - expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); - expect(enemyPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); - - await game.toNextTurn(); - - game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(MoveEffectPhase); - - expect(enemyPokemon[1].getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); - expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)?.sourceId).toBe(enemyPokemon[0].id); - } - ); - - it( - "should not trap either pokemon if the target is protected", - async () => { - game.override.enemyMoveset([ Moves.PROTECT ]); - - await game.startBattle([ Species.BULBASAUR ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.JAW_LOCK); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(playerPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); - } - ); -}); diff --git a/src/test/moves/lucky_chant.test.ts b/src/test/moves/lucky_chant.test.ts deleted file mode 100644 index 02e9dd24465..00000000000 --- a/src/test/moves/lucky_chant.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Abilities } from "#app/enums/abilities"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; -import { BerryPhase } from "#app/phases/berry-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "../utils/gameManager"; - - -describe("Moves - Lucky Chant", () => { - 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") - .moveset([ Moves.LUCKY_CHANT, Moves.SPLASH, Moves.FOLLOW_ME ]) - .enemySpecies(Species.SNORLAX) - .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset([ Moves.FLOWER_TRICK ]) - .startingLevel(100) - .enemyLevel(100); - }); - - it( - "should prevent critical hits from moves", - async () => { - await game.startBattle([ Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to(TurnEndPhase); - - const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; - - game.move.select(Moves.LUCKY_CHANT); - - await game.phaseInterceptor.to(BerryPhase, false); - - const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; - expect(secondTurnDamage).toBeLessThan(firstTurnDamage); - } - ); - - it( - "should prevent critical hits against the user's ally", - async () => { - game.override.battleType("double"); - - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const playerPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.FOLLOW_ME); - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(TurnEndPhase); - - const firstTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp; - - game.move.select(Moves.FOLLOW_ME); - game.move.select(Moves.LUCKY_CHANT, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - const secondTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp - firstTurnDamage; - expect(secondTurnDamage).toBeLessThan(firstTurnDamage); - } - ); - - it( - "should prevent critical hits from field effects", - async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); - - await game.startBattle([ Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - enemyPokemon.addTag(BattlerTagType.ALWAYS_CRIT, 2, Moves.NONE, 0); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to(TurnEndPhase); - - const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; - - game.move.select(Moves.LUCKY_CHANT); - - await game.phaseInterceptor.to(BerryPhase, false); - - const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; - expect(secondTurnDamage).toBeLessThan(firstTurnDamage); - } - ); -}); diff --git a/src/test/moves/mat_block.test.ts b/src/test/moves/mat_block.test.ts deleted file mode 100644 index a4d9177cbdc..00000000000 --- a/src/test/moves/mat_block.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Stat } from "#enums/stat"; -import { BerryPhase } from "#app/phases/berry-phase"; -import { CommandPhase } from "#app/phases/command-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; - - -describe("Moves - Mat Block", () => { - 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("double"); - - game.override.moveset([ Moves.MAT_BLOCK, Moves.SPLASH ]); - - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.TACKLE ]); - game.override.enemyAbility(Abilities.INSOMNIA); - - game.override.startingLevel(100); - game.override.enemyLevel(100); - }); - - test( - "should protect the user and allies from attack moves", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.MAT_BLOCK); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); - - test( - "should not protect the user and allies from status moves", - async () => { - game.override.enemyMoveset([ Moves.GROWL ]); - - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.MAT_BLOCK); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(-2)); - } - ); - - test( - "should fail when used after the first turn", - async () => { - await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(TurnEndPhase); - - const leadStartingHp = leadPokemon.map(p => p.hp); - - await game.phaseInterceptor.to(CommandPhase, false); - game.move.select(Moves.MAT_BLOCK); - await game.phaseInterceptor.to(CommandPhase); - game.move.select(Moves.MAT_BLOCK, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(leadPokemon.some((p, i) => p.hp < leadStartingHp[i])).toBeTruthy(); - } - ); -}); diff --git a/src/test/moves/pledge_moves.test.ts b/src/test/moves/pledge_moves.test.ts deleted file mode 100644 index 93fcf57cc60..00000000000 --- a/src/test/moves/pledge_moves.test.ts +++ /dev/null @@ -1,337 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { allAbilities } from "#app/data/ability"; -import { ArenaTagSide } from "#app/data/arena-tag"; -import { allMoves, FlinchAttr } from "#app/data/move"; -import { Type } from "#app/data/type"; -import { ArenaTagType } from "#enums/arena-tag-type"; -import { Stat } from "#enums/stat"; -import { 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, it, expect, vi } from "vitest"; - -describe("Moves - Pledge Moves", () => { - 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("double") - .startingLevel(100) - .moveset([ Moves.FIRE_PLEDGE, Moves.GRASS_PLEDGE, Moves.WATER_PLEDGE, Moves.SPLASH ]) - .enemySpecies(Species.SNORLAX) - .enemyLevel(100) - .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.SPLASH); - }); - - it( - "Fire Pledge - should be an 80-power Fire-type attack outside of combination", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const firePledge = allMoves[Moves.FIRE_PLEDGE]; - vi.spyOn(firePledge, "calculateBattlePower"); - - const playerPokemon = game.scene.getPlayerField(); - vi.spyOn(playerPokemon[0], "getMoveType"); - - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - await game.phaseInterceptor.to("MoveEndPhase", false); - - expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); - expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(Type.FIRE); - } - ); - - it( - "Fire Pledge - should not combine with an ally using Fire Pledge", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const firePledge = allMoves[Moves.FIRE_PLEDGE]; - vi.spyOn(firePledge, "calculateBattlePower"); - - const playerPokemon = game.scene.getPlayerField(); - playerPokemon.forEach(p => vi.spyOn(p, "getMoveType")); - - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY_2); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - - await game.phaseInterceptor.to("MoveEndPhase"); - expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); - expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(Type.FIRE); - - await game.phaseInterceptor.to("BerryPhase", false); - expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(Type.FIRE); - - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); - } - ); - - it( - "Fire Pledge - should not combine with an enemy's Pledge move", - async () => { - game.override - .battleType("single") - .enemyMoveset(Moves.GRASS_PLEDGE); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.FIRE_PLEDGE); - - await game.toNextTurn(); - - // Neither Pokemon should defer their move's effects as they would - // if they combined moves, so both should be damaged. - expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - expect(game.scene.arena.getTag(ArenaTagType.FIRE_GRASS_PLEDGE)).toBeUndefined(); - } - ); - - it( - "Grass Pledge - should combine with Fire Pledge to form a 150-power Fire-type attack that creates a 'sea of fire'", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const grassPledge = allMoves[Moves.GRASS_PLEDGE]; - vi.spyOn(grassPledge, "calculateBattlePower"); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - vi.spyOn(playerPokemon[1], "getMoveType"); - const baseDmgMock = vi.spyOn(enemyPokemon[0], "getBaseDamage"); - - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.GRASS_PLEDGE, 1, BattlerIndex.ENEMY); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - // advance to the end of PLAYER_2's move this turn - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEndPhase"); - } - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(Type.FIRE); - expect(grassPledge.calculateBattlePower).toHaveLastReturnedWith(150); - - const baseDmg = baseDmgMock.mock.results[baseDmgMock.mock.results.length - 1].value; - expect(enemyPokemon[0].getMaxHp() - enemyPokemon[0].hp).toBe(toDmgValue(baseDmg * 1.5)); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked - expect(game.scene.arena.getTagOnSide(ArenaTagType.FIRE_GRASS_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined(); - - const enemyStartingHp = enemyPokemon.map(p => p.hp); - await game.toNextTurn(); - enemyPokemon.forEach((p, i) => expect(enemyStartingHp[i] - p.hp).toBe(toDmgValue(p.getMaxHp() / 8))); - } - ); - - it( - "Fire Pledge - should combine with Water Pledge to form a 150-power Water-type attack that creates a 'rainbow'", - async () => { - game.override.moveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.FIERY_DANCE, Moves.SPLASH ]); - - await game.classicMode.startBattle([ Species.BLASTOISE, Species.VENUSAUR ]); - - const firePledge = allMoves[Moves.FIRE_PLEDGE]; - vi.spyOn(firePledge, "calculateBattlePower"); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - vi.spyOn(playerPokemon[1], "getMoveType"); - - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - // advance to the end of PLAYER_2's move this turn - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEndPhase"); - } - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(Type.WATER); - expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(150); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked - expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); - - await game.toNextTurn(); - - game.move.select(Moves.FIERY_DANCE, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - await game.phaseInterceptor.to("MoveEndPhase"); - - // Rainbow effect should increase Fiery Dance's chance of raising Sp. Atk to 100% - expect(playerPokemon[0].getStatStage(Stat.SPATK)).toBe(1); - } - ); - - it( - "Water Pledge - should combine with Grass Pledge to form a 150-power Grass-type attack that creates a 'swamp'", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const waterPledge = allMoves[Moves.WATER_PLEDGE]; - vi.spyOn(waterPledge, "calculateBattlePower"); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - const enemyStartingSpd = enemyPokemon.map(p => p.getEffectiveStat(Stat.SPD)); - - vi.spyOn(playerPokemon[1], "getMoveType"); - - game.move.select(Moves.GRASS_PLEDGE, 0, BattlerIndex.ENEMY_2); - game.move.select(Moves.WATER_PLEDGE, 1, BattlerIndex.ENEMY); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - // advance to the end of PLAYER_2's move this turn - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEndPhase"); - } - - expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(Type.GRASS); - expect(waterPledge.calculateBattlePower).toHaveLastReturnedWith(150); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); - - expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined(); - enemyPokemon.forEach((p, i) => expect(p.getEffectiveStat(Stat.SPD)).toBe(Math.floor(enemyStartingSpd[i] / 4))); - } - ); - - it( - "Pledge Moves - should alter turn order when used in combination", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2 ]); - // PLAYER_2 should act with a combined move immediately after PLAYER as the second move in the turn - for (let i = 0; i < 2; i++) { - await game.phaseInterceptor.to("MoveEndPhase"); - } - expect(enemyPokemon[0].hp).toBe(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); - } - ); - - it( - "Pledge Moves - 'rainbow' effect should not stack with Serene Grace when applied to flinching moves", - async () => { - game.override - .ability(Abilities.SERENE_GRACE) - .moveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.IRON_HEAD, Moves.SPLASH ]); - - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const ironHeadFlinchAttr = allMoves[Moves.IRON_HEAD].getAttrs(FlinchAttr)[0]; - vi.spyOn(ironHeadFlinchAttr, "getMoveChance"); - - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); - - await game.phaseInterceptor.to("TurnEndPhase"); - - expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); - - game.move.select(Moves.IRON_HEAD, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(ironHeadFlinchAttr.getMoveChance).toHaveLastReturnedWith(60); - } - ); - - it( - "Pledge Moves - should have no effect when the second ally's move is cancelled", - async () => { - game.override - .enemyMoveset([ Moves.SPLASH, Moves.SPORE ]); - - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.GRASS_PLEDGE, 1, BattlerIndex.ENEMY_2); - - await game.forceEnemyMove(Moves.SPORE, BattlerIndex.PLAYER_2); - await game.forceEnemyMove(Moves.SPLASH); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2 ]); - - await game.phaseInterceptor.to("BerryPhase", false); - - enemyPokemon.forEach((p) => expect(p.hp).toBe(p.getMaxHp())); - } - ); - - it( - "Pledge Moves - should ignore redirection from another Pokemon's Storm Drain", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const enemyPokemon = game.scene.getEnemyField(); - vi.spyOn(enemyPokemon[1], "getAbility").mockReturnValue(allAbilities[Abilities.STORM_DRAIN]); - - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); - - await game.phaseInterceptor.to("MoveEndPhase", false); - - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].getStatStage(Stat.SPATK)).toBe(0); - } - ); - - it( - "Pledge Moves - should not ignore redirection from another Pokemon's Follow Me", - async () => { - game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); - - await game.forceEnemyMove(Moves.SPLASH); - await game.forceEnemyMove(Moves.FOLLOW_ME); - - await game.phaseInterceptor.to("BerryPhase", false); - - const enemyPokemon = game.scene.getEnemyField(); - expect(enemyPokemon[0].hp).toBe(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); - } - ); -}); diff --git a/src/test/moves/protect.test.ts b/src/test/moves/protect.test.ts deleted file mode 100644 index e639969ddf0..00000000000 --- a/src/test/moves/protect.test.ts +++ /dev/null @@ -1,133 +0,0 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import GameManager from "../utils/gameManager"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Stat } from "#enums/stat"; -import { allMoves } from "#app/data/move"; -import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; -import { BattlerIndex } from "#app/battle"; -import { MoveResult } from "#app/field/pokemon"; - - -describe("Moves - Protect", () => { - 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.moveset([ Moves.PROTECT ]); - game.override.enemySpecies(Species.SNORLAX); - - game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset([ Moves.TACKLE ]); - - game.override.startingLevel(100); - game.override.enemyLevel(100); - }); - - test( - "should protect the user from attacks", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.PROTECT); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - } - ); - - test( - "should prevent secondary effects from the opponent's attack", - async () => { - game.override.enemyMoveset([ Moves.CEASELESS_EDGE ]); - vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.PROTECT); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(game.scene.arena.getTagOnSide(ArenaTrapTag, ArenaTagSide.ENEMY)).toBeUndefined(); - } - ); - - test( - "should protect the user from status moves", - async () => { - game.override.enemyMoveset([ Moves.CHARM ]); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.PROTECT); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - } - ); - - test( - "should stop subsequent hits of a multi-hit move", - async () => { - game.override.enemyMoveset([ Moves.TACHYON_CUTTER ]); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.PROTECT); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(enemyPokemon.turnData.hitCount).toBe(1); - } - ); - - test( - "should fail if the user is the last to move in the turn", - async () => { - game.override.enemyMoveset([ Moves.PROTECT ]); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.PROTECT); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(leadPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - } - ); -}); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts deleted file mode 100644 index 3b07eafd75a..00000000000 --- a/src/test/moves/purify.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { Status, StatusEffect } from "#app/data/status-effect"; -import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; -import { MoveEndPhase } from "#app/phases/move-end-phase"; -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, test } from "vitest"; - - -describe("Moves - Purify", () => { - 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.starterSpecies(Species.PYUKUMUKU); - game.override.startingLevel(10); - game.override.moveset([ Moves.PURIFY, Moves.SIZZLY_SLIDE ]); - - game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyLevel(10); - game.override.enemyMoveset([ Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE ]); - }); - - test( - "Purify heals opponent status effect and restores user hp", - async () => { - await game.startBattle(); - - const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; - const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; - - playerPokemon.hp = playerPokemon.getMaxHp() - 1; - enemyPokemon.status = new Status(StatusEffect.BURN); - - game.move.select(Moves.PURIFY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEndPhase); - - expect(enemyPokemon.status).toBeNull(); - expect(playerPokemon.isFullHp()).toBe(true); - }, - ); - - test( - "Purify does not heal if opponent doesnt have any status effect", - async () => { - await game.startBattle(); - - const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; - - playerPokemon.hp = playerPokemon.getMaxHp() - 1; - const playerInitialHp = playerPokemon.hp; - - game.move.select(Moves.PURIFY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEndPhase); - - expect(playerPokemon.hp).toBe(playerInitialHp); - }, - ); - -}); diff --git a/src/test/moves/quick_guard.test.ts b/src/test/moves/quick_guard.test.ts deleted file mode 100644 index 7bda71782aa..00000000000 --- a/src/test/moves/quick_guard.test.ts +++ /dev/null @@ -1,117 +0,0 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Stat } from "#enums/stat"; -import { BattlerIndex } from "#app/battle"; -import { MoveResult } from "#app/field/pokemon"; - - -describe("Moves - Quick Guard", () => { - 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("double"); - - game.override.moveset([ Moves.QUICK_GUARD, Moves.SPLASH, Moves.FOLLOW_ME ]); - - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.QUICK_ATTACK ]); - game.override.enemyAbility(Abilities.INSOMNIA); - - game.override.startingLevel(100); - game.override.enemyLevel(100); - }); - - test( - "should protect the user and allies from priority moves", - async () => { - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const playerPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.QUICK_GUARD); - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to("BerryPhase", false); - - playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); - - test( - "should protect the user and allies from Prankster-boosted moves", - async () => { - game.override.enemyAbility(Abilities.PRANKSTER); - game.override.enemyMoveset([ Moves.GROWL ]); - - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const playerPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.QUICK_GUARD); - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to("BerryPhase", false); - - playerPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); - } - ); - - test( - "should stop subsequent hits of a multi-hit priority move", - async () => { - game.override.enemyMoveset([ Moves.WATER_SHURIKEN ]); - - await game.classicMode.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.QUICK_GUARD); - game.move.select(Moves.FOLLOW_ME, 1); - - await game.phaseInterceptor.to("BerryPhase", false); - - playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - enemyPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); - } - ); - - test( - "should fail if the user is the last to move in the turn", - async () => { - game.override.battleType("single"); - game.override.enemyMoveset([ Moves.QUICK_GUARD ]); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.QUICK_GUARD); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - } - ); -}); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts deleted file mode 100644 index 1b73a7f0f5f..00000000000 --- a/src/test/moves/rage_powder.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -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, test } from "vitest"; - - -describe("Moves - Rage 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("double"); - game.override.enemySpecies(Species.SNORLAX); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - game.override.enemyMoveset([ Moves.RAGE_POWDER, Moves.TACKLE, Moves.SPLASH ]); - }); - - test( - "move effect should be bypassed by Grass type", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.VENUSAUR ]); - - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - - await game.forceEnemyMove(Moves.RAGE_POWDER); - await game.forceEnemyMove(Moves.SPLASH); - - await game.phaseInterceptor.to("BerryPhase", false); - - // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - } - ); - - test( - "move effect should be bypassed by Overcoat", - async () => { - game.override.ability(Abilities.OVERCOAT); - - // Test with two non-Grass type player Pokemon - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const enemyPokemon = game.scene.getEnemyField(); - - const enemyStartingHp = enemyPokemon.map(p => p.hp); - - game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - - await game.forceEnemyMove(Moves.RAGE_POWDER); - await game.forceEnemyMove(Moves.SPLASH); - - await game.phaseInterceptor.to("BerryPhase", false); - - // If redirection was bypassed, both enemies should be damaged - expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); - expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); - } - ); -}); diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts deleted file mode 100644 index e595f879844..00000000000 --- a/src/test/moves/roost.test.ts +++ /dev/null @@ -1,268 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { Type } from "#app/data/type"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; - - -describe("Moves - Roost", () => { - 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.RELICANTH); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override.enemyMoveset(Moves.EARTHQUAKE); - game.override.moveset([ Moves.ROOST, Moves.BURN_UP, Moves.DOUBLE_SHOCK ]); - }); - - /** - * Roost's behavior should be defined as: - * The pokemon loses its flying type for a turn. If the pokemon was ungroundd solely due to being a flying type, it will be grounded until end of turn. - * 1. Pure Flying type pokemon -> become normal type until end of turn - * 2. Dual Flying/X type pokemon -> become type X until end of turn - * 3. Pokemon that use burn up into roost (ex. Moltres) -> become flying due to burn up, then typeless until end of turn after using roost - * 4. If a pokemon is afflicted with Forest's Curse or Trick or treat, dual type pokemon will become 3 type pokemon after the flying type is regained - * Pure flying types become (Grass or Ghost) and then back to flying/ (Grass or Ghost), - * and pokemon post Burn up become () - * 5. If a pokemon is also ungrounded due to other reasons (such as levitate), it will stay ungrounded post roost, despite not being flying type. - * 6. Non flying types using roost (such as dunsparce) are already grounded, so this move will only heal and have no other effects. - */ - - test( - "Non flying type uses roost -> no type change, took damage", - async () => { - await game.classicMode.startBattle([ Species.DUNSPARCE ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); - - // Should only be normal type, and NOT flying type - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.NORMAL).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); - - await game.phaseInterceptor.to(TurnEndPhase); - - // Lose HP, still normal type - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.NORMAL).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); - } - ); - - test( - "Pure flying type -> becomes normal after roost and takes damage from ground moves -> regains flying", - async () => { - await game.classicMode.startBattle([ Species.TORNADUS ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); - - // Should only be normal type, and NOT flying type - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.NORMAL).toBeTruthy(); - expect(playerPokemonTypes[0] === Type.FLYING).toBeFalsy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); - - await game.phaseInterceptor.to(TurnEndPhase); - - // Should have lost HP and is now back to being pure flying - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.NORMAL).toBeFalsy(); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); - - } - ); - - test( - "Dual X/flying type -> becomes type X after roost and takes damage from ground moves -> regains flying", - async () => { - await game.classicMode.startBattle([ Species.HAWLUCHA ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); - - // Should only be pure fighting type and grounded - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.FIGHTING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); - - await game.phaseInterceptor.to(TurnEndPhase); - - // Should have lost HP and is now back to being fighting/flying - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.FIGHTING).toBeTruthy(); - expect(playerPokemonTypes[1] === Type.FLYING).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); - - } - ); - - test( - "Pokemon with levitate after using roost should lose flying type but still be unaffected by ground moves", - async () => { - game.override.starterForms({ [Species.ROTOM]: 4 }); - await game.classicMode.startBattle([ Species.ROTOM ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); - - // Should only be pure eletric type and grounded - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.ELECTRIC).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); - - await game.phaseInterceptor.to(TurnEndPhase); - - // Should have lost HP and is now back to being electric/flying - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBe(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.ELECTRIC).toBeTruthy(); - expect(playerPokemonTypes[1] === Type.FLYING).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); - - } - ); - - test( - "A fire/flying type that uses burn up, then roost should be typeless until end of turn", - async () => { - await game.classicMode.startBattle([ Species.MOLTRES ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.BURN_UP); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); - - // Should only be pure flying type after burn up - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - - await game.phaseInterceptor.to(TurnEndPhase); - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); - - // Should only be typeless type after roost and is grounded - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); - expect(playerPokemonTypes[0] === Type.UNKNOWN).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); - - await game.phaseInterceptor.to(TurnEndPhase); - - // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); - - } - ); - - test( - "An electric/flying type that uses double shock, then roost should be typeless until end of turn", - async () => { - game.override.enemySpecies(Species.ZEKROM); - await game.classicMode.startBattle([ Species.ZAPDOS ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const playerPokemonStartingHP = playerPokemon.hp; - game.move.select(Moves.DOUBLE_SHOCK); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); - - // Should only be pure flying type after burn up - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - - await game.phaseInterceptor.to(TurnEndPhase); - game.move.select(Moves.ROOST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase); - - // Should only be typeless type after roost and is grounded - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); - expect(playerPokemonTypes[0] === Type.UNKNOWN).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); - - await game.phaseInterceptor.to(TurnEndPhase); - - // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); - expect(playerPokemonTypes[0] === Type.FLYING).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); - - } - ); - - test( - "Dual Type Pokemon afflicted with Forests Curse/Trick or Treat and post roost will become dual type and then become 3 type at end of turn", - async () => { - game.override.enemyMoveset([ Moves.TRICK_OR_TREAT, Moves.TRICK_OR_TREAT, Moves.TRICK_OR_TREAT, Moves.TRICK_OR_TREAT ]); - await game.classicMode.startBattle([ Species.MOLTRES ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - game.move.select(Moves.ROOST); - await game.phaseInterceptor.to(MoveEffectPhase); - - let playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes[0] === Type.FIRE).toBeTruthy(); - expect(playerPokemonTypes.length === 1).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeTruthy(); - - await game.phaseInterceptor.to(TurnEndPhase); - - // Should be fire/flying/ghost - playerPokemonTypes = playerPokemon.getTypes(); - expect(playerPokemonTypes.filter(type => type === Type.FLYING)).toHaveLength(1); - expect(playerPokemonTypes.filter(type => type === Type.FIRE)).toHaveLength(1); - expect(playerPokemonTypes.filter(type => type === Type.GHOST)).toHaveLength(1); - expect(playerPokemonTypes.length === 3).toBeTruthy(); - expect(playerPokemon.isGrounded()).toBeFalsy(); - - } - ); - -}); diff --git a/src/test/moves/shell_trap.test.ts b/src/test/moves/shell_trap.test.ts deleted file mode 100644 index 04d3cf998b1..00000000000 --- a/src/test/moves/shell_trap.test.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; -import { MoveResult } from "#app/field/pokemon"; -import { BerryPhase } from "#app/phases/berry-phase"; -import { MoveEndPhase } from "#app/phases/move-end-phase"; -import { MovePhase } from "#app/phases/move-phase"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - - -describe("Moves - Shell Trap", () => { - 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("double") - .moveset([ Moves.SHELL_TRAP, Moves.SPLASH, Moves.BULLDOZE ]) - .enemySpecies(Species.SNORLAX) - .enemyMoveset([ Moves.RAZOR_LEAF ]) - .startingLevel(100) - .enemyLevel(100); - - vi.spyOn(allMoves[Moves.RAZOR_LEAF], "accuracy", "get").mockReturnValue(100); - }); - - it( - "should activate after the user is hit by a physical attack", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.TURTONATOR ]); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.SPLASH); - game.move.select(Moves.SHELL_TRAP, 1); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); - - await game.phaseInterceptor.to(MoveEndPhase); - - const movePhase = game.scene.getCurrentPhase(); - expect(movePhase instanceof MovePhase).toBeTruthy(); - expect((movePhase as MovePhase).pokemon).toBe(playerPokemon[1]); - - await game.phaseInterceptor.to(MoveEndPhase); - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); - } - ); - - it( - "should fail if the user is only hit by special attacks", - async () => { - game.override.enemyMoveset([ Moves.SWIFT ]); - - await game.startBattle([ Species.CHARIZARD, Species.TURTONATOR ]); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.SPLASH); - game.move.select(Moves.SHELL_TRAP, 1); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); - - await game.phaseInterceptor.to(MoveEndPhase); - - const movePhase = game.scene.getCurrentPhase(); - expect(movePhase instanceof MovePhase).toBeTruthy(); - expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); - - await game.phaseInterceptor.to(BerryPhase, false); - enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); - - it( - "should fail if the user isn't hit with any attack", - async () => { - game.override.enemyMoveset(Moves.SPLASH); - - await game.startBattle([ Species.CHARIZARD, Species.TURTONATOR ]); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.SPLASH); - game.move.select(Moves.SHELL_TRAP, 1); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); - - await game.phaseInterceptor.to(MoveEndPhase); - - const movePhase = game.scene.getCurrentPhase(); - expect(movePhase instanceof MovePhase).toBeTruthy(); - expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); - - await game.phaseInterceptor.to(BerryPhase, false); - enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); - - it( - "should not activate from an ally's attack", - async () => { - game.override.enemyMoveset(Moves.SPLASH); - - await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.SHELL_TRAP); - game.move.select(Moves.BULLDOZE, 1); - - await game.phaseInterceptor.to(MoveEndPhase); - - const movePhase = game.scene.getCurrentPhase(); - expect(movePhase instanceof MovePhase).toBeTruthy(); - expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); - - const enemyStartingHp = enemyPokemon.map(p => p.hp); - - await game.phaseInterceptor.to(BerryPhase, false); - enemyPokemon.forEach((p, i) => expect(p.hp).toBe(enemyStartingHp[i])); - } - ); - - it( - "should not activate from a subsequent physical attack", - async () => { - game.override.battleType("single"); - vi.spyOn(allMoves[Moves.RAZOR_LEAF], "priority", "get").mockReturnValue(-4); - - await game.startBattle([ Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.SHELL_TRAP); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); -}); diff --git a/src/test/moves/sketch.test.ts b/src/test/moves/sketch.test.ts deleted file mode 100644 index 2e3eb97a76c..00000000000 --- a/src/test/moves/sketch.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - -describe("Moves - Sketch", () => { - 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 - .ability(Abilities.BALL_FETCH) - .battleType("single") - .disableCrits() - .enemySpecies(Species.SHUCKLE) - .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.SPLASH); - }); - - it("Sketch should not fail even if a previous Sketch failed to retrieve a valid move and ran out of PP", async () => { - game.override.moveset([ Moves.SKETCH, Moves.SKETCH ]); - - await game.classicMode.startBattle([ Species.REGIELEKI ]); - const playerPokemon = game.scene.getPlayerPokemon(); - - game.move.select(Moves.SKETCH); - await game.phaseInterceptor.to("TurnEndPhase"); - expect(playerPokemon?.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - const moveSlot0 = playerPokemon?.getMoveset()[0]; - expect(moveSlot0?.moveId).toBe(Moves.SKETCH); - expect(moveSlot0?.getPpRatio()).toBe(0); - - await game.toNextTurn(); - game.move.select(Moves.SKETCH); - await game.phaseInterceptor.to("TurnEndPhase"); - expect(playerPokemon?.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - // Can't verify if the player Pokemon's moveset was successfully changed because of overrides. - }); -}); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts deleted file mode 100644 index 095f7d80bfe..00000000000 --- a/src/test/moves/spotlight.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -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, test } from "vitest"; - - -describe("Moves - Spotlight", () => { - 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("double"); - game.override.starterSpecies(Species.AMOONGUSS); - game.override.enemySpecies(Species.SNORLAX); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override.moveset([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - game.override.enemyMoveset([ Moves.FOLLOW_ME, Moves.SPLASH ]); - }); - - test( - "move should redirect attacks to the target", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - - await game.forceEnemyMove(Moves.SPLASH); - await game.forceEnemyMove(Moves.SPLASH); - - await game.phaseInterceptor.to(TurnEndPhase, false); - - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); - } - ); - - test( - "move should cause other redirection moves to fail", - async () => { - await game.classicMode.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); - - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY); - game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); - - await game.forceEnemyMove(Moves.SPLASH); - await game.forceEnemyMove(Moves.FOLLOW_ME); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); - expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); - } - ); -}); diff --git a/src/test/moves/substitute.test.ts b/src/test/moves/substitute.test.ts deleted file mode 100644 index 92f66c967c4..00000000000 --- a/src/test/moves/substitute.test.ts +++ /dev/null @@ -1,602 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { ArenaTagSide } from "#app/data/arena-tag"; -import { SubstituteTag, TrappedTag } from "#app/data/battler-tags"; -import { allMoves, StealHeldItemChanceAttr } from "#app/data/move"; -import { StatusEffect } from "#app/data/status-effect"; -import { Abilities } from "#enums/abilities"; -import { ArenaTagType } from "#enums/arena-tag-type"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { BerryType } from "#enums/berry-type"; -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import { Stat } from "#enums/stat"; -import { MoveResult } from "#app/field/pokemon"; -import { CommandPhase } from "#app/phases/command-phase"; -import GameManager from "#app/test/utils/gameManager"; -import { Command } from "#app/ui/command-ui-handler"; -import { Mode } from "#app/ui/ui"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - - -describe("Moves - Substitute", () => { - 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") - .moveset([ Moves.SUBSTITUTE, Moves.SWORDS_DANCE, Moves.TACKLE, Moves.SPLASH ]) - .enemySpecies(Species.SNORLAX) - .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset(Moves.SPLASH) - .startingLevel(100) - .enemyLevel(100); - }); - - it( - "should cause the user to take damage", - async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SUBSTITUTE); - - await game.phaseInterceptor.to("MoveEndPhase", false); - - expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() * 3 / 4)); - } - ); - - it( - "should redirect enemy attack damage to the Substitute doll", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - - await game.classicMode.startBattle([ Species.SKARMORY ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SUBSTITUTE); - - await game.phaseInterceptor.to("MoveEndPhase", false); - - expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() * 3 / 4)); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - const postSubHp = leadPokemon.hp; - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.hp).toBe(postSubHp); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - } - ); - - it( - "should fade after redirecting more damage than its remaining HP", - async () => { - // Giga Impact OHKOs Magikarp if substitute isn't up - game.override.enemyMoveset(Moves.GIGA_IMPACT); - vi.spyOn(allMoves[Moves.GIGA_IMPACT], "accuracy", "get").mockReturnValue(100); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SUBSTITUTE); - - await game.phaseInterceptor.to("MoveEndPhase", false); - - expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() * 3 / 4)); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - const postSubHp = leadPokemon.hp; - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.hp).toBe(postSubHp); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeUndefined(); - } - ); - - it( - "should block stat changes from status moves", - async () => { - game.override.enemyMoveset(Moves.CHARM); - - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SUBSTITUTE); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - } - ); - - it( - "should be bypassed by sound-based moves", - async () => { - game.override.enemyMoveset(Moves.ECHOED_VOICE); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SUBSTITUTE); - - await game.phaseInterceptor.to("MoveEndPhase"); - - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - const postSubHp = leadPokemon.hp; - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - expect(leadPokemon.hp).toBeLessThan(postSubHp); - } - ); - - it( - "should be bypassed by attackers with Infiltrator", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.enemyAbility(Abilities.INFILTRATOR); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SUBSTITUTE); - - await game.phaseInterceptor.to("MoveEndPhase"); - - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - const postSubHp = leadPokemon.hp; - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); - expect(leadPokemon.hp).toBeLessThan(postSubHp); - } - ); - - it( - "shouldn't block the user's own status moves", - async () => { - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.SUBSTITUTE); - - await game.phaseInterceptor.to("MoveEndPhase"); - await game.toNextTurn(); - - game.move.select(Moves.SWORDS_DANCE); - - await game.phaseInterceptor.to("MoveEndPhase", false); - - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - } - ); - - it( - "shouldn't block moves that target the user's side of the field", - async () => { - game.override.moveset(Moves.LIGHT_SCREEN); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(leadPokemon, "getMoveEffectiveness"); - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - game.move.select(Moves.LIGHT_SCREEN); - - await game.toNextTurn(); - - expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0); - expect(game.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.PLAYER)).toBeDefined(); - } - ); - - it( - "shouldn't block the opponent from setting hazards", - async () => { - game.override.enemyMoveset(Moves.STEALTH_ROCK); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - vi.spyOn(leadPokemon, "getMoveEffectiveness"); - - game.move.select(Moves.SUBSTITUTE); - - await game.toNextTurn(); - - expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0); - expect(game.scene.arena.getTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER)).toBeDefined(); - } - ); - - it( - "shouldn't block moves that target both sides of the field", - async () => { - game.override - .moveset(Moves.TRICK_ROOM) - .enemyMoveset(Moves.GRAVITY); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const pokemon = game.scene.getField(true); - pokemon.forEach(p => { - vi.spyOn(p, "getMoveEffectiveness"); - p.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, p.id); - }); - - game.move.select(Moves.TRICK_ROOM); - - await game.toNextTurn(); - - pokemon.forEach(p => expect(p.getMoveEffectiveness).not.toHaveReturnedWith(0)); - expect(game.scene.arena.getTag(ArenaTagType.TRICK_ROOM)).toBeDefined(); - expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); - } - ); - - it( - "should protect the user from flinching", - async () => { - game.override.enemyMoveset(Moves.FAKE_OUT); - game.override.startingLevel(1); // Ensures the Substitute will break - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - game.move.select(Moves.TACKLE); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); - - it( - "should protect the user from being trapped", - async () => { - vi.spyOn(allMoves[Moves.SAND_TOMB], "accuracy", "get").mockReturnValue(100); - game.override.enemyMoveset(Moves.SAND_TOMB); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getTag(TrappedTag)).toBeUndefined(); - } - ); - - it( - "should prevent the user's stats from being lowered", - async () => { - vi.spyOn(allMoves[Moves.LIQUIDATION], "chance", "get").mockReturnValue(100); - game.override.enemyMoveset(Moves.LIQUIDATION); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getStatStage(Stat.DEF)).toBe(0); - } - ); - - it( - "should protect the user from being afflicted with status effects", - async () => { - game.override.enemyMoveset(Moves.NUZZLE); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.status?.effect).not.toBe(StatusEffect.PARALYSIS); - } - ); - - it( - "should prevent the user's items from being stolen", - async () => { - game.override.enemyMoveset(Moves.THIEF); - vi.spyOn(allMoves[Moves.THIEF], "attrs", "get").mockReturnValue([ new StealHeldItemChanceAttr(1.0) ]); // give Thief 100% steal rate - game.override.startingHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - game.move.select(Moves.SPLASH); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getHeldItems().length).toBe(1); - } - ); - - it( - "should prevent the user's items from being removed", - async () => { - game.override.moveset([ Moves.KNOCK_OFF ]); - game.override.enemyHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); - const enemyNumItems = enemyPokemon.getHeldItems().length; - - game.move.select(Moves.KNOCK_OFF); - - await game.phaseInterceptor.to("MoveEndPhase", false); - - expect(enemyPokemon.getHeldItems().length).toBe(enemyNumItems); - } - ); - - it( - "move effect should prevent the user's berries from being stolen and eaten", - async () => { - game.override.enemyMoveset(Moves.BUG_BITE); - game.override.startingHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - game.move.select(Moves.TACKLE); - - await game.phaseInterceptor.to("MoveEndPhase", false); - const enemyPostAttackHp = enemyPokemon.hp; - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getHeldItems().length).toBe(1); - expect(enemyPokemon.hp).toBe(enemyPostAttackHp); - } - ); - - it( - "should prevent the user's stats from being reset by Clear Smog", - async () => { - game.override.enemyMoveset(Moves.CLEAR_SMOG); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - game.move.select(Moves.SWORDS_DANCE); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - } - ); - - it( - "should prevent the user from becoming confused", - async () => { - game.override.enemyMoveset(Moves.MAGICAL_TORQUE); - vi.spyOn(allMoves[Moves.MAGICAL_TORQUE], "chance", "get").mockReturnValue(100); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - game.move.select(Moves.SWORDS_DANCE); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getTag(BattlerTagType.CONFUSED)).toBeUndefined(); - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); - } - ); - - it( - "should transfer to the switched in Pokemon when the source uses Baton Pass", - async () => { - game.override.moveset([ Moves.SUBSTITUTE, Moves.BATON_PASS ]); - - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - - const leadPokemon = game.scene.getPlayerPokemon()!; - - leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); - - // Simulate a Baton switch for the player this turn - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, 1, true); - }); - - await game.phaseInterceptor.to("MovePhase", false); - - const switchedPokemon = game.scene.getPlayerPokemon()!; - const subTag = switchedPokemon.getTag(SubstituteTag)!; - expect(subTag).toBeDefined(); - expect(subTag.hp).toBe(Math.floor(leadPokemon.getMaxHp() * 1 / 4)); - } - ); - - it( - "should prevent the source's Rough Skin from activating when hit", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.ability(Abilities.ROUGH_SKIN); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.SUBSTITUTE); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); - - it( - "should prevent the source's Focus Punch from failing when hit", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.moveset([ Moves.FOCUS_PUNCH ]); - - // Make Focus Punch 40 power to avoid a KO - vi.spyOn(allMoves[Moves.FOCUS_PUNCH], "calculateBattlePower").mockReturnValue(40); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - - game.move.select(Moves.FOCUS_PUNCH); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); - - it( - "should not allow Shell Trap to activate when attacked", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.moveset([ Moves.SHELL_TRAP ]); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - - game.move.select(Moves.SHELL_TRAP); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - } - ); - - it( - "should not allow Beak Blast to burn opponents when hit", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.moveset([ Moves.BEAK_BLAST ]); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - - game.move.select(Moves.BEAK_BLAST); - - await game.phaseInterceptor.to("MoveEndPhase"); - - expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); - } - ); - - it( - "should cause incoming attacks to not activate Counter", - async () => { - game.override.enemyMoveset(Moves.TACKLE); - game.override.moveset([ Moves.COUNTER ]); - - await game.classicMode.startBattle([ Species.BLASTOISE ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; - - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - - game.move.select(Moves.COUNTER); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - } - ); - - it( - "should prevent Sappy Seed from applying its Leech Seed effect to the user", - async () => { - game.override.enemyMoveset(Moves.SAPPY_SEED); - - await game.classicMode.startBattle([ Species.CHARIZARD ]); - - const playerPokemon = game.scene.getPlayerPokemon()!; - - playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); - - game.move.select(Moves.SPLASH); - - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); // enemy uses Sappy Seed first - await game.move.forceHit(); // forces Sappy Seed to hit - await game.phaseInterceptor.to("MoveEndPhase"); - - expect(playerPokemon.getTag(BattlerTagType.SEEDED)).toBeUndefined(); - } - ); -}); diff --git a/src/test/moves/syrup_bomb.test.ts b/src/test/moves/syrup_bomb.test.ts deleted file mode 100644 index ea2f8b6bab3..00000000000 --- a/src/test/moves/syrup_bomb.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { Moves } from "#enums/moves"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; -import Phaser from "phaser"; -import { BattlerIndex } from "#app/battle"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - -describe("Moves - SYRUP BOMB", () => { - 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") - .enemySpecies(Species.SNORLAX) - .enemyAbility(Abilities.BALL_FETCH) - .ability(Abilities.BALL_FETCH) - .startingLevel(30) - .enemyLevel(100) - .moveset([ Moves.SYRUP_BOMB, Moves.SPLASH ]) - .enemyMoveset(Moves.SPLASH); - }); - - //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/syrup_bomb_(move) - - it("decreases the target Pokemon's speed stat once per turn for 3 turns", - async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const targetPokemon = game.scene.getEnemyPokemon()!; - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(0); - - game.move.select(Moves.SYRUP_BOMB); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.move.forceHit(); - await game.toNextTurn(); - expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeDefined(); - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-1); - - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeDefined(); - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-2); - - game.move.select(Moves.SPLASH); - await game.toNextTurn(); - expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeUndefined(); - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-3); - } - ); - - it("does not affect Pokemon with the ability Bulletproof", - async () => { - game.override.enemyAbility(Abilities.BULLETPROOF); - await game.classicMode.startBattle([ Species.MAGIKARP ]); - - const targetPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.SYRUP_BOMB); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.move.forceHit(); - await game.toNextTurn(); - expect(targetPokemon.isFullHp()).toBe(true); - expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeUndefined(); - expect(targetPokemon.getStatStage(Stat.SPD)).toBe(0); - } - ); - - it("stops lowering the target's speed if the user leaves the field", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); - - game.move.select(Moves.SYRUP_BOMB); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.move.forceHit(); - await game.toNextTurn(); - - game.doSwitchPokemon(1); - await game.toNextTurn(); - - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPD)).toBe(-1); - }); -}); diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts deleted file mode 100644 index 0ce8a552105..00000000000 --- a/src/test/moves/tera_blast.test.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { BattlerIndex } from "#app/battle"; -import { Stat } from "#enums/stat"; -import { allMoves } from "#app/data/move"; -import { Type } from "#app/data/type"; -import { Abilities } from "#app/enums/abilities"; -import { HitResult } from "#app/field/pokemon"; -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("Moves - Tera Blast", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - const moveToCheck = allMoves[Moves.TERA_BLAST]; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - - game.override - .battleType("single") - .disableCrits() - .starterSpecies(Species.FEEBAS) - .moveset([ Moves.TERA_BLAST ]) - .ability(Abilities.BALL_FETCH) - .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]) - .enemySpecies(Species.MAGIKARP) - .enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.BALL_FETCH) - .enemyLevel(20); - - vi.spyOn(moveToCheck, "calculateBattlePower"); - }); - - it("changes type to match user's tera type", async () => { - game.override - .enemySpecies(Species.FURRET) - .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIGHTING }]); - await game.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; - vi.spyOn(enemyPokemon, "apply"); - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); - }, 20000); - - it("increases power if user is Stellar tera type", async () => { - game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); - - await game.startBattle(); - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(100); - }, 20000); - - it("is super effective against terastallized targets if user is Stellar tera type", async () => { - game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); - - await game.startBattle(); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - vi.spyOn(enemyPokemon, "apply"); - vi.spyOn(enemyPokemon, "isTerastallized").mockReturnValue(true); - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - - expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); - }); - - // Currently abilities are bugged and can't see when a move's category is changed - it.skip("uses the higher stat of the user's Atk and SpAtk for damage calculation", async () => { - game.override.enemyAbility(Abilities.TOXIC_DEBRIS); - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - playerPokemon.stats[Stat.ATK] = 100; - playerPokemon.stats[Stat.SPATK] = 1; - - game.move.select(Moves.TERA_BLAST); - await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getEnemyPokemon()!.battleData.abilityRevealed).toBe(true); - }, 20000); - - it("causes stat drops if user is Stellar tera type", async () => { - game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); - await game.startBattle(); - - const playerPokemon = game.scene.getPlayerPokemon()!; - - game.move.select(Moves.TERA_BLAST); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to("MoveEndPhase"); - - expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1); - expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1); - }, 20000); -}); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts deleted file mode 100644 index 976b4352ee4..00000000000 --- a/src/test/moves/thousand_arrows.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { Abilities } from "#app/enums/abilities"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { BerryPhase } from "#app/phases/berry-phase"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -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 - Thousand Arrows", () => { - 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.TOGETIC); - game.override.startingLevel(100); - game.override.enemyLevel(100); - game.override.moveset([ Moves.THOUSAND_ARROWS ]); - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - }); - - it( - "move should hit and ground Flying-type targets", - async () => { - await game.startBattle([ Species.ILLUMISE ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.THOUSAND_ARROWS); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Enemy should not be grounded before move effect is applied - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); - - it( - "move should hit and ground targets with Levitate", - async () => { - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyAbility(Abilities.LEVITATE); - - await game.startBattle([ Species.ILLUMISE ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - game.move.select(Moves.THOUSAND_ARROWS); - - await game.phaseInterceptor.to(MoveEffectPhase, false); - // Enemy should not be grounded before move effect is applied - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); - - it( - "move should hit and ground targets under the effects of Magnet Rise", - async () => { - game.override.enemySpecies(Species.SNORLAX); - - await game.startBattle([ Species.ILLUMISE ]); - - const enemyPokemon = game.scene.getEnemyPokemon()!; - - enemyPokemon.addTag(BattlerTagType.FLOATING, undefined, Moves.MAGNET_RISE); - - game.move.select(Moves.THOUSAND_ARROWS); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(enemyPokemon.getTag(BattlerTagType.FLOATING)).toBeUndefined(); - expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); - } - ); -}); diff --git a/src/test/moves/whirlwind.test.ts b/src/test/moves/whirlwind.test.ts deleted file mode 100644 index c16f38111f2..00000000000 --- a/src/test/moves/whirlwind.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { BattlerTagType } from "#app/enums/battler-tag-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"; - -describe("Moves - Whirlwind", () => { - 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") - .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.WHIRLWIND) - .enemySpecies(Species.PIDGEY); - }); - - it.each([ - { move: Moves.FLY, name: "Fly" }, - { move: Moves.BOUNCE, name: "Bounce" }, - { move: Moves.SKY_DROP, name: "Sky Drop" }, - ])("should not hit a flying target: $name (=$move)", async ({ move }) => { - game.override.moveset([ move ]); - await game.classicMode.startBattle([ Species.STARAPTOR ]); - - const staraptor = game.scene.getPlayerPokemon()!; - - game.move.select(move); - - 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); - }); -}); diff --git a/src/test/moves/wide_guard.test.ts b/src/test/moves/wide_guard.test.ts deleted file mode 100644 index c25a700c981..00000000000 --- a/src/test/moves/wide_guard.test.ts +++ /dev/null @@ -1,124 +0,0 @@ -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import GameManager from "../utils/gameManager"; -import { Species } from "#enums/species"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import { Stat } from "#enums/stat"; -import { BerryPhase } from "#app/phases/berry-phase"; -import { CommandPhase } from "#app/phases/command-phase"; - - -describe("Moves - Wide Guard", () => { - 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("double"); - - game.override.moveset([ Moves.WIDE_GUARD, Moves.SPLASH, Moves.SURF ]); - - game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset([ Moves.SWIFT ]); - game.override.enemyAbility(Abilities.INSOMNIA); - - game.override.startingLevel(100); - game.override.enemyLevel(100); - }); - - test( - "should protect the user and allies from multi-target attack moves", - async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.WIDE_GUARD); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - } - ); - - test( - "should protect the user and allies from multi-target status moves", - async () => { - game.override.enemyMoveset([ Moves.GROWL ]); - - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.WIDE_GUARD); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); - } - ); - - test( - "should not protect the user and allies from single-target moves", - async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); - - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - - game.move.select(Moves.WIDE_GUARD); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); - } - ); - - test( - "should protect the user from its ally's multi-target move", - async () => { - game.override.enemyMoveset([ Moves.SPLASH ]); - - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); - - const leadPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(Moves.WIDE_GUARD); - - await game.phaseInterceptor.to(CommandPhase); - - game.move.select(Moves.SURF, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - expect(leadPokemon[0].hp).toBe(leadPokemon[0].getMaxHp()); - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); - } - ); -}); diff --git a/src/test/phases/learn-move-phase.test.ts b/src/test/phases/learn-move-phase.test.ts deleted file mode 100644 index c4fa0e8bf45..00000000000 --- a/src/test/phases/learn-move-phase.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; -import { Species } from "#enums/species"; -import { Moves } from "#enums/moves"; -import { LearnMovePhase } from "#app/phases/learn-move-phase"; - -describe("Learn Move Phase", () => { - 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.xpMultiplier(50); - }); - - it("If Pokemon has less than 4 moves, its newest move will be added to the lowest empty index", async () => { - game.override.moveset([ Moves.SPLASH ]); - await game.startBattle([ Species.BULBASAUR ]); - const pokemon = game.scene.getPlayerPokemon()!; - const newMovePos = pokemon?.getMoveset().length; - game.move.select(Moves.SPLASH); - await game.doKillOpponents(); - await game.phaseInterceptor.to(LearnMovePhase); - const levelMove = pokemon.getLevelMoves(5)[0]; - const levelReq = levelMove[0]; - const levelMoveId = levelMove[1]; - expect(pokemon.level).toBeGreaterThanOrEqual(levelReq); - expect(pokemon?.getMoveset()[newMovePos]?.moveId).toBe(levelMoveId); - }); - - /** - * Future Tests: - * If a Pokemon has four moves, the user can specify an old move to be forgotten and a new move will take its place. - * If a Pokemon has four moves, the user can reject the new move, keeping the moveset the same. - */ -}); diff --git a/src/test/phases/select-modifier-phase.test.ts b/src/test/phases/select-modifier-phase.test.ts deleted file mode 100644 index a945aff055b..00000000000 --- a/src/test/phases/select-modifier-phase.test.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import { initSceneWithoutEncounterPhase } from "#app/test/utils/gameManagerUtils"; -import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; -import { ModifierTier } from "#app/modifier/modifier-tier"; -import * as Utils from "#app/utils"; -import { CustomModifierSettings, ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; -import BattleScene from "#app/battle-scene"; -import { Species } from "#enums/species"; -import { Mode } from "#app/ui/ui"; -import { PlayerPokemon } from "#app/field/pokemon"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; - -describe("SelectModifierPhase", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - let scene: BattleScene; - - beforeAll(() => { - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - scene = game.scene; - - initSceneWithoutEncounterPhase(scene, [ Species.ABRA, Species.VOLCARONA ]); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - - vi.clearAllMocks(); - }); - - it("should start a select modifier phase", async () => { - const selectModifierPhase = new SelectModifierPhase(scene); - scene.pushPhase(selectModifierPhase); - await game.phaseInterceptor.run(SelectModifierPhase); - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - }); - - it("should generate random modifiers", async () => { - const selectModifierPhase = new SelectModifierPhase(scene); - scene.pushPhase(selectModifierPhase); - await game.phaseInterceptor.run(SelectModifierPhase); - - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(3); - }); - - it("should modify reroll cost", async () => { - const options = [ - new ModifierTypeOption(modifierTypes.POTION(), 0, 100), - new ModifierTypeOption(modifierTypes.ETHER(), 0, 400), - new ModifierTypeOption(modifierTypes.REVIVE(), 0, 1000) - ]; - - const selectModifierPhase1 = new SelectModifierPhase(scene, 0, undefined, { guaranteedModifierTypeOptions: options }); - const selectModifierPhase2 = new SelectModifierPhase(scene, 0, undefined, { guaranteedModifierTypeOptions: options, rerollMultiplier: 2 }); - - const cost1 = selectModifierPhase1.getRerollCost(false); - const cost2 = selectModifierPhase2.getRerollCost(false); - expect(cost2).toEqual(cost1 * 2); - }); - - it("should generate random modifiers from reroll", async () => { - let selectModifierPhase = new SelectModifierPhase(scene); - scene.pushPhase(selectModifierPhase); - await game.phaseInterceptor.run(SelectModifierPhase); - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(3); - - // Simulate selecting reroll - selectModifierPhase = new SelectModifierPhase(scene, 1, [ ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.COMMON ]); - scene.unshiftPhase(selectModifierPhase); - scene.ui.setMode(Mode.MESSAGE).then(() => game.endPhase()); - await game.phaseInterceptor.run(SelectModifierPhase); - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - expect(modifierSelectHandler.options.length).toEqual(3); - }); - - it("should generate random modifiers of same tier for reroll with reroll lock", async () => { - // Just use fully random seed for this test - vi.spyOn(scene, "resetSeed").mockImplementation(() => { - scene.waveSeed = Utils.shiftCharCodes(scene.seed, 5); - Phaser.Math.RND.sow([ scene.waveSeed ]); - console.log("Wave Seed:", scene.waveSeed, 5); - scene.rngCounter = 0; - }); - - let selectModifierPhase = new SelectModifierPhase(scene); - scene.pushPhase(selectModifierPhase); - await game.phaseInterceptor.run(SelectModifierPhase); - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(3); - const firstRollTiers: ModifierTier[] = modifierSelectHandler.options.map(o => o.modifierTypeOption.type.tier); - - // Simulate selecting reroll with lock - scene.lockModifierTiers = true; - scene.reroll = true; - selectModifierPhase = new SelectModifierPhase(scene, 1, firstRollTiers); - scene.unshiftPhase(selectModifierPhase); - scene.ui.setMode(Mode.MESSAGE).then(() => game.endPhase()); - await game.phaseInterceptor.run(SelectModifierPhase); - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - expect(modifierSelectHandler.options.length).toEqual(3); - // Reroll with lock can still upgrade - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[0]); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[1]); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[2]); - }); - - it("should generate custom modifiers", async () => { - const customModifiers: CustomModifierSettings = { - guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_ULTRA, modifierTypes.LEFTOVERS, modifierTypes.AMULET_COIN, modifierTypes.GOLDEN_PUNCH ] - }; - const selectModifierPhase = new SelectModifierPhase(scene, 0, undefined, customModifiers); - scene.pushPhase(selectModifierPhase); - await game.phaseInterceptor.run(SelectModifierPhase); - - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(5); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_ULTRA"); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("LEFTOVERS"); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("AMULET_COIN"); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.id).toEqual("GOLDEN_PUNCH"); - }); - - it("should generate custom modifier tiers that can upgrade from luck", async () => { - const customModifiers: CustomModifierSettings = { - guaranteedModifierTiers: [ ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.ULTRA, ModifierTier.ROGUE, ModifierTier.MASTER ] - }; - const pokemon = new PlayerPokemon(scene, getPokemonSpecies(Species.BULBASAUR), 10, undefined, 0, undefined, true, 2, undefined, undefined, undefined); - - // Fill party with max shinies - while (scene.getParty().length > 0) { - scene.getParty().pop(); - } - scene.getParty().push(pokemon, pokemon, pokemon, pokemon, pokemon, pokemon); - - const selectModifierPhase = new SelectModifierPhase(scene, 0, undefined, customModifiers); - scene.pushPhase(selectModifierPhase); - await game.phaseInterceptor.run(SelectModifierPhase); - - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(5); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.COMMON); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.tier - modifierSelectHandler.options[4].modifierTypeOption.upgradeCount).toEqual(ModifierTier.MASTER); - }); - - it("should generate custom modifiers and modifier tiers together", async () => { - const customModifiers: CustomModifierSettings = { - guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_COMMON ], - guaranteedModifierTiers: [ ModifierTier.MASTER, ModifierTier.MASTER ] - }; - const selectModifierPhase = new SelectModifierPhase(scene, 0, undefined, customModifiers); - scene.pushPhase(selectModifierPhase); - await game.phaseInterceptor.run(SelectModifierPhase); - - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(4); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_COMMON"); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); - }); - - it("should fill remaining modifiers if fillRemaining is true with custom modifiers", async () => { - const customModifiers: CustomModifierSettings = { - guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM ], - guaranteedModifierTiers: [ ModifierTier.MASTER ], - fillRemaining: true - }; - const selectModifierPhase = new SelectModifierPhase(scene, 0, undefined, customModifiers); - scene.pushPhase(selectModifierPhase); - await game.phaseInterceptor.run(SelectModifierPhase); - - - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(3); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); - }); -}); diff --git a/src/test/system/game_data.test.ts b/src/test/system/game_data.test.ts deleted file mode 100644 index fcb7e9067a3..00000000000 --- a/src/test/system/game_data.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import * as BattleScene from "#app/battle-scene"; -import { SessionSaveData } from "#app/system/game-data"; -import { Abilities } from "#enums/abilities"; -import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; -import { http, HttpResponse } from "msw"; -import { setupServer } from "msw/node"; -import Phaser from "phaser"; -import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import * as account from "../../account"; - -const apiBase = import.meta.env.VITE_API_BASE_URL ?? "http://localhost:8001"; - -/** We need a custom server. For some reasons I can't extend the listeners of {@linkcode global.i18nServer} with {@linkcode global.i18nServer.use} */ -const server = setupServer(); - -describe("System - Game Data", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - global.i18nServer.close(); - server.listen(); - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterAll(() => { - server.close(); - global.i18nServer.listen(); - }); - - beforeEach(() => { - game = new GameManager(phaserGame); - game.override - .moveset([ Moves.SPLASH ]) - .battleType("single") - .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.SPLASH); - }); - - afterEach(() => { - server.resetHandlers(); - game.phaseInterceptor.restoreOg(); - }); - - describe("tryClearSession", () => { - beforeEach(() => { - vi.spyOn(BattleScene, "bypassLogin", "get").mockReturnValue(false); - vi.spyOn(game.scene.gameData, "getSessionSaveData").mockReturnValue({} as SessionSaveData); - vi.spyOn(account, "updateUserInfo").mockImplementation(async () => [ true, 1 ]); - }); - - it("should return [true, true] if bypassLogin is true", async () => { - vi.spyOn(BattleScene, "bypassLogin", "get").mockReturnValue(true); - - const result = await game.scene.gameData.tryClearSession(game.scene, 0); - - expect(result).toEqual([ true, true ]); - }); - - it("should return [true, true] if successful", async () => { - server.use(http.post(`${apiBase}/savedata/session/clear`, () => HttpResponse.json({ success: true }))); - - const result = await game.scene.gameData.tryClearSession(game.scene, 0); - - expect(result).toEqual([ true, true ]); - expect(account.updateUserInfo).toHaveBeenCalled(); - }); - - it("should return [true, false] if not successful", async () => { - server.use(http.post(`${apiBase}/savedata/session/clear`, () => HttpResponse.json({ success: false }))); - - const result = await game.scene.gameData.tryClearSession(game.scene, 0); - - expect(result).toEqual([ true, false ]); - expect(account.updateUserInfo).toHaveBeenCalled(); - }); - - it("should return [false, false] session is out of date", async () => { - server.use( - http.post(`${apiBase}/savedata/session/clear`, () => HttpResponse.json({ error: "session out of date" })) - ); - - const result = await game.scene.gameData.tryClearSession(game.scene, 0); - - expect(result).toEqual([ false, false ]); - expect(account.updateUserInfo).toHaveBeenCalled(); - }); - }); -}); diff --git a/src/test/utils/mocks/mocksContainer/mockPolygon.ts b/src/test/utils/mocks/mocksContainer/mockPolygon.ts deleted file mode 100644 index 12b60904a96..00000000000 --- a/src/test/utils/mocks/mocksContainer/mockPolygon.ts +++ /dev/null @@ -1,9 +0,0 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; - - -export default class MockPolygon extends MockContainer { - constructor(textureManager, x, y, content, fillColor, fillAlpha) { - super(textureManager, x, y); - } -} - diff --git a/src/test/utils/saves/everything.prsv b/src/test/utils/saves/everything.prsv deleted file mode 100644 index 1985a6649ca..00000000000 --- a/src/test/utils/saves/everything.prsv +++ /dev/null @@ -1 +0,0 @@ -U2FsdGVkX1/4DTixhxQcAYS2/Di/pqeu/nRpupkjBuWMNPyi+EU5+XagpDb3U95TieqHIklaFb+j7Pd6A/hz87xqpTZlaELG7sPTaVHcghitW2NbqKQn30ghp1jZ4YclXiBLaust5iT9CfGZ2Nd9XSNxgUPg/j+H0hWMgkpx4T28rB/RipRUgwwoPB2018E48E5b9Or55aZ2Ddh/zXXnOPFOghOn2+0XaLhyXKWHf/8/VPgGTzyvAdzwIC0C8dPCEuSgPoELY7nigHpX+9N3P5DHv1K3RlG4QfAF9tmgkXwuddsSCT1/4yQxhXSPTXG8dQ4HWa9aLFLCjVbqsnHFnLmd5TQt1PdzDo5uPlSS8OXVyRcs1ghtLfdhoVOJNYQIEW/vyfRuitHmvnZiQQiV10meueTUnmtsvBIdKOkbf9c/DB4muwQVuV/X5Y4Fhat6GrsqVsYT9NhKgKZdk6ohTb8RJz3CmjiNxYzKMF9q32DazDWIlaKEy4Z/aoHJshuxG/v9mHHs6K3Yx6hhMjUMAC+0BP+M+SVc5CpfJWP46cBtXeFLRHSC+XOyq/Rawe36QTF84pfZFMTd3H3ZqYDMMs55Ldsky51AyKLs9u5Onw6uzFKX8DmbSlO3ak0o65EBBe1TXadQHbzT/0wlWMt9pj2kcA+4AAl9wgqtXOLWR9dfSq7tZEz5U4iTd8kOi4OgeLHZqueH9rXF0YdTOgqJtsnbXKz91+EwkMfaTE8GrtpgaWYorN72j3DryFx2zMK/L2zUDV6XJEhRXb5udHxcrg+0l5EQgLfWjT92GGuomj2E20E0lUN02JRZHYQjH89w464cAy4kvFdJtmydYYNWp3olBwIb8tRGXifXgkFacFCXwOmtGIrUkwN6Gm1MOh0l0bS3suaQklqaTyzBAkAQMKNYKlenmXwgs23e3PNfe9SRKXmTDaH8ZikoWT10ur/G17O+p+73ufkYh8VbLUcSbDUtSuSCCipAyxxaJ5alhAXlFprEkkVNJb9jES/403KRcLVxk/8i9Yym7ftBxDNQc3j0q3bEz5FMm8GFWcTBOctBJjXQ32wCitF6MGOM7pefhFeuZo9j6SatV8Wm9++/QYYp9WykY7K3zGwvQ6jCrSCKZWnNK7+ESrNhgzUQKcaU2xp2cdv30Z5Yy5HYPwSE61bVJsdXYeeNIewsT0V0n7P7FgVvJ2f9jF2RN4avD1uH1xmWAZVckJ08D2i0JYz9PeygJhpN8MrlLQQCu2AmWkXx5GTDf4WsYhDfkTxW4YQn6Ba1Jr1kUdApT0KZzlJxtQTcTxpB720WQ08E1ZNHhk/pEsG3/uDe3tbOyhCHT6o4xhLMKfkdJYOyWwYht/SMkqTJGwNMGJVADZbSDFT5t0gRibCZTErXoGgTEmPWUDevRQhWPeAEgy73GmmvFWJgAMzwwmCxhFqhAzyWUR/dv6LC/t0acBqrW1EjoYKqlxDMBQH5vbcCE6pI0jfei8N4EIA7qOqI2Fd/GvM3pdX2d5yO5MRzxq7y5nxzRNfaxPh+aW9WGDeK/jm4UOwchWIrLrYDQsh6PED3B3stBpftJcx6RigmhsKhdF79/si2/ifh3X6gutsK95693bR6rdUYSymYUxo4dF8HFhtxIBFf6OZnIIROr8uiOe+goeQ0fp+JQjQ2wFWVs5p3oDbwhvNgViDDZ4eJlxQTyMXgKOq3sn3EQ3/WMknHykSZy1n7nP1sPIUmG8+dh275xbFBCkLbhm4gh+FmAzAmXrnb+7UupqqZiINR8O+WKJCYEWeknDBCDOOYgzEESzzN5J/54bbKrbQVvrwmIxXVeI7/VE9MrLVdH6F+vwFrAWzRlUic7xu8/BK0dfvbIaArImgUFCdQZFL8JwVpyhDSAm6IkzGQ9A97b+9cdydYr8zjggNm+L5nIAxsOXfg+fEhDnMnBLqvoQkd7jwHgsjHTygpMIYdkTTOSsDnpr78c9LXRXN0h9YYrTMIdniUHsPf58nLGNhKdyopGCm7MYllFdZgt4IDSZwslDsgWAqg7/zZ+35tU44XlRi0g/c72192Zsv7z5SM1m/jqkB4aN5a1yT/NSLF4dST34DWGFBptCkbhLWT0C6e7K7r2TQ2GC90C8jyznwJhvUqJzDExokYrIhhDhHu0ae6x+yFLAWR08RrsKpBFqVCDhT4dV2lwMYx1CsS71a/9OPn+WIEZT/MuKKHjDsNRZF+nKUaUc3MpW37Qcb+8s5c9O5dFuaokPSkklRioWOeoi+DGg34ZIqcoBZhp4FQHIDpEZrF2yigXbRKuJeoy6uXQOK5zREkgcdnUfzMlScuOYNg4FfnMg5406paWoj15GrIhaM2w+EZTcDxawlbMdSkFg4uud6Fhywkvj1vnFdyksLia0IE9ysnfbNQQOxfC82Z56/qC/HOgTzjflWyomgbd51RDQVnT5k1Hss1L2dA4JG6OLBJozMrG3TuPmTfnUvoen3dzbJJrIyKHKIeg69YozG/uL23bHX/6M0RnfkwXkAenzyaepbKqRxrYKvfbRT0E3W9V3tZeI7NwSiYO7Jfs7XkIRLrtdquChnYLd1MfjdS7Vj1cY/uoUeN9ZIHgJxtp9Q83GOmtqaoGOtngn4QvRuTkim6xVYG8SkDefHE9Ey7csA0kVccR4y709uk5tYjdGQqOt/9dIYhQxEHRyXjQ03k5U59hlAw6C+R7LoTZ1xEBDb/+ctJffqMh4kZsIC5Uue/KqLPfQomjPO+Q9ZrDkXLwe0ylCILxVeqWB96TSrQF5m5AQbF1ukYLGcjLZUPJW41OzJfeuMmh5jqjXdjOnD+C0Kte0SiDyFro50ij7DrdZTDXbw+Umfq6MkLlzXy8Xe4Bpbr+GFGuOKXhjWu9wlhlkkuFzxHc+2Vk7uvtCct6wIwlXqi6HoBFSzubsjyeAZPzKXxhOgxYandoubsoLTmQ4R8dJ+tIVjv/cF754I5OZNz9YPVQQSpSr87SQPGRktSpxUypSAeA3TMhnDuaFMaxsUcsxsGhEZi9FPM1BCCC94OI9Q8wdwM0jPwYuJBOtcS4M4aheEEn9v2SHTns+mBckVZxLxIAbhqpQ0UkyJPwCL94/lqIC7kJXxgLTS93p2BWuMBsjb2kew5AbcTgTdSqK/f5GA10yV9D2V3mhX6htHEqpe73qw/cn3jkhzILscJVMDeLV0KLUq7TkbagKS2zLX84XEjAsZWFahN6WZFmdPBpmYlC7obOo+mdgOZwgDc2JYEWTyVcuHY9xf+uU7sToDikqGs35NiatCm7IH6gZslAqw5pMpwlHHgzgeM8TDposfs1iVbdVnjoB3YLeS0mVlkLgYNIOz0Wi8L37CW8Y73yVMx3yFiZTE41VNU1FzmuBLzxDjF9h7XyEGYGyVKP6I7kxPGIq3JBNCQKDdg8lpqx7j+2Yt3OdpPRbZ4XAYL3JDohWRjKLV7HHyRtYmuqUmBAdS2U591JdlNfyq0hO2/qwowtpex6miBgZW9B2AGcZxRLlSKRdmVyhd0WNk4sp5hkKJQLX5Ny10YbDi0KOo2iw9bQJ42T/UfFqODC+dIA2l+4OCNqDAZ9r4pPHHaxeVys0zJfvsMMfJ69wH3sVTMXWRN1HkyDD/dZtaqSD/4vXifuGFhQ2pDB4UskA1NiUFmUX2mgLicB2IUHeW7CIXFdBTUj+NGcVFFzdTGvZ9tT0dYqyRO00QQQrjmEEyhlWJaju3nNcVmgiDWD4Tiz40Huf3kZ4Ssp0ppZJcFnFuMfo8nagmGKwhiAw4TbmCOI+ME0rLWkaGyS7YNGgAlzr+rbY+n9vhBDTddTIv5qhQ/ORzWxV5VO+Z4ItwEPGuLZCiZ4JKIxVnK4N1JrDI5FG17yvbBFWtgDgz5s2GsnLCHnyf/OzSOkbOjHZ3HLYDFZwqtt8D9lSWvZQo9yq5qqZcSI25oSiNkuf5JcSiSwfCmFkLlvxyMjWXTgpG5lxK+17E5RZljY9ONbGXYAArzZ0d7cFOqcym6zil73PUHDudc6dIaUsis0X27SSBq4WbNDbCVqJEEPYKZBVPNCavpcj29y/JeefFHM3+dUwubqUyIdePLDpsNKXJ/VWq3b5HdJz0sZCJ74GMYeRw9J5OSWcXIAxJxEub4K0tfpdQd9WGSIb5tBBj78uNeK4/hh/POq1Wu5nMq1VQUHoHlysVFNYssgBKEIvkIoiJwbCDsJm1NUxLkKaQbQjIEPeixX46USVs4hB2tv74OxqOgAaQikErsJQ899TEu5puZ4uYiE4KfyG6X3Xcxy/A+aXpRNNf/USneVIjbo4Lj8VMxrHHt46p43Jn18McfIjhH7CxTCSvByqG1tYtn1hyk0UEQWOGT+ZHkDER2Kxpuqg2QKJoNh6Z4n9TyPmtqGCm5Xd/AccHJSKWXWsckSaazlpHelz83ANhbxZNAyPeHw4QLUpWkn5zrPGo9qeYBdxmBxHYB1mq60luC9qJObE8irLP17p/PJ3PNpiX4GNeX8tCsiaLsB1rhVC/4/s6pBRJRoPu2uyt+vsljBRlpmNM9F3na0E92Mk6Hclo1XDNYi38hmP9olpsQoRORlXbzTyKyVijbQX1MOBLvxQQPRT83scwLyVvKM64prRfepfwgU+DPJjcOUke1FsQdA1FHneuWTxJO9QxrXOkAPyq18L2l56n9MCe6we+7znfGusrWDuxJanSyI+mR1v3OendDgMGEQ4KPsCCYkXBtcVawyJl31xJRSknXXmLVR40BLkzPAsxXcmK1f/nCxvRZtnxDQltplZb1Wp5OPP/bkkhMoikULuOR9QBWExwXmZALoJv6HCjmUfcKsYaKH311NlFyOWQJLeNGscGde4z2hot4pNauoqpeOFdksT7i/G4ihsvG/GSYpU5USMSMFVcryEmIJIuxzP66W9YgDvvDhl0uSHWatUTK6FjS5vqVqiZE+M4V38zngs8uc0lFSQ9l7VIzgcLuFQhtHX17HT1RNmjhcoqoDBG3u1Y9vHr+GMqOYpqOxtzAEDGx+JPmSmZNRbP/SdC+iu2Y5c5nbW99aAP9E8ZNUVDSLdz9QniQNKshYWI6a6j7LCBFK36uL1aUBhog30cdBCMT/IZ09NPR+E6mGy4RNkevgbUhTbVT5sf9OIeFv9djLL+ywZ1iRDbA5/smI95cSwVhuEvWRoRmXlekHruiJ/HKjsusGHXJ2LV8gg31pxVWNpBochUlJJiPd1wk6ETC6UVwKAqFMNIwtyN2SvH6SRj7AztD7xlXAC099hCAMokCHpmlCrLoMQEdpNmv19VSmTpX9B2882G6TgxZQzgJj4wbxmudZYkXPJ3Gpusi8PMzKcFvApDiNO9+rTNsEEFR4a6Akb055HYyGfFVWh68TOv3KTA/MlvIQZjLCLqIX9FdYFQYwL1xki9ccocKP6fmSM09OofSfabmFjtyHHPbFAPzUB4xC/qikSjQPCo7uDLyuO1Yxzj3cBhzQpwUKT8Qvek59xfuqmZF+DNvXWm6M5OG9RQT2/3vqje4MZCf5Q65hyuc5m19ABCl/XUBiUiFLNGODoVCECcgtOIidNYMIxLAMlYs9pnbxFADgZs5yB1hAe7XTvd4Y4ZAR7t5AvzccCanGX70cYiJcJJ6hhLqmomta58hhAzQkkDam/G+M3z8luFZxnKMW7u90ZoGzfNhtTSclpFFxSoWVJT2P2Qrgi8WH42ySJKoBBQ7rZZRj3/rUOn+UnzdN3fISQY5sjgeRuzcta3YCL2QB9x+OixeU5gVtWJX2B0OBDUHs2CcZEwcQ8BaOYs0CsqtTPhWVG+ndjnCuGD1sSBnerNEN4g4CNKvsA1WtwDImpoqlKNGOPhkP5ZKdXlsliMksMt67xKau69bgC1lYwIcVGAnLZbmvbyB7S8ycfAWIY+6xYfbVA15d3JbU2brh0773KEJDD19CanO328rYluXSc/TeX5vrqDWZ97tT5w1377spi7n3GjJovITot5I6UgrTF/w3/XT0+ZTbgWNPjDoc+veJyhJF/q51FoThrIL87HEIxPU6jMFE5qgd3ugU49veY8V2wHzKcwxl4LfFOiEVh2eS92Fr2xy3RVvsyJoncblwDA4SGUbaQpFs/0vodfSmxbObrADqoDo4hweTSDs9eJE+3GdckgRrgvcoV0kmPRbUUnDmY2QCCdNa0yQRQ5D2zBVjujpKDTtCxEZecybePXMAIQkG93DHCq1wJuFfKPKaP7M82g24KXTWcSS72t3a+S0Be+1pD1mDwZx7ePvyULziaqUHLg6R0JOQJKTqI1SzcIMAh+ISipKFIfCf1Oe0DBuoT/GsmmpRlcxnx8cuz9e5po8u1l9DzHUR3GSQpxc+5aINgHlctRymgqq4A04Rwie6r5IUga8o5MD2w4VJTKH9kwRSarPnyzZ7ruMeJGn4JoScUlH3DB9uJbJaYrB9lrwIBixdxU1ZlONoD9aDGIWnwytsft4vKtTBYtRE7S4cPwhik6L60yJq6PxanUIUDLB6o4NHP9ozc6T/nI/7Z+rJZkwoldaPTms+lCvR5pWluMwk1zp5kbhfciJBCOLKwiXjfm0HcNGHKkIY/SXJqjlMj16cLppuLtRPeqE2szbn+A40jBIckTjnbnKAE4P+xuZHzYFej6AoocVFoDAuI2LomImN8Yk1ZmqOC5WPbaL9VZGaMSeQ3DJkYaIViPFq41wEKmtBb0U0VCcRVkdpr3yqa2u+ikT4Lz4tkjtofl6hqlJ3ii94Nl7esEGMxzcjvduCiNuJEQ13ftsSkRnfsMBN7ZZW2MdK39zdtWTGdiHcKx/mPCIE5Essph7Il5pc/V7UcXdlR+221KOz6UA8EkNDZxBd5Ut2LuiZ4b4P1n4QC0szlulnVbsMqG3TY1Tl0kflK8v3dlbeVboljZ/k7wYx2/IzqgJTnFWKvTkYsJHZcpIqnpUHyQCEeyn5vjgZNfk//EmbkY/AH6c96xMjkx+d4c3FnS9FLeDeSRsTEqSAvGvkn9BwGxfalHQr6BSIiDI9W250UB1efUFBvgrJ2lTWgFqC7BCIuiEFitjugFNlsaSz7RDxtmPiCXXHWnxigd5MoJgX8WRDsgYec1mMeFphAsw4bzc66mVXC0uqsnRg5twyTyLe6cyCe8gTfmKvPspoQnq/hz2ret3a8B0u6tAOBlh7wAeH+5LfEzHss9/gAwaoUzJE5r8b9i4blMmy01biRhXHOE04k1BZsYzhiaW+Nl0XRM4QHuF4LPe3Ec0kTwwZI4/CBKNfrjiv5jr0VQxJbrQM8RVwVDPj9RcX9d/0RTOtyMan/BbbvzjKNK8MaNSoEcUvtnBv0+88madMo3EG2DTxwEnE8MnzxdMjc0gYcaYnlGVz2vrkuKc5YIyM3Dnq5lltXrjHlx7jTn5LcUn05US+3POJgHLFDMJlMQi/50XS0gIqiQKerxgL8H65fa+T+snyblP/cG2Arwjwoob0CyVurQMwd8kPLEtheBwZu6Qv2gWwHusqqOzyaUPi1iJV4pjbWMrgekQdxpo1MSm8+B7C+5DiWX+3I/Ds28PUzl0d4O3Ry4vwSsq7rDN7FWF4mpA+Jx0VakNOuhu/SMqc1cEqEaTRuDIr0evob76FMagTVnIYmIhXClUNQp6xWyBu/gBCloA3z5O7ENI00bmKKEj397nGFytlDpmFg1ddVbMcS7Q0PY9wS/YLMeFDKt010QmX2+9Xe52XGmnQ6dlw4/8nOr0GPKXihSmhL0ID8jBEEHKMfYKgz8RyBhn5tuhb8jLd1APGLhRJrP3IEyzMhJS+BywdsQCJ2SC/6aPvaVlGpxOKuU/RMCwC/0SPwpnLYXx+DnV+ylc8i1380phW7K2jcS6icvc+Pi/BkgGPE/LUzbg6OkeTkHmv8GeSPF3jxfY+9/3L3JvR/FGClvAUGt1UGf4Aa2P8c4oWL5I0m8Bro5bQqavOm0OQoUc8yCmxtukzr4McCEPJwd1bp1EeaBNz5T4VGq7VofoK1GqN8HJBsTKW1XWcfhQyx3AcRsVRFPQfTsj6PQyLt7ru7F48OAp9vY+VBgRDf7PY2a0CvNawybPNjixRw3oLI21YmYwin7a97r+WEYKGyDPQK5OC46QuhEfeBMu0ep9WgNhc8mFpIqY9tqFed1RuzL88HEjvG2mqILTeh/flAKMuCsUpzf2BjKshknO0TiS/YbJi6ifugQ+Lq5R4iLFMmkkFf9S2hR5eg3Foy9RWQvIdWpT0d+rCbb+51sRwFeDi+YXvePXfn5GZESH8F86CsFlnEHqGDCpRJFOcnmK26egmx3D1LtZFGgAyuyzEzONwfgNu+m5A4KltslRkFqpOD5pwlwXFCJefU7a6d+9hsqhrEDRykTx0F7UmxnrE2jLlHwsbkleohg24p2Enu9FpsUqk0CJGFA+XV0QJeSSgAlyXDrixJVbXPARShO6zyr3leH/6KI0gUC7Bv9zQAW5e+VBveZDu0k4caOiYZloi6veCWe8J9YAN+rHi3V+5Awl+Vfs7uuI57bjvSeYrY0izyStp+YVei41/j3dvOMP8n3vIy216e7064m6QqGZzwxtNAmc/xJIhhUynO70DVtGs70iPX5+b24NeXvDasJrnnAui+2rRAR7EwKsbIHad+nyAPUxDndYYrD85HDBPlsWoQ4OBxk5PX8TdRnzHrtxp8EVFYGF7l/PKY8D4BnJ6F7AK/xfcpVfm+MBneft7vXv2x4JRF/8zZZz8ylJUn2erR1YaXfPNPaD1/GCgqXXrE7w513r4gCKTgWOILb1fWnwJwUyNlhayqR9BESYhG8SbdN0Zsr5z49zBn5Qaf8DxuhEWbfzXz+hwJmU1jQblB/96won8S6ewuk5o6TkHo3tmRTSTM1H81vAsCR1Nz2Wk2P7IiZBPv2a2h7nyMwJK1u6MNW/BHJ+ZdSEEIzTkDlZPdgt9AfzDnwAPuZrO/icdybDYX2p86MsFP7ZI0gPKwRUR4LK3UBpisIqc/1+cjPowp6wp/5NJmQH2UWuCZzNADl/hpjBVYIG6jnKeoaXZR6BwkocyKC+S/3I6VPBre4mg1FDsgUKgTQfH68kk1JMo/fifEEd9sK/g1YM9TzIPb5MjrIEG2e8TeQolf3r0vhiJEDYE1TwYZqGeXfZRD2Ar7bFrPWzjYN26y7RhO1E47EBKbZ6cJLGV/G0vA/aMmWJ//Y/IVd17cwW7p3XwJx5058zRM8lCK6J2mlt15ISEa0uaKrmgmtpXjtXjc/VUCP2QWrJNL9OytpXhLefufgSeWQ731IrtWrmvEu2HpdFTjXrmCZoa11Diuq24A/9+JHHK4C5i+NOcTQt0Fi93iQLqLavACJSzoQD9edD+1F7ZMou5e+zI2QlvKQFEeQ+pMyCNeWLAtK1E+Mk6jitCSqnRYgNAGG3yMLGWv65g+IqDzDZWYBWsAO8bxHpLdy1AoK/SZLgwMTEQ1lTp6W2208hjD5oE+g25sw3xCgS/Q6eb2dXF6K7QC5j4gCr2zsalCH0Lbgir+pLqWFVJ2CJJJPX13Iznd1tssQNOCn04F1RWrdjHX6hgyHsA3O/8dSGB1pMKlRtbezWNOz5qxz3ipj7Ge33nrgLfWyC68/WIaGLvf2Z2cM4rJC84l5harjFsuoXu+1Ici/TQkDsNa3OcBBj621TfQogBKfcIhFnNu0t5hboJfDaiSeqD9mNNgugW1ZzwN+ACILJAR7IiVAbnkT8FkMIlQ08JlmfThHrsOqWhamUBcX0OEC4bzCOk6QgGkHZTHsMaPcfGyPbYzj8whGkgMSdWkb11phhK/+KT8gcKNQiLrbue5yV9IYGIKYskkj7S88RiA7+w1XTXCkz4q9CDTQvyo6cv1kd8zAYPHWhaagywfPqZIsn1J/m0dPddNxRSgUoxdYKryokDPsQmm71Rk2lOKwNhCpQJywDaqObn48wIGxzugkjycV7S6gbkt9PoYT9rJbgV0JVRQrO7E8NI38ZrKE1BRbVfsGAyOeObhcXEQU1aj2mcySd5JYhqiB7W8PWRdeK7TELWIvgp9PHQu0PJjeoX39PA8Mx6dnzOA+0aRelTDXUmtHlChTlgzSuEJul4uqtz6CwEKZxE6A/T6smIYew8cvkcUlccj+Td7RhT5vbF479pQ8rljDnVS0f2LOLSjbNwOYwC1hov9jjv9EG9sUXslPKeTKgffX3rOrnE7/vKIpuAH5eZYtLrL3ycTG31yp7Pgev3lmMXyfbpq8wp3GW1SHa0jgLHADOoknng5RNIKVh0sWAQmWu5M98kHI7wRZqvnIjwwR1yU7qYYTWrGW+6fdU6/noczv+DrRvu5Ry7mYwskSnKWgSitCgGcPcjayczd8S8CGHkvDYuM3zJRHYneQoLFi5ojr8GK+c3TYInrrV+4LYCY5JLsOhnQgTx8ppBTeE6v+F8WDQ4MbjmxI2ljCSRohoK4ydPfkOnLodsCmOMMCXhgwaU5szM0r910EwwqW0fH2CHJ3tOigJ7kiSZ8hDKQojFJsK3FkzahA0uflrCDs3CGRlut6oz5KtWvu7GnnIqvjSdIeq/EMFcmDU176lxqKhgUs85aoOk0QBkN5Vho81wu6+AQPI2P2PVvyEif68L/VywZMsYix7csHpEB1vlUDD+oXc1nmUGmJ5shEbLli8i0H6N5e2U1DoaHuSc5oQ7/RMol0HseHtgKC2c7LH72y+oizUZa1oDJr7GhmiPCqSWeBo48Z9fUfPil8U1nC/pUH9JqGuvQcTgbNjqQO7ZpXIqhhqnv3Shytj2T0i8CqigQaGAiiQDeEmV9uGZ/IoIrIVHd95sBdxkMOJ13rbhpi1WJYYx9n7rBPD/hCYKfHDxIvuUOntPdKFHDtju8iMPErw/V4atd8UH7G7m/JuIJ4IKvPUvP5/R5awy8KHjkcEWO4v7KVn6ISKtSdLoHzcPej6BNqX5nJi8Xx178hcidJl5vTKACrqDJfmqkjbge3c1xKQfbQtDkpMhvK3qexVi3TzyT864bGOaWMZCEGhtb/gmOYk0VzUmOJe9FlLdZbxh5gApczcIISWEj1ZpVpWw2xMd10M4jvLIa5fvkO4fT0iWXHpttJvLGk/m0lrYG7i1h82ysJNyHbhb0u5tU8zVpwzQQ5yoF6hIVPc7GDnV/iNRaZVpi+VCsRhRXIQjNEn9CwlcSizp2z58x//y3COuXf5gw9Jz2s+OxD4SOvpBOuByQKUiE5/WaSAhA8BUjFVbmBkdvYgwd+z36HNtk94Tr3ny/wjGDGriCeqox1p9Y2SYPpFdc3X6vJzGRSObnaOpWmT0Bj2Ziuq3Aam3xMW4aHQBo6VhV8bMdmYEcdRPyI2ukDYrX1GXSv1VJe/CirDRPNb5jGaIcSsmcjwIi6NKn+MpOISaHBRi+1OE62AU1pWk2YGEJpuPJcpKSwseqry6KPHxs4Qy+QQZmHLZWF3n58zJYmfk1vSfyw/oo+axiWwbocPn1LTmk3wpRLrm//DrA2U+NGaT1faSLiI3VCzjVzqrsleEx2Y7btg9aHvxaUs6pdeq5gb364d5l2t66xzLAXNT2F+TQ+0uvGk/djYq3anvHLfY6ZCvasEae3WhaxMsu8aXmnBSFWRnFtySj80r13Fc2Em+Kp6QJtQRyKvpRp+f1MmYhqD5cZWHCJ0BFZRDEXOl7zIYSXjqIONH2bmGiiw/ZndOArdNMjV7Q8sdcGZ6dHrf8NtQ3a4iT1G2BZjelEy0b+pLG6hbuSyDmnLFCtbtQ1fUjkPkfwzVlN3Yq3py5JxwhVtVDCeNX/Pe0b62iPngckCdkJapw4kokl75FGFuZKFf8zpZD51X76nIYiJ0whqAId82pdm8szyIfYz5Cn/9Ue3PDHNRXa866idoscviNqS8wr+0eRFOSoZy3oR8CCA39PHcPScO0XdmIDWTqQ+YHXoDfo/99w1VS9VQl+0Zrn28LsS2KsLcbVxMnqMcOIjAh8JlELUCmB2QnfLMfpIeU2Vt8JTv57M8VL02HdZ/nwbPzlFoap0/Ow3ksIQ7LBFYr5folrwCOGtf9vKLnd4Qc7nuaRmQHErfWmQyBGogzgNQKFO8havcwkKGayP/FJjmim2EJrC8R/SxoJ46fsVkn3Nm3UqVMCmmv2muHw4tLrcWINM+iiZIFbmhK2EMEIcXuMajO365HzH60HBY8x3ZvLZCx+Hi9VkAgZvDB8HYoTJgh90hr7Px6xJs6F9QyjsnmbnlMFBnJkh6hWhd5TaZ3V82pO9MnGQ/zXX/6Ew6ea+fxFf7CQxTGC5uoYQNvfDPxPVLd/nQIrNUNy7SYieCVypd4UElN63y0H/TA3A2RTgV8agBmTJH6T5KuBVRPdR659edEWECmlOooG9TRPQTvI/e933fT5WlTJ+Vlg8kqKKvYVZ5QlcX/Ys5pIvwfIwiA3lGl+aw0j/ys/dDW6jg5JCX/A26m8a8YTlXnZTxeVBui4Ag8Es4amSi7AQibmBl9i+u7OGE1VxwnQzGjS2aDvcsgJFH8H1wtHuhH13zvo6yHmhF3UfHwM7vS/dnL5NRIcQKk1CrQDeBDtPHQuZrP7VrS00f7mXcueVQ1xJwDDOBRjmYBg5HPH8XIc1jIfUThtEs+a/ssAkF8SoVJnvCYrsMPDLFnw9IEJw04nfYDc4y0TB1Eb9488oDMmw5ANDADf70cJtqt2+SkOVxVIu/bWGQJY4te11xPxZRmLj+ouVKnmQtOj+PUvoenyi1NrEgMqU07VidmVPMwftRVHJ+wa/yzOevlcrqBZc6koeBysgijr4QXMu1LMQ+1fCmBEUOyGG8t7LxZDHJNMBzf3LoK4l1VHJfvvo5mE0xDAnwSdeYAZysrrirfgL0iO2gDSCC5uem48nhU/te0v/5HteDo99qdLDeILD0XfIdEig3Tu+7iDFaMK4iOr3l6dbh6VE5XsH2VD1ue9536BOTdcrK+BoPcrF6rSIog+Tp4oJqAyRPesTjvsua1Bek8GBwWod22LMLoXM7nP0e5//JCiD6R9q5xe/BBFmGpdf52ruympI2GKQIz5CA007D9IWqVvlHsjQLMTHQEoxLVB5moHYWk5CC/xoJmq5cQ+481ak3QhNMQrTuBQ2HPkvz6+gD68Kb6rRkXxMXTVxaKrTD50a10zg7SiPJtusQzcChAfhWDef4VTOGt4CQ7X5jxWZvq7V4nRtG79BzkGxAu7Rnf2sLoCqPWx7I3XZASKczgwtEONO7pyp5/PRxLjZ53RxqdrFNLFnvcBCBWG4ssoZZt02bBlbenF7iel8YQZf/mPmNPgBEPX0otVskmhaPAEVm7I0UfdXb8eZEVK6ZBJNFA6y0wKqsEmjSIoyK/XfwAYuBZc4uXn3ECSPyoB61olsHBO+x+rWure8bWPhpCHIRiZOPnXbhM29q5Hmf+BFTCu/JTusaGD54xE1c24EtsvgJECO/y8DsIC653E2AXm1G61N1HF5Eq892nzab4yVdBrn8xes+ZYKzmFHC0rghmaYHIrQndGV75B5DhfuHRm+KXeuU9Y+neVgvT2G585eqvj+RcqVL+DOdc/t91OQzDpLM6PxRLPuZpfxe2uEa/Ye3q3+PU5sXp2q5SuTGNj049ac3FGhqoPC0dnSFJE3IHWX5RYcaKNSubtDaLhCyPaMlvH2vux1HYsDrm/Z2/goU2m5TtlG1bZQOt1TP/OnHjsudVMEXBEJW02nZicvGnH6CUfyncG1yUfOGx6hfQDRWaBpMZ56SwuOHMIY0J03XBDiGzv6iYemjH6zqqvUv5sHzERzjZe6OS34vPsC3eyTF/e6nMvjebEgglpXzmE3PleIQs85ijcI2OcAsxN0AP3l4sefXnPjw3a7wrJoI9QUrDfQ+wTshJ2jPxDFmh9c5GCIG+g6NJma0NW3QVtXeDIFbt+MPoUGrv/1c00/7sFDlsciFGJQ0tnqS/9UBbuGiHPg0NrY0jgT54Gi3B45gk3NTnJFY1Bgl2JXJWi2eO2C1mYMilFif6DcM4y27jXbM4FoPt+EM5FHU7QW2rr0VD769xmwIP73YRSVgP0cBHxp8Lw2UfdQzEPg8w+9qtHwHUnsUf8Xt9bJmqk50zzVKG8qOmskF2l3KukToOtTlCSs1fKT+bl7TTd5anr4AHF071ieTfORWo7WqXwwLq6BA3NFy156sIp6AEjLcXvaMh1xr91bQVsJ0dK0mMPVvRbIXMpmuCBJNbGMTEyzbUZPPaAM8VeNkMyulOSPNwumxQybHwv8+CXdY6fIOfMwJxaBJlLntlSyL9l4DsvN2mdLZLDUJR9Knj8z3TZhfJqEII3nWz31hjO/47vUm+pRH8MB1DAwFcJAuYk0sg1KRp2wvDYQPINAm13r4Ahs5cKSKPiB8RDO3+QhKoeY7TkTgQWi2tqTRRtjtQks+v/Kc0ab3h4klHXPM4mYgqpUhlLetcoOuwX/afH5qvyYYtXnp0h5EoObEx1FzmD9rSunEGu4STaki/dxegqe0ftVzSXILOocEygIwh/10Vyy5GAUT5LQ2+UMLmdEQDBmjODWoK5D0AJUQ6igbjZ4yn4yuQ32iKx+5avvd24BxbNNeMByW51tRWDeGs9WR3/P9D0qTDWQrWffJGgWA+Xb886pFHJS/jZ4ePXhxiwd7XU8CMI8orjTmlIosnYgFvWX/7f9NW51oDmGPC22xxvjxmJbVJNMJuagAZLAwZVXqwJLiUGfDuKStLuGSdXbvoqxgwjCy0ZjbrvLdggIFjhDs16IdOsPoMWDxR0Y1eHdVIOPuZ+FSi215te1NXyIPg8t1gqyB0+b62XusMRq/79UzESuKpaSPsg+3UNqagfIlD7T27MVsvasUte4Jhrjz2j86l4Omb4Q6cDU3Xz/2QFvhNj2fAcbpnzcyiRxFKl9HO09S7XdxLf26N+RFb0Kjb2lwSRPbPgVhfe/aJbxAV+v5Cx5MzCvnnP1OzGGMO9u6lcZzLyMjO/wdEBvGd/pRGhKKRKfkBqRAyuslbnvCdzHnZh6NCzNrXhQ5lH14R8nz7z+MxnXYa8zR3TEnQu6MLfnaKDpw8FOmUyO0uJ7BoCK0TdVmw/8PmKivQme/N1MMQPrGZ4ftQ+Q1nykvK1DsnNYbPbu/qH3y3p1AT8YZHzUTkvmIIWr7UIJbH/GgaMwy7u8FfjzyjtrV133p3IhkGT/hjVP8mZXuDX5TvBt3AOIafuv3bI8TEFkyQvzJgiUM30RX1PNKA/fhDcekXqT9xrdL3WO0FIS4XBPAMbvdk5EdkbUpB54Bd2y6tuk2bDvuoO0iMZAcKrs9Jnf3Fqt5nUxuru7Kcg2g8c2vtLNnidzrcjxI1f3ZcYs7ZC0QxOo2r46wxBSnkU17WcvsDZzp0hPmyGyffLohvR/2j5uGeZ8+rSdrqzWzzLWFRmI4+GikKcOryH7wY92zLBx8QP+j5xNMbox9a51YFIRC7eJTczuAnKEi+jbbmjpKywqwizrziVSmj9lw856c1Xpcf4oob4h0pEVmHHORB9DyJutEatfhNjtIHdFXOx75XkcXliUzLRfHh5Eo06OTYj90DEDpYeT3+eycN2Lk8wgNedkDpT3YhJccTHp9nbuHZhhIePOtHf/7NoQbYsSyMythaxH2OklX1pWFHKGo7k/QqTH3Bo5j/5tIf2AhEJ68TGAnl8cClS7CdnAfwj/sbmGwUeoWJNRD0MNbnWdZrjZMs1tr8yX7Ms0z6rMHBa+bT8rlgyvtgoOfdSX121tNxBWJIXfI8gdpLrBr3zZUbN/bUZdG/o0BrDUEN9z51lEDILCCe1U01sX+3IeWC0MhUXOa4fAbDE9/uGIepLLuI0dG3sYE+dE5lWYFz2FGzY1z0jW4B9nb3SXy20DSXpl0vg/8QuV1ajSUIMfjRLisIoGsldLDGIfHcwpAh1FiasNkjCbcZj2Gs5yzw74goTCFJR3Idiqeb0PQVOURLc2HE94aimR4QWy7mCVJD3uMXdVtyowNbAUGnhG2oD4lD6i8hR8nq9RFoH7TzQElrII+HS88kJmD2WLhKBvv2/wt2yj3kF72FwUaGa0H3awUW2GUHcsXg2poYxEVMt9wgviuOBVGGeh8BGAdBls6nzQ+u1MTPEj6ROfr7+ct3qGPrzwGScaP/wRZlTpcJQ65UwE+LkiOpmKM//YVP2hCF0RXQGfgZmTW1SGpSt4ZDdVmm3tpL3DBygS6dqQ0UG43kLfSl7xoGD95S4PyXrVc31ZfnJa18jjQDoOCm5p3tO0/PXIPxJu1mAQapXIRxDXreEt5wbJSiurubckLz/YO0j+A35XyioA4+31iqwqx/Y09fmn+oYuoems3x7YJ90xE2n5sDU/putgaO/ueOMcXugIqCbU7NkW7TfXHwZBGtKPnn8YtTlugq3b1wNZBLUhz0rXR4MmqkeK1ZCo8+/5x42WjRUgetK6RKZ0uHWrzd81Ml+aZ17TCVKcDNAYaDHEW+j/Lugp83KlZI6YHRJzzeCSrlGnxj/ggCR4h04IpDBlheVA/VosJSXzUx/zPg1mAZG/CMifyFZ9poJk+GfzWhiLzRP5ls9n7MjXa5A5h+rkpwOcDr5/ssHZAK3OHgTIFA6Cb3UEJXqygL+kf+dDgSfIFyYP+L3OAuHcQrmTTSwve1vcyF64x57XUVifmA2D4atchw+Fa7agspudU0MY0axCr35r1fnNSTe+M4pkCkKEvpqM8sdfjW42fsh8N1RvJyVo3uoT3DRjHtv+NGlYaKQY+SnF2a18Eb2zLbFLvvmQyG7c50Y1zTD2T+mB2i7oKaxUad1+yuNwnbqwUVcvy4Mb6c1AcdoUYMOCuZVkwpBP0qH0V527iVmjfnnJRaNhRXaajhBkXNFzRtM19ju1XXNBEUfxmdB0z6ndL0U0RvzUbO/4McDGNnou/cacU9qDRhRIJgVLu91GYk5PVS2vXhjmO4sJKFd+FkTNHENN9RhFbPw7gi9+Ep68+vef6gnSGEbcbfBFGmAtAGxN1Dk9MWhS8AHb37p9TrGVnsAdAiM0Vy5UsJtUcr7mSlr8G8hFlwk/EDueMqFSywfnBXff3xLKb79uFdhwKbLFjVxT4SLEv/tbaisQyyNfa+JYFgzHR1m6lnRgJv0Sreabytjvm1jniyy0I6h9h9AhABDk+7cSA0Wu1K2qtmhghbsCZOGKm2o3+2cFotERUGZfXHbH/nijZl4FwbnLCLkvsWpxG2ee4MfOawjunYkedXrS7y8TPWYTt0lI6xpIAMUZekoJEKody7iJArZpdZ4UWkffMj0+2SKCJGA1cPeaic72RvRMuhu2/wvDiOuwxl0sszwiL0ACxBICOhGI3P8PdcwjB+AqVAfEEg6eF8AnpCgqbxmKLYYirrNcYdLPYuNt7wOvsmAuWTqI1bOWj1YX39xlXBAimY5nrOKZ5hwz3ks9mWkPCJCLrjw4VfdmvuXX9XN9BWJ8IPhMee3qMxMv/jO7Vwy/D9HxEt/euCh7XFHWeHJRyuWlPFj60s/hF4oOH6k4ML2MO+ZAuACok4FnFeWVHwuRXTVVBSo+lBmMYi+SVNz3C8wYQxg7mC/SDyQmVAcNpwkC6DtSPEVbKUvmrKpzcQ1fGG8D/Pbc7NHZfbybFvFl4w6EEF6bdh0aaEeNtcHOUoSS8fbrtsSKppGzgW1X9X7PiLLGvERQV0LnpsmkrCQXvGbMVaCg/9b4ac8Xja4u0tYpL8iEY6bR1Y767pG4MIh2UpKshIPrRLpc2QSgMRURXDgFqGHh5Jm0WJ6aNUp1KFRRQjIbsXGiLgSkXwrUVMuPZRecIfAfjXUnahTCwU+tfZ8Z0aiBozFR+xDUXEkoFpOn5K+VDdSihxDHHzPUQP7e/BrGLBMOAELik6VKPaFWhmw+5qu1ZuhthBi83fkQfbaiaSRFXx0JTkoHbbloOypoKtbGiP90B6hVNXT1Fyhp91FT348yVGGfqy9OR+2ESFcvfFSZ/Gpv2ZLkwvKFDlgtQCUBZFTUGh8qZxDqBPVymBhMZs+hQcy5Svhe7nJNPLmWmtf+Usmh+nsSZKVkJwsRSVXk0vyF8vXL9iOrIIxNCwsh36HI7fIXSa58GM69Lhpy7Yv9buTbDNc8gTynBXvpyrr4QHc4rlZR5p96THSCjH54q7OpN+qF4TiOwsfnWXfV0BxrRQZNP3Z8WVVl1g4W6/MvsL0Qm9ufJKZqAfBW1VAOjbM01g0Mu2DYm06vnUJqFABzfSDEiXplzzBc4l8GTWpDiHtdKSVm/zbNwxpiStR9uXypCOAAWGBH7odA3dpPjOCjF2YCJeNhmpbzV0QO4pCsbWlf3rHECKVQPmqO416umnnZHxfI9Rtt4EHVXYrvop4iYUMTq3uxQm9d9VImz8g7/P82MYJOq9/vAG7nZNwIC5Ui/YbWKvUGmhiTQXgXsfdo24ZH/a/SuYwS8fR4HWJJDTuz1FI9SKeE8/Lb92+InyseihYoYCvGh5k/WmD1VnaS4uAWELEymvhXnSdertmbjBCIVwNlhgXX2dKKBlqB7rvssLvaIe/2utMcQiz/zfenGgBeebtqujuP//4rQ49AgCQ0/FtX349u6N0x3sOItjXCPyjqAhJGitGMtXaGoZswZrRK9JRdGEnGduGP19l3XwR0/1eg0ylkA8RMHK3zK7X6GVbYMnUfQyHlIkBxfSpLLhvCcx+1q4g4F+NGgp3u5ST/R9LDK4RDuZoroT/nsm1dp8Ou0VqQm2kfy2x35L01M8Kk+VeEYZwqs7m3fAgzfTwW9OmngTL1h1ZXP0IwKrzRcGh++eTSy4EeAmPtJWtvYVhtlF1sDxzDyoBTgZ2ToVwdeSUMIMJghRi77/zY5PhNnTymn8RHiGYUIEsQmgD8QcrrvX+ELfLUhDpKNCrP/5SiCn5KUmTM2G648gwQ+c2g1O5PBSGa8Lt1L9JSREaeS2vl5sEOTyKdoIOO+ANwgqrOjEQonKgLKgvH+ChCc3PUxBTyLiOfvB4SPG/Wv+htPPYNXMng82Lr8zWSDguuuzZ6F+14bFam6L7jEpW/M33O/CxXCltc28OJ70bUE4S//LEVmpa7nhiuYLhh/eIp/Ds6IK7nG8uaC93zVc2WZJbb/Scm55JY8kBZVuOkD4Zq02PAgpdzbw3qI6BrKYLfPhjau7TuUDwry5M87ch3s38UBHYgcaldUTX+p4WCR9pF5z2vJcHDyM+JV/iba6DohbhWgV4yaH6sB/TYcSB5oeHLUkU9wC36z4Obez6i8sBbzIiNCN/r3sXm9wivNY1uwFsbPxLlOCGmh5FG4ci9UZQWM136q/Oku+CjKiSqtjCEIPU0OlJSULuKxz/fmA5rBUEabImG7m663JIEzE5VO2yR1BDf7uiE7w8vZtAkSoWRq/Z6cHPceDUT1ImRZ8stIJ35W27lk/OCJrjmn3WaQrJ6HBZFx6m3Vb2nEPQrA/tsEsIa+0THb8nYMqJnHMbuXE1TdPKv/Bcq1SVDige55J6poOEG0R+fB1L1X4E1Hqi5rzx/+NCLnysLjdnj8185bWpkn/Lt4xSbkFaIUTs5PVL0qTCgf/aUGRh4XsOrkgSqxBS5270Td+k+mFZ9MI14HYLa8TqLJwIBM7QyiEYS9ASjeJZKc9ROU824qy8acuQHnuuk/wQ82MsP9ajFlFtth3A3+AznmDhAgDi+TIR5JXeWMalmGoxiHOMhw0AsVpRZ8+W4dBqh9aRorCAvNVFljE0TAoM02aIZuyVA8VeT7K7+vmC88J7P7SjhKbqRYW0XxwzDg9FSPVnClKyNzgEvafc6ucLJoNXIOzFIQqKTDZMgQinbo4B4JJZ6MPdFa8rp+qPivqMkaPKNb8M28ySD19rEwZ/pK2Am4Iv4Z/6NzDkE7r0TqRFeBLGzBnQdBl5UxKH4P/BNIIKbRvwUOJAIA8KJoCf2m1LT0cGAhGEeLpArhKkiBj2DEYD0D2sbX16w1f3tHCgu4DKo0LUHAH11c5/atoFFWOFLDSVnG2A+uTF5NCPdZ7r/1dd2qgnGtJtESDLgDZPYpPRzWP7SmiizdwT+gxBXwS14YEuwaLLImssHPv+o47od51QrxfVU2FV6NEL3QghHAAW6cL9+2Uc5o5jtfcoTwKtwX4+adjseKLDxmDT8gXSPIoh+/NJUa8RJgL0LJ3pn7PkwfF+aRHBRY9QP6ceW+Q+2uv0vepN/4V7VUb6/LJ7eRm58pl0sRvDaN07s35+Cw+BeFoo/jkNtrd58L/7mAAnmCFE5s60nXRMqB4c3HVZoRvy800KRYjkJMFqGcDp7aGTjtylbb99vJgwa000+RJNZgzGvAUfY0LgOMFwVk/hNCmmhAjCuOZAvzMGGCslvGwQgSQzcSY5uoGZk94PMp2vM758Jd/zgPGU3RkOvEGEX4XPtGtxy17x9nnDgRO4j2mb/G3KNSaCLOhcKPTwGZz9yVTvMyZlIBrxJ1ZnXjLlKG6whH177HE4e3cOuBD4t1OHJbfDDw3Dmnuq3y/TCIfNtgo+/zbqQi3Klw7rSDXl1fUdPHN1LXSVMjfkhAg9PoiYVhguxskl6SdUV3n8Ij6yXlZCSphP223OtxE/+XjeO3e8DjNV0gtVWLyTG144lw4dP+OQPAKolmGhHIvD6RfS9iT+IxqKpHqFMjr81m3b78qgwAQTeW4wJuNU0XYN5JGvCZf1ggG3qceqZMtW9GuzA7cVjwldVDM126TBdH+zU0JlTFunRltMhJhKuPR7Ripl2rD4CtjB++IXPxz1WrUaP+jrRKkxAFc64jFpDgOeUkPt/2XHsYPZVe0Uva052TaCT21dj/7ZmtnRAKNlkoqpDfOiRnPuDQNGxAZthD96MtLyVp2JOAYsjixAKzaFXNhOcGmj0bg/B34wQP99e6nfbwoybLkB+QOlT8ROLwyiMjM/4bCDSwapFVUU1953l0aatAWVoASCz9lMINJlozkqzX65Lp/OcXGnidon7zHnaRmlvVALNHAZVPN/jaMpwWYlAWA/j8SYxeVmOVe2CWWB2AAUwFiZB5YzCO640rsGAcsGcnJSsmgECCwEk8w51g4Enj5SCGqxCrvoW4BPHAWM37WiFT1/cHy0A921so6LoVCYAfk2xfxVMnpqu6XQWGuuNnATc/ddO+RaqlmnQtB1cmd5m8nDRKucr33eJvpgdtG+PiMyCpVdv0+1Bop0nEL0fNc8lqWLBBdODVybJTNyzaUm2elzCTQqXEYRPWRcwq51B5tF93I9/mc8BL05E+TvFAgeCe6hxG+kX4akhnuHD7D2M+FEztcwH3Bdjbmmhm66bwtRp+ifKgCYwX2pdXxXhqn1/WPOdZo8vW8Or5WEI8/DCXTd7fl1rWcBDYEpr0dCJTPKljBaJ2WLNIT5GRV/nwgLeQOJMUpbDdSpM8DOxyLaZYxZ6hnkw6TJhp5HeZGyUuy5oYbYh7bE9WO51bcQdWbqyokR7FoI9IBl7ojSQk9vMGThBN6FLI5vO0azkUN5GCLsPetcZWvQQwRO+uMGHazQfngqde55ieC3aKOkz+1uBEQ16e0sMVRySFno/3K7IJr6oiwocxXK7QDp0IiXXROFTVTWtzGD6Z69oBSPBxKhRb//d2A5XBtAtpfNR1qGYncf4/YsreQUcKYzio60xX2lrryHjOt8srr3d63wnipVvg8nBaW3jINao7T30ixtFQ0kb0KxYNcxUqtbyAz0CEj0/gb80wBdMd1kVLHiSD+ZbSZHtM5x3sP2/hGYR64tmhmoakFvSNy8kO/rJ5ag+3B9twkonPRBmnO3oDsOFi4u4sJau1UF+5u729hLPjO+yKnVgLFJG7qsFCRX0PnGEl1MHZg+M1VdaYj6V3ufP+RsvX2dQTpSvyPXiPq/UCoDNcLfoyyoPU/krJIdfo61Y6yLplVC1YHGGoXllVoSUK9DKkjapylI4CQ8cpeYxsTl2g9muM7VWXcSNgr/4sHRaM5nJ4AUvj8D01514/E60H4wpA9EOo7qqEt8ph/O7CX4gEPDmlrKyQjROg2kN5vvr1AgfAOwyv/JEp+kMuiNBql4YplbvU2MnYq1JJXkgcz0QJWOpaxniWo5WfH4v9ceAixqnuBrdYu9XlqZC13kOCxRRV8bqHJd/1Twf/AupBEgRONaV9V+Rd92BVD56hct74kWkBJfsFGwCkWTGbhaIpRPa1y7R0N33MJxOI1o+L83AcPdLNOCdRwB8dUTyhICjYJ1z+1Bw3B2F9zzhJ8f/Z+rP8k4HaZIqZpQ6n2yG69u+7zxVGC7HTT3reHs3r44eJAHLrnu6wZAWoJLoSuQIaLizO3aldxRLlYva47ckJpWVXVXUQxPsgxRcZJzMJRM2r5LOpLnyPow8069NshnyldWv6pZZ4S5Zyftrb5bHNARLrdCc11IvZ8NjPP5Ki3ggA1Wg31PWG3eK+YdVd719ifxt1tw0CxTbrDua7Y8nfGAR3gWdM2PEiMdKBAz2wCBxBxdk3rkVLOd2dJJ9oMgR/rknhPpdEQMcWxAaUXzaGsgxpyT4z1dKH8Vj0tVGFxIbZfSUliVFnKBpraEdGX/TCQGdtnlCBY1IX6/AtoZTCIjDA19n9WFNWTQxPiD94D4+9gzkwfKCxYiUBCmv8C2CvvLYRHcdEI7MIPBBxJ2qkZH14HdHT8wSuqTRU16V+iIEXBeTmxjHO/UYxwWqCKTR2Fa4+HwwwjJIXwA7OzN3whwVsUBC2xPITl5yAC4FU8Ji7hL1KKC58FtDEzvU/UulWT3ish5WsIbzplZnAeHcPvKKS0Y2JX/wLeCrRsi3tC6h2l0ZWxMkjy8ZKqt2aQgO27Cf6sZ+O1g1N0VyKwIbho4YJ9X5xIJTpNwFbdJocsf2nFKs/MXdIAyxGHbkGF7R00B51sBbjXwc5BQeOsAxZk/g+NnJW52lhi+FMrVxIDmb++hrt/JBpgMUWef3w4Q6Jdhpbra5oh3biLeJk9njFqSlz9nmWqb3exPnUGnMWRdaBvd06Qkvar3ARvYlNWIhiLpoLsmUiL1HJ+xUaU+iZ953cE5La+ShPPMrHJavelVGwx+jBVHatviOgQ0ythz9MNBFGVnq9gwl3F04rG3gBpnpXtsJMvrOZUPUjnlJRcTNZeBhEl5ppzOBUJLhxyjZSbW+TE3iQ67rm/8342Mt3cqYuAxyLh20yUsDuaha0uCYzxv4S7vgEY91F9+RzxOw+esdQVe01SpV2nzXl5cp+2n/QWQ0gKZe1VVo9RGpH+soqRuWFc/xiiQgRIbK6L9d43/pwDTvxzgJPiao5FUHX4Q2k+N/7z4W4fvC/4Qus/ptz3jDc8gCqHRdzx24Awrx0nRiJir0pDrvWq+QNloDbn+NnjXS0UlWZKgn4m3BK+T+UCosfs56WoyUcbWDRZvJrTg0o0X7KWCMmD4tZ09EoEgMd/CMF/90eseTKolMXjL1hco79K2CJ/7S8eBNh/q9SeJE31rGrjIw7TpQgINcZwWNTmmeDaqN8qy1LtF+bHB9cMCmK9QSE2HSGABUT56rkQLTMOlbOuaFp31vEnQSRG7nQ+owPozL81uUfWb7+cdPCrLUTo7SWmVK87EbslUSuEe+Vv6R8OdJjvERvUoQOJj0ozoxEQptRounvNCLFVFaRfX0yIEa+3SNttpBWH/2+UDDTFHI9cJ+x5bFzleTif5AyHVHnzqo8YC+ABr1TgHD8394C5i+1keoK5D0DZGtBuUA3TheEqylMpy5nd2FBKBQMF0A2+kpkFt4+xoWH+RN8Uy0w3vwwc+fXAbJuA2m9Bq3PYp2bFIgjrNgRgei/6cgGSYn/Zno8X6aFrSHEpJb35e0P7dCDsbHb5UaaxMS19wStXstqdga5WwIvABkYslt4tCEL9konFLw1kT/H3KalpZoUZEdz6RTWJ6Te7rTqFXUDjiKQBUx38DMMjS7dkGMO8onCiXQrn8twAFiXaEKHFmzxXQ5u1vM/pK0V813ZvoxafECfM/VMPTQd/j485+5wKScSQfjX9GCMuBciy+dbap5SkJmmTXdoVzb2UTV6D+8vLkSWX6/NB8mO8Lid+oOcdfmAH19yYDZ11AtSxBWxT5csTt5nAzoM6YbureQLGOTqJYnDM9JnXMZoyJdwA+IX1mH0WvttmThtHuUnACYcdO9lh0G4vM2pu3JDvmKdhr2G01NE5xtoswsPX0g7gUuEj76Y53k8Z3LfK3By4UtnatsPvSPFJtgGfuxTM6mOox483ywgcwzsWAHHv6gTw2hdyGD0ayshK/DtCTsTSR4+ME1iVVOSeIaLIMVQN3S4kfoRexCWlZlIDMZVHlkauK8Iz9Y1f41+Z7SEVmQQPX+hl4q2wBMEedqSqA/0gFEfRppWXgSNtBbUoeQ5Uv2l/22RaI/k715cha7FLAyGq5ctiAL3qJyjEBDtsEOJoWL90YpIxPy5olRCludvnSN34zzlhD3qEE47vuzEp0CkAMsALJE/aPDSHpYj6CdfLU3CV3nZKSaoKpI+SnJrmjTqccdrLRJJGMt/7adIoPtqmQAIVWW+NXlseA2PTsSWzbeaY53GjywhDV0c9G6lG3+RL3Xi0p8Xouk0+kIKbi8FtbELprOP8veaY6iyEL3lzD1GHQqU7zF9L3dPqe4ViZf8i9VVksQN5bCZmMauqS6qIxLuNcqh7ki45XxFNC+J0lR5KAVVBEIi+bIOyBu4+bBY0fYBuatkQtFb24R7DLeNA4jXJYYp6XxhUYoRN45iC5+OE+2W0jayrVPiaHkVEgNzJ/BVwWNHJTNNfsx0Boz2zc5g5YNvcbanCRuYVdLKZmL28wsF6KMEG+Bs2gMF11FX4qO/Ela+RcjbJatZyE84rILl3kdyxGwoCxctolaXn6O65l+C/JJlfVlwuSiSUPDkrZC6wGIoJywpJi286XBA2LSR0yywTwv7l2gLbiyEYH4mIqA7TixFk58j3ZwqpEa2S0TXx4XbC06NQTR2PehlAnylexad5asufzlmoKbs5Kb4DbOp2yO9ADAOQVoCANWawqw0cM7bZBD/KIFyw2KyqiFxWsrfOzoKZe8rSJMdfdE9gPm+gV5nrW5D+2RooNfniB2Ers4HIML1kd71m5gX0TniLFZNMW9xm2IjXlkEPpc5z/5uE2frvA+MyqpaVfllI2JK+rMPV3ZB0NLZTA6SF2/eryBW9V7x3A1qx2h5+yzTBvAuTTrFVadeJy7uWwEppFiwSUnDI6SB6NluNPkyHok55hjhyfYEqhay6KfcIiOH3FfnUATCLtORjqaYs6DgzuWcVZaHDAAfs9teFQ0bwtO1fQd1Wc/BI9k/cmiYuQEMDASU4myefTU/zMb/bi3HXhkE48xaQdzBoxJJERUKUzGhhUBFUD3WNcLpW1izeQ6r/I/B8yhpAaAugPgFW/kt+W5RPjGNeJYywf1FPJZdQZOHCEd1jgrkuxZsATRgD40StGgQ4BGZvqJG/j5jhNSja+wEx2hsTEpc5jwAezZGNyxLFfwzICEiL5gg2OeUrl8gLvj7KfkLRyebYp3iY/s4X0t7LeZKfP9hUNJckUOJ6qZfzgeJlI/yqcMtSPjcjRZ/mMCtt9zt2sNXOjFg0JAsjPTv91gXbm4lT0ZPaXna7w0VDmdE0JVhyj6j28QaFj93ujvoiPt0ptoS7inThBl2KnxLOMDPkJLSVJQtywk8kcG7tBYb+nopKJNKEttH/kTkwgaq8b8jEy6oWBw4g+KsGdOCPYkVQlmv6CmFDLJHs+6n7jY5XyOvSRXFaXEAeO+94LEylsg+dZ0a7YAmj8rYvO9WxqdZcDl8NDFuHUfsoNZ31cF2Kl2ZbIL9YIPOFr7iu43kRa7/xSYMb0Gpy26kJ6W3lZSOMHeYiCWMMdJeBChs2qMrZ9YVAZrMN73Zn2daq4H8PmBU7QgKhcT0uyOiCm3JdFShpC/cJ6Zane4xYWOrj+kpeOUNJ8txlSvbR+MMy3l0Vy5VpGXURpjdPkH2Bm6oMUPT4bTeLDwDpPheezt18w0aTcUMEccjtAvcFvYPoCtG4te/wsjho/GLq4cx3gu3IdPBi7vE8GfD2OwAbMrO2rNTANQ6Lp5Hyt+RnEflbRl3zn5o4OCzoH6q6Kvqc6p1wMfi1xr/NOo6nkGG9EXUX9uGasw5hWtZ+fx4BnfzRllHVu47xgCKYlwBnGcDR0V/ORdIrHouhlzge5H4izAvEkGwP3hqMEWcI2DDesKiCrDpF1oihrdzLc9R5Ym+CoC0Nu89O0qFjFZhL8B7CJbk1xJOH7cUjSQWD37SVqXyL+lfG9UjTV5m4lKxB5kzMQlquJFgGMClrlZaatEnJlPFiqbjjbyRb3nbTR7q6GMNPGyy2ubp5exlfNL/TRbhn2N7GYnQ7FtTY1MuwCFkrpo92AMBdh2/SohrFPd0Lg1vCdZjyxJZ/mW1Z8Ltly+E9on3BhBe/b36x+zg/vqIqJR/LygEPZhhVvg21O2Xzfp1r9ofVM9lCfbfDb0olkRKQNUxPhw0uuYJvyK5C/78wlKqXsRVQbi0XftP0P4DpNRXiyQg8Jn8oZlcCdpgRO1znx+135cEG6TRFOGDq4GZgaeu47o4Q6YlnsUOEG9U0V3rEAUZT3QUykN/dVinYJ3S7HSLX20UnyRynxQ1HqVcpxeURvcCsc3cHqjGNOn71KGQS/4dHuqXQKbxzJzrVfLcw+t0tMIaV06fJwDPrflpYpsm57FZinb6Ru3Uvajweb9IJbEYbdfLe9cJ2dWIVX7XP3GFTHiMloy8Nibt8UyLCwkLEd+lm0tp/bWRr19ZP2d4lluXSe8rjDlCGnUwNoJA/Z0OsnqeL7Zumi2t7TSa9dWYvyQpOgwoEvHf1j+lK1sOvX+pi4B2EOMTsdl79cx0zjJAMnG2h/emlNkFhj7RYv9eQpKtpqv5Dx+R2UHW/deyOqSLJ0p/iHnr5ge81jSG9b2gzECWf6aqncKa2hNOoYaeI81VtnNezPPhCaQ0kBz2QUIy2wz3EhwtK/STQ5SKj5vbzCagEFXQ+bo6neLIpnH5syJyAoaZQc8oU59dXH1+RobzHuiGLWoFH9G+16FEFSLH10n5cu9Xy0IR9/uRmy5U3SIN+PpNk/p49Tfvb5ZDqd5Zp7RIaFr/uED1ZJH66iHQbQDW9rMCRnX9XtpMBoR1OzMw4j4Jm4a0zIHfzA5Uo+iQgHuC7mgkpeP7ozVmysly9qhyFvd6tPZDUh3qTHRhel+ko2AV+HU1LWKqaZQ2eekgVL7f7meBiF7Dox4IC2+zD0X0PVWXz+trzhfIEWQ945f0HEhYHD91SZkjUf67EFSSwq6X0oDIffTOP9mQKY2l0YnWPDAw/dLryp0n774rvpMkRrW6FPlkkQuzl1EYEAVTz9WO6VbG0DI6YBvfkusLT1gFidsTsTz4MZsAdCXrEArKIsvfy7DmgDgaKsM9ZJSk94h6DsccAYJ2TdBRE6Sw/xqrMTa6LQ71R30ON69sQShsxwVK25eT6XGhSM4x6fMLWShGEr6pGK87K3Qu0OW7wS6qCmem7mrItcUiqrQtoe2yORjGrGvMBSV/vhGaVAHAf/owJ83oPZNReGsc1KLrYwgJ77kvz5AmqtS0Q3FGJQHV4zoacPD5kIAznPhBfJVmFWYHW+abTx7MiwDy65wly0vJKB54IrAM88+FNCrAgT2Nylsm+5V04syXctbR+3XqUe+y7GXi/sY2NHWTL/9+RjCULZQwsgdHwlZJVSiQH2JMXL4kfM7qsuAVa0+HAMzUpcavm4jXOyFvNIHKT6D6+glrGttKpiXZ8XbOGomM2P9uk4OgKMI8oBbplnEFOpnQ14OOy8VPO1NHvea9tSpZXp7jJhE0isUJzBeyI0shv/QKQORyf6O3F56LC+1d7hw+Ice3/984pg7w9ItuslC++EHWXWzN7Poca24/AxJFLoro83V6RJjWaR8LUS+DEi8vGXItqaMsZGANNMFN2Dzprd/q2AHALprJJHjg5tsoKqC2j/BcDWyAog28qtfXsFcpjVgiwRt85VwtWjMyc4QA8iDo6uvFbR6/mQKf6akD40FaJxHetoBjh607AEIEfc+bfEbsAGfN+VEmh5OuI+fgmalJPWnv/TJu2Ji9D5T6jmjDqw/XEkZXOA3WmQNPaBrRIf9XjL24+Ma+cdsNV1Vvu68gzb4aSSqDi6r5Mw46bmHs0f1OabmGX4YP1w7gXgkuCc99YfKjvDn+328LwSFvaEMyx3WfRahERLLYXfqRZeSdlMKDo8s+TXXCml2FL6oIlUqs8sZldreyzRNaD/QFmLyiB2FUbHwGlGyQOMYB6cUbTCvvSOT+JBnzul8nk7CC+UCl/6Ro6JzBAsKguAVQSAHedJeon+n3cobKS9OxCSiS0vmZy9HpOFmH12p2KxxsqLN9ZdYWyM3Pb3jCZmBvOrbbw7SKEG0Hbf434/eUz8bC21ZgTCeUSJMgGrGr6sObT+XxHR+lKm/rSrrcppzRfUPDQQd7e5XcAfXMrxazrUxAy4O9uw+B3gdkwMz4yQzGB0Mi2gAYf6pxzb+6kKnlRqB2YXaCqV1le/zuGQV+pYXRN1vkd1EpNWpOkS2NiwIyzQSehLhSaYjgBauHwZEiTDV5mNq3+e43CUHb8691YJXlQF2YO7Ing/f6/wR1NpDg1gmcpmtG0aL+GoNmEeU0qedKNwWAnEvQLT9vELbRi8u/jrMHQ6kkv2kFzzhlWEstVAJCiD1do7cg4TgvS5bTJy9yM3fIghS+FE0VLUwoudNWtCKK2t8fkIwlqNk4fcnOyUEgIIo2NoKYoIZEHnQAzPOh5nUgPO79zqhTnTx6an6NzmD9U38/o2alS2TRmgaSH7MtRHd2dEWE6PK1JbpQEXPVt+mZHPfhn2uN3gSsjqFZoqCjiB9Yy/ibrNos0JrjTaVpsIuSC1FVS5JbQnwsBzmXX8qzFJpGjEQ2J6R5ty5IhRksf0LxHZ/G8ZK3/qS1qPa5nyYlKIC6wfXWA5PJESiJXvDxnpdD80O/rGhGEaj/L54AI6BFCmj+oUVLb30iOE1aHrW3tovDm7eBHHNmnRPIH4QwVtFgJzjZM1ibWVFISq1t/MQd8uYG23S6WWAfEtiZpnTQXk1GcFjYKtZYswjxasRR9ye6Vt5RYIkRzc5RdYuBdDWIMrY1JRGBOrt3hyPR1CwaQqD3S+oky5mbJiA2sA4SW8QFVmZH5aM14Aet1anmKSaAnXzCT/i+Zdjk+epmoFeLavktOrFvZBxKev/ED8nEvqB3Vv6IJvOomHd+EZztKKR8YcV1DD9Vzu/7vYZx5+4uuElps1G6wMrP0DfaolTdh2lQq9VCiMsYr2GgAr9U6h93QmZsWCfi5YoG2a8ok2YVRSSuxEeR/TQtebO2aIA4PTEGHMEA4k2VyuH286X8em4SScNgBTRag0VAT5IivVMvBSxLfOMo9Ombq2t88XlHYmkPmyGRJYXjPnW4UvSNzyCKhbqP1ydH7P+bS8ce2lhWCpBelmtJtbrQyjo8MRhRImaS9wSifBi2Vh4/oTnVXsv7B9m41e/RaT4g85RkPyLkKs/rXIRHbZUN+ZmMmGr0Of1623r0NFcEbv5NC8AdRsJbNNTeMMfSRZDSlroNT7ekXCoQc4xs3MY/q9BBwiwuUzULzFu1WhVvKrlIL03cWHV3VOhp/NnkVA3WgcfxO5ls+vELa1fRAwFdQXPowbHNotgJWVKSPhXuROW4NzF26mSysFjxS2N8wSg3SYYNtvSDAoBtfaqbVt1xwpT4d42+U3jANNfnQ4mjdv6CVzXyraWN2TFVMJlwfuccKOTrkP6ZZwrrMyUAsDEf0Nz4+pjQIVnqAF17C+yOi/EJmLlRzPj/X4NP2cty6L7xMg9g0nqqEFQwyJxe15Kg738rARWk9eRO+2Ag60WXC8s0JFeRFzRGHH5RpM79po61RtPZHQSUsDgRFQ9SkweLFm68YuhHBwW9kYuU99ZkuxKDFhPzj5/UCvQ9rCLWC0EeGvRNPAdyCJe51SmOeYn+HXcqtMzPKMz9rMMQ8Opsht2oTHK3BYgrpb8th+LG+gkk0CSGe3/eCfodjWMbT6wGtaY5Kttxt6R8ouSiztl0lgBDf9+vvdQYtVo+gjcTV9MwQuOAdZLA9v3BZozGxB8dlSSoxNadFx67azN9iJJTUmc7ag7ex91FNi630CmconJSEtOM2IutUQxkC3FKHbuDCgvZrFNiYiqqMt5hPfAWtypj6hKDeKEiIPjvbNcwUra6w8B01LTsdVuKsams5YQN8eNsFAwuyPy4jgH6CK7f81q+30h7bjuc12p4r/jlgeV0b1Mz873U67aIfR2xyEgAn1DUGF6uHrRh1gB0dtyo1uQBjhnoe31p+60aXLR3XeO1AqQa358EW+WRiL5xq+d3jdBgBKjyNiKP59s5wcsUSQZkWlyT2yDSy+8gqBdjgPeU6ALFdTPApHeGGpTOqRedrmMoevNO/ML4DItZlJETLAsUcjezfvT4j/4uFvC2PWnXHIYxegHnm2AUNREWywA+FnUIvDLy41FYnyQuv4pCdLVbKuYkXRbDsAjKI4nvxkbGFqLwFoQP43roHGfk0eRXCNZO7weLohH5aF72GMoUnR42UU9r1Ut1D4eEjcvc7OdhzOxQ9wIziZtfCdp0DYJNf0dek2fNvIMB7dCAMG1JQEBHYP6xsuVN2eUIOZn+rSDC+ZrLI5FO7jaOJOSazC5IQL5bceq8SLVv0/r7Qgvl4p11i3D4qEssaaU19UiiY8ZZ6C5yvvldzea/IQA9WUQu86Cv0fGmmzkK/gN0fqd/tXDFin9yvocahOPkC16oeLvZxbL4n2y/K6TJUGTxjXRykJSoFx8ra1yzGqqLKeh1NLlsne0SDTneGdUm3W/TNqspQc2Lc16VvILFJvQISdsXTCey3nohCYYJ8SKiqNhHXsr9+dTbh+vA5cgjvVfCPCgzlbS/bKTF3qgOUJqe6SYGnOhxt82YPeAV11Q/mY3u0DCTwyeHjqn1vKMcuZW1P5aqh+uqKK7xtJSGuiArNh/59O3UXJ5BIjrrPkkdC/4rtzJj7Qzu7gZbFIA6ySY+mvJccW4CKAFpWOOpCmPurUUXYRWhB88p1CURGqJvkrfkJlecv8byleyT+g/owtXQI40Ihg1Qg7LceKL2yd4QOrrGZYwVe0M1T+nvGGrgimzeBrqTk+KZOAE/u5FHmv9hiJrs6YVwMF636IS9XDvhUOhkeBe0ysCMESW7orTu5hWPw5aoleE33xKU34TovMDIkib4BnWZgyVK33IE3l/jCzvJZoDBqGPMxTq2rFRI9nLD5y+TMHjO1lZ9tzbp7FWgAMyPdbQ2WftdMkpnta3xQdtuN1ErmMUvNOiBdoikeGoLZ6HIsTqAchPodxZYs61S1DdhbDXaXto16+czJZZnHXm360fBGT7rJF2hKQdGMAsvAz4YNf9AHHfqFGQ6jH1040jyf7sJYEhox32N5CWPTJLyAguq6eJWicl7mHp10ixmohfIT43gZWKGed7MDmRvLTN3chQeqd9O8Vwooveg0jNzRnpavtzqFFEGcpjGntT8bGLVJEvdXCQnhRdVYCYocnKelXh/xE1XmJF+iQuvhZXleJRTuUMTzs/sfFZ9ndXDwmnLVWELqDz3qCh6fGiR0PJ8JlM+Sol0o/cV2eaCmGDh8oDVIlawcA+LoqG3tTdkXzHXZDCEfxQI5AERGb0+4+sm6YjonOJQrb1TypA8tBK/JdKuB5WAj51HBczt0JXxMZUrj6UTLErzAaA+sS7jkAOL7k7DAXAPbRKlSMjqS1Ds05+De6IkS/mfaBWTcoBEelMSHYCksuA1LbW7X46Jf/FlLWXd+Tfut58plB594l3oIDBxdLQ0KMhqE076wk3HPk/gxZsrpnMZETHC49wbLGwckOGWUIlPeDozf8E4GA/FcvltIJNB6NycClB6Fm8mGu7qRXqP8QF7MdTgyi/xJ/0L4hFyTbevxtrpdFPg+ujSgn4cy5PhKP+C+CPdDicXshCgxNaGVcmGVi1+bRgsc0Nhp6w5zHYatksnWXDlx8YkjnD0hjfebSNQ2bv5A6W+ORWzwIpQR1C/CLULy2ujhs6ykFluRoQ03EK5RxUzR3fv6FCL9KLCEnpwPj+5C9qgPoz0LluGE2nKSmdvNp2eJ21GyhIb4DOcdq4bLPLHrCN1ckMXjnahC7LdYPU4lUmqMXOmqsr9UNE8+Xk+zTyCOAziVMLUEZovVcdQC8vH8J/EluGp3Cb4pL1lIPGCUg4FA/y0aHOP6MIAeFUT/gVV9bnPhhfjYh9QbM+3chNIdDHvpNA2yZY/V0V8cEkyLVlrhZOH5SIRpHM3FcYyYzHIxZ+WoVCoRrOG9m0E+L055BwSU3Tk4MPUdB3ThixMNz/W78FZl0YkenOx4WwuCCUFUwRAPGpdNajkm/rbX4D+fB5Km1ZMCeJOjbg/17atpEA7SN+XMM4olVSGafyOpj7H5TV4lAyR4dOkgoznX5Cv8ANWOJG2Su1ejafSEyIdXqNMHRoSRFuXChh+cVcbLvKaVvleehBdShNKiIxQw1AyVg7T2K0DX8D95BoZwRDJZAKQhIg2WEU6LfAQTqrdFnfja1rqhG1KDzEEl4MSvjIHbnZ1viLNXARjxYSZSdm17Gcg+dyWrBTV33XlvlMUwaudReVDHiWE5zwSLd+nAuO6ch5969R769jngGTj5/wRtjQRQ+FPMDJcKhqSFlJv/j/PE9W4Q1325Ax3uVkby3u0Te7k797vY5PR581JuNZ9guMSHCt9+5MnUhy3zPloO3YObg48b2vV+Fb+KPjmOPOuP0PU9gDCifJpl4+dV1oJpNFtUBRLbZu0MJjWOwhgxJjaGGiB345PxNjsBPFiGRtw4U1XViC2Q/XwlAiCZ9BQvFXPnisJ/XWb72nw1a38803gAUavnLVwD5D09pIi4BOVaxewjlMYTFyYHha1yZcytXz276WvedcMChZifb6bcE55xAav7XADxKlLMNbLNv4sovSXZMfh/pa3zzrV+37rqTTpFmxYIdN1qnedGlbFzum5DswmWkouB4lM0rNhtpxXD+/LlnaqLMYVsEzi1SAnzC/OhwYYjh6xVhFRBwG7FtNF+z2YID0/vdhDBCHp8GV1/B9HaCroE8SedwMK1q4+3uRlbDK+P9Cy/BImGzwGQ5Skk4TWUzas5ZOweVU/JhXwjKgCVJQjji7R7KraXivM5/jBQOH4+cuXzwPQn/uaqt5WG4dwkAsN/H70Xw2G3yOhYX+EXXI0vGIJpC/m3JuQRu7Tr9Gp5q6bigYIxV0dco1jYnSCQOC+4tKQ0EV0N1RkllfVw0BGGyAy1mRsTOGla/3P9dhwF6k75YhqfHSDLWUNkNwFnELVVtqVDkgGkffHfwbK7B/8FhGQs/wqzqINy/fJlWymnREmNVykqU/3xqY2saHr7cNz3G3sICn4Hd1TxXSR8iVtDow7uMk5dkBZJZaf1/JcHUzI7QFgLJmV3S1B1a3dFSztyRH56xI16r0QzpcMAC9gO9coZwsvP7uaRogrfo5r5T2NUcwEdcWjPW9Y1m6/TsiNMcQZ/yYmXnHXeguwNkBDaN+K+PzOnntTy74oOU7tT3W/IH+86ZuXVsYqqLymLW8il+V3TkoTnwzclKeDnvk4trVVi1TAmJqDFNpBOk/graC2sj66uF4Lf3oxbW2J3mn0L1DDX/0JnOcOoabk+J5gsa2Lw0kFzLvl/D35eD+q4TrMPASWaaQ6fBQtdz96fgNrOPdBG14okPx4uiuUHKQWqbDePeD5FchYFc9dg4U71jLGmJmot1/4y+MN7TxTNk9bQfuW0YngJhRQfxS1hucnEs4Ho/So1ZgUBuMwP9371IqByE3MWZott0V19VlhysoBA3rBOpoAZw1DddzXrsP87cRTsxwNHKgvXp/khkR9E4//T0zL30gCOIRhnt0HFIOtfo52qz0HzI5N/btGTzY0kgZ4Y6/ypNwCim8GKNJorFiTJEIHB1yvXt3Zrq/yl2akZDX+jgDGJRgw3quNJ/yEPf2ItdUrzVxk1H3jl/bKTjBEaXN4W4t7s6fXX/TeivixUYCNMH1yKRawbUTJR2cpq24BP1mX3nqBM2jBfesBirJsiSpPq5zjZ9hFs6oKFps4h2ZVEDpA7KHKapRunZf5xZWH2SuWxKQAywAPVHPHQ4I0AhWUlek1rHcufobCmVJU11WrO1d3Fnwa4zNxl8DOZiMORG/gl9D2xL0472rS6VcQSvC0adtHTFiEm5H3LfQxLc8WElaJBqc16OqqMHgppTpdJGxtwjLm9/NT+i4YdADNSTSfarLhP0W6wkFgAvfekk9ABCo7iQrGonMDqC0UCof6UnvcnkBDQiWwXt4natvD13ZO2k7DroEk76kd7wqYvSTzO19mCJu2IUoKXxTKi6hHttNqUbEFXWymbEoh7GzD7ZD5/vDRQpEx1tjXlxkIpMebS427WkYIPCRHaZg8PRTJipjxqTXBrxGSFBJU9mXb+fGpr4aOc0W//BlHdfgJrOBXhRerwiBkbU6ijqCnespZ/Tw5GOOrHVfVzZ1mK7p9mJttxi2n9HlAEwyTHQ852uNu2S6gN9c3Bhi3Apj2pqHoj4n9dvlGwol1Ffonywo0psHiphyeaVI8b2aj8kAFpjZBDAueyE7Yg5p7HWkCEHSrSTYZF9uTy4DHrEDerrrJ58fP3a4FD2zFszpjmYsTaKwy8viTkW1UAsxHBa7KN89JxY2PRib95LgHLNh7zedv5CtemBz37G/Yp1ah590OSjwApfjgR5B32kF3eY3NvYL0JbzFUezi3jVhCDLGYMxpRenHfEeYVdtQCDHin8WJSrWLU5WssxGfGEvyX1eWnkUoh7+4Dwqor9XhsLGCWe91TdnNT0MZXE6R6KG7nPvGmzCWDE7EkBFkXMBbBhoHpEPAw7qoAd+5+eKK6iQZIL9yY6LCeFHkRfKx4hg3YNo6mZVWDxMd9tGWomq3DtVWTvWSE7wBCK0giEnPn/JRd+UFgKJMz8Jud39fnz8g3XxiKGigNQuSEanV87yi06A387tMRx+2itPcRaceqKTQC0LFhj4gENQqmL4/Y/wSWjS2xtYN5FBKjUN6gh8MsNsC399I6qgAii5yUvs03NTv/Mwkhuo+cDGZwthX6Ngv+x3IQPYXeYf3wucFySWlg8rD2QuAa+WfPwArBIr7hsmyeicx9gNw5xLoripGBPhiFH+lUyos8/FcOZ++BzCoam9sk/HVPIusQEvqy2dRTgs8Ye6jh9KoQ2B4lj980izv4NWAAuxUgksxA+6y1/uUn4BNDWFAtZtG1pbYIS+erD1n5wvLMCvIiKHXSSmcG7JaomSq5Li8I4suUuTYPtpEh1sJgbK7EEb4lFlaRELlrP+2nZkswHtDvPDxmgYnLVJyhTWCztKlt+LQbWGPTmQaRMn5TbnMY91AXYIVQnbiHYVUBD8XD1O/ZfBUshiLGCPcMWjeVdTpe3p6nJ3NUNKKOHj/KU6RcaqZZOqubs+TvObIdV8DesUHD+rP+0i0ZW0yfKagV0Ha/pybtaCl/1zbpGtuNUEcsV5q0rsTjf9Z9P5MHKrLkoqQZSC6+3DyG31/CnOqeaWByCpxHw4OongWV3xypWjgO/CNBEIvoNly3UYFD/bBX56/0Nl/ARZvV4isbsF1f3jVbZArkdZAkgPCr1/WAQWJ99xziXwcTPd0cTUiDjUaTDmUOnXay8j18rZWlcKzGUj9TffoMeI4kTXkOlcRFJTivwn0Ulrvf/dMTNISrTYYqutzJbj1HAqVW2CuxlGNDGMYrYnJVIuoZn3cobcdnzypzPBrLx7WVhHtz0BzMlICJW6FMiAXingJuz++NGG7fBxzCX6x2c3NZI72qn47ijfO+ncHW/HxuA0+m1PN3FfSkhjDCjwut7lX/lSiVRMOiax85Yyxwzx55YBcWEHrl8sp/Hfe6mQE2YzpmHIBajaKhM//8qP9a6XqcHBN2Q7GCdfc05JYokVyOxkTbGl1SMHAGyV89c8t6KVaQwvghua2hqix1hT4G0xseCDUaqnTsOb1+2rHh/99o7ryBlwsiFehGPSqdxoCqAH2ijCflgDDh2jhdz1SAPAlJiAytftYqze1u1aVTJwxAqCPOqrpukGTAqLqbLgLoLH8cP9mTnUhCbmRcgIlU5/yd/B+IXrHbY+GiSc85gVTps823xhlQv3GpXwyWHsFTLAeToRLvEqmHgT+UXCXIdOMTSUhPnFWojtDgFjhLoSWPcsUQW6p/PLbPUAxF2QxO76ddOW5DDp+yT0UXa6mMm19Zo0n4IkhtGYvB8s6cE5XzQTgs5AMWuXgJbewXukB6o5LplKgeCNxD+Z3L1w5MQ3HEW3An8bqzko+xfOlzItal2FEcoVxXY6/mMzoRvXGBFCtCfAErban8UyoLvkBsLGo11u6WCiEnhIeha1yaMdEjGnp5E1JlDufM05Am1z3VvJNDgB4GDZ26cQUdHDVZasSzQXU14kxhLpJbXRkkhhQPH+P6f7yG2pD4mcW5wVv8lY24iyzYIEdOwCe+8QGyuZCU7r3BaWezgkWF3KwZqps1hc35b3MJvRpBLe4j5fiDxZBuGeAN2XFWLqX3zzyiMM5D63RykB0cacQ6HlS2U69nvaKufUzWO12kaXOYDLnNyrvkOXJKFdgWF5lebRW8gbxSb09lon3rsNYLdVm4TjWbqIwyCMMlZy2Ugt98Xb/wDhgINW3l3BDCUzeTnqbiIOYDxwwe7m5V0IQxFOMK6pjpHPz/si/kapSbvaV70TSnszi2r8Gaz4R+IydOreOgaR8h24vPlqMFIas+zIpIse79DZnppmx+OTEqMqkaR4elOv6qTq/q77jpmAqniaj8WkFVXcEZP6/JpJScS/GrRDeJRCeQeR3dGlwtw1r8TwySXchOVZQZ4hedD25Qlx7rCxVBJw2/Ghgkufs6eDMgMyvvUzKaVLl7F+V02panpCbT9CZxEL7OcZLWMAVEYUm91wPfkgLRvJh7fUxU9K4FpLcWy1T7kiAlNBPY+7wIbVtBuU6opnBXW7f2FvzLESo62HJDD6dRVFw2dmWUDrFBzC4NQqBsFvgkEVjQTVx+1c1cIZwbpQsmwJ18G6doDb+utUUu9SbYy4DH919/uvpra9stys8SZL9H+aRP6eL9jx8QSpjUugm4LhvfJl18+BQvPKZQgdLzDX8nTbXSHGzpjfzI0I4cy/siMx8vqndwQcRbOAr+21d8S0FjL8LY7Ov2HdgkD1HeB0LG9A9+AI4iq6nJ/hGK8LK+9EH5M6wR/RYIuR50mUKJmC0WbXIwXoaA9MPdiSzn+V0N2NEhcPGfYGbVu7qce8jarDN1nJKoxJlu5cIVrxp8SWsKxvWgfSeGEKyplR3wUpcpdIPdnuYkQNGYug6FfEWBkfAc15K6T3yK1FuI5RDRgiNUJgCxS4bfgK/TNuEpuniQZKoaqFH/nridoSFrFAbGgrtqnwD9YK3vqV9cOnjBsPj7CJa5V6zLG7fS9JuOq/XnY2LZzJBa8cbHPnoG/wPQRiwZdUDfjlGMEQnPiDU4TpWPuWHM54EiRaC+fP58yDiCJ5jTPvcZL0r51xEqIY5YiGtkT+Rjc4oHpxOyTcWlcackYDTit0+ghdFPt/BMPiZSc2LVU21RI5YtDH8PDiLTjPXdjV+l/tczFM3vbdu3K9RGbCmhbBhHV0sWuTanOKw2qsg92pHmtMzfD2IgvQ+hi/aPl+E0bm21hYnd7G2ZCBxxF/Hcl4nXnDryumG6uVCXTHQSlFeUQyRiykvpMpiWq67MhJiqawmZS9JhVL56nn93pzvKRI38B2uvG8yb6z+kyCy9kV6pGSJOfMN0th+g5Htuyy7XpvYP1zC91pfSKLhge9c9UF+idA0i9tXtkCl5vSHTGVBsnxTntcEae2v8+guJfnLZsTlort3QiBjw+oxDrS6xkbDtGR8NyLZ8tPcDGL4/PoIY9SXkmfmj0AAQq/Ja5/EVzwxjO0yr+pErm0IamBBYyAK1FwuwUit0dUEJqYbuZofuaDwU4/1At9tQC21zPvxNO+A8cnWu+6qeDlfWEkBfrbmjvZWrV+WPIhXZA1gnWn8tZrkdDSdNAkj22Nrg6/75NGhvBO4gUa+RhGc52PbcjoByux0o9irhHILvIWdMg8buZ5fUoMLxHMbJk/KaAwjkEVWAHv8TVbN3/CX641yQ7YLBtfG803Jwu75syJWDCPojpcoVgVieP95O9FWMyvS2oaofjZDaY+5D5wCrARX/y7JaD1yZaNWqHPk/Ka6WfEjczVaIeaQXhmWKVdg5rxp9K9b9MzZfkQZGGz5WFgJKAkoPCDyGHLiHAqBS+5dyZQQOL36ZZIuVsQMI9Z09q/17DdJQJbTlQfBcjNI0rdf1U2FcvWu4ljYpTfTb8+pLemQrGpBxWWUGyydT+se/f/pucbdH6KYRTLsKFy1cY7irYij7CGQBZktVSzX0RcwbLoKLpZT5m2h+6gnqoKNeJMrSyZojySE7h0LZl5hxigbXv81sc00Ye7FjJHI1OVFkMkzkouPtnVzN3oROVMCMU/yGAqe55AFKLjumnWPvPfFxVoyuPrxmRxDCG6vTdRhcJwciJ9MUUgJ2PsMZiAhX6K0o4xwFxy25/IJoFrx2oDvjN/pcT1soiEA9K/nD2V9YaxY6Mo/NP0wHQ/CXek2InjKtqrWh+yd4UV63O2JXp3GvpMnwdHFgaQOdnyMvQUuyIAWzED5QpMcMmqOqm7Fsyf1H/a57DztPhSe6OfJ+hj0JlJZ6tWzzqofMNgZFRNs5jrVFgFcw2bu2zaC8FQaQrwSEOi8VKiDvcpfibnS3Jb/HQrW9m7tdbAdD7hXrHzMtZTuGVFxjlDa+ftImvpW5zwDkSZwHOPoz4pylw93ljbd1e/+JhNfAycZ+pX09OHMbqeo5+FlteyYwYeBNRQ4XdIdjngm0w4LzPaLfh4Ee2zW4KnSNZRrqZGDPEVylwo/Nu7Tf5/XIHPL0kcUHC6T9Ztttm9w7GhhNPBbmdJ32L9q+Z0d/nt1lZ27isS73yeLFgUtQsCUyeNpH72+OjJuvHSpDPhSMokrN/pm08tyWMYDS0mTfmC5Zfqe7r784cEiTnhLXPaStTSrmFB+dizJXkg6k5ElMDCup3lbfQNmgqgXZi9jqhQKpUoGU4+9seN1zQ2XnNzwL2RmOH3QKwPAcTJYbnjTRdwdEsnKbsWqxIJyKoQCT/q9ApOki4Uj8B5WJT2McqWqDszI/dhcNVlCRXbl/BRg1872mdtcMlwum40o+0HUzp5Y4DfGzbxecuiSNHee8Izt3GTgoLPhQyyutYQnAff3jJ5kIVoNuK6ADR94aYzzxA50ptD1r+l8ifAv7jSZeaxVG5kQYVl4Y6ochZ44TKO0u/NiD0UW1YG9poI1qY5CdLXTJ1TL3thLihv4z27+1lxV9vrRzYGgS63pu0Uu22K/zrVP1U2UsJnV8ECNSlPQOLfDyXDOUup1fVCiu1LKrl/1kqPHSwiailbSsFBb3gMxaW54VuBNCPVEgeX2a18IiAfscttZnZ8Mc1A+L+BcMFX/bp6yoMiUoTSlRc3N8JELh9wYGAd6cPGjMDSHYmsX4epOkpL+ozgoC5zNK7erMWC2gUfQeXiJ9t06wSW5jSRQ8zllRHLKRHLO4MxVPtMf3yPfX4LJYekT79DCJGYj0s1lFvCsVN5Kae8HydbgjQ88+VcRe8hGfR2JRaME8eHRGW6WXmiHw0QZg4jhuiLWC4lwA70fqN7pDlZkegc9DC8iNyJ9jr3vsO23F1H+ZdJpBhZ+qHw3nGLczvkiUMHeW/5UiEFAldkoc1PBwTEBM94g70P0bosWuw93oMzEsNRgODk8yXGavlNpsCYV59Upn9aktwI4kS4DTor7gYJuSmtVu6bdcQMK4yazesd0YYwMMa0anvTYm2Y8xaWCvze02pfr7Aiwo8fmUafejfoWOuTGr/qobZd6ISXZclzy/7l8tl8UK9vUAyWsEwY/Wy3uFt1h0zUO9/Ok7DDP/qNUnl2gyF62pzHIUWLNu4KtI5e7onZT/CblM+YR/ylYfUuMTOsCA0mrYoVytUKnnhIRmC9Cg0fAsnaYtD/oxkP3Z+cdNsTcq2E2euj09ZDq5ifjlEM7BbJITDIOFbvmnxNHvdFuq3df297UwBnxn0et1S4YgapV4Ewtp1YN/S5P6xSIKFAeMCxww5yEC4S27K+uyArLYLIQDmtlV0oJvvnFrbEVq/14Tqg4xT69tj2nx5SjbSxbRhFCtdGpbHM6sr1WGLgv9w9trhxNseLsPIN+acCk1GONQmR2GETF6i+/v3V2oEdpWYQ6SBnM2KM/5qVvEC5Brf/14Xmm+RbvdXdZWpV430QbzHplGxbgVyPtihHmkUnwqA1jnHYLErCiUoV2Dst/Hq+FR4BIr9mPNBEvKWKe4kKyeVL6AiH8K/zlK4dCCeW6hCxg5+4hzzG3tRYf1XOLba0wjkS+j48L7b95Xp1jiz8Gd9Ut94FnkcaEzKtAzLN14XapSh++gJpbTIdZPjoP0G7J52FFpek8P7wnJVPTN2F3zE4EE8ceH8HmBZXmj8jTNNztxefPBIS7yO/yevSVncesZzj0RQL/HAZdwc1EJRFBGeT8PCCXiehrKAEHlhMhLs4RQWpz2JMTADcqO5WorG6oTpku96yZQdAwY4csyUi2wyYJk0ISrTWGvFM3ChVoG4KrS1s69/QLnCmZ6Cci2v4Gl2cjrIva6WTggPQ8HhVFtSxN59/v7Trd9tImNDrYIySUy7PqTkOBTXKRUqpkTefBO1Sg+mHa+VJwdBOARkAyeRkZyFKIIzJG+FPdMtNuvo3OYGjj40cwAemLqFlu7cY3Ycynx/TWhV0dVq6DXvHIV08SG9oRiMU0MWOyQG4E983ZlrXnIVTajYll8pFJ6MUVlu/23Y/py5HZNuRpEON968Gt9e46i95bNM/mFtEsE11r4FdTvkNPjluG/hhgyvh3pdhqwpKuxMehtSyRe9M3FX+SIEziRU4QeMfddvRBFvp8sLD5n5oUf0aA9YDTjc3S0VrPdlknSwM9NsdAUbOJS4WzgVxNISKk4eiyz8cR8gcsPqsZBbrRaM7dBDsYcfQyPZZ2ssbaax4W+AqRYBLPsKxC0XJN3JgD60TatmcgtBFikcx+35RNeH9UF5VFiOXWnYL9HaZ0mmLr0oiXEyD/isTof91b0Rfbh07REqg+GXrEFzXtNkNkkrK1xmUN/8FAn86vs/q26gapvhEnLpDbHjFFepIoK5vWrAHR0GImcGeMIawEhXDR+ArTenUNdyl0+ysAH0gM6eUpfH0X8xfnVkyHfQMPyDOVIYdL9YQLS42U1d250eTOjBj3jYcodGKVLd3TEKSZgTq20s8FxyePTQZX3B1SsrShnpcuf5sKUukNWnJA/7J1HaE5JXtlmcR2AtdJwWjwXNU9bNjwvO/DZbG9OdtvpU+8+FyrVKjiirZF0v3mArCKe2O8z4p3Hxegs+xYrSJ3gwFwet7KzeFn8698HaSGVJKBY3Cu7qDIq5GbLdo29tWTSsakqv1lAR7LaNHaDEY4hOEB9iBMdIfcRE5cRGEKOnQj0iEfCxQ8Phd97KbjuNi7HJvBxm3UDNM73Q3P99+Ns/PbJqIcABp4s3jVP+1Smxda+ZjpkgWRsvUkYU87Olz6ODLcOZBUJ6uqSHaLX5CtSY22VOwQ+Td2x0bV85I+tRMcOiOLdfVCJ24V6EJfvyyBxngczp8p6y7J9w9wAl5bHSMsWiJhsTWDTxwZXDrly04YCiJqhVU9F3DmFlc55uBCwJl1R3NyRnI8nBkngYcAoPzBZNCAMWuUem1VunIQmndlZw7gNNEQf9jVr8zS29h7fN1prvvd5l6nhPgs8lexuyQ+mTF6hfkR084wsAdg0dj4O97B86dGoUgnC0tNMyZ3DF57jmoygb3M7Dac+zyIUwzOPrnagM6EsaCN/tpMBdFmgHRABJbF0jdHQER1sA9350kRSwbClFWRaCeNh0jItXEbLUlrWNyCfQj9x5AX+SdOLiOng5rKVyNY+desWfhN4BDtkbWAOFW6tCnxE+qCtj2GgcNvobRuEfoc0mMYFwMMAjNvrdvt4QIT5aRpNRwRhdnvERWBio/QmThQYLIhxhfj5nL1MegogTvSkbYMh5RzVw/ZCcvK1wGcU8x+cquVjeDgbxPbnKqixjts6S2jPXAyBz7QcoxpSfE5zrrdy1lIoAJPZSyruch7utiDQr/Ai19y1KItkV1g+zSJYkxQze+Z/f4XdZRNOUdNYrXn17e4p5O2PlZKOVNs2nqaZghztnuh8Ogn0YHsiVg//5P8B2F+tXDu0Iq4AXMUNXX+uz1GDq3FkY49/ZnvlD+mad5YhFsCcnrfPlIoV5e1NTVJ1tv9z+taY+ZJJm44g+gV72eGqc/sGaDUwYWqPRxSiZUpfHI12gr/eo254Q1Rmm7+CdBhYvvHTRMJCNxBj9/fJliS3e5LZN19Gkb0Y/g7QDTORkCLof1qaMTyGJ83sjYKsk5nwKwGvwAmocKdegR/7wynHYbUqeaz9TL6PGIXLQwLB5Dzeg+79w3PWolWd+lWSJ6rXHF63QKIMpNqrtDILyhyyaPejskQTuEsoTGOgMFj6z0BDwe3BH4TQp2BVMXQWG7Rc09HoU92Pydk3A7rszO48iqUAQPObZwXcpKOQDUSQK4MmkHmTJ4ft/FsWsfmyqttVOw9cvh6lNGjfRk2CEZvHQrNei1jfzzls9glC4QYOastCQ0mAcqaMQ8xFRzt4it6zNMaYwqiJeG78XisUeeMlcaq/NURdiDnIRtaK1Eeiq1hqmDkDl574UtxdM9jY74QPNFDkVffESv4XGz4kEAXfhRVsQ29ttnGyYPdD21SVpgGaXw17NvdvtQEk+8728ZodvzTrf4q+V/XxGdGGwyM49oqyFdeJlj+Gnyt2BxQM+B+7J2pdZAMn8qEXTTJVvAAgJT+JzKdXMYmEk/7L6emeCdZmP9Z0LDAxhbzCfGjCYl9eMvRbUvyjbCkgkVEKEWIJNnQKWxD35o8s+0OSG4ZsStMC7XyTBdQEomnpLp0KQtbpRbTvdxe2YHDVOSWo0zhfr9ReGsvDXJv0YSBil7UDrbfc/YJ5vZp5dOQxD658gnalWLMV4PsRpdyRiwpuQ+ZYyd1qhZeROUs/pFvjD7ZitLPOPKYdZKsv2bN8bKFyLKpM2LtIoyvmIbC/DMyrqlddGyARl7l2qF3n8vhfM6NP8rieqEuTK7+0aY5xSJqgA+PK30ymWKjiPaaXjsCJJam+XQKTSlmw2uL7wqRlqTOSWzD9A/w06s6soYgu5zmjevVhsX76oyApJpp6eJS9my7/ZPPN1Mpv3u9b8XsoRDGGusPtl8plkC3i9tFAc1xjWQXCbyA4Hc3y7DfrKpYENFWQTA5SxLdGHqfR8yd7jHxff2qVlegltHunrJUPiSPx+ai/gxzMBMuUnpo3kRtXKPBG4dluJMQI7/CYf+v9OYbg4hL1GXISB7815DfIgcfOYMUPBmgm9Sk7p0SHi0PaUqzxsUk210xDRIesoSraIHgDGcT/iP2hJUkZD4EIcWiowmwm11CALNDTGHQW+0ltses9XGcB1KOshnV/BoD4zRB1uYuF8CHMY/ArFqkB7x0MV4qHNNzoDrt09jZh6LGn5f8IbMnvr6DfFNz07pcIJmijiBerjrEtYCE+23Ojqym8mKtBw6KmiTg8E0Vv2Jap36d0NnklHudfcrHjTm0RVmEXwGmjqCiUiRW45zv7PV4TiJ26tPQ+L2BPDshKOGizSynCkhEwvPMKhUCwqIhY0GAxUo8ohWzRhSOPZRm6UQOFe4NUyRPsfG0yy//2eVk9sh+mUn4YG/qhAhpjSTykvViVCSLhuaGtb98/NcPZJSRts2zJncrQfGXOSNQJ/JeYAiLdDpDHvlZOD8Na+zfrl0yQYpFPWfGie0hMBZmH5Ltpb3Btivr3T0TQCUZj+gqXp162Fvg80VgOs61RCYBIpzckQYaP9ADUccqZdfb+gTerS7q6j8rQvx8GJzxm3Z0L1o/OYRKIqZvCPzyuQXj9coxj1/n6bW/0uCjTeCkUsc8AG4azrsssi1Ppf/GH3pfAf/jIWSa3Fp+96guYTMHBuoLG0oX7Z439lDrzYe78cwAngV6TuOJL+SSsyxhCoUyzXl525FxUALfirpqEI/v+s2Lg4GX44pWTu4hPQW1crDlaWntvmBUFPKyhvQxRAkXfyCvkDulqXzxrl9N51Cow/US67BwDYN5TRh5pH0OzNBNSnqEUyJyAoeP/GQvgzvkfTl/Ox7FWpJLGnGPbA2Vk4KtWD11RKiHbjbxRMI9cLb16AQj+VmZxahtuqecs3Fma9D90icZDDeaUshAwa/M4eYR0WkSXHDas6bKIquRsA0+3eOyJhXjgaPYhrEbncAxkimIOctSPuo2YqQgyZmCzVEhrxFCcZKWRvYwjz+ryJ55JhGR9TDmDK7B8sUhLpPoo7Fwj/r71pxTQUO7YQHOnQkPhAHaYuzMZGDoawBHPqxI2WlMtsrIuVc47esgxBkh8rZ/HZbr1o46p6y90eDwK8pwhmFlji8IaZGAlvCQRJwyNSpgdnJCmmg+XpB5yOZsTLS4mJp3y/kSU51AQ3Ob9xm14zVMOhHwJklMwFCrG3URI4tp3FshC68J5lW6zphdJO2rlnYl/ckXgJuazd0OJ07/k7MRt+L+PSHJNhPy5Q1yu5RCrurfukKjeqpyS9NJyffve7dUhbeB2Um/jGXHug4/KsPT7RZi4yW4F8Zsa3EYw4qJEYWMSbeL7MgrtxanpKQX9+vuTWghGyFgB1hmzEG64ayBH6+IRKMPgA5sWfuG/+pgRxe8kvmhn0ZC1GxfEdVqs8pPn9K5SuWtGdSJER+lBTtW4QWkqqt/7ErUC2YmWIArARJkWN17LwYR5VCyOnUG6E8YmQwoPzNFGb1QXr4eybzp31AHYBaloDkqAFbmsMJQPEipWKgiRGUhy6lDKr3G14iHuYR9oar86uw7nMC03sWBhk9wX1HDDQbIC071sOXmuebBQCXdObr5lGOuj5UjauZEb/JX8UhwV00LP25S2rpQYdPDQlUn8eUY3HyoA1dWbKBrmMqNB/sXunOjG9hYFmAvX8ib5g+yyi4AXADUfu33SmTDOEP2YtZ0PAMVYXevPHpUxM4sI7LVTCwlQCxJkO1dUaQmjID+Sy8qLuDOkdi31HUH7mL/kC+hkBdIgugMISMJ7+WfgVriZ5BH25WX7DYRRiwRhh1zGLVE8rX2n1/bwYSfOxhE5rGTCCmfo7fDKh6KBYLWwiqNFXs1BHTZqBtN9oY3cHN4jd21vDl1YLo8LnFvTAir17fXIJ6Ga91x5ViAl7Uu1ndfofcoAgIsPS/uGfpN0XQe75ceB92+grm3wZun6ibPo9I7R3j1Wrplvps5lEf9PInjobhs98ZrZCME3Ey4dh88nzN9NBrJvAWnjHJw+Pz6v46xs12q0rjqt2hC66bqSwJMz17M9Pvi99UUsql7yAGjnUk0bHgHBOPBnkl0hZWV23Edx8n7WidHDmmnL/KQ3q3kw3IP0L5X8RY9afpmRc0+bCDd+8wkxw+9HAT2yb1QlmoThx5F3DmNZqbMOxGd8mXotI9A0nQ3wFYrPrc+nQadfw14cQZkHcWePoakp1KA5FoFzg78VKp/FljZaRdcZA0rNp3dL21kxgZI2ChLIK3x7a5d8hzhXzwSjlb4/GUXWNxYCPXw92/61VaAJruwkAOfMbXp6cuS7TfsFpFTWuzX+XcR+itFYVC0z7D2s6uM7VOsKP6YEx0bkKWrWJO4A+8zUD85B37WtmSDlHn/9KtykClUpXbXS39N9QcSv/OSVOkUI3K4xkh9T8/M8FRdFbHjd4Y1I6OMyqsIV5JV4dOjpNi0//vp6vfbjWBg2O4REU5KOQOKZ4H5v6uRce+8ycCVWFJYQ8zmTUcax628nrB+LQwiJI25nMLy32nhW2GNag2buHj9ib6/MhaTgQxMus1naonMtFq1B6zIRFZ/wJ8MVTSDhzHmBubt1LN/bma7c1OYm9l+jiGV3nTFMyHTKznhUlDQ5+NBQf26Dvf0k/kEuNZgs0npZEJF6aBV+xcqRQTHj3yEAy5P7G6jx3Fseay2S4ppvMGdyIGrvZkBC14e7iaXX/4Qp2DJZe7bX02QGLnyKI/NhKRhKIwMd9Vc0SedZunv3HaQEE0YY7ulqi7lZR4bpvbUkovJjPOLKYncyFr06IThYK+iNJffhkoXS06oj/KwdZqB9GZH/OawNDciZLqCkuMqfICW95OpXb15kMtvLfViGve1v57K1pvkv2J/HAlkmgleglfuBxd7Eu3Cnman9LABCf7A9Khb7NR3/89TF8gAGNbxN76iguawFQlC56l9JraLj+Fy/3x3FSHmW+ixqOgyz8YWz9SeUErgeJYQvTXSNdqWuicJFICIpDIrRUweVgy2vYojORgr431zP0J3a14TZfSuo5CLESQf7sKK+Cv+nBKl2SaHfHwQ4quPj19kIKLNv1EoZaWgOY/EVbipoRP1iQDcZjHRYlERN2et/BwiCY2hObKqda8gvM8nhTYN61rMr1nLsUpijPeNbZmZ9aYxJMesjbpCaG+2DI6cz0xYEdBuUjzR/ljh62tFYbon1sdOlUjKdcr5L3PajEDk1l2j03iKqb4ZoWtYIGM6LMqLN0kBc4PBUPnydLgXVvrvG6otcZM0MWxmx/9NTVjJjGVvpLCyX2XNeYoK9xuFqAt7NyhBiUnfTSw+pVKp1wHCwtYj4yll/BdqzLQTH5aKGAbgAlXoSP3GPTvEMAklxZCF5uYuZ5DuvnMkW9ZGYSecFXOqwOKvw52pfSB+JfVKMPbOCbG8OAzHrOHw8Us78Z6UxaCCn0XK+WjC+yAThbkkS8pEBJYHrzmG8V85mZPoLbI/i1FpjuwoIbwSNpVred5LvTSIZpcMtRjpvW96C5jtiAVSZZawrHng8wk/kqZimoPDelszOVUjadjgV1lMCj45UdSl0Y0o/hqB8QjPPnjrbYe0Dg+z2U5AvzV3tslnGuVd2tyaLJtCEoxB0mAQtb5Vp0pJtzwRahkbN4c9ZXqYGlUAGw279uoC32wdr8ZB8yi6ABjNPAPsSBRaGhDF5mGy7/tXtU87HFU7o2ppKnrNI9uupn8uGHf97NI/YGGexs7p/Gh6DcdugUMRI3lUA2yKpFynw8STV8M/bi5SJ4FkkwCxhT1ygQLJZ5zGnQ0M8yreIVSfxW9V/nbdM1Tzt5iVtw5J3QhVvC0YjHQCyRb52u3D3rQMNgG4NTZ3V/HupqMzLV8UmHACm91USUgMQV7R39mYcEEeapxAZB9nd1deQNN27WjMxV4bkoMokzvRjeVXHjORW93ArjvWZK6GKoypXo7rx6EEgWkQt0yPW+mQ1I9jGoQNhyn+gW259U3Mocxdbm1QGxwz7vXyxq1YtvuAorg4Kh8xdt3t+l9DPFrLfjxUAPRPk4u42C2yafEBs2WMwp6GlWNMeHr/e8tp+VM1wMVK9DIIDOdWj8AU+AaQMGdiBVnG3+jCuJs2+oPzri/2MLtrw1tFeWmaY7E1o+PPKkm0WWcg09Mh+CeWKXFaeMa4G4QiTPlZkh//D8zVbEybFfau72LM5KCyjvx5LAchgwHAg+icF0B22YFdlkgLPwnU8MzsVEzVE5PHQEMrhndCoULFnPdfhqz5OKv3f4kqckdCY0pXVZU+3sV8OnBE6/lST77lR49YyVcF0pKqFZTYrYQXUvpbZB/nLorfhwsDj7+rhhMFmzCbLN+VIpJ7I//kZYO42LFw12m0cbczGWOKQSCsn43w+Ur0oyeqzlfqWylBS2o+QAwSNogMz5vxzkCDTN7qpRw6scjP+TsZ9yzBJz9oFFLoD8S6v1sq8LNPxmsVACb4C1idUmBbe/QG5MWcg4r/KVS8F4pFkBym0yK9nCd9KRxF/R9PdZjf4IHgAScfB5f7n2SBVD5AKNc4IWrMJhw7cSKAwyxXcA9rq60l7NoZIX+8KUNY6hG3XJkXQCvCxfetdzx4Mt7rlVhEYNlK1tc+eyzUIdLmVzpdV9DHRrbk+ez2Ra4yGUVlIMozaiqywCppxuu5QR99ShvAa7KZgdjj/vyimQgy+qLVkp3iO0opMSOMjTOalQEN2Rojk1/DjITZS/HVKGF7M6D8XIG106QqJDMnISDNhk3DtocW6L+9L4domRvO0eVHR3v7Xe3wTCfIrnxHjM6fDnEaSSRreYGeUH124GuLofYMIVmkL0G+8s/zIcMxdO1AcQOfh/e/Rc/jUAhTgXoL9kozLXMBxEnyS4ua8arnePxoamfsrwil3ObhoXcIyAMtRnUspjXepEXfDshEtXF/8b5AgfdOjXgzXa2ekluGYVHTIYgsI2IBz6GJ2qXxVd6G2ns1x6NRuleDNQgLDa9JsTg6X+kO3b2mepMPDFx4bqHvq5pb8V0TtwOeiK2JrX2c/8ro5trzRc0IR2PECn/ac3tfpnAneFO6sicxuYm7cywWgY81bqpDgin9ZXQ5H8ng7ba1aR2zf81qJu8zOBW/cHEbqYbAyJgZnu+U8gFhtRzPjOZqC6llRroD/x0h1ksxj/PlVF8KyBBkpr+7kbIPyYqNjkTXMlocyVMWIoCXMPqaAAwHVc4ADDzD7qOLXA8VuQ0+ETvsh3QBlz3aMwGHz9IiM1gMhxw3bjdlKJFW5j74zDb8hsVt3AkdjsXUUCJxzi4nAFtcrY8jAmH0Ogei76hwA3dDFp1kMjMV6orjxV+lhCqKT38gd/LDP0mSXIQeJZoRff4L3g0odjvsFN9+CMrl9S1tvYo/ziIEt/mu7FfBam0jpW4lfZxHtZcwAR5dBc9tSmEhw+84cd+c+NFj4ebJT7lXfUHx5kAv2b5zihGEIDJR6BnBKqjbJ1Fo1k8ZSShMU2hJcJUaec1FfML3GAfJbd9HlmMhStItlt7ffmXAL4lydypM65hXS/oR17fqRfV1Dg73nZN2yARGmosvYRVlTHDN9spkHA5R9WSQym2lMQSwkYzy4EqlxS/Ti1+D2LEE6WhrN34A/EOMDYqZooQVC0sBK4Cv8YvWQiWHoZwQtoq4G2dRNUh6q4YsTfdwUuNlZNsmSZXe3XSSkfrNmSxIWLa7DSQLcg+/LLxbDQli2bcvo1wpFHSHNQWa4Bu4Ruj3Ux42wp0q/sRq7Qatv+iFYlo/p50ReHTHA8Mt2+8IDwmHt75Sc/ZOsHvQTIqpMiKOjQoaXHz7xV67rVfIBskjQK21WUthXFz+3Vmec1ndBeSzL00yKyltcm+1ghj5nRRsDeZXzcRa2y+/YADHFgZb5ZeOLQrGs0aFYHVYruyIQQjzMzS2eGIb1F4h5sMrj82i8P780CLQ6H79SkyFMhQjDbDRjJsvXiTZmPOO6GozvhH33pa/bDd9BURGjQ85RCDfJRf7tgwTu+jZ3sNJwvJOkBWGK4UeRsg4YEojUDcHPOvSjuKjUlGss3KnHUI3+TT6JBOgr+L5XTYARqf1kVaQF7fk3GHWRY0aeL87+oYwHYOPKdX3gQIFxsyg595yf9ipkm4XsYtUEGQ6wKBSs5ryMMo1+lNMwMCSgexCQfSc2yAzB7Umq1X+XF+Gj6l2UHYUmTP/9D0gBkl8n5K+OWHxlHbYoD0lbvr8OeEoxEWAfiEVhzQ3H53vP6HgLv9YiLwXeoFsNOiR+ZryZCHvOqARYYgqMnuOq4Rs63qmnK+pcNkG+C2c3gIDPH+zRmV4xqoC9xOmB7EoRrlZGOb4fnrXryfpX34gqRSGDUb6GG/L+nV0SUpdcwai0aIIruQpzrjRiDC4+dxn+/gEzOLv9YU5OfLVsCxMRkAM7Z8fThEuebdvnTNUhjy03ea8dNLvEamavAkaazdVc7muyYqhMV0OLmW1Gzl2UKN1o9DLToI9/Bt6T8bukqRaBvAqC2VYDCZqGtPED1eUDLfYt5noVGfpjmhp8Lm1GHlsOtRitJmhr7R9PcPSrBr4j10nYRqE7Y46fXXC7i6V8ApuulbYRJHp3nLK+yDNaWUPsAH+mtlgSR546P3V4fqBL4ACPkr+J1pLvxgfAV+eHbA2nJr2kCqotHYtBFgIq+qp8DbDXGvOSgor4frznZRH/d85YKk1Jigv2uNVW43LJYJnq/ahSCBFmscgr/ay9AJ/QXS+hPh15fZCPY+LoySoj10dskq6en4vz4mZB/Rirq1u43bVaagIT0ltC7wCKMGq+sWpn03awyBuUaYOrvBBVDjM6/iPEvQ1GFLjRwH3qVtWCyOCaDQ3lRFOavCjIjJsZ8jMw4nKPS+D2xp2NKdrkNJK60qG9RXPpa4p1UKY3BkpbcjGdFtRTnP7z9g5APlc4LHbz3niA08YdXoI4PPgHQKvZvyiNYWGtP7IJIlW/HLDXWz75QmvFV4Sble4H8wbMSkI+CI5g3XzmxNsH+nB0aLo1HC5FAr+Behs3a80ny9RMsFfwwodVzRYVhE1n2Ehu/t3qDkBRm5SJRtDIncoTp+uAMxp7gTZJpsXpaiQpKCGZlmfA0pIANU+AV3vepOrdzEMf2wEb9c4go4CXsoamW/ZV/I1nfRdY8+c+tSxGlu0ojLN72o+VEUZ09/eFPdaT4APhhmeHRzuwQC/eEnS1qmmH/ooW8YZh61A0mfGWQvWrWG17RIc6yMP/8+6AHNYAt8+c5TZ6ufWs8WMjRcSzE4uuhrbhqtt4QIgQQu87PhSz1/KWdT2V24Z87j5RnukMBupqEPu5crQcL5tfTA2HEqb6dv8NSzTZtZXm492+2LHKy543m5eTCOIJvadkn+lZn9qYYnB/fZyP2lUOnU9Ce13JBVDNXsQER1fWCN+o/GTdFffdBlaISBx0NEgDUASlFle6+Up5BNfJXPNhw50bGmHJZeb9nDpWtiP8v+kuz4u0Iw+oZ5qqhQNGcQ6Dih6NGjq5o57RuvBVYxnHOfdEeaQsz5jXlpnbDTYlKKk5gSfpe0mr7v2yEssyx+M+/BJrljXWSzUSQrZofV8oUkH2Hpv1xn1nYtZ3s6t4TcRmcstyd33IArXhf6Keszi2STLfLgS0Qo/gIE9kZRMzIYM4YF8xJgkjr+NgIAR89rUT73tuGGaq4ufLVHNelxzu8pgUKTcNjesZB1cXNNx2j3KTsuePlEns5ntrJs32UuCTXoyTpSK9Zh5qa4xpxE+y1/5Guj8fSPB2HWyzgIhpueWFrrG+or+pIZrs9NzDvt1QQKnOtf3C14DFhhMvDkXwvnfOvUZ9DPdeFgDT1A1lkrvNHkQF38MpdaYhs8f8w0tn47X9TU20QsczEWgI2EqlmQvGFZ/TNy8khooGs8Xhsqvx2irTRKSnOE2kOShw2ylD/YHAhNazAOB91X2fOdCBCnFak4dcl0qStgN2JCP+nE0SqKcmh7K+Wfpb42Yb51TUEXexf6lHW6epKnoML9x0Zq0S8DSovyiSJ+x1YzB8AIfXyHpN/4O8Ry9pXzaeT7FJkxXsdkiZDx72k9sUKjfmZQ1Dazq1s3XQyYIqulUJKumeLaVClIYvF2jgMImQwY8ESppPxvPMtYDkrJbwyK+4r5w+C/5dzxrBvZ/KB2RwlHwL/U6svwgewETIeafdy7sV7RM17qAEAmScIOZwIc4VsGFFDAtDQ6RW9Voa9zqnqhUViJ5KKV/S58f2HAQB+UkRyENbe8G7SkjIm5FOjcWsu/NEDeWHnP8yVP8edCvaoethxLa7pmwVSUSchE2CMVsPUYfaiZAINA4vsLHFdSrBFIKOC/QINwF6yrvRlM7FamaQAc8P+3ijuR5RxJRpUs9rg0xFUHsfSDROj/08JmbzfLPHigQMaKJ3PmHQy/nezk5GoCYzcMGDbw+6QtR3Yr/5nKpjU0JgRsgkOL2TrMEDq4A661gXN1L1+hXJ7lIO/7DqDPXUCGEzayNJUt2K1Mr60nD45B+tJT0gfiQftUNb6yZbti2JdF39ZZYDMlaaU7bIylUOLftUlfbXnse/fF83COFlMDoQYyvYlKI+Ov56VZzodUlqvUdRJY814w3g4ZwAlpMCvKbKVXJG9m+0exGZlunpuz42Pcj/AaTf7cmKs8Nm5dyVYBrUpEVgE3tqM2+Cj9OwkeP4emjU6ScHWpb3DR5C4IS7xXx8MetZM38QbreJ75cuhxVTzAemH2PDwKVBHFqO2bc/o4YVhJoo336hQH5mjI9U4BWh+OQLJDvl0nFrWyN/GkY8gwBLxQXF9zGw7f686dEWqgf+jujD8YsmcgVKf5XktKe1uA6AvmEgnfQkJ/tuF7oUwWovHiVTznAgyyIcaTP1x0j0gMMEn2zZ2bJscZzZ7fY2rJYfUv5Qz3UhtTKh40RkhIziag19Rnpe8eXs9ZGxieoIDEwGqXRQEP9IC2vFT0QwPGIEcXGi1rIiERP60XgzbXgBq/Pv68WcLrACZvD5tjFS+E/socEc7ZxMjE3kXlRdLJpoVWxe6I2f+RO+DI0IRIpnUj75q8tYhZeATuq+k1cJCAkjHw252Z0Lgoc4puATuW8idjF5qbCTYu6U88g49r10ygOwL0LfqklsSkjqn0Usge2XuWaWFNpbzNbO/0urRYXO0iPOsbnJkBIUwN06RDd/r3VsEeMOc2gsIxXNcJ8mIdOVVbrUYJBBdCTc99n0LivIs7JEdNtrfhKXwtsBfFu54v+JqaqFE8NXiHuTkEL247dZO6XXiqGwsI+Qm1mbcTNfXtg1GfDmriw6pRNWt+uwQFuYwCxznPDy9cqaruojdacVK/AYwUjfAlScEmJeEzSp1idY0eahi0i3+6twYTIZc64+hZMg5//DTTY9wXP9J7rPrRZ1tUUBX+9L3acgnrHR2HJDKuzvyhgsapLP4MZ8snjKvdCmrs/x1dcwXX8OWArqNFc9eCr/j8hNq7lZN6P92hbG8IDQiwG7qGpPERFbB2ryv7uKbfNZVFmbYjJ2nZ2MGxIBFfvwIw1/bGEHtNZKw40j5ZqnzoYyTrEDZPg3aLQnfTf62Xm6kNk+FW8m4RNJt/KffKfuRn0W5cw5R/MgJwLA+t5h/w8G032k7D9t2cfiTMQF/KfHqm613Teb907Wmt8Bj6bBCQEoeJCXPlnNo8hhKH1J6RDQJBO7t3EU8jsDzIeDkqMni+gjhbo+RCGmf7Ui4JV0+/x5NhJpus/Cm4JhhtCFRwKCFJYuqvvist8hKzkyQG8ZSdfvQQbxA8KlZOfim+VG4VGQfIdc3uT0a8jm1FmePUPxBpSHIKsWmC8N7nIR/AzTv0GqbP3gZHqVWzhWqogp6doJyn9/7OTeCc0oixZCh/+X/GfoDLX+OGScWIWuLgigx9A9fGLtZgcXKlJGI5XbwNpkDcD6iBKZacVf1cShN3lTVt99rmFSzmhgQ+PgJywFe4qRHZfwuMHN637jcPqUny47/T1PPEYpMvVcb/B4pOfIL8n8fivHd4iWvR4PqryJM/V7poPJQ12O9L5lWh1dzOSoAmoZfOJXsnPVAAIOghV9w+dVzgy3SisFlvPnIsHWo+Gg6jb6k/CkPWgwIVafSe3VRh+541XV+oNMp6Og08jCPOBwKZxahrsHgIRcvxoEfvWUzhh6ST54pLVlOrclMe9m6L9ta4b7uJs7wbptlPohs+BsbHFTSKFRmySWF51VLatJBslHCx+MOIV7GerkMC0Mb9IWaEspnIgFXrW83yjbDaRDBQTU5mfvZDqohklj7KfwwAPB4qusS3pZ8lKGv8AW+azdc9F0AqVkmvlWaaxy0lMtczwtCWFKQY+ljDrxPeGMd1ZLnpcpAaBFUsZMw/vGFq8r+gaxac4lHescYr/WXQuKrUL6CGh2TTJABnwbN+4H+Q99M9D9Ec8gYqL+9sY0ema9Kc7uPGJaAImMf2LEWphHOeLf6EXj8uyo/FOEVtYL/324fc+PFoObtAsGXP3u9NkZGB4evlhr+Og8GCT4XIYJRzwulhaozlb4am64nhm/3Vn0H6M2zLa3zYoXuKYynEu2MWahayR9OHHV8J4ViaeGvAgfm66UXb+lQ4/3CtmHws9l0PeaU2stTkjqHroSIGDRkk9j19DO61B9wkJnzqxTsokol5a0ViUgY7KgVuVlZ8+jvtU86JgiX67X42y3GqLaBFZG5W76Rco1U2TKd202PJDLpDa+jr96wMR3ef6wxny55+i9Jp0iqSykShWhwyqFB1OS4yavrTNqJvO//VFEE+JVuYgFtRH9ZeWgKruTuHnlKRe/o2rEsenBy7M4tnf6eXCVs33Z6hQ+DKhnCOoybXuMbGu6sRDakBPG4vhq2oBjZ9boTQr8yGb9odnwvzEClc4c/M60rQihi65oIgoQ9gxzlvyeENjCA/BgSIaM9+rVzuxXb2RkBy5BfndNjgz1JHvz+0ZWbcrhP4bwyKLcU3wAs/hOkN04DYjeJgi7Ca/Jd3ftQo6HEC3Pnq+b2hQLrrb5ezAnV5vJp/NVyTOfRfUYyvpRBLSWo5os8YC80U7HQ5KwgzjONgtnYSwMZ23SNj0B4p9lcU8d5oJEz6GGsKmpuNy9GxAYVQ5Z7lGxchj1VDxJfOSzBBeuPfFDg09wKtFbY+1ipUFeaGUmdyr9/Y03wTXFoVee6Q6AJOpbuluCaas6QQa34KIKnh0kC+ZmocZSe/k2BeZyEFVV4Lzio2XvRviQBq4pIY9eQLtjPDQkVHUiljV5nloPbkdAYAQYB4yQPf7357zYLNPTVgg00aqmkAsXxSa2fLHchGaFt4m0pu+Vs1fTnDQqLA9SdEbyVwL2rhNB4WWr89wdbjuHmAv/esAmKviQpZ5fjOEgDrmpqSIDQkh6Jju8UyIDkd5Lo9yH9WoeJ/jR3couzwQIAtT3dIiO3HCjbIaYNKcKQlrSsPIpZJUbJKrvUeLe+eDe8yBi79ejQYh3cSyVqV9Ozl+qNfh3IzLQePtZTmgA5RD7tCBVtF/BPsCoDrLDMIixZkmBx33IPHNN2WPptI1FRHNxTEfJPFEOr7JY6NuaR96TMohHwi/TfmaHIl7pTtmR7Vl/r+aFTk1cVBYIuMGe8/PkyPeAu72xaESeTsE9Zp3IG1kCj8kHc/Nd130MxYCxToaXzZJH2gIrALfTcEVo9w+PSiXyk9Ip1z+y3i6QEErbok8irKxhHuAtGuxgzROAs1q+2HMgcDv1duYVBjqXFgi4UFL5ddwnglmiSgwX/K+hVTqXR9G+KSEqJLDkgr3r+FJoN/wTS+bsGvljsvRokdECnZvTrOcNZm/hjMWWfvMV8M/WfpXBgxs7ZCYxe6NG9oRhhy70VOO5plMmlU4UhEWTSPkLiyKxYAdvOWsKlkpc7U0maQNjlR5WFbSml8QfNriUJUsrHpeQbOd6NzJikWkVwMOLTTgiibAHU+Loo6gC7FVTiouPEQBsq3NfrqHWfaj9eTFApJdLymzngQ76J9RgxWriXy9PE772KMbSybk2e6Vyq5oFtNaaeey9SLg7BH4fjee1Ii/yxBYemjtefBHnZ2Dul+76yCDnIblwDbjGAFJf24lfwlnPEERd4x+z8+yyXCYHbICXaAx9UvKs8aHwvXcx7vXHs4WmGngNIqnpTSpBBYm9JGZR6G8rAd9E6ZhQ18Z8hlMOsrLLKyLisz3f7mtcRRlHQPnTnTeVnQAqLkQbVZ7ws9mC+1cONxh/YtXiNRpoP52pAUzPBFeckwJpjDf0+Tbr57qsszh/vvheKQX2rWVsD8cm4pcBmPGipOAtSKoO8qLMI/VQ0wQ0YGeMPX95Qk7IZSB1RHF9cu5P60cpyd2UVPv9bQPG6nntqFIhwTAKphIxUibfgDeAS+JbwWSinfrnNLQbJPVx2GJlJypPR2c9iIRaLZVwXrG9GO/xg+P/O0nuFegfW+B4Csr5pG4vh8KvgDGw6tKYu4Zg8ZATUwsnwiJ68mRopo6LKjcP8h77sOiUEhJpPkEvtp+cv7KicAwh9dIU009Pnuo4ZpO6j96xETRo5LzpfG3FeJ+Tpv8aUaAziQxBlo8UoB0kCJWsvBFnrtJKHqzEdRFZOZEb9R9elrbSvlZjGvjbKpPnMP00WMD0o8aGwdjoXs89V9ubJT8aYL82oYtEY+kd1Ylhq34Lo9qXp8NuKMy3sW/JiTZXmeffUwZRs2Y4sEFqTL4gipAD7UF1BZTvtv+YL4mSxagd/GfZXcf7zuhwAkhXy0LemiAZ+BjXtKU4tCKVv0WAzLxFeRk+zVLqedB+RnVxSo0hC0OrbLe1d1CNtYm+r8J8dz63oAuzQoLRtvJGXC4fFrMzaLI2ejtexm5Wza8m34N8iAkQO4N3dWTMe2iegCO/JtUm9ULcDI1bVvq4V5Vrx2R4ij92cbh5dJkT44n8TjyQZZj1VLifyPKN9qRlfnUWUBQxfweuUVcnOOdRXioF7cQ8RM13R6MZU2PvkVJImy6/MkoLhewm9Z+nqb9yQNJuy/ENhSDm3S3lvkON59UTrIN4E8kEWEyJ3nEwQTkjIw393aDhTnlZkftevGZ9vt5EJ/NJ+lJvhu+pub3noB32Z8vVBjQS1xOiQakCKwZiSw26p4bwANk2QkiJrrIpKukfGMD0fktQj2e/gxiUsap/5jqdhbO31/9Buh+rA9x9KgphC+RZMBPZMRczA5vg4ag0wjpVn6yxrclvnaFt/s3IgdjT1w9AuNQTLUQQ+mMO1gi92RLzVPgjbNmQXzgQzAbb/k5U+E3bcxWUEKEhiZG8zS05pwLoXfkftYjPdBZEHAb9W/PQBA2eoAYeX7SZpjD3oXMUK3YB5ZrVB8hRtqyB6tUyu5K3gl8rvwMmiLPGyZuw+jEmUY8sJHbWlSSpa6eIQa4cPVrmZwKsXefble4pDqQWPQwRhoO0KB6Se06/DsXroJyx9P4A4ft8NXFb4pFbAYi1iCaj94Ijxtb6GCI7fYEhACkAoidGTzIYcCPe+f5wwEkwKOjTFYCMl547qXuHKvynXY+oraS39PwnMPLxlLM/4huvnaKxtPV9fXd7B0o/ddXMalrtVjY0kuvyBD59GG3Cp9nA7pjSrr/fvRzWuH1Ogq1umLuDdbq6xS7ix5zCZCyuS/NQZ5jDBNe5Cq6M6RFVwiUGZ9fmtLOQJzN1yeCYbAcXsq1ZuMmQnpqMAECpko+7NAt31eUCZN84gtCcte5SUolMRvZSbmjW/I3jxUbIDMu1JqfxLQ7WepkPAC3trIrk+pH7eOytk6Tjuf/rjKNXf7v0s9ME48mEiLH16WBR1rr1PDfLMe3ee9Q1oGrH9UxL7rZPUB1d5T/6orBInkTMDG4nB4xNr/ynmRGL74+SlPcnC2i3WpcMlx0fA8JywfWrQ87ZxD3uCAZlZfvL440b17NCqbaTeWCLnnTZSpDCm/OCmZ+w9qfc3BThx0ZKA6BlxQRQjUKVEF+3jo08ukqWcPGmH+svm6OC78IlqW6qRrdz10JWlo2nn98tUps//vRD6MMlHVJmafv6uIsIkgxCtcjJ4h5igdijsl7OSPr5cqF1N89K5Bk9zuxI+9Sdt6lrTipZ9zX6hhgdqfTLtLTpHK3rMhhYxKkVIPJgs8XG5LGNFdThXWwbyd0YnEU/Vo4mb6J8bFnip5s6GhlL3OyaXMW7vO0gjEkwR4IfZ+1INbrg3lGebH+tsJD9egctEZTo+NczV8+HaGGyvdAJi5Ae0e+muB0afYbwnQ89nSgU0Lc4v8QTY6BEoDHBfjnUP10d9mCG+SVXI7eFqAUmHDUcjxbg/zHBC5A3fOTi6uWiPTpg9MslSVrNvDWsCKKWMYG1tGXfUmvFsU/ZcPw+DhGNcPt2321fUmj5WIFAL+2X+OShKflPB3rQCiZyD3a7R41KzGsAnP+2nuWKlS0wlQD4gbyqTebvN98izTOS0OhO8CImet5bkRi9Cz2u0Q4erKEoaHMwf2Wv2I/u2LsYtmt8EnDElbH878c5KZPyCKeG0kVS0e3HI9K1LgrzDd6+iuX9iOjX9yC90gG9srwCVo6OTXUzaRBE81b1gK09U4FyUQ2zWagr7EkqfZAixT+5KPqb1M5fsQw8WEi6jZiYn3brs8Dc7Z3OqayN6wp9r+2Nidf8gpJO7lz4qjOVF3vD0kEQ4xGVH8rIYnfudT5+u1zPJuY8yMRoOiI35sPvN5ykzCwRHSohI/NJGBgerhZBrBDf2uc/+1K6x2wTYPY0L/g9/U/bH+irSKca6fGPX/hIwKGXWtAE479MeUkM5zQGuBghTXB7KfoIi+im4wH/wJZsEFIRNowNRZsFMLDc+SsBSC7pSQyG4y9N+qc9AGDGzD5cegBVyHnEsRuSD7ACkZI+bSIMAPeXyHbWYvDTtUJ6K3gkCOrl6pWywAWL7dBzHpSi34gsP049sB2s/EdJN2oUQWStKTLVClEeOfPfGhO867NoCMvZZwGOgkdlmbLu6fy5HgCZAInmCWNWg6t4ctO5z+PT3l0ma3cGo+MEbAOLgYCj+sA6MDnBi1Zy8f+DjOaan9whWehxYEYmLIt2ZhqUpGu7VQPO9R6rNcGIe/7d8are3u2pkm51yDeDDgwXE9rfXzjv7Sy7QNSVkx2PBaw/f+cQk6n34+KZ6Iwq+gR9uod8JApJ7TyS2IfwgkggYdM84/xTxgNrk1wOhP6K8kGTAPcLed77UtKuwok0TnI/+nE31PIQtHfjFUgMAUO7NSYO1jeeHpHOh+XCyeqn5sOCuTTPm9rTUUYZD/UNEco0qFCC/VyrYYizIqBqHjqRe/rmMn/Wp2nnVSEfDH0ips3hM6Pbex7k0YoVqQoWAM8vKoZlgQ3tA5ZlcyT6yduuNILub4Anfv110t5PsIXckDtmNgqqoE918bmkM9HZoA+owW1qcW8eH8lsAdzleqdM8ovpu9VRvuB43VZwX76RZ7HGrurQdXk8Hw9kbod1UbXmQdq/GdBm5Xh9TbmW1R6QFGE4mm339qE57/5WDFaFJDkIzYnBgjDLNpWKqSwJT4T+aaIONnDVTpmxFfT4RzbQXawOQ61INPAm/NAUcl4T3/DawDbXlx/dcC+UTTWfozR0oTLt3xE1I5HsVNAKu2UEaCL9E1olA2gCIbAE1lxKYDhMKYAFXX0eU0oEFQA6e9Blr5b4TesS0d7nVdkh5hHFE7C6aWaVk/iX9jgWJtaPFhksUjINXP9a0i6o+uGEdRWrOiWJIYBBd+LUPHhp6TsisbcQ/YB4krFL/7O8o9iLEWawmZlhS7iwWZmSEIksY5JX6QRcD4CzMeMtT13ODL/lk+QhY8F2o2La31/ixYR3Qs8ZK26cODbzkEuweZpGzng/1pSeNIQDBpiOgG+tb7i7mN6EnJoBt/fEvt4qQFpgjqV/FGOsiu0n+QFLOXLq4i6jGR0qcmvUd+2xrOrny4TQ0nvE58wbPupd04Z252pDTzR8SNkI4ZHAeChXAyHfq14IDw9N24QaEi60d3kjBlkPi2dPMfBmt8foOvbmvBdj6/mSamYAO7M+GzTQso/FE1OvNN0rzJI0/+uzbn9aNSzzc48jX0CiU/h4fmATs74dbxCH90ZIQRp1kcuv9Ib+hNnaOFOiV2/cqyXco+xFWNdFHsPHra8UYy4qCvOC9n6koHF91ibWlr0mmlpobRL3GOaxq/2KgwAoZskpVrHCO0Y5EUsHy9uCHgbML+x0KiUAVNaCSCJrLzWG7J/ftymjVvTi9ipjCtkJj8qmgvkqusaAh0XsRIX500/4zjSdrxUhMzVJOxojghjKwxEuZ5KJavm36bjsgLOtdJR/o2HfeBG+fiby3Wgip0h2yeFMLDpUaFqfU909yM3PRkOk2aQG2MO13hvYFBVaDoSfrZJB7z7bbWoO5ftDQLhaml7cnI/+S7Z9J++V97xaekV3b8ku3RGLpGzAPWVZaWbjdMUAe6StUZJhjmKlzGnSX/f82z16w7edZhIGHQq9LFza638fUSbHWwzQIibTRrD3XGuxWzvRKt0Nx+G4N7Ig3xh+6G8YlQA+taKQ4xxJcmlK2+pcAOmO1JLw3Q1h66z46GoZujWLkOCbKkZp8x8hpKJ6GTROY+oKULwR8DtJDHHIP06KUowBquoemnqGU8aE2QoVnAgnXdAaER7ZAbpVuAa5BFWhVvRjeLJz/pJyFulxTjHI37nH/B1sj1PLS78+Yc4V9qb8+K5b4Az3hbexLwOF2Ay/keZ8dkuGRS0ZCIH+RMLJAN2JETJAaRlQ6Pcu/CBK0nsBhgrDeBvQXnyMFIfX9YrFo4fzAtoyvJ91cAHwfo9iV2ELHtOvxFeF62wqvH6y+sa0j44HPnmxpB9xYB3e6U7w6k1ktYfyjDeTlEp0jPJanin9LEvgB9j8NuScmzrpC535qePt962PKWR3hPoMbcnzGtjgAMW1OW6XsknT/Ni7WtIRiFsLqgHSnnapFTSofoMoTRmqVd/p9Hfb2L61JQzRTIwHXSEnIVXJrlxDHWoUCk6eYYHFQb2xGIsIXW53heKm7EahJLpWOiDFrR2DhoEib1bxGkKXm44IS1JnHiVSR6Cqt3FnlI3jzrm0u1if2bTeB9zozMwgpEmw/hIxY3sTJk8KgVxXwu6NlAsmjbAj0ec0Lj5JvU7zkfBSkBBkwulJJeLHs6r426CXsbSRZZogCO94ZAqr8QMdPTSsam7ZSGHc6IGyG1NTnzmz6Lu0CNld6fxkiRCtEMmuG3OEqFcIZ4XxjlfRt5PcqnEbQ7UIdHFS2YTWNhF8ixgsvGS1rmNya1U8zHNAu8J4cM3vlus71tu9/AA6xUBh0sd/GtgTsYNcyKz9h6kKu2IFb3a0pVNA6CECivduPUvcEk6CZLphnU5xXyFBsmfsuARRW49FjO8rkBl2BIclCzbiPnSC4PW/MgRDzQxFchvpQGsQ8RZlqz2z3cybmySZz4TwcqWUkYik+Y1ZiQpEBx6tLAa1/kAVVMfj69EHInr0UrAywEIxYYHHRZ40iGz/OFuylqW90uIgmBzLLbbSoFNfYGyTbL1a7YHDPg5FJf5N2ZD2bCkY2YvmVESKeNUSO9cjGbBxfahrVmZGN54ZHEK37RAH0bHNvXN+fCwSPu1n8JPLR4c8JHrJmfWqjtU0MnhwINsDxUuZVvSEjomVnnejzPG9dSdt+IRM2XS256odySPqqcT3vH+2CsCX+hsofHCi5NX7zS/jnqhZNlG2DfZQ99Gt80F0R9nfBljkkwEQpNKGmg1w1oqHnEwZM3W5MyOBKFDaok9nsn3LNJ2acrgDAxb+EstsDQbGNJpZRVdzROXUJ9kB5Df/motVz3cseK/qSUPQ04mfOoMilN57vEthtmd7KiyIV3C7Sd/fgR39ssWc7xgIA3dVEAQkqPpoC6W04a8AmYUH0k9KBbeD1T8VatQI2ZjUV3jpLw2rmDimDjiqd5iYb+FtLgOzGIa7T9JDTtBoDhRfVRMAJFnlf9GwRv3toARhI2Jm5GxtvpdUC6D0qxo1x3l3d6i347eo8xM+p4A0GDqTAD0GdqBjc+b84xA0l8VuyHoKCNZnimx3ImakWXppsJ2DeQv36e5fQaZn9Bi8DpAZcGH3mSBeZkFfqhnbkqkYpAZhiXh3Ekwq26YQqtgVOPqv8TYEe67zrMYEP1tXVEwmjkbQxCZuLWM0Q1RPIAVf59QuLjpEON9ckKi3hYbxNXzutKQODUZIEAafIhmD86U5813ktLL3LZyKeV99C8AfHp3EKRdxI+73vSVRj5RKURIZvASGwoh1R+dNmPIC8LHsed+UpaIhiDDZcdrhLMEcKZl4vpfOei3MASaX0aLFLaJg0d1b4GD4snAE+AwsaziiSClgt2oKgyf4D4Cv88GGeW07dGOIhJfRJyB7dZSIsudn2l7+LMhQM9qhdGU2Yx2aGymQyV5KoDCkz+wxsdZE/RTIeg19YHjyWFjvPW4xUCChFr1hEvnSpzj3loFZfQimvGOR7U3DKu6jJroYErIJzvVbqbdnMJJVxCP7KbcFNwb/IIDPlt9fKkQwVY0hZnsjHUqgrkywxHrSaleLhS6fXT/WJlj+MVRdvpIbRhEXAIrIB2oMervzuiSMnYZwcgUuBYZQxbvhwpwOmMLlqDxyhhOtKFzFbwmtvks3eBGYSvDAI8c85LnHqNmGr7iYrEQqr6FHLFZvLSWjaYOnwiBOIG3xzbxzoXYGY95kAy0+6Pg1x3Qr3Y6m5582JkHg2lKwkL/jMT1utH7vbsCgtfG24xFDr55U08VR0B38YduAIZdjoJ8H+TRPf+ioLbtXgoGJE9lW4miBiV3EPyuY5GbIR7aONhkGMHIljVXlrGz/QG73SqEtkOj7XF4UnKwF/eZVHrCsIa6CQH22w/E8EWY0nUfCKaN+poZ2IqxL0wWxW7FJv+X8Wd0fBOOi0E6iy5K5NTZcGqz495y8c8pnVvYeeZPjtWJP60QqqTrHh7gc3gdP7UQRaI49AZZUyCK7wrMXIFOa16QLSt19b57eca8k6lJXeOWYFdMOCvsawwSVfS18WPOMY7oBlavsXFcOEb6sAqfTgVWafZFCbmI4zRDoJo2Kn6qSso0v2imGOvfsNG3pGt9Pqm95aQ2xgL7KVm1jKNqa2LuLMGGwDUjjuStK+gawYggEWPBPx4voh8yj5NMNarVjtui9V2RfvB0Umi4bLKZJTxV7CG6lBwWB6FimWtaMGnTkNMeqHFvyiDWErwG3cd+yHtwv1HTI7mT64zFaUPvzFxoU4N8Mj48QlVkhBm1cpa+sMlQhiXBb++Y2ZVheWLRq83dLQFBAFy957JXjZbN3Q5tifsFj74zJmK+3Duk1Eow02kHTbO8yGNGpVEN7Bcyrj5TihoXac/7mQj62pEcfJiVOOXgGliekbDvX6S8pUHjPwCMlKs/SeAFacBm57eAL0C3+Rpx1UsTupJFUr1RWYdSI/jAJj1tYe9Bh4KSmMrHqhLFuePYP6/HGQCixuRv8NV+OzMCpb8Le5P2bEkoqa5fNJsPLlqUURlqNwT+J1uRFXCj0UNkv9pjr/WAj0naPlQCftWWTXb5bLKVYgzEFrGnyAUKeFJ7uz13dRTAuGVKQqzR2+xTeMaZKFfIxvl7nk8tEeywGgoUqQqfaT2PTZ9Mn6uX14w4YMgCVKXbqws9uRLsIsq2sbCeqpHI9kM7g0tND/dcq011i2eijJKGRrIDimQIQZZJ6rzTF/jsRfDSa6gBaiOEracvkQ0cinq8f/Gd2j8j/Ytz4MgIQUtVn5YkYzi/XltZHd/fLARZyI3ccm0wi+z+wpiSpnRLGN7AiPOBu7mwU6XY50tTTqCVylBfp5D4g+G1rOeRI2mWsfGHisfhb+1v4hICrewt2iYv63mjpsYkUoGnCBWrNOMWtnIX4bk2oGQwvTc0hbxITPddHH2tHN101bgUnbmtoJEWeZtoqqgjRl9VWyyWyvcWUHr9KznoFhBSyz1TKIt9FvpGgPO+QNBKJXiQ+1JEmg7p0wYObnbXjxjn0+KlpUJUmwgd8GDzbUp0sLeNao5gD9Y+Ax17vVaSYE9476nzC6qN6PREewOIIXCCLIjjmZX7WWpCvpFu6Czl5q8Cgx6zKYr6zoLXxKFb4ZQWkTK2ijzUNGjsxZZIt5G1RLDZrMfYgb82ZrL+TClCL4WlUX/EkwHdVPXB0DyvcgvsinZdk50bEWG69E+dIuNJYh5WoPaWJTtEIQ5bcWtDnVJ9ryN4AN0g+iuYm9cdoWPC46mfEU/+iGTZK7if9RW4g1sTuXrrpfrVhv7cNOq7I41VH7tEhBzht6WystlYclJdX+dsNN4zVJsc+ip+Wo+D9m1La0GqI6gHaoWlW3OMFnf8u5p+iLwaJGpWMdG8e+aOLTeNoUNQZwA1Dmh9A1/izCG7EQIPYbIMnzteFkG+ukSKHUnx+1KZPDqqlYBkmbgXwZuBgNYmzj0MfvihDhkViw5d9QjojT0OeXH0tzNTKYE5fBfK0PEpSGpmrBpybAltu4vuITh1KR48VRy3r+ErudHVAOUuKmFFicbRmNPd4lUhqbk7AJCRFoBIRbIsg4h3gfFeQHSCny+gKyyMmF6onBH8h/cOwFLpy9dW/uItz5gj4eD8W0Ro7M2Nmg4AqA1hcNtQW2d8K5NG+IlIZ6CSMotrcivDHA4om7kgf0m4oH3KcKAGJzi4Lql5ako8ezVz3aSoPIcG9icIy+GopuA84E7pRsIMaKIHboZo1aMIOXX2YbSJvzRrxxrbSLB30sWcgFAPlwDfgfVzWV5p+IdFMyvcwubmLrPiO5RRXhkNM84sN2l2NjBG5olJNaYyssGHlBEN4NE05Sjma14q1XopgUJKo7vh+ljqU80mL+kPdMR3hzL9e7iUtiDprylKXyIwlU5FGHw17FKbXlvvdbyj0ylq/V3v559482lUvg6IzHibphZKfxp3IDMOIKuQeT1QuSW2THAVX5cTzQWmqG6KAPZlshc3FGQOzCLXMe4s0q3X5JVuB8lGEcVIAsKminecb0b0XsgZ9aNwvTrMVtiKkQEeJ51XXNHRvbGUlXtxPii4PLT8t0TX3E/xsrK+rlSKrj/cb6Yz2DZtY/kfg+w3mXCSAZC+RDPrkWUUluYPSTijCRuKB47+IN401udkCxpdLFzRNptANbJh9dV0vt5SqYBL3c8f2+JryrSz5yfO7PRQOVY+DzB5EvqjnEblCfAOadVNQ4YGFgthRmlF3wxk8xuJRXcDSjXPpQkOw2KPXOc1dVUOE+tI5y95Dljjvvg0Dm2CxPhbBD1lBcu0SrOQrIggouC4ibzdu+zrSm6NekcKTPhQvoz9Ik0SRB7OKNydW3MiscdAo5Yk0Qt1HG7uR4nhw8qLlYnqIKxJxbIzSVdoGM5b76cWvSmoxfmgONHkgOWaOn01QHWfXMV/NaCYFj+LUaxjYBvVpg/DAlVqZXQLjenHNAnrbN0oIdQffZnDqVClCIZBIbO6z3WFmJqcRULdzWUHJpLUL46XOZBog+IJYN1XEL6WCqgLOkOBTlKmPOLWlF3ZoXcQCFHhfhQz+0I9/mGYUhzKyIqfnS/AcNceJYn3C0sEPNVqJfYGJDyIjlvF7evmzb4TliviqGEjWfTRZSv0Tq9O+F7INmX8hUP8UTzVi097P3yP4YM8H7a8zFsiZNy2QtJERWalRAOYeDZCHm9GA3TsZXXrQZ54/8xEzm2gauMpDNUN0j6ejPEJam4eLnRCvb9WWmufBnXKqAcnKP+bY4DX4xF4jcooE/LAlYtZRXeeXAJMJgDT3tuS/d5yLp39AmF8kjB1zWniNPY+kvm0Ml/ZccjwJHPtx3cV0dE4uVYiBcsfxIdo4y+vFCnlprNuzL4eI3FhnLcXonJOg53QoBNjC10RCblhUf5QQP8jGvpt343ja/++9xzU0nt4noKxtkvObSHanHssYOVDBRI4M5QUfVf2l0eMSgLAlDhB65OjjFIhvDWZjx2EHKqy3aXy/v1+gP7QFpbTT3cRKnjbolNHZlSZleidyTCdejUqWBNXpZf+rlEGrPdLtocrYShE2aOGZdk3xbKyQI0tR9aQCg71rVIkLHdXYAyPkAhOWwlmsHOLIS8F3g+nyGGunzs2CBBs1KMXvXGwpNVgerBd3s3QzOfgNj7XJx5+W9e8oxVLOwSLVWHxz6OnfCkW0Vd4mSIEP8L2n7VsDSx0kR+/fzSH0n5sOCXzrbi7c8qPi+xiKYRwTYx2x4PONlCIekyEQE60++sOOLV3YtDd+bqOP4beGnNOvmR+wjIfcj0si9pK7XZgHzRNq8ocxKCjHRf5fbswC5u12wCaHzrvqi2XZ4L6X3N5AoARZrZvVyaaUFrIOlk/tfpoFbwQJPKh+WL0AzIsIo9vd209eUfokjOmWEcukVVgWUOHsA1lI9TIe/0KZ7LBCXJbc2wWBdu/jo987rr8UC6+Yu7vdMePqC6I7GtvhliftXnbDRLXDD1CxZigit79sJ7NGs1Tau8YN6Swgj/pqLz9El2t5/XqjRl+BvuTB3V6ajNJarj+eHEPtU9skeSYd54XLpyTt/rAD76zpzHYRGihs9FSLbADg6bOYiaclP3Qn86TggdcdfeOjSxoEiQB0t5L3DRwj2sReFhuEDO+S3nuBi1/tlCn4dY83xA5GLvSHZ40Ne317EKbXEwudxm6UiKxqlVPaEc4S7Yd4pqiIjstkvOU4V7SmAQUyMPHq2hujVxS+P+8iWd1B9oiI953Ts2NryTpFHY2ouKRtWqQa2gjeCbpAwrfG61p0Cn+dg1NPm2Vdn6LJcoJz6v9AnRcsvRp9Kj6A9+ebBe+Q1f0Bh22r0Xc1UrX4S6kpXdDb2q5ZFO7iNMZyR3AxanTyxwIs7BaVUl+oqSchH2K2UClCKiYW3AfNPkbV9O4JrUzcWfrOuzT6GEH0Zum7WL5gnvz/cmyu3y+6Jp3QS0hTjvYxni9dQik2fB1ghapwcor/1qeMQOd/q8iIr24ZwqllEtne9YBrOs293kf+B6tw7WjWQm6gbfGPUQ+wKkm3VuPp3LznvOX9VE2pysLJ+e2Bm85ePD1vs0Cci48WQjOxwWot59vpe+3JVgn9EDOHHYG7fGyL/XS5HMccTV/RR2KfSD6RQX9WZpNaRawYvQfPBIqtAZ/CtB8ZiVpdHhsR2b/C1uE0ehwU1Px+UnZUsR5x10VAFHSPGyFJRGdPN3dJtukPojAeHa+fNjjR6sfYQAjCSE24DLRP5jos3bHwXNRi5DrrswAA2/9r6Ol3MGEu7dHwLAH93Uq/c8Qxx461aGajXhLLExlahPpoWAcoxm61pzThnCzYpsDNIkzVAIBz4ughKd4Vv6linRZCSBsXlzQyD/PgaHdozC6oUf3dXwhuE+GQwS8FtnBSE2t5fZCYPY7hDGbf61sHotUmIm6dIxJ1U3IGzUcs0X5pmIr4QeMkrxYd0g5TpQczoC0jUMUqazEO+CuKvgkXNq7lMBMyDoOduyno8L6CPuFLzIbjHDc0CskSWDJRzBYg9LZh60iRRfwKWZBjZQtcFYezSkiJx41DQ0f5v5ixNnabSghsFOQ7DG+ALaGRoNWh4vXnCkhL1Mx3FKqC1usmDJqF+F+r+LZQl5WISpCw8i1fxfs7xamytA+7LAsLtCxYfj5b5GjMAMo1r2e6gR+HYjVjj8uHtqxacPln8GYSVchtA1VK/xdBn5kkfswtBzRavBLYAxLO3+xwkSp2EFFem9aITswsY1lvchtmMSqLxtsXf2qe7ERtcU296jstOdnfDeTPbxTBQJXhrjCZKu+gTGtcxObJlsb1eI08DOZeSEniWKVmSQAvxiFC7SFUWVQjHtL/1CaQ4QPUeveaUyyVEf66ll6JX03OxblM4li5qzuL7Z1IbdNEB5IWPTQYofwaeI4yhmIEAQQ9TEDYnPZmDpr2qdaZlIm+AdmO9zP2nkLu5g80l5ids8sHnqlzUTEA+GjKvnyhZSpAakFvpzTLoRvqi0AKLYmPORAindQq7hLMRTzMkBHf3FqS9L366ERZpz3eCVdH50DcQpy4sVtE5lh80uj85G0vdeB+dp8nd1Hpm8TbiMCBg1Nyclf3r34qSA4ik2sWP7G/reK/S53k6C2wgHlusAtLoF5gCR+QUUrMLVvNnyfou3IHyho9Nxiu0rbqqY6euiJYeGgmRJi0o7wjY+I+9LBJaeF55O5+fPLp2M8OZvuzPVgFACZEAZ2mGhm/iu8uAxeyqlVpVsJCS53JNTYWWV/3h2AVrmpT0aXqECoYXL5U6UtWY6ntw0CD2BQapsnqruEfShLNP3bytv/btzq/j4GnQOgznsU9PYbOtzFoa8VJDGMcrQvngHVM/F0Yp82RbD4QBYZmXJQfclZNEAM2G2OUp8S/82erNsRUc/bzLQDMtgtzeUzs18/+L3H7lkdVUbiLxbDro5jyWAdoiX4QotLs97yeD+bHiXFVGMcjqA/JQ84PJ1lbmmKourDuFuxagFADxe9P4zj08LKVrGQ+KtDoA7U7jmJFhF9q/iphwZ4afqvSNgwApLI3d59wCNZr4Qo3cmgtOBEpLZhsEwnDElSaKiOvb2UEvVRk98zOxDqqMD8Z/DrAG0dDfFyJ/KP9y6IAjUJaFjhU0CQ/K/We5Mok0gIzfSnM5r15SVqsQBczSnSiycFRqtdhPdj2XGo6E0tw61VZeVtd8ymCXBDrUs4idr/n5Vjewz9FEBM6DVUFWVIGX6I7cyV3+FYq1hrW435kf2ppbYqylcbB9Rsd0JSVt4Oq9PhFro8H0VmlT57Qrn+DUAyXdS85X3o0RFcyLmmho5EcaE2/pnpFFv7GOFulJCUvIIn/tx0Q5S8nQPiwsDq7pKCtV09Ip12gCSa/67+vFrnSlPSlcQAiVvIkfvTeTe680029bi2aqKxzUeuwbY+gaPUVpYbxklhUJ1G3f5MRfHdR4y4k0AiUHhvFL9qVgSeZIs3zbVofobMpBNOBt4HKApSReZsiUxLjHylGdf6A2xhoDSz6mhXrgGBvzGMXWOtTxzDikOCDQMJ1KtSxBPL/aErVfl8vZPrbiLMC/ywIzpWWFMogwNzNXYXxlQGCiKkEyGNZUDghhR41GZYXYIqL303YBtr0xLTGiP5JuZq1j/IN97jTREVtFfD6YQrCIMhyFpsTxQ8QSe42McuQcwBnhTfFtQ2l9uaFTsPSTgxNvmfbLdTviLlUYsUJ7Eb9No196aBE2xf6WgpQAkYt/wp6tY18upOKvcipqmB275roD44231h3g2OZOXlWr3WlcFkjQQMLdfBrtCDOtE9j5pAVVTbvrXbD+X4irrgCd8iZLNxtJ3robv3AWgDtb4+J4rn73EDzcSL3eDjNPXr+OghYYQ8+75c/bbyoonXIUW0mbs480lt1oNE0LscnQfkzMaoQr5xoUMkc33W3VW6VgflXILosEmEoPT5Z7EOhKR2W7/T69cUdNWcrXuFVFGX/GRkLXog+ixPsTf9lrPRdRIoryN3FbL0F3s1cjAFn3N5TKd3EYO6v74ya0dmsts3SXmsMkLV0Wfix2ERDCEbvGp01rUfSDJ9Y0uBVQmdGEL+PUUYwYfCjxENlC2KYJKtJLbGyDlEYMVhuCsvm5i+fI+xJkN4cd32Xq3hMqvRNmXPByRrOo58yAVh961QPkl8Cl9QtBhgO1vfREUl9gdjOv3H2ESSXqmgn/Kr2amKZrHsp/LXlojipGCyK1gU4BCEiJ1js45lKzwJDeaNzPylTDjCXAuG9PnCi/Z06h+OlxCUxgbcNyygje87Cd6j0nmL6lLl8G84dR9e7mWtNjOe2d+Bxw7gkiFZUUqiYKKbd781DxTz18JYMTtcKJCdyjSKDo6MJXSvdgsIGy/FI4lgs/99Z2McWKimMbOuKDxZGjL/CA21JUqmsJCtVI5aig9J3Ss5AKAjnhBAQHwDIwcbqBv3sWu0rNRtNtFmXExtu1XZ8/KxmSidGD0ZCz26/v6NttcvOYTimuYanuwqrySmTvedzFQdDW6aV8+Aa7/f4DGxdMUfiDIy2GtyLvFR0eUxTVjxUvrr8ouYl5zRJCjbuZAdW+qXECZIoyOAxY96Wdwxoo/3dN7GHx9YWcNS1RmQyfJEdNwhgQODaSnbGuL4/f2LokSd0xV87JRQijedVavjJreOoh03zUgpyM12caPm239gusy0m6QS8NPTsdbwbZTrTxokjNmxuqdb+fn9th9ri0XbiBlQRF89rGo7uLtrJ7JzNRZ8sabUwef0Wd2uhc6iKQ/T2nyWSnuXiXCDSi6JQEopAN+JxT3xZSp6ETQ3bx4p06y9FiPAO6K1IVZLr/beK9VNztlIHJakNV7mR5S/Rok62o6YAXwBc7QNzlkExfgr2nO8A+tkl0zcib124LeqF04SK4AhsbpcrZvXth74NCRD3DwU38GUN23D5V9yzNm+pqjDCMv99gluHi7TFmMzIXAXM/+9x8F5CkqTv4Id0R92RWIaxOrmWvjMOubcA6ntgxuN9oM4kjtK+WG9FmXZjFxq/fYOMxD/pnmhYNyEUsI+gCASAPrGuMtt9R1p8+Spstjd2JmGan5TDlcRHbdnk1MfUNV3MHs131zbiUVaWDnj4rzLlLWpaXSKl7C8EnbAB69RnVxMUmnMT0yXRXu1P1ZDmFSnSuOVyeuY88RwD7DoyX6lPy9ew4MtNYvJ2ewbrief3sHQpJHvmJuME1uwpHz5Dk7RIvEIhrmTVQ9Mq+dEW8xIoVL04Y0boN2CcgZX0wjdBBBDGZ+EmlaXkneOdqFnJZElmWhAdGrJH7P/StPw9vrR8uwNay19znL8gRDvibf9MqseskN22HY1H2/Mum+T429HkPig6pGO95kXcKoxARUUw2TrXToWxagx+fsknwWOP4liadQyoHrdqp8/FFwNOhEPObi55B7QB/K3Ol39TZ1uOkI+t5mW8Dp32X+cTwNxJIKhLLauHttt71bBo/V5LoeraHysR0gBVkMYPMBfM3tErgkjPJz6TFwrOKKfHTTfx6LJMo5VDd+Ldqc9krRQ85z31eHWtnSxZteLK3wjxlV0C2QsjwK8pR/v0F8W06xBq0vmq+Ztjj86fFKt6tNVr2JSyNZMueO6urTV803iRoKOoM9hZJJWqKjfBbFZUAW6it7+QnkcczAxZ97rruSC8tmYjjDR1b7RfdPm88/BHVr0Mz3Ge4XK55jwIDxPNHPHZCijYFglr9V0vU0kkFbsBFLMxr5PoigFzwaa2oWhZw1bWtF+loRH6LXqX4TYjVhdLOuZbFT3OF1HSFnYq0In/ZZNMpstYdqhDO2deAb0G3kVAg1wN3kNR9keaOSE5rRIAmQ29f1CsWmqnLm7QvwU9Gb0pxwRmtLLW8jkcsPBoTFuD2zG11GBydd6iGFhWKe0faaq1Z/3nlnaVA0aANCI5EMPfV4Hd9hVaG9scSx84f9eGgWMDJuqYqQ66AT9m2akYaKwBmtxeUKEY7S4tLifaJ+hYWOLGPRbLJajp+J//divPfswyJlrZ3oxcpFZ+LSEZ2sBAq2sqmYs5t7IwgelcRhVg/V9Fg2SzYGo2m6oAm8j4wcDttBA6KgFccL7h0lPjbr2sogxnutMin1/DECJf4BHdf4I0kiytUfaUNfU2AoNBT3Xp90stRowxSDtjiRaGKVG64zuyAEtXP2NicGd4xz19/6s9duLolSvLKjHNswNroUCLdXiVN6lkJMTS/+7zNiiaPyhZ/8SnfpMSo5W7GOhK+wdRgqwV8YR2yVXPTLRIVhlHRXTI6ZblkODZ4XEtGII7eagvx4360FJDg5b/uWxokmlfMe0qT4HYNb9u886f2G/3Y3xJkW1bo9ghxYZggzzCu1/fosWHhIAlnZp5qNwbiugXHo74jppjbuRCJqkxXBitIcR1GtaPnfUIi3gdru33DWrHGmNu484oS1DiV40C15icQm4zAOZ/tq4BuW3bVT8AC8fx3b49i3WNW33hO0rR64b5TK0KFmAew2Z2UV7m1HDgMmATdpXl03yQTBRk5HXxgCXci6ZzxggsJrpCkuX3fTozTeH9nZFHjNPg9S52CgK9dnsRKQhWbivV98iW0/V8JS/LW8vEykeZlumvJYqKivo7GLaO0N2FsPlP9BA5k3eknPhC4xjHLQWBc59scymVhvNjTeVPTEVz6qa/PWeGp8zgme7yjwdiR7SeNbJSDVPJ98tqa3L6JwYaXPdHwjJGhBYbdASETeQCpgwaGnM9BsTI+2LVI4IOyDxsXz3C0gmBvPcirnYdTx42/merx95OV+raKa0UhNHFvHydKyssSu9jRmvSoswqdIOqTqTyXt+F9bBNDallr+8f5xkL6DnQE1QzLLP5Q6x2nQxjbZ0Hzd+zgM2IyGZm5Zthm+oIsE35pntsKH9LaBgt0JWSiywb6xsmyBqakc/tPAwimlwF9A8G9QD6EgMot1q20LFxTgMsB4VIbnwPhXOSeJ+mKGN9FceioeB7JuYdhf3vylNhvimQIXFGtriLg098gQtCuVzIjsSWKbsW0s3YHxIGhLcwSub1RV3VfwLdLOw2WleEu4L/ZOv1G9kIv5EORDYEW+f00sz7rWR4LsksVnBCXN5JHH+5sOFlHd7g1VrihHwigmjBgWf0B1jVpjpZxEdrWB7aNJHCJhdjqH/oha3jgVx6WmPuT1sJ54dOKSFPxCevF+GO2hFNEp2Y6VS99efw/Os5hhxJj6E7BB0OljXix0AgBPNF+ouLE8KtcoI7E/i+mYSGNz+mjsFLM0T0dq9BXe9fYN4KpmYgq+OJrlImdqw4pubDsK8CwV5bMCYutAZfUBzng9sF3USApCdctlpXa6OwVOHDIRtBlT6O9LG12osIVyZgcUpEBH/++tKxxKpuIy+UzpQYBpyJXeu1oZIsJeWbkZ3lEmKXSbB9p3kbRb4qumAm5huhYCdDcIEL6+ZsrSsa7zK06yjoZlq4RCE5CCA/XhkEkohu6FCyng4oaOiNsOMo4edr/vIARAKwAr5OpxTwAu5T980pjfJHr5yNhz2G/bj83HqzBBG9gnhoZtZORfUTo7sJnKzsFlqodwtE9nTqfGmVGyZjhWQzdaQKffSyLR00KZHs8n2Qpn1hqBuZf2T5mGWwsA2pZacwAJsQXBli3c3iwZ8ibDVu4rNTqj5mHTC4Dt2nfA6rfK68jGycd2fzknfsTCI9mAYgYACrSvxNWqDUTYgO/a/wchlFGsNOAXG/x5RgpirNlurmFxZ635vhJEj/s/hvTVQi9RL7JwsvPtD6oo/MITdLnfk8lVg8OmrlELyv0OWhORRnZpo0f9As3ydKhr+yYCb6N2wu/mP1w+O2pk0a5sf3Th1UYl7xnigAdMqx3e1NaUqn/g3MZdrFE4hwrmKfQ9Obo6RDT0mprhCmGfNWkM3FwqoC5zLOxatreqjrA34vavvUvjGmcJyufm7sLXIb0766qjjdZc+5xIKdj84kx6q+EBgJFmv0N7lCVH5tBFuydQPkysuOKy5fRgp3zEarTESQXqacj5151yzwCiiV5xyefhYmaUJEFKo1EIFRNR/g8lRFg5fPfG5ScME5UDVZKMlADnn6i90bm9AzVSq5OqZc3Lsn24TNFJF8sWWChQyC65LxO6YfeobmLDTxSumTdK97BC7GVA8qZBx1VOXkZ/RibQDMeHKCpzAvV1lwSOSH9BmU73acJTTwOCv5pPGUZXcREh/I6Thj8xUmK51c9207YTy6EPOzpzlSEFfX6rAp1wnJUHETWbVQh+gHGTJ23bEb34ofyPFQGITKN1Vepa1gjISVjO93L8vpWrp8/o34/MliuPf4adUtDcfiQk0P/+yo9B2hHXeVuD9zaEhQ47yioE5mpajAeaA6RWfaROdWp3q1ZrW0Wyh1pC4BYQDRvnOYJmGvZ3XXThSdP7W7jOfWY7GgYK+5MMA45yTJpCbq4FX6vlfvFIhiAiOrt60aV5XciAbLGxynUyu3cGDx8Hbd71VeSioI6FOGwWkOJAxbpPdD4q23mXOXZx821UyAFVY8DJ38W227lJfvy8efLkZyzHmDX84Vl8KeE/isRbUcAl7h/hWKKIrTVqtMXKMEN6M57lIayAQ6YMzl1giwEw+aE+9OY9dJynC8OrTwmYRUijQgnTmvppBQsVXzr+BYGal/v7CNbNIyoMr8l3PRn43tkwLP1jdtcSJlsLoFa7Z7XI3F1qbMKVFeVda4ACcE9XHsM5v5ebR4BO13wyrdBPNE/QyorZ0MWW3XBghIQelWq0e/iIo6WDdph2Wf05zX27jqHIvzhrg4F4NsPKVD7KPZcf6EksD7mRwYBO60qBq/ISXAMf01TZzFxWGGATAsCj3rGkvdqEBLKv2Zv5SU7ZMUs9eDwzVCt1eWvQp6ovX2uIl+EBnV0OLgRk57fRiiHIm3QUkrKQwb3/vSpPEg0l6X2aP1OYefBtNhPbRIE6YkrT9udeaofdlBmgooxLCAP9ZGxBVk78rwD3gA1mfhAezaaCPRMJ0eobMRhJmuOcJj72NVt+MXIM4tgq0O19FNroSqZRjhXn0HgeL4EMqMXjWM57F++nkTxaF1RLYdzLpKekU6aPUPmPqaPcjEuIQgjOuVJI1KnokdhZmwgP8hdycAfKX4SqnmhM9AXNE9T1Map9Yq9fiIaLyADAg5iJfgH5b9U46yfoyXJMwB65yGkOo91uEsVCaLW49I/mdnLatLx1THnwRo43eleCtxjqDwaOjFGQyafP+yyhh7Wpoi6kuo3eB1Z55kRAG0aFTkHnITROc0WQSR8hD9wYiP1Rc5//Nqr2yKSp+EPNsIxOot3Kn0L26ESqG20sd3bJieW++ENHOzDo5cDueCe73FeAq7ijhszEW15X2Z6DQZnqjraZYKctI/lMoWinmU4oEJII3CFlaHwkcPQ3JQUKqkhTTWiLSDMLHjUQbJJS86ZLOQ5Pc3GEMgDJqVKM9G+kiXJms8g3ivq/XxpHFP24We3DogcKOmLn1sDf4VLf6XSNRVG/GzZN302HcbihvCHHlom9UZieT0D0GFgntpCbuFQhFp/9nXWrwbLNmpF0zpZ6Ejz9DiVLWUUbCl+AA5CldgY7n62RrSHE2zjiJctEcht0cAhlKM00xLlnuptrGuobjDnp/jCxh99f3+3IENy81Vgi+iHoNimhrX9val5k0e0H+2SOnRw1bKe/Dp6jTq+WjBwIRqnlv134mZeNgbwzjdrqWC4FMC9U2O8EkbbfDoBe+uaH0W+W1ZvNEQiB70CFnB68YctoBdoZmvN3/D5tOuLGSCwFmNtd94Mo5oeaW2r4I+l+rFe84TK6XMnfnBHpvT1na2+F3dsoKLNAEqp7IBPSXvDtKIoV/sv4AWIlhcygLPowZSU9M0iBXlDt06qAMG5ZKg4hHcoA7Mos4gz9TOCWWeSA8UFT//S7i9UaU9NPHZAuHF4H82n3yq51wyA5wiNuV8U5Cuj79JMtP5z1MsjL2ps9TMEf4PtOr1kMV/vtFnI++/JJ1juEAoaMhTZQnVleaZNDN3VM/36dqLsw+J0B+v5jS6jFzYOOScpGROKiFBbCoga81xJBsdsY4YxK9u3mIKM2pEhzSKBj6Q/KRCdUiRlEYbX4a8XAMi3171yIGM5cWoXdoI6d9++CHXu5K3si/2dT9lRomYDWo3kEUxB4apbkgS95LYkcxSLGA1BKePkwk3Q1KCAbNb+XzQd9gYM5sXDBEyFnaGqnrFhG0uFt7D2K6O0kaEzvFe3Xmg4EOw9tcFz0T4v7plmBuIUdDhH8KessZHTK98TO0RH/QEEwxMwZJbtK1BVhKhhbgJV83aZyxBb+owpWvfbRTBLczxJlP+7XgGwjZ5Wx3LXk1tudG4gGTBr3LoVyNcFjk2Q8kuo7KTa4IgpnqERHf9o4qiXz1h53OonIAiOJ0Do8Gm7LVNgZOuc5Qy+FyOWb54SmjBPAqQrk03N60a7zbqB8A5OI1WdA4afqgMS5EAzNmc+qxrU11vZIm3myOZOOvPXGUDD5qMirkWJfqH/XMQsMcIl65V5mx3Qc/Hp6FniN8O/4vFd5CuMa3pke+dnoQ4OM/Pn/0PpgL3wHe10AlscIMdI/QfWuDJ7oiHY/PqHu/7Y8qbId++19oIsH3QIgA0xIu7oQAHJVzKUKq6/e1Xr0AGAUohA85bVV0XuFZridotaoqWcEQD6+hdvOJ0k8a7B2P6VwO7L0PlxK7qRbAhMKCJZEpGCxmKwj2JbCHkuQPxwTvtxQZijZc5+9YU1ZCKXE2iiTJthkKY3rtDqIUTLD80wTj0o44UTS9qBSjrbUgZaIXVBcrN3c94VYYTkfxn7xU7urS/k5jPUmXV2gphgONUH77dWSEfUWpA0xHW/HnISA3nHR6mPL0WS80UsZPx1Sy3TRDQyTofdikS1n5C9ZdQc5vL8gf3YZ9wLMVkhDY9GxDzkEvXAhv2596stfVQNvkV7QQWf5oKswpA/EGWl1w7ZzUv4s88RAwFuo3p5P9esV/WNQqUQL3/+OFD5csWiWjDE+PU/9X3SKsY7KnychR5xePUH7m6+K1Xh2OiqZXT/vRw+NDn1VK4ggzv4o5v1I/zNdCSWWDuFxHrCvjSMZaE1WgcWZU/zYD67hHCREcOIG69UKVPXpI1oSnbxaVwGkJKr3V6sOckbQ/Q+0V7bo0ump90aSOmQEpYMIx9dLFrZZLwDvj9LobEpjM46qS/bG7XYo2iqqL8l1A1PZK9IGSxXJSLNEYoP6FomuAJmcBOVriPTFP78abR1t1VoaRlPr8kz+3ovkVgVW/QbXKlq3eFTyYVuaOOMZMMWoF1jezOO2HYDzbYP0gHIvVow+AfKY8btp1AEL+FIhkWZWHdMsUHjMPzA7iHR6dGnCPyQQbPW5FeAK4uQQ2xXOSKs+ShbNBDynnlwOqNRyDURSXXoV+H6VsuaFoK8GSyRRbqxcJMsIWcyyAS2O9otDM9LnrDfikw3duzfXwz0MYgsWTTFkmbJRXkhV/xjlrmSlMqI+OxxCjZI2ZMkk9Act7gsVIjvmTQ3HgBfRWX6narBIF6yw8moF7wOzvRfWRCAsMS7whR7qqBYo639UTriZmR8vSJiprJ2Dbeg8+kl87I7yQ3qI9NuYcRsDtIH1Vj+e+D3KazEySk6Q+h3XmCIP1r10ydKBPZsVu/umeW/kyglXzkoExkXl9oFh3viFBNZ40HMEkeiGcw30VXfpqsMRVj5ToIwnVv49ecsJEW89M6NVCpPqIsCz4DC6vFNOkxcovL0wdLuzyaUjGQQYN1moBFJCC+ntOPa/mqiXwCcrsr0NjUiFMNuD/PnFDbLwY7oaGtRU2c1FWTHsQajP21usvmTQNBk8WK89K15fCCcrP8aO6lMURHkWyAGxHHXjg6SnRDY7kiw+plItscT7I1drSHrvg66VY7FiWY7OCICsMXsK4dow6vP8U/SpDEnneEGaA6jjcBCHM72vojzwDTA3gnzPZlResyzkRuUBBsY41/IHGTrO1yVve0jNNngUW99pRq0lllmkW1QuppJz3IxI7EGdm9axgbNDgjwLXXJlDX/9ouBFu1gXYhhIOb5A+kXRUf3UQ+csJWBlw1pMAu+4Ur+EsqMqM4KKqjUzJLfCWFczhGyzOuF87pX0FgJwGnxUJNeqVn5S/AsKyaJrJJGZpba8eWKnFqeG9X2dThIyYjXicE/JNN+nAOX3uwte5Ahl1hbNJEh5zjnLciGCdGOPAmJfT6wQGVwVwFeE8VbET7Lir8k4x2LXnn3ERRndLvzH7awWWPjEqdqaeEMVfgEtAY+Fz4tLa7Mn7tdkh9FD/3R+WhvISRMgBJHBoaK+CepREflTEOzZM0DXAIfNP+d9xsSEXaU7K0OOEFJCeTYvOJpyjNcu+7Wif3Qh55/uoZ0QeXY43mbUmF6jkqejczWFhSAicG7uqVycvPN8sD42uYuQF1igN2B2esPVXetWf7+1KP88/b+ZoPMV8TFPt2HvQhCQKPvsa+tlLNpL14llre+tP4U3pd98vJeuEr0VIrGRYvx82dlAOJ2tKpwuLLYfWG1dWY+5yXW+xOfGDlbwl0x3zhc8TNoPgFoznYRbB5JfuVIL+kqw4EOGxs2WQXcgqZocR3fZUw8/yFcXstPcvyEU6owAICv/eB2fKfBnlquOdaiRhIsYF32XHmeBYdAa8bas9hdokJJavvHsTB++4W3AgvXT9LU5wGqFK/FqToscCYEo7W700cJ+5Ihsrpn2YPiY9MRCVK0sndcK0hl/8HDOwX1Ju2VV9y5RhjmuIoIUw15Aul5Hr7eGtrUaYx+kVOfRYfaWgF35tf0MXO9uKDPiVrpQ0vzh08naCfabYPJw54ve17ZRvXzOGQKyrfNW605JnNNpTezCELtevsoOSEY2yBkCkLnuX9FPvdVCVAMkv3wQgP697cZc6Ps3qn/g7/1D8HaWQXHHa+CGv3E5wruO7O0gp7ARdof2LAHCJ6LNoERrF2YxTkTNLbpJbYDTIRztsg0m9b8sQKmbrW6o+BqlbCyMf9eXJKl8l4JJmUcGoweiVVZYFDbf9c4vw5WAhIB0XQcDQb7ElxM4fAbQfzoP8hydYS5ZMkIQesTg0t4ax0Y+R3aw+eukjhtQMp7TX3kq5CCfWwhKSdWqAFv7FKl1OdWVdeOluKoeZyHLEn98IVCO2KPdFuLOsKWYt1nJN/Y887sXdihbl+cVS61yA000MFS7dCnr3U2h6l4ZXZUsVJ3cTuEzcU/TFAVHPIqsP78KEItRlll9R3nZwd2QptomYKSO5IFtkmJhyThhgRKlNkwae2q+OVSBnUPf7TRX+RBeffzXoXjvgHum9BLqiZFIV2YPgxBA7OGv+HBeCvcjL4NmERJDsutvzmRfMNuToUVPc3xmRiulF5/cYawRKgm0y7y5dc6do0WuJTntQbvf75gQZNAg8d3pt8gnUTJ7ZhgtATaDr7JRa3AjyG/4m4ywDaVKz7hOeCkxSmRZ7YPDatDFyjG8zUd90tKrDydpsg568L1712yxFWia9cpXka2tjUjOngTdmAA7e46ilbCKIvfpa9qtHk3Dsxg8uVPeKY+7YhUXYyqQYXJJttjr0Ynwfxxy8x8ZW4g2zA9u6Stlpr2JxvN1aKQ7wDuO/LlhsfMvIcNYaThvgX8RRbBvARfhBNaiZwkXGq1dAxz8VstdidUSn2DB0pPL1Vu0k2IH2xDeMeLEimlSALtpu3fDWpkqxhMxgLa9l3cq+em3A/hu0ZUWmjoaCdYJM2TPUqCKKPxfJTmK4VLhMXtpsCocjy2bL7qWOd8JKb8YxjU/XivbiQQGJFPu3mgfi8u0oa4PUlN3iC0m+YOlEXgF9a7LgGcSVDjgQwNC9bsHTkoyguze5UArbYyxAHqSudTNhB0NYBjPXeSxTE53NqyHdah7LHKXn58xBlPqZaj3/j65lzMeajsUpNMmaCUn0x4VcYiR6r2VDXmdluaoauMexv6iaerxKr5RcwtBKWEZB+PE1Ec8ElLwiFPr6wuPbpoz4WLvI0KMyhYsGiuZZbVLZSERinnetM7cn6fg4u2gy6mGQm+QTWo8yh3OszxxkGs8dLSFi3eEiBlSoQAerOXv3G6sEBD7wxs44Z3c3CoYdbR7HOJjjKDqCo8AnfIgYqrQ+0Wd1ix1X8fqCH63LsAdkssmA8zp/ZDnh/ujCPtwffj4fw2+poDoj98PXSsFXPNUMTC+NGQJsvrPbD5fiATDlQqtWeuSZwBJwdGIOZMEzEUDgGzgGBo08gXUscWIXb/z+ftyt+TJ0OY3OUflIEJZjuOkGKaZmVJTi/OPP01pB3HZwtnCPg1XgXL/y3Qixvih7nfh8QY1vfJ5LnS3EbzuoPmKXzu38HhIuHyYQLXZqaYCFCb+dmaN6ui6K68oezxnipl0VcCsJOVThX3UGx/cHkAJv04qXxIXdSgAisC0bHjmro2XsMFt2r0bPqf9IDD6e+28aq4fpJL21SyCrM+wSQeReFdBA/t2XJXm6I0rU9O6m7UbSM5zGKYYBwehAB2H3FjqicunUjPIwkerL+LKuDbrJdutu/mYs3H/6tNJvHnv/CLhk4VBYd2+1tWjwXl9NWLzzOKmjcf1bSoTvAgw4gIE2RN6azBRyMALrDCBmtYh4tK0QQpY8Ujwdy3ra5Sphd1eKLzPn3o+nxDcuUV6Z9z0DHqw0MhhGn45mZJSsbk/DYyifJac0bMlZWvxw8h8W0E1gHluCVORFJ+pAgMGkwLeGFtRqeC8NlISFtCy7pDdCqTtl1xTzchGueME9yZCA0FlebJBggABaocemsDGM8u9UPu0aFeuGFYB5RdrnJn95+D+rRxN1ALIdsiUraIUKKMrUaZjA8KKuUw4+0bSf/C0uXIsRJbtu7q1SPP3lfb+wgw9X2jwUnO0OLwAaD7hmJxKgW6jwlucewnYBXRk4zX6FTxMQbRGl85BW9cEkPluTFrdfTRsn0iM7dfZuw/u/tiDiw7WKs84Kx9Dnjas6v7VJykVpz865phX1AkjgswiEb1zol5fnKuNGMZl2gs07hkOPYAAipz7O82zhDoH9y9hLLvJKg7yLE/4f4ZP3SuxZGgVwVipYNfON8xX8QRYNaLICR11obiCuttfnRURok3InP9DuJBc6hrZ2ANg/ajnGQAG8kiSj3v27HbE07sj6NJy/2aI++NIyhKBSoHB/KloUDxa4ChhGxSEuFisAHLUMuSWjetjFEStNrRqmK+Usmcz7ZWkZf3jFbBTPedYyo/aBpyhhkAS55qmB46hNlZLqmxrY3F72P0NsypY+gK6xo2bTX1TCpNdRvRpNAj8pj3oosFn34oVbRefUSOrxRgBllPyzNsPNarHH8M7MxnE+T7eIlQEDWoy+bJDFAGh5IgEU2yYz+z6Uvv8jhzrvxkQSBUCO1KLwbTqpmyDyOdMih2E5e3yNKSo6AFkLqi/fjRwi9GzoY9NSJIDLyaPZWGmgDGTvWfV2fo7suhWFCPTT9+fER/hilj1ccx4DtV+ObMUS+p19T8JKk7gFK53DANnwidyxdvAZ3o50bN+154y9sd7ilp3ier3leDnEg/7AaAnnFc6bqeD7xin+cGem3XV4Cl+xcKykUwnhKx+8D1gSx8K8aHaynkU4AtCKSn/HVHS972FPrmwDRgXIgbm6VCupHQEuf6vQn26mFp/DFYzISqCVddvLxbv3rmjPo4Q503qGvFJZCXbFB7FsgwAPS9rnuHEMFGCPDMpvsGhD+4D4yoaluTNGENB2VU6gNVUBQilXzEyGvTmscvIw5rRyzzszfQCaW1nYUq1TUX6HudDDisqEYgRkzG9M0px66NsNzGPBiezPMFJMhQdv6qbW5afWwvaz1oz9aDwe4R0q3jQdSKtvmRnCBleirRv+kmFppXn7by4brjuJ6CHE6KnNz9ZIW6jappUYyZt6sKQWSX33NAsDc97c/RGsz0zFdnip5VK40p2JIyco5F0ANJmgWO3GJBUEJEjlt2PZBiDqY/lBLRtZvMGQap7P/BTj45L6yEKzI+v6BXWl1SF7YHbaNp/iw/SEgeJC3HHIprV/29L/7MVGuDSz7YpcJKHMQPq9WCBJEDiz/MWnC7miuVSh9N55VtSCbeqPZGD3YHSkPJjB0BRC/COZT+xgCPEQ8pE99VXS2g0tg4SPcA76Vs3Bx36BhdybPvzyD50P4WxSU5KwZu6SCVt3PteBkFef/qxN8CpMRPZhLGNWgMKNG31W1dOu4Ul7R/Yt9C/H4EXA9GYv/pUpw3mnOEk8HOlxqPBr0BOh8XjMsi7fAcKPFVKcYTuiicY0eZK1aK1/+uQcN2v86JOlEDa1e9DKoMGrwJ3HJn9ZSH6Lo09cwYm92sgPBS6e2FwLB5+BgcSdw1OGpohveHVCt/JPICT++fesEm96YMyU39SZtP7P1k2qUcnXcXVF89CEY4ZBSRe4+hesVdhkkwva8DX8YT8nDc/9oNHJzP7mp4ejvQ4wb9dckld6u45eFMwBxKPqjeK5/pxJFKOJGicXSgiKUncZr4gVqYGRpCPA1Msw8c3/+pDNxeyVV/IOhx/T1Aa8XOI+2NTI25Ap0HoCuTpmewj55wZZqWQFR55vqlnrSYXGSee1bXdPxkJcQsdDyqShbrdp576dhk1yvKQz8CBJNkDyLamK3+B+eziyfGgo1cLUyoebnscvzZOy6dvN3cv39xXk+wq0VFPGNCSTxoQqLJAFX2I2QFyrDFgz5CfngzbQKAmuMKbFmlcfWxYYgShjJ746fGZD1vCsVF0qbp7rgCEE2+WKYYRVo2tP6vEgE+TAha6CVeGlHMAR+LWIhMoCcpMc3Zzif/LCX2FvFJ1+Hr/in1hMX+vA7aZDMlFZ+GbRqgxnlNbhKxxFIHJfw82GdU5pvZxv7vLTrAt9L28TZDL65UrswCTFJlkGAvea5j3oey3SD2og3+ufjSrcR1VwsXuP9zn4H0XeJIgrt6B5P1JL3R3cwtZmWPPhXXJcBxBZL7fmZvrjzAD3sEflRV8dAjj5ngALsYfalZC5d2hpP6B9IVYyP9iLeEYkIvKYAY8luOYuN2LzQcEKGZNTzHYj0Jj/1zPVlbwmNLjZUd6OJULEjS0YCq7EoMuTm7Mf9QkjZe8BzCUMGwYUn4nCTqr6Jtv+CdAyIP1dGWXd22x8atdhARqIH5uZXZemxYO6/h3+devsCtn4WA75LRwTw8ui8w/pKFv9KmEZ7I1RHrqkHxRmlwTRpwrmocGInXxF9DCBMMs84oruL49qBGfwLDJASQNpsqmOH4VMgM4F2JQLCyQ3C6Ts1+j3Gsgi90h+jb9gE2TdbCyUvStTlyE++/h/hnQX41eimWt27XuvJ/mQWDn+XflmHV7y1xzpmwR0g6s+a5BJXvRAYz8g/EwOhuNgwtdH2tJ9c7NTmlT9MepmZbkboTalBt2xh1fI6bhlwFe72Yfey72KSvpLtrk7L81CA54uhLN9LKXmGY+TZqwBCdkaPnOKSg/1y2Sbe4RSW2ggTRPIzbimtBwZsaXeFByzcPxyJrW2bGCI2ktMyE7XwLeDWPUMKXou84wBq2fUq9gItCP2khPY31tZwEU2iZzVuLGVW+CLMS8Ux0uo+3yDwf1aUFbCkI5UyuwqmKjJnj+Or7tBxBH460nXrAXrNithmv4pXKhYTiB60XtYslltRY5bjvPEM84pOlC5aXR2VsVrudo8wRHZsGLes7T8T1SMpoYsaQnQQT8oAqifMTiqj906lS0ZG00+HTxGS1VfINfGv9o7zuDP5JF2dowvXhhm22LVHn0IUrceJ92MBPboruTC66dd+IbXw702LgzBXk6ZGrMMiG66WRCnfZ1GcJFlaYj6x9CM5Rlahkl0E0qrNT95+U30q0WdrIokQbYtaTWz1lT3+EFIIhbYj4UUAMaVrOm51SEq02UzF5ly0Iw2GbiBLtTKE9ThpjQwnawRIYfjHjL0RXaTVdfaQI07uOyPwOjXSaL14VTDsGWtjpYFP8/Un+smHnpfgzYyTGp+89u0r/WGFZ/fzm2ufNWo3VD6/1aBBb6IvUaDhgm0gByfkW1okRU6Tfhe8HLdnAFfIo11gEi4g1C5FkEKlUzBknZ+9wbLo2eJaDm2CRjWHsHkBKFVb5ZrZPsCWdSuaQH7GhiMgNQxdcNchl0NIvvcmVoZ+lSu0kUL+4q/rYy1hGOERQpT2Vmh4/iE0Bvt565wkbB5oXlqA5/NNKJoNTKSolhm5l8J9i3xBpQqUM7UtceSITSkqF5npTug1PJ+CB4PtGz3o+bpZ9XF7bttsv5cou8ARS857TLyUHCsNvAJmrKxkPloxjtrgXV7maYF34Qj0gq9Bn0Em3dXYeMUdjshecdzLHlwXXxi3fbjiiUYtSjSZkSRpqKjJr/no1X45CPwViohx4bbArfys1xlj4Fca/NCNPrSrcyE57HCdqun3c25GqBYtYwIQS5l/vdlAe85nVDu/54AAto3AVlJE6XFPi1CBIw12R0dhjoalTTG8Uz5Z24Ek9oDjFxT5EgqqvQH+tIhEkMXiGbgm9vYL31mlYGS2rLlWGZbCoi4k3pIRUfLiZ7kEsEi7A6G/VeEtXdd/917HZynKNoVyEkpucmGxtZetMm8DOGvySEXmP/9SAgn3QhCfquKV0bdW9IFrwN11wUYHgCfg0wMVwdj6Wwkm+5WIUJVZGV20PcgEa5QZNGwyN/Zj+9TTAQkMXBx1uBnqxHOzeVRm7iBchzYTYWz0fWLC5z2nIxpBrzgiSVVNSClEzppfeg1shGZ2rXWRFto6TZG0osG4OvrGC1MldC7MbzxQboJ/r4hh04IB4Y9DLR6+HVg2QHTQjhVta47At0EsRYsMssvSHe67FxSeL5g/wv+6NgMiB1nWtJh4Gj9GTtc3O+9bokAFlGjVJ28CMI18PnP6Ke1XCVlO5ZYUBaV8fMk84IH4K53VjkhReINfMDzKnVPO1NyQXUoY+Q0KwSMPOVJRYojX7lHH0We2aMsLSnCHQWOMWfAmD11CTGLF1N3cy3Iv6BJCkt9jLFY2JJ3FHCBmN1cx+lo263EVSqw/L7KZ1IaUAM50Fz/w5InSI5QU9UVPJnCg8LCZb2/CZWRif9s+ML2jdzB7e3+lBT+Ui6htOv9JOVZXgv92hNsmbdHaHhca/4LF8HyL5ixE/aWorzjeko+C4OCnk/GNESJtQxntGKO/SzPLKAtO6htksIAFNNxQCj94sg7k6s1zKGCOA4/xRhBxFn+NOSYIO1c18+IbVCDsX3b1X2Aw6vw3LEoaW1oxAiJVmGeIiuwWfV+JkSV4zfkvAIX0+um8jbm5q44ilHOhhcTZkhfldxTtJ6acYrqOWfkqDPxDsAVtf+OmdeMb5nuexLZxqBZGoaDf7rKIsVZAPzDVbSHnu6fb1/6AfoWRj8GMwTDfvROJSCqNSbGQcV3K0QK37nanZNiRMgW9vmmdTe+nHM07O0b6DWbxcq8K/n9fwl7QMbelgFUagF9V1QBoJS0UUi9L8hTH1L4k4wyawQ67StmN1lLcEy93oojz8+YzjRWFZzKt+mVRUMwA7GtyDfnFiKo1lVzg0FrHrmYv+Wh9ZgEXGMzw2FQ97Fu3mTCeJTr/qnlZxNp2xLo/cs5F5kod/Y/SMG/FUMuK5NJkzgd8NGLZ52CrfQ8CRMLfMCzK1jib02T0dZzNTF6tTgMkYksGF0/w9sv0GtgdSXM9+Adn56dmdTQsxVe59wTtadKPvjMkLajYsFSH7KBmbO3vWv5Bel/rN6psAEj7lD60ot/SL6LVjWgFhRdyzy//z4i016FFUib+OJvg74PoSftua45hM9Rq6HKeTpEYxYFxHm8Y/8R5lhIQLf7OPIphHhFGFAadawEUK30zEUA8fLd8Sbp2iwvxU3GJRpDxHodVEaeFt0PaG6xIXyj1zUu5yRYpQGl5mf0QQ/RrSHd1wVwDOv9elh2/PM8W+GnY1M/MMjRyyPMIpUQTdYTOC27dYEaRm/5Od5s7AWzsP/wqa+4I+5JKnIKLe2amNrXoLL5BytVHgfiVt2wA+9vDyHTSTE4emlb6xIXvgf9nu93gSN9Yzu1NWzxZIVgZPulK/uTRrvgTSazdC1goCvp2LYaIm0DovODQFfk685drjNYkZqPtqW5935qMpfK7npPmJ6AX38AdSRuLo6dv/Yp2nHCIvyFxfgbuVCUo8cdjg7cMLZOCYiNEdlp7mZNPHKXmimgr9eQ0KiQ0s8ZLtHHU12oxl62WerUqGXCF664ZZ6JnvSvkP4AhRrpzzjW4mYf8gYoiqmshhimLKEfFnk02wb9TaidAvIfqJOAt5RVIKVkB+w+ner2SDLcc7RPqDtWbxKj3dtnySQ0k21AxxJtCY5hOkfmQ+mKs9va/uFCTUoaTzuGhS7w7y8XhfORCq4NKzGQiQq8klCCZxcmRPxSlfmQOez/qyQ5Zt/2aSwuCgI7etC04rOVnkDmoeKxaMgwxkUROT7aEDWAEBSm4C+2wNuNF8vwnNy+2UlWQSZudLNJPfyqxUE2A6zJG9zHzgvIyCTr4fOc7Qu+A/zdTVJvhtd+3c1ANSHkh15t6dp/MEDKQvYmvp/80/VJ9IfXwrNAGPlXWFoiabQA5GKQEO1XaWaxDwrkyt+hMtTVTnGr9CwGsi48yatGVRpZahxE/2f6xOR2ugsmA2aU7sMqM7c2J2EhitSIWJXtDMN6TAoY+5kgzEW+OVEabQMC1vJoQg2k3AfrdNgDybmormhtJpIz60vJ7zqK51H/eRsWNQURBcBJ88g/6Me/vyspbqBxcszfStIh4mo77b/USle9LMPrtG84EkH9xur00JvHQeveZynSm88mHvsQY4/R9toHDWD4EG2YXyYPNpHCrIhN5lbz2Ilb7q7D7is2D2b0nG3vHze32JFoHrtBSo+E2AKIQgg58HOU+cqCPCFMeAvo1o41tavAogysLTPZNzayW9VVZphPm5RsSfHLTtLqBCx926L/25zkgSLblmRzjXjaUiZdifTR+X6URQ9FMB3Eas6fzZXx3q61iwwliyTZIm6PnOj7++ClzMdvKQKcI98e/xxe2WjRmu3gC/3Ieshi01vie6blqTOLdCH7/TrDUGtk+lop5ie4yW0rsKRfZB9Ax9lG1P1WbNblHH0NLXHk6Xvcva1EhBYTK/upqByezA2VXAnP+UDPglt4gexIfmGv7UXIQdKAVs3gG5Bh9h078ijMmoN8YADvQwFZsiqomIuqgoIAmRL3EzjSScTLi7Es2afp+rhfcJwAU/4OYrGn3dASvUu6/HQIj/6kDf9yV1UogWRaYyKm1MW6Pq9arnBFjcKjP8J1O1/e7+TzLtLBOhbztu7lkOzJyXO9KhCVdCfSMkwsdHKcXiA7BOd3c1LQtHxJHVAquCgDha/JRgb6QRJToqJMFzZ9Pu1XHE3fvQKvMqiJ6ampH32yrs+3lohVxYLYeRvFAa3iILPuBBoA97wFL75o/jtI86/L13TUI/wXMGj79vO31lxFPWbLwZIoAfxUcGPbdZHYz4qVW4/RNAYGyl9Xii2JmC1xV0gqvj4+n5Lpex5EAj1F8sPMvDsUC5oyt0hWinDo1MTJgPLXN8+Numdv1i26R40tuHnUVcnqqvqYhNbjrQ/jK87nkUDUax8UnZ1eLxa5k+wZSEyZ/DM/nL0+5oP9oVTZyGthnpIe3j1bQkmM9cyw9vb2suAqMUuxuLRYDivoG+em/+JSKKVPOZrSyU4dwzLu8bHupmzybNAqh16a07hlCsvKbyTO/DMvaHAixTwp5oBj5bQuVZuFWzDin/b0z+W1KURzsznR5krWPNf7s6jZKXD6kzU2fwAGzVLfxxdNLRzsa4L9kD94SDZ3hU85AEg79phMM8ItTAgv9BjpRXUtGE9H7zmhsTXZNI6YXzBrtGLWK3HlBLjQwJ5/7B499tDMu1D7nIYIo335FK9vmJmgEEvFyamyaMnAV4T9Rqs5A0odpHpTNw4/+Z9tjSEVffdBlpJpOJmfJMlovrtIr5NH0pdVNr6ru04BEw2DBxpD/mm/N1ZTPKLe4xcN1os6HTjLzBipltauGc/U8hM3JwwvQZ12mHWk2xqcJvZMOq4OqW5sJO1xFGILW/bmhVUZNpMA+xGvphspihlJbSRHPnXwW8dTVKFPNFVQ0vDlikBK1dnvOQb+b0dQDurS9GX6V4gUQd7PEVySOq1RKJi+2wRPodos/9DsvsiKjzuapS+1GoZ1ZOWNG4SWCm/B4w7Mjcg7sv0a/o2d3LJwhJpTkIpui/+xOI+5WyG5Go6MrmVeCgRmbpk5qmk0odofy/D8gQNnLAVkhNeSA3dSFuc0p1aEfpGv4H56HTww4C3NaBRKzd7VNvamMSdDm9ocjevV2pT6pOI5oQ36VGNA5Kb+u2etMVKcTsAMQ0K1lUa0KrSsqv5///9AFL2p014gL3lXvyADbHVzVMoWQ4XbLzp9ipHl4GXzaKNTL6wPRHUJyQDXeQzU7YOaee+p8J6/F5s1dCwgVTeLCoPY/X8m5kEwvM/ciRstbrR8iM0B8xRQmlQcJNYscxyNwFEZXaEiwSzjWL+lRy9635p/9FU1XUx7XyHpteZczcVxiIB9cbbOsHVmNefbl4sX9ZEsdfNB9owa2T6vFGF4yS3uQEehN1rlim9UifynOLmuHz/sAU54ohanii0jrXBI0W9az1TqcGKs66/AC8wzoFgiQdzMGBTnsUuDueSsCjTLeiGfaoZBDGsdsr67ypuEsAkQ/EGhT9PUC/UTkHQiZy9ZNgip+/EXHSlrkMB+OCsGNIqQswE/0+FCLs8qnbRlrUoVqUSePoqHr6SFW6sJy6+ISOXmyT3yoFMIY6GCahbSMZA87JVcbwjcBrMyA+TL7KQzwmQJZRHSZcqSftHsFHID2fwWnGyPI8++6VJ8j21/QKoQEkcenSmB2ItD/gan1W6qc932JBldCFaC7eLMJ93h2FNNeOe2dzRF83jC360hvBUz1JKWibEbijdP1wkbyIzPYCQuoL3BsCaYrEIwJh9LMTA+ap+2A35QA1/s1J0miySy7VX1gMX7xt+mKjal1x1k2VIMXprm+gCZrGJB+c7dSEM8r+ZBtlINtah6Nt2oBy2kJDOhLc6OrTrNtjvvIY3MdtBDLzr5XBvfcb8KntMCtEah7AWt/mWcOk5OEmbTmT8Jl/uEe9UNZk0R8rYnNELrWVn6DJfMg33rvMvieLB6ym3a6FcwVx49mvjoFIb+tB3McYy3D+wl8UzexWyxJxZhiMfL45jye3RvAe+gT1kqjlHwCViXZIxvBZv7R2fW4qZhbRgt67xWSYbTHVFMC6aOQYMFWju51zIF3wmsdO7hOUfvLFTPqz6SuDTeGFwDXejKF9GpwAuoyb5tB0+/dhpyixuM767X3qrenY8PjXRUZbI89FzbMJ/LyH/JDsZDD0LYdEKLlONqkNL52tyOtFdQP663Eg5L+8vKS2CKHoKA4etjSpKyWEhgfVfq06ZKZ69FAfZxQbX7+UJe0/Tane5kL/pfoaP/fAjn87ysGHJ4DGhbFXJhmobJ3wiVfNWOBeXm/mLSHheMQMTtCaVXFccKKwhpqcjO3cVz0HOCGfb0+YFcEvxa/LqM9u1a1zo2rX+i83YzFvjT/fLQDW9aETrShiA9IycEXYtETLeeKXgajQ+3FiZRS/SViup6xZWXGZeuJQhumKJbjeg7WMkxiCDQ5TKOBIgFe4rz7/pX1OdZiQ3NZPU7sXmblzQHtURMus3IAI11oHEgNIUcUb6ZWSNFK4kubOhNhQdRHlTAQQFDK6WhgCID8i5Kf0YT/pG6kpDg7fRB+Sqj9S2LhuZ4t5SzQopgbgHCFw85XF9Oe+WNsfeGSfsrbdubGsmGEEC3B0fveaySePc/OWN42JLyTR+gbonOK2hRAhxyzZn0/3tZdWzwEZpjcqVRkbMuiWJM/3BSIr3rrLrzK6Y41Dpui/6acBmDrvNmbUW+wM7LOyjNAMKdQxCkt/XDACbuTtTdIAvI7J41hpjz7SLWH6DZwK2emcWELUToUn/jJTzOSB0FtPRFXQxLOkLmyCUg9G1is4cvB5pYiXbhXLUB9Ea5+wLC78G975qUS0I4b/RE2w9wDZd5AitbYgDFXb9bRzkeIodZ8sBLytlosbtnJaJIHk4xUiC5ou8j1xL7T9GUA7kP2/sik/BBzuehnsmRrtQ9zzymxTSSRFbGItUmPN5UFOTVxynjBXmQ239xmMQaj6DReUYu7Zti6OjzcSmU0boYy1vqefPS3FT/qYxwhdOJ9a39J/6Kgy33+yemnAIUODgR797kEH2PmlipJ4XusO1zCcSFjjOdCTv6XdXClXZio3LB34oVfecz0+UhoAV2eH/9r5KYvQPg0weBGLEuUkQoZrB6u0xNCtyRFKJFcM9Vu2QMnQ6sFQE1g58mFtsS0Apf2Nvd8EtY0S/zAAD51h24YnYMkfqIEiweg/jcBQaOrCLRZ7+9++Iv9DQOkQIm2t6uq9dzmBhNKZ+Z2V72f7mGFvz1edVGP1pMTKLHubpY+4S7ho6dYwcsCSJ7LfzIvDpMSnTSzKioOMs6MoRyfaVWHKxPjst63SErFu07Kn3cX9LvxK80s1sTKs31RWrA8NOo4+m/15vILsp4JehuPrtkaQ6OlOqwVFZoMyeGB2AjjbSUbT5Nl13y/3JYNgAheRO3LV9uf7vFG9x9XvV16cSajTWG3kdJu+XS9AvjWKPkpnN5+KuXcyMcPDMmv6/OV7wPYeGOv/5DUO/gmko9KQc06aTrggOkBkBnLnl/4UIwWZBRdWUjOj9dTEzpISLIS881/VWrU6ABOfD9wTK0zkg4M7K5Bi9Lk6Yt67Aa3BQA4UKpDV+4HwOKnfLd7N4Xg5L9vF3sOvGuwaTuueUZhz7ur8v4EDRrHxzfMu44ZlHit6Hbedb5CCaaXPLiqG3mm78yfqe0f04CaO3dNNuaDFeCCPayIKXNsClklz+FvkFw1EDxFwJLHJ759N+xeWB40pH2yLrW44JTuNEhIRiM4ujIwUxS8GW8M4Aml6kCV5DCK5ksy1OCYafu0tQ1BZYkx3dQdpWD0FbMFkIYlXJdILHQO5j7A2mwiX6ysVJN44BDN6x/AqmtgpMzWW2zOOZkG/8l6igiY+/zasvIAlWt+L87ShMVqnUhgzaNYwykm2zFHndtZnc1Exk/j3/S/3gF64ecyn6sDF6g93r14G9VzFAmZCaKuqAX2/Sl4EBMWd/AbQXyibVKI+oktuu4CKwrDUHJqbVAdopb8WLOb1mQys/hpxc3b/fx3HoQqKfqjKSXlV49GkO0wNOlXOxqXOdP1zlfK+/k3ZBFe31XQs3gwjqZZv600UK++u1o6MGWSAbwxeW5PbfEgn3vKNamoyDgTLeS3e/xOnTzMHrK0YUoWgEXkHfdE+Ll6RPX1BnSpGSRM4p5v19Qx2HXIU+esNI5ZhgQ7JhwIzTHjMdhRQNN6WMW98Lt2A1iuXkayWaSuZpqLkskJ1heraIedCW5mjInsJX+dG/ZcIFNoBTVGzE7labj0hq6zIXDd9DaMw7STNCfT1LEegRDr2EKaR3AAs78GBIac+YAhDZlpd0CwOiviPpnFCO0B31p0f8tN9p6Y5ngNFv3YhowgDyR1/uTD/iseidManzKMZA4wGVih0Wye803Sn1Uy5rj6VygU6U934fFqrWnwAIa93+YNsFxfsqQTPop8N+YZjQDJ657FdBWDVgMY6I4KcFMIju8lwArZ5SzKnhXJi7XozQ/Bi84BeWkpmZTqoQck9Xm8el0xCgUiYQdG8aBKjzaSf87SAbpnGJOHm2uyHGsIeUl1W84APK/0MUGXVAiWVNS5r70ZBC0ybruC++Rfmcd3on+rZ3I2+xkJ2r1ZbcOcoLScUz/Rz27MsEwqofBwtIYRtuDTgDRVlj2tC/ttgTaLf5bUYStgTnSktmCX9GVt/307h8WhmxHLKTd4/GaGfwzqr/rpKw4CY7jjp1lCyx2r81qUPZrq69SMm04O6OsnuCfas1ohW0uRWrAuYFhaMSQF4xKYc8fHd0lIKrr1kaoMj2jgJZbONvTP9HDOtM9MTPbiAkmxg5IT59Rbn1UP9FslHugISatvwbXokW+IJ6nsGZPzjcKiJpIrXXPOv5X0X7I3yjHXBKBUqhraigqHg09KEH049LcC/tT3m8LGIcW8J9u39+Z2LkQGRv8q4tzhoT0iK4nvm8sZESjv9rFjNxHCCsKscRy8sFMZGJ5ggUffc7rfv0umIMKUoFy6HRPn/m+hBi+cIl8RX6Q91KDHucS1gjDHLvAO+AoJX3n5pD4oNGzCcL3zXJzBOK/PjDqe5Z2hHEZZFqlbdY9ecu3Nlg0R7L4RJZIpvXLDVP3OZ2L6BNppIPdPU7Z+Q02H3FiEGKB+otHgdQsjYayLldcZf7hulUjhH3VvtjChx9Rz3kN0lpPTjSFX77HejTfcVvSdrc3IAN4se8IFIWOC/yOJR0bbgBt2IZSEEUznTTpJGBXM5w6fqYB3z0+diN43JN1hIuk/1X4eK3n1cTfQ8gPWdMyISmuBnzqOJmpDfpn0UUVV+wQcGR+F2f3DIKtWSzM1JJz0AH3lVQndVPQ1PejW4Kl4x1NOthoQT+ijGpeZrbRQcRWVjp0Qvkt/n4ovWWy558vylh1kCjyYJOgd7xPi33FqSomqmuaD6Y1D3xGv6TQHx2SnyTcJeC2XxDg62i88wNdg4hYKYQkraE5d3rJb8gGw1R3k9vbu5jeH9wT73xR12sigJnHfSf82G49Yg4ikOdf7YyhFegEW4AN9ulF6y9r3mIk6sjEMQg0eI8pEj59+hOKNRWuaJ7SQlY7wArbnWprMzBleJ+xyJ45imM1MlFprti/Dq6sjZQvmu/6bOuN+4o8N3Sv7Hkf71l/eBLNkZOPds2r+RXYJcwyrJRu8bZLpBXn2xKBIoZauz2nUG+ArGya8pPgiHv/OtEgW+SBErxm286Hp57y+3HpsZfBzR5oj8VifVjYu1QZjba6QKawMW/tZIdUHn1VighFW09MGi7iPSKhcv00NiRm1IwBm+bB/GMAaihJG0EfJ2yu9x9yJIADcgQjnK23wWf6U8xs528iz0Z6d34/xwSeySwgMm7f/0qg7QVH4OUmT1LZY0pZmCmUv+Wafd1ukVvk+ULkli7+mCFukb77vs+P7nmgbBWKtpAJe1gStlpn8nGlSztitdwJz+SYli8tx1Gt3KC7Ct8Io/WrS8Xf9PMU1/LaLrZJmx46SqosmqPs459ysHmPdyUuT8g/AbMuyNXi4194gyeP7Jy9LzTJAMZ36wCQjSoFwo8txGl6aT6obf++AG/Zh5fV5diCvdp0RLLA4lMOLB/7n6XgUWsR3fyf0EYMw/U3Zed/kqnMj4nHjQ+FhIC8WHCqWNfOAm8fV/aknpnkfCRsLvp5r33e7Er5/MTUiUQ0/joCZZxRa4KuwhKq7JDmT4uueI4z72CVV6zBVUsVd5l59D05o+/441tPR9RJ7pOGMMl5rVljUQoXISrewHyn4Oa5xR1xyvEkZ8UIEzWBisHC1uD0J+0D/xwZgCFPBc3lolcd8myXdw0uZv8Y2DdwFaDGJB/4Qer7M0UxlrICTqQ3fK+amGAcH03oHgVpjsx711CkgwU5K7E2iOPZoFxvVVMfwAOf6L7E+uSkAcTIATOJI8C8MnZLSk1DC5ExgMAJptGKTftFaZ3d8bP8iAwAbLze7gC9/c/eU7VFp4LHRGZzQTS1KyKt8AWeILhUH/KFzMJJnZaRuqI80JJxvfm9km1iUm3VQQY9Ihaw82GxDrA9heOqsVzet1BZtKX+NgQwK6uzHR3zhiPaKkbaFMqbAqZ0m2HG2lgXcLjcQkHzpyZ99aE51OWNUY+tFdCnUnAg9LxgUY2MLEVW8UycmwPn1T8dXpW16NXsHDPmUDmazoz6tDMTobeUo1XxhLj5fHZjSs992knswOm7ng6MfXpVHxihc45SSRVOBkBpiJF7dg4Q9Xf1COxutpqPk3fuRSWfxuvvu2eL9aA4YhMR5hsOd7jecsoPik15NwpKQqWLA4f342co0tu4YXU4Uff0R1t0D17C35EL66CvoUY76BAO/CDONCMD3Ccfyb2MvhRw0q7iXnpWm0XTwfgZReWhVb1kKbFl/SV+dQOE4xZSNL+ILmQPeQGNOYG3MaudalfmIfGEhg+NDApovaExpWnH3K5bhiAlzbZUpXZcL5ezf/abrcD1FhAUctf/dLDI0mBPkZRj32mP1+gBC+gp1k38AcH7Go2eF7osNs8OyaOQ7/ENUw0v2l3Sc/lKk8eTGidSTfmqI1htUorRO49NEY8nOdR/3lpFwfmeOcypKL/slOmLI1ziBQjch2lhD+HrR9ag1auGlnfy2BKwHVHYozQ7b7HvUz9EAv3bPBHfmr0VTojyjbFRSQS0meaydgr3/DHVnDTSCwOTGhwqgvmgQtMXdB7O5p/yfcPAwVRCXTPj5XmTyb4Il9cRX8OjQIttrwwxs8d0/i/m1PKvjEdEZ3JQ750laOfUPC4ORhRL1iGd9A+c1xGq/D956nFf/rxMd3Cf2d07XZkjHfwdFJvmOhu3yzXpT84l35/mA+ZJBz6x05Zmyd2HzcAD5DkNvuikVQz8sb9gkjPOAd1m+/+pHFXhbGYCrsIWiwa8lmGkqKXeHnbEV0knPkk6CLdeyn7P6y62LrGtGMz+pIEAZqwKptkDlmQcvlwVIILPlv5scnZVS5Sahp/1sGQgfXLWn7ETTiYa0OLcuUC+9l4Z4Bl7EKB9RYrINpUxRrgtIlarJueRNJS0VaDBjMT1VhPPLV+WWEkp4nVH1FxhScB2P314bessAkGF+BQLmK/YL9Cmw5c29Nuney7c0dmh9x8Itli4AOOMrVah7cKMhpBemCR6VIEIE/DY2Qv3QzICGaFmVXzhMF6ealZMwmxJ8jyOmfX+tP8n0PWqfsWtGb9hZtVaRCtmWx9pkLLScU5rlZ5q0ucdMH1Z73UkYLNIYkCgAHicCqJEBOTB7vGiKBGZLiJ69+rO3r1q5n4LaXFTP/Hsz/uNbWnLrzZXWqdaR/WY5WwL0l+7wHJS7EFTaMYWiUFEro3U9Rw+F+8ck2bfS+rvHuE6VU2gTWvb/YP54g4SHQxP688q3IdwIYW//TcDhN1tVq4vbkChiR/6f/1qFOrVw+aTE7J0FATMmGSnj+N4iIyseBFDFnHNgVO14fzAyXyNSRxOZy0lLz6Am3myT4+7g0sQ+P6SHVA8Yr7iOzsz6j7Y1jW+6hJ3y9W02aMFCMDDPRmGHQAw0CRtifCTgaBaSb4MayprwU0C3wSaShGRNVuNrMfdamZ0pcmE77UMekARi87bQ10n1nLqRefoMkt0MdueJF/6rOt5Qwyoo34ethOTPJ9aWVgVa1IQoI2arqbCa35ISiCVg/QT7PgRP0L1YHGXENlgtsSWCw6pSJGBvKCnDx3TgWX4MCqXJScT7qDQDZFNOK3gpqlMJMU1G75t1rLMWfEbJzvWcKtK8A/BgYQObQQ/ZctYdYMowkII1ZDS6MbYcNRidAll0EWOuqYRT6OdTBDbdPYWGOk1Wn/hh8uzkmkVJwtuNC+UCoQDgkgxysTwJFuqjJ6S7NkRANBxIPi2+PYpJj5HFp7A8iMDJfDhZJtS4XvwO0nP+5Bo+k36ddgYZBN1p4ZLSyG7YKzdBiHLdKGyvoOVq0P/5Fa8N6r8T2h22hMak7a5Bt2F/b5Hzx6bDiLenAI3TG7XnW/C4DZa80kKElWL955VCMxLKPdM+/FDW22KZjTfMzhkR8xDqElxR21Tf63SucHlzgcmE6do9a86+ZqWZ9hRgEU1q+nLny9yIIGgIxnKmy67kjjCjOmiSVi5s2XYwZKh+b4zr7XSTxb8Snu2tHXfCz6pqxRNQczYWpmYQdJKWJ7jBH6KvIMIxh0x2rbJZFnsfrPWxzmIcl1KV+OyQ0Q9SYaCavUiY9PRq2JpfpiMH9x8e/SZmVIMNjcHau/B44kjUkbG66FgFs4/Lz8R8aDlNOtqSMr01amhikGfCwgM9zWQUFfiF705W2w94132Ccz1DkiLoGnfu7teSJ0GM1q765BrowD4JeFAw8uQ0MS/0YerotUv/aTkLJ/EpAcPpRIH2A9mjbgQjVbfOhIH71JEu8iGp9fihNlCzVHR+1hzRvWk61enOccvjp7xebpSjr6oEfrcnCzIrkRcrCEdxt0Fs1NxBGYfcT2xb8Lw10aG0q7TX0LGZVJ0BSTfxm63GFhy7JLfAy1PU922+3nG1vnS7didcgTAZ7+EuXB2WgQhCrsTkF51ynGDn886NKKHQvkpZ+zQAr9M5C9t4DrakXHDqhBMofZAhWCAlL+DoG18XoUHupWG7CWjHpyM0iWTbE4PQPmBxq3f1J3QeEb7OlQ/pTw2PGyLER+ROoC81GzpXRYIYOzWwU7/nCDSnyeUsG/du9ObAblAKdN7ry0rKLFWMEBw9JorEnD1iOj8NhpJ7o2ihevi641RmUE9n58gqjNy83FtY8qcj3TNLqt3fRyZgHBqzcjBBkl8cXl1lGMw3hNn10FwCrJ/m4/vQAsFf6NMMKuP46R/zvg0ojVPVJ+IsT/6PmHaKVWijbyeNpTP35lwJFt3UMK4usB05Gd4r4UPQmRe551yqjJxKJT2Hnsy5Atptds8T56zZ6g82iBdruh/N7LlAvVsCTn+wAeYYoNynsiCfGWAajlrERA/rtqUw4EWgzgcXuOfi/zCtpttsEb/C+5A1IqGrklj7e0HJqohnEMq3tezBQKIrI2rVkXhKe3VrcMUQy62VX4AYh3VlkfP+WUUbK13wW8G4gAJ+tPBcugNvvsmTBWTLJS/1Y7d2Eq3xb3oh0xUWlgRcmjpq20wLoE+iufOR5ObbpH+TeERkeVZd9ir3n8cfl6/bxBIF2u3sxBtuI06kJHgCisR1bSW1fiIkI4UvbfapJcicC3CAsQ693bTfnS8yGXsl/YNMvSC8fSyMVXaHAHZkk+EZX9AbroDQcZHS+z60Zw8Wf8SLMV1fXzQhCdmJvH57hy2WzpPVqg4hdB9SOUB7QUUh3wrJ4INhYj0pKHmHA3JqmIR5FfiFmqJ0/AdeKl+6137rGiEr6St6hWzT96z2ydlZgVsvtJeV/UOXtBeCy4YIBAQoqWmZ+jVa4qhNAvMpQ0+sQnUW1j+ZiJMSKc1TttbmtFnWmxjsFD6bMayEhJJ7Z4bs02cfVyZlVPESmNCJAQH7FnaYOOfBeHIkPK3l2TPJUGPGt3hY5rJPS8OC4GNYIQ7JTnp9HhNNadQz4yB/TGnsVXsM9I4PrfAKU8xU3jtPbBkkyYUizC1qGPlELSYHZK0N4HJe+zVFnoEXkmFXpTDvCKAENV0AzR1DxswmqTmt0CClANh4NpC2h1XR4h3WBl200DOiNERtqzEebFwMR7pmrP/BYMS5vNmClxRjUQVkxb2LRvEuXs/hMXfDvW3EgPxtJXkEp48jwWFkyvABOzLad+iWRe/KpxPpBz2WXMKt8Y9AzeChMqsu8NEIrNzlYa1qn0x1ztnLiodPzvuwXykW2a6s/I9OaPYUbdsHM1zVREKQHR3s/SM2HFJ1Qo9y44nfW5wIuY0nrfUJT9Fe+61lBbCwLKbxafE8RimA9Qvz/4NyWkD3oB5E6u/f5x87lDzMa8NPjLXPNesdI2OJplgLmE3T5Iri6yGm4vWnlxyIMzziJM1oE76ZQ6ikj2Spqn78zttg0YXdy6WHDTIQBlHumimoV/0js4z1b2mouneP88XcXkAKrfEJt5Bj1ykhLrRYgsI0KZynC19Fc9uS1ZCWO2QEI1XzRkBwyk4gzvHyRZA1RdD5tHh4QDBsjnU4Tmhj/NnoJA5M1tU7Qh+JaaqAaCnoqzuKjMAkShBLK+gy2eMbjkqj6e2lCWaXZzUt37LsvCI3MJcxa/XuBiD+QPRVc4C2cAQ7SL1wv2y4qshp+iB7QP1hSBqNV+lmXwYuN14JaPBi+HJ80rjmvhieurGA42IdB259hPi/cQnh4QdqPdBwsJQqWBdslCUz+ZQbSvdSHb7pB61v1thHDMNta/rcfXFgGN0gRVTZ2bKIrlx69kqyGG67lpCUpst7hUYemYkEoKAf1EEbZt0EeZVfP/Ak2wnhylrc8u2gXHfM7wwiMxMpN6AfOCjyplAOiob5sgBOeMeG8TGTN+rTTet6nsWwM15uwbQmHFhF4rcrok5f1qJ0Q/gtOIwjMWaCEtwLepebr6awokajomYuoCmst30fY8aaoDQz5BMsY+Dbq9Q4ombRvReimtWQahwKylkQTvOWGLPkQPnRkJBfGMqxkAJAbDXikBBxr8yDLLTOWnHgnDagZBzsTe6XmjmTfOPxrLf0K75chaZYtHb/ZQas9gBPrfAf6FfSWVRbYDNuv9K+nWBzEFR1IxUOiF4Vsb/45S460Q9tiIflv65OQy8p4qrkbPUjCsD6H8L13i09pvKsCgcT5ec55qNc06lU2BLoRHVnTdDsT4XbWDqpXBkj/aeqJ62mLFLfXJ6k7obeFhUaB/CkjrPtRXzxEMd43uzj2xL8DCwA8xWH758r1w7y2PeUC1k/3hmUMWW3MO6Nt1HudK9rjBW7XWH9GWfuYPKygsrPypu3lkcnFOcw31s+m3ZSeeda6q/YK3VYJDd2GHGjbKCIWegANMIBSp1aWRAHTUnIDO7Pa3adCXT0q2T6jZTenM2Wab2NwM7HkF/A5mHsBr9KfE2H+jlWBQB8kmavWGvey3YdcG31Y5a1VAPalxnACy1x3hjyc88dIyeXB/eUyfW4AZrw+oIkfw5dEdEmpyZk0M8LOPW96jIQifcReRlkOhBn/Mnehdq0u+Hc0jrkvDKFFnTuiXL/69/hYcjJNOt5iUfRUHNMqjdI2mogJJXovk9yOI5+MIwhw2GXRTyXN52YHa3DXJG7NJacJQ1MLIpPxM7TYDBh6Og/y1ItRv0FnRh1a7fbhtu8jH0XOngRX7h9mawXDz+xHQ1u72y+bXhlLZGrIfZf1I7QWqQ626p0L/wlPBkJUWDjLpxN3jN67TjdGOf90Lp6ETMt+aL7SRNLOnRpDehEDSniXjGvgxH8zxHgyY8CfeWYgZVu0gDNkaldOfTs1ZiOHT01eIkMmoqJ3qAcK+qZkutQMTwHWytbdkiKffAEU1+shJ9kjs4y6BDDSXjQskW0sQo1eI3r2Cx23v8MDR/NtptGGApmObWsUdd2obphPIiL5xHJUVlktCqkf01kI19zkhNa4RZSgOTGY5FypouGtjS+QHvmJ0qTHQ34vq61GlFsk/BYMo6RgAEPaGRKduTN1jr0niRwnPrCkhjTVqIwxYVCOPoqCNqUN75HCeTe8IK1NzY1msDBMSnca91/R+st+SFyxGcdFRXnhPXWPKoR1kqfGUPP/Fh5+EoNSVD+IAuKvA2n4oLNKwGXt5IqfHIEMZxUUpRWes3o1j0hwWQGH2xUoaPB0QwR3Cvqpjmkqb9/ouCdPzT5grWvE4ojyHNx5V/uSSSWvq9IFeBBQp7qU/WG1i5lPLfQM/Sr/QAiNlEeOn0Ps4yZkyGnd0PUS5VyyNCIPgHud2JKvhxlMJFIN7o8fEZtzD5wCWNTx7B5OCJ6EB/TyxMVKln9pF77Yjulo6EiZH/4zmsKHkq1gHGoATtqthJ5drypGgO2Ac7FzPDcHJ6yk10QogkzQFhpT0kNc8I1EN3QYT144+3nCo8rkq610Z22z/+wjqpacwACZ5ec2d0bDgE4G06vnjXDhoa2DKnNgeLWayE5h9NT5IEBxI3vJi3BMxlJFS74UsUHGdav/5tfR/qfOk5aSg0nC+DLoOFF6NbALOuDbWgxSc7zifYoM5TfYYE7cho7YHw0QauZnrYYgHGKWKPVbOlToHi7kyeMEdjDBY17rqYzKa4botHBBeDkb2+o1QF4h3Z31/vJRqct9J5y/uufKahPP3ky70JgtBKUBePbT5o3Z2dYb15rYec08YK0DEuIzk0BTPHzatFGhggxpteLTwtalTI0+b0BoDpvTq+rLUmPBfmuBOAJ/Xu137hcT2c6hGmsHmqn7tFtFMaqMSb+2rxjOGsN3nXlaxLbCZprKi831245HcEOBJ06OQVd1dmunNTjV+ixWDdZperxUZvaxgyvRpyqlj0x7o6aLc7QujHzHfEXYCq2NPMUU2uPLe9z0YFF8C9fpFq+zRreJgEN9wTDzHQhwOsicwrnvCUcodDtmG5VAn/1ooeTA9b1eixUuZr8BrV5xIMO2mnqX13Eky7WhxFQzKmgZudNANv6uvmJ0AF1skgF2Kg7RS4XINhrlI6tWOkuI9ZNMZ2M/8jf6RMJUKEdo66oopIrGeHT6Ulyat8j0gzDg7Vge0K45AxV27+7XvjRM5Bdrx1zp1yf43CfVStoaa2MI48gXaurAdcE7R2m+uYGSE5E7VLiG+e2RAR/cfvw29kiXpWj+8Ow2TlbNHLeQCCpOB5ijB58VoJTzyObVkAtIYvkOylyxiFYJ3nr/ak9zv8ntYobEFo6Cl050bRNgB9nT7SYTk9mPnjM8z8QIav+/pXSkfq83TvCxwOQroRvygIuUQqaEanTBksa2k3g85U35+ddHPKOTsKBqil2LdDe+rQFe0BqBcHqLHITfbWiHYniQSekbzv3scQ3ISoLaiinlC52yI/TlO9TwXk1+QCoE9rPwtlwj0pSrhQO7zc+xL6C/JQxvdvl2how+HDCVYHeoYsGrNBoe8Y2vqLIkP6hm/ScO2U0ERxDOYv2dOCgi/u5r7iFqzWY46lyvTpdsKx8QmD52Sg5fwnPVBRozON0zmkibiDjmVcdNMT1v4B2lZJHOOwSQKT9bcwSAEbCtY0xK/54g+rmUvSxWG3D5naNC1UBjppj2iIRg3PkGARLMroR5Qjtc57y7m7tgJlfRBp99LfdW0hHXYN8s+yxrYo5KO71IeHlx0k8wUKmWJaB3/WlVNn21b4l9Rso17nQNTBDRJQh4E2yJIvc6NaiRxNDPllxI0PMBUHORukFeqwNZxKRVNaABol7Ne5/vXCWsk6O2oxmDRDES+lAkK5Ibje9DiOJ4AtRpIHXAEKrQEviOVRjIOnPMO4E48zNekSgN9odNzsgONBvRCuQwIyh977MXrA4I4/ZylGZ9zDoMm8uE/hAd1xQCHOhRhB/Dqdiwj3UMZDtoy+eTE6tY/a6QT72ikDX7QRKNZDgZxdLPsCf/NSVpgxTAiYpi9ORGDvadtJQrNB5VvW0PoxyN9lW8t70zRewVwoNsXclQk2UbnN1xBSX2yF7nmifAUaAy126TQKiSub8CC+R2AciGgTOLdkazwBLumNOJDRJsEfU5WaKChMbROYapZkHhTyXZJo/9TXpBQq+Tg9VLEvprsTVN+NS+6jKmvzv2DYoz+N8nKapwAPyluYPpnvgcakYqwdZGIhvtg9zHrMdt4Bo/C6W1wzCdv/T6TEOEnJ3rlB22AdF/7X5jM6mHCxUdgvQRFXmdniTsCHQ4QpW6JpxhOFX/RgTx4DJbBAoIvBBKEhYu+i0BvvJHxkmkLHu4vTlwSx+hJCZKOJhkPFWEGRmKQoUHK3YVebtLmoZ1Lno8codbL7r2ZZssvh330ftFCRs7wW5EKBXFJAvZyBn0cW5LmcObKx23Mlnetlynq23wi7dabOccZI6LVaHksu7zPSaJG8GKvvraDkAW58jtLezgqof6gU0JMhyFbqH6Dvh2dncXHHxwnouMifs6vfYY9Ba66ecY4PPTFMGJUF8cHX6fmOrUp8tGRK0EGJFN+r3Au0iaki9XjQ1vO+R+BoIuJD0xssimhCKNo9Gt1W01hute9oci7q22nzRi8dSDirlLxqRmkICpm0Oqp7vf4q5TaExNlkbOh+PIdUE0J1NscPeNPcUX/JD5Cwn5dcoatdfFeDRTXsQ9MapEYj52/ZBVBXU2KBP1w48c4wfCSmSyKbSSU31rDYcrLzy8kfGSVBTsXa/HfRE454Z6Kg+PTlwdhzjKl7BW5Ubjvxa2wJJXwTqpPj8nTRlrDorB1B8ChWGbd9VVbtsyUB/KJej8gvyYO5S8xO9XbxKkVgAYdo0GxcfOpCyNThchZ+edLk3njxfIaGNqO8ZAdC9hJbpJDFWWExiIzDfAnvxoTEo4wPBY9ioCySsy5Mghz0pz+M93iYNvEFRytdS69aOQ2Njb0M9JxS+8w4prwICWnGAap5IivrNL4/y0tRAm8k2tvgJxzHfOb7vKpSBD8NkExoIr9PlMhptNPvUmozBttUCDNTIHd/AaMaxhVUG3Qov0aASfzNF5JPlJ6trnRPar+ebNMJVSIUlmro++ScH8JR/KR85GR/qb3joWTP0jwlArAYB+HzafEKLJsq/opUGyFRcIjqjpmugMjdCwXFSc51iw+VppoeKxM5Yc+NEfi7/hsPJ0Omy1peHpmCHGRDocAisKlgPK5g0n6f21bkjOY9Phju3xhEXG+ZX+OD+1ZZ3ngaTYDdTF+K9rPzkwZfqYnNesPjFym0uLxXaTg4X1cljNLkTNnGkdHjfHvNdRwm56oWuaOHlnuSBhw56fkE65r5fYn29Qr1fote8FWYaF4Np4e+tP2syFj92mBBhAgbZEH6U14xhMrZXmplUJIUJh7i1Di+OE6kyVFB1ZG+5KOMH5WpLKi2i1vzy3w0aZMSc3QTLqoeJMD9S4S2VKtWfZd0TJdnfXSvn/MMUPQvU1gN8z8V+NJYnipkUiEZNLPjocRhn4TVkl6QFfuO2CShi8x0kAaMpGjkdltWhjTeUiqdPuNh0hJbd+WM9HZXmx60uxl/RXTR4EJ1oCK3V5Lk+/00ToquyZu8Q+bPOlLIS9KbFBFsjGsuGbhOpMgPkpozp97oU7+/gfy67p6zNbuYyUbYRqD7fk7WzEafqYfWx2PWjzHy3DL+j2T09WRzreFAimfy2Rodltfi+F7EPKHPMS3aCaONrNLDLs1mUjPiWbmjv1wHw2C6s5kvm+mBtyP2nVzCrpKW7+ZvYdmEiUhNNm/IUHD99CFSCULndn6/bKLp6KRN6tQ+rny+5kmYXD3pSPSrWgJ1kB6pLFuqfK2l3XkqjCOWlU/ZZ+yi4a4uMtJX60bkq81AkG5mCRFp+tSuI7+QfNVxqy0V0bJ3oatuMhBLIkH9E7HRBHeDVz+J7n1bqVxC7KS/K4cibgUENaV+nfiWQg9+U2u7XzfXXFT85zbsLirgtosQBN+6tHpknm5IP5vzoBlvgRBq45J5oes/Zoh7BwFbkYn8DBw1NmUMAYUKGzAc/gCx2vos1JMffeFqidBlcxm1bB3297EHNoCwZqN55Ou6pQ6Y0mddCfGKQdvrVyA2nMsiq6MgaXuRcP7zauugXBum4nJtAE35v+HFn97GIn4hmZqPEUL91i9I5VzsuS7bOfbYDPxsT6GNLJOUb5V4UEwaf9mwwQuquVVw0p+h4AGb7hSfoB3pKwTgRqIxp/Tuo/sYo4pV+kWWlCEpl9C0IHsBcdmCsPVX1SXW17w4UPvmEgXgBlSUH39HHv4v4nV3pB+6b0hr5GLUPfTMv9wDm8rtxOmXPSmHfgkkMVxQuMH2FwwTbA0xjApFy2y9lgmsHQP14uO2nbRZsV0h2i2kr6R5SvaNMCJhvfecxtki1+87R7NMdtgvZyZqWGgi/BnHbC0vhBc/AgNNlSiHertTwzEQE9Hg3Q4hAMJqL5lwE1vYi2oKPYHCSJvEpxFDudMC4MC53TnoxsCxLXgwvzfUM/KaFmlvne0KIgdYM4Yea7J0yE8Zn5I5nl8+lIiIUqtl9IEMvGEP+5EC2imwXBU6Yo/l5uiFdkNMgiQTg5eBPHCFYGAoTlAfEtmRJ0FH8msJ7ydezRrTXFsnQIKK1uBOIZULN6Lpf0oteqn3Ob26/uzJ1MCi7IzT/q7gmLKMYGwTuA7x9O/9iCUfPGDTBSvDwEtPDaoMPGyfdFdzWCVyNQqC1VnNXw07HoQe3WSUq/nvQ96zcNqJp+Jcie9M7ux0QsYGZ2X2k9Ih84CseiFycxhuziVe2/cFvdq5DBj5ELsD0BOyhDp78evXkxqjNLEQWZsni7wlUpGUTdlmfhHBD1IAYddDP9xed7IhlGZLPRdrvBPPqxMRjaP35vXyfp87ZwcbrXW8VFMKtDRYLddJeYk3rnS3upU+rSbTRhSbKcwMvMlPZYpuYJUtvRjLYqC2yco+QDQEtPIqYvGWziszjHfyoa+KSdEIf5vVb5MJJrufqfMycnytZi3G6J6upd8StdBhm+vqM/KnSMlq8K6dwQBLhHq8oWIiCkZVgIV/Zc+ou6K+MAzkw9Oo6AOYnmVgXhPM6oz7EGWhz5EAsLUs65f6LfBXD9Ju5nZyFJq3z0nQHT3MyEly83s63Lwdazl52xRO0sqdKJLaHzI29xdpYb9N+NnQV/dP05jhX5tIjia9Eeiphb9MpsuizfQ+bWN/BxWMXnLJprjpn/Q5gifLL1CG1mu3sNhPJWtE7BUgMuTFR9IpuSe+RfSK3/ISE8NNKkR3Ybw3n8SkW3Py28dmFc4oz2+6O753jZqTD6TKmn7kuhfPneazOavrRKJJebafvMkaAQROEdP34lKgf5N5Yyky0eykL3YkFyGPz08IbiyLyJz/uJJqGfR72mT17ITfC+MkSBZuN7SexrS6qZd4duoJRbGr73UWfbB/S6gi9WBFNYGZJtiJxm/du1kDXW74pvBm1E/G0RWAvxrjPffUWLfA+P9NOalsgAW/JuI4wML8Ewr1Ysuhatd/4sHLebR15J8J/Ba/X5StQ33SkeNaaGtyyr90rec+KD2lzc4ZkUJ+uAMsy2qp8b80KidkPfr4GrZpyNgZEs34/Uujkpuj/+D3WsfVzedwJCJLYtqnY4i0WegVV9BKcFu/st5XXAjm1oplBJ2FUkNN3ugP8F+qXlzjK+st0bSLeB1plyGQfNkQl1vDXpZntAklHcrQgCnJULSCYhMf860JSSEq9hKolZZOcI76/VDuCNVleWJMAAxk3cPNsJKXLMl18eNm1n30USXQmancmTnLjgqYZefU8IEtHA76L9PEg5BMuhdqNsOwVZdDjQyWMawbm4o9jq5aD/400ljLBls3WqxUoTnouSOgN/7gZPNgtCV1HHIghXoPwxsW1APlq0xgsSFmfPJLlD2D/hMHcU/f8+9yW81G+45YXz8aKRQre1Xd5XInpWSfgcGff+HFxRQkuS+giKejaBu5w+T9jH820W9QbSgJVW9DAsfpXOj9goMdqlfzVPrkZ/Zi/b6i8FVBA9fBH2PN2eaiCPG3OTsMVYyivnvDEMdSvQGCcZeNse1cxjRfzDcnGOyW/93iS16yGUQIZAnWOaAeA12PMUxoa3BDTTRxu/Hdc0DJyCDW18yn10+IBT0e+h5+bLdhkQNhWu/Ub4ScFge2+5LtbXZ6OmcJytFIgLwqilKEQVj2WcUwmHmxdfUMCjdeEW+91PXjgFbKQyjF9GJMCDvROSqy1ZzSRtt+IFvxcSQJIYTuKopap7kWGRyx9aH2aIiQHHGVsf5eVoGtgspOdSu7pmDuiXTQGfq3xTKRxWFUhyUSpixKX7HuV4JicWzv1FMQVMv4oq9BkOYxHNJp0VPSsksdNJ1yqmjqkb6lGSSLq5BGFfDtxae47XkyMZXeUkHuqsU/IMgiQMUpyGQGYdjhFTfHphNikbmhUspAAudNJkSIL72Og6de3bKsXqoJ5u1TL3K+lNbmpBgXMlsddiAQ6dlxAkq3HbH8mA5RGS6rlwSojUaXjd3HSwkGf+sXpYj/leb7f7/NkWGB7o5X4RmGy8o5oUAUMpCDubvJ/JPiJfD9ZuEraiocifS4/O84skPfXHOxRrQONEfCtmZtVznwddZGpSCxXZLZn5l/ehQuQ6+d5YQzWKzdbz7LVnl6+2p29TnJEiLqMwX9BlTySktdauV0G15l6p9Wmr5wuD/sPJXrFoIIzgNocLv039/PvkS6Q6P4Yd0jMA77bP+ayg1JK2iKuT73xuRuMUhrHwNpSmyNCA+H5GdK+0D2BAMeZaGXemFraKjtq6kkZr2n1+4lQbNGowlXmFRJWhykCLOTu/5Yc1sxGylNZ5iE/EKd6IBbZK2lvxq7xQVA8+xxbaxF+KA6URNjwzoTt623lGumz7xHtvpG+b0JMjZfl6cg32WjCcH/Tw7mdtiV51p01EZzue3aAR6T1leBIE3WHdIs1z1l9irofAH/fqNnPRiNbd4JcTXJ2KtNARHAvTnsmThXh391oGfCioRfKGd5UWlfRGSiUy7Rkc+LxkMyG2e7IW8kpy1HjsNYT2rpN0Td9kBtn9Js6MS3Mhr4E7hvcfP1vebaWbG7ue5hW9FJJfY2u/ELUAJ9H3lJbaXMUDHmvuCI4Il5SrLLirNaeYe8QabQT9BGjwDl7iQYA2nfwBwxUMxQ/GAy5QecO1SboMdmDpPjWeNj9UcFe7w0OqvLukLNdR0Ugit3rVlw2ddHBbgUaa4dYA2v26q7j6P1h3hCJVc3AdMVk6vwvMDygK9M3p5NXpBlVorlcr2YOs7wU9J72yMgGAF89DIwKV/rSDQasS2iEweaXB+obFBbuuofhy7EWlljBXXNC38A3XhfpbWocw0lO9tsG93wX1GRg3vpp6S23Gbw2fcWbQ98WTSGw1gmR4r6uXgPsmYBKG961Pespfd802vBONdy3yr7y8sO57T8Uor/GWu0KGt+q6+lwj0F8NxXqToyZTCJZquXXhzV2Ns+/QSwYRqMLFiQGHt9TQBs0wyg2sy4Jx+c/RbVo19040VhFQtYvOXgSTISdr8p6LUt3l+H1ljAQp4tifbXKA5Z0snZUcwaiSKSCZYz3UnksOI80rotN1HSR7TINNqKXKV4KtGuSvx/9G5xZZbVTSrN7R8nMTHNyk1q4rhob3Uk3vrOQHFfyxi0jigOx3X3CoSgGcRBeONtdzd0Lk4zb8GGd2jwT9vD1xzFQVbf7qF/LktFJh5AY2h06H0cR2a0PAGlkCB3FcMAcabDqHuS+aMAxHvVSI4gpUWcioRPbI52zl56yZONkHzNBlHBp5GhOUOrHCP5HaHmVd0fITfKlCgA1U2X0ZKMibe0J8oVfGryC4P+qOXfJzi6qE9o+uJn3n7EtJG74xaEcm6QyU76loCSGBNMNJrAmWsrAQNdecdphjxH8T+boEFk7pQveuWgUjJdx20vBhsGYw9bf8ARd2cGpnLf5Ouz0IVHQx7p1CSHRrhgOx+kE38DMRYgNp7Uu76ZGieiqBy/6hFZljqbFu2QNlkQyLQKLqgAOvs/bYtpjMkA7GMbItHEylwXb/2B0ZTXE49FEY17HOYEkOhEQlBV4tSniwi8SPRDxymEoVuRWbhrrLyvB0IKM2w8wlhzCpwtHyKtFoQpJQ6hzmNbepeQgdFpcxGtI0JnoL9GmS+f7pgrMsufSfGRg3t+s3FtPHwcwVFhCmJF8RxvNkjcZk1RbCjZMKhZmc06KOjmFp9Vl9OG/+Qps4hObVv25Yx2z5HBDuEdxzOqrJz6+OUZ6gvRL5sO4CtXrNxz6950q/tuhHh/qZ8naYjeVcwDIbMxBET9+pCfGq3yaqXbs7mhhuzGMccC/Ofoye3BbTz7fhPcYGwPLRXFxj9oXGXscJ7FyGFIB5F9Ymud1pvm0l8l8yklMG7ky/wZYbJnMcHitPkG4DGFgPSVCBC8vTocbNNxpLv6lzEhWDn38RwWjxPmbgL7KgYv2/L9YC+Ev8FT4hq3dyFj7W9QtznE0kjg2mFDyDZPJDgxN72ypaHwuk1klOehRUY8eASHPQX7CSIrCUFoCx9HpVammmROeClc3YJ4Dgc1G4n6kv3J1IT13bvSAyIP7LcR0hMu7MJyAM5QFPrNdvFxagfcvVW5HOGctGw6YjkHcJkeX7Wn41WbqacqKoX/DIueh1vK3pkqGJNr+oDNFmf38sFQmWJ+iZ8GGw1eLs70MXNu5usZLnLpY+jCZ3T866t1FSAgEOGnROAbDEKl4wv+SoQl/pi5JHnjDFB7xLQcQg9hJYkieuQhkZJzAYbDRB3a1Mr5VvnkL467szEiIAnloPFzmpK1oinUDKa0i5bA4hngPCGt0lkyPuqmwxFBrnpPPPR65yOclqhAgD01i7ArcJtcOHvquKW8b3FXEsO/rsQoK6EwNnQ6lGnTg1VFa9UdwyFd362cCRmzbair4Aiv/vUe/wHkziXxEW/rIXsmFASzluHIerqKezDiaT9aLTRBWZMZrccVFuZOIZAg0Il1Z1+yLvXFFJmed4gBzpVD+R4hlvUeu7ke1bXVwC3UICsyDWKqUN1ti/fFLQHySG5VHidCPpcxhV6JXGPsAX49xTW5MyrkR09QjQQwD+Pk0a2dhf02nm589WIzrhx3BmRgjkgQ38tPMVci1Yaam6vEG9ef6S24TBLb2zvbVeW/W8K9yJSmKvWTeVfSd45B/Rx7i37grx+NgedgseXl8CbtHJYFpS/1+p+HOJjea73MUrY7Z/NKfkJA7fDRa7D5Ibjh8eVVaraZQKun2dcc2KRxQjt/oDpgjpGSKxWS3o5lGiaFaKIkjKytAOhTAbj//htJwW25FsKCvYIpC9vKTMzy/EX+tlhlPOciXM4pOsMN1UGxjkdMjK3U/T2ZdgUHOkBnHZPeCM3nCJLQWCMrbG8iaX0CdP/A6Q1GAgw4l+vqiqXIeEri214X8MMqeUmsD88tcjrSEQGXLKgNd3a274xgMm9I4MZKNmgq1wNsS6E3jEnSyDDNbmYNh9/6qM0FolTFvOhDGvPMRVvwolHnRNejmlvXmFkaE3GIw0zg2Hn3xXDQ2bxwnxZjzI1xP38PITmAC1uBNPDDsuoknzPHceLP2Oka/QlmBRnZj3HBlPm3+mZ/t+NlTIjptywZFZVdpqb9MAl1H5+t7HmZI6nc4dVuay3+We8No/WlVTTd+Zf6RsGMn2apWtTi4jKDcxwOGplFJ9Fp9e8tYTM/a39Jvp2rNcvk9zErUFWY2mdOauxKd2IEOAU866dlu1KH/iMnCdr7NIp9xnVgs0J1PhXUMXjc/Ni4QaLK7u8YRGYt6QP/k3KWOOHCVsyv7SNaATLYhZylPnjO8qdWNaTmcaXk8WG82VAowbp6IHdSQWlAOKUm5TIYxuv2tlWp82CCziq4BKuxbD2RDtmCKuE7vAYYpUi9aJxpM1DEqxwSyko0hbcayLqIkzgevFfb6Xu5hpNmUZZn3Ln6BikPy2rof0+AbepgAWrEMdlGUfhWjICsepybx3m+62eG0Ad6MH/bLSBp2L/ucir+LtOk8cw2KTWG08cMDWmEBvGFtK5PJOOFXuPFCuphFIM5Hg+OnGGGkUD5D+VDYG7jTTpoQRgonJ45kgFPSr9UsNEKY4dbX/DLUxq44EORplZHHQT7Upo3tBhJXAAMbfTbqJoW+KReWemHpI5Rf9pA5fqGi0yq0f2DgbXdlJCHrSmby5MERNwCNZvy6JZMnPw6OKIXaTg79EUI/0IWSi2dzmp3ybsuXBloTK8eagcKKzwrWYLz9EsoFxeBDmLrDdNyPyXlb4oyxEoRiIxI4K7kk/qRYksKBt9SMmSr5p223czZWNPfmICOKqAbyKqe+aSJ0vGmmSnYVuWUrrhXUKJgN877KHzyC8ZlkKPrEomlyJhg87WEEnn7t9JJOvTBrxNRHaOgav7I2X9m9JaMYOhW4EzOFo8KR7LZeEuEeAWiWVjWb2+XMQ8V62cH02KnXL4DAbVdVZdvhroLOfDckDVrsgeCJFyn0/A8Bmq2qhyQwbPni/m05WbLeDHVVgaAmWHfeBF5jSvcHPHbr3iSr53KoH34NuQGXZDOQPMsAA0eeip2znN2PT91JYjeILqBq/2GvzVunyX2ncRk0+2yeS9Ag+gvaY8F2MEn5ttaMoAQHnWz45OvcddXAsSytFSPbU7UyC8FqJ9LSIr+bPpX65Jm5Xl7PAYJV4elpvVi/wrCxDA6Nc1B3ieBr7naUN1FfqHGYc2GqQ7SrOLVVi/mBMFRAK38EE5DEXHlV8Xbkv7tFjU5IwKHSQE4HwAWCbs1RuNcpmx0HjlFI8qQbDKQPU+ftXOU6k2cmpAZqwGvkgF7EcnFMcGTxv6akmHN3cP1J14vRO3Mp/vjzlOJGe4yqZKteRmuoa/pBsPthJ82o9B+aGmU2/64Pl+ZCqwxnyundgIapyp/tmzBRu4oucGmloGCQAFOOvaDYI6f0A4wGyzOb43BArKgmAhJgPw27A3waVPnfa8BDhZgfJJnfTN1Nw4xPp2E5qFFyU0m995ucDa34U8Jak3O6HfXDswgC3yHckhKRPczGrtrzthh7ei7ZkKVhIuGfx5BXbIC+EcPeCEZIv4GeyVd6fVIuObkYDCk8QiuNvdVhEW535Wil4NFVYkfn42FdhaQyWFuda/gcbGd8kbO/LD1j659l2fGpUVy9esSGg0fRo6YqRTanmdKbllY4IXstcNRmYkQ99TugTdSng84rzAy+umNI8SO8MA7ZdNxFrTEUEg/vqkHjhnIVgvTwJ6EM/RhdQqxgAgzdELGgocrCy2qdPiQcwHhTGb1oqiWJCoystboSXKcdFxVsVa8zAspTe1JGbJ3kCRm4g5vXtyKirAUsdpPhrABLZ+eiPk+M62n5fOgsgtfIlCO/3GVnZEQY8Ua9PzeNLiGhff5D41QwRgKt71OsUtzDnDk/a7RzR2WB7X2JqLNL8h/1xkt5fjYjOn1TQvg8Q2invL10vbdEZaDLlYN3UpWmrVv0/1CLriX8CbKl0SSwrBRD6WLZmJciz3e+9WjbIUYQgY3ScIiBwl1wNFsET8fIlPGWm2uOifRyznz8EIDWvFQikxpIpfz+2Q/DUMcmy8+ikc6aNahGncHehevuW/bYKCWmhd689/uPFc3EVjhO9vfPzCNH3LO2YjyywyQoGFxJUrWfx5uRn9CDR1hJ35CyU9uZjc3TBgSGMT/Z/qm3BlIHoGH+SDOb3u02ScsxGmVlY4ivYdGlfswFTI8v+uotUkmKbUeZcAMgmjZMQXKLbhpRbHt2zGYWXSiqr+qzAGMtMRSCX3JQ6ShuwPTADITNYR9IID04f2/fKgemc9Q3mz7l28zHiaKjcHf6uYB70DbpwS7fZPxhIhunreV5nLrgGvNi6UCU6HWLpIHGiIIUtZtErVBw3Ud9vQy7XYCytVZFVUkyQHF6iiut3c01JsxShftk17NU39hO5t4Cwh5ip6lt9n/tV8JlHavS06PAVjsPvT51trZyUvX5Zbtx9zGT4oSprB8jv7ra2oaclnFb8dOkJFR4CRqcNFCUeb7MaoLSKRk/5VaQ7yhXM67Na+fbJoovX65sVU3hbq10OqOpF/NpGpnj/xnNfoW+sGkJbknFly726SvKO5nEa4g5PWI8sCiW28NR53+xIG3DSWp20cjbTSQeFIvjt/7UlSizUX6pRLfrnc5aRafMq9wAW7MpO1wHLAGLcWpXO5+AbaO+gWbCUX155CiNU1s+tB0XYry1ka+plxMfmE3+YM9DIFyNa2f9bSlVICqTx9QIYCiWLNvbJS5beHrwSsfXtmnGYlgDB0MZHKfBOEQsfMS7vAwSmuliXiNS0ejH0cvTsEaCZUrr1Fq+8Nh+yVQ67JdmHqI2qyC68AK+bk3aZKmc9aVuqK813EhBiZKEUf0f04bFUG+5HPiLPjGKugD7GM/ifK4V1Ux0XiZjWQHCIhZ6elQYdFMg+b4CbV8V3MAxjAcbpOSMdvjBtFLGSlyY5QeRSPJSOSxImnXN9/Bxkzag27O/dMKsYawz0H0bC5BswML2Pyt5iBQ0zB5Imja7nbWDB+YYj/MhiBMb3mcZkCFVzOJCh80roPOgtg3Xio/Eg3qMEnobUM9UtmkaabgN3n30tGnrf4Sw4bM/BuKLW+iGZgXOpVSo1bP1m4kIveOC2XN7pbTj6mN2HL1xtIA4IuugiwEOOC6kjqaJ6uG0vmyobqiuKY1XMWxDpoxZjKNC66DaKzYXE3gJO9rVGft3s/usPcqaWQm7liGEP2GlcT0MKVCEaESlDemVd5d94WK9CS5hWN3RKrYoqwEbYZfJ8LJedj8HLNaWjdSohaxBky6O0SI2z0DL3nbjg1zQJDcbEFv1YAnJ3njKj5Mejuq5yToW/mO6EyDuEB1RPEUarItNJcWkTpIvOxnX4CM+idOXLG1vFFolw1HsrJUiZ1gBhIj5BeFRsAi8nsbPTmnzWosSFfFlHXi8zwFWQ71u7UVHW/LUCotv5ls8Rq58oGTvulPTMeukaFe8myWMa/kiFqpvoJ9AwoE/rrpwa33ZlvvLpTCBkJtkQQ+RHlbKd0nepQAmFYYurg6XdeRFvLe0+aM1KO54XP4q2fyBZDy1x3RAB4rZt6VwAmUGs1Iar35y7/ChyDpangsAJQXU2qrSY49l14YtBw644ULAHLy9hYmUw9sfleG8W44IRLz74n8cdMUvEfMmSUsZI/Q+T96yg+lKKDhaPeYqMRn2n8UUOfzpcXOytT3IN5eajzuEv3v4U4d+p0i65yt4XU/yKwUfKWfxNgxb+PvGKDw8klJ7NmHWqn0iQJe7dVMCwSCsLEYYqD3436u5sHe7c4qGiNM5RCG02hFNUyVRz2z238ST3MVTadvb6vLqh+zwVLCvPDQMCI8/AlM9VmM+CHAkTQbAL4Z8Cj+AWVKvtAE1IaShJKRqVXpGxr9pi0hpgviF4seQ+rOXxAhZ0VtJB4oxzy0jWlKARGnP0lhEHJpWd058sqzZZ5LYIqxBtRzCG9vbSh1ra/95gJfIvkX0TWytQ2j6vCaWV2+FV0/lrNwFQLWXoa4jGFSccFS246rDBDkLXuSkCnLFYzjyj/56cPvZz06s6BVz+ZzVoBZfsDWQKxmGQot+8KaSNjHh2lDxSG04/NlfwN/kxIPowG4UIhbprhk3lGxPA1Wn9KmMkjnrM+5ERTADb2YYwmX9bkpDtgm8iqwGaUq/39qVs09prYSXsIP14rRxkw3zhNN1ebOfyDawB7s/ldU0oSnka9mw3UBUfYtrmQCQdW4FNROm5LfmJ78akDIhV+s5dDS/k91mSoSbNrsFpF1jSYPvBydGSeu0nkETkyM4XiFlY4ovzISH1JUuxXxcl5UaUMDofrMGb24k75N486obYM9fCcyyHoLIfIZHkP8cQhwwLiYX55lrHTFWsWBumM4G4lty3YOxKrUYZ4Zpf/zbhFm+Zj32CE/B1ImG8qPB4yAa2+6BGwMCfY8qqdCVp38Vft9CdxQyVoi98pTKU2vXNW3psXw0D1UipYStIq3JxiEhQT2AMsotVlRRFt4H2lG8Q4zABalkdpHKWKfTDORQCt48weatLREQjeNx4HvxgJ8X9WcVFoi1Z9s5WeakqQnclbL7ZG3xb6zBtVmBqo5FA+b4mWkz4rtqwu/kdaGDTsOulv6FFKnU0kp3gJ7Efyn1FLBGH74MqLKnUXRD6va4zjYqx8QB6q9NveBnTVAqBOKpKL1hayAthrH+4OrGX+sGCLWVJkb8KBYPv1r8Sudb82xLql6N79EyLHg4iZPvqDSX7/jo0VV93hdpKZ8ccHdBWaaEu9gnvuRq2y+f0JrIdp5qFpzWMvd9/tPJKAqO4l51RlLvjJ4nsfjO9EXFWqXnVwe6DXI8p8ixotSqVJxRB72O3qxVzZtKgyEq08yU8fQl295l0/CI11n/c3nUZq5JXbc3TErohNtGoJi1KLPtVENkS+WHc8Tlb1Ph61fh4T3/k7Uf4d7JbBJEf72PogbPBAf9NGe7AvOYzZHgxgPm0PSP9/rUJRN8I5ISTOUsrKMYo8ArLvQ38H9al20kraBP0uVeB/sXqbbvc2yqzb7D6GrbCWm6mhCwjYWlIskuEi8G/9lConfNxwKel7WRJO4ZchB0icMJg44TM+9p9JfHwq9GPJK6q2WjG5kC1wO6k3Q2oDUSuNsRCcHihTItgPyps58M2ZGQFYMIwHJ4H34K3YTuuZZVlAsXlyGU8/qu0ph+RZnxkduW25s8l7Gq2vJzzIGuN+5BrMuox3Ebejx/EA/ZB8L6assaToPt0M4A5hwqYn7yF6FxVCUo2Uw3AYzdNoPHm1gJzmv7l7ko/54vzixnQsljXYnu61ndH3RWonYpTkRwska1+NNu97yVGVYAKsMJVeXjYpeP2Tt0t+pegN7KaZryT/R3XaD+aWVlpy6ttJqXM6wU8gtG7XL8lrXNVpB9H7PThIu3yOHsNpSvUU3Srif4i302NXUWbxyGMW+2j/gFiU4h9COT/i46lCAD5j7CLUp0sz2GvneDy9Z9dV3ZYZvuwf7gUS/1tVkGUyWvUo3V92SAMZjkJl4tV+NAvlFkdzIL+NG+ZLKjMQ8xz+cFGMYSClaomllODPQK4X1145atUoktuxU+WwOBeHg/vYQeyJf2sjRwTEDOcJlWVG1D4eqDNjlyPoPzrxXUOE9HJaPW2KZT4YusJkOP2j7Yjv82d1f8m60tzqa4K1HrswpSGbC8zjX+xugW4WgnqzaaE80VA6c29ElqdyUhAmi6XZVQA7/TgEEEgVej7poiW8oFKq6AJHp13s9FP0XvEmbmzgslNGY7/AEFRJ5BeGeTOhEtwZO8Kx9gAk0DCMbr3IIRhGKZx0FhM9zX/+vAF6gXPaM32l0MJs2Q5iGTWq3GyjcDxTGopNi6jxq6hXmWHdfkmtiiuPgBZOwUlE9HF2rgrfT1sQgc+iSUEstlT1vm+No110vAO86BO9fYiq3lYukpOtP98zPd7F0hKaHd04tgGPK9EiW2BDyUQV/4LWCba5viVVzrfUNeAlDYU3lTZ0VG+K4m5OI+iS5goCsUjfMjayrMjmOJf5KT4dmRjYzPvMm2oQTA94/xRoGBbP6lJjX5pRitquHAtaZ4Bnubb7Pe3vNOGKV3/4eQy787+k8hoOp95c8YWretj9S/go33wV3gFFWvhXYHaygEuWZGpQzDsrBnBsz5wgYK4TVi4ceDn6RHX+ru3XmUGn1ZGV9hMSfDwfnAU9xOxwi7oc+4/xVhCUZv9CB6CloAj0+RrA7gmmdeh9A7Zf5+awwjQW70OCyYxL/o5+6v0w4FuUTQ36jaB+h7bsAgTRPMoh+k2h2XRGq3RTOgnL95T+z1VoWQgmn5CnXxAgfaplJJYxg8bJZ8uDvQ/KtW74JCiPrufkEjEbrABpCc0VpjQIR2SYLc2d34HifcBtCwgxwhcehdoEbzvH9+x2Tt6YS1WqHd65BnDjQt9fsx3N3/qYmaLzMAeuaHHvxTvCvguJsevIGsOvkPSL7txmPyEHpVJ+Nj6G+i1BbWkc+72YyFCHgvFti0yQmA5Vq4z7za1gLypr6D9ljiwk/Pr+zDMwM9R8/6BcKQDPgthFqN3z7wBxlmxlnRsOBGaBI4cBcjKuG1E1nf48C2r6rrCn+Q64P9+2tLWKQQlqLcbccxH/dwcbMBtVP6GpxRFNuKvWPwxvTBZgH239sTyOf2lnFixVYsuq7g6/b1X7ome55Wjs4bL+DYQnba+GhZLLVyfPZQa9er0YKwnusrRBStU2mljd6bpe/0cRl3biBgiNBhr0sL4z1ZEMrNSBJgV6jOMA3j94yS9M0UQzo2sY3ggZxC6L7dM0uqU1/vASK43HGKECbnLwOcSuf4O+WO5BoNI8Nnq1nKi/2Dk7sa/X5KmB8jk4BGeixgnfJ/kieKK0Wd65/qRuMlDWOHBHcxvqZE2kuYFbdlOg2ZkxWvlbkGx7JFXiQ4jNRLbeeK0FNTWaOmunFPWbH1/ojI/8NVu+ZPw6cXoOEE1BjTTYCa/nmnk6IZj9NbvW4hg1U6Cog3pYasgRjQq/hvnAO958xTHt+5F/Uo1y1TwRS/2raafKj8gLkd++ssuXta4MWyMYtQWpxl/Ekdg3jBHLCOVMh4ZJ/hm7Dlp7zeoEniH0vOo8hsTprkYoxO5ZrbHlfzht2RbcHDh0k748BT3nC9ZHWbR4WTeZCJ2nN9AMWKuOjncSSkX7XtvBrNWjjOROMx3n9OFLlGqumJtVUs2DVPYddd95Q56U0tZjhKSBVjn2zoSlyiKer05vqbTv/kiEz/DjkZdMzHU9BietfeYtQ2tOzINzpyL7u1sYClYMwUAC77QCjzEZ9hhbF22jwIYKGc+NqzrYUcafAQEom5iuzqr2mKbiRrp8ODxqAo1ZU0ocxVsCuVAnL3XhCQEXd6IJ9y+b/wLt818QNS6vewib54NqVIw3UARKzBq3vvOud82HZiCD6ZZ2yzz2jtxH6m9uTe1LgzOsniccuWcDoIEeCb0yRDQ+EfesK1hzdrIsG80lXr7lG6zc1UV7jdOS0Gc+c3N2ArX5i+KjaSTEI41tD8XqPbanpLFCpfc/BOqppiNWTyFsqRlEmZxUtoFMEPFzzlyglXhzdT7Cx2F5CoNo8h4h4jxa6SqZndEKn+HEwS/JyNMuJwzrmDsATAmsWpt02KRka4gwioFCzfBbp6BjAhCC3Zdf+M0qcZ1tiJPBISnWWBfa24TWeSCFXjKEyuM7t9khF5RG4E1JIRs0WLA6wWkORvWl1ZkqFekOr1btMbY9vlo4R8RkyHDH2F543XGpcXeC6u0mUFNZueU1ojn03z+rF5E4wSh1o1wssvcL14SqwbQ82zN7ZCm4zxItjJZbH5VMZzGC2yZzqm1zY3lyOOeE3LRk4XRzr0FeVyJqz+6pMAS5Gn9HYn5u+UQ8iHG4DXxAhLu/pO4X70DeNrxswBmR9BGu9f5qVWkz+x2s7fO9TvAZSuwP4ENtxoNTa3yazuHCUqrs3GdcJ3lo7/5O9hs+PLi1J00RkOxbwTZEyKKUO7/KkClIO7Wy7/gMYqdJLLbv/JLBuCBoEAax7GcQ9HDcaiLfayicAVSQD2J+/7s8HPY8e9Ylxkxo8la85jsbKuiDdpZ2y8SRveyRqJ4U3QlH3wbVSXPhxoTGGoZ4p3HdikBlVude2e/PTZ/3X9XkOjS6vGwsTtXpSCSHYv/ANInUgOVgrbtMfz7FI+W50CP1f7AOHa7W887uQP02DptB298gywKPlsQtU4kz+mob9UXWLEIxH9u5jr0Bz8TYalshvg+alwaBO+Ic2O5BS3WX+F0lvd49bZygC7EYBoaws4kmgp/gOXUXx9N3JA9FQ/PpabEgIDbsopK05CxOlVOQTXQ9gGD4vBHAUYi/dKAY1BdM61HcI4T0LPwgFbtX+UwFE2pKlfpDScNYCNmaflYIj5jAV4Ih0bdhRYDU8W2sodIGUQLNfxbwrdfilKg6QqdMfgnSeACg23JUQkWqhIfliQ88KMrr3n8smBDT+gtWe8wcPunM/Q8/W908BtX9B8R1yi1+0eKabHKgUKyUmg41T4ILUXxy0ifgMwRgjhcBH+hVctqb/5dqULt9TVx95//3JImnbYzmSpJ5eCLhUQTK3EojiBHqO5ar6yw7wn91KzmZteu80CFDGycRiV/a5AxZXyaydtIV5t1LIrQqsNjCI+2O54+uwtzaQLaBs7rWjFdcS6Z72Y6iHHi0qg+JkPWoKL1EV6she3yIR9wFVvfBuGsCz2KJwZrX54KGqAPx5Rq7nXSGUdvf+VOKYD9lI/FuMT1uvMRB4KAEGKRCSkpFkYx/zdCtVFXfLYl595PIWJ+kAazc1QpzF+qZrVKqurb8FX41vJbExCU0O/XDFMXo7vIiX71oM7Hdkh1/SIlAt9MgVaB1oLFb34u/rS3EYunZxzy9mJzaMiwLKVcpBsfFtrplwaREORPbtgAbafSYQa6Pe0mHUDgIjSDiEKOGQ+BBtGkAiRApHTtMzqA47qe9LgYI9Uk54VGbWUFmjsdkbggYW8k9Ash+AebOxnrFl/PAV0d2FQZAlD0cquKgBQMffNVjmMot81+SI8vfT/leBo3+eBi+fNqmb+HIZqEiYRsex1KvG/WLLqN+cwoROs90g0TrQPqBBK6Wz5Nz+lcbKwI/3R9TwBJl9utm5i6L5jICMh6umthYXEorXWARlYdhZgXiB8q/NWP8w0nraOE+08Mwv1qt07dCV4Y/NE8kV/AiKkHWeYGmMsGbBevA1z3GZ5S1iRjKlDDgRbORylbY9DPoDnXJ/GWQSRJB2hjZaZOXSwgj44RSuC3pHM8j8SPnvD/bTnfrRFrM/TYb61RfYmol5cMmPnXOMoVNK+BqiQDR2N19Ay/UNMTAMg05p5MuCflg25CQDgTqOj7RMa6bONlCzFCPP1akjnNa2SIfETq65T/UegeNaLG7RVyHgcArW8JMdCmrMi8ay3PO7Fuc/x1o0xjpBy5upe+asx0HCElL1oJEejkqswdK0Y8XSxn1I2w0VgcOZySy92Xg9h0R0aXSrNASP81R0bmPIE3vhP2+hxnnEIchwvemoF/914vDITG/NGBrBwMSX9W9Gi8kqrzFtL0DOAlaJ93fyTeoGk7BDz6/QC9NnwIslfXVhPg7uAQZqVDRAFFeh948o9FbpqusfNwvpHwhJZG26cFd0WNYkqwnMWVj7mlXc5O1wknViFi3m1kq2p1SN4wdTnSXRwEYKDU6Q3Mtc8B3KMokuDBHwnQ8ANDIHlZ4LsUIrqL6SHT+FdEImrL3K29GYekUYqcNO5ehUbDUnKPCUVXxsQ/bmYKL/RJ1x1MLK7t6/jzhHa+TOLCdM6vxYcKe2oq58Jq9KaeQOGamkfsKq1qoiVFxL/n8yKPMRFMufo//20cTS9M6wb/tZ2QLqH/xoff9liwtLiXEF5wH7FcqBCmqa1Cs2pqVecq8uf7cVpAY1/uFb0KAnzn/FdLM3EMFQU0kiDiWua4Dt/7TBq0z62234iP6j8gdPKpqHwpsdOpEJdjcRUHyysPrbAKB3fas9q+0eUAWe/JqyAhsWBfLX0LOFgDMEcFgYfMvlgchAw2u/Yk55gJQICOyOUiiM2hNNhXV8PBJ32qH5ZojOqBhT+wtvn1y5/zBVO2MwXzXGrLW/IBPjFuqVY/2C7jftlCsKWGnpx6P8DJoSfMUZL9cvzE5jVCo7+K0El9ol6Z87qSW7zZidDVv5IuVvNE0kcog37Ipi8/gVHhpYA6BgctPH1OWlSHGc31DPQGWGMwDaU1FNi20cweqOS7oH0QvH0jUezGu0LFImRQxIgaVQMRSKiDLC9K2mK8qup2fOhpEUoc+TcGgVpGslPZL7sxs9WvBs7rg9Rgi3zrzpsYEcpELZinJJv9XhIUCRlLLbvLVVVaeLT8+r/v+mrBgo6E8ne91+KU6zkZA/NY2vfXu5wMa+T04DyaZWsxz3Uz33STXD1MP9LwysoRzqsj1bsMwgOwrOMkS7kx1hcArJFnsU50R0s32mLTFj4axBH2UXZ7L4jKNj27bnBPvRpu5FISzssFN3qJA5RwEz185HKcenatLiPqqfNPUWOlbp6PODtqHC5FGDTbDlQR1hcKwu+0wkqiVR/JfkPjK6tK9oAAd6dsdDD10D0ypiDixKTNN4/wvabMa1V9HinIbM1RJDoqJHkVD2I9ZujUaNbXgDCm/nq2RQOGiiWUF6zBjQ0GnIIDTJP4xkKJSAzU0HzGbz7zf+DpClbtqSclvQvlxVN64rUqiGFan+xYGGFAbY7oOthXd1Tf6vOLRvfVgFmJZT3BmCEglwu2QVG0WHt6N94Is4/SIWLvWikyC1IvneH65wdq6EQwWMJFxrdBiubF0E5774j9ulhf3CaffIalm/1NDGzMEvrn0LdWqMIur+EsL932r2ia8IBgocY/fPx9AEgGvUCr/SZAOFxIFRYtXM/cpyL4VJAzY1deM4gqWlfjA4q9n+xoz8Xc4goqZOiB5R/pRuhGtcqnAmI6cESJurVT+PI6VkjMwqjHci4Q76r8iVd7QTVv2VuOCcCnPa86MOmb9d2s+C4by5cdFriyixVdvWq4P/Di/YxMruMMZVzVPtUB6zVPjLbbhvz+Rox5BrzWPEl+HdwnuXXddpbs+KSvqBEFFdQk/RxG2ZAwPdb6bVPWpO2dWqNgHB9FEcXq6hbhBzFcJWnv2/uS49Nm9K5poS9wa3Wbw2vBHGEmaZq/tRo2lJbmGqmEOT3Kx8kAO/kDAmy0vzixM5somfhzd/UQxfNwcJ2IYEb7ktVowELgJO2IpvSF0OgGXHqjy2RiTw+m57efclWK+EJ3bQHyU9Q8qPSbfwiq3bxgRNgkETBmwFs5G9Yqach58LEraIlZpQWiUBtAyJntgsMBOj4opTPlvNaBTR0mCG8c4g1zGVVQuYsw+4bMevtAdLrOTlLENsrw6pLydITplmtwVKJ+c1VNSFUj/n3fLwbLvHpDowKDd46Dbq7csT8foElTEJdCIjN1BjBuvDpLoRCS0GRpI8tSyyaY+6L4SWC182L9nNLJvADvxV6DScif+N+AU3bd3wJx97+wCRmU1mer4XzSknOcUodV6yyTJCCn93/LBpzHos9PW0aY1EFSEk3c39Zsn/QakUzd5yf3Ht4mMuJgJVYSRtkvLHRudrpiZS0r4aGNCtLQycrPCT7jzxRulmq9pP6WR9CV2OMgn1+Hs+azpeYDadrh8opRwcU5FFCHv66GF88oT6wpls9oHtsqlwSWWF9boUqrtmTmAk9zJx7iL2nko1lF7iYbtWNGFklx18nz5Cjk8/LLYEnUvlQMlDD0j51cxA6aCD14o2PTDiFrrfMCiGC+BVI3LRHUGuHGA9ish+j6SppTGy0cxTq5uf1etQmPLYLAD+yg+HsEZMfBu9O7hXgTUcexLLXjS8TszPJTIlIXoSY9PrTXhIa8f2B6nA2KNSgweaUHQ8WhU1Q1E7l359/kNR4v+3Ro/XJAJIk/9vIBEzxnoOmGA+zDkTSQ0r3BUXfZqG7vWTPkpeRKtiGVUgLqO1pGRTJI65NSk146PkC7a/cgIY7aBZd1hRW14rsqOZYD/KW7u/DfrLHRXJ+p9DNPj2QaU12R2IocfqTtRUH9PqSh59ujDrSk5xhuOn4tZ/s+txr8TjiPk9Nh/1n1YtkMls4zLRqyaaEPpqtBKUvJ6Uxzfls5ssNl17zp4gHZA9O/xkUJT/bPgJ8el5DpTh/YzRTKMXDVVt/EF8sCKlU0yt48/P3lhr2SziaTxd/ExMV6gtOu+DbkvOQ6PUgYZy3R4ETiX/5Y219vUJwSNJN0Ia85MoQu6iUpLYvWM8RzIECWsvcLqImFGTKA5KsygzL4jf9pdtK2knBMlbrUnljzNGOxYFj/iRvJxh6rc8ljtwb2PxKGex4VXjxCKTdOqQY96Cvi94PUwl/NMz56Bk7YiQX0vrE7MHhSMfT2PKXyybqXV5vAwfjpGy+I8LE7rIz15LKKc1szZqDt6h0y6ZKNirmGrIhHi/XzuQzEu/hVYxkNkiAW5JywaxptUSje3PBaeXNwJgFcd6LOa6ogoQGVV9sU15V20SQohISzUR8e9jBrXz8k9pF4I3NrniLQWtkUmGSoBxzwiLgDObT8TmenMsSYZAGwERrkNUQXoSRW4OiQtcc3/7lb7nQRv8gkf1yd/uLTs9XJwb5wx4KsisGDk1BVSpu/zu8eLD56/VQWl5/q/ayYevLJs7IhKSWCxdBp601hr8GA+oixmRvpHA1cf14ccbg+V6jhfSS6nsgvRsGaRTQnjBfwjpv07P1uyl2/C+PsTjKUYv+epgQRlyb6VrZ4qSy4XrQ9KroJn9F4mLLe3wre9DvaEP2+P26A+HQCzQJEtfBHbPPpypJI0VVTYV90BARjH7HTcn3wxZ4m9ajSrMp/8UhNrnu/OPId2At8IdvJHdjkqJZUZlgUH98y2MOjkdY8pKlBQGGtCs709ki1L2wNALKFhd48EnhEMhemlWwPV6mN1ngRwUlqBLGfYlqQ639iB/IWHe5T8M8KFubtevbHeqzCGLxGu/lu/odJaWxPTEZNzy3kgGqBhmzyeQ2NVKVfd3lAHZ1Mx9vEz2w445HNvVHdEYEnUR/Zmsui6TFnJBliBjGMye+XRR2xCbw2cuN7hoH5gIUHIBeoHVP0Woo6R7oVd8gGjCBnqyg746QdVxGhB5Zt5XadOayP8HSt8hfegE7T4fRQGDz/hJgDk50qSPjEYXXn7Hzg+zxayzf+JkQATQNt1gEnXvS/MI7QrJe2Y7BEpYP51T8wFbb4cDbZD64Rj7Cs7+yaQWS+CwuH6wX8iGXv8jgjbjs8VecfrP/IaYZjXv/KiV+AMw95KsTYaKapzl17Ocg9q9/Vc9uB5TBEos7yqEPn26nbrXZ2xf02AzmjAiNHT53Lhk4EwFagvbFDnxJmc2ZOVj0QvUiNw2r9q7/m4yz0pXfpO2SvlzjpXM/9TaDyjeWHLnNiDizvHWzgOUDS+/X9dECHxYf5789XoBduTbT+GHpS/Zmb1RBgALxS4GQy2ris0orCXbQwUilWMOHQvVe2CxcS7KVsrmaFXktypKL1Nw8w8RATaqFigxjTX39/tVC7+7Iv0rphIDsWYDCs5KQrYweDft+fWlljsyIX/mhyBQaY0QoMmcNya/u4g8MlioeU672ZJ7PIhdTXpuxjbPJteTRPgw2d74WWgImp6O5jyie+bBM6DZMSyNZQis/hvbPVsMzYPe5dngHzJNaencW46j9dUWtk319WRsc81SeafYBaMy9X3SZZQdS1SXasmABOanqa1G50axXJZUKHU57mwrWqQAzhQjbT6HWc2963YQB+UkL7x8QiEPFAkienaoHP7Juv75niYRA3ZFwXS+llWWCyQMqdasK7QU2DR+5EYaRXkSJE3Ygav8+oiJJlrlwPUO1zAhyc5uuDaMCJvd4hhVMHn7eK6guBk0l1m9b5XOI/wyjTJGJEsKxUjExwyMephWgW+y7RxvgIE7+7Ztq5ikWQdsMVQhTbbMI4FTyEKljlKWN2Wjl8fk3wjR1XEHtjexSSQUMpTUvKIYmfbzyYdfEx/zfoI/MnfgColhDH+IrCb9c4K+VH1kQeFmd+KMJgDHVBAFNNydOhqhMTI9y/d4rgU4KzMk3t4kygpXCW2mo7N7gSg9FwWo686sBdPOASuwz0nym0cxZhkJnqgtxAigpOZ153vZcSBBPnEwMGtcWeiUwmPD83kbr4GqxzTbTmybwWChXY6fGKY0zd7TZMfgE5X0Bzr//Dmc1UFmRSMmmj2mxGQCZyYyRyM1wmzOjDKVHVOdqz+B9dHJbuwC2Q3yhtCRgUVt8Bn4ZBtj8JiSmZvNP98qDD8OFsb6EL1a4Ewhz2QH0x34auVnE773o7GIoC8UWtDITCmE9Frtwlu2f83Fg8/XdCaejaIkruvYHiBEErZaZgDctb7B1Q18ikWA9iW/J/vBLzR9sOFa6Ezuk0czMTrag3J5xviRb6x/MH3n6a1CUZ8Kf8rt9viHBAS8T/7djTbBxmRF09j+sz/vdMcDR41sDI2W5BEJRLshO5/xrU6DkB2Sjd0KkmLZJ3YGkTIUu5vqz7imTaAMdJ3U2at8IZH/yihuoIVlCetJJ1NRdEphHNESuYfXtNy7rEiU6EYOWachuzjLDJF6JcjSRdi1Na2pEYiVqxJPDiESMwXtFEr04Ynwm5+K1vJxzCnviMTP838BFx9ILrHkiWkFsLx3GIRtXs7noNX2+KgWkCG3gus5geIsFn2RJIy7ZXHm5YKsUvzTTfncqivBVlsW2v7pO3EX14yHjhtcjM17QtdmGYwxOk4OuGUmbN8IGh/ESqNkNPrk2diupflGLnfc9jgLhzRWLuVlK3eMvmE09XmA2XRhskC0wugTL6FnWMJpmzaCTzmSA2UsNEPXbIxzMTZZ2KrwU70S7P/5PNF7dIRDpuJkR35LlMtmUe0QhO7WyaXMX2+3PlgU9fiLH9W627KKPk38umdlQNBsJEO34yZXd7Yu8YfOC61YO6dOSKbUxJCV9Z7dnKFAbOGvdNdX4davl6kMinJdhr//HVeUWXkeXudAoBbAqoMCimrqoRI4OXamqWB0pSNAQPIkDYRq2SIJ71mdaCeTcH/ReZlKfjBf6qS45In2O5LDi48ub5qZ0lWTGNfmY89ktPAAK+atOt8Lp/ExQ/EY6F9hSjACzD1dMyNvBfmvhT3c9ZoZn6Tgha6urQSgpV/IJzczJFtGscvR5WwkzWSevbGC349XACSBy3t600Pae2Hi6XDgjsCmbBuOSAi0caabHbYVrTq1A+meiUCxlt438/rTui2JXdHXQvvx5THSK1r6MchmA5U/ft+HtLVU1Bo3Pblzif5IW76w3dpqzYzgOeEOkkVeE/gqOiau+6Z7imjLCVzTts/RfNJDuM+c1y9UQWvPW41I4HnNq8TpmlR8s9cWVa+5p0YM33exTC4s3PydNCPD0v7dEb3YkHn+SMKMLv3wlRzN6p0iqzH+1q01nZaEjaRVx25YrvlaLxnlvDSyfyD6VBPpR5AhhILR7pxj6u+yozVcG+iZD4jZdEYGOHpQIRi9rdmBJYSp2d65JhdoDOEue7ZyULzlWZdZsUJhSn9qo1oKW5LfgjR8M0C3lUTav7bfQm0qLCfFYyZRJsGczfNrgLxYTsGa9x9WiKOUuh7OdIt7bo5P4D+UlIpVMC1kJ99ykCovU7Yp3YfY/yzI277/JVsDOKvL1m5dw5mh19rG0rhUeidM2klyfgy8XoqYsbsoX0M/Hn6I+yc4a4+tOxxFofy4/bCy2brvZA7IdZdEJYh0koz8Vzg+tZ966oaxLNkk9ydkA233A35OekHUMjuhMtL+mpAYZ2/SqzafZVRslZ4tjQ0ngZpzY8Uu11GO41rn2MVrs15eQWJs9NaDU3QH2GxEwkG3dWr6amepTYGd+qKyjVOKhrAww5gEp0g8rfZaUOAorXFiG7gvwoIpUveioaRKuUG0LofWpPQphGQ8nNYLvaEFrpIEm3zJ1Ybd4OAQJpbFgZpi1fA/9OoHZgi4BHST4r6JvxZ5dL2aZ3VABRgbgTnEhPOjAzaUgW2c8Me4tajmETeXjZEQRFxPb67Ued87ZX5aGqlRt/hsAyZa5MgEm8R8Y7nbq/7FgwOOVmqmqrlqDjI2nijf1v3L11o980iySORVembZktWDodsfLTQrWbtYstLplrhA42iRznMm/tgaGgCt5vzY/l6ekaupM7F4EhWyHp7k+tYFEnAiZnHAnlrQdf2C6Rm/vJeeLGaaIn8dVW+O8+B86BaHpicdoLavyRivS2NlunzXeg00Mj3VVcQ9EmvEXHCy7TEW4sNqe6X3nfGISCDhOfv+OgswUFnj3L8Q2NqjPbdEGSo3FPFISdIqyRXquJoo+LnowlAlpeT24WuYxF9KAjUykXUGV6WiJPXjjunBV2gt56ixyhGnav4XT9mxeQQJVs2OarTnkdWc4nOw57RNkvEY+o+UI5m36oULMcLIL6/aODzFV3zcRiQhW6S4Ou5qRJsXw9yUBgFHNJYCciDyCdx/H7DsHpbEisjtB5YFMxt77Uw4qHAzFtJfGuQCIbySI+lmo3qKBKZgJAlejL+fRyF+Ja4L76OBbfmAHFzSQ88LcKcEIwezyoRR58Ol2fCB/aRqHIjXXqMEaDjHzmhNEG6qF4Hc2JKfi+WZeQ5vi1ThoE81HyT210TqIGnldrVaJbpeLf5hW3Ilqb0WurL+pGjFruL4V5sFLyn9/tbIgE1W74RnOGRFcAZh2qsFx/kV0ik/cIA9lHIVtjhkanGK5vMp1FJMkIkTE84MioxOj39Y5AEr2ziFvJdi1dqssx9TFTwy+aDmIGU2+Dm377KNxzu2zwtytejw6834uCQrYEoyE50jjiw1AAfN4oe12okBYW2xRJ0m0brwFrPr+vwETAFcy+fyXaaF9J0r79F8TKsFM5QIk922mD6KCOrcnUaOg7tKhVkma7ZwoF7I98Q7zHVpYFdxX0bvau6JIm50qQBGZOQbH8JJjQGIBf4Kf70uSibuheku/A10hE/46JpYxt2YM3uQVynMc5CcqXmz0+mSBhPSXuC7N1Tq5D3Fwx21x4jsSh4tCEdCTDDAAPGz/cB7QSFawDqi+MPJSTXSNiHcojHU2wv7gA8/1s5EcqXb4ocUekvIUUgvdUiqq6vOtwIbSINc33nJJ/TFpzd6QRTzOGPrQXe12CZWaQjcRtlTmdZQm0+oAkhre0ydRQ/x4KVje560uoD+IJTnjb7I1G7MCE4kh3lTNLJGDcfj40skkK3TDlfDzSRVweq3j73bknKobHG4wEiODx3XoAsrK/WwIXsoPHdFDrAiLyd/FBoBTAuNwnDZW29K5GnolBqyMf6TtnNu++DHJAWfYLDjpW+XnTPTV45l5kjfyypMWdYIl2SiZ76a/eDtxWrsGf1DkidUENdR73I47AH6tt0FOMGXBE8SpTfqpZmqvVR5s4H3JJjjhITY1D8tGp13od2qv5NbniGYogzSzRbgr0+R9JeoYGVuoyu1PNK/V7bP7wrIYMSrrhBSyOQNWRFd4a77EdcfBKM15qlgeRB72HubQx7sMamcoB1lKBa1s+I3WritjrLPBfWICv8R0Z0EZZCoC/ae5OaBKNw9ES02+k3JymvspuyxgcRF+cGXFtT5AWefBg9y/yBg8R1fnDKri9eY6no4DMiuEvRWpfhRaIgx6suuMa2OqV4maTxaH5mMhkbDAmYa8Ou6XyMLiz1NidG6zJxEEbgHJPfjcPIWT4jjAcGVCyDKpDzmRPqbppmZGW43EFjgrYeGSXQO1xxPRqYi6cIZIdC4VgsBKZtqT6gHoN3I0r65d1L+XskzB3eqtlEj1qatFd+uV9+ryRq34grH5OgUEtRlHSH04aYF1KuSPiQ/ZRdk3c9Fa8/KSNmcJL7ZgV/ky5WWxH7E3ThAbyUB8Pnaot2bRCwoHn/rBoh1XkYss4+0spLzMTLvnRIvR8V9BDjbosBp8cZXI0dBf33e01H8ZeTkGPtimShHGhSuNJo7qBeKon8+DCG8YOVSTNrErjroedGDESShNU1ZJWZSr7cEgoS7yhXBK7f8ou/ikJQ6Vm4X4EZYi1qPCgA5S0cdc1+4L17xw4lBb5SLF/ShH3wS5MrkJhJZvcCnrv37cQHhl+81E7r6SQuYcRHSXMJ7nq9r5Uz+UxmuMxRl0XlnxNHG6OpoeiNd/KGS7yx2j7a3jijFquqyKsYqlSNzw8TX+Zv0HW9xsi65wcLCJ0iV0tmOzIcoVZiwsbcGjTtZWAX84lyzItDj/FwT6RKa5xtg2RVKV0w4xcGNDxHH5LLNMWvZQFQrPw+sXVpySK/RVa98W+McE38num4aOA3fLJ6M6VwxBO4r/zEPm+7dFNbBgPpBxEDQMUf8f6NulYX3g5NTDf0ADMV612hR53+4FuQisksigoXC7PK5VDuD08HXi3F9UdiENUHlncbHIM3j6KBMjpg9akSgzAKA/krFfWorsFbwh9bS2oyyxzsQycfudv2/VeGrfNJNRzaErLKCu60ZX6/FcqXPFpmesXmWFL48UPEPOuoLjHbvwuHJ7XFoqVp9i89Y87Nc2cOgsXOCr/HBSS02RrQIvltC1+6AqS20Gmt+20+Ab4wtrWza+e/rFE9yovaNCUPRPHp84fTqtZTEQ4QXNeVP3qzehCvhR8PeIhr8PSp3Lw+WDNppKd77f0GwwKr5e9XQLtu4JfRGKxxJFiAqu5uosiZCZbE8UYzF86ZTuGDGpbrpNcOiUEa1dLwwFlSc/tB8Jiy3QxZe2x8wFYEpyZUgTjdCaXRZHJgMfeblN9xUAy7NTtGgto5BxO7NJGqg7z1dsgpC1vkdeDEbaPJ7IHsjoiGjsmFczU/v38xFxTDvAkDHbFuFVA8257h7j9hTJo/seMqWRjN/u+PywbyzZXsTMA+kx2DkDxezkNKfyqr5s8oDIqJLu/QG2cyd7wdhJKPAmzJqxA/md/obPX1cbGbH8FfhGPbCygSg6oyoz5GB/7xdqIkjEwRmmKH8KIvo5A3yLSHcieOlLfG8F1HsYFBjSSGbewMxpq7E5wMSaYUjSQawrTGX/1QrWky9uFUrtBFKgCV4k40wPEk79BEvy31tP1JIgL0itKNIkqT1aC8QEBZIjcR7DCzKxkHBYevQRZQ6bmG+7Qw9+49t9X1WPKlpQnO6DuqlakHMVbQuU8bxmG4sIAa53mHpCFe6T4m/pIy5kKK5EmP8bRMEfabAg19WjJKpw1zrqDmt1XvMsj3Wbv/Pk1NiIcTIVJozFEN1119MgzurQj/1eLk5QAlv5TL004f/GO6f0jabtkX3fj+tt60P4UOAP5qKcBrf7zOF95t1ThyrntStPpanI34ODGKcQi7wtFRJ2LwPHF/DbmkJXXNzwHceGm7DtJLtpDD0Qt9SM+aoaPw/er3HJTONY6JfF3zC71hvRmeXnwemrqT3kDxhNHBKeiEHNhiFThEjlV2KXiLYyqQxFs86UwNqepgm1yMV7HEkfaDzXUu6u/GhIzKevLtrkYB9y/7t5AxdLZgJg6/XPl2+LVDSFCkkXkp6YAD6UnBHctRwe0QQBGDaUMv419iygMWPSpoPFMTy0MD2zg4CUK3JXq3ycnUEO/3PkK0EN5gKv5jHKHtf6RUtsVDVu/YEvkXa3ywedmj38PXhumSfyf9VL15zIZ651wQ3K1UFiAHBSvnjbYM03gt/ScH01mavhrWAXxUYjiEiCytP1ttwURWVHKdGmU89Liy/6v8p7ER+goLmdKO1c5vFrQKIRnD9UYJ+jmMBU2vuh0EEuoFJYiM1a+oK+YE7EOoLRiScx/kn3KkXa1Oc9JnC11poJPlATtTideQDZITCEbOdYJo52wwm6xNhtLvJwM6sdu/WpgV5f418QYlB1S6Bd9vp5QrBc2ooL2YUH+mlGsMiEcQNkqAqQiSPFCpOOTc/ms0j6LS7tDUPQ6KQ/jAbSz3UcHIc5jzGwtt9fIqx8xzhOWNOvIjx+O+zCaHAl96Pm/gQsMJjHPdU45pj4hqfd72tpHkoeu9QOwm17Ysc6pReXWWI3pmDl6nDW6VjIrqG8PfS8L7gxEPdGV5JALA4pY6A7G2LtCMIunrTu6ujV0bl2+iquUXWwOS8W6pl+IENhLKJkVJsEop0fnWP16FxRJGxDWaupELraH6jCfRknwGPVeL7jYIs4/78QdQrjYey4lUIOxpq9fzsdLC6eoO3E4zrUVjlj/5rP2iiJfZCWCaXgfza/I8UOJJ7xnqo6hwn3njQkIrLTp04SbEkq7Xk2tDj3+XMdKhCe0Xrvs2fFD/K29fNjg09bN/n3dmMiwpUMlFTxIFVKSr5s01MTrPCs6fNcEkpysbgAMeCmZtsm9SyucXajuJdwq/3k3L3LKugYO8WwSx1mBlvb6hiIQyo5bVShF1zSz+CHLWDMctytSBe0zVrTYmA2uWoy2z3MjV5q7TQDONz+1138UdqkTE+A1P5JPN37yD92JFcAUvY9tu5GwHnwD4rIpec1nAUtsTjSAPdcygqI2mA4iPpHXjdJjG/w0CZMeIv4n2aT3B8+5Saa8ZIYAaHfd2LaRwvewTx4/zg9ZBA9Wsc0zsPycVdyU7Nizkbp2THEbrlniZTsebc2TgS+KbJkvZZ6qXSNW3/Vc394nnUJY5XOxcuTJusulGkee0DOS7POfT2oJ2DFRecIKolPhGVPriyJj+ygwHfkl9xwUg2MVSkfj2b1sJOFVkYUYMt336N9x+9wyEhFH3WGcfu+oi9LqTvhLOl8qjQZTXghFrXwC1s3ZIp36lgEY9XjXyWrt67AdjIo1Ch7z3e64Y0CF2DgGy0iIOnwSPxitxWcc2PEOQ65K9nG9r1Yee9akWGULIPCVJweEpziBkZhQH2QhoHV+Xm7QDmpWJEJPkZYmGUs2LfasBnNQJRgGQ+42Umub6EBesLkSdUHZ8u+Q8zTeeguwl5n8C/Una0vdMnLGDw3bWitN881WpOvgyx9xxJdAXmZnC2EZJcJWThD59/GRY7SFxZXlL8EhPZbbPA1ed/+n/eLOlKPnDSWxILjUOjcWszySLjx4QXGSSHXoCLV56/rdrcR9L6sSeb8YP8l/O6NAlrao7C3WSgY06Lci1KA14iLCaoWxdhz1+8VF1hDWxe8fGrvt5qy4sPy6AQjaLLL+ozRUs/ZCySOqJzgtyFGkK9TwhMeqAYo2yoeOZkwQgRuQJojIcag0jF4Z35G6uOet6GUsrw614h2IcrMbzc1Gi6dMrJeJwcgVOhsZ0qAwQEvJQaOKbuPuIY+DFivVRoNpjZG6h+RK1H7uRElt+11dS5eR/y8VnfzPfryQXN4PiWhnmxyXzOueVdq/ZKzTRLC10ImBFRRubpq04VIVwK67xBGt7uMh90Up7/yXuHjsEoB80AmyviAI7gygW1RnBEwtWnGWQts7NKCteGa2rJfFQUVEfv9N7L9NVGpQQzwOimIsO7Oj/dV2/C0cqrxNJC8Rn7Bef/mrLyLmUZvgxLl5kxOUJjOMM4r7KsNdGnlH4lzGaVt6tf2TXOcfz0Tsw3d9Q5SSGXK0fi1NFBf8H6q0QRNbIzO8gK9zT8CsZdpZVaC1BJMDCZrIV7mU6EvTE3hy+soWWyjczf9bD3Dv++PGURF/usMqW9J1UNaZuBJojPlRdJTBYzEbERIm7SeXU3sqKa2R4DG6gxB190LH6o7py5E+tJ8h08CaBNI4ILTk3a1qcOvubzgWsgv9Sna/f+yvivs9GM35Nw4DMVpAS70gYzzCQuLvBxdseR7RGPRq1nY6+Lx8dj51BkUnvmmySJCWV0qebtOJOVvhFKgjkkRb8iRxgsT8NzxnmRSiEYu8cdN/6ZsZN2hCYjKIZjyNQr3LMl//weZWTyOTvI/tKvnG0GAt3VUr+TGwWvn7pkWjL/4fbeKaKue3V0Ee3oppoBtQsKp/h7AlYjfk48sddB12vfgGITuvRYa+C3x6p45KbSiaDE/6wcpa1UpZjbJAcVxwe3d/SFqiZ4+JuKPGkXBGIJhib6FbmKwA7wAZz/Y6cIN73vC4gBg0l54n+oYnyBsi404P7yoTvM5Lp4mZQ/YHM7b2HbW06cW9ElmiGwnod1t+bNEa92jnU9GeikPh4URZ3FYRux5UCRakkqLQmTWQu2coMb1/7qXpyMKdaPUOKw823U+yPWjg7JwH+MfRR24umttAT8vbLcGMPx3Uw4fe5yerO4Txpp+CRE34yQYgg5LMKCY2rWNkq4B1G0SeyiAJcrrjGKwfxCwFJ3dY/HDCb7hFrkKIkhyv4f7fhTWsBrLvMfeMVgLebzw3B53l7j3z6UW2xSeNDw8/160Ne5N7QEeNhaIXFy5s/5GjHKw7R930ecONOW93pkW8ToyLSlz/Q7Y6tSkvmbnj3ZSN+a3vWUbmLwaSOk6po8WMz73Uc7hj16PjmvHrpDPA3vsfmkMoEpwkMFvHiTF6AZJ+o8TTRCMkZBo9jjnLuhilr1IXGDaa0nFBzhlRH0HFkKbAmtM+eoT2kM7D3WtnlSrgAd6aKsYXEVU0LCFTTeCn9HLv5cggFpl+EVDXe1pk/zpxSBP0Eyy5mDk0WDEMg9AMhw/8AK2BrZdAyfRN5JI4CE+e1NW/RYfAWXh6iBKwH3dl2FZvwrO53QSY8RTyw0MEdy9JHuYZt6o521341VAG3BLyIz5WYXI6gYEHAofs+XQRzBTrZsvDZ+X8xV/PHlz+1XMGGv+CTaI8/cLNvxcIxmZxtEOCtuYH0TseUDzDMXcX71tf496phVx7fhXuuQMpk1kF/YB1auPbeA8zIIuLpUBpe3BUmb2BaG3xj22leCwktSUVDi/V0LCUprW+9dyNcRFImqaH7PvMUxoCKhNLIy/BS6dlSFaSL+BfkgutTUp7Poqx2LF8bj4Ul4rEdwPw9A//C6LpRC9MTkeuB0HCmlY0XgDqKSwhi+LnqMeDy3EaApVxujkrVlHji5bJ3Bwknq93lZf99TKpApF/ED4jm7eLkHJgxCQuouQxp8Dze+INQH455n8DOby45tiThWurra+xSqBsVRTDT7mtV2yeaiFkm3oJHa6cM5eARAkBkhCFEAhnIoJoB4pUUrbC6tKQMPKbT+qM1hUsCyiGefCOQvIcNlincU1Q+pCqtZMr4DSg59ie3NLqi5TfajsvxjZrzQIPWUkcP8/0mdmXITXnApEePUhxOKndC4tSSCDBGGwevWdthMTjrwPoufy50EgpZrjh4oYJ/DNeTeUqYnRg/cCN+cmyxhcPgG7YmTlz4o80Bja+OzHf08lPPCgc6aLHu/LHQ6IbUb26sn+P2DuyArWgvhtYfIbTTXAKdp91o0l2cziKRCVzz/fLHKo/eyBecv4jP4+CxbQdX4d0qzTZ/Zl9JXZtIfFRDl54+Zm9rgMJ8suz3vcuR8Kg4ZcmkC9cY1AGlbCzmCiQR587IQEiEwkIBi5C7VvJ2cDGQBObf6j0dOPohoGWmgdEW77tQp8HbQNk9Y2sO5CHwb34HGkSmzIm6TyShWQtEnUHaAhqB2SmkhJDFfOjN8QM4fsK3sz9uLiwD2idUKovKX9c/a2k53r4PLMkBJX0oIZ2+i+NxxV0Dc7db6dwNKkoZjKRFH1zp7KmNam91n2VpsBE7BwXdN8RunU9fPAwALtUAlVUto27nvcTzxk/WJbPw5ezQ9e47Kxmh3Zdg7zXR/BNQcr3qvDGnd0rx/vKJa2vr9SRJqXIHlzE13WoEzG9M1BTeZBVZtH4Oy2QyCJdBwqBaKgAYh2DsCsGAebzH/bHfkY+dxClU8kCrJaaOWuvpaufuViLP4d1X6iUNiurmOt0c4rjyvudmAl6aRVfEg3dqSAsQW/5nzfzBecdFMbyfoqfmRpYWjggh4kpwWPsqLc15p6MBrDTclR0p59tAhnOJaybY24S2i6j1AnxX1HmfxY1y6xkDv7RGcHdlZl7EaMSEB76CiWAg125VQkNMl3zYQH8r19qMgEPYIn+NJW9vRNIOx7NzAzNOsWCBW3YJL/hcX4rvU3glrVfAwqc2VizudH5S0LFmu+8usk2wR1mPjGOYfk7OE0AxrJGDvNHwiWiLNGf/ZBU7TAUw3To42GljTZcWgbwthKY1W4EGx3q4au04O4CkOryOYvvY0asxxV3AGfRuiXvrxVtBdiBYpkmFvGnE9uAoSCkYUN7efNG5o8eRSzSbTbO0NpbjqdmRv0pUlfMQ1oWW5f8gXfVyRaTd+S5zTC0HbnVPPaE1pDR3RbWwKJm6VXIdAlFk03VbVHDZ2EKTeuhteZsz70lGjF4aTymp0gwXAjFsDpJIrQG4OpWHO4CsPbrB59Tc/PsVnyzclDmCCUGYR6HrxQejKTJTqp3FKY/98dolzrY+pUJ0LBM4BOUwUFyB4KhFghd7Zsu4xW6z36FqehV52S7oLM0wazjBIvMW1RJvg/qzW153G+anTRFCNV0FATSRcR5+XyxnNmR8uqEJ//6BDjVU4090INlkRodH+c75sPTrBzP1xR4jg6Uv3696+QsnwIIgBsgaR0MERHTgoH0xL7dhQWrZ+EAsq/AJffP85L1CSHM6UoMWxbuNM3mxfpmEk/vCVJnWjYc5ajy6kRqQfZdiju12OIlXU8ujO1fInheqRF2QOpLq96ajkP0QMGc3d/D2V8A8MBNMlBCoy9bobfKqnryoAO12V4ygux/qy1gfEAcEl/dWxblwfmcLv7iDTA6XRi9++cG/uF/1iQPvxb4fmynIbjINTgnTnuupmLjYfXJwH7HluChQ4XYsQQPYOwV2dgc722MsV1BY9bvkmz6RqDuZJDhotIVyMiLLHszX8kGmLQg7biAGU+nUkUjdsU/nUQH/IFKye0VR35wqAmzSUo1a6T9IEJUq3zt9koPdvykc5EEEUR+8z1r2H0pgcpZakRSACWCPpFxptDPW0g0wUvrU8TNIlQ+bTPFJNFFwTYAQi8Z8UrxW+Mhl6bkkir/PYGvmthHmsPzqT+j9RPkTl5DjpmXSKRFH0TNnndavZwbsE9w5s2QF30sOTVGVr1a7rcWHfbEg7qyE8NLiVGkohNPSDaSJVLzAFRZrVrEUrYAHyVNr1lu6CyP0pdxdRtUSyaQQmZnsfPs9FFzWUZfrD1hfKOUCVukGpfb9iVju7CjptxEWQ1jm1ExT31WD6mNL5+A3W8PwJWtOQur+3M1VDx5UMKLmw6nKHfTIBqFis32qiLX7d0mK7HZQyN6BmF1+3sg2eNkxNH7A+g8C+Fl/b5Tlue1hfW6J8giXwKpX+0iuilfY/Qoj0T6KNxqxaJbcRI3mnnrT6LZ8hqS2vs/VYyEG/b+50YYUr+w7gqmtwEokEN6T7GM83JUJX8ZDKoeGrJTtdi+qJMcc1RUkc6S/Otvh5G56MKj7R2qWdwHV/cwZyAPfTi8abWC1+A3CPyv6BO22Z893qWdTKC7rztNxLfrgAfZKH1JNnMR8HgHeUmC6G1qwllcW4rNNak7W10PdCf5GH8zHpPkbWx/5MFcpVqiKmPXOuMjeoYycQvyP/FYXI0Z0POvGkj/TQz5IOEaHDFEt0pmaDzJUE3snPS8EN/faH26GuDnqHuZCZoSvGNlpcmtRaH1P7OWFyPK+xPGaWacuRCf+MhH2DRkhGnmJd0YjWH3fq17v7C7z3hVLCgF+txu0zqo5mpnyjKXXqy7L2fzqobYyL6jxYGy8x4oq1V2KpgfCLP8qoZ+wptbmDx+8g1TFCDZ1KaByRa31Q6hT15SN3FFilt2iGr9clo2mo/F+7F6pGtWj5a8pQ2h3ZuKyDiYxSO9pZVn2aTe3fHz+AmQ7FsnEbfzSLki/2QCYwvvTCWF6Tmjl4bjIGIW6jQ56DGn+QiA4pgHriroeXWATCX90N6fMVnpz/VgGHruve3lUnzFVcmaqj300d7MsmU2Exi6px+94jCo02Rn60NZ1Fyryrg/yLl684ZpFQr1HTo6wXk0avZbnyahgxd/do3QT3p2RmGi1RehMSr2wwg7KPaqSH/9XnUqdh1hyIZf+GfqmrJOs7xZk5DGB0J5Iz/oM7aiL2s5eoilIsU+Fd3e3Wv4H5el3CGlTHxAYB2Ug3WD0AvGGANKyszAOE5UraNiMTdaV5SNYsCCmHSS0vBmesHDo2G766zOx9HO6kiqZvQLswINt2a/0yo2Vmh4iyH+T2PvazHnC2xE+dN5CD9wtk+dcAKDi/zN4Ad0u+dWNu7bnDRPtu6E+J0WvyoEUquRIZfmdwIWdyBqA33bTzWqDn0xiWCkoZY7lFHo2SXfCnwJPmO4hExlxFJPUIfNByQ4Bshm1K6Gb+5p/2AKif3n7puW7SCjfPMhz9EEcxtP9mWpeAfz8L+zpJYiaj7MMegefrtc5JBf3XQDJlIF4ews3WpVXJp7ivJzbrJvTpFo1hiFRHzY7uNgYA3MZSkPSy42OUYtetRW26at+jiMXJIwavQbIg70IH63E/34c+wuf91PldUIQMdkxxebu3I5EUsDMUm+/AUZJrEn+A3bU93c3WyOcKkspGmaFIfpaB2GrWXpaIh44leHn0LXJTLllDJz2wP36I4ObH75W6pC2cv7vBhowGLye4+Pk0avBkiA5macbjKrBrXU4OBd1xQ1M6NLIMKs5JWSsC7qSx5WzVidoCGiHgk7rKchYCVvo3vSPx95efKAt1vFp9XuMiCRYPEzK1Qfd9y8y6D9m0SjN3WBn0LzWJ0n/zx5ZZirgYh2x/NPcUalrFgBuM7ZxZUSMufBMbBXh4gTxRWwbInikDzWAeK0BaqVF+AZG3TlS0QZVFFuVhk/xPAMjZsKebXUwxbD4Ol5rcm/a15in338AnKuaPfMZnltf5PyVqEeW5wMvI/ZHke+tHCXBe9QIuvbdoHaH7XHe6oAxK2BKMasHDvrDlHhy22ly31KGFSP0V+wfsefEE166TQO7ksv/UEdByRVZzm9/CT30TWTCJ+V9DC6Xee79Nd4u77Kyh/pGaeIMjXF3pNn9P5DSywKhs8r1uxmKqp5d4/28oAAvXKU5cwHEeqAUBkvrz6ZzIgn2Uj0aiUkkS+p8EQx8FhqQU4xYW9HOSJYhKw/cHOZYi52drfhKJnhThv8zToC6K2/1CVIc1dRL8uQEleWySbGyiaKhQnclniE3TWlBkw/qdPewYTSEiMsG5NoZR1hHdwwTRgtSVhlir+ryhkaID6akVjKFjogaIP2fl2lt9xX+C7gbh4DpoRHyoztEfjt0YD/Hy9nZlAFRUBUmffd8EUVVPlAJiXnAW6a793XD3+vkF8X6MX4sarcO57NBYx+6HcxKsBEykl48guuO3Au4VJ3rG20ko3sh3fbW+v5UYKi5Z1W3n/QPG95xh5DDrwtmNxBcMDVApWSxRkd0Jpnsz7IZQIoa4/tJn+lRypDrNjvxNDBOhm2V3Uwnd2BQomZzAWPTMiIxo/gQt4o/kuQK19c88oa9G2mjc6Wy1vFDpHbGD7ysQuPdZ78mM58+4/W/9vH/jWr4gl052l2n0s86XWioOIQuNiPHqKTOLpC62rfSWQ2moM1hoKsGVwCrjEtDZvyliC2qiqJiECeYLVezQ6uw5VfpXmNfAwwEd0xe5ew2GykX5gLTDHLegKn7+Ep+6e+kct1ZtnBSHoUmfEHCYPVan1QUWHCfrmDYIk7eQtNj8S4Vdk7ztbvOAW0I9fKW3KbNc6BqGCpc/JAABu+0bvBV5xQSqYjCPAvmpcLXHenikkWZn1W/e6mM0KDmkFf3XTcGlaDnpZxokTQzvDfzuqxFa3Gby+vHEc8vfNkX5FVP0/2O+X1R1avfdHBgkzPqsbgt/SVgQfuOreeGvYjbMNRU46BEvnIO9haLhSJqvGz/nJD7AtqC/5tAjPlGlKtxWoV2lu7+2M3h5coA2VGH7HjCviv4jL8lX9H1LvPbpsGSR3NrXUvu+GqSj/XgxA1dgqmwfq5BlML7+o7nDDkzHOc2MulS9LRo2P4Kf5Pv0HLGorIn2zRroBIVrnmHxmSiSXq2XW4xV/4TQZe2vyDvSyFNEl5+qx6hpb89UtMY81vjVmCkK+4N3NT1yrkJyuUZlDcWdOxjIll7kpFpf58FdRT+t5F6s1i9g6srx8sUeMWrqjyVqZC4KRSbYUbWHbT2Mx6Dyc1xEFM10zmBnd/HgZpA9oJ+nCTOFSP8Arcop1e8dwY37WzlN3JXNLhzv/kpvTozsBNKSM0kcxgCuRDZ6QtPYi30m3To6nSutmXWJAoRplfxzTN72rAVRZR9vlcxbMgn/vvXAx7OpE0HHb06H0la4vk9i8IFIrNwujyUJ0evWNszSH2srCbryRxKgirKBy1G6MbcLYFjSn6mi+j3nRMtzqxneEEGXY8CMZHDpIrEEV7sKsLQCyFftW2312du0DRGFaTqt3dAtHmkBVCb08SYNBWHRnBic6z71Oj0cXrzLRCruqqgO4c+weuCTBdAkDd4pBcMPCN6RuvaI0kDFtZOrALiR7kSmU2n3IgNkJOKFS2d9Jys98CAsPgtcIbxU8FTabMBUU68B12JsckXNm3yqMXz1CfB9S4rU5tUQEToY1QOpmLRNznIg/Zblv+a5Khfto5aUC5KZeE/n8YlN+R/h2RtkQI7kuElFo4OBECH4/JvLMXsnVsjTbulliyp13lEvVdW+3L3mMV2kqU8OZqqxkfnyA/qNDifduQ1R2XjHJst7QGtAh18ijBuiEuyNuNmmreFOhljPneK0N8jaujuMUcfVhd1WYGxoEgNoB/mbw4jlbNRDyHg3Yh5LaQdJYqJujxzNBQBWvOT/gBpxTw6H+e7D7SgJhGMPlOc2LSCmUf2mEKHTXt4+B1SsY4GpILOL+xcVBRtChtEOaoebISmebgoOTfzILDQAfdYWoBzlz/0NTy+aiCVeyVpCk+yh4KSRTn4T3RS+eICvEvOuCu9z5unuWC7t+INPupkRxuSwgUp9MeK/hZyDhgNtKEOjfamkv9l7zCCkAFPkYN/Og9DxDZVEqjpPZeHnmbTR4o8uvv1fieoILmFbP0pgH14lciuie+3dakaqbw0prfjq4YB3tcPPDwtDaw5bTOyjk7LM7hnmfkBvEhGytf2A6R9e3j4gptfqoDG7IgI9kJl0MVrxyht88Xxz+iC2/NuBNVh5tN9CUIS03Dd40UHx82yNU+n1P5eQuOMlk1zz38GceOW+hfNk/FYEES5TL1uGBUFI7xZLn/54tU1lZav8VQRl21eTSTYELMNVuExgIvVjoaEs/KHf7LKm6o/0I+QYoR9Fl+OBJjSmQGRxw2844IE1bx2If1G1v4Xp/rPwFezucZSMXHqYRQe7vUOu+VEh3fybFY234OMnt8oVdCTjyUMJ1TzxMH5NXr0xlOZl2t11SEz0hn3nRXZxyBaziIqmJ8OgFeudjFBV3lcc0l9rcfEqVxWmxR4sdMKI74idM1af0TewGgISC5y8RZGlZvhchEQhVhvUR+hlPtho9UKUbFbFdZDmDKBri+5rG9yV7a7HtB3FE15ypRCZi+QAliYA2R7gw8yltXKAnkrZMJc1L/Koe3HNknDVJz0P+v5zhwSN3oGBrenhWlB4MERBR7M0o586bBojJbKjlmWkawkMSRPQbSruAivFMWqvkzO/4wc0MqUvT4dzQP43lQEVXUTcmc0ZnNeipGWKSYXAG+9j3tUph6pXLpAzdevq1ddn4UtH6NRcEIsJFxvqiUHAis8nenH9ag2DLwo/1iIAU/iEJyaQjiItMdSXo8Jgr+KpZQ0gWZs4AvPAbMPgOfdIiiqPpEVRpXsPdRUG/5RKQG/IZAqY5F2cdzdZh90erADpI6LzmewBD4Wg/QmLm8KypZkhwQu5KT1NuOTYBT7VaGMq2b34jqGtF/jscx58xzO/tAqXd7jb24WEvet8gv7a2rIWvEWlnNW/m3o4k0aBSI9qFoJHC2trHjG9i0kKzptVMDfXACoMR2ZPY/QVwEjOkpEQ0S++KUqdHq8coX3gCqe8GxSWtr3a7DTjDrOdZorPo+aE+smrFSIAoWH5PBE98yJTIqe2FaqzEuETTdOk1vaMkLzOszmlhZHIQLe/IkKF8MsL/MI93m1EwnXhfYx7QYakE3GwhMI8rHOINW2JvMyb8ERAOsg4N3ZICgTykivklN7/xlnaxRpIp55HJ0F3t95FOzGFj2kqwHtlEvZAk5An1fLNpItkAaXwbcHXN646qB+9rALAaF7a2Sbo9zNulRgJt9U5Mj1BMwjhnbumO/50RmlphF253U3Va5r9ZOVeHNjFrz1JGTWyXpuwZz3BhEg70dzsWs90IziSSq5oAiQyhcuLibdh5CwZNCZY97TNC/Z9P0ISc1Z/RziJo4ENWgdXsJpgKsMoZY4rU9Z/0iIILKmVCToD8eJoz8wmmTnbzDl2f5RKXNaVqVXbX3MZv6it6GZ2a/s9wlXhNm+aQ7Izzc451AQMaNZCtrGvKFQRRXu59cpBBoJ9Z0YqBgx8AUKktyYleH2ILq8hRSVElB9uFJ39RKFyXYScDc0K8Acu21y2ydwCGU5MnNkRCOikWsTnLp4lJFwa1s9BPK/lyrF7G+Tac7M1sYYfaez62/fdrCdZMrwbC/xtSqZ/DbV5t/5qLiWYlWr5AC2bJK8ZvOxCypJVkY3RNuq0+91sORIVGLlLkFv2S4WvnYXzM7tD4hmVxt1YvbxcCHvBvq1vh8Zt+HfiYJIDyZNucV7k7UAmqrs99uRgG7+2EJhCcTpuPZlAm3cTSoo7xNSzXOivQLafMq9GJ0SPV01+CwWGP1Ln5zxMgdN21zLh7SzwyndGM+5/uhW0yQ3Iyk8TeHGVjMwa7FKA58HJ7LzyIHgax/3uTrFWPmBBpT2bgvzirloNrHWsTyR9OLRbGnZPVhRHVQ5M4ek0GSmIhsIxcLQQujTqsP2sNRpOcOu8n4ysz5LFozCaEszpuLg/Hsrpvvsa7ddO/UlnSe3fkVaflV39cdIomfoOMD1UblNRdgxhCoNLIJC4sTa8mjFzqruEi8ckUZsNUTAuV2wpa96woBTXszIsnqIaZpeZwr+OXme8vLICGbHkAPvOb6pD4XXSaWadAgKgmP9Zf6DHQgKPAgAJXlO2EaueDJQ+SalmJeT74MFMcmKyfHCa5chzO+QEETguAUY6hoX/Phft8qXd1l5XnEvboV7/KOXQfXVXlj/lx/mRUow5OSH9jHFbkdA2VhAXVpOgJeAn4C80SaDiTmRcuuU7ITuli20JkMD2O8iuhtJKWNwF8aFIl3rqpW9K2VTkmCMiWtQhu6spBLRTbX3qSVwMJdmXDRS1iOFBanEz/oHotg/zq+KPZo3VP9OhDpjd8J3aaURMrKYdxS8DdRbLMQrKgeFaQqlTHQ1GNXr5akFvkHOvS4tffXu1rnLPgbw2gX6/jZBr/utK6Hfq+/HmsYKtMKgIpHVsrsSy6HOBqEztAj7ElDyU1oeSk1L5oK9NO2V8TtIm15AVrnhongI8XATZ6wrgxVNDF4MkRyXrZSo+tyMisMe7fYVlXpOFu/Roa0mCBS653i/o/84z489Ee20335FTZXp8qGzG1aXhHhYCVv+Y4tHc6K0sCTkbLaQzfuK2zijEI7mvPLhKYwhvt9enZL0CL1kuL8W/6YLnnbAMvM49NjqBoFr5lf2gHM3E8Q8px9OzS8b0/kw/dv6NOhxc5/d3+XAIj+8/udAT7B7u8GSzy0Hr37suyq/a21gYM6qbPLwWl2EoV5gBfm1EsE1B6sVc1dwY37MnGuZNl2fRDl6oMn0D2n5eTStYJ8xju/uMbuOZyhaWCQUoHCYwksfNRaNKGae+4ezEm0PkSD2NNKNP6KU/qSihfhZ8NKumbjZEXM3A47sn5AacHKIsVeJDH3Wyp16NknYOj2iNaiWFfFK0PILlZ9Zy/m2IYAfcrS0IPOtaPs94nvg7JpMwSakL1wqrxxxbQ3xV2puM74e9O3C9qIVODYNiMI+bZm3X5drPrw/kP6UTqieS75noMdrz5+ONIv2nrgt4lj50emEIuLNNoPJlnLl7ryHC/FcHNFB9/oWJ11thVdNPdZLGiJkRo3RWZRKT0x8fVH2Zf/GMi0pUX+amgQS4tytyi0puT1ByGuBSu3tALeU6kf9nXVVoiGSz2jx18wpGE3tRWeqxQl7CyCEbWuurE4ZjzHSOL5i2Te8aEuIV4jYgz5vAXUb/KAYtOjNCm0taJnW0ClCdRG04ISyVpufxlS9La7hD/iRCXrItdNUxH37Iz3FrLYEl/ng1a9qqxAt6XRK/RVrG0LHKXHBchTiRo4bwdkYwAPZQvXRrqbxcaFuA3V7lQ0U0kmQtx1nseLZvL+ZDEbClD+hvgZSs9UCAabtiDK1HlvdU51DSiHt9GPTVNy6V5ar4/2OLhBnTWLsnBJ+Xaicto7zuhMP5Q4xpJsNCxkb6nbepB3jboR/nD7MUrorQjXSjaARkx9ikgs8XzEPaFNAhfZIZD2ZePuBhbg9yDmp5IrZkwcGNhddoXfHxaDldElb3DHMNtSFB8zwvz5Ke/WpqTVrk66PTcSaYoNuNmYJZx1LKlN26CtTLE6UwwxZWOT6kdOqo600FrACcLuKn0abGF4kJf+cO1OxXcb8zBqFPHCvVu63CaThfLreYej9I/RPqxONHQB/bITVJ95poIcl5i7b0EfkOT0FL3MrMmuWE7hbrCYcVIqS2xGxAegcQIACyMNj/d4SyKgBKoUyFgpEtu7GutHlBuarbHeuwj3iQgL/3snnKiLRDaaY+3pAXE7LcmZMTFqxVUWt6dbE2NcnOr22U52K6LsEfKiWjx0Mirobf2cxIYzhcTcbrG1AEfS44xFmdvJC3SLjTONGaZWkbuonuc2hCJ6hl2W8LpgHbY71ki6hx6wir7QXTNsTAVTLUq8crm6vaQOeStW9z9YXiKkyhDYL/AMAftxKTsHCaUao8PMHgWmGdzkQn4zmqecC4HvhSOdQUG850uQn+gK+d0W1x/Yz9K/lylrL2313bGHsxfmup5dmlZzEu9I50aBR+NCl94GZzNfyBtiuYFFXKfB0pwaZdRCJSE0l2BydI9MO3ua3JZHPUPcQMvtvpCUsuwuWo8+tP98QFaUSJZYDYVsbHfbnCnswaUiLYWsqtJGZNERtVB7Vwjyz9mygTWdI0gkTROqbP6kCr0kMOpM1PQ5HmGAA6UxJJ0LzFOnXEzfeLtUWnYwqw2jkvPq5Xj1yUX6eFYDZT36JJKRIX2AfTJERZUztOiQouJYs3UuHWIdvPs6NPefwPV3DBCgsUlttXZCRsCoLv3y5iTHPwg6jLZAXZDhEd/y1Qzynhu6ecXK/8TwDFCX3jHimb0TYog6bHQoQUUuQ42VQn0JKRQdn/Dxmx0SDKtMgbnnm8RVWHO5Xex+KCZjeOCA2r+GqpFtnMKqr963ekooUoD2wsYN3liHW1Sqpjoo6wUYR0e0M6JV8hYJqeGn29C/olKX8NhKvxB5CS9hvVXU9/d+21qFbBnUlGZNer/BIQQaeBzvQ+oZ3DwOp01YD2AEo1vaw4wB/rYVDp6P1gJv0wlJjJhAhr2UR2ghw0iJeg6PvHyC9bijk1cuzuSEZrvXKDdCPkCx8tG2ptxZp8LNFs36gmRLJIlrAKGaTL/NNOlFp+aEUZinZHKdd9wu7E5XLMjQx0Qu8JwhK4AC17lVj7/mmwLtXLxtxP7anLxZQvF6YOEG2odb0lq91xCWniUP3YMaCDJJZTTMKybrKYrvGuvqK35bwcZ3F2jJRzhbESvPdFJ8YRgeRjXKUIkbuWbaY1Odb7xJwdymI7tAlqXQTj8BnkHCZr6K7oaTrZ3uygrmXgUgZqiEznByDdLA/XydFemuzWtjTIly4tc5zp7XLm1cHiCtkgME8KVFFIXOFiypaEg/pGXIADl7wgEPd2wv7WtIKVTt2Jkt7m98zX7y2mIIljRlIWlCbOktsdLGbKqk3l5UNXZWRJ77e9Kzf6bCDjT43+wrnHDRfk0m9HAOGc1jtWsZSVl3mBPOCyFiJS4CUdltFSo2zE+yGRPkHX9cAgk3DPvysMuI2a2dEhSgfU2BKAsGZmyijiGyuwf40RrJLo4uFq0UR6aFvhgCVbmoDj4Z8ntrVjHMOgzush/xuTGoWJlrcl973H8YtLsIzE3551NTB92ESWEIM0LWtbeNHQr2k9mZzrn8AP0LW2jTHWfLFRnNxlodV0hoKXANLQX37L/E/1avAOEfhsdNdE7StYgxjv9+qF3AFHspyNqWS1n3KCC0dSQYYHSkpBZccG8IaXBWeP82PQh4kevaHyLQKeUbSmFeftSYciMgkXhImejWk1RwuySa9anYqU63TKKzT7nq5Sdx0uailps9+r636YGVRVAkbmmvL8jDA1iTf0kYmymMorSPtKwketidjSmDzca7X6PspFcN8jd+sRO/UFK8rDd5lpTL0Mkn9Pdv7hWi/hw7tTQwCez6Sk4AtsQK6myvdtlQeOUug7XA7ldQjPEfYn1j2gwVpB0jdrojMnGiAr1CEO85gV69scDysPSjVrD60puNZ4bR3RkY7kMZQFS9EWdwhcWqSKNIhgpAKcALHNnlAyDb6lqHnzoWyqzJsrN9gTs9XgIqaYMDLqfztjHUl6h7tJuYaBluVH1YFb8SLlD7oj/hHgrBDMiL8lGCDD+VeZci/Rk10xxZX9JQOStYucBhH4greKmDFCRwDtzuqRoBsJhv1uhlAgQZsepiPkVGHz35HGawCa61165nv7DhrSnLf5iB8EOqUc7BRhITIXvAe3fGCoR7XIf61JBDOKzLM/XRaF+D3adQ4hzZJNEt4kram+vNoyVwKc/KsbzV9WNdGCFJ0oi81uEfJAzg8pZUlkgY2BubFnyK7jAMprndr3d/sy5rh6U7x367lzSSY5ZVq0kIRf4myCwuKN2xY1l++XK9m441lOBIrOYQNGPVHmIrObI9NuLLgjzaldOa+TW47kXStn4moaCBneDbrhGO+QQxiszFbFlX1qgVGHE4dnH3+N67MrOy75mLABpFmaIyc5oHUOUHX8NZRDSgQVcvMri+KgQ4e7PjqzYMw9Q02CyCESDL1nOrCra7Pj2PXU8IPlP57J0LNNptwD1TGp0aJl3l2pE6uCSuR9sB6TU/IeheZ0x0ymARIHY2hLI087PhPpUDghBw32hu8OpKgMQs09MGMt8MEWZdFlhzSo0Jk961CWolhK0VYBCfZgFzcQQSLIy46CYOlvOQrLxks4Y61jhdkTmIF+rYjmvdqDIZgfl/o4Igl5sm1ohQrkJrJdmVk/2wLji+boSDw40RSVee2jsZh86uttEIzlF6Dgbp/VPx2EbSrZxghiUX2MR0uiZYWQA5ARnFVN4/734IPZygG+iTzRzt5Z/BVT+2aNdz5brwMLSt7cXv8i8PQvr1RFTX7OCAdmVDvMiZO+Axk4JcU7xVxcNMefQlGzO111rCB9pnk3NRibpE1gJHZSgoNFjquBD0ZQSQcByH5WcK0vxRQq2d80DDJMVAbF4epLY00/GzvHKELG6WHdIKg7pzUaNQtgfUbvcxroO1ARCMm5umDQyuliBp/ixwhieiNmamr+5JDxI0sDaB8R1drs34ku3kkNRv8OCPvVR4p7JtcH4wWh2oMK3iP3JgPjp6aWyI4rnSUHRwdm5anUyAAraCzmMjv9aJVOukvdgFsolxzTeU3R7sqroS4sS9wLEWXJ6k9pSs3hII5O5xxXeShbovBN68GgSup5xUELx6wpNnp5XlZlEDWHqhgVbX4i+lj/iHYrC2riQV1YcxpvOMmtJykUDl70BTy5qqYWkbpf/jtTEIQYEE0lM5F84J95F3r0/KtczJIqWvAYw30gHgU0t3Pyg7Ek1j3oZ3dUhDEADTW4Lg1ZK7RXCh75NFE/SYZwRMosURP4vVPTBJCV5iUKT9QOYp8XlWGEeFCxAMaNlPG9H32YGvqK6INy29yUnlFXRW0KrFFiRVdKxFj/9UPSwEIEme8R58hjm32GSvgGfbOdT63kd1NW921a70xwD7uN0UFmmZHcWhypYlnaqDCGN/XM9W5WD5sbLEJR/65roSZyX3+CzAMF6M/i1nmVtEH7vpByVICxceq1pmII2WOk7gGApsUc6+DQPlCjfxfx/0YQH+gPuunPCLR8BsfcGiREy/0eVsxFx5s1xrhl0iRgQumBgX8ipFonR4UVO78J1gd9FPaIpTSms4HophTtNCRdyR7oMsg0kfvtRm1UBBSkJurhJ47TaM8bUfdOkvOcsiKklaMF4R4Dy+nVfO5mFyTZ9fR+U2Y6+b78sfaQ8K9YHkyd/55xOwRtGUo3vxy63jx4V1T1BWHSU0gqpeNuHw34KnW1MtKUX75eHShdDZqizd42HEoq0kLO1qAQXRA87MQMRZ9qDMi/pQJzXX8k3ocCMPe1R+wRCVWvbTF2OKmIuMS9lArE7fc/kDquu2m/7uVqibz1wtgs7YFPA7qDke84GWjFTjPInlfjUQTB3StsLRW5QKdhoPcSft51mENEQc9AR1RmQWdjBI2HvhyF+Yy6Ury07a0bWZWPSihE4LPZettnOyfXZAn6l00P3jqmoYm5EqZjtXJL36hqUdd4pJAjus1d8lbRiytgARSOBPwzTUc8KEnZj33Gq0vhpB+igwgQWSDBg7Dus1sfo6InTBf71HvY+ZoMoy46pDfLdrSbaynfwHvtG2xMiPnCd9JrMoxnpNX2tPGRutirFG8n3nyH9n/hrOPAEIBr2MCcgV+o00fq+mjXRFMmNC/EsnkTxWRMTIVlFHzX24jndyiy2gGNU2hMoryH5Az0HEgVUEvlP+xVSpXxKtg+A7arpuPBEeEOxdpifgtLdaTKmG3oMa2Nvmz56hHQIMEq4AbO0LjNDymx6Fw4PluwjTJu3ypi+8+QpYiD5hsE6dl/CBe1BWyFniaY1NyOn7QULDQS+1a/ru/wz6nQuVfRA/XhQHmmZU33fjzUphzUo9/W5WAL0sBi/TKM5+sjQY2WxWljSj8sE5TGzLUAZbsmfJhN36sT5PnquSkLHgQ22RiJbZNj4RsK9u+6m6Njk/gMh+V53pOegmp68LRRQ7HmJcNDFMC57WHtb+uq0VI30DTImvh4zQcw5vz54UzenuSCB6XdBCrSPi/BXu//W6Yu6K37xLBAAW2MmepTxqXxOJsT86mf/QXCfuvHmtFT/mYSD30iUgqKDE7s587DW0w4qVZ4TgQTYbY4CYz/lFpI81UBYEoJcfPSPMLS0Kia4ExAa+xa1bySKPr8svBQykEopWdWBnaOYhipcYpWnVZipNPlsXTSSscoyyatWQmknb6aUKQs46R6DlJmI8+1H4z2UadbpamAPOXLZPcxlyrp4kTf8nZq9hU/pkrr2SrjmqiHqT5Tc0MrbEwpVMK/ELFjYNNRJ8DP5cltY6hr2LJSe+4fO6B0iFbMN1QZuqiCHg6BmsBedNeJ9Gs8XUtN1i1eaO2nCG4jefSBx6ebcBooAa7HfRYwUVr480lDlHGtwRzbNEyinWVkVLaUqLw040xUFC3FSYXGgpCFvhCr2hZa+UgYADr/35sw6DVQQKy5pMobNO+SBbtK/2npPQuCj5te2D0SP3fbpK44fy1If3iGVc+BDaiqLfSHH31jf1GrktdR2zmk1luO5HyuDte303Y/jeKt8137Paux8KSTUbqH5D3K9x3ypIE4L5y9ThMrhXxUYyoVWjne9hrok/XjDkBXs3PwmR8Y3RHXS1ZEDdQd7zv6tBDVH9S/uVbyUgp+9QzjBMljJBN1biFwqDZCdcGtLsfUfV4V9mS7R/6EspKecaJscQCc2iHdiGPTUqyamSrCzvAg+QVXfI4vtPmKinqlt/njyXTaed1+1iF/yJdbhyp8mW7wafTVu7EkEE7cyiofsBaClROVbnjgXtnV4/AJd1rASd69B/KF+vyr0aN4amBfXqZ7g44brBRgN29K/BGRPv+rYan+uktF0BFKhCe9uvT5sEWA8n+gh8fVBPvdPiuu98FxZKbM5KneVs50H3MCC/lpwNDhc+Rp9KoeMHSTdkUnrpJdo/ghMAL9PdZzTSfS9W2UcT8k1TYXXLa6IMj7AkKjabMfX8nm529EE4Vb03Pvc8q80TEA2kQb0Ko0HctBmGFZH+HVUSCWeDky1bHIB9gt9O6ycVzlrmZStlwVmM9H57BDVf5rnoq2LtlISp3/QjF6I62g9SwTeIZ3fcmct8M8UbdrxsSEviAAnQ4h6bytvmubEgx0A2vNMfUxC9bb/y2jD++mE41quZDCeuLQq4yYC9tFgyF8YWQlHvZryjfc9vFsqrPOgA21rEn1ryTzILRZA7qqpOBuM+E3Lpy22oTRzsk7xOVl5mgkFMOHjw2A8gsj1yg75iYCOYkSyaT5Ynz1kLfXXmM8X8P64V0vdfFrc9B1jXWxXLeMFCTfqfkmxlFBjdZu7GumQ9DZNM267IQFxMF9VW2IFT1VxH/JmuafloR5telG6w2ih3XKhAHQZBBG1xQisLzLLaa/2ZvcjFHSN2vXYyGttn7EBdNiyjTuGCrgkpBpCQako6TexU71lZ12N1npqhf9Ci1WW6VAfKG4cRyy0hZYEaAg3MM0caYZ3SY49mwkKTRdp5jfb1SI7ifgX3HC3Tz9xGmj9zIcIGejNS4a3ViW6FBHoW6aYg2FmGQskGhByQCHye4eelx8BHwy3oGyf8AuETSL+vyp++7ef3tcIOrJMiRs/+DRjxCV0J/zkovEG+KRVek9VXC7d7O/2mB2wsHLXkz1ShQ+c/JGVQSVCRTyjlIkIi/YiV8v96tbFz/YQ4d8UFQEbf9Z5Vo/S987rfJ9BDCPpqDzgisGQOUzTJrZopLu+/ntHGHXaXu2t7PntmTqWF2PkUYANb9fidg85EtV1B+4EO74TrVq0WCAbPw6fqDYiCy+FseyKn42+SrocLcg2Q+XJQumj6vMcRdzQJsGqsmb2wwg9ZQD7BKBzCR1nEvFVwAlA0Q8kjGztOWqQ6VK01jHLV+5/seMoEHVTE/MFxApfiRjCPKub2igJPemw0Cf3pNhilWPYomzafcI9IC1uTc1W6jmra95ZBJ2OLJs4Be9KokbpkaiuXJY0qSdC35hTes0CLwlnCaf/ROY1RvxmT1a6bfgsQ8KHIu5N87OYwIEDNHNld7vY7jlqFyxHfEydEGKaG3P8iaJrrJKAZWmeD4+KXs215toznuMYVMYHP4bdOm8fLSK8roDU5UG5YL+ScF/O/6ETZ2KHezDNe/SfaUWHHcVzQ2fhD+VxmgqFNozr1ymkQnfOKP8q6GAtSPfLCEky/Mmx+v6FTCegdeVd7ITh6eW8psZS1NbX190XAvLP24+ZieIN119j5nPT+LrU1iUjQsdi50w2YTztaZRnIqx02lUPh14/OL64AGGNmxisBLNAEcGMSgdIp4gVuZUBvPYxFyPLGaTvlnMtvkrOa2fZhS/7i/+t+8zTqTbole2wOC+26pl873yP/IPQZhQuYpTxzon+0XRtDXpW++nFvz8uPy4/vLfzkuK+Vt7nvuLAkKDKSw5AszqnmJCp+FBW/+cSvsn/9R+Kk6Yhf45NLXoS8M2pG0QdB2wwsX/y3oNZQNQd4oIAMRpN0ywSNh7n48j3ngOXJEAoI1dHUTLhVvBJgMZsFaLtU8JSqBRJ5n03g7ZtV+1AX3GUiGTYzzQWzdb7Fto/jVz9jJtFBNCIqLC0OylJTv3GbRPT4J01NcJABWIkDHrQTTaAfvmTyaFsy/kzcTeYVXELJiUL2QMuHLNcr84LcFYL3jwvkFP6JzSUz9HySXlCTVyw/VcJ9N/EdWXQ5rdhsaYAVWhXBGVvSRtdEVONSnF/idV85eE35TctkPAxm65/1Gov01oijkKdNAFUpMJQn8fX0GChXkb372Jt/+UIQuPY3Ieb/5lbJhBmpp2MYWzEdHzjTQ0OV5RDLxxZqNt3uAqdBaMo4XxOYLo9xroJOSCHAzcHK3Ng0paakEe9y8abmIWEMIxS1xr/6ULsiZpwPhPuh6CbHGHnAUlSiMpz+CmKWEIn6LQB/SMK7knkZvNoqiJXObmw4j3PXpwAlGowrFfGiwN5c2viSwJwGvZzns3ZPdAuePZvnwSsGuzYCDd1NMjzv+MZMXBuJIZlxeLSIFC4Gdy9Ig5/gAK40X36Ydi8ZMr6iUzmNZwYJBwBtbN29WXidcv2y9RF4Fut1GW9xG6C7EzQpbXorhCTWzdTS5wrJ6rf9hqgtyN/jlbd0zkiKn8jM0oxsFFyGw2lSgU0APlKkmDHGyYcUQk4ePf1oT/SSF16CbsbPkc37J/ZiDQmohP1RIV7pRgdpCn2tXLd4jlhjc0EFlcv74rsAqQz43RIgyJG/KI+tKd1I6jStMOH5dO1S54hLHPaf+Ikr8hgloy+/fLS6Gfz/I29mOTrxq44ucr6V5CUt9hvUdinAy0ZdbRfFzxdPEDz7Tj3AV7QQFrmgM3rXlco92L793blvN+1vhIOiUJk+j4EQEiD3hbeKbTuEPhejyqWTr3GNFs+/wWJAqCFPQMirASgotmU3Krd563fJBonk/w+lVSfPe45afc8JZCu6Pr7wr1UjwD5t/K29Z1wZsaOVfRa779DVAgV9O4cgIvRwkeDp2I76y+GTqrYKHU7vcW1ztGhZffp+JWSy+BVkAl6k9l4YDShLhI0pc/QgwivCCBPUrOtItWm47HtqlNYhJimdJsSQqvpKDG1F8BG7SzWxpV0L8uipqdLF4URTryTBIxIJtNa/nwGWWDtOTVH4dvP2xUwkZm5ysiob+NAyIIvdHbyGg3gY6bjNzLUjWJsOSShVgBuciltKcMpccBWAIiIfYhjXAnJ0wS4mwQnWtadMoI3/TMHAMNhdKmdanX4gc+Gx6mFzP4tbwVieGTnMY5s46IlKGJEocUSxxGZAVgq19OstEyruexDMYUKz6u4AiX7QuYyYSKOIpDcWQtjT3LyyOvZyr7fYI9D+VExoxcGLyPcGvIvIxTN2FDb7uPRP5A18zW7znhl6lAJvgsERHoUUCa+GtBqdL/HHNbIvV/v5zwkkhH03YXGDEO2Kx7qghjqQPsMOdyX4oRjkca3/a+lc3Nfh63ivpmXTcHyJUXc4vS6ZaZmyCC5qEDdnkxTW7Gymo61JICXha3CbD7dUBKGtmWbTG/9v+Zu82RRGl4YANQgFncprXUzUgKPKVb8P930yCSf29zqVLDXrH3AggWhHn8EkZhge/qv4O7FzvjgkofiJpBLvREMXUnzMbRFR5fKbkXPm6wDxSeAXKJZr3xjUQJWk/MOID2UNCZtNUuTsO4ZKWfs3MUh1ZQ9/ol9D+WcTwxK1diXdSPxFEIbqrCKoBM4odznHFIWu+k0cR016J3+ZngSHI0hNYtXriVldW5jGhyyYZ0pqB2thYkkWSVti1zrLmnCXW5BUgfZx6Tbz2msG4k1FtcPieKH0OvOVlPwmHKuCDF2Nt/vM9dxKeg/x8yiW7/YFylyeQChPSPtF9NlroJu0UTAILpQdJ2MNsJlL19nS2abvQEk5s46qe6WGA0VQ6nba9PEK0ViG2zsc6TSHRP9wYWTXmiVbgutIV5eQYrNb+jPQhddVGagofdP9VWg5LlsqOAk+wgtD4CD5/Bckn2zc1yqMy5oBwnjURPcO/iQZxyc6wnN3N+xRGg6XHvWmP/l593sDH+nx2xh1dJT5yeoW+RKy41+0EDWqqE0u3zsvNOLqanMYchxMdduO//bbvbiXZB7fGbt5EIXUzQLA/F19qk2b/O041D1EcLVTq9v9kfbD7aJM9UtAYCOjTqSg2eRemy9I9VU0kP2MkewVKSPUN6qm+QRZ/5a6UM0RyGb2BNpQPv1Da2vFdhfpVCkBstnoNuTNvcpJ/4N8izQItUqwJnJh2jDXRqBYp5FSJgQdVwYH6Pa029qFf0FCtbXKT9DYwr8nzX5rpdaOOOqH5jqWYhBggudeYOefEy5GgQ8VWxlU87BPCMoZjlBaZO7iJ9WJ7LpDFcE3Qxcvjjf4iGEC+4WQou97hgM3e43m3jdFIo+Ofdr0rHQl69C4qfA+PiVqyAUI0s3qkd/EDkw9sdZ1VyDi/dDDGOB27jIzZAMYSYpMLE+CF6v8/VjQR4nDb/hujkK81bG/O1YYyeU90WGYM+69cbMYbpV+5TtM+ZqTklOhz+4koVgpK+HJKEqvSTuFxjS1ZUCaUIlt3DzdCHbiZm5ARFNDkgS4Cl5ORmWva0/ACJ4OIbVsxKRpGq1CY0MYMcQHesREKTditTplAltnTsIPKembPFrWCn7W2L1U+ta5fbCWne+f4peqj9dZOCAoaXaC2iETlmluK4dfWxEY7Iqdn+Po2ueYT7iu5HyrsXRraJmR9Nd2jS9PTlGD4KSJc+7SSePtcnAOIbRGMtY6QLkWHqRoYYiLyQRZUcSoO1cxO6kR1S6A0P0ShhiYt/6B95twqSctM0C35I9LVS0pfciVlJP3c/lJFfXveVabVYOzLcMSXAXsHzp+luS3hO0AHSApqwip94AReVBu9jGT/I0mh6PED22v6I8xJdI6CXVz+MzL6Y0H/Wf3UZoGTAuTKw73YQj1V1JjTIjDwCV1Cl67oaDVqT+rhXFjOFBkcBFN7rIjkNSo4V+6rEVIx38ERUp22HMPSfinYfT4ist3lVmcg4SKlC1ZwQI7A6AykxWdu1nR4+k4w6lkum6k6ttyqxWeyjgSpzP2hPfbLpUBK9KmfCOfhs742HzEM7MahKRDPAZ5BSktGhg9NbdmD4fXlm+hBTMm4i3+8zA3mxhZUQWw4snqdkHkVucF3nA+fpdEArbdcm8kSUxWf6O6TvtewCkAOT5a5h082kGGOGiUWBXnU+RtS5YJprpOPubXaektCwGQoYw6pVDqdyIG6wF6xnmHydiZb28lTSvUzZIJog/1pXnbIcdR7/6835+1xmiAfRkBCiUop2AAQhjuBlaKSk1m4ko1BB2tkxGNJznth6y7E9l95/Kv4cLgMZ4Wv0R6Yaa2HsxV6Sg0kR8u3egyY4TajauKWK9NXNnzN4/zPdAnTNI9BAOmNQOtvljwqq51Q99rMnOkZA9hv5E8X1Mt1M6oo+gMZ3+h5O3vcpFGmE0E2CSt/y5SmGZyZlnR7oFuqzXcMwpis/sQr9CX5XLA/Sn78xpx8KzBHTN5uk8SrOCBkpiTs8cnBOY2Fc5/n6EdPwvw1FXQtiFg5y4ojFgfIQbYfL4t0BpIflQxO64MsswjcMLQ1HDo4B9cv9TkzT4qIbNmFMCQJTbS3TJUP9zsewecAZ/UzdyOVsXj/ds/ya1wOH3CAkRJWfFNhM4AqGCtng0wjCCgJm0bpo57eMvCsIzzr9JogVigqw5djwjCj8Fzd2k+/y4BDaFfKuVyIBbszCOgtYZVV3xiB8zq0fAg6VCbRbmRFUSXKz1rfwzddIeg1Vez6EGk5vWHBG+q9ww8cNRqyabTPEmNCUkeUgAqsV/sab2jpc3jW4WszlfPw7Hg8S/QklOBJSKefuaIsC0+WAWt2DYe/2YQZ17B02LAJs8pfHvp/ZF4rCZTv/tk+Kf3LCDW6N2O5QvoRJRR9jZ7HQ/KtofqXr8QUesCb4SbmlN50tDTh3nsK7cpxX+ZqOSF3c9uhBLZlelqSAz3VS7eqm87aZbPfnSxYw9IcCkDzT5bVY+0np/HooPt0kZPtSE+gIxULHpI12mQYW/AW36vcEozg250B0ai44z7QCH6ayuYTK1ocV3bKg7gS0n/mUfHW1VU/KoxcxH6bMCT+o/0IbuvnLkHxn3oefFyj7gC9EgZFUoWoLOpKPbpmYugJG/KrWY1oW1gGk5rLeLGYPTv6SfH6jGimoBlzYwbOEpNJhTVwZbO59nJNf79bTcWbCrH8g1NLrRKItyFCb8yB0OYZBHrQUYnr8elJiBKK4ONXXU5CCmU4n85iHLj/8zjM2Fya+haOTrdAGfMeY+Bj51q0HobMmTkyIT8dWb64l2FvPEqPDKJuLkpCs3SaMtsUDYMyQ+RK/t2jZ4E95lFdNLE9E0Nlp1yI/1CzEalVRGwR0+akDiIHyK9ytTSFRarnkvz1l/8YVOPckTtV25w/AGvP18RWSFJgQvdoXCb/ZYZmZhVrN88mW7gjoWLgbhj+1zChnMRo0i3n3VbLE1JQmt1mTTcmJc9R1NaPHI4vjWE1yevqvbH97XGuDehdd2RNPFk5syekZJ62kdFXeKlSV+WeDodQ/jtM4B87udoSmEf7y9kjWn0NRYt8Fn4TJIC+/W6SphcXoFndWcqjuUDTJ7goU6/vyATHbVGsNn8fyHXJLf/8qiZSOzeZsxs0q98faP8pXfUe+dJ5GOhpSgk2mcAnnltneaiNnAzZ3rTa1hm5EvW2jVXIP3b43/9ytujmAZxjLCC5y35tGJhqunEuuA6UV15Um0kazt/XSnTF37WZ3+j8+AS6MmEbUhdGc9bklX8g3LKtT7ik11kwKcnNEegtzg6dnN5Sc/PnaM9vLqanfFbYY1BE2FRC+0NanPybSkr03MPMa5Tmy5MaePq23ma+9ksimiwn/OLBz0JyDSLAbUjeBbNczYjDQRnYaIGca8X3FBZBxnPPOljk9TaDh7ZOKjNcLJkf+SaLRO3qAUcrFPH5eJqxepXMYnscIrNkTHhN7/X/or9o3sNTbNw4S8eDIFg49PmGCK1F1A7fWjhFTCmmG3+zQHeJEM2MBQ23UuQ/hsRlDrd8DPqzt+0azIliij7FFgs05kq64k5D1UXjzDBlWAzeXds+/jca+vzcdVBHoTNBY0R12xnqnxKOxidrKMq0rl7fv+W+pYUhyPNYX6trKqvFxt7xKpiNtkhdb0bWWvtDBrvnlcL5itCR5B/Y3ZHNYKcWxZOzCulH1e1j4I2dr+09l2i36p1hy+uHcJgjdcX+QkVZaQf3WzlR1qXhX1+KLRv1kxe4uPBCHVJ+RzRa8ymWh/l5FPJ7BRIGVTz/2e8aSJmt9wCxPSBY2Sb48YxAbP4klqylIun9++jjpWmR3Nlu1ncDjJ+Qmv6tRQ2thcr/dOwq3Y1UYtjoNIpOwt+djepHUSkj+ubhc9svUswTLofw9Vx8nRSvfESEPEUnd+l8+n308blpPT9T6HFqY2JQFP319FksQYkKfn4PLSR4oBJO1qd1/qWSDvL2mOQPBcbJQtSwYftXfakHCO8EdfdykxUsdJtHN1NRKE9Fao3fm0mEOV6m/fQyL1jDEqdUPiyXSOhoVm0Ve0nOGE7Vo/bPqr2VoOCKIaUI+ipjGQeUXK/T8qtf5Fb7pi48yMnDYqBzKr0S+UixyDCLR3J2YRWd2HSs0NtZISJU/abI/b7sJjKFeOtTVl6L1ynlUmMGKCmi86w24DWUWRE04xjK3pfACaZEEfhN5XXObd6xOdOKW4fajq6gKYbF24RyDVnt9AeLQL+pVzQeEGUC4gRG11XzArCizHQ1/GU3A7bCI6eeYFm5DZpBr+E8hzfUb7aeG8lf0BT5URyI5XLOO2a2/qZIwY7sIEOxNTUaJS0E215xXC8kbZzGB7iJCobebz33aT5TuNafAHrX18tc/VonxdZ6MxJy0L8DEg/r+fvI5zPNe9rymVBnF7tIZa22DgCupLy0mCMY946+7pgBWB72t6SaYOuF/xDOMYi1pvJFd5meIOjx1+RqDK9EtQNSRqnrS73gzLcZz24cllgOCYMt24vTCuspV2JYiM2qt4p10OCx6lWOu5r/2UBU/1qEnvjcxKkMPVS1wHb8RXcJpZGhlipAt6FH/9dBVA+F1BvnC1EjNWOK7SpWF1zhras0H/l0NrX+d3Z+gJbv7FVPnZheYU4WvgZ9STCek8rcIkPG0H3XfTqC/JX1bRBW5jyk+Eftibxv1Q6sdKCqjBsWA4G97OV5VGbAbCrAhCd148Zm85kK2kLRX/jdKLy/00V8u82j7nHUMlnn7tA0fgXVYWdk3KyYDvye7OyuqZyerbgsa893JDOfd+DF0LdU+V+D7sg1+9Cbv7vUEupvHbFSuPkDl4st2r3VkC65DquXaoVFV1XpTh9Q/OkZx2AW3tV0NjlyO/5O3Shp4piU/yQiskKMosDKmbgEQrSk8EvqOxUeIvSzGipJMA1taCjXa2L5X2Zg9hRoPjIo2UXLsJ2STlirJwUbpoMLSLoqfmCB8v+pl5iPhTCcbgry1skaetxsQ80w/eEKg/I6VE+mrJBQh0YJRSck0V8JnsJq2l3BvfqDodoYJhXqyf3fqySftfHNJD3tpjMuSij5tRwKCiHegjkhR4HEYLbjzlLvXGRLBtAmNN3mQwlnQgzrOOoLQcbXSWh6+6S5ZjlKVplFB4+SAf3hfVcVqU4YDvq6kjpwI+/FKWLm6O86XOZCUlVWeRCB1bnU5HoKDYy6VKAY/4sQreM6vcz5SmQT0Z6MaDZgkkcOo7FtTbIKg1jzt8JhfOJ2QRwRq4evJil4zacLBZJNrdeTsaXso3vpEEWAIZ5BjQ+vq6wc+2Qqh8WiiVrCfQU20M0J4KUloOZEyTIOthGyulkOAD82FzVBJ6FRsLX6OVFy9ifwWeaZfU2fwHtRV2wdXC6cCKdjdnUuBwVK0e2ney9Y2hmaC6EKToZzOjiWQaJ2RkexIe5g0I1cLVC5zfj3z6MVooMn97Q86QVF0lhG2WF8mlEkLGGEv672bYwUPF3HVJ3Pn7y+sea3aFrSbMaMW2LTFGNqIiDdMBWfXcDNyM3qqxZbl8IPfJjLOqdyk1ch89F9oJ/8ml00UOshajLaHAN/1xSU8ozO5vItBBTf7VY0wvDJUP/9T1+KNJTwIvNtwiL5g1U6eCUBFTosjWVdMVs5ahhxZtp8SWRf1l6CLnHLEHENhCYHDCcrlFYd53+rGMfiwMXasFU349MZsNUVJaWbG3PPQd6yWiNjtdlHxVTlG9TQZa13fU6tnp9EVU4Xjj8WOiIqER+VImvh6cPV79d+XAtAs3BRZ5SWO5IBq29Vd4D5hWAsI5/yeSl5yHQ6u8W7+U2kb4vVp8QvrE/JwJ11LrTwtssOl6GcFO215oOjYtUGKExzq95ep02pgvEgnapsXyiC9qJQH65QSkUJXTpRvKcsgUS2b3hfNkhi+ikRCL2dWypoKgdVH1UioWpzqkPxrusg+5SinLDjn6bHN50uUsvMOQPxmIFMGY/mCPWBAN7UUbOJbYAq5+qXVOdWi2DjBMnLO+da66hLtAAuXue4U9kIacPY2nVmRE+/UXzsT2vvrzv1tSuvAA/RtQN0NjUyVmsLBm61ycWrc5KmHPbBDC8iXgvNvNL1xwvYt0dU8KQ1q9h0jP4Uwd2xuxiHc7RgCC/evdQu03jxoYclWgL0E0W/HOVJQCSzaIVt7X/PMlS5KYFHUSB/xY6N2lA8RWmAXPDrTjBB11BUJaCP5gxNPA+xTHcVcd7qUf80Ms+d0Y7E+jy6guGvqOD6P5l0DrXZORJ5LgFIxbJGx72r0LeiV7I5ekWNwO1ZLpasGLsJ4Ef3rS1AEafum4azalviOVOshy1Dh0ZHMzZN4f53iUM0OUhAcZfce5OQX7dhhMmGRVMfOF0oTZ2exBl2MWNU1BUS4skRRARzF2H0sd9NzgF6ebRcwV7loVngWhcXjDeInD3CsHUSdtgpiZdsHiDAMZ6k7SmAMncdb0HXnw+uL+gPWAD6x1VjyliTPW3ndoyN59GlklLBmSiTRLHADOFOURnaK5IBmUv8X3Yl+CWGHXDyxlzfL2IMH7M60eBST86AGK4mNWnGo+JkkWevnlGytH+Ak0Xi1b/YR1WojS7FmXkXTOtcwChv6qgRrM2cGoW9SJ6hxUqTgaI6sFehbrZ8hHaJHLUJ0OyxvbYML7hPM0HHMl48E+RQ7Y6c0EK9bA4wmbp8GDYPDugrnHfretBIIhx76G0teUBV+rYT+7kbNd/4fBCdpTAJcs2Jba85ISkfwMLZdG/hEL4eguX2PfgRFVRAC8tSNSwiDwq1gRnGPWQaRN5lkC1gkM3jWHiNNW8x+VFwxOaqG47agi5uhqpWndrL+9VllKAASgr3YNZ57mvZb55lv1oR4XC4zq1OYnrBFu/SXic/bXWyOtHYczl5x1d/1fj93BlUhhwCBQaHz1FGdvFAFWfv2TJAoN/mCHFTVadsAYlCdRv8rjKNfi+5awYT6ixUozbhN8AlCW2FT/ZBNhkAOw4ZTtN3YJaVWmS0kPL82ixithVML3Lfe7TG5bObrVZlJDRyK9sJgr/J6aqPWjzyHLRMQQsQS5Ylt18fR5XnNl8ijAK+aAQjweo9gG1z8MH+Lj/aglTZtUFJPRi6Nn9iXKqDwzXk5oNqfESGGDP+rKfnNnfvoq5IqTePZYF0TSAbBfRKUtXzU7OlaphR8KL7U/OGBK/NKX8//obkxSTEQpizQffmMxxQY9bJn5uo3ujDOS8e7OsGA5Lg6blmZgJkRKiFv+mtOhMcWtjmZJrlJcQ+7O0NFoWWGkwJZy7WAmeVeOaZbVxaZ/pPBGUCXbEp3ZlSxYD0t7Vv7cpqykZFFLMLystmV8AeGYKd0HLAFiGMvp/XqsiJPCN2N6rceSTLp4lRAiP6jEg0v89ihK3WrTS38+2GJY1Vi1Btxb3foqIZFlpLn067kBsQfInoC8sexua66vc8yeajOUX+PpHkGYNJPdgxU8LKeOb/6EMwJGWdvqrrr4xNiUa0iLSjvyDgRul4LdOFgJSttaDd4YYWoX2EgRw2cb6OWf+3cIgfQ+rslnzXXPfT1ygAFw734HQ3Arts4/K/ihUYZ/TEu3kTqAFfVQO+C3TF8YBpEUHxIQBbKr+JebpaCcf1CU4ZcwYYsb96MV/irK+eNjQqvO+ANp3kcYWO6uRIAL/iNjSJKfEo7dkQfgpktpjjaE0CpaPQCy84KgMtgXzpWF3FRjzQ34meKSP+J7b2m9mIRhn/iXKTbBo8jPndvmNONn6Qnuna6/x+X19T5ZgaLYgaAGCrPU5aM/eBSH1q4VwcAlrg9MOeUVtdHJgtN5lnXUNSLlAC2O6wi+/sRPtHjwEqaYB4WqGFEOwZyptYT7kEPnv6yRCOEHANpgM0Qpoaai9zt0RiUa8S6G0Lvk0BIAxFt1SkRRLEkpacQuICLTe5ZleSb2dywmb0/bVp4A/qXiZXlraP3iY2BBWscQoZ0GXIOEWyXS97hxbymXMJ+ehFBvFUlx0QlGoK31GoKJkrbYJEdM1nfefSkUEVv2iLYznWiUH4nKZA8wolZ4MBI7aItEmDMPCu6NLwnUsbzTCyeorG5lwxF/CzYgae7227CI5AhD/dbIoQGsvPwSnfv5fyzX/LiuJtK9/BwdMbF5AZeCNnGMXX1w8kcv9z4mezkyzTsGXJgb/Oql9BTrwx72/HHlJJnjXADzj1DB1eTb6XIdqZmuV+stHlw+eOvPwtY20mFfzMX2sq6uKEPXAD1IxlGpTH+tB08Z7gZtn3NTDtUNRIZz5mgoXDTeFSLMtME+ejgQfDYahddYwE7bzYspwRou0DexoGaodekKbZgWnCuBTj0ZBjFpgsh7NyFGaXwyjALnlmGq/Gq4pBDsuVH7Bgpr8UH3tYOQ0FljQae4ct8zPS5k6C5ZgEGZlifGdwhBQMQrfshb9obqS0rBG7ZNmE+i3AdRzlUkFOfDRhRxEU6iWbf/Gs8vXaxJvfpy5yeQHUK8VPwQNgyWsvDldWo39KF54gWw9oGXQky3xY1hk9JnXuL+7fpms+QNUCO9SB2ylp5Ga8P0vIxpf6rnzolBlk9iIrNFUKFe1V9W0TtAHSfXRpovkQLkDAL6/G2CczNY+yCNC+Jav+QXx1shm9ayVJQY5HnYFH98prru/5oqjgQ+mYW/hzHtGfh6x0e1w9ECEJSXwWjUrpXMHVDZzYLbCevaOparQ/lXUKEiE1q7rCvSofTrtp8QUjRB2IdGV3El/HciDAuuVn0/yUqsYNGU7zmH3wYwVhfMA5wjqx1zMwENAbg2YSOz6Jv72O+NLMj0orvY9XL6NQMszLT7rwoW5987omUER+8G6cGNqT6+J116+vLnVAFv5jGvubWlyrG5pp5EHy7ujvPikCNLEuhmS/U5kuo4ngi8vgyyyy+3EGvj6s4jykn9GYtvb55FwedWlaMoqS0a9t1nFDqiAH/AQMiAgajg4V3Ck9zeHKm0leRfcIeyvWGwDRPKAl0lFxunYGuJsoPBya+GucUTmJlX4GTi/VqEqQf/zvOa5XcZIxwusarUsatGCCVj1Q4dhJO6LiN4b/orXHuaZvXTGZbVH3FaPtUVrgHVfzFXqidXEHXC+ywdGw957hndbxmKB/TwOxA3nQF0CoPvT6TBss7++BTKC7rU1c3QmEDErsmbzJXHTcVT7aUiA7M7p51mW75I4/w9iHUYaM4prT60QOf6/7jmUXRdpzwtomlDsm7kspjQICjGSURRS2HnKkU5QDtVhH+uhZi/pTTrcfLMnlun2Eqin/V+vZ7kX8KzN7P1mh7srzmo+ZuzzF/GOwJXvyTwhWclTi2kIc+LMAhol3n0TdcX7SqjdVB693KG938PAtztDOEXMg3Kq51Ir6VuuT4TyXAD3boeMxSuBYvGOsba4inMq63XympEL874ntJHg23F4OZR+YvERJXdVjqT/oN4CBQHIOUCursxr0CGnFrVat+oHXu7N00gxeyw5uHo4ky1PGoASjNccWI59v3irN/zT/Tw4sQzIXGLzBhMEvIYntT5S6h/C+wvuuiGJkKXICP1tc4tKfzFxyb00AR7zb/TmvabOzCYRcQ/TpWu33cESM89G7IZcKtDPsu2gQdmD6n0titHNKPIsDrjva++l/LCk+kyjC0sxBtBFb61zGrz6qgTR8WtB12FIQC6HN8MAqwiq2T3HcxJXaisoSMviGKg045VIEEAA3OhQFJpTlnXizUVOrZ/UgGmXkDyj7gcp6oGmH4+6DnoXeFJUDU5dC+iMZAvtAymljGqdRCztX+E+WbN6qbJ5U3jHKwF9HoQGd4usQxUdfeie7L715DWcEe6eyPSwbomYTqbQPxRoevIHgEToBLH2A6AxBSigaPMp7PiLig0ca3/1IGRykA4OVFc4UIUl8ZkP/QVJXOqhEzqN9xR34/rpOj2Jx6w2ZggCSAe5SkEg2uxesb+IDep4nKIOPqbtMqQ597vJKtd7CNcAv53tfOlGttZCdesFou/N8NYoev0D/1SHaskKv23ute9fnszrCJ+Jbi1+4sLglfzrmYPf0P9kjNM/OsMO0UNJmkIIp+qxVNwPCrx3yw+u1aGOqCvVY2YSREn8TyttxVRDHVGhJgnw0NR4tR8nUvt9rTAkzjMi3voX8zUrODd2cDRBLFeoAbOzlt3lbPt8h6N4p7Xwt/zqMcEmACAXzgK3o39itb3teWvBYkXYyj7hsod47MH4OPgmgQ6ysmQCwCn6thOm1NN9ybFZUfPLApnt4JZO4R+qDCmyFL20HPC1/oLUADh63U9S7ZUGRLzx5DhTYxDRUVpOf8pYjmwEimj58bBnBCXTcV3VxahqvEDjr1kKwUUBZieQU0gsVoAZRHfOaTbwfor8v8wM/5Dk0ya5IOHgz5LWJjHRE9QxhCJKS6rKhn6k30GkwZMxflmi/Imz0L8fiQjBIgLIk9l+q+ows4bmmnpIWk7DxxAqXborq+/EBoY3JT1i6b5Q2G3boI9c+RC5ptIpHXRoCHgZ1H0h4U7IRKKj3f/JHf+gZhs4q68CJ5d2u1/RpX4U2cW3gKaPRfl377EUoj8REgLKFdfQ9fBbZGLMxY7rjUUaupC9qLMVlFWqAH43EnEvJx2VWwpPl8rgUwFtzf/oorE/q2rje0ChGlW6HipJTTOHGu61TzCLWad+Eya6o2GCks5ykc58jOCrYh6SSHRFkoRxVNKCus3zqPeVQBiP0JOITeFdtOTceHqF283SBAEmXWnQgv0F16txq/R2v34Qocl5YbIRLxglLaRFQuNVrwNYuvZKMxG+eRxF+buYJjy9JvsIs8YVnMQpcKoRYFqj29J9bNrcP679JlFhAwBvPYDNYbYfZ/c45i9e6zQqUlnNvQR8Hl+1QSWHe5S4l/e9fsgZh9nRdFVNj+8Y9pKDrI8dr7329sVJa1OpSPnWXOogiqVWKGZj/jMlGnB6z7b3tHFCpZX77u67itly/aXAL/0ObbAVN1//lT6oHlKR6Ap0z9aWPIn5p8dcV97Cy/N2wRDpnNufuuHqS2S1PjjvF0SvXl2LOK5lSP7IL7nCPE0yGc99/urMqbUAXq/01m+UIwgr6gPx+JjVmuQwpP+NlC54LYATCLJcd5LPlu67Wu3x1RI+3Npt3gMGkJvMA/OZN82OWaWuaP9sH6rpGtXGrwcMnIJlDEgTQnCWg8/mQRt+nLv/J/Qgzp0t3OTvBK74wr/09XQ5UQ68PA3aTnBtth9T/oV4ksaCHimrDEAcAvcV4NqT1e5QiSOLUj77agdtBSr6xk0iGEmOcngz3exlh+Bx0R78s1Zdl9DTBwIBUI492K6cSPHrGZ186AHJUVuymuMEKV8o+MS+HxyPixVNVqD/4Mp5xRGJhTmhJOhMDn+MzQY1f6SSUMzd00tQXnDOn8tYVEBS8XVHmE1gG8u7f/HBJx3UzTN4n0sEK+8I+heu2lzGcIkS3wELEg9SRmvt3a2XUknZvhAkh96mpXiXQOU4EzPD+op6OMYvV6ZZ8meZZRmHTF6cjDxNgW1FVY+nM1zRHc8vnSg4dywJut9PTP5o7Scd48MYIdemljZegfihXLArPisMnVPvsW3XsdrwilzAbizNcxepksjESGY2E7jjA+b8MwXVPvzO2cDvLShctdPi0VPb4SXmODX5Rtv1lfqeAmBtVd8+Q4mIq20cPukuyz9ZOyDpKn1TDhDMGIhY/qOKOV0upLw/7NAmNoIacGVPOO6Wyx0UprLHDj9Uv9LxmvueKymMU2CltrD5LKcRFVr19qFs/UeBklOBjB0CvjzqBlr5Cw983J0fypso/KoniCr1C1iS2t6/skJxvmdCsUDp1r88uqtO4ghokDoPCJJdQigUuk4+Ksu6tUfX9vOyPhWcddbMf0iMBT5TbUHhCIVaSPlWeAKH4KADDz8BT1xQ9swdZ7sfAwd7X4c37RhQQAw3IVeVMy4iAgsH/8aWHVB9qLXfxekJuySxFNSVDDkNk0Yl5JH8F+I9W+elHnc/AvB2/Ju0EfpnaBZf8B3L+b5P1pGBycOolpm9ReMHzkRP3q0ud2RVjB/r8B8Tlj9zu1yYgEB0KgOY22DTkS+yuzoFbbzI1cB2nbprK+zL1oPsVFtE08XeW+3s8WaNSKIsi/0BisWAxQJZwCloiYrfGBITH43oRGeZlMnj0gvnTH1kwSDOdAQSD274SNvjn0yMhSq3J3RWaCYyILKANEESMvCef+6rZXlC+58d115nGbUkWUS02dz6hbh9NiIAEFXaLmN3Jm09Noc1VUy+n2IlhJs45bCx1P3rChdEt5DefO8ZV0DtDQ04hhAmBsTPyYZK0igoDG3R6XRQB/7VwEY1MlnRNYFH2ipZnCM/0Lo27okVIsCMC89dNEziMgjcgNgeBwjN36yFKQv8jv9jt/TjOWm5jcshgu3IXkZqZ9bHZqXswtbQQU6I6XDcuqqkNTwUiMyF/tpbQicq4MXFx28BkGq73fiBMV7XNSyUVCsz/cq+2U8582XwDxKjacI74ZRrsz3sIIQdeMrBsuPTqSJ6oy8s5nYwn8UV0NEIxz3INxmfZz/SOBJWrw7VIE6nriR3k4F1k8EEBd/tupT3Nt2JnSqOIo6JlRNwLgver85IHDwIeXMQNbesWcIDTJhsa+hhqCsLmkgv54aDLU1fwXi2VQXrQNEvglgwFQcg7ubnh8GeU4uUrG3fAS55bKa5NgS5HvLJUFuZMLPyIh7sLOFrdW3RrjIAim78yv9JDXxS8LLWv9lOwydvk7M4VeuAyL40nC1JIfPXi32xD3ODsoNdxqTBv6zL+rg6cpLZo1Td/FVtH+aVd2nEMbUxTLp5uR9yo9h+YSswO4xPNM0ok2vqLfiWaa2/M4RXJbraXbnpTR0skXC1JVhRgFRcK+dJo10/VeSbV57C32G7X1s6LTSGRJ6C/bya0E0KV4Fr4QTCmyJHU50VSULPKTfwqFGz1ayv+NT+cwvUO8xX/FLsAJp74nh5Gb44/+ls0QbChhM38w8z5mQqD60dRyrFUDpH57VblBkGRn+l3EnziBKgbuWCnsk7JR/qphasT4mPGSgUf1FeIWQN624Bfow5taoJgIFx/L/QXHyejTq4KJ03Ows6PeBmBGVfgrQDljmHQqutRsZrI/z32AoaDd5Nwujl+NmjJeCTkzyA5CsA0GNuDiHJYVvhZtvWA8hPY/slOSbwkBuWi7encZ9HE6vFqjQaWXSt6s2WhlBqUbh+/mq6mfvpbjiMx0gMherJqihXleHBDw0pt/w1LcTwIO2PV8eVwGOBCpqBg6vSwOQDzWUg6/FwkTAl+QVPuaNoBld5Fe6zBuoneLiDUDOndZ+sKnp67ZWyabXTdR3yup+U4CIkyqxlMNQu4Rq3BUdFrFyZutAX8WLLVzMpo6WfxGStPK/rR5jJ8fwuWBsGMFSo/8fBzE4pRXFY9WrM8RNrNe+u/muCMZk74Oh6JxxEyHrUn97VpV48Yk0oS+QVC45Ej3daRSG6cL4RYZiE8MeFWKAOUGpLqYCDuacgllssXVB1hnc7SKfg5zE0zEIct5zkOOLjP4u/bknkgxrx7Kq9Zh8DdvwpkbMSX3e7VDksF82Df0Hb75suNWL4Bp/M90tnWrHZwzqRUpGDXXCmnKkGlt45uvHWR3negmkPpG2BD5ZhFadc9/hluNKklRDNNAornuxvc3iUgQ5/91EB7UsFqe2yCVz/bzJ/BWYKaTiWnqFH9QAMjEJINvy33XF1qkd5/dJKuF/LMqjHWd/GxDg2mM1Dk5D8HDRT8iWeG8yATk53eCKeQ98i1R9841fTwyoTwW7v7VdKLHvgSkrbd3JjkksTZP4cAKr/RF5qeTSMtE26G9upCZ/nSKDU2OkcF6Z6hXPtxLDC4c5/+iGCUxb6uuMSFx3J4/9yqwOFnSXmhaFP+po6qJwITQd8Tj7gur5W88RZNffuPPCSWaNXoOKZEoHDIht5N/eTFdUJKnm5SAxSj0GmG+WCQgh+0gyyrhd/NEc1iM3D2dzoUn/lGqEivqOrOfMWlQ7w3nRkxNhro0Z7u2MMQ7VM25UPMV+a9Nf+pGO66mR/HkXbo2PGG4IeyT2HcNNLafH7ZGLjIxMAjogkDDWN0uYsMKWddj9+tLsOvBkeYLoay4NNSSQiyyYbZ3kB2vyBE1GfXNyn/cQBSspwRLlVEAn5q+jIshnfBHR8S3dUuZ6+6xycwI5rCMoOKVwCZGNVUJA1t/nbZPch5sKWisCHhn2ckV2L2qizD+KVs9xMPx2x5fslvAAhk32wPe+6CeA2dHZ5u2oKjv6R5XEks0Nl79+Ucmbz0Ekx3vneBY33lSg8+a/Q+cJCVPIm1rCNORb7CnY+ZIge0y8hG+v4zy7zTe1NiGrRGbjansGgWymVjZnHa7HiU6DyUJri/0DUVeHpx63HZMifpHXQ/vXQzuubIiSHjaNBJ+H98bK+MFL8ShFAXOcUUoBhHvCs+qEayvVAMHtnvg8e9MBimcrh9dSQeDz9d1ZeYYHAaUF8xp8cQNLPaqFAxTb2N+hvOi1RPE/M98k4ClcAiFMCIZ/VYHk5Ys1Vx73l5n8eo/yDKXZuf5LP9ZdDhMGo98RU3HLXSV1bKlSocMv1aRFxYAxfS4VG7E++QccpaBY/QeBcWNno83Mw8cTlSm+fUEoHCRTr650O15zfc/f59DORviXzf2ySlWkT//c2pQnRgxP9gVM9M49/OG9jCJmkvGC+yXkMmQ9n8Rxz5BAxL0UwCsVCqOhDEMNa1lQeRyZuQU4fMPqVJHQXJATIqVDMWHBN2B4H3DvCG9e2B2EgyM2Se3E+BA8S2qvksY6S4IMiisI7TrVPLg0j7YkMPIR9z9+LsmxI7euMEdLyWu5aLs2TMfgOKPW3vWqB6PdrQgJuvQYp6Ux1KDtN39FU8Ba8jMazfSHDwxtI3TeZZEBRF0XjPPv+47R6DUD0/O9WgIo+gpjOfmg3A0mBVJzh0RYiyIdWmcB15FvlNMwSGz/yXQv/rshMDkhmxnbCsiQ9+1CWviw9n7kfe9E7i/SQZtuAeuq9/gF7IYSx7J6SxpReOz6YDslcpSuAZIpTPlNbz+4hiVKaWAHJkS93Sug+OceEVO1vW0xeE4nxaSQ/HDy4fkF+QkESoSQcoSBu8N8iHYJIWYEhbqg+8w0EXqTb/DymxX1lVxgahkpL+YILq+/zkb/0gO8rfNHqGDa3SipIIx0FjhCM0FFtyxdUgYuA2+wYhrtVYmakCBBwX0SRRgk3HD53loMOKNLBZf6g8S6mHLYGUfYOY8dL5FoHLPQCAoCv5fsWyiZ6mdQPD0vZYGW6j0p0JhUeoMh0d9dB/uqtPcWWRWoDtbxOmXZ2PudzddN2oNDClkzD8Nz8KTkW0uHSV98fqjBx5EEkX9cTv/AfOTEx3aqdp2bveVjWEIDVHHp8cJj/+DyxsQIaJEU1XL9wefI+wKExhRPItVJpVT8IJNzQSz6+55Oauu+pbwRA8WYTWZ9sDk/F1b40xa+R3GSvPCO95iD1SSTg3reVQwkwaQbEO/e685ax5KkWPYr06qmgkV1ilHipiVmtIfielvDFCC0JhmVW7spRfPA8xul+XoLNf0L7159NHDpu1JCR14iZJzUAb5BRUZfSWsAhevEmvmLJGtGuMN1XZ/9tRt/gNnlQn7PWHE/MfRufsGO8LKR4PEDsKei4QCqXbiUSPTxXZo4yyPlAjgOunlTnlEAq+yMlgWGyZbFCM7VqFpZliNlhoJoKgEl5L9rvjXhU3XhSUS/hm3ANxfE8pE8uCpVT1+cYX7eWvdNmLBRJzgra2nmxGcex6zUXIRpOEdO/QL14dak97JHD4lX+AfHzvhojdSMjBQSqVforXd1UOLzgt4SuRYvFOutuu0eD2+mYgi/ATSALE7b9iBETequyDoTZoabqIV3wO1y7Es9CURSeXkeRurVhH/SV5D+Wsvq8o888ehcgZoXMO8YBbtW3ZOnn3wLqv4kCBeYkiBKEkUE7WA6UUyXn0LnMyxjc+vc60UBFW121npzzpoG1qKSygQ8pK24CSSdGVhf88NuWNbrgIjYSS40dpInpSuhwIMnT/tA9mASiChUDohkl08Bso4Y+WaBrIRS/0n6uTgmI45bkzAUq5OxLKQDrQX30byBzbyaniYYvO+Vd9l9NI4X0PwCXl5h8Wwjn2rCXgH9hjbDICjYcqSRIc2zVl+Fvge48xZVbcGq6AH5xeSfqR+PaHLMxxKV/Sq4NFHtQJAJVVF0srSA1L/Xs0Lf+55oFOnjnJAYFLaqCSGXVK5GIGnAcm14v/FSRFRFUc+sikx4VtsSJZfWOm8Gk/uT6nj76eKu4o2k0hPRAkaVtIOhkql9mlBHlJJf1ISUaLj/QpBqtWaDKHxhRDBjLb9TqSG8DAbq+ogEtkWaY6fA151NfpRLuiway666vKrRwlwXCy87HQ/L44XOERZlb+XeZqowcJVb4I2ciHpGeCfeovoNVMfTGuUoSwzvHmEV6lyyBfkLIaTTVvNFu9oROl6UWNVoNj+2pfdY2BvyMoGkQW0NWn0liFU6hKGbdYhxk5GdW1kJmSoKxWdg+5WN+coqzjS5YDBMTovHzI3sWFygticCU5r6GvY7jYAmmMUvnLD1tMUJn7M141o1JwUJcc/9gImW0duIbvGrBZOI3UAv2H3JHlM92+4HtrlcGe9JcnFVe5VhPgfzNgvzCc/P+Cwpi3iUh1j/olTKbDHxseJqmVlaT673QpVADiWWNQnLC98YAQGCO9T4ZoLPAtk6V0sxL4KvAp+EgnzsjJotS15lKaMzzFCP2sBoTfADYKgRFndD52KX4GxJsJmFG5JD86thcuSUYQi7+sU7fnBcJUsTqR/S+NARt3nuu8GsZwx0WIRnDiyhTztqXoyhshy0RkoyJ2rcviaSWSMWFL1QGTvxoqkRF+JmXESEC27ThaFOk2YqreUUnsObvL/ZZWYTN5EYrAy/BARpKLPMEdjvNfvs8EQ/pCwEDyMA70Gn4JITW+C6aYF5dXXWzwFLoykmsltJbsm9yv7KTHBeRYkVhAXIBZg78huYTCtqr8oouxBmPdkVUCkpVe3TU86599KaNjh0lCYKrCwhXRLZaa98DpVtPFI08NBNixY/00ab/BCKlBZq1dg35SCF+LPLqPocN1y4zhxGHtyCo6i4mRdWK5Z5c4i9f4JWuorDAe+7fkRnPMXde7yLbm7swjiDIOoxg/yQQTKElU6anOZrb6SLXzUeZxRIpBYOY3nDakbVfmyEoGRP9riFa194IGHsLwWeMh5/gJIzsPrE/3HV50gVVk0vsPZFoQQDouRjba1vSR5EoCQvdP4hkX+BeQMFhJ5y4hzJ0gm+rlnttjkD9NguAQis37aEp7X0BCMSQbY2P80NZPtvxS840fk9xbjNspl31HdmzHAxQK/ETrw5VsaITENCI7vAWreW4/aNoyjvaM9aoCaPYtyC+DnMoOGVOQZIHaCyxr2v57NbR9cRob1mkgrrWrttUwU2cCGwj3BTcpLkWiUrKFJXmg8TOU50vWqhwlOO9arqHkrKV5D4uhTtfwRl4AW39IAxSx47e0Bv4rJesIK8lkYrb8uSh8czTj/ddsmOW/1fwfKRuN/DGgZhAb5OkkUIGZA8+WG4a2l1dMYymVvTQFAFQwXwbTWVhCMuhWuQiOSRUWgVgw8ftUWc7enVFREhH1bPOP8UrKVnGKo+RVtNblcyLYyrL/47iWJ6Hav3hhAmiwNjyXwrymciWPCGMOHSHcetrJ2eccKfK/joF7ByDDH4zBKPBYsEOH8NXkDRMv/D/d3o/AXv9RZX8MNWUBgnW+rq9JQNItL2Ng2uP2hoKrmtBZQv2flqWwPrHFw6yMGQ7fKzeNaMirJvC9r5FnCyb1JpP+nNxCFWUc7jAY0z87P3y490OQiaUIxkrqrz4LFnJNVpEnZyuipXNJ21VjL1gTlPgn92nchQWjM7JoxPTrMIGHSZ0JnG+96x+VjkI9uve9wbOMYvK/UDOF+T9sdBOoOXZi0+Qj9cys3sei8dxERcJevwzh5ByB+tVfbM/KhinpB8yRkLldb6uZpszczIqec9NzF0fF8j+t4K8eGxcuON/fC2bEZLN4duUkTITUiScKiVQ0qZ8CEQHfcvFeW7+WZ0/84UEPzrD0kN/dMKe8l+a1CqMcW7QiAbTBAYkBMGrsU0JOXi6oy3y7275G/bo8Vlib3mJC7FHIAWS1XbmS+dZPe0GmikqNWWjCMuuJkpRleFt0bEd3vex/sNAaW0GNylGap5/TApdN0ian8gtU1jiTz8vLZZSfHnoPCpTOmA+VlMWqcHytD1HM4gvuS0slDN8i/9emX89O1VlUY7wMEkUsAQApyxbu405n0LnST8MUltLCbKGsTM6Fary2z65eh1P1GkSLGdTmJwCAJxtRrIZdGRWF3tB0992EYZ2Q62KQYxFv2wMLZumAnymhdxDAApRqsC6kU7AorZu+nUkJB6Z7zZ2o0avQz43yBaGWWkFBwUgspG/XSaEr47S6O1GzISHeRL792N26adh40uINZUEQj9eb1JUMsZLWukkSLWsUNHS3T80XN+Poz4Val0KN/yLcwuz8NC2E0Ji00E0HoeMYMf3zkxDeWHtSk7IRwdjU9G1ou31u4bi3qbQsCEzdOMaBWdwCWpFwKZjibZVSS0LM7knYY9LHrW9RMHCDc2B58PJWYYUZKlpIcZCUCYRp0aeVMf0lB7lZlKpRVLfO5S5EJ8tvUqq4iIgLZ3jb08dd7qLCsXBJEIpvBfb/r0ba72LolAAPNZpJA2IXPiqWT/cWNrZwG7gd+haydv1KksGhb0olyf+6Gdx5d5H5F66RBbolPb881cbO6Ns9byGtH4Gx80aTd7bWfIhx/duXa5MeZ5+nG2iCAoUlI/vTsxGCd+Jm8WS4g8/eyUVO8XbqbVoFh2SXaBb81Y/6405Gy7WhIfh25RlAGX5lOfCUH9g+aOEAXEVCJ+Px8VYIXjdS/6v+Ma+RncFayiEJaBGjY5sEhJzIiqYvgsElEJWL1bh5DnYOFo8n35lrieKmF2ojLU46u0210vTUUaxf6uKlBxIm/J7R21Ki2Ce6wCUORExX5acKN1Aqx8Hl5BFT95q+4AEUBXYoQc7pfrLbwRTDKpep3jauRHx1zTtI5+HgB25tTF+a+id1Jj8qn5/yBjP+OkRKSwpO82mfGKhdwSuWLPP6oLB5lPG5TCbKMnL7DP/RBDj6qLEhPKtEzzMnoLyBt1VQ7jEwp5jMSxpbTYPHyyd31IcnDGh/H1N1ov10lKkniSx+5ysNmufkUbW5o9/SGpat+T0G1aSaqzxxeUDsRSqaHIB74O8NA0B2fnTpbcadI4xsPwPd4OwVtMqlvo/tMtKnYmwgFmQ+MXXQYkRGhS6DLgooJhrDyQjwCQiylth2/mLCeg80JWxx4TNMog0xx6TQ0gExpQtpdKV/OgEURgFjISbDiD879MhzZCQC3oDs5xb5oFWRo/vgxRipXW0o1z9l2hPzyciaLPk2c/7IP3WP+unrtTYm+g0zCgdrjLbjpPloeYR0KbxnMS0tQrDRbmiBCtM/MabPHn3Y/RyIIurxqodZUx0hH4GYUpcdYWA/Xl1B7sfWrwSV92JOzBdZ0lGhh4VG6D1/8VnJFYNnyeYrw2t+U5klwTWD0OVmynZ6kpxvZEk6Keu2aNSrHuRj/v+qgOLY3kmLGXNwZWnlqYqz8HzBTKfnYul5Q5kiCzo6q4cljPzqudIsfSymB0xwN6+rxzVr8p1ZPVMGVx3+YVymK0MLpv3TCdlIItrIGP50+dhW27ZRlfIQFjldTk+4YIoeilh2TtGHRMG0mvUTJdMpxVKznXI0wq8aTjOVNoaEn8Vn+Sg0Bwl42unWb8UpgeMxQ75mYSf6cDXumrwX7hKcnLAiQswMsMKVqoYwZaabz2FQriqsZsPd00z/1XvIoWHaP9/2OOdxQtzuLDJ9c+asll56FMWGsR8Bti6EmTM6dYVn0KCzC0Ypklqn4B/Ii0sTSffnPsJ99DF0ML3u1fpYDBz4ySuNoUmM2OMQHXsSSw+CTzYNy0tFwn2GYmZ7WVu5SMFMYwnl5NYPCoj1M9K1Sa8WViUvi9PlZnHz4UhM4wnepxM1CkAbBuHTAbWEBe91iDyKE5ZQtaXFOtwQZp3qkQp8NzuMsBC/Ercu9iZsbAWkkAFe1HDr7vxqbkZZF9P5UKuKtSXDJveuEAeYCm01uFw/Fv2LZUaR5rPxyhZRh/McC2+Hg/G2/p+BX8i8+JYNcEkVi5FcNw3vNhL2dS710YBciU4ySBbhCZVyUtzsFmYtNO6flh+hqBZbZq9Ds75thDyjpj6499uh3t6lwsIZ42ngPrWAzPuVtULIZakpB0/D4JJtq76dvATWq3nNLBu0uVohg2YzhVrFsyY72hUPXPlI7cceGk4ImxfZyDjWLqFoGvbsn/qgmcgN6y3gtZT3m3Di6bly2aj797ibWDvw8NLXA4vFC2qTh0o89yp1fsgHIQlUiojwmd2dBTAxOe6Y3WXZoO+xXQK50mZXEwfW7QZo295bfEVmvOGiKrlyNHqTyM/5wjnTOIC67xzouyLSMrQ+98gFwH38WtGxHhbXzyRTltVN9eavnjzZ2DME13iH6dMXWaDyV2BuScirLhF4SPniS0bjnJWxoBmE3ZY9xEJWKZejuSfm7++eW94Kp+Pyl43jbgf4hywbsrCpSM6jSXqexApaFFmlS2R9MVAFeqoS33fdAourNIvls9NrwxahBdb/BlrDtdrIx5QnirdhC4f6GQHSUgWh0uiwb5ROKPbnBPjz0ZfvXR5QPRctiiFizd75aAAVU9zAFMQ6TPnfX/TiKicDEcZPre1r+MjxGgWFxKHpHll5NWeSc+uNNRx4m7wNrj/SYp+1+H/prRFroxina5LXMjir2YcAAxHfoPCExw5W3tt24eRRh1ubX2uiTInFYVasZtdruo3ZfIShFbf7lnrbCsnLgwNFBJMF2cYGktTsmoaIcLs7wKXIe1Y5XnU1buMaVl3C/F6/VQOUBkhvbkWPqTaIUqGNPZ0LsB1AxZvEJ5ZS35/gFiuBxdXHha4s2cdKn6JHH4xTsWpMj12KX4eEfvk1CLIF1hQ2qHJPKu+Tj0CnXI0gakSOX7MQNrFSEKpkScOgxyYrMN5Y6ER+BsP7R/eET4EUqUgVRqtB0ZE07oDwpkt8TrHfMUEoxo7FEMrwyTWiUikQIORAXI9VvNru2Y/L4odDnmT/uI3Jc7qhNTZCXG/B1y9mirEA4Kiyny8Dl10MFJr9jMqLPnOaWyTuAGfAw/X4ExWg/afiROueGMiGjiiDIGm2ajgMkL/jJw0Ici6yFCKBChy+7TlkX74wm79CjtedpTLbgzXwLyL1rKSNr+VeSavlE8T5IaN26kJDYSWvWhhZoGl8c91gqVd3XJTW7libAoLrHoux68WD17YxANwsmGEOq0UiJzGNZD31tAv5z+zBDXmvR1zppiYSe571BBfOnJW+FHlRj4MyXusVfnkMnYkHwxbZbdTMIjf5K/uEOJslsWzsxPkJbzHoaGmQ91rAFiygyGT6SRsuDykbjVk0pAbpi1ISejeX3ZLcWypeCZrE95CukSX74Vp3gTo+GO9Fp+is95+JFSjbPMbRtqD8ID5y/lLmj1jGLRX8AqAa/kKPhOAgV9EiByMcOM2m5AFod/cFz+BFFvoC+EBG8tU6+jot6cw7ZfdOsrUrhzeO3QKOBKJy0swLx2B38XiLRuB4dvM8ZyQrMmNOgYR1IFE1cXJwj+iV561/1IwSHsJZ0AyK1g42FGMQxIfDQzECoVvXXr8KIBIoGDwu1AXdK/hluOnI0uGRd3DElyonOt4eryhTPNZSjeSYrUPlxm3rnrIPAm6CUDO0HrC+L+KB16Sj2pZaBT3gDisnm7f0ouNW9ZxSh1h5jJcDwC+Av0zQhBqFLe8U9JjaldOnBZ3JqaCupR217qdX51u/Mx1YnRXkXXQt7cXbOqrm/FDfSQQVhzvpmhZnEBvN0LJSWz0hNL+vgixxhrwUDNV/kQlARTr17jPl84easzidIJNGm4rq8tApI3/N+A57nQ4FbS9DYKX1nOHazPfYNuRDKkAPcSGAfjZgpYz3+NEwTwbMTJlCU4v2woSSKqRens8zIW9gvt0UhrJseGvUW9EYEIVH4O78KlhP5Hh7fBs5yFf9gR7KTkrDuKMX2OWg5kyXJGywFqnuVLS427wM0ASKQad0+Zu0AdkdEFFwzKNIolB6LPQs+1XWihYst8w2p1iaNPgZyYB7TCoFWlQTLZyQxdo4SXUXtWJNHCJUByx3FS5dSxM6/5QkCulAgekKwwOuw7bIjnyO7FuqwMjaKXWjMGol7w2OeNFSjSxb9WqzxxJxcRuoHt3EKhR8tUxRJ/BG6BMwt3Zue5rakMtGk3D05frzPHPqzd1bJ5Gh8zoJfLz8IId7H4ikP7zoNEEeZ47VCxiTpMyQ9g3LuWEUxK0Y4SJP6cglbVNhSuZSG6fc3Mie8MhnnsEtyioKBYbVswhcQzP9N7NgNT7c5SBMruH6dmGXGEAlTRYeFMuKBW30WtDbDNSL0N63Eqc59a5rP6W8GZoGqkmBOrTHK4x2NPyRz+bvQ2yv7a0SpfQn30HgvJdOdsDFO+/huPojUH9J+Z8GCu8kwa7duH2Xvie5ioHpeVBRNAUOeZOnc4B3aBNyOocB+11MsOiEQL6C2s6xlVhJMSIeDl4fRkL6IjEbGklYbVfItkX62I2p1fCEoWl58opnXuJrC+8ZSLELJMmqFfzlDEchHY+7eJTj0WfmSVuz7NM5wULZfL6LcioFIieWqDl4MQiwpx4pbkJlsKYbL77s+Sfdn+gptiF+QV1RiMClE7IiV3frEh7aFYTly1e21M/bhjE9n3SD5SXdSountjyTLzSXQWVi52mvuWVxRZEhKxQwF63etAwP3MpNhRz2oJU+aYWHisSEMp00d5kJrmlpkKSMb0AgZ0SFysuMb0tUAyetrc89nqpXEs/9ZTXzy8IFur5Tk03mNHT39N4yVgmTURVbKUZ9qI41KczppSB84kC5I0XXQ2EEmdu1aEBv5vwu7WFCJ4IJmL1ldquuSMoRISzDQ9+fvxrMRr0Nt4O880WVDTT5w566czJw2PVqQqWyqh9s6PW2zLReeuNSYxfMro7BtHjM7oxXFKrokaN/JyayXShUrl2OHPeW11oHnazw+V6/vfCHHWa73hJBvaSxPa4KLoATJSYK5jPkrJbAd7Cb4HqvOPgbtj7XzRFEg4dtQYHFicGxz1TMHHl+ZJ0bcHJDhe3gVVqi9ZbK5PXk10ZkOAYHztALcy0Nnm3OKn1tdvXMq3cv/GVAgzFrPjkkyYRPBoYr7pzLlXdnwFiLzlz+SCnhZuxFUfWzjAc8kzGnKjLI+X4goJcBeILtPriPYCvIFGjAoujwbXhhW3l6Wlnen+K9g8aBNRpA+BudBGj72F+s0glIkrKcpZDc5dLxqjs1qNzfmG4jbDzWvtk30WsBgUIfBoPRg40k9Qd4IVGRMgpCUyj8cFdKNpXlUNiLFDJX2JVURCbyt8EjobZSVrWhHhVNZuEedJzqeStWbsivkwcYx7VCFjYBleEVUvicYoQU0VT4OB0S0wZnKqI4/1PyLJRgPRTbq25zwAYYAquaytNzgzfBCqbAdsm4ZjCcv4p9PXIgTvuFWrIwbiq4fpsHiVPX86z0gSZ8Fat5nj6kBweZVwQ7sJVEvAa8+sS/4FtHVMQnNVsKXlkrIfWeSr4zBT2CfpBWqzJ84DMqXndOcM7EVuxaATlKt8H9/wSd8bMpEcT6xM/mlPFSINqccWC5GdXGMRj1/oDps1IVEARPm7JVTPSvOtSutj7/7kf/YS9SSc2Blj/OcgJ80mSDP12o+qPPAz2OoOzgIph80U7jpjKYwWx+WmtVBGM5IjyAy4J2NCpezqqVv4nxjd0FbthFjtFLctX2l5bDJ8HKyrOGBlACdh1FoMevSbq94bN2T9g/WxLjMCR33yMgiqqGyid7Kq4eZXN7fcs6FO27A1meJrwqaLq7YHkFCK9jXBuXI1/pBACW3tZsSRptVQTBr3OGdFGKtifD19tiIfKAbuwQID24xSrGM8aIP2k5a8SjWyaimUXpOH4+1c2bD8nf8kItdL9ehw/0W/BceD9/rbZ7l/t9o9+lVYm656I7LigKYw6QHPJJxN62Jmx3uV0eyKU6n8U0HPHep3M8BWJ1Uaf0+RQlcT/xo9Mc+MjZjLwy2ThT2PpVxck/mHJ3iYw4DBQf6mXgKOMnEDNsbiAfg410t6EiIADu3GnftV0TZSO1sY4EQiLHGjRnqto8oBSOvS9qLcD+/Bm+F3ZajTdwcvtO+j2vVo4dTv8wMdAtlUbdbrdcuawQSCZ6sxwtbP8i8LG2CEKbsYuIKd5Q6HdYeE3ugU7Q5bx3UtsTOgZSLJq5TSfbGFrm1QN3Sw9JuzYzb/4CMr/KSeLyMQVRoZD71NgyNLLFUQqf0/P5YcEakXsqordjlXCvOTNnSdCy3C3r1SByoFVZZkWNAT7dsaj+/7i0RThXkPTt4XPIJW9YmKDTULGFHi/x5M4QOSIC1vRTQU/PUNm7RElaw5j9jNz8VJSIb+5AWf2X0NaUHt5Df2MDeKieC08oC+LnsibhctsMRoD+5LyOoTD/EmC9lN6hrA4/rIZif15n71+oIMpqhhAbiF/7N6JZZFHN8D8F6NiRODnKyKdZOVzokgVyHQNkybXEJAUHGXTPDfxTaph52MxRytAtWvVcauj62JzpucqI3fgfanWbawxw5pHE9xmOd0wJQ+ptFku28iMWLhzjNY+HaOtxxE4eNrCshPEqhcNVRe1keJ7TUohNssRzxhrgg705776cDECIc2tNRTALhjOTz+A/Y0dG+ZpDRltq092dJyZfHbMjhsRUqghEFYj1dlj7kdF74EqtG/b6vVr+/ZGfcQxespTcRfZO9imXMgRjY6R4x91tk6Txz9YhdTKCBBT9QrkkYm1hjElV8rH9xeTlDd+krVp/xzl/rTI1WEWMd3/AsvhrzLG+/aT3ZUTEPg6cRRX34knnvym5eFeNuFAUghTquYfwQYMGe5C+rN7ySc9JHwwKl0PNqwp3xvL4SS1UehW8/DcMleFE8RmhyPob8lre3unAz8wEyYQJgfst3bNyFXrUsqM9LyplOd2qgYpAg3hXnB64JBxam7mjxVir9Ukr6fNY+SEMEXu6ohUDjPsoTju7msWl9J4hoefnc76+ajB4iQiUH4/B60EoJZ3qw8TY3UFXr3aNKGhh7EsQIk1S26cg3lqPyD/mKcDBcqYylLq1bCGWmW2JX172XaDnI0Kc84f2l7Hp3OrAbHrEM1MZhsbM1a4LNeE/RBOWrBiWiX8yuAW43wcVp4Sxwaf8WbEKNCmrAy8r4KKWrDaxEMysa8kkWR9CAjW8xYuNVav8kpkcZKzWs4ig3z6/M/8tfrfXdKkZ6P7wcibmjFeAiivwAJTuZSocuoFJvcT57Dcd484qqLa8phfy1TZ6i7/dSXKIYVS27V0U113tRpAewlxelFR/xqNbGYD/IF1s6t+SsizrDaIndNGhLanr7w4Nu53GhPPJ815O3tWr+9Vb32JbYU3yzGlUq69BtvI3iuBxFaU9+dgBbhlzZUMVv00kvXVicgogGYVpXsnhekd8NuqptQo9/QyeyJdU4930Fk32DgbZMmJOH5075PB7VufhWucOIGZYrCfI7EXLn+JPQ4gyiX9ZfIKMBHsLb4U2kv5khmNHDZxkvv0O6jedCegoZSbltUxs5654sx1lQ2fFIpHb47vDZgCo0w22Y4fLzkZlUHmp1/wEn/HLbOOwbVBHK7jy14NSjsQ1QSWWqmdb7+KTAICND31lJd6NsE1pm1rxMETg4CUuL7qKlzTrSR5TbS5QZ1ZjzwrQ4uyw2arM8F2VY/1Ekih7zde7VkyeftoTZDuNu066G2n/QCQ/LxYyZXHP+gWcgzLkA0qu0CwsY1hcFh4LpDCLfk1luDVx0wnZJg1nKGx+DQkFt1OW4EtRLMg71T/NR8cble4V8OmJ2rFm6esXsvfSzIvmESls0MU7F5TNUW25liMod6SsL4u8b8wcBySgfH3WQzkKIl/cNFAwLPd9cYPtslzRZ548TZL1nL6kmbHkelT6KHtv0uf5AzOSZpCYoOKzFs6twaDTbv4+ePt4pgb78/FRqNCQI/wnbUeIl+zXcaS/MB4wsbTLyqx2VHkDn0/IcJ3dvE381NrfhF7t4B1w5fJEMtVKeBcKmUv+VtYwQFNnz7vwTHYHipWuaGPWPo0M6glXHjL6szEu2uAlULxElHN8shol05NX6lp8OSCBv08feORCQ/Ox2EqX8UPzCPTFd4gCFcFiJ5V2xftHF8HY3+oibHBn1jBqn6idk34W9HCATAfrB4x9piZeHvCEABszhjamDYb7Q1QOTbGlyGShuneQMdNga+I3dMvw4vRggrHQpv4KTjUoXiMxwjc8vzqxwKjy7iGxB5BP8jK3Ty3lGBsytnsPAo+jV1QHTtSnm6diTWFgK4ajZ3+tibfHK59JEYC2Ym8AdsUkN3ZyBe2ZaXBpWiGvtfcWrLDberiSqo7S1KvaVgswM7JJzbTz51AzbS4ZTQNbZMg0srElQB0tAxzPXd2kT17oaB+mZaPcLKlMfYe/0OM2DCVSBdOXu56oGQaIE9b+Q7XLBedp0LbHrOx9wL6ZGzoiZZLaKSjD30Ys73sgIzxbTAC0O8hCJxHsWJ+OA67lW5DBESco+vEwheg+c5cNEYZe2tL2DZxhpi5MPzG5sZAdZ3SC+qEYGcuORf1ysbinMYtzlNry/I8h7DNP5J3v/cHQo6dToY2EM+U55P5lFu5W0/f0ru6EiFnip7jabxlnwvBJx3koe2u6Jn/XYYCqWYPBd0ZtM8cknMxerwXXLFaGw9EpyECVkaIE2D2wxGggiycWufAO51YGZDcRtq9vMNzyCbzV8R2R1R4HyVHLkkbEeBgTObI4OJdqlSrgCuI3Bh4uBl+twhXtFdDrMQxnXLOP4zK8a9/qBZEnC91QPx6att0316z0CJGNq/5V26kFeiKh4efRr66iTCwjDvdJ6qYeQn7T/XkTYtuM1Qt7l602GBLxgBEtHZhyC5XKKt48cl5/ly3xOtchJ5XeZXKU1czPeOb2oBbA7fC4NWf8rEftDLYY9nAfosmTivVUia9nBHcRhDoDlwsYU0dZG3Riovu97CGCefSiujAB9FStGpk6qmlDgGoUme5zlXYzY3Q+3qqUkx77iu8QRiPbVvTKGNVgUkKElSFHMRDq5wSSFFIne11BVWN2a3URcG43mjnpX6sPEsnBcjfh0dIfAfW4ZF2BM0fGKNBKdivp17fKgidGWTDWfFH6iOPbV84tfVmAoFwl07m8JuZqnEzmf4yBMYwVu7dv5viO+6kn2lO2x7nWTCmfvM8QlA9blVbOiCDYwzuE8HkCmWCVF36xUSM/C9POd8wZ/S9HiV7Cc1uSYMadSwBcaN3RqsLzLw49lp/nIDGqnBTX9eK91zPPe6ADOT4wp8K+gYHxa21E7di0jEmij9mPUeGEl4+wBy8nRfkwkxI2XPNNHFKBOdXFpMRuc6FHHm1cAAUxyluBTg8UyeKBDqpBBdIGXfgp76baGJPH4gyTD2kz2QETIczjsCdqNfV4TQPISOsLIS+UL3aBCCddT6NRZLwE8Zma/J4VS5p1py4aiM8wq1AtJa6Bd7jVZYlBP5GwnFhqpXl7pJF9iZ5x7CYNog8ENWuOuydJAiSxBNuZKGRi0xIAhM32lVCajU1OYu6pj4gO7r4M0VJnRUQt91yw5Odq2TEF2C/5t8GB4GGkOwghvXbYjQt3qxjOpcGU//Mjl472bw7buGMcAmPWmShE3zcONvRRcAdYY4Vmbu7K8wUU4ppP9igEZrGFX2+K+KXQujDHYSjnKXVuZIEW6e7bwWPqSwplE0JPxQSHmX1n7lFE5CtXrdahIbYcL+laNB87ysLciPVecQ68qp7Vz91FVYIiFrTC+FumTpQ0UwPaczqYargo7q6d5m+5yF15JA9CUgwnpbtFVEMZYcbzWnmNgYBE/xBNrimpa42WD8UoLNXNyC/Hi1SyixPog37H91QOsuEacs5jtYsYRpIOHQ4FsCogC1C4feVw7elvhPcJqzAoZlnH1mDD4mrWjVmdwa0hDAWlDlBNswlVdGBvbcXVSYmxCrx4NAbXdX8Gzq9x+ICa7Wcw6wqeBtclJNaNQQWwPBqTj60MUJimLBcfG6smIny9wQeHRdhYW3eyh++JYHh2LRBqOpWYJfN/VJTnuO/aX4FenusfgJTqVHJYrJs3zsJ7N2W00O9x1ZpY3stUXw2UBuWFJjZoyObk9YZg+0u55PdCpL5LVKVOqlXFJmuLiGRKqEbbhvO2oehSxnlFUVPw7oZQG17TCNeMVwmvuNkN4xM3KWt0bkAXI/m4+Bj5ltbghpyK45q3mh20a5KGoRQL/GPxNFPLwvWtUxCQiZtLaHU6T1OHs2rKgKz9QXVs29Tg53biXMQLBdAQLpIapWjRrVLe53t61wraTTmZeK+os/J13IrTIigZ7ShNBqHsjyNgqi7W0kxaq+UAtF3fQKTSQPT36LMq6DvlbML0Zw5rs239XsGHkxg6clkvFB85ym8FwZq0WkX8JJXKf97on2VTdWG1twH8IbvizeqNhPMSEjyaVRsVPJnvU/zBCIyiJtFhyWQxks97gzX3dAehmnIA3YAloIWpupwlr9JAdg1xd7klqrseTOQVF2SGODLtPlYg55zqGsk1BuunJYCrvnMSK/mqktjpAe68DKcAX+3v1hbp3JQKEHLGPTk66HW8lrpZJ2VK1gSdGecLi3uX1npXxBCJCMTQOqGRdV+F2JSmFq/7K85JPkJ5h60CeWWBVCwNWU04SCtpPjQZKmUmA+jQHN1cg+4/l4GvhnxchxIZudh4D6ED7B67NHacnNJt1QdcS+DgV4gZiBUer30zmsE3WCjX5rXQJDO0CSHSr3fV9XemLUHeHiIe18QcQ4JwT4J/uaat3iGVS58UUywiiBTUxn2Uv6F+kZn001LGhSjCtC91tiOBoFGBJQB/gJgjcZCSNl9r1X3mAcNAT1SChXKjWrGNHAF+tehCLmSP4CWK4cE6JEaAUQrHbjHrtSan5QkmPl4XsHn9BqW1aAVGZQpBrYvUBxowmiEw2KMxd5501+SKWOKrvk7OgLl0pn0OZN4VKfO/3P2cD/iwLNYvEMUWECHxCMfQ8taDKu4KLI9q9ha8ZtcykEcYNfG8K2DdNwQ2M/ADmKZQvKLgDUu3+Ui0otdCzgpmQuahvdSo0z+PkVNiIIIQu8lYaos/iPlmHhLWMfBy70KS1RyJahOTLbz0VsHPaz3+B8HYAbrp84FU3skEFBRcbDzWk6FnsESkEsD7uCaetHcCjeLyEIpxK9OZ790M53oNH2V4G2eCU2XVQ/I4mTkWSeL7em7JCBSIyzpvZHRQPG08zWGcJ767g6YB051IBlxEdUBabCP/uHG+ZXcq+UYg/alv2eaZlhlDLmH2A6P4WoaQ6ExJip5w6ktYtd6fLJRULfADpUsSWsrKfvRA5SUQ6a0rI21IZ/KVrNWDGKS42101zyu26d3yUI88CtmdqOZMS+McTWTk+fSgOvoYdiXSPb+kHpotnPsZTIzRNSpYanSlgl4T1XTjDelyYY7OAfAex8aPVRi5f0PzsmQu5ZEOsZd38oRorLgc36hyr1zFj31yMOAzCRkEs0JNAbXhJmkD19B0Cc6MTnZzq4u64Vd4Ixgd+MK26mrJxlmZUD9VCEINEiD6UTNRfumldC+xAWTrWkyXqUYw/YS/gUtJ/fhciWaAKG4i3s9QN5n+LKC7H1i3k6xXHLHOr2gtlkPxj+J8HhXhtBdwZO00zAtTZXjFkt6GLBa3oEaY0fWwSu9ZVhmT68xMEJGrJPLQFp4S3twARM6vLC9ESu8Yyyzhwt30MfnAA2SK4OxqW9iaZ0OIotwxXw5ah5cSkBFv2OguXl34/ZPrnqYLnUu9lLZKeB0vyAewzRZ12wICaPygl2Nh6JNmkQJVCkVqG92MF5rdUky1Bi9g0L08nI+qucCctC26mNZEwrQBbBuvn3az0vB07v5cVE2qy3jfOXIcfMPfsQlmI11PTOmIlg9+FoaX63DZ3FSw5KAI+SUs1FuVpwnpSYx+oIDpdO0uCIkZi9aMNsqfgbU85Ivf7MaIo5a73L1Aosl+mJ6CDrzu66GI31afWRrvikYPB+28P+fQI5163ncoEtFkAbW4o2Y4NG5I093HelxGMy1Y+FgBMf5Sc7GGSpcdtQRbR9syc9iOdHEyosU0t88tQxOY6RfGRBK2z3bFdfgtBaONrASVIPAtWx+UmWUgk90RddhPcYBkACi212gBEBFu9FbmpJFC7NPA125wRaI2GVYX46qHWgIpNCA7/nSllO2m9IDO+oYHvGH3zCgXJQEKtbdJoT9QGXPqljv2MVuyUkIwJJBetsmRzE0ycNtWT4hCO+qb+gRLgN9q3mqcREbv+txjYUnqFLBE5BVKgm91o3ySnhjb4YEsoCBVxwYuZubLqhfL1CXL3Rvi8Z2mKXtKYNhmoezW+y2qvh14AP1ieLhliH3b3DIERj2Asj+FvfjjY6hf1TSBurah+gAsPeIz01jYNQK/VMPsaI008evSD4TIGFpQUehr7RLJMzAEio5SxV3AS2yB8+OQ7Zg+iBMdkFDjuk7jYOY+VmBvLJLLIs81ISBzn/bBibeqgvQUWyIEc3xcFQJPkVuuu8TIaLWRti0b5R5lD92iTfWjasTlSzpT3kgCN3Mm/Yff619x3tUYqAM0tuvUqpIIAxeIwHnkCx/LB4ZVhPfWIXvR+k3tWZdgELOxS9NqncLjtVDi2mXnPSX3T7WV/8WFUJFPm/7At6ZUMIPbEp/ioFRs62Lq4iCwTrl28R3tJ8h5rBJpTiqoBvmgKCmluvOr+Rufj+1xkXmTxP+WbvjI7WoAjssOy95wTao7rgxY/KFBwv9Eu17qa9i0hNnWQB+vvg01ErmvHoR0Zx7TQrDKDvLVkw9LWLdRbA+tDZdbEu6C1MROFW4Wf2WbhcFvfe/ItrgEAvcZfs9QbPYww4TMu27Znx22iQp90K7DLmF+wPEhK3czZiUiL4lDwU6gu+DEiirTQaOF66vb+ZuSGrz6eTXQfhWLDkYOnQm/y1Q5fdyJKz5nBjG/Z8/XTKwh612FgwFHx6FKCpeMgq6PV/GDBNqLz295vB+OQdQGaDhtddytQI5Fst55m6Uqoigd/TzYu40kUz3UF26SKTOiYa8oKh7ANRv0jRJcJ2pdnMYlWhKy/O+qnCawoGmNC5i0/PqqZDMuyz6Lvg/ZNBuTz9ku08rdin2E6JjsWiAspfWjWVUyTbRs5ZMWF6BduoumfSYgH3OfNeHWtgBYwY+5I3l1s4Rll8xmera8rUDZ8QXLoH3OWPnHlr3I8nLIviqEOYLumcJEu3MdREKhEDlwxQ59scaS9R/bK2K3L9vhemGzwggGpDe1Av4vo47c0iUxn7ziKSUfHoCRd7k49E5BfskjQTw85kCvoM77yK+GNDIgHlkaBQhnsVvosKXrNPZbTr9V99d4s3l5/o+LU+JvtLV/kNK4AirfjKsdnlcxFZ0Dt24iq5CtYm6v2tgQVmGOkED/TzaUYLneUD7iey9bzezm0BQHZ4MAlmB0v0/6hXXo/DcRjoNbS40Zal2c+T4X94q83jURxnhrATyC0b5q7RcIeS7aDqbrTy5S0zfCjPmtvGZgpB3EfCYyXpaS69dhJxdI9sC41Wd7vA14RSQb6/z/n4QBdCggL8o4QCG0XAvqMkHZtHSczxjBv+/hpcBA3t5S304Ns3bXBa/hJazBFxZ1Nxj+kMMOprgicue5YHR/iKAtV3aPdP0dxDr1X7zoy/0g6bXTYWuzbkZmZkRzFwP+E4kogiBXplEs4Qqod5LIIyC2c5ooybG/ibHhkLWab81Hvi3PxYBR3hXdJhMU0DV2asBF6Bv6WIg1jyMArStj4gAP2sEXDtQwmjBScSTf/V8KbqYS5u0I6fcFfo7wjNqnu8+0rYf2EGmWo2CYN2+e9BWT98iv4/CWOW86GtN/PYpKHqGl3wtIwMQ3q07pIcDoBwksPBM5EKNJGQe6RjfbjJkueATCv7Wp8nWljDBasdTv1SBtMBPGfRmw8Y7C6/+TKn5z5MMVzMEth8XBrAsprg/UFyKhWH3zVLaVJGdAmKOcz8KESORAcRlA9d9itlvQgPpIo0IoAtYwuNC6xg/++HL8jxP32NzdFlu1moJsuqr8fVGV5UZdzA0T7mz6X/bS7/4I7/cc0CFHuxVTpW90vGf1gA1mDRWfyR0u1gpXrXKvyZItL1yvT0PnmQICKPqpkNaF0plU3f4SIjjk4viXLy3YrWixlHAX4gk7IarkYlx797Cd5cp6h/1zyrZipFsYn6PRpYWWC+1twbI02nxkChFz7Ye35dLpU6/J073P7b/v8PQtImsvkOf1zwP4NPt4qZMbXWya3+iG3OKjo4IVMsHfvAm10YnvojT8NmZUXTFw9eEOQroIt4YMCGRRCtz6IkOWpz9Qd19GiesvMPwwxQzLm5/0sSmTZlT1L3OBBrnOrBXcH50m9kOwxr2yLT/pz1TVo4Ag6iEie7zzEVxnWI89jNZXuWX7OytubRbL1YLEGuRqLzpo8Mb6/Efd1oR835bKzEj/fFVujaC8f2W8HCM0VHvJ7/tZhAJqT3XS4tJ0qc4nrEfLYGEzpAZcxW94tQxuk6gfVtTau4CdCKeV+TPgn5qCixxWeXMQGhcrAN67yG2ntI5mQ3piBfP0pPDu2EzT68c3jszHwlyVggch+G1x2nyajssXkQrTy8ymm4HUgUhY/NQMnU8GmlP+KG7XJE1kah8MzPAYw6xOClqgSkVtqof40LRcHfo/QbH4Otqo5Ew3ZWqP+JH9RzPISNUKfWONKQM4cEG1hFWNqSAJ8y33NpwQKScYbCb788z2/DYdYrsrgINJu3bKqbgL0HulXs4657RaqwPaAOv94RJO+QciLOrOdQFvBeppAj70i318QVd/2RXGDEhj33cb+U/2a/3dhXu6LDTysN11gvjYRaWAoTnCE8x2jj0opjoYKulKc0yBZHcupttha0JnA3sg6NgigiUD4nnnye7nvpC7jJYWrkUacu3TDRr4dhw+T3Rxz/OHo+Dz5lyrHRMDnrS+vAbtLjEZrCQaoOK434y6TFAUqIxtRdm0HpL0lmBHBgNA5XZn+9pDuN5af8p52dPy+3r832I+yo/JWJtT/TlwZOG5tSfSCFlj2j8MR+o7LGfwXlp94wAg4CDZsQAdW1IZ4EwC/7pwJsgwHXe+ht2pted/WVsv864+zaCUAoVzE6ZYP/LIlwNG/dFVnpF3aT1QtwBgBu5gGVmss0PnK+e7/o9N7cd1AtP1aqJniTwU5toKk7VmwrXnH9Wh6kJ6w0K01UWs7ushkjv84FZ2HruV8WhcvzBYGJcJyGXB28OfnnjFudEAiVh/8glSQsBQZHZqzz/PBAuHEkL6dfEGcE8iySK+XjyjpVhp+stkvVygnjyI0J3VvIXDKTiyTmVIS3m/68fCXH5CHV5DGiJXs02pGmwF60uxi8+8KeQiWlzUmA8cVjGwQ4YzS5eMKSwhfzOfkZ7HI40bbJBn+RCTWwVfu/83lzGk+b3H2BMIoOtv1TC3hRC3xxvyMlcn6hCEC2u0QNC49aKMAtkrnxkNA2Y8u/ea5C8xh9rPIzCCAnJQBGj7px0eyc18BwXO8eENoweg3l+M2pNx+5TjjInohyc7EmrP2KBQa6pK2ozddv4eFjq5TVBLCCgyDQxc9t6NB/+GbtMqeVdqhKfrEfLq6No1PYSY01KYJ9yW3HoeuVVNd8ct8vEVXdbAKGMZbpU0VdfRrYvC5E7cKTp//U698hRfLDZoF9hVHbLS++ev7a+l/deebi1Z/8UCln7McIRgnD5xsuRAIXtlJxn786GznUlw8bQTsTg+4BUBfRdq+RUbCBc9nFAcALEXnZrMWBPKETVRV2MZX1XlHXHbhjyz+5xPvF/rCocsxyJYMOmp1Cqada8ilkjNo0H8c4GoqExeqtd2hNyngw5HEQDE3Iw7LADAn/eQyyU2cyNIUBSrxZdHULtPhXhKF8vk+VYz/miYAwSeSwGiSJPiOUlfJCjOhgYw8zj3YSlbIny1yy/FNspBKNYnHUG5sDvG2k2qfSfdUxgb2nY0+q0C3EL3U9HB6un241jB3X1PJbOPuQMAK/L10atzfH0tWC1Wups6olg+S6djfIHDB50gLBB71XfrPJN1mTofVw/1LFJfTruNOiUv4SZeTQndAvxYorjTX5TbkAJM96Ms+77A4fbVY+hOrMOfJ3rjfAOKPsEwUUlDMWrBOMhXeTze5uEz7ledO9AnnlQCqMF/akZ0CCVeBnBU9nNoTiaJRh72w+NsJoyIGjV4FWjUmTo3wiffRBOxECVPbk6e/KZWqiWwyyZ4nJUoAy24nkhwxjhVd7HN9J7tXo8LR/1zaz/acbPL/wIKO0melaNw/zIHa9i8IAUvAbXdbzHZM4IAGsFuo6yzQdeBzlabqA3n20V3ve+IJzD9FzxSjafjMH1tIdQYPori9foid8xhcCVt4CROlDlYW9OuaqUC5p6OdydLt4ac6GSB0wSMitGZ4UZ4z4+Ys6NrQ4/y9t1qA9RlOi2NQGPW+onfL4kEQYXixlzZlcLLcSE5dRDUwqaG+9VGyDCf1pcvJ/8pPE8doONJQCISD6f/Jsoix1nLjrZneTgqPEKu3wd40zfMNwgoXrf6FWzH00NDtHWaVzrmhOZQFttgeCz4T9/oD1uVsaOwThq+/s364Gg42fUsdnojcw7Fj/Ark2BmSo55GbJonh0rv9YzPCR06tnIu6mEC1yH3gcOGYw7UltZaKe7GJeI9xtpwtYeL0uLq8OYWK2AHaZ15+lz7BoALJdv3XLDyIqrR/b/MrYvDSsnrGwfwUeZH2ANbAVXUKsXy12yrZUt78JaDFPQI/foeYOvo4sz6mt9snZLSWvO4P9XmPOzEd6EbGVzveN6v2cPfR0DL59ZVArIMN6+0LAMZr2i9kDTjxXV1kMMwGEouhC3YLXUUCOICv9cq7pAoU9WpccYWRQmDMjR5k0VxehRVA+a/ls4v1qFSWf+JBzka7uAHtN+/R6RMFpoayIqZ/9pOl7wP9aLmCzdMJBzplrZ0rkBHSBswiZTop5R4vfjaKaac3AugIkWhWeljPau5sMnwzQzwqs3tYs06Nm/8jCzTTo7wt7j5E8MIqSjOZ6luJE1NgjfmexoDDLXJPFILxA/yvjPEXN9P6wDzWVhuBM6FDTxAeSMCRzaiqhgxM7yEuKpW0mlL3jX5qdcEG4ai2kh4vcV4Rq7xHsxstKQq1+t61LUnvHXpupXkNMvcO/0xWaT+Em+6/1BhSylzoelgn2GJM9IidFN3NDOPgSgMF8qStB5k92qGDNMEZIXy7LFmvd+qFEArRahxmORN6ShA+IvJC2ZuBSnXKRfqCeX7na7uWh5j0Eju8Vb+x0w2suNGdw9rl6kcGHXmbaGxqEx1wY7XiQfRZwDs07BmIaqE4YcdOMWyjTE0ifNHKqxq8JxZj5xA/Pz8NmbL8MScBp9TTNfA/grRZcNLtlSsQgdRH740IQsSc+VQEHOlnWA9vN33Mw0hkYKwFmwVhisMSz3GX4VN+HKGijOG7H1uDgoNfas5+cCxH34B2bLIP4UmWlLDaPxeUnPvZDH7DueLKQJ6lCcEyVm1cK1dhogbemIm34kpQ02uLj4XpEjlWKnWGD0b7Lnwt2uL1MQGLkHCM1a0OWKxIGZ7xLHdBlSUK67kXiwrTpwzlqwtuSJla8alTc6pOz5QBQtaibnI+SoJpRdWVNXtOfnW4F82p6O77NBr6T2qzd86144q0A5KNlDB0AAObWE7oR4x3b65+Ekawx+zJIzQgAkduh1Af0jNKVCZmbdpcBAgEhVGOjuteyJ/z7s/30nxTnKhj1i5oUaZuw+HhWHgXlKtNBKGpFzm0qOQ8tbO+uNQX6tbI/54c4R/BAxgmwR7A1bVwZHbvlTr2B3yXFP9AbxXMXhvzeIC+ria5RRpdHLHgqDLgsn8ADUHug6XusZCdzXLcfKrw57L3Liq606iTMwMEF53/4KSjXD94pC7SR7Gtelx/vc/CmPQY231OL5jSFhsFOGBlfqbHABcC/KqD+8NTiL7mKWbHd3XKyWNoyx1+ulubpxsO1CEvvOV/zNtdfP75t9BtQo1SqxjeV/DQ1XocBQACFKDKOau6qtz0k4xJ29sIVc7xdZZ9pt873dX6td6Cw/YuNSCY+7MTYhTTycI8KZq8l4pRQlnVPIw8QDcTjop9MphGND2D2+TLbRp1FIsobu6ql3l5iHQn9R9KqgZj+1sK9VQzoOfKoNttV68znR9eGHKK4ex+5lkCLmk0nrpWRAadjU0l50al71oDNf7TlbRJAMeGTw14bZb1IvovN/qWVIG34Vk6TcYuKgyV9jmOY9lY2f3X63WL+LTaU9zo/W4OAPO0OSFcUf89V3jxCvyJXuAqcZ28W4GWFHg3bZNqnNM1CGLzbmXkao+fcU9yk70NfnqeanO3JFp3zLSI4NchQPgXPSAMOvTDcrcq5uK7xc+w5pK/ZBrRrpfXXHiCYHKx1BcYuLdqlQoH9DJIpiSk38roM8i8v3df+lvpsyG+tT4HxpPHCgDKU07cYv8jhyc9+NgS9VOWFwU6NiAoSAVnKj5K6w0KLfomo1yswYCSXbd1fj+RKrDAQe8dMsDIEXGOcEfbbGu+lgjL5rJ/jqJZQgdFKXK4n5eYLn3qXbbEHtdod/hzBWh+tTyfZST0h0Kkg8thDW9l3X7DpTL6XbDjs/cEkvVyFbaUf/TdSvxnOu0ILn49Lm7TEr+/joL4t5C95uev30KtoWURAoiYkflyufZeMp9kz3kGleyCU1rngSSX9O+W87rCniA594Lm4VA1owWvbPklXdroDufmVY00dAXnzn/rSHrVkABBc/JokaTnJj7Jq+7q5ZHjIZGXW+T2LwVynStJ7xOy0ku6lGazSdhNYs02b0Y8KKtsj5SZKYD0D2eO3R3BbR9La4E1bhVjB11WiZBik9R5YejRY5ZSOSWHnycCtWZetkP6mfwajwIIdmXbSI2j1+GDc+Xgc7/iAnKipJOw5QSWUHRfDBzksKz0ktO+BybKE3fd1bA+9yR+PA71mfH8Ycq/FWHDc69/2f0MA61ACcLb5ghCFxJvsknIY6VIaJrrmIu09i/tU0TSAN6IUcMTl6XO+gQ8D2+hW7ksgkAspEYI+FxFvDnbmOn/Wi08SaIdGsSpIm6QYE4uNQyWhCTVtIwsOEwL/guhwIBP4KEOQ1tZA9YiLdMZIecXOh3RsQ03C2doUn0/Z8R2yljsC1RHNnFHJpEbjLlpSmi7Pxjt4rbqogCDkwbTUpbH71uHt6JRwRSVECQVQHgGHL2+QsxiJRcl3UxoY0RCIfn6V4f4kdEZf2VWWaw+XGhAF+ncjOe6ZGDBQNAcVbv3pkc3sWuPsSkLj8Ep1cdvWDZD1VZWQBZcqpJS9bV61cdkIpvSwsdr2cwoFNSWTM9u9RLtU0SzYIzmy+n+Awho657s91qxXjVt11nwaTa2Ilpso7iOFrX2B389aZyycwKhpP348WCQOQM9KpMvf81FfBUzWwJCGqV+42aXVltKC7dAtebe+reHztHvzlcUiHq9Ek/IFm+piBBnwSHzs0rLb2i4P4QkOqUOsvPa9RF8dwHbOsOwch9hMiXEP7n+c0aWOXunR5vdCSjh+smMBTNckrDAzNy0qsSVSwIiKlwsCHY7P8dz+NwMlzkhAhQieWDabJa5S5jiHKKu/w4TK0ZbkBJYiXjECZAz+yZh3jQkX1uyoSa+RThCk5KlWmeF+aVl0RGHca6IS7uDYdXRJRwdAvgwE0Ri8b1d2T0nXzbaown5Nv+mofiT5Tt2VricVr5Qt0ulVROA2ZqZHYz0TDE3nAMsLp5ql8AoC5ctzHwkToSTKPoblkmW2VFPnDSpTboTnz6Wedrpjak166xa0WVZZkBn1tpmknk8+/pitCgWOYp5OEY+fhIaqy1StlM43fc5LULDTSQq/EJRvgOAQAE3JYIbex2WSbunN1TuYnYtU88WPQ9FChrlOZJgRJ0G8QMxUXlcXbPc7YYayn4IUh5KBNv2HXlyATnok0oCvBegxgaUmsjnASgu6tby38sVhcEFi4vWmNlPvR+e/yzsH9LZUFkbi0ZLhjBkDjCuQ5uInaQXAyhVYrRVF1AlbHBuSp+tP4eDBsP7AEOpDBlbty6Pq9MJk1e3jCVtcWXh0I3aWqfzdRP61PxrsuoOheSjIhA3vHv1J7BftULSaaWpmEttUGmo5z6SjTDJ6RD/aTAtN5HDngD3GM6FAN0C1vVLRbmSbD+lNewSgiduyDvED4CKO9ByTCER5uU6jwYupUERnDoLv/HzKqB0Hx8+HrhED2W7LdV7x+RCGDuyXygqAmkmYUMi56ZCEURu6EzGtZPMGSDLZr+OwbNl3KtceDt3QJJ3RkonlSetPCH8s7j9sCqXNGQmJjC/2QyloihMdcxRPhwcyvdOIVTisim70J+ivzkrz8TYfOsaRtrrPbUDpIbI0aykt0WW+7s46mSSX2Hh3Ayzz42QDJFlMI0f/phKLFOyqcPq87MeDo6rOLsK+r2jlzOp07KfYEQf2nd5KQI7FY0v5EPoTLLdQvV7FL8m8F5YlnAjxn5Tp9XR6NTiSX/syWr2ao3TXYgwbama8DkOasnCquH1mG8yrB8RVIQVJWuH+9rHv3FqxU3XEN0o2SPwolRXVAFqOG90vIkJ6Rnm6aFUYbWyCropsFFf/95IZ7zwBRvobs653S30kQ8SxPYqgzRRcZbFQSofdIBuer3Emi9YDt3+od6L29mHShZZyGyaUtySjgD/UKl+6QlMs0uqzeydm3BEztkP1uz1EG8IoMxNWb9fxvBti/DAAVlrZYCO7HCiZ51vz3kB3gDt587UWihHPcc+V9GKRyg0n0/O8lKpb3SvL/cc6UQR6V6ikfiRX2LHQMtV2S/q8EumiwFdAO6/vtGhzjNIff53immQ1Ag/kmm/p8e84xaiiUKiwasteUgjxbOcYlDv7GZkgBjklMSUe5cQjnya2f3xxi1+CODveOq1DZ6tk59JIPElvFk1fwDq+Rf7XussQ5ZWB2bURUF/mBKq/3OfZoMMV8it8tJQTxa5VFzpqCYSiRIVXUcm4VISqKW7Ph8nVWAl1ktlqIB3JsY7SzJoyQDO8xPmpbyg8vbzcsjdYnkz9y2E3K9NPbvb1aaYT+cbGUS3vTcOsGMQtK8PsILmAhGPNgPggzQSwv1PkmOGJVl3piKUhDF57x7rrvZ1hlS9OabhlaOrN3EueOB8ZnAZD71L4Yxk2tsWMsTtoxSCRocdHr0bDIVudEQ59ukGq+zC10krJ0t5ajzCnCbLQMYe/HCmrOSxr8VTf2JqmjbjMme8ssl/8BuKurY9u6SxOqx65fvIwUZRPBv8V37utSkmM03j2zZL1XU0tW8sBAVaSQM6o2/I9iDmkjScY4zhWZc4vXqZOgw13ndfSnXv4E3G8cK6KXP9BFtb67+I4hKpxlfBD6kBNGLLEqtdB1QjPy+oA40QMEA9LOwnVoVV19dNDfDgupYQlirdp2I4TheZICIiLaxtygcZsD5kP5rCJCU15lDka76u+Vn+kLPPYlG3uOAuXVTY7/llQ5SKRjCwZ6MD3GvidMbAi1/vOsW70Pqiegc5B3lEHuyfbSZg0CRr1ge06vgYH7n0a5LY7xAuTgIxX+RPiFYpCDH0cpx7Dtxo8lvyvmdTldIu3oYP3TNLNmtvcHeLmc2W9Xbh5cjliiYY4tSfD8elI2YJGQMsLCPZ+ACgg66nPjjWLwfgM3SM3vPUx0dhanWUyiFjCK/oWtgOAQwh1pdQtW6HQJpHugnpiDYzIiXC+m9SOITAauph9iRAunEFeq8wXtpiiQyFjNjZKaMxURQ4buEcLF3GeBX0St/7Mdave/HrXtHTGikbykzbu69r2+76JlMaYNtAwf8c+MRundEo+CPLqk2Cp56tIZGzKORroSBv8VZjwReiuBs0XymmNXp0ZodzCDK5bDrBiEjNg1gRwOS9mw7JlXrgRqRAI4H24NQiAjj5ZlIi6KjyWHrwx9SUrEQlOYWtPFWEBbQqFPZr957w4XaHRS/eLk6BCBtyAzGZeVxrfUv52nFSleGbUDWLGnlVGLVejEAX7kyqOhIgcZwlWVLf7FyuNtAP1r1HRZOAuzmic7sgA7avlZ0TtYWr/sb0A+7njnBlmSfd+QUW7FTqQaRylw7uYfBpQVb4lSYyxbdhIFxktBtGj5YUhn6SFn1fHhnk/Zj6G8z4F7nx9LI9io1s6Hifr82FnuseOf6KQhN2RJ9mhXri2DSjVbjF7SVmbGV0VoEqrOLHg2RsVyHcA7W6B2kl2UZmSmxrT/Q+QvuB2xEuRpcHO67S0u5QibarzrcHXvyNLnB2nt03rtnO9q/UPwuYVFcig+ysSZp2Cc7q/5XmRYaAzPpnr1umkbGYXkZkihZKUF7sl+Flizmk6nl+1zM7ECg6jNgnskIqyFzNMAMb6cN+l7z2KVb6J262acVoq9GVZIp2v8UgqUGRhmGRQ9+pOrdI6TztxHeovO4gXc0WfzaMfXKYny8Omdsq+b+JXcKHtGeYtUv++RSSBBIQW8cpMrdwC+D/xaFQuhhV7xkPv0iaRNE4izoWolsgn/0yI5bpEmYjHd6cFU2mKqUEf4BWboP8uridZM9b4mEkV41nUsbBL3zb3mcw3yKCtTETbEcU6GGWH1VXeFLvHB1zF8fAwRYev4MJAAXvsfmN2RaqJvAX6FoFG/A63sCl1hRcFyEeiGiXC9ueumQzLMPmstRgKMdqm9xykkvx2X+2U9d/Nj0V9fMQArwbh8BRexVDc2MfjS9OtWXoc2tVTaC36q2BlCSIHhPUhn9Ws1SDfJJdP95JHI3jwNzNRgy60+ClhtKZ8ARcJSl5puo7EeydjVr8UCd537xPvZXnaSVu6e7Aw5vTNZas80z7jQSZbvZ+M6GjakL+jgR9jOL8wSYaQZji5f1kFUTlvaz8MUM0fNBkPNYI4z+wMww6Wwn0d5TI1BJ+rpQFY8gv5WPmiXLU46hYQ6rZM60Fn/3f3Go+ChJF93GR3LgThwTYi57pBxSxT8yfRI8Kl08QzQMRPJzLvmaDHcwbn+9+ZJkRHWdNzusHRTvFhhAfcqdsEV4rnI1hJcapvNmAu4+UwWthTZT/5zotFFU5P3ZMbPoHURhZnJi0F5Es8CAA2k5kFfxK+KFRL2zYrXjFt3rTDaBguCRByJ2zeyZGTgNhqqkc1DHAzgC1GUBTrzDHesOjoJGL7ZBsAZhKTkkWdr+m1Bx2jf8VaEsbwNoyJEb6kTzmG0mICFKQdH5x4zPaqOhHIi3vb/NjddhseZFfvnJHRaJx6S9Cna1Dl8GVILY4pC9/h2ALz1ORSHaV8llPYPpWl4XY7JfMdebA6jJNd8x3VNKCeoPVDClg2FcvRZ1v8qlSkaM6vAYoo9I1PAECUrPZszkQSNba2Rd6Drr8US8ONXQfngw8tTjRaKgJ4ROZlYdBML7Oe5aicudvy/eZjeifCvQSMpQjE/gAIO320HrFGPFDZRpamOKK0wl86yESyzvG89txixtg1A8Vvo31ML12QKNm0iW/19R8HeSIr1Qw8N+MWOVotDAcUXoQroT7P7q4zwN/yWFitBUR+KEoT3xv+Vt5HiOoyJl9K08MfhmH7dBpVKnYosaDZQdJjKqFbZFFkz93+kVElNc1iqikm5MZZ2FajtfZcrdc7zJBt+bRwfd5Nckld7hJIsrMYHzzsSySl+4kf+eFJQriRTsfIQxW9V8k8bMLJ5K5HXC279Y3Vw75prFwzTy3VcQGXkgDK1PnzoyOhKpUrTrTc4OzR9CgANwWIj8UHspS6TBYXO8YqIFYPfj5kPntaMHYsKIgpepAz7p7Yc7ccmcklECf94nOBBgS4hwMd+G5hsW/gza8mZbiF2fcmIEKQCzzrRHOjxR1Rv+6mH26mggwbKBTKYrX3XYDmPrQdyaASyOmLC6mcKfoed9we2eEfUjNJlNXpm5UON4pqqj6euaMe9FdCowI1F4cDHbSZe6dOQdT1AQbf3nbo6m5vUq9UE6xDAbQYba8fQ/xoi8ZAc+skqFbReCapfRipx4Kgqq8c6RHxgBm9SC9EzgJqHBDRrbDd4pBl7T3DNSSLkldAFuNf3+hvvFxVE9D/zlDXOeGyXngYtctJlCxO6+MpZxFLGJlKy1XXDwn4BBe3s5nTE2XHhDZguxGO8V54DQtkuDhUndiN+hw+kc2KYkIsFD186ux0R/fnAH6l0HfBv68AswxAxsvCUZXb33rORht39YWLtrC3FdZX7Q4MeP4ML4gGlvvCA7xLJwj1ptiCo2C99itBKJQzIMvaD8h2V8TepX/fyoq9TYvH0qEWgZCILSjwjQPIr14DxqPBYtwiwy9Fwtvd0vMnMbldYCyK7G+jSVPHL74yGbv6rM4f9d4Kmg16aM/gmGu5uZ0lZP+65RHtUlrSoD6eGz+2tktbqUCTPFny2L6/zyQSg1ttJRVfhd9/GwAANHZUVd5FX/ygpucxWVSTQr6y/r4MYzMbyaVm8dKY4HxOcYXhg0ob9V++COkAE8Hm/jpJSuPOWalM0HBvxXVPNXNqsKeljuTIBLXLa9QeUsYfW80DZoxY7KYmtqpTqXpFhJK5Eh1p+8VmCi5g933cO9q/TiCOsR/wKI4SMTyZRcGaazGc7Ef/PGc89F8lzo9NtF6NwGpCDEY24Nj/1hZt0r6nOX0djLk7WaoxyfrAdubcfh2Wuaer+M5qu9I3UWVkzPjpyBSOwFZFEPfpkj+2RfxqHxfQz/dwgbDroPME6xeyOYN2kbmHBj8Kh/O+66qxn6tZqecrQ+3EBfElDuXCYUtil97c1ZN6fnj6bX/J8SRbvbuiSU7TQci1lIe/CvUoTz5bBv47ipz1LdHCTQnVjIqXvfCUnKqtNew8zBBr4PHJ2OMpr/jDMmXMQjQevipx87QpRiv0SYNr12R3wcmnqbo9TAVMVd2QvhiNJYkxUeV1RZMAPhj4co42RMVHrg2NS0CQPP4vwcOjnUC912Iz1adUnVTYosJSf95jmofqRLYVp5lPX16anCYV3RtwMRGQtWrXKfHuD1WGfMXhXe2kSbeNBXwemo0tITctP7AGUQ94Kym7WXauCUnE6u6ffHsGr/JH4g2nqTXx/nWqqmKAlmRrZCe7qyfD4zznlCaboeKqAKi06oWD3PiI9u8TXBklQC8wSTeiLIWg05+mzH0T9Vy5uVe4E0ZJigvvqIHV7cixjO7dhn2xB+uieRCEflDvTZ9Rq5CvToeN1SOsxYWMinwq1pGCRd5OGIJJCIPZnoAAHZu/3gXc/dpd/cSvikdkHOT+/8kQgOpIS247I+8zIror6Pk8GMvrkbzPx7VOcB3zZTKNlQZpOAxcf6ZVxBb7NPDr6cF3yglghssu7f38dJWQUSth8ZhNX5mRvvGFHIrnittlkeysEVedwXIhzTlnS3Pp+6ctflscwFTVNAbLGpXi/f7hxQlfMqipMP4T+XKA4Kf/wkXcmQGlWsvPb8aa7qBZ9p7QaN8PhGxtoSxMCKC6urrSvsraFPrqr1ODTJvZau9J6z1N52C2/KXSYHX77ABSWJj6vHm2E5ZsXxBC0aSla18lhgadXKk4b2cFhTSzn3RDC37wriTD+lDey1SULKr1C4Jn6o689boj3ZeGz+T56xJ7xRd2C1hF2I3FYSGliSpa2ZwIAy09nTEvud1EvZpDY7r+yDC2pPtfgWjhr1BNw6HKNqLa9rU4ufzUaldRF8TeWEK7OsvKRHqo3SWrPf+ylSMr8I7kZDRU5Mg4Yz+ykYTjzuH/+blEeAGhNnnRC7xO37+flnC2Gfg6zWttxjcNRXYnDq/cxoz7Ooh6Tzmo/6FiOhEU8yUFRBJRxBlsMpemTOlXxgzYnvVe/mDYfT80sRrZSwRLzPGbEc1xQQ0m6RMQJ7VW8RVXF4PMRagyA9qBPS4H21Tb7gzN2+3b5W5SZViD5YGoRQogHW2XpOFcZL1V4Q9LRVchcZ5R7oCsOXdX26KEHn0FGcIYQTjYtFQTyBo9krQLUBsOwmR7PaT31lqkW/sLdUQTgRCqoiMHyzHJfS/Ga75hDaTd2sHyxiS1lSiIuMUX0BQNSWjry7QPg5SlDD7oSu/qUHvbg9mLKxBlisQE2tcmT14MIHxno0fEuvzZ2P+agc+379coHuZ0T19ic9qULvrBr6YtteLtRitcFKUgbGvxfWHlYn6PqtbAxQ9cVjsmkPWXNbdQ97hUXkcdy+JCyUz026bcbQXih8CJmGyZARwS18acGb9vP4Dv0fJsEFCJiYlQlnl3wb2H12H+a1JVb1hELfHAdiuGu1H//9a8O99zfb8n53VvE8slbv33HMhANVKJ4JOhCEHNaKYeu8zhDJKh7pXclLGBURSPHeIeAbvKYfwodr1Vh8rD6OIGZQ5qCWg1zAHtqhFrkjEee1tbN36a1c9940icju6a1L5vNacS06uqoHr10O386tIvIVA8kYa0TVylVm0l0ub34cR22Em3tJwh12aRAGn5w27Z+7uTL4ZC0NgheoHoaMIP9k43kz1i99H9LcYtjFVL/kTQvWo8IJC3vaKlO995Vkfu4O5tVC7r/oa/l11daFhfLdfLNA6cV9/MfNPcsUyxd6PEbgiM5Skue38hslULc1Eq7KC9ZzhVxD/OC3tMRFkP/myKM5cLHBjKjnxd5sZknG1S0pujb73b08TxkjFP3uF7l4wSveYKJB1OD4cK6eFuymFTMrdi9NNrCN+ezjH78nXYy9sx3wJP+fxoEAlrXhyG4Q7+LIKgy74S5jzE2uxs/eMmfmvBFEuFu1BhGfwL4TQPkRNG6ZR4XKuS1k1zaa/T88IQ79k3hFT9la9W+GScHaWib8IjdBLAi9CeqqKyaRe7rAukLjsdKxNC/2yF/nIyoTqMhs5CiKu6ixwwa/grIPHdTWs5xN5olwSbJTgqEjrMfie49x042DL1pPMnZ58WiCl5fDeDDMCnLoMZVVX9AbyHdXU0g3xrv85UpQdtMafKTY1LnZfNsuX3CE1Nvnre0tgjpoXO8ROczZVkiuFtP+CkViTweAfot8p6BQRuW4MUPG5OKIqqn7Y24/Td2ZJIJNAJWtZSnbNqs5Ub4YY49XKq5whOtfcRSiKfIZAozbzRCYL5ALArNJeBHhR+FsxAflzR9Aw8U6KxJVk8Ue0H4fynDSEKdS/OTT1weOpuzzEGWq6Sb8Ef4d1JNUPxqyKUO+WOHfruNSIR91lqaOQVBs3qWUcqQmQL6M7iwV6jd2HlBZK4acKivpxLHuHBvhfPwSPGNWvkyK57c4GJgqj5I7fRkAKBiorcOwPWdhiSvn9zFOft1B9ySOK2a4aOtcC6yylqmdasU1wet0jF6MnecEdnSimE/Ye7O9jP7/hexQnmkiO+K9PELr5o6ytzWyGhJPxD9lrf7QNHCxYbuTrZMNfrCcyM0AaaYVUq7xpzoB8fG44Z7mQ/MH6HG6BA39JW7+ylBt3NTXkvwokyM/kr2Yxk4llDoW9EP317iysFwqCKGGbpsQLk7QnUxV4g0qpYjZnP89qenG/MyOQjPkOpa8e6jy65Eiy5EUl3oHnXvL1wuG0ztm2le/DLSXUMJlna4Y21SYw43MX0QFBxXGMhZGcaozxxCxKMt9zFsm5J8pWAOOgGMUEJlLLdy+WmaJVuiqVj954jOYgiW5iSaDo+a8IhOEUmylJbXFpmEZloHviZTM3WMdeN+krforX7f2AmkdYnOZUBmXYIPrqgFKmt7KpORHD7LEo+BNKnvYKQa/YoLOwv/0L+qvEDkOr8aasFqUvv3kudd+06NZXzvkVQptq7s9HGX08FjNeIwahbOdhLcqc599TMpmTX/nC4DbmQjqufEGhxDVprYpgUElK0gOI40lp2R+dB+t6pAWjHWDriDAsnWwmK7T7wqeVH2sDsmkFjqiBCHtde4Hz4YUaJP99RrNM4eTi/p5CK1Uk/piTG5bFz8H/5hV9LyI/s12GLbcg21I3OAq3AHRE6ucTs1xf2NxPN7adVoN0xCb2TnEUk87EGWGSHQEWsLpRxh2V4WKREJ/x9S8l5hzHhCAOWW5wqOlXpXE1IAFkKECKHqhX4DME0x8ZMXaB42Y3DtX4R0+Q+tqLwoh1gwEEXaxaP3cAZ6NlR6c8yfu79DQ9msWeMHD+DwyFumQGtIrIUpuJGoxVhC+kh0ug4VqI6pl7wx0yhkuQaXQph/0rzhaAODFT229Ysdp0q7dqdsCJaegHX2SQJflBDHbys6nJXLlOxl7eK3yDE2A2c3jsnMzLso2bLoofwEg9FAy/9Tw/ikoth5hVT62B/8IRQlRoIn7DJ/xKJ778ix1JXB53MhKNwaSD7AHN+dBMy+i5/28ghoc0rc8MOBzDQByvxhqIdjjvLFE3bXGAPvHybtiRRJWX7qUrQ6YzuhaHydownQ2+fSP+xZPVXa/m/SK29QjT7uiTTbP4S0dfS8HII5NYWpiqePwfrO2AJz4Zu7tDHZpWMx6LMawh3DGonkAm8WWnrRLsskSbpohNQQLzIMPKYQClWZMGDycKgq+TNNzwdn6Mg7TgMq+tb4XB1dsuxrGnDQ77j4fPQ6DRuQPikO2tcWN3yXofeyAe8CdX7AHGSUib7AwxWGuOQsGrBQrkJEgL410w+pdYHgWXHxik+NaTUq1OuWCnDWYbRi/mpzB3vKHCNH9E8Qv/ucZ09v3FEEoJt9j/X9eS0apD/O/VI8HTWDgtDw51g87dTG8VV77rFnwkN1Iyz2vfGsBVuIZHgUecoJLt5PTkPG2ExgWtgwT1DP8iszT7dMSvnweF3S9icjvJkk//PgwAtgdIOjVmjP6U44oNZ0RgNM4zg5tEKutzEUg61BqeXCrpgjPW1zEZRJakN6CkJMZOeNO+50Iz78JCJg/Lcsq1BmSyCMUdexCwLcdPfYmzQMBouLhBZu9H3P0LcYGYGdoDdMyvCId6aZHxCP1+nkRFM+GBq00WEDX43rW5r3vL+xZI6v3rNslR7jKJEnHwjt+XZ9raEgKZSpjU1qOZft8aPoTf3J73EQwMKLcHryQG+5SpiuXy+2wNOI8syXwhhj5ZF4XeM5bML5QlbVl+FPt42223acPLoeGZvwmM9nSuCynlUMhgw32JrDSp9Z2m6uie2aIL9r52KTqawr5UxnIjQoyCWcw886Ye6lBmHC4mayrLxDTQAKaVEwkw0tQTEojGBSZ7CKgk/2xFB/G4cSsd3t05nC7/sVAXAVUxCDpTrpK3JueMiGgFnSd1bD9n5lSGOsvvWrWkMjpnCNYt4kxUjWClIZSB9MtomnWOBa7LV3omDy689sebTc2JQp+4gN6s94fLWSYMFEcOJixk3qOlqDk9uguCBczuJZ5WM0uQbDZ9HvwmScyJ4ag6e8pVywOLsYbfYyE32RZtq0MO2W5WB+1E/mxhYjN8BrA+TUM7owTnOi1r3P/qWmwBpfgC+jyNQyG7k12BahrfBhYsA/Orux6xZzKfcNYowOEjbJ018ymCVi8l8OQnCv9JnZz5JAgsCLFp1aRNRuRI9KmJA/s/tQLUwJK9iPsQuVgtR2dsQOT8F4adV7pPu78Jnaq7ZD6+rZa5ijaRAv1Y7oiwXfSwwLEXCKNpVkGsSeimN3TYqZe8CTbQHjdot75ufuQQQMrV5/3CRFTKXXtTbw7keGNPvTPvgqlUdj3B3mt5OYqqGNR23oaGosN+DfPfewbuATKn7TkDZF/UHoyNhqCWg0nGooOP9kX+h1B8iXk4Z+DzL8ffKfJMlTxR8LFtrfToLE7dLLSHtCoHSpDBLWR12FWkYFJHD3g2QbQ/7FGcBzFzQigeOof/tMKqDwTQruQAg2CAzKdMey50BgaogOrcdJl0vPyVpWVG+DNmU1D0kK7Cc0XepUP3hJ7tkzh1f5i0nCKUMdTlHgbCeecSAdwENlGiweFP2m393QAZaga1xU30RMR1nbjOTJ3ZBOe1SRcZvo+9her1xFbSZDr5fEGKE3hEflF0gD6TdDdBB9l80xxTTStQ+I46c7aP36z/8RDwb9Qj/NC6GUNdR20rOD5ZVxec8Cxc4W3+zbg27HjQTMkpW76HypfRkOpFE6tHH2l61b57vv1Blxo5n0pavPoTej1d2fyKF7SOBzK8o4tVYk9CjPFa6xZax05Y7AJxsjsObPpt3XCzwMjVkAdf2Aof37EVeGt2GUa1nv4U4ZZDSNJ1E/7+PEs0nRhZ63VrYGLO9y6HjIkx56J+LiTF0casn+M53g03doOSewPX5uQ26UKy4m53u7Pc+28pCl7lCP5p7xgi2ZNPiciw1kDohmp+UR7EY6Dw+XtIGYD7366aCdkABuGY28nuN2TBrPgT0LkJxwWC4MMWUJea+6iL/yFPobIS2Gq/7r8bnkLwjAgr2flSnVolUTCfDafPGrk6wxZYSYrB45K9HdNZ0YmOouA1cjXVAIgmVqoWoqGbf+ScuMpkKAcspx6Uy7egTnnY1igW4RqzOTtWGklnDXwjjphXszmM/sfzasSahu1LrVOc+jmmZ7jHpe6ikwn5exUvM8vGhqW8SIEcX3Bjq6vtKgUJGkT30dAo1r9AljKpNNsmMp6exwMTLEj0vFSWu5pFBnjyIapKuJuedvE3IVGRiNnXt+d0LeD+L7T9DOTEgvYxrG1SsVPuGSmZfWviW9sqXz0JkBTPW8U8bAN2yNF8RViaG+ALayDYNSqRElNAQx14RJzyA27eg0wh0LaU5+N+T+Ol3UPj/I1Tyrz35V0HqoESebyL2lxiNBvTVjst0qKKiRV57kKq91j1CNRwKYKK3Xg30Han1VPPN5gfxZKi+XklA8j/RTfSB7Cm/PWtEgH8Kospw1RXm64qYRnVdV1g+4BoQi+ooXZBKJnYaTnyco96au2T7t36Vx2cHiVDSjkFHnJPUGtkdKtiUoL+peoXwCeMvQc0aOND6tAMkj3mKYuzIbNqfpK20y2q71ekV6Md6Wfe6vRjXjPBdwJ+ZUK9BQVdqy2uo+TY9On4ZrAZ/Fg3rr+EyIEmm20G874lLcsbaAOBeFcOFrLWqHRYw8WcuFDef/Hnnmul34S0e5zoXtaUZVMmIRgPJWMEzICbpIPd78w+aVziWSiczc3il3RliL0snqHgQI6ouioz2ew+KzZBSuo2PpHG6bcxPFMDZre6UBUYwoq6RpGmm/X63e2hZzGMJ0YEqnyQr7wPftuwIquEra01TJrZEntSXQnlGmkPIHEAMUP2+uy+lgrJpQjilycxOfdl7tgxZTvoRn6Ru9VfIhOdLmW18bO632gno5/wjo7d/B56MmqMHFHBoJx1ymEviP4Arwbl/qresTjZyvv2Gscac63qK/SrynI9S2rjy4oT1PtVV+HiLo3z6XGcX3vqdrETBzYGKhsdTdUmi8D07bWbPy5PS0SG/4czsqq+HweSj3f9/J/+F70cW9Eapka8DvCck9NV6zSft7QthAz8fIx5XGmF5eU2PLzUDNd++IE22wqM51g7zAiNMasOOU9MCqztzW8YXv15ieAiPrdgYz0sAOZ98EUfDEzyDX5hqJw2ncN3Y+YGm5GoGnYAgl9OLniaUdc0fd \ No newline at end of file diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 513d21bd2f3..80667b033ad 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -1,51 +1,259 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { TextStyle, addTextObject } from "#app/ui/text"; -import { nil } from "#app/utils"; +import type { nil } from "#app/utils"; +import { isNullOrUndefined } from "#app/utils"; import i18next from "i18next"; +import { Species } from "#enums/species"; +import type { WeatherPoolEntry } from "#app/data/weather"; +import { WeatherType } from "#enums/weather-type"; +import { CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER } from "./data/balance/starters"; +import { MysteryEncounterType } from "./enums/mystery-encounter-type"; +import { MysteryEncounterTier } from "./enums/mystery-encounter-tier"; export enum EventType { SHINY, - GENERIC + NO_TIMER_DISPLAY, + LUCK, } interface EventBanner { bannerKey?: string; - xPosition?: number; - yPosition?: number; + xOffset?: number; + yOffset?: number; scale?: number; availableLangs?: string[]; } +interface EventEncounter { + species: Species; + blockEvolution?: boolean; + formIndex?: number; +} + +interface EventMysteryEncounterTier { + mysteryEncounter: MysteryEncounterType; + tier?: MysteryEncounterTier; + disable?: boolean; +} + interface TimedEvent extends EventBanner { name: string; eventType: EventType; shinyMultiplier?: number; + classicFriendshipMultiplier?: number; + luckBoost?: number; + upgradeUnlockedVouchers?: boolean; startDate: Date; endDate: Date; + eventEncounters?: EventEncounter[]; + delibirdyBuff?: string[]; + weather?: WeatherPoolEntry[]; + mysteryEncounterTierChanges?: EventMysteryEncounterTier[]; + luckBoostedSpecies?: Species[]; + boostFusions?: boolean; //MODIFIER REWORK PLEASE } const timedEvents: TimedEvent[] = [ { - name: "Egg Skip Update", - eventType: EventType.GENERIC, - startDate: new Date(Date.UTC(2024, 8, 8, 0)), - endDate: new Date(Date.UTC(2024, 8, 12, 0)), - bannerKey: "egg-update", - xPosition: 19, - yPosition: 120, + name: "Winter Holiday Update", + eventType: EventType.SHINY, + shinyMultiplier: 2, + upgradeUnlockedVouchers: true, + startDate: new Date(Date.UTC(2024, 11, 21, 0)), + endDate: new Date(Date.UTC(2025, 0, 4, 0)), + bannerKey: "winter_holidays2024-event-", scale: 0.21, - availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN" ] - } + availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"], + eventEncounters: [ + { species: Species.GIMMIGHOUL, blockEvolution: true }, + { species: Species.DELIBIRD }, + { species: Species.STANTLER }, + { species: Species.CYNDAQUIL }, + { species: Species.PIPLUP }, + { species: Species.CHESPIN }, + { species: Species.BALTOY }, + { species: Species.SNOVER }, + { species: Species.CHINGLING }, + { species: Species.LITWICK }, + { species: Species.CUBCHOO }, + { species: Species.SWIRLIX }, + { species: Species.AMAURA }, + { species: Species.MUDBRAY }, + { species: Species.ROLYCOLY }, + { species: Species.MILCERY }, + { species: Species.SMOLIV }, + { species: Species.ALOLA_VULPIX }, + { species: Species.GALAR_DARUMAKA }, + { species: Species.IRON_BUNDLE }, + ], + delibirdyBuff: ["CATCHING_CHARM", "SHINY_CHARM", "ABILITY_CHARM", "EXP_CHARM", "SUPER_EXP_CHARM", "HEALING_CHARM"], + weather: [{ weatherType: WeatherType.SNOW, weight: 1 }], + mysteryEncounterTierChanges: [ + { + mysteryEncounter: MysteryEncounterType.DELIBIRDY, + tier: MysteryEncounterTier.COMMON, + }, + { mysteryEncounter: MysteryEncounterType.PART_TIMER, disable: true }, + { + mysteryEncounter: MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, + disable: true, + }, + { mysteryEncounter: MysteryEncounterType.FIELD_TRIP, disable: true }, + { + mysteryEncounter: MysteryEncounterType.DEPARTMENT_STORE_SALE, + disable: true, + }, + ], + }, + { + name: "Year of the Snake", + eventType: EventType.LUCK, + luckBoost: 1, + startDate: new Date(Date.UTC(2025, 0, 29, 0)), + endDate: new Date(Date.UTC(2025, 1, 3, 0)), + bannerKey: "yearofthesnakeevent-", + scale: 0.21, + availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"], + eventEncounters: [ + { species: Species.EKANS }, + { species: Species.ONIX }, + { species: Species.DRATINI }, + { species: Species.CLEFFA }, + { species: Species.UMBREON }, + { species: Species.DUNSPARCE }, + { species: Species.TEDDIURSA }, + { species: Species.SEVIPER }, + { species: Species.LUNATONE }, + { species: Species.CHINGLING }, + { species: Species.SNIVY }, + { species: Species.DARUMAKA }, + { species: Species.DRAMPA }, + { species: Species.SILICOBRA }, + { species: Species.BLOODMOON_URSALUNA }, + ], + luckBoostedSpecies: [ + Species.EKANS, + Species.ARBOK, + Species.ONIX, + Species.STEELIX, + Species.DRATINI, + Species.DRAGONAIR, + Species.DRAGONITE, + Species.CLEFFA, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.UMBREON, + Species.DUNSPARCE, + Species.DUDUNSPARCE, + Species.TEDDIURSA, + Species.URSARING, + Species.URSALUNA, + Species.SEVIPER, + Species.LUNATONE, + Species.RAYQUAZA, + Species.CHINGLING, + Species.CHIMECHO, + Species.CRESSELIA, + Species.DARKRAI, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.DARUMAKA, + Species.DARMANITAN, + Species.ZYGARDE, + Species.DRAMPA, + Species.LUNALA, + Species.BLACEPHALON, + Species.SILICOBRA, + Species.SANDACONDA, + Species.ROARING_MOON, + Species.BLOODMOON_URSALUNA, + ], + }, + { + name: "Valentine", + eventType: EventType.SHINY, + startDate: new Date(Date.UTC(2025, 1, 10)), + endDate: new Date(Date.UTC(2025, 1, 21)), + boostFusions: true, + shinyMultiplier: 2, + bannerKey: "valentines2025event-", + scale: 0.21, + availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"], + eventEncounters: [ + { species: Species.NIDORAN_F }, + { species: Species.NIDORAN_M }, + { species: Species.IGGLYBUFF }, + { species: Species.SMOOCHUM }, + { species: Species.VOLBEAT }, + { species: Species.ILLUMISE }, + { species: Species.ROSELIA }, + { species: Species.LUVDISC }, + { species: Species.WOOBAT }, + { species: Species.FRILLISH }, + { species: Species.ALOMOMOLA }, + { species: Species.FURFROU, formIndex: 1 }, // Heart Trim + { species: Species.ESPURR }, + { species: Species.SPRITZEE }, + { species: Species.SWIRLIX }, + { species: Species.APPLIN }, + { species: Species.MILCERY }, + { species: Species.INDEEDEE }, + { species: Species.TANDEMAUS }, + { species: Species.ENAMORUS }, + ], + luckBoostedSpecies: [Species.LUVDISC], + }, + { + name: "PKMNDAY2025", + eventType: EventType.LUCK, + startDate: new Date(Date.UTC(2025, 1, 27)), + endDate: new Date(Date.UTC(2025, 2, 4)), + classicFriendshipMultiplier: 4, + bannerKey: "pkmnday2025event-", + scale: 0.21, + availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN"], + eventEncounters: [ + { species: Species.PIKACHU, formIndex: 1, blockEvolution: true }, // Partner Form + { species: Species.EEVEE, formIndex: 1, blockEvolution: true }, // Partner Form + { species: Species.CHIKORITA }, + { species: Species.TOTODILE }, + { species: Species.TEPIG }, + ], + luckBoostedSpecies: [ + Species.PICHU, + Species.PIKACHU, + Species.RAICHU, + Species.ALOLA_RAICHU, + Species.PSYDUCK, + Species.GOLDUCK, + Species.EEVEE, + Species.FLAREON, + Species.JOLTEON, + Species.VAPOREON, + Species.ESPEON, + Species.UMBREON, + Species.LEAFEON, + Species.GLACEON, + Species.SYLVEON, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, + Species.ZYGARDE, + Species.ETERNAL_FLOETTE, + ], + }, ]; export class TimedEventManager { - constructor() {} - isActive(event: TimedEvent) { - return ( - event.startDate < new Date() && - new Date() < event.endDate - ); + return event.startDate < new Date() && new Date() < event.endDate; } activeEvent(): TimedEvent | undefined { @@ -57,16 +265,16 @@ export class TimedEventManager { } activeEventHasBanner(): boolean { - const activeEvents = timedEvents.filter((te) => this.isActive(te) && te.hasOwnProperty("bannerFilename")); + const activeEvents = timedEvents.filter(te => this.isActive(te) && te.hasOwnProperty("bannerFilename")); return activeEvents.length > 0; } getShinyMultiplier(): number { let multiplier = 1; - const shinyEvents = timedEvents.filter((te) => te.eventType === EventType.SHINY && this.isActive(te)); - shinyEvents.forEach((se) => { + const shinyEvents = timedEvents.filter(te => te.eventType === EventType.SHINY && this.isActive(te)); + for (const se of shinyEvents) { multiplier *= se.shinyMultiplier ?? 1; - }); + } return multiplier; } @@ -74,48 +282,203 @@ export class TimedEventManager { getEventBannerFilename(): string { return timedEvents.find((te: TimedEvent) => this.isActive(te))?.bannerKey ?? ""; } + + getEventEncounters(): EventEncounter[] { + const ret: EventEncounter[] = []; + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.eventEncounters)) { + ret.push(...te.eventEncounters); + } + }); + return ret; + } + + /** + * For events that change the classic candy friendship multiplier + * @returns The highest classic friendship multiplier among the active events, or the default CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER + */ + getClassicFriendshipMultiplier(): number { + let multiplier = CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER; + const classicFriendshipEvents = timedEvents.filter(te => this.isActive(te)); + for (const fe of classicFriendshipEvents) { + if (!isNullOrUndefined(fe.classicFriendshipMultiplier) && fe.classicFriendshipMultiplier > multiplier) { + multiplier = fe.classicFriendshipMultiplier; + } + } + return multiplier; + } + + /** + * For events where defeated bosses (Gym Leaders, E4 etc) give out Voucher Plus even if they were defeated before + * @returns Whether vouchers should be upgraded + */ + getUpgradeUnlockedVouchers(): boolean { + return timedEvents.some(te => this.isActive(te) && (te.upgradeUnlockedVouchers ?? false)); + } + + /** + * For events where Delibirdy gives extra items + * @returns list of ids of {@linkcode ModifierType}s that Delibirdy hands out as a bonus + */ + getDelibirdyBuff(): string[] { + const ret: string[] = []; + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.delibirdyBuff)) { + ret.push(...te.delibirdyBuff); + } + }); + return ret; + } + + /** + * For events where there's a set weather for town biome (other biomes are hard) + * @returns Event weathers for town + */ + getWeather(): WeatherPoolEntry[] { + const ret: WeatherPoolEntry[] = []; + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.weather)) { + ret.push(...te.weather); + } + }); + return ret; + } + + getAllMysteryEncounterChanges(): EventMysteryEncounterTier[] { + const ret: EventMysteryEncounterTier[] = []; + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.mysteryEncounterTierChanges)) { + ret.push(...te.mysteryEncounterTierChanges); + } + }); + return ret; + } + + getEventMysteryEncountersDisabled(): MysteryEncounterType[] { + const ret: MysteryEncounterType[] = []; + timedEvents + .filter(te => this.isActive(te) && !isNullOrUndefined(te.mysteryEncounterTierChanges)) + .map(te => { + te.mysteryEncounterTierChanges?.map(metc => { + if (metc.disable) { + ret.push(metc.mysteryEncounter); + } + }); + }); + return ret; + } + + getMysteryEncounterTierForEvent( + encounterType: MysteryEncounterType, + normal: MysteryEncounterTier, + ): MysteryEncounterTier { + let ret = normal; + timedEvents + .filter(te => this.isActive(te) && !isNullOrUndefined(te.mysteryEncounterTierChanges)) + .map(te => { + te.mysteryEncounterTierChanges?.map(metc => { + if (metc.mysteryEncounter === encounterType) { + ret = metc.tier ?? normal; + } + }); + }); + return ret; + } + + getEventLuckBoost(): number { + let ret = 0; + const luckEvents = timedEvents.filter(te => this.isActive(te) && !isNullOrUndefined(te.luckBoost)); + for (const le of luckEvents) { + ret += le.luckBoost!; + } + return ret; + } + + getEventLuckBoostedSpecies(): Species[] { + const ret: Species[] = []; + timedEvents + .filter(te => this.isActive(te)) + .map(te => { + if (!isNullOrUndefined(te.luckBoostedSpecies)) { + ret.push(...te.luckBoostedSpecies.filter(s => !ret.includes(s))); + } + }); + return ret; + } + + areFusionsBoosted(): boolean { + return timedEvents.some(te => this.isActive(te) && te.boostFusions); + } } export class TimedEventDisplay extends Phaser.GameObjects.Container { private event: TimedEvent | nil; private eventTimerText: Phaser.GameObjects.Text; private banner: Phaser.GameObjects.Image; - private bannerShadow: Phaser.GameObjects.Rectangle; + private availableWidth: number; private eventTimer: NodeJS.Timeout | null; - constructor(scene: BattleScene, x: number, y: number, event?: TimedEvent) { - super(scene, x, y); + constructor(x: number, y: number, event?: TimedEvent) { + super(globalScene, x, y); + this.availableWidth = globalScene.scaledCanvas.width; this.event = event; this.setVisible(false); } + /** + * Set the width that can be used to display the event timer and banner. By default + * these elements get centered horizontally in that space, in the bottom left of the screen + */ + setWidth(width: number) { + if (width !== this.availableWidth) { + this.availableWidth = width; + const xPosition = this.availableWidth / 2 + (this.event?.xOffset ?? 0); + if (this.banner) { + this.banner.x = xPosition; + } + if (this.eventTimerText) { + this.eventTimerText.x = xPosition; + } + } + } + setup() { const lang = i18next.resolvedLanguage; - if (this.event && this.event.bannerKey) { + if (this.event?.bannerKey) { let key = this.event.bannerKey; if (lang && this.event.availableLangs && this.event.availableLangs.length > 0) { if (this.event.availableLangs.includes(lang)) { - key += "_" + lang; + key += lang; } else { - key += "_en"; + key += "en"; } } console.log(this.event.bannerKey); - this.banner = new Phaser.GameObjects.Image(this.scene, this.event.xPosition ?? 29, this.event.yPosition ?? 64, key); + const padding = 5; + const showTimer = this.event.eventType !== EventType.NO_TIMER_DISPLAY; + const yPosition = globalScene.game.canvas.height / 6 - padding - (showTimer ? 10 : 0) - (this.event.yOffset ?? 0); + this.banner = new Phaser.GameObjects.Image(globalScene, this.availableWidth / 2, yPosition - padding, key); this.banner.setName("img-event-banner"); - this.banner.setOrigin(0.08, -0.35); + this.banner.setOrigin(0.5, 1); this.banner.setScale(this.event.scale ?? 0.18); - if (this.event.eventType !== EventType.GENERIC) { + if (showTimer) { this.eventTimerText = addTextObject( - this.scene, - this.banner.x + 8, - this.banner.y + 100, + this.banner.x, + this.banner.y + 2, this.timeToGo(this.event.endDate), - TextStyle.WINDOW + TextStyle.WINDOW, ); this.eventTimerText.setName("text-event-timer"); this.eventTimerText.setScale(0.15); - this.eventTimerText.setOrigin(0, 0); + this.eventTimerText.setOrigin(0.5, 0); this.add(this.eventTimerText); } @@ -139,7 +502,6 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { } private timeToGo(date: Date) { - // Utility to add leading zero function z(n) { return (n < 10 ? "0" : "") + n; @@ -151,17 +513,22 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { diff = Math.abs(diff); // Get time components - const days = diff / 8.64e7 | 0; - const hours = diff % 8.64e7 / 3.6e6 | 0; - const mins = diff % 3.6e6 / 6e4 | 0; - const secs = Math.round(diff % 6e4 / 1e3); + const days = (diff / 8.64e7) | 0; + const hours = ((diff % 8.64e7) / 3.6e6) | 0; + const mins = ((diff % 3.6e6) / 6e4) | 0; + const secs = Math.round((diff % 6e4) / 1e3); // Return formatted string - return "Event Ends in : " + z(days) + "d " + z(hours) + "h " + z(mins) + "m " + z(secs) + "s"; + return i18next.t("menu:eventTimer", { + days: z(days), + hours: z(hours), + mins: z(mins), + secs: z(secs), + }); } updateCountdown() { - if (this.event && this.event.eventType !== EventType.GENERIC) { + if (this.event && this.event.eventType !== EventType.NO_TIMER_DISPLAY) { this.eventTimerText.setText(this.timeToGo(this.event.endDate)); } } diff --git a/src/touch-controls.ts b/src/touch-controls.ts index 93032ce59fe..e2b5ad05baa 100644 --- a/src/touch-controls.ts +++ b/src/touch-controls.ts @@ -1,6 +1,6 @@ +import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; import EventEmitter = Phaser.Events.EventEmitter; -import BattleScene from "./battle-scene"; const repeatInputDelayMillis = 250; @@ -9,12 +9,12 @@ export default class TouchControl { private buttonLock: string[] = new Array(); private inputInterval: NodeJS.Timeout[] = new Array(); /** Whether touch controls are disabled */ - private disabled: boolean = false; + private disabled = false; /** Whether the last touch event has finished before disabling */ - private finishedLastTouch: boolean = false; + private finishedLastTouch = false; - constructor(scene: BattleScene) { - this.events = scene.game.events; + constructor() { + this.events = globalScene.game.events; this.init(); } @@ -23,12 +23,12 @@ export default class TouchControl { */ disable() { this.disabled = true; - this.finishedLastTouch = false; + this.finishedLastTouch = false; } /** * Enable touch controls - */ + */ enable() { this.disabled = false; this.finishedLastTouch = false; @@ -39,7 +39,7 @@ export default class TouchControl { */ init() { this.preventElementZoom(document.querySelector("#dpad")); - document.querySelectorAll(".apad-button").forEach((element) => this.preventElementZoom(element as HTMLElement)); + document.querySelectorAll(".apad-button").forEach(element => this.preventElementZoom(element as HTMLElement)); // Select all elements with the 'data-key' attribute and bind keys to them for (const button of document.querySelectorAll("[data-key]")) { // @ts-ignore - Bind the key to the button using the dataset key @@ -87,11 +87,10 @@ export default class TouchControl { }, repeatInputDelayMillis); this.buttonLock.push(key); node.classList.add("active"); - } touchButtonUp(node: HTMLElement, key: string, id: string) { - if (!this.buttonLock.includes(key) || this.disabled && this.finishedLastTouch) { + if (!this.buttonLock.includes(key) || (this.disabled && this.finishedLastTouch)) { return; } this.finishedLastTouch = true; @@ -126,14 +125,14 @@ export default class TouchControl { this.events.emit("input_down", { controller_type: "keyboard", button: button, - isTouch: true + isTouch: true, }); break; case "keyup": this.events.emit("input_up", { controller_type: "keyboard", button: button, - isTouch: true + isTouch: true, }); break; } @@ -151,7 +150,6 @@ export default class TouchControl { return; } element.addEventListener("touchstart", (event: TouchEvent) => { - if (!(event.currentTarget instanceof HTMLElement)) { return; } @@ -175,8 +173,8 @@ export default class TouchControl { } /** - * Deactivates all currently pressed keys. - */ + * Deactivates all currently pressed keys. + */ deactivatePressedKey(): void { for (const key of Object.keys(this.inputInterval)) { clearInterval(this.inputInterval[key]); @@ -204,9 +202,16 @@ export function hasTouchscreen(): boolean { */ export function isMobile(): boolean { let ret = false; - (function (a) { + (a => { // Check the user agent string against a regex for mobile devices - if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) { + if ( + /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test( + a, + ) || + /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test( + a.substr(0, 4), + ) + ) { ret = true; } })(navigator.userAgent || navigator.vendor || window["opera"]); diff --git a/src/tutorial.ts b/src/tutorial.ts index 3934ffee57f..82912f73979 100644 --- a/src/tutorial.ts +++ b/src/tutorial.ts @@ -1,6 +1,6 @@ -import BattleScene from "./battle-scene"; +import { globalScene } from "#app/global-scene"; import AwaitableUiHandler from "./ui/awaitable-ui-handler"; -import UiHandler from "./ui/ui-handler"; +import type UiHandler from "./ui/ui-handler"; import { Mode } from "./ui/ui"; import i18next from "i18next"; import Overrides from "#app/overrides"; @@ -10,57 +10,111 @@ export enum Tutorial { Access_Menu = "ACCESS_MENU", Menu = "MENU", Starter_Select = "STARTER_SELECT", + Pokedex = "POKEDEX", Pokerus = "POKERUS", Stat_Change = "STAT_CHANGE", Select_Item = "SELECT_ITEM", - Egg_Gacha = "EGG_GACHA" + Egg_Gacha = "EGG_GACHA", } const tutorialHandlers = { - [Tutorial.Intro]: (scene: BattleScene) => { + [Tutorial.Intro]: () => { return new Promise(resolve => { - scene.ui.showText(i18next.t("tutorial:intro"), null, () => resolve(), null, true); + globalScene.ui.showText(i18next.t("tutorial:intro"), null, () => resolve(), null, true); }); }, - [Tutorial.Access_Menu]: (scene: BattleScene) => { + [Tutorial.Access_Menu]: () => { return new Promise(resolve => { - if (scene.enableTouchControls) { + if (globalScene.enableTouchControls) { return resolve(); } - scene.showFieldOverlay(1000).then(() => scene.ui.showText(i18next.t("tutorial:accessMenu"), null, () => scene.hideFieldOverlay(1000).then(() => resolve()), null, true)); + globalScene + .showFieldOverlay(1000) + .then(() => + globalScene.ui.showText( + i18next.t("tutorial:accessMenu"), + null, + () => globalScene.hideFieldOverlay(1000).then(() => resolve()), + null, + true, + ), + ); }); }, - [Tutorial.Menu]: (scene: BattleScene) => { + [Tutorial.Menu]: () => { return new Promise(resolve => { - scene.gameData.saveTutorialFlag(Tutorial.Access_Menu, true); - scene.ui.showText(i18next.t("tutorial:menu"), null, () => scene.ui.showText("", null, () => resolve()), null, true); + globalScene.gameData.saveTutorialFlag(Tutorial.Access_Menu, true); + globalScene.ui.showText( + i18next.t("tutorial:menu"), + null, + () => globalScene.ui.showText("", null, () => resolve()), + null, + true, + ); }); }, - [Tutorial.Starter_Select]: (scene: BattleScene) => { + [Tutorial.Starter_Select]: () => { return new Promise(resolve => { - scene.ui.showText(i18next.t("tutorial:starterSelect"), null, () => scene.ui.showText("", null, () => resolve()), null, true); + globalScene.ui.showText( + i18next.t("tutorial:starterSelect"), + null, + () => globalScene.ui.showText("", null, () => resolve()), + null, + true, + ); }); }, - [Tutorial.Pokerus]: (scene: BattleScene) => { + [Tutorial.Pokerus]: () => { return new Promise(resolve => { - scene.ui.showText(i18next.t("tutorial:pokerus"), null, () => scene.ui.showText("", null, () => resolve()), null, true); + globalScene.ui.showText( + i18next.t("tutorial:pokerus"), + null, + () => globalScene.ui.showText("", null, () => resolve()), + null, + true, + ); }); }, - [Tutorial.Stat_Change]: (scene: BattleScene) => { + [Tutorial.Stat_Change]: () => { return new Promise(resolve => { - scene.showFieldOverlay(1000).then(() => scene.ui.showText(i18next.t("tutorial:statChange"), null, () => scene.ui.showText("", null, () => scene.hideFieldOverlay(1000).then(() => resolve())), null, true)); + globalScene + .showFieldOverlay(1000) + .then(() => + globalScene.ui.showText( + i18next.t("tutorial:statChange"), + null, + () => globalScene.ui.showText("", null, () => globalScene.hideFieldOverlay(1000).then(() => resolve())), + null, + true, + ), + ); }); }, - [Tutorial.Select_Item]: (scene: BattleScene) => { + [Tutorial.Select_Item]: () => { return new Promise(resolve => { - scene.ui.setModeWithoutClear(Mode.MESSAGE).then(() => { - scene.ui.showText(i18next.t("tutorial:selectItem"), null, () => scene.ui.showText("", null, () => scene.ui.setModeWithoutClear(Mode.MODIFIER_SELECT).then(() => resolve())), null, true); + globalScene.ui.setModeWithoutClear(Mode.MESSAGE).then(() => { + globalScene.ui.showText( + i18next.t("tutorial:selectItem"), + null, + () => + globalScene.ui.showText("", null, () => + globalScene.ui.setModeWithoutClear(Mode.MODIFIER_SELECT).then(() => resolve()), + ), + null, + true, + ); }); }); }, - [Tutorial.Egg_Gacha]: (scene: BattleScene) => { + [Tutorial.Egg_Gacha]: () => { return new Promise(resolve => { - scene.ui.showText(i18next.t("tutorial:eggGacha"), null, () => scene.ui.showText("", null, () => resolve()), null, true); + globalScene.ui.showText( + i18next.t("tutorial:eggGacha"), + null, + () => globalScene.ui.showText("", null, () => resolve()), + null, + true, + ); }); }, }; @@ -69,35 +123,34 @@ const tutorialHandlers = { * Run through the specified tutorial if it hasn't been seen before and mark it as seen once done * This will show a tutorial overlay if defined in the current {@linkcode AwaitableUiHandler} * The main menu will also get disabled while the tutorial is running - * @param scene the current {@linkcode BattleScene} * @param tutorial the {@linkcode Tutorial} to play * @returns a promise with result `true` if the tutorial was run and finished, `false` otherwise */ -export async function handleTutorial(scene: BattleScene, tutorial: Tutorial): Promise { - if (!scene.enableTutorials && !Overrides.BYPASS_TUTORIAL_SKIP_OVERRIDE) { +export async function handleTutorial(tutorial: Tutorial): Promise { + if (!globalScene.enableTutorials && !Overrides.BYPASS_TUTORIAL_SKIP_OVERRIDE) { return false; } - if (scene.gameData.getTutorialFlags()[tutorial] && !Overrides.BYPASS_TUTORIAL_SKIP_OVERRIDE) { + if (globalScene.gameData.getTutorialFlags()[tutorial] && !Overrides.BYPASS_TUTORIAL_SKIP_OVERRIDE) { return false; } - const handler = scene.ui.getHandler(); - const isMenuDisabled = scene.disableMenu; + const handler = globalScene.ui.getHandler(); + const isMenuDisabled = globalScene.disableMenu; // starting tutorial, disable menu - scene.disableMenu = true; + globalScene.disableMenu = true; if (handler instanceof AwaitableUiHandler) { handler.tutorialActive = true; } - await showTutorialOverlay(scene, handler); - await tutorialHandlers[tutorial](scene); - await hideTutorialOverlay(scene, handler); + await showTutorialOverlay(handler); + await tutorialHandlers[tutorial](); + await hideTutorialOverlay(handler); // tutorial finished and overlay gone, re-enable menu, save tutorial as seen - scene.disableMenu = isMenuDisabled; - scene.gameData.saveTutorialFlag(tutorial, true); + globalScene.disableMenu = isMenuDisabled; + globalScene.gameData.saveTutorialFlag(tutorial, true); if (handler instanceof AwaitableUiHandler) { handler.tutorialActive = false; } @@ -107,20 +160,19 @@ export async function handleTutorial(scene: BattleScene, tutorial: Tutorial): Pr /** * Show the tutorial overlay if there is one - * @param scene the current BattleScene * @param handler the current UiHandler * @returns `true` once the overlay has finished appearing, or if there is no overlay */ -async function showTutorialOverlay(scene: BattleScene, handler: UiHandler) { +async function showTutorialOverlay(handler: UiHandler) { if (handler instanceof AwaitableUiHandler && handler.tutorialOverlay) { - scene.tweens.add({ + globalScene.tweens.add({ targets: handler.tutorialOverlay, alpha: 0.5, duration: 750, ease: "Sine.easeOut", onComplete: () => { return true; - } + }, }); } else { return true; @@ -129,23 +181,21 @@ async function showTutorialOverlay(scene: BattleScene, handler: UiHandler) { /** * Hide the tutorial overlay if there is one - * @param scene the current BattleScene * @param handler the current UiHandler * @returns `true` once the overlay has finished disappearing, or if there is no overlay */ -async function hideTutorialOverlay(scene: BattleScene, handler: UiHandler) { +async function hideTutorialOverlay(handler: UiHandler) { if (handler instanceof AwaitableUiHandler && handler.tutorialOverlay) { - scene.tweens.add({ + globalScene.tweens.add({ targets: handler.tutorialOverlay, alpha: 0, duration: 500, ease: "Sine.easeOut", onComplete: () => { return true; - } + }, }); } else { return true; } } - diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 92b1653df3d..c9898f9b71e 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -1,27 +1,27 @@ -import Phaser from "phaser"; +import type Phaser from "phaser"; import { Mode } from "./ui/ui"; -import { InputsController } from "./inputs-controller"; -import MessageUiHandler from "./ui/message-ui-handler"; +import type { InputsController } from "./inputs-controller"; +import type MessageUiHandler from "./ui/message-ui-handler"; import StarterSelectUiHandler from "./ui/starter-select-ui-handler"; import { Setting, SettingKeys, settingIndex } from "./system/settings/settings"; import SettingsUiHandler from "./ui/settings/settings-ui-handler"; import { Button } from "#enums/buttons"; import SettingsGamepadUiHandler from "./ui/settings/settings-gamepad-ui-handler"; import SettingsKeyboardUiHandler from "#app/ui/settings/settings-keyboard-ui-handler"; -import BattleScene from "./battle-scene"; +import { globalScene } from "#app/global-scene"; import SettingsDisplayUiHandler from "./ui/settings/settings-display-ui-handler"; import SettingsAudioUiHandler from "./ui/settings/settings-audio-ui-handler"; import RunInfoUiHandler from "./ui/run-info-ui-handler"; +import PokedexUiHandler from "./ui/pokedex-ui-handler"; +import PokedexPageUiHandler from "./ui/pokedex-page-ui-handler"; type ActionKeys = Record void>; export class UiInputs { - private scene: BattleScene; private events: Phaser.Events.EventEmitter; private inputsController: InputsController; - constructor(scene: BattleScene, inputsController: InputsController) { - this.scene = scene; + constructor(inputsController: InputsController) { this.inputsController = inputsController; this.init(); } @@ -35,141 +35,149 @@ export class UiInputs { if (evt.controller_type === "keyboard") { //if the touch property is present and defined, then this is a simulated keyboard event from the touch screen if (evt.hasOwnProperty("isTouch") && evt.isTouch) { - this.scene.inputMethod = "touch"; + globalScene.inputMethod = "touch"; } else { - this.scene.inputMethod = "keyboard"; + globalScene.inputMethod = "keyboard"; } } else if (evt.controller_type === "gamepad") { - this.scene.inputMethod = "gamepad"; + globalScene.inputMethod = "gamepad"; } } listenInputs(): void { - this.events.on("input_down", (event) => { - this.detectInputMethod(event); + this.events.on( + "input_down", + event => { + this.detectInputMethod(event); - const actions = this.getActionsKeyDown(); - if (!actions.hasOwnProperty(event.button)) { - return; - } - actions[event.button](); - }, this); + const actions = this.getActionsKeyDown(); + if (!actions.hasOwnProperty(event.button)) { + return; + } + actions[event.button](); + }, + this, + ); - this.events.on("input_up", (event) => { - const actions = this.getActionsKeyUp(); - if (!actions.hasOwnProperty(event.button)) { - return; - } - actions[event.button](); - }, this); + this.events.on( + "input_up", + event => { + const actions = this.getActionsKeyUp(); + if (!actions.hasOwnProperty(event.button)) { + return; + } + actions[event.button](); + }, + this, + ); } doVibration(inputSuccess: boolean, vibrationLength: number): void { - if (inputSuccess && this.scene.enableVibration && typeof navigator.vibrate !== "undefined") { + if (inputSuccess && globalScene.enableVibration && typeof navigator.vibrate !== "undefined") { navigator.vibrate(vibrationLength); } } getActionsKeyDown(): ActionKeys { const actions: ActionKeys = { - [Button.UP]: () => this.buttonDirection(Button.UP), - [Button.DOWN]: () => this.buttonDirection(Button.DOWN), - [Button.LEFT]: () => this.buttonDirection(Button.LEFT), - [Button.RIGHT]: () => this.buttonDirection(Button.RIGHT), - [Button.SUBMIT]: () => this.buttonTouch(), - [Button.ACTION]: () => this.buttonAb(Button.ACTION), - [Button.CANCEL]: () => this.buttonAb(Button.CANCEL), - [Button.MENU]: () => this.buttonMenu(), - [Button.STATS]: () => this.buttonGoToFilter(Button.STATS), - [Button.CYCLE_SHINY]: () => this.buttonCycleOption(Button.CYCLE_SHINY), - [Button.CYCLE_FORM]: () => this.buttonCycleOption(Button.CYCLE_FORM), - [Button.CYCLE_GENDER]: () => this.buttonCycleOption(Button.CYCLE_GENDER), - [Button.CYCLE_ABILITY]: () => this.buttonCycleOption(Button.CYCLE_ABILITY), - [Button.CYCLE_NATURE]: () => this.buttonCycleOption(Button.CYCLE_NATURE), - [Button.V]: () => this.buttonCycleOption(Button.V), - [Button.SPEED_UP]: () => this.buttonSpeedChange(), - [Button.SLOW_DOWN]: () => this.buttonSpeedChange(false), + [Button.UP]: () => this.buttonDirection(Button.UP), + [Button.DOWN]: () => this.buttonDirection(Button.DOWN), + [Button.LEFT]: () => this.buttonDirection(Button.LEFT), + [Button.RIGHT]: () => this.buttonDirection(Button.RIGHT), + [Button.SUBMIT]: () => this.buttonTouch(), + [Button.ACTION]: () => this.buttonAb(Button.ACTION), + [Button.CANCEL]: () => this.buttonAb(Button.CANCEL), + [Button.MENU]: () => this.buttonMenu(), + [Button.STATS]: () => this.buttonGoToFilter(Button.STATS), + [Button.CYCLE_SHINY]: () => this.buttonCycleOption(Button.CYCLE_SHINY), + [Button.CYCLE_FORM]: () => this.buttonCycleOption(Button.CYCLE_FORM), + [Button.CYCLE_GENDER]: () => this.buttonCycleOption(Button.CYCLE_GENDER), + [Button.CYCLE_ABILITY]: () => this.buttonCycleOption(Button.CYCLE_ABILITY), + [Button.CYCLE_NATURE]: () => this.buttonCycleOption(Button.CYCLE_NATURE), + [Button.CYCLE_TERA]: () => this.buttonCycleOption(Button.CYCLE_TERA), + [Button.SPEED_UP]: () => this.buttonSpeedChange(), + [Button.SLOW_DOWN]: () => this.buttonSpeedChange(false), }; return actions; } getActionsKeyUp(): ActionKeys { const actions: ActionKeys = { - [Button.UP]: () => undefined, - [Button.DOWN]: () => undefined, - [Button.LEFT]: () => undefined, - [Button.RIGHT]: () => undefined, - [Button.SUBMIT]: () => undefined, - [Button.ACTION]: () => undefined, - [Button.CANCEL]: () => undefined, - [Button.MENU]: () => undefined, - [Button.STATS]: () => this.buttonStats(false), - [Button.CYCLE_SHINY]: () => undefined, - [Button.CYCLE_FORM]: () => undefined, - [Button.CYCLE_GENDER]: () => undefined, - [Button.CYCLE_ABILITY]: () => undefined, - [Button.CYCLE_NATURE]: () => undefined, - [Button.V]: () => this.buttonInfo(false), - [Button.SPEED_UP]: () => undefined, - [Button.SLOW_DOWN]: () => undefined, + [Button.UP]: () => undefined, + [Button.DOWN]: () => undefined, + [Button.LEFT]: () => undefined, + [Button.RIGHT]: () => undefined, + [Button.SUBMIT]: () => undefined, + [Button.ACTION]: () => undefined, + [Button.CANCEL]: () => undefined, + [Button.MENU]: () => undefined, + [Button.STATS]: () => this.buttonStats(false), + [Button.CYCLE_SHINY]: () => undefined, + [Button.CYCLE_FORM]: () => undefined, + [Button.CYCLE_GENDER]: () => undefined, + [Button.CYCLE_ABILITY]: () => undefined, + [Button.CYCLE_NATURE]: () => undefined, + [Button.CYCLE_TERA]: () => this.buttonInfo(false), + [Button.SPEED_UP]: () => undefined, + [Button.SLOW_DOWN]: () => undefined, }; return actions; } buttonDirection(direction: Button): void { - const inputSuccess = this.scene.ui.processInput(direction); + const inputSuccess = globalScene.ui.processInput(direction); const vibrationLength = 5; this.doVibration(inputSuccess, vibrationLength); } buttonAb(button: Button): void { - this.scene.ui.processInput(button); + globalScene.ui.processInput(button); } buttonTouch(): void { - this.scene.ui.processInput(Button.SUBMIT) || this.scene.ui.processInput(Button.ACTION); + globalScene.ui.processInput(Button.SUBMIT) || globalScene.ui.processInput(Button.ACTION); } - buttonStats(pressed: boolean = true): void { + buttonStats(pressed = true): void { // allow access to Button.STATS as a toggle for other elements - for (const t of this.scene.getInfoToggles(true)) { + for (const t of globalScene.getInfoToggles(true)) { t.toggleInfo(pressed); } // handle normal pokemon battle ui - for (const p of this.scene.getField().filter(p => p?.isActive(true))) { + for (const p of globalScene.getField().filter(p => p?.isActive(true))) { p.toggleStats(pressed); } } buttonGoToFilter(button: Button): void { - const whitelist = [ StarterSelectUiHandler ]; - const uiHandler = this.scene.ui?.getHandler(); + const whitelist = [StarterSelectUiHandler, PokedexUiHandler, PokedexPageUiHandler]; + const uiHandler = globalScene.ui?.getHandler(); if (whitelist.some(handler => uiHandler instanceof handler)) { - this.scene.ui.processInput(button); + globalScene.ui.processInput(button); } else { this.buttonStats(true); } } - buttonInfo(pressed: boolean = true): void { - if (this.scene.showMovesetFlyout ) { - for (const p of this.scene.getField().filter(p => p?.isActive(true))) { + buttonInfo(pressed = true): void { + if (globalScene.showMovesetFlyout) { + for (const p of globalScene.getField().filter(p => p?.isActive(true))) { p.toggleFlyout(pressed); } } - if (this.scene.showArenaFlyout) { - this.scene.ui.processInfoButton(pressed); + if (globalScene.showArenaFlyout) { + globalScene.ui.processInfoButton(pressed); } } buttonMenu(): void { - if (this.scene.disableMenu) { + if (globalScene.disableMenu) { return; } - switch (this.scene.ui?.getMode()) { + switch (globalScene.ui?.getMode()) { case Mode.MESSAGE: - const messageHandler = this.scene.ui.getHandler(); + const messageHandler = globalScene.ui.getHandler(); if (!messageHandler.pendingPrompt || messageHandler.isTextAnimationInProgress()) { return; } @@ -177,14 +185,15 @@ export class UiInputs { case Mode.COMMAND: case Mode.MODIFIER_SELECT: case Mode.MYSTERY_ENCOUNTER: - this.scene.ui.setOverlayMode(Mode.MENU); + globalScene.ui.setOverlayMode(Mode.MENU); break; case Mode.STARTER_SELECT: + case Mode.POKEDEX_PAGE: this.buttonTouch(); break; case Mode.MENU: - this.scene.ui.revertMode(); - this.scene.playSound("ui/select"); + globalScene.ui.revertMode(); + globalScene.playSound("ui/select"); break; default: return; @@ -192,28 +201,46 @@ export class UiInputs { } buttonCycleOption(button: Button): void { - const whitelist = [ StarterSelectUiHandler, SettingsUiHandler, RunInfoUiHandler, SettingsDisplayUiHandler, SettingsAudioUiHandler, SettingsGamepadUiHandler, SettingsKeyboardUiHandler ]; - const uiHandler = this.scene.ui?.getHandler(); + const whitelist = [ + StarterSelectUiHandler, + PokedexUiHandler, + PokedexPageUiHandler, + SettingsUiHandler, + RunInfoUiHandler, + SettingsDisplayUiHandler, + SettingsAudioUiHandler, + SettingsGamepadUiHandler, + SettingsKeyboardUiHandler, + ]; + const uiHandler = globalScene.ui?.getHandler(); if (whitelist.some(handler => uiHandler instanceof handler)) { - this.scene.ui.processInput(button); - } else if (button === Button.V) { + globalScene.ui.processInput(button); + } else if (button === Button.CYCLE_TERA) { this.buttonInfo(true); } } buttonSpeedChange(up = true): void { const settingGameSpeed = settingIndex(SettingKeys.Game_Speed); - if (up && this.scene.gameSpeed < 5) { - this.scene.gameData.saveSetting(SettingKeys.Game_Speed, Setting[settingGameSpeed].options.findIndex((item) => item.label === `${this.scene.gameSpeed}x`) + 1); - if (this.scene.ui?.getMode() === Mode.SETTINGS) { - (this.scene.ui.getHandler() as SettingsUiHandler).show([]); + if (up && globalScene.gameSpeed < 5) { + globalScene.gameData.saveSetting( + SettingKeys.Game_Speed, + Setting[settingGameSpeed].options.findIndex(item => item.label === `${globalScene.gameSpeed}x`) + 1, + ); + if (globalScene.ui?.getMode() === Mode.SETTINGS) { + (globalScene.ui.getHandler() as SettingsUiHandler).show([]); } - } else if (!up && this.scene.gameSpeed > 1) { - this.scene.gameData.saveSetting(SettingKeys.Game_Speed, Math.max(Setting[settingGameSpeed].options.findIndex((item) => item.label === `${this.scene.gameSpeed}x`) - 1, 0)); - if (this.scene.ui?.getMode() === Mode.SETTINGS) { - (this.scene.ui.getHandler() as SettingsUiHandler).show([]); + } else if (!up && globalScene.gameSpeed > 1) { + globalScene.gameData.saveSetting( + SettingKeys.Game_Speed, + Math.max( + Setting[settingGameSpeed].options.findIndex(item => item.label === `${globalScene.gameSpeed}x`) - 1, + 0, + ), + ); + if (globalScene.ui?.getMode() === Mode.SETTINGS) { + (globalScene.ui.getHandler() as SettingsUiHandler).show([]); } } } - } diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index a924d545852..5481791de64 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -1,101 +1,114 @@ -import { getPokemonNameWithAffix } from "#app/messages"; -import BattleScene from "../battle-scene"; -import Pokemon from "../field/pokemon"; +import { globalScene } from "#app/global-scene"; import { TextStyle, addTextObject } from "./text"; import i18next from "i18next"; -const hiddenX = -118; -const shownX = 0; +const barWidth = 118; +const screenLeft = 0; const baseY = -116; export default class AbilityBar extends Phaser.GameObjects.Container { - private bg: Phaser.GameObjects.Image; + private abilityBars: Phaser.GameObjects.Image[]; private abilityBarText: Phaser.GameObjects.Text; + private player: boolean; + private screenRight: number; // hold screenRight in case size changes between show and hide + private shown: boolean; - private tween: Phaser.Tweens.Tween | null; - private autoHideTimer: NodeJS.Timeout | null; - - public shown: boolean; - - constructor(scene: BattleScene) { - super(scene, hiddenX, baseY); + constructor() { + super(globalScene, barWidth, baseY); + this.abilityBars = []; + this.player = true; + this.shown = false; } setup(): void { - this.bg = this.scene.add.image(0, 0, "ability_bar_left"); - this.bg.setOrigin(0, 0); + for (const key of ["ability_bar_right", "ability_bar_left"]) { + const bar = globalScene.add.image(0, 0, key); + bar.setOrigin(0, 0); + bar.setVisible(false); + this.add(bar); + this.abilityBars.push(bar); + } - this.add(this.bg); - - this.abilityBarText = addTextObject(this.scene, 15, 3, "", TextStyle.MESSAGE, { fontSize: "72px" }); + this.abilityBarText = addTextObject(15, 3, "", TextStyle.MESSAGE, { + fontSize: "72px", + }); this.abilityBarText.setOrigin(0, 0); this.abilityBarText.setWordWrapWidth(600, true); this.add(this.abilityBarText); + this.bringToTop(this.abilityBarText); this.setVisible(false); - this.shown = false; + this.setX(-barWidth); // start hidden (right edge of bar at x=0) } - showAbility(pokemon: Pokemon, passive: boolean = false): void { - this.abilityBarText.setText(`${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: getPokemonNameWithAffix(pokemon), passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: !passive ? pokemon.getAbility().name : pokemon.getPassiveAbility().name })}`); - - if (this.shown) { - return; - } - - (this.scene as BattleScene).fieldUI.bringToTop(this); - - - this.y = baseY + ((this.scene as BattleScene).currentBattle.double ? 14 : 0); - this.tween = this.scene.tweens.add({ - targets: this, - x: shownX, - duration: 500, - ease: "Sine.easeOut", - onComplete: () => { - this.tween = null; - this.resetAutoHideTimer(); - } - }); + public override setVisible(value: boolean): this { + this.abilityBars[+this.player].setVisible(value); + this.shown = value; + return this; + } + public async startTween(config: any, text?: string): Promise { this.setVisible(true); - this.shown = true; + if (text) { + this.abilityBarText.setText(text); + } + return new Promise(resolve => { + globalScene.tweens.add({ + ...config, + onComplete: () => { + if (config.onComplete) { + config.onComplete(); + } + resolve(); + }, + }); + }); } - hide(): void { - if (!this.shown) { - return; + public async showAbility(pokemonName: string, abilityName: string, passive = false, player = true): Promise { + const text = `${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: pokemonName, passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: abilityName })}`; + this.screenRight = globalScene.scaledCanvas.width; + if (player !== this.player) { + // Move the bar if it has changed from the player to enemy side (or vice versa) + this.setX(player ? -barWidth : this.screenRight); + this.player = player; + } + globalScene.fieldUI.bringToTop(this); + + let y = baseY; + if (this.player) { + y += globalScene.currentBattle.double ? 14 : 0; + } else { + y -= globalScene.currentBattle.double ? 28 : 14; } - if (this.autoHideTimer) { - clearInterval(this.autoHideTimer); - } + this.setY(y); - if (this.tween) { - this.tween.stop(); - } + return this.startTween( + { + targets: this, + x: this.player ? screenLeft : this.screenRight - barWidth, + duration: 500, + ease: "Sine.easeOut", + hold: 1000, + }, + text, + ); + } - this.tween = this.scene.tweens.add({ + public async hide(): Promise { + return this.startTween({ targets: this, - x: -91, - duration: 500, + x: this.player ? -barWidth : this.screenRight, + duration: 200, ease: "Sine.easeIn", onComplete: () => { - this.tween = null; this.setVisible(false); - } + }, }); - - this.shown = false; } - resetAutoHideTimer(): void { - if (this.autoHideTimer) { - clearInterval(this.autoHideTimer); - } - this.autoHideTimer = setTimeout(() => { - this.hide(); - this.autoHideTimer = null; - }, 2500); + public isVisible(): boolean { + return this.shown; } } diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 01fc5b00014..f605f73e171 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -1,18 +1,19 @@ -import BattleScene from "../battle-scene"; -import { TextStyle, addTextObject, getTextStyleOptions } from "./text"; +import { globalScene } from "#app/global-scene"; +import { TextStyle, addBBCodeTextObject, getTextColor, getTextStyleOptions } from "./text"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; import * as Utils from "../utils"; import { argbFromRgba } from "@material/material-color-utilities"; import { Button } from "#enums/buttons"; +import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; export interface OptionSelectConfig { xOffset?: number; yOffset?: number; options: OptionSelectItem[]; - maxOptions?: integer; - delay?: integer; + maxOptions?: number; + delay?: number; noCancel?: boolean; supportHover?: boolean; } @@ -21,8 +22,10 @@ export interface OptionSelectItem { label: string; handler: () => boolean; onHover?: () => void; + skip?: boolean; keepOpen?: boolean; overrideSound?: boolean; + style?: TextStyle; item?: string; itemArgs?: any[]; } @@ -32,46 +35,56 @@ const scrollDownLabel = "↓"; export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected optionSelectContainer: Phaser.GameObjects.Container; + protected optionSelectTextContainer: Phaser.GameObjects.Container; protected optionSelectBg: Phaser.GameObjects.NineSlice; - protected optionSelectText: Phaser.GameObjects.Text; + protected optionSelectText: BBCodeText; protected optionSelectIcons: Phaser.GameObjects.Sprite[]; protected config: OptionSelectConfig | null; protected blockInput: boolean; - protected scrollCursor: integer = 0; + protected scrollCursor = 0; + protected fullCursor = 0; - protected scale: number = 0.1666666667; + protected scale = 0.1666666667; private cursorObj: Phaser.GameObjects.Image | null; - constructor(scene: BattleScene, mode: Mode | null) { - super(scene, mode); + protected unskippedIndices: number[] = []; + + protected defaultTextStyle: TextStyle = TextStyle.WINDOW; + protected textContent: string; + + constructor(mode: Mode | null) { + super(mode); } - abstract getWindowWidth(): integer; + abstract getWindowWidth(): number; - getWindowHeight(): integer { + getWindowHeight(): number { return (Math.min((this.config?.options || []).length, this.config?.maxOptions || 99) + 1) * 96 * this.scale; } setup() { const ui = this.getUi(); - this.optionSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -48); + this.optionSelectContainer = globalScene.add.container(globalScene.game.canvas.width / 6 - 1, -48); this.optionSelectContainer.setName(`option-select-${this.mode ? Mode[this.mode] : "UNKNOWN"}`); this.optionSelectContainer.setVisible(false); ui.add(this.optionSelectContainer); - this.optionSelectBg = addWindow(this.scene, 0, 0, this.getWindowWidth(), this.getWindowHeight()); + this.optionSelectBg = addWindow(0, 0, this.getWindowWidth(), this.getWindowHeight()); this.optionSelectBg.setName("option-select-bg"); this.optionSelectBg.setOrigin(1, 1); this.optionSelectContainer.add(this.optionSelectBg); + this.optionSelectTextContainer = globalScene.add.container(0, 0); + this.optionSelectContainer.add(this.optionSelectTextContainer); + this.optionSelectIcons = []; - this.scale = getTextStyleOptions(TextStyle.WINDOW, (this.scene as BattleScene).uiTheme).scale; + this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; this.setCursor(0); } @@ -79,61 +92,88 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected setupOptions() { const configOptions = this.config?.options ?? []; - let options: OptionSelectItem[]; + const options: OptionSelectItem[] = configOptions; - // for performance reasons, this limits how many options we can see at once. Without this, it would try to make text options for every single options - // which makes the performance take a hit. If there's not enough options to do this (set to 10 at the moment) and the ui mode !== Mode.AUTO_COMPLETE, - // this is ignored and the original code is untouched, with the options array being all the options from the config - if (configOptions.length >= 10 && this.scene.ui.getMode() === Mode.AUTO_COMPLETE) { - const optionsScrollTotal = configOptions.length; - const optionStartIndex = this.scrollCursor; - const optionEndIndex = Math.min(optionsScrollTotal, optionStartIndex + (!optionStartIndex || this.scrollCursor + (this.config?.maxOptions! - 1) >= optionsScrollTotal ? this.config?.maxOptions! - 1 : this.config?.maxOptions! - 2)); - options = configOptions.slice(optionStartIndex, optionEndIndex + 2); - } else { - options = configOptions; - } + this.unskippedIndices = this.getUnskippedIndices(configOptions); if (this.optionSelectText) { - this.optionSelectText.destroy(); + if (this.optionSelectText instanceof BBCodeText) { + try { + this.optionSelectText.destroy(); + } catch (error) { + console.error("Error while destroying optionSelectText:", error); + } + } else { + console.warn("optionSelectText is not an instance of BBCodeText."); + } } + if (this.optionSelectIcons?.length) { this.optionSelectIcons.map(i => i.destroy()); this.optionSelectIcons.splice(0, this.optionSelectIcons.length); } - this.optionSelectText = addTextObject(this.scene, 0, 0, options.map(o => o.item ? ` ${o.label}` : o.label).join("\n"), TextStyle.WINDOW, { maxLines: options.length }); - this.optionSelectText.setLineSpacing(this.scale * 72); + const optionsWithScroll = + this.config?.options && this.config?.options.length > this.config?.maxOptions! + ? this.getOptionsWithScroll() + : options; + + // Setting the initial text to establish the width of the select object. We consider all options, even ones that are not displayed, + // Except in the case of autocomplete, where we don't want to set up a text element with potentially hundreds of lines. + const optionsForWidth = globalScene.ui.getMode() === Mode.AUTO_COMPLETE ? optionsWithScroll : options; + this.optionSelectText = addBBCodeTextObject( + 0, + 0, + optionsForWidth + .map(o => + o.item + ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` + : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]`, + ) + .join("\n"), + TextStyle.WINDOW, + { maxLines: options.length, lineSpacing: 12 }, + ); + this.optionSelectText.setOrigin(0, 0); this.optionSelectText.setName("text-option-select"); - this.optionSelectText.setLineSpacing(12); - this.optionSelectContainer.add(this.optionSelectText); - this.optionSelectContainer.setPosition((this.scene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); - + this.optionSelectTextContainer.add(this.optionSelectText); + this.optionSelectContainer.setPosition( + globalScene.game.canvas.width / 6 - 1 - (this.config?.xOffset || 0), + -48 + (this.config?.yOffset || 0), + ); this.optionSelectBg.width = Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()); - - if (this.config?.options && this.config?.options.length > (this.config?.maxOptions!)) { // TODO: is this bang correct? - this.optionSelectText.setText(this.getOptionsWithScroll().map(o => o.label).join("\n")); - } - this.optionSelectBg.height = this.getWindowHeight(); + this.optionSelectTextContainer.setPosition( + this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, + this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale, + ); - this.optionSelectText.setPositionRelative(this.optionSelectBg, 12 + 24 * this.scale, 2 + 42 * this.scale); + // Now that the container and background widths are established, we can set up the proper text restricted to visible options + this.textContent = optionsWithScroll + .map(o => + o.item + ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` + : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]`, + ) + .join("\n"); + this.optionSelectText.setText(this.textContent); - options.forEach((option: OptionSelectItem, i: integer) => { + options.forEach((option: OptionSelectItem, i: number) => { if (option.item) { - const itemIcon = this.scene.add.sprite(0, 0, "items", option.item); + const itemIcon = globalScene.add.sprite(0, 0, "items", option.item); itemIcon.setScale(3 * this.scale); this.optionSelectIcons.push(itemIcon); - this.optionSelectContainer.add(itemIcon); + this.optionSelectTextContainer.add(itemIcon); itemIcon.setPositionRelative(this.optionSelectText, 36 * this.scale, 7 + i * (114 * this.scale - 3)); if (option.item === "candy") { - const itemOverlayIcon = this.scene.add.sprite(0, 0, "items", "candy_overlay"); + const itemOverlayIcon = globalScene.add.sprite(0, 0, "items", "candy_overlay"); itemOverlayIcon.setScale(3 * this.scale); this.optionSelectIcons.push(itemOverlayIcon); - this.optionSelectContainer.add(itemOverlayIcon); + this.optionSelectTextContainer.add(itemOverlayIcon); itemOverlayIcon.setPositionRelative(this.optionSelectText, 36 * this.scale, 7 + i * (114 * this.scale - 3)); @@ -156,17 +196,23 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.config = args[0] as OptionSelectConfig; this.setupOptions(); - this.scene.ui.bringToTop(this.optionSelectContainer); + globalScene.ui.bringToTop(this.optionSelectContainer); this.optionSelectContainer.setVisible(true); this.scrollCursor = 0; + this.fullCursor = 0; this.setCursor(0); if (this.config.delay) { this.blockInput = true; - this.optionSelectText.setAlpha(0.5); + this.optionSelectTextContainer.setAlpha(0.5); this.cursorObj?.setAlpha(0.8); - this.scene.time.delayedCall(Utils.fixedInt(this.config.delay), () => this.unblockInput()); + globalScene.time.delayedCall(Utils.fixedInt(this.config.delay), () => this.unblockInput()); + } + + if (this.config?.supportHover) { + // handle hover code if the element supports hover-handlers and the option has the optional hover-handler set. + this.config?.options[this.unskippedIndices[this.fullCursor]]?.onHover?.(); } return true; @@ -177,8 +223,6 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { let success = false; - const options = this.getOptionsWithScroll(); - let playSound = true; if (button === Button.ACTION || button === Button.CANCEL) { @@ -190,15 +234,14 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { success = true; if (button === Button.CANCEL) { if (this.config?.maxOptions && this.config.options.length > this.config.maxOptions) { - this.scrollCursor = (this.config.options.length - this.config.maxOptions) + 1; - this.cursor = options.length - 1; + this.setCursor(this.unskippedIndices.length - 1); } else if (!this.config?.noCancel) { - this.setCursor(options.length - 1); + this.setCursor(this.unskippedIndices.length - 1); } else { return false; } } - const option = this.config?.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]; + const option = this.config?.options[this.unskippedIndices[this.fullCursor]]; if (option?.handler()) { if (!option.keepOpen) { this.clear(); @@ -211,7 +254,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { // this is here to differentiate between a Button.SUBMIT vs Button.ACTION within the autocomplete handler // this is here because Button.ACTION is picked up as z on the keyboard, meaning if you're typing and hit z, it'll select the option you've chosen success = true; - const option = this.config?.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]; + const option = this.config?.options[this.unskippedIndices[this.fullCursor]]; if (option?.handler()) { if (!option.keepOpen) { this.clear(); @@ -223,15 +266,15 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } else { switch (button) { case Button.UP: - if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } else if (this.cursor === 0) { - success = this.setCursor(options.length - 1); + if (this.fullCursor === 0) { + success = this.setCursor(this.unskippedIndices.length - 1); + } else if (this.fullCursor) { + success = this.setCursor(this.fullCursor - 1); } break; case Button.DOWN: - if (this.cursor < options.length - 1) { - success = this.setCursor(this.cursor + 1); + if (this.fullCursor < this.unskippedIndices.length - 1) { + success = this.setCursor(this.fullCursor + 1); } else { success = this.setCursor(0); } @@ -239,7 +282,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } if (this.config?.supportHover) { // handle hover code if the element supports hover-handlers and the option has the optional hover-handler set. - this.config?.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]?.onHover?.(); + this.config?.options[this.unskippedIndices[this.fullCursor]]?.onHover?.(); } } @@ -256,7 +299,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } this.blockInput = false; - this.optionSelectText.setAlpha(1); + this.optionSelectTextContainer.setAlpha(1); this.cursorObj?.setAlpha(1); } @@ -273,7 +316,13 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { const optionsScrollTotal = options.length; const optionStartIndex = this.scrollCursor; - const optionEndIndex = Math.min(optionsScrollTotal, optionStartIndex + (!optionStartIndex || this.scrollCursor + (this.config.maxOptions - 1) >= optionsScrollTotal ? this.config.maxOptions - 1 : this.config.maxOptions - 2)); + const optionEndIndex = Math.min( + optionsScrollTotal, + optionStartIndex + + (!optionStartIndex || this.scrollCursor + (this.config.maxOptions - 1) >= optionsScrollTotal + ? this.config.maxOptions - 1 + : this.config.maxOptions - 2), + ); if (this.config?.maxOptions && options.length > this.config.maxOptions) { options.splice(optionEndIndex, optionsScrollTotal); @@ -281,13 +330,15 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { if (optionStartIndex) { options.unshift({ label: scrollUpLabel, - handler: () => true + handler: () => true, + style: this.defaultTextStyle, }); } if (optionEndIndex < optionsScrollTotal) { options.push({ label: scrollDownLabel, - handler: () => true + handler: () => true, + style: this.defaultTextStyle, }); } } @@ -295,49 +346,74 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { return options; } - setCursor(cursor: integer): boolean { - const changed = this.cursor !== cursor; + getUnskippedIndices(options: OptionSelectItem[]) { + const unskippedIndices = options + .map((option, index) => (option.skip ? null : index)) // Map to index or null if skipped + .filter(index => index !== null) as number[]; + return unskippedIndices; + } + + setCursor(fullCursor: number): boolean { + const changed = this.fullCursor !== fullCursor; - let isScroll = false; - const options = this.getOptionsWithScroll(); if (changed && this.config?.maxOptions && this.config.options.length > this.config.maxOptions) { - if (Math.abs(cursor - this.cursor) === options.length - 1) { - // Wrap around the list - const optionsScrollTotal = this.config.options.length; - this.scrollCursor = cursor ? optionsScrollTotal - (this.config.maxOptions - 1) : 0; - this.setupOptions(); + // If the fullCursor is the last possible value, we go to the bottom + if (fullCursor === this.unskippedIndices.length - 1) { + this.fullCursor = fullCursor; + this.cursor = this.config.maxOptions - (this.config.options.length - this.unskippedIndices[fullCursor]); + this.scrollCursor = this.config.options.length - this.config.maxOptions + 1; + // If the fullCursor is the first possible value, we go to the top + } else if (fullCursor === 0) { + this.fullCursor = fullCursor; + this.cursor = this.unskippedIndices[fullCursor]; + this.scrollCursor = 0; } else { - // Move the cursor up or down by 1 - const isDown = cursor && cursor > this.cursor; + const isDown = fullCursor && fullCursor > this.fullCursor; + if (isDown) { - if (options[cursor].label === scrollDownLabel) { - isScroll = true; - this.scrollCursor++; + // If there are skipped options under the next selection, we show them + const jumpFromCurrent = this.unskippedIndices[fullCursor] - this.unskippedIndices[this.fullCursor]; + const skipsFromNext = this.unskippedIndices[fullCursor + 1] - this.unskippedIndices[fullCursor] - 1; + + if (this.cursor + jumpFromCurrent + skipsFromNext >= this.config.maxOptions - 1) { + this.fullCursor = fullCursor; + this.cursor = this.config.maxOptions - 2 - skipsFromNext; + this.scrollCursor = this.unskippedIndices[this.fullCursor] - this.cursor + 1; + } else { + this.fullCursor = fullCursor; + this.cursor = this.unskippedIndices[fullCursor] - this.scrollCursor + (this.scrollCursor ? 1 : 0); } } else { - if (!cursor && this.scrollCursor) { - isScroll = true; - this.scrollCursor--; + const jumpFromPrevious = this.unskippedIndices[fullCursor] - this.unskippedIndices[fullCursor - 1]; + + if (this.cursor - jumpFromPrevious < 1) { + this.fullCursor = fullCursor; + this.cursor = 1; + this.scrollCursor = this.unskippedIndices[this.fullCursor] - this.cursor + 1; + } else { + this.fullCursor = fullCursor; + this.cursor = this.unskippedIndices[fullCursor] - this.scrollCursor + (this.scrollCursor ? 1 : 0); } } - if (isScroll && this.scrollCursor === 1) { - this.scrollCursor += isDown ? 1 : -1; - } } - } - if (isScroll) { - this.setupOptions(); } else { - this.cursor = cursor; + this.fullCursor = fullCursor; + this.cursor = this.unskippedIndices[fullCursor]; } + this.setupOptions(); + if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, "cursor"); + this.cursorObj = globalScene.add.image(0, 0, "cursor"); this.optionSelectContainer.add(this.cursorObj); } this.cursorObj.setScale(this.scale * 6); - this.cursorObj.setPositionRelative(this.optionSelectBg, 12, 102 * this.scale + this.cursor * (114 * this.scale - 3)); + this.cursorObj.setPositionRelative( + this.optionSelectBg, + 12, + 102 * this.scale + this.cursor * (114 * this.scale - 3), + ); return changed; } @@ -346,6 +422,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { super.clear(); this.config = null; this.optionSelectContainer.setVisible(false); + this.fullCursor = 0; this.scrollCursor = 0; this.eraseCursor(); } diff --git a/src/ui/achv-bar.ts b/src/ui/achv-bar.ts index 6e7b3185024..1e068157afa 100644 --- a/src/ui/achv-bar.ts +++ b/src/ui/achv-bar.ts @@ -1,8 +1,8 @@ -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import { Achv, getAchievementDescription } from "../system/achv"; import { Voucher } from "../system/voucher"; import { TextStyle, addTextObject } from "./text"; -import { PlayerGender } from "#enums/player-gender"; +import type { PlayerGender } from "#enums/player-gender"; export default class AchvBar extends Phaser.GameObjects.Container { private defaultWidth: number; @@ -19,33 +19,50 @@ export default class AchvBar extends Phaser.GameObjects.Container { public shown: boolean; - constructor(scene: BattleScene) { - super(scene, scene.game.canvas.width / 6, 0); - this.playerGender = scene.gameData.gender; + constructor() { + super(globalScene, globalScene.game.canvas.width / 6, 0); + this.playerGender = globalScene.gameData.gender; } setup(): void { this.defaultWidth = 200; this.defaultHeight = 40; - this.bg = this.scene.add.nineslice(0, 0, "achv_bar", undefined, this.defaultWidth, this.defaultHeight, 41, 6, 16, 4); + this.bg = globalScene.add.nineslice( + 0, + 0, + "achv_bar", + undefined, + this.defaultWidth, + this.defaultHeight, + 41, + 6, + 16, + 4, + ); this.bg.setOrigin(0, 0); this.add(this.bg); - this.icon = this.scene.add.sprite(4, 4, "items"); + this.icon = globalScene.add.sprite(4, 4, "items"); this.icon.setOrigin(0, 0); this.add(this.icon); - this.titleText = addTextObject(this.scene, 40, 3, "", TextStyle.MESSAGE, { fontSize: "72px" }); + this.titleText = addTextObject(40, 3, "", TextStyle.MESSAGE, { + fontSize: "72px", + }); this.titleText.setOrigin(0, 0); this.add(this.titleText); - this.scoreText = addTextObject(this.scene, 150, 3, "", TextStyle.MESSAGE, { fontSize: "72px" }); + this.scoreText = addTextObject(150, 3, "", TextStyle.MESSAGE, { + fontSize: "72px", + }); this.scoreText.setOrigin(1, 0); this.add(this.scoreText); - this.descriptionText = addTextObject(this.scene, 43, 16, "", TextStyle.WINDOW_ALT, { fontSize: "72px" }); + this.descriptionText = addTextObject(43, 16, "", TextStyle.WINDOW_ALT, { + fontSize: "72px", + }); this.descriptionText.setOrigin(0, 0); this.add(this.descriptionText); @@ -80,39 +97,45 @@ export default class AchvBar extends Phaser.GameObjects.Container { } // Take the width of the default interface or the title if longest - this.bg.width = Math.max(this.defaultWidth, this.icon.displayWidth + this.titleText.displayWidth + this.scoreText.displayWidth + 16); + this.bg.width = Math.max( + this.defaultWidth, + this.icon.displayWidth + this.titleText.displayWidth + this.scoreText.displayWidth + 16, + ); this.scoreText.x = this.bg.width - 2; this.descriptionText.width = this.bg.width - this.icon.displayWidth - 16; this.descriptionText.setWordWrapWidth(this.descriptionText.width * 6); // Take the height of the default interface or the description if longest - this.bg.height = Math.max(this.defaultHeight, this.titleText.displayHeight + this.descriptionText.displayHeight + 8); - this.icon.y = (this.bg.height / 2) - (this.icon.height / 2); + this.bg.height = Math.max( + this.defaultHeight, + this.titleText.displayHeight + this.descriptionText.displayHeight + 8, + ); + this.icon.y = this.bg.height / 2 - this.icon.height / 2; - (this.scene as BattleScene).playSound("se/achv"); + globalScene.playSound("se/achv"); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, - x: (this.scene.game.canvas.width / 6) - (this.bg.width / 2), + x: globalScene.game.canvas.width / 6 - this.bg.width / 2, duration: 500, - ease: "Sine.easeOut" + ease: "Sine.easeOut", }); - this.scene.time.delayedCall(10000, () => this.hide(this.playerGender)); + globalScene.time.delayedCall(10000, () => this.hide(this.playerGender)); this.setVisible(true); this.shown = true; } - protected hide(playerGender: PlayerGender): void { + protected hide(_playerGender: PlayerGender): void { if (!this.shown) { return; } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, - x: (this.scene.game.canvas.width / 6), + x: globalScene.game.canvas.width / 6, duration: 500, ease: "Sine.easeIn", onComplete: () => { @@ -122,7 +145,7 @@ export default class AchvBar extends Phaser.GameObjects.Container { const shifted = this.queue.shift(); shifted && this.showAchv(shifted); } - } + }, }); } } diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts index a1ced6145eb..8b5a4dbd395 100644 --- a/src/ui/achvs-ui-handler.ts +++ b/src/ui/achvs-ui-handler.ts @@ -1,28 +1,30 @@ -import BattleScene from "#app/battle-scene"; import { Button } from "#enums/buttons"; import i18next from "i18next"; -import { Achv, achvs, getAchievementDescription } from "#app/system/achv"; -import { Voucher, getVoucherTypeIcon, getVoucherTypeName, vouchers } from "#app/system/voucher"; +import type { Achv } from "#app/system/achv"; +import { achvs, getAchievementDescription } from "#app/system/achv"; +import type { Voucher } from "#app/system/voucher"; +import { getVoucherTypeIcon, getVoucherTypeName, vouchers } from "#app/system/voucher"; import MessageUiHandler from "#app/ui/message-ui-handler"; import { addTextObject, TextStyle } from "#app/ui/text"; -import { Mode } from "#app/ui/ui"; +import type { Mode } from "#app/ui/ui"; import { addWindow } from "#app/ui/ui-theme"; import { ScrollBar } from "#app/ui/scroll-bar"; import { PlayerGender } from "#enums/player-gender"; +import { globalScene } from "#app/global-scene"; enum Page { ACHIEVEMENTS, - VOUCHERS + VOUCHERS, } interface LanguageSetting { - TextSize: string, + TextSize: string; } const languageSettings: { [key: string]: LanguageSetting } = { - "de":{ - TextSize: "80px" - } + de: { + TextSize: "80px", + }, }; export default class AchvsUiHandler extends MessageUiHandler { @@ -57,8 +59,8 @@ export default class AchvsUiHandler extends MessageUiHandler { private cursorObj: Phaser.GameObjects.NineSlice | null; private currentPage: Page; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); this.achvsTotal = Object.keys(achvs).length; this.vouchersTotal = Object.keys(vouchers).length; @@ -68,37 +70,55 @@ export default class AchvsUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); - this.mainContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.mainContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); - this.mainContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.mainContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - this.headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); + this.headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6 - 2, 24); this.headerBg.setOrigin(0, 0); - this.headerText = addTextObject(this.scene, 0, 0, "", TextStyle.SETTINGS_LABEL); + this.headerText = addTextObject(0, 0, "", TextStyle.SETTINGS_LABEL); this.headerText.setOrigin(0, 0); this.headerText.setPositionRelative(this.headerBg, 8, 4); - this.headerActionButton = new Phaser.GameObjects.Sprite(this.scene, 0, 0, "keyboard", "ACTION.png"); + this.headerActionButton = new Phaser.GameObjects.Sprite(globalScene, 0, 0, "keyboard", "ACTION.png"); this.headerActionButton.setOrigin(0, 0); this.headerActionButton.setPositionRelative(this.headerBg, 236, 6); - this.headerActionText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, { fontSize:"60px" }); + this.headerActionText = addTextObject(0, 0, "", TextStyle.WINDOW, { + fontSize: "60px", + }); this.headerActionText.setOrigin(0, 0); this.headerActionText.setPositionRelative(this.headerBg, 264, 8); // We need to get the player gender from the game data to add the correct prefix to the achievement name - const genderIndex = this.scene.gameData.gender ?? PlayerGender.MALE; + const genderIndex = globalScene.gameData.gender ?? PlayerGender.MALE; const genderStr = PlayerGender[genderIndex].toLowerCase(); - this.achvsName = i18next.t("achv:Achievements.name", { context: genderStr }); + this.achvsName = i18next.t("achv:Achievements.name", { + context: genderStr, + }); this.vouchersName = i18next.t("voucher:vouchers"); - this.iconsBg = addWindow(this.scene, 0, this.headerBg.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - this.headerBg.height - 68); + this.iconsBg = addWindow( + 0, + this.headerBg.height, + globalScene.game.canvas.width / 6 - 2, + globalScene.game.canvas.height / 6 - this.headerBg.height - 68, + ); this.iconsBg.setOrigin(0, 0); const yOffset = 6; - this.scrollBar = new ScrollBar(this.scene, this.iconsBg.width - 9, this.iconsBg.y + yOffset, 4, this.iconsBg.height - yOffset * 2, this.ROWS); + this.scrollBar = new ScrollBar( + this.iconsBg.width - 9, + this.iconsBg.y + yOffset, + 4, + this.iconsBg.height - yOffset * 2, + this.ROWS, + ); - this.iconsContainer = this.scene.add.container(5, this.headerBg.height + 8); + this.iconsContainer = globalScene.add.container(5, this.headerBg.height + 8); this.icons = []; @@ -106,7 +126,7 @@ export default class AchvsUiHandler extends MessageUiHandler { const x = (a % this.COLS) * 18; const y = Math.floor(a / this.COLS) * 18; - const icon = this.scene.add.sprite(x, y, "items", "unknown"); + const icon = globalScene.add.sprite(x, y, "items", "unknown"); icon.setOrigin(0, 0); icon.setScale(0.5); @@ -114,11 +134,11 @@ export default class AchvsUiHandler extends MessageUiHandler { this.iconsContainer.add(icon); } - const titleBg = addWindow(this.scene, 0, this.headerBg.height + this.iconsBg.height, 174, 24); + const titleBg = addWindow(0, this.headerBg.height + this.iconsBg.height, 174, 24); titleBg.setOrigin(0, 0); this.titleBg = titleBg; - this.titleText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); + this.titleText = addTextObject(0, 0, "", TextStyle.WINDOW); const textSize = languageSettings[i18next.language]?.TextSize ?? this.titleText.style.fontSize; this.titleText.setFontSize(textSize); const titleBgCenterX = titleBg.x + titleBg.width / 2; @@ -126,26 +146,28 @@ export default class AchvsUiHandler extends MessageUiHandler { this.titleText.setOrigin(0.5, 0.5); this.titleText.setPosition(titleBgCenterX, titleBgCenterY); - this.scoreContainer = this.scene.add.container(titleBg.x + titleBg.width, titleBg.y); - const scoreBg = addWindow(this.scene, 0, 0, 46, 24); + this.scoreContainer = globalScene.add.container(titleBg.x + titleBg.width, titleBg.y); + const scoreBg = addWindow(0, 0, 46, 24); scoreBg.setOrigin(0, 0); this.scoreContainer.add(scoreBg); - this.scoreText = addTextObject(this.scene, scoreBg.width / 2, scoreBg.height / 2, "", TextStyle.WINDOW); + this.scoreText = addTextObject(scoreBg.width / 2, scoreBg.height / 2, "", TextStyle.WINDOW); this.scoreText.setOrigin(0.5, 0.5); this.scoreContainer.add(this.scoreText); - const unlockBg = addWindow(this.scene, this.scoreContainer.x + scoreBg.width, titleBg.y, 98, 24); + const unlockBg = addWindow(this.scoreContainer.x + scoreBg.width, titleBg.y, 98, 24); unlockBg.setOrigin(0, 0); - this.unlockText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); + this.unlockText = addTextObject(0, 0, "", TextStyle.WINDOW); this.unlockText.setOrigin(0.5, 0.5); this.unlockText.setPositionRelative(unlockBg, unlockBg.width / 2, unlockBg.height / 2); - const descriptionBg = addWindow(this.scene, 0, titleBg.y + titleBg.height, (this.scene.game.canvas.width / 6) - 2, 42); + const descriptionBg = addWindow(0, titleBg.y + titleBg.height, globalScene.game.canvas.width / 6 - 2, 42); descriptionBg.setOrigin(0, 0); - const descriptionText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, { maxLines: 2 }); + const descriptionText = addTextObject(0, 0, "", TextStyle.WINDOW, { + maxLines: 2, + }); descriptionText.setWordWrapWidth(1870); descriptionText.setOrigin(0, 0); descriptionText.setPositionRelative(descriptionBg, 8, 4); @@ -195,27 +217,33 @@ export default class AchvsUiHandler extends MessageUiHandler { protected showAchv(achv: Achv) { // We need to get the player gender from the game data to add the correct prefix to the achievement name - const genderIndex = this.scene.gameData.gender ?? PlayerGender.MALE; + const genderIndex = globalScene.gameData.gender ?? PlayerGender.MALE; const genderStr = PlayerGender[genderIndex].toLowerCase(); - achv.name = i18next.t(`achv:${achv.localizationKey}.name`, { context: genderStr }); + achv.name = i18next.t(`achv:${achv.localizationKey}.name`, { + context: genderStr, + }); achv.description = getAchievementDescription(achv.localizationKey); - const achvUnlocks = this.scene.gameData.achvUnlocks; + const achvUnlocks = globalScene.gameData.achvUnlocks; const unlocked = achvUnlocks.hasOwnProperty(achv.id); const hidden = !unlocked && achv.secret && (!achv.parentId || !achvUnlocks.hasOwnProperty(achv.parentId)); this.titleText.setText(unlocked ? achv.name : "???"); this.showText(!hidden ? achv.description : ""); this.scoreText.setText(`${achv.score}pt`); - this.unlockText.setText(unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : i18next.t("achv:Locked.name")); + this.unlockText.setText( + unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : i18next.t("achv:Locked.name"), + ); } protected showVoucher(voucher: Voucher) { - const voucherUnlocks = this.scene.gameData.voucherUnlocks; + const voucherUnlocks = globalScene.gameData.voucherUnlocks; const unlocked = voucherUnlocks.hasOwnProperty(voucher.id); this.titleText.setText(getVoucherTypeName(voucher.voucherType)); this.showText(voucher.description); - this.unlockText.setText(unlocked ? new Date(voucherUnlocks[voucher.id]).toLocaleDateString() : i18next.t("voucher:locked")); + this.unlockText.setText( + unlocked ? new Date(voucherUnlocks[voucher.id]).toLocaleDateString() : i18next.t("voucher:locked"), + ); } processInput(button: Button): boolean { @@ -240,17 +268,17 @@ export default class AchvsUiHandler extends MessageUiHandler { } if (button === Button.CANCEL) { success = true; - this.scene.ui.revertMode(); + globalScene.ui.revertMode(); } else { const rowIndex = Math.floor(this.cursor / this.COLS); - const itemOffset = (this.scrollCursor * this.COLS); + const itemOffset = this.scrollCursor * this.COLS; switch (button) { case Button.UP: if (this.cursor < this.COLS) { if (this.scrollCursor) { success = this.setScrollCursor(this.scrollCursor - 1); } else { - // Wrap around to the last row + // Wrap around to the last row success = this.setScrollCursor(Math.ceil(this.currentTotal / this.COLS) - this.ROWS); let newCursorIndex = this.cursor + (this.ROWS - 1) * this.COLS; if (newCursorIndex > this.currentTotal - this.scrollCursor * this.COLS - 1) { @@ -266,10 +294,10 @@ export default class AchvsUiHandler extends MessageUiHandler { const canMoveDown = itemOffset + 1 < this.currentTotal; if (rowIndex >= this.ROWS - 1) { if (this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS && canMoveDown) { - // scroll down one row + // scroll down one row success = this.setScrollCursor(this.scrollCursor + 1); } else { - // wrap back to the first row + // wrap back to the first row success = this.setScrollCursor(0) && this.setCursor(this.cursor % this.COLS); } } else if (canMoveDown) { @@ -284,8 +312,8 @@ export default class AchvsUiHandler extends MessageUiHandler { } break; case Button.RIGHT: - if ((this.cursor + 1) % this.COLS === 0 || (this.cursor + itemOffset) === (this.currentTotal - 1)) { - success = this.setCursor(this.cursor - this.cursor % this.COLS); + if ((this.cursor + 1) % this.COLS === 0 || this.cursor + itemOffset === this.currentTotal - 1) { + success = this.setCursor(this.cursor - (this.cursor % this.COLS)); } else { success = this.setCursor(this.cursor + 1); } @@ -300,13 +328,13 @@ export default class AchvsUiHandler extends MessageUiHandler { return success; } - setCursor(cursor: integer, pageChange?: boolean): boolean { + setCursor(cursor: number, pageChange?: boolean): boolean { const ret = super.setCursor(cursor); let update = ret; if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight", undefined, 16, 16, 1, 1, 1, 1); + this.cursorObj = globalScene.add.nineslice(0, 0, "select_cursor_highlight", undefined, 16, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); this.iconsContainer.add(this.cursorObj); update = true; @@ -338,12 +366,12 @@ export default class AchvsUiHandler extends MessageUiHandler { } /** - * setScrollCursor(scrollCursor: integer) : boolean + * setScrollCursor(scrollCursor: number) : boolean * scrollCursor refers to the page's position within the entire sum of the data, unlike cursor, which refers to a user's position within displayed data - * @param takes a scrollCursor that has been updated based on user behavior + * @param scrollCursor takes a value that has been updated based on user behavior * @returns returns a boolean that indicates whether the updated scrollCursor led to an update in the data displayed. */ - setScrollCursor(scrollCursor: integer): boolean { + setScrollCursor(scrollCursor: number): boolean { if (scrollCursor === this.scrollCursor) { return false; } @@ -370,7 +398,6 @@ export default class AchvsUiHandler extends MessageUiHandler { return true; } - /** * updateAchvIcons(): void * Determines what data is to be displayed on the UI and updates it accordingly based on the current value of this.scrollCursor @@ -382,14 +409,14 @@ export default class AchvsUiHandler extends MessageUiHandler { this.headerActionText.setX(textPosition); this.headerActionButton.setX(textPosition - this.headerActionButton.displayWidth - 4); - const achvUnlocks = this.scene.gameData.achvUnlocks; + const achvUnlocks = globalScene.gameData.achvUnlocks; const itemOffset = this.scrollCursor * this.COLS; const itemLimit = this.ROWS * this.COLS; const achvRange = Object.values(achvs).slice(itemOffset, itemLimit + itemOffset); - achvRange.forEach((achv: Achv, i: integer) => { + achvRange.forEach((achv: Achv, i: number) => { const icon = this.icons[i]; const unlocked = achvUnlocks.hasOwnProperty(achv.id); const hidden = !unlocked && achv.secret && (!achv.parentId || !achvUnlocks.hasOwnProperty(achv.parentId)); @@ -422,14 +449,14 @@ export default class AchvsUiHandler extends MessageUiHandler { this.headerActionText.setX(textPosition); this.headerActionButton.setX(textPosition - this.headerActionButton.displayWidth - 4); - const voucherUnlocks = this.scene.gameData.voucherUnlocks; + const voucherUnlocks = globalScene.gameData.voucherUnlocks; const itemOffset = this.scrollCursor * this.COLS; const itemLimit = this.ROWS * this.COLS; const voucherRange = Object.values(vouchers).slice(itemOffset, itemLimit + itemOffset); - voucherRange.forEach((voucher: Voucher, i: integer) => { + voucherRange.forEach((voucher: Voucher, i: number) => { const icon = this.icons[i]; const unlocked = voucherUnlocks.hasOwnProperty(voucher.id); diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts index 6249e54d8c3..34b6e59145f 100644 --- a/src/ui/admin-ui-handler.ts +++ b/src/ui/admin-ui-handler.ts @@ -1,13 +1,17 @@ -import BattleScene from "#app/battle-scene"; -import { ModalConfig } from "./modal-ui-handler"; -import { Mode } from "./ui"; -import * as Utils from "../utils"; -import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; import { Button } from "#app/enums/buttons"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import { formatText } from "#app/utils"; +import type { InputFieldConfig } from "./form-modal-ui-handler"; +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import type { ModalConfig } from "./modal-ui-handler"; import { TextStyle } from "./text"; +import { Mode } from "./ui"; +import { globalScene } from "#app/global-scene"; + +type AdminUiHandlerService = "discord" | "google"; +type AdminUiHandlerServiceMode = "Link" | "Unlink"; export default class AdminUiHandler extends FormModalUiHandler { - private adminMode: AdminMode; private adminResult: AdminSearchInfo; private config: ModalConfig; @@ -17,20 +21,17 @@ export default class AdminUiHandler extends FormModalUiHandler { private readonly httpUserNotFoundErrorCode: number = 404; private readonly ERR_REQUIRED_FIELD = (field: string) => { if (field === "username") { - return `${Utils.formatText(field)} is required`; - } else { - return `${Utils.formatText(field)} Id is required`; + return `${formatText(field)} is required`; } + return `${formatText(field)} Id is required`; }; // returns a string saying whether a username has been successfully linked/unlinked to discord/google private readonly SUCCESS_SERVICE_MODE = (service: string, mode: string) => { return `Username and ${service} successfully ${mode.toLowerCase()}ed`; }; - private readonly ERR_USERNAME_NOT_FOUND: string = "Username not found!"; - private readonly ERR_GENERIC_ERROR: string = "There was an error"; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); } override getModalTitle(): string { @@ -42,19 +43,19 @@ export default class AdminUiHandler extends FormModalUiHandler { } override getMargin(): [number, number, number, number] { - return [ 0, 0, 0, 0 ]; + return [0, 0, 0, 0]; } override getButtonLabels(): string[] { switch (this.adminMode) { case AdminMode.LINK: - return [ "Link Account", "Cancel" ]; + return ["Link Account", "Cancel"]; case AdminMode.SEARCH: - return [ "Find account", "Cancel" ]; + return ["Find account", "Cancel"]; case AdminMode.ADMIN: - return [ "Back to search", "Cancel" ]; + return ["Back to search", "Cancel"]; default: - return [ "Activate ADMIN", "Cancel" ]; + return ["Activate ADMIN", "Cancel"]; } } @@ -62,20 +63,32 @@ export default class AdminUiHandler extends FormModalUiHandler { const inputFieldConfigs: InputFieldConfig[] = []; switch (this.adminMode) { case AdminMode.LINK: - inputFieldConfigs.push( { label: "Username" }); - inputFieldConfigs.push( { label: "Discord ID" }); + inputFieldConfigs.push({ label: "Username" }); + inputFieldConfigs.push({ label: "Discord ID" }); break; case AdminMode.SEARCH: - inputFieldConfigs.push( { label: "Username" }); + inputFieldConfigs.push({ label: "Username" }); break; case AdminMode.ADMIN: - const adminResult = this.adminResult ?? { username: "", discordId: "", googleId: "", lastLoggedIn: "", registered: "" }; + const adminResult = this.adminResult ?? { + username: "", + discordId: "", + googleId: "", + lastLoggedIn: "", + registered: "", + }; // Discord and Google ID fields that are not empty get locked, other fields are all locked - inputFieldConfigs.push( { label: "Username", isReadOnly: true }); - inputFieldConfigs.push( { label: "Discord ID", isReadOnly: adminResult.discordId !== "" }); - inputFieldConfigs.push( { label: "Google ID", isReadOnly: adminResult.googleId !== "" }); - inputFieldConfigs.push( { label: "Last played", isReadOnly: true }); - inputFieldConfigs.push( { label: "Registered", isReadOnly: true }); + inputFieldConfigs.push({ label: "Username", isReadOnly: true }); + inputFieldConfigs.push({ + label: "Discord ID", + isReadOnly: adminResult.discordId !== "", + }); + inputFieldConfigs.push({ + label: "Google ID", + isReadOnly: adminResult.googleId !== "", + }); + inputFieldConfigs.push({ label: "Last played", isReadOnly: true }); + inputFieldConfigs.push({ label: "Registered", isReadOnly: true }); break; } return inputFieldConfigs; @@ -93,7 +106,13 @@ export default class AdminUiHandler extends FormModalUiHandler { show(args: any[]): boolean { this.config = args[0] as ModalConfig; // config this.adminMode = args[1] as AdminMode; // admin mode - this.adminResult = args[2] ?? { username: "", discordId: "", googleId: "", lastLoggedIn: "", registered: "" }; // admin result, if any + this.adminResult = args[2] ?? { + username: "", + discordId: "", + googleId: "", + lastLoggedIn: "", + registered: "", + }; // admin result, if any const isMessageError = args[3]; // is the message shown a success or error const fields = this.getInputFieldConfigs(); @@ -119,23 +138,22 @@ export default class AdminUiHandler extends FormModalUiHandler { if (super.show(args)) { this.populateFields(this.adminMode, this.adminResult); const originalSubmitAction = this.submitAction; - this.submitAction = (_) => { + this.submitAction = _ => { this.submitAction = originalSubmitAction; const adminSearchResult: AdminSearchInfo = this.convertInputsToAdmin(); // this converts the input texts into a single object for use later const validFields = this.areFieldsValid(this.adminMode); if (validFields.error) { - this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error return this.showMessage(validFields.errorMessage ?? "", adminSearchResult, true); } - this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); if (this.adminMode === AdminMode.LINK) { this.adminLinkUnlink(adminSearchResult, "discord", "Link") // calls server to link discord .then(response => { if (response.error) { return this.showMessage(response.errorType, adminSearchResult, true); // error or some kind - } else { - return this.showMessage(this.SUCCESS_SERVICE_MODE("discord", "link"), adminSearchResult, false); // success } + return this.showMessage(this.SUCCESS_SERVICE_MODE("discord", "link"), adminSearchResult, false); // success }); } else if (this.adminMode === AdminMode.SEARCH) { this.adminSearch(adminSearchResult) // admin search for username @@ -148,7 +166,6 @@ export default class AdminUiHandler extends FormModalUiHandler { } else if (this.adminMode === AdminMode.ADMIN) { this.updateAdminPanelInfo(adminSearchResult, AdminMode.SEARCH); } - return false; }; return true; } @@ -156,11 +173,17 @@ export default class AdminUiHandler extends FormModalUiHandler { } showMessage(message: string, adminResult: AdminSearchInfo, isError: boolean) { - this.scene.ui.setMode(Mode.ADMIN, Object.assign(this.config, { errorMessage: message?.trim() }), this.adminMode, adminResult, isError); + globalScene.ui.setMode( + Mode.ADMIN, + Object.assign(this.config, { errorMessage: message?.trim() }), + this.adminMode, + adminResult, + isError, + ); if (isError) { - this.scene.ui.playError(); + globalScene.ui.playError(); } else { - this.scene.ui.playSelect(); + globalScene.ui.playSelect(); } } @@ -182,9 +205,14 @@ export default class AdminUiHandler extends FormModalUiHandler { case AdminMode.ADMIN: Object.keys(adminResult).forEach((aR, i) => { this.inputs[i].setText(adminResult[aR]); - if (aR === "discordId" || aR === "googleId") { // this is here to add the icons for linking/unlinking of google/discord IDs + if (aR === "discordId" || aR === "googleId") { + // this is here to add the icons for linking/unlinking of google/discord IDs const nineSlice = this.inputContainers[i].list.find(iC => iC.type === "NineSlice"); - const img = this.scene.add.image(this.inputContainers[i].x + nineSlice!.width + this.buttonGap, this.inputContainers[i].y + (Math.floor(nineSlice!.height / 2)), adminResult[aR] === "" ? "link_icon" : "unlink_icon"); + const img = globalScene.add.image( + this.inputContainers[i].x + nineSlice!.width + this.buttonGap, + this.inputContainers[i].y + Math.floor(nineSlice!.height / 2), + adminResult[aR] === "" ? "link_icon" : "unlink_icon", + ); img.setName(`adminBtn_${aR}`); img.setOrigin(0.5, 0.5); img.setInteractive(); @@ -193,24 +221,30 @@ export default class AdminUiHandler extends FormModalUiHandler { const mode = adminResult[aR] === "" ? "Link" : "Unlink"; // this figures out if we're linking or unlinking a service const validFields = this.areFieldsValid(this.adminMode, service); if (validFields.error) { - this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error return this.showMessage(validFields.errorMessage ?? "", adminResult, true); } - this.adminLinkUnlink(this.convertInputsToAdmin(), service, mode).then(response => { // attempts to link/unlink depending on the service - if (response.error) { - this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); - return this.showMessage(response.errorType, adminResult, true); // fail - } else { // success, reload panel with new results - this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); - this.adminSearch(adminResult) - .then(response => { - if (response.error) { - return this.showMessage(response.errorType, adminResult, true); - } - return this.showMessage(this.SUCCESS_SERVICE_MODE(service, mode), response.adminSearchResult ?? adminResult, false); - }); - } - }); + this.adminLinkUnlink(this.convertInputsToAdmin(), service as AdminUiHandlerService, mode).then( + response => { + // attempts to link/unlink depending on the service + if (response.error) { + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); + return this.showMessage(response.errorType, adminResult, true); // fail + } + // success, reload panel with new results + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); + this.adminSearch(adminResult).then(response => { + if (response.error) { + return this.showMessage(response.errorType, adminResult, true); + } + return this.showMessage( + this.SUCCESS_SERVICE_MODE(service, mode), + response.adminSearchResult ?? adminResult, + false, + ); + }); + }, + ); }); this.addInteractionHoverEffect(img); this.modalContainer.add(img); @@ -220,47 +254,52 @@ export default class AdminUiHandler extends FormModalUiHandler { } } - private areFieldsValid(adminMode: AdminMode, service?: string): { error: boolean; errorMessage?: string; } { + private areFieldsValid(adminMode: AdminMode, service?: string): { error: boolean; errorMessage?: string } { switch (adminMode) { case AdminMode.LINK: - if (!this.inputs[0].text) { // username missing from link panel + if (!this.inputs[0].text) { + // username missing from link panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD("username") + errorMessage: this.ERR_REQUIRED_FIELD("username"), }; } - if (!this.inputs[1].text) { // discordId missing from linking panel + if (!this.inputs[1].text) { + // discordId missing from linking panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD("discord") + errorMessage: this.ERR_REQUIRED_FIELD("discord"), }; } break; case AdminMode.SEARCH: - if (!this.inputs[0].text) { // username missing from search panel + if (!this.inputs[0].text) { + // username missing from search panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD("username") + errorMessage: this.ERR_REQUIRED_FIELD("username"), }; } break; case AdminMode.ADMIN: - if (!this.inputs[1].text && service === "discord") { // discordId missing from admin panel + if (!this.inputs[1].text && service === "discord") { + // discordId missing from admin panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD(service) + errorMessage: this.ERR_REQUIRED_FIELD(service), }; } - if (!this.inputs[2].text && service === "google") { // googleId missing from admin panel + if (!this.inputs[2].text && service === "google") { + // googleId missing from admin panel return { error: true, - errorMessage: this.ERR_REQUIRED_FIELD(service) + errorMessage: this.ERR_REQUIRED_FIELD(service), }; } break; } return { - error: false + error: false, }; } @@ -270,33 +309,73 @@ export default class AdminUiHandler extends FormModalUiHandler { discordId: this.inputs[1]?.node ? this.inputs[1]?.text : "", googleId: this.inputs[2]?.node ? this.inputs[2]?.text : "", lastLoggedIn: this.inputs[3]?.node ? this.inputs[3]?.text : "", - registered: this.inputs[4]?.node ? this.inputs[4]?.text : "" + registered: this.inputs[4]?.node ? this.inputs[4]?.text : "", }; } private async adminSearch(adminSearchResult: AdminSearchInfo) { try { - const adminInfo = await Utils.apiFetch(`admin/account/adminSearch?username=${encodeURIComponent(adminSearchResult.username)}`, true); - if (!adminInfo.ok) { // error - if adminInfo.status === this.httpUserNotFoundErrorCode that means the username can't be found in the db - return { adminSearchResult: adminSearchResult, error: true, errorType: adminInfo.status === this.httpUserNotFoundErrorCode ? this.ERR_USERNAME_NOT_FOUND : this.ERR_GENERIC_ERROR }; - } else { // success - const adminInfoJson: AdminSearchInfo = await adminInfo.json(); - return { adminSearchResult: adminInfoJson, error: false }; + const [adminInfo, errorType] = await pokerogueApi.admin.searchAccount({ + username: adminSearchResult.username, + }); + if (errorType || !adminInfo) { + // error - if adminInfo.status === this.httpUserNotFoundErrorCode that means the username can't be found in the db + return { adminSearchResult: adminSearchResult, error: true, errorType }; } + // success + return { adminSearchResult: adminInfo, error: false }; } catch (err) { console.error(err); return { error: true, errorType: err }; } } - private async adminLinkUnlink(adminSearchResult: AdminSearchInfo, service: string, mode: string) { + private async adminLinkUnlink( + adminSearchResult: AdminSearchInfo, + service: AdminUiHandlerService, + mode: AdminUiHandlerServiceMode, + ) { try { - const response = await Utils.apiPost(`admin/account/${service}${mode}`, `username=${encodeURIComponent(adminSearchResult.username)}&${service}Id=${encodeURIComponent(service === "discord" ? adminSearchResult.discordId : adminSearchResult.googleId)}`, "application/x-www-form-urlencoded", true); - if (!response.ok) { // error - if response.status === this.httpUserNotFoundErrorCode that means the username can't be found in the db - return { adminSearchResult: adminSearchResult, error: true, errorType: response.status === this.httpUserNotFoundErrorCode ? this.ERR_USERNAME_NOT_FOUND : this.ERR_GENERIC_ERROR }; - } else { // success! - return { adminSearchResult: adminSearchResult, error: false }; + let errorType: string | null = null; + + if (service === "discord") { + if (mode === "Link") { + errorType = await pokerogueApi.admin.linkAccountToDiscord({ + discordId: adminSearchResult.discordId, + username: adminSearchResult.username, + }); + } else if (mode === "Unlink") { + errorType = await pokerogueApi.admin.unlinkAccountFromDiscord({ + discordId: adminSearchResult.discordId, + username: adminSearchResult.username, + }); + } else { + console.warn("Unknown mode", mode, "for service", service); + } + } else if (service === "google") { + if (mode === "Link") { + errorType = await pokerogueApi.admin.linkAccountToGoogleId({ + googleId: adminSearchResult.googleId, + username: adminSearchResult.username, + }); + } else if (mode === "Unlink") { + errorType = await pokerogueApi.admin.unlinkAccountFromGoogleId({ + googleId: adminSearchResult.googleId, + username: adminSearchResult.username, + }); + } else { + console.warn("Unknown mode", mode, "for service", service); + } + } else { + console.warn("Unknown service", service); } + + if (errorType) { + // error - if response.status === this.httpUserNotFoundErrorCode that means the username can't be found in the db + return { adminSearchResult: adminSearchResult, error: true, errorType }; + } + // success! + return { adminSearchResult: adminSearchResult, error: false }; } catch (err) { console.error(err); return { error: true, errorType: err }; @@ -305,19 +384,24 @@ export default class AdminUiHandler extends FormModalUiHandler { private updateAdminPanelInfo(adminSearchResult: AdminSearchInfo, mode?: AdminMode) { mode = mode ?? AdminMode.ADMIN; - this.scene.ui.setMode(Mode.ADMIN, { - buttonActions: [ - // we double revert here and below to go back 2 layers of menus - () => { - this.scene.ui.revertMode(); - this.scene.ui.revertMode(); - }, - () => { - this.scene.ui.revertMode(); - this.scene.ui.revertMode(); - } - ] - }, mode, adminSearchResult); + globalScene.ui.setMode( + Mode.ADMIN, + { + buttonActions: [ + // we double revert here and below to go back 2 layers of menus + () => { + globalScene.ui.revertMode(); + globalScene.ui.revertMode(); + }, + () => { + globalScene.ui.revertMode(); + globalScene.ui.revertMode(); + }, + ], + }, + mode, + adminSearchResult, + ); } clear(): void { @@ -325,7 +409,7 @@ export default class AdminUiHandler extends FormModalUiHandler { // this is used to remove the existing fields on the admin panel so they can be updated - const itemsToRemove: string[] = [ "formLabel", "adminBtn" ]; // this is the start of the names for each element we want to remove + const itemsToRemove: string[] = ["formLabel", "adminBtn"]; // this is the start of the names for each element we want to remove const removeArray: any[] = []; const mC = this.modalContainer.list; for (let i = mC.length - 1; i >= 0; i--) { @@ -334,7 +418,11 @@ export default class AdminUiHandler extends FormModalUiHandler { * It then also checks for any containers that are within this.modalContainer, and checks if any of its child elements are of type rexInputText * and if either of these conditions are met, the element is destroyed. */ - if (itemsToRemove.some(iTR => mC[i].name.includes(iTR)) || (mC[i].type === "Container" && (mC[i] as Phaser.GameObjects.Container).list.find(m => m.type === "rexInputText"))) { + if ( + itemsToRemove.some(iTR => mC[i].name.includes(iTR)) || + (mC[i].type === "Container" && + (mC[i] as Phaser.GameObjects.Container).list.find(m => m.type === "rexInputText")) + ) { removeArray.push(mC[i]); } } @@ -348,7 +436,7 @@ export default class AdminUiHandler extends FormModalUiHandler { export enum AdminMode { LINK, SEARCH, - ADMIN + ADMIN, } export function getAdminModeName(adminMode: AdminMode): string { diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index a82f97244cd..36a44eb5aa0 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -1,15 +1,24 @@ import { addTextObject, TextStyle } from "./text"; -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; -import { WeatherType } from "#app/data/weather"; +import { WeatherType } from "#enums/weather-type"; import { TerrainType } from "#app/data/terrain"; import { addWindow, WindowVariant } from "./ui-theme"; -import { ArenaEvent, ArenaEventType, TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; -import { BattleSceneEventType, TurnEndEvent } from "../events/battle-scene"; +import type { ArenaEvent } from "#app/events/arena"; +import { + ArenaEventType, + TagAddedEvent, + TagRemovedEvent, + TerrainChangedEvent, + WeatherChangedEvent, +} from "#app/events/arena"; +import type { TurnEndEvent } from "../events/battle-scene"; +import { BattleSceneEventType } from "../events/battle-scene"; import { ArenaTagType } from "#enums/arena-tag-type"; import TimeOfDayWidget from "./time-of-day-widget"; import * as Utils from "../utils"; -import i18next, { ParseKeys } from "i18next"; +import type { ParseKeys } from "i18next"; +import i18next from "i18next"; /** Enum used to differentiate {@linkcode Arena} effects */ enum ArenaEffectType { @@ -24,7 +33,7 @@ interface ArenaEffectInfo { /** The enum string representation of the effect */ name: string; /** {@linkcode ArenaEffectType} type of effect */ - effecType: ArenaEffectType, + effecType: ArenaEffectType; /** The maximum duration set by the effect */ maxDuration: number; @@ -41,13 +50,10 @@ export function getFieldEffectText(arenaTagType: string): string { const effectName = Utils.toCamelCaseString(arenaTagType); const i18nKey = `arenaFlyout:${effectName}` as ParseKeys; const resultName = i18next.t(i18nKey); - return (!resultName || resultName === i18nKey) ? Utils.formatText(arenaTagType) : resultName; + return !resultName || resultName === i18nKey ? Utils.formatText(arenaTagType) : resultName; } export class ArenaFlyout extends Phaser.GameObjects.Container { - /** An alias for the scene typecast to a {@linkcode BattleScene} */ - private battleScene: BattleScene; - /** The restricted width of the flyout which should be drawn to */ private flyoutWidth = 170; /** The restricted height of the flyout which should be drawn to */ @@ -93,67 +99,91 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { private readonly fieldEffectInfo: ArenaEffectInfo[] = []; // Stores callbacks in a variable so they can be unsubscribed from when destroyed - private readonly onNewArenaEvent = (event: Event) => this.onNewArena(event); - private readonly onTurnEndEvent = (event: Event) => this.onTurnEnd(event); + private readonly onNewArenaEvent = (event: Event) => this.onNewArena(event); + private readonly onTurnEndEvent = (event: Event) => this.onTurnEnd(event); private readonly onFieldEffectChangedEvent = (event: Event) => this.onFieldEffectChanged(event); - constructor(scene: Phaser.Scene) { - super(scene, 0, 0); + constructor() { + super(globalScene, 0, 0); this.setName("arena-flyout"); - this.battleScene = this.scene as BattleScene; this.translationX = this.flyoutWidth; this.anchorX = 0; this.anchorY = -98; - this.flyoutParent = this.scene.add.container(this.anchorX - this.translationX, this.anchorY); + this.flyoutParent = globalScene.add.container(this.anchorX - this.translationX, this.anchorY); this.flyoutParent.setAlpha(0); this.add(this.flyoutParent); - this.flyoutContainer = this.scene.add.container(0, 0); + this.flyoutContainer = globalScene.add.container(0, 0); this.flyoutParent.add(this.flyoutContainer); - this.flyoutWindow = addWindow(this.scene as BattleScene, 0, 0, this.flyoutWidth, this.flyoutHeight, false, false, 0, 0, WindowVariant.THIN); + this.flyoutWindow = addWindow(0, 0, this.flyoutWidth, this.flyoutHeight, false, false, 0, 0, WindowVariant.THIN); this.flyoutContainer.add(this.flyoutWindow); - this.flyoutWindowHeader = addWindow(this.scene as BattleScene, this.flyoutWidth / 2, 0, this.flyoutWidth / 2, 14, false, false, 0, 0, WindowVariant.XTHIN); + this.flyoutWindowHeader = addWindow( + this.flyoutWidth / 2, + 0, + this.flyoutWidth / 2, + 14, + false, + false, + 0, + 0, + WindowVariant.XTHIN, + ); this.flyoutWindowHeader.setOrigin(); this.flyoutContainer.add(this.flyoutWindowHeader); - this.flyoutTextHeader = addTextObject(this.scene, this.flyoutWidth / 2, 0, i18next.t("arenaFlyout:activeBattleEffects"), TextStyle.BATTLE_INFO); + this.flyoutTextHeader = addTextObject( + this.flyoutWidth / 2, + 0, + i18next.t("arenaFlyout:activeBattleEffects"), + TextStyle.BATTLE_INFO, + ); this.flyoutTextHeader.setFontSize(54); this.flyoutTextHeader.setAlign("center"); this.flyoutTextHeader.setOrigin(); this.flyoutContainer.add(this.flyoutTextHeader); - this.timeOfDayWidget = new TimeOfDayWidget(this.scene, (this.flyoutWidth / 2) + (this.flyoutWindowHeader.displayWidth / 2)); + this.timeOfDayWidget = new TimeOfDayWidget(this.flyoutWidth / 2 + this.flyoutWindowHeader.displayWidth / 2); this.flyoutContainer.add(this.timeOfDayWidget); - this.flyoutTextHeaderPlayer = addTextObject(this.scene, 6, 5, i18next.t("arenaFlyout:player"), TextStyle.SUMMARY_BLUE); + this.flyoutTextHeaderPlayer = addTextObject(6, 5, i18next.t("arenaFlyout:player"), TextStyle.SUMMARY_BLUE); this.flyoutTextHeaderPlayer.setFontSize(54); this.flyoutTextHeaderPlayer.setAlign("left"); this.flyoutTextHeaderPlayer.setOrigin(0, 0); this.flyoutContainer.add(this.flyoutTextHeaderPlayer); - this.flyoutTextHeaderField = addTextObject(this.scene, this.flyoutWidth / 2, 5, i18next.t("arenaFlyout:neutral"), TextStyle.SUMMARY_GREEN); + this.flyoutTextHeaderField = addTextObject( + this.flyoutWidth / 2, + 5, + i18next.t("arenaFlyout:neutral"), + TextStyle.SUMMARY_GREEN, + ); this.flyoutTextHeaderField.setFontSize(54); this.flyoutTextHeaderField.setAlign("center"); this.flyoutTextHeaderField.setOrigin(0.5, 0); this.flyoutContainer.add(this.flyoutTextHeaderField); - this.flyoutTextHeaderEnemy = addTextObject(this.scene, this.flyoutWidth - 6, 5, i18next.t("arenaFlyout:enemy"), TextStyle.SUMMARY_RED); + this.flyoutTextHeaderEnemy = addTextObject( + this.flyoutWidth - 6, + 5, + i18next.t("arenaFlyout:enemy"), + TextStyle.SUMMARY_RED, + ); this.flyoutTextHeaderEnemy.setFontSize(54); this.flyoutTextHeaderEnemy.setAlign("right"); this.flyoutTextHeaderEnemy.setOrigin(1, 0); this.flyoutContainer.add(this.flyoutTextHeaderEnemy); - this.flyoutTextPlayer = addTextObject(this.scene, 6, 13, "", TextStyle.BATTLE_INFO); + this.flyoutTextPlayer = addTextObject(6, 13, "", TextStyle.BATTLE_INFO); this.flyoutTextPlayer.setLineSpacing(-1); this.flyoutTextPlayer.setFontSize(48); this.flyoutTextPlayer.setAlign("left"); @@ -161,7 +191,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { this.flyoutContainer.add(this.flyoutTextPlayer); - this.flyoutTextField = addTextObject(this.scene, this.flyoutWidth / 2, 13, "", TextStyle.BATTLE_INFO); + this.flyoutTextField = addTextObject(this.flyoutWidth / 2, 13, "", TextStyle.BATTLE_INFO); this.flyoutTextField.setLineSpacing(-1); this.flyoutTextField.setFontSize(48); this.flyoutTextField.setAlign("center"); @@ -169,7 +199,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { this.flyoutContainer.add(this.flyoutTextField); - this.flyoutTextEnemy = addTextObject(this.scene, this.flyoutWidth - 6, 13, "", TextStyle.BATTLE_INFO); + this.flyoutTextEnemy = addTextObject(this.flyoutWidth - 6, 13, "", TextStyle.BATTLE_INFO); this.flyoutTextEnemy.setLineSpacing(-1); this.flyoutTextEnemy.setFontSize(48); this.flyoutTextEnemy.setAlign("right"); @@ -181,21 +211,20 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { this.flyoutParent.name = "Fight Flyout Parent"; // Subscribes to required events available on game start - this.battleScene.eventTarget.addEventListener(BattleSceneEventType.NEW_ARENA, this.onNewArenaEvent); - this.battleScene.eventTarget.addEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent); + globalScene.eventTarget.addEventListener(BattleSceneEventType.NEW_ARENA, this.onNewArenaEvent); + globalScene.eventTarget.addEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent); } - private onNewArena(event: Event) { + private onNewArena(_event: Event) { this.fieldEffectInfo.length = 0; // Subscribes to required events available on battle start - this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.WEATHER_CHANGED, this.onFieldEffectChangedEvent); - this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.TERRAIN_CHANGED, this.onFieldEffectChangedEvent); - this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent); - this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.addEventListener(ArenaEventType.WEATHER_CHANGED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.addEventListener(ArenaEventType.TERRAIN_CHANGED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); } - /** Clears out the current string stored in all arena effect texts */ private clearText() { this.flyoutTextPlayer.text = ""; @@ -253,9 +282,9 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { let foundIndex: number; switch (arenaEffectChangedEvent.constructor) { - case TagAddedEvent: + case TagAddedEvent: { const tagAddedEvent = arenaEffectChangedEvent as TagAddedEvent; - const isArenaTrapTag = this.battleScene.arena.getTag(tagAddedEvent.arenaTagType) instanceof ArenaTrapTag; + const isArenaTrapTag = globalScene.arena.getTag(tagAddedEvent.arenaTagType) instanceof ArenaTrapTag; let arenaEffectType: ArenaEffectType; if (tagAddedEvent.arenaTagSide === ArenaTagSide.BOTH) { @@ -266,15 +295,20 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { arenaEffectType = ArenaEffectType.ENEMY; } - const existingTrapTagIndex = isArenaTrapTag ? this.fieldEffectInfo.findIndex(e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType) : -1; - let name: string = getFieldEffectText(ArenaTagType[tagAddedEvent.arenaTagType]); + const existingTrapTagIndex = isArenaTrapTag + ? this.fieldEffectInfo.findIndex( + e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType, + ) + : -1; + let name: string = getFieldEffectText(ArenaTagType[tagAddedEvent.arenaTagType]); if (isArenaTrapTag) { if (existingTrapTagIndex !== -1) { const layers = tagAddedEvent.arenaTagMaxLayers > 1 ? ` (${tagAddedEvent.arenaTagLayers})` : ""; this.fieldEffectInfo[existingTrapTagIndex].name = `${name}${layers}`; break; - } else if (tagAddedEvent.arenaTagMaxLayers > 1) { + } + if (tagAddedEvent.arenaTagMaxLayers > 1) { name = `${name} (${tagAddedEvent.arenaTagLayers})`; } } @@ -284,40 +318,45 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { effecType: arenaEffectType, maxDuration: tagAddedEvent.duration, duration: tagAddedEvent.duration, - tagType: tagAddedEvent.arenaTagType + tagType: tagAddedEvent.arenaTagType, }); break; - case TagRemovedEvent: + } + case TagRemovedEvent: { const tagRemovedEvent = arenaEffectChangedEvent as TagRemovedEvent; foundIndex = this.fieldEffectInfo.findIndex(info => info.tagType === tagRemovedEvent.arenaTagType); - if (foundIndex !== -1) { // If the tag was being tracked, remove it + if (foundIndex !== -1) { + // If the tag was being tracked, remove it this.fieldEffectInfo.splice(foundIndex, 1); } break; + } case WeatherChangedEvent: - case TerrainChangedEvent: + case TerrainChangedEvent: { const fieldEffectChangedEvent = arenaEffectChangedEvent as WeatherChangedEvent | TerrainChangedEvent; // Stores the old Weather/Terrain name in case it's in the array already - const oldName = - getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent - ? WeatherType[fieldEffectChangedEvent.oldWeatherType] - : TerrainType[fieldEffectChangedEvent.oldTerrainType]); + const oldName = getFieldEffectText( + fieldEffectChangedEvent instanceof WeatherChangedEvent + ? WeatherType[fieldEffectChangedEvent.oldWeatherType] + : TerrainType[fieldEffectChangedEvent.oldTerrainType], + ); // Stores the new Weather/Terrain info const newInfo = { - name: - getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent - ? WeatherType[fieldEffectChangedEvent.newWeatherType] - : TerrainType[fieldEffectChangedEvent.newTerrainType]), - effecType: fieldEffectChangedEvent instanceof WeatherChangedEvent - ? ArenaEffectType.WEATHER - : ArenaEffectType.TERRAIN, + name: getFieldEffectText( + fieldEffectChangedEvent instanceof WeatherChangedEvent + ? WeatherType[fieldEffectChangedEvent.newWeatherType] + : TerrainType[fieldEffectChangedEvent.newTerrainType], + ), + effecType: + fieldEffectChangedEvent instanceof WeatherChangedEvent ? ArenaEffectType.WEATHER : ArenaEffectType.TERRAIN, maxDuration: fieldEffectChangedEvent.duration, - duration: fieldEffectChangedEvent.duration }; + duration: fieldEffectChangedEvent.duration, + }; - foundIndex = this.fieldEffectInfo.findIndex(info => [ newInfo.name, oldName ].includes(info.name)); + foundIndex = this.fieldEffectInfo.findIndex(info => [newInfo.name, oldName].includes(info.name)); if (foundIndex === -1) { if (newInfo.name !== undefined) { this.fieldEffectInfo.push(newInfo); // Adds the info to the array if it doesn't already exist and is defined @@ -328,6 +367,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { this.fieldEffectInfo[foundIndex] = newInfo; // Otherwise, replace the old info } break; + } } this.updateFieldText(); @@ -354,7 +394,8 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { } --info.duration; - if (info.duration <= 0) { // Removes the item if the duration has expired + if (info.duration <= 0) { + // Removes the item if the duration has expired this.fieldEffectInfo.splice(this.fieldEffectInfo.indexOf(info), 1); } } @@ -367,24 +408,24 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { * @param visible Should the flyout be shown? */ public toggleFlyout(visible: boolean): void { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.flyoutParent, x: visible ? this.anchorX : this.anchorX - this.translationX, duration: Utils.fixedInt(125), ease: "Sine.easeInOut", alpha: visible ? 1 : 0, - onComplete: () => this.timeOfDayWidget.parentVisible = visible, + onComplete: () => (this.timeOfDayWidget.parentVisible = visible), }); } public destroy(fromScene?: boolean): void { - this.battleScene.eventTarget.removeEventListener(BattleSceneEventType.NEW_ARENA, this.onNewArenaEvent); - this.battleScene.eventTarget.removeEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent); + globalScene.eventTarget.removeEventListener(BattleSceneEventType.NEW_ARENA, this.onNewArenaEvent); + globalScene.eventTarget.removeEventListener(BattleSceneEventType.TURN_END, this.onTurnEndEvent); - this.battleScene.arena.eventTarget.removeEventListener(ArenaEventType.WEATHER_CHANGED, this.onFieldEffectChangedEvent); - this.battleScene.arena.eventTarget.removeEventListener(ArenaEventType.TERRAIN_CHANGED, this.onFieldEffectChangedEvent); - this.battleScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent); - this.battleScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.removeEventListener(ArenaEventType.WEATHER_CHANGED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.removeEventListener(ArenaEventType.TERRAIN_CHANGED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent); + globalScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); super.destroy(fromScene); } diff --git a/src/ui/autocomplete-ui-handler.ts b/src/ui/autocomplete-ui-handler.ts index 480a3cf72d0..a170ae43f23 100644 --- a/src/ui/autocomplete-ui-handler.ts +++ b/src/ui/autocomplete-ui-handler.ts @@ -1,15 +1,14 @@ import { Button } from "#enums/buttons"; -import BattleScene from "../battle-scene"; import AbstractOptionSelectUiHandler from "./abstact-option-select-ui-handler"; import { Mode } from "./ui"; export default class AutoCompleteUiHandler extends AbstractOptionSelectUiHandler { modalContainer: Phaser.GameObjects.Container; - constructor(scene: BattleScene, mode: Mode = Mode.OPTION_SELECT) { - super(scene, mode); + constructor(mode: Mode = Mode.OPTION_SELECT) { + super(mode); } - getWindowWidth(): integer { + getWindowWidth(): number { return 64; } @@ -28,8 +27,15 @@ export default class AutoCompleteUiHandler extends AbstractOptionSelectUiHandler protected setupOptions() { super.setupOptions(); if (this.modalContainer) { - this.optionSelectContainer.setSize(this.optionSelectContainer.height, Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth())); - this.optionSelectContainer.setPositionRelative(this.modalContainer, this.optionSelectBg.width, this.optionSelectBg.height + 50); + this.optionSelectContainer.setSize( + this.optionSelectContainer.height, + Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()), + ); + this.optionSelectContainer.setPositionRelative( + this.modalContainer, + this.optionSelectBg.width, + this.optionSelectBg.height + 50, + ); } } diff --git a/src/ui/awaitable-ui-handler.ts b/src/ui/awaitable-ui-handler.ts index 8256f938106..890e2884fd5 100644 --- a/src/ui/awaitable-ui-handler.ts +++ b/src/ui/awaitable-ui-handler.ts @@ -1,16 +1,16 @@ -import BattleScene from "../battle-scene"; -import { Mode } from "./ui"; +import type { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { Button } from "#enums/buttons"; +import { globalScene } from "#app/global-scene"; export default abstract class AwaitableUiHandler extends UiHandler { protected awaitingActionInput: boolean; protected onActionInput: Function | null; - public tutorialActive: boolean = false; + public tutorialActive = false; public tutorialOverlay: Phaser.GameObjects.Rectangle; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); } processTutorialInput(button: Button): boolean { @@ -32,7 +32,14 @@ export default abstract class AwaitableUiHandler extends UiHandler { */ initTutorialOverlay(container: Phaser.GameObjects.Container) { if (!this.tutorialOverlay) { - this.tutorialOverlay = new Phaser.GameObjects.Rectangle(this.scene, -1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0x070707); + this.tutorialOverlay = new Phaser.GameObjects.Rectangle( + globalScene, + -1, + -1, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, + 0x070707, + ); this.tutorialOverlay.setName("tutorial-overlay"); this.tutorialOverlay.setOrigin(0, 0); this.tutorialOverlay.setAlpha(0); diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index 9df6da36055..cfa44832824 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -1,4 +1,3 @@ -import BattleScene from "../battle-scene"; import { getPokeballName } from "../data/pokeball"; import { addTextObject, getTextStyleOptions, TextStyle } from "./text"; import { Command } from "./command-ui-handler"; @@ -6,7 +5,8 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; import { Button } from "#enums/buttons"; -import { CommandPhase } from "#app/phases/command-phase"; +import type { CommandPhase } from "#app/phases/command-phase"; +import { globalScene } from "#app/global-scene"; export default class BallUiHandler extends UiHandler { private pokeballSelectContainer: Phaser.GameObjects.Container; @@ -15,30 +15,33 @@ export default class BallUiHandler extends UiHandler { private cursorObj: Phaser.GameObjects.Image | null; - private scale: number = 0.1666666667; + private scale = 0.1666666667; - constructor(scene: BattleScene) { - super(scene, Mode.BALL); + constructor() { + super(Mode.BALL); } setup() { const ui = this.getUi(); - this.scale = getTextStyleOptions(TextStyle.WINDOW, this.scene.uiTheme).scale; + this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; let optionsTextContent = ""; - for (let pb = 0; pb < Object.keys(this.scene.pokeballCounts).length; pb++) { + for (let pb = 0; pb < Object.keys(globalScene.pokeballCounts).length; pb++) { optionsTextContent += `${getPokeballName(pb)}\n`; } optionsTextContent += "Cancel"; - const optionsText = addTextObject(this.scene, 0, 0, optionsTextContent, TextStyle.WINDOW, { align: "right", maxLines: 6 }); + const optionsText = addTextObject(0, 0, optionsTextContent, TextStyle.WINDOW, { align: "right", maxLines: 6 }); const optionsTextWidth = optionsText.displayWidth; - this.pokeballSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 51 - Math.max(64, optionsTextWidth), -49); + this.pokeballSelectContainer = globalScene.add.container( + globalScene.game.canvas.width / 6 - 51 - Math.max(64, optionsTextWidth), + -49, + ); this.pokeballSelectContainer.setVisible(false); ui.add(this.pokeballSelectContainer); - this.pokeballSelectBg = addWindow(this.scene, 0, 0, 50 + Math.max(64, optionsTextWidth), 32 + 480 * this.scale); + this.pokeballSelectBg = addWindow(0, 0, 50 + Math.max(64, optionsTextWidth), 32 + 480 * this.scale); this.pokeballSelectBg.setOrigin(0, 1); this.pokeballSelectContainer.add(this.pokeballSelectBg); this.pokeballSelectContainer.add(optionsText); @@ -46,7 +49,9 @@ export default class BallUiHandler extends UiHandler { optionsText.setPositionRelative(this.pokeballSelectBg, 42, 9); optionsText.setLineSpacing(this.scale * 72); - this.countsText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, { maxLines: 5 }); + this.countsText = addTextObject(0, 0, "", TextStyle.WINDOW, { + maxLines: 5, + }); this.countsText.setPositionRelative(this.pokeballSelectBg, 18, 9); this.countsText.setLineSpacing(this.scale * 72); this.pokeballSelectContainer.add(this.countsText); @@ -69,16 +74,16 @@ export default class BallUiHandler extends UiHandler { let success = false; - const pokeballTypeCount = Object.keys(this.scene.pokeballCounts).length; + const pokeballTypeCount = Object.keys(globalScene.pokeballCounts).length; if (button === Button.ACTION || button === Button.CANCEL) { - const commandPhase = this.scene.getCurrentPhase() as CommandPhase; + const commandPhase = globalScene.getCurrentPhase() as CommandPhase; success = true; if (button === Button.ACTION && this.cursor < pokeballTypeCount) { - if (this.scene.pokeballCounts[this.cursor]) { + if (globalScene.pokeballCounts[this.cursor]) { if (commandPhase.handleCommand(Command.BALL, this.cursor)) { - this.scene.ui.setMode(Mode.COMMAND, commandPhase.getFieldIndex()); - this.scene.ui.setMode(Mode.MESSAGE); + globalScene.ui.setMode(Mode.COMMAND, commandPhase.getFieldIndex()); + globalScene.ui.setMode(Mode.MESSAGE); success = true; } } else { @@ -107,14 +112,18 @@ export default class BallUiHandler extends UiHandler { } updateCounts() { - this.countsText.setText(Object.values(this.scene.pokeballCounts).map(c => `x${c}`).join("\n")); + this.countsText.setText( + Object.values(globalScene.pokeballCounts) + .map(c => `x${c}`) + .join("\n"), + ); } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, "cursor"); + this.cursorObj = globalScene.add.image(0, 0, "cursor"); this.pokeballSelectContainer.add(this.cursorObj); } diff --git a/src/ui/base-stats-overlay.ts b/src/ui/base-stats-overlay.ts new file mode 100644 index 00000000000..5a6c67cae7b --- /dev/null +++ b/src/ui/base-stats-overlay.ts @@ -0,0 +1,118 @@ +import type { InfoToggle } from "../battle-scene"; +import { TextStyle, addTextObject } from "./text"; +import { addWindow } from "./ui-theme"; +import * as Utils from "../utils"; +import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; + +interface BaseStatsOverlaySettings { + scale?: number; // scale the box? A scale of 0.5 is recommended + x?: number; + y?: number; + /** Default is always half the screen, regardless of scale */ + width?: number; +} + +const HEIGHT = 120; +const BORDER = 8; +const GLOBAL_SCALE = 6; +const shortStats = ["HP", "ATK", "DEF", "SPATK", "SPDEF", "SPD"]; + +export class BaseStatsOverlay extends Phaser.GameObjects.Container implements InfoToggle { + public active = false; + + private statsLabels: Phaser.GameObjects.Text[] = []; + private statsRectangles: Phaser.GameObjects.Rectangle[] = []; + private statsShadows: Phaser.GameObjects.Rectangle[] = []; + private statsTotalLabel: Phaser.GameObjects.Text; + + private statsBg: Phaser.GameObjects.NineSlice; + + public scale: number; + public width: number; + + constructor(options?: BaseStatsOverlaySettings) { + super(globalScene, options?.x, options?.y); + this.scale = options?.scale || 1; // set up the scale + this.setScale(this.scale); + + // prepare the description box + this.width = (options?.width || BaseStatsOverlay.getWidth(this.scale)) / this.scale; // divide by scale as we always want this to be half a window wide + this.statsBg = addWindow(0, 0, this.width, HEIGHT); + this.statsBg.setOrigin(0, 0); + this.add(this.statsBg); + + for (let i = 0; i < 6; i++) { + const shadow = globalScene.add.rectangle(this.width - BORDER + 1, BORDER + 3 + i * 15, 100, 5, 0x006860); + shadow.setOrigin(1, 0); + this.statsShadows.push(shadow); + this.add(shadow); + + const rectangle = globalScene.add.rectangle(this.width - BORDER, BORDER + 2 + i * 15, 100, 5, 0x66aa99); + rectangle.setOrigin(1, 0); + this.statsRectangles.push(rectangle); + this.add(rectangle); + + const label = addTextObject(BORDER, BORDER - 2 + i * 15, "A", TextStyle.BATTLE_INFO); + this.statsLabels.push(label); + this.add(label); + } + + this.statsTotalLabel = addTextObject(BORDER, BORDER + 6 * 15, "A", TextStyle.MONEY_WINDOW); + this.add(this.statsTotalLabel); + + // hide this component for now + this.setVisible(false); + } + + // show this component with infos for the specific move + show(values: number[], total: number): boolean { + for (let i = 0; i < 6; i++) { + this.statsLabels[i].setText(i18next.t(`pokemonInfo:Stat.${shortStats[i]}shortened`) + ": " + `${values[i]}`); + // This accounts for base stats up to 200, might not be enough. + // TODO: change color based on value. + this.statsShadows[i].setSize(values[i] / 2, 5); + this.statsRectangles[i].setSize(values[i] / 2, 5); + } + + this.statsTotalLabel.setText(i18next.t("pokedexUiHandler:baseTotal") + ": " + `${total}`); + + this.setVisible(true); + this.active = true; + return true; + } + + clear() { + this.setVisible(false); + this.active = false; + } + + toggleInfo(visible: boolean): void { + if (visible) { + this.setVisible(true); + } + globalScene.tweens.add({ + targets: this.statsLabels, + duration: Utils.fixedInt(125), + ease: "Sine.easeInOut", + alpha: visible ? 1 : 0, + }); + if (!visible) { + this.setVisible(false); + } + } + + isActive(): boolean { + return this.active; + } + + // width of this element + static getWidth(_scale: number): number { + return globalScene.game.canvas.width / GLOBAL_SCALE / 2; + } + + // height of this element + static getHeight(scale: number, _onSide?: boolean): number { + return HEIGHT * scale; + } +} diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index 4541a2bfefa..206546ad9cb 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -1,9 +1,10 @@ -import { default as Pokemon } from "../field/pokemon"; +import type { default as Pokemon } from "../field/pokemon"; import { addTextObject, TextStyle } from "./text"; import * as Utils from "../utils"; -import BattleScene from "#app/battle-scene"; -import Move from "#app/data/move"; -import { BattleSceneEventType, BerryUsedEvent, MoveUsedEvent } from "../events/battle-scene"; +import { globalScene } from "#app/global-scene"; +import type Move from "#app/data/moves/move"; +import type { BerryUsedEvent, MoveUsedEvent } from "../events/battle-scene"; +import { BattleSceneEventType } from "../events/battle-scene"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { UiTheme } from "#enums/ui-theme"; @@ -12,19 +13,16 @@ import { getPokemonNameWithAffix } from "#app/messages"; /** Container for info about a {@linkcode Move} */ interface MoveInfo { /** The {@linkcode Move} itself */ - move: Move, + move: Move; /** The maximum PP of the {@linkcode Move} */ - maxPp: number, + maxPp: number; /** The amount of PP used by the {@linkcode Move} */ - ppUsed: number, + ppUsed: number; } /** A Flyout Menu attached to each {@linkcode BattleInfo} object on the field UI */ export default class BattleFlyout extends Phaser.GameObjects.Container { - /** An alias for the scene typecast to a {@linkcode BattleScene} */ - private battleScene: BattleScene; - /** Is this object linked to a player's Pokemon? */ private player: boolean; @@ -57,42 +55,43 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { private moveInfo: MoveInfo[] = new Array(); /** Current state of the flyout's visibility */ - public flyoutVisible: boolean = false; + public flyoutVisible = false; // Stores callbacks in a variable so they can be unsubscribed from when destroyed private readonly onMoveUsedEvent = (event: Event) => this.onMoveUsed(event); private readonly onBerryUsedEvent = (event: Event) => this.onBerryUsed(event); - constructor(scene: Phaser.Scene, player: boolean) { - super(scene, 0, 0); - this.battleScene = scene as BattleScene; + constructor(player: boolean) { + super(globalScene, 0, 0); // Note that all player based flyouts are disabled. This is included in case of future development this.player = player; this.translationX = this.player ? -this.flyoutWidth : this.flyoutWidth; - this.anchorX = (this.player ? -130 : -40); + this.anchorX = this.player ? -130 : -40; this.anchorY = -2.5 + (this.player ? -18.5 : -13); - this.flyoutParent = this.scene.add.container(this.anchorX - this.translationX, this.anchorY); + this.flyoutParent = globalScene.add.container(this.anchorX - this.translationX, this.anchorY); this.flyoutParent.setAlpha(0); this.add(this.flyoutParent); // Load the background image - this.flyoutBackground = this.scene.add.sprite(0, 0, "pbinfo_enemy_boss_stats"); + this.flyoutBackground = globalScene.add.sprite(0, 0, "pbinfo_enemy_boss_stats"); this.flyoutBackground.setOrigin(0, 0); this.flyoutParent.add(this.flyoutBackground); - this.flyoutContainer = this.scene.add.container(44 + (this.player ? -this.flyoutWidth : 0), 2); + this.flyoutContainer = globalScene.add.container(44 + (this.player ? -this.flyoutWidth : 0), 2); this.flyoutParent.add(this.flyoutContainer); // Loops through and sets the position of each text object according to the width and height of the flyout for (let i = 0; i < 4; i++) { this.flyoutText[i] = addTextObject( - this.scene, - (this.flyoutWidth / 4) + (this.flyoutWidth / 2) * (i % 2), - (this.flyoutHeight / 4) + (this.flyoutHeight / 2) * (i < 2 ? 0 : 1), "???", TextStyle.BATTLE_INFO); + this.flyoutWidth / 4 + (this.flyoutWidth / 2) * (i % 2), + this.flyoutHeight / 4 + (this.flyoutHeight / 2) * (i < 2 ? 0 : 1), + "???", + TextStyle.BATTLE_INFO, + ); this.flyoutText[i].setFontSize(45); this.flyoutText[i].setLineSpacing(-10); this.flyoutText[i].setAlign("center"); @@ -102,9 +101,25 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { this.flyoutContainer.add(this.flyoutText); this.flyoutContainer.add( - new Phaser.GameObjects.Rectangle(this.scene, this.flyoutWidth / 2, 0, 1, this.flyoutHeight + (this.battleScene.uiTheme === UiTheme.LEGACY ? 1 : 0), 0x212121).setOrigin(0.5, 0)); + new Phaser.GameObjects.Rectangle( + globalScene, + this.flyoutWidth / 2, + 0, + 1, + this.flyoutHeight + (globalScene.uiTheme === UiTheme.LEGACY ? 1 : 0), + 0x212121, + ).setOrigin(0.5, 0), + ); this.flyoutContainer.add( - new Phaser.GameObjects.Rectangle(this.scene, 0, this.flyoutHeight / 2, this.flyoutWidth + 6, 1, 0x212121).setOrigin(0, 0.5)); + new Phaser.GameObjects.Rectangle( + globalScene, + 0, + this.flyoutHeight / 2, + this.flyoutWidth + 6, + 1, + 0x212121, + ).setOrigin(0, 0.5), + ); } /** @@ -117,8 +132,8 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { this.name = `Flyout ${getPokemonNameWithAffix(this.pokemon)}`; this.flyoutParent.name = `Flyout Parent ${getPokemonNameWithAffix(this.pokemon)}`; - this.battleScene.eventTarget.addEventListener(BattleSceneEventType.MOVE_USED, this.onMoveUsedEvent); - this.battleScene.eventTarget.addEventListener(BattleSceneEventType.BERRY_USED, this.onBerryUsedEvent); + globalScene.eventTarget.addEventListener(BattleSceneEventType.MOVE_USED, this.onMoveUsedEvent); + globalScene.eventTarget.addEventListener(BattleSceneEventType.BERRY_USED, this.onBerryUsedEvent); } /** Sets and formats the text property for all {@linkcode Phaser.GameObjects.Text} in the flyoutText array */ @@ -139,9 +154,8 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { /** Updates all of the {@linkcode MoveInfo} objects in the moveInfo array */ private onMoveUsed(event: Event) { const moveUsedEvent = event as MoveUsedEvent; - if (!moveUsedEvent - || moveUsedEvent.pokemonId !== this.pokemon?.id - || moveUsedEvent.move.id === Moves.STRUGGLE) { // Ignore Struggle + if (!moveUsedEvent || moveUsedEvent.pokemonId !== this.pokemon?.id || moveUsedEvent.move.id === Moves.STRUGGLE) { + // Ignore Struggle return; } @@ -149,7 +163,11 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { if (foundInfo) { foundInfo.ppUsed = moveUsedEvent.ppUsed; } else { - this.moveInfo.push({ move: moveUsedEvent.move, maxPp: moveUsedEvent.move.pp, ppUsed: moveUsedEvent.ppUsed }); + this.moveInfo.push({ + move: moveUsedEvent.move, + maxPp: moveUsedEvent.move.pp, + ppUsed: moveUsedEvent.ppUsed, + }); } this.setText(); @@ -157,14 +175,18 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { private onBerryUsed(event: Event) { const berryUsedEvent = event as BerryUsedEvent; - if (!berryUsedEvent - || berryUsedEvent.berryModifier.pokemonId !== this.pokemon?.id - || berryUsedEvent.berryModifier.berryType !== BerryType.LEPPA) { // We only care about Leppa berries + if ( + !berryUsedEvent || + berryUsedEvent.berryModifier.pokemonId !== this.pokemon?.id || + berryUsedEvent.berryModifier.berryType !== BerryType.LEPPA + ) { + // We only care about Leppa berries return; } const foundInfo = this.moveInfo.find(info => info.ppUsed === info.maxPp); - if (!foundInfo) { // This will only happen on a de-sync of PP tracking + if (!foundInfo) { + // This will only happen on a de-sync of PP tracking return; } foundInfo.ppUsed = Math.max(foundInfo.ppUsed - 10, 0); @@ -176,7 +198,7 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { toggleFlyout(visible: boolean): void { this.flyoutVisible = visible; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.flyoutParent, x: visible ? this.anchorX : this.anchorX - this.translationX, duration: Utils.fixedInt(125), @@ -186,8 +208,8 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { } destroy(fromScene?: boolean): void { - this.battleScene.eventTarget.removeEventListener(BattleSceneEventType.MOVE_USED, this.onMoveUsedEvent); - this.battleScene.eventTarget.removeEventListener(BattleSceneEventType.BERRY_USED, this.onBerryUsedEvent); + globalScene.eventTarget.removeEventListener(BattleSceneEventType.MOVE_USED, this.onMoveUsedEvent); + globalScene.eventTarget.removeEventListener(BattleSceneEventType.BERRY_USED, this.onBerryUsedEvent); super.destroy(fromScene); } diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index 1d97998f491..355ab9167a1 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -1,11 +1,12 @@ -import { EnemyPokemon, default as Pokemon } from "../field/pokemon"; +import type { EnemyPokemon, default as Pokemon } from "../field/pokemon"; import { getLevelTotalExp, getLevelRelExp } from "../data/exp"; import * as Utils from "../utils"; import { addTextObject, TextStyle } from "./text"; import { getGenderSymbol, getGenderColor, Gender } from "../data/gender"; -import { StatusEffect } from "../data/status-effect"; -import BattleScene from "../battle-scene"; -import { Type, getTypeRgb } from "../data/type"; +import { StatusEffect } from "#enums/status-effect"; +import { globalScene } from "#app/global-scene"; +import { getTypeRgb } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { getVariantTint } from "#app/data/variant"; import { Stat } from "#enums/stat"; import BattleFlyout from "./battle-flyout"; @@ -21,17 +22,17 @@ export default class BattleInfo extends Phaser.GameObjects.Container { private player: boolean; private mini: boolean; private boss: boolean; - private bossSegments: integer; + private bossSegments: number; private offset: boolean; private lastName: string | null; - private lastTeraType: Type; + private lastTeraType: PokemonType; private lastStatus: StatusEffect; - private lastHp: integer; - private lastMaxHp: integer; + private lastHp: number; + private lastMaxHp: number; private lastHpFrame: string | null; - private lastExp: integer; - private lastLevelExp: integer; - private lastLevel: integer; + private lastExp: number; + private lastLevelExp: number; + private lastLevel: number; private lastLevelCapped: boolean; private lastStats: string; @@ -72,18 +73,18 @@ export default class BattleInfo extends Phaser.GameObjects.Container { public flyoutMenu?: BattleFlyout; private statOrder: Stat[]; - private readonly statOrderPlayer = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD ]; - private readonly statOrderEnemy = [ Stat.HP, Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD ]; + private readonly statOrderPlayer = [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD]; + private readonly statOrderEnemy = [Stat.HP, Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD]; - constructor(scene: Phaser.Scene, x: number, y: number, player: boolean) { - super(scene, x, y); + constructor(x: number, y: number, player: boolean) { + super(globalScene, x, y); this.baseY = y; this.player = player; this.mini = !player; this.boss = false; this.offset = false; this.lastName = null; - this.lastTeraType = Type.UNKNOWN; + this.lastTeraType = PokemonType.UNKNOWN; this.lastStatus = StatusEffect.NONE; this.lastHp = -1; this.lastMaxHp = -1; @@ -95,31 +96,31 @@ export default class BattleInfo extends Phaser.GameObjects.Container { // Initially invisible and shown via Pokemon.showInfo this.setVisible(false); - this.box = this.scene.add.sprite(0, 0, this.getTextureName()); + this.box = globalScene.add.sprite(0, 0, this.getTextureName()); this.box.setName("box"); this.box.setOrigin(1, 0.5); this.add(this.box); - this.nameText = addTextObject(this.scene, player ? -115 : -124, player ? -15.2 : -11.2, "", TextStyle.BATTLE_INFO); + this.nameText = addTextObject(player ? -115 : -124, player ? -15.2 : -11.2, "", TextStyle.BATTLE_INFO); this.nameText.setName("text_name"); this.nameText.setOrigin(0, 0); this.add(this.nameText); - this.genderText = addTextObject(this.scene, 0, 0, "", TextStyle.BATTLE_INFO); + this.genderText = addTextObject(0, 0, "", TextStyle.BATTLE_INFO); this.genderText.setName("text_gender"); this.genderText.setOrigin(0, 0); this.genderText.setPositionRelative(this.nameText, 0, 2); this.add(this.genderText); if (!this.player) { - this.ownedIcon = this.scene.add.sprite(0, 0, "icon_owned"); + this.ownedIcon = globalScene.add.sprite(0, 0, "icon_owned"); this.ownedIcon.setName("icon_owned"); this.ownedIcon.setVisible(false); this.ownedIcon.setOrigin(0, 0); this.ownedIcon.setPositionRelative(this.nameText, 0, 11.75); this.add(this.ownedIcon); - this.championRibbon = this.scene.add.sprite(0, 0, "champion_ribbon"); + this.championRibbon = globalScene.add.sprite(0, 0, "champion_ribbon"); this.championRibbon.setName("icon_champion_ribbon"); this.championRibbon.setVisible(false); this.championRibbon.setOrigin(0, 0); @@ -127,7 +128,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.add(this.championRibbon); } - this.teraIcon = this.scene.add.sprite(0, 0, "icon_tera"); + this.teraIcon = globalScene.add.sprite(0, 0, "icon_tera"); this.teraIcon.setName("icon_tera"); this.teraIcon.setVisible(false); this.teraIcon.setOrigin(0, 0); @@ -136,7 +137,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.teraIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.add(this.teraIcon); - this.shinyIcon = this.scene.add.sprite(0, 0, "shiny_star"); + this.shinyIcon = globalScene.add.sprite(0, 0, "shiny_star"); this.shinyIcon.setName("icon_shiny"); this.shinyIcon.setVisible(false); this.shinyIcon.setOrigin(0, 0); @@ -145,7 +146,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.shinyIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.add(this.shinyIcon); - this.fusionShinyIcon = this.scene.add.sprite(0, 0, "shiny_star_2"); + this.fusionShinyIcon = globalScene.add.sprite(0, 0, "shiny_star_2"); this.fusionShinyIcon.setName("icon_fusion_shiny"); this.fusionShinyIcon.setVisible(false); this.fusionShinyIcon.setOrigin(0, 0); @@ -153,7 +154,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.fusionShinyIcon.setPosition(this.shinyIcon.x, this.shinyIcon.y); this.add(this.fusionShinyIcon); - this.splicedIcon = this.scene.add.sprite(0, 0, "icon_spliced"); + this.splicedIcon = globalScene.add.sprite(0, 0, "icon_spliced"); this.splicedIcon.setName("icon_spliced"); this.splicedIcon.setVisible(false); this.splicedIcon.setOrigin(0, 0); @@ -162,44 +163,44 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.add(this.splicedIcon); - this.statusIndicator = this.scene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("statuses")); + this.statusIndicator = globalScene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("statuses")); this.statusIndicator.setName("icon_status"); this.statusIndicator.setVisible(false); this.statusIndicator.setOrigin(0, 0); this.statusIndicator.setPositionRelative(this.nameText, 0, 11.5); this.add(this.statusIndicator); - this.levelContainer = this.scene.add.container(player ? -41 : -50, player ? -10 : -5); + this.levelContainer = globalScene.add.container(player ? -41 : -50, player ? -10 : -5); this.levelContainer.setName("container_level"); this.add(this.levelContainer); - const levelOverlay = this.scene.add.image(0, 0, "overlay_lv"); + const levelOverlay = globalScene.add.image(0, 0, "overlay_lv"); this.levelContainer.add(levelOverlay); - this.hpBar = this.scene.add.image(player ? -61 : -71, player ? -1 : 4.5, "overlay_hp"); + this.hpBar = globalScene.add.image(player ? -61 : -71, player ? -1 : 4.5, "overlay_hp"); this.hpBar.setName("hp_bar"); this.hpBar.setOrigin(0); this.add(this.hpBar); this.hpBarSegmentDividers = []; - this.levelNumbersContainer = this.scene.add.container(9.5, (this.scene as BattleScene).uiTheme ? 0 : -0.5); + this.levelNumbersContainer = globalScene.add.container(9.5, globalScene.uiTheme ? 0 : -0.5); this.levelNumbersContainer.setName("container_level"); this.levelContainer.add(this.levelNumbersContainer); if (this.player) { - this.hpNumbersContainer = this.scene.add.container(-15, 10); + this.hpNumbersContainer = globalScene.add.container(-15, 10); this.hpNumbersContainer.setName("container_hp"); this.add(this.hpNumbersContainer); - const expBar = this.scene.add.image(-98, 18, "overlay_exp"); + const expBar = globalScene.add.image(-98, 18, "overlay_exp"); expBar.setName("overlay_exp"); expBar.setOrigin(0); this.add(expBar); - const expMaskRect = this.scene.make.graphics({}); + const expMaskRect = globalScene.make.graphics({}); expMaskRect.setScale(6); - expMaskRect.fillStyle(0xFFFFFF); + expMaskRect.fillStyle(0xffffff); expMaskRect.beginPath(); expMaskRect.fillRect(127, 126, 85, 2); @@ -211,12 +212,12 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.expMaskRect = expMaskRect; } - this.statsContainer = this.scene.add.container(0, 0); + this.statsContainer = globalScene.add.container(0, 0); this.statsContainer.setName("container_stats"); this.statsContainer.setAlpha(0); this.add(this.statsContainer); - this.statsBox = this.scene.add.sprite(0, 0, `${this.getTextureName()}_stats`); + this.statsBox = globalScene.add.sprite(0, 0, `${this.getTextureName()}_stats`); this.statsBox.setName("box_stats"); this.statsBox.setOrigin(1, 0.5); this.statsContainer.add(this.statsBox); @@ -224,7 +225,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const statLabels: Phaser.GameObjects.Sprite[] = []; this.statNumbers = []; - this.statValuesContainer = this.scene.add.container(0, 0); + this.statValuesContainer = globalScene.add.container(0, 0); this.statsContainer.add(this.statValuesContainer); // this gives us a different starting location from the left of the label and padding between stats for a player vs enemy @@ -238,7 +239,10 @@ export default class BattleInfo extends Phaser.GameObjects.Container { // we do a check for i > statOverflow to see when the stat labels go onto the next column // For enemies, we have HP (i=0) by itself then a new column, so we check for i > 0 // For players, we don't have HP, so we start with i = 0 and i = 1 for our first column, and so need to check for i > 1 - const statX = i > statOverflow ? this.statNumbers[Math.max(i - 2, 0)].x + this.statNumbers[Math.max(i - 2, 0)].width + paddingX : startingX; // we have the Math.max(i - 2, 0) in there so for i===1 to not return a negative number; since this is now based on anything >0 instead of >1, we need to allow for i-2 < 0 + const statX = + i > statOverflow + ? this.statNumbers[Math.max(i - 2, 0)].x + this.statNumbers[Math.max(i - 2, 0)].width + paddingX + : startingX; // we have the Math.max(i - 2, 0) in there so for i===1 to not return a negative number; since this is now based on anything >0 instead of >1, we need to allow for i-2 < 0 const baseY = -this.statsBox.height / 2 + 4; // this is the baseline for the y-axis let statY: number; // this will be the y-axis placement for the labels @@ -248,13 +252,18 @@ export default class BattleInfo extends Phaser.GameObjects.Container { statY = baseY + (!!(i % 2) === this.player ? 10 : 0); // we compare i % 2 against this.player to tell us where to place the label; because this.battleStatOrder for enemies has HP, this.battleStatOrder[1]=ATK, but for players this.battleStatOrder[0]=ATK, so this comparing i % 2 to this.player fixes this issue for us } - const statLabel = this.scene.add.sprite(statX, statY, "pbinfo_stat", Stat[s]); + const statLabel = globalScene.add.sprite(statX, statY, "pbinfo_stat", Stat[s]); statLabel.setName("icon_stat_label_" + i.toString()); statLabel.setOrigin(0, 0); statLabels.push(statLabel); this.statValuesContainer.add(statLabel); - const statNumber = this.scene.add.sprite(statX + statLabel.width, statY, "pbinfo_stat_numbers", this.statOrder[i] !== Stat.HP ? "3" : "empty"); + const statNumber = globalScene.add.sprite( + statX + statLabel.width, + statY, + "pbinfo_stat_numbers", + this.statOrder[i] !== Stat.HP ? "3" : "empty", + ); statNumber.setName("icon_stat_number_" + i.toString()); statNumber.setOrigin(0, 0); this.statNumbers.push(statNumber); @@ -264,39 +273,50 @@ export default class BattleInfo extends Phaser.GameObjects.Container { statLabel.setVisible(false); statNumber.setVisible(false); } - }); if (!this.player) { - this.flyoutMenu = new BattleFlyout(this.scene, this.player); + this.flyoutMenu = new BattleFlyout(this.player); this.add(this.flyoutMenu); this.moveBelow(this.flyoutMenu, this.box); } - this.type1Icon = this.scene.add.sprite(player ? -139 : -15, player ? -17 : -15.5, `pbinfo_${player ? "player" : "enemy"}_type1`); + this.type1Icon = globalScene.add.sprite( + player ? -139 : -15, + player ? -17 : -15.5, + `pbinfo_${player ? "player" : "enemy"}_type1`, + ); this.type1Icon.setName("icon_type_1"); this.type1Icon.setOrigin(0, 0); this.add(this.type1Icon); - this.type2Icon = this.scene.add.sprite(player ? -139 : -15, player ? -1 : -2.5, `pbinfo_${player ? "player" : "enemy"}_type2`); + this.type2Icon = globalScene.add.sprite( + player ? -139 : -15, + player ? -1 : -2.5, + `pbinfo_${player ? "player" : "enemy"}_type2`, + ); this.type2Icon.setName("icon_type_2"); this.type2Icon.setOrigin(0, 0); this.add(this.type2Icon); - this.type3Icon = this.scene.add.sprite(player ? -154 : 0, player ? -17 : -15.5, `pbinfo_${player ? "player" : "enemy"}_type`); + this.type3Icon = globalScene.add.sprite( + player ? -154 : 0, + player ? -17 : -15.5, + `pbinfo_${player ? "player" : "enemy"}_type`, + ); this.type3Icon.setName("icon_type_3"); this.type3Icon.setOrigin(0, 0); this.add(this.type3Icon); if (!this.player) { - this.effectivenessContainer = this.scene.add.container(0, 0); + this.effectivenessContainer = globalScene.add.container(0, 0); this.effectivenessContainer.setPositionRelative(this.type1Icon, 22, 4); this.effectivenessContainer.setVisible(false); this.add(this.effectivenessContainer); - this.effectivenessText = addTextObject(this.scene, 5, 4.5, "", TextStyle.BATTLE_INFO); - this.effectivenessWindow = addWindow((this.scene as BattleScene), 0, 0, 0, 20, undefined, false, undefined, undefined, WindowVariant.XTHIN); + this.effectivenessText = addTextObject(5, 4.5, "", TextStyle.BATTLE_INFO); + this.effectivenessWindow = addWindow(0, 0, 0, 20, undefined, false, undefined, undefined, WindowVariant.XTHIN); this.effectivenessContainer.add(this.effectivenessWindow); this.effectivenessContainer.add(this.effectivenessText); @@ -323,36 +343,64 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastTeraType = pokemon.getTeraType(); this.teraIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 2); - this.teraIcon.setVisible(this.lastTeraType !== Type.UNKNOWN); + this.teraIcon.setVisible(pokemon.isTerastallized); this.teraIcon.on("pointerover", () => { - if (this.lastTeraType !== Type.UNKNOWN) { - (this.scene as BattleScene).ui.showTooltip("", i18next.t("fightUiHandler:teraHover", { type: i18next.t(`pokemonInfo:Type.${Type[this.lastTeraType]}`) })); + if (pokemon.isTerastallized) { + globalScene.ui.showTooltip( + "", + i18next.t("fightUiHandler:teraHover", { + type: i18next.t(`pokemonInfo:Type.${PokemonType[this.lastTeraType]}`), + }), + ); } }); - this.teraIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + this.teraIcon.on("pointerout", () => globalScene.ui.hideTooltip()); const isFusion = pokemon.isFusion(); - this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 2.5); + this.splicedIcon.setPositionRelative( + this.nameText, + nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), + 2.5, + ); this.splicedIcon.setVisible(isFusion); if (this.splicedIcon.visible) { - this.splicedIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies?.getName(pokemon.fusionFormIndex)}`)); - this.splicedIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + this.splicedIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies?.getName(pokemon.fusionFormIndex)}`, + ), + ); + this.splicedIcon.on("pointerout", () => globalScene.ui.hideTooltip()); } const doubleShiny = isFusion && pokemon.shiny && pokemon.fusionShiny; const baseVariant = !doubleShiny ? pokemon.getVariant() : pokemon.variant; - this.shinyIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), 2.5); + this.shinyIcon.setPositionRelative( + this.nameText, + nameTextWidth + + this.genderText.displayWidth + + 1 + + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), + 2.5, + ); this.shinyIcon.setTexture(`shiny_star${doubleShiny ? "_1" : ""}`); this.shinyIcon.setVisible(pokemon.isShiny()); this.shinyIcon.setTint(getVariantTint(baseVariant)); if (this.shinyIcon.visible) { - const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` - : ""; - this.shinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`)); - this.shinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + const shinyDescriptor = + doubleShiny || baseVariant + ? `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` + : ""; + this.shinyIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, + ), + ); + this.shinyIcon.on("pointerout", () => globalScene.ui.hideTooltip()); } this.fusionShinyIcon.setPosition(this.shinyIcon.x, this.shinyIcon.y); @@ -363,23 +411,33 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (!this.player) { if (this.nameText.visible) { - this.nameText.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", i18next.t("battleInfo:generation", { generation: i18next.t(`starterSelectUiHandler:gen${pokemon.species.generation}`) }))); - this.nameText.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + this.nameText.on("pointerover", () => + globalScene.ui.showTooltip( + "", + i18next.t("battleInfo:generation", { + generation: i18next.t(`starterSelectUiHandler:gen${pokemon.species.generation}`), + }), + ), + ); + this.nameText.on("pointerout", () => globalScene.ui.hideTooltip()); } - const dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId]; + const dexEntry = globalScene.gameData.dexData[pokemon.species.speciesId]; this.ownedIcon.setVisible(!!dexEntry.caughtAttr); const opponentPokemonDexAttr = pokemon.getDexAttr(); - if (pokemon.scene.gameMode.isClassic) { - if (pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].classicWinCount > 0 && pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId(true)].classicWinCount > 0) { + if (globalScene.gameMode.isClassic) { + if ( + globalScene.gameData.starterData[pokemon.species.getRootSpeciesId()].classicWinCount > 0 && + globalScene.gameData.starterData[pokemon.species.getRootSpeciesId(true)].classicWinCount > 0 + ) { this.championRibbon.setVisible(true); } } // Check if Player owns all genders and forms of the Pokemon - const missingDexAttrs = ((dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr); + const missingDexAttrs = (dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr; - const ownedAbilityAttrs = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr; + const ownedAbilityAttrs = globalScene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr; // Check if the player owns ability for the root form const playerOwnsThisAbility = pokemon.checkIfPlayerHasAbilityOfStarter(ownedAbilityAttrs); @@ -409,14 +467,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const types = pokemon.getTypes(true); this.type1Icon.setTexture(`pbinfo_${this.player ? "player" : "enemy"}_type${types.length > 1 ? "1" : ""}`); - this.type1Icon.setFrame(Type[types[0]].toLowerCase()); + this.type1Icon.setFrame(PokemonType[types[0]].toLowerCase()); this.type2Icon.setVisible(types.length > 1); this.type3Icon.setVisible(types.length > 2); if (types.length > 1) { - this.type2Icon.setFrame(Type[types[1]].toLowerCase()); + this.type2Icon.setFrame(PokemonType[types[1]].toLowerCase()); } if (types.length > 2) { - this.type3Icon.setFrame(Type[types[2]].toLowerCase()); + this.type3Icon.setFrame(PokemonType[types[2]].toLowerCase()); } if (this.player) { @@ -452,10 +510,18 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.baseY = this.y; } - const offsetElements = [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.statusIndicator, this.levelContainer ]; - offsetElements.forEach(el => el.y += 1.5 * (mini ? -1 : 1)); + const offsetElements = [ + this.nameText, + this.genderText, + this.teraIcon, + this.splicedIcon, + this.shinyIcon, + this.statusIndicator, + this.levelContainer, + ]; + offsetElements.forEach(el => (el.y += 1.5 * (mini ? -1 : 1))); - [ this.type1Icon, this.type2Icon, this.type3Icon ].forEach(el => { + [this.type1Icon, this.type2Icon, this.type3Icon].forEach(el => { el.x += 4 * (mini ? 1 : -1); el.y += -8 * (mini ? 1 : -1); }); @@ -463,16 +529,16 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.statValuesContainer.x += 2 * (mini ? 1 : -1); this.statValuesContainer.y += -7 * (mini ? 1 : -1); - const toggledElements = [ this.hpNumbersContainer, this.expBar ]; + const toggledElements = [this.hpNumbersContainer, this.expBar]; toggledElements.forEach(el => el.setVisible(!mini)); } toggleStats(visible: boolean): void { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.statsContainer, duration: Utils.fixedInt(125), ease: "Sine.easeInOut", - alpha: visible ? 1 : 0 + alpha: visible ? 1 : 0, }); } @@ -482,7 +548,18 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (boss !== this.boss) { this.boss = boss; - [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.championRibbon, this.statusIndicator, this.levelContainer, this.statValuesContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); + [ + this.nameText, + this.genderText, + this.teraIcon, + this.splicedIcon, + this.shinyIcon, + this.ownedIcon, + this.championRibbon, + this.statusIndicator, + this.levelContainer, + this.statValuesContainer, + ].map(e => (e.x += 48 * (boss ? -1 : 1))); this.hpBar.x += 38 * (boss ? -1 : 1); this.hpBar.y += 2 * (this.boss ? -1 : 1); this.hpBar.setTexture(`overlay_hp${boss ? "_boss" : ""}`); @@ -500,11 +577,17 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } if (this.boss && this.bossSegments > 1) { - const uiTheme = (this.scene as BattleScene).uiTheme; + const uiTheme = globalScene.uiTheme; const maxHp = pokemon.getMaxHp(); for (let s = 1; s < this.bossSegments; s++) { - const dividerX = (Math.round((maxHp / this.bossSegments) * s) / maxHp) * this.hpBar.width; - const divider = this.scene.add.rectangle(0, 0, 1, this.hpBar.height - (uiTheme ? 0 : 1), pokemon.bossSegmentIndex >= s ? 0xFFFFFF : 0x404040); + const dividerX = (Math.round((maxHp / this.bossSegments) * s) / maxHp) * this.hpBar.width; + const divider = globalScene.add.rectangle( + 0, + 0, + 1, + this.hpBar.height - (uiTheme ? 0 : 1), + pokemon.bossSegmentIndex >= s ? 0xffffff : 0x404040, + ); divider.setOrigin(0.5, 0); divider.setName("hpBar_divider_" + s.toString()); this.add(divider); @@ -530,7 +613,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { updateInfo(pokemon: Pokemon, instant?: boolean): Promise { return new Promise(resolve => { - if (!this.scene) { + if (!globalScene) { return resolve(); } @@ -541,12 +624,16 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.genderText.setPositionRelative(this.nameText, this.nameText.displayWidth, 0); } - const teraType = pokemon.getTeraType(); + const teraType = pokemon.isTerastallized ? pokemon.getTeraType() : PokemonType.UNKNOWN; const teraTypeUpdated = this.lastTeraType !== teraType; if (teraTypeUpdated) { - this.teraIcon.setVisible(teraType !== Type.UNKNOWN); - this.teraIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1, 2); + this.teraIcon.setVisible(teraType !== PokemonType.UNKNOWN); + this.teraIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + this.genderText.displayWidth + 1, + 2, + ); this.teraIcon.setTintFill(Phaser.Display.Color.GetColor(...getTypeRgb(teraType))); this.lastTeraType = teraType; } @@ -554,9 +641,28 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (nameUpdated || teraTypeUpdated) { this.splicedIcon.setVisible(!!pokemon.fusionSpecies); - this.teraIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1, 2); - this.splicedIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 1.5); - this.shinyIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), 2.5); + this.teraIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + this.genderText.displayWidth + 1, + 2, + ); + this.splicedIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + + this.genderText.displayWidth + + 1 + + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), + 1.5, + ); + this.shinyIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + + this.genderText.displayWidth + + 1 + + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), + 2.5, + ); } if (this.lastStatus !== (pokemon.status?.effect || StatusEffect.NONE)) { @@ -574,14 +680,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const types = pokemon.getTypes(true); this.type1Icon.setTexture(`pbinfo_${this.player ? "player" : "enemy"}_type${types.length > 1 ? "1" : ""}`); - this.type1Icon.setFrame(Type[types[0]].toLowerCase()); + this.type1Icon.setFrame(PokemonType[types[0]].toLowerCase()); this.type2Icon.setVisible(types.length > 1); this.type3Icon.setVisible(types.length > 2); if (types.length > 1) { - this.type2Icon.setFrame(Type[types[1]].toLowerCase()); + this.type2Icon.setFrame(PokemonType[types[1]].toLowerCase()); } if (types.length > 2) { - this.type3Icon.setFrame(Type[types[2]].toLowerCase()); + this.type3Icon.setFrame(PokemonType[types[2]].toLowerCase()); } const updateHpFrame = () => { @@ -593,12 +699,12 @@ export default class BattleInfo extends Phaser.GameObjects.Container { }; const updatePokemonHp = () => { - let duration = !instant ? Phaser.Math.Clamp(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000) : 0; - const speed = (this.scene as BattleScene).hpBarSpeed; + let duration = !instant ? Phaser.Math.Clamp(Math.abs(this.lastHp - pokemon.hp) * 5, 250, 5000) : 0; + const speed = globalScene.hpBarSpeed; if (speed) { duration = speed >= 3 ? 0 : duration / Math.pow(2, speed); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.hpBar, ease: "Sine.easeOut", scaleX: pokemon.getHpRatio(true), @@ -615,7 +721,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { onComplete: () => { updateHpFrame(); resolve(); - } + }, }); if (!this.player) { this.lastHp = pokemon.hp; @@ -624,11 +730,16 @@ export default class BattleInfo extends Phaser.GameObjects.Container { }; if (this.player) { - const isLevelCapped = pokemon.level >= (this.scene as BattleScene).getMaxExpLevel(); + const isLevelCapped = pokemon.level >= globalScene.getMaxExpLevel(); - if ((this.lastExp !== pokemon.exp || this.lastLevel !== pokemon.level)) { + if (this.lastExp !== pokemon.exp || this.lastLevel !== pokemon.level) { const originalResolve = resolve; - const durationMultipler = Math.max(Phaser.Tweens.Builders.GetEaseFunction("Cubic.easeIn")(1 - (Math.min(pokemon.level - this.lastLevel, 10) / 10)), 0.1); + const durationMultipler = Math.max( + Phaser.Tweens.Builders.GetEaseFunction("Cubic.easeIn")( + 1 - Math.min(pokemon.level - this.lastLevel, 10) / 10, + ), + 0.1, + ); resolve = () => this.updatePokemonExp(pokemon, false, durationMultipler).then(() => originalResolve()); } else if (isLevelCapped !== this.lastLevelCapped) { this.setLevel(pokemon.level); @@ -639,7 +750,8 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (this.lastHp !== pokemon.hp || this.lastMaxHp !== pokemon.getMaxHp()) { return updatePokemonHp(); - } else if (!this.player && this.lastLevel !== pokemon.level) { + } + if (!this.player && this.lastLevel !== pokemon.level) { this.setLevel(pokemon.level); this.lastLevel = pokemon.level; } @@ -662,10 +774,17 @@ export default class BattleInfo extends Phaser.GameObjects.Container { let displayName = pokemon.getNameToRender().replace(/[♂♀]/g, ""); let nameTextWidth: number; - const nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.BATTLE_INFO); + const nameSizeTest = addTextObject(0, 0, displayName, TextStyle.BATTLE_INFO); nameTextWidth = nameSizeTest.displayWidth; - while (nameTextWidth > (this.player || !this.boss ? 60 : 98) - ((pokemon.gender !== Gender.GENDERLESS ? 6 : 0) + (pokemon.fusionSpecies ? 8 : 0) + (pokemon.isShiny() ? 8 : 0) + (Math.min(pokemon.level.toString().length, 3) - 3) * 8)) { + while ( + nameTextWidth > + (this.player || !this.boss ? 60 : 98) - + ((pokemon.gender !== Gender.GENDERLESS ? 6 : 0) + + (pokemon.fusionSpecies ? 8 : 0) + + (pokemon.isShiny() ? 8 : 0) + + (Math.min(pokemon.level.toString().length, 3) - 3) * 8) + ) { displayName = `${displayName.slice(0, displayName.endsWith(".") ? -2 : -1).trimEnd()}.`; nameSizeTest.setText(displayName); nameTextWidth = nameSizeTest.displayWidth; @@ -677,17 +796,20 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastName = pokemon.getNameToRender(); if (this.nameText.visible) { - this.nameText.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.nameText.width, this.nameText.height), Phaser.Geom.Rectangle.Contains); + this.nameText.setInteractive( + new Phaser.Geom.Rectangle(0, 0, this.nameText.width, this.nameText.height), + Phaser.Geom.Rectangle.Contains, + ); } } - updatePokemonExp(pokemon: Pokemon, instant?: boolean, levelDurationMultiplier: number = 1): Promise { + updatePokemonExp(pokemon: Pokemon, instant?: boolean, levelDurationMultiplier = 1): Promise { return new Promise(resolve => { const levelUp = this.lastLevel < pokemon.level; const relLevelExp = getLevelRelExp(this.lastLevel + 1, pokemon.species.growthRate); const levelExp = levelUp ? relLevelExp : pokemon.levelExp; let ratio = relLevelExp ? levelExp / relLevelExp : 0; - if (this.lastLevel >= (this.scene as BattleScene).getMaxExpLevel(true)) { + if (this.lastLevel >= globalScene.getMaxExpLevel(true)) { if (levelUp) { ratio = 1; } else { @@ -695,9 +817,17 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } instant = true; } - const durationMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")(1 - (Math.max(this.lastLevel - 100, 0) / 150)); - let duration = this.visible && !instant ? (((levelExp - this.lastLevelExp) / relLevelExp) * BattleInfo.EXP_GAINS_DURATION_BASE) * durationMultiplier * levelDurationMultiplier : 0; - const speed = (this.scene as BattleScene).expGainsSpeed; + const durationMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")( + 1 - Math.max(this.lastLevel - 100, 0) / 150, + ); + let duration = + this.visible && !instant + ? ((levelExp - this.lastLevelExp) / relLevelExp) * + BattleInfo.EXP_GAINS_DURATION_BASE * + durationMultiplier * + levelDurationMultiplier + : 0; + const speed = globalScene.expGainsSpeed; if (speed && speed >= ExpGainsSpeed.DEFAULT) { duration = speed >= ExpGainsSpeed.SKIP ? ExpGainsSpeed.DEFAULT : duration / Math.pow(2, speed); } @@ -709,47 +839,49 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastLevelExp = pokemon.levelExp; } if (duration) { - (this.scene as BattleScene).playSound("se/exp"); + globalScene.playSound("se/exp"); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.expMaskRect, ease: "Sine.easeIn", x: ratio * 510, duration: duration, onComplete: () => { - if (!this.scene) { + if (!globalScene) { return resolve(); } if (duration) { - this.scene.sound.stopByKey("se/exp"); + globalScene.sound.stopByKey("se/exp"); } if (ratio === 1) { - (this.scene as BattleScene).playSound("se/level_up"); + globalScene.playSound("se/level_up"); this.setLevel(this.lastLevel); - this.scene.time.delayedCall(500 * levelDurationMultiplier, () => { + globalScene.time.delayedCall(500 * levelDurationMultiplier, () => { this.expMaskRect.x = 0; this.updateInfo(pokemon, instant).then(() => resolve()); }); return; } resolve(); - } + }, }); }); } - setLevel(level: integer): void { - const isCapped = level >= (this.scene as BattleScene).getMaxExpLevel(); + setLevel(level: number): void { + const isCapped = level >= globalScene.getMaxExpLevel(); this.levelNumbersContainer.removeAll(true); const levelStr = level.toString(); for (let i = 0; i < levelStr.length; i++) { - this.levelNumbersContainer.add(this.scene.add.image(i * 8, 0, `numbers${isCapped && this.player ? "_red" : ""}`, levelStr[i])); + this.levelNumbersContainer.add( + globalScene.add.image(i * 8, 0, `numbers${isCapped && this.player ? "_red" : ""}`, levelStr[i]), + ); } this.levelContainer.setX((this.player ? -41 : -50) - 8 * Math.max(levelStr.length - 3, 0)); } - setHpNumbers(hp: integer, maxHp: integer): void { - if (!this.player || !this.scene) { + setHpNumbers(hp: number, maxHp: number): void { + if (!this.player || !globalScene) { return; } this.hpNumbersContainer.removeAll(true); @@ -757,15 +889,15 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const maxHpStr = maxHp.toString(); let offset = 0; for (let i = maxHpStr.length - 1; i >= 0; i--) { - this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, "numbers", maxHpStr[i])); + this.hpNumbersContainer.add(globalScene.add.image(offset++ * -8, 0, "numbers", maxHpStr[i])); } - this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, "numbers", "/")); + this.hpNumbersContainer.add(globalScene.add.image(offset++ * -8, 0, "numbers", "/")); for (let i = hpStr.length - 1; i >= 0; i--) { - this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, "numbers", hpStr[i])); + this.hpNumbersContainer.add(globalScene.add.image(offset++ * -8, 0, "numbers", hpStr[i])); } } - updateStats(stats: integer[]): void { + updateStats(stats: number[]): void { this.statOrder.map((s, i) => { if (s !== Stat.HP) { this.statNumbers[i].setFrame(stats[s - 1].toString()); @@ -796,7 +928,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } this.currentEffectiveness = effectiveness; - if (!(this.scene as BattleScene).typeHints || effectiveness === undefined || this.flyoutMenu?.flyoutVisible) { + if (!globalScene.typeHints || effectiveness === undefined || this.flyoutMenu?.flyoutVisible) { this.effectivenessContainer.setVisible(false); return; } @@ -816,15 +948,15 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } export class PlayerBattleInfo extends BattleInfo { - constructor(scene: Phaser.Scene) { - super(scene, Math.floor(scene.game.canvas.width / 6) - 10, -72, true); + constructor() { + super(Math.floor(globalScene.game.canvas.width / 6) - 10, -72, true); } } export class EnemyBattleInfo extends BattleInfo { - constructor(scene: Phaser.Scene) { - super(scene, 140, -141, false); + constructor() { + super(140, -141, false); } - setMini(mini: boolean): void { } // Always mini + setMini(_mini: boolean): void {} // Always mini } diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 832d665b290..ccb9378c688 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -1,12 +1,12 @@ -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text"; import { Mode } from "./ui"; import MessageUiHandler from "./message-ui-handler"; import { addWindow } from "./ui-theme"; -import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Button } from "#enums/buttons"; import i18next from "i18next"; -import { Stat, PERMANENT_STATS, getStatKey } from "#app/enums/stat"; +import { PERMANENT_STATS, getStatKey } from "#app/enums/stat"; export default class BattleMessageUiHandler extends MessageUiHandler { private levelUpStatsContainer: Phaser.GameObjects.Container; @@ -22,8 +22,8 @@ export default class BattleMessageUiHandler extends MessageUiHandler { public readonly wordWrapWidth: number = 1780; - constructor(scene: BattleScene) { - super(scene, Mode.MESSAGE); + constructor() { + super(Mode.MESSAGE); } setup(): void { @@ -32,52 +32,54 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.textTimer = null; this.textCallbackTimer = null; - this.bg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); + this.bg = globalScene.add.sprite(0, 0, "bg", globalScene.windowType); this.bg.setName("sprite-battle-msg-bg"); this.bg.setOrigin(0, 1); ui.add(this.bg); - this.commandWindow = addWindow(this.scene, 202, 0, 118, 48); + this.commandWindow = addWindow(202, 0, 118, 48); this.commandWindow.setName("window-command"); this.commandWindow.setOrigin(0, 1); this.commandWindow.setVisible(false); ui.add(this.commandWindow); - this.movesWindowContainer = this.scene.add.container(0, 0); + this.movesWindowContainer = globalScene.add.container(0, 0); this.movesWindowContainer.setName("moves-bg"); this.movesWindowContainer.setVisible(false); - const movesWindow = addWindow(this.scene, 0, 0, 243, 48); + const movesWindow = addWindow(0, 0, 243, 48); movesWindow.setName("moves-window"); movesWindow.setOrigin(0, 1); - const moveDetailsWindow = addWindow(this.scene, 240, 0, 80, 48, false, false, -1, 132); + const moveDetailsWindow = addWindow(240, 0, 80, 48, false, false, -1, 132); moveDetailsWindow.setName("move-details-window"); moveDetailsWindow.setOrigin(0, 1); - this.movesWindowContainer.add([ movesWindow, moveDetailsWindow ]); + this.movesWindowContainer.add([movesWindow, moveDetailsWindow]); ui.add(this.movesWindowContainer); - const messageContainer = this.scene.add.container(12, -39); + const messageContainer = globalScene.add.container(12, -39); ui.add(messageContainer); - const message = addTextObject(this.scene, 0, 0, "", TextStyle.MESSAGE, { + const message = addTextObject(0, 0, "", TextStyle.MESSAGE, { maxLines: 2, wordWrap: { - width: this.wordWrapWidth - } + width: this.wordWrapWidth, + }, }); messageContainer.add(message); this.message = message; - this.nameBoxContainer = this.scene.add.container(0, -16); + this.nameBoxContainer = globalScene.add.container(0, -16); this.nameBoxContainer.setVisible(false); - this.nameBox = this.scene.add.nineslice(0, 0, "namebox", this.scene.windowType, 72, 16, 8, 8, 5, 5); + this.nameBox = globalScene.add.nineslice(0, 0, "namebox", globalScene.windowType, 72, 16, 8, 8, 5, 5); this.nameBox.setOrigin(0, 0); - this.nameText = addTextObject(this.scene, 8, 0, "Rival", TextStyle.MESSAGE, { maxLines: 1 }); + this.nameText = addTextObject(8, 0, "Rival", TextStyle.MESSAGE, { + maxLines: 1, + }); this.nameBoxContainer.add(this.nameBox); this.nameBoxContainer.add(this.nameText); @@ -85,13 +87,15 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.initPromptSprite(messageContainer); - const levelUpStatsContainer = this.scene.add.container(0, 0); + const levelUpStatsContainer = globalScene.add.container(0, 0); levelUpStatsContainer.setVisible(false); ui.add(levelUpStatsContainer); this.levelUpStatsContainer = levelUpStatsContainer; - const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 73, -94, "", TextStyle.WINDOW, { maxLines: 6 }); + const levelUpStatsLabelsContent = addTextObject(globalScene.game.canvas.width / 6 - 73, -94, "", TextStyle.WINDOW, { + maxLines: 6, + }); levelUpStatsLabelsContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); let levelUpStatsLabelText = ""; @@ -101,19 +105,36 @@ export default class BattleMessageUiHandler extends MessageUiHandler { levelUpStatsLabelsContent.text = levelUpStatsLabelText; levelUpStatsLabelsContent.x -= levelUpStatsLabelsContent.displayWidth; - const levelUpStatsBg = addWindow(this.scene, (this.scene.game.canvas.width / 6), -100, 80 + levelUpStatsLabelsContent.displayWidth, 100); + const levelUpStatsBg = addWindow( + globalScene.game.canvas.width / 6, + -100, + 80 + levelUpStatsLabelsContent.displayWidth, + 100, + ); levelUpStatsBg.setOrigin(1, 0); levelUpStatsContainer.add(levelUpStatsBg); levelUpStatsContainer.add(levelUpStatsLabelsContent); - const levelUpStatsIncrContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 50, -94, "+\n+\n+\n+\n+\n+", TextStyle.WINDOW, { maxLines: 6 }); + const levelUpStatsIncrContent = addTextObject( + globalScene.game.canvas.width / 6 - 50, + -94, + "+\n+\n+\n+\n+\n+", + TextStyle.WINDOW, + { maxLines: 6 }, + ); levelUpStatsIncrContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); levelUpStatsContainer.add(levelUpStatsIncrContent); this.levelUpStatsIncrContent = levelUpStatsIncrContent; - const levelUpStatsValuesContent = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, "", TextStyle.WINDOW, { maxLines: 6, lineSpacing: 5 }); + const levelUpStatsValuesContent = addBBCodeTextObject( + globalScene.game.canvas.width / 6 - 7, + -94, + "", + TextStyle.WINDOW, + { maxLines: 6, lineSpacing: 5 }, + ); levelUpStatsValuesContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); levelUpStatsValuesContent.setOrigin(1, 0); levelUpStatsValuesContent.setAlign("right"); @@ -153,24 +174,39 @@ export default class BattleMessageUiHandler extends MessageUiHandler { super.clear(); } - showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { + showText( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { this.hideNameText(); super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); } - showDialogue(text: string, name?: string, delay?: integer | null, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { + showDialogue( + text: string, + name?: string, + delay?: number | null, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ) { if (name) { this.showNameText(name); } super.showDialogue(text, name, delay, callback, callbackDelay, prompt, promptDelay); } - promptLevelUpStats(partyMemberIndex: integer, prevStats: integer[], showTotals: boolean): Promise { + promptLevelUpStats(partyMemberIndex: number, prevStats: number[], showTotals: boolean): Promise { return new Promise(resolve => { - if (!this.scene.showLevelUpStats) { + if (!globalScene.showLevelUpStats) { return resolve(); } - const newStats = (this.scene as BattleScene).getParty()[partyMemberIndex].stats; + const newStats = globalScene.getPlayerParty()[partyMemberIndex].stats; let levelUpStatsValuesText = ""; for (const s of PERMANENT_STATS) { levelUpStatsValuesText += `${showTotals ? newStats[s] : newStats[s] - prevStats[s]}\n`; @@ -182,21 +218,19 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.onActionInput = () => { if (!showTotals) { return this.promptLevelUpStats(partyMemberIndex, [], true).then(() => resolve()); - } else { - this.levelUpStatsContainer.setVisible(false); - resolve(); } + this.levelUpStatsContainer.setVisible(false); + resolve(); }; }); } - promptIvs(pokemonId: integer, ivs: integer[], shownIvsCount: integer): Promise { + promptIvs(pokemonId: number, ivs: number[]): Promise { return new Promise(resolve => { - this.scene.executeWithSeedOffset(() => { + globalScene.executeWithSeedOffset(() => { let levelUpStatsValuesText = ""; - const shownStats = this.getTopIvs(ivs, shownIvsCount); for (const s of PERMANENT_STATS) { - levelUpStatsValuesText += `${shownStats.includes(s) ? this.getIvDescriptor(ivs[s], s, pokemonId) : "???"}\n`; + levelUpStatsValuesText += `${this.getIvDescriptor(ivs[s], s, pokemonId)}\n`; } this.levelUpStatsValuesContent.text = levelUpStatsValuesText; this.levelUpStatsIncrContent.setVisible(false); @@ -210,25 +244,10 @@ export default class BattleMessageUiHandler extends MessageUiHandler { }); } - getTopIvs(ivs: integer[], shownIvsCount: integer): Stat[] { - let shownStats: Stat[] = []; - if (shownIvsCount < 6) { - const statsPool = PERMANENT_STATS.slice(); - // Sort the stats from highest to lowest iv - statsPool.sort((s1, s2) => ivs[s2] - ivs[s1]); - for (let i = 0; i < shownIvsCount; i++) { - shownStats.push(statsPool[i]); - } - } else { - shownStats = PERMANENT_STATS.slice(); - } - return shownStats; - } - - getIvDescriptor(value: integer, typeIv: integer, pokemonId: integer): string { - const starterSpecies = this.scene.getPokemonById(pokemonId)!.species.getRootSpeciesId(); // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists - const starterIvs: number[] = this.scene.gameData.dexData[starterSpecies].ivs; - const uiTheme = (this.scene as BattleScene).uiTheme; // Assuming uiTheme is accessible + getIvDescriptor(value: number, typeIv: number, pokemonId: number): string { + const starterSpecies = globalScene.getPokemonById(pokemonId)!.species.getRootSpeciesId(); // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists + const starterIvs: number[] = globalScene.gameData.dexData[starterSpecies].ivs; + const uiTheme = globalScene.uiTheme; // Assuming uiTheme is accessible // Function to wrap text in color based on comparison const coloredText = (text: string, isBetter: boolean, ivValue) => { diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts index 616b3ff87cf..45ed766c7fa 100644 --- a/src/ui/bgm-bar.ts +++ b/src/ui/bgm-bar.ts @@ -1,7 +1,7 @@ -import BattleScene from "../battle-scene"; import { addTextObject, TextStyle } from "./text"; import i18next from "i18next"; import * as Utils from "#app/utils"; +import { globalScene } from "#app/global-scene"; const hiddenX = -150; const shownX = 0; @@ -16,20 +16,31 @@ export default class BgmBar extends Phaser.GameObjects.Container { public shown: boolean; - constructor(scene: BattleScene) { - super(scene, hiddenX, baseY); + constructor() { + super(globalScene, hiddenX, baseY); } setup(): void { this.defaultWidth = 230; this.defaultHeight = 100; - this.bg = this.scene.add.nineslice(-5, -5, "bgm_bar", undefined, this.defaultWidth, this.defaultHeight, 0, 0, 10, 10); + this.bg = globalScene.add.nineslice( + -5, + -5, + "bgm_bar", + undefined, + this.defaultWidth, + this.defaultHeight, + 0, + 0, + 10, + 10, + ); this.bg.setOrigin(0, 0); this.add(this.bg); - this.musicText = addTextObject(this.scene, 5, 5, "", TextStyle.BGM_BAR); + this.musicText = addTextObject(5, 5, "", TextStyle.BGM_BAR); this.musicText.setOrigin(0, 0); this.musicText.setWordWrapWidth(650, true); @@ -40,8 +51,8 @@ export default class BgmBar extends Phaser.GameObjects.Container { } /* - * Set the BGM Name to the BGM bar. - * @param {string} bgmName The name of the BGM to set. + * Set the BGM Name to the BGM bar. + * @param {string} bgmName The name of the BGM to set. */ setBgmToBgmBar(bgmName: string): void { this.musicText.setText(`${i18next.t("bgmName:music")}${this.getRealBgmName(bgmName)}`); @@ -52,7 +63,7 @@ export default class BgmBar extends Phaser.GameObjects.Container { this.bg.width = Math.min(this.defaultWidth, this.musicText.displayWidth + 23); this.bg.height = Math.min(this.defaultHeight, this.musicText.displayHeight + 20); - (this.scene as BattleScene).fieldUI.bringToTop(this); + globalScene.fieldUI.bringToTop(this); this.y = baseY; } @@ -72,22 +83,24 @@ export default class BgmBar extends Phaser.GameObjects.Container { return; } - if (!(this.scene as BattleScene).showBgmBar) { + if (!globalScene.showBgmBar) { this.setVisible(false); return; } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, x: visible ? shownX : hiddenX, duration: 500, ease: "Sine.easeInOut", onComplete: () => { this.setVisible(true); - } + }, }); } getRealBgmName(bgmName: string): string { - return i18next.t([ `bgmName:${bgmName}`, "bgmName:missing_entries" ], { name: Utils.formatText(bgmName) }); + return i18next.t([`bgmName:${bgmName}`, "bgmName:missing_entries"], { + name: Utils.formatText(bgmName), + }); } } diff --git a/src/ui/candy-bar.ts b/src/ui/candy-bar.ts index 14015f02259..ba85ed7fef3 100644 --- a/src/ui/candy-bar.ts +++ b/src/ui/candy-bar.ts @@ -1,8 +1,9 @@ -import BattleScene, { starterColors } from "../battle-scene"; +import { starterColors } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { TextStyle, addTextObject } from "./text"; import { argbFromRgba } from "@material/material-color-utilities"; import * as Utils from "../utils"; -import { Species } from "#enums/species"; +import type { Species } from "#enums/species"; export default class CandyBar extends Phaser.GameObjects.Container { private bg: Phaser.GameObjects.NineSlice; @@ -16,29 +17,29 @@ export default class CandyBar extends Phaser.GameObjects.Container { public shown: boolean; - constructor(scene: BattleScene) { - super(scene, (scene.game.canvas.width / 6), -((scene.game.canvas.height) / 6) + 15); + constructor() { + super(globalScene, globalScene.game.canvas.width / 6, -(globalScene.game.canvas.height / 6) + 15); } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, "party_exp_bar", undefined, 8, 18, 21, 5, 6, 4); + this.bg = globalScene.add.nineslice(0, 0, "party_exp_bar", undefined, 8, 18, 21, 5, 6, 4); this.bg.setOrigin(0, 0); this.add(this.bg); - this.candyIcon = this.scene.add.sprite(14, 0, "items", "candy"); + this.candyIcon = globalScene.add.sprite(14, 0, "items", "candy"); this.candyIcon.setOrigin(0.5, 0); this.candyIcon.setScale(0.5); this.add(this.candyIcon); - this.candyOverlayIcon = this.scene.add.sprite(14, 0, "items", "candy_overlay"); + this.candyOverlayIcon = globalScene.add.sprite(14, 0, "items", "candy_overlay"); this.candyOverlayIcon.setOrigin(0.5, 0); this.candyOverlayIcon.setScale(0.5); this.add(this.candyOverlayIcon); - this.countText = addTextObject(this.scene, 22, 4, "", TextStyle.BATTLE_INFO); + this.countText = addTextObject(22, 4, "", TextStyle.BATTLE_INFO); this.countText.setOrigin(0, 0); this.add(this.countText); @@ -46,14 +47,15 @@ export default class CandyBar extends Phaser.GameObjects.Container { this.shown = false; } - showStarterSpeciesCandy(starterSpeciesId: Species, count: integer): Promise { + showStarterSpeciesCandy(starterSpeciesId: Species, count: number): Promise { return new Promise(resolve => { if (this.shown) { if (this.speciesId === starterSpeciesId) { return resolve(); - } else { - return this.hide().then(() => this.showStarterSpeciesCandy(starterSpeciesId, count)).then(() => resolve()); } + return this.hide() + .then(() => this.showStarterSpeciesCandy(starterSpeciesId, count)) + .then(() => resolve()); } const colorScheme = starterColors[starterSpeciesId]; @@ -61,28 +63,30 @@ export default class CandyBar extends Phaser.GameObjects.Container { this.candyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0]))); this.candyOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1]))); - this.countText.setText(`${(this.scene as BattleScene).gameData.starterData[starterSpeciesId].candyCount + count} (+${count.toString()})`); + this.countText.setText( + `${globalScene.gameData.starterData[starterSpeciesId].candyCount + count} (+${count.toString()})`, + ); this.bg.width = this.countText.displayWidth + 28; - (this.scene as BattleScene).fieldUI.bringToTop(this); + globalScene.fieldUI.bringToTop(this); if (this.tween) { this.tween.stop(); } - (this.scene as BattleScene).playSound("se/shing"); + globalScene.playSound("se/shing"); - this.tween = this.scene.tweens.add({ + this.tween = globalScene.tweens.add({ targets: this, - x: (this.scene.game.canvas.width / 6) - (this.bg.width - 5), + x: globalScene.game.canvas.width / 6 - (this.bg.width - 5), duration: 500, ease: "Sine.easeOut", onComplete: () => { this.tween = null; this.resetAutoHideTimer(); resolve(); - } + }, }); this.setVisible(true); @@ -104,9 +108,9 @@ export default class CandyBar extends Phaser.GameObjects.Container { this.tween.stop(); } - this.tween = this.scene.tweens.add({ + this.tween = globalScene.tweens.add({ targets: this, - x: (this.scene.game.canvas.width / 6), + x: globalScene.game.canvas.width / 6, duration: 500, ease: "Sine.easeIn", onComplete: () => { @@ -114,7 +118,7 @@ export default class CandyBar extends Phaser.GameObjects.Container { this.shown = false; this.setVisible(false); resolve(); - } + }, }); }); } diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index e2547a626de..61989cd594e 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -1,17 +1,17 @@ -import BattleScene from "../battle-scene"; import { TextStyle, addTextObject } from "./text"; -import { Mode } from "./ui"; +import type { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; import { Button } from "#enums/buttons"; import i18next from "i18next"; -import { Challenge } from "#app/data/challenge"; +import type { Challenge } from "#app/data/challenge"; import * as Utils from "../utils"; import { Challenges } from "#app/enums/challenges"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Color, ShadowColor } from "#app/enums/color"; import { SelectStarterPhase } from "#app/phases/select-starter-phase"; import { TitlePhase } from "#app/phases/title-phase"; +import { globalScene } from "#app/global-scene"; /** * Handles all the UI for choosing optional challenges. @@ -20,7 +20,7 @@ export default class GameChallengesUiHandler extends UiHandler { private challengesContainer: Phaser.GameObjects.Container; private valuesContainer: Phaser.GameObjects.Container; - private scrollCursor: integer; + private scrollCursor: number; private optionsBg: Phaser.GameObjects.NineSlice; @@ -28,7 +28,12 @@ export default class GameChallengesUiHandler extends UiHandler { private descriptionText: BBCodeText; - private challengeLabels: Array<{ label: Phaser.GameObjects.Text, value: Phaser.GameObjects.Text, leftArrow: Phaser.GameObjects.Image, rightArrow: Phaser.GameObjects.Image }>; + private challengeLabels: Array<{ + label: Phaser.GameObjects.Text; + value: Phaser.GameObjects.Text; + leftArrow: Phaser.GameObjects.Image; + rightArrow: Phaser.GameObjects.Image; + }>; private monoTypeValue: Phaser.GameObjects.Sprite; private cursorObj: Phaser.GameObjects.NineSlice | null; @@ -45,8 +50,8 @@ export default class GameChallengesUiHandler extends UiHandler { private readonly leftArrowGap: number = 90; // distance from the label to the left arrow private readonly arrowSpacing: number = 3; // distance between the arrows and the value area - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); } setup() { @@ -54,109 +59,128 @@ export default class GameChallengesUiHandler extends UiHandler { this.widestTextBox = 0; - this.challengesContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.challengesContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); this.challengesContainer.setName("challenges"); - this.challengesContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.challengesContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - const bgOverlay = this.scene.add.rectangle(-1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0x424242, 0.8); + const bgOverlay = globalScene.add.rectangle( + -1, + -1, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, + 0x424242, + 0.8, + ); bgOverlay.setName("rect-challenge-overlay"); bgOverlay.setOrigin(0, 0); this.challengesContainer.add(bgOverlay); // TODO: Change this back to /9 when adding in difficulty - const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6), 24); + const headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6, 24); headerBg.setName("window-header-bg"); headerBg.setOrigin(0, 0); - const headerText = addTextObject(this.scene, 0, 0, i18next.t("challenges:title"), TextStyle.SETTINGS_LABEL); + const headerText = addTextObject(0, 0, i18next.t("challenges:title"), TextStyle.SETTINGS_LABEL); headerText.setName("text-header"); headerText.setOrigin(0, 0); headerText.setPositionRelative(headerBg, 8, 4); - // const difficultyBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 18) - 2, 24); - // difficultyBg.setOrigin(0, 0); - // difficultyBg.setPositionRelative(headerBg, headerBg.width, 0); - - // this.difficultyText = addTextObject(this.scene, 0, 0, "0", TextStyle.SETTINGS_LABEL); - // this.difficultyText.setOrigin(0, 0); - // this.difficultyText.setPositionRelative(difficultyBg, 8, 4); - - // const difficultyName = addTextObject(this.scene, 0, 0, i18next.t("challenges:points"), TextStyle.SETTINGS_LABEL); - // difficultyName.setOrigin(0, 0); - // difficultyName.setPositionRelative(difficultyBg, difficultyBg.width - difficultyName.displayWidth - 8, 4); - - this.optionsWidth = this.scene.scaledCanvas.width * 0.6; - this.optionsBg = addWindow(this.scene, 0, headerBg.height, this.optionsWidth, this.scene.scaledCanvas.height - headerBg.height - 2); + this.optionsWidth = globalScene.scaledCanvas.width * 0.6; + this.optionsBg = addWindow( + 0, + headerBg.height, + this.optionsWidth, + globalScene.scaledCanvas.height - headerBg.height - 2, + ); this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); - const descriptionBg = addWindow(this.scene, 0, headerBg.height, this.scene.scaledCanvas.width - this.optionsWidth, this.scene.scaledCanvas.height - headerBg.height - 26); + const descriptionBg = addWindow( + 0, + headerBg.height, + globalScene.scaledCanvas.width - this.optionsWidth, + globalScene.scaledCanvas.height - headerBg.height - 26, + ); descriptionBg.setName("window-desc-bg"); descriptionBg.setOrigin(0, 0); descriptionBg.setPositionRelative(this.optionsBg, this.optionsBg.width, 0); - this.descriptionText = new BBCodeText(this.scene, descriptionBg.x + 6, descriptionBg.y + 4, "", { + this.descriptionText = new BBCodeText(globalScene, descriptionBg.x + 6, descriptionBg.y + 4, "", { fontFamily: "emerald", fontSize: 84, color: Color.ORANGE, padding: { - bottom: 6 + bottom: 6, }, wrap: { mode: "word", width: (descriptionBg.width - 12) * 6, - } + }, }); this.descriptionText.setName("text-desc"); - this.scene.add.existing(this.descriptionText); + globalScene.add.existing(this.descriptionText); this.descriptionText.setScale(1 / 6); this.descriptionText.setShadow(4, 5, ShadowColor.ORANGE); this.descriptionText.setOrigin(0, 0); - this.startBg = addWindow(this.scene, 0, 0, descriptionBg.width, 24); + this.startBg = addWindow(0, 0, descriptionBg.width, 24); this.startBg.setName("window-start-bg"); this.startBg.setOrigin(0, 0); this.startBg.setPositionRelative(descriptionBg, 0, descriptionBg.height); - this.startText = addTextObject(this.scene, 0, 0, i18next.t("challenges:noneSelected"), TextStyle.SETTINGS_LABEL); + this.startText = addTextObject(0, 0, i18next.t("challenges:noneSelected"), TextStyle.SETTINGS_LABEL); this.startText.setName("text-start"); this.startText.setOrigin(0, 0); this.startText.setPositionRelative(this.startBg, (this.startBg.width - this.startText.displayWidth) / 2, 4); - this.startCursor = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, descriptionBg.width - 8, 16, 1, 1, 1, 1); + this.startCursor = globalScene.add.nineslice( + 0, + 0, + "summary_moves_cursor", + undefined, + descriptionBg.width - 8, + 16, + 1, + 1, + 1, + 1, + ); this.startCursor.setName("9s-start-cursor"); this.startCursor.setOrigin(0, 0); this.startCursor.setPositionRelative(this.startBg, 4, 3); this.startCursor.setVisible(false); - this.valuesContainer = this.scene.add.container(0, 0); + this.valuesContainer = globalScene.add.container(0, 0); this.valuesContainer.setName("values"); this.challengeLabels = []; for (let i = 0; i < 9; i++) { - const label = addTextObject(this.scene, 8, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); + const label = addTextObject(8, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); label.setName(`text-challenge-label-${i}`); label.setOrigin(0, 0); this.valuesContainer.add(label); - const leftArrow = this.scene.add.image(0, 0, "cursor_reverse"); + const leftArrow = globalScene.add.image(0, 0, "cursor_reverse"); leftArrow.setName(`challenge-left-arrow-${i}`); leftArrow.setOrigin(0, 0); leftArrow.setVisible(false); leftArrow.setScale(0.75); this.valuesContainer.add(leftArrow); - const rightArrow = this.scene.add.image(0, 0, "cursor"); + const rightArrow = globalScene.add.image(0, 0, "cursor"); rightArrow.setName(`challenge-right-arrow-${i}`); rightArrow.setOrigin(0, 0); rightArrow.setScale(0.75); rightArrow.setVisible(false); this.valuesContainer.add(rightArrow); - const value = addTextObject(this.scene, 0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); + const value = addTextObject(0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); value.setName(`challenge-value-text-${i}`); value.setPositionRelative(label, 100, 0); this.valuesContainer.add(value); @@ -165,11 +189,11 @@ export default class GameChallengesUiHandler extends UiHandler { label: label, value: value, leftArrow: leftArrow, - rightArrow: rightArrow + rightArrow: rightArrow, }; } - this.monoTypeValue = this.scene.add.sprite(8, 98, Utils.getLocalizedSpriteKey("types")); + this.monoTypeValue = globalScene.add.sprite(8, 98, Utils.getLocalizedSpriteKey("types")); this.monoTypeValue.setName("challenge-value-monotype-sprite"); this.monoTypeValue.setScale(0.86); this.monoTypeValue.setVisible(false); @@ -209,20 +233,21 @@ export default class GameChallengesUiHandler extends UiHandler { * init all challenge labels */ initLabels(): void { - this.setDescription(this.scene.gameMode.challenges[0].getDescription()); + this.setDescription(globalScene.gameMode.challenges[0].getDescription()); this.widestTextBox = 0; for (let i = 0; i < 9; i++) { - if (i < this.scene.gameMode.challenges.length) { + if (i < globalScene.gameMode.challenges.length) { this.challengeLabels[i].label.setVisible(true); this.challengeLabels[i].value.setVisible(true); this.challengeLabels[i].leftArrow.setVisible(true); this.challengeLabels[i].rightArrow.setVisible(true); - const tempText = addTextObject(this.scene, 0, 0, "", TextStyle.SETTINGS_LABEL); // this is added here to get the widest text object for this language, which will be used for the arrow placement + const tempText = addTextObject(0, 0, "", TextStyle.SETTINGS_LABEL); // this is added here to get the widest text object for this language, which will be used for the arrow placement - for (let j = 0; j <= this.scene.gameMode.challenges[i].maxValue; j++) { // this goes through each challenge's value to find out what the max width will be - if (this.scene.gameMode.challenges[i].id !== Challenges.SINGLE_TYPE) { - tempText.setText(this.scene.gameMode.challenges[i].getValue(j)); + for (let j = 0; j <= globalScene.gameMode.challenges[i].maxValue; j++) { + // this goes through each challenge's value to find out what the max width will be + if (globalScene.gameMode.challenges[i].id !== Challenges.SINGLE_TYPE) { + tempText.setText(globalScene.gameMode.challenges[i].getValue(j)); if (tempText.displayWidth > this.widestTextBox) { this.widestTextBox = tempText.displayWidth; } @@ -240,23 +265,34 @@ export default class GameChallengesUiHandler extends UiHandler { updateText(): void { this.setDescription(this.getActiveChallenge().getDescription()); let monoTypeVisible = false; - for (let i = 0; i < Math.min(9, this.scene.gameMode.challenges.length); i++) { - const challenge = this.scene.gameMode.challenges[this.scrollCursor + i]; + for (let i = 0; i < Math.min(9, globalScene.gameMode.challenges.length); i++) { + const challenge = globalScene.gameMode.challenges[this.scrollCursor + i]; const challengeLabel = this.challengeLabels[i]; challengeLabel.label.setText(challenge.getName()); challengeLabel.leftArrow.setPositionRelative(challengeLabel.label, this.leftArrowGap, 4.5); challengeLabel.leftArrow.setVisible(challenge.value !== 0); - challengeLabel.rightArrow.setPositionRelative(challengeLabel.leftArrow, Math.max(this.monoTypeValue.width, this.widestTextBox) + challengeLabel.leftArrow.displayWidth + 2 * this.arrowSpacing, 0); + challengeLabel.rightArrow.setPositionRelative( + challengeLabel.leftArrow, + Math.max(this.monoTypeValue.width, this.widestTextBox) + + challengeLabel.leftArrow.displayWidth + + 2 * this.arrowSpacing, + 0, + ); challengeLabel.rightArrow.setVisible(challenge.value !== challenge.maxValue); // this check looks to make sure that the arrows and value textbox don't take up too much space that they'll clip the right edge of the options background - if (challengeLabel.rightArrow.x + challengeLabel.rightArrow.width + this.optionsBg.rightWidth + this.arrowSpacing > this.optionsWidth) { + if ( + challengeLabel.rightArrow.x + challengeLabel.rightArrow.width + this.optionsBg.rightWidth + this.arrowSpacing > + this.optionsWidth + ) { // if we go out of bounds of the box, set the x position as far right as we can without going past the box, with this.arrowSpacing to allow a small gap between the arrow and border challengeLabel.rightArrow.setX(this.optionsWidth - this.arrowSpacing - this.optionsBg.rightWidth); } // this line of code gets the center point between the left and right arrows from their left side (Arrow.x gives middle point), taking into account the width of the arrows - const xLocation = Math.round((challengeLabel.leftArrow.x + challengeLabel.rightArrow.x + challengeLabel.leftArrow.displayWidth) / 2); + const xLocation = Math.round( + (challengeLabel.leftArrow.x + challengeLabel.rightArrow.x + challengeLabel.leftArrow.displayWidth) / 2, + ); if (challenge.id === Challenges.SINGLE_TYPE) { this.monoTypeValue.setX(xLocation); this.monoTypeValue.setY(challengeLabel.label.y + 8); @@ -276,24 +312,17 @@ export default class GameChallengesUiHandler extends UiHandler { } // This checks if a challenge has been selected by the user and updates the text/its opacity accordingly. - this.hasSelectedChallenge = this.scene.gameMode.challenges.some(c => c.value !== 0); + this.hasSelectedChallenge = globalScene.gameMode.challenges.some(c => c.value !== 0); if (this.hasSelectedChallenge) { - this.startText.setText(i18next.t("common:start")); this.startText.setAlpha(1); this.startText.setPositionRelative(this.startBg, (this.startBg.width - this.startText.displayWidth) / 2, 4); } else { - this.startText.setText(i18next.t("challenges:noneSelected")); this.startText.setAlpha(0.5); this.startText.setPositionRelative(this.startBg, (this.startBg.width - this.startText.displayWidth) / 2, 4); } this.challengesContainer.update(); - - // const totalDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getDifficulty(), 0); - // const totalMinDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getMinDifficulty(), 0); - // this.difficultyText.text = `${totalDifficulty}` + (totalMinDifficulty ? `/${totalMinDifficulty}` : ""); - // this.difficultyText.updateText(); } show(args: any[]): boolean { @@ -303,7 +332,7 @@ export default class GameChallengesUiHandler extends UiHandler { this.updateChallengeArrows(false); this.challengesContainer.setVisible(true); // Should always be false at the start - this.hasSelectedChallenge = this.scene.gameMode.challenges.some(c => c.value !== 0); + this.hasSelectedChallenge = globalScene.gameMode.challenges.some(c => c.value !== 0); this.setCursor(0); this.initLabels(); @@ -319,7 +348,7 @@ export default class GameChallengesUiHandler extends UiHandler { /* This code updates the challenge starter arrows to be tinted/not tinted when the start button is selected to show they can't be changed */ updateChallengeArrows(tinted: boolean) { - for (let i = 0; i < Math.min(9, this.scene.gameMode.challenges.length); i++) { + for (let i = 0; i < Math.min(9, globalScene.gameMode.challenges.length); i++) { const challengeLabel = this.challengeLabels[i]; if (tinted) { challengeLabel.leftArrow.setTint(0x808080); @@ -354,16 +383,16 @@ export default class GameChallengesUiHandler extends UiHandler { this.cursorObj?.setVisible(true); this.updateChallengeArrows(this.startCursor.visible); } else { - this.scene.clearPhaseQueue(); - this.scene.pushPhase(new TitlePhase(this.scene)); - this.scene.getCurrentPhase()?.end(); + globalScene.clearPhaseQueue(); + globalScene.pushPhase(new TitlePhase()); + globalScene.getCurrentPhase()?.end(); } success = true; } else if (button === Button.SUBMIT || button === Button.ACTION) { if (this.hasSelectedChallenge) { if (this.startCursor.visible) { - this.scene.unshiftPhase(new SelectStarterPhase(this.scene)); - this.scene.getCurrentPhase()?.end(); + globalScene.unshiftPhase(new SelectStarterPhase()); + globalScene.getCurrentPhase()?.end(); } else { this.startCursor.setVisible(true); this.cursorObj?.setVisible(false); @@ -379,15 +408,17 @@ export default class GameChallengesUiHandler extends UiHandler { case Button.UP: if (this.cursor === 0) { if (this.scrollCursor === 0) { - // When at the top of the menu and pressing UP, move to the bottommost item. - if (this.scene.gameMode.challenges.length > rowsToDisplay) { // If there are more than 9 challenges, scroll to the bottom - // First, set the cursor to the last visible element, preparing for the scroll to the end. + // When at the top of the menu and pressing UP, move to the bottommost item. + if (globalScene.gameMode.challenges.length > rowsToDisplay) { + // If there are more than 9 challenges, scroll to the bottom + // First, set the cursor to the last visible element, preparing for the scroll to the end. const successA = this.setCursor(rowsToDisplay - 1); // Then, adjust the scroll to display the bottommost elements of the menu. - const successB = this.setScrollCursor(this.scene.gameMode.challenges.length - rowsToDisplay); + const successB = this.setScrollCursor(globalScene.gameMode.challenges.length - rowsToDisplay); success = successA && successB; // success is just there to play the little validation sound effect - } else { // If there are 9 or less challenges, just move to the bottom one - success = this.setCursor(this.scene.gameMode.challenges.length - 1); + } else { + // If there are 9 or less challenges, just move to the bottom one + success = this.setCursor(globalScene.gameMode.challenges.length - 1); } } else { success = this.setScrollCursor(this.scrollCursor - 1); @@ -401,19 +432,22 @@ export default class GameChallengesUiHandler extends UiHandler { break; case Button.DOWN: if (this.cursor === rowsToDisplay - 1) { - if (this.scrollCursor < this.scene.gameMode.challenges.length - rowsToDisplay) { - // When at the bottom and pressing DOWN, scroll if possible. + if (this.scrollCursor < globalScene.gameMode.challenges.length - rowsToDisplay) { + // When at the bottom and pressing DOWN, scroll if possible. success = this.setScrollCursor(this.scrollCursor + 1); } else { - // When at the bottom of a scrolling menu and pressing DOWN, move to the topmost item. - // First, set the cursor to the first visible element, preparing for the scroll to the top. + // When at the bottom of a scrolling menu and pressing DOWN, move to the topmost item. + // First, set the cursor to the first visible element, preparing for the scroll to the top. const successA = this.setCursor(0); // Then, adjust the scroll to display the topmost elements of the menu. const successB = this.setScrollCursor(0); success = successA && successB; // success is just there to play the little validation sound effect } - } else if (this.scene.gameMode.challenges.length < rowsToDisplay && this.cursor === this.scene.gameMode.challenges.length - 1) { - // When at the bottom of a non-scrolling menu and pressing DOWN, move to the topmost item. + } else if ( + globalScene.gameMode.challenges.length < rowsToDisplay && + this.cursor === globalScene.gameMode.challenges.length - 1 + ) { + // When at the bottom of a non-scrolling menu and pressing DOWN, move to the topmost item. success = this.setCursor(0); } else { success = this.setCursor(this.cursor + 1); @@ -423,14 +457,14 @@ export default class GameChallengesUiHandler extends UiHandler { } break; case Button.LEFT: - // Moves the option cursor left, if possible. + // Moves the option cursor left, if possible. success = this.getActiveChallenge().decreaseValue(); if (success) { this.updateText(); } break; case Button.RIGHT: - // Moves the option cursor right, if possible. + // Moves the option cursor right, if possible. success = this.getActiveChallenge().increaseValue(); if (success) { this.updateText(); @@ -447,11 +481,22 @@ export default class GameChallengesUiHandler extends UiHandler { return success; } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { let ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, this.optionsWidth - 8, 16, 1, 1, 1, 1); + this.cursorObj = globalScene.add.nineslice( + 0, + 0, + "summary_moves_cursor", + undefined, + this.optionsWidth - 8, + 16, + 1, + 1, + 1, + 1, + ); this.cursorObj.setOrigin(0, 0); this.valuesContainer.add(this.cursorObj); } @@ -464,7 +509,7 @@ export default class GameChallengesUiHandler extends UiHandler { return ret; } - setScrollCursor(scrollCursor: integer): boolean { + setScrollCursor(scrollCursor: number): boolean { if (scrollCursor === this.scrollCursor) { return false; } @@ -477,7 +522,7 @@ export default class GameChallengesUiHandler extends UiHandler { } getActiveChallenge(): Challenge { - return this.scene.gameMode.challenges[this.cursor + this.scrollCursor]; + return globalScene.gameMode.challenges[this.cursor + this.scrollCursor]; } clear() { diff --git a/src/ui/char-sprite.ts b/src/ui/char-sprite.ts index d76c7ec59d0..74c021a65b8 100644 --- a/src/ui/char-sprite.ts +++ b/src/ui/char-sprite.ts @@ -1,4 +1,4 @@ -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import * as Utils from "../utils"; export default class CharSprite extends Phaser.GameObjects.Container { @@ -9,13 +9,13 @@ export default class CharSprite extends Phaser.GameObjects.Container { public variant: string; public shown: boolean; - constructor(scene: BattleScene) { - super(scene, (scene.game.canvas.width / 6) + 32, -42); + constructor() { + super(globalScene, globalScene.game.canvas.width / 6 + 32, -42); } setup(): void { - [ this.sprite, this.transitionSprite ] = new Array(2).fill(null).map(() => { - const ret = this.scene.add.sprite(0, 0, "", ""); + [this.sprite, this.transitionSprite] = new Array(2).fill(null).map(() => { + const ret = globalScene.add.sprite(0, 0, "", ""); ret.setOrigin(0.5, 1); this.add(ret); return ret; @@ -45,19 +45,19 @@ export default class CharSprite extends Phaser.GameObjects.Container { this.sprite.setTexture(key, variant); - (this.scene as BattleScene).fieldUI.bringToTop(this); + globalScene.fieldUI.bringToTop(this); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, - x: (this.scene.game.canvas.width / 6) - 102, + x: globalScene.game.canvas.width / 6 - 102, duration: 750, ease: "Cubic.easeOut", onComplete: () => { resolve(); - } + }, }); - this.setVisible(this.scene.textures.get(key).key !== Utils.MissingTextureKey); + this.setVisible(globalScene.textures.get(key).key !== Utils.MissingTextureKey); this.shown = true; this.key = key; @@ -67,12 +67,12 @@ export default class CharSprite extends Phaser.GameObjects.Container { setVariant(variant: string): Promise { return new Promise(resolve => { - (this.scene as BattleScene).fieldUI.bringToTop(this); + globalScene.fieldUI.bringToTop(this); this.transitionSprite.setTexture(this.key, variant); this.transitionSprite.setAlpha(0); this.transitionSprite.setVisible(true); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.transitionSprite, alpha: 1, duration: 250, @@ -81,7 +81,7 @@ export default class CharSprite extends Phaser.GameObjects.Container { this.sprite.setTexture(this.key, variant); this.transitionSprite.setVisible(false); resolve(); - } + }, }); this.variant = variant; }); @@ -93,9 +93,9 @@ export default class CharSprite extends Phaser.GameObjects.Container { return resolve(); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, - x: (this.scene.game.canvas.width / 6) + 32, + x: globalScene.game.canvas.width / 6 + 32, duration: 750, ease: "Cubic.easeIn", onComplete: () => { @@ -103,7 +103,7 @@ export default class CharSprite extends Phaser.GameObjects.Container { this.setVisible(false); } resolve(); - } + }, }); this.shown = false; diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 0f5edc28675..55937bb8b00 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -1,4 +1,3 @@ -import BattleScene from "../battle-scene"; import { addTextObject, TextStyle } from "./text"; import PartyUiHandler, { PartyUiMode } from "./party-ui-handler"; import { Mode } from "./ui"; @@ -7,23 +6,31 @@ import i18next from "i18next"; import { Button } from "#enums/buttons"; import { getPokemonNameWithAffix } from "#app/messages"; import { CommandPhase } from "#app/phases/command-phase"; +import { globalScene } from "#app/global-scene"; +import { TerastallizeAccessModifier } from "#app/modifier/modifier"; +import { PokemonType } from "#enums/pokemon-type"; +import { getTypeRgb } from "#app/data/type"; +import { Species } from "#enums/species"; export enum Command { FIGHT = 0, BALL, POKEMON, - RUN + RUN, + TERA, } export default class CommandUiHandler extends UiHandler { private commandsContainer: Phaser.GameObjects.Container; private cursorObj: Phaser.GameObjects.Image | null; - protected fieldIndex: integer = 0; - protected cursor2: integer = 0; + private teraButton: Phaser.GameObjects.Sprite; - constructor(scene: BattleScene) { - super(scene, Mode.COMMAND); + protected fieldIndex = 0; + protected cursor2 = 0; + + constructor() { + super(Mode.COMMAND); } setup() { @@ -32,16 +39,28 @@ export default class CommandUiHandler extends UiHandler { i18next.t("commandUiHandler:fight"), i18next.t("commandUiHandler:ball"), i18next.t("commandUiHandler:pokemon"), - i18next.t("commandUiHandler:run") + i18next.t("commandUiHandler:run"), ]; - this.commandsContainer = this.scene.add.container(217, -38.7); + this.commandsContainer = globalScene.add.container(217, -38.7); this.commandsContainer.setName("commands"); this.commandsContainer.setVisible(false); ui.add(this.commandsContainer); + this.teraButton = globalScene.add.sprite(-32, 15, "button_tera"); + this.teraButton.setName("terrastallize-button"); + this.teraButton.setScale(1.3); + this.teraButton.setFrame("fire"); + this.teraButton.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + teraColor: getTypeRgb(PokemonType.FIRE), + isTerastallized: false, + }); + this.commandsContainer.add(this.teraButton); + for (let c = 0; c < commands.length; c++) { - const commandText = addTextObject(this.scene, c % 2 === 0 ? 0 : 55.8, c < 2 ? 0 : 16, commands[c], TextStyle.WINDOW); + const commandText = addTextObject(c % 2 === 0 ? 0 : 55.8, c < 2 ? 0 : 16, commands[c], TextStyle.WINDOW); commandText.setName(commands[c]); this.commandsContainer.add(commandText); } @@ -50,24 +69,40 @@ export default class CommandUiHandler extends UiHandler { show(args: any[]): boolean { super.show(args); - this.fieldIndex = args.length ? args[0] as integer : 0; + this.fieldIndex = args.length ? (args[0] as number) : 0; this.commandsContainer.setVisible(true); let commandPhase: CommandPhase; - const currentPhase = this.scene.getCurrentPhase(); + const currentPhase = globalScene.getCurrentPhase(); if (currentPhase instanceof CommandPhase) { commandPhase = currentPhase; } else { - commandPhase = this.scene.getStandbyPhase() as CommandPhase; + commandPhase = globalScene.getStandbyPhase() as CommandPhase; } + if (this.canTera()) { + this.teraButton.setVisible(true); + this.teraButton.setFrame(PokemonType[globalScene.getField()[this.fieldIndex].getTeraType()].toLowerCase()); + } else { + this.teraButton.setVisible(false); + if (this.cursor === Command.TERA) { + this.setCursor(Command.FIGHT); + } + } + this.toggleTeraButton(); + const messageHandler = this.getUi().getMessageHandler(); messageHandler.bg.setVisible(true); messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); - messageHandler.message.setWordWrapWidth(1110); - messageHandler.showText(i18next.t("commandUiHandler:actionMessage", { pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon()) }), 0); + messageHandler.message.setWordWrapWidth(this.canTera() ? 910 : 1110); + messageHandler.showText( + i18next.t("commandUiHandler:actionMessage", { + pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon()), + }), + 0, + ); if (this.getCursor() === Command.POKEMON) { this.setCursor(Command.FIGHT); } else { @@ -85,15 +120,11 @@ export default class CommandUiHandler extends UiHandler { const cursor = this.getCursor(); if (button === Button.CANCEL || button === Button.ACTION) { - if (button === Button.ACTION) { switch (cursor) { - // Fight + // Fight case Command.FIGHT: - if ((this.scene.getCurrentPhase() as CommandPhase).checkFightOverride()) { - return true; - } - ui.setMode(Mode.FIGHT, (this.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + ui.setMode(Mode.FIGHT, (globalScene.getCurrentPhase() as CommandPhase).getFieldIndex()); success = true; break; // Ball @@ -103,38 +134,54 @@ export default class CommandUiHandler extends UiHandler { break; // Pokemon case Command.POKEMON: - ui.setMode(Mode.PARTY, PartyUiMode.SWITCH, (this.scene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), null, PartyUiHandler.FilterNonFainted); + ui.setMode( + Mode.PARTY, + PartyUiMode.SWITCH, + (globalScene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), + null, + PartyUiHandler.FilterNonFainted, + ); success = true; break; // Run case Command.RUN: - (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0); + (globalScene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0); + success = true; + break; + case Command.TERA: + ui.setMode(Mode.FIGHT, (globalScene.getCurrentPhase() as CommandPhase).getFieldIndex(), Command.TERA); success = true; break; } } else { - (this.scene.getCurrentPhase() as CommandPhase).cancel(); + (globalScene.getCurrentPhase() as CommandPhase).cancel(); } } else { switch (button) { case Button.UP: - if (cursor >= 2) { + if (cursor === Command.POKEMON || cursor === Command.RUN) { success = this.setCursor(cursor - 2); } break; case Button.DOWN: - if (cursor < 2) { + if (cursor === Command.FIGHT || cursor === Command.BALL) { success = this.setCursor(cursor + 2); } break; case Button.LEFT: - if (cursor % 2 === 1) { + if (cursor === Command.BALL || cursor === Command.RUN) { success = this.setCursor(cursor - 1); + } else if ((cursor === Command.FIGHT || cursor === Command.POKEMON) && this.canTera()) { + success = this.setCursor(Command.TERA); + this.toggleTeraButton(); } break; case Button.RIGHT: - if (cursor % 2 === 0) { + if (cursor === Command.FIGHT || cursor === Command.POKEMON) { success = this.setCursor(cursor + 1); + } else if (cursor === Command.TERA) { + success = this.setCursor(Command.FIGHT); + this.toggleTeraButton(); } break; } @@ -147,11 +194,31 @@ export default class CommandUiHandler extends UiHandler { return success; } - getCursor(): integer { + canTera(): boolean { + const hasTeraMod = !!globalScene.getModifiers(TerastallizeAccessModifier).length; + const activePokemon = globalScene.getField()[this.fieldIndex]; + const isBlockedForm = + activePokemon.isMega() || activePokemon.isMax() || activePokemon.hasSpecies(Species.NECROZMA, "ultra"); + const currentTeras = globalScene.arena.playerTerasUsed; + const plannedTera = + globalScene.currentBattle.preTurnCommands[0]?.command === Command.TERA && this.fieldIndex > 0 ? 1 : 0; + return hasTeraMod && !isBlockedForm && currentTeras + plannedTera < 1; + } + + toggleTeraButton() { + this.teraButton.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + teraColor: getTypeRgb(globalScene.getField()[this.fieldIndex].getTeraType()), + isTerastallized: this.getCursor() === Command.TERA, + }); + } + + getCursor(): number { return !this.fieldIndex ? this.cursor : this.cursor2; } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const changed = this.getCursor() !== cursor; if (changed) { if (!this.fieldIndex) { @@ -162,11 +229,16 @@ export default class CommandUiHandler extends UiHandler { } if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, "cursor"); + this.cursorObj = globalScene.add.image(0, 0, "cursor"); this.commandsContainer.add(this.cursorObj); } - this.cursorObj.setPosition(-5 + (cursor % 2 === 1 ? 56 : 0), 8 + (cursor >= 2 ? 16 : 0)); + if (cursor === Command.TERA) { + this.cursorObj.setVisible(false); + } else { + this.cursorObj.setPosition(-5 + (cursor % 2 === 1 ? 56 : 0), 8 + (cursor >= 2 ? 16 : 0)); + this.cursorObj.setVisible(true); + } return changed; } diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index 2022508fc0d..a8710b0ab01 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -1,27 +1,32 @@ -import BattleScene from "../battle-scene"; -import AbstractOptionSelectUiHandler, { OptionSelectConfig } from "./abstact-option-select-ui-handler"; +import type { OptionSelectConfig } from "./abstact-option-select-ui-handler"; +import AbstractOptionSelectUiHandler from "./abstact-option-select-ui-handler"; import { Mode } from "./ui"; import i18next from "i18next"; import { Button } from "#enums/buttons"; - +import { globalScene } from "#app/global-scene"; export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { - - public static readonly windowWidth: integer = 48; + public static readonly windowWidth: number = 48; private switchCheck: boolean; - private switchCheckCursor: integer; + private switchCheckCursor: number; - constructor(scene: BattleScene) { - super(scene, Mode.CONFIRM); + constructor() { + super(Mode.CONFIRM); } - getWindowWidth(): integer { + getWindowWidth(): number { return ConfirmUiHandler.windowWidth; } show(args: any[]): boolean { - if (args.length === 4 && args[0] instanceof Function && args[1] instanceof Function && args[2] instanceof Function && args[3] === "fullParty") { + if ( + args.length === 4 && + args[0] instanceof Function && + args[1] instanceof Function && + args[2] instanceof Function && + args[3] === "fullParty" + ) { const config: OptionSelectConfig = { options: [ { @@ -30,35 +35,38 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { args[0](); return true; }, - }, { + }, + { label: i18next.t("menu:yes"), handler: () => { args[1](); return true; - } - }, { + }, + }, + { label: i18next.t("menu:no"), handler: () => { args[2](); return true; - } - } + }, + }, ], - delay: args.length >= 8 && args[7] !== null ? args[7] as integer : 0 + delay: args.length >= 8 && args[7] !== null ? (args[7] as number) : 0, }; - super.show([ config ]); + super.show([config]); - this.switchCheck = args.length >= 5 && args[4] !== null && args[4] as boolean; + this.switchCheck = args.length >= 5 && args[4] !== null && (args[4] as boolean); - const xOffset = (args.length >= 6 && args[5] !== null ? args[5] as number : 0); - const yOffset = (args.length >= 7 && args[6] !== null ? args[6] as number : 0); + const xOffset = args.length >= 6 && args[5] !== null ? (args[5] as number) : 0; + const yOffset = args.length >= 7 && args[6] !== null ? (args[6] as number) : 0; - this.optionSelectContainer.setPosition((this.scene.game.canvas.width / 6) - 1 + xOffset, -48 + yOffset); + this.optionSelectContainer.setPosition(globalScene.game.canvas.width / 6 - 1 + xOffset, -48 + yOffset); this.setCursor(this.switchCheck ? this.switchCheckCursor : 0); return true; - } else if (args.length >= 2 && args[0] instanceof Function && args[1] instanceof Function) { + } + if (args.length >= 2 && args[0] instanceof Function && args[1] instanceof Function) { const config: OptionSelectConfig = { options: [ { @@ -66,28 +74,28 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { handler: () => { args[0](); return true; - } + }, }, { label: i18next.t("menu:no"), handler: () => { args[1](); return true; - } - } + }, + }, ], - delay: args.length >= 6 && args[5] !== null ? args[5] as number : 0, - noCancel: args.length >= 7 && args[6] !== null ? args[6] as boolean : false, + delay: args.length >= 6 && args[5] !== null ? (args[5] as number) : 0, + noCancel: args.length >= 7 && args[6] !== null ? (args[6] as boolean) : false, }; - super.show([ config ]); + super.show([config]); - this.switchCheck = args.length >= 3 && args[2] !== null && args[2] as boolean; + this.switchCheck = args.length >= 3 && args[2] !== null && (args[2] as boolean); - const xOffset = (args.length >= 4 && args[3] !== null ? args[3] as number : 0); - const yOffset = (args.length >= 5 && args[4] !== null ? args[4] as number : 0); + const xOffset = args.length >= 4 && args[3] !== null ? (args[3] as number) : 0; + const yOffset = args.length >= 5 && args[4] !== null ? (args[4] as number) : 0; - this.optionSelectContainer.setPosition((this.scene.game.canvas.width / 6) - 1 + xOffset, -48 + yOffset); + this.optionSelectContainer.setPosition(globalScene.game.canvas.width / 6 - 1 + xOffset, -48 + yOffset); this.setCursor(this.switchCheck ? this.switchCheckCursor : 0); @@ -104,7 +112,7 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { return super.processInput(button); } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const ret = super.setCursor(cursor); if (ret && this.switchCheck) { diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index b9c1c6ea49a..53c737898e7 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -1,20 +1,21 @@ import i18next from "i18next"; -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import * as Utils from "../utils"; import { TextStyle, addTextObject } from "./text"; import { WindowVariant, addWindow } from "./ui-theme"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; -interface RankingEntry { - rank: integer, - username: string, - score: integer, - wave: integer +export interface RankingEntry { + rank: number; + username: string; + score: number; + wave: number; } // Don't forget to update translations when adding a new category -enum ScoreboardCategory { +export enum ScoreboardCategory { DAILY, - WEEKLY + WEEKLY, } export class DailyRunScoreboard extends Phaser.GameObjects.Container { @@ -27,14 +28,14 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { private pageNumberLabel: Phaser.GameObjects.Text; private nextPageButton: Phaser.GameObjects.Sprite; - private pageCount: integer; - private page: integer; + private pageCount: number; + private page: number; private category: ScoreboardCategory; private _isUpdating: boolean; - constructor(scene: BattleScene, x: number, y: number) { - super(scene, x, y); + constructor(x: number, y: number) { + super(globalScene, x, y); this._isUpdating = false; this.setup(); @@ -59,24 +60,30 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { } setup() { - const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, undefined, undefined, WindowVariant.THIN); + const titleWindow = addWindow(0, 0, 114, 18, false, false, undefined, undefined, WindowVariant.THIN); this.add(titleWindow); - this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t("menu:loading"), TextStyle.WINDOW, { fontSize: "64px" }); + this.titleLabel = addTextObject( + titleWindow.displayWidth / 2, + titleWindow.displayHeight / 2, + i18next.t("menu:loading"), + TextStyle.WINDOW, + { fontSize: "64px" }, + ); this.titleLabel.setOrigin(0.5, 0.5); this.add(this.titleLabel); - const window = addWindow(this.scene, 0, 17, 114, 118, false, false, undefined, undefined, WindowVariant.THIN); + const window = addWindow(0, 17, 114, 118, false, false, undefined, undefined, WindowVariant.THIN); this.add(window); - this.rankingsContainer = this.scene.add.container(6, 21); + this.rankingsContainer = globalScene.add.container(6, 21); this.add(this.rankingsContainer); - this.loadingLabel = addTextObject(this.scene, window.displayWidth / 2, window.displayHeight / 2 + 16, "", TextStyle.WINDOW); + this.loadingLabel = addTextObject(window.displayWidth / 2, window.displayHeight / 2 + 16, "", TextStyle.WINDOW); this.loadingLabel.setOrigin(0.5, 0.5); this.loadingLabel.setVisible(false); - this.prevCategoryButton = this.scene.add.sprite(4, 4, "cursor_reverse"); + this.prevCategoryButton = globalScene.add.sprite(4, 4, "cursor_reverse"); this.prevCategoryButton.setOrigin(0, 0); this.add(this.prevCategoryButton); @@ -85,7 +92,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { this.update(this.category ? this.category - 1 : Utils.getEnumKeys(ScoreboardCategory).length - 1); }); - this.nextCategoryButton = this.scene.add.sprite(window.displayWidth - 4, 4, "cursor"); + this.nextCategoryButton = globalScene.add.sprite(window.displayWidth - 4, 4, "cursor"); this.nextCategoryButton.setOrigin(1, 0); this.add(this.nextCategoryButton); @@ -94,7 +101,11 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { this.update(this.category < Utils.getEnumKeys(ScoreboardCategory).length - 1 ? this.category + 1 : 0); }); - this.prevPageButton = this.scene.add.sprite(window.displayWidth / 2 - 16, titleWindow.displayHeight + window.displayHeight - 15, "cursor_reverse"); + this.prevPageButton = globalScene.add.sprite( + window.displayWidth / 2 - 16, + titleWindow.displayHeight + window.displayHeight - 15, + "cursor_reverse", + ); this.prevPageButton.setOrigin(0, 0); this.prevPageButton.setAlpha(0.5); this.add(this.prevPageButton); @@ -106,11 +117,21 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { } }); - this.pageNumberLabel = addTextObject(this.scene, window.displayWidth / 2, titleWindow.displayHeight + window.displayHeight - 16, "1", TextStyle.WINDOW, { fontSize: "64px" }); + this.pageNumberLabel = addTextObject( + window.displayWidth / 2, + titleWindow.displayHeight + window.displayHeight - 16, + "1", + TextStyle.WINDOW, + { fontSize: "64px" }, + ); this.pageNumberLabel.setOrigin(0.5, 0); this.add(this.pageNumberLabel); - this.nextPageButton = this.scene.add.sprite(window.displayWidth / 2 + 16, titleWindow.displayHeight + window.displayHeight - 15, "cursor"); + this.nextPageButton = globalScene.add.sprite( + window.displayWidth / 2 + 16, + titleWindow.displayHeight + window.displayHeight - 15, + "cursor", + ); this.nextPageButton.setOrigin(1, 0); this.nextPageButton.setAlpha(0.5); this.add(this.nextPageButton); @@ -130,20 +151,28 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { updateRankings(rankings: RankingEntry[]) { const getEntry = (rank: string, username: string, score: string, wave: string) => { - const entryContainer = this.scene.add.container(0, 0); + const entryContainer = globalScene.add.container(0, 0); - const rankLabel = addTextObject(this.scene, 0, 0, rank, TextStyle.WINDOW, { fontSize: "54px" }); + const rankLabel = addTextObject(0, 0, rank, TextStyle.WINDOW, { + fontSize: "54px", + }); entryContainer.add(rankLabel); - const usernameLabel = addTextObject(this.scene, 12, 0, username, TextStyle.WINDOW, { fontSize: "54px" }); + const usernameLabel = addTextObject(12, 0, username, TextStyle.WINDOW, { + fontSize: "54px", + }); entryContainer.add(usernameLabel); - const scoreLabel = addTextObject(this.scene, 84, 0, score, TextStyle.WINDOW, { fontSize: "54px" }); + const scoreLabel = addTextObject(84, 0, score, TextStyle.WINDOW, { + fontSize: "54px", + }); entryContainer.add(scoreLabel); switch (this.category) { case ScoreboardCategory.DAILY: - const waveLabel = addTextObject(this.scene, 68, 0, wave, TextStyle.WINDOW, { fontSize: "54px" }); + const waveLabel = addTextObject(68, 0, wave, TextStyle.WINDOW, { + fontSize: "54px", + }); entryContainer.add(waveLabel); break; case ScoreboardCategory.WEEKLY: @@ -154,9 +183,16 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { return entryContainer; }; - this.rankingsContainer.add(getEntry(i18next.t("menu:positionIcon"), i18next.t("menu:usernameScoreboard"), i18next.t("menu:score"), i18next.t("menu:wave"))); + this.rankingsContainer.add( + getEntry( + i18next.t("menu:positionIcon"), + i18next.t("menu:usernameScoreboard"), + i18next.t("menu:score"), + i18next.t("menu:wave"), + ), + ); - rankings.forEach((r: RankingEntry, i: integer) => { + rankings.forEach((r: RankingEntry, i: number) => { const entryContainer = getEntry(r.rank.toString(), r.username, r.score.toString(), r.wave.toString()); entryContainer.setY((i + 1) * 9); this.rankingsContainer.add(entryContainer); @@ -174,8 +210,8 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { * * @param {ScoreboardCategory} [category=this.category] - The category to fetch rankings for. Defaults to the current category. * @param {number} [page=this.page] - The page number to fetch. Defaults to the current page. - */ - update(category: ScoreboardCategory = this.category, page: integer = this.page) { + */ + update(category: ScoreboardCategory = this.category, page: number = this.page) { if (this.isUpdating) { return; } @@ -190,40 +226,49 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { this.page = page = 1; } - Utils.executeIf(category !== this.category || this.pageCount === undefined, - () => Utils.apiFetch(`daily/rankingpagecount?category=${category}`).then(response => response.json()).then(count => this.pageCount = count) - ).then(() => { - Utils.apiFetch(`daily/rankings?category=${category}&page=${page}`) - .then(response => response.json()) - .then(jsonResponse => { - this.page = page; - this.category = category; - this.titleLabel.setText(`${i18next.t(`menu:${ScoreboardCategory[category].toLowerCase()}Rankings`)}`); - this.pageNumberLabel.setText(page.toString()); - if (jsonResponse) { - this.loadingLabel.setVisible(false); - this.updateRankings(jsonResponse); - } else { - this.loadingLabel.setText(i18next.t("menu:noRankings")); - } - }).finally(() => { - this.isUpdating = false; - }); - }).catch(err => { - console.error("Failed to load daily rankings:\n", err); - }); + Utils.executeIf(category !== this.category || this.pageCount === undefined, () => + pokerogueApi.daily.getRankingsPageCount({ category }).then(count => (this.pageCount = count)), + ) + .then(() => { + pokerogueApi.daily + .getRankings({ category, page }) + .then(rankings => { + this.page = page; + this.category = category; + this.titleLabel.setText(`${i18next.t(`menu:${ScoreboardCategory[category].toLowerCase()}Rankings`)}`); + this.pageNumberLabel.setText(page.toString()); + if (rankings) { + this.loadingLabel.setVisible(false); + this.updateRankings(rankings); + } else { + this.loadingLabel.setText(i18next.t("menu:noRankings")); + } + }) + .finally(() => { + this.isUpdating = false; + }); + }) + .catch(err => { + console.error("Failed to load daily rankings:\n", err); + }); } /** * Sets the state of the navigation buttons. * @param {boolean} [enabled=true] - Whether the buttons should be enabled or disabled. */ - setButtonsState(enabled: boolean = true) { + setButtonsState(enabled = true) { const buttons = [ - { button: this.prevPageButton, alphaValue: enabled ? (this.page > 1 ? 1 : 0.5) : 0.5 }, - { button: this.nextPageButton, alphaValue: enabled ? (this.page < this.pageCount ? 1 : 0.5) : 0.5 }, + { + button: this.prevPageButton, + alphaValue: enabled ? (this.page > 1 ? 1 : 0.5) : 0.5, + }, + { + button: this.nextPageButton, + alphaValue: enabled ? (this.page < this.pageCount ? 1 : 0.5) : 0.5, + }, { button: this.nextCategoryButton, alphaValue: enabled ? 1 : 0.5 }, - { button: this.prevCategoryButton, alphaValue: enabled ? 1 : 0.5 } + { button: this.prevCategoryButton, alphaValue: enabled ? 1 : 0.5 }, ]; buttons.forEach(({ button, alphaValue }) => { @@ -236,7 +281,3 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { }); } } - -export interface DailyRunScoreboard { - scene: BattleScene -} diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index e16efe17036..2cbd1f0dfa9 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -1,26 +1,28 @@ -import BattleScene from "#app/battle-scene"; -import { SceneBase } from "#app/scene-base"; +import { globalScene } from "#app/global-scene"; import { addTextObject, TextStyle } from "./text"; import { addWindow, WindowVariant } from "./ui-theme"; +import { ScrollBar } from "#app/ui/scroll-bar"; import i18next from "i18next"; export enum DropDownState { - ON = 0, - OFF = 1, - EXCLUDE = 2, - UNLOCKABLE = 3 + ON = 0, + OFF = 1, + EXCLUDE = 2, + UNLOCKABLE = 3, + ONE = 4, + TWO = 5, } export enum DropDownType { - SINGLE = 0, - MULTI = 1, - HYBRID = 2, - RADIAL = 3 + SINGLE = 0, + MULTI = 1, + HYBRID = 2, + RADIAL = 3, } export enum SortDirection { ASC = -1, - DESC = 1 + DESC = 1, } export enum SortCriteria { @@ -28,7 +30,9 @@ export enum SortCriteria { COST = 1, CANDY = 2, IV = 3, - NAME = 4 + NAME = 4, + CAUGHT = 5, + HATCHED = 6, } export class DropDownLabel { @@ -43,7 +47,6 @@ export class DropDownLabel { } } - export class DropDownOption extends Phaser.GameObjects.Container { public state: DropDownState = DropDownState.ON; public toggle: Phaser.GameObjects.Sprite; @@ -56,21 +59,23 @@ export class DropDownOption extends Phaser.GameObjects.Container { private offColor = 0x272727; private excludeColor = 0xff5555; private unlockableColor = 0xffff00; + private oneColor = 0x33bbff; + private twoColor = 0x33bbff; - constructor(scene: SceneBase, val: any, labels: DropDownLabel | DropDownLabel[]) { - super(scene); + constructor(val: any, labels: DropDownLabel | DropDownLabel[]) { + super(globalScene); this.val = val; if (Array.isArray(labels)) { this.labels = labels; } else { - this.labels = labels ? [ labels ] : [ new DropDownLabel("") ]; + this.labels = labels ? [labels] : [new DropDownLabel("")]; } this.currentLabelIndex = 0; const currentLabel = this.labels[this.currentLabelIndex]; this.state = currentLabel.state; - this.text = addTextObject(scene, 0, 0, currentLabel.text || "", TextStyle.TOOLTIP_CONTENT); + this.text = addTextObject(0, 0, currentLabel.text || "", TextStyle.TOOLTIP_CONTENT); this.text.setOrigin(0, 0.5); this.add(this.text); @@ -96,12 +101,12 @@ export class DropDownOption extends Phaser.GameObjects.Container { */ setupToggleIcon(type: DropDownType, visible: boolean): void { if (type === DropDownType.SINGLE) { - this.toggle = this.scene.add.sprite(0, 0, "cursor"); + this.toggle = globalScene.add.sprite(0, 0, "cursor"); this.toggle.setScale(0.5); this.toggle.setOrigin(0, 0.5); - this.toggle.setRotation(Math.PI / 180 * -90); + this.toggle.setRotation((Math.PI / 180) * -90); } else { - this.toggle = this.scene.add.sprite(0, 0, "candy"); + this.toggle = globalScene.add.sprite(0, 0, "candy"); this.toggle.setScale(0.3); this.toggle.setOrigin(0, 0.5); } @@ -127,6 +132,12 @@ export class DropDownOption extends Phaser.GameObjects.Container { case DropDownState.UNLOCKABLE: this.toggle.setTint(this.unlockableColor); break; + case DropDownState.ONE: + this.toggle.setTint(this.oneColor); + break; + case DropDownState.TWO: + this.toggle.setTint(this.twoColor); + break; } } @@ -267,45 +278,80 @@ export class DropDownOption extends Phaser.GameObjects.Container { this.text.setText(currentText); return w; } - } - export class DropDown extends Phaser.GameObjects.Container { public options: DropDownOption[]; private window: Phaser.GameObjects.NineSlice; private cursorObj: Phaser.GameObjects.Image; public dropDownType: DropDownType = DropDownType.MULTI; - public cursor: number = 0; - private lastCursor: number = -1; - public defaultCursor: number = 0; + public cursor = 0; + private lastCursor = -1; + public defaultCursor = 0; private onChange: () => void; private lastDir: SortDirection = SortDirection.ASC; private defaultSettings: any[]; + private dropDownScrollBar: ScrollBar; + private totalOptions = 0; + private maxOptions = 0; + private shownOptions = 0; + private tooManyOptions = false; + private firstShown = 0; + private optionHeight = 0; + private optionSpacing = 0; + private optionPaddingX = 4; + private optionPaddingY = 6; + private optionWidth = 100; + private cursorOffset = 0; - constructor(scene: BattleScene, x: number, y: number, options: DropDownOption[], onChange: () => void, type: DropDownType = DropDownType.MULTI, optionSpacing: number = 2) { + constructor( + x: number, + y: number, + options: DropDownOption[], + onChange: () => void, + type: DropDownType = DropDownType.MULTI, + optionSpacing = 2, + ) { const windowPadding = 5; - const optionHeight = 7; - const optionPaddingX = 4; - const optionPaddingY = 6; const cursorOffset = 7; - const optionWidth = 100; - super(scene, x - cursorOffset - windowPadding, y); + super(globalScene, x - cursorOffset - windowPadding, y); + + this.optionWidth = 100; + this.optionHeight = 7; + this.optionSpacing = optionSpacing; + this.optionPaddingX = 4; + this.optionPaddingY = 6; + this.cursorOffset = cursorOffset; + this.options = options; this.dropDownType = type; this.onChange = onChange; - this.cursorObj = scene.add.image(optionPaddingX + 3, 0, "cursor"); + this.cursorObj = globalScene.add.image(this.optionPaddingX + 3, 0, "cursor"); this.cursorObj.setScale(0.5); this.cursorObj.setOrigin(0, 0.5); this.cursorObj.setVisible(false); // For MULTI and HYBRID filter, add an ALL option at the top if (this.dropDownType === DropDownType.MULTI || this.dropDownType === DropDownType.HYBRID) { - this.options.unshift(new DropDownOption(scene, "ALL", new DropDownLabel(i18next.t("filterBar:all"), undefined, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF))); + this.options.unshift( + new DropDownOption( + "ALL", + new DropDownLabel( + i18next.t("filterBar:all"), + undefined, + this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF, + ), + ), + ); } + this.maxOptions = 19; + this.totalOptions = this.options.length; + this.tooManyOptions = this.totalOptions > this.maxOptions; + this.shownOptions = this.tooManyOptions ? this.maxOptions : this.totalOptions; + this.defaultSettings = this.getSettings(); // Place ui elements in the correct spot @@ -313,24 +359,48 @@ export class DropDown extends Phaser.GameObjects.Container { const toggleVisibility = type !== DropDownType.SINGLE || option.state === DropDownState.ON; option.setupToggleIcon(type, toggleVisibility); - option.width = optionWidth; - option.y = index * optionHeight + index * optionSpacing + optionPaddingY; + option.width = this.optionWidth; + option.y = index * this.optionHeight + index * optionSpacing + this.optionPaddingY; - const baseX = cursorOffset + optionPaddingX + 3; - const baseY = optionHeight / 2; + const baseX = cursorOffset + this.optionPaddingX + 3; + const baseY = this.optionHeight / 2; option.setLabelPosition(baseX + 8, baseY); if (type === DropDownType.SINGLE) { option.setTogglePosition(baseX + 3, baseY + 1); } else { option.setTogglePosition(baseX, baseY); } + + if (index >= this.shownOptions) { + option.visible = false; + } + + this.firstShown = 0; }); - this.window = addWindow(scene, 0, 0, optionWidth, options[options.length - 1].y + optionHeight + optionPaddingY, false, false, undefined, undefined, WindowVariant.XTHIN); + this.window = addWindow( + 0, + 0, + this.optionWidth, + options[this.shownOptions - 1].y + this.optionHeight + this.optionPaddingY, + false, + false, + undefined, + undefined, + WindowVariant.XTHIN, + ); this.add(this.window); this.add(options); this.add(this.cursorObj); this.setVisible(false); + + if (this.tooManyOptions) { + // Setting the last parameter to 1 turns out to be optimal in all cases. + this.dropDownScrollBar = new ScrollBar(this.window.width - 3, 5, 5, this.window.height - 10, 1); + this.add(this.dropDownScrollBar); + this.dropDownScrollBar.setTotalRows(this.totalOptions); + this.dropDownScrollBar.setScrollCursor(0); + } } getWidth(): number { @@ -359,29 +429,66 @@ export class DropDown extends Phaser.GameObjects.Container { return this.setCursor(this.defaultCursor); } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { + if (this.tooManyOptions) { + this.setLabels(cursor); + } + this.cursor = cursor; if (cursor < 0) { cursor = 0; this.cursorObj.setVisible(false); return false; - } else if (cursor >= this.options.length) { + } + if (cursor >= this.options.length) { cursor = this.options.length - 1; this.cursorObj.y = this.options[cursor].y + 3.5; this.cursorObj.setVisible(true); return false; - } else { - this.cursorObj.y = this.options[cursor].y + 3.5; - this.cursorObj.setVisible(true); - // If hydrid type, we need to update the filters when going up/down in the list - if (this.dropDownType === DropDownType.HYBRID) { - this.lastCursor = cursor; - this.onChange(); - } + } + this.cursorObj.y = this.options[cursor].y + 3.5; + this.cursorObj.setVisible(true); + // If hydrid type, we need to update the filters when going up/down in the list + if (this.dropDownType === DropDownType.HYBRID) { + this.lastCursor = cursor; + this.onChange(); } return true; } + setLabels(cursor: number) { + if (cursor === 0 && this.lastCursor === this.totalOptions - 1) { + this.firstShown = 0; + } else if (cursor === this.totalOptions - 1 && this.lastCursor === 0) { + this.firstShown = this.totalOptions - this.shownOptions; + } else if (cursor - this.firstShown >= this.shownOptions && cursor > this.lastCursor) { + this.firstShown += 1; + } else if (cursor < this.firstShown && cursor < this.lastCursor) { + this.firstShown -= 1; + } + + this.options.forEach((option, index) => { + option.y = (index - this.firstShown) * (this.optionHeight + this.optionSpacing) + this.optionPaddingY; + + const baseX = this.cursorOffset + this.optionPaddingX + 3; + const baseY = this.optionHeight / 2; + option.setLabelPosition(baseX + 8, baseY); + if (this.dropDownType === DropDownType.SINGLE) { + option.setTogglePosition(baseX + 3, baseY + 1); + } else { + option.setTogglePosition(baseX, baseY); + } + + if (index < this.firstShown || index >= this.firstShown + this.shownOptions) { + option.visible = false; + } else { + option.visible = true; + } + }); + + this.dropDownScrollBar.setScrollCursor(cursor); + } + /** * Switch the option at the provided index to its next state and update visuals * Update accordingly the other options if needed: @@ -406,7 +513,7 @@ export class DropDown extends Phaser.GameObjects.Container { } } else if (this.dropDownType === DropDownType.SINGLE) { if (option.state === DropDownState.OFF) { - this.options.forEach((option) => { + this.options.forEach(option => { option.setOptionState(DropDownState.OFF); option.setDirection(SortDirection.ASC); option.toggle.setVisible(false); @@ -449,9 +556,12 @@ export class DropDown extends Phaser.GameObjects.Container { */ getVals(): any[] { if (this.dropDownType === DropDownType.MULTI) { - return this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map((option) => option.val); - } else if (this.dropDownType === DropDownType.HYBRID) { - const selected = this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map((option) => option.val); + return this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map(option => option.val); + } + if (this.dropDownType === DropDownType.HYBRID) { + const selected = this.options + .filter((option, i) => i > 0 && option.state === DropDownState.ON) + .map(option => option.val); if (selected.length > 0) { return selected; } @@ -460,16 +570,18 @@ export class DropDown extends Phaser.GameObjects.Container { return this.options.filter((_, i) => i > 0).map(option => option.val); } // if nothing is selected and a single option is hovered, return that one - return [ this.options[this.cursor].val ]; - } else if (this.dropDownType === DropDownType.RADIAL) { - return this.options.map((option) => { + return [this.options[this.cursor].val]; + } + if (this.dropDownType === DropDownType.RADIAL) { + return this.options.map(option => { return { val: option.val, state: option.state }; }); - } else { - return this.options.filter(option => option.state === DropDownState.ON).map((option) => { + } + return this.options + .filter(option => option.state === DropDownState.ON) + .map(option => { return { val: option.val, dir: option.dir }; }); - } } /** @@ -478,9 +590,14 @@ export class DropDown extends Phaser.GameObjects.Container { * - the settings dictionary is like this { val: any, state: DropDownState, cursor: boolean, dir: SortDirection } */ private getSettings(): any[] { - const settings : any[] = []; + const settings: any[] = []; for (let i = 0; i < this.options.length; i++) { - settings.push({ val: this.options[i].val, state: this.options[i].state, cursor: (this.cursor === i), dir: this.options[i].dir }); + settings.push({ + val: this.options[i].val, + state: this.options[i].state, + cursor: this.cursor === i, + dir: this.options[i].dir, + }); } return settings; } @@ -493,22 +610,22 @@ export class DropDown extends Phaser.GameObjects.Container { const currentValues = this.getSettings(); const compareValues = (keys: string[]): boolean => { - return currentValues.length === this.defaultSettings.length && - currentValues.every((value, index) => - keys.every(key => value[key] === this.defaultSettings[index][key]) - ); + return ( + currentValues.length === this.defaultSettings.length && + currentValues.every((value, index) => keys.every(key => value[key] === this.defaultSettings[index][key])) + ); }; switch (this.dropDownType) { case DropDownType.MULTI: case DropDownType.RADIAL: - return compareValues([ "val", "state" ]); + return compareValues(["val", "state"]); case DropDownType.HYBRID: - return compareValues([ "val", "state", "cursor" ]); + return compareValues(["val", "state", "cursor"]); case DropDownType.SINGLE: - return compareValues([ "val", "state", "dir" ]); + return compareValues(["val", "state", "dir"]); default: return false; @@ -541,6 +658,8 @@ export class DropDown extends Phaser.GameObjects.Container { } } } + + this.onChange(); } } @@ -548,7 +667,7 @@ export class DropDown extends Phaser.GameObjects.Container { * Set all options to a specific state * @param state the DropDownState to assign to each option */ - private setAllOptions(state: DropDownState) : void { + private setAllOptions(state: DropDownState): void { // For single type dropdown, setting all options is not relevant if (this.dropDownType === DropDownType.SINGLE) { return; @@ -586,11 +705,15 @@ export class DropDown extends Phaser.GameObjects.Container { x = this.options[i].getCurrentLabelX() ?? 0; } } - this.window.width = maxWidth + x - this.window.x + 6; + this.window.width = maxWidth + x - this.window.x + 9; + + if (this.tooManyOptions) { + this.window.width += 6; + this.dropDownScrollBar.x = this.window.width - 9; + } if (this.x + this.window.width > this.parentContainer.width) { this.x = this.parentContainer.width - this.window.width; } } - } diff --git a/src/ui/egg-counter-container.ts b/src/ui/egg-counter-container.ts index 21cebf5d97e..7bec7c97480 100644 --- a/src/ui/egg-counter-container.ts +++ b/src/ui/egg-counter-container.ts @@ -1,12 +1,13 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { addWindow } from "./ui-theme"; import { addTextObject, TextStyle } from "./text"; -import { EggCountChangedEvent, EggEventType } from "#app/events/egg"; -import EggHatchSceneHandler from "./egg-hatch-scene-handler"; +import type { EggCountChangedEvent } from "#app/events/egg"; +import { EggEventType } from "#app/events/egg"; +import type EggHatchSceneHandler from "./egg-hatch-scene-handler"; /** * A container that displays the count of hatching eggs. - * Extends Phaser.GameObjects.Container. + * @extends Phaser.GameObjects.Container */ export default class EggCounterContainer extends Phaser.GameObjects.Container { private readonly WINDOW_DEFAULT_WIDTH = 37; @@ -14,21 +15,18 @@ export default class EggCounterContainer extends Phaser.GameObjects.Container { private readonly WINDOW_HEIGHT = 26; private readonly onEggCountChangedEvent = (event: Event) => this.onEggCountChanged(event); - private battleScene: BattleScene; - private eggCount: integer; + private eggCount: number; private eggCountWindow: Phaser.GameObjects.NineSlice; public eggCountText: Phaser.GameObjects.Text; /** - * @param {BattleScene} scene - The scene to which this container belongs. - * @param {number} eggCount - The number of eggs to hatch. + * @param eggCount - The number of eggs to hatch. */ - constructor(scene: BattleScene, eggCount: integer) { - super(scene, 0, 0); + constructor(eggCount: number) { + super(globalScene, 0, 0); this.eggCount = eggCount; - this.battleScene = scene; - const uiHandler = this.battleScene.ui.getHandler() as EggHatchSceneHandler; + const uiHandler = globalScene.ui.getHandler() as EggHatchSceneHandler; uiHandler.eventTarget.addEventListener(EggEventType.EGG_COUNT_CHANGED, this.onEggCountChangedEvent); this.setup(); @@ -40,15 +38,15 @@ export default class EggCounterContainer extends Phaser.GameObjects.Container { private setup(): void { const windowWidth = this.eggCount > 9 ? this.WINDOW_MEDIUM_WIDTH : this.WINDOW_DEFAULT_WIDTH; - this.eggCountWindow = addWindow(this.battleScene, 5, 5, windowWidth, this.WINDOW_HEIGHT); + this.eggCountWindow = addWindow(5, 5, windowWidth, this.WINDOW_HEIGHT); this.setVisible(this.eggCount > 1); this.add(this.eggCountWindow); - const eggSprite = this.battleScene.add.sprite(19, 18, "egg", "egg_0"); + const eggSprite = globalScene.add.sprite(19, 18, "egg", "egg_0"); eggSprite.setScale(0.32); - this.eggCountText = addTextObject(this.battleScene, 28, 13, `${this.eggCount}`, TextStyle.MESSAGE, { fontSize: "66px" }); + this.eggCountText = addTextObject(28, 13, `${this.eggCount}`, TextStyle.MESSAGE, { fontSize: "66px" }); this.eggCountText.setName("text-egg-count"); this.add(eggSprite); @@ -66,7 +64,6 @@ export default class EggCounterContainer extends Phaser.GameObjects.Container { * Handles window size, the egg count to show, and whether it should be displayed. * * @param event {@linkcode Event} being sent - * @returns void */ private onEggCountChanged(event: Event): void { const eggCountChangedEvent = event as EggCountChangedEvent; diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 8f977ba2ac0..cb6a474f01d 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -1,9 +1,9 @@ -import BattleScene from "../battle-scene"; import { Mode } from "./ui"; import { TextStyle, addTextObject, getEggTierTextTint, getTextStyleOptions } from "./text"; import MessageUiHandler from "./message-ui-handler"; import * as Utils from "../utils"; -import { Egg, getLegendaryGachaSpeciesForTimestamp, IEggOptions } from "../data/egg"; +import type { IEggOptions } from "../data/egg"; +import { Egg, getLegendaryGachaSpeciesForTimestamp } from "../data/egg"; import { VoucherType, getVoucherTypeIcon } from "../system/voucher"; import { getPokemonSpecies } from "../data/pokemon-species"; import { addWindow } from "./ui-theme"; @@ -13,6 +13,7 @@ import Overrides from "#app/overrides"; import { GachaType } from "#app/enums/gacha-types"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; +import { globalScene } from "#app/global-scene"; export default class EggGachaUiHandler extends MessageUiHandler { private eggGachaContainer: Phaser.GameObjects.Container; @@ -29,7 +30,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { private voucherCountLabels: Phaser.GameObjects.Text[]; - private gachaCursor: integer; + private gachaCursor: number; private cursorObj: Phaser.GameObjects.Image; private transitioning: boolean; @@ -37,10 +38,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { private summaryFinished: boolean; private defaultText: string; - private scale: number = 0.1666666667; + private scale = 0.1666666667; - constructor(scene: BattleScene) { - super(scene, Mode.EGG_GACHA); + constructor() { + super(Mode.EGG_GACHA); this.gachaContainers = []; this.gachaKnobs = []; @@ -53,52 +54,52 @@ export default class EggGachaUiHandler extends MessageUiHandler { setup() { this.gachaCursor = 0; - this.scale = getTextStyleOptions(TextStyle.WINDOW, this.scene.uiTheme).scale; + this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; const ui = this.getUi(); - this.eggGachaContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); + this.eggGachaContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); this.eggGachaContainer.setVisible(false); ui.add(this.eggGachaContainer); - const bg = this.scene.add.nineslice(0, 0, "default_bg", undefined, 320, 180, 0, 0, 16, 0); + const bg = globalScene.add.nineslice(0, 0, "default_bg", undefined, 320, 180, 0, 0, 16, 0); bg.setOrigin(0, 0); this.eggGachaContainer.add(bg); - const hatchFrameNames = this.scene.anims.generateFrameNames("gacha_hatch", { suffix: ".png", start: 1, end: 4 }); - if (!(this.scene.anims.exists("open"))) { - this.scene.anims.create({ + const hatchFrameNames = globalScene.anims.generateFrameNames("gacha_hatch", { suffix: ".png", start: 1, end: 4 }); + if (!globalScene.anims.exists("open")) { + globalScene.anims.create({ key: "open", frames: hatchFrameNames, - frameRate: 12 + frameRate: 12, }); } - if (!(this.scene.anims.exists("close"))) { - this.scene.anims.create({ + if (!globalScene.anims.exists("close")) { + globalScene.anims.create({ key: "close", frames: hatchFrameNames.reverse(), - frameRate: 12 + frameRate: 12, }); } Utils.getEnumValues(GachaType).forEach((gachaType, g) => { const gachaTypeKey = GachaType[gachaType].toString().toLowerCase(); - const gachaContainer = this.scene.add.container(180 * g, 18); + const gachaContainer = globalScene.add.container(180 * g, 18); - const gacha = this.scene.add.sprite(0, 0, `gacha_${gachaTypeKey}`); + const gacha = globalScene.add.sprite(0, 0, `gacha_${gachaTypeKey}`); gacha.setOrigin(0, 0); - const gachaUnderlay = this.scene.add.sprite(115, 80, `gacha_underlay_${gachaTypeKey}`); + const gachaUnderlay = globalScene.add.sprite(115, 80, `gacha_underlay_${gachaTypeKey}`); gachaUnderlay.setOrigin(0, 0); - const gachaEggs = this.scene.add.sprite(0, 0, "gacha_eggs"); + const gachaEggs = globalScene.add.sprite(0, 0, "gacha_eggs"); gachaEggs.setOrigin(0, 0); - const gachaGlass = this.scene.add.sprite(0, 0, "gacha_glass"); + const gachaGlass = globalScene.add.sprite(0, 0, "gacha_glass"); gachaGlass.setOrigin(0, 0); - const gachaInfoContainer = this.scene.add.container(160, 46); + const gachaInfoContainer = globalScene.add.container(160, 46); const currentLanguage = i18next.resolvedLanguage ?? "en"; let gachaTextStyle = TextStyle.WINDOW_ALT; @@ -107,7 +108,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { let pokemonIconX = -20; let pokemonIconY = 6; - if ([ "de", "es", "fr", "ko", "pt-BR" ].includes(currentLanguage)) { + if (["de", "es-ES", "fr", "ko", "pt-BR"].includes(currentLanguage)) { gachaTextStyle = TextStyle.SMALLER_WINDOW_ALT; gachaX = 2; gachaY = 2; @@ -115,32 +116,32 @@ export default class EggGachaUiHandler extends MessageUiHandler { let legendaryLabelX = gachaX; let legendaryLabelY = gachaY; - if ([ "de", "es" ].includes(currentLanguage)) { + if (["de", "es-ES"].includes(currentLanguage)) { pokemonIconX = -25; pokemonIconY = 10; legendaryLabelX = -6; legendaryLabelY = 0; } - const gachaUpLabel = addTextObject(this.scene, gachaX, gachaY, i18next.t("egg:legendaryUPGacha"), gachaTextStyle); + const gachaUpLabel = addTextObject(gachaX, gachaY, i18next.t("egg:legendaryUPGacha"), gachaTextStyle); gachaUpLabel.setOrigin(0, 0); gachaInfoContainer.add(gachaUpLabel); switch (gachaType as GachaType) { case GachaType.LEGENDARY: - if ([ "de", "es" ].includes(currentLanguage)) { + if (["de", "es-ES"].includes(currentLanguage)) { gachaUpLabel.setAlign("center"); gachaUpLabel.setY(0); } - if ([ "pt-BR" ].includes(currentLanguage)) { + if (["pt-BR"].includes(currentLanguage)) { gachaUpLabel.setX(legendaryLabelX - 2); } else { gachaUpLabel.setX(legendaryLabelX); } gachaUpLabel.setY(legendaryLabelY); - const pokemonIcon = this.scene.add.sprite(pokemonIconX, pokemonIconY, "pokemon_icons_0"); - if ([ "pt-BR" ].includes(currentLanguage)) { + const pokemonIcon = globalScene.add.sprite(pokemonIconX, pokemonIconY, "pokemon_icons_0"); + if (["pt-BR"].includes(currentLanguage)) { pokemonIcon.setX(pokemonIconX - 2); } pokemonIcon.setScale(0.5); @@ -149,7 +150,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { gachaInfoContainer.add(pokemonIcon); break; case GachaType.MOVE: - if ([ "de", "es", "fr", "pt-BR" ].includes(currentLanguage)) { + if (["de", "es-ES", "fr", "pt-BR"].includes(currentLanguage)) { gachaUpLabel.setAlign("center"); gachaUpLabel.setY(0); } @@ -159,7 +160,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { gachaUpLabel.setOrigin(0.5, 0); break; case GachaType.SHINY: - if ([ "de", "fr", "ko" ].includes(currentLanguage)) { + if (["de", "fr", "ko"].includes(currentLanguage)) { gachaUpLabel.setAlign("center"); gachaUpLabel.setY(0); } @@ -170,9 +171,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { break; } - const gachaKnob = this.scene.add.sprite(191, 89, "gacha_knob"); + const gachaKnob = globalScene.add.sprite(191, 89, "gacha_knob"); - const gachaHatch = this.scene.add.sprite(115, 73, "gacha_hatch"); + const gachaHatch = globalScene.add.sprite(115, 73, "gacha_hatch"); gachaHatch.setOrigin(0, 0); gachaContainer.add(gachaEggs); @@ -186,7 +187,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { gachaGlass.setAlpha(0.5); gachaHatch.setAlpha(0.9); - gachaHatch.on("animationupdate", (_anim, frame) => gachaUnderlay.setFrame(frame.textureFrame === "4.png" ? "open_hatch" : "default")); + gachaHatch.on("animationupdate", (_anim, frame) => + gachaUnderlay.setFrame(frame.textureFrame === "4.png" ? "open_hatch" : "default"), + ); this.gachaContainers.push(gachaContainer); this.gachaKnobs.push(gachaKnob); @@ -198,45 +201,60 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.updateGachaInfo(g); }); - this.eggGachaOptionsContainer = this.scene.add.container(); + this.eggGachaOptionsContainer = globalScene.add.container(); - this.eggGachaOptionsContainer = this.scene.add.container((this.scene.game.canvas.width / 6), 148); + this.eggGachaOptionsContainer = globalScene.add.container(globalScene.game.canvas.width / 6, 148); this.eggGachaContainer.add(this.eggGachaOptionsContainer); - - this.eggGachaOptionSelectBg = addWindow(this.scene, 0, 0, 96, 16 + 576 * this.scale); + this.eggGachaOptionSelectBg = addWindow(0, 0, 96, 16 + 576 * this.scale); this.eggGachaOptionSelectBg.setOrigin(1, 1); this.eggGachaOptionsContainer.add(this.eggGachaOptionSelectBg); const multiplierOne = "x1"; const multiplierTen = "x10"; const pullOptions = [ - { multiplier: multiplierOne, description: `1 ${i18next.t("egg:pull")}`, icon: getVoucherTypeIcon(VoucherType.REGULAR) }, - { multiplier: multiplierTen, description: `10 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.REGULAR) }, - { multiplier: multiplierOne, description: `5 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.PLUS) }, - { multiplier: multiplierOne, description: `10 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.PREMIUM) }, - { multiplier: multiplierOne, description: `25 ${i18next.t("egg:pulls")}`, icon: getVoucherTypeIcon(VoucherType.GOLDEN) } + { + multiplier: multiplierOne, + description: `1 ${i18next.t("egg:pull")}`, + icon: getVoucherTypeIcon(VoucherType.REGULAR), + }, + { + multiplier: multiplierTen, + description: `10 ${i18next.t("egg:pulls")}`, + icon: getVoucherTypeIcon(VoucherType.REGULAR), + }, + { + multiplier: multiplierOne, + description: `5 ${i18next.t("egg:pulls")}`, + icon: getVoucherTypeIcon(VoucherType.PLUS), + }, + { + multiplier: multiplierOne, + description: `10 ${i18next.t("egg:pulls")}`, + icon: getVoucherTypeIcon(VoucherType.PREMIUM), + }, + { + multiplier: multiplierOne, + description: `25 ${i18next.t("egg:pulls")}`, + icon: getVoucherTypeIcon(VoucherType.GOLDEN), + }, ]; const resolvedLanguage = i18next.resolvedLanguage ?? "en"; - const pullOptionsText = pullOptions.map(option =>{ - const desc = option.description.split(" "); - if (desc[0].length < 2) { - desc[0] += [ "zh", "ko" ].includes(resolvedLanguage.substring(0, 2)) ? " " : " "; - } - if (option.multiplier === multiplierOne) { - desc[0] = " " + desc[0]; - } - return ` ${option.multiplier.padEnd(5)}${desc.join(" ")}`; - }).join("\n"); + const pullOptionsText = pullOptions + .map(option => { + const desc = option.description.split(" "); + if (desc[0].length < 2) { + desc[0] += ["zh", "ko"].includes(resolvedLanguage.substring(0, 2)) ? " " : " "; + } + if (option.multiplier === multiplierOne) { + desc[0] = " " + desc[0]; + } + return ` ${option.multiplier.padEnd(5)}${desc.join(" ")}`; + }) + .join("\n"); - const optionText = addTextObject( - this.scene, - 0, - 0, - `${pullOptionsText}\n${i18next.t("menu:cancel")}`, - TextStyle.WINDOW, - ); + const optionText = addTextObject(0, 0, `${pullOptionsText}\n${i18next.t("menu:cancel")}`, TextStyle.WINDOW); optionText.setLineSpacing(28); optionText.setFontSize("80px"); @@ -246,7 +264,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { optionText.setPositionRelative(this.eggGachaOptionSelectBg, 16, 9); pullOptions.forEach((option, i) => { - const icon = this.scene.add.sprite(0, 0, "items", option.icon); + const icon = globalScene.add.sprite(0, 0, "items", option.icon); icon.setScale(3 * this.scale); icon.setPositionRelative(this.eggGachaOptionSelectBg, 20, 9 + (48 + i * 96) * this.scale); this.eggGachaOptionsContainer.add(icon); @@ -255,13 +273,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.add(this.eggGachaOptionsContainer); new Array(Utils.getEnumKeys(VoucherType).length).fill(null).map((_, i) => { - const container = this.scene.add.container((this.scene.game.canvas.width / 6) - 56 * i, 0); + const container = globalScene.add.container(globalScene.game.canvas.width / 6 - 56 * i, 0); - const bg = addWindow(this.scene, 0, 0, 56, 22); + const bg = addWindow(0, 0, 56, 22); bg.setOrigin(1, 0); container.add(bg); - const countLabel = addTextObject(this.scene, -48, 3, "0", TextStyle.WINDOW); + const countLabel = addTextObject(-48, 3, "0", TextStyle.WINDOW); countLabel.setOrigin(0, 0); container.add(countLabel); @@ -269,7 +287,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { const iconImage = getVoucherTypeIcon(i as VoucherType); - const icon = this.scene.add.sprite(-19, 2, "items", iconImage); + const icon = globalScene.add.sprite(-19, 2, "items", iconImage); icon.setOrigin(0, 0); icon.setScale(0.5); container.add(icon); @@ -277,25 +295,27 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.add(container); }); - this.eggGachaOverlay = this.scene.add.rectangle(0, 0, bg.displayWidth, bg.displayHeight, 0x000000); + this.eggGachaOverlay = globalScene.add.rectangle(0, 0, bg.displayWidth, bg.displayHeight, 0x000000); this.eggGachaOverlay.setOrigin(0, 0); this.eggGachaOverlay.setAlpha(0); this.eggGachaContainer.add(this.eggGachaOverlay); - this.eggGachaSummaryContainer = this.scene.add.container(0, 0); + this.eggGachaSummaryContainer = globalScene.add.container(0, 0); this.eggGachaSummaryContainer.setVisible(false); this.eggGachaContainer.add(this.eggGachaSummaryContainer); - const gachaMessageBoxContainer = this.scene.add.container(0, 148); + const gachaMessageBoxContainer = globalScene.add.container(0, 148); - const gachaMessageBox = addWindow(this.scene, 0, 0, 320, 32); + const gachaMessageBox = addWindow(0, 0, 320, 32); gachaMessageBox.setOrigin(0, 0); gachaMessageBoxContainer.add(gachaMessageBox); this.eggGachaMessageBox = gachaMessageBox; - const gachaMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + const gachaMessageText = addTextObject(8, 8, "", TextStyle.WINDOW, { + maxLines: 2, + }); gachaMessageText.setOrigin(0, 0); gachaMessageBoxContainer.add(gachaMessageText); @@ -326,19 +346,19 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.setVisible(true); - handleTutorial(this.scene, Tutorial.Egg_Gacha); + handleTutorial(Tutorial.Egg_Gacha); return true; } - getDelayValue(delay: integer) { + getDelayValue(delay: number) { if (this.transitioning && this.transitionCancelled) { delay = Math.ceil(delay / 5); } return Utils.fixedInt(delay); } - pull(pullCount: integer = 0, count: integer = 0, eggs?: Egg[]): void { + pull(pullCount = 0, count = 0, eggs?: Egg[]): void { if (Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE && !count) { pullCount = Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE; } @@ -351,41 +371,41 @@ export default class EggGachaUiHandler extends MessageUiHandler { return this.showSummary(eggs!); } - const egg = this.scene.add.sprite(127, 75, "egg", `egg_${eggs![count].getKey()}`); + const egg = globalScene.add.sprite(127, 75, "egg", `egg_${eggs![count].getKey()}`); egg.setScale(0.5); this.gachaContainers[this.gachaCursor].add(egg); this.gachaContainers[this.gachaCursor].moveTo(egg, 2); const doPullAnim = () => { - this.scene.playSound("se/gacha_running", { loop: true }); - this.scene.time.delayedCall(this.getDelayValue(count ? 500 : 1250), () => { - this.scene.playSound("se/gacha_dispense"); - this.scene.time.delayedCall(this.getDelayValue(750), () => { - this.scene.sound.stopByKey("se/gacha_running"); - this.scene.tweens.add({ + globalScene.playSound("se/gacha_running", { loop: true }); + globalScene.time.delayedCall(this.getDelayValue(count ? 500 : 1250), () => { + globalScene.playSound("se/gacha_dispense"); + globalScene.time.delayedCall(this.getDelayValue(750), () => { + globalScene.sound.stopByKey("se/gacha_running"); + globalScene.tweens.add({ targets: egg, duration: this.getDelayValue(350), y: 95, ease: "Bounce.easeOut", onComplete: () => { - this.scene.time.delayedCall(this.getDelayValue(125), () => { - this.scene.playSound("se/pb_catch"); + globalScene.time.delayedCall(this.getDelayValue(125), () => { + globalScene.playSound("se/pb_catch"); this.gachaHatches[this.gachaCursor].play("open"); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: egg, duration: this.getDelayValue(350), scale: 0.75, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: egg, y: 110, duration: this.getDelayValue(350), ease: "Back.easeOut", onComplete: () => { this.gachaHatches[this.gachaCursor].play("close"); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: egg, y: 200, duration: this.getDelayValue(350), @@ -396,33 +416,33 @@ export default class EggGachaUiHandler extends MessageUiHandler { } else { this.showSummary(eggs!); } - } + }, }); - } + }, }); }); - } + }, }); }); }); }; if (!count) { - this.scene.playSound("se/gacha_dial"); - this.scene.tweens.add({ + globalScene.playSound("se/gacha_dial"); + globalScene.tweens.add({ targets: this.gachaKnobs[this.gachaCursor], duration: this.getDelayValue(350), angle: 90, ease: "Cubic.easeInOut", onComplete: () => { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.gachaKnobs[this.gachaCursor], duration: this.getDelayValue(350), angle: 0, - ease: "Sine.easeInOut" + ease: "Sine.easeInOut", }); - this.scene.time.delayedCall(this.getDelayValue(350), doPullAnim); - } + globalScene.time.delayedCall(this.getDelayValue(350), doPullAnim); + }, }); } else { doPullAnim(); @@ -438,7 +458,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { if (!eggs) { eggs = []; for (let i = 1; i <= pullCount; i++) { - const eggOptions: IEggOptions = { scene: this.scene, pulled: true, sourceType: this.gachaCursor }; + const eggOptions: IEggOptions = { + pulled: true, + sourceType: this.gachaCursor, + }; // Before creating the last egg, check if the guaranteed egg tier was already generated // if not, override the egg tier @@ -455,10 +478,12 @@ export default class EggGachaUiHandler extends MessageUiHandler { // Shuffle the eggs in case the guaranteed one got added as last egg eggs = Utils.randSeedShuffle(eggs); - - (this.scene.currentBattle ? this.scene.gameData.saveAll(this.scene, true, true, true) : this.scene.gameData.saveSystem()).then(success => { + (globalScene.currentBattle + ? globalScene.gameData.saveAll(true, true, true) + : globalScene.gameData.saveSystem() + ).then(success => { if (!success) { - return this.scene.reset(true); + return globalScene.reset(true); } doPull(); }); @@ -490,7 +515,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { const eggScale = eggs.length < 20 ? 1 : 0.5; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.eggGachaOverlay, alpha: 0.5, ease: "Sine.easeOut", @@ -507,14 +532,17 @@ export default class EggGachaUiHandler extends MessageUiHandler { const row = Math.floor(t / rowItems); const sliceWidth = this.eggGachaOverlay.displayWidth / (cols + 2); const sliceHeight = height / (rows + 2); - const yOffset = (sliceHeight / 2 * (row / Math.max(rows - 1, 1))) + sliceHeight / 4; - const ret = this.scene.add.container(sliceWidth * (col + 1) + (sliceWidth * 0.5), sliceHeight * (row + 1) + yOffset); + const yOffset = (sliceHeight / 2) * (row / Math.max(rows - 1, 1)) + sliceHeight / 4; + const ret = globalScene.add.container( + sliceWidth * (col + 1) + sliceWidth * 0.5, + sliceHeight * (row + 1) + yOffset, + ); ret.setScale(0.0001); - const eggSprite = this.scene.add.sprite(0, 0, "egg", `egg_${egg.getKey()}`); + const eggSprite = globalScene.add.sprite(0, 0, "egg", `egg_${egg.getKey()}`); ret.add(eggSprite); - const eggText = addTextObject(this.scene, 0, 14, egg.getEggDescriptor(), TextStyle.PARTY, { align: "center" }); + const eggText = addTextObject(0, 14, egg.getEggDescriptor(), TextStyle.PARTY, { align: "center" }); eggText.setOrigin(0.5, 0); eggText.setTint(getEggTierTextTint(!egg.isManaphyEgg() ? egg.tier : EggTier.EPIC)); ret.add(eggText); @@ -527,8 +555,8 @@ export default class EggGachaUiHandler extends MessageUiHandler { // Otherwise show the eggs one by one with a small delay between each eggContainers.forEach((eggContainer, index) => { const delay = !this.transitionCancelled ? this.getDelayValue(index * 100) : 0; - this.scene.time.delayedCall(delay, () => - this.scene.tweens.add({ + globalScene.time.delayedCall(delay, () => + globalScene.tweens.add({ targets: eggContainer, duration: this.getDelayValue(350), scale: eggScale, @@ -538,18 +566,18 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.setTransitioning(false); this.summaryFinished = true; } - } - })); - + }, + }), + ); }); - } + }, }); } hideSummary() { this.setTransitioning(true); - this.scene.tweens.add({ - targets: [ this.eggGachaOverlay, this.eggGachaSummaryContainer ], + globalScene.tweens.add({ + targets: [this.eggGachaOverlay, this.eggGachaSummaryContainer], alpha: 0, duration: this.getDelayValue(250), ease: "Cubic.easeIn", @@ -560,7 +588,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.setTransitioning(false); this.summaryFinished = false; this.eggGachaOptionsContainer.setVisible(true); - } + }, }); } @@ -568,25 +596,35 @@ export default class EggGachaUiHandler extends MessageUiHandler { const infoContainer = this.gachaInfoContainers[gachaType]; switch (gachaType as GachaType) { case GachaType.LEGENDARY: - const species = getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(this.scene, new Date().getTime())); + const species = getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(new Date().getTime())); const pokemonIcon = infoContainer.getAt(1) as Phaser.GameObjects.Sprite; pokemonIcon.setTexture(species.getIconAtlasKey(), species.getIconId(false)); break; } } - consumeVouchers(voucherType: VoucherType, count: integer): void { - this.scene.gameData.voucherCounts[voucherType] = Math.max(this.scene.gameData.voucherCounts[voucherType] - count, 0); + consumeVouchers(voucherType: VoucherType, count: number): void { + globalScene.gameData.voucherCounts[voucherType] = Math.max( + globalScene.gameData.voucherCounts[voucherType] - count, + 0, + ); this.updateVoucherCounts(); } updateVoucherCounts(): void { this.voucherCountLabels.forEach((label, type) => { - label.setText(this.scene.gameData.voucherCounts[type].toString()); + label.setText(globalScene.gameData.voucherCounts[type].toString()); }); } - showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number): void { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ): void { if (!text) { text = this.defaultText; } @@ -630,7 +668,6 @@ export default class EggGachaUiHandler extends MessageUiHandler { return false; } } else { - if (this.eggGachaSummaryContainer.visible) { if (this.summaryFinished && (button === Button.ACTION || button === Button.CANCEL)) { this.hideSummary(); @@ -641,10 +678,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { case Button.ACTION: switch (this.cursor) { case 0: - if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + if ( + !globalScene.gameData.voucherCounts[VoucherType.REGULAR] && + !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE + ) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); - } else if (this.scene.gameData.eggs.length < 99 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + } else if (globalScene.gameData.eggs.length < 99 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { this.consumeVouchers(VoucherType.REGULAR, 1); } @@ -656,10 +696,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { } break; case 2: - if (!this.scene.gameData.voucherCounts[VoucherType.PLUS] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + if (!globalScene.gameData.voucherCounts[VoucherType.PLUS] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); - } else if (this.scene.gameData.eggs.length < 95 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + } else if (globalScene.gameData.eggs.length < 95 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { this.consumeVouchers(VoucherType.PLUS, 1); } @@ -672,11 +712,17 @@ export default class EggGachaUiHandler extends MessageUiHandler { break; case 1: case 3: - if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10 && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) - || (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE)) { + if ( + (this.cursor === 1 && + globalScene.gameData.voucherCounts[VoucherType.REGULAR] < 10 && + !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) || + (this.cursor === 3 && + !globalScene.gameData.voucherCounts[VoucherType.PREMIUM] && + !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) + ) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); - } else if (this.scene.gameData.eggs.length < 90 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + } else if (globalScene.gameData.eggs.length < 90 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { if (this.cursor === 3) { if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { this.consumeVouchers(VoucherType.PREMIUM, 1); @@ -694,10 +740,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { } break; case 4: - if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + if ( + !globalScene.gameData.voucherCounts[VoucherType.GOLDEN] && + !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE + ) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); - } else if (this.scene.gameData.eggs.length < 75 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + } else if (globalScene.gameData.eggs.length < 75 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { this.consumeVouchers(VoucherType.GOLDEN, 1); } @@ -751,11 +800,11 @@ export default class EggGachaUiHandler extends MessageUiHandler { return success || error; } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, "cursor"); + this.cursorObj = globalScene.add.image(0, 0, "cursor"); this.eggGachaOptionsContainer.add(this.cursorObj); } @@ -765,7 +814,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { return ret; } - setGachaCursor(cursor: integer): boolean { + setGachaCursor(cursor: number): boolean { const oldCursor = this.gachaCursor; const changed = oldCursor !== cursor; @@ -775,12 +824,12 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.setTransitioning(true); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.gachaContainers, duration: this.eggGachaContainer.visible ? 500 : 0, x: (_target, _key, _value, index) => 180 * (index - cursor), ease: "Cubic.easeInOut", - onComplete: () => this.setTransitioning(false) + onComplete: () => this.setTransitioning(false), }); } diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts index 1bf58a786e1..6ede68b7ae6 100644 --- a/src/ui/egg-hatch-scene-handler.ts +++ b/src/ui/egg-hatch-scene-handler.ts @@ -1,8 +1,8 @@ -import BattleScene from "../battle-scene"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { Button } from "#enums/buttons"; import { EggHatchPhase } from "#app/phases/egg-hatch-phase"; +import { globalScene } from "#app/global-scene"; export default class EggHatchSceneHandler extends UiHandler { public eggHatchContainer: Phaser.GameObjects.Container; @@ -15,20 +15,20 @@ export default class EggHatchSceneHandler extends UiHandler { */ public readonly eventTarget: EventTarget = new EventTarget(); - constructor(scene: BattleScene) { - super(scene, Mode.EGG_HATCH_SCENE); + constructor() { + super(Mode.EGG_HATCH_SCENE); } setup() { - this.eggHatchContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); - this.scene.fieldUI.add(this.eggHatchContainer); + this.eggHatchContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + globalScene.fieldUI.add(this.eggHatchContainer); - const eggLightraysAnimFrames = this.scene.anims.generateFrameNames("egg_lightrays", { start: 0, end: 3 }); - if (!(this.scene.anims.exists("egg_lightrays"))) { - this.scene.anims.create({ + const eggLightraysAnimFrames = globalScene.anims.generateFrameNames("egg_lightrays", { start: 0, end: 3 }); + if (!globalScene.anims.exists("egg_lightrays")) { + globalScene.anims.create({ key: "egg_lightrays", frames: eggLightraysAnimFrames, - frameRate: 32 + frameRate: 32, }); } } @@ -38,23 +38,23 @@ export default class EggHatchSceneHandler extends UiHandler { this.getUi().showText("", 0); - this.scene.setModifiersVisible(false); + globalScene.setModifiersVisible(false); return true; } processInput(button: Button): boolean { if (button === Button.ACTION || button === Button.CANCEL) { - const phase = this.scene.getCurrentPhase(); + const phase = globalScene.getCurrentPhase(); if (phase instanceof EggHatchPhase && phase.trySkip()) { return true; } } - return this.scene.ui.getMessageHandler().processInput(button); + return globalScene.ui.getMessageHandler().processInput(button); } - setCursor(_cursor: integer): boolean { + setCursor(_cursor: number): boolean { return false; } diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index 939f95fabe6..cf3326bec13 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -1,4 +1,3 @@ -import BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; import { TextStyle, addTextObject } from "#app/ui/text"; @@ -8,6 +7,7 @@ import { Button } from "#enums/buttons"; import i18next from "i18next"; import ScrollableGridUiHandler from "#app/ui/scrollable-grid-handler"; import { ScrollBar } from "#app/ui/scroll-bar"; +import { globalScene } from "#app/global-scene"; export default class EggListUiHandler extends MessageUiHandler { private readonly ROWS = 9; @@ -24,79 +24,85 @@ export default class EggListUiHandler extends MessageUiHandler { private eggListMessageBoxContainer: Phaser.GameObjects.Container; private cursorObj: Phaser.GameObjects.Image; - private scrollGridHandler : ScrollableGridUiHandler; + private scrollGridHandler: ScrollableGridUiHandler; private iconAnimHandler: PokemonIconAnimHandler; - constructor(scene: BattleScene) { - super(scene, Mode.EGG_LIST); + constructor() { + super(Mode.EGG_LIST); } setup() { const ui = this.getUi(); - this.eggListContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); + this.eggListContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); this.eggListContainer.setVisible(false); ui.add(this.eggListContainer); - const bgColor = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0x006860); + const bgColor = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0x006860, + ); bgColor.setOrigin(0, 0); this.eggListContainer.add(bgColor); - const eggListBg = this.scene.add.image(0, 0, "egg_list_bg"); + const eggListBg = globalScene.add.image(0, 0, "egg_list_bg"); eggListBg.setOrigin(0, 0); this.eggListContainer.add(eggListBg); - this.eggListContainer.add(addWindow(this.scene, 1, 85, 106, 22)); - this.eggListContainer.add(addWindow(this.scene, 1, 102, 106, 50, true)); - this.eggListContainer.add(addWindow(this.scene, 1, 147, 106, 32, true)); - this.eggListContainer.add(addWindow(this.scene, 107, 1, 212, 178)); + this.eggListContainer.add(addWindow(1, 85, 106, 22)); + this.eggListContainer.add(addWindow(1, 102, 106, 50, true)); + this.eggListContainer.add(addWindow(1, 147, 106, 32, true)); + this.eggListContainer.add(addWindow(107, 1, 212, 178)); this.iconAnimHandler = new PokemonIconAnimHandler(); - this.iconAnimHandler.setup(this.scene); + this.iconAnimHandler.setup(); - this.eggNameText = addTextObject(this.scene, 8, 68, "", TextStyle.SUMMARY); + this.eggNameText = addTextObject(8, 68, "", TextStyle.SUMMARY); this.eggNameText.setOrigin(0, 0); this.eggListContainer.add(this.eggNameText); - this.eggDateText = addTextObject(this.scene, 8, 91, "", TextStyle.TOOLTIP_CONTENT); + this.eggDateText = addTextObject(8, 91, "", TextStyle.TOOLTIP_CONTENT); this.eggListContainer.add(this.eggDateText); - this.eggHatchWavesText = addTextObject(this.scene, 8, 108, "", TextStyle.TOOLTIP_CONTENT); + this.eggHatchWavesText = addTextObject(8, 108, "", TextStyle.TOOLTIP_CONTENT); this.eggHatchWavesText.setWordWrapWidth(540); this.eggListContainer.add(this.eggHatchWavesText); - this.eggGachaInfoText = addTextObject(this.scene, 8, 152, "", TextStyle.TOOLTIP_CONTENT); + this.eggGachaInfoText = addTextObject(8, 152, "", TextStyle.TOOLTIP_CONTENT); this.eggGachaInfoText.setWordWrapWidth(540); this.eggListContainer.add(this.eggGachaInfoText); - this.eggListIconContainer = this.scene.add.container(113, 5); + this.eggListIconContainer = globalScene.add.container(113, 5); this.eggListContainer.add(this.eggListIconContainer); - this.cursorObj = this.scene.add.image(0, 0, "select_cursor"); + this.cursorObj = globalScene.add.image(0, 0, "select_cursor"); this.cursorObj.setOrigin(0, 0); this.eggListContainer.add(this.cursorObj); - this.eggSprite = this.scene.add.sprite(54, 37, "egg"); + this.eggSprite = globalScene.add.sprite(54, 37, "egg"); this.eggListContainer.add(this.eggSprite); - const scrollBar = new ScrollBar(this.scene, 310, 5, 4, 170, this.ROWS); + const scrollBar = new ScrollBar(310, 5, 4, 170, this.ROWS); this.eggListContainer.add(scrollBar); this.scrollGridHandler = new ScrollableGridUiHandler(this, this.ROWS, this.COLUMNS) .withScrollBar(scrollBar) .withUpdateGridCallBack(() => this.updateEggIcons()) - .withUpdateSingleElementCallback((i:number) => this.setEggDetails(i)); + .withUpdateSingleElementCallback((i: number) => this.setEggDetails(i)); - this.eggListMessageBoxContainer = this.scene.add.container(0, this.scene.game.canvas.height / 6); + this.eggListMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); this.eggListMessageBoxContainer.setVisible(false); this.eggListContainer.add(this.eggListMessageBoxContainer); - const eggListMessageBox = addWindow(this.scene, 1, -1, 318, 28); + const eggListMessageBox = addWindow(1, -1, 318, 28); eggListMessageBox.setOrigin(0, 1); this.eggListMessageBoxContainer.add(eggListMessageBox); - this.message = addTextObject(this.scene, 8, -8, "", TextStyle.WINDOW, { maxLines: 1 }); + this.message = addTextObject(8, -8, "", TextStyle.WINDOW, { maxLines: 1 }); this.message.setOrigin(0, 1); this.eggListMessageBoxContainer.add(this.message); @@ -112,7 +118,7 @@ export default class EggListUiHandler extends MessageUiHandler { this.eggListContainer.setVisible(true); - this.scrollGridHandler.setTotalElements(this.scene.gameData.eggs.length); + this.scrollGridHandler.setTotalElements(globalScene.gameData.eggs.length); this.updateEggIcons(); this.setCursor(0); @@ -125,10 +131,10 @@ export default class EggListUiHandler extends MessageUiHandler { */ private initEggIcons() { this.eggIcons = []; - for (let i = 0; i < Math.min(this.ROWS * this.COLUMNS, this.scene.gameData.eggs.length); i++) { + for (let i = 0; i < Math.min(this.ROWS * this.COLUMNS, globalScene.gameData.eggs.length); i++) { const x = (i % this.COLUMNS) * 18; const y = Math.floor(i / this.COLUMNS) * 18; - const icon = this.scene.add.sprite(x - 2, y + 2, "egg_icons"); + const icon = globalScene.add.sprite(x - 2, y + 2, "egg_icons"); icon.setScale(0.5); icon.setOrigin(0, 0); this.eggListIconContainer.add(icon); @@ -141,14 +147,14 @@ export default class EggListUiHandler extends MessageUiHandler { */ private updateEggIcons() { const indexOffset = this.scrollGridHandler.getItemOffset(); - const eggsToShow = Math.min(this.eggIcons.length, this.scene.gameData.eggs.length - indexOffset); + const eggsToShow = Math.min(this.eggIcons.length, globalScene.gameData.eggs.length - indexOffset); this.eggIcons.forEach((icon, i) => { if (i !== this.cursor) { this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE); } if (i < eggsToShow) { - const egg = this.scene.gameData.eggs[i + indexOffset]; + const egg = globalScene.gameData.eggs[i + indexOffset]; icon.setFrame(egg.getKey()); icon.setVisible(true); } else { @@ -162,7 +168,7 @@ export default class EggListUiHandler extends MessageUiHandler { * @param index which egg in the list to display the info for */ private setEggDetails(index: number): void { - const egg = this.scene.gameData.eggs[index]; + const egg = globalScene.gameData.eggs[index]; this.eggSprite.setFrame(`egg_${egg.getKey()}`); this.eggNameText.setText(`${i18next.t("egg:egg")} (${egg.getEggDescriptor()})`); this.eggDateText.setText( @@ -170,11 +176,11 @@ export default class EggListUiHandler extends MessageUiHandler { weekday: "short", year: "numeric", month: "2-digit", - day: "numeric" - }) + day: "numeric", + }), ); this.eggHatchWavesText.setText(egg.getEggHatchWavesMessage()); - this.eggGachaInfoText.setText(egg.getEggTypeDescriptor(this.scene)); + this.eggGachaInfoText.setText(egg.getEggTypeDescriptor()); } processInput(button: Button): boolean { diff --git a/src/ui/egg-summary-ui-handler.ts b/src/ui/egg-summary-ui-handler.ts index da93168926e..f335f83d8bf 100644 --- a/src/ui/egg-summary-ui-handler.ts +++ b/src/ui/egg-summary-ui-handler.ts @@ -1,4 +1,3 @@ -import BattleScene from "../battle-scene"; import { Mode } from "./ui"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; import MessageUiHandler from "./message-ui-handler"; @@ -6,10 +5,11 @@ import { getEggTierForSpecies } from "../data/egg"; import { Button } from "#enums/buttons"; import PokemonHatchInfoContainer from "./pokemon-hatch-info-container"; import { EggSummaryPhase } from "#app/phases/egg-summary-phase"; -import { EggHatchData } from "#app/data/egg-hatch-data"; +import type { EggHatchData } from "#app/data/egg-hatch-data"; import ScrollableGridUiHandler from "./scrollable-grid-handler"; import { HatchedPokemonContainer } from "./hatched-pokemon-container"; import { ScrollBar } from "#app/ui/scroll-bar"; +import { globalScene } from "#app/global-scene"; const iconContainerX = 112; const iconContainerY = 9; @@ -39,7 +39,7 @@ export default class EggSummaryUiHandler extends MessageUiHandler { private eggHatchBg: Phaser.GameObjects.Image; private eggHatchData: EggHatchData[]; - private scrollGridHandler : ScrollableGridUiHandler; + private scrollGridHandler: ScrollableGridUiHandler; private cursorObj: Phaser.GameObjects.Image; /** used to add a delay before which it is not possible to exit the summary */ @@ -53,43 +53,49 @@ export default class EggSummaryUiHandler extends MessageUiHandler { */ public readonly eventTarget: EventTarget = new EventTarget(); - constructor(scene: BattleScene) { - super(scene, Mode.EGG_HATCH_SUMMARY); + constructor() { + super(Mode.EGG_HATCH_SUMMARY); } setup() { const ui = this.getUi(); - this.summaryContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); + this.summaryContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); this.summaryContainer.setVisible(false); ui.add(this.summaryContainer); - this.eggHatchContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); + this.eggHatchContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); this.eggHatchContainer.setVisible(false); ui.add(this.eggHatchContainer); this.iconAnimHandler = new PokemonIconAnimHandler(); - this.iconAnimHandler.setup(this.scene); + this.iconAnimHandler.setup(); - this.eggHatchBg = this.scene.add.image(0, 0, "egg_summary_bg"); + this.eggHatchBg = globalScene.add.image(0, 0, "egg_summary_bg"); this.eggHatchBg.setOrigin(0, 0); this.eggHatchContainer.add(this.eggHatchBg); - this.cursorObj = this.scene.add.image(0, 0, "select_cursor"); + this.cursorObj = globalScene.add.image(0, 0, "select_cursor"); this.cursorObj.setOrigin(0, 0); this.summaryContainer.add(this.cursorObj); this.pokemonContainers = []; - this.pokemonIconsContainer = this.scene.add.container(iconContainerX, iconContainerY); + this.pokemonIconsContainer = globalScene.add.container(iconContainerX, iconContainerY); this.summaryContainer.add(this.pokemonIconsContainer); - this.infoContainer = new PokemonHatchInfoContainer(this.scene, this.summaryContainer); + this.infoContainer = new PokemonHatchInfoContainer(this.summaryContainer); this.infoContainer.setup(); this.infoContainer.changeToEggSummaryLayout(); this.infoContainer.setVisible(true); this.summaryContainer.add(this.infoContainer); - const scrollBar = new ScrollBar(this.scene, iconContainerX + numCols * iconSize, iconContainerY + 3, 4, this.scene.game.canvas.height / 6 - 20, numRows); + const scrollBar = new ScrollBar( + iconContainerX + numCols * iconSize, + iconContainerY + 3, + 4, + globalScene.game.canvas.height / 6 - 20, + numRows, + ); this.summaryContainer.add(scrollBar); this.scrollGridHandler = new ScrollableGridUiHandler(this, numRows, numCols) @@ -112,19 +118,19 @@ export default class EggSummaryUiHandler extends MessageUiHandler { this.getUi().hideTooltip(); // Note: Questions on garbage collection go to @frutescens - const activeKeys = this.scene.getActiveKeys(); + const activeKeys = globalScene.getActiveKeys(); // Removing unnecessary sprites from animation manager - const animKeys = Object.keys(this.scene.anims["anims"]["entries"]); + const animKeys = Object.keys(globalScene.anims["anims"]["entries"]); animKeys.forEach(key => { if (key.startsWith("pkmn__") && !activeKeys.includes(key)) { - this.scene.anims.remove(key); + globalScene.anims.remove(key); } }); // Removing unnecessary cries from audio cache - const audioKeys = Object.keys(this.scene.cache.audio.entries.entries); + const audioKeys = Object.keys(globalScene.cache.audio.entries.entries); audioKeys.forEach(key => { if (key.startsWith("cry/") && !activeKeys.includes(key)) { - delete this.scene.cache.audio.entries.entries[key]; + delete globalScene.cache.audio.entries.entries[key]; } }); // Clears eggHatchData in EggSummaryUiHandler @@ -146,17 +152,17 @@ export default class EggSummaryUiHandler extends MessageUiHandler { const speciesB = b.pokemon.species; if (getEggTierForSpecies(speciesA) < getEggTierForSpecies(speciesB)) { return -1; - } else if (getEggTierForSpecies(speciesA) > getEggTierForSpecies(speciesB)) { - return 1; - } else { - if (speciesA.speciesId < speciesB.speciesId) { - return -1; - } else if (speciesA.speciesId > speciesB.speciesId) { - return 1; - } else { - return 0; - } } + if (getEggTierForSpecies(speciesA) > getEggTierForSpecies(speciesB)) { + return 1; + } + if (speciesA.speciesId < speciesB.speciesId) { + return -1; + } + if (speciesA.speciesId > speciesB.speciesId) { + return 1; + } + return 0; }); } @@ -170,13 +176,13 @@ export default class EggSummaryUiHandler extends MessageUiHandler { this.updatePokemonIcons(); this.setCursor(0); - this.scene.playSoundWithoutBgm("evolution_fanfare"); + globalScene.playSoundWithoutBgm("evolution_fanfare"); // Prevent exiting the egg summary for 2 seconds if the egg hatching // was skipped automatically and for 1 second otherwise - const exitBlockingDuration = (this.scene.eggSkipPreference === 2) ? 2000 : 1000; + const exitBlockingDuration = globalScene.eggSkipPreference === 2 ? 2000 : 1000; this.blockExit = true; - this.scene.time.delayedCall(exitBlockingDuration, () => this.blockExit = false); + globalScene.time.delayedCall(exitBlockingDuration, () => (this.blockExit = false)); return true; } @@ -196,7 +202,7 @@ export default class EggSummaryUiHandler extends MessageUiHandler { if (!hatchContainer) { const x = (i % numCols) * iconSize; const y = Math.floor(i / numCols) * iconSize; - hatchContainer = new HatchedPokemonContainer(this.scene, x, y, hatchData).setVisible(false); + hatchContainer = new HatchedPokemonContainer(x, y, hatchData).setVisible(false); this.pokemonContainers.push(hatchContainer); this.pokemonIconsContainer.add(hatchContainer); } @@ -216,7 +222,7 @@ export default class EggSummaryUiHandler extends MessageUiHandler { let error = false; if (button === Button.CANCEL) { if (!this.blockExit) { - const phase = this.scene.getCurrentPhase(); + const phase = globalScene.getCurrentPhase(); if (phase instanceof EggSummaryPhase) { phase.end(); } @@ -245,7 +251,10 @@ export default class EggSummaryUiHandler extends MessageUiHandler { changed = super.setCursor(cursor); if (changed) { - this.cursorObj.setPosition(iconContainerX - 1 + iconSize * (cursor % numCols), iconContainerY + 1 + iconSize * Math.floor(cursor / numCols)); + this.cursorObj.setPosition( + iconContainerX - 1 + iconSize * (cursor % numCols), + iconContainerY + 1 + iconSize * Math.floor(cursor / numCols), + ); if (lastCursor > -1) { this.iconAnimHandler.addOrUpdate(this.pokemonContainers[lastCursor].icon, PokemonIconAnimMode.NONE); @@ -257,5 +266,4 @@ export default class EggSummaryUiHandler extends MessageUiHandler { return changed; } - } diff --git a/src/ui/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index a116a33f373..91f3360a3d4 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -1,8 +1,8 @@ -import BattleScene from "../battle-scene"; import MessageUiHandler from "./message-ui-handler"; import { TextStyle, addTextObject } from "./text"; import { Mode } from "./ui"; import { Button } from "#enums/buttons"; +import { globalScene } from "#app/global-scene"; export default class EvolutionSceneHandler extends MessageUiHandler { public evolutionContainer: Phaser.GameObjects.Container; @@ -11,8 +11,8 @@ export default class EvolutionSceneHandler extends MessageUiHandler { public canCancel: boolean; public cancelled: boolean; - constructor(scene: BattleScene) { - super(scene, Mode.EVOLUTION_SCENE); + constructor() { + super(Mode.EVOLUTION_SCENE); } setup() { @@ -21,25 +21,25 @@ export default class EvolutionSceneHandler extends MessageUiHandler { const ui = this.getUi(); - this.evolutionContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); + this.evolutionContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); ui.add(this.evolutionContainer); - const messageBg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); + const messageBg = globalScene.add.sprite(0, 0, "bg", globalScene.windowType); messageBg.setOrigin(0, 1); messageBg.setVisible(false); ui.add(messageBg); this.messageBg = messageBg; - this.messageContainer = this.scene.add.container(12, -39); + this.messageContainer = globalScene.add.container(12, -39); this.messageContainer.setVisible(false); ui.add(this.messageContainer); - const message = addTextObject(this.scene, 0, 0, "", TextStyle.MESSAGE, { + const message = addTextObject(0, 0, "", TextStyle.MESSAGE, { maxLines: 2, wordWrap: { - width: 1780 - } + width: 1780, + }, }); this.messageContainer.add(message); @@ -51,9 +51,9 @@ export default class EvolutionSceneHandler extends MessageUiHandler { show(_args: any[]): boolean { super.show(_args); - this.scene.ui.bringToTop(this.evolutionContainer); - this.scene.ui.bringToTop(this.messageBg); - this.scene.ui.bringToTop(this.messageContainer); + globalScene.ui.bringToTop(this.evolutionContainer); + globalScene.ui.bringToTop(this.messageBg); + globalScene.ui.bringToTop(this.messageContainer); this.messageBg.setVisible(true); this.messageContainer.setVisible(true); @@ -82,7 +82,7 @@ export default class EvolutionSceneHandler extends MessageUiHandler { return false; } - setCursor(_cursor: integer): boolean { + setCursor(_cursor: number): boolean { return false; } diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index ee6641a1a27..a4f02e13303 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -1,15 +1,18 @@ -import BattleScene, { InfoToggle } from "../battle-scene"; +import type { InfoToggle } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { addTextObject, TextStyle } from "./text"; -import { getTypeDamageMultiplierColor, Type } from "../data/type"; +import { getTypeDamageMultiplierColor } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Command } from "./command-ui-handler"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import * as Utils from "../utils"; -import { MoveCategory } from "#app/data/move"; +import { MoveCategory } from "#enums/MoveCategory"; import i18next from "i18next"; import { Button } from "#enums/buttons"; -import Pokemon, { PokemonMove } from "#app/field/pokemon"; -import { CommandPhase } from "#app/phases/command-phase"; +import type { PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import type { CommandPhase } from "#app/phases/command-phase"; import MoveInfoOverlay from "./move-info-overlay"; import { BattleType } from "#app/battle"; @@ -27,96 +30,103 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { private accuracyText: Phaser.GameObjects.Text; private cursorObj: Phaser.GameObjects.Image | null; private moveCategoryIcon: Phaser.GameObjects.Sprite; - private moveInfoOverlay : MoveInfoOverlay; + private moveInfoOverlay: MoveInfoOverlay; - protected fieldIndex: integer = 0; - protected cursor2: integer = 0; + protected fieldIndex = 0; + protected fromCommand: Command = Command.FIGHT; + protected cursor2 = 0; - constructor(scene: BattleScene) { - super(scene, Mode.FIGHT); + constructor() { + super(Mode.FIGHT); } setup() { const ui = this.getUi(); - this.movesContainer = this.scene.add.container(18, -38.7); + this.movesContainer = globalScene.add.container(18, -38.7); this.movesContainer.setName(FightUiHandler.MOVES_CONTAINER_NAME); ui.add(this.movesContainer); - this.moveInfoContainer = this.scene.add.container(1, 0); + this.moveInfoContainer = globalScene.add.container(1, 0); this.moveInfoContainer.setName("move-info"); ui.add(this.moveInfoContainer); - this.typeIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 57, -36, Utils.getLocalizedSpriteKey("types"), "unknown"); + this.typeIcon = globalScene.add.sprite( + globalScene.scaledCanvas.width - 57, + -36, + Utils.getLocalizedSpriteKey("types"), + "unknown", + ); this.typeIcon.setVisible(false); this.moveInfoContainer.add(this.typeIcon); - this.moveCategoryIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 25, -36, "categories", "physical"); + this.moveCategoryIcon = globalScene.add.sprite(globalScene.scaledCanvas.width - 25, -36, "categories", "physical"); this.moveCategoryIcon.setVisible(false); this.moveInfoContainer.add(this.moveCategoryIcon); - this.ppLabel = addTextObject(this.scene, this.scene.scaledCanvas.width - 70, -26, "PP", TextStyle.MOVE_INFO_CONTENT); + this.ppLabel = addTextObject(globalScene.scaledCanvas.width - 70, -26, "PP", TextStyle.MOVE_INFO_CONTENT); this.ppLabel.setOrigin(0.0, 0.5); this.ppLabel.setVisible(false); this.ppLabel.setText(i18next.t("fightUiHandler:pp")); this.moveInfoContainer.add(this.ppLabel); - this.ppText = addTextObject(this.scene, this.scene.scaledCanvas.width - 12, -26, "--/--", TextStyle.MOVE_INFO_CONTENT); + this.ppText = addTextObject(globalScene.scaledCanvas.width - 12, -26, "--/--", TextStyle.MOVE_INFO_CONTENT); this.ppText.setOrigin(1, 0.5); this.ppText.setVisible(false); this.moveInfoContainer.add(this.ppText); - this.powerLabel = addTextObject(this.scene, this.scene.scaledCanvas.width - 70, -18, "POWER", TextStyle.MOVE_INFO_CONTENT); + this.powerLabel = addTextObject(globalScene.scaledCanvas.width - 70, -18, "POWER", TextStyle.MOVE_INFO_CONTENT); this.powerLabel.setOrigin(0.0, 0.5); this.powerLabel.setVisible(false); this.powerLabel.setText(i18next.t("fightUiHandler:power")); this.moveInfoContainer.add(this.powerLabel); - this.powerText = addTextObject(this.scene, this.scene.scaledCanvas.width - 12, -18, "---", TextStyle.MOVE_INFO_CONTENT); + this.powerText = addTextObject(globalScene.scaledCanvas.width - 12, -18, "---", TextStyle.MOVE_INFO_CONTENT); this.powerText.setOrigin(1, 0.5); this.powerText.setVisible(false); this.moveInfoContainer.add(this.powerText); - this.accuracyLabel = addTextObject(this.scene, this.scene.scaledCanvas.width - 70, -10, "ACC", TextStyle.MOVE_INFO_CONTENT); + this.accuracyLabel = addTextObject(globalScene.scaledCanvas.width - 70, -10, "ACC", TextStyle.MOVE_INFO_CONTENT); this.accuracyLabel.setOrigin(0.0, 0.5); this.accuracyLabel.setVisible(false); this.accuracyLabel.setText(i18next.t("fightUiHandler:accuracy")); this.moveInfoContainer.add(this.accuracyLabel); - this.accuracyText = addTextObject(this.scene, this.scene.scaledCanvas.width - 12, -10, "---", TextStyle.MOVE_INFO_CONTENT); + this.accuracyText = addTextObject(globalScene.scaledCanvas.width - 12, -10, "---", TextStyle.MOVE_INFO_CONTENT); this.accuracyText.setOrigin(1, 0.5); this.accuracyText.setVisible(false); this.moveInfoContainer.add(this.accuracyText); // prepare move overlay const overlayScale = 1; - this.moveInfoOverlay = new MoveInfoOverlay(this.scene, { + this.moveInfoOverlay = new MoveInfoOverlay({ delayVisibility: true, scale: overlayScale, onSide: true, right: true, x: 0, y: -MoveInfoOverlay.getHeight(overlayScale, true), - width: (this.scene.game.canvas.width / 6) + 4, + width: globalScene.game.canvas.width / 6 + 4, hideEffectBox: true, - hideBg: true + hideBg: true, }); ui.add(this.moveInfoOverlay); // register the overlay to receive toggle events - this.scene.addInfoToggle(this.moveInfoOverlay); - this.scene.addInfoToggle(this); + globalScene.addInfoToggle(this.moveInfoOverlay); + globalScene.addInfoToggle(this); } show(args: any[]): boolean { super.show(args); - this.fieldIndex = args.length ? args[0] as integer : 0; + this.fieldIndex = args.length ? (args[0] as number) : 0; + this.fromCommand = args.length > 1 ? (args[1] as Command) : Command.FIGHT; const messageHandler = this.getUi().getMessageHandler(); messageHandler.bg.setVisible(false); messageHandler.commandWindow.setVisible(false); messageHandler.movesWindowContainer.setVisible(true); - const pokemon = (this.scene.getCurrentPhase() as CommandPhase).getPokemon(); + const pokemon = (globalScene.getCurrentPhase() as CommandPhase).getPokemon(); if (pokemon.battleSummonData.turnCount <= 1) { this.setCursor(0); } else { @@ -137,14 +147,14 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { if (button === Button.CANCEL || button === Button.ACTION) { if (button === Button.ACTION) { - if ((this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, cursor, false)) { + if ((globalScene.getCurrentPhase() as CommandPhase).handleCommand(this.fromCommand, cursor, false)) { success = true; } else { ui.playError(); } } else { // Cannot back out of fight menu if skipToFightInput is enabled - const { battleType, mysteryEncounter } = this.scene.currentBattle; + const { battleType, mysteryEncounter } = globalScene.currentBattle; if (battleType !== BattleType.MYSTERY_ENCOUNTER || !mysteryEncounter?.skipToFightInput) { ui.setMode(Mode.COMMAND, this.fieldIndex); success = true; @@ -187,11 +197,11 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { this.movesContainer.setVisible(false); this.cursorObj?.setVisible(false); } - this.scene.tweens.add({ - targets: [ this.movesContainer, this.cursorObj ], + globalScene.tweens.add({ + targets: [this.movesContainer, this.cursorObj], duration: Utils.fixedInt(125), ease: "Sine.easeInOut", - alpha: visible ? 0 : 1 + alpha: visible ? 0 : 1, }); if (!visible) { this.movesContainer.setVisible(true); @@ -203,11 +213,11 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { return this.active; } - getCursor(): integer { + getCursor(): number { return !this.fieldIndex ? this.cursor : this.cursor2; } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const ui = this.getUi(); this.moveInfoOverlay.clear(); @@ -221,11 +231,13 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { } if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, "cursor"); + const isTera = this.fromCommand === Command.TERA; + this.cursorObj = globalScene.add.image(0, 0, isTera ? "cursor_tera" : "cursor"); + this.cursorObj.setScale(isTera ? 0.7 : 1); ui.add(this.cursorObj); } - const pokemon = (this.scene.getCurrentPhase() as CommandPhase).getPokemon(); + const pokemon = (globalScene.getCurrentPhase() as CommandPhase).getPokemon(); const moveset = pokemon.getMoveset(); const hasMove = cursor < moveset.length; @@ -234,7 +246,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { const pokemonMove = moveset[cursor]!; // TODO: is the bang correct? const moveType = pokemon.getMoveType(pokemonMove.getMove()); const textureKey = Utils.getLocalizedSpriteKey("types"); - this.typeIcon.setTexture(textureKey, Type[moveType].toLowerCase()).setScale(0.8); + this.typeIcon.setTexture(textureKey, PokemonType[moveType].toLowerCase()).setScale(0.8); const moveCategory = pokemonMove.getMove().category; this.moveCategoryIcon.setTexture("categories", MoveCategory[moveCategory].toLowerCase()).setScale(1.0); @@ -266,7 +278,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { this.ppText.setShadowColor(this.getTextColor(ppColorStyle, true)); this.moveInfoOverlay.show(pokemonMove.getMove()); - pokemon.getOpponents().forEach((opponent) => { + pokemon.getOpponents().forEach(opponent => { opponent.updateEffectiveness(this.getEffectivenessText(pokemon, opponent, pokemonMove)); }); } @@ -290,7 +302,11 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { * Returns undefined if it's a status move */ private getEffectivenessText(pokemon: Pokemon, opponent: Pokemon, pokemonMove: PokemonMove): string | undefined { - const effectiveness = opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData?.abilityRevealed); + const effectiveness = opponent.getMoveEffectiveness( + pokemon, + pokemonMove.getMove(), + !opponent.battleData?.abilityRevealed, + ); if (effectiveness === undefined) { return undefined; } @@ -299,11 +315,11 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { } displayMoves() { - const pokemon = (this.scene.getCurrentPhase() as CommandPhase).getPokemon(); + const pokemon = (globalScene.getCurrentPhase() as CommandPhase).getPokemon(); const moveset = pokemon.getMoveset(); for (let moveIndex = 0; moveIndex < 4; moveIndex++) { - const moveText = addTextObject(this.scene, moveIndex % 2 === 0 ? 0 : 100, moveIndex < 2 ? 0 : 16, "-", TextStyle.WINDOW); + const moveText = addTextObject(moveIndex % 2 === 0 ? 0 : 100, moveIndex < 2 ? 0 : 16, "-", TextStyle.WINDOW); moveText.setName("text-empty-move"); if (moveIndex < moveset.length) { @@ -323,7 +339,7 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { * @returns A color or undefined if the default color should be used */ private getMoveColor(pokemon: Pokemon, pokemonMove: PokemonMove): string | undefined { - if (!this.scene.typeHints) { + if (!globalScene.typeHints) { return undefined; } @@ -333,9 +349,11 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { } const moveColors = opponents - .map((opponent) => opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData.abilityRevealed)) + .map(opponent => + opponent.getMoveEffectiveness(pokemon, pokemonMove.getMove(), !opponent.battleData.abilityRevealed), + ) .sort((a, b) => b - a) - .map((effectiveness) => getTypeDamageMultiplierColor(effectiveness ?? 0, "offense")); + .map(effectiveness => getTypeDamageMultiplierColor(effectiveness ?? 0, "offense")); return moveColors[0]; } @@ -361,8 +379,8 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { clearMoves() { this.movesContainer.removeAll(true); - const opponents = (this.scene.getCurrentPhase() as CommandPhase).getPokemon().getOpponents(); - opponents.forEach((opponent) => { + const opponents = (globalScene.getCurrentPhase() as CommandPhase).getPokemon().getOpponents(); + opponents.forEach(opponent => { opponent.updateEffectiveness(undefined); }); } diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index bcf7409fce0..2aade130ed1 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -1,46 +1,61 @@ -import BattleScene from "#app/battle-scene"; -import { DropDown, DropDownType } from "./dropdown"; -import { StarterContainer } from "./starter-container"; +import type { DropDown } from "./dropdown"; +import { DropDownType } from "./dropdown"; +import type { StarterContainer } from "./starter-container"; import { addTextObject, getTextColor, TextStyle } from "./text"; -import { UiTheme } from "#enums/ui-theme"; +import type { UiTheme } from "#enums/ui-theme"; import { addWindow, WindowVariant } from "./ui-theme"; +import { globalScene } from "#app/global-scene"; export enum DropDownColumn { GEN, TYPES, + BIOME, CAUGHT, UNLOCKS, MISC, - SORT + SORT, } export class FilterBar extends Phaser.GameObjects.Container { private window: Phaser.GameObjects.NineSlice; - private labels: Phaser.GameObjects.Text[] = []; + private labels: Phaser.GameObjects.Text[] = []; private dropDowns: DropDown[] = []; private columns: DropDownColumn[] = []; public cursorObj: Phaser.GameObjects.Image; - public numFilters: number = 0; - public openDropDown: boolean = false; - private lastCursor: number = -1; + public numFilters = 0; + public openDropDown = false; + private lastCursor = -1; private uiTheme: UiTheme; + private leftPaddingX: number; + private rightPaddingX: number; + private cursorOffset: number; - constructor(scene: BattleScene, x: number, y: number, width: number, height: number) { - super(scene, x, y); + constructor( + x: number, + y: number, + width: number, + height: number, + leftPaddingX = 6, + rightPaddingX = 6, + cursorOffset = 8, + ) { + super(globalScene, x, y); this.width = width; this.height = height; - this.window = addWindow(scene, 0, 0, width, height, false, false, undefined, undefined, WindowVariant.THIN); + this.leftPaddingX = leftPaddingX; + this.rightPaddingX = rightPaddingX; + this.cursorOffset = cursorOffset; + + this.window = addWindow(0, 0, width, height, false, false, undefined, undefined, WindowVariant.THIN); this.add(this.window); - this.cursorObj = this.scene.add.image(1, 1, "cursor"); + this.cursorObj = globalScene.add.image(1, 1, "cursor"); this.cursorObj.setScale(0.5); this.cursorObj.setVisible(false); this.cursorObj.setOrigin(0, 0); this.add(this.cursorObj); - - this.uiTheme = scene.uiTheme; } /** @@ -58,7 +73,7 @@ export class FilterBar extends Phaser.GameObjects.Container { this.columns.push(column); - const filterTypesLabel = addTextObject(this.scene, 0, 3, title, TextStyle.TOOLTIP_CONTENT); + const filterTypesLabel = addTextObject(0, 3, title, TextStyle.TOOLTIP_CONTENT); this.labels.push(filterTypesLabel); this.add(filterTypesLabel); this.dropDowns.push(dropDown); @@ -75,19 +90,28 @@ export class FilterBar extends Phaser.GameObjects.Container { * @param col the DropDownColumn used to register the filter to retrieve * @returns the associated DropDown if it exists, undefined otherwise */ - getFilter(col: DropDownColumn) : DropDown { + getFilter(col: DropDownColumn): DropDown { return this.dropDowns[this.columns.indexOf(col)]; } + /** + * Get the DropDownColumn associated to a given index + * @param index the index of the column to retrieve + * @returns the associated DropDownColumn if it exists, undefined otherwise + */ + public getColumn(index: number): DropDownColumn { + return this.columns[index]; + } + /** * Highlight the labels of the FilterBar if the filters are different from their default values */ updateFilterLabels(): void { for (let i = 0; i < this.numFilters; i++) { if (this.dropDowns[i].hasDefaultValues()) { - this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, this.uiTheme)); + this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, globalScene.uiTheme)); } else { - this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, this.uiTheme)); + this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, globalScene.uiTheme)); } } } @@ -96,23 +120,20 @@ export class FilterBar extends Phaser.GameObjects.Container { * Position the filter dropdowns evenly across the width of the container */ private calcFilterPositions(): void { - const paddingX = 6; - const cursorOffset = 8; - - let totalWidth = paddingX * 2 + cursorOffset; + let totalWidth = this.leftPaddingX + this.rightPaddingX + this.cursorOffset; this.labels.forEach(label => { - totalWidth += label.displayWidth + cursorOffset; + totalWidth += label.displayWidth + this.cursorOffset; }); const spacing = (this.width - totalWidth) / (this.labels.length - 1); for (let i = 0; i < this.labels.length; i++) { if (i === 0) { - this.labels[i].x = paddingX + cursorOffset; + this.labels[i].x = this.leftPaddingX + this.cursorOffset; } else { const lastRight = this.labels[i - 1].x + this.labels[i - 1].displayWidth; - this.labels[i].x = lastRight + spacing + cursorOffset; + this.labels[i].x = lastRight + spacing + this.cursorOffset; } - this.dropDowns[i].x = this.labels[i].x - cursorOffset - paddingX; + this.dropDowns[i].x = this.labels[i].x - this.cursorOffset - this.leftPaddingX; this.dropDowns[i].y = this.height; } } @@ -124,7 +145,7 @@ export class FilterBar extends Phaser.GameObjects.Container { for (let i = 0; i < this.dropDowns.length; i++) { if (this.dropDowns[i].dropDownType === DropDownType.HYBRID) { this.dropDowns[i].autoSize(); - this.dropDowns[i].x = - this.dropDowns[i].getWidth(); + this.dropDowns[i].x = -this.dropDowns[i].getWidth(); this.dropDowns[i].y = 0; } } @@ -139,8 +160,7 @@ export class FilterBar extends Phaser.GameObjects.Container { } } - const cursorOffset = 8; - this.cursorObj.setPosition(this.labels[cursor].x - cursorOffset + 2, 6); + this.cursorObj.setPosition(this.labels[cursor].x - this.cursorOffset + 2, 6); this.lastCursor = cursor; } @@ -158,19 +178,19 @@ export class FilterBar extends Phaser.GameObjects.Container { } incDropDownCursor(): boolean { - if (this.dropDowns[this.lastCursor].cursor === this.dropDowns[this.lastCursor].options.length - 1) {// if at the bottom of the list, wrap around + if (this.dropDowns[this.lastCursor].cursor === this.dropDowns[this.lastCursor].options.length - 1) { + // if at the bottom of the list, wrap around return this.dropDowns[this.lastCursor].setCursor(0); - } else { - return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor + 1); } + return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor + 1); } decDropDownCursor(): boolean { - if (this.dropDowns[this.lastCursor].cursor === 0) {// if at the top of the list, wrap around + if (this.dropDowns[this.lastCursor].cursor === 0) { + // if at the top of the list, wrap around return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].options.length - 1); - } else { - return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor - 1); } + return this.dropDowns[this.lastCursor].setCursor(this.dropDowns[this.lastCursor].cursor - 1); } toggleOptionState(): void { @@ -181,6 +201,11 @@ export class FilterBar extends Phaser.GameObjects.Container { return this.getFilter(col).getVals(); } + public resetSelection(col: DropDownColumn): void { + this.dropDowns[col].resetToDefault(); + this.updateFilterLabels(); + } + setValsToDefault(): void { for (const dropDown of this.dropDowns) { dropDown.resetToDefault(); @@ -193,7 +218,6 @@ export class FilterBar extends Phaser.GameObjects.Container { * @returns the index of the closest filter */ getNearestFilter(container: StarterContainer): number { - const midx = container.x + container.icon.displayWidth / 2; let nearest = 0; let nearestDist = 1000; @@ -207,5 +231,4 @@ export class FilterBar extends Phaser.GameObjects.Container { return nearest; } - } diff --git a/src/ui/filter-text.ts b/src/ui/filter-text.ts new file mode 100644 index 00000000000..a6b01ba39e6 --- /dev/null +++ b/src/ui/filter-text.ts @@ -0,0 +1,226 @@ +import type { StarterContainer } from "./starter-container"; +import { addTextObject, getTextColor, TextStyle } from "./text"; +import type { UiTheme } from "#enums/ui-theme"; +import { addWindow, WindowVariant } from "./ui-theme"; +import i18next from "i18next"; +import type AwaitableUiHandler from "./awaitable-ui-handler"; +import type UI from "./ui"; +import { Mode } from "./ui"; +import { globalScene } from "#app/global-scene"; + +export enum FilterTextRow { + NAME, + MOVE_1, + MOVE_2, + ABILITY_1, + ABILITY_2, +} + +export class FilterText extends Phaser.GameObjects.Container { + private window: Phaser.GameObjects.NineSlice; + private labels: Phaser.GameObjects.Text[] = []; + private selections: Phaser.GameObjects.Text[] = []; + private selectionStrings: string[] = []; + private rows: FilterTextRow[] = []; + public cursorObj: Phaser.GameObjects.Image; + public numFilters = 0; + private lastCursor = -1; + private uiTheme: UiTheme; + + private menuMessageBoxContainer: Phaser.GameObjects.Container; + private dialogueMessageBox: Phaser.GameObjects.NineSlice; + message: any; + private readonly textPadding = 8; + private readonly defaultWordWrapWidth = 1224; + + private onChange: () => void; + + public defaultText = "---"; + + constructor(x: number, y: number, width: number, height: number, onChange: () => void) { + super(globalScene, x, y); + + this.onChange = onChange; + + this.width = width; + this.height = height; + + this.window = addWindow(0, 0, width, height, false, false, undefined, undefined, WindowVariant.THIN); + this.add(this.window); + + this.cursorObj = globalScene.add.image(1, 1, "cursor"); + this.cursorObj.setScale(0.5); + this.cursorObj.setVisible(false); + this.cursorObj.setOrigin(0, 0); + this.add(this.cursorObj); + + this.menuMessageBoxContainer = globalScene.add.container(0, 130); + this.menuMessageBoxContainer.setName("menu-message-box"); + this.menuMessageBoxContainer.setVisible(false); + + // Full-width window used for testing dialog messages in debug mode + this.dialogueMessageBox = addWindow( + -this.textPadding, + 0, + globalScene.game.canvas.width / 6 + this.textPadding * 2, + 49, + false, + false, + 0, + 0, + WindowVariant.THIN, + ); + this.dialogueMessageBox.setOrigin(0, 0); + this.menuMessageBoxContainer.add(this.dialogueMessageBox); + + const menuMessageText = addTextObject(this.textPadding, this.textPadding, "", TextStyle.WINDOW, { maxLines: 2 }); + menuMessageText.setName("menu-message"); + menuMessageText.setOrigin(0, 0); + this.menuMessageBoxContainer.add(menuMessageText); + + this.message = menuMessageText; + } + + /** + * Add a new filter to the FilterBar, as long that a unique DropDownColumn is provided + * @param column the DropDownColumn that will be used to access the filter values + * @param title the string that will get displayed in the filter bar + * @param dropDown the DropDown with all options for this filter + * @returns true if successful, false if the provided column was already in use for another filter + */ + addFilter(row: FilterTextRow, title: string): boolean { + const paddingX = 6; + const cursorOffset = 8; + const extraSpaceX = 40; + + if (this.rows.includes(row)) { + return false; + } + + this.rows.push(row); + + const filterTypesLabel = addTextObject(paddingX + cursorOffset, 3, title, TextStyle.TOOLTIP_CONTENT); + this.labels.push(filterTypesLabel); + this.add(filterTypesLabel); + + const filterTypesSelection = addTextObject( + paddingX + cursorOffset + extraSpaceX, + 3, + this.defaultText, + TextStyle.TOOLTIP_CONTENT, + ); + this.selections.push(filterTypesSelection); + this.add(filterTypesSelection); + + this.selectionStrings.push(""); + + this.calcFilterPositions(); + this.numFilters++; + + return true; + } + + resetSelection(index: number): void { + this.selections[index].setText(this.defaultText); + this.selectionStrings[index] = ""; + this.onChange(); + } + + setValsToDefault(): void { + for (let i = 0; i < this.numFilters; i++) { + this.resetSelection(i); + } + } + + startSearch(index: number, ui: UI): void { + ui.playSelect(); + const prefilledText = ""; + const buttonAction: any = {}; + buttonAction["buttonActions"] = [ + (sanitizedName: string) => { + ui.playSelect(); + const dialogueTestName = sanitizedName; + //TODO: Is it really necessary to encode and decode? + const dialogueName = decodeURIComponent(escape(atob(dialogueTestName))); + const handler = ui.getHandler() as AwaitableUiHandler; + handler.tutorialActive = true; + // Switch to the dialog test window + this.selections[index].setText(dialogueName === "" ? this.defaultText : String(i18next.t(dialogueName))); + ui.revertMode(); + this.onChange(); + }, + () => { + ui.revertMode(); + this.onChange; + }, + ]; + ui.setOverlayMode(Mode.POKEDEX_SCAN, buttonAction, prefilledText, index); + } + + setCursor(cursor: number): void { + const cursorOffset = 8; + + this.cursorObj.setPosition(cursorOffset, this.labels[cursor].y + 3); + this.lastCursor = cursor; + } + + /** + * Highlight the labels of the FilterBar if the filters are different from their default values + */ + updateFilterLabels(): void { + for (let i = 0; i < this.numFilters; i++) { + if (this.selections[i].text === this.defaultText) { + this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, globalScene.uiTheme)); + } else { + this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, globalScene.uiTheme)); + } + } + } + + /** + * Position the filter dropdowns evenly across the width of the container + */ + private calcFilterPositions(): void { + const paddingY = 8; + + let totalHeight = paddingY * 2; + this.labels.forEach(label => { + totalHeight += label.displayHeight; + }); + const spacing = (this.height - totalHeight) / (this.labels.length - 1); + for (let i = 0; i < this.labels.length; i++) { + if (i === 0) { + this.labels[i].y = paddingY; + this.selections[i].y = paddingY; + } else { + const lastBottom = this.labels[i - 1].y + this.labels[i - 1].displayHeight; + this.labels[i].y = lastBottom + spacing; + this.selections[i].y = lastBottom + spacing; + } + } + } + + getValue(row: number): string { + return this.selections[row].getWrappedText()[0]; + } + + /** + * Find the nearest filter to the provided container on the y-axis + * @param container the StarterContainer to compare position against + * @returns the index of the closest filter + */ + getNearestFilter(container: StarterContainer): number { + const midy = container.y + container.icon.displayHeight / 2; + let nearest = 0; + let nearestDist = 1000; + for (let i = 0; i < this.labels.length; i++) { + const dist = Math.abs(midy - (this.labels[i].y + this.labels[i].displayHeight / 3)); + if (dist < nearestDist) { + nearest = i; + nearestDist = dist; + } + } + + return nearest; + } +} diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 65ee9f2db10..8784145acd6 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -1,11 +1,12 @@ -import BattleScene from "../battle-scene"; -import { ModalConfig, ModalUiHandler } from "./modal-ui-handler"; -import { Mode } from "./ui"; +import type { ModalConfig } from "./modal-ui-handler"; +import { ModalUiHandler } from "./modal-ui-handler"; +import type { Mode } from "./ui"; import { TextStyle, addTextInputObject, addTextObject } from "./text"; import { WindowVariant, addWindow } from "./ui-theme"; -import InputText from "phaser3-rex-plugins/plugins/inputtext"; +import type InputText from "phaser3-rex-plugins/plugins/inputtext"; import * as Utils from "../utils"; import { Button } from "#enums/buttons"; +import { globalScene } from "#app/global-scene"; export interface FormModalConfig extends ModalConfig { errorMessage?: string; @@ -20,8 +21,8 @@ export abstract class FormModalUiHandler extends ModalUiHandler { protected tween: Phaser.Tweens.Tween; protected formLabels: Phaser.GameObjects.Text[]; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); this.editing = false; this.inputContainers = []; @@ -37,7 +38,13 @@ export abstract class FormModalUiHandler extends ModalUiHandler { abstract getInputFieldConfigs(): InputFieldConfig[]; getHeight(config?: ModalConfig): number { - return 20 * this.getInputFieldConfigs().length + (this.getModalTitle() ? 26 : 0) + ((config as FormModalConfig)?.errorMessage ? 12 : 0) + this.getButtonTopMargin() + 28; + return ( + 20 * this.getInputFieldConfigs().length + + (this.getModalTitle() ? 26 : 0) + + ((config as FormModalConfig)?.errorMessage ? 12 : 0) + + this.getButtonTopMargin() + + 28 + ); } getReadableErrorMessage(error: string): string { @@ -59,7 +66,12 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.updateFields(config, hasTitle); } - this.errorMessage = addTextObject(this.scene, 10, (hasTitle ? 31 : 5) + 20 * (config.length - 1) + 16 + this.getButtonTopMargin(), "", TextStyle.TOOLTIP_CONTENT); + this.errorMessage = addTextObject( + 10, + (hasTitle ? 31 : 5) + 20 * (config.length - 1) + 16 + this.getButtonTopMargin(), + "", + TextStyle.TOOLTIP_CONTENT, + ); this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_PINK)); this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_PINK, true)); this.errorMessage.setVisible(false); @@ -71,20 +83,24 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.inputs = []; this.formLabels = []; fieldsConfig.forEach((config, f) => { - const label = addTextObject(this.scene, 10, (hasTitle ? 31 : 5) + 20 * f, config.label, TextStyle.TOOLTIP_CONTENT); + const label = addTextObject(10, (hasTitle ? 31 : 5) + 20 * f, config.label, TextStyle.TOOLTIP_CONTENT); label.name = "formLabel" + f; this.formLabels.push(label); this.modalContainer.add(this.formLabels[this.formLabels.length - 1]); - const inputContainer = this.scene.add.container(70, (hasTitle ? 28 : 2) + 20 * f); + const inputContainer = globalScene.add.container(70, (hasTitle ? 28 : 2) + 20 * f); inputContainer.setVisible(false); - const inputBg = addWindow(this.scene, 0, 0, 80, 16, false, false, 0, 0, WindowVariant.XTHIN); + const inputBg = addWindow(0, 0, 80, 16, false, false, 0, 0, WindowVariant.XTHIN); const isPassword = config?.isPassword; const isReadOnly = config?.isReadOnly; - const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 20, readOnly: isReadOnly }); + const input = addTextInputObject(4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { + type: isPassword ? "password" : "text", + maxLength: isPassword ? 64 : 20, + readOnly: isReadOnly, + }); input.setOrigin(0, 0); inputContainer.add(inputBg); @@ -103,9 +119,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { const config = args[0] as FormModalConfig; - this.submitAction = config.buttonActions.length - ? config.buttonActions[0] - : null; + this.submitAction = config.buttonActions.length ? config.buttonActions[0] : null; if (this.buttonBgs.length) { this.buttonBgs[0].off("pointerdown"); @@ -119,12 +133,12 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.modalContainer.y += 24; this.modalContainer.setAlpha(0); - this.tween = this.scene.tweens.add({ + this.tween = globalScene.tweens.add({ targets: this.modalContainer, duration: Utils.fixedInt(1000), ease: "Sine.easeInOut", y: "-=24", - alpha: 1 + alpha: 1, }); return true; @@ -170,7 +184,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { } export interface InputFieldConfig { - label: string, - isPassword?: boolean, - isReadOnly?: boolean + label: string; + isPassword?: boolean; + isReadOnly?: boolean; } diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 671bed29036..7d3decf0c4c 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -1,15 +1,16 @@ import Phaser from "phaser"; -import BattleScene from "#app/battle-scene"; import { TextStyle, addTextObject } from "#app/ui/text"; -import { Mode } from "#app/ui/ui"; +import type { Mode } from "#app/ui/ui"; import UiHandler from "#app/ui/ui-handler"; import { addWindow } from "#app/ui/ui-theme"; import * as Utils from "#app/utils"; -import { DexAttr, GameData } from "#app/system/game-data"; +import type { GameData } from "#app/system/game-data"; +import { DexAttr } from "#app/system/game-data"; import { speciesStarterCosts } from "#app/data/balance/starters"; import { Button } from "#enums/buttons"; import i18next from "i18next"; import { UiTheme } from "#enums/ui-theme"; +import { globalScene } from "#app/global-scene"; interface DisplayStat { label_key?: string; @@ -18,13 +19,13 @@ interface DisplayStat { } interface DisplayStats { - [key: string]: DisplayStat | string + [key: string]: DisplayStat | string; } const displayStats: DisplayStats = { playTime: { label_key: "playTime", - sourceFunc: gameData => Utils.getPlayTimeString(gameData.gameStats.playTime) + sourceFunc: gameData => Utils.getPlayTimeString(gameData.gameStats.playTime), }, battles: { label_key: "totalBattles", @@ -35,34 +36,34 @@ const displayStats: DisplayStats = { sourceFunc: gameData => { const starterCount = gameData.getStarterCount(d => !!d.caughtAttr); return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarterCosts).length) * 1000) / 10}%)`; - } + }, }, shinyStartersUnlocked: { label_key: "shinyStarters", sourceFunc: gameData => { const starterCount = gameData.getStarterCount(d => !!(d.caughtAttr & DexAttr.SHINY)); return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarterCosts).length) * 1000) / 10}%)`; - } + }, }, dexSeen: { label_key: "speciesSeen", sourceFunc: gameData => { const seenCount = gameData.getSpeciesCount(d => !!d.seenAttr); return `${seenCount} (${Math.floor((seenCount / Object.keys(gameData.dexData).length) * 1000) / 10}%)`; - } + }, }, dexCaught: { label_key: "speciesCaught", sourceFunc: gameData => { const caughtCount = gameData.getSpeciesCount(d => !!d.caughtAttr); return `${caughtCount} (${Math.floor((caughtCount / Object.keys(gameData.dexData).length) * 1000) / 10}%)`; - } + }, }, ribbonsOwned: { label_key: "ribbonsOwned", sourceFunc: gameData => gameData.gameStats.ribbonsOwned.toString(), }, - classicSessionsPlayed:{ + classicSessionsPlayed: { label_key: "classicRuns", sourceFunc: gameData => gameData.gameStats.classicSessionsPlayed.toString(), }, @@ -81,12 +82,12 @@ const displayStats: DisplayStats = { endlessSessionsPlayed: { label_key: "endlessRuns", sourceFunc: gameData => gameData.gameStats.endlessSessionsPlayed.toString(), - hidden: true + hidden: true, }, highestEndlessWave: { label_key: "highestWaveEndless", sourceFunc: gameData => gameData.gameStats.highestEndlessWave.toString(), - hidden: true + hidden: true, }, highestMoney: { label_key: "highestMoney", @@ -119,67 +120,67 @@ const displayStats: DisplayStats = { subLegendaryPokemonSeen: { label_key: "subLegendsSeen", sourceFunc: gameData => gameData.gameStats.subLegendaryPokemonSeen.toString(), - hidden: true + hidden: true, }, subLegendaryPokemonCaught: { label_key: "subLegendsCaught", sourceFunc: gameData => gameData.gameStats.subLegendaryPokemonCaught.toString(), - hidden: true + hidden: true, }, subLegendaryPokemonHatched: { label_key: "subLegendsHatched", sourceFunc: gameData => gameData.gameStats.subLegendaryPokemonHatched.toString(), - hidden: true + hidden: true, }, legendaryPokemonSeen: { label_key: "legendsSeen", sourceFunc: gameData => gameData.gameStats.legendaryPokemonSeen.toString(), - hidden: true + hidden: true, }, legendaryPokemonCaught: { label_key: "legendsCaught", sourceFunc: gameData => gameData.gameStats.legendaryPokemonCaught.toString(), - hidden: true + hidden: true, }, legendaryPokemonHatched: { label_key: "legendsHatched", sourceFunc: gameData => gameData.gameStats.legendaryPokemonHatched.toString(), - hidden: true + hidden: true, }, mythicalPokemonSeen: { label_key: "mythicalsSeen", sourceFunc: gameData => gameData.gameStats.mythicalPokemonSeen.toString(), - hidden: true + hidden: true, }, mythicalPokemonCaught: { label_key: "mythicalsCaught", sourceFunc: gameData => gameData.gameStats.mythicalPokemonCaught.toString(), - hidden: true + hidden: true, }, mythicalPokemonHatched: { label_key: "mythicalsHatched", sourceFunc: gameData => gameData.gameStats.mythicalPokemonHatched.toString(), - hidden: true + hidden: true, }, shinyPokemonSeen: { label_key: "shiniesSeen", sourceFunc: gameData => gameData.gameStats.shinyPokemonSeen.toString(), - hidden: true + hidden: true, }, shinyPokemonCaught: { label_key: "shiniesCaught", sourceFunc: gameData => gameData.gameStats.shinyPokemonCaught.toString(), - hidden: true + hidden: true, }, shinyPokemonHatched: { label_key: "shiniesHatched", sourceFunc: gameData => gameData.gameStats.shinyPokemonHatched.toString(), - hidden: true + hidden: true, }, pokemonFused: { label_key: "pokemonFused", sourceFunc: gameData => gameData.gameStats.pokemonFused.toString(), - hidden: true + hidden: true, }, trainersDefeated: { label_key: "trainersDefeated", @@ -188,27 +189,27 @@ const displayStats: DisplayStats = { eggsPulled: { label_key: "eggsPulled", sourceFunc: gameData => gameData.gameStats.eggsPulled.toString(), - hidden: true + hidden: true, }, rareEggsPulled: { label_key: "rareEggsPulled", sourceFunc: gameData => gameData.gameStats.rareEggsPulled.toString(), - hidden: true + hidden: true, }, epicEggsPulled: { label_key: "epicEggsPulled", sourceFunc: gameData => gameData.gameStats.epicEggsPulled.toString(), - hidden: true + hidden: true, }, legendaryEggsPulled: { label_key: "legendaryEggsPulled", sourceFunc: gameData => gameData.gameStats.legendaryEggsPulled.toString(), - hidden: true + hidden: true, }, manaphyEggsPulled: { label_key: "manaphyEggsPulled", sourceFunc: gameData => gameData.gameStats.manaphyEggsPulled.toString(), - hidden: true + hidden: true, }, }; @@ -222,8 +223,8 @@ export default class GameStatsUiHandler extends UiHandler { private arrowUp: Phaser.GameObjects.Sprite; private arrowDown: Phaser.GameObjects.Sprite; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); this.statLabels = []; this.statValues = []; @@ -232,37 +233,52 @@ export default class GameStatsUiHandler extends UiHandler { setup() { const ui = this.getUi(); - this.gameStatsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.gameStatsContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); - this.gameStatsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.gameStatsContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); + const headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6 - 2, 24); headerBg.setOrigin(0, 0); - const headerText = addTextObject(this.scene, 0, 0, i18next.t("gameStatsUiHandler:stats"), TextStyle.SETTINGS_LABEL); + const headerText = addTextObject(0, 0, i18next.t("gameStatsUiHandler:stats"), TextStyle.SETTINGS_LABEL); headerText.setOrigin(0, 0); headerText.setPositionRelative(headerBg, 8, 4); - const statsBgWidth = ((this.scene.game.canvas.width / 6) - 2) / 2; - const [ statsBgLeft, statsBgRight ] = new Array(2).fill(null).map((_, i) => { + const statsBgWidth = (globalScene.game.canvas.width / 6 - 2) / 2; + const [statsBgLeft, statsBgRight] = new Array(2).fill(null).map((_, i) => { const width = statsBgWidth + 2; - const height = Math.floor((this.scene.game.canvas.height / 6) - headerBg.height - 2); - const statsBg = addWindow(this.scene, (statsBgWidth - 2) * i, headerBg.height, width, height, false, false, i > 0 ? -3 : 0, 1); + const height = Math.floor(globalScene.game.canvas.height / 6 - headerBg.height - 2); + const statsBg = addWindow( + (statsBgWidth - 2) * i, + headerBg.height, + width, + height, + false, + false, + i > 0 ? -3 : 0, + 1, + ); statsBg.setOrigin(0, 0); return statsBg; }); - this.statsContainer = this.scene.add.container(0, 0); - + this.statsContainer = globalScene.add.container(0, 0); new Array(18).fill(null).map((_, s) => { - - const statLabel = addTextObject(this.scene, 8 + (s % 2 === 1 ? statsBgWidth : 0), 28 + Math.floor(s / 2) * 16, "", TextStyle.STATS_LABEL); + const statLabel = addTextObject( + 8 + (s % 2 === 1 ? statsBgWidth : 0), + 28 + Math.floor(s / 2) * 16, + "", + TextStyle.STATS_LABEL, + ); statLabel.setOrigin(0, 0); this.statsContainer.add(statLabel); this.statLabels.push(statLabel); - const statValue = addTextObject(this.scene, (statsBgWidth * ((s % 2) + 1)) - 8, statLabel.y, "", TextStyle.STATS_VALUE); + const statValue = addTextObject(statsBgWidth * ((s % 2) + 1) - 8, statLabel.y, "", TextStyle.STATS_VALUE); statValue.setOrigin(1, 0); this.statsContainer.add(statValue); this.statValues.push(statValue); @@ -275,10 +291,14 @@ export default class GameStatsUiHandler extends UiHandler { this.gameStatsContainer.add(this.statsContainer); // arrows to show that we can scroll through the stats - const isLegacyTheme = this.scene.uiTheme === UiTheme.LEGACY; - this.arrowDown = this.scene.add.sprite(statsBgWidth, this.scene.game.canvas.height / 6 - (isLegacyTheme ? 9 : 5), "prompt"); + const isLegacyTheme = globalScene.uiTheme === UiTheme.LEGACY; + this.arrowDown = globalScene.add.sprite( + statsBgWidth, + globalScene.game.canvas.height / 6 - (isLegacyTheme ? 9 : 5), + "prompt", + ); this.gameStatsContainer.add(this.arrowDown); - this.arrowUp = this.scene.add.sprite(statsBgWidth, headerBg.height + (isLegacyTheme ? 7 : 3), "prompt"); + this.arrowUp = globalScene.add.sprite(statsBgWidth, headerBg.height + (isLegacyTheme ? 7 : 3), "prompt"); this.arrowUp.flipY = true; this.gameStatsContainer.add(this.arrowUp); @@ -298,7 +318,7 @@ export default class GameStatsUiHandler extends UiHandler { this.arrowUp.play("prompt"); this.arrowDown.play("prompt"); - if (this.scene.uiTheme === UiTheme.LEGACY) { + if (globalScene.uiTheme === UiTheme.LEGACY) { this.arrowUp.setTint(0x484848); this.arrowDown.setTint(0x484848); } @@ -318,8 +338,12 @@ export default class GameStatsUiHandler extends UiHandler { const statKeys = Object.keys(displayStats).slice(this.cursor * 2, this.cursor * 2 + 18); statKeys.forEach((key, s) => { const stat = displayStats[key] as DisplayStat; - const value = stat.sourceFunc!(this.scene.gameData); // TODO: is this bang correct? - this.statLabels[s].setText(!stat.hidden || isNaN(parseInt(value)) || parseInt(value) ? i18next.t(`gameStatsUiHandler:${stat.label_key}`) : "???"); + const value = stat.sourceFunc!(globalScene.gameData); // TODO: is this bang correct? + this.statLabels[s].setText( + !stat.hidden || Number.isNaN(Number.parseInt(value)) || Number.parseInt(value) + ? i18next.t(`gameStatsUiHandler:${stat.label_key}`) + : "???", + ); this.statValues[s].setText(value); }); if (statKeys.length < 18) { @@ -348,7 +372,7 @@ export default class GameStatsUiHandler extends UiHandler { if (button === Button.CANCEL) { success = true; - this.scene.ui.revertMode(); + globalScene.ui.revertMode(); } else { switch (button) { case Button.UP: @@ -371,7 +395,7 @@ export default class GameStatsUiHandler extends UiHandler { return success; } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const ret = super.setCursor(cursor); if (ret) { @@ -402,16 +426,18 @@ export function initStatsKeys() { displayStats[key] = { label_key: label, sourceFunc: gameData => gameData.gameStats[key].toString(), - hidden: hidden + hidden: hidden, }; } else if (displayStats[key] === null) { displayStats[key] = { - sourceFunc: gameData => gameData.gameStats[key].toString() + sourceFunc: gameData => gameData.gameStats[key].toString(), }; } if (!(displayStats[key] as DisplayStat).label_key) { const splittableKey = key.replace(/([a-z]{2,})([A-Z]{1}(?:[^A-Z]|$))/g, "$1_$2"); - (displayStats[key] as DisplayStat).label_key = Utils.toReadableString(`${splittableKey[0].toUpperCase()}${splittableKey.slice(1)}`); + (displayStats[key] as DisplayStat).label_key = Utils.toReadableString( + `${splittableKey[0].toUpperCase()}${splittableKey.slice(1)}`, + ); } } } diff --git a/src/ui/hatched-pokemon-container.ts b/src/ui/hatched-pokemon-container.ts index 9fb1fd26b30..0b283c2e063 100644 --- a/src/ui/hatched-pokemon-container.ts +++ b/src/ui/hatched-pokemon-container.ts @@ -1,10 +1,11 @@ -import { EggHatchData } from "#app/data/egg-hatch-data"; +import type { EggHatchData } from "#app/data/egg-hatch-data"; import { Gender } from "#app/data/gender"; import { getVariantTint } from "#app/data/variant"; import { DexAttr } from "#app/system/game-data"; -import BattleScene from "#app/battle-scene"; -import PokemonSpecies from "#app/data/pokemon-species"; -import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; +import { globalScene } from "#app/global-scene"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import type PokemonIconAnimHandler from "./pokemon-icon-anim-handler"; +import { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; /** * A container for a Pokemon's sprite and icons to get displayed in the egg summary screen @@ -12,7 +13,6 @@ import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim * shiny variant, hidden ability, new egg move, new catch */ export class HatchedPokemonContainer extends Phaser.GameObjects.Container { - public scene: BattleScene; public species: PokemonSpecies; public icon: Phaser.GameObjects.Sprite; public shinyIcon: Phaser.GameObjects.Image; @@ -21,13 +21,12 @@ export class HatchedPokemonContainer extends Phaser.GameObjects.Container { public eggMoveIcon: Phaser.GameObjects.Image; /** - * @param scene the current {@linkcode BattleScene} * @param x x position * @param y y position * @param hatchData the {@linkcode EggHatchData} to load the icons and sprites for */ - constructor(scene: BattleScene, x: number, y: number, hatchData: EggHatchData) { - super(scene, x, y); + constructor(x: number, y: number, hatchData: EggHatchData) { + super(globalScene, x, y); const displayPokemon = hatchData.pokemon; this.species = displayPokemon.species; @@ -41,7 +40,7 @@ export class HatchedPokemonContainer extends Phaser.GameObjects.Container { const isShiny = displayPokemon.shiny; // Pokemon sprite - const pokemonIcon = this.scene.add.sprite(-offset, offset, species.getIconAtlasKey(formIndex, isShiny, variant)); + const pokemonIcon = globalScene.add.sprite(-offset, offset, species.getIconAtlasKey(formIndex, isShiny, variant)); pokemonIcon.setScale(0.5); pokemonIcon.setOrigin(0, 0); pokemonIcon.setFrame(species.getIconId(female, formIndex, isShiny, variant)); @@ -50,27 +49,27 @@ export class HatchedPokemonContainer extends Phaser.GameObjects.Container { this.add(this.icon); // Shiny icon - this.shinyIcon = this.scene.add.image(rightSideX, offset, "shiny_star_small"); + this.shinyIcon = globalScene.add.image(rightSideX, offset, "shiny_star_small"); this.shinyIcon.setOrigin(0, 0); this.shinyIcon.setScale(0.5); this.add(this.shinyIcon); // Hidden ability icon - const haIcon = this.scene.add.image(rightSideX, offset * 4, "ha_capsule"); + const haIcon = globalScene.add.image(rightSideX, offset * 4, "ha_capsule"); haIcon.setOrigin(0, 0); haIcon.setScale(0.5); this.hiddenAbilityIcon = haIcon; this.add(this.hiddenAbilityIcon); // Pokeball icon - const pokeballIcon = this.scene.add.image(rightSideX, offset * 7, "icon_owned"); + const pokeballIcon = globalScene.add.image(rightSideX, offset * 7, "icon_owned"); pokeballIcon.setOrigin(0, 0); pokeballIcon.setScale(0.5); this.pokeballIcon = pokeballIcon; this.add(this.pokeballIcon); // Egg move icon - const eggMoveIcon = this.scene.add.image(0, offset, "icon_egg_move"); + const eggMoveIcon = globalScene.add.image(0, offset, "icon_egg_move"); eggMoveIcon.setOrigin(0, 0); eggMoveIcon.setScale(0.5); this.eggMoveIcon = eggMoveIcon; @@ -92,8 +91,8 @@ export class HatchedPokemonContainer extends Phaser.GameObjects.Container { const caughtAttr = dexEntry.caughtAttr; const newShiny = BigInt(1 << (displayPokemon.shiny ? 1 : 0)); const newVariant = BigInt(1 << (displayPokemon.variant + 4)); - const newShinyOrVariant = ((newShiny & caughtAttr) === BigInt(0)) || ((newVariant & caughtAttr) === BigInt(0)); - const newForm = (BigInt(1 << displayPokemon.formIndex) * DexAttr.DEFAULT_FORM & caughtAttr) === BigInt(0); + const newShinyOrVariant = (newShiny & caughtAttr) === BigInt(0) || (newVariant & caughtAttr) === BigInt(0); + const newForm = ((BigInt(1 << displayPokemon.formIndex) * DexAttr.DEFAULT_FORM) & caughtAttr) === BigInt(0); const female = displayPokemon.gender === Gender.FEMALE; const formIndex = displayPokemon.formIndex; diff --git a/src/ui/loading-modal-ui-handler.ts b/src/ui/loading-modal-ui-handler.ts index d86f7afd3b6..9626276245d 100644 --- a/src/ui/loading-modal-ui-handler.ts +++ b/src/ui/loading-modal-ui-handler.ts @@ -1,12 +1,11 @@ import i18next from "i18next"; -import BattleScene from "../battle-scene"; import { ModalUiHandler } from "./modal-ui-handler"; import { addTextObject, TextStyle } from "./text"; -import { Mode } from "./ui"; +import type { Mode } from "./ui"; export default class LoadingModalUiHandler extends ModalUiHandler { - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); } getModalTitle(): string { @@ -22,17 +21,17 @@ export default class LoadingModalUiHandler extends ModalUiHandler { } getMargin(): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + return [0, 0, 48, 0]; } getButtonLabels(): string[] { - return [ ]; + return []; } setup(): void { super.setup(); - const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, i18next.t("menu:loading"), TextStyle.WINDOW); + const label = addTextObject(this.getWidth() / 2, this.getHeight() / 2, i18next.t("menu:loading"), TextStyle.WINDOW); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 26a2a225ec6..1087ffa3fd1 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -1,12 +1,15 @@ -import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; -import { ModalConfig } from "./modal-ui-handler"; +import type { InputFieldConfig } from "./form-modal-ui-handler"; +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import type { ModalConfig } from "./modal-ui-handler"; import * as Utils from "../utils"; import { Mode } from "./ui"; import i18next from "i18next"; -import BattleScene from "#app/battle-scene"; import { addTextObject, TextStyle } from "./text"; import { addWindow } from "./ui-theme"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import { globalScene } from "#app/global-scene"; +import JSZip from "jszip"; interface BuildInteractableImageOpts { scale?: number; @@ -26,37 +29,47 @@ 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; private externalPartyTitle: Phaser.GameObjects.Text; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); } setup(): void { super.setup(); this.buildExternalPartyContainer(); - this.infoContainer = this.scene.add.container(0, 0); + this.infoContainer = globalScene.add.container(0, 0); this.usernameInfoImage = this.buildInteractableImage("settings_icon", "username-info-icon", { x: 20, - scale: 0.5 + 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(); } private buildExternalPartyContainer() { - this.externalPartyContainer = this.scene.add.container(0, 0); - this.externalPartyContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 12, this.scene.game.canvas.height / 12), Phaser.Geom.Rectangle.Contains); - this.externalPartyTitle = addTextObject(this.scene, 0, 4, "", TextStyle.SETTINGS_LABEL); + this.externalPartyContainer = globalScene.add.container(0, 0); + this.externalPartyContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 12, globalScene.game.canvas.height / 12), + Phaser.Geom.Rectangle.Contains, + ); + this.externalPartyTitle = addTextObject(0, 4, "", TextStyle.SETTINGS_LABEL); this.externalPartyTitle.setOrigin(0.5, 0); - this.externalPartyBg = addWindow(this.scene, 0, 0, 0, 0); + this.externalPartyBg = addWindow(0, 0, 0, 0); this.externalPartyContainer.add(this.externalPartyBg); this.externalPartyContainer.add(this.externalPartyTitle); @@ -72,7 +85,11 @@ export default class LoginFormUiHandler extends FormModalUiHandler { } override getModalTitle(_config?: ModalConfig): string { - return i18next.t("menu:login"); + let key = "menu:login"; + if (import.meta.env.VITE_SERVER_URL === "https://apibeta.pokerogue.net") { + key = "menu:loginBeta"; + } + return i18next.t(key); } override getWidth(_config?: ModalConfig): number { @@ -80,11 +97,11 @@ export default class LoginFormUiHandler extends FormModalUiHandler { } override getMargin(_config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + return [0, 0, 48, 0]; } override getButtonLabels(_config?: ModalConfig): string[] { - return [ i18next.t("menu:login"), i18next.t("menu:register") ]; + return [i18next.t("menu:login"), i18next.t("menu:register")]; } override getReadableErrorMessage(error: string): string { @@ -113,43 +130,40 @@ export default class LoginFormUiHandler extends FormModalUiHandler { override getInputFieldConfigs(): InputFieldConfig[] { const inputFieldConfigs: InputFieldConfig[] = []; inputFieldConfigs.push({ label: i18next.t("menu:username") }); - inputFieldConfigs.push({ label: i18next.t("menu:password"), isPassword: true }); + inputFieldConfigs.push({ + label: i18next.t("menu:password"), + isPassword: true, + }); return inputFieldConfigs; } override show(args: any[]): boolean { if (super.show(args)) { - const config = args[0] as ModalConfig; this.processExternalProvider(config); const originalLoginAction = this.submitAction; - this.submitAction = (_) => { + this.submitAction = _ => { // Prevent overlapping overrides on action modification this.submitAction = originalLoginAction; this.sanitizeInputs(); - this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); const onFail = error => { - this.scene.ui.setMode(Mode.LOGIN_FORM, Object.assign(config, { errorMessage: error?.trim() })); - this.scene.ui.playError(); + globalScene.ui.setMode(Mode.LOGIN_FORM, Object.assign(config, { errorMessage: error?.trim() })); + globalScene.ui.playError(); }; if (!this.inputs[0].text) { return onFail(i18next.t("menu:emptyUsername")); } - Utils.apiPost("account/login", `username=${encodeURIComponent(this.inputs[0].text)}&password=${encodeURIComponent(this.inputs[1].text)}`, "application/x-www-form-urlencoded") - .then(response => { - if (!response.ok) { - return response.text(); - } - return response.json(); - }) - .then(response => { - if (response.hasOwnProperty("token")) { - Utils.setCookie(Utils.sessionIdKey, response.token); - originalLoginAction && originalLoginAction(); - } else { - onFail(response); - } - }); + + const [usernameInput, passwordInput] = this.inputs; + + pokerogueApi.account.login({ username: usernameInput.text, password: passwordInput.text }).then(error => { + if (!error && originalLoginAction) { + originalLoginAction(); + } else { + onFail(error); + } + }); }; return true; @@ -164,7 +178,9 @@ 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 { @@ -182,6 +198,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`); @@ -198,9 +215,9 @@ export default class LoginFormUiHandler extends FormModalUiHandler { }); const onFail = error => { - this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); - this.scene.ui.setModeForceTransition(Mode.LOGIN_FORM, Object.assign(config, { errorMessage: error?.trim() })); - this.scene.ui.playError(); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); + globalScene.ui.setModeForceTransition(Mode.LOGIN_FORM, Object.assign(config, { errorMessage: error?.trim() })); + globalScene.ui.playError(); }; this.usernameInfoImage.on("pointerdown", () => { @@ -213,53 +230,78 @@ export default class LoginFormUiHandler extends FormModalUiHandler { options.push({ label: dataKeys[i].replace(keyToFind, ""), handler: () => { - this.scene.ui.revertMode(); + globalScene.ui.revertMode(); this.infoContainer.disableInteractive(); return true; - } + }, }); } - this.scene.ui.setOverlayMode(Mode.OPTION_SELECT, { + globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options, - delay: 1000 + delay: 1000, }); - this.infoContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width, this.scene.game.canvas.height), Phaser.Geom.Rectangle.Contains); + this.infoContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width, globalScene.game.canvas.height), + Phaser.Geom.Rectangle.Contains, + ); } else { if (dataKeys.length > 2) { return onFail(this.ERR_TOO_MANY_SAVES); - } else { - return onFail(this.ERR_NO_SAVES); } + return onFail(this.ERR_NO_SAVES); + } + }); + + 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({ + globalScene.tweens.add({ targets: this.externalPartyContainer, duration: Utils.fixedInt(1000), ease: "Sine.easeInOut", y: "-=24", - alpha: 1 + alpha: 1, }); this.infoContainer.setAlpha(0); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.infoContainer, duration: Utils.fixedInt(1000), ease: "Sine.easeInOut", y: "-=24", - alpha: 1 + alpha: 1, }); } private buildInteractableImage(texture: string, name: string, opts: BuildInteractableImageOpts = {}) { - const { - scale = 0.07, - x = 0, - y = 0, - origin = { x: 0, y: 0 } - } = opts; - const img = this.scene.add.image(x, y, texture); + const { scale = 0.07, x = 0, y = 0, origin = { x: 0, y: 0 } } = opts; + const img = globalScene.add.image(x, y, texture); img.setName(name); img.setOrigin(origin.x, origin.y); img.setScale(scale); diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 301d54daa3a..b83ae24c9e0 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -1,27 +1,29 @@ -import BattleScene, { bypassLogin } from "../battle-scene"; +import { bypassLogin } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { TextStyle, addTextObject, getTextStyleOptions } from "./text"; import { Mode } from "./ui"; import * as Utils from "../utils"; import { addWindow, WindowVariant } from "./ui-theme"; import MessageUiHandler from "./message-ui-handler"; -import { OptionSelectConfig, OptionSelectItem } from "./abstact-option-select-ui-handler"; +import type { OptionSelectConfig, OptionSelectItem } from "./abstact-option-select-ui-handler"; import { Tutorial, handleTutorial } from "../tutorial"; import { loggedInUser, updateUserInfo } from "../account"; import i18next from "i18next"; import { Button } from "#enums/buttons"; import { GameDataType } from "#enums/game-data-type"; import BgmBar from "#app/ui/bgm-bar"; -import AwaitableUiHandler from "./awaitable-ui-handler"; +import type AwaitableUiHandler from "./awaitable-ui-handler"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { AdminMode, getAdminModeName } from "./admin-ui-handler"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; enum MenuOptions { GAME_SETTINGS, ACHIEVEMENTS, STATS, - RUN_HISTORY, EGG_LIST, EGG_GACHA, + POKEDEX, MANAGE_DATA, COMMUNITY, SAVE_AND_QUIT, @@ -32,7 +34,7 @@ let wikiUrl = "https://wiki.pokerogue.net/start"; const discordUrl = "https://discord.gg/uWpTfdKG49"; const githubUrl = "https://github.com/pagefaultgames/pokerogue"; const redditUrl = "https://www.reddit.com/r/pokerogue"; -const donateUrl = "https://github.com/sponsors/patapancakes"; +const donateUrl = "https://github.com/sponsors/pagefaultgames"; export default class MenuUiHandler extends MessageUiHandler { private readonly textPadding = 8; @@ -58,20 +60,23 @@ export default class MenuUiHandler extends MessageUiHandler { private menuMessageBox: Phaser.GameObjects.NineSlice; private dialogueMessageBox: Phaser.GameObjects.NineSlice; - protected scale: number = 0.1666666667; + protected scale = 0.1666666667; public bgmBar: BgmBar; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); this.excludedMenus = () => [ - { condition: [ Mode.COMMAND, Mode.TITLE ].includes(mode ?? Mode.TITLE), options: [ MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST ]}, - { condition: bypassLogin, options: [ MenuOptions.LOG_OUT ]} + { + condition: [Mode.COMMAND, Mode.TITLE].includes(mode ?? Mode.TITLE), + options: [MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST], + }, + { condition: bypassLogin, options: [MenuOptions.LOG_OUT] }, ]; this.menuOptions = Utils.getEnumKeys(MenuOptions) - .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .map(m => Number.parseInt(MenuOptions[m]) as MenuOptions) .filter(m => { return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); }); @@ -81,20 +86,31 @@ export default class MenuUiHandler extends MessageUiHandler { const ui = this.getUi(); // wiki url directs based on languges available on wiki const lang = i18next.resolvedLanguage?.substring(0, 2)!; // TODO: is this bang correct? - if ([ "de", "fr", "ko", "zh" ].includes(lang)) { + if (["de", "fr", "ko", "zh"].includes(lang)) { wikiUrl = `https://wiki.pokerogue.net/${lang}:start`; } - this.bgmBar = new BgmBar(this.scene); + this.bgmBar = new BgmBar(); this.bgmBar.setup(); ui.bgmBar = this.bgmBar; - this.menuContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.menuContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); this.menuContainer.setName("menu"); - this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.menuContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - this.menuOverlay = new Phaser.GameObjects.Rectangle(this.scene, -1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0xffffff, 0.3); + this.menuOverlay = new Phaser.GameObjects.Rectangle( + globalScene, + -1, + -1, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, + 0xffffff, + 0.3, + ); this.menuOverlay.setName("menu-overlay"); this.menuOverlay.setOrigin(0, 0); this.menuContainer.add(this.menuOverlay); @@ -102,32 +118,39 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuContainer.add(this.bgmBar); this.menuContainer.setVisible(false); - } - render() { const ui = this.getUi(); this.excludedMenus = () => [ - { condition: this.scene.getCurrentPhase() instanceof SelectModifierPhase, options: [ MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST ]}, - { condition: bypassLogin, options: [ MenuOptions.LOG_OUT ]} + { + condition: globalScene.getCurrentPhase() instanceof SelectModifierPhase, + options: [MenuOptions.EGG_GACHA], + }, + { condition: bypassLogin, options: [MenuOptions.LOG_OUT] }, ]; this.menuOptions = Utils.getEnumKeys(MenuOptions) - .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .map(m => Number.parseInt(MenuOptions[m]) as MenuOptions) .filter(m => { return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); }); - this.optionSelectText = addTextObject(this.scene, 0, 0, this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join("\n"), TextStyle.WINDOW, { maxLines: this.menuOptions.length }); + this.optionSelectText = addTextObject( + 0, + 0, + this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join("\n"), + TextStyle.WINDOW, + { maxLines: this.menuOptions.length }, + ); this.optionSelectText.setLineSpacing(12); - this.scale = getTextStyleOptions(TextStyle.WINDOW, (this.scene as BattleScene).uiTheme).scale; - this.menuBg = addWindow(this.scene, - (this.scene.game.canvas.width / 6) - (this.optionSelectText.displayWidth + 25), + this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; + this.menuBg = addWindow( + globalScene.game.canvas.width / 6 - (this.optionSelectText.displayWidth + 25), 0, this.optionSelectText.displayWidth + 19 + 24 * this.scale, - (this.scene.game.canvas.height / 6) - 2 + globalScene.game.canvas.height / 6 - 2, ); this.menuBg.setOrigin(0, 0); @@ -139,21 +162,31 @@ export default class MenuUiHandler extends MessageUiHandler { ui.add(this.menuContainer); - this.menuMessageBoxContainer = this.scene.add.container(0, 130); + this.menuMessageBoxContainer = globalScene.add.container(0, 130); this.menuMessageBoxContainer.setName("menu-message-box"); this.menuMessageBoxContainer.setVisible(false); // Window for general messages - this.menuMessageBox = addWindow(this.scene, 0, 0, this.defaultMessageBoxWidth, 48); + this.menuMessageBox = addWindow(0, 0, this.defaultMessageBoxWidth, 48); this.menuMessageBox.setOrigin(0, 0); this.menuMessageBoxContainer.add(this.menuMessageBox); // Full-width window used for testing dialog messages in debug mode - this.dialogueMessageBox = addWindow(this.scene, -this.textPadding, 0, this.scene.game.canvas.width / 6 + this.textPadding * 2, 49, false, false, 0, 0, WindowVariant.THIN); + this.dialogueMessageBox = addWindow( + -this.textPadding, + 0, + globalScene.game.canvas.width / 6 + this.textPadding * 2, + 49, + false, + false, + 0, + 0, + WindowVariant.THIN, + ); this.dialogueMessageBox.setOrigin(0, 0); this.menuMessageBoxContainer.add(this.dialogueMessageBox); - const menuMessageText = addTextObject(this.scene, this.textPadding, this.textPadding, "", TextStyle.WINDOW, { maxLines: 2 }); + const menuMessageText = addTextObject(this.textPadding, this.textPadding, "", TextStyle.WINDOW, { maxLines: 2 }); menuMessageText.setName("menu-message"); menuMessageText.setOrigin(0, 0); this.menuMessageBoxContainer.add(menuMessageText); @@ -170,29 +203,36 @@ export default class MenuUiHandler extends MessageUiHandler { const manageDataOptions: any[] = []; // TODO: proper type - const confirmSlot = (message: string, slotFilter: (i: integer) => boolean, callback: (i: integer) => void) => { + const confirmSlot = (message: string, slotFilter: (i: number) => boolean, callback: (i: number) => void) => { ui.revertMode(); ui.showText(message, null, () => { const config: OptionSelectConfig = { - options: new Array(5).fill(null).map((_, i) => i).filter(slotFilter).map(i => { - return { - label: i18next.t("menuUiHandler:slot", { slotNumber: i + 1 }), - handler: () => { - callback(i); - ui.revertMode(); - ui.showText("", 0); - return true; - } - }; - }).concat([{ - label: i18next.t("menuUiHandler:cancel"), - handler: () => { - ui.revertMode(); - ui.showText("", 0); - return true; - } - }]), - xOffset: 98 + options: new Array(5) + .fill(null) + .map((_, i) => i) + .filter(slotFilter) + .map(i => { + return { + label: i18next.t("menuUiHandler:slot", { slotNumber: i + 1 }), + handler: () => { + callback(i); + ui.revertMode(); + ui.showText("", 0); + return true; + }, + }; + }) + .concat([ + { + label: i18next.t("menuUiHandler:cancel"), + handler: () => { + ui.revertMode(); + ui.showText("", 0); + return true; + }, + }, + ]), + xOffset: 98, }; ui.setOverlayMode(Mode.MENU_OPTION_SELECT, config); }); @@ -202,84 +242,94 @@ export default class MenuUiHandler extends MessageUiHandler { manageDataOptions.push({ label: i18next.t("menuUiHandler:importSession"), handler: () => { - confirmSlot(i18next.t("menuUiHandler:importSlotSelect"), () => true, slotId => this.scene.gameData.importData(GameDataType.SESSION, slotId)); + confirmSlot( + i18next.t("menuUiHandler:importSlotSelect"), + () => true, + slotId => globalScene.gameData.importData(GameDataType.SESSION, slotId), + ); return true; }, - keepOpen: true + keepOpen: true, }); } manageDataOptions.push({ label: i18next.t("menuUiHandler:exportSession"), handler: () => { - const dataSlots: integer[] = []; + const dataSlots: number[] = []; Promise.all( new Array(5).fill(null).map((_, i) => { const slotId = i; - return this.scene.gameData.getSession(slotId).then(data => { + return globalScene.gameData.getSession(slotId).then(data => { if (data) { dataSlots.push(slotId); } }); - })).then(() => { - confirmSlot(i18next.t("menuUiHandler:exportSlotSelect"), + }), + ).then(() => { + confirmSlot( + i18next.t("menuUiHandler:exportSlotSelect"), i => dataSlots.indexOf(i) > -1, - slotId => this.scene.gameData.tryExportData(GameDataType.SESSION, slotId)); + slotId => globalScene.gameData.tryExportData(GameDataType.SESSION, slotId), + ); }); return true; }, - keepOpen: true + keepOpen: true, }); manageDataOptions.push({ label: i18next.t("menuUiHandler:importRunHistory"), handler: () => { - this.scene.gameData.importData(GameDataType.RUN_HISTORY); + globalScene.gameData.importData(GameDataType.RUN_HISTORY); return true; }, - keepOpen: true + keepOpen: true, }); manageDataOptions.push({ label: i18next.t("menuUiHandler:exportRunHistory"), handler: () => { - this.scene.gameData.tryExportData(GameDataType.RUN_HISTORY); + globalScene.gameData.tryExportData(GameDataType.RUN_HISTORY); return true; }, - keepOpen: true + keepOpen: true, }); if (Utils.isLocal || Utils.isBeta) { manageDataOptions.push({ label: i18next.t("menuUiHandler:importData"), handler: () => { ui.revertMode(); - this.scene.gameData.importData(GameDataType.SYSTEM); + globalScene.gameData.importData(GameDataType.SYSTEM); return true; }, - keepOpen: true + keepOpen: true, }); } - manageDataOptions.push({ - label: i18next.t("menuUiHandler:exportData"), - handler: () => { - this.scene.gameData.tryExportData(GameDataType.SYSTEM); - return true; + manageDataOptions.push( + { + label: i18next.t("menuUiHandler:exportData"), + handler: () => { + globalScene.gameData.tryExportData(GameDataType.SYSTEM); + return true; + }, + keepOpen: true, }, - keepOpen: true - }, - { - label: i18next.t("menuUiHandler:consentPreferences"), - handler: () => { - const consentLink = document.querySelector(".termly-display-preferences") as HTMLInputElement; - const clickEvent = new MouseEvent("click", { - view: window, - bubbles: true, - cancelable: true - }); - consentLink.dispatchEvent(clickEvent); - consentLink.focus(); - return true; + { + label: i18next.t("menuUiHandler:consentPreferences"), + handler: () => { + const consentLink = document.querySelector(".termly-display-preferences") as HTMLInputElement; + const clickEvent = new MouseEvent("click", { + view: window, + bubbles: true, + cancelable: true, + }); + consentLink.dispatchEvent(clickEvent); + consentLink.focus(); + return true; + }, + keepOpen: true, }, - keepOpen: true - }); - if (Utils.isLocal || Utils.isBeta) { // this should make sure we don't have this option in live + ); + if (Utils.isLocal || Utils.isBeta) { + // this should make sure we don't have this option in live manageDataOptions.push({ label: "Test Dialogue", handler: () => { @@ -297,7 +347,7 @@ export default class MenuUiHandler extends MessageUiHandler { const interpolatorOptions: any = {}; const splitArr = dialogueName.split(" "); // this splits our inputted text into words to cycle through later const translatedString = splitArr[0]; // this is our outputted i18 string - const regex = RegExp("\\{\\{(\\w*)\\}\\}", "g"); // this is a regex expression to find all the text between {{ }} in the i18 output + const regex = /\{\{(\w*)\}\}/g; // this is a regex expression to find all the text between {{ }} in the i18 output const matches = i18next.t(translatedString).match(regex) ?? []; if (matches.length > 0) { for (let match = 0; match < matches.length; match++) { @@ -310,36 +360,43 @@ export default class MenuUiHandler extends MessageUiHandler { } // Switch to the dialog test window this.setDialogTestMode(true); - ui.showText(String(i18next.t(translatedString, interpolatorOptions)), null, () => this.scene.ui.showText("", 0, () => { - handler.tutorialActive = false; - // Go back to the default message window - this.setDialogTestMode(false); - }), null, true); + ui.showText( + String(i18next.t(translatedString, interpolatorOptions)), + null, + () => + globalScene.ui.showText("", 0, () => { + handler.tutorialActive = false; + // Go back to the default message window + this.setDialogTestMode(false); + }), + null, + true, + ); }, () => { ui.revertMode(); - } + }, ]; ui.setMode(Mode.TEST_DIALOGUE, buttonAction, prefilledText); return true; }, - keepOpen: true + keepOpen: true, }); } manageDataOptions.push({ label: i18next.t("menuUiHandler:cancel"), handler: () => { - this.scene.ui.revertMode(); + globalScene.ui.revertMode(); return true; }, - keepOpen: true + keepOpen: true, }); //Thank you Vassiat this.manageDataConfig = { xOffset: 98, options: manageDataOptions, - maxOptions: 7 + maxOptions: 7, }; const communityOptions: OptionSelectItem[] = [ @@ -349,7 +406,7 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(wikiUrl, "_blank")?.focus(); return true; }, - keepOpen: true + keepOpen: true, }, { label: "Discord", @@ -357,7 +414,7 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(discordUrl, "_blank")?.focus(); return true; }, - keepOpen: true + keepOpen: true, }, { label: "GitHub", @@ -365,7 +422,7 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(githubUrl, "_blank")?.focus(); return true; }, - keepOpen: true + keepOpen: true, }, { label: "Reddit", @@ -373,7 +430,7 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(redditUrl, "_blank")?.focus(); return true; }, - keepOpen: true + keepOpen: true, }, { label: i18next.t("menuUiHandler:donate"), @@ -381,64 +438,70 @@ export default class MenuUiHandler extends MessageUiHandler { window.open(donateUrl, "_blank")?.focus(); return true; }, - keepOpen: true - } + keepOpen: true, + }, ]; if (!bypassLogin && loggedInUser?.hasAdminRole) { communityOptions.push({ label: "Admin", handler: () => { - - const skippedAdminModes: AdminMode[] = [ AdminMode.ADMIN ]; // this is here so that we can skip the menu populating enums that aren't meant for the menu, such as the AdminMode.ADMIN + const skippedAdminModes: AdminMode[] = [AdminMode.ADMIN]; // this is here so that we can skip the menu populating enums that aren't meant for the menu, such as the AdminMode.ADMIN const options: OptionSelectItem[] = []; - Object.values(AdminMode).filter((v) => !isNaN(Number(v)) && !skippedAdminModes.includes(v as AdminMode)).forEach((mode) => { // this gets all the enums in a way we can use - options.push({ - label: getAdminModeName(mode as AdminMode), - handler: () => { - ui.playSelect(); - ui.setOverlayMode(Mode.ADMIN, { - buttonActions: [ - // we double revert here and below to go back 2 layers of menus - () => { - ui.revertMode(); - ui.revertMode(); + Object.values(AdminMode) + .filter(v => !Number.isNaN(Number(v)) && !skippedAdminModes.includes(v as AdminMode)) + .forEach(mode => { + // this gets all the enums in a way we can use + options.push({ + label: getAdminModeName(mode as AdminMode), + handler: () => { + ui.playSelect(); + ui.setOverlayMode( + Mode.ADMIN, + { + buttonActions: [ + // we double revert here and below to go back 2 layers of menus + () => { + ui.revertMode(); + ui.revertMode(); + }, + () => { + ui.revertMode(); + ui.revertMode(); + }, + ], }, - () => { - ui.revertMode(); - ui.revertMode(); - } - ] - }, mode); // mode is our AdminMode enum - return true; - } + mode, + ); // mode is our AdminMode enum + return true; + }, + }); }); - }); options.push({ label: "Cancel", handler: () => { ui.revertMode(); return true; - } + }, }); - this.scene.ui.setOverlayMode(Mode.OPTION_SELECT, { + globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options, - delay: 0 + delay: 0, }); return true; }, - keepOpen: true + keepOpen: true, }); } communityOptions.push({ label: i18next.t("menuUiHandler:cancel"), handler: () => { - this.scene.ui.revertMode(); + globalScene.ui.revertMode(); return true; - } + }, }); this.communityConfig = { xOffset: 98, - options: communityOptions + options: communityOptions, }; this.setCursor(0); } @@ -448,7 +511,7 @@ export default class MenuUiHandler extends MessageUiHandler { super.show(args); this.menuOptions = Utils.getEnumKeys(MenuOptions) - .map(m => parseInt(MenuOptions[m]) as MenuOptions) + .map(m => Number.parseInt(MenuOptions[m]) as MenuOptions) .filter(m => { return !this.excludedMenus().some(exclusion => exclusion.condition && exclusion.options.includes(m)); }); @@ -460,16 +523,15 @@ export default class MenuUiHandler extends MessageUiHandler { this.getUi().hideTooltip(); - this.scene.playSound("ui/menu_open"); + globalScene.playSound("ui/menu_open"); // Make sure the tutorial overlay sits above everything, but below the message box this.menuContainer.bringToTop(this.tutorialOverlay); this.menuContainer.bringToTop(this.menuMessageBoxContainer); - handleTutorial(this.scene, Tutorial.Menu); + handleTutorial(Tutorial.Menu); this.bgmBar.toggleBgmBar(true); - return true; } @@ -506,12 +568,8 @@ export default class MenuUiHandler extends MessageUiHandler { ui.setOverlayMode(Mode.GAME_STATS); success = true; break; - case MenuOptions.RUN_HISTORY: - ui.setOverlayMode(Mode.RUN_HISTORY); - success = true; - break; case MenuOptions.EGG_LIST: - if (this.scene.gameData.eggs.length) { + if (globalScene.gameData.eggs.length) { ui.revertMode(); ui.setOverlayMode(Mode.EGG_LIST); success = true; @@ -525,11 +583,28 @@ export default class MenuUiHandler extends MessageUiHandler { ui.setOverlayMode(Mode.EGG_GACHA); success = true; break; + case MenuOptions.POKEDEX: + ui.revertMode(); + ui.setOverlayMode(Mode.POKEDEX); + success = true; + break; case MenuOptions.MANAGE_DATA: - if (!bypassLogin && !this.manageDataConfig.options.some(o => o.label === i18next.t("menuUiHandler:linkDiscord") || o.label === i18next.t("menuUiHandler:unlinkDiscord"))) { - this.manageDataConfig.options.splice(this.manageDataConfig.options.length - 1, 0, + if ( + !bypassLogin && + !this.manageDataConfig.options.some( + o => + o.label === i18next.t("menuUiHandler:linkDiscord") || + o.label === i18next.t("menuUiHandler:unlinkDiscord"), + ) + ) { + this.manageDataConfig.options.splice( + this.manageDataConfig.options.length - 1, + 0, { - label: loggedInUser?.discordId === "" ? i18next.t("menuUiHandler:linkDiscord") : i18next.t("menuUiHandler:unlinkDiscord"), + label: + loggedInUser?.discordId === "" + ? i18next.t("menuUiHandler:linkDiscord") + : i18next.t("menuUiHandler:unlinkDiscord"), handler: () => { if (loggedInUser?.discordId === "") { const token = Utils.getCookie(Utils.sessionIdKey); @@ -538,19 +613,18 @@ export default class MenuUiHandler extends MessageUiHandler { const discordUrl = `https://discord.com/api/oauth2/authorize?client_id=${discordId}&redirect_uri=${redirectUri}&response_type=code&scope=identify&state=${token}&prompt=none`; window.open(discordUrl, "_self"); return true; - } else { - Utils.apiPost("/auth/discord/logout", undefined, undefined, true).then(res => { - if (!res.ok) { - console.error(`Unlink failed (${res.status}: ${res.statusText})`); - } - updateUserInfo().then(() => this.scene.reset(true, true)); - }); - return true; } - } + pokerogueApi.unlinkDiscord().then(_isSuccess => { + updateUserInfo().then(() => globalScene.reset(true, true)); + }); + return true; + }, }, { - label: loggedInUser?.googleId === "" ? i18next.t("menuUiHandler:linkGoogle") : i18next.t("menuUiHandler:unlinkGoogle"), + label: + loggedInUser?.googleId === "" + ? i18next.t("menuUiHandler:linkGoogle") + : i18next.t("menuUiHandler:unlinkGoogle"), handler: () => { if (loggedInUser?.googleId === "") { const token = Utils.getCookie(Utils.sessionIdKey); @@ -559,17 +633,14 @@ export default class MenuUiHandler extends MessageUiHandler { const googleUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${googleId}&response_type=code&redirect_uri=${redirectUri}&scope=openid&state=${token}`; window.open(googleUrl, "_self"); return true; - } else { - Utils.apiPost("/auth/google/logout", undefined, undefined, true).then(res => { - if (!res.ok) { - console.error(`Unlink failed (${res.status}: ${res.statusText})`); - } - updateUserInfo().then(() => this.scene.reset(true, true)); - }); - return true; } - } - }); + pokerogueApi.unlinkGoogle().then(_isSuccess => { + updateUserInfo().then(() => globalScene.reset(true, true)); + }); + return true; + }, + }, + ); } ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.manageDataConfig); success = true; @@ -579,27 +650,33 @@ export default class MenuUiHandler extends MessageUiHandler { success = true; break; case MenuOptions.SAVE_AND_QUIT: - if (this.scene.currentBattle) { + if (globalScene.currentBattle) { success = true; const doSaveQuit = () => { ui.setMode(Mode.LOADING, { - buttonActions: [], fadeOut: () => - this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => { - - this.scene.reset(true); - }) + buttonActions: [], + fadeOut: () => + globalScene.gameData.saveAll(true, true, true, true).then(() => { + globalScene.reset(true); + }), }); }; - if (this.scene.currentBattle.turn > 1) { + if (globalScene.currentBattle.turn > 1) { ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { if (!this.active) { this.showText("", 0); return; } - ui.setOverlayMode(Mode.CONFIRM, doSaveQuit, () => { - ui.revertMode(); - this.showText("", 0); - }, false, -98); + ui.setOverlayMode( + Mode.CONFIRM, + doSaveQuit, + () => { + ui.revertMode(); + this.showText("", 0); + }, + false, + -98, + ); }); } else { doSaveQuit(); @@ -612,25 +689,29 @@ export default class MenuUiHandler extends MessageUiHandler { success = true; const doLogout = () => { ui.setMode(Mode.LOADING, { - buttonActions: [], fadeOut: () => Utils.apiFetch("account/logout", true).then(res => { - if (!res.ok) { - console.error(`Log out failed (${res.status}: ${res.statusText})`); - } - Utils.removeCookie(Utils.sessionIdKey); - updateUserInfo().then(() => this.scene.reset(true, true)); - }) + buttonActions: [], + fadeOut: () => + pokerogueApi.account.logout().then(() => { + updateUserInfo().then(() => globalScene.reset(true, true)); + }), }); }; - if (this.scene.currentBattle) { + if (globalScene.currentBattle) { ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { if (!this.active) { this.showText("", 0); return; } - ui.setOverlayMode(Mode.CONFIRM, doLogout, () => { - ui.revertMode(); - this.showText("", 0); - }, false, -98); + ui.setOverlayMode( + Mode.CONFIRM, + doLogout, + () => { + ui.revertMode(); + this.showText("", 0); + }, + false, + -98, + ); }); } else { doLogout(); @@ -682,22 +763,31 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuMessageBox.setVisible(!isDialogMode); this.dialogueMessageBox.setVisible(isDialogMode); // If we're testing dialog, we use the same word wrapping as the battle message handler - this.message.setWordWrapWidth(isDialogMode ? this.scene.ui.getMessageHandler().wordWrapWidth : this.defaultWordWrapWidth); + this.message.setWordWrapWidth( + isDialogMode ? globalScene.ui.getMessageHandler().wordWrapWidth : this.defaultWordWrapWidth, + ); this.message.setX(isDialogMode ? this.textPadding + 1 : this.textPadding); this.message.setY(isDialogMode ? this.textPadding + 0.4 : this.textPadding); } - showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number): void { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ): void { this.menuMessageBoxContainer.setVisible(!!text); super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, "cursor"); + this.cursorObj = globalScene.add.image(0, 0, "cursor"); this.cursorObj.setOrigin(0, 0); this.menuContainer.add(this.cursorObj); } diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 5ae4707e329..50522152021 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -1,7 +1,7 @@ -import BattleScene from "../battle-scene"; import AwaitableUiHandler from "./awaitable-ui-handler"; -import { Mode } from "./ui"; +import type { Mode } from "./ui"; import * as Utils from "../utils"; +import { globalScene } from "#app/global-scene"; export default abstract class MessageUiHandler extends AwaitableUiHandler { protected textTimer: Phaser.Time.TimerEvent | null; @@ -11,8 +11,8 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { public message: Phaser.GameObjects.Text; public prompt: Phaser.GameObjects.Sprite; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); this.pendingPrompt = false; } @@ -23,7 +23,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { */ initPromptSprite(container: Phaser.GameObjects.Container) { if (!this.prompt) { - const promptSprite = this.scene.add.sprite(0, 0, "prompt"); + const promptSprite = globalScene.add.sprite(0, 0, "prompt"); promptSprite.setVisible(false); promptSprite.setOrigin(0, 0); this.prompt = promptSprite; @@ -34,24 +34,46 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } } - showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { + showText( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { this.showTextInternal(text, delay, callback, callbackDelay, prompt, promptDelay); } - showDialogue(text: string, name?: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { + showDialogue( + text: string, + _name?: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { this.showTextInternal(text, delay, callback, callbackDelay, prompt, promptDelay); } - private showTextInternal(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { + private showTextInternal( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { if (delay === null || delay === undefined) { delay = 20; } // Pattern matching regex that checks for @c{}, @f{}, @s{}, and @f{} patterns within message text and parses them to their respective behaviors. - const charVarMap = new Map(); - const delayMap = new Map(); - const soundMap = new Map(); - const fadeMap = new Map(); + const charVarMap = new Map(); + const delayMap = new Map(); + const soundMap = new Map(); + const fadeMap = new Map(); const actionPattern = /@(c|d|s|f)\{(.*?)\}/; let actionMatch: RegExpExecArray | null; while ((actionMatch = actionPattern.exec(text))) { @@ -60,13 +82,13 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { charVarMap.set(actionMatch.index, actionMatch[2]); break; case "d": - delayMap.set(actionMatch.index, parseInt(actionMatch[2])); + delayMap.set(actionMatch.index, Number.parseInt(actionMatch[2])); break; case "s": soundMap.set(actionMatch.index, actionMatch[2]); break; case "f": - fadeMap.set(actionMatch.index, parseInt(actionMatch[2])); + fadeMap.set(actionMatch.index, Number.parseInt(actionMatch[2])); break; } text = text.slice(0, actionMatch.index) + text.slice(actionMatch.index + actionMatch[2].length + 4); @@ -108,7 +130,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { callback = () => { const showPrompt = () => this.showPrompt(originalCallback, callbackDelay); if (promptDelay) { - this.scene.time.delayedCall(promptDelay, showPrompt); + globalScene.time.delayedCall(promptDelay, showPrompt); } else { showPrompt(); } @@ -119,10 +141,10 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { if (prompt) { this.pendingPrompt = true; } - this.textTimer = this.scene.time.addEvent({ + this.textTimer = globalScene.time.addEvent({ delay: delay, callback: () => { - const charIndex = text.length - (this.textTimer?.repeatCount!); // TODO: is this bang correct? + const charIndex = text.length - this.textTimer?.repeatCount!; // TODO: is this bang correct? const charVar = charVarMap.get(charIndex); const charSound = soundMap.get(charIndex); const charDelay = delayMap.get(charIndex); @@ -130,14 +152,14 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { this.message.setText(text.slice(0, charIndex)); const advance = () => { if (charVar) { - this.scene.charSprite.setVariant(charVar); + globalScene.charSprite.setVariant(charVar); } if (charSound) { - this.scene.playSound(charSound); + globalScene.playSound(charSound); } if (callback && !this.textTimer?.repeatCount) { if (callbackDelay && !prompt) { - this.textCallbackTimer = this.scene.time.delayedCall(callbackDelay, () => { + this.textCallbackTimer = globalScene.time.delayedCall(callbackDelay, () => { if (this.textCallbackTimer) { this.textCallbackTimer.destroy(); this.textCallbackTimer = null; @@ -151,20 +173,20 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { }; if (charDelay) { this.textTimer!.paused = true; // TODO: is the bang correct? - this.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ duration: Utils.getFrameMs(charDelay), onComplete: () => { this.textTimer!.paused = false; // TODO: is the bang correct? advance(); - } + }, }); } else if (charFade) { this.textTimer!.paused = true; - this.scene.time.delayedCall(150, () => { - this.scene.ui.fadeOut(750).then(() => { + globalScene.time.delayedCall(150, () => { + globalScene.ui.fadeOut(750).then(() => { const delay = Utils.getFrameMs(charFade); - this.scene.time.delayedCall(delay, () => { - this.scene.ui.fadeIn(500).then(() => { + globalScene.time.delayedCall(delay, () => { + globalScene.ui.fadeIn(500).then(() => { this.textTimer!.paused = false; advance(); }); @@ -175,7 +197,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { advance(); } }, - repeat: text.length + repeat: text.length, }); } else { this.message.setText(text); @@ -188,11 +210,13 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } } - showPrompt(callback?: Function | null, callbackDelay?: integer | null) { + showPrompt(callback?: Function | null, callbackDelay?: number | null) { const wrappedTextLines = this.message.runWordWrap(this.message.text).split(/\n/g); const textLinesCount = wrappedTextLines.length; const lastTextLine = wrappedTextLines[wrappedTextLines.length - 1]; - const lastLineTest = this.scene.add.text(0, 0, lastTextLine, { font: "96px emerald" }); + const lastLineTest = globalScene.add.text(0, 0, lastTextLine, { + font: "96px emerald", + }); lastLineTest.setScale(this.message.scale); const lastLineWidth = lastLineTest.displayWidth; lastLineTest.destroy(); @@ -209,7 +233,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } if (callback) { if (callbackDelay) { - this.textCallbackTimer = this.scene.time.delayedCall(callbackDelay, () => { + this.textCallbackTimer = globalScene.time.delayedCall(callbackDelay, () => { if (this.textCallbackTimer) { this.textCallbackTimer.destroy(); this.textCallbackTimer = null; diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 79f1e8afeed..b7dbbeb202d 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -1,9 +1,9 @@ -import BattleScene from "../battle-scene"; import { TextStyle, addTextObject } from "./text"; -import { Mode } from "./ui"; +import type { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { WindowVariant, addWindow } from "./ui-theme"; -import { Button } from "#enums/buttons"; +import type { Button } from "#enums/buttons"; +import { globalScene } from "#app/global-scene"; export interface ModalConfig { buttonActions: Function[]; @@ -17,8 +17,8 @@ export abstract class ModalUiHandler extends UiHandler { protected buttonBgs: Phaser.GameObjects.NineSlice[]; protected buttonLabels: Phaser.GameObjects.Text[]; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); this.buttonContainers = []; this.buttonBgs = []; @@ -42,15 +42,18 @@ export abstract class ModalUiHandler extends UiHandler { setup() { const ui = this.getUi(); - this.modalContainer = this.scene.add.container(0, 0); + this.modalContainer = globalScene.add.container(0, 0); - this.modalContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.modalContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - this.modalBg = addWindow(this.scene, 0, 0, 0, 0); + this.modalBg = addWindow(0, 0, 0, 0); this.modalContainer.add(this.modalBg); - this.titleText = addTextObject(this.scene, 0, 4, "", TextStyle.SETTINGS_LABEL); + this.titleText = addTextObject(0, 4, "", TextStyle.SETTINGS_LABEL); this.titleText.setOrigin(0.5, 0); this.modalContainer.add(this.titleText); @@ -68,14 +71,17 @@ export abstract class ModalUiHandler extends UiHandler { private addButton(label: string) { const buttonTopMargin = this.getButtonTopMargin(); - const buttonLabel = addTextObject(this.scene, 0, 8, label, TextStyle.TOOLTIP_CONTENT); + const buttonLabel = addTextObject(0, 8, label, TextStyle.TOOLTIP_CONTENT); buttonLabel.setOrigin(0.5, 0.5); - const buttonBg = addWindow(this.scene, 0, 0, buttonLabel.getBounds().width + 8, 16, false, false, 0, 0, WindowVariant.THIN); + const buttonBg = addWindow(0, 0, buttonLabel.getBounds().width + 8, 16, false, false, 0, 0, WindowVariant.THIN); buttonBg.setOrigin(0.5, 0); - buttonBg.setInteractive(new Phaser.Geom.Rectangle(0, 0, buttonBg.width, buttonBg.height), Phaser.Geom.Rectangle.Contains); + buttonBg.setInteractive( + new Phaser.Geom.Rectangle(0, 0, buttonBg.width, buttonBg.height), + Phaser.Geom.Rectangle.Contains, + ); - const buttonContainer = this.scene.add.container(0, buttonTopMargin); + const buttonContainer = globalScene.add.container(0, buttonTopMargin); this.buttonLabels.push(buttonLabel); this.buttonBgs.push(buttonBg); @@ -93,9 +99,15 @@ export abstract class ModalUiHandler extends UiHandler { if (args.length >= 1 && "buttonActions" in args[0]) { super.show(args); if (args[0].hasOwnProperty("fadeOut") && typeof args[0].fadeOut === "function") { - const [ marginTop, marginRight, marginBottom, marginLeft ] = this.getMargin(); + const [marginTop, marginRight, marginBottom, marginLeft] = this.getMargin(); - const overlay = this.scene.add.rectangle(( this.getWidth() + marginLeft + marginRight) / 2, (this.getHeight() + marginTop + marginBottom) / 2, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0); + const overlay = globalScene.add.rectangle( + (this.getWidth() + marginLeft + marginRight) / 2, + (this.getHeight() + marginTop + marginBottom) / 2, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0, + ); overlay.setOrigin(0.5, 0.5); overlay.setName("rect-ui-overlay-modal"); overlay.setAlpha(0); @@ -103,12 +115,12 @@ export abstract class ModalUiHandler extends UiHandler { this.modalContainer.add(overlay); this.modalContainer.moveTo(overlay, 0); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: overlay, alpha: 1, duration: 250, ease: "Sine.easeOut", - onComplete: args[0].fadeOut + onComplete: args[0].fadeOut, }); } @@ -122,7 +134,7 @@ export abstract class ModalUiHandler extends UiHandler { for (let a = 0; a < this.buttonBgs.length; a++) { if (a < this.buttonBgs.length) { - this.buttonBgs[a].on("pointerdown", (_) => config.buttonActions[a]()); + this.buttonBgs[a].on("pointerdown", _ => config.buttonActions[a]()); } } @@ -133,10 +145,13 @@ export abstract class ModalUiHandler extends UiHandler { } updateContainer(config?: ModalConfig): void { - const [ marginTop, marginRight, marginBottom, marginLeft ] = this.getMargin(config); + const [marginTop, marginRight, marginBottom, marginLeft] = this.getMargin(config); - const [ width, height ] = [ this.getWidth(config), this.getHeight(config) ]; - this.modalContainer.setPosition((((this.scene.game.canvas.width / 6) - (width + (marginRight - marginLeft))) / 2), (((-this.scene.game.canvas.height / 6) - (height + (marginBottom - marginTop))) / 2)); + const [width, height] = [this.getWidth(config), this.getHeight(config)]; + this.modalContainer.setPosition( + (globalScene.game.canvas.width / 6 - (width + (marginRight - marginLeft))) / 2, + (-globalScene.game.canvas.height / 6 - (height + (marginBottom - marginTop))) / 2, + ); this.modalBg.setSize(width, height); @@ -153,7 +168,7 @@ export abstract class ModalUiHandler extends UiHandler { } } - processInput(button: Button): boolean { + processInput(_button: Button): boolean { return false; } @@ -168,7 +183,9 @@ export abstract class ModalUiHandler extends UiHandler { * Adds a hover effect to a game object which changes the cursor to a `pointer` and tints it slighly * @param gameObject the game object to add hover events/effects to */ - protected addInteractionHoverEffect(gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.NineSlice | Phaser.GameObjects.Sprite) { + protected addInteractionHoverEffect( + gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.NineSlice | Phaser.GameObjects.Sprite, + ) { gameObject.on("pointerover", () => { this.setMouseCursorStyle("pointer"); gameObject.setTint(0xbbbbbb); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 3f89ebe415f..e5d8f858782 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -1,6 +1,7 @@ -import BattleScene from "../battle-scene"; -import { getPlayerShopModifierTypeOptionsForWave, ModifierTypeOption, TmModifierType } from "../modifier/modifier-type"; -import { getPokeballAtlasKey, PokeballType } from "../data/pokeball"; +import { globalScene } from "#app/global-scene"; +import type { ModifierTypeOption } from "../modifier/modifier-type"; +import { getPlayerShopModifierTypeOptionsForWave, TmModifierType } from "../modifier/modifier-type"; +import { getPokeballAtlasKey } from "#app/data/pokeball"; import { addTextObject, getTextStyleOptions, getModifierTierTextTint, getTextColor, TextStyle } from "./text"; import AwaitableUiHandler from "./awaitable-ui-handler"; import { Mode } from "./ui"; @@ -8,13 +9,14 @@ import { LockModifierTiersModifier, PokemonHeldItemModifier, HealShopCostModifie import { handleTutorial, Tutorial } from "../tutorial"; import { Button } from "#enums/buttons"; import MoveInfoOverlay from "./move-info-overlay"; -import { allMoves } from "../data/move"; +import { allMoves } from "../data/moves/move"; import * as Utils from "./../utils"; import Overrides from "#app/overrides"; import i18next from "i18next"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; -import { IntegerHolder } from "./../utils"; +import { NumberHolder } from "./../utils"; import Phaser from "phaser"; +import type { PokeballType } from "#enums/pokeball"; export const SHOP_OPTIONS_ROW_LIMIT = 7; const SINGLE_SHOP_ROW_YOFFSET = 12; @@ -31,25 +33,25 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { private rerollCostText: Phaser.GameObjects.Text; private lockRarityButtonText: Phaser.GameObjects.Text; private moveInfoOverlay: MoveInfoOverlay; - private moveInfoOverlayActive: boolean = false; + private moveInfoOverlayActive = false; - private rowCursor: integer = 0; + private rowCursor = 0; private player: boolean; /** * If reroll cost is negative, it is assumed there are 0 items in the shop. * It will cause reroll button to be disabled, and a "Continue" button to show in the place of shop items */ - private rerollCost: integer; - private transferButtonWidth: integer; - private checkButtonWidth: integer; + private rerollCost: number; + private transferButtonWidth: number; + private checkButtonWidth: number; public options: ModifierOption[]; public shopOptionsRows: ModifierOption[][]; private cursorObj: Phaser.GameObjects.Image | null; - constructor(scene: BattleScene) { - super(scene, Mode.CONFIRM); + constructor() { + super(Mode.CONFIRM); this.options = []; this.shopOptionsRows = []; @@ -58,12 +60,12 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { setup() { const ui = this.getUi(); - this.modifierContainer = this.scene.add.container(0, 0); + this.modifierContainer = globalScene.add.container(0, 0); ui.add(this.modifierContainer); const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); - const styleOptions = getTextStyleOptions(TextStyle.PARTY, (this.scene as BattleScene).uiTheme).styleOptions; + const styleOptions = getTextStyleOptions(TextStyle.PARTY, globalScene.uiTheme).styleOptions; if (context) { context.font = styleOptions.fontSize + "px " + styleOptions.fontFamily; @@ -71,78 +73,96 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.checkButtonWidth = context.measureText(i18next.t("modifierSelectUiHandler:checkTeam")).width; } - this.transferButtonContainer = this.scene.add.container((this.scene.game.canvas.width - this.checkButtonWidth) / 6 - 21, OPTION_BUTTON_YPOSITION); + this.transferButtonContainer = globalScene.add.container( + (globalScene.game.canvas.width - this.checkButtonWidth) / 6 - 21, + OPTION_BUTTON_YPOSITION, + ); this.transferButtonContainer.setName("transfer-btn"); this.transferButtonContainer.setVisible(false); ui.add(this.transferButtonContainer); - const transferButtonText = addTextObject(this.scene, -4, -2, i18next.t("modifierSelectUiHandler:transfer"), TextStyle.PARTY); + const transferButtonText = addTextObject(-4, -2, i18next.t("modifierSelectUiHandler:transfer"), TextStyle.PARTY); transferButtonText.setName("text-transfer-btn"); transferButtonText.setOrigin(1, 0); this.transferButtonContainer.add(transferButtonText); - this.checkButtonContainer = this.scene.add.container((this.scene.game.canvas.width) / 6 - 1, OPTION_BUTTON_YPOSITION); + this.checkButtonContainer = globalScene.add.container( + globalScene.game.canvas.width / 6 - 1, + OPTION_BUTTON_YPOSITION, + ); this.checkButtonContainer.setName("use-btn"); this.checkButtonContainer.setVisible(false); ui.add(this.checkButtonContainer); - const checkButtonText = addTextObject(this.scene, -4, -2, i18next.t("modifierSelectUiHandler:checkTeam"), TextStyle.PARTY); + const checkButtonText = addTextObject(-4, -2, i18next.t("modifierSelectUiHandler:checkTeam"), TextStyle.PARTY); checkButtonText.setName("text-use-btn"); checkButtonText.setOrigin(1, 0); this.checkButtonContainer.add(checkButtonText); - this.rerollButtonContainer = this.scene.add.container(16, OPTION_BUTTON_YPOSITION); + this.rerollButtonContainer = globalScene.add.container(16, OPTION_BUTTON_YPOSITION); this.rerollButtonContainer.setName("reroll-brn"); this.rerollButtonContainer.setVisible(false); ui.add(this.rerollButtonContainer); - const rerollButtonText = addTextObject(this.scene, -4, -2, i18next.t("modifierSelectUiHandler:reroll"), TextStyle.PARTY); + const rerollButtonText = addTextObject(-4, -2, i18next.t("modifierSelectUiHandler:reroll"), TextStyle.PARTY); rerollButtonText.setName("text-reroll-btn"); rerollButtonText.setOrigin(0, 0); this.rerollButtonContainer.add(rerollButtonText); - this.rerollCostText = addTextObject(this.scene, 0, 0, "", TextStyle.MONEY); + this.rerollCostText = addTextObject(0, 0, "", TextStyle.MONEY); this.rerollCostText.setName("text-reroll-cost"); this.rerollCostText.setOrigin(0, 0); this.rerollCostText.setPositionRelative(rerollButtonText, rerollButtonText.displayWidth + 5, 1); this.rerollButtonContainer.add(this.rerollCostText); - this.lockRarityButtonContainer = this.scene.add.container(16, OPTION_BUTTON_YPOSITION); + this.lockRarityButtonContainer = globalScene.add.container(16, OPTION_BUTTON_YPOSITION); this.lockRarityButtonContainer.setVisible(false); ui.add(this.lockRarityButtonContainer); - this.lockRarityButtonText = addTextObject(this.scene, -4, -2, i18next.t("modifierSelectUiHandler:lockRarities"), TextStyle.PARTY); + this.lockRarityButtonText = addTextObject( + -4, + -2, + i18next.t("modifierSelectUiHandler:lockRarities"), + TextStyle.PARTY, + ); this.lockRarityButtonText.setOrigin(0, 0); this.lockRarityButtonContainer.add(this.lockRarityButtonText); - this.continueButtonContainer = this.scene.add.container((this.scene.game.canvas.width / 12), -(this.scene.game.canvas.height / 12)); + this.continueButtonContainer = globalScene.add.container( + globalScene.game.canvas.width / 12, + -(globalScene.game.canvas.height / 12), + ); this.continueButtonContainer.setVisible(false); ui.add(this.continueButtonContainer); // Create continue button - const continueButtonText = addTextObject(this.scene, -24, 5, i18next.t("modifierSelectUiHandler:continueNextWaveButton"), TextStyle.MESSAGE); + const continueButtonText = addTextObject( + -24, + 5, + i18next.t("modifierSelectUiHandler:continueNextWaveButton"), + TextStyle.MESSAGE, + ); continueButtonText.setName("text-continue-btn"); this.continueButtonContainer.add(continueButtonText); // prepare move overlay const overlayScale = 1; - this.moveInfoOverlay = new MoveInfoOverlay(this.scene, { + this.moveInfoOverlay = new MoveInfoOverlay({ delayVisibility: true, scale: overlayScale, onSide: true, right: true, x: 1, y: -MoveInfoOverlay.getHeight(overlayScale, true) - 1, - width: (this.scene.game.canvas.width / 6) - 2, + width: globalScene.game.canvas.width / 6 - 2, }); ui.add(this.moveInfoOverlay); // register the overlay to receive toggle events - this.scene.addInfoToggle(this.moveInfoOverlay); + globalScene.addInfoToggle(this.moveInfoOverlay); } show(args: any[]): boolean { - - this.scene.disableMenu = false; + globalScene.disableMenu = false; if (this.active) { if (args.length >= 3) { @@ -153,7 +173,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { return false; } - if (args.length !== 4 || !(args[1] instanceof Array) || !(args[2] instanceof Function)) { + if (args.length !== 4 || !Array.isArray(args[1]) || !(args[2] instanceof Function)) { return false; } @@ -163,8 +183,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.player = args[0]; - const partyHasHeldItem = this.player && !!this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferable).length; - const canLockRarities = !!this.scene.findModifier(m => m instanceof LockModifierTiersModifier); + const partyHasHeldItem = + this.player && !!globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferable).length; + const canLockRarities = !!globalScene.findModifier(m => m instanceof LockModifierTiersModifier); this.transferButtonContainer.setVisible(false); this.transferButtonContainer.setAlpha(0); @@ -183,24 +204,29 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.rerollButtonContainer.setPositionRelative(this.lockRarityButtonContainer, 0, canLockRarities ? -12 : 0); - this.rerollCost = args[3] as integer; + this.rerollCost = args[3] as number; this.updateRerollCostText(); const typeOptions = args[1] as ModifierTypeOption[]; - const removeHealShop = this.scene.gameMode.hasNoShop; - const baseShopCost = new IntegerHolder(this.scene.getWaveMoneyAmount(1)); - this.scene.applyModifier(HealShopCostModifier, true, baseShopCost); + const removeHealShop = globalScene.gameMode.hasNoShop; + const baseShopCost = new NumberHolder(globalScene.getWaveMoneyAmount(1)); + globalScene.applyModifier(HealShopCostModifier, true, baseShopCost); const shopTypeOptions = !removeHealShop - ? getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, baseShopCost.value) + ? getPlayerShopModifierTypeOptionsForWave(globalScene.currentBattle.waveIndex, baseShopCost.value) : []; - const optionsYOffset = shopTypeOptions.length > SHOP_OPTIONS_ROW_LIMIT ? -SINGLE_SHOP_ROW_YOFFSET : -DOUBLE_SHOP_ROW_YOFFSET; + const optionsYOffset = + shopTypeOptions.length > SHOP_OPTIONS_ROW_LIMIT ? -SINGLE_SHOP_ROW_YOFFSET : -DOUBLE_SHOP_ROW_YOFFSET; for (let m = 0; m < typeOptions.length; m++) { - const sliceWidth = (this.scene.game.canvas.width / 6) / (typeOptions.length + 2); - const option = new ModifierOption(this.scene, sliceWidth * (m + 1) + (sliceWidth * 0.5), -this.scene.game.canvas.height / 12 + optionsYOffset, typeOptions[m]); + const sliceWidth = globalScene.game.canvas.width / 6 / (typeOptions.length + 2); + const option = new ModifierOption( + sliceWidth * (m + 1) + sliceWidth * 0.5, + -globalScene.game.canvas.height / 12 + optionsYOffset, + typeOptions[m], + ); option.setScale(0.5); - this.scene.add.existing(option); + globalScene.add.existing(option); this.modifierContainer.add(option); this.options.push(option); } @@ -213,11 +239,18 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { for (let m = 0; m < shopTypeOptions.length; m++) { const row = m < SHOP_OPTIONS_ROW_LIMIT ? 0 : 1; const col = m < SHOP_OPTIONS_ROW_LIMIT ? m : m - SHOP_OPTIONS_ROW_LIMIT; - const rowOptions = shopTypeOptions.slice(row ? SHOP_OPTIONS_ROW_LIMIT : 0, row ? undefined : SHOP_OPTIONS_ROW_LIMIT); - const sliceWidth = (this.scene.game.canvas.width / 6) / (rowOptions.length + 2); - const option = new ModifierOption(this.scene, sliceWidth * (col + 1) + (sliceWidth * 0.5), ((-this.scene.game.canvas.height / 12) - (this.scene.game.canvas.height / 32) - (42 - (28 * row - 1))), shopTypeOptions[m]); + const rowOptions = shopTypeOptions.slice( + row ? SHOP_OPTIONS_ROW_LIMIT : 0, + row ? undefined : SHOP_OPTIONS_ROW_LIMIT, + ); + const sliceWidth = globalScene.game.canvas.width / 6 / (rowOptions.length + 2); + const option = new ModifierOption( + sliceWidth * (col + 1) + sliceWidth * 0.5, + -globalScene.game.canvas.height / 12 - globalScene.game.canvas.height / 32 - (42 - (28 * row - 1)), + shopTypeOptions[m], + ); option.setScale(0.375); - this.scene.add.existing(option); + globalScene.add.existing(option); this.modifierContainer.add(option); if (row >= this.shopOptionsRows.length) { @@ -229,17 +262,17 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const maxUpgradeCount = typeOptions.map(to => to.upgradeCount).reduce((max, current) => Math.max(current, max), 0); /* Force updateModifiers without pokemonSpecificModifiers */ - this.scene.getModifierBar().updateModifiers(this.scene.modifiers, true); + globalScene.getModifierBar().updateModifiers(globalScene.modifiers, true); /* Multiplies the appearance duration by the speed parameter so that it is always constant, and avoids "flashbangs" at game speed x5 */ - this.scene.showShopOverlay(750 * this.scene.gameSpeed); - this.scene.updateAndShowText(750); - this.scene.updateBiomeWaveText(); - this.scene.updateMoneyText(); + globalScene.showShopOverlay(750 * globalScene.gameSpeed); + globalScene.updateAndShowText(750); + globalScene.updateBiomeWaveText(); + globalScene.updateMoneyText(); let i = 0; - this.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ ease: "Sine.easeIn", duration: 1250, onUpdate: t => { @@ -247,26 +280,29 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const index = Math.floor(value * typeOptions.length); if (index > i && index <= typeOptions.length) { const option = this.options[i]; - option?.show(Math.floor((1 - value) * 1250) * 0.325 + 2000 * maxUpgradeCount, -(maxUpgradeCount - typeOptions[i].upgradeCount)); + option?.show( + Math.floor((1 - value) * 1250) * 0.325 + 2000 * maxUpgradeCount, + -(maxUpgradeCount - typeOptions[i].upgradeCount), + ); i++; } - } + }, }); - this.scene.time.delayedCall(1000 + maxUpgradeCount * 2000, () => { + globalScene.time.delayedCall(1000 + maxUpgradeCount * 2000, () => { for (const shopOption of this.shopOptionsRows.flat()) { shopOption.show(0, 0); } }); - this.scene.time.delayedCall(4000 + maxUpgradeCount * 2000, () => { + globalScene.time.delayedCall(4000 + maxUpgradeCount * 2000, () => { if (partyHasHeldItem) { this.transferButtonContainer.setAlpha(0); this.transferButtonContainer.setVisible(true); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.transferButtonContainer, alpha: 1, - duration: 250 + duration: 250, }); } @@ -279,34 +315,34 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.continueButtonContainer.setVisible(this.rerollCost < 0); this.lockRarityButtonContainer.setVisible(canLockRarities); - this.scene.tweens.add({ - targets: [ this.checkButtonContainer, this.continueButtonContainer ], + globalScene.tweens.add({ + targets: [this.checkButtonContainer, this.continueButtonContainer], alpha: 1, - duration: 250 + duration: 250, }); - this.scene.tweens.add({ - targets: [ this.rerollButtonContainer, this.lockRarityButtonContainer ], + globalScene.tweens.add({ + targets: [this.rerollButtonContainer, this.lockRarityButtonContainer], alpha: this.rerollCost < 0 ? 0.5 : 1, - duration: 250 + duration: 250, }); const updateCursorTarget = () => { - if (this.scene.shopCursorTarget === ShopCursorTarget.CHECK_TEAM) { + if (globalScene.shopCursorTarget === ShopCursorTarget.CHECK_TEAM) { this.setRowCursor(0); this.setCursor(2); - } else if ((this.scene.shopCursorTarget === ShopCursorTarget.SHOP) && this.scene.gameMode.hasNoShop) { + } else if (globalScene.shopCursorTarget === ShopCursorTarget.SHOP && globalScene.gameMode.hasNoShop) { this.setRowCursor(ShopCursorTarget.REWARDS); this.setCursor(0); } else { - this.setRowCursor(this.scene.shopCursorTarget); + this.setRowCursor(globalScene.shopCursorTarget); this.setCursor(0); } }; updateCursorTarget(); - handleTutorial(this.scene, Tutorial.Select_Item).then((res) => { + handleTutorial(Tutorial.Select_Item).then(res => { if (res) { updateCursorTarget(); } @@ -362,6 +398,8 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { success = this.setCursor(0); } else if (this.rowCursor < this.shopOptionsRows.length + 1) { success = this.setRowCursor(this.rowCursor + 1); + } else { + success = this.setRowCursor(0); } break; case Button.DOWN: @@ -369,13 +407,15 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { success = this.setRowCursor(this.rowCursor - 1); } else if (this.lockRarityButtonContainer.visible && this.cursor === 0) { success = this.setCursor(3); + } else { + success = this.setRowCursor(this.shopOptionsRows.length + 1); } break; case Button.LEFT: if (!this.rowCursor) { switch (this.cursor) { case 0: - success = false; + success = this.setCursor(2); break; case 1: if (this.lockRarityButtonContainer.visible) { @@ -393,11 +433,21 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { success = false; } break; + case 3: + if (this.lockRarityButtonContainer.visible) { + success = this.setCursor(2); + } else { + success = false; + } } } else if (this.cursor) { success = this.setCursor(this.cursor - 1); - } else if (this.rowCursor === 1 && this.rerollButtonContainer.visible) { - success = this.setRowCursor(0); + } else { + if (this.rowCursor === 1 && this.options.length === 0) { + success = false; + } else { + success = this.setCursor(this.getRowItems(this.rowCursor) - 1); + } } break; case Button.RIGHT: @@ -414,7 +464,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { success = this.setCursor(2); break; case 2: - success = false; + success = this.setCursor(0); break; case 3: if (this.transferButtonContainer.visible) { @@ -426,8 +476,12 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } } else if (this.cursor < this.getRowItems(this.rowCursor) - 1) { success = this.setCursor(this.cursor + 1); - } else if (this.rowCursor === 1 && this.transferButtonContainer.visible) { - success = this.setRowCursor(0); + } else { + if (this.rowCursor === 1 && this.options.length === 0) { + success = this.setRowCursor(0); + } else { + success = this.setCursor(0); + } } break; } @@ -440,16 +494,17 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { return success; } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const ui = this.getUi(); const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, "cursor"); + this.cursorObj = globalScene.add.image(0, 0, "cursor"); this.modifierContainer.add(this.cursorObj); } - const options = (this.rowCursor === 1 ? this.options : this.shopOptionsRows[this.shopOptionsRows.length - (this.rowCursor - 1)]); + const options = + this.rowCursor === 1 ? this.options : this.shopOptionsRows[this.shopOptionsRows.length - (this.rowCursor - 1)]; this.cursorObj.setScale(this.rowCursor === 1 ? 2 : this.rowCursor >= 2 ? 1.5 : 1); @@ -459,34 +514,56 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { if (this.rowCursor === 1 && options.length === 0) { // Continue button when no shop items this.cursorObj.setScale(1.25); - this.cursorObj.setPosition((this.scene.game.canvas.width / 18) + 23, (-this.scene.game.canvas.height / 12) - (this.shopOptionsRows.length > 1 ? SINGLE_SHOP_ROW_YOFFSET - 2 : DOUBLE_SHOP_ROW_YOFFSET - 2)); + this.cursorObj.setPosition( + globalScene.game.canvas.width / 18 + 23, + -globalScene.game.canvas.height / 12 - + (this.shopOptionsRows.length > 1 ? SINGLE_SHOP_ROW_YOFFSET - 2 : DOUBLE_SHOP_ROW_YOFFSET - 2), + ); ui.showText(i18next.t("modifierSelectUiHandler:continueNextWaveDescription")); return ret; } - const sliceWidth = (this.scene.game.canvas.width / 6) / (options.length + 2); + const sliceWidth = globalScene.game.canvas.width / 6 / (options.length + 2); if (this.rowCursor < 2) { // Cursor on free items - this.cursorObj.setPosition(sliceWidth * (cursor + 1) + (sliceWidth * 0.5) - 20, (-this.scene.game.canvas.height / 12) - (this.shopOptionsRows.length > 1 ? SINGLE_SHOP_ROW_YOFFSET - 2 : DOUBLE_SHOP_ROW_YOFFSET - 2)); + this.cursorObj.setPosition( + sliceWidth * (cursor + 1) + sliceWidth * 0.5 - 20, + -globalScene.game.canvas.height / 12 - + (this.shopOptionsRows.length > 1 ? SINGLE_SHOP_ROW_YOFFSET - 2 : DOUBLE_SHOP_ROW_YOFFSET - 2), + ); } else { // Cursor on paying items - this.cursorObj.setPosition(sliceWidth * (cursor + 1) + (sliceWidth * 0.5) - 16, (-this.scene.game.canvas.height / 12 - this.scene.game.canvas.height / 32) - (-14 + 28 * (this.rowCursor - (this.shopOptionsRows.length - 1)))); + this.cursorObj.setPosition( + sliceWidth * (cursor + 1) + sliceWidth * 0.5 - 16, + -globalScene.game.canvas.height / 12 - + globalScene.game.canvas.height / 32 - + (-14 + 28 * (this.rowCursor - (this.shopOptionsRows.length - 1))), + ); } const type = options[this.cursor].modifierTypeOption.type; - type && ui.showText(type.getDescription(this.scene)); + type && ui.showText(type.getDescription()); if (type instanceof TmModifierType) { // prepare the move overlay to be shown with the toggle this.moveInfoOverlay.show(allMoves[type.moveId]); } } else if (cursor === 0) { - this.cursorObj.setPosition(6, this.lockRarityButtonContainer.visible ? OPTION_BUTTON_YPOSITION - 8 : OPTION_BUTTON_YPOSITION + 4); + this.cursorObj.setPosition( + 6, + this.lockRarityButtonContainer.visible ? OPTION_BUTTON_YPOSITION - 8 : OPTION_BUTTON_YPOSITION + 4, + ); ui.showText(i18next.t("modifierSelectUiHandler:rerollDesc")); } else if (cursor === 1) { - this.cursorObj.setPosition((this.scene.game.canvas.width - this.transferButtonWidth - this.checkButtonWidth) / 6 - 30, OPTION_BUTTON_YPOSITION + 4); + this.cursorObj.setPosition( + (globalScene.game.canvas.width - this.transferButtonWidth - this.checkButtonWidth) / 6 - 30, + OPTION_BUTTON_YPOSITION + 4, + ); ui.showText(i18next.t("modifierSelectUiHandler:transferDesc")); } else if (cursor === 2) { - this.cursorObj.setPosition((this.scene.game.canvas.width - this.checkButtonWidth) / 6 - 10, OPTION_BUTTON_YPOSITION + 4); + this.cursorObj.setPosition( + (globalScene.game.canvas.width - this.checkButtonWidth) / 6 - 10, + OPTION_BUTTON_YPOSITION + 4, + ); ui.showText(i18next.t("modifierSelectUiHandler:checkTeamDesc")); } else { this.cursorObj.setPosition(6, OPTION_BUTTON_YPOSITION + 4); @@ -496,12 +573,14 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { return ret; } - setRowCursor(rowCursor: integer): boolean { + setRowCursor(rowCursor: number): boolean { const lastRowCursor = this.rowCursor; if (rowCursor !== lastRowCursor) { this.rowCursor = rowCursor; - let newCursor = Math.round(this.cursor / Math.max(this.getRowItems(lastRowCursor) - 1, 1) * (this.getRowItems(rowCursor) - 1)); + let newCursor = Math.round( + (this.cursor / Math.max(this.getRowItems(lastRowCursor) - 1, 1)) * (this.getRowItems(rowCursor) - 1), + ); if (rowCursor === 1 && this.options.length === 0) { // Handle empty shop newCursor = 0; @@ -517,6 +596,14 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { newCursor = 2; } } + // Allows to find lock rarity button when looping from the top + if (rowCursor === 0 && lastRowCursor > 1 && newCursor === 0 && this.lockRarityButtonContainer.visible) { + newCursor = 3; + } + // Allows to loop to top when lock rarity button is shown + if (rowCursor === this.shopOptionsRows.length + 1 && lastRowCursor === 0 && this.cursor === 3) { + newCursor = 0; + } this.cursor = -1; this.setCursor(newCursor); return true; @@ -525,7 +612,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { return false; } - private getRowItems(rowCursor: integer): integer { + private getRowItems(rowCursor: number): number { switch (rowCursor) { case 0: return 3; @@ -536,7 +623,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } } - setRerollCost(rerollCost: integer): void { + setRerollCost(rerollCost: number): void { this.rerollCost = rerollCost; } @@ -554,12 +641,11 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { if (rerollDisabled) { this.rerollCostText.setVisible(false); return; - } else { - this.rerollCostText.setVisible(true); } - const canReroll = this.scene.money >= this.rerollCost; + this.rerollCostText.setVisible(true); + const canReroll = globalScene.money >= this.rerollCost; - const formattedMoney = Utils.formatMoney(this.scene.moneyFormat, this.rerollCost); + const formattedMoney = Utils.formatMoney(globalScene.moneyFormat, this.rerollCost); this.rerollCostText.setText(i18next.t("modifierSelectUiHandler:rerollCost", { formattedMoney })); this.rerollCostText.setColor(this.getTextColor(canReroll ? TextStyle.MONEY : TextStyle.PARTY_RED)); @@ -567,7 +653,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } updateLockRaritiesText(): void { - const textStyle = this.scene.lockModifierTiers ? TextStyle.SUMMARY_BLUE : TextStyle.PARTY; + const textStyle = globalScene.lockModifierTiers ? TextStyle.SUMMARY_BLUE : TextStyle.PARTY; this.lockRarityButtonText.setColor(this.getTextColor(textStyle)); this.lockRarityButtonText.setShadowColor(this.getTextColor(textStyle, true)); } @@ -587,27 +673,33 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.rowCursor = 0; /* Multiplies the fade time duration by the speed parameter so that it is always constant, and avoids "flashbangs" at game speed x5 */ - this.scene.hideShopOverlay(750 * this.scene.gameSpeed); - this.scene.hideLuckText(250); + globalScene.hideShopOverlay(750 * globalScene.gameSpeed); + globalScene.hideLuckText(250); /* Normally already called just after the shop, but not sure if it happens in 100% of cases */ - this.scene.getModifierBar().updateModifiers(this.scene.modifiers); + globalScene.getModifierBar().updateModifiers(globalScene.modifiers); const options = this.options.concat(this.shopOptionsRows.flat()); this.options.splice(0, this.options.length); this.shopOptionsRows.splice(0, this.shopOptionsRows.length); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: options, scale: 0.01, duration: 250, ease: "Cubic.easeIn", - onComplete: () => options.forEach(o => o.destroy()) + onComplete: () => options.forEach(o => o.destroy()), }); - [ this.rerollButtonContainer, this.checkButtonContainer, this.transferButtonContainer, this.lockRarityButtonContainer, this.continueButtonContainer ].forEach(container => { + [ + this.rerollButtonContainer, + this.checkButtonContainer, + this.transferButtonContainer, + this.lockRarityButtonContainer, + this.continueButtonContainer, + ].forEach(container => { if (container.visible) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: container, alpha: 0, duration: 250, @@ -618,7 +710,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } else { container.setAlpha(1); } - } + }, }); } }); @@ -642,8 +734,8 @@ class ModifierOption extends Phaser.GameObjects.Container { private itemText: Phaser.GameObjects.Text; private itemCostText: Phaser.GameObjects.Text; - constructor(scene: BattleScene, x: number, y: number, modifierTypeOption: ModifierTypeOption) { - super(scene, x, y); + constructor(x: number, y: number, modifierTypeOption: ModifierTypeOption) { + super(globalScene, x, y); this.modifierTypeOption = modifierTypeOption; @@ -653,7 +745,7 @@ class ModifierOption extends Phaser.GameObjects.Container { setup() { if (!this.modifierTypeOption.cost) { const getPb = (): Phaser.GameObjects.Sprite => { - const pb = this.scene.add.sprite(0, -182, "pb", this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount)); + const pb = globalScene.add.sprite(0, -182, "pb", this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount)); pb.setScale(2); return pb; }; @@ -666,13 +758,13 @@ class ModifierOption extends Phaser.GameObjects.Container { this.add(this.pbTint); } - this.itemContainer = this.scene.add.container(0, 0); + this.itemContainer = globalScene.add.container(0, 0); this.itemContainer.setScale(0.5); this.itemContainer.setAlpha(0); this.add(this.itemContainer); const getItem = () => { - const item = this.scene.add.sprite(0, 0, "items", this.modifierTypeOption.type?.iconImage); + const item = globalScene.add.sprite(0, 0, "items", this.modifierTypeOption.type?.iconImage); return item; }; @@ -685,14 +777,18 @@ class ModifierOption extends Phaser.GameObjects.Container { this.itemContainer.add(this.itemTint); } - this.itemText = addTextObject(this.scene, 0, 35, this.modifierTypeOption.type?.name!, TextStyle.PARTY, { align: "center" }); // TODO: is this bang correct? + this.itemText = addTextObject(0, 35, this.modifierTypeOption.type?.name!, TextStyle.PARTY, { align: "center" }); // TODO: is this bang correct? this.itemText.setOrigin(0.5, 0); this.itemText.setAlpha(0); - this.itemText.setTint(this.modifierTypeOption.type?.tier ? getModifierTierTextTint(this.modifierTypeOption.type?.tier) : undefined); + this.itemText.setTint( + this.modifierTypeOption.type?.tier ? getModifierTierTextTint(this.modifierTypeOption.type?.tier) : undefined, + ); this.add(this.itemText); if (this.modifierTypeOption.cost) { - this.itemCostText = addTextObject(this.scene, 0, 45, "", TextStyle.MONEY, { align: "center" }); + this.itemCostText = addTextObject(0, 45, "", TextStyle.MONEY, { + align: "center", + }); this.itemCostText.setOrigin(0.5, 0); this.itemCostText.setAlpha(0); @@ -702,136 +798,145 @@ class ModifierOption extends Phaser.GameObjects.Container { } } - show(remainingDuration: integer, upgradeCountOffset: integer) { + show(remainingDuration: number, upgradeCountOffset: number) { if (!this.modifierTypeOption.cost) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pb, y: 0, duration: 1250, - ease: "Bounce.Out" + ease: "Bounce.Out", }); let lastValue = 1; let bounceCount = 0; let bounce = false; - this.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ from: 1, to: 0, duration: 1250, ease: "Bounce.Out", onUpdate: t => { - if (!this.scene) { + if (!globalScene) { return; } const value = t.getValue(); if (!bounce && value > lastValue) { - (this.scene as BattleScene).playSound("se/pb_bounce_1", { volume: 1 / ++bounceCount }); + globalScene.playSound("se/pb_bounce_1", { + volume: 1 / ++bounceCount, + }); bounce = true; } else if (bounce && value < lastValue) { bounce = false; } lastValue = value; - } + }, }); for (let u = 0; u < this.modifierTypeOption.upgradeCount; u++) { const upgradeIndex = u; - this.scene.time.delayedCall(remainingDuration - 2000 * (this.modifierTypeOption.upgradeCount - (upgradeIndex + 1 + upgradeCountOffset)), () => { - (this.scene as BattleScene).playSound("se/upgrade", { rate: 1 + 0.25 * upgradeIndex }); - this.pbTint.setPosition(this.pb.x, this.pb.y); - this.pbTint.setTintFill(0xFFFFFF); - this.pbTint.setAlpha(0); - this.pbTint.setVisible(true); - this.scene.tweens.add({ - targets: this.pbTint, - alpha: 1, - duration: 1000, - ease: "Sine.easeIn", - onComplete: () => { - this.pb.setTexture("pb", this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount + (upgradeIndex + 1))); - this.scene.tweens.add({ - targets: this.pbTint, - alpha: 0, - duration: 750, - ease: "Sine.easeOut", - onComplete: () => { - this.pbTint.setVisible(false); - } - }); - } - }); - }); + globalScene.time.delayedCall( + remainingDuration - 2000 * (this.modifierTypeOption.upgradeCount - (upgradeIndex + 1 + upgradeCountOffset)), + () => { + globalScene.playSound("se/upgrade", { + rate: 1 + 0.25 * upgradeIndex, + }); + this.pbTint.setPosition(this.pb.x, this.pb.y); + this.pbTint.setTintFill(0xffffff); + this.pbTint.setAlpha(0); + this.pbTint.setVisible(true); + globalScene.tweens.add({ + targets: this.pbTint, + alpha: 1, + duration: 1000, + ease: "Sine.easeIn", + onComplete: () => { + this.pb.setTexture( + "pb", + this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount + (upgradeIndex + 1)), + ); + globalScene.tweens.add({ + targets: this.pbTint, + alpha: 0, + duration: 750, + ease: "Sine.easeOut", + onComplete: () => { + this.pbTint.setVisible(false); + }, + }); + }, + }); + }, + ); } } - this.scene.time.delayedCall(remainingDuration + 2000, () => { - if (!this.scene) { + globalScene.time.delayedCall(remainingDuration + 2000, () => { + if (!globalScene) { return; } if (!this.modifierTypeOption.cost) { this.pb.setTexture("pb", `${this.getPbAtlasKey(0)}_open`); - (this.scene as BattleScene).playSound("se/pb_rel"); + globalScene.playSound("se/pb_rel"); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pb, duration: 500, delay: 250, ease: "Sine.easeIn", alpha: 0, - onComplete: () => this.pb.destroy() + onComplete: () => this.pb.destroy(), }); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.itemContainer, duration: 500, ease: "Elastic.Out", scale: 2, - alpha: 1 + alpha: 1, }); if (!this.modifierTypeOption.cost) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.itemTint, alpha: 0, duration: 500, ease: "Sine.easeIn", - onComplete: () => this.itemTint.destroy() + onComplete: () => this.itemTint.destroy(), }); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.itemText, duration: 500, alpha: 1, y: 25, - ease: "Cubic.easeInOut" + ease: "Cubic.easeInOut", }); if (this.itemCostText) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.itemCostText, duration: 500, alpha: 1, y: 35, - ease: "Cubic.easeInOut" + ease: "Cubic.easeInOut", }); } }); } - getPbAtlasKey(tierOffset: integer = 0) { - return getPokeballAtlasKey((this.modifierTypeOption.type?.tier! + tierOffset) as integer as PokeballType); // TODO: is this bang correct? + getPbAtlasKey(tierOffset = 0) { + return getPokeballAtlasKey((this.modifierTypeOption.type?.tier! + tierOffset) as number as PokeballType); // TODO: is this bang correct? } updateCostText(): void { - const scene = this.scene as BattleScene; const cost = Overrides.WAIVE_ROLL_FEE_OVERRIDE ? 0 : this.modifierTypeOption.cost; - const textStyle = cost <= scene.money ? TextStyle.MONEY : TextStyle.PARTY_RED; + const textStyle = cost <= globalScene.money ? TextStyle.MONEY : TextStyle.PARTY_RED; - const formattedMoney = Utils.formatMoney(scene.moneyFormat, cost); + const formattedMoney = Utils.formatMoney(globalScene.moneyFormat, cost); this.itemCostText.setText(i18next.t("modifierSelectUiHandler:itemCost", { formattedMoney })); - this.itemCostText.setColor(getTextColor(textStyle, false, scene.uiTheme)); - this.itemCostText.setShadowColor(getTextColor(textStyle, true, scene.uiTheme)); + this.itemCostText.setColor(getTextColor(textStyle, false, globalScene.uiTheme)); + this.itemCostText.setShadowColor(getTextColor(textStyle, true, globalScene.uiTheme)); } } diff --git a/src/ui/move-info-overlay.ts b/src/ui/move-info-overlay.ts index 6c58d32c515..6fc99beb0ae 100644 --- a/src/ui/move-info-overlay.ts +++ b/src/ui/move-info-overlay.ts @@ -1,25 +1,27 @@ -import BattleScene, { InfoToggle } from "../battle-scene"; +import type { InfoToggle } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { TextStyle, addTextObject } from "./text"; import { addWindow } from "./ui-theme"; import * as Utils from "../utils"; -import Move, { MoveCategory } from "../data/move"; -import { Type } from "../data/type"; +import type Move from "../data/moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; +import { PokemonType } from "#enums/pokemon-type"; import i18next from "i18next"; export interface MoveInfoOverlaySettings { - delayVisibility?: boolean; // if true, showing the overlay will only set it to active and populate the fields and the handler using this field has to manually call setVisible later. - scale?:number; // scale the box? A scale of 0.5 is recommended - top?: boolean; // should the effect box be on top? - right?: boolean; // should the effect box be on the right? - onSide?: boolean; // should the effect be on the side? ignores top argument if true - //location and width of the component; unaffected by scaling - x?: number; - y?: number; - /** Default is always half the screen, regardless of scale */ - width?: number; - /** Determines whether to display the small secondary box */ - hideEffectBox?: boolean; - hideBg?: boolean; + delayVisibility?: boolean; // if true, showing the overlay will only set it to active and populate the fields and the handler using this field has to manually call setVisible later. + scale?: number; // scale the box? A scale of 0.5 is recommended + top?: boolean; // should the effect box be on top? + right?: boolean; // should the effect box be on the right? + onSide?: boolean; // should the effect be on the side? ignores top argument if true + //location and width of the component; unaffected by scaling + x?: number; + y?: number; + /** Default is always half the screen, regardless of scale */ + width?: number; + /** Determines whether to display the small secondary box */ + hideEffectBox?: boolean; + hideBg?: boolean; } const EFF_HEIGHT = 48; @@ -29,59 +31,77 @@ const BORDER = 8; const GLOBAL_SCALE = 6; export default class MoveInfoOverlay extends Phaser.GameObjects.Container implements InfoToggle { - public active: boolean = false; + public active = false; private move: Move; private desc: Phaser.GameObjects.Text; - private descScroll : Phaser.Tweens.Tween | null = null; + private descScroll: Phaser.Tweens.Tween | null = null; private val: Phaser.GameObjects.Container; - private pp: Phaser.GameObjects.Text; + private pp: Phaser.GameObjects.Text; private pow: Phaser.GameObjects.Text; private acc: Phaser.GameObjects.Text; private typ: Phaser.GameObjects.Sprite; private cat: Phaser.GameObjects.Sprite; private descBg: Phaser.GameObjects.NineSlice; - private options : MoveInfoOverlaySettings; + private options: MoveInfoOverlaySettings; - constructor(scene: BattleScene, options?: MoveInfoOverlaySettings) { + constructor(options?: MoveInfoOverlaySettings) { if (options?.onSide) { options.top = false; } - super(scene, options?.x, options?.y); + super(globalScene, options?.x, options?.y); const scale = options?.scale || 1; // set up the scale this.setScale(scale); this.options = options || {}; // prepare the description box - const width = (options?.width || MoveInfoOverlay.getWidth(scale, scene)) / scale; // divide by scale as we always want this to be half a window wide - this.descBg = addWindow(scene, (options?.onSide && !options?.right ? EFF_WIDTH : 0), options?.top ? EFF_HEIGHT : 0, width - (options?.onSide ? EFF_WIDTH : 0), DESC_HEIGHT); + const width = (options?.width || MoveInfoOverlay.getWidth(scale)) / scale; // divide by scale as we always want this to be half a window wide + this.descBg = addWindow( + options?.onSide && !options?.right ? EFF_WIDTH : 0, + options?.top ? EFF_HEIGHT : 0, + width - (options?.onSide ? EFF_WIDTH : 0), + DESC_HEIGHT, + ); this.descBg.setOrigin(0, 0); this.add(this.descBg); // set up the description; wordWrap uses true pixels, unaffected by any scaling, while other values are affected - this.desc = addTextObject(scene, (options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER, (options?.top ? EFF_HEIGHT : 0) + BORDER - 2, "", TextStyle.BATTLE_INFO, { wordWrap: { width: (width - (BORDER - 2) * 2 - (options?.onSide ? EFF_WIDTH : 0)) * GLOBAL_SCALE }}); + this.desc = addTextObject( + (options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER, + (options?.top ? EFF_HEIGHT : 0) + BORDER - 2, + "", + TextStyle.BATTLE_INFO, + { + wordWrap: { + width: (width - (BORDER - 2) * 2 - (options?.onSide ? EFF_WIDTH : 0)) * GLOBAL_SCALE, + }, + }, + ); this.desc.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); // limit the text rendering, required for scrolling later on const maskPointOrigin = { - x: (options?.x || 0), - y: (options?.y || 0), + x: options?.x || 0, + y: options?.y || 0, }; if (maskPointOrigin.x < 0) { - maskPointOrigin.x += this.scene.game.canvas.width / GLOBAL_SCALE; + maskPointOrigin.x += globalScene.game.canvas.width / GLOBAL_SCALE; } if (maskPointOrigin.y < 0) { - maskPointOrigin.y += this.scene.game.canvas.height / GLOBAL_SCALE; + maskPointOrigin.y += globalScene.game.canvas.height / GLOBAL_SCALE; } - const moveDescriptionTextMaskRect = this.scene.make.graphics(); - moveDescriptionTextMaskRect.fillStyle(0xFF0000); + const moveDescriptionTextMaskRect = globalScene.make.graphics(); + moveDescriptionTextMaskRect.fillStyle(0xff0000); moveDescriptionTextMaskRect.fillRect( - maskPointOrigin.x + ((options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER) * scale, maskPointOrigin.y + ((options?.top ? EFF_HEIGHT : 0) + BORDER - 2) * scale, - width - ((options?.onSide ? EFF_WIDTH : 0) - BORDER * 2) * scale, (DESC_HEIGHT - (BORDER - 2) * 2) * scale); + maskPointOrigin.x + ((options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER) * scale, + maskPointOrigin.y + ((options?.top ? EFF_HEIGHT : 0) + BORDER - 2) * scale, + width - ((options?.onSide ? EFF_WIDTH : 0) - BORDER * 2) * scale, + (DESC_HEIGHT - (BORDER - 2) * 2) * scale, + ); moveDescriptionTextMaskRect.setScale(6); const moveDescriptionTextMask = this.createGeometryMask(moveDescriptionTextMaskRect); @@ -89,44 +109,48 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem this.desc.setMask(moveDescriptionTextMask); // prepare the effect box - this.val = new Phaser.GameObjects.Container(scene, options?.right ? width - EFF_WIDTH : 0, options?.top || options?.onSide ? 0 : DESC_HEIGHT); + this.val = new Phaser.GameObjects.Container( + globalScene, + options?.right ? width - EFF_WIDTH : 0, + options?.top || options?.onSide ? 0 : DESC_HEIGHT, + ); this.add(this.val); - const valuesBg = addWindow(scene, 0, 0, EFF_WIDTH, EFF_HEIGHT); + const valuesBg = addWindow(0, 0, EFF_WIDTH, EFF_HEIGHT); valuesBg.setOrigin(0, 0); this.val.add(valuesBg); - this.typ = this.scene.add.sprite(25, EFF_HEIGHT - 35, Utils.getLocalizedSpriteKey("types"), "unknown"); + this.typ = globalScene.add.sprite(25, EFF_HEIGHT - 35, Utils.getLocalizedSpriteKey("types"), "unknown"); this.typ.setScale(0.8); this.val.add(this.typ); - this.cat = this.scene.add.sprite(57, EFF_HEIGHT - 35, "categories", "physical"); + this.cat = globalScene.add.sprite(57, EFF_HEIGHT - 35, "categories", "physical"); this.val.add(this.cat); - const ppTxt = addTextObject(scene, 12, EFF_HEIGHT - 25, "PP", TextStyle.MOVE_INFO_CONTENT); + const ppTxt = addTextObject(12, EFF_HEIGHT - 25, "PP", TextStyle.MOVE_INFO_CONTENT); ppTxt.setOrigin(0.0, 0.5); ppTxt.setText(i18next.t("fightUiHandler:pp")); this.val.add(ppTxt); - this.pp = addTextObject(scene, 70, EFF_HEIGHT - 25, "--", TextStyle.MOVE_INFO_CONTENT); + this.pp = addTextObject(70, EFF_HEIGHT - 25, "--", TextStyle.MOVE_INFO_CONTENT); this.pp.setOrigin(1, 0.5); this.val.add(this.pp); - const powTxt = addTextObject(scene, 12, EFF_HEIGHT - 17, "POWER", TextStyle.MOVE_INFO_CONTENT); + const powTxt = addTextObject(12, EFF_HEIGHT - 17, "POWER", TextStyle.MOVE_INFO_CONTENT); powTxt.setOrigin(0.0, 0.5); powTxt.setText(i18next.t("fightUiHandler:power")); this.val.add(powTxt); - this.pow = addTextObject(scene, 70, EFF_HEIGHT - 17, "---", TextStyle.MOVE_INFO_CONTENT); + this.pow = addTextObject(70, EFF_HEIGHT - 17, "---", TextStyle.MOVE_INFO_CONTENT); this.pow.setOrigin(1, 0.5); this.val.add(this.pow); - const accTxt = addTextObject(scene, 12, EFF_HEIGHT - 9, "ACC", TextStyle.MOVE_INFO_CONTENT); + const accTxt = addTextObject(12, EFF_HEIGHT - 9, "ACC", TextStyle.MOVE_INFO_CONTENT); accTxt.setOrigin(0.0, 0.5); accTxt.setText(i18next.t("fightUiHandler:accuracy")); this.val.add(accTxt); - this.acc = addTextObject(scene, 70, EFF_HEIGHT - 9, "---", TextStyle.MOVE_INFO_CONTENT); + this.acc = addTextObject(70, EFF_HEIGHT - 9, "---", TextStyle.MOVE_INFO_CONTENT); this.acc.setOrigin(1, 0.5); this.val.add(this.acc); @@ -143,15 +167,15 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem } // show this component with infos for the specific move - show(move : Move):boolean { - if (!(this.scene as BattleScene).enableMoveInfo) { + show(move: Move): boolean { + if (!globalScene.enableMoveInfo) { return false; // move infos have been disabled // TODO:: is `false` correct? i used to be `undeefined` } this.move = move; this.pow.setText(move.power >= 0 ? move.power.toString() : "---"); this.acc.setText(move.accuracy >= 0 ? move.accuracy.toString() : "---"); this.pp.setText(move.pp >= 0 ? move.pp.toString() : "---"); - this.typ.setTexture(Utils.getLocalizedSpriteKey("types"), Type[move.type].toLowerCase()); + this.typ.setTexture(Utils.getLocalizedSpriteKey("types"), PokemonType[move.type].toLowerCase()); this.cat.setFrame(MoveCategory[move.category].toLowerCase()); this.desc.setText(move?.effect || ""); @@ -164,16 +188,16 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem } // determine if we need to add new scrolling effects - const moveDescriptionLineCount = Math.floor(this.desc.displayHeight * (96 / 72) / 14.83); + const moveDescriptionLineCount = Math.floor((this.desc.displayHeight * (96 / 72)) / 14.83); if (moveDescriptionLineCount > 3) { // generate scrolling effects - this.descScroll = this.scene.tweens.add({ + this.descScroll = globalScene.tweens.add({ targets: this.desc, delay: Utils.fixedInt(2000), loop: -1, hold: Utils.fixedInt(2000), duration: Utils.fixedInt((moveDescriptionLineCount - 3) * 2000), - y: `-=${14.83 * (72 / 96) * (moveDescriptionLineCount - 3)}` + y: `-=${14.83 * (72 / 96) * (moveDescriptionLineCount - 3)}`, }); } @@ -193,11 +217,11 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem if (visible) { this.setVisible(true); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.desc, duration: Utils.fixedInt(125), ease: "Sine.easeInOut", - alpha: visible ? 1 : 0 + alpha: visible ? 1 : 0, }); if (!visible) { this.setVisible(false); @@ -209,12 +233,12 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem } // width of this element - static getWidth(scale:number, scene: BattleScene):number { - return scene.game.canvas.width / GLOBAL_SCALE / 2; + static getWidth(_scale: number): number { + return globalScene.game.canvas.width / GLOBAL_SCALE / 2; } // height of this element - static getHeight(scale:number, onSide?: boolean):number { - return (onSide ? Math.max(EFF_HEIGHT, DESC_HEIGHT) : (EFF_HEIGHT + DESC_HEIGHT)) * scale; + static getHeight(scale: number, onSide?: boolean): number { + return (onSide ? Math.max(EFF_HEIGHT, DESC_HEIGHT) : EFF_HEIGHT + DESC_HEIGHT) * scale; } } diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index b568f8b71de..87d2e2ba28c 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -1,21 +1,21 @@ -import BattleScene from "../battle-scene"; import { addBBCodeTextObject, getBBCodeFrag, TextStyle } from "./text"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { Button } from "#enums/buttons"; import { addWindow, WindowVariant } from "./ui-theme"; -import { MysteryEncounterPhase } from "../phases/mystery-encounter-phases"; +import type { MysteryEncounterPhase } from "../phases/mystery-encounter-phases"; import { PartyUiMode } from "./party-ui-handler"; -import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; +import type MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import * as Utils from "../utils"; import { isNullOrUndefined } from "../utils"; import { getPokeballAtlasKey } from "../data/pokeball"; -import { OptionSelectSettings } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import type { OptionSelectSettings } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import i18next from "i18next"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import { globalScene } from "#app/global-scene"; export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; @@ -36,57 +36,57 @@ export default class MysteryEncounterUiHandler extends UiHandler { private dexProgressWindow: Phaser.GameObjects.NineSlice; private dexProgressContainer: Phaser.GameObjects.Container; - private showDexProgress: boolean = false; + private showDexProgress = false; private overrideSettings?: OptionSelectSettings; private encounterOptions: MysteryEncounterOption[] = []; private optionsMeetsReqs: boolean[]; - protected viewPartyIndex: number = 0; - protected viewPartyXPosition: number = 0; + protected viewPartyIndex = 0; + protected viewPartyXPosition = 0; - protected blockInput: boolean = true; + protected blockInput = true; - constructor(scene: BattleScene) { - super(scene, Mode.MYSTERY_ENCOUNTER); + constructor() { + super(Mode.MYSTERY_ENCOUNTER); } override setup() { const ui = this.getUi(); - this.cursorContainer = this.scene.add.container(18, -38.7); + this.cursorContainer = globalScene.add.container(18, -38.7); this.cursorContainer.setVisible(false); ui.add(this.cursorContainer); - this.optionsContainer = this.scene.add.container(12, -38.7); + this.optionsContainer = globalScene.add.container(12, -38.7); this.optionsContainer.setVisible(false); ui.add(this.optionsContainer); - this.dexProgressContainer = this.scene.add.container(214, -43); + this.dexProgressContainer = globalScene.add.container(214, -43); this.dexProgressContainer.setVisible(false); ui.add(this.dexProgressContainer); - this.descriptionContainer = this.scene.add.container(0, -152); + this.descriptionContainer = globalScene.add.container(0, -152); this.descriptionContainer.setVisible(false); ui.add(this.descriptionContainer); - this.tooltipContainer = this.scene.add.container(210, -48); + this.tooltipContainer = globalScene.add.container(210, -48); this.tooltipContainer.setVisible(false); ui.add(this.tooltipContainer); this.setCursor(this.getCursor()); - this.descriptionWindow = addWindow(this.scene, 0, 0, 150, 105, false, false, 0, 0, WindowVariant.THIN); + this.descriptionWindow = addWindow(0, 0, 150, 105, false, false, 0, 0, WindowVariant.THIN); this.descriptionContainer.add(this.descriptionWindow); - this.tooltipWindow = addWindow(this.scene, 0, 0, 110, 48, false, false, 0, 0, WindowVariant.THIN); + this.tooltipWindow = addWindow(0, 0, 110, 48, false, false, 0, 0, WindowVariant.THIN); this.tooltipContainer.add(this.tooltipWindow); - this.dexProgressWindow = addWindow(this.scene, 0, 0, 24, 28, false, false, 0, 0, WindowVariant.THIN); + this.dexProgressWindow = addWindow(0, 0, 24, 28, false, false, 0, 0, WindowVariant.THIN); this.dexProgressContainer.add(this.dexProgressWindow); - this.rarityBall = this.scene.add.sprite(141, 9, "pb"); + this.rarityBall = globalScene.add.sprite(141, 9, "pb"); this.rarityBall.setScale(0.75); this.descriptionContainer.add(this.rarityBall); - const dexProgressIndicator = this.scene.add.sprite(12, 10, "encounter_radar"); - dexProgressIndicator.setScale(0.80); + const dexProgressIndicator = globalScene.add.sprite(12, 10, "encounter_radar"); + dexProgressIndicator.setScale(0.8); this.dexProgressContainer.add(dexProgressIndicator); this.dexProgressContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 24, 28), Phaser.Geom.Rectangle.Contains); } @@ -94,9 +94,13 @@ export default class MysteryEncounterUiHandler extends UiHandler { override show(args: any[]): boolean { super.show(args); - this.overrideSettings = args[0] as OptionSelectSettings ?? {}; - const showDescriptionContainer = isNullOrUndefined(this.overrideSettings?.hideDescription) ? true : !this.overrideSettings.hideDescription; - const slideInDescription = isNullOrUndefined(this.overrideSettings?.slideInDescription) ? true : this.overrideSettings.slideInDescription; + this.overrideSettings = (args[0] as OptionSelectSettings) ?? {}; + const showDescriptionContainer = isNullOrUndefined(this.overrideSettings?.hideDescription) + ? true + : !this.overrideSettings.hideDescription; + const slideInDescription = isNullOrUndefined(this.overrideSettings?.slideInDescription) + ? true + : this.overrideSettings.slideInDescription; const startingCursorIndex = this.overrideSettings?.startingCursorIndex ?? 0; this.cursorContainer.setVisible(true); @@ -136,19 +140,24 @@ export default class MysteryEncounterUiHandler extends UiHandler { success = true; const overrideSettings: OptionSelectSettings = { ...this.overrideSettings, - slideInDescription: false + slideInDescription: false, }; - this.scene.ui.setMode(Mode.PARTY, PartyUiMode.CHECK, -1, () => { - this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, overrideSettings); + globalScene.ui.setMode(Mode.PARTY, PartyUiMode.CHECK, -1, () => { + globalScene.ui.setMode(Mode.MYSTERY_ENCOUNTER, overrideSettings); setTimeout(() => { this.setCursor(this.viewPartyIndex); this.unblockInput(); }, 300); }); - } else if (this.blockInput || (!this.optionsMeetsReqs[cursor] && (selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL))) { + } else if ( + this.blockInput || + (!this.optionsMeetsReqs[cursor] && + (selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || + selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) + ) { success = false; } else { - if ((this.scene.getCurrentPhase() as MysteryEncounterPhase).handleOptionSelect(selected, cursor)) { + if ((globalScene.getCurrentPhase() as MysteryEncounterPhase).handleOptionSelect(selected, cursor)) { success = true; } else { ui.playError(); @@ -159,6 +168,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { } } else { switch (this.optionsContainer.getAll()?.length) { + // biome-ignore lint/suspicious/useDefaultSwitchClauseLast: Default shares logic with case 3 and it makes more sense for the statements to be ordered by the case value default: case 3: success = this.handleTwoOptionMoveInput(button); @@ -293,7 +303,11 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.blockInput = false; for (let i = 0; i < this.optionsContainer.length - 1; i++) { const optionMode = this.encounterOptions[i].optionMode; - if (!this.optionsMeetsReqs[i] && (optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { + if ( + !this.optionsMeetsReqs[i] && + (optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || + optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + ) { continue; } (this.optionsContainer.getAt(i) as Phaser.GameObjects.Text).setAlpha(1); @@ -315,32 +329,44 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.viewPartyIndex = this.optionsContainer.getAll()?.length - 1; if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, "cursor"); + this.cursorObj = globalScene.add.image(0, 0, "cursor"); this.cursorContainer.add(this.cursorObj); } if (cursor === this.viewPartyIndex) { this.cursorObj.setPosition(this.viewPartyXPosition, -17); - } else if (this.optionsContainer.getAll()?.length === 3) { // 2 Options + } else if (this.optionsContainer.getAll()?.length === 3) { + // 2 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 15); - } else if (this.optionsContainer.getAll()?.length === 4) { // 3 Options + } else if (this.optionsContainer.getAll()?.length === 4) { + // 3 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); - } else if (this.optionsContainer.getAll()?.length === 5) { // 4 Options + } else if (this.optionsContainer.getAll()?.length === 5) { + // 4 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); } return changed; } - displayEncounterOptions(slideInDescription: boolean = true): void { + displayEncounterOptions(slideInDescription = true): void { this.getUi().clearText(); - const mysteryEncounter = this.scene.currentBattle.mysteryEncounter!; + const mysteryEncounter = globalScene.currentBattle.mysteryEncounter!; this.encounterOptions = this.overrideSettings?.overrideOptions ?? mysteryEncounter.options; this.optionsMeetsReqs = []; - const titleText: string | null = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue?.title, TextStyle.TOOLTIP_TITLE); - const descriptionText: string | null = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue?.description, TextStyle.TOOLTIP_CONTENT); - const queryText: string | null = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue?.query, TextStyle.TOOLTIP_CONTENT); + const titleText: string | null = getEncounterText( + mysteryEncounter.dialogue.encounterOptionsDialogue?.title, + TextStyle.TOOLTIP_TITLE, + ); + const descriptionText: string | null = getEncounterText( + mysteryEncounter.dialogue.encounterOptionsDialogue?.description, + TextStyle.TOOLTIP_CONTENT, + ); + const queryText: string | null = getEncounterText( + mysteryEncounter.dialogue.encounterOptionsDialogue?.query, + TextStyle.TOOLTIP_CONTENT, + ); // Clear options container (except cursor) this.optionsContainer.removeAll(true); @@ -351,34 +377,56 @@ export default class MysteryEncounterUiHandler extends UiHandler { let optionText: BBCodeText; switch (this.encounterOptions.length) { + // biome-ignore lint/suspicious/useDefaultSwitchClauseLast: default shares logic with case 2 and it makes more sense for the statements to be ordered by the case number default: case 2: - optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); + optionText = addBBCodeTextObject(i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { + fontSize: "80px", + lineSpacing: -8, + }); break; case 3: - optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); + optionText = addBBCodeTextObject(i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { + fontSize: "80px", + lineSpacing: -8, + }); break; case 4: - optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); + optionText = addBBCodeTextObject(i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { + fontSize: "80px", + lineSpacing: -8, + }); break; } - this.optionsMeetsReqs.push(option.meetsRequirements(this.scene)); + this.optionsMeetsReqs.push(option.meetsRequirements()); const optionDialogue = option.dialogue!; - const label = !this.optionsMeetsReqs[i] && optionDialogue.disabledButtonLabel ? optionDialogue.disabledButtonLabel : optionDialogue.buttonLabel; + const label = + !this.optionsMeetsReqs[i] && optionDialogue.disabledButtonLabel + ? optionDialogue.disabledButtonLabel + : optionDialogue.buttonLabel; let text: string | null; - if (option.hasRequirements() && this.optionsMeetsReqs[i] && (option.optionMode === MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL || option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { + if ( + option.hasRequirements() && + this.optionsMeetsReqs[i] && + (option.optionMode === MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL || + option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + ) { // Options with special requirements that are met are automatically colored green - text = getEncounterText(this.scene, label, TextStyle.SUMMARY_GREEN); + text = getEncounterText(label, TextStyle.ME_OPTION_SPECIAL); } else { - text = getEncounterText(this.scene, label, optionDialogue.style ? optionDialogue.style : TextStyle.WINDOW); + text = getEncounterText(label, optionDialogue.style ? optionDialogue.style : TextStyle.ME_OPTION_DEFAULT); } if (text) { optionText.setText(text); } - if (!this.optionsMeetsReqs[i] && (option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { + if ( + !this.optionsMeetsReqs[i] && + (option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || + option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + ) { optionText.setAlpha(0.5); } if (this.blockInput) { @@ -387,9 +435,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { // Sets up the mask that hides the option text to give an illusion of scrolling const nonScrollWidth = 90; - const optionTextMaskRect = this.scene.make.graphics({}); + const optionTextMaskRect = globalScene.make.graphics({}); optionTextMaskRect.setScale(6); - optionTextMaskRect.fillStyle(0xFFFFFF); + optionTextMaskRect.fillStyle(0xffffff); optionTextMaskRect.beginPath(); optionTextMaskRect.fillRect(optionText.x + 11, optionText.y + 140, nonScrollWidth, 18); @@ -406,13 +454,13 @@ export default class MysteryEncounterUiHandler extends UiHandler { // Animates the option text scrolling sideways if (optionTextWidth > nonScrollWidth) { - this.optionScrollTweens[i] = this.scene.tweens.add({ + this.optionScrollTweens[i] = globalScene.tweens.add({ targets: optionText, delay: Utils.fixedInt(2000), loop: -1, hold: Utils.fixedInt(2000), - duration: Utils.fixedInt((optionTextWidth - nonScrollWidth) / 15 * 2000), - x: `-=${(optionTextWidth - nonScrollWidth)}` + duration: Utils.fixedInt(((optionTextWidth - nonScrollWidth) / 15) * 2000), + x: `-=${optionTextWidth - nonScrollWidth}`, }); } @@ -420,30 +468,47 @@ export default class MysteryEncounterUiHandler extends UiHandler { } // View Party Button - const viewPartyText = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width) / 6, -24, getBBCodeFrag(i18next.t("mysteryEncounterMessages:view_party_button"), TextStyle.PARTY), TextStyle.PARTY); + const viewPartyText = addBBCodeTextObject( + globalScene.game.canvas.width / 6, + -24, + getBBCodeFrag(i18next.t("mysteryEncounterMessages:view_party_button"), TextStyle.PARTY), + TextStyle.PARTY, + ); this.optionsContainer.add(viewPartyText); - viewPartyText.x -= (viewPartyText.displayWidth + 16); + viewPartyText.x -= viewPartyText.displayWidth + 16; this.viewPartyXPosition = viewPartyText.x - 10; // Description Window - const titleTextObject = addBBCodeTextObject(this.scene, 0, 0, titleText ?? "", TextStyle.TOOLTIP_TITLE, { wordWrap: { width: 750 }, align: "center", lineSpacing: -8 }); + const titleTextObject = addBBCodeTextObject(0, 0, titleText ?? "", TextStyle.TOOLTIP_TITLE, { + wordWrap: { width: 750 }, + align: "center", + lineSpacing: -8, + }); this.descriptionContainer.add(titleTextObject); titleTextObject.setPosition(72 - titleTextObject.displayWidth / 2, 5.5); // Rarity of encounter - const index = mysteryEncounter.encounterTier === MysteryEncounterTier.COMMON ? 0 : - mysteryEncounter.encounterTier === MysteryEncounterTier.GREAT ? 1 : - mysteryEncounter.encounterTier === MysteryEncounterTier.ULTRA ? 2 : - mysteryEncounter.encounterTier === MysteryEncounterTier.ROGUE ? 3 : 4; + const index = + mysteryEncounter.encounterTier === MysteryEncounterTier.COMMON + ? 0 + : mysteryEncounter.encounterTier === MysteryEncounterTier.GREAT + ? 1 + : mysteryEncounter.encounterTier === MysteryEncounterTier.ULTRA + ? 2 + : mysteryEncounter.encounterTier === MysteryEncounterTier.ROGUE + ? 3 + : 4; const ballType = getPokeballAtlasKey(index); this.rarityBall.setTexture("pb", ballType); - const descriptionTextObject = addBBCodeTextObject(this.scene, 6, 25, descriptionText ?? "", TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 }}); + const descriptionTextObject = addBBCodeTextObject(6, 25, descriptionText ?? "", TextStyle.TOOLTIP_CONTENT, { + wordWrap: { width: 830 }, + }); // Sets up the mask that hides the description text to give an illusion of scrolling - const descriptionTextMaskRect = this.scene.make.graphics({}); + const descriptionTextMaskRect = globalScene.make.graphics({}); descriptionTextMaskRect.setScale(6); - descriptionTextMaskRect.fillStyle(0xFFFFFF); + descriptionTextMaskRect.fillStyle(0xffffff); descriptionTextMaskRect.beginPath(); descriptionTextMaskRect.fillRect(6, 53, 206, 57); @@ -460,30 +525,32 @@ export default class MysteryEncounterUiHandler extends UiHandler { // Animates the description text moving upwards if (descriptionLineCount > 6) { - this.descriptionScrollTween = this.scene.tweens.add({ + this.descriptionScrollTween = globalScene.tweens.add({ targets: descriptionTextObject, delay: Utils.fixedInt(2000), loop: -1, hold: Utils.fixedInt(2000), duration: Utils.fixedInt((descriptionLineCount - 6) * 2000), - y: `-=${10 * (descriptionLineCount - 6)}` + y: `-=${10 * (descriptionLineCount - 6)}`, }); } this.descriptionContainer.add(descriptionTextObject); - const queryTextObject = addBBCodeTextObject(this.scene, 0, 0, queryText ?? "", TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 }}); + const queryTextObject = addBBCodeTextObject(0, 0, queryText ?? "", TextStyle.TOOLTIP_CONTENT, { + wordWrap: { width: 830 }, + }); this.descriptionContainer.add(queryTextObject); queryTextObject.setPosition(75 - queryTextObject.displayWidth / 2, 90); // Slide in description container if (slideInDescription) { this.descriptionContainer.x -= 150; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.descriptionContainer, x: "+=150", ease: "Sine.easeInOut", - duration: 1000 + duration: 1000, }); } } @@ -510,27 +577,49 @@ export default class MysteryEncounterUiHandler extends UiHandler { let text: string | null; const cursorOption = this.encounterOptions[cursor]; const optionDialogue = cursorOption.dialogue!; - if (!this.optionsMeetsReqs[cursor] && (cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) && optionDialogue.disabledButtonTooltip) { - text = getEncounterText(this.scene, optionDialogue.disabledButtonTooltip, TextStyle.TOOLTIP_CONTENT); + if ( + !this.optionsMeetsReqs[cursor] && + (cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || + cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) && + optionDialogue.disabledButtonTooltip + ) { + text = getEncounterText(optionDialogue.disabledButtonTooltip, TextStyle.TOOLTIP_CONTENT); } else { - text = getEncounterText(this.scene, optionDialogue.buttonTooltip, TextStyle.TOOLTIP_CONTENT); + text = getEncounterText(optionDialogue.buttonTooltip, TextStyle.TOOLTIP_CONTENT); } // Auto-color options green/blue for good/bad by looking for (+)/(-) if (text) { - const primaryStyleString = [ ...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))! ][0]; - text = text.replace(/(\(\+\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + "[/color][/shadow]" + primaryStyleString); - text = text.replace(/(\(\-\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + "[/color][/shadow]" + primaryStyleString); + const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))!][0]; + text = text.replace( + /(\(\+\)[^\(\[]*)/gi, + substring => + "[/color][/shadow]" + + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + + "[/color][/shadow]" + + primaryStyleString, + ); + text = text.replace( + /(\(\-\)[^\(\[]*)/gi, + substring => + "[/color][/shadow]" + + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + + "[/color][/shadow]" + + primaryStyleString, + ); } if (text) { - const tooltipTextObject = addBBCodeTextObject(this.scene, 6, 7, text, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 600 }, fontSize: "72px" }); + const tooltipTextObject = addBBCodeTextObject(6, 7, text, TextStyle.TOOLTIP_CONTENT, { + wordWrap: { width: 600 }, + fontSize: "72px", + }); this.tooltipContainer.add(tooltipTextObject); // Sets up the mask that hides the description text to give an illusion of scrolling - const tooltipTextMaskRect = this.scene.make.graphics({}); + const tooltipTextMaskRect = globalScene.make.graphics({}); tooltipTextMaskRect.setScale(6); - tooltipTextMaskRect.fillStyle(0xFFFFFF); + tooltipTextMaskRect.fillStyle(0xffffff); tooltipTextMaskRect.beginPath(); tooltipTextMaskRect.fillRect(this.tooltipContainer.x, this.tooltipContainer.y + 188.5, 150, 32); @@ -546,13 +635,13 @@ export default class MysteryEncounterUiHandler extends UiHandler { // Animates the tooltip text moving upwards if (tooltipLineCount > 3) { - this.tooltipScrollTween = this.scene.tweens.add({ + this.tooltipScrollTween = globalScene.tweens.add({ targets: tooltipTextObject, delay: Utils.fixedInt(1200), loop: -1, hold: Utils.fixedInt(1200), duration: Utils.fixedInt((tooltipLineCount - 3) * 1200), - y: `-=${11.2 * (tooltipLineCount - 3)}` + y: `-=${11.2 * (tooltipLineCount - 3)}`, }); } } @@ -593,25 +682,25 @@ export default class MysteryEncounterUiHandler extends UiHandler { private showHideDexProgress(show: boolean) { if (show && !this.showDexProgress) { this.showDexProgress = true; - this.scene.tweens.killTweensOf(this.dexProgressContainer); - this.scene.tweens.add({ + globalScene.tweens.killTweensOf(this.dexProgressContainer); + globalScene.tweens.add({ targets: this.dexProgressContainer, y: -63, ease: "Sine.easeInOut", duration: 750, onComplete: () => { this.dexProgressContainer.on("pointerover", () => { - (this.scene as BattleScene).ui.showTooltip("", i18next.t("mysteryEncounterMessages:affects_pokedex"), true); + globalScene.ui.showTooltip("", i18next.t("mysteryEncounterMessages:affects_pokedex"), true); }); this.dexProgressContainer.on("pointerout", () => { - (this.scene as BattleScene).ui.hideTooltip(); + globalScene.ui.hideTooltip(); }); - } + }, }); } else if (!show && this.showDexProgress) { this.showDexProgress = false; - this.scene.tweens.killTweensOf(this.dexProgressContainer); - this.scene.tweens.add({ + globalScene.tweens.killTweensOf(this.dexProgressContainer); + globalScene.tweens.add({ targets: this.dexProgressContainer, y: -43, ease: "Sine.easeInOut", @@ -619,7 +708,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { onComplete: () => { this.dexProgressContainer.off("pointerover"); this.dexProgressContainer.off("pointerout"); - } + }, }); } } diff --git a/src/ui/party-exp-bar.ts b/src/ui/party-exp-bar.ts index d2521225375..7b7f5277ca1 100644 --- a/src/ui/party-exp-bar.ts +++ b/src/ui/party-exp-bar.ts @@ -1,6 +1,7 @@ -import BattleScene from "../battle-scene"; -import Pokemon from "../field/pokemon"; +import { globalScene } from "#app/global-scene"; +import type Pokemon from "../field/pokemon"; import { TextStyle, addTextObject } from "./text"; +import i18next from "i18next"; export default class PartyExpBar extends Phaser.GameObjects.Container { private bg: Phaser.GameObjects.NineSlice; @@ -11,17 +12,17 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { public shown: boolean; - constructor(scene: BattleScene) { - super(scene, (scene.game.canvas.width / 6), -((scene.game.canvas.height) / 6) + 15); + constructor() { + super(globalScene, globalScene.game.canvas.width / 6, -(globalScene.game.canvas.height / 6) + 15); } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, "party_exp_bar", undefined, 8, 18, 21, 5, 6, 4); + this.bg = globalScene.add.nineslice(0, 0, "party_exp_bar", undefined, 8, 18, 21, 5, 6, 4); this.bg.setOrigin(0, 0); this.add(this.bg); - this.expText = addTextObject(this.scene, 22, 4, "", TextStyle.BATTLE_INFO); + this.expText = addTextObject(22, 4, "", TextStyle.BATTLE_INFO); this.expText.setOrigin(0, 0); this.add(this.expText); @@ -29,23 +30,25 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { this.shown = false; } - showPokemonExp(pokemon: Pokemon, expValue: integer, showOnlyLevelUp: boolean, newLevel: number): Promise { + showPokemonExp(pokemon: Pokemon, expValue: number, showOnlyLevelUp: boolean, newLevel: number): Promise { return new Promise(resolve => { if (this.shown) { return resolve(); } - this.pokemonIcon = (this.scene as BattleScene).addPokemonIcon(pokemon, -8, 15, 0, 0.5); + this.pokemonIcon = globalScene.addPokemonIcon(pokemon, -8, 15, 0, 0.5); this.pokemonIcon.setScale(0.5); this.add(this.pokemonIcon); // if we want to only display the level in the small frame if (showOnlyLevelUp) { - if (newLevel > 200) { // if the level is greater than 200, we only display Lv. UP - this.expText.setText("Lv. UP"); - } else { // otherwise we display Lv. Up and the new level - this.expText.setText(`Lv. UP: ${newLevel.toString()}`); + if (newLevel > 200) { + // if the level is greater than 200, we only display Lv. UP + this.expText.setText(i18next.t("battleScene:levelUp")); + } else { + // otherwise we display Lv. Up and the new level + this.expText.setText(i18next.t("battleScene:levelUpWithLevel", { level: newLevel })); } } else { // if we want to display the exp @@ -54,21 +57,21 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { this.bg.width = this.expText.displayWidth + 28; - (this.scene as BattleScene).fieldUI.bringToTop(this); + globalScene.fieldUI.bringToTop(this); if (this.tween) { this.tween.stop(); } - this.tween = this.scene.tweens.add({ + this.tween = globalScene.tweens.add({ targets: this, - x: (this.scene.game.canvas.width / 6) - (this.bg.width - 5), - duration: 500 / Math.pow(2, pokemon.scene.expGainsSpeed), + x: globalScene.game.canvas.width / 6 - (this.bg.width - 5), + duration: 500 / Math.pow(2, globalScene.expGainsSpeed), ease: "Sine.easeOut", onComplete: () => { this.tween = null; resolve(); - } + }, }); this.setVisible(true); @@ -86,9 +89,9 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { this.tween.stop(); } - this.tween = this.scene.tweens.add({ + this.tween = globalScene.tweens.add({ targets: this, - x: (this.scene.game.canvas.width / 6), + x: globalScene.game.canvas.width / 6, duration: 500, ease: "Sine.easeIn", onComplete: () => { @@ -97,7 +100,7 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { this.setVisible(false); this.pokemonIcon?.destroy(); resolve(); - } + }, }); }); } diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index e96fde8d54f..21e5f9077f4 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1,14 +1,19 @@ -import BattleScene from "#app/battle-scene"; -import Pokemon, { MoveResult, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import type { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { MoveResult } from "#app/field/pokemon"; import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "#app/ui/text"; import { Command } from "#app/ui/command-ui-handler"; import MessageUiHandler from "#app/ui/message-ui-handler"; import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; -import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "#app/modifier/modifier"; -import { allMoves, ForceSwitchOutAttr } from "#app/data/move"; -import { getGenderColor, getGenderSymbol } from "#app/data/gender"; -import { StatusEffect } from "#app/data/status-effect"; +import { + PokemonFormChangeItemModifier, + PokemonHeldItemModifier, + SwitchEffectTransferModifier, +} from "#app/modifier/modifier"; +import { allMoves, ForceSwitchOutAttr } from "#app/data/moves/move"; +import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; +import { StatusEffect } from "#enums/status-effect"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { addWindow } from "#app/ui/ui-theme"; @@ -18,12 +23,13 @@ import { Button } from "#enums/buttons"; import { applyChallenges, ChallengeType } from "#app/data/challenge"; import MoveInfoOverlay from "#app/ui/move-info-overlay"; import i18next from "i18next"; -import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { getPokemonNameWithAffix } from "#app/messages"; -import { CommandPhase } from "#app/phases/command-phase"; +import type { CommandPhase } from "#app/phases/command-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import { globalScene } from "#app/global-scene"; const defaultMessage = i18next.t("partyUiHandler:choosePokemon"); @@ -95,7 +101,7 @@ export enum PartyUiMode { * Indicates that the party UI is open to select a party member for an arbitrary effect. * This is generally used in for Mystery Encounter or special effects that require the player to select a Pokemon */ - SELECT + SELECT, } export enum PartyOption { @@ -107,6 +113,7 @@ export enum PartyOption { TEACH, TRANSFER, SUMMARY, + POKEDEX, UNPAUSE_EVOLUTION, SPLICE, UNSPLICE, @@ -123,16 +130,24 @@ export enum PartyOption { ALL = 4000, } -export type PartySelectCallback = (cursor: integer, option: PartyOption) => void; -export type PartyModifierTransferSelectCallback = (fromCursor: integer, index: integer, itemQuantity?: integer, toCursor?: integer) => void; -export type PartyModifierSpliceSelectCallback = (fromCursor: integer, toCursor?: integer) => void; +export type PartySelectCallback = (cursor: number, option: PartyOption) => void; +export type PartyModifierTransferSelectCallback = ( + fromCursor: number, + index: number, + itemQuantity?: number, + toCursor?: number, +) => void; +export type PartyModifierSpliceSelectCallback = (fromCursor: number, toCursor?: number) => void; export type PokemonSelectFilter = (pokemon: PlayerPokemon) => string | null; -export type PokemonModifierTransferSelectFilter = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => string | null; +export type PokemonModifierTransferSelectFilter = ( + pokemon: PlayerPokemon, + modifier: PokemonHeldItemModifier, +) => string | null; export type PokemonMoveSelectFilter = (pokemonMove: PokemonMove) => string | null; export default class PartyUiHandler extends MessageUiHandler { private partyUiMode: PartyUiMode; - private fieldIndex: integer; + private fieldIndex: number; private partyBg: Phaser.GameObjects.Image; private partyContainer: Phaser.GameObjects.Container; @@ -144,26 +159,26 @@ export default class PartyUiHandler extends MessageUiHandler { private optionsMode: boolean; private optionsScroll: boolean; - private optionsCursor: integer = 0; - private optionsScrollCursor: integer = 0; - private optionsScrollTotal: integer = 0; + private optionsCursor = 0; + private optionsScrollCursor = 0; + private optionsScrollTotal = 0; /** This is only public for test/ui/transfer-item.test.ts */ public optionsContainer: Phaser.GameObjects.Container; private optionsBg: Phaser.GameObjects.NineSlice; private optionsCursorObj: Phaser.GameObjects.Image | null; - private options: integer[]; + private options: number[]; private transferMode: boolean; - private transferOptionCursor: integer; - private transferCursor: integer; + private transferOptionCursor: number; + private transferCursor: number; /** Current quantity selection for every item held by the pokemon selected for the transfer */ - private transferQuantities: integer[]; + private transferQuantities: number[]; /** Stack size of every item that the selected pokemon is holding */ - private transferQuantitiesMax: integer[]; + private transferQuantitiesMax: number[]; /** Whether to transfer all items */ private transferAll: boolean; - private lastCursor: integer = 0; + private lastCursor = 0; private selectCallback: PartySelectCallback | PartyModifierTransferSelectCallback | null; private selectFilter: PokemonSelectFilter | PokemonModifierTransferSelectFilter; private moveSelectFilter: PokemonMoveSelectFilter; @@ -178,14 +193,18 @@ export default class PartyUiHandler extends MessageUiHandler { public static FilterNonFainted = (pokemon: PlayerPokemon) => { if (pokemon.isFainted()) { - return i18next.t("partyUiHandler:noEnergy", { pokemonName: getPokemonNameWithAffix(pokemon) }); + return i18next.t("partyUiHandler:noEnergy", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } return null; }; public static FilterFainted = (pokemon: PlayerPokemon) => { if (!pokemon.isFainted()) { - return i18next.t("partyUiHandler:hasEnergy", { pokemonName: getPokemonNameWithAffix(pokemon) }); + return i18next.t("partyUiHandler:hasEnergy", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } return null; }; @@ -197,9 +216,11 @@ export default class PartyUiHandler extends MessageUiHandler { */ private FilterChallengeLegal = (pokemon: PlayerPokemon) => { const challengeAllowed = new Utils.BooleanHolder(true); - applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, pokemon, challengeAllowed); + applyChallenges(globalScene.gameMode, ChallengeType.POKEMON_IN_BATTLE, pokemon, challengeAllowed); if (!challengeAllowed.value) { - return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: getPokemonNameWithAffix(pokemon) }); + return i18next.t("partyUiHandler:cantBeUsed", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } return null; }; @@ -207,55 +228,75 @@ export default class PartyUiHandler extends MessageUiHandler { private static FilterAllMoves = (_pokemonMove: PokemonMove) => null; public static FilterItemMaxStacks = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => { - const matchingModifier = pokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(modifier)) as PokemonHeldItemModifier; - if (matchingModifier && matchingModifier.stackCount === matchingModifier.getMaxStackCount(pokemon.scene)) { - return i18next.t("partyUiHandler:tooManyItems", { pokemonName: getPokemonNameWithAffix(pokemon) }); + const matchingModifier = globalScene.findModifier( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(modifier), + ) as PokemonHeldItemModifier; + if (matchingModifier && matchingModifier.stackCount === matchingModifier.getMaxStackCount()) { + return i18next.t("partyUiHandler:tooManyItems", { + pokemonName: getPokemonNameWithAffix(pokemon), + }); } return null; }; public static NoEffectMessage = i18next.t("partyUiHandler:anyEffect"); - private localizedOptions = [ PartyOption.SEND_OUT, PartyOption.SUMMARY, PartyOption.CANCEL, PartyOption.APPLY, PartyOption.RELEASE, PartyOption.TEACH, PartyOption.SPLICE, PartyOption.UNSPLICE, PartyOption.REVIVE, PartyOption.TRANSFER, PartyOption.UNPAUSE_EVOLUTION, PartyOption.PASS_BATON, PartyOption.RENAME, PartyOption.SELECT ]; + private localizedOptions = [ + PartyOption.SEND_OUT, + PartyOption.SUMMARY, + PartyOption.POKEDEX, + PartyOption.CANCEL, + PartyOption.APPLY, + PartyOption.RELEASE, + PartyOption.TEACH, + PartyOption.SPLICE, + PartyOption.UNSPLICE, + PartyOption.REVIVE, + PartyOption.TRANSFER, + PartyOption.UNPAUSE_EVOLUTION, + PartyOption.PASS_BATON, + PartyOption.RENAME, + PartyOption.SELECT, + ]; - constructor(scene: BattleScene) { - super(scene, Mode.PARTY); + constructor() { + super(Mode.PARTY); } setup() { const ui = this.getUi(); - const partyContainer = this.scene.add.container(0, 0); + const partyContainer = globalScene.add.container(0, 0); partyContainer.setName("party"); partyContainer.setVisible(false); ui.add(partyContainer); this.partyContainer = partyContainer; - this.partyBg = this.scene.add.image(0, 0, "party_bg"); + this.partyBg = globalScene.add.image(0, 0, "party_bg"); this.partyBg.setName("img-party-bg"); partyContainer.add(this.partyBg); this.partyBg.setOrigin(0, 1); - const partySlotsContainer = this.scene.add.container(0, 0); + const partySlotsContainer = globalScene.add.container(0, 0); partySlotsContainer.setName("party-slots"); partyContainer.add(partySlotsContainer); this.partySlotsContainer = partySlotsContainer; - const partyMessageBoxContainer = this.scene.add.container(0, -32); + const partyMessageBoxContainer = globalScene.add.container(0, -32); partyMessageBoxContainer.setName("party-msg-box"); partyContainer.add(partyMessageBoxContainer); - const partyMessageBox = addWindow(this.scene, 1, 31, 262, 30); + const partyMessageBox = addWindow(1, 31, 262, 30); partyMessageBox.setName("window-party-msg-box"); partyMessageBox.setOrigin(0, 1); partyMessageBoxContainer.add(partyMessageBox); this.partyMessageBox = partyMessageBox; - const partyMessageText = addTextObject(this.scene, 10, 8, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); + const partyMessageText = addTextObject(10, 8, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); partyMessageText.setName("text-party-msg"); partyMessageText.setOrigin(0, 0); @@ -263,25 +304,25 @@ export default class PartyUiHandler extends MessageUiHandler { this.message = partyMessageText; - const partyCancelButton = new PartyCancelButton(this.scene, 291, -16); + const partyCancelButton = new PartyCancelButton(291, -16); partyContainer.add(partyCancelButton); this.partyCancelButton = partyCancelButton; - this.optionsContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -1); + this.optionsContainer = globalScene.add.container(globalScene.game.canvas.width / 6 - 1, -1); partyContainer.add(this.optionsContainer); this.iconAnimHandler = new PokemonIconAnimHandler(); - this.iconAnimHandler.setup(this.scene); + this.iconAnimHandler.setup(); // prepare move overlay. in case it appears to be too big, set the overlayScale to .5 const overlayScale = 1; - this.moveInfoOverlay = new MoveInfoOverlay(this.scene, { + this.moveInfoOverlay = new MoveInfoOverlay({ scale: overlayScale, top: true, x: 1, - y: -MoveInfoOverlay.getHeight(overlayScale) - 1, //this.scene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, - width: this.scene.game.canvas.width / 12 - 30, + y: -MoveInfoOverlay.getHeight(overlayScale) - 1, + width: globalScene.game.canvas.width / 12 - 30, }); ui.add(this.moveInfoOverlay); @@ -302,20 +343,20 @@ export default class PartyUiHandler extends MessageUiHandler { this.partyUiMode = args[0] as PartyUiMode; - this.fieldIndex = args.length > 1 ? args[1] as integer : -1; + this.fieldIndex = args.length > 1 ? (args[1] as number) : -1; this.selectCallback = args.length > 2 && args[2] instanceof Function ? args[2] : undefined; - this.selectFilter = args.length > 3 && args[3] instanceof Function - ? args[3] as PokemonSelectFilter - : PartyUiHandler.FilterAll; - this.moveSelectFilter = args.length > 4 && args[4] instanceof Function - ? args[4] as PokemonMoveSelectFilter - : PartyUiHandler.FilterAllMoves; + this.selectFilter = + args.length > 3 && args[3] instanceof Function ? (args[3] as PokemonSelectFilter) : PartyUiHandler.FilterAll; + this.moveSelectFilter = + args.length > 4 && args[4] instanceof Function + ? (args[4] as PokemonMoveSelectFilter) + : PartyUiHandler.FilterAllMoves; this.tmMoveId = args.length > 5 && args[5] ? args[5] : Moves.NONE; this.showMovePp = args.length > 6 && args[6]; this.partyContainer.setVisible(true); - this.partyBg.setTexture(`party_bg${this.scene.currentBattle.double ? "_double" : ""}`); + this.partyBg.setTexture(`party_bg${globalScene.currentBattle.double ? "_double" : ""}`); this.populatePartySlots(); this.setCursor(0); @@ -346,30 +387,47 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.optionsMode) { const option = this.options[this.optionsCursor]; if (button === Button.ACTION) { - const pokemon = this.scene.getParty()[this.cursor]; + const pokemon = globalScene.getPlayerParty()[this.cursor]; if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && !this.transferMode && option !== PartyOption.CANCEL) { this.startTransfer(); let ableToTransfer: string; - for (let p = 0; p < this.scene.getParty().length; p++) { // this fore look goes through each of the party pokemon - const newPokemon = this.scene.getParty()[p]; + for (let p = 0; p < globalScene.getPlayerParty().length; p++) { + // this for look goes through each of the party pokemon + const newPokemon = globalScene.getPlayerParty()[p]; // this next line gets all of the transferable items from pokemon [p]; it does this by getting all the held modifiers that are transferable and checking to see if they belong to pokemon [p] const getTransferrableItemsFromPokemon = (newPokemon: PlayerPokemon) => - this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).isTransferable && (m as PokemonHeldItemModifier).pokemonId === newPokemon.id) as PokemonHeldItemModifier[]; + globalScene.findModifiers( + m => + m instanceof PokemonHeldItemModifier && + (m as PokemonHeldItemModifier).isTransferable && + (m as PokemonHeldItemModifier).pokemonId === newPokemon.id, + ) as PokemonHeldItemModifier[]; // this next bit checks to see if the the selected item from the original transfer pokemon exists on the new pokemon [p]; this returns undefined if the new pokemon doesn't have the item at all, otherwise it returns the pokemonHeldItemModifier for that item - const matchingModifier = newPokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === newPokemon.id && m.matchType(getTransferrableItemsFromPokemon(pokemon)[this.transferOptionCursor])) as PokemonHeldItemModifier; + const matchingModifier = globalScene.findModifier( + m => + m instanceof PokemonHeldItemModifier && + m.pokemonId === newPokemon.id && + m.matchType(getTransferrableItemsFromPokemon(pokemon)[this.transferOptionCursor]), + ) as PokemonHeldItemModifier; const partySlot = this.partySlots.filter(m => m.getPokemon() === newPokemon)[0]; // this gets pokemon [p] for us - if (p !== this.transferCursor) { // this skips adding the able/not able labels on the pokemon doing the transfer - if (matchingModifier) { // if matchingModifier exists then the item exists on the new pokemon - if (matchingModifier.getMaxStackCount(this.scene) === matchingModifier.stackCount) { // checks to see if the stack of items is at max stack; if so, set the description label to "Not able" - ableToTransfer = "Not able"; - } else { // if the pokemon isn't at max stack, make the label "Able" - ableToTransfer = "Able"; + if (p !== this.transferCursor) { + // this skips adding the able/not able labels on the pokemon doing the transfer + if (matchingModifier) { + // if matchingModifier exists then the item exists on the new pokemon + if (matchingModifier.getMaxStackCount() === matchingModifier.stackCount) { + // checks to see if the stack of items is at max stack; if so, set the description label to "Not able" + ableToTransfer = i18next.t("partyUiHandler:notAble"); + } else { + // if the pokemon isn't at max stack, make the label "Able" + ableToTransfer = i18next.t("partyUiHandler:able"); } - } else { // if matchingModifier doesn't exist, that means the pokemon doesn't have any of the item, and we need to show "Able" - ableToTransfer = "Able"; + } else { + // if matchingModifier doesn't exist, that means the pokemon doesn't have any of the item, and we need to show "Able" + ableToTransfer = i18next.t("partyUiHandler:able"); } - } else { // this else relates to the transfer pokemon. We set the text to be blank so there's no "Able"/"Not able" text + } else { + // this else relates to the transfer pokemon. We set the text to be blank so there's no "Able"/"Not able" text ableToTransfer = ""; } partySlot.slotHpBar.setVisible(false); @@ -382,7 +440,8 @@ export default class PartyUiHandler extends MessageUiHandler { this.clearOptions(); ui.playSelect(); return true; - } else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER && option !== PartyOption.CANCEL) { + } + if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER && option !== PartyOption.CANCEL) { // clear overlay on cancel this.moveInfoOverlay.clear(); const filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); @@ -395,11 +454,24 @@ export default class PartyUiHandler extends MessageUiHandler { } ui.playSelect(); return true; - } else if ((option !== PartyOption.SUMMARY && option !== PartyOption.UNPAUSE_EVOLUTION && option !== PartyOption.UNSPLICE && option !== PartyOption.RELEASE && option !== PartyOption.CANCEL && option !== PartyOption.RENAME) - || (option === PartyOption.RELEASE && this.partyUiMode === PartyUiMode.RELEASE)) { + } + if ( + ![ + PartyOption.SUMMARY, + PartyOption.POKEDEX, + PartyOption.UNPAUSE_EVOLUTION, + PartyOption.UNSPLICE, + PartyOption.RELEASE, + PartyOption.CANCEL, + PartyOption.RENAME, + ].includes(option) || + (option === PartyOption.RELEASE && this.partyUiMode === PartyUiMode.RELEASE) + ) { let filterResult: string | null; const getTransferrableItemsFromPokemon = (pokemon: PlayerPokemon) => - this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferable && m.pokemonId === pokemon.id) as PokemonHeldItemModifier[]; + globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.isTransferable && m.pokemonId === pokemon.id, + ) as PokemonHeldItemModifier[]; if (option !== PartyOption.TRANSFER && option !== PartyOption.SPLICE) { filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); if (filterResult === null && (option === PartyOption.SEND_OUT || option === PartyOption.PASS_BATON)) { @@ -409,7 +481,12 @@ export default class PartyUiHandler extends MessageUiHandler { filterResult = this.moveSelectFilter(pokemon.moveset[this.optionsCursor]!); // TODO: is this bang correct? } } else { - filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)(pokemon, getTransferrableItemsFromPokemon(this.scene.getParty()[this.transferCursor])[this.transferOptionCursor]); + filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)( + pokemon, + getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor])[ + this.transferOptionCursor + ], + ); } if (filterResult === null) { if (this.partyUiMode !== PartyUiMode.SPLICE) { @@ -419,9 +496,24 @@ export default class PartyUiHandler extends MessageUiHandler { if (option === PartyOption.TRANSFER) { if (this.transferCursor !== this.cursor) { if (this.transferAll) { - getTransferrableItemsFromPokemon(this.scene.getParty()[this.transferCursor]).forEach((_, i) => (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, i, this.transferQuantitiesMax[i], this.cursor)); + getTransferrableItemsFromPokemon(globalScene.getPlayerParty()[this.transferCursor]).forEach( + (_, i, array) => { + const invertedIndex = array.length - 1 - i; + (this.selectCallback as PartyModifierTransferSelectCallback)( + this.transferCursor, + invertedIndex, + this.transferQuantitiesMax[invertedIndex], + this.cursor, + ); + }, + ); } else { - (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, this.transferOptionCursor, this.transferQuantities[this.transferOptionCursor], this.cursor); + (this.selectCallback as PartyModifierTransferSelectCallback)( + this.transferCursor, + this.transferOptionCursor, + this.transferQuantities[this.transferOptionCursor], + this.cursor, + ); } } this.clearTransfer(); @@ -441,69 +533,130 @@ export default class PartyUiHandler extends MessageUiHandler { selectCallback(this.cursor, option); } } else { - if (option >= PartyOption.FORM_CHANGE_ITEM && this.scene.getCurrentPhase() instanceof SelectModifierPhase) { + if ( + option >= PartyOption.FORM_CHANGE_ITEM && + globalScene.getCurrentPhase() instanceof SelectModifierPhase + ) { if (this.partyUiMode === PartyUiMode.CHECK) { const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; modifier.active = !modifier.active; - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger, false, true); + globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger, false, true); } } else if (this.cursor) { - (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, this.cursor, option === PartyOption.PASS_BATON); + (globalScene.getCurrentPhase() as CommandPhase).handleCommand( + Command.POKEMON, + this.cursor, + option === PartyOption.PASS_BATON, + ); } } - if (this.partyUiMode !== PartyUiMode.MODIFIER && this.partyUiMode !== PartyUiMode.TM_MODIFIER && this.partyUiMode !== PartyUiMode.MOVE_MODIFIER) { + if ( + this.partyUiMode !== PartyUiMode.MODIFIER && + this.partyUiMode !== PartyUiMode.TM_MODIFIER && + this.partyUiMode !== PartyUiMode.MOVE_MODIFIER + ) { ui.playSelect(); } return true; - } else { - this.clearOptions(); - this.showText(filterResult as string, undefined, () => this.showText("", 0), undefined, true); } + this.clearOptions(); + this.showText(filterResult as string, undefined, () => this.showText("", 0), undefined, true); } else if (option === PartyOption.SUMMARY) { ui.playSelect(); - ui.setModeWithoutClear(Mode.SUMMARY, pokemon).then(() => this.clearOptions()); + ui.setModeWithoutClear(Mode.SUMMARY, pokemon).then(() => this.clearOptions()); + return true; + } else if (option === PartyOption.POKEDEX) { + ui.playSelect(); + const attributes = { + shiny: pokemon.shiny, + variant: pokemon.variant, + form: pokemon.formIndex, + female: pokemon.gender === Gender.FEMALE, + }; + ui.setOverlayMode(Mode.POKEDEX_PAGE, pokemon.species, pokemon.formIndex, attributes).then(() => + this.clearOptions(), + ); return true; } else if (option === PartyOption.UNPAUSE_EVOLUTION) { this.clearOptions(); ui.playSelect(); pokemon.pauseEvolutions = !pokemon.pauseEvolutions; - this.showText(i18next.t(pokemon.pauseEvolutions ? "partyUiHandler:pausedEvolutions" : "partyUiHandler:unpausedEvolutions", { pokemonName: getPokemonNameWithAffix(pokemon) }), undefined, () => this.showText("", 0), null, true); + this.showText( + i18next.t( + pokemon.pauseEvolutions ? "partyUiHandler:pausedEvolutions" : "partyUiHandler:unpausedEvolutions", + { pokemonName: getPokemonNameWithAffix(pokemon) }, + ), + undefined, + () => this.showText("", 0), + null, + true, + ); } else if (option === PartyOption.UNSPLICE) { this.clearOptions(); ui.playSelect(); - this.showText(i18next.t("partyUiHandler:unspliceConfirmation", { fusionName: pokemon.fusionSpecies?.name, pokemonName: pokemon.name }), null, () => { - ui.setModeWithoutClear(Mode.CONFIRM, () => { - const fusionName = pokemon.name; - pokemon.unfuse().then(() => { - this.clearPartySlots(); - this.populatePartySlots(); - ui.setMode(Mode.PARTY); - this.showText(i18next.t("partyUiHandler:wasReverted", { fusionName: fusionName, pokemonName: pokemon.name }), undefined, () => { + this.showText( + i18next.t("partyUiHandler:unspliceConfirmation", { + fusionName: pokemon.fusionSpecies?.name, + pokemonName: pokemon.name, + }), + null, + () => { + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + const fusionName = pokemon.name; + pokemon.unfuse().then(() => { + this.clearPartySlots(); + this.populatePartySlots(); + ui.setMode(Mode.PARTY); + this.showText( + i18next.t("partyUiHandler:wasReverted", { + fusionName: fusionName, + pokemonName: pokemon.name, + }), + undefined, + () => { + ui.setMode(Mode.PARTY); + this.showText("", 0); + }, + null, + true, + ); + }); + }, + () => { ui.setMode(Mode.PARTY); this.showText("", 0); - }, null, true); - }); - }, () => { - ui.setMode(Mode.PARTY); - this.showText("", 0); - }); - }); + }, + ); + }, + ); } else if (option === PartyOption.RELEASE) { this.clearOptions(); ui.playSelect(); - if (this.cursor >= this.scene.currentBattle.getBattlerCount() || !pokemon.isAllowedInBattle()) { + if (this.cursor >= globalScene.currentBattle.getBattlerCount() || !pokemon.isAllowedInBattle()) { this.blockInput = true; - this.showText(i18next.t("partyUiHandler:releaseConfirmation", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { - this.blockInput = false; - ui.setModeWithoutClear(Mode.CONFIRM, () => { - ui.setMode(Mode.PARTY); - this.doRelease(this.cursor); - }, () => { - ui.setMode(Mode.PARTY); - this.showText("", 0); - }); - }); + this.showText( + i18next.t("partyUiHandler:releaseConfirmation", { + pokemonName: getPokemonNameWithAffix(pokemon), + }), + null, + () => { + this.blockInput = false; + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + ui.setMode(Mode.PARTY); + this.doRelease(this.cursor); + }, + () => { + ui.setMode(Mode.PARTY); + this.showText("", 0); + }, + ); + }, + ); } else { this.showText(i18next.t("partyUiHandler:releaseInBattle"), null, () => this.showText("", 0), null, true); } @@ -511,21 +664,25 @@ export default class PartyUiHandler extends MessageUiHandler { } else if (option === PartyOption.RENAME) { this.clearOptions(); ui.playSelect(); - ui.setModeWithoutClear(Mode.RENAME_POKEMON, { - buttonActions: [ - (nickname: string) => { - ui.playSelect(); - pokemon.nickname = nickname; - pokemon.updateInfo(); - this.clearPartySlots(); - this.populatePartySlots(); - ui.setMode(Mode.PARTY); - }, - () => { - ui.setMode(Mode.PARTY); - } - ] - }, pokemon); + ui.setModeWithoutClear( + Mode.RENAME_POKEMON, + { + buttonActions: [ + (nickname: string) => { + ui.playSelect(); + pokemon.nickname = nickname; + pokemon.updateInfo(); + this.clearPartySlots(); + this.populatePartySlots(); + ui.setMode(Mode.PARTY); + }, + () => { + ui.setMode(Mode.PARTY); + }, + ], + }, + pokemon, + ); return true; } else if (option === PartyOption.CANCEL) { return this.processInput(Button.CANCEL); @@ -540,47 +697,61 @@ export default class PartyUiHandler extends MessageUiHandler { } else { switch (button) { case Button.LEFT: - /** Decrease quantity for the current item and update UI */ + /** Decrease quantity for the current item and update UI */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - this.transferQuantities[option] = this.transferQuantities[option] === 1 ? this.transferQuantitiesMax[option] : this.transferQuantities[option] - 1; + this.transferQuantities[option] = + this.transferQuantities[option] === 1 + ? this.transferQuantitiesMax[option] + : this.transferQuantities[option] - 1; this.updateOptions(); - success = this.setCursor(this.optionsCursor); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ + success = this.setCursor( + this.optionsCursor, + ); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ } break; case Button.RIGHT: - /** Increase quantity for the current item and update UI */ + /** Increase quantity for the current item and update UI */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - this.transferQuantities[option] = this.transferQuantities[option] === this.transferQuantitiesMax[option] ? 1 : this.transferQuantities[option] + 1; + this.transferQuantities[option] = + this.transferQuantities[option] === this.transferQuantitiesMax[option] + ? 1 + : this.transferQuantities[option] + 1; this.updateOptions(); - success = this.setCursor(this.optionsCursor); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ + success = this.setCursor( + this.optionsCursor, + ); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ } break; case Button.UP: - /** If currently selecting items to transfer, reset quantity selection */ + /** If currently selecting items to transfer, reset quantity selection */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { if (option !== PartyOption.ALL) { this.transferQuantities[option] = this.transferQuantitiesMax[option]; } this.updateOptions(); } - success = this.setCursor(this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1); /** Move cursor */ + success = this.setCursor( + this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1, + ); /** Move cursor */ break; case Button.DOWN: - /** If currently selecting items to transfer, reset quantity selection */ + /** If currently selecting items to transfer, reset quantity selection */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { if (option !== PartyOption.ALL) { this.transferQuantities[option] = this.transferQuantitiesMax[option]; } this.updateOptions(); } - success = this.setCursor(this.optionsCursor < this.options.length - 1 ? this.optionsCursor + 1 : 0); /** Move cursor */ + success = this.setCursor( + this.optionsCursor < this.options.length - 1 ? this.optionsCursor + 1 : 0, + ); /** Move cursor */ break; } // show move description if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER) { const option = this.options[this.optionsCursor]; - const pokemon = this.scene.getParty()[this.cursor]; + const pokemon = globalScene.getPlayerParty()[this.cursor]; const move = allMoves[pokemon.getLearnableLevelMoves()[option]]; if (move) { this.moveInfoOverlay.show(move); @@ -595,8 +766,12 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.cursor < 6) { if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && !this.transferMode) { /** Initialize item quantities for the selected Pokemon */ - const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.isTransferable && m.pokemonId === this.scene.getParty()[this.cursor].id) as PokemonHeldItemModifier[]; + const itemModifiers = globalScene.findModifiers( + m => + m instanceof PokemonHeldItemModifier && + m.isTransferable && + m.pokemonId === globalScene.getPlayerParty()[this.cursor].id, + ) as PokemonHeldItemModifier[]; this.transferQuantities = itemModifiers.map(item => item.getStackCount()); this.transferQuantitiesMax = itemModifiers.map(item => item.getStackCount()); } @@ -608,8 +783,12 @@ export default class PartyUiHandler extends MessageUiHandler { return this.processInput(Button.CANCEL); } return true; - } else if (button === Button.CANCEL) { - if ((this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER || this.partyUiMode === PartyUiMode.SPLICE) && this.transferMode) { + } + if (button === Button.CANCEL) { + if ( + (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER || this.partyUiMode === PartyUiMode.SPLICE) && + this.transferMode + ) { this.clearTransfer(); ui.playSelect(); } else if (this.partyUiMode !== PartyUiMode.FAINT_SWITCH && this.partyUiMode !== PartyUiMode.REVIVAL_BLESSING) { @@ -628,14 +807,14 @@ export default class PartyUiHandler extends MessageUiHandler { } const slotCount = this.partySlots.length; - const battlerCount = this.scene.currentBattle.getBattlerCount(); + const battlerCount = globalScene.currentBattle.getBattlerCount(); switch (button) { case Button.UP: - success = this.setCursor(this.cursor ? this.cursor < 6 ? this.cursor - 1 : slotCount - 1 : 6); + success = this.setCursor(this.cursor ? (this.cursor < 6 ? this.cursor - 1 : slotCount - 1) : 6); break; case Button.DOWN: - success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0); + success = this.setCursor(this.cursor < 6 ? (this.cursor < slotCount - 1 ? this.cursor + 1 : 6) : 0); break; case Button.LEFT: if (this.cursor >= battlerCount && this.cursor <= 6) { @@ -646,11 +825,13 @@ export default class PartyUiHandler extends MessageUiHandler { if (slotCount === battlerCount) { success = this.setCursor(6); break; - } else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1) { + } + if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1) { success = this.setCursor(2); break; - } else if (slotCount > battlerCount && this.cursor < battlerCount) { - success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); + } + if (slotCount > battlerCount && this.cursor < battlerCount) { + success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); break; } } @@ -664,7 +845,7 @@ export default class PartyUiHandler extends MessageUiHandler { } populatePartySlots() { - const party = this.scene.getParty(); + const party = globalScene.getPlayerParty(); if (this.cursor < 6 && this.cursor >= party.length) { this.cursor = party.length - 1; @@ -676,9 +857,9 @@ export default class PartyUiHandler extends MessageUiHandler { } for (const p in party) { - const slotIndex = parseInt(p); - const partySlot = new PartySlot(this.scene, slotIndex, party[p], this.iconAnimHandler, this.partyUiMode, this.tmMoveId); - this.scene.add.existing(partySlot); + const slotIndex = Number.parseInt(p); + const partySlot = new PartySlot(slotIndex, party[p], this.iconAnimHandler, this.partyUiMode, this.tmMoveId); + globalScene.add.existing(partySlot); this.partySlotsContainer.add(partySlot); this.partySlots.push(partySlot); if (this.cursor === slotIndex) { @@ -687,7 +868,7 @@ export default class PartyUiHandler extends MessageUiHandler { } } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { let changed: boolean; if (this.optionsMode) { @@ -698,7 +879,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.optionsScrollCursor = cursor ? this.optionsScrollTotal - 8 : 0; this.updateOptions(); } else { - const isDown = cursor && cursor > this.optionsCursor; + const isDown = cursor && cursor > this.optionsCursor; if (isDown) { if (this.options[cursor] === PartyOption.SCROLL_DOWN) { isScroll = true; @@ -721,11 +902,14 @@ export default class PartyUiHandler extends MessageUiHandler { this.optionsCursor = cursor; } if (!this.optionsCursorObj) { - this.optionsCursorObj = this.scene.add.image(0, 0, "cursor"); + this.optionsCursorObj = globalScene.add.image(0, 0, "cursor"); this.optionsCursorObj.setOrigin(0, 0); this.optionsContainer.add(this.optionsCursorObj); } - this.optionsCursorObj.setPosition(8 - this.optionsBg.displayWidth, -19 - (16 * ((this.options.length - 1) - this.optionsCursor))); + this.optionsCursorObj.setPosition( + 8 - this.optionsBg.displayWidth, + -19 - 16 * (this.options.length - 1 - this.optionsCursor), + ); } else { changed = this.cursor !== cursor; if (changed) { @@ -747,7 +931,14 @@ export default class PartyUiHandler extends MessageUiHandler { return changed; } - showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null) { + showText( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ) { if (text.length === 0) { text = defaultMessage; } @@ -803,21 +994,22 @@ export default class PartyUiHandler extends MessageUiHandler { } updateOptions(): void { - const pokemon = this.scene.getParty()[this.cursor]; + const pokemon = globalScene.getPlayerParty()[this.cursor]; - const learnableLevelMoves = this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER - ? pokemon.getLearnableLevelMoves() - : []; + const learnableLevelMoves = + this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER ? pokemon.getLearnableLevelMoves() : []; if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER && learnableLevelMoves?.length) { // show the move overlay with info for the first move this.moveInfoOverlay.show(allMoves[learnableLevelMoves[0]]); } - const itemModifiers = this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER - ? this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.isTransferable && m.pokemonId === pokemon.id) as PokemonHeldItemModifier[] - : []; + const itemModifiers = + this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER + ? (globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.isTransferable && m.pokemonId === pokemon.id, + ) as PokemonHeldItemModifier[]) + : []; if (this.options.length) { this.options.splice(0, this.options.length); @@ -827,27 +1019,40 @@ export default class PartyUiHandler extends MessageUiHandler { let formChangeItemModifiers: PokemonFormChangeItemModifier[] | undefined; - if (this.partyUiMode !== PartyUiMode.MOVE_MODIFIER && this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.transferMode || this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER)) { + if ( + this.partyUiMode !== PartyUiMode.MOVE_MODIFIER && + this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && + (this.transferMode || this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER) + ) { switch (this.partyUiMode) { case PartyUiMode.SWITCH: case PartyUiMode.FAINT_SWITCH: case PartyUiMode.POST_BATTLE_SWITCH: - if (this.cursor >= this.scene.currentBattle.getBattlerCount()) { + if (this.cursor >= globalScene.currentBattle.getBattlerCount()) { const allowBatonModifierSwitch = - this.partyUiMode !== PartyUiMode.FAINT_SWITCH - && this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier - && (m as SwitchEffectTransferModifier).pokemonId === this.scene.getPlayerField()[this.fieldIndex].id); + this.partyUiMode !== PartyUiMode.FAINT_SWITCH && + globalScene.findModifier( + m => + m instanceof SwitchEffectTransferModifier && + (m as SwitchEffectTransferModifier).pokemonId === globalScene.getPlayerField()[this.fieldIndex].id, + ); - const moveHistory = this.scene.getPlayerField()[this.fieldIndex].getMoveHistory(); - const isBatonPassMove = this.partyUiMode === PartyUiMode.FAINT_SWITCH && moveHistory.length && allMoves[moveHistory[moveHistory.length - 1].move].getAttrs(ForceSwitchOutAttr)[0]?.isBatonPass() && moveHistory[moveHistory.length - 1].result === MoveResult.SUCCESS; + const moveHistory = globalScene.getPlayerField()[this.fieldIndex].getMoveHistory(); + const isBatonPassMove = + this.partyUiMode === PartyUiMode.FAINT_SWITCH && + moveHistory.length && + allMoves[moveHistory[moveHistory.length - 1].move].getAttrs(ForceSwitchOutAttr)[0]?.isBatonPass() && + moveHistory[moveHistory.length - 1].result === MoveResult.SUCCESS; // isBatonPassMove and allowBatonModifierSwitch shouldn't ever be true // at the same time, because they both explicitly check for a mutually // exclusive partyUiMode. But better safe than sorry. - this.options.push(isBatonPassMove && !allowBatonModifierSwitch ? PartyOption.PASS_BATON : PartyOption.SEND_OUT); + this.options.push( + isBatonPassMove && !allowBatonModifierSwitch ? PartyOption.PASS_BATON : PartyOption.SEND_OUT, + ); if (allowBatonModifierSwitch && !isBatonPassMove) { - // the BATON modifier gives an extra switch option for - // pokemon-command switches, allowing buffs to be optionally passed + // the BATON modifier gives an extra switch option for + // pokemon-command switches, allowing buffs to be optionally passed this.options.push(PartyOption.PASS_BATON); } } @@ -877,7 +1082,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.options.push(PartyOption.RELEASE); break; case PartyUiMode.CHECK: - if (this.scene.getCurrentPhase() instanceof SelectModifierPhase) { + if (globalScene.getCurrentPhase() instanceof SelectModifierPhase) { formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); for (let i = 0; i < formChangeItemModifiers.length; i++) { this.options.push(PartyOption.FORM_CHANGE_ITEM + i); @@ -890,9 +1095,15 @@ export default class PartyUiHandler extends MessageUiHandler { } this.options.push(PartyOption.SUMMARY); + this.options.push(PartyOption.POKEDEX); this.options.push(PartyOption.RENAME); - if ((pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) || (pokemon.isFusion() && pokemon.fusionSpecies && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId)))) { + if ( + pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) || + (pokemon.isFusion() && + pokemon.fusionSpecies && + pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId)) + ) { this.options.push(PartyOption.UNPAUSE_EVOLUTION); } @@ -924,7 +1135,10 @@ export default class PartyUiHandler extends MessageUiHandler { this.optionsScrollTotal = this.options.length; let optionStartIndex = this.optionsScrollCursor; - let optionEndIndex = Math.min(this.optionsScrollTotal, optionStartIndex + (!optionStartIndex || this.optionsScrollCursor + 8 >= this.optionsScrollTotal ? 8 : 7)); + let optionEndIndex = Math.min( + this.optionsScrollTotal, + optionStartIndex + (!optionStartIndex || this.optionsScrollCursor + 8 >= this.optionsScrollTotal ? 8 : 7), + ); this.optionsScroll = this.optionsScrollTotal > 9; @@ -941,7 +1155,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.options.push(PartyOption.CANCEL); - this.optionsBg = addWindow(this.scene, 0, 0, 0, 16 * this.options.length + 13); + this.optionsBg = addWindow(0, 0, 0, 16 * this.options.length + 13); this.optionsBg.setOrigin(1, 1); this.optionsContainer.add(this.optionsBg); @@ -960,7 +1174,11 @@ export default class PartyUiHandler extends MessageUiHandler { optionName = "↑"; } else if (option === PartyOption.SCROLL_DOWN) { optionName = "↓"; - } else if ((this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER || this.transferMode)) || option === PartyOption.CANCEL) { + } else if ( + (this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && + (this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER || this.transferMode)) || + option === PartyOption.CANCEL + ) { switch (option) { case PartyOption.MOVE_1: case PartyOption.MOVE_2: @@ -993,7 +1211,10 @@ export default class PartyUiHandler extends MessageUiHandler { } else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER) { const move = learnableLevelMoves[option]; optionName = allMoves[move].name; - altText = !pokemon.getSpeciesForm().getLevelMoves().find(plm => plm[1] === move); + altText = !pokemon + .getSpeciesForm() + .getLevelMoves() + .find(plm => plm[1] === move); } else if (option === PartyOption.ALL) { optionName = i18next.t("partyUiHandler:ALL"); } else { @@ -1002,7 +1223,7 @@ export default class PartyUiHandler extends MessageUiHandler { } const yCoord = -6 - 16 * o; - const optionText = addBBCodeTextObject(this.scene, 0, yCoord - 16, optionName, TextStyle.WINDOW, { maxLines: 1 }); + const optionText = addBBCodeTextObject(0, yCoord - 16, optionName, TextStyle.WINDOW, { maxLines: 1 }); if (altText) { optionText.setColor("#40c8f8"); optionText.setShadowColor("#006090"); @@ -1011,7 +1232,13 @@ export default class PartyUiHandler extends MessageUiHandler { /** For every item that has stack bigger than 1, display the current quantity selection */ const itemModifier = itemModifiers[option]; - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && this.transferQuantitiesMax[option] > 1 && !this.transferMode && itemModifier !== undefined && itemModifier.type.name === optionName) { + if ( + this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && + this.transferQuantitiesMax[option] > 1 && + !this.transferMode && + itemModifier !== undefined && + itemModifier.type.name === optionName + ) { let amountText = ` (${this.transferQuantities[option]})`; /** If the amount held is the maximum, display the count in red */ @@ -1058,69 +1285,104 @@ export default class PartyUiHandler extends MessageUiHandler { } } - doRelease(slotIndex: integer): void { - this.showText(this.getReleaseMessage(getPokemonNameWithAffix(this.scene.getParty()[slotIndex])), null, () => { - this.clearPartySlots(); - this.scene.removePartyMemberModifiers(slotIndex); - const releasedPokemon = this.scene.getParty().splice(slotIndex, 1)[0]; - releasedPokemon.destroy(); - this.populatePartySlots(); - if (this.cursor >= this.scene.getParty().length) { - this.setCursor(this.cursor - 1); - } - if (this.partyUiMode === PartyUiMode.RELEASE) { - const selectCallback = this.selectCallback; - this.selectCallback = null; - selectCallback && selectCallback(this.cursor, PartyOption.RELEASE); - } - this.showText("", 0); - }, null, true); + doRelease(slotIndex: number): void { + this.showText( + this.getReleaseMessage(getPokemonNameWithAffix(globalScene.getPlayerParty()[slotIndex])), + null, + () => { + this.clearPartySlots(); + globalScene.removePartyMemberModifiers(slotIndex); + const releasedPokemon = globalScene.getPlayerParty().splice(slotIndex, 1)[0]; + releasedPokemon.destroy(); + this.populatePartySlots(); + if (this.cursor >= globalScene.getPlayerParty().length) { + this.setCursor(this.cursor - 1); + } + if (this.partyUiMode === PartyUiMode.RELEASE) { + const selectCallback = this.selectCallback; + this.selectCallback = null; + selectCallback?.(this.cursor, PartyOption.RELEASE); + } + this.showText("", 0); + }, + null, + true, + ); } getReleaseMessage(pokemonName: string): string { const rand = Utils.randInt(128); if (rand < 20) { return i18next.t("partyUiHandler:goodbye", { pokemonName: pokemonName }); - } else if (rand < 40) { - return i18next.t("partyUiHandler:byebye", { pokemonName: pokemonName }); - } else if (rand < 60) { - return i18next.t("partyUiHandler:farewell", { pokemonName: pokemonName }); - } else if (rand < 80) { - return i18next.t("partyUiHandler:soLong", { pokemonName: pokemonName }); - } else if (rand < 100) { - return i18next.t("partyUiHandler:thisIsWhereWePart", { pokemonName: pokemonName }); - } else if (rand < 108) { - return i18next.t("partyUiHandler:illMissYou", { pokemonName: pokemonName }); - } else if (rand < 116) { - return i18next.t("partyUiHandler:illNeverForgetYou", { pokemonName: pokemonName }); - } else if (rand < 124) { - return i18next.t("partyUiHandler:untilWeMeetAgain", { pokemonName: pokemonName }); - } else if (rand < 127) { - return i18next.t("partyUiHandler:sayonara", { pokemonName: pokemonName }); - } else { - return i18next.t("partyUiHandler:smellYaLater", { pokemonName: pokemonName }); } + if (rand < 40) { + return i18next.t("partyUiHandler:byebye", { pokemonName: pokemonName }); + } + if (rand < 60) { + return i18next.t("partyUiHandler:farewell", { pokemonName: pokemonName }); + } + if (rand < 80) { + return i18next.t("partyUiHandler:soLong", { pokemonName: pokemonName }); + } + if (rand < 100) { + return i18next.t("partyUiHandler:thisIsWhereWePart", { + pokemonName: pokemonName, + }); + } + if (rand < 108) { + return i18next.t("partyUiHandler:illMissYou", { + pokemonName: pokemonName, + }); + } + if (rand < 116) { + return i18next.t("partyUiHandler:illNeverForgetYou", { + pokemonName: pokemonName, + }); + } + if (rand < 124) { + return i18next.t("partyUiHandler:untilWeMeetAgain", { + pokemonName: pokemonName, + }); + } + if (rand < 127) { + return i18next.t("partyUiHandler:sayonara", { pokemonName: pokemonName }); + } + return i18next.t("partyUiHandler:smellYaLater", { + pokemonName: pokemonName, + }); } getFormChangeItemsModifiers(pokemon: Pokemon) { - let formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; - const ultraNecrozmaModifiers = formChangeItemModifiers.filter(m => m.active && m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z); + let formChangeItemModifiers = globalScene.findModifiers( + m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id, + ) as PokemonFormChangeItemModifier[]; + const ultraNecrozmaModifiers = formChangeItemModifiers.filter( + m => m.active && m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z, + ); if (ultraNecrozmaModifiers.length > 0) { // ULTRANECROZIUM_Z is active and deactivating it should be the only option return ultraNecrozmaModifiers; } if (formChangeItemModifiers.find(m => m.active)) { // a form is currently active. the user has to disable the form or activate ULTRANECROZIUM_Z - formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active || m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z); + formChangeItemModifiers = formChangeItemModifiers.filter( + m => m.active || m.formChangeItem === FormChangeItem.ULTRANECROZIUM_Z, + ); } else if (pokemon.species.speciesId === Species.NECROZMA) { // no form is currently active. the user has to activate some form, except ULTRANECROZIUM_Z - formChangeItemModifiers = formChangeItemModifiers.filter(m => m.formChangeItem !== FormChangeItem.ULTRANECROZIUM_Z); + formChangeItemModifiers = formChangeItemModifiers.filter( + m => m.formChangeItem !== FormChangeItem.ULTRANECROZIUM_Z, + ); } return formChangeItemModifiers; } - getOptionsCursorWithScroll(): integer { - return this.optionsCursor + this.optionsScrollCursor + (this.options && this.options[0] === PartyOption.SCROLL_UP ? -1 : 0); + getOptionsCursorWithScroll(): number { + return ( + this.optionsCursor + + this.optionsScrollCursor + + (this.options && this.options[0] === PartyOption.SCROLL_UP ? -1 : 0) + ); } clearOptions() { @@ -1162,7 +1424,7 @@ export default class PartyUiHandler extends MessageUiHandler { class PartySlot extends Phaser.GameObjects.Container { private selected: boolean; private transfer: boolean; - private slotIndex: integer; + private slotIndex: number; private pokemon: PlayerPokemon; private slotBg: Phaser.GameObjects.Image; @@ -1173,14 +1435,25 @@ class PartySlot extends Phaser.GameObjects.Container { public slotHpText: Phaser.GameObjects.Text; public slotDescriptionLabel: Phaser.GameObjects.Text; // this is used to show text instead of the HP bar i.e. for showing "Able"/"Not Able" for TMs when you try to learn them - private pokemonIcon: Phaser.GameObjects.Container; private iconAnimHandler: PokemonIconAnimHandler; - constructor(scene: BattleScene, slotIndex: integer, pokemon: PlayerPokemon, iconAnimHandler: PokemonIconAnimHandler, partyUiMode: PartyUiMode, tmMoveId: Moves) { - super(scene, slotIndex >= scene.currentBattle.getBattlerCount() ? 230.5 : 64, - slotIndex >= scene.currentBattle.getBattlerCount() ? -184 + (scene.currentBattle.double ? -40 : 0) - + (28 + (scene.currentBattle.double ? 8 : 0)) * slotIndex : -124 + (scene.currentBattle.double ? -8 : 0) + slotIndex * 64); + constructor( + slotIndex: number, + pokemon: PlayerPokemon, + iconAnimHandler: PokemonIconAnimHandler, + partyUiMode: PartyUiMode, + tmMoveId: Moves, + ) { + super( + globalScene, + slotIndex >= globalScene.currentBattle.getBattlerCount() ? 230.5 : 64, + slotIndex >= globalScene.currentBattle.getBattlerCount() + ? -184 + + (globalScene.currentBattle.double ? -40 : 0) + + (28 + (globalScene.currentBattle.double ? 8 : 0)) * slotIndex + : -124 + (globalScene.currentBattle.double ? -8 : 0) + slotIndex * 64, + ); this.slotIndex = slotIndex; this.pokemon = pokemon; @@ -1194,36 +1467,43 @@ class PartySlot extends Phaser.GameObjects.Container { } setup(partyUiMode: PartyUiMode, tmMoveId: Moves) { - const battlerCount = (this.scene as BattleScene).currentBattle.getBattlerCount(); + const currentLanguage = i18next.resolvedLanguage ?? "en"; + const offsetJa = currentLanguage === "ja"; + + const battlerCount = globalScene.currentBattle.getBattlerCount(); const slotKey = `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`; - const slotBg = this.scene.add.sprite(0, 0, slotKey, `${slotKey}${this.pokemon.hp ? "" : "_fnt"}`); + const slotBg = globalScene.add.sprite(0, 0, slotKey, `${slotKey}${this.pokemon.hp ? "" : "_fnt"}`); this.slotBg = slotBg; this.add(slotBg); - const slotPb = this.scene.add.sprite(this.slotIndex >= battlerCount ? -85.5 : -51, this.slotIndex >= battlerCount ? 0 : -20.5, "party_pb"); + const slotPb = globalScene.add.sprite( + this.slotIndex >= battlerCount ? -85.5 : -51, + this.slotIndex >= battlerCount ? 0 : -20.5, + "party_pb", + ); this.slotPb = slotPb; this.add(slotPb); - this.pokemonIcon = (this.scene as BattleScene).addPokemonIcon(this.pokemon, slotPb.x, slotPb.y, 0.5, 0.5, true); + this.pokemonIcon = globalScene.addPokemonIcon(this.pokemon, slotPb.x, slotPb.y, 0.5, 0.5, true); this.add(this.pokemonIcon); this.iconAnimHandler.addOrUpdate(this.pokemonIcon, PokemonIconAnimMode.PASSIVE); - const slotInfoContainer = this.scene.add.container(0, 0); + const slotInfoContainer = globalScene.add.container(0, 0); this.add(slotInfoContainer); let displayName = this.pokemon.getNameToRender(); let nameTextWidth: number; - const nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); + const nameSizeTest = addTextObject(0, 0, displayName, TextStyle.PARTY); nameTextWidth = nameSizeTest.displayWidth; - while (nameTextWidth > (this.slotIndex >= battlerCount ? 52 : (76 - (this.pokemon.fusionSpecies ? 8 : 0)))) { + while (nameTextWidth > (this.slotIndex >= battlerCount ? 52 : 76 - (this.pokemon.fusionSpecies ? 8 : 0))) { displayName = `${displayName.slice(0, displayName.endsWith(".") ? -2 : -1).trimEnd()}.`; nameSizeTest.setText(displayName); nameTextWidth = nameSizeTest.displayWidth; @@ -1231,24 +1511,37 @@ class PartySlot extends Phaser.GameObjects.Container { nameSizeTest.destroy(); - this.slotName = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); - this.slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, this.slotIndex >= battlerCount ? 2 : 10); + this.slotName = addTextObject(0, 0, displayName, TextStyle.PARTY); + this.slotName.setPositionRelative( + slotBg, + this.slotIndex >= battlerCount ? 21 : 24, + (this.slotIndex >= battlerCount ? 2 : 10) + (offsetJa ? 2 : 0), + ); this.slotName.setOrigin(0, 0); - const slotLevelLabel = this.scene.add.image(0, 0, "party_slot_overlay_lv"); - slotLevelLabel.setPositionRelative(this.slotName, 8, 12); + const slotLevelLabel = globalScene.add.image(0, 0, "party_slot_overlay_lv"); + slotLevelLabel.setPositionRelative( + slotBg, + (this.slotIndex >= battlerCount ? 21 : 24) + 8, + (this.slotIndex >= battlerCount ? 2 : 10) + 12, + ); slotLevelLabel.setOrigin(0, 0); - const slotLevelText = addTextObject(this.scene, 0, 0, this.pokemon.level.toString(), this.pokemon.level < (this.scene as BattleScene).getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED); - slotLevelText.setPositionRelative(slotLevelLabel, 9, 0); + const slotLevelText = addTextObject( + 0, + 0, + this.pokemon.level.toString(), + this.pokemon.level < globalScene.getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED, + ); + slotLevelText.setPositionRelative(slotLevelLabel, 9, offsetJa ? 1.5 : 0); slotLevelText.setOrigin(0, 0.25); - slotInfoContainer.add([ this.slotName, slotLevelLabel, slotLevelText ]); + slotInfoContainer.add([this.slotName, slotLevelLabel, slotLevelText]); const genderSymbol = getGenderSymbol(this.pokemon.getGender(true)); if (genderSymbol) { - const slotGenderText = addTextObject(this.scene, 0, 0, genderSymbol, TextStyle.PARTY); + const slotGenderText = addTextObject(0, 0, genderSymbol, TextStyle.PARTY); slotGenderText.setColor(getGenderColor(this.pokemon.getGender(true))); slotGenderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true)); if (this.slotIndex >= battlerCount) { @@ -1262,7 +1555,7 @@ class PartySlot extends Phaser.GameObjects.Container { } if (this.pokemon.fusionSpecies) { - const splicedIcon = this.scene.add.image(0, 0, "icon_spliced"); + const splicedIcon = globalScene.add.image(0, 0, "icon_spliced"); splicedIcon.setScale(0.5); splicedIcon.setOrigin(0, 0); if (this.slotIndex >= battlerCount) { @@ -1275,7 +1568,7 @@ class PartySlot extends Phaser.GameObjects.Container { } if (this.pokemon.status) { - const statusIndicator = this.scene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("statuses")); + const statusIndicator = globalScene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("statuses")); statusIndicator.setFrame(StatusEffect[this.pokemon.status?.effect].toLowerCase()); statusIndicator.setOrigin(0, 0); statusIndicator.setPositionRelative(slotLevelLabel, this.slotIndex >= battlerCount ? 43 : 55, 0); @@ -1286,7 +1579,7 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.pokemon.isShiny()) { const doubleShiny = this.pokemon.isFusion() && this.pokemon.shiny && this.pokemon.fusionShiny; - const shinyStar = this.scene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`); + const shinyStar = globalScene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`); shinyStar.setOrigin(0, 0); shinyStar.setPositionRelative(this.slotName, -9, 3); shinyStar.setTint(getVariantTint(!doubleShiny ? this.pokemon.getVariant() : this.pokemon.variant)); @@ -1294,7 +1587,7 @@ class PartySlot extends Phaser.GameObjects.Container { slotInfoContainer.add(shinyStar); if (doubleShiny) { - const fusionShinyStar = this.scene.add.image(0, 0, "shiny_star_small_2"); + const fusionShinyStar = globalScene.add.image(0, 0, "shiny_star_small_2"); fusionShinyStar.setOrigin(0, 0); fusionShinyStar.setPosition(shinyStar.x, shinyStar.y); fusionShinyStar.setTint(getVariantTint(this.pokemon.fusionVariant)); @@ -1303,30 +1596,47 @@ class PartySlot extends Phaser.GameObjects.Container { } } - this.slotHpBar = this.scene.add.image(0, 0, "party_slot_hp_bar"); - this.slotHpBar.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 72 : 8, this.slotIndex >= battlerCount ? 6 : 31); + this.slotHpBar = globalScene.add.image(0, 0, "party_slot_hp_bar"); + this.slotHpBar.setPositionRelative( + slotBg, + this.slotIndex >= battlerCount ? 72 : 8, + this.slotIndex >= battlerCount ? 6 : 31, + ); this.slotHpBar.setOrigin(0, 0); this.slotHpBar.setVisible(false); const hpRatio = this.pokemon.getHpRatio(); - this.slotHpOverlay = this.scene.add.sprite(0, 0, "party_slot_hp_overlay", hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low"); + this.slotHpOverlay = globalScene.add.sprite( + 0, + 0, + "party_slot_hp_overlay", + hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low", + ); this.slotHpOverlay.setPositionRelative(this.slotHpBar, 16, 2); this.slotHpOverlay.setOrigin(0, 0); this.slotHpOverlay.setScale(hpRatio, 1); this.slotHpOverlay.setVisible(false); - this.slotHpText = addTextObject(this.scene, 0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY); - this.slotHpText.setPositionRelative(this.slotHpBar, this.slotHpBar.width - 3, this.slotHpBar.height - 2); + this.slotHpText = addTextObject(0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY); + this.slotHpText.setPositionRelative( + this.slotHpBar, + this.slotHpBar.width - 3, + this.slotHpBar.height - 2 + (offsetJa ? 2 : 0), + ); this.slotHpText.setOrigin(1, 0); this.slotHpText.setVisible(false); - this.slotDescriptionLabel = addTextObject(this.scene, 0, 0, "", TextStyle.MESSAGE); - this.slotDescriptionLabel.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 94 : 32, this.slotIndex >= battlerCount ? 16 : 46); + this.slotDescriptionLabel = addTextObject(0, 0, "", TextStyle.MESSAGE); + this.slotDescriptionLabel.setPositionRelative( + slotBg, + this.slotIndex >= battlerCount ? 94 : 32, + this.slotIndex >= battlerCount ? 16 : 46, + ); this.slotDescriptionLabel.setOrigin(0, 1); this.slotDescriptionLabel.setVisible(false); - slotInfoContainer.add([ this.slotHpBar, this.slotHpOverlay, this.slotHpText, this.slotDescriptionLabel ]); + slotInfoContainer.add([this.slotHpBar, this.slotHpOverlay, this.slotHpText, this.slotDescriptionLabel]); if (partyUiMode !== PartyUiMode.TM_MODIFIER) { this.slotDescriptionLabel.setVisible(false); @@ -1349,7 +1659,6 @@ class PartySlot extends Phaser.GameObjects.Container { this.slotDescriptionLabel.setText(slotTmText); this.slotDescriptionLabel.setVisible(true); - } } @@ -1387,9 +1696,11 @@ class PartySlot extends Phaser.GameObjects.Container { } private updateSlotTexture(): void { - const battlerCount = (this.scene as BattleScene).currentBattle.getBattlerCount(); - this.slotBg.setTexture(`party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`, - `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}${this.transfer ? "_swap" : this.pokemon.hp ? "" : "_fnt"}${this.selected ? "_sel" : ""}`); + const battlerCount = globalScene.currentBattle.getBattlerCount(); + this.slotBg.setTexture( + `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`, + `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}${this.transfer ? "_swap" : this.pokemon.hp ? "" : "_fnt"}${this.selected ? "_sel" : ""}`, + ); } } @@ -1399,24 +1710,24 @@ class PartyCancelButton extends Phaser.GameObjects.Container { private partyCancelBg: Phaser.GameObjects.Sprite; private partyCancelPb: Phaser.GameObjects.Sprite; - constructor(scene: BattleScene, x: number, y: number) { - super(scene, x, y); + constructor(x: number, y: number) { + super(globalScene, x, y); this.setup(); } setup() { - const partyCancelBg = this.scene.add.sprite(0, 0, "party_cancel"); + const partyCancelBg = globalScene.add.sprite(0, 0, "party_cancel"); this.add(partyCancelBg); this.partyCancelBg = partyCancelBg; - const partyCancelPb = this.scene.add.sprite(-17, 0, "party_pb"); + const partyCancelPb = globalScene.add.sprite(-17, 0, "party_pb"); this.add(partyCancelPb); this.partyCancelPb = partyCancelPb; - const partyCancelText = addTextObject(this.scene, -8, -7, i18next.t("partyUiHandler:cancel"), TextStyle.PARTY); + const partyCancelText = addTextObject(-8, -7, i18next.t("partyUiHandler:cancel"), TextStyle.PARTY); this.add(partyCancelText); } diff --git a/src/ui/pokeball-tray.ts b/src/ui/pokeball-tray.ts index 0313812ef79..0bf47699cdb 100644 --- a/src/ui/pokeball-tray.ts +++ b/src/ui/pokeball-tray.ts @@ -1,5 +1,5 @@ -import BattleScene from "../battle-scene"; -import Pokemon from "../field/pokemon"; +import { globalScene } from "#app/global-scene"; +import type Pokemon from "../field/pokemon"; export default class PokeballTray extends Phaser.GameObjects.Container { private player: boolean; @@ -9,18 +9,40 @@ export default class PokeballTray extends Phaser.GameObjects.Container { public shown: boolean; - constructor(scene: BattleScene, player: boolean) { - super(scene, player ? (scene.game.canvas.width / 6) : 0, player ? -72 : -144); + constructor(player: boolean) { + super(globalScene, player ? globalScene.game.canvas.width / 6 : 0, player ? -72 : -144); this.player = player; } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, `pb_tray_overlay_${this.player ? "player" : "enemy"}`, undefined, 104, 4, 48, 8, 0, 0); + this.bg = globalScene.add.nineslice( + 0, + 0, + `pb_tray_overlay_${this.player ? "player" : "enemy"}`, + undefined, + 104, + 4, + 48, + 8, + 0, + 0, + ); this.bg.setOrigin(this.player ? 1 : 0, 0); this.add(this.bg); - this.balls = new Array(6).fill(null).map((_, i) => this.scene.add.sprite((this.player ? -83 : 76) + (this.scene.game.canvas.width / 6) * (this.player ? -1 : 1) + 10 * i * (this.player ? 1 : -1), -8, "pb_tray_ball", "empty")); + this.balls = new Array(6) + .fill(null) + .map((_, i) => + globalScene.add.sprite( + (this.player ? -83 : 76) + + (globalScene.game.canvas.width / 6) * (this.player ? -1 : 1) + + 10 * i * (this.player ? 1 : -1), + -8, + "pb_tray_ball", + "empty", + ), + ); for (const ball of this.balls) { ball.setOrigin(0, 0); @@ -37,7 +59,7 @@ export default class PokeballTray extends Phaser.GameObjects.Container { return resolve(); } - (this.scene as BattleScene).fieldUI.bringToTop(this); + globalScene.fieldUI.bringToTop(this); this.x += 104 * (this.player ? 1 : -1); @@ -45,7 +67,7 @@ export default class PokeballTray extends Phaser.GameObjects.Container { this.bg.alpha = 1; this.balls.forEach((ball, b) => { - ball.x += (this.scene.game.canvas.width / 6 + 104) * (this.player ? 1 : -1); + ball.x += (globalScene.game.canvas.width / 6 + 104) * (this.player ? 1 : -1); let ballFrame = "ball"; if (b >= party.length) { ballFrame = "empty"; @@ -57,30 +79,30 @@ export default class PokeballTray extends Phaser.GameObjects.Container { ball.setFrame(ballFrame); }); - (this.scene as BattleScene).playSound("se/pb_tray_enter"); + globalScene.playSound("se/pb_tray_enter"); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, x: `${this.player ? "-" : "+"}=104`, duration: 500, ease: "Sine.easeIn", onComplete: () => { this.balls.forEach((ball, b) => { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: ball, x: `${this.player ? "-" : "+"}=104`, duration: b * 100, ease: "Sine.easeIn", - onComplete: () => (this.scene as BattleScene).playSound(`se/${(b < party.length ? "pb_tray_ball" : "pb_tray_empty")}`) + onComplete: () => globalScene.playSound(`se/${b < party.length ? "pb_tray_ball" : "pb_tray_empty"}`), }); }); - } + }, }); this.setVisible(true); this.shown = true; - this.scene.time.delayedCall(1100, () => resolve()); + globalScene.time.delayedCall(1100, () => resolve()); }); } @@ -91,24 +113,24 @@ export default class PokeballTray extends Phaser.GameObjects.Container { } this.balls.forEach((ball, b) => { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: ball, - x: `${this.player ? "-" : "+"}=${this.scene.game.canvas.width / 6}`, + x: `${this.player ? "-" : "+"}=${globalScene.game.canvas.width / 6}`, duration: 250, delay: b * 100, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.bg, width: 144, alpha: 0, duration: 500, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); - this.scene.time.delayedCall(850, () => { + globalScene.time.delayedCall(850, () => { this.setVisible(false); resolve(); }); diff --git a/src/ui/pokedex-info-overlay.ts b/src/ui/pokedex-info-overlay.ts new file mode 100644 index 00000000000..7dfa3745cb7 --- /dev/null +++ b/src/ui/pokedex-info-overlay.ts @@ -0,0 +1,179 @@ +import type { InfoToggle } from "../battle-scene"; +import { TextStyle, addTextObject } from "./text"; +import { addWindow } from "./ui-theme"; +import * as Utils from "../utils"; +import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; + +export interface PokedexInfoOverlaySettings { + delayVisibility?: boolean; // if true, showing the overlay will only set it to active and populate the fields and the handler using this field has to manually call setVisible later. + scale?: number; // scale the box? A scale of 0.5 is recommended + //location and width of the component; unaffected by scaling + x?: number; + y?: number; + /** Default is always half the screen, regardless of scale */ + width?: number; + /** Determines whether to display the small secondary box */ + hideEffectBox?: boolean; + hideBg?: boolean; +} + +const DESC_HEIGHT = 48; +const BORDER = 8; +const GLOBAL_SCALE = 6; + +export default class PokedexInfoOverlay extends Phaser.GameObjects.Container implements InfoToggle { + public active = false; + + private desc: Phaser.GameObjects.Text; + private descScroll: Phaser.Tweens.Tween | null = null; + + private descBg: Phaser.GameObjects.NineSlice; + + private options: PokedexInfoOverlaySettings; + + private textMaskRect: Phaser.GameObjects.Graphics; + + private maskPointOriginX: number; + private maskPointOriginY: number; + public scale: number; + public width: number; + + constructor(options?: PokedexInfoOverlaySettings) { + super(globalScene, options?.x, options?.y); + this.scale = options?.scale || 1; // set up the scale + this.setScale(this.scale); + this.options = options || {}; + + // prepare the description box + this.width = (options?.width || PokedexInfoOverlay.getWidth(this.scale)) / this.scale; // divide by scale as we always want this to be half a window wide + this.descBg = addWindow(0, 0, this.width, DESC_HEIGHT); + this.descBg.setOrigin(0, 0); + this.add(this.descBg); + + // set up the description; wordWrap uses true pixels, unaffected by any scaling, while other values are affected + this.desc = addTextObject(BORDER, BORDER - 2, "", TextStyle.BATTLE_INFO, { + wordWrap: { width: (this.width - (BORDER - 2) * 2) * GLOBAL_SCALE }, + }); + this.desc.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); + + // limit the text rendering, required for scrolling later on + this.maskPointOriginX = options?.x || 0; + this.maskPointOriginY = options?.y || 0; + + if (this.maskPointOriginX < 0) { + this.maskPointOriginX += globalScene.game.canvas.width / GLOBAL_SCALE; + } + if (this.maskPointOriginY < 0) { + this.maskPointOriginY += globalScene.game.canvas.height / GLOBAL_SCALE; + } + + this.textMaskRect = globalScene.make.graphics(); + this.textMaskRect.fillStyle(0xff0000); + this.textMaskRect.fillRect( + this.maskPointOriginX + BORDER * this.scale, + this.maskPointOriginY + (BORDER - 2) * this.scale, + this.width - BORDER * 2 * this.scale, + (DESC_HEIGHT - (BORDER - 2) * 2) * this.scale, + ); + this.textMaskRect.setScale(6); + const textMask = this.createGeometryMask(this.textMaskRect); + + this.add(this.desc); + this.desc.setMask(textMask); + + if (options?.hideBg) { + this.descBg.setVisible(false); + } + + // hide this component for now + this.setVisible(false); + } + + // show this component with infos for the specific move + show(text: string): boolean { + if (!globalScene.enableMoveInfo) { + return false; // move infos have been disabled // TODO:: is `false` correct? i used to be `undeefined` + } + + this.desc.setText(text ?? ""); + + // stop previous scrolling effects and reset y position + if (this.descScroll) { + this.descScroll.remove(); + this.descScroll = null; + this.desc.y = BORDER - 2; + } + + // determine if we need to add new scrolling effects + const lineCount = Math.floor((this.desc.displayHeight * (96 / 72)) / 14.83); + + const newHeight = lineCount >= 3 ? 48 : lineCount === 2 ? 36 : 24; + this.textMaskRect.clear(); + this.textMaskRect.fillStyle(0xff0000); + this.textMaskRect.fillRect( + this.maskPointOriginX + BORDER * this.scale, + this.maskPointOriginY + (BORDER - 2) * this.scale + (48 - newHeight), + this.width - BORDER * 2 * this.scale, + (newHeight - (BORDER - 2) * 2) * this.scale, + ); + const updatedMask = this.createGeometryMask(this.textMaskRect); + this.desc.setMask(updatedMask); + + this.descBg.setSize(this.descBg.width, newHeight); + this.descBg.setY(48 - newHeight); + this.desc.setY(BORDER - 2 + (48 - newHeight)); + + if (lineCount > 3) { + // generate scrolling effects + this.descScroll = globalScene.tweens.add({ + targets: this.desc, + delay: Utils.fixedInt(2000), + loop: -1, + hold: Utils.fixedInt(2000), + duration: Utils.fixedInt((lineCount - 3) * 2000), + y: `-=${14.83 * (72 / 96) * (lineCount - 3)}`, + }); + } + + if (!this.options.delayVisibility) { + this.setVisible(true); + } + this.active = true; + return true; + } + + clear() { + this.setVisible(false); + this.active = false; + } + + toggleInfo(visible: boolean): void { + if (visible) { + this.setVisible(true); + } + globalScene.tweens.add({ + targets: this.desc, + duration: Utils.fixedInt(125), + ease: "Sine.easeInOut", + alpha: visible ? 1 : 0, + }); + if (!visible) { + this.setVisible(false); + } + } + + isActive(): boolean { + return this.active; + } + + // width of this element + static getWidth(_scale: number): number { + return globalScene.game.canvas.width / GLOBAL_SCALE / 2; + } + + // height of this element + static getHeight(scale: number, _onSide?: boolean): number { + return DESC_HEIGHT * scale; + } +} diff --git a/src/ui/pokedex-mon-container.ts b/src/ui/pokedex-mon-container.ts new file mode 100644 index 00000000000..e61da86e95e --- /dev/null +++ b/src/ui/pokedex-mon-container.ts @@ -0,0 +1,219 @@ +import type { Variant } from "#app/data/variant"; +import { globalScene } from "#app/global-scene"; +import { isNullOrUndefined } from "#app/utils"; +import type PokemonSpecies from "../data/pokemon-species"; +import { addTextObject, TextStyle } from "./text"; + +interface SpeciesDetails { + shiny?: boolean; + formIndex?: number; + female?: boolean; + variant?: Variant; +} + +export class PokedexMonContainer extends Phaser.GameObjects.Container { + public species: PokemonSpecies; + public icon: Phaser.GameObjects.Sprite; + public shinyIcons: Phaser.GameObjects.Image[] = []; + public label: Phaser.GameObjects.Text; + public starterPassiveBgs: Phaser.GameObjects.Image; + public hiddenAbilityIcon: Phaser.GameObjects.Image; + public favoriteIcon: Phaser.GameObjects.Image; + public classicWinIcon: Phaser.GameObjects.Image; + public candyUpgradeIcon: Phaser.GameObjects.Image; + public candyUpgradeOverlayIcon: Phaser.GameObjects.Image; + public eggMove1Icon: Phaser.GameObjects.Image; + public tmMove1Icon: Phaser.GameObjects.Image; + public eggMove2Icon: Phaser.GameObjects.Image; + public tmMove2Icon: Phaser.GameObjects.Image; + public passive1Icon: Phaser.GameObjects.Image; + public passive2Icon: Phaser.GameObjects.Image; + public passive1OverlayIcon: Phaser.GameObjects.Image; + public passive2OverlayIcon: Phaser.GameObjects.Image; + public cost = 0; + + constructor(species: PokemonSpecies, options: SpeciesDetails = {}) { + super(globalScene, 0, 0); + + this.setSpecies(species, options); + + // starter passive bg + const starterPassiveBg = globalScene.add.image(2, 5, "passive_bg"); + starterPassiveBg.setOrigin(0, 0); + starterPassiveBg.setScale(0.75); + starterPassiveBg.setVisible(false); + this.add(starterPassiveBg); + this.starterPassiveBgs = starterPassiveBg; + + // shiny icons + for (let i = 0; i < 3; i++) { + const shinyIcon = globalScene.add.image(i * -3 + 12, 2, "shiny_star_small"); + shinyIcon.setScale(0.5); + shinyIcon.setOrigin(0, 0); + shinyIcon.setVisible(false); + this.shinyIcons.push(shinyIcon); + } + this.add(this.shinyIcons); + + // value label + const label = addTextObject(1, 2, "0", TextStyle.WINDOW, { + fontSize: "32px", + }); + label.setShadowOffset(2, 2); + label.setOrigin(0, 0); + label.setVisible(false); + this.add(label); + this.label = label; + + // hidden ability icon + const abilityIcon = globalScene.add.image(12, 7, "ha_capsule"); + abilityIcon.setOrigin(0, 0); + abilityIcon.setScale(0.5); + abilityIcon.setVisible(false); + this.add(abilityIcon); + this.hiddenAbilityIcon = abilityIcon; + + // favorite icon + const favoriteIcon = globalScene.add.image(0, 7, "favorite"); + favoriteIcon.setOrigin(0, 0); + favoriteIcon.setScale(0.5); + favoriteIcon.setVisible(false); + this.add(favoriteIcon); + this.favoriteIcon = favoriteIcon; + + // classic win icon + const classicWinIcon = globalScene.add.image(0, 12, "champion_ribbon"); + classicWinIcon.setOrigin(0, 0); + classicWinIcon.setScale(0.5); + classicWinIcon.setVisible(false); + this.add(classicWinIcon); + this.classicWinIcon = classicWinIcon; + + // candy upgrade icon + const candyUpgradeIcon = globalScene.add.image(12, 12, "candy"); + candyUpgradeIcon.setOrigin(0, 0); + candyUpgradeIcon.setScale(0.25); + candyUpgradeIcon.setVisible(false); + this.add(candyUpgradeIcon); + this.candyUpgradeIcon = candyUpgradeIcon; + + // candy upgrade overlay icon + const candyUpgradeOverlayIcon = globalScene.add.image(12, 12, "candy_overlay"); + candyUpgradeOverlayIcon.setOrigin(0, 0); + candyUpgradeOverlayIcon.setScale(0.25); + candyUpgradeOverlayIcon.setVisible(false); + this.add(candyUpgradeOverlayIcon); + this.candyUpgradeOverlayIcon = candyUpgradeOverlayIcon; + + // move icons + const eggMove1Icon = globalScene.add.image(0, 12, "mystery_egg"); + eggMove1Icon.setOrigin(0, 0); + eggMove1Icon.setScale(0.25); + eggMove1Icon.setVisible(false); + this.add(eggMove1Icon); + this.eggMove1Icon = eggMove1Icon; + + // move icons + const tmMove1Icon = globalScene.add.image(0, 12, "normal_memory"); + tmMove1Icon.setOrigin(0, 0); + tmMove1Icon.setScale(0.25); + tmMove1Icon.setVisible(false); + this.add(tmMove1Icon); + this.tmMove1Icon = tmMove1Icon; + + // move icons + const eggMove2Icon = globalScene.add.image(7, 12, "mystery_egg"); + eggMove2Icon.setOrigin(0, 0); + eggMove2Icon.setScale(0.25); + eggMove2Icon.setVisible(false); + this.add(eggMove2Icon); + this.eggMove2Icon = eggMove2Icon; + + // move icons + const tmMove2Icon = globalScene.add.image(7, 12, "normal_memory"); + tmMove2Icon.setOrigin(0, 0); + tmMove2Icon.setScale(0.25); + tmMove2Icon.setVisible(false); + this.add(tmMove2Icon); + this.tmMove2Icon = tmMove2Icon; + + // passive icons + const passive1Icon = globalScene.add.image(3, 3, "candy"); + passive1Icon.setOrigin(0, 0); + passive1Icon.setScale(0.25); + passive1Icon.setVisible(false); + this.add(passive1Icon); + this.passive1Icon = passive1Icon; + + const passive1OverlayIcon = globalScene.add.image(12, 12, "candy_overlay"); + passive1OverlayIcon.setOrigin(0, 0); + passive1OverlayIcon.setScale(0.25); + passive1OverlayIcon.setVisible(false); + this.add(passive1OverlayIcon); + this.passive1OverlayIcon = passive1OverlayIcon; + + // passive icons + const passive2Icon = globalScene.add.image(12, 3, "candy"); + passive2Icon.setOrigin(0, 0); + passive2Icon.setScale(0.25); + passive2Icon.setVisible(false); + this.add(passive2Icon); + this.passive2Icon = passive2Icon; + + const passive2OverlayIcon = globalScene.add.image(12, 12, "candy_overlay"); + passive2OverlayIcon.setOrigin(0, 0); + passive2OverlayIcon.setScale(0.25); + passive2OverlayIcon.setVisible(false); + this.add(passive2OverlayIcon); + this.passive2OverlayIcon = passive2OverlayIcon; + } + + setSpecies(species: PokemonSpecies, options: SpeciesDetails = {}) { + this.species = species; + + const { shiny, formIndex, female, variant } = options; + + const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + if (!isNullOrUndefined(formIndex)) { + defaultProps.formIndex = formIndex; + } + if (!isNullOrUndefined(shiny)) { + defaultProps.shiny = shiny; + } + if (!isNullOrUndefined(variant)) { + defaultProps.variant = variant; + } + if (!isNullOrUndefined(female)) { + defaultProps.female = female; + } + + if (this.icon) { + this.remove(this.icon); + this.icon.destroy(); // Properly removes the sprite from memory + } + + // icon + this.icon = globalScene.add.sprite( + -2, + 2, + species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant), + ); + this.icon.setScale(0.5); + this.icon.setOrigin(0, 0); + this.icon.setFrame( + species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant), + ); + this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); + this.add(this.icon); + } + + checkIconId(female, formIndex, shiny, variant) { + if (this.icon.frame.name !== this.species.getIconId(female, formIndex, shiny, variant)) { + console.log(`${this.species.name}'s variant icon does not exist. Replacing with default.`); + this.icon.setTexture(this.species.getIconAtlasKey(formIndex, false, variant)); + this.icon.setFrame(this.species.getIconId(female, formIndex, false, variant)); + } + } +} diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts new file mode 100644 index 00000000000..74921f13683 --- /dev/null +++ b/src/ui/pokedex-page-ui-handler.ts @@ -0,0 +1,2763 @@ +import type { SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; +import { pokemonEvolutions, pokemonPrevolutions, pokemonStarters } from "#app/data/balance/pokemon-evolutions"; +import type { Variant } from "#app/data/variant"; +import { getVariantTint, getVariantIcon } from "#app/data/variant"; +import { argbFromRgba } from "@material/material-color-utilities"; +import i18next from "i18next"; +import { starterColors } from "#app/battle-scene"; +import { allAbilities } from "#app/data/ability"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; +import { GrowthRate, getGrowthRateColor } from "#app/data/exp"; +import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; +import { allMoves } from "#app/data/moves/move"; +import { getNatureName } from "#app/data/nature"; +import type { SpeciesFormChange } from "#app/data/pokemon-forms"; +import { pokemonFormChanges } from "#app/data/pokemon-forms"; +import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; +import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, normalForm } from "#app/data/pokemon-species"; +import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; +import { starterPassiveAbilities } from "#app/data/balance/passives"; +import { PokemonType } from "#enums/pokemon-type"; +import { GameModes } from "#app/game-mode"; +import type { DexEntry, StarterAttributes } from "#app/system/game-data"; +import { AbilityAttr, DexAttr } from "#app/system/game-data"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import MessageUiHandler from "#app/ui/message-ui-handler"; +import { StatsContainer } from "#app/ui/stats-container"; +import { TextStyle, addTextObject, getTextStyleOptions } from "#app/ui/text"; +import { Mode } from "#app/ui/ui"; +import { addWindow } from "#app/ui/ui-theme"; +import { Egg } from "#app/data/egg"; +import Overrides from "#app/overrides"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { Passive as PassiveAttr } from "#enums/passive"; +import * as Challenge from "#app/data/challenge"; +import MoveInfoOverlay from "#app/ui/move-info-overlay"; +import PokedexInfoOverlay from "#app/ui/pokedex-info-overlay"; +import { getEggTierForSpecies } from "#app/data/egg"; +import { Device } from "#enums/devices"; +import type { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Button } from "#enums/buttons"; +import { EggSourceType } from "#enums/egg-source-types"; +import { + getPassiveCandyCount, + getValueReductionCandyCounts, + getSameSpeciesEggCandyCounts, +} from "#app/data/balance/starters"; +import { + BooleanHolder, + getLocalizedSpriteKey, + isNullOrUndefined, + NumberHolder, + padInt, + rgbHexToRgba, + toReadableString, +} from "#app/utils"; +import type { Nature } from "#enums/nature"; +import * as Utils from "../utils"; +import { speciesTmMoves } from "#app/data/balance/tms"; +import type { BiomeTierTod } from "#app/data/balance/biomes"; +import { BiomePoolTier, catchableSpecies } from "#app/data/balance/biomes"; +import { Biome } from "#app/enums/biome"; +import { TimeOfDay } from "#app/enums/time-of-day"; +import type { Abilities } from "#app/enums/abilities"; +import { BaseStatsOverlay } from "#app/ui/base-stats-overlay"; +import { globalScene } from "#app/global-scene"; + +interface LanguageSetting { + starterInfoTextSize: string; + instructionTextSize: string; + starterInfoXPos?: number; + starterInfoYOffset?: number; +} + +const languageSettings: { [key: string]: LanguageSetting } = { + en: { + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, + de: { + starterInfoTextSize: "48px", + instructionTextSize: "35px", + starterInfoXPos: 33, + }, + "es-ES": { + starterInfoTextSize: "56px", + instructionTextSize: "35px", + }, + fr: { + starterInfoTextSize: "54px", + instructionTextSize: "38px", + }, + it: { + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, + pt_BR: { + starterInfoTextSize: "47px", + instructionTextSize: "38px", + starterInfoXPos: 33, + }, + zh: { + starterInfoTextSize: "47px", + instructionTextSize: "38px", + starterInfoYOffset: 1, + starterInfoXPos: 24, + }, + pt: { + starterInfoTextSize: "48px", + instructionTextSize: "42px", + starterInfoXPos: 33, + }, + ko: { + starterInfoTextSize: "52px", + instructionTextSize: "38px", + }, + ja: { + starterInfoTextSize: "51px", + instructionTextSize: "38px", + }, + "ca-ES": { + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, +}; + +const valueReductionMax = 2; + +// Position of UI elements +const speciesContainerX = 109; + +interface SpeciesDetails { + shiny?: boolean; + formIndex?: number; + female?: boolean; + variant?: number; +} + +enum MenuOptions { + BASE_STATS, + ABILITIES, + LEVEL_MOVES, + EGG_MOVES, + TM_MOVES, + BIOMES, + NATURES, + TOGGLE_IVS, + EVOLUTIONS, +} + +export default class PokedexPageUiHandler extends MessageUiHandler { + private starterSelectContainer: Phaser.GameObjects.Container; + private shinyOverlay: Phaser.GameObjects.Image; + private pokemonNumberText: Phaser.GameObjects.Text; + private pokemonSprite: Phaser.GameObjects.Sprite; + private pokemonNameText: Phaser.GameObjects.Text; + private pokemonGrowthRateLabelText: Phaser.GameObjects.Text; + private pokemonGrowthRateText: Phaser.GameObjects.Text; + private type1Icon: Phaser.GameObjects.Sprite; + private type2Icon: Phaser.GameObjects.Sprite; + private pokemonLuckLabelText: Phaser.GameObjects.Text; + private pokemonLuckText: Phaser.GameObjects.Text; + private pokemonGenderText: Phaser.GameObjects.Text; + private pokemonUncaughtText: Phaser.GameObjects.Text; + private pokemonCandyContainer: Phaser.GameObjects.Container; + private pokemonCandyIcon: Phaser.GameObjects.Sprite; + private pokemonCandyDarknessOverlay: Phaser.GameObjects.Sprite; + private pokemonCandyOverlayIcon: Phaser.GameObjects.Sprite; + private pokemonCandyCountText: Phaser.GameObjects.Text; + private pokemonCaughtHatchedContainer: Phaser.GameObjects.Container; + private pokemonCaughtCountText: Phaser.GameObjects.Text; + private pokemonFormText: Phaser.GameObjects.Text; + private pokemonHatchedIcon: Phaser.GameObjects.Sprite; + private pokemonHatchedCountText: Phaser.GameObjects.Text; + private pokemonShinyIcons: Phaser.GameObjects.Sprite[]; + + private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined; + private instructionsContainer: Phaser.GameObjects.Container; + private filterInstructionsContainer: Phaser.GameObjects.Container; + private shinyIconElement: Phaser.GameObjects.Sprite; + private formIconElement: Phaser.GameObjects.Sprite; + private genderIconElement: Phaser.GameObjects.Sprite; + private variantIconElement: Phaser.GameObjects.Sprite; + private shinyLabel: Phaser.GameObjects.Text; + private formLabel: Phaser.GameObjects.Text; + private genderLabel: Phaser.GameObjects.Text; + private variantLabel: Phaser.GameObjects.Text; + private candyUpgradeIconElement: Phaser.GameObjects.Sprite; + private candyUpgradeLabel: Phaser.GameObjects.Text; + private showBackSpriteIconElement: Phaser.GameObjects.Sprite; + private showBackSpriteLabel: Phaser.GameObjects.Text; + + private starterSelectMessageBox: Phaser.GameObjects.NineSlice; + private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; + private statsContainer: StatsContainer; + private moveInfoOverlay: MoveInfoOverlay; + private infoOverlay: PokedexInfoOverlay; + private baseStatsOverlay: BaseStatsOverlay; + + private statsMode: boolean; + + private allSpecies: PokemonSpecies[] = []; + private species: PokemonSpecies; + private starterId: number; + private formIndex: number; + private speciesLoaded: Map = new Map(); + private levelMoves: LevelMoves; + private eggMoves: Moves[] = []; + private hasEggMoves: boolean[] = []; + private tmMoves: Moves[] = []; + private ability1: Abilities; + private ability2: Abilities | undefined; + private abilityHidden: Abilities | undefined; + private passive: Abilities; + private hasPassive: boolean; + private hasAbilities: number[]; + private biomes: BiomeTierTod[]; + private preBiomes: BiomeTierTod[]; + private baseStats: number[]; + private baseTotal: number; + private evolutions: SpeciesFormEvolution[]; + private battleForms: SpeciesFormChange[]; + private prevolutions: SpeciesFormEvolution[]; + + private speciesStarterDexEntry: DexEntry | null; + private canCycleShiny: boolean; + private canCycleForm: boolean; + private canCycleGender: boolean; + + private assetLoadCancelled: BooleanHolder | null; + public cursorObj: Phaser.GameObjects.Image; + + // variables to keep track of the dynamically rendered list of instruction prompts for starter select + private instructionRowX = 0; + private instructionRowY = 0; + private instructionRowTextOffset = 9; + private filterInstructionRowX = 0; + private filterInstructionRowY = 0; + + private starterAttributes: StarterAttributes; + private savedStarterAttributes: StarterAttributes; + + protected blockInput = false; + protected blockInputOverlay = false; + + private showBackSprite = false; + + // Menu + private menuContainer: Phaser.GameObjects.Container; + private menuBg: Phaser.GameObjects.NineSlice; + protected optionSelectText: Phaser.GameObjects.Text; + private menuOptions: MenuOptions[]; + protected scale = 0.1666666667; + private menuDescriptions: string[]; + private isFormGender: boolean; + private filteredIndices: Species[] | null = null; + + private availableVariants: number; + private unlockedVariants: boolean[]; + + private canUseCandies: boolean; + + constructor() { + super(Mode.POKEDEX_PAGE); + } + + setup() { + const ui = this.getUi(); + const currentLanguage = i18next.resolvedLanguage ?? "en"; + const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)) ?? "en"; + const textSettings = languageSettings[langSettingKey]; + + this.starterSelectContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.starterSelectContainer.setVisible(false); + ui.add(this.starterSelectContainer); + + const bgColor = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0x006860, + ); + bgColor.setOrigin(0, 0); + this.starterSelectContainer.add(bgColor); + + const starterSelectBg = globalScene.add.image(0, 0, "pokedex_summary_bg"); + starterSelectBg.setOrigin(0, 0); + this.starterSelectContainer.add(starterSelectBg); + + this.shinyOverlay = globalScene.add.image(6, 6, "summary_overlay_shiny"); + this.shinyOverlay.setOrigin(0, 0); + this.shinyOverlay.setVisible(false); + this.starterSelectContainer.add(this.shinyOverlay); + + this.pokemonNumberText = addTextObject(17, 1, "0000", TextStyle.SUMMARY); + this.pokemonNumberText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonNumberText); + + this.pokemonNameText = addTextObject(6, 112, "", TextStyle.SUMMARY); + this.pokemonNameText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonNameText); + + this.pokemonGrowthRateLabelText = addTextObject( + 8, + 106, + i18next.t("pokedexUiHandler:growthRate"), + TextStyle.SUMMARY_ALT, + { fontSize: "36px" }, + ); + this.pokemonGrowthRateLabelText.setOrigin(0, 0); + this.pokemonGrowthRateLabelText.setVisible(false); + this.starterSelectContainer.add(this.pokemonGrowthRateLabelText); + + this.pokemonGrowthRateText = addTextObject(34, 106, "", TextStyle.SUMMARY_PINK, { fontSize: "36px" }); + this.pokemonGrowthRateText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonGrowthRateText); + + this.pokemonGenderText = addTextObject(96, 112, "", TextStyle.SUMMARY_ALT); + this.pokemonGenderText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonGenderText); + + this.pokemonUncaughtText = addTextObject(6, 127, i18next.t("pokedexUiHandler:uncaught"), TextStyle.WINDOW, { + fontSize: "56px", + }); + this.pokemonUncaughtText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonUncaughtText); + + const starterBoxContainer = globalScene.add.container(speciesContainerX + 6, 9); //115 + + for (const species of allSpecies) { + if (!speciesStarterCosts.hasOwnProperty(species.speciesId) || !species.isObtainable()) { + continue; + } + + this.speciesLoaded.set(species.speciesId, false); + this.allSpecies.push(species); + } + + this.starterSelectContainer.add(starterBoxContainer); + + this.pokemonSprite = globalScene.add.sprite(53, 63, "pkmn__sub"); + this.pokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); + this.starterSelectContainer.add(this.pokemonSprite); + + this.type1Icon = globalScene.add.sprite(8, 98, getLocalizedSpriteKey("types")); + this.type1Icon.setScale(0.5); + this.type1Icon.setOrigin(0, 0); + this.starterSelectContainer.add(this.type1Icon); + + this.type2Icon = globalScene.add.sprite(26, 98, getLocalizedSpriteKey("types")); + this.type2Icon.setScale(0.5); + this.type2Icon.setOrigin(0, 0); + this.starterSelectContainer.add(this.type2Icon); + + this.pokemonLuckLabelText = addTextObject(8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { + fontSize: "56px", + }); + this.pokemonLuckLabelText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonLuckLabelText); + + this.pokemonLuckText = addTextObject(8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.WINDOW, { + fontSize: "56px", + }); + this.pokemonLuckText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonLuckText); + + // Candy icon and count + this.pokemonCandyContainer = globalScene.add.container(4.5, 18); + + this.pokemonCandyIcon = globalScene.add.sprite(0, 0, "candy"); + this.pokemonCandyIcon.setScale(0.5); + this.pokemonCandyIcon.setOrigin(0, 0); + this.pokemonCandyContainer.add(this.pokemonCandyIcon); + + this.pokemonCandyOverlayIcon = globalScene.add.sprite(0, 0, "candy_overlay"); + this.pokemonCandyOverlayIcon.setScale(0.5); + this.pokemonCandyOverlayIcon.setOrigin(0, 0); + this.pokemonCandyContainer.add(this.pokemonCandyOverlayIcon); + + this.pokemonCandyDarknessOverlay = globalScene.add.sprite(0, 0, "candy"); + this.pokemonCandyDarknessOverlay.setScale(0.5); + this.pokemonCandyDarknessOverlay.setOrigin(0, 0); + this.pokemonCandyDarknessOverlay.setTint(0x000000); + this.pokemonCandyDarknessOverlay.setAlpha(0.5); + this.pokemonCandyContainer.add(this.pokemonCandyDarknessOverlay); + + this.pokemonCandyCountText = addTextObject(9.5, 0, "x0", TextStyle.WINDOW_ALT, { fontSize: "56px" }); + this.pokemonCandyCountText.setOrigin(0, 0); + this.pokemonCandyContainer.add(this.pokemonCandyCountText); + + this.pokemonCandyContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 30, 20), Phaser.Geom.Rectangle.Contains); + this.starterSelectContainer.add(this.pokemonCandyContainer); + + this.pokemonFormText = addTextObject(6, 42, "Form", TextStyle.WINDOW_ALT, { + fontSize: "42px", + }); + this.pokemonFormText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonFormText); + + this.pokemonCaughtHatchedContainer = globalScene.add.container(2, 25); + this.pokemonCaughtHatchedContainer.setScale(0.5); + this.starterSelectContainer.add(this.pokemonCaughtHatchedContainer); + + const pokemonCaughtIcon = globalScene.add.sprite(1, 0, "items", "pb"); + pokemonCaughtIcon.setOrigin(0, 0); + pokemonCaughtIcon.setScale(0.75); + this.pokemonCaughtHatchedContainer.add(pokemonCaughtIcon); + + this.pokemonCaughtCountText = addTextObject(24, 4, "0", TextStyle.SUMMARY_ALT); + this.pokemonCaughtCountText.setOrigin(0, 0); + this.pokemonCaughtHatchedContainer.add(this.pokemonCaughtCountText); + + this.pokemonHatchedIcon = globalScene.add.sprite(1, 14, "egg_icons"); + this.pokemonHatchedIcon.setOrigin(0.15, 0.2); + this.pokemonHatchedIcon.setScale(0.8); + this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); + + this.pokemonShinyIcons = []; + for (let i = 0; i < 3; i++) { + const pokemonShinyIcon = globalScene.add.sprite(153 + i * 13, 160, "shiny_icons"); + pokemonShinyIcon.setOrigin(0.15, 0.2); + pokemonShinyIcon.setScale(1); + pokemonShinyIcon.setFrame(getVariantIcon(i as Variant)); + pokemonShinyIcon.setVisible(false); + this.pokemonCaughtHatchedContainer.add(pokemonShinyIcon); + this.pokemonShinyIcons.push(pokemonShinyIcon); + } + + this.pokemonHatchedCountText = addTextObject(24, 19, "0", TextStyle.SUMMARY_ALT); + this.pokemonHatchedCountText.setOrigin(0, 0); + this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText); + + // The font size should be set per language + const instructionTextSize = textSettings.instructionTextSize; + + this.instructionsContainer = globalScene.add.container(4, 128); + this.instructionsContainer.setVisible(true); + this.starterSelectContainer.add(this.instructionsContainer); + + this.candyUpgradeIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "C.png", + ); + this.candyUpgradeIconElement.setName("sprite-candyUpgrade-icon-element"); + this.candyUpgradeIconElement.setScale(0.675); + this.candyUpgradeIconElement.setOrigin(0.0, 0.0); + this.candyUpgradeLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:candyUpgrade"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); + this.candyUpgradeLabel.setName("text-candyUpgrade-label"); + + // instruction rows that will be pushed into the container dynamically based on need + // creating new sprites since they will be added to the scene later + this.shinyIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "R.png", + ); + this.shinyIconElement.setName("sprite-shiny-icon-element"); + this.shinyIconElement.setScale(0.675); + this.shinyIconElement.setOrigin(0.0, 0.0); + this.shinyLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:cycleShiny"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); + this.shinyLabel.setName("text-shiny-label"); + + this.formIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "F.png", + ); + this.formIconElement.setName("sprite-form-icon-element"); + this.formIconElement.setScale(0.675); + this.formIconElement.setOrigin(0.0, 0.0); + this.formLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:cycleForm"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); + this.formLabel.setName("text-form-label"); + + this.genderIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "G.png", + ); + this.genderIconElement.setName("sprite-gender-icon-element"); + this.genderIconElement.setScale(0.675); + this.genderIconElement.setOrigin(0.0, 0.0); + this.genderLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:cycleGender"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); + this.genderLabel.setName("text-gender-label"); + + this.variantIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "V.png", + ); + this.variantIconElement.setName("sprite-variant-icon-element"); + this.variantIconElement.setScale(0.675); + this.variantIconElement.setOrigin(0.0, 0.0); + this.variantLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("pokedexUiHandler:cycleVariant"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); + this.variantLabel.setName("text-variant-label"); + + this.showBackSpriteIconElement = new Phaser.GameObjects.Sprite(globalScene, 50, 7, "keyboard", "E.png"); + this.showBackSpriteIconElement.setName("show-backSprite-icon-element"); + this.showBackSpriteIconElement.setScale(0.675); + this.showBackSpriteIconElement.setOrigin(0.0, 0.0); + this.showBackSpriteLabel = addTextObject(60, 7, i18next.t("pokedexUiHandler:showBackSprite"), TextStyle.PARTY, { + fontSize: instructionTextSize, + }); + this.showBackSpriteLabel.setName("show-backSprite-label"); + this.starterSelectContainer.add(this.showBackSpriteIconElement); + this.starterSelectContainer.add(this.showBackSpriteLabel); + + this.hideInstructions(); + + this.filterInstructionsContainer = globalScene.add.container(50, 5); + this.filterInstructionsContainer.setVisible(true); + this.starterSelectContainer.add(this.filterInstructionsContainer); + + this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer.setVisible(false); + this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); + + this.starterSelectMessageBox = addWindow(1, -1, 318, 28); + this.starterSelectMessageBox.setOrigin(0, 1); + this.starterSelectMessageBoxContainer.add(this.starterSelectMessageBox); + + this.message = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + this.message.setOrigin(0, 0); + this.starterSelectMessageBoxContainer.add(this.message); + + // arrow icon for the message box + this.initPromptSprite(this.starterSelectMessageBoxContainer); + + this.statsContainer = new StatsContainer(6, 16); + + globalScene.add.existing(this.statsContainer); + + this.statsContainer.setVisible(false); + + this.starterSelectContainer.add(this.statsContainer); + + // Adding menu container + this.menuContainer = globalScene.add.container(-130, 0); + this.menuContainer.setName("menu"); + this.menuContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); + + this.menuContainer.setVisible(false); + + this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => Number.parseInt(MenuOptions[m]) as MenuOptions); + + this.optionSelectText = addTextObject( + 0, + 0, + this.menuOptions.map(o => `${i18next.t(`pokedexUiHandler:${MenuOptions[o]}`)}`).join("\n"), + TextStyle.WINDOW, + { maxLines: this.menuOptions.length }, + ); + this.optionSelectText.setLineSpacing(12); + + this.menuDescriptions = [ + i18next.t("pokedexUiHandler:showBaseStats"), + i18next.t("pokedexUiHandler:showAbilities"), + i18next.t("pokedexUiHandler:showLevelMoves"), + i18next.t("pokedexUiHandler:showEggMoves"), + i18next.t("pokedexUiHandler:showTmMoves"), + i18next.t("pokedexUiHandler:showBiomes"), + i18next.t("pokedexUiHandler:showNatures"), + i18next.t("pokedexUiHandler:toggleIVs"), + i18next.t("pokedexUiHandler:showEvolutions"), + ]; + + this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; + this.menuBg = addWindow( + globalScene.game.canvas.width / 6 - 83, + 0, + this.optionSelectText.displayWidth + 19 + 24 * this.scale, + globalScene.game.canvas.height / 6 - 2, + ); + this.menuBg.setOrigin(0, 0); + + this.optionSelectText.setPositionRelative(this.menuBg, 10 + 24 * this.scale, 6); + + this.menuContainer.add(this.menuBg); + + this.menuContainer.add(this.optionSelectText); + + ui.add(this.menuContainer); + + this.starterSelectContainer.add(this.menuContainer); + + // adding base stats + this.baseStatsOverlay = new BaseStatsOverlay({ x: 317, y: 0, width: 133 }); + this.menuContainer.add(this.baseStatsOverlay); + this.menuContainer.bringToTop(this.baseStatsOverlay); + + // add the info overlay last to be the top most ui element and prevent the IVs from overlaying this + const overlayScale = 1; + this.moveInfoOverlay = new MoveInfoOverlay({ + scale: overlayScale, + top: true, + x: 1, + y: globalScene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, + }); + this.starterSelectContainer.add(this.moveInfoOverlay); + + this.infoOverlay = new PokedexInfoOverlay({ + scale: overlayScale, + x: 1, + y: globalScene.game.canvas.height / 6 - PokedexInfoOverlay.getHeight(overlayScale) - 29, + }); + this.starterSelectContainer.add(this.infoOverlay); + + // Filter bar sits above everything, except the message box + this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); + } + + show(args: any[]): boolean { + // Allow the use of candies if we are in one of the whitelisted phases + this.canUseCandies = ["TitlePhase", "SelectStarterPhase", "CommandPhase"].includes( + globalScene.getCurrentPhase()?.constructor.name ?? "", + ); + + if (args.length >= 1 && args[0] === "refresh") { + return false; + } + this.species = args[0]; + this.formIndex = args[1] ?? 0; + this.savedStarterAttributes = args[2] ?? { + shiny: false, + female: true, + variant: 0, + form: 0, + }; + this.filteredIndices = args[3] ?? null; + this.starterSetup(); + + this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers + this.infoOverlay.clear(); + + super.show(args); + + this.starterSelectContainer.setVisible(true); + this.getUi().bringToTop(this.starterSelectContainer); + + this.starterAttributes = this.initStarterPrefs(); + + this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => Number.parseInt(MenuOptions[m]) as MenuOptions); + + this.menuContainer.setVisible(true); + + this.speciesStarterDexEntry = this.species ? globalScene.gameData.dexData[this.species.speciesId] : null; + this.setSpecies(); + this.updateInstructions(); + + this.setCursor(0); + + return true; + } + + starterSetup(): void { + this.evolutions = []; + this.prevolutions = []; + this.battleForms = []; + + const species = this.species; + + let formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""; + this.isFormGender = formKey === "male" || formKey === "female"; + if ( + this.isFormGender && + ((this.savedStarterAttributes.female === true && formKey === "male") || + (this.savedStarterAttributes.female === false && formKey === "female")) + ) { + this.formIndex = (this.formIndex + 1) % 2; + formKey = this.species.forms[this.formIndex].formKey; + } + + const formIndex = this.formIndex ?? 0; + + this.starterId = this.getStarterSpeciesId(this.species.speciesId); + + const allEvolutions = pokemonEvolutions.hasOwnProperty(species.speciesId) + ? pokemonEvolutions[species.speciesId] + : []; + + if (species.forms.length > 0) { + const form = species.forms[formIndex]; + + // If this form has a specific set of moves, we get them. + this.levelMoves = + formIndex > 0 && + pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && + pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex) + ? pokemonFormLevelMoves[species.speciesId][formIndex] + : pokemonSpeciesLevelMoves[species.speciesId]; + this.ability1 = form.ability1; + this.ability2 = form.ability2 === form.ability1 ? undefined : form.ability2; + this.abilityHidden = form.abilityHidden === form.ability1 ? undefined : form.abilityHidden; + + this.evolutions = allEvolutions.filter(e => e.preFormKey === form.formKey || e.preFormKey === null); + this.baseStats = form.baseStats; + this.baseTotal = form.baseTotal; + } else { + this.levelMoves = pokemonSpeciesLevelMoves[species.speciesId]; + this.ability1 = species.ability1; + this.ability2 = species.ability2 === species.ability1 ? undefined : species.ability2; + this.abilityHidden = species.abilityHidden === species.ability1 ? undefined : species.abilityHidden; + + this.evolutions = allEvolutions; + this.baseStats = species.baseStats; + this.baseTotal = species.baseTotal; + } + + this.eggMoves = speciesEggMoves[this.starterId] ?? []; + this.hasEggMoves = Array.from( + { length: 4 }, + (_, em) => (globalScene.gameData.starterData[this.starterId].eggMoves & (1 << em)) !== 0, + ); + + this.tmMoves = + speciesTmMoves[species.speciesId] + ?.filter(m => (Array.isArray(m) ? m[0] === formKey : true)) + .map(m => (Array.isArray(m) ? m[1] : m)) + .sort((a, b) => (allMoves[a].name > allMoves[b].name ? 1 : -1)) ?? []; + + const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) + ? species.speciesId + : starterPassiveAbilities.hasOwnProperty(this.starterId) + ? this.starterId + : pokemonPrevolutions[this.starterId]; + const passives = starterPassiveAbilities[passiveId]; + this.passive = this.formIndex in passives ? passives[formIndex] : passives[0]; + + const starterData = globalScene.gameData.starterData[this.starterId]; + const abilityAttr = starterData.abilityAttr; + this.hasPassive = starterData.passiveAttr > 0; + + const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; + const hasAbility2 = abilityAttr & AbilityAttr.ABILITY_2; + const hasHiddenAbility = abilityAttr & AbilityAttr.ABILITY_HIDDEN; + + this.hasAbilities = [hasAbility1, hasAbility2, hasHiddenAbility]; + + const allBiomes = catchableSpecies[species.speciesId] ?? []; + this.preBiomes = this.sanitizeBiomes( + (catchableSpecies[this.starterId] ?? []).filter( + b => !allBiomes.some(bm => b.biome === bm.biome && b.tier === bm.tier) && !(b.biome === Biome.TOWN), + ), + this.starterId, + ); + this.biomes = this.sanitizeBiomes(allBiomes, species.speciesId); + + const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) + ? pokemonFormChanges[species.speciesId] + : []; + this.battleForms = allFormChanges.filter(f => f.preFormKey === this.species.forms[this.formIndex].formKey); + + const preSpecies = pokemonPrevolutions.hasOwnProperty(this.species.speciesId) + ? allSpecies.find(sp => sp.speciesId === pokemonPrevolutions[this.species.speciesId]) + : null; + if (preSpecies) { + const preEvolutions = pokemonEvolutions.hasOwnProperty(preSpecies.speciesId) + ? pokemonEvolutions[preSpecies.speciesId] + : []; + this.prevolutions = preEvolutions.filter( + e => + e.speciesId === species.speciesId && + (((e.evoFormKey === "" || e.evoFormKey === null) && + // This takes care of Cosplay Pikachu (Pichu is not shown) + (preSpecies.forms.some(form => form.formKey === species.forms[formIndex]?.formKey) || + // This takes care of Gholdengo + (preSpecies.forms.length > 0 && species.forms.length === 0) || + // This takes care of everything else + (preSpecies.forms.length === 0 && + (species.forms.length === 0 || species.forms[formIndex]?.formKey === "")))) || + // This takes care of Burmy, Shellos etc + e.evoFormKey === species.forms[formIndex]?.formKey), + ); + } + + this.availableVariants = species.getFullUnlocksData() & DexAttr.VARIANT_3 ? 3 : 1; + } + + // Function to ensure that forms appear in the appropriate biome and tod + sanitizeBiomes(biomes: BiomeTierTod[], speciesId: number): BiomeTierTod[] { + if (speciesId === Species.BURMY || speciesId === Species.WORMADAM) { + return biomes.filter(b => { + const formIndex = (() => { + switch (b.biome) { + case Biome.BEACH: + return 1; + case Biome.SLUM: + return 2; + default: + return 0; + } + })(); + return this.formIndex === formIndex; + }); + } + if (speciesId === Species.ROTOM) { + return biomes.filter(b => { + const formIndex = (() => { + switch (b.biome) { + case Biome.VOLCANO: + return 1; + case Biome.SEA: + return 2; + case Biome.ICE_CAVE: + return 3; + case Biome.MOUNTAIN: + return 4; + case Biome.TALL_GRASS: + return 5; + default: + return 0; + } + })(); + return this.formIndex === formIndex; + }); + } + if (speciesId === Species.LYCANROC) { + return biomes.filter(b => { + const formIndex = (() => { + switch (b.tod[0]) { + case TimeOfDay.DAY: + case TimeOfDay.DAWN: + return 0; + case TimeOfDay.DUSK: + return 2; + case TimeOfDay.NIGHT: + return 1; + default: + return 0; + } + })(); + return this.formIndex === formIndex; + }); + } + + return biomes; + } + + isCaught(otherSpecies?: PokemonSpecies): bigint { + if (globalScene.dexForDevs) { + return 255n; + } + + const species = otherSpecies ? otherSpecies : this.species; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const starterDexEntry = globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)]; + + return (dexEntry?.caughtAttr ?? 0n) & (starterDexEntry?.caughtAttr ?? 0n) & species.getFullUnlocksData(); + } + /** + * Check whether a given form is caught for a given species. + * All forms that can be reached through a form change during battle are considered caught and show up in the dex as such. + * + * @param otherSpecies The species to check; defaults to current species + * @param otherFormIndex The form index of the form to check; defaults to current form + * @returns StarterAttributes for the species + */ + isFormCaught(otherSpecies?: PokemonSpecies, otherFormIndex?: number | undefined): boolean { + if (globalScene.dexForDevs) { + return true; + } + const species = otherSpecies ? otherSpecies : this.species; + const formIndex = otherFormIndex !== undefined ? otherFormIndex : this.formIndex; + const caughtAttr = this.isCaught(species); + + if (caughtAttr && (!species.forms.length || species.forms.length === 1)) { + return true; + } + + const isFormCaught = (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n; + return isFormCaught; + } + + /** + * Get the starter attributes for the given PokemonSpecies, after sanitizing them. + * If somehow a preference is set for a form, variant, gender, ability or nature + * that wasn't actually unlocked or is invalid it will be cleared here + * + * @param species The species to get Starter Preferences for + * @returns StarterAttributes for the species + */ + initStarterPrefs(): StarterAttributes { + const starterAttributes: StarterAttributes | null = this.species ? { ...this.savedStarterAttributes } : null; + const caughtAttr = this.isCaught(); + + // no preferences or Pokemon wasn't caught, return empty attribute + if (!starterAttributes || !caughtAttr) { + return {}; + } + + const hasShiny = caughtAttr & DexAttr.SHINY; + const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; + if (!hasShiny || (starterAttributes.shiny === undefined && hasNonShiny)) { + // shiny form wasn't unlocked, purging shiny and variant setting + starterAttributes.shiny = false; + starterAttributes.variant = 0; + } else if (!hasNonShiny || (starterAttributes.shiny === undefined && hasShiny)) { + starterAttributes.shiny = true; + starterAttributes.variant = 0; + } + + this.unlockedVariants = [ + !!(hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT), + !!(hasShiny && caughtAttr & DexAttr.VARIANT_2), + !!(hasShiny && caughtAttr & DexAttr.VARIANT_3), + ]; + if ( + starterAttributes.variant === undefined || + Number.isNaN(starterAttributes.variant) || + starterAttributes.variant < 0 + ) { + starterAttributes.variant = 0; + } else if (!this.unlockedVariants[starterAttributes.variant]) { + let highestValidIndex = -1; + for (let i = 0; i <= starterAttributes.variant && i < this.unlockedVariants.length; i++) { + if (this.unlockedVariants[i]) { + highestValidIndex = i; + } + } + // Set to the highest valid index found or default to 0 + starterAttributes.variant = highestValidIndex !== -1 ? highestValidIndex : 0; + } + + if (starterAttributes.female !== undefined) { + if ( + (starterAttributes.female && !(caughtAttr & DexAttr.FEMALE)) || + (!starterAttributes.female && !(caughtAttr & DexAttr.MALE)) + ) { + starterAttributes.female = !starterAttributes.female; + } + } else { + if (caughtAttr & DexAttr.FEMALE) { + starterAttributes.female = true; + } else if (caughtAttr & DexAttr.MALE) { + starterAttributes.female = false; + } + } + + return starterAttributes; + } + + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + moveToTop?: boolean, + ) { + super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); + + 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.starterSelectMessageBoxContainer.setY(globalScene.game.canvas.height / 6); + this.starterSelectMessageBox.setOrigin(0, 1); + this.message.setY(singleLine ? -22 : -37); + } + + this.starterSelectMessageBoxContainer.setVisible(!!text?.length); + } + + /** + * Determines if 'Icon' based upgrade notifications should be shown + * @returns true if upgrade notifications are enabled and set to display an 'Icon' + */ + isUpgradeIconEnabled(): boolean { + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 0; + } + /** + * Determines if 'Animation' based upgrade notifications should be shown + * @returns true if upgrade notifications are enabled and set to display an 'Animation' + */ + isUpgradeAnimationEnabled(): boolean { + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 1; + } + + /** + * If the pokemon is an evolution, find speciesId of its starter. + * @param speciesId the id of the species to check + * @returns the id of the corresponding starter + */ + getStarterSpeciesId(speciesId): number { + if (speciesId === Species.PIKACHU) { + if ([0, 1, 8].includes(this.formIndex)) { + return Species.PICHU; + } + return Species.PIKACHU; + } + if (speciesStarterCosts.hasOwnProperty(speciesId)) { + return speciesId; + } + return pokemonStarters[speciesId]; + } + + getStarterSpecies(species): PokemonSpecies { + if (speciesStarterCosts.hasOwnProperty(species.speciesId)) { + return species; + } + return allSpecies.find(sp => sp.speciesId === pokemonStarters[species.speciesId]) ?? species; + } + + processInput(button: Button): boolean { + if (this.blockInput) { + return false; + } + + const ui = this.getUi(); + + let success = false; + let error = false; + + const isCaught = this.isCaught(); + const isFormCaught = this.isFormCaught(); + + if (this.blockInputOverlay) { + if (button === Button.CANCEL || button === Button.ACTION) { + this.blockInputOverlay = false; + this.baseStatsOverlay.clear(); + ui.showText(""); + return true; + } + if (button === Button.UP || button === Button.DOWN) { + this.blockInputOverlay = false; + this.baseStatsOverlay.clear(); + ui.showText(""); + } else { + return false; + } + } + + if (button === Button.SUBMIT) { + success = true; + } else if (button === Button.CANCEL) { + if (this.statsMode) { + this.toggleStatsMode(false); + success = true; + } else { + this.getUi().revertMode(); + success = true; + } + } else { + const starterData = globalScene.gameData.starterData[this.starterId]; + // prepare persistent starter data to store changes + const starterAttributes = this.starterAttributes; + + if (button === Button.ACTION) { + switch (this.cursor) { + case MenuOptions.BASE_STATS: + if (!isCaught || !isFormCaught) { + error = true; + } else { + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + ui.showText(i18next.t("pokedexUiHandler:showBaseStats"), null, () => { + this.baseStatsOverlay.show(this.baseStats, this.baseTotal); + + this.blockInput = false; + this.blockInputOverlay = true; + + return true; + }); + success = true; + }); + } + break; + + case MenuOptions.LEVEL_MOVES: + if (!isCaught || !isFormCaught) { + error = true; + } else { + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + ui.showText(i18next.t("pokedexUiHandler:showLevelMoves"), null, () => { + this.moveInfoOverlay.show(allMoves[this.levelMoves[0][1]]); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: this.levelMoves + .map(m => { + const levelNumber = m[0] > 0 ? String(m[0]) : ""; + const option: OptionSelectItem = { + label: levelNumber.padEnd(4, " ") + allMoves[m[1]].name, + handler: () => { + return false; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[m[1]]); + if (m[0] === 0) { + this.showText(i18next.t("pokedexUiHandler:onlyEvolutionMove")); + } else if (m[0] === -1) { + this.showText(i18next.t("pokedexUiHandler:onlyRecallMove")); + } else if (m[0] <= 5) { + this.showText(i18next.t("pokedexUiHandler:onStarterSelectMove")); + } else { + this.showText(i18next.t("pokedexUiHandler:byLevelUpMove")); + } + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => { + this.moveInfoOverlay.clear(); + }, + }), + supportHover: true, + maxOptions: 8, + yOffset: 19, + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.EGG_MOVES: + if (!isCaught || !isFormCaught) { + error = true; + } else { + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + if (this.eggMoves.length === 0) { + ui.showText(i18next.t("pokedexUiHandler:noEggMoves")); + this.blockInput = false; + return true; + } + + ui.showText(i18next.t("pokedexUiHandler:showEggMoves"), null, () => { + this.moveInfoOverlay.show(allMoves[this.eggMoves[0]]); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: [ + { + label: i18next.t("pokedexUiHandler:common"), + skip: true, + style: TextStyle.MONEY_WINDOW, + handler: () => false, // Non-selectable, but handler is required + onHover: () => this.moveInfoOverlay.clear(), // No hover behavior for titles + }, + ...this.eggMoves.slice(0, 3).map((m, i) => ({ + label: allMoves[m].name, + style: this.hasEggMoves[i] ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.moveInfoOverlay.show(allMoves[m]), + })), + { + label: i18next.t("pokedexUiHandler:rare"), + skip: true, + style: TextStyle.MONEY_WINDOW, + handler: () => false, + onHover: () => this.moveInfoOverlay.clear(), + }, + { + label: allMoves[this.eggMoves[3]].name, + style: this.hasEggMoves[3] ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.moveInfoOverlay.show(allMoves[this.eggMoves[3]]), + }, + { + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => this.moveInfoOverlay.clear(), + }, + ], + supportHover: true, + maxOptions: 8, + yOffset: 19, + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.TM_MOVES: + if (!isCaught || !isFormCaught) { + error = true; + } else if (this.tmMoves.length < 1) { + ui.showText(i18next.t("pokedexUiHandler:noTmMoves")); + error = true; + } else { + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + ui.showText(i18next.t("pokedexUiHandler:showTmMoves"), null, () => { + this.moveInfoOverlay.show(allMoves[this.tmMoves[0]]); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: this.tmMoves + .map(m => { + const option: OptionSelectItem = { + label: allMoves[m].name, + handler: () => { + return false; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[m]); + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => { + this.moveInfoOverlay.clear(); + }, + }), + supportHover: true, + maxOptions: 8, + yOffset: 19, + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.ABILITIES: + if (!isCaught || !isFormCaught) { + error = true; + } else { + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + ui.showText(i18next.t("pokedexUiHandler:showAbilities"), null, () => { + this.infoOverlay.show(allAbilities[this.ability1].description); + + const options: any[] = []; + + if (this.ability1) { + options.push({ + label: allAbilities[this.ability1].name, + style: this.hasAbilities[0] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.infoOverlay.show(allAbilities[this.ability1].description), + }); + } + if (this.ability2) { + const ability = allAbilities[this.ability2]; + options.push({ + label: ability?.name, + style: this.hasAbilities[1] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.infoOverlay.show(ability?.description), + }); + } + + if (this.abilityHidden) { + options.push({ + label: i18next.t("pokedexUiHandler:hidden"), + skip: true, + style: TextStyle.MONEY_WINDOW, + handler: () => false, + onHover: () => this.infoOverlay.clear(), + }); + const ability = allAbilities[this.abilityHidden]; + options.push({ + label: allAbilities[this.abilityHidden].name, + style: this.hasAbilities[2] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.infoOverlay.show(ability?.description), + }); + } + + if (this.passive) { + options.push({ + label: i18next.t("pokedexUiHandler:passive"), + skip: true, + style: TextStyle.MONEY_WINDOW, + handler: () => false, + onHover: () => this.infoOverlay.clear(), + }); + options.push({ + label: allAbilities[this.passive].name, + style: this.hasPassive ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.infoOverlay.show(allAbilities[this.passive].description), + }); + } + + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + this.infoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => this.infoOverlay.clear(), + }); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: options, + supportHover: true, + maxOptions: 8, + yOffset: 19, + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.BIOMES: + if (!(isCaught || this.speciesStarterDexEntry?.seenAttr)) { + error = true; + } else { + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + if ((!this.biomes || this.biomes?.length === 0) && (!this.preBiomes || this.preBiomes?.length === 0)) { + ui.showText(i18next.t("pokedexUiHandler:noBiomes")); + ui.playError(); + this.blockInput = false; + return true; + } + + const options: any[] = []; + + ui.showText(i18next.t("pokedexUiHandler:showBiomes"), null, () => { + this.biomes.map(b => { + options.push({ + label: + i18next.t(`biome:${Biome[b.biome].toUpperCase()}`) + + " - " + + i18next.t(`biome:${BiomePoolTier[b.tier].toUpperCase()}`) + + (b.tod.length === 1 && b.tod[0] === -1 + ? "" + : " (" + + b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + + ")"), + handler: () => false, + }); + }); + + if (this.preBiomes.length > 0) { + options.push({ + label: i18next.t("pokedexUiHandler:preBiomes"), + skip: true, + handler: () => false, + }); + this.preBiomes.map(b => { + options.push({ + label: + i18next.t(`biome:${Biome[b.biome].toUpperCase()}`) + + " - " + + i18next.t(`biome:${BiomePoolTier[b.tier].toUpperCase()}`) + + (b.tod.length === 1 && b.tod[0] === -1 + ? "" + : " (" + + b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + + ")"), + handler: () => false, + }); + }); + } + + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => this.moveInfoOverlay.clear(), + }); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: options, + supportHover: true, + maxOptions: 8, + yOffset: 19, + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.EVOLUTIONS: + if (!isCaught || !isFormCaught) { + error = true; + } else { + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + const options: any[] = []; + + if ( + (!this.prevolutions || this.prevolutions?.length === 0) && + (!this.evolutions || this.evolutions?.length === 0) && + (!this.battleForms || this.battleForms?.length === 0) + ) { + ui.showText(i18next.t("pokedexUiHandler:noEvolutions")); + ui.playError(); + this.blockInput = false; + return true; + } + + ui.showText(i18next.t("pokedexUiHandler:showEvolutions"), null, () => { + if (this.prevolutions?.length > 0) { + options.push({ + label: i18next.t("pokedexUiHandler:prevolutions"), + style: TextStyle.MONEY_WINDOW, + skip: true, + handler: () => false, + }); + this.prevolutions.map(pre => { + const preSpecies = allSpecies.find( + species => species.speciesId === pokemonPrevolutions[this.species.speciesId], + ); + const preFormIndex: number = + preSpecies?.forms.find(f => f.formKey === pre.preFormKey)?.formIndex ?? 0; + + const conditionText: string = pre.description; + + options.push({ + label: pre.preFormKey + ? (preSpecies ?? this.species).getFormNameToDisplay(preFormIndex, true) + : (preSpecies ?? this.species).getExpandedSpeciesName(), + handler: () => { + const newSpecies = allSpecies.find( + species => species.speciesId === pokemonPrevolutions[pre.speciesId], + ); + // Attempts to find the formIndex of the prevolved species + const newFormKey = pre.preFormKey + ? pre.preFormKey + : this.species.forms.length > 0 + ? this.species.forms[this.formIndex].formKey + : ""; + const matchingForm = newSpecies?.forms.find(form => form.formKey === newFormKey); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + return true; + }, + onHover: () => this.showText(conditionText), + }); + }); + } + + if (this.evolutions.length > 0) { + options.push({ + label: i18next.t("pokedexUiHandler:evolutions"), + style: TextStyle.MONEY_WINDOW, + skip: true, + handler: () => false, + }); + this.evolutions.map(evo => { + const evoSpecies = allSpecies.find(species => species.speciesId === evo.speciesId); + const isCaughtEvo = !!this.isCaught(evoSpecies); + // Attempts to find the formIndex of the evolved species + const newFormKey = evo.evoFormKey + ? evo.evoFormKey + : this.species.forms.length > 0 + ? this.species.forms[this.formIndex].formKey + : ""; + const matchingForm = evoSpecies?.forms.find(form => form.formKey === newFormKey); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + const isFormCaughtEvo = this.isFormCaught(evoSpecies, newFormIndex); + + const conditionText: string = evo.description; + + options.push({ + label: evo.evoFormKey + ? (evoSpecies ?? this.species).getFormNameToDisplay(newFormIndex, true) + : (evoSpecies ?? this.species).getExpandedSpeciesName(), + style: isCaughtEvo && isFormCaughtEvo ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + handler: () => { + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, evoSpecies, newFormIndex, this.savedStarterAttributes); + return true; + }, + onHover: () => this.showText(conditionText), + }); + }); + } + + if (this.battleForms.length > 0) { + options.push({ + label: i18next.t("pokedexUiHandler:forms"), + style: TextStyle.MONEY_WINDOW, + skip: true, + handler: () => false, + }); + this.battleForms.map(bf => { + const matchingForm = this.species?.forms.find(form => form.formKey === bf.formKey); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + + let conditionText = ""; + if (bf.trigger) { + conditionText = bf.trigger.description; + } else { + conditionText = ""; + } + let label: string = this.species.getFormNameToDisplay(newFormIndex); + if (label === "") { + label = this.species.name; + } + const isFormCaught = this.isFormCaught(this.species, newFormIndex); + + if (conditionText) { + options.push({ + label: label, + style: isFormCaught ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + handler: () => { + const newSpecies = this.species; + const newFormIndex = this.species.forms.find(f => f.formKey === bf.formKey)?.formIndex; + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode( + Mode.POKEDEX_PAGE, + newSpecies, + newFormIndex, + this.savedStarterAttributes, + this.filteredIndices, + ); + return true; + }, + onHover: () => this.showText(conditionText), + }); + } + }); + } + + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => this.moveInfoOverlay.clear(), + }); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: options, + supportHover: true, + maxOptions: 8, + yOffset: 19, + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.TOGGLE_IVS: + if (!isCaught || !isFormCaught) { + error = true; + } else { + this.toggleStatsMode(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + success = true; + } + break; + + case MenuOptions.NATURES: + if (!isCaught || !isFormCaught) { + error = true; + } else { + this.blockInput = true; + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + ui.showText(i18next.t("pokedexUiHandler:showNature"), null, () => { + const natures = globalScene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: natures + .map((n: Nature, _i: number) => { + const option: OptionSelectItem = { + label: getNatureName(n, true, true, true, globalScene.uiTheme), + handler: () => { + return false; + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + this.blockInput = false; + return true; + }, + }), + maxOptions: 8, + yOffset: 19, + }); + }); + }); + success = true; + } + break; + } + } else { + const props = globalScene.gameData.getSpeciesDexAttrProps( + this.species, + this.getCurrentDexProps(this.species.speciesId), + ); + switch (button) { + case Button.CYCLE_SHINY: + if (this.canCycleShiny) { + if (!starterAttributes.shiny) { + // Change to shiny, we need to get the proper default variant + const newVariant = starterAttributes.variant ? (starterAttributes.variant as Variant) : 0; + this.setSpeciesDetails(this.species, { + shiny: true, + variant: newVariant, + }); + + globalScene.playSound("se/sparkle"); + + starterAttributes.shiny = true; + this.savedStarterAttributes.shiny = starterAttributes.shiny; + } else { + let newVariant = props.variant; + do { + newVariant = (newVariant + 1) % 3; + if (newVariant === 0) { + if (this.isCaught() & DexAttr.DEFAULT_VARIANT) { + break; + } + } else if (newVariant === 1) { + if (this.isCaught() & DexAttr.VARIANT_2) { + break; + } + } else { + if (this.isCaught() & DexAttr.VARIANT_3) { + break; + } + } + } while (newVariant !== props.variant); + + starterAttributes.variant = newVariant; // store the selected variant + this.savedStarterAttributes.variant = starterAttributes.variant; + if (this.isCaught() & DexAttr.NON_SHINY && newVariant <= props.variant) { + this.setSpeciesDetails(this.species, { + shiny: false, + variant: 0, + }); + success = true; + starterAttributes.shiny = false; + this.savedStarterAttributes.shiny = starterAttributes.shiny; + } else { + this.setSpeciesDetails(this.species, { + variant: newVariant as Variant, + }); + success = true; + } + } + } + break; + case Button.CYCLE_FORM: + if (this.canCycleForm) { + const formCount = this.species.forms.length; + let newFormIndex = this.formIndex; + do { + newFormIndex = (newFormIndex + 1) % formCount; + if (this.species.forms[newFormIndex].isStarterSelectable || globalScene.dexForDevs) { + // TODO: are those bangs correct? + break; + } + } while (newFormIndex !== props.formIndex || this.species.forms[newFormIndex].isUnobtainable); + starterAttributes.form = newFormIndex; // store the selected form + this.savedStarterAttributes.form = starterAttributes.form; + this.formIndex = newFormIndex; + // Some forms are tied to the gender and should change accordingly + let newFemale = props.female; + if (this.isFormGender) { + newFemale = !props.female; + } + starterAttributes.female = newFemale; + this.savedStarterAttributes.female = starterAttributes.female; + this.starterSetup(); + this.setSpeciesDetails(this.species, { + formIndex: newFormIndex, + female: newFemale, + }); + success = this.setCursor(this.cursor); + } + break; + case Button.CYCLE_GENDER: + if (this.canCycleGender) { + starterAttributes.female = !props.female; + this.savedStarterAttributes.female = starterAttributes.female; + let newFormIndex = this.formIndex; + // Some forms are tied to the gender and should change accordingly + if (this.isFormGender) { + newFormIndex = this.formIndex === 0 ? 1 : 0; + } + starterAttributes.form = newFormIndex; // store the selected form + this.savedStarterAttributes.form = starterAttributes.form; + this.formIndex = newFormIndex; + this.starterSetup(); + this.setSpeciesDetails(this.species, { + female: !props.female, + formIndex: newFormIndex, + }); + success = true; + } + break; + case Button.STATS: + if (!isCaught || !isFormCaught || !this.canUseCandies) { + error = true; + } else { + const ui = this.getUi(); + ui.showText(""); + const options: any[] = []; // TODO: add proper type + + const passiveAttr = starterData.passiveAttr; + const candyCount = starterData.candyCount; + + if (!(passiveAttr & PassiveAttr.UNLOCKED)) { + const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.starterId]); + options.push({ + label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")} (${allAbilities[this.passive].name})`, + handler: () => { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { + starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= passiveCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + globalScene.gameData.saveSystem().then(success => { + if (!success) { + return globalScene.reset(true); + } + }); + this.setSpeciesDetails(this.species); + globalScene.playSound("se/buy"); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + + return true; + } + return false; + }, + style: this.isPassiveAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + item: "candy", + itemArgs: this.isPassiveAvailable() ? starterColors[this.starterId] : ["808080", "808080"], + }); + } + + // Reduce cost option + const valueReduction = starterData.valueReduction; + if (valueReduction < valueReductionMax) { + const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[valueReduction]; + options.push({ + label: `x${reductionCost} ${i18next.t("pokedexUiHandler:reduceCost")}`, + handler: () => { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= reductionCost) { + starterData.valueReduction++; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= reductionCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + globalScene.gameData.saveSystem().then(success => { + if (!success) { + return globalScene.reset(true); + } + }); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + globalScene.playSound("se/buy"); + + return true; + } + return false; + }, + style: this.isValueReductionAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + item: "candy", + itemArgs: this.isValueReductionAvailable() ? starterColors[this.starterId] : ["808080", "808080"], + }); + } + + // Same species egg menu option. + const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarterCosts[this.starterId]); + options.push({ + label: `x${sameSpeciesEggCost} ${i18next.t("pokedexUiHandler:sameSpeciesEgg")}`, + handler: () => { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost) { + if (globalScene.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; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + + const egg = new Egg({ + scene: globalScene, + species: this.starterId, + sourceType: EggSourceType.SAME_SPECIES_EGG, + }); + egg.addEggToGameData(); + + globalScene.gameData.saveSystem().then(success => { + if (!success) { + return globalScene.reset(true); + } + }); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + globalScene.playSound("se/buy"); + + return true; + } + return false; + }, + style: this.isSameSpeciesEggAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + item: "candy", + itemArgs: this.isSameSpeciesEggAvailable() ? starterColors[this.starterId] : ["808080", "808080"], + }); + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + }); + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: options, + yOffset: 47, + }); + success = true; + } + break; + case Button.CYCLE_ABILITY: + this.showBackSprite = !this.showBackSprite; + if (this.showBackSprite) { + this.showBackSpriteLabel.setText(i18next.t("pokedexUiHandler:showFrontSprite")); + } else { + this.showBackSpriteLabel.setText(i18next.t("pokedexUiHandler:showBackSprite")); + } + this.setSpeciesDetails(this.species, {}, true); + success = true; + break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else { + success = this.setCursor(this.menuOptions.length - 1); + } + break; + case Button.DOWN: + if (this.cursor + 1 < this.menuOptions.length) { + success = this.setCursor(this.cursor + 1); + } else { + success = this.setCursor(0); + } + break; + case Button.LEFT: + this.blockInput = true; + ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { + let newSpecies: PokemonSpecies; + if (this.filteredIndices) { + const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); + const newIndex = index <= 0 ? this.filteredIndices.length - 1 : index - 1; + newSpecies = getPokemonSpecies(this.filteredIndices[newIndex]); + } else { + const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); + const newIndex = index <= 0 ? allSpecies.length - 1 : index - 1; + newSpecies = allSpecies[newIndex]; + } + const matchingForm = newSpecies?.forms.find( + form => form.formKey === this.species?.forms[this.formIndex]?.formKey, + ); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setModeForceTransition( + Mode.POKEDEX_PAGE, + newSpecies, + newFormIndex, + this.savedStarterAttributes, + this.filteredIndices, + ); + }); + this.blockInput = false; + break; + case Button.RIGHT: + ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { + let newSpecies: PokemonSpecies; + if (this.filteredIndices) { + const index = this.filteredIndices.findIndex(id => id === this.species.speciesId); + const newIndex = index >= this.filteredIndices.length - 1 ? 0 : index + 1; + newSpecies = getPokemonSpecies(this.filteredIndices[newIndex]); + } else { + const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); + const newIndex = index >= allSpecies.length - 1 ? 0 : index + 1; + newSpecies = allSpecies[newIndex]; + } + const matchingForm = newSpecies?.forms.find( + form => form.formKey === this.species?.forms[this.formIndex]?.formKey, + ); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setModeForceTransition( + Mode.POKEDEX_PAGE, + newSpecies, + newFormIndex, + this.savedStarterAttributes, + this.filteredIndices, + ); + }); + break; + } + } + } + + if (success) { + ui.playSelect(); + } else if (error) { + ui.playError(); + } + + return success || error; + } + + updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO + let iconPath; + // touch controls cannot be rebound as is, and are just emulating a keyboard event. + // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls + if (gamepadType === "touch") { + gamepadType = "keyboard"; + switch (iconSetting) { + case SettingKeyboard.Button_Cycle_Shiny: + iconPath = "R.png"; + break; + case SettingKeyboard.Button_Cycle_Form: + iconPath = "F.png"; + break; + case SettingKeyboard.Button_Cycle_Gender: + iconPath = "G.png"; + break; + case SettingKeyboard.Button_Cycle_Ability: + iconPath = "E.png"; + break; + default: + break; + } + } else { + iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); + } + iconElement.setTexture(gamepadType, iconPath); + iconElement.setPosition(this.instructionRowX, this.instructionRowY); + controlLabel.setPosition(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY); + iconElement.setVisible(true); + controlLabel.setVisible(true); + this.instructionsContainer.add([iconElement, controlLabel]); + this.instructionRowY += 8; + if (this.instructionRowY >= 24) { + this.instructionRowY = 8; + this.instructionRowX += 50; + } + } + + updateInstructions(): void { + this.instructionRowX = 0; + this.instructionRowY = 0; + this.filterInstructionRowX = 0; + this.filterInstructionRowY = 0; + this.hideInstructions(); + this.instructionsContainer.removeAll(); + this.filterInstructionsContainer.removeAll(); + + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO + let gamepadType; + if (globalScene.inputMethod === "gamepad") { + gamepadType = globalScene.inputController.getConfig( + globalScene.inputController.selectedDevice[Device.GAMEPAD], + ).padType; + } else { + gamepadType = globalScene.inputMethod; + } + + if (!gamepadType) { + return; + } + + const isFormCaught = this.isFormCaught(); + + if (this.isCaught()) { + if (isFormCaught) { + if (this.canUseCandies) { + this.updateButtonIcon( + SettingKeyboard.Button_Stats, + gamepadType, + this.candyUpgradeIconElement, + this.candyUpgradeLabel, + ); + } + if (this.canCycleShiny) { + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Shiny, + gamepadType, + this.shinyIconElement, + this.shinyLabel, + ); + } + if (this.canCycleGender) { + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Gender, + gamepadType, + this.genderIconElement, + this.genderLabel, + ); + } + } else { + // Making space for "Uncaught" text + this.instructionRowY += 8; + } + if (this.canCycleForm) { + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Form, gamepadType, this.formIconElement, this.formLabel); + } + } + } + + getValueLimit(): number { + const valueLimit = new NumberHolder(0); + switch (globalScene.gameMode.modeId) { + case GameModes.ENDLESS: + case GameModes.SPLICED_ENDLESS: + valueLimit.value = 15; + break; + default: + valueLimit.value = 10; + } + + Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_POINTS, valueLimit); + + return valueLimit.value; + } + + setCursor(cursor: number): boolean { + const ret = super.setCursor(cursor); + + if (!this.cursorObj) { + this.cursorObj = globalScene.add.image(0, 0, "cursor"); + this.cursorObj.setOrigin(0, 0); + this.menuContainer.add(this.cursorObj); + } + + this.cursorObj.setScale(this.scale * 6); + this.cursorObj.setPositionRelative(this.menuBg, 7, 6 + (18 + this.cursor * 96) * this.scale); + + const ui = this.getUi(); + + const isFormCaught = this.isFormCaught(); + + if ((this.isCaught() && isFormCaught) || (this.speciesStarterDexEntry?.seenAttr && cursor === 5)) { + ui.showText(this.menuDescriptions[cursor]); + } else { + ui.showText(""); + } + + return ret; + } + + getFriendship(_speciesId: number) { + let currentFriendship = globalScene.gameData.starterData[this.starterId].friendship; + if (!currentFriendship || currentFriendship === undefined) { + currentFriendship = 0; + } + + const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[this.starterId]); + + return { currentFriendship, friendshipCap }; + } + + /** + * Determines if a passive upgrade is available for the current species + * @returns true if the user has enough candies and a passive has not been unlocked already + */ + isPassiveAvailable(): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.starterId]; + + return ( + starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.starterId]) && + !(starterData.passiveAttr & PassiveAttr.UNLOCKED) + ); + } + + /** + * Determines if a value reduction upgrade is available for the current species + * @returns true if the user has enough candies and all value reductions have not been unlocked already + */ + isValueReductionAvailable(): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.starterId]; + + return ( + starterData.candyCount >= + getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[starterData.valueReduction] && + starterData.valueReduction < valueReductionMax + ); + } + + /** + * Determines if an same species egg can be bought for the current species + * @returns true if the user has enough candies + */ + isSameSpeciesEggAvailable(): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.starterId]; + + return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[this.starterId]); + } + + setSpecies() { + const species = this.species; + const starterAttributes: StarterAttributes | null = species ? { ...this.starterAttributes } : null; + + if (!species && globalScene.ui.getTooltip().visible) { + globalScene.ui.hideTooltip(); + } + + if (this.statsMode) { + if (this.isCaught()) { + this.statsContainer.setVisible(true); + this.showStats(); + } else { + this.statsContainer.setVisible(false); + //@ts-ignore + this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. what. how? huh? + } + } + + if (species && (this.speciesStarterDexEntry?.seenAttr || this.isCaught())) { + this.pokemonNumberText.setText(padInt(species.speciesId, 4)); + + if (this.isCaught()) { + const defaultDexAttr = this.getCurrentDexProps(species.speciesId); + // Set default attributes if for some reason starterAttributes does not exist or attributes missing + const props: StarterAttributes = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + if (starterAttributes?.variant && !Number.isNaN(starterAttributes.variant)) { + if (props.shiny) { + props.variant = starterAttributes.variant as Variant; + } + } + props.form = starterAttributes?.form ?? props.form; + props.female = starterAttributes?.female ?? props.female; + + this.setSpeciesDetails(species, { + shiny: props.shiny, + formIndex: props.form, + female: props.female, + variant: props.variant ?? 0, + }); + } else { + this.pokemonGrowthRateText.setText(""); + this.pokemonGrowthRateLabelText.setVisible(false); + this.type1Icon.setVisible(true); + this.type2Icon.setVisible(true); + this.pokemonLuckLabelText.setVisible(false); + this.pokemonLuckText.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } + this.pokemonUncaughtText.setVisible(true); + this.pokemonCaughtHatchedContainer.setVisible(true); + this.pokemonCandyContainer.setVisible(false); + this.pokemonFormText.setVisible(false); + + const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, true, true); + const props = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + this.setSpeciesDetails(species, { + shiny: props.shiny, + formIndex: props.formIndex, + female: props.female, + variant: props.variant, + }); + this.pokemonSprite.setTint(0x808080); + } + } else { + this.pokemonNumberText.setText(species ? padInt(species.speciesId, 4) : ""); + this.pokemonNameText.setText(species ? "???" : ""); + this.pokemonGrowthRateText.setText(""); + this.pokemonGrowthRateLabelText.setVisible(false); + this.type1Icon.setVisible(false); + this.type2Icon.setVisible(false); + this.pokemonLuckLabelText.setVisible(false); + this.pokemonLuckText.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } + this.pokemonUncaughtText.setVisible(!!species); + this.pokemonCaughtHatchedContainer.setVisible(false); + this.pokemonCandyContainer.setVisible(false); + this.pokemonFormText.setVisible(false); + + this.setSpeciesDetails(species!, { + // TODO: is this bang correct? + shiny: false, + formIndex: 0, + female: false, + variant: 0, + }); + this.pokemonSprite.setTint(0x000000); + } + } + + setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}, forceUpdate?: boolean): void { + let { shiny, formIndex, female, variant } = options; + const oldProps = species ? this.starterAttributes : null; + + // We will only update the sprite if there is a change to form, shiny/variant + // or gender for species with gender sprite differences + const shouldUpdateSprite = + (species?.genderDiffs && !isNullOrUndefined(female)) || + !isNullOrUndefined(formIndex) || + !isNullOrUndefined(shiny) || + !isNullOrUndefined(variant) || + forceUpdate; + + if (this.activeTooltip === "CANDY") { + if (this.species && this.pokemonCandyContainer.visible) { + const { currentFriendship, friendshipCap } = this.getFriendship(this.species.speciesId); + globalScene.ui.editTooltip("", `${currentFriendship}/${friendshipCap}`); + } else { + globalScene.ui.hideTooltip(); + } + } + + if (species?.forms?.find(f => f.formKey === "female")) { + if (female !== undefined) { + formIndex = female ? 1 : 0; + } else if (formIndex !== undefined) { + female = formIndex === 1; + } + } + + if (species) { + // Only assign shiny, female, and variant if they are undefined + if (shiny === undefined) { + shiny = oldProps?.shiny ?? false; + } + if (female === undefined) { + female = oldProps?.female ?? false; + } + if (variant === undefined) { + variant = oldProps?.variant ?? 0; + } + if (formIndex === undefined) { + formIndex = oldProps?.form ?? 0; + } + } + + this.pokemonSprite.setVisible(false); + + if (this.assetLoadCancelled) { + this.assetLoadCancelled.value = true; + this.assetLoadCancelled = null; + } + + if (species) { + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + + const caughtAttr = this.isCaught(species); + + if (!caughtAttr) { + const props = this.starterAttributes; + + if (shiny === undefined || shiny !== props.shiny) { + shiny = props.shiny; + } + if (formIndex === undefined || formIndex !== props.form) { + formIndex = props.form; + } + if (female === undefined || female !== props.female) { + female = props.female; + } + if (variant === undefined || variant !== props.variant) { + variant = props.variant; + } + } + + const isFormCaught = this.isFormCaught(); + const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + + this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? + this.pokemonNumberText.setColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, false)); + this.pokemonNumberText.setShadowColor( + this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true), + ); + + const assetLoadCancelled = new BooleanHolder(false); + this.assetLoadCancelled = assetLoadCancelled; + + if (shouldUpdateSprite) { + const back = !!this.showBackSprite; + species.loadAssets(female!, formIndex, shiny, variant as Variant, true, back).then(() => { + // TODO: is this bang correct? + if (assetLoadCancelled.value) { + return; + } + this.assetLoadCancelled = null; + this.speciesLoaded.set(species.speciesId, true); + this.pokemonSprite.play(species.getSpriteKey(female!, formIndex, shiny, variant, back)); // TODO: is this bang correct? + this.pokemonSprite.setPipelineData("shiny", shiny); + this.pokemonSprite.setPipelineData("variant", variant); + this.pokemonSprite.setPipelineData( + "spriteKey", + species.getSpriteKey(female!, formIndex, shiny, variant, back), + ); // TODO: is this bang correct? + this.pokemonSprite.setVisible(!this.statsMode); + }); + } else { + this.pokemonSprite.setVisible(!this.statsMode); + } + + const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); + const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); + + const caughtVariants = [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter( + v => caughtAttr & v, + ); + this.canCycleShiny = (isNonShinyCaught && isShinyCaught) || (isShinyCaught && caughtVariants.length > 1); + + const isMaleCaught = !!(caughtAttr & DexAttr.MALE); + const isFemaleCaught = !!(caughtAttr & DexAttr.FEMALE); + this.canCycleGender = isMaleCaught && isFemaleCaught; + + // If the dev option for the dex is selected, all forms can be cycled through + this.canCycleForm = globalScene.dexForDevs + ? species.forms.length > 1 + : species.forms.filter(f => f.isStarterSelectable).filter(f => f).length > 1; + + if (caughtAttr && species.malePercent !== null) { + const gender = !female ? Gender.MALE : Gender.FEMALE; + this.pokemonGenderText.setText(getGenderSymbol(gender)); + this.pokemonGenderText.setColor(getGenderColor(gender)); + this.pokemonGenderText.setShadowColor(getGenderColor(gender, true)); + } else { + this.pokemonGenderText.setText(""); + } + + // Setting the name + if (isFormCaught || isFormSeen) { + this.pokemonNameText.setText(species.name); + } else { + this.pokemonNameText.setText(species ? "???" : ""); + } + + // Setting tint of the sprite + if (isFormCaught) { + this.species.loadAssets(female!, formIndex, shiny, variant as Variant, true).then(() => { + const crier = + this.species.forms && this.species.forms.length > 0 + ? this.species.forms[formIndex ?? this.formIndex] + : this.species; + crier.cry(); + }); + this.pokemonSprite.clearTint(); + } else if (isFormSeen) { + this.pokemonSprite.setTint(0x808080); + } else { + this.pokemonSprite.setTint(0); + } + + // Setting luck text and sparks + if (isFormCaught) { + const luck = globalScene.gameData.getDexAttrLuck(this.isCaught()); + this.pokemonLuckText.setVisible(!!luck); + this.pokemonLuckText.setText(luck.toString()); + this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant)); + this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible); + } else { + this.pokemonLuckText.setVisible(false); + this.pokemonLuckLabelText.setVisible(false); + } + + // Setting growth rate text + if (isFormCaught) { + let growthReadable = toReadableString(GrowthRate[species.growthRate]); + const growthAux = growthReadable.replace(" ", "_"); + if (i18next.exists("growth:" + growthAux)) { + growthReadable = i18next.t(("growth:" + growthAux) as any); + } + this.pokemonGrowthRateText.setText(growthReadable); + + this.pokemonGrowthRateText.setColor(getGrowthRateColor(species.growthRate)); + this.pokemonGrowthRateText.setShadowColor(getGrowthRateColor(species.growthRate, true)); + this.pokemonGrowthRateLabelText.setVisible(true); + } else { + this.pokemonGrowthRateText.setText(""); + this.pokemonGrowthRateLabelText.setVisible(false); + } + + // Caught and hatched + if (isFormCaught) { + const colorScheme = starterColors[this.starterId]; + + this.pokemonUncaughtText.setVisible(false); + this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry?.caughtCount}`); + if (species.speciesId === Species.MANAPHY || species.speciesId === Species.PHIONE) { + this.pokemonHatchedIcon.setFrame("manaphy"); + } else { + this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species)); + } + this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry?.hatchedCount}`); + + const defaultDexAttr = this.getCurrentDexProps(species.speciesId); + const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + const variant = defaultProps.variant; + for (let v = 0; v < 3; v++) { + const icon = this.pokemonShinyIcons[v]; + if (v < this.availableVariants) { + if (!this.unlockedVariants[v]) { + icon.setTint(0x000000); + } else if (shiny && v === variant) { + const tint = getVariantTint(v as Variant); + icon.setTint(tint); + } else { + icon.setTint(0x808080); + } + icon.setVisible(true); + } else { + icon.setVisible(false); + } + } + + this.pokemonCaughtHatchedContainer.setVisible(true); + this.pokemonCaughtHatchedContainer.setY(25); + this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); + this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); + this.pokemonCandyCountText.setText( + `x${species.speciesId === Species.PIKACHU ? 0 : globalScene.gameData.starterData[this.starterId].candyCount}`, + ); + this.pokemonCandyContainer.setVisible(true); + + if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { + this.pokemonHatchedIcon.setVisible(false); + this.pokemonHatchedCountText.setVisible(false); + this.pokemonFormText.setY(36); + } else { + this.pokemonHatchedIcon.setVisible(true); + this.pokemonHatchedCountText.setVisible(true); + this.pokemonFormText.setY(42); + + const { currentFriendship, friendshipCap } = this.getFriendship(this.species.speciesId); + const candyCropY = 16 - 16 * (currentFriendship / friendshipCap); + this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY); + + this.pokemonCandyContainer.on("pointerover", () => { + globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true); + this.activeTooltip = "CANDY"; + }); + this.pokemonCandyContainer.on("pointerout", () => { + globalScene.ui.hideTooltip(); + this.activeTooltip = undefined; + }); + } + } else { + this.pokemonUncaughtText.setVisible(true); + this.pokemonCaughtHatchedContainer.setVisible(false); + this.pokemonCandyContainer.setVisible(false); + for (const icon of this.pokemonShinyIcons) { + icon.setVisible(false); + } + } + + // Setting type icons and form text + if (isFormCaught || isFormSeen) { + const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? + this.setTypeIcons(speciesForm.type1, speciesForm.type2); + // TODO: change this once forms are refactored + if (normalForm.includes(species.speciesId) && !formIndex) { + this.pokemonFormText.setText(""); + } else { + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex)); + } + this.pokemonFormText.setVisible(true); + if (!isFormCaught) { + this.pokemonFormText.setY(18); + } + } else { + this.setTypeIcons(null, null); + this.pokemonFormText.setText(""); + this.pokemonFormText.setVisible(false); + } + } else { + this.shinyOverlay.setVisible(false); + this.pokemonNumberText.setColor(this.getTextColor(TextStyle.SUMMARY)); + this.pokemonNumberText.setShadowColor(this.getTextColor(TextStyle.SUMMARY, true)); + this.pokemonGenderText.setText(""); + this.setTypeIcons(null, null); + } + + this.updateInstructions(); + } + + setTypeIcons(type1: PokemonType | null, type2: PokemonType | null): void { + if (type1 !== null) { + this.type1Icon.setVisible(true); + this.type1Icon.setFrame(PokemonType[type1].toLowerCase()); + } else { + this.type1Icon.setVisible(false); + } + if (type2 !== null) { + this.type2Icon.setVisible(true); + this.type2Icon.setFrame(PokemonType[type2].toLowerCase()); + } else { + this.type2Icon.setVisible(false); + } + } + + /** + * Creates a temporary dex attr props that will be used to display the correct shiny, variant, and form based on this.starterAttributes + * + * @param speciesId the id of the species to get props for + * @returns the dex props + */ + getCurrentDexProps(speciesId: number): bigint { + let props = 0n; + const species = allSpecies.find(sp => sp.speciesId === speciesId); + const caughtAttr = + globalScene.gameData.dexData[speciesId].caughtAttr & + globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & + (species?.getFullUnlocksData() ?? 0n); + + /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props + * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props + * If neither of these pass, we add DexAttr.MALE to our temp props + */ + if (this.starterAttributes?.female || ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n)) { + props += DexAttr.FEMALE; + } else { + props += DexAttr.MALE; + } + /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences. + * If they're not there, it enables shiny state by default if any shiny was caught + */ + if ( + this.starterAttributes?.shiny || + ((caughtAttr & DexAttr.SHINY) > 0n && this.starterAttributes?.shiny !== false) + ) { + props += DexAttr.SHINY; + if (this.starterAttributes?.variant !== undefined) { + props += BigInt(Math.pow(2, this.starterAttributes?.variant)) * DexAttr.DEFAULT_VARIANT; + } else { + /* This calculates the correct variant if there's no starter preferences for it. + * This gets the highest tier variant that you've caught and adds it to the temp props + */ + if ((caughtAttr & DexAttr.VARIANT_3) > 0) { + props += DexAttr.VARIANT_3; + } else if ((caughtAttr & DexAttr.VARIANT_2) > 0) { + props += DexAttr.VARIANT_2; + } else { + props += DexAttr.DEFAULT_VARIANT; + } + } + } else { + props += DexAttr.NON_SHINY; + props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant + } + if (this.starterAttributes?.form) { + // this checks for the form of the pokemon + props += BigInt(Math.pow(2, this.starterAttributes?.form)) * DexAttr.DEFAULT_FORM; + } else { + // Get the first unlocked form + props += globalScene.gameData.getFormAttr(globalScene.gameData.getFormIndex(caughtAttr)); + } + + return props; + } + + toggleStatsMode(on?: boolean): void { + if (on === undefined) { + on = !this.statsMode; + } + if (on) { + this.showStats(); + this.statsMode = true; + this.pokemonSprite.setVisible(false); + } else { + this.statsMode = false; + this.statsContainer.setVisible(false); + this.pokemonSprite.setVisible(true); + //@ts-ignore + this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. !?!? + } + } + + showStats(): void { + if (!this.speciesStarterDexEntry) { + return; + } + + this.statsContainer.setVisible(true); + + this.statsContainer.updateIvs(this.speciesStarterDexEntry.ivs); + } + + clearText() { + this.starterSelectMessageBoxContainer.setVisible(false); + super.clearText(); + } + + hideInstructions(): void { + this.candyUpgradeIconElement.setVisible(false); + this.candyUpgradeLabel.setVisible(false); + this.shinyIconElement.setVisible(false); + this.shinyLabel.setVisible(false); + this.formIconElement.setVisible(false); + this.formLabel.setVisible(false); + this.genderIconElement.setVisible(false); + this.genderLabel.setVisible(false); + this.variantIconElement.setVisible(false); + this.variantLabel.setVisible(false); + } + + clear(): void { + super.clear(); + + this.cursor = -1; + this.hideInstructions(); + this.activeTooltip = undefined; + globalScene.ui.hideTooltip(); + + this.starterSelectContainer.setVisible(false); + this.blockInput = false; + + this.showBackSprite = false; + this.showBackSpriteLabel.setText(i18next.t("pokedexUiHandler:showBackSprite")); + + if (this.statsMode) { + this.toggleStatsMode(false); + } + } + + checkIconId( + icon: Phaser.GameObjects.Sprite, + species: PokemonSpecies, + female: boolean, + formIndex: number, + shiny: boolean, + variant: number, + ) { + if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { + console.log( + `${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`, + ); + icon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); + icon.setFrame(species.getIconId(female, formIndex, false, variant)); + } + } +} diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts new file mode 100644 index 00000000000..b34246b97d1 --- /dev/null +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -0,0 +1,193 @@ +import type { InputFieldConfig } from "./form-modal-ui-handler"; +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import type { ModalConfig } from "./modal-ui-handler"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type { OptionSelectItem } from "./abstact-option-select-ui-handler"; +import { isNullOrUndefined } from "#app/utils"; +import { Mode } from "./ui"; +import { FilterTextRow } from "./filter-text"; +import { allAbilities } from "#app/data/ability"; +import { allMoves } from "#app/data/moves/move"; +import { allSpecies } from "#app/data/pokemon-species"; +import i18next from "i18next"; + +export default class PokedexScanUiHandler extends FormModalUiHandler { + keys: string[]; + reducedKeys: string[]; + parallelKeys: string[]; + nameKeys: string[]; + moveKeys: string[]; + abilityKeys: string[]; + row: number; + + setup() { + super.setup(); + + this.nameKeys = allSpecies.map(a => a.name).filter((value, index, self) => self.indexOf(value) === index); + this.moveKeys = allMoves.map(a => a.name); + this.abilityKeys = allAbilities.map(a => a.name); + } + + getModalTitle(_config?: ModalConfig): string { + return i18next.t("pokedexUiHandler:scanChooseOption"); + } + + getWidth(_config?: ModalConfig): number { + return 300; + } + + getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; + } + + getButtonLabels(_config?: ModalConfig): string[] { + return [i18next.t("pokedexUiHandler:scanSelect"), i18next.t("pokedexUiHandler:scanCancel")]; + } + + getReadableErrorMessage(error: string): string { + const colonIndex = error?.indexOf(":"); + if (colonIndex > 0) { + error = error.slice(0, colonIndex); + } + + return super.getReadableErrorMessage(error); + } + + override getInputFieldConfigs(): InputFieldConfig[] { + switch (this.row) { + case FilterTextRow.NAME: { + return [{ label: i18next.t("pokedexUiHandler:scanLabelName") }]; + } + case FilterTextRow.MOVE_1: + case FilterTextRow.MOVE_2: { + return [{ label: i18next.t("pokedexUiHandler:scanLabelMove") }]; + } + case FilterTextRow.ABILITY_1: { + return [{ label: i18next.t("pokedexUiHandler:scanLabelAbility") }]; + } + case FilterTextRow.ABILITY_2: { + return [{ label: i18next.t("pokedexUiHandler:scanLabelPassive") }]; + } + default: { + return [{ label: "" }]; + } + } + } + + reduceKeys(): void { + switch (this.row) { + case FilterTextRow.NAME: { + this.reducedKeys = this.nameKeys; + break; + } + case FilterTextRow.MOVE_1: + case FilterTextRow.MOVE_2: { + this.reducedKeys = this.moveKeys; + break; + } + case FilterTextRow.ABILITY_1: + case FilterTextRow.ABILITY_2: { + this.reducedKeys = this.abilityKeys; + break; + } + default: { + this.reducedKeys = this.keys; + } + } + } + + // args[2] is an index of FilterTextRow + show(args: any[]): boolean { + this.row = args[2]; + const ui = this.getUi(); + const hasTitle = !!this.getModalTitle(); + this.updateFields(this.getInputFieldConfigs(), hasTitle); + this.updateContainer(args[0] as ModalConfig); + const input = this.inputs[0]; + input.setMaxLength(255); + + this.reduceKeys(); + + setTimeout(() => { + input.setFocus(); // Focus after a short delay to avoid unwanted input + }, 50); + + input.on("keydown", (inputObject, evt: KeyboardEvent) => { + if ( + ["escape", "space"].some(v => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && + ui.getMode() === Mode.AUTO_COMPLETE + ) { + // Delete autocomplete list and recovery focus. + inputObject.on("blur", () => inputObject.node.focus(), { once: true }); + ui.revertMode(); + } + }); + + input.on("textchange", (inputObject, evt: InputEvent) => { + // Delete autocomplete. + if (ui.getMode() === Mode.AUTO_COMPLETE) { + ui.revertMode(); + } + + let options: OptionSelectItem[] = []; + const filteredKeys = this.reducedKeys.filter(command => + command.toLowerCase().includes(inputObject.text.toLowerCase()), + ); + if (inputObject.text !== "" && filteredKeys.length > 0) { + options = filteredKeys.slice(0).map(value => { + return { + label: value, + handler: () => { + if (!isNullOrUndefined(evt.data) || evt.inputType?.toLowerCase() === "deletecontentbackward") { + inputObject.setText(value); + } + ui.revertMode(); + return true; + }, + }; + }); + } + + if (options.length > 0) { + const modalOpts = { + options: options, + maxOptions: 5, + modalContainer: this.modalContainer, + }; + ui.setOverlayMode(Mode.AUTO_COMPLETE, modalOpts); + } + }); + + if (super.show(args)) { + const config = args[0] as ModalConfig; + this.inputs[0].resize(1150, 116); + this.inputContainers[0].list[0].width = 200; + if (args[1] && typeof (args[1] as PlayerPokemon).getNameToRender === "function") { + this.inputs[0].text = (args[1] as PlayerPokemon).getNameToRender(); + } else { + this.inputs[0].text = args[1]; + } + this.submitAction = _ => { + if (ui.getMode() === Mode.POKEDEX_SCAN) { + this.sanitizeInputs(); + const outputName = this.reducedKeys.includes(this.inputs[0].text) ? this.inputs[0].text : ""; + const sanitizedName = btoa(unescape(encodeURIComponent(outputName))); + config.buttonActions[0](sanitizedName); + return true; + } + return false; + }; + return true; + } + return false; + } + + clear(): void { + super.clear(); + + // Clearing the labels so they don't appear again and overlap + this.formLabels.forEach(label => { + label.destroy(); + }); + } +} diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts new file mode 100644 index 00000000000..f4cb9f51c16 --- /dev/null +++ b/src/ui/pokedex-ui-handler.ts @@ -0,0 +1,2394 @@ +import type { Variant } from "#app/data/variant"; +import { getVariantTint, getVariantIcon } from "#app/data/variant"; +import { argbFromRgba } from "@material/material-color-utilities"; +import i18next from "i18next"; +import { starterColors } from "#app/battle-scene"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; +import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; +import type { PokemonForm } from "#app/data/pokemon-species"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpeciesForm, getPokerusStarters, normalForm } from "#app/data/pokemon-species"; +import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; +import { catchableSpecies } from "#app/data/balance/biomes"; +import { PokemonType } from "#enums/pokemon-type"; +import type { DexAttrProps, DexEntry, StarterAttributes, StarterPreferences } from "#app/system/game-data"; +import { AbilityAttr, DexAttr, loadStarterPreferences, saveStarterPreferences } from "#app/system/game-data"; +import MessageUiHandler from "#app/ui/message-ui-handler"; +import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; +import { TextStyle, addTextObject } from "#app/ui/text"; +import { Mode } from "#app/ui/ui"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { Passive as PassiveAttr } from "#enums/passive"; +import type { Species } from "#enums/species"; +import { Button } from "#enums/buttons"; +import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "#app/ui/dropdown"; +import { PokedexMonContainer } from "#app/ui/pokedex-mon-container"; +import { DropDownColumn, FilterBar } from "#app/ui/filter-bar"; +import { ScrollBar } from "#app/ui/scroll-bar"; +import { Abilities } from "#enums/abilities"; +import { + getPassiveCandyCount, + getValueReductionCandyCounts, + getSameSpeciesEggCandyCounts, +} from "#app/data/balance/starters"; +import { BooleanHolder, fixedInt, getLocalizedSpriteKey, padInt, randIntRange, rgbHexToRgba } from "#app/utils"; +import type { Nature } from "#enums/nature"; +import { addWindow } from "./ui-theme"; +import type { OptionSelectConfig } from "./abstact-option-select-ui-handler"; +import { FilterText, FilterTextRow } from "./filter-text"; +import { allAbilities } from "#app/data/ability"; +import type { PassiveAbilities } from "#app/data/balance/passives"; +import { starterPassiveAbilities } from "#app/data/balance/passives"; +import { allMoves } from "#app/data/moves/move"; +import { speciesTmMoves } from "#app/data/balance/tms"; +import { pokemonStarters } from "#app/data/balance/pokemon-evolutions"; +import { Biome } from "#enums/biome"; +import { globalScene } from "#app/global-scene"; + +interface LanguageSetting { + starterInfoTextSize: string; + instructionTextSize: string; + starterInfoXPos?: number; + starterInfoYOffset?: number; +} + +const languageSettings: { [key: string]: LanguageSetting } = { + en: { + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, + de: { + starterInfoTextSize: "48px", + instructionTextSize: "35px", + starterInfoXPos: 33, + }, + "es-ES": { + starterInfoTextSize: "56px", + instructionTextSize: "35px", + }, + fr: { + starterInfoTextSize: "54px", + instructionTextSize: "38px", + }, + it: { + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, + pt_BR: { + starterInfoTextSize: "47px", + instructionTextSize: "38px", + starterInfoXPos: 33, + }, + zh: { + starterInfoTextSize: "47px", + instructionTextSize: "38px", + starterInfoYOffset: 1, + starterInfoXPos: 24, + }, + pt: { + starterInfoTextSize: "48px", + instructionTextSize: "42px", + starterInfoXPos: 33, + }, + ko: { + starterInfoTextSize: "52px", + instructionTextSize: "38px", + }, + ja: { + starterInfoTextSize: "51px", + instructionTextSize: "38px", + }, + "ca-ES": { + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, +}; + +enum FilterTextOptions { + NAME, + MOVE_1, + MOVE_2, + ABILITY_1, + ABILITY_2, +} + +interface ContainerData { + species: PokemonSpecies; + cost: number; + props: DexAttrProps; + eggMove1?: boolean; + eggMove2?: boolean; + tmMove1?: boolean; + tmMove2?: boolean; + passive1?: boolean; + passive2?: boolean; +} + +const valueReductionMax = 2; + +// Position of UI elements +const filterBarHeight = 17; +const speciesContainerX = 143; + +/** + * Calculates the starter position for a Pokemon of a given UI index + * @param index UI index to calculate the starter position of + * @returns An interface with an x and y property + */ +function calcStarterPosition(index: number): { x: number; y: number } { + const yOffset = 13; + const height = 17; + const x = (index % 9) * 18; + const y = yOffset + Math.floor(index / 9) * height; + + return { x: x, y: y }; +} + +interface SpeciesDetails { + shiny?: boolean; + formIndex?: number; + female?: boolean; + variant?: Variant; + abilityIndex?: number; + natureIndex?: number; +} + +export default class PokedexUiHandler extends MessageUiHandler { + private starterSelectContainer: Phaser.GameObjects.Container; + private starterSelectScrollBar: ScrollBar; + private filterBarContainer: Phaser.GameObjects.Container; + private filterBar: FilterBar; + private pokemonContainers: PokedexMonContainer[] = []; + private filteredPokemonData: ContainerData[] = []; + private pokemonNumberText: Phaser.GameObjects.Text; + private pokemonSprite: Phaser.GameObjects.Sprite; + private pokemonNameText: Phaser.GameObjects.Text; + private pokemonFormText: Phaser.GameObjects.Text; + private type1Icon: Phaser.GameObjects.Sprite; + private type2Icon: Phaser.GameObjects.Sprite; + + private starterSelectMessageBox: Phaser.GameObjects.NineSlice; + private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; + + private filterMode: boolean; + private filterBarCursor = 0; + private scrollCursor: number; + private oldCursor = -1; + + private allSpecies: PokemonSpecies[] = []; + private lastSpecies: PokemonSpecies; + private speciesLoaded: Map = new Map(); + private pokerusSpecies: PokemonSpecies[] = []; + private speciesStarterDexEntry: DexEntry | null; + + private assetLoadCancelled: BooleanHolder | null; + public cursorObj: Phaser.GameObjects.Image; + private pokerusCursorObjs: Phaser.GameObjects.Image[]; + + private iconAnimHandler: PokemonIconAnimHandler; + + private starterPreferences: StarterPreferences; + + protected blockInput = false; + + // for text filters + private readonly textPadding = 8; + private readonly defaultMessageBoxWidth = 220; + private readonly defaultWordWrapWidth = 1224; + private menuMessageBoxContainer: Phaser.GameObjects.Container; + private menuMessageBox: Phaser.GameObjects.NineSlice; + private dialogueMessageBox: Phaser.GameObjects.NineSlice; + protected manageDataConfig: OptionSelectConfig; + private filterTextOptions: FilterTextOptions[]; + protected optionSelectText: Phaser.GameObjects.Text; + protected scale = 0.1666666667; + private menuBg: Phaser.GameObjects.NineSlice; + + private filterTextContainer: Phaser.GameObjects.Container; + private filterText: FilterText; + private filterTextMode: boolean; + private filterTextCursor = 0; + + private showDecorations = false; + private goFilterIconElement1: Phaser.GameObjects.Sprite; + private goFilterIconElement2: Phaser.GameObjects.Sprite; + private goFilterLabel: Phaser.GameObjects.Text; + private toggleDecorationsIconElement: Phaser.GameObjects.Sprite; + private toggleDecorationsLabel: Phaser.GameObjects.Text; + + private formTrayContainer: Phaser.GameObjects.Container; + private trayBg: Phaser.GameObjects.NineSlice; + private trayForms: PokemonForm[]; + private trayContainers: PokedexMonContainer[] = []; + private trayNumIcons: number; + private trayRows: number; + private trayColumns: number; + private trayCursorObj: Phaser.GameObjects.Image; + private trayCursor = 0; + private showingTray = false; + private showFormTrayIconElement: Phaser.GameObjects.Sprite; + private showFormTrayLabel: Phaser.GameObjects.Text; + private canShowFormTray: boolean; + private filteredIndices: Species[]; + + constructor() { + super(Mode.POKEDEX); + } + + setup() { + const ui = this.getUi(); + const currentLanguage = i18next.resolvedLanguage ?? "en"; + const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)) ?? "en"; + const textSettings = languageSettings[langSettingKey]; + + this.starterSelectContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.starterSelectContainer.setVisible(false); + ui.add(this.starterSelectContainer); + + const bgColor = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0x006860, + ); + bgColor.setOrigin(0, 0); + this.starterSelectContainer.add(bgColor); + + const pokemonContainerWindow = addWindow(speciesContainerX, filterBarHeight + 1, 175, 161); + const pokemonContainerBg = globalScene.add.image( + speciesContainerX + 1, + filterBarHeight + 2, + "starter_container_bg", + ); + pokemonContainerBg.setOrigin(0, 0); + this.starterSelectContainer.add(pokemonContainerBg); + this.starterSelectContainer.add(pokemonContainerWindow); + + // Create and initialise filter text fields + this.filterTextContainer = globalScene.add.container(0, 0); + this.filterText = new FilterText(1, filterBarHeight + 2, 140, 100, this.updateStarters); + + this.filterText.addFilter(FilterTextRow.NAME, i18next.t("filterText:nameField")); + this.filterText.addFilter(FilterTextRow.MOVE_1, i18next.t("filterText:move1Field")); + this.filterText.addFilter(FilterTextRow.MOVE_2, i18next.t("filterText:move2Field")); + this.filterText.addFilter(FilterTextRow.ABILITY_1, i18next.t("filterText:ability1Field")); + this.filterText.addFilter(FilterTextRow.ABILITY_2, i18next.t("filterText:ability2Field")); + + this.filterTextContainer.add(this.filterText); + this.starterSelectContainer.add(this.filterTextContainer); + + // Create and initialise filter bar + this.filterBarContainer = globalScene.add.container(0, 0); + this.filterBar = new FilterBar(speciesContainerX, 1, 175, filterBarHeight, 2, 0, 6); + + // gen filter + const genOptions: DropDownOption[] = [ + new DropDownOption(1, new DropDownLabel(i18next.t("pokedexUiHandler:gen1"))), + new DropDownOption(2, new DropDownLabel(i18next.t("pokedexUiHandler:gen2"))), + new DropDownOption(3, new DropDownLabel(i18next.t("pokedexUiHandler:gen3"))), + new DropDownOption(4, new DropDownLabel(i18next.t("pokedexUiHandler:gen4"))), + new DropDownOption(5, new DropDownLabel(i18next.t("pokedexUiHandler:gen5"))), + new DropDownOption(6, new DropDownLabel(i18next.t("pokedexUiHandler:gen6"))), + new DropDownOption(7, new DropDownLabel(i18next.t("pokedexUiHandler:gen7"))), + new DropDownOption(8, new DropDownLabel(i18next.t("pokedexUiHandler:gen8"))), + new DropDownOption(9, new DropDownLabel(i18next.t("pokedexUiHandler:gen9"))), + ]; + const genDropDown: DropDown = new DropDown(0, 0, genOptions, this.updateStarters, DropDownType.HYBRID); + this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); + + // type filter + const typeKeys = Object.keys(PokemonType).filter(v => Number.isNaN(Number(v))); + const typeOptions: DropDownOption[] = []; + typeKeys.forEach((type, index) => { + if (index === 0 || index === 19) { + return; + } + const typeSprite = globalScene.add.sprite(0, 0, getLocalizedSpriteKey("types")); + typeSprite.setScale(0.5); + typeSprite.setFrame(type.toLowerCase()); + typeOptions.push(new DropDownOption(index, new DropDownLabel("", typeSprite))); + }); + this.filterBar.addFilter( + DropDownColumn.TYPES, + i18next.t("filterBar:typeFilter"), + new DropDown(0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5), + ); + + // biome filter, making an entry in the dropdown for each biome + const biomeOptions = Object.values(Biome) + .filter(value => typeof value === "number") // Filter numeric values from the enum + .map( + (biomeValue, index) => + new DropDownOption(index, new DropDownLabel(i18next.t(`biome:${Biome[biomeValue].toUpperCase()}`))), + ); + biomeOptions.push(new DropDownOption(biomeOptions.length, new DropDownLabel(i18next.t("filterBar:uncatchable")))); + const biomeDropDown: DropDown = new DropDown(0, 0, biomeOptions, this.updateStarters, DropDownType.HYBRID); + this.filterBar.addFilter(DropDownColumn.BIOME, i18next.t("filterBar:biomeFilter"), biomeDropDown); + + // caught filter + const shiny1Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); + shiny1Sprite.setOrigin(0.15, 0.2); + shiny1Sprite.setScale(0.6); + shiny1Sprite.setFrame(getVariantIcon(0)); + shiny1Sprite.setTint(getVariantTint(0)); + const shiny2Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); + shiny2Sprite.setOrigin(0.15, 0.2); + shiny2Sprite.setScale(0.6); + shiny2Sprite.setFrame(getVariantIcon(1)); + shiny2Sprite.setTint(getVariantTint(1)); + const shiny3Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); + shiny3Sprite.setOrigin(0.15, 0.2); + shiny3Sprite.setScale(0.6); + shiny3Sprite.setFrame(getVariantIcon(2)); + shiny3Sprite.setTint(getVariantTint(2)); + + const caughtOptions = [ + new DropDownOption("SHINY3", new DropDownLabel("", shiny3Sprite)), + new DropDownOption("SHINY2", new DropDownLabel("", shiny2Sprite)), + new DropDownOption("SHINY", new DropDownLabel("", shiny1Sprite)), + new DropDownOption("NORMAL", new DropDownLabel(i18next.t("filterBar:normal"))), + new DropDownOption("UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))), + ]; + + this.filterBar.addFilter( + DropDownColumn.CAUGHT, + i18next.t("filterBar:caughtFilter"), + new DropDown(0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID), + ); + + // unlocks filter + const passiveLabels = [ + new DropDownLabel(i18next.t("filterBar:passive"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:passiveUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:passiveUnlockable"), undefined, DropDownState.UNLOCKABLE), + new DropDownLabel(i18next.t("filterBar:passiveLocked"), undefined, DropDownState.EXCLUDE), + ]; + + const costReductionLabels = [ + new DropDownLabel(i18next.t("filterBar:costReduction"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:costReductionUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedOne"), undefined, DropDownState.ONE), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedTwo"), undefined, DropDownState.TWO), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockable"), undefined, DropDownState.UNLOCKABLE), + new DropDownLabel(i18next.t("filterBar:costReductionLocked"), undefined, DropDownState.EXCLUDE), + ]; + + const unlocksOptions = [ + new DropDownOption("PASSIVE", passiveLabels), + new DropDownOption("COST_REDUCTION", costReductionLabels), + ]; + + this.filterBar.addFilter( + DropDownColumn.UNLOCKS, + i18next.t("filterBar:unlocksFilter"), + new DropDown(0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL), + ); + + // misc filter + const starters = [ + new DropDownLabel(i18next.t("filterBar:starter"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:isStarter"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:notStarter"), undefined, DropDownState.EXCLUDE), + ]; + const favoriteLabels = [ + new DropDownLabel(i18next.t("filterBar:favorite"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:isFavorite"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:notFavorite"), undefined, DropDownState.EXCLUDE), + ]; + const winLabels = [ + new DropDownLabel(i18next.t("filterBar:ribbon"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasWon"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:hasNotWon"), undefined, DropDownState.EXCLUDE), + ]; + const hiddenAbilityLabels = [ + new DropDownLabel(i18next.t("filterBar:hiddenAbility"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasHiddenAbility"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:noHiddenAbility"), undefined, DropDownState.EXCLUDE), + ]; + const eggLabels = [ + new DropDownLabel(i18next.t("filterBar:egg"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:eggPurchasable"), undefined, DropDownState.ON), + ]; + const pokerusLabels = [ + new DropDownLabel(i18next.t("filterBar:pokerus"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasPokerus"), undefined, DropDownState.ON), + ]; + const miscOptions = [ + new DropDownOption("STARTER", starters), + new DropDownOption("FAVORITE", favoriteLabels), + new DropDownOption("WIN", winLabels), + new DropDownOption("HIDDEN_ABILITY", hiddenAbilityLabels), + new DropDownOption("EGG", eggLabels), + new DropDownOption("POKERUS", pokerusLabels), + ]; + this.filterBar.addFilter( + DropDownColumn.MISC, + i18next.t("filterBar:miscFilter"), + new DropDown(0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL), + ); + + // sort filter + const sortOptions = [ + new DropDownOption( + SortCriteria.NUMBER, + new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON), + ), + new DropDownOption(SortCriteria.COST, new DropDownLabel(i18next.t("filterBar:sortByCost"))), + new DropDownOption(SortCriteria.CANDY, new DropDownLabel(i18next.t("filterBar:sortByCandies"))), + new DropDownOption(SortCriteria.IV, new DropDownLabel(i18next.t("filterBar:sortByIVs"))), + new DropDownOption(SortCriteria.NAME, new DropDownLabel(i18next.t("filterBar:sortByName"))), + new DropDownOption(SortCriteria.CAUGHT, new DropDownLabel(i18next.t("filterBar:sortByNumCaught"))), + new DropDownOption(SortCriteria.HATCHED, new DropDownLabel(i18next.t("filterBar:sortByNumHatched"))), + ]; + this.filterBar.addFilter( + DropDownColumn.SORT, + i18next.t("filterBar:sortFilter"), + new DropDown(0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE), + ); + this.filterBarContainer.add(this.filterBar); + + this.starterSelectContainer.add(this.filterBarContainer); + + // Offset the generation filter dropdown to avoid covering the filtered pokemon + this.filterBar.offsetHybridFilters(); + + if (!globalScene.uiTheme) { + pokemonContainerWindow.setVisible(false); + } + + this.iconAnimHandler = new PokemonIconAnimHandler(); + this.iconAnimHandler.setup(); + + this.pokemonNumberText = addTextObject(6, 141, "", TextStyle.SUMMARY); + this.pokemonNumberText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonNumberText); + + this.pokemonNameText = addTextObject(6, 128, "", TextStyle.SUMMARY); + this.pokemonNameText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonNameText); + + this.pokemonFormText = addTextObject(6, 121, "", TextStyle.PARTY, { + fontSize: textSettings.instructionTextSize, + }); + this.pokemonFormText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonFormText); + + const starterBoxContainer = globalScene.add.container(speciesContainerX + 6, 9); //115 + + this.starterSelectScrollBar = new ScrollBar(161, 12, 5, pokemonContainerWindow.height - 6, 9); + + starterBoxContainer.add(this.starterSelectScrollBar); + + this.pokerusCursorObjs = new Array(POKERUS_STARTER_COUNT).fill(null).map(() => { + const cursorObj = globalScene.add.image(0, 0, "select_cursor_pokerus"); + cursorObj.setVisible(false); + cursorObj.setOrigin(0, 0); + starterBoxContainer.add(cursorObj); + return cursorObj; + }); + + this.cursorObj = globalScene.add.image(0, 0, "select_cursor"); + this.cursorObj.setOrigin(0, 0); + starterBoxContainer.add(this.cursorObj); + + for (const species of allSpecies) { + this.speciesLoaded.set(species.speciesId, false); + this.allSpecies.push(species); + } + + // Here code to declare 81 containers + for (let i = 0; i < 81; i++) { + const pokemonContainer = new PokedexMonContainer(this.allSpecies[i]).setVisible(false); + const pos = calcStarterPosition(i); + pokemonContainer.setPosition(pos.x, pos.y); + this.iconAnimHandler.addOrUpdate(pokemonContainer.icon, PokemonIconAnimMode.NONE); + this.pokemonContainers.push(pokemonContainer); + starterBoxContainer.add(pokemonContainer); + } + + // Tray to display forms + this.formTrayContainer = globalScene.add.container(0, 0); + + this.trayBg = addWindow(0, 0, 0, 0); + this.trayBg.setOrigin(0, 0); + this.formTrayContainer.add(this.trayBg); + + this.trayCursorObj = globalScene.add.image(0, 0, "select_cursor"); + this.trayCursorObj.setOrigin(0, 0); + this.formTrayContainer.add(this.trayCursorObj); + starterBoxContainer.add(this.formTrayContainer); + starterBoxContainer.bringToTop(this.formTrayContainer); + this.formTrayContainer.setVisible(false); + + this.starterSelectContainer.add(starterBoxContainer); + + this.pokemonSprite = globalScene.add.sprite(96, 143, "pkmn__sub"); + this.pokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); + this.starterSelectContainer.add(this.pokemonSprite); + + this.type1Icon = globalScene.add.sprite(10, 158, getLocalizedSpriteKey("types")); + this.type1Icon.setScale(0.5); + this.type1Icon.setOrigin(0, 0); + this.starterSelectContainer.add(this.type1Icon); + + this.type2Icon = globalScene.add.sprite(28, 158, getLocalizedSpriteKey("types")); + this.type2Icon.setScale(0.5); + this.type2Icon.setOrigin(0, 0); + this.starterSelectContainer.add(this.type2Icon); + + this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer.setVisible(false); + this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); + + this.starterSelectMessageBox = addWindow(1, -1, 318, 28); + this.starterSelectMessageBox.setOrigin(0, 1); + this.starterSelectMessageBoxContainer.add(this.starterSelectMessageBox); + + // Instruction for "C" button to toggle showDecorations + const instructionTextSize = textSettings.instructionTextSize; + + this.goFilterIconElement1 = new Phaser.GameObjects.Sprite(globalScene, 10, 2, "keyboard", "C.png"); + this.goFilterIconElement1.setName("sprite-goFilter1-icon-element"); + this.goFilterIconElement1.setScale(0.675); + this.goFilterIconElement1.setOrigin(0.0, 0.0); + this.goFilterIconElement2 = new Phaser.GameObjects.Sprite(globalScene, 20, 2, "keyboard", "V.png"); + this.goFilterIconElement2.setName("sprite-goFilter2-icon-element"); + this.goFilterIconElement2.setScale(0.675); + this.goFilterIconElement2.setOrigin(0.0, 0.0); + this.goFilterLabel = addTextObject(30, 2, i18next.t("pokedexUiHandler:goFilters"), TextStyle.PARTY, { + fontSize: instructionTextSize, + }); + this.goFilterLabel.setName("text-goFilter-label"); + this.starterSelectContainer.add(this.goFilterIconElement1); + this.starterSelectContainer.add(this.goFilterIconElement2); + this.starterSelectContainer.add(this.goFilterLabel); + + this.toggleDecorationsIconElement = new Phaser.GameObjects.Sprite(globalScene, 10, 10, "keyboard", "R.png"); + this.toggleDecorationsIconElement.setName("sprite-toggleDecorations-icon-element"); + this.toggleDecorationsIconElement.setScale(0.675); + this.toggleDecorationsIconElement.setOrigin(0.0, 0.0); + this.toggleDecorationsLabel = addTextObject( + 20, + 10, + i18next.t("pokedexUiHandler:toggleDecorations"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); + this.toggleDecorationsLabel.setName("text-toggleDecorations-label"); + this.starterSelectContainer.add(this.toggleDecorationsIconElement); + this.starterSelectContainer.add(this.toggleDecorationsLabel); + + this.showFormTrayIconElement = new Phaser.GameObjects.Sprite(globalScene, 6, 168, "keyboard", "F.png"); + this.showFormTrayIconElement.setName("sprite-showFormTray-icon-element"); + this.showFormTrayIconElement.setScale(0.675); + this.showFormTrayIconElement.setOrigin(0.0, 0.0); + this.showFormTrayLabel = addTextObject(16, 168, i18next.t("pokedexUiHandler:showForms"), TextStyle.PARTY, { + fontSize: instructionTextSize, + }); + this.showFormTrayLabel.setName("text-showFormTray-label"); + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + this.starterSelectContainer.add(this.showFormTrayIconElement); + this.starterSelectContainer.add(this.showFormTrayLabel); + + this.message = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + this.message.setOrigin(0, 0); + this.starterSelectMessageBoxContainer.add(this.message); + + // arrow icon for the message box + this.initPromptSprite(this.starterSelectMessageBoxContainer); + + // Filter bar sits above everything, except the tutorial overlay and message box + this.starterSelectContainer.bringToTop(this.filterBarContainer); + this.initTutorialOverlay(this.starterSelectContainer); + this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); + this.starterSelectContainer.bringToTop(this.pokemonNameText); + this.starterSelectContainer.bringToTop(this.pokemonFormText); + } + + show(args: any[]): boolean { + if (!this.starterPreferences) { + this.starterPreferences = loadStarterPreferences(); + } + + this.pokerusSpecies = getPokerusStarters(); + + // When calling with "refresh", we do not reset the cursor and filters + if (args.length >= 1 && args[0] === "refresh") { + return false; + } + + super.show(args); + + this.starterSelectContainer.setVisible(true); + + this.getUi().bringToTop(this.starterSelectContainer); + + this.pokemonContainers.forEach(container => { + const icon = container.icon; + const species = container.species; + + this.starterPreferences[species.speciesId] = this.initStarterPrefs(species); + + this.setUpgradeAnimation(icon, species); + }); + + this.resetFilters(); + this.updateStarters(); + + this.setFilterMode(false); + this.filterBarCursor = 0; + this.setFilterTextMode(false); + this.filterTextCursor = 0; + this.setCursor(0); + + this.filterTextContainer.setVisible(true); + + return true; + } + + /** + * Get the starter attributes for the given PokemonSpecies, after sanitizing them. + * If somehow a preference is set for a form, variant, gender, ability or nature + * that wasn't actually unlocked or is invalid it will be cleared here + * + * @param species The species to get Starter Preferences for + * @returns StarterAttributes for the species + */ + initStarterPrefs(species: PokemonSpecies): StarterAttributes { + const starterAttributes = this.starterPreferences[species.speciesId]; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const starterData = globalScene.gameData.starterData[species.speciesId]; + + // no preferences or Pokemon wasn't caught, return empty attribute + if (!starterAttributes || !dexEntry.caughtAttr) { + return {}; + } + + const caughtAttr = dexEntry.caughtAttr & species.getFullUnlocksData(); + + const hasShiny = caughtAttr & DexAttr.SHINY; + const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; + if (starterAttributes.shiny && !hasShiny) { + // shiny form wasn't unlocked, purging shiny and variant setting + + starterAttributes.shiny = undefined; + starterAttributes.variant = undefined; + } else if (starterAttributes.shiny === false && !hasNonShiny) { + // non shiny form wasn't unlocked, purging shiny setting + starterAttributes.shiny = undefined; + } + + if (starterAttributes.variant !== undefined) { + const unlockedVariants = [ + hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, + hasShiny && caughtAttr & DexAttr.VARIANT_2, + hasShiny && caughtAttr & DexAttr.VARIANT_3, + ]; + if ( + Number.isNaN(starterAttributes.variant) || + starterAttributes.variant < 0 || + !unlockedVariants[starterAttributes.variant] + ) { + // variant value is invalid or requested variant wasn't unlocked, purging setting + starterAttributes.variant = undefined; + } + } + + if (starterAttributes.female !== undefined) { + if (!(starterAttributes.female ? caughtAttr & DexAttr.FEMALE : caughtAttr & DexAttr.MALE)) { + // requested gender wasn't unlocked, purging setting + starterAttributes.female = undefined; + } + } + + if (starterAttributes.ability !== undefined) { + const speciesHasSingleAbility = species.ability2 === species.ability1; + const abilityAttr = starterData.abilityAttr; + const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; + const hasAbility2 = abilityAttr & AbilityAttr.ABILITY_2; + const hasHiddenAbility = abilityAttr & AbilityAttr.ABILITY_HIDDEN; + // Due to a past bug it is possible that some Pokemon with a single ability have the ability2 flag + // In this case, we only count ability2 as valid if ability1 was not unlocked, otherwise we ignore it + const unlockedAbilities = [ + hasAbility1, + speciesHasSingleAbility ? hasAbility2 && !hasAbility1 : hasAbility2, + hasHiddenAbility, + ]; + if (!unlockedAbilities[starterAttributes.ability]) { + // requested ability wasn't unlocked, purging setting + starterAttributes.ability = undefined; + } + } + + const selectedForm = starterAttributes.form; + if ( + selectedForm !== undefined && + (!species.forms[selectedForm]?.isStarterSelectable || + !(caughtAttr & globalScene.gameData.getFormAttr(selectedForm))) + ) { + // requested form wasn't unlocked/isn't a starter form, purging setting + starterAttributes.form = undefined; + } + + if (starterAttributes.nature !== undefined) { + const unlockedNatures = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr); + if (unlockedNatures.indexOf(starterAttributes.nature as unknown as Nature) < 0) { + // requested nature wasn't unlocked, purging setting + starterAttributes.nature = undefined; + } + } + + return starterAttributes; + } + + /** + * Set the selections for all filters to their default starting value + */ + resetFilters(): void { + this.filterBar.setValsToDefault(); + this.filterText.setValsToDefault(); + } + + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + moveToTop?: boolean, + ) { + super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); + + 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.starterSelectMessageBoxContainer.setY(globalScene.game.canvas.height / 6); + this.starterSelectMessageBox.setOrigin(0, 1); + this.message.setY(singleLine ? -22 : -37); + } + + this.starterSelectMessageBoxContainer.setVisible(!!text?.length); + } + + /** + * Determines if 'Icon' based upgrade notifications should be shown + * @returns true if upgrade notifications are enabled and set to display an 'Icon' + */ + isUpgradeIconEnabled(): boolean { + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 0; + } + /** + * Determines if 'Animation' based upgrade notifications should be shown + * @returns true if upgrade notifications are enabled and set to display an 'Animation' + */ + isUpgradeAnimationEnabled(): boolean { + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 1; + } + + getStarterSpeciesId(speciesId): number { + if (speciesStarterCosts.hasOwnProperty(speciesId)) { + return speciesId; + } + return pokemonStarters[speciesId]; + } + + /** + * Determines if a passive upgrade is available for the given species ID + * @param speciesId The ID of the species to check the passive of + * @returns true if the user has enough candies and a passive has not been unlocked already + */ + isPassiveAvailable(speciesId: number): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)]; + + return ( + starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]) && + !(starterData.passiveAttr & PassiveAttr.UNLOCKED) + ); + } + + /** + * Determines if a value reduction upgrade is available for the given species ID + * @param speciesId The ID of the species to check the value reduction of + * @returns true if the user has enough candies and all value reductions have not been unlocked already + */ + isValueReductionAvailable(speciesId: number): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)]; + + return ( + starterData.candyCount >= + getValueReductionCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(speciesId)])[ + starterData.valueReduction + ] && starterData.valueReduction < valueReductionMax + ); + } + + /** + * Determines if an same species egg can be bought for the given species ID + * @param speciesId The ID of the species to check the value reduction of + * @returns true if the user has enough candies + */ + isSameSpeciesEggAvailable(speciesId: number): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)]; + + return ( + starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]) + ); + } + + /** + * Sets a bounce animation if enabled and the Pokemon has an upgrade + * @param icon {@linkcode Phaser.GameObjects.GameObject} to animate + * @param species {@linkcode PokemonSpecies} of the icon used to check for upgrades + * @param startPaused Should this animation be paused after it is added? + */ + setUpgradeAnimation(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, startPaused = false): void { + globalScene.tweens.killTweensOf(icon); + // Skip animations if they are disabled + if (globalScene.candyUpgradeDisplay === 0 || species.speciesId !== species.getRootSpeciesId(false)) { + return; + } + + icon.y = 2; + + const tweenChain: Phaser.Types.Tweens.TweenChainBuilderConfig = { + targets: icon, + loop: -1, + // Make the initial bounce a little randomly delayed + delay: randIntRange(0, 50) * 5, + loopDelay: 1000, + tweens: [ + { + targets: icon, + y: 2 - 5, + duration: fixedInt(125), + ease: "Cubic.easeOut", + yoyo: true, + }, + { + targets: icon, + y: 2 - 3, + duration: fixedInt(150), + ease: "Cubic.easeOut", + yoyo: true, + }, + ], + }; + + const isPassiveAvailable = this.isPassiveAvailable(species.speciesId); + const isValueReductionAvailable = this.isValueReductionAvailable(species.speciesId); + const isSameSpeciesEggAvailable = this.isSameSpeciesEggAvailable(species.speciesId); + + // 'Passives Only' mode + if (globalScene.candyUpgradeNotification === 1) { + if (isPassiveAvailable) { + globalScene.tweens.chain(tweenChain).paused = startPaused; + } + // 'On' mode + } else if (globalScene.candyUpgradeNotification === 2) { + if (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable) { + globalScene.tweens.chain(tweenChain).paused = startPaused; + } + } + } + + /** + * Sets the visibility of a Candy Upgrade Icon + */ + setUpgradeIcon(starter: PokedexMonContainer): void { + const species = starter.species; + const slotVisible = !!species?.speciesId; + + if ( + !species || + globalScene.candyUpgradeNotification === 0 || + species.speciesId !== species.getRootSpeciesId(false) + ) { + starter.candyUpgradeIcon.setVisible(false); + starter.candyUpgradeOverlayIcon.setVisible(false); + return; + } + + const isPassiveAvailable = this.isPassiveAvailable(species.speciesId); + const isValueReductionAvailable = this.isValueReductionAvailable(species.speciesId); + const isSameSpeciesEggAvailable = this.isSameSpeciesEggAvailable(species.speciesId); + + // 'Passive Only' mode + if (globalScene.candyUpgradeNotification === 1) { + starter.candyUpgradeIcon.setVisible(slotVisible && isPassiveAvailable); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); + + // 'On' mode + } else if (globalScene.candyUpgradeNotification === 2) { + starter.candyUpgradeIcon.setVisible( + slotVisible && (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable), + ); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); + } + } + + /** + * Update the display of candy upgrade icons or animations for the given PokedexMonContainer + * @param pokemonContainer the container for the Pokemon to update + */ + updateCandyUpgradeDisplay(pokemonContainer: PokedexMonContainer) { + if (this.isUpgradeIconEnabled()) { + this.setUpgradeIcon(pokemonContainer); + } + if (this.isUpgradeAnimationEnabled()) { + this.setUpgradeAnimation(pokemonContainer.icon, this.lastSpecies, true); + } + } + + processInput(button: Button): boolean { + if (this.blockInput) { + return false; + } + + const maxColumns = 9; + const numberOfStarters = this.filteredPokemonData.length; + const numOfRows = Math.ceil(numberOfStarters / maxColumns); + const onScreenFirstIndex = this.scrollCursor * maxColumns; // this is first index on the screen + // TODO: check if in some places we need to use one or the other + const currentRow = Math.floor((onScreenFirstIndex + this.cursor) / maxColumns); + + const ui = this.getUi(); + + let success = false; + let error = false; + + if (button === Button.SUBMIT) { + error = true; + } else if (button === Button.CANCEL) { + if (this.filterMode && this.filterBar.openDropDown) { + // CANCEL with a filter menu open > close it + this.filterBar.toggleDropDown(this.filterBarCursor); + success = true; + } else if (this.filterMode && !this.filterBar.getFilter(this.filterBarCursor).hasDefaultValues()) { + this.filterBar.resetSelection(this.filterBarCursor); + this.updateStarters(); + success = true; + } else if ( + this.filterTextMode && + !(this.filterText.getValue(this.filterTextCursor) === this.filterText.defaultText) + ) { + this.filterText.resetSelection(this.filterTextCursor); + success = true; + } else if (this.showingTray) { + success = this.closeFormTray(); + } else { + this.tryExit(); + success = true; + } + } else if (button === Button.STATS) { + if (!this.filterMode && !this.showingTray) { + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.filterText.cursorObj.setVisible(false); + this.filterTextMode = false; + this.filterBarCursor = 0; + this.setFilterMode(true); + } else { + error = true; + } + } else if (button === Button.CYCLE_TERA) { + if (!this.filterTextMode && !this.showingTray) { + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.filterBar.cursorObj.setVisible(false); + this.filterMode = false; + this.filterTextCursor = 0; + this.setFilterTextMode(true); + } else { + error = true; + } + } else if (button === Button.CYCLE_SHINY) { + if (!this.showingTray) { + this.showDecorations = !this.showDecorations; + this.updateScroll(); + success = true; + } else { + error = true; + } + } else if (this.filterMode) { + switch (button) { + case Button.LEFT: + if (this.filterBarCursor > 0) { + success = this.setCursor(this.filterBarCursor - 1); + } else { + success = this.setCursor(this.filterBar.numFilters - 1); + } + break; + case Button.RIGHT: + if (this.filterBarCursor < this.filterBar.numFilters - 1) { + success = this.setCursor(this.filterBarCursor + 1); + } else { + success = this.setCursor(0); + } + break; + case Button.UP: + if (this.filterBar.openDropDown) { + success = this.filterBar.decDropDownCursor(); + } else if (numberOfStarters > 0) { + // UP from filter bar to bottom of Pokemon list + this.setFilterMode(false); + this.scrollCursor = Math.max(0, numOfRows - 9); + this.updateScroll(); + const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); + const targetCol = Math.min(8, proportion < 0.5 ? Math.floor(proportion * 8) : Math.ceil(proportion * 8)); + if (numberOfStarters % 9 > targetCol) { + this.setCursor(numberOfStarters - (numberOfStarters % 9) + targetCol - this.scrollCursor * 9); + } else { + this.setCursor( + Math.max(numberOfStarters - (numberOfStarters % 9) + targetCol - 9 - this.scrollCursor * 9, 0), + ); + } + success = true; + } + break; + case Button.DOWN: + if (this.filterBar.openDropDown) { + success = this.filterBar.incDropDownCursor(); + } else if (numberOfStarters > 0) { + // DOWN from filter bar to top of Pokemon list + this.setFilterMode(false); + this.scrollCursor = 0; + this.updateScroll(); + const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); + const targetCol = Math.min(8, proportion < 0.5 ? Math.floor(proportion * 8) : Math.ceil(proportion * 8)); + this.setCursor(Math.min(targetCol, numberOfStarters - 1)); + success = true; + } + break; + case Button.ACTION: + if (!this.filterBar.openDropDown) { + this.filterBar.toggleDropDown(this.filterBarCursor); + } else { + this.filterBar.toggleOptionState(); + } + success = true; + break; + } + } else if (this.filterTextMode) { + switch (button) { + case Button.LEFT: + // LEFT from filter bar, move to right of Pokemon list + if (numberOfStarters > 0) { + this.setFilterTextMode(false); + const rowIndex = this.filterTextCursor; + this.setCursor(rowIndex < numOfRows - 1 ? (rowIndex + 1) * maxColumns - 1 : numberOfStarters - 1); + success = true; + } + break; + case Button.RIGHT: + // RIGHT from filter bar, move to left of Pokemon list + if (numberOfStarters > 0) { + this.setFilterTextMode(false); + const rowIndex = this.filterTextCursor; + this.setCursor(rowIndex < numOfRows ? rowIndex * maxColumns : (numOfRows - 1) * maxColumns); + success = true; + } + break; + case Button.UP: + if (this.filterTextCursor > 0) { + success = this.setCursor(this.filterTextCursor - 1); + } else { + success = this.setCursor(this.filterText.numFilters - 1); + } + break; + case Button.DOWN: + if (this.filterTextCursor < this.filterText.numFilters - 1) { + success = this.setCursor(this.filterTextCursor + 1); + } else { + success = this.setCursor(0); + } + break; + case Button.ACTION: + this.filterText.startSearch(this.filterTextCursor, this.getUi()); + success = true; + break; + } + } else if (this.showingTray) { + if (button === Button.ACTION) { + const formIndex = this.trayForms[this.trayCursor].formIndex; + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, formIndex, { form: formIndex }, this.filteredIndices); + success = true; + } else { + const numberOfForms = this.trayContainers.length; + const numOfRows = Math.ceil(numberOfForms / maxColumns); + const currentTrayRow = Math.floor(this.trayCursor / maxColumns); + switch (button) { + case Button.UP: + if (currentTrayRow > 0) { + success = this.setTrayCursor(this.trayCursor - 9); + } else { + const targetCol = this.trayCursor; + if (numberOfForms % 9 > targetCol) { + success = this.setTrayCursor(numberOfForms - (numberOfForms % 9) + targetCol); + } else { + success = this.setTrayCursor(Math.max(numberOfForms - (numberOfForms % 9) + targetCol - 9, 0)); + } + } + break; + case Button.DOWN: + if (currentTrayRow < numOfRows - 1) { + success = this.setTrayCursor(this.trayCursor + 9); + } else { + success = this.setTrayCursor(this.trayCursor % 9); + } + break; + case Button.LEFT: + if (this.trayCursor % 9 !== 0) { + success = this.setTrayCursor(this.trayCursor - 1); + } else { + success = this.setTrayCursor( + currentTrayRow < numOfRows - 1 ? (currentTrayRow + 1) * maxColumns - 1 : numberOfForms - 1, + ); + } + break; + case Button.RIGHT: + if (this.trayCursor % 9 < (currentTrayRow < numOfRows - 1 ? 8 : (numberOfForms - 1) % 9)) { + success = this.setTrayCursor(this.trayCursor + 1); + } else { + success = this.setTrayCursor(currentTrayRow * 9); + } + break; + case Button.CYCLE_FORM: + success = this.closeFormTray(); + break; + } + } + } else { + if (button === Button.ACTION) { + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, 0, null, this.filteredIndices); + success = true; + } else { + switch (button) { + case Button.UP: + if (currentRow > 0) { + if (this.scrollCursor > 0 && currentRow - this.scrollCursor === 0) { + this.scrollCursor--; + this.updateScroll(); + success = this.setCursor(this.cursor); + } else { + success = this.setCursor(this.cursor - 9); + } + } else { + this.filterBarCursor = this.filterBar.getNearestFilter(this.pokemonContainers[this.cursor]); + this.setFilterMode(true); + success = true; + } + break; + case Button.DOWN: + if (currentRow < numOfRows - 1 && this.cursor + 9 < this.filteredPokemonData.length) { + // not last row + if (currentRow - this.scrollCursor === 8) { + // last row of visible pokemon + this.scrollCursor++; + this.updateScroll(); + success = this.setCursor(this.cursor); + } else { + success = this.setCursor(this.cursor + 9); + } + } else if (numOfRows > 1) { + // DOWN from last row of pokemon > Wrap around to first row + this.scrollCursor = 0; + this.updateScroll(); + success = this.setCursor(this.cursor % 9); + } else { + // DOWN from single row of pokemon > Go to filters + this.filterBarCursor = this.filterBar.getNearestFilter(this.pokemonContainers[this.cursor]); + this.setFilterMode(true); + success = true; + } + break; + case Button.LEFT: + if (this.cursor % 9 !== 0) { + success = this.setCursor(this.cursor - 1); + } else { + // LEFT from filtered pokemon, on the left edge + this.filterTextCursor = this.filterText.getNearestFilter(this.pokemonContainers[this.cursor]); + this.setFilterTextMode(true); + success = true; + } + break; + case Button.RIGHT: + // is not right edge + if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { + success = this.setCursor(this.cursor + 1); + } else { + // RIGHT from filtered pokemon, on the right edge + this.filterTextCursor = this.filterText.getNearestFilter(this.pokemonContainers[this.cursor]); + this.setFilterTextMode(true); + success = true; + } + break; + case Button.CYCLE_FORM: { + const species = this.pokemonContainers[this.cursor].species; + if (this.canShowFormTray) { + success = this.openFormTray(species); + } + break; + } + } + } + } + + if (success) { + ui.playSelect(); + } else if (error) { + ui.playError(); + } + + return success || error; + } + + updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO + let iconPath; + // touch controls cannot be rebound as is, and are just emulating a keyboard event. + // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls + if (gamepadType === "touch") { + gamepadType = "keyboard"; + switch (iconSetting) { + case SettingKeyboard.Button_Cycle_Shiny: + iconPath = "R.png"; + break; + case SettingKeyboard.Button_Cycle_Form: + iconPath = "F.png"; + break; + case SettingKeyboard.Button_Stats: + iconPath = "C.png"; + break; + default: + break; + } + } else { + iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); + } + iconElement.setTexture(gamepadType, iconPath); + iconElement.setVisible(true); + controlLabel.setVisible(true); + } + + updateFilterButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO + let iconPath; + // touch controls cannot be rebound as is, and are just emulating a keyboard event. + // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls + if (gamepadType === "touch") { + gamepadType = "keyboard"; + iconPath = "C.png"; + } else { + iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); + } + iconElement.setTexture(gamepadType, iconPath); + iconElement.setVisible(true); + controlLabel.setVisible(true); + } + + getSanitizedProps(props: DexAttrProps): DexAttrProps { + const sanitizedProps: DexAttrProps = { + shiny: false, + female: props.female, + variant: 0, + formIndex: props.formIndex, + }; + return sanitizedProps; + } + + // Returns true if one of the forms has the requested move + hasFormLevelMove(form: PokemonForm, selectedMove: string): boolean { + if ( + !pokemonFormLevelMoves.hasOwnProperty(form.speciesId) || + !pokemonFormLevelMoves[form.speciesId].hasOwnProperty(form.formIndex) + ) { + return false; + } + const levelMoves = pokemonFormLevelMoves[form.speciesId][form.formIndex].map(m => allMoves[m[1]].name); + return levelMoves.includes(selectedMove); + } + + updateStarters = () => { + this.scrollCursor = 0; + this.filteredPokemonData = []; + + this.pokerusCursorObjs.forEach(cursor => cursor.setVisible(false)); + + this.filterBar.updateFilterLabels(); + this.filterText.updateFilterLabels(); + + this.filteredPokemonData = []; + + this.allSpecies.forEach(species => { + const starterId = this.getStarterSpeciesId(species.speciesId); + + const currentDexAttr = this.getCurrentDexProps(species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, currentDexAttr)); + + const data: ContainerData = { + species: species, + cost: globalScene.gameData.getSpeciesStarterValue(starterId), + props: props, + }; + + // First, ensure you have the caught attributes for the species else default to bigint 0 + // TODO: This might be removed depending on how accessible we want the pokedex function to be + const caughtAttr = + (globalScene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0)) & + (globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)]?.caughtAttr || BigInt(0)) & + species.getFullUnlocksData(); + const starterData = globalScene.gameData.starterData[starterId]; + const isStarterProgressable = speciesEggMoves.hasOwnProperty(starterId); + + // Name filter + const selectedName = this.filterText.getValue(FilterTextRow.NAME); + const fitsName = species.name === selectedName || selectedName === this.filterText.defaultText; + + // Move filter + // TODO: There can be fringe cases where the two moves belong to mutually exclusive forms, these must be handled separately (Pikachu); + // On the other hand, in some cases it is possible to switch between different forms and combine (Deoxys) + const levelMoves = pokemonSpeciesLevelMoves[species.speciesId].map(m => allMoves[m[1]].name); + // This always gets egg moves from the starter + const eggMoves = speciesEggMoves[starterId]?.map(m => allMoves[m].name) ?? []; + const tmMoves = speciesTmMoves[starterId]?.map(m => allMoves[Array.isArray(m) ? m[1] : m].name) ?? []; + const selectedMove1 = this.filterText.getValue(FilterTextRow.MOVE_1); + const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2); + + const fitsFormMove1 = species.forms.some(form => this.hasFormLevelMove(form, selectedMove1)); + const fitsFormMove2 = species.forms.some(form => this.hasFormLevelMove(form, selectedMove2)); + const fitsLevelMove1 = levelMoves.includes(selectedMove1) || fitsFormMove1; + const fitsEggMove1 = eggMoves.includes(selectedMove1); + const fitsTmMove1 = tmMoves.includes(selectedMove1); + const fitsLevelMove2 = levelMoves.includes(selectedMove2) || fitsFormMove2; + const fitsEggMove2 = eggMoves.includes(selectedMove2); + const fitsTmMove2 = tmMoves.includes(selectedMove2); + const fitsMove1 = fitsLevelMove1 || fitsEggMove1 || fitsTmMove1 || selectedMove1 === this.filterText.defaultText; + const fitsMove2 = fitsLevelMove2 || fitsEggMove2 || fitsTmMove2 || selectedMove2 === this.filterText.defaultText; + const fitsMoves = fitsMove1 && fitsMove2; + + if (fitsEggMove1 && !fitsLevelMove1) { + const em1 = eggMoves.findIndex(name => name === selectedMove1); + if ((starterData.eggMoves & (1 << em1)) === 0) { + data.eggMove1 = false; + } else { + data.eggMove1 = true; + } + } else if (fitsTmMove1 && !fitsLevelMove1) { + data.tmMove1 = true; + } + if (fitsEggMove2 && !fitsLevelMove2) { + const em2 = eggMoves.findIndex(name => name === selectedMove2); + if ((starterData.eggMoves & (1 << em2)) === 0) { + data.eggMove2 = false; + } else { + data.eggMove2 = true; + } + } else if (fitsTmMove2 && !fitsLevelMove2) { + data.tmMove2 = true; + } + + // Ability filter + const abilities = [species.ability1, species.ability2, species.abilityHidden].map(a => allAbilities[a].name); + const passives = starterPassiveAbilities[starterId] ?? ({} as PassiveAbilities); + + const selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1); + const fitsFormAbility1 = species.forms.some(form => + [form.ability1, form.ability2, form.abilityHidden].map(a => allAbilities[a].name).includes(selectedAbility1), + ); + const fitsAbility1 = + abilities.includes(selectedAbility1) || fitsFormAbility1 || selectedAbility1 === this.filterText.defaultText; + const fitsPassive1 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility1); + + const selectedAbility2 = this.filterText.getValue(FilterTextRow.ABILITY_2); + const fitsFormAbility2 = species.forms.some(form => + [form.ability1, form.ability2, form.abilityHidden].map(a => allAbilities[a].name).includes(selectedAbility2), + ); + const fitsAbility2 = + abilities.includes(selectedAbility2) || fitsFormAbility2 || selectedAbility2 === this.filterText.defaultText; + const fitsPassive2 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility2); + + // If both fields have been set to the same ability, show both ability and passive + const fitsAbilities = + (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) || + (fitsAbility2 && (fitsPassive1 || selectedAbility1 === this.filterText.defaultText)); + + if (fitsPassive1 || fitsPassive2) { + if (fitsPassive1) { + if (starterData.passiveAttr > 0) { + data.passive1 = true; + } else { + data.passive1 = false; + } + } else { + if (starterData.passiveAttr > 0) { + data.passive2 = true; + } else { + data.passive2 = false; + } + } + } + + // Gen filter + const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(species.generation); + + // Type filter + const fitsType = this.filterBar + .getVals(DropDownColumn.TYPES) + .some(type => species.isOfType((type as number) - 1)); + + // Biome filter + const indexToBiome = new Map( + Object.values(Biome) + .map((value, index) => (typeof value === "string" ? [index, value] : undefined)) + .filter((entry): entry is [number, string] => entry !== undefined), + ); + indexToBiome.set(35, "Uncatchable"); + + // We get biomes for both the mon and its starters to ensure that evolutions get the correct filters. + // TODO: We might also need to do it the other way around. + const biomes = catchableSpecies[species.speciesId].concat(catchableSpecies[starterId]).map(b => Biome[b.biome]); + if (biomes.length === 0) { + biomes.push("Uncatchable"); + } + const showNoBiome = !!(biomes.length === 0 && this.filterBar.getVals(DropDownColumn.BIOME).length === 36); + const fitsBiome = + this.filterBar.getVals(DropDownColumn.BIOME).some(item => biomes.includes(indexToBiome.get(item) ?? "")) || + showNoBiome; + + // Caught / Shiny filter + const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); + const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); + const isVariant1Caught = isShinyCaught && !!(caughtAttr & DexAttr.DEFAULT_VARIANT); + const isVariant2Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_2); + const isVariant3Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_3); + const isUncaught = !isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught; + const fitsCaught = this.filterBar.getVals(DropDownColumn.CAUGHT).some(caught => { + if (caught === "SHINY3") { + return isVariant3Caught; + } + if (caught === "SHINY2") { + return isVariant2Caught && !isVariant3Caught; + } + if (caught === "SHINY") { + return isVariant1Caught && !isVariant2Caught && !isVariant3Caught; + } + if (caught === "NORMAL") { + return isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught; + } + if (caught === "UNCAUGHT") { + return isUncaught; + } + }); + + // Passive Filter + const isPassiveUnlocked = starterData.passiveAttr > 0; + const isPassiveUnlockable = this.isPassiveAvailable(species.speciesId) && !isPassiveUnlocked; + const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { + return isPassiveUnlocked; + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { + return isStarterProgressable && !isPassiveUnlocked; + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) { + return isPassiveUnlockable; + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { + return true; + } + }); + + // Cost Reduction Filter + const isCostReducedByOne = starterData.valueReduction === 1; + const isCostReducedByTwo = starterData.valueReduction === 2; + const isCostReductionUnlockable = this.isValueReductionAvailable(species.speciesId); + const fitsCostReduction = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ON) { + return isCostReducedByOne || isCostReducedByTwo; + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ONE) { + return isCostReducedByOne; + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.TWO) { + return isCostReducedByTwo; + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { + return isStarterProgressable && !(isCostReducedByOne || isCostReducedByTwo); + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) { + return isCostReductionUnlockable; + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { + return true; + } + }); + + // Starter Filter + const isStarter = this.getStarterSpeciesId(species.speciesId) === species.speciesId; + const fitsStarter = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "STARTER" && misc.state === DropDownState.ON) { + return isStarter; + } + if (misc.val === "STARTER" && misc.state === DropDownState.EXCLUDE) { + return !isStarter; + } + if (misc.val === "STARTER" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Favorite Filter + const isFavorite = this.starterPreferences[species.speciesId]?.favorite ?? false; + const fitsFavorite = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "FAVORITE" && misc.state === DropDownState.ON) { + return isFavorite; + } + if (misc.val === "FAVORITE" && misc.state === DropDownState.EXCLUDE) { + return !isFavorite; + } + if (misc.val === "FAVORITE" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Ribbon / Classic Win Filter + const hasWon = starterData.classicWinCount > 0; + const hasNotWon = starterData.classicWinCount === 0; + const isUndefined = starterData.classicWinCount === undefined; + const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "WIN" && misc.state === DropDownState.ON) { + return hasWon; + } + if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { + return hasNotWon || isUndefined; + } + if (misc.val === "WIN" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // HA Filter + const speciesHasHiddenAbility = + species.abilityHidden !== species.ability1 && species.abilityHidden !== Abilities.NONE; + const hasHA = starterData.abilityAttr & AbilityAttr.ABILITY_HIDDEN; + const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) { + return hasHA; + } + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { + return speciesHasHiddenAbility && !hasHA; + } + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Egg Purchasable Filter + const isEggPurchasable = this.isSameSpeciesEggAvailable(species.speciesId); + const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "EGG" && misc.state === DropDownState.ON) { + return isEggPurchasable; + } + if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) { + return isStarterProgressable && !isEggPurchasable; + } + if (misc.val === "EGG" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Pokerus Filter + const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "POKERUS" && misc.state === DropDownState.ON) { + return this.pokerusSpecies.includes(species); + } + if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { + return !this.pokerusSpecies.includes(species); + } + if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { + return true; + } + }); + + if ( + fitsName && + fitsAbilities && + fitsMoves && + fitsGen && + fitsBiome && + fitsType && + fitsCaught && + fitsPassive && + fitsCostReduction && + fitsStarter && + fitsFavorite && + fitsWin && + fitsHA && + fitsEgg && + fitsPokerus + ) { + this.filteredPokemonData.push(data); + } + }); + + this.starterSelectScrollBar.setTotalRows(Math.max(Math.ceil(this.filteredPokemonData.length / 9), 1)); + this.starterSelectScrollBar.setScrollCursor(0); + + // sort + const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; + this.filteredPokemonData.sort((a, b) => { + switch (sort.val) { + case SortCriteria.NUMBER: + return (a.species.speciesId - b.species.speciesId) * -sort.dir; + case SortCriteria.COST: + return (a.cost - b.cost) * -sort.dir; + case SortCriteria.CANDY: { + const candyCountA = + globalScene.gameData.starterData[this.getStarterSpeciesId(a.species.speciesId)].candyCount; + const candyCountB = + globalScene.gameData.starterData[this.getStarterSpeciesId(b.species.speciesId)].candyCount; + return (candyCountA - candyCountB) * -sort.dir; + } + case SortCriteria.IV: { + const avgIVsA = + globalScene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / + globalScene.gameData.dexData[a.species.speciesId].ivs.length; + const avgIVsB = + globalScene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / + globalScene.gameData.dexData[b.species.speciesId].ivs.length; + return (avgIVsA - avgIVsB) * -sort.dir; + } + case SortCriteria.NAME: + return a.species.name.localeCompare(b.species.name) * -sort.dir; + case SortCriteria.CAUGHT: + return ( + (globalScene.gameData.dexData[a.species.speciesId].caughtCount - + globalScene.gameData.dexData[b.species.speciesId].caughtCount) * + -sort.dir + ); + case SortCriteria.HATCHED: + return ( + (globalScene.gameData.dexData[this.getStarterSpeciesId(a.species.speciesId)].hatchedCount - + globalScene.gameData.dexData[this.getStarterSpeciesId(b.species.speciesId)].hatchedCount) * + -sort.dir + ); + default: + break; + } + return 0; + }); + + this.filteredIndices = this.filteredPokemonData.map(c => c.species.speciesId); + + this.updateScroll(); + }; + + updateScroll = () => { + const maxColumns = 9; + const onScreenFirstIndex = this.scrollCursor * maxColumns; + + this.starterSelectScrollBar.setScrollCursor(this.scrollCursor); + + this.pokerusCursorObjs.forEach(cursorObj => cursorObj.setVisible(false)); + + let pokerusCursorIndex = 0; + this.pokemonContainers.forEach((container, i) => { + const i_data = i + onScreenFirstIndex; + + if (i_data >= this.filteredPokemonData.length) { + container.setVisible(false); + } else { + container.setVisible(true); + + const data = this.filteredPokemonData[i_data]; + const props = data.props; + + container.setSpecies(data.species, props); + + const starterSprite = container.icon as Phaser.GameObjects.Sprite; + starterSprite.setTexture( + data.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), + container.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant), + ); + container.checkIconId(props.female, props.formIndex, props.shiny, props.variant); + + const speciesId = data.species.speciesId; + const dexEntry = globalScene.gameData.dexData[speciesId]; + const caughtAttr = + dexEntry.caughtAttr & + globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & + data.species.getFullUnlocksData(); + + if (caughtAttr & data.species.getFullUnlocksData() || globalScene.dexForDevs) { + container.icon.clearTint(); + } else if (dexEntry.seenAttr) { + container.icon.setTint(0x808080); + } else { + container.icon.setTint(0); + } + + if (data.eggMove1) { + container.eggMove1Icon.setVisible(true); + } else { + container.eggMove1Icon.setVisible(false); + } + if (data.eggMove2) { + container.eggMove2Icon.setVisible(true); + } else { + container.eggMove2Icon.setVisible(false); + } + if (data.tmMove1) { + container.tmMove1Icon.setVisible(true); + } else { + container.tmMove1Icon.setVisible(false); + } + if (data.tmMove2) { + container.tmMove2Icon.setVisible(true); + } else { + container.tmMove2Icon.setVisible(false); + } + if (data.passive1) { + container.passive1Icon.setVisible(true); + } else { + container.passive1Icon.setVisible(false); + } + if (data.passive2) { + container.passive2Icon.setVisible(true); + } else { + container.passive2Icon.setVisible(false); + } + + if (this.showDecorations) { + if (this.pokerusSpecies.includes(data.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(container.x - 1, container.y + 1); + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); + pokerusCursorIndex++; + } + + this.updateStarterValueLabel(container); + + container.label.setVisible(true); + const speciesVariants = + speciesId && caughtAttr & DexAttr.SHINY + ? [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter(v => !!(caughtAttr & v)) + : []; + for (let v = 0; v < 3; v++) { + const hasVariant = speciesVariants.length > v; + container.shinyIcons[v].setVisible(hasVariant); + if (hasVariant) { + container.shinyIcons[v].setTint( + getVariantTint( + speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2, + ), + ); + } + } + + container.starterPassiveBgs.setVisible( + !!globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].passiveAttr, + ); + container.hiddenAbilityIcon.setVisible( + !!caughtAttr && !!(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].abilityAttr & 4), + ); + container.classicWinIcon.setVisible( + globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].classicWinCount > 0, + ); + container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); + + // 'Candy Icon' mode + if (globalScene.candyUpgradeDisplay === 0) { + if (!starterColors[this.getStarterSpeciesId(speciesId)]) { + // Default to white if no colors are found + starterColors[this.getStarterSpeciesId(speciesId)] = ["ffffff", "ffffff"]; + } + + // Set the candy colors + container.candyUpgradeIcon.setTint( + argbFromRgba(rgbHexToRgba(starterColors[this.getStarterSpeciesId(speciesId)][0])), + ); + container.candyUpgradeOverlayIcon.setTint( + argbFromRgba(rgbHexToRgba(starterColors[this.getStarterSpeciesId(speciesId)][1])), + ); + } else if (globalScene.candyUpgradeDisplay === 1) { + container.candyUpgradeIcon.setVisible(false); + container.candyUpgradeOverlayIcon.setVisible(false); + } + } else { + container.label.setVisible(false); + for (let v = 0; v < 3; v++) { + container.shinyIcons[v].setVisible(false); + } + container.starterPassiveBgs.setVisible(false); + container.hiddenAbilityIcon.setVisible(false); + container.classicWinIcon.setVisible(false); + container.favoriteIcon.setVisible(false); + + container.candyUpgradeIcon.setVisible(false); + container.candyUpgradeOverlayIcon.setVisible(false); + } + } + }); + }; + + setCursor(cursor: number): boolean { + let changed = false; + this.oldCursor = this.cursor; + + if (this.filterMode) { + changed = this.filterBarCursor !== cursor; + this.filterBarCursor = cursor; + this.filterBar.setCursor(cursor); + } else if (this.filterTextMode) { + changed = this.filterTextCursor !== cursor; + this.filterTextCursor = cursor; + this.filterText.setCursor(cursor); + } else { + cursor = Math.max(Math.min(this.pokemonContainers.length - 1, cursor), 0); + changed = super.setCursor(cursor); + + const pos = calcStarterPosition(cursor); + this.cursorObj.setPosition(pos.x - 1, pos.y + 1); + + const species = this.pokemonContainers[cursor]?.species; + + if (species) { + this.setSpecies(species); + return true; + } + } + + return changed; + } + + setFilterMode(filterMode: boolean): boolean { + this.cursorObj.setVisible(!filterMode); + this.filterBar.cursorObj.setVisible(filterMode); + this.pokemonSprite.setVisible(false); + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + + if (filterMode !== this.filterMode) { + this.filterMode = filterMode; + this.setCursor(filterMode ? this.filterBarCursor : this.cursor); + if (filterMode) { + this.setSpecies(null); + } + return true; + } + return false; + } + + setFilterTextMode(filterTextMode: boolean): boolean { + this.cursorObj.setVisible(!filterTextMode); + this.filterText.cursorObj.setVisible(filterTextMode); + this.pokemonSprite.setVisible(false); + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + + if (filterTextMode !== this.filterTextMode) { + this.filterTextMode = filterTextMode; + this.setCursor(filterTextMode ? this.filterTextCursor : this.cursor); + if (filterTextMode) { + this.setSpecies(null); + } + return true; + } + return false; + } + + openFormTray(species: PokemonSpecies): boolean { + this.trayForms = species.forms.filter(f => !f.isUnobtainable); + + this.trayNumIcons = this.trayForms.length; + this.trayRows = Math.floor(this.trayNumIcons / 9) + (this.trayNumIcons % 9 === 0 ? 0 : 1); + this.trayColumns = Math.min(this.trayNumIcons, 9); + + const maxColumns = 9; + const boxCursor = this.cursor; + const boxCursorY = Math.floor(boxCursor / maxColumns); + const boxCursorX = boxCursor - boxCursorY * 9; + const spaceBelow = 9 - 1 - boxCursorY; + const spaceRight = 9 - boxCursorX; + const boxPos = calcStarterPosition(this.cursor); + const goUp = this.trayRows <= spaceBelow - 1 ? 0 : 1; + const goLeft = this.trayColumns <= spaceRight ? 0 : 1; + + this.trayBg.setSize(13 + this.trayColumns * 17, 8 + this.trayRows * 18); + this.formTrayContainer.setX((goLeft ? boxPos.x - 18 * (this.trayColumns - spaceRight) : boxPos.x) - 3); + this.formTrayContainer.setY(goUp ? boxPos.y - this.trayBg.height : boxPos.y + 17); + + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const dexAttr = this.getCurrentDexProps(species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr)); + + this.trayContainers = []; + this.trayForms.map((f, index) => { + const isFormCaught = dexEntry + ? (dexEntry.caughtAttr & species.getFullUnlocksData() & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n + : false; + const isFormSeen = dexEntry + ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n + : false; + const formContainer = new PokedexMonContainer(species, { + formIndex: f.formIndex, + female: props.female, + shiny: props.shiny, + variant: props.variant, + }); + this.iconAnimHandler.addOrUpdate(formContainer.icon, PokemonIconAnimMode.NONE); + // Setting tint, for all saves some caught forms may only show up as seen + if (isFormCaught || globalScene.dexForDevs) { + formContainer.icon.clearTint(); + } else if (isFormSeen) { + formContainer.icon.setTint(0x808080); + } else { + formContainer.icon.setTint(0); + } + formContainer.setPosition(5 + (index % 9) * 18, 4 + Math.floor(index / 9) * 17); + this.formTrayContainer.add(formContainer); + this.trayContainers.push(formContainer); + }); + + this.showingTray = true; + + this.setTrayCursor(0); + + this.formTrayContainer.setVisible(true); + + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + + return true; + } + + closeFormTray(): boolean { + this.trayContainers.forEach(obj => { + this.formTrayContainer.remove(obj, true); // Removes from container and destroys it + }); + + this.trayContainers = []; + this.formTrayContainer.setVisible(false); + this.showingTray = false; + + this.setSpeciesDetails(this.lastSpecies); + return true; + } + + setTrayCursor(cursor: number): boolean { + if (!this.showingTray) { + return false; + } + + cursor = Phaser.Math.Clamp(this.trayContainers.length - 1, cursor, 0); + const changed = this.trayCursor !== cursor; + if (changed) { + this.trayCursor = cursor; + } + + this.trayCursorObj.setPosition(5 + (cursor % 9) * 18, 4 + Math.floor(cursor / 9) * 17); + + const species = this.lastSpecies; + const formIndex = this.trayForms[cursor].formIndex; + + this.setSpeciesDetails(species, { formIndex: formIndex }); + + return changed; + } + + getFriendship(speciesId: number) { + let currentFriendship = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].friendship; + if (!currentFriendship || currentFriendship === undefined) { + currentFriendship = 0; + } + + const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[speciesId]); + + return { currentFriendship, friendshipCap }; + } + + startIconAnimation(cursor: number) { + const container = this.pokemonContainers[cursor]; + const icon = container.icon; + if (this.isUpgradeAnimationEnabled()) { + globalScene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); + // Reset the position of the icon + icon.x = -2; + icon.y = 2; + } + // Initiates the small up and down idle animation + this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); + } + + stopIconAnimation(cursor: number) { + const container = this.pokemonContainers[cursor]; + if (container) { + const lastSpeciesIcon = container.icon; + const dexAttr = this.getCurrentDexProps(container.species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(container.species, dexAttr)); + this.checkIconId(lastSpeciesIcon, container.species, props.female, props.formIndex, props.shiny, props.variant); + this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE); + // Resume the animation for the previously selected species + globalScene.tweens.getTweensOf(lastSpeciesIcon).forEach(tween => tween.resume()); + } + } + + setSpecies(species: PokemonSpecies | null) { + this.speciesStarterDexEntry = species ? globalScene.gameData.dexData[species.speciesId] : null; + + if (!species && globalScene.ui.getTooltip().visible) { + globalScene.ui.hideTooltip(); + } + + if (this.lastSpecies) { + this.stopIconAnimation(this.oldCursor); + } + + if (species) { + this.lastSpecies = species; + } + + if ( + species && + (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs) + ) { + this.pokemonNumberText.setText(i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4)); + + this.pokemonNameText.setText(species.name); + + if (this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs) { + this.startIconAnimation(this.cursor); + + const speciesForm = getPokemonSpeciesForm(species.speciesId, 0); + this.setTypeIcons(speciesForm.type1, speciesForm.type2); + + this.setSpeciesDetails(species, {}); + + this.pokemonSprite.clearTint(); + + this.type1Icon.clearTint(); + this.type2Icon.clearTint(); + } else { + this.type1Icon.setVisible(true); + this.type2Icon.setVisible(true); + + this.setSpeciesDetails(species); + this.pokemonSprite.setTint(0x808080); + } + } else { + this.pokemonNumberText.setText( + species ? i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4) : "", + ); + this.pokemonNameText.setText(species ? "???" : ""); + this.pokemonFormText.setText(""); + this.type1Icon.setVisible(false); + this.type2Icon.setVisible(false); + if (species) { + this.pokemonSprite.setTint(0x000000); + this.setSpeciesDetails(species, {}); + } + } + } + + setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}): void { + let { shiny, formIndex, female, variant } = options; + + // We will only update the sprite if there is a change to form, shiny/variant + // or gender for species with gender sprite differences + const shouldUpdateSprite = true; + + if (species?.forms?.find(f => f.formKey === "female")) { + if (female !== undefined) { + formIndex = female ? 1 : 0; + } else if (formIndex !== undefined) { + female = formIndex === 1; + } + } + + this.pokemonSprite.setVisible(false); + + if (this.assetLoadCancelled) { + this.assetLoadCancelled.value = true; + this.assetLoadCancelled = null; + } + + if (species) { + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const caughtAttr = + dexEntry.caughtAttr & + globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)].caughtAttr & + species.getFullUnlocksData(); + + if (caughtAttr) { + const props = this.getSanitizedProps( + globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), + ); + + if (shiny === undefined) { + shiny = props.shiny; + } + if (formIndex === undefined) { + formIndex = props.formIndex; + } + if (female === undefined) { + female = props.female; + } + if (variant === undefined) { + variant = props.variant; + } + } + + const isFormCaught = dexEntry ? (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + + const assetLoadCancelled = new BooleanHolder(false); + this.assetLoadCancelled = assetLoadCancelled; + + if (shouldUpdateSprite) { + species.loadAssets(female!, formIndex, shiny, variant, true).then(() => { + // TODO: is this bang correct? + if (assetLoadCancelled.value) { + return; + } + this.assetLoadCancelled = null; + this.speciesLoaded.set(species.speciesId, true); + this.pokemonSprite.play(species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? + this.pokemonSprite.setPipelineData("shiny", shiny); + this.pokemonSprite.setPipelineData("variant", variant); + this.pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? + this.pokemonSprite.setVisible(true); + }); + } else { + this.pokemonSprite.setVisible(!(this.filterMode || this.filterTextMode)); + } + + if (isFormCaught || globalScene.dexForDevs) { + this.pokemonSprite.clearTint(); + } else if (isFormSeen) { + this.pokemonSprite.setTint(0x808080); + } else { + this.pokemonSprite.setTint(0); + } + + if (isFormCaught || isFormSeen || globalScene.dexForDevs) { + // TODO: change this once forms are refactored + if (normalForm.includes(species.speciesId) && !formIndex) { + this.pokemonFormText.setText(""); + } else { + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex, false)); + } + } else { + this.pokemonFormText.setText(""); + } + + if (isFormCaught || isFormSeen || globalScene.dexForDevs) { + const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex ?? 0); // TODO: always selecting the first form + this.setTypeIcons(speciesForm.type1, speciesForm.type2); + } else { + this.setTypeIcons(null, null); + } + + if (species?.forms?.filter(f => !f.isUnobtainable).length > 1) { + if (!this.showingTray) { + this.showFormTrayIconElement.setVisible(true); + this.showFormTrayLabel.setVisible(true); + } + this.canShowFormTray = true; + } else { + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + this.canShowFormTray = false; + } + } else { + this.setTypeIcons(null, null); + } + } + + setTypeIcons(type1: PokemonType | null, type2: PokemonType | null): void { + if (type1 !== null) { + this.type1Icon.setVisible(true); + this.type1Icon.setFrame(PokemonType[type1].toLowerCase()); + } else { + this.type1Icon.setVisible(false); + } + if (type2 !== null) { + this.type2Icon.setVisible(true); + this.type2Icon.setFrame(PokemonType[type2].toLowerCase()); + } else { + this.type2Icon.setVisible(false); + } + } + + updateStarterValueLabel(starter: PokedexMonContainer): void { + const speciesId = starter.species.speciesId; + const baseStarterValue = speciesStarterCosts[speciesId]; + const starterValue = globalScene.gameData.getSpeciesStarterValue(this.getStarterSpeciesId(speciesId)); + starter.cost = starterValue; + let valueStr = starterValue.toString(); + if (valueStr.startsWith("0.")) { + valueStr = valueStr.slice(1); + } + starter.label.setText(valueStr); + let textStyle: TextStyle; + switch (baseStarterValue - starterValue) { + case 0: + textStyle = TextStyle.WINDOW; + break; + case 1: + case 0.5: + textStyle = TextStyle.SUMMARY_BLUE; + break; + default: + textStyle = TextStyle.SUMMARY_GOLD; + break; + } + if (baseStarterValue - starterValue > 0) { + starter.label.setColor(this.getTextColor(textStyle)); + starter.label.setShadowColor(this.getTextColor(textStyle, true)); + } + } + + tryExit(): boolean { + this.blockInput = true; + const ui = this.getUi(); + + const cancel = () => { + ui.setMode(Mode.POKEDEX, "refresh"); + this.clearText(); + this.blockInput = false; + }; + ui.showText(i18next.t("pokedexUiHandler:confirmExit"), null, () => { + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + ui.setMode(Mode.POKEDEX, "refresh"); + this.clearText(); + this.clear(); + ui.revertMode(); + }, + cancel, + null, + null, + 19, + ); + }); + + return true; + } + + /** + * Creates a temporary dex attr props that will be used to + * display the correct shiny, variant, and form based on the StarterPreferences + * + * @param speciesId the id of the species to get props for + * @returns the dex props + */ + getCurrentDexProps(speciesId: number): bigint { + let props = 0n; + const species = allSpecies.find(sp => sp.speciesId === speciesId); + const caughtAttr = + globalScene.gameData.dexData[speciesId].caughtAttr & + globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & + (species?.getFullUnlocksData() ?? 0n); + + /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props + * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props + * If neither of these pass, we add DexAttr.MALE to our temp props + */ + if ( + this.starterPreferences[speciesId]?.female || + ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n) + ) { + props += DexAttr.FEMALE; + } else { + props += DexAttr.MALE; + } + /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences. + * If they're not there, it enables shiny state by default if any shiny was caught + */ + if ( + this.starterPreferences[speciesId]?.shiny || + ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false) + ) { + props += DexAttr.SHINY; + if (this.starterPreferences[speciesId]?.variant !== undefined) { + props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.variant)) * DexAttr.DEFAULT_VARIANT; + } else { + /* This calculates the correct variant if there's no starter preferences for it. + * This gets the highest tier variant that you've caught and adds it to the temp props + */ + if ((caughtAttr & DexAttr.VARIANT_3) > 0) { + props += DexAttr.VARIANT_3; + } else if ((caughtAttr & DexAttr.VARIANT_2) > 0) { + props += DexAttr.VARIANT_2; + } else { + props += DexAttr.DEFAULT_VARIANT; + } + } + } else { + props += DexAttr.NON_SHINY; + props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant + } + if (this.starterPreferences[speciesId]?.form) { + // this checks for the form of the pokemon + props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.form)) * DexAttr.DEFAULT_FORM; + } else { + // Get the first unlocked form + props += globalScene.gameData.getFormAttr(globalScene.gameData.getFormIndex(caughtAttr)); + } + + return props; + } + + override destroy(): void { + this.pokemonContainers = []; + this.filteredPokemonData = []; + } + + clearText() { + this.starterSelectMessageBoxContainer.setVisible(false); + super.clearText(); + } + + clear(): void { + super.clear(); + + this.cursor = -1; + this.oldCursor = -1; + globalScene.ui.hideTooltip(); + + this.starterSelectContainer.setVisible(false); + this.blockInput = false; + } + + checkIconId( + icon: Phaser.GameObjects.Sprite, + species: PokemonSpecies, + female: boolean, + formIndex: number, + shiny: boolean, + variant: number, + ) { + if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { + console.log( + `${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`, + ); + icon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); + icon.setFrame(species.getIconId(female, formIndex, false, variant)); + } + } +} diff --git a/src/ui/pokemon-hatch-info-container.ts b/src/ui/pokemon-hatch-info-container.ts index 146d70522fd..99940b92351 100644 --- a/src/ui/pokemon-hatch-info-container.ts +++ b/src/ui/pokemon-hatch-info-container.ts @@ -1,17 +1,17 @@ import PokemonInfoContainer from "#app/ui/pokemon-info-container"; -import BattleScene from "#app/battle-scene"; import { Gender } from "#app/data/gender"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import * as Utils from "#app/utils"; import { TextStyle, addTextObject } from "#app/ui/text"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Species } from "#enums/species"; import { getEggTierForSpecies } from "#app/data/egg"; import { starterColors } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { argbFromRgba } from "@material/material-color-utilities"; -import { EggHatchData } from "#app/data/egg-hatch-data"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { EggHatchData } from "#app/data/egg-hatch-data"; +import type { PlayerPokemon } from "#app/field/pokemon"; import { getPokemonSpeciesForm } from "#app/data/pokemon-species"; /** @@ -26,52 +26,56 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { private pokemonEggMoveContainers: Phaser.GameObjects.Container[]; private pokemonEggMoveBgs: Phaser.GameObjects.NineSlice[]; private pokemonEggMoveLabels: Phaser.GameObjects.Text[]; - private pokemonHatchedIcon : Phaser.GameObjects.Sprite; + private pokemonHatchedIcon: Phaser.GameObjects.Sprite; private pokemonListContainer: Phaser.GameObjects.Container; private pokemonCandyIcon: Phaser.GameObjects.Sprite; private pokemonCandyOverlayIcon: Phaser.GameObjects.Sprite; private pokemonCandyCountText: Phaser.GameObjects.Text; - constructor(scene: BattleScene, listContainer : Phaser.GameObjects.Container, x: number = 115, y: number = 9,) { - super(scene, x, y); + constructor(listContainer: Phaser.GameObjects.Container, x = 115, y = 9) { + super(x, y); this.pokemonListContainer = listContainer; - } setup(): void { super.setup(); super.changeToEggSummaryLayout(); - this.currentPokemonSprite = this.scene.add.sprite(54, 80, "pkmn__sub"); + this.currentPokemonSprite = globalScene.add.sprite(54, 80, "pkmn__sub"); this.currentPokemonSprite.setScale(0.8); - this.currentPokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + this.currentPokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); this.pokemonListContainer.add(this.currentPokemonSprite); // setup name and number - this.pokemonNumberText = addTextObject(this.scene, 80, 107.5, "0000", TextStyle.SUMMARY, { fontSize: 74 }); + this.pokemonNumberText = addTextObject(80, 107.5, "0000", TextStyle.SUMMARY, { fontSize: 74 }); this.pokemonNumberText.setOrigin(0, 0); this.pokemonListContainer.add(this.pokemonNumberText); - this.pokemonNameText = addTextObject(this.scene, 7, 107.5, "", TextStyle.SUMMARY, { fontSize: 74 }); + this.pokemonNameText = addTextObject(7, 107.5, "", TextStyle.SUMMARY, { + fontSize: 74, + }); this.pokemonNameText.setOrigin(0, 0); this.pokemonListContainer.add(this.pokemonNameText); // setup egg icon and candy count - this.pokemonHatchedIcon = this.scene.add.sprite(-5, 90, "egg_icons"); + this.pokemonHatchedIcon = globalScene.add.sprite(-5, 90, "egg_icons"); this.pokemonHatchedIcon.setOrigin(0, 0.2); this.pokemonHatchedIcon.setScale(0.8); this.pokemonListContainer.add(this.pokemonHatchedIcon); - this.pokemonCandyIcon = this.scene.add.sprite(4.5, 40, "candy"); + this.pokemonCandyIcon = globalScene.add.sprite(4.5, 40, "candy"); this.pokemonCandyIcon.setScale(0.5); this.pokemonCandyIcon.setOrigin(0, 0); this.pokemonListContainer.add(this.pokemonCandyIcon); - this.pokemonCandyOverlayIcon = this.scene.add.sprite(4.5, 40, "candy_overlay"); + this.pokemonCandyOverlayIcon = globalScene.add.sprite(4.5, 40, "candy_overlay"); this.pokemonCandyOverlayIcon.setScale(0.5); this.pokemonCandyOverlayIcon.setOrigin(0, 0); this.pokemonListContainer.add(this.pokemonCandyOverlayIcon); - this.pokemonCandyCountText = addTextObject(this.scene, 14, 40, "x0", TextStyle.SUMMARY, { fontSize: "56px" }); + this.pokemonCandyCountText = addTextObject(14, 40, "x0", TextStyle.SUMMARY, { fontSize: "56px" }); this.pokemonCandyCountText.setOrigin(0, 0); this.pokemonListContainer.add(this.pokemonCandyCountText); @@ -79,17 +83,17 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { this.pokemonEggMoveContainers = []; this.pokemonEggMoveBgs = []; this.pokemonEggMoveLabels = []; - this.pokemonEggMovesContainer = this.scene.add.container(0, 200); + this.pokemonEggMovesContainer = globalScene.add.container(0, 200); this.pokemonEggMovesContainer.setVisible(false); this.pokemonEggMovesContainer.setScale(0.5); for (let m = 0; m < 4; m++) { - const eggMoveContainer = this.scene.add.container(0, 0 + 6 * m); + const eggMoveContainer = globalScene.add.container(0, 0 + 6 * m); - const eggMoveBg = this.scene.add.nineslice(70, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); + const eggMoveBg = globalScene.add.nineslice(70, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); eggMoveBg.setOrigin(1, 0); - const eggMoveLabel = addTextObject(this.scene, 70 - eggMoveBg.width / 2, 0, "???", TextStyle.PARTY); + const eggMoveLabel = addTextObject(70 - eggMoveBg.width / 2, 0, "???", TextStyle.PARTY); eggMoveLabel.setOrigin(0.5, 0); this.pokemonEggMoveBgs.push(eggMoveBg); @@ -105,7 +109,6 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { } super.add(this.pokemonEggMoveContainers); - } /** @@ -126,9 +129,8 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { const shiny = pokemon.shiny; const variant = pokemon.variant; this.currentPokemonSprite.setVisible(false); - species.loadAssets(this.scene, female, formIndex, shiny, variant, true).then(() => { - - getPokemonSpeciesForm(species.speciesId, pokemon.formIndex).cry(this.scene); + species.loadAssets(female, formIndex, shiny, variant, true).then(() => { + getPokemonSpeciesForm(species.speciesId, pokemon.formIndex).cry(); this.currentPokemonSprite.play(species.getSpriteKey(female, formIndex, shiny, variant)); this.currentPokemonSprite.setPipelineData("shiny", shiny); this.currentPokemonSprite.setPipelineData("variant", variant); @@ -156,7 +158,7 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { this.pokemonCandyIcon.setVisible(true); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1]))); this.pokemonCandyOverlayIcon.setVisible(true); - this.pokemonCandyCountText.setText(`x${this.scene.gameData.starterData[species.speciesId].candyCount}`); + this.pokemonCandyCountText.setText(`x${globalScene.gameData.starterData[species.speciesId].candyCount}`); this.pokemonCandyCountText.setVisible(true); this.pokemonNumberText.setText(Utils.padInt(species.speciesId, 4)); @@ -166,8 +168,10 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { for (let em = 0; em < 4; em++) { const eggMove = hasEggMoves ? allMoves[speciesEggMoves[species.speciesId][em]] : null; - const eggMoveUnlocked = eggMove && this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em); - this.pokemonEggMoveBgs[em].setFrame(Type[eggMove ? eggMove.type : Type.UNKNOWN].toString().toLowerCase()); + const eggMoveUnlocked = eggMove && globalScene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em); + this.pokemonEggMoveBgs[em].setFrame( + PokemonType[eggMove ? eggMove.type : PokemonType.UNKNOWN].toString().toLowerCase(), + ); this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???"); if (!(eggMove && hatchInfo.starterDataEntryBeforeUpdate.eggMoves & Math.pow(2, em)) && eggMoveUnlocked) { @@ -183,7 +187,5 @@ export default class PokemonHatchInfoContainer extends PokemonInfoContainer { } else { this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species)); } - } - } diff --git a/src/ui/pokemon-icon-anim-handler.ts b/src/ui/pokemon-icon-anim-handler.ts index c7a24f69200..c84ee2a0f9a 100644 --- a/src/ui/pokemon-icon-anim-handler.ts +++ b/src/ui/pokemon-icon-anim-handler.ts @@ -1,10 +1,10 @@ -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import * as Utils from "../utils"; export enum PokemonIconAnimMode { NONE, PASSIVE, - ACTIVE + ACTIVE, } type PokemonIcon = Phaser.GameObjects.Container | Phaser.GameObjects.Sprite; @@ -13,7 +13,7 @@ export default class PokemonIconAnimHandler { private icons: Map; private toggled: boolean; - setup(scene: BattleScene): void { + setup(): void { this.icons = new Map(); this.toggled = false; @@ -26,14 +26,14 @@ export default class PokemonIconAnimHandler { i.y += delta * (this.toggled ? 1 : -1); } }; - scene.tweens.addCounter({ + globalScene.tweens.addCounter({ duration: Utils.fixedInt(200), from: 0, to: 1, yoyo: true, repeat: -1, onRepeat: onAlternate, - onYoyo: onAlternate + onYoyo: onAlternate, }); } @@ -50,16 +50,14 @@ export default class PokemonIconAnimHandler { addOrUpdate(icons: PokemonIcon | PokemonIcon[], mode: PokemonIconAnimMode): void { if (!Array.isArray(icons)) { - icons = [ icons ]; + icons = [icons]; } for (const i of icons) { if (this.icons.has(i) && this.icons.get(i) === mode) { continue; } if (this.toggled) { - const lastYDelta = this.icons.has(i) - ? this.icons.get(i)! - : 0; + const lastYDelta = this.icons.has(i) ? this.icons.get(i)! : 0; const yDelta = this.getModeYDelta(mode); i.y += yDelta + lastYDelta; } @@ -69,7 +67,7 @@ export default class PokemonIconAnimHandler { remove(icons: PokemonIcon | PokemonIcon[]): void { if (!Array.isArray(icons)) { - icons = [ icons ]; + icons = [icons]; } for (const i of icons) { if (this.toggled) { diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 5c3a22639dd..64c743ec88d 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -1,45 +1,27 @@ import { getVariantTint } from "#app/data/variant"; -import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; -import BattleScene from "../battle-scene"; +import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import { globalScene } from "#app/global-scene"; import { Gender, getGenderColor, getGenderSymbol } from "../data/gender"; import { getNatureName } from "../data/nature"; -import { Type } from "../data/type"; -import Pokemon from "../field/pokemon"; +import { PokemonType } from "#enums/pokemon-type"; +import type Pokemon from "../field/pokemon"; import i18next from "i18next"; -import { DexAttr, DexEntry, StarterDataEntry } from "../system/game-data"; +import type { DexEntry, StarterDataEntry } from "../system/game-data"; +import { DexAttr } from "../system/game-data"; import * as Utils from "../utils"; import ConfirmUiHandler from "./confirm-ui-handler"; import { StatsContainer } from "./stats-container"; import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text"; import { addWindow } from "./ui-theme"; -import { Species } from "#enums/species"; interface LanguageSetting { infoContainerTextSize: string; - infoContainerLabelXPos?: integer; - infoContainerTextXPos?: integer; + infoContainerLabelXPos?: number; + infoContainerTextXPos?: number; } const languageSettings: { [key: string]: LanguageSetting } = { - "en": { - infoContainerTextSize: "64px" - }, - "de": { - infoContainerTextSize: "64px", - }, - "es": { - infoContainerTextSize: "64px" - }, - "fr": { - infoContainerTextSize: "64px" - }, - "it": { - infoContainerTextSize: "64px" - }, - "zh": { - infoContainerTextSize: "64px" - }, - "pt": { + pt: { infoContainerTextSize: "60px", infoContainerLabelXPos: -15, infoContainerTextXPos: -12, @@ -75,8 +57,8 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { public shown: boolean; - constructor(scene: BattleScene, x: number = 372, y: number = 66) { - super(scene, x, y); + constructor(x = 372, y = 66) { + super(globalScene, x, y); this.initialX = x; } @@ -85,11 +67,11 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { const currentLanguage = i18next.resolvedLanguage!; // TODO: is this bang correct? const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage?.includes(lang))!; // TODO: is this bang correct? const textSettings = languageSettings[langSettingKey]; - this.infoBg = addWindow(this.scene, 0, 0, this.infoWindowWidth, 132); + this.infoBg = addWindow(0, 0, this.infoWindowWidth, 132); this.infoBg.setOrigin(0.5, 0.5); this.infoBg.setName("window-info-bg"); - this.pokemonMovesContainer = this.scene.add.container(6, 14); + this.pokemonMovesContainer = globalScene.add.container(6, 14); this.pokemonMovesContainer.setName("pkmn-moves"); this.movesContainerInitialX = this.pokemonMovesContainer.x; @@ -98,26 +80,32 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonMoveBgs = []; this.pokemonMoveLabels = []; - const movesBg = addWindow(this.scene, 0, 0, 58, 52); + const movesBg = addWindow(0, 0, 58, 52); movesBg.setOrigin(1, 0); movesBg.setName("window-moves-bg"); this.pokemonMovesContainer.add(movesBg); - const movesLabel = addTextObject(this.scene, -movesBg.width / 2, 6, i18next.t("pokemonInfoContainer:moveset"), TextStyle.WINDOW, { fontSize: "64px" }); + const movesLabel = addTextObject( + -movesBg.width / 2, + 6, + i18next.t("pokemonInfoContainer:moveset"), + TextStyle.WINDOW, + { fontSize: "64px" }, + ); movesLabel.setOrigin(0.5, 0); movesLabel.setName("text-moves"); this.pokemonMovesContainer.add(movesLabel); for (let m = 0; m < 4; m++) { - const moveContainer = this.scene.add.container(-6, 18 + 7 * m); + const moveContainer = globalScene.add.container(-6, 18 + 7 * m); moveContainer.setScale(0.5); moveContainer.setName("move"); - const moveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); + const moveBg = globalScene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); moveBg.setOrigin(1, 0); moveBg.setName("nineslice-move-bg"); - const moveLabel = addTextObject(this.scene, -moveBg.width / 2, 0, "-", TextStyle.PARTY); + const moveLabel = addTextObject(-moveBg.width / 2, 0, "-", TextStyle.PARTY); moveLabel.setOrigin(0.5, 0); moveLabel.setName("text-move-label"); @@ -133,7 +121,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.add(this.pokemonMovesContainer); - this.statsContainer = new StatsContainer(this.scene, -48, -64, true); + this.statsContainer = new StatsContainer(-48, -64, true); this.add(this.infoBg); this.add(this.statsContainer); @@ -145,62 +133,102 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { // The font size should be set by language const infoContainerTextSize = textSettings?.infoContainerTextSize || "64px"; - this.pokemonFormLabelText = addTextObject(this.scene, infoContainerLabelXPos, 19, i18next.t("pokemonInfoContainer:form"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonFormLabelText = addTextObject( + infoContainerLabelXPos, + 19, + i18next.t("pokemonInfoContainer:form"), + TextStyle.WINDOW, + { fontSize: infoContainerTextSize }, + ); this.pokemonFormLabelText.setOrigin(1, 0); this.pokemonFormLabelText.setVisible(false); this.add(this.pokemonFormLabelText); - this.pokemonFormText = addTextObject(this.scene, infoContainerTextXPos, 19, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonFormText = addTextObject(infoContainerTextXPos, 19, "", TextStyle.WINDOW, { + fontSize: infoContainerTextSize, + }); this.pokemonFormText.setOrigin(0, 0); this.pokemonFormText.setVisible(false); this.add(this.pokemonFormText); - this.pokemonGenderText = addTextObject(this.scene, -42, -61, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonGenderText = addTextObject(-42, -61, "", TextStyle.WINDOW, { + fontSize: infoContainerTextSize, + }); this.pokemonGenderText.setOrigin(0, 0); this.pokemonGenderText.setVisible(false); this.pokemonGenderText.setName("text-pkmn-gender"); this.add(this.pokemonGenderText); - this.pokemonGenderNewText = addTextObject(this.scene, -36, -61, "", TextStyle.WINDOW, { fontSize: "64px" }); + this.pokemonGenderNewText = addTextObject(-36, -61, "", TextStyle.WINDOW, { + fontSize: "64px", + }); this.pokemonGenderNewText.setOrigin(0, 0); this.pokemonGenderNewText.setVisible(false); this.pokemonGenderNewText.setName("text-pkmn-new-gender"); this.add(this.pokemonGenderNewText); - this.pokemonAbilityLabelText = addTextObject(this.scene, infoContainerLabelXPos, 29, i18next.t("pokemonInfoContainer:ability"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonAbilityLabelText = addTextObject( + infoContainerLabelXPos, + 29, + i18next.t("pokemonInfoContainer:ability"), + TextStyle.WINDOW, + { fontSize: infoContainerTextSize }, + ); this.pokemonAbilityLabelText.setOrigin(1, 0); this.pokemonAbilityLabelText.setName("text-pkmn-ability-label"); this.add(this.pokemonAbilityLabelText); - this.pokemonAbilityText = addTextObject(this.scene, infoContainerTextXPos, 29, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonAbilityText = addTextObject(infoContainerTextXPos, 29, "", TextStyle.WINDOW, { + fontSize: infoContainerTextSize, + }); this.pokemonAbilityText.setOrigin(0, 0); this.pokemonAbilityText.setName("text-pkmn-ability"); this.add(this.pokemonAbilityText); - this.pokemonNatureLabelText = addTextObject(this.scene, infoContainerLabelXPos, 39, i18next.t("pokemonInfoContainer:nature"), TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonNatureLabelText = addTextObject( + infoContainerLabelXPos, + 39, + i18next.t("pokemonInfoContainer:nature"), + TextStyle.WINDOW, + { fontSize: infoContainerTextSize }, + ); this.pokemonNatureLabelText.setOrigin(1, 0); this.pokemonNatureLabelText.setName("text-pkmn-nature-label"); this.add(this.pokemonNatureLabelText); - this.pokemonNatureText = addBBCodeTextObject(this.scene, infoContainerTextXPos, 39, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize, lineSpacing: 3, maxLines: 2 }); + this.pokemonNatureText = addBBCodeTextObject(infoContainerTextXPos, 39, "", TextStyle.WINDOW, { + fontSize: infoContainerTextSize, + lineSpacing: 3, + maxLines: 2, + }); this.pokemonNatureText.setOrigin(0, 0); this.pokemonNatureText.setName("text-pkmn-nature"); this.add(this.pokemonNatureText); - this.pokemonShinyIcon = this.scene.add.image(-43.5, 48.5, "shiny_star"); + this.pokemonShinyIcon = globalScene.add.image(-43.5, 48.5, "shiny_star"); this.pokemonShinyIcon.setOrigin(0, 0); this.pokemonShinyIcon.setScale(0.75); this.pokemonShinyIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.pokemonShinyIcon.setName("img-pkmn-shiny-icon"); this.add(this.pokemonShinyIcon); - this.pokemonShinyNewIcon = addTextObject(this.scene, this.pokemonShinyIcon.x + 12, this.pokemonShinyIcon.y, "", TextStyle.WINDOW, { fontSize: infoContainerTextSize }); + this.pokemonShinyNewIcon = addTextObject( + this.pokemonShinyIcon.x + 12, + this.pokemonShinyIcon.y, + "", + TextStyle.WINDOW, + { fontSize: infoContainerTextSize }, + ); this.pokemonShinyNewIcon.setOrigin(0, 0); this.pokemonShinyNewIcon.setName("text-pkmn-shiny-new-icon"); this.add(this.pokemonShinyNewIcon); this.pokemonShinyNewIcon.setVisible(false); - this.pokemonFusionShinyIcon = this.scene.add.image(this.pokemonShinyIcon.x, this.pokemonShinyIcon.y, "shiny_star_2"); + this.pokemonFusionShinyIcon = globalScene.add.image( + this.pokemonShinyIcon.x, + this.pokemonShinyIcon.y, + "shiny_star_2", + ); this.pokemonFusionShinyIcon.setOrigin(0, 0); this.pokemonFusionShinyIcon.setScale(0.75); this.pokemonFusionShinyIcon.setName("img-pkmn-fusion-shiny-icon"); @@ -209,13 +237,20 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.setVisible(false); } - show(pokemon: Pokemon, showMoves: boolean = false, speedMultiplier: number = 1, dexEntry?: DexEntry, starterEntry?: StarterDataEntry, eggInfo = false): Promise { + show( + pokemon: Pokemon, + showMoves = false, + speedMultiplier = 1, + dexEntry?: DexEntry, + starterEntry?: StarterDataEntry, + eggInfo = false, + ): Promise { return new Promise(resolve => { if (!dexEntry) { - dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId]; + dexEntry = globalScene.gameData.dexData[pokemon.species.speciesId]; } if (!starterEntry) { - starterEntry = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()]; + starterEntry = globalScene.gameData.starterData[pokemon.species.getRootSpeciesId()]; } const caughtAttr = BigInt(dexEntry.caughtAttr); @@ -227,25 +262,15 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { const newGender = BigInt(1 << pokemon.gender) * DexAttr.MALE; this.pokemonGenderNewText.setText("(+)"); - this.pokemonGenderNewText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); - this.pokemonGenderNewText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); + this.pokemonGenderNewText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); + this.pokemonGenderNewText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); this.pokemonGenderNewText.setVisible((newGender & caughtAttr) === BigInt(0)); } else { this.pokemonGenderNewText.setVisible(false); this.pokemonGenderText.setVisible(false); } - const formKey = (pokemon.species?.forms?.[pokemon.formIndex!]?.formKey); - const formText = Utils.capitalizeString(formKey, "-", false, false) || ""; - const speciesName = Utils.capitalizeString(Species[pokemon.species.getRootSpeciesId()], "_", true, false); - - let formName = ""; - if (pokemon.species.speciesId === Species.ARCEUS) { - formName = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); - } else { - const i18key = `pokemonForm:${speciesName}${formText}`; - formName = i18next.exists(i18key) ? i18next.t(i18key) : formText; - } + const formName = pokemon.species.getFormNameToDisplay(pokemon.formIndex); if (formName) { this.pokemonFormLabelText.setVisible(true); @@ -253,18 +278,25 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { const newForm = BigInt(1 << pokemon.formIndex) * DexAttr.DEFAULT_FORM; if ((newForm & caughtAttr) === BigInt(0)) { - this.pokemonFormLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); - this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); + this.pokemonFormLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); + this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); } else { - this.pokemonFormLabelText.setColor(getTextColor(TextStyle.WINDOW, false, this.scene.uiTheme)); - this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, this.scene.uiTheme)); + this.pokemonFormLabelText.setColor(getTextColor(TextStyle.WINDOW, false, globalScene.uiTheme)); + this.pokemonFormLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, globalScene.uiTheme)); } - this.pokemonFormText.setText(formName.length > this.numCharsBeforeCutoff ? formName.substring(0, this.numCharsBeforeCutoff - 3) + "..." : formName); + this.pokemonFormText.setText( + formName.length > this.numCharsBeforeCutoff + ? `${formName.substring(0, this.numCharsBeforeCutoff - 3)}...` + : formName, + ); if (formName.length > this.numCharsBeforeCutoff) { - this.pokemonFormText.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.pokemonFormText.width, this.pokemonFormText.height), Phaser.Geom.Rectangle.Contains); - this.pokemonFormText.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", formName, true)); - this.pokemonFormText.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + this.pokemonFormText.setInteractive( + new Phaser.Geom.Rectangle(0, 0, this.pokemonFormText.width, this.pokemonFormText.height), + Phaser.Geom.Rectangle.Contains, + ); + this.pokemonFormText.on("pointerover", () => globalScene.ui.showTooltip("", formName, true)); + this.pokemonFormText.on("pointerout", () => globalScene.ui.hideTooltip()); } else { this.pokemonFormText.disableInteractive(); } @@ -276,31 +308,31 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { const abilityTextStyle = pokemon.abilityIndex === 2 ? TextStyle.MONEY : TextStyle.WINDOW; this.pokemonAbilityText.setText(pokemon.getAbility(true).name); - this.pokemonAbilityText.setColor(getTextColor(abilityTextStyle, false, this.scene.uiTheme)); - this.pokemonAbilityText.setShadowColor(getTextColor(abilityTextStyle, true, this.scene.uiTheme)); + this.pokemonAbilityText.setColor(getTextColor(abilityTextStyle, false, globalScene.uiTheme)); + this.pokemonAbilityText.setShadowColor(getTextColor(abilityTextStyle, true, globalScene.uiTheme)); // Check if the player owns ability for the root form const playerOwnsThisAbility = pokemon.checkIfPlayerHasAbilityOfStarter(starterEntry.abilityAttr); if (!playerOwnsThisAbility) { - this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); - this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); + this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); + this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); } else { - this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.WINDOW, false, this.scene.uiTheme)); - this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, this.scene.uiTheme)); + this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.WINDOW, false, globalScene.uiTheme)); + this.pokemonAbilityLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, globalScene.uiTheme)); } - this.pokemonNatureText.setText(getNatureName(pokemon.getNature(), true, false, false, this.scene.uiTheme)); + this.pokemonNatureText.setText(getNatureName(pokemon.getNature(), true, false, false, globalScene.uiTheme)); const dexNatures = dexEntry.natureAttr; const newNature = 1 << (pokemon.nature + 1); if (!(dexNatures & newNature)) { - this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); - this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); + this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); + this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); } else { - this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.WINDOW, false, this.scene.uiTheme)); - this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, this.scene.uiTheme)); + this.pokemonNatureLabelText.setColor(getTextColor(TextStyle.WINDOW, false, globalScene.uiTheme)); + this.pokemonNatureLabelText.setShadowColor(getTextColor(TextStyle.WINDOW, true, globalScene.uiTheme)); } const isFusion = pokemon.isFusion(); @@ -311,20 +343,33 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonShinyIcon.setVisible(pokemon.isShiny()); this.pokemonShinyIcon.setTint(getVariantTint(baseVariant)); if (this.pokemonShinyIcon.visible) { - const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` - : ""; - this.pokemonShinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); - this.pokemonShinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + const shinyDescriptor = + doubleShiny || baseVariant + ? `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` + : ""; + this.pokemonShinyIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, + true, + ), + ); + this.pokemonShinyIcon.on("pointerout", () => globalScene.ui.hideTooltip()); const newShiny = BigInt(1 << (pokemon.shiny ? 1 : 0)); const newVariant = BigInt(1 << (pokemon.variant + 4)); 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)); - const newShinyOrVariant = ((newShiny & caughtAttr) === BigInt(0)) || ((newVariant & caughtAttr) === BigInt(0)); + this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)); + this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.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, globalScene.uiTheme)); + this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)); } else { this.pokemonShinyNewIcon.setVisible(false); } @@ -336,43 +381,48 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { } const starterSpeciesId = pokemon.species.getRootSpeciesId(); - const originalIvs: integer[] | null = eggInfo ? (dexEntry.caughtAttr ? dexEntry.ivs : null) : (this.scene.gameData.dexData[starterSpeciesId].caughtAttr - ? this.scene.gameData.dexData[starterSpeciesId].ivs : null); + const originalIvs: number[] | null = eggInfo + ? dexEntry.caughtAttr + ? dexEntry.ivs + : null + : globalScene.gameData.dexData[starterSpeciesId].caughtAttr + ? globalScene.gameData.dexData[starterSpeciesId].ivs + : null; this.statsContainer.updateIvs(pokemon.ivs, originalIvs!); // TODO: is this bang correct? if (!eggInfo) { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)), ease: "Cubic.easeInOut", x: this.initialX - this.infoWindowWidth, onComplete: () => { resolve(); - } + }, }); if (showMoves) { - this.scene.tweens.add({ + globalScene.tweens.add({ delay: Utils.fixedInt(Math.floor(325 / speedMultiplier)), targets: this.pokemonMovesContainer, duration: Utils.fixedInt(Math.floor(325 / speedMultiplier)), ease: "Cubic.easeInOut", x: this.movesContainerInitialX - 57, - onComplete: () => resolve() + onComplete: () => resolve(), }); } } for (let m = 0; m < 4; m++) { const move = m < pokemon.moveset.length && pokemon.moveset[m] ? pokemon.moveset[m]!.getMove() : null; - this.pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); + this.pokemonMoveBgs[m].setFrame(PokemonType[move ? move.type : PokemonType.UNKNOWN].toString().toLowerCase()); this.pokemonMoveLabels[m].setText(move ? move.name : "-"); this.pokemonMovesContainers[m].setVisible(!!move); } this.setVisible(true); this.shown = true; - this.scene.hideEnemyModifierBar(); + globalScene.hideEnemyModifierBar(); }); } @@ -406,36 +456,38 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonMovesContainer.setVisible(false); } - makeRoomForConfirmUi(speedMultiplier: number = 1, fromCatch: boolean = false): Promise { - const xPosition = fromCatch ? this.initialX - this.infoWindowWidth - 65 : this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth; + makeRoomForConfirmUi(speedMultiplier = 1, fromCatch = false): Promise { + const xPosition = fromCatch + ? this.initialX - this.infoWindowWidth - 65 + : this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth; return new Promise(resolve => { - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, duration: Utils.fixedInt(Math.floor(150 / speedMultiplier)), ease: "Cubic.easeInOut", x: xPosition, onComplete: () => { resolve(); - } + }, }); }); } - hide(speedMultiplier: number = 1): Promise { + hide(speedMultiplier = 1): Promise { return new Promise(resolve => { if (!this.shown) { - this.scene.showEnemyModifierBar(); + globalScene.showEnemyModifierBar(); return resolve(); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.pokemonMovesContainer, duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)), ease: "Cubic.easeInOut", - x: this.movesContainerInitialX + x: this.movesContainerInitialX, }); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)), ease: "Cubic.easeInOut", @@ -444,17 +496,13 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.setVisible(false); this.pokemonShinyIcon.off("pointerover"); this.pokemonShinyIcon.off("pointerout"); - (this.scene as BattleScene).ui.hideTooltip(); - this.scene.showEnemyModifierBar(); + globalScene.ui.hideTooltip(); + globalScene.showEnemyModifierBar(); resolve(); - } + }, }); this.shown = false; }); } } - -export default interface PokemonInfoContainer { - scene: BattleScene -} diff --git a/src/ui/registration-form-ui-handler.ts b/src/ui/registration-form-ui-handler.ts index fc9eb85cbaf..74669bc1f44 100644 --- a/src/ui/registration-form-ui-handler.ts +++ b/src/ui/registration-form-ui-handler.ts @@ -1,43 +1,44 @@ -import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; -import { ModalConfig } from "./modal-ui-handler"; -import * as Utils from "../utils"; +import type { InputFieldConfig } from "./form-modal-ui-handler"; +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import type { ModalConfig } from "./modal-ui-handler"; import { Mode } from "./ui"; import { TextStyle, addTextObject } from "./text"; import i18next from "i18next"; - +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import { globalScene } from "#app/global-scene"; interface LanguageSetting { - inputFieldFontSize?: string, - warningMessageFontSize?: string, - errorMessageFontSize?: string, + inputFieldFontSize?: string; + warningMessageFontSize?: string; + errorMessageFontSize?: string; } const languageSettings: { [key: string]: LanguageSetting } = { - "es":{ + "es-ES": { inputFieldFontSize: "50px", errorMessageFontSize: "40px", - } + }, }; export default class RegistrationFormUiHandler extends FormModalUiHandler { - getModalTitle(config?: ModalConfig): string { + getModalTitle(_config?: ModalConfig): string { return i18next.t("menu:register"); } - getWidth(config?: ModalConfig): number { + getWidth(_config?: ModalConfig): number { return 160; } - getMargin(config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; } getButtonTopMargin(): number { return 8; } - getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t("menu:register"), i18next.t("menu:backToLogin") ]; + getButtonLabels(_config?: ModalConfig): string[] { + return [i18next.t("menu:register"), i18next.t("menu:backToLogin")]; } getReadableErrorMessage(error: string): string { @@ -60,8 +61,14 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { override getInputFieldConfigs(): InputFieldConfig[] { const inputFieldConfigs: InputFieldConfig[] = []; inputFieldConfigs.push({ label: i18next.t("menu:username") }); - inputFieldConfigs.push({ label: i18next.t("menu:password"), isPassword: true }); - inputFieldConfigs.push({ label: i18next.t("menu:confirmPassword"), isPassword: true }); + inputFieldConfigs.push({ + label: i18next.t("menu:password"), + isPassword: true, + }); + inputFieldConfigs.push({ + label: i18next.t("menu:confirmPassword"), + isPassword: true, + }); return inputFieldConfigs; } @@ -78,7 +85,9 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { }); const warningMessageFontSize = languageSettings[i18next.resolvedLanguage!]?.warningMessageFontSize ?? "42px"; - const label = addTextObject(this.scene, 10, 87, i18next.t("menu:registrationAgeWarning"), TextStyle.TOOLTIP_CONTENT, { fontSize: warningMessageFontSize }); + const label = addTextObject(10, 87, i18next.t("menu:registrationAgeWarning"), TextStyle.TOOLTIP_CONTENT, { + fontSize: warningMessageFontSize, + }); this.modalContainer.add(label); } @@ -88,14 +97,14 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { const config = args[0] as ModalConfig; const originalRegistrationAction = this.submitAction; - this.submitAction = (_) => { + this.submitAction = _ => { // Prevent overlapping overrides on action modification this.submitAction = originalRegistrationAction; this.sanitizeInputs(); - this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); + globalScene.ui.setMode(Mode.LOADING, { buttonActions: [] }); const onFail = error => { - this.scene.ui.setMode(Mode.REGISTRATION_FORM, Object.assign(config, { errorMessage: error?.trim() })); - this.scene.ui.playError(); + globalScene.ui.setMode(Mode.REGISTRATION_FORM, Object.assign(config, { errorMessage: error?.trim() })); + globalScene.ui.playError(); const errorMessageFontSize = languageSettings[i18next.resolvedLanguage!]?.errorMessageFontSize; if (errorMessageFontSize) { this.errorMessage.setFontSize(errorMessageFontSize); @@ -110,27 +119,28 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { if (this.inputs[1].text !== this.inputs[2].text) { return onFail(i18next.t("menu:passwordNotMatchingConfirmPassword")); } - Utils.apiPost("account/register", `username=${encodeURIComponent(this.inputs[0].text)}&password=${encodeURIComponent(this.inputs[1].text)}`, "application/x-www-form-urlencoded") - .then(response => response.text()) - .then(response => { - if (!response) { - Utils.apiPost("account/login", `username=${encodeURIComponent(this.inputs[0].text)}&password=${encodeURIComponent(this.inputs[1].text)}`, "application/x-www-form-urlencoded") - .then(response => { - if (!response.ok) { - return response.text(); - } - return response.json(); + const [usernameInput, passwordInput] = this.inputs; + pokerogueApi.account + .register({ + username: usernameInput.text, + password: passwordInput.text, + }) + .then(registerError => { + if (!registerError) { + pokerogueApi.account + .login({ + username: usernameInput.text, + password: passwordInput.text, }) - .then(response => { - if (response.hasOwnProperty("token")) { - Utils.setCookie(Utils.sessionIdKey, response.token); - originalRegistrationAction && originalRegistrationAction(); + .then(loginError => { + if (!loginError) { + originalRegistrationAction?.(); } else { - onFail(response); + onFail(loginError); } }); } else { - onFail(response); + onFail(registerError); } }); }; diff --git a/src/ui/rename-form-ui-handler.ts b/src/ui/rename-form-ui-handler.ts index 6e4c4c6809d..91c0025d283 100644 --- a/src/ui/rename-form-ui-handler.ts +++ b/src/ui/rename-form-ui-handler.ts @@ -1,23 +1,24 @@ -import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; -import { ModalConfig } from "./modal-ui-handler"; +import type { InputFieldConfig } from "./form-modal-ui-handler"; +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import type { ModalConfig } from "./modal-ui-handler"; import i18next from "i18next"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; export default class RenameFormUiHandler extends FormModalUiHandler { - getModalTitle(config?: ModalConfig): string { + getModalTitle(_config?: ModalConfig): string { return i18next.t("menu:renamePokemon"); } - getWidth(config?: ModalConfig): number { + getWidth(_config?: ModalConfig): number { return 160; } - getMargin(config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; } - getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t("menu:rename"), i18next.t("menu:cancel") ]; + getButtonLabels(_config?: ModalConfig): string[] { + return [i18next.t("menu:rename"), i18next.t("menu:cancel")]; } getReadableErrorMessage(error: string): string { @@ -41,7 +42,7 @@ export default class RenameFormUiHandler extends FormModalUiHandler { } else { this.inputs[0].text = args[1]; } - this.submitAction = (_) => { + this.submitAction = _ => { this.sanitizeInputs(); const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text))); config.buttonActions[0](sanitizedName); diff --git a/src/ui/run-history-ui-handler.ts b/src/ui/run-history-ui-handler.ts index 061f15d0956..85ea1e93e8d 100644 --- a/src/ui/run-history-ui-handler.ts +++ b/src/ui/run-history-ui-handler.ts @@ -1,15 +1,15 @@ -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import { GameModes } from "../game-mode"; import { TextStyle, addTextObject } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; import * as Utils from "../utils"; -import PokemonData from "../system/pokemon-data"; +import type PokemonData from "../system/pokemon-data"; import MessageUiHandler from "./message-ui-handler"; import i18next from "i18next"; import { Button } from "../enums/buttons"; import { BattleType } from "../battle"; -import { RunEntry } from "../system/game-data"; +import type { RunEntry } from "../system/game-data"; import { PlayerGender } from "#enums/player-gender"; import { TrainerVariant } from "../field/trainer"; import { RunDisplayMode } from "#app/ui/run-info-ui-handler"; @@ -25,7 +25,6 @@ export const RUN_HISTORY_LIMIT: number = 25; * The only valid input buttons are Button.ACTION and Button.CANCEL. */ export default class RunHistoryUiHandler extends MessageUiHandler { - private readonly maxRows = 3; private runSelectContainer: Phaser.GameObjects.Container; @@ -34,40 +33,46 @@ export default class RunHistoryUiHandler extends MessageUiHandler { private runSelectCallback: RunSelectCallback | null; - private scrollCursor: number = 0; + private scrollCursor = 0; private cursorObj: Phaser.GameObjects.NineSlice | null; private runContainerInitialY: number; - constructor(scene: BattleScene) { - super(scene, Mode.RUN_HISTORY); + constructor() { + super(Mode.RUN_HISTORY); } override setup() { const ui = this.getUi(); - this.runSelectContainer = this.scene.add.container(0, 0); + this.runSelectContainer = globalScene.add.container(0, 0); this.runSelectContainer.setVisible(false); ui.add(this.runSelectContainer); - const loadSessionBg = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, -this.scene.game.canvas.height / 6, 0x006860); + const loadSessionBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + -globalScene.game.canvas.height / 6, + 0x006860, + ); loadSessionBg.setOrigin(0, 0); this.runSelectContainer.add(loadSessionBg); - this.runContainerInitialY = -this.scene.game.canvas.height / 6 + 8; + this.runContainerInitialY = -globalScene.game.canvas.height / 6 + 8; - this.runsContainer = this.scene.add.container(8, this.runContainerInitialY); + this.runsContainer = globalScene.add.container(8, this.runContainerInitialY); this.runSelectContainer.add(this.runsContainer); this.runs = []; - this.scene.loadImage("hall_of_fame_red", "ui"); - this.scene.loadImage("hall_of_fame_blue", "ui"); + globalScene.loadImage("hall_of_fame_red", "ui"); + globalScene.loadImage("hall_of_fame_blue", "ui"); // For some reason, the game deletes/unloads the rival sprites. As a result, Run Info cannot access the rival sprites. // The rivals are loaded here to have some way of accessing those sprites. - this.scene.loadAtlas("rival_f", "trainer"); - this.scene.loadAtlas("rival_m", "trainer"); + globalScene.loadAtlas("rival_f", "trainer"); + globalScene.loadAtlas("rival_m", "trainer"); } override show(args: any[]): boolean { @@ -75,7 +80,7 @@ export default class RunHistoryUiHandler extends MessageUiHandler { this.getUi().bringToTop(this.runSelectContainer); this.runSelectContainer.setVisible(true); - this.populateRuns(this.scene).then(() => { + this.populateRuns().then(() => { this.setScrollCursor(0); this.setCursor(0); @@ -101,21 +106,20 @@ export default class RunHistoryUiHandler extends MessageUiHandler { let success = false; const error = false; - if ([ Button.ACTION, Button.CANCEL ].includes(button)) { + if ([Button.ACTION, Button.CANCEL].includes(button)) { if (button === Button.ACTION) { const cursor = this.cursor + this.scrollCursor; if (this.runs[cursor]) { - this.scene.ui.setOverlayMode(Mode.RUN_INFO, this.runs[cursor].entryData, RunDisplayMode.RUN_HISTORY, true); + globalScene.ui.setOverlayMode(Mode.RUN_INFO, this.runs[cursor].entryData, RunDisplayMode.RUN_HISTORY, true); } else { return false; } success = true; return success; - } else { - this.runSelectCallback = null; - success = true; - this.scene.ui.revertMode(); } + this.runSelectCallback = null; + success = true; + globalScene.ui.revertMode(); } else if (this.runs.length > 0) { switch (button) { case Button.UP: @@ -124,7 +128,7 @@ export default class RunHistoryUiHandler extends MessageUiHandler { } else if (this.scrollCursor) { success = this.setScrollCursor(this.scrollCursor - 1); } else if (this.runs.length > 1) { - // wrap around to the bottom + // wrap around to the bottom success = this.setCursor(Math.min(this.runs.length - 1, this.maxRows - 1)); success = this.setScrollCursor(Math.max(0, this.runs.length - this.maxRows)) || success; } @@ -135,7 +139,7 @@ export default class RunHistoryUiHandler extends MessageUiHandler { } else if (this.scrollCursor < this.runs.length - this.maxRows) { success = this.setScrollCursor(this.scrollCursor + 1); } else if (this.runs.length > 1) { - // wrap around to the top + // wrap around to the top success = this.setCursor(0); success = this.setScrollCursor(0) || success; } @@ -153,12 +157,11 @@ export default class RunHistoryUiHandler extends MessageUiHandler { /** * This retrieves the player's run history and facilitates the processes necessary for the output display. - * @param scene: BattleScene * Runs are displayed from newest --> oldest in descending order. * In the for loop, each run is processed to create an RunEntryContainer used to display and store the run's unique information */ - private async populateRuns(scene: BattleScene) { - const response = await this.scene.gameData.getRunHistoryData(this.scene); + private async populateRuns() { + const response = await globalScene.gameData.getRunHistoryData(); const timestamps = Object.keys(response); if (timestamps.length === 0) { this.showEmpty(); @@ -170,8 +173,8 @@ export default class RunHistoryUiHandler extends MessageUiHandler { } const entryCount = timestamps.length; for (let s = 0; s < entryCount; s++) { - const entry = new RunEntryContainer(this.scene, response[timestampsNo[s]], s); - this.scene.add.existing(entry); + const entry = new RunEntryContainer(response[timestampsNo[s]], s); + globalScene.add.existing(entry); this.runsContainer.add(entry); this.runs.push(entry); } @@ -184,10 +187,12 @@ export default class RunHistoryUiHandler extends MessageUiHandler { * If the player has no runs saved so far, this creates a giant window labeled empty instead. */ private async showEmpty() { - const emptyWindow = addWindow(this.scene, 0, 0, 304, 165); + const emptyWindow = addWindow(0, 0, 304, 165); this.runsContainer.add(emptyWindow); const emptyWindowCoordinates = emptyWindow.getCenter(); - const emptyText = addTextObject(this.scene, 0, 0, i18next.t("saveSlotSelectUiHandler:empty"), TextStyle.WINDOW, { fontSize: "128px" }); + const emptyText = addTextObject(0, 0, i18next.t("saveSlotSelectUiHandler:empty"), TextStyle.WINDOW, { + fontSize: "128px", + }); emptyText.setPosition(emptyWindowCoordinates.x - 18, emptyWindowCoordinates.y - 15); this.runsContainer.add(emptyText); } @@ -196,7 +201,7 @@ export default class RunHistoryUiHandler extends MessageUiHandler { const changed = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight_thick", undefined, 296, 46, 6, 6, 6, 6); + this.cursorObj = globalScene.add.nineslice(0, 0, "select_cursor_highlight_thick", undefined, 296, 46, 6, 6, 6, 6); this.cursorObj.setOrigin(0, 0); this.runsContainer.add(this.cursorObj); } @@ -210,11 +215,11 @@ export default class RunHistoryUiHandler extends MessageUiHandler { if (changed) { this.scrollCursor = scrollCursor; this.setCursor(this.cursor); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.runsContainer, y: this.runContainerInitialY - 56 * scrollCursor, duration: Utils.fixedInt(325), - ease: "Sine.easeInOut" + ease: "Sine.easeInOut", }); } return changed; @@ -255,14 +260,13 @@ class RunEntryContainer extends Phaser.GameObjects.Container { private slotId: number; public entryData: RunEntry; - constructor(scene: BattleScene, entryData: RunEntry, slotId: number) { - super(scene, 0, slotId * 56); + constructor(entryData: RunEntry, slotId: number) { + super(globalScene, 0, slotId * 56); this.slotId = slotId; this.entryData = entryData; this.setup(this.entryData); - } /** @@ -276,33 +280,44 @@ class RunEntryContainer extends Phaser.GameObjects.Container { * The player's party and their levels at the time of the last wave of the run are also displayed. */ private setup(run: RunEntry) { - const victory = run.isVictory; - const data = this.scene.gameData.parseSessionData(JSON.stringify(run.entry)); + const data = globalScene.gameData.parseSessionData(JSON.stringify(run.entry)); - const slotWindow = addWindow(this.scene, 0, 0, 304, 52); + const slotWindow = addWindow(0, 0, 304, 52); this.add(slotWindow); // Run Result: Victory if (victory) { - const gameOutcomeLabel = addTextObject(this.scene, 8, 5, `${i18next.t("runHistory:victory")}`, TextStyle.WINDOW); + const gameOutcomeLabel = addTextObject(8, 5, `${i18next.t("runHistory:victory")}`, TextStyle.WINDOW); this.add(gameOutcomeLabel); - } else { // Run Result: Defeats - const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + } else { + // Run Result: Defeats + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderStr = PlayerGender[genderIndex].toLowerCase(); // Defeats from wild Pokemon battles will show the Pokemon responsible by the text of the run result. if (data.battleType === BattleType.WILD || (data.battleType === BattleType.MYSTERY_ENCOUNTER && !data.trainer)) { - const enemyContainer = this.scene.add.container(8, 5); - const gameOutcomeLabel = addTextObject(this.scene, 0, 0, `${i18next.t("runHistory:defeatedWild", { context: genderStr })}`, TextStyle.WINDOW); + const enemyContainer = globalScene.add.container(8, 5); + const gameOutcomeLabel = addTextObject( + 0, + 0, + `${i18next.t("runHistory:defeatedWild", { context: genderStr })}`, + TextStyle.WINDOW, + ); enemyContainer.add(gameOutcomeLabel); data.enemyParty.forEach((enemyData, e) => { - const enemyIconContainer = this.scene.add.container(65 + (e * 25), -8); + const enemyIconContainer = globalScene.add.container(65 + e * 25, -8); enemyIconContainer.setScale(0.75); enemyData.boss = false; enemyData["player"] = true; - const enemy = enemyData.toPokemon(this.scene); - const enemyIcon = this.scene.addPokemonIcon(enemy, 0, 0, 0, 0); - const enemyLevel = addTextObject(this.scene, 32, 20, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); + const enemy = enemyData.toPokemon(); + const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); + const enemyLevel = addTextObject( + 32, + 20, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, + TextStyle.PARTY, + { fontSize: "54px", color: "#f8f8f8" }, + ); enemyLevel.setShadow(0, 0, undefined); enemyLevel.setStroke("#424242", 14); enemyLevel.setOrigin(1, 0); @@ -312,16 +327,30 @@ class RunEntryContainer extends Phaser.GameObjects.Container { enemy.destroy(); }); this.add(enemyContainer); - } else if (data.battleType === BattleType.TRAINER || (data.battleType === BattleType.MYSTERY_ENCOUNTER && data.trainer)) { // Defeats from Trainers show the trainer's title and name - const tObj = data.trainer.toTrainer(this.scene); + } else if ( + data.battleType === BattleType.TRAINER || + (data.battleType === BattleType.MYSTERY_ENCOUNTER && data.trainer) + ) { + // Defeats from Trainers show the trainer's title and name + const tObj = data.trainer.toTrainer(); // Because of the interesting mechanics behind rival names, the rival name and title have to be retrieved differently const RIVAL_TRAINER_ID_THRESHOLD = 375; if (data.trainer.trainerType >= RIVAL_TRAINER_ID_THRESHOLD) { - const rivalName = (tObj.variant === TrainerVariant.FEMALE) ? "trainerNames:rival_female" : "trainerNames:rival"; - const gameOutcomeLabel = addTextObject(this.scene, 8, 5, `${i18next.t("runHistory:defeatedRival", { context: genderStr })} ${i18next.t(rivalName)}`, TextStyle.WINDOW); + const rivalName = tObj.variant === TrainerVariant.FEMALE ? "trainerNames:rival_female" : "trainerNames:rival"; + const gameOutcomeLabel = addTextObject( + 8, + 5, + `${i18next.t("runHistory:defeatedRival", { context: genderStr })} ${i18next.t(rivalName)}`, + TextStyle.WINDOW, + ); this.add(gameOutcomeLabel); } else { - const gameOutcomeLabel = addTextObject(this.scene, 8, 5, `${i18next.t("runHistory:defeatedTrainer", { context: genderStr })}${tObj.getName(0, true)}`, TextStyle.WINDOW); + const gameOutcomeLabel = addTextObject( + 8, + 5, + `${i18next.t("runHistory:defeatedTrainer", { context: genderStr })}${tObj.getName(0, true)}`, + TextStyle.WINDOW, + ); this.add(gameOutcomeLabel); } } @@ -330,7 +359,7 @@ class RunEntryContainer extends Phaser.GameObjects.Container { // Game Mode + Waves // Because Endless (Spliced) tends to have the longest name across languages, the line tends to spill into the party icons. // To fix this, the Spliced icon is used to indicate an Endless Spliced run - const gameModeLabel = addTextObject(this.scene, 8, 19, "", TextStyle.WINDOW); + const gameModeLabel = addTextObject(8, 19, "", TextStyle.WINDOW); let mode = ""; switch (data.gameMode) { case GameModes.DAILY: @@ -349,7 +378,7 @@ class RunEntryContainer extends Phaser.GameObjects.Container { } gameModeLabel.appendText(mode, false); if (data.gameMode === GameModes.SPLICED_ENDLESS) { - const splicedIcon = this.scene.add.image(0, 0, "icon_spliced"); + const splicedIcon = globalScene.add.image(0, 0, "icon_spliced"); splicedIcon.setScale(0.75); const coords = gameModeLabel.getTopRight(); splicedIcon.setPosition(coords.x + 5, 27); @@ -362,21 +391,27 @@ class RunEntryContainer extends Phaser.GameObjects.Container { gameModeLabel.appendText(i18next.t("saveSlotSelectUiHandler:wave") + " " + data.waveIndex, false); this.add(gameModeLabel); - const timestampLabel = addTextObject(this.scene, 8, 33, new Date(data.timestamp).toLocaleString(), TextStyle.WINDOW); + const timestampLabel = addTextObject(8, 33, new Date(data.timestamp).toLocaleString(), TextStyle.WINDOW); this.add(timestampLabel); // pokemonIconsContainer holds the run's party Pokemon icons and levels // Icons should be level with each other here, but there are significant number of icons that have a center axis / position far from the norm. // The code here does not account for icon weirdness. - const pokemonIconsContainer = this.scene.add.container(140, 17); + const pokemonIconsContainer = globalScene.add.container(140, 17); data.party.forEach((p: PokemonData, i: number) => { - const iconContainer = this.scene.add.container(26 * i, 0); + const iconContainer = globalScene.add.container(26 * i, 0); iconContainer.setScale(0.75); - const pokemon = p.toPokemon(this.scene); - const icon = this.scene.addPokemonIcon(pokemon, 0, 0, 0, 0); + const pokemon = p.toPokemon(); + const icon = globalScene.addPokemonIcon(pokemon, 0, 0, 0, 0); - const text = addTextObject(this.scene, 32, 20, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); + const text = addTextObject( + 32, + 20, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, + TextStyle.PARTY, + { fontSize: "54px", color: "#f8f8f8" }, + ); text.setShadow(0, 0, undefined); text.setStroke("#424242", 14); text.setOrigin(1, 0); @@ -392,8 +427,3 @@ class RunEntryContainer extends Phaser.GameObjects.Container { this.add(pokemonIconsContainer); } } - -interface RunEntryContainer { - scene: BattleScene; -} - diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 0ca47241136..364cb8e4003 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -1,13 +1,12 @@ -import BattleScene from "../battle-scene"; import { GameModes } from "../game-mode"; import UiHandler from "./ui-handler"; -import { SessionSaveData } from "../system/game-data"; +import type { SessionSaveData } from "../system/game-data"; import { TextStyle, addTextObject, addBBCodeTextObject, getTextColor } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; import { getPokeballAtlasKey } from "#app/data/pokeball"; import * as Utils from "../utils"; -import PokemonData from "../system/pokemon-data"; +import type PokemonData from "../system/pokemon-data"; import i18next from "i18next"; import { Button } from "../enums/buttons"; import { BattleType } from "../battle"; @@ -15,16 +14,18 @@ import { TrainerVariant } from "../field/trainer"; import { Challenges } from "#enums/challenges"; import { getLuckString, getLuckTextTint } from "../modifier/modifier-type"; import RoundRectangle from "phaser3-rex-plugins/plugins/roundrectangle"; -import { Type, getTypeRgb } from "../data/type"; +import { getTypeRgb } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { TypeColor, TypeShadow } from "#app/enums/color"; import { getNatureStatMultiplier, getNatureName } from "../data/nature"; import { getVariantTint } from "#app/data/variant"; import * as Modifier from "../modifier/modifier"; -import { Species } from "#enums/species"; +import type { Species } from "#enums/species"; import { PlayerGender } from "#enums/player-gender"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { getBiomeName } from "#app/data/balance/biomes"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { globalScene } from "#app/global-scene"; /** * RunInfoUiMode indicates possible overlays of RunInfoUiHandler. @@ -34,12 +35,12 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; enum RunInfoUiMode { MAIN, HALL_OF_FAME, - ENDING_ART + ENDING_ART, } export enum RunDisplayMode { RUN_HISTORY, - SESSION_PREVIEW + SESSION_PREVIEW, } /** @@ -58,25 +59,25 @@ export default class RunInfoUiHandler extends UiHandler { private runResultContainer: Phaser.GameObjects.Container; private runInfoContainer: Phaser.GameObjects.Container; private partyContainer: Phaser.GameObjects.Container; - private statsBgWidth: integer; + private statsBgWidth: number; private hallofFameContainer: Phaser.GameObjects.Container; private endCardContainer: Phaser.GameObjects.Container; - private partyVisibility: Boolean; + private partyVisibility: boolean; private modifiersModule: any; - constructor(scene: BattleScene) { - super(scene, Mode.RUN_INFO); + constructor() { + super(Mode.RUN_INFO); } override async setup() { - this.runContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.runContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); // The import of the modifiersModule is loaded here to sidestep async/await issues. this.modifiersModule = Modifier; this.runContainer.setVisible(false); - this.scene.loadImage("encounter_exclaim", "mystery-encounters"); - } + globalScene.loadImage("encounter_exclaim", "mystery-encounters"); + } /** * This takes a run's RunEntry and uses the information provided to display essential information about the player's run. @@ -89,17 +90,23 @@ export default class RunInfoUiHandler extends UiHandler { * Party Container: * this.isVictory === true --> Hall of Fame Container: */ - override show(args: any[]): boolean { - super.show(args); + override show(args: any[]): boolean { + super.show(args); - const gameStatsBg = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width, this.scene.game.canvas.height, 0x006860); + const gameStatsBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width, + globalScene.game.canvas.height, + 0x006860, + ); gameStatsBg.setOrigin(0, 0); this.runContainer.add(gameStatsBg); const run = args[0]; this.runDisplayMode = args[1]; if (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) { - this.runInfo = this.scene.gameData.parseSessionData(JSON.stringify(run.entry)); + this.runInfo = globalScene.gameData.parseSessionData(JSON.stringify(run.entry)); this.isVictory = run.isVictory ?? false; } else if (this.runDisplayMode === RunDisplayMode.SESSION_PREVIEW) { this.runInfo = args[0]; @@ -111,12 +118,13 @@ export default class RunInfoUiHandler extends UiHandler { // Creates Header and adds to this.runContainer this.addHeader(); - this.statsBgWidth = ((this.scene.game.canvas.width / 6) - 2) / 3; + this.statsBgWidth = (globalScene.game.canvas.width / 6 - 2) / 3; // Creates Run Result Container - this.runResultContainer = this.scene.add.container(0, 24); - const runResultWindow = addWindow(this.scene, 0, 0, this.statsBgWidth - 11, 65); + this.runResultContainer = globalScene.add.container(0, 24); + const runResultWindow = addWindow(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(); @@ -125,18 +133,21 @@ export default class RunInfoUiHandler extends UiHandler { } // Creates Run Info Container - this.runInfoContainer = this.scene.add.container(0, 89); - const runInfoWindow = addWindow(this.scene, 0, 0, this.statsBgWidth - 11, 90); + this.runInfoContainer = globalScene.add.container(0, 89); + const runInfoWindow = addWindow(0, 0, this.statsBgWidth - 11, 90); const runInfoWindowCoords = runInfoWindow.getBottomRight(); this.runInfoContainer.add(runInfoWindow); - this.parseRunInfo(runInfoWindowCoords.x, runInfoWindowCoords.y); + this.parseRunInfo(runInfoWindowCoords.x, runInfoWindowCoords.y); // Creates Player Party Container - this.partyContainer = this.scene.add.container(this.statsBgWidth - 10, 23); + this.partyContainer = globalScene.add.container(this.statsBgWidth - 10, 23); this.parsePartyInfo(); this.showParty(true); - this.runContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.runContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); this.getUi().bringToTop(this.runContainer); this.runContainer.setVisible(true); @@ -153,7 +164,7 @@ export default class RunInfoUiHandler extends UiHandler { this.getUi().hideTooltip(); return true; - } + } /** * Creates and adds the header background, title text, and important buttons to RunInfoUiHandler @@ -161,25 +172,36 @@ export default class RunInfoUiHandler extends UiHandler { * It does not check if the run has any PokemonHeldItemModifiers though. */ private addHeader() { - const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); + const headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6 - 2, 24); headerBg.setOrigin(0, 0); this.runContainer.add(headerBg); if (this.runInfo.modifiers.length !== 0) { const headerBgCoords = headerBg.getTopRight(); - const abilityButtonContainer = this.scene.add.container(0, 0); - const abilityButtonText = addTextObject(this.scene, 8, 0, i18next.t("runHistory:viewHeldItems"), TextStyle.WINDOW, { fontSize:"34px" }); + const abilityButtonContainer = globalScene.add.container(0, 0); + const abilityButtonText = addTextObject(8, 0, i18next.t("runHistory:viewHeldItems"), TextStyle.WINDOW, { + fontSize: "34px", + }); const gamepadType = this.getUi().getGamepadType(); let abilityButtonElement: Phaser.GameObjects.Sprite; if (gamepadType === "touch") { - abilityButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 2, "keyboard", "E.png"); + abilityButtonElement = new Phaser.GameObjects.Sprite(globalScene, 0, 2, "keyboard", "E.png"); } else { - abilityButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 2, gamepadType, this.scene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Ability)); + abilityButtonElement = new Phaser.GameObjects.Sprite( + globalScene, + 0, + 2, + gamepadType, + globalScene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Ability), + ); } - abilityButtonContainer.add([ abilityButtonText, abilityButtonElement ]); - abilityButtonContainer.setPosition(headerBgCoords.x - abilityButtonText.displayWidth - abilityButtonElement.displayWidth - 8, 10); + abilityButtonContainer.add([abilityButtonText, abilityButtonElement]); + abilityButtonContainer.setPosition( + headerBgCoords.x - abilityButtonText.displayWidth - abilityButtonElement.displayWidth - 8, + 10, + ); this.runContainer.add(abilityButtonContainer); } - const headerText = addTextObject(this.scene, 0, 0, i18next.t("runHistory:runInfo"), TextStyle.SETTINGS_LABEL); + const headerText = addTextObject(0, 0, i18next.t("runHistory:runInfo"), TextStyle.SETTINGS_LABEL); headerText.setOrigin(0, 0); headerText.setPositionRelative(headerBg, 8, 4); this.runContainer.add(headerText); @@ -194,29 +216,53 @@ export default class RunInfoUiHandler extends UiHandler { * */ private async parseRunResult() { - const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderStr = PlayerGender[genderIndex]; const runResultTextStyle = this.isVictory ? TextStyle.PERFECT_IV : TextStyle.SUMMARY_RED; - const runResultTitle = this.isVictory ? i18next.t("runHistory:victory") : i18next.t("runHistory:defeated", { context: genderStr }); - const runResultText = addTextObject(this.scene, 6, 5, `${runResultTitle} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, runResultTextStyle, { fontSize : "65px", lineSpacing: 0.1 }); + const runResultTitle = this.isVictory + ? i18next.t("runHistory:victory") + : i18next.t("runHistory:defeated", { context: genderStr }); + const runResultText = addTextObject( + 6, + 5, + `${runResultTitle} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, + runResultTextStyle, + { fontSize: "65px", lineSpacing: 0.1 }, + ); if (this.isVictory) { - const hallofFameInstructionContainer = this.scene.add.container(0, 0); - const shinyButtonText = addTextObject(this.scene, 8, 0, i18next.t("runHistory:viewHallOfFame"), TextStyle.WINDOW, { fontSize:"65px" }); - const formButtonText = addTextObject(this.scene, 8, 12, i18next.t("runHistory:viewEndingSplash"), TextStyle.WINDOW, { fontSize:"65px" }); + const hallofFameInstructionContainer = globalScene.add.container(0, 0); + const shinyButtonText = addTextObject(8, 0, i18next.t("runHistory:viewHallOfFame"), TextStyle.WINDOW, { + fontSize: "65px", + }); + const formButtonText = addTextObject(8, 12, i18next.t("runHistory:viewEndingSplash"), TextStyle.WINDOW, { + fontSize: "65px", + }); const gamepadType = this.getUi().getGamepadType(); let shinyButtonElement: Phaser.GameObjects.Sprite; let formButtonElement: Phaser.GameObjects.Sprite; if (gamepadType === "touch") { - shinyButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 4, "keyboard", "R.png"); - formButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 16, "keyboard", "F.png"); + shinyButtonElement = new Phaser.GameObjects.Sprite(globalScene, 0, 4, "keyboard", "R.png"); + formButtonElement = new Phaser.GameObjects.Sprite(globalScene, 0, 16, "keyboard", "F.png"); } else { - shinyButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 4, gamepadType, this.scene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Shiny)); - formButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 16, gamepadType, this.scene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Form)); + shinyButtonElement = new Phaser.GameObjects.Sprite( + globalScene, + 0, + 4, + gamepadType, + globalScene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Shiny), + ); + formButtonElement = new Phaser.GameObjects.Sprite( + globalScene, + 0, + 16, + gamepadType, + globalScene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Form), + ); } - hallofFameInstructionContainer.add([ shinyButtonText, shinyButtonElement ]); + hallofFameInstructionContainer.add([shinyButtonText, shinyButtonElement]); - hallofFameInstructionContainer.add([ formButtonText, formButtonElement ]); + hallofFameInstructionContainer.add([formButtonText, formButtonElement]); hallofFameInstructionContainer.setPosition(12, 25); this.runResultContainer.add(hallofFameInstructionContainer); @@ -225,20 +271,26 @@ export default class RunInfoUiHandler extends UiHandler { this.runResultContainer.add(runResultText); if (!this.isVictory) { - const enemyContainer = this.scene.add.container(0, 0); + const enemyContainer = globalScene.add.container(0, 0); // Wild - Single and Doubles - if (this.runInfo.battleType === BattleType.WILD || (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && !this.runInfo.trainer)) { + if ( + this.runInfo.battleType === BattleType.WILD || + (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && !this.runInfo.trainer) + ) { switch (this.runInfo.enemyParty.length) { case 1: - // Wild - Singles + // Wild - Singles this.parseWildSingleDefeat(enemyContainer); break; case 2: - //Wild - Doubles + //Wild - Doubles this.parseWildDoubleDefeat(enemyContainer); break; } - } else if (this.runInfo.battleType === BattleType.TRAINER || (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && this.runInfo.trainer)) { + } else if ( + this.runInfo.battleType === BattleType.TRAINER || + (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && this.runInfo.trainer) + ) { this.parseTrainerDefeat(enemyContainer); } this.runResultContainer.add(enemyContainer); @@ -253,9 +305,7 @@ 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); + const enemyContainer = globalScene.add.container(0, 0); this.runResultContainer.add(enemyContainer); if (this.runInfo.battleType === BattleType.WILD) { if (this.runInfo.enemyParty.length === 1) { @@ -267,42 +317,80 @@ export default class RunInfoUiHandler extends UiHandler { this.showTrainerSprites(enemyContainer); const row_limit = 3; this.runInfo.enemyParty.forEach((p, i) => { - const pokeball = this.scene.add.sprite(0, 0, "pb"); + const pokeball = globalScene.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); + const trainerObj = this.runInfo.trainer.toTrainer(); const RIVAL_TRAINER_ID_THRESHOLD = 375; let trainerName = ""; if (this.runInfo.trainer.trainerType >= RIVAL_TRAINER_ID_THRESHOLD) { - trainerName = (trainerObj.variant === TrainerVariant.FEMALE) ? i18next.t("trainerNames:rival_female") : i18next.t("trainerNames:rival"); + trainerName = + trainerObj.variant === TrainerVariant.FEMALE + ? i18next.t("trainerNames:rival_female") + : i18next.t("trainerNames:rival"); } else { trainerName = trainerObj.getName(0, true); } - const boxString = i18next.t(trainerObj.variant !== TrainerVariant.DOUBLE ? "battle:trainerAppeared" : "battle:trainerAppearedDouble", { trainerName: trainerName }).replace(/\n/g, " "); - const descContainer = this.scene.add.container(0, 0); - const textBox = addTextObject(this.scene, 0, 0, boxString, TextStyle.WINDOW, { fontSize : "35px", wordWrap: { width: 200 }}); + const boxString = i18next + .t(trainerObj.variant !== TrainerVariant.DOUBLE ? "battle:trainerAppeared" : "battle:trainerAppearedDouble", { + trainerName: trainerName, + }) + .replace(/\n/g, " "); + const descContainer = globalScene.add.container(0, 0); + const textBox = addTextObject(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"); + const encounterExclaim = globalScene.add.sprite(0, 0, "encounter_exclaim"); encounterExclaim.setPosition(34, 26); encounterExclaim.setScale(0.65); - const subSprite = this.scene.add.sprite(56, -106, "pkmn__sub"); + const subSprite = globalScene.add.sprite(56, -106, "pkmn__sub"); subSprite.setScale(0.65); subSprite.setPosition(34, 46); - const mysteryEncounterTitle = i18next.t(this.scene.getMysteryEncounter(this.runInfo.mysteryEncounterType as MysteryEncounterType, true).localizationKey + ":title"); - const descContainer = this.scene.add.container(0, 0); - const textBox = addTextObject(this.scene, 0, 0, mysteryEncounterTitle, TextStyle.WINDOW, { fontSize : "45px", wordWrap: { width: 160 }}); + const mysteryEncounterTitle = i18next.t( + globalScene.getMysteryEncounter(this.runInfo.mysteryEncounterType as MysteryEncounterType, true) + .localizationKey + ":title", + ); + const descContainer = globalScene.add.container(0, 0); + const textBox = addTextObject(0, 0, mysteryEncounterTitle, TextStyle.WINDOW, { + fontSize: "45px", + wordWrap: { width: 160 }, + }); descContainer.add(textBox); descContainer.setPosition(47, 37); - this.runResultContainer.add([ encounterExclaim, subSprite, descContainer ]); + 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( + windowCenterX, + 5, + `${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, + TextStyle.WINDOW, + { fontSize: "60px", lineSpacing: 0.1 }, + ); + runStatusText.setOrigin(0.5, 0); + + const currentBiomeText = addTextObject( + 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); } @@ -311,16 +399,22 @@ export default class RunInfoUiHandler extends UiHandler { * @param enemyContainer - container holding enemy visual and level information */ private parseWildSingleDefeat(enemyContainer: Phaser.GameObjects.Container) { - const enemyIconContainer = this.scene.add.container(0, 0); + const enemyIconContainer = globalScene.add.container(0, 0); const enemyData = this.runInfo.enemyParty[0]; const bossStatus = enemyData.boss; enemyData.boss = false; enemyData["player"] = true; //addPokemonIcon() throws an error if the Pokemon used is a boss - const enemy = enemyData.toPokemon(this.scene); - const enemyIcon = this.scene.addPokemonIcon(enemy, 0, 0, 0, 0); + const enemy = enemyData.toPokemon(); + const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); const enemyLevelStyle = bossStatus ? TextStyle.PARTY_RED : TextStyle.PARTY; - const enemyLevel = addTextObject(this.scene, 36, 26, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, enemyLevelStyle, { fontSize: "44px", color: "#f8f8f8" }); + const enemyLevel = addTextObject( + 36, + 26, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, + enemyLevelStyle, + { fontSize: "44px", color: "#f8f8f8" }, + ); enemyLevel.setShadow(0, 0, undefined); enemyLevel.setStroke("#424242", 14); enemyLevel.setOrigin(1, 0); @@ -338,13 +432,19 @@ export default class RunInfoUiHandler extends UiHandler { */ private parseWildDoubleDefeat(enemyContainer: Phaser.GameObjects.Container) { this.runInfo.enemyParty.forEach((enemyData, e) => { - const enemyIconContainer = this.scene.add.container(0, 0); + const enemyIconContainer = globalScene.add.container(0, 0); const bossStatus = enemyData.boss; enemyData.boss = false; enemyData["player"] = true; - const enemy = enemyData.toPokemon(this.scene); - const enemyIcon = this.scene.addPokemonIcon(enemy, 0, 0, 0, 0); - const enemyLevel = addTextObject(this.scene, 36, 26, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, bossStatus ? TextStyle.PARTY_RED : TextStyle.PARTY, { fontSize: "44px", color: "#f8f8f8" }); + const enemy = enemyData.toPokemon(); + const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); + const enemyLevel = addTextObject( + 36, + 26, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, + bossStatus ? TextStyle.PARTY_RED : TextStyle.PARTY, + { fontSize: "44px", color: "#f8f8f8" }, + ); enemyLevel.setShadow(0, 0, undefined); enemyLevel.setStroke("#424242", 14); enemyLevel.setOrigin(1, 0); @@ -364,20 +464,20 @@ export default class RunInfoUiHandler extends UiHandler { */ private showTrainerSprites(enemyContainer: Phaser.GameObjects.Container) { // Creating the trainer sprite and adding it to enemyContainer - const tObj = this.runInfo.trainer.toTrainer(this.scene); + const tObj = this.runInfo.trainer.toTrainer(); // Loads trainer assets on demand, as they are not loaded by default in the scene - tObj.config.loadAssets(this.scene, this.runInfo.trainer.variant).then(() => { + tObj.config.loadAssets(this.runInfo.trainer.variant).then(() => { const tObjSpriteKey = tObj.config.getSpriteKey(this.runInfo.trainer.variant === TrainerVariant.FEMALE, false); - const tObjSprite = this.scene.add.sprite(0, 5, tObjSpriteKey); + const tObjSprite = globalScene.add.sprite(0, 5, tObjSpriteKey); if (this.runInfo.trainer.variant === TrainerVariant.DOUBLE && !tObj.config.doubleOnly) { - const doubleContainer = this.scene.add.container(5, 8); + const doubleContainer = globalScene.add.container(5, 8); tObjSprite.setPosition(-3, -3); const tObjPartnerSpriteKey = tObj.config.getSpriteKey(true, true); - const tObjPartnerSprite = this.scene.add.sprite(5, -3, tObjPartnerSpriteKey); + const tObjPartnerSprite = globalScene.add.sprite(5, -3, tObjPartnerSpriteKey); // Double Trainers have smaller sprites than Single Trainers if (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) { - tObjPartnerSprite.setScale(0.20); - tObjSprite.setScale(0.20); + tObjPartnerSprite.setScale(0.2); + tObjSprite.setScale(0.2); doubleContainer.add(tObjSprite); doubleContainer.add(tObjPartnerSprite); doubleContainer.setPosition(12, 38); @@ -385,13 +485,13 @@ export default class RunInfoUiHandler extends UiHandler { tObjSprite.setScale(0.55); tObjSprite.setPosition(-9, -3); tObjPartnerSprite.setScale(0.55); - doubleContainer.add([ tObjSprite, tObjPartnerSprite ]); - doubleContainer.setPosition(28, 40); + doubleContainer.add([tObjSprite, tObjPartnerSprite]); + 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); @@ -410,44 +510,27 @@ export default class RunInfoUiHandler extends UiHandler { private parseTrainerDefeat(enemyContainer: Phaser.GameObjects.Container) { // Loads and adds trainer sprites to the UI this.showTrainerSprites(enemyContainer); - // Determining which Terastallize Modifier belongs to which Pokemon - // Creates a dictionary {PokemonId: TeraShardType} - const teraPokemon = {}; - this.runInfo.enemyModifiers.forEach((m) => { - const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]); - if (modifier instanceof Modifier.TerastallizeModifier) { - const teraDetails = modifier?.getArgs(); - const pkmnId = teraDetails[0]; - teraPokemon[pkmnId] = teraDetails[1]; - } - }); // Creates the Pokemon icons + level information and adds it to enemyContainer // 2 Rows x 3 Columns - const enemyPartyContainer = this.scene.add.container(0, 0); + const enemyPartyContainer = globalScene.add.container(0, 0); this.runInfo.enemyParty.forEach((enemyData, e) => { const pokemonRowHeight = Math.floor(e / 3); - const enemyIconContainer = this.scene.add.container(0, 0); + const enemyIconContainer = globalScene.add.container(0, 0); enemyIconContainer.setScale(0.6); const isBoss = enemyData.boss; enemyData.boss = false; enemyData["player"] = true; - const enemy = enemyData.toPokemon(this.scene); - const enemyIcon = this.scene.addPokemonIcon(enemy, 0, 0, 0, 0); - // Applying Terastallizing Type tint to Pokemon icon - // If the Pokemon is a fusion, it has two sprites and so, the tint has to be applied to each icon separately - const enemySprite1 = enemyIcon.list[0] as Phaser.GameObjects.Sprite; - const enemySprite2 = (enemyIcon.list.length > 1) ? enemyIcon.list[1] as Phaser.GameObjects.Sprite : undefined; - if (teraPokemon[enemyData.id]) { - const teraTint = getTypeRgb(teraPokemon[enemyData.id]); - const teraColor = new Phaser.Display.Color(teraTint[0], teraTint[1], teraTint[2]); - enemySprite1.setTint(teraColor.color); - if (enemySprite2) { - enemySprite2.setTint(teraColor.color); - } - } - enemyIcon.setPosition(39 * (e % 3) + 5, (35 * pokemonRowHeight)); - const enemyLevel = addTextObject(this.scene, 43 * (e % 3), (27 * (pokemonRowHeight + 1)), `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, isBoss ? TextStyle.PARTY_RED : TextStyle.PARTY, { fontSize: "54px" }); + const enemy = enemyData.toPokemon(); + const enemyIcon = globalScene.addPokemonIcon(enemy, 0, 0, 0, 0); + enemyIcon.setPosition(39 * (e % 3) + 5, 35 * pokemonRowHeight); + const enemyLevel = addTextObject( + 43 * (e % 3), + 27 * (pokemonRowHeight + 1), + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(enemy.level, 1000)}`, + isBoss ? TextStyle.PARTY_RED : TextStyle.PARTY, + { fontSize: "54px" }, + ); enemyLevel.setShadow(0, 0, undefined); enemyLevel.setStroke("#424242", 14); enemyLevel.setOrigin(0, 0); @@ -470,7 +553,10 @@ export default class RunInfoUiHandler extends UiHandler { private async parseRunInfo(windowX: number, windowY: number) { // Parsing and displaying the mode. // In the future, parsing Challenges + Challenge Rules may have to be reworked as PokeRogue adds additional challenges and users can stack these challenges in various ways. - const modeText = addBBCodeTextObject(this.scene, 7, 0, "", TextStyle.WINDOW, { fontSize : "50px", lineSpacing:3 }); + const modeText = addBBCodeTextObject(7, 0, "", TextStyle.WINDOW, { + fontSize: "50px", + lineSpacing: 3, + }); modeText.setPosition(7, 5); modeText.appendText(i18next.t("runHistory:mode") + ": ", false); switch (this.runInfo.gameMode) { @@ -504,29 +590,46 @@ export default class RunInfoUiHandler extends UiHandler { } // If the player achieves a personal best in Endless, the mode text will be tinted similarly to SSS luck to celebrate their achievement. - if ((this.runInfo.gameMode === GameModes.ENDLESS || this.runInfo.gameMode === GameModes.SPLICED_ENDLESS) && this.runInfo.waveIndex === this.scene.gameData.gameStats.highestEndlessWave) { + if ( + (this.runInfo.gameMode === GameModes.ENDLESS || this.runInfo.gameMode === GameModes.SPLICED_ENDLESS) && + this.runInfo.waveIndex === globalScene.gameData.gameStats.highestEndlessWave + ) { modeText.appendText(` [${i18next.t("runHistory:personalBest")}]`); modeText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); } // Duration + Money - const runInfoTextContainer = this.scene.add.container(0, 0); + const runInfoTextContainer = globalScene.add.container(0, 0); // Japanese is set to a greater line spacing of 35px in addBBCodeTextObject() if lineSpacing < 12. - const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3; - const runInfoText = addBBCodeTextObject(this.scene, 7, 0, "", TextStyle.WINDOW, { fontSize: "50px", lineSpacing: lineSpacing }); + const lineSpacing = i18next.resolvedLanguage === "ja" ? 12 : 3; + const runInfoText = addBBCodeTextObject(7, 0, "", TextStyle.WINDOW, { + fontSize: "50px", + lineSpacing: lineSpacing, + }); const runTime = Utils.getPlayTimeString(this.runInfo.playTime); runInfoText.appendText(`${i18next.t("runHistory:runLength")}: ${runTime}`, false); - const runMoney = Utils.formatMoney(this.scene.moneyFormat, this.runInfo.money); - runInfoText.appendText(`[color=${getTextColor(TextStyle.MONEY)}]${i18next.t("battleScene:moneyOwned", { formattedMoney : runMoney })}[/color]`); + const runMoney = Utils.formatMoney(globalScene.moneyFormat, this.runInfo.money); + const moneyTextColor = getTextColor(TextStyle.MONEY_WINDOW, false, globalScene.uiTheme); + runInfoText.appendText( + `[color=${moneyTextColor}]${i18next.t("battleScene:moneyOwned", { formattedMoney: runMoney })}[/color]`, + ); runInfoText.setPosition(7, 70); runInfoTextContainer.add(runInfoText); // Luck // Uses the parameters windowX and windowY to dynamically position the luck value neatly into the bottom right corner - const luckText = addBBCodeTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, { fontSize: "55px" }); - const luckValue = Phaser.Math.Clamp(this.runInfo.party.map(p => p.toPokemon(this.scene).getLuck()).reduce((total: integer, value: integer) => total += value, 0), 0, 14); + const luckText = addBBCodeTextObject(0, 0, "", TextStyle.WINDOW, { + fontSize: "55px", + }); + const luckValue = Phaser.Math.Clamp( + this.runInfo.party + .map(p => p.toPokemon().getLuck()) + .reduce((total: number, value: number) => (total += value), 0), + 0, + 14, + ); let luckInfo = i18next.t("runHistory:luck") + ": " + getLuckString(luckValue); if (luckValue < 14) { - luckInfo = "[color=#" + (getLuckTextTint(luckValue)).toString(16) + "]" + luckInfo + "[/color]"; + luckInfo = "[color=#" + getLuckTextTint(luckValue).toString(16) + "]" + luckInfo + "[/color]"; } else { luckText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); } @@ -539,22 +642,25 @@ export default class RunInfoUiHandler extends UiHandler { if (this.runInfo.modifiers.length) { let visibleModifierIndex = 0; - const modifierIconsContainer = this.scene.add.container(8, (this.runInfo.gameMode === GameModes.CHALLENGE) ? 20 : 15); + const modifierIconsContainer = globalScene.add.container( + 8, + this.runInfo.gameMode === GameModes.CHALLENGE ? 20 : 15, + ); modifierIconsContainer.setScale(0.45); for (const m of this.runInfo.modifiers) { - const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]); + const modifier = m.toModifier(this.modifiersModule[m.className]); if (modifier instanceof Modifier.PokemonHeldItemModifier) { continue; } - const icon = modifier?.getIcon(this.scene, false); + const icon = modifier?.getIcon(false); if (icon) { const rowHeightModifier = Math.floor(visibleModifierIndex / 7); - icon.setPosition(24 * (visibleModifierIndex % 7), 20 + (35 * rowHeightModifier)); + icon.setPosition(24 * (visibleModifierIndex % 7), 20 + 35 * rowHeightModifier); modifierIconsContainer.add(icon); } if (++visibleModifierIndex === 20) { - const maxItems = addTextObject(this.scene, 45, 90, "+", TextStyle.WINDOW); + const maxItems = addTextObject(45, 90, "+", TextStyle.WINDOW); maxItems.setPositionRelative(modifierIconsContainer, 70, 45); this.runInfoContainer.add(maxItems); break; @@ -581,17 +687,21 @@ export default class RunInfoUiHandler extends UiHandler { rules.push(i18next.t(`runHistory:challengeMonoGen${this.runInfo.challenges[i].value}`)); break; case Challenges.SINGLE_TYPE: - const typeRule = Type[this.runInfo.challenges[i].value - 1]; + const typeRule = PokemonType[this.runInfo.challenges[i].value - 1]; const typeTextColor = `[color=${TypeColor[typeRule]}]`; const typeShadowColor = `[shadow=${TypeShadow[typeRule]}]`; - const typeText = typeTextColor + typeShadowColor + i18next.t(`pokemonInfo:Type.${typeRule}`)! + "[/color]" + "[/shadow]"; + const typeText = + typeTextColor + typeShadowColor + i18next.t(`pokemonInfo:Type.${typeRule}`)! + "[/color]" + "[/shadow]"; rules.push(typeText); break; case Challenges.INVERSE_BATTLE: rules.push(i18next.t("challenges:inverseBattle.shortName")); break; default: - const localisationKey = Challenges[this.runInfo.challenges[i].id].split("_").map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + const localisationKey = Challenges[this.runInfo.challenges[i].id] + .split("_") + .map((f, i) => (i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase())) + .join(""); rules.push(i18next.t(`challenges:${localisationKey}.name`)); break; } @@ -605,36 +715,38 @@ export default class RunInfoUiHandler extends UiHandler { * Default Information: Icon, Level, Nature, Ability, Passive, Shiny Status, Fusion Status, Stats, and Moves. * B-Side Information: Icon + Held Items (Can be displayed to the user through pressing the abilityButton) */ - private parsePartyInfo(): void { + private parsePartyInfo(): void { const party = this.runInfo.party; const currentLanguage = i18next.resolvedLanguage ?? "en"; - const windowHeight = ((this.scene.game.canvas.height / 6) - 23) / 6; + const windowHeight = (globalScene.game.canvas.height / 6 - 23) / 6; - party.forEach((p: PokemonData, i: integer) => { - const pokemonInfoWindow = new RoundRectangle(this.scene, 0, 14, (this.statsBgWidth * 2) + 10, windowHeight - 2, 3); + party.forEach((p: PokemonData, i: number) => { + const pokemonInfoWindow = new RoundRectangle(globalScene, 0, 14, this.statsBgWidth * 2 + 10, windowHeight - 2, 3); - const pokemon = p.toPokemon(this.scene); - const pokemonInfoContainer = this.scene.add.container(this.statsBgWidth + 5, (windowHeight - 0.5) * i); + const pokemon = p.toPokemon(); + const pokemonInfoContainer = globalScene.add.container(this.statsBgWidth + 5, (windowHeight - 0.5) * i); - const types = pokemon.getTypes(); - const type1 = getTypeRgb(types[0]); - const type1Color = new Phaser.Display.Color(type1[0], type1[1], type1[2]); + const types = pokemon.getTypes(); + const type1 = getTypeRgb(types[0]); + const type1Color = new Phaser.Display.Color(type1[0], type1[1], type1[2]); - const bgColor = type1Color.clone().darken(45); + const bgColor = type1Color.clone().darken(45); pokemonInfoWindow.setFillStyle(bgColor.color); - const iconContainer = this.scene.add.container(0, 0); - const icon = this.scene.addPokemonIcon(pokemon, 0, 0, 0, 0); + const iconContainer = globalScene.add.container(0, 0); + const icon = globalScene.addPokemonIcon(pokemon, 0, 0, 0, 0); icon.setScale(0.75); icon.setPosition(-99, 1); const type2 = types[1] ? getTypeRgb(types[1]) : undefined; const type2Color = type2 ? new Phaser.Display.Color(type2[0], type2[1], type2[2]) : undefined; - type2Color ? pokemonInfoWindow.setStrokeStyle(1, type2Color.color, 0.95) : pokemonInfoWindow.setStrokeStyle(1, type1Color.color, 0.95); + type2Color + ? pokemonInfoWindow.setStrokeStyle(1, type2Color.color, 0.95) + : pokemonInfoWindow.setStrokeStyle(1, type1Color.color, 0.95); this.getUi().bringToTop(icon); // Contains Name, Level + Nature, Ability, Passive - const pokeInfoTextContainer = this.scene.add.container(-85, 3.5); + const pokeInfoTextContainer = globalScene.add.container(-85, 3.5); const textContainerFontSize = "34px"; // This checks if the Pokemon's nature has been overwritten during the run and displays the change accurately const pNature = pokemon.getNature(); @@ -642,7 +754,7 @@ export default class RunInfoUiHandler extends UiHandler { const pName = pokemon.getNameToRender(); //With the exception of Korean/Traditional Chinese/Simplified Chinese, the code shortens the terms for ability and passive to their first letter. //These languages are exempted because they are already short enough. - const exemptedLanguages = [ "ko", "zh_CN", "zh_TW" ]; + const exemptedLanguages = ["ko", "zh_CN", "zh_TW"]; let passiveLabel = i18next.t("starterSelectUiHandler:passive") ?? "-"; let abilityLabel = i18next.t("starterSelectUiHandler:ability") ?? "-"; if (!exemptedLanguages.includes(currentLanguage)) { @@ -652,54 +764,70 @@ export default class RunInfoUiHandler extends UiHandler { const pPassiveInfo = pokemon.passive ? passiveLabel + ": " + pokemon.getPassiveAbility().name : ""; const pAbilityInfo = abilityLabel + ": " + pokemon.getAbility().name; // Japanese is set to a greater line spacing of 35px in addBBCodeTextObject() if lineSpacing < 12. - const lineSpacing = (i18next.resolvedLanguage === "ja") ? 12 : 3; - const pokeInfoText = addBBCodeTextObject(this.scene, 0, 0, pName, TextStyle.SUMMARY, { fontSize: textContainerFontSize, lineSpacing: lineSpacing }); - pokeInfoText.appendText(`${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatFancyLargeNumber(pokemon.level, 1)} - ${pNatureName}`); + const lineSpacing = i18next.resolvedLanguage === "ja" ? 12 : 3; + const pokeInfoText = addBBCodeTextObject(0, 0, pName, TextStyle.SUMMARY, { + fontSize: textContainerFontSize, + lineSpacing: lineSpacing, + }); + pokeInfoText.appendText( + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatFancyLargeNumber(pokemon.level, 1)} - ${pNatureName}`, + ); pokeInfoText.appendText(pAbilityInfo); pokeInfoText.appendText(pPassiveInfo); pokeInfoTextContainer.add(pokeInfoText); // Pokemon Stats // Colored Arrows (Red/Blue) are placed by stats that are boosted from natures - const pokeStatTextContainer = this.scene.add.container(-35, 6); - const pStats : string[] = []; - pokemon.stats.forEach((element) => pStats.push(Utils.formatFancyLargeNumber(element, 1))); + const pokeStatTextContainer = globalScene.add.container(-35, 6); + const pStats: string[] = []; + pokemon.stats.forEach(element => pStats.push(Utils.formatFancyLargeNumber(element, 1))); for (let i = 0; i < pStats.length; i++) { const isMult = getNatureStatMultiplier(pNature, i); - pStats[i] = (isMult < 1) ? pStats[i] + "[color=#40c8f8]↓[/color]" : pStats[i]; - pStats[i] = (isMult > 1) ? pStats[i] + "[color=#f89890]↑[/color]" : pStats[i]; + pStats[i] = isMult < 1 ? pStats[i] + "[color=#40c8f8]↓[/color]" : pStats[i]; + pStats[i] = isMult > 1 ? pStats[i] + "[color=#f89890]↑[/color]" : pStats[i]; } const hp = i18next.t("pokemonInfo:Stat.HPshortened") + ": " + pStats[0]; const atk = i18next.t("pokemonInfo:Stat.ATKshortened") + ": " + pStats[1]; const def = i18next.t("pokemonInfo:Stat.DEFshortened") + ": " + pStats[2]; const spatk = i18next.t("pokemonInfo:Stat.SPATKshortened") + ": " + pStats[3]; const spdef = i18next.t("pokemonInfo:Stat.SPDEFshortened") + ": " + pStats[4]; - const speedLabel = (currentLanguage === "es" || currentLanguage === "pt_BR") ? i18next.t("runHistory:SPDshortened") : i18next.t("pokemonInfo:Stat.SPDshortened"); + const speedLabel = + currentLanguage === "es-ES" || currentLanguage === "pt_BR" + ? i18next.t("runHistory:SPDshortened") + : i18next.t("pokemonInfo:Stat.SPDshortened"); const speed = speedLabel + ": " + pStats[5]; // Column 1: HP Atk Def - const pokeStatText1 = addBBCodeTextObject(this.scene, -5, 0, hp, TextStyle.SUMMARY, { fontSize: textContainerFontSize, lineSpacing: lineSpacing }); + const pokeStatText1 = addBBCodeTextObject(-5, 0, hp, TextStyle.SUMMARY, { + fontSize: textContainerFontSize, + lineSpacing: lineSpacing, + }); pokeStatText1.appendText(atk); pokeStatText1.appendText(def); pokeStatTextContainer.add(pokeStatText1); // Column 2: SpAtk SpDef Speed - const pokeStatText2 = addBBCodeTextObject(this.scene, 25, 0, spatk, TextStyle.SUMMARY, { fontSize: textContainerFontSize, lineSpacing: lineSpacing }); + const pokeStatText2 = addBBCodeTextObject(25, 0, spatk, TextStyle.SUMMARY, { + fontSize: textContainerFontSize, + lineSpacing: lineSpacing, + }); pokeStatText2.appendText(spdef); pokeStatText2.appendText(speed); pokeStatTextContainer.add(pokeStatText2); // Shiny + Fusion Status - const marksContainer = this.scene.add.container(0, 0); + const marksContainer = globalScene.add.container(0, 0); if (pokemon.fusionSpecies) { - const splicedIcon = this.scene.add.image(0, 0, "icon_spliced"); + const splicedIcon = globalScene.add.image(0, 0, "icon_spliced"); splicedIcon.setScale(0.35); splicedIcon.setOrigin(0, 0); - pokemon.isShiny() ? splicedIcon.setPositionRelative(pokeInfoTextContainer, 35, 0) : splicedIcon.setPositionRelative(pokeInfoTextContainer, 28, 0); + pokemon.isShiny() + ? splicedIcon.setPositionRelative(pokeInfoTextContainer, 35, 0) + : splicedIcon.setPositionRelative(pokeInfoTextContainer, 28, 0); marksContainer.add(splicedIcon); this.getUi().bringToTop(splicedIcon); } if (pokemon.isShiny()) { const doubleShiny = pokemon.isFusion() && pokemon.shiny && pokemon.fusionShiny; - const shinyStar = this.scene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`); + const shinyStar = globalScene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`); shinyStar.setOrigin(0, 0); shinyStar.setScale(0.65); shinyStar.setPositionRelative(pokeInfoTextContainer, 28, 0); @@ -707,7 +835,7 @@ export default class RunInfoUiHandler extends UiHandler { marksContainer.add(shinyStar); this.getUi().bringToTop(shinyStar); if (doubleShiny) { - const fusionShinyStar = this.scene.add.image(0, 0, "shiny_star_small_2"); + const fusionShinyStar = globalScene.add.image(0, 0, "shiny_star_small_2"); fusionShinyStar.setOrigin(0, 0); fusionShinyStar.setScale(0.5); fusionShinyStar.setPosition(shinyStar.x + 1, shinyStar.y + 1); @@ -720,36 +848,42 @@ export default class RunInfoUiHandler extends UiHandler { // Pokemon Moveset // Need to check if dynamically typed moves const pokemonMoveset = pokemon.getMoveset(); - const movesetContainer = this.scene.add.container(70, -29); - const pokemonMoveBgs : Phaser.GameObjects.NineSlice[] = []; - const pokemonMoveLabels : Phaser.GameObjects.Text[] = []; - const movePos = [[ -6.5, 35.5 ], [ 37, 35.5 ], [ -6.5, 43.5 ], [ 37, 43.5 ]]; + const movesetContainer = globalScene.add.container(70, -29); + const pokemonMoveBgs: Phaser.GameObjects.NineSlice[] = []; + const pokemonMoveLabels: Phaser.GameObjects.Text[] = []; + const movePos = [ + [-6.5, 35.5], + [37, 35.5], + [-6.5, 43.5], + [37, 43.5], + ]; for (let m = 0; m < pokemonMoveset?.length; m++) { - const moveContainer = this.scene.add.container(movePos[m][0], movePos[m][1]); + const moveContainer = globalScene.add.container(movePos[m][0], movePos[m][1]); moveContainer.setScale(0.5); - const moveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 85, 15, 2, 2, 2, 2); - moveBg.setOrigin(1, 0); - const moveLabel = addTextObject(this.scene, -moveBg.width / 2, 2, "-", TextStyle.PARTY); - moveLabel.setOrigin(0.5, 0); - moveLabel.setName("text-move-label"); - pokemonMoveBgs.push(moveBg); - pokemonMoveLabels.push(moveLabel); - moveContainer.add(moveBg); - moveContainer.add(moveLabel); - movesetContainer.add(moveContainer); - const move = pokemonMoveset[m]?.getMove(); - pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); + const moveBg = globalScene.add.nineslice(0, 0, "type_bgs", "unknown", 85, 15, 2, 2, 2, 2); + moveBg.setOrigin(1, 0); + const moveLabel = addTextObject(-moveBg.width / 2, 2, "-", TextStyle.PARTY); + moveLabel.setOrigin(0.5, 0); + moveLabel.setName("text-move-label"); + pokemonMoveBgs.push(moveBg); + pokemonMoveLabels.push(moveLabel); + moveContainer.add(moveBg); + moveContainer.add(moveLabel); + movesetContainer.add(moveContainer); + const move = pokemonMoveset[m]?.getMove(); + pokemonMoveBgs[m].setFrame(PokemonType[move ? move.type : PokemonType.UNKNOWN].toString().toLowerCase()); pokemonMoveLabels[m].setText(move ? move.name : "-"); - } + } // Pokemon Held Items - not displayed by default // Endless/Endless Spliced have a different scale because Pokemon tend to accumulate more items in these runs. - const heldItemsScale = (this.runInfo.gameMode === GameModes.SPLICED_ENDLESS || this.runInfo.gameMode === GameModes.ENDLESS) ? 0.25 : 0.5; - const heldItemsContainer = this.scene.add.container(-82, 2); - const heldItemsList : Modifier.PokemonHeldItemModifier[] = []; + const heldItemsScale = + this.runInfo.gameMode === GameModes.SPLICED_ENDLESS || this.runInfo.gameMode === GameModes.ENDLESS ? 0.25 : 0.5; + const heldItemsContainer = globalScene.add.container(-82, 2); + const heldItemsList: Modifier.PokemonHeldItemModifier[] = []; if (this.runInfo.modifiers.length) { for (const m of this.runInfo.modifiers) { - const modifier = m.toModifier(this.scene, this.modifiersModule[m.className]); + const modifier = m.toModifier(this.modifiersModule[m.className]); if (modifier instanceof Modifier.PokemonHeldItemModifier && modifier.pokemonId === pokemon.id) { modifier.stackCount = m["stackCount"]; heldItemsList.push(modifier); @@ -758,14 +892,17 @@ export default class RunInfoUiHandler extends UiHandler { if (heldItemsList.length > 0) { (heldItemsList as Modifier.PokemonHeldItemModifier[]).sort(Modifier.modifierSortFunc); let row = 0; - for (const [ index, item ] of heldItemsList.entries()) { - if ( index > 36 ) { - const overflowIcon = addTextObject(this.scene, 182, 4, "+", TextStyle.WINDOW); + for (const [index, item] of heldItemsList.entries()) { + if (index > 36) { + const overflowIcon = addTextObject(182, 4, "+", TextStyle.WINDOW); heldItemsContainer.add(overflowIcon); break; } - const itemIcon = item?.getIcon(this.scene, true); - if (item?.stackCount < item?.getMaxHeldItemCount(pokemon) && itemIcon.list[1] instanceof Phaser.GameObjects.BitmapText) { + const itemIcon = item?.getIcon(true); + if ( + item?.stackCount < item?.getMaxHeldItemCount(pokemon) && + itemIcon.list[1] instanceof Phaser.GameObjects.BitmapText + ) { itemIcon.list[1].clearTint(); } itemIcon.setScale(heldItemsScale); @@ -796,9 +933,9 @@ export default class RunInfoUiHandler extends UiHandler { pokemonInfoContainer.setName("PkmnInfo"); this.partyContainer.add(pokemonInfoContainer); pokemon.destroy(); - }); + }); this.runContainer.add(this.partyContainer); - } + } /** * Changes what is displayed of the Pokemon's held items @@ -822,13 +959,19 @@ export default class RunInfoUiHandler extends UiHandler { * Shows the ending art. */ private createVictorySplash(): void { - this.endCardContainer = this.scene.add.container(0, 0); - const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + this.endCardContainer = globalScene.add.container(0, 0); + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const isFemale = genderIndex === PlayerGender.FEMALE; - const endCard = this.scene.add.image(0, 0, `end_${isFemale ? "f" : "m"}`); + const endCard = globalScene.add.image(0, 0, `end_${isFemale ? "f" : "m"}`); endCard.setOrigin(0); endCard.setScale(0.5); - const text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, i18next.t("battle:congratulations"), TextStyle.SUMMARY, { fontSize: "128px" }); + const text = addTextObject( + globalScene.game.canvas.width / 12, + globalScene.game.canvas.height / 6 - 16, + i18next.t("battle:congratulations"), + TextStyle.SUMMARY, + { fontSize: "128px" }, + ); text.setOrigin(0.5); this.endCardContainer.add(endCard); this.endCardContainer.add(text); @@ -839,45 +982,53 @@ export default class RunInfoUiHandler extends UiHandler { * This could be adapted into a public-facing method for victory screens. Perhaps. */ private createHallofFame(): void { - const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const isFemale = genderIndex === PlayerGender.FEMALE; const genderStr = PlayerGender[genderIndex].toLowerCase(); // Issue Note (08-05-2024): It seems as if fused pokemon do not appear with the averaged color b/c pokemonData's loadAsset requires there to be some active battle? // As an alternative, the icons of the second/bottom fused Pokemon have been placed next to their fellow fused Pokemon in Hall of Fame - this.hallofFameContainer = this.scene.add.container(0, 0); + this.hallofFameContainer = globalScene.add.container(0, 0); // Thank you Hayuna for the code - const endCard = this.scene.add.image(0, 0, `end_${isFemale ? "f" : "m"}`); + const endCard = globalScene.add.image(0, 0, `end_${isFemale ? "f" : "m"}`); endCard.setOrigin(0); endCard.setPosition(-1, -1); endCard.setScale(0.5); const endCardCoords = endCard.getBottomCenter(); const overlayColor = isFemale ? "red" : "blue"; - const hallofFameBg = this.scene.add.image(0, 0, "hall_of_fame_" + overlayColor); + const hallofFameBg = globalScene.add.image(0, 0, "hall_of_fame_" + overlayColor); hallofFameBg.setPosition(159, 89); - hallofFameBg.setSize(this.scene.game.canvas.width, this.scene.game.canvas.height + 10); + hallofFameBg.setSize(globalScene.game.canvas.width, globalScene.game.canvas.height + 10); hallofFameBg.setAlpha(0.8); this.hallofFameContainer.add(endCard); this.hallofFameContainer.add(hallofFameBg); - const hallofFameText = addTextObject(this.scene, 0, 0, i18next.t("runHistory:hallofFameText", { context: genderStr }), TextStyle.WINDOW); - hallofFameText.setPosition(endCardCoords.x - (hallofFameText.displayWidth / 2), 164); + const hallofFameText = addTextObject( + 0, + 0, + i18next.t("runHistory:hallofFameText", { context: genderStr }), + TextStyle.WINDOW, + ); + hallofFameText.setPosition(endCardCoords.x - hallofFameText.displayWidth / 2, 164); this.hallofFameContainer.add(hallofFameText); this.runInfo.party.forEach((p, i) => { - const pkmn = p.toPokemon(this.scene); + const pkmn = p.toPokemon(); const row = i % 2; const id = pkmn.id; const shiny = pkmn.shiny; const formIndex = pkmn.formIndex; const variant = pkmn.variant; const species = pkmn.getSpeciesForm(); - const pokemonSprite: Phaser.GameObjects.Sprite = this.scene.add.sprite(60 + 40 * i, 40 + row * 80, "pkmn__sub"); - pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + const pokemonSprite: Phaser.GameObjects.Sprite = globalScene.add.sprite(60 + 40 * i, 40 + row * 80, "pkmn__sub"); + pokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); this.hallofFameContainer.add(pokemonSprite); const speciesLoaded: Map = new Map(); speciesLoaded.set(id, false); const female = pkmn.gender === 1; - species.loadAssets(this.scene, female, formIndex, shiny, variant, true).then(() => { + species.loadAssets(female, formIndex, shiny, variant, true).then(() => { speciesLoaded.set(id, true); pokemonSprite.play(species.getSpriteKey(female, formIndex, shiny, variant)); pokemonSprite.setPipelineData("shiny", shiny); @@ -886,7 +1037,7 @@ export default class RunInfoUiHandler extends UiHandler { pokemonSprite.setVisible(true); }); if (pkmn.isFusion()) { - const fusionIcon = this.scene.add.sprite(80 + 40 * i, 50 + row * 80, pkmn.getFusionIconAtlasKey()); + const fusionIcon = globalScene.add.sprite(80 + 40 * i, 50 + row * 80, pkmn.getFusionIconAtlasKey()); fusionIcon.setName("sprite-fusion-icon"); fusionIcon.setOrigin(0.5, 0); fusionIcon.setFrame(pkmn.getFusionIconId(true)); @@ -901,10 +1052,10 @@ export default class RunInfoUiHandler extends UiHandler { /** * Takes input from the user to perform a desired action. * @param button - Button object to be processed - * Button.CANCEL - removes all containers related to RunInfo and returns the user to Run History + * Button.CANCEL, Button.LEFT - removes all containers related to RunInfo and returns the user to Run History * Button.CYCLE_FORM, Button.CYCLE_SHINY, Button.CYCLE_ABILITY - runs the function buttonCycleOption() */ - override processInput(button: Button): boolean { + override processInput(button: Button): boolean { const ui = this.getUi(); let success = false; @@ -912,6 +1063,7 @@ export default class RunInfoUiHandler extends UiHandler { switch (button) { case Button.CANCEL: + case Button.LEFT: success = true; if (this.pageMode === RunInfoUiMode.MAIN) { this.runInfoContainer.removeAll(true); @@ -997,4 +1149,3 @@ export default class RunInfoUiHandler extends UiHandler { } } } - diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 7bfecb1f99b..a1e9e5219b4 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -1,10 +1,10 @@ import i18next from "i18next"; -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; import { GameMode } from "../game-mode"; import * as Modifier from "../modifier/modifier"; -import { SessionSaveData } from "../system/game-data"; -import PokemonData from "../system/pokemon-data"; +import type { SessionSaveData } from "../system/game-data"; +import type PokemonData from "../system/pokemon-data"; import * as Utils from "../utils"; import MessageUiHandler from "./message-ui-handler"; import { TextStyle, addTextObject } from "./text"; @@ -17,13 +17,12 @@ const SLOTS_ON_SCREEN = 3; export enum SaveSlotUiMode { LOAD, - SAVE + SAVE, } -export type SaveSlotSelectCallback = (cursor: integer) => void; +export type SaveSlotSelectCallback = (cursor: number) => void; export default class SaveSlotSelectUiHandler extends MessageUiHandler { - private saveSlotSelectContainer: Phaser.GameObjects.Container; private sessionSlotsContainer: Phaser.GameObjects.Container; private saveSlotSelectMessageBox: Phaser.GameObjects.NineSlice; @@ -33,41 +32,47 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { private uiMode: SaveSlotUiMode; private saveSlotSelectCallback: SaveSlotSelectCallback | null; - private scrollCursor: integer = 0; + private scrollCursor = 0; private cursorObj: Phaser.GameObjects.Container | null; private sessionSlotsContainerInitialY: number; - constructor(scene: BattleScene) { - super(scene, Mode.SAVE_SLOT); + constructor() { + super(Mode.SAVE_SLOT); } setup() { const ui = this.getUi(); - this.saveSlotSelectContainer = this.scene.add.container(0, 0); + this.saveSlotSelectContainer = globalScene.add.container(0, 0); this.saveSlotSelectContainer.setVisible(false); ui.add(this.saveSlotSelectContainer); - const loadSessionBg = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, -this.scene.game.canvas.height / 6, 0x006860); + const loadSessionBg = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + -globalScene.game.canvas.height / 6, + 0x006860, + ); loadSessionBg.setOrigin(0, 0); this.saveSlotSelectContainer.add(loadSessionBg); - this.sessionSlotsContainerInitialY = -this.scene.game.canvas.height / 6 + 8; + this.sessionSlotsContainerInitialY = -globalScene.game.canvas.height / 6 + 8; - this.sessionSlotsContainer = this.scene.add.container(8, this.sessionSlotsContainerInitialY); + this.sessionSlotsContainer = globalScene.add.container(8, this.sessionSlotsContainerInitialY); this.saveSlotSelectContainer.add(this.sessionSlotsContainer); - this.saveSlotSelectMessageBoxContainer = this.scene.add.container(0, 0); + this.saveSlotSelectMessageBoxContainer = globalScene.add.container(0, 0); this.saveSlotSelectMessageBoxContainer.setVisible(false); this.saveSlotSelectContainer.add(this.saveSlotSelectMessageBoxContainer); - this.saveSlotSelectMessageBox = addWindow(this.scene, 1, -1, 318, 28); + this.saveSlotSelectMessageBox = addWindow(1, -1, 318, 28); this.saveSlotSelectMessageBox.setOrigin(0, 1); this.saveSlotSelectMessageBoxContainer.add(this.saveSlotSelectMessageBox); - this.message = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + this.message = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); this.message.setOrigin(0, 0); this.saveSlotSelectMessageBoxContainer.add(this.message); @@ -75,7 +80,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } show(args: any[]): boolean { - if ((args.length < 2 || !(args[1] instanceof Function))) { + if (args.length < 2 || !(args[1] instanceof Function)) { return false; } @@ -108,31 +113,39 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { switch (this.uiMode) { case SaveSlotUiMode.LOAD: this.saveSlotSelectCallback = null; - originalCallback && originalCallback(cursor); + originalCallback?.(cursor); break; - case SaveSlotUiMode.SAVE: + case SaveSlotUiMode.SAVE: { const saveAndCallback = () => { const originalCallback = this.saveSlotSelectCallback; this.saveSlotSelectCallback = null; ui.revertMode(); ui.showText("", 0); ui.setMode(Mode.MESSAGE); - originalCallback && originalCallback(cursor); + originalCallback?.(cursor); }; if (this.sessionSlots[cursor].hasData) { ui.showText(i18next.t("saveSlotSelectUiHandler:overwriteData"), null, () => { - ui.setOverlayMode(Mode.CONFIRM, () => { - this.scene.gameData.deleteSession(cursor).then(response => { - if (response === false) { - this.scene.reset(true); - } else { - saveAndCallback(); - } - }); - }, () => { - ui.revertMode(); - ui.showText("", 0); - }, false, 0, 19, 2000); + ui.setOverlayMode( + Mode.CONFIRM, + () => { + globalScene.gameData.deleteSession(cursor).then(response => { + if (response === false) { + globalScene.reset(true); + } else { + saveAndCallback(); + } + }); + }, + () => { + ui.revertMode(); + ui.showText("", 0); + }, + false, + 0, + 19, + import.meta.env.DEV ? 300 : 2000, + ); }); } else if (this.sessionSlots[cursor].hasData === false) { saveAndCallback(); @@ -140,12 +153,13 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { return false; } break; + } } success = true; } } else { this.saveSlotSelectCallback = null; - originalCallback && originalCallback(-1); + originalCallback?.(-1); success = true; } } else { @@ -153,22 +167,40 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { switch (button) { case Button.UP: if (this.cursor) { - // Check to prevent cursor from accessing a negative index - success = (this.cursor === 0) ? this.setCursor(this.cursor) : this.setCursor(this.cursor - 1, cursorPosition); + // Check to prevent cursor from accessing a negative index + success = this.cursor === 0 ? this.setCursor(this.cursor) : this.setCursor(this.cursor - 1, cursorPosition); } else if (this.scrollCursor) { success = this.setScrollCursor(this.scrollCursor - 1, cursorPosition); + } else if (this.cursor === 0 && this.scrollCursor === 0) { + this.setScrollCursor(SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN); + // Revert to avoid an extra session slot sticking out + this.revertSessionSlot(SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN); + this.setCursor(SLOTS_ON_SCREEN - 1); + success = true; } break; case Button.DOWN: - if (this.cursor < (SLOTS_ON_SCREEN - 1)) { + if (this.cursor < SLOTS_ON_SCREEN - 1) { success = this.setCursor(this.cursor + 1, cursorPosition); } else if (this.scrollCursor < SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN) { success = this.setScrollCursor(this.scrollCursor + 1, cursorPosition); + } else if ( + this.cursor === SLOTS_ON_SCREEN - 1 && + this.scrollCursor === SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN + ) { + this.setScrollCursor(0); + this.revertSessionSlot(SLOTS_ON_SCREEN - 1); + this.setCursor(0); + success = true; } break; case Button.RIGHT: if (this.sessionSlots[cursorPosition].hasData && this.sessionSlots[cursorPosition].saveData) { - this.scene.ui.setOverlayMode(Mode.RUN_INFO, this.sessionSlots[cursorPosition].saveData, RunDisplayMode.SESSION_PREVIEW); + globalScene.ui.setOverlayMode( + Mode.RUN_INFO, + this.sessionSlots[cursorPosition].saveData, + RunDisplayMode.SESSION_PREVIEW, + ); success = true; } } @@ -185,21 +217,28 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { populateSessionSlots() { for (let s = 0; s < SESSION_SLOTS_COUNT; s++) { - const sessionSlot = new SessionSlot(this.scene, s); - this.scene.add.existing(sessionSlot); + const sessionSlot = new SessionSlot(s); + globalScene.add.existing(sessionSlot); this.sessionSlotsContainer.add(sessionSlot); this.sessionSlots.push(sessionSlot); - sessionSlot.load().then((success) => { + sessionSlot.load().then(success => { // If the cursor was moved to this slot while the session was loading // call setCursor again to shift the slot position and show the arrow for save preview - if (success && (this.cursor + this.scrollCursor) === s) { + if (success && this.cursor + this.scrollCursor === s) { this.setCursor(s); } }); } } - showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); if (text?.indexOf("\n") === -1) { @@ -219,16 +258,27 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { * @param prevSlotIndex index of the previous session occupied by the cursor, between `0` and `SESSION_SLOTS_COUNT - 1` - optional * @returns `true` if the cursor position has changed | `false` if it has not */ - override setCursor(cursor: integer, prevSlotIndex?: integer): boolean { + override setCursor(cursor: number, prevSlotIndex?: number): boolean { const changed = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.container(0, 0); - const cursorBox = this.scene.add.nineslice(0, 0, "select_cursor_highlight_thick", undefined, 296, 44, 6, 6, 6, 6); - const rightArrow = this.scene.add.image(0, 0, "cursor"); + this.cursorObj = globalScene.add.container(0, 0); + const cursorBox = globalScene.add.nineslice( + 0, + 0, + "select_cursor_highlight_thick", + undefined, + 296, + 44, + 6, + 6, + 6, + 6, + ); + const rightArrow = globalScene.add.image(0, 0, "cursor"); rightArrow.setPosition(160, 0); rightArrow.setName("rightArrow"); - this.cursorObj.add([ cursorBox, rightArrow ]); + this.cursorObj.add([cursorBox, rightArrow]); this.sessionSlotsContainer.add(this.cursorObj); } const cursorPosition = cursor + this.scrollCursor; @@ -256,7 +306,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { /** * Helper function that resets the given session slot to its default central position */ - revertSessionSlot(slotIndex: integer): void { + revertSessionSlot(slotIndex: number): void { const sessionSlot = this.sessionSlots[slotIndex]; if (sessionSlot) { sessionSlot.setPosition(0, slotIndex * 56); @@ -280,17 +330,17 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { * @param prevSlotIndex index of the previous slot occupied by the cursor, between `0` and `SESSION_SLOTS_COUNT-1` - optional * @returns `true` if the cursor position has changed | `false` if it has not */ - setScrollCursor(scrollCursor: integer, prevSlotIndex?: integer): boolean { + setScrollCursor(scrollCursor: number, prevSlotIndex?: number): boolean { const changed = scrollCursor !== this.scrollCursor; if (changed) { this.scrollCursor = scrollCursor; this.setCursor(this.cursor, prevSlotIndex); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.sessionSlotsContainer, y: this.sessionSlotsContainerInitialY - 56 * scrollCursor, duration: Utils.fixedInt(325), - ease: "Sine.easeInOut" + ease: "Sine.easeInOut", }); } @@ -320,14 +370,14 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } class SessionSlot extends Phaser.GameObjects.Container { - public slotId: integer; + public slotId: number; public hasData: boolean; private loadingLabel: Phaser.GameObjects.Text; public saveData: SessionSaveData; - constructor(scene: BattleScene, slotId: integer) { - super(scene, 0, slotId * 56); + constructor(slotId: number) { + super(globalScene, 0, slotId * 56); this.slotId = slotId; @@ -335,10 +385,10 @@ class SessionSlot extends Phaser.GameObjects.Container { } setup() { - const slotWindow = addWindow(this.scene, 0, 0, 304, 52); + const slotWindow = addWindow(0, 0, 304, 52); this.add(slotWindow); - this.loadingLabel = addTextObject(this.scene, 152, 26, i18next.t("saveSlotSelectUiHandler:loading"), TextStyle.WINDOW); + this.loadingLabel = addTextObject(152, 26, i18next.t("saveSlotSelectUiHandler:loading"), TextStyle.WINDOW); this.loadingLabel.setOrigin(0.5, 0.5); this.add(this.loadingLabel); } @@ -346,24 +396,35 @@ class SessionSlot extends Phaser.GameObjects.Container { async setupWithData(data: SessionSaveData) { this.remove(this.loadingLabel, true); - const gameModeLabel = addTextObject(this.scene, 8, 5, `${GameMode.getModeName(data.gameMode) || i18next.t("gameMode:unkown")} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${data.waveIndex}`, TextStyle.WINDOW); + const gameModeLabel = addTextObject( + 8, + 5, + `${GameMode.getModeName(data.gameMode) || i18next.t("gameMode:unkown")} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${data.waveIndex}`, + TextStyle.WINDOW, + ); this.add(gameModeLabel); - const timestampLabel = addTextObject(this.scene, 8, 19, new Date(data.timestamp).toLocaleString(), TextStyle.WINDOW); + const timestampLabel = addTextObject(8, 19, new Date(data.timestamp).toLocaleString(), TextStyle.WINDOW); this.add(timestampLabel); - const playTimeLabel = addTextObject(this.scene, 8, 33, Utils.getPlayTimeString(data.playTime), TextStyle.WINDOW); + const playTimeLabel = addTextObject(8, 33, Utils.getPlayTimeString(data.playTime), TextStyle.WINDOW); this.add(playTimeLabel); - const pokemonIconsContainer = this.scene.add.container(144, 4); - data.party.forEach((p: PokemonData, i: integer) => { - const iconContainer = this.scene.add.container(26 * i, 0); + const pokemonIconsContainer = globalScene.add.container(144, 4); + data.party.forEach((p: PokemonData, i: number) => { + const iconContainer = globalScene.add.container(26 * i, 0); iconContainer.setScale(0.75); - const pokemon = p.toPokemon(this.scene); - const icon = this.scene.addPokemonIcon(pokemon, 0, 0, 0, 0); + const pokemon = p.toPokemon(); + const icon = globalScene.addPokemonIcon(pokemon, 0, 0, 0, 0); - const text = addTextObject(this.scene, 32, 20, `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); + const text = addTextObject( + 32, + 20, + `${i18next.t("saveSlotSelectUiHandler:lv")}${Utils.formatLargeNumber(pokemon.level, 1000)}`, + TextStyle.PARTY, + { fontSize: "54px", color: "#f8f8f8" }, + ); text.setShadow(0, 0, undefined); text.setStroke("#424242", 14); text.setOrigin(1, 0); @@ -378,15 +439,15 @@ class SessionSlot extends Phaser.GameObjects.Container { this.add(pokemonIconsContainer); - const modifierIconsContainer = this.scene.add.container(148, 30); + const modifierIconsContainer = globalScene.add.container(148, 30); modifierIconsContainer.setScale(0.5); let visibleModifierIndex = 0; for (const m of data.modifiers) { - const modifier = m.toModifier(this.scene, Modifier[m.className]); + const modifier = m.toModifier(Modifier[m.className]); if (modifier instanceof Modifier.PokemonHeldItemModifier) { continue; } - const icon = modifier?.getIcon(this.scene, false); + const icon = modifier?.getIcon(false); if (icon) { icon.setPosition(24 * visibleModifierIndex, 0); modifierIconsContainer.add(icon); @@ -401,7 +462,7 @@ class SessionSlot extends Phaser.GameObjects.Container { load(): Promise { return new Promise(resolve => { - this.scene.gameData.getSession(this.slotId).then(async sessionData => { + globalScene.gameData.getSession(this.slotId).then(async sessionData => { // Ignore the results if the view was exited if (!this.active) { return; @@ -420,7 +481,3 @@ class SessionSlot extends Phaser.GameObjects.Container { }); } } - -interface SessionSlot { - scene: BattleScene; -} diff --git a/src/ui/saving-icon-handler.ts b/src/ui/saving-icon-handler.ts index f62b0dc6162..4404ea423b1 100644 --- a/src/ui/saving-icon-handler.ts +++ b/src/ui/saving-icon-handler.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import * as Utils from "../utils"; export default class SavingIconHandler extends Phaser.GameObjects.Container { @@ -7,12 +7,12 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { private animActive: boolean; private shown: boolean; - constructor(scene: BattleScene) { - super(scene, scene.game.canvas.width / 6 - 4, scene.game.canvas.height / 6 - 4); + constructor() { + super(globalScene, globalScene.game.canvas.width / 6 - 4, globalScene.game.canvas.height / 6 - 4); } setup(): void { - this.icon = this.scene.add.sprite(0, 0, "saving_icon"); + this.icon = globalScene.add.sprite(0, 0, "saving_icon"); this.icon.setOrigin(1, 1); this.add(this.icon); @@ -33,19 +33,19 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { this.animActive = true; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, alpha: 1, duration: Utils.fixedInt(250), ease: "Sine.easeInOut", onComplete: () => { - this.scene.time.delayedCall(Utils.fixedInt(500), () => { + globalScene.time.delayedCall(Utils.fixedInt(500), () => { this.animActive = false; if (!this.shown) { this.hide(); } }); - } + }, }); this.setVisible(true); @@ -61,7 +61,7 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { this.animActive = true; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this, alpha: 0, duration: Utils.fixedInt(250), @@ -72,7 +72,7 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { if (this.shown) { this.show(); } - } + }, }); this.shown = false; diff --git a/src/ui/scroll-bar.ts b/src/ui/scroll-bar.ts index 9874be0f73a..404553025e3 100644 --- a/src/ui/scroll-bar.ts +++ b/src/ui/scroll-bar.ts @@ -1,3 +1,5 @@ +import { globalScene } from "#app/global-scene"; + /** * A vertical scrollbar element that resizes dynamically based on the current scrolling * and number of elements that can be shown on screen @@ -11,15 +13,14 @@ export class ScrollBar extends Phaser.GameObjects.Container { private maxRows: number; /** - * @param scene the current scene * @param x the scrollbar's x position (origin: top left) * @param y the scrollbar's y position (origin: top left) * @param width the scrollbar's width * @param height the scrollbar's height * @param maxRows the maximum number of rows that can be shown at once */ - constructor(scene: Phaser.Scene, x: number, y: number, width: number, height: number, maxRows: number) { - super(scene, x, y); + constructor(x: number, y: number, width: number, height: number, maxRows: number) { + super(globalScene, x, y); this.maxRows = maxRows; this.totalRows = maxRows; @@ -28,15 +29,26 @@ export class ScrollBar extends Phaser.GameObjects.Container { const borderSize = 2; width = Math.max(width, 4); - this.bg = scene.add.nineslice(0, 0, "scroll_bar", undefined, width, height, borderSize, borderSize, borderSize, borderSize); + this.bg = globalScene.add.nineslice( + 0, + 0, + "scroll_bar", + undefined, + width, + height, + borderSize, + borderSize, + borderSize, + borderSize, + ); this.bg.setOrigin(0, 0); this.add(this.bg); - this.handleBody = scene.add.rectangle(1, 1, width - 2, 4, 0xaaaaaa); + this.handleBody = globalScene.add.rectangle(1, 1, width - 2, 4, 0xaaaaaa); this.handleBody.setOrigin(0, 0); this.add(this.handleBody); - this.handleBottom = scene.add.nineslice(1, 1, "scroll_bar_handle", undefined, width - 2, 2, 2, 0, 0, 0); + this.handleBottom = globalScene.add.nineslice(1, 1, "scroll_bar_handle", undefined, width - 2, 2, 2, 0, 0, 0); this.handleBottom.setOrigin(0, 0); this.add(this.handleBottom); } @@ -59,14 +71,16 @@ export class ScrollBar extends Phaser.GameObjects.Container { */ setTotalRows(rows: number): void { this.totalRows = rows; - this.handleBody.height = (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) * this.maxRows / this.totalRows; + this.handleBody.height = + ((this.bg.displayHeight - 1 - this.handleBottom.displayHeight) * this.maxRows) / this.totalRows; this.updateHandlePosition(); this.setVisible(this.totalRows > this.maxRows); } private updateHandlePosition(): void { - this.handleBody.y = 1 + (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.totalRows * this.currentRow; + this.handleBody.y = + 1 + ((this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.totalRows) * this.currentRow; this.handleBottom.y = this.handleBody.y + this.handleBody.displayHeight; } } diff --git a/src/ui/scrollable-grid-handler.ts b/src/ui/scrollable-grid-handler.ts index cced92a2083..54f07d69fb7 100644 --- a/src/ui/scrollable-grid-handler.ts +++ b/src/ui/scrollable-grid-handler.ts @@ -1,6 +1,6 @@ import { Button } from "#enums/buttons"; -import UiHandler from "#app/ui/ui-handler"; -import { ScrollBar } from "#app/ui/scroll-bar"; +import type UiHandler from "#app/ui/ui-handler"; +import type { ScrollBar } from "#app/ui/scroll-bar"; type UpdateGridCallbackFunction = () => void; type UpdateDetailsCallbackFunction = (index: number) => void; @@ -24,15 +24,14 @@ export default class ScrollableGridUiHandler { private cursor: number; private scrollCursor: number; private scrollBar?: ScrollBar; + /** Optional function that will get called if the whole grid needs to get updated */ private updateGridCallback?: UpdateGridCallbackFunction; + /** Optional function that will get called if a single element's information needs to get updated */ private updateDetailsCallback?: UpdateDetailsCallbackFunction; /** - * @param scene the {@linkcode UiHandler} that needs its cursor updated based on the scrolling * @param rows the maximum number of rows shown at once * @param columns the maximum number of columns shown at once - * @param updateGridCallback optional function that will get called if the whole grid needs to get updated - * @param updateDetailsCallback optional function that will get called if a single element's information needs to get updated */ constructor(handler: UiHandler, rows: number, columns: number) { this.handler = handler; @@ -112,7 +111,7 @@ export default class ScrollableGridUiHandler { } else if (this.scrollCursor > 0) { success = this.setScrollCursor(this.scrollCursor - 1); } else { - // wrap around to the last row + // wrap around to the last row let newCursor = this.cursor + (onScreenRows - 1) * this.COLUMNS; if (newCursor > lastVisibleIndex) { newCursor -= this.COLUMNS; @@ -122,13 +121,13 @@ export default class ScrollableGridUiHandler { break; case Button.DOWN: if (currentRowIndex < onScreenRows - 1) { - // Go down one row + // Go down one row success = this.setCursor(Math.min(this.cursor + this.COLUMNS, this.totalElements - itemOffset - 1)); } else if (this.scrollCursor < maxScrollCursor) { - // Scroll down one row + // Scroll down one row success = this.setScrollCursor(this.scrollCursor + 1); } else { - // Wrap around to the top row + // Wrap around to the top row success = this.setScrollCursor(0, this.cursor % this.COLUMNS); } break; @@ -193,5 +192,4 @@ export default class ScrollableGridUiHandler { return scrollChanged || cursorChanged; } - } diff --git a/src/ui/session-reload-modal-ui-handler.ts b/src/ui/session-reload-modal-ui-handler.ts index 147634b19d2..d3b88da9e63 100644 --- a/src/ui/session-reload-modal-ui-handler.ts +++ b/src/ui/session-reload-modal-ui-handler.ts @@ -1,11 +1,11 @@ -import BattleScene from "../battle-scene"; -import { ModalConfig, ModalUiHandler } from "./modal-ui-handler"; +import type { ModalConfig } from "./modal-ui-handler"; +import { ModalUiHandler } from "./modal-ui-handler"; import { addTextObject, TextStyle } from "./text"; -import { Mode } from "./ui"; +import type { Mode } from "./ui"; export default class SessionReloadModalUiHandler extends ModalUiHandler { - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); } getModalTitle(): string { @@ -21,27 +21,33 @@ export default class SessionReloadModalUiHandler extends ModalUiHandler { } getMargin(): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + return [0, 0, 48, 0]; } getButtonLabels(): string[] { - return [ ]; + return []; } setup(): void { super.setup(); - const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, "Your session is out of date.\nYour data will be reloaded…", TextStyle.WINDOW, { fontSize: "48px", align: "center" }); + const label = addTextObject( + this.getWidth() / 2, + this.getHeight() / 2, + "Your session is out of date.\nYour data will be reloaded…", + TextStyle.WINDOW, + { fontSize: "48px", align: "center" }, + ); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); } - show(args: any[]): boolean { + show(_args: any[]): boolean { const config: ModalConfig = { - buttonActions: [] + buttonActions: [], }; - return super.show([ config ]); + return super.show([config]); } } diff --git a/src/ui/settings/abstract-binding-ui-handler.ts b/src/ui/settings/abstract-binding-ui-handler.ts index 9ebc3c493a4..62f78da89f5 100644 --- a/src/ui/settings/abstract-binding-ui-handler.ts +++ b/src/ui/settings/abstract-binding-ui-handler.ts @@ -1,11 +1,11 @@ import UiHandler from "../ui-handler"; -import BattleScene from "../../battle-scene"; -import { Mode } from "../ui"; +import type { Mode } from "../ui"; import { addWindow } from "../ui-theme"; import { addTextObject, TextStyle } from "../text"; import { Button } from "#enums/buttons"; import { NavigationManager } from "#app/ui/settings/navigationMenu"; import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; type CancelFn = (succes?: boolean) => boolean; @@ -29,7 +29,7 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { protected actionLabel: Phaser.GameObjects.Text; protected cancelLabel: Phaser.GameObjects.Text; - protected listening: boolean = false; + protected listening = false; protected buttonPressed: number | null = null; // Icons for displaying current and new button assignments. @@ -40,29 +40,28 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { protected cancelFn: CancelFn | null; abstract swapAction(): boolean; - protected timeLeftAutoClose: number = 5; + protected timeLeftAutoClose = 5; protected countdownTimer; // The specific setting being modified. protected target; /** - * Constructor for the AbstractBindingUiHandler. - * - * @param scene - The BattleScene instance. - * @param mode - The UI mode. - */ - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + * Constructor for the AbstractBindingUiHandler. + * + * @param mode - The UI mode. + */ + constructor(mode: Mode | null = null) { + super(mode); } /** - * Setup UI elements. - */ + * Setup UI elements. + */ setup() { const ui = this.getUi(); - this.optionSelectContainer = this.scene.add.container(0, 0); - this.actionsContainer = this.scene.add.container(0, 0); + this.optionSelectContainer = globalScene.add.container(0, 0); + this.actionsContainer = globalScene.add.container(0, 0); // Initially, containers are not visible. this.optionSelectContainer.setVisible(false); this.actionsContainer.setVisible(false); @@ -72,30 +71,45 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { ui.add(this.actionsContainer); // Setup backgrounds and text objects for UI. - this.titleBg = addWindow(this.scene, (this.scene.game.canvas.width / 6) - this.getWindowWidth(), -(this.scene.game.canvas.height / 6) + 28 + 21, this.getWindowWidth(), 24); + this.titleBg = addWindow( + globalScene.game.canvas.width / 6 - this.getWindowWidth(), + -(globalScene.game.canvas.height / 6) + 28 + 21, + this.getWindowWidth(), + 24, + ); this.titleBg.setOrigin(0.5); this.optionSelectContainer.add(this.titleBg); - this.actionBg = addWindow(this.scene, (this.scene.game.canvas.width / 6) - this.getWindowWidth(), -(this.scene.game.canvas.height / 6) + this.getWindowHeight() + 28 + 21 + 21, this.getWindowWidth(), 24); + this.actionBg = addWindow( + globalScene.game.canvas.width / 6 - this.getWindowWidth(), + -(globalScene.game.canvas.height / 6) + this.getWindowHeight() + 28 + 21 + 21, + this.getWindowWidth(), + 24, + ); this.actionBg.setOrigin(0.5); this.actionsContainer.add(this.actionBg); // Text prompts and instructions for the user. - this.unlockText = addTextObject(this.scene, 0, 0, i18next.t("settings:pressButton"), TextStyle.WINDOW); + this.unlockText = addTextObject(0, 0, i18next.t("settings:pressButton"), TextStyle.WINDOW); this.unlockText.setOrigin(0, 0); this.unlockText.setPositionRelative(this.titleBg, 36, 4); this.optionSelectContainer.add(this.unlockText); - this.timerText = addTextObject(this.scene, 0, 0, "(5)", TextStyle.WINDOW); + this.timerText = addTextObject(0, 0, "(5)", TextStyle.WINDOW); this.timerText.setOrigin(0, 0); - this.timerText.setPositionRelative(this.unlockText, (this.unlockText.width / 6) + 5, 0); + this.timerText.setPositionRelative(this.unlockText, this.unlockText.width / 6 + 5, 0); this.optionSelectContainer.add(this.timerText); - this.optionSelectBg = addWindow(this.scene, (this.scene.game.canvas.width / 6) - this.getWindowWidth(), -(this.scene.game.canvas.height / 6) + this.getWindowHeight() + 28, this.getWindowWidth(), this.getWindowHeight()); + this.optionSelectBg = addWindow( + globalScene.game.canvas.width / 6 - this.getWindowWidth(), + -(globalScene.game.canvas.height / 6) + this.getWindowHeight() + 28, + this.getWindowWidth(), + this.getWindowHeight(), + ); this.optionSelectBg.setOrigin(0.5); this.optionSelectContainer.add(this.optionSelectBg); - this.cancelLabel = addTextObject(this.scene, 0, 0, i18next.t("settings:back"), TextStyle.SETTINGS_LABEL); + this.cancelLabel = addTextObject(0, 0, i18next.t("settings:back"), TextStyle.SETTINGS_LABEL); this.cancelLabel.setOrigin(0, 0.5); this.cancelLabel.setPositionRelative(this.actionBg, 10, this.actionBg.height / 2); this.actionsContainer.add(this.cancelLabel); @@ -109,17 +123,17 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { if (this.timeLeftAutoClose >= 0) { this.manageAutoCloseTimer(); } else { - this.cancelFn && this.cancelFn(); + this.cancelFn?.(); } }, 1000); } /** - * Show the UI with the provided arguments. - * - * @param args - Arguments to be passed to the show method. - * @returns `true` if successful. - */ + * Show the UI with the provided arguments. + * + * @param args - Arguments to be passed to the show method. + * @returns `true` if successful. + */ show(args: any[]): boolean { super.show(args); this.buttonPressed = null; @@ -140,29 +154,29 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { } /** - * Get the width of the window. - * - * @returns The window width. - */ + * Get the width of the window. + * + * @returns The window width. + */ getWindowWidth(): number { return 160; } /** - * Get the height of the window. - * - * @returns The window height. - */ + * Get the height of the window. + * + * @returns The window height. + */ getWindowHeight(): number { return 64; } /** - * Process the input for the given button. - * - * @param button - The button to process. - * @returns `true` if the input was processed successfully. - */ + * Process the input for the given button. + * + * @param button - The button to process. + * @returns `true` if the input was processed successfully. + */ processInput(button: Button): boolean { if (this.buttonPressed === null) { return false; // TODO: is false correct as default? (previously was `undefined`) @@ -171,19 +185,19 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { let success = false; switch (button) { case Button.LEFT: - case Button.RIGHT: - // Toggle between action and cancel options. - const cursor = this.cursor ? 0 : 1; - success = this.setCursor(cursor); + case Button.RIGHT: { + // Toggle between action and cancel options. + success = this.setCursor(this.cursor ? 0 : 1); break; + } case Button.ACTION: - // Process actions based on current cursor position. + // Process actions based on current cursor position. if (this.cursor === 0) { - this.cancelFn && this.cancelFn(); + this.cancelFn?.(); } else { success = this.swapAction(); NavigationManager.getInstance().updateIcons(); - this.cancelFn && this.cancelFn(success); + this.cancelFn?.(success); } break; } @@ -199,12 +213,12 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { } /** - * Set the cursor to the specified position. - * - * @param cursor - The cursor position to set. - * @returns `true` if the cursor was set successfully. - */ - setCursor(cursor: integer): boolean { + * Set the cursor to the specified position. + * + * @param cursor - The cursor position to set. + * @returns `true` if the cursor was set successfully. + */ + setCursor(cursor: number): boolean { this.cursor = cursor; if (cursor === 1) { this.actionLabel.setColor(this.getTextColor(TextStyle.SETTINGS_SELECTED)); @@ -221,8 +235,8 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { } /** - * Clear the UI elements and state. - */ + * Clear the UI elements and state. + */ clear() { super.clear(); clearTimeout(this.countdownTimer); @@ -238,12 +252,12 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { } /** - * Handle input down events. - * - * @param buttonIcon - The icon of the button that was pressed. - * @param assignedButtonIcon - The icon of the button that is assigned. - * @param type - The type of button press. - */ + * Handle input down events. + * + * @param buttonIcon - The icon of the button that was pressed. + * @param assignedButtonIcon - The icon of the button that is assigned. + * @param type - The type of button press. + */ onInputDown(buttonIcon: string, assignedButtonIcon: string | null, type: string): void { clearTimeout(this.countdownTimer); this.timerText.setText(""); diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index 69f8eb241d3..2c634e2c5bf 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -1,28 +1,28 @@ import UiHandler from "#app/ui/ui-handler"; -import BattleScene from "#app/battle-scene"; -import { Mode } from "#app/ui/ui"; -import { InterfaceConfig } from "#app/inputs-controller"; +import type { Mode } from "#app/ui/ui"; +import type { InterfaceConfig } from "#app/inputs-controller"; import { addWindow } from "#app/ui/ui-theme"; import { addTextObject, TextStyle } from "#app/ui/text"; import { ScrollBar } from "#app/ui/scroll-bar"; import { getIconWithSettingName } from "#app/configs/inputs/configHandler"; import NavigationMenu, { NavigationManager } from "#app/ui/settings/navigationMenu"; -import { Device } from "#enums/devices"; +import type { Device } from "#enums/devices"; import { Button } from "#enums/buttons"; import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; export interface InputsIcons { - [key: string]: Phaser.GameObjects.Sprite; + [key: string]: Phaser.GameObjects.Sprite; } export interface LayoutConfig { - optionsContainer: Phaser.GameObjects.Container; - inputsIcons: InputsIcons; - settingLabels: Phaser.GameObjects.Text[]; - optionValueLabels: Phaser.GameObjects.Text[][]; - optionCursors: number[]; - keys: string[]; - bindingSettings: Array; + optionsContainer: Phaser.GameObjects.Container; + inputsIcons: InputsIcons; + settingLabels: Phaser.GameObjects.Text[]; + optionValueLabels: Phaser.GameObjects.Text[][]; + optionCursors: number[]; + keys: string[]; + bindingSettings: Array; } /** * Abstract class for handling UI elements related to control settings. @@ -49,10 +49,10 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler protected inputsIcons: InputsIcons; protected navigationIcons: InputsIcons; // list all the setting keys used in the selected layout (because dualshock has more buttons than xbox) - protected keys: Array; + protected keys: Array; // Store the specific settings related to key bindings for the current gamepad configuration. - protected bindingSettings: Array; + protected bindingSettings: Array; protected setting; protected settingBlacklisted; @@ -67,29 +67,30 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler protected device: Device; abstract saveSettingToLocalStorage(setting, cursor): void; - abstract setSetting(scene: BattleScene, setting, value: number): boolean; + abstract setSetting(setting, value: number): boolean; /** * Constructor for the AbstractSettingsUiHandler. * - * @param scene - The BattleScene instance. * @param mode - The UI mode. */ - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); this.rowsToDisplay = 8; } getLocalStorageSetting(): object { // Retrieve the settings from local storage or use an empty object if none exist. - const settings: object = localStorage.hasOwnProperty(this.localStoragePropertyName) ? JSON.parse(localStorage.getItem(this.localStoragePropertyName)!) : {}; // TODO: is this bang correct? + const settings: object = localStorage.hasOwnProperty(this.localStoragePropertyName) + ? JSON.parse(localStorage.getItem(this.localStoragePropertyName)!) + : {}; // TODO: is this bang correct? return settings; } private camelize(string: string): string { - return string.replace(/(?:^\w|[A-Z]|\b\w)/g, function(word, index) { - return index === 0 ? word.toLowerCase() : word.toUpperCase(); - }).replace(/\s+/g, ""); + return string + .replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => (index === 0 ? word.toLowerCase() : word.toUpperCase())) + .replace(/\s+/g, ""); } /** @@ -99,44 +100,56 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler const ui = this.getUi(); this.navigationIcons = {}; - this.settingsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.settingsContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); this.settingsContainer.setName(`settings-${this.titleSelected}`); - this.settingsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.settingsContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + Phaser.Geom.Rectangle.Contains, + ); - this.navigationContainer = new NavigationMenu(this.scene, 0, 0); + this.navigationContainer = new NavigationMenu(0, 0); - this.optionsBg = addWindow(this.scene, 0, this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 16 - this.navigationContainer.height - 2); + this.optionsBg = addWindow( + 0, + this.navigationContainer.height, + globalScene.game.canvas.width / 6 - 2, + globalScene.game.canvas.height / 6 - 16 - this.navigationContainer.height - 2, + ); this.optionsBg.setOrigin(0, 0); - - this.actionsBg = addWindow(this.scene, 0, (this.scene.game.canvas.height / 6) - this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, 22); + this.actionsBg = addWindow( + 0, + globalScene.game.canvas.height / 6 - this.navigationContainer.height, + globalScene.game.canvas.width / 6 - 2, + 22, + ); this.actionsBg.setOrigin(0, 0); - const iconAction = this.scene.add.sprite(0, 0, "keyboard"); + const iconAction = globalScene.add.sprite(0, 0, "keyboard"); iconAction.setOrigin(0, -0.1); iconAction.setPositionRelative(this.actionsBg, this.navigationContainer.width - 32, 4); this.navigationIcons["BUTTON_ACTION"] = iconAction; - const actionText = addTextObject(this.scene, 0, 0, i18next.t("settings:action"), TextStyle.SETTINGS_LABEL); + const actionText = addTextObject(0, 0, i18next.t("settings:action"), TextStyle.SETTINGS_LABEL); actionText.setOrigin(0, 0.15); actionText.setPositionRelative(iconAction, -actionText.width / 6 - 2, 0); - const iconCancel = this.scene.add.sprite(0, 0, "keyboard"); + const iconCancel = globalScene.add.sprite(0, 0, "keyboard"); iconCancel.setOrigin(0, -0.1); iconCancel.setPositionRelative(this.actionsBg, this.navigationContainer.width - 100, 4); this.navigationIcons["BUTTON_CANCEL"] = iconCancel; - const cancelText = addTextObject(this.scene, 0, 0, i18next.t("settings:back"), TextStyle.SETTINGS_LABEL); + const cancelText = addTextObject(0, 0, i18next.t("settings:back"), TextStyle.SETTINGS_LABEL); cancelText.setOrigin(0, 0.15); cancelText.setPositionRelative(iconCancel, -cancelText.width / 6 - 2, 0); - const iconReset = this.scene.add.sprite(0, 0, "keyboard"); + const iconReset = globalScene.add.sprite(0, 0, "keyboard"); iconReset.setOrigin(0, -0.1); iconReset.setPositionRelative(this.actionsBg, this.navigationContainer.width - 180, 4); this.navigationIcons["BUTTON_HOME"] = iconReset; - const resetText = addTextObject(this.scene, 0, 0, i18next.t("settings:reset"), TextStyle.SETTINGS_LABEL); + const resetText = addTextObject(0, 0, i18next.t("settings:reset"), TextStyle.SETTINGS_LABEL); resetText.setOrigin(0, 0.15); resetText.setPositionRelative(iconReset, -resetText.width / 6 - 2, 0); @@ -156,7 +169,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler this.layout[config.padType] = new Map(); // Create a container for gamepad options in the scene, initially hidden. - const optionsContainer = this.scene.add.container(0, 0); + const optionsContainer = globalScene.add.container(0, 0); optionsContainer.setVisible(false); // Gather all binding settings from the configuration. @@ -172,13 +185,21 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler const inputsIcons: InputsIcons = {}; // Fetch common setting keys such as 'Controller' and 'Gamepad Support' from gamepad settings. - const commonSettingKeys = Object.keys(this.setting).slice(0, this.commonSettingsCount).map(key => this.setting[key]); + const commonSettingKeys = Object.keys(this.setting) + .slice(0, this.commonSettingsCount) + .map(key => this.setting[key]); // Combine common and specific bindings into a single array. - const specificBindingKeys = [ ...commonSettingKeys, ...Object.keys(config.settings) ]; + const specificBindingKeys = [...commonSettingKeys, ...Object.keys(config.settings)]; // Fetch default values for these settings and prepare to highlight selected options. - const optionCursors = Object.values(Object.keys(this.settingDeviceDefaults).filter(s => specificBindingKeys.includes(s)).map(k => this.settingDeviceDefaults[k])); + const optionCursors = Object.values( + Object.keys(this.settingDeviceDefaults) + .filter(s => specificBindingKeys.includes(s)) + .map(k => this.settingDeviceDefaults[k]), + ); // Filter out settings that are not relevant to the current gamepad configuration. - const settingFiltered = Object.keys(this.setting).filter(_key => specificBindingKeys.includes(this.setting[_key])); + const settingFiltered = Object.keys(this.setting).filter(_key => + specificBindingKeys.includes(this.setting[_key]), + ); // Loop through the filtered settings to manage display and options. settingFiltered.forEach((setting, s) => { @@ -195,7 +216,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler } else { labelText = i18next.t(`settings:${i18nKey}`); } - settingLabels[s] = addTextObject(this.scene, 8, 28 + s * 16, labelText, labelStyle); + settingLabels[s] = addTextObject(8, 28 + s * 16, labelText, labelStyle); settingLabels[s].setOrigin(0, 0); optionsContainer.add(settingLabels[s]); @@ -203,19 +224,19 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler const valueLabels: Phaser.GameObjects.GameObject[] = []; // Process each option for the current setting. - for (const [ o, option ] of this.settingDeviceOptions[this.setting[setting]].entries()) { + for (const [o, option] of this.settingDeviceOptions[this.setting[setting]].entries()) { // Check if the current setting is for binding keys. if (bindingSettings.includes(this.setting[setting])) { // Create a label for non-null options, typically indicating actionable options like 'change'. if (o) { - const valueLabel = addTextObject(this.scene, 0, 0, isLock ? "" : option, TextStyle.WINDOW); + const valueLabel = addTextObject(0, 0, isLock ? "" : option, TextStyle.WINDOW); valueLabel.setOrigin(0, 0); optionsContainer.add(valueLabel); valueLabels.push(valueLabel); continue; } // For null options, add an icon for the key. - const icon = this.scene.add.sprite(0, 0, this.textureOverride ? this.textureOverride : config.padType); + const icon = globalScene.add.sprite(0, 0, this.textureOverride ? this.textureOverride : config.padType); icon.setOrigin(0, -0.15); inputsIcons[this.setting[setting]] = icon; optionsContainer.add(icon); @@ -223,7 +244,12 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler continue; } // For regular settings like 'Gamepad support', create a label and determine if it is selected. - const valueLabel = addTextObject(this.scene, 0, 0, option, this.settingDeviceDefaults[this.setting[setting]] === o ? TextStyle.SETTINGS_SELECTED : TextStyle.WINDOW); + const valueLabel = addTextObject( + 0, + 0, + option, + this.settingDeviceDefaults[this.setting[setting]] === o ? TextStyle.SETTINGS_SELECTED : TextStyle.WINDOW, + ); valueLabel.setOrigin(0, 0); optionsContainer.add(valueLabel); @@ -236,14 +262,16 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Calculate the total width of all option labels within a specific setting // This is achieved by summing the width of each option label - const totalWidth = optionValueLabels[s].map((o) => (o as Phaser.GameObjects.Text).width).reduce((total, width) => total += width, 0); + const totalWidth = optionValueLabels[s] + .map(o => (o as Phaser.GameObjects.Text).width) + .reduce((total, width) => (total += width), 0); // Define the minimum width for a label, ensuring it's at least 78 pixels wide or the width of the setting label plus some padding const labelWidth = Math.max(130, settingLabels[s].displayWidth + 8); // Calculate the total available space for placing option labels next to their setting label // We reserve space for the setting label and then distribute the remaining space evenly - const totalSpace = (297 - labelWidth) - totalWidth / 6; + const totalSpace = 297 - labelWidth - totalWidth / 6; // Calculate the spacing between options based on the available space divided by the number of gaps between labels const optionSpacing = Math.floor(totalSpace / (optionValueLabels[s].length - 1)); @@ -273,7 +301,13 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler } // Add vertical scrollbar - this.scrollBar = new ScrollBar(this.scene, this.optionsBg.width - 9, this.optionsBg.y + 5, 4, this.optionsBg.height - 11, this.rowsToDisplay); + this.scrollBar = new ScrollBar( + this.optionsBg.width - 9, + this.optionsBg.y + 5, + 4, + this.optionsBg.height - 11, + this.rowsToDisplay, + ); this.settingsContainer.add(this.scrollBar); // Add the settings container to the UI. @@ -289,7 +323,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler * @returns The active configuration for current device */ getActiveConfig(): InterfaceConfig { - return this.scene.inputController.getActiveConfig(this.device); + return globalScene.inputController.getActiveConfig(this.device); } /** @@ -297,7 +331,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler */ updateBindings(): void { // Hide the options container for all layouts to reset the UI visibility. - Object.keys(this.layout).forEach((key) => this.layout[key].optionsContainer.setVisible(false)); + Object.keys(this.layout).forEach(key => this.layout[key].optionsContainer.setVisible(false)); // Fetch the active gamepad configuration from the input controller. const activeConfig = this.getActiveConfig(); @@ -311,7 +345,10 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Update the cursor for each key based on the stored settings or default cursors. this.keys.forEach((key, index) => { - this.setOptionCursor(index, settings.hasOwnProperty(key as string) ? settings[key as string] : this.optionCursors[index]); + this.setOptionCursor( + index, + settings.hasOwnProperty(key as string) ? settings[key as string] : this.optionCursors[index], + ); }); // If the active configuration has no custom bindings set, exit the function early. @@ -339,8 +376,8 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler updateNavigationDisplay() { const specialIcons = { - "BUTTON_HOME": "HOME.png", - "BUTTON_DELETE": "DEL.png", + BUTTON_HOME: "HOME.png", + BUTTON_DELETE: "DEL.png", }; for (const settingName of Object.keys(this.navigationIcons)) { if (Object.keys(specialIcons).includes(settingName)) { @@ -349,9 +386,9 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler this.navigationIcons[settingName].alpha = 1; continue; } - const icon = this.scene.inputController?.getIconForLatestInputRecorded(settingName); + const icon = globalScene.inputController?.getIconForLatestInputRecorded(settingName); if (icon) { - const type = this.scene.inputController?.getLastSourceType(); + const type = globalScene.inputController?.getLastSourceType(); this.navigationIcons[settingName].setTexture(type); this.navigationIcons[settingName].setFrame(icon); this.navigationIcons[settingName].alpha = 1; @@ -444,7 +481,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Handle cancel button press, reverting UI mode to previous state. success = true; NavigationManager.getInstance().reset(); - this.scene.ui.revertMode(); + globalScene.ui.revertMode(); } else { const cursor = this.cursor + this.scrollCursor; // Calculate the absolute cursor position. const setting = this.setting[Object.keys(this.setting)[cursor]]; @@ -456,22 +493,24 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler if (this.settingBlacklisted.includes(setting) || !setting.includes("BUTTON_")) { success = false; } else { - success = this.setSetting(this.scene, setting, 1); + success = this.setSetting(setting, 1); } break; case Button.UP: // Move up in the menu. if (!this.optionValueLabels) { return false; } - if (cursor) { // If not at the top, move the cursor up. + if (cursor) { + // If not at the top, move the cursor up. if (this.cursor) { success = this.setCursor(this.cursor - 1); - } else {// If at the top of the visible items, scroll up. + } else { + // If at the top of the visible items, scroll up. success = this.setScrollCursor(this.scrollCursor - 1); } } else { - // When at the top of the menu and pressing UP, move to the bottommost item. - // First, set the cursor to the last visible element, preparing for the scroll to the end. + // When at the top of the menu and pressing UP, move to the bottommost item. + // First, set the cursor to the last visible element, preparing for the scroll to the end. const successA = this.setCursor(this.rowsToDisplay - 1); // Then, adjust the scroll to display the bottommost elements of the menu. const successB = this.setScrollCursor(this.optionValueLabels.length - this.rowsToDisplay); @@ -489,8 +528,8 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler success = this.setScrollCursor(this.scrollCursor + 1); } } else { - // When at the bottom of the menu and pressing DOWN, move to the topmost item. - // First, set the cursor to the first visible element, resetting the scroll to the top. + // When at the bottom of the menu and pressing DOWN, move to the topmost item. + // First, set the cursor to the first visible element, resetting the scroll to the top. const successA = this.setCursor(0); // Then, reset the scroll to start from the first element of the menu. const successB = this.setScrollCursor(0); @@ -556,8 +595,8 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Check if the cursor object exists, if not, create it. if (!this.cursorObj) { - const cursorWidth = (this.scene.game.canvas.width / 6) - (this.scrollBar.visible ? 16 : 10); - this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1); + const cursorWidth = globalScene.game.canvas.width / 6 - (this.scrollBar.visible ? 16 : 10); + this.cursorObj = globalScene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); // Set the origin to the top-left corner. this.optionsContainer.add(this.cursorObj); // Add the cursor to the options container. } @@ -682,5 +721,4 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Set the cursor object reference to null to fully dereference it. this.cursorObj = null; } - } diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 83219e1ef5a..0c14b91251e 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -1,23 +1,23 @@ -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"; -import { InputsIcons } from "#app/ui/settings/abstract-control-settings-ui-handler"; +import type { InputsIcons } from "#app/ui/settings/abstract-control-settings-ui-handler"; import NavigationMenu, { NavigationManager } from "#app/ui/settings/navigationMenu"; -import { Setting, SettingKeys, SettingType } from "#app/system/settings/settings"; +import type { SettingType } from "#app/system/settings/settings"; +import { Setting, SettingKeys } from "#app/system/settings/settings"; import i18next from "i18next"; - +import { globalScene } from "#app/global-scene"; /** * 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; @@ -42,8 +42,8 @@ export default class AbstractSettingsUiHandler extends UiHandler { protected settings: Array; protected localStorageKey: string; - constructor(scene: BattleScene, type: SettingType, mode: Mode | null = null) { - super(scene, mode); + constructor(type: SettingType, mode: Mode | null = null) { + super(mode); this.settings = Setting.filter(s => s.type === type && !s?.isHidden?.()); this.reloadRequired = false; this.rowsToDisplay = 8; @@ -55,86 +55,130 @@ export default class AbstractSettingsUiHandler extends UiHandler { setup() { const ui = this.getUi(); - this.settingsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.settingsContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); this.settingsContainer.setName(`settings-${this.title}`); - this.settingsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6 - 20), Phaser.Geom.Rectangle.Contains); + this.settingsContainer.setInteractive( + new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6 - 20), + Phaser.Geom.Rectangle.Contains, + ); this.navigationIcons = {}; - this.navigationContainer = new NavigationMenu(this.scene, 0, 0); + this.navigationContainer = new NavigationMenu(0, 0); - this.optionsBg = addWindow(this.scene, 0, this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 16 - this.navigationContainer.height - 2); + this.optionsBg = addWindow( + 0, + this.navigationContainer.height, + globalScene.game.canvas.width / 6 - 2, + globalScene.game.canvas.height / 6 - 16 - this.navigationContainer.height - 2, + ); this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); - const actionsBg = addWindow(this.scene, 0, (this.scene.game.canvas.height / 6) - this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, 22); + const actionsBg = addWindow( + 0, + globalScene.game.canvas.height / 6 - this.navigationContainer.height, + globalScene.game.canvas.width / 6 - 2, + 22, + ); actionsBg.setOrigin(0, 0); - const iconAction = this.scene.add.sprite(0, 0, "keyboard"); + const iconAction = globalScene.add.sprite(0, 0, "keyboard"); iconAction.setOrigin(0, -0.1); iconAction.setPositionRelative(actionsBg, this.navigationContainer.width - 32, 4); this.navigationIcons["BUTTON_ACTION"] = iconAction; - const actionText = addTextObject(this.scene, 0, 0, i18next.t("settings:action"), TextStyle.SETTINGS_LABEL); + const actionText = addTextObject(0, 0, i18next.t("settings:action"), TextStyle.SETTINGS_LABEL); actionText.setOrigin(0, 0.15); actionText.setPositionRelative(iconAction, -actionText.width / 6 - 2, 0); - const iconCancel = this.scene.add.sprite(0, 0, "keyboard"); + const iconCancel = globalScene.add.sprite(0, 0, "keyboard"); iconCancel.setOrigin(0, -0.1); iconCancel.setPositionRelative(actionsBg, this.navigationContainer.width - 100, 4); this.navigationIcons["BUTTON_CANCEL"] = iconCancel; - const cancelText = addTextObject(this.scene, 0, 0, i18next.t("settings:back"), TextStyle.SETTINGS_LABEL); + const cancelText = addTextObject(0, 0, i18next.t("settings:back"), TextStyle.SETTINGS_LABEL); cancelText.setOrigin(0, 0.15); cancelText.setPositionRelative(iconCancel, -cancelText.width / 6 - 2, 0); - this.optionsContainer = this.scene.add.container(0, 0); + this.optionsContainer = globalScene.add.container(0, 0); this.settingLabels = []; this.optionValueLabels = []; this.reloadSettings = this.settings.filter(s => s?.requireReload); - this.settings - .forEach((setting, s) => { - let settingName = setting.label; - if (setting?.requireReload) { - settingName += ` (${i18next.t("settings:requireReload")})`; - } + this.settings.forEach((setting, s) => { + let settingName = setting.label; + if (setting?.requireReload) { + settingName += ` (${i18next.t("settings:requireReload")})`; + } - this.settingLabels[s] = addTextObject(this.scene, 8, 28 + s * 16, settingName, TextStyle.SETTINGS_LABEL); - this.settingLabels[s].setOrigin(0, 0); + this.settingLabels[s] = addTextObject(8, 28 + s * 16, settingName, TextStyle.SETTINGS_LABEL); + this.settingLabels[s].setOrigin(0, 0); - this.optionsContainer.add(this.settingLabels[s]); - this.optionValueLabels.push(setting.options.map((option, o) => { - const valueLabel = addTextObject(this.scene, 0, 0, option.label, setting.default === o ? TextStyle.SETTINGS_SELECTED : TextStyle.SETTINGS_VALUE); + this.optionsContainer.add(this.settingLabels[s]); + this.optionValueLabels.push( + setting.options.map((option, o) => { + const valueLabel = addTextObject( + 0, + 0, + option.label, + setting.default === o ? TextStyle.SETTINGS_SELECTED : TextStyle.SETTINGS_VALUE, + ); valueLabel.setOrigin(0, 0); this.optionsContainer.add(valueLabel); return valueLabel; - })); + }), + ); - const totalWidth = this.optionValueLabels[s].map(o => o.width).reduce((total, width) => total += width, 0); + const totalWidth = this.optionValueLabels[s].map(o => o.width).reduce((total, width) => (total += width), 0); - const labelWidth = Math.max(78, this.settingLabels[s].displayWidth + 8); + const labelWidth = Math.max(78, this.settingLabels[s].displayWidth + 8); - const totalSpace = (297 - labelWidth) - totalWidth / 6; - const optionSpacing = Math.floor(totalSpace / (this.optionValueLabels[s].length - 1)); + const totalSpace = 297 - labelWidth - totalWidth / 6; + const optionSpacing = Math.floor(totalSpace / (this.optionValueLabels[s].length - 1)); - let xOffset = 0; + let xOffset = 0; - for (const value of this.optionValueLabels[s]) { - value.setPositionRelative(this.settingLabels[s], labelWidth + xOffset, 0); - xOffset += value.width / 6 + optionSpacing; - } - }); + for (const value of this.optionValueLabels[s]) { + value.setPositionRelative(this.settingLabels[s], labelWidth + xOffset, 0); + xOffset += value.width / 6 + optionSpacing; + } + }); this.optionCursors = this.settings.map(setting => setting.default); - this.scrollBar = new ScrollBar(this.scene, this.optionsBg.width - 9, this.optionsBg.y + 5, 4, this.optionsBg.height - 11, this.rowsToDisplay); + this.scrollBar = new ScrollBar( + 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 = globalScene.add.container(0, globalScene.scaledCanvas.height); + this.messageBoxContainer.setName("settings-message-box"); + this.messageBoxContainer.setVisible(false); + + const settingsMessageBox = addWindow(0, -1, globalScene.scaledCanvas.width - 2, 48); + settingsMessageBox.setOrigin(0, 1); + this.messageBoxContainer.add(settingsMessageBox); + + const messageText = addTextObject(8, -40, "", TextStyle.WINDOW, { + maxLines: 2, + }); + messageText.setWordWrapWidth(globalScene.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 +188,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); @@ -163,9 +208,9 @@ export default class AbstractSettingsUiHandler extends UiHandler { this.navigationIcons[settingName].alpha = 1; continue; } - const icon = this.scene.inputController?.getIconForLatestInputRecorded(settingName); + const icon = globalScene.inputController?.getIconForLatestInputRecorded(settingName); if (icon) { - const type = this.scene.inputController?.getLastSourceType(); + const type = globalScene.inputController?.getLastSourceType(); this.navigationIcons[settingName].setTexture(type); this.navigationIcons[settingName].setFrame(icon); this.navigationIcons[settingName].alpha = 1; @@ -181,14 +226,18 @@ export default class AbstractSettingsUiHandler extends UiHandler { * * @param args - Arguments to be passed to the show method. * @returns `true` if successful. - */ + */ show(args: any[]): boolean { super.show(args); this.updateBindings(); - const settings: object = localStorage.hasOwnProperty(this.localStorageKey) ? JSON.parse(localStorage.getItem(this.localStorageKey)!) : {}; // TODO: is this bang correct? + const settings: object = localStorage.hasOwnProperty(this.localStorageKey) + ? JSON.parse(localStorage.getItem(this.localStorageKey)!) + : {}; // TODO: is this bang correct? - this.settings.forEach((setting, s) => this.setOptionCursor(s, settings.hasOwnProperty(setting.key) ? settings[setting.key] : this.settings[s].default)); + this.settings.forEach((setting, s) => + this.setOptionCursor(s, settings.hasOwnProperty(setting.key) ? settings[setting.key] : this.settings[s].default), + ); this.settingsContainer.setVisible(true); this.setCursor(0); @@ -220,7 +269,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { success = true; NavigationManager.getInstance().reset(); // Reverts UI to its previous state on cancel. - this.scene.ui.revertMode(); + globalScene.ui.revertMode(); } else { const cursor = this.cursor + this.scrollCursor; switch (button) { @@ -232,8 +281,8 @@ export default class AbstractSettingsUiHandler extends UiHandler { success = this.setScrollCursor(this.scrollCursor - 1); } } else { - // When at the top of the menu and pressing UP, move to the bottommost item. - // First, set the cursor to the last visible element, preparing for the scroll to the end. + // When at the top of the menu and pressing UP, move to the bottommost item. + // First, set the cursor to the last visible element, preparing for the scroll to the end. const successA = this.setCursor(this.rowsToDisplay - 1); // Then, adjust the scroll to display the bottommost elements of the menu. const successB = this.setScrollCursor(this.optionValueLabels.length - this.rowsToDisplay); @@ -242,14 +291,15 @@ export default class AbstractSettingsUiHandler extends UiHandler { break; case Button.DOWN: if (cursor < this.optionValueLabels.length - 1) { - if (this.cursor < this.rowsToDisplay - 1) {// if the visual cursor is in the frame of 0 to 8 + if (this.cursor < this.rowsToDisplay - 1) { + // if the visual cursor is in the frame of 0 to 8 success = this.setCursor(this.cursor + 1); } else if (this.scrollCursor < this.optionValueLabels.length - this.rowsToDisplay) { success = this.setScrollCursor(this.scrollCursor + 1); } } else { - // When at the bottom of the menu and pressing DOWN, move to the topmost item. - // First, set the cursor to the first visible element, resetting the scroll to the top. + // When at the bottom of the menu and pressing DOWN, move to the topmost item. + // First, set the cursor to the first visible element, resetting the scroll to the top. const successA = this.setCursor(0); // Then, reset the scroll to start from the first element of the menu. const successB = this.setScrollCursor(0); @@ -257,12 +307,13 @@ export default class AbstractSettingsUiHandler extends UiHandler { } break; case Button.LEFT: - if (this.optionCursors[cursor]) {// Moves the option cursor left, if possible. + if (this.optionCursors[cursor]) { + // Moves the option cursor left, if possible. success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); } break; case Button.RIGHT: - // Moves the option cursor right, if possible. + // Moves the option cursor right, if possible. if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) { success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); } @@ -296,7 +347,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { activateSetting(setting: Setting): boolean { switch (setting.key) { case SettingKeys.Move_Touch_Controls: - this.scene.inputController.moveTouchControlsHandler.enableConfigurationMode(this.getUi(), this.scene); + globalScene.inputController.moveTouchControlsHandler.enableConfigurationMode(this.getUi()); return true; } return false; @@ -312,8 +363,8 @@ export default class AbstractSettingsUiHandler extends UiHandler { const ret = super.setCursor(cursor); if (!this.cursorObj) { - const cursorWidth = (this.scene.game.canvas.width / 6) - (this.scrollBar.visible ? 16 : 10); - this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1); + const cursorWidth = globalScene.game.canvas.width / 6 - (this.scrollBar.visible ? 16 : 10); + this.cursorObj = globalScene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); this.optionsContainer.add(this.cursorObj); } @@ -326,18 +377,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 +401,34 @@ 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 = () => { + globalScene.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 = () => { + globalScene.ui.revertMode(); + this.showText(""); + saveSetting(); + }; + const cancelUpdateSetting = () => { + globalScene.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"); + globalScene.ui.showText(confirmationMessage, null, () => { + globalScene.ui.setOverlayMode(Mode.CONFIRM, confirmUpdateSetting, cancelUpdateSetting, null, null, 1, 750); + }); + } else { + saveSetting(); } } @@ -405,10 +479,10 @@ export default class AbstractSettingsUiHandler extends UiHandler { this.settingsContainer.setVisible(false); this.setScrollCursor(0); this.eraseCursor(); - this.getUi().bgmBar.toggleBgmBar(this.scene.showBgmBar); + this.getUi().bgmBar.toggleBgmBar(globalScene.showBgmBar); if (this.reloadRequired) { this.reloadRequired = false; - this.scene.reset(true, false, true); + globalScene.reset(true, false, true); } } @@ -421,4 +495,16 @@ export default class AbstractSettingsUiHandler extends UiHandler { } this.cursorObj = null; } + + override showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + ) { + this.messageBoxContainer.setVisible(!!text?.length); + super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); + } } diff --git a/src/ui/settings/gamepad-binding-ui-handler.ts b/src/ui/settings/gamepad-binding-ui-handler.ts index e89529f6453..62bc2db7825 100644 --- a/src/ui/settings/gamepad-binding-ui-handler.ts +++ b/src/ui/settings/gamepad-binding-ui-handler.ts @@ -1,37 +1,39 @@ -import BattleScene from "../../battle-scene"; import AbstractBindingUiHandler from "./abstract-binding-ui-handler"; -import { Mode } from "../ui"; +import type { Mode } from "../ui"; import { Device } from "#enums/devices"; import { getIconWithSettingName, getKeyWithKeycode } from "#app/configs/inputs/configHandler"; import { addTextObject, TextStyle } from "#app/ui/text"; - +import { globalScene } from "#app/global-scene"; export default class GamepadBindingUiHandler extends AbstractBindingUiHandler { - - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); - this.scene.input.gamepad?.on("down", this.gamepadButtonDown, this); + constructor(mode: Mode | null = null) { + super(mode); + globalScene.input.gamepad?.on("down", this.gamepadButtonDown, this); } setup() { super.setup(); // New button icon setup. - this.newButtonIcon = this.scene.add.sprite(0, 0, "xbox"); + this.newButtonIcon = globalScene.add.sprite(0, 0, "xbox"); this.newButtonIcon.setPositionRelative(this.optionSelectBg, 78, 16); this.newButtonIcon.setOrigin(0.5); this.newButtonIcon.setVisible(false); - this.swapText = addTextObject(this.scene, 0, 0, "will swap with", TextStyle.WINDOW); + this.swapText = addTextObject(0, 0, "will swap with", TextStyle.WINDOW); this.swapText.setOrigin(0.5); - this.swapText.setPositionRelative(this.optionSelectBg, this.optionSelectBg.width / 2 - 2, this.optionSelectBg.height / 2 - 2); + this.swapText.setPositionRelative( + this.optionSelectBg, + this.optionSelectBg.width / 2 - 2, + this.optionSelectBg.height / 2 - 2, + ); this.swapText.setVisible(false); - this.targetButtonIcon = this.scene.add.sprite(0, 0, "xbox"); + this.targetButtonIcon = globalScene.add.sprite(0, 0, "xbox"); this.targetButtonIcon.setPositionRelative(this.optionSelectBg, 78, 48); this.targetButtonIcon.setOrigin(0.5); this.targetButtonIcon.setVisible(false); - this.actionLabel = addTextObject(this.scene, 0, 0, "Confirm swap", TextStyle.SETTINGS_LABEL); + this.actionLabel = addTextObject(0, 0, "Confirm swap", TextStyle.SETTINGS_LABEL); this.actionLabel.setOrigin(0, 0.5); this.actionLabel.setPositionRelative(this.actionBg, this.actionBg.width - 75, this.actionBg.height / 2); this.actionsContainer.add(this.actionLabel); @@ -42,16 +44,21 @@ export default class GamepadBindingUiHandler extends AbstractBindingUiHandler { } getSelectedDevice() { - return this.scene.inputController?.selectedDevice[Device.GAMEPAD]; + return globalScene.inputController?.selectedDevice[Device.GAMEPAD]; } - gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { - const blacklist = [ 12, 13, 14, 15 ]; // d-pad buttons are blacklisted. + gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, _value: number): void { + const blacklist = [12, 13, 14, 15]; // d-pad buttons are blacklisted. // Check conditions before processing the button press. - if (!this.listening || pad.id.toLowerCase() !== this.getSelectedDevice() || blacklist.includes(button.index) || this.buttonPressed !== null) { + if ( + !this.listening || + pad.id.toLowerCase() !== this.getSelectedDevice() || + blacklist.includes(button.index) || + this.buttonPressed !== null + ) { return; } - const activeConfig = this.scene.inputController.getActiveConfig(Device.GAMEPAD); + const activeConfig = globalScene.inputController.getActiveConfig(Device.GAMEPAD); const type = activeConfig.padType; const key = getKeyWithKeycode(activeConfig, button.index); const buttonIcon = activeConfig.icons[key]; @@ -64,17 +71,17 @@ export default class GamepadBindingUiHandler extends AbstractBindingUiHandler { } swapAction(): boolean { - const activeConfig = this.scene.inputController.getActiveConfig(Device.GAMEPAD); - if (this.scene.inputController.assignBinding(activeConfig, this.target, this.buttonPressed)) { - this.scene.gameData.saveMappingConfigs(this.getSelectedDevice(), activeConfig); + const activeConfig = globalScene.inputController.getActiveConfig(Device.GAMEPAD); + if (globalScene.inputController.assignBinding(activeConfig, this.target, this.buttonPressed)) { + globalScene.gameData.saveMappingConfigs(this.getSelectedDevice(), activeConfig); return true; } return false; } /** - * Clear the UI elements and state. - */ + * Clear the UI elements and state. + */ clear() { super.clear(); this.targetButtonIcon.setVisible(false); diff --git a/src/ui/settings/keyboard-binding-ui-handler.ts b/src/ui/settings/keyboard-binding-ui-handler.ts index 52b1a0e385f..8735faeaaab 100644 --- a/src/ui/settings/keyboard-binding-ui-handler.ts +++ b/src/ui/settings/keyboard-binding-ui-handler.ts @@ -1,29 +1,27 @@ -import BattleScene from "../../battle-scene"; import AbstractBindingUiHandler from "./abstract-binding-ui-handler"; -import { Mode } from "../ui"; +import type { Mode } from "../ui"; import { getKeyWithKeycode } from "#app/configs/inputs/configHandler"; import { Device } from "#enums/devices"; import { addTextObject, TextStyle } from "#app/ui/text"; - +import { globalScene } from "#app/global-scene"; export default class KeyboardBindingUiHandler extends AbstractBindingUiHandler { - - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); // Listen to gamepad button down events to initiate binding. - scene.input.keyboard?.on("keydown", this.onKeyDown, this); + globalScene.input.keyboard?.on("keydown", this.onKeyDown, this); } setup() { super.setup(); // New button icon setup. - this.newButtonIcon = this.scene.add.sprite(0, 0, "keyboard"); + this.newButtonIcon = globalScene.add.sprite(0, 0, "keyboard"); this.newButtonIcon.setPositionRelative(this.optionSelectBg, 78, 32); this.newButtonIcon.setOrigin(0.5); this.newButtonIcon.setVisible(false); - this.actionLabel = addTextObject(this.scene, 0, 0, "Assign button", TextStyle.SETTINGS_LABEL); + this.actionLabel = addTextObject(0, 0, "Assign button", TextStyle.SETTINGS_LABEL); this.actionLabel.setOrigin(0, 0.5); this.actionLabel.setPositionRelative(this.actionBg, this.actionBg.width - 80, this.actionBg.height / 2); this.actionsContainer.add(this.actionLabel); @@ -32,7 +30,7 @@ export default class KeyboardBindingUiHandler extends AbstractBindingUiHandler { } getSelectedDevice() { - return this.scene.inputController?.selectedDevice[Device.KEYBOARD]; + return globalScene.inputController?.selectedDevice[Device.KEYBOARD]; } onKeyDown(event): void { @@ -51,7 +49,7 @@ export default class KeyboardBindingUiHandler extends AbstractBindingUiHandler { if (!this.listening || this.buttonPressed !== null || blacklist.includes(key)) { return; } - const activeConfig = this.scene.inputController.getActiveConfig(Device.KEYBOARD); + const activeConfig = globalScene.inputController.getActiveConfig(Device.KEYBOARD); const _key = getKeyWithKeycode(activeConfig, key); const buttonIcon = activeConfig.icons[_key]; if (!buttonIcon) { @@ -63,12 +61,11 @@ export default class KeyboardBindingUiHandler extends AbstractBindingUiHandler { } swapAction(): boolean { - const activeConfig = this.scene.inputController.getActiveConfig(Device.KEYBOARD); - if (this.scene.inputController.assignBinding(activeConfig, this.target, this.buttonPressed)) { - this.scene.gameData.saveMappingConfigs(this.getSelectedDevice(), activeConfig); + const activeConfig = globalScene.inputController.getActiveConfig(Device.KEYBOARD); + if (globalScene.inputController.assignBinding(activeConfig, this.target, this.buttonPressed)) { + globalScene.gameData.saveMappingConfigs(this.getSelectedDevice(), activeConfig); return true; } return false; } - } diff --git a/src/ui/settings/move-touch-controls-handler.ts b/src/ui/settings/move-touch-controls-handler.ts index eda75a54a63..44377c8c2ab 100644 --- a/src/ui/settings/move-touch-controls-handler.ts +++ b/src/ui/settings/move-touch-controls-handler.ts @@ -1,31 +1,30 @@ -import TouchControl from "#app/touch-controls"; -import UI from "#app/ui/ui"; -import { Scene } from "phaser"; +import { globalScene } from "#app/global-scene"; +import type TouchControl from "#app/touch-controls"; +import type UI from "#app/ui/ui"; +import i18next from "i18next"; export const TOUCH_CONTROL_POSITIONS_LANDSCAPE = "touchControlPositionsLandscape"; export const TOUCH_CONTROL_POSITIONS_PORTRAIT = "touchControlPositionsPortrait"; - -type ControlPosition = { id: string, x: number, y: number }; +type ControlPosition = { id: string; x: number; y: number }; type ConfigurationEventListeners = { - "touchstart": EventListener[] - "touchmove": EventListener[] - "touchend": EventListener[] + touchstart: EventListener[]; + touchmove: EventListener[]; + touchend: EventListener[]; }; type ToolbarRefs = { - toolbar: HTMLDivElement, - saveButton: HTMLDivElement - resetButton: HTMLDivElement - cancelButton: HTMLDivElement + toolbar: HTMLDivElement; + saveButton: HTMLDivElement; + resetButton: HTMLDivElement; + cancelButton: HTMLDivElement; }; /** * Handles the dragging of touch controls around the screen. */ export default class MoveTouchControlsHandler { - /** The element that is currently being dragged */ private draggingElement: HTMLElement | null = null; @@ -40,9 +39,9 @@ export default class MoveTouchControlsHandler { * These are used to remove the event listeners when the configuration mode is disabled. */ private configurationEventListeners: ConfigurationEventListeners = { - "touchstart": [], - "touchmove": [], - "touchend": [] + touchstart: [], + touchmove: [], + touchend: [], }; private overlay: Phaser.GameObjects.Container; @@ -54,7 +53,7 @@ export default class MoveTouchControlsHandler { this.touchControls = touchControls; this.inConfigurationMode = false; this.setPositions(this.getSavedPositionsOfCurrentOrientation() ?? []); - window.addEventListener("resize", (event) => { + window.addEventListener("resize", _event => { const screenSize = this.getScreenSize(); if (screenSize.width > screenSize.height !== this.isLandscapeMode) { this.changeOrientation(screenSize.width > screenSize.height); @@ -71,7 +70,9 @@ export default class MoveTouchControlsHandler { if (this.inConfigurationMode) { const orientation = document.querySelector("#touchControls #orientation"); if (orientation) { - orientation.textContent = this.isLandscapeMode ? "Landscape" : "Portrait"; + orientation.textContent = this.isLandscapeMode + ? i18next.t("settings:landscape") + : i18next.t("settings:portrait"); } } const positions = this.getSavedPositionsOfCurrentOrientation() ?? []; @@ -90,19 +91,22 @@ export default class MoveTouchControlsHandler { const toolbar = document.createElement("div"); toolbar.id = "configToolbar"; toolbar.innerHTML = ` -
-
-
Reset
-
Save & close
-
Cancel
-
-
-
- Orientation: ${this.isLandscapeMode ? "Landscape" : "Portrait"} -
+
+
+
${i18next.t("settings:touchReset")}
+
${i18next.t("settings:touchSaveClose")}
+
${i18next.t("settings:touchCancel")}
+
+
+
+ ${i18next.t("settings:orientation")} + + ${this.isLandscapeMode ? i18next.t("settings:landscape") : i18next.t("settings:portrait")} +
- `; +
+ `; return toolbar; } @@ -146,7 +150,7 @@ export default class MoveTouchControlsHandler { toolbar, saveButton: toolbar.querySelector("#saveButton")!, resetButton: toolbar.querySelector("#resetButton")!, - cancelButton: toolbar.querySelector("#cancelButton")! + cancelButton: toolbar.querySelector("#cancelButton")!, }; } @@ -178,7 +182,9 @@ export default class MoveTouchControlsHandler { } const rect = this.draggingElement.getBoundingClientRect(); // Map the touch position to the center of the dragged element. - const xOffset = this.isLeft(this.draggingElement) ? touch.clientX - rect.width / 2 : window.innerWidth - touch.clientX - rect.width / 2; + const xOffset = this.isLeft(this.draggingElement) + ? touch.clientX - rect.width / 2 + : window.innerWidth - touch.clientX - rect.width / 2; const yOffset = window.innerHeight - touch.clientY - rect.height / 2; this.setPosition(this.draggingElement, xOffset, yOffset); }; @@ -200,8 +206,8 @@ export default class MoveTouchControlsHandler { .map((controlGroup: HTMLElement) => { return { id: controlGroup.id, - x: parseFloat(this.isLeft(controlGroup) ? controlGroup.style.left : controlGroup.style.right), - y: parseFloat(controlGroup.style.bottom), + x: Number.parseFloat(this.isLeft(controlGroup) ? controlGroup.style.left : controlGroup.style.right), + y: Number.parseFloat(controlGroup.style.bottom), }; }); } @@ -287,7 +293,7 @@ export default class MoveTouchControlsHandler { * @returns All control groups of the touch controls. */ private getControlGroupElements(): HTMLDivElement[] { - return [ ...document.querySelectorAll("#touchControls .control-group") ] as HTMLDivElement[]; + return [...document.querySelectorAll("#touchControls .control-group")] as HTMLDivElement[]; } /** @@ -297,21 +303,21 @@ export default class MoveTouchControlsHandler { */ private createConfigurationEventListeners(controlGroups: HTMLDivElement[]): ConfigurationEventListeners { return { - "touchstart": controlGroups.map((element: HTMLDivElement) => { + touchstart: controlGroups.map((element: HTMLDivElement) => { const startDrag = () => this.startDrag(element); element.addEventListener("touchstart", startDrag, { passive: true }); return startDrag; }), - "touchmove": controlGroups.map(() => { - const drag = (event) => this.drag(event.touches[0]); + touchmove: controlGroups.map(() => { + const drag = event => this.drag(event.touches[0]); window.addEventListener("touchmove", drag, { passive: true }); return drag; }), - "touchend": controlGroups.map(() => { + touchend: controlGroups.map(() => { const stopDrag = () => this.stopDrag(); window.addEventListener("touchend", stopDrag, { passive: true }); return stopDrag; - }) + }), }; } @@ -319,11 +325,18 @@ export default class MoveTouchControlsHandler { * Creates an overlay that covers the screen and allows the user to drag the touch controls around. * Also enables the toolbar for saving, resetting, and canceling the changes. * @param ui The UI of the game. - * @param scene The scene of the game. */ - private createOverlay(ui: UI, scene: Scene) { - const container = new Phaser.GameObjects.Container(scene, 0, 0); - const overlay = new Phaser.GameObjects.Rectangle(scene, 0, 0, scene.game.canvas.width, scene.game.canvas.height, 0x000000, 0.5); + private createOverlay(ui: UI) { + const container = new Phaser.GameObjects.Container(globalScene, 0, 0); + const overlay = new Phaser.GameObjects.Rectangle( + globalScene, + 0, + 0, + globalScene.game.canvas.width, + globalScene.game.canvas.height, + 0x000000, + 0.5, + ); overlay.setInteractive(); container.add(overlay); ui.add(container); @@ -334,17 +347,16 @@ export default class MoveTouchControlsHandler { } /** - * Allows the user to configure the touch controls by dragging buttons around the screen. - * @param ui The UI of the game. - * @param scene The scene of the game. - */ - public enableConfigurationMode(ui: UI, scene: Scene) { + * Allows the user to configure the touch controls by dragging buttons around the screen. + * @param ui The UI of the game. + */ + public enableConfigurationMode(ui: UI) { if (this.inConfigurationMode) { return; } this.inConfigurationMode = true; this.touchControls.disable(); - this.createOverlay(ui, scene); + this.createOverlay(ui); this.createToolbar(); // Create event listeners with a delay to prevent the touchstart event from being triggered immediately. setTimeout(() => { @@ -362,9 +374,11 @@ export default class MoveTouchControlsHandler { // Remove event listeners const { touchstart, touchmove, touchend } = this.configurationEventListeners; - this.getControlGroupElements().forEach((element, index) => element.removeEventListener("touchstart", touchstart[index])); - touchmove.forEach((listener) => window.removeEventListener("touchmove", listener)); - touchend.forEach((listener) => window.removeEventListener("touchend", listener)); + this.getControlGroupElements().forEach((element, index) => + element.removeEventListener("touchstart", touchstart[index]), + ); + touchmove.forEach(listener => window.removeEventListener("touchmove", listener)); + touchend.forEach(listener => window.removeEventListener("touchend", listener)); // Remove configuration toolbar const toolbar = document.querySelector("#touchControls #configToolbar"); @@ -375,5 +389,4 @@ export default class MoveTouchControlsHandler { document.querySelector("#touchControls")?.classList.remove("config-mode"); this.touchControls.enable(); } - } diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts index ab86fa1569a..1d2d71e1e20 100644 --- a/src/ui/settings/navigationMenu.ts +++ b/src/ui/settings/navigationMenu.ts @@ -1,6 +1,6 @@ -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Mode } from "#app/ui/ui"; -import { InputsIcons } from "#app/ui/settings/abstract-control-settings-ui-handler"; +import type { InputsIcons } from "#app/ui/settings/abstract-control-settings-ui-handler"; import { addTextObject, setTextStyle, TextStyle } from "#app/ui/text"; import { addWindow } from "#app/ui/ui-theme"; import { Button } from "#enums/buttons"; @@ -23,7 +23,7 @@ export class NavigationManager { * Creates an instance of NavigationManager. * To create a new tab in the menu, add the mode to the modes array and the label to the labels array. * and instantiate a new NavigationMenu instance in your handler - * like: this.navigationContainer = new NavigationMenu(this.scene, 0, 0); + * like: this.navigationContainer = new NavigationMenu(0, 0); */ constructor() { this.modes = [ @@ -33,7 +33,13 @@ export class NavigationManager { Mode.SETTINGS_GAMEPAD, Mode.SETTINGS_KEYBOARD, ]; - this.labels = [ i18next.t("settings:general"), i18next.t("settings:display"), i18next.t("settings:audio"), i18next.t("settings:gamepad"), i18next.t("settings:keyboard") ]; + this.labels = [ + i18next.t("settings:general"), + i18next.t("settings:display"), + i18next.t("settings:audio"), + i18next.t("settings:gamepad"), + i18next.t("settings:keyboard"), + ]; } public reset() { @@ -54,10 +60,9 @@ export class NavigationManager { /** * Navigates modes based on given direction - * @param scene The current BattleScene instance * @param direction LEFT or RIGHT */ - public navigate(scene, direction) { + public navigate(direction) { const pos = this.modes.indexOf(this.selectedMode); const maxPos = this.modes.length - 1; const increment = direction === LEFT ? -1 : 1; @@ -68,7 +73,7 @@ export class NavigationManager { } else { this.selectedMode = this.modes[pos + increment]; } - scene.ui.setMode(this.selectedMode); + globalScene.ui.setMode(this.selectedMode); this.updateNavigationMenus(); } @@ -90,22 +95,25 @@ export class NavigationManager { } } + /** + * Removes menus from the manager in preparation for reset + */ + public clearNavigationMenus() { + this.navigationMenus.length = 0; + } } export default class NavigationMenu extends Phaser.GameObjects.Container { private navigationIcons: InputsIcons; - public scene: BattleScene; protected headerTitles: Phaser.GameObjects.Text[] = new Array(); /** * Creates an instance of NavigationMenu. - * @param scene The current BattleScene instance. * @param x The x position of the NavigationMenu. * @param y The y position of the NavigationMenu. */ - constructor(scene: BattleScene, x: number, y: number) { - super(scene, x, y); - this.scene = scene; + constructor(x: number, y: number) { + super(globalScene, x, y); this.setup(); } @@ -115,7 +123,7 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { */ setup() { const navigationManager = NavigationManager.getInstance(); - const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); + const headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6 - 2, 24); headerBg.setOrigin(0, 0); this.add(headerBg); this.width = headerBg.width; @@ -123,12 +131,12 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { this.navigationIcons = {}; - const iconPreviousTab = this.scene.add.sprite(8, 4, "keyboard"); + const iconPreviousTab = globalScene.add.sprite(8, 4, "keyboard"); iconPreviousTab.setOrigin(0, -0.1); iconPreviousTab.setPositionRelative(headerBg, 8, 4); this.navigationIcons["BUTTON_CYCLE_FORM"] = iconPreviousTab; - const iconNextTab = this.scene.add.sprite(0, 0, "keyboard"); + const iconNextTab = globalScene.add.sprite(0, 0, "keyboard"); iconNextTab.setOrigin(0, -0.1); iconNextTab.setPositionRelative(headerBg, headerBg.width - 20, 4); this.navigationIcons["BUTTON_CYCLE_SHINY"] = iconNextTab; @@ -136,7 +144,7 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { let relative: Phaser.GameObjects.Sprite | Phaser.GameObjects.Text = iconPreviousTab; let relativeWidth: number = iconPreviousTab.width * 6; for (const label of navigationManager.labels) { - const labelText = addTextObject(this.scene, 0, 0, label, TextStyle.SETTINGS_LABEL); + const labelText = addTextObject(0, 0, label, TextStyle.SETTINGS_LABEL); labelText.setOrigin(0, 0); labelText.setPositionRelative(relative, 6 + relativeWidth / 6, 0); this.add(labelText); @@ -158,8 +166,8 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { const navigationManager = NavigationManager.getInstance(); const posSelected = navigationManager.modes.indexOf(navigationManager.selectedMode); - for (const [ index, title ] of this.headerTitles.entries()) { - setTextStyle(title, this.scene, index === posSelected ? TextStyle.SETTINGS_SELECTED : TextStyle.SETTINGS_LABEL); + for (const [index, title] of this.headerTitles.entries()) { + setTextStyle(title, index === posSelected ? TextStyle.SETTINGS_SELECTED : TextStyle.SETTINGS_LABEL); } } @@ -168,8 +176,8 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { */ updateIcons() { const specialIcons = { - "BUTTON_HOME": "HOME.png", - "BUTTON_DELETE": "DEL.png", + BUTTON_HOME: "HOME.png", + BUTTON_DELETE: "DEL.png", }; for (const settingName of Object.keys(this.navigationIcons)) { if (Object.keys(specialIcons).includes(settingName)) { @@ -178,9 +186,9 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { this.navigationIcons[settingName].alpha = 1; continue; } - const icon = this.scene.inputController?.getIconForLatestInputRecorded(settingName); + const icon = globalScene.inputController?.getIconForLatestInputRecorded(settingName); if (icon) { - const type = this.scene.inputController?.getLastSourceType(); + const type = globalScene.inputController?.getLastSourceType(); this.navigationIcons[settingName].setTexture(type); this.navigationIcons[settingName].setFrame(icon); this.navigationIcons[settingName].alpha = 1; @@ -199,10 +207,10 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { const navigationManager = NavigationManager.getInstance(); switch (button) { case Button.CYCLE_FORM: - navigationManager.navigate(this.scene, LEFT); + navigationManager.navigate(LEFT); return true; case Button.CYCLE_SHINY: - navigationManager.navigate(this.scene, RIGHT); + navigationManager.navigate(RIGHT); return true; } return false; diff --git a/src/ui/settings/option-select-ui-handler.ts b/src/ui/settings/option-select-ui-handler.ts index 8d2c534476a..b3d1735dc19 100644 --- a/src/ui/settings/option-select-ui-handler.ts +++ b/src/ui/settings/option-select-ui-handler.ts @@ -1,13 +1,12 @@ -import BattleScene from "../../battle-scene"; import AbstractOptionSelectUiHandler from "../abstact-option-select-ui-handler"; import { Mode } from "../ui"; export default class OptionSelectUiHandler extends AbstractOptionSelectUiHandler { - constructor(scene: BattleScene, mode: Mode = Mode.OPTION_SELECT) { - super(scene, mode); + constructor(mode: Mode = Mode.OPTION_SELECT) { + super(mode); } - getWindowWidth(): integer { + getWindowWidth(): number { return 64; } } diff --git a/src/ui/settings/settings-audio-ui-handler.ts b/src/ui/settings/settings-audio-ui-handler.ts index 86c6a9bce40..f8cb4da4ba2 100644 --- a/src/ui/settings/settings-audio-ui-handler.ts +++ b/src/ui/settings/settings-audio-ui-handler.ts @@ -1,18 +1,16 @@ -import BattleScene from "../../battle-scene"; -import { Mode } from "../ui"; -"#app/inputs-controller"; +import type { Mode } from "../ui"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; import { SettingType } from "#app/system/settings/settings"; +("#app/inputs-controller"); export default class SettingsAudioUiHandler extends AbstractSettingsUiHandler { /** * Creates an instance of SettingsAudioUiHandler. * - * @param scene - The BattleScene instance. * @param mode - The UI mode, optional. */ - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, SettingType.AUDIO, mode); + constructor(mode: Mode | null = null) { + super(SettingType.AUDIO, mode); this.title = "Audio"; this.localStorageKey = "settings"; this.rowsToDisplay = 6; diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts index a25dbf87b7d..b3505fe90f2 100644 --- a/src/ui/settings/settings-display-ui-handler.ts +++ b/src/ui/settings/settings-display-ui-handler.ts @@ -1,18 +1,16 @@ -import BattleScene from "../../battle-scene"; -import { Mode } from "../ui"; -"#app/inputs-controller"; +import type { Mode } from "../ui"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; import { SettingKeys, SettingType } from "#app/system/settings/settings"; +("#app/inputs-controller"); export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler { /** * Creates an instance of SettingsGamepadUiHandler. * - * @param scene - The BattleScene instance. * @param mode - The UI mode, optional. */ - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, SettingType.DISPLAY, mode); + constructor(mode: Mode | null = null) { + super(SettingType.DISPLAY, mode); this.title = "Display"; /** @@ -29,10 +27,10 @@ export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler label: "English", }; break; - case "es": + case "es-ES": this.settings[languageIndex].options[0] = { - value: "Español", - label: "Español", + value: "Español (ES)", + label: "Español (ES)", }; break; case "it": diff --git a/src/ui/settings/settings-gamepad-ui-handler.ts b/src/ui/settings/settings-gamepad-ui-handler.ts index 864142e055b..0b3a7241ff2 100644 --- a/src/ui/settings/settings-gamepad-ui-handler.ts +++ b/src/ui/settings/settings-gamepad-ui-handler.ts @@ -1,21 +1,21 @@ -import BattleScene from "../../battle-scene"; import { addTextObject, TextStyle } from "../text"; -import { Mode } from "../ui"; +import type { Mode } from "../ui"; import { setSettingGamepad, SettingGamepad, settingGamepadBlackList, settingGamepadDefaults, - settingGamepadOptions + settingGamepadOptions, } from "../../system/settings/settings-gamepad"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; import pad_dualshock from "#app/configs/inputs/pad_dualshock"; import pad_unlicensedSNES from "#app/configs/inputs/pad_unlicensedSNES"; -import { InterfaceConfig } from "#app/inputs-controller"; +import type { InterfaceConfig } from "#app/inputs-controller"; import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler"; import { Device } from "#enums/devices"; import { truncateString } from "#app/utils"; import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; /** * Class representing the settings UI handler for gamepads. @@ -24,20 +24,18 @@ import i18next from "i18next"; */ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiHandler { - /** - * Creates an instance of SettingsGamepadUiHandler. - * - * @param scene - The BattleScene instance. - * @param mode - The UI mode, optional. - */ - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + * Creates an instance of SettingsGamepadUiHandler. + * + * @param mode - The UI mode, optional. + */ + constructor(mode: Mode | null = null) { + super(mode); this.titleSelected = "Gamepad"; this.setting = SettingGamepad; this.settingDeviceDefaults = settingGamepadDefaults; this.settingDeviceOptions = settingGamepadOptions; - this.configs = [ pad_xbox360, pad_dualshock, pad_unlicensedSNES ]; + this.configs = [pad_xbox360, pad_dualshock, pad_unlicensedSNES]; this.commonSettingsCount = 2; this.localStoragePropertyName = "settingsGamepad"; this.settingBlacklisted = settingGamepadBlackList; @@ -47,15 +45,15 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH setSetting = setSettingGamepad; /** - * Setup UI elements. - */ + * Setup UI elements. + */ setup() { super.setup(); // If no gamepads are detected, set up a default UI prompt in the settings container. this.layout["noGamepads"] = new Map(); - const optionsContainer = this.scene.add.container(0, 0); + const optionsContainer = globalScene.add.container(0, 0); optionsContainer.setVisible(false); // Initially hide the container as no gamepads are connected. - const label = addTextObject(this.scene, 8, 28, i18next.t("settings:gamepadPleasePlug"), TextStyle.SETTINGS_LABEL); + const label = addTextObject(8, 28, i18next.t("settings:gamepadPleasePlug"), TextStyle.SETTINGS_LABEL); label.setOrigin(0, 0); optionsContainer.add(label); this.settingsContainer.add(optionsContainer); @@ -66,11 +64,11 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH } /** - * Set the layout for the active configuration. - * - * @param activeConfig - The active gamepad configuration. - * @returns `true` if the layout was successfully applied, otherwise `false`. - */ + * Set the layout for the active configuration. + * + * @param activeConfig - The active gamepad configuration. + * @returns `true` if the layout was successfully applied, otherwise `false`. + */ setLayout(activeConfig: InterfaceConfig): boolean { // Check if there is no active configuration (e.g., no gamepad connected). if (!activeConfig) { @@ -86,15 +84,15 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH } /** - * Update the display of the chosen gamepad. - */ + * Update the display of the chosen gamepad. + */ updateChosenGamepadDisplay(): void { // Update any bindings that might have changed since the last update. this.updateBindings(); this.resetScroll(); // Iterate over the keys in the settingDevice enumeration. - for (const [ index, key ] of Object.keys(this.setting).entries()) { + for (const [index, key] of Object.keys(this.setting).entries()) { const setting = this.setting[key]; // Get the actual setting value using the key. // Check if the current setting corresponds to the controller setting. @@ -107,21 +105,29 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH // Update the text of the first option label under the current setting to the name of the chosen gamepad, // truncating the name to 30 characters if necessary. - this.layout[_key].optionValueLabels[index][0].setText(truncateString(this.scene.inputController.selectedDevice[Device.GAMEPAD], 20)); + this.layout[_key].optionValueLabels[index][0].setText( + truncateString(globalScene.inputController.selectedDevice[Device.GAMEPAD], 20), + ); } } } } /** - * Save the setting to local storage. - * - * @param settingName - The setting to save. - * @param cursor - The cursor position to save. - */ + * Save the setting to local storage. + * + * @param settingName - The setting to save. + * @param cursor - The cursor position to save. + */ saveSettingToLocalStorage(settingName, cursor): void { if (this.setting[settingName] !== this.setting.Controller) { - this.scene.gameData.saveControlSetting(this.device, this.localStoragePropertyName, settingName, this.settingDeviceDefaults, cursor); + globalScene.gameData.saveControlSetting( + this.device, + this.localStoragePropertyName, + settingName, + this.settingDeviceDefaults, + cursor, + ); } } } diff --git a/src/ui/settings/settings-keyboard-ui-handler.ts b/src/ui/settings/settings-keyboard-ui-handler.ts index 17d91b27c57..a7837c8961e 100644 --- a/src/ui/settings/settings-keyboard-ui-handler.ts +++ b/src/ui/settings/settings-keyboard-ui-handler.ts @@ -1,4 +1,3 @@ -import BattleScene from "../../battle-scene"; import { Mode } from "../ui"; import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; import { @@ -6,16 +5,17 @@ import { SettingKeyboard, settingKeyboardBlackList, settingKeyboardDefaults, - settingKeyboardOptions + settingKeyboardOptions, } from "#app/system/settings/settings-keyboard"; import { reverseValueToKeySetting, truncateString } from "#app/utils"; import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler"; -import { InterfaceConfig } from "#app/inputs-controller"; +import type { InterfaceConfig } from "#app/inputs-controller"; import { addTextObject, TextStyle } from "#app/ui/text"; import { deleteBind } from "#app/configs/inputs/configHandler"; import { Device } from "#enums/devices"; import { NavigationManager } from "#app/ui/settings/navigationMenu"; import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; /** * Class representing the settings UI handler for keyboards. @@ -24,80 +24,78 @@ import i18next from "i18next"; */ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUiHandler { /** - * Creates an instance of SettingsKeyboardUiHandler. - * - * @param scene - The BattleScene instance. - * @param mode - The UI mode, optional. - */ - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + * Creates an instance of SettingsKeyboardUiHandler. + * + * @param mode - The UI mode, optional. + */ + constructor(mode: Mode | null = null) { + super(mode); this.titleSelected = "Keyboard"; this.setting = SettingKeyboard; this.settingDeviceDefaults = settingKeyboardDefaults; this.settingDeviceOptions = settingKeyboardOptions; - this.configs = [ cfg_keyboard_qwerty ]; + this.configs = [cfg_keyboard_qwerty]; this.commonSettingsCount = 0; this.textureOverride = "keyboard"; this.localStoragePropertyName = "settingsKeyboard"; this.settingBlacklisted = settingKeyboardBlackList; this.device = Device.KEYBOARD; - const deleteEvent = scene.input.keyboard?.addKey(Phaser.Input.Keyboard.KeyCodes.DELETE); - const restoreDefaultEvent = scene.input.keyboard?.addKey(Phaser.Input.Keyboard.KeyCodes.HOME); - deleteEvent && deleteEvent.on("up", this.onDeleteDown, this); - restoreDefaultEvent && restoreDefaultEvent.on("up", this.onHomeDown, this); + const deleteEvent = globalScene.input.keyboard?.addKey(Phaser.Input.Keyboard.KeyCodes.DELETE); + const restoreDefaultEvent = globalScene.input.keyboard?.addKey(Phaser.Input.Keyboard.KeyCodes.HOME); + deleteEvent?.on("up", this.onDeleteDown, this); + restoreDefaultEvent?.on("up", this.onHomeDown, this); } setSetting = setSettingKeyboard; /** - * Setup UI elements. - */ + * Setup UI elements. + */ setup() { super.setup(); // If no gamepads are detected, set up a default UI prompt in the settings container. this.layout["noKeyboard"] = new Map(); - const optionsContainer = this.scene.add.container(0, 0); + const optionsContainer = globalScene.add.container(0, 0); optionsContainer.setVisible(false); // Initially hide the container as no gamepads are connected. - const label = addTextObject(this.scene, 8, 28, i18next.t("settings:keyboardPleasePress"), TextStyle.SETTINGS_LABEL); + const label = addTextObject(8, 28, i18next.t("settings:keyboardPleasePress"), TextStyle.SETTINGS_LABEL); label.setOrigin(0, 0); optionsContainer.add(label); this.settingsContainer.add(optionsContainer); - const iconDelete = this.scene.add.sprite(0, 0, "keyboard"); + const iconDelete = globalScene.add.sprite(0, 0, "keyboard"); iconDelete.setOrigin(0, -0.1); iconDelete.setPositionRelative(this.actionsBg, this.navigationContainer.width - 260, 4); this.navigationIcons["BUTTON_DELETE"] = iconDelete; - const deleteText = addTextObject(this.scene, 0, 0, i18next.t("settings:delete"), TextStyle.SETTINGS_LABEL); + const deleteText = addTextObject(0, 0, i18next.t("settings:delete"), TextStyle.SETTINGS_LABEL); deleteText.setOrigin(0, 0.15); deleteText.setPositionRelative(iconDelete, -deleteText.width / 6 - 2, 0); this.settingsContainer.add(iconDelete); this.settingsContainer.add(deleteText); - // Map the 'noKeyboard' layout options for easy access. this.layout["noKeyboard"].optionsContainer = optionsContainer; this.layout["noKeyboard"].label = label; } /** - * Handle the home key press event. - */ + * Handle the home key press event. + */ onHomeDown(): void { - if (![ Mode.SETTINGS_KEYBOARD, Mode.SETTINGS_GAMEPAD ].includes(this.scene.ui.getMode())) { + if (![Mode.SETTINGS_KEYBOARD, Mode.SETTINGS_GAMEPAD].includes(globalScene.ui.getMode())) { return; } - this.scene.gameData.resetMappingToFactory(); + globalScene.gameData.resetMappingToFactory(); NavigationManager.getInstance().updateIcons(); } /** - * Handle the delete key press event. - */ + * Handle the delete key press event. + */ onDeleteDown(): void { - if (this.scene.ui.getMode() !== Mode.SETTINGS_KEYBOARD) { + if (globalScene.ui.getMode() !== Mode.SETTINGS_KEYBOARD) { return; } const cursor = this.cursor + this.scrollCursor; // Calculate the absolute cursor position. @@ -114,11 +112,11 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi } /** - * Set the layout for the active configuration. - * - * @param activeConfig - The active keyboard configuration. - * @returns `true` if the layout was successfully applied, otherwise `false`. - */ + * Set the layout for the active configuration. + * + * @param activeConfig - The active keyboard configuration. + * @returns `true` if the layout was successfully applied, otherwise `false`. + */ setLayout(activeConfig: InterfaceConfig): boolean { // Check if there is no active configuration (e.g., no gamepad connected). if (!activeConfig) { @@ -134,14 +132,14 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi } /** - * Update the display of the chosen keyboard layout. - */ + * Update the display of the chosen keyboard layout. + */ updateChosenKeyboardDisplay(): void { // Update any bindings that might have changed since the last update. this.updateBindings(); // Iterate over the keys in the settingDevice enumeration. - for (const [ index, key ] of Object.keys(this.setting).entries()) { + for (const [index, key] of Object.keys(this.setting).entries()) { const setting = this.setting[key]; // Get the actual setting value using the key. // Check if the current setting corresponds to the layout setting. @@ -153,31 +151,38 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi } // Skip updating the no gamepad layout. // Update the text of the first option label under the current setting to the name of the chosen gamepad, // truncating the name to 30 characters if necessary. - this.layout[_key].optionValueLabels[index][0].setText(truncateString(this.scene.inputController.selectedDevice[Device.KEYBOARD], 22)); + this.layout[_key].optionValueLabels[index][0].setText( + truncateString(globalScene.inputController.selectedDevice[Device.KEYBOARD], 22), + ); } } } - } /** - * Save the custom keyboard mapping to local storage. - * - * @param config - The configuration to save. - */ + * Save the custom keyboard mapping to local storage. + * + * @param config - The configuration to save. + */ saveCustomKeyboardMappingToLocalStorage(config): void { - this.scene.gameData.saveMappingConfigs(this.scene.inputController?.selectedDevice[Device.KEYBOARD], config); + globalScene.gameData.saveMappingConfigs(globalScene.inputController?.selectedDevice[Device.KEYBOARD], config); } /** - * Save the setting to local storage. - * - * @param settingName - The name of the setting to save. - * @param cursor - The cursor position to save. - */ + * Save the setting to local storage. + * + * @param settingName - The name of the setting to save. + * @param cursor - The cursor position to save. + */ saveSettingToLocalStorage(settingName, cursor): void { if (this.setting[settingName] !== this.setting.Default_Layout) { - this.scene.gameData.saveControlSetting(this.device, this.localStoragePropertyName, settingName, this.settingDeviceDefaults, cursor); + globalScene.gameData.saveControlSetting( + this.device, + this.localStoragePropertyName, + settingName, + this.settingDeviceDefaults, + cursor, + ); } } } diff --git a/src/ui/settings/settings-ui-handler.ts b/src/ui/settings/settings-ui-handler.ts index 3c5a7dd2c90..22ea76d798b 100644 --- a/src/ui/settings/settings-ui-handler.ts +++ b/src/ui/settings/settings-ui-handler.ts @@ -1,17 +1,15 @@ -import BattleScene from "../../battle-scene"; import { SettingType } from "../../system/settings/settings"; -import { Mode } from "../ui"; +import type { Mode } from "../ui"; import AbstractSettingsUiHandler from "./abstract-settings-ui-handler"; export default class SettingsUiHandler extends AbstractSettingsUiHandler { /** * Creates an instance of SettingsGamepadUiHandler. * - * @param scene - The BattleScene instance. * @param mode - The UI mode, optional. */ - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, SettingType.GENERAL, mode); + constructor(mode: Mode | null = null) { + super(SettingType.GENERAL, mode); this.title = "General"; this.localStorageKey = "settings"; } diff --git a/src/ui/settings/shiny_icons.json b/src/ui/settings/shiny_icons.json index d6465cf2c3a..f40c606ca47 100644 --- a/src/ui/settings/shiny_icons.json +++ b/src/ui/settings/shiny_icons.json @@ -1,41 +1,41 @@ { - "textures": [ - { - "image": "shiny_icons.png", - "format": "RGBA8888", - "size": { - "w": 45, - "h": 14 - }, - "scale": 1, - "frames": [ - { - "filename": "0", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 14 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 15, - "h": 14 - }, - "frame": { - "x": 0, - "y": 0, - "w": 15, - "h": 14 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3275c7504a9b35b288265e191b1d14c:420725f3fb73c2cac0ab3bbc0a46f2e1:3a8b8ca0f0e4be067dd46c07b78ee013$" - } + "textures": [ + { + "image": "shiny_icons.png", + "format": "RGBA8888", + "size": { + "w": 45, + "h": 14 + }, + "scale": 1, + "frames": [ + { + "filename": "0", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 45, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a3275c7504a9b35b288265e191b1d14c:420725f3fb73c2cac0ab3bbc0a46f2e1:3a8b8ca0f0e4be067dd46c07b78ee013$" + } } diff --git a/src/ui/starter-container.ts b/src/ui/starter-container.ts index ce21d13add8..71e40844f38 100644 --- a/src/ui/starter-container.ts +++ b/src/ui/starter-container.ts @@ -1,9 +1,8 @@ -import BattleScene from "../battle-scene"; -import PokemonSpecies from "../data/pokemon-species"; +import { globalScene } from "#app/global-scene"; +import type PokemonSpecies from "../data/pokemon-species"; import { addTextObject, TextStyle } from "./text"; export class StarterContainer extends Phaser.GameObjects.Container { - public scene: BattleScene; public species: PokemonSpecies; public icon: Phaser.GameObjects.Sprite; public shinyIcons: Phaser.GameObjects.Image[] = []; @@ -14,18 +13,18 @@ export class StarterContainer extends Phaser.GameObjects.Container { public classicWinIcon: Phaser.GameObjects.Image; public candyUpgradeIcon: Phaser.GameObjects.Image; public candyUpgradeOverlayIcon: Phaser.GameObjects.Image; - public cost: number = 0; + public cost = 0; - constructor(scene: BattleScene, species: PokemonSpecies) { - super(scene, 0, 0); + constructor(species: PokemonSpecies) { + super(globalScene, 0, 0); this.species = species; - const defaultDexAttr = scene.gameData.getSpeciesDefaultDexAttr(species, false, true); - const defaultProps = scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); // starter passive bg - const starterPassiveBg = this.scene.add.image(2, 5, "passive_bg"); + const starterPassiveBg = globalScene.add.image(2, 5, "passive_bg"); starterPassiveBg.setOrigin(0, 0); starterPassiveBg.setScale(0.75); starterPassiveBg.setVisible(false); @@ -33,17 +32,23 @@ export class StarterContainer extends Phaser.GameObjects.Container { this.starterPassiveBgs = starterPassiveBg; // icon - this.icon = this.scene.add.sprite(-2, 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon = globalScene.add.sprite( + -2, + 2, + species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant), + ); this.icon.setScale(0.5); this.icon.setOrigin(0, 0); - this.icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon.setFrame( + species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant), + ); this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); this.icon.setTint(0); this.add(this.icon); // shiny icons for (let i = 0; i < 3; i++) { - const shinyIcon = this.scene.add.image(i * -3 + 12, 2, "shiny_star_small"); + const shinyIcon = globalScene.add.image(i * -3 + 12, 2, "shiny_star_small"); shinyIcon.setScale(0.5); shinyIcon.setOrigin(0, 0); shinyIcon.setVisible(false); @@ -52,7 +57,9 @@ export class StarterContainer extends Phaser.GameObjects.Container { this.add(this.shinyIcons); // value label - const label = addTextObject(this.scene, 1, 2, "0", TextStyle.WINDOW, { fontSize: "32px" }); + const label = addTextObject(1, 2, "0", TextStyle.WINDOW, { + fontSize: "32px", + }); label.setShadowOffset(2, 2); label.setOrigin(0, 0); label.setVisible(false); @@ -60,7 +67,7 @@ export class StarterContainer extends Phaser.GameObjects.Container { this.label = label; // hidden ability icon - const abilityIcon = this.scene.add.image(12, 7, "ha_capsule"); + const abilityIcon = globalScene.add.image(12, 7, "ha_capsule"); abilityIcon.setOrigin(0, 0); abilityIcon.setScale(0.5); abilityIcon.setVisible(false); @@ -68,7 +75,7 @@ export class StarterContainer extends Phaser.GameObjects.Container { this.hiddenAbilityIcon = abilityIcon; // favorite icon - const favoriteIcon = this.scene.add.image(0, 7, "favorite"); + const favoriteIcon = globalScene.add.image(0, 7, "favorite"); favoriteIcon.setOrigin(0, 0); favoriteIcon.setScale(0.5); favoriteIcon.setVisible(false); @@ -76,7 +83,7 @@ export class StarterContainer extends Phaser.GameObjects.Container { this.favoriteIcon = favoriteIcon; // classic win icon - const classicWinIcon = this.scene.add.image(0, 12, "champion_ribbon"); + const classicWinIcon = globalScene.add.image(0, 12, "champion_ribbon"); classicWinIcon.setOrigin(0, 0); classicWinIcon.setScale(0.5); classicWinIcon.setVisible(false); @@ -84,7 +91,7 @@ export class StarterContainer extends Phaser.GameObjects.Container { this.classicWinIcon = classicWinIcon; // candy upgrade icon - const candyUpgradeIcon = this.scene.add.image(12, 12, "candy"); + const candyUpgradeIcon = globalScene.add.image(12, 12, "candy"); candyUpgradeIcon.setOrigin(0, 0); candyUpgradeIcon.setScale(0.25); candyUpgradeIcon.setVisible(false); @@ -92,7 +99,7 @@ export class StarterContainer extends Phaser.GameObjects.Container { this.candyUpgradeIcon = candyUpgradeIcon; // candy upgrade overlay icon - const candyUpgradeOverlayIcon = this.scene.add.image(12, 12, "candy_overlay"); + const candyUpgradeOverlayIcon = globalScene.add.image(12, 12, "candy_overlay"); candyUpgradeOverlayIcon.setOrigin(0, 0); candyUpgradeOverlayIcon.setScale(0.25); candyUpgradeOverlayIcon.setVisible(false); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index bb999dc736a..ccc56f38368 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1,27 +1,38 @@ -import { BattleSceneEventType, CandyUpgradeNotificationChangedEvent } from "#app/events/battle-scene"; +import type { CandyUpgradeNotificationChangedEvent } from "#app/events/battle-scene"; +import { BattleSceneEventType } from "#app/events/battle-scene"; import { pokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import { Variant, getVariantTint, getVariantIcon } from "#app/data/variant"; +import type { Variant } from "#app/data/variant"; +import { getVariantTint, getVariantIcon } from "#app/data/variant"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; -import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; -import BattleScene, { starterColors } from "#app/battle-scene"; +import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import { starterColors } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; +import type { Ability } from "#app/data/ability"; import { allAbilities } from "#app/data/ability"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; import { GrowthRate, getGrowthRateColor } from "#app/data/exp"; import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; -import { allMoves } from "#app/data/move"; -import { Nature, getNatureName } from "#app/data/nature"; +import { allMoves } from "#app/data/moves/move"; +import { getNatureName } from "#app/data/nature"; import { pokemonFormChanges } from "#app/data/pokemon-forms"; -import { LevelMoves, pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; -import PokemonSpecies, { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; +import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; +import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpeciesForm, getPokerusStarters } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; -import { starterPassiveAbilities } from "#app/data/balance/passives"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { GameModes } from "#app/game-mode"; -import { AbilityAttr, DexAttr, DexAttrProps, DexEntry, StarterMoveset, StarterAttributes, StarterPreferences, StarterPrefs } from "#app/system/game-data"; +import type { + DexAttrProps, + DexEntry, + StarterMoveset, + StarterAttributes, + StarterPreferences, +} from "#app/system/game-data"; +import { AbilityAttr, DexAttr, loadStarterPreferences, saveStarterPreferences } from "#app/system/game-data"; import { Tutorial, handleTutorial } from "#app/tutorial"; -import * as Utils from "#app/utils"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import MessageUiHandler from "#app/ui/message-ui-handler"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; import { StatsContainer } from "#app/ui/stats-container"; @@ -36,11 +47,10 @@ import * as Challenge from "#app/data/challenge"; import MoveInfoOverlay from "#app/ui/move-info-overlay"; import { getEggTierForSpecies } from "#app/data/egg"; import { Device } from "#enums/devices"; -import { Moves } from "#enums/moves"; +import type { 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"; @@ -49,75 +59,96 @@ import { SelectChallengePhase } from "#app/phases/select-challenge-phase"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { Abilities } from "#enums/abilities"; -import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; +import { + getPassiveCandyCount, + getValueReductionCandyCounts, + getSameSpeciesEggCandyCounts, +} from "#app/data/balance/starters"; +import { + BooleanHolder, + 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"; +import { achvs } from "#app/system/achv"; +import * as Utils from "../utils"; +import type { GameObjects } from "phaser"; export type StarterSelectCallback = (starters: Starter[]) => void; export interface Starter { species: PokemonSpecies; dexAttr: bigint; - abilityIndex: integer, + abilityIndex: number; passive: boolean; nature: Nature; moveset?: StarterMoveset; pokerus: boolean; nickname?: string; + teraType?: PokemonType; } interface LanguageSetting { - starterInfoTextSize: string, - instructionTextSize: string, - starterInfoXPos?: integer, - starterInfoYOffset?: integer + starterInfoTextSize: string; + instructionTextSize: string; + starterInfoXPos?: number; + starterInfoYOffset?: number; } const languageSettings: { [key: string]: LanguageSetting } = { - "en":{ + en: { starterInfoTextSize: "56px", instructionTextSize: "38px", }, - "de":{ + de: { starterInfoTextSize: "48px", instructionTextSize: "35px", starterInfoXPos: 33, }, - "es":{ - starterInfoTextSize: "56px", + "es-ES": { + starterInfoTextSize: "52px", instructionTextSize: "35px", }, - "fr":{ + fr: { starterInfoTextSize: "54px", instructionTextSize: "38px", }, - "it":{ + it: { starterInfoTextSize: "56px", instructionTextSize: "38px", }, - "pt_BR":{ + pt_BR: { starterInfoTextSize: "47px", instructionTextSize: "38px", starterInfoXPos: 33, }, - "zh":{ + zh: { starterInfoTextSize: "47px", instructionTextSize: "38px", starterInfoYOffset: 1, starterInfoXPos: 24, }, - "pt":{ + pt: { starterInfoTextSize: "48px", instructionTextSize: "42px", starterInfoXPos: 33, }, - "ko":{ + ko: { starterInfoTextSize: "52px", instructionTextSize: "38px", }, - "ja":{ + ja: { starterInfoTextSize: "51px", instructionTextSize: "38px", }, - "ca-ES":{ + "ca-ES": { starterInfoTextSize: "56px", instructionTextSize: "38px", }, @@ -129,16 +160,17 @@ const valueReductionMax = 2; const filterBarHeight = 17; const speciesContainerX = 109; // if team on the RIGHT: 109 / if on the LEFT: 143 const teamWindowX = 285; // if team on the RIGHT: 285 / if on the LEFT: 109 -const teamWindowY = 18; +const teamWindowY = 38; const teamWindowWidth = 34; -const teamWindowHeight = 132; +const teamWindowHeight = 107; +const randomSelectionWindowHeight = 20; /** * Calculates the starter position for a Pokemon of a given UI index * @param index UI index to calculate the starter position of * @returns An interface with an x and y property */ -function calcStarterPosition(index: number, scrollCursor:number = 0): {x: number, y: number} { +function calcStarterPosition(index: number, scrollCursor = 0): { x: number; y: number } { const yOffset = 13; const height = 17; const x = (index % 9) * 18; @@ -164,7 +196,7 @@ function calcStarterIconY(index: number) { * @param teamSize how many Pokemon are in the team (0-6) * @returns index of the closest Pokemon in the team container */ -function findClosestStarterIndex(y: number, teamSize: number = 6): number { +function findClosestStarterIndex(y: number, teamSize = 6): number { let smallestDistance = teamWindowHeight; let closestStarterIndex = 0; for (let i = 0; i < teamSize; i++) { @@ -197,6 +229,16 @@ function findClosestStarterRow(index: number, numberOfRows: number) { return closestRowIndex; } +interface SpeciesDetails { + shiny?: boolean; + formIndex?: number; + female?: boolean; + variant?: Variant; + abilityIndex?: number; + natureIndex?: number; + forSeen?: boolean; // default = false + teraType?: PokemonType; +} export default class StarterSelectUiHandler extends MessageUiHandler { private starterSelectContainer: Phaser.GameObjects.Container; @@ -233,6 +275,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonEggMoveContainers: Phaser.GameObjects.Container[]; private pokemonEggMoveBgs: Phaser.GameObjects.NineSlice[]; private pokemonEggMoveLabels: Phaser.GameObjects.Text[]; + private pokemonCandyContainer: Phaser.GameObjects.Container; private pokemonCandyIcon: Phaser.GameObjects.Sprite; private pokemonCandyDarknessOverlay: Phaser.GameObjects.Sprite; private pokemonCandyOverlayIcon: Phaser.GameObjects.Sprite; @@ -240,11 +283,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonCaughtHatchedContainer: Phaser.GameObjects.Container; private pokemonCaughtCountText: Phaser.GameObjects.Text; private pokemonFormText: Phaser.GameObjects.Text; - private pokemonHatchedIcon : Phaser.GameObjects.Sprite; + private pokemonHatchedIcon: Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; private pokemonShinyIcon: Phaser.GameObjects.Sprite; private pokemonPassiveDisabledIcon: Phaser.GameObjects.Sprite; private pokemonPassiveLockedIcon: Phaser.GameObjects.Sprite; + private teraIcon: Phaser.GameObjects.Sprite; private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined; private instructionsContainer: Phaser.GameObjects.Container; @@ -254,30 +298,31 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private abilityIconElement: Phaser.GameObjects.Sprite; private genderIconElement: Phaser.GameObjects.Sprite; private natureIconElement: Phaser.GameObjects.Sprite; - private variantIconElement: Phaser.GameObjects.Sprite; + private teraIconElement: Phaser.GameObjects.Sprite; private goFilterIconElement: Phaser.GameObjects.Sprite; private shinyLabel: Phaser.GameObjects.Text; private formLabel: Phaser.GameObjects.Text; private genderLabel: Phaser.GameObjects.Text; private abilityLabel: Phaser.GameObjects.Text; private natureLabel: Phaser.GameObjects.Text; - private variantLabel: Phaser.GameObjects.Text; + private teraLabel: Phaser.GameObjects.Text; private goFilterLabel: Phaser.GameObjects.Text; private starterSelectMessageBox: Phaser.GameObjects.NineSlice; private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; private statsContainer: StatsContainer; - private moveInfoOverlay : MoveInfoOverlay; + private moveInfoOverlay: MoveInfoOverlay; private statsMode: boolean; - private starterIconsCursorXOffset: number = -3; - private starterIconsCursorYOffset: number = 1; + private starterIconsCursorXOffset = -3; + private starterIconsCursorYOffset = 1; private starterIconsCursorIndex: number; private filterMode: boolean; - private dexAttrCursor: bigint = 0n; - private abilityCursor: number = -1; - private natureCursor: number = -1; - private filterBarCursor: integer = 0; + private dexAttrCursor = 0n; + private abilityCursor = -1; + private natureCursor = -1; + private teraCursor: PokemonType = PokemonType.UNKNOWN; + private filterBarCursor = 0; private starterMoveset: StarterMoveset | null; private scrollCursor: number; @@ -287,8 +332,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { public starterSpecies: PokemonSpecies[] = []; private pokerusSpecies: PokemonSpecies[] = []; private starterAttr: bigint[] = []; - private starterAbilityIndexes: integer[] = []; + private starterAbilityIndexes: number[] = []; private starterNatures: Nature[] = []; + private starterTeras: PokemonType[] = []; private starterMovesets: StarterMoveset[] = []; private speciesStarterDexEntry: DexEntry | null; private speciesStarterMoves: Moves[]; @@ -297,11 +343,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private canCycleGender: boolean; private canCycleAbility: boolean; private canCycleNature: boolean; - private canCycleVariant: boolean; - private value: integer = 0; - private canAddParty: boolean; + private canCycleTera: boolean; - private assetLoadCancelled: Utils.BooleanHolder | null; + private assetLoadCancelled: BooleanHolder | null; public cursorObj: Phaser.GameObjects.Image; private starterCursorObjs: Phaser.GameObjects.Image[]; private pokerusCursorObjs: Phaser.GameObjects.Image[]; @@ -309,6 +353,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterIconsCursorObj: Phaser.GameObjects.Image; private valueLimitLabel: Phaser.GameObjects.Text; private startCursorObj: Phaser.GameObjects.NineSlice; + private randomCursorObj: Phaser.GameObjects.NineSlice; private iconAnimHandler: PokemonIconAnimHandler; @@ -323,10 +368,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterPreferences: StarterPreferences; - protected blockInput: boolean = false; + protected blockInput = false; - constructor(scene: BattleScene) { - super(scene, Mode.STARTER_SELECT); + constructor() { + super(Mode.STARTER_SELECT); } setup() { @@ -335,91 +380,120 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)) ?? "en"; const textSettings = languageSettings[langSettingKey]; - this.starterSelectContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); + this.starterSelectContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); this.starterSelectContainer.setVisible(false); ui.add(this.starterSelectContainer); - const bgColor = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0x006860); + const bgColor = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0x006860, + ); bgColor.setOrigin(0, 0); this.starterSelectContainer.add(bgColor); - const starterSelectBg = this.scene.add.image(0, 0, "starter_select_bg"); + const starterSelectBg = globalScene.add.image(0, 0, "starter_select_bg"); starterSelectBg.setOrigin(0, 0); this.starterSelectContainer.add(starterSelectBg); - this.shinyOverlay = this.scene.add.image(6, 6, "summary_overlay_shiny"); + this.shinyOverlay = globalScene.add.image(6, 6, "summary_overlay_shiny"); this.shinyOverlay.setOrigin(0, 0); this.shinyOverlay.setVisible(false); this.starterSelectContainer.add(this.shinyOverlay); - const starterContainerWindow = addWindow(this.scene, speciesContainerX, filterBarHeight + 1, 175, 161); - const starterContainerBg = this.scene.add.image(speciesContainerX + 1, filterBarHeight + 2, "starter_container_bg"); + const starterContainerWindow = addWindow(speciesContainerX, filterBarHeight + 1, 175, 161); + const starterContainerBg = globalScene.add.image( + speciesContainerX + 1, + filterBarHeight + 2, + "starter_container_bg", + ); starterContainerBg.setOrigin(0, 0); this.starterSelectContainer.add(starterContainerBg); - this.starterSelectContainer.add(addWindow(this.scene, teamWindowX, teamWindowY, teamWindowWidth, teamWindowHeight)); - this.starterSelectContainer.add(addWindow(this.scene, teamWindowX, teamWindowY + teamWindowHeight - 5, teamWindowWidth, teamWindowWidth, true)); + this.starterSelectContainer.add( + addWindow( + teamWindowX, + teamWindowY - randomSelectionWindowHeight, + teamWindowWidth, + randomSelectionWindowHeight, + true, + ), + ); + this.starterSelectContainer.add(addWindow(teamWindowX, teamWindowY, teamWindowWidth, teamWindowHeight)); + this.starterSelectContainer.add( + addWindow(teamWindowX, teamWindowY + teamWindowHeight, teamWindowWidth, teamWindowWidth, true), + ); this.starterSelectContainer.add(starterContainerWindow); // Create and initialise filter bar - this.filterBarContainer = this.scene.add.container(0, 0); - this.filterBar = new FilterBar(this.scene, Math.min(speciesContainerX, teamWindowX), 1, 210, filterBarHeight); + this.filterBarContainer = globalScene.add.container(0, 0); + this.filterBar = new FilterBar(Math.min(speciesContainerX, teamWindowX), 1, 210, filterBarHeight); // gen filter const genOptions: DropDownOption[] = [ - new DropDownOption(this.scene, 1, new DropDownLabel(i18next.t("starterSelectUiHandler:gen1"))), - new DropDownOption(this.scene, 2, new DropDownLabel(i18next.t("starterSelectUiHandler:gen2"))), - new DropDownOption(this.scene, 3, new DropDownLabel(i18next.t("starterSelectUiHandler:gen3"))), - new DropDownOption(this.scene, 4, new DropDownLabel(i18next.t("starterSelectUiHandler:gen4"))), - new DropDownOption(this.scene, 5, new DropDownLabel(i18next.t("starterSelectUiHandler:gen5"))), - new DropDownOption(this.scene, 6, new DropDownLabel(i18next.t("starterSelectUiHandler:gen6"))), - new DropDownOption(this.scene, 7, new DropDownLabel(i18next.t("starterSelectUiHandler:gen7"))), - new DropDownOption(this.scene, 8, new DropDownLabel(i18next.t("starterSelectUiHandler:gen8"))), - new DropDownOption(this.scene, 9, new DropDownLabel(i18next.t("starterSelectUiHandler:gen9"))), + new DropDownOption(1, new DropDownLabel(i18next.t("starterSelectUiHandler:gen1"))), + new DropDownOption(2, new DropDownLabel(i18next.t("starterSelectUiHandler:gen2"))), + new DropDownOption(3, new DropDownLabel(i18next.t("starterSelectUiHandler:gen3"))), + new DropDownOption(4, new DropDownLabel(i18next.t("starterSelectUiHandler:gen4"))), + new DropDownOption(5, new DropDownLabel(i18next.t("starterSelectUiHandler:gen5"))), + new DropDownOption(6, new DropDownLabel(i18next.t("starterSelectUiHandler:gen6"))), + new DropDownOption(7, new DropDownLabel(i18next.t("starterSelectUiHandler:gen7"))), + new DropDownOption(8, new DropDownLabel(i18next.t("starterSelectUiHandler:gen8"))), + new DropDownOption(9, new DropDownLabel(i18next.t("starterSelectUiHandler:gen9"))), ]; - const genDropDown: DropDown = new DropDown(this.scene, 0, 0, genOptions, this.updateStarters, DropDownType.HYBRID); + const genDropDown: DropDown = new DropDown(0, 0, genOptions, this.updateStarters, DropDownType.HYBRID); this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); // type filter - const typeKeys = Object.keys(Type).filter(v => isNaN(Number(v))); + const typeKeys = Object.keys(PokemonType).filter(v => Number.isNaN(Number(v))); const typeOptions: DropDownOption[] = []; typeKeys.forEach((type, index) => { if (index === 0 || index === 19) { return; } - const typeSprite = this.scene.add.sprite(0, 0, Utils.getLocalizedSpriteKey("types")); + const typeSprite = globalScene.add.sprite(0, 0, getLocalizedSpriteKey("types")); typeSprite.setScale(0.5); typeSprite.setFrame(type.toLowerCase()); - typeOptions.push(new DropDownOption(this.scene, index, new DropDownLabel("", typeSprite))); + typeOptions.push(new DropDownOption(index, new DropDownLabel("", typeSprite))); }); - this.filterBar.addFilter(DropDownColumn.TYPES, i18next.t("filterBar:typeFilter"), new DropDown(this.scene, 0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5)); + this.filterBar.addFilter( + DropDownColumn.TYPES, + i18next.t("filterBar:typeFilter"), + new DropDown(0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5), + ); // caught filter - const shiny1Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); + const shiny1Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); shiny1Sprite.setOrigin(0.15, 0.2); shiny1Sprite.setScale(0.6); shiny1Sprite.setFrame(getVariantIcon(0)); shiny1Sprite.setTint(getVariantTint(0)); - const shiny2Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); + const shiny2Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); shiny2Sprite.setOrigin(0.15, 0.2); shiny2Sprite.setScale(0.6); shiny2Sprite.setFrame(getVariantIcon(1)); shiny2Sprite.setTint(getVariantTint(1)); - const shiny3Sprite = this.scene.add.sprite(0, 0, "shiny_icons"); + const shiny3Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); shiny3Sprite.setOrigin(0.15, 0.2); shiny3Sprite.setScale(0.6); shiny3Sprite.setFrame(getVariantIcon(2)); shiny3Sprite.setTint(getVariantTint(2)); const caughtOptions = [ - new DropDownOption(this.scene, "SHINY3", new DropDownLabel("", shiny3Sprite)), - new DropDownOption(this.scene, "SHINY2", new DropDownLabel("", shiny2Sprite)), - new DropDownOption(this.scene, "SHINY", new DropDownLabel("", shiny1Sprite)), - new DropDownOption(this.scene, "NORMAL", new DropDownLabel(i18next.t("filterBar:normal"))), - new DropDownOption(this.scene, "UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))) + new DropDownOption("SHINY3", new DropDownLabel("", shiny3Sprite)), + new DropDownOption("SHINY2", new DropDownLabel("", shiny2Sprite)), + new DropDownOption("SHINY", new DropDownLabel("", shiny1Sprite)), + new DropDownOption("NORMAL", new DropDownLabel(i18next.t("filterBar:normal"))), + new DropDownOption("UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))), ]; - this.filterBar.addFilter(DropDownColumn.CAUGHT, i18next.t("filterBar:caughtFilter"), new DropDown(this.scene, 0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID)); + this.filterBar.addFilter( + DropDownColumn.CAUGHT, + i18next.t("filterBar:caughtFilter"), + new DropDown(0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID), + ); // unlocks filter const passiveLabels = [ @@ -432,16 +506,22 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const costReductionLabels = [ new DropDownLabel(i18next.t("filterBar:costReduction"), undefined, DropDownState.OFF), new DropDownLabel(i18next.t("filterBar:costReductionUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedOne"), undefined, DropDownState.ONE), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedTwo"), undefined, DropDownState.TWO), new DropDownLabel(i18next.t("filterBar:costReductionUnlockable"), undefined, DropDownState.UNLOCKABLE), new DropDownLabel(i18next.t("filterBar:costReductionLocked"), undefined, DropDownState.EXCLUDE), ]; const unlocksOptions = [ - new DropDownOption(this.scene, "PASSIVE", passiveLabels), - new DropDownOption(this.scene, "COST_REDUCTION", costReductionLabels), + new DropDownOption("PASSIVE", passiveLabels), + new DropDownOption("COST_REDUCTION", costReductionLabels), ]; - this.filterBar.addFilter(DropDownColumn.UNLOCKS, i18next.t("filterBar:unlocksFilter"), new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL)); + this.filterBar.addFilter( + DropDownColumn.UNLOCKS, + i18next.t("filterBar:unlocksFilter"), + new DropDown(0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL), + ); // misc filter const favoriteLabels = [ @@ -468,23 +548,36 @@ export default class StarterSelectUiHandler extends MessageUiHandler { new DropDownLabel(i18next.t("filterBar:hasPokerus"), undefined, DropDownState.ON), ]; const miscOptions = [ - new DropDownOption(this.scene, "FAVORITE", favoriteLabels), - new DropDownOption(this.scene, "WIN", winLabels), - new DropDownOption(this.scene, "HIDDEN_ABILITY", hiddenAbilityLabels), - new DropDownOption(this.scene, "EGG", eggLabels), - new DropDownOption(this.scene, "POKERUS", pokerusLabels), + new DropDownOption("FAVORITE", favoriteLabels), + new DropDownOption("WIN", winLabels), + new DropDownOption("HIDDEN_ABILITY", hiddenAbilityLabels), + new DropDownOption("EGG", eggLabels), + new DropDownOption("POKERUS", pokerusLabels), ]; - this.filterBar.addFilter(DropDownColumn.MISC, i18next.t("filterBar:miscFilter"), new DropDown(this.scene, 0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL)); + this.filterBar.addFilter( + DropDownColumn.MISC, + i18next.t("filterBar:miscFilter"), + new DropDown(0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL), + ); // sort filter const sortOptions = [ - new DropDownOption(this.scene, SortCriteria.NUMBER, new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON)), - new DropDownOption(this.scene, SortCriteria.COST, new DropDownLabel(i18next.t("filterBar:sortByCost"))), - new DropDownOption(this.scene, SortCriteria.CANDY, new DropDownLabel(i18next.t("filterBar:sortByCandies"))), - new DropDownOption(this.scene, SortCriteria.IV, new DropDownLabel(i18next.t("filterBar:sortByIVs"))), - new DropDownOption(this.scene, SortCriteria.NAME, new DropDownLabel(i18next.t("filterBar:sortByName"))) + new DropDownOption( + SortCriteria.NUMBER, + new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON), + ), + new DropDownOption(SortCriteria.COST, new DropDownLabel(i18next.t("filterBar:sortByCost"))), + new DropDownOption(SortCriteria.CANDY, new DropDownLabel(i18next.t("filterBar:sortByCandies"))), + new DropDownOption(SortCriteria.IV, new DropDownLabel(i18next.t("filterBar:sortByIVs"))), + new DropDownOption(SortCriteria.NAME, new DropDownLabel(i18next.t("filterBar:sortByName"))), + new DropDownOption(SortCriteria.CAUGHT, new DropDownLabel(i18next.t("filterBar:sortByNumCaught"))), + new DropDownOption(SortCriteria.HATCHED, new DropDownLabel(i18next.t("filterBar:sortByNumHatched"))), ]; - this.filterBar.addFilter(DropDownColumn.SORT, i18next.t("filterBar:sortFilter"), new DropDown(this.scene, 0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE)); + this.filterBar.addFilter( + DropDownColumn.SORT, + i18next.t("filterBar:sortFilter"), + new DropDown(0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE), + ); this.filterBarContainer.add(this.filterBar); this.starterSelectContainer.add(this.filterBarContainer); @@ -492,39 +585,50 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Offset the generation filter dropdown to avoid covering the filtered pokemon this.filterBar.offsetHybridFilters(); - if (!this.scene.uiTheme) { + if (!globalScene.uiTheme) { starterContainerWindow.setVisible(false); } this.iconAnimHandler = new PokemonIconAnimHandler(); - this.iconAnimHandler.setup(this.scene); + this.iconAnimHandler.setup(); - this.pokemonNumberText = addTextObject(this.scene, 17, 1, "0000", TextStyle.SUMMARY); + this.pokemonNumberText = addTextObject(17, 1, "0000", TextStyle.SUMMARY); this.pokemonNumberText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNumberText); - this.pokemonNameText = addTextObject(this.scene, 6, 112, "", TextStyle.SUMMARY); + this.pokemonNameText = addTextObject(6, 112, "", TextStyle.SUMMARY); this.pokemonNameText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNameText); - this.pokemonGrowthRateLabelText = addTextObject(this.scene, 8, 106, i18next.t("starterSelectUiHandler:growthRate"), TextStyle.SUMMARY_ALT, { fontSize: "36px" }); + this.pokemonGrowthRateLabelText = addTextObject( + 8, + 106, + i18next.t("starterSelectUiHandler:growthRate"), + TextStyle.SUMMARY_ALT, + { fontSize: "36px" }, + ); this.pokemonGrowthRateLabelText.setOrigin(0, 0); this.pokemonGrowthRateLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonGrowthRateLabelText); - this.pokemonGrowthRateText = addTextObject(this.scene, 34, 106, "", TextStyle.SUMMARY_PINK, { fontSize: "36px" }); + this.pokemonGrowthRateText = addTextObject(34, 106, "", TextStyle.SUMMARY_PINK, { fontSize: "36px" }); this.pokemonGrowthRateText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonGrowthRateText); - this.pokemonGenderText = addTextObject(this.scene, 96, 112, "", TextStyle.SUMMARY_ALT); + this.pokemonGenderText = addTextObject(96, 112, "", TextStyle.SUMMARY_ALT); this.pokemonGenderText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonGenderText); - this.pokemonUncaughtText = addTextObject(this.scene, 6, 127, i18next.t("starterSelectUiHandler:uncaught"), TextStyle.SUMMARY_ALT, { fontSize: "56px" }); + this.pokemonUncaughtText = addTextObject( + 6, + 127, + i18next.t("starterSelectUiHandler:uncaught"), + TextStyle.SUMMARY_ALT, + { fontSize: "56px" }, + ); this.pokemonUncaughtText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonUncaughtText); - // The position should be set per language const starterInfoXPos = textSettings?.starterInfoXPos || 31; const starterInfoYOffset = textSettings?.starterInfoYOffset || 0; @@ -532,46 +636,70 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // The font size should be set per language const starterInfoTextSize = textSettings?.starterInfoTextSize || 56; - this.pokemonAbilityLabelText = addTextObject(this.scene, 6, 127 + starterInfoYOffset, i18next.t("starterSelectUiHandler:ability"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonAbilityLabelText = addTextObject( + 6, + 127 + starterInfoYOffset, + i18next.t("starterSelectUiHandler:ability"), + TextStyle.SUMMARY_ALT, + { fontSize: starterInfoTextSize }, + ); this.pokemonAbilityLabelText.setOrigin(0, 0); this.pokemonAbilityLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonAbilityLabelText); - this.pokemonAbilityText = addTextObject(this.scene, starterInfoXPos, 127 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonAbilityText = addTextObject(starterInfoXPos, 127 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { + fontSize: starterInfoTextSize, + }); this.pokemonAbilityText.setOrigin(0, 0); this.pokemonAbilityText.setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains); this.starterSelectContainer.add(this.pokemonAbilityText); - this.pokemonPassiveLabelText = addTextObject(this.scene, 6, 136 + starterInfoYOffset, i18next.t("starterSelectUiHandler:passive"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonPassiveLabelText = addTextObject( + 6, + 136 + starterInfoYOffset, + i18next.t("starterSelectUiHandler:passive"), + TextStyle.SUMMARY_ALT, + { fontSize: starterInfoTextSize }, + ); this.pokemonPassiveLabelText.setOrigin(0, 0); this.pokemonPassiveLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonPassiveLabelText); - this.pokemonPassiveText = addTextObject(this.scene, starterInfoXPos, 136 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonPassiveText = addTextObject(starterInfoXPos, 136 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { + fontSize: starterInfoTextSize, + }); this.pokemonPassiveText.setOrigin(0, 0); this.pokemonPassiveText.setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains); this.starterSelectContainer.add(this.pokemonPassiveText); - this.pokemonPassiveDisabledIcon = this.scene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_stop"); + this.pokemonPassiveDisabledIcon = globalScene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_stop"); this.pokemonPassiveDisabledIcon.setOrigin(0, 0.5); this.pokemonPassiveDisabledIcon.setScale(0.35); this.pokemonPassiveDisabledIcon.setVisible(false); this.starterSelectContainer.add(this.pokemonPassiveDisabledIcon); - this.pokemonPassiveLockedIcon = this.scene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_lock"); + this.pokemonPassiveLockedIcon = globalScene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_lock"); this.pokemonPassiveLockedIcon.setOrigin(0, 0.5); this.pokemonPassiveLockedIcon.setScale(0.42, 0.38); this.pokemonPassiveLockedIcon.setVisible(false); this.starterSelectContainer.add(this.pokemonPassiveLockedIcon); - this.pokemonNatureLabelText = addTextObject(this.scene, 6, 145 + starterInfoYOffset, i18next.t("starterSelectUiHandler:nature"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonNatureLabelText = addTextObject( + 6, + 145 + starterInfoYOffset, + i18next.t("starterSelectUiHandler:nature"), + TextStyle.SUMMARY_ALT, + { fontSize: starterInfoTextSize }, + ); this.pokemonNatureLabelText.setOrigin(0, 0); this.pokemonNatureLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonNatureLabelText); - this.pokemonNatureText = addBBCodeTextObject(this.scene, starterInfoXPos, 145 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonNatureText = addBBCodeTextObject(starterInfoXPos, 145 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { + fontSize: starterInfoTextSize, + }); this.pokemonNatureText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNatureText); @@ -583,29 +711,65 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonEggMoveBgs = []; this.pokemonEggMoveLabels = []; - this.valueLimitLabel = addTextObject(this.scene, teamWindowX + 17, 150, "0/10", TextStyle.TOOLTIP_CONTENT); + this.valueLimitLabel = addTextObject(teamWindowX + 17, 150, "0/10", TextStyle.TOOLTIP_CONTENT); this.valueLimitLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(this.valueLimitLabel); - const startLabel = addTextObject(this.scene, teamWindowX + 17, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); + const startLabel = addTextObject(teamWindowX + 17, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); startLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(startLabel); - this.startCursorObj = this.scene.add.nineslice(teamWindowX + 4, 160, "select_cursor", undefined, 26, 15, 6, 6, 6, 6); + this.startCursorObj = globalScene.add.nineslice( + teamWindowX + 4, + 160, + "select_cursor", + undefined, + 26, + 15, + 6, + 6, + 6, + 6, + ); this.startCursorObj.setVisible(false); this.startCursorObj.setOrigin(0, 0); this.starterSelectContainer.add(this.startCursorObj); + const randomSelectLabel = addTextObject( + teamWindowX + 17, + 23, + i18next.t("starterSelectUiHandler:randomize"), + TextStyle.TOOLTIP_CONTENT, + ); + randomSelectLabel.setOrigin(0.5, 0); + this.starterSelectContainer.add(randomSelectLabel); + + this.randomCursorObj = globalScene.add.nineslice( + teamWindowX + 4, + 21, + "select_cursor", + undefined, + 26, + 15, + 6, + 6, + 6, + 6, + ); + this.randomCursorObj.setVisible(false); + this.randomCursorObj.setOrigin(0, 0); + this.starterSelectContainer.add(this.randomCursorObj); + const starterSpecies: Species[] = []; - const starterBoxContainer = this.scene.add.container(speciesContainerX + 6, 9); //115 + const starterBoxContainer = globalScene.add.container(speciesContainerX + 6, 9); //115 - this.starterSelectScrollBar = new ScrollBar(this.scene, 161, 12, 5, starterContainerWindow.height - 6, 9); + this.starterSelectScrollBar = new ScrollBar(161, 12, 5, starterContainerWindow.height - 6, 9); starterBoxContainer.add(this.starterSelectScrollBar); this.pokerusCursorObjs = new Array(POKERUS_STARTER_COUNT).fill(null).map(() => { - const cursorObj = this.scene.add.image(0, 0, "select_cursor_pokerus"); + const cursorObj = globalScene.add.image(0, 0, "select_cursor_pokerus"); cursorObj.setVisible(false); cursorObj.setOrigin(0, 0); starterBoxContainer.add(cursorObj); @@ -613,16 +777,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); this.starterCursorObjs = new Array(6).fill(null).map(() => { - const cursorObj = this.scene.add.image(0, 0, "select_cursor_highlight"); + const cursorObj = globalScene.add.image(0, 0, "select_cursor_highlight"); cursorObj.setVisible(false); cursorObj.setOrigin(0, 0); starterBoxContainer.add(cursorObj); return cursorObj; }); - this.cursorObj = this.scene.add.image(0, 0, "select_cursor"); + this.cursorObj = globalScene.add.image(0, 0, "select_cursor"); this.cursorObj.setOrigin(0, 0); - this.starterIconsCursorObj = this.scene.add.image(289, 64, "select_gen_cursor"); + this.starterIconsCursorObj = globalScene.add.image(289, 64, "select_gen_cursor"); this.starterIconsCursorObj.setName("starter-icons-cursor"); this.starterIconsCursorObj.setVisible(false); this.starterIconsCursorObj.setOrigin(0, 0); @@ -639,7 +803,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.speciesLoaded.set(species.speciesId, false); this.allSpecies.push(species); - const starterContainer = new StarterContainer(this.scene, species).setVisible(false); + const starterContainer = new StarterContainer(species).setVisible(false); this.iconAnimHandler.addOrUpdate(starterContainer.icon, PokemonIconAnimMode.NONE); this.starterContainers.push(starterContainer); starterBoxContainer.add(starterContainer); @@ -648,7 +812,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(starterBoxContainer); this.starterIcons = new Array(6).fill(null).map((_, i) => { - const icon = this.scene.add.sprite(teamWindowX + 7, calcStarterIconY(i), "pokemon_icons_0"); + const icon = globalScene.add.sprite(teamWindowX + 7, calcStarterIconY(i), "pokemon_icons_0"); icon.setScale(0.5); icon.setOrigin(0, 0); icon.setFrame("unknown"); @@ -657,91 +821,105 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return icon; }); - this.pokemonSprite = this.scene.add.sprite(53, 63, "pkmn__sub"); - this.pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + this.pokemonSprite = globalScene.add.sprite(53, 63, "pkmn__sub"); + this.pokemonSprite.setPipeline(globalScene.spritePipeline, { + tone: [0.0, 0.0, 0.0, 0.0], + ignoreTimeTint: true, + }); this.starterSelectContainer.add(this.pokemonSprite); - this.type1Icon = this.scene.add.sprite(8, 98, Utils.getLocalizedSpriteKey("types")); + this.type1Icon = globalScene.add.sprite(8, 98, getLocalizedSpriteKey("types")); this.type1Icon.setScale(0.5); this.type1Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type1Icon); - this.type2Icon = this.scene.add.sprite(26, 98, Utils.getLocalizedSpriteKey("types")); + this.type2Icon = globalScene.add.sprite(26, 98, getLocalizedSpriteKey("types")); this.type2Icon.setScale(0.5); this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); - this.pokemonLuckLabelText = addTextObject(this.scene, 8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { fontSize: "56px" }); + this.pokemonLuckLabelText = addTextObject(8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { + fontSize: "56px", + }); this.pokemonLuckLabelText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonLuckLabelText); - this.pokemonLuckText = addTextObject(this.scene, 8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.WINDOW, { fontSize: "56px" }); + this.pokemonLuckText = addTextObject(8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.WINDOW, { + fontSize: "56px", + }); this.pokemonLuckText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonLuckText); - this.pokemonCandyIcon = this.scene.add.sprite(4.5, 18, "candy"); + // Candy icon and count + this.pokemonCandyContainer = globalScene.add.container(4.5, 18); + + this.pokemonCandyIcon = globalScene.add.sprite(0, 0, "candy"); this.pokemonCandyIcon.setScale(0.5); this.pokemonCandyIcon.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonCandyIcon); + this.pokemonCandyContainer.add(this.pokemonCandyIcon); - this.pokemonFormText = addTextObject(this.scene, 6, 42, "Form", TextStyle.WINDOW_ALT, { fontSize: "42px" }); - this.pokemonFormText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonFormText); - - this.pokemonCandyOverlayIcon = this.scene.add.sprite(4.5, 18, "candy_overlay"); + this.pokemonCandyOverlayIcon = globalScene.add.sprite(0, 0, "candy_overlay"); this.pokemonCandyOverlayIcon.setScale(0.5); this.pokemonCandyOverlayIcon.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonCandyOverlayIcon); + this.pokemonCandyContainer.add(this.pokemonCandyOverlayIcon); - this.pokemonCandyDarknessOverlay = this.scene.add.sprite(4.5, 18, "candy"); + this.pokemonCandyDarknessOverlay = globalScene.add.sprite(0, 0, "candy"); this.pokemonCandyDarknessOverlay.setScale(0.5); this.pokemonCandyDarknessOverlay.setOrigin(0, 0); this.pokemonCandyDarknessOverlay.setTint(0x000000); - this.pokemonCandyDarknessOverlay.setAlpha(0.50); - this.pokemonCandyDarknessOverlay.setInteractive(new Phaser.Geom.Rectangle(0, 0, 16, 16), Phaser.Geom.Rectangle.Contains); - this.starterSelectContainer.add(this.pokemonCandyDarknessOverlay); + this.pokemonCandyDarknessOverlay.setAlpha(0.5); + this.pokemonCandyContainer.add(this.pokemonCandyDarknessOverlay); - this.pokemonCandyCountText = addTextObject(this.scene, 14, 18, "x0", TextStyle.WINDOW_ALT, { fontSize: "56px" }); + this.pokemonCandyCountText = addTextObject(9.5, 0, "x0", TextStyle.WINDOW_ALT, { fontSize: "56px" }); this.pokemonCandyCountText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonCandyCountText); + this.pokemonCandyContainer.add(this.pokemonCandyCountText); - this.pokemonCaughtHatchedContainer = this.scene.add.container(2, 25); + this.pokemonCandyContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 30, 20), Phaser.Geom.Rectangle.Contains); + this.starterSelectContainer.add(this.pokemonCandyContainer); + + this.pokemonFormText = addTextObject(6, 42, "Form", TextStyle.WINDOW_ALT, { + fontSize: "42px", + }); + this.pokemonFormText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonFormText); + + this.pokemonCaughtHatchedContainer = globalScene.add.container(2, 25); this.pokemonCaughtHatchedContainer.setScale(0.5); this.starterSelectContainer.add(this.pokemonCaughtHatchedContainer); - const pokemonCaughtIcon = this.scene.add.sprite(1, 0, "items", "pb"); + const pokemonCaughtIcon = globalScene.add.sprite(1, 0, "items", "pb"); pokemonCaughtIcon.setOrigin(0, 0); pokemonCaughtIcon.setScale(0.75); this.pokemonCaughtHatchedContainer.add(pokemonCaughtIcon); - this.pokemonCaughtCountText = addTextObject(this.scene, 24, 4, "0", TextStyle.SUMMARY_ALT); + this.pokemonCaughtCountText = addTextObject(24, 4, "0", TextStyle.SUMMARY_ALT); this.pokemonCaughtCountText.setOrigin(0, 0); this.pokemonCaughtHatchedContainer.add(this.pokemonCaughtCountText); - this.pokemonHatchedIcon = this.scene.add.sprite(1, 14, "egg_icons"); + this.pokemonHatchedIcon = globalScene.add.sprite(1, 14, "egg_icons"); this.pokemonHatchedIcon.setOrigin(0.15, 0.2); this.pokemonHatchedIcon.setScale(0.8); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); - this.pokemonShinyIcon = this.scene.add.sprite(14, 76, "shiny_icons"); + this.pokemonShinyIcon = globalScene.add.sprite(14, 76, "shiny_icons"); this.pokemonShinyIcon.setOrigin(0.15, 0.2); this.pokemonShinyIcon.setScale(1); this.pokemonCaughtHatchedContainer.add(this.pokemonShinyIcon); - this.pokemonHatchedCountText = addTextObject(this.scene, 24, 19, "0", TextStyle.SUMMARY_ALT); + this.pokemonHatchedCountText = addTextObject(24, 19, "0", TextStyle.SUMMARY_ALT); this.pokemonHatchedCountText.setOrigin(0, 0); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText); - this.pokemonMovesContainer = this.scene.add.container(102, 16); + this.pokemonMovesContainer = globalScene.add.container(102, 16); this.pokemonMovesContainer.setScale(0.375); for (let m = 0; m < 4; m++) { - const moveContainer = this.scene.add.container(0, 14 * m); + const moveContainer = globalScene.add.container(0, 14 * m); - const moveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); + const moveBg = globalScene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); moveBg.setOrigin(1, 0); - const moveLabel = addTextObject(this.scene, -moveBg.width / 2, 0, "-", TextStyle.PARTY); + const moveLabel = addTextObject(-moveBg.width / 2, 0, "-", TextStyle.PARTY); moveLabel.setOrigin(0.5, 0); this.pokemonMoveBgs.push(moveBg); @@ -754,28 +932,33 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonMovesContainer.add(moveContainer); } - this.pokemonAdditionalMoveCountLabel = addTextObject(this.scene, -this.pokemonMoveBgs[0].width / 2, 56, "(+0)", TextStyle.PARTY); + this.pokemonAdditionalMoveCountLabel = addTextObject( + -this.pokemonMoveBgs[0].width / 2, + 56, + "(+0)", + TextStyle.PARTY, + ); this.pokemonAdditionalMoveCountLabel.setOrigin(0.5, 0); this.pokemonMovesContainer.add(this.pokemonAdditionalMoveCountLabel); this.starterSelectContainer.add(this.pokemonMovesContainer); - this.pokemonEggMovesContainer = this.scene.add.container(102, 85); + this.pokemonEggMovesContainer = globalScene.add.container(102, 85); this.pokemonEggMovesContainer.setScale(0.375); - const eggMovesLabel = addTextObject(this.scene, -46, 0, i18next.t("starterSelectUiHandler:eggMoves"), TextStyle.WINDOW_ALT); + const eggMovesLabel = addTextObject(-46, 0, i18next.t("starterSelectUiHandler:eggMoves"), TextStyle.WINDOW_ALT); eggMovesLabel.setOrigin(0.5, 0); this.pokemonEggMovesContainer.add(eggMovesLabel); for (let m = 0; m < 4; m++) { - const eggMoveContainer = this.scene.add.container(0, 16 + 14 * m); + const eggMoveContainer = globalScene.add.container(0, 16 + 14 * m); - const eggMoveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); + const eggMoveBg = globalScene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); eggMoveBg.setOrigin(1, 0); - const eggMoveLabel = addTextObject(this.scene, -eggMoveBg.width / 2, 0, "???", TextStyle.PARTY); + const eggMoveLabel = addTextObject(-eggMoveBg.width / 2, 0, "???", TextStyle.PARTY); eggMoveLabel.setOrigin(0.5, 0); this.pokemonEggMoveBgs.push(eggMoveBg); @@ -791,88 +974,177 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.pokemonEggMovesContainer); + this.teraIcon = globalScene.add.sprite(85, 63, "button_tera"); + this.teraIcon.setName("terrastallize-icon"); + this.teraIcon.setFrame("fire"); + this.starterSelectContainer.add(this.teraIcon); + // The font size should be set per language const instructionTextSize = textSettings.instructionTextSize; - this.instructionsContainer = this.scene.add.container(4, 156); + this.instructionsContainer = globalScene.add.container(4, 156); this.instructionsContainer.setVisible(true); this.starterSelectContainer.add(this.instructionsContainer); // instruction rows that will be pushed into the container dynamically based on need // creating new sprites since they will be added to the scene later - this.shinyIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "R.png"); + this.shinyIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "R.png", + ); this.shinyIconElement.setName("sprite-shiny-icon-element"); this.shinyIconElement.setScale(0.675); this.shinyIconElement.setOrigin(0.0, 0.0); - this.shinyLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleShiny"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.shinyLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleShiny"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.shinyLabel.setName("text-shiny-label"); - this.formIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + this.formIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "F.png", + ); this.formIconElement.setName("sprite-form-icon-element"); this.formIconElement.setScale(0.675); this.formIconElement.setOrigin(0.0, 0.0); - this.formLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleForm"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.formLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleForm"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.formLabel.setName("text-form-label"); - this.genderIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + this.genderIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "G.png", + ); this.genderIconElement.setName("sprite-gender-icon-element"); this.genderIconElement.setScale(0.675); this.genderIconElement.setOrigin(0.0, 0.0); - this.genderLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleGender"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.genderLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleGender"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.genderLabel.setName("text-gender-label"); - this.abilityIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "E.png"); + this.abilityIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "E.png", + ); this.abilityIconElement.setName("sprite-ability-icon-element"); this.abilityIconElement.setScale(0.675); this.abilityIconElement.setOrigin(0.0, 0.0); - this.abilityLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleAbility"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.abilityLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleAbility"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.abilityLabel.setName("text-ability-label"); - this.natureIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "N.png"); + this.natureIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "N.png", + ); this.natureIconElement.setName("sprite-nature-icon-element"); this.natureIconElement.setScale(0.675); this.natureIconElement.setOrigin(0.0, 0.0); - this.natureLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleNature"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.natureLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleNature"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.natureLabel.setName("text-nature-label"); - this.variantIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); - this.variantIconElement.setName("sprite-variant-icon-element"); - this.variantIconElement.setScale(0.675); - this.variantIconElement.setOrigin(0.0, 0.0); - this.variantLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleVariant"), TextStyle.PARTY, { fontSize: instructionTextSize }); - this.variantLabel.setName("text-variant-label"); + this.teraIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.instructionRowX, + this.instructionRowY, + "keyboard", + "V.png", + ); + this.teraIconElement.setName("sprite-tera-icon-element"); + this.teraIconElement.setScale(0.675); + this.teraIconElement.setOrigin(0.0, 0.0); + this.teraLabel = addTextObject( + this.instructionRowX + this.instructionRowTextOffset, + this.instructionRowY, + i18next.t("starterSelectUiHandler:cycleTera"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); + this.teraLabel.setName("text-tera-label"); - this.goFilterIconElement = new Phaser.GameObjects.Sprite(this.scene, this.filterInstructionRowX, this.filterInstructionRowY, "keyboard", "C.png"); + this.goFilterIconElement = new Phaser.GameObjects.Sprite( + globalScene, + this.filterInstructionRowX, + this.filterInstructionRowY, + "keyboard", + "C.png", + ); this.goFilterIconElement.setName("sprite-goFilter-icon-element"); this.goFilterIconElement.setScale(0.675); this.goFilterIconElement.setOrigin(0.0, 0.0); - this.goFilterLabel = addTextObject(this.scene, this.filterInstructionRowX + this.instructionRowTextOffset, this.filterInstructionRowY, i18next.t("starterSelectUiHandler:goFilter"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.goFilterLabel = addTextObject( + this.filterInstructionRowX + this.instructionRowTextOffset, + this.filterInstructionRowY, + i18next.t("starterSelectUiHandler:goFilter"), + TextStyle.PARTY, + { fontSize: instructionTextSize }, + ); this.goFilterLabel.setName("text-goFilter-label"); this.hideInstructions(); - this.filterInstructionsContainer = this.scene.add.container(50, 5); + this.filterInstructionsContainer = globalScene.add.container(50, 5); this.filterInstructionsContainer.setVisible(true); this.starterSelectContainer.add(this.filterInstructionsContainer); - this.starterSelectMessageBoxContainer = this.scene.add.container(0, this.scene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); this.starterSelectMessageBoxContainer.setVisible(false); this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); - this.starterSelectMessageBox = addWindow(this.scene, 1, -1, 318, 28); + this.starterSelectMessageBox = addWindow(1, -1, 318, 28); this.starterSelectMessageBox.setOrigin(0, 1); this.starterSelectMessageBoxContainer.add(this.starterSelectMessageBox); - this.message = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + this.message = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); this.message.setOrigin(0, 0); this.starterSelectMessageBoxContainer.add(this.message); // arrow icon for the message box this.initPromptSprite(this.starterSelectMessageBoxContainer); - this.statsContainer = new StatsContainer(this.scene, 6, 16); + this.statsContainer = new StatsContainer(6, 16); - this.scene.add.existing(this.statsContainer); + globalScene.add.existing(this.statsContainer); this.statsContainer.setVisible(false); @@ -880,11 +1152,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // add the info overlay last to be the top most ui element and prevent the IVs from overlaying this const overlayScale = 1; - this.moveInfoOverlay = new MoveInfoOverlay(this.scene, { + this.moveInfoOverlay = new MoveInfoOverlay({ scale: overlayScale, top: true, x: 1, - y: this.scene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, + y: globalScene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, }); this.starterSelectContainer.add(this.moveInfoOverlay); @@ -893,7 +1165,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.initTutorialOverlay(this.starterSelectContainer); this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); - this.scene.eventTarget.addEventListener(BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED, (e) => this.onCandyUpgradeDisplayChanged(e)); + globalScene.eventTarget.addEventListener(BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED, e => + this.onCandyUpgradeDisplayChanged(e), + ); this.updateInstructions(); } @@ -901,10 +1175,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { show(args: any[]): boolean { if (!this.starterPreferences) { // starterPreferences haven't been loaded yet - this.starterPreferences = StarterPrefs.load(); + this.starterPreferences = loadStarterPreferences(); } this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers - this.pokerusSpecies = getPokerusStarters(this.scene); + this.pokerusSpecies = getPokerusStarters(); if (args.length >= 1 && args[0] instanceof Function) { super.show(args); @@ -914,7 +1188,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.allSpecies.forEach((species, s) => { const icon = this.starterContainers[s].icon; - const dexEntry = this.scene.gameData.dexData[species.speciesId]; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; // Initialize the StarterAttributes for this species this.starterPreferences[species.speciesId] = this.initStarterPrefs(species); @@ -936,7 +1210,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setCursor(0); this.tryUpdateValue(0); - handleTutorial(this.scene, Tutorial.Starter_Select); + handleTutorial(Tutorial.Starter_Select); return true; } @@ -954,8 +1228,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { */ initStarterPrefs(species: PokemonSpecies): StarterAttributes { const starterAttributes = this.starterPreferences[species.speciesId]; - const dexEntry = this.scene.gameData.dexData[species.speciesId]; - const starterData = this.scene.gameData.starterData[species.speciesId]; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const starterData = globalScene.gameData.starterData[species.speciesId]; // no preferences or Pokemon wasn't caught, return empty attribute if (!starterAttributes || !dexEntry.caughtAttr) { @@ -968,29 +1242,33 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; if (starterAttributes.shiny && !hasShiny) { // shiny form wasn't unlocked, purging shiny and variant setting - delete starterAttributes.shiny; - delete starterAttributes.variant; + starterAttributes.shiny = undefined; + starterAttributes.variant = undefined; } else if (starterAttributes.shiny === false && !hasNonShiny) { // non shiny form wasn't unlocked, purging shiny setting - delete starterAttributes.shiny; + starterAttributes.shiny = undefined; } if (starterAttributes.variant !== undefined) { const unlockedVariants = [ hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, hasShiny && caughtAttr & DexAttr.VARIANT_2, - hasShiny && caughtAttr & DexAttr.VARIANT_3 + hasShiny && caughtAttr & DexAttr.VARIANT_3, ]; - if (isNaN(starterAttributes.variant) || starterAttributes.variant < 0 || !unlockedVariants[starterAttributes.variant]) { + if ( + Number.isNaN(starterAttributes.variant) || + starterAttributes.variant < 0 || + !unlockedVariants[starterAttributes.variant] + ) { // variant value is invalid or requested variant wasn't unlocked, purging setting - delete starterAttributes.variant; + starterAttributes.variant = undefined; } } if (starterAttributes.female !== undefined) { if (!(starterAttributes.female ? caughtAttr & DexAttr.FEMALE : caughtAttr & DexAttr.MALE)) { // requested gender wasn't unlocked, purging setting - delete starterAttributes.female; + starterAttributes.female = undefined; } } @@ -1005,25 +1283,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const unlockedAbilities = [ hasAbility1, speciesHasSingleAbility ? hasAbility2 && !hasAbility1 : hasAbility2, - hasHiddenAbility + hasHiddenAbility, ]; if (!unlockedAbilities[starterAttributes.ability]) { // requested ability wasn't unlocked, purging setting - delete starterAttributes.ability; + starterAttributes.ability = undefined; } } const selectedForm = starterAttributes.form; - if (selectedForm !== undefined && (!species.forms[selectedForm]?.isStarterSelectable || !(caughtAttr & this.scene.gameData.getFormAttr(selectedForm)))) { + if ( + selectedForm !== undefined && + (!species.forms[selectedForm]?.isStarterSelectable || + !(caughtAttr & globalScene.gameData.getFormAttr(selectedForm))) + ) { // requested form wasn't unlocked/isn't a starter form, purging setting - delete starterAttributes.form; + starterAttributes.form = undefined; } if (starterAttributes.nature !== undefined) { - const unlockedNatures = this.scene.gameData.getNaturesForAttr(dexEntry.natureAttr); + const unlockedNatures = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr); if (unlockedNatures.indexOf(starterAttributes.nature as unknown as Nature) < 0) { // requested nature wasn't unlocked, purging setting - delete starterAttributes.nature; + starterAttributes.nature = undefined; } } @@ -1033,10 +1315,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { /** * Set the selections for all filters to their default starting value */ - resetFilters() : void { + public resetFilters(): void { + this.filterBar.setValsToDefault(); + this.resetCaughtDropdown(); + } + + /** + * Set default value for the caught dropdown, which only shows caught mons + */ + public resetCaughtDropdown(): void { const caughtDropDown: DropDown = this.filterBar.getFilter(DropDownColumn.CAUGHT); - this.filterBar.setValsToDefault(); + caughtDropDown.resetToDefault(); // initial setting, in caught filter, select the options excluding the uncaught option for (let i = 0; i < caughtDropDown.options.length; i++) { @@ -1047,15 +1337,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { + showText( + text: string, + delay?: number, + callback?: Function, + callbackDelay?: number, + prompt?: boolean, + promptDelay?: number, + 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(globalScene.game.canvas.height / 6); + this.starterSelectMessageBox.setOrigin(0, 1); + this.message.setY(singleLine ? -22 : -37); } this.starterSelectMessageBoxContainer.setVisible(!!text?.length); @@ -1066,14 +1370,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * @returns true if upgrade notifications are enabled and set to display an 'Icon' */ isUpgradeIconEnabled(): boolean { - return this.scene.candyUpgradeNotification !== 0 && this.scene.candyUpgradeDisplay === 0; + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 0; } /** * Determines if 'Animation' based upgrade notifications should be shown * @returns true if upgrade notifications are enabled and set to display an 'Animation' */ isUpgradeAnimationEnabled(): boolean { - return this.scene.candyUpgradeNotification !== 0 && this.scene.candyUpgradeDisplay === 1; + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 1; } /** @@ -1083,10 +1387,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { */ isPassiveAvailable(speciesId: number): boolean { // Get this species ID's starter data - const starterData = this.scene.gameData.starterData[speciesId]; + const starterData = globalScene.gameData.starterData[speciesId]; - return starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[speciesId]) - && !(starterData.passiveAttr & PassiveAttr.UNLOCKED); + return ( + starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[speciesId]) && + !(starterData.passiveAttr & PassiveAttr.UNLOCKED) + ); } /** @@ -1096,10 +1402,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { */ isValueReductionAvailable(speciesId: number): boolean { // Get this species ID's starter data - const starterData = this.scene.gameData.starterData[speciesId]; + const starterData = globalScene.gameData.starterData[speciesId]; - return starterData.candyCount >= getValueReductionCandyCounts(speciesStarterCosts[speciesId])[starterData.valueReduction] - && starterData.valueReduction < valueReductionMax; + return ( + starterData.candyCount >= + getValueReductionCandyCounts(speciesStarterCosts[speciesId])[starterData.valueReduction] && + starterData.valueReduction < valueReductionMax + ); } /** @@ -1109,7 +1418,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { */ isSameSpeciesEggAvailable(speciesId: number): boolean { // Get this species ID's starter data - const starterData = this.scene.gameData.starterData[speciesId]; + const starterData = globalScene.gameData.starterData[speciesId]; return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[speciesId]); } @@ -1120,10 +1429,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * @param species {@linkcode PokemonSpecies} of the icon used to check for upgrades * @param startPaused Should this animation be paused after it is added? */ - setUpgradeAnimation(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, startPaused: boolean = false): void { - this.scene.tweens.killTweensOf(icon); + setUpgradeAnimation(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, startPaused = false): void { + globalScene.tweens.killTweensOf(icon); // Skip animations if they are disabled - if (this.scene.candyUpgradeDisplay === 0 || species.speciesId !== species.getRootSpeciesId(false)) { + if (globalScene.candyUpgradeDisplay === 0 || species.speciesId !== species.getRootSpeciesId(false)) { return; } @@ -1133,38 +1442,39 @@ export default class StarterSelectUiHandler extends MessageUiHandler { targets: icon, loop: -1, // Make the initial bounce a little randomly delayed - delay: Utils.randIntRange(0, 50) * 5, + delay: randIntRange(0, 50) * 5, loopDelay: 1000, tweens: [ { targets: icon, y: 2 - 5, - duration: Utils.fixedInt(125), + duration: fixedInt(125), ease: "Cubic.easeOut", - yoyo: true + yoyo: true, }, { targets: icon, y: 2 - 3, - duration: Utils.fixedInt(150), + duration: fixedInt(150), ease: "Cubic.easeOut", - yoyo: true - } - ], }; + yoyo: true, + }, + ], + }; const isPassiveAvailable = this.isPassiveAvailable(species.speciesId); const isValueReductionAvailable = this.isValueReductionAvailable(species.speciesId); const isSameSpeciesEggAvailable = this.isSameSpeciesEggAvailable(species.speciesId); // 'Passives Only' mode - if (this.scene.candyUpgradeNotification === 1) { + if (globalScene.candyUpgradeNotification === 1) { if (isPassiveAvailable) { - this.scene.tweens.chain(tweenChain).paused = startPaused; + globalScene.tweens.chain(tweenChain).paused = startPaused; } - // 'On' mode - } else if (this.scene.candyUpgradeNotification === 2) { + // 'On' mode + } else if (globalScene.candyUpgradeNotification === 2) { if (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable) { - this.scene.tweens.chain(tweenChain).paused = startPaused; + globalScene.tweens.chain(tweenChain).paused = startPaused; } } } @@ -1176,7 +1486,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const species = starter.species; const slotVisible = !!species?.speciesId; - if (!species || this.scene.candyUpgradeNotification === 0 || species.speciesId !== species.getRootSpeciesId(false)) { + if ( + !species || + globalScene.candyUpgradeNotification === 0 || + species.speciesId !== species.getRootSpeciesId(false) + ) { starter.candyUpgradeIcon.setVisible(false); starter.candyUpgradeOverlayIcon.setVisible(false); return; @@ -1187,14 +1501,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isSameSpeciesEggAvailable = this.isSameSpeciesEggAvailable(species.speciesId); // 'Passive Only' mode - if (this.scene.candyUpgradeNotification === 1) { + if (globalScene.candyUpgradeNotification === 1) { starter.candyUpgradeIcon.setVisible(slotVisible && isPassiveAvailable); starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); // 'On' mode - } else if (this.scene.candyUpgradeNotification === 2) { + } else if (globalScene.candyUpgradeNotification === 2) { starter.candyUpgradeIcon.setVisible( - slotVisible && ( isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable )); + slotVisible && (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable), + ); starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); } } @@ -1204,7 +1519,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * @param starterContainer the container for the Pokemon to update */ updateCandyUpgradeDisplay(starterContainer: StarterContainer) { - if (this.isUpgradeIconEnabled() ) { + if (this.isUpgradeIconEnabled()) { this.setUpgradeIcon(starterContainer); } if (this.isUpgradeAnimationEnabled()) { @@ -1223,8 +1538,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } // Loop through all visible candy icons when set to 'Icon' mode - if (this.scene.candyUpgradeDisplay === 0) { - this.filteredStarterContainers.forEach((starter) => { + if (globalScene.candyUpgradeDisplay === 0) { + this.filteredStarterContainers.forEach(starter => { this.setUpgradeIcon(starter); }); @@ -1250,7 +1565,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const numOfRows = Math.ceil(numberOfStarters / maxColumns); const currentRow = Math.floor(this.cursor / maxColumns); const onScreenFirstIndex = this.scrollCursor * maxColumns; // this is first starter index on the screen - const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns - 1); // this is the last starter index on the screen + const onScreenLastIndex = Math.min( + this.filteredStarterContainers.length - 1, + onScreenFirstIndex + maxRows * maxColumns - 1, + ); // this is the last starter index on the screen const onScreenNumberOfStarters = onScreenLastIndex - onScreenFirstIndex + 1; const onScreenNumberOfRows = Math.ceil(onScreenNumberOfStarters / maxColumns); const onScreenCurrentRow = Math.floor((this.cursor - onScreenFirstIndex) / maxColumns); @@ -1270,16 +1588,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.filterMode && this.filterBar.openDropDown) { // CANCEL with a filter menu open > close it this.filterBar.toggleDropDown(this.filterBarCursor); - - // if there are possible starters go the first one of the list - if (numberOfStarters > 0) { - this.setFilterMode(false); - this.scrollCursor = 0; - this.updateScroll(); - this.setCursor(0); - } success = true; - + } else if ( + this.filterMode && + !this.filterBar.getFilter(this.filterBar.getColumn(this.filterBarCursor)).hasDefaultValues() + ) { + if (this.filterBar.getColumn(this.filterBarCursor) === DropDownColumn.CAUGHT) { + this.resetCaughtDropdown(); + } else { + this.filterBar.resetSelection(this.filterBarCursor); + } + this.updateStarters(); + success = true; } else if (this.statsMode) { this.toggleStatsMode(false); success = true; @@ -1301,7 +1621,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setFilterMode(true); this.filterBar.toggleDropDown(this.filterBarCursor); } - } else if (this.startCursorObj.visible) { // this checks to see if the start button is selected + } else if (this.startCursorObj.visible) { + // this checks to see if the start button is selected switch (button) { case Button.ACTION: if (this.tryStart(true)) { @@ -1311,20 +1632,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } break; case Button.UP: - // UP from start button: go to pokemon in team if any, otherwise filter + // UP from start button: go to pokemon in team if any, otherwise filter this.startCursorObj.setVisible(false); if (this.starterSpecies.length > 0) { this.starterIconsCursorIndex = this.starterSpecies.length - 1; this.moveStarterIconsCursor(this.starterIconsCursorIndex); } else { + // TODO: how can we get here if start button can't be selected? this appears to be redundant this.startCursorObj.setVisible(false); - this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); - this.setFilterMode(true); + this.randomCursorObj.setVisible(true); } success = true; break; case Button.DOWN: - // DOWN from start button: Go to filters + // DOWN from start button: Go to filters this.startCursorObj.setVisible(false); this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); this.setFilterMode(true); @@ -1366,23 +1687,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { case Button.UP: if (this.filterBar.openDropDown) { success = this.filterBar.decDropDownCursor(); - } else if (this.filterBarCursor === this.filterBar.numFilters - 1 && this.starterSpecies.length > 0) { - // UP from the last filter, move to start button + } else if (this.filterBarCursor === this.filterBar.numFilters - 1) { + // UP from the last filter, move to start button this.setFilterMode(false); this.cursorObj.setVisible(false); - this.startCursorObj.setVisible(true); + if (this.starterSpecies.length > 0) { + this.startCursorObj.setVisible(true); + } else { + this.randomCursorObj.setVisible(true); + } success = true; } else if (numberOfStarters > 0) { - // UP from filter bar to bottom of Pokemon list + // UP from filter bar to bottom of Pokemon list this.setFilterMode(false); this.scrollCursor = Math.max(0, numOfRows - 9); this.updateScroll(); const proportion = (this.filterBarCursor + 0.5) / this.filterBar.numFilters; const targetCol = Math.min(8, Math.floor(proportion * 11)); if (numberOfStarters % 9 > targetCol) { - this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + this.setCursor(numberOfStarters - (numberOfStarters % 9) + targetCol); } else { - this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9, 0)); + this.setCursor(Math.max(numberOfStarters - (numberOfStarters % 9) + targetCol - 9, 0)); } success = true; } @@ -1390,15 +1715,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { case Button.DOWN: if (this.filterBar.openDropDown) { success = this.filterBar.incDropDownCursor(); - } else if (this.filterBarCursor === this.filterBar.numFilters - 1 && this.starterSpecies.length > 0) { - // DOWN from the last filter, move to Pokemon in party if any + } else if (this.filterBarCursor === this.filterBar.numFilters - 1) { + // DOWN from the last filter, move to random selection label this.setFilterMode(false); this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = 0; - this.moveStarterIconsCursor(this.starterIconsCursorIndex); + this.randomCursorObj.setVisible(true); success = true; } else if (numberOfStarters > 0) { - // DOWN from filter bar to top of Pokemon list + // DOWN from filter bar to top of Pokemon list this.setFilterMode(false); this.scrollCursor = 0; this.updateScroll(); @@ -1417,10 +1741,104 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; break; } + } else if (this.randomCursorObj.visible) { + switch (button) { + case Button.ACTION: + if (this.starterSpecies.length >= 6) { + error = true; + break; + } + const currentPartyValue = this.starterSpecies + .map(s => s.generation) + .reduce( + (total: number, _gen: number, i: number) => + total + globalScene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), + 0, + ); + // Filter valid starters + const validStarters = this.filteredStarterContainers.filter(starter => { + const species = starter.species; + const [isDupe] = this.isInParty(species); + const starterCost = globalScene.gameData.getSpeciesStarterValue(species.speciesId); + const isValidForChallenge = new BooleanHolder(true); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + species, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), + this.isPartyValid(), + ); + const isCaught = globalScene.gameData.dexData[species.speciesId].caughtAttr; + return ( + !isDupe && + isValidForChallenge.value && + currentPartyValue + starterCost <= this.getValueLimit() && + isCaught + ); + }); + if (validStarters.length === 0) { + error = true; // No valid starters available + break; + } + // Select random starter + const randomStarter = validStarters[Math.floor(Math.random() * validStarters.length)]; + const randomSpecies = randomStarter.species; + // Set species and prepare attributes + this.setSpecies(randomSpecies); + const dexAttr = this.getCurrentDexProps(randomSpecies.speciesId); + const props = globalScene.gameData.getSpeciesDexAttrProps(randomSpecies, dexAttr); + const abilityIndex = this.abilityCursor; + const nature = this.natureCursor as unknown as Nature; + const teraType = this.teraCursor; + const moveset = this.starterMoveset?.slice(0) as StarterMoveset; + const starterCost = globalScene.gameData.getSpeciesStarterValue(randomSpecies.speciesId); + const speciesForm = getPokemonSpeciesForm(randomSpecies.speciesId, props.formIndex); + // Load assets and add to party + speciesForm.loadAssets(props.female, props.formIndex, props.shiny, props.variant, true).then(() => { + if (this.tryUpdateValue(starterCost, true)) { + this.addToParty(randomSpecies, dexAttr, abilityIndex, nature, moveset, teraType, true); + ui.playSelect(); + } + }); + break; + case Button.UP: + this.randomCursorObj.setVisible(false); + this.filterBarCursor = this.filterBar.numFilters - 1; + this.setFilterMode(true); + success = true; + break; + case Button.DOWN: + this.randomCursorObj.setVisible(false); + if (this.starterSpecies.length > 0) { + this.starterIconsCursorIndex = 0; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + this.filterBarCursor = this.filterBar.numFilters - 1; + this.setFilterMode(true); + } + success = true; + break; + case Button.LEFT: + if (numberOfStarters > 0) { + this.randomCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + this.setCursor(onScreenFirstIndex + 8); // set last column + success = true; + } + break; + case Button.RIGHT: + if (numberOfStarters > 0) { + this.randomCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + this.setCursor(onScreenFirstIndex); // set first column + success = true; + } + break; + } } else { - - let starterContainer; - const starterData = this.scene.gameData.starterData[this.lastSpecies.speciesId]; + let starterContainer: StarterContainer; + const starterData = globalScene.gameData.starterData[this.lastSpecies.speciesId]; // prepare persistent starter data to store changes let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; @@ -1429,68 +1847,110 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starterContainer = this.filteredStarterContainers[this.cursor]; } else { // if species is in filtered starters, get the starter container from the filtered starters, it can be undefined if the species is not in the filtered starters - starterContainer = this.filteredStarterContainers[this.filteredStarterContainers.findIndex(container => container.species === this.lastSpecies)]; + starterContainer = + this.filteredStarterContainers[ + this.filteredStarterContainers.findIndex(container => container.species === this.lastSpecies) + ]; } if (button === Button.ACTION) { if (!this.speciesStarterDexEntry?.caughtAttr) { error = true; - } else if (this.starterSpecies.length <= 6) { // checks to see if the party has 6 or fewer pokemon + } else if (this.starterSpecies.length <= 6) { + // checks to see if the party has 6 or fewer pokemon const ui = this.getUi(); let options: any[] = []; // TODO: add proper type - const [ isDupe, removeIndex ]: [boolean, number] = this.isInParty(this.lastSpecies); // checks to see if the pokemon is a duplicate; if it is, returns the index that will be removed + const [isDupe, removeIndex]: [boolean, number] = this.isInParty(this.lastSpecies); // checks to see if the pokemon is a duplicate; if it is, returns the index that will be removed const isPartyValid = this.isPartyValid(); - const isValidForChallenge = new Utils.BooleanHolder(true); + const isValidForChallenge = new BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.lastSpecies, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)), isPartyValid); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + this.lastSpecies, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps( + this.lastSpecies, + this.getCurrentDexProps(this.lastSpecies.speciesId), + ), + isPartyValid, + ); - 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 + const currentPartyValue = this.starterSpecies + .map(s => s.generation) + .reduce( + (total: number, _gen: number, i: number) => + (total += globalScene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId)), + 0, + ); + const newCost = globalScene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId); + 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"), handler: () => { ui.setMode(Mode.STARTER_SELECT); - const isOverValueLimit = this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId), true); + const isOverValueLimit = this.tryUpdateValue( + globalScene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId), + true, + ); if (!isDupe && isValidForChallenge.value && isOverValueLimit) { const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; cursorObj.setVisible(true); cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); - this.addToParty(this.lastSpecies, this.dexAttrCursor, this.abilityCursor, this.natureCursor as unknown as Nature, this.starterMoveset?.slice(0) as StarterMoveset); + this.addToParty( + this.lastSpecies, + this.dexAttrCursor, + this.abilityCursor, + this.natureCursor as unknown as Nature, + this.starterMoveset?.slice(0) as StarterMoveset, + this.teraCursor, + ); ui.playSelect(); } else { ui.playError(); // this should be redundant as there is now a trigger for when a pokemon can't be added to party } return true; }, - overrideSound: true - }]; - } else if (isDupe) { // if it already exists in your party, it will give you the option to remove from your party - options = [{ - label: i18next.t("starterSelectUiHandler:removeFromParty"), - handler: () => { - this.popStarter(removeIndex); - ui.setMode(Mode.STARTER_SELECT); - return true; - } - }]; + overrideSound: true, + }, + ]; + } else if (isDupe) { + // if it already exists in your party, it will give you the option to remove from your party + options = [ + { + label: i18next.t("starterSelectUiHandler:removeFromParty"), + handler: () => { + this.popStarter(removeIndex); + ui.setMode(Mode.STARTER_SELECT); + return true; + }, + }, + ]; } - options.push( // this shows the IVs for the pokemon + options.push( + // this shows the IVs for the pokemon { label: i18next.t("starterSelectUiHandler:toggleIVs"), handler: () => { this.toggleStatsMode(); ui.setMode(Mode.STARTER_SELECT); return true; - } - }); - if (this.speciesStarterMoves.length > 1) { // this lets you change the pokemon moves + }, + }, + ); + if (this.speciesStarterMoves.length > 1) { + // this lets you change the pokemon moves const showSwapOptions = (moveset: StarterMoveset) => { - this.blockInput = true; ui.setMode(Mode.STARTER_SELECT).then(() => { @@ -1498,70 +1958,78 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.moveInfoOverlay.show(allMoves[moveset[0]]); ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: moveset.map((m: Moves, i: number) => { - const option: OptionSelectItem = { - label: allMoves[m].name, - handler: () => { - this.blockInput = true; - ui.setMode(Mode.STARTER_SELECT).then(() => { - ui.showText(`${i18next.t("starterSelectUiHandler:selectMoveSwapWith")} ${allMoves[m].name}.`, null, () => { - const possibleMoves = this.speciesStarterMoves.filter((sm: Moves) => sm !== m); - this.moveInfoOverlay.show(allMoves[possibleMoves[0]]); + options: moveset + .map((m: Moves, i: number) => { + const option: OptionSelectItem = { + label: allMoves[m].name, + handler: () => { + this.blockInput = true; + ui.setMode(Mode.STARTER_SELECT).then(() => { + ui.showText( + `${i18next.t("starterSelectUiHandler:selectMoveSwapWith")} ${allMoves[m].name}.`, + null, + () => { + const possibleMoves = this.speciesStarterMoves.filter((sm: Moves) => sm !== m); + this.moveInfoOverlay.show(allMoves[possibleMoves[0]]); - ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: possibleMoves.map(sm => { - // make an option for each available starter move - const option = { - label: allMoves[sm].name, - handler: () => { - this.switchMoveHandler(i, sm, m); - showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? - return true; - }, - onHover: () => { - this.moveInfoOverlay.show(allMoves[sm]); - }, - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? - return true; - }, - onHover: () => { - this.moveInfoOverlay.clear(); - }, - }), - supportHover: true, - maxOptions: 8, - yOffset: 19 - }); - this.blockInput = false; + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: possibleMoves + .map(sm => { + // make an option for each available starter move + const option = { + label: allMoves[sm].name, + handler: () => { + this.switchMoveHandler(i, sm, m); + showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? + return true; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[sm]); + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? + return true; + }, + onHover: () => { + this.moveInfoOverlay.clear(); + }, + }), + supportHover: true, + maxOptions: 8, + yOffset: 19, + }); + this.blockInput = false; + }, + ); }); - }); + return true; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[m]); + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.STARTER_SELECT); return true; }, onHover: () => { - this.moveInfoOverlay.show(allMoves[m]); + this.moveInfoOverlay.clear(); }, - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - this.moveInfoOverlay.clear(); - this.clearText(); - ui.setMode(Mode.STARTER_SELECT); - return true; - }, - onHover: () => { - this.moveInfoOverlay.clear(); - }, - }), + }), supportHover: true, maxOptions: 8, - yOffset: 19 + yOffset: 19, }); this.blockInput = false; }); @@ -1572,48 +2040,51 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { showSwapOptions(this.starterMoveset!); // TODO: is this bang correct? return true; - } + }, }); } if (this.canCycleNature) { // if we could cycle natures, enable the improved nature menu const showNatureOptions = () => { - this.blockInput = true; ui.setMode(Mode.STARTER_SELECT).then(() => { ui.showText(i18next.t("starterSelectUiHandler:selectNature"), null, () => { - const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); + const natures = globalScene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); ui.setModeWithoutClear(Mode.OPTION_SELECT, { - options: natures.map((n: Nature, i: number) => { - const option: OptionSelectItem = { - label: getNatureName(n, true, true, true, this.scene.uiTheme), + options: natures + .map((n: Nature, _i: number) => { + const option: OptionSelectItem = { + label: getNatureName(n, true, true, true, globalScene.uiTheme), + handler: () => { + // update default nature in starter save data + if (!starterAttributes) { + starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; + } + starterAttributes.nature = n; + this.clearText(); + ui.setMode(Mode.STARTER_SELECT); + // set nature for starter + this.setSpeciesDetails(this.lastSpecies, { + natureIndex: n, + }); + this.blockInput = false; + return true; + }, + }; + return option; + }) + .concat({ + label: i18next.t("menu:cancel"), handler: () => { - // update default nature in starter save data - if (!starterAttributes) { - starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; - } - starterAttributes.nature = n as unknown as integer; this.clearText(); ui.setMode(Mode.STARTER_SELECT); - // set nature for starter - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, n, undefined); this.blockInput = false; return true; - } - }; - return option; - }).concat({ - label: i18next.t("menu:cancel"), - handler: () => { - this.clearText(); - ui.setMode(Mode.STARTER_SELECT); - this.blockInput = false; - return true; - } - }), + }, + }), maxOptions: 8, - yOffset: 19 + yOffset: 19, }); }); }); @@ -1623,21 +2094,22 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { showNatureOptions(); return true; - } + }, }); } const passiveAttr = starterData.passiveAttr; - if (passiveAttr & PassiveAttr.UNLOCKED) { // this is for enabling and disabling the passive + if (passiveAttr & PassiveAttr.UNLOCKED) { + // this is for enabling and disabling the passive if (!(passiveAttr & PassiveAttr.ENABLED)) { options.push({ label: i18next.t("starterSelectUiHandler:enablePassive"), handler: () => { starterData.passiveAttr |= PassiveAttr.ENABLED; ui.setMode(Mode.STARTER_SELECT); - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined); + this.setSpeciesDetails(this.lastSpecies); return true; - } + }, }); } else { options.push({ @@ -1645,9 +2117,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { starterData.passiveAttr ^= PassiveAttr.ENABLED; ui.setMode(Mode.STARTER_SELECT); - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined); + this.setSpeciesDetails(this.lastSpecies); return true; - } + }, }); } } @@ -1664,7 +2136,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } ui.setMode(Mode.STARTER_SELECT); return true; - } + }, }); } else { options.push({ @@ -1677,7 +2149,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } ui.setMode(Mode.STARTER_SELECT); return true; - } + }, }); } options.push({ @@ -1686,26 +2158,30 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.playSelect(); let nickname = starterAttributes.nickname ? String(starterAttributes.nickname) : ""; nickname = decodeURIComponent(escape(atob(nickname))); - ui.setModeWithoutClear(Mode.RENAME_POKEMON, { - buttonActions: [ - (sanitizedName: string) => { - ui.playSelect(); - starterAttributes.nickname = sanitizedName; - const name = decodeURIComponent(escape(atob(starterAttributes.nickname))); - if (name.length > 0) { - this.pokemonNameText.setText(name); - } else { - this.pokemonNameText.setText(this.lastSpecies.name); - } - ui.setMode(Mode.STARTER_SELECT); - }, - () => { - ui.setMode(Mode.STARTER_SELECT); - } - ] - }, nickname); + ui.setModeWithoutClear( + Mode.RENAME_POKEMON, + { + buttonActions: [ + (sanitizedName: string) => { + ui.playSelect(); + starterAttributes.nickname = sanitizedName; + const name = decodeURIComponent(escape(atob(starterAttributes.nickname))); + if (name.length > 0) { + this.pokemonNameText.setText(name); + } else { + this.pokemonNameText.setText(this.lastSpecies.name); + } + ui.setMode(Mode.STARTER_SELECT); + }, + () => { + ui.setMode(Mode.STARTER_SELECT); + }, + ], + }, + nickname, + ); return true; - } + }, }); // Purchases with Candy @@ -1717,7 +2193,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (!(passiveAttr & PassiveAttr.UNLOCKED)) { const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.lastSpecies.speciesId]); options.push({ - label: `x${passiveCost} ${i18next.t("starterSelectUiHandler:unlockPassive")} (${allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name})`, + label: `x${passiveCost} ${i18next.t("starterSelectUiHandler:unlockPassive")} (${allAbilities[this.lastSpecies.getPassiveAbility()].name})`, handler: () => { if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; @@ -1725,33 +2201,37 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starterData.candyCount -= passiveCost; } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - this.scene.gameData.saveSystem().then(success => { + globalScene.gameData.saveSystem().then(success => { if (!success) { - return this.scene.reset(true); + return globalScene.reset(true); } }); ui.setMode(Mode.STARTER_SELECT); this.setSpeciesDetails(this.lastSpecies); - this.scene.playSound("se/buy"); + globalScene.playSound("se/buy"); // update the passive background and icon/animation for available upgrade if (starterContainer) { this.updateCandyUpgradeDisplay(starterContainer); - starterContainer.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr); + starterContainer.starterPassiveBgs.setVisible( + !!globalScene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr, + ); } return true; } return false; }, item: "candy", - itemArgs: starterColors[this.lastSpecies.speciesId] + itemArgs: starterColors[this.lastSpecies.speciesId], }); } // Reduce cost option const valueReduction = starterData.valueReduction; if (valueReduction < valueReductionMax) { - const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.lastSpecies.speciesId])[valueReduction]; + const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.lastSpecies.speciesId])[ + valueReduction + ]; options.push({ label: `x${reductionCost} ${i18next.t("starterSelectUiHandler:reduceCost")}`, handler: () => { @@ -1761,14 +2241,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starterData.candyCount -= reductionCost; } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - this.scene.gameData.saveSystem().then(success => { + globalScene.gameData.saveSystem().then(success => { if (!success) { - return this.scene.reset(true); + return globalScene.reset(true); } }); this.tryUpdateValue(0); ui.setMode(Mode.STARTER_SELECT); - this.scene.playSound("se/buy"); + globalScene.playSound("se/buy"); // update the value label and icon/animation for available upgrade if (starterContainer) { @@ -1780,7 +2260,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; }, item: "candy", - itemArgs: starterColors[this.lastSpecies.speciesId] + itemArgs: starterColors[this.lastSpecies.speciesId], }); } @@ -1789,23 +2269,38 @@ 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 (globalScene.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; } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); - const egg = new Egg({ scene: this.scene, species: this.lastSpecies.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG }); - egg.addEggToGameData(this.scene); + const egg = new Egg({ + species: this.lastSpecies.speciesId, + sourceType: EggSourceType.SAME_SPECIES_EGG, + }); + egg.addEggToGameData(); - this.scene.gameData.saveSystem().then(success => { + globalScene.gameData.saveSystem().then(success => { if (!success) { - return this.scene.reset(true); + return globalScene.reset(true); } }); ui.setMode(Mode.STARTER_SELECT); - this.scene.playSound("se/buy"); + globalScene.playSound("se/buy"); // update the icon/animation for available upgrade if (starterContainer) { @@ -1817,27 +2312,42 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; }, item: "candy", - itemArgs: starterColors[this.lastSpecies.speciesId] + itemArgs: starterColors[this.lastSpecies.speciesId], }); options.push({ label: i18next.t("menu:cancel"), handler: () => { ui.setMode(Mode.STARTER_SELECT); return true; - } + }, }); ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: options, - yOffset: 47 + yOffset: 47, }); }; + options.push({ + label: i18next.t("menuUiHandler:POKEDEX"), + handler: () => { + ui.setMode(Mode.STARTER_SELECT).then(() => { + const attributes = { + shiny: starterAttributes.shiny, + variant: starterAttributes.variant, + form: starterAttributes.form, + female: starterAttributes.female, + }; + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, starterAttributes.form, attributes); + }); + return true; + }, + }); if (!pokemonPrevolutions.hasOwnProperty(this.lastSpecies.speciesId)) { options.push({ label: i18next.t("starterSelectUiHandler:useCandies"), handler: () => { ui.setMode(Mode.STARTER_SELECT).then(() => showUseCandies()); return true; - } + }, }); } options.push({ @@ -1845,37 +2355,87 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { ui.setMode(Mode.STARTER_SELECT); return true; - } + }, }); ui.setModeWithoutClear(Mode.OPTION_SELECT, { options: options, - yOffset: 47 + yOffset: 47, }); success = true; } } else { - const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); + const props = globalScene.gameData.getSpeciesDexAttrProps( + this.lastSpecies, + this.getCurrentDexProps(this.lastSpecies.speciesId), + ); switch (button) { case Button.CYCLE_SHINY: if (this.canCycleShiny) { - starterAttributes.shiny = starterAttributes.shiny !== undefined ? !starterAttributes.shiny : false; + if (starterAttributes.shiny === false) { + // If not shiny, we change to shiny and get the proper default variant + const newProps = globalScene.gameData.getSpeciesDexAttrProps( + this.lastSpecies, + this.getCurrentDexProps(this.lastSpecies.speciesId), + ); + const newVariant = starterAttributes.variant + ? (starterAttributes.variant as Variant) + : newProps.variant; + this.setSpeciesDetails(this.lastSpecies, { + shiny: true, + variant: newVariant, + }); - if (starterAttributes.shiny) { - // Change to shiny, we need to get the proper default variant - const newProps = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); - const newVariant = starterAttributes.variant ? starterAttributes.variant as Variant : newProps.variant; - this.setSpeciesDetails(this.lastSpecies, true, undefined, undefined, newVariant, undefined, undefined); - - this.scene.playSound("se/sparkle"); - // Set the variant label to the shiny tint + globalScene.playSound("se/sparkle"); + // Cycle tint based on current sprite tint const tint = getVariantTint(newVariant); this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); this.pokemonShinyIcon.setTint(tint); this.pokemonShinyIcon.setVisible(true); + + starterAttributes.shiny = true; } else { - this.setSpeciesDetails(this.lastSpecies, false, undefined, undefined, 0, undefined, undefined); - this.pokemonShinyIcon.setVisible(false); - success = true; + // If shiny, we update the variant + let newVariant = props.variant; + do { + newVariant = (newVariant + 1) % 3; + if (newVariant === 0) { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.DEFAULT_VARIANT) { + // TODO: is this bang correct? + break; + } + } else if (newVariant === 1) { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_2) { + // TODO: is this bang correct? + break; + } + } else { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_3) { + // TODO: is this bang correct? + break; + } + } + } while (newVariant !== props.variant); + starterAttributes.variant = newVariant; // store the selected variant + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.NON_SHINY && newVariant <= props.variant) { + // If we have run out of variants, go back to non shiny + this.setSpeciesDetails(this.lastSpecies, { + shiny: false, + variant: 0, + }); + this.pokemonShinyIcon.setVisible(false); + success = true; + starterAttributes.shiny = false; + } else { + // If going to a higher variant, or only shiny forms are caught, go to next variant + this.setSpeciesDetails(this.lastSpecies, { + variant: newVariant as Variant, + }); + // Cycle tint based on current sprite tint + const tint = getVariantTint(newVariant as Variant); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); + this.pokemonShinyIcon.setTint(tint); + success = true; + } } } break; @@ -1885,26 +2445,36 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let newFormIndex = props.formIndex; do { newFormIndex = (newFormIndex + 1) % formCount; - if (this.lastSpecies.forms[newFormIndex].isStarterSelectable && this.speciesStarterDexEntry!.caughtAttr! & this.scene.gameData.getFormAttr(newFormIndex)) { // TODO: are those bangs correct? + if ( + this.lastSpecies.forms[newFormIndex].isStarterSelectable && + this.speciesStarterDexEntry!.caughtAttr! & globalScene.gameData.getFormAttr(newFormIndex) + ) { + // TODO: are those bangs correct? break; } } while (newFormIndex !== props.formIndex); starterAttributes.form = newFormIndex; // store the selected form - this.setSpeciesDetails(this.lastSpecies, undefined, newFormIndex, undefined, undefined, undefined, undefined); + starterAttributes.tera = this.lastSpecies.forms[newFormIndex].type1; + this.setSpeciesDetails(this.lastSpecies, { + formIndex: newFormIndex, + teraType: starterAttributes.tera, + }); success = true; } break; case Button.CYCLE_GENDER: if (this.canCycleGender) { starterAttributes.female = !props.female; - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, !props.female, undefined, undefined, undefined); + this.setSpeciesDetails(this.lastSpecies, { + female: !props.female, + }); success = true; } break; case Button.CYCLE_ABILITY: if (this.canCycleAbility) { const abilityCount = this.lastSpecies.getAbilityCount(); - const abilityAttr = this.scene.gameData.starterData[this.lastSpecies.speciesId].abilityAttr; + const abilityAttr = globalScene.gameData.starterData[this.lastSpecies.speciesId].abilityAttr; const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; let newAbilityIndex = this.abilityCursor; do { @@ -1914,7 +2484,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } else if (newAbilityIndex === 1) { - // If ability 1 and 2 are the same and ability 1 is unlocked, skip over ability 2 + // If ability 1 and 2 are the same and ability 1 is unlocked, skip over ability 2 if (this.lastSpecies.ability1 === this.lastSpecies.ability2 && hasAbility1) { newAbilityIndex = (newAbilityIndex + 1) % abilityCount; } @@ -1927,53 +2497,46 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } while (newAbilityIndex !== this.abilityCursor); starterAttributes.ability = newAbilityIndex; // store the selected ability - const { visible: tooltipVisible } = this.scene.ui.getTooltip(); + const { visible: tooltipVisible } = globalScene.ui.getTooltip(); if (tooltipVisible && this.activeTooltip === "ABILITY") { const newAbility = allAbilities[this.lastSpecies.getAbility(newAbilityIndex)]; - this.scene.ui.editTooltip(`${newAbility.name}`, `${newAbility.description}`); + globalScene.ui.editTooltip(`${newAbility.name}`, `${newAbility.description}`); } - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newAbilityIndex, undefined); + this.setSpeciesDetails(this.lastSpecies, { + abilityIndex: newAbilityIndex, + }); success = true; } break; case Button.CYCLE_NATURE: if (this.canCycleNature) { - const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); + const natures = globalScene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); const natureIndex = natures.indexOf(this.natureCursor); const newNature = natures[natureIndex < natures.length - 1 ? natureIndex + 1 : 0]; // store cycled nature as default - starterAttributes.nature = newNature as unknown as integer; - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, newNature, undefined); + starterAttributes.nature = newNature as unknown as number; + this.setSpeciesDetails(this.lastSpecies, { + natureIndex: newNature, + }); success = true; } break; - case Button.V: - if (this.canCycleVariant) { - let newVariant = props.variant; - do { - newVariant = (newVariant + 1) % 3; - if (!newVariant) { - if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.DEFAULT_VARIANT) { // TODO: is this bang correct? - break; - } - } else if (newVariant === 1) { - if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_2) { // TODO: is this bang correct? - break; - } - } else { - if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_3) { // TODO: is this bang correct? - break; - } - } - } while (newVariant !== props.variant); - starterAttributes.variant = newVariant; // store the selected variant - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant as Variant, undefined, undefined); - // Cycle tint based on current sprite tint - const tint = getVariantTint(newVariant as Variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); - this.pokemonShinyIcon.setTint(tint); + case Button.CYCLE_TERA: + if (this.canCycleTera) { + const speciesForm = getPokemonSpeciesForm(this.lastSpecies.speciesId, starterAttributes.form ?? 0); + if (speciesForm.type1 === this.teraCursor && !Utils.isNullOrUndefined(speciesForm.type2)) { + starterAttributes.tera = speciesForm.type2!; + this.setSpeciesDetails(this.lastSpecies, { + teraType: speciesForm.type2!, + }); + } else { + starterAttributes.tera = speciesForm.type1; + this.setSpeciesDetails(this.lastSpecies, { + teraType: speciesForm.type1, + }); + } success = true; } break; @@ -1992,11 +2555,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } else { if (this.starterIconsCursorIndex === 0) { - // Up from first Pokemon in the team > go to filter + // Up from first Pokemon in the team > go to Random selection this.starterIconsCursorObj.setVisible(false); this.setSpecies(null); - this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); - this.setFilterMode(true); + this.randomCursorObj.setVisible(true); } else { this.starterIconsCursorIndex--; this.moveStarterIconsCursor(this.starterIconsCursorIndex); @@ -2006,19 +2568,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; case Button.DOWN: if (!this.starterIconsCursorObj.visible) { - if (currentRow < numOfRows - 1) { // not last row - if (currentRow - this.scrollCursor === 8) { // last row of visible starters + if (currentRow < numOfRows - 1) { + // not last row + if (currentRow - this.scrollCursor === 8) { + // last row of visible starters this.scrollCursor++; } success = this.setCursor(this.cursor + 9); this.updateScroll(); } else if (numOfRows > 1) { - // DOWN from last row of Pokemon > Wrap around to first row + // DOWN from last row of Pokemon > Wrap around to first row this.scrollCursor = 0; this.updateScroll(); success = this.setCursor(this.cursor % 9); } else { - // DOWN from single row of Pokemon > Go to filters + // DOWN from single row of Pokemon > Go to filters this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); this.setFilterMode(true); success = true; @@ -2040,20 +2604,24 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.cursor % 9 !== 0) { success = this.setCursor(this.cursor - 1); } else { - // LEFT from filtered Pokemon, on the left edge - - if (this.starterSpecies.length === 0) { - // no starter in team > wrap around to the last column - success = this.setCursor(this.cursor + Math.min(8, numberOfStarters - this.cursor)); - - } else if (onScreenCurrentRow < 7) { - // at least one pokemon in team > for the first 7 rows, go to closest starter + // LEFT from filtered Pokemon, on the left edge + if (onScreenCurrentRow === 0) { + // from the first row of starters we go to the random selection this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); + this.randomCursorObj.setVisible(true); + } else if (this.starterSpecies.length === 0) { + // no starter in team and not on first row > wrap around to the last column + success = this.setCursor(this.cursor + Math.min(8, numberOfStarters - this.cursor)); + } else if (onScreenCurrentRow < 7) { + // at least one pokemon in team > for the first 7 rows, go to closest starter + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = findClosestStarterIndex( + this.cursorObj.y - 1, + this.starterSpecies.length, + ); this.moveStarterIconsCursor(this.starterIconsCursorIndex); - } else { - // at least one pokemon in team > from the bottom 2 rows, go to start run button + // at least one pokemon in team > from the bottom 2 rows, go to start run button this.cursorObj.setVisible(false); this.setSpecies(null); this.startCursorObj.setVisible(true); @@ -2061,36 +2629,41 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; } } else if (numberOfStarters > 0) { - // LEFT from team > Go to closest filtered Pokemon + // LEFT from team > Go to closest filtered Pokemon const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); this.starterIconsCursorObj.setVisible(false); this.cursorObj.setVisible(true); this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9 + 8, onScreenLastIndex)); success = true; } else { - // LEFT from team and no Pokemon in filter > do nothing + // LEFT from team and no Pokemon in filter > do nothing success = false; } break; case Button.RIGHT: if (!this.starterIconsCursorObj.visible) { - // is not right edge + // is not right edge if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { success = this.setCursor(this.cursor + 1); } else { - // RIGHT from filtered Pokemon, on the right edge - if (this.starterSpecies.length === 0) { - // no selected starter in team > wrap around to the first column - success = this.setCursor(this.cursor - Math.min(8, this.cursor % 9)); - - } else if (onScreenCurrentRow < 7) { - // at least one pokemon in team > for the first 7 rows, go to closest starter + // RIGHT from filtered Pokemon, on the right edge + if (onScreenCurrentRow === 0) { + // from the first row of starters we go to the random selection this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); + this.randomCursorObj.setVisible(true); + } else if (this.starterSpecies.length === 0) { + // no selected starter in team > wrap around to the first column + success = this.setCursor(this.cursor - Math.min(8, this.cursor % 9)); + } else if (onScreenCurrentRow < 7) { + // at least one pokemon in team > for the first 7 rows, go to closest starter + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = findClosestStarterIndex( + this.cursorObj.y - 1, + this.starterSpecies.length, + ); this.moveStarterIconsCursor(this.starterIconsCursorIndex); - } else { - // at least one pokemon in team > from the bottom 2 rows, go to start run button + // at least one pokemon in team > from the bottom 2 rows, go to start run button this.cursorObj.setVisible(false); this.setSpecies(null); this.startCursorObj.setVisible(true); @@ -2098,14 +2671,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; } } else if (numberOfStarters > 0) { - // RIGHT from team > Go to closest filtered Pokemon + // RIGHT from team > Go to closest filtered Pokemon const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); this.starterIconsCursorObj.setVisible(false); this.cursorObj.setVisible(true); - this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9, onScreenLastIndex - (onScreenLastIndex % 9))); + this.setCursor( + Math.min(onScreenFirstIndex + closestRowIndex * 9, onScreenLastIndex - (onScreenLastIndex % 9)), + ); success = true; } else { - // RIGHT from team and no Pokemon in filter > do nothing + // RIGHT from team and no Pokemon in filter > do nothing success = false; } break; @@ -2132,28 +2707,48 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } - return [ isDupe, removeIndex ]; + return [isDupe, removeIndex]; } - addToParty(species: PokemonSpecies, dexAttr: bigint, abilityIndex: integer, nature: Nature, moveset: StarterMoveset) { - const props = this.scene.gameData.getSpeciesDexAttrProps(species, dexAttr); - this.starterIcons[this.starterSpecies.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); - this.starterIcons[this.starterSpecies.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); - this.checkIconId(this.starterIcons[this.starterSpecies.length], species, props.female, props.formIndex, props.shiny, props.variant); + addToParty( + species: PokemonSpecies, + dexAttr: bigint, + abilityIndex: number, + nature: Nature, + moveset: StarterMoveset, + teraType: PokemonType, + randomSelection = false, + ) { + const props = globalScene.gameData.getSpeciesDexAttrProps(species, dexAttr); + this.starterIcons[this.starterSpecies.length].setTexture( + species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), + ); + this.starterIcons[this.starterSpecies.length].setFrame( + species.getIconId(props.female, props.formIndex, props.shiny, props.variant), + ); + this.checkIconId( + this.starterIcons[this.starterSpecies.length], + species, + props.female, + props.formIndex, + props.shiny, + props.variant, + ); this.starterSpecies.push(species); this.starterAttr.push(dexAttr); this.starterAbilityIndexes.push(abilityIndex); this.starterNatures.push(nature); + this.starterTeras.push(teraType); this.starterMovesets.push(moveset); - if (this.speciesLoaded.get(species.speciesId)) { - getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(this.scene); + if (this.speciesLoaded.get(species.speciesId) || randomSelection) { + getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(); } this.updateInstructions(); } updatePartyIcon(species: PokemonSpecies, index: number) { - const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)); + const props = globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)); this.starterIcons[index].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); this.starterIcons[index].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); this.checkIconId(this.starterIcons[index], species, props.female, props.formIndex, props.shiny, props.variant); @@ -2166,31 +2761,40 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (existingMoveIndex > -1) { this.starterMoveset![existingMoveIndex] = move; // TODO: is this bang correct? } - const props: DexAttrProps = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); + const props: DexAttrProps = globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); // species has different forms if (pokemonFormLevelMoves.hasOwnProperty(speciesId)) { // starterMoveData doesn't have base form moves or is using the single form format - if (!this.scene.gameData.starterData[speciesId].moveset || Array.isArray(this.scene.gameData.starterData[speciesId].moveset)) { - this.scene.gameData.starterData[speciesId].moveset = { [props.formIndex]: this.starterMoveset?.slice(0) as StarterMoveset }; + if ( + !globalScene.gameData.starterData[speciesId].moveset || + Array.isArray(globalScene.gameData.starterData[speciesId].moveset) + ) { + globalScene.gameData.starterData[speciesId].moveset = { + [props.formIndex]: this.starterMoveset?.slice(0) as StarterMoveset, + }; } - const starterMoveData = this.scene.gameData.starterData[speciesId].moveset; + const starterMoveData = globalScene.gameData.starterData[speciesId].moveset; // starterMoveData doesn't have active form moves if (!starterMoveData.hasOwnProperty(props.formIndex)) { - this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset?.slice(0) as StarterMoveset; + globalScene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset?.slice( + 0, + ) as StarterMoveset; } // does the species' starter move data have its form's starter moves and has it been updated if (starterMoveData.hasOwnProperty(props.formIndex)) { // active form move hasn't been updated if (starterMoveData[props.formIndex][existingMoveIndex] !== newMove) { - this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset?.slice(0) as StarterMoveset; + globalScene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset?.slice( + 0, + ) as StarterMoveset; } } } else { - this.scene.gameData.starterData[speciesId].moveset = this.starterMoveset?.slice(0) as StarterMoveset; + globalScene.gameData.starterData[speciesId].moveset = this.starterMoveset?.slice(0) as StarterMoveset; } - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined, false); + this.setSpeciesDetails(this.lastSpecies, { forSeen: false }); // switch moves of starter if exists if (this.starterMovesets.length) { @@ -2203,8 +2807,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { - let iconPath; + updateButtonIcon( + iconSetting: SettingKeyboard, + gamepadType: string, + iconElement: GameObjects.Sprite, + controlLabel: GameObjects.Text, + ): void { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO + let iconPath: string; // touch controls cannot be rebound as is, and are just emulating a keyboard event. // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls if (gamepadType === "touch") { @@ -2225,7 +2835,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { case SettingKeyboard.Button_Cycle_Nature: iconPath = "N.png"; break; - case SettingKeyboard.Button_Cycle_Variant: + case SettingKeyboard.Button_Cycle_Tera: iconPath = "V.png"; break; case SettingKeyboard.Button_Stats: @@ -2235,14 +2845,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } else { - iconPath = this.scene.inputController?.getIconForLatestInputRecorded(iconSetting); + iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); } + // @ts-ignore: TODO can iconPath actually be undefined? iconElement.setTexture(gamepadType, iconPath); iconElement.setPosition(this.instructionRowX, this.instructionRowY); controlLabel.setPosition(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY); iconElement.setVisible(true); controlLabel.setVisible(true); - this.instructionsContainer.add([ iconElement, controlLabel ]); + this.instructionsContainer.add([iconElement, controlLabel]); this.instructionRowY += 8; if (this.instructionRowY >= 24) { this.instructionRowY = 0; @@ -2250,22 +2861,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - updateFilterButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { - let iconPath; + updateFilterButtonIcon( + iconSetting: SettingKeyboard, + gamepadType: string, + iconElement: GameObjects.Sprite, + controlLabel: GameObjects.Text, + ): void { + let iconPath: string; // touch controls cannot be rebound as is, and are just emulating a keyboard event. // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls if (gamepadType === "touch") { gamepadType = "keyboard"; iconPath = "C.png"; } else { - iconPath = this.scene.inputController?.getIconForLatestInputRecorded(iconSetting); + iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); } iconElement.setTexture(gamepadType, iconPath); iconElement.setPosition(this.filterInstructionRowX, this.filterInstructionRowY); controlLabel.setPosition(this.filterInstructionRowX + this.instructionRowTextOffset, this.filterInstructionRowY); iconElement.setVisible(true); controlLabel.setVisible(true); - this.filterInstructionsContainer.add([ iconElement, controlLabel ]); + this.filterInstructionsContainer.add([iconElement, controlLabel]); this.filterInstructionRowY += 8; if (this.filterInstructionRowY >= 24) { this.filterInstructionRowY = 0; @@ -2281,11 +2897,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.hideInstructions(); this.instructionsContainer.removeAll(); this.filterInstructionsContainer.removeAll(); - let gamepadType; - if (this.scene.inputMethod === "gamepad") { - gamepadType = this.scene.inputController.getConfig(this.scene.inputController.selectedDevice[Device.GAMEPAD]).padType; + let gamepadType: string; + if (globalScene.inputMethod === "gamepad") { + gamepadType = globalScene.inputController.getConfig( + globalScene.inputController.selectedDevice[Device.GAMEPAD], + ).padType; } else { - gamepadType = this.scene.inputMethod; + gamepadType = globalScene.inputMethod; } if (!gamepadType) { @@ -2300,29 +2918,48 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.updateButtonIcon(SettingKeyboard.Button_Cycle_Form, gamepadType, this.formIconElement, this.formLabel); } if (this.canCycleGender) { - this.updateButtonIcon(SettingKeyboard.Button_Cycle_Gender, gamepadType, this.genderIconElement, this.genderLabel); + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Gender, + gamepadType, + this.genderIconElement, + this.genderLabel, + ); } if (this.canCycleAbility) { - this.updateButtonIcon(SettingKeyboard.Button_Cycle_Ability, gamepadType, this.abilityIconElement, this.abilityLabel); + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Ability, + gamepadType, + this.abilityIconElement, + this.abilityLabel, + ); } if (this.canCycleNature) { - this.updateButtonIcon(SettingKeyboard.Button_Cycle_Nature, gamepadType, this.natureIconElement, this.natureLabel); + this.updateButtonIcon( + SettingKeyboard.Button_Cycle_Nature, + gamepadType, + this.natureIconElement, + this.natureLabel, + ); } - if (this.canCycleVariant) { - this.updateButtonIcon(SettingKeyboard.Button_Cycle_Variant, gamepadType, this.variantIconElement, this.variantLabel); + if (this.canCycleTera) { + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Tera, gamepadType, this.teraIconElement, this.teraLabel); } } // if filter mode is inactivated and gamepadType is not undefined, update the button icons if (!this.filterMode) { - this.updateFilterButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.goFilterIconElement, this.goFilterLabel); + this.updateFilterButtonIcon( + SettingKeyboard.Button_Stats, + gamepadType, + this.goFilterIconElement, + this.goFilterLabel, + ); } - } - getValueLimit(): integer { - const valueLimit = new Utils.IntegerHolder(0); - switch (this.scene.gameMode.modeId) { + getValueLimit(): number { + const valueLimit = new NumberHolder(0); + switch (globalScene.gameMode.modeId) { case GameModes.ENDLESS: case GameModes.SPLICED_ENDLESS: valueLimit.value = 15; @@ -2331,7 +2968,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { valueLimit.value = 10; } - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_POINTS, valueLimit); + Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_POINTS, valueLimit); return valueLimit.value; } @@ -2347,23 +2984,40 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.filterBar.updateFilterLabels(); // pre filter for challenges - if (this.scene.gameMode.modeId === GameModes.CHALLENGE) { + if (globalScene.gameMode.modeId === GameModes.CHALLENGE) { this.starterContainers.forEach(container => { const species = container.species; let allFormsValid = false; if (species.forms?.length > 0) { for (let i = 0; i < species.forms.length; i++) { /* Here we are making a fake form index dex props for challenges - * Since some pokemon rely on forms to be valid (i.e. blaze tauros for fire challenges), we make a fake form and dex props to use in the challenge - */ + * Since some pokemon rely on forms to be valid (i.e. blaze tauros for fire challenges), we make a fake form and dex props to use in the challenge + */ const tempFormProps = BigInt(Math.pow(2, i)) * DexAttr.DEFAULT_FORM; - const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, tempFormProps), true); + const isValidForChallenge = new BooleanHolder(true); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + container.species, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps(species, tempFormProps), + true, + ); allFormsValid = allFormsValid || isValidForChallenge.value; } } else { - const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, container.species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(container.species, false, true)), true); + const isValidForChallenge = new BooleanHolder(true); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + container.species, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps( + species, + globalScene.gameData.getSpeciesDefaultDexAttr(container.species, false, true), + ), + true, + ); allFormsValid = isValidForChallenge.value; } if (allFormsValid) { @@ -2382,9 +3036,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; const currentDexAttr = this.getCurrentDexProps(currentFilteredContainer.species.speciesId); - const props = this.scene.gameData.getSpeciesDexAttrProps(currentFilteredContainer.species, currentDexAttr); + const props = globalScene.gameData.getSpeciesDexAttrProps(currentFilteredContainer.species, currentDexAttr); - starterSprite.setTexture(currentFilteredContainer.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), currentFilteredContainer.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant)); + starterSprite.setTexture( + currentFilteredContainer.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), + currentFilteredContainer.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant), + ); currentFilteredContainer.checkIconId(props.female, props.formIndex, props.shiny, props.variant); } @@ -2392,18 +3049,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.validStarterContainers.forEach(container => { container.setVisible(false); - container.cost = this.scene.gameData.getSpeciesStarterValue(container.species.speciesId); + container.cost = globalScene.gameData.getSpeciesStarterValue(container.species.speciesId); // First, ensure you have the caught attributes for the species else default to bigint 0 - const caughtAttr = this.scene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0); - const starterData = this.scene.gameData.starterData[container.species.speciesId]; + const caughtAttr = globalScene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0); + const starterData = globalScene.gameData.starterData[container.species.speciesId]; const isStarterProgressable = speciesEggMoves.hasOwnProperty(container.species.speciesId); // Gen filter - const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); + const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); // Type filter - const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); + const fitsType = this.filterBar + .getVals(DropDownColumn.TYPES) + .some(type => container.species.isOfType((type as number) - 1)); // Caught / Shiny filter const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); @@ -2415,13 +3074,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsCaught = this.filterBar.getVals(DropDownColumn.CAUGHT).some(caught => { if (caught === "SHINY3") { return isVariant3Caught; - } else if (caught === "SHINY2") { + } + if (caught === "SHINY2") { return isVariant2Caught && !isVariant3Caught; - } else if (caught === "SHINY") { + } + if (caught === "SHINY") { return isVariant1Caught && !isVariant2Caught && !isVariant3Caught; - } else if (caught === "NORMAL") { + } + if (caught === "NORMAL") { return isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught; - } else if (caught === "UNCAUGHT") { + } + if (caught === "UNCAUGHT") { return isUncaught; } }); @@ -2432,26 +3095,39 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { return isPassiveUnlocked; - } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { return isStarterProgressable && !isPassiveUnlocked; - } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) { + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) { return isPassiveUnlockable; - } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { + } + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { return true; } }); // Cost Reduction Filter - const isCostReduced = starterData.valueReduction > 0; + const isCostReducedByOne = starterData.valueReduction === 1; + const isCostReducedByTwo = starterData.valueReduction === 2; const isCostReductionUnlockable = this.isValueReductionAvailable(container.species.speciesId); const fitsCostReduction = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ON) { - return isCostReduced; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { - return isStarterProgressable && !isCostReduced; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) { + return isCostReducedByOne || isCostReducedByTwo; + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ONE) { + return isCostReducedByOne; + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.TWO) { + return isCostReducedByTwo; + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { + return isStarterProgressable && !(isCostReducedByOne || isCostReducedByTwo); + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) { return isCostReductionUnlockable; - } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { + } + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { return true; } }); @@ -2477,22 +3153,28 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "WIN" && misc.state === DropDownState.ON) { return hasWon; - } else if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { return hasNotWon || isUndefined; - } else if (misc.val === "WIN" && misc.state === DropDownState.OFF) { + } + if (misc.val === "WIN" && misc.state === DropDownState.OFF) { return true; } }); // HA Filter - const speciesHasHiddenAbility = container.species.abilityHidden !== container.species.ability1 && container.species.abilityHidden !== Abilities.NONE; + const speciesHasHiddenAbility = + container.species.abilityHidden !== container.species.ability1 && + container.species.abilityHidden !== Abilities.NONE; const hasHA = starterData.abilityAttr & AbilityAttr.ABILITY_HIDDEN; const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) { return hasHA; - } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { return speciesHasHiddenAbility && !hasHA; - } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { + } + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { return true; } }); @@ -2502,9 +3184,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "EGG" && misc.state === DropDownState.ON) { return isEggPurchasable; - } else if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) { return isStarterProgressable && !isEggPurchasable; - } else if (misc.val === "EGG" && misc.state === DropDownState.OFF) { + } + if (misc.val === "EGG" && misc.state === DropDownState.OFF) { return true; } }); @@ -2513,14 +3197,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { if (misc.val === "POKERUS" && misc.state === DropDownState.ON) { return this.pokerusSpecies.includes(container.species); - } else if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { + } + if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { return !this.pokerusSpecies.includes(container.species); - } else if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { + } + if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { return true; } }); - if (fitsGen && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) { + if ( + fitsGen && + fitsType && + fitsCaught && + fitsPassive && + fitsCostReduction && + fitsFavorite && + fitsWin && + fitsHA && + fitsEgg && + fitsPokerus + ) { this.filteredStarterContainers.push(container); } }); @@ -2532,22 +3229,38 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; this.filteredStarterContainers.sort((a, b) => { switch (sort.val) { - default: - break; case SortCriteria.NUMBER: return (a.species.speciesId - b.species.speciesId) * -sort.dir; case SortCriteria.COST: return (a.cost - b.cost) * -sort.dir; - case SortCriteria.CANDY: - const candyCountA = this.scene.gameData.starterData[a.species.speciesId].candyCount; - const candyCountB = this.scene.gameData.starterData[b.species.speciesId].candyCount; + case SortCriteria.CANDY: { + const candyCountA = globalScene.gameData.starterData[a.species.speciesId].candyCount; + const candyCountB = globalScene.gameData.starterData[b.species.speciesId].candyCount; return (candyCountA - candyCountB) * -sort.dir; - case SortCriteria.IV: - const avgIVsA = this.scene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[a.species.speciesId].ivs.length; - const avgIVsB = this.scene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[b.species.speciesId].ivs.length; + } + case SortCriteria.IV: { + const avgIVsA = + globalScene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / + globalScene.gameData.dexData[a.species.speciesId].ivs.length; + const avgIVsB = + globalScene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / + globalScene.gameData.dexData[b.species.speciesId].ivs.length; return (avgIVsA - avgIVsB) * -sort.dir; + } case SortCriteria.NAME: return a.species.name.localeCompare(b.species.name) * -sort.dir; + case SortCriteria.CAUGHT: + return ( + (globalScene.gameData.dexData[a.species.speciesId].caughtCount - + globalScene.gameData.dexData[b.species.speciesId].caughtCount) * + -sort.dir + ); + case SortCriteria.HATCHED: + return ( + (globalScene.gameData.dexData[a.species.speciesId].hatchedCount - + globalScene.gameData.dexData[b.species.speciesId].hatchedCount) * + -sort.dir + ); } return 0; }); @@ -2555,11 +3268,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.updateScroll(); }; + override destroy(): void { + // Without this the reference gets hung up and no startercontainers get GCd + this.starterContainers = []; + } + updateScroll = () => { const maxColumns = 9; const maxRows = 9; const onScreenFirstIndex = this.scrollCursor * maxColumns; - const onScreenLastIndex = Math.min(this.filteredStarterContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns - 1); + const onScreenLastIndex = Math.min( + this.filteredStarterContainers.length - 1, + onScreenFirstIndex + maxRows * maxColumns - 1, + ); this.starterSelectScrollBar.setScrollCursor(this.scrollCursor); @@ -2581,62 +3302,70 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); } return; - } else { - container.setVisible(true); + } + container.setVisible(true); - if (this.pokerusSpecies.includes(container.species)) { - this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); - this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); - pokerusCursorIndex++; - } + if (this.pokerusSpecies.includes(container.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); + pokerusCursorIndex++; + } - if (this.starterSpecies.includes(container.species)) { - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(true); - } + if (this.starterSpecies.includes(container.species)) { + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(true); + } - const speciesId = container.species.speciesId; - this.updateStarterValueLabel(container); + const speciesId = container.species.speciesId; + this.updateStarterValueLabel(container); - container.label.setVisible(true); - const speciesVariants = speciesId && this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY - ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(this.scene.gameData.dexData[speciesId].caughtAttr & v)) + container.label.setVisible(true); + const speciesVariants = + speciesId && globalScene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY + ? [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter( + v => !!(globalScene.gameData.dexData[speciesId].caughtAttr & v), + ) : []; - for (let v = 0; v < 3; v++) { - const hasVariant = speciesVariants.length > v; - container.shinyIcons[v].setVisible(hasVariant); - if (hasVariant) { - container.shinyIcons[v].setTint(getVariantTint(speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2)); - } + for (let v = 0; v < 3; v++) { + const hasVariant = speciesVariants.length > v; + container.shinyIcons[v].setVisible(hasVariant); + if (hasVariant) { + container.shinyIcons[v].setTint( + getVariantTint( + speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2, + ), + ); + } + } + + container.starterPassiveBgs.setVisible(!!globalScene.gameData.starterData[speciesId].passiveAttr); + container.hiddenAbilityIcon.setVisible( + !!globalScene.gameData.dexData[speciesId].caughtAttr && + !!(globalScene.gameData.starterData[speciesId].abilityAttr & 4), + ); + container.classicWinIcon.setVisible(globalScene.gameData.starterData[speciesId].classicWinCount > 0); + container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); + + // 'Candy Icon' mode + if (globalScene.candyUpgradeDisplay === 0) { + if (!starterColors[speciesId]) { + // Default to white if no colors are found + starterColors[speciesId] = ["ffffff", "ffffff"]; } - container.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[speciesId].passiveAttr); - container.hiddenAbilityIcon.setVisible(!!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.starterData[speciesId].abilityAttr & 4)); - container.classicWinIcon.setVisible(this.scene.gameData.starterData[speciesId].classicWinCount > 0); - container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); + // Set the candy colors + container.candyUpgradeIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[speciesId][0]))); + container.candyUpgradeOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[speciesId][1]))); - // 'Candy Icon' mode - if (this.scene.candyUpgradeDisplay === 0) { - - if (!starterColors[speciesId]) { - // Default to white if no colors are found - starterColors[speciesId] = [ "ffffff", "ffffff" ]; - } - - // Set the candy colors - container.candyUpgradeIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][0]))); - container.candyUpgradeOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][1]))); - - this.setUpgradeIcon(container); - } else if (this.scene.candyUpgradeDisplay === 1) { - container.candyUpgradeIcon.setVisible(false); - container.candyUpgradeOverlayIcon.setVisible(false); - } + this.setUpgradeIcon(container); + } else if (globalScene.candyUpgradeDisplay === 1) { + container.candyUpgradeIcon.setVisible(false); + container.candyUpgradeOverlayIcon.setVisible(false); } }); }; - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { let changed = false; if (this.filterMode) { @@ -2655,8 +3384,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (species) { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); - const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - const variant = this.starterPreferences[species.speciesId]?.variant ? this.starterPreferences[species.speciesId].variant as Variant : defaultProps.variant; + const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + const variant = this.starterPreferences[species.speciesId]?.variant + ? (this.starterPreferences[species.speciesId].variant as Variant) + : defaultProps.variant; const tint = getVariantTint(variant); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); this.pokemonShinyIcon.setTint(tint); @@ -2699,7 +3430,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } getFriendship(speciesId: number) { - let currentFriendship = this.scene.gameData.starterData[speciesId].friendship; + let currentFriendship = globalScene.gameData.starterData[speciesId].friendship; if (!currentFriendship || currentFriendship === undefined) { currentFriendship = 0; } @@ -2710,28 +3441,35 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } setSpecies(species: PokemonSpecies | null) { - this.speciesStarterDexEntry = species ? this.scene.gameData.dexData[species.speciesId] : null; + this.speciesStarterDexEntry = species ? globalScene.gameData.dexData[species.speciesId] : null; this.dexAttrCursor = species ? this.getCurrentDexProps(species.speciesId) : 0n; - this.abilityCursor = species ? this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0; - this.natureCursor = species ? this.scene.gameData.getSpeciesDefaultNature(species) : 0; + this.abilityCursor = species ? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0; + this.natureCursor = species ? globalScene.gameData.getSpeciesDefaultNature(species) : 0; + this.teraCursor = species ? species.type1 : PokemonType.UNKNOWN; - if (!species && this.scene.ui.getTooltip().visible) { - this.scene.ui.hideTooltip(); + if (!species && globalScene.ui.getTooltip().visible) { + globalScene.ui.hideTooltip(); } this.pokemonAbilityText.off("pointerover"); this.pokemonPassiveText.off("pointerover"); - const starterAttributes : StarterAttributes | null = species ? { ...this.starterPreferences[species.speciesId] } : null; + const starterAttributes: StarterAttributes | null = species + ? { ...this.starterPreferences[species.speciesId] } + : null; if (starterAttributes?.nature) { // load default nature from stater save data, if set this.natureCursor = starterAttributes.nature; } - if (starterAttributes?.ability && !isNaN(starterAttributes.ability)) { + if (starterAttributes?.ability && !Number.isNaN(starterAttributes.ability)) { // load default ability from stater save data, if set this.abilityCursor = starterAttributes.ability; } + if (starterAttributes?.tera) { + // load default tera from starter save data, if set + this.teraCursor = starterAttributes.tera; + } if (this.statsMode) { if (this.speciesStarterDexEntry?.caughtAttr) { @@ -2746,7 +3484,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.lastSpecies) { const dexAttr = this.getCurrentDexProps(this.lastSpecies.speciesId); - const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr); + const props = globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr); const speciesIndex = this.allSpecies.indexOf(this.lastSpecies); const lastSpeciesIcon = this.starterContainers[speciesIndex].icon; this.checkIconId(lastSpeciesIcon, this.lastSpecies, props.female, props.formIndex, props.shiny, props.variant); @@ -2754,13 +3492,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Resume the animation for the previously selected species const icon = this.starterContainers[speciesIndex].icon; - this.scene.tweens.getTweensOf(icon).forEach(tween => tween.resume()); + globalScene.tweens.getTweensOf(icon).forEach(tween => tween.resume()); } this.lastSpecies = species!; // TODO: is this bang correct? if (species && (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr)) { - this.pokemonNumberText.setText(Utils.padInt(species.speciesId, 4)); + this.pokemonNumberText.setText(padInt(species.speciesId, 4)); if (starterAttributes?.nickname) { const name = decodeURIComponent(escape(atob(starterAttributes.nickname))); this.pokemonNameText.setText(name); @@ -2771,17 +3509,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.speciesStarterDexEntry?.caughtAttr) { const colorScheme = starterColors[species.speciesId]; - const luck = this.scene.gameData.getDexAttrLuck(this.speciesStarterDexEntry.caughtAttr); + const luck = globalScene.gameData.getDexAttrLuck(this.speciesStarterDexEntry.caughtAttr); this.pokemonLuckText.setVisible(!!luck); this.pokemonLuckText.setText(luck.toString()); this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant)); this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible); //Growth translate - let growthReadable = Utils.toReadableString(GrowthRate[species.growthRate]); + let growthReadable = toReadableString(GrowthRate[species.growthRate]); const growthAux = growthReadable.replace(" ", "_"); if (i18next.exists("growth:" + growthAux)) { - growthReadable = i18next.t("growth:" + growthAux as any); + growthReadable = i18next.t(("growth:" + growthAux) as any); } this.pokemonGrowthRateText.setText(growthReadable); @@ -2801,7 +3539,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry.hatchedCount}`); const defaultDexAttr = this.getCurrentDexProps(species.speciesId); - const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); const variant = defaultProps.variant; const tint = getVariantTint(variant); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); @@ -2814,53 +3552,41 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setY(16); this.pokemonShinyIcon.setY(135); this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); - [ - this.pokemonCandyIcon, - this.pokemonCandyOverlayIcon, - this.pokemonCandyDarknessOverlay, - this.pokemonCandyCountText, - this.pokemonHatchedIcon, - this.pokemonHatchedCountText - ].map(c => c.setVisible(false)); + [this.pokemonCandyContainer, this.pokemonHatchedIcon, this.pokemonHatchedCountText].map(c => + c.setVisible(false), + ); this.pokemonFormText.setY(25); } else { this.pokemonCaughtHatchedContainer.setY(25); this.pokemonShinyIcon.setY(117); - this.pokemonCandyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0]))); - this.pokemonCandyIcon.setVisible(true); - this.pokemonCandyOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1]))); - this.pokemonCandyOverlayIcon.setVisible(true); - this.pokemonCandyDarknessOverlay.setVisible(true); - this.pokemonCandyCountText.setText(`x${this.scene.gameData.starterData[species.speciesId].candyCount}`); - this.pokemonCandyCountText.setVisible(true); + this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); + this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); + this.pokemonCandyCountText.setText(`x${globalScene.gameData.starterData[species.speciesId].candyCount}`); + this.pokemonCandyContainer.setVisible(true); this.pokemonFormText.setY(42); this.pokemonHatchedIcon.setVisible(true); this.pokemonHatchedCountText.setVisible(true); const { currentFriendship, friendshipCap } = this.getFriendship(this.lastSpecies.speciesId); - const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); - - if (this.pokemonCandyDarknessOverlay.visible) { - this.pokemonCandyDarknessOverlay.on("pointerover", () => { - this.scene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true); - this.activeTooltip = "CANDY"; - }); - this.pokemonCandyDarknessOverlay.on("pointerout", () => { - this.scene.ui.hideTooltip(); - this.activeTooltip = undefined; - }); - } - + const candyCropY = 16 - 16 * (currentFriendship / friendshipCap); this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY); - } + this.pokemonCandyContainer.on("pointerover", () => { + globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true); + this.activeTooltip = "CANDY"; + }); + this.pokemonCandyContainer.on("pointerout", () => { + globalScene.ui.hideTooltip(); + this.activeTooltip = undefined; + }); + } // Pause the animation when the species is selected const speciesIndex = this.allSpecies.indexOf(species); const icon = this.starterContainers[speciesIndex].icon; if (this.isUpgradeAnimationEnabled()) { - this.scene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); + globalScene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); // Reset the position of the icon icon.x = -2; icon.y = 2; @@ -2874,15 +3600,24 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let props: DexAttrProps; if (starterIndex > -1) { - props = this.scene.gameData.getSpeciesDexAttrProps(species, this.starterAttr[starterIndex]); - this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, this.starterAbilityIndexes[starterIndex], this.starterNatures[starterIndex]); + props = globalScene.gameData.getSpeciesDexAttrProps(species, this.starterAttr[starterIndex]); + this.setSpeciesDetails(species, { + shiny: props.shiny, + formIndex: props.formIndex, + female: props.female, + variant: props.variant, + abilityIndex: this.starterAbilityIndexes[starterIndex], + natureIndex: this.starterNatures[starterIndex], + teraType: this.starterTeras[starterIndex], + }); } else { const defaultDexAttr = this.getCurrentDexProps(species.speciesId); - const defaultAbilityIndex = starterAttributes?.ability ?? this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); + const defaultAbilityIndex = + starterAttributes?.ability ?? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); // load default nature from stater save data, if set - const defaultNature = starterAttributes?.nature || this.scene.gameData.getSpeciesDefaultNature(species); - props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - if (starterAttributes?.variant && !isNaN(starterAttributes.variant)) { + const defaultNature = starterAttributes?.nature || globalScene.gameData.getSpeciesDefaultNature(species); + props = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + if (starterAttributes?.variant && !Number.isNaN(starterAttributes.variant)) { if (props.shiny) { props.variant = starterAttributes.variant as Variant; } @@ -2890,7 +3625,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { props.formIndex = starterAttributes?.form ?? props.formIndex; props.female = starterAttributes?.female ?? props.female; - this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, defaultAbilityIndex, defaultNature); + this.setSpeciesDetails(species, { + shiny: props.shiny, + formIndex: props.formIndex, + female: props.female, + variant: props.variant, + abilityIndex: defaultAbilityIndex, + natureIndex: defaultNature, + }); } const speciesForm = getPokemonSpeciesForm(species.speciesId, props.formIndex); @@ -2898,7 +3640,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonSprite.clearTint(); if (this.pokerusSpecies.includes(species)) { - handleTutorial(this.scene, Tutorial.Pokerus); + handleTutorial(Tutorial.Pokerus); } } else { this.pokemonGrowthRateText.setText(""); @@ -2913,22 +3655,28 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveLabelText.setVisible(false); this.pokemonNatureLabelText.setVisible(false); this.pokemonCaughtHatchedContainer.setVisible(false); - this.pokemonCandyIcon.setVisible(false); - this.pokemonCandyOverlayIcon.setVisible(false); - this.pokemonCandyDarknessOverlay.setVisible(false); - this.pokemonCandyCountText.setVisible(false); + this.pokemonCandyContainer.setVisible(false); this.pokemonFormText.setVisible(false); + this.teraIcon.setVisible(false); - const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, true, true); - const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); - const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species); - const props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, true, true); + const defaultAbilityIndex = globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); + const defaultNature = globalScene.gameData.getSpeciesDefaultNature(species); + const props = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, defaultAbilityIndex, defaultNature, true); + this.setSpeciesDetails(species, { + shiny: props.shiny, + formIndex: props.formIndex, + female: props.female, + variant: props.variant, + abilityIndex: defaultAbilityIndex, + natureIndex: defaultNature, + forSeen: true, + }); this.pokemonSprite.setTint(0x808080); } } else { - this.pokemonNumberText.setText(Utils.padInt(0, 4)); + this.pokemonNumberText.setText(padInt(0, 4)); this.pokemonNameText.setText(species ? "???" : ""); this.pokemonGrowthRateText.setText(""); this.pokemonGrowthRateLabelText.setVisible(false); @@ -2942,32 +3690,49 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveLabelText.setVisible(false); this.pokemonNatureLabelText.setVisible(false); this.pokemonCaughtHatchedContainer.setVisible(false); - this.pokemonCandyIcon.setVisible(false); - this.pokemonCandyOverlayIcon.setVisible(false); - this.pokemonCandyDarknessOverlay.setVisible(false); - this.pokemonCandyCountText.setVisible(false); + this.pokemonCandyContainer.setVisible(false); this.pokemonFormText.setVisible(false); + this.teraIcon.setVisible(false); - this.setSpeciesDetails(species!, false, 0, false, 0, 0, 0); // TODO: is this bang correct? + this.setSpeciesDetails(species!, { + // TODO: is this bang correct? + shiny: false, + formIndex: 0, + female: false, + variant: 0, + abilityIndex: 0, + natureIndex: 0, + }); this.pokemonSprite.clearTint(); } } - - setSpeciesDetails(species: PokemonSpecies, shiny?: boolean, formIndex?: integer, female?: boolean, variant?: Variant, abilityIndex?: integer, natureIndex?: integer, forSeen: boolean = false): void { - const oldProps = species ? this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; - const oldAbilityIndex = this.abilityCursor > -1 ? this.abilityCursor : this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); - const oldNatureIndex = this.natureCursor > -1 ? this.natureCursor : this.scene.gameData.getSpeciesDefaultNature(species); + setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}): void { + let { shiny, formIndex, female, variant, abilityIndex, natureIndex, teraType } = options; + const forSeen: boolean = options.forSeen ?? false; + const oldProps = species ? globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; + const oldAbilityIndex = + this.abilityCursor > -1 ? this.abilityCursor : globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); + const oldNatureIndex = + this.natureCursor > -1 ? this.natureCursor : globalScene.gameData.getSpeciesDefaultNature(species); this.dexAttrCursor = 0n; this.abilityCursor = -1; this.natureCursor = -1; + this.teraCursor = PokemonType.UNKNOWN; + // We will only update the sprite if there is a change to form, shiny/variant + // or gender for species with gender sprite differences + const shouldUpdateSprite = + (species?.genderDiffs && !isNullOrUndefined(female)) || + !isNullOrUndefined(formIndex) || + !isNullOrUndefined(shiny) || + !isNullOrUndefined(variant); if (this.activeTooltip === "CANDY") { - if (this.lastSpecies) { + if (this.lastSpecies && this.pokemonCandyContainer.visible) { const { currentFriendship, friendshipCap } = this.getFriendship(this.lastSpecies.speciesId); - this.scene.ui.editTooltip("", `${currentFriendship}/${friendshipCap}`); + globalScene.ui.editTooltip("", `${currentFriendship}/${friendshipCap}`); } else { - this.scene.ui.hideTooltip(); + globalScene.ui.hideTooltip(); } } @@ -2980,13 +3745,24 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } if (species) { - this.dexAttrCursor |= (shiny !== undefined ? !shiny : !(shiny = oldProps?.shiny)) ? DexAttr.NON_SHINY : DexAttr.SHINY; - this.dexAttrCursor |= (female !== undefined ? !female : !(female = oldProps?.female)) ? DexAttr.MALE : DexAttr.FEMALE; - this.dexAttrCursor |= (variant !== undefined ? !variant : !(variant = oldProps?.variant)) ? DexAttr.DEFAULT_VARIANT : variant === 1 ? DexAttr.VARIANT_2 : DexAttr.VARIANT_3; - this.dexAttrCursor |= this.scene.gameData.getFormAttr(formIndex !== undefined ? formIndex : (formIndex = oldProps!.formIndex)); // TODO: is this bang correct? + this.dexAttrCursor |= (shiny !== undefined ? !shiny : !(shiny = oldProps?.shiny)) + ? DexAttr.NON_SHINY + : DexAttr.SHINY; + this.dexAttrCursor |= (female !== undefined ? !female : !(female = oldProps?.female)) + ? DexAttr.MALE + : DexAttr.FEMALE; + this.dexAttrCursor |= (variant !== undefined ? !variant : !(variant = oldProps?.variant)) + ? DexAttr.DEFAULT_VARIANT + : variant === 1 + ? DexAttr.VARIANT_2 + : DexAttr.VARIANT_3; + this.dexAttrCursor |= globalScene.gameData.getFormAttr( + formIndex !== undefined ? formIndex : (formIndex = oldProps!.formIndex), + ); // TODO: is this bang correct? this.abilityCursor = abilityIndex !== undefined ? abilityIndex : (abilityIndex = oldAbilityIndex); this.natureCursor = natureIndex !== undefined ? natureIndex : (natureIndex = oldNatureIndex); - const [ isInParty, partyIndex ]: [boolean, number] = this.isInParty(species); // we use this to firstly check if the pokemon is in the party, and if so, to get the party index in order to update the icon image + this.teraCursor = !Utils.isNullOrUndefined(teraType) ? teraType : (teraType = species.type1); + const [isInParty, partyIndex]: [boolean, number] = this.isInParty(species); // we use this to firstly check if the pokemon is in the party, and if so, to get the party index in order to update the icon image if (isInParty) { this.updatePartyIcon(species, partyIndex); } @@ -2997,6 +3773,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveText.setVisible(false); this.pokemonPassiveDisabledIcon.setVisible(false); this.pokemonPassiveLockedIcon.setVisible(false); + this.teraIcon.setVisible(false); if (this.assetLoadCancelled) { this.assetLoadCancelled.value = true; @@ -3007,15 +3784,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.speciesStarterMoves = []; if (species) { - const dexEntry = this.scene.gameData.dexData[species.speciesId]; - const abilityAttr = this.scene.gameData.starterData[species.speciesId].abilityAttr; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const abilityAttr = globalScene.gameData.starterData[species.speciesId].abilityAttr; - const caughtAttr = this.scene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0); + const caughtAttr = globalScene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0); if (!dexEntry.caughtAttr) { - const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)); - const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); - const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species); + const props = globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)); + const defaultAbilityIndex = globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); + const defaultNature = globalScene.gameData.getSpeciesDefaultNature(species); if (shiny === undefined || shiny !== props.shiny) { shiny = props.shiny; @@ -3039,7 +3816,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? this.pokemonNumberText.setColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, false)); - this.pokemonNumberText.setShadowColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true)); + this.pokemonNumberText.setShadowColor( + this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true), + ); if (forSeen ? this.speciesStarterDexEntry?.seenAttr : this.speciesStarterDexEntry?.caughtAttr) { const starterIndex = this.starterSpecies.indexOf(species); @@ -3048,42 +3827,58 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterAttr[starterIndex] = this.dexAttrCursor; this.starterAbilityIndexes[starterIndex] = this.abilityCursor; this.starterNatures[starterIndex] = this.natureCursor; + this.starterTeras[starterIndex] = this.teraCursor; } - const assetLoadCancelled = new Utils.BooleanHolder(false); + const assetLoadCancelled = new BooleanHolder(false); this.assetLoadCancelled = assetLoadCancelled; - species.loadAssets(this.scene, female!, formIndex, shiny, variant, true).then(() => { // TODO: is this bang correct? - if (assetLoadCancelled.value) { - return; - } - this.assetLoadCancelled = null; - this.speciesLoaded.set(species.speciesId, true); - this.pokemonSprite.play(species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? - this.pokemonSprite.setPipelineData("shiny", shiny); - this.pokemonSprite.setPipelineData("variant", variant); - this.pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? + if (shouldUpdateSprite) { + species.loadAssets(female!, formIndex, shiny, variant, true).then(() => { + // TODO: is this bang correct? + if (assetLoadCancelled.value) { + return; + } + this.assetLoadCancelled = null; + this.speciesLoaded.set(species.speciesId, true); + this.pokemonSprite.play(species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? + this.pokemonSprite.setPipelineData("shiny", shiny); + this.pokemonSprite.setPipelineData("variant", variant); + this.pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? + this.pokemonSprite.setVisible(!this.statsMode); + }); + } else { this.pokemonSprite.setVisible(!this.statsMode); - }); + } - - const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), !!this.starterSpecies.length); - const currentFilteredContainer = this.filteredStarterContainers.find(p => p.species.speciesId === species.speciesId); + const isValidForChallenge = new BooleanHolder(true); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + species, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), + !!this.starterSpecies.length, + ); + const currentFilteredContainer = this.filteredStarterContainers.find( + p => p.species.speciesId === species.speciesId, + ); if (currentFilteredContainer) { const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; - starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female!, formIndex, shiny, variant)); + starterSprite.setTexture( + species.getIconAtlasKey(formIndex, shiny, variant), + species.getIconId(female!, formIndex, shiny, variant), + ); currentFilteredContainer.checkIconId(female, formIndex, shiny, variant); } const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); - const isVariant1Caught = isShinyCaught && !!(caughtAttr & DexAttr.DEFAULT_VARIANT); - const isVariant2Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_2); - const isVariant3Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_3); - this.canCycleShiny = isNonShinyCaught && isShinyCaught; - this.canCycleVariant = !!shiny && [ isVariant1Caught, isVariant2Caught, isVariant3Caught ].filter(v => v).length > 1; + const caughtVariants = [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter( + v => caughtAttr & v, + ); + this.canCycleShiny = (isNonShinyCaught && isShinyCaught) || (isShinyCaught && caughtVariants.length > 1); const isMaleCaught = !!(caughtAttr & DexAttr.MALE); const isFemaleCaught = !!(caughtAttr & DexAttr.FEMALE); @@ -3102,12 +3897,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { hasAbility2 = 0; } - this.canCycleAbility = [ hasAbility1, hasAbility2, hasHiddenAbility ].filter(a => a).length > 1; - - this.canCycleForm = species.forms.filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) - .map((_, f) => dexEntry.caughtAttr & this.scene.gameData.getFormAttr(f)).filter(f => f).length > 1; - this.canCycleNature = this.scene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1; + this.canCycleAbility = [hasAbility1, hasAbility2, hasHiddenAbility].filter(a => a).length > 1; + this.canCycleForm = + species.forms + .filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) + .map((_, f) => dexEntry.caughtAttr & globalScene.gameData.getFormAttr(f)) + .filter(f => f).length > 1; + this.canCycleNature = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1; + this.canCycleTera = + !this.statsMode && + globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && + !Utils.isNullOrUndefined(getPokemonSpeciesForm(species.speciesId, formIndex ?? 0).type2); } if (dexEntry.caughtAttr && species.malePercent !== null) { @@ -3120,27 +3921,34 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } if (dexEntry.caughtAttr) { - const ability = allAbilities[this.lastSpecies.getAbility(abilityIndex!)]; // TODO: is this bang correct? + let ability: Ability; + if (this.lastSpecies.forms?.length > 1) { + ability = allAbilities[this.lastSpecies.forms[formIndex ?? 0].getAbility(abilityIndex!)]; + } else { + ability = allAbilities[this.lastSpecies.getAbility(abilityIndex!)]; // TODO: is this bang correct? + } this.pokemonAbilityText.setText(ability.name); const isHidden = abilityIndex === (this.lastSpecies.ability2 ? 2 : 1); this.pokemonAbilityText.setColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD)); - this.pokemonAbilityText.setShadowColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true)); + this.pokemonAbilityText.setShadowColor( + this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true), + ); - const passiveAttr = this.scene.gameData.starterData[species.speciesId].passiveAttr; - const passiveAbility = allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]]; + const passiveAttr = globalScene.gameData.starterData[species.speciesId].passiveAttr; + const passiveAbility = allAbilities[this.lastSpecies.getPassiveAbility(formIndex)]; if (this.pokemonAbilityText.visible) { if (this.activeTooltip === "ABILITY") { - this.scene.ui.editTooltip(`${ability.name}`, `${ability.description}`); + globalScene.ui.editTooltip(`${ability.name}`, `${ability.description}`); } this.pokemonAbilityText.on("pointerover", () => { - this.scene.ui.showTooltip(`${ability.name}`, `${ability.description}`, true); + globalScene.ui.showTooltip(`${ability.name}`, `${ability.description}`, true); this.activeTooltip = "ABILITY"; }); this.pokemonAbilityText.on("pointerout", () => { - this.scene.ui.hideTooltip(); + globalScene.ui.hideTooltip(); this.activeTooltip = undefined; }); } @@ -3162,35 +3970,43 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveText.setShadowColor(this.getTextColor(textStyle, true)); if (this.activeTooltip === "PASSIVE") { - this.scene.ui.editTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`); + globalScene.ui.editTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`); } if (this.pokemonPassiveText.visible) { this.pokemonPassiveText.on("pointerover", () => { - this.scene.ui.showTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`, true); + globalScene.ui.showTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`, true); this.activeTooltip = "PASSIVE"; }); this.pokemonPassiveText.on("pointerout", () => { - this.scene.ui.hideTooltip(); + globalScene.ui.hideTooltip(); this.activeTooltip = undefined; }); } const iconPosition = { x: this.pokemonPassiveText.x + this.pokemonPassiveText.displayWidth + 1, - y: this.pokemonPassiveText.y + this.pokemonPassiveText.displayHeight / 2 + y: this.pokemonPassiveText.y + this.pokemonPassiveText.displayHeight / 2, }; this.pokemonPassiveDisabledIcon.setVisible(isUnlocked && !isEnabled); this.pokemonPassiveDisabledIcon.setPosition(iconPosition.x, iconPosition.y); this.pokemonPassiveLockedIcon.setVisible(!isUnlocked); this.pokemonPassiveLockedIcon.setPosition(iconPosition.x, iconPosition.y); - + } else if (this.activeTooltip === "PASSIVE") { + // No passive and passive tooltip is active > hide it + globalScene.ui.hideTooltip(); } - this.pokemonNatureText.setText(getNatureName(natureIndex as unknown as Nature, true, true, false, this.scene.uiTheme)); + this.pokemonNatureText.setText( + getNatureName(natureIndex as unknown as Nature, true, true, false, globalScene.uiTheme), + ); let levelMoves: LevelMoves; - if (pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && formIndex && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) { + if ( + pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && + formIndex && + pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex) + ) { levelMoves = pokemonFormLevelMoves[species.speciesId][formIndex]; } else { levelMoves = pokemonSpeciesLevelMoves[species.speciesId]; @@ -3198,47 +4014,57 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.speciesStarterMoves.push(...levelMoves.filter(lm => lm[0] > 0 && lm[0] <= 5).map(lm => lm[1])); if (speciesEggMoves.hasOwnProperty(species.speciesId)) { for (let em = 0; em < 4; em++) { - if (this.scene.gameData.starterData[species.speciesId].eggMoves & (1 << em)) { + if (globalScene.gameData.starterData[species.speciesId].eggMoves & (1 << em)) { this.speciesStarterMoves.push(speciesEggMoves[species.speciesId][em]); } } } - const speciesMoveData = this.scene.gameData.starterData[species.speciesId].moveset; + const speciesMoveData = globalScene.gameData.starterData[species.speciesId].moveset; const moveData: StarterMoveset | null = speciesMoveData ? Array.isArray(speciesMoveData) ? speciesMoveData : speciesMoveData[formIndex!] // TODO: is this bang correct? : null; - const availableStarterMoves = this.speciesStarterMoves.concat(speciesEggMoves.hasOwnProperty(species.speciesId) ? speciesEggMoves[species.speciesId].filter((_, em: integer) => this.scene.gameData.starterData[species.speciesId].eggMoves & (1 << em)) : []); - this.starterMoveset = (moveData || (this.speciesStarterMoves.slice(0, 4) as StarterMoveset)).filter(m => availableStarterMoves.find(sm => sm === m)) as StarterMoveset; + const availableStarterMoves = this.speciesStarterMoves.concat( + speciesEggMoves.hasOwnProperty(species.speciesId) + ? speciesEggMoves[species.speciesId].filter( + (_: any, em: number) => globalScene.gameData.starterData[species.speciesId].eggMoves & (1 << em), + ) + : [], + ); + this.starterMoveset = (moveData || (this.speciesStarterMoves.slice(0, 4) as StarterMoveset)).filter(m => + availableStarterMoves.find(sm => sm === m), + ) as StarterMoveset; // Consolidate move data if it contains an incompatible move if (this.starterMoveset.length < 4 && this.starterMoveset.length < availableStarterMoves.length) { - this.starterMoveset.push(...availableStarterMoves.filter(sm => this.starterMoveset?.indexOf(sm) === -1).slice(0, 4 - this.starterMoveset.length)); + this.starterMoveset.push( + ...availableStarterMoves + .filter(sm => this.starterMoveset?.indexOf(sm) === -1) + .slice(0, 4 - this.starterMoveset.length), + ); } // Remove duplicate moves - this.starterMoveset = this.starterMoveset.filter( - (move, i) => { - return this.starterMoveset?.indexOf(move) === i; - }) as StarterMoveset; + this.starterMoveset = this.starterMoveset.filter((move, i) => { + return this.starterMoveset?.indexOf(move) === i; + }) as StarterMoveset; const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? - const formText = Utils.capitalizeString(species?.forms[formIndex!]?.formKey, "-", false, false); // TODO: is the bang correct? - - const speciesName = Utils.capitalizeString(Species[species.speciesId], "_", true, false); - - if (species.speciesId === Species.ARCEUS) { - this.pokemonFormText.setText(i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`)); - } else { - this.pokemonFormText.setText(formText ? i18next.t(`pokemonForm:${speciesName}${formText}`) : ""); - } + const formText = species.getFormNameToDisplay(formIndex); + this.pokemonFormText.setText(formText); this.setTypeIcons(speciesForm.type1, speciesForm.type2); + + this.teraIcon.setFrame(PokemonType[this.teraCursor].toLowerCase()); + this.teraIcon.setVisible( + !this.statsMode && globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id), + ); } else { this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); this.pokemonNatureText.setText(""); + this.teraIcon.setVisible(false); this.setTypeIcons(null, null); } } else { @@ -3249,6 +4075,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); this.pokemonNatureText.setText(""); + this.teraIcon.setVisible(false); this.setTypeIcons(null, null); } @@ -3258,7 +4085,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let m = 0; m < 4; m++) { const move = m < this.starterMoveset.length ? allMoves[this.starterMoveset[m]] : null; - this.pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); + this.pokemonMoveBgs[m].setFrame(PokemonType[move ? move.type : PokemonType.UNKNOWN].toString().toLowerCase()); this.pokemonMoveLabels[m].setText(move ? move.name : "-"); this.pokemonMoveContainers[m].setVisible(!!move); } @@ -3267,8 +4094,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let em = 0; em < 4; em++) { const eggMove = hasEggMoves ? allMoves[speciesEggMoves[species.speciesId][em]] : null; - const eggMoveUnlocked = eggMove && this.scene.gameData.starterData[species.speciesId].eggMoves & (1 << em); - this.pokemonEggMoveBgs[em].setFrame(Type[eggMove ? eggMove.type : Type.UNKNOWN].toString().toLowerCase()); + const eggMoveUnlocked = eggMove && globalScene.gameData.starterData[species.speciesId].eggMoves & (1 << em); + this.pokemonEggMoveBgs[em].setFrame( + PokemonType[eggMove ? eggMove.type : PokemonType.UNKNOWN].toString().toLowerCase(), + ); this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???"); } @@ -3282,16 +4111,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.updateInstructions(); } - setTypeIcons(type1: Type | null, type2: Type | null): void { + setTypeIcons(type1: PokemonType | null, type2: PokemonType | null): void { if (type1 !== null) { this.type1Icon.setVisible(true); - this.type1Icon.setFrame(Type[type1].toLowerCase()); + this.type1Icon.setFrame(PokemonType[type1].toLowerCase()); } else { this.type1Icon.setVisible(false); } if (type2 !== null) { this.type2Icon.setVisible(true); - this.type2Icon.setFrame(Type[type2].toLowerCase()); + this.type2Icon.setFrame(PokemonType[type2].toLowerCase()); } else { this.type2Icon.setVisible(false); } @@ -3302,12 +4131,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterAttr.splice(index, 1); this.starterAbilityIndexes.splice(index, 1); this.starterNatures.splice(index, 1); + this.starterTeras.splice(index, 1); this.starterMovesets.splice(index, 1); for (let s = 0; s < this.starterSpecies.length; s++) { const species = this.starterSpecies[s]; const currentDexAttr = this.getCurrentDexProps(species.speciesId); - const props = this.scene.gameData.getSpeciesDexAttrProps(species, currentDexAttr); + const props = globalScene.gameData.getSpeciesDexAttrProps(species, currentDexAttr); this.starterIcons[s].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); this.starterIcons[s].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); this.checkIconId(this.starterIcons[s], species, props.female, props.formIndex, props.shiny, props.variant); @@ -3353,7 +4183,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { updateStarterValueLabel(starter: StarterContainer): void { const speciesId = starter.species.speciesId; const baseStarterValue = speciesStarterCosts[speciesId]; - const starterValue = this.scene.gameData.getSpeciesStarterValue(speciesId); + const starterValue = globalScene.gameData.getSpeciesStarterValue(speciesId); starter.cost = starterValue; let valueStr = starterValue.toString(); if (valueStr.startsWith("0.")) { @@ -3379,8 +4209,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - tryUpdateValue(add?: integer, addingToParty?: boolean): boolean { - const value = this.starterSpecies.map(s => s.generation).reduce((total: integer, gen: integer, i: integer) => total += this.scene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); + tryUpdateValue(add?: number, addingToParty?: boolean): boolean { + const value = this.starterSpecies + .map(s => s.generation) + .reduce( + (total: number, _gen: number, i: number) => + (total += globalScene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId)), + 0, + ); const newValue = value + (add || 0); const valueLimit = this.getValueLimit(); const overLimit = newValue > valueLimit; @@ -3390,29 +4226,36 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } this.valueLimitLabel.setText(`${newValueStr}/${valueLimit}`); this.valueLimitLabel.setColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK)); - this.valueLimitLabel.setShadowColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK, true)); + this.valueLimitLabel.setShadowColor( + this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK, true), + ); if (overLimit) { - this.scene.time.delayedCall(Utils.fixedInt(500), () => this.tryUpdateValue()); + globalScene.time.delayedCall(fixedInt(500), () => this.tryUpdateValue()); return false; } let isPartyValid: boolean = this.isPartyValid(); // this checks to see if the party is valid - if (addingToParty) { // this does a check to see if the pokemon being added is valid; if so, it will update the isPartyValid boolean - const isNewPokemonValid = new Utils.BooleanHolder(true); + if (addingToParty) { + // this does a check to see if the pokemon being added is valid; if so, it will update the isPartyValid boolean + const isNewPokemonValid = new BooleanHolder(true); const species = this.filteredStarterContainers[this.cursor].species; - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isNewPokemonValid, this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + species, + isNewPokemonValid, + globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), + false, + ); isPartyValid = isPartyValid || isNewPokemonValid.value; } /** * this loop is used to set the Sprite's alpha value and check if the user can select other pokemon more. */ - this.canAddParty = false; const remainValue = valueLimit - newValue; for (let s = 0; s < this.allSpecies.length; s++) { /** Cost of pokemon species */ - const speciesStarterValue = this.scene.gameData.getSpeciesStarterValue(this.allSpecies[s].speciesId); - /** Used to detect if this pokemon is registered in starter */ - const speciesStarterDexEntry = this.scene.gameData.dexData[this.allSpecies[s].speciesId]; + const speciesStarterValue = globalScene.gameData.getSpeciesStarterValue(this.allSpecies[s].speciesId); /** {@linkcode Phaser.GameObjects.Sprite} object of Pokémon for setting the alpha value */ const speciesSprite = this.starterContainers[s].icon; @@ -3427,25 +4270,32 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * If speciesStarterDexEntry?.caughtAttr is true, this species registered in stater. * we change to can AddParty value to true since the user has enough cost to choose this pokemon and this pokemon registered too. */ - const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.allSpecies[s], isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.allSpecies[s], this.getCurrentDexProps(this.allSpecies[s].speciesId)), isPartyValid); + const isValidForChallenge = new BooleanHolder(true); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + this.allSpecies[s], + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps( + this.allSpecies[s], + this.getCurrentDexProps(this.allSpecies[s].speciesId), + ), + isPartyValid, + ); const canBeChosen = remainValue >= speciesStarterValue && isValidForChallenge.value; const isPokemonInParty = this.isInParty(this.allSpecies[s])[0]; // this will get the valud of isDupe from isInParty. This will let us see if the pokemon in question is in our party already so we don't grey out the sprites if they're invalid /* This code does a check to tell whether or not a sprite should be lit up or greyed out. There are 3 ways a pokemon's sprite should be lit up: - * 1) If it's in your party, it's a valid pokemon (i.e. for challenge) and you have enough points to have it - * 2) If it's in your party, it's not valid (i.e. for challenges), and you have enough points to have it - * 3) If it's not in your party, but it's a valid pokemon and you have enough points for it - * Any other time, the sprite should be greyed out. - * For example, if it's in your party, valid, but costs too much, or if it's not in your party and not valid, regardless of cost - */ + * 1) If it's in your party, it's a valid pokemon (i.e. for challenge) and you have enough points to have it + * 2) If it's in your party, it's not valid (i.e. for challenges), and you have enough points to have it + * 3) If it's not in your party, but it's a valid pokemon and you have enough points for it + * Any other time, the sprite should be greyed out. + * For example, if it's in your party, valid, but costs too much, or if it's not in your party and not valid, regardless of cost + */ if (canBeChosen || (isPokemonInParty && remainValue >= speciesStarterValue)) { speciesSprite.setAlpha(1); - if (speciesStarterDexEntry?.caughtAttr) { - this.canAddParty = true; - } } else { /** * If it can't be chosen, the user can't select. @@ -3455,7 +4305,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - this.value = newValue; return true; } @@ -3469,24 +4318,31 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.blockInput = false; }; ui.showText(i18next.t("starterSelectUiHandler:confirmExit"), null, () => { - ui.setModeWithoutClear(Mode.CONFIRM, () => { - ui.setMode(Mode.STARTER_SELECT); - this.scene.clearPhaseQueue(); - if (this.scene.gameMode.isChallenge) { - this.scene.pushPhase(new SelectChallengePhase(this.scene)); - this.scene.pushPhase(new EncounterPhase(this.scene, false)); - } else { - this.scene.pushPhase(new TitlePhase(this.scene)); - } - this.clearText(); - this.scene.getCurrentPhase()?.end(); - }, cancel, null, null, 19); + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + ui.setMode(Mode.STARTER_SELECT); + globalScene.clearPhaseQueue(); + if (globalScene.gameMode.isChallenge) { + globalScene.pushPhase(new SelectChallengePhase()); + globalScene.pushPhase(new EncounterPhase()); + } else { + globalScene.pushPhase(new TitlePhase()); + } + this.clearText(); + globalScene.getCurrentPhase()?.end(); + }, + cancel, + null, + null, + 19, + ); }); return true; } - tryStart(manualTrigger: boolean = false): boolean { + tryStart(manualTrigger = false): boolean { if (!this.starterSpecies.length) { return false; } @@ -3505,47 +4361,72 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (canStart) { ui.showText(i18next.t("starterSelectUiHandler:confirmStartTeam"), null, () => { - ui.setModeWithoutClear(Mode.CONFIRM, () => { - const startRun = () => { - this.scene.money = this.scene.gameMode.getStartingMoney(); - ui.setMode(Mode.STARTER_SELECT); - const thisObj = this; - const originalStarterSelectCallback = this.starterSelectCallback; - this.starterSelectCallback = null; - originalStarterSelectCallback && originalStarterSelectCallback(new Array(this.starterSpecies.length).fill(0).map(function (_, i) { - const starterSpecies = thisObj.starterSpecies[i]; - return { - species: starterSpecies, - dexAttr: thisObj.starterAttr[i], - abilityIndex: thisObj.starterAbilityIndexes[i], - passive: !(thisObj.scene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED)), - nature: thisObj.starterNatures[i] as Nature, - moveset: thisObj.starterMovesets[i], - pokerus: thisObj.pokerusSpecies.includes(starterSpecies), - nickname: thisObj.starterPreferences[starterSpecies.speciesId]?.nickname, - }; - })); - }; - startRun(); - }, cancel, null, null, 19); + ui.setModeWithoutClear( + Mode.CONFIRM, + () => { + const startRun = () => { + globalScene.money = globalScene.gameMode.getStartingMoney(); + ui.setMode(Mode.STARTER_SELECT); + const thisObj = this; + const originalStarterSelectCallback = this.starterSelectCallback; + this.starterSelectCallback = null; + originalStarterSelectCallback?.( + new Array(this.starterSpecies.length).fill(0).map((_, i) => { + const starterSpecies = thisObj.starterSpecies[i]; + return { + species: starterSpecies, + dexAttr: thisObj.starterAttr[i], + abilityIndex: thisObj.starterAbilityIndexes[i], + passive: !( + globalScene.gameData.starterData[starterSpecies.speciesId].passiveAttr ^ + (PassiveAttr.ENABLED | PassiveAttr.UNLOCKED) + ), + nature: thisObj.starterNatures[i] as Nature, + teraType: thisObj.starterTeras[i] as PokemonType, + moveset: thisObj.starterMovesets[i], + pokerus: thisObj.pokerusSpecies.includes(starterSpecies), + nickname: thisObj.starterPreferences[starterSpecies.speciesId]?.nickname, + }; + }), + ); + }; + startRun(); + }, + 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; } /* This block checks to see if your party is valid * It checks each pokemon against the challenge - noting that due to monotype challenges it needs to check the pokemon while ignoring their evolutions/form change items - */ + */ isPartyValid(): boolean { let canStart = false; for (let s = 0; s < this.starterSpecies.length; s++) { - const isValidForChallenge = new Utils.BooleanHolder(true); + const isValidForChallenge = new BooleanHolder(true); const species = this.starterSpecies[s]; - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false); + Challenge.applyChallenges( + globalScene.gameMode, + Challenge.ChallengeType.STARTER_CHOICE, + species, + isValidForChallenge, + globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), + false, + ); canStart = canStart || isValidForChallenge.value; } return canStart; @@ -3560,13 +4441,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { */ getCurrentDexProps(speciesId: number): bigint { let props = 0n; - const caughtAttr = this.scene.gameData.dexData[speciesId].caughtAttr; + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr; /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props * If neither of these pass, we add DexAttr.MALE to our temp props */ - if (this.starterPreferences[speciesId]?.female || ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n)) { + if ( + this.starterPreferences[speciesId]?.female || + ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n) + ) { props += DexAttr.FEMALE; } else { props += DexAttr.MALE; @@ -3574,7 +4458,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences. * If they're not there, it enables shiny state by default if any shiny was caught */ - if (this.starterPreferences[speciesId]?.shiny || ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false)) { + if ( + this.starterPreferences[speciesId]?.shiny || + ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false) + ) { props += DexAttr.SHINY; if (this.starterPreferences[speciesId]?.variant !== undefined) { props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.variant)) * DexAttr.DEFAULT_VARIANT; @@ -3594,11 +4481,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { props += DexAttr.NON_SHINY; props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant } - if (this.starterPreferences[speciesId]?.form) { // this checks for the form of the pokemon + if (this.starterPreferences[speciesId]?.form) { + // this checks for the form of the pokemon props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.form)) * DexAttr.DEFAULT_FORM; } else { // Get the first unlocked form - props += this.scene.gameData.getFormAttr(this.scene.gameData.getFormIndex(caughtAttr)); + props += globalScene.gameData.getFormAttr(globalScene.gameData.getFormIndex(caughtAttr)); } return props; @@ -3612,12 +4500,26 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.showStats(); this.statsMode = true; this.pokemonSprite.setVisible(false); + this.teraIcon.setVisible(false); + this.canCycleTera = false; + this.updateInstructions(); } else { this.statsMode = false; this.statsContainer.setVisible(false); this.pokemonSprite.setVisible(!!this.speciesStarterDexEntry?.caughtAttr); //@ts-ignore this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. !?!? + this.teraIcon.setVisible(globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id)); + const props = globalScene.gameData.getSpeciesDexAttrProps( + this.lastSpecies, + this.getCurrentDexProps(this.lastSpecies.speciesId), + ); + const formIndex = props.formIndex; + this.canCycleTera = + !this.statsMode && + globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && + !Utils.isNullOrUndefined(getPokemonSpeciesForm(this.lastSpecies.speciesId, formIndex ?? 0).type2); + this.updateInstructions(); } } @@ -3647,8 +4549,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.abilityLabel.setVisible(false); this.natureIconElement.setVisible(false); this.natureLabel.setVisible(false); - this.variantIconElement.setVisible(false); - this.variantLabel.setVisible(false); + this.teraIconElement.setVisible(false); + this.teraLabel.setVisible(false); this.goFilterIconElement.setVisible(false); this.goFilterLabel.setVisible(false); } @@ -3656,11 +4558,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { clear(): void { super.clear(); - StarterPrefs.save(this.starterPreferences); + saveStarterPreferences(this.starterPreferences); this.cursor = -1; this.hideInstructions(); this.activeTooltip = undefined; - this.scene.ui.hideTooltip(); + globalScene.ui.hideTooltip(); this.starterSelectContainer.setVisible(false); this.blockInput = false; @@ -3674,9 +4576,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female: boolean, formIndex: number, shiny: boolean, variant: number) { + checkIconId( + icon: Phaser.GameObjects.Sprite, + species: PokemonSpecies, + female: boolean, + formIndex: number, + shiny: boolean, + variant: number, + ) { if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { - console.log(`${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`); + console.log( + `${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`, + ); icon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); icon.setFrame(species.getIconId(female, formIndex, false, variant)); } diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index 7e026ede83e..8cc74e64e96 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -1,28 +1,34 @@ -import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; -import BattleScene from "../battle-scene"; +import type BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text"; import { PERMANENT_STATS, getStatKey } from "#app/enums/stat"; import i18next from "i18next"; - +import { globalScene } from "#app/global-scene"; const ivChartSize = 24; -const ivChartStatCoordMultipliers = [[ 0, -1 ], [ 0.825, -0.5 ], [ 0.825, 0.5 ], [ -0.825, -0.5 ], [ -0.825, 0.5 ], [ 0, 1 ]]; +const ivChartStatCoordMultipliers = [ + [0, -1], + [0.825, -0.5], + [0.825, 0.5], + [-0.825, -0.5], + [-0.825, 0.5], + [0, 1], +]; const speedLabelOffset = -3; const sideLabelOffset = 1; -const ivLabelOffset = [ 0, sideLabelOffset, -sideLabelOffset, sideLabelOffset, -sideLabelOffset, speedLabelOffset ]; -const ivChartLabelyOffset = [ 0, 5, 0, 5, 0, 0 ]; // doing this so attack does not overlap with (+N) -const ivChartStatIndexes = [ 0, 1, 2, 5, 4, 3 ]; // swap special attack and speed +const ivLabelOffset = [0, sideLabelOffset, -sideLabelOffset, sideLabelOffset, -sideLabelOffset, speedLabelOffset]; +const ivChartLabelyOffset = [0, 5, 0, 5, 0, 0]; // doing this so attack does not overlap with (+N) +const ivChartStatIndexes = [0, 1, 2, 5, 4, 3]; // swap special attack and speed const defaultIvChartData = new Array(12).fill(null).map(() => 0); export class StatsContainer extends Phaser.GameObjects.Container { private showDiff: boolean; - private statsIvsCache: integer[]; + private statsIvsCache: number[]; private ivChart: Phaser.GameObjects.Polygon; private ivStatValueTexts: BBCodeText[]; - constructor(scene: BattleScene, x: number, y: number, showDiff?: boolean) { - super(scene, x, y); + constructor(x: number, y: number, showDiff?: boolean) { + super(globalScene, x, y); this.showDiff = !!showDiff; @@ -31,22 +37,38 @@ export class StatsContainer extends Phaser.GameObjects.Container { setup() { this.setName("stats"); - const ivChartBgData = new Array(6).fill(null).map((_, i: integer) => [ ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); - const ivChartBg = this.scene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625); + const ivChartBgData = new Array(6) + .fill(null) + .flatMap((_, i: number) => [ + ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], + ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1], + ]); + const ivChartBg = globalScene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625); ivChartBg.setOrigin(0, 0); - const ivChartBorder = this.scene.add.polygon(ivChartBg.x, ivChartBg.y, ivChartBgData) - .setStrokeStyle(1, 0x484050); + const ivChartBorder = globalScene.add.polygon(ivChartBg.x, ivChartBg.y, ivChartBgData).setStrokeStyle(1, 0x484050); ivChartBorder.setOrigin(0, 0); - const ivChartBgLines = [[ 0, -1, 0, 1 ], [ -0.825, -0.5, 0.825, 0.5 ], [ 0.825, -0.5, -0.825, 0.5 ]].map(coords => { - const line = new Phaser.GameObjects.Line(this.scene, ivChartBg.x, ivChartBg.y, ivChartSize * coords[0], ivChartSize * coords[1], ivChartSize * coords[2], ivChartSize * coords[3], 0xffffff) - .setLineWidth(0.5); + const ivChartBgLines = [ + [0, -1, 0, 1], + [-0.825, -0.5, 0.825, 0.5], + [0.825, -0.5, -0.825, 0.5], + ].map(coords => { + const line = new Phaser.GameObjects.Line( + globalScene, + ivChartBg.x, + ivChartBg.y, + ivChartSize * coords[0], + ivChartSize * coords[1], + ivChartSize * coords[2], + ivChartSize * coords[3], + 0xffffff, + ).setLineWidth(0.5); line.setOrigin(0, 0); return line; }); - this.ivChart = this.scene.add.polygon(ivChartBg.x, ivChartBg.y, defaultIvChartData, 0x98d8a0, 0.75); + this.ivChart = globalScene.add.polygon(ivChartBg.x, ivChartBg.y, defaultIvChartData, 0x98d8a0, 0.75); this.ivChart.setOrigin(0, 0); this.add(ivChartBg); @@ -58,31 +80,42 @@ export class StatsContainer extends Phaser.GameObjects.Container { for (const s of PERMANENT_STATS) { const statLabel = addTextObject( - this.scene, - ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[s][0] * 1.325 + (this.showDiff ? 0 : ivLabelOffset[s]), - ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[s][1] * 1.325 - 4 + (this.showDiff ? 0 : ivChartLabelyOffset[s]), + ivChartBg.x + ivChartSize * ivChartStatCoordMultipliers[s][0] * 1.325 + (this.showDiff ? 0 : ivLabelOffset[s]), + ivChartBg.y + + ivChartSize * ivChartStatCoordMultipliers[s][1] * 1.325 - + 4 + + (this.showDiff ? 0 : ivChartLabelyOffset[s]), i18next.t(getStatKey(s)), - TextStyle.TOOLTIP_CONTENT + TextStyle.TOOLTIP_CONTENT, ); statLabel.setOrigin(0.5); - this.ivStatValueTexts[s] = addBBCodeTextObject(this.scene, statLabel.x - (this.showDiff ? 0 : ivLabelOffset[s]), statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT); + this.ivStatValueTexts[s] = addBBCodeTextObject( + statLabel.x - (this.showDiff ? 0 : ivLabelOffset[s]), + statLabel.y + 8, + "0", + TextStyle.TOOLTIP_CONTENT, + ); this.ivStatValueTexts[s].setOrigin(0.5); - this.add(statLabel); this.add(this.ivStatValueTexts[s]); } } - updateIvs(ivs: integer[], originalIvs?: integer[]): void { + updateIvs(ivs: number[], originalIvs?: number[]): void { if (ivs) { - const ivChartData = new Array(6).fill(null).map((_, i) => [ (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); + const ivChartData = new Array(6) + .fill(null) + .flatMap((_, i) => [ + (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], + (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1], + ]); const lastIvChartData = this.statsIvsCache || defaultIvChartData; - const perfectIVColor: string = getTextColor(TextStyle.SUMMARY_GOLD, false, (this.scene as BattleScene).uiTheme); + const perfectIVColor: string = getTextColor(TextStyle.SUMMARY_GOLD, false, globalScene.uiTheme); this.statsIvsCache = ivChartData.slice(0); - this.ivStatValueTexts.map((t: BBCodeText, i: integer) => { + this.ivStatValueTexts.map((t: BBCodeText, i: number) => { let label = ""; // Check to see if IVs are 31, if so change the text style to gold, otherwise leave them be. @@ -93,7 +126,7 @@ export class StatsContainer extends Phaser.GameObjects.Container { } if (this.showDiff && originalIvs) { if (originalIvs[i] < ivs[i]) { - label += ` ([color=${getTextColor(TextStyle.SUMMARY_BLUE, false, (this.scene as BattleScene).uiTheme)}][shadow=${getTextColor(TextStyle.SUMMARY_BLUE, true, (this.scene as BattleScene).uiTheme)}]+${ivs[i] - originalIvs[i]}[/shadow][/color])`; + label += ` ([color=${getTextColor(TextStyle.SUMMARY_BLUE, false, globalScene.uiTheme)}][shadow=${getTextColor(TextStyle.SUMMARY_BLUE, true, globalScene.uiTheme)}]+${ivs[i] - originalIvs[i]}[/shadow][/color])`; } else { label += " (-)"; } @@ -101,30 +134,33 @@ export class StatsContainer extends Phaser.GameObjects.Container { t.setText(`[shadow]${label}[/shadow]`); }); - const newColor = ivs.every(iv => iv === 31) ? parseInt(perfectIVColor.substr(1), 16) : 0x98d8a0; + const newColor = ivs.every(iv => iv === 31) ? Number.parseInt(perfectIVColor.substr(1), 16) : 0x98d8a0; const oldColor = this.ivChart.fillColor; - const interpolateColor = oldColor !== newColor ? [ - Phaser.Display.Color.IntegerToColor(oldColor), - Phaser.Display.Color.IntegerToColor(newColor) - ] : null; + const interpolateColor = + oldColor !== newColor + ? [Phaser.Display.Color.IntegerToColor(oldColor), Phaser.Display.Color.IntegerToColor(newColor)] + : null; - this.scene.tweens.addCounter({ + globalScene.tweens.addCounter({ from: 0, to: 1, duration: 1000, ease: "Cubic.easeOut", onUpdate: (tween: Phaser.Tweens.Tween) => { const progress = tween.getValue(); - const interpolatedData = ivChartData.map((v: number, i: integer) => v * progress + (lastIvChartData[i] * (1 - progress))); + const interpolatedData = ivChartData.map( + (v: number, i: number) => v * progress + lastIvChartData[i] * (1 - progress), + ); if (interpolateColor) { this.ivChart.setFillStyle( Phaser.Display.Color.ValueToColor( - Phaser.Display.Color.Interpolate.ColorWithColor(interpolateColor[0], interpolateColor[1], 1, progress) + Phaser.Display.Color.Interpolate.ColorWithColor(interpolateColor[0], interpolateColor[1], 1, progress), ).color, - 0.75); + 0.75, + ); } this.ivChart.setTo(interpolatedData); - } + }, }); } else { this.statsIvsCache = defaultIvChartData; diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index b35c0ca3303..d42572cfef4 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -1,50 +1,56 @@ -import BattleScene, { starterColors } from "#app/battle-scene"; +import { starterColors } from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { Mode } from "#app/ui/ui"; import UiHandler from "#app/ui/ui-handler"; import * as Utils from "#app/utils"; -import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import type { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; import { argbFromRgba } from "@material/material-color-utilities"; -import { Type, getTypeRgb } from "#app/data/type"; +import { getTypeRgb } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { TextStyle, addBBCodeTextObject, addTextObject, getBBCodeFrag } from "#app/ui/text"; -import Move, { MoveCategory } from "#app/data/move"; +import type Move from "#app/data/moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; import { getPokeballAtlasKey } from "#app/data/pokeball"; import { getGenderColor, getGenderSymbol } from "#app/data/gender"; import { getLevelRelExp, getLevelTotalExp } from "#app/data/exp"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; -import { StatusEffect } from "#app/data/status-effect"; +import { StatusEffect } from "#enums/status-effect"; import { getBiomeName } from "#app/data/balance/biomes"; -import { Nature, getNatureName, getNatureStatMultiplier } from "#app/data/nature"; +import { getNatureName, getNatureStatMultiplier } from "#app/data/nature"; import { loggedInUser } from "#app/account"; -import { Variant, getVariantTint } from "#app/data/variant"; +import type { Variant } from "#app/data/variant"; +import { getVariantTint } from "#app/data/variant"; import { Button } from "#enums/buttons"; -import { Ability } from "#app/data/ability"; +import type { Ability } from "#app/data/ability"; import i18next from "i18next"; import { modifierSortFunc } from "#app/modifier/modifier"; import { PlayerGender } from "#enums/player-gender"; import { Stat, PERMANENT_STATS, getStatKey } from "#enums/stat"; +import { Nature } from "#enums/nature"; +import { achvs } from "#app/system/achv"; enum Page { PROFILE, STATS, - MOVES + MOVES, } export enum SummaryUiMode { DEFAULT, - LEARN_MOVE + LEARN_MOVE, } /** Holds all objects related to an ability for each iteration */ interface abilityContainer { /** An image displaying the summary label */ - labelImage: Phaser.GameObjects.Image, + labelImage: Phaser.GameObjects.Image; /** The ability object */ - ability: Ability | null, + ability: Ability | null; /** The text object displaying the name of the ability */ - nameText: Phaser.GameObjects.Text | null, + nameText: Phaser.GameObjects.Text | null; /** The text object displaying the description of the ability */ - descriptionText: Phaser.GameObjects.Text | null, + descriptionText: Phaser.GameObjects.Text | null; } export default class SummaryUiHandler extends UiHandler { @@ -91,6 +97,9 @@ export default class SummaryUiHandler extends UiHandler { private friendshipText: Phaser.GameObjects.Text; private friendshipIcon: Phaser.GameObjects.Sprite; private friendshipOverlay: Phaser.GameObjects.Sprite; + private permStatsContainer: Phaser.GameObjects.Container; + private ivContainer: Phaser.GameObjects.Container; + private statsContainer: Phaser.GameObjects.Container; private descriptionScrollTween: Phaser.Tweens.Tween | null; private moveCursorBlinkTimer: Phaser.Time.TimerEvent | null; @@ -105,186 +114,195 @@ export default class SummaryUiHandler extends UiHandler { private moveEffectsVisible: boolean; private moveSelect: boolean; - private moveCursor: integer; - private selectedMoveIndex: integer; + private moveCursor: number; + private selectedMoveIndex: number; private selectCallback: Function | null; - constructor(scene: BattleScene) { - super(scene, Mode.SUMMARY); + constructor() { + super(Mode.SUMMARY); } setup() { const ui = this.getUi(); - this.summaryContainer = this.scene.add.container(0, 0); + this.summaryContainer = globalScene.add.container(0, 0); this.summaryContainer.setVisible(false); ui.add(this.summaryContainer); - const summaryBg = this.scene.add.image(0, 0, "summary_bg"); + const summaryBg = globalScene.add.image(0, 0, "summary_bg"); summaryBg.setOrigin(0, 1); this.summaryContainer.add(summaryBg); - this.tabSprite = this.scene.add.sprite(134, (-summaryBg.displayHeight) + 16, "summary_tabs_1"); + this.tabSprite = globalScene.add.sprite(134, -summaryBg.displayHeight + 16, "summary_tabs_1"); this.tabSprite.setOrigin(1, 1); this.summaryContainer.add(this.tabSprite); - const summaryLabel = addTextObject(this.scene, 4, -165, i18next.t("pokemonSummary:pokemonInfo"), TextStyle.SUMMARY); + const summaryLabel = addTextObject(4, -165, i18next.t("pokemonSummary:pokemonInfo"), TextStyle.SUMMARY); summaryLabel.setOrigin(0, 1); this.summaryContainer.add(summaryLabel); - this.shinyOverlay = this.scene.add.image(6, -54, "summary_overlay_shiny"); + this.shinyOverlay = globalScene.add.image(6, -54, "summary_overlay_shiny"); this.shinyOverlay.setOrigin(0, 1); this.shinyOverlay.setVisible(false); this.summaryContainer.add(this.shinyOverlay); - this.numberText = addTextObject(this.scene, 17, -149, "0000", TextStyle.SUMMARY); + this.numberText = addTextObject(17, -149, "0000", TextStyle.SUMMARY); this.numberText.setOrigin(0, 1); this.summaryContainer.add(this.numberText); - this.pokemonSprite = this.scene.initPokemonSprite(this.scene.add.sprite(56, -106, "pkmn__sub"), undefined, false, true); + this.pokemonSprite = globalScene.initPokemonSprite( + globalScene.add.sprite(56, -106, "pkmn__sub"), + undefined, + false, + true, + ); this.summaryContainer.add(this.pokemonSprite); - this.nameText = addTextObject(this.scene, 6, -54, "", TextStyle.SUMMARY); + this.nameText = addTextObject(6, -54, "", TextStyle.SUMMARY); this.nameText.setOrigin(0, 0); this.summaryContainer.add(this.nameText); - this.splicedIcon = this.scene.add.sprite(0, -54, "icon_spliced"); + this.splicedIcon = globalScene.add.sprite(0, -54, "icon_spliced"); this.splicedIcon.setVisible(false); this.splicedIcon.setOrigin(0, 0); this.splicedIcon.setScale(0.75); this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.splicedIcon); - this.shinyIcon = this.scene.add.image(0, -54, "shiny_star"); + this.shinyIcon = globalScene.add.image(0, -54, "shiny_star"); this.shinyIcon.setVisible(false); this.shinyIcon.setOrigin(0, 0); this.shinyIcon.setScale(0.75); this.shinyIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.shinyIcon); - this.fusionShinyIcon = this.scene.add.image(0, 0, "shiny_star_2"); + this.fusionShinyIcon = globalScene.add.image(0, 0, "shiny_star_2"); this.fusionShinyIcon.setVisible(false); this.fusionShinyIcon.setOrigin(0, 0); this.fusionShinyIcon.setScale(0.75); this.summaryContainer.add(this.fusionShinyIcon); - this.pokeball = this.scene.add.sprite(6, -19, "pb"); + this.pokeball = globalScene.add.sprite(6, -19, "pb"); this.pokeball.setOrigin(0, 1); this.summaryContainer.add(this.pokeball); - this.candyIcon = this.scene.add.sprite(13, -140, "candy"); + this.candyIcon = globalScene.add.sprite(13, -140, "candy"); this.candyIcon.setScale(0.8); this.summaryContainer.add(this.candyIcon); - this.candyOverlay = this.scene.add.sprite(13, -140, "candy_overlay"); + this.candyOverlay = globalScene.add.sprite(13, -140, "candy_overlay"); this.candyOverlay.setScale(0.8); this.summaryContainer.add(this.candyOverlay); - this.candyShadow = this.scene.add.sprite(13, -140, "candy"); + this.candyShadow = globalScene.add.sprite(13, -140, "candy"); this.candyShadow.setTint(0x000000); - this.candyShadow.setAlpha(0.50); + this.candyShadow.setAlpha(0.5); this.candyShadow.setScale(0.8); - this.candyShadow.setInteractive(new Phaser.Geom.Rectangle(0, 0, 16, 16), Phaser.Geom.Rectangle.Contains); + this.candyShadow.setInteractive(new Phaser.Geom.Rectangle(0, 0, 30, 16), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.candyShadow); - this.candyCountText = addTextObject(this.scene, 20, -146, "x0", TextStyle.WINDOW_ALT, { fontSize: "76px" }); + this.candyCountText = addTextObject(20, -146, "x0", TextStyle.WINDOW_ALT, { + fontSize: "76px", + }); this.candyCountText.setOrigin(0, 0); this.summaryContainer.add(this.candyCountText); - this.friendshipIcon = this.scene.add.sprite(13, -60, "friendship"); + this.friendshipIcon = globalScene.add.sprite(13, -60, "friendship"); this.friendshipIcon.setScale(0.8); this.summaryContainer.add(this.friendshipIcon); - this.friendshipOverlay = this.scene.add.sprite(13, -60, "friendship_overlay"); + this.friendshipOverlay = globalScene.add.sprite(13, -60, "friendship_overlay"); this.friendshipOverlay.setScale(0.8); this.summaryContainer.add(this.friendshipOverlay); - this.friendshipShadow = this.scene.add.sprite(13, -60, "friendship"); + this.friendshipShadow = globalScene.add.sprite(13, -60, "friendship"); this.friendshipShadow.setTint(0x000000); - this.friendshipShadow.setAlpha(0.50); + this.friendshipShadow.setAlpha(0.5); this.friendshipShadow.setScale(0.8); - this.friendshipShadow.setInteractive(new Phaser.Geom.Rectangle(0, 0, 16, 16), Phaser.Geom.Rectangle.Contains); + this.friendshipShadow.setInteractive(new Phaser.Geom.Rectangle(0, 0, 50, 16), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.friendshipShadow); - this.friendshipText = addTextObject(this.scene, 20, -66, "x0", TextStyle.WINDOW_ALT, { fontSize: "76px" }); + this.friendshipText = addTextObject(20, -66, "x0", TextStyle.WINDOW_ALT, { + fontSize: "76px", + }); this.friendshipText.setOrigin(0, 0); this.summaryContainer.add(this.friendshipText); - this.championRibbon = this.scene.add.image(88, -146, "champion_ribbon"); + this.championRibbon = globalScene.add.image(88, -146, "champion_ribbon"); this.championRibbon.setOrigin(0, 0); //this.championRibbon.setScale(0.8); this.championRibbon.setScale(1.25); this.summaryContainer.add(this.championRibbon); this.championRibbon.setVisible(false); - this.levelText = addTextObject(this.scene, 36, -17, "", TextStyle.SUMMARY_ALT); + this.levelText = addTextObject(24, -17, "", TextStyle.SUMMARY_ALT); this.levelText.setOrigin(0, 1); this.summaryContainer.add(this.levelText); - this.genderText = addTextObject(this.scene, 96, -17, "", TextStyle.SUMMARY); + this.genderText = addTextObject(96, -17, "", TextStyle.SUMMARY); this.genderText.setOrigin(0, 1); this.summaryContainer.add(this.genderText); - this.statusContainer = this.scene.add.container(-106, -16); + this.statusContainer = globalScene.add.container(-106, -16); - const statusBg = this.scene.add.image(0, 0, "summary_status"); + const statusBg = globalScene.add.image(0, 0, "summary_status"); statusBg.setOrigin(0, 0); this.statusContainer.add(statusBg); - const statusLabel = addTextObject(this.scene, 3, 0, i18next.t("pokemonSummary:status"), TextStyle.SUMMARY); + const statusLabel = addTextObject(3, 0, i18next.t("pokemonSummary:status"), TextStyle.SUMMARY); statusLabel.setOrigin(0, 0); this.statusContainer.add(statusLabel); - this.status = this.scene.add.sprite(91, 4, Utils.getLocalizedSpriteKey("statuses")); + this.status = globalScene.add.sprite(91, 4, Utils.getLocalizedSpriteKey("statuses")); this.status.setOrigin(0.5, 0); this.statusContainer.add(this.status); this.summaryContainer.add(this.statusContainer); - this.moveEffectContainer = this.scene.add.container(106, -62); + this.moveEffectContainer = globalScene.add.container(106, -62); this.summaryContainer.add(this.moveEffectContainer); - const moveEffectBg = this.scene.add.image(0, 0, "summary_moves_effect"); + const moveEffectBg = globalScene.add.image(0, 0, "summary_moves_effect"); moveEffectBg.setOrigin(0, 0); this.moveEffectContainer.add(moveEffectBg); - const moveEffectLabels = addTextObject(this.scene, 8, 12, i18next.t("pokemonSummary:powerAccuracyCategory"), TextStyle.SUMMARY); + const moveEffectLabels = addTextObject(8, 12, i18next.t("pokemonSummary:powerAccuracyCategory"), TextStyle.SUMMARY); moveEffectLabels.setLineSpacing(9); moveEffectLabels.setOrigin(0, 0); this.moveEffectContainer.add(moveEffectLabels); - this.movePowerText = addTextObject(this.scene, 99, 27, "0", TextStyle.WINDOW_ALT); + this.movePowerText = addTextObject(99, 27, "0", TextStyle.WINDOW_ALT); this.movePowerText.setOrigin(1, 1); this.moveEffectContainer.add(this.movePowerText); - this.moveAccuracyText = addTextObject(this.scene, 99, 43, "0", TextStyle.WINDOW_ALT); + this.moveAccuracyText = addTextObject(99, 43, "0", TextStyle.WINDOW_ALT); this.moveAccuracyText.setOrigin(1, 1); this.moveEffectContainer.add(this.moveAccuracyText); - this.moveCategoryIcon = this.scene.add.sprite(99, 57, "categories"); + this.moveCategoryIcon = globalScene.add.sprite(99, 57, "categories"); this.moveCategoryIcon.setOrigin(1, 1); this.moveEffectContainer.add(this.moveCategoryIcon); const getSummaryPageBg = () => { - const ret = this.scene.add.sprite(0, 0, this.getPageKey(0)); + const ret = globalScene.add.sprite(0, 0, this.getPageKey(0)); ret.setOrigin(0, 1); return ret; }; - this.summaryContainer.add((this.summaryPageContainer = this.scene.add.container(106, 0))); + this.summaryContainer.add((this.summaryPageContainer = globalScene.add.container(106, 0))); this.summaryPageContainer.add(getSummaryPageBg()); this.summaryPageContainer.setVisible(false); - this.summaryContainer.add((this.summaryPageTransitionContainer = this.scene.add.container(106, 0))); + this.summaryContainer.add((this.summaryPageTransitionContainer = globalScene.add.container(106, 0))); this.summaryPageTransitionContainer.add(getSummaryPageBg()); this.summaryPageTransitionContainer.setVisible(false); } - getPageKey(page?: integer) { + getPageKey(page?: number) { if (page === undefined) { page = this.cursor; } @@ -295,16 +313,16 @@ export default class SummaryUiHandler extends UiHandler { super.show(args); /* args[] information - * args[0] : the Pokemon displayed in the Summary-UI - * args[1] : the summaryUiMode (defaults to 0) - * args[2] : the start page (defaults to Page.PROFILE) - * args[3] : contains the function executed when the user exits out of Summary UI - * args[4] : optional boolean used to determine if the Pokemon is part of the player's party or not (defaults to true, necessary for PR #2921 to display all relevant information) - */ + * args[0] : the Pokemon displayed in the Summary-UI + * args[1] : the summaryUiMode (defaults to 0) + * args[2] : the start page (defaults to Page.PROFILE) + * args[3] : contains the function executed when the user exits out of Summary UI + * args[4] : optional boolean used to determine if the Pokemon is part of the player's party or not (defaults to true, necessary for PR #2921 to display all relevant information) + */ this.pokemon = args[0] as PlayerPokemon; - this.summaryUiMode = args.length > 1 ? args[1] as SummaryUiMode : SummaryUiMode.DEFAULT; + this.summaryUiMode = args.length > 1 ? (args[1] as SummaryUiMode) : SummaryUiMode.DEFAULT; this.playerParty = args[4] ?? true; - this.scene.ui.bringToTop(this.summaryContainer); + globalScene.ui.bringToTop(this.summaryContainer); this.summaryContainer.setVisible(true); this.cursor = -1; @@ -315,18 +333,24 @@ export default class SummaryUiHandler extends UiHandler { this.candyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0]))); this.candyOverlay.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1]))); - 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)); + this.numberText.setShadowColor( + this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, 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("isTerastallized", this.pokemon.isTerastallized); this.pokemonSprite.setPipelineData("ignoreTimeTint", true); this.pokemonSprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); this.pokemonSprite.setPipelineData("shiny", this.pokemon.shiny); this.pokemonSprite.setPipelineData("variant", this.pokemon.variant); - [ "spriteColors", "fusionSpriteColors" ].map(k => { + ["spriteColors", "fusionSpriteColors"].map(k => { delete this.pokemonSprite.pipelineData[`${k}Base`]; if (this.pokemon?.summonData?.speciesForm) { k += "Base"; @@ -342,55 +366,81 @@ export default class SummaryUiHandler extends UiHandler { this.splicedIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + 2, 3); this.splicedIcon.setVisible(isFusion); if (this.splicedIcon.visible) { - this.splicedIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${this.pokemon?.species.getName(this.pokemon.formIndex)}/${this.pokemon?.fusionSpecies?.getName(this.pokemon?.fusionFormIndex)}`, true)); - this.splicedIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + this.splicedIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${this.pokemon?.species.getName(this.pokemon.formIndex)}/${this.pokemon?.fusionSpecies?.getName(this.pokemon?.fusionFormIndex)}`, + true, + ), + ); + this.splicedIcon.on("pointerout", () => globalScene.ui.hideTooltip()); } - if (this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].classicWinCount > 0 && this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId(true)].classicWinCount > 0) { + if ( + globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].classicWinCount > 0 && + globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId(true)].classicWinCount > 0 + ) { this.championRibbon.setVisible(true); } else { this.championRibbon.setVisible(false); } - let currentFriendship = this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].friendship; + let currentFriendship = globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].friendship; if (!currentFriendship || currentFriendship === undefined) { currentFriendship = 0; } const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[this.pokemon.species.getRootSpeciesId()]); - const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); + const candyCropY = 16 - 16 * (currentFriendship / friendshipCap); if (this.candyShadow.visible) { - this.candyShadow.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true)); - this.candyShadow.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + this.candyShadow.on("pointerover", () => + globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true), + ); + this.candyShadow.on("pointerout", () => globalScene.ui.hideTooltip()); } - this.candyCountText.setText(`x${this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].candyCount}`); + this.candyCountText.setText( + `x${globalScene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].candyCount}`, + ); this.candyShadow.setCrop(0, 0, 16, candyCropY); if (this.friendshipShadow.visible) { - this.friendshipShadow.on("pointerover", () => this.scene.ui.showTooltip("", `${i18next.t("pokemonSummary:friendship")}`, true)); - this.friendshipShadow.on("pointerout", () => this.scene.ui.hideTooltip()); + this.friendshipShadow.on("pointerover", () => + globalScene.ui.showTooltip("", `${i18next.t("pokemonSummary:friendship")}`, true), + ); + this.friendshipShadow.on("pointerout", () => globalScene.ui.hideTooltip()); } this.friendshipText.setText(`${this.pokemon?.friendship || "0"} / 255`); - this.friendshipShadow.setCrop(0, 0, 16, 16 - (16 * ((this.pokemon?.friendship || 0) / 255))); + this.friendshipShadow.setCrop(0, 0, 16, 16 - 16 * ((this.pokemon?.friendship || 0) / 255)); const doubleShiny = isFusion && this.pokemon.shiny && this.pokemon.fusionShiny; const baseVariant = !doubleShiny ? this.pokemon.getVariant() : this.pokemon.variant; - this.shinyIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0) + 1, 3); + this.shinyIcon.setPositionRelative( + this.nameText, + this.nameText.displayWidth + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0) + 1, + 3, + ); this.shinyIcon.setTexture(`shiny_star${doubleShiny ? "_1" : ""}`); this.shinyIcon.setVisible(this.pokemon.isShiny()); this.shinyIcon.setTint(getVariantTint(baseVariant)); if (this.shinyIcon.visible) { - const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${this.pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : this.pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` - : ""; - this.shinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); - this.shinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + const shinyDescriptor = + doubleShiny || baseVariant + ? `${baseVariant === 2 ? i18next.t("common:epicShiny") : baseVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}${doubleShiny ? `/${this.pokemon.fusionVariant === 2 ? i18next.t("common:epicShiny") : this.pokemon.fusionVariant === 1 ? i18next.t("common:rareShiny") : i18next.t("common:commonShiny")}` : ""}` + : ""; + this.shinyIcon.on("pointerover", () => + globalScene.ui.showTooltip( + "", + `${i18next.t("common:shinyOnHover")}${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, + true, + ), + ); + this.shinyIcon.on("pointerout", () => globalScene.ui.hideTooltip()); } this.fusionShinyIcon.setPosition(this.shinyIcon.x, this.shinyIcon.y); @@ -400,20 +450,21 @@ export default class SummaryUiHandler extends UiHandler { } this.pokeball.setFrame(getPokeballAtlasKey(this.pokemon.pokeball)); - this.levelText.setText(this.pokemon.level.toString()); + this.levelText.setText(`${i18next.t("pokemonSummary:lv")}${this.pokemon.level.toString()}`); this.genderText.setText(getGenderSymbol(this.pokemon.getGender(true))); this.genderText.setColor(getGenderColor(this.pokemon.getGender(true))); this.genderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true)); switch (this.summaryUiMode) { - case SummaryUiMode.DEFAULT: - const page = args.length < 2 ? Page.PROFILE : args[2] as Page; + case SummaryUiMode.DEFAULT: { + const page = args.length < 2 ? Page.PROFILE : (args[2] as Page); this.hideMoveEffect(true); this.setCursor(page); if (args.length > 3) { this.selectCallback = args[3]; } break; + } case SummaryUiMode.LEARN_MOVE: this.newMove = args[2] as Move; this.moveSelectFunction = args[3] as Function; @@ -450,7 +501,7 @@ export default class SummaryUiHandler extends UiHandler { if (button === Button.ACTION) { if (this.pokemon && this.moveCursor < this.pokemon.moveset.length) { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - this.moveSelectFunction && this.moveSelectFunction(this.moveCursor); + this.moveSelectFunction?.(this.moveCursor); } else { if (this.selectedMoveIndex === -1) { this.selectedMoveIndex = this.moveCursor; @@ -461,7 +512,9 @@ export default class SummaryUiHandler extends UiHandler { this.pokemon.moveset[this.selectedMoveIndex] = this.pokemon.moveset[this.moveCursor]; this.pokemon.moveset[this.moveCursor] = tempMove; - const selectedMoveRow = this.moveRowsContainer.getAt(this.selectedMoveIndex) as Phaser.GameObjects.Container; + const selectedMoveRow = this.moveRowsContainer.getAt( + this.selectedMoveIndex, + ) as Phaser.GameObjects.Container; const switchMoveRow = this.moveRowsContainer.getAt(this.moveCursor) as Phaser.GameObjects.Container; this.moveRowsContainer.moveTo(selectedMoveRow, this.moveCursor); @@ -503,11 +556,10 @@ export default class SummaryUiHandler extends UiHandler { this.destroyBlinkCursor(); success = true; break; - } else { - this.hideMoveSelect(); - success = true; - break; } + this.hideMoveSelect(); + success = true; + break; } } } else { @@ -525,6 +577,10 @@ export default class SummaryUiHandler extends UiHandler { this.passiveContainer.nameText?.setVisible(!this.passiveContainer.descriptionText?.visible); this.passiveContainer.descriptionText?.setVisible(!this.passiveContainer.descriptionText.visible); this.passiveContainer.labelImage.setVisible(!this.passiveContainer.labelImage.visible); + } else if (this.cursor === Page.STATS) { + //Show IVs + this.permStatsContainer.setVisible(!this.permStatsContainer.visible); + this.ivContainer.setVisible(!this.ivContainer.visible); } } else if (button === Button.CANCEL) { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { @@ -547,21 +603,23 @@ export default class SummaryUiHandler extends UiHandler { const pages = Utils.getEnumValues(Page); switch (button) { case Button.UP: - case Button.DOWN: + case Button.DOWN: { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { break; - } else if (!fromPartyMode) { + } + if (!fromPartyMode) { break; } const isDown = button === Button.DOWN; - const party = this.scene.getParty(); + const party = globalScene.getPlayerParty(); const partyMemberIndex = this.pokemon ? party.indexOf(this.pokemon) : -1; if ((isDown && partyMemberIndex < party.length - 1) || (!isDown && partyMemberIndex)) { const page = this.cursor; this.clear(); - this.show([ party[partyMemberIndex + (isDown ? 1 : -1)], this.summaryUiMode, page ]); + this.show([party[partyMemberIndex + (isDown ? 1 : -1)], this.summaryUiMode, page]); } break; + } case Button.LEFT: if (this.cursor) { success = this.setCursor(this.cursor - 1); @@ -588,7 +646,7 @@ export default class SummaryUiHandler extends UiHandler { return success || error; } - setCursor(cursor: integer, overrideChanged: boolean = false): boolean { + setCursor(cursor: number, overrideChanged = false): boolean { let changed: boolean = overrideChanged || this.moveCursor !== cursor; if (this.moveSelect) { @@ -615,18 +673,18 @@ export default class SummaryUiHandler extends UiHandler { } if (moveDescriptionLineCount > 3) { - this.descriptionScrollTween = this.scene.tweens.add({ + this.descriptionScrollTween = globalScene.tweens.add({ targets: this.moveDescriptionText, delay: Utils.fixedInt(2000), loop: -1, hold: Utils.fixedInt(2000), duration: Utils.fixedInt((moveDescriptionLineCount - 3) * 2000), - y: `-=${14.83 * (moveDescriptionLineCount - 3)}` + y: `-=${14.83 * (moveDescriptionLineCount - 3)}`, }); } if (!this.moveCursorObj) { - this.moveCursorObj = this.scene.add.sprite(-2, 0, "summary_moves_cursor", "highlight"); + this.moveCursorObj = globalScene.add.sprite(-2, 0, "summary_moves_cursor", "highlight"); this.moveCursorObj.setOrigin(0, 1); this.movesContainer.add(this.moveCursorObj); } @@ -637,22 +695,22 @@ export default class SummaryUiHandler extends UiHandler { this.moveCursorBlinkTimer.destroy(); } this.moveCursorObj.setVisible(true); - this.moveCursorBlinkTimer = this.scene.time.addEvent({ + this.moveCursorBlinkTimer = globalScene.time.addEvent({ loop: true, delay: Utils.fixedInt(600), callback: () => { this.moveCursorObj?.setVisible(false); - this.scene.time.delayedCall(Utils.fixedInt(100), () => { + globalScene.time.delayedCall(Utils.fixedInt(100), () => { if (!this.moveCursorObj) { return; } this.moveCursorObj.setVisible(true); }); - } + }, }); if (this.selectedMoveIndex > -1) { if (!this.selectedMoveCursorObj) { - this.selectedMoveCursorObj = this.scene.add.sprite(-2, 0, "summary_moves_cursor", "select"); + this.selectedMoveCursorObj = globalScene.add.sprite(-2, 0, "summary_moves_cursor", "select"); this.selectedMoveCursorObj.setOrigin(0, 1); this.movesContainer.add(this.selectedMoveCursorObj); this.movesContainer.moveBelow(this.selectedMoveCursorObj, this.moveCursorObj); @@ -678,7 +736,7 @@ export default class SummaryUiHandler extends UiHandler { } else { this.populatePageContainer(this.summaryPageContainer); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.summaryPageTransitionContainer, x: forward ? "-=214" : "+=214", duration: 250, @@ -695,7 +753,7 @@ export default class SummaryUiHandler extends UiHandler { } this.summaryPageTransitionContainer.setVisible(false); this.transitioning = false; - } + }, }); this.summaryPageTransitionContainer.setVisible(true); } else { @@ -721,7 +779,7 @@ export default class SummaryUiHandler extends UiHandler { }); pageContainer.removeBetween(1, undefined, true); } - const pageBg = (pageContainer.getAt(0) as Phaser.GameObjects.Sprite); + const pageBg = pageContainer.getAt(0) as Phaser.GameObjects.Sprite; pageBg.setTexture(this.getPageKey(page)); if (this.descriptionScrollTween) { @@ -730,28 +788,38 @@ export default class SummaryUiHandler extends UiHandler { } switch (page) { - case Page.PROFILE: - const profileContainer = this.scene.add.container(0, -pageBg.height); + case Page.PROFILE: { + const profileContainer = globalScene.add.container(0, -pageBg.height); pageContainer.add(profileContainer); // TODO: should add field for original trainer name to Pokemon object, to support gift/traded Pokemon from MEs - const trainerText = addBBCodeTextObject(this.scene, 7, 12, `${i18next.t("pokemonSummary:ot")}/${getBBCodeFrag(loggedInUser?.username || i18next.t("pokemonSummary:unknown"), this.scene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE)}`, TextStyle.SUMMARY_ALT); + const trainerText = addBBCodeTextObject( + 7, + 12, + `${i18next.t("pokemonSummary:ot")}/${getBBCodeFrag(loggedInUser?.username || i18next.t("pokemonSummary:unknown"), globalScene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE)}`, + TextStyle.SUMMARY_ALT, + ); trainerText.setOrigin(0, 0); profileContainer.add(trainerText); - const trainerIdText = addTextObject(this.scene, 174, 12, this.scene.gameData.trainerId.toString(), TextStyle.SUMMARY_ALT); + const trainerIdText = addTextObject( + 141, + 12, + `${i18next.t("pokemonSummary:idNo")}${globalScene.gameData.trainerId.toString()}`, + TextStyle.SUMMARY_ALT, + ); trainerIdText.setOrigin(0, 0); profileContainer.add(trainerIdText); - const typeLabel = addTextObject(this.scene, 7, 28, `${i18next.t("pokemonSummary:type")}/`, TextStyle.WINDOW_ALT); + const typeLabel = addTextObject(7, 28, `${i18next.t("pokemonSummary:type")}/`, TextStyle.WINDOW_ALT); typeLabel.setOrigin(0, 0); profileContainer.add(typeLabel); - const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => { + const getTypeIcon = (index: number, type: PokemonType, tera = false) => { const xCoord = typeLabel.width * typeLabel.scale + 9 + 34 * index; const typeIcon = !tera - ? this.scene.add.sprite(xCoord, 42, Utils.getLocalizedSpriteKey("types"), Type[type].toLowerCase()) - : this.scene.add.sprite(xCoord, 42, "type_tera"); + ? globalScene.add.sprite(xCoord, 42, Utils.getLocalizedSpriteKey("types"), PokemonType[type].toLowerCase()) + : globalScene.add.sprite(xCoord, 42, "type_tera"); if (tera) { typeIcon.setScale(0.5); const typeRgb = getTypeRgb(type); @@ -766,39 +834,57 @@ export default class SummaryUiHandler extends UiHandler { if (types.length > 1) { profileContainer.add(getTypeIcon(1, types[1])); } - if (this.pokemon?.isTerastallized()) { - profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); - } if (this.pokemon?.getLuck()) { - const luckLabelText = addTextObject(this.scene, 141, 28, i18next.t("common:luckIndicator"), TextStyle.SUMMARY_ALT); + const luckLabelText = addTextObject(141, 28, i18next.t("common:luckIndicator"), TextStyle.SUMMARY_ALT); luckLabelText.setOrigin(0, 0); profileContainer.add(luckLabelText); - const luckText = addTextObject(this.scene, 141 + luckLabelText.displayWidth + 2, 28, this.pokemon.getLuck().toString(), TextStyle.SUMMARY); + const luckText = addTextObject( + 141 + luckLabelText.displayWidth + 2, + 28, + this.pokemon.getLuck().toString(), + TextStyle.SUMMARY, + ); luckText.setOrigin(0, 0); - luckText.setTint(getVariantTint((Math.min(this.pokemon.getLuck() - 1, 2)) as Variant)); + luckText.setTint(getVariantTint(Math.min(this.pokemon.getLuck() - 1, 2) as Variant)); profileContainer.add(luckText); } + if ( + globalScene.gameData.achvUnlocks.hasOwnProperty(achvs.TERASTALLIZE.id) && + !Utils.isNullOrUndefined(this.pokemon) + ) { + const teraIcon = globalScene.add.sprite(123, 26, "button_tera"); + teraIcon.setName("terrastallize-icon"); + teraIcon.setFrame(PokemonType[this.pokemon.getTeraType()].toLowerCase()); + profileContainer.add(teraIcon); + } + this.abilityContainer = { - labelImage: this.scene.add.image(0, 0, "summary_profile_ability"), + labelImage: globalScene.add.image(0, 0, "summary_profile_ability"), ability: this.pokemon?.getAbility(true)!, // TODO: is this bang correct? nameText: null, - descriptionText: null }; + descriptionText: null, + }; - const allAbilityInfo = [ this.abilityContainer ]; // Creates an array to iterate through + const allAbilityInfo = [this.abilityContainer]; // Creates an array to iterate through // Only add to the array and set up displaying a passive if it's unlocked if (this.pokemon?.hasPassive()) { this.passiveContainer = { - labelImage: this.scene.add.image(0, 0, "summary_profile_passive"), + labelImage: globalScene.add.image(0, 0, "summary_profile_passive"), ability: this.pokemon.getPassiveAbility(), nameText: null, - descriptionText: null }; + descriptionText: null, + }; allAbilityInfo.push(this.passiveContainer); // Sets up the pixel button prompt image - this.abilityPrompt = this.scene.add.image(0, 0, !this.scene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a"); + this.abilityPrompt = globalScene.add.image( + 0, + 0, + !globalScene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a", + ); this.abilityPrompt.setPosition(8, 43); this.abilityPrompt.setVisible(true); this.abilityPrompt.setOrigin(0, 0); @@ -811,18 +897,20 @@ export default class SummaryUiHandler extends UiHandler { abilityInfo.labelImage.setOrigin(0, 0); profileContainer.add(abilityInfo.labelImage); - abilityInfo.nameText = addTextObject(this.scene, 7, 66, abilityInfo.ability?.name!, TextStyle.SUMMARY_ALT); // TODO: is this bang correct? + abilityInfo.nameText = addTextObject(7, 66, abilityInfo.ability?.name!, TextStyle.SUMMARY_ALT); // TODO: is this bang correct? abilityInfo.nameText.setOrigin(0, 1); profileContainer.add(abilityInfo.nameText); - abilityInfo.descriptionText = addTextObject(this.scene, 7, 69, abilityInfo.ability?.description!, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 }}); // TODO: is this bang correct? + abilityInfo.descriptionText = addTextObject(7, 69, abilityInfo.ability?.description!, TextStyle.WINDOW_ALT, { + wordWrap: { width: 1224 }, + }); // TODO: is this bang correct? abilityInfo.descriptionText.setOrigin(0, 0); profileContainer.add(abilityInfo.descriptionText); // Sets up the mask that hides the description text to give an illusion of scrolling - const descriptionTextMaskRect = this.scene.make.graphics({}); + const descriptionTextMaskRect = globalScene.make.graphics({}); descriptionTextMaskRect.setScale(6); - descriptionTextMaskRect.fillStyle(0xFFFFFF); + descriptionTextMaskRect.fillStyle(0xffffff); descriptionTextMaskRect.beginPath(); descriptionTextMaskRect.fillRect(110, 90.5, 206, 31); @@ -835,13 +923,13 @@ export default class SummaryUiHandler extends UiHandler { // Animates the description text moving upwards if (abilityDescriptionLineCount > 2) { abilityInfo.descriptionText.setY(69); - this.descriptionScrollTween = this.scene.tweens.add({ + this.descriptionScrollTween = globalScene.tweens.add({ targets: abilityInfo.descriptionText, delay: Utils.fixedInt(2000), loop: -1, hold: Utils.fixedInt(2000), duration: Utils.fixedInt((abilityDescriptionLineCount - 2) * 2000), - y: `-=${14.83 * (abilityDescriptionLineCount - 2)}` + y: `-=${14.83 * (abilityDescriptionLineCount - 2)}`, }); } }); @@ -855,21 +943,30 @@ export default class SummaryUiHandler extends UiHandler { const nature = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct? const memoString = i18next.t("pokemonSummary:memoString", { - metFragment: i18next.t(`pokemonSummary:metFragment.${this.pokemon?.metBiome === -1 ? "apparently" : "normal"}`, { - biome: `${getBBCodeFrag(getBiomeName(this.pokemon?.metBiome!), TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? - level: `${getBBCodeFrag(this.pokemon?.metLevel.toString()!, TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? - wave: `${getBBCodeFrag((this.pokemon?.metWave ? this.pokemon.metWave.toString()! : i18next.t("pokemonSummary:unknownTrainer")), TextStyle.SUMMARY_RED)}${closeFragment}`, - }), - natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) + metFragment: i18next.t( + `pokemonSummary:metFragment.${this.pokemon?.metBiome === -1 ? "apparently" : "normal"}`, + { + biome: `${getBBCodeFrag(getBiomeName(this.pokemon?.metBiome!), TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? + level: `${getBBCodeFrag(this.pokemon?.metLevel.toString()!, TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? + wave: `${getBBCodeFrag(this.pokemon?.metWave ? this.pokemon.metWave.toString()! : i18next.t("pokemonSummary:unknownTrainer"), TextStyle.SUMMARY_RED)}${closeFragment}`, + }, + ), + natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }), }); - const memoText = addBBCodeTextObject(this.scene, 7, 113, String(memoString), TextStyle.WINDOW_ALT); + const memoText = addBBCodeTextObject(7, 113, String(memoString), TextStyle.WINDOW_ALT); memoText.setOrigin(0, 0); profileContainer.add(memoText); break; - case Page.STATS: - const statsContainer = this.scene.add.container(0, -pageBg.height); - pageContainer.add(statsContainer); + } + case Page.STATS: { + this.statsContainer = globalScene.add.container(0, -pageBg.height); + pageContainer.add(this.statsContainer); + this.permStatsContainer = globalScene.add.container(27, 56); + this.statsContainer.add(this.permStatsContainer); + this.ivContainer = globalScene.add.container(27, 56); + this.statsContainer.add(this.ivContainer); + this.statsContainer.setVisible(true); PERMANENT_STATS.forEach((stat, s) => { const statName = i18next.t(getStatKey(stat)); @@ -878,32 +975,59 @@ export default class SummaryUiHandler extends UiHandler { const natureStatMultiplier = getNatureStatMultiplier(this.pokemon?.getNature()!, s); // TODO: is this bang correct? - const statLabel = addTextObject(this.scene, 27 + 115 * colIndex + (colIndex === 1 ? 5 : 0), 56 + 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + const statLabel = addTextObject( + 115 * colIndex + (colIndex === 1 ? 5 : 0), + 16 * rowIndex, + statName, + natureStatMultiplier === 1 + ? TextStyle.SUMMARY + : natureStatMultiplier > 1 + ? TextStyle.SUMMARY_PINK + : TextStyle.SUMMARY_BLUE, + ); + const ivLabel = addTextObject( + 115 * colIndex + (colIndex === 1 ? 5 : 0), + 16 * rowIndex, + statName, + this.pokemon?.ivs[stat] === 31 ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, + ); + statLabel.setOrigin(0.5, 0); - statsContainer.add(statLabel); + ivLabel.setOrigin(0.5, 0); + this.permStatsContainer.add(statLabel); + this.ivContainer.add(ivLabel); - const statValueText = stat !== Stat.HP - ? Utils.formatStat(this.pokemon?.getStat(stat)!) // TODO: is this bang correct? - : `${Utils.formatStat(this.pokemon?.hp!, true)}/${Utils.formatStat(this.pokemon?.getMaxHp()!, true)}`; // TODO: are those bangs correct? + const statValueText = + stat !== Stat.HP + ? Utils.formatStat(this.pokemon?.getStat(stat)!) // TODO: is this bang correct? + : `${Utils.formatStat(this.pokemon?.hp!, true)}/${Utils.formatStat(this.pokemon?.getMaxHp()!, true)}`; // TODO: are those bangs correct? + const ivText = `${this.pokemon?.ivs[stat]}/31`; - const statValue = addTextObject(this.scene, 120 + 88 * colIndex, 56 + 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); + const statValue = addTextObject(93 + 88 * colIndex, 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); statValue.setOrigin(1, 0); - statsContainer.add(statValue); + this.permStatsContainer.add(statValue); + const ivValue = addTextObject(93 + 88 * colIndex, 16 * rowIndex, ivText, TextStyle.WINDOW_ALT); + ivValue.setOrigin(1, 0); + this.ivContainer.add(ivValue); }); + this.ivContainer.setVisible(false); - const itemModifiers = (this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && m.pokemonId === this.pokemon?.id, this.playerParty) as PokemonHeldItemModifier[]) - .sort(modifierSortFunc); + const itemModifiers = ( + globalScene.findModifiers( + m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.pokemon?.id, + this.playerParty, + ) as PokemonHeldItemModifier[] + ).sort(modifierSortFunc); itemModifiers.forEach((item, i) => { - const icon = item.getIcon(this.scene, true); + const icon = item.getIcon(true); icon.setPosition((i % 17) * 12 + 3, 14 * Math.floor(i / 17) + 15); - statsContainer.add(icon); + this.statsContainer.add(icon); icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 32), Phaser.Geom.Rectangle.Contains); - icon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(item.type.name, item.type.getDescription(this.scene), true)); - icon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + icon.on("pointerover", () => globalScene.ui.showTooltip(item.type.name, item.type.getDescription(), true)); + icon.on("pointerout", () => globalScene.ui.hideTooltip()); }); const pkmLvl = this.pokemon?.level!; // TODO: is this bang correct? @@ -911,55 +1035,70 @@ export default class SummaryUiHandler extends UiHandler { const pkmExp = this.pokemon?.exp!; // TODO: is this bang correct? const pkmSpeciesGrowthRate = this.pokemon?.species.growthRate!; // TODO: is this bang correct? const relLvExp = getLevelRelExp(pkmLvl + 1, pkmSpeciesGrowthRate); - const expRatio = pkmLvl < this.scene.getMaxExpLevel() ? pkmLvlExp / relLvExp : 0; + const expRatio = pkmLvl < globalScene.getMaxExpLevel() ? pkmLvlExp / relLvExp : 0; - const expLabel = addTextObject(this.scene, 6, 112, i18next.t("pokemonSummary:expPoints"), TextStyle.SUMMARY); + const expLabel = addTextObject(6, 112, i18next.t("pokemonSummary:expPoints"), TextStyle.SUMMARY); expLabel.setOrigin(0, 0); - statsContainer.add(expLabel); + this.statsContainer.add(expLabel); - const nextLvExpLabel = addTextObject(this.scene, 6, 128, i18next.t("pokemonSummary:nextLv"), TextStyle.SUMMARY); + const nextLvExpLabel = addTextObject(6, 128, i18next.t("pokemonSummary:nextLv"), TextStyle.SUMMARY); nextLvExpLabel.setOrigin(0, 0); - statsContainer.add(nextLvExpLabel); + this.statsContainer.add(nextLvExpLabel); - const expText = addTextObject(this.scene, 208, 112, pkmExp.toString(), TextStyle.WINDOW_ALT); + const expText = addTextObject(208, 112, pkmExp.toString(), TextStyle.WINDOW_ALT); expText.setOrigin(1, 0); - statsContainer.add(expText); + this.statsContainer.add(expText); - const nextLvExp = pkmLvl < this.scene.getMaxExpLevel() - ? getLevelTotalExp(pkmLvl + 1, pkmSpeciesGrowthRate) - pkmExp - : 0; - const nextLvExpText = addTextObject(this.scene, 208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); + const nextLvExp = + pkmLvl < globalScene.getMaxExpLevel() ? getLevelTotalExp(pkmLvl + 1, pkmSpeciesGrowthRate) - pkmExp : 0; + const nextLvExpText = addTextObject(208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); nextLvExpText.setOrigin(1, 0); - statsContainer.add(nextLvExpText); + this.statsContainer.add(nextLvExpText); - const expOverlay = this.scene.add.image(140, 145, "summary_stats_overlay_exp"); + const expOverlay = globalScene.add.image(140, 145, "summary_stats_overlay_exp"); expOverlay.setOrigin(0, 0); - statsContainer.add(expOverlay); + this.statsContainer.add(expOverlay); - const expMaskRect = this.scene.make.graphics({}); + const expMaskRect = globalScene.make.graphics({}); expMaskRect.setScale(6); - expMaskRect.fillStyle(0xFFFFFF); + expMaskRect.fillStyle(0xffffff); expMaskRect.beginPath(); expMaskRect.fillRect(140 + pageContainer.x, 145 + pageContainer.y + 21, Math.floor(expRatio * 64), 3); const expMask = expMaskRect.createGeometryMask(); expOverlay.setMask(expMask); + this.abilityPrompt = globalScene.add.image( + 0, + 0, + !globalScene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a", + ); + this.abilityPrompt.setPosition(8, 47); + this.abilityPrompt.setVisible(true); + this.abilityPrompt.setOrigin(0, 0); + this.statsContainer.add(this.abilityPrompt); break; - case Page.MOVES: - this.movesContainer = this.scene.add.container(5, -pageBg.height + 26); + } + case Page.MOVES: { + this.movesContainer = globalScene.add.container(5, -pageBg.height + 26); pageContainer.add(this.movesContainer); - this.extraMoveRowContainer = this.scene.add.container(0, 64); + this.extraMoveRowContainer = globalScene.add.container(0, 64); this.extraMoveRowContainer.setVisible(false); this.movesContainer.add(this.extraMoveRowContainer); - const extraRowOverlay = this.scene.add.image(-2, 1, "summary_moves_overlay_row"); + const extraRowOverlay = globalScene.add.image(-2, 1, "summary_moves_overlay_row"); extraRowOverlay.setOrigin(0, 1); this.extraMoveRowContainer.add(extraRowOverlay); - const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.newMove ? this.newMove.name : i18next.t("pokemonSummary:cancel"), - this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY); + const extraRowText = addTextObject( + 35, + 0, + this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.newMove + ? this.newMove.name + : i18next.t("pokemonSummary:cancel"), + this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY, + ); extraRowText.setOrigin(0, 1); this.extraMoveRowContainer.add(extraRowText); @@ -969,45 +1108,46 @@ export default class SummaryUiHandler extends UiHandler { if (this.newMove && this.pokemon) { const spriteKey = Utils.getLocalizedSpriteKey("types"); const moveType = this.pokemon.getMoveType(this.newMove); - const newMoveTypeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + const newMoveTypeIcon = globalScene.add.sprite(0, 0, spriteKey, PokemonType[moveType].toLowerCase()); newMoveTypeIcon.setOrigin(0, 1); this.extraMoveRowContainer.add(newMoveTypeIcon); } - const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); + const ppOverlay = globalScene.add.image(163, -1, "summary_moves_overlay_pp"); ppOverlay.setOrigin(0, 1); this.extraMoveRowContainer.add(ppOverlay); const pp = Utils.padInt(this.newMove?.pp!, 2, " "); // TODO: is this bang correct? - const ppText = addTextObject(this.scene, 173, 1, `${pp}/${pp}`, TextStyle.WINDOW); + const ppText = addTextObject(173, 1, `${pp}/${pp}`, TextStyle.WINDOW); ppText.setOrigin(0, 1); this.extraMoveRowContainer.add(ppText); } - this.moveRowsContainer = this.scene.add.container(0, 0); + this.moveRowsContainer = globalScene.add.container(0, 0); this.movesContainer.add(this.moveRowsContainer); for (let m = 0; m < 4; m++) { - const move: PokemonMove | null = this.pokemon && this.pokemon.moveset.length > m ? this.pokemon?.moveset[m] : null; - const moveRowContainer = this.scene.add.container(0, 16 * m); + const move: PokemonMove | null = + this.pokemon && this.pokemon.moveset.length > m ? this.pokemon?.moveset[m] : null; + const moveRowContainer = globalScene.add.container(0, 16 * m); this.moveRowsContainer.add(moveRowContainer); if (move && this.pokemon) { const spriteKey = Utils.getLocalizedSpriteKey("types"); const moveType = this.pokemon.getMoveType(move.getMove()); - const typeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + const typeIcon = globalScene.add.sprite(0, 0, spriteKey, PokemonType[moveType].toLowerCase()); typeIcon.setOrigin(0, 1); moveRowContainer.add(typeIcon); } - const moveText = addTextObject(this.scene, 35, 0, move ? move.getName() : "-", TextStyle.SUMMARY); + const moveText = addTextObject(35, 0, move ? move.getName() : "-", TextStyle.SUMMARY); moveText.setOrigin(0, 1); moveRowContainer.add(moveText); - const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); + const ppOverlay = globalScene.add.image(163, -1, "summary_moves_overlay_pp"); ppOverlay.setOrigin(0, 1); moveRowContainer.add(ppOverlay); - const ppText = addTextObject(this.scene, 173, 1, "--/--", TextStyle.WINDOW); + const ppText = addTextObject(173, 1, "--/--", TextStyle.WINDOW); ppText.setOrigin(0, 1); if (move) { @@ -1019,12 +1159,12 @@ export default class SummaryUiHandler extends UiHandler { moveRowContainer.add(ppText); } - this.moveDescriptionText = addTextObject(this.scene, 2, 84, "", TextStyle.WINDOW_ALT, { wordWrap: { width: 1212 }}); + this.moveDescriptionText = addTextObject(2, 84, "", TextStyle.WINDOW_ALT, { wordWrap: { width: 1212 } }); this.movesContainer.add(this.moveDescriptionText); - const moveDescriptionTextMaskRect = this.scene.make.graphics({}); + const moveDescriptionTextMaskRect = globalScene.make.graphics({}); moveDescriptionTextMaskRect.setScale(6); - moveDescriptionTextMaskRect.fillStyle(0xFFFFFF); + moveDescriptionTextMaskRect.fillStyle(0xffffff); moveDescriptionTextMaskRect.beginPath(); moveDescriptionTextMaskRect.fillRect(112, 130, 202, 46); @@ -1032,6 +1172,7 @@ export default class SummaryUiHandler extends UiHandler { this.moveDescriptionText.setMask(moveDescriptionTextMask); break; + } } } @@ -1040,11 +1181,11 @@ export default class SummaryUiHandler extends UiHandler { return; } this.statusVisible = true; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.statusContainer, x: 0, duration: instant ? 0 : 250, - ease: "Sine.easeOut" + ease: "Sine.easeOut", }); } @@ -1053,11 +1194,11 @@ export default class SummaryUiHandler extends UiHandler { return; } this.statusVisible = false; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.statusContainer, x: -106, duration: instant ? 0 : 250, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); } @@ -1068,7 +1209,8 @@ export default class SummaryUiHandler extends UiHandler { if (this.moveCursor < 4 && this.pokemon && this.moveCursor < this.pokemon.moveset.length) { return this.pokemon.moveset[this.moveCursor]!.getMove(); // TODO: is this bang correct? - } else if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.moveCursor === 4) { + } + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.moveCursor === 4) { return this.newMove; } return null; @@ -1084,7 +1226,7 @@ export default class SummaryUiHandler extends UiHandler { hideMoveSelect() { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - this.moveSelectFunction && this.moveSelectFunction(4); + this.moveSelectFunction?.(4); return; } @@ -1116,11 +1258,11 @@ export default class SummaryUiHandler extends UiHandler { return; } this.moveEffectsVisible = true; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.moveEffectContainer, x: 6, duration: instant ? 0 : 250, - ease: "Sine.easeOut" + ease: "Sine.easeOut", }); } @@ -1129,11 +1271,11 @@ export default class SummaryUiHandler extends UiHandler { return; } this.moveEffectsVisible = false; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.moveEffectContainer, x: 106, duration: instant ? 0 : 250, - ease: "Sine.easeIn" + ease: "Sine.easeIn", }); } diff --git a/src/ui/target-select-ui-handler.ts b/src/ui/target-select-ui-handler.ts index 4c55a4b960e..d2f72ef4a4c 100644 --- a/src/ui/target-select-ui-handler.ts +++ b/src/ui/target-select-ui-handler.ts @@ -1,36 +1,38 @@ import { BattlerIndex } from "../battle"; -import BattleScene from "../battle-scene"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import * as Utils from "../utils"; -import { getMoveTargets } from "../data/move"; +import { getMoveTargets } from "../data/moves/move"; import { Button } from "#enums/buttons"; -import { Moves } from "#enums/moves"; -import Pokemon from "#app/field/pokemon"; -import { ModifierBar } from "#app/modifier/modifier"; +import type { Moves } from "#enums/moves"; +import type Pokemon from "#app/field/pokemon"; +import type { ModifierBar } from "#app/modifier/modifier"; import { SubstituteTag } from "#app/data/battler-tags"; +import { globalScene } from "#app/global-scene"; export type TargetSelectCallback = (targets: BattlerIndex[]) => void; export default class TargetSelectUiHandler extends UiHandler { - private fieldIndex: integer; + private fieldIndex: number; private move: Moves; private targetSelectCallback: TargetSelectCallback; + private cursor0: number; // associated with BattlerIndex.PLAYER + private cursor1: number; // associated with BattlerIndex.PLAYER_2 - private isMultipleTargets: boolean = false; + private isMultipleTargets = false; private targets: BattlerIndex[]; private targetsHighlighted: Pokemon[]; private targetFlashTween: Phaser.Tweens.Tween | null; private enemyModifiers: ModifierBar; private targetBattleInfoMoveTween: Phaser.Tweens.Tween[] = []; - constructor(scene: BattleScene) { - super(scene, Mode.TARGET_SELECT); + constructor() { + super(Mode.TARGET_SELECT); this.cursor = -1; } - setup(): void { } + setup(): void {} show(args: any[]): boolean { if (args.length < 3) { @@ -39,11 +41,12 @@ export default class TargetSelectUiHandler extends UiHandler { super.show(args); - this.fieldIndex = args[0] as integer; + this.fieldIndex = args[0] as number; this.move = args[1] as Moves; this.targetSelectCallback = args[2] as TargetSelectCallback; + const user = globalScene.getPlayerField()[this.fieldIndex]; - const moveTargets = getMoveTargets(this.scene.getPlayerField()[this.fieldIndex], this.move); + const moveTargets = getMoveTargets(user, this.move); this.targets = moveTargets.targets; this.isMultipleTargets = moveTargets.multiple ?? false; @@ -51,22 +54,49 @@ export default class TargetSelectUiHandler extends UiHandler { return false; } - this.enemyModifiers = this.scene.getModifierBar(true); - - this.setCursor(this.targets.includes(this.cursor) ? this.cursor : this.targets[0]); + this.enemyModifiers = globalScene.getModifierBar(true); + if (this.fieldIndex === BattlerIndex.PLAYER) { + this.resetCursor(this.cursor0, user); + } else if (this.fieldIndex === BattlerIndex.PLAYER_2) { + this.resetCursor(this.cursor1, user); + } return true; } + /** + * Determines what value to assign the main cursor based on the previous turn's target or the user's status + * @param cursorN the cursor associated with the user's field index + * @param user the Pokemon using the move + */ + resetCursor(cursorN: number, user: Pokemon): void { + if (!Utils.isNullOrUndefined(cursorN)) { + if ([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2].includes(cursorN) || user.battleSummonData.waveTurnCount === 1) { + // Reset cursor on the first turn of a fight or if an ally was targeted last turn + cursorN = -1; + } + } + this.setCursor(this.targets.includes(cursorN) ? cursorN : this.targets[0]); + } + processInput(button: Button): boolean { const ui = this.getUi(); let success = false; if (button === Button.ACTION || button === Button.CANCEL) { - const targetIndexes: BattlerIndex[] = this.isMultipleTargets ? this.targets : [ this.cursor ]; + const targetIndexes: BattlerIndex[] = this.isMultipleTargets ? this.targets : [this.cursor]; this.targetSelectCallback(button === Button.ACTION ? targetIndexes : []); success = true; + if (this.fieldIndex === BattlerIndex.PLAYER) { + if (Utils.isNullOrUndefined(this.cursor0) || this.cursor0 !== this.cursor) { + this.cursor0 = this.cursor; + } + } else if (this.fieldIndex === BattlerIndex.PLAYER_2) { + if (Utils.isNullOrUndefined(this.cursor1) || this.cursor1 !== this.cursor) { + this.cursor1 = this.cursor; + } + } } else if (this.isMultipleTargets) { success = false; } else { @@ -101,23 +131,23 @@ export default class TargetSelectUiHandler extends UiHandler { return success; } - setCursor(cursor: integer): boolean { - const singleTarget = this.scene.getField()[cursor]; - const multipleTargets = this.targets.map(index => this.scene.getField()[index]); + setCursor(cursor: number): boolean { + const singleTarget = globalScene.getField()[cursor]; + const multipleTargets = this.targets.map(index => globalScene.getField()[index]); - this.targetsHighlighted = this.isMultipleTargets ? multipleTargets : [ singleTarget ]; + this.targetsHighlighted = this.isMultipleTargets ? multipleTargets : [singleTarget]; const ret = super.setCursor(cursor); if (this.targetFlashTween) { this.targetFlashTween.stop(); for (const pokemon of multipleTargets) { - pokemon.setAlpha(!!pokemon.getTag(SubstituteTag) ? 0.5 : 1); + pokemon.setAlpha(pokemon.getTag(SubstituteTag) ? 0.5 : 1); this.highlightItems(pokemon.id, 1); } } - this.targetFlashTween = this.scene.tweens.add({ + this.targetFlashTween = globalScene.tweens.add({ targets: this.targetsHighlighted, key: { start: 1, to: 0.25 }, loop: -1, @@ -130,7 +160,7 @@ export default class TargetSelectUiHandler extends UiHandler { target.setAlpha(t.getValue()); this.highlightItems(target.id, t.getValue()); } - } + }, }); if (this.targetBattleInfoMoveTween.length >= 1) { @@ -143,16 +173,17 @@ export default class TargetSelectUiHandler extends UiHandler { const targetsBattleInfo = this.targetsHighlighted.map(target => target.getBattleInfo()); targetsBattleInfo.map(info => { - this.targetBattleInfoMoveTween.push(this.scene.tweens.add({ - targets: [ info ], - y: { start: info.getBaseY(), to: info.getBaseY() + 1 }, - loop: -1, - duration: Utils.fixedInt(250), - ease: "Linear", - yoyo: true - })); + this.targetBattleInfoMoveTween.push( + globalScene.tweens.add({ + targets: [info], + y: { start: info.getBaseY(), to: info.getBaseY() + 1 }, + loop: -1, + duration: Utils.fixedInt(250), + ease: "Linear", + yoyo: true, + }), + ); }); - return ret; } @@ -163,7 +194,7 @@ export default class TargetSelectUiHandler extends UiHandler { } for (const pokemon of this.targetsHighlighted) { - pokemon.setAlpha(!!pokemon.getTag(SubstituteTag) ? 0.5 : 1); + pokemon.setAlpha(pokemon.getTag(SubstituteTag) ? 0.5 : 1); this.highlightItems(pokemon.id, 1); } @@ -176,7 +207,7 @@ export default class TargetSelectUiHandler extends UiHandler { } } - private highlightItems(targetId: number, val: number) : void { + private highlightItems(targetId: number, val: number): void { const targetItems = this.enemyModifiers.getAll("name", targetId.toString()); for (const item of targetItems as Phaser.GameObjects.Container[]) { item.setAlpha(val); diff --git a/src/ui/test-dialogue-ui-handler.ts b/src/ui/test-dialogue-ui-handler.ts index bf0e7f6723f..9fbfc01a317 100644 --- a/src/ui/test-dialogue-ui-handler.ts +++ b/src/ui/test-dialogue-ui-handler.ts @@ -1,58 +1,67 @@ -import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; -import { ModalConfig } from "./modal-ui-handler"; +import type { InputFieldConfig } from "./form-modal-ui-handler"; +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import type { ModalConfig } from "./modal-ui-handler"; import i18next from "i18next"; -import { PlayerPokemon } from "#app/field/pokemon"; -import { OptionSelectItem } from "./abstact-option-select-ui-handler"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type { OptionSelectItem } from "./abstact-option-select-ui-handler"; import { isNullOrUndefined } from "#app/utils"; import { Mode } from "./ui"; export default class TestDialogueUiHandler extends FormModalUiHandler { - keys: string[]; - constructor(scene, mode) { - super(scene, mode); + constructor(mode) { + super(mode); } setup() { super.setup(); const flattenKeys = (object?: any, topKey?: string, midleKey?: string[]): Array => { - return Object.keys(object ?? {}).map((t, i) => { - const value = Object.values(object)[i]; + return Object.keys(object ?? {}) + .map((t, i) => { + const value = Object.values(object)[i]; - if (typeof value === "object" && !isNullOrUndefined(value)) { // we check for not null or undefined here because if the language json file has a null key, the typeof will still be an object, but that object will be null, causing issues - // If the value is an object, execute the same process - // si el valor es un objeto ejecuta el mismo proceso + if (typeof value === "object" && !isNullOrUndefined(value)) { + // we check for not null or undefined here because if the language json file has a null key, the typeof will still be an object, but that object will be null, causing issues + // If the value is an object, execute the same process + // si el valor es un objeto ejecuta el mismo proceso - return flattenKeys(value, topKey ?? t, topKey ? midleKey ? [ ...midleKey, t ] : [ t ] : undefined).filter((t) => t.length > 0); - } else if (typeof value === "string" || isNullOrUndefined(value)) { // we check for null or undefined here as per above - the typeof is still an object but the value is null so we need to exit out of this and pass the null key + return flattenKeys(value, topKey ?? t, topKey ? (midleKey ? [...midleKey, t] : [t]) : undefined).filter( + t => t.length > 0, + ); + } + if (typeof value === "string" || isNullOrUndefined(value)) { + // we check for null or undefined here as per above - the typeof is still an object but the value is null so we need to exit out of this and pass the null key - // Return in the format expected by i18next - return midleKey ? `${topKey}:${midleKey.map((m) => m).join(".")}.${t}` : `${topKey}:${t}`; - } - }).filter((t) => t); + // Return in the format expected by i18next + return midleKey ? `${topKey}:${midleKey.map(m => m).join(".")}.${t}` : `${topKey}:${t}`; + } + }) + .filter(t => t); }; - const keysInArrays = flattenKeys(i18next.getDataByLanguage(String(i18next.resolvedLanguage))).filter((t) => t.length > 0); // Array of arrays - const keys = keysInArrays.flat(Infinity).map(String); // One array of string + const keysInArrays = flattenKeys(i18next.getDataByLanguage(String(i18next.resolvedLanguage))).filter( + t => t.length > 0, + ); // Array of arrays + const keys = keysInArrays.flat(Number.POSITIVE_INFINITY).map(String); // One array of string this.keys = keys; } - getModalTitle(config?: ModalConfig): string { + getModalTitle(_config?: ModalConfig): string { return "Test Dialogue"; } - getWidth(config?: ModalConfig): number { + getWidth(_config?: ModalConfig): number { return 300; } - getMargin(config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; } - getButtonLabels(config?: ModalConfig): string[] { - return [ "Check", "Cancel" ]; + getButtonLabels(_config?: ModalConfig): string[] { + return ["Check", "Cancel"]; } getReadableErrorMessage(error: string): string { @@ -77,7 +86,10 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { input.setMaxLength(255); input.on("keydown", (inputObject, evt: KeyboardEvent) => { - if ([ "escape", "space" ].some((v) => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && ui.getMode() === Mode.AUTO_COMPLETE) { + if ( + ["escape", "space"].some(v => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && + ui.getMode() === Mode.AUTO_COMPLETE + ) { // Delete autocomplete list and recovery focus. inputObject.on("blur", () => inputObject.node.focus(), { once: true }); ui.revertMode(); @@ -92,10 +104,12 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { let options: OptionSelectItem[] = []; const splitArr = inputObject.text.split(" "); - const filteredKeys = this.keys.filter((command) => command.toLowerCase().includes(splitArr[splitArr.length - 1].toLowerCase())); + const filteredKeys = this.keys.filter(command => + command.toLowerCase().includes(splitArr[splitArr.length - 1].toLowerCase()), + ); if (inputObject.text !== "" && filteredKeys.length > 0) { // if performance is required, you could reduce the number of total results by changing the slice below to not have all ~8000 inputs going - options = filteredKeys.slice(0).map((value) => { + options = filteredKeys.slice(0).map(value => { return { label: value, handler: () => { @@ -108,7 +122,7 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { } ui.revertMode(); return true; - } + }, }; }); } @@ -117,14 +131,12 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { const modalOpts = { options: options, maxOptions: 5, - modalContainer: this.modalContainer + modalContainer: this.modalContainer, }; ui.setOverlayMode(Mode.AUTO_COMPLETE, modalOpts); } - }); - if (super.show(args)) { const config = args[0] as ModalConfig; this.inputs[0].resize(1150, 116); @@ -134,7 +146,7 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { } else { this.inputs[0].text = args[1]; } - this.submitAction = (_) => { + this.submitAction = _ => { if (ui.getMode() === Mode.TEST_DIALOGUE) { this.sanitizeInputs(); const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text))); diff --git a/src/ui/text.ts b/src/ui/text.ts index 069aa8680fc..d3afdef666f 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -1,9 +1,9 @@ import { EggTier } from "#enums/egg-type"; import { UiTheme } from "#enums/ui-theme"; -import Phaser from "phaser"; +import type Phaser from "phaser"; import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; import { ModifierTier } from "../modifier/modifier-tier"; import i18next from "#app/plugins/i18n"; @@ -22,7 +22,8 @@ export enum TextStyle { SUMMARY_GOLD, SUMMARY_GRAY, SUMMARY_GREEN, - MONEY, + MONEY, // Money default styling (pale yellow) + MONEY_WINDOW, // Money displayed in Windows (needs different colors based on theme) STATS_LABEL, STATS_VALUE, SETTINGS_VALUE, @@ -38,21 +39,34 @@ export enum TextStyle { MOVE_PP_EMPTY, SMALLER_WINDOW_ALT, BGM_BAR, - PERFECT_IV + PERFECT_IV, + ME_OPTION_DEFAULT, // Default style for choices in ME + ME_OPTION_SPECIAL, // Style for choices with special requirements in ME + SHADOW_TEXT, // To obscure unavailable options } export interface TextStyleOptions { - scale: number, - styleOptions: Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig, - shadowColor: string, - shadowXpos: number, - shadowYpos: number + scale: number; + styleOptions: Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig; + shadowColor: string; + shadowXpos: number; + shadowYpos: number; } -export function addTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): Phaser.GameObjects.Text { - const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); +export function addTextObject( + x: number, + y: number, + content: string, + style: TextStyle, + extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, +): Phaser.GameObjects.Text { + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions( + style, + globalScene.uiTheme, + extraStyleOptions, + ); - const ret = scene.add.text(x, y, content, styleOptions); + const ret = globalScene.add.text(x, y, content, styleOptions); ret.setScale(scale); ret.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { @@ -66,8 +80,16 @@ export function addTextObject(scene: Phaser.Scene, x: number, y: number, content return ret; } -export function setTextStyle(obj: Phaser.GameObjects.Text, scene: Phaser.Scene, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle) { - const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); +export function setTextStyle( + obj: Phaser.GameObjects.Text, + style: TextStyle, + extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, +) { + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions( + style, + globalScene.uiTheme, + extraStyleOptions, + ); obj.setScale(scale); obj.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { @@ -79,11 +101,21 @@ export function setTextStyle(obj: Phaser.GameObjects.Text, scene: Phaser.Scene, } } -export function addBBCodeTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): BBCodeText { - const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); +export function addBBCodeTextObject( + x: number, + y: number, + content: string, + style: TextStyle, + extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, +): BBCodeText { + const { scale, styleOptions, shadowColor, shadowXpos, shadowYpos } = getTextStyleOptions( + style, + globalScene.uiTheme, + extraStyleOptions, + ); - const ret = new BBCodeText(scene, x, y, content, styleOptions as BBCodeText.TextStyle); - scene.add.existing(ret); + const ret = new BBCodeText(globalScene, x, y, content, styleOptions as BBCodeText.TextStyle); + globalScene.add.existing(ret); ret.setScale(scale); ret.setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as BBCodeText.TextStyle).lineSpacing) { @@ -97,17 +129,28 @@ export function addBBCodeTextObject(scene: Phaser.Scene, x: number, y: number, c return ret; } -export function addTextInputObject(scene: Phaser.Scene, x: number, y: number, width: number, height: number, style: TextStyle, extraStyleOptions?: InputText.IConfig): InputText { - const { scale, styleOptions } = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); +export function addTextInputObject( + x: number, + y: number, + width: number, + height: number, + style: TextStyle, + extraStyleOptions?: InputText.IConfig, +): InputText { + const { scale, styleOptions } = getTextStyleOptions(style, globalScene.uiTheme, extraStyleOptions); - const ret = new InputText(scene, x, y, width, height, styleOptions as InputText.IConfig); - scene.add.existing(ret); + const ret = new InputText(globalScene, x, y, width, height, styleOptions as InputText.IConfig); + globalScene.add.existing(ret); ret.setScale(scale); return ret; } -export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): TextStyleOptions { +export function getTextStyleOptions( + style: TextStyle, + uiTheme: UiTheme, + extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle, +): TextStyleOptions { const lang = i18next.resolvedLanguage; let shadowXpos = 4; let shadowYpos = 5; @@ -119,13 +162,13 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty fontSize: 96, color: getTextColor(style, false, uiTheme), padding: { - bottom: 6 - } + bottom: 6, + }, }; if (i18next.resolvedLanguage === "ja") { scale = 0.1388888889; - styleOptions.padding = { top:2, bottom:4 }; + styleOptions.padding = { top: 2, bottom: 4 }; } switch (style) { @@ -139,10 +182,12 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty case TextStyle.SUMMARY_GREEN: case TextStyle.WINDOW: case TextStyle.WINDOW_ALT: + case TextStyle.ME_OPTION_DEFAULT: + case TextStyle.ME_OPTION_SPECIAL: shadowXpos = 3; shadowYpos = 3; break; - case TextStyle.STATS_LABEL: + case TextStyle.STATS_LABEL: { let fontSizeLabel = "96px"; switch (lang) { case "de": @@ -154,9 +199,10 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty fontSizeLabel = "96px"; break; } - styleOptions.fontSize = fontSizeLabel; + styleOptions.fontSize = fontSizeLabel; break; - case TextStyle.STATS_VALUE: + } + case TextStyle.STATS_VALUE: { shadowXpos = 3; shadowYpos = 3; let fontSizeValue = "96px"; @@ -168,8 +214,9 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty fontSizeValue = "96px"; break; } - styleOptions.fontSize = fontSizeValue; + styleOptions.fontSize = fontSizeValue; break; + } case TextStyle.MESSAGE: case TextStyle.SETTINGS_LABEL: case TextStyle.SETTINGS_LOCKED: @@ -177,6 +224,7 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty break; case TextStyle.BATTLE_INFO: case TextStyle.MONEY: + case TextStyle.MONEY_WINDOW: case TextStyle.TOOLTIP_TITLE: styleOptions.fontSize = defaultFontSize - 24; shadowXpos = 3.5; @@ -213,7 +261,9 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty if (extraStyleOptions) { if (extraStyleOptions.fontSize) { - const sizeRatio = parseInt(extraStyleOptions.fontSize.toString().slice(0, -2)) / parseInt(styleOptions.fontSize?.toString().slice(0, -2) ?? "1"); + const sizeRatio = + Number.parseInt(extraStyleOptions.fontSize.toString().slice(0, -2)) / + Number.parseInt(styleOptions.fontSize?.toString().slice(0, -2) ?? "1"); shadowXpos *= sizeRatio; } styleOptions = Object.assign(styleOptions, extraStyleOptions); @@ -238,22 +288,42 @@ export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: Ui * - "red text" with TextStyle.SUMMARY_RED applied * @param content string with styling that need to be applied for BBCodeTextObject * @param primaryStyle Primary style is required in order to escape BBCode styling properly. - * @param uiTheme + * @param uiTheme the {@linkcode UiTheme} to get TextStyle for + * @param forWindow set to `true` if the text is to be displayed in a window ({@linkcode BattleScene.addWindow}) + * it will replace all instances of the default MONEY TextStyle by {@linkcode TextStyle.MONEY_WINDOW} */ -export function getTextWithColors(content: string, primaryStyle: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { +export function getTextWithColors( + content: string, + primaryStyle: TextStyle, + uiTheme: UiTheme, + forWindow?: boolean, +): string { // Apply primary styling before anything else let text = getBBCodeFrag(content, primaryStyle, uiTheme) + "[/color][/shadow]"; - const primaryStyleString = [ ...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))! ][0]; + const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))!][0]; + + /* For money text displayed in game windows, we can't use the default {@linkcode TextStyle.MONEY} + * or it will look wrong in legacy mode because of the different window background color + * So, for text to be displayed in windows replace all "@[MONEY]" with "@[MONEY_WINDOW]" */ + if (forWindow) { + text = text.replace(/@\[MONEY\]/g, (_substring: string) => "@[MONEY_WINDOW]"); + } // Set custom colors - text = text.replace(/@\[([^{]*)\]{([^}]*)}/gi, (substring, textStyle: string, textToColor: string) => { - return "[/color][/shadow]" + getBBCodeFrag(textToColor, TextStyle[textStyle], uiTheme) + "[/color][/shadow]" + primaryStyleString; + text = text.replace(/@\[([^{]*)\]{([^}]*)}/gi, (_substring, textStyle: string, textToColor: string) => { + return ( + "[/color][/shadow]" + + getBBCodeFrag(textToColor, TextStyle[textStyle], uiTheme) + + "[/color][/shadow]" + + primaryStyleString + ); }); // Remove extra style block at the end return text.replace(/\[color=[^\[]*\]\[shadow=[^\[]*\]\[\/color\]\[\/shadow\]/gi, ""); } +// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: This is a giant switch which is the best option. export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: UiTheme = UiTheme.DEFAULT): string { const isLegacyTheme = uiTheme === UiTheme.LEGACY; switch (textStyle) { @@ -310,7 +380,12 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui return !shadow ? "#f89890" : "#984038"; case TextStyle.SUMMARY_GOLD: case TextStyle.MONEY: - return !shadow ? "#e8e8a8" : "#a0a060"; + return !shadow ? "#e8e8a8" : "#a0a060"; // Pale Yellow/Gold + case TextStyle.MONEY_WINDOW: + if (isLegacyTheme) { + return !shadow ? "#f8b050" : "#c07800"; // Gold + } + return !shadow ? "#e8e8a8" : "#a0a060"; // Pale Yellow/Gold case TextStyle.SETTINGS_LOCKED: case TextStyle.SUMMARY_GRAY: return !shadow ? "#a0a0a0" : "#636363"; @@ -332,10 +407,23 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui return !shadow ? "#484848" : "#d0d0c8"; case TextStyle.BGM_BAR: return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.ME_OPTION_DEFAULT: + return !shadow ? "#f8f8f8" : "#6b5a73"; // White + case TextStyle.ME_OPTION_SPECIAL: + if (isLegacyTheme) { + return !shadow ? "#f8b050" : "#c07800"; // Gold + } + return !shadow ? "#78c850" : "#306850"; // Green + // Leaving the logic in place, in case someone wants to pick an even darker hue for the shadow down the line + case TextStyle.SHADOW_TEXT: + if (isLegacyTheme) { + return !shadow ? "#d0d0c8" : "#d0d0c8"; + } + return !shadow ? "#6b5a73" : "#6b5a73"; } } -export function getModifierTierTextTint(tier: ModifierTier): integer { +export function getModifierTierTextTint(tier: ModifierTier): number { switch (tier) { case ModifierTier.COMMON: return 0xf8f8f8; @@ -352,7 +440,7 @@ export function getModifierTierTextTint(tier: ModifierTier): integer { } } -export function getEggTierTextTint(tier: EggTier): integer { +export function getEggTierTextTint(tier: EggTier): number { switch (tier) { case EggTier.COMMON: return getModifierTierTextTint(ModifierTier.COMMON); diff --git a/src/ui/time-of-day-widget.ts b/src/ui/time-of-day-widget.ts index 66fe5cc9ac3..bda1f750cb1 100644 --- a/src/ui/time-of-day-widget.ts +++ b/src/ui/time-of-day-widget.ts @@ -1,14 +1,11 @@ import * as Utils from "../utils"; -import BattleScene from "#app/battle-scene"; +import { globalScene } from "#app/global-scene"; import { BattleSceneEventType } from "../events/battle-scene"; import { EaseType } from "#enums/ease-type"; import { TimeOfDay } from "#enums/time-of-day"; /** A small self contained UI element that displays the time of day as an icon */ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { - /** An alias for the scene typecast to a {@linkcode BattleScene} */ - private battleScene: BattleScene; - /** The {@linkcode Phaser.GameObjects.Sprite} that represents the foreground of the current time of day */ private readonly timeOfDayIconFgs: Phaser.GameObjects.Sprite[] = new Array(2); /** The {@linkcode Phaser.GameObjects.Sprite} that represents the middle-ground of the current time of day */ @@ -21,9 +18,10 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { /** A map containing all timeOfDayIcon arrays with a matching string key for easier iteration */ private timeOfDayIconPairs: Map = new Map([ - [ "bg", this.timeOfDayIconBgs ], - [ "mg", this.timeOfDayIconMgs ], - [ "fg", this.timeOfDayIconFgs ],]); + ["bg", this.timeOfDayIconBgs], + ["mg", this.timeOfDayIconMgs], + ["fg", this.timeOfDayIconFgs], + ]); /** The current time of day */ private currentTime: TimeOfDay = TimeOfDay.ALL; @@ -40,36 +38,33 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { } /** On set, resumes any paused tweens if true */ public set parentVisible(visible: boolean) { - if (visible && !this._parentVisible) { // Only resume the tweens if parent is newly visible - this.timeOfDayIcons?.forEach( - icon => this.scene.tweens.getTweensOf(icon).forEach( - tween => tween.resume())); + if (visible && !this._parentVisible) { + // Only resume the tweens if parent is newly visible + this.timeOfDayIcons?.forEach(icon => globalScene.tweens.getTweensOf(icon).forEach(tween => tween.resume())); } this._parentVisible = visible; } - constructor(scene: Phaser.Scene, x: number = 0, y: number = 0) { - super(scene, x, y); - this.battleScene = this.scene as BattleScene; + constructor(x = 0, y = 0) { + super(globalScene, x, y); - this.setVisible(this.battleScene.showTimeOfDayWidget); - if (!this.battleScene.showTimeOfDayWidget) { + this.setVisible(globalScene.showTimeOfDayWidget); + if (!globalScene.showTimeOfDayWidget) { return; } // Initialize all sprites - this.timeOfDayIconPairs.forEach( - (icons, key) => { - for (let i = 0; i < icons.length; i++) { - icons[i] = this.scene.add.sprite(0, 0, "dawn_icon_" + key).setOrigin(); - } - }); + this.timeOfDayIconPairs.forEach((icons, key) => { + for (let i = 0; i < icons.length; i++) { + icons[i] = globalScene.add.sprite(0, 0, "dawn_icon_" + key).setOrigin(); + } + }); // Store a flat array of all icons for later - this.timeOfDayIcons = [ this.timeOfDayIconBgs, this.timeOfDayIconMgs, this.timeOfDayIconFgs ].flat(); + this.timeOfDayIcons = [this.timeOfDayIconBgs, this.timeOfDayIconMgs, this.timeOfDayIconFgs].flat(); this.add(this.timeOfDayIcons); - this.battleScene.eventTarget.addEventListener(BattleSceneEventType.ENCOUNTER_PHASE, this.onEncounterPhaseEvent); + globalScene.eventTarget.addEventListener(BattleSceneEventType.ENCOUNTER_PHASE, this.onEncounterPhaseEvent); } /** @@ -78,21 +73,21 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { */ private getBackTween(): Phaser.Types.Tweens.TweenBuilderConfig[] { const rotate = { - targets: [ this.timeOfDayIconMgs[0], this.timeOfDayIconMgs[1] ], + targets: [this.timeOfDayIconMgs[0], this.timeOfDayIconMgs[1]], angle: "+=90", duration: Utils.fixedInt(1500), ease: "Back.easeOut", paused: !this.parentVisible, }; const fade = { - targets: [ this.timeOfDayIconBgs[1], this.timeOfDayIconMgs[1], this.timeOfDayIconFgs[1] ], + targets: [this.timeOfDayIconBgs[1], this.timeOfDayIconMgs[1], this.timeOfDayIconFgs[1]], alpha: 0, duration: Utils.fixedInt(500), ease: "Linear", paused: !this.parentVisible, }; - return [ rotate, fade ]; + return [rotate, fade]; } /** @@ -101,21 +96,21 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { */ private getBounceTween(): Phaser.Types.Tweens.TweenBuilderConfig[] { const bounce = { - targets: [ this.timeOfDayIconMgs[0], this.timeOfDayIconMgs[1] ], + targets: [this.timeOfDayIconMgs[0], this.timeOfDayIconMgs[1]], angle: "+=90", duration: Utils.fixedInt(2000), ease: "Bounce.easeOut", paused: !this.parentVisible, }; const fade = { - targets: [ this.timeOfDayIconBgs[1], this.timeOfDayIconMgs[1], this.timeOfDayIconFgs[1] ], + targets: [this.timeOfDayIconBgs[1], this.timeOfDayIconMgs[1], this.timeOfDayIconFgs[1]], alpha: 0, duration: Utils.fixedInt(800), ease: "Linear", paused: !this.parentVisible, }; - return [ bounce, fade ]; + return [bounce, fade]; } /** Resets all icons to the proper depth, texture, and alpha so they are ready to tween */ @@ -124,11 +119,10 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { this.moveBelow(this.timeOfDayIconMgs[0], this.timeOfDayIconBgs[1]); this.moveBelow(this.timeOfDayIconFgs[0], this.timeOfDayIconFgs[1]); - this.timeOfDayIconPairs.forEach( - (icons, key) => { - icons[0].setTexture(TimeOfDay[this.currentTime].toLowerCase() + "_icon_" + key); - icons[1].setTexture(TimeOfDay[this.previousTime].toLowerCase() + "_icon_" + key); - }); + this.timeOfDayIconPairs.forEach((icons, key) => { + icons[0].setTexture(TimeOfDay[this.currentTime].toLowerCase() + "_icon_" + key); + icons[1].setTexture(TimeOfDay[this.previousTime].toLowerCase() + "_icon_" + key); + }); this.timeOfDayIconMgs[0].setRotation(-90 * (3.14 / 180)); this.timeOfDayIcons.forEach(icon => icon.setAlpha(1)); @@ -136,29 +130,29 @@ export default class TimeOfDayWidget extends Phaser.GameObjects.Container { /** Adds the proper tween for all icons */ private tweenTimeOfDayIcon() { - this.scene.tweens.killTweensOf(this.timeOfDayIcons); + globalScene.tweens.killTweensOf(this.timeOfDayIcons); this.resetIcons(); // Tween based on the player setting - (this.battleScene.timeOfDayAnimation === EaseType.BACK ? this.getBackTween() : this.getBounceTween()) - .forEach(tween => this.scene.tweens.add(tween)); + (globalScene.timeOfDayAnimation === EaseType.BACK ? this.getBackTween() : this.getBounceTween()).forEach(tween => + globalScene.tweens.add(tween), + ); // Swaps all elements of the icon arrays by shifting the first element onto the end of the array // This ensures index[0] is always the new time of day icon and index[1] is always the current one - this.timeOfDayIconPairs.forEach( - icons => { - const shifted = icons.shift(); - shifted && icons.push(shifted); - }); + this.timeOfDayIconPairs.forEach(icons => { + const shifted = icons.shift(); + shifted && icons.push(shifted); + }); } /** * Grabs the current time of day from the arena and calls {@linkcode tweenTimeOfDayIcon} - * @param event {@linkcode Event} being sent + * @param _event {@linkcode Event} being sent */ - private onEncounterPhase(event: Event) { - const newTime = this.battleScene.arena.getTimeOfDay(); + private onEncounterPhase(_event: Event) { + const newTime = globalScene.arena.getTimeOfDay(); if (this.currentTime === newTime) { return; diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index f7972af2cc2..2f797bb4bfb 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -1,12 +1,13 @@ -import BattleScene from "../battle-scene"; import OptionSelectUiHandler from "./settings/option-select-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; -import { TextStyle, addTextObject, getTextStyleOptions } from "./text"; +import { TextStyle, addTextObject } from "./text"; import { getSplashMessages } from "../data/splash-messages"; import i18next from "i18next"; import { TimedEventDisplay } from "#app/timed-event-manager"; import { version } from "../../package.json"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import { globalScene } from "#app/global-scene"; export default class TitleUiHandler extends OptionSelectUiHandler { /** If the stats can not be retrieved, use this fallback value */ @@ -21,8 +22,8 @@ export default class TitleUiHandler extends OptionSelectUiHandler { private titleStatsTimer: NodeJS.Timeout | null; - constructor(scene: BattleScene, mode: Mode = Mode.TITLE) { - super(scene, mode); + constructor(mode: Mode = Mode.TITLE) { + super(mode); } setup() { @@ -30,40 +31,42 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); - this.titleContainer = this.scene.add.container(0, -(this.scene.game.canvas.height / 6)); + this.titleContainer = globalScene.add.container(0, -(globalScene.game.canvas.height / 6)); this.titleContainer.setName("title"); this.titleContainer.setAlpha(0); ui.add(this.titleContainer); - const logo = this.scene.add.image((this.scene.game.canvas.width / 6) / 2, 8, "logo"); + const logo = globalScene.add.image(globalScene.game.canvas.width / 6 / 2, 8, "logo"); logo.setOrigin(0.5, 0); this.titleContainer.add(logo); - if (this.scene.eventManager.isEventActive()) { - this.eventDisplay = new TimedEventDisplay(this.scene, 0, 0, this.scene.eventManager.activeEvent()); + if (globalScene.eventManager.isEventActive()) { + this.eventDisplay = new TimedEventDisplay(0, 0, globalScene.eventManager.activeEvent()); this.eventDisplay.setup(); this.titleContainer.add(this.eventDisplay); } this.playerCountLabel = addTextObject( - this.scene, - (this.scene.game.canvas.width / 6) - 2, - (this.scene.game.canvas.height / 6) - 13 - 576 * getTextStyleOptions(TextStyle.WINDOW, this.scene.uiTheme).scale, + // Actual y position will be determined after the title menu has been populated with options + globalScene.game.canvas.width / 6 - 2, + 0, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, - { fontSize: "54px" } + { fontSize: "54px" }, ); this.playerCountLabel.setOrigin(1, 0); this.titleContainer.add(this.playerCountLabel); - this.splashMessageText = addTextObject(this.scene, logo.x + 64, logo.y + logo.displayHeight - 8, "", TextStyle.MONEY, { fontSize: "54px" }); + this.splashMessageText = addTextObject(logo.x + 64, logo.y + logo.displayHeight - 8, "", TextStyle.MONEY, { + fontSize: "54px", + }); this.splashMessageText.setOrigin(0.5, 0.5); this.splashMessageText.setAngle(-20); this.titleContainer.add(this.splashMessageText); const originalSplashMessageScale = this.splashMessageText.scale; - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.splashMessageText, duration: Utils.fixedInt(350), scale: originalSplashMessageScale * 1.25, @@ -71,19 +74,23 @@ export default class TitleUiHandler extends OptionSelectUiHandler { yoyo: true, }); - this.appVersionText = addTextObject(this.scene, logo.x - 60, logo.y + logo.displayHeight + 4, "", TextStyle.MONEY, { fontSize: "54px" }); + this.appVersionText = addTextObject(logo.x - 60, logo.y + logo.displayHeight + 4, "", TextStyle.MONEY, { + fontSize: "54px", + }); this.appVersionText.setOrigin(0.5, 0.5); this.appVersionText.setAngle(0); this.titleContainer.add(this.appVersionText); } updateTitleStats(): void { - Utils.apiFetch("game/titlestats") - .then(request => request.json()) + pokerogueApi + .getGameTitleStats() .then(stats => { - this.playerCountLabel.setText(`${stats.playerCount} ${i18next.t("menu:playersOnline")}`); - if (this.splashMessage === "splashMessages:battlesWon") { - this.splashMessageText.setText(i18next.t(this.splashMessage, { count: stats.battleCount })); + if (stats) { + this.playerCountLabel.setText(`${stats.playerCount} ${i18next.t("menu:playersOnline")}`); + if (this.splashMessage === "splashMessages:battlesWon") { + this.splashMessageText.setText(i18next.t(this.splashMessage, { count: stats.battleCount })); + } } }) .catch(err => { @@ -95,14 +102,22 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ret = super.show(args); if (ret) { + // Moving player count to top of the menu + this.playerCountLabel.setY(globalScene.game.canvas.height / 6 - 13 - this.getWindowHeight()); + this.splashMessage = Utils.randItem(getSplashMessages()); - this.splashMessageText.setText(i18next.t(this.splashMessage, { count: TitleUiHandler.BATTLES_WON_FALLBACK })); + this.splashMessageText.setText( + i18next.t(this.splashMessage, { + count: TitleUiHandler.BATTLES_WON_FALLBACK, + }), + ); this.appVersionText.setText("v" + version); const ui = this.getUi(); - if (this.scene.eventManager.isEventActive()) { + if (globalScene.eventManager.isEventActive()) { + this.eventDisplay.setWidth(globalScene.scaledCanvas.width - this.optionSelectBg.width - this.optionSelectBg.x); this.eventDisplay.show(); } @@ -112,11 +127,11 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.updateTitleStats(); }, 60000); - this.scene.tweens.add({ - targets: [ this.titleContainer, ui.getMessageHandler().bg ], + globalScene.tweens.add({ + targets: [this.titleContainer, ui.getMessageHandler().bg], duration: Utils.fixedInt(325), - alpha: (target: any) => target === this.titleContainer ? 1 : 0, - ease: "Sine.easeInOut" + alpha: (target: any) => (target === this.titleContainer ? 1 : 0), + ease: "Sine.easeInOut", }); } @@ -133,11 +148,11 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.titleStatsTimer && clearInterval(this.titleStatsTimer); this.titleStatsTimer = null; - this.scene.tweens.add({ - targets: [ this.titleContainer, ui.getMessageHandler().bg ], + globalScene.tweens.add({ + targets: [this.titleContainer, ui.getMessageHandler().bg], duration: Utils.fixedInt(325), - alpha: (target: any) => target === this.titleContainer ? 0 : 1, - ease: "Sine.easeInOut" + alpha: (target: any) => (target === this.titleContainer ? 0 : 1), + ease: "Sine.easeInOut", }); } } diff --git a/src/ui/ui-handler.ts b/src/ui/ui-handler.ts index bb7b1e038db..433f85d0f92 100644 --- a/src/ui/ui-handler.ts +++ b/src/ui/ui-handler.ts @@ -1,23 +1,21 @@ -import BattleScene from "../battle-scene"; -import { TextStyle, getTextColor } from "./text"; -import { Mode } from "./ui"; -import { Button } from "#enums/buttons"; +import { globalScene } from "#app/global-scene"; +import type { TextStyle } from "./text"; +import { getTextColor } from "./text"; +import type { Mode } from "./ui"; +import type { Button } from "#enums/buttons"; /** * A basic abstract class to act as a holder and processor for UI elements. */ export default abstract class UiHandler { - protected scene: BattleScene; - protected mode: integer | null; - protected cursor: integer = 0; - public active: boolean = false; + protected mode: number | null; + protected cursor = 0; + public active = false; /** - * @param {BattleScene} scene The same scene as everything else. - * @param {Mode} mode The mode of the UI element. These should be unique. + * @param mode The mode of the UI element. These should be unique. */ - constructor(scene: BattleScene, mode: Mode | null = null) { - this.scene = scene; + constructor(mode: Mode | null = null) { this.mode = mode; } @@ -32,18 +30,18 @@ export default abstract class UiHandler { abstract processInput(button: Button): boolean; getUi() { - return this.scene.ui; + return globalScene.ui; } - getTextColor(style: TextStyle, shadow: boolean = false): string { - return getTextColor(style, shadow, this.scene.uiTheme); + getTextColor(style: TextStyle, shadow = false): string { + return getTextColor(style, shadow, globalScene.uiTheme); } - getCursor(): integer { + getCursor(): number { return this.cursor; } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const changed = this.cursor !== cursor; if (changed) { this.cursor = cursor; @@ -58,10 +56,15 @@ export default abstract class UiHandler { * @param cursorStyle cursor style to apply */ protected setMouseCursorStyle(cursorStyle: "pointer" | "default") { - this.scene.input.manager.canvas.style.cursor = cursorStyle; + globalScene.input.manager.canvas.style.cursor = cursorStyle; } clear() { this.active = false; } + /** + * To be implemented by individual handlers when necessary to free memory + * Called when {@linkcode BattleScene} is reset + */ + destroy(): void {} } diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index 89c56384bd0..c3931aea23b 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -1,11 +1,11 @@ import { UiTheme } from "#enums/ui-theme"; import { legacyCompatibleImages } from "#app/scene-base"; -import BattleScene from "../battle-scene"; +import { globalScene } from "#app/global-scene"; export enum WindowVariant { NORMAL, THIN, - XTHIN + XTHIN, } export function getWindowVariantSuffix(windowVariant: WindowVariant): string { @@ -21,29 +21,50 @@ export function getWindowVariantSuffix(windowVariant: WindowVariant): string { const windowTypeControlColors = { [UiTheme.DEFAULT]: { - 0: [ "#6b5a73", "#DD5748", "#7E4955" ], - 1: [ "#6b5a73", "#48DDAA", "#4D7574" ], - 2: [ "#6b5a73", "#C5C5C5", "#766D7E" ], - 3: [ "#6b5a73", "#EBC07C", "#836C66" ], - 4: [ "#686868", "#E8E8E8", "#919191" ] + 0: ["#6b5a73", "#DD5748", "#7E4955"], + 1: ["#6b5a73", "#48DDAA", "#4D7574"], + 2: ["#6b5a73", "#C5C5C5", "#766D7E"], + 3: ["#6b5a73", "#EBC07C", "#836C66"], + 4: ["#686868", "#E8E8E8", "#919191"], }, [UiTheme.LEGACY]: { - 0: [ "#706880", "#8888c8", "#484868" ], - 1: [ "#d04028", "#e0a028", "#902008" ], - 2: [ "#48b840", "#88d880", "#089040" ], - 3: [ "#2068d0", "#80b0e0", "#104888" ], - 4: [ "#706880", "#8888c8", "#484868" ] - } + 0: ["#706880", "#8888c8", "#484868"], + 1: ["#d04028", "#e0a028", "#902008"], + 2: ["#48b840", "#88d880", "#089040"], + 3: ["#2068d0", "#80b0e0", "#104888"], + 4: ["#706880", "#8888c8", "#484868"], + }, }; -export function addWindow(scene: BattleScene, x: number, y: number, width: number, height: number, mergeMaskTop?: boolean, mergeMaskLeft?: boolean, maskOffsetX?: number, maskOffsetY?: number, windowVariant?: WindowVariant): Phaser.GameObjects.NineSlice { +export function addWindow( + x: number, + y: number, + width: number, + height: number, + mergeMaskTop?: boolean, + mergeMaskLeft?: boolean, + maskOffsetX?: number, + maskOffsetY?: number, + windowVariant?: WindowVariant, +): Phaser.GameObjects.NineSlice { if (windowVariant === undefined) { windowVariant = WindowVariant.NORMAL; } - const borderSize = scene.uiTheme ? 6 : 8; + const borderSize = globalScene.uiTheme ? 6 : 8; - const window = scene.add.nineslice(x, y, `window_${scene.windowType}${getWindowVariantSuffix(windowVariant)}`, undefined, width, height, borderSize, borderSize, borderSize, borderSize); + const window = globalScene.add.nineslice( + x, + y, + `window_${globalScene.windowType}${getWindowVariantSuffix(windowVariant)}`, + undefined, + width, + height, + borderSize, + borderSize, + borderSize, + borderSize, + ); window.setOrigin(0, 0); if (mergeMaskLeft || mergeMaskTop || maskOffsetX || maskOffsetY) { @@ -54,12 +75,12 @@ export function addWindow(scene: BattleScene, x: number, y: number, width: numbe * height: bottom */ const maskRect = new Phaser.GameObjects.Rectangle( - scene, - 6 * (x - (mergeMaskLeft ? 2 : 0) - (maskOffsetX || 0)), + globalScene, + 6 * (x - (mergeMaskLeft ? 2 : 0) - (maskOffsetX || 0)), 6 * (y + (mergeMaskTop ? 2 : 0) + (maskOffsetY || 0)), width - (mergeMaskLeft ? 2 : 0), height - (mergeMaskTop ? 2 : 0), - 0xffffff + 0xffffff, ); maskRect.setOrigin(0); maskRect.setScale(6); @@ -70,7 +91,7 @@ export function addWindow(scene: BattleScene, x: number, y: number, width: numbe return window; } -export function updateWindowType(scene: BattleScene, windowTypeIndex: integer): void { +export function updateWindowType(windowTypeIndex: number): void { const windowObjects: [Phaser.GameObjects.NineSlice, WindowVariant][] = []; const themedObjects: (Phaser.GameObjects.Image | Phaser.GameObjects.NineSlice)[] = []; const traverse = (object: any) => { @@ -85,7 +106,14 @@ export function updateWindowType(scene: BattleScene, windowTypeIndex: integer): } } else if (object instanceof Phaser.GameObjects.NineSlice) { if (object.texture.key.startsWith("window_")) { - windowObjects.push([ object, object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.XTHIN)) ? WindowVariant.XTHIN : object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.THIN)) ? WindowVariant.THIN : WindowVariant.NORMAL ]); + windowObjects.push([ + object, + object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.XTHIN)) + ? WindowVariant.XTHIN + : object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.THIN)) + ? WindowVariant.THIN + : WindowVariant.NORMAL, + ]); } else if (object.texture?.key === "namebox") { themedObjects.push(object); } @@ -96,16 +124,18 @@ export function updateWindowType(scene: BattleScene, windowTypeIndex: integer): } }; - traverse(scene); + traverse(globalScene); - scene.windowType = windowTypeIndex; + globalScene.windowType = windowTypeIndex; const rootStyle = document.documentElement.style; - [ "base", "light", "dark" ].map((k, i) => rootStyle.setProperty(`--color-${k}`, windowTypeControlColors[scene.uiTheme][windowTypeIndex - 1][i])); + ["base", "light", "dark"].map((k, i) => + rootStyle.setProperty(`--color-${k}`, windowTypeControlColors[globalScene.uiTheme][windowTypeIndex - 1][i]), + ); const windowKey = `window_${windowTypeIndex}`; - for (const [ window, variant ] of windowObjects) { + for (const [window, variant] of windowObjects) { window.setTexture(`${windowKey}${getWindowVariantSuffix(variant)}`); } @@ -114,56 +144,93 @@ export function updateWindowType(scene: BattleScene, windowTypeIndex: integer): } } -export function addUiThemeOverrides(scene: BattleScene): void { - const originalAddImage = scene.add.image; - scene.add.image = function (x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Image { +export function addUiThemeOverrides(): void { + const originalAddImage = globalScene.add.image; + globalScene.add.image = function ( + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + ): Phaser.GameObjects.Image { let legacy = false; - if (typeof texture === "string" && scene.uiTheme && legacyCompatibleImages.includes(texture)) { + if (typeof texture === "string" && globalScene.uiTheme && legacyCompatibleImages.includes(texture)) { legacy = true; texture += "_legacy"; } - const ret: Phaser.GameObjects.Image = originalAddImage.apply(this, [ x, y, texture, frame ]); + const ret: Phaser.GameObjects.Image = originalAddImage.apply(this, [x, y, texture, frame]); if (legacy) { const originalSetTexture = ret.setTexture; ret.setTexture = function (key: string, frame?: string | number) { key += "_legacy"; - return originalSetTexture.apply(this, [ key, frame ]); + return originalSetTexture.apply(this, [key, frame]); }; } return ret; }; - const originalAddSprite = scene.add.sprite; - scene.add.sprite = function (x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Sprite { + const originalAddSprite = globalScene.add.sprite; + globalScene.add.sprite = function ( + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + ): Phaser.GameObjects.Sprite { let legacy = false; - if (typeof texture === "string" && scene.uiTheme && legacyCompatibleImages.includes(texture)) { + if (typeof texture === "string" && globalScene.uiTheme && legacyCompatibleImages.includes(texture)) { legacy = true; texture += "_legacy"; } - const ret: Phaser.GameObjects.Sprite = originalAddSprite.apply(this, [ x, y, texture, frame ]); + const ret: Phaser.GameObjects.Sprite = originalAddSprite.apply(this, [x, y, texture, frame]); if (legacy) { const originalSetTexture = ret.setTexture; ret.setTexture = function (key: string, frame?: string | number) { key += "_legacy"; - return originalSetTexture.apply(this, [ key, frame ]); + return originalSetTexture.apply(this, [key, frame]); }; } return ret; }; - const originalAddNineslice = scene.add.nineslice; - scene.add.nineslice = function (x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, leftWidth?: number, rightWidth?: number, topHeight?: number, bottomHeight?: number): Phaser.GameObjects.NineSlice { + const originalAddNineslice = globalScene.add.nineslice; + globalScene.add.nineslice = function ( + x: number, + y: number, + texture: string | Phaser.Textures.Texture, + frame?: string | number, + width?: number, + height?: number, + leftWidth?: number, + rightWidth?: number, + topHeight?: number, + bottomHeight?: number, + ): Phaser.GameObjects.NineSlice { let legacy = false; - if (typeof texture === "string" && scene.uiTheme && legacyCompatibleImages.includes(texture)) { + if (typeof texture === "string" && globalScene.uiTheme && legacyCompatibleImages.includes(texture)) { legacy = true; texture += "_legacy"; } - const ret: Phaser.GameObjects.NineSlice = originalAddNineslice.apply(this, [ x, y, texture, frame, width, height, leftWidth, rightWidth, topHeight, bottomHeight ]); + const ret: Phaser.GameObjects.NineSlice = originalAddNineslice.apply(this, [ + x, + y, + texture, + frame, + width, + height, + leftWidth, + rightWidth, + topHeight, + bottomHeight, + ]); if (legacy) { const originalSetTexture = ret.setTexture; - ret.setTexture = function (key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean) { + ret.setTexture = function ( + key: string | Phaser.Textures.Texture, + frame?: string | number, + updateSize?: boolean, + updateOrigin?: boolean, + ) { key += "_legacy"; - return originalSetTexture.apply(this, [ key, frame, updateSize, updateOrigin ]); + return originalSetTexture.apply(this, [key, frame, updateSize, updateOrigin]); }; } return ret; diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 63cd48ab1cd..7c202e9210d 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -1,5 +1,5 @@ -import { default as BattleScene } from "../battle-scene"; -import UiHandler from "./ui-handler"; +import { globalScene } from "#app/global-scene"; +import type UiHandler from "./ui-handler"; import BattleMessageUiHandler from "./battle-message-ui-handler"; import CommandUiHandler from "./command-ui-handler"; import PartyUiHandler from "./party-ui-handler"; @@ -23,6 +23,7 @@ import OptionSelectUiHandler from "./settings/option-select-ui-handler"; import EggHatchSceneHandler from "./egg-hatch-scene-handler"; import EggListUiHandler from "./egg-list-ui-handler"; import EggGachaUiHandler from "./egg-gacha-ui-handler"; +import PokedexUiHandler from "./pokedex-ui-handler"; import { addWindow } from "./ui-theme"; import LoginFormUiHandler from "./login-form-ui-handler"; import RegistrationFormUiHandler from "./registration-form-ui-handler"; @@ -35,7 +36,7 @@ import TitleUiHandler from "./title-ui-handler"; import SavingIconHandler from "./saving-icon-handler"; import UnavailableModalUiHandler from "./unavailable-modal-ui-handler"; import SessionReloadModalUiHandler from "./session-reload-modal-ui-handler"; -import { Button } from "#enums/buttons"; +import type { Button } from "#enums/buttons"; import i18next from "i18next"; import GamepadBindingUiHandler from "./settings/gamepad-binding-ui-handler"; import SettingsKeyboardUiHandler from "#app/ui/settings/settings-keyboard-ui-handler"; @@ -43,7 +44,7 @@ import KeyboardBindingUiHandler from "#app/ui/settings/keyboard-binding-ui-handl import SettingsDisplayUiHandler from "./settings/settings-display-ui-handler"; import SettingsAudioUiHandler from "./settings/settings-audio-ui-handler"; import { PlayerGender } from "#enums/player-gender"; -import BgmBar from "#app/ui/bgm-bar"; +import type BgmBar from "#app/ui/bgm-bar"; import RenameFormUiHandler from "./rename-form-ui-handler"; import AdminUiHandler from "./admin-ui-handler"; import RunHistoryUiHandler from "./run-history-ui-handler"; @@ -53,6 +54,9 @@ import TestDialogueUiHandler from "#app/ui/test-dialogue-ui-handler"; import AutoCompleteUiHandler from "./autocomplete-ui-handler"; import { Device } from "#enums/devices"; import MysteryEncounterUiHandler from "./mystery-encounter-ui-handler"; +import PokedexScanUiHandler from "./pokedex-scan-ui-handler"; +import PokedexPageUiHandler from "./pokedex-page-ui-handler"; +import { NavigationManager } from "./settings/navigationMenu"; export enum Mode { MESSAGE, @@ -84,6 +88,9 @@ export enum Mode { GAME_STATS, EGG_LIST, EGG_GACHA, + POKEDEX, + POKEDEX_SCAN, + POKEDEX_PAGE, LOGIN_FORM, REGISTRATION_FORM, LOADING, @@ -96,7 +103,7 @@ export enum Mode { TEST_DIALOGUE, AUTO_COMPLETE, ADMIN, - MYSTERY_ENCOUNTER + MYSTERY_ENCOUNTER, } const transitionModes = [ @@ -108,6 +115,8 @@ const transitionModes = [ Mode.EGG_HATCH_SCENE, Mode.EGG_LIST, Mode.EGG_GACHA, + Mode.POKEDEX, + Mode.POKEDEX_PAGE, Mode.CHALLENGE_SELECT, Mode.RUN_HISTORY, ]; @@ -127,6 +136,7 @@ const noTransitionModes = [ Mode.SETTINGS_KEYBOARD, Mode.ACHIEVEMENTS, Mode.GAME_STATS, + Mode.POKEDEX_SCAN, Mode.LOGIN_FORM, Mode.REGISTRATION_FORM, Mode.LOADING, @@ -137,7 +147,7 @@ const noTransitionModes = [ Mode.AUTO_COMPLETE, Mode.ADMIN, Mode.MYSTERY_ENCOUNTER, - Mode.RUN_INFO + Mode.RUN_INFO, ]; export default class UI extends Phaser.GameObjects.Container { @@ -156,55 +166,58 @@ export default class UI extends Phaser.GameObjects.Container { private overlayActive: boolean; - constructor(scene: BattleScene) { - super(scene, 0, scene.game.canvas.height / 6); + constructor() { + super(globalScene, 0, globalScene.game.canvas.height / 6); this.mode = Mode.MESSAGE; this.modeChain = []; this.handlers = [ - new BattleMessageUiHandler(scene), - new TitleUiHandler(scene), - new CommandUiHandler(scene), - new FightUiHandler(scene), - new BallUiHandler(scene), - new TargetSelectUiHandler(scene), - new ModifierSelectUiHandler(scene), - new SaveSlotSelectUiHandler(scene), - new PartyUiHandler(scene), - new SummaryUiHandler(scene), - new StarterSelectUiHandler(scene), - new EvolutionSceneHandler(scene), - new EggHatchSceneHandler(scene), - new EggSummaryUiHandler(scene), - new ConfirmUiHandler(scene), - new OptionSelectUiHandler(scene), - new MenuUiHandler(scene), - new OptionSelectUiHandler(scene, Mode.MENU_OPTION_SELECT), + new BattleMessageUiHandler(), + new TitleUiHandler(), + new CommandUiHandler(), + new FightUiHandler(), + new BallUiHandler(), + new TargetSelectUiHandler(), + new ModifierSelectUiHandler(), + new SaveSlotSelectUiHandler(), + new PartyUiHandler(), + new SummaryUiHandler(), + new StarterSelectUiHandler(), + new EvolutionSceneHandler(), + new EggHatchSceneHandler(), + new EggSummaryUiHandler(), + new ConfirmUiHandler(), + new OptionSelectUiHandler(), + new MenuUiHandler(), + new OptionSelectUiHandler(Mode.MENU_OPTION_SELECT), // settings - new SettingsUiHandler(scene), - new SettingsDisplayUiHandler(scene), - new SettingsAudioUiHandler(scene), - new SettingsGamepadUiHandler(scene), - new GamepadBindingUiHandler(scene), - new SettingsKeyboardUiHandler(scene), - new KeyboardBindingUiHandler(scene), - new AchvsUiHandler(scene), - new GameStatsUiHandler(scene), - new EggListUiHandler(scene), - new EggGachaUiHandler(scene), - new LoginFormUiHandler(scene), - new RegistrationFormUiHandler(scene), - new LoadingModalUiHandler(scene), - new SessionReloadModalUiHandler(scene), - new UnavailableModalUiHandler(scene), - new GameChallengesUiHandler(scene), - new RenameFormUiHandler(scene), - new RunHistoryUiHandler(scene), - new RunInfoUiHandler(scene), - new TestDialogueUiHandler(scene, Mode.TEST_DIALOGUE), - new AutoCompleteUiHandler(scene), - new AdminUiHandler(scene), - new MysteryEncounterUiHandler(scene), + new SettingsUiHandler(), + new SettingsDisplayUiHandler(), + new SettingsAudioUiHandler(), + new SettingsGamepadUiHandler(), + new GamepadBindingUiHandler(), + new SettingsKeyboardUiHandler(), + new KeyboardBindingUiHandler(), + new AchvsUiHandler(), + new GameStatsUiHandler(), + new EggListUiHandler(), + new EggGachaUiHandler(), + new PokedexUiHandler(), + new PokedexScanUiHandler(Mode.TEST_DIALOGUE), + new PokedexPageUiHandler(), + new LoginFormUiHandler(), + new RegistrationFormUiHandler(), + new LoadingModalUiHandler(), + new SessionReloadModalUiHandler(), + new UnavailableModalUiHandler(), + new GameChallengesUiHandler(), + new RenameFormUiHandler(), + new RunHistoryUiHandler(), + new RunInfoUiHandler(), + new TestDialogueUiHandler(Mode.TEST_DIALOGUE), + new AutoCompleteUiHandler(), + new AdminUiHandler(), + new MysteryEncounterUiHandler(), ]; } @@ -213,38 +226,44 @@ export default class UI extends Phaser.GameObjects.Container { for (const handler of this.handlers) { handler.setup(); } - this.overlay = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0); + this.overlay = globalScene.add.rectangle( + 0, + 0, + globalScene.game.canvas.width / 6, + globalScene.game.canvas.height / 6, + 0, + ); this.overlay.setName("rect-ui-overlay"); this.overlay.setOrigin(0, 0); - (this.scene as BattleScene).uiContainer.add(this.overlay); + globalScene.uiContainer.add(this.overlay); this.overlay.setVisible(false); this.setupTooltip(); - this.achvBar = new AchvBar(this.scene as BattleScene); + this.achvBar = new AchvBar(); this.achvBar.setup(); - (this.scene as BattleScene).uiContainer.add(this.achvBar); + globalScene.uiContainer.add(this.achvBar); - this.savingIcon = new SavingIconHandler(this.scene as BattleScene); + this.savingIcon = new SavingIconHandler(); this.savingIcon.setup(); - (this.scene as BattleScene).uiContainer.add(this.savingIcon); + globalScene.uiContainer.add(this.savingIcon); } private setupTooltip() { - this.tooltipContainer = this.scene.add.container(0, 0); + this.tooltipContainer = globalScene.add.container(0, 0); this.tooltipContainer.setName("tooltip"); this.tooltipContainer.setVisible(false); - this.tooltipBg = addWindow(this.scene as BattleScene, 0, 0, 128, 31); + this.tooltipBg = addWindow(0, 0, 128, 31); this.tooltipBg.setName("window-tooltip-bg"); this.tooltipBg.setOrigin(0, 0); - this.tooltipTitle = addTextObject(this.scene, 64, 4, "", TextStyle.TOOLTIP_TITLE); + this.tooltipTitle = addTextObject(64, 4, "", TextStyle.TOOLTIP_TITLE); this.tooltipTitle.setName("text-tooltip-title"); this.tooltipTitle.setOrigin(0.5, 0); - this.tooltipContent = addTextObject(this.scene, 6, 16, "", TextStyle.TOOLTIP_CONTENT); + this.tooltipContent = addTextObject(6, 16, "", TextStyle.TOOLTIP_CONTENT); this.tooltipContent.setName("text-tooltip-content"); this.tooltipContent.setWordWrapWidth(850); @@ -252,7 +271,7 @@ export default class UI extends Phaser.GameObjects.Container { this.tooltipContainer.add(this.tooltipTitle); this.tooltipContainer.add(this.tooltipContent); - (this.scene as BattleScene).uiContainer.add(this.tooltipContainer); + globalScene.uiContainer.add(this.tooltipContainer); } getHandler(): H { @@ -268,15 +287,19 @@ export default class UI extends Phaser.GameObjects.Container { return false; } - const battleScene = this.scene as BattleScene; - if ([ Mode.CONFIRM, Mode.COMMAND, Mode.FIGHT, Mode.MESSAGE ].includes(this.mode)) { - battleScene?.processInfoButton(pressed); + if ([Mode.CONFIRM, Mode.COMMAND, Mode.FIGHT, Mode.MESSAGE, Mode.TARGET_SELECT].includes(this.mode)) { + globalScene?.processInfoButton(pressed); return true; } - battleScene?.processInfoButton(false); + globalScene?.processInfoButton(false); return true; } + /** + * Process a player input of a button (delivering it to the current UI handler for processing) + * @param button The {@linkcode Button} being inputted + * @returns true if the input attempt succeeds + */ processInput(button: Button): boolean { if (this.overlayActive) { return false; @@ -291,15 +314,23 @@ export default class UI extends Phaser.GameObjects.Container { return handler.processInput(button); } - showTextPromise(text: string, callbackDelay: number = 0, prompt: boolean = true, promptDelay?: integer | null): Promise { + showTextPromise(text: string, callbackDelay = 0, prompt = true, promptDelay?: number | null): Promise { return new Promise(resolve => { this.showText(text ?? "", null, () => resolve(), callbackDelay, prompt, promptDelay); }); } - showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null): void { + showText( + text: string, + delay?: number | null, + callback?: Function | null, + callbackDelay?: number | null, + prompt?: boolean | null, + promptDelay?: number | null, + ): void { if (prompt && text.indexOf("$") > -1) { const messagePages = text.split(/\$/g).map(m => m.trim()); + // biome-ignore lint/complexity/useOptionalChain: optional chain would change this to be null instead of undefined. let showMessageAndCallback = () => callback && callback(); for (let p = messagePages.length - 1; p >= 0; p--) { const originalFunc = showMessageAndCallback; @@ -313,19 +344,24 @@ export default class UI extends Phaser.GameObjects.Container { } else { this.getMessageHandler().showText(text, delay, callback, callbackDelay, prompt, promptDelay); } - } } - showDialogue(keyOrText: string, name: string | undefined, delay: integer | null = 0, callback: Function, callbackDelay?: integer, promptDelay?: integer): void { - const battleScene = this.scene as BattleScene; + showDialogue( + keyOrText: string, + name: string | undefined, + delay: number | null = 0, + callback: Function, + callbackDelay?: number, + promptDelay?: number, + ): void { // Get localized dialogue (if available) let hasi18n = false; let text = keyOrText; - const genderIndex = battleScene.gameData.gender ?? PlayerGender.UNSET; + const genderIndex = globalScene.gameData.gender ?? PlayerGender.UNSET; const genderStr = PlayerGender[genderIndex].toLowerCase(); - if (i18next.exists(keyOrText) ) { + if (i18next.exists(keyOrText)) { const i18nKey = keyOrText; hasi18n = true; @@ -339,7 +375,7 @@ export default class UI extends Phaser.GameObjects.Container { } } let showMessageAndCallback = () => { - hasi18n && battleScene.gameData.saveSeenDialogue(keyOrText); + hasi18n && globalScene.gameData.saveSeenDialogue(keyOrText); callback(); }; if (text.indexOf("$") > -1) { @@ -352,18 +388,32 @@ export default class UI extends Phaser.GameObjects.Container { } else { const handler = this.getHandler(); if (handler instanceof MessageUiHandler) { - (handler as MessageUiHandler).showDialogue(text, name, delay, showMessageAndCallback, callbackDelay, true, promptDelay); + (handler as MessageUiHandler).showDialogue( + text, + name, + delay, + showMessageAndCallback, + callbackDelay, + true, + promptDelay, + ); } else { - this.getMessageHandler().showDialogue(text, name, delay, showMessageAndCallback, callbackDelay, true, promptDelay); + this.getMessageHandler().showDialogue( + text, + name, + delay, + showMessageAndCallback, + callbackDelay, + true, + promptDelay, + ); } } } shouldSkipDialogue(i18nKey: string): boolean { - const battleScene = this.scene as BattleScene; - - if (i18next.exists(i18nKey) ) { - if (battleScene.skipSeenDialogues && battleScene.gameData.getSeenDialogues()[i18nKey] === true) { + if (i18next.exists(i18nKey)) { + if (globalScene.skipSeenDialogues && globalScene.gameData.getSeenDialogues()[i18nKey] === true) { return true; } } @@ -371,16 +421,20 @@ export default class UI extends Phaser.GameObjects.Container { } getTooltip(): { visible: boolean; title: string; content: string } { - return { visible: this.tooltipContainer.visible, title: this.tooltipTitle.text, content: this.tooltipContent.text }; + return { + visible: this.tooltipContainer.visible, + title: this.tooltipTitle.text, + content: this.tooltipContent.text, + }; } showTooltip(title: string, content: string, overlap?: boolean): void { this.tooltipContainer.setVisible(true); this.editTooltip(title, content); if (overlap) { - (this.scene as BattleScene).uiContainer.moveAbove(this.tooltipContainer, this); + globalScene.uiContainer.moveAbove(this.tooltipContainer, this); } else { - (this.scene as BattleScene).uiContainer.moveBelow(this.tooltipContainer, this); + globalScene.uiContainer.moveBelow(this.tooltipContainer, this); } } @@ -389,8 +443,12 @@ export default class UI extends Phaser.GameObjects.Container { const wrappedContent = this.tooltipContent.runWordWrap(content); this.tooltipContent.setText(wrappedContent); this.tooltipContent.y = title ? 16 : 4; - this.tooltipBg.width = Math.min(Math.max(this.tooltipTitle.displayWidth, this.tooltipContent.displayWidth) + 12, 838); + this.tooltipBg.width = Math.min( + Math.max(this.tooltipTitle.displayWidth, this.tooltipContent.displayWidth) + 12, + 838, + ); this.tooltipBg.height = (title ? 31 : 19) + 10.5 * (wrappedContent.split("\n").length - 1); + this.tooltipTitle.x = this.tooltipBg.width / 2; } hideTooltip(): void { @@ -400,12 +458,34 @@ export default class UI extends Phaser.GameObjects.Container { update(): void { if (this.tooltipContainer.visible) { - const xReverse = this.scene.game.input.mousePointer && this.scene.game.input.mousePointer.x >= this.scene.game.canvas.width - this.tooltipBg.width * 6 - 12; - const yReverse = this.scene.game.input.mousePointer && this.scene.game.input.mousePointer.y >= this.scene.game.canvas.height - this.tooltipBg.height * 6 - 12; - this.tooltipContainer.setPosition( - !xReverse ? this.scene.game.input.mousePointer!.x / 6 + 2 : this.scene.game.input.mousePointer!.x / 6 - this.tooltipBg.width - 2, - !yReverse ? this.scene.game.input.mousePointer!.y / 6 + 2 : this.scene.game.input.mousePointer!.y / 6 - this.tooltipBg.height - 2, - ); + const isTouch = globalScene.inputMethod === "touch"; + const pointerX = globalScene.game.input.activePointer.x; + const pointerY = globalScene.game.input.activePointer.y; + const tooltipWidth = this.tooltipBg.width; + const tooltipHeight = this.tooltipBg.height; + const padding = 2; + + // Default placement is top left corner of the screen on mobile. Otherwise below the cursor, to the right + let x = isTouch ? padding : pointerX / 6 + padding; + let y = isTouch ? padding : pointerY / 6 + padding; + + if (isTouch) { + // If we are in the top left quadrant on mobile, move the tooltip to the top right corner + if (pointerX <= globalScene.game.canvas.width / 2 && pointerY <= globalScene.game.canvas.height / 2) { + x = globalScene.game.canvas.width / 6 - tooltipWidth - padding; + } + } else { + // If the tooltip would go offscreen on the right, or is close to it, move to the left of the cursor + if (x + tooltipWidth + padding > globalScene.game.canvas.width / 6) { + x = Math.max(padding, pointerX / 6 - tooltipWidth - padding); + } + // If the tooltip would go offscreen at the bottom, or is close to it, move above the cursor + if (y + tooltipHeight + padding > globalScene.game.canvas.height / 6) { + y = Math.max(padding, pointerY / 6 - tooltipHeight - padding); + } + } + + this.tooltipContainer.setPosition(x, y); } } @@ -418,7 +498,7 @@ export default class UI extends Phaser.GameObjects.Container { } } - setCursor(cursor: integer): boolean { + setCursor(cursor: number): boolean { const changed = this.getHandler().setCursor(cursor); if (changed) { this.playSelect(); @@ -428,14 +508,14 @@ export default class UI extends Phaser.GameObjects.Container { } playSelect(): void { - (this.scene as BattleScene).playSound("ui/select"); + globalScene.playSound("ui/select"); } playError(): void { - (this.scene as BattleScene).playSound("ui/error"); + globalScene.playSound("ui/error"); } - fadeOut(duration: integer): Promise { + fadeOut(duration: number): Promise { return new Promise(resolve => { if (this.overlayActive) { return resolve(); @@ -443,22 +523,22 @@ export default class UI extends Phaser.GameObjects.Container { this.overlayActive = true; this.overlay.setAlpha(0); this.overlay.setVisible(true); - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.overlay, alpha: 1, duration: duration, ease: "Sine.easeOut", - onComplete: () => resolve() + onComplete: () => resolve(), }); }); } - fadeIn(duration: integer): Promise { + fadeIn(duration: number): Promise { return new Promise(resolve => { if (!this.overlayActive) { return resolve(); } - this.scene.tweens.add({ + globalScene.tweens.add({ targets: this.overlay, alpha: 0, duration: duration, @@ -466,13 +546,19 @@ export default class UI extends Phaser.GameObjects.Container { onComplete: () => { this.overlay.setVisible(false); resolve(); - } + }, }); this.overlayActive = false; }); } - private setModeInternal(mode: Mode, clear: boolean, forceTransition: boolean, chainMode: boolean, args: any[]): Promise { + private setModeInternal( + mode: Mode, + clear: boolean, + forceTransition: boolean, + chainMode: boolean, + args: any[], + ): Promise { return new Promise(resolve => { if (this.mode === mode && !forceTransition) { resolve(); @@ -485,7 +571,7 @@ export default class UI extends Phaser.GameObjects.Container { } if (chainMode && this.mode && !clear) { this.modeChain.push(this.mode); - (this.scene as BattleScene).updateGameInfo(); + globalScene.updateGameInfo(); } this.mode = mode; const touchControls = document?.getElementById("touchControls"); @@ -496,11 +582,15 @@ export default class UI extends Phaser.GameObjects.Container { } resolve(); }; - if (((!chainMode && ((transitionModes.indexOf(this.mode) > -1 || transitionModes.indexOf(mode) > -1) - && (noTransitionModes.indexOf(this.mode) === -1 && noTransitionModes.indexOf(mode) === -1))) - || (chainMode && noTransitionModes.indexOf(mode) === -1))) { + if ( + (!chainMode && + (transitionModes.indexOf(this.mode) > -1 || transitionModes.indexOf(mode) > -1) && + noTransitionModes.indexOf(this.mode) === -1 && + noTransitionModes.indexOf(mode) === -1) || + (chainMode && noTransitionModes.indexOf(mode) === -1) + ) { this.fadeOut(250).then(() => { - this.scene.time.delayedCall(100, () => { + globalScene.time.delayedCall(100, () => { doSetMode(); this.fadeIn(250); }); @@ -533,7 +623,7 @@ export default class UI extends Phaser.GameObjects.Container { resetModeChain(): void { this.modeChain = []; - (this.scene as BattleScene).updateGameInfo(); + globalScene.updateGameInfo(); } revertMode(): Promise { @@ -547,7 +637,7 @@ export default class UI extends Phaser.GameObjects.Container { const doRevertMode = () => { this.getHandler().clear(); this.mode = this.modeChain.pop()!; // TODO: is this bang correct? - (this.scene as BattleScene).updateGameInfo(); + globalScene.updateGameInfo(); const touchControls = document.getElementById("touchControls"); if (touchControls) { touchControls.dataset.uiMode = Mode[this.mode]; @@ -557,7 +647,7 @@ export default class UI extends Phaser.GameObjects.Container { if (noTransitionModes.indexOf(lastMode) === -1) { this.fadeOut(250).then(() => { - this.scene.time.delayedCall(100, () => { + globalScene.time.delayedCall(100, () => { doRevertMode(); this.fadeIn(250); }); @@ -589,11 +679,19 @@ export default class UI extends Phaser.GameObjects.Container { * @returns gamepad type */ public getGamepadType(): string { - const scene = this.scene as BattleScene; - if (scene.inputMethod === "gamepad") { - return scene.inputController.getConfig(scene.inputController.selectedDevice[Device.GAMEPAD]).padType; - } else { - return scene.inputMethod; + if (globalScene.inputMethod === "gamepad") { + return globalScene.inputController.getConfig(globalScene.inputController.selectedDevice[Device.GAMEPAD]).padType; } + return globalScene.inputMethod; + } + + /** + * Attempts to free memory held by UI handlers + * and clears menus from {@linkcode NavigationManager} to prepare for reset + */ + public freeUIData(): void { + this.handlers.forEach(h => h.destroy()); + this.handlers = []; + NavigationManager.getInstance().clearNavigationMenus(); } } diff --git a/src/ui/unavailable-modal-ui-handler.ts b/src/ui/unavailable-modal-ui-handler.ts index 92b1c2f1b4e..3007f7247f1 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -1,10 +1,11 @@ -import BattleScene from "../battle-scene"; -import { ModalConfig, ModalUiHandler } from "./modal-ui-handler"; +import type { ModalConfig } from "./modal-ui-handler"; +import { ModalUiHandler } from "./modal-ui-handler"; import { addTextObject, TextStyle } from "./text"; -import { Mode } from "./ui"; +import type { Mode } from "./ui"; import { updateUserInfo } from "#app/account"; import * as Utils from "#app/utils"; import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; export default class UnavailableModalUiHandler extends ModalUiHandler { private reconnectTimer: NodeJS.Timeout | null; @@ -16,8 +17,8 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { private readonly randVarianceTime = 1000 * 10; - constructor(scene: BattleScene, mode: Mode | null = null) { - super(scene, mode); + constructor(mode: Mode | null = null) { + super(mode); this.reconnectDuration = this.minTime; } @@ -34,17 +35,23 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { } getMargin(): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + return [0, 0, 48, 0]; } getButtonLabels(): string[] { - return [ ]; + return []; } setup(): void { super.setup(); - const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, i18next.t("menu:errorServerDown"), TextStyle.WINDOW, { fontSize: "48px", align: "center" }); + const label = addTextObject( + this.getWidth() / 2, + this.getHeight() / 2, + i18next.t("menu:errorServerDown"), + TextStyle.WINDOW, + { fontSize: "48px", align: "center" }, + ); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); @@ -52,21 +59,21 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { tryReconnect(): void { updateUserInfo().then(response => { - if (response[0] || [ 200, 400 ].includes(response[1])) { + if (response[0] || [200, 400].includes(response[1])) { this.reconnectTimer = null; this.reconnectDuration = this.minTime; - this.scene.playSound("se/pb_bounce_1"); + globalScene.playSound("se/pb_bounce_1"); this.reconnectCallback(); } else if (response[1] === 401) { Utils.removeCookie(Utils.sessionIdKey); - this.scene.reset(true, true); + globalScene.reset(true, true); } else { this.reconnectDuration = Math.min(this.reconnectDuration * 2, this.maxTime); // Set a max delay so it isn't infinite - this.reconnectTimer = - setTimeout( - () => this.tryReconnect(), - // Adds a random factor to avoid pendulum effect during long total breakdown - this.reconnectDuration + (Math.random() * this.randVarianceTime)); + this.reconnectTimer = setTimeout( + () => this.tryReconnect(), + // Adds a random factor to avoid pendulum effect during long total breakdown + this.reconnectDuration + Math.random() * this.randVarianceTime, + ); } }); } @@ -74,14 +81,14 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { show(args: any[]): boolean { if (args.length >= 1 && args[0] instanceof Function) { const config: ModalConfig = { - buttonActions: [] + buttonActions: [], }; this.reconnectCallback = args[0]; this.reconnectDuration = this.minTime; this.reconnectTimer = setTimeout(() => this.tryReconnect(), this.reconnectDuration); - return super.show([ config ]); + return super.show([config]); } return false; diff --git a/src/utils.test.ts b/src/utils.test.ts index 3f5b835b03b..cc3f2bb1a04 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -4,7 +4,6 @@ import { randomString, padInt } from "./utils"; import Phaser from "phaser"; describe("utils", () => { - beforeAll(() => { new Phaser.Game({ type: Phaser.HEADLESS, diff --git a/src/utils.ts b/src/utils.ts index 8a35a4b3f07..7d3dea0247e 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,16 +1,21 @@ import { MoneyFormat } from "#enums/money-format"; import { Moves } from "#enums/moves"; import i18next from "i18next"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; export type nil = null | undefined; export const MissingTextureKey = "__MISSING"; export function toReadableString(str: string): string { - return str.replace(/\_/g, " ").split(" ").map(s => `${s.slice(0, 1)}${s.slice(1).toLowerCase()}`).join(" "); + return str + .replace(/\_/g, " ") + .split(" ") + .map(s => `${s.slice(0, 1)}${s.slice(1).toLowerCase()}`) + .join(" "); } -export function randomString(length: integer, seeded: boolean = false) { +export function randomString(length: number, seeded = false) { const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; let result = ""; @@ -22,7 +27,7 @@ export function randomString(length: integer, seeded: boolean = false) { return result; } -export function shiftCharCodes(str: string, shiftCount: integer) { +export function shiftCharCodes(str: string, shiftCount: number) { if (!shiftCount) { shiftCount = 0; } @@ -38,7 +43,7 @@ export function shiftCharCodes(str: string, shiftCount: integer) { return newStr; } -export function randGauss(stdev: number, mean: number = 0): number { +export function randGauss(stdev: number, mean = 0): number { if (!stdev) { return 0; } @@ -48,7 +53,7 @@ export function randGauss(stdev: number, mean: number = 0): number { return z * stdev + mean; } -export function randSeedGauss(stdev: number, mean: number = 0): number { +export function randSeedGauss(stdev: number, mean = 0): number { if (!stdev) { return 0; } @@ -58,7 +63,7 @@ export function randSeedGauss(stdev: number, mean: number = 0): number { return z * stdev + mean; } -export function padInt(value: integer, length: integer, padWith?: string): string { +export function padInt(value: number, length: number, padWith?: string): string { if (!padWith) { padWith = "0"; } @@ -70,11 +75,11 @@ export function padInt(value: integer, length: integer, padWith?: string): strin } /** -* Returns a random integer between min and min + range -* @param range The amount of possible numbers -* @param min The starting number -*/ -export function randInt(range: integer, min: integer = 0): integer { + * Returns a random integer between min and min + range + * @param range The amount of possible numbers + * @param min The starting number + */ +export function randInt(range: number, min = 0): number { if (range === 1) { return min; } @@ -87,50 +92,32 @@ export function randInt(range: integer, min: integer = 0): integer { * @param min The minimum integer to pick, default `0` * @returns A random integer between {@linkcode min} and ({@linkcode min} + {@linkcode range} - 1) */ -export function randSeedInt(range: integer, min: integer = 0): integer { +export function randSeedInt(range: number, min = 0): number { if (range <= 1) { return min; } - return Phaser.Math.RND.integerInRange(min, (range - 1) + min); + return Phaser.Math.RND.integerInRange(min, range - 1 + min); } /** -* Returns a random integer between min and max (non-inclusive) -* @param min The lowest number -* @param max The highest number -*/ -export function randIntRange(min: integer, max: integer): integer { + * Returns a random integer between min and max (non-inclusive) + * @param min The lowest number + * @param max The highest number + */ +export function randIntRange(min: number, max: number): number { return randInt(max - min, min); } export function randItem(items: T[]): T { - return items.length === 1 - ? items[0] - : items[randInt(items.length)]; + return items.length === 1 ? items[0] : items[randInt(items.length)]; } export function randSeedItem(items: T[]): T { - return items.length === 1 - ? items[0] - : Phaser.Math.RND.pick(items); + return items.length === 1 ? items[0] : Phaser.Math.RND.pick(items); } export function randSeedWeightedItem(items: T[]): T { - return items.length === 1 - ? items[0] - : Phaser.Math.RND.weightedPick(items); -} - -export function randSeedEasedWeightedItem(items: T[], easingFunction: string = "Sine.easeIn"): T | null { - if (!items.length) { - return null; - } - if (items.length === 1) { - return items[0]; - } - const value = Phaser.Math.RND.realInRange(0, 1); - const easedValue = Phaser.Tweens.Builders.GetEaseFunction(easingFunction)(value); - return items[Math.floor(easedValue * items.length)]; + return items.length === 1 ? items[0] : Phaser.Math.RND.weightedPick(items); } /** @@ -145,26 +132,26 @@ export function randSeedShuffle(items: T[]): T[] { const newArray = items.slice(0); for (let i = items.length - 1; i > 0; i--) { const j = Phaser.Math.RND.integerInRange(0, i); - [ newArray[i], newArray[j] ] = [ newArray[j], newArray[i] ]; + [newArray[i], newArray[j]] = [newArray[j], newArray[i]]; } return newArray; } -export function getFrameMs(frameCount: integer): integer { +export function getFrameMs(frameCount: number): number { return Math.floor((1 / 60) * 1000 * frameCount); } export function getCurrentTime(): number { const date = new Date(); - return (((date.getHours() * 60 + date.getMinutes()) / 1440) + 0.675) % 1; + return ((date.getHours() * 60 + date.getMinutes()) / 1440 + 0.675) % 1; } const secondsInHour = 3600; -export function getPlayTimeString(totalSeconds: integer): string { +export function getPlayTimeString(totalSeconds: number): string { const days = `${Math.floor(totalSeconds / (secondsInHour * 24))}`; - const hours = `${Math.floor(totalSeconds % (secondsInHour * 24) / secondsInHour)}`; - const minutes = `${Math.floor(totalSeconds % secondsInHour / 60)}`; + const hours = `${Math.floor((totalSeconds % (secondsInHour * 24)) / secondsInHour)}`; + const minutes = `${Math.floor((totalSeconds % secondsInHour) / 60)}`; const seconds = `${Math.floor(totalSeconds % 60)}`; return `${days.padStart(2, "0")}:${hours.padStart(2, "0")}:${minutes.padStart(2, "0")}:${seconds.padStart(2, "0")}`; @@ -178,16 +165,16 @@ export function getPlayTimeString(totalSeconds: integer): string { */ export function getIvsFromId(id: number): number[] { return [ - (id & 0x3E000000) >>> 25, - (id & 0x01F00000) >>> 20, - (id & 0x000F8000) >>> 15, - (id & 0x00007C00) >>> 10, - (id & 0x000003E0) >>> 5, - (id & 0x0000001F) + (id & 0x3e000000) >>> 25, + (id & 0x01f00000) >>> 20, + (id & 0x000f8000) >>> 15, + (id & 0x00007c00) >>> 10, + (id & 0x000003e0) >>> 5, + id & 0x0000001f, ]; } -export function formatLargeNumber(count: integer, threshold: integer): string { +export function formatLargeNumber(count: number, threshold: number): string { if (count < threshold) { return count.toString(); } @@ -221,9 +208,9 @@ export function formatLargeNumber(count: integer, threshold: integer): string { } // Abbreviations from 10^0 to 10^33 -const AbbreviationsLargeNumber: string[] = [ "", "K", "M", "B", "t", "q", "Q", "s", "S", "o", "n", "d" ]; +const AbbreviationsLargeNumber: string[] = ["", "K", "M", "B", "t", "q", "Q", "s", "S", "o", "n", "d"]; -export function formatFancyLargeNumber(number: number, rounded: number = 3): string { +export function formatFancyLargeNumber(number: number, rounded = 3): string { let exponent: number; if (number < 1000) { @@ -247,16 +234,20 @@ export function formatMoney(format: MoneyFormat, amount: number) { return amount.toLocaleString(); } -export function formatStat(stat: integer, forHp: boolean = false): string { +export function formatStat(stat: number, forHp = false): string { return formatLargeNumber(stat, forHp ? 100000 : 1000000); } export function getEnumKeys(enumType: any): string[] { - return Object.values(enumType).filter(v => isNaN(parseInt(v!.toString()))).map(v => v!.toString()); + return Object.values(enumType) + .filter(v => Number.isNaN(Number.parseInt(v!.toString()))) + .map(v => v!.toString()); } -export function getEnumValues(enumType: any): integer[] { - return Object.values(enumType).filter(v => !isNaN(parseInt(v!.toString()))).map(v => parseInt(v!.toString())); +export function getEnumValues(enumType: any): number[] { + return Object.values(enumType) + .filter(v => !Number.isNaN(Number.parseInt(v!.toString()))) + .map(v => Number.parseInt(v!.toString())); } export function executeIf(condition: boolean, promiseFunc: () => Promise): Promise { @@ -265,14 +256,22 @@ export function executeIf(condition: boolean, promiseFunc: () => Promise): export const sessionIdKey = "pokerogue_sessionId"; // Check if the current hostname is 'localhost' or an IP address, and ensure a port is specified -export const isLocal = ( - (window.location.hostname === "localhost" || - /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/.test(window.location.hostname)) && - window.location.port !== "") || window.location.hostname === ""; +export const isLocal = + ((window.location.hostname === "localhost" || /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/.test(window.location.hostname)) && + window.location.port !== "") || + window.location.hostname === ""; -export const localServerUrl = import.meta.env.VITE_SERVER_URL ?? `http://${window.location.hostname}:${window.location.port + 1}`; +/** + * @deprecated Refer to [pokerogue-api.ts](./plugins/api/pokerogue-api.ts) instead + */ +export const localServerUrl = + import.meta.env.VITE_SERVER_URL ?? `http://${window.location.hostname}:${window.location.port + 1}`; -// Set the server URL based on whether it's local or not +/** + * Set the server URL based on whether it's local or not + * + * @deprecated Refer to [pokerogue-api.ts](./plugins/api/pokerogue-api.ts) instead + */ export const apiUrl = localServerUrl ?? "https://api.pokerogue.net"; // used to disable api calls when isLocal is true and a server is not found export let isLocalServerConnected = true; @@ -281,7 +280,7 @@ export const isBeta = import.meta.env.MODE === "beta"; // this checks to see if export function setCookie(cName: string, cValue: string): void { const expiration = new Date(); - expiration.setTime(new Date().getTime() + 3600000 * 24 * 30 * 3/*7*/); + expiration.setTime(new Date().getTime() + 3600000 * 24 * 30 * 3 /*7*/); document.cookie = `${cName}=${cValue};Secure;SameSite=Strict;Domain=${window.location.hostname};Path=/;Expires=${expiration.toUTCString()}`; } @@ -319,50 +318,16 @@ export function getCookie(cName: string): string { * with a GET request to verify if a server is running, * sets isLocalServerConnected based on results */ -export function localPing() { +export async function localPing() { if (isLocal) { - apiFetch("game/titlestats") - .then(resolved => isLocalServerConnected = true, - rejected => isLocalServerConnected = false - ); + const titleStats = await pokerogueApi.getGameTitleStats(); + isLocalServerConnected = !!titleStats; + console.log("isLocalServerConnected:", isLocalServerConnected); } } -export function apiFetch(path: string, authed: boolean = false): Promise { - return (isLocal && isLocalServerConnected) || !isLocal ? new Promise((resolve, reject) => { - const request = {}; - if (authed) { - const sId = getCookie(sessionIdKey); - if (sId) { - request["headers"] = { "Authorization": sId }; - } - } - fetch(`${apiUrl}/${path}`, request) - .then(response => resolve(response)) - .catch(err => reject(err)); - }) : new Promise(() => {}); -} - -export function apiPost(path: string, data?: any, contentType: string = "application/json", authed: boolean = false): Promise { - return (isLocal && isLocalServerConnected) || !isLocal ? new Promise((resolve, reject) => { - const headers = { - "Accept": contentType, - "Content-Type": contentType, - }; - if (authed) { - const sId = getCookie(sessionIdKey); - if (sId) { - headers["Authorization"] = sId; - } - } - fetch(`${apiUrl}/${path}`, { method: "POST", headers: headers, body: data }) - .then(response => resolve(response)) - .catch(err => reject(err)); - }) : new Promise(() => {}); -} - /** Alias for the constructor of a class */ -export type Constructor = new(...args: unknown[]) => T; +export type Constructor = new (...args: unknown[]) => T; export class BooleanHolder { public value: boolean; @@ -380,20 +345,16 @@ export class NumberHolder { } } -export class IntegerHolder extends NumberHolder { - constructor(value: integer) { - super(value); +export class FixedInt { + public readonly value: number; + + constructor(value: number) { + this.value = value; } } -export class FixedInt extends IntegerHolder { - constructor(value: integer) { - super(value); - } -} - -export function fixedInt(value: integer): integer { - return new FixedInt(value) as unknown as integer; +export function fixedInt(value: number): number { + return new FixedInt(value) as unknown as number; } /** @@ -414,14 +375,18 @@ export function toCamelCaseString(unformattedText: string): string { if (!unformattedText) { return ""; } - return unformattedText.split(/[_ ]/).filter(f => f).map((f, i) => i ? `${f[0].toUpperCase()}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + return unformattedText + .split(/[_ ]/) + .filter(f => f) + .map((f, i) => (i ? `${f[0].toUpperCase()}${f.slice(1).toLowerCase()}` : f.toLowerCase())) + .join(""); } -export function rgbToHsv(r: integer, g: integer, b: integer) { +export function rgbToHsv(r: number, g: number, b: number) { const v = Math.max(r, g, b); const c = v - Math.min(r, g, b); - const h = c && ((v === r) ? (g - b) / c : ((v === g) ? 2 + (b - r) / c : 4 + (r - g) / c)); - return [ 60 * (h < 0 ? h + 6 : h), v && c / v, v ]; + const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c); + return [60 * (h < 0 ? h + 6 : h), v && c / v, v]; } /** @@ -429,28 +394,28 @@ export function rgbToHsv(r: integer, g: integer, b: integer) { * @param {Array} rgb1 First RGB color in array * @param {Array} rgb2 Second RGB color in array */ -export function deltaRgb(rgb1: integer[], rgb2: integer[]): integer { - const [ r1, g1, b1 ] = rgb1; - const [ r2, g2, b2 ] = rgb2; +export function deltaRgb(rgb1: number[], rgb2: number[]): number { + const [r1, g1, b1] = rgb1; + const [r2, g2, b2] = rgb2; const drp2 = Math.pow(r1 - r2, 2); const dgp2 = Math.pow(g1 - g2, 2); const dbp2 = Math.pow(b1 - b2, 2); const t = (r1 + r2) / 2; - return Math.ceil(Math.sqrt(2 * drp2 + 4 * dgp2 + 3 * dbp2 + t * (drp2 - dbp2) / 256)); + return Math.ceil(Math.sqrt(2 * drp2 + 4 * dgp2 + 3 * dbp2 + (t * (drp2 - dbp2)) / 256)); } export function rgbHexToRgba(hex: string) { - const color = hex.match(/^([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i) ?? [ "000000", "00", "00", "00" ]; + const color = hex.match(/^([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i) ?? ["000000", "00", "00", "00"]; return { - r: parseInt(color[1], 16), - g: parseInt(color[2], 16), - b: parseInt(color[3], 16), - a: 255 + r: Number.parseInt(color[1], 16), + g: Number.parseInt(color[2], 16), + b: Number.parseInt(color[3], 16), + a: 255, }; } -export function rgbaToInt(rgba: integer[]): integer { +export function rgbaToInt(rgba: number[]): number { return (rgba[0] << 24) + (rgba[1] << 16) + (rgba[2] << 8) + rgba[3]; } @@ -469,25 +434,28 @@ export function hslToHex(h: number, s: number, l: number): string { const f = (n: number) => { const k = (n + h / 30) % 12; const rgb = l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1)); - return Math.round(rgb * 255).toString(16).padStart(2, "0"); + return Math.round(rgb * 255) + .toString(16) + .padStart(2, "0"); }; return `#${f(0)}${f(8)}${f(4)}`; } -/*This function returns true if the current lang is available for some functions -If the lang is not in the function, it usually means that lang is going to use the default english version -This function is used in: -- summary-ui-handler.ts: If the lang is not available, it'll use types.json (english) -English itself counts as not available -*/ -export function verifyLang(lang?: string): boolean { - //IMPORTANT - ONLY ADD YOUR LANG HERE IF YOU'VE ALREADY ADDED ALL THE NECESSARY IMAGES +/** + * This function returns `true` if all localized images used by the game have been added for the given language. + * + * If the lang is not in the function, it usually means that lang is going to use the default english version + * + * English itself counts as not available + */ +export function hasAllLocalizedSprites(lang?: string): boolean { + // IMPORTANT - ONLY ADD YOUR LANG HERE IF YOU'VE ALREADY ADDED ALL THE NECESSARY IMAGES if (!lang) { lang = i18next.resolvedLanguage; } switch (lang) { - case "es": + case "es-ES": case "fr": case "de": case "it": @@ -503,16 +471,17 @@ export function verifyLang(lang?: string): boolean { } /** - * Prints the type and name of all game objects in a container for debuggin purposes + * Prints the type and name of all game objects in a container for debugging purposes * @param container container with game objects inside it */ export function printContainerList(container: Phaser.GameObjects.Container): void { - console.log(container.list.map(go => { - return { type: go.type, name: go.name }; - })); + console.log( + container.list.map(go => { + return { type: go.type, name: go.name }; + }), + ); } - /** * Truncate a string to a specified maximum length and add an ellipsis if it exceeds that length. * @@ -520,7 +489,7 @@ export function printContainerList(container: Phaser.GameObjects.Container): voi * @param maxLength - The maximum length of the truncated string, defaults to 10. * @returns The truncated string with an ellipsis if it was longer than maxLength. */ -export function truncateString(str: String, maxLength: number = 10) { +export function truncateString(str: string, maxLength = 10) { // Check if the string length exceeds the maximum length if (str.length > maxLength) { // Truncate the string and add an ellipsis @@ -565,7 +534,7 @@ export function reverseValueToKeySetting(input) { * @param returnWithSpaces - Whether the returned string should have spaces between the words or not. * @returns The capitalized string. */ -export function capitalizeString(str: string, sep: string, lowerFirstChar: boolean = true, returnWithSpaces: boolean = false) { +export function capitalizeString(str: string, sep: string, lowerFirstChar = true, returnWithSpaces = false) { if (str) { const splitedStr = str.toLowerCase().split(sep); @@ -578,17 +547,12 @@ export function capitalizeString(str: string, sep: string, lowerFirstChar: boole return null; } -/** - * Returns if an object is null or undefined - * @param object - */ export function isNullOrUndefined(object: any): object is undefined | null { return null === object || undefined === object; } /** * Capitalizes the first letter of a string - * @param str */ export function capitalizeFirstLetter(str: string) { return str.charAt(0).toUpperCase() + str.slice(1); @@ -604,7 +568,7 @@ export function capitalizeFirstLetter(str: string) { * @param minValue - The minimum integer value to return. Defaults to 1. * @returns The converted value as an integer. */ -export function toDmgValue(value: number, minValue: number = 1) { +export function toDmgValue(value: number, minValue = 1) { return Math.max(Math.floor(value), minValue); } @@ -614,7 +578,7 @@ export function toDmgValue(value: number, minValue: number = 1) { * @returns the localized sprite key */ export function getLocalizedSpriteKey(baseKey: string) { - return `${baseKey}${verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`; + return `${baseKey}${hasAllLocalizedSprites(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`; } /** @@ -622,7 +586,7 @@ export function getLocalizedSpriteKey(baseKey: string) { * @param num the number to check * @param min the minimum value (included) * @param max the maximum value (included) - * @returns true if number is **inclusive** between min and max + * @returns `true` if number is **inclusive** between min and max */ export function isBetween(num: number, min: number, max: number): boolean { return num >= min && num <= max; diff --git a/src/test/abilities/ability_duplication.test.ts b/test/abilities/ability_duplication.test.ts similarity index 81% rename from src/test/abilities/ability_duplication.test.ts rename to test/abilities/ability_duplication.test.ts index f9122b3259c..08b74f682f2 100644 --- a/src/test/abilities/ability_duplication.test.ts +++ b/test/abilities/ability_duplication.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; @@ -23,7 +23,7 @@ describe("Ability Duplication", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .battleType("single") .ability(Abilities.HUGE_POWER) .enemyAbility(Abilities.BALL_FETCH) @@ -33,9 +33,9 @@ describe("Ability Duplication", () => { it("huge power should only be applied once if both normal and passive", async () => { game.override.passiveAbility(Abilities.HUGE_POWER); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const [ magikarp ] = game.scene.getPlayerField(); + const [magikarp] = game.scene.getPlayerField(); const magikarpAttack = magikarp.getEffectiveStat(Stat.ATK); magikarp.summonData.abilitySuppressed = true; @@ -46,9 +46,9 @@ describe("Ability Duplication", () => { it("huge power should stack with pure power", async () => { game.override.passiveAbility(Abilities.PURE_POWER); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); - const [ magikarp ] = game.scene.getPlayerField(); + const [magikarp] = game.scene.getPlayerField(); const magikarpAttack = magikarp.getEffectiveStat(Stat.ATK); magikarp.summonData.abilitySuppressed = true; diff --git a/src/test/abilities/ability_timing.test.ts b/test/abilities/ability_timing.test.ts similarity index 77% rename from src/test/abilities/ability_timing.test.ts rename to test/abilities/ability_timing.test.ts index e3264c2c1a8..d59c4f7c38d 100644 --- a/src/test/abilities/ability_timing.test.ts +++ b/test/abilities/ability_timing.test.ts @@ -5,11 +5,10 @@ import i18next from "#app/plugins/i18n"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Ability Timing", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -37,12 +36,17 @@ describe("Ability Timing", () => { it("should trigger after switch check", async () => { game.settings.battleStyle = BattleStyle.SWITCH; - await game.classicMode.runToSummon([ Species.EEVEE, Species.FEEBAS ]); + await game.classicMode.runToSummon([Species.EEVEE, Species.FEEBAS]); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase), + ); await game.phaseInterceptor.to("MessagePhase"); expect(i18next.t).toHaveBeenCalledWith("battle:statFell", expect.objectContaining({ count: 1 })); diff --git a/test/abilities/analytic.test.ts b/test/abilities/analytic.test.ts new file mode 100644 index 00000000000..e488b467ce0 --- /dev/null +++ b/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/testUtils/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/test/abilities/arena_trap.test.ts b/test/abilities/arena_trap.test.ts new file mode 100644 index 00000000000..e0d093a91aa --- /dev/null +++ b/test/abilities/arena_trap.test.ts @@ -0,0 +1,90 @@ +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/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; + +describe("Abilities - Arena Trap", () => { + 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) + .ability(Abilities.ARENA_TRAP) + .enemySpecies(Species.RALTS) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.TELEPORT); + }); + + // TODO: Enable test when Issue #935 is addressed + it.todo("should not allow grounded Pokémon to flee", async () => { + game.override.battleType("single"); + + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + + await game.toNextTurn(); + + expect(enemy).toBe(game.scene.getEnemyPokemon()); + }); + + it("should guarantee double battle with any one LURE", async () => { + game.override.startingModifier([{ name: "LURE" }]).startingWave(2); + + await game.classicMode.startBattle(); + + 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/aroma_veil.test.ts b/test/abilities/aroma_veil.test.ts similarity index 77% rename from src/test/abilities/aroma_veil.test.ts rename to test/abilities/aroma_veil.test.ts index 4284eb43a75..af8a0233a60 100644 --- a/src/test/abilities/aroma_veil.test.ts +++ b/test/abilities/aroma_veil.test.ts @@ -1,13 +1,13 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#enums/battler-tag-type"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerIndex } from "#app/battle"; -import { PlayerPokemon } from "#app/field/pokemon"; +import type { PlayerPokemon } from "#app/field/pokemon"; describe("Moves - Aroma Veil", () => { let phaserGame: Phaser.Game; @@ -27,16 +27,16 @@ describe("Moves - Aroma Veil", () => { game.override .battleType("double") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.HEAL_BLOCK, Moves.IMPRISON, Moves.SPLASH ]) + .enemyMoveset([Moves.HEAL_BLOCK, Moves.IMPRISON, Moves.SPLASH]) .enemySpecies(Species.SHUCKLE) .ability(Abilities.AROMA_VEIL) - .moveset([ Moves.GROWL ]); + .moveset([Moves.GROWL]); }); it("Aroma Veil protects the Pokemon's side against most Move Restriction Battler Tags", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI, Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); - const party = game.scene.getParty()! as PlayerPokemon[]; + const party = game.scene.getPlayerParty()! as PlayerPokemon[]; game.move.select(Moves.GROWL); game.move.select(Moves.GROWL); @@ -48,9 +48,9 @@ describe("Moves - Aroma Veil", () => { }); it("Aroma Veil does not protect against Imprison", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI, Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); - const party = game.scene.getParty()! as PlayerPokemon[]; + const party = game.scene.getPlayerParty()! as PlayerPokemon[]; game.move.select(Moves.GROWL); game.move.select(Moves.GROWL, 1); diff --git a/src/test/abilities/aura_break.test.ts b/test/abilities/aura_break.test.ts similarity index 83% rename from src/test/abilities/aura_break.test.ts rename to test/abilities/aura_break.test.ts index 137688d1f22..86b6c69ec8b 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/test/abilities/aura_break.test.ts @@ -1,8 +1,8 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -10,7 +10,7 @@ describe("Abilities - Aura Break", () => { let phaserGame: Phaser.Game; let game: GameManager; - const auraBreakMultiplier = 9 / 16 * 4 / 3; + const auraBreakMultiplier = ((9 / 16) * 4) / 3; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -25,7 +25,7 @@ describe("Abilities - Aura Break", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE ]); + game.override.moveset([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.AURA_BREAK); game.override.enemySpecies(Species.SHUCKLE); @@ -38,7 +38,7 @@ describe("Abilities - Aura Break", () => { game.override.ability(Abilities.FAIRY_AURA); vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.MOONBLAST); await game.phaseInterceptor.to("MoveEffectPhase"); @@ -52,7 +52,7 @@ describe("Abilities - Aura Break", () => { game.override.ability(Abilities.DARK_AURA); vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.DARK_PULSE); await game.phaseInterceptor.to("MoveEffectPhase"); @@ -66,7 +66,7 @@ describe("Abilities - Aura Break", () => { game.override.ability(Abilities.BALL_FETCH); vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.MOONBLAST); await game.phaseInterceptor.to("MoveEffectPhase"); diff --git a/src/test/abilities/battery.test.ts b/test/abilities/battery.test.ts similarity index 85% rename from src/test/abilities/battery.test.ts rename to test/abilities/battery.test.ts index 8abeca287f7..cc7570c3d31 100644 --- a/src/test/abilities/battery.test.ts +++ b/test/abilities/battery.test.ts @@ -1,10 +1,10 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,7 +29,7 @@ describe("Abilities - Battery", () => { game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.moveset([ Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM ]); + game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); game.override.enemyMoveset(Moves.SPLASH); }); @@ -39,7 +39,7 @@ describe("Abilities - Battery", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.PIKACHU, Species.CHARJABUG ]); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.SPLASH, 1); @@ -54,7 +54,7 @@ describe("Abilities - Battery", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.PIKACHU, Species.CHARJABUG ]); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); game.move.select(Moves.BREAKING_SWIPE); game.move.select(Moves.SPLASH, 1); @@ -69,7 +69,7 @@ describe("Abilities - Battery", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.CHARJABUG, Species.PIKACHU ]); + await game.startBattle([Species.CHARJABUG, Species.PIKACHU]); game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.SPLASH, 1); diff --git a/src/test/abilities/battle_bond.test.ts b/test/abilities/battle_bond.test.ts similarity index 81% rename from src/test/abilities/battle_bond.test.ts rename to test/abilities/battle_bond.test.ts index 283fb0d0f14..6305d7dedc5 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/test/abilities/battle_bond.test.ts @@ -1,12 +1,13 @@ -import { allMoves, MultiHitAttr, MultiHitType } from "#app/data/move"; -import { Status, StatusEffect } from "#app/data/status-effect"; +import { allMoves, MultiHitAttr } from "#app/data/moves/move"; +import { MultiHitType } from "#enums/MultiHitType"; +import { Status } from "#app/data/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Abilities - BATTLE BOND", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -26,11 +27,12 @@ describe("Abilities - BATTLE BOND", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .startingWave(4) // Leads to arena reset on Wave 5 trainer battle .ability(Abilities.BATTLE_BOND) - .starterForms({ [Species.GRENINJA]: ashForm, }) - .moveset([ Moves.SPLASH, Moves.WATER_SHURIKEN ]) + .starterForms({ [Species.GRENINJA]: ashForm }) + .moveset([Moves.SPLASH, Moves.WATER_SHURIKEN]) .enemySpecies(Species.BULBASAUR) .enemyMoveset(Moves.SPLASH) .startingLevel(100) // Avoid levelling up @@ -38,9 +40,9 @@ describe("Abilities - BATTLE BOND", () => { }); it("check if fainted pokemon switches to base form on arena reset", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.GRENINJA ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.GRENINJA]); - const greninja = game.scene.getParty()[1]; + const greninja = game.scene.getPlayerParty()[1]; expect(greninja.formIndex).toBe(ashForm); greninja.hp = 0; @@ -57,7 +59,7 @@ describe("Abilities - BATTLE BOND", () => { }); it("should not keep buffing Water Shuriken after Greninja switches to base form", async () => { - await game.classicMode.startBattle([ Species.GRENINJA ]); + await game.classicMode.startBattle([Species.GRENINJA]); const waterShuriken = allMoves[Moves.WATER_SHURIKEN]; vi.spyOn(waterShuriken, "calculateBattlePower"); diff --git a/src/test/abilities/beast_boost.test.ts b/test/abilities/beast_boost.test.ts similarity index 72% rename from src/test/abilities/beast_boost.test.ts rename to test/abilities/beast_boost.test.ts index de31b979e32..b307a9eeeba 100644 --- a/src/test/abilities/beast_boost.test.ts +++ b/test/abilities/beast_boost.test.ts @@ -3,7 +3,7 @@ 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,16 +29,16 @@ describe("Abilities - Beast Boost", () => { .enemyAbility(Abilities.BEAST_BOOST) .ability(Abilities.BEAST_BOOST) .startingLevel(2000) - .moveset([ Moves.FLAMETHROWER ]) + .moveset([Moves.FLAMETHROWER]) .enemyMoveset(Moves.SPLASH); }); - it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async() => { - await game.classicMode.startBattle([ Species.SLOWBRO ]); + it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async () => { + await game.classicMode.startBattle([Species.SLOWBRO]); const playerPokemon = game.scene.getPlayerPokemon()!; // Set the pokemon's highest stat to DEF, so it should be picked by Beast Boost - vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 10000, 100, 1000, 200, 100, 100 ]); + vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([10000, 100, 1000, 200, 100, 100]); console.log(playerPokemon.stats); expect(playerPokemon.getStatStage(Stat.DEF)).toBe(0); @@ -49,33 +49,33 @@ describe("Abilities - Beast Boost", () => { expect(playerPokemon.getStatStage(Stat.DEF)).toBe(1); }, 20000); - it("should use in-battle overriden stats when determining the stat stage to raise by 1", async() => { - game.override.enemyMoveset([ Moves.GUARD_SPLIT ]); + it("should use in-battle overriden stats when determining the stat stage to raise by 1", async () => { + game.override.enemyMoveset([Moves.GUARD_SPLIT]); - await game.classicMode.startBattle([ Species.SLOWBRO ]); + await game.classicMode.startBattle([Species.SLOWBRO]); const playerPokemon = game.scene.getPlayerPokemon()!; // If the opponent uses Guard Split, the pokemon's second highest stat (SPATK) should be chosen - vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 10000, 100, 201, 200, 100, 100 ]); + vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([10000, 100, 201, 200, 100, 100]); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0); game.move.select(Moves.FLAMETHROWER); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("VictoryPhase"); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1); }, 20000); - it("should have order preference in case of stat ties", async() => { + it("should have order preference in case of stat ties", async () => { // Order preference follows the order of EFFECTIVE_STAT - await game.classicMode.startBattle([ Species.SLOWBRO ]); + await game.classicMode.startBattle([Species.SLOWBRO]); const playerPokemon = game.scene.getPlayerPokemon()!; // Set up tie between SPATK, SPDEF, and SPD, where SPATK should win - vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 10000, 1, 1, 100, 100, 100 ]); + vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([10000, 1, 1, 100, 100, 100]); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0); diff --git a/test/abilities/commander.test.ts b/test/abilities/commander.test.ts new file mode 100644 index 00000000000..9d16d474dd4 --- /dev/null +++ b/test/abilities/commander.test.ts @@ -0,0 +1,219 @@ +import { BattlerIndex } from "#app/battle"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { PokemonAnimType } from "#enums/pokemon-anim-type"; +import type { EffectiveStat } from "#enums/stat"; +import { Stat } from "#enums/stat"; +import { StatusEffect } from "#enums/status-effect"; +import { WeatherType } from "#enums/weather-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/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Commander", () => { + 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 + .startingLevel(100) + .enemyLevel(100) + .moveset([Moves.LIQUIDATION, Moves.MEMENTO, Moves.SPLASH, Moves.FLIP_TURN]) + .ability(Abilities.COMMANDER) + .battleType("double") + .disableCrits() + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.TACKLE); + + vi.spyOn(game.scene, "triggerPokemonBattleAnim").mockReturnValue(true); + }); + + it("causes the source to jump into Dondozo's mouth, granting a stat boost and hiding the source", async () => { + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); + + const [tatsugiri, dondozo] = game.scene.getPlayerField(); + + const affectedStats: EffectiveStat[] = [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; + + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + affectedStats.forEach(stat => expect(dondozo.getStatStage(stat)).toBe(2)); + + game.move.select(Moves.SPLASH, 1); + + expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); + + // Force both enemies to target the Tatsugiri + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + + await game.phaseInterceptor.to("BerryPhase", false); + game.scene.getEnemyField().forEach(enemy => expect(enemy.getLastXMoves(1)[0].result).toBe(MoveResult.MISS)); + expect(tatsugiri.isFullHp()).toBeTruthy(); + }); + + it("should activate when a Dondozo switches in and cancel the source's move", async () => { + game.override.enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([Species.TATSUGIRI, Species.MAGIKARP, Species.DONDOZO]); + + const tatsugiri = game.scene.getPlayerField()[0]; + + game.move.select(Moves.LIQUIDATION, 0, BattlerIndex.ENEMY); + game.doSwitchPokemon(2); + + await game.phaseInterceptor.to("MovePhase", false); + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + + const dondozo = game.scene.getPlayerField()[1]; + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(tatsugiri.getMoveHistory()).toHaveLength(0); + expect(game.scene.getEnemyField()[0].isFullHp()).toBeTruthy(); + }); + + it("source should reenter the field when Dondozo faints", async () => { + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); + + const [tatsugiri, dondozo] = game.scene.getPlayerField(); + + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + + game.move.select(Moves.MEMENTO, 1, BattlerIndex.ENEMY); + + expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); + + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("FaintPhase", false); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeUndefined(); + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(dondozo, PokemonAnimType.COMMANDER_REMOVE); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(tatsugiri.isFullHp()).toBeFalsy(); + }); + + it("source should still take damage from Poison while hidden", async () => { + game.override.statusEffect(StatusEffect.POISON).enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); + + const [tatsugiri, dondozo] = game.scene.getPlayerField(); + + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + + game.move.select(Moves.SPLASH, 1); + + expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(tatsugiri.isFullHp()).toBeFalsy(); + }); + + it("source should still take damage from Salt Cure while hidden", async () => { + game.override.enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); + + const [tatsugiri, dondozo] = game.scene.getPlayerField(); + + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + + tatsugiri.addTag(BattlerTagType.SALT_CURED, 0, Moves.NONE, game.scene.getField()[BattlerIndex.ENEMY].id); + + game.move.select(Moves.SPLASH, 1); + + expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(tatsugiri.isFullHp()).toBeFalsy(); + }); + + it("source should still take damage from Sandstorm while hidden", async () => { + game.override.weather(WeatherType.SANDSTORM).enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); + + const [tatsugiri, dondozo] = game.scene.getPlayerField(); + + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + + game.move.select(Moves.SPLASH, 1); + + expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(tatsugiri.isFullHp()).toBeFalsy(); + }); + + it("should make Dondozo immune to being forced out", async () => { + game.override.enemyMoveset([Moves.SPLASH, Moves.WHIRLWIND]); + + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); + + const [tatsugiri, dondozo] = game.scene.getPlayerField(); + + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + + game.move.select(Moves.SPLASH, 1); + + expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); + + await game.forceEnemyMove(Moves.WHIRLWIND, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + + // Test may time out here if Whirlwind forced out a Pokemon + await game.phaseInterceptor.to("TurnEndPhase"); + expect(dondozo.isActive(true)).toBeTruthy(); + }); + + it("should interrupt the source's semi-invulnerability", async () => { + game.override.moveset([Moves.SPLASH, Moves.DIVE]).enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([Species.TATSUGIRI, Species.MAGIKARP, Species.DONDOZO]); + + const tatsugiri = game.scene.getPlayerField()[0]; + + game.move.select(Moves.DIVE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("CommandPhase"); + await game.toNextTurn(); + + expect(tatsugiri.getTag(BattlerTagType.UNDERWATER)).toBeDefined(); + game.doSwitchPokemon(2); + + await game.phaseInterceptor.to("MovePhase", false); + const dondozo = game.scene.getPlayerField()[1]; + expect(tatsugiri.getTag(BattlerTagType.UNDERWATER)).toBeUndefined(); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + + await game.toNextTurn(); + const enemy = game.scene.getEnemyField()[0]; + expect(enemy.isFullHp()).toBeTruthy(); + }); +}); diff --git a/src/test/abilities/competitive.test.ts b/test/abilities/competitive.test.ts similarity index 86% rename from src/test/abilities/competitive.test.ts rename to test/abilities/competitive.test.ts index ecb276a1b8d..cad35be18f7 100644 --- a/src/test/abilities/competitive.test.ts +++ b/test/abilities/competitive.test.ts @@ -3,7 +3,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -24,16 +24,17 @@ describe("Abilities - Competitive", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .enemySpecies(Species.BEEDRILL) .enemyMoveset(Moves.TICKLE) .startingLevel(1) - .moveset([ Moves.SPLASH, Moves.CLOSE_COMBAT ]) + .moveset([Moves.SPLASH, Moves.CLOSE_COMBAT]) .ability(Abilities.COMPETITIVE); }); it("lower atk and def by 1 via tickle, then increase spatk by 4 via competitive", async () => { - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); @@ -46,7 +47,7 @@ describe("Abilities - Competitive", () => { it("lowering your own stats should not trigger competitive", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.CLOSE_COMBAT); @@ -59,7 +60,7 @@ describe("Abilities - Competitive", () => { it("white herb should remove only the negative effects", async () => { game.override.startingHeldItems([{ name: "WHITE_HERB" }]); - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); diff --git a/src/test/abilities/contrary.test.ts b/test/abilities/contrary.test.ts similarity index 76% rename from src/test/abilities/contrary.test.ts rename to test/abilities/contrary.test.ts index c838a5a098e..19041eb2801 100644 --- a/src/test/abilities/contrary.test.ts +++ b/test/abilities/contrary.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -30,10 +30,8 @@ describe("Abilities - Contrary", () => { .enemyMoveset(Moves.SPLASH); }); - it("should invert stat changes when applied", async() => { - await game.classicMode.startBattle([ - Species.SLOWBRO - ]); + it("should invert stat changes when applied", async () => { + await game.classicMode.startBattle([Species.SLOWBRO]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -42,10 +40,8 @@ describe("Abilities - Contrary", () => { describe("With Clear Body", () => { it("should apply positive effects", async () => { - game.override - .enemyPassiveAbility(Abilities.CLEAR_BODY) - .moveset([ Moves.TAIL_WHIP ]); - await game.classicMode.startBattle([ Species.SLOWBRO ]); + game.override.enemyPassiveAbility(Abilities.CLEAR_BODY).moveset([Moves.TAIL_WHIP]); + await game.classicMode.startBattle([Species.SLOWBRO]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -60,9 +56,9 @@ describe("Abilities - Contrary", () => { it("should block negative effects", async () => { game.override .enemyPassiveAbility(Abilities.CLEAR_BODY) - .enemyMoveset([ Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL ]) - .moveset([ Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.SLOWBRO ]); + .enemyMoveset([Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL]) + .moveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.SLOWBRO]); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/corrosion.test.ts b/test/abilities/corrosion.test.ts new file mode 100644 index 00000000000..b7f316fbe2d --- /dev/null +++ b/test/abilities/corrosion.test.ts @@ -0,0 +1,46 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Corrosion", () => { + 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]) + .battleType("single") + .disableCrits() + .enemySpecies(Species.GRIMER) + .enemyAbility(Abilities.CORROSION) + .enemyMoveset(Moves.TOXIC); + }); + + it("If a Poison- or Steel-type Pokémon with this Ability poisons a target with Synchronize, Synchronize does not gain the ability to poison Poison- or Steel-type Pokémon.", async () => { + game.override.ability(Abilities.SYNCHRONIZE); + await game.classicMode.startBattle([Species.FEEBAS]); + + const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(playerPokemon!.status).toBeUndefined(); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + expect(playerPokemon!.status).toBeDefined(); + expect(enemyPokemon!.status).toBeUndefined(); + }); +}); diff --git a/test/abilities/costar.test.ts b/test/abilities/costar.test.ts new file mode 100644 index 00000000000..c6a44bffe54 --- /dev/null +++ b/test/abilities/costar.test.ts @@ -0,0 +1,77 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { CommandPhase } from "#app/phases/command-phase"; +import { MessagePhase } from "#app/phases/message-phase"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Abilities - COSTAR", () => { + 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("double"); + game.override.ability(Abilities.COSTAR); + game.override.moveset([Moves.SPLASH, Moves.NASTY_PLOT]); + game.override.enemyMoveset(Moves.SPLASH); + }); + + test("ability copies positive stat stages", async () => { + game.override.enemyAbility(Abilities.BALL_FETCH); + + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); + + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + + game.move.select(Moves.NASTY_PLOT); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); + + expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2); + expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); + + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2); + expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(2); + }); + + test("ability copies negative stat stages", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); + + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + + expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); + expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); + + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2); + expect(rightPokemon.getStatStage(Stat.ATK)).toBe(-2); + }); +}); diff --git a/test/abilities/dancer.test.ts b/test/abilities/dancer.test.ts new file mode 100644 index 00000000000..56c357b2212 --- /dev/null +++ b/test/abilities/dancer.test.ts @@ -0,0 +1,98 @@ +import { BattlerIndex } from "#app/battle"; +import type { MovePhase } from "#app/phases/move-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Dancer", () => { + 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("double"); + }); + + // Reference Link: https://bulbapedia.bulbagarden.net/wiki/Dancer_(Ability) + + it("triggers when dance moves are used, doesn't consume extra PP", async () => { + game.override.enemyAbility(Abilities.DANCER).enemySpecies(Species.MAGIKARP).enemyMoveset(Moves.VICTORY_DANCE); + await game.classicMode.startBattle([Species.ORICORIO, Species.FEEBAS]); + + const [oricorio, feebas] = game.scene.getPlayerField(); + game.move.changeMoveset(oricorio, [Moves.SWORDS_DANCE, Moves.VICTORY_DANCE, Moves.SPLASH]); + game.move.changeMoveset(feebas, [Moves.SWORDS_DANCE, Moves.SPLASH]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SWORDS_DANCE, 1); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("MovePhase"); + // immediately copies ally move + await game.phaseInterceptor.to("MovePhase", false); + let currentPhase = game.scene.getCurrentPhase() as MovePhase; + expect(currentPhase.pokemon).toBe(oricorio); + expect(currentPhase.move.moveId).toBe(Moves.SWORDS_DANCE); + await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MovePhase"); + // immediately copies enemy move + await game.phaseInterceptor.to("MovePhase", false); + currentPhase = game.scene.getCurrentPhase() as MovePhase; + expect(currentPhase.pokemon).toBe(oricorio); + expect(currentPhase.move.moveId).toBe(Moves.VICTORY_DANCE); + await game.phaseInterceptor.to("BerryPhase"); + + // doesn't use PP if copied move is also in moveset + expect(oricorio.moveset[0]?.ppUsed).toBe(0); + expect(oricorio.moveset[1]?.ppUsed).toBe(0); + }); + + // TODO: Enable after Dancer rework to not push to move history + it.todo("should not count as the last move used for mirror move/instruct", async () => { + game.override + .moveset([Moves.FIERY_DANCE, Moves.REVELATION_DANCE]) + .enemyMoveset([Moves.INSTRUCT, Moves.MIRROR_MOVE, Moves.SPLASH]) + .enemySpecies(Species.SHUCKLE) + .enemyLevel(10); + await game.classicMode.startBattle([Species.ORICORIO, Species.FEEBAS]); + + const [oricorio] = game.scene.getPlayerField(); + const [, shuckle2] = game.scene.getEnemyField(); + + game.move.select(Moves.REVELATION_DANCE, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2); + game.move.select(Moves.FIERY_DANCE, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2); + await game.forceEnemyMove(Moves.INSTRUCT, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.MIRROR_MOVE, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MovePhase"); // Oricorio rev dance + await game.phaseInterceptor.to("MovePhase"); // Feebas fiery dance + await game.phaseInterceptor.to("MovePhase"); // Oricorio fiery dance (from dancer) + await game.phaseInterceptor.to("MoveEndPhase", false); + // dancer copied move doesn't appear in move history + expect(oricorio.getLastXMoves(-1)[0].move).toBe(Moves.REVELATION_DANCE); + + await game.phaseInterceptor.to("MovePhase"); // shuckle 2 mirror moves oricorio + await game.phaseInterceptor.to("MovePhase"); // calls instructed rev dance + let currentPhase = game.scene.getCurrentPhase() as MovePhase; + expect(currentPhase.pokemon).toBe(shuckle2); + expect(currentPhase.move.moveId).toBe(Moves.REVELATION_DANCE); + + await game.phaseInterceptor.to("MovePhase"); // shuckle 1 instructs oricorio + await game.phaseInterceptor.to("MovePhase"); + currentPhase = game.scene.getCurrentPhase() as MovePhase; + expect(currentPhase.pokemon).toBe(oricorio); + expect(currentPhase.move.moveId).toBe(Moves.REVELATION_DANCE); + }); +}); diff --git a/src/test/abilities/defiant.test.ts b/test/abilities/defiant.test.ts similarity index 86% rename from src/test/abilities/defiant.test.ts rename to test/abilities/defiant.test.ts index aa8d250dad7..a73002d999c 100644 --- a/src/test/abilities/defiant.test.ts +++ b/test/abilities/defiant.test.ts @@ -3,7 +3,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -24,16 +24,17 @@ describe("Abilities - Defiant", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .enemySpecies(Species.BEEDRILL) .enemyMoveset(Moves.TICKLE) .startingLevel(1) - .moveset([ Moves.SPLASH, Moves.CLOSE_COMBAT ]) + .moveset([Moves.SPLASH, Moves.CLOSE_COMBAT]) .ability(Abilities.DEFIANT); }); it("lower atk and def by 1 via tickle, then increase atk by 4 via defiant", async () => { - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); @@ -45,7 +46,7 @@ describe("Abilities - Defiant", () => { it("lowering your own stats should not trigger defiant", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.CLOSE_COMBAT); @@ -58,7 +59,7 @@ describe("Abilities - Defiant", () => { it("white herb should remove only the negative effects", async () => { game.override.startingHeldItems([{ name: "WHITE_HERB" }]); - await game.classicMode.startBattle([ Species.FLYGON ]); + await game.classicMode.startBattle([Species.FLYGON]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.SPLASH); diff --git a/test/abilities/desolate-land.test.ts b/test/abilities/desolate-land.test.ts new file mode 100644 index 00000000000..67d9ac1cdf5 --- /dev/null +++ b/test/abilities/desolate-land.test.ts @@ -0,0 +1,134 @@ +import { PokeballType } from "#app/enums/pokeball"; +import { WeatherType } from "#app/enums/weather-type"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; + +describe("Abilities - Desolate Land", () => { + 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) + .hasPassiveAbility(true) + .enemySpecies(Species.RALTS) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + /** + * This checks that the weather has changed after the Enemy Pokemon with {@linkcode Abilities.DESOLATE_LAND} + * is forcefully moved out of the field from moves such as Roar {@linkcode Moves.ROAR} + */ + it("should lift only when all pokemon with this ability leave the field", async () => { + game.override.battleType("double").enemyMoveset([Moves.SPLASH, Moves.ROAR]); + await game.classicMode.startBattle([Species.MAGCARGO, Species.MAGCARGO, Species.MAGIKARP, Species.MAGIKARP]); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); + + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { + return min; + }); + + game.move.select(Moves.SPLASH, 0, 2); + game.move.select(Moves.SPLASH, 1, 2); + + await game.forceEnemyMove(Moves.ROAR, 0); + await game.forceEnemyMove(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); + + await game.toNextTurn(); + + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((_range, min = 0) => { + return min + 1; + }); + + game.move.select(Moves.SPLASH, 0, 2); + game.move.select(Moves.SPLASH, 1, 2); + + await game.forceEnemyMove(Moves.ROAR, 1); + await game.forceEnemyMove(Moves.SPLASH, 0); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.weather?.weatherType).not.toBe(WeatherType.HARSH_SUN); + }); + + it("should lift when enemy faints", async () => { + game.override + .battleType("single") + .moveset([Moves.SHEER_COLD]) + .ability(Abilities.NO_GUARD) + .startingLevel(100) + .enemyLevel(1) + .enemyMoveset([Moves.SPLASH]) + .enemySpecies(Species.MAGCARGO) + .enemyHasPassiveAbility(true); + await game.classicMode.startBattle([Species.MAGIKARP]); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); + + game.move.select(Moves.SHEER_COLD); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.weather?.weatherType).not.toBe(WeatherType.HARSH_SUN); + }); + + it("should lift when pokemon returns upon switching from double to single battle", async () => { + game.override.battleType("even-doubles").enemyMoveset([Moves.SPLASH, Moves.MEMENTO]).startingWave(12); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGCARGO]); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); + + game.move.select(Moves.SPLASH, 0, 2); + game.move.select(Moves.SPLASH, 1, 2); + await game.forceEnemyMove(Moves.MEMENTO, 0); + await game.forceEnemyMove(Moves.MEMENTO, 1); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); + + await game.toNextWave(); + + expect(game.scene.arena.weather?.weatherType).not.toBe(WeatherType.HARSH_SUN); + }); + + it("should lift when enemy is captured", async () => { + game.override + .battleType("single") + .enemyMoveset([Moves.SPLASH]) + .enemySpecies(Species.MAGCARGO) + .enemyHasPassiveAbility(true); + await game.classicMode.startBattle([Species.MAGIKARP]); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); + + game.scene.pokeballCounts[PokeballType.MASTER_BALL] = 1; + + game.doThrowPokeball(PokeballType.MASTER_BALL); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.weather?.weatherType).not.toBe(WeatherType.HARSH_SUN); + }); +}); diff --git a/src/test/abilities/disguise.test.ts b/test/abilities/disguise.test.ts similarity index 87% rename from src/test/abilities/disguise.test.ts rename to test/abilities/disguise.test.ts index 0241aa4b9ea..a971f5c2733 100644 --- a/src/test/abilities/disguise.test.ts +++ b/test/abilities/disguise.test.ts @@ -1,14 +1,13 @@ import { BattlerIndex } from "#app/battle"; -import { StatusEffect } from "#app/data/status-effect"; import { toDmgValue } from "#app/utils"; 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 { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Disguise", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -32,7 +31,7 @@ describe("Abilities - Disguise", () => { .enemySpecies(Species.MIMIKYU) .enemyMoveset(Moves.SPLASH) .starterSpecies(Species.REGIELEKI) - .moveset([ Moves.SHADOW_SNEAK, Moves.VACUUM_WAVE, Moves.TOXIC_THREAD, Moves.SPLASH ]); + .moveset([Moves.SHADOW_SNEAK, Moves.VACUUM_WAVE, Moves.TOXIC_THREAD, Moves.SPLASH]); }); it("takes no damage from attacking move and transforms to Busted form, takes 1/8 max HP damage from the disguise breaking", async () => { @@ -67,7 +66,7 @@ describe("Abilities - Disguise", () => { }); it("takes no damage from the first hit of a multihit move and transforms to Busted form, then takes damage from the second hit", async () => { - game.override.moveset([ Moves.SURGING_STRIKES ]); + game.override.moveset([Moves.SURGING_STRIKES]); game.override.enemyLevel(5); await game.classicMode.startBattle(); @@ -107,10 +106,10 @@ describe("Abilities - Disguise", () => { }); it("persists form change when switched out", async () => { - game.override.enemyMoveset([ Moves.SHADOW_SNEAK ]); + game.override.enemyMoveset([Moves.SHADOW_SNEAK]); game.override.starterSpecies(0); - await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]); + await game.classicMode.startBattle([Species.MIMIKYU, Species.FURRET]); const mimikyu = game.scene.getPlayerPokemon()!; const maxHp = mimikyu.getMaxHp(); @@ -134,11 +133,11 @@ describe("Abilities - Disguise", () => { it("persists form change when wave changes with no arena reset", async () => { game.override.starterSpecies(0); game.override.starterForms({ - [Species.MIMIKYU]: bustedForm + [Species.MIMIKYU]: bustedForm, }); - await game.classicMode.startBattle([ Species.FURRET, Species.MIMIKYU ]); + await game.classicMode.startBattle([Species.FURRET, Species.MIMIKYU]); - const mimikyu = game.scene.getParty()[1]!; + const mimikyu = game.scene.getPlayerParty()[1]!; expect(mimikyu.formIndex).toBe(bustedForm); game.move.select(Moves.SPLASH); @@ -152,7 +151,7 @@ describe("Abilities - Disguise", () => { game.override.startingWave(4); game.override.starterSpecies(Species.MIMIKYU); game.override.starterForms({ - [Species.MIMIKYU]: bustedForm + [Species.MIMIKYU]: bustedForm, }); await game.classicMode.startBattle(); @@ -172,10 +171,10 @@ describe("Abilities - Disguise", () => { game.override.startingWave(10); game.override.starterSpecies(0); game.override.starterForms({ - [Species.MIMIKYU]: bustedForm + [Species.MIMIKYU]: bustedForm, }); - await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]); + await game.classicMode.startBattle([Species.MIMIKYU, Species.FURRET]); const mimikyu1 = game.scene.getPlayerPokemon()!; @@ -193,7 +192,7 @@ describe("Abilities - Disguise", () => { }); it("doesn't faint twice when fainting due to Disguise break damage, nor prevent faint from Disguise break damage if using Endure", async () => { - game.override.enemyMoveset([ Moves.ENDURE ]); + game.override.enemyMoveset([Moves.ENDURE]); await game.classicMode.startBattle(); const mimikyu = game.scene.getEnemyPokemon()!; @@ -208,7 +207,7 @@ describe("Abilities - Disguise", () => { it("activates when Aerilate circumvents immunity to the move's base type", async () => { game.override.ability(Abilities.AERILATE); - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); await game.classicMode.startBattle(); @@ -225,13 +224,11 @@ describe("Abilities - Disguise", () => { }); it("doesn't trigger if user is behind a substitute", async () => { - game.override - .enemyMoveset(Moves.SUBSTITUTE) - .moveset(Moves.POWER_TRIP); + game.override.enemyMoveset(Moves.SUBSTITUTE).moveset(Moves.POWER_TRIP); await game.classicMode.startBattle(); game.move.select(Moves.POWER_TRIP); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(game.scene.getEnemyPokemon()!.formIndex).toBe(disguisedForm); diff --git a/src/test/abilities/dry_skin.test.ts b/test/abilities/dry_skin.test.ts similarity index 93% rename from src/test/abilities/dry_skin.test.ts rename to test/abilities/dry_skin.test.ts index 314564df15c..9d8a29c431a 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/test/abilities/dry_skin.test.ts @@ -1,7 +1,7 @@ import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -28,7 +28,7 @@ describe("Abilities - Dry Skin", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.CHARMANDER) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH, Moves.WATER_GUN ]) + .moveset([Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH, Moves.WATER_GUN]) .starterSpecies(Species.CHANDELURE); }); @@ -69,7 +69,7 @@ describe("Abilities - Dry Skin", () => { }); it("opposing fire attacks do 25% more damage", async () => { - game.override.moveset([ Moves.FLAMETHROWER ]); + game.override.moveset([Moves.FLAMETHROWER]); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; @@ -105,7 +105,7 @@ describe("Abilities - Dry Skin", () => { }); it("opposing water attacks do not heal if they were protected from", async () => { - game.override.enemyMoveset([ Moves.PROTECT ]); + game.override.enemyMoveset([Moves.PROTECT]); await game.classicMode.startBattle(); @@ -119,7 +119,7 @@ describe("Abilities - Dry Skin", () => { }); it("multi-strike water attacks only heal once", async () => { - game.override.moveset([ Moves.WATER_GUN, Moves.WATER_SHURIKEN ]); + game.override.moveset([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); await game.classicMode.startBattle(); diff --git a/src/test/abilities/early_bird.test.ts b/test/abilities/early_bird.test.ts similarity index 89% rename from src/test/abilities/early_bird.test.ts rename to test/abilities/early_bird.test.ts index a69290fa1e4..cc486672c95 100644 --- a/src/test/abilities/early_bird.test.ts +++ b/test/abilities/early_bird.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -25,7 +25,7 @@ describe("Abilities - Early Bird", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.REST, Moves.BELLY_DRUM, Moves.SPLASH ]) + .moveset([Moves.REST, Moves.BELLY_DRUM, Moves.SPLASH]) .ability(Abilities.EARLY_BIRD) .battleType("single") .disableCrits() @@ -35,7 +35,7 @@ describe("Abilities - Early Bird", () => { }); it("reduces Rest's sleep time to 1 turn", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; @@ -60,7 +60,7 @@ describe("Abilities - Early Bird", () => { }); it("reduces 3-turn sleep to 1 turn", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.status = new Status(StatusEffect.SLEEP, 0, 4); @@ -79,7 +79,7 @@ describe("Abilities - Early Bird", () => { }); it("reduces 1-turn sleep to 0 turns", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.status = new Status(StatusEffect.SLEEP, 0, 2); diff --git a/src/test/abilities/flash_fire.test.ts b/test/abilities/flash_fire.test.ts similarity index 77% rename from src/test/abilities/flash_fire.test.ts rename to test/abilities/flash_fire.test.ts index f03e1689649..3cec9cd9cb7 100644 --- a/src/test/abilities/flash_fire.test.ts +++ b/test/abilities/flash_fire.test.ts @@ -1,12 +1,12 @@ import { BattlerIndex } from "#app/battle"; -import { StatusEffect } from "#app/data/status-effect"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { Species } from "#app/enums/species"; import { MovePhase } from "#app/phases/move-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -35,10 +35,9 @@ describe("Abilities - Flash Fire", () => { .disableCrits(); }); - it("immune to Fire-type moves", async () => { - game.override.enemyMoveset([ Moves.EMBER ]).moveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.BLISSEY ]); + game.override.enemyMoveset([Moves.EMBER]).moveset(Moves.SPLASH); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -48,8 +47,8 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("not activate if the Pokémon is protected from the Fire-type move", async () => { - game.override.enemyMoveset([ Moves.EMBER ]).moveset([ Moves.PROTECT ]); - await game.classicMode.startBattle([ Species.BLISSEY ]); + game.override.enemyMoveset([Moves.EMBER]).moveset([Moves.PROTECT]); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -59,8 +58,8 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("activated by Will-O-Wisp", async () => { - game.override.enemyMoveset([ Moves.WILL_O_WISP ]).moveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.BLISSEY ]); + game.override.enemyMoveset([Moves.WILL_O_WISP]).moveset(Moves.SPLASH); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -74,9 +73,9 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("activated after being frozen", async () => { - game.override.enemyMoveset([ Moves.EMBER ]).moveset(Moves.SPLASH); + game.override.enemyMoveset([Moves.EMBER]).moveset(Moves.SPLASH); game.override.statusEffect(StatusEffect.FREEZE); - await game.classicMode.startBattle([ Species.BLISSEY ]); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -87,12 +86,12 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("not passing with baton pass", async () => { - game.override.enemyMoveset([ Moves.EMBER ]).moveset([ Moves.BATON_PASS ]); - await game.classicMode.startBattle([ Species.BLISSEY, Species.CHANSEY ]); + game.override.enemyMoveset([Moves.EMBER]).moveset([Moves.BATON_PASS]); + await game.classicMode.startBattle([Species.BLISSEY, Species.CHANSEY]); // ensure use baton pass after enemy moved game.move.select(Moves.BATON_PASS); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); game.doSelectPartyPokemon(1); @@ -103,16 +102,16 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("boosts Fire-type move when the ability is activated", async () => { - game.override.enemyMoveset([ Moves.FIRE_PLEDGE ]).moveset([ Moves.EMBER, Moves.SPLASH ]); + game.override.enemyMoveset([Moves.FIRE_PLEDGE]).moveset([Moves.EMBER, Moves.SPLASH]); game.override.enemyAbility(Abilities.FLASH_FIRE).ability(Abilities.NONE); - await game.classicMode.startBattle([ Species.BLISSEY ]); + await game.classicMode.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; const initialHP = 1000; blissey.hp = initialHP; // first turn game.move.select(Moves.EMBER); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to(TurnEndPhase); const originalDmg = initialHP - blissey.hp; @@ -131,7 +130,7 @@ describe("Abilities - Flash Fire", () => { game.override.moveset(Moves.FIRE_PLEDGE).enemyMoveset(Moves.EMBER); game.override.enemyAbility(Abilities.NONE).ability(Abilities.FLASH_FIRE); game.override.enemySpecies(Species.BLISSEY); - await game.classicMode.startBattle([ Species.RATTATA ]); + await game.classicMode.startBattle([Species.RATTATA]); const blissey = game.scene.getEnemyPokemon()!; const initialHP = 1000; @@ -139,7 +138,7 @@ describe("Abilities - Flash Fire", () => { // first turn game.move.select(Moves.FIRE_PLEDGE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); await game.move.forceMiss(); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/src/test/abilities/flower_gift.test.ts b/test/abilities/flower_gift.test.ts similarity index 83% rename from src/test/abilities/flower_gift.test.ts rename to test/abilities/flower_gift.test.ts index 04ada598f22..fff509a1f00 100644 --- a/src/test/abilities/flower_gift.test.ts +++ b/test/abilities/flower_gift.test.ts @@ -4,7 +4,7 @@ import { Stat } from "#app/enums/stat"; import { WeatherType } from "#app/enums/weather-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -21,7 +21,7 @@ describe("Abilities - Flower Gift", () => { */ const testRevertFormAgainstAbility = async (game: GameManager, ability: Abilities) => { game.override.starterForms({ [Species.CASTFORM]: SUNSHINE_FORM }).enemyAbility(ability); - await game.classicMode.startBattle([ Species.CASTFORM ]); + await game.classicMode.startBattle([Species.CASTFORM]); game.move.select(Moves.SPLASH); @@ -41,7 +41,7 @@ describe("Abilities - Flower Gift", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SKILL_SWAP ]) + .moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SKILL_SWAP]) .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH); @@ -50,9 +50,9 @@ describe("Abilities - Flower Gift", () => { // TODO: Uncomment expect statements when the ability is implemented - currently does not increase stats of allies it("increases the ATK and SPDEF stat stages of the Pokémon with this Ability and its allies by 1.5× during Harsh Sunlight", async () => { game.override.battleType("double"); - await game.classicMode.startBattle([ Species.CHERRIM, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]); - const [ cherrim ] = game.scene.getPlayerField(); + const [cherrim] = game.scene.getPlayerField(); const cherrimAtkStat = cherrim.getEffectiveStat(Stat.ATK); const cherrimSpDefStat = cherrim.getEffectiveStat(Stat.SPDEF); @@ -62,7 +62,7 @@ describe("Abilities - Flower Gift", () => { game.move.select(Moves.SUNNY_DAY, 0); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("TurnEndPhase"); expect(cherrim.formIndex).toBe(SUNSHINE_FORM); @@ -74,7 +74,7 @@ describe("Abilities - Flower Gift", () => { it("changes the Pokemon's form during Harsh Sunlight", async () => { game.override.weather(WeatherType.HARSH_SUN); - await game.classicMode.startBattle([ Species.CHERRIM ]); + await game.classicMode.startBattle([Species.CHERRIM]); const cherrim = game.scene.getPlayerPokemon()!; expect(cherrim.formIndex).toBe(SUNSHINE_FORM); @@ -91,9 +91,9 @@ describe("Abilities - Flower Gift", () => { }); it("reverts to Overcast Form when the Pokémon loses Flower Gift, changes form under Harsh Sunlight/Sunny when it regains it", async () => { - game.override.enemyMoveset([ Moves.SKILL_SWAP ]).weather(WeatherType.HARSH_SUN); + game.override.enemyMoveset([Moves.SKILL_SWAP]).weather(WeatherType.HARSH_SUN); - await game.classicMode.startBattle([ Species.CHERRIM ]); + await game.classicMode.startBattle([Species.CHERRIM]); const cherrim = game.scene.getPlayerPokemon()!; @@ -110,16 +110,16 @@ describe("Abilities - Flower Gift", () => { }); it("reverts to Overcast Form when the Flower Gift is suppressed, changes form under Harsh Sunlight/Sunny when it regains it", async () => { - game.override.enemyMoveset([ Moves.GASTRO_ACID ]).weather(WeatherType.HARSH_SUN); + game.override.enemyMoveset([Moves.GASTRO_ACID]).weather(WeatherType.HARSH_SUN); - await game.classicMode.startBattle([ Species.CHERRIM, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]); const cherrim = game.scene.getPlayerPokemon()!; expect(cherrim.formIndex).toBe(SUNSHINE_FORM); game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(cherrim.summonData.abilitySuppressed).toBe(true); @@ -140,7 +140,7 @@ describe("Abilities - Flower Gift", () => { it("should be in Overcast Form after the user is switched out", async () => { game.override.weather(WeatherType.SUNNY); - await game.classicMode.startBattle([ Species.CASTFORM, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.CASTFORM, Species.MAGIKARP]); const cherrim = game.scene.getPlayerPokemon()!; expect(cherrim.formIndex).toBe(SUNSHINE_FORM); diff --git a/src/test/abilities/forecast.test.ts b/test/abilities/forecast.test.ts similarity index 53% rename from src/test/abilities/forecast.test.ts rename to test/abilities/forecast.test.ts index 6da31307789..bdc32604bba 100644 --- a/src/test/abilities/forecast.test.ts +++ b/test/abilities/forecast.test.ts @@ -2,14 +2,14 @@ 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"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -30,7 +30,7 @@ describe("Abilities - Forecast", () => { */ const testWeatherFormChange = async (game: GameManager, weather: WeatherType, form: number, initialForm?: number) => { game.override.weather(weather).starterForms({ [Species.CASTFORM]: initialForm }); - await game.startBattle([ Species.CASTFORM ]); + await game.startBattle([Species.CASTFORM]); game.move.select(Moves.SPLASH); @@ -44,7 +44,7 @@ describe("Abilities - Forecast", () => { */ const testRevertFormAgainstAbility = async (game: GameManager, ability: Abilities) => { game.override.starterForms({ [Species.CASTFORM]: SUNNY_FORM }).enemyAbility(ability); - await game.startBattle([ Species.CASTFORM ]); + await game.startBattle([Species.CASTFORM]); game.move.select(Moves.SPLASH); @@ -64,121 +64,132 @@ describe("Abilities - Forecast", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.TACKLE ]) + .moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.TACKLE]) .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH); }); - it("changes form based on weather", async () => { - game.override - .moveset([ Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SNOWSCAPE, Moves.SPLASH ]) - .battleType("double") - .starterForms({ - [Species.KYOGRE]: 1, - [Species.GROUDON]: 1, - [Species.RAYQUAZA]: 1 - }); - await game.startBattle([ Species.CASTFORM, Species.FEEBAS, Species.KYOGRE, Species.GROUDON, Species.RAYQUAZA, Species.ALTARIA ]); + it( + "changes form based on weather", + async () => { + game.override + .moveset([Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SNOWSCAPE, Moves.SPLASH]) + .battleType("double") + .starterForms({ + [Species.KYOGRE]: 1, + [Species.GROUDON]: 1, + [Species.RAYQUAZA]: 1, + }); + await game.startBattle([ + Species.CASTFORM, + Species.FEEBAS, + Species.KYOGRE, + Species.GROUDON, + Species.RAYQUAZA, + Species.ALTARIA, + ]); - vi.spyOn(game.scene.getParty()[5], "getAbility").mockReturnValue(allAbilities[Abilities.CLOUD_NINE]); + vi.spyOn(game.scene.getPlayerParty()[5], "getAbility").mockReturnValue(allAbilities[Abilities.CLOUD_NINE]); - const castform = game.scene.getPlayerField()[0]; - expect(castform.formIndex).toBe(NORMAL_FORM); + const castform = game.scene.getPlayerField()[0]; + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.RAIN_DANCE); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.RAIN_DANCE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(RAINY_FORM); + expect(castform.formIndex).toBe(RAINY_FORM); - game.move.select(Moves.SUNNY_DAY); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SUNNY_DAY); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SUNNY_FORM); + expect(castform.formIndex).toBe(SUNNY_FORM); - game.move.select(Moves.SNOWSCAPE); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SNOWSCAPE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SNOWY_FORM); + expect(castform.formIndex).toBe(SNOWY_FORM); - game.override.moveset([ Moves.HAIL, Moves.SANDSTORM, Moves.SNOWSCAPE, Moves.SPLASH ]); + game.override.moveset([Moves.HAIL, Moves.SANDSTORM, Moves.SNOWSCAPE, Moves.SPLASH]); - game.move.select(Moves.SANDSTORM); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SANDSTORM); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(NORMAL_FORM); + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.HAIL); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.HAIL); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SNOWY_FORM); + expect(castform.formIndex).toBe(SNOWY_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(2); // Feebas now 2, Kyogre 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); // Feebas now 2, Kyogre 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(RAINY_FORM); + expect(castform.formIndex).toBe(RAINY_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(3); // Kyogre now 3, Groudon 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(3); // Kyogre now 3, Groudon 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SUNNY_FORM); + expect(castform.formIndex).toBe(SUNNY_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(4); // Groudon now 4, Rayquaza 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(4); // Groudon now 4, Rayquaza 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(NORMAL_FORM); + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(2); // Rayquaza now 2, Feebas 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); // Rayquaza now 2, Feebas 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(NORMAL_FORM); + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.SNOWSCAPE); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SNOWSCAPE); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SNOWY_FORM); + expect(castform.formIndex).toBe(SNOWY_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(5); // Feebas now 5, Altaria 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(5); // Feebas now 5, Altaria 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(NORMAL_FORM); + expect(castform.formIndex).toBe(NORMAL_FORM); - game.move.select(Moves.SPLASH); - game.doSwitchPokemon(5); // Altaria now 5, Feebas 1 - await game.phaseInterceptor.to("MovePhase"); - await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(5); // Altaria now 5, Feebas 1 + await game.phaseInterceptor.to("MovePhase"); + await game.toNextTurn(); - expect(castform.formIndex).toBe(SNOWY_FORM); + expect(castform.formIndex).toBe(SNOWY_FORM); - game.scene.arena.trySetWeather(WeatherType.FOG, false); - game.move.select(Moves.SPLASH); - game.move.select(Moves.SPLASH, 1); - await game.phaseInterceptor.to("TurnStartPhase"); + game.scene.arena.trySetWeather(WeatherType.FOG, false); + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("TurnStartPhase"); - expect(castform.formIndex).toBe(NORMAL_FORM); - }, 30 * 1000); + expect(castform.formIndex).toBe(NORMAL_FORM); + }, + 30 * 1000, + ); it("reverts to Normal Form during Clear weather", async () => { await testWeatherFormChange(game, WeatherType.NONE, NORMAL_FORM, SUNNY_FORM); @@ -190,7 +201,7 @@ describe("Abilities - Forecast", () => { it("has no effect on Pokémon other than Castform", async () => { game.override.enemyAbility(Abilities.FORECAST).enemySpecies(Species.SHUCKLE); - await game.startBattle([ Species.CASTFORM ]); + await game.startBattle([Species.CASTFORM]); game.move.select(Moves.RAIN_DANCE); await game.phaseInterceptor.to(TurnEndPhase); @@ -200,8 +211,11 @@ describe("Abilities - Forecast", () => { }); it("reverts to Normal Form when Castform loses Forecast, changes form to match the weather when it regains it", async () => { - game.override.moveset([ Moves.SKILL_SWAP, Moves.WORRY_SEED, Moves.SPLASH ]).weather(WeatherType.RAIN).battleType("double"); - await game.startBattle([ Species.CASTFORM, Species.FEEBAS ]); + game.override + .moveset([Moves.SKILL_SWAP, Moves.WORRY_SEED, Moves.SPLASH]) + .weather(WeatherType.RAIN) + .battleType("double"); + await game.startBattle([Species.CASTFORM, Species.FEEBAS]); const castform = game.scene.getPlayerField()[0]; @@ -209,7 +223,7 @@ describe("Abilities - Forecast", () => { game.move.select(Moves.SKILL_SWAP, 0, BattlerIndex.PLAYER_2); game.move.select(Moves.SKILL_SWAP, 1, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); expect(castform.formIndex).toBe(NORMAL_FORM); @@ -221,22 +235,22 @@ describe("Abilities - Forecast", () => { game.move.select(Moves.SPLASH); game.move.select(Moves.WORRY_SEED, 1, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); expect(castform.formIndex).toBe(NORMAL_FORM); }); it("reverts to Normal Form when Forecast is suppressed, changes form to match the weather when it regains it", async () => { - game.override.enemyMoveset([ Moves.GASTRO_ACID ]).weather(WeatherType.RAIN); - await game.startBattle([ Species.CASTFORM, Species.PIKACHU ]); + game.override.enemyMoveset([Moves.GASTRO_ACID]).weather(WeatherType.RAIN); + await game.startBattle([Species.CASTFORM, Species.PIKACHU]); const castform = game.scene.getPlayerPokemon()!; expect(castform.formIndex).toBe(RAINY_FORM); // First turn - Forecast is suppressed game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.move.forceHit(); await game.phaseInterceptor.to(TurnEndPhase); @@ -259,8 +273,8 @@ describe("Abilities - Forecast", () => { }); it("does not change Castform's form until after Stealth Rock deals damage", async () => { - game.override.weather(WeatherType.RAIN).enemyMoveset([ Moves.STEALTH_ROCK ]); - await game.startBattle([ Species.PIKACHU, Species.CASTFORM ]); + game.override.weather(WeatherType.RAIN).enemyMoveset([Moves.STEALTH_ROCK]); + await game.startBattle([Species.PIKACHU, Species.CASTFORM]); // First turn - set up stealth rock game.move.select(Moves.SPLASH); @@ -273,7 +287,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 @@ -284,7 +298,7 @@ describe("Abilities - Forecast", () => { it("should be in Normal Form after the user is switched out", async () => { game.override.weather(WeatherType.RAIN); - await game.startBattle([ Species.CASTFORM, Species.MAGIKARP ]); + await game.startBattle([Species.CASTFORM, Species.MAGIKARP]); const castform = game.scene.getPlayerPokemon()!; expect(castform.formIndex).toBe(RAINY_FORM); diff --git a/test/abilities/friend_guard.test.ts b/test/abilities/friend_guard.test.ts new file mode 100644 index 00000000000..30175fe37e0 --- /dev/null +++ b/test/abilities/friend_guard.test.ts @@ -0,0 +1,123 @@ +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { BattlerIndex } from "#app/battle"; +import { allAbilities } from "#app/data/ability"; +import { allMoves } from "#app/data/moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; + +describe("Moves - Friend Guard", () => { + 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("double") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.TACKLE, Moves.SPLASH, Moves.DRAGON_RAGE]) + .enemySpecies(Species.SHUCKLE) + .moveset([Moves.SPLASH]) + .startingLevel(100); + }); + + it("should reduce damage that other allied Pokémon receive from attacks (from any Pokémon) by 25%", async () => { + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); + const [player1, player2] = game.scene.getPlayerField(); + const spy = vi.spyOn(player1, "getAttackDamage"); + + const enemy1 = game.scene.getEnemyField()[0]; + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + // Get the last return value from `getAttackDamage` + const turn1Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + // Making sure the test is controlled; turn 1 damage is equal to base damage (after rounding) + expect(turn1Damage).toBe(Math.floor(player1.getBaseDamage(enemy1, allMoves[Moves.TACKLE], MoveCategory.PHYSICAL))); + + vi.spyOn(player2, "getAbility").mockReturnValue(allAbilities[Abilities.FRIEND_GUARD]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + // Get the last return value from `getAttackDamage` + const turn2Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + // With the ally's Friend Guard, damage should have been reduced from base damage by 25% + expect(turn2Damage).toBe( + Math.floor(player1.getBaseDamage(enemy1, allMoves[Moves.TACKLE], MoveCategory.PHYSICAL) * 0.75), + ); + }); + + it("should NOT reduce damage to pokemon with friend guard", async () => { + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); + + const player2 = game.scene.getPlayerField()[1]; + const spy = vi.spyOn(player2, "getAttackDamage"); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const turn1Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + + vi.spyOn(player2, "getAbility").mockReturnValue(allAbilities[Abilities.FRIEND_GUARD]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const turn2Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + expect(turn2Damage).toBe(turn1Damage); + }); + + it("should NOT reduce damage from fixed damage attacks", async () => { + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); + + const [player1, player2] = game.scene.getPlayerField(); + const spy = vi.spyOn(player1, "getAttackDamage"); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.DRAGON_RAGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const turn1Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + expect(turn1Damage).toBe(40); + + vi.spyOn(player2, "getAbility").mockReturnValue(allAbilities[Abilities.FRIEND_GUARD]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.DRAGON_RAGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const turn2Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + expect(turn2Damage).toBe(40); + }); +}); diff --git a/src/test/abilities/galvanize.test.ts b/test/abilities/galvanize.test.ts similarity index 85% rename from src/test/abilities/galvanize.test.ts rename to test/abilities/galvanize.test.ts index 438f166174d..c1e02c6c8d8 100644 --- a/src/test/abilities/galvanize.test.ts +++ b/test/abilities/galvanize.test.ts @@ -1,15 +1,14 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; -import { Type } from "#app/data/type"; +import { allMoves } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { HitResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Abilities - Galvanize", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,7 +30,7 @@ describe("Abilities - Galvanize", () => { .battleType("single") .startingLevel(100) .ability(Abilities.GALVANIZE) - .moveset([ Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES ]) + .moveset([Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES]) .enemySpecies(Species.DUSCLOPS) .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) @@ -54,7 +53,7 @@ describe("Abilities - Galvanize", () => { await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.EFFECTIVE); expect(move.calculateBattlePower).toHaveReturnedWith(48); expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); @@ -77,7 +76,7 @@ describe("Abilities - Galvanize", () => { await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.NO_EFFECT); expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); }); @@ -85,7 +84,7 @@ describe("Abilities - Galvanize", () => { it("should not change the type of variable-type moves", async () => { game.override.enemySpecies(Species.MIGHTYENA); - await game.startBattle([ Species.ESPEON ]); + await game.startBattle([Species.ESPEON]); const playerPokemon = game.scene.getPlayerPokemon()!; vi.spyOn(playerPokemon, "getMoveType"); @@ -96,7 +95,7 @@ describe("Abilities - Galvanize", () => { game.move.select(Moves.REVELATION_DANCE); await game.phaseInterceptor.to("BerryPhase", false); - expect(playerPokemon.getMoveType).not.toHaveLastReturnedWith(Type.ELECTRIC); + expect(playerPokemon.getMoveType).not.toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.NO_EFFECT); expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); }); @@ -111,7 +110,7 @@ describe("Abilities - Galvanize", () => { vi.spyOn(enemyPokemon, "apply"); game.move.select(Moves.FURY_SWIPES); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("MoveEffectPhase"); @@ -122,7 +121,7 @@ describe("Abilities - Galvanize", () => { const enemyStartingHp = enemyPokemon.hp; await game.phaseInterceptor.to("MoveEffectPhase"); - expect(playerPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(playerPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); } diff --git a/test/abilities/good_as_gold.test.ts b/test/abilities/good_as_gold.test.ts new file mode 100644 index 00000000000..7cc543c4a0d --- /dev/null +++ b/test/abilities/good_as_gold.test.ts @@ -0,0 +1,143 @@ +import { BattlerIndex } from "#app/battle"; +import { allAbilities } from "#app/data/ability"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Stat } from "#app/enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +import { WeatherType } from "#app/enums/weather-type"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Good As Gold", () => { + 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]) + .ability(Abilities.GOOD_AS_GOLD) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should block normal status moves", async () => { + game.override.enemyMoveset([Moves.GROWL]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + const player = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH, 0); + + await game.phaseInterceptor.to("BerryPhase"); + + expect(player.battleData.abilitiesApplied[0]).toBe(Abilities.GOOD_AS_GOLD); + expect(player.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should block memento and prevent the user from fainting", async () => { + game.override.enemyMoveset([Moves.MEMENTO]); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.move.select(Moves.MEMENTO); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.isFainted()).toBe(false); + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not block any status moves that target the field, one side, or all pokemon", async () => { + game.override.battleType("double"); + game.override.enemyMoveset([Moves.STEALTH_ROCK, Moves.HAZE]); + game.override.moveset([Moves.SWORDS_DANCE, Moves.SAFEGUARD]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); + const [good_as_gold, ball_fetch] = game.scene.getPlayerField(); + + // Force second pokemon to have ball fetch to isolate to a single mon. + vi.spyOn(ball_fetch, "getAbility").mockReturnValue(allAbilities[Abilities.BALL_FETCH]); + + game.move.select(Moves.SWORDS_DANCE, 0); + game.move.select(Moves.SAFEGUARD, 1); + await game.forceEnemyMove(Moves.STEALTH_ROCK); + await game.forceEnemyMove(Moves.HAZE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("BerryPhase"); + expect(good_as_gold.getAbility().id).toBe(Abilities.GOOD_AS_GOLD); + expect(good_as_gold.getStatStage(Stat.ATK)).toBe(0); + expect(game.scene.arena.getTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER)).toBeDefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaTagSide.PLAYER)).toBeDefined(); + }); + + it("should not block field targeted effects in singles", async () => { + game.override.battleType("single"); + game.override.enemyMoveset([Moves.SPIKES]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH, 0); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)).toBeDefined(); + }); + + it("should block the ally's helping hand", async () => { + game.override.battleType("double"); + game.override.moveset([Moves.HELPING_HAND, Moves.TACKLE]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); + + game.move.select(Moves.HELPING_HAND, 0); + game.move.select(Moves.TACKLE, 1); + await game.phaseInterceptor.to("MoveEndPhase", true); + + expect(game.scene.getPlayerField()[1].getTag(BattlerTagType.HELPING_HAND)).toBeUndefined(); + }); + + it("should block the ally's heal bell, but only if the good as gold user is on the field", async () => { + game.override.battleType("double"); + game.override.moveset([Moves.HEAL_BELL, Moves.SPLASH]); + game.override.statusEffect(StatusEffect.BURN); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS, Species.ABRA]); + const [good_as_gold, ball_fetch] = game.scene.getPlayerField(); + + // Force second pokemon to have ball fetch to isolate to a single mon. + vi.spyOn(ball_fetch, "getAbility").mockReturnValue(allAbilities[Abilities.BALL_FETCH]); + + // turn 1 + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.HEAL_BELL, 1); + await game.toNextTurn(); + expect(good_as_gold.status?.effect).toBe(StatusEffect.BURN); + + game.doSwitchPokemon(2); + game.move.select(Moves.HEAL_BELL, 0); + await game.toNextTurn(); + expect(good_as_gold.status?.effect).toBeUndefined(); + }); + + it("should not block field targeted effects like rain dance", async () => { + game.override.battleType("single"); + game.override.enemyMoveset([Moves.RAIN_DANCE]); + game.override.weather(WeatherType.NONE); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH, 0); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.RAIN); + }); +}); diff --git a/src/test/abilities/gorilla_tactics.test.ts b/test/abilities/gorilla_tactics.test.ts similarity index 83% rename from src/test/abilities/gorilla_tactics.test.ts rename to test/abilities/gorilla_tactics.test.ts index 8aee365eb8f..48dab262b82 100644 --- a/src/test/abilities/gorilla_tactics.test.ts +++ b/test/abilities/gorilla_tactics.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -25,15 +25,15 @@ describe("Abilities - Gorilla Tactics", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH, Moves.DISABLE ]) + .enemyMoveset([Moves.SPLASH, Moves.DISABLE]) .enemySpecies(Species.MAGIKARP) .enemyLevel(30) - .moveset([ Moves.SPLASH, Moves.TACKLE, Moves.GROWL ]) + .moveset([Moves.SPLASH, Moves.TACKLE, Moves.GROWL]) .ability(Abilities.GORILLA_TACTICS); }); it("boosts the Pokémon's Attack by 50%, but limits the Pokémon to using only one move", async () => { - await game.classicMode.startBattle([ Species.GALAR_DARMANITAN ]); + await game.classicMode.startBattle([Species.GALAR_DARMANITAN]); const darmanitan = game.scene.getPlayerPokemon()!; const initialAtkStat = darmanitan.getStat(Stat.ATK); @@ -50,7 +50,7 @@ describe("Abilities - Gorilla Tactics", () => { }); it("should struggle if the only usable move is disabled", async () => { - await game.classicMode.startBattle([ Species.GALAR_DARMANITAN ]); + await game.classicMode.startBattle([Species.GALAR_DARMANITAN]); const darmanitan = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -64,7 +64,7 @@ describe("Abilities - Gorilla Tactics", () => { game.move.select(Moves.GROWL); await game.forceEnemyMove(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(enemy.getStatStage(Stat.ATK)).toBe(-1); // Only the effect of the first Growl should be applied @@ -73,7 +73,7 @@ describe("Abilities - Gorilla Tactics", () => { await game.toNextTurn(); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(darmanitan.hp).toBeLessThan(darmanitan.getMaxHp()); diff --git a/src/test/abilities/gulp_missile.test.ts b/test/abilities/gulp_missile.test.ts similarity index 83% rename from src/test/abilities/gulp_missile.test.ts rename to test/abilities/gulp_missile.test.ts index 01b68d0c89d..8ebd583d3ab 100644 --- a/src/test/abilities/gulp_missile.test.ts +++ b/test/abilities/gulp_missile.test.ts @@ -1,12 +1,12 @@ import { BattlerIndex } from "#app/battle"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -25,7 +25,7 @@ describe("Abilities - Gulp Missile", () => { * @returns The effect damage of Gulp Missile */ const getEffectDamage = (pokemon: Pokemon): number => { - return Math.max(1, Math.floor(pokemon.getMaxHp() * 1 / 4)); + return Math.max(1, Math.floor((pokemon.getMaxHp() * 1) / 4)); }; beforeAll(() => { @@ -43,7 +43,7 @@ describe("Abilities - Gulp Missile", () => { game.override .disableCrits() .battleType("single") - .moveset([ Moves.SURF, Moves.DIVE, Moves.SPLASH, Moves.SUBSTITUTE ]) + .moveset([Moves.SURF, Moves.DIVE, Moves.SPLASH, Moves.SUBSTITUTE]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) @@ -51,7 +51,7 @@ describe("Abilities - Gulp Missile", () => { }); it("changes to Gulping Form if HP is over half when Surf or Dive is used", async () => { - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; game.move.select(Moves.DIVE); @@ -59,17 +59,17 @@ describe("Abilities - Gulp Missile", () => { game.move.select(Moves.DIVE); await game.phaseInterceptor.to("MoveEndPhase"); - expect(cramorant.getHpRatio()).toBeGreaterThanOrEqual(.5); + expect(cramorant.getHpRatio()).toBeGreaterThanOrEqual(0.5); expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeDefined(); expect(cramorant.formIndex).toBe(GULPING_FORM); }); it("changes to Gorging Form if HP is under half when Surf or Dive is used", async () => { - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.49); - expect(cramorant.getHpRatio()).toBe(.49); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.49); + expect(cramorant.getHpRatio()).toBe(0.49); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -79,7 +79,7 @@ describe("Abilities - Gulp Missile", () => { }); it("changes to base form when switched out after Surf or Dive is used", async () => { - await game.classicMode.startBattle([ Species.CRAMORANT, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.CRAMORANT, Species.MAGIKARP]); const cramorant = game.scene.getPlayerPokemon()!; game.move.select(Moves.SURF); @@ -94,7 +94,7 @@ describe("Abilities - Gulp Missile", () => { }); it("changes form during Dive's charge turn", async () => { - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; game.move.select(Moves.DIVE); @@ -106,7 +106,7 @@ describe("Abilities - Gulp Missile", () => { it("deals 1/4 of the attacker's maximum HP when hit by a damaging attack", async () => { game.override.enemyMoveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "damageAndUpdate"); @@ -119,10 +119,10 @@ describe("Abilities - Gulp Missile", () => { it("does not have any effect when hit by non-damaging attack", async () => { game.override.enemyMoveset(Moves.TAIL_WHIP); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -138,13 +138,13 @@ describe("Abilities - Gulp Missile", () => { it("lowers attacker's DEF stat stage by 1 when hit in Gulping form", async () => { game.override.enemyMoveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "damageAndUpdate"); - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -162,13 +162,13 @@ describe("Abilities - Gulp Missile", () => { it("paralyzes the enemy when hit in Gorging form", async () => { game.override.enemyMoveset(Moves.TACKLE); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "damageAndUpdate"); - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.45); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.45); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -186,7 +186,7 @@ describe("Abilities - Gulp Missile", () => { it("does not activate the ability when underwater", async () => { game.override.enemyMoveset(Moves.SURF); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -199,12 +199,12 @@ describe("Abilities - Gulp Missile", () => { it("prevents effect damage but inflicts secondary effect on attacker with Magic Guard", async () => { game.override.enemyMoveset(Moves.TACKLE).enemyAbility(Abilities.MAGIC_GUARD); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -223,7 +223,7 @@ describe("Abilities - Gulp Missile", () => { it("activates on faint", async () => { game.override.enemyMoveset(Moves.THUNDERBOLT); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -237,10 +237,8 @@ describe("Abilities - Gulp Missile", () => { }); it("doesn't trigger if user is behind a substitute", async () => { - game.override - .enemyAbility(Abilities.STURDY) - .enemyMoveset([ Moves.SPLASH, Moves.POWER_TRIP ]); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + game.override.enemyAbility(Abilities.STURDY).enemyMoveset([Moves.SPLASH, Moves.POWER_TRIP]); + await game.classicMode.startBattle([Species.CRAMORANT]); game.move.select(Moves.SURF); await game.forceEnemyMove(Moves.SPLASH); @@ -250,7 +248,7 @@ describe("Abilities - Gulp Missile", () => { game.move.select(Moves.SUBSTITUTE); await game.forceEnemyMove(Moves.POWER_TRIP); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); expect(game.scene.getPlayerPokemon()!.formIndex).toBe(GULPING_FORM); @@ -258,10 +256,10 @@ describe("Abilities - Gulp Missile", () => { it("cannot be suppressed", async () => { game.override.enemyMoveset(Moves.GASTRO_ACID); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -278,10 +276,10 @@ describe("Abilities - Gulp Missile", () => { it("cannot be swapped with another ability", async () => { game.override.enemyMoveset(Moves.SKILL_SWAP); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; - vi.spyOn(cramorant, "getHpRatio").mockReturnValue(.55); + vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(Moves.SURF); await game.phaseInterceptor.to("MoveEndPhase"); @@ -299,7 +297,7 @@ describe("Abilities - Gulp Missile", () => { it("cannot be copied", async () => { game.override.enemyAbility(Abilities.TRACE); - await game.classicMode.startBattle([ Species.CRAMORANT ]); + await game.classicMode.startBattle([Species.CRAMORANT]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnStartPhase"); diff --git a/src/test/abilities/heatproof.test.ts b/test/abilities/heatproof.test.ts similarity index 84% rename from src/test/abilities/heatproof.test.ts rename to test/abilities/heatproof.test.ts index bf4e99ce467..fa065d1ed03 100644 --- a/src/test/abilities/heatproof.test.ts +++ b/test/abilities/heatproof.test.ts @@ -4,7 +4,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -33,7 +33,7 @@ describe("Abilities - Heatproof", () => { .enemyLevel(100) .starterSpecies(Species.CHANDELURE) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.FLAMETHROWER, Moves.SPLASH ]) + .moveset([Moves.FLAMETHROWER, Moves.SPLASH]) .startingLevel(100); }); @@ -55,14 +55,12 @@ describe("Abilities - Heatproof", () => { await game.phaseInterceptor.to(TurnEndPhase); const regularDamage = initialHP - enemy.hp; - expect(heatproofDamage).toBeLessThanOrEqual((regularDamage / 2) + 1); - expect(heatproofDamage).toBeGreaterThanOrEqual((regularDamage / 2) - 1); + expect(heatproofDamage).toBeLessThanOrEqual(regularDamage / 2 + 1); + expect(heatproofDamage).toBeGreaterThanOrEqual(regularDamage / 2 - 1); }); it("reduces Burn damage by half", async () => { - game.override - .enemyStatusEffect(StatusEffect.BURN) - .enemySpecies(Species.ABRA); + game.override.enemyStatusEffect(StatusEffect.BURN).enemySpecies(Species.ABRA); await game.startBattle(); const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/honey_gather.test.ts b/test/abilities/honey_gather.test.ts new file mode 100644 index 00000000000..bea5c25c878 --- /dev/null +++ b/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/testUtils/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/test/abilities/hustle.test.ts similarity index 81% rename from src/test/abilities/hustle.test.ts rename to test/abilities/hustle.test.ts index c4c4818040d..40197cf9e97 100644 --- a/src/test/abilities/hustle.test.ts +++ b/test/abilities/hustle.test.ts @@ -1,9 +1,9 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -25,7 +25,7 @@ describe("Abilities - Hustle", () => { game = new GameManager(phaserGame); game.override .ability(Abilities.HUSTLE) - .moveset([ Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE ]) + .moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]) .disableCrits() .battleType("single") .enemyMoveset(Moves.SPLASH) @@ -34,7 +34,7 @@ describe("Abilities - Hustle", () => { }); it("increases the user's Attack stat by 50%", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const atk = pikachu.stats[Stat.ATK]; @@ -42,13 +42,13 @@ 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)); }); it("lowers the accuracy of the user's physical moves by 20%", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; vi.spyOn(pikachu, "getAccuracyMultiplier"); @@ -60,7 +60,7 @@ describe("Abilities - Hustle", () => { }); it("does not affect non-physical moves", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const spatk = pikachu.stats[Stat.SPATK]; @@ -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); @@ -78,7 +78,7 @@ describe("Abilities - Hustle", () => { game.override.startingLevel(100); game.override.enemyLevel(30); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -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/hyper_cutter.test.ts b/test/abilities/hyper_cutter.test.ts similarity index 80% rename from src/test/abilities/hyper_cutter.test.ts rename to test/abilities/hyper_cutter.test.ts index e51fef6bd49..fe5623e4e0f 100644 --- a/src/test/abilities/hyper_cutter.test.ts +++ b/test/abilities/hyper_cutter.test.ts @@ -2,7 +2,7 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -24,7 +24,7 @@ describe("Abilities - Hyper Cutter", () => { game = new GameManager(phaserGame); game.override .battleType("single") - .moveset([ Moves.SAND_ATTACK, Moves.NOBLE_ROAR, Moves.DEFOG, Moves.OCTOLOCK ]) + .moveset([Moves.SAND_ATTACK, Moves.NOBLE_ROAR, Moves.DEFOG, Moves.OCTOLOCK]) .ability(Abilities.BALL_FETCH) .enemySpecies(Species.SHUCKLE) .enemyAbility(Abilities.HYPER_CUTTER) @@ -46,11 +46,13 @@ describe("Abilities - Hyper Cutter", () => { await game.toNextTurn(); game.move.select(Moves.SAND_ATTACK); await game.toNextTurn(); - game.override.moveset([ Moves.STRING_SHOT ]); + game.override.moveset([Moves.STRING_SHOT]); game.move.select(Moves.STRING_SHOT); await game.toNextTurn(); expect(enemy.getStatStage(Stat.ATK)).toEqual(0); - [ Stat.ACC, Stat.DEF, Stat.EVA, Stat.SPATK, Stat.SPDEF, Stat.SPD ].forEach((stat: number) => expect(enemy.getStatStage(stat)).toBeLessThan(0)); + [Stat.ACC, Stat.DEF, Stat.EVA, Stat.SPATK, Stat.SPDEF, Stat.SPD].forEach((stat: number) => + expect(enemy.getStatStage(stat)).toBeLessThan(0), + ); }); }); diff --git a/src/test/abilities/ice_face.test.ts b/test/abilities/ice_face.test.ts similarity index 81% rename from src/test/abilities/ice_face.test.ts rename to test/abilities/ice_face.test.ts index 1c7f7bd6093..e85794928d6 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/test/abilities/ice_face.test.ts @@ -8,7 +8,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -33,11 +33,11 @@ describe("Abilities - Ice Face", () => { game.override.battleType("single"); game.override.enemySpecies(Species.EISCUE); game.override.enemyAbility(Abilities.ICE_FACE); - game.override.moveset([ Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL ]); + game.override.moveset([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); }); it("takes no damage from physical move and transforms to Noice", async () => { - await game.classicMode.startBattle([ Species.HITMONLEE ]); + await game.classicMode.startBattle([Species.HITMONLEE]); game.move.select(Moves.TACKLE); @@ -51,9 +51,9 @@ describe("Abilities - Ice Face", () => { }); it("takes no damage from the first hit of multihit physical move and transforms to Noice", async () => { - game.override.moveset([ Moves.SURGING_STRIKES ]); + game.override.moveset([Moves.SURGING_STRIKES]); game.override.enemyLevel(1); - await game.classicMode.startBattle([ Species.HITMONLEE ]); + await game.classicMode.startBattle([Species.HITMONLEE]); game.move.select(Moves.SURGING_STRIKES); @@ -79,7 +79,7 @@ describe("Abilities - Ice Face", () => { }); it("takes damage from special moves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.ICE_BEAM); @@ -93,7 +93,7 @@ describe("Abilities - Ice Face", () => { }); it("takes effects from status moves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.TOXIC_THREAD); @@ -106,10 +106,10 @@ describe("Abilities - Ice Face", () => { }); it("transforms to Ice Face when Hail or Snow starts", async () => { - game.override.moveset([ Moves.QUICK_ATTACK ]); - game.override.enemyMoveset([ Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL ]); + game.override.moveset([Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.QUICK_ATTACK); @@ -128,10 +128,10 @@ describe("Abilities - Ice Face", () => { }); it("transforms to Ice Face when summoned on arena with active Snow or Hail", async () => { - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - game.override.moveset([ Moves.SNOWSCAPE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + game.override.moveset([Moves.SNOWSCAPE]); - await game.classicMode.startBattle([ Species.EISCUE, Species.NINJASK ]); + await game.classicMode.startBattle([Species.EISCUE, Species.NINJASK]); game.move.select(Moves.SNOWSCAPE); @@ -156,9 +156,9 @@ describe("Abilities - Ice Face", () => { it("will not revert to its Ice Face if there is already Hail when it changes into Noice", async () => { game.override.enemySpecies(Species.SHUCKLE); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - await game.classicMode.startBattle([ Species.EISCUE ]); + await game.classicMode.startBattle([Species.EISCUE]); game.move.select(Moves.HAIL); const eiscue = game.scene.getPlayerPokemon()!; @@ -175,9 +175,9 @@ describe("Abilities - Ice Face", () => { }); it("persists form change when switched out", async () => { - game.override.enemyMoveset([ Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK ]); + game.override.enemyMoveset([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); - await game.classicMode.startBattle([ Species.EISCUE, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.EISCUE, Species.MAGIKARP]); game.move.select(Moves.ICE_BEAM); @@ -192,7 +192,7 @@ describe("Abilities - Ice Face", () => { game.doSwitchPokemon(1); await game.phaseInterceptor.to(TurnEndPhase); - eiscue = game.scene.getParty()[1]; + eiscue = game.scene.getPlayerParty()[1]; expect(eiscue.formIndex).toBe(noiceForm); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); @@ -206,7 +206,7 @@ describe("Abilities - Ice Face", () => { [Species.EISCUE]: noiceForm, }); - await game.classicMode.startBattle([ Species.EISCUE ]); + await game.classicMode.startBattle([Species.EISCUE]); const eiscue = game.scene.getPlayerPokemon()!; @@ -224,22 +224,20 @@ describe("Abilities - Ice Face", () => { }); it("doesn't trigger if user is behind a substitute", async () => { - game.override - .enemyMoveset(Moves.SUBSTITUTE) - .moveset(Moves.POWER_TRIP); + game.override.enemyMoveset(Moves.SUBSTITUTE).moveset(Moves.POWER_TRIP); await game.classicMode.startBattle(); game.move.select(Moves.POWER_TRIP); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(game.scene.getEnemyPokemon()!.formIndex).toBe(icefaceForm); }); it("cannot be suppressed", async () => { - game.override.moveset([ Moves.GASTRO_ACID ]); + game.override.moveset([Moves.GASTRO_ACID]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.GASTRO_ACID); @@ -253,9 +251,9 @@ describe("Abilities - Ice Face", () => { }); it("cannot be swapped with another ability", async () => { - game.override.moveset([ Moves.SKILL_SWAP ]); + game.override.moveset([Moves.SKILL_SWAP]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SKILL_SWAP); @@ -271,7 +269,7 @@ describe("Abilities - Ice Face", () => { it("cannot be copied", async () => { game.override.ability(Abilities.TRACE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SIMPLE_BEAM); diff --git a/src/test/abilities/illuminate.test.ts b/test/abilities/illuminate.test.ts similarity index 89% rename from src/test/abilities/illuminate.test.ts rename to test/abilities/illuminate.test.ts index 4f7d3d83b51..6518fec989b 100644 --- a/src/test/abilities/illuminate.test.ts +++ b/test/abilities/illuminate.test.ts @@ -1,7 +1,7 @@ import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; @@ -45,11 +45,7 @@ describe("Abilities - Illuminate", () => { }); it("should guarantee double battle with any one LURE", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - ]) - .startingWave(2); + game.override.startingModifier([{ name: "LURE" }]).startingWave(2); await game.classicMode.startBattle(); diff --git a/src/test/abilities/imposter.test.ts b/test/abilities/imposter.test.ts similarity index 74% rename from src/test/abilities/imposter.test.ts rename to test/abilities/imposter.test.ts index 7aaac5ca8c4..b4469cd9042 100644 --- a/src/test/abilities/imposter.test.ts +++ b/test/abilities/imposter.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; @@ -36,7 +36,7 @@ describe("Abilities - Imposter", () => { }); it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => { - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); @@ -60,23 +60,24 @@ describe("Abilities - Imposter", () => { const playerMoveset = player.getMoveset(); const enemyMoveset = player.getMoveset(); + expect(playerMoveset.length).toBe(enemyMoveset.length); for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) { - // TODO: Checks for 5 PP should be done here when that gets addressed expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId); } const playerTypes = player.getTypes(); const enemyTypes = enemy.getTypes(); + expect(playerTypes.length).toBe(enemyTypes.length); for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) { expect(playerTypes[i]).toBe(enemyTypes[i]); } - }, 20000); + }); it("should copy in-battle overridden stats", async () => { - game.override.enemyMoveset([ Moves.POWER_SPLIT ]); + game.override.enemyMoveset([Moves.POWER_SPLIT]); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -95,16 +96,35 @@ describe("Abilities - Imposter", () => { }); it("should set each move's pp to a maximum of 5", async () => { - game.override.enemyMoveset([ Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER ]); + game.override.enemyMoveset([Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER]); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); const player = game.scene.getPlayerPokemon()!; game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); player.getMoveset().forEach(move => { - expect(move!.getMovePp()).toBeLessThanOrEqual(5); + // Should set correct maximum PP without touching `ppUp` + if (move) { + if (move.moveId === Moves.SKETCH) { + expect(move.getMovePp()).toBe(1); + } else { + expect(move.getMovePp()).toBe(5); + } + expect(move.ppUp).toBe(0); + } }); }); + + it("should activate its ability if it copies one that activates on summon", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + + await game.classicMode.startBattle([Species.DITTO]); + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); }); diff --git a/src/test/abilities/infiltrator.test.ts b/test/abilities/infiltrator.test.ts similarity index 79% rename from src/test/abilities/infiltrator.test.ts rename to test/abilities/infiltrator.test.ts index 01c5cef7796..6278439651c 100644 --- a/src/test/abilities/infiltrator.test.ts +++ b/test/abilities/infiltrator.test.ts @@ -1,5 +1,5 @@ import { ArenaTagSide } from "#app/data/arena-tag"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Stat } from "#enums/stat"; @@ -7,7 +7,7 @@ import { StatusEffect } from "#enums/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -28,7 +28,7 @@ describe("Abilities - Infiltrator", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TACKLE, Moves.WATER_GUN, Moves.SPORE, Moves.BABY_DOLL_EYES ]) + .moveset([Moves.TACKLE, Moves.WATER_GUN, Moves.SPORE, Moves.BABY_DOLL_EYES]) .ability(Abilities.INFILTRATOR) .battleType("single") .disableCrits() @@ -40,11 +40,23 @@ describe("Abilities - Infiltrator", () => { }); it.each([ - { effectName: "Light Screen", tagType: ArenaTagType.LIGHT_SCREEN, move: Moves.WATER_GUN }, - { effectName: "Reflect", tagType: ArenaTagType.REFLECT, move: Moves.TACKLE }, - { effectName: "Aurora Veil", tagType: ArenaTagType.AURORA_VEIL, move: Moves.TACKLE } + { + effectName: "Light Screen", + tagType: ArenaTagType.LIGHT_SCREEN, + move: Moves.WATER_GUN, + }, + { + effectName: "Reflect", + tagType: ArenaTagType.REFLECT, + move: Moves.TACKLE, + }, + { + effectName: "Aurora Veil", + tagType: ArenaTagType.AURORA_VEIL, + move: Moves.TACKLE, + }, ])("should bypass the target's $effectName", async ({ tagType, move }) => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -60,7 +72,7 @@ describe("Abilities - Infiltrator", () => { }); it("should bypass the target's Safeguard", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -75,8 +87,8 @@ describe("Abilities - Infiltrator", () => { }); // TODO: fix this interaction to pass this test - it.skip("should bypass the target's Mist", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + it.todo("should bypass the target's Mist", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -91,7 +103,7 @@ describe("Abilities - Infiltrator", () => { }); it("should bypass the target's Substitute", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/src/test/abilities/intimidate.test.ts b/test/abilities/intimidate.test.ts similarity index 84% rename from src/test/abilities/intimidate.test.ts rename to test/abilities/intimidate.test.ts index d5a37d06593..53286d354c8 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/test/abilities/intimidate.test.ts @@ -1,9 +1,9 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Mode } from "#app/ui/ui"; import { Stat } from "#enums/stat"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { getMovePosition } from "#test/testUtils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -24,7 +24,8 @@ describe("Abilities - Intimidate", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .enemySpecies(Species.RATTATA) .enemyAbility(Abilities.INTIMIDATE) .enemyPassiveAbility(Abilities.HYDRATION) @@ -34,7 +35,7 @@ describe("Abilities - Intimidate", () => { }); it("should lower ATK stat stage by 1 of enemy Pokemon on entry and player switch", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -42,7 +43,7 @@ describe("Abilities - Intimidate", () => { game.setMode(Mode.MESSAGE); game.endPhase(); }, - () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase") + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase"), ); await game.phaseInterceptor.to("CommandPhase", false); @@ -64,9 +65,8 @@ describe("Abilities - Intimidate", () => { }, 20000); it("should lower ATK stat stage by 1 for every enemy Pokemon in a double battle on entry", async () => { - game.override.battleType("double") - .startingWave(3); - await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); + game.override.battleType("double").startingWave(3); + await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.onNextPrompt( "CheckSwitchPhase", Mode.CONFIRM, @@ -74,7 +74,7 @@ describe("Abilities - Intimidate", () => { game.setMode(Mode.MESSAGE); game.endPhase(); }, - () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase") + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase"), ); await game.phaseInterceptor.to("CommandPhase", false); @@ -89,8 +89,8 @@ describe("Abilities - Intimidate", () => { it("should not activate again if there is no switch or new entry", async () => { game.override.startingWave(2); - game.override.moveset([ Moves.SPLASH ]); - await game.classicMode.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + game.override.moveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -106,10 +106,8 @@ describe("Abilities - Intimidate", () => { }, 20000); it("should lower ATK stat stage by 1 for every switch", async () => { - game.override.moveset([ Moves.SPLASH ]) - .enemyMoveset([ Moves.VOLT_SWITCH ]) - .startingWave(5); - await game.classicMode.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + game.override.moveset([Moves.SPLASH]).enemyMoveset([Moves.VOLT_SWITCH]).startingWave(5); + await game.classicMode.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); const playerPokemon = game.scene.getPlayerPokemon()!; let enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/src/test/abilities/intrepid_sword.test.ts b/test/abilities/intrepid_sword.test.ts similarity index 85% rename from src/test/abilities/intrepid_sword.test.ts rename to test/abilities/intrepid_sword.test.ts index 7bf0654276c..28d0cd02c7f 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/test/abilities/intrepid_sword.test.ts @@ -1,12 +1,11 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Intrepid Sword", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,10 +28,8 @@ describe("Abilities - Intrepid Sword", () => { game.override.ability(Abilities.INTREPID_SWORD); }); - it("should raise ATK stat stage by 1 on entry", async() => { - await game.classicMode.runToSummon([ - Species.ZACIAN, - ]); + it("should raise ATK stat stage by 1 on entry", async () => { + await game.classicMode.runToSummon([Species.ZACIAN]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/libero.test.ts b/test/abilities/libero.test.ts new file mode 100644 index 00000000000..22abf1c248f --- /dev/null +++ b/test/abilities/libero.test.ts @@ -0,0 +1,301 @@ +import { allMoves } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; +import { Weather } from "#app/data/weather"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Biome } from "#enums/biome"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { WeatherType } from "#enums/weather-type"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Abilities - Libero", () => { + 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.ability(Abilities.LIBERO); + game.override.startingLevel(100); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); + }); + + test("ability applies and changes a pokemon's type", async () => { + game.override.moveset([Moves.SPLASH]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + }); + + // Test for Gen9+ functionality, we are using previous funcionality + test.skip("ability applies only once per switch in", async () => { + game.override.moveset([Moves.SPLASH, Moves.AGILITY]); + + await game.startBattle([Species.MAGIKARP, Species.BULBASAUR]); + + let leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + + game.move.select(Moves.AGILITY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied.filter(a => a === Abilities.LIBERO)).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]]; + const moveType = PokemonType[allMoves[Moves.AGILITY].type]; + expect(leadPokemonType).not.toBe(moveType); + + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + + leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + }); + + test("ability applies correctly even if the pokemon's move has a variable type", async () => { + game.override.moveset([Moves.WEATHER_BALL]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.scene.arena.weather = new Weather(WeatherType.SUNNY); + game.move.select(Moves.WEATHER_BALL); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); + expect(leadPokemon.getTypes()).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.FIRE]; + expect(leadPokemonType).toBe(moveType); + }); + + test("ability applies correctly even if the type has changed by another ability", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.passiveAbility(Abilities.REFRIGERATE); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); + expect(leadPokemon.getTypes()).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.ICE]; + expect(leadPokemonType).toBe(moveType); + }); + + test("ability applies correctly even if the pokemon's move calls another move", async () => { + game.override.moveset([Moves.NATURE_POWER]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.scene.arena.biomeType = Biome.MOUNTAIN; + game.move.select(Moves.NATURE_POWER); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); + }); + + test("ability applies correctly even if the pokemon's move is delayed / charging", async () => { + game.override.moveset([Moves.DIG]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.DIG); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); + }); + + test("ability applies correctly even if the pokemon's move misses", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset(Moves.SPLASH); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TACKLE); + await game.move.forceMiss(); + await game.phaseInterceptor.to(TurnEndPhase); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.isFullHp()).toBe(true); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); + + test("ability applies correctly even if the pokemon's move is protected against", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); + + test("ability applies correctly even if the pokemon's move fails because of type immunity", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemySpecies(Species.GASTLY); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); + + test("ability is not applied if pokemon's type is the same as the move's type", async () => { + game.override.moveset([Moves.SPLASH]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + leadPokemon.summonData.types = [allMoves[Moves.SPLASH].type]; + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); + }); + + test("ability is not applied if pokemon is terastallized", async () => { + game.override.moveset([Moves.SPLASH]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + leadPokemon.isTerastallized = true; + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); + }); + + test("ability is not applied if pokemon uses struggle", async () => { + game.override.moveset([Moves.STRUGGLE]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.STRUGGLE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); + }); + + test("ability is not applied if the pokemon's move fails", async () => { + game.override.moveset([Moves.BURN_UP]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.BURN_UP); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.LIBERO); + }); + + test("ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { + game.override.moveset([Moves.TRICK_OR_TREAT]); + game.override.enemySpecies(Species.GASTLY); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TRICK_OR_TREAT); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); + }); + + test("ability applies correctly and the pokemon curses itself", async () => { + game.override.moveset([Moves.CURSE]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); + expect(leadPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); + }); +}); + +function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Moves) { + expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.LIBERO); + expect(pokemon.getTypes()).toHaveLength(1); + const pokemonType = PokemonType[pokemon.getTypes()[0]], + moveType = PokemonType[allMoves[move].type]; + expect(pokemonType).toBe(moveType); +} diff --git a/test/abilities/lightningrod.test.ts b/test/abilities/lightningrod.test.ts new file mode 100644 index 00000000000..1ca6c6b1e89 --- /dev/null +++ b/test/abilities/lightningrod.test.ts @@ -0,0 +1,115 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Lightningrod", () => { + 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.SHOCK_WAVE ]) + .ability(Abilities.BALL_FETCH) + .battleType("double") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should redirect electric type moves", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.SHOCK_WAVE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(true); + }); + + it("should not redirect non-electric type moves", async () => { + game.override.moveset([ Moves.SPLASH, Moves.AERIAL_ACE ]); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.AERIAL_ACE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(false); + }); + + it("should boost the user's spatk without damaging", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.SHOCK_WAVE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy2.isFullHp()).toBe(true); + expect(enemy2.getStatStage(Stat.SPATK)).toBe(1); + }); + + it("should not redirect moves changed from electric type via ability", async () => { + game.override.ability(Abilities.NORMALIZE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.SHOCK_WAVE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(false); + }); + + it("should redirect moves changed to electric type via ability", async () => { + game.override.ability(Abilities.GALVANIZE) + .moveset(Moves.TACKLE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.LIGHTNING_ROD; + + game.move.select(Moves.TACKLE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(true); + expect(enemy2.getStatStage(Stat.SPATK)).toBe(1); + }); +}); diff --git a/test/abilities/magic_bounce.test.ts b/test/abilities/magic_bounce.test.ts new file mode 100644 index 00000000000..f9a076776aa --- /dev/null +++ b/test/abilities/magic_bounce.test.ts @@ -0,0 +1,362 @@ +import { BattlerIndex } from "#app/battle"; +import { allAbilities } from "#app/data/ability"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/moves/move"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Stat } from "#app/enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Magic Bounce", () => { + 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 + .ability(Abilities.BALL_FETCH) + .battleType("single") + .moveset([Moves.GROWL, Moves.SPLASH]) + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.MAGIC_BOUNCE) + .enemyMoveset(Moves.SPLASH); + }); + + it("should reflect basic status moves", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce moves while the target is in the semi-invulnerable state", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.GROWL]); + game.override.enemyMoveset([Moves.FLY]); + + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.FLY); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should individually bounce back multi-target moves", async () => { + game.override.battleType("double"); + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + const user = game.scene.getPlayerField()[0]; + expect(user.getStatStage(Stat.ATK)).toBe(-2); + }); + + it("should still bounce back a move that would otherwise fail", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); + game.override.moveset([Moves.GROWL]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce back a move that was just bounced", async () => { + game.override.ability(Abilities.MAGIC_BOUNCE); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should receive the stat change after reflecting a move back to a mirror armor user", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce back a move from a mold breaker user", async () => { + game.override.ability(Abilities.MOLD_BREAKER); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should bounce back a spread status move against both pokemon", async () => { + game.override.battleType("double"); + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerField().every(p => p.getStatStage(Stat.ATK) === -2)).toBeTruthy(); + }); + + it("should only bounce spikes back once in doubles when both targets have magic bounce", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.SPIKES]); + + game.move.select(Moves.SPIKES); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined(); + }); + + it("should bounce spikes even when the target is protected", async () => { + game.override.moveset([Moves.SPIKES]); + game.override.enemyMoveset([Moves.PROTECT]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPIKES); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1); + }); + + it("should not bounce spikes when the target is in the semi-invulnerable state", async () => { + game.override.moveset([Moves.SPIKES]); + game.override.enemyMoveset([Moves.FLY]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPIKES); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)!["layers"]).toBe(1); + }); + + it("should not bounce back curse", async () => { + game.override.starterSpecies(Species.GASTLY); + await game.classicMode.startBattle([Species.GASTLY]); + game.override.moveset([Moves.CURSE]); + + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined(); + }); + + it("should not cause encore to be interrupted after bouncing", async () => { + game.override.moveset([Moves.SPLASH, Moves.GROWL, Moves.ENCORE]); + game.override.enemyMoveset([Moves.TACKLE, Moves.GROWL]); + // game.override.ability(Abilities.MOLD_BREAKER); + await game.classicMode.startBattle([Species.MAGIKARP]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // Give the player MOLD_BREAKER for this turn to bypass Magic Bounce. + vi.spyOn(playerPokemon, "getAbility").mockReturnValue(allAbilities[Abilities.MOLD_BREAKER]); + + // turn 1 + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + + // turn 2 + vi.spyOn(playerPokemon, "getAbility").mockRestore(); + game.move.select(Moves.GROWL); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); + }); + + // TODO: encore is failing if the last move was virtual. + it.todo("should not cause the bounced move to count for encore", async () => { + game.override.moveset([Moves.SPLASH, Moves.GROWL, Moves.ENCORE]); + game.override.enemyMoveset([Moves.GROWL, Moves.TACKLE]); + game.override.enemyAbility(Abilities.MAGIC_BOUNCE); + + await game.classicMode.startBattle([Species.MAGIKARP]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // turn 1 + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + // Give the player MOLD_BREAKER for this turn to bypass Magic Bounce. + vi.spyOn(playerPokemon, "getAbility").mockReturnValue(allAbilities[Abilities.MOLD_BREAKER]); + + // turn 2 + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => { + game.override.battleType("single"); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.STOMPING_TANTRUM, Moves.CHARM]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.CHARM); + await game.toNextTurn(); + + game.move.select(Moves.STOMPING_TANTRUM); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(150); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo( + "should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", + async () => { + game.override.enemyMoveset([Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM]); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.CHARM); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getLastXMoves(1)[0].result).toBe("success"); + + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + + await game.toNextTurn(); + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + }, + ); + + it("should respect immunities when bouncing a move", async () => { + vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); + game.override.moveset([Moves.THUNDER_WAVE, Moves.GROWL]); + game.override.ability(Abilities.SOUNDPROOF); + await game.classicMode.startBattle([Species.PHANPY]); + + // Turn 1 - thunder wave immunity test + game.move.select(Moves.THUNDER_WAVE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + + // Turn 2 - soundproof immunity test + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should bounce back a move before the accuracy check", async () => { + game.override.moveset([Moves.SPORE]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + const attacker = game.scene.getPlayerPokemon()!; + + vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + }); + + it("should take the accuracy of the magic bounce user into account", async () => { + game.override.moveset([Moves.SPORE]); + await game.classicMode.startBattle([Species.MAGIKARP]); + const opponent = game.scene.getEnemyPokemon()!; + + vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + }); + + it("should always apply the leftmost available target's magic bounce when bouncing moves like sticky webs in doubles", async () => { + game.override.battleType("double"); + game.override.moveset([Moves.STICKY_WEB, Moves.SPLASH, Moves.TRICK_ROOM]); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + const [enemy_1, enemy_2] = game.scene.getEnemyField(); + // set speed just incase logic erroneously checks for speed order + enemy_1.setStat(Stat.SPD, enemy_2.getStat(Stat.SPD) + 1); + + // turn 1 + game.move.select(Moves.STICKY_WEB, 0); + game.move.select(Moves.TRICK_ROOM, 1); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect( + game.scene.arena + .getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER) + ?.getSourcePokemon() + ?.getBattlerIndex(), + ).toBe(BattlerIndex.ENEMY); + game.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER, true); + + // turn 2 + game.move.select(Moves.STICKY_WEB, 0); + game.move.select(Moves.TRICK_ROOM, 1); + await game.phaseInterceptor.to("BerryPhase"); + expect( + game.scene.arena + .getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER) + ?.getSourcePokemon() + ?.getBattlerIndex(), + ).toBe(BattlerIndex.ENEMY); + }); + + it("should not bounce back status moves that hit through semi-invulnerable states", async () => { + game.override.moveset([Moves.TOXIC, Moves.CHARM]); + await game.classicMode.startBattle([Species.BULBASAUR]); + game.move.select(Moves.TOXIC); + await game.forceEnemyMove(Moves.FLY); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.TOXIC); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + + game.override.ability(Abilities.NO_GUARD); + game.move.select(Moves.CHARM); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-2); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); +}); diff --git a/test/abilities/magic_guard.test.ts b/test/abilities/magic_guard.test.ts new file mode 100644 index 00000000000..96a9f4dab74 --- /dev/null +++ b/test/abilities/magic_guard.test.ts @@ -0,0 +1,439 @@ +import { ArenaTagSide, getArenaTag } from "#app/data/arena-tag"; +import { getStatusEffectCatchRateMultiplier } from "#app/data/status-effect"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import { WeatherType } from "#enums/weather-type"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Magic Guard", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + /** Player Pokemon overrides */ + game.override.ability(Abilities.MAGIC_GUARD); + game.override.moveset([Moves.SPLASH]); + game.override.startingLevel(100); + + /** Enemy Pokemon overrides */ + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset(Moves.SPLASH); + game.override.enemyLevel(100); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(Ability) + + it("ability should prevent damage caused by weather", async () => { + game.override.weather(WeatherType.SANDSTORM); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) has not taken damage from weather + * - The enemy Pokemon (without Magic Guard) has taken damage from weather + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); + + it("ability should prevent damage caused by status effects but other non-damage effects still apply", async () => { + //Toxic keeps track of the turn counters -> important that Magic Guard keeps track of post-Toxic turns + game.override.statusEffect(StatusEffect.POISON); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) has not taken damage from poison + * - The Pokemon's CatchRateMultiplier should be 1.5 + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(getStatusEffectCatchRateMultiplier(leadPokemon.status!.effect)).toBe(1.5); + }); + + it("ability effect should not persist when the ability is replaced", async () => { + game.override.enemyMoveset([Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED, Moves.WORRY_SEED]); + game.override.statusEffect(StatusEffect.POISON); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (that just lost its Magic Guard ability) has taken damage from poison + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }); + + it("Magic Guard prevents damage caused by burn but other non-damaging effects are still applied", async () => { + game.override.enemyStatusEffect(StatusEffect.BURN); + game.override.enemyAbility(Abilities.MAGIC_GUARD); + + await game.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The enemy Pokemon (with Magic Guard) has not taken damage from burn + * - The enemy Pokemon's physical attack damage is halved (TBD) + * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 + */ + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); + }); + + it("Magic Guard prevents damage caused by toxic but other non-damaging effects are still applied", async () => { + game.override.enemyStatusEffect(StatusEffect.TOXIC); + game.override.enemyAbility(Abilities.MAGIC_GUARD); + + await game.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const toxicStartCounter = enemyPokemon.status!.toxicTurnCount; + //should be 0 + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The enemy Pokemon (with Magic Guard) has not taken damage from toxic + * - The enemy Pokemon's status effect duration should be incremented + * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 + */ + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(enemyPokemon.status!.toxicTurnCount).toBeGreaterThan(toxicStartCounter); + expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); + }); + + it("Magic Guard prevents damage caused by entry hazards", async () => { + //Adds and applies Spikes to both sides of the arena + const newTag = getArenaTag(ArenaTagType.SPIKES, 5, Moves.SPIKES, 0, 0, ArenaTagSide.BOTH)!; + game.scene.arena.tags.push(newTag); + + await game.startBattle([Species.MAGIKARP]); + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) has not taken damage from spikes + * - The enemy Pokemon (without Magic Guard) has taken damage from spikes + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); + + it("Magic Guard does not prevent poison from Toxic Spikes", async () => { + //Adds and applies Spikes to both sides of the arena + const playerTag = getArenaTag(ArenaTagType.TOXIC_SPIKES, 5, Moves.TOXIC_SPIKES, 0, 0, ArenaTagSide.PLAYER)!; + const enemyTag = getArenaTag(ArenaTagType.TOXIC_SPIKES, 5, Moves.TOXIC_SPIKES, 0, 0, ArenaTagSide.ENEMY)!; + game.scene.arena.tags.push(playerTag); + game.scene.arena.tags.push(enemyTag); + + await game.startBattle([Species.MAGIKARP]); + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - Both Pokemon gain the poison status effect + * - The player Pokemon (with Magic Guard) has not taken damage from poison + * - The enemy Pokemon (without Magic Guard) has taken damage from poison + */ + expect(leadPokemon.status!.effect).toBe(StatusEffect.POISON); + expect(enemyPokemon.status!.effect).toBe(StatusEffect.POISON); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); + + it("Magic Guard prevents against damage from volatile status effects", async () => { + await game.startBattle([Species.DUSKULL]); + game.override.moveset([Moves.CURSE]); + game.override.enemyAbility(Abilities.MAGIC_GUARD); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.CURSE); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) has cut its HP to inflict curse + * - The enemy Pokemon (with Magic Guard) is cursed + * - The enemy Pokemon (with Magic Guard) does not lose HP from being cursed + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + expect(enemyPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); + + it("Magic Guard prevents crash damage", async () => { + game.override.moveset([Moves.HIGH_JUMP_KICK]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.HIGH_JUMP_KICK); + await game.move.forceMiss(); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) misses High Jump Kick but does not lose HP as a result + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }); + + it("Magic Guard prevents damage from recoil", async () => { + game.override.moveset([Moves.TAKE_DOWN]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TAKE_DOWN); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses a recoil move but does not lose HP from recoil + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }); + + it("Magic Guard does not prevent damage from Struggle's recoil", async () => { + game.override.moveset([Moves.STRUGGLE]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.STRUGGLE); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses Struggle but does lose HP from Struggle's recoil + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }); + + //This tests different move attributes than the recoil tests above + it("Magic Guard prevents self-damage from attacking moves", async () => { + game.override.moveset([Moves.STEEL_BEAM]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.STEEL_BEAM); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses a move with an HP cost but does not lose HP from using it + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }); + + /* + it("Magic Guard does not prevent self-damage from confusion", async () => { + await game.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.CHARM); + + await game.phaseInterceptor.to(TurnEndPhase); + }); +*/ + + it("Magic Guard does not prevent self-damage from non-attacking moves", async () => { + game.override.moveset([Moves.BELLY_DRUM]); + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.BELLY_DRUM); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) uses a non-attacking move with an HP cost and thus loses HP from using it + */ + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }); + + it("Magic Guard prevents damage from abilities with PostTurnHurtIfSleepingAbAttr", async () => { + //Tests the ability Bad Dreams + game.override.statusEffect(StatusEffect.SLEEP); + //enemy pokemon is given Spore just in case player pokemon somehow awakens during test + game.override.enemyMoveset([Moves.SPORE, Moves.SPORE, Moves.SPORE, Moves.SPORE]); + game.override.enemyAbility(Abilities.BAD_DREAMS); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The player Pokemon is asleep + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.status!.effect).toBe(StatusEffect.SLEEP); + }); + + it("Magic Guard prevents damage from abilities with PostFaintContactDamageAbAttr", async () => { + //Tests the abilities Innards Out/Aftermath + game.override.moveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.AFTERMATH); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.hp = 1; + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The enemy Pokemon has fainted + */ + expect(enemyPokemon.hp).toBe(0); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }); + + it("Magic Guard prevents damage from abilities with PostDefendContactDamageAbAttr", async () => { + //Tests the abilities Iron Barbs/Rough Skin + game.override.moveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.IRON_BARBS); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The player Pokemon's move should have connected + */ + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }); + + it("Magic Guard prevents damage from abilities with ReverseDrainAbAttr", async () => { + //Tests the ability Liquid Ooze + game.override.moveset([Moves.ABSORB]); + game.override.enemyAbility(Abilities.LIQUID_OOZE); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.ABSORB); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + * - The player Pokemon's move should have connected + */ + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }); + + it("Magic Guard prevents HP loss from abilities with PostWeatherLapseDamageAbAttr", async () => { + //Tests the abilities Solar Power/Dry Skin + game.override.passiveAbility(Abilities.SOLAR_POWER); + game.override.weather(WeatherType.SUNNY); + + await game.startBattle([Species.MAGIKARP]); + const leadPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * Expect: + * - The player Pokemon (with Magic Guard) should not lose HP due to this ability attribute + */ + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }); +}); diff --git a/test/abilities/mimicry.test.ts b/test/abilities/mimicry.test.ts new file mode 100644 index 00000000000..df6f7905c83 --- /dev/null +++ b/test/abilities/mimicry.test.ts @@ -0,0 +1,90 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { PokemonType } from "#enums/pokemon-type"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Mimicry", () => { + 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]) + .ability(Abilities.MIMICRY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(Moves.SPLASH); + }); + + it("Mimicry activates after the Pokémon with Mimicry is switched in while terrain is present, or whenever there is a change in terrain", async () => { + game.override.enemyAbility(Abilities.MISTY_SURGE); + await game.classicMode.startBattle([Species.FEEBAS, Species.ABRA]); + + const [playerPokemon1, playerPokemon2] = game.scene.getPlayerParty(); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon1.getTypes().includes(PokemonType.FAIRY)).toBe(true); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + expect(playerPokemon2.getTypes().includes(PokemonType.FAIRY)).toBe(true); + }); + + it("Pokemon should revert back to its original, root type once terrain ends", async () => { + game.override + .moveset([Moves.SPLASH, Moves.TRANSFORM]) + .enemyAbility(Abilities.MIMICRY) + .enemyMoveset([Moves.SPLASH, Moves.PSYCHIC_TERRAIN]); + await game.classicMode.startBattle([Species.REGIELEKI]); + + const playerPokemon = game.scene.getPlayerPokemon(); + game.move.select(Moves.TRANSFORM); + await game.forceEnemyMove(Moves.PSYCHIC_TERRAIN); + await game.toNextTurn(); + expect(playerPokemon?.getTypes().includes(PokemonType.PSYCHIC)).toBe(true); + + if (game.scene.arena.terrain) { + game.scene.arena.terrain.turnsLeft = 1; + } + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon?.getTypes().includes(PokemonType.ELECTRIC)).toBe(true); + }); + + it("If the Pokemon is under the effect of a type-adding move and an equivalent terrain activates, the move's effect disappears", async () => { + game.override.enemyMoveset([Moves.FORESTS_CURSE, Moves.GRASSY_TERRAIN]); + await game.classicMode.startBattle([Species.FEEBAS]); + + const playerPokemon = game.scene.getPlayerPokemon(); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.FORESTS_CURSE); + await game.toNextTurn(); + + expect(playerPokemon?.summonData.addedType).toBe(PokemonType.GRASS); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.GRASSY_TERRAIN); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(playerPokemon?.summonData.addedType).toBeNull(); + expect(playerPokemon?.getTypes().includes(PokemonType.GRASS)).toBe(true); + }); +}); diff --git a/test/abilities/mirror_armor.test.ts b/test/abilities/mirror_armor.test.ts new file mode 100644 index 00000000000..6b0c3f10c84 --- /dev/null +++ b/test/abilities/mirror_armor.test.ts @@ -0,0 +1,315 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { BattlerIndex } from "#app/battle"; + +// TODO: When Magic Bounce is implemented, make a test for its interaction with mirror guard, use screech + +describe("Ability - Mirror Armor", () => { + 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") + .enemySpecies(Species.RATTATA) + .enemyMoveset([Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK]) + .enemyAbility(Abilities.BALL_FETCH) + .startingLevel(2000) + .moveset([Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK]) + .ability(Abilities.BALL_FETCH); + }); + + it("Player side + single battle Intimidate - opponent loses stats", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate, enemy should lose -1 atk + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("Enemy side + single battle Intimidate - player loses stats", async () => { + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate, enemy should lose -1 atk + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.ATK)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("Player side + double battle Intimidate - opponents each lose -2 atk", async () => { + game.override.battleType("double"); + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); + + const [enemy1, enemy2] = game.scene.getEnemyField(); + const [player1, player2] = game.scene.getPlayerField(); + + // Enemy has intimidate, enemy should lose -2 atk each + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(enemy1.getStatStage(Stat.ATK)).toBe(-2); + expect(enemy2.getStatStage(Stat.ATK)).toBe(-2); + expect(player1.getStatStage(Stat.ATK)).toBe(0); + expect(player2.getStatStage(Stat.ATK)).toBe(0); + }); + + it("Enemy side + double battle Intimidate - players each lose -2 atk", async () => { + game.override.battleType("double"); + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); + + const [enemy1, enemy2] = game.scene.getEnemyField(); + const [player1, player2] = game.scene.getPlayerField(); + + // Enemy has intimidate, enemy should lose -1 atk + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(enemy1.getStatStage(Stat.ATK)).toBe(0); + expect(enemy2.getStatStage(Stat.ATK)).toBe(0); + expect(player1.getStatStage(Stat.ATK)).toBe(-2); + expect(player2.getStatStage(Stat.ATK)).toBe(-2); + }); + + it("Player side + single battle Intimidate + Tickle - opponent loses stats", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate and uses tickle, enemy receives -2 atk and -1 defense + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.TICKLE, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-2); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.DEF)).toBe(0); + }); + + it("Player side + double battle Intimidate + Tickle - opponents each lose -3 atk, -1 def", async () => { + game.override.battleType("double"); + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); + + const [enemy1, enemy2] = game.scene.getEnemyField(); + const [player1, player2] = game.scene.getPlayerField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TICKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.TICKLE, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(player1.getStatStage(Stat.ATK)).toBe(0); + expect(player1.getStatStage(Stat.DEF)).toBe(0); + expect(player2.getStatStage(Stat.ATK)).toBe(0); + expect(player2.getStatStage(Stat.DEF)).toBe(0); + expect(enemy1.getStatStage(Stat.ATK)).toBe(-3); + expect(enemy1.getStatStage(Stat.DEF)).toBe(-1); + expect(enemy2.getStatStage(Stat.ATK)).toBe(-3); + expect(enemy2.getStatStage(Stat.DEF)).toBe(-1); + }); + + it("Enemy side + single battle Intimidate + Tickle - player loses stats", async () => { + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate and uses tickle, enemy receives -2 atk and -1 defense + game.move.select(Moves.TICKLE); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.DEF)).toBe(-1); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(-2); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); + }); + + it("Player side + single battle Intimidate + oppoenent has white smoke - no one loses stats", async () => { + game.override.enemyAbility(Abilities.WHITE_SMOKE); + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate and uses tickle, enemy has white smoke, no one loses stats + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.TICKLE, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.DEF)).toBe(0); + }); + + it("Enemy side + single battle Intimidate + player has white smoke - no one loses stats", async () => { + game.override.ability(Abilities.WHITE_SMOKE); + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate and uses tickle, enemy has white smoke, no one loses stats + game.move.select(Moves.TICKLE); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.DEF)).toBe(0); + }); + + it("Player side + single battle + opponent uses octolock - does not interact with mirror armor, player loses stats", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy uses octolock, player loses stats at end of turn + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.OCTOLOCK, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(0); + expect(userPokemon.getStatStage(Stat.DEF)).toBe(-1); + expect(userPokemon.getStatStage(Stat.SPDEF)).toBe(-1); + }); + + it("Enemy side + single battle + player uses octolock - does not interact with mirror armor, opponent loses stats", async () => { + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Player uses octolock, enemy loses stats at end of turn + game.move.select(Moves.OCTOLOCK); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(userPokemon.getStatStage(Stat.SPDEF)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(-1); + }); + + it("Both sides have mirror armor - does not loop, player loses attack", async () => { + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.ATK)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("Single battle + sticky web applied player side - player switches out and enemy should lose -1 speed", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.STICKY_WEB, BattlerIndex.PLAYER); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.SPD)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.SPD)).toBe(-1); + }); + + it("Double battle + sticky web applied player side - player switches out and enemy 1 should lose -1 speed", async () => { + game.override.battleType("double"); + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + const [enemy1, enemy2] = game.scene.getEnemyField(); + const [player1, player2] = game.scene.getPlayerField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.STICKY_WEB, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + game.doSwitchPokemon(2); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(enemy1.getStatStage(Stat.SPD)).toBe(-1); + expect(enemy2.getStatStage(Stat.SPD)).toBe(0); + expect(player1.getStatStage(Stat.SPD)).toBe(0); + expect(player2.getStatStage(Stat.SPD)).toBe(0); + }); +}); diff --git a/test/abilities/moody.test.ts b/test/abilities/moody.test.ts new file mode 100644 index 00000000000..da24899a4b0 --- /dev/null +++ b/test/abilities/moody.test.ts @@ -0,0 +1,87 @@ +import { BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Moody", () => { + 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") + .enemySpecies(Species.RATTATA) + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.MOODY) + .enemyMoveset(Moves.SPLASH) + .moveset(Moves.SPLASH); + }); + + it("should increase one stat stage by 2 and decrease a different stat stage by 1", async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + // Find the increased and decreased stats, make sure they are different. + const changedStats = EFFECTIVE_STATS.filter( + s => playerPokemon.getStatStage(s) === 2 || playerPokemon.getStatStage(s) === -1, + ); + + expect(changedStats).toBeTruthy(); + expect(changedStats.length).toBe(2); + expect(changedStats[0] !== changedStats[1]).toBeTruthy(); + }); + + it("should only increase one stat stage by 2 if all stat stages are at -6", async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + // Set all stat stages to -6 + vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(-6)); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + // Should increase one stat stage by 2 (from -6, meaning it will be -4) + const increasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === -4); + + expect(increasedStat).toBeTruthy(); + expect(increasedStat.length).toBe(1); + }); + + it("should only decrease one stat stage by 1 stage if all stat stages are at 6", async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + // Set all stat stages to 6 + vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(6)); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + // Should decrease one stat stage by 1 (from 6, meaning it will be 5) + const decreasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === 5); + + expect(decreasedStat).toBeTruthy(); + expect(decreasedStat.length).toBe(1); + }); +}); diff --git a/src/test/abilities/moxie.test.ts b/test/abilities/moxie.test.ts similarity index 67% rename from src/test/abilities/moxie.test.ts rename to test/abilities/moxie.test.ts index 5f337fedabb..ec93aebd2c0 100644 --- a/src/test/abilities/moxie.test.ts +++ b/test/abilities/moxie.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -32,16 +32,13 @@ describe("Abilities - Moxie", () => { game.override.enemyAbility(Abilities.MOXIE); game.override.ability(Abilities.MOXIE); game.override.startingLevel(2000); - game.override.moveset([ moveToUse ]); + game.override.moveset([moveToUse]); game.override.enemyMoveset(Moves.SPLASH); }); - it("should raise ATK stat stage by 1 when winning a battle", async() => { + it("should raise ATK stat stage by 1 when winning a battle", async () => { const moveToUse = Moves.AERIAL_ACE; - await game.startBattle([ - Species.MIGHTYENA, - Species.MIGHTYENA, - ]); + await game.startBattle([Species.MIGHTYENA, Species.MIGHTYENA]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -54,25 +51,26 @@ describe("Abilities - Moxie", () => { }, 20000); // TODO: Activate this test when MOXIE is corrected to work on faint and not on battle victory - it.todo("should raise ATK stat stage by 1 when defeating an ally Pokemon", async() => { - game.override.battleType("double"); - const moveToUse = Moves.AERIAL_ACE; - await game.startBattle([ - Species.MIGHTYENA, - Species.MIGHTYENA, - ]); + it.todo( + "should raise ATK stat stage by 1 when defeating an ally Pokemon", + async () => { + game.override.battleType("double"); + const moveToUse = Moves.AERIAL_ACE; + await game.startBattle([Species.MIGHTYENA, Species.MIGHTYENA]); - const [ firstPokemon, secondPokemon ] = game.scene.getPlayerField(); + const [firstPokemon, secondPokemon] = game.scene.getPlayerField(); - expect(firstPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(firstPokemon.getStatStage(Stat.ATK)).toBe(0); - secondPokemon.hp = 1; + secondPokemon.hp = 1; - game.move.select(moveToUse); - game.selectTarget(BattlerIndex.PLAYER_2); + game.move.select(moveToUse); + game.selectTarget(BattlerIndex.PLAYER_2); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - expect(firstPokemon.getStatStage(Stat.ATK)).toBe(1); - }, 20000); + expect(firstPokemon.getStatStage(Stat.ATK)).toBe(1); + }, + 20000, + ); }); diff --git a/test/abilities/mummy.test.ts b/test/abilities/mummy.test.ts new file mode 100644 index 00000000000..0971353c14d --- /dev/null +++ b/test/abilities/mummy.test.ts @@ -0,0 +1,52 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Mummy", () => { + 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]) + .ability(Abilities.MUMMY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.TACKLE); + }); + + it("should set the enemy's ability to mummy when hit by a contact move", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.MUMMY); + }); + + it("should not change the enemy's ability hit by a non-contact move", async () => { + game.override.enemyMoveset(Moves.EARTHQUAKE); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); +}); diff --git a/src/test/abilities/mycelium_might.test.ts b/test/abilities/mycelium_might.test.ts similarity index 82% rename from src/test/abilities/mycelium_might.test.ts rename to test/abilities/mycelium_might.test.ts index 0c8e7b5a703..8c7796ec736 100644 --- a/src/test/abilities/mycelium_might.test.ts +++ b/test/abilities/mycelium_might.test.ts @@ -1,6 +1,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Stat } from "#enums/stat"; import { Moves } from "#enums/moves"; @@ -28,9 +28,9 @@ describe("Abilities - Mycelium Might", () => { game.override.disableCrits(); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.CLEAR_BODY); - game.override.enemyMoveset([ Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK ]); + game.override.enemyMoveset([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); game.override.ability(Abilities.MYCELIUM_MIGHT); - game.override.moveset([ Moves.QUICK_ATTACK, Moves.BABY_DOLL_EYES ]); + game.override.moveset([Moves.QUICK_ATTACK, Moves.BABY_DOLL_EYES]); }); /** @@ -41,7 +41,7 @@ describe("Abilities - Mycelium Might", () => { **/ it("will move last in its priority bracket and ignore protective abilities", async () => { - await game.startBattle([ Species.REGIELEKI ]); + await game.startBattle([Species.REGIELEKI]); const enemyPokemon = game.scene.getEnemyPokemon(); const playerIndex = game.scene.getPlayerPokemon()?.getBattlerIndex(); @@ -55,8 +55,8 @@ describe("Abilities - Mycelium Might", () => { const commandOrder = phase.getCommandOrder(); // The opponent Pokemon (without Mycelium Might) goes first despite having lower speed than the player Pokemon. // The player Pokemon (with Mycelium Might) goes last despite having higher speed than the opponent. - expect(speedOrder).toEqual([ playerIndex, enemyIndex ]); - expect(commandOrder).toEqual([ enemyIndex, playerIndex ]); + expect(speedOrder).toEqual([playerIndex, enemyIndex]); + expect(commandOrder).toEqual([enemyIndex, playerIndex]); await game.phaseInterceptor.to(TurnEndPhase); // Despite the opponent's ability (Clear Body), its ATK stat stage is still reduced. @@ -64,8 +64,8 @@ describe("Abilities - Mycelium Might", () => { }, 20000); it("will still go first if a status move that is in a higher priority bracket than the opponent's move is used", async () => { - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - await game.startBattle([ Species.REGIELEKI ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + await game.startBattle([Species.REGIELEKI]); const enemyPokemon = game.scene.getEnemyPokemon(); const playerIndex = game.scene.getPlayerPokemon()?.getBattlerIndex(); @@ -79,15 +79,15 @@ describe("Abilities - Mycelium Might", () => { const commandOrder = phase.getCommandOrder(); // The player Pokemon (with M.M.) goes first because its move is still within a higher priority bracket than its opponent. // The enemy Pokemon goes second because its move is in a lower priority bracket. - expect(speedOrder).toEqual([ playerIndex, enemyIndex ]); - expect(commandOrder).toEqual([ playerIndex, enemyIndex ]); + expect(speedOrder).toEqual([playerIndex, enemyIndex]); + expect(commandOrder).toEqual([playerIndex, enemyIndex]); await game.phaseInterceptor.to(TurnEndPhase); // Despite the opponent's ability (Clear Body), its ATK stat stage is still reduced. expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); }, 20000); it("will not affect non-status moves", async () => { - await game.startBattle([ Species.REGIELEKI ]); + await game.startBattle([Species.REGIELEKI]); const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); @@ -101,7 +101,7 @@ describe("Abilities - Mycelium Might", () => { // The player Pokemon (with M.M.) goes first because it has a higher speed and did not use a status move. // The enemy Pokemon (without M.M.) goes second because its speed is lower. // This means that the commandOrder should be identical to the speedOrder - expect(speedOrder).toEqual([ playerIndex, enemyIndex ]); - expect(commandOrder).toEqual([ playerIndex, enemyIndex ]); + expect(speedOrder).toEqual([playerIndex, enemyIndex]); + expect(commandOrder).toEqual([playerIndex, enemyIndex]); }, 20000); }); diff --git a/test/abilities/neutralizing_gas.test.ts b/test/abilities/neutralizing_gas.test.ts new file mode 100644 index 00000000000..08ab884d806 --- /dev/null +++ b/test/abilities/neutralizing_gas.test.ts @@ -0,0 +1,180 @@ +import { BattlerIndex } from "#app/battle"; +import { PostSummonWeatherChangeAbAttr } from "#app/data/ability"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { Moves } from "#enums/moves"; +import { PokeballType } from "#enums/pokeball"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Neutralizing Gas", () => { + 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]) + .ability(Abilities.NEUTRALIZING_GAS) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should prevent other abilities from activating", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + // Intimidate is suppressed, so the attack stat should not be lowered + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should allow the user's passive to activate", async () => { + game.override.passiveAbility(Abilities.INTREPID_SWORD); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(1); + }); + + it.todo("should activate before other abilities", async () => { + game.override.enemySpecies(Species.ACCELGOR).enemyLevel(100).enemyAbility(Abilities.INTIMIDATE); + + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + // Intimidate is suppressed even when the user's speed is lower + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should activate other abilities when removed", async () => { + game.override + .enemyAbility(Abilities.INTREPID_SWORD) + .enemyPassiveAbility(Abilities.DAUNTLESS_SHIELD) + .enemyMoveset(Moves.ENTRAINMENT); + + await game.classicMode.startBattle([Species.FEEBAS]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon?.getStatStage(Stat.DEF)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + // Enemy removes user's ability, so both abilities are activated + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(1); + expect(enemyPokemon?.getStatStage(Stat.DEF)).toBe(1); + }); + + it("should not activate the user's other ability when removed", async () => { + game.override.passiveAbility(Abilities.INTIMIDATE).enemyMoveset(Moves.ENTRAINMENT); + + await game.classicMode.startBattle([Species.FEEBAS]); + // Neutralising gas user's passive is still active + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + // Intimidate did not reactivate after neutralizing gas was removed + expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should only deactivate when all setters are off the field", async () => { + game.override.enemyMoveset([Moves.ENTRAINMENT, Moves.SPLASH]).battleType("double"); + + await game.classicMode.startBattle([Species.ACCELGOR, Species.ACCELGOR]); + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.ENTRAINMENT, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); // Now one neut gas user is left + + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.ENTRAINMENT, 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(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); // No neut gas users are left + }); + + it("should deactivate when suppressed by gastro acid", async () => { + game.override.enemyMoveset(Moves.GASTRO_ACID); + + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); + + it("should deactivate when the pokemon faints", async () => { + game.override.ability(Abilities.BALL_FETCH).enemyAbility(Abilities.NEUTRALIZING_GAS); + + await game.classicMode.startBattle([Species.FEEBAS]); + game.move.select(Moves.SPLASH); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); + await game.doKillOpponents(); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); + + it("should deactivate upon catching a wild pokemon", async () => { + game.override.battleType("single").enemyAbility(Abilities.NEUTRALIZING_GAS).ability(Abilities.BALL_FETCH); + await game.classicMode.startBattle([Species.MAGIKARP]); + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); + + game.scene.pokeballCounts[PokeballType.MASTER_BALL] = 1; + game.doThrowPokeball(PokeballType.MASTER_BALL); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + }); + + it("should not activate abilities of pokemon no longer on the field", async () => { + game.override + .battleType("single") + .ability(Abilities.NEUTRALIZING_GAS) + .enemyAbility(Abilities.DELTA_STREAM); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const enemy = game.scene.getEnemyPokemon()!; + const weatherChangeAttr = enemy.getAbilityAttrs(PostSummonWeatherChangeAbAttr, false)[0]; + vi.spyOn(weatherChangeAttr, "applyPostSummon"); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); + + game.move.select(Moves.SPLASH); + await game.killPokemon(enemy); + await game.killPokemon(game.scene.getPlayerPokemon()!); + + expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); + expect(weatherChangeAttr.applyPostSummon).not.toHaveBeenCalled(); + }); +}); diff --git a/src/test/abilities/no_guard.test.ts b/test/abilities/no_guard.test.ts similarity index 83% rename from src/test/abilities/no_guard.test.ts rename to test/abilities/no_guard.test.ts index b0b454dd560..41b8fbd27b9 100644 --- a/src/test/abilities/no_guard.test.ts +++ b/test/abilities/no_guard.test.ts @@ -4,7 +4,7 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; @@ -35,13 +35,11 @@ describe("Abilities - No Guard", () => { it("should make moves always hit regardless of move accuracy", async () => { game.override.battleType("single"); - await game.classicMode.startBattle([ - Species.REGIELEKI - ]); + await game.classicMode.startBattle([Species.REGIELEKI]); game.move.select(Moves.ZAP_CANNON); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); @@ -54,11 +52,7 @@ describe("Abilities - No Guard", () => { }); it("should guarantee double battle with any one LURE", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - ]) - .startingWave(2); + game.override.startingModifier([{ name: "LURE" }]).startingWave(2); await game.classicMode.startBattle(); diff --git a/test/abilities/parental_bond.test.ts b/test/abilities/parental_bond.test.ts new file mode 100644 index 00000000000..2aa24e78d6e --- /dev/null +++ b/test/abilities/parental_bond.test.ts @@ -0,0 +1,429 @@ +import { PokemonType } from "#enums/pokemon-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Parental Bond", () => { + 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.disableCrits(); + game.override.ability(Abilities.PARENTAL_BOND); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.FUR_COAT); + game.override.enemyMoveset(Moves.SPLASH); + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + it("should add second strike to attack move", async () => { + game.override.moveset([Moves.TACKLE]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + let enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("DamageAnimPhase"); + const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; + enemyStartingHp = enemyPokemon.hp; + + await game.phaseInterceptor.to("BerryPhase", false); + + const secondStrikeDamage = enemyStartingHp - enemyPokemon.hp; + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(secondStrikeDamage).toBe(toDmgValue(0.25 * firstStrikeDamage)); + }); + + it("should apply secondary effects to both strikes", async () => { + game.override.moveset([Moves.POWER_UP_PUNCH]); + game.override.enemySpecies(Species.AMOONGUSS); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.POWER_UP_PUNCH); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + }); + + it("should not apply to Status moves", async () => { + game.override.moveset([Moves.BABY_DOLL_EYES]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BABY_DOLL_EYES); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not apply to multi-hit moves", async () => { + game.override.moveset([Moves.DOUBLE_HIT]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.DOUBLE_HIT); + await game.move.forceHit(); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + }); + + it("should not apply to self-sacrifice moves", async () => { + game.override.moveset([Moves.SELF_DESTRUCT]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SELF_DESTRUCT); + + await game.phaseInterceptor.to("DamageAnimPhase", false); + + expect(leadPokemon.turnData.hitCount).toBe(1); + }); + + it("should not apply to Rollout", async () => { + game.override.moveset([Moves.ROLLOUT]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.ROLLOUT); + await game.move.forceHit(); + + await game.phaseInterceptor.to("DamageAnimPhase", false); + + expect(leadPokemon.turnData.hitCount).toBe(1); + }); + + it("should not apply multiplier to fixed-damage moves", async () => { + game.override.moveset([Moves.DRAGON_RAGE]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DRAGON_RAGE); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 80); + }); + + it("should not apply multiplier to counter moves", async () => { + game.override.moveset([Moves.COUNTER]); + game.override.enemyMoveset([Moves.TACKLE]); + + await game.classicMode.startBattle([Species.SHUCKLE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.COUNTER); + await game.phaseInterceptor.to("DamageAnimPhase"); + + const playerDamage = leadPokemon.getMaxHp() - leadPokemon.hp; + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - 4 * playerDamage); + }); + + it("should not apply to multi-target moves", async () => { + game.override.battleType("double"); + game.override.moveset([Moves.EARTHQUAKE]); + game.override.passiveAbility(Abilities.LEVITATE); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.EARTHQUAKE); + game.move.select(Moves.EARTHQUAKE, 1); + + await game.phaseInterceptor.to("BerryPhase", false); + + playerPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); + }); + + it("should apply to multi-target moves when hitting only one target", async () => { + game.override.moveset([Moves.EARTHQUAKE]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.EARTHQUAKE); + await game.phaseInterceptor.to("DamageAnimPhase", false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + }); + + it("should only trigger post-target move effects once", async () => { + game.override.moveset([Moves.MIND_BLOWN]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.MIND_BLOWN); + + await game.phaseInterceptor.to("DamageAnimPhase", false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + + // This test will time out if the user faints + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.hp).toBe(Math.ceil(leadPokemon.getMaxHp() / 2)); + }); + + it("Burn Up only removes type after the second strike", async () => { + game.override.moveset([Moves.BURN_UP]); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BURN_UP); + + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.hp).toBeGreaterThan(0); + expect(leadPokemon.isOfType(PokemonType.FIRE)).toBe(true); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.isOfType(PokemonType.FIRE)).toBe(false); + }); + + it("Moves boosted by this ability and Multi-Lens should strike 3 times", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("DamageAnimPhase"); + + expect(leadPokemon.turnData.hitCount).toBe(3); + }); + + it("Seismic Toss boosted by this ability and Multi-Lens should strike 3 times", async () => { + game.override.moveset([Moves.SEISMIC_TOSS]); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.SEISMIC_TOSS); + await game.move.forceHit(); + + await game.phaseInterceptor.to("DamageAnimPhase"); + + expect(leadPokemon.turnData.hitCount).toBe(3); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + expect(enemyPokemon.hp).toBe(enemyStartingHp - 200); + }); + + it("Hyper Beam boosted by this ability should strike twice, then recharge", async () => { + game.override.moveset([Moves.HYPER_BEAM]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.HYPER_BEAM); + await game.move.forceHit(); + + await game.phaseInterceptor.to("DamageAnimPhase"); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); + }); + + it("Anchor Shot boosted by this ability should only trap the target after the second hit", async () => { + game.override.moveset([Moves.ANCHOR_SHOT]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.ANCHOR_SHOT); + await game.move.forceHit(); + + await game.phaseInterceptor.to("DamageAnimPhase"); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + }); + + it("Smack Down boosted by this ability should only ground the target after the second hit", async () => { + game.override.moveset([Moves.SMACK_DOWN]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SMACK_DOWN); + await game.move.forceHit(); + + await game.phaseInterceptor.to("DamageAnimPhase"); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + }); + + it("U-turn boosted by this ability should strike twice before forcing a switch", async () => { + game.override.moveset([Moves.U_TURN]); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.U_TURN); + await game.move.forceHit(); + + await game.phaseInterceptor.to("MoveEffectPhase"); + expect(leadPokemon.turnData.hitCount).toBe(2); + + // This will cause this test to time out if the switch was forced on the first hit. + await game.phaseInterceptor.to("MoveEffectPhase", false); + }); + + it("Wake-Up Slap boosted by this ability should only wake up the target after the second hit", async () => { + game.override.moveset([Moves.WAKE_UP_SLAP]).enemyStatusEffect(StatusEffect.SLEEP); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.WAKE_UP_SLAP); + await game.move.forceHit(); + + await game.phaseInterceptor.to("DamageAnimPhase"); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.SLEEP); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.status?.effect).toBeUndefined(); + }); + + it("should not cause user to hit into King's Shield more than once", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset([Moves.KINGS_SHIELD]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not cause user to hit into Storm Drain more than once", async () => { + game.override.moveset([Moves.WATER_GUN]); + game.override.enemyAbility(Abilities.STORM_DRAIN); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.WATER_GUN); + + await game.phaseInterceptor.to("BerryPhase", false); + + 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/pastel_veil.test.ts b/test/abilities/pastel_veil.test.ts similarity index 85% rename from src/test/abilities/pastel_veil.test.ts rename to test/abilities/pastel_veil.test.ts index 660ff2616e9..65e391b7c22 100644 --- a/src/test/abilities/pastel_veil.test.ts +++ b/test/abilities/pastel_veil.test.ts @@ -1,11 +1,11 @@ import { BattlerIndex } from "#app/battle"; -import { StatusEffect } from "#app/data/status-effect"; import { Abilities } from "#app/enums/abilities"; import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -27,14 +27,14 @@ describe("Abilities - Pastel Veil", () => { game = new GameManager(phaserGame); game.override .battleType("double") - .moveset([ Moves.TOXIC_THREAD, Moves.SPLASH ]) + .moveset([Moves.TOXIC_THREAD, Moves.SPLASH]) .enemyAbility(Abilities.BALL_FETCH) .enemySpecies(Species.SUNKERN) .enemyMoveset(Moves.SPLASH); }); it("prevents the user and its allies from being afflicted by poison", async () => { - await game.startBattle([ Species.MAGIKARP, Species.GALAR_PONYTA ]); + await game.startBattle([Species.MAGIKARP, Species.GALAR_PONYTA]); const ponyta = game.scene.getPlayerField()[1]; const magikarp = game.scene.getPlayerField()[0]; ponyta.abilityIndex = 1; @@ -50,8 +50,8 @@ describe("Abilities - Pastel Veil", () => { }); it("it heals the poisoned status condition of allies if user is sent out into battle", async () => { - await game.startBattle([ Species.MAGIKARP, Species.FEEBAS, Species.GALAR_PONYTA ]); - const ponyta = game.scene.getParty()[2]; + await game.startBattle([Species.MAGIKARP, Species.FEEBAS, Species.GALAR_PONYTA]); + const ponyta = game.scene.getPlayerParty()[2]; const magikarp = game.scene.getPlayerField()[0]; ponyta.abilityIndex = 1; diff --git a/test/abilities/perish_body.test.ts b/test/abilities/perish_body.test.ts new file mode 100644 index 00000000000..424d35e2542 --- /dev/null +++ b/test/abilities/perish_body.test.ts @@ -0,0 +1,112 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Perish Song", () => { + 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.disableCrits(); + + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.override.starterSpecies(Species.CURSOLA); + game.override.ability(Abilities.PERISH_BODY); + game.override.moveset([Moves.SPLASH]); + }); + + it("should trigger when hit with damaging move", async () => { + game.override.enemyMoveset([Moves.AQUA_JET]); + await game.classicMode.startBattle(); + const cursola = game.scene.getPlayerPokemon(); + const magikarp = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(cursola?.summonData.tags[0].turnCount).toBe(3); + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + }); + + it("should trigger even when fainting", async () => { + game.override.enemyMoveset([Moves.AQUA_JET]).enemyLevel(100).startingLevel(1); + await game.classicMode.startBattle([Species.CURSOLA, Species.FEEBAS]); + const magikarp = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + }); + + it("should not activate if attacker already has perish song", async () => { + game.override.enemyMoveset([Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH]); + await game.classicMode.startBattle([Species.FEEBAS, Species.CURSOLA]); + const feebas = game.scene.getPlayerPokemon(); + const magikarp = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.PERISH_SONG); + await game.toNextTurn(); + + expect(feebas?.summonData.tags[0].turnCount).toBe(3); + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const cursola = game.scene.getPlayerPokemon(); + expect(cursola?.summonData.tags.length).toBe(0); + expect(magikarp?.summonData.tags[0].turnCount).toBe(2); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.AQUA_JET); + await game.toNextTurn(); + + expect(cursola?.summonData.tags.length).toBe(0); + expect(magikarp?.summonData.tags[0].turnCount).toBe(1); + }); + + it("should activate if cursola already has perish song, but not reset its counter", async () => { + game.override.enemyMoveset([Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH]); + game.override.moveset([Moves.WHIRLWIND, Moves.SPLASH]); + game.override.startingWave(5); + await game.classicMode.startBattle([Species.CURSOLA]); + const cursola = game.scene.getPlayerPokemon(); + + game.move.select(Moves.WHIRLWIND); + await game.forceEnemyMove(Moves.PERISH_SONG); + await game.toNextTurn(); + + const magikarp = game.scene.getEnemyPokemon(); + expect(cursola?.summonData.tags[0].turnCount).toBe(3); + expect(magikarp?.summonData.tags.length).toBe(0); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.AQUA_JET); + await game.toNextTurn(); + + expect(cursola?.summonData.tags[0].turnCount).toBe(2); + expect(magikarp?.summonData.tags.length).toBe(1); + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + }); +}); diff --git a/test/abilities/power_construct.test.ts b/test/abilities/power_construct.test.ts new file mode 100644 index 00000000000..c253f2ae4df --- /dev/null +++ b/test/abilities/power_construct.test.ts @@ -0,0 +1,87 @@ +import { Status } from "#app/data/status-effect"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Abilities - POWER CONSTRUCT", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + const moveToUse = Moves.SPLASH; + game.override.battleType("single"); + game.override.ability(Abilities.POWER_CONSTRUCT); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + }); + + test("check if fainted 50% Power Construct Pokemon switches to base form on arena reset", async () => { + const baseForm = 2, + completeForm = 4; + game.override.startingWave(4); + game.override.starterForms({ + [Species.ZYGARDE]: completeForm, + }); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.ZYGARDE]); + + const zygarde = game.scene.getPlayerParty().find(p => p.species.speciesId === Species.ZYGARDE); + expect(zygarde).not.toBe(undefined); + expect(zygarde!.formIndex).toBe(completeForm); + + zygarde!.hp = 0; + zygarde!.status = new Status(StatusEffect.FAINT); + expect(zygarde!.isFainted()).toBe(true); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(QuietFormChangePhase); + + expect(zygarde!.formIndex).toBe(baseForm); + }); + + test("check if fainted 10% Power Construct Pokemon switches to base form on arena reset", async () => { + const baseForm = 3, + completeForm = 5; + game.override.startingWave(4); + game.override.starterForms({ + [Species.ZYGARDE]: completeForm, + }); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.ZYGARDE]); + + const zygarde = game.scene.getPlayerParty().find(p => p.species.speciesId === Species.ZYGARDE); + expect(zygarde).not.toBe(undefined); + expect(zygarde!.formIndex).toBe(completeForm); + + zygarde!.hp = 0; + zygarde!.status = new Status(StatusEffect.FAINT); + expect(zygarde!.isFainted()).toBe(true); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(QuietFormChangePhase); + + expect(zygarde!.formIndex).toBe(baseForm); + }); +}); diff --git a/src/test/abilities/power_spot.test.ts b/test/abilities/power_spot.test.ts similarity index 84% rename from src/test/abilities/power_spot.test.ts rename to test/abilities/power_spot.test.ts index a566c2277c3..e29b5ecf775 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/test/abilities/power_spot.test.ts @@ -1,10 +1,10 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -27,7 +27,7 @@ describe("Abilities - Power Spot", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM ]); + game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); game.override.enemyMoveset(Moves.SPLASH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); @@ -39,7 +39,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.REGIELEKI, Species.STONJOURNER ]); + await game.startBattle([Species.REGIELEKI, Species.STONJOURNER]); game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to(MoveEffectPhase); @@ -53,7 +53,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.REGIELEKI, Species.STONJOURNER ]); + await game.startBattle([Species.REGIELEKI, Species.STONJOURNER]); game.move.select(Moves.BREAKING_SWIPE); game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to(MoveEffectPhase); @@ -67,7 +67,7 @@ describe("Abilities - Power Spot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.startBattle([ Species.STONJOURNER, Species.REGIELEKI ]); + await game.startBattle([Species.STONJOURNER, Species.REGIELEKI]); game.move.select(Moves.BREAKING_SWIPE); game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/test/abilities/protean.test.ts b/test/abilities/protean.test.ts new file mode 100644 index 00000000000..574033bb13f --- /dev/null +++ b/test/abilities/protean.test.ts @@ -0,0 +1,301 @@ +import { allMoves } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; +import { Weather } from "#app/data/weather"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Biome } from "#enums/biome"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { WeatherType } from "#enums/weather-type"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Abilities - Protean", () => { + 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.ability(Abilities.PROTEAN); + game.override.startingLevel(100); + game.override.enemySpecies(Species.RATTATA); + game.override.enemyMoveset([Moves.ENDURE, Moves.ENDURE, Moves.ENDURE, Moves.ENDURE]); + }); + + test("ability applies and changes a pokemon's type", async () => { + game.override.moveset([Moves.SPLASH]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + }); + + // Test for Gen9+ functionality, we are using previous funcionality + test.skip("ability applies only once per switch in", async () => { + game.override.moveset([Moves.SPLASH, Moves.AGILITY]); + + await game.startBattle([Species.MAGIKARP, Species.BULBASAUR]); + + let leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + + game.move.select(Moves.AGILITY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied.filter(a => a === Abilities.PROTEAN)).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]]; + const moveType = PokemonType[allMoves[Moves.AGILITY].type]; + expect(leadPokemonType).not.toBe(moveType); + + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + + leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.SPLASH); + }); + + test("ability applies correctly even if the pokemon's move has a variable type", async () => { + game.override.moveset([Moves.WEATHER_BALL]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.scene.arena.weather = new Weather(WeatherType.SUNNY); + game.move.select(Moves.WEATHER_BALL); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); + expect(leadPokemon.getTypes()).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.FIRE]; + expect(leadPokemonType).toBe(moveType); + }); + + test("ability applies correctly even if the type has changed by another ability", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.passiveAbility(Abilities.REFRIGERATE); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); + expect(leadPokemon.getTypes()).toHaveLength(1); + const leadPokemonType = PokemonType[leadPokemon.getTypes()[0]], + moveType = PokemonType[PokemonType.ICE]; + expect(leadPokemonType).toBe(moveType); + }); + + test("ability applies correctly even if the pokemon's move calls another move", async () => { + game.override.moveset([Moves.NATURE_POWER]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.scene.arena.biomeType = Biome.MOUNTAIN; + game.move.select(Moves.NATURE_POWER); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.AIR_SLASH); + }); + + test("ability applies correctly even if the pokemon's move is delayed / charging", async () => { + game.override.moveset([Moves.DIG]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.DIG); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.DIG); + }); + + test("ability applies correctly even if the pokemon's move misses", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset(Moves.SPLASH); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TACKLE); + await game.move.forceMiss(); + await game.phaseInterceptor.to(TurnEndPhase); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.isFullHp()).toBe(true); + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); + + test("ability applies correctly even if the pokemon's move is protected against", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); + + test("ability applies correctly even if the pokemon's move fails because of type immunity", async () => { + game.override.moveset([Moves.TACKLE]); + game.override.enemySpecies(Species.GASTLY); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); + }); + + test("ability is not applied if pokemon's type is the same as the move's type", async () => { + game.override.moveset([Moves.SPLASH]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + leadPokemon.summonData.types = [allMoves[Moves.SPLASH].type]; + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); + }); + + test("ability is not applied if pokemon is terastallized", async () => { + game.override.moveset([Moves.SPLASH]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + leadPokemon.isTerastallized = true; + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); + }); + + test("ability is not applied if pokemon uses struggle", async () => { + game.override.moveset([Moves.STRUGGLE]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.STRUGGLE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); + }); + + test("ability is not applied if the pokemon's move fails", async () => { + game.override.moveset([Moves.BURN_UP]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.BURN_UP); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.summonData.abilitiesApplied).not.toContain(Abilities.PROTEAN); + }); + + test("ability applies correctly even if the pokemon's Trick-or-Treat fails", async () => { + game.override.moveset([Moves.TRICK_OR_TREAT]); + game.override.enemySpecies(Species.GASTLY); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.TRICK_OR_TREAT); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TRICK_OR_TREAT); + }); + + test("ability applies correctly and the pokemon curses itself", async () => { + game.override.moveset([Moves.CURSE]); + + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to(TurnEndPhase); + + testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.CURSE); + expect(leadPokemon.getTag(BattlerTagType.CURSED)).not.toBe(undefined); + }); +}); + +function testPokemonTypeMatchesDefaultMoveType(pokemon: PlayerPokemon, move: Moves) { + expect(pokemon.summonData.abilitiesApplied).toContain(Abilities.PROTEAN); + expect(pokemon.getTypes()).toHaveLength(1); + const pokemonType = PokemonType[pokemon.getTypes()[0]], + moveType = PokemonType[allMoves[move].type]; + expect(pokemonType).toBe(moveType); +} diff --git a/test/abilities/protosynthesis.test.ts b/test/abilities/protosynthesis.test.ts new file mode 100644 index 00000000000..d0ae46cd951 --- /dev/null +++ b/test/abilities/protosynthesis.test.ts @@ -0,0 +1,67 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Nature } from "#enums/nature"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { BattlerIndex } from "#app/battle"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Protosynthesis", () => { + 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.PROTOSYNTHESIS) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should not consider temporary items when determining which stat to boost", async () => { + // Mew has uniform base stats + game.override + .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.DEF }]) + .enemyMoveset(Moves.SUNNY_DAY) + .startingLevel(100) + .enemyLevel(100); + await game.classicMode.startBattle([Species.MEW]); + const mew = game.scene.getPlayerPokemon()!; + // Nature of starting mon is randomized. We need to fix it to a neutral nature for the automated test. + mew.setNature(Nature.HARDY); + const enemy = game.scene.getEnemyPokemon()!; + const def_before_boost = mew.getEffectiveStat(Stat.DEF, undefined, undefined, false, undefined, false, false, true); + const atk_before_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); + const initialHp = enemy.hp; + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + const unboosted_dmg = initialHp - enemy.hp; + enemy.hp = initialHp; + const def_after_boost = mew.getEffectiveStat(Stat.DEF, undefined, undefined, false, undefined, false, false, true); + const atk_after_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + const boosted_dmg = initialHp - enemy.hp; + expect(boosted_dmg).toBeGreaterThan(unboosted_dmg); + expect(def_after_boost).toEqual(def_before_boost); + expect(atk_after_boost).toBeGreaterThan(atk_before_boost); + }); +}); diff --git a/src/test/abilities/quick_draw.test.ts b/test/abilities/quick_draw.test.ts similarity index 70% rename from src/test/abilities/quick_draw.test.ts rename to test/abilities/quick_draw.test.ts index 4979152f4d6..9969dc2aa75 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/test/abilities/quick_draw.test.ts @@ -3,7 +3,7 @@ import { FaintPhase } from "#app/phases/faint-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; @@ -27,14 +27,16 @@ describe("Abilities - Quick Draw", () => { game.override.starterSpecies(Species.MAGIKARP); game.override.ability(Abilities.QUICK_DRAW); - game.override.moveset([ Moves.TACKLE, Moves.TAIL_WHIP ]); + game.override.moveset([Moves.TACKLE, Moves.TAIL_WHIP]); game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE]); - vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); + vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue( + 100, + ); }); test("makes pokemon going first in its priority bracket", async () => { @@ -54,28 +56,31 @@ describe("Abilities - Quick Draw", () => { expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); }, 20000); - test("does not triggered by non damage moves", { - retry: 5 - }, async () => { - await game.startBattle(); + test( + "does not triggered by non damage moves", + { + retry: 5, + }, + async () => { + await game.startBattle(); - const pokemon = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const pokemon = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; - pokemon.hp = 1; - enemy.hp = 1; + pokemon.hp = 1; + enemy.hp = 1; - game.move.select(Moves.TAIL_WHIP); - await game.phaseInterceptor.to(FaintPhase, false); + game.move.select(Moves.TAIL_WHIP); + await game.phaseInterceptor.to(FaintPhase, false); - expect(pokemon.isFainted()).toBe(true); - expect(enemy.isFainted()).toBe(false); - expect(pokemon.battleData.abilitiesApplied).not.contain(Abilities.QUICK_DRAW); - } + expect(pokemon.isFainted()).toBe(true); + expect(enemy.isFainted()).toBe(false); + expect(pokemon.battleData.abilitiesApplied).not.contain(Abilities.QUICK_DRAW); + }, ); test("does not increase priority", async () => { - game.override.enemyMoveset([ Moves.EXTREME_SPEED ]); + game.override.enemyMoveset([Moves.EXTREME_SPEED]); await game.startBattle(); diff --git a/src/test/abilities/sand_spit.test.ts b/test/abilities/sand_spit.test.ts similarity index 66% rename from src/test/abilities/sand_spit.test.ts rename to test/abilities/sand_spit.test.ts index 1c21cff3c14..6896c286eed 100644 --- a/src/test/abilities/sand_spit.test.ts +++ b/test/abilities/sand_spit.test.ts @@ -2,11 +2,10 @@ import { WeatherType } from "#app/enums/weather-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Sand Spit", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,12 +30,12 @@ describe("Abilities - Sand Spit", () => { game.override.starterSpecies(Species.SILICOBRA); game.override.ability(Abilities.SAND_SPIT); - game.override.moveset([ Moves.SPLASH, Moves.COIL ]); + game.override.moveset([Moves.SPLASH, Moves.COIL]); }); it("should trigger when hit with damaging move", async () => { - game.override.enemyMoveset([ Moves.TACKLE ]); - await game.startBattle(); + game.override.enemyMoveset([Moves.TACKLE]); + await game.classicMode.startBattle(); game.move.select(Moves.SPLASH); await game.toNextTurn(); @@ -44,9 +43,20 @@ describe("Abilities - Sand Spit", () => { expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SANDSTORM); }, 20000); + it("should trigger even when fainting", async () => { + game.override.enemyMoveset([Moves.TACKLE]).enemyLevel(100).startingLevel(1); + await game.classicMode.startBattle([Species.SILICOBRA, Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SANDSTORM); + }); + it("should not trigger when targetted with status moves", async () => { - game.override.enemyMoveset([ Moves.GROWL ]); - await game.startBattle(); + game.override.enemyMoveset([Moves.GROWL]); + await game.classicMode.startBattle(); game.move.select(Moves.COIL); await game.toNextTurn(); diff --git a/test/abilities/sand_veil.test.ts b/test/abilities/sand_veil.test.ts new file mode 100644 index 00000000000..5e0a3f567dd --- /dev/null +++ b/test/abilities/sand_veil.test.ts @@ -0,0 +1,73 @@ +import { StatMultiplierAbAttr, allAbilities } from "#app/data/ability"; +import { CommandPhase } from "#app/phases/command-phase"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import { WeatherType } from "#enums/weather-type"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; + +describe("Abilities - Sand Veil", () => { + 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]); + game.override.enemySpecies(Species.MEOWSCARADA); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.weather(WeatherType.SANDSTORM).battleType("double"); + }); + + test("ability should increase the evasiveness of the source", async () => { + await game.startBattle([Species.SNORLAX, Species.BLISSEY]); + + const leadPokemon = game.scene.getPlayerField(); + + vi.spyOn(leadPokemon[0], "getAbility").mockReturnValue(allAbilities[Abilities.SAND_VEIL]); + + const sandVeilAttr = allAbilities[Abilities.SAND_VEIL].getAttrs(StatMultiplierAbAttr)[0]; + vi.spyOn(sandVeilAttr, "applyStatStage").mockImplementation( + (_pokemon, _passive, _simulated, stat, statValue, _args) => { + if (stat === Stat.EVA && game.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) { + statValue.value *= -1; // will make all attacks miss + return true; + } + return false; + }, + ); + + expect(leadPokemon[0].hasAbility(Abilities.SAND_VEIL)).toBe(true); + expect(leadPokemon[1].hasAbility(Abilities.SAND_VEIL)).toBe(false); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + await game.phaseInterceptor.to(MoveEndPhase, false); + + expect(leadPokemon[0].isFullHp()).toBe(true); + expect(leadPokemon[1].hp).toBeLessThan(leadPokemon[1].getMaxHp()); + }); +}); diff --git a/src/test/abilities/sap_sipper.test.ts b/test/abilities/sap_sipper.test.ts similarity index 61% rename from src/test/abilities/sap_sipper.test.ts rename to test/abilities/sap_sipper.test.ts index a4ce0c1b8f6..f4f02844cbc 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/test/abilities/sap_sipper.test.ts @@ -6,9 +6,10 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/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 { allMoves, RandomMoveAttr } from "#app/data/moves/move"; // See also: TypeImmunityAbAttr describe("Abilities - Sap Sipper", () => { @@ -27,20 +28,21 @@ describe("Abilities - Sap Sipper", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single"); - game.override.disableCrits(); + game.override + .battleType("single") + .disableCrits() + .ability(Abilities.SAP_SIPPER) + .enemySpecies(Species.RATTATA) + .enemyAbility(Abilities.SAP_SIPPER) + .enemyMoveset(Moves.SPLASH); }); - it("raises ATK stat stage by 1 and block effects when activated against a grass attack", async() => { + it("raises ATK stat stage by 1 and block effects when activated against a grass attack", async () => { const moveToUse = Moves.LEAFAGE; - const enemyAbility = Abilities.SAP_SIPPER; - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(Moves.SPLASH); - game.override.enemySpecies(Species.DUSKULL); - game.override.enemyAbility(enemyAbility); + game.override.moveset(moveToUse); - await game.startBattle(); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const initialEnemyHp = enemyPokemon.hp; @@ -53,16 +55,12 @@ describe("Abilities - Sap Sipper", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); }); - it("raises ATK stat stage by 1 and block effects when activated against a grass status move", async() => { + it("raises ATK stat stage by 1 and block effects when activated against a grass status move", async () => { const moveToUse = Moves.SPORE; - const enemyAbility = Abilities.SAP_SIPPER; - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(Moves.SPLASH); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyAbility(enemyAbility); + game.override.moveset(moveToUse); - await game.startBattle(); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -76,14 +74,10 @@ describe("Abilities - Sap Sipper", () => { it("do not activate against status moves that target the field", async () => { const moveToUse = Moves.GRASSY_TERRAIN; - const enemyAbility = Abilities.SAP_SIPPER; - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(Moves.SPLASH); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyAbility(enemyAbility); + game.override.moveset(moveToUse); - await game.startBattle(); + await game.classicMode.startBattle([Species.BULBASAUR]); game.move.select(moveToUse); @@ -96,14 +90,10 @@ describe("Abilities - Sap Sipper", () => { it("activate once against multi-hit grass attacks", async () => { const moveToUse = Moves.BULLET_SEED; - const enemyAbility = Abilities.SAP_SIPPER; - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(Moves.SPLASH); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyAbility(enemyAbility); + game.override.moveset(moveToUse); - await game.startBattle(); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const initialEnemyHp = enemyPokemon.hp; @@ -118,15 +108,10 @@ describe("Abilities - Sap Sipper", () => { it("do not activate against status moves that target the user", async () => { const moveToUse = Moves.SPIKY_SHIELD; - const ability = Abilities.SAP_SIPPER; - game.override.moveset([ moveToUse ]); - game.override.ability(ability); - game.override.enemyMoveset(Moves.SPLASH); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyAbility(Abilities.NONE); + game.override.moveset(moveToUse); - await game.startBattle(); + await game.classicMode.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -142,18 +127,15 @@ describe("Abilities - Sap Sipper", () => { expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase"); }); - // TODO Add METRONOME outcome override - // To run this testcase, manually modify the METRONOME move to always give SAP_SIPPER, then uncomment - it.todo("activate once against multi-hit grass attacks (metronome)", async () => { + it("activate once against multi-hit grass attacks (metronome)", async () => { const moveToUse = Moves.METRONOME; - const enemyAbility = Abilities.SAP_SIPPER; - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE ]); - game.override.enemySpecies(Species.RATTATA); - game.override.enemyAbility(enemyAbility); + const randomMoveAttr = allMoves[Moves.METRONOME].findAttr(attr => attr instanceof RandomMoveAttr) as RandomMoveAttr; + vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.BULLET_SEED); - await game.startBattle(); + game.override.moveset(moveToUse); + + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; const initialEnemyHp = enemyPokemon.hp; @@ -168,11 +150,8 @@ describe("Abilities - Sap Sipper", () => { it("still activates regardless of accuracy check", async () => { game.override.moveset(Moves.LEAF_BLADE); - game.override.enemyMoveset(Moves.SPLASH); - game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyAbility(Abilities.SAP_SIPPER); - await game.classicMode.startBattle(); + await game.classicMode.startBattle([Species.BULBASAUR]); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/schooling.test.ts b/test/abilities/schooling.test.ts new file mode 100644 index 00000000000..35244b08e4c --- /dev/null +++ b/test/abilities/schooling.test.ts @@ -0,0 +1,60 @@ +import { Status } from "#app/data/status-effect"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Abilities - SCHOOLING", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + const moveToUse = Moves.SPLASH; + game.override.battleType("single"); + game.override.ability(Abilities.SCHOOLING); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + }); + + test("check if fainted pokemon switches to base form on arena reset", async () => { + const soloForm = 0, + schoolForm = 1; + game.override.startingWave(4); + game.override.starterForms({ + [Species.WISHIWASHI]: schoolForm, + }); + + await game.startBattle([Species.MAGIKARP, Species.WISHIWASHI]); + + const wishiwashi = game.scene.getPlayerParty().find(p => p.species.speciesId === Species.WISHIWASHI)!; + expect(wishiwashi).not.toBe(undefined); + expect(wishiwashi.formIndex).toBe(schoolForm); + + wishiwashi.hp = 0; + wishiwashi.status = new Status(StatusEffect.FAINT); + expect(wishiwashi.isFainted()).toBe(true); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(QuietFormChangePhase); + + expect(wishiwashi.formIndex).toBe(soloForm); + }); +}); diff --git a/src/test/abilities/screen_cleaner.test.ts b/test/abilities/screen_cleaner.test.ts similarity index 77% rename from src/test/abilities/screen_cleaner.test.ts rename to test/abilities/screen_cleaner.test.ts index c036aa90a77..d8be1d64697 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/test/abilities/screen_cleaner.test.ts @@ -4,7 +4,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -30,10 +30,10 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Aurora Veil", async () => { - game.override.moveset([ Moves.HAIL ]); - game.override.enemyMoveset([ Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL ]); + game.override.moveset([Moves.HAIL]); + game.override.enemyMoveset([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.HAIL); await game.phaseInterceptor.to(TurnEndPhase); @@ -48,9 +48,9 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Light Screen", async () => { - game.override.enemyMoveset([ Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN ]); + game.override.enemyMoveset([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); @@ -65,9 +65,9 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Reflect", async () => { - game.override.enemyMoveset([ Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT ]); + game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); - await game.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/test/abilities/seed_sower.test.ts b/test/abilities/seed_sower.test.ts new file mode 100644 index 00000000000..d78007f7500 --- /dev/null +++ b/test/abilities/seed_sower.test.ts @@ -0,0 +1,66 @@ +import { TerrainType } from "#app/data/terrain"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Seed Sower", () => { + 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.disableCrits(); + + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.override.starterSpecies(Species.ARBOLIVA); + game.override.ability(Abilities.SEED_SOWER); + game.override.moveset([Moves.SPLASH]); + }); + + it("should trigger when hit with damaging move", async () => { + game.override.enemyMoveset([Moves.TACKLE]); + await game.classicMode.startBattle(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.arena.terrain?.terrainType).toBe(TerrainType.GRASSY); + }); + + it("should trigger even when fainting", async () => { + game.override.enemyMoveset([Moves.TACKLE]).enemyLevel(100).startingLevel(1); + await game.classicMode.startBattle([Species.ARBOLIVA, Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(game.scene.arena.terrain?.terrainType).toBe(TerrainType.GRASSY); + }); + + it("should not trigger when targetted with status moves", async () => { + game.override.enemyMoveset([Moves.GROWL]); + await game.classicMode.startBattle(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.arena.terrain?.terrainType).not.toBe(TerrainType.GRASSY); + }); +}); diff --git a/test/abilities/serene_grace.test.ts b/test/abilities/serene_grace.test.ts new file mode 100644 index 00000000000..65ca96acbbc --- /dev/null +++ b/test/abilities/serene_grace.test.ts @@ -0,0 +1,52 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { allMoves } from "#app/data/moves/move"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { FlinchAttr } from "#app/data/moves/move"; + +describe("Abilities - Serene Grace", () => { + 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 + .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("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.move.select(Moves.AIR_SLASH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase"); + + expect(airSlashFlinchAttr.getMoveChance).toHaveLastReturnedWith(60); + }); +}); diff --git a/test/abilities/sheer_force.test.ts b/test/abilities/sheer_force.test.ts new file mode 100644 index 00000000000..4a1c20cde5c --- /dev/null +++ b/test/abilities/sheer_force.test.ts @@ -0,0 +1,154 @@ +import { BattlerIndex } from "#app/battle"; +import { PokemonType } from "#enums/pokemon-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/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { allMoves, FlinchAttr } from "#app/data/moves/move"; + +describe("Abilities - Sheer Force", () => { + 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") + .ability(Abilities.SHEER_FORCE) + .enemySpecies(Species.ONIX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.SPLASH]) + .disableCrits(); + }); + + 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]); + + const tackleMove = allMoves[Moves.TACKLE]; + vi.spyOn(tackleMove, "calculateBattlePower"); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(tackleMove.calculateBattlePower).toHaveLastReturnedWith(tackleMove.power); + }); + + 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); + + 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.move.select(Moves.HEADBUTT); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon?.getTypes()[0]).toBe(PokemonType.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; + game.override + .enemyAbility(Abilities.COLOR_CHANGE) + .ability(Abilities.COLOR_CHANGE) + .moveset(moveToUse) + .enemyMoveset(moveToUse); + + await game.classicMode.startBattle([Species.PIDGEOT]); + + const pidgeot = game.scene.getPlayerParty()[0]; + const onix = game.scene.getEnemyParty()[0]; + + pidgeot.stats[Stat.DEF] = 10000; + onix.stats[Stat.DEF] = 10000; + + game.move.select(moveToUse); + await game.toNextTurn(); + + // Check that both Pokemon's Color Change activated + const expectedTypes = [allMoves[moveToUse].type]; + expect(pidgeot.getTypes()).toStrictEqual(expectedTypes); + expect(onix.getTypes()).toStrictEqual(expectedTypes); + }); + + 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/shield_dust.test.ts b/test/abilities/shield_dust.test.ts similarity index 54% rename from src/test/abilities/shield_dust.test.ts rename to test/abilities/shield_dust.test.ts index 0f831fcf3fa..8e02b5a7713 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/test/abilities/shield_dust.test.ts @@ -1,16 +1,20 @@ import { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; -import { Stat } from "#enums/stat"; +import { + applyAbAttrs, + applyPreDefendAbAttrs, + IgnoreMoveEffectsAbAttr, + MoveEffectChanceMultiplierAbAttr, +} from "#app/data/ability"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import * as Utils from "#app/utils"; +import { NumberHolder } 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 { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - Shield Dust", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,28 +31,23 @@ describe("Abilities - Shield Dust", () => { beforeEach(() => { game = new GameManager(phaserGame); - const movesToUse = [ Moves.AIR_SLASH ]; game.override.battleType("single"); game.override.enemySpecies(Species.ONIX); game.override.enemyAbility(Abilities.SHIELD_DUST); game.override.startingLevel(100); - game.override.moveset(movesToUse); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.moveset(Moves.AIR_SLASH); + game.override.enemyMoveset(Moves.TACKLE); }); it("Shield Dust", async () => { - const moveToUse = Moves.AIR_SLASH; - await game.startBattle([ - Species.PIDGEOT - ]); + await game.classicMode.startBattle([Species.PIDGEOT]); + game.scene.getEnemyPokemon()!.stats[Stat.SPDEF] = 10000; + expect(game.scene.getPlayerPokemon()!.formIndex).toBe(0); - game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; - expect(game.scene.getParty()[0].formIndex).toBe(0); + game.move.select(Moves.AIR_SLASH); - game.move.select(moveToUse); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase, false); // Shield Dust negates secondary effect @@ -56,12 +55,28 @@ describe("Abilities - Shield Dust", () => { 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.getTarget(), false); - applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getTarget()!, phase.getUserPokemon()!, null, null, false, chance); + const chance = new NumberHolder(move.chance); + await applyAbAttrs( + MoveEffectChanceMultiplierAbAttr, + phase.getUserPokemon()!, + null, + false, + chance, + move, + phase.getFirstTarget(), + false, + ); + await applyPreDefendAbAttrs( + IgnoreMoveEffectsAbAttr, + phase.getFirstTarget()!, + phase.getUserPokemon()!, + null, + null, + false, + chance, + ); expect(chance.value).toBe(0); - - }, 20000); + }); //TODO King's Rock Interaction Unit Test }); diff --git a/test/abilities/shields_down.test.ts b/test/abilities/shields_down.test.ts new file mode 100644 index 00000000000..4bdf22869cb --- /dev/null +++ b/test/abilities/shields_down.test.ts @@ -0,0 +1,185 @@ +import { Status } from "#app/data/status-effect"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Abilities - SHIELDS DOWN", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + const moveToUse = Moves.SPLASH; + game.override.battleType("single"); + game.override.ability(Abilities.SHIELDS_DOWN); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE]); + }); + + test("check if fainted pokemon switched to base form on arena reset", async () => { + const meteorForm = 0, + coreForm = 7; + game.override.startingWave(4); + game.override.starterForms({ + [Species.MINIOR]: coreForm, + }); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.MINIOR]); + + const minior = game.scene.getPlayerParty().find(p => p.species.speciesId === Species.MINIOR)!; + expect(minior).not.toBe(undefined); + expect(minior.formIndex).toBe(coreForm); + + minior.hp = 0; + minior.status = new Status(StatusEffect.FAINT); + expect(minior.isFainted()).toBe(true); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(QuietFormChangePhase); + + expect(minior.formIndex).toBe(meteorForm); + }); + + test("should ignore non-volatile status moves", async () => { + game.override.enemyMoveset([Moves.SPORE]); + + await game.classicMode.startBattle([Species.MINIOR]); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + }); + + test("should still ignore non-volatile status moves used by a pokemon with mold breaker", async () => { + game.override.enemyAbility(Abilities.MOLD_BREAKER); + game.override.enemyMoveset([Moves.SPORE]); + + await game.classicMode.startBattle([Species.MINIOR]); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPORE); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + }); + + test("should ignore non-volatile secondary status effects", async () => { + game.override.enemyMoveset([Moves.NUZZLE]); + + await game.classicMode.startBattle([Species.MINIOR]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + }); + + test("should ignore status moves even through mold breaker", async () => { + game.override.enemyMoveset([Moves.SPORE]); + game.override.enemyAbility(Abilities.MOLD_BREAKER); + + await game.classicMode.startBattle([Species.MINIOR]); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + }); + + // toxic spikes currently does not poison flying types when gravity is in effect + test.todo("should become poisoned by toxic spikes when grounded", async () => { + game.override.enemyMoveset([Moves.GRAVITY, Moves.TOXIC_SPIKES, Moves.SPLASH]); + game.override.moveset([Moves.GRAVITY, Moves.SPLASH]); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.MINIOR]); + + // turn 1 + game.move.select(Moves.GRAVITY); + await game.forceEnemyMove(Moves.TOXIC_SPIKES); + await game.toNextTurn(); + + // turn 2 + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.MINIOR); + expect(game.scene.getPlayerPokemon()!.species.formIndex).toBe(0); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.POISON); + }); + + test("should ignore yawn", async () => { + game.override.enemyMoveset([Moves.YAWN]); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.MINIOR]); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.YAWN); + + await game.phaseInterceptor.to(TurnEndPhase); + expect(game.scene.getPlayerPokemon()!.findTag(tag => tag.tagType === BattlerTagType.DROWSY)).toBe(undefined); + }); + + test("should not ignore volatile status effects", async () => { + game.override.enemyMoveset([Moves.CONFUSE_RAY]); + + await game.classicMode.startBattle([Species.MINIOR]); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.CONFUSE_RAY); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.getPlayerPokemon()!.findTag(tag => tag.tagType === BattlerTagType.CONFUSED)).not.toBe(undefined); + }); + + // the `NoTransformAbilityAbAttr` attribute is not checked anywhere, so this test cannot pass. + test.todo("ditto should not be immune to status after transforming", async () => { + game.override.enemySpecies(Species.DITTO); + game.override.enemyAbility(Abilities.IMPOSTER); + game.override.moveset([Moves.SPLASH, Moves.SPORE]); + + await game.classicMode.startBattle([Species.MINIOR]); + + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + }); + + test("should not prevent minior from receiving the fainted status effect in trainer battles", async () => { + game.override.enemyMoveset([Moves.TACKLE]); + game.override.moveset([Moves.THUNDERBOLT]); + game.override.startingLevel(100); + game.override.startingWave(5); + game.override.enemySpecies(Species.MINIOR); + await game.classicMode.startBattle([Species.REGIELEKI]); + const minior = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THUNDERBOLT); + await game.toNextTurn(); + expect(minior.isFainted()).toBe(true); + expect(minior.status?.effect).toBe(StatusEffect.FAINT); + }); +}); diff --git a/src/test/abilities/simple.test.ts b/test/abilities/simple.test.ts similarity index 84% rename from src/test/abilities/simple.test.ts rename to test/abilities/simple.test.ts index e5ca474d7c3..b6c5fd116c0 100644 --- a/src/test/abilities/simple.test.ts +++ b/test/abilities/simple.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -30,10 +30,8 @@ describe("Abilities - Simple", () => { .enemyMoveset(Moves.SPLASH); }); - it("should double stat changes when applied", async() => { - await game.startBattle([ - Species.SLOWBRO - ]); + it("should double stat changes when applied", async () => { + await game.startBattle([Species.SLOWBRO]); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/abilities/speed_boost.test.ts b/test/abilities/speed_boost.test.ts new file mode 100644 index 00000000000..fa20e74108f --- /dev/null +++ b/test/abilities/speed_boost.test.ts @@ -0,0 +1,115 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import type { CommandPhase } from "#app/phases/command-phase"; +import { Command } from "#app/ui/command-ui-handler"; +import { AttemptRunPhase } from "#app/phases/attempt-run-phase"; + +describe("Abilities - Speed Boost", () => { + 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") + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.BALL_FETCH) + .enemyLevel(100) + .ability(Abilities.SPEED_BOOST) + .enemyMoveset(Moves.SPLASH) + .moveset([Moves.SPLASH, Moves.U_TURN]); + }); + + it("should increase speed by 1 stage at end of turn", async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); + + it("should not trigger this turn if pokemon was switched into combat via attack, but the turn after", async () => { + await game.classicMode.startBattle([Species.SHUCKLE, Species.NINJASK]); + + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); + + it("checking back to back swtiches", async () => { + await game.classicMode.startBattle([Species.SHUCKLE, Species.NINJASK]); + + const [shuckle, ninjask] = game.scene.getPlayerParty(); + + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + 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(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", async () => { + await game.classicMode.startBattle([Species.SHUCKLE, Species.NINJASK]); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); + + it("should not trigger if pokemon fails to escape", async () => { + await game.classicMode.startBattle([Species.SHUCKLE]); + + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + const runPhase = game.scene.getCurrentPhase() as AttemptRunPhase; + runPhase.forceFailEscape = true; + await game.phaseInterceptor.to(AttemptRunPhase); + await game.toNextTurn(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); +}); diff --git a/test/abilities/stakeout.test.ts b/test/abilities/stakeout.test.ts new file mode 100644 index 00000000000..b464b3f1dfc --- /dev/null +++ b/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/testUtils/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/stall.test.ts b/test/abilities/stall.test.ts similarity index 80% rename from src/test/abilities/stall.test.ts rename to test/abilities/stall.test.ts index b51c56dbe1f..5b67e5f4b7a 100644 --- a/src/test/abilities/stall.test.ts +++ b/test/abilities/stall.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; @@ -26,8 +26,8 @@ describe("Abilities - Stall", () => { game.override.disableCrits(); game.override.enemySpecies(Species.REGIELEKI); game.override.enemyAbility(Abilities.STALL); - game.override.enemyMoveset([ Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK ]); - game.override.moveset([ Moves.QUICK_ATTACK, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); + game.override.moveset([Moves.QUICK_ATTACK, Moves.TACKLE]); }); /** @@ -37,7 +37,7 @@ describe("Abilities - Stall", () => { **/ it("Pokemon with Stall should move last in its priority bracket regardless of speed", async () => { - await game.startBattle([ Species.SHUCKLE ]); + await game.startBattle([Species.SHUCKLE]); const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); @@ -50,12 +50,12 @@ describe("Abilities - Stall", () => { const commandOrder = phase.getCommandOrder(); // The player Pokemon (without Stall) goes first despite having lower speed than the opponent. // The opponent Pokemon (with Stall) goes last despite having higher speed than the player Pokemon. - expect(speedOrder).toEqual([ enemyIndex, playerIndex ]); - expect(commandOrder).toEqual([ playerIndex, enemyIndex ]); + expect(speedOrder).toEqual([enemyIndex, playerIndex]); + expect(commandOrder).toEqual([playerIndex, enemyIndex]); }, 20000); it("Pokemon with Stall will go first if a move that is in a higher priority bracket than the opponent's move is used", async () => { - await game.startBattle([ Species.SHUCKLE ]); + await game.startBattle([Species.SHUCKLE]); const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); @@ -68,13 +68,13 @@ describe("Abilities - Stall", () => { const commandOrder = phase.getCommandOrder(); // The opponent Pokemon (with Stall) goes first because its move is still within a higher priority bracket than its opponent. // The player Pokemon goes second because its move is in a lower priority bracket. - expect(speedOrder).toEqual([ enemyIndex, playerIndex ]); - expect(commandOrder).toEqual([ enemyIndex, playerIndex ]); + expect(speedOrder).toEqual([enemyIndex, playerIndex]); + expect(commandOrder).toEqual([enemyIndex, playerIndex]); }, 20000); it("If both Pokemon have stall and use the same move, speed is used to determine who goes first.", async () => { game.override.ability(Abilities.STALL); - await game.startBattle([ Species.SHUCKLE ]); + await game.startBattle([Species.SHUCKLE]); const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); @@ -88,7 +88,7 @@ describe("Abilities - Stall", () => { // The opponent Pokemon (with Stall) goes first because it has a higher speed. // The player Pokemon (with Stall) goes second because its speed is lower. - expect(speedOrder).toEqual([ enemyIndex, playerIndex ]); - expect(commandOrder).toEqual([ enemyIndex, playerIndex ]); + expect(speedOrder).toEqual([enemyIndex, playerIndex]); + expect(commandOrder).toEqual([enemyIndex, playerIndex]); }, 20000); }); diff --git a/src/test/abilities/steely_spirit.test.ts b/test/abilities/steely_spirit.test.ts similarity index 85% rename from src/test/abilities/steely_spirit.test.ts rename to test/abilities/steely_spirit.test.ts index 61e76989060..9b4d32efcae 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/test/abilities/steely_spirit.test.ts @@ -1,9 +1,9 @@ import { allAbilities } from "#app/data/ability"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,13 +29,13 @@ describe("Abilities - Steely Spirit", () => { game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.moveset([ Moves.IRON_HEAD, Moves.SPLASH ]); + game.override.moveset([Moves.IRON_HEAD, Moves.SPLASH]); game.override.enemyMoveset(Moves.SPLASH); vi.spyOn(allMoves[moveToCheck], "calculateBattlePower"); }); it("increases Steel-type moves' power used by the user and its allies by 50%", async () => { - await game.classicMode.startBattle([ Species.PIKACHU, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.PIKACHU, Species.SHUCKLE]); const boostSource = game.scene.getPlayerField()[1]; const enemyToCheck = game.scene.getEnemyPokemon()!; @@ -51,7 +51,7 @@ describe("Abilities - Steely Spirit", () => { }); it("stacks if multiple users with this ability are on the field.", async () => { - await game.classicMode.startBattle([ Species.PIKACHU, Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU, Species.PIKACHU]); const enemyToCheck = game.scene.getEnemyPokemon()!; game.scene.getPlayerField().forEach(p => { @@ -64,11 +64,13 @@ describe("Abilities - Steely Spirit", () => { game.move.select(moveToCheck, 1, enemyToCheck.getBattlerIndex()); await game.phaseInterceptor.to("MoveEffectPhase"); - expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower * Math.pow(steelySpiritMultiplier, 2)); + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith( + ironHeadPower * Math.pow(steelySpiritMultiplier, 2), + ); }); it("does not take effect when suppressed", async () => { - await game.classicMode.startBattle([ Species.PIKACHU, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.PIKACHU, Species.SHUCKLE]); const boostSource = game.scene.getPlayerField()[1]; const enemyToCheck = game.scene.getEnemyPokemon()!; @@ -88,14 +90,12 @@ describe("Abilities - Steely Spirit", () => { }); it("affects variable-type moves if their resolved type is Steel", async () => { - game.override - .ability(Abilities.STEELY_SPIRIT) - .moveset([ Moves.REVELATION_DANCE ]); + game.override.ability(Abilities.STEELY_SPIRIT).moveset([Moves.REVELATION_DANCE]); const revelationDance = allMoves[Moves.REVELATION_DANCE]; vi.spyOn(revelationDance, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.KLINKLANG ]); + await game.classicMode.startBattle([Species.KLINKLANG]); game.move.select(Moves.REVELATION_DANCE); diff --git a/test/abilities/storm_drain.test.ts b/test/abilities/storm_drain.test.ts new file mode 100644 index 00000000000..e2a7b3e212e --- /dev/null +++ b/test/abilities/storm_drain.test.ts @@ -0,0 +1,115 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Storm Drain", () => { + 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.WATER_GUN ]) + .ability(Abilities.BALL_FETCH) + .battleType("double") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should redirect water type moves", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.WATER_GUN, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(true); + }); + + it("should not redirect non-water type moves", async () => { + game.override.moveset([ Moves.SPLASH, Moves.AERIAL_ACE ]); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.AERIAL_ACE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(false); + }); + + it("should boost the user's spatk without damaging", async () => { + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.WATER_GUN, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy2.isFullHp()).toBe(true); + expect(enemy2.getStatStage(Stat.SPATK)).toBe(1); + }); + + it("should not redirect moves changed from water type via ability", async () => { + game.override.ability(Abilities.NORMALIZE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.WATER_GUN, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(false); + }); + + it("should redirect moves changed to water type via ability", async () => { + game.override.ability(Abilities.LIQUID_VOICE) + .moveset(Moves.PSYCHIC_NOISE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + + const enemy1 = game.scene.getEnemyField()[0]; + const enemy2 = game.scene.getEnemyField()[1]; + + enemy2.summonData.ability = Abilities.STORM_DRAIN; + + game.move.select(Moves.PSYCHIC_NOISE, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy1.isFullHp()).toBe(true); + expect(enemy2.getStatStage(Stat.SPATK)).toBe(1); + }); +}); diff --git a/test/abilities/sturdy.test.ts b/test/abilities/sturdy.test.ts new file mode 100644 index 00000000000..7b7254cff15 --- /dev/null +++ b/test/abilities/sturdy.test.ts @@ -0,0 +1,78 @@ +import type { EnemyPokemon } from "#app/field/pokemon"; +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"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Abilities - Sturdy", () => { + 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.starterSpecies(Species.LUCARIO); + game.override.startingLevel(100); + game.override.moveset([Moves.CLOSE_COMBAT, Moves.FISSURE]); + + game.override.enemySpecies(Species.ARON); + game.override.enemyLevel(5); + game.override.enemyAbility(Abilities.STURDY); + }); + + test("Sturdy activates when user is at full HP", async () => { + await game.startBattle(); + game.move.select(Moves.CLOSE_COMBAT); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.getEnemyParty()[0].hp).toBe(1); + }); + + test("Sturdy doesn't activate when user is not at full HP", async () => { + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; + enemyPokemon.hp = enemyPokemon.getMaxHp() - 1; + + game.move.select(Moves.CLOSE_COMBAT); + await game.phaseInterceptor.to(DamageAnimPhase); + + expect(enemyPokemon.hp).toBe(0); + expect(enemyPokemon.isFainted()).toBe(true); + }); + + test("Sturdy pokemon should be immune to OHKO moves", async () => { + await game.startBattle(); + game.move.select(Moves.FISSURE); + await game.phaseInterceptor.to(MoveEndPhase); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; + expect(enemyPokemon.isFullHp()).toBe(true); + }); + + test("Sturdy is ignored by pokemon with `Abilities.MOLD_BREAKER`", async () => { + game.override.ability(Abilities.MOLD_BREAKER); + + await game.startBattle(); + game.move.select(Moves.CLOSE_COMBAT); + await game.phaseInterceptor.to(DamageAnimPhase); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; + expect(enemyPokemon.hp).toBe(0); + expect(enemyPokemon.isFainted()).toBe(true); + }); +}); diff --git a/test/abilities/supreme_overlord.test.ts b/test/abilities/supreme_overlord.test.ts new file mode 100644 index 00000000000..b70acbd8d17 --- /dev/null +++ b/test/abilities/supreme_overlord.test.ts @@ -0,0 +1,166 @@ +import { Moves } from "#app/enums/moves"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#enums/species"; +import { BattlerIndex } from "#app/battle"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { allMoves } from "#app/data/moves/move"; + +describe("Abilities - Supreme Overlord", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const move = allMoves[Moves.TACKLE]; + const basePower = move.power; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemySpecies(Species.MAGIKARP) + .enemyLevel(100) + .startingLevel(1) + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.SUPREME_OVERLORD) + .enemyMoveset([Moves.SPLASH]) + .moveset([Moves.TACKLE, Moves.EXPLOSION, Moves.LUNAR_DANCE]); + + vi.spyOn(move, "calculateBattlePower"); + }); + + it("should increase Power by 20% if 2 Pokemon are fainted in the party", async () => { + await game.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.2); + }); + + it("should increase Power by 30% if an ally fainted twice and another one once", async () => { + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + /** + * Bulbasur faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Charmander faints once + */ + game.doRevivePokemon(1); + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Bulbasur faints twice + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.3); + }); + + it("should maintain its power during next battle if it is within the same arena encounter", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(1).enemyLevel(1).startingLevel(100); + + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + /** + * The first Pokemon faints and another Pokemon in the party is selected. + */ + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Enemy Pokemon faints and new wave is entered. + */ + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextWave(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower * 1.1); + }); + + it("should reset playerFaints count if we enter new trainer battle", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(4).enemyLevel(1).startingLevel(100); + + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextWave(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); + + it("should reset playerFaints count if we enter new biome", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(10).enemyLevel(1).startingLevel(100); + + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextWave(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); +}); diff --git a/src/test/abilities/sweet_veil.test.ts b/test/abilities/sweet_veil.test.ts similarity index 81% rename from src/test/abilities/sweet_veil.test.ts rename to test/abilities/sweet_veil.test.ts index ef66cb1c68a..650ee53a474 100644 --- a/src/test/abilities/sweet_veil.test.ts +++ b/test/abilities/sweet_veil.test.ts @@ -5,7 +5,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -26,14 +26,14 @@ describe("Abilities - Sweet Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.SPLASH, Moves.REST, Moves.YAWN ]); + game.override.moveset([Moves.SPLASH, Moves.REST, Moves.YAWN]); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.POWDER, Moves.POWDER, Moves.POWDER, Moves.POWDER ]); + game.override.enemyMoveset([Moves.POWDER, Moves.POWDER, Moves.POWDER, Moves.POWDER]); }); it("prevents the user and its allies from falling asleep", async () => { - await game.startBattle([ Species.SWIRLIX, Species.MAGIKARP ]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); game.move.select(Moves.SPLASH); game.move.select(Moves.SPLASH, 1); @@ -45,7 +45,7 @@ describe("Abilities - Sweet Veil", () => { it("causes Rest to fail when used by the user or its allies", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ Species.SWIRLIX, Species.MAGIKARP ]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); game.move.select(Moves.SPLASH); game.move.select(Moves.REST, 1); @@ -56,8 +56,8 @@ describe("Abilities - Sweet Veil", () => { }); it("causes Yawn to fail if used on the user or its allies", async () => { - game.override.enemyMoveset([ Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN ]); - await game.startBattle([ Species.SWIRLIX, Species.MAGIKARP ]); + game.override.enemyMoveset([Moves.YAWN, Moves.YAWN, Moves.YAWN, Moves.YAWN]); + await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); game.move.select(Moves.SPLASH); game.move.select(Moves.SPLASH, 1); @@ -73,7 +73,7 @@ describe("Abilities - Sweet Veil", () => { game.override.startingLevel(5); game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX ]); + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX]); game.move.select(Moves.SPLASH); game.move.select(Moves.YAWN, 1, BattlerIndex.PLAYER); diff --git a/src/test/abilities/synchronize.test.ts b/test/abilities/synchronize.test.ts similarity index 56% rename from src/test/abilities/synchronize.test.ts rename to test/abilities/synchronize.test.ts index cdd2834f588..95ebf96f2fd 100644 --- a/src/test/abilities/synchronize.test.ts +++ b/test/abilities/synchronize.test.ts @@ -1,8 +1,8 @@ -import { StatusEffect } from "#app/data/status-effect"; -import GameManager from "#app/test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -28,30 +28,30 @@ describe("Abilities - Synchronize", () => { .startingLevel(100) .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.SYNCHRONIZE) - .moveset([ Moves.SPLASH, Moves.THUNDER_WAVE, Moves.SPORE, Moves.PSYCHO_SHIFT ]) + .moveset([Moves.SPLASH, Moves.THUNDER_WAVE, Moves.SPORE, Moves.PSYCHO_SHIFT]) .ability(Abilities.NO_GUARD); - }, 20000); + }); it("does not trigger when no status is applied by opponent Pokemon", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getParty()[0].status).toBeUndefined(); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase"); - }, 20000); + }); it("sets the status of the source pokemon to Paralysis when paralyzed by it", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.THUNDER_WAVE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getParty()[0].status?.effect).toBe(StatusEffect.PARALYSIS); - expect(game.scene.getEnemyParty()[0].status?.effect).toBe(StatusEffect.PARALYSIS); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.PARALYSIS); + expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.PARALYSIS); expect(game.phaseInterceptor.log).toContain("ShowAbilityPhase"); - }, 20000); + }); it("does not trigger on Sleep", async () => { await game.classicMode.startBattle(); @@ -60,10 +60,10 @@ describe("Abilities - Synchronize", () => { await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getParty()[0].status?.effect).toBeUndefined(); - expect(game.scene.getEnemyParty()[0].status?.effect).toBe(StatusEffect.SLEEP); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBeUndefined(); + expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase"); - }, 20000); + }); it("does not trigger when Pokemon is statused by Toxic Spikes", async () => { game.override @@ -71,7 +71,7 @@ describe("Abilities - Synchronize", () => { .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Array(4).fill(Moves.TOXIC_SPIKES)); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); game.move.select(Moves.SPLASH); await game.toNextTurn(); @@ -79,31 +79,19 @@ describe("Abilities - Synchronize", () => { game.doSwitchPokemon(1); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getParty()[0].status?.effect).toBe(StatusEffect.POISON); - expect(game.scene.getEnemyParty()[0].status?.effect).toBeUndefined(); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.POISON); + expect(game.scene.getEnemyPokemon()!.status?.effect).toBeUndefined(); expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase"); - }, 20000); + }); it("shows ability even if it fails to set the status of the opponent Pokemon", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.THUNDER_WAVE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getParty()[0].status?.effect).toBeUndefined(); - expect(game.scene.getEnemyParty()[0].status?.effect).toBe(StatusEffect.PARALYSIS); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBeUndefined(); + expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.PARALYSIS); expect(game.phaseInterceptor.log).toContain("ShowAbilityPhase"); - }, 20000); - - it("should activate with Psycho Shift after the move clears the status", async () => { - game.override.statusEffect(StatusEffect.PARALYSIS); - await game.classicMode.startBattle(); - - game.move.select(Moves.PSYCHO_SHIFT); - await game.phaseInterceptor.to("BerryPhase"); - - expect(game.scene.getParty()[0].status?.effect).toBe(StatusEffect.PARALYSIS); // keeping old gen < V impl for now since it's buggy otherwise - expect(game.scene.getEnemyParty()[0].status?.effect).toBe(StatusEffect.PARALYSIS); - expect(game.phaseInterceptor.log).toContain("ShowAbilityPhase"); - }, 20000); + }); }); diff --git a/test/abilities/tera_shell.test.ts b/test/abilities/tera_shell.test.ts new file mode 100644 index 00000000000..a99ecfd4ce1 --- /dev/null +++ b/test/abilities/tera_shell.test.ts @@ -0,0 +1,117 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { HitResult } from "#app/field/pokemon"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Tera Shell", () => { + 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") + .ability(Abilities.TERA_SHELL) + .moveset([Moves.SPLASH]) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset([Moves.MACH_PUNCH]) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should change the effectiveness of non-resisted attacks when the source is at full HP", async () => { + await game.classicMode.startBattle([Species.SNORLAX]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveEffectiveness"); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.5); + + await game.toNextTurn(); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(2); + }); + + it("should not override type immunities", async () => { + game.override.enemyMoveset([Moves.SHADOW_SNEAK]); + + await game.classicMode.startBattle([Species.SNORLAX]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveEffectiveness"); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0); + }); + + it("should not override type multipliers less than 0.5x", async () => { + game.override.enemyMoveset([Moves.QUICK_ATTACK]); + + await game.classicMode.startBattle([Species.AGGRON]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getMoveEffectiveness"); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.25); + }); + + it("should not affect the effectiveness of fixed-damage moves", async () => { + game.override.enemyMoveset([Moves.DRAGON_RAGE]); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "apply"); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.EFFECTIVE); + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp() - 40); + }); + + it("should change the effectiveness of all strikes of a multi-strike move", async () => { + game.override.enemyMoveset([Moves.DOUBLE_HIT]); + + await game.classicMode.startBattle([Species.SNORLAX]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "apply"); + + game.move.select(Moves.SPLASH); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.move.forceHit(); + for (let i = 0; i < 2; i++) { + await game.phaseInterceptor.to("MoveEffectPhase"); + expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.NOT_VERY_EFFECTIVE); + } + expect(playerPokemon.apply).toHaveReturnedTimes(2); + }); +}); diff --git a/test/abilities/trace.test.ts b/test/abilities/trace.test.ts new file mode 100644 index 00000000000..5d569208d33 --- /dev/null +++ b/test/abilities/trace.test.ts @@ -0,0 +1,53 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Trace", () => { + 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]) + .ability(Abilities.TRACE) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should copy the opponent's ability", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should activate a copied post-summon ability", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); +}); diff --git a/test/abilities/unburden.test.ts b/test/abilities/unburden.test.ts new file mode 100644 index 00000000000..8f18604011c --- /dev/null +++ b/test/abilities/unburden.test.ts @@ -0,0 +1,384 @@ +import { BattlerIndex } from "#app/battle"; +import { PostItemLostAbAttr } from "#app/data/ability"; +import { allMoves, StealHeldItemChanceAttr } from "#app/data/moves/move"; +import type Pokemon from "#app/field/pokemon"; +import type { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { BerryType } from "#enums/berry-type"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Unburden", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + /** + * Count the number of held items a Pokemon has, accounting for stacks of multiple items. + */ + function getHeldItemCount(pokemon: Pokemon): number { + const stackCounts = pokemon.getHeldItems().map(m => m.getStackCount()); + if (stackCounts.length) { + return stackCounts.reduce((a, b) => a + b); + } + return 0; + } + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .startingLevel(1) + .ability(Abilities.UNBURDEN) + .moveset([Moves.SPLASH, Moves.KNOCK_OFF, Moves.PLUCK, Moves.FALSE_SWIPE]) + .startingHeldItems([ + { name: "BERRY", count: 1, type: BerryType.SITRUS }, + { name: "BERRY", count: 2, type: BerryType.APICOT }, + { name: "BERRY", count: 2, type: BerryType.LUM }, + ]) + .enemySpecies(Species.NINJASK) + .enemyLevel(100) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.UNBURDEN) + .enemyPassiveAbility(Abilities.NO_GUARD) + .enemyHeldItems([ + { name: "BERRY", type: BerryType.SITRUS, count: 1 }, + { name: "BERRY", type: BerryType.LUM, count: 1 }, + ]); + // For the various tests that use Thief, give it a 100% steal rate + vi.spyOn(allMoves[Moves.THIEF], "attrs", "get").mockReturnValue([new StealHeldItemChanceAttr(1.0)]); + }); + + it("should activate when a berry is eaten", async () => { + game.override.enemyMoveset(Moves.FALSE_SWIPE); + await game.classicMode.startBattle([Species.TREECKO]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerHeldItems = getHeldItemCount(playerPokemon); + const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); + + // Player gets hit by False Swipe and eats its own Sitrus Berry + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(getHeldItemCount(playerPokemon)).toBeLessThan(playerHeldItems); + expect(playerPokemon.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed * 2); + }); + + it("should activate when a berry is eaten, even if Berry Pouch preserves the berry", async () => { + game.override.enemyMoveset(Moves.FALSE_SWIPE).startingModifier([{ name: "BERRY_POUCH", count: 5850 }]); + await game.classicMode.startBattle([Species.TREECKO]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerHeldItems = getHeldItemCount(playerPokemon); + const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); + + // Player gets hit by False Swipe and eats its own Sitrus Berry + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(getHeldItemCount(playerPokemon)).toBe(playerHeldItems); + expect(playerPokemon.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed * 2); + }); + + it("should activate for the target, and not the stealer, when a berry is stolen", async () => { + await game.classicMode.startBattle([Species.TREECKO]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); + const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyHeldItemCt = getHeldItemCount(enemyPokemon); + const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); + + // Player uses Pluck and eats the opponent's berry + game.move.select(Moves.PLUCK); + await game.toNextTurn(); + + expect(getHeldItemCount(enemyPokemon)).toBeLessThan(enemyHeldItemCt); + expect(enemyPokemon.getEffectiveStat(Stat.SPD)).toBe(initialEnemySpeed * 2); + expect(playerPokemon.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed); + }); + + it("should activate when an item is knocked off", async () => { + await game.classicMode.startBattle([Species.TREECKO]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyHeldItemCt = getHeldItemCount(enemyPokemon); + const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); + + // Player uses Knock Off and removes the opponent's item + game.move.select(Moves.KNOCK_OFF); + await game.toNextTurn(); + + expect(getHeldItemCount(enemyPokemon)).toBeLessThan(enemyHeldItemCt); + expect(enemyPokemon.getEffectiveStat(Stat.SPD)).toBe(initialEnemySpeed * 2); + }); + + it("should activate when an item is stolen via attacking ability", async () => { + game.override.ability(Abilities.MAGICIAN).startingHeldItems([]); // Remove player's full stacks of held items so it can steal opponent's held items + await game.classicMode.startBattle([Species.TREECKO]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyHeldItemCt = getHeldItemCount(enemyPokemon); + const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); + + // Player steals the opponent's item via ability Magician + game.move.select(Moves.FALSE_SWIPE); + await game.toNextTurn(); + + expect(getHeldItemCount(enemyPokemon)).toBeLessThan(enemyHeldItemCt); + expect(enemyPokemon.getEffectiveStat(Stat.SPD)).toBe(initialEnemySpeed * 2); + }); + + it("should activate when an item is stolen via defending ability", async () => { + game.override.enemyAbility(Abilities.PICKPOCKET).enemyHeldItems([]); // Remove opponent's full stacks of held items so it can steal player's held items + await game.classicMode.startBattle([Species.TREECKO]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerHeldItems = getHeldItemCount(playerPokemon); + const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); + + // Player's item gets stolen via ability Pickpocket + game.move.select(Moves.FALSE_SWIPE); + await game.toNextTurn(); + + expect(getHeldItemCount(playerPokemon)).toBeLessThan(playerHeldItems); + expect(playerPokemon.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed * 2); + }); + + it("should activate when an item is stolen via move", async () => { + game.override.moveset(Moves.THIEF).startingHeldItems([]); // Remove player's full stacks of held items so it can steal opponent's held items + await game.classicMode.startBattle([Species.TREECKO]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyHeldItemCt = getHeldItemCount(enemyPokemon); + const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); + + // Player uses Thief and steals the opponent's item + game.move.select(Moves.THIEF); + await game.toNextTurn(); + + expect(getHeldItemCount(enemyPokemon)).toBeLessThan(enemyHeldItemCt); + expect(enemyPokemon.getEffectiveStat(Stat.SPD)).toBe(initialEnemySpeed * 2); + }); + + it("should activate when an item is stolen via grip claw", async () => { + game.override.startingHeldItems([{ name: "GRIP_CLAW", count: 1 }]); + await game.classicMode.startBattle([Species.TREECKO]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const gripClaw = playerPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; + vi.spyOn(gripClaw, "chance", "get").mockReturnValue(100); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyHeldItemCt = getHeldItemCount(enemyPokemon); + const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); + + // Player steals the opponent's item using Grip Claw + game.move.select(Moves.FALSE_SWIPE); + await game.toNextTurn(); + + expect(getHeldItemCount(enemyPokemon)).toBeLessThan(enemyHeldItemCt); + expect(enemyPokemon.getEffectiveStat(Stat.SPD)).toBe(initialEnemySpeed * 2); + }); + + it("should not activate when a neutralizing ability is present", async () => { + game.override.enemyAbility(Abilities.NEUTRALIZING_GAS).enemyMoveset(Moves.FALSE_SWIPE); + await game.classicMode.startBattle([Species.TREECKO]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerHeldItems = getHeldItemCount(playerPokemon); + const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); + + // Player gets hit by False Swipe and eats Sitrus Berry, which should not trigger Unburden + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(getHeldItemCount(playerPokemon)).toBeLessThan(playerHeldItems); + expect(playerPokemon.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed); + expect(playerPokemon.getTag(BattlerTagType.UNBURDEN)).toBeUndefined(); + }); + + it("should activate when a move that consumes a berry is used", async () => { + game.override.moveset(Moves.STUFF_CHEEKS); + await game.classicMode.startBattle([Species.TREECKO]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerHeldItemCt = getHeldItemCount(playerPokemon); + const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); + + // Player uses Stuff Cheeks and eats its own berry + // Caution: Do not test this using opponent, there is a known issue where opponent can randomly generate with Salac Berry + game.move.select(Moves.STUFF_CHEEKS); + await game.toNextTurn(); + + expect(getHeldItemCount(playerPokemon)).toBeLessThan(playerHeldItemCt); + expect(playerPokemon.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed * 2); + }); + + it("should deactivate temporarily when a neutralizing gas user is on the field", async () => { + game.override.battleType("double").ability(Abilities.NONE); // Disable ability override so that we can properly set abilities below + await game.classicMode.startBattle([Species.TREECKO, Species.MEOWTH, Species.WEEZING]); + + const [treecko, _meowth, weezing] = game.scene.getPlayerParty(); + treecko.abilityIndex = 2; // Treecko has Unburden + weezing.abilityIndex = 1; // Weezing has Neutralizing Gas + const playerHeldItems = getHeldItemCount(treecko); + const initialPlayerSpeed = treecko.getStat(Stat.SPD); + + // Turn 1: Treecko gets hit by False Swipe and eats Sitrus Berry, activating Unburden + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.FALSE_SWIPE, 0); + await game.forceEnemyMove(Moves.FALSE_SWIPE, 0); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(getHeldItemCount(treecko)).toBeLessThan(playerHeldItems); + expect(treecko.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed * 2); + + // Turn 2: Switch Meowth to Weezing, activating Neutralizing Gas + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(getHeldItemCount(treecko)).toBeLessThan(playerHeldItems); + expect(treecko.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed); + + // Turn 3: Switch Weezing to Meowth, deactivating Neutralizing Gas + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(getHeldItemCount(treecko)).toBeLessThan(playerHeldItems); + expect(treecko.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed * 2); + }); + + it("should not activate when passing a baton to a teammate switching in", async () => { + game.override.startingHeldItems([{ name: "BATON" }]).moveset(Moves.BATON_PASS); + await game.classicMode.startBattle([Species.TREECKO, Species.PURRLOIN]); + + const [treecko, purrloin] = game.scene.getPlayerParty(); + const initialTreeckoSpeed = treecko.getStat(Stat.SPD); + const initialPurrloinSpeed = purrloin.getStat(Stat.SPD); + const unburdenAttr = treecko.getAbilityAttrs(PostItemLostAbAttr)[0]; + vi.spyOn(unburdenAttr, "applyPostItemLost"); + + // Player uses Baton Pass, which also passes the Baton item + game.move.select(Moves.BATON_PASS); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(getHeldItemCount(treecko)).toBe(0); + expect(getHeldItemCount(purrloin)).toBe(1); + expect(treecko.getEffectiveStat(Stat.SPD)).toBe(initialTreeckoSpeed); + expect(purrloin.getEffectiveStat(Stat.SPD)).toBe(initialPurrloinSpeed); + expect(unburdenAttr.applyPostItemLost).not.toHaveBeenCalled(); + }); + + it("should not speed up a Pokemon after it loses the ability Unburden", async () => { + game.override.enemyMoveset([Moves.FALSE_SWIPE, Moves.WORRY_SEED]); + await game.classicMode.startBattle([Species.PURRLOIN]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerHeldItems = getHeldItemCount(playerPokemon); + const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); + + // Turn 1: Get hit by False Swipe and eat Sitrus Berry, activating Unburden + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.FALSE_SWIPE); + await game.toNextTurn(); + + expect(getHeldItemCount(playerPokemon)).toBeLessThan(playerHeldItems); + expect(playerPokemon.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed * 2); + + // Turn 2: Get hit by Worry Seed, deactivating Unburden + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.WORRY_SEED); + await game.toNextTurn(); + + expect(getHeldItemCount(playerPokemon)).toBeLessThan(playerHeldItems); + expect(playerPokemon.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed); + }); + + it("should activate when a reviver seed is used", async () => { + game.override.startingHeldItems([{ name: "REVIVER_SEED" }]).enemyMoveset([Moves.WING_ATTACK]); + await game.classicMode.startBattle([Species.TREECKO]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerHeldItems = getHeldItemCount(playerPokemon); + const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); + + // Turn 1: Get hit by Wing Attack and faint, activating Reviver Seed + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(getHeldItemCount(playerPokemon)).toBeLessThan(playerHeldItems); + expect(playerPokemon.getEffectiveStat(Stat.SPD)).toBe(initialPlayerSpeed * 2); + }); + + // test for `.bypassFaint()` - singles + it("shouldn't persist when revived normally if activated while fainting", async () => { + game.override.enemyMoveset([Moves.SPLASH, Moves.THIEF]); + await game.classicMode.startBattle([Species.TREECKO, Species.FEEBAS]); + + const treecko = game.scene.getPlayerPokemon()!; + const treeckoInitialHeldItems = getHeldItemCount(treecko); + const initialSpeed = treecko.getStat(Stat.SPD); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.THIEF); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.doRevivePokemon(1); + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.getPlayerPokemon()!).toBe(treecko); + expect(getHeldItemCount(treecko)).toBeLessThan(treeckoInitialHeldItems); + expect(treecko.getEffectiveStat(Stat.SPD)).toBe(initialSpeed); + }); + + // test for `.bypassFaint()` - doubles + it("shouldn't persist when revived by revival blessing if activated while fainting", async () => { + game.override + .battleType("double") + .enemyMoveset([Moves.SPLASH, Moves.THIEF]) + .moveset([Moves.SPLASH, Moves.REVIVAL_BLESSING]) + .startingHeldItems([{ name: "WIDE_LENS" }]); + await game.classicMode.startBattle([Species.TREECKO, Species.FEEBAS, Species.MILOTIC]); + + const treecko = game.scene.getPlayerField()[0]; + const treeckoInitialHeldItems = getHeldItemCount(treecko); + const initialSpeed = treecko.getStat(Stat.SPD); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.REVIVAL_BLESSING, 1); + await game.forceEnemyMove(Moves.THIEF, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2]); + game.doSelectPartyPokemon(0, "RevivalBlessingPhase"); + await game.toNextTurn(); + + expect(game.scene.getPlayerField()[0]).toBe(treecko); + expect(getHeldItemCount(treecko)).toBeLessThan(treeckoInitialHeldItems); + expect(treecko.getEffectiveStat(Stat.SPD)).toBe(initialSpeed); + }); +}); diff --git a/test/abilities/unseen_fist.test.ts b/test/abilities/unseen_fist.test.ts new file mode 100644 index 00000000000..73ae25ff3b0 --- /dev/null +++ b/test/abilities/unseen_fist.test.ts @@ -0,0 +1,97 @@ +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { BerryPhase } from "#app/phases/berry-phase"; + +describe("Abilities - Unseen Fist", () => { + 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.starterSpecies(Species.URSHIFU); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + it("should cause a contact move to ignore Protect", () => + testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, true)); + + it("should not cause a non-contact move to ignore Protect", () => + testUnseenFistHitResult(game, Moves.ABSORB, Moves.PROTECT, false)); + + it("should not apply if the source has Long Reach", async () => { + game.override.passiveAbility(Abilities.LONG_REACH); + await testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); + }); + + it("should cause a contact move to ignore Wide Guard", () => + testUnseenFistHitResult(game, Moves.BREAKING_SWIPE, Moves.WIDE_GUARD, true)); + + it("should not cause a non-contact move to ignore Wide Guard", () => + testUnseenFistHitResult(game, Moves.BULLDOZE, Moves.WIDE_GUARD, false)); + + it("should cause a contact move to ignore Protect, but not Substitute", async () => { + game.override.enemyLevel(1); + game.override.moveset([Moves.TACKLE]); + + await game.classicMode.startBattle(); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeUndefined(); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); +}); + +async function testUnseenFistHitResult( + game: GameManager, + attackMove: Moves, + protectMove: Moves, + shouldSucceed = true, +): Promise { + game.override.moveset([attackMove]); + game.override.enemyMoveset([protectMove, protectMove, protectMove, protectMove]); + + await game.classicMode.startBattle(); + + const leadPokemon = game.scene.getPlayerPokemon()!; + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).not.toBe(undefined); + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(attackMove); + await game.phaseInterceptor.to(TurnEndPhase, false); + + if (shouldSucceed) { + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + } else { + expect(enemyPokemon.hp).toBe(enemyStartingHp); + } +} diff --git a/src/test/abilities/volt_absorb.test.ts b/test/abilities/volt_absorb.test.ts similarity index 89% rename from src/test/abilities/volt_absorb.test.ts rename to test/abilities/volt_absorb.test.ts index 4fee7653b99..10735f31987 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/test/abilities/volt_absorb.test.ts @@ -4,7 +4,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerIndex } from "#app/battle"; @@ -34,9 +34,9 @@ describe("Abilities - Volt Absorb", () => { const moveToUse = Moves.CHARGE; const ability = Abilities.VOLT_ABSORB; - game.override.moveset([ moveToUse ]); + game.override.moveset([moveToUse]); game.override.ability(ability); - game.override.enemyMoveset([ Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); game.override.enemySpecies(Species.DUSKULL); game.override.enemyAbility(Abilities.BALL_FETCH); @@ -65,7 +65,7 @@ describe("Abilities - Volt Absorb", () => { game.move.select(Moves.THUNDERBOLT); enemyPokemon.hp = enemyPokemon.hp - 1; - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("MoveEffectPhase"); await game.move.forceMiss(); @@ -85,7 +85,7 @@ describe("Abilities - Volt Absorb", () => { game.move.select(Moves.THUNDERBOLT); enemyPokemon.hp = enemyPokemon.hp - 1; - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); diff --git a/test/abilities/wandering_spirit.test.ts b/test/abilities/wandering_spirit.test.ts new file mode 100644 index 00000000000..375faa41972 --- /dev/null +++ b/test/abilities/wandering_spirit.test.ts @@ -0,0 +1,65 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Wandering Spirit", () => { + 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]) + .ability(Abilities.WANDERING_SPIRIT) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.TACKLE); + }); + + it("should exchange abilities when hit with a contact move", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.WANDERING_SPIRIT); + }); + + it("should not exchange abilities when hit with a non-contact move", async () => { + game.override.enemyMoveset(Moves.EARTHQUAKE); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.WANDERING_SPIRIT); + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should activate post-summon abilities", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); +}); diff --git a/test/abilities/wimp_out.test.ts b/test/abilities/wimp_out.test.ts new file mode 100644 index 00000000000..ef201cbf8dd --- /dev/null +++ b/test/abilities/wimp_out.test.ts @@ -0,0 +1,528 @@ +import { BattlerIndex } from "#app/battle"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/moves/move"; +import GameManager from "#test/testUtils/gameManager"; +import { toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import { StatusEffect } from "#enums/status-effect"; +import { WeatherType } from "#enums/weather-type"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Wimp Out", () => { + 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") + .ability(Abilities.WIMP_OUT) + .enemySpecies(Species.NINJASK) + .enemyPassiveAbility(Abilities.NO_GUARD) + .startingLevel(90) + .enemyLevel(70) + .moveset([Moves.SPLASH, Moves.FALSE_SWIPE, Moves.ENDURE]) + .enemyMoveset(Moves.FALSE_SWIPE) + .disableCrits(); + }); + + function confirmSwitch(): void { + const [pokemon1, pokemon2] = game.scene.getPlayerParty(); + + expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); + + expect(pokemon1.species.speciesId).not.toBe(Species.WIMPOD); + + expect(pokemon2.species.speciesId).toBe(Species.WIMPOD); + expect(pokemon2.isFainted()).toBe(false); + expect(pokemon2.getHpRatio()).toBeLessThan(0.5); + } + + function confirmNoSwitch(): void { + const [pokemon1, pokemon2] = game.scene.getPlayerParty(); + + expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); + + expect(pokemon2.species.speciesId).not.toBe(Species.WIMPOD); + + expect(pokemon1.species.speciesId).toBe(Species.WIMPOD); + expect(pokemon1.isFainted()).toBe(false); + expect(pokemon1.getHpRatio()).toBeLessThan(0.5); + } + + it("triggers regenerator passive single time when switching out with wimp out", async () => { + game.override.passiveAbility(Abilities.REGENERATOR).startingLevel(5).enemyLevel(100); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + const wimpod = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(wimpod.hp).toEqual(Math.floor(wimpod.getMaxHp() * 0.33 + 1)); + confirmSwitch(); + }); + + it("It makes wild pokemon flee if triggered", async () => { + game.override.enemyAbility(Abilities.WIMP_OUT); + await game.classicMode.startBattle([Species.GOLISOPOD, Species.TYRUNT]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.hp *= 0.52; + + game.move.select(Moves.FALSE_SWIPE); + await game.phaseInterceptor.to("BerryPhase"); + + const isVisible = enemyPokemon.visible; + const hasFled = enemyPokemon.switchOutStatus; + expect(!isVisible && hasFled).toBe(true); + }); + + it("Does not trigger when HP already below half", async () => { + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + const wimpod = game.scene.getPlayerPokemon()!; + wimpod.hp = 5; + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(wimpod.hp).toEqual(1); + confirmNoSwitch(); + }); + + it("Trapping moves do not prevent Wimp Out from activating.", async () => { + game.override.enemyMoveset([Moves.SPIRIT_SHACKLE]).startingLevel(53).enemyLevel(45); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); + expect(game.scene.getPlayerPokemon()!.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(game.scene.getPlayerParty()[1].getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + confirmSwitch(); + }); + + it("If this Ability activates due to being hit by U-turn or Volt Switch, the user of that move will not be switched out.", async () => { + game.override.startingLevel(95).enemyMoveset([Moves.U_TURN]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const hasFled = enemyPokemon.switchOutStatus; + expect(hasFled).toBe(false); + confirmSwitch(); + }); + + it("If this Ability does not activate due to being hit by U-turn or Volt Switch, the user of that move will be switched out.", async () => { + game.override.startingLevel(190).startingWave(8).enemyMoveset([Moves.U_TURN]); + await game.classicMode.startBattle([Species.GOLISOPOD, Species.TYRUNT]); + const RIVAL_NINJASK1 = game.scene.getEnemyPokemon()?.id; + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase", false); + expect(game.scene.getEnemyPokemon()?.id !== RIVAL_NINJASK1); + }); + + it("Dragon Tail and Circle Throw switch out Pokémon before the Ability activates.", async () => { + game.override.startingLevel(69).enemyMoveset([Moves.DRAGON_TAIL]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + const wimpod = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("SwitchSummonPhase", false); + + expect(wimpod.summonData.abilitiesApplied).not.toContain(Abilities.WIMP_OUT); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getPlayerPokemon()!.species.speciesId).not.toBe(Species.WIMPOD); + }); + + it("triggers when recoil damage is taken", async () => { + game.override.moveset([Moves.HEAD_SMASH]).enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.move.select(Moves.HEAD_SMASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmSwitch(); + }); + + it("It does not activate when the Pokémon cuts its own HP", async () => { + game.override.moveset([Moves.SUBSTITUTE]).enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + const wimpod = game.scene.getPlayerPokemon()!; + wimpod.hp *= 0.52; + + game.move.select(Moves.SUBSTITUTE); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmNoSwitch(); + }); + + it("Does not trigger when neutralized", async () => { + game.override.enemyAbility(Abilities.NEUTRALIZING_GAS).startingLevel(5); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmNoSwitch(); + }); + + // TODO: Enable when this behavior is fixed (currently Shell Bell won't activate if Wimp Out activates because + // the pokemon is removed from the field before the Shell Bell modifier is applied, so it can't see the + // damage dealt and doesn't heal the pokemon) + it.todo( + "If it falls below half and recovers back above half from a Shell Bell, Wimp Out will activate even after the Shell Bell recovery", + async () => { + game.override + .moveset([Moves.DOUBLE_EDGE]) + .enemyMoveset([Moves.SPLASH]) + .startingHeldItems([{ name: "SHELL_BELL", count: 4 }]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + const wimpod = game.scene.getPlayerPokemon()!; + + wimpod.damageAndUpdate(toDmgValue(wimpod.getMaxHp() * 0.4)); + + game.move.select(Moves.DOUBLE_EDGE); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getPlayerParty()[1]).toBe(wimpod); + expect(wimpod.hp).toBeGreaterThan(toDmgValue(wimpod.getMaxHp() / 2)); + expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); + expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.TYRUNT); + }, + ); + + it("Wimp Out will activate due to weather damage", async () => { + game.override.weather(WeatherType.HAIL).enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmSwitch(); + }); + + it("Does not trigger when enemy has sheer force", async () => { + game.override.enemyAbility(Abilities.SHEER_FORCE).enemyMoveset(Moves.SLUDGE_BOMB).startingLevel(95); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.ENDURE); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmNoSwitch(); + }); + + it("Wimp Out will activate due to post turn status damage", async () => { + game.override.statusEffect(StatusEffect.POISON).enemyMoveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to bad dreams", async () => { + game.override.statusEffect(StatusEffect.SLEEP).enemyAbility(Abilities.BAD_DREAMS); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.scene.getPlayerPokemon()!.hp *= 0.52; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to leech seed", async () => { + game.override.enemyMoveset([Moves.LEECH_SEED]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + game.scene.getPlayerPokemon()!.hp *= 0.52; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to curse damage", async () => { + game.override.enemySpecies(Species.DUSKNOIR).enemyMoveset([Moves.CURSE]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + game.scene.getPlayerPokemon()!.hp *= 0.52; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to salt cure damage", async () => { + game.override.enemySpecies(Species.NACLI).enemyMoveset([Moves.SALT_CURE]).enemyLevel(1); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + game.scene.getPlayerPokemon()!.hp *= 0.7; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to damaging trap damage", async () => { + game.override.enemySpecies(Species.MAGIKARP).enemyMoveset([Moves.WHIRLPOOL]).enemyLevel(1); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + game.scene.getPlayerPokemon()!.hp *= 0.55; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Magic Guard passive should not allow indirect damage to trigger Wimp Out", async () => { + game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0, ArenaTagSide.ENEMY); + game.scene.arena.addTag(ArenaTagType.SPIKES, 1, Moves.SPIKES, 0, ArenaTagSide.ENEMY); + game.override + .passiveAbility(Abilities.MAGIC_GUARD) + .enemyMoveset([Moves.LEECH_SEED]) + .weather(WeatherType.HAIL) + .statusEffect(StatusEffect.POISON); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getPlayerParty()[0].getHpRatio()).toEqual(0.51); + expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); + expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.WIMPOD); + }); + + it("Wimp Out activating should not cancel a double battle", async () => { + game.override.battleType("double").enemyAbility(Abilities.WIMP_OUT).enemyMoveset([Moves.SPLASH]).enemyLevel(1); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + const enemyLeadPokemon = game.scene.getEnemyParty()[0]; + const enemySecPokemon = game.scene.getEnemyParty()[1]; + + game.move.select(Moves.FALSE_SWIPE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase"); + + const isVisibleLead = enemyLeadPokemon.visible; + const hasFledLead = enemyLeadPokemon.switchOutStatus; + const isVisibleSec = enemySecPokemon.visible; + const hasFledSec = enemySecPokemon.switchOutStatus; + expect(!isVisibleLead && hasFledLead && isVisibleSec && !hasFledSec).toBe(true); + expect(enemyLeadPokemon.hp).toBeLessThan(enemyLeadPokemon.getMaxHp()); + expect(enemySecPokemon.hp).toEqual(enemySecPokemon.getMaxHp()); + }); + + it("Wimp Out will activate due to aftermath", async () => { + game.override + .moveset([Moves.THUNDER_PUNCH]) + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.AFTERMATH) + .enemyMoveset([Moves.SPLASH]) + .enemyLevel(1); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.THUNDER_PUNCH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmSwitch(); + }); + + it("Activates due to entry hazards", async () => { + game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0, ArenaTagSide.ENEMY); + game.scene.arena.addTag(ArenaTagType.SPIKES, 1, Moves.SPIKES, 0, ArenaTagSide.ENEMY); + game.override.enemySpecies(Species.CENTISKORCH).enemyAbility(Abilities.WIMP_OUT).startingWave(4); + await game.classicMode.startBattle([Species.TYRUNT]); + + expect(game.phaseInterceptor.log).not.toContain("MovePhase"); + expect(game.phaseInterceptor.log).toContain("BattleEndPhase"); + }); + + it("Wimp Out will activate due to Nightmare", async () => { + game.override.enemyMoveset([Moves.NIGHTMARE]).statusEffect(StatusEffect.SLEEP); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + game.scene.getPlayerPokemon()!.hp *= 0.65; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("triggers status on the wimp out user before a new pokemon is switched in", async () => { + game.override.enemyMoveset(Moves.SLUDGE_BOMB).startingLevel(80); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + vi.spyOn(allMoves[Moves.SLUDGE_BOMB], "chance", "get").mockReturnValue(100); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getPlayerParty()[1].status?.effect).toEqual(StatusEffect.POISON); + confirmSwitch(); + }); + + it("triggers after last hit of multi hit move", async () => { + game.override.enemyMoveset(Moves.BULLET_SEED).enemyAbility(Abilities.SKILL_LINK); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.ENDURE); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.turnData.hitsLeft).toBe(0); + expect(enemyPokemon.turnData.hitCount).toBe(5); + confirmSwitch(); + }); + + it("triggers after last hit of multi hit move (multi lens)", async () => { + game.override.enemyMoveset(Moves.TACKLE).enemyHeldItems([{ name: "MULTI_LENS", count: 1 }]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.ENDURE); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.turnData.hitsLeft).toBe(0); + expect(enemyPokemon.turnData.hitCount).toBe(2); + confirmSwitch(); + }); + it("triggers after last hit of Parental Bond", async () => { + game.override.enemyMoveset(Moves.TACKLE).enemyAbility(Abilities.PARENTAL_BOND); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.ENDURE); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.turnData.hitsLeft).toBe(0); + expect(enemyPokemon.turnData.hitCount).toBe(2); + confirmSwitch(); + }); + + // TODO: This interaction is not implemented yet + it.todo( + "Wimp Out will not activate if the Pokémon's HP falls below half due to hurting itself in confusion", + async () => { + game.override.moveset([Moves.SWORDS_DANCE]).enemyMoveset([Moves.SWAGGER]); + await game.classicMode.startBattle([Species.WIMPOD, Species.TYRUNT]); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.hp *= 0.51; + playerPokemon.setStatStage(Stat.ATK, 6); + playerPokemon.addTag(BattlerTagType.CONFUSED); + + // TODO: add helper function to force confusion self-hits + + while (playerPokemon.getHpRatio() > 0.49) { + game.move.select(Moves.SWORDS_DANCE); + await game.phaseInterceptor.to("TurnEndPhase"); + } + + confirmNoSwitch(); + }, + ); + + it("should not activate on wave X0 bosses", async () => { + game.override.enemyAbility(Abilities.WIMP_OUT).startingLevel(5850).startingWave(10); + await game.classicMode.startBattle([Species.GOLISOPOD]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // Use 2 turns of False Swipe due to opponent's health bar shield + game.move.select(Moves.FALSE_SWIPE); + await game.toNextTurn(); + game.move.select(Moves.FALSE_SWIPE); + await game.toNextTurn(); + + const isVisible = enemyPokemon.visible; + 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/abilities/wind_power.test.ts b/test/abilities/wind_power.test.ts similarity index 88% rename from src/test/abilities/wind_power.test.ts rename to test/abilities/wind_power.test.ts index 538b65f898b..b28ac3362eb 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/test/abilities/wind_power.test.ts @@ -3,7 +3,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -26,12 +26,12 @@ describe("Abilities - Wind Power", () => { game.override.battleType("single"); game.override.enemySpecies(Species.SHIFTRY); game.override.enemyAbility(Abilities.WIND_POWER); - game.override.moveset([ Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM ]); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); game.override.enemyMoveset(Moves.SPLASH); }); it("it becomes charged when hit by wind moves", async () => { - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const shiftry = game.scene.getEnemyPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); @@ -46,7 +46,7 @@ describe("Abilities - Wind Power", () => { game.override.ability(Abilities.WIND_POWER); game.override.enemySpecies(Species.MAGIKARP); - await game.startBattle([ Species.SHIFTRY ]); + await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); @@ -61,7 +61,7 @@ describe("Abilities - Wind Power", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.ability(Abilities.WIND_POWER); - await game.startBattle([ Species.SHIFTRY ]); + await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon()!; const shiftry = game.scene.getPlayerPokemon()!; @@ -79,7 +79,7 @@ describe("Abilities - Wind Power", () => { it("does not interact with Sandstorm", async () => { game.override.enemySpecies(Species.MAGIKARP); - await game.startBattle([ Species.SHIFTRY ]); + await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); diff --git a/src/test/abilities/wind_rider.test.ts b/test/abilities/wind_rider.test.ts similarity index 80% rename from src/test/abilities/wind_rider.test.ts rename to test/abilities/wind_rider.test.ts index cd7094fb0a9..8fdae1b24ec 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/test/abilities/wind_rider.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -26,12 +26,12 @@ describe("Abilities - Wind Rider", () => { .battleType("single") .enemySpecies(Species.SHIFTRY) .enemyAbility(Abilities.WIND_RIDER) - .moveset([ Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM ]) + .moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]) .enemyMoveset(Moves.SPLASH); }); it("takes no damage from wind moves and its ATK stat stage is raised by 1 when hit by one", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const shiftry = game.scene.getEnemyPokemon()!; expect(shiftry.getStatStage(Stat.ATK)).toBe(0); @@ -45,11 +45,9 @@ describe("Abilities - Wind Rider", () => { }); it("ATK stat stage is raised by 1 when Tailwind is present on its side", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .ability(Abilities.WIND_RIDER); + game.override.enemySpecies(Species.MAGIKARP).ability(Abilities.WIND_RIDER); - await game.classicMode.startBattle([ Species.SHIFTRY ]); + await game.classicMode.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getStatStage(Stat.ATK)).toBe(0); @@ -62,11 +60,9 @@ describe("Abilities - Wind Rider", () => { }); it("does not raise ATK stat stage when Tailwind is present on opposing side", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .ability(Abilities.WIND_RIDER); + game.override.enemySpecies(Species.MAGIKARP).ability(Abilities.WIND_RIDER); - await game.classicMode.startBattle([ Species.SHIFTRY ]); + await game.classicMode.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon()!; const shiftry = game.scene.getPlayerPokemon()!; @@ -82,11 +78,9 @@ describe("Abilities - Wind Rider", () => { }); it("does not raise ATK stat stage when Tailwind is present on opposing side", async () => { - game.override - .enemySpecies(Species.MAGIKARP) - .ability(Abilities.WIND_RIDER); + game.override.enemySpecies(Species.MAGIKARP).ability(Abilities.WIND_RIDER); - await game.classicMode.startBattle([ Species.SHIFTRY ]); + await game.classicMode.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon()!; const shiftry = game.scene.getPlayerPokemon()!; @@ -104,7 +98,7 @@ describe("Abilities - Wind Rider", () => { it("does not interact with Sandstorm", async () => { game.override.enemySpecies(Species.MAGIKARP); - await game.classicMode.startBattle([ Species.SHIFTRY ]); + await game.classicMode.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon()!; expect(shiftry.getStatStage(Stat.ATK)).toBe(0); diff --git a/src/test/abilities/wonder_skin.test.ts b/test/abilities/wonder_skin.test.ts similarity index 83% rename from src/test/abilities/wonder_skin.test.ts rename to test/abilities/wonder_skin.test.ts index 6b25701e36a..f2cb0faed72 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/test/abilities/wonder_skin.test.ts @@ -1,10 +1,10 @@ import { allAbilities } from "#app/data/ability"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -25,7 +25,7 @@ describe("Abilities - Wonder Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.TACKLE, Moves.CHARM ]); + game.override.moveset([Moves.TACKLE, Moves.CHARM]); game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.WONDER_SKIN); @@ -37,7 +37,7 @@ describe("Abilities - Wonder Skin", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - await game.startBattle([ Species.PIKACHU ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.CHARM); await game.phaseInterceptor.to(MoveEffectPhase); @@ -49,14 +49,14 @@ describe("Abilities - Wonder Skin", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - await game.startBattle([ Species.PIKACHU ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(MoveEffectPhase); expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100); }); - const bypassAbilities = [ Abilities.MOLD_BREAKER, Abilities.TERAVOLT, Abilities.TURBOBLAZE ]; + const bypassAbilities = [Abilities.MOLD_BREAKER, Abilities.TERAVOLT, Abilities.TURBOBLAZE]; bypassAbilities.forEach(ability => { it(`does not affect pokemon with ${allAbilities[ability].name}`, async () => { @@ -65,7 +65,7 @@ describe("Abilities - Wonder Skin", () => { game.override.ability(ability); vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - await game.startBattle([ Species.PIKACHU ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.CHARM); await game.phaseInterceptor.to(MoveEffectPhase); diff --git a/test/abilities/zen_mode.test.ts b/test/abilities/zen_mode.test.ts new file mode 100644 index 00000000000..d552d8c88ca --- /dev/null +++ b/test/abilities/zen_mode.test.ts @@ -0,0 +1,109 @@ +import { Status } from "#app/data/status-effect"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - ZEN MODE", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const baseForm = 0; + const zenForm = 1; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyLevel(5) + .ability(Abilities.ZEN_MODE) + .moveset(Moves.SPLASH) + .enemyMoveset(Moves.SEISMIC_TOSS); + }); + + it("shouldn't change form when taking damage if not dropping below 50% HP", async () => { + await game.classicMode.startBattle([Species.DARMANITAN]); + const darmanitan = game.scene.getPlayerPokemon()!; + expect(darmanitan.formIndex).toBe(baseForm); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(darmanitan.getHpRatio()).toBeLessThan(1); + expect(darmanitan.getHpRatio()).toBeGreaterThan(0.5); + expect(darmanitan.formIndex).toBe(baseForm); + }); + + it("should change form when falling below 50% HP", async () => { + await game.classicMode.startBattle([Species.DARMANITAN]); + + const darmanitan = game.scene.getPlayerPokemon()!; + darmanitan.hp = darmanitan.getMaxHp() / 2 + 1; + expect(darmanitan.formIndex).toBe(baseForm); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(darmanitan.getHpRatio()).toBeLessThan(0.5); + expect(darmanitan.formIndex).toBe(zenForm); + }); + + it("should stay zen mode when fainted", async () => { + await game.classicMode.startBattle([Species.DARMANITAN, Species.CHARIZARD]); + const darmanitan = game.scene.getPlayerPokemon()!; + darmanitan.hp = darmanitan.getMaxHp() / 2 + 1; + expect(darmanitan.formIndex).toBe(baseForm); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(darmanitan.getHpRatio()).toBeLessThan(0.5); + expect(darmanitan.formIndex).toBe(zenForm); + + game.move.select(Moves.SPLASH); + await game.killPokemon(darmanitan); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(darmanitan.isFainted()).toBe(true); + expect(game.scene.getPlayerParty()[1].formIndex).toBe(zenForm); + }); + + it("should switch to base form on arena reset", async () => { + game.override.startingWave(4); + game.override.starterForms({ + [Species.DARMANITAN]: zenForm, + }); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.DARMANITAN]); + + const darmanitan = game.scene.getPlayerParty()[1]; + darmanitan.hp = 1; + expect(darmanitan.formIndex).toBe(zenForm); + + darmanitan.hp = 0; + darmanitan.status = new Status(StatusEffect.FAINT); + expect(darmanitan.isFainted()).toBe(true); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.toNextWave(); + + expect(darmanitan.formIndex).toBe(baseForm); + }); +}); diff --git a/src/test/abilities/zero_to_hero.test.ts b/test/abilities/zero_to_hero.test.ts similarity index 84% rename from src/test/abilities/zero_to_hero.test.ts rename to test/abilities/zero_to_hero.test.ts index 48a451e99a2..4565aa3e8b2 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/test/abilities/zero_to_hero.test.ts @@ -1,13 +1,13 @@ -import { Status, StatusEffect } from "#app/data/status-effect"; +import { Status } from "#app/data/status-effect"; import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Abilities - ZERO TO HERO", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -39,10 +39,10 @@ describe("Abilities - ZERO TO HERO", () => { [Species.PALAFIN]: heroForm, }); - await game.startBattle([ Species.FEEBAS, Species.PALAFIN, Species.PALAFIN ]); + await game.startBattle([Species.FEEBAS, Species.PALAFIN, Species.PALAFIN]); - const palafin1 = game.scene.getParty()[1]; - const palafin2 = game.scene.getParty()[2]; + const palafin1 = game.scene.getPlayerParty()[1]; + const palafin2 = game.scene.getPlayerParty()[2]; expect(palafin1.formIndex).toBe(heroForm); expect(palafin2.formIndex).toBe(heroForm); palafin2.hp = 0; @@ -61,7 +61,7 @@ describe("Abilities - ZERO TO HERO", () => { }); it("should swap to Hero form when switching out during a battle", async () => { - await game.startBattle([ Species.PALAFIN, Species.FEEBAS ]); + await game.startBattle([Species.PALAFIN, Species.FEEBAS]); const palafin = game.scene.getPlayerPokemon()!; expect(palafin.formIndex).toBe(baseForm); @@ -72,7 +72,7 @@ describe("Abilities - ZERO TO HERO", () => { }); it("should not swap to Hero form if switching due to faint", async () => { - await game.startBattle([ Species.PALAFIN, Species.FEEBAS ]); + await game.startBattle([Species.PALAFIN, Species.FEEBAS]); const palafin = game.scene.getPlayerPokemon()!; expect(palafin.formIndex).toBe(baseForm); @@ -89,7 +89,7 @@ describe("Abilities - ZERO TO HERO", () => { [Species.PALAFIN]: heroForm, }); - await game.startBattle([ Species.PALAFIN, Species.FEEBAS ]); + await game.startBattle([Species.PALAFIN, Species.FEEBAS]); const palafin = game.scene.getPlayerPokemon()!; expect(palafin.formIndex).toBe(heroForm); diff --git a/src/test/account.test.ts b/test/account.test.ts similarity index 63% rename from src/test/account.test.ts rename to test/account.test.ts index 8c36f2cd953..3f6b9f3f80b 100644 --- a/src/test/account.test.ts +++ b/test/account.test.ts @@ -1,7 +1,7 @@ import * as battleScene from "#app/battle-scene"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import { describe, expect, it, vi } from "vitest"; -import { initLoggedInUser, loggedInUser, updateUserInfo } from "../account"; -import * as utils from "../utils"; +import { initLoggedInUser, loggedInUser, updateUserInfo } from "#app/account"; describe("account", () => { describe("initLoggedInUser", () => { @@ -17,7 +17,7 @@ describe("account", () => { it("should set loggedInUser! to Guest if bypassLogin is true", async () => { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(true); - const [ success, status ] = await updateUserInfo(); + const [success, status] = await updateUserInfo(); expect(success).toBe(true); expect(status).toBe(200); @@ -27,19 +27,18 @@ describe("account", () => { it("should fetch user info from the API if bypassLogin is false", async () => { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(false); - vi.spyOn(utils, "apiFetch").mockResolvedValue( - new Response( - JSON.stringify({ - username: "test", - lastSessionSlot: 99, - }), - { - status: 200, - } - ) - ); + vi.spyOn(pokerogueApi.account, "getInfo").mockResolvedValue([ + { + username: "test", + lastSessionSlot: 99, + discordId: "", + googleId: "", + hasAdminRole: false, + }, + 200, + ]); - const [ success, status ] = await updateUserInfo(); + const [success, status] = await updateUserInfo(); expect(success).toBe(true); expect(status).toBe(200); @@ -49,26 +48,22 @@ describe("account", () => { it("should handle resolved API errors", async () => { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(false); - vi.spyOn(utils, "apiFetch").mockResolvedValue( - new Response(null, { status: 401 }) - ); + vi.spyOn(pokerogueApi.account, "getInfo").mockResolvedValue([null, 401]); - const [ success, status ] = await updateUserInfo(); + const [success, status] = await updateUserInfo(); expect(success).toBe(false); expect(status).toBe(401); }); - it("should handle rejected API errors", async () => { - const consoleErrorSpy = vi.spyOn(console, "error"); + it("should handle 500 API errors", async () => { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(false); - vi.spyOn(utils, "apiFetch").mockRejectedValue(new Error("Api failed!")); + vi.spyOn(pokerogueApi.account, "getInfo").mockResolvedValue([null, 500]); - const [ success, status ] = await updateUserInfo(); + const [success, status] = await updateUserInfo(); expect(success).toBe(false); expect(status).toBe(500); - expect(consoleErrorSpy).toHaveBeenCalled(); }); }); }); diff --git a/src/test/achievements/achievement.test.ts b/test/achievements/achievement.test.ts similarity index 84% rename from src/test/achievements/achievement.test.ts rename to test/achievements/achievement.test.ts index a3669c60463..26d33adb00a 100644 --- a/src/test/achievements/achievement.test.ts +++ b/test/achievements/achievement.test.ts @@ -1,19 +1,28 @@ import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; -import { Achv, AchvTier, DamageAchv, HealAchv, LevelAchv, ModifierAchv, MoneyAchv, RibbonAchv, achvs } from "#app/system/achv"; -import { IntegerHolder, NumberHolder } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import { + Achv, + AchvTier, + DamageAchv, + HealAchv, + LevelAchv, + ModifierAchv, + MoneyAchv, + RibbonAchv, + achvs, +} from "#app/system/achv"; +import { NumberHolder } from "#app/utils"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import BattleScene from "../../battle-scene"; +import BattleScene from "#app/battle-scene"; describe("check some Achievement related stuff", () => { - it ("should check Achievement creation", () => { + it("should check Achievement creation", () => { const ach = new MoneyAchv("", "Achievement", 1000, null!, 100); expect(ach.name).toBe("Achievement"); }); }); - describe("Achv", () => { let achv: Achv; @@ -58,11 +67,11 @@ describe("Achv", () => { }); it("should validate the achievement based on the condition function", () => { - const conditionFunc = vi.fn((scene: BattleScene, args: any[]) => args[0] === 10); + const conditionFunc = vi.fn((args: any[]) => args[0] === 10); const achv = new Achv("", "Test Achievement", "Test Description", "test_icon", 10, conditionFunc); - expect(achv.validate(new BattleScene(), [ 5 ])).toBe(false); - expect(achv.validate(new BattleScene(), [ 10 ])).toBe(true); + expect(achv.validate([5])).toBe(false); + expect(achv.validate([10])).toBe(true); expect(conditionFunc).toHaveBeenCalledTimes(2); }); }); @@ -79,10 +88,10 @@ describe("MoneyAchv", () => { const scene = new BattleScene(); scene.money = 5000; - expect(moneyAchv.validate(scene, [])).toBe(false); + expect(moneyAchv.validate([])).toBe(false); scene.money = 15000; - expect(moneyAchv.validate(scene, [])).toBe(true); + expect(moneyAchv.validate([])).toBe(true); }); }); @@ -122,10 +131,10 @@ describe("RibbonAchv", () => { const ribbonAchv = new RibbonAchv("", "Test Ribbon Achievement", 10, "ribbon_icon", 10); scene.gameData.gameStats.ribbonsOwned = 5; - expect(ribbonAchv.validate(scene, [])).toBe(false); + expect(ribbonAchv.validate([])).toBe(false); scene.gameData.gameStats.ribbonsOwned = 15; - expect(ribbonAchv.validate(scene, [])).toBe(true); + expect(ribbonAchv.validate([])).toBe(true); }); }); @@ -138,13 +147,12 @@ describe("DamageAchv", () => { it("should validate the achievement based on the damage amount", () => { const damageAchv = new DamageAchv("", "Test Damage Achievement", 250, "damage_icon", 10); - const scene = new BattleScene(); const numberHolder = new NumberHolder(200); - expect(damageAchv.validate(scene, [ numberHolder ])).toBe(false); + expect(damageAchv.validate([numberHolder])).toBe(false); numberHolder.value = 300; - expect(damageAchv.validate(scene, [ numberHolder ])).toBe(true); + expect(damageAchv.validate([numberHolder])).toBe(true); }); }); @@ -157,13 +165,12 @@ describe("HealAchv", () => { it("should validate the achievement based on the heal amount", () => { const healAchv = new HealAchv("", "Test Heal Achievement", 250, "heal_icon", 10); - const scene = new BattleScene(); const numberHolder = new NumberHolder(200); - expect(healAchv.validate(scene, [ numberHolder ])).toBe(false); + expect(healAchv.validate([numberHolder])).toBe(false); numberHolder.value = 300; - expect(healAchv.validate(scene, [ numberHolder ])).toBe(true); + expect(healAchv.validate([numberHolder])).toBe(true); }); }); @@ -176,29 +183,41 @@ describe("LevelAchv", () => { it("should validate the achievement based on the level", () => { const levelAchv = new LevelAchv("", "Test Level Achievement", 100, "level_icon", 10); - const scene = new BattleScene(); - const integerHolder = new IntegerHolder(50); + const integerHolder = new NumberHolder(50); - expect(levelAchv.validate(scene, [ integerHolder ])).toBe(false); + expect(levelAchv.validate([integerHolder])).toBe(false); integerHolder.value = 150; - expect(levelAchv.validate(scene, [ integerHolder ])).toBe(true); + expect(levelAchv.validate([integerHolder])).toBe(true); }); }); describe("ModifierAchv", () => { it("should create an instance of ModifierAchv", () => { - const modifierAchv = new ModifierAchv("", "Test Modifier Achievement", "Test Description", "modifier_icon", 10, () => true); + const modifierAchv = new ModifierAchv( + "", + "Test Modifier Achievement", + "Test Description", + "modifier_icon", + 10, + () => true, + ); expect(modifierAchv).toBeInstanceOf(ModifierAchv); expect(modifierAchv instanceof Achv).toBe(true); }); it("should validate the achievement based on the modifier function", () => { - const modifierAchv = new ModifierAchv("", "Test Modifier Achievement", "Test Description", "modifier_icon", 10, () => true); - const scene = new BattleScene(); + const modifierAchv = new ModifierAchv( + "", + "Test Modifier Achievement", + "Test Description", + "modifier_icon", + 10, + () => true, + ); const modifier = new TurnHeldItemTransferModifier(null!, 3, 1); - expect(modifierAchv.validate(scene, [ modifier ])).toBe(true); + expect(modifierAchv.validate([modifier])).toBe(true); }); }); @@ -247,7 +266,6 @@ describe("achvs", () => { }); it("should initialize the achievements with IDs and parent IDs", () => { - expect(achvs._10K_MONEY.id).toBe("_10K_MONEY"); expect(achvs._10K_MONEY.hasParent).toBe(undefined); expect(achvs._100K_MONEY.id).toBe("_100K_MONEY"); diff --git a/src/test/arena/arena_gravity.test.ts b/test/arena/arena_gravity.test.ts similarity index 83% rename from src/test/arena/arena_gravity.test.ts rename to test/arena/arena_gravity.test.ts index 13e9c23a35c..a5ce84667f0 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/test/arena/arena_gravity.test.ts @@ -1,11 +1,11 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -27,7 +27,7 @@ describe("Arena - Gravity", () => { game = new GameManager(phaserGame); game.override .battleType("single") - .moveset([ Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE ]) + .moveset([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]) .ability(Abilities.UNNERVE) .enemyAbility(Abilities.BALL_FETCH) .enemySpecies(Species.SHUCKLE) @@ -43,7 +43,7 @@ describe("Arena - Gravity", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); // Setup Gravity on first turn - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.GRAVITY); await game.phaseInterceptor.to("TurnEndPhase"); @@ -64,7 +64,7 @@ describe("Arena - Gravity", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); // Setup Gravity on first turn - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.GRAVITY); await game.phaseInterceptor.to("TurnEndPhase"); @@ -80,11 +80,9 @@ describe("Arena - Gravity", () => { describe("Against flying types", () => { it("can be hit by ground-type moves now", async () => { - game.override - .enemySpecies(Species.PIDGEOT) - .moveset([ Moves.GRAVITY, Moves.EARTHQUAKE ]); + game.override.enemySpecies(Species.PIDGEOT).moveset([Moves.GRAVITY, Moves.EARTHQUAKE]); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pidgeot = game.scene.getEnemyPokemon()!; vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); @@ -111,11 +109,9 @@ describe("Arena - Gravity", () => { }); it("keeps super-effective moves super-effective after using gravity", async () => { - game.override - .enemySpecies(Species.PIDGEOT) - .moveset([ Moves.GRAVITY, Moves.THUNDERBOLT ]); + game.override.enemySpecies(Species.PIDGEOT).moveset([Moves.GRAVITY, Moves.THUNDERBOLT]); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pidgeot = game.scene.getEnemyPokemon()!; vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); @@ -136,12 +132,9 @@ describe("Arena - Gravity", () => { }); it("cancels Fly if its user is semi-invulnerable", async () => { - game.override - .enemySpecies(Species.SNORLAX) - .enemyMoveset(Moves.FLY) - .moveset([ Moves.GRAVITY, Moves.SPLASH ]); + game.override.enemySpecies(Species.SNORLAX).enemyMoveset(Moves.FLY).moveset([Moves.GRAVITY, Moves.SPLASH]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const charizard = game.scene.getPlayerPokemon()!; const snorlax = game.scene.getEnemyPokemon()!; @@ -152,7 +145,7 @@ describe("Arena - Gravity", () => { expect(snorlax.getTag(BattlerTagType.FLYING)).toBeDefined(); game.move.select(Moves.GRAVITY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(snorlax.getTag(BattlerTagType.INTERRUPTED)).toBeDefined(); diff --git a/src/test/arena/grassy_terrain.test.ts b/test/arena/grassy_terrain.test.ts similarity index 86% rename from src/test/arena/grassy_terrain.test.ts rename to test/arena/grassy_terrain.test.ts index ead4467925b..d92fb24be5a 100644 --- a/src/test/arena/grassy_terrain.test.ts +++ b/test/arena/grassy_terrain.test.ts @@ -1,8 +1,8 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -28,12 +28,12 @@ describe("Arena - Grassy Terrain", () => { .enemySpecies(Species.SHUCKLE) .enemyAbility(Abilities.STURDY) .enemyMoveset(Moves.FLY) - .moveset([ Moves.GRASSY_TERRAIN, Moves.EARTHQUAKE ]) + .moveset([Moves.GRASSY_TERRAIN, Moves.EARTHQUAKE]) .ability(Abilities.NO_GUARD); }); it("halves the damage of Earthquake", async () => { - await game.classicMode.startBattle([ Species.TAUROS ]); + await game.classicMode.startBattle([Species.TAUROS]); const eq = allMoves[Moves.EARTHQUAKE]; vi.spyOn(eq, "calculateBattlePower"); @@ -53,7 +53,7 @@ describe("Arena - Grassy Terrain", () => { }); it("Does not halve the damage of Earthquake if opponent is not grounded", async () => { - await game.classicMode.startBattle([ Species.NINJASK ]); + await game.classicMode.startBattle([Species.NINJASK]); const eq = allMoves[Moves.EARTHQUAKE]; vi.spyOn(eq, "calculateBattlePower"); diff --git a/src/test/arena/weather_fog.test.ts b/test/arena/weather_fog.test.ts similarity index 75% rename from src/test/arena/weather_fog.test.ts rename to test/arena/weather_fog.test.ts index db591dda2b8..784c4886648 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/test/arena/weather_fog.test.ts @@ -1,10 +1,10 @@ -import { allMoves } from "#app/data/move"; -import { WeatherType } from "#app/data/weather"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { WeatherType } from "#enums/weather-type"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -24,14 +24,12 @@ describe("Weather - Fog", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .weather(WeatherType.FOG) - .battleType("single"); - game.override.moveset([ Moves.TACKLE ]); + game.override.weather(WeatherType.FOG).battleType("single"); + game.override.moveset([Moves.TACKLE]); game.override.ability(Abilities.BALL_FETCH); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); }); it("move accuracy is multiplied by 90%", async () => { @@ -39,7 +37,7 @@ describe("Weather - Fog", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(MoveEffectPhase); diff --git a/src/test/arena/weather_hail.test.ts b/test/arena/weather_hail.test.ts similarity index 81% rename from src/test/arena/weather_hail.test.ts rename to test/arena/weather_hail.test.ts index b8f4276a3d9..7af2edf26f2 100644 --- a/src/test/arena/weather_hail.test.ts +++ b/test/arena/weather_hail.test.ts @@ -1,10 +1,10 @@ -import { WeatherType } from "#app/data/weather"; +import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { WeatherType } from "#enums/weather-type"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { BattlerIndex } from "#app/battle"; describe("Weather - Hail", () => { let phaserGame: Phaser.Game; @@ -31,10 +31,10 @@ describe("Weather - Hail", () => { }); it("inflicts damage equal to 1/16 of Pokemon's max HP at turn end", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); @@ -44,11 +44,11 @@ describe("Weather - Hail", () => { }); it("does not inflict damage to a Pokemon that is underwater (Dive) or underground (Dig)", async () => { - game.override.moveset([ Moves.DIG ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.DIG]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.DIG); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); @@ -60,7 +60,7 @@ describe("Weather - Hail", () => { }); it("does not inflict damage to Ice type Pokemon", async () => { - await game.classicMode.startBattle([ Species.CLOYSTER ]); + await game.classicMode.startBattle([Species.CLOYSTER]); game.move.select(Moves.SPLASH); diff --git a/src/test/arena/weather_sandstorm.test.ts b/test/arena/weather_sandstorm.test.ts similarity index 86% rename from src/test/arena/weather_sandstorm.test.ts rename to test/arena/weather_sandstorm.test.ts index 09d0c1d2b77..d43983c4c01 100644 --- a/src/test/arena/weather_sandstorm.test.ts +++ b/test/arena/weather_sandstorm.test.ts @@ -1,9 +1,9 @@ -import { WeatherType } from "#app/data/weather"; import { Abilities } from "#app/enums/abilities"; import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { WeatherType } from "#enums/weather-type"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -32,7 +32,7 @@ describe("Weather - Sandstorm", () => { }); it("inflicts damage equal to 1/16 of Pokemon's max HP at turn end", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.SPLASH); @@ -44,8 +44,8 @@ describe("Weather - Sandstorm", () => { }); it("does not inflict damage to a Pokemon that is underwater (Dive) or underground (Dig)", async () => { - game.override.moveset([ Moves.DIVE ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([Moves.DIVE]); + await game.classicMode.startBattle([Species.MAGIKARP]); game.move.select(Moves.DIVE); @@ -65,7 +65,7 @@ describe("Weather - Sandstorm", () => { .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH); - await game.classicMode.startBattle([ Species.ROCKRUFF, Species.KLINK ]); + await game.classicMode.startBattle([Species.ROCKRUFF, Species.KLINK]); game.move.select(Moves.SPLASH, 0); game.move.select(Moves.SPLASH, 1); @@ -78,7 +78,7 @@ describe("Weather - Sandstorm", () => { }); it("increases Rock type Pokemon Sp.Def by 50%", async () => { - await game.classicMode.startBattle([ Species.ROCKRUFF ]); + await game.classicMode.startBattle([Species.ROCKRUFF]); const playerPokemon = game.scene.getPlayerPokemon()!; const playerSpdef = playerPokemon.getStat(Stat.SPDEF); diff --git a/src/test/arena/weather_strong_winds.test.ts b/test/arena/weather_strong_winds.test.ts similarity index 85% rename from src/test/arena/weather_strong_winds.test.ts rename to test/arena/weather_strong_winds.test.ts index 557de93d644..3a9235d9eb9 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/test/arena/weather_strong_winds.test.ts @@ -1,10 +1,10 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { StatusEffect } from "#app/enums/status-effect"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -28,13 +28,13 @@ describe("Weather - Strong Winds", () => { game.override.startingLevel(10); game.override.enemySpecies(Species.TAILLOW); game.override.enemyAbility(Abilities.DELTA_STREAM); - game.override.moveset([ Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE ]); + game.override.moveset([Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE]); }); it("electric type move is not very effective on Rayquaza", async () => { game.override.enemySpecies(Species.RAYQUAZA); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -45,7 +45,7 @@ describe("Weather - Strong Winds", () => { }); it("electric type move is neutral for flying type pokemon", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -56,7 +56,7 @@ describe("Weather - Strong Winds", () => { }); it("ice type move is neutral for flying type pokemon", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -67,7 +67,7 @@ describe("Weather - Strong Winds", () => { }); it("rock type move is neutral for flying type pokemon", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -80,7 +80,7 @@ describe("Weather - Strong Winds", () => { it("weather goes away when last trainer pokemon dies to indirect damage", async () => { game.override.enemyStatusEffect(StatusEffect.POISON); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon()!; enemy.hp = 1; diff --git a/src/test/battle-scene.test.ts b/test/battle-scene.test.ts similarity index 93% rename from src/test/battle-scene.test.ts rename to test/battle-scene.test.ts index 4da75cea197..44f1364441b 100644 --- a/src/test/battle-scene.test.ts +++ b/test/battle-scene.test.ts @@ -1,6 +1,6 @@ import { LoadingScene } from "#app/loading-scene"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("BattleScene", () => { let phaserGame: Phaser.Game; diff --git a/test/battle/ability_swap.test.ts b/test/battle/ability_swap.test.ts new file mode 100644 index 00000000000..b9c609e89f6 --- /dev/null +++ b/test/battle/ability_swap.test.ts @@ -0,0 +1,67 @@ +import { allAbilities } from "#app/data/ability"; +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Test Ability Swapping", () => { + 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]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should activate post-summon abilities", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[Abilities.INTIMIDATE]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should remove primal weather when the setter's ability is removed", async () => { + game.override.ability(Abilities.DESOLATE_LAND); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[Abilities.BALL_FETCH]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.weather?.weatherType).toBeUndefined(); + }); + + it("should not activate passive abilities", async () => { + game.override.passiveAbility(Abilities.INTREPID_SWORD); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SPLASH); + game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[Abilities.BALL_FETCH]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(1); // would be 2 if passive activated again + }); +}); diff --git a/src/test/battle/battle-order.test.ts b/test/battle/battle-order.test.ts similarity index 73% rename from src/test/battle/battle-order.test.ts rename to test/battle/battle-order.test.ts index d4e9950dec9..012f1ecd4bd 100644 --- a/src/test/battle/battle-order.test.ts +++ b/test/battle/battle-order.test.ts @@ -4,7 +4,7 @@ import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -28,18 +28,16 @@ describe("Battle order", () => { game.override.enemySpecies(Species.MEWTWO); game.override.enemyAbility(Abilities.INSOMNIA); game.override.ability(Abilities.INSOMNIA); - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); }); it("opponent faster than player 50 vs 150", async () => { - await game.startBattle([ - Species.BULBASAUR, - ]); + await game.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; - vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 50 ]); // set playerPokemon's speed to 50 - vi.spyOn(enemyPokemon, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ]); // set enemyPokemon's speed to 150 + vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 50]); // set playerPokemon's speed to 50 + vi.spyOn(enemyPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set enemyPokemon's speed to 150 game.move.select(Moves.TACKLE); await game.phaseInterceptor.run(EnemyCommandPhase); @@ -53,14 +51,12 @@ describe("Battle order", () => { }, 20000); it("Player faster than opponent 150 vs 50", async () => { - await game.startBattle([ - Species.BULBASAUR, - ]); + await game.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; - vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ]); // set playerPokemon's speed to 150 - vi.spyOn(enemyPokemon, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 50 ]); // set enemyPokemon's speed to 50 + vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set playerPokemon's speed to 150 + vi.spyOn(enemyPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 50]); // set enemyPokemon's speed to 50 game.move.select(Moves.TACKLE); await game.phaseInterceptor.run(EnemyCommandPhase); @@ -75,16 +71,13 @@ describe("Battle order", () => { it("double - both opponents faster than player 50/50 vs 150/150", async () => { game.override.battleType("double"); - await game.startBattle([ - Species.BULBASAUR, - Species.BLASTOISE, - ]); + await game.startBattle([Species.BULBASAUR, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerField(); const enemyPokemon = game.scene.getEnemyField(); - playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 50 ])); // set both playerPokemons' speed to 50 - enemyPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ])); // set both enemyPokemons' speed to 150 + playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 50])); // set both playerPokemons' speed to 50 + enemyPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150])); // set both enemyPokemons' speed to 150 const playerIndices = playerPokemon.map(p => p?.getBattlerIndex()); const enemyIndices = enemyPokemon.map(p => p?.getBattlerIndex()); @@ -102,16 +95,13 @@ describe("Battle order", () => { it("double - speed tie except 1 - 100/100 vs 100/150", async () => { game.override.battleType("double"); - await game.startBattle([ - Species.BULBASAUR, - Species.BLASTOISE, - ]); + await game.startBattle([Species.BULBASAUR, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerField(); const enemyPokemon = game.scene.getEnemyField(); - playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 100 ])); //set both playerPokemons' speed to 100 - vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 100 ]); // set enemyPokemon's speed to 100 - vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ]); // set enemyPokemon's speed to 150 + playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100])); //set both playerPokemons' speed to 100 + vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100]); // set enemyPokemon's speed to 100 + vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set enemyPokemon's speed to 150 const playerIndices = playerPokemon.map(p => p?.getBattlerIndex()); const enemyIndices = enemyPokemon.map(p => p?.getBattlerIndex()); @@ -129,17 +119,14 @@ describe("Battle order", () => { it("double - speed tie 100/150 vs 100/150", async () => { game.override.battleType("double"); - await game.startBattle([ - Species.BULBASAUR, - Species.BLASTOISE, - ]); + await game.startBattle([Species.BULBASAUR, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerField(); const enemyPokemon = game.scene.getEnemyField(); - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 100 ]); // set one playerPokemon's speed to 100 - vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ]); // set other playerPokemon's speed to 150 - vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 100 ]); // set one enemyPokemon's speed to 100 - vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, 150 ]); // set other enemyPokemon's speed to 150 + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100]); // set one playerPokemon's speed to 100 + vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set other playerPokemon's speed to 150 + vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100]); // set one enemyPokemon's speed to 100 + vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set other enemyPokemon's speed to 150 const playerIndices = playerPokemon.map(p => p?.getBattlerIndex()); const enemyIndices = enemyPokemon.map(p => p?.getBattlerIndex()); diff --git a/src/test/battle/battle.test.ts b/test/battle/battle.test.ts similarity index 78% rename from src/test/battle/battle.test.ts rename to test/battle/battle.test.ts index eed76397f85..36d197d1289 100644 --- a/src/test/battle/battle.test.ts +++ b/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"; @@ -16,8 +16,8 @@ import { SwitchPhase } from "#app/phases/switch-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { VictoryPhase } from "#app/phases/victory-phase"; -import GameManager from "#app/test/utils/gameManager"; -import { generateStarter } from "#app/test/utils/gameManagerUtils"; +import GameManager from "#test/testUtils/gameManager"; +import { generateStarter } from "#test/testUtils/gameManagerUtils"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -59,7 +59,6 @@ describe("Test Battle Phase", () => { await game.phaseInterceptor.run(TitlePhase); await game.waitMode(Mode.TITLE); - expect(game.scene.ui?.getMode()).toBe(Mode.TITLE); expect(game.scene.gameData.gender).toBe(PlayerGender.MALE); }, 20000); @@ -81,7 +80,6 @@ describe("Test Battle Phase", () => { await game.phaseInterceptor.run(TitlePhase); await game.waitMode(Mode.TITLE); - expect(game.scene.ui?.getMode()).toBe(Mode.TITLE); expect(game.scene.gameData.gender).toBe(PlayerGender.MALE); }, 20000); @@ -96,12 +94,10 @@ describe("Test Battle Phase", () => { game.override.starterSpecies(Species.MEWTWO); game.override.enemySpecies(Species.RATTATA); game.override.startingLevel(2000); - game.override - .startingWave(3) - .battleType("single"); - game.override.moveset([ Moves.TACKLE ]); + game.override.startingWave(3).battleType("single"); + game.override.moveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); game.move.select(Moves.TACKLE); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(SelectModifierPhase, false); @@ -112,9 +108,9 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.RATTATA); game.override.startingLevel(5); game.override.startingWave(3); - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); - game.override.enemyMoveset([ Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP ]); + game.override.enemyMoveset([Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP]); game.override.battleType("single"); await game.startBattle(); game.move.select(Moves.TACKLE); @@ -122,8 +118,8 @@ describe("Test Battle Phase", () => { }, 20000); it("load 100% data file", async () => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -131,14 +127,10 @@ describe("Test Battle Phase", () => { }, 20000); it("start battle with selected team", async () => { - await game.startBattle([ - Species.CHARIZARD, - Species.CHANSEY, - Species.MEW - ]); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.CHARIZARD); - expect(game.scene.getParty()[1].species.speciesId).toBe(Species.CHANSEY); - expect(game.scene.getParty()[2].species.speciesId).toBe(Species.MEW); + await game.startBattle([Species.CHARIZARD, Species.CHANSEY, Species.MEW]); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.CHARIZARD); + expect(game.scene.getPlayerParty()[1].species.speciesId).toBe(Species.CHANSEY); + expect(game.scene.getPlayerParty()[2].species.speciesId).toBe(Species.MEW); }, 20000); it("test remove random battle seed int", async () => { @@ -150,7 +142,7 @@ describe("Test Battle Phase", () => { it("wrong phase", async () => { await game.phaseInterceptor.run(LoginPhase); - await game.phaseInterceptor.run(LoginPhase).catch((e) => { + await game.phaseInterceptor.run(LoginPhase).catch(e => { expect(e).toBe("Wrong phase: this is SelectGenderPhase and not LoginPhase"); }); }, 20000); @@ -162,34 +154,49 @@ describe("Test Battle Phase", () => { it("good run", async () => { await game.phaseInterceptor.run(LoginPhase); - game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { - game.scene.gameData.gender = PlayerGender.MALE; - game.endPhase(); - }, () => game.isCurrentPhase(TitlePhase)); + game.onNextPrompt( + "SelectGenderPhase", + Mode.OPTION_SELECT, + () => { + game.scene.gameData.gender = PlayerGender.MALE; + game.endPhase(); + }, + () => game.isCurrentPhase(TitlePhase), + ); await game.phaseInterceptor.run(SelectGenderPhase, () => game.isCurrentPhase(TitlePhase)); await game.phaseInterceptor.run(TitlePhase); }, 20000); it("good run from select gender to title", async () => { await game.phaseInterceptor.run(LoginPhase); - game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { - game.scene.gameData.gender = PlayerGender.MALE; - game.endPhase(); - }, () => game.isCurrentPhase(TitlePhase)); + game.onNextPrompt( + "SelectGenderPhase", + Mode.OPTION_SELECT, + () => { + game.scene.gameData.gender = PlayerGender.MALE; + game.endPhase(); + }, + () => game.isCurrentPhase(TitlePhase), + ); await game.phaseInterceptor.runFrom(SelectGenderPhase).to(TitlePhase); }, 20000); it("good run to SummonPhase phase", async () => { await game.phaseInterceptor.run(LoginPhase); - game.onNextPrompt("SelectGenderPhase", Mode.OPTION_SELECT, () => { - game.scene.gameData.gender = PlayerGender.MALE; - game.endPhase(); - }, () => game.isCurrentPhase(TitlePhase)); + game.onNextPrompt( + "SelectGenderPhase", + Mode.OPTION_SELECT, + () => { + game.scene.gameData.gender = PlayerGender.MALE; + game.endPhase(); + }, + () => game.isCurrentPhase(TitlePhase), + ); game.onNextPrompt("TitlePhase", Mode.TITLE, () => { game.scene.gameMode = getGameMode(GameModes.CLASSIC); const starters = generateStarter(game.scene); - const selectStarterPhase = new SelectStarterPhase(game.scene); - game.scene.pushPhase(new EncounterPhase(game.scene, false)); + const selectStarterPhase = new SelectStarterPhase(); + game.scene.pushPhase(new EncounterPhase(false)); selectStarterPhase.initBattle(starters); }); await game.phaseInterceptor.runFrom(SelectGenderPhase).to(SummonPhase); @@ -200,10 +207,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.MIGHTYENA); game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); @@ -213,9 +217,7 @@ describe("Test Battle Phase", () => { game.override.enemySpecies(Species.MIGHTYENA); game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); - await game.startBattle([ - Species.BLASTOISE, - ]); + await game.startBattle([Species.BLASTOISE]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); @@ -226,10 +228,7 @@ describe("Test Battle Phase", () => { game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); game.override.startingWave(3); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); @@ -240,12 +239,7 @@ describe("Test Battle Phase", () => { game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); game.override.startingWave(3); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - Species.DARKRAI, - Species.GABITE, - ]); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD, Species.DARKRAI, Species.GABITE]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); @@ -259,15 +253,12 @@ describe("Test Battle Phase", () => { game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); - await game.startBattle([ - Species.DARMANITAN, - Species.CHARIZARD, - ]); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + await game.startBattle([Species.DARMANITAN, Species.CHARIZARD]); 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); @@ -282,8 +273,8 @@ describe("Test Battle Phase", () => { game.override.ability(Abilities.ZEN_MODE); game.override.startingLevel(2000); game.override.startingWave(3); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle(); const turn = game.scene.currentBattle.turn; game.move.select(moveToUse); @@ -302,8 +293,8 @@ describe("Test Battle Phase", () => { .startingLevel(2000) .startingWave(3) .startingBiome(Biome.LAKE) - .moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + .moveset([moveToUse]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.classicMode.startBattle(); const waveIndex = game.scene.currentBattle.waveIndex; game.move.select(moveToUse); @@ -323,7 +314,7 @@ describe("Test Battle Phase", () => { .enemySpecies(Species.RATTATA) .startingWave(1) .startingLevel(100) - .moveset([ moveToUse ]) + .moveset([moveToUse]) .enemyMoveset(Moves.SPLASH) .startingHeldItems([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]); @@ -335,10 +326,14 @@ describe("Test Battle Phase", () => { game.doRevivePokemon(0); // pretend max revive was picked game.doSelectModifier(); - game.onNextPrompt("SwitchPhase", Mode.PARTY, () => { - expect.fail("Switch was forced"); - }, () => game.isCurrentPhase(NextEncounterPhase)); + game.onNextPrompt( + "SwitchPhase", + Mode.PARTY, + () => { + expect.fail("Switch was forced"); + }, + () => game.isCurrentPhase(NextEncounterPhase), + ); await game.phaseInterceptor.to(SwitchPhase); }, 20000); }); - diff --git a/src/test/battle/damage_calculation.test.ts b/test/battle/damage_calculation.test.ts similarity index 61% rename from src/test/battle/damage_calculation.test.ts rename to test/battle/damage_calculation.test.ts index e6ecbe4646f..dab1fc81caa 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/test/battle/damage_calculation.test.ts @@ -1,9 +1,11 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; +import type { EnemyPersistentModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -31,11 +33,11 @@ describe("Battle Mechanics - Damage Calculation", () => { .startingLevel(100) .enemyLevel(100) .disableCrits() - .moveset([ Moves.TACKLE, Moves.DRAGON_RAGE, Moves.FISSURE, Moves.JUMP_KICK ]); + .moveset([Moves.TACKLE, Moves.DRAGON_RAGE, Moves.FISSURE, Moves.JUMP_KICK]); }); it("Tackle deals expected base damage", async () => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const playerPokemon = game.scene.getPlayerPokemon()!; vi.spyOn(playerPokemon, "getEffectiveStat").mockReturnValue(80); @@ -49,11 +51,9 @@ describe("Battle Mechanics - Damage Calculation", () => { }); it("Attacks deal 1 damage at minimum", async () => { - game.override - .startingLevel(1) - .enemySpecies(Species.AGGRON); + game.override.startingLevel(1).enemySpecies(Species.AGGRON); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const aggron = game.scene.getEnemyPokemon()!; @@ -65,12 +65,28 @@ describe("Battle Mechanics - Damage Calculation", () => { expect(aggron.hp).toBe(aggron.getMaxHp() - 1); }); - it("Fixed-damage moves ignore damage multipliers", async () => { - game.override - .enemySpecies(Species.DRAGONITE) - .enemyAbility(Abilities.MULTISCALE); + it("Attacks deal 1 damage at minimum even with many tokens", async () => { + game.override.startingLevel(1).enemySpecies(Species.AGGRON).enemyAbility(Abilities.STURDY).enemyLevel(10000); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.SHUCKLE]); + + const dmg_redux_modifier = modifierTypes.ENEMY_DAMAGE_REDUCTION().newModifier() as EnemyPersistentModifier; + dmg_redux_modifier.stackCount = 1000; + await game.scene.addEnemyModifier(modifierTypes.ENEMY_DAMAGE_REDUCTION().newModifier() as EnemyPersistentModifier); + + const aggron = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(aggron.hp).toBe(aggron.getMaxHp() - 1); + }); + + it("Fixed-damage moves ignore damage multipliers", async () => { + game.override.enemySpecies(Species.DRAGONITE).enemyAbility(Abilities.MULTISCALE); + + await game.classicMode.startBattle([Species.MAGIKARP]); const magikarp = game.scene.getPlayerPokemon()!; const dragonite = game.scene.getEnemyPokemon()!; @@ -79,11 +95,9 @@ describe("Battle Mechanics - Damage Calculation", () => { }); it("One-hit KO moves ignore damage multipliers", async () => { - game.override - .enemySpecies(Species.AGGRON) - .enemyAbility(Abilities.MULTISCALE); + game.override.enemySpecies(Species.AGGRON).enemyAbility(Abilities.MULTISCALE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const magikarp = game.scene.getPlayerPokemon()!; const aggron = game.scene.getEnemyPokemon()!; @@ -92,30 +106,24 @@ describe("Battle Mechanics - Damage Calculation", () => { }); it("When the user fails to use Jump Kick with Wonder Guard ability, the damage should be 1.", async () => { - game.override - .enemySpecies(Species.GASTLY) - .ability(Abilities.WONDER_GUARD); + game.override.enemySpecies(Species.GASTLY).ability(Abilities.WONDER_GUARD); - await game.classicMode.startBattle([ Species.SHEDINJA ]); + await game.classicMode.startBattle([Species.SHEDINJA]); const shedinja = game.scene.getPlayerPokemon()!; game.move.select(Moves.JUMP_KICK); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(shedinja.hp).toBe(shedinja.getMaxHp() - 1); }); - it("Charizard with odd HP survives Stealth Rock damage twice", async () => { game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0); - game.override - .seed("Charizard Stealth Rock test") - .enemySpecies(Species.CHARIZARD) - .enemyAbility(Abilities.BLAZE); + game.override.seed("Charizard Stealth Rock test").enemySpecies(Species.CHARIZARD).enemyAbility(Abilities.BLAZE); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const charizard = game.scene.getEnemyPokemon()!; diff --git a/test/battle/double_battle.test.ts b/test/battle/double_battle.test.ts new file mode 100644 index 00000000000..21d27573d22 --- /dev/null +++ b/test/battle/double_battle.test.ts @@ -0,0 +1,96 @@ +import { Status } from "#app/data/status-effect"; +import { Abilities } from "#enums/abilities"; +import { GameModes, getGameMode } from "#app/game-mode"; +import { BattleEndPhase } from "#app/phases/battle-end-phase"; +import { TurnInitPhase } from "#app/phases/turn-init-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Double Battles", () => { + const DOUBLE_CHANCE = 8; // Normal chance of double battle is 1/8 + + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + // double-battle player's pokemon both fainted in same round, then revive one, and next double battle summons two player's pokemon successfully. + // (There were bugs that either only summon one when can summon two, player stuck in switchPhase etc) + it("3v2 edge case: player summons 2 pokemon on the next battle after being fainted and revived", async () => { + game.override.battleType("double").enemyMoveset(Moves.SPLASH).moveset(Moves.SPLASH); + await game.startBattle([Species.BULBASAUR, Species.CHARIZARD, Species.SQUIRTLE]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + + for (const pokemon of game.scene.getPlayerField()) { + pokemon.hp = 0; + pokemon.status = new Status(StatusEffect.FAINT); + expect(pokemon.isFainted()).toBe(true); + } + + await game.doKillOpponents(); + + await game.phaseInterceptor.to(BattleEndPhase); + game.doSelectModifier(); + + const charizard = game.scene.getPlayerParty().findIndex(p => p.species.speciesId === Species.CHARIZARD); + game.doRevivePokemon(charizard); + + await game.phaseInterceptor.to(TurnInitPhase); + expect(game.scene.getPlayerField().filter(p => !p.isFainted())).toHaveLength(2); + }, 20000); + + it("randomly chooses between single and double battles if there is no battle type override", async () => { + let rngSweepProgress = 0; // Will simulate RNG rolls by slowly increasing from 0 to 1 + let doubleCount = 0; + let singleCount = 0; + + vi.spyOn(Phaser.Math.RND, "realInRange").mockImplementation((min: number, max: number) => { + return rngSweepProgress * (max - min) + min; + }); + + game.override + .enemyMoveset(Moves.SPLASH) + .moveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.BALL_FETCH); + + // Play through endless, waves 1 to 9, counting number of double battles from waves 2 to 9 + await game.classicMode.startBattle([Species.BULBASAUR]); + game.scene.gameMode = getGameMode(GameModes.ENDLESS); + + for (let i = 0; i < DOUBLE_CHANCE; i++) { + rngSweepProgress = (i + 0.5) / DOUBLE_CHANCE; + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.toNextWave(); + + if (game.scene.getEnemyParty().length === 1) { + singleCount++; + } else if (game.scene.getEnemyParty().length === 2) { + doubleCount++; + } + } + + expect(doubleCount).toBe(1); + expect(singleCount).toBe(DOUBLE_CHANCE - 1); + }); +}); diff --git a/src/test/battle/inverse_battle.test.ts b/test/battle/inverse_battle.test.ts similarity index 70% rename from src/test/battle/inverse_battle.test.ts rename to test/battle/inverse_battle.test.ts index 110f92d15b7..83109c35740 100644 --- a/src/test/battle/inverse_battle.test.ts +++ b/test/battle/inverse_battle.test.ts @@ -1,16 +1,15 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Challenges } from "#enums/challenges"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Inverse Battle", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -40,10 +39,7 @@ describe("Inverse Battle", () => { }); it("Immune types are 2x effective - Thunderbolt against Ground Type", async () => { - game.override - .moveset([ Moves.THUNDERBOLT ]) - .enemySpecies(Species.SANDSHREW); - + game.override.moveset([Moves.THUNDERBOLT]).enemySpecies(Species.SANDSHREW); await game.challengeMode.startBattle(); @@ -51,16 +47,14 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.THUNDERBOLT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }); it("2x effective types are 0.5x effective - Thunderbolt against Flying Type", async () => { - game.override - .moveset([ Moves.THUNDERBOLT ]) - .enemySpecies(Species.PIDGEY); + game.override.moveset([Moves.THUNDERBOLT]).enemySpecies(Species.PIDGEY); await game.challengeMode.startBattle(); @@ -68,16 +62,14 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.THUNDERBOLT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.5); }); it("0.5x effective types are 2x effective - Thunderbolt against Electric Type", async () => { - game.override - .moveset([ Moves.THUNDERBOLT ]) - .enemySpecies(Species.CHIKORITA); + game.override.moveset([Moves.THUNDERBOLT]).enemySpecies(Species.CHIKORITA); await game.challengeMode.startBattle(); @@ -85,7 +77,7 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.THUNDERBOLT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); @@ -93,9 +85,7 @@ describe("Inverse Battle", () => { it("Stealth Rock follows the inverse matchups - Stealth Rock against Charizard deals 1/32 of max HP", async () => { game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0); - game.override - .enemySpecies(Species.CHARIZARD) - .enemyLevel(100); + game.override.enemySpecies(Species.CHARIZARD).enemyLevel(100); await game.challengeMode.startBattle(); @@ -107,14 +97,17 @@ describe("Inverse Battle", () => { const currentHp = charizard.hp; const expectedHP = maxHp - damage_prediction; - console.log("Charizard's max HP: " + maxHp, "Damage: " + damage_prediction, "Current HP: " + currentHp, "Expected HP: " + expectedHP); - expect(currentHp).toBeGreaterThan(maxHp * 31 / 32 - 1); + console.log( + "Charizard's max HP: " + maxHp, + "Damage: " + damage_prediction, + "Current HP: " + currentHp, + "Expected HP: " + expectedHP, + ); + expect(currentHp).toBeGreaterThan((maxHp * 31) / 32 - 1); }); it("Freeze Dry is 2x effective against Water Type like other Ice type Move - Freeze Dry against Squirtle", async () => { - game.override - .moveset([ Moves.FREEZE_DRY ]) - .enemySpecies(Species.SQUIRTLE); + game.override.moveset([Moves.FREEZE_DRY]).enemySpecies(Species.SQUIRTLE); await game.challengeMode.startBattle(); @@ -122,39 +115,35 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FREEZE_DRY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }); it("Water Absorb should heal against water moves - Water Absorb against Water gun", async () => { - game.override - .moveset([ Moves.WATER_GUN ]) - .enemyAbility(Abilities.WATER_ABSORB); + game.override.moveset([Moves.WATER_GUN]).enemyAbility(Abilities.WATER_ABSORB); await game.challengeMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; enemy.hp = enemy.getMaxHp() - 1; game.move.select(Moves.WATER_GUN); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.hp).toBe(enemy.getMaxHp()); }); it("Fire type does not get burned - Will-O-Wisp against Charmander", async () => { - game.override - .moveset([ Moves.WILL_O_WISP ]) - .enemySpecies(Species.CHARMANDER); + game.override.moveset([Moves.WILL_O_WISP]).enemySpecies(Species.CHARMANDER); await game.challengeMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.WILL_O_WISP); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("MoveEndPhase"); @@ -162,45 +151,36 @@ describe("Inverse Battle", () => { }); it("Electric type does not get paralyzed - Nuzzle against Pikachu", async () => { - game.override - .moveset([ Moves.NUZZLE ]) - .enemySpecies(Species.PIKACHU) - .enemyLevel(50); + game.override.moveset([Moves.NUZZLE]).enemySpecies(Species.PIKACHU).enemyLevel(50); await game.challengeMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.NUZZLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.status?.effect).not.toBe(StatusEffect.PARALYSIS); }); it("Ground type is not immune to Thunder Wave - Thunder Wave against Sandshrew", async () => { - game.override - .moveset([ Moves.THUNDER_WAVE ]) - .enemySpecies(Species.SANDSHREW); + game.override.moveset([Moves.THUNDER_WAVE]).enemySpecies(Species.SANDSHREW); await game.challengeMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.THUNDER_WAVE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.status?.effect).toBe(StatusEffect.PARALYSIS); }); - it("Anticipation should trigger on 2x effective moves - Anticipation against Thunderbolt", async () => { - game.override - .moveset([ Moves.THUNDERBOLT ]) - .enemySpecies(Species.SANDSHREW) - .enemyAbility(Abilities.ANTICIPATION); + game.override.moveset([Moves.THUNDERBOLT]).enemySpecies(Species.SANDSHREW).enemyAbility(Abilities.ANTICIPATION); await game.challengeMode.startBattle(); @@ -209,25 +189,23 @@ describe("Inverse Battle", () => { it("Conversion 2 should change the type to the resistive type - Conversion 2 against Dragonite", async () => { game.override - .moveset([ Moves.CONVERSION_2 ]) - .enemyMoveset([ Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW ]); + .moveset([Moves.CONVERSION_2]) + .enemyMoveset([Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW]); await game.challengeMode.startBattle(); const player = game.scene.getPlayerPokemon()!; game.move.select(Moves.CONVERSION_2); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); - expect(player.getTypes()[0]).toBe(Type.DRAGON); + expect(player.getTypes()[0]).toBe(PokemonType.DRAGON); }); it("Flying Press should be 0.25x effective against Grass + Dark Type - Flying Press against Meowscarada", async () => { - game.override - .moveset([ Moves.FLYING_PRESS ]) - .enemySpecies(Species.MEOWSCARADA); + game.override.moveset([Moves.FLYING_PRESS]).enemySpecies(Species.MEOWSCARADA); await game.challengeMode.startBattle(); @@ -235,17 +213,14 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FLYING_PRESS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(0.25); }); it("Scrappy ability has no effect - Tackle against Ghost Type still 2x effective with Scrappy", async () => { - game.override - .moveset([ Moves.TACKLE ]) - .ability(Abilities.SCRAPPY) - .enemySpecies(Species.GASTLY); + game.override.moveset([Moves.TACKLE]).ability(Abilities.SCRAPPY).enemySpecies(Species.GASTLY); await game.challengeMode.startBattle(); @@ -253,16 +228,14 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); }); it("FORESIGHT has no effect - Tackle against Ghost Type still 2x effective with Foresight", async () => { - game.override - .moveset([ Moves.FORESIGHT, Moves.TACKLE ]) - .enemySpecies(Species.GASTLY); + game.override.moveset([Moves.FORESIGHT, Moves.TACKLE]).enemySpecies(Species.GASTLY); await game.challengeMode.startBattle(); @@ -270,11 +243,11 @@ describe("Inverse Battle", () => { vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(Moves.FORESIGHT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); game.move.select(Moves.TACKLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); diff --git a/src/test/battle/special_battle.test.ts b/test/battle/special_battle.test.ts similarity index 52% rename from src/test/battle/special_battle.test.ts rename to test/battle/special_battle.test.ts index af9e3dddbec..cf7f3733484 100644 --- a/src/test/battle/special_battle.test.ts +++ b/test/battle/special_battle.test.ts @@ -3,7 +3,7 @@ import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -25,119 +25,72 @@ describe("Test Battle Phase", () => { game = new GameManager(phaserGame); game.override.enemySpecies(Species.RATTATA); game.override.startingLevel(2000); - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.HYDRATION); game.override.ability(Abilities.HYDRATION); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); - it("startBattle 2vs1 boss", async() => { - game.override - .battleType("single") - .startingWave(10); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs1 boss", async () => { + game.override.battleType("single").startingWave(10); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs2 boss", async() => { - game.override - .battleType("double") - .startingWave(10); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs2 boss", async () => { + game.override.battleType("double").startingWave(10); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs2 trainer", async() => { - game.override - .battleType("double") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs2 trainer", async () => { + game.override.battleType("double").startingWave(5); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs1 trainer", async() => { - game.override - .battleType("single") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs1 trainer", async () => { + game.override.battleType("single").startingWave(5); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs1 rival", async() => { - game.override - .battleType("single") - .startingWave(8); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs1 rival", async () => { + game.override.battleType("single").startingWave(8); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs2 rival", async() => { - game.override - .battleType("double") - .startingWave(8); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs2 rival", async () => { + game.override.battleType("double").startingWave(8); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 1vs1 trainer", async() => { - game.override - .battleType("single") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - ]); + it("startBattle 1vs1 trainer", async () => { + game.override.battleType("single").startingWave(5); + await game.startBattle([Species.BLASTOISE]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 2vs2 trainer", async() => { - game.override - .battleType("double") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - ]); + it("startBattle 2vs2 trainer", async () => { + game.override.battleType("double").startingWave(5); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); - it("startBattle 4vs2 trainer", async() => { - game.override - .battleType("double") - .startingWave(5); - await game.startBattle([ - Species.BLASTOISE, - Species.CHARIZARD, - Species.DARKRAI, - Species.GABITE, - ]); + it("startBattle 4vs2 trainer", async () => { + game.override.battleType("double").startingWave(5); + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD, Species.DARKRAI, Species.GABITE]); expect(game.scene.ui?.getMode()).toBe(Mode.COMMAND); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(CommandPhase.name); }, 20000); }); - diff --git a/test/battlerTags/octolock.test.ts b/test/battlerTags/octolock.test.ts new file mode 100644 index 00000000000..6189bd7febe --- /dev/null +++ b/test/battlerTags/octolock.test.ts @@ -0,0 +1,46 @@ +import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; +import type Pokemon from "#app/field/pokemon"; +import { BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags"; +import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; + +describe("BattlerTag - OctolockTag", () => { + describe("lapse behavior", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + game = new GameManager(phaserGame); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("unshifts a StatStageChangePhase with expected stat stage changes", async () => { + const mockPokemon = { + getBattlerIndex: () => 0, + } as Pokemon; + + const subject = new OctolockTag(1); + + vi.spyOn(game.scene, "unshiftPhase").mockImplementation(phase => { + expect(phase).toBeInstanceOf(StatStageChangePhase); + expect((phase as StatStageChangePhase)["stages"]).toEqual(-1); + expect((phase as StatStageChangePhase)["stats"]).toEqual([Stat.DEF, Stat.SPDEF]); + }); + + subject.lapse(mockPokemon, BattlerTagLapseType.TURN_END); + + expect(game.scene.unshiftPhase).toBeCalledTimes(1); + }); + }); + + it("traps its target (extends TrappedTag)", async () => { + expect(new OctolockTag(1)).toBeInstanceOf(TrappedTag); + }); +}); diff --git a/src/test/battlerTags/stockpiling.test.ts b/test/battlerTags/stockpiling.test.ts similarity index 64% rename from src/test/battlerTags/stockpiling.test.ts rename to test/battlerTags/stockpiling.test.ts index dab189853c5..20fade13d92 100644 --- a/src/test/battlerTags/stockpiling.test.ts +++ b/test/battlerTags/stockpiling.test.ts @@ -1,136 +1,147 @@ -import BattleScene from "#app/battle-scene"; -import { beforeEach, describe, expect, it, vi } from "vitest"; -import Pokemon, { PokemonSummonData } from "#app/field/pokemon"; import { StockpilingTag } from "#app/data/battler-tags"; -import { Stat } from "#enums/stat"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonSummonData } from "#app/field/pokemon"; import * as messages from "#app/messages"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; beforeEach(() => { vi.spyOn(messages, "getPokemonNameWithAffix").mockImplementation(() => ""); }); describe("BattlerTag - StockpilingTag", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + game = new GameManager(phaserGame); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + describe("onAdd", () => { it("unshifts a StatStageChangePhase with expected stat stage changes on add", async () => { const mockPokemon = { - scene: vi.mocked(new BattleScene()) as BattleScene, getBattlerIndex: () => 0, } as Pokemon; - vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + vi.spyOn(game.scene, "queueMessage").mockImplementation(() => {}); const subject = new StockpilingTag(1); - vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + vi.spyOn(game.scene, "unshiftPhase").mockImplementation(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [ 1, 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.DEF, Stat.SPDEF], [1, 1]); }); subject.onAdd(mockPokemon); - expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + expect(game.scene.unshiftPhase).toBeCalledTimes(1); }); it("unshifts a StatStageChangePhase with expected stat changes on add (one stat maxed)", async () => { const mockPokemon = { - scene: new BattleScene(), summonData: new PokemonSummonData(), getBattlerIndex: () => 0, - } as Pokemon; + } as unknown as Pokemon; - vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + vi.spyOn(game.scene, "queueMessage").mockImplementation(() => {}); mockPokemon.summonData.statStages[Stat.DEF - 1] = 6; mockPokemon.summonData.statStages[Stat.SPD - 1] = 5; const subject = new StockpilingTag(1); - vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + vi.spyOn(game.scene, "unshiftPhase").mockImplementation(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [ 1, 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.DEF, Stat.SPDEF], [1, 1]); }); subject.onAdd(mockPokemon); - expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + expect(game.scene.unshiftPhase).toBeCalledTimes(1); }); }); describe("onOverlap", () => { it("unshifts a StatStageChangePhase with expected stat changes on overlap", async () => { const mockPokemon = { - scene: new BattleScene(), getBattlerIndex: () => 0, } as Pokemon; - vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + vi.spyOn(game.scene, "queueMessage").mockImplementation(() => {}); const subject = new StockpilingTag(1); - vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + vi.spyOn(game.scene, "unshiftPhase").mockImplementation(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [ 1, 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.DEF, Stat.SPDEF], [1, 1]); }); subject.onOverlap(mockPokemon); - expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + expect(game.scene.unshiftPhase).toBeCalledTimes(1); }); }); describe("stack limit, stat tracking, and removal", () => { it("can be added up to three times, even when one stat does not change", async () => { const mockPokemon = { - scene: new BattleScene(), summonData: new PokemonSummonData(), getBattlerIndex: () => 0, } as Pokemon; - vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + vi.spyOn(game.scene, "queueMessage").mockImplementation(() => {}); mockPokemon.summonData.statStages[Stat.DEF - 1] = 5; mockPokemon.summonData.statStages[Stat.SPD - 1] = 4; const subject = new StockpilingTag(1); - vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + vi.spyOn(game.scene, "unshiftPhase").mockImplementationOnce(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); // def doesn't change - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.SPDEF ], [ 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.SPDEF], [1]); }); subject.onAdd(mockPokemon); expect(subject.stockpiledCount).toBe(1); - vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + vi.spyOn(game.scene, "unshiftPhase").mockImplementationOnce(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); // def doesn't change - (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.SPDEF ], [ 1 ]); + (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.SPDEF], [1]); }); subject.onOverlap(mockPokemon); expect(subject.stockpiledCount).toBe(2); - vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + vi.spyOn(game.scene, "unshiftPhase").mockImplementationOnce(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(1); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF])); // neither stat changes, stack count should still increase }); @@ -138,24 +149,27 @@ describe("BattlerTag - StockpilingTag", () => { subject.onOverlap(mockPokemon); expect(subject.stockpiledCount).toBe(3); - vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(_phase => { + vi.spyOn(game.scene, "unshiftPhase").mockImplementationOnce(_phase => { throw new Error("Should not be called a fourth time"); }); // fourth stack should not be applied subject.onOverlap(mockPokemon); expect(subject.stockpiledCount).toBe(3); - expect(subject.statChangeCounts).toMatchObject({ [Stat.DEF]: 0, [Stat.SPDEF]: 2 }); + expect(subject.statChangeCounts).toMatchObject({ + [Stat.DEF]: 0, + [Stat.SPDEF]: 2, + }); // removing tag should reverse stat changes - vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + vi.spyOn(game.scene, "unshiftPhase").mockImplementationOnce(phase => { expect(phase).toBeInstanceOf(StatStageChangePhase); expect((phase as StatStageChangePhase)["stages"]).toEqual(-2); - expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.SPDEF ])); + expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.SPDEF])); }); subject.onRemove(mockPokemon); - expect(mockPokemon.scene.unshiftPhase).toHaveBeenCalledOnce(); // note that re-spying each add/overlap has been refreshing call count + expect(game.scene.unshiftPhase).toHaveBeenCalledOnce(); // note that re-spying each add/overlap has been refreshing call count }); }); }); diff --git a/test/battlerTags/substitute.test.ts b/test/battlerTags/substitute.test.ts new file mode 100644 index 00000000000..e80453d2933 --- /dev/null +++ b/test/battlerTags/substitute.test.ts @@ -0,0 +1,210 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import type { PokemonTurnData, TurnMove, PokemonMove } from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; +import { MoveResult } from "#app/field/pokemon"; +import BattleScene from "#app/battle-scene"; +import { BattlerTagLapseType, BindTag, SubstituteTag } from "#app/data/battler-tags"; +import { Moves } from "#app/enums/moves"; +import { PokemonAnimType } from "#app/enums/pokemon-anim-type"; +import * as messages from "#app/messages"; +import { allMoves } from "#app/data/moves/move"; +import type { MoveEffectPhase } from "#app/phases/move-effect-phase"; + +describe("BattlerTag - SubstituteTag", () => { + let mockPokemon: Pokemon; + + describe("onAdd behavior", () => { + beforeEach(() => { + mockPokemon = { + scene: new BattleScene(), + hp: 101, + id: 0, + getMaxHp: vi.fn().mockReturnValue(101) as Pokemon["getMaxHp"], + findAndRemoveTags: vi.fn().mockImplementation(tagFilter => { + // simulate a Trapped tag set by another Pokemon, then expect the filter to catch it. + const trapTag = new BindTag(5, 0); + expect(tagFilter(trapTag)).toBeTruthy(); + return true; + }) as Pokemon["findAndRemoveTags"], + } as unknown as Pokemon; + + vi.spyOn(messages, "getPokemonNameWithAffix").mockReturnValue(""); + vi.spyOn(mockPokemon.scene as BattleScene, "getPokemonById").mockImplementation(pokemonId => + mockPokemon.id === pokemonId ? mockPokemon : null, + ); + }); + + it("sets the tag's HP to 1/4 of the source's max HP (rounded down)", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + + subject.onAdd(mockPokemon); + + expect(subject.hp).toBe(25); + }); + + it("triggers on-add effects that bring the source out of focus", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( + (_pokemon, battleAnimType, _fieldAssets?, _delayed?) => { + expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_ADD); + return true; + }, + ); + + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + + subject.onAdd(mockPokemon); + + expect(subject.sourceInFocus).toBeFalsy(); + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); + expect((mockPokemon.scene as BattleScene).queueMessage).toHaveBeenCalledTimes(1); + }); + + it("removes effects that trap the source", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + + subject.onAdd(mockPokemon); + expect(mockPokemon.findAndRemoveTags).toHaveBeenCalledTimes(1); + }); + }); + + describe("onRemove behavior", () => { + beforeEach(() => { + mockPokemon = { + scene: new BattleScene(), + hp: 101, + id: 0, + isFainted: vi.fn().mockReturnValue(false) as Pokemon["isFainted"], + } as unknown as Pokemon; + + vi.spyOn(messages, "getPokemonNameWithAffix").mockReturnValue(""); + }); + + it("triggers on-remove animation and message", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + subject.sourceInFocus = false; + + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( + (_pokemon, battleAnimType, _fieldAssets?, _delayed?) => { + expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_REMOVE); + return true; + }, + ); + + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + + subject.onRemove(mockPokemon); + + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); + expect((mockPokemon.scene as BattleScene).queueMessage).toHaveBeenCalledTimes(1); + }); + }); + + describe("lapse behavior", () => { + beforeEach(() => { + mockPokemon = { + scene: new BattleScene(), + hp: 101, + id: 0, + turnData: { acted: true } as PokemonTurnData, + getLastXMoves: vi + .fn() + .mockReturnValue([ + { move: Moves.TACKLE, result: MoveResult.SUCCESS } as TurnMove, + ]) as Pokemon["getLastXMoves"], + } as unknown as Pokemon; + + vi.spyOn(messages, "getPokemonNameWithAffix").mockReturnValue(""); + }); + + it("PRE_MOVE lapse triggers pre-move animation", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( + (_pokemon, battleAnimType, _fieldAssets?, _delayed?) => { + expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_PRE_MOVE); + return true; + }, + ); + + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + + expect(subject.lapse(mockPokemon, BattlerTagLapseType.PRE_MOVE)).toBeTruthy(); + + expect(subject.sourceInFocus).toBeTruthy(); + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); + expect((mockPokemon.scene as BattleScene).queueMessage).not.toHaveBeenCalled(); + }); + + it("AFTER_MOVE lapse triggers post-move animation", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockImplementation( + (_pokemon, battleAnimType, _fieldAssets?, _delayed?) => { + expect(battleAnimType).toBe(PokemonAnimType.SUBSTITUTE_POST_MOVE); + return true; + }, + ); + + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + + expect(subject.lapse(mockPokemon, BattlerTagLapseType.AFTER_MOVE)).toBeTruthy(); + + expect(subject.sourceInFocus).toBeFalsy(); + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).toHaveBeenCalledTimes(1); + expect((mockPokemon.scene as BattleScene).queueMessage).not.toHaveBeenCalled(); + }); + + // TODO: Figure out how to mock a MoveEffectPhase correctly for this test + it.todo("HIT lapse triggers on-hit message", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + + const pokemonMove = { + getMove: vi.fn().mockReturnValue(allMoves[Moves.TACKLE]) as PokemonMove["getMove"], + } as PokemonMove; + + const moveEffectPhase = { + move: pokemonMove, + getUserPokemon: vi.fn().mockReturnValue(undefined) as MoveEffectPhase["getUserPokemon"], + } as MoveEffectPhase; + + vi.spyOn(mockPokemon.scene as BattleScene, "getCurrentPhase").mockReturnValue(moveEffectPhase); + vi.spyOn(allMoves[Moves.TACKLE], "hitsSubstitute").mockReturnValue(true); + + expect(subject.lapse(mockPokemon, BattlerTagLapseType.HIT)).toBeTruthy(); + + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).not.toHaveBeenCalled(); + expect((mockPokemon.scene as BattleScene).queueMessage).toHaveBeenCalledTimes(1); + }); + + it("CUSTOM lapse flags the tag for removal", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + + expect(subject.lapse(mockPokemon, BattlerTagLapseType.CUSTOM)).toBeFalsy(); + }); + + it("Unsupported lapse type does nothing", async () => { + const subject = new SubstituteTag(Moves.SUBSTITUTE, mockPokemon.id); + + vi.spyOn(mockPokemon.scene as BattleScene, "triggerPokemonBattleAnim").mockReturnValue(true); + vi.spyOn(mockPokemon.scene as BattleScene, "queueMessage").mockReturnValue(); + + expect(subject.lapse(mockPokemon, BattlerTagLapseType.TURN_END)).toBeTruthy(); + + expect((mockPokemon.scene as BattleScene).triggerPokemonBattleAnim).not.toHaveBeenCalled(); + expect((mockPokemon.scene as BattleScene).queueMessage).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/src/test/boss-pokemon.test.ts b/test/boss-pokemon.test.ts similarity index 90% rename from src/test/boss-pokemon.test.ts rename to test/boss-pokemon.test.ts index 840b65f3cc6..6b150de2d2b 100644 --- a/src/test/boss-pokemon.test.ts +++ b/test/boss-pokemon.test.ts @@ -1,11 +1,11 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#app/enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { EFFECTIVE_STATS } from "#app/enums/stat"; -import { EnemyPokemon } from "#app/field/pokemon"; +import type { EnemyPokemon } from "#app/field/pokemon"; import { toDmgValue } from "#app/utils"; describe("Boss Pokemon / Shields", () => { @@ -33,7 +33,7 @@ describe("Boss Pokemon / Shields", () => { .enemyMoveset(Moves.SPLASH) .enemyHeldItems([]) .startingLevel(1000) - .moveset([ Moves.FALSE_SWIPE, Moves.SUPER_FANG, Moves.SPLASH, Moves.PSYCHIC ]) + .moveset([Moves.FALSE_SWIPE, Moves.SUPER_FANG, Moves.SPLASH, Moves.PSYCHIC]) .ability(Abilities.NO_GUARD); }); @@ -63,11 +63,9 @@ describe("Boss Pokemon / Shields", () => { }); it("should reduce the number of shields if we are in a double battle", async () => { - game.override - .battleType("double") - .startingWave(150); // Floor 150 > 2 shields / 3 health segments + game.override.battleType("double").startingWave(150); // Floor 150 > 2 shields / 3 health segments - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!; const boss2: EnemyPokemon = game.scene.getEnemyParty()[1]!; @@ -80,7 +78,7 @@ describe("Boss Pokemon / Shields", () => { it("shields should stop overflow damage and give stat stage boosts when broken", async () => { game.override.startingWave(150); // Floor 150 > 2 shields / 3 health segments - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); const enemyPokemon = game.scene.getEnemyPokemon()!; const segmentHp = enemyPokemon.getMaxHp() / enemyPokemon.bossSegments; @@ -104,15 +102,12 @@ describe("Boss Pokemon / Shields", () => { expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - toDmgValue(2 * segmentHp)); // Breaking the last shield gives a +2 boost to ATK, DEF, SP ATK, SP DEF or SPD expect(getTotalStatStageBoosts(enemyPokemon)).toBe(3); - }); it("breaking multiple shields at once requires extra damage", async () => { - game.override - .battleType("double") - .enemyHealthSegments(5); + game.override.battleType("double").enemyHealthSegments(5); - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); // In this test we want to break through 3 shields at once const brokenShields = 3; @@ -140,17 +135,14 @@ describe("Boss Pokemon / Shields", () => { boss2.damageAndUpdate(Math.ceil(requiredDamageBoss2)); expect(boss2.bossSegmentIndex).toBe(0); expect(boss2.hp).toBe(boss2.getMaxHp() - toDmgValue(boss2SegmentHp * 4)); - }); it("the number of stat stage boosts is consistent when several shields are broken at once", async () => { const shieldsToBreak = 4; - game.override - .battleType("double") - .enemyHealthSegments(shieldsToBreak + 1); + game.override.battleType("double").enemyHealthSegments(shieldsToBreak + 1); - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!; const boss1SegmentHp = boss1.getMaxHp() / boss1.bossSegments; @@ -160,7 +152,6 @@ describe("Boss Pokemon / Shields", () => { expect(boss1.bossSegmentIndex).toBe(shieldsToBreak); expect(getTotalStatStageBoosts(boss1)).toBe(0); - let totalStatStages = 0; // Break the shields one by one @@ -193,15 +184,12 @@ describe("Boss Pokemon / Shields", () => { game.move.select(Moves.SPLASH); await game.toNextTurn(); expect(getTotalStatStageBoosts(boss2)).toBe(totalStatStages); - }); it("the boss enduring does not proc an extra stat boost", async () => { - game.override - .enemyHealthSegments(2) - .enemyAbility(Abilities.STURDY); + game.override.enemyHealthSegments(2).enemyAbility(Abilities.STURDY); - await game.classicMode.startBattle([ Species.MEWTWO ]); + await game.classicMode.startBattle([Species.MEWTWO]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon.isBoss()).toBe(true); @@ -215,7 +203,6 @@ describe("Boss Pokemon / Shields", () => { expect(enemyPokemon.bossSegmentIndex).toBe(0); expect(enemyPokemon.hp).toBe(1); expect(getTotalStatStageBoosts(enemyPokemon)).toBe(1); - }); /** @@ -231,4 +218,3 @@ describe("Boss Pokemon / Shields", () => { return boosts; } }); - diff --git a/src/test/daily_mode.test.ts b/test/daily_mode.test.ts similarity index 76% rename from src/test/daily_mode.test.ts rename to test/daily_mode.test.ts index 100cf07f9c0..c530fca61a6 100644 --- a/src/test/daily_mode.test.ts +++ b/test/daily_mode.test.ts @@ -1,11 +1,12 @@ -import { MapModifier } from "#app/modifier/modifier"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; -import { Moves } from "#app/enums/moves"; import { Biome } from "#app/enums/biome"; -import { Mode } from "#app/ui/ui"; +import { Moves } from "#app/enums/moves"; +import { MapModifier } from "#app/modifier/modifier"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Species } from "#enums/species"; +import { Mode } from "#app/ui/ui"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; //const TIMEOUT = 20 * 1000; @@ -21,6 +22,7 @@ describe("Daily Mode", () => { beforeEach(() => { game = new GameManager(phaserGame); + vi.spyOn(pokerogueApi.daily, "getSeed").mockResolvedValue("test-seed"); }); afterEach(() => { @@ -30,7 +32,7 @@ describe("Daily Mode", () => { it("should initialize properly", async () => { await game.dailyMode.runToSummon(); - const party = game.scene.getParty(); + const party = game.scene.getPlayerParty(); expect(party).toHaveLength(3); party.forEach(pkm => { expect(pkm.level).toBe(20); @@ -58,11 +60,10 @@ describe("Shop modifications", async () => { .battleType("single") .startingLevel(100) // Avoid levelling up .disableTrainerWaves() - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .enemyMoveset(Moves.SPLASH); - game.modifiers - .addCheck("EVIOLITE") - .addCheck("MINI_BLACK_HOLE"); + game.modifiers.addCheck("EVIOLITE").addCheck("MINI_BLACK_HOLE"); + vi.spyOn(pokerogueApi.daily, "getSeed").mockResolvedValue("test-seed"); }); afterEach(() => { @@ -71,15 +72,13 @@ describe("Shop modifications", async () => { }); it("should not have Eviolite and Mini Black Hole available in Classic if not unlocked", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.phaseInterceptor.to("BattleEndPhase"); game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { expect(game.scene.ui.getHandler()).toBeInstanceOf(ModifierSelectUiHandler); - game.modifiers - .testCheck("EVIOLITE", false) - .testCheck("MINI_BLACK_HOLE", false); + game.modifiers.testCheck("EVIOLITE", false).testCheck("MINI_BLACK_HOLE", false); }); }); @@ -90,9 +89,7 @@ describe("Shop modifications", async () => { await game.phaseInterceptor.to("BattleEndPhase"); game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { expect(game.scene.ui.getHandler()).toBeInstanceOf(ModifierSelectUiHandler); - game.modifiers - .testCheck("EVIOLITE", true) - .testCheck("MINI_BLACK_HOLE", true); + game.modifiers.testCheck("EVIOLITE", true).testCheck("MINI_BLACK_HOLE", true); }); }); }); diff --git a/src/test/data/splash_messages.test.ts b/test/data/splash_messages.test.ts similarity index 89% rename from src/test/data/splash_messages.test.ts rename to test/data/splash_messages.test.ts index b9ed5b9d365..8ae13366670 100644 --- a/src/test/data/splash_messages.test.ts +++ b/test/data/splash_messages.test.ts @@ -9,7 +9,7 @@ describe("Data - Splash Messages", () => { // make sure to adjust this test if the weight it changed! it("should add contain 10 `battlesWon` splash messages", () => { - const battlesWonMessages = getSplashMessages().filter((message) => message === "splashMessages:battlesWon"); + const battlesWonMessages = getSplashMessages().filter(message => message === "splashMessages:battlesWon"); expect(battlesWonMessages).toHaveLength(10); }); @@ -51,8 +51,8 @@ function testSeason(startDate: Date, endDate: Date, prefix: string) { const afterDate = new Date(endDate); afterDate.setDate(endDate.getDate() + 1); - const dates: Date[] = [ beforeDate, startDate, endDate, afterDate ]; - const [ before, start, end, after ] = dates.map((date) => { + const dates: Date[] = [beforeDate, startDate, endDate, afterDate]; + const [before, start, end, after] = dates.map(date => { vi.setSystemTime(date); console.log("System time set to", date); const count = getSplashMessages().filter(filterFn).length; diff --git a/src/test/data/status-effect.test.ts b/test/data/status_effect.test.ts similarity index 89% rename from src/test/data/status-effect.test.ts rename to test/data/status_effect.test.ts index 1b1a97fc51f..61dafc1c9b8 100644 --- a/src/test/data/status-effect.test.ts +++ b/test/data/status_effect.test.ts @@ -1,6 +1,5 @@ import { Status, - StatusEffect, getStatusEffectActivationText, getStatusEffectDescriptor, getStatusEffectHealText, @@ -11,8 +10,9 @@ 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 { mockI18next } from "#test/utils/testUtils"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; +import { mockI18next } from "#test/testUtils/testUtils"; import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -20,8 +20,8 @@ const pokemonName = "PKM"; const sourceText = "SOURCE"; describe("Status Effect Messages", () => { - beforeAll(() => { - i18next.init(); + beforeAll(async () => { + await i18next.init(); }); describe("NONE", () => { @@ -328,13 +328,13 @@ describe("Status Effects", () => { .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.QUICK_ATTACK ]) + .moveset([Moves.QUICK_ATTACK]) .ability(Abilities.BALL_FETCH) .statusEffect(StatusEffect.PARALYSIS); }); it("causes the pokemon's move to fail when activated", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.QUICK_ATTACK); await game.move.forceStatusActivation(true); @@ -362,7 +362,7 @@ describe("Status Effects", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -372,7 +372,7 @@ describe("Status Effects", () => { }); it("should last the appropriate number of turns", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; player.status = new Status(StatusEffect.SLEEP, 0, 4); @@ -400,4 +400,42 @@ describe("Status Effects", () => { expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); }); }); + + describe("Behavior", () => { + 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]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.NUZZLE) + .enemyLevel(2000); + }); + + it("should not inflict a 0 HP mon with a status", async () => { + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); + + const player = game.scene.getPlayerPokemon()!; + player.hp = 0; + + expect(player.trySetStatus(StatusEffect.BURN)).toBe(false); + expect(player.status?.effect).not.toBe(StatusEffect.BURN); + }); + }); }); diff --git a/src/test/eggs/egg.test.ts b/test/eggs/egg.test.ts similarity index 65% rename from src/test/eggs/egg.test.ts rename to test/eggs/egg.test.ts index 6f57af63e6b..8875300780b 100644 --- a/src/test/eggs/egg.test.ts +++ b/test/eggs/egg.test.ts @@ -1,18 +1,20 @@ -import { Egg, getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg"; +import { speciesEggTiers } from "#app/data/balance/species-egg-tiers"; +import { Egg, getLegendaryGachaSpeciesForTimestamp, getValidLegendaryGachaSpecies } from "#app/data/egg"; +import { allSpecies } from "#app/data/pokemon-species"; import { EggSourceType } from "#app/enums/egg-source-types"; import { EggTier } from "#app/enums/egg-type"; import { VariantTier } from "#app/enums/variant-tier"; import EggData from "#app/system/egg-data"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Egg Generation Tests", () => { let phaserGame: Phaser.Game; let game: GameManager; - const EGG_HATCH_COUNT: integer = 1000; + const EGG_HATCH_COUNT: number = 1000; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -27,35 +29,38 @@ describe("Egg Generation Tests", () => { }); beforeEach(async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); }); - it("should return Arceus for the 10th of June", () => { - const scene = game.scene; + it("should return Kyogre for the 10th of June", () => { 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); + const result = getLegendaryGachaSpeciesForTimestamp(timestamp); expect(result).toBe(expectedSpecies); }); - it("should return Arceus for the 10th of July", () => { - const scene = game.scene; + it("should return Kyogre for the 10th of July", () => { 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); + const result = getLegendaryGachaSpeciesForTimestamp(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++) { - const result = new Egg({ scene, timestamp, sourceType: EggSourceType.GACHA_LEGENDARY, tier: EggTier.LEGENDARY }).generatePlayerPokemon(scene).species.speciesId; + const result = new Egg({ + scene, + timestamp, + sourceType: EggSourceType.GACHA_LEGENDARY, + tier: EggTier.LEGENDARY, + }).generatePlayerPokemon().species.speciesId; if (result === expectedSpecies) { gachaSpeciesCount++; } @@ -64,11 +69,20 @@ describe("Egg Generation Tests", () => { expect(gachaSpeciesCount).toBeGreaterThan(0.4 * EGG_HATCH_COUNT); expect(gachaSpeciesCount).toBeLessThan(0.6 * EGG_HATCH_COUNT); }); + it("should never be allowed to generate Eternatus via the legendary gacha", () => { + const validLegendaryGachaSpecies = getValidLegendaryGachaSpecies(); + expect(validLegendaryGachaSpecies.every(s => speciesEggTiers[s] === EggTier.LEGENDARY)).toBe(true); + expect(validLegendaryGachaSpecies.every(s => allSpecies[s].isObtainable())).toBe(true); + expect(validLegendaryGachaSpecies.includes(Species.ETERNATUS)).toBe(false); + }); it("should hatch an Arceus. Set from species", () => { const scene = game.scene; const expectedSpecies = Species.ARCEUS; - const result = new Egg({ scene, species: expectedSpecies }).generatePlayerPokemon(scene).species.speciesId; + const result = new Egg({ + scene, + species: expectedSpecies, + }).generatePlayerPokemon().species.speciesId; expect(result).toBe(expectedSpecies); }); @@ -116,7 +130,11 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedResult = true; - const result = new Egg({ scene, tier: EggTier.COMMON, id: 204 }).isManaphyEgg(); + const result = new Egg({ + scene, + tier: EggTier.COMMON, + id: 204, + }).isManaphyEgg(); expect(result).toBe(expectedResult); }); @@ -132,7 +150,13 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedResult = true; - const result = new Egg({ scene, isShiny: expectedResult, species: Species.BULBASAUR }).generatePlayerPokemon(scene).isShiny(); + const result = new Egg({ + scene, + isShiny: expectedResult, + species: Species.BULBASAUR, + }) + .generatePlayerPokemon() + .isShiny(); expect(result).toBe(expectedResult); }); @@ -140,7 +164,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedVariantTier = VariantTier.STANDARD; - const result = new Egg({ scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR }).generatePlayerPokemon(scene).variant; + const result = new Egg({ + scene, + isShiny: true, + variantTier: expectedVariantTier, + species: Species.BULBASAUR, + }).generatePlayerPokemon().variant; expect(result).toBe(expectedVariantTier); }); @@ -148,7 +177,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedVariantTier = VariantTier.RARE; - const result = new Egg({ scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR }).generatePlayerPokemon(scene).variant; + const result = new Egg({ + scene, + isShiny: true, + variantTier: expectedVariantTier, + species: Species.BULBASAUR, + }).generatePlayerPokemon().variant; expect(result).toBe(expectedVariantTier); }); @@ -156,7 +190,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedVariantTier = VariantTier.EPIC; - const result = new Egg({ scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR }).generatePlayerPokemon(scene).variant; + const result = new Egg({ + scene, + isShiny: true, + variantTier: expectedVariantTier, + species: Species.BULBASAUR, + }).generatePlayerPokemon().variant; expect(result).toBe(expectedVariantTier); }); @@ -179,7 +218,11 @@ describe("Egg Generation Tests", () => { it("should return a hatched pokemon with a hidden ability", () => { const scene = game.scene; - const playerPokemon = new Egg({ scene, overrideHiddenAbility: true, species: Species.BULBASAUR }).generatePlayerPokemon(scene); + const playerPokemon = new Egg({ + scene, + overrideHiddenAbility: true, + species: Species.BULBASAUR, + }).generatePlayerPokemon(); const expectedAbilityIndex = playerPokemon.species.ability2 ? 2 : 1; const result = playerPokemon.abilityIndex; @@ -200,7 +243,11 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedEggTier = EggTier.COMMON; - const result = new Egg({ scene, tier: EggTier.LEGENDARY, species: Species.BULBASAUR }).tier; + const result = new Egg({ + scene, + tier: EggTier.LEGENDARY, + species: Species.BULBASAUR, + }).tier; expect(result).toBe(expectedEggTier); }); @@ -208,7 +255,11 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const expectedHatchWaves = 10; - const result = new Egg({ scene, tier: EggTier.LEGENDARY, species: Species.BULBASAUR }).hatchWaves; + const result = new Egg({ + scene, + tier: EggTier.LEGENDARY, + species: Species.BULBASAUR, + }).hatchWaves; expect(result).toBe(expectedHatchWaves); }); @@ -237,9 +288,14 @@ describe("Egg Generation Tests", () => { }); it("should increase egg pity", () => { const scene = game.scene; - const startPityValues = [ ...scene.gameData.eggPity ]; + const startPityValues = [...scene.gameData.eggPity]; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.COMMON }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + tier: EggTier.COMMON, + }); expect(scene.gameData.eggPity[EggTier.RARE]).toBe(startPityValues[EggTier.RARE] + 1); expect(scene.gameData.eggPity[EggTier.EPIC]).toBe(startPityValues[EggTier.EPIC] + 1); @@ -247,9 +303,14 @@ describe("Egg Generation Tests", () => { }); it("should increase legendary egg pity by two", () => { const scene = game.scene; - const startPityValues = [ ...scene.gameData.eggPity ]; + const startPityValues = [...scene.gameData.eggPity]; - new Egg({ scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true, tier: EggTier.COMMON }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_LEGENDARY, + pulled: true, + tier: EggTier.COMMON, + }); expect(scene.gameData.eggPity[EggTier.RARE]).toBe(startPityValues[EggTier.RARE] + 1); expect(scene.gameData.eggPity[EggTier.EPIC]).toBe(startPityValues[EggTier.EPIC] + 1); @@ -260,7 +321,12 @@ describe("Egg Generation Tests", () => { const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; for (let i = 0; i < 200; i++) { - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, species: Species.BULBASAUR }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + species: Species.BULBASAUR, + }); } expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount); @@ -269,7 +335,13 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, id: 204, tier: EggTier.COMMON }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + id: 204, + tier: EggTier.COMMON, + }); expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount + 1); }); @@ -277,7 +349,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingRareEggsPulled = scene.gameData.gameStats.rareEggsPulled; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.RARE }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + tier: EggTier.RARE, + }); expect(scene.gameData.gameStats.rareEggsPulled).toBe(startingRareEggsPulled + 1); }); @@ -285,7 +362,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingEpicEggsPulled = scene.gameData.gameStats.epicEggsPulled; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.EPIC }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + tier: EggTier.EPIC, + }); expect(scene.gameData.gameStats.epicEggsPulled).toBe(startingEpicEggsPulled + 1); }); @@ -293,7 +375,12 @@ describe("Egg Generation Tests", () => { const scene = game.scene; const startingLegendaryEggsPulled = scene.gameData.gameStats.legendaryEggsPulled; - new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.LEGENDARY }); + new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + tier: EggTier.LEGENDARY, + }); expect(scene.gameData.gameStats.legendaryEggsPulled).toBe(startingLegendaryEggsPulled + 1); }); @@ -304,8 +391,16 @@ describe("Egg Generation Tests", () => { const expectedTier1 = EggTier.LEGENDARY; const expectedTier2 = EggTier.EPIC; - const result1 = new Egg({ scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true }).tier; - const result2 = new Egg({ scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true }).tier; + const result1 = new Egg({ + scene, + sourceType: EggSourceType.GACHA_LEGENDARY, + pulled: true, + }).tier; + const result2 = new Egg({ + scene, + sourceType: EggSourceType.GACHA_MOVE, + pulled: true, + }).tier; expect(result1).toBe(expectedTier1); expect(result2).toBe(expectedTier2); @@ -313,7 +408,12 @@ describe("Egg Generation Tests", () => { it("should generate an epic shiny from pokemon with a different form", () => { const scene = game.scene; - const egg = new Egg({ scene, isShiny: true, variantTier: VariantTier.EPIC, species: Species.MIRAIDON }); + const egg = new Egg({ + scene, + isShiny: true, + variantTier: VariantTier.EPIC, + species: Species.MIRAIDON, + }); expect(egg.variantTier).toBe(VariantTier.EPIC); }); @@ -323,8 +423,12 @@ describe("Egg Generation Tests", () => { scene.setSeed("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); scene.resetSeed(); - const firstEgg = new Egg({ scene, sourceType: EggSourceType.GACHA_SHINY, tier: EggTier.COMMON }); - const firstHatch = firstEgg.generatePlayerPokemon(scene); + const firstEgg = new Egg({ + scene, + sourceType: EggSourceType.GACHA_SHINY, + tier: EggTier.COMMON, + }); + const firstHatch = firstEgg.generatePlayerPokemon(); let diffEggMove = false; let diffSpecies = false; let diffShiny = false; @@ -334,12 +438,16 @@ describe("Egg Generation Tests", () => { scene.setSeed("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); scene.resetSeed(); // Make sure that eggs are unpredictable even if using same seed - const newEgg = new Egg({ scene, sourceType: EggSourceType.GACHA_SHINY, tier: EggTier.COMMON }); - const newHatch = newEgg.generatePlayerPokemon(scene); - diffEggMove = diffEggMove || (newEgg.eggMoveIndex !== firstEgg.eggMoveIndex); - diffSpecies = diffSpecies || (newHatch.species.speciesId !== firstHatch.species.speciesId); - diffShiny = diffShiny || (newHatch.shiny !== firstHatch.shiny); - diffAbility = diffAbility || (newHatch.abilityIndex !== firstHatch.abilityIndex); + const newEgg = new Egg({ + scene, + sourceType: EggSourceType.GACHA_SHINY, + tier: EggTier.COMMON, + }); + const newHatch = newEgg.generatePlayerPokemon(); + diffEggMove = diffEggMove || newEgg.eggMoveIndex !== firstEgg.eggMoveIndex; + diffSpecies = diffSpecies || newHatch.species.speciesId !== firstHatch.species.speciesId; + diffShiny = diffShiny || newHatch.shiny !== firstHatch.shiny; + diffAbility = diffAbility || newHatch.abilityIndex !== firstHatch.abilityIndex; } expect(diffEggMove).toBe(true); @@ -354,7 +462,7 @@ describe("Egg Generation Tests", () => { scene.resetSeed(); const firstEgg = new Egg({ scene, species: Species.BULBASAUR }); - const firstHatch = firstEgg.generatePlayerPokemon(scene); + const firstHatch = firstEgg.generatePlayerPokemon(); let diffEggMove = false; let diffSpecies = false; let diffShiny = false; @@ -364,11 +472,11 @@ describe("Egg Generation Tests", () => { scene.resetSeed(); // Make sure that eggs are unpredictable even if using same seed const newEgg = new Egg({ scene, species: Species.BULBASAUR }); - const newHatch = newEgg.generatePlayerPokemon(scene); - diffEggMove = diffEggMove || (newEgg.eggMoveIndex !== firstEgg.eggMoveIndex); - diffSpecies = diffSpecies || (newHatch.species.speciesId !== firstHatch.species.speciesId); - diffShiny = diffShiny || (newHatch.shiny !== firstHatch.shiny); - diffAbility = diffAbility || (newHatch.abilityIndex !== firstHatch.abilityIndex); + const newHatch = newEgg.generatePlayerPokemon(); + diffEggMove = diffEggMove || newEgg.eggMoveIndex !== firstEgg.eggMoveIndex; + diffSpecies = diffSpecies || newHatch.species.speciesId !== firstHatch.species.speciesId; + diffShiny = diffShiny || newHatch.shiny !== firstHatch.shiny; + diffAbility = diffAbility || newHatch.abilityIndex !== firstHatch.abilityIndex; } expect(diffEggMove).toBe(true); diff --git a/src/test/eggs/manaphy-egg.test.ts b/test/eggs/manaphy-egg.test.ts similarity index 73% rename from src/test/eggs/manaphy-egg.test.ts rename to test/eggs/manaphy-egg.test.ts index 3b2c40ae84a..1e7f67a7bb5 100644 --- a/src/test/eggs/manaphy-egg.test.ts +++ b/test/eggs/manaphy-egg.test.ts @@ -2,15 +2,15 @@ import { Egg } from "#app/data/egg"; import { EggSourceType } from "#app/enums/egg-source-types"; import { EggTier } from "#app/enums/egg-type"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Manaphy Eggs", () => { let phaserGame: Phaser.Game; let game: GameManager; - const EGG_HATCH_COUNT: integer = 48; - let rngSweepProgress: number = 0; + const EGG_HATCH_COUNT: number = 48; + let rngSweepProgress = 0; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -25,7 +25,7 @@ describe("Manaphy Eggs", () => { }); beforeEach(async () => { - await game.importData("src/test/utils/saves/everything.prsv"); + await game.importData("./test/testUtils/saves/everything.prsv"); /** * In our tests, we will perform an "RNG sweep" by letting rngSweepProgress @@ -47,8 +47,13 @@ describe("Manaphy Eggs", () => { for (let i = 0; i < EGG_HATCH_COUNT; i++) { rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT); - const newEgg = new Egg({ scene, tier: EggTier.COMMON, sourceType: EggSourceType.GACHA_SHINY, id: 204 }); - const newHatch = newEgg.generatePlayerPokemon(scene); + const newEgg = new Egg({ + scene, + tier: EggTier.COMMON, + sourceType: EggSourceType.GACHA_SHINY, + id: 204, + }); + const newHatch = newEgg.generatePlayerPokemon(); if (newHatch.species.speciesId === Species.MANAPHY) { manaphyCount++; } else if (newHatch.species.speciesId === Species.PHIONE) { @@ -60,8 +65,8 @@ describe("Manaphy Eggs", () => { } expect(manaphyCount + phioneCount).toBe(EGG_HATCH_COUNT); - expect(manaphyCount).toBe(1 / 8 * EGG_HATCH_COUNT); - expect(rareEggMoveCount).toBe(1 / 12 * EGG_HATCH_COUNT); + expect(manaphyCount).toBe((1 / 8) * EGG_HATCH_COUNT); + expect(rareEggMoveCount).toBe((1 / 12) * EGG_HATCH_COUNT); }); it("should have correct Manaphy rates and Rare Egg Move rates, from Phione species eggs", () => { @@ -73,8 +78,12 @@ describe("Manaphy Eggs", () => { for (let i = 0; i < EGG_HATCH_COUNT; i++) { rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT); - const newEgg = new Egg({ scene, species: Species.PHIONE, sourceType: EggSourceType.SAME_SPECIES_EGG }); - const newHatch = newEgg.generatePlayerPokemon(scene); + const newEgg = new Egg({ + scene, + species: Species.PHIONE, + sourceType: EggSourceType.SAME_SPECIES_EGG, + }); + const newHatch = newEgg.generatePlayerPokemon(); if (newHatch.species.speciesId === Species.MANAPHY) { manaphyCount++; } else if (newHatch.species.speciesId === Species.PHIONE) { @@ -86,8 +95,8 @@ describe("Manaphy Eggs", () => { } expect(manaphyCount + phioneCount).toBe(EGG_HATCH_COUNT); - expect(manaphyCount).toBe(1 / 8 * EGG_HATCH_COUNT); - expect(rareEggMoveCount).toBe(1 / 6 * EGG_HATCH_COUNT); + expect(manaphyCount).toBe((1 / 8) * EGG_HATCH_COUNT); + expect(rareEggMoveCount).toBe((1 / 6) * EGG_HATCH_COUNT); }); it("should have correct Manaphy rates and Rare Egg Move rates, from Manaphy species eggs", () => { @@ -99,8 +108,12 @@ describe("Manaphy Eggs", () => { for (let i = 0; i < EGG_HATCH_COUNT; i++) { rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT); - const newEgg = new Egg({ scene, species: Species.MANAPHY, sourceType: EggSourceType.SAME_SPECIES_EGG }); - const newHatch = newEgg.generatePlayerPokemon(scene); + const newEgg = new Egg({ + scene, + species: Species.MANAPHY, + sourceType: EggSourceType.SAME_SPECIES_EGG, + }); + const newHatch = newEgg.generatePlayerPokemon(); if (newHatch.species.speciesId === Species.MANAPHY) { manaphyCount++; } else if (newHatch.species.speciesId === Species.PHIONE) { @@ -113,6 +126,6 @@ describe("Manaphy Eggs", () => { expect(phioneCount).toBe(0); expect(manaphyCount).toBe(EGG_HATCH_COUNT); - expect(rareEggMoveCount).toBe(1 / 6 * EGG_HATCH_COUNT); + expect(rareEggMoveCount).toBe((1 / 6) * EGG_HATCH_COUNT); }); }); diff --git a/src/test/endless_boss.test.ts b/test/endless_boss.test.ts similarity index 84% rename from src/test/endless_boss.test.ts rename to test/endless_boss.test.ts index c9f3afc3936..4be1e379215 100644 --- a/src/test/endless_boss.test.ts +++ b/test/endless_boss.test.ts @@ -2,11 +2,11 @@ import { Biome } from "#app/enums/biome"; import { Species } from "#app/enums/species"; import { GameModes } from "#app/game-mode"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; const EndlessBossWave = { Minor: 250, - Major: 1000 + Major: 1000, }; describe("Endless Boss", () => { @@ -21,9 +21,7 @@ describe("Endless Boss", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .startingBiome(Biome.END) - .disableCrits(); + game.override.startingBiome(Biome.END).disableCrits(); }); afterEach(() => { @@ -32,7 +30,7 @@ describe("Endless Boss", () => { it(`should spawn a minor boss every ${EndlessBossWave.Minor} waves in END biome in Endless`, async () => { game.override.startingWave(EndlessBossWave.Minor); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS); expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -44,7 +42,7 @@ describe("Endless Boss", () => { it(`should spawn a major boss every ${EndlessBossWave.Major} waves in END biome in Endless`, async () => { game.override.startingWave(EndlessBossWave.Major); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS); expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -56,7 +54,7 @@ describe("Endless Boss", () => { it(`should spawn a minor boss every ${EndlessBossWave.Minor} waves in END biome in Spliced Endless`, async () => { game.override.startingWave(EndlessBossWave.Minor); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.SPLICED_ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.SPLICED_ENDLESS); expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -68,7 +66,7 @@ describe("Endless Boss", () => { it(`should spawn a major boss every ${EndlessBossWave.Major} waves in END biome in Spliced Endless`, async () => { game.override.startingWave(EndlessBossWave.Major); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.SPLICED_ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.SPLICED_ENDLESS); expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -80,7 +78,7 @@ describe("Endless Boss", () => { it(`should NOT spawn major or minor boss outside wave ${EndlessBossWave.Minor}s in END biome`, async () => { game.override.startingWave(EndlessBossWave.Minor - 1); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.ENDLESS); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS); expect(game.scene.currentBattle.waveIndex).not.toBe(EndlessBossWave.Minor); expect(game.scene.getEnemyPokemon()!.species.speciesId).not.toBe(Species.ETERNATUS); diff --git a/test/enemy_command.test.ts b/test/enemy_command.test.ts new file mode 100644 index 00000000000..6d5cc2698a3 --- /dev/null +++ b/test/enemy_command.test.ts @@ -0,0 +1,102 @@ +import type BattleScene from "#app/battle-scene"; +import { allMoves } from "#app/data/moves/move"; +import { MoveCategory } from "#enums/MoveCategory"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import type { EnemyPokemon } from "#app/field/pokemon"; +import { AiType } from "#app/field/pokemon"; +import { randSeedInt } from "#app/utils"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +let globalScene: BattleScene; +const NUM_TRIALS = 300; + +type MoveChoiceSet = { [key: number]: number }; + +function getEnemyMoveChoices(pokemon: EnemyPokemon, moveChoices: MoveChoiceSet): void { + // Use an unseeded random number generator in place of the mocked-out randBattleSeedInt + vi.spyOn(globalScene, "randBattleSeedInt").mockImplementation((range, min?) => { + return randSeedInt(range, min); + }); + for (let i = 0; i < NUM_TRIALS; i++) { + const queuedMove = pokemon.getNextMove(); + moveChoices[queuedMove.move]++; + } + + for (const [moveId, count] of Object.entries(moveChoices)) { + console.log(`Move: ${allMoves[moveId].name} Count: ${count} (${(count / NUM_TRIALS) * 100}%)`); + } +} + +describe("Enemy Commands - Move Selection", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + globalScene = game.scene; + + game.override.ability(Abilities.BALL_FETCH).enemyAbility(Abilities.BALL_FETCH); + }); + + it("should never use Status moves if an attack can KO", async () => { + game.override + .enemySpecies(Species.ETERNATUS) + .enemyMoveset([Moves.ETERNABEAM, Moves.SLUDGE_BOMB, Moves.DRAGON_DANCE, Moves.COSMIC_POWER]) + .startingLevel(1) + .enemyLevel(100); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.aiType = AiType.SMART_RANDOM; + + const moveChoices: MoveChoiceSet = {}; + const enemyMoveset = enemyPokemon.getMoveset(); + enemyMoveset.forEach(mv => (moveChoices[mv!.moveId] = 0)); + getEnemyMoveChoices(enemyPokemon, moveChoices); + + enemyMoveset.forEach(mv => { + if (mv?.getMove().category === MoveCategory.STATUS) { + expect(moveChoices[mv.moveId]).toBe(0); + } + }); + }); + + it("should not select Last Resort if it would fail, even if the move KOs otherwise", async () => { + game.override + .enemySpecies(Species.KANGASKHAN) + .enemyMoveset([Moves.LAST_RESORT, Moves.GIGA_IMPACT, Moves.SPLASH, Moves.SWORDS_DANCE]) + .startingLevel(1) + .enemyLevel(100); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.aiType = AiType.SMART_RANDOM; + + const moveChoices: MoveChoiceSet = {}; + const enemyMoveset = enemyPokemon.getMoveset(); + enemyMoveset.forEach(mv => (moveChoices[mv!.moveId] = 0)); + getEnemyMoveChoices(enemyPokemon, moveChoices); + + enemyMoveset.forEach(mv => { + if (mv?.getMove().category === MoveCategory.STATUS || mv?.moveId === Moves.LAST_RESORT) { + expect(moveChoices[mv.moveId]).toBe(0); + } + }); + }); +}); diff --git a/src/test/escape-calculations.test.ts b/test/escape-calculations.test.ts similarity index 86% rename from src/test/escape-calculations.test.ts rename to test/escape-calculations.test.ts index cc18fd78066..0cbf11dd230 100644 --- a/src/test/escape-calculations.test.ts +++ b/test/escape-calculations.test.ts @@ -1,10 +1,10 @@ import { AttemptRunPhase } from "#app/phases/attempt-run-phase"; -import { CommandPhase } from "#app/phases/command-phase"; +import type { CommandPhase } from "#app/phases/command-phase"; import { Command } from "#app/ui/command-ui-handler"; import * as Utils from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -32,13 +32,13 @@ describe("Escape chance calculations", () => { }); it("single non-boss opponent", async () => { - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerField(); const enemyField = game.scene.getEnemyField(); const enemySpeed = 100; // set enemyPokemon's speed to 100 - vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemySpeed ]); + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemySpeed]); const commandPhase = game.scene.getCurrentPhase() as CommandPhase; commandPhase.handleCommand(Command.RUN, 0); @@ -48,7 +48,11 @@ describe("Escape chance calculations", () => { const escapePercentage = new Utils.NumberHolder(0); // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping - const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + const escapeChances: { + pokemonSpeedRatio: number; + escapeAttempts: number; + expectedEscapeChance: number; + }[] = [ { pokemonSpeedRatio: 0.01, escapeAttempts: 0, expectedEscapeChance: 5 }, { pokemonSpeedRatio: 0.1, escapeAttempts: 0, expectedEscapeChance: 7 }, { pokemonSpeedRatio: 0.25, escapeAttempts: 0, expectedEscapeChance: 11 }, @@ -79,7 +83,14 @@ describe("Escape chance calculations", () => { // sets the number of escape attempts to the required amount game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; // set playerPokemon's speed to a multiple of the enemySpeed - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * enemySpeed ]); + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + escapeChances[i].pokemonSpeedRatio * enemySpeed, + ]); phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); } @@ -87,7 +98,7 @@ describe("Escape chance calculations", () => { it("double non-boss opponent", async () => { game.override.battleType("double"); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.ABOMASNOW ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.ABOMASNOW]); const playerPokemon = game.scene.getPlayerField(); const enemyField = game.scene.getEnemyField(); @@ -98,9 +109,9 @@ describe("Escape chance calculations", () => { // this is used to find the ratio of the player's first pokemon const playerASpeedPercentage = 0.4; // set enemyAPokemon's speed to 70 - vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemyASpeed ]); + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyASpeed]); // set enemyBPokemon's speed to 30 - vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemyBSpeed ]); + vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyBSpeed]); const commandPhase = game.scene.getCurrentPhase() as CommandPhase; commandPhase.handleCommand(Command.RUN, 0); @@ -110,7 +121,11 @@ describe("Escape chance calculations", () => { const escapePercentage = new Utils.NumberHolder(0); // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping - const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + const escapeChances: { + pokemonSpeedRatio: number; + escapeAttempts: number; + expectedEscapeChance: number; + }[] = [ { pokemonSpeedRatio: 0.3, escapeAttempts: 0, expectedEscapeChance: 12 }, { pokemonSpeedRatio: 0.7, escapeAttempts: 0, expectedEscapeChance: 21 }, { pokemonSpeedRatio: 1.5, escapeAttempts: 0, expectedEscapeChance: 39 }, @@ -134,33 +149,48 @@ describe("Escape chance calculations", () => { { pokemonSpeedRatio: 2.4, escapeAttempts: 9, expectedEscapeChance: 95 }, { pokemonSpeedRatio: 1.8, escapeAttempts: 7, expectedEscapeChance: 95 }, { pokemonSpeedRatio: 2, escapeAttempts: 10, expectedEscapeChance: 95 }, - ]; for (let i = 0; i < escapeChances.length; i++) { // sets the number of escape attempts to the required amount game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; // set the first playerPokemon's speed to a multiple of the enemySpeed - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage) ]); + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage), + ]); // set the second playerPokemon's speed to the remaining value of speed - vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5] ]); + vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5], + ]); phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); // checks to make sure the escape values are the same expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); // checks to make sure the sum of the player's speed for all pokemon is equal to the appropriate ratio of the total enemy speed - expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed); + expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe( + escapeChances[i].pokemonSpeedRatio * totalEnemySpeed, + ); } }, 20000); it("single boss opponent", async () => { game.override.startingWave(10); - await game.classicMode.startBattle([ Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerField()!; const enemyField = game.scene.getEnemyField()!; const enemySpeed = 100; // set enemyPokemon's speed to 100 - vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemySpeed ]); + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemySpeed]); const commandPhase = game.scene.getCurrentPhase() as CommandPhase; commandPhase.handleCommand(Command.RUN, 0); @@ -170,7 +200,11 @@ describe("Escape chance calculations", () => { const escapePercentage = new Utils.NumberHolder(0); // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping - const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + const escapeChances: { + pokemonSpeedRatio: number; + escapeAttempts: number; + expectedEscapeChance: number; + }[] = [ { pokemonSpeedRatio: 0.01, escapeAttempts: 0, expectedEscapeChance: 5 }, { pokemonSpeedRatio: 0.1, escapeAttempts: 0, expectedEscapeChance: 5 }, { pokemonSpeedRatio: 0.25, escapeAttempts: 0, expectedEscapeChance: 6 }, @@ -208,14 +242,20 @@ describe("Escape chance calculations", () => { { pokemonSpeedRatio: 6, escapeAttempts: 0, expectedEscapeChance: 25 }, { pokemonSpeedRatio: 5.9, escapeAttempts: 2, expectedEscapeChance: 25 }, { pokemonSpeedRatio: 6.1, escapeAttempts: 3, expectedEscapeChance: 25 }, - ]; for (let i = 0; i < escapeChances.length; i++) { // sets the number of escape attempts to the required amount game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; // set playerPokemon's speed to a multiple of the enemySpeed - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * enemySpeed ]); + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + escapeChances[i].pokemonSpeedRatio * enemySpeed, + ]); phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); } @@ -224,7 +264,7 @@ describe("Escape chance calculations", () => { it("double boss opponent", async () => { game.override.battleType("double"); game.override.startingWave(10); - await game.classicMode.startBattle([ Species.BULBASAUR, Species.ABOMASNOW ]); + await game.classicMode.startBattle([Species.BULBASAUR, Species.ABOMASNOW]); const playerPokemon = game.scene.getPlayerField(); const enemyField = game.scene.getEnemyField(); @@ -235,9 +275,9 @@ describe("Escape chance calculations", () => { // this is used to find the ratio of the player's first pokemon const playerASpeedPercentage = 0.8; // set enemyAPokemon's speed to 70 - vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemyASpeed ]); + vi.spyOn(enemyField[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyASpeed]); // set enemyBPokemon's speed to 30 - vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, enemyBSpeed ]); + vi.spyOn(enemyField[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, enemyBSpeed]); const commandPhase = game.scene.getCurrentPhase() as CommandPhase; commandPhase.handleCommand(Command.RUN, 0); @@ -247,7 +287,11 @@ describe("Escape chance calculations", () => { const escapePercentage = new Utils.NumberHolder(0); // this sets up an object for multiple attempts. The pokemonSpeedRatio is your speed divided by the enemy speed, the escapeAttempts are the number of escape attempts and the expectedEscapeChance is the chance it should be escaping - const escapeChances: { pokemonSpeedRatio: number, escapeAttempts: number, expectedEscapeChance: number }[] = [ + const escapeChances: { + pokemonSpeedRatio: number; + escapeAttempts: number; + expectedEscapeChance: number; + }[] = [ { pokemonSpeedRatio: 0.3, escapeAttempts: 0, expectedEscapeChance: 6 }, { pokemonSpeedRatio: 0.7, escapeAttempts: 0, expectedEscapeChance: 7 }, { pokemonSpeedRatio: 1.5, escapeAttempts: 0, expectedEscapeChance: 10 }, @@ -283,21 +327,36 @@ describe("Escape chance calculations", () => { { pokemonSpeedRatio: 6.5, escapeAttempts: 1, expectedEscapeChance: 25 }, { pokemonSpeedRatio: 12, escapeAttempts: 4, expectedEscapeChance: 25 }, { pokemonSpeedRatio: 5.2, escapeAttempts: 2, expectedEscapeChance: 25 }, - ]; for (let i = 0; i < escapeChances.length; i++) { // sets the number of escape attempts to the required amount game.scene.currentBattle.escapeAttempts = escapeChances[i].escapeAttempts; // set the first playerPokemon's speed to a multiple of the enemySpeed - vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage) ]); + vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + Math.floor(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed * playerASpeedPercentage), + ]); // set the second playerPokemon's speed to the remaining value of speed - vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ 20, 20, 20, 20, 20, escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5] ]); + vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([ + 20, + 20, + 20, + 20, + 20, + escapeChances[i].pokemonSpeedRatio * totalEnemySpeed - playerPokemon[0].stats[5], + ]); phase.attemptRunAway(playerPokemon, enemyField, escapePercentage); // checks to make sure the escape values are the same expect(escapePercentage.value).toBe(escapeChances[i].expectedEscapeChance); // checks to make sure the sum of the player's speed for all pokemon is equal to the appropriate ratio of the total enemy speed - expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe(escapeChances[i].pokemonSpeedRatio * totalEnemySpeed); + expect(playerPokemon[0].stats[5] + playerPokemon[1].stats[5]).toBe( + escapeChances[i].pokemonSpeedRatio * totalEnemySpeed, + ); } }, 20000); }); diff --git a/src/test/evolution.test.ts b/test/evolution.test.ts similarity index 72% rename from src/test/evolution.test.ts rename to test/evolution.test.ts index b94d45d6537..dd6795bf161 100644 --- a/src/test/evolution.test.ts +++ b/test/evolution.test.ts @@ -1,9 +1,13 @@ -import { pokemonEvolutions, SpeciesFormEvolution, SpeciesWildEvolutionDelay } from "#app/data/balance/pokemon-evolutions"; +import { + pokemonEvolutions, + SpeciesFormEvolution, + SpeciesWildEvolutionDelay, +} from "#app/data/balance/pokemon-evolutions"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Utils from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -33,57 +37,60 @@ describe("Evolution", () => { }); it("should keep hidden ability after evolving", async () => { - await game.classicMode.runToSummon([ Species.EEVEE, Species.TRAPINCH ]); + await game.classicMode.runToSummon([Species.EEVEE, Species.TRAPINCH]); - const eevee = game.scene.getParty()[0]; - const trapinch = game.scene.getParty()[1]; + const eevee = game.scene.getPlayerParty()[0]; + const trapinch = game.scene.getPlayerParty()[1]; eevee.abilityIndex = 2; trapinch.abilityIndex = 2; - eevee.evolve(pokemonEvolutions[Species.EEVEE][6], eevee.getSpeciesForm()); + await eevee.evolve(pokemonEvolutions[Species.EEVEE][6], eevee.getSpeciesForm()); expect(eevee.abilityIndex).toBe(2); - trapinch.evolve(pokemonEvolutions[Species.TRAPINCH][0], trapinch.getSpeciesForm()); + await trapinch.evolve(pokemonEvolutions[Species.TRAPINCH][0], trapinch.getSpeciesForm()); expect(trapinch.abilityIndex).toBe(1); }); it("should keep same ability slot after evolving", async () => { - await game.classicMode.runToSummon([ Species.BULBASAUR, Species.CHARMANDER ]); + await game.classicMode.runToSummon([Species.BULBASAUR, Species.CHARMANDER]); - const bulbasaur = game.scene.getParty()[0]; - const charmander = game.scene.getParty()[1]; + const bulbasaur = game.scene.getPlayerParty()[0]; + const charmander = game.scene.getPlayerParty()[1]; bulbasaur.abilityIndex = 0; charmander.abilityIndex = 1; - bulbasaur.evolve(pokemonEvolutions[Species.BULBASAUR][0], bulbasaur.getSpeciesForm()); + await bulbasaur.evolve(pokemonEvolutions[Species.BULBASAUR][0], bulbasaur.getSpeciesForm()); expect(bulbasaur.abilityIndex).toBe(0); - charmander.evolve(pokemonEvolutions[Species.CHARMANDER][0], charmander.getSpeciesForm()); + await charmander.evolve(pokemonEvolutions[Species.CHARMANDER][0], charmander.getSpeciesForm()); expect(charmander.abilityIndex).toBe(1); }); it("should handle illegal abilityIndex values", async () => { - await game.classicMode.runToSummon([ Species.SQUIRTLE ]); + await game.classicMode.runToSummon([Species.SQUIRTLE]); const squirtle = game.scene.getPlayerPokemon()!; squirtle.abilityIndex = 5; - squirtle.evolve(pokemonEvolutions[Species.SQUIRTLE][0], squirtle.getSpeciesForm()); + await squirtle.evolve(pokemonEvolutions[Species.SQUIRTLE][0], squirtle.getSpeciesForm()); expect(squirtle.abilityIndex).toBe(0); }); it("should handle nincada's unique evolution", async () => { - await game.classicMode.runToSummon([ Species.NINCADA ]); + await game.classicMode.runToSummon([Species.NINCADA]); const nincada = game.scene.getPlayerPokemon()!; nincada.abilityIndex = 2; nincada.metBiome = -1; + nincada.gender = 1; - nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm()); - const ninjask = game.scene.getParty()[0]; - const shedinja = game.scene.getParty()[1]; + await nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm()); + const ninjask = game.scene.getPlayerParty()[0]; + const shedinja = game.scene.getPlayerParty()[1]; expect(ninjask.abilityIndex).toBe(2); expect(shedinja.abilityIndex).toBe(1); + expect(ninjask.gender).toBe(1); + expect(shedinja.gender).toBe(-1); // Regression test for https://github.com/pagefaultgames/pokerogue/issues/3842 expect(shedinja.metBiome).toBe(-1); }); @@ -95,14 +102,15 @@ describe("Evolution", () => { }); it("should increase both HP and max HP when evolving", async () => { - game.override.moveset([ Moves.SURF ]) + game.override + .moveset([Moves.SURF]) .enemySpecies(Species.GOLEM) .enemyMoveset(Moves.SPLASH) .startingWave(21) .startingLevel(16) .enemyLevel(50); - await game.startBattle([ Species.TOTODILE ]); + await game.startBattle([Species.TOTODILE]); const totodile = game.scene.getPlayerPokemon()!; const hpBefore = totodile.hp; @@ -122,14 +130,15 @@ describe("Evolution", () => { }); it("should not fully heal HP when evolving", async () => { - game.override.moveset([ Moves.SURF ]) + game.override + .moveset([Moves.SURF]) .enemySpecies(Species.GOLEM) .enemyMoveset(Moves.SPLASH) .startingWave(21) .startingLevel(13) .enemyLevel(30); - await game.startBattle([ Species.CYNDAQUIL ]); + await game.startBattle([Species.CYNDAQUIL]); const cyndaquil = game.scene.getPlayerPokemon()!; cyndaquil.hp = Math.floor(cyndaquil.getMaxHp() / 2); @@ -162,7 +171,7 @@ describe("Evolution", () => { * If the value is 0, it's a 3 family maushold, whereas if the value is * 1, 2 or 3, it's a 4 family maushold */ - await game.startBattle([ Species.TANDEMAUS ]); // starts us off with a tandemaus + await game.startBattle([Species.TANDEMAUS]); // starts us off with a tandemaus const playerPokemon = game.scene.getPlayerPokemon()!; playerPokemon.level = 25; // tandemaus evolves at level 25 vi.spyOn(Utils, "randSeedInt").mockReturnValue(0); // setting the random generator to be 0 to force a three family maushold @@ -171,7 +180,7 @@ describe("Evolution", () => { for (let f = 1; f < 4; f++) { vi.spyOn(Utils, "randSeedInt").mockReturnValue(f); // setting the random generator to 1, 2 and 3 to force 4 family mausholds const fourForm = playerPokemon.getEvolution()!; - expect(fourForm.evoFormKey).toBe(null); // meanwhile, according to the pokemon-forms, the evoFormKey for a 4 family maushold is null + expect(fourForm.evoFormKey).toBe("four"); // meanwhile, according to the pokemon-forms, the evoFormKey for a 4 family maushold is "four" } }); }); diff --git a/test/field/pokemon.test.ts b/test/field/pokemon.test.ts new file mode 100644 index 00000000000..85128a31f7f --- /dev/null +++ b/test/field/pokemon.test.ts @@ -0,0 +1,212 @@ +import { Species } from "#app/enums/species"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; +import { PokeballType } from "#enums/pokeball"; +import type BattleScene from "#app/battle-scene"; +import { Moves } from "#app/enums/moves"; +import { PokemonType } from "#enums/pokemon-type"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; + +describe("Spec - Pokemon", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + }); + + it("should not crash when trying to set status of undefined", async () => { + await game.classicMode.runToSummon([Species.ABRA]); + + const pkm = game.scene.getPlayerPokemon()!; + expect(pkm).toBeDefined(); + + expect(pkm.trySetStatus(undefined)).toBe(true); + }); + + describe("Add To Party", () => { + let scene: BattleScene; + + beforeEach(async () => { + game.override.enemySpecies(Species.ZUBAT); + await game.classicMode.runToSummon([Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA]); // 5 Abra, only 1 slot left + scene = game.scene; + }); + + it("should append a new pokemon by default", async () => { + const zubat = scene.getEnemyPokemon()!; + zubat.addToParty(PokeballType.LUXURY_BALL); + + const party = scene.getPlayerParty(); + expect(party).toHaveLength(6); + party.forEach((pkm, index) => { + expect(pkm.species.speciesId).toBe(index === 5 ? Species.ZUBAT : Species.ABRA); + }); + }); + + it("should put a new pokemon into the passed slotIndex", async () => { + const slotIndex = 1; + const zubat = scene.getEnemyPokemon()!; + zubat.addToParty(PokeballType.LUXURY_BALL, slotIndex); + + const party = scene.getPlayerParty(); + expect(party).toHaveLength(6); + party.forEach((pkm, index) => { + expect(pkm.species.speciesId).toBe(index === slotIndex ? Species.ZUBAT : Species.ABRA); + }); + }); + }); + + it("should not share tms between different forms", async () => { + game.override.starterForms({ [Species.ROTOM]: 4 }); + + await game.classicMode.startBattle([Species.ROTOM]); + + const fanRotom = game.scene.getPlayerPokemon()!; + + expect(fanRotom.compatibleTms).not.toContain(Moves.BLIZZARD); + expect(fanRotom.compatibleTms).toContain(Moves.AIR_SLASH); + }); + + describe("Get correct fusion type", () => { + let scene: BattleScene; + + beforeEach(async () => { + game.override.enemySpecies(Species.ZUBAT); + game.override.starterSpecies(Species.ABRA); + game.override.enableStarterFusion(); + scene = game.scene; + }); + + it("Fusing two mons with a single type", async () => { + game.override.starterFusionSpecies(Species.CHARMANDER); + await game.classicMode.startBattle(); + const pokemon = scene.getPlayerParty()[0]; + + let types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); + + pokemon.customPokemonData.types = [PokemonType.UNKNOWN, PokemonType.NORMAL]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); + + pokemon.customPokemonData.types = [PokemonType.NORMAL, PokemonType.UNKNOWN]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.NORMAL); + expect(types[1]).toBe(PokemonType.FIRE); + + if (!pokemon.fusionCustomPokemonData) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(); + } + pokemon.customPokemonData.types = []; + + pokemon.fusionCustomPokemonData.types = [PokemonType.UNKNOWN, PokemonType.NORMAL]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.NORMAL); + + pokemon.fusionCustomPokemonData.types = [PokemonType.NORMAL, PokemonType.UNKNOWN]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.NORMAL); + + pokemon.customPokemonData.types = [PokemonType.NORMAL, PokemonType.UNKNOWN]; + pokemon.fusionCustomPokemonData.types = [PokemonType.UNKNOWN, PokemonType.NORMAL]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.NORMAL); + expect(types[1]).toBe(PokemonType.FIRE); + }); + + it("Fusing two mons with same single type", async () => { + game.override.starterFusionSpecies(Species.DROWZEE); + await game.classicMode.startBattle(); + const pokemon = scene.getPlayerParty()[0]; + + const types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types.length).toBe(1); + }); + + it("Fusing mons with one and two types", async () => { + game.override.starterSpecies(Species.CHARMANDER); + game.override.starterFusionSpecies(Species.HOUNDOUR); + await game.classicMode.startBattle(); + const pokemon = scene.getPlayerParty()[0]; + + const types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.FIRE); + expect(types[1]).toBe(PokemonType.DARK); + }); + + it("Fusing mons with two and one types", async () => { + game.override.starterSpecies(Species.NUMEL); + game.override.starterFusionSpecies(Species.CHARMANDER); + await game.classicMode.startBattle(); + const pokemon = scene.getPlayerParty()[0]; + + const types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.FIRE); + expect(types[1]).toBe(PokemonType.GROUND); + }); + + it("Fusing two mons with two types", async () => { + game.override.starterSpecies(Species.NATU); + game.override.starterFusionSpecies(Species.HOUNDOUR); + await game.classicMode.startBattle(); + const pokemon = scene.getPlayerParty()[0]; + + let types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); + + // Natu Psychic/Grass + pokemon.customPokemonData.types = [PokemonType.UNKNOWN, PokemonType.GRASS]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); + + // Natu Grass/Flying + pokemon.customPokemonData.types = [PokemonType.GRASS, PokemonType.UNKNOWN]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.GRASS); + expect(types[1]).toBe(PokemonType.FIRE); + + if (!pokemon.fusionCustomPokemonData) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(); + } + pokemon.customPokemonData.types = []; + + // Houndour Dark/Grass + pokemon.fusionCustomPokemonData.types = [PokemonType.UNKNOWN, PokemonType.GRASS]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.GRASS); + + // Houndour Grass/Fire + pokemon.fusionCustomPokemonData.types = [PokemonType.GRASS, PokemonType.UNKNOWN]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.PSYCHIC); + expect(types[1]).toBe(PokemonType.FIRE); + + // Natu Grass/Flying + // Houndour Dark/Grass + pokemon.customPokemonData.types = [PokemonType.GRASS, PokemonType.UNKNOWN]; + pokemon.fusionCustomPokemonData.types = [PokemonType.UNKNOWN, PokemonType.GRASS]; + types = pokemon.getTypes(); + expect(types[0]).toBe(PokemonType.GRASS); + expect(types[1]).toBe(PokemonType.DARK); + }); + }); +}); diff --git a/src/test/final_boss.test.ts b/test/final_boss.test.ts similarity index 85% rename from src/test/final_boss.test.ts rename to test/final_boss.test.ts index de2cddff944..1b0cdce60a0 100644 --- a/src/test/final_boss.test.ts +++ b/test/final_boss.test.ts @@ -1,12 +1,12 @@ -import { StatusEffect } from "#app/data/status-effect"; -import { Abilities } from "#app/enums/abilities"; -import { Biome } from "#app/enums/biome"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; import { GameModes } from "#app/game-mode"; import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; +import { Abilities } from "#enums/abilities"; +import { Biome } from "#enums/biome"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import GameManager from "./utils/gameManager"; const FinalWave = { Classic: 200, @@ -29,7 +29,7 @@ describe("Final Boss", () => { .startingBiome(Biome.END) .disableCrits() .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.SPLASH, Moves.WILL_O_WISP, Moves.DRAGON_PULSE ]) + .moveset([Moves.SPLASH, Moves.WILL_O_WISP, Moves.DRAGON_PULSE]) .startingLevel(10000); }); @@ -38,7 +38,7 @@ describe("Final Boss", () => { }); it("should spawn Eternatus on wave 200 in END biome", async () => { - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -47,7 +47,7 @@ describe("Final Boss", () => { it("should NOT spawn Eternatus before wave 200 in END biome", async () => { game.override.startingWave(FinalWave.Classic - 1); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); expect(game.scene.currentBattle.waveIndex).not.toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -56,7 +56,7 @@ describe("Final Boss", () => { it("should NOT spawn Eternatus outside of END biome", async () => { game.override.startingBiome(Biome.FOREST); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).not.toBe(Biome.END); @@ -64,7 +64,7 @@ describe("Final Boss", () => { }); it("should not have passive enabled on Eternatus", async () => { - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); const eternatus = game.scene.getEnemyPokemon()!; expect(eternatus.species.speciesId).toBe(Species.ETERNATUS); @@ -72,7 +72,7 @@ describe("Final Boss", () => { }); it("should change form on direct hit down to last boss fragment", async () => { - await game.runToFinalBossEncounter([ Species.KYUREM ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.KYUREM], GameModes.CLASSIC); await game.phaseInterceptor.to("CommandPhase"); // Eternatus phase 1 @@ -101,7 +101,7 @@ describe("Final Boss", () => { it("should change form on status damage down to last boss fragment", async () => { game.override.ability(Abilities.NO_GUARD); - await game.runToFinalBossEncounter([ Species.BIDOOF ], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); await game.phaseInterceptor.to("CommandPhase"); // Eternatus phase 1 @@ -140,5 +140,4 @@ describe("Final Boss", () => { expect(miniBlackHole).toBeDefined(); expect(miniBlackHole?.stackCount).toBe(1); }); - }); diff --git a/src/test/fontFace.setup.ts b/test/fontFace.setup.ts similarity index 100% rename from src/test/fontFace.setup.ts rename to test/fontFace.setup.ts diff --git a/src/test/game-mode.test.ts b/test/game-mode.test.ts similarity index 87% rename from src/test/game-mode.test.ts rename to test/game-mode.test.ts index 11994a102af..a2da7d1690a 100644 --- a/src/test/game-mode.test.ts +++ b/test/game-mode.test.ts @@ -1,7 +1,8 @@ -import { GameMode, GameModes, getGameMode } from "#app/game-mode"; +import type { GameMode } from "#app/game-mode"; +import { GameModes, getGameMode } from "#app/game-mode"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import * as Utils from "../utils"; -import GameManager from "./utils/gameManager"; +import * as Utils from "#app/utils"; +import GameManager from "#test/testUtils/gameManager"; describe("game-mode", () => { let phaserGame: Phaser.Game; @@ -27,9 +28,7 @@ describe("game-mode", () => { it("does NOT spawn trainers within 3 waves of fixed battle", () => { const { arena } = game.scene; /** set wave 16 to be a fixed trainer fight meaning wave 13-19 don't allow trainer spawns */ - vi.spyOn(classicGameMode, "isFixedBattle").mockImplementation( - (n: number) => (n === 16 ? true : false) - ); + vi.spyOn(classicGameMode, "isFixedBattle").mockImplementation((n: number) => n === 16); vi.spyOn(arena, "getTrainerChance").mockReturnValue(1); vi.spyOn(Utils, "randSeedInt").mockReturnValue(0); expect(classicGameMode.isWaveTrainer(11, arena)).toBeFalsy(); diff --git a/src/test/imports.test.ts b/test/imports.test.ts similarity index 99% rename from src/test/imports.test.ts rename to test/imports.test.ts index 305eccdc465..128308dbd14 100644 --- a/src/test/imports.test.ts +++ b/test/imports.test.ts @@ -32,4 +32,3 @@ describe("tests to debug the import, with trace", () => { expect(module.Species).toBeDefined(); }); }); - diff --git a/src/test/inputs/inputs.test.ts b/test/inputs/inputs.test.ts similarity index 83% rename from src/test/inputs/inputs.test.ts rename to test/inputs/inputs.test.ts index 6306c1b9da6..1f566672f00 100644 --- a/src/test/inputs/inputs.test.ts +++ b/test/inputs/inputs.test.ts @@ -1,11 +1,10 @@ import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; -import GameManager from "#test/utils/gameManager"; -import InputsHandler from "#test/utils/inputsHandler"; +import GameManager from "#test/testUtils/gameManager"; +import InputsHandler from "#test/testUtils/inputsHandler"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Inputs", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -52,39 +51,38 @@ describe("Inputs", () => { expect(game.inputsHandler.log.length).toBe(5); }); - it("keyboard - test input holding for 200ms - 1 input", async() => { + it("keyboard - test input holding for 200ms - 1 input", async () => { await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 200); expect(game.inputsHandler.log.length).toBe(1); }); - it("keyboard - test input holding for 300ms - 2 input", async() => { + it("keyboard - test input holding for 300ms - 2 input", async () => { await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 300); expect(game.inputsHandler.log.length).toBe(2); }); - it("keyboard - test input holding for 1000ms - 4 input", async() => { + it("keyboard - test input holding for 1000ms - 4 input", async () => { await game.inputsHandler.pressKeyboardKey(cfg_keyboard_qwerty.deviceMapping.KEY_ARROW_UP, 1050); expect(game.inputsHandler.log.length).toBe(5); }); - it("gamepad - test input holding for 1ms - 1 input", async() => { + it("gamepad - test input holding for 1ms - 1 input", async () => { await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 1); expect(game.inputsHandler.log.length).toBe(1); }); - it("gamepad - test input holding for 200ms - 1 input", async() => { + it("gamepad - test input holding for 200ms - 1 input", async () => { await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 200); expect(game.inputsHandler.log.length).toBe(1); }); - it("gamepad - test input holding for 300ms - 2 input", async() => { + it("gamepad - test input holding for 300ms - 2 input", async () => { await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 300); expect(game.inputsHandler.log.length).toBe(2); }); - it("gamepad - test input holding for 1000ms - 4 input", async() => { + it("gamepad - test input holding for 1000ms - 4 input", async () => { await game.inputsHandler.pressGamepadButton(pad_xbox360.deviceMapping.RC_S, 1050); expect(game.inputsHandler.log.length).toBe(5); }); }); - diff --git a/src/test/internals.test.ts b/test/internals.test.ts similarity index 87% rename from src/test/internals.test.ts rename to test/internals.test.ts index ce2cd55dbc6..558b363caf0 100644 --- a/src/test/internals.test.ts +++ b/test/internals.test.ts @@ -1,6 +1,6 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -23,7 +23,7 @@ describe("Internals", () => { }); it("should provide Eevee with 3 defined abilities", async () => { - await game.classicMode.runToSummon([ Species.EEVEE ]); + await game.classicMode.runToSummon([Species.EEVEE]); const eevee = game.scene.getPlayerPokemon()!; expect(eevee.getSpeciesForm().getAbilityCount()).toBe(3); @@ -34,7 +34,7 @@ describe("Internals", () => { }); it("should set Eeeve abilityIndex between 0-2", async () => { - await game.classicMode.runToSummon([ Species.EEVEE ]); + await game.classicMode.runToSummon([Species.EEVEE]); const eevee = game.scene.getPlayerPokemon()!; expect(eevee.abilityIndex).toBeGreaterThanOrEqual(0); diff --git a/src/test/items/dire_hit.test.ts b/test/items/dire_hit.test.ts similarity index 76% rename from src/test/items/dire_hit.test.ts rename to test/items/dire_hit.test.ts index 601552de7f1..038d88ddc73 100644 --- a/src/test/items/dire_hit.test.ts +++ b/test/items/dire_hit.test.ts @@ -1,13 +1,13 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { TempCritBoosterModifier } from "#app/modifier/modifier"; import { Mode } from "#app/ui/ui"; -import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import type ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Button } from "#app/enums/buttons"; import { CommandPhase } from "#app/phases/command-phase"; import { NewBattlePhase } from "#app/phases/new-battle-phase"; @@ -34,17 +34,14 @@ describe("Items - Dire Hit", () => { game.override .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.POUND ]) + .moveset([Moves.POUND]) .startingHeldItems([{ name: "DIRE_HIT" }]) .battleType("single") .disableCrits(); - }, 20000); it("should raise CRIT stage by 1", async () => { - await game.startBattle([ - Species.GASTLY - ]); + await game.startBattle([Species.GASTLY]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -57,12 +54,10 @@ describe("Items - Dire Hit", () => { expect(enemyPokemon.getCritStage).toHaveReturnedWith(1); }, 20000); - it("should renew how many battles are left of existing DIRE_HIT when picking up new DIRE_HIT", async() => { + it("should renew how many battles are left of existing DIRE_HIT when picking up new DIRE_HIT", async () => { game.override.itemRewards([{ name: "DIRE_HIT" }]); - await game.startBattle([ - Species.PIKACHU - ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.SPLASH); @@ -74,13 +69,19 @@ describe("Items - Dire Hit", () => { expect(modifier.getBattleCount()).toBe(4); // Forced DIRE_HIT to spawn in the first slot with override - game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { - const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; - // Traverse to first modifier slot - handler.setCursor(0); - handler.setRowCursor(ShopCursorTarget.REWARDS); - handler.processInput(Button.ACTION); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(NewBattlePhase), true); + game.onNextPrompt( + "SelectModifierPhase", + Mode.MODIFIER_SELECT, + () => { + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + // Traverse to first modifier slot + handler.setCursor(0); + handler.setRowCursor(ShopCursorTarget.REWARDS); + handler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(NewBattlePhase), + true, + ); await game.phaseInterceptor.to(TurnInitPhase); diff --git a/src/test/items/double_battle_chance_booster.test.ts b/test/items/double_battle_chance_booster.test.ts similarity index 66% rename from src/test/items/double_battle_chance_booster.test.ts rename to test/items/double_battle_chance_booster.test.ts index 8d2bd7c9179..b4818e7e7ba 100644 --- a/src/test/items/double_battle_chance_booster.test.ts +++ b/test/items/double_battle_chance_booster.test.ts @@ -1,12 +1,12 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { DoubleBattleChanceBoosterModifier } from "#app/modifier/modifier"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; import { Mode } from "#app/ui/ui"; -import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import type ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Button } from "#app/enums/buttons"; describe("Items - Double Battle Chance Boosters", () => { @@ -27,12 +27,7 @@ describe("Items - Double Battle Chance Boosters", () => { }); it("should guarantee double battle with 2 unique tiers", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - { name: "SUPER_LURE" } - ]) - .startingWave(2); + game.override.startingModifier([{ name: "LURE" }, { name: "SUPER_LURE" }]).startingWave(2); await game.classicMode.startBattle(); @@ -40,13 +35,7 @@ describe("Items - Double Battle Chance Boosters", () => { }); it("should guarantee double boss battle with 3 unique tiers", async () => { - game.override - .startingModifier([ - { name: "LURE" }, - { name: "SUPER_LURE" }, - { name: "MAX_LURE" } - ]) - .startingWave(10); + game.override.startingModifier([{ name: "LURE" }, { name: "SUPER_LURE" }, { name: "MAX_LURE" }]).startingWave(10); await game.classicMode.startBattle(); @@ -57,16 +46,14 @@ describe("Items - Double Battle Chance Boosters", () => { expect(enemyField[1].isBoss()).toBe(true); }); - it("should renew how many battles are left of existing booster when picking up new booster of same tier", async() => { + it("should renew how many battles are left of existing booster when picking up new booster of same tier", async () => { game.override .startingModifier([{ name: "LURE" }]) .itemRewards([{ name: "LURE" }]) .moveset(Moves.SPLASH) .startingLevel(200); - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.SPLASH); @@ -74,17 +61,25 @@ describe("Items - Double Battle Chance Boosters", () => { await game.phaseInterceptor.to("BattleEndPhase"); - const modifier = game.scene.findModifier(m => m instanceof DoubleBattleChanceBoosterModifier) as DoubleBattleChanceBoosterModifier; + const modifier = game.scene.findModifier( + m => m instanceof DoubleBattleChanceBoosterModifier, + ) as DoubleBattleChanceBoosterModifier; expect(modifier.getBattleCount()).toBe(9); // Forced LURE to spawn in the first slot with override - game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { - const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; - // Traverse to first modifier slot - handler.setCursor(0); - handler.setRowCursor(ShopCursorTarget.REWARDS); - handler.processInput(Button.ACTION); - }, () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), true); + game.onNextPrompt( + "SelectModifierPhase", + Mode.MODIFIER_SELECT, + () => { + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + // Traverse to first modifier slot + handler.setCursor(0); + handler.setRowCursor(ShopCursorTarget.REWARDS); + handler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), + true, + ); await game.phaseInterceptor.to("TurnInitPhase"); diff --git a/src/test/items/eviolite.test.ts b/test/items/eviolite.test.ts similarity index 78% rename from src/test/items/eviolite.test.ts rename to test/items/eviolite.test.ts index 7b2f9a15fce..2b82e2145e9 100644 --- a/src/test/items/eviolite.test.ts +++ b/test/items/eviolite.test.ts @@ -1,10 +1,10 @@ -import { Stat } from "#enums/stat"; -import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import Phase from "phaser"; -import * as Utils from "#app/utils"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatBoosterModifier } from "#app/modifier/modifier"; +import { NumberHolder, randItem } from "#app/utils"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Items - Eviolite", () => { let phaserGame: Phaser.Game; @@ -22,20 +22,16 @@ describe("Items - Eviolite", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .battleType("single") - .startingHeldItems([{ name: "EVIOLITE" }]); + game.override.battleType("single").startingHeldItems([{ name: "EVIOLITE" }]); }); - it("should provide 50% boost to DEF and SPDEF for unevolved, unfused pokemon", async() => { - await game.classicMode.startBattle([ - Species.PICHU - ]); + it("should provide 50% boost to DEF and SPDEF for unevolved, unfused pokemon", async () => { + await game.classicMode.startBattle([Species.PICHU]); const partyMember = game.scene.getPlayerPokemon()!; vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { - const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false)); + const statValue = new NumberHolder(partyMember.getStat(stat, false)); game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue); // Ignore other calculations for simplicity @@ -50,15 +46,13 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.5)); }); - it("should not provide a boost for fully evolved, unfused pokemon", async() => { - await game.classicMode.startBattle([ - Species.RAICHU, - ]); + it("should not provide a boost for fully evolved, unfused pokemon", async () => { + await game.classicMode.startBattle([Species.RAICHU]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerPokemon()!; vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { - const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false)); + const statValue = new NumberHolder(partyMember.getStat(stat, false)); game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue); // Ignore other calculations for simplicity @@ -71,16 +65,12 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.DEF)).toBe(defStat); expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat); - }); - it("should provide 50% boost to DEF and SPDEF for completely unevolved, fused pokemon", async() => { - await game.classicMode.startBattle([ - Species.PICHU, - Species.CLEFFA - ]); + it("should provide 50% boost to DEF and SPDEF for completely unevolved, fused pokemon", async () => { + await game.classicMode.startBattle([Species.PICHU, Species.CLEFFA]); - const [ partyMember, ally ] = game.scene.getParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -92,7 +82,7 @@ describe("Items - Eviolite", () => { partyMember.fusionLuck = ally.luck; vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { - const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false)); + const statValue = new NumberHolder(partyMember.getStat(stat, false)); game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue); // Ignore other calculations for simplicity @@ -107,13 +97,10 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.5)); }); - it("should provide 25% boost to DEF and SPDEF for partially unevolved (base), fused pokemon", async() => { - await game.classicMode.startBattle([ - Species.PICHU, - Species.CLEFABLE - ]); + it("should provide 25% boost to DEF and SPDEF for partially unevolved (base), fused pokemon", async () => { + await game.classicMode.startBattle([Species.PICHU, Species.CLEFABLE]); - const [ partyMember, ally ] = game.scene.getParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -125,7 +112,7 @@ describe("Items - Eviolite", () => { partyMember.fusionLuck = ally.luck; vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { - const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false)); + const statValue = new NumberHolder(partyMember.getStat(stat, false)); game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue); // Ignore other calculations for simplicity @@ -140,13 +127,10 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25)); }); - it("should provide 25% boost to DEF and SPDEF for partially unevolved (fusion), fused pokemon", async() => { - await game.classicMode.startBattle([ - Species.RAICHU, - Species.CLEFFA - ]); + it("should provide 25% boost to DEF and SPDEF for partially unevolved (fusion), fused pokemon", async () => { + await game.classicMode.startBattle([Species.RAICHU, Species.CLEFFA]); - const [ partyMember, ally ] = game.scene.getParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -158,7 +142,7 @@ describe("Items - Eviolite", () => { partyMember.fusionLuck = ally.luck; vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { - const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false)); + const statValue = new NumberHolder(partyMember.getStat(stat, false)); game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue); // Ignore other calculations for simplicity @@ -173,13 +157,10 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(spDefStat * 1.25)); }); - it("should not provide a boost for fully evolved, fused pokemon", async() => { - await game.classicMode.startBattle([ - Species.RAICHU, - Species.CLEFABLE - ]); + it("should not provide a boost for fully evolved, fused pokemon", async () => { + await game.classicMode.startBattle([Species.RAICHU, Species.CLEFABLE]); - const [ partyMember, ally ] = game.scene.getParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -191,7 +172,7 @@ describe("Items - Eviolite", () => { partyMember.fusionLuck = ally.luck; vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { - const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false)); + const statValue = new NumberHolder(partyMember.getStat(stat, false)); game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue); // Ignore other calculations for simplicity @@ -206,24 +187,22 @@ describe("Items - Eviolite", () => { expect(partyMember.getEffectiveStat(Stat.SPDEF)).toBe(spDefStat); }); - it("should not provide a boost for Gigantamax Pokémon", async() => { + it("should not provide a boost for Gigantamax Pokémon", async () => { game.override.starterForms({ [Species.PIKACHU]: 8, [Species.EEVEE]: 2, [Species.DURALUDON]: 1, - [Species.MEOWTH]: 1 + [Species.MEOWTH]: 1, }); - const gMaxablePokemon = [ Species.PIKACHU, Species.EEVEE, Species.DURALUDON, Species.MEOWTH ]; + const gMaxablePokemon = [Species.PIKACHU, Species.EEVEE, Species.DURALUDON, Species.MEOWTH]; - await game.classicMode.startBattle([ - Utils.randItem(gMaxablePokemon) - ]); + await game.classicMode.startBattle([randItem(gMaxablePokemon)]); const partyMember = game.scene.getPlayerPokemon()!; vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { - const statValue = new Utils.NumberHolder(partyMember.getStat(stat, false)); + const statValue = new NumberHolder(partyMember.getStat(stat, false)); game.scene.applyModifiers(StatBoosterModifier, partyMember.isPlayer(), partyMember, stat, statValue); // Ignore other calculations for simplicity diff --git a/src/test/items/exp_booster.test.ts b/test/items/exp_booster.test.ts similarity index 83% rename from src/test/items/exp_booster.test.ts rename to test/items/exp_booster.test.ts index 36107329706..e4491b22637 100644 --- a/src/test/items/exp_booster.test.ts +++ b/test/items/exp_booster.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#app/enums/abilities"; import { PokemonExpBoosterModifier } from "#app/modifier/modifier"; import * as Utils from "#app/utils"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -27,14 +27,14 @@ describe("EXP Modifier Items", () => { game.override.battleType("single"); }); - it("EXP booster items stack multiplicatively", async() => { + it("EXP booster items stack multiplicatively", async () => { game.override.startingHeldItems([{ name: "LUCKY_EGG", count: 3 }, { name: "GOLDEN_EGG" }]); await game.startBattle(); const partyMember = game.scene.getPlayerPokemon()!; partyMember.exp = 100; const expHolder = new Utils.NumberHolder(partyMember.exp); - partyMember.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, expHolder); + game.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, expHolder); expect(expHolder.value).toBe(440); }, 20000); }); diff --git a/src/test/items/grip_claw.test.ts b/test/items/grip_claw.test.ts similarity index 85% rename from src/test/items/grip_claw.test.ts rename to test/items/grip_claw.test.ts index 2909549af87..1d169006116 100644 --- a/src/test/items/grip_claw.test.ts +++ b/test/items/grip_claw.test.ts @@ -1,11 +1,11 @@ import { BattlerIndex } from "#app/battle"; -import Pokemon from "#app/field/pokemon"; -import { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; +import type Pokemon from "#app/field/pokemon"; +import type { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -28,10 +28,8 @@ describe("Items - Grip Claw", () => { game.override .battleType("double") - .moveset([ Moves.TACKLE, Moves.SPLASH, Moves.ATTRACT ]) - .startingHeldItems([ - { name: "GRIP_CLAW", count: 1 }, - ]) + .moveset([Moves.TACKLE, Moves.SPLASH, Moves.ATTRACT]) + .startingHeldItems([{ name: "GRIP_CLAW", count: 1 }]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.UNNERVE) .ability(Abilities.UNNERVE) @@ -41,13 +39,12 @@ describe("Items - Grip Claw", () => { { name: "BERRY", type: BerryType.LUM, count: 2 }, ]) .enemyLevel(100); - }); it("should steal items on contact and only from the attack target", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); - const [ playerPokemon, ] = game.scene.getPlayerField(); + const [playerPokemon] = game.scene.getPlayerField(); const gripClaw = playerPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; vi.spyOn(gripClaw, "chance", "get").mockReturnValue(100); @@ -74,9 +71,9 @@ describe("Items - Grip Claw", () => { }); it("should not steal items when using a targetted, non attack move", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.MILOTIC ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); - const [ playerPokemon, ] = game.scene.getPlayerField(); + const [playerPokemon] = game.scene.getPlayerField(); const gripClaw = playerPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; vi.spyOn(gripClaw, "chance", "get").mockReturnValue(100); @@ -109,4 +106,3 @@ describe("Items - Grip Claw", () => { function getHeldItemCount(pokemon: Pokemon) { return pokemon.getHeldItems().reduce((currentTotal, item) => currentTotal + item.getStackCount(), 0); } - diff --git a/src/test/items/leek.test.ts b/test/items/leek.test.ts similarity index 80% rename from src/test/items/leek.test.ts rename to test/items/leek.test.ts index e27462a9265..ec4d075fe19 100644 --- a/src/test/items/leek.test.ts +++ b/test/items/leek.test.ts @@ -2,7 +2,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -25,17 +25,15 @@ describe("Items - Leek", () => { game.override .enemySpecies(Species.MAGIKARP) - .enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]) + .enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]) .startingHeldItems([{ name: "LEEK" }]) - .moveset([ Moves.TACKLE ]) + .moveset([Moves.TACKLE]) .disableCrits() .battleType("single"); }); it("should raise CRIT stage by 2 when held by FARFETCHD", async () => { - await game.startBattle([ - Species.FARFETCHD - ]); + await game.startBattle([Species.FARFETCHD]); const enemyMember = game.scene.getEnemyPokemon()!; @@ -49,9 +47,7 @@ describe("Items - Leek", () => { }, 20000); it("should raise CRIT stage by 2 when held by GALAR_FARFETCHD", async () => { - await game.startBattle([ - Species.GALAR_FARFETCHD - ]); + await game.startBattle([Species.GALAR_FARFETCHD]); const enemyMember = game.scene.getEnemyPokemon()!; @@ -65,9 +61,7 @@ describe("Items - Leek", () => { }, 20000); it("should raise CRIT stage by 2 when held by SIRFETCHD", async () => { - await game.startBattle([ - Species.SIRFETCHD - ]); + await game.startBattle([Species.SIRFETCHD]); const enemyMember = game.scene.getEnemyPokemon()!; @@ -82,14 +76,11 @@ describe("Items - Leek", () => { it("should raise CRIT stage by 2 when held by FARFETCHD line fused with Pokemon", async () => { // Randomly choose from the Farfetch'd line - const species = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; + const species = [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD]; - await game.startBattle([ - species[Utils.randInt(species.length)], - Species.PIKACHU, - ]); + await game.startBattle([species[Utils.randInt(species.length)], Species.PIKACHU]); - const [ partyMember, ally ] = game.scene.getParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -113,14 +104,11 @@ describe("Items - Leek", () => { it("should raise CRIT stage by 2 when held by Pokemon fused with FARFETCHD line", async () => { // Randomly choose from the Farfetch'd line - const species = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; + const species = [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD]; - await game.startBattle([ - Species.PIKACHU, - species[Utils.randInt(species.length)] - ]); + await game.startBattle([Species.PIKACHU, species[Utils.randInt(species.length)]]); - const [ partyMember, ally ] = game.scene.getParty(); + const [partyMember, ally] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -131,7 +119,6 @@ describe("Items - Leek", () => { partyMember.fusionGender = ally.gender; partyMember.fusionLuck = ally.luck; - const enemyMember = game.scene.getEnemyPokemon()!; vi.spyOn(enemyMember, "getCritStage"); @@ -144,9 +131,7 @@ describe("Items - Leek", () => { }, 20000); it("should not raise CRIT stage when held by a Pokemon outside of FARFETCHD line", async () => { - await game.startBattle([ - Species.PIKACHU - ]); + await game.startBattle([Species.PIKACHU]); const enemyMember = game.scene.getEnemyPokemon()!; diff --git a/src/test/items/leftovers.test.ts b/test/items/leftovers.test.ts similarity index 81% rename from src/test/items/leftovers.test.ts rename to test/items/leftovers.test.ts index cfbf7c2f734..ad22e9c3cae 100644 --- a/src/test/items/leftovers.test.ts +++ b/test/items/leftovers.test.ts @@ -1,13 +1,12 @@ -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"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Items - Leftovers", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,15 +26,15 @@ describe("Items - Leftovers", () => { game.override.battleType("single"); game.override.startingLevel(2000); game.override.ability(Abilities.UNNERVE); - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.UNNERVE); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); game.override.startingHeldItems([{ name: "LEFTOVERS", count: 1 }]); }); it("leftovers works", async () => { - await game.startBattle([ Species.ARCANINE ]); + await game.startBattle([Species.ARCANINE]); // Make sure leftovers are there expect(game.scene.modifiers[0].type.id).toBe("LEFTOVERS"); @@ -48,7 +47,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/light_ball.test.ts b/test/items/light_ball.test.ts similarity index 52% rename from src/test/items/light_ball.test.ts rename to test/items/light_ball.test.ts index 78375487f3b..e4959002904 100644 --- a/src/test/items/light_ball.test.ts +++ b/test/items/light_ball.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -28,77 +28,93 @@ describe("Items - Light Ball", () => { game.override.battleType("single"); }); - it("LIGHT_BALL activates in battle correctly", async() => { + it("LIGHT_BALL activates in battle correctly", async () => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ - Species.PIKACHU - ]); + await game.classicMode.startBattle([Species.PIKACHU]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerParty()[0]; // Checking console log to make sure Light Ball is applied when getEffectiveStat (with the appropriate stat) is called partyMember.getEffectiveStat(Stat.DEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); // Printing dummy console messages along the way so subsequent checks don't pass because of the first console.log(""); partyMember.getEffectiveStat(Stat.SPDEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.ATK); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPATK); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPD); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), + "", + ); }); - it("LIGHT_BALL held by PIKACHU", async() => { - await game.startBattle([ - Species.PIKACHU - ]); + it("LIGHT_BALL held by PIKACHU", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerParty()[0]; const atkStat = partyMember.getStat(Stat.ATK); const spAtkStat = partyMember.getStat(Stat.SPATK); // Making sure modifier is not applied without holding item const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); const spAtkValue = new Utils.NumberHolder(spAtkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); expect(atkValue.value / atkStat).toBe(1); expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); expect(atkValue.value / atkStat).toBe(2); expect(spAtkValue.value / spAtkStat).toBe(2); }, 20000); - it("LIGHT_BALL held by fused PIKACHU (base)", async() => { - await game.startBattle([ - Species.PIKACHU, - Species.MAROWAK - ]); + it("LIGHT_BALL held by fused PIKACHU (base)", async () => { + await game.classicMode.startBattle([Species.PIKACHU, Species.MAROWAK]); - const partyMember = game.scene.getParty()[0]; - const ally = game.scene.getParty()[1]; + const partyMember = game.scene.getPlayerParty()[0]; + const ally = game.scene.getPlayerParty()[1]; // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -114,30 +130,30 @@ describe("Items - Light Ball", () => { // Making sure modifier is not applied without holding item const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); const spAtkValue = new Utils.NumberHolder(spAtkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); expect(atkValue.value / atkStat).toBe(1); expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); expect(atkValue.value / atkStat).toBe(2); expect(spAtkValue.value / spAtkStat).toBe(2); }, 20000); - it("LIGHT_BALL held by fused PIKACHU (part)", async() => { - await game.startBattle([ - Species.MAROWAK, - Species.PIKACHU - ]); + it("LIGHT_BALL held by fused PIKACHU (part)", async () => { + await game.startBattle([Species.MAROWAK, Species.PIKACHU]); - const partyMember = game.scene.getParty()[0]; - const ally = game.scene.getParty()[1]; + const partyMember = game.scene.getPlayerParty()[0]; + const ally = game.scene.getPlayerParty()[1]; // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -153,45 +169,49 @@ describe("Items - Light Ball", () => { // Making sure modifier is not applied without holding item const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); const spAtkValue = new Utils.NumberHolder(spAtkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); expect(atkValue.value / atkStat).toBe(1); expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); expect(atkValue.value / atkStat).toBe(2); expect(spAtkValue.value / spAtkStat).toBe(2); }, 20000); - it("LIGHT_BALL not held by PIKACHU", async() => { - await game.startBattle([ - Species.MAROWAK - ]); + it("LIGHT_BALL not held by PIKACHU", async () => { + await game.startBattle([Species.MAROWAK]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerParty()[0]; const atkStat = partyMember.getStat(Stat.ATK); const spAtkStat = partyMember.getStat(Stat.SPATK); // Making sure modifier is not applied without holding item const atkValue = new Utils.NumberHolder(atkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); const spAtkValue = new Utils.NumberHolder(spAtkStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); expect(atkValue.value / atkStat).toBe(1); expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["LIGHT_BALL"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); expect(atkValue.value / atkStat).toBe(1); expect(spAtkValue.value / spAtkStat).toBe(1); diff --git a/src/test/items/lock_capsule.test.ts b/test/items/lock_capsule.test.ts similarity index 81% rename from src/test/items/lock_capsule.test.ts rename to test/items/lock_capsule.test.ts index 0b6534b5eaf..4e4182b3038 100644 --- a/src/test/items/lock_capsule.test.ts +++ b/test/items/lock_capsule.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -27,14 +27,19 @@ describe("Items - Lock Capsule", () => { game.override .battleType("single") .startingLevel(200) - .moveset([ Moves.SURF ]) + .moveset([Moves.SURF]) .enemyAbility(Abilities.BALL_FETCH) .startingModifier([{ name: "LOCK_CAPSULE" }]); }); it("doesn't set the cost of common tier items to 0", async () => { await game.classicMode.startBattle(); - game.scene.overridePhase(new SelectModifierPhase(game.scene, 0, undefined, { guaranteedModifierTiers: [ ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.COMMON ], fillRemaining: false })); + game.scene.overridePhase( + new SelectModifierPhase(0, undefined, { + guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.COMMON], + fillRemaining: false, + }), + ); game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { const selectModifierPhase = game.scene.getCurrentPhase() as SelectModifierPhase; diff --git a/src/test/items/metal_powder.test.ts b/test/items/metal_powder.test.ts similarity index 53% rename from src/test/items/metal_powder.test.ts rename to test/items/metal_powder.test.ts index c577182f350..460a95d0f06 100644 --- a/src/test/items/metal_powder.test.ts +++ b/test/items/metal_powder.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -28,71 +28,87 @@ describe("Items - Metal Powder", () => { game.override.battleType("single"); }); - it("METAL_POWDER activates in battle correctly", async() => { + it("METAL_POWDER activates in battle correctly", async () => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ - Species.DITTO - ]); + await game.classicMode.startBattle([Species.DITTO]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerParty()[0]; // Checking console log to make sure Metal Powder is applied when getEffectiveStat (with the appropriate stat) is called partyMember.getEffectiveStat(Stat.DEF); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); // Printing dummy console messages along the way so subsequent checks don't pass because of the first console.log(""); partyMember.getEffectiveStat(Stat.SPDEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.ATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPD); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), + "", + ); }); - it("METAL_POWDER held by DITTO", async() => { - await game.startBattle([ - Species.DITTO - ]); + it("METAL_POWDER held by DITTO", async () => { + await game.startBattle([Species.DITTO]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerParty()[0]; const defStat = partyMember.getStat(Stat.DEF); // Making sure modifier is not applied without holding item const defValue = new Utils.NumberHolder(defStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); }, 20000); - it("METAL_POWDER held by fused DITTO (base)", async() => { - await game.startBattle([ - Species.DITTO, - Species.MAROWAK - ]); + it("METAL_POWDER held by fused DITTO (base)", async () => { + await game.startBattle([Species.DITTO, Species.MAROWAK]); - const partyMember = game.scene.getParty()[0]; - const ally = game.scene.getParty()[1]; + const partyMember = game.scene.getPlayerParty()[0]; + const ally = game.scene.getPlayerParty()[1]; // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -107,25 +123,25 @@ describe("Items - Metal Powder", () => { // Making sure modifier is not applied without holding item const defValue = new Utils.NumberHolder(defStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); }, 20000); - it("METAL_POWDER held by fused DITTO (part)", async() => { - await game.startBattle([ - Species.MAROWAK, - Species.DITTO - ]); + it("METAL_POWDER held by fused DITTO (part)", async () => { + await game.startBattle([Species.MAROWAK, Species.DITTO]); - const partyMember = game.scene.getParty()[0]; - const ally = game.scene.getParty()[1]; + const partyMember = game.scene.getPlayerParty()[0]; + const ally = game.scene.getPlayerParty()[1]; // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -140,35 +156,39 @@ describe("Items - Metal Powder", () => { // Making sure modifier is not applied without holding item const defValue = new Utils.NumberHolder(defStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); }, 20000); - it("METAL_POWDER not held by DITTO", async() => { - await game.startBattle([ - Species.MAROWAK - ]); + it("METAL_POWDER not held by DITTO", async () => { + await game.startBattle([Species.MAROWAK]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerParty()[0]; const defStat = partyMember.getStat(Stat.DEF); // Making sure modifier is not applied without holding item const defValue = new Utils.NumberHolder(defStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["METAL_POWDER"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(1); }, 20000); diff --git a/test/items/multi_lens.test.ts b/test/items/multi_lens.test.ts new file mode 100644 index 00000000000..90e73ae88ea --- /dev/null +++ b/test/items/multi_lens.test.ts @@ -0,0 +1,214 @@ +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Items - Multi Lens", () => { + 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.TACKLE, Moves.TRAILBLAZE, Moves.TACHYON_CUTTER, Moves.FUTURE_SIGHT]) + .ability(Abilities.BALL_FETCH) + .startingHeldItems([{ name: "MULTI_LENS" }]) + .battleType("single") + .disableCrits() + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH) + .startingLevel(99) // Check for proper rounding on Seismic Toss damage reduction + .enemyLevel(99); + }); + + it.each([ + { stackCount: 1, firstHitDamage: 0.75 }, + { stackCount: 2, firstHitDamage: 0.5 }, + ])( + "$stackCount count: should deal {$firstHitDamage}x damage on the first hit, then hit $stackCount times for 0.25x", + async ({ stackCount, firstHitDamage }) => { + game.override.startingHeldItems([{ name: "MULTI_LENS", count: stackCount }]); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const spy = vi.spyOn(enemyPokemon, "getAttackDamage"); + vi.spyOn(enemyPokemon, "getBaseDamage").mockReturnValue(100); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + const damageResults = spy.mock.results.map(result => result.value?.damage); + + expect(damageResults).toHaveLength(1 + stackCount); + expect(damageResults[0]).toBe(firstHitDamage * 100); + damageResults.slice(1).forEach(dmg => expect(dmg).toBe(25)); + }, + ); + + it("should stack additively with Parental Bond", async () => { + game.override.ability(Abilities.PARENTAL_BOND); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.turnData.hitCount).toBe(3); + }); + + it("should apply secondary effects on each hit", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TRAILBLAZE); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(2); + }); + + it("should not enhance multi-hit moves", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TACHYON_CUTTER); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(playerPokemon.turnData.hitCount).toBe(2); + }); + + it("should enhance multi-target moves", async () => { + game.override.battleType("double").moveset([Moves.SWIFT, Moves.SPLASH]); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); + + const [magikarp] = game.scene.getPlayerField(); + + game.move.select(Moves.SWIFT, 0); + game.move.select(Moves.SPLASH, 1); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(magikarp.turnData.hitCount).toBe(2); + }); + + it("should enhance fixed-damage moves while also applying damage reduction", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]).moveset(Moves.SEISMIC_TOSS); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + const spy = vi.spyOn(enemyPokemon, "getAttackDamage"); + + game.move.select(Moves.SEISMIC_TOSS); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + const damageResults = spy.mock.results.map(result => result.value?.damage); + + expect(damageResults).toHaveLength(2); + 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/items/quick_powder.test.ts b/test/items/quick_powder.test.ts similarity index 52% rename from src/test/items/quick_powder.test.ts rename to test/items/quick_powder.test.ts index 4eb6f6fb164..26faf5a0f4f 100644 --- a/src/test/items/quick_powder.test.ts +++ b/test/items/quick_powder.test.ts @@ -4,7 +4,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import * as Utils from "#app/utils"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -28,71 +28,87 @@ describe("Items - Quick Powder", () => { game.override.battleType("single"); }); - it("QUICK_POWDER activates in battle correctly", async() => { + it("QUICK_POWDER activates in battle correctly", async () => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ - Species.DITTO - ]); + await game.classicMode.startBattle([Species.DITTO]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerParty()[0]; // Checking console log to make sure Quick Powder is applied when getEffectiveStat (with the appropriate stat) is called partyMember.getEffectiveStat(Stat.DEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); // Printing dummy console messages along the way so subsequent checks don't pass because of the first console.log(""); partyMember.getEffectiveStat(Stat.SPDEF); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.ATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPATK); - expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); console.log(""); partyMember.getEffectiveStat(Stat.SPD); - expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), + "", + ); }); - it("QUICK_POWDER held by DITTO", async() => { - await game.startBattle([ - Species.DITTO - ]); + it("QUICK_POWDER held by DITTO", async () => { + await game.classicMode.startBattle([Species.DITTO]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerParty()[0]; const spdStat = partyMember.getStat(Stat.SPD); // Making sure modifier is not applied without holding item const spdValue = new Utils.NumberHolder(spdStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); - }, 20000); + }); - it("QUICK_POWDER held by fused DITTO (base)", async() => { - await game.startBattle([ - Species.DITTO, - Species.MAROWAK - ]); + it("QUICK_POWDER held by fused DITTO (base)", async () => { + await game.classicMode.startBattle([Species.DITTO, Species.MAROWAK]); - const partyMember = game.scene.getParty()[0]; - const ally = game.scene.getParty()[1]; + const partyMember = game.scene.getPlayerParty()[0]; + const ally = game.scene.getPlayerParty()[1]; // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -107,25 +123,25 @@ describe("Items - Quick Powder", () => { // Making sure modifier is not applied without holding item const spdValue = new Utils.NumberHolder(spdStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); - }, 20000); + }); - it("QUICK_POWDER held by fused DITTO (part)", async() => { - await game.startBattle([ - Species.MAROWAK, - Species.DITTO - ]); + it("QUICK_POWDER held by fused DITTO (part)", async () => { + await game.classicMode.startBattle([Species.MAROWAK, Species.DITTO]); - const partyMember = game.scene.getParty()[0]; - const ally = game.scene.getParty()[1]; + const partyMember = game.scene.getPlayerParty()[0]; + const ally = game.scene.getPlayerParty()[1]; // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; @@ -140,36 +156,40 @@ describe("Items - Quick Powder", () => { // Making sure modifier is not applied without holding item const spdValue = new Utils.NumberHolder(spdStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); - }, 20000); + }); - it("QUICK_POWDER not held by DITTO", async() => { - await game.startBattle([ - Species.MAROWAK - ]); + it("QUICK_POWDER not held by DITTO", async () => { + await game.classicMode.startBattle([Species.MAROWAK]); - const partyMember = game.scene.getParty()[0]; + const partyMember = game.scene.getPlayerParty()[0]; const spdStat = partyMember.getStat(Stat.SPD); // Making sure modifier is not applied without holding item const spdValue = new Utils.NumberHolder(spdStat); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); - partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["QUICK_POWDER"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(1); - }, 20000); + }); }); diff --git a/src/test/items/scope_lens.test.ts b/test/items/scope_lens.test.ts similarity index 88% rename from src/test/items/scope_lens.test.ts rename to test/items/scope_lens.test.ts index e39517ceae9..abd5cd7e75c 100644 --- a/src/test/items/scope_lens.test.ts +++ b/test/items/scope_lens.test.ts @@ -1,7 +1,7 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -25,17 +25,14 @@ describe("Items - Scope Lens", () => { game.override .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.POUND ]) + .moveset([Moves.POUND]) .startingHeldItems([{ name: "SCOPE_LENS" }]) .battleType("single") .disableCrits(); - }, 20000); it("should raise CRIT stage by 1", async () => { - await game.startBattle([ - Species.GASTLY - ]); + await game.startBattle([Species.GASTLY]); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/src/test/items/temp_stat_stage_booster.test.ts b/test/items/temp_stat_stage_booster.test.ts similarity index 71% rename from src/test/items/temp_stat_stage_booster.test.ts rename to test/items/temp_stat_stage_booster.test.ts index 6186799623a..6417f898e3e 100644 --- a/src/test/items/temp_stat_stage_booster.test.ts +++ b/test/items/temp_stat_stage_booster.test.ts @@ -1,5 +1,5 @@ import { BATTLE_STATS, Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -9,10 +9,9 @@ import { Abilities } from "#app/enums/abilities"; import { TempStatStageBoosterModifier } from "#app/modifier/modifier"; import { Mode } from "#app/ui/ui"; import { Button } from "#app/enums/buttons"; -import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import type ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; - describe("Items - Temporary Stat Stage Boosters", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -35,14 +34,12 @@ describe("Items - Temporary Stat Stage Boosters", () => { .enemySpecies(Species.SHUCKLE) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.TACKLE, Moves.SPLASH, Moves.HONE_CLAWS, Moves.BELLY_DRUM ]) + .moveset([Moves.TACKLE, Moves.SPLASH, Moves.HONE_CLAWS, Moves.BELLY_DRUM]) .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); }); - it("should provide a x1.3 stat stage multiplier", async() => { - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + it("should provide a x1.3 stat stage multiplier", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); const partyMember = game.scene.getPlayerPokemon()!; @@ -55,14 +52,10 @@ describe("Items - Temporary Stat Stage Boosters", () => { expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(1.3); }, 20000); - it("should increase existing ACC stat stage by 1 for X_ACCURACY only", async() => { - game.override - .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]) - .ability(Abilities.SIMPLE); + it("should increase existing ACC stat stage by 1 for X_ACCURACY only", async () => { + game.override.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]).ability(Abilities.SIMPLE); - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + await game.classicMode.startBattle([Species.PIKACHU]); const partyMember = game.scene.getPlayerPokemon()!; @@ -81,11 +74,8 @@ describe("Items - Temporary Stat Stage Boosters", () => { expect(partyMember.getAccuracyMultiplier).toHaveReturnedWith(2); }, 20000); - - it("should increase existing stat stage multiplier by 3/10 for the rest of the boosters", async() => { - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + it("should increase existing stat stage multiplier by 3/10 for the rest of the boosters", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); const partyMember = game.scene.getPlayerPokemon()!; @@ -104,13 +94,14 @@ describe("Items - Temporary Stat Stage Boosters", () => { expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(1.8); }, 20000); - it("should not increase past maximum stat stage multiplier", async() => { - game.override.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }, { name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); - - await game.classicMode.startBattle([ - Species.PIKACHU + it("should not increase past maximum stat stage multiplier", async () => { + game.override.startingModifier([ + { name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }, + { name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }, ]); + await game.classicMode.startBattle([Species.PIKACHU]); + const partyMember = game.scene.getPlayerPokemon()!; vi.spyOn(partyMember, "getStatStageMultiplier"); @@ -127,14 +118,10 @@ describe("Items - Temporary Stat Stage Boosters", () => { expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(4); }, 20000); - it("should renew how many battles are left of existing booster when picking up new booster of same type", async() => { - game.override - .startingLevel(200) - .itemRewards([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); + it("should renew how many battles are left of existing booster when picking up new booster of same type", async () => { + game.override.startingLevel(200).itemRewards([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); - await game.classicMode.startBattle([ - Species.PIKACHU - ]); + await game.classicMode.startBattle([Species.PIKACHU]); game.move.select(Moves.SPLASH); @@ -142,17 +129,25 @@ describe("Items - Temporary Stat Stage Boosters", () => { await game.phaseInterceptor.to("BattleEndPhase"); - const modifier = game.scene.findModifier(m => m instanceof TempStatStageBoosterModifier) as TempStatStageBoosterModifier; + const modifier = game.scene.findModifier( + m => m instanceof TempStatStageBoosterModifier, + ) as TempStatStageBoosterModifier; expect(modifier.getBattleCount()).toBe(4); // Forced X_ATTACK to spawn in the first slot with override - game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { - const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; - // Traverse to first modifier slot - handler.setCursor(0); - handler.setRowCursor(ShopCursorTarget.REWARDS); - handler.processInput(Button.ACTION); - }, () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), true); + game.onNextPrompt( + "SelectModifierPhase", + Mode.MODIFIER_SELECT, + () => { + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + // Traverse to first modifier slot + handler.setCursor(0); + handler.setRowCursor(ShopCursorTarget.REWARDS); + handler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), + true, + ); await game.phaseInterceptor.to("TurnInitPhase"); diff --git a/test/items/thick_club.test.ts b/test/items/thick_club.test.ts new file mode 100644 index 00000000000..9edbbcdc7d9 --- /dev/null +++ b/test/items/thick_club.test.ts @@ -0,0 +1,249 @@ +import { Stat } from "#enums/stat"; +import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import i18next from "#app/plugins/i18n"; +import * as Utils from "#app/utils"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phase from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Items - Thick Club", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("single"); + }); + + it("THICK_CLUB activates in battle correctly", async () => { + game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.classicMode.startBattle([Species.CUBONE]); + + const partyMember = game.scene.getPlayerParty()[0]; + + // Checking console log to make sure Thick Club is applied when getEffectiveStat (with the appropriate stat) is called + partyMember.getEffectiveStat(Stat.DEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getEffectiveStat(Stat.SPDEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); + + console.log(""); + + partyMember.getEffectiveStat(Stat.ATK); + expect(consoleSpy).toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); + + console.log(""); + + partyMember.getEffectiveStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); + + console.log(""); + + partyMember.getEffectiveStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith( + "Applied", + i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), + "", + ); + }); + + it("THICK_CLUB held by CUBONE", async () => { + await game.classicMode.startBattle([Species.CUBONE]); + + const partyMember = game.scene.getPlayerParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }); + + it("THICK_CLUB held by MAROWAK", async () => { + await game.classicMode.startBattle([Species.MAROWAK]); + + const partyMember = game.scene.getPlayerParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }); + + it("THICK_CLUB held by ALOLA_MAROWAK", async () => { + await game.classicMode.startBattle([Species.ALOLA_MAROWAK]); + + const partyMember = game.scene.getPlayerParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }); + + it("THICK_CLUB held by fused CUBONE line (base)", async () => { + // Randomly choose from the Cubone line + const species = [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK]; + const randSpecies = Utils.randInt(species.length); + + await game.classicMode.startBattle([species[randSpecies], Species.PIKACHU]); + + const partyMember = game.scene.getPlayerParty()[0]; + const ally = game.scene.getPlayerParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }); + + it("THICK_CLUB held by fused CUBONE line (part)", async () => { + // Randomly choose from the Cubone line + const species = [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK]; + const randSpecies = Utils.randInt(species.length); + + await game.classicMode.startBattle([Species.PIKACHU, species[randSpecies]]); + + const partyMember = game.scene.getPlayerParty()[0]; + const ally = game.scene.getPlayerParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }); + + it("THICK_CLUB not held by CUBONE", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); + + const partyMember = game.scene.getPlayerParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + await game.scene.addModifier( + modifierTypes.SPECIES_STAT_BOOSTER().generateType([], ["THICK_CLUB"])!.newModifier(partyMember), + true, + ); + game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + }); +}); diff --git a/src/test/items/toxic_orb.test.ts b/test/items/toxic_orb.test.ts similarity index 84% rename from src/test/items/toxic_orb.test.ts rename to test/items/toxic_orb.test.ts index 583e302126c..57e6b651b66 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/test/items/toxic_orb.test.ts @@ -1,9 +1,9 @@ -import { StatusEffect } from "#app/data/status-effect"; import i18next from "#app/plugins/i18n"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -30,15 +30,17 @@ describe("Items - Toxic orb", () => { .enemyAbility(Abilities.BALL_FETCH) .moveset(Moves.SPLASH) .enemyMoveset(Moves.SPLASH) - .startingHeldItems([{ - name: "TOXIC_ORB", - }]); + .startingHeldItems([ + { + name: "TOXIC_ORB", + }, + ]); vi.spyOn(i18next, "t"); }); it("should badly poison the holder", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; expect(player.getHeldItems()[0].type.id).toBe("TOXIC_ORB"); diff --git a/src/test/misc.test.ts b/test/misc.test.ts similarity index 54% rename from src/test/misc.test.ts rename to test/misc.test.ts index 3335c4c5523..12ed165d9d9 100644 --- a/src/test/misc.test.ts +++ b/test/misc.test.ts @@ -1,6 +1,6 @@ -import { apiFetch } from "#app/utils"; -import GameManager from "#test/utils/gameManager"; -import { waitUntil } from "#test/utils/gameManagerUtils"; +// import { apiFetch } from "#app/utils"; +import GameManager from "#test/testUtils/gameManager"; +import { waitUntil } from "#test/testUtils/gameManagerUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -24,29 +24,31 @@ describe("Test misc", () => { it("test fetch mock async", async () => { const spy = vi.fn(); - await fetch("https://localhost:8080/account/info").then(response => { - expect(response.status).toBe(200); - expect(response.ok).toBe(true); - return response.json(); - }).then(data => { - spy(); // Call the spy function - expect(data).toEqual({ "username": "greenlamp", "lastSessionSlot": 0 }); - }); + await fetch("https://localhost:8080/account/info") + .then(response => { + expect(response.status).toBe(200); + expect(response.ok).toBe(true); + return response.json(); + }) + .then(data => { + spy(); // Call the spy function + expect(data).toEqual({ username: "greenlamp", lastSessionSlot: 0 }); + }); expect(spy).toHaveBeenCalled(); }); - it("test apifetch mock async", async () => { - const spy = vi.fn(); - await apiFetch("https://localhost:8080/account/info").then(response => { - expect(response.status).toBe(200); - expect(response.ok).toBe(true); - return response.json(); - }).then(data => { - spy(); // Call the spy function - expect(data).toEqual({ "username": "greenlamp", "lastSessionSlot": 0 }); - }); - expect(spy).toHaveBeenCalled(); - }); + // it.skip("test apifetch mock async", async () => { + // const spy = vi.fn(); + // await apiFetch("https://localhost:8080/account/info").then(response => { + // expect(response.status).toBe(200); + // expect(response.ok).toBe(true); + // return response.json(); + // }).then(data => { + // spy(); // Call the spy function + // expect(data).toEqual({ "username": "greenlamp", "lastSessionSlot": 0 }); + // }); + // expect(spy).toHaveBeenCalled(); + // }); it("test fetch mock sync", async () => { const response = await fetch("https://localhost:8080/account/info"); @@ -54,7 +56,7 @@ describe("Test misc", () => { expect(response.ok).toBe(true); expect(response.status).toBe(200); - expect(data).toEqual({ "username": "greenlamp", "lastSessionSlot": 0 }); + expect(data).toEqual({ username: "greenlamp", lastSessionSlot: 0 }); }); it("test apifetch mock sync", async () => { @@ -64,7 +66,7 @@ describe("Test misc", () => { it("testing wait phase queue", async () => { const fakeScene = { - phaseQueue: [ 1, 2, 3 ] // Initially not empty + phaseQueue: [1, 2, 3], // Initially not empty }; setTimeout(() => { fakeScene.phaseQueue = []; diff --git a/src/test/moves/after_you.test.ts b/test/moves/after_you.test.ts similarity index 87% rename from src/test/moves/after_you.test.ts rename to test/moves/after_you.test.ts index 99f383194aa..fde19b87b5d 100644 --- a/src/test/moves/after_you.test.ts +++ b/test/moves/after_you.test.ts @@ -4,11 +4,10 @@ import { MoveResult } from "#app/field/pokemon"; import { MovePhase } from "#app/phases/move-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - After You", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -32,11 +31,11 @@ describe("Moves - After You", () => { .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.AFTER_YOU, Moves.SPLASH ]); + .moveset([Moves.AFTER_YOU, Moves.SPLASH]); }); it("makes the target move immediately after the user", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.SHUCKLE]); game.move.select(Moves.AFTER_YOU, 0, BattlerIndex.PLAYER_2); game.move.select(Moves.SPLASH, 1); @@ -50,7 +49,7 @@ describe("Moves - After You", () => { it("fails if target already moved", async () => { game.override.enemySpecies(Species.SHUCKLE); - await game.classicMode.startBattle([ Species.REGIELEKI, Species.PIKACHU ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.PIKACHU]); game.move.select(Moves.SPLASH); game.move.select(Moves.AFTER_YOU, 1, BattlerIndex.PLAYER); diff --git a/src/test/moves/alluring_voice.test.ts b/test/moves/alluring_voice.test.ts similarity index 86% rename from src/test/moves/alluring_voice.test.ts rename to test/moves/alluring_voice.test.ts index 2980f102735..777078e4786 100644 --- a/src/test/moves/alluring_voice.test.ts +++ b/test/moves/alluring_voice.test.ts @@ -4,11 +4,10 @@ import { BattlerTagType } from "#app/enums/battler-tag-type"; import { BerryPhase } from "#app/phases/berry-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Alluring Voice", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -30,13 +29,12 @@ describe("Moves - Alluring Voice", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.ICE_SCALES) - .enemyMoveset([ Moves.HOWL ]) + .enemyMoveset([Moves.HOWL]) .startingLevel(10) .enemyLevel(10) .starterSpecies(Species.FEEBAS) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.ALLURING_VOICE ]); - + .moveset([Moves.ALLURING_VOICE]); }); it("should confuse the opponent if their stat stages were raised", async () => { @@ -45,7 +43,7 @@ describe("Moves - Alluring Voice", () => { const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.ALLURING_VOICE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to(BerryPhase); expect(enemy.getTag(BattlerTagType.CONFUSED)?.tagType).toBe("CONFUSED"); diff --git a/src/test/moves/aromatherapy.test.ts b/test/moves/aromatherapy.test.ts similarity index 84% rename from src/test/moves/aromatherapy.test.ts rename to test/moves/aromatherapy.test.ts index f547ed0e54c..fe7a008249f 100644 --- a/src/test/moves/aromatherapy.test.ts +++ b/test/moves/aromatherapy.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; @@ -24,7 +24,7 @@ describe("Moves - Aromatherapy", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.AROMATHERAPY, Moves.SPLASH ]) + .moveset([Moves.AROMATHERAPY, Moves.SPLASH]) .statusEffect(StatusEffect.BURN) .battleType("double") .enemyAbility(Abilities.BALL_FETCH) @@ -32,8 +32,8 @@ describe("Moves - Aromatherapy", () => { }); it("should cure status effect of the user, its ally, and all party pokemon", async () => { - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getParty(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); @@ -55,8 +55,8 @@ describe("Moves - Aromatherapy", () => { it("should not cure status effect of the target/target's allies", async () => { game.override.enemyStatusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftOpp, rightOpp ] = game.scene.getEnemyField(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); vi.spyOn(leftOpp, "resetStatus"); vi.spyOn(rightOpp, "resetStatus"); @@ -78,8 +78,8 @@ describe("Moves - Aromatherapy", () => { it("should not cure status effect of allies ON FIELD with Sap Sipper, should still cure allies in party", async () => { game.override.ability(Abilities.SAP_SIPPER); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getParty(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); diff --git a/test/moves/assist.test.ts b/test/moves/assist.test.ts new file mode 100644 index 00000000000..68322a7f193 --- /dev/null +++ b/test/moves/assist.test.ts @@ -0,0 +1,105 @@ +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#app/enums/stat"; +import { MoveResult } from "#app/field/pokemon"; +import { CommandPhase } from "#app/phases/command-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Assist", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + // Manual moveset overrides are required for the player pokemon in these tests + // because the normal moveset override doesn't allow for accurate testing of moveset changes + game.override + .ability(Abilities.BALL_FETCH) + .battleType("double") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyLevel(100) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should only use an ally's moves", async () => { + game.override.enemyMoveset(Moves.SWORDS_DANCE); + await game.classicMode.startBattle([Species.FEEBAS, Species.SHUCKLE]); + + const [feebas, shuckle] = game.scene.getPlayerField(); + // These are all moves Assist cannot call; Sketch will be used to test that it can call other moves properly + game.move.changeMoveset(feebas, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + game.move.changeMoveset(shuckle, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + + game.move.select(Moves.ASSIST, 0); + game.move.select(Moves.SKETCH, 1); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER]); + // Player_2 uses Sketch, copies Swords Dance, Player_1 uses Assist, uses Player_2's Sketched Swords Dance + await game.toNextTurn(); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(2); // Stat raised from Assist -> Swords Dance + }); + + it("should fail if there are no allies", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + const feebas = game.scene.getPlayerPokemon()!; + game.move.changeMoveset(feebas, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + + game.move.select(Moves.ASSIST, 0); + await game.toNextTurn(); + expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should fail if ally has no usable moves and user has usable moves", async () => { + game.override.enemyMoveset(Moves.SWORDS_DANCE); + await game.classicMode.startBattle([Species.FEEBAS, Species.SHUCKLE]); + + const [feebas, shuckle] = game.scene.getPlayerField(); + game.move.changeMoveset(feebas, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + game.move.changeMoveset(shuckle, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + + game.move.select(Moves.SKETCH, 0); + game.move.select(Moves.PROTECT, 1); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); + // Player uses Sketch to copy Swords Dance, Player_2 stalls a turn. Player will attempt Assist and should have no usable moves + await game.toNextTurn(); + game.move.select(Moves.ASSIST, 0); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.PROTECT, 1); + await game.toNextTurn(); + + expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should apply secondary effects of a move", async () => { + game.override.moveset([Moves.ASSIST, Moves.WOOD_HAMMER, Moves.WOOD_HAMMER, Moves.WOOD_HAMMER]); + await game.classicMode.startBattle([Species.FEEBAS, Species.SHUCKLE]); + + const [feebas, shuckle] = game.scene.getPlayerField(); + game.move.changeMoveset(feebas, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + game.move.changeMoveset(shuckle, [Moves.ASSIST, Moves.SKETCH, Moves.PROTECT, Moves.DRAGON_TAIL]); + + game.move.select(Moves.ASSIST, 0); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.ASSIST, 1); + await game.toNextTurn(); + + expect(game.scene.getPlayerPokemon()!.isFullHp()).toBeFalsy(); // should receive recoil damage from Wood Hammer + }); +}); diff --git a/src/test/moves/astonish.test.ts b/test/moves/astonish.test.ts similarity index 51% rename from src/test/moves/astonish.test.ts rename to test/moves/astonish.test.ts index d94e50fc9f9..53922060ae6 100644 --- a/src/test/moves/astonish.test.ts +++ b/test/moves/astonish.test.ts @@ -1,4 +1,4 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { BattlerTagType } from "#app/enums/battler-tag-type"; import { BerryPhase } from "#app/phases/berry-phase"; import { CommandPhase } from "#app/phases/command-phase"; @@ -7,11 +7,10 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; - describe("Moves - Astonish", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,43 +28,40 @@ describe("Moves - Astonish", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.ASTONISH, Moves.SPLASH ]); + game.override.moveset([Moves.ASTONISH, Moves.SPLASH]); game.override.enemySpecies(Species.BLASTOISE); game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); game.override.startingLevel(100); game.override.enemyLevel(100); vi.spyOn(allMoves[Moves.ASTONISH], "chance", "get").mockReturnValue(100); }); - test( - "move effect should cancel the target's move on the turn it applies", - async () => { - await game.startBattle([ Species.MEOWSCARADA ]); + test("move effect should cancel the target's move on the turn it applies", async () => { + await game.startBattle([Species.MEOWSCARADA]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; - game.move.select(Moves.ASTONISH); + game.move.select(Moves.ASTONISH); - await game.phaseInterceptor.to(MoveEndPhase, false); + await game.phaseInterceptor.to(MoveEndPhase, false); - expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeDefined(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(TurnEndPhase); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeUndefined(); + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeUndefined(); - await game.phaseInterceptor.to(CommandPhase, false); + await game.phaseInterceptor.to(CommandPhase, false); - game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(BerryPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); - expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); - } - ); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }); }); diff --git a/src/test/moves/aurora_veil.test.ts b/test/moves/aurora_veil.test.ts similarity index 50% rename from src/test/moves/aurora_veil.test.ts rename to test/moves/aurora_veil.test.ts index e68117a2f59..31f6497bae5 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/test/moves/aurora_veil.test.ts @@ -1,17 +1,20 @@ +import type BattleScene from "#app/battle-scene"; import { ArenaTagSide } from "#app/data/arena-tag"; -import Move, { allMoves } from "#app/data/move"; -import { WeatherType } from "#app/data/weather"; -import { Abilities } from "#app/enums/abilities"; +import type Move from "#app/data/moves/move"; +import { allMoves, CritOnlyAttr } from "#app/data/moves/move"; import { ArenaTagType } from "#app/enums/arena-tag-type"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { NumberHolder } 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 { WeatherType } from "#enums/weather-type"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +let globalScene: BattleScene; describe("Moves - Aurora Veil", () => { let phaserGame: Phaser.Game; @@ -31,24 +34,29 @@ describe("Moves - Aurora Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); + globalScene = game.scene; game.override.battleType("single"); game.override.ability(Abilities.NONE); - game.override.moveset([ Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE ]); + game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL ]); + game.override.enemyMoveset([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); game.override.disableCrits(); game.override.weather(WeatherType.HAIL); }); it("reduces damage of physical attacks by half in a single battle", async () => { const moveToUse = Moves.TACKLE; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); @@ -57,26 +65,34 @@ describe("Moves - Aurora Veil", () => { game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); game.move.select(moveToUse); game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); it("reduces damage of special attacks by half in a single battle", async () => { const moveToUse = Moves.ABSORB; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); @@ -85,16 +101,53 @@ describe("Moves - Aurora Veil", () => { game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); game.move.select(moveToUse); game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); + + it("does not affect physical critical hits", async () => { + game.override.moveset([Moves.WICKED_BLOW]); + const moveToUse = Moves.WICKED_BLOW; + await game.classicMode.startBattle([Species.SHUCKLE]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); + + it("does not affect critical hits", async () => { + game.override.moveset([Moves.FROST_BREATH]); + const moveToUse = Moves.FROST_BREATH; + vi.spyOn(allMoves[Moves.FROST_BREATH], "accuracy", "get").mockReturnValue(100); + await game.classicMode.startBattle([Species.SHUCKLE]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); }); /** @@ -110,8 +163,17 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = const multiplierHolder = new NumberHolder(1); const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - if (defender.scene.arena.getTagOnSide(ArenaTagType.AURORA_VEIL, side)) { - defender.scene.arena.applyTagsForSide(ArenaTagType.AURORA_VEIL, side, false, attacker, move.category, multiplierHolder); + if (globalScene.arena.getTagOnSide(ArenaTagType.AURORA_VEIL, side)) { + if (move.getAttrs(CritOnlyAttr).length === 0) { + globalScene.arena.applyTagsForSide( + ArenaTagType.AURORA_VEIL, + side, + false, + attacker, + move.category, + multiplierHolder, + ); + } } return move.power * multiplierHolder.value; diff --git a/test/moves/autotomize.test.ts b/test/moves/autotomize.test.ts new file mode 100644 index 00000000000..62ef185dea8 --- /dev/null +++ b/test/moves/autotomize.test.ts @@ -0,0 +1,109 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; + +describe("Moves - Autotomize", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const TIMEOUT = 20 * 1000; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([Moves.AUTOTOMIZE, Moves.KINGS_SHIELD, Moves.FALSE_SWIPE]) + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it( + "Autotomize should reduce weight", + async () => { + const baseDracozoltWeight = 190; + const oneAutotomizeDracozoltWeight = 90; + const twoAutotomizeDracozoltWeight = 0.1; + const threeAutotomizeDracozoltWeight = 0.1; + + await game.classicMode.startBattle([Species.DRACOZOLT]); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getWeight()).toBe(baseDracozoltWeight); + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(oneAutotomizeDracozoltWeight); + + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(twoAutotomizeDracozoltWeight); + + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(threeAutotomizeDracozoltWeight); + }, + TIMEOUT, + ); + + it( + "Changing forms should revert weight", + async () => { + const baseAegislashWeight = 53; + const autotomizeAegislashWeight = 0.1; + + await game.classicMode.startBattle([Species.AEGISLASH]); + const playerPokemon = game.scene.getPlayerPokemon()!; + + expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); + + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); + + // Transform to sword form + game.move.select(Moves.FALSE_SWIPE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); + + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); + + // Transform to shield form + game.move.select(Moves.KINGS_SHIELD); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); + + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(autotomizeAegislashWeight); + }, + TIMEOUT, + ); + + it( + "Autotomize should interact with light metal correctly", + async () => { + const baseLightGroudonWeight = 475; + const autotomizeLightGroudonWeight = 425; + game.override.ability(Abilities.LIGHT_METAL); + await game.classicMode.startBattle([Species.GROUDON]); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getWeight()).toBe(baseLightGroudonWeight); + game.move.select(Moves.AUTOTOMIZE); + await game.toNextTurn(); + expect(playerPokemon.getWeight()).toBe(autotomizeLightGroudonWeight); + }, + TIMEOUT, + ); +}); diff --git a/src/test/moves/baddy_bad.test.ts b/test/moves/baddy_bad.test.ts similarity index 87% rename from src/test/moves/baddy_bad.test.ts rename to test/moves/baddy_bad.test.ts index 1be25704393..cba13c7ac68 100644 --- a/src/test/moves/baddy_bad.test.ts +++ b/test/moves/baddy_bad.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -21,7 +21,7 @@ describe("Moves - Baddy Bad", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) @@ -31,7 +31,7 @@ describe("Moves - Baddy Bad", () => { it("should not activate Reflect if the move fails due to Protect", async () => { game.override.enemyMoveset(Moves.PROTECT); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.BADDY_BAD); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/baneful_bunker.test.ts b/test/moves/baneful_bunker.test.ts new file mode 100644 index 00000000000..4624d77dc42 --- /dev/null +++ b/test/moves/baneful_bunker.test.ts @@ -0,0 +1,82 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; +import { StatusEffect } from "#app/enums/status-effect"; + +describe("Moves - Baneful Bunker", () => { + 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.moveset(Moves.SLASH); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset(Moves.BANEFUL_BUNKER); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + test("should protect the user and poison attackers that make contact", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); + }); + test("should protect the user and poison attackers that make contact, regardless of accuracy checks", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + await game.move.forceMiss(); + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); + }); + + test("should not poison attackers that don't make contact", async () => { + game.override.moveset(Moves.FLASH_CANNON); + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FLASH_CANNON); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + await game.move.forceMiss(); + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeFalsy(); + }); +}); diff --git a/src/test/moves/baton_pass.test.ts b/test/moves/baton_pass.test.ts similarity index 73% rename from src/test/moves/baton_pass.test.ts rename to test/moves/baton_pass.test.ts index 9d4a9358715..9db6ec7c518 100644 --- a/src/test/moves/baton_pass.test.ts +++ b/test/moves/baton_pass.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; @@ -28,7 +28,7 @@ describe("Moves - Baton Pass", () => { .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.BATON_PASS, Moves.NASTY_PLOT, Moves.SPLASH ]) + .moveset([Moves.BATON_PASS, Moves.NASTY_PLOT, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .disableCrits(); @@ -36,7 +36,7 @@ describe("Moves - Baton Pass", () => { it("transfers all stat stages when player uses it", async () => { // arrange - await game.classicMode.startBattle([ Species.RAICHU, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); // round 1 - buff game.move.select(Moves.NASTY_PLOT); @@ -59,10 +59,8 @@ describe("Moves - Baton Pass", () => { it("passes stat stage buffs when AI uses it", async () => { // arrange - game.override - .startingWave(5) - .enemyMoveset(new Array(4).fill([ Moves.NASTY_PLOT ])); - await game.classicMode.startBattle([ Species.RAICHU, Species.SHUCKLE ]); + game.override.startingWave(5).enemyMoveset(new Array(4).fill([Moves.NASTY_PLOT])); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); // round 1 - ai buffs game.move.select(Moves.SPLASH); @@ -70,7 +68,7 @@ describe("Moves - Baton Pass", () => { // round 2 - baton pass game.scene.getEnemyPokemon()!.hp = 100; - game.override.enemyMoveset([ Moves.BATON_PASS ]); + game.override.enemyMoveset([Moves.BATON_PASS]); // Force moveset to update mid-battle // TODO: replace with enemy ai control function when it's added game.scene.getEnemyParty()[0].getMoveset(); @@ -87,35 +85,35 @@ describe("Moves - Baton Pass", () => { "MoveEffectPhase", "SwitchSummonPhase", "SummonPhase", - "PostSummonPhase" + "PostSummonPhase", ]); }, 20000); it("doesn't transfer effects that aren't transferrable", async () => { - game.override.enemyMoveset([ Moves.SALT_CURE ]); - await game.classicMode.startBattle([ Species.PIKACHU, Species.FEEBAS ]); + game.override.enemyMoveset([Moves.SALT_CURE]); + await game.classicMode.startBattle([Species.PIKACHU, Species.FEEBAS]); - const [ player1, player2 ] = game.scene.getParty(); + const [player1, player2] = game.scene.getPlayerParty(); game.move.select(Moves.BATON_PASS); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("MoveEndPhase"); - expect(player1.findTag((t) => t.tagType === BattlerTagType.SALT_CURED)).toBeTruthy(); + expect(player1.findTag(t => t.tagType === BattlerTagType.SALT_CURED)).toBeTruthy(); game.doSelectPartyPokemon(1); await game.toNextTurn(); - expect(player2.findTag((t) => t.tagType === BattlerTagType.SALT_CURED)).toBeUndefined(); + expect(player2.findTag(t => t.tagType === BattlerTagType.SALT_CURED)).toBeUndefined(); }, 20000); it("doesn't allow binding effects from the user to persist", async () => { - game.override.moveset([ Moves.FIRE_SPIN, Moves.BATON_PASS ]); + game.override.moveset([Moves.FIRE_SPIN, Moves.BATON_PASS]); - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.FIRE_SPIN); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.toNextTurn(); @@ -123,7 +121,7 @@ describe("Moves - Baton Pass", () => { expect(enemy.getTag(BattlerTagType.FIRE_SPIN)).toBeDefined(); game.move.select(Moves.BATON_PASS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); game.doSelectPartyPokemon(1); await game.toNextTurn(); diff --git a/test/moves/beak_blast.test.ts b/test/moves/beak_blast.test.ts new file mode 100644 index 00000000000..9f8b1e3d5c3 --- /dev/null +++ b/test/moves/beak_blast.test.ts @@ -0,0 +1,119 @@ +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { StatusEffect } from "#app/enums/status-effect"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { MovePhase } from "#app/phases/move-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Beak Blast", () => { + 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") + .ability(Abilities.UNNERVE) + .moveset([Moves.BEAK_BLAST]) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset([Moves.TACKLE]) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should add a charge effect that burns attackers on contact", async () => { + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); + }); + + it("should still charge and burn opponents if the user is sleeping", async () => { + game.override.statusEffect(StatusEffect.SLEEP); + + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.BURN); + }); + + it("should not burn attackers that don't make contact", async () => { + game.override.enemyMoveset([Moves.WATER_GUN]); + + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); + }); + + it("should only hit twice with Multi-Lens", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(leadPokemon.turnData.hitCount).toBe(2); + }); + + it("should be blocked by Protect", async () => { + game.override.enemyMoveset([Moves.PROTECT]); + + await game.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to(MovePhase, false); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeDefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.getTag(BattlerTagType.BEAK_BLAST_CHARGING)).toBeUndefined(); + }); +}); diff --git a/test/moves/beat_up.test.ts b/test/moves/beat_up.test.ts new file mode 100644 index 00000000000..7e67f2ea363 --- /dev/null +++ b/test/moves/beat_up.test.ts @@ -0,0 +1,85 @@ +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { StatusEffect } from "#app/enums/status-effect"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Beat Up", () => { + 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); + game.override.enemyLevel(100); + game.override.enemyMoveset([Moves.SPLASH]); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.moveset([Moves.BEAT_UP]); + }); + + it("should hit once for each healthy player Pokemon", async () => { + await game.startBattle([ + Species.MAGIKARP, + Species.BULBASAUR, + Species.CHARMANDER, + Species.SQUIRTLE, + Species.PIKACHU, + Species.EEVEE, + ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + let enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.BEAT_UP); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon.turnData.hitCount).toBe(6); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + + while (playerPokemon.turnData.hitsLeft > 0) { + enemyStartingHp = enemyPokemon.hp; + await game.phaseInterceptor.to(MoveEffectPhase); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + } + }); + + it("should not count player Pokemon with status effects towards hit count", async () => { + await game.startBattle([ + Species.MAGIKARP, + Species.BULBASAUR, + Species.CHARMANDER, + Species.SQUIRTLE, + Species.PIKACHU, + Species.EEVEE, + ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.scene.getPlayerParty()[1].trySetStatus(StatusEffect.BURN); + + game.move.select(Moves.BEAT_UP); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon.turnData.hitCount).toBe(5); + }); +}); diff --git a/test/moves/belly_drum.test.ts b/test/moves/belly_drum.test.ts new file mode 100644 index 00000000000..f01a50f8a79 --- /dev/null +++ b/test/moves/belly_drum.test.ts @@ -0,0 +1,102 @@ +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { toDmgValue } from "#app/utils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { Abilities } from "#app/enums/abilities"; + +// RATIO : HP Cost of Move +const RATIO = 2; +// PREDAMAGE : Amount of extra HP lost +const PREDAMAGE = 15; + +describe("Moves - BELLY DRUM", () => { + 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 + .starterSpecies(Species.MAGIKARP) + .enemySpecies(Species.SNORLAX) + .startingLevel(100) + .enemyLevel(100) + .moveset([Moves.BELLY_DRUM]) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH); + }); + + // Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Belly_Drum_(move) + + test("raises the user's ATK stat stage to its max, at the cost of 1/2 of its maximum HP", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + }); + + test("will still take effect if an uninvolved stat stage is at max", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + + // Here - Stat.ATK -> -3 and Stat.SPATK -> 6 + leadPokemon.setStatStage(Stat.ATK, -3); + leadPokemon.setStatStage(Stat.SPATK, 6); + + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + }); + + test("fails if the pokemon's ATK stat stage is at its maximum", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.setStatStage(Stat.ATK, 6); + + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + }); + + test("fails if the user's health is less than 1/2", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.move.select(Moves.BELLY_DRUM); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); +}); diff --git a/src/test/moves/burning_jealousy.test.ts b/test/moves/burning_jealousy.test.ts similarity index 72% rename from src/test/moves/burning_jealousy.test.ts rename to test/moves/burning_jealousy.test.ts index fe2735cfa96..60387df4226 100644 --- a/src/test/moves/burning_jealousy.test.ts +++ b/test/moves/burning_jealousy.test.ts @@ -1,14 +1,13 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { StatusEffect } from "#app/enums/status-effect"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Moves - Burning Jealousy", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -30,13 +29,12 @@ describe("Moves - Burning Jealousy", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.ICE_SCALES) - .enemyMoveset([ Moves.HOWL ]) + .enemyMoveset([Moves.HOWL]) .startingLevel(10) .enemyLevel(10) .starterSpecies(Species.FEEBAS) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.BURNING_JEALOUSY, Moves.GROWL ]); - + .moveset([Moves.BURNING_JEALOUSY, Moves.GROWL]); }); it("should burn the opponent if their stat stages were raised", async () => { @@ -45,33 +43,28 @@ describe("Moves - Burning Jealousy", () => { const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.BURNING_JEALOUSY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.status?.effect).toBe(StatusEffect.BURN); }); it("should still burn the opponent if their stat stages were both raised and lowered in the same turn", async () => { - game.override - .starterSpecies(0) - .battleType("double"); - await game.classicMode.startBattle([ Species.FEEBAS, Species.ABRA ]); + game.override.starterSpecies(0).battleType("double"); + await game.classicMode.startBattle([Species.FEEBAS, Species.ABRA]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.BURNING_JEALOUSY); game.move.select(Moves.GROWL, 1); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); expect(enemy.status?.effect).toBe(StatusEffect.BURN); }); it("should ignore stat stages raised by IMPOSTER", async () => { - game.override - .enemySpecies(Species.DITTO) - .enemyAbility(Abilities.IMPOSTER) - .enemyMoveset(Moves.SPLASH); + game.override.enemySpecies(Species.DITTO).enemyAbility(Abilities.IMPOSTER).enemyMoveset(Moves.SPLASH); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; @@ -82,20 +75,21 @@ describe("Moves - Burning Jealousy", () => { expect(enemy.status?.effect).toBeUndefined(); }); - it.skip("should ignore weakness policy", async () => { // TODO: Make this test if WP is implemented + // TODO: Make this test if WP is implemented + it.todo("should ignore weakness policy", async () => { await game.classicMode.startBattle(); }); it("should be boosted by Sheer Force even if opponent didn't raise stat stages", async () => { - game.override - .ability(Abilities.SHEER_FORCE) - .enemyMoveset(Moves.SPLASH); + game.override.ability(Abilities.SHEER_FORCE).enemyMoveset(Moves.SPLASH); vi.spyOn(allMoves[Moves.BURNING_JEALOUSY], "calculateBattlePower"); await game.classicMode.startBattle(); game.move.select(Moves.BURNING_JEALOUSY); await game.phaseInterceptor.to("BerryPhase"); - expect(allMoves[Moves.BURNING_JEALOUSY].calculateBattlePower).toHaveReturnedWith(allMoves[Moves.BURNING_JEALOUSY].power * 5461 / 4096); + expect(allMoves[Moves.BURNING_JEALOUSY].calculateBattlePower).toHaveReturnedWith( + (allMoves[Moves.BURNING_JEALOUSY].power * 5461) / 4096, + ); }); }); diff --git a/test/moves/camouflage.test.ts b/test/moves/camouflage.test.ts new file mode 100644 index 00000000000..0bbab6a629a --- /dev/null +++ b/test/moves/camouflage.test.ts @@ -0,0 +1,49 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { TerrainType } from "#app/data/terrain"; +import { PokemonType } from "#enums/pokemon-type"; +import { BattlerIndex } from "#app/battle"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Camouflage", () => { + 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.CAMOUFLAGE]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.REGIELEKI) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.PSYCHIC_TERRAIN); + }); + + it("Camouflage should look at terrain first when selecting a type to change into", async () => { + await game.classicMode.startBattle([Species.SHUCKLE]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.CAMOUFLAGE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTerrainType()).toBe(TerrainType.PSYCHIC); + const pokemonType = playerPokemon.getTypes()[0]; + expect(pokemonType).toBe(PokemonType.PSYCHIC); + }); +}); diff --git a/test/moves/ceaseless_edge.test.ts b/test/moves/ceaseless_edge.test.ts new file mode 100644 index 00000000000..d54f1bd9f21 --- /dev/null +++ b/test/moves/ceaseless_edge.test.ts @@ -0,0 +1,107 @@ +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/moves/move"; +import { Abilities } from "#app/enums/abilities"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; + +describe("Moves - Ceaseless Edge", () => { + 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.RATTATA); + game.override.enemyAbility(Abilities.RUN_AWAY); + game.override.enemyPassiveAbility(Abilities.RUN_AWAY); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR]); + game.override.enemyMoveset(Moves.SPLASH); + vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); + }); + + test("move should hit and apply spikes", async () => { + await game.classicMode.startBattle([Species.ILLUMISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.CEASELESS_EDGE); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Spikes should not have any layers before move effect is applied + const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); + + await game.phaseInterceptor.to(TurnEndPhase); + const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); + expect(tagAfter.layers).toBe(1); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }); + + test("move should hit twice with multi lens and apply two layers of spikes", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS" }]); + await game.classicMode.startBattle([Species.ILLUMISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.CEASELESS_EDGE); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Spikes should not have any layers before move effect is applied + const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); + + await game.phaseInterceptor.to(TurnEndPhase); + const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); + expect(tagAfter.layers).toBe(2); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }); + + test("trainer - move should hit twice, apply two layers of spikes, force switch opponent - opponent takes damage", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS" }]); + game.override.startingWave(25); + + await game.classicMode.startBattle([Species.ILLUMISE]); + + game.move.select(Moves.CEASELESS_EDGE); + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Spikes should not have any layers before move effect is applied + const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagBefore instanceof ArenaTrapTag).toBeFalsy(); + + await game.toNextTurn(); + const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; + expect(tagAfter instanceof ArenaTrapTag).toBeTruthy(); + expect(tagAfter.layers).toBe(2); + + const hpBeforeSpikes = game.scene.currentBattle.enemyParty[1].hp; + // Check HP of pokemon that WILL BE switched in (index 1) + game.forceEnemyToSwitch(); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase, false); + expect(game.scene.currentBattle.enemyParty[0].hp).toBeLessThan(hpBeforeSpikes); + }); +}); diff --git a/src/test/moves/chilly_reception.test.ts b/test/moves/chilly_reception.test.ts similarity index 85% rename from src/test/moves/chilly_reception.test.ts rename to test/moves/chilly_reception.test.ts index 664ca242b20..f90aaf6bb02 100644 --- a/src/test/moves/chilly_reception.test.ts +++ b/test/moves/chilly_reception.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { WeatherType } from "#enums/weather-type"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; //import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -23,16 +23,16 @@ describe("Moves - Chilly Reception", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") - .moveset([ Moves.CHILLY_RECEPTION, Moves.SNOWSCAPE ]) + game.override + .battleType("single") + .moveset([Moves.CHILLY_RECEPTION, Moves.SNOWSCAPE]) .enemyMoveset(Array(4).fill(Moves.SPLASH)) .enemyAbility(Abilities.NONE) .ability(Abilities.NONE); - }); it("should still change the weather if user can't switch out", async () => { - await game.classicMode.startBattle([ Species.SLOWKING ]); + await game.classicMode.startBattle([Species.SLOWKING]); game.move.select(Moves.CHILLY_RECEPTION); @@ -41,7 +41,7 @@ describe("Moves - Chilly Reception", () => { }); it("should switch out even if it's snowing", async () => { - await game.classicMode.startBattle([ Species.SLOWKING, Species.MEOWTH ]); + await game.classicMode.startBattle([Species.SLOWKING, Species.MEOWTH]); // first turn set up snow with snowscape, try chilly reception on second turn game.move.select(Moves.SNOWSCAPE); await game.phaseInterceptor.to("BerryPhase", false); @@ -57,8 +57,7 @@ describe("Moves - Chilly Reception", () => { }); it("happy case - switch out and weather changes", async () => { - - await game.classicMode.startBattle([ Species.SLOWKING, Species.MEOWTH ]); + await game.classicMode.startBattle([Species.SLOWKING, Species.MEOWTH]); game.move.select(Moves.CHILLY_RECEPTION); game.doSelectPartyPokemon(1); @@ -70,12 +69,13 @@ describe("Moves - Chilly Reception", () => { // enemy uses another move and weather doesn't change it("check case - enemy not selecting chilly reception doesn't change weather ", async () => { - game.override.battleType("single") - .enemyMoveset([ Moves.CHILLY_RECEPTION, Moves.TACKLE ]) + game.override + .battleType("single") + .enemyMoveset([Moves.CHILLY_RECEPTION, Moves.TACKLE]) .enemyAbility(Abilities.NONE) .moveset(Array(4).fill(Moves.SPLASH)); - await game.classicMode.startBattle([ Species.SLOWKING, Species.MEOWTH ]); + await game.classicMode.startBattle([Species.SLOWKING, Species.MEOWTH]); game.move.select(Moves.SPLASH); await game.forceEnemyMove(Moves.TACKLE); @@ -85,14 +85,15 @@ describe("Moves - Chilly Reception", () => { }); it("enemy trainer - expected behavior ", async () => { - game.override.battleType("single") + game.override + .battleType("single") .startingWave(8) .enemyMoveset(Array(4).fill(Moves.CHILLY_RECEPTION)) .enemyAbility(Abilities.NONE) .enemySpecies(Species.MAGIKARP) - .moveset([ Moves.SPLASH, Moves.THUNDERBOLT ]); + .moveset([Moves.SPLASH, Moves.THUNDERBOLT]); - await game.classicMode.startBattle([ Species.JOLTEON ]); + await game.classicMode.startBattle([Species.JOLTEON]); const RIVAL_MAGIKARP1 = game.scene.getEnemyPokemon()?.id; game.move.select(Moves.SPLASH); @@ -119,6 +120,5 @@ describe("Moves - Chilly Reception", () => { game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("BerryPhase", false); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SNOW); - }); }); diff --git a/test/moves/chloroblast.test.ts b/test/moves/chloroblast.test.ts new file mode 100644 index 00000000000..f08eca100c4 --- /dev/null +++ b/test/moves/chloroblast.test.ts @@ -0,0 +1,42 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Chloroblast", () => { + 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.CHLOROBLAST]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.PROTECT); + }); + + it("should not deal recoil damage if the opponent uses protect", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.CHLOROBLAST); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.isFullHp()).toBe(true); + }); +}); diff --git a/test/moves/clangorous_soul.test.ts b/test/moves/clangorous_soul.test.ts new file mode 100644 index 00000000000..56f19a0e088 --- /dev/null +++ b/test/moves/clangorous_soul.test.ts @@ -0,0 +1,119 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#test/testUtils/gameManager"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; + +/** HP Cost of Move */ +const RATIO = 3; +/** Amount of extra HP lost */ +const PREDAMAGE = 15; + +describe("Moves - Clangorous Soul", () => { + 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.starterSpecies(Species.MAGIKARP); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.CLANGOROUS_SOUL]); + game.override.enemyMoveset(Moves.SPLASH); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move) + + it("raises the user's ATK, DEF, SPATK, SPDEF, and SPD stat stages by 1 each at the cost of 1/3 of its maximum HP", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + game.move.select(Moves.CLANGOROUS_SOUL); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(1); + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(1); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(1); + expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(1); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1); + }); + + it("will still take effect if one or more of the involved stat stages are not at max", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + + //Here - Stat.SPD -> 0 and Stat.SPDEF -> 4 + leadPokemon.setStatStage(Stat.ATK, 6); + leadPokemon.setStatStage(Stat.DEF, 6); + leadPokemon.setStatStage(Stat.SPATK, 6); + leadPokemon.setStatStage(Stat.SPDEF, 4); + + game.move.select(Moves.CLANGOROUS_SOUL); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(5); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1); + }); + + it("fails if all stat stages involved are at max", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.setStatStage(Stat.ATK, 6); + leadPokemon.setStatStage(Stat.DEF, 6); + leadPokemon.setStatStage(Stat.SPATK, 6); + leadPokemon.setStatStage(Stat.SPDEF, 6); + leadPokemon.setStatStage(Stat.SPD, 6); + + game.move.select(Moves.CLANGOROUS_SOUL); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6); + }); + + it("fails if the user's health is less than 1/3", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.move.select(Moves.CLANGOROUS_SOUL); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0); + }); +}); diff --git a/test/moves/copycat.test.ts b/test/moves/copycat.test.ts new file mode 100644 index 00000000000..c7242f0940e --- /dev/null +++ b/test/moves/copycat.test.ts @@ -0,0 +1,89 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves, RandomMoveAttr } from "#app/data/moves/move"; +import { Stat } from "#app/enums/stat"; +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/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Copycat", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const randomMoveAttr = allMoves[Moves.METRONOME].getAttrs(RandomMoveAttr)[0]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([Moves.COPYCAT, Moves.SPIKY_SHIELD, Moves.SWORDS_DANCE, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .starterSpecies(Species.FEEBAS) + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should copy the last move successfully executed", async () => { + game.override.enemyMoveset(Moves.SUCKER_PUNCH); + await game.classicMode.startBattle(); + + game.move.select(Moves.SWORDS_DANCE); + await game.toNextTurn(); + + game.move.select(Moves.COPYCAT); // Last successful move should be Swords Dance + await game.toNextTurn(); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(4); + }); + + it("should fail when the last move used is not a valid Copycat move", async () => { + game.override.enemyMoveset(Moves.PROTECT); // Protect is not a valid move for Copycat to copy + await game.classicMode.startBattle(); + + game.move.select(Moves.SPIKY_SHIELD); // Spiky Shield is not a valid move for Copycat to copy + await game.toNextTurn(); + + game.move.select(Moves.COPYCAT); + await game.toNextTurn(); + + expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should copy the called move when the last move successfully calls another", async () => { + game.override.moveset([Moves.SPLASH, Moves.METRONOME]).enemyMoveset(Moves.COPYCAT); + await game.classicMode.startBattle(); + vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.SWORDS_DANCE); + + game.move.select(Moves.METRONOME); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); // Player moves first, so enemy can copy Swords Dance + await game.toNextTurn(); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(2); + }); + + it("should apply secondary effects of a move", async () => { + game.override.enemyMoveset(Moves.ACID_SPRAY); // Secondary effect lowers SpDef by 2 stages + await game.classicMode.startBattle(); + + game.move.select(Moves.COPYCAT); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPDEF)).toBe(-2); + }); +}); diff --git a/test/moves/crafty_shield.test.ts b/test/moves/crafty_shield.test.ts new file mode 100644 index 00000000000..3a2df6a3446 --- /dev/null +++ b/test/moves/crafty_shield.test.ts @@ -0,0 +1,110 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Stat } from "#enums/stat"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { CommandPhase } from "#app/phases/command-phase"; + +describe("Moves - Crafty Shield", () => { + 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("double"); + + game.override.moveset([Moves.CRAFTY_SHIELD, Moves.SPLASH, Moves.SWORDS_DANCE]); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset([Moves.GROWL]); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test("should protect the user and allies from status moves", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.CRAFTY_SHIELD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }); + + test("should not protect the user and allies from attack moves", async () => { + game.override.enemyMoveset([Moves.TACKLE]); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.CRAFTY_SHIELD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); + }); + + test("should protect the user and allies from moves that ignore other protection", async () => { + game.override.enemySpecies(Species.DUSCLOPS); + game.override.enemyMoveset([Moves.CURSE]); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.CRAFTY_SHIELD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.getTag(BattlerTagType.CURSED)).toBeUndefined()); + }); + + test("should not block allies' self-targeted moves", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.CRAFTY_SHIELD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SWORDS_DANCE, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon[0].getStatStage(Stat.ATK)).toBe(0); + expect(leadPokemon[1].getStatStage(Stat.ATK)).toBe(2); + }); +}); diff --git a/test/moves/defog.test.ts b/test/moves/defog.test.ts new file mode 100644 index 00000000000..64904e964c4 --- /dev/null +++ b/test/moves/defog.test.ts @@ -0,0 +1,69 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Defog", () => { + 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.MIST, Moves.SAFEGUARD, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.DEFOG, Moves.GROWL]); + }); + + it("should not allow Safeguard to be active", async () => { + await game.classicMode.startBattle([Species.REGIELEKI]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SAFEGUARD); + await game.forceEnemyMove(Moves.DEFOG); + await game.phaseInterceptor.to("BerryPhase"); + + expect(playerPokemon[0].isSafeguarded(enemyPokemon[0])).toBe(false); + + expect(true).toBe(true); + }); + + it("should not allow Mist to be active", async () => { + await game.classicMode.startBattle([Species.REGIELEKI]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.MIST); + await game.forceEnemyMove(Moves.DEFOG); + + await game.toNextTurn(); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.GROWL); + + await game.phaseInterceptor.to("BerryPhase"); + + expect(playerPokemon[0].getStatStage(Stat.ATK)).toBe(-1); + + expect(true).toBe(true); + }); +}); diff --git a/src/test/moves/destiny_bond.test.ts b/test/moves/destiny_bond.test.ts similarity index 85% rename from src/test/moves/destiny_bond.test.ts rename to test/moves/destiny_bond.test.ts index 4b4c8782862..c39d40427ad 100644 --- a/src/test/moves/destiny_bond.test.ts +++ b/test/moves/destiny_bond.test.ts @@ -1,24 +1,24 @@ -import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; -import { allMoves } from "#app/data/move"; +import type { ArenaTrapTag } from "#app/data/arena-tag"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; import { StatusEffect } from "#enums/status-effect"; import { PokemonInstantReviveModifier } from "#app/modifier/modifier"; - describe("Moves - Destiny Bond", () => { let phaserGame: Phaser.Game; let game: GameManager; - const defaultParty = [ Species.BULBASAUR, Species.SQUIRTLE ]; - const enemyFirst = [ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]; - const playerFirst = [ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]; + const defaultParty = [Species.BULBASAUR, Species.SQUIRTLE]; + const enemyFirst = [BattlerIndex.ENEMY, BattlerIndex.PLAYER]; + const playerFirst = [BattlerIndex.PLAYER, BattlerIndex.ENEMY]; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -32,7 +32,8 @@ describe("Moves - Destiny Bond", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .ability(Abilities.UNNERVE) // Pre-emptively prevent flakiness from opponent berries .enemySpecies(Species.RATTATA) .enemyAbility(Abilities.RUN_AWAY) @@ -61,7 +62,7 @@ describe("Moves - Destiny Bond", () => { it("should KO the opponent on the next turn", async () => { const moveToUse = Moves.TACKLE; - game.override.moveset([ Moves.SPLASH, moveToUse ]); + game.override.moveset([Moves.SPLASH, moveToUse]); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -87,7 +88,7 @@ describe("Moves - Destiny Bond", () => { it("should fail if used twice in a row", async () => { const moveToUse = Moves.TACKLE; - game.override.moveset([ Moves.SPLASH, moveToUse ]); + game.override.moveset([Moves.SPLASH, moveToUse]); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -114,8 +115,7 @@ describe("Moves - Destiny Bond", () => { // Opponent will be reduced to 1 HP by False Swipe, then faint to Sandstorm const moveToUse = Moves.FALSE_SWIPE; - game.override.moveset(moveToUse) - .ability(Abilities.SAND_STREAM); + game.override.moveset(moveToUse).ability(Abilities.SAND_STREAM); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -132,7 +132,7 @@ describe("Moves - Destiny Bond", () => { it("should not KO the opponent if the user had another turn", async () => { const moveToUse = Moves.TACKLE; - game.override.moveset([ Moves.SPORE, moveToUse ]); + game.override.moveset([Moves.SPORE, moveToUse]); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -157,9 +157,8 @@ describe("Moves - Destiny Bond", () => { }); it("should not KO an ally", async () => { - game.override.moveset([ Moves.DESTINY_BOND, Moves.CRUNCH ]) - .battleType("double"); - await game.classicMode.startBattle([ Species.SHEDINJA, Species.BULBASAUR, Species.SQUIRTLE ]); + game.override.moveset([Moves.DESTINY_BOND, Moves.CRUNCH]).battleType("double"); + await game.classicMode.startBattle([Species.SHEDINJA, Species.BULBASAUR, Species.SQUIRTLE]); const enemyPokemon0 = game.scene.getEnemyField()[0]; const enemyPokemon1 = game.scene.getEnemyField()[1]; @@ -169,7 +168,7 @@ describe("Moves - Destiny Bond", () => { // Shedinja uses Destiny Bond, then ally Bulbasaur KO's Shedinja with Crunch game.move.select(Moves.DESTINY_BOND, 0); game.move.select(Moves.CRUNCH, 1, BattlerIndex.PLAYER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); expect(enemyPokemon0?.isFainted()).toBe(false); @@ -202,8 +201,7 @@ describe("Moves - Destiny Bond", () => { }); it("should not cause a crash if the user is KO'd by Pledge moves", async () => { - game.override.moveset([ Moves.GRASS_PLEDGE, Moves.WATER_PLEDGE ]) - .battleType("double"); + game.override.moveset([Moves.GRASS_PLEDGE, Moves.WATER_PLEDGE]).battleType("double"); await game.classicMode.startBattle(defaultParty); const enemyPokemon0 = game.scene.getEnemyField()[0]; @@ -213,7 +211,7 @@ describe("Moves - Destiny Bond", () => { game.move.select(Moves.GRASS_PLEDGE, 0, BattlerIndex.ENEMY); game.move.select(Moves.WATER_PLEDGE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); await game.phaseInterceptor.to("BerryPhase"); expect(enemyPokemon0?.isFainted()).toBe(true); @@ -234,8 +232,7 @@ describe("Moves - Destiny Bond", () => { it("should not allow the opponent to revive via Reviver Seed", async () => { const moveToUse = Moves.TACKLE; - game.override.moveset(moveToUse) - .startingHeldItems([{ name: "REVIVER_SEED" }]); + game.override.moveset(moveToUse).startingHeldItems([{ name: "REVIVER_SEED" }]); await game.classicMode.startBattle(defaultParty); const enemyPokemon = game.scene.getEnemyPokemon(); @@ -249,7 +246,9 @@ describe("Moves - Destiny Bond", () => { expect(playerPokemon?.isFainted()).toBe(true); // Check that the Tackle user's Reviver Seed did not activate - const revSeeds = game.scene.getModifiers(PokemonInstantReviveModifier).filter(m => m.pokemonId === playerPokemon?.id); + const revSeeds = game.scene + .getModifiers(PokemonInstantReviveModifier) + .filter(m => m.pokemonId === playerPokemon?.id); expect(revSeeds.length).toBe(1); }); }); diff --git a/src/test/moves/diamond_storm.test.ts b/test/moves/diamond_storm.test.ts similarity index 86% rename from src/test/moves/diamond_storm.test.ts rename to test/moves/diamond_storm.test.ts index 6e5be2a790d..2363122f0d7 100644 --- a/src/test/moves/diamond_storm.test.ts +++ b/test/moves/diamond_storm.test.ts @@ -1,9 +1,9 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -24,7 +24,7 @@ describe("Moves - Diamond Storm", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.DIAMOND_STORM ]) + .moveset([Moves.DIAMOND_STORM]) .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) @@ -36,7 +36,7 @@ describe("Moves - Diamond Storm", () => { const diamondStorm = allMoves[Moves.DIAMOND_STORM]; vi.spyOn(diamondStorm, "chance", "get").mockReturnValue(100); vi.spyOn(diamondStorm, "accuracy", "get").mockReturnValue(100); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.DIAMOND_STORM); await game.phaseInterceptor.to("BerryPhase"); diff --git a/src/test/moves/dig.test.ts b/test/moves/dig.test.ts similarity index 88% rename from src/test/moves/dig.test.ts rename to test/moves/dig.test.ts index 4c6b5d3b75d..81339111656 100644 --- a/src/test/moves/dig.test.ts +++ b/test/moves/dig.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; @@ -7,7 +7,7 @@ import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import { MoveResult } from "#app/field/pokemon"; import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; describe("Moves - Dig", () => { let phaserGame: Phaser.Game; @@ -36,7 +36,7 @@ describe("Moves - Dig", () => { }); it("should make the user semi-invulnerable, then attack over 2 turns", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -62,7 +62,7 @@ describe("Moves - Dig", () => { it("should not allow the user to evade attacks from Pokemon with No Guard", async () => { game.override.enemyAbility(Abilities.NO_GUARD); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -75,11 +75,9 @@ describe("Moves - Dig", () => { }); it("should not expend PP when the attack phase is cancelled", async () => { - game.override - .enemyAbility(Abilities.NO_GUARD) - .enemyMoveset(Moves.SPORE); + game.override.enemyAbility(Abilities.NO_GUARD).enemyMoveset(Moves.SPORE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -94,7 +92,7 @@ describe("Moves - Dig", () => { }); it("should cause the user to take double damage from Earthquake", async () => { - await game.classicMode.startBattle([ Species.DONDOZO ]); + await game.classicMode.startBattle([Species.DONDOZO]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -102,7 +100,7 @@ describe("Moves - Dig", () => { const preDigEarthquakeDmg = playerPokemon.getAttackDamage(enemyPokemon, allMoves[Moves.EARTHQUAKE]).damage; game.move.select(Moves.DIG); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEffectPhase"); diff --git a/src/test/moves/disable.test.ts b/test/moves/disable.test.ts similarity index 60% rename from src/test/moves/disable.test.ts rename to test/moves/disable.test.ts index 3748598fa90..fdfb748df9d 100644 --- a/src/test/moves/disable.test.ts +++ b/test/moves/disable.test.ts @@ -3,7 +3,7 @@ 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 GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Disable", () => { @@ -12,7 +12,7 @@ describe("Moves - Disable", () => { beforeAll(() => { phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS + type: Phaser.HEADLESS, }); }); @@ -26,7 +26,7 @@ describe("Moves - Disable", () => { .battleType("single") .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.DISABLE, Moves.SPLASH ]) + .moveset([Moves.DISABLE, Moves.SPLASH]) .enemyMoveset(Moves.SPLASH) .starterSpecies(Species.PIKACHU) .enemySpecies(Species.SHUCKLE); @@ -38,34 +38,37 @@ describe("Moves - Disable", () => { const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyMon.getMoveHistory()).toHaveLength(1); expect(enemyMon.isMoveRestricted(Moves.SPLASH)).toBe(true); }); - it("fails if enemy has no move history", async() => { + it("fails if enemy has no move history", async () => { await game.classicMode.startBattle(); const playerMon = game.scene.getPlayerPokemon()!; const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); - expect(playerMon.getMoveHistory()[0]).toMatchObject({ move: Moves.DISABLE, result: MoveResult.FAIL }); + expect(playerMon.getMoveHistory()[0]).toMatchObject({ + move: Moves.DISABLE, + result: MoveResult.FAIL, + }); expect(enemyMon.isMoveRestricted(Moves.SPLASH)).toBe(false); }, 20000); - it("causes STRUGGLE if all usable moves are disabled", async() => { + it("causes STRUGGLE if all usable moves are disabled", async () => { await game.classicMode.startBattle(); const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); game.move.select(Moves.SPLASH); @@ -77,15 +80,15 @@ describe("Moves - Disable", () => { expect(enemyHistory[1].move).toBe(Moves.STRUGGLE); }, 20000); - it("cannot disable STRUGGLE", async() => { - game.override.enemyMoveset([ Moves.STRUGGLE ]); + it("cannot disable STRUGGLE", async () => { + game.override.enemyMoveset([Moves.STRUGGLE]); await game.classicMode.startBattle(); const playerMon = game.scene.getPlayerPokemon()!; const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(playerMon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); @@ -93,7 +96,7 @@ describe("Moves - Disable", () => { expect(enemyMon.isMoveRestricted(Moves.STRUGGLE)).toBe(false); }, 20000); - it("interrupts target's move when target moves after", async() => { + it("interrupts target's move when target moves after", async () => { await game.classicMode.startBattle(); const enemyMon = game.scene.getEnemyPokemon()!; @@ -103,26 +106,49 @@ describe("Moves - Disable", () => { // Both mons just used Splash last turn; now have player use Disable. game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); const enemyHistory = enemyMon.getMoveHistory(); expect(enemyHistory).toHaveLength(2); - expect(enemyHistory[0]).toMatchObject({ move: Moves.SPLASH, result: MoveResult.SUCCESS }); + expect(enemyHistory[0]).toMatchObject({ + move: Moves.SPLASH, + result: MoveResult.SUCCESS, + }); expect(enemyHistory[1].result).toBe(MoveResult.FAIL); }, 20000); - it("disables NATURE POWER, not the move invoked by it", async() => { - game.override.enemyMoveset([ Moves.NATURE_POWER ]); + it("disables NATURE POWER, not the move invoked by it", async () => { + game.override.enemyMoveset([Moves.NATURE_POWER]); await game.classicMode.startBattle(); const enemyMon = game.scene.getEnemyPokemon()!; game.move.select(Moves.DISABLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyMon.isMoveRestricted(Moves.NATURE_POWER)).toBe(true); - expect(enemyMon.isMoveRestricted(enemyMon.getLastXMoves(2)[1].move)).toBe(false); + expect(enemyMon.isMoveRestricted(enemyMon.getLastXMoves(2)[0].move)).toBe(false); + }, 20000); + + it("disables most recent move", async () => { + game.override.enemyMoveset([Moves.SPLASH, Moves.TACKLE]); + await game.classicMode.startBattle(); + + const enemyMon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + game.move.select(Moves.DISABLE); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(enemyMon.isMoveRestricted(Moves.TACKLE)).toBe(true); + expect(enemyMon.isMoveRestricted(Moves.SPLASH)).toBe(false); }, 20000); }); diff --git a/src/test/moves/dive.test.ts b/test/moves/dive.test.ts similarity index 88% rename from src/test/moves/dive.test.ts rename to test/moves/dive.test.ts index b60416d7740..8d7b0f9dd00 100644 --- a/src/test/moves/dive.test.ts +++ b/test/moves/dive.test.ts @@ -4,7 +4,7 @@ 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; import { WeatherType } from "#enums/weather-type"; @@ -36,7 +36,7 @@ describe("Moves - Dive", () => { }); it("should make the user semi-invulnerable, then attack over 2 turns", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -62,7 +62,7 @@ describe("Moves - Dive", () => { it("should not allow the user to evade attacks from Pokemon with No Guard", async () => { game.override.enemyAbility(Abilities.NO_GUARD); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -75,11 +75,9 @@ describe("Moves - Dive", () => { }); it("should not expend PP when the attack phase is cancelled", async () => { - game.override - .enemyAbility(Abilities.NO_GUARD) - .enemyMoveset(Moves.SPORE); + game.override.enemyAbility(Abilities.NO_GUARD).enemyMoveset(Moves.SPORE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -94,11 +92,9 @@ describe("Moves - Dive", () => { }); it("should trigger on-contact post-defend ability effects", async () => { - game.override - .enemyAbility(Abilities.ROUGH_SKIN) - .enemyMoveset(Moves.SPLASH); + game.override.enemyAbility(Abilities.ROUGH_SKIN).enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -115,7 +111,7 @@ describe("Moves - Dive", () => { it("should cancel attack after Harsh Sunlight is set", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/moves/doodle.test.ts b/test/moves/doodle.test.ts new file mode 100644 index 00000000000..822e415c918 --- /dev/null +++ b/test/moves/doodle.test.ts @@ -0,0 +1,69 @@ +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Doodle", () => { + 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.DOODLE]) + .ability(Abilities.ADAPTABILITY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should copy the opponent's ability in singles", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.DOODLE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should copy the opponent's ability to itself and its ally in doubles", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); + + game.move.select(Moves.DOODLE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerField()[0].getAbility().id).toBe(Abilities.BALL_FETCH); + expect(game.scene.getPlayerField()[1].getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should activate post-summon abilities", async () => { + game.override.battleType("double").enemyAbility(Abilities.INTIMIDATE); + + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); + + game.move.select(Moves.DOODLE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + // Enemies should have been intimidated twice + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-2); + }); +}); diff --git a/src/test/moves/double_team.test.ts b/test/moves/double_team.test.ts similarity index 81% rename from src/test/moves/double_team.test.ts rename to test/moves/double_team.test.ts index 62848553e06..f6791573132 100644 --- a/src/test/moves/double_team.test.ts +++ b/test/moves/double_team.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#app/enums/abilities"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -24,16 +24,16 @@ describe("Moves - Double Team", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.DOUBLE_TEAM ]); + game.override.moveset([Moves.DOUBLE_TEAM]); game.override.disableCrits(); game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); it("raises the user's EVA stat stage by 1", async () => { - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const ally = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -46,6 +46,6 @@ describe("Moves - Double Team", () => { await game.toNextTurn(); expect(ally.getStatStage(Stat.EVA)).toBe(1); - expect(enemy.getAccuracyMultiplier).toHaveReturnedWith(.75); + expect(enemy.getAccuracyMultiplier).toHaveReturnedWith(0.75); }); }); diff --git a/src/test/moves/dragon_cheer.test.ts b/test/moves/dragon_cheer.test.ts similarity index 71% rename from src/test/moves/dragon_cheer.test.ts rename to test/moves/dragon_cheer.test.ts index 37b74d44360..30d5af3a51b 100644 --- a/src/test/moves/dragon_cheer.test.ts +++ b/test/moves/dragon_cheer.test.ts @@ -1,9 +1,9 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -27,11 +27,11 @@ describe("Moves - Dragon Cheer", () => { .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .enemyLevel(20) - .moveset([ Moves.DRAGON_CHEER, Moves.TACKLE, Moves.SPLASH ]); + .moveset([Moves.DRAGON_CHEER, Moves.TACKLE, Moves.SPLASH]); }); it("increases the user's allies' critical hit ratio by one stage", async () => { - await game.classicMode.startBattle([ Species.DRAGONAIR, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.DRAGONAIR, Species.MAGIKARP]); const enemy = game.scene.getEnemyField()[0]; @@ -40,7 +40,7 @@ describe("Moves - Dragon Cheer", () => { game.move.select(Moves.DRAGON_CHEER, 0); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); // After Tackle await game.phaseInterceptor.to("TurnEndPhase"); @@ -48,7 +48,7 @@ describe("Moves - Dragon Cheer", () => { }); it("increases the user's Dragon-type allies' critical hit ratio by two stages", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.DRAGONAIR ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.DRAGONAIR]); const enemy = game.scene.getEnemyField()[0]; @@ -57,7 +57,7 @@ describe("Moves - Dragon Cheer", () => { game.move.select(Moves.DRAGON_CHEER, 0); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); // After Tackle await game.phaseInterceptor.to("TurnEndPhase"); @@ -65,7 +65,7 @@ describe("Moves - Dragon Cheer", () => { }); it("applies the effect based on the allies' type upon use of the move, and do not change if the allies' type changes later in battle", async () => { - await game.classicMode.startBattle([ Species.DRAGONAIR, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.DRAGONAIR, Species.MAGIKARP]); const magikarp = game.scene.getPlayerField()[1]; const enemy = game.scene.getEnemyField()[0]; @@ -75,7 +75,7 @@ describe("Moves - Dragon Cheer", () => { game.move.select(Moves.DRAGON_CHEER, 0); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); // After Tackle await game.phaseInterceptor.to("TurnEndPhase"); @@ -84,13 +84,13 @@ describe("Moves - Dragon Cheer", () => { await game.toNextTurn(); // Change Magikarp's type to Dragon - vi.spyOn(magikarp, "getTypes").mockReturnValue([ Type.DRAGON ]); - expect(magikarp.getTypes()).toEqual([ Type.DRAGON ]); + vi.spyOn(magikarp, "getTypes").mockReturnValue([PokemonType.DRAGON]); + expect(magikarp.getTypes()).toEqual([PokemonType.DRAGON]); game.move.select(Moves.SPLASH, 0); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getCritStage).toHaveReturnedWith(1); // getCritStage is called on defender diff --git a/src/test/moves/dragon_rage.test.ts b/test/moves/dragon_rage.test.ts similarity index 74% rename from src/test/moves/dragon_rage.test.ts rename to test/moves/dragon_rage.test.ts index dcbed7107e6..99d66421463 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/test/moves/dragon_rage.test.ts @@ -1,13 +1,12 @@ import { Stat } from "#enums/stat"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Species } from "#app/enums/species"; -import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; -import { modifierTypes } from "#app/modifier/modifier-type"; +import type { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -35,7 +34,7 @@ describe("Moves - Dragon Rage", () => { game.override.battleType("single"); game.override.starterSpecies(Species.SNORLAX); - game.override.moveset([ Moves.DRAGON_RAGE ]); + game.override.moveset([Moves.DRAGON_RAGE]); game.override.ability(Abilities.BALL_FETCH); game.override.passiveAbility(Abilities.BALL_FETCH); game.override.startingLevel(100); @@ -46,19 +45,15 @@ describe("Moves - Dragon Rage", () => { game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); - await game.startBattle(); + await game.classicMode.startBattle(); - partyPokemon = game.scene.getParty()[0]; + partyPokemon = game.scene.getPlayerParty()[0]; enemyPokemon = game.scene.getEnemyPokemon()!; - - // remove berries - game.scene.removePartyMemberModifiers(0); - game.scene.clearEnemyHeldItemModifiers(); }); it("ignores weaknesses", async () => { game.override.disableCrits(); - vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([ Type.DRAGON ]); + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([PokemonType.DRAGON]); game.move.select(Moves.DRAGON_RAGE); await game.phaseInterceptor.to(TurnEndPhase); @@ -68,7 +63,7 @@ describe("Moves - Dragon Rage", () => { it("ignores resistances", async () => { game.override.disableCrits(); - vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([ Type.STEEL ]); + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([PokemonType.STEEL]); game.move.select(Moves.DRAGON_RAGE); await game.phaseInterceptor.to(TurnEndPhase); @@ -88,7 +83,7 @@ describe("Moves - Dragon Rage", () => { it("ignores stab", async () => { game.override.disableCrits(); - vi.spyOn(partyPokemon, "getTypes").mockReturnValue([ Type.DRAGON ]); + vi.spyOn(partyPokemon, "getTypes").mockReturnValue([PokemonType.DRAGON]); game.move.select(Moves.DRAGON_RAGE); await game.phaseInterceptor.to(TurnEndPhase); @@ -114,14 +109,4 @@ describe("Moves - Dragon Rage", () => { expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage); }); - - it("ignores multi hit", async () => { - game.override.disableCrits(); - game.scene.addModifier(modifierTypes.MULTI_LENS().newModifier(partyPokemon), false); - - game.move.select(Moves.DRAGON_RAGE); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage); - }); }); diff --git a/test/moves/dragon_tail.test.ts b/test/moves/dragon_tail.test.ts new file mode 100644 index 00000000000..37e8aa2fe1b --- /dev/null +++ b/test/moves/dragon_tail.test.ts @@ -0,0 +1,307 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/moves/move"; +import { Status } from "#app/data/status-effect"; +import { Challenges } from "#enums/challenges"; +import { StatusEffect } from "#enums/status-effect"; +import { PokemonType } from "#enums/pokemon-type"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Dragon Tail", () => { + 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") + .moveset([Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER]) + .enemySpecies(Species.WAILORD) + .enemyMoveset(Moves.SPLASH) + .startingLevel(5) + .enemyLevel(5); + + vi.spyOn(allMoves[Moves.DRAGON_TAIL], "accuracy", "get").mockReturnValue(100); + }); + + it("should cause opponent to flee, and not crash", async () => { + await game.classicMode.startBattle([Species.DRATINI]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DRAGON_TAIL); + + await game.phaseInterceptor.to("BerryPhase"); + + const isVisible = enemyPokemon.visible; + const hasFled = enemyPokemon.switchOutStatus; + expect(!isVisible && hasFled).toBe(true); + + // simply want to test that the game makes it this far without crashing + await game.phaseInterceptor.to("BattleEndPhase"); + }); + + it("should cause opponent to flee, display ability, and not crash", async () => { + game.override.enemyAbility(Abilities.ROUGH_SKIN); + await game.classicMode.startBattle([Species.DRATINI]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DRAGON_TAIL); + + await game.phaseInterceptor.to("BerryPhase"); + + const isVisible = enemyPokemon.visible; + const hasFled = enemyPokemon.switchOutStatus; + expect(!isVisible && hasFled).toBe(true); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }); + + it("should proceed without crashing in a double battle", async () => { + game.override.battleType("double").enemyMoveset(Moves.SPLASH).enemyAbility(Abilities.ROUGH_SKIN); + await game.classicMode.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]); + + const leadPokemon = game.scene.getPlayerParty()[0]!; + + const enemyLeadPokemon = game.scene.getEnemyParty()[0]!; + const enemySecPokemon = game.scene.getEnemyParty()[1]!; + + game.move.select(Moves.DRAGON_TAIL, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("TurnEndPhase"); + + const isVisibleLead = enemyLeadPokemon.visible; + const hasFledLead = enemyLeadPokemon.switchOutStatus; + const isVisibleSec = enemySecPokemon.visible; + const hasFledSec = enemySecPokemon.switchOutStatus; + expect(!isVisibleLead && hasFledLead && isVisibleSec && !hasFledSec).toBe(true); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + + // second turn + game.move.select(Moves.FLAMETHROWER, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase"); + expect(enemySecPokemon.hp).toBeLessThan(enemySecPokemon.getMaxHp()); + }); + + it("should redirect targets upon opponent flee", async () => { + game.override.battleType("double").enemyMoveset(Moves.SPLASH).enemyAbility(Abilities.ROUGH_SKIN); + await game.classicMode.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]); + + const leadPokemon = game.scene.getPlayerParty()[0]!; + const secPokemon = game.scene.getPlayerParty()[1]!; + + const enemyLeadPokemon = game.scene.getEnemyParty()[0]!; + const enemySecPokemon = game.scene.getEnemyParty()[1]!; + + game.move.select(Moves.DRAGON_TAIL, 0, BattlerIndex.ENEMY); + // target the same pokemon, second move should be redirected after first flees + game.move.select(Moves.DRAGON_TAIL, 1, BattlerIndex.ENEMY); + + await game.phaseInterceptor.to("BerryPhase"); + + const isVisibleLead = enemyLeadPokemon.visible; + const hasFledLead = enemyLeadPokemon.switchOutStatus; + const isVisibleSec = enemySecPokemon.visible; + const hasFledSec = enemySecPokemon.switchOutStatus; + expect(!isVisibleLead && hasFledLead && !isVisibleSec && hasFledSec).toBe(true); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + expect(secPokemon.hp).toBeLessThan(secPokemon.getMaxHp()); + expect(enemyLeadPokemon.hp).toBeLessThan(enemyLeadPokemon.getMaxHp()); + expect(enemySecPokemon.hp).toBeLessThan(enemySecPokemon.getMaxHp()); + }); + + it("doesn't switch out if the target has suction cups", async () => { + game.override.enemyAbility(Abilities.SUCTION_CUPS); + await game.classicMode.startBattle([Species.REGIELEKI]); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DRAGON_TAIL); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemy.isFullHp()).toBe(false); + }); + + it("should force a switch upon fainting an opponent normally", async () => { + game.override.startingWave(5).startingLevel(1000); // To make sure Dragon Tail KO's the opponent + await game.classicMode.startBattle([Species.DRATINI]); + + game.move.select(Moves.DRAGON_TAIL); + + await game.toNextTurn(); + + // Make sure the enemy switched to a healthy Pokemon + const enemy = game.scene.getEnemyPokemon()!; + expect(enemy).toBeDefined(); + expect(enemy.isFullHp()).toBe(true); + + // Make sure the enemy has a fainted Pokemon in their party and not on the field + const faintedEnemy = game.scene.getEnemyParty().find(p => !p.isAllowedInBattle()); + expect(faintedEnemy).toBeDefined(); + expect(game.scene.getEnemyField().length).toBe(1); + }); + + it("should not cause a softlock when activating an opponent trainer's reviver seed", async () => { + game.override + .startingWave(5) + .enemyHeldItems([{ name: "REVIVER_SEED" }]) + .startingLevel(1000); // To make sure Dragon Tail KO's the opponent + await game.classicMode.startBattle([Species.DRATINI]); + + game.move.select(Moves.DRAGON_TAIL); + + await game.toNextTurn(); + + // Make sure the enemy field is not empty and has a revived Pokemon + const enemy = game.scene.getEnemyPokemon()!; + expect(enemy).toBeDefined(); + expect(enemy.hp).toBe(Math.floor(enemy.getMaxHp() / 2)); + expect(game.scene.getEnemyField().length).toBe(1); + }); + + it("should not cause a softlock when activating a player's reviver seed", async () => { + game.override + .startingHeldItems([{ name: "REVIVER_SEED" }]) + .enemyMoveset(Moves.DRAGON_TAIL) + .enemyLevel(1000); // To make sure Dragon Tail KO's the player + await game.classicMode.startBattle([Species.DRATINI, Species.BULBASAUR]); + + game.move.select(Moves.SPLASH); + + await game.toNextTurn(); + + // Make sure the player's field is not empty and has a revived Pokemon + const dratini = game.scene.getPlayerPokemon()!; + expect(dratini).toBeDefined(); + 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 = 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 = 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, PokemonType.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 = 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 = 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 = 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/test/moves/dynamax_cannon.test.ts similarity index 72% rename from src/test/moves/dynamax_cannon.test.ts rename to test/moves/dynamax_cannon.test.ts index 9dd48d3c94c..0ff0712710d 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/test/moves/dynamax_cannon.test.ts @@ -1,10 +1,10 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { allMoves } from "#app/data/moves/move"; +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"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -27,7 +27,7 @@ describe("Moves - Dynamax Cannon", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ dynamaxCannon.id ]); + game.override.moveset([dynamaxCannon.id]); game.override.startingLevel(200); // Note that, for Waves 1-10, the level cap is 10 @@ -36,44 +36,38 @@ describe("Moves - Dynamax Cannon", () => { game.override.disableCrits(); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); vi.spyOn(dynamaxCannon, "calculateBattlePower"); }); it("should return 100 power against an enemy below level cap", async () => { game.override.enemyLevel(1); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); 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); it("should return 100 power against an enemy at level cap", async () => { game.override.enemyLevel(10); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); 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); it("should return 120 power against an enemy 1% above level cap", async () => { game.override.enemyLevel(101); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -81,16 +75,14 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + vi.spyOn(game.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(120); }, 20000); it("should return 140 power against an enemy 2% above level capp", async () => { game.override.enemyLevel(102); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -98,16 +90,14 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + vi.spyOn(game.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(140); }, 20000); it("should return 160 power against an enemy 3% above level cap", async () => { game.override.enemyLevel(103); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -115,16 +105,14 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + vi.spyOn(game.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(160); }, 20000); it("should return 180 power against an enemy 4% above level cap", async () => { game.override.enemyLevel(104); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -132,16 +120,14 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + vi.spyOn(game.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(180); }, 20000); it("should return 200 power against an enemy 5% above level cap", async () => { game.override.enemyLevel(105); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); @@ -149,23 +135,21 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + vi.spyOn(game.scene, "getMaxExpLevel").mockReturnValue(100); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); it("should return 200 power against an enemy way above level cap", async () => { game.override.enemyLevel(999); - await game.startBattle([ - Species.ETERNATUS, - ]); + await game.startBattle([Species.ETERNATUS]); game.move.select(dynamaxCannon.id); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); 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/test/moves/effectiveness.test.ts b/test/moves/effectiveness.test.ts new file mode 100644 index 00000000000..dc55392f8bf --- /dev/null +++ b/test/moves/effectiveness.test.ts @@ -0,0 +1,100 @@ +import { allMoves } from "#app/data/moves/move"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { PokemonType } from "#enums/pokemon-type"; +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 GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; + +function testMoveEffectiveness( + game: GameManager, + move: Moves, + targetSpecies: Species, + expected: number, + targetAbility: Abilities = Abilities.BALL_FETCH, + teraType?: PokemonType, +): void { + // Suppress getPokemonNameWithAffix because it calls on a null battle spec + vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); + game.override.enemyAbility(targetAbility); + + const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5); + const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE); + + if (teraType !== undefined) { + target.teraType = teraType; + target.isTerastallized = true; + } + + expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected); + user.destroy(); + target.destroy(); +} + +describe("Moves - Type Effectiveness", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + game = new GameManager(phaserGame); + + game.override.ability(Abilities.BALL_FETCH); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("Normal-type attacks are neutrally effective against Normal-type Pokemon", () => + testMoveEffectiveness(game, Moves.TACKLE, Species.SNORLAX, 1)); + + it("Normal-type attacks are not very effective against Steel-type Pokemon", () => + testMoveEffectiveness(game, Moves.TACKLE, Species.REGISTEEL, 0.5)); + + it("Normal-type attacks are doubly resisted by Steel/Rock-type Pokemon", () => + testMoveEffectiveness(game, Moves.TACKLE, Species.AGGRON, 0.25)); + + it("Normal-type attacks have no effect on Ghost-type Pokemon", () => + testMoveEffectiveness(game, Moves.TACKLE, Species.DUSCLOPS, 0)); + + it("Normal-type status moves are not affected by type matchups", () => + testMoveEffectiveness(game, Moves.GROWL, Species.DUSCLOPS, 1)); + + it("Electric-type attacks are super-effective against Water-type Pokemon", () => + testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.BLASTOISE, 2)); + + it("Ghost-type attacks have no effect on Normal-type Pokemon", () => + testMoveEffectiveness(game, Moves.SHADOW_BALL, Species.URSALUNA, 0)); + + it("Electric-type attacks are doubly super-effective against Water/Flying-type Pokemon", () => + testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 4)); + + it("Electric-type attacks are negated by Volt Absorb", () => + testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 0, Abilities.VOLT_ABSORB)); + + it("Electric-type attacks are super-effective against Tera-Water Pokemon", () => + testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.EXCADRILL, 2, Abilities.BALL_FETCH, PokemonType.WATER)); + + it("Powder moves have no effect on Grass-type Pokemon", () => + testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.AMOONGUSS, 0)); + + it("Powder moves have no effect on Tera-Grass Pokemon", () => + testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.SNORLAX, 0, Abilities.BALL_FETCH, PokemonType.GRASS)); + + it("Prankster-boosted status moves have no effect on Dark-type Pokemon", () => { + game.override.ability(Abilities.PRANKSTER); + testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.MIGHTYENA, 0); + }); + + it("Prankster-boosted status moves have no effect on Tera-Dark Pokemon", () => { + game.override.ability(Abilities.PRANKSTER); + testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.SNORLAX, 0, Abilities.BALL_FETCH, PokemonType.DARK); + }); +}); diff --git a/src/test/moves/electrify.test.ts b/test/moves/electrify.test.ts similarity index 75% rename from src/test/moves/electrify.test.ts rename to test/moves/electrify.test.ts index 5d15a825688..69e7504b406 100644 --- a/src/test/moves/electrify.test.ts +++ b/test/moves/electrify.test.ts @@ -1,9 +1,9 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; @@ -34,7 +34,7 @@ describe("Moves - Electrify", () => { }); it("should convert attacks to Electric type", async () => { - await game.classicMode.startBattle([ Species.EXCADRILL ]); + await game.classicMode.startBattle([Species.EXCADRILL]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -42,17 +42,17 @@ describe("Moves - Electrify", () => { game.move.select(Moves.ELECTRIFY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); }); it("should override type changes from abilities", async () => { game.override.enemyAbility(Abilities.PIXILATE); - await game.classicMode.startBattle([ Species.EXCADRILL ]); + await game.classicMode.startBattle([Species.EXCADRILL]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getPlayerPokemon()!; @@ -60,10 +60,10 @@ describe("Moves - Electrify", () => { game.move.select(Moves.ELECTRIFY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); }); }); diff --git a/src/test/moves/electro_shot.test.ts b/test/moves/electro_shot.test.ts similarity index 87% rename from src/test/moves/electro_shot.test.ts rename to test/moves/electro_shot.test.ts index 1373b4941eb..05ab9c24a7c 100644 --- a/src/test/moves/electro_shot.test.ts +++ b/test/moves/electro_shot.test.ts @@ -5,7 +5,7 @@ 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; @@ -36,7 +36,7 @@ describe("Moves - Electro Shot", () => { }); it("should increase the user's Sp. Atk on the first turn, then attack on the second turn", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -62,11 +62,11 @@ describe("Moves - Electro Shot", () => { it.each([ { weatherType: WeatherType.RAIN, name: "Rain" }, - { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" } + { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" }, ])("should fully resolve in one turn if $name is active", async ({ weatherType }) => { game.override.weather(weatherType); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -87,18 +87,16 @@ describe("Moves - Electro Shot", () => { }); it("should only increase Sp. Atk once with Multi-Lens", async () => { - game.override - .weather(WeatherType.RAIN) - .startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + game.override.weather(WeatherType.RAIN).startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.ELECTRO_SHOT); await game.phaseInterceptor.to("MoveEndPhase"); - expect(playerPokemon.turnData.hitCount).toBe(2); + expect(playerPokemon.turnData.hitCount).toBe(1); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1); }); }); diff --git a/test/moves/encore.test.ts b/test/moves/encore.test.ts new file mode 100644 index 00000000000..43b9eb6a77f --- /dev/null +++ b/test/moves/encore.test.ts @@ -0,0 +1,114 @@ +import { BattlerTagType } from "#enums/battler-tag-type"; +import { BattlerIndex } from "#app/battle"; +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/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Encore", () => { + 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.ENCORE]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.SPLASH, Moves.TACKLE]) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should prevent the target from using any move except the last used move", async () => { + await game.classicMode.startBattle([Species.SNORLAX]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.SPLASH); + + await game.toNextTurn(); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)).toBeDefined(); + + game.move.select(Moves.SPLASH); + // The enemy AI would normally be inclined to use Tackle, but should be + // forced into using Splash. + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.getLastXMoves().every(turnMove => turnMove.move === Moves.SPLASH)).toBeTruthy(); + }); + + describe("should fail against the following moves:", () => { + it.each([ + { moveId: Moves.TRANSFORM, name: "Transform", delay: false }, + { moveId: Moves.MIMIC, name: "Mimic", delay: true }, + { moveId: Moves.SKETCH, name: "Sketch", delay: true }, + { moveId: Moves.ENCORE, name: "Encore", delay: false }, + { moveId: Moves.STRUGGLE, name: "Struggle", delay: false }, + ])("$name", async ({ moveId, delay }) => { + game.override.enemyMoveset(moveId); + + await game.classicMode.startBattle([Species.SNORLAX]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + if (delay) { + game.move.select(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + } + + game.move.select(Moves.ENCORE); + + const turnOrder = delay ? [BattlerIndex.PLAYER, BattlerIndex.ENEMY] : [BattlerIndex.ENEMY, BattlerIndex.PLAYER]; + await game.setTurnOrder(turnOrder); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)).toBeUndefined(); + }); + }); + + it("Pokemon under both Encore and Torment should alternate between Struggle and restricted move", async () => { + const turnOrder = [BattlerIndex.ENEMY, BattlerIndex.PLAYER]; + game.override.moveset([Moves.ENCORE, Moves.TORMENT, Moves.SPLASH]); + await game.classicMode.startBattle([Species.FEEBAS]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + game.move.select(Moves.ENCORE); + await game.setTurnOrder(turnOrder); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon?.getTag(BattlerTagType.ENCORE)).toBeDefined(); + + await game.toNextTurn(); + game.move.select(Moves.TORMENT); + await game.setTurnOrder(turnOrder); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon?.getTag(BattlerTagType.TORMENT)).toBeDefined(); + + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.setTurnOrder(turnOrder); + await game.phaseInterceptor.to("BerryPhase"); + const lastMove = enemyPokemon?.getLastXMoves()[0]; + expect(lastMove?.move).toBe(Moves.STRUGGLE); + }); +}); diff --git a/test/moves/endure.test.ts b/test/moves/endure.test.ts new file mode 100644 index 00000000000..8151128479d --- /dev/null +++ b/test/moves/endure.test.ts @@ -0,0 +1,65 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Endure", () => { + 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.THUNDER, Moves.BULLET_SEED, Moves.TOXIC]) + .ability(Abilities.SKILL_LINK) + .startingLevel(100) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.NO_GUARD) + .enemyMoveset(Moves.ENDURE); + }); + + it("should let the pokemon survive with 1 HP", async () => { + await game.classicMode.startBattle([Species.ARCEUS]); + + game.move.select(Moves.THUNDER); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.hp).toBe(1); + }); + + it("should let the pokemon survive with 1 HP when hit with a multihit move", async () => { + await game.classicMode.startBattle([Species.ARCEUS]); + + game.move.select(Moves.BULLET_SEED); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.hp).toBe(1); + }); + + it("shouldn't prevent fainting from indirect damage", async () => { + game.override.enemyLevel(100); + await game.classicMode.startBattle([Species.ARCEUS]); + + const enemy = game.scene.getEnemyPokemon()!; + enemy.hp = 2; + + game.move.select(Moves.TOXIC); + await game.phaseInterceptor.to("VictoryPhase"); + + expect(enemy.isFainted()).toBe(true); + }); +}); diff --git a/test/moves/entrainment.test.ts b/test/moves/entrainment.test.ts new file mode 100644 index 00000000000..b2a0baf3e27 --- /dev/null +++ b/test/moves/entrainment.test.ts @@ -0,0 +1,53 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Entrainment", () => { + 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.ENTRAINMENT]) + .ability(Abilities.ADAPTABILITY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("gives its ability to the target", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.ENTRAINMENT); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.ADAPTABILITY); + }); + + it("should activate post-summon abilities", async () => { + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.ENTRAINMENT); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); +}); diff --git a/test/moves/fairy_lock.test.ts b/test/moves/fairy_lock.test.ts new file mode 100644 index 00000000000..a47143add4f --- /dev/null +++ b/test/moves/fairy_lock.test.ts @@ -0,0 +1,152 @@ +import { ArenaTagSide } from "#app/data/arena-tag"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Fairy Lock", () => { + 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.FAIRY_LOCK, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .battleType("double") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.SPLASH, Moves.U_TURN]); + }); + + it("Applies Fairy Lock tag for two turns", async () => { + await game.classicMode.startBattle([Species.KLEFKI, Species.TYRUNT]); + const playerPokemon = game.scene.getPlayerField(); + const enemyField = game.scene.getEnemyField(); + + game.move.select(Moves.FAIRY_LOCK); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER)).toBeDefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.ENEMY)).toBeDefined(); + + await game.toNextTurn(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + expect(playerPokemon[0].isTrapped()).toEqual(true); + expect(playerPokemon[1].isTrapped()).toEqual(true); + expect(enemyField[0].isTrapped()).toEqual(true); + expect(enemyField[1].isTrapped()).toEqual(true); + + await game.toNextTurn(); + expect(playerPokemon[0].isTrapped()).toEqual(false); + expect(playerPokemon[1].isTrapped()).toEqual(false); + expect(enemyField[0].isTrapped()).toEqual(false); + expect(enemyField[1].isTrapped()).toEqual(false); + }); + + it("Ghost types can escape Fairy Lock", async () => { + await game.classicMode.startBattle([Species.DUSKNOIR, Species.GENGAR, Species.TYRUNT]); + + game.move.select(Moves.FAIRY_LOCK); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER)).toBeDefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.ENEMY)).toBeDefined(); + + await game.toNextTurn(); + + expect(game.scene.getPlayerField()[0].isTrapped()).toEqual(false); + expect(game.scene.getPlayerField()[1].isTrapped()).toEqual(false); + + game.move.select(Moves.SPLASH); + game.doSwitchPokemon(2); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + await game.toNextTurn(); + + expect(game.scene.getPlayerField()[1].species.speciesId).not.toBe(Species.GENGAR); + }); + + it("Phasing moves will still switch out", async () => { + game.override.enemyMoveset([Moves.SPLASH, Moves.WHIRLWIND]); + await game.classicMode.startBattle([Species.KLEFKI, Species.TYRUNT, Species.ZYGARDE]); + + game.move.select(Moves.FAIRY_LOCK); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER)).toBeDefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.ENEMY)).toBeDefined(); + + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.WHIRLWIND, 0); + game.doSelectPartyPokemon(2); + await game.forceEnemyMove(Moves.WHIRLWIND, 1); + game.doSelectPartyPokemon(2); + await game.phaseInterceptor.to("BerryPhase"); + await game.toNextTurn(); + + expect(game.scene.getPlayerField()[0].species.speciesId).not.toBe(Species.KLEFKI); + expect(game.scene.getPlayerField()[1].species.speciesId).not.toBe(Species.TYRUNT); + }); + + it("If a Pokemon faints and is replaced the replacement is also trapped", async () => { + game.override.moveset([Moves.FAIRY_LOCK, Moves.SPLASH, Moves.MEMENTO]); + await game.classicMode.startBattle([Species.KLEFKI, Species.GUZZLORD, Species.TYRUNT, Species.ZYGARDE]); + + game.move.select(Moves.FAIRY_LOCK); + game.move.select(Moves.MEMENTO, 1); + game.doSelectPartyPokemon(2); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER)).toBeDefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.ENEMY)).toBeDefined(); + + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerField()[0].isTrapped()).toEqual(true); + expect(game.scene.getPlayerField()[1].isTrapped()).toEqual(true); + expect(game.scene.getEnemyField()[0].isTrapped()).toEqual(true); + expect(game.scene.getEnemyField()[1].isTrapped()).toEqual(true); + + await game.toNextTurn(); + expect(game.scene.getPlayerField()[0].isTrapped()).toEqual(false); + expect(game.scene.getPlayerField()[1].isTrapped()).toEqual(false); + expect(game.scene.getEnemyField()[0].isTrapped()).toEqual(false); + expect(game.scene.getEnemyField()[1].isTrapped()).toEqual(false); + }); +}); diff --git a/src/test/moves/fake_out.test.ts b/test/moves/fake_out.test.ts similarity index 84% rename from src/test/moves/fake_out.test.ts rename to test/moves/fake_out.test.ts index f20b6db3a13..929c760ee5b 100644 --- a/src/test/moves/fake_out.test.ts +++ b/test/moves/fake_out.test.ts @@ -1,4 +1,4 @@ -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; @@ -23,15 +23,15 @@ describe("Moves - Fake Out", () => { game.override .battleType("single") .enemySpecies(Species.CORVIKNIGHT) - .moveset([ Moves.FAKE_OUT, Moves.SPLASH ]) + .moveset([Moves.FAKE_OUT, Moves.SPLASH]) .enemyMoveset(Moves.SPLASH) .enemyLevel(10) .startingLevel(10) // prevent LevelUpPhase from happening .disableCrits(); }); - it("can only be used on the first turn a pokemon is sent out in a battle", async() => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + it("can only be used on the first turn a pokemon is sent out in a battle", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; @@ -48,8 +48,8 @@ describe("Moves - Fake Out", () => { }, 20000); // This is a PokeRogue buff to Fake Out - it("can be used at the start of every wave even if the pokemon wasn't recalled", async() => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + it("can be used at the start of every wave even if the pokemon wasn't recalled", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; enemy.damageAndUpdate(enemy.getMaxHp() - 1); @@ -63,9 +63,9 @@ describe("Moves - Fake Out", () => { expect(game.scene.getEnemyPokemon()!.isFullHp()).toBe(false); }, 20000); - it("can be used again if recalled and sent back out", async() => { + it("can be used again if recalled and sent back out", async () => { game.override.startingWave(4); - await game.classicMode.startBattle([ Species.FEEBAS, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); const enemy1 = game.scene.getEnemyPokemon()!; diff --git a/test/moves/fell_stinger.test.ts b/test/moves/fell_stinger.test.ts new file mode 100644 index 00000000000..2ffa44c5a3a --- /dev/null +++ b/test/moves/fell_stinger.test.ts @@ -0,0 +1,183 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Stat } from "#enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +import { WeatherType } from "#app/enums/weather-type"; +import { allMoves } from "#app/data/moves/move"; + +describe("Moves - Fell Stinger", () => { + 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") + .moveset([Moves.FELL_STINGER, Moves.SALT_CURE, Moves.BIND, Moves.LEECH_SEED]) + .startingLevel(50) + .disableCrits() + .enemyAbility(Abilities.STURDY) + .enemySpecies(Species.HYPNO) + .enemyMoveset(Moves.SPLASH) + .enemyLevel(5); + }); + + it("should not grant stat boost if opponent gets KO'd by recoil", async () => { + game.override.enemyMoveset([Moves.DOUBLE_EDGE]); + + await game.classicMode.startBattle([Species.LEAVANNY]); + const leadPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("VictoryPhase"); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is KO'd by status effect", async () => { + game.override.enemyMoveset(Moves.SPLASH).enemyStatusEffect(StatusEffect.BURN); + + await game.classicMode.startBattle([Species.LEAVANNY]); + const leadPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("VictoryPhase"); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is KO'd by damaging weather", async () => { + game.override.weather(WeatherType.HAIL); + + await game.classicMode.startBattle([Species.LEAVANNY]); + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("VictoryPhase"); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is KO'd by Dry Skin + Harsh Sunlight", async () => { + game.override.enemyPassiveAbility(Abilities.STURDY).enemyAbility(Abilities.DRY_SKIN).weather(WeatherType.HARSH_SUN); + + await game.challengeMode.startBattle([Species.LEAVANNY]); + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("VictoryPhase"); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is saved by Reviver Seed", async () => { + game.override.enemyAbility(Abilities.BALL_FETCH).enemyHeldItems([{ name: "REVIVER_SEED" }]); + + await game.classicMode.startBattle([Species.LEAVANNY]); + const leadPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is KO'd by Salt Cure", async () => { + game.override.battleType("double").startingLevel(5); + const saltCure = allMoves[Moves.SALT_CURE]; + const fellStinger = allMoves[Moves.FELL_STINGER]; + vi.spyOn(saltCure, "accuracy", "get").mockReturnValue(100); + vi.spyOn(fellStinger, "power", "get").mockReturnValue(50000); + + await game.classicMode.startBattle([Species.LEAVANNY]); + const leadPokemon = game.scene.getPlayerPokemon()!; + const leftEnemy = game.scene.getEnemyField()[0]!; + + // Turn 1: set Salt Cure, enemy splashes and does nothing + game.move.select(Moves.SALT_CURE, 0, leftEnemy.getBattlerIndex()); + + // Turn 2: enemy Endures Fell Stinger, then dies to Salt Cure + await game.toNextTurn(); + expect(leftEnemy.isFainted()).toBe(false); + leftEnemy.heal(leftEnemy.getMaxHp()); + game.move.select(Moves.FELL_STINGER); + await game.toNextTurn(); + + expect(leftEnemy.isFainted()).toBe(true); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy dies to Bind or a similar effect", async () => { + game.override.battleType("double").startingLevel(5); + vi.spyOn(allMoves[Moves.BIND], "accuracy", "get").mockReturnValue(100); + vi.spyOn(allMoves[Moves.FELL_STINGER], "power", "get").mockReturnValue(50000); + + await game.classicMode.startBattle([Species.LEAVANNY]); + const leadPokemon = game.scene.getPlayerPokemon()!; + const leftEnemy = game.scene.getEnemyField()[0]!; + + // Turn 1: set Bind, enemy splashes and does nothing + game.move.select(Moves.BIND, 0, leftEnemy.getBattlerIndex()); + + // Turn 2: enemy Endures Fell Stinger, then dies to Bind + await game.toNextTurn(); + expect(leftEnemy.isFainted()).toBe(false); + leftEnemy.heal(leftEnemy.getMaxHp()); + game.move.select(Moves.FELL_STINGER, 0, leftEnemy.getBattlerIndex()); + await game.toNextTurn(); + + expect(leftEnemy.isFainted()).toBe(true); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy dies to Leech Seed", async () => { + game.override.battleType("double").startingLevel(5); + vi.spyOn(allMoves[Moves.LEECH_SEED], "accuracy", "get").mockReturnValue(100); + vi.spyOn(allMoves[Moves.FELL_STINGER], "power", "get").mockReturnValue(50000); + + await game.classicMode.startBattle([Species.LEAVANNY]); + const leadPokemon = game.scene.getPlayerPokemon()!; + const leftEnemy = game.scene.getEnemyField()[0]!; + + // Turn 1: set Leech Seed, enemy splashes and does nothing + game.move.select(Moves.LEECH_SEED, 0, leftEnemy.getBattlerIndex()); + + // Turn 2: enemy Endures Fell Stinger, then dies to Leech Seed + await game.toNextTurn(); + expect(leftEnemy.isFainted()).toBe(false); + leftEnemy.heal(leftEnemy.getMaxHp()); + game.move.select(Moves.FELL_STINGER, 0, leftEnemy.getBattlerIndex()); + await game.toNextTurn(); + + expect(leftEnemy.isFainted()).toBe(true); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should grant stat boost if enemy dies directly to hit", async () => { + game.override.enemyAbility(Abilities.KLUTZ); + + await game.classicMode.startBattle([Species.LEAVANNY]); + const leadPokemon = game.scene.getPlayerPokemon(); + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(leadPokemon?.getStatStage(Stat.ATK)).toBe(3); + }); +}); diff --git a/test/moves/fillet_away.test.ts b/test/moves/fillet_away.test.ts new file mode 100644 index 00000000000..cc462b3746a --- /dev/null +++ b/test/moves/fillet_away.test.ts @@ -0,0 +1,108 @@ +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { toDmgValue } from "#app/utils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +/** HP Cost of Move */ +const RATIO = 2; +/** Amount of extra HP lost */ +const PREDAMAGE = 15; + +describe("Moves - FILLET AWAY", () => { + 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.starterSpecies(Species.MAGIKARP); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.FILLET_AWAY]); + game.override.enemyMoveset(Moves.SPLASH); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move) + + test("raises the user's ATK, SPATK, and SPD stat stages by 2 each, at the cost of 1/2 of its maximum HP", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(2); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); + }); + + test("still takes effect if one or more of the involved stat stages are not at max", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + + //Here - Stat.SPD -> 0 and Stat.SPATK -> 3 + leadPokemon.setStatStage(Stat.ATK, 6); + leadPokemon.setStatStage(Stat.SPATK, 3); + + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(5); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2); + }); + + test("fails if all stat stages involved are at max", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.setStatStage(Stat.ATK, 6); + leadPokemon.setStatStage(Stat.SPATK, 6); + leadPokemon.setStatStage(Stat.SPD, 6); + + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6); + }); + + test("fails if the user's health is less than 1/2", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); + leadPokemon.hp = hpLost - PREDAMAGE; + + game.move.select(Moves.FILLET_AWAY); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0); + expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0); + }); +}); diff --git a/src/test/moves/fissure.test.ts b/test/moves/fissure.test.ts similarity index 83% rename from src/test/moves/fissure.test.ts rename to test/moves/fissure.test.ts index 16c3faa6827..63de58eb2e7 100644 --- a/src/test/moves/fissure.test.ts +++ b/test/moves/fissure.test.ts @@ -1,11 +1,11 @@ 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 type { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +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"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -32,7 +32,7 @@ describe("Moves - Fissure", () => { game.override.disableCrits(); game.override.starterSpecies(Species.SNORLAX); - game.override.moveset([ Moves.FISSURE ]); + game.override.moveset([Moves.FISSURE]); game.override.passiveAbility(Abilities.BALL_FETCH); game.override.startingLevel(100); @@ -41,14 +41,10 @@ describe("Moves - Fissure", () => { game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); - await game.startBattle(); + await game.classicMode.startBattle(); - partyPokemon = game.scene.getParty()[0]; + partyPokemon = game.scene.getPlayerParty()[0]; enemyPokemon = game.scene.getEnemyPokemon()!; - - // remove berries - game.scene.removePartyMemberModifiers(0); - game.scene.clearEnemyHeldItemModifiers(); }); it("ignores damage modification from abilities, for example FUR_COAT", async () => { @@ -56,7 +52,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/flame_burst.test.ts b/test/moves/flame_burst.test.ts similarity index 76% rename from src/test/moves/flame_burst.test.ts rename to test/moves/flame_burst.test.ts index feedee3b7bc..b6a425e7bb5 100644 --- a/src/test/moves/flame_burst.test.ts +++ b/test/moves/flame_burst.test.ts @@ -1,10 +1,10 @@ import { allAbilities } from "#app/data/ability"; import { Abilities } from "#app/enums/abilities"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -20,7 +20,7 @@ describe("Moves - Flame Burst", () => { * @returns Effect damage of Flame Burst */ const getEffectDamage = (pokemon: Pokemon): number => { - return Math.max(1, Math.floor(pokemon.getMaxHp() * 1 / 16)); + return Math.max(1, Math.floor((pokemon.getMaxHp() * 1) / 16)); }; beforeAll(() => { @@ -36,18 +36,18 @@ describe("Moves - Flame Burst", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.FLAME_BURST, Moves.SPLASH ]); + game.override.moveset([Moves.FLAME_BURST, Moves.SPLASH]); game.override.disableCrits(); game.override.ability(Abilities.UNNERVE); game.override.startingWave(4); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); }); it("inflicts damage to the target's ally equal to 1/16 of its max HP", async () => { - await game.startBattle([ Species.PIKACHU, Species.PIKACHU ]); - const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); game.move.select(Moves.FLAME_BURST, 0, leftEnemy.getBattlerIndex()); game.move.select(Moves.SPLASH, 1); @@ -60,8 +60,8 @@ describe("Moves - Flame Burst", () => { it("does not inflict damage to the target's ally if the target was not affected by Flame Burst", async () => { game.override.enemyAbility(Abilities.FLASH_FIRE); - await game.startBattle([ Species.PIKACHU, Species.PIKACHU ]); - const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); game.move.select(Moves.FLAME_BURST, 0, leftEnemy.getBattlerIndex()); game.move.select(Moves.SPLASH, 1); @@ -72,8 +72,8 @@ describe("Moves - Flame Burst", () => { }); it("does not interact with the target ally's abilities", async () => { - await game.startBattle([ Species.PIKACHU, Species.PIKACHU ]); - const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); vi.spyOn(rightEnemy, "getAbility").mockReturnValue(allAbilities[Abilities.FLASH_FIRE]); @@ -86,8 +86,8 @@ describe("Moves - Flame Burst", () => { }); it("effect damage is prevented by Magic Guard", async () => { - await game.startBattle([ Species.PIKACHU, Species.PIKACHU ]); - const [ leftEnemy, rightEnemy ] = game.scene.getEnemyField(); + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const [leftEnemy, rightEnemy] = game.scene.getEnemyField(); vi.spyOn(rightEnemy, "getAbility").mockReturnValue(allAbilities[Abilities.MAGIC_GUARD]); @@ -99,7 +99,11 @@ describe("Moves - Flame Burst", () => { expect(rightEnemy.hp).toBe(rightEnemy.getMaxHp()); }); - it("is not affected by protection moves and Endure", async () => { - // TODO: update this test when it's possible to select move for each enemy - }, { skip: true }); + it( + "is not affected by protection moves and Endure", + async () => { + // TODO: update this test when it's possible to select move for each enemy + }, + { skip: true }, + ); }); diff --git a/src/test/moves/flower_shield.test.ts b/test/moves/flower_shield.test.ts similarity index 88% rename from src/test/moves/flower_shield.test.ts rename to test/moves/flower_shield.test.ts index 1a5cd326fd8..b66847651c1 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/test/moves/flower_shield.test.ts @@ -1,12 +1,12 @@ import { Stat } from "#enums/stat"; import { SemiInvulnerableTag } from "#app/data/battler-tags"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Biome } from "#app/enums/biome"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -29,14 +29,14 @@ describe("Moves - Flower Shield", () => { game.override.ability(Abilities.NONE); game.override.enemyAbility(Abilities.NONE); game.override.battleType("single"); - game.override.moveset([ Moves.FLOWER_SHIELD, Moves.SPLASH ]); + game.override.moveset([Moves.FLOWER_SHIELD, Moves.SPLASH]); game.override.enemyMoveset(Moves.SPLASH); }); it("raises DEF stat stage by 1 for all Grass-type Pokemon on the field by one stage - single battle", async () => { game.override.enemySpecies(Species.CHERRIM); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const cherrim = game.scene.getEnemyPokemon()!; const magikarp = game.scene.getPlayerPokemon()!; @@ -53,10 +53,10 @@ describe("Moves - Flower Shield", () => { it("raises DEF stat stage by 1 for all Grass-type Pokemon on the field by one stage - double battle", async () => { game.override.enemySpecies(Species.MAGIKARP).startingBiome(Biome.GRASS).battleType("double"); - await game.startBattle([ Species.CHERRIM, Species.MAGIKARP ]); + await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); const field = game.scene.getField(true); - const grassPokemons = field.filter(p => p.getTypes().includes(Type.GRASS)); + const grassPokemons = field.filter(p => p.getTypes().includes(PokemonType.GRASS)); const nonGrassPokemons = field.filter(pokemon => !grassPokemons.includes(pokemon)); grassPokemons.forEach(p => expect(p.getStatStage(Stat.DEF)).toBe(0)); @@ -72,13 +72,13 @@ describe("Moves - Flower Shield", () => { /** * See semi-vulnerable state tags. {@linkcode SemiInvulnerableTag} - */ + */ it("does not raise DEF stat stage for a Pokemon in semi-vulnerable state", async () => { game.override.enemySpecies(Species.PARAS); - game.override.enemyMoveset([ Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG ]); + game.override.enemyMoveset([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); game.override.enemyLevel(50); - await game.startBattle([ Species.CHERRIM ]); + await game.startBattle([Species.CHERRIM]); const paras = game.scene.getEnemyPokemon()!; const cherrim = game.scene.getPlayerPokemon()!; @@ -97,7 +97,7 @@ describe("Moves - Flower Shield", () => { it("does nothing if there are no Grass-type Pokemon on the field", async () => { game.override.enemySpecies(Species.MAGIKARP); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon()!; const ally = game.scene.getPlayerPokemon()!; diff --git a/src/test/moves/fly.test.ts b/test/moves/fly.test.ts similarity index 86% rename from src/test/moves/fly.test.ts rename to test/moves/fly.test.ts index 6ae758fe3dc..0bd7d22b2a7 100644 --- a/src/test/moves/fly.test.ts +++ b/test/moves/fly.test.ts @@ -4,11 +4,11 @@ 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; describe("Moves - Fly", () => { let phaserGame: Phaser.Game; @@ -39,7 +39,7 @@ describe("Moves - Fly", () => { }); it("should make the user semi-invulnerable, then attack over 2 turns", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -65,7 +65,7 @@ describe("Moves - Fly", () => { it("should not allow the user to evade attacks from Pokemon with No Guard", async () => { game.override.enemyAbility(Abilities.NO_GUARD); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -78,11 +78,9 @@ describe("Moves - Fly", () => { }); it("should not expend PP when the attack phase is cancelled", async () => { - game.override - .enemyAbility(Abilities.NO_GUARD) - .enemyMoveset(Moves.SPORE); + game.override.enemyAbility(Abilities.NO_GUARD).enemyMoveset(Moves.SPORE); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -97,9 +95,9 @@ describe("Moves - Fly", () => { }); it("should be cancelled when another Pokemon uses Gravity", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.GRAVITY ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.GRAVITY]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -110,7 +108,7 @@ describe("Moves - Fly", () => { await game.toNextTurn(); await game.forceEnemyMove(Moves.GRAVITY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); diff --git a/test/moves/focus_punch.test.ts b/test/moves/focus_punch.test.ts new file mode 100644 index 00000000000..2dc5f20f2bf --- /dev/null +++ b/test/moves/focus_punch.test.ts @@ -0,0 +1,132 @@ +import { BerryPhase } from "#app/phases/berry-phase"; +import { MessagePhase } from "#app/phases/message-phase"; +import { MoveHeaderPhase } from "#app/phases/move-header-phase"; +import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; +import { TurnStartPhase } from "#app/phases/turn-start-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import i18next from "i18next"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Focus Punch", () => { + 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") + .ability(Abilities.UNNERVE) + .moveset([Moves.FOCUS_PUNCH]) + .enemySpecies(Species.GROUDON) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset(Moves.SPLASH) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should deal damage at the end of turn if uninterrupted", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.FOCUS_PUNCH); + + await game.phaseInterceptor.to(MessagePhase); + + expect(enemyPokemon.hp).toBe(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(0); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(1); + expect(leadPokemon.turnData.totalDamageDealt).toBe(enemyStartingHp - enemyPokemon.hp); + }); + + it("should fail if the user is hit", async () => { + game.override.enemyMoveset([Moves.TACKLE]); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const enemyStartingHp = enemyPokemon.hp; + + game.move.select(Moves.FOCUS_PUNCH); + + await game.phaseInterceptor.to(MessagePhase); + + expect(enemyPokemon.hp).toBe(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(0); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBe(enemyStartingHp); + expect(leadPokemon.getMoveHistory().length).toBe(1); + expect(leadPokemon.turnData.totalDamageDealt).toBe(0); + }); + + it("should be cancelled if the user falls asleep mid-turn", async () => { + game.override.enemyMoveset([Moves.SPORE]); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FOCUS_PUNCH); + + await game.phaseInterceptor.to(MessagePhase); // Header message + + expect(leadPokemon.getMoveHistory().length).toBe(0); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.getMoveHistory().length).toBe(1); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); + + it("should not queue its pre-move message before an enemy switches", async () => { + /** Guarantee a Trainer battle with multiple enemy Pokemon */ + game.override.startingWave(25); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + game.forceEnemyToSwitch(); + game.move.select(Moves.FOCUS_PUNCH); + + await game.phaseInterceptor.to(TurnStartPhase); + + expect(game.scene.getCurrentPhase() instanceof SwitchSummonPhase).toBeTruthy(); + expect(game.scene.phaseQueue.find(phase => phase instanceof MoveHeaderPhase)).toBeDefined(); + }); + it("should replace the 'but it failed' text when the user gets hit", async () => { + game.override.enemyMoveset([Moves.TACKLE]); + await game.classicMode.startBattle([Species.CHARIZARD]); + + game.move.select(Moves.FOCUS_PUNCH); + await game.phaseInterceptor.to("MoveEndPhase", true); + await game.phaseInterceptor.to("MessagePhase", false); + const consoleSpy = vi.spyOn(console, "log"); + await game.phaseInterceptor.to("MoveEndPhase", true); + expect(consoleSpy).nthCalledWith(1, i18next.t("moveTriggers:lostFocus", { pokemonName: "Charizard" })); + }); +}); diff --git a/test/moves/follow_me.test.ts b/test/moves/follow_me.test.ts new file mode 100644 index 00000000000..eeb11b36f24 --- /dev/null +++ b/test/moves/follow_me.test.ts @@ -0,0 +1,116 @@ +import { Stat } from "#enums/stat"; +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#app/enums/abilities"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Moves - Follow Me", () => { + 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("double"); + game.override.starterSpecies(Species.AMOONGUSS); + game.override.ability(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.TACKLE, Moves.FOLLOW_ME, Moves.SPLASH]); + }); + + test("move should redirect enemy attacks to the user", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY); + + // Force both enemies to target the player Pokemon that did not use Follow Me + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + + await game.phaseInterceptor.to(TurnEndPhase, false); + + expect(playerPokemon[0].hp).toBeLessThan(playerPokemon[0].getMaxHp()); + expect(playerPokemon[1].hp).toBe(playerPokemon[1].getMaxHp()); + }); + + test("move should redirect enemy attacks to the first ally that uses it", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.FOLLOW_ME, 1); + + // Each player is targeted by an enemy + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + + await game.phaseInterceptor.to(TurnEndPhase, false); + + playerPokemon.sort((a, b) => a.getEffectiveStat(Stat.SPD) - b.getEffectiveStat(Stat.SPD)); + + expect(playerPokemon[1].hp).toBeLessThan(playerPokemon[1].getMaxHp()); + expect(playerPokemon[0].hp).toBe(playerPokemon[0].getMaxHp()); + }); + + test("move effect should be bypassed by Stalwart", async () => { + game.override.ability(Abilities.STALWART); + game.override.moveset([Moves.QUICK_ATTACK]); + + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); + + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + + // Target doesn't need to be specified if the move is self-targeted + await game.forceEnemyMove(Moves.FOLLOW_ME); + await game.forceEnemyMove(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase, false); + + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); + }); + + test("move effect should be bypassed by Snipe Shot", async () => { + game.override.moveset([Moves.SNIPE_SHOT]); + + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); + + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SNIPE_SHOT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SNIPE_SHOT, 1, BattlerIndex.ENEMY_2); + + await game.forceEnemyMove(Moves.FOLLOW_ME); + await game.forceEnemyMove(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase, false); + + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); + }); +}); diff --git a/src/test/moves/foresight.test.ts b/test/moves/foresight.test.ts similarity index 91% rename from src/test/moves/foresight.test.ts rename to test/moves/foresight.test.ts index 1195cd0b71b..d33a00bf136 100644 --- a/src/test/moves/foresight.test.ts +++ b/test/moves/foresight.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -27,7 +27,7 @@ describe("Moves - Foresight", () => { .enemyMoveset(Moves.SPLASH) .enemyLevel(5) .starterSpecies(Species.MAGIKARP) - .moveset([ Moves.FORESIGHT, Moves.QUICK_ATTACK, Moves.MACH_PUNCH ]); + .moveset([Moves.FORESIGHT, Moves.QUICK_ATTACK, Moves.MACH_PUNCH]); }); it("should allow Normal and Fighting moves to hit Ghost types", async () => { @@ -54,7 +54,7 @@ describe("Moves - Foresight", () => { }); it("should ignore target's evasiveness boosts", async () => { - game.override.enemyMoveset([ Moves.MINIMIZE ]); + game.override.enemyMoveset([Moves.MINIMIZE]); await game.startBattle(); const pokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/forests_curse.test.ts b/test/moves/forests_curse.test.ts new file mode 100644 index 00000000000..8850b92662d --- /dev/null +++ b/test/moves/forests_curse.test.ts @@ -0,0 +1,47 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { PokemonType } from "#enums/pokemon-type"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Forest's Curse", () => { + 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.FORESTS_CURSE, Moves.TRICK_OR_TREAT]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("will replace the added type from Trick Or Treat", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + game.move.select(Moves.TRICK_OR_TREAT); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemyPokemon!.summonData.addedType).toBe(PokemonType.GHOST); + + game.move.select(Moves.FORESTS_CURSE); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemyPokemon?.summonData.addedType).toBe(PokemonType.GRASS); + }); +}); diff --git a/test/moves/freeze_dry.test.ts b/test/moves/freeze_dry.test.ts new file mode 100644 index 00000000000..8cab56ddfd2 --- /dev/null +++ b/test/moves/freeze_dry.test.ts @@ -0,0 +1,330 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { PokemonType } from "#enums/pokemon-type"; +import { Challenges } from "#enums/challenges"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Freeze-Dry", () => { + 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") + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH) + .starterSpecies(Species.FEEBAS) + .ability(Abilities.BALL_FETCH) + .moveset([Moves.FREEZE_DRY, Moves.FORESTS_CURSE, Moves.SOAK]); + }); + + it("should deal 2x damage to pure water types", async () => { + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); + }); + + it("should deal 4x damage to water/flying types", async () => { + game.override.enemySpecies(Species.WINGULL); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); + }); + + it("should deal 1x damage to water/fire types", async () => { + game.override.enemySpecies(Species.VOLCANION); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(1); + }); + + /** + * Freeze drys forced super effectiveness should overwrite wonder guard + */ + it("should deal 2x dmg against soaked wonder guard target", async () => { + game.override + .enemySpecies(Species.SHEDINJA) + .enemyMoveset(Moves.SPLASH) + .starterSpecies(Species.MAGIKARP) + .moveset([Moves.SOAK, Moves.FREEZE_DRY]); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.SOAK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + + game.move.select(Moves.FREEZE_DRY); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + }); + + it("should deal 8x damage to water/ground/grass type under Forest's Curse", async () => { + game.override.enemySpecies(Species.QUAGSIRE); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FORESTS_CURSE); + await game.toNextTurn(); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(8); + }); + + it("should deal 2x damage to steel type terastallized into water", async () => { + game.override.enemySpecies(Species.SKARMORY); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + enemy.teraType = PokemonType.WATER; + enemy.isTerastallized = true; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); + }); + + it("should deal 0.5x damage to water type terastallized into fire", async () => { + game.override.enemySpecies(Species.PELIPPER); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + enemy.teraType = PokemonType.FIRE; + enemy.isTerastallized = true; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0.5); + }); + + it("should deal 0.5x damage to water type Terapagos with Tera Shell", async () => { + game.override.enemySpecies(Species.TERAPAGOS).enemyAbility(Abilities.TERA_SHELL); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.SOAK); + await game.toNextTurn(); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0.5); + }); + + it("should deal 2x damage to water type under Normalize", async () => { + game.override.ability(Abilities.NORMALIZE); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); + }); + + it("should deal 0.25x damage to rock/steel type under Normalize", async () => { + game.override.ability(Abilities.NORMALIZE).enemySpecies(Species.SHIELDON); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0.25); + }); + + it("should deal 0x damage to water/ghost type under Normalize", async () => { + game.override.ability(Abilities.NORMALIZE).enemySpecies(Species.JELLICENT); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0); + }); + + it("should deal 2x damage to water type under Electrify", async () => { + game.override.enemyMoveset([Moves.ELECTRIFY]); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); + }); + + it("should deal 4x damage to water/flying type under Electrify", async () => { + game.override.enemyMoveset([Moves.ELECTRIFY]).enemySpecies(Species.GYARADOS); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); + }); + + it("should deal 0x damage to water/ground type under Electrify", async () => { + game.override.enemyMoveset([Moves.ELECTRIFY]).enemySpecies(Species.BARBOACH); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0); + }); + + it("should deal 0.25x damage to Grass/Dragon type under Electrify", async () => { + game.override.enemyMoveset([Moves.ELECTRIFY]).enemySpecies(Species.FLAPPLE); + await game.classicMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(0.25); + }); + + it("should deal 2x damage to Water type during inverse battle", async () => { + game.override.moveset([Moves.FREEZE_DRY]).enemySpecies(Species.MAGIKARP); + game.challengeMode.addChallenge(Challenges.INVERSE_BATTLE, 1, 1); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); + }); + + it("should deal 2x damage to Water type during inverse battle under Normalize", async () => { + game.override.moveset([Moves.FREEZE_DRY]).ability(Abilities.NORMALIZE).enemySpecies(Species.MAGIKARP); + game.challengeMode.addChallenge(Challenges.INVERSE_BATTLE, 1, 1); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); + }); + + it("should deal 2x damage to Water type during inverse battle under Electrify", async () => { + game.override.moveset([Moves.FREEZE_DRY]).enemySpecies(Species.MAGIKARP).enemyMoveset([Moves.ELECTRIFY]); + game.challengeMode.addChallenge(Challenges.INVERSE_BATTLE, 1, 1); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemy.getMoveEffectiveness).toHaveLastReturnedWith(2); + }); + + it("should deal 1x damage to water/flying type during inverse battle under Electrify", async () => { + game.override.enemyMoveset([Moves.ELECTRIFY]).enemySpecies(Species.GYARADOS); + + game.challengeMode.addChallenge(Challenges.INVERSE_BATTLE, 1, 1); + + await game.challengeMode.startBattle(); + + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.FREEZE_DRY); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(1); + }); +}); diff --git a/test/moves/freezy_frost.test.ts b/test/moves/freezy_frost.test.ts new file mode 100644 index 00000000000..c1ac4054e70 --- /dev/null +++ b/test/moves/freezy_frost.test.ts @@ -0,0 +1,99 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { allMoves } from "#app/data/moves/move"; +import { CommandPhase } from "#app/phases/command-phase"; + +describe("Moves - Freezy Frost", () => { + 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") + .enemySpecies(Species.RATTATA) + .enemyLevel(100) + .enemyMoveset([Moves.HOWL, Moves.HOWL, Moves.HOWL, Moves.HOWL]) + .enemyAbility(Abilities.BALL_FETCH) + .startingLevel(100) + .moveset([Moves.FREEZY_FROST, Moves.HOWL, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH); + + vi.spyOn(allMoves[Moves.FREEZY_FROST], "accuracy", "get").mockReturnValue(100); + }); + + it("should clear stat changes of user and opponent", async () => { + await game.classicMode.startBattle([Species.SHUCKLE]); + const user = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.HOWL); + await game.toNextTurn(); + + expect(user.getStatStage(Stat.ATK)).toBe(1); + expect(enemy.getStatStage(Stat.ATK)).toBe(1); + + game.move.select(Moves.FREEZY_FROST); + await game.toNextTurn(); + + expect(user.getStatStage(Stat.ATK)).toBe(0); + expect(enemy.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should clear all stat changes even when enemy uses the move", async () => { + game.override.enemyMoveset([Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST]); + await game.classicMode.startBattle([Species.SHUCKLE]); // Shuckle for slower Howl on first turn so Freezy Frost doesn't affect it. + const user = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.HOWL); + await game.toNextTurn(); + + const userAtkBefore = user.getStatStage(Stat.ATK); + expect(userAtkBefore).toBe(1); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(user.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should clear all stat changes in double battle", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([Species.SHUCKLE, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); + + game.move.select(Moves.HOWL, 0); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); + + expect(leftPlayer.getStatStage(Stat.ATK)).toBe(1); + expect(rightPlayer.getStatStage(Stat.ATK)).toBe(1); + expect(leftOpp.getStatStage(Stat.ATK)).toBe(2); // Both enemies use Howl + expect(rightOpp.getStatStage(Stat.ATK)).toBe(2); + + game.move.select(Moves.FREEZY_FROST, 0, leftOpp.getBattlerIndex()); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); + + expect(leftPlayer.getStatStage(Stat.ATK)).toBe(0); + expect(rightPlayer.getStatStage(Stat.ATK)).toBe(0); + expect(leftOpp.getStatStage(Stat.ATK)).toBe(0); + expect(rightOpp.getStatStage(Stat.ATK)).toBe(0); + }); +}); diff --git a/src/test/moves/fusion_bolt.test.ts b/test/moves/fusion_bolt.test.ts similarity index 82% rename from src/test/moves/fusion_bolt.test.ts rename to test/moves/fusion_bolt.test.ts index 4e35b939abf..fc47a0f04be 100644 --- a/src/test/moves/fusion_bolt.test.ts +++ b/test/moves/fusion_bolt.test.ts @@ -1,7 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -23,12 +23,12 @@ describe("Moves - Fusion Bolt", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ fusionBolt ]); + game.override.moveset([fusionBolt]); game.override.startingLevel(1); game.override.enemySpecies(Species.RESHIRAM); game.override.enemyAbility(Abilities.ROUGH_SKIN); - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); game.override.battleType("single"); game.override.startingWave(97); @@ -36,9 +36,7 @@ describe("Moves - Fusion Bolt", () => { }); it("should not make contact", async () => { - await game.startBattle([ - Species.ZEKROM, - ]); + await game.startBattle([Species.ZEKROM]); const partyMember = game.scene.getPlayerPokemon()!; const initialHp = partyMember.hp; diff --git a/src/test/moves/fusion_flare.test.ts b/test/moves/fusion_flare.test.ts similarity index 82% rename from src/test/moves/fusion_flare.test.ts rename to test/moves/fusion_flare.test.ts index 162cefcfb1e..17653cf58bc 100644 --- a/src/test/moves/fusion_flare.test.ts +++ b/test/moves/fusion_flare.test.ts @@ -1,8 +1,8 @@ -import { StatusEffect } from "#app/data/status-effect"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -24,11 +24,11 @@ describe("Moves - Fusion Flare", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ fusionFlare ]); + game.override.moveset([fusionFlare]); game.override.startingLevel(1); game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + game.override.enemyMoveset([Moves.REST, Moves.REST, Moves.REST, Moves.REST]); game.override.battleType("single"); game.override.startingWave(97); @@ -36,9 +36,7 @@ describe("Moves - Fusion Flare", () => { }); it("should thaw freeze status condition", async () => { - await game.startBattle([ - Species.RESHIRAM, - ]); + await game.startBattle([Species.RESHIRAM]); const partyMember = game.scene.getPlayerPokemon()!; diff --git a/src/test/moves/fusion_flare_bolt.test.ts b/test/moves/fusion_flare_bolt.test.ts similarity index 69% rename from src/test/moves/fusion_flare_bolt.test.ts rename to test/moves/fusion_flare_bolt.test.ts index 0d9b9898276..9a379cb4588 100644 --- a/src/test/moves/fusion_flare_bolt.test.ts +++ b/test/moves/fusion_flare_bolt.test.ts @@ -1,13 +1,13 @@ import { Stat } from "#enums/stat"; import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { allMoves } from "#app/data/moves/move"; +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"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -30,11 +30,11 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ fusionFlare.id, fusionBolt.id ]); + game.override.moveset([fusionFlare.id, fusionBolt.id]); game.override.startingLevel(1); game.override.enemySpecies(Species.RESHIRAM); - game.override.enemyMoveset([ Moves.REST, Moves.REST, Moves.REST, Moves.REST ]); + game.override.enemyMoveset([Moves.REST, Moves.REST, Moves.REST, Moves.REST]); game.override.battleType("double"); game.override.startingWave(97); @@ -45,66 +45,57 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { }); it("FUSION_FLARE should double power of subsequent FUSION_BOLT", async () => { - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionFlare.id, 0, BattlerIndex.ENEMY); game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); // Force user party to act before enemy party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); 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); it("FUSION_BOLT should double power of subsequent FUSION_FLARE", async () => { - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionBolt.id, 0, BattlerIndex.ENEMY); game.move.select(fusionFlare.id, 1, BattlerIndex.ENEMY); // Force user party to act before enemy party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); 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); it("FUSION_FLARE should double power of subsequent FUSION_BOLT if a move failed in between", async () => { - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionFlare.id, 0, BattlerIndex.PLAYER); game.move.select(fusionBolt.id, 1, BattlerIndex.PLAYER); // Force first enemy to act (and fail) in between party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); 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,26 +105,23 @@ 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); it("FUSION_FLARE should not double power of subsequent FUSION_BOLT if a move succeeded in between", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); game.move.select(fusionFlare.id, 0, BattlerIndex.ENEMY); game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); // Force first enemy to act in between party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); 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,41 +130,35 @@ 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); it("FUSION_FLARE should double power of subsequent FUSION_BOLT if moves are aimed at allies", async () => { - await game.startBattle([ - Species.ZEKROM, - Species.RESHIRAM - ]); + await game.startBattle([Species.ZEKROM, Species.RESHIRAM]); game.move.select(fusionBolt.id, 0, BattlerIndex.PLAYER_2); game.move.select(fusionFlare.id, 1, BattlerIndex.PLAYER); // Force user party to act before enemy party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); 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); it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves", async () => { - game.override.enemyMoveset([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + game.override.enemyMoveset([fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); - const party = game.scene.getParty(); + const party = game.scene.getPlayerParty(); const enemyParty = game.scene.getEnemyParty(); // Get rid of any modifiers that may alter power @@ -185,19 +167,17 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { // Mock stats by replacing entries in copy with desired values for specific stats const stats = { - enemy: [ - [ ...enemyParty[0].stats ], - [ ...enemyParty[1].stats ], - ], - player: [ - [ ...party[0].stats ], - [ ...party[1].stats ], - ] + enemy: [[...enemyParty[0].stats], [...enemyParty[1].stats]], + player: [[...party[0].stats], [...party[1].stats]], }; // Ensure survival by reducing enemy Sp. Atk and boosting party Sp. Def - vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue(stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val))); - vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue(stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val))); + vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue( + stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val)), + ); + vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue( + stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val)), + ); vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[0].map((val, i) => (i === Stat.SPDEF ? 250 : val))); vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[1].map((val, i) => (i === Stat.SPDEF ? 250 : val))); @@ -205,37 +185,34 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { game.move.select(fusionBolt.id, 1, BattlerIndex.ENEMY); // Force first enemy to act in between party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); 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); it("FUSION_FLARE and FUSION_BOLT alternating throughout turn should double power of subsequent moves if moves are aimed at allies", async () => { - game.override.enemyMoveset([ fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id ]); - await game.startBattle([ - Species.ZEKROM, - Species.ZEKROM - ]); + game.override.enemyMoveset([fusionFlare.id, fusionFlare.id, fusionFlare.id, fusionFlare.id]); + await game.startBattle([Species.ZEKROM, Species.ZEKROM]); - const party = game.scene.getParty(); + const party = game.scene.getPlayerParty(); const enemyParty = game.scene.getEnemyParty(); // Get rid of any modifiers that may alter power @@ -244,19 +221,17 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { // Mock stats by replacing entries in copy with desired values for specific stats const stats = { - enemy: [ - [ ...enemyParty[0].stats ], - [ ...enemyParty[1].stats ], - ], - player: [ - [ ...party[0].stats ], - [ ...party[1].stats ], - ] + enemy: [[...enemyParty[0].stats], [...enemyParty[1].stats]], + player: [[...party[0].stats], [...party[1].stats]], }; // Ensure survival by reducing enemy Sp. Atk and boosting party Sp. Def - vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue(stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val))); - vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue(stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val))); + vi.spyOn(enemyParty[0], "stats", "get").mockReturnValue( + stats.enemy[0].map((val, i) => (i === Stat.SPATK ? 1 : val)), + ); + vi.spyOn(enemyParty[1], "stats", "get").mockReturnValue( + stats.enemy[1].map((val, i) => (i === Stat.SPATK ? 1 : val)), + ); vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[0].map((val, i) => (i === Stat.SPDEF ? 250 : val))); vi.spyOn(party[1], "stats", "get").mockReturnValue(stats.player[1].map((val, i) => (i === Stat.SPDEF ? 250 : val))); @@ -264,26 +239,26 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { game.move.select(fusionBolt.id, 1, BattlerIndex.PLAYER); // Force first enemy to act in between party - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); 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/test/moves/future_sight.test.ts b/test/moves/future_sight.test.ts new file mode 100644 index 00000000000..40a940447e4 --- /dev/null +++ b/test/moves/future_sight.test.ts @@ -0,0 +1,45 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Future Sight", () => { + 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 + .startingLevel(50) + .moveset([Moves.FUTURE_SIGHT, Moves.SPLASH]) + .battleType("single") + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.STURDY) + .enemyMoveset(Moves.SPLASH); + }); + + it("hits 2 turns after use, ignores user switch out", async () => { + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); + + game.move.select(Moves.FUTURE_SIGHT); + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.getEnemyPokemon()!.isFullHp()).toBe(false); + }); +}); diff --git a/src/test/moves/gastro_acid.test.ts b/test/moves/gastro_acid.test.ts similarity index 90% rename from src/test/moves/gastro_acid.test.ts rename to test/moves/gastro_acid.test.ts index fdd75b90b13..c9f2428845e 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/test/moves/gastro_acid.test.ts @@ -3,10 +3,9 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Gastro Acid", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,7 +26,7 @@ describe("Moves - Gastro Acid", () => { game.override.startingLevel(1); game.override.enemyLevel(100); game.override.ability(Abilities.NONE); - game.override.moveset([ Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER ]); + game.override.moveset([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); game.override.enemySpecies(Species.BIDOOF); game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.WATER_ABSORB); @@ -62,13 +61,13 @@ describe("Moves - Gastro Acid", () => { }); it("fails if used on an enemy with an already-suppressed ability", async () => { - game.override.battleType(null); + game.override.battleType("single"); await game.startBattle(); game.move.select(Moves.CORE_ENFORCER); // Force player to be slower to enable Core Enforcer to proc its suppression effect - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnInitPhase"); diff --git a/src/test/moves/geomancy.test.ts b/test/moves/geomancy.test.ts similarity index 69% rename from src/test/moves/geomancy.test.ts rename to test/moves/geomancy.test.ts index 6e2f40b9144..34281c96c60 100644 --- a/src/test/moves/geomancy.test.ts +++ b/test/moves/geomancy.test.ts @@ -1,9 +1,10 @@ -import { EffectiveStat, Stat } from "#enums/stat"; +import type { EffectiveStat } from "#enums/stat"; +import { Stat } from "#enums/stat"; 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; @@ -34,31 +35,31 @@ describe("Moves - Geomancy", () => { }); it("should boost the user's stats on the second turn of use", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; - const affectedStats: EffectiveStat[] = [ Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + const affectedStats: EffectiveStat[] = [Stat.SPATK, Stat.SPDEF, Stat.SPD]; game.move.select(Moves.GEOMANCY); await game.phaseInterceptor.to("TurnEndPhase"); - affectedStats.forEach((stat) => expect(player.getStatStage(stat)).toBe(0)); + affectedStats.forEach(stat => expect(player.getStatStage(stat)).toBe(0)); expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.OTHER); await game.phaseInterceptor.to("TurnEndPhase"); - affectedStats.forEach((stat) => expect(player.getStatStage(stat)).toBe(2)); + affectedStats.forEach(stat => expect(player.getStatStage(stat)).toBe(2)); expect(player.getMoveHistory()).toHaveLength(2); expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); - const playerGeomancy = player.getMoveset().find((mv) => mv && mv.moveId === Moves.GEOMANCY); + const playerGeomancy = player.getMoveset().find(mv => mv && mv.moveId === Moves.GEOMANCY); expect(playerGeomancy?.ppUsed).toBe(1); }); it("should execute over 2 turns between waves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const player = game.scene.getPlayerPokemon()!; - const affectedStats: EffectiveStat[] = [ Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + const affectedStats: EffectiveStat[] = [Stat.SPATK, Stat.SPDEF, Stat.SPD]; game.move.select(Moves.GEOMANCY); @@ -68,11 +69,11 @@ describe("Moves - Geomancy", () => { await game.toNextWave(); await game.phaseInterceptor.to("TurnEndPhase"); - affectedStats.forEach((stat) => expect(player.getStatStage(stat)).toBe(2)); + affectedStats.forEach(stat => expect(player.getStatStage(stat)).toBe(2)); expect(player.getMoveHistory()).toHaveLength(2); expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); - const playerGeomancy = player.getMoveset().find((mv) => mv && mv.moveId === Moves.GEOMANCY); + const playerGeomancy = player.getMoveset().find(mv => mv && mv.moveId === Moves.GEOMANCY); expect(playerGeomancy?.ppUsed).toBe(1); }); }); diff --git a/src/test/moves/gigaton_hammer.test.ts b/test/moves/gigaton_hammer.test.ts similarity index 83% rename from src/test/moves/gigaton_hammer.test.ts rename to test/moves/gigaton_hammer.test.ts index f54700fe660..a6f7438a0a2 100644 --- a/src/test/moves/gigaton_hammer.test.ts +++ b/test/moves/gigaton_hammer.test.ts @@ -1,5 +1,5 @@ import { BattlerIndex } from "#app/battle"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; @@ -25,20 +25,20 @@ describe("Moves - Gigaton Hammer", () => { .battleType("single") .enemySpecies(Species.MAGIKARP) .starterSpecies(Species.FEEBAS) - .moveset([ Moves.GIGATON_HAMMER ]) + .moveset([Moves.GIGATON_HAMMER]) .startingLevel(10) .enemyLevel(100) .enemyMoveset(Moves.SPLASH) .disableCrits(); }); - it("can't be used two turns in a row", async() => { + it("can't be used two turns in a row", async () => { await game.classicMode.startBattle(); const enemy1 = game.scene.getEnemyPokemon()!; game.move.select(Moves.GIGATON_HAMMER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp()); @@ -54,14 +54,14 @@ describe("Moves - Gigaton Hammer", () => { expect(enemy2.hp).toBe(enemy2.getMaxHp()); }, 20000); - it("can be used again if recalled and sent back out", async() => { + it("can be used again if recalled and sent back out", async () => { game.override.startingWave(4); await game.classicMode.startBattle(); const enemy1 = game.scene.getEnemyPokemon()!; game.move.select(Moves.GIGATON_HAMMER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp()); diff --git a/src/test/moves/glaive_rush.test.ts b/test/moves/glaive_rush.test.ts similarity index 80% rename from src/test/moves/glaive_rush.test.ts rename to test/moves/glaive_rush.test.ts index b36c3e20c7a..d3531b172e2 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/test/moves/glaive_rush.test.ts @@ -1,12 +1,11 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Glaive Rush", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,10 +27,10 @@ describe("Moves - Glaive Rush", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.GLAIVE_RUSH ]) + .enemyMoveset([Moves.GLAIVE_RUSH]) .starterSpecies(Species.KLINK) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH ]); + .moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); }); it("takes double damage from attacks", async () => { @@ -41,13 +40,12 @@ 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"); - expect(enemy.hp).toBeLessThanOrEqual(1001 - (damageDealt * 3)); - + await game.phaseInterceptor.to("DamageAnimPhase"); + expect(enemy.hp).toBeLessThanOrEqual(1001 - damageDealt * 3); }); it("always gets hit by attacks", async () => { @@ -60,13 +58,10 @@ describe("Moves - Glaive Rush", () => { game.move.select(Moves.AVALANCHE); await game.phaseInterceptor.to("TurnEndPhase"); expect(enemy.hp).toBeLessThan(1000); - }); it("interacts properly with multi-lens", async () => { - game.override - .startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) - .enemyMoveset([ Moves.AVALANCHE ]); + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 2 }]).enemyMoveset([Moves.AVALANCHE]); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -83,11 +78,10 @@ describe("Moves - Glaive Rush", () => { game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(1000); - }); it("secondary effects only last until next move", async () => { - game.override.enemyMoveset([ Moves.SHADOW_SNEAK ]); + game.override.enemyMoveset([Moves.SHADOW_SNEAK]); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -109,14 +103,11 @@ describe("Moves - Glaive Rush", () => { game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(damagedHp); - }); it("secondary effects are removed upon switching", async () => { - game.override - .enemyMoveset([ Moves.SHADOW_SNEAK ]) - .starterSpecies(0); - await game.classicMode.startBattle([ Species.KLINK, Species.FEEBAS ]); + game.override.enemyMoveset([Moves.SHADOW_SNEAK]).starterSpecies(0); + await game.classicMode.startBattle([Species.KLINK, Species.FEEBAS]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -133,11 +124,10 @@ describe("Moves - Glaive Rush", () => { game.doSwitchPokemon(1); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(player.getMaxHp()); - }); it("secondary effects don't activate if move fails", async () => { - game.override.moveset([ Moves.SHADOW_SNEAK, Moves.PROTECT, Moves.SPLASH, Moves.GLAIVE_RUSH ]); + game.override.moveset([Moves.SHADOW_SNEAK, Moves.PROTECT, Moves.SPLASH, Moves.GLAIVE_RUSH]); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -151,7 +141,7 @@ describe("Moves - Glaive Rush", () => { game.move.select(Moves.SHADOW_SNEAK); await game.phaseInterceptor.to("TurnEndPhase"); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); const damagedHP1 = 1000 - enemy.hp; enemy.hp = 1000; @@ -159,6 +149,6 @@ describe("Moves - Glaive Rush", () => { await game.phaseInterceptor.to("TurnEndPhase"); const damagedHP2 = 1000 - enemy.hp; - expect(damagedHP2).toBeGreaterThanOrEqual((damagedHP1 * 2) - 1); + expect(damagedHP2).toBeGreaterThanOrEqual(damagedHP1 * 2 - 1); }); }); diff --git a/src/test/moves/growth.test.ts b/test/moves/growth.test.ts similarity index 85% rename from src/test/moves/growth.test.ts rename to test/moves/growth.test.ts index a66e4ec6719..926593a4f72 100644 --- a/src/test/moves/growth.test.ts +++ b/test/moves/growth.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -27,14 +27,12 @@ describe("Moves - Growth", () => { game.override.battleType("single"); game.override.enemyAbility(Abilities.MOXIE); game.override.ability(Abilities.INSOMNIA); - game.override.moveset([ Moves.GROWTH ]); + game.override.moveset([Moves.GROWTH]); game.override.enemyMoveset(Moves.SPLASH); }); - it("should raise SPATK stat stage by 1", async() => { - await game.startBattle([ - Species.MIGHTYENA - ]); + it("should raise SPATK stat stage by 1", async () => { + await game.startBattle([Species.MIGHTYENA]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/grudge.test.ts b/test/moves/grudge.test.ts new file mode 100644 index 00000000000..ebd062a76ee --- /dev/null +++ b/test/moves/grudge.test.ts @@ -0,0 +1,90 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattlerIndex } from "#app/battle"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Grudge", () => { + 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.EMBER, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.SHEDINJA) + .enemyAbility(Abilities.WONDER_GUARD) + .enemyMoveset([Moves.GRUDGE, Moves.SPLASH]); + }); + + it("should reduce the PP of the Pokemon's move to 0 when the user has fainted", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + const playerPokemon = game.scene.getPlayerPokemon(); + game.move.select(Moves.EMBER); + await game.forceEnemyMove(Moves.GRUDGE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + const playerMove = playerPokemon?.getMoveset().find(m => m?.moveId === Moves.EMBER); + + expect(playerMove?.getPpRatio()).toBe(0); + }); + + it("should remain in effect until the user's next move", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + const playerPokemon = game.scene.getPlayerPokemon(); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.GRUDGE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + + game.move.select(Moves.EMBER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase"); + + const playerMove = playerPokemon?.getMoveset().find(m => m?.moveId === Moves.EMBER); + + expect(playerMove?.getPpRatio()).toBe(0); + }); + + it("should not reduce the opponent's PP if the user dies to weather/indirect damage", async () => { + // Opponent will be reduced to 1 HP by False Swipe, then faint to Sandstorm + game.override + .moveset([Moves.FALSE_SWIPE]) + .startingLevel(100) + .ability(Abilities.SAND_STREAM) + .enemySpecies(Species.RATTATA); + await game.classicMode.startBattle([Species.GEODUDE]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + const playerPokemon = game.scene.getPlayerPokemon(); + + game.move.select(Moves.FALSE_SWIPE); + await game.forceEnemyMove(Moves.GRUDGE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemyPokemon?.isFainted()).toBe(true); + + const playerMove = playerPokemon?.getMoveset().find(m => m?.moveId === Moves.FALSE_SWIPE); + expect(playerMove?.getPpRatio()).toBeGreaterThan(0); + }); +}); diff --git a/src/test/moves/guard_split.test.ts b/test/moves/guard_split.test.ts similarity index 90% rename from src/test/moves/guard_split.test.ts rename to test/moves/guard_split.test.ts index 519f347b920..5db07e4e82c 100644 --- a/src/test/moves/guard_split.test.ts +++ b/test/moves/guard_split.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; @@ -28,15 +28,13 @@ describe("Moves - Guard Split", () => { .enemyAbility(Abilities.NONE) .enemySpecies(Species.MEW) .enemyLevel(200) - .moveset([ Moves.GUARD_SPLIT ]) + .moveset([Moves.GUARD_SPLIT]) .ability(Abilities.NONE); }); it("should average the user's DEF and SPDEF stats with those of the target", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ - Species.INDEEDEE - ]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -55,10 +53,8 @@ describe("Moves - Guard Split", () => { }, 20000); it("should be idempotent", async () => { - game.override.enemyMoveset([ Moves.GUARD_SPLIT ]); - await game.startBattle([ - Species.INDEEDEE - ]); + game.override.enemyMoveset([Moves.GUARD_SPLIT]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/guard_swap.test.ts b/test/moves/guard_swap.test.ts similarity index 91% rename from src/test/moves/guard_swap.test.ts rename to test/moves/guard_swap.test.ts index 99769b32899..be824672f32 100644 --- a/src/test/moves/guard_swap.test.ts +++ b/test/moves/guard_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; @@ -29,14 +29,12 @@ describe("Moves - Guard Swap", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.INDEEDEE) .enemyLevel(200) - .moveset([ Moves.GUARD_SWAP ]) + .moveset([Moves.GUARD_SWAP]) .ability(Abilities.NONE); }); it("should swap the user's DEF and SPDEF stat stages with the target's", async () => { - await game.classicMode.startBattle([ - Species.INDEEDEE - ]); + await game.classicMode.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/hard_press.test.ts b/test/moves/hard_press.test.ts similarity index 84% rename from src/test/moves/hard_press.test.ts rename to test/moves/hard_press.test.ts index 0fa4181491c..1bb6adc8e90 100644 --- a/src/test/moves/hard_press.test.ts +++ b/test/moves/hard_press.test.ts @@ -1,9 +1,9 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -30,12 +30,12 @@ describe("Moves - Hard Press", () => { game.override.enemySpecies(Species.MUNCHLAX); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyMoveset(Moves.SPLASH); - game.override.moveset([ Moves.HARD_PRESS ]); + game.override.moveset([Moves.HARD_PRESS]); vi.spyOn(moveToCheck, "calculateBattlePower"); }); it("should return 100 power if target HP ratio is at 100%", async () => { - await game.startBattle([ Species.PIKACHU ]); + await game.startBattle([Species.PIKACHU]); game.move.select(Moves.HARD_PRESS); await game.phaseInterceptor.to(MoveEffectPhase); @@ -44,8 +44,8 @@ describe("Moves - Hard Press", () => { }); it("should return 50 power if target HP ratio is at 50%", async () => { - await game.startBattle([ Species.PIKACHU ]); - const targetHpRatio = .5; + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = 0.5; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); @@ -57,8 +57,8 @@ describe("Moves - Hard Press", () => { }); it("should return 1 power if target HP ratio is at 1%", async () => { - await game.startBattle([ Species.PIKACHU ]); - const targetHpRatio = .01; + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = 0.01; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); @@ -70,8 +70,8 @@ describe("Moves - Hard Press", () => { }); it("should return 1 power if target HP ratio is less than 1%", async () => { - await game.startBattle([ Species.PIKACHU ]); - const targetHpRatio = .005; + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = 0.005; const enemy = game.scene.getEnemyPokemon()!; vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); diff --git a/src/test/moves/haze.test.ts b/test/moves/haze.test.ts similarity index 90% rename from src/test/moves/haze.test.ts rename to test/moves/haze.test.ts index 30aab8bd98c..d890678b466 100644 --- a/src/test/moves/haze.test.ts +++ b/test/moves/haze.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -31,12 +31,12 @@ describe("Moves - Haze", () => { game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(100); - game.override.moveset([ Moves.HAZE, Moves.SWORDS_DANCE, Moves.CHARM, Moves.SPLASH ]); + game.override.moveset([Moves.HAZE, Moves.SWORDS_DANCE, Moves.CHARM, Moves.SPLASH]); game.override.ability(Abilities.NONE); }); it("should reset all stat changes of all Pokemon on field", async () => { - await game.startBattle([ Species.RATTATA ]); + await game.startBattle([Species.RATTATA]); const user = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/heal_bell.test.ts b/test/moves/heal_bell.test.ts similarity index 84% rename from src/test/moves/heal_bell.test.ts rename to test/moves/heal_bell.test.ts index e4a019d9c0e..4c0148bfd04 100644 --- a/src/test/moves/heal_bell.test.ts +++ b/test/moves/heal_bell.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; @@ -24,7 +24,7 @@ describe("Moves - Heal Bell", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.HEAL_BELL, Moves.SPLASH ]) + .moveset([Moves.HEAL_BELL, Moves.SPLASH]) .statusEffect(StatusEffect.BURN) .battleType("double") .enemyAbility(Abilities.BALL_FETCH) @@ -32,8 +32,8 @@ describe("Moves - Heal Bell", () => { }); it("should cure status effect of the user, its ally, and all party pokemon", async () => { - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getParty(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); @@ -55,8 +55,8 @@ describe("Moves - Heal Bell", () => { it("should not cure status effect of the target/target's allies", async () => { game.override.enemyStatusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftOpp, rightOpp ] = game.scene.getEnemyField(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); vi.spyOn(leftOpp, "resetStatus"); vi.spyOn(rightOpp, "resetStatus"); @@ -78,8 +78,8 @@ describe("Moves - Heal Bell", () => { it("should not cure status effect of allies ON FIELD with Soundproof, should still cure allies in party", async () => { game.override.ability(Abilities.SOUNDPROOF); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getParty(); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); diff --git a/src/test/moves/heal_block.test.ts b/test/moves/heal_block.test.ts similarity index 73% rename from src/test/moves/heal_block.test.ts rename to test/moves/heal_block.test.ts index 252533215a8..4ef67214a91 100644 --- a/src/test/moves/heal_block.test.ts +++ b/test/moves/heal_block.test.ts @@ -1,12 +1,12 @@ import { BattlerIndex } from "#app/battle"; import { ArenaTagSide } from "#app/data/arena-tag"; -import { WeatherType } from "#app/data/weather"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { WeatherType } from "#enums/weather-type"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -28,7 +28,7 @@ describe("Moves - Heal Block", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.ABSORB, Moves.WISH, Moves.SPLASH, Moves.AQUA_RING ]) + .moveset([Moves.ABSORB, Moves.WISH, Moves.SPLASH, Moves.AQUA_RING]) .enemyMoveset(Moves.HEAL_BLOCK) .ability(Abilities.NO_GUARD) .enemyAbility(Abilities.BALL_FETCH) @@ -36,9 +36,8 @@ describe("Moves - Heal Block", () => { .disableCrits(); }); - it("shouldn't stop damage from HP-drain attacks, just HP restoration", async() => { - - await game.classicMode.startBattle([ Species.CHARIZARD ]); + it("shouldn't stop damage from HP-drain attacks, just HP restoration", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -46,31 +45,31 @@ describe("Moves - Heal Block", () => { player.damageAndUpdate(enemy.getMaxHp() - 1); game.move.select(Moves.ABSORB); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.hp).toBe(1); expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); }); - it("shouldn't stop Liquid Ooze from dealing damage", async() => { + it("shouldn't stop Liquid Ooze from dealing damage", async () => { game.override.enemyAbility(Abilities.LIQUID_OOZE); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.ABSORB); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.isFullHp()).toBe(false); expect(enemy.isFullHp()).toBe(false); }); - it("should stop delayed heals, such as from Wish", async() => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + it("should stop delayed heals, such as from Wish", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; @@ -88,10 +87,10 @@ describe("Moves - Heal Block", () => { expect(player.hp).toBe(1); }); - it("should prevent Grassy Terrain from restoring HP", async() => { + it("should prevent Grassy Terrain from restoring HP", async () => { game.override.enemyAbility(Abilities.GRASSY_SURGE); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; @@ -103,8 +102,8 @@ describe("Moves - Heal Block", () => { expect(player.hp).toBe(1); }); - it("should prevent healing from heal-over-time moves", async() => { - await game.classicMode.startBattle([ Species.CHARIZARD ]); + it("should prevent healing from heal-over-time moves", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; @@ -117,12 +116,10 @@ describe("Moves - Heal Block", () => { expect(player.hp).toBe(1); }); - it("should prevent abilities from restoring HP", async() => { - game.override - .weather(WeatherType.RAIN) - .ability(Abilities.RAIN_DISH); + it("should prevent abilities from restoring HP", async () => { + game.override.weather(WeatherType.RAIN).ability(Abilities.RAIN_DISH); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; @@ -134,10 +131,10 @@ describe("Moves - Heal Block", () => { expect(player.hp).toBe(1); }); - it("should stop healing from items", async() => { + it("should stop healing from items", async () => { game.override.startingHeldItems([{ name: "LEFTOVERS" }]); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); const player = game.scene.getPlayerPokemon()!; player.damageAndUpdate(player.getMaxHp() - 1); diff --git a/src/test/moves/heart_swap.test.ts b/test/moves/heart_swap.test.ts similarity index 91% rename from src/test/moves/heart_swap.test.ts rename to test/moves/heart_swap.test.ts index a128549c459..a3d892cd518 100644 --- a/src/test/moves/heart_swap.test.ts +++ b/test/moves/heart_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; @@ -29,14 +29,12 @@ describe("Moves - Heart Swap", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.INDEEDEE) .enemyLevel(200) - .moveset([ Moves.HEART_SWAP ]) + .moveset([Moves.HEART_SWAP]) .ability(Abilities.NONE); }); it("should swap all of the user's stat stages with the target's", async () => { - await game.classicMode.startBattle([ - Species.MANAPHY - ]); + await game.classicMode.startBattle([Species.MANAPHY]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/test/moves/hyper_beam.test.ts b/test/moves/hyper_beam.test.ts new file mode 100644 index 00000000000..5cd54e9b46a --- /dev/null +++ b/test/moves/hyper_beam.test.ts @@ -0,0 +1,67 @@ +import { allMoves } from "#app/data/moves/move"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Hyper Beam", () => { + 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.ability(Abilities.BALL_FETCH); + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.BALL_FETCH); + game.override.enemyMoveset([Moves.SPLASH]); + game.override.enemyLevel(100); + + game.override.moveset([Moves.HYPER_BEAM, Moves.TACKLE]); + vi.spyOn(allMoves[Moves.HYPER_BEAM], "accuracy", "get").mockReturnValue(100); + }); + + it("should force the user to recharge on the next turn (and only that turn)", async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.HYPER_BEAM); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); + + const enemyPostAttackHp = enemyPokemon.hp; + + /** Game should progress without a new command from the player */ + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.hp).toBe(enemyPostAttackHp); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBeLessThan(enemyPostAttackHp); + }); +}); diff --git a/src/test/moves/imprison.test.ts b/test/moves/imprison.test.ts similarity index 85% rename from src/test/moves/imprison.test.ts rename to test/moves/imprison.test.ts index f10e20dab63..89ef9981040 100644 --- a/src/test/moves/imprison.test.ts +++ b/test/moves/imprison.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -25,13 +25,13 @@ describe("Moves - Imprison", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.IMPRISON, Moves.SPLASH, Moves.GROWL ]) + .enemyMoveset([Moves.IMPRISON, Moves.SPLASH, Moves.GROWL]) .enemySpecies(Species.SHUCKLE) - .moveset([ Moves.TRANSFORM, Moves.SPLASH ]); + .moveset([Moves.TRANSFORM, Moves.SPLASH]); }); it("Pokemon under Imprison cannot use shared moves", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -39,7 +39,10 @@ describe("Moves - Imprison", () => { await game.forceEnemyMove(Moves.IMPRISON); await game.toNextTurn(); const playerMoveset = playerPokemon.getMoveset().map(x => x?.moveId); - const enemyMoveset = game.scene.getEnemyPokemon()!.getMoveset().map(x => x?.moveId); + const enemyMoveset = game.scene + .getEnemyPokemon()! + .getMoveset() + .map(x => x?.moveId); expect(enemyMoveset.includes(playerMoveset[0])).toBeTruthy(); const imprisonArenaTag = game.scene.arena.getTag(ArenaTagType.IMPRISON); const imprisonBattlerTag = playerPokemon.getTag(BattlerTagType.IMPRISON); @@ -55,7 +58,7 @@ describe("Moves - Imprison", () => { }); it("Imprison applies to Pokemon switched into Battle", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI, Species.BULBASAUR ]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); const playerPokemon1 = game.scene.getPlayerPokemon()!; @@ -78,8 +81,8 @@ describe("Moves - Imprison", () => { }); it("The effects of Imprison only end when the source is no longer active", async () => { - game.override.moveset([ Moves.SPLASH, Moves.IMPRISON ]); - await game.classicMode.startBattle([ Species.REGIELEKI, Species.BULBASAUR ]); + game.override.moveset([Moves.SPLASH, Moves.IMPRISON]); + await game.classicMode.startBattle([Species.REGIELEKI, Species.BULBASAUR]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/test/moves/instruct.test.ts b/test/moves/instruct.test.ts new file mode 100644 index 00000000000..079c8803ddc --- /dev/null +++ b/test/moves/instruct.test.ts @@ -0,0 +1,541 @@ +import { BattlerIndex } from "#app/battle"; +import type Pokemon from "#app/field/pokemon"; +import { MoveResult } from "#app/field/pokemon"; +import type { MovePhase } from "#app/phases/move-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/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(target: Pokemon, move: Moves): void { + expect(target.getLastXMoves(-1)[0].move).toBe(move); + expect(target.getLastXMoves(-1)[1].move).toBe(target.getLastXMoves()[0].move); + expect(target.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) + .disableCrits(); + }); + + it("should repeat target's last used move", async () => { + game.override.moveset(Moves.INSTRUCT).enemyLevel(1000); // ensures shuckle no die + await game.classicMode.startBattle([Species.AMOONGUSS]); + + const enemy = game.scene.getEnemyPokemon()!; + game.move.changeMoveset(enemy, Moves.SONIC_BOOM); + + game.move.select(Moves.INSTRUCT); + await game.forceEnemyMove(Moves.SONIC_BOOM); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("MovePhase"); // enemy attacks us + await game.phaseInterceptor.to("MovePhase", false); // instruct + let currentPhase = game.scene.getCurrentPhase() as MovePhase; + expect(currentPhase.pokemon).toBe(game.scene.getPlayerPokemon()); + await game.phaseInterceptor.to("MoveEndPhase"); + + await game.phaseInterceptor.to("MovePhase", false); // enemy repeats move + currentPhase = game.scene.getCurrentPhase() as MovePhase; + expect(currentPhase.pokemon).toBe(enemy); + expect(currentPhase.move.moveId).toBe(Moves.SONIC_BOOM); + await game.phaseInterceptor.to("TurnEndPhase", false); + + instructSuccess(enemy, Moves.SONIC_BOOM); + expect(game.scene.getPlayerPokemon()?.getInverseHp()).toBe(40); + }); + + it("should repeat enemy's move through substitute", async () => { + game.override.moveset([Moves.INSTRUCT, Moves.SPLASH]); + 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); + + instructSuccess(game.scene.getEnemyPokemon()!, Moves.SONIC_BOOM); + expect(game.scene.getPlayerPokemon()?.getInverseHp()).toBe(40); + }); + + it("should repeat ally's attack on enemy", async () => { + game.override.battleType("double").enemyMoveset(Moves.SPLASH); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.SHUCKLE]); + + const [amoonguss, shuckle] = game.scene.getPlayerField(); + game.move.changeMoveset(amoonguss, [Moves.INSTRUCT, Moves.SONIC_BOOM]); + game.move.changeMoveset(shuckle, [Moves.INSTRUCT, 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.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + instructSuccess(shuckle, Moves.SONIC_BOOM); + expect(game.scene.getEnemyField()[0].getInverseHp()).toBe(40); + }); + + // TODO: Enable test case once gigaton hammer (and blood moon) are reworked + it.todo("should repeat enemy's Gigaton Hammer", async () => { + game.override.moveset(Moves.INSTRUCT).enemyLevel(5); + await game.classicMode.startBattle([Species.AMOONGUSS]); + + const enemy = game.scene.getEnemyPokemon()!; + game.move.changeMoveset(enemy, [Moves.GIGATON_HAMMER, Moves.BLOOD_MOON]); + + game.move.select(Moves.INSTRUCT); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + instructSuccess(enemy, Moves.GIGATON_HAMMER); + expect(game.scene.getPlayerPokemon()!.turnData.attacksReceived.length).toBe(2); + }); + + it("should add moves to move queue for copycat", async () => { + game.override.battleType("double").moveset(Moves.INSTRUCT).enemyLevel(5); + await game.classicMode.startBattle([Species.AMOONGUSS]); + + const [enemy1, enemy2] = game.scene.getEnemyField()!; + game.move.changeMoveset(enemy1, Moves.WATER_GUN); + game.move.changeMoveset(enemy2, Moves.COPYCAT); + + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("BerryPhase"); + + instructSuccess(enemy1, Moves.WATER_GUN); + // amoonguss gets hit by water gun thrice; once by original attack, once by instructed use and once by copycat + expect(game.scene.getPlayerPokemon()!.turnData.attacksReceived.length).toBe(3); + }); + + it("should respect enemy's status condition", async () => { + game.override.moveset([Moves.INSTRUCT, Moves.THUNDER_WAVE]).enemyMoveset(Moves.SONIC_BOOM); + await game.classicMode.startBattle([Species.AMOONGUSS]); + + game.move.select(Moves.THUNDER_WAVE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + game.move.select(Moves.INSTRUCT); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MovePhase"); + // force enemy's instructed move to bork and then immediately thaw out + await game.move.forceStatusActivation(true); + await game.move.forceStatusActivation(false); + await game.phaseInterceptor.to("TurnEndPhase", false); + + const moveHistory = game.scene.getEnemyPokemon()?.getLastXMoves(-1)!; + expect(moveHistory.map(m => m.move)).toEqual([Moves.SONIC_BOOM, Moves.NONE, Moves.SONIC_BOOM]); + expect(game.scene.getPlayerPokemon()?.getInverseHp()).toBe(40); + }); + + it("should not repeat enemy's out of pp move", async () => { + game.override.moveset(Moves.INSTRUCT).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 playerMoves = game.scene.getPlayerPokemon()!.getLastXMoves(-1)!; + expect(playerMoves[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.getMoveHistory().length).toBe(1); + }); + + it("should redirect attacking moves if enemy faints", async () => { + game.override.battleType("double").enemyMoveset(Moves.SPLASH).enemySpecies(Species.MAGIKARP).enemyLevel(1); + await game.classicMode.startBattle([Species.HISUI_ELECTRODE, Species.KOMMO_O]); + + const [electrode, kommo_o] = game.scene.getPlayerField()!; + game.move.changeMoveset(electrode, Moves.CHLOROBLAST); + game.move.changeMoveset(kommo_o, Moves.INSTRUCT); + + game.move.select(Moves.CHLOROBLAST, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("BerryPhase"); + + // Chloroblast always deals 50% max HP% recoil UNLESS you whiff + // due to lack of targets or similar, + // so all we have to do is check whether electrode fainted or not. + // Naturally, both karps should also be dead as well. + expect(electrode.isFainted()).toBe(true); + const [karp1, karp2] = game.scene.getEnemyField()!; + expect(karp1.isFainted()).toBe(true); + expect(karp2.isFainted()).toBe(true); + }); + it("should allow for dancer copying of instructed dance move", async () => { + game.override.battleType("double").enemyMoveset([Moves.INSTRUCT, Moves.SPLASH]).enemyLevel(1000); + await game.classicMode.startBattle([Species.ORICORIO, Species.VOLCARONA]); + + const [oricorio, volcarona] = game.scene.getPlayerField(); + game.move.changeMoveset(oricorio, Moves.SPLASH); + game.move.changeMoveset(volcarona, Moves.FIERY_DANCE); + + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); + game.move.select(Moves.FIERY_DANCE, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); + await game.forceEnemyMove(Moves.INSTRUCT, 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"); + + // fiery dance triggered dancer successfully for a total of 4 hits + // Enemy level is set to a high value so that it does not faint even after all 4 hits + instructSuccess(volcarona, Moves.FIERY_DANCE); + expect(game.scene.getEnemyField()[0].turnData.attacksReceived.length).toBe(4); + }); + + it("should not repeat move when switching out", async () => { + game.override.enemyMoveset(Moves.INSTRUCT).enemySpecies(Species.UNOWN); + await game.classicMode.startBattle([Species.AMOONGUSS, Species.TOXICROAK]); + + const amoonguss = game.scene.getPlayerPokemon()!; + game.move.changeMoveset(amoonguss, Moves.SEED_BOMB); + + amoonguss.battleSummonData.moveHistory = [ + { + move: Moves.SEED_BOMB, + targets: [BattlerIndex.ENEMY], + result: MoveResult.SUCCESS, + }, + ]; + + game.doSwitchPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase", false); + + const enemyMoves = game.scene.getEnemyPokemon()!.getLastXMoves(-1)!; + expect(enemyMoves[0].result).toBe(MoveResult.FAIL); + }); + + it("should fail if no move has yet been used by target", async () => { + game.override.moveset(Moves.INSTRUCT).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.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.getEnemyField()[0]!.getLastXMoves()[0]; + expect(enemyMove.result).toBe(MoveResult.FAIL); + expect( + game.scene + .getEnemyField()[0] + .getMoveset() + .find(m => m?.moveId === Moves.SONIC_BOOM)?.ppUsed, + ).toBe(1); + }); + + it("should not repeat enemy's move through protect", async () => { + game.override.moveset([Moves.INSTRUCT]); + await game.classicMode.startBattle([Species.AMOONGUSS]); + + const enemy = game.scene.getEnemyPokemon()!; + game.move.changeMoveset(enemy, Moves.PROTECT); + game.move.select(Moves.INSTRUCT); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(enemy.getLastXMoves(-1)[0].move).toBe(Moves.PROTECT); + expect(enemy.getLastXMoves(-1)[1]).toBeUndefined(); // undefined because instruct failed and didn't repeat + expect(enemy.getMoveset().find(m => m?.moveId === Moves.PROTECT)?.ppUsed).toBe(1); + }); + + it("should not repeat enemy's charging move", async () => { + game.override.moveset([Moves.INSTRUCT]).enemyMoveset([Moves.SONIC_BOOM, Moves.HYPER_BEAM]); + await game.classicMode.startBattle([Species.SHUCKLE]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + enemy.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(); + + // instruct fails at copying last move due to charging turn (rather than instructing sonic boom) + 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 move since forgotten by target", async () => { + game.override.enemyLevel(5).xpMultiplier(0).enemySpecies(Species.WURMPLE).enemyMoveset(Moves.INSTRUCT); + await game.classicMode.startBattle([Species.REGIELEKI]); + + const regieleki = game.scene.getPlayerPokemon()!; + // fill out moveset with random moves + game.move.changeMoveset(regieleki, [Moves.ELECTRO_DRIFT, Moves.SPLASH, Moves.ICE_BEAM, Moves.ANCIENT_POWER]); + + game.move.select(Moves.ELECTRO_DRIFT); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("FaintPhase"); + await game.move.learnMove(Moves.ELECTROWEB); + await game.toNextWave(); + + game.move.select(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("TurnEndPhase", false); + expect(game.scene.getEnemyField()[0].getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should disregard priority of instructed move on use", async () => { + game.override.enemyMoveset([Moves.SPLASH, Moves.WHIRLWIND]).moveset(Moves.INSTRUCT); + await game.classicMode.startBattle([Species.LUCARIO, Species.BANETTE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.battleSummonData.moveHistory = [ + { + move: Moves.WHIRLWIND, + targets: [BattlerIndex.PLAYER], + result: MoveResult.SUCCESS, + virtual: false, + }, + ]; + + game.move.select(Moves.INSTRUCT); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase", false); + + // lucario instructed enemy whirlwind at 0 priority to switch itself out + const instructedMove = enemyPokemon.getLastXMoves(-1)[1]; + expect(instructedMove.result).toBe(MoveResult.SUCCESS); + expect(instructedMove.move).toBe(Moves.WHIRLWIND); + expect(game.scene.getPlayerPokemon()?.species.speciesId).toBe(Species.BANETTE); + }); + + it("should respect moves' original priority for psychic terrain", async () => { + game.override + .battleType("double") + .moveset([Moves.QUICK_ATTACK, Moves.SPLASH, Moves.INSTRUCT]) + .enemyMoveset([Moves.SPLASH, Moves.PSYCHIC_TERRAIN]); + await game.classicMode.startBattle([Species.BANETTE, Species.KLEFKI]); + + game.move.select(Moves.QUICK_ATTACK, BattlerIndex.PLAYER, BattlerIndex.ENEMY); // succeeds due to terrain no + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.PSYCHIC_TERRAIN); + await game.toNextTurn(); + + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + // quick attack failed when instructed + const banette = game.scene.getPlayerPokemon()!; + expect(banette.getLastXMoves(-1)[1].move).toBe(Moves.QUICK_ATTACK); + expect(banette.getLastXMoves(-1)[1].result).toBe(MoveResult.FAIL); + }); + + it("should still work w/ prankster in psychic terrain", async () => { + game.override.battleType("double").enemyMoveset([Moves.SPLASH, Moves.PSYCHIC_TERRAIN]); + await game.classicMode.startBattle([Species.BANETTE, Species.KLEFKI]); + + const [banette, klefki] = game.scene.getPlayerField()!; + game.move.changeMoveset(banette, [Moves.VINE_WHIP, Moves.SPLASH]); + game.move.changeMoveset(klefki, [Moves.INSTRUCT, Moves.SPLASH]); + + game.move.select(Moves.VINE_WHIP, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.PSYCHIC_TERRAIN); + await game.toNextTurn(); + + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); // copies vine whip + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("TurnEndPhase", false); + expect(banette.getLastXMoves(-1)[1].move).toBe(Moves.VINE_WHIP); + expect(banette.getLastXMoves(-1)[2].move).toBe(Moves.VINE_WHIP); + expect(banette.getMoveset().find(m => m?.moveId === Moves.VINE_WHIP)?.ppUsed).toBe(2); + }); + + it("should cause spread moves to correctly hit targets in doubles after singles", async () => { + game.override + .battleType("even-doubles") + .moveset([Moves.BREAKING_SWIPE, Moves.INSTRUCT, Moves.SPLASH]) + .enemyMoveset(Moves.SONIC_BOOM) + .enemySpecies(Species.AXEW) + .startingLevel(500); + await game.classicMode.startBattle([Species.KORAIDON, Species.KLEFKI]); + + const koraidon = game.scene.getPlayerField()[0]!; + + game.move.select(Moves.BREAKING_SWIPE); + await game.phaseInterceptor.to("TurnEndPhase", false); + expect(koraidon.getInverseHp()).toBe(0); + expect(koraidon.getLastXMoves(-1)[0].targets).toEqual([BattlerIndex.ENEMY]); + await game.toNextWave(); + + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("TurnEndPhase", false); + // did not take damage since enemies died beforehand; + // last move used hit both enemies + expect(koraidon.getInverseHp()).toBe(0); + expect(koraidon.getLastXMoves(-1)[1].targets?.sort()).toEqual([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + }); + + it("should cause AoE moves to correctly hit everyone in doubles after singles", async () => { + game.override + .battleType("even-doubles") + .moveset([Moves.BRUTAL_SWING, Moves.INSTRUCT, Moves.SPLASH]) + .enemySpecies(Species.AXEW) + .enemyMoveset(Moves.SONIC_BOOM) + .startingLevel(500); + await game.classicMode.startBattle([Species.KORAIDON, Species.KLEFKI]); + + const koraidon = game.scene.getPlayerField()[0]!; + + game.move.select(Moves.BRUTAL_SWING); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("TurnEndPhase", false); + expect(koraidon.getInverseHp()).toBe(0); + expect(koraidon.getLastXMoves(-1)[0].targets).toEqual([BattlerIndex.ENEMY]); + await game.toNextWave(); + + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER); + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER); + await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("TurnEndPhase", false); + // did not take damage since enemies died beforehand; + // last move used hit everything around it + expect(koraidon.getInverseHp()).toBe(0); + expect(koraidon.getLastXMoves(-1)[1].targets?.sort()).toEqual([ + BattlerIndex.PLAYER_2, + BattlerIndex.ENEMY, + BattlerIndex.ENEMY_2, + ]); + }); + + it("should cause multi-hit moves to hit the appropriate number of times in singles", async () => { + game.override + .enemyAbility(Abilities.SKILL_LINK) + .moveset([Moves.SPLASH, Moves.INSTRUCT]) + .enemyMoveset(Moves.BULLET_SEED); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const bulbasaur = 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(bulbasaur.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(bulbasaur.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) + .moveset([Moves.SPLASH, Moves.INSTRUCT]) + .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, BattlerIndex.PLAYER); + game.move.select(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.BULLET_SEED, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, 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, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER_2, 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/test/moves/jaw_lock.test.ts b/test/moves/jaw_lock.test.ts new file mode 100644 index 00000000000..fc71397e624 --- /dev/null +++ b/test/moves/jaw_lock.test.ts @@ -0,0 +1,153 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { FaintPhase } from "#app/phases/faint-phase"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import GameManager from "#test/testUtils/gameManager"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Jaw Lock", () => { + 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") + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset(Moves.SPLASH) + .moveset([Moves.JAW_LOCK, Moves.SPLASH]) + .startingLevel(100) + .enemyLevel(100) + .disableCrits(); + }); + + it("should trap the move's user and target", async () => { + await game.startBattle([Species.BULBASAUR]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.JAW_LOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + }); + + it("should not trap either pokemon if the target faints", async () => { + game.override.enemyLevel(1); + await game.startBattle([Species.BULBASAUR]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.JAW_LOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + + await game.phaseInterceptor.to(FaintPhase); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + }); + + it("should only trap the user until the target faints", async () => { + await game.startBattle([Species.BULBASAUR]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.JAW_LOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + await game.doKillOpponents(); + + expect(leadPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + }); + + it("should not trap other targets after the first target is trapped", async () => { + game.override.battleType("double"); + + await game.startBattle([Species.CHARMANDER, Species.BULBASAUR]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(enemyPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); + + await game.toNextTurn(); + + game.move.select(Moves.JAW_LOCK, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(enemyPokemon[1].getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)).toBeDefined(); + expect(playerPokemon[0].getTag(BattlerTagType.TRAPPED)?.sourceId).toBe(enemyPokemon[0].id); + }); + + it("should not trap either pokemon if the target is protected", async () => { + game.override.enemyMoveset([Moves.PROTECT]); + + await game.startBattle([Species.BULBASAUR]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.JAW_LOCK); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(playerPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + }); +}); diff --git a/src/test/moves/lash_out.test.ts b/test/moves/lash_out.test.ts similarity index 83% rename from src/test/moves/lash_out.test.ts rename to test/moves/lash_out.test.ts index 014c0ae8fe5..8395633f5c0 100644 --- a/src/test/moves/lash_out.test.ts +++ b/test/moves/lash_out.test.ts @@ -1,13 +1,12 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Moves - Lash Out", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,13 +28,12 @@ describe("Moves - Lash Out", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.FUR_COAT) - .enemyMoveset([ Moves.GROWL ]) + .enemyMoveset([Moves.GROWL]) .startingLevel(10) .enemyLevel(10) .starterSpecies(Species.FEEBAS) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.LASH_OUT ]); - + .moveset([Moves.LASH_OUT]); }); it("should deal double damage if the user's stat stages were lowered this turn", async () => { @@ -43,7 +41,7 @@ describe("Moves - Lash Out", () => { await game.classicMode.startBattle(); game.move.select(Moves.LASH_OUT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); expect(allMoves[Moves.LASH_OUT].calculateBattlePower).toHaveReturnedWith(150); diff --git a/test/moves/last_respects.test.ts b/test/moves/last_respects.test.ts new file mode 100644 index 00000000000..57752cea1af --- /dev/null +++ b/test/moves/last_respects.test.ts @@ -0,0 +1,211 @@ +import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/testUtils/gameManager"; +import { allMoves } from "#app/data/moves/move"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Last Respects", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const move = allMoves[Moves.LAST_RESPECTS]; + const basePower = move.power; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .disableCrits() + .moveset([Moves.LAST_RESPECTS, Moves.EXPLOSION, Moves.LUNAR_DANCE]) + .ability(Abilities.BALL_FETCH) + .enemyAbility(Abilities.BALL_FETCH) + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(Moves.SPLASH) + .startingLevel(1) + .enemyLevel(100); + + vi.spyOn(move, "calculateBattlePower"); + }); + + it("should have 150 power if 2 allies faint before using move", async () => { + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + /** + * Bulbasur faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Charmander faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower + 2 * 50); + }); + + it("should have 200 power if an ally fainted twice and another one once", async () => { + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + /** + * Bulbasur faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Charmander faints once + */ + game.doRevivePokemon(1); + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Bulbasur faints twice + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower + 3 * 50); + }); + + it("should maintain its power for the player during the next battle if it is within the same arena encounter", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(1) + .enemyLevel(1) + .startingLevel(100) + .enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + /** + * The first Pokemon faints and another Pokemon in the party is selected. + */ + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Enemy Pokemon faints and new wave is entered. + */ + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextWave(); + expect(game.scene.arena.playerFaints).toBe(1); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower + 1 * 50); + }); + + it("should reset enemyFaints count on progressing to the next wave.", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(1) + .enemyLevel(1) + .startingLevel(100) + .enemyMoveset(Moves.LAST_RESPECTS) + .moveset([Moves.LUNAR_DANCE, Moves.LAST_RESPECTS, Moves.SPLASH]); + + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + /** + * The first Pokemon faints and another Pokemon in the party is selected. + */ + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Enemy Pokemon faints and new wave is entered. + */ + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextWave(); + expect(game.scene.currentBattle.enemyFaints).toBe(0); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); + + it("should reset playerFaints count if we enter new trainer battle", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(4).enemyLevel(1).startingLevel(100); + + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextWave(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); + + it("should reset playerFaints count if we enter new biome", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(10).enemyLevel(1).startingLevel(100); + + await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextWave(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); +}); diff --git a/src/test/moves/light_screen.test.ts b/test/moves/light_screen.test.ts similarity index 54% rename from src/test/moves/light_screen.test.ts rename to test/moves/light_screen.test.ts index af14d9273e6..9cc6944ed3e 100644 --- a/src/test/moves/light_screen.test.ts +++ b/test/moves/light_screen.test.ts @@ -1,16 +1,19 @@ +import type BattleScene from "#app/battle-scene"; import { ArenaTagSide } from "#app/data/arena-tag"; -import Move, { allMoves } from "#app/data/move"; +import type Move from "#app/data/moves/move"; +import { allMoves, CritOnlyAttr } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { ArenaTagType } from "#app/enums/arena-tag-type"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +let globalScene: BattleScene; describe("Moves - Light Screen", () => { let phaserGame: Phaser.Game; @@ -30,24 +33,29 @@ describe("Moves - Light Screen", () => { beforeEach(() => { game = new GameManager(phaserGame); + globalScene = game.scene; game.override.battleType("single"); game.override.ability(Abilities.NONE); - game.override.moveset([ Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE ]); + game.override.moveset([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN ]); + game.override.enemyMoveset([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); game.override.disableCrits(); }); it("reduces damage of special attacks by half in a single battle", async () => { const moveToUse = Moves.ABSORB; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); @@ -56,28 +64,53 @@ describe("Moves - Light Screen", () => { game.override.battleType("double"); const moveToUse = Moves.DAZZLING_GLEAM; - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); game.move.select(moveToUse); game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); it("does not affect physical attacks", async () => { const moveToUse = Moves.TACKLE; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); + + it("does not affect critical hits", async () => { + game.override.moveset([Moves.FROST_BREATH]); + const moveToUse = Moves.FROST_BREATH; + vi.spyOn(allMoves[Moves.FROST_BREATH], "accuracy", "get").mockReturnValue(100); + await game.classicMode.startBattle([Species.SHUCKLE]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); }); /** @@ -93,8 +126,17 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = const multiplierHolder = new NumberHolder(1); const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - if (defender.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, side)) { - defender.scene.arena.applyTagsForSide(ArenaTagType.LIGHT_SCREEN, side, false, attacker, move.category, multiplierHolder); + if (globalScene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, side)) { + if (move.getAttrs(CritOnlyAttr).length === 0) { + globalScene.arena.applyTagsForSide( + ArenaTagType.LIGHT_SCREEN, + side, + false, + attacker, + move.category, + multiplierHolder, + ); + } } return move.power * multiplierHolder.value; diff --git a/test/moves/lucky_chant.test.ts b/test/moves/lucky_chant.test.ts new file mode 100644 index 00000000000..21802574e79 --- /dev/null +++ b/test/moves/lucky_chant.test.ts @@ -0,0 +1,102 @@ +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; + +describe("Moves - Lucky Chant", () => { + 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") + .moveset([Moves.LUCKY_CHANT, Moves.SPLASH, Moves.FOLLOW_ME]) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset([Moves.FLOWER_TRICK]) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should prevent critical hits from moves", async () => { + await game.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; + + game.move.select(Moves.LUCKY_CHANT); + + await game.phaseInterceptor.to(BerryPhase, false); + + const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; + expect(secondTurnDamage).toBeLessThan(firstTurnDamage); + }); + + it("should prevent critical hits against the user's ally", async () => { + game.override.battleType("double"); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(TurnEndPhase); + + const firstTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp; + + game.move.select(Moves.FOLLOW_ME); + game.move.select(Moves.LUCKY_CHANT, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + const secondTurnDamage = playerPokemon[0].getMaxHp() - playerPokemon[0].hp - firstTurnDamage; + expect(secondTurnDamage).toBeLessThan(firstTurnDamage); + }); + + it("should prevent critical hits from field effects", async () => { + game.override.enemyMoveset([Moves.TACKLE]); + + await game.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + enemyPokemon.addTag(BattlerTagType.ALWAYS_CRIT, 2, Moves.NONE, 0); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase); + + const firstTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp; + + game.move.select(Moves.LUCKY_CHANT); + + await game.phaseInterceptor.to(BerryPhase, false); + + const secondTurnDamage = playerPokemon.getMaxHp() - playerPokemon.hp - firstTurnDamage; + expect(secondTurnDamage).toBeLessThan(firstTurnDamage); + }); +}); diff --git a/src/test/moves/lunar_blessing.test.ts b/test/moves/lunar_blessing.test.ts similarity index 85% rename from src/test/moves/lunar_blessing.test.ts rename to test/moves/lunar_blessing.test.ts index 52c41a30e11..d97e6c978eb 100644 --- a/src/test/moves/lunar_blessing.test.ts +++ b/test/moves/lunar_blessing.test.ts @@ -3,7 +3,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -28,13 +28,13 @@ describe("Moves - Lunar Blessing", () => { game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.moveset([ Moves.LUNAR_BLESSING, Moves.SPLASH ]); + game.override.moveset([Moves.LUNAR_BLESSING, Moves.SPLASH]); game.override.ability(Abilities.BALL_FETCH); }); it("should restore 25% HP of the user and its ally", async () => { - await game.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer ] = game.scene.getPlayerField(); + await game.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); vi.spyOn(leftPlayer, "getMaxHp").mockReturnValue(100); vi.spyOn(rightPlayer, "getMaxHp").mockReturnValue(100); @@ -47,7 +47,6 @@ describe("Moves - Lunar Blessing", () => { vi.spyOn(leftPlayer, "heal"); vi.spyOn(rightPlayer, "heal"); - game.move.select(Moves.LUNAR_BLESSING, 0); await game.phaseInterceptor.to(CommandPhase); game.move.select(Moves.SPLASH, 1); @@ -62,8 +61,8 @@ describe("Moves - Lunar Blessing", () => { it("should cure status effect of the user and its ally", async () => { game.override.statusEffect(StatusEffect.BURN); - await game.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer ] = game.scene.getPlayerField(); + await game.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); diff --git a/test/moves/lunar_dance.test.ts b/test/moves/lunar_dance.test.ts new file mode 100644 index 00000000000..d3dceba087c --- /dev/null +++ b/test/moves/lunar_dance.test.ts @@ -0,0 +1,77 @@ +import { StatusEffect } from "#app/enums/status-effect"; +import { CommandPhase } from "#app/phases/command-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; + +describe("Moves - Lunar Dance", () => { + 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 + .statusEffect(StatusEffect.BURN) + .battleType("double") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should full restore HP, PP and status of switched in pokemon, then fail second use because no remaining backup pokemon in party", async () => { + await game.classicMode.startBattle([Species.BULBASAUR, Species.ODDISH, Species.RATTATA]); + + const [bulbasaur, oddish, rattata] = game.scene.getPlayerParty(); + game.move.changeMoveset(bulbasaur, [Moves.LUNAR_DANCE, Moves.SPLASH]); + game.move.changeMoveset(oddish, [Moves.LUNAR_DANCE, Moves.SPLASH]); + game.move.changeMoveset(rattata, [Moves.LUNAR_DANCE, Moves.SPLASH]); + + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(CommandPhase); + await game.toNextTurn(); + + // Bulbasaur should still be burned and have used a PP for splash and not at max hp + expect(bulbasaur.status?.effect).toBe(StatusEffect.BURN); + expect(bulbasaur.moveset[1]?.ppUsed).toBe(1); + expect(bulbasaur.hp).toBeLessThan(bulbasaur.getMaxHp()); + + // Switch out Bulbasaur for Rattata so we can swtich bulbasaur back in with lunar dance + game.doSwitchPokemon(2); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to(CommandPhase); + await game.toNextTurn(); + + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.LUNAR_DANCE); + game.doSelectPartyPokemon(2); + await game.phaseInterceptor.to("SwitchPhase", false); + await game.toNextTurn(); + + // Bulbasaur should NOT have any status and have full PP for splash and be at max hp + expect(bulbasaur.status?.effect).toBeUndefined(); + expect(bulbasaur.moveset[1]?.ppUsed).toBe(0); + expect(bulbasaur.isFullHp()).toBe(true); + + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.LUNAR_DANCE); + await game.phaseInterceptor.to(CommandPhase); + await game.toNextTurn(); + + // Using Lunar dance again should fail because nothing in party and rattata should be alive + expect(rattata.status?.effect).toBe(StatusEffect.BURN); + expect(rattata.hp).toBeLessThan(rattata.getMaxHp()); + }); +}); diff --git a/test/moves/magic_coat.test.ts b/test/moves/magic_coat.test.ts new file mode 100644 index 00000000000..2cc8dea8938 --- /dev/null +++ b/test/moves/magic_coat.test.ts @@ -0,0 +1,289 @@ +import { BattlerIndex } from "#app/battle"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/moves/move"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Stat } from "#app/enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +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/testUtils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Magic Coat", () => { + 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 + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.MAGIC_COAT); + }); + + it("should fail if the user goes last in the turn", async () => { + game.override.moveset([Moves.PROTECT]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.PROTECT); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should fail if called again in the same turn due to moves like instruct", async () => { + game.override.moveset([Moves.INSTRUCT]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.INSTRUCT); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should not reflect moves used on the next turn", async () => { + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + game.override.enemyMoveset([Moves.MAGIC_COAT, Moves.SPLASH]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + // turn 1 + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.MAGIC_COAT); + await game.toNextTurn(); + + // turn 2 + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should reflect basic status moves", async () => { + game.override.moveset([Moves.GROWL]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should individually bounce back multi-target moves when used by both targets in doubles", async () => { + game.override.battleType("double"); + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + const user = game.scene.getPlayerField()[0]; + expect(user.getStatStage(Stat.ATK)).toBe(-2); + }); + + it("should bounce back a spread status move against both pokemon", async () => { + game.override.battleType("double"); + game.override.moveset([Moves.GROWL, Moves.SPLASH]); + game.override.enemyMoveset([Moves.SPLASH, Moves.MAGIC_COAT]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.MAGIC_COAT); + + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerField().every(p => p.getStatStage(Stat.ATK) === -1)).toBeTruthy(); + }); + + it("should still bounce back a move that would otherwise fail", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); + game.override.moveset([Moves.GROWL]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce back a move that was just bounced", async () => { + game.override.battleType("double"); + game.override.ability(Abilities.MAGIC_BOUNCE); + game.override.moveset([Moves.GROWL, Moves.MAGIC_COAT]); + game.override.enemyMoveset([Moves.SPLASH, Moves.MAGIC_COAT]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + + game.move.select(Moves.MAGIC_COAT, 0); + game.move.select(Moves.GROWL, 1); + await game.forceEnemyMove(Moves.MAGIC_COAT); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyField()[0].getStatStage(Stat.ATK)).toBe(0); + }); + + // todo while Mirror Armor is not implemented + it.todo("should receive the stat change after reflecting a move back to a mirror armor user", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should still bounce back a move from a mold breaker user", async () => { + game.override.ability(Abilities.MOLD_BREAKER); + game.override.moveset([Moves.GROWL]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(0); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should only bounce spikes back once when both targets use magic coat in doubles", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.SPIKES]); + + game.move.select(Moves.SPIKES); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined(); + }); + + it("should not bounce back curse", async () => { + game.override.starterSpecies(Species.GASTLY); + await game.classicMode.startBattle([Species.GASTLY]); + game.override.moveset([Moves.CURSE]); + + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined(); + }); + + // TODO: encore is failing if the last move was virtual. + it.todo("should not cause the bounced move to count for encore", async () => { + game.override.moveset([Moves.GROWL, Moves.ENCORE]); + game.override.enemyMoveset([Moves.MAGIC_COAT, Moves.TACKLE]); + game.override.enemyAbility(Abilities.MAGIC_BOUNCE); + + await game.classicMode.startBattle([Species.MAGIKARP]); + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // turn 1 + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.MAGIC_COAT); + await game.toNextTurn(); + + // turn 2 + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => { + game.override.battleType("single"); + await game.classicMode.startBattle([Species.MAGIKARP]); + game.override.moveset([Moves.STOMPING_TANTRUM, Moves.CHARM]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.CHARM); + await game.toNextTurn(); + + game.move.select(Moves.STOMPING_TANTRUM); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(150); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo( + "should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", + async () => { + game.override.enemyMoveset([Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM]); + await game.classicMode.startBattle([Species.BULBASAUR]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.CHARM); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getLastXMoves(1)[0].result).toBe("success"); + + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + + await game.toNextTurn(); + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + }, + ); + + it("should respect immunities when bouncing a move", async () => { + vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); + game.override.moveset([Moves.THUNDER_WAVE, Moves.GROWL]); + game.override.ability(Abilities.SOUNDPROOF); + await game.classicMode.startBattle([Species.PHANPY]); + + // Turn 1 - thunder wave immunity test + game.move.select(Moves.THUNDER_WAVE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + + // Turn 2 - soundproof immunity test + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should bounce back a move before the accuracy check", async () => { + game.override.moveset([Moves.SPORE]); + await game.classicMode.startBattle([Species.MAGIKARP]); + + const attacker = game.scene.getPlayerPokemon()!; + + vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + }); + + it("should take the accuracy of the magic bounce user into account", async () => { + game.override.moveset([Moves.SPORE]); + await game.classicMode.startBattle([Species.MAGIKARP]); + const opponent = game.scene.getEnemyPokemon()!; + + vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + }); +}); diff --git a/src/test/moves/magnet_rise.test.ts b/test/moves/magnet_rise.test.ts similarity index 74% rename from src/test/moves/magnet_rise.test.ts rename to test/moves/magnet_rise.test.ts index 0afcad67ea3..725bbb99276 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/test/moves/magnet_rise.test.ts @@ -2,7 +2,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -26,19 +26,19 @@ describe("Moves - Magnet Rise", () => { game.override.battleType("single"); game.override.starterSpecies(Species.MAGNEZONE); game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset([ Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN ]); + game.override.enemyMoveset([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); game.override.disableCrits(); game.override.enemyLevel(1); - game.override.moveset([ moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS ]); + game.override.moveset([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); }); it("MAGNET RISE", async () => { await game.startBattle(); - const startingHp = game.scene.getParty()[0].hp; + const startingHp = game.scene.getPlayerParty()[0].hp; game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const finalHp = game.scene.getParty()[0].hp; + const finalHp = game.scene.getPlayerParty()[0].hp; const hpLost = finalHp - startingHp; expect(hpLost).toBe(0); }, 20000); @@ -46,15 +46,15 @@ describe("Moves - Magnet Rise", () => { it("MAGNET RISE - Gravity", async () => { await game.startBattle(); - const startingHp = game.scene.getParty()[0].hp; + const startingHp = game.scene.getPlayerParty()[0].hp; game.move.select(moveToUse); await game.phaseInterceptor.to(CommandPhase); - let finalHp = game.scene.getParty()[0].hp; + let finalHp = game.scene.getPlayerParty()[0].hp; let hpLost = finalHp - startingHp; expect(hpLost).toBe(0); game.move.select(Moves.GRAVITY); await game.phaseInterceptor.to(TurnEndPhase); - finalHp = game.scene.getParty()[0].hp; + finalHp = game.scene.getPlayerParty()[0].hp; hpLost = finalHp - startingHp; expect(hpLost).not.toBe(0); }, 20000); diff --git a/src/test/moves/make_it_rain.test.ts b/test/moves/make_it_rain.test.ts similarity index 88% rename from src/test/moves/make_it_rain.test.ts rename to test/moves/make_it_rain.test.ts index 08021227e9c..38460d99e63 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/test/moves/make_it_rain.test.ts @@ -2,13 +2,12 @@ import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; - describe("Moves - Make It Rain", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -26,7 +25,7 @@ describe("Moves - Make It Rain", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.MAKE_IT_RAIN, Moves.SPLASH ]); + game.override.moveset([Moves.MAKE_IT_RAIN, Moves.SPLASH]); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); game.override.enemyMoveset(Moves.SPLASH); @@ -35,7 +34,7 @@ describe("Moves - Make It Rain", () => { }); it("should only lower SPATK stat stage by 1 once in a double battle", async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerPokemon()!; @@ -51,7 +50,7 @@ describe("Moves - Make It Rain", () => { game.override.enemyLevel(1); // ensures the enemy will faint game.override.battleType("single"); - await game.startBattle([ Species.CHARIZARD ]); + await game.startBattle([Species.CHARIZARD]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -67,7 +66,7 @@ describe("Moves - Make It Rain", () => { it("should reduce Sp. Atk. once after KOing two enemies", async () => { game.override.enemyLevel(1); // ensures the enemy will faint - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyField(); @@ -82,7 +81,7 @@ describe("Moves - Make It Rain", () => { }); it("should lower SPATK stat stage by 1 if it only hits the second target", async () => { - await game.startBattle([ Species.CHARIZARD, Species.BLASTOISE ]); + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/test/moves/mat_block.test.ts b/test/moves/mat_block.test.ts new file mode 100644 index 00000000000..ddfa29a53da --- /dev/null +++ b/test/moves/mat_block.test.ts @@ -0,0 +1,97 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Stat } from "#enums/stat"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { CommandPhase } from "#app/phases/command-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; + +describe("Moves - Mat Block", () => { + 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("double"); + + game.override.moveset([Moves.MAT_BLOCK, Moves.SPLASH]); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset([Moves.TACKLE]); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test("should protect the user and allies from attack moves", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.MAT_BLOCK); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); + + test("should not protect the user and allies from status moves", async () => { + game.override.enemyMoveset([Moves.GROWL]); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.MAT_BLOCK); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(-2)); + }); + + test("should fail when used after the first turn", async () => { + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(TurnEndPhase); + + const leadStartingHp = leadPokemon.map(p => p.hp); + + await game.phaseInterceptor.to(CommandPhase, false); + game.move.select(Moves.MAT_BLOCK); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.MAT_BLOCK, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.some((p, i) => p.hp < leadStartingHp[i])).toBeTruthy(); + }); +}); diff --git a/src/test/moves/metal_burst.test.ts b/test/moves/metal_burst.test.ts similarity index 77% rename from src/test/moves/metal_burst.test.ts rename to test/moves/metal_burst.test.ts index 3b32dd322a3..2cbc999436f 100644 --- a/src/test/moves/metal_burst.test.ts +++ b/test/moves/metal_burst.test.ts @@ -3,7 +3,7 @@ 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -24,7 +24,7 @@ describe("Moves - Metal Burst", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.METAL_BURST, Moves.FISSURE, Moves.PRECIPICE_BLADES ]) + .moveset([Moves.METAL_BURST, Moves.FISSURE, Moves.PRECIPICE_BLADES]) .ability(Abilities.PURE_POWER) .startingLevel(10) .battleType("double") @@ -35,9 +35,9 @@ describe("Moves - Metal Burst", () => { }); it("should redirect target if intended target faints", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.FEEBAS]); - const [ , enemy2 ] = game.scene.getEnemyField(); + const [, enemy2] = game.scene.getEnemyField(); game.move.select(Moves.METAL_BURST); game.move.select(Moves.FISSURE, 1, BattlerIndex.ENEMY); @@ -45,7 +45,7 @@ describe("Moves - Metal Burst", () => { await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); await game.move.forceHit(); @@ -56,9 +56,9 @@ describe("Moves - Metal Burst", () => { }); it("should not crash if both opponents faint before the move is used", async () => { - await game.classicMode.startBattle([ Species.FEEBAS, Species.ARCEUS ]); + await game.classicMode.startBattle([Species.FEEBAS, Species.ARCEUS]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); game.move.select(Moves.METAL_BURST); game.move.select(Moves.PRECIPICE_BLADES, 1); @@ -66,7 +66,7 @@ describe("Moves - Metal Burst", () => { await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); await game.move.forceHit(); diff --git a/test/moves/metronome.test.ts b/test/moves/metronome.test.ts new file mode 100644 index 00000000000..15790777ed3 --- /dev/null +++ b/test/moves/metronome.test.ts @@ -0,0 +1,113 @@ +import { RechargingTag, SemiInvulnerableTag } from "#app/data/battler-tags"; +import { allMoves, RandomMoveAttr } from "#app/data/moves/move"; +import { Abilities } from "#app/enums/abilities"; +import { Stat } from "#app/enums/stat"; +import { CommandPhase } from "#app/phases/command-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; + +describe("Moves - Metronome", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const randomMoveAttr = allMoves[Moves.METRONOME].getAttrs(RandomMoveAttr)[0]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([Moves.METRONOME, Moves.SPLASH]) + .battleType("single") + .startingLevel(100) + .starterSpecies(Species.REGIELEKI) + .enemyLevel(100) + .enemySpecies(Species.SHUCKLE) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH); + }); + + it("should have one semi-invulnerable turn and deal damage on the second turn when a semi-invulnerable move is called", async () => { + await game.classicMode.startBattle(); + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.DIVE); + + game.move.select(Moves.METRONOME); + await game.toNextTurn(); + + expect(player.getTag(SemiInvulnerableTag)).toBeTruthy(); + + await game.toNextTurn(); + expect(player.getTag(SemiInvulnerableTag)).toBeFalsy(); + expect(enemy.isFullHp()).toBeFalsy(); + }); + + it("should apply secondary effects of a move", async () => { + await game.classicMode.startBattle(); + const player = game.scene.getPlayerPokemon()!; + vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.WOOD_HAMMER); + + game.move.select(Moves.METRONOME); + await game.toNextTurn(); + + expect(player.isFullHp()).toBeFalsy(); + }); + + it("should recharge after using recharge move", async () => { + await game.classicMode.startBattle(); + const player = game.scene.getPlayerPokemon()!; + vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.HYPER_BEAM); + vi.spyOn(allMoves[Moves.HYPER_BEAM], "accuracy", "get").mockReturnValue(100); + + game.move.select(Moves.METRONOME); + await game.toNextTurn(); + + expect(player.getTag(RechargingTag)).toBeTruthy(); + }); + + it("should only target ally for Aromatic Mist", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([Species.REGIELEKI, Species.RATTATA]); + const [leftPlayer, rightPlayer] = game.scene.getPlayerField(); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); + vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.AROMATIC_MIST); + + game.move.select(Moves.METRONOME, 0); + await game.phaseInterceptor.to(CommandPhase); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); + + expect(rightPlayer.getStatStage(Stat.SPDEF)).toBe(1); + expect(leftPlayer.getStatStage(Stat.SPDEF)).toBe(0); + expect(leftOpp.getStatStage(Stat.SPDEF)).toBe(0); + expect(rightOpp.getStatStage(Stat.SPDEF)).toBe(0); + }); + + it("should cause opponent to flee, and not crash for Roar", async () => { + await game.classicMode.startBattle(); + vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.ROAR); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.METRONOME); + await game.phaseInterceptor.to("BerryPhase"); + + const isVisible = enemyPokemon.visible; + const hasFled = enemyPokemon.switchOutStatus; + expect(!isVisible && hasFled).toBe(true); + + await game.phaseInterceptor.to("CommandPhase"); + }); +}); diff --git a/src/test/moves/miracle_eye.test.ts b/test/moves/miracle_eye.test.ts similarity index 87% rename from src/test/moves/miracle_eye.test.ts rename to test/moves/miracle_eye.test.ts index 70f487de942..2dbfb962540 100644 --- a/src/test/moves/miracle_eye.test.ts +++ b/test/moves/miracle_eye.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -28,7 +28,7 @@ describe("Moves - Miracle Eye", () => { .enemyMoveset(Moves.SPLASH) .enemyLevel(5) .starterSpecies(Species.MAGIKARP) - .moveset([ Moves.MIRACLE_EYE, Moves.CONFUSION ]); + .moveset([Moves.MIRACLE_EYE, Moves.CONFUSION]); }); it("should allow Psychic moves to hit Dark types", async () => { @@ -43,7 +43,7 @@ describe("Moves - Miracle Eye", () => { game.move.select(Moves.MIRACLE_EYE); await game.toNextTurn(); game.move.select(Moves.CONFUSION); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to(MoveEffectPhase); expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); diff --git a/test/moves/mirror_move.test.ts b/test/moves/mirror_move.test.ts new file mode 100644 index 00000000000..9178410adb2 --- /dev/null +++ b/test/moves/mirror_move.test.ts @@ -0,0 +1,82 @@ +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#app/enums/stat"; +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/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Mirror Move", () => { + 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.MIRROR_MOVE, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should use the last move that the target used on the user", async () => { + game.override.battleType("double").enemyMoveset([Moves.TACKLE, Moves.GROWL]); + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); + + game.move.select(Moves.MIRROR_MOVE, 0, BattlerIndex.ENEMY); // target's last move is Tackle, enemy should receive damage from Mirror Move copying Tackle + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.GROWL, BattlerIndex.PLAYER_2); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(game.scene.getEnemyField()[0].isFullHp()).toBeFalsy(); + }); + + it("should apply secondary effects of a move", async () => { + game.override.enemyMoveset(Moves.ACID_SPRAY); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.MIRROR_MOVE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPDEF)).toBe(-2); + }); + + it("should be able to copy status moves", async () => { + game.override.enemyMoveset(Moves.GROWL); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.MIRROR_MOVE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should fail if the target has not used any moves", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.MIRROR_MOVE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + + expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); +}); diff --git a/test/moves/mist.test.ts b/test/moves/mist.test.ts new file mode 100644 index 00000000000..2deb6f9b90d --- /dev/null +++ b/test/moves/mist.test.ts @@ -0,0 +1,49 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Mist", () => { + 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.MIST, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .battleType("double") + .disableCrits() + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.GROWL); + }); + + it("should prevent the user's side from having stats lowered", async () => { + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.MIST, 0); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase"); + + playerPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }); + + it.todo("should be ignored by opponents with Infiltrator"); +}); diff --git a/test/moves/moongeist_beam.test.ts b/test/moves/moongeist_beam.test.ts new file mode 100644 index 00000000000..117fe513e17 --- /dev/null +++ b/test/moves/moongeist_beam.test.ts @@ -0,0 +1,61 @@ +import { allMoves, RandomMoveAttr } from "#app/data/moves/move"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Moongeist Beam", () => { + 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.MOONGEIST_BEAM, Moves.METRONOME]) + .ability(Abilities.BALL_FETCH) + .startingLevel(200) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.STURDY) + .enemyMoveset(Moves.SPLASH); + }); + + // Also covers Photon Geyser and Sunsteel Strike + it("should ignore enemy abilities", async () => { + await game.classicMode.startBattle([Species.MILOTIC]); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.MOONGEIST_BEAM); + await game.phaseInterceptor.to("BerryPhase"); + + expect(enemy.isFainted()).toBe(true); + }); + + // Also covers Photon Geyser and Sunsteel Strike + it("should not ignore enemy abilities when called by another move, such as metronome", async () => { + await game.classicMode.startBattle([Species.MILOTIC]); + vi.spyOn(allMoves[Moves.METRONOME].getAttrs(RandomMoveAttr)[0], "getMoveOverride").mockReturnValue( + Moves.MOONGEIST_BEAM, + ); + + game.move.select(Moves.METRONOME); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.isFainted()).toBe(false); + expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].move).toBe(Moves.MOONGEIST_BEAM); + }); +}); diff --git a/src/test/moves/multi_target.test.ts b/test/moves/multi_target.test.ts similarity index 79% rename from src/test/moves/multi_target.test.ts rename to test/moves/multi_target.test.ts index b6836b1dcb9..2b17929a5df 100644 --- a/src/test/moves/multi_target.test.ts +++ b/test/moves/multi_target.test.ts @@ -3,11 +3,10 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Multi-target damage reduction", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -32,18 +31,18 @@ describe("Multi-target damage reduction", () => { .enemySpecies(Species.POLIWAG) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.TACKLE, Moves.DAZZLING_GLEAM, Moves.EARTHQUAKE, Moves.SPLASH ]) + .moveset([Moves.TACKLE, Moves.DAZZLING_GLEAM, Moves.EARTHQUAKE, Moves.SPLASH]) .ability(Abilities.BALL_FETCH); }); it("should reduce d.gleam damage when multiple enemies but not tackle", async () => { - await game.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.startBattle([Species.MAGIKARP, Species.FEEBAS]); - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [enemy1, enemy2] = game.scene.getEnemyField(); game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); const gleam1 = enemy1.getMaxHp() - enemy1.hp; @@ -59,7 +58,7 @@ describe("Multi-target damage reduction", () => { game.move.select(Moves.DAZZLING_GLEAM); game.move.select(Moves.TACKLE, 1, BattlerIndex.ENEMY); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); @@ -77,14 +76,14 @@ describe("Multi-target damage reduction", () => { }); it("should reduce earthquake when more than one pokemon other than user is not fainted", async () => { - await game.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.startBattle([Species.MAGIKARP, Species.FEEBAS]); - const player2 = game.scene.getParty()[1]; - const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const player2 = game.scene.getPlayerParty()[1]; + const [enemy1, enemy2] = game.scene.getEnemyField(); game.move.select(Moves.EARTHQUAKE); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("MoveEndPhase"); @@ -99,7 +98,7 @@ describe("Multi-target damage reduction", () => { game.move.select(Moves.EARTHQUAKE); game.move.select(Moves.SPLASH, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); @@ -117,7 +116,7 @@ describe("Multi-target damage reduction", () => { await game.toNextTurn(); game.move.select(Moves.EARTHQUAKE); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); diff --git a/src/test/moves/nightmare.test.ts b/test/moves/nightmare.test.ts similarity index 83% rename from src/test/moves/nightmare.test.ts rename to test/moves/nightmare.test.ts index f4c485ff1b4..e1cef0084ee 100644 --- a/src/test/moves/nightmare.test.ts +++ b/test/moves/nightmare.test.ts @@ -1,8 +1,8 @@ -import { StatusEffect } from "#app/data/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -23,17 +23,18 @@ describe("Moves - Nightmare", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") + game.override + .battleType("single") .enemySpecies(Species.RATTATA) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) .enemyStatusEffect(StatusEffect.SLEEP) .startingLevel(5) - .moveset([ Moves.NIGHTMARE, Moves.SPLASH ]); + .moveset([Moves.NIGHTMARE, Moves.SPLASH]); }); it("lowers enemy hp by 1/4 each turn while asleep", async () => { - await game.classicMode.startBattle([ Species.HYPNO ]); + await game.classicMode.startBattle([Species.HYPNO]); const enemyPokemon = game.scene.getEnemyPokemon()!; const enemyMaxHP = enemyPokemon.hp; diff --git a/src/test/moves/obstruct.test.ts b/test/moves/obstruct.test.ts similarity index 96% rename from src/test/moves/obstruct.test.ts rename to test/moves/obstruct.test.ts index 1649c199e32..d8e3a949f08 100644 --- a/src/test/moves/obstruct.test.ts +++ b/test/moves/obstruct.test.ts @@ -2,7 +2,7 @@ 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -27,7 +27,7 @@ describe("Moves - Obstruct", () => { .enemyMoveset(Moves.TACKLE) .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH) - .moveset([ Moves.OBSTRUCT ]) + .moveset([Moves.OBSTRUCT]) .starterSpecies(Species.FEEBAS); }); @@ -57,8 +57,7 @@ describe("Moves - Obstruct", () => { await game.phaseInterceptor.to("TurnEndPhase"); expect(player.isFullHp()).toBe(true); expect(enemy.getStatStage(Stat.DEF)).toBe(-2); - } - ); + }); it("protects from non-contact damaging moves and doesn't lower the opponent's defense by 2 stages", async () => { game.override.enemyMoveset(Moves.WATER_GUN); diff --git a/src/test/moves/octolock.test.ts b/test/moves/octolock.test.ts similarity index 59% rename from src/test/moves/octolock.test.ts rename to test/moves/octolock.test.ts index d80b71a51e1..c9c5fd42f7e 100644 --- a/src/test/moves/octolock.test.ts +++ b/test/moves/octolock.test.ts @@ -1,12 +1,9 @@ -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 GameManager from "#test/utils/gameManager"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -27,45 +24,45 @@ 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); }); it("lowers DEF and SPDEF stat stages of the target Pokemon by 1 each turn", async () => { - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; // 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); }); it("if target pokemon has BIG_PECKS, should only lower SPDEF stat stage by 1", async () => { game.override.enemyAbility(Abilities.BIG_PECKS); - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; // 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); @@ -73,13 +70,13 @@ describe("Moves - Octolock", () => { it("if target pokemon has WHITE_SMOKE, should not reduce any stat stages", async () => { game.override.enemyAbility(Abilities.WHITE_SMOKE); - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; // 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); @@ -87,20 +84,20 @@ describe("Moves - Octolock", () => { it("if target pokemon has CLEAR_BODY, should not reduce any stat stages", async () => { game.override.enemyAbility(Abilities.CLEAR_BODY); - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; // 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); }); it("traps the target pokemon", async () => { - await game.classicMode.startBattle([ Species.GRAPPLOCT ]); + await game.classicMode.startBattle([Species.GRAPPLOCT]); const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -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/test/moves/order_up.test.ts b/test/moves/order_up.test.ts new file mode 100644 index 00000000000..516f7f625a3 --- /dev/null +++ b/test/moves/order_up.test.ts @@ -0,0 +1,87 @@ +import { BattlerIndex } from "#app/battle"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { PokemonAnimType } from "#enums/pokemon-anim-type"; +import type { EffectiveStat } from "#enums/stat"; +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Order Up", () => { + 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.ORDER_UP) + .ability(Abilities.COMMANDER) + .battleType("double") + .disableCrits() + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH) + .startingLevel(100) + .enemyLevel(100); + + vi.spyOn(game.scene, "triggerPokemonBattleAnim").mockReturnValue(true); + }); + + it.each([ + { formIndex: 0, formName: "Curly", stat: Stat.ATK, statName: "Attack" }, + { formIndex: 1, formName: "Droopy", stat: Stat.DEF, statName: "Defense" }, + { formIndex: 2, formName: "Stretchy", stat: Stat.SPD, statName: "Speed" }, + ])( + "should raise the user's $statName when the user is commanded by a $formName Tatsugiri", + async ({ formIndex, stat }) => { + game.override.starterForms({ [Species.TATSUGIRI]: formIndex }); + + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); + + const [tatsugiri, dondozo] = game.scene.getPlayerField(); + + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + + game.move.select(Moves.ORDER_UP, 1, BattlerIndex.ENEMY); + expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); + + await game.phaseInterceptor.to("BerryPhase", false); + + const affectedStats: EffectiveStat[] = [Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]; + affectedStats.forEach(st => expect(dondozo.getStatStage(st)).toBe(st === stat ? 3 : 2)); + }, + ); + + it("should be boosted by Sheer Force while still applying a stat boost", async () => { + game.override.passiveAbility(Abilities.SHEER_FORCE).starterForms({ [Species.TATSUGIRI]: 0 }); + + await game.classicMode.startBattle([Species.TATSUGIRI, Species.DONDOZO]); + + const [tatsugiri, dondozo] = game.scene.getPlayerField(); + + expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); + expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); + + game.move.select(Moves.ORDER_UP, 1, BattlerIndex.ENEMY); + expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(dondozo.battleData.abilitiesApplied.includes(Abilities.SHEER_FORCE)).toBeTruthy(); + expect(dondozo.getStatStage(Stat.ATK)).toBe(3); + }); +}); diff --git a/src/test/moves/parting_shot.test.ts b/test/moves/parting_shot.test.ts similarity index 62% rename from src/test/moves/parting_shot.test.ts rename to test/moves/parting_shot.test.ts index e5a2fc38b94..699d960f882 100644 --- a/src/test/moves/parting_shot.test.ts +++ b/test/moves/parting_shot.test.ts @@ -3,14 +3,13 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, test } from "vitest"; -import GameManager from "../utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Stat } from "#enums/stat"; import { BerryPhase } from "#app/phases/berry-phase"; import { FaintPhase } from "#app/phases/faint-phase"; import { MessagePhase } from "#app/phases/message-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; - describe("Moves - Parting Shot", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,75 +27,65 @@ describe("Moves - Parting Shot", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("single"); - game.override.moveset([ Moves.PARTING_SHOT, Moves.SPLASH ]); + game.override.moveset([Moves.PARTING_SHOT, Moves.SPLASH]); game.override.enemyMoveset(Moves.SPLASH); game.override.startingLevel(5); game.override.enemyLevel(5); - }); - test( - "Parting Shot when buffed by prankster should fail against dark types", - async () => { - game.override - .enemySpecies(Species.POOCHYENA) - .ability(Abilities.PRANKSTER); - await game.startBattle([ Species.MURKROW, Species.MEOWTH ]); + test("Parting Shot when buffed by prankster should fail against dark types", async () => { + game.override.enemySpecies(Species.POOCHYENA).ability(Abilities.PRANKSTER); + await game.startBattle([Species.MURKROW, Species.MEOWTH]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon).toBeDefined(); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); - game.move.select(Moves.PARTING_SHOT); + game.move.select(Moves.PARTING_SHOT); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); - expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); + expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); + }); - test( - "Parting shot should fail against good as gold ability", - async () => { - game.override - .enemySpecies(Species.GHOLDENGO) - .enemyAbility(Abilities.GOOD_AS_GOLD); - await game.startBattle([ Species.MURKROW, Species.MEOWTH ]); + test("Parting shot should fail against good as gold ability", async () => { + game.override.enemySpecies(Species.GHOLDENGO).enemyAbility(Abilities.GOOD_AS_GOLD); + await game.startBattle([Species.MURKROW, Species.MEOWTH]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - expect(enemyPokemon).toBeDefined(); + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon).toBeDefined(); - game.move.select(Moves.PARTING_SHOT); + game.move.select(Moves.PARTING_SHOT); - await game.phaseInterceptor.to(BerryPhase, false); - expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); - expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); - expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } - ); + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); + expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); + }); - it.skip( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot should fail if target is -6/-6 de-buffed", async () => { - game.override.moveset([ Moves.PARTING_SHOT, Moves.MEMENTO, Moves.SPLASH ]); - await game.startBattle([ Species.MEOWTH, Species.MEOWTH, Species.MEOWTH, Species.MURKROW, Species.ABRA ]); + game.override.moveset([Moves.PARTING_SHOT, Moves.MEMENTO, Moves.SPLASH]); + await game.startBattle([Species.MEOWTH, Species.MEOWTH, Species.MEOWTH, Species.MURKROW, Species.ABRA]); // use Memento 3 times to debuff enemy game.move.select(Moves.MEMENTO); await game.phaseInterceptor.to(FaintPhase); - expect(game.scene.getParty()[0].isFainted()).toBe(true); + expect(game.scene.getPlayerParty()[0].isFainted()).toBe(true); game.doSelectPartyPokemon(1); await game.phaseInterceptor.to(TurnInitPhase, false); game.move.select(Moves.MEMENTO); await game.phaseInterceptor.to(FaintPhase); - expect(game.scene.getParty()[0].isFainted()).toBe(true); + expect(game.scene.getPlayerParty()[0].isFainted()).toBe(true); game.doSelectPartyPokemon(2); await game.phaseInterceptor.to(TurnInitPhase, false); game.move.select(Moves.MEMENTO); await game.phaseInterceptor.to(FaintPhase); - expect(game.scene.getParty()[0].isFainted()).toBe(true); + expect(game.scene.getPlayerParty()[0].isFainted()).toBe(true); game.doSelectPartyPokemon(3); // set up done @@ -114,17 +103,15 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-6); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-6); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } + }, ); - it.skip( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot shouldn't allow switch out when mist is active", async () => { - game.override - .enemySpecies(Species.ALTARIA) - .enemyAbility(Abilities.NONE) - .enemyMoveset([ Moves.MIST ]); - await game.startBattle([ Species.SNORLAX, Species.MEOWTH ]); + game.override.enemySpecies(Species.ALTARIA).enemyAbility(Abilities.NONE).enemyMoveset([Moves.MIST]); + await game.startBattle([Species.SNORLAX, Species.MEOWTH]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon).toBeDefined(); @@ -135,16 +122,15 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } + }, ); - it.skip( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot shouldn't allow switch out against clear body ability", async () => { - game.override - .enemySpecies(Species.TENTACOOL) - .enemyAbility(Abilities.CLEAR_BODY); - await game.startBattle([ Species.SNORLAX, Species.MEOWTH ]); + game.override.enemySpecies(Species.TENTACOOL).enemyAbility(Abilities.CLEAR_BODY); + await game.startBattle([Species.SNORLAX, Species.MEOWTH]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon).toBeDefined(); @@ -155,13 +141,14 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } + }, ); - it.skip( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot should de-buff and not fail if no party available to switch - party size 1", async () => { - await game.startBattle([ Species.MURKROW ]); + await game.startBattle([Species.MURKROW]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon).toBeDefined(); @@ -172,18 +159,19 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-1); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW); - } + }, ); - it.skip( // TODO: fix this bug to pass the test! + it.todo( + // TODO: fix this bug to pass the test! "Parting shot regularly not fail if no party available to switch - party fainted", async () => { - await game.startBattle([ Species.MURKROW, Species.MEOWTH ]); + await game.startBattle([Species.MURKROW, Species.MEOWTH]); game.move.select(Moves.SPLASH); // intentionally kill party pokemon, switch to second slot (now 1 party mon is fainted) - await game.killPokemon(game.scene.getParty()[0]); - expect(game.scene.getParty()[0].isFainted()).toBe(true); + await game.killPokemon(game.scene.getPlayerParty()[0]); + expect(game.scene.getPlayerParty()[0].isFainted()).toBe(true); await game.phaseInterceptor.run(MessagePhase); game.doSelectPartyPokemon(1); @@ -195,6 +183,6 @@ describe("Moves - Parting Shot", () => { expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MEOWTH); - } + }, ); }); diff --git a/src/test/moves/plasma_fists.test.ts b/test/moves/plasma_fists.test.ts similarity index 68% rename from src/test/moves/plasma_fists.test.ts rename to test/moves/plasma_fists.test.ts index 24210cd47fa..fe19ab4a460 100644 --- a/src/test/moves/plasma_fists.test.ts +++ b/test/moves/plasma_fists.test.ts @@ -1,9 +1,9 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; @@ -24,7 +24,7 @@ describe("Moves - Plasma Fists", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.PLASMA_FISTS, Moves.TACKLE ]) + .moveset([Moves.PLASMA_FISTS, Moves.TACKLE]) .battleType("double") .startingLevel(100) .enemySpecies(Species.DUSCLOPS) @@ -34,7 +34,7 @@ describe("Moves - Plasma Fists", () => { }); it("should convert all subsequent Normal-type attacks to Electric-type", async () => { - await game.classicMode.startBattle([ Species.DUSCLOPS, Species.BLASTOISE ]); + await game.classicMode.startBattle([Species.DUSCLOPS, Species.BLASTOISE]); const field = game.scene.getField(true); field.forEach(p => vi.spyOn(p, "getMoveType")); @@ -45,22 +45,20 @@ describe("Moves - Plasma Fists", () => { await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase", false); field.forEach(p => { - expect(p.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(p.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(p.hp).toBeLessThan(p.getMaxHp()); }); }); it("should not affect Normal-type attacks boosted by Pixilate", async () => { - game.override - .battleType("single") - .enemyAbility(Abilities.PIXILATE); + game.override.battleType("single").enemyAbility(Abilities.PIXILATE); - await game.classicMode.startBattle([ Species.ONIX ]); + await game.classicMode.startBattle([Species.ONIX]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -68,20 +66,17 @@ describe("Moves - Plasma Fists", () => { game.move.select(Moves.PLASMA_FISTS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(Type.FAIRY); + expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.FAIRY); expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); }); it("should affect moves that become Normal type due to Normalize", async () => { - game.override - .battleType("single") - .enemyAbility(Abilities.NORMALIZE) - .enemyMoveset(Moves.WATER_GUN); + game.override.battleType("single").enemyAbility(Abilities.NORMALIZE).enemyMoveset(Moves.WATER_GUN); - await game.classicMode.startBattle([ Species.DUSCLOPS ]); + await game.classicMode.startBattle([Species.DUSCLOPS]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -89,10 +84,10 @@ describe("Moves - Plasma Fists", () => { game.move.select(Moves.PLASMA_FISTS); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(Type.ELECTRIC); + expect(enemyPokemon.getMoveType).toHaveLastReturnedWith(PokemonType.ELECTRIC); expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); }); }); diff --git a/test/moves/pledge_moves.test.ts b/test/moves/pledge_moves.test.ts new file mode 100644 index 00000000000..c866d15357c --- /dev/null +++ b/test/moves/pledge_moves.test.ts @@ -0,0 +1,301 @@ +import { BattlerIndex } from "#app/battle"; +import { allAbilities } from "#app/data/ability"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves, FlinchAttr } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { Stat } from "#enums/stat"; +import { toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; + +describe("Moves - Pledge Moves", () => { + 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("double") + .startingLevel(100) + .moveset([Moves.FIRE_PLEDGE, Moves.GRASS_PLEDGE, Moves.WATER_PLEDGE, Moves.SPLASH]) + .enemySpecies(Species.SNORLAX) + .enemyLevel(100) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("Fire Pledge - should be an 80-power Fire-type attack outside of combination", async () => { + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const firePledge = allMoves[Moves.FIRE_PLEDGE]; + vi.spyOn(firePledge, "calculateBattlePower"); + + const playerPokemon = game.scene.getPlayerField(); + vi.spyOn(playerPokemon[0], "getMoveType"); + + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("MoveEndPhase", false); + + expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); + expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); + }); + + it("Fire Pledge - should not combine with an ally using Fire Pledge", async () => { + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const firePledge = allMoves[Moves.FIRE_PLEDGE]; + vi.spyOn(firePledge, "calculateBattlePower"); + + const playerPokemon = game.scene.getPlayerField(); + playerPokemon.forEach(p => vi.spyOn(p, "getMoveType")); + + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY_2); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); + expect(playerPokemon[0].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(80); + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); + + enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); + }); + + it("Fire Pledge - should not combine with an enemy's Pledge move", async () => { + game.override.battleType("single").enemyMoveset(Moves.GRASS_PLEDGE); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FIRE_PLEDGE); + + await game.toNextTurn(); + + // Neither Pokemon should defer their move's effects as they would + // if they combined moves, so both should be damaged. + expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(game.scene.arena.getTag(ArenaTagType.FIRE_GRASS_PLEDGE)).toBeUndefined(); + }); + + it("Grass Pledge - should combine with Fire Pledge to form a 150-power Fire-type attack that creates a 'sea of fire'", async () => { + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const grassPledge = allMoves[Moves.GRASS_PLEDGE]; + vi.spyOn(grassPledge, "calculateBattlePower"); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + vi.spyOn(playerPokemon[1], "getMoveType"); + const baseDmgMock = vi.spyOn(enemyPokemon[0], "getBaseDamage"); + + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.GRASS_PLEDGE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + // advance to the end of PLAYER_2's move this turn + for (let i = 0; i < 2; i++) { + await game.phaseInterceptor.to("MoveEndPhase"); + } + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.FIRE); + expect(grassPledge.calculateBattlePower).toHaveLastReturnedWith(150); + + const baseDmg = baseDmgMock.mock.results[baseDmgMock.mock.results.length - 1].value; + expect(enemyPokemon[0].getMaxHp() - enemyPokemon[0].hp).toBe(toDmgValue(baseDmg * 1.5)); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked + expect(game.scene.arena.getTagOnSide(ArenaTagType.FIRE_GRASS_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined(); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + await game.toNextTurn(); + enemyPokemon.forEach((p, i) => expect(enemyStartingHp[i] - p.hp).toBe(toDmgValue(p.getMaxHp() / 8))); + }); + + it("Fire Pledge - should combine with Water Pledge to form a 150-power Water-type attack that creates a 'rainbow'", async () => { + game.override.moveset([Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.FIERY_DANCE, Moves.SPLASH]); + + await game.classicMode.startBattle([Species.BLASTOISE, Species.VENUSAUR]); + + const firePledge = allMoves[Moves.FIRE_PLEDGE]; + vi.spyOn(firePledge, "calculateBattlePower"); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + vi.spyOn(playerPokemon[1], "getMoveType"); + + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + // advance to the end of PLAYER_2's move this turn + for (let i = 0; i < 2; i++) { + await game.phaseInterceptor.to("MoveEndPhase"); + } + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.WATER); + expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(150); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked + expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); + + await game.toNextTurn(); + + game.move.select(Moves.FIERY_DANCE, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + await game.phaseInterceptor.to("MoveEndPhase"); + + // Rainbow effect should increase Fiery Dance's chance of raising Sp. Atk to 100% + expect(playerPokemon[0].getStatStage(Stat.SPATK)).toBe(1); + }); + + it("Water Pledge - should combine with Grass Pledge to form a 150-power Grass-type attack that creates a 'swamp'", async () => { + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const waterPledge = allMoves[Moves.WATER_PLEDGE]; + vi.spyOn(waterPledge, "calculateBattlePower"); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + const enemyStartingSpd = enemyPokemon.map(p => p.getEffectiveStat(Stat.SPD)); + + vi.spyOn(playerPokemon[1], "getMoveType"); + + game.move.select(Moves.GRASS_PLEDGE, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.WATER_PLEDGE, 1, BattlerIndex.ENEMY); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + // advance to the end of PLAYER_2's move this turn + for (let i = 0; i < 2; i++) { + await game.phaseInterceptor.to("MoveEndPhase"); + } + + expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.GRASS); + expect(waterPledge.calculateBattlePower).toHaveLastReturnedWith(150); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined(); + enemyPokemon.forEach((p, i) => expect(p.getEffectiveStat(Stat.SPD)).toBe(Math.floor(enemyStartingSpd[i] / 4))); + }); + + it("Pledge Moves - should alter turn order when used in combination", async () => { + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2]); + // PLAYER_2 should act with a combined move immediately after PLAYER as the second move in the turn + for (let i = 0; i < 2; i++) { + await game.phaseInterceptor.to("MoveEndPhase"); + } + expect(enemyPokemon[0].hp).toBe(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); + }); + + it("Pledge Moves - 'rainbow' effect should not stack with Serene Grace when applied to flinching moves", async () => { + game.override + .ability(Abilities.SERENE_GRACE) + .moveset([Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.IRON_HEAD, Moves.SPLASH]); + + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const ironHeadFlinchAttr = allMoves[Moves.IRON_HEAD].getAttrs(FlinchAttr)[0]; + vi.spyOn(ironHeadFlinchAttr, "getMoveChance"); + + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); + + game.move.select(Moves.IRON_HEAD, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(ironHeadFlinchAttr.getMoveChance).toHaveLastReturnedWith(60); + }); + + it("Pledge Moves - should have no effect when the second ally's move is cancelled", async () => { + game.override.enemyMoveset([Moves.SPLASH, Moves.SPORE]); + + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.FIRE_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.GRASS_PLEDGE, 1, BattlerIndex.ENEMY_2); + + await game.forceEnemyMove(Moves.SPORE, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to("BerryPhase", false); + + enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); + + it("Pledge Moves - should ignore redirection from another Pokemon's Storm Drain", async () => { + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const enemyPokemon = game.scene.getEnemyField(); + vi.spyOn(enemyPokemon[1], "getAbility").mockReturnValue(allAbilities[Abilities.STORM_DRAIN]); + + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].getStatStage(Stat.SPATK)).toBe(0); + }); + + it("Pledge Moves - should not ignore redirection from another Pokemon's Follow Me", async () => { + game.override.enemyMoveset([Moves.FOLLOW_ME, Moves.SPLASH]); + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.FOLLOW_ME); + + await game.phaseInterceptor.to("BerryPhase", false); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon[0].hp).toBe(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp()); + }); +}); diff --git a/test/moves/powder.test.ts b/test/moves/powder.test.ts new file mode 100644 index 00000000000..522b0b74ca7 --- /dev/null +++ b/test/moves/powder.test.ts @@ -0,0 +1,279 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#test/testUtils/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 { PokemonType } from "#enums/pokemon-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(PokemonType.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/power_shift.test.ts b/test/moves/power_shift.test.ts similarity index 91% rename from src/test/moves/power_shift.test.ts rename to test/moves/power_shift.test.ts index e389f77bedf..fbc6d732d30 100644 --- a/src/test/moves/power_shift.test.ts +++ b/test/moves/power_shift.test.ts @@ -2,7 +2,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -22,7 +22,7 @@ describe("Moves - Power Shift", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.POWER_SHIFT, Moves.BULK_UP ]) + .moveset([Moves.POWER_SHIFT, Moves.BULK_UP]) .battleType("single") .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH) @@ -30,7 +30,7 @@ describe("Moves - Power Shift", () => { }); it("switches the user's raw Attack stat with its raw Defense stat", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/src/test/moves/power_split.test.ts b/test/moves/power_split.test.ts similarity index 90% rename from src/test/moves/power_split.test.ts rename to test/moves/power_split.test.ts index 914fa86e491..9150a707ad5 100644 --- a/src/test/moves/power_split.test.ts +++ b/test/moves/power_split.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; @@ -28,15 +28,13 @@ describe("Moves - Power Split", () => { .enemyAbility(Abilities.NONE) .enemySpecies(Species.MEW) .enemyLevel(200) - .moveset([ Moves.POWER_SPLIT ]) + .moveset([Moves.POWER_SPLIT]) .ability(Abilities.NONE); }); it("should average the user's ATK and SPATK stats with those of the target", async () => { game.override.enemyMoveset(Moves.SPLASH); - await game.startBattle([ - Species.INDEEDEE - ]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -55,10 +53,8 @@ describe("Moves - Power Split", () => { }, 20000); it("should be idempotent", async () => { - game.override.enemyMoveset([ Moves.POWER_SPLIT ]); - await game.startBattle([ - Species.INDEEDEE - ]); + game.override.enemyMoveset([Moves.POWER_SPLIT]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/power_swap.test.ts b/test/moves/power_swap.test.ts similarity index 91% rename from src/test/moves/power_swap.test.ts rename to test/moves/power_swap.test.ts index e9a4b569c92..d6f5e782e66 100644 --- a/src/test/moves/power_swap.test.ts +++ b/test/moves/power_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; @@ -29,14 +29,12 @@ describe("Moves - Power Swap", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.INDEEDEE) .enemyLevel(200) - .moveset([ Moves.POWER_SWAP ]) + .moveset([Moves.POWER_SWAP]) .ability(Abilities.NONE); }); it("should swap the user's ATK and SPATK stat stages with the target's", async () => { - await game.classicMode.startBattle([ - Species.INDEEDEE - ]); + await game.classicMode.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/power_trick.test.ts b/test/moves/power_trick.test.ts similarity index 86% rename from src/test/moves/power_trick.test.ts rename to test/moves/power_trick.test.ts index a064a43dec4..0cd849bbcc5 100644 --- a/src/test/moves/power_trick.test.ts +++ b/test/moves/power_trick.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { Species } from "#enums/species"; @@ -30,12 +30,12 @@ describe("Moves - Power Trick", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.MEW) .enemyLevel(200) - .moveset([ Moves.POWER_TRICK ]) + .moveset([Moves.POWER_TRICK]) .ability(Abilities.BALL_FETCH); }); it("swaps the user's ATK and DEF stats", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); const player = game.scene.getPlayerPokemon()!; const baseATK = player.getStat(Stat.ATK, false); @@ -51,7 +51,7 @@ describe("Moves - Power Trick", () => { }); it("resets initial ATK and DEF stat swap when used consecutively", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); const player = game.scene.getPlayerPokemon()!; const baseATK = player.getStat(Stat.ATK, false); @@ -71,8 +71,8 @@ describe("Moves - Power Trick", () => { }); it("should pass effect when using BATON_PASS", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); - await game.override.moveset([ Moves.POWER_TRICK, Moves.BATON_PASS ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + await game.override.moveset([Moves.POWER_TRICK, Moves.BATON_PASS]); const player = game.scene.getPlayerPokemon()!; player.addTag(BattlerTagType.POWER_TRICK); @@ -92,8 +92,8 @@ describe("Moves - Power Trick", () => { }); it("should remove effect after using Transform", async () => { - await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); - await game.override.moveset([ Moves.POWER_TRICK, Moves.TRANSFORM ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + await game.override.moveset([Moves.POWER_TRICK, Moves.TRANSFORM]); const player = game.scene.getPlayerPokemon()!; player.addTag(BattlerTagType.POWER_TRICK); diff --git a/test/moves/protect.test.ts b/test/moves/protect.test.ts new file mode 100644 index 00000000000..d50c490f7d3 --- /dev/null +++ b/test/moves/protect.test.ts @@ -0,0 +1,117 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Stat } from "#enums/stat"; +import { allMoves } from "#app/data/moves/move"; +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import { BattlerIndex } from "#app/battle"; +import { MoveResult } from "#app/field/pokemon"; + +describe("Moves - Protect", () => { + 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.moveset([Moves.PROTECT]); + game.override.enemySpecies(Species.SNORLAX); + + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset([Moves.TACKLE]); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test("should protect the user from attacks", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + }); + + test("should prevent secondary effects from the opponent's attack", async () => { + game.override.enemyMoveset([Moves.CEASELESS_EDGE]); + vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(game.scene.arena.getTagOnSide(ArenaTrapTag, ArenaTagSide.ENEMY)).toBeUndefined(); + }); + + test("should protect the user from status moves", async () => { + game.override.enemyMoveset([Moves.CHARM]); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + test("should stop subsequent hits of a multi-hit move", async () => { + game.override.enemyMoveset([Moves.TACHYON_CUTTER]); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.turnData.hitCount).toBe(1); + }); + + test("should fail if the user is the last to move in the turn", async () => { + game.override.enemyMoveset([Moves.PROTECT]); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.PROTECT); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(leadPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); +}); diff --git a/test/moves/psycho_shift.test.ts b/test/moves/psycho_shift.test.ts new file mode 100644 index 00000000000..0a82189d201 --- /dev/null +++ b/test/moves/psycho_shift.test.ts @@ -0,0 +1,49 @@ +import { StatusEffect } from "#app/enums/status-effect"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Psycho Shift", () => { + 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.PSYCHO_SHIFT]) + .ability(Abilities.BALL_FETCH) + .statusEffect(StatusEffect.POISON) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyLevel(20) + .enemyAbility(Abilities.SYNCHRONIZE) + .enemyMoveset(Moves.SPLASH); + }); + + it("If Psycho Shift is used on a Pokémon with Synchronize, the user of Psycho Shift will already be afflicted with a status condition when Synchronize activates", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon?.status).toBeUndefined(); + + game.move.select(Moves.PSYCHO_SHIFT); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon?.status).toBeNull(); + expect(enemyPokemon?.status).toBeDefined(); + }); +}); diff --git a/test/moves/purify.test.ts b/test/moves/purify.test.ts new file mode 100644 index 00000000000..30d9df8ff67 --- /dev/null +++ b/test/moves/purify.test.ts @@ -0,0 +1,70 @@ +import { BattlerIndex } from "#app/battle"; +import { Status } from "#app/data/status-effect"; +import type { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Moves - Purify", () => { + 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.starterSpecies(Species.PYUKUMUKU); + game.override.startingLevel(10); + game.override.moveset([Moves.PURIFY, Moves.SIZZLY_SLIDE]); + + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyLevel(10); + game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + }); + + test("Purify heals opponent status effect and restores user hp", async () => { + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; + + playerPokemon.hp = playerPokemon.getMaxHp() - 1; + enemyPokemon.status = new Status(StatusEffect.BURN); + + game.move.select(Moves.PURIFY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(enemyPokemon.status).toBeNull(); + expect(playerPokemon.isFullHp()).toBe(true); + }); + + test("Purify does not heal if opponent doesnt have any status effect", async () => { + await game.startBattle(); + + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; + + playerPokemon.hp = playerPokemon.getMaxHp() - 1; + const playerInitialHp = playerPokemon.hp; + + game.move.select(Moves.PURIFY); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(playerPokemon.hp).toBe(playerInitialHp); + }); +}); diff --git a/test/moves/quash.test.ts b/test/moves/quash.test.ts new file mode 100644 index 00000000000..f85dbd89517 --- /dev/null +++ b/test/moves/quash.test.ts @@ -0,0 +1,97 @@ +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { Abilities } from "#app/enums/abilities"; +import { BattlerIndex } from "#app/battle"; +import { WeatherType } from "#enums/weather-type"; +import { MoveResult } from "#app/field/pokemon"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; + +describe("Moves - Quash", () => { + 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("double") + .enemyLevel(1) + .enemySpecies(Species.SLOWPOKE) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.RAIN_DANCE, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .moveset([Moves.QUASH, Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH]); + }); + + it("makes the target move last in a turn, ignoring priority", async () => { + await game.classicMode.startBattle([Species.ACCELGOR, Species.RATTATA]); + + game.move.select(Moves.QUASH, 0, BattlerIndex.PLAYER_2); + game.move.select(Moves.SUNNY_DAY, 1); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.RAIN_DANCE); + + await game.phaseInterceptor.to("TurnEndPhase", false); + // will be sunny if player_2 moved last because of quash, rainy otherwise + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SUNNY); + }); + + it("fails if the target has already moved", async () => { + await game.classicMode.startBattle([Species.ACCELGOR, Species.RATTATA]); + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.QUASH, 1, BattlerIndex.PLAYER); + + await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(game.scene.getPlayerField()[1].getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + }); + + it("makes multiple quashed targets move in speed order at the end of the turn", async () => { + game.override.enemySpecies(Species.NINJASK).enemyLevel(100); + + await game.classicMode.startBattle([Species.ACCELGOR, Species.RATTATA]); + + // both users are quashed - rattata is slower so sun should be up at end of turn + game.move.select(Moves.RAIN_DANCE, 0); + game.move.select(Moves.SUNNY_DAY, 1); + + await game.forceEnemyMove(Moves.QUASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.QUASH, BattlerIndex.PLAYER_2); + + await game.phaseInterceptor.to("TurnEndPhase", false); + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SUNNY); + }); + + it("respects trick room", async () => { + game.override.enemyMoveset([Moves.RAIN_DANCE, Moves.SPLASH, Moves.TRICK_ROOM]); + + await game.classicMode.startBattle([Species.ACCELGOR, Species.RATTATA]); + game.move.select(Moves.SPLASH, 0); + game.move.select(Moves.SPLASH, 1); + + await game.forceEnemyMove(Moves.TRICK_ROOM); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("TurnInitPhase"); + // both users are quashed - accelgor should move last w/ TR so rain should be up at end of turn + game.move.select(Moves.RAIN_DANCE, 0); + game.move.select(Moves.SUNNY_DAY, 1); + + await game.forceEnemyMove(Moves.QUASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.QUASH, BattlerIndex.PLAYER_2); + + await game.phaseInterceptor.to("TurnEndPhase", false); + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.RAIN); + }); +}); diff --git a/test/moves/quick_guard.test.ts b/test/moves/quick_guard.test.ts new file mode 100644 index 00000000000..22d4a5078ac --- /dev/null +++ b/test/moves/quick_guard.test.ts @@ -0,0 +1,104 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Stat } from "#enums/stat"; +import { BattlerIndex } from "#app/battle"; +import { MoveResult } from "#app/field/pokemon"; + +describe("Moves - Quick Guard", () => { + 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("double"); + + game.override.moveset([Moves.QUICK_GUARD, Moves.SPLASH, Moves.FOLLOW_ME]); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset([Moves.QUICK_ATTACK]); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test("should protect the user and allies from priority moves", async () => { + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase", false); + + playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); + + test("should protect the user and allies from Prankster-boosted moves", async () => { + game.override.enemyAbility(Abilities.PRANKSTER); + game.override.enemyMoveset([Moves.GROWL]); + + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase", false); + + playerPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }); + + test("should stop subsequent hits of a multi-hit priority move", async () => { + game.override.enemyMoveset([Moves.WATER_SHURIKEN]); + + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.QUICK_GUARD); + game.move.select(Moves.FOLLOW_ME, 1); + + await game.phaseInterceptor.to("BerryPhase", false); + + playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + enemyPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); + }); + + test("should fail if the user is the last to move in the turn", async () => { + game.override.battleType("single"); + game.override.enemyMoveset([Moves.QUICK_GUARD]); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.QUICK_GUARD); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); +}); diff --git a/test/moves/rage_fist.test.ts b/test/moves/rage_fist.test.ts new file mode 100644 index 00000000000..8bcb212d60e --- /dev/null +++ b/test/moves/rage_fist.test.ts @@ -0,0 +1,131 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { allMoves } from "#app/data/moves/move"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Rage Fist", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const move = allMoves[Moves.RAGE_FIST]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .moveset([Moves.RAGE_FIST, Moves.SPLASH, Moves.SUBSTITUTE]) + .startingLevel(100) + .enemyLevel(1) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.DOUBLE_KICK); + + vi.spyOn(move, "calculateBattlePower"); + }); + + it("should have 100 more power if hit twice before calling Rage Fist", async () => { + game.override.enemySpecies(Species.MAGIKARP); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.RAGE_FIST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(150); + }); + + it("should maintain its power during next battle if it is within the same arena encounter", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(1); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.RAGE_FIST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextWave(); + + game.move.select(Moves.RAGE_FIST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(250); + }); + + it("should reset the hitRecCounter if we enter new trainer battle", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(4); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.RAGE_FIST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextWave(); + + game.move.select(Moves.RAGE_FIST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(150); + }); + + it("should not increase the hitCounter if Substitute is hit", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(4); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SUBSTITUTE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(game.scene.getPlayerPokemon()?.customPokemonData.hitsRecCount).toBe(0); + }); + + it("should reset the hitRecCounter if we enter new biome", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(10); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.RAGE_FIST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + game.move.select(Moves.RAGE_FIST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(150); + }); + + it("should not reset the hitRecCounter if switched out", async () => { + game.override.enemySpecies(Species.MAGIKARP).startingWave(1).enemyMoveset(Moves.TACKLE); + + await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + game.move.select(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.RAGE_FIST); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.CHARIZARD); + expect(move.calculateBattlePower).toHaveLastReturnedWith(150); + }); +}); diff --git a/test/moves/rage_powder.test.ts b/test/moves/rage_powder.test.ts new file mode 100644 index 00000000000..ab05ae2e0bc --- /dev/null +++ b/test/moves/rage_powder.test.ts @@ -0,0 +1,73 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Moves - Rage 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("double"); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.RAGE_POWDER, Moves.TACKLE, Moves.SPLASH]); + }); + + test("move effect should be bypassed by Grass type", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.VENUSAUR]); + + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + + await game.forceEnemyMove(Moves.RAGE_POWDER); + await game.forceEnemyMove(Moves.SPLASH); + + await game.phaseInterceptor.to("BerryPhase", false); + + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + }); + + test("move effect should be bypassed by Overcoat", async () => { + game.override.ability(Abilities.OVERCOAT); + + // Test with two non-Grass type player Pokemon + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const enemyPokemon = game.scene.getEnemyField(); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + + await game.forceEnemyMove(Moves.RAGE_POWDER); + await game.forceEnemyMove(Moves.SPLASH); + + await game.phaseInterceptor.to("BerryPhase", false); + + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + }); +}); diff --git a/src/test/moves/reflect.test.ts b/test/moves/reflect.test.ts similarity index 52% rename from src/test/moves/reflect.test.ts rename to test/moves/reflect.test.ts index 3bf415ea75c..ac879a7cc2b 100644 --- a/src/test/moves/reflect.test.ts +++ b/test/moves/reflect.test.ts @@ -1,16 +1,19 @@ +import type BattleScene from "#app/battle-scene"; import { ArenaTagSide } from "#app/data/arena-tag"; -import Move, { allMoves } from "#app/data/move"; +import type Move from "#app/data/moves/move"; +import { allMoves, CritOnlyAttr } from "#app/data/moves/move"; import { Abilities } from "#app/enums/abilities"; import { ArenaTagType } from "#app/enums/arena-tag-type"; -import Pokemon from "#app/field/pokemon"; +import type Pokemon from "#app/field/pokemon"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { NumberHolder } from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +let globalScene: BattleScene; describe("Moves - Reflect", () => { let phaserGame: Phaser.Game; @@ -30,23 +33,28 @@ describe("Moves - Reflect", () => { beforeEach(() => { game = new GameManager(phaserGame); + globalScene = game.scene; game.override.battleType("single"); game.override.ability(Abilities.NONE); - game.override.moveset([ Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE ]); + game.override.moveset([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT ]); + game.override.enemyMoveset([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); game.override.disableCrits(); }); it("reduces damage of physical attacks by half in a single battle", async () => { const moveToUse = Moves.TACKLE; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); }); @@ -55,29 +63,70 @@ describe("Moves - Reflect", () => { game.override.battleType("double"); const moveToUse = Moves.ROCK_SLIDE; - await game.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE, Species.SHUCKLE]); game.move.select(moveToUse); game.move.select(moveToUse, 1); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); }); it("does not affect special attacks", async () => { const moveToUse = Moves.ABSORB; - await game.startBattle([ Species.SHUCKLE ]); + await game.classicMode.startBattle([Species.SHUCKLE]); game.move.select(moveToUse); await game.phaseInterceptor.to(TurnEndPhase); - const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon()!, game.scene.getPlayerPokemon()!, allMoves[moveToUse]); + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); expect(mockedDmg).toBe(allMoves[moveToUse].power); }); + + it("does not affect critical hits", async () => { + game.override.moveset([Moves.WICKED_BLOW]); + const moveToUse = Moves.WICKED_BLOW; + await game.classicMode.startBattle([Species.SHUCKLE]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); + + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); + + it("does not affect critical hits", async () => { + game.override.moveset([Moves.WICKED_BLOW]); + const moveToUse = Moves.WICKED_BLOW; + await game.classicMode.startBattle([Species.SHUCKLE]); + + game.move.select(moveToUse); + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage( + game.scene.getEnemyPokemon()!, + game.scene.getPlayerPokemon()!, + allMoves[moveToUse], + ); + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); }); /** @@ -93,8 +142,10 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = const multiplierHolder = new NumberHolder(1); const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - if (defender.scene.arena.getTagOnSide(ArenaTagType.REFLECT, side)) { - defender.scene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, false, attacker, move.category, multiplierHolder); + if (globalScene.arena.getTagOnSide(ArenaTagType.REFLECT, side)) { + if (move.getAttrs(CritOnlyAttr).length === 0) { + globalScene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, false, attacker, move.category, multiplierHolder); + } } return move.power * multiplierHolder.value; diff --git a/test/moves/reflect_type.test.ts b/test/moves/reflect_type.test.ts new file mode 100644 index 00000000000..78371d35475 --- /dev/null +++ b/test/moves/reflect_type.test.ts @@ -0,0 +1,55 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { PokemonType } from "#enums/pokemon-type"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Reflect Type", () => { + 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.ability(Abilities.BALL_FETCH).battleType("single").disableCrits().enemyAbility(Abilities.BALL_FETCH); + }); + + it("will make the user Normal/Grass if targetting a typeless Pokemon affected by Forest's Curse", async () => { + game.override + .moveset([Moves.FORESTS_CURSE, Moves.REFLECT_TYPE]) + .startingLevel(60) + .enemySpecies(Species.CHARMANDER) + .enemyMoveset([Moves.BURN_UP, Moves.SPLASH]); + await game.classicMode.startBattle([Species.FEEBAS]); + + const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.BURN_UP); + await game.toNextTurn(); + + game.move.select(Moves.FORESTS_CURSE); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + expect(enemyPokemon?.getTypes().includes(PokemonType.UNKNOWN)).toBe(true); + expect(enemyPokemon?.getTypes().includes(PokemonType.GRASS)).toBe(true); + + game.move.select(Moves.REFLECT_TYPE); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon?.getTypes()[0]).toBe(PokemonType.NORMAL); + expect(playerPokemon?.getTypes().includes(PokemonType.GRASS)).toBe(true); + }); +}); diff --git a/src/test/moves/relic_song.test.ts b/test/moves/relic_song.test.ts similarity index 78% rename from src/test/moves/relic_song.test.ts rename to test/moves/relic_song.test.ts index eb877b6054d..d8f1373b4c0 100644 --- a/src/test/moves/relic_song.test.ts +++ b/test/moves/relic_song.test.ts @@ -1,9 +1,9 @@ -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Challenges } from "#app/enums/challenges"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -23,7 +23,7 @@ describe("Moves - Relic Song", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.RELIC_SONG, Moves.SPLASH ]) + .moveset([Moves.RELIC_SONG, Moves.SPLASH]) .battleType("single") .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) @@ -32,7 +32,7 @@ describe("Moves - Relic Song", () => { }); it("swaps Meloetta's form between Aria and Pirouette", async () => { - await game.classicMode.startBattle([ Species.MELOETTA ]); + await game.classicMode.startBattle([Species.MELOETTA]); const meloetta = game.scene.getPlayerPokemon()!; @@ -48,8 +48,8 @@ describe("Moves - Relic Song", () => { }); it("doesn't swap Meloetta's form during a mono-type challenge", async () => { - game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, Type.PSYCHIC + 1, 0); - await game.challengeMode.startBattle([ Species.MELOETTA ]); + game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, PokemonType.PSYCHIC + 1, 0); + await game.challengeMode.startBattle([Species.MELOETTA]); const meloetta = game.scene.getPlayerPokemon()!; @@ -63,10 +63,8 @@ describe("Moves - Relic Song", () => { }); it("doesn't swap Meloetta's form during biome change (arena reset)", async () => { - game.override - .starterForms({ [Species.MELOETTA]: 1 }) - .startingWave(10); - await game.classicMode.startBattle([ Species.MELOETTA ]); + game.override.starterForms({ [Species.MELOETTA]: 1 }).startingWave(10); + await game.classicMode.startBattle([Species.MELOETTA]); const meloetta = game.scene.getPlayerPokemon()!; diff --git a/src/test/moves/retaliate.test.ts b/test/moves/retaliate.test.ts similarity index 80% rename from src/test/moves/retaliate.test.ts rename to test/moves/retaliate.test.ts index e00b9da6010..5cc0b08ccc6 100644 --- a/src/test/moves/retaliate.test.ts +++ b/test/moves/retaliate.test.ts @@ -1,9 +1,9 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; describe("Moves - Retaliate", () => { let phaserGame: Phaser.Game; @@ -26,16 +26,16 @@ describe("Moves - Retaliate", () => { game.override .battleType("single") .enemySpecies(Species.SNORLAX) - .enemyMoveset([ Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE ]) + .enemyMoveset([Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE]) .enemyLevel(100) - .moveset([ Moves.RETALIATE, Moves.SPLASH ]) + .moveset([Moves.RETALIATE, Moves.SPLASH]) .startingLevel(80) .disableCrits(); }); it("increases power if ally died previous turn", async () => { vi.spyOn(retaliate, "calculateBattlePower"); - await game.startBattle([ Species.ABRA, Species.COBALION ]); + await game.startBattle([Species.ABRA, Species.COBALION]); game.move.select(Moves.RETALIATE); await game.phaseInterceptor.to("TurnEndPhase"); expect(retaliate.calculateBattlePower).toHaveLastReturnedWith(70); diff --git a/test/moves/revival_blessing.test.ts b/test/moves/revival_blessing.test.ts new file mode 100644 index 00000000000..187b5e62e76 --- /dev/null +++ b/test/moves/revival_blessing.test.ts @@ -0,0 +1,117 @@ +import { BattlerIndex } from "#app/battle"; +import { MoveResult } from "#app/field/pokemon"; +import { toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Revival Blessing", () => { + 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.REVIVAL_BLESSING, Moves.MEMENTO]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should revive a selected fainted Pokemon when used by the player", async () => { + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); + + game.move.select(Moves.MEMENTO); + game.doSelectPartyPokemon(1, "SwitchPhase"); + await game.toNextTurn(); + + const player = game.scene.getPlayerPokemon()!; + + expect(player.species.speciesId).toBe(Species.MAGIKARP); + game.move.select(Moves.REVIVAL_BLESSING); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + game.doSelectPartyPokemon(1, "RevivalBlessingPhase"); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + const revivedPokemon = game.scene.getPlayerParty()[1]; + expect(revivedPokemon.status?.effect).toBeFalsy(); + expect(revivedPokemon.hp).toBe(Math.floor(revivedPokemon.getMaxHp() / 2)); + }); + + it("should revive a random fainted enemy when used by an enemy Trainer", async () => { + game.override.enemyMoveset(Moves.REVIVAL_BLESSING).startingWave(8); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + const revivedPokemon = game.scene.getEnemyParty()[1]; + expect(revivedPokemon.status?.effect).toBeFalsy(); + expect(revivedPokemon.hp).toBe(Math.floor(revivedPokemon.getMaxHp() / 2)); + }); + + it("should fail when there are no fainted Pokemon to target", async () => { + await game.classicMode.startBattle([Species.FEEBAS, Species.MAGIKARP]); + + game.move.select(Moves.REVIVAL_BLESSING); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEndPhase", false); + + const player = game.scene.getPlayerPokemon()!; + expect(player.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should revive a player pokemon and immediately send it back out if used in the same turn it fainted in doubles", async () => { + game.override + .battleType("double") + .enemyMoveset([Moves.SPLASH, Moves.FISSURE]) + .enemyAbility(Abilities.NO_GUARD) + .enemyLevel(100); + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC, Species.GYARADOS]); + + const feebas = game.scene.getPlayerField()[0]; + + game.move.select(Moves.SPLASH); + game.move.select(Moves.REVIVAL_BLESSING, 1); + await game.forceEnemyMove(Moves.FISSURE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2]); + + await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(feebas.isFainted()).toBe(true); + + game.doSelectPartyPokemon(0, "RevivalBlessingPhase"); + await game.toNextTurn(); + + expect(feebas.isFainted()).toBe(false); + expect(feebas.hp).toBe(toDmgValue(0.5 * feebas.getMaxHp())); + expect(game.scene.getPlayerField()[0]).toBe(feebas); + }); +}); diff --git a/test/moves/role_play.test.ts b/test/moves/role_play.test.ts new file mode 100644 index 00000000000..2a899b6e987 --- /dev/null +++ b/test/moves/role_play.test.ts @@ -0,0 +1,53 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Role Play", () => { + 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.ROLE_PLAY]) + .ability(Abilities.ADAPTABILITY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should set the user's ability to the target's ability", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.ROLE_PLAY); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + }); + + it("should activate post-summon abilities", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.ROLE_PLAY); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); +}); diff --git a/src/test/moves/rollout.test.ts b/test/moves/rollout.test.ts similarity index 82% rename from src/test/moves/rollout.test.ts rename to test/moves/rollout.test.ts index 4a14b100f6d..89270c2dfc7 100644 --- a/src/test/moves/rollout.test.ts +++ b/test/moves/rollout.test.ts @@ -1,9 +1,9 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -35,7 +35,7 @@ describe("Moves - Rollout", () => { }); it("should double it's dmg on sequential uses but reset after 5", async () => { - game.override.moveset([ Moves.ROLLOUT ]); + game.override.moveset([Moves.ROLLOUT]); vi.spyOn(allMoves[Moves.ROLLOUT], "accuracy", "get").mockReturnValue(100); //always hit const variance = 5; @@ -44,11 +44,11 @@ describe("Moves - Rollout", () => { await game.startBattle(); - const playerPkm = game.scene.getParty()[0]; - vi.spyOn(playerPkm, "stats", "get").mockReturnValue([ 500000, 1, 1, 1, 1, 1 ]); // HP, ATK, DEF, SPATK, SPDEF, SPD + const playerPkm = game.scene.getPlayerParty()[0]; + vi.spyOn(playerPkm, "stats", "get").mockReturnValue([500000, 1, 1, 1, 1, 1]); // HP, ATK, DEF, SPATK, SPDEF, SPD const enemyPkm = game.scene.getEnemyParty()[0]; - vi.spyOn(enemyPkm, "stats", "get").mockReturnValue([ 500000, 1, 1, 1, 1, 1 ]); // HP, ATK, DEF, SPATK, SPDEF, SPD + vi.spyOn(enemyPkm, "stats", "get").mockReturnValue([500000, 1, 1, 1, 1, 1]); // HP, ATK, DEF, SPATK, SPDEF, SPD vi.spyOn(enemyPkm, "getHeldItems").mockReturnValue([]); //no berries enemyPkm.hp = enemyPkm.getMaxHp(); @@ -62,7 +62,7 @@ describe("Moves - Rollout", () => { previousHp = enemyPkm.hp; } - const [ turn1Dmg, turn2Dmg, turn3Dmg, turn4Dmg, turn5Dmg, turn6Dmg ] = dmgHistory; + const [turn1Dmg, turn2Dmg, turn3Dmg, turn4Dmg, turn5Dmg, turn6Dmg] = dmgHistory; expect(turn2Dmg).toBeGreaterThanOrEqual(turn1Dmg * 2 - variance); expect(turn2Dmg).toBeLessThanOrEqual(turn1Dmg * 2 + variance); diff --git a/test/moves/roost.test.ts b/test/moves/roost.test.ts new file mode 100644 index 00000000000..a52b81085c8 --- /dev/null +++ b/test/moves/roost.test.ts @@ -0,0 +1,244 @@ +import { BattlerIndex } from "#app/battle"; +import { PokemonType } from "#enums/pokemon-type"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Moves - Roost", () => { + 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.RELICANTH); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.enemyMoveset(Moves.EARTHQUAKE); + game.override.moveset([Moves.ROOST, Moves.BURN_UP, Moves.DOUBLE_SHOCK]); + }); + + /** + * Roost's behavior should be defined as: + * The pokemon loses its flying type for a turn. If the pokemon was ungroundd solely due to being a flying type, it will be grounded until end of turn. + * 1. Pure Flying type pokemon -> become normal type until end of turn + * 2. Dual Flying/X type pokemon -> become type X until end of turn + * 3. Pokemon that use burn up into roost (ex. Moltres) -> become flying due to burn up, then typeless until end of turn after using roost + * 4. If a pokemon is afflicted with Forest's Curse or Trick or treat, dual type pokemon will become 3 type pokemon after the flying type is regained + * Pure flying types become (Grass or Ghost) and then back to flying/ (Grass or Ghost), + * and pokemon post Burn up become () + * 5. If a pokemon is also ungrounded due to other reasons (such as levitate), it will stay ungrounded post roost, despite not being flying type. + * 6. Non flying types using roost (such as dunsparce) are already grounded, so this move will only heal and have no other effects. + */ + + test("Non flying type uses roost -> no type change, took damage", async () => { + await game.classicMode.startBattle([Species.DUNSPARCE]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + // Should only be normal type, and NOT flying type + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); + + await game.phaseInterceptor.to(TurnEndPhase); + + // Lose HP, still normal type + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); + }); + + test("Pure flying type -> becomes normal after roost and takes damage from ground moves -> regains flying", async () => { + await game.classicMode.startBattle([Species.TORNADUS]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + // Should only be normal type, and NOT flying type + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeTruthy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeFalsy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); + + await game.phaseInterceptor.to(TurnEndPhase); + + // Should have lost HP and is now back to being pure flying + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.NORMAL).toBeFalsy(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); + + test("Dual X/flying type -> becomes type X after roost and takes damage from ground moves -> regains flying", async () => { + await game.classicMode.startBattle([Species.HAWLUCHA]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + // Should only be pure fighting type and grounded + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.FIGHTING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); + + await game.phaseInterceptor.to(TurnEndPhase); + + // Should have lost HP and is now back to being fighting/flying + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.FIGHTING).toBeTruthy(); + expect(playerPokemonTypes[1] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); + + test("Pokemon with levitate after using roost should lose flying type but still be unaffected by ground moves", async () => { + game.override.starterForms({ [Species.ROTOM]: 4 }); + await game.classicMode.startBattle([Species.ROTOM]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + // Should only be pure eletric type and grounded + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.ELECTRIC).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + + await game.phaseInterceptor.to(TurnEndPhase); + + // Should have lost HP and is now back to being electric/flying + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBe(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.ELECTRIC).toBeTruthy(); + expect(playerPokemonTypes[1] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); + + test("A fire/flying type that uses burn up, then roost should be typeless until end of turn", async () => { + await game.classicMode.startBattle([Species.MOLTRES]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.BURN_UP); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + // Should only be pure flying type after burn up + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + + await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + // Should only be typeless type after roost and is grounded + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); + expect(playerPokemonTypes[0] === PokemonType.UNKNOWN).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); + + await game.phaseInterceptor.to(TurnEndPhase); + + // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); + + test("An electric/flying type that uses double shock, then roost should be typeless until end of turn", async () => { + game.override.enemySpecies(Species.ZEKROM); + await game.classicMode.startBattle([Species.ZAPDOS]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemonStartingHP = playerPokemon.hp; + game.move.select(Moves.DOUBLE_SHOCK); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + // Should only be pure flying type after burn up + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + + await game.phaseInterceptor.to(TurnEndPhase); + game.move.select(Moves.ROOST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to(MoveEffectPhase); + + // Should only be typeless type after roost and is grounded + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); + expect(playerPokemonTypes[0] === PokemonType.UNKNOWN).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); + + await game.phaseInterceptor.to(TurnEndPhase); + + // Should go back to being pure flying and have taken damage from earthquake, and is ungrounded again + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemon.hp).toBeLessThan(playerPokemonStartingHP); + expect(playerPokemonTypes[0] === PokemonType.FLYING).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); + + test("Dual Type Pokemon afflicted with Forests Curse/Trick or Treat and post roost will become dual type and then become 3 type at end of turn", async () => { + game.override.enemyMoveset([ + Moves.TRICK_OR_TREAT, + Moves.TRICK_OR_TREAT, + Moves.TRICK_OR_TREAT, + Moves.TRICK_OR_TREAT, + ]); + await game.classicMode.startBattle([Species.MOLTRES]); + const playerPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.ROOST); + await game.phaseInterceptor.to(MoveEffectPhase); + + let playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes[0] === PokemonType.FIRE).toBeTruthy(); + expect(playerPokemonTypes.length === 1).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeTruthy(); + + await game.phaseInterceptor.to(TurnEndPhase); + + // Should be fire/flying/ghost + playerPokemonTypes = playerPokemon.getTypes(); + expect(playerPokemonTypes.filter(type => type === PokemonType.FLYING)).toHaveLength(1); + expect(playerPokemonTypes.filter(type => type === PokemonType.FIRE)).toHaveLength(1); + expect(playerPokemonTypes.filter(type => type === PokemonType.GHOST)).toHaveLength(1); + expect(playerPokemonTypes.length === 3).toBeTruthy(); + expect(playerPokemon.isGrounded()).toBeFalsy(); + }); +}); diff --git a/test/moves/round.test.ts b/test/moves/round.test.ts new file mode 100644 index 00000000000..82f080a25ea --- /dev/null +++ b/test/moves/round.test.ts @@ -0,0 +1,70 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/moves/move"; +import type { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Round", () => { + 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.ROUND]) + .ability(Abilities.BALL_FETCH) + .battleType("double") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.SPLASH, Moves.ROUND]) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should cue other instances of Round together in Speed order", async () => { + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); + + const round = allMoves[Moves.ROUND]; + const spy = vi.spyOn(round, "calculateBattlePower"); + + game.move.select(Moves.ROUND, 0, BattlerIndex.ENEMY); + game.move.select(Moves.ROUND, 1, BattlerIndex.ENEMY_2); + + await game.forceEnemyMove(Moves.ROUND, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY]); + + const actualTurnOrder: BattlerIndex[] = []; + + for (let i = 0; i < 4; i++) { + await game.phaseInterceptor.to("MoveEffectPhase", false); + actualTurnOrder.push((game.scene.getCurrentPhase() as MoveEffectPhase).getUserPokemon()!.getBattlerIndex()); + await game.phaseInterceptor.to("MoveEndPhase"); + } + + expect(actualTurnOrder).toEqual([ + BattlerIndex.PLAYER, + BattlerIndex.PLAYER_2, + BattlerIndex.ENEMY, + BattlerIndex.ENEMY_2, + ]); + const powerResults = spy.mock.results.map(result => result.value); + expect(powerResults).toEqual([60, 120, 120]); + }); +}); diff --git a/src/test/moves/safeguard.test.ts b/test/moves/safeguard.test.ts similarity index 78% rename from src/test/moves/safeguard.test.ts rename to test/moves/safeguard.test.ts index 6505162fd04..2235b59e1af 100644 --- a/src/test/moves/safeguard.test.ts +++ b/test/moves/safeguard.test.ts @@ -2,13 +2,12 @@ import { BattlerIndex } from "#app/battle"; import { allAbilities, PostDefendContactApplyStatusEffectAbAttr } from "#app/data/ability"; import { Abilities } from "#app/enums/abilities"; import { StatusEffect } from "#app/enums/status-effect"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; - describe("Moves - Safeguard", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,11 +27,11 @@ describe("Moves - Safeguard", () => { game.override .battleType("single") .enemySpecies(Species.DRATINI) - .enemyMoveset([ Moves.SAFEGUARD ]) + .enemyMoveset([Moves.SAFEGUARD]) .enemyAbility(Abilities.BALL_FETCH) .enemyLevel(5) .starterSpecies(Species.DRATINI) - .moveset([ Moves.NUZZLE, Moves.SPORE, Moves.YAWN, Moves.SPLASH ]) + .moveset([Moves.NUZZLE, Moves.SPORE, Moves.YAWN, Moves.SPLASH]) .ability(Abilities.UNNERVE); // Stop wild Pokemon from potentially eating Lum Berry }); @@ -41,7 +40,7 @@ describe("Moves - Safeguard", () => { const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.NUZZLE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemy.status).toBeUndefined(); @@ -52,19 +51,19 @@ describe("Moves - Safeguard", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPORE); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyPokemon.status).toBeUndefined(); }); it("protects from confusion", async () => { - game.override.moveset([ Moves.CONFUSE_RAY ]); + game.override.moveset([Moves.CONFUSE_RAY]); await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.CONFUSE_RAY); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyPokemon.summonData.tags).toEqual([]); @@ -78,7 +77,7 @@ describe("Moves - Safeguard", () => { game.move.select(Moves.SPORE, 0, BattlerIndex.ENEMY_2); game.move.select(Moves.NUZZLE, 1, BattlerIndex.ENEMY_2); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); @@ -93,7 +92,7 @@ describe("Moves - Safeguard", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.YAWN); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); expect(enemyPokemon.summonData.tags).toEqual([]); @@ -104,7 +103,7 @@ describe("Moves - Safeguard", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.YAWN); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); game.move.select(Moves.SPLASH); @@ -119,13 +118,13 @@ describe("Moves - Safeguard", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); enemyPokemon.damageAndUpdate(1); expect(enemyPokemon.status?.effect).toEqual(StatusEffect.BURN); - game.override.enemyMoveset([ Moves.REST ]); + game.override.enemyMoveset([Moves.REST]); // Force the moveset to update mid-battle // TODO: Remove after enemy AI rework is in enemyPokemon.getMoveset(); @@ -138,14 +137,18 @@ describe("Moves - Safeguard", () => { it("protects from ability-inflicted status", async () => { game.override.ability(Abilities.STATIC); - vi.spyOn(allAbilities[Abilities.STATIC].getAttrs(PostDefendContactApplyStatusEffectAbAttr)[0], "chance", "get").mockReturnValue(100); + vi.spyOn( + allAbilities[Abilities.STATIC].getAttrs(PostDefendContactApplyStatusEffectAbAttr)[0], + "chance", + "get", + ).mockReturnValue(100); await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPLASH); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); - game.override.enemyMoveset([ Moves.TACKLE ]); + game.override.enemyMoveset([Moves.TACKLE]); game.move.select(Moves.SPLASH); await game.toNextTurn(); diff --git a/src/test/moves/scale_shot.test.ts b/test/moves/scale_shot.test.ts similarity index 84% rename from src/test/moves/scale_shot.test.ts rename to test/moves/scale_shot.test.ts index e4d768fa13a..2be632adb54 100644 --- a/src/test/moves/scale_shot.test.ts +++ b/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 { allMoves } from "#app/data/moves/move"; +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"; @@ -8,7 +8,7 @@ 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; @@ -29,7 +29,7 @@ describe("Moves - Scale Shot", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SCALE_SHOT ]) + .moveset([Moves.SCALE_SHOT]) .battleType("single") .disableCrits() .ability(Abilities.NO_GUARD) @@ -41,14 +41,14 @@ describe("Moves - Scale Shot", () => { it("applies stat changes after last hit", async () => { game.override.enemySpecies(Species.FORRETRESS); - await game.classicMode.startBattle([ Species.MINCCINO ]); + await game.classicMode.startBattle([Species.MINCCINO]); const minccino = game.scene.getPlayerPokemon()!; game.move.select(Moves.SCALE_SHOT); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + 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); @@ -69,7 +69,7 @@ describe("Moves - Scale Shot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); - await game.classicMode.startBattle([ Species.MINCCINO ]); + await game.classicMode.startBattle([Species.MINCCINO]); const minccino = game.scene.getPlayerPokemon()!; game.move.select(Moves.SCALE_SHOT); diff --git a/src/test/moves/secret_power.test.ts b/test/moves/secret_power.test.ts similarity index 50% rename from src/test/moves/secret_power.test.ts rename to test/moves/secret_power.test.ts index ff0b5ae8c24..37f1664251b 100644 --- a/src/test/moves/secret_power.test.ts +++ b/test/moves/secret_power.test.ts @@ -2,15 +2,16 @@ import { Abilities } from "#enums/abilities"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; -import { allMoves, SecretPowerAttr } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#enums/status-effect"; import { BattlerIndex } from "#app/battle"; import { ArenaTagType } from "#enums/arena-tag-type"; import { ArenaTagSide } from "#app/data/arena-tag"; +import { allAbilities, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; describe("Moves - Secret Power", () => { let phaserGame: Phaser.Game; @@ -29,7 +30,7 @@ describe("Moves - Secret Power", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SECRET_POWER ]) + .moveset([Moves.SECRET_POWER]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -39,13 +40,11 @@ describe("Moves - Secret Power", () => { }); it("Secret Power checks for an active terrain first then looks at the biome for its secondary effect", async () => { - game.override - .startingBiome(Biome.VOLCANO) - .enemyMoveset([ Moves.SPLASH, Moves.MISTY_TERRAIN ]); + game.override.startingBiome(Biome.VOLCANO).enemyMoveset([Moves.SPLASH, Moves.MISTY_TERRAIN]); vi.spyOn(allMoves[Moves.SECRET_POWER], "chance", "get").mockReturnValue(100); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; // No Terrain + Biome.VOLCANO --> Burn game.move.select(Moves.SECRET_POWER); @@ -60,30 +59,36 @@ describe("Moves - Secret Power", () => { expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-1); }); - it("the 'rainbow' effect of fire+water pledge does not double the chance of secret power's secondary effect", - async () => { - game.override - .moveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.SECRET_POWER, Moves.SPLASH ]) - .enemyMoveset([ Moves.SPLASH ]) - .battleType("double"); - await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + it("Secret Power's effect chance is doubled by Serene Grace, but not by the 'rainbow' effect from Fire/Water Pledge", async () => { + game.override + .moveset([Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.SECRET_POWER, Moves.SPLASH]) + .ability(Abilities.SERENE_GRACE) + .enemyMoveset([Moves.SPLASH]) + .battleType("double"); + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); - const secretPowerAttr = allMoves[Moves.SECRET_POWER].getAttrs(SecretPowerAttr)[0]; - vi.spyOn(secretPowerAttr, "getMoveChance"); + const sereneGraceAttr = allAbilities[Abilities.SERENE_GRACE].getAttrs(MoveEffectChanceMultiplierAbAttr)[0]; + vi.spyOn(sereneGraceAttr, "canApply"); - game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); - game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); + game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); - await game.phaseInterceptor.to("TurnEndPhase"); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); + let rainbowEffect = game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER); + expect(rainbowEffect).toBeDefined(); - game.move.select(Moves.SECRET_POWER, 0, BattlerIndex.ENEMY); - game.move.select(Moves.SPLASH, 1); + rainbowEffect = rainbowEffect!; + vi.spyOn(rainbowEffect, "apply"); - await game.phaseInterceptor.to("BerryPhase", false); + game.move.select(Moves.SECRET_POWER, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); - expect(secretPowerAttr.getMoveChance).toHaveLastReturnedWith(30); - } - ); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(sereneGraceAttr.canApply).toHaveBeenCalledOnce(); + expect(sereneGraceAttr.canApply).toHaveLastReturnedWith(true); + + expect(rainbowEffect.apply).toHaveBeenCalledTimes(0); + }); }); diff --git a/src/test/moves/shed_tail.test.ts b/test/moves/shed_tail.test.ts similarity index 61% rename from src/test/moves/shed_tail.test.ts rename to test/moves/shed_tail.test.ts index c4df6c574cb..6744c4e9ed8 100644 --- a/src/test/moves/shed_tail.test.ts +++ b/test/moves/shed_tail.test.ts @@ -1,8 +1,9 @@ import { SubstituteTag } from "#app/data/battler-tags"; +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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; @@ -23,7 +24,7 @@ describe("Moves - Shed Tail", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SHED_TAIL ]) + .moveset([Moves.SHED_TAIL]) .battleType("single") .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.BALL_FETCH) @@ -31,7 +32,7 @@ describe("Moves - Shed Tail", () => { }); it("transfers a Substitute doll to the switched in Pokemon", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); const magikarp = game.scene.getPlayerPokemon()!; @@ -45,12 +46,23 @@ describe("Moves - Shed Tail", () => { expect(feebas).not.toBe(magikarp); expect(feebas.hp).toBe(feebas.getMaxHp()); - // Note: Shed Tail's HP cost is currently not accurate to mainline, as it - // should cost ceil(maxHP / 2) instead of max(floor(maxHp / 2), 1). The current - // implementation is consistent with Substitute's HP cost logic, but that's not - // the case in mainline for some reason :regiDespair:. - expect(magikarp.hp).toBe(Math.ceil(magikarp.getMaxHp() / 2)); + // Note: Altered the test to be consistent with the correct HP cost :yipeevee_static: + expect(magikarp.hp).toBe(Math.floor(magikarp.getMaxHp() / 2)); expect(substituteTag).toBeDefined(); expect(substituteTag?.hp).toBe(Math.floor(magikarp.getMaxHp() / 4)); }); + + it("should fail if no ally is available to switch in", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + const magikarp = game.scene.getPlayerPokemon()!; + expect(game.scene.getPlayerParty().length).toBe(1); + + game.move.select(Moves.SHED_TAIL); + + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(magikarp.isOnField()).toBeTruthy(); + expect(magikarp.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); }); diff --git a/src/test/moves/shell_side_arm.test.ts b/test/moves/shell_side_arm.test.ts similarity index 79% rename from src/test/moves/shell_side_arm.test.ts rename to test/moves/shell_side_arm.test.ts index 9646d27f17e..47da5e1c2f7 100644 --- a/src/test/moves/shell_side_arm.test.ts +++ b/test/moves/shell_side_arm.test.ts @@ -1,9 +1,9 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves, ShellSideArmCategoryAttr } from "#app/data/move"; +import { allMoves, ShellSideArmCategoryAttr } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -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) @@ -37,7 +37,7 @@ describe("Moves - Shell Side Arm", () => { it("becomes a physical attack if forecasted to deal more damage as physical", async () => { game.override.enemySpecies(Species.SNORLAX); - await game.classicMode.startBattle([ Species.RAMPARDOS ]); + await game.classicMode.startBattle([Species.RAMPARDOS]); vi.spyOn(shellSideArmAttr, "apply"); @@ -50,7 +50,7 @@ describe("Moves - Shell Side Arm", () => { it("remains a special attack if forecasted to deal more damage as special", async () => { game.override.enemySpecies(Species.SLOWBRO); - await game.classicMode.startBattle([ Species.XURKITREE ]); + await game.classicMode.startBattle([Species.XURKITREE]); vi.spyOn(shellSideArmAttr, "apply"); @@ -61,16 +61,17 @@ describe("Moves - Shell Side Arm", () => { }); it("respects stat stage changes when forecasting base damage", async () => { - game.override - .enemySpecies(Species.SNORLAX) - .enemyMoveset(Moves.COTTON_GUARD); + game.override.enemySpecies(Species.SNORLAX).enemyMoveset(Moves.COTTON_GUARD); - await game.classicMode.startBattle([ Species.MANAPHY ]); + await game.classicMode.startBattle([Species.MANAPHY]); 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.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(shellSideArmAttr.apply).toHaveLastReturnedWith(false); diff --git a/test/moves/shell_trap.test.ts b/test/moves/shell_trap.test.ts new file mode 100644 index 00000000000..2df94cdb828 --- /dev/null +++ b/test/moves/shell_trap.test.ts @@ -0,0 +1,146 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/moves/move"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { MoveResult } from "#app/field/pokemon"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; +import { MovePhase } from "#app/phases/move-phase"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Shell Trap", () => { + 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("double") + .moveset([Moves.SHELL_TRAP, Moves.SPLASH, Moves.BULLDOZE]) + .enemySpecies(Species.SNORLAX) + .enemyMoveset([Moves.RAZOR_LEAF]) + .startingLevel(100) + .enemyLevel(100); + + vi.spyOn(allMoves[Moves.RAZOR_LEAF], "accuracy", "get").mockReturnValue(100); + }); + + it("should activate after the user is hit by a physical attack", async () => { + await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SHELL_TRAP, 1); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); + + await game.phaseInterceptor.to(MoveEndPhase); + + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).toBe(playerPokemon[1]); + + await game.phaseInterceptor.to(MoveEndPhase); + enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); + }); + + it("should fail if the user is only hit by special attacks", async () => { + game.override.enemyMoveset([Moves.SWIFT]); + + await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SHELL_TRAP, 1); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); + + await game.phaseInterceptor.to(MoveEndPhase); + + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); + + await game.phaseInterceptor.to(BerryPhase, false); + enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); + + it("should fail if the user isn't hit with any attack", async () => { + game.override.enemyMoveset(Moves.SPLASH); + + await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SHELL_TRAP, 1); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2]); + + await game.phaseInterceptor.to(MoveEndPhase); + + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); + + await game.phaseInterceptor.to(BerryPhase, false); + enemyPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); + + it("should not activate from an ally's attack", async () => { + game.override.enemyMoveset(Moves.SPLASH); + + await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SHELL_TRAP); + game.move.select(Moves.BULLDOZE, 1); + + await game.phaseInterceptor.to(MoveEndPhase); + + const movePhase = game.scene.getCurrentPhase(); + expect(movePhase instanceof MovePhase).toBeTruthy(); + expect((movePhase as MovePhase).pokemon).not.toBe(playerPokemon[1]); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + await game.phaseInterceptor.to(BerryPhase, false); + enemyPokemon.forEach((p, i) => expect(p.hp).toBe(enemyStartingHp[i])); + }); + + it("should not activate from a subsequent physical attack", async () => { + game.override.battleType("single"); + vi.spyOn(allMoves[Moves.RAZOR_LEAF], "priority", "get").mockReturnValue(-4); + + await game.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SHELL_TRAP); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); +}); diff --git a/test/moves/simple_beam.test.ts b/test/moves/simple_beam.test.ts new file mode 100644 index 00000000000..ce86f42671e --- /dev/null +++ b/test/moves/simple_beam.test.ts @@ -0,0 +1,42 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Simple Beam", () => { + 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.SIMPLE_BEAM]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("sets the target's ability to simple", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SIMPLE_BEAM); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.SIMPLE); + }); +}); diff --git a/test/moves/sketch.test.ts b/test/moves/sketch.test.ts new file mode 100644 index 00000000000..dfbf2eca713 --- /dev/null +++ b/test/moves/sketch.test.ts @@ -0,0 +1,98 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { MoveResult, PokemonMove } from "#app/field/pokemon"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { StatusEffect } from "#app/enums/status-effect"; +import { BattlerIndex } from "#app/battle"; +import { allMoves, RandomMoveAttr } from "#app/data/moves/move"; + +describe("Moves - Sketch", () => { + 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 + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("Sketch should not fail even if a previous Sketch failed to retrieve a valid move and ran out of PP", async () => { + await game.classicMode.startBattle([Species.REGIELEKI]); + const playerPokemon = game.scene.getPlayerPokemon()!; + // can't use normal moveset override because we need to check moveset changes + playerPokemon.moveset = [new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.SKETCH)]; + + game.move.select(Moves.SKETCH); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + const moveSlot0 = playerPokemon.getMoveset()[0]!; + expect(moveSlot0.moveId).toBe(Moves.SKETCH); + expect(moveSlot0.getPpRatio()).toBe(0); + + await game.toNextTurn(); + game.move.select(Moves.SKETCH); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(playerPokemon.moveset[0]?.moveId).toBe(Moves.SPLASH); + expect(playerPokemon.moveset[1]?.moveId).toBe(Moves.SKETCH); + }); + + it("Sketch should retrieve the most recent valid move from its target history", async () => { + game.override.enemyStatusEffect(StatusEffect.PARALYSIS); + await game.classicMode.startBattle([Species.REGIELEKI]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + playerPokemon.moveset = [new PokemonMove(Moves.SKETCH), new PokemonMove(Moves.GROWL)]; + + game.move.select(Moves.GROWL); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.move.forceStatusActivation(false); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + + await game.toNextTurn(); + game.move.select(Moves.SKETCH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.move.forceStatusActivation(true); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(playerPokemon.moveset[0]?.moveId).toBe(Moves.SPLASH); + expect(playerPokemon.moveset[1]?.moveId).toBe(Moves.GROWL); + }); + + it("should sketch moves that call other moves", async () => { + const randomMoveAttr = allMoves[Moves.METRONOME].findAttr(attr => attr instanceof RandomMoveAttr) as RandomMoveAttr; + vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(Moves.FALSE_SWIPE); + + game.override.enemyMoveset([Moves.METRONOME]); + await game.classicMode.startBattle([Species.REGIELEKI]); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.moveset = [new PokemonMove(Moves.SKETCH)]; + + // Opponent uses Metronome -> False Swipe, then player uses Sketch, which should sketch Metronome + game.move.select(Moves.SKETCH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(playerPokemon.moveset[0]?.moveId).toBe(Moves.METRONOME); + expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); // Make sure opponent actually used False Swipe + }); +}); diff --git a/test/moves/skill_swap.test.ts b/test/moves/skill_swap.test.ts new file mode 100644 index 00000000000..f807a85eaf6 --- /dev/null +++ b/test/moves/skill_swap.test.ts @@ -0,0 +1,56 @@ +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Skill Swap", () => { + 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.SKILL_SWAP]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should swap the two abilities", async () => { + game.override.ability(Abilities.ADAPTABILITY); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SKILL_SWAP); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(Abilities.BALL_FETCH); + expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(Abilities.ADAPTABILITY); + }); + + it("should activate post-summon abilities", async () => { + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SKILL_SWAP); + await game.phaseInterceptor.to("BerryPhase"); + + // player atk should be -1 after opponent gains intimidate and it activates + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); +}); diff --git a/test/moves/sleep_talk.test.ts b/test/moves/sleep_talk.test.ts new file mode 100644 index 00000000000..d31eff34a7a --- /dev/null +++ b/test/moves/sleep_talk.test.ts @@ -0,0 +1,75 @@ +import { Stat } from "#app/enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +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/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Sleep Talk", () => { + 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.SLEEP_TALK]) + .statusEffect(StatusEffect.SLEEP) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH) + .enemyLevel(100); + }); + + it("should fail when the user is not asleep", async () => { + game.override.statusEffect(StatusEffect.NONE); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SLEEP_TALK); + await game.toNextTurn(); + expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should fail if the user has no valid moves", async () => { + game.override.moveset([Moves.SLEEP_TALK, Moves.DIG, Moves.METRONOME, Moves.SOLAR_BEAM]); + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SLEEP_TALK); + await game.toNextTurn(); + expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should call a random valid move if the user is asleep", async () => { + game.override.moveset([Moves.SLEEP_TALK, Moves.DIG, Moves.FLY, Moves.SWORDS_DANCE]); // Dig and Fly are invalid moves, Swords Dance should always be called + await game.classicMode.startBattle([Species.FEEBAS]); + + game.move.select(Moves.SLEEP_TALK); + await game.toNextTurn(); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)); + }); + + it("should apply secondary effects of a move", async () => { + game.override.moveset([Moves.SLEEP_TALK, Moves.DIG, Moves.FLY, Moves.WOOD_HAMMER]); // Dig and Fly are invalid moves, Wood Hammer should always be called + await game.classicMode.startBattle(); + + game.move.select(Moves.SLEEP_TALK); + await game.toNextTurn(); + + expect(game.scene.getPlayerPokemon()!.isFullHp()).toBeFalsy(); // Wood Hammer recoil effect should be applied + }); +}); diff --git a/src/test/moves/solar_beam.test.ts b/test/moves/solar_beam.test.ts similarity index 88% rename from src/test/moves/solar_beam.test.ts rename to test/moves/solar_beam.test.ts index ebec338932a..dffd4f210e5 100644 --- a/src/test/moves/solar_beam.test.ts +++ b/test/moves/solar_beam.test.ts @@ -1,11 +1,11 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { BattlerTagType } from "#enums/battler-tag-type"; import { WeatherType } from "#enums/weather-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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; @@ -36,7 +36,7 @@ describe("Moves - Solar Beam", () => { }); it("should deal damage in two turns if no weather is active", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -60,11 +60,11 @@ describe("Moves - Solar Beam", () => { it.each([ { weatherType: WeatherType.SUNNY, name: "Sun" }, - { weatherType: WeatherType.HARSH_SUN, name: "Harsh Sun" } + { weatherType: WeatherType.HARSH_SUN, name: "Harsh Sun" }, ])("should deal damage in one turn if $name is active", async ({ weatherType }) => { game.override.weather(weatherType); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!; @@ -83,11 +83,11 @@ describe("Moves - Solar Beam", () => { it.each([ { weatherType: WeatherType.RAIN, name: "Rain" }, - { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" } + { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" }, ])("should have its power halved in $name", async ({ weatherType }) => { game.override.weather(weatherType); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const solarBeam = allMoves[Moves.SOLAR_BEAM]; diff --git a/src/test/moves/sparkly_swirl.test.ts b/test/moves/sparkly_swirl.test.ts similarity index 79% rename from src/test/moves/sparkly_swirl.test.ts rename to test/moves/sparkly_swirl.test.ts index 8449f2785f8..6cd357c7e0e 100644 --- a/src/test/moves/sparkly_swirl.test.ts +++ b/test/moves/sparkly_swirl.test.ts @@ -1,10 +1,10 @@ -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { StatusEffect } from "#app/enums/status-effect"; import { CommandPhase } from "#app/phases/command-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -27,18 +27,16 @@ describe("Moves - Sparkly Swirl", () => { .enemyLevel(100) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.SPARKLY_SWIRL, Moves.SPLASH ]) + .moveset([Moves.SPARKLY_SWIRL, Moves.SPLASH]) .ability(Abilities.BALL_FETCH); vi.spyOn(allMoves[Moves.SPARKLY_SWIRL], "accuracy", "get").mockReturnValue(100); }); it("should cure status effect of the user, its ally, and all party pokemon", async () => { - game.override - .battleType("double") - .statusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA, Species.RATTATA ]); - const [ leftPlayer, rightPlayer, partyPokemon ] = game.scene.getParty(); + game.override.battleType("double").statusEffect(StatusEffect.BURN); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); + const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); const leftOpp = game.scene.getEnemyPokemon()!; vi.spyOn(leftPlayer, "resetStatus"); @@ -60,11 +58,9 @@ describe("Moves - Sparkly Swirl", () => { }); it("should not cure status effect of the target/target's allies", async () => { - game.override - .battleType("double") - .enemyStatusEffect(StatusEffect.BURN); - await game.classicMode.startBattle([ Species.RATTATA, Species.RATTATA ]); - const [ leftOpp, rightOpp ] = game.scene.getEnemyField(); + game.override.battleType("double").enemyStatusEffect(StatusEffect.BURN); + await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA]); + const [leftOpp, rightOpp] = game.scene.getEnemyField(); vi.spyOn(leftOpp, "resetStatus"); vi.spyOn(rightOpp, "resetStatus"); diff --git a/test/moves/spectral_thief.test.ts b/test/moves/spectral_thief.test.ts new file mode 100644 index 00000000000..2e52b118a74 --- /dev/null +++ b/test/moves/spectral_thief.test.ts @@ -0,0 +1,214 @@ +import { Abilities } from "#enums/abilities"; +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#enums/stat"; +import { allMoves } from "#app/data/moves/move"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Spectral Thief", () => { + 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 + .enemySpecies(Species.SHUCKLE) + .enemyLevel(100) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH) + .moveset([Moves.SPECTRAL_THIEF, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH).disableCrits; + }); + + it("should steal max possible positive stat changes and ignore negative ones.", async () => { + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 6); + enemy.setStatStage(Stat.DEF, -6); + enemy.setStatStage(Stat.SPATK, 6); + enemy.setStatStage(Stat.SPDEF, -6); + enemy.setStatStage(Stat.SPD, 3); + + player.setStatStage(Stat.ATK, 4); + player.setStatStage(Stat.DEF, 1); + player.setStatStage(Stat.SPATK, 0); + player.setStatStage(Stat.SPDEF, 0); + player.setStatStage(Stat.SPD, -2); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * enemy has +6 ATK and player +4 => player only steals +2 + * enemy has -6 DEF and player 1 => player should not steal + * enemy has +6 SPATK and player 0 => player only steals +6 + * enemy has -6 SPDEF and player 0 => player should not steal + * enemy has +3 SPD and player -2 => player only steals +3 + */ + expect(player.getStatStages()).toEqual([6, 1, 6, 0, 1, 0, 0]); + expect(enemy.getStatStages()).toEqual([4, -6, 0, -6, 0, 0, 0]); + }); + + it("should steal stat stages before dmg calculation", async () => { + game.override.enemySpecies(Species.MAGIKARP).enemyLevel(50); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + const moveToCheck = allMoves[Moves.SPECTRAL_THIEF]; + const dmgBefore = enemy.getAttackDamage(player, moveToCheck, false, false, false, false).damage; + + enemy.setStatStage(Stat.ATK, 6); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(dmgBefore).toBeLessThan(enemy.getAttackDamage(player, moveToCheck, false, false, false, false).damage); + }); + + it("should steal stat stages as a negative value with Contrary.", async () => { + game.override.ability(Abilities.CONTRARY); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 6); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(-6); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal double the stat stages with Simple.", async () => { + game.override.ability(Abilities.SIMPLE); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(6); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal the stat stages through Clear Body.", async () => { + game.override.enemyAbility(Abilities.CLEAR_BODY); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal the stat stages through White Smoke.", async () => { + game.override.enemyAbility(Abilities.WHITE_SMOKE); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal the stat stages through Hyper Cutter.", async () => { + game.override.enemyAbility(Abilities.HYPER_CUTTER); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should bypass Substitute.", async () => { + game.override.enemyMoveset(Moves.SUBSTITUTE); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp() - 1); + }); + + it("should get blocked by protect.", async () => { + game.override.enemyMoveset(Moves.PROTECT); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(0); + expect(enemy.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.hp).toBe(enemy.getMaxHp()); + }); +}); diff --git a/src/test/moves/speed_swap.test.ts b/test/moves/speed_swap.test.ts similarity index 90% rename from src/test/moves/speed_swap.test.ts rename to test/moves/speed_swap.test.ts index 179f1212394..a1385ce5386 100644 --- a/src/test/moves/speed_swap.test.ts +++ b/test/moves/speed_swap.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; @@ -29,14 +29,12 @@ describe("Moves - Speed Swap", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.MEW) .enemyLevel(200) - .moveset([ Moves.SPEED_SWAP ]) + .moveset([Moves.SPEED_SWAP]) .ability(Abilities.NONE); }); it("should swap the user's SPD and the target's SPD stats", async () => { - await game.startBattle([ - Species.INDEEDEE - ]); + await game.startBattle([Species.INDEEDEE]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/spikes.test.ts b/test/moves/spikes.test.ts similarity index 83% rename from src/test/moves/spikes.test.ts rename to test/moves/spikes.test.ts index 1dd13f8f65e..9bf0e5e1437 100644 --- a/src/test/moves/spikes.test.ts +++ b/test/moves/spikes.test.ts @@ -1,11 +1,10 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Spikes", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -28,11 +27,11 @@ describe("Moves - Spikes", () => { .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.SPIKES, Moves.SPLASH, Moves.ROAR ]); + .moveset([Moves.SPIKES, Moves.SPLASH, Moves.ROAR]); }); it("should not damage the team that set them", async () => { - await game.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); game.move.select(Moves.SPIKES); await game.toNextTurn(); @@ -46,13 +45,13 @@ describe("Moves - Spikes", () => { game.doSwitchPokemon(1); await game.toNextTurn(); - const player = game.scene.getParty()[0]; + const player = game.scene.getPlayerParty()[0]; expect(player.hp).toBe(player.getMaxHp()); }, 20000); it("should damage opposing pokemon that are forced to switch in", async () => { game.override.startingWave(5); - await game.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); game.move.select(Moves.SPIKES); await game.toNextTurn(); @@ -66,7 +65,7 @@ describe("Moves - Spikes", () => { it("should damage opposing pokemon that choose to switch in", async () => { game.override.startingWave(5); - await game.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); game.move.select(Moves.SPIKES); await game.toNextTurn(); @@ -78,5 +77,4 @@ describe("Moves - Spikes", () => { const enemy = game.scene.getEnemyParty()[0]; expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); }, 20000); - }); diff --git a/src/test/moves/spit_up.test.ts b/test/moves/spit_up.test.ts similarity index 86% rename from src/test/moves/spit_up.test.ts rename to test/moves/spit_up.test.ts index 8e418858e8d..d986ae4d141 100644 --- a/src/test/moves/spit_up.test.ts +++ b/test/moves/spit_up.test.ts @@ -1,9 +1,10 @@ import { Stat } from "#enums/stat"; import { StockpilingTag } from "#app/data/battler-tags"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { MoveResult, TurnMove } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import type { TurnMove } from "#app/field/pokemon"; +import { MoveResult } from "#app/field/pokemon"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -47,7 +48,7 @@ describe("Moves - Spit Up", () => { const stacksToSetup = 1; const expectedPower = 100; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -69,7 +70,7 @@ describe("Moves - Spit Up", () => { const stacksToSetup = 2; const expectedPower = 200; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -92,7 +93,7 @@ describe("Moves - Spit Up", () => { const stacksToSetup = 3; const expectedPower = 300; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -114,7 +115,7 @@ describe("Moves - Spit Up", () => { }); it("fails without stacks", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; @@ -124,14 +125,18 @@ describe("Moves - Spit Up", () => { game.move.select(Moves.SPIT_UP); await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.FAIL }); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SPIT_UP, + result: MoveResult.FAIL, + targets: [game.scene.getEnemyPokemon()!.getBattlerIndex()], + }); expect(spitUp.calculateBattlePower).not.toHaveBeenCalled(); }); describe("restores stat boosts granted by stacks", () => { it("decreases stats based on stored values (both boosts equal)", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -147,7 +152,11 @@ describe("Moves - Spit Up", () => { await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS }); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SPIT_UP, + result: MoveResult.SUCCESS, + targets: [game.scene.getEnemyPokemon()!.getBattlerIndex()], + }); expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); @@ -158,7 +167,7 @@ describe("Moves - Spit Up", () => { }); it("decreases stats based on stored values (different boosts)", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -175,7 +184,11 @@ describe("Moves - Spit Up", () => { game.move.select(Moves.SPIT_UP); await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS }); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SPIT_UP, + result: MoveResult.SUCCESS, + targets: [game.scene.getEnemyPokemon()!.getBattlerIndex()], + }); expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); diff --git a/test/moves/spotlight.test.ts b/test/moves/spotlight.test.ts new file mode 100644 index 00000000000..91705dbb2fa --- /dev/null +++ b/test/moves/spotlight.test.ts @@ -0,0 +1,67 @@ +import { BattlerIndex } from "#app/battle"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; + +describe("Moves - Spotlight", () => { + 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("double"); + game.override.starterSpecies(Species.AMOONGUSS); + game.override.enemySpecies(Species.SNORLAX); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK]); + game.override.enemyMoveset([Moves.FOLLOW_ME, Moves.SPLASH]); + }); + + test("move should redirect attacks to the target", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); + + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + + await game.phaseInterceptor.to(TurnEndPhase, false); + + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); + }); + + test("move should cause other redirection moves to fail", async () => { + await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]); + + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2); + + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.FOLLOW_ME); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp()); + expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); + }); +}); diff --git a/src/test/moves/steamroller.test.ts b/test/moves/steamroller.test.ts similarity index 75% rename from src/test/moves/steamroller.test.ts rename to test/moves/steamroller.test.ts index 9d16643ec5d..ba96928e01d 100644 --- a/src/test/moves/steamroller.test.ts +++ b/test/moves/steamroller.test.ts @@ -1,11 +1,11 @@ import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { DamageCalculationResult } from "#app/field/pokemon"; +import type { DamageCalculationResult } 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 GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -25,12 +25,12 @@ describe("Moves - Steamroller", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.moveset([ Moves.STEAMROLLER ]).battleType("single").enemyAbility(Abilities.BALL_FETCH); + game.override.moveset([Moves.STEAMROLLER]).battleType("single").enemyAbility(Abilities.BALL_FETCH); }); it("should always hit a minimzed target with double damage", async () => { game.override.enemySpecies(Species.DITTO).enemyMoveset(Moves.MINIMIZE); - await game.classicMode.startBattle([ Species.IRON_BOULDER ]); + await game.classicMode.startBattle([Species.IRON_BOULDER]); const ditto = game.scene.getEnemyPokemon()!; vi.spyOn(ditto, "getAttackDamage"); @@ -41,15 +41,15 @@ describe("Moves - Steamroller", () => { vi.spyOn(ironBoulder, "getAccuracyMultiplier"); // Turn 1 game.move.select(Moves.STEAMROLLER); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); // Turn 2 game.move.select(Moves.STEAMROLLER); await game.toNextTurn(); - const [ dmgCalcTurn1, dmgCalcTurn2 ]: DamageCalculationResult[] = vi + const [dmgCalcTurn1, dmgCalcTurn2]: DamageCalculationResult[] = vi .mocked(ditto.getAttackDamage) - .mock.results.map((r) => r.value); + .mock.results.map(r => r.value); expect(dmgCalcTurn2.damage).toBeGreaterThanOrEqual(dmgCalcTurn1.damage * 2); expect(ditto.getTag(BattlerTagType.MINIMIZED)).toBeDefined(); diff --git a/src/test/moves/stockpile.test.ts b/test/moves/stockpile.test.ts similarity index 86% rename from src/test/moves/stockpile.test.ts rename to test/moves/stockpile.test.ts index d3239856ed7..033f24d5229 100644 --- a/src/test/moves/stockpile.test.ts +++ b/test/moves/stockpile.test.ts @@ -1,12 +1,13 @@ import { Stat } from "#enums/stat"; import { StockpilingTag } from "#app/data/battler-tags"; -import { MoveResult, TurnMove } from "#app/field/pokemon"; +import type { TurnMove } from "#app/field/pokemon"; +import { MoveResult } from "#app/field/pokemon"; import { CommandPhase } from "#app/phases/command-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 GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -33,12 +34,12 @@ describe("Moves - Stockpile", () => { game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(2000); - game.override.moveset([ Moves.STOCKPILE, Moves.SPLASH ]); + game.override.moveset([Moves.STOCKPILE, Moves.SPLASH]); game.override.ability(Abilities.NONE); }); it("gains a stockpile stack and raises user's DEF and SPDEF stat stages by 1 on each use, fails at max stacks (3)", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const user = game.scene.getPlayerPokemon()!; @@ -60,24 +61,29 @@ describe("Moves - Stockpile", () => { const stockpilingTag = user.getTag(StockpilingTag)!; - if (i < 3) { // first three uses should behave normally + if (i < 3) { + // first three uses should behave normally expect(user.getStatStage(Stat.DEF)).toBe(i + 1); expect(user.getStatStage(Stat.SPDEF)).toBe(i + 1); expect(stockpilingTag).toBeDefined(); expect(stockpilingTag.stockpiledCount).toBe(i + 1); - - } else { // fourth should have failed + } else { + // fourth should have failed expect(user.getStatStage(Stat.DEF)).toBe(3); expect(user.getStatStage(Stat.SPDEF)).toBe(3); expect(stockpilingTag).toBeDefined(); expect(stockpilingTag.stockpiledCount).toBe(3); - expect(user.getMoveHistory().at(-1)).toMatchObject({ result: MoveResult.FAIL, move: Moves.STOCKPILE }); + expect(user.getMoveHistory().at(-1)).toMatchObject({ + result: MoveResult.FAIL, + move: Moves.STOCKPILE, + targets: [user.getBattlerIndex()], + }); } } }); it("gains a stockpile stack even if user's DEF and SPDEF stat stages are at +6", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const user = game.scene.getPlayerPokemon()!; diff --git a/test/moves/substitute.test.ts b/test/moves/substitute.test.ts new file mode 100644 index 00000000000..23f7f4af4b9 --- /dev/null +++ b/test/moves/substitute.test.ts @@ -0,0 +1,521 @@ +import { BattlerIndex } from "#app/battle"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { SubstituteTag, TrappedTag } from "#app/data/battler-tags"; +import { allMoves, StealHeldItemChanceAttr } from "#app/data/moves/move"; +import { MoveResult } from "#app/field/pokemon"; +import type { CommandPhase } from "#app/phases/command-phase"; +import GameManager from "#test/testUtils/gameManager"; +import { Command } from "#app/ui/command-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { BerryType } from "#enums/berry-type"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import { StatusEffect } from "#enums/status-effect"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Substitute", () => { + 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") + .moveset([Moves.SUBSTITUTE, Moves.SWORDS_DANCE, Moves.TACKLE, Moves.SPLASH]) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.INSOMNIA) + .enemyMoveset(Moves.SPLASH) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should cause the user to take damage", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SUBSTITUTE); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + expect(leadPokemon.hp).toBe(Math.ceil((leadPokemon.getMaxHp() * 3) / 4)); + }); + + it("should redirect enemy attack damage to the Substitute doll", async () => { + game.override.enemyMoveset(Moves.TACKLE); + + await game.classicMode.startBattle([Species.SKARMORY]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SUBSTITUTE); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + expect(leadPokemon.hp).toBe(Math.ceil((leadPokemon.getMaxHp() * 3) / 4)); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + const postSubHp = leadPokemon.hp; + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.hp).toBe(postSubHp); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + }); + + it("should fade after redirecting more damage than its remaining HP", async () => { + // Giga Impact OHKOs Magikarp if substitute isn't up + game.override.enemyMoveset(Moves.GIGA_IMPACT); + vi.spyOn(allMoves[Moves.GIGA_IMPACT], "accuracy", "get").mockReturnValue(100); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SUBSTITUTE); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + expect(leadPokemon.hp).toBe(Math.ceil((leadPokemon.getMaxHp() * 3) / 4)); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + const postSubHp = leadPokemon.hp; + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.hp).toBe(postSubHp); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeUndefined(); + }); + + it("should block stat changes from status moves", async () => { + game.override.enemyMoveset(Moves.CHARM); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SUBSTITUTE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + }); + + it("should be bypassed by sound-based moves", async () => { + game.override.enemyMoveset(Moves.ECHOED_VOICE); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SUBSTITUTE); + + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + const postSubHp = leadPokemon.hp; + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + expect(leadPokemon.hp).toBeLessThan(postSubHp); + }); + + it("should be bypassed by attackers with Infiltrator", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.enemyAbility(Abilities.INFILTRATOR); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SUBSTITUTE); + + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + const postSubHp = leadPokemon.hp; + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getTag(BattlerTagType.SUBSTITUTE)).toBeDefined(); + expect(leadPokemon.hp).toBeLessThan(postSubHp); + }); + + it("shouldn't block the user's own status moves", async () => { + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SUBSTITUTE); + + await game.phaseInterceptor.to("MoveEndPhase"); + await game.toNextTurn(); + + game.move.select(Moves.SWORDS_DANCE); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + }); + + it("shouldn't block moves that target the user's side of the field", async () => { + game.override.moveset(Moves.LIGHT_SCREEN); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(leadPokemon, "getMoveEffectiveness"); + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + game.move.select(Moves.LIGHT_SCREEN); + + await game.toNextTurn(); + + expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0); + expect(game.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.PLAYER)).toBeDefined(); + }); + + it("shouldn't block the opponent from setting hazards", async () => { + game.override.enemyMoveset(Moves.STEALTH_ROCK); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(leadPokemon, "getMoveEffectiveness"); + + game.move.select(Moves.SUBSTITUTE); + + await game.toNextTurn(); + + expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0); + expect(game.scene.arena.getTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER)).toBeDefined(); + }); + + it("shouldn't block moves that target both sides of the field", async () => { + game.override.moveset(Moves.TRICK_ROOM).enemyMoveset(Moves.GRAVITY); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const pokemon = game.scene.getField(true); + pokemon.forEach(p => { + vi.spyOn(p, "getMoveEffectiveness"); + p.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, p.id); + }); + + game.move.select(Moves.TRICK_ROOM); + + await game.toNextTurn(); + + pokemon.forEach(p => expect(p.getMoveEffectiveness).not.toHaveReturnedWith(0)); + expect(game.scene.arena.getTag(ArenaTagType.TRICK_ROOM)).toBeDefined(); + expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); + }); + + it("should protect the user from flinching", async () => { + game.override.enemyMoveset(Moves.FAKE_OUT); + game.override.startingLevel(1); // Ensures the Substitute will break + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); + + it("should protect the user from being trapped", async () => { + vi.spyOn(allMoves[Moves.SAND_TOMB], "accuracy", "get").mockReturnValue(100); + game.override.enemyMoveset(Moves.SAND_TOMB); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getTag(TrappedTag)).toBeUndefined(); + }); + + it("should prevent the user's stats from being lowered", async () => { + vi.spyOn(allMoves[Moves.LIQUIDATION], "chance", "get").mockReturnValue(100); + game.override.enemyMoveset(Moves.LIQUIDATION); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getStatStage(Stat.DEF)).toBe(0); + }); + + it("should protect the user from being afflicted with status effects", async () => { + game.override.enemyMoveset(Moves.NUZZLE); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.status?.effect).not.toBe(StatusEffect.PARALYSIS); + }); + + it("should prevent the user's items from being stolen", async () => { + game.override.enemyMoveset(Moves.THIEF); + vi.spyOn(allMoves[Moves.THIEF], "attrs", "get").mockReturnValue([new StealHeldItemChanceAttr(1.0)]); // give Thief 100% steal rate + game.override.startingHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getHeldItems().length).toBe(1); + }); + + it("should prevent the user's items from being removed", async () => { + game.override.moveset([Moves.KNOCK_OFF]); + game.override.enemyHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); + const enemyNumItems = enemyPokemon.getHeldItems().length; + + game.move.select(Moves.KNOCK_OFF); + + await game.phaseInterceptor.to("MoveEndPhase", false); + + expect(enemyPokemon.getHeldItems().length).toBe(enemyNumItems); + }); + + it("move effect should prevent the user's berries from being stolen and eaten", async () => { + game.override.enemyMoveset(Moves.BUG_BITE); + game.override.startingHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("MoveEndPhase", false); + const enemyPostAttackHp = enemyPokemon.hp; + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getHeldItems().length).toBe(1); + expect(enemyPokemon.hp).toBe(enemyPostAttackHp); + }); + + it("should prevent the user's stats from being reset by Clear Smog", async () => { + game.override.enemyMoveset(Moves.CLEAR_SMOG); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + game.move.select(Moves.SWORDS_DANCE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + }); + + it("should prevent the user from becoming confused", async () => { + game.override.enemyMoveset(Moves.MAGICAL_TORQUE); + vi.spyOn(allMoves[Moves.MAGICAL_TORQUE], "chance", "get").mockReturnValue(100); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + game.move.select(Moves.SWORDS_DANCE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(leadPokemon.getTag(BattlerTagType.CONFUSED)).toBeUndefined(); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2); + }); + + it("should transfer to the switched in Pokemon when the source uses Baton Pass", async () => { + game.override.moveset([Moves.SUBSTITUTE, Moves.BATON_PASS]); + + await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + + leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, leadPokemon.id); + + // Simulate a Baton switch for the player this turn + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, 1, true); + }); + + await game.phaseInterceptor.to("MovePhase", false); + + const switchedPokemon = game.scene.getPlayerPokemon()!; + const subTag = switchedPokemon.getTag(SubstituteTag)!; + expect(subTag).toBeDefined(); + expect(subTag.hp).toBe(Math.floor((leadPokemon.getMaxHp() * 1) / 4)); + }); + + it("should prevent the source's Rough Skin from activating when hit", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.ability(Abilities.ROUGH_SKIN); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SUBSTITUTE); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); + + it("should prevent the source's Focus Punch from failing when hit", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.moveset([Moves.FOCUS_PUNCH]); + + // Make Focus Punch 40 power to avoid a KO + vi.spyOn(allMoves[Moves.FOCUS_PUNCH], "calculateBattlePower").mockReturnValue(40); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + + game.move.select(Moves.FOCUS_PUNCH); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); + + it("should not allow Shell Trap to activate when attacked", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.moveset([Moves.SHELL_TRAP]); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + + game.move.select(Moves.SHELL_TRAP); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should not allow Beak Blast to burn opponents when hit", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.moveset([Moves.BEAK_BLAST]); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + + game.move.select(Moves.BEAK_BLAST); + + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); + }); + + it("should cause incoming attacks to not activate Counter", async () => { + game.override.enemyMoveset(Moves.TACKLE); + game.override.moveset([Moves.COUNTER]); + + await game.classicMode.startBattle([Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + + game.move.select(Moves.COUNTER); + + await game.phaseInterceptor.to("BerryPhase", false); + + expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); + + it("should prevent Sappy Seed from applying its Leech Seed effect to the user", async () => { + game.override.enemyMoveset(Moves.SAPPY_SEED); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, playerPokemon.id); + + game.move.select(Moves.SPLASH); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); // enemy uses Sappy Seed first + await game.move.forceHit(); // forces Sappy Seed to hit + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(playerPokemon.getTag(BattlerTagType.SEEDED)).toBeUndefined(); + }); +}); diff --git a/src/test/moves/swallow.test.ts b/test/moves/swallow.test.ts similarity index 86% rename from src/test/moves/swallow.test.ts rename to test/moves/swallow.test.ts index 2aee4d2604a..baa03801079 100644 --- a/src/test/moves/swallow.test.ts +++ b/test/moves/swallow.test.ts @@ -1,13 +1,14 @@ import { Stat } from "#enums/stat"; import { StockpilingTag } from "#app/data/battler-tags"; import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { MoveResult, TurnMove } from "#app/field/pokemon"; +import type { TurnMove } from "#app/field/pokemon"; +import { MoveResult } from "#app/field/pokemon"; import { MovePhase } from "#app/phases/move-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 GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -33,7 +34,7 @@ describe("Moves - Swallow", () => { game.override.enemyAbility(Abilities.NONE); game.override.enemyLevel(2000); - game.override.moveset([ Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW ]); + game.override.moveset([Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW]); game.override.ability(Abilities.NONE); }); @@ -42,7 +43,7 @@ describe("Moves - Swallow", () => { const stacksToSetup = 1; const expectedHeal = 25; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); @@ -69,7 +70,7 @@ describe("Moves - Swallow", () => { const stacksToSetup = 2; const expectedHeal = 50; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); @@ -97,7 +98,7 @@ describe("Moves - Swallow", () => { const stacksToSetup = 3; const expectedHeal = 100; - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); @@ -124,7 +125,7 @@ describe("Moves - Swallow", () => { }); it("fails without stacks", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; @@ -134,12 +135,16 @@ describe("Moves - Swallow", () => { game.move.select(Moves.SWALLOW); await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.FAIL }); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SWALLOW, + result: MoveResult.FAIL, + targets: [pokemon.getBattlerIndex()], + }); }); describe("restores stat stage boosts granted by stacks", () => { it("decreases stats based on stored values (both boosts equal)", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -155,7 +160,11 @@ describe("Moves - Swallow", () => { await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS }); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SWALLOW, + result: MoveResult.SUCCESS, + targets: [pokemon.getBattlerIndex()], + }); expect(pokemon.getStatStage(Stat.DEF)).toBe(0); expect(pokemon.getStatStage(Stat.SPDEF)).toBe(0); @@ -164,7 +173,7 @@ describe("Moves - Swallow", () => { }); it("lower stat stages based on stored values (different boosts)", async () => { - await game.startBattle([ Species.ABOMASNOW ]); + await game.startBattle([Species.ABOMASNOW]); const pokemon = game.scene.getPlayerPokemon()!; pokemon.addTag(BattlerTagType.STOCKPILING); @@ -182,7 +191,11 @@ describe("Moves - Swallow", () => { await game.phaseInterceptor.to(TurnInitPhase); - expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS }); + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ + move: Moves.SWALLOW, + result: MoveResult.SUCCESS, + targets: [pokemon.getBattlerIndex()], + }); expect(pokemon.getStatStage(Stat.DEF)).toBe(1); expect(pokemon.getStatStage(Stat.SPDEF)).toBe(-2); diff --git a/test/moves/syrup_bomb.test.ts b/test/moves/syrup_bomb.test.ts new file mode 100644 index 00000000000..1e193793d82 --- /dev/null +++ b/test/moves/syrup_bomb.test.ts @@ -0,0 +1,92 @@ +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { BattlerIndex } from "#app/battle"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - SYRUP BOMB", () => { + 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") + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.BALL_FETCH) + .startingLevel(30) + .enemyLevel(100) + .moveset([Moves.SYRUP_BOMB, Moves.SPLASH]) + .enemyMoveset(Moves.SPLASH); + }); + + //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/syrup_bomb_(move) + + it("decreases the target Pokemon's speed stat once per turn for 3 turns", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + const targetPokemon = game.scene.getEnemyPokemon()!; + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.SYRUP_BOMB); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.toNextTurn(); + expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeDefined(); + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-1); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeDefined(); + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-2); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeUndefined(); + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(-3); + }); + + it("does not affect Pokemon with the ability Bulletproof", async () => { + game.override.enemyAbility(Abilities.BULLETPROOF); + await game.classicMode.startBattle([Species.MAGIKARP]); + + const targetPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SYRUP_BOMB); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.toNextTurn(); + expect(targetPokemon.isFullHp()).toBe(true); + expect(targetPokemon.getTag(BattlerTagType.SYRUP_BOMB)).toBeUndefined(); + expect(targetPokemon.getStatStage(Stat.SPD)).toBe(0); + }); + + it("stops lowering the target's speed if the user leaves the field", async () => { + await game.classicMode.startBattle([Species.FEEBAS, Species.MILOTIC]); + + game.move.select(Moves.SYRUP_BOMB); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceHit(); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPD)).toBe(-1); + }); +}); diff --git a/src/test/moves/tackle.test.ts b/test/moves/tackle.test.ts similarity index 83% rename from src/test/moves/tackle.test.ts rename to test/moves/tackle.test.ts index 5d5ff1a366d..44fc698ec62 100644 --- a/src/test/moves/tackle.test.ts +++ b/test/moves/tackle.test.ts @@ -3,11 +3,10 @@ import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Tackle", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -29,17 +28,15 @@ describe("Moves - Tackle", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.startingLevel(1); game.override.startingWave(97); - game.override.moveset([ moveToUse ]); - game.override.enemyMoveset([ Moves.GROWTH, Moves.GROWTH, Moves.GROWTH, Moves.GROWTH ]); + game.override.moveset([moveToUse]); + game.override.enemyMoveset([Moves.GROWTH, Moves.GROWTH, Moves.GROWTH, Moves.GROWTH]); game.override.disableCrits(); }); it("TACKLE against ghost", async () => { const moveToUse = Moves.TACKLE; game.override.enemySpecies(Species.GENGAR); - await game.startBattle([ - Species.MIGHTYENA, - ]); + await game.startBattle([Species.MIGHTYENA]); const hpOpponent = game.scene.currentBattle.enemyParty[0].hp; game.move.select(moveToUse); await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnEndPhase); @@ -49,12 +46,9 @@ describe("Moves - Tackle", () => { it("TACKLE against not resistant", async () => { const moveToUse = Moves.TACKLE; - await game.startBattle([ - Species.MIGHTYENA, - ]); + await game.startBattle([Species.MIGHTYENA]); game.scene.currentBattle.enemyParty[0].stats[Stat.DEF] = 50; - game.scene.getParty()[0].stats[Stat.ATK] = 50; - + game.scene.getPlayerParty()[0].stats[Stat.ATK] = 50; const hpOpponent = game.scene.currentBattle.enemyParty[0].hp; diff --git a/src/test/moves/tail_whip.test.ts b/test/moves/tail_whip.test.ts similarity index 85% rename from src/test/moves/tail_whip.test.ts rename to test/moves/tail_whip.test.ts index 5c83feb8a4e..41c39ab22ca 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/test/moves/tail_whip.test.ts @@ -1,5 +1,5 @@ import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -8,7 +8,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; - describe("Moves - Tail whip", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -31,16 +30,13 @@ describe("Moves - Tail whip", () => { game.override.enemyAbility(Abilities.INSOMNIA); game.override.ability(Abilities.INSOMNIA); game.override.startingLevel(2000); - game.override.moveset([ moveToUse ]); + game.override.moveset([moveToUse]); game.override.enemyMoveset(Moves.SPLASH); }); - it("should lower DEF stat stage by 1", async() => { + it("should lower DEF stat stage by 1", async () => { const moveToUse = Moves.TAIL_WHIP; - await game.startBattle([ - Species.MIGHTYENA, - Species.MIGHTYENA, - ]); + await game.startBattle([Species.MIGHTYENA, Species.MIGHTYENA]); const enemyPokemon = game.scene.getEnemyPokemon()!; expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); diff --git a/src/test/moves/tailwind.test.ts b/test/moves/tailwind.test.ts similarity index 91% rename from src/test/moves/tailwind.test.ts rename to test/moves/tailwind.test.ts index a26dde82824..24a7fa25061 100644 --- a/src/test/moves/tailwind.test.ts +++ b/test/moves/tailwind.test.ts @@ -4,7 +4,7 @@ import { ArenaTagType } from "#app/enums/arena-tag-type"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -25,12 +25,12 @@ describe("Moves - Tailwind", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override.battleType("double"); - game.override.moveset([ Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM ]); + game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); game.override.enemyMoveset(Moves.SPLASH); }); it("doubles the Speed stat of the Pokemons on its side", async () => { - await game.startBattle([ Species.MAGIKARP, Species.MEOWTH ]); + await game.startBattle([Species.MAGIKARP, Species.MEOWTH]); const magikarp = game.scene.getPlayerField()[0]; const meowth = game.scene.getPlayerField()[1]; @@ -53,7 +53,7 @@ describe("Moves - Tailwind", () => { it("lasts for 4 turns", async () => { game.override.battleType("single"); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); game.move.select(Moves.TAILWIND); await game.toNextTurn(); @@ -76,7 +76,7 @@ describe("Moves - Tailwind", () => { it("does not affect the opposing side", async () => { game.override.battleType("single"); - await game.startBattle([ Species.MAGIKARP ]); + await game.startBattle([Species.MAGIKARP]); const ally = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -84,7 +84,6 @@ describe("Moves - Tailwind", () => { const allySpd = ally.getStat(Stat.SPD); const enemySpd = enemy.getStat(Stat.SPD); - expect(ally.getEffectiveStat(Stat.SPD)).equal(allySpd); expect(enemy.getEffectiveStat(Stat.SPD)).equal(enemySpd); expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined(); diff --git a/src/test/moves/tar_shot.test.ts b/test/moves/tar_shot.test.ts similarity index 79% rename from src/test/moves/tar_shot.test.ts rename to test/moves/tar_shot.test.ts index 4734da366e4..ac3ba534446 100644 --- a/src/test/moves/tar_shot.test.ts +++ b/test/moves/tar_shot.test.ts @@ -1,10 +1,10 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,12 +29,12 @@ describe("Moves - Tar Shot", () => { .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.TANGELA) .enemyLevel(1000) - .moveset([ Moves.TAR_SHOT, Moves.FIRE_PUNCH ]) + .moveset([Moves.TAR_SHOT, Moves.FIRE_PUNCH]) .disableCrits(); }); it("lowers the target's Speed stat by one stage and doubles the effectiveness of Fire-type moves used on the target", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const enemy = game.scene.getEnemyPokemon()!; @@ -48,14 +48,14 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); game.move.select(Moves.FIRE_PUNCH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); }); it("will not double the effectiveness of Fire-type moves used on a target that is already under the effect of Tar Shot (but may still lower its Speed)", async () => { - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const enemy = game.scene.getEnemyPokemon()!; @@ -76,17 +76,19 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); game.move.select(Moves.FIRE_PUNCH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); }); it("does not double the effectiveness of Fire-type moves against a Pokémon that is Terastallized", async () => { - game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]).enemySpecies(Species.SPRIGATITO); - await game.classicMode.startBattle([ Species.PIKACHU ]); + game.override.enemySpecies(Species.SPRIGATITO); + await game.classicMode.startBattle([Species.PIKACHU]); const enemy = game.scene.getEnemyPokemon()!; + enemy.teraType = PokemonType.GRASS; + enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); @@ -98,7 +100,7 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); game.move.select(Moves.FIRE_PUNCH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); @@ -106,7 +108,7 @@ describe("Moves - Tar Shot", () => { it("doubles the effectiveness of Fire-type moves against a Pokémon that is already under the effects of Tar Shot before it Terastallized", async () => { game.override.enemySpecies(Species.SPRIGATITO); - await game.classicMode.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([Species.PIKACHU]); const enemy = game.scene.getEnemyPokemon()!; @@ -119,10 +121,11 @@ describe("Moves - Tar Shot", () => { await game.toNextTurn(); - game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]); + enemy.teraType = PokemonType.GRASS; + enemy.isTerastallized = true; game.move.select(Moves.FIRE_PUNCH); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); diff --git a/src/test/moves/taunt.test.ts b/test/moves/taunt.test.ts similarity index 88% rename from src/test/moves/taunt.test.ts rename to test/moves/taunt.test.ts index a425a048a2c..adc1434c7dd 100644 --- a/src/test/moves/taunt.test.ts +++ b/test/moves/taunt.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveResult } from "#app/field/pokemon"; @@ -25,13 +25,13 @@ describe("Moves - Taunt", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.TAUNT, Moves.SPLASH ]) + .enemyMoveset([Moves.TAUNT, Moves.SPLASH]) .enemySpecies(Species.SHUCKLE) - .moveset([ Moves.GROWL ]); + .moveset([Moves.GROWL]); }); it("Pokemon should not be able to use Status Moves", async () => { - await game.classicMode.startBattle([ Species.REGIELEKI ]); + await game.classicMode.startBattle([Species.REGIELEKI]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/src/test/moves/telekinesis.test.ts b/test/moves/telekinesis.test.ts similarity index 78% rename from src/test/moves/telekinesis.test.ts rename to test/moves/telekinesis.test.ts index 76c0d001f00..1355cb975f3 100644 --- a/src/test/moves/telekinesis.test.ts +++ b/test/moves/telekinesis.test.ts @@ -1,12 +1,13 @@ import { BattlerTagType } from "#enums/battler-tag-type"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { MoveResult } from "#app/field/pokemon"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; +import { BattlerIndex } from "#app/battle"; describe("Moves - Telekinesis", () => { let phaserGame: Phaser.Game; @@ -25,16 +26,16 @@ describe("Moves - Telekinesis", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TELEKINESIS, Moves.TACKLE, Moves.MUD_SHOT, Moves.SMACK_DOWN ]) + .moveset([Moves.TELEKINESIS, Moves.TACKLE, Moves.MUD_SHOT, Moves.SMACK_DOWN]) .battleType("single") .enemySpecies(Species.SNORLAX) .enemyLevel(60) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.SPLASH ]); + .enemyMoveset([Moves.SPLASH]); }); it("Telekinesis makes the affected vulnerable to most attacking moves regardless of accuracy", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -51,7 +52,7 @@ describe("Moves - Telekinesis", () => { }); it("Telekinesis makes the affected airborne and immune to most Ground-moves", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -69,7 +70,7 @@ describe("Moves - Telekinesis", () => { it("Telekinesis can still affect Pokemon that have been transformed into invalid Pokemon", async () => { game.override.enemyMoveset(Moves.TRANSFORM); - await game.classicMode.startBattle([ Species.DIGLETT ]); + await game.classicMode.startBattle([Species.DIGLETT]); const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -81,7 +82,7 @@ describe("Moves - Telekinesis", () => { }); it("Moves like Smack Down and 1000 Arrows remove all effects of Telekinesis from the target Pokemon", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -98,8 +99,8 @@ describe("Moves - Telekinesis", () => { }); it("Ingrain will remove the floating effect of Telekinesis, but not the 100% hit", async () => { - game.override.enemyMoveset([ Moves.SPLASH, Moves.INGRAIN ]); - await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.enemyMoveset([Moves.SPLASH, Moves.INGRAIN]); + await game.classicMode.startBattle([Species.MAGIKARP]); const playerPokemon = game.scene.getPlayerPokemon()!; const enemyOpponent = game.scene.getEnemyPokemon()!; @@ -121,4 +122,18 @@ describe("Moves - Telekinesis", () => { expect(enemyOpponent.getTag(BattlerTagType.FLOATING)).toBeUndefined(); expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); }); + + it("should not be baton passed onto a mega gengar", async () => { + game.override + .moveset([Moves.BATON_PASS]) + .enemyMoveset([Moves.TELEKINESIS]) + .starterForms({ [Species.GENGAR]: 1 }); + + await game.classicMode.startBattle([Species.MAGIKARP, Species.GENGAR]); + game.move.select(Moves.BATON_PASS); + game.doSelectPartyPokemon(1); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getTag(BattlerTagType.TELEKINESIS)).toBeUndefined(); + }); }); diff --git a/test/moves/tera_blast.test.ts b/test/moves/tera_blast.test.ts new file mode 100644 index 00000000000..dffe39f4d87 --- /dev/null +++ b/test/moves/tera_blast.test.ts @@ -0,0 +1,190 @@ +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#enums/stat"; +import { allMoves, TeraMoveCategoryAttr } from "#app/data/moves/move"; +import { PokemonType } from "#enums/pokemon-type"; +import { Abilities } from "#app/enums/abilities"; +import { HitResult } from "#app/field/pokemon"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Tera Blast", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const moveToCheck = allMoves[Moves.TERA_BLAST]; + const teraBlastAttr = moveToCheck.getAttrs(TeraMoveCategoryAttr)[0]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .battleType("single") + .disableCrits() + .starterSpecies(Species.FEEBAS) + .moveset([Moves.TERA_BLAST]) + .ability(Abilities.BALL_FETCH) + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.STURDY) + .enemyLevel(50); + + vi.spyOn(moveToCheck, "calculateBattlePower"); + }); + + it("changes type to match user's tera type", async () => { + game.override.enemySpecies(Species.FURRET); + await game.startBattle(); + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = PokemonType.FIGHTING; + playerPokemon.isTerastallized = true; + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); + }, 20000); + + it("increases power if user is Stellar tera type", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = PokemonType.STELLAR; + playerPokemon.isTerastallized = true; + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(100); + }, 20000); + + it("is super effective against terastallized targets if user is Stellar tera type", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = PokemonType.STELLAR; + playerPokemon.isTerastallized = true; + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "apply"); + enemyPokemon.isTerastallized = true; + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); + }); + + it("uses the higher ATK for damage calculation", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 100; + playerPokemon.stats[Stat.SPATK] = 1; + playerPokemon.isTerastallized = true; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(true); + }); + + it("uses the higher SPATK for damage calculation", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 1; + playerPokemon.stats[Stat.SPATK] = 100; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("should stay as a special move if ATK turns lower than SPATK mid-turn", async () => { + game.override.enemyMoveset([Moves.CHARM]); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 51; + playerPokemon.stats[Stat.SPATK] = 50; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("does not change its move category from stat changes due to held items", async () => { + game.override + .startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]) + .starterSpecies(Species.CUBONE); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + playerPokemon.stats[Stat.ATK] = 50; + playerPokemon.stats[Stat.SPATK] = 51; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("does not change its move category from stat changes due to abilities", async () => { + game.override.ability(Abilities.HUGE_POWER); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 50; + playerPokemon.stats[Stat.SPATK] = 51; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("causes stat drops if user is Stellar tera type", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.teraType = PokemonType.STELLAR; + playerPokemon.isTerastallized = true; + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.phaseInterceptor.to("MoveEndPhase"); + + expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1); + expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1); + }, 20000); +}); diff --git a/src/test/moves/tera_starstorm.test.ts b/test/moves/tera_starstorm.test.ts similarity index 73% rename from src/test/moves/tera_starstorm.test.ts rename to test/moves/tera_starstorm.test.ts index f0759dd242d..19fe58f4057 100644 --- a/src/test/moves/tera_starstorm.test.ts +++ b/test/moves/tera_starstorm.test.ts @@ -1,9 +1,9 @@ import { BattlerIndex } from "#app/battle"; -import { Type } from "#app/data/type"; +import { PokemonType } from "#enums/pokemon-type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; @@ -24,37 +24,39 @@ describe("Moves - Tera Starstorm", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TERA_STARSTORM, Moves.SPLASH ]) + .moveset([Moves.TERA_STARSTORM, Moves.SPLASH]) .battleType("double") .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .enemyLevel(30) - .enemySpecies(Species.MAGIKARP) - .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]); + .enemySpecies(Species.MAGIKARP); }); it("changes type to Stellar when used by Terapagos in its Stellar Form", async () => { game.override.battleType("single"); - await game.classicMode.startBattle([ Species.TERAPAGOS ]); + await game.classicMode.startBattle([Species.TERAPAGOS]); const terapagos = game.scene.getPlayerPokemon()!; + terapagos.isTerastallized = true; vi.spyOn(terapagos, "getMoveType"); game.move.select(Moves.TERA_STARSTORM); await game.phaseInterceptor.to("TurnEndPhase"); - expect(terapagos.isTerastallized()).toBe(true); - expect(terapagos.getMoveType).toHaveReturnedWith(Type.STELLAR); + expect(terapagos.getMoveType).toHaveReturnedWith(PokemonType.STELLAR); }); it("targets both opponents in a double battle when used by Terapagos in its Stellar Form", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP, Species.TERAPAGOS ]); + await game.classicMode.startBattle([Species.MAGIKARP, Species.TERAPAGOS]); + + const terapagos = game.scene.getPlayerParty()[1]; + terapagos.isTerastallized = true; game.move.select(Moves.TERA_STARSTORM, 0, BattlerIndex.ENEMY); game.move.select(Moves.TERA_STARSTORM, 1); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); const enemyField = game.scene.getEnemyField(); @@ -68,10 +70,10 @@ describe("Moves - Tera Starstorm", () => { }); it("applies the effects when Terapagos in Stellar Form is fused with another Pokemon", async () => { - await game.classicMode.startBattle([ Species.TERAPAGOS, Species.CHARMANDER, Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.TERAPAGOS, Species.CHARMANDER, Species.MAGIKARP]); - const fusionedMon = game.scene.getParty()[0]; - const magikarp = game.scene.getParty()[2]; + const fusionedMon = game.scene.getPlayerParty()[0]; + const magikarp = game.scene.getPlayerParty()[2]; // Fuse party members (taken from PlayerPokemon.fuse(...) function) fusionedMon.fusionSpecies = magikarp.species; @@ -82,6 +84,8 @@ describe("Moves - Tera Starstorm", () => { fusionedMon.fusionGender = magikarp.gender; fusionedMon.fusionLuck = magikarp.luck; + fusionedMon.isTerastallized = true; + vi.spyOn(fusionedMon, "getMoveType"); game.move.select(Moves.TERA_STARSTORM, 0); @@ -90,9 +94,8 @@ describe("Moves - Tera Starstorm", () => { // Fusion and terastallized expect(fusionedMon.isFusion()).toBe(true); - expect(fusionedMon.isTerastallized()).toBe(true); // Move effects should be applied - expect(fusionedMon.getMoveType).toHaveReturnedWith(Type.STELLAR); + expect(fusionedMon.getMoveType).toHaveReturnedWith(PokemonType.STELLAR); expect(game.scene.getEnemyField().every(pokemon => pokemon.isFullHp())).toBe(false); }); }); diff --git a/test/moves/thousand_arrows.test.ts b/test/moves/thousand_arrows.test.ts new file mode 100644 index 00000000000..109fc2c6936 --- /dev/null +++ b/test/moves/thousand_arrows.test.ts @@ -0,0 +1,89 @@ +import { Abilities } from "#app/enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Thousand Arrows", () => { + 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.TOGETIC); + game.override.startingLevel(100); + game.override.enemyLevel(100); + game.override.moveset([Moves.THOUSAND_ARROWS]); + game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("move should hit and ground Flying-type targets", async () => { + await game.startBattle([Species.ILLUMISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THOUSAND_ARROWS); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); + + it("move should hit and ground targets with Levitate", async () => { + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.LEVITATE); + + await game.startBattle([Species.ILLUMISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.THOUSAND_ARROWS); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); + + it("move should hit and ground targets under the effects of Magnet Rise", async () => { + game.override.enemySpecies(Species.SNORLAX); + + await game.startBattle([Species.ILLUMISE]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + enemyPokemon.addTag(BattlerTagType.FLOATING, undefined, Moves.MAGNET_RISE); + + game.move.select(Moves.THOUSAND_ARROWS); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.FLOATING)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + }); +}); diff --git a/src/test/moves/throat_chop.test.ts b/test/moves/throat_chop.test.ts similarity index 84% rename from src/test/moves/throat_chop.test.ts rename to test/moves/throat_chop.test.ts index 24293f8d086..755e60fe425 100644 --- a/src/test/moves/throat_chop.test.ts +++ b/test/moves/throat_chop.test.ts @@ -3,7 +3,7 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; @@ -32,12 +32,12 @@ describe("Moves - Throat Chop", () => { }); it("prevents the target from using sound-based moves for two turns", async () => { - await game.classicMode.startBattle([ Species.MAGIKARP ]); + await game.classicMode.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.GROWL); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); // First turn, move is interrupted await game.phaseInterceptor.to("TurnEndPhase"); @@ -47,7 +47,7 @@ describe("Moves - Throat Chop", () => { await game.toNextTurn(); game.move.select(Moves.GROWL); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); expect(enemy.isFullHp()).toBe(false); diff --git a/src/test/moves/thunder_wave.test.ts b/test/moves/thunder_wave.test.ts similarity index 92% rename from src/test/moves/thunder_wave.test.ts rename to test/moves/thunder_wave.test.ts index 03e9ebb94f3..9f907e38b62 100644 --- a/src/test/moves/thunder_wave.test.ts +++ b/test/moves/thunder_wave.test.ts @@ -1,13 +1,12 @@ -import { StatusEffect } from "#app/data/status-effect"; -import { Abilities } from "#app/enums/abilities"; -import { EnemyPokemon } from "#app/field/pokemon"; +import type { EnemyPokemon } 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 { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("Moves - Thunder Wave", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,7 +26,7 @@ describe("Moves - Thunder Wave", () => { game.override .battleType("single") .starterSpecies(Species.PIKACHU) - .moveset([ Moves.THUNDER_WAVE ]) + .moveset([Moves.THUNDER_WAVE]) .enemyMoveset(Moves.SPLASH); }); diff --git a/src/test/moves/tidy_up.test.ts b/test/moves/tidy_up.test.ts similarity index 76% rename from src/test/moves/tidy_up.test.ts rename to test/moves/tidy_up.test.ts index 255967b40ac..9d98feb13f5 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/test/moves/tidy_up.test.ts @@ -5,12 +5,11 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { SubstituteTag } from "#app/data/battler-tags"; - describe("Moves - Tidy Up", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -33,13 +32,13 @@ describe("Moves - Tidy Up", () => { game.override.enemyMoveset(Moves.SPLASH); game.override.starterSpecies(Species.FEEBAS); game.override.ability(Abilities.BALL_FETCH); - game.override.moveset([ Moves.TIDY_UP ]); + game.override.moveset([Moves.TIDY_UP]); game.override.startingLevel(50); }); it("spikes are cleared", async () => { - game.override.moveset([ Moves.SPIKES, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES ]); + game.override.moveset([Moves.SPIKES, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); await game.classicMode.startBattle(); game.move.select(Moves.SPIKES); @@ -47,12 +46,11 @@ describe("Moves - Tidy Up", () => { game.move.select(Moves.TIDY_UP); await game.phaseInterceptor.to(MoveEndPhase); expect(game.scene.arena.getTag(ArenaTagType.SPIKES)).toBeUndefined(); - }, 20000); it("stealth rocks are cleared", async () => { - game.override.moveset([ Moves.STEALTH_ROCK, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK ]); + game.override.moveset([Moves.STEALTH_ROCK, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); await game.classicMode.startBattle(); game.move.select(Moves.STEALTH_ROCK); @@ -63,8 +61,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it("toxic spikes are cleared", async () => { - game.override.moveset([ Moves.TOXIC_SPIKES, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES ]); + game.override.moveset([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); await game.classicMode.startBattle(); game.move.select(Moves.TOXIC_SPIKES); @@ -75,8 +73,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it("sticky webs are cleared", async () => { - game.override.moveset([ Moves.STICKY_WEB, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB ]); + game.override.moveset([Moves.STICKY_WEB, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); await game.classicMode.startBattle(); @@ -88,8 +86,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it("substitutes are cleared", async () => { - game.override.moveset([ Moves.SUBSTITUTE, Moves.TIDY_UP ]); - game.override.enemyMoveset([ Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE ]); + game.override.moveset([Moves.SUBSTITUTE, Moves.TIDY_UP]); + game.override.enemyMoveset([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); await game.classicMode.startBattle(); @@ -98,7 +96,7 @@ describe("Moves - Tidy Up", () => { game.move.select(Moves.TIDY_UP); await game.phaseInterceptor.to(MoveEndPhase); - const pokemon = [ game.scene.getPlayerPokemon()!, game.scene.getEnemyPokemon()! ]; + const pokemon = [game.scene.getPlayerPokemon()!, game.scene.getEnemyPokemon()!]; pokemon.forEach(p => { expect(p).toBeDefined(); expect(p!.getTag(SubstituteTag)).toBeUndefined(); diff --git a/src/test/moves/torment.test.ts b/test/moves/torment.test.ts similarity index 90% rename from src/test/moves/torment.test.ts rename to test/moves/torment.test.ts index b4c9a059db1..75143053321 100644 --- a/src/test/moves/torment.test.ts +++ b/test/moves/torment.test.ts @@ -1,7 +1,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { MoveResult } from "#app/field/pokemon"; @@ -26,15 +26,15 @@ describe("Moves - Torment", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset([ Moves.TORMENT, Moves.SPLASH ]) + .enemyMoveset([Moves.TORMENT, Moves.SPLASH]) .enemySpecies(Species.SHUCKLE) .enemyLevel(30) - .moveset([ Moves.TACKLE ]) + .moveset([Moves.TACKLE]) .ability(Abilities.BALL_FETCH); }); it("Pokemon should not be able to use the same move consecutively", async () => { - await game.classicMode.startBattle([ Species.CHANSEY ]); + await game.classicMode.startBattle([Species.CHANSEY]); const playerPokemon = game.scene.getPlayerPokemon()!; diff --git a/src/test/moves/toxic.test.ts b/test/moves/toxic.test.ts similarity index 75% rename from src/test/moves/toxic.test.ts rename to test/moves/toxic.test.ts index b146134ae51..f2b1f82fe02 100644 --- a/src/test/moves/toxic.test.ts +++ b/test/moves/toxic.test.ts @@ -1,11 +1,11 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { StatusEffect } from "#enums/status-effect"; import { BattlerIndex } from "#app/battle"; -import { allMoves } from "#app/data/move"; +import { allMoves } from "#app/data/moves/move"; describe("Moves - Toxic", () => { let phaserGame: Phaser.Game; @@ -23,16 +23,12 @@ describe("Moves - Toxic", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override - .battleType("single") - .moveset(Moves.TOXIC) - .enemySpecies(Species.MAGIKARP) - .enemyMoveset(Moves.SPLASH); + game.override.battleType("single").moveset(Moves.TOXIC).enemySpecies(Species.MAGIKARP).enemyMoveset(Moves.SPLASH); }); it("should be guaranteed to hit if user is Poison-type", async () => { vi.spyOn(allMoves[Moves.TOXIC], "accuracy", "get").mockReturnValue(0); - await game.classicMode.startBattle([ Species.TOXAPEX ]); + await game.classicMode.startBattle([Species.TOXAPEX]); game.move.select(Moves.TOXIC); await game.phaseInterceptor.to("BerryPhase", false); @@ -42,7 +38,7 @@ describe("Moves - Toxic", () => { it("may miss if user is not Poison-type", async () => { vi.spyOn(allMoves[Moves.TOXIC], "accuracy", "get").mockReturnValue(0); - await game.classicMode.startBattle([ Species.UMBREON ]); + await game.classicMode.startBattle([Species.UMBREON]); game.move.select(Moves.TOXIC); await game.phaseInterceptor.to("BerryPhase", false); @@ -53,10 +49,10 @@ describe("Moves - Toxic", () => { it("should hit semi-invulnerable targets if user is Poison-type", async () => { vi.spyOn(allMoves[Moves.TOXIC], "accuracy", "get").mockReturnValue(0); game.override.enemyMoveset(Moves.FLY); - await game.classicMode.startBattle([ Species.TOXAPEX ]); + await game.classicMode.startBattle([Species.TOXAPEX]); game.move.select(Moves.TOXIC); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.TOXIC); @@ -65,10 +61,10 @@ describe("Moves - Toxic", () => { it("should miss semi-invulnerable targets if user is not Poison-type", async () => { vi.spyOn(allMoves[Moves.TOXIC], "accuracy", "get").mockReturnValue(-1); game.override.enemyMoveset(Moves.FLY); - await game.classicMode.startBattle([ Species.UMBREON ]); + await game.classicMode.startBattle([Species.UMBREON]); game.move.select(Moves.TOXIC); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); expect(game.scene.getEnemyPokemon()!.status).toBeUndefined(); @@ -77,10 +73,10 @@ describe("Moves - Toxic", () => { it("moves other than Toxic should not hit semi-invulnerable targets even if user is Poison-type", async () => { game.override.moveset(Moves.SWIFT); game.override.enemyMoveset(Moves.FLY); - await game.classicMode.startBattle([ Species.TOXAPEX ]); + await game.classicMode.startBattle([Species.TOXAPEX]); game.move.select(Moves.SWIFT); - await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/toxic_spikes.test.ts b/test/moves/toxic_spikes.test.ts similarity index 75% rename from src/test/moves/toxic_spikes.test.ts rename to test/moves/toxic_spikes.test.ts index a5c63a2652f..d457ec5cb56 100644 --- a/src/test/moves/toxic_spikes.test.ts +++ b/test/moves/toxic_spikes.test.ts @@ -1,11 +1,13 @@ -import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; -import { StatusEffect } from "#app/data/status-effect"; -import { decrypt, encrypt, GameData, SessionSaveData } from "#app/system/game-data"; +import type { ArenaTrapTag } from "#app/data/arena-tag"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import type { SessionSaveData } from "#app/system/game-data"; +import { decrypt, encrypt, GameData } from "#app/system/game-data"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -32,11 +34,11 @@ describe("Moves - Toxic Spikes", () => { .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.TOXIC_SPIKES, Moves.SPLASH, Moves.ROAR, Moves.COURT_CHANGE ]); + .moveset([Moves.TOXIC_SPIKES, Moves.SPLASH, Moves.ROAR, Moves.COURT_CHANGE]); }); it("should not affect the opponent if they do not switch", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); const enemy = game.scene.getEnemyField()[0]; @@ -52,7 +54,7 @@ describe("Moves - Toxic Spikes", () => { }); it("should poison the opponent if they switch into 1 layer", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA]); game.move.select(Moves.TOXIC_SPIKES); await game.phaseInterceptor.to("TurnEndPhase"); @@ -66,7 +68,7 @@ describe("Moves - Toxic Spikes", () => { }); it("should badly poison the opponent if they switch into 2 layers", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA]); game.move.select(Moves.TOXIC_SPIKES); await game.phaseInterceptor.to("TurnEndPhase"); @@ -81,7 +83,7 @@ describe("Moves - Toxic Spikes", () => { }); it("should be removed if a grounded poison pokemon switches in", async () => { - await game.classicMode.runToSummon([ Species.MUK, Species.PIDGEY ]); + await game.classicMode.runToSummon([Species.MUK, Species.PIDGEY]); const muk = game.scene.getPlayerPokemon()!; @@ -104,22 +106,21 @@ describe("Moves - Toxic Spikes", () => { }); it("shouldn't create multiple layers per use in doubles", async () => { - await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); game.move.select(Moves.TOXIC_SPIKES); await game.phaseInterceptor.to("TurnEndPhase"); - const arenaTags = (game.scene.arena.getTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag); + const arenaTags = game.scene.arena.getTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; expect(arenaTags.tagType).toBe(ArenaTagType.TOXIC_SPIKES); expect(arenaTags.layers).toBe(1); }); it("should persist through reload", async () => { game.override.startingWave(1); - const scene = game.scene; - const gameData = new GameData(scene); + const gameData = new GameData(); - await game.classicMode.runToSummon([ Species.MIGHTYENA ]); + await game.classicMode.runToSummon([Species.MIGHTYENA]); game.move.select(Moves.TOXIC_SPIKES); await game.phaseInterceptor.to("TurnEndPhase"); @@ -128,10 +129,12 @@ describe("Moves - Toxic Spikes", () => { await game.phaseInterceptor.to("BattleEndPhase"); await game.toNextWave(); - const sessionData : SessionSaveData = gameData["getSessionSaveData"](game.scene); + const sessionData: SessionSaveData = gameData["getSessionSaveData"](); localStorage.setItem("sessionTestData", encrypt(JSON.stringify(sessionData), true)); - const recoveredData : SessionSaveData = gameData.parseSessionData(decrypt(localStorage.getItem("sessionTestData")!, true)); - gameData.loadSession(game.scene, 0, recoveredData); + const recoveredData: SessionSaveData = gameData.parseSessionData( + decrypt(localStorage.getItem("sessionTestData")!, true), + ); + await gameData.loadSession(0, recoveredData); expect(sessionData.arena.tags).toEqual(recoveredData.arena.tags); localStorage.removeItem("sessionTestData"); diff --git a/src/test/moves/transform.test.ts b/test/moves/transform.test.ts similarity index 71% rename from src/test/moves/transform.test.ts rename to test/moves/transform.test.ts index 8c0f5eda7b2..5140202a383 100644 --- a/src/test/moves/transform.test.ts +++ b/test/moves/transform.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { Species } from "#enums/species"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; @@ -32,11 +32,11 @@ describe("Moves - Transform", () => { .enemyPassiveAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .ability(Abilities.INTIMIDATE) - .moveset([ Moves.TRANSFORM ]); + .moveset([Moves.TRANSFORM]); }); it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => { - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); game.move.select(Moves.TRANSFORM); await game.phaseInterceptor.to(TurnEndPhase); @@ -60,23 +60,24 @@ describe("Moves - Transform", () => { const playerMoveset = player.getMoveset(); const enemyMoveset = player.getMoveset(); + expect(playerMoveset.length).toBe(enemyMoveset.length); for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) { - // TODO: Checks for 5 PP should be done here when that gets addressed expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId); } const playerTypes = player.getTypes(); const enemyTypes = enemy.getTypes(); + expect(playerTypes.length).toBe(enemyTypes.length); for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) { expect(playerTypes[i]).toBe(enemyTypes[i]); } - }, 20000); + }); it("should copy in-battle overridden stats", async () => { - game.override.enemyMoveset([ Moves.POWER_SPLIT ]); + game.override.enemyMoveset([Moves.POWER_SPLIT]); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -94,17 +95,36 @@ describe("Moves - Transform", () => { expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk); }); - it ("should set each move's pp to a maximum of 5", async () => { - game.override.enemyMoveset([ Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER ]); + it("should set each move's pp to a maximum of 5", async () => { + game.override.enemyMoveset([Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER]); - await game.classicMode.startBattle([ Species.DITTO ]); + await game.classicMode.startBattle([Species.DITTO]); const player = game.scene.getPlayerPokemon()!; game.move.select(Moves.TRANSFORM); await game.phaseInterceptor.to(TurnEndPhase); player.getMoveset().forEach(move => { - expect(move!.getMovePp()).toBeLessThanOrEqual(5); + // Should set correct maximum PP without touching `ppUp` + if (move) { + if (move.moveId === Moves.SKETCH) { + expect(move.getMovePp()).toBe(1); + } else { + expect(move.getMovePp()).toBe(5); + } + expect(move.ppUp).toBe(0); + } }); }); + + it("should activate its ability if it copies one that activates on summon", async () => { + game.override.enemyAbility(Abilities.INTIMIDATE).ability(Abilities.BALL_FETCH); + + await game.classicMode.startBattle([Species.DITTO]); + game.move.select(Moves.TRANSFORM); + + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + }); }); diff --git a/test/moves/trick_or_treat.test.ts b/test/moves/trick_or_treat.test.ts new file mode 100644 index 00000000000..108028f3008 --- /dev/null +++ b/test/moves/trick_or_treat.test.ts @@ -0,0 +1,47 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { PokemonType } from "#enums/pokemon-type"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Trick Or Treat", () => { + 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.FORESTS_CURSE, Moves.TRICK_OR_TREAT]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("will replace added type from Forest's Curse", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + game.move.select(Moves.FORESTS_CURSE); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemyPokemon!.summonData.addedType).toBe(PokemonType.GRASS); + + game.move.select(Moves.TRICK_OR_TREAT); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemyPokemon?.summonData.addedType).toBe(PokemonType.GHOST); + }); +}); diff --git a/src/test/moves/triple_arrows.test.ts b/test/moves/triple_arrows.test.ts similarity index 88% rename from src/test/moves/triple_arrows.test.ts rename to test/moves/triple_arrows.test.ts index 98ad29997df..c1114b69b99 100644 --- a/src/test/moves/triple_arrows.test.ts +++ b/test/moves/triple_arrows.test.ts @@ -1,8 +1,8 @@ -import { allMoves, FlinchAttr, StatStageChangeAttr } from "#app/data/move"; +import { allMoves, FlinchAttr, StatStageChangeAttr } from "#app/data/moves/move"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -27,7 +27,7 @@ describe("Moves - Triple Arrows", () => { game = new GameManager(phaserGame); game.override .ability(Abilities.BALL_FETCH) - .moveset([ Moves.TRIPLE_ARROWS ]) + .moveset([Moves.TRIPLE_ARROWS]) .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.STURDY) @@ -38,7 +38,7 @@ describe("Moves - Triple Arrows", () => { }); it("has a 30% flinch chance and 50% defense drop chance", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.TRIPLE_ARROWS); await game.phaseInterceptor.to("BerryPhase"); @@ -49,7 +49,7 @@ describe("Moves - Triple Arrows", () => { it("is affected normally by Serene Grace", async () => { game.override.ability(Abilities.SERENE_GRACE); - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); game.move.select(Moves.TRIPLE_ARROWS); await game.phaseInterceptor.to("BerryPhase"); diff --git a/src/test/moves/u_turn.test.ts b/test/moves/u_turn.test.ts similarity index 76% rename from src/test/moves/u_turn.test.ts rename to test/moves/u_turn.test.ts index b995c20f503..f1d212f3f47 100644 --- a/src/test/moves/u_turn.test.ts +++ b/test/moves/u_turn.test.ts @@ -1,10 +1,8 @@ -import { Abilities } from "#app/enums/abilities"; -import { StatusEffect } from "#app/enums/status-effect"; -import { SwitchPhase } from "#app/phases/switch-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import GameManager from "#app/test/utils/gameManager"; +import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,7 +27,7 @@ describe("Moves - U-turn", () => { .enemySpecies(Species.GENGAR) .startingLevel(90) .startingWave(97) - .moveset([ Moves.U_TURN ]) + .moveset([Moves.U_TURN]) .enemyMoveset(Moves.SPLASH) .disableCrits(); }); @@ -38,19 +36,18 @@ describe("Moves - U-turn", () => { // arrange const playerHp = 1; game.override.ability(Abilities.REGENERATOR); - await game.startBattle([ - Species.RAICHU, - Species.SHUCKLE - ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); game.scene.getPlayerPokemon()!.hp = playerHp; // act game.move.select(Moves.U_TURN); game.doSelectPartyPokemon(1); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); // assert - expect(game.scene.getParty()[1].hp).toEqual(Math.floor(game.scene.getParty()[1].getMaxHp() * 0.33 + playerHp)); + expect(game.scene.getPlayerParty()[1].hp).toEqual( + Math.floor(game.scene.getPlayerParty()[1].getMaxHp() * 0.33 + playerHp), + ); expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.SHUCKLE); }, 20000); @@ -58,15 +55,12 @@ describe("Moves - U-turn", () => { it("triggers rough skin on the u-turn user before a new pokemon is switched in", async () => { // arrange game.override.enemyAbility(Abilities.ROUGH_SKIN); - await game.startBattle([ - Species.RAICHU, - Species.SHUCKLE - ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); // act game.move.select(Moves.U_TURN); game.doSelectPartyPokemon(1); - await game.phaseInterceptor.to(SwitchPhase, false); + await game.phaseInterceptor.to("SwitchPhase", false); // assert const playerPkm = game.scene.getPlayerPokemon()!; @@ -79,15 +73,12 @@ describe("Moves - U-turn", () => { it("triggers contact abilities on the u-turn user (eg poison point) before a new pokemon is switched in", async () => { // arrange game.override.enemyAbility(Abilities.POISON_POINT); - await game.startBattle([ - Species.RAICHU, - Species.SHUCKLE - ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); vi.spyOn(game.scene.getEnemyPokemon()!, "randSeedInt").mockReturnValue(0); // act game.move.select(Moves.U_TURN); - await game.phaseInterceptor.to(SwitchPhase, false); + await game.phaseInterceptor.to("SwitchPhase", false); // assert const playerPkm = game.scene.getPlayerPokemon()!; @@ -99,16 +90,13 @@ describe("Moves - U-turn", () => { it("still forces a switch if u-turn KO's the opponent", async () => { game.override.startingLevel(1000); // Ensure that U-Turn KO's the opponent - await game.classicMode.startBattle([ - Species.RAICHU, - Species.SHUCKLE - ]); + await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]); const enemy = game.scene.getEnemyPokemon()!; // KO the opponent with U-Turn game.move.select(Moves.U_TURN); game.doSelectPartyPokemon(1); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(enemy.isFainted()).toBe(true); // Check that U-Turn forced a switch diff --git a/test/moves/upper_hand.test.ts b/test/moves/upper_hand.test.ts new file mode 100644 index 00000000000..ecfd9f0735c --- /dev/null +++ b/test/moves/upper_hand.test.ts @@ -0,0 +1,99 @@ +import { BattlerIndex } from "#app/battle"; +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/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Upper Hand", () => { + 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.UPPER_HAND) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.QUICK_ATTACK) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should flinch the opponent before they use a priority attack", async () => { + await game.classicMode.startBattle([Species.FEEBAS]); + + const feebas = game.scene.getPlayerPokemon()!; + const magikarp = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.UPPER_HAND); + await game.phaseInterceptor.to("BerryPhase"); + + expect(feebas.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(magikarp.isFullHp()).toBeFalsy(); + expect(feebas.isFullHp()).toBeTruthy(); + }); + + it.each([ + { descriptor: "non-priority attack", move: Moves.TACKLE }, + { descriptor: "status move", move: Moves.BABY_DOLL_EYES }, + ])("should fail when the opponent selects a $descriptor", async ({ move }) => { + game.override.enemyMoveset(move); + + await game.classicMode.startBattle([Species.FEEBAS]); + + const feebas = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.UPPER_HAND); + await game.phaseInterceptor.to("BerryPhase"); + + expect(feebas.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should flinch the opponent before they use an attack boosted by Gale Wings", async () => { + game.override.enemyAbility(Abilities.GALE_WINGS).enemyMoveset(Moves.GUST); + + await game.classicMode.startBattle([Species.FEEBAS]); + + const feebas = game.scene.getPlayerPokemon()!; + const magikarp = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.UPPER_HAND); + await game.phaseInterceptor.to("BerryPhase"); + + expect(feebas.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(magikarp.isFullHp()).toBeFalsy(); + expect(feebas.isFullHp()).toBeTruthy(); + }); + + it("should fail if the target has already moved", async () => { + game.override.enemyMoveset(Moves.FAKE_OUT).enemyAbility(Abilities.SHEER_FORCE); + + await game.classicMode.startBattle([Species.FEEBAS]); + + const feebas = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.UPPER_HAND); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(feebas.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(feebas.isFullHp()).toBeFalsy(); + }); +}); diff --git a/test/moves/whirlwind.test.ts b/test/moves/whirlwind.test.ts new file mode 100644 index 00000000000..d6124b6c766 --- /dev/null +++ b/test/moves/whirlwind.test.ts @@ -0,0 +1,159 @@ +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Challenges } from "#enums/challenges"; +import { PokemonType } from "#enums/pokemon-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/testUtils/gameManager"; +import Phaser from "phaser"; +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; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .moveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.SPLASH, Moves.WHIRLWIND]) + .enemySpecies(Species.PIDGEY); + }); + + it.each([ + { move: Moves.FLY, name: "Fly" }, + { move: Moves.BOUNCE, name: "Bounce" }, + { move: Moves.SKY_DROP, name: "Sky Drop" }, + ])("should not hit a flying target: $name (=$move)", async ({ move }) => { + game.override.moveset([move]); + await game.classicMode.startBattle([Species.STARAPTOR]); + + 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 = 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 = 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, PokemonType.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 = 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 = 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 = 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/test/moves/wide_guard.test.ts b/test/moves/wide_guard.test.ts new file mode 100644 index 00000000000..c466f104f67 --- /dev/null +++ b/test/moves/wide_guard.test.ts @@ -0,0 +1,111 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Stat } from "#enums/stat"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { CommandPhase } from "#app/phases/command-phase"; + +describe("Moves - Wide Guard", () => { + 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("double"); + + game.override.moveset([Moves.WIDE_GUARD, Moves.SPLASH, Moves.SURF]); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyMoveset([Moves.SWIFT]); + game.override.enemyAbility(Abilities.INSOMNIA); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + + test("should protect the user and allies from multi-target attack moves", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.WIDE_GUARD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + }); + + test("should protect the user and allies from multi-target status moves", async () => { + game.override.enemyMoveset([Moves.GROWL]); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.WIDE_GUARD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }); + + test("should not protect the user and allies from single-target moves", async () => { + game.override.enemyMoveset([Moves.TACKLE]); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.WIDE_GUARD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); + }); + + test("should protect the user from its ally's multi-target move", async () => { + game.override.enemyMoveset([Moves.SPLASH]); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerField(); + const enemyPokemon = game.scene.getEnemyField(); + + game.move.select(Moves.WIDE_GUARD); + + await game.phaseInterceptor.to(CommandPhase); + + game.move.select(Moves.SURF, 1); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon[0].hp).toBe(leadPokemon[0].getMaxHp()); + enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); + }); +}); diff --git a/src/test/moves/will_o_wisp.test.ts b/test/moves/will_o_wisp.test.ts similarity index 84% rename from src/test/moves/will_o_wisp.test.ts rename to test/moves/will_o_wisp.test.ts index 39729d331ad..0d19fec954c 100644 --- a/src/test/moves/will_o_wisp.test.ts +++ b/test/moves/will_o_wisp.test.ts @@ -3,7 +3,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -24,7 +24,7 @@ describe("Moves - Will-O-Wisp", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.WILL_O_WISP, Moves.SPLASH ]) + .moveset([Moves.WILL_O_WISP, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) .battleType("single") .disableCrits() @@ -34,12 +34,12 @@ describe("Moves - Will-O-Wisp", () => { }); it("should burn the opponent", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + await game.classicMode.startBattle([Species.FEEBAS]); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.WILL_O_WISP); - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.move.forceHit(); await game.toNextTurn(); diff --git a/src/test/mystery-encounter/encounter-test-utils.ts b/test/mystery-encounter/encounter-test-utils.ts similarity index 63% rename from src/test/mystery-encounter/encounter-test-utils.ts rename to test/mystery-encounter/encounter-test-utils.ts index f95a442d4c2..19ec364618e 100644 --- a/src/test/mystery-encounter/encounter-test-utils.ts +++ b/test/mystery-encounter/encounter-test-utils.ts @@ -1,18 +1,24 @@ -import { Button } from "#app/enums/buttons"; -import { MysteryEncounterBattlePhase, MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; -import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; -import { Mode } from "#app/ui/ui"; -import GameManager from "../utils/gameManager"; -import MessageUiHandler from "#app/ui/message-ui-handler"; -import { Status, StatusEffect } from "#app/data/status-effect"; -import { expect, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import PartyUiHandler from "#app/ui/party-ui-handler"; -import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; -import { isNullOrUndefined } from "#app/utils"; +import { Status } from "#app/data/status-effect"; import { CommandPhase } from "#app/phases/command-phase"; -import { VictoryPhase } from "#app/phases/victory-phase"; import { MessagePhase } from "#app/phases/message-phase"; +import { + MysteryEncounterBattlePhase, + MysteryEncounterOptionSelectedPhase, + MysteryEncounterPhase, + MysteryEncounterRewardsPhase, +} from "#app/phases/mystery-encounter-phases"; +import { VictoryPhase } from "#app/phases/victory-phase"; +import type MessageUiHandler from "#app/ui/message-ui-handler"; +import type MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; +import type PartyUiHandler from "#app/ui/party-ui-handler"; +import type OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { isNullOrUndefined } from "#app/utils"; +import { Button } from "#enums/buttons"; +import { StatusEffect } from "#enums/status-effect"; +import type GameManager from "#test/testUtils/gameManager"; +import { expect, vi } from "vitest"; /** * Runs a {@linkcode MysteryEncounter} to either the start of a battle, or to the {@linkcode MysteryEncounterRewardsPhase}, depending on the option selected @@ -21,37 +27,62 @@ import { MessagePhase } from "#app/phases/message-phase"; * @param secondaryOptionSelect * @param isBattle If selecting option should lead to battle, set to `true` */ -export async function runMysteryEncounterToEnd(game: GameManager, optionNo: number, secondaryOptionSelect?: { pokemonNo: number, optionNo?: number }, isBattle: boolean = false) { +export async function runMysteryEncounterToEnd( + game: GameManager, + optionNo: number, + secondaryOptionSelect?: { pokemonNo: number; optionNo?: number }, + isBattle = false, +) { vi.spyOn(EncounterPhaseUtils, "selectPokemonForOption"); await runSelectMysteryEncounterOption(game, optionNo, secondaryOptionSelect); // run the selected options phase - game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }, () => game.isCurrentPhase(MysteryEncounterBattlePhase) || game.isCurrentPhase(MysteryEncounterRewardsPhase)); + game.onNextPrompt( + "MysteryEncounterOptionSelectedPhase", + Mode.MESSAGE, + () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase(MysteryEncounterBattlePhase) || game.isCurrentPhase(MysteryEncounterRewardsPhase), + ); if (isBattle) { - game.onNextPrompt("DamagePhase", Mode.MESSAGE, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase)); + game.onNextPrompt( + "DamageAnimPhase", + Mode.MESSAGE, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase), + ); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase)); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase), + ); - game.onNextPrompt("CheckSwitchPhase", Mode.MESSAGE, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase)); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.MESSAGE, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase), + ); // If a battle is started, fast forward to end of the battle game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { game.scene.clearPhaseQueue(); game.scene.clearPhaseQueueSplice(); - game.scene.unshiftPhase(new VictoryPhase(game.scene, 0)); + game.scene.unshiftPhase(new VictoryPhase(0)); game.endPhase(); }); @@ -73,22 +104,36 @@ export async function runMysteryEncounterToEnd(game: GameManager, optionNo: numb } } -export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, secondaryOptionSelect?: { pokemonNo: number, optionNo?: number }) { +export async function runSelectMysteryEncounterOption( + game: GameManager, + optionNo: number, + secondaryOptionSelect?: { pokemonNo: number; optionNo?: number }, +) { // Handle any eventual queued messages (e.g. weather phase, etc.) - game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }, () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase)); + game.onNextPrompt( + "MessagePhase", + Mode.MESSAGE, + () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase), + ); if (game.isCurrentPhase(MessagePhase)) { await game.phaseInterceptor.run(MessagePhase); } // dispose of intro messages - game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }, () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase)); + game.onNextPrompt( + "MysteryEncounterPhase", + Mode.MESSAGE, + () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }, + () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase), + ); await game.phaseInterceptor.to(MysteryEncounterPhase, true); @@ -97,10 +142,6 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.unblockInput(); // input are blocked by 1s to prevent accidental input. Tests need to handle that switch (optionNo) { - default: - case 1: - // no movement needed. Default cursor position - break; case 2: uiHandler.processInput(Button.RIGHT); break; @@ -111,6 +152,9 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.processInput(Button.RIGHT); uiHandler.processInput(Button.DOWN); break; + default: + // no movement needed. Default cursor position + break; } if (!isNullOrUndefined(secondaryOptionSelect?.pokemonNo)) { @@ -161,7 +205,7 @@ async function handleSecondaryOptionSelect(game: GameManager, pokemonNo: number, * @param game * @param runRewardsPhase */ -export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManager, runRewardsPhase: boolean = true) { +export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManager, runRewardsPhase = true) { game.scene.clearPhaseQueue(); game.scene.clearPhaseQueueSplice(); game.scene.getEnemyParty().forEach(p => { @@ -169,7 +213,7 @@ export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManage p.status = new Status(StatusEffect.FAINT); game.scene.field.remove(p); }); - game.scene.pushPhase(new VictoryPhase(game.scene, 0)); + game.scene.pushPhase(new VictoryPhase(0)); game.phaseInterceptor.superEndPhase(); game.setMode(Mode.MESSAGE); await game.phaseInterceptor.to(MysteryEncounterRewardsPhase, runRewardsPhase); diff --git a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts similarity index 88% rename from src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts rename to test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts index 7d783958422..43d582c5b70 100644 --- a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts +++ b/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts @@ -3,14 +3,17 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; +import type 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 { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; import { EggTier } from "#enums/egg-type"; import { CommandPhase } from "#app/phases/command-phase"; @@ -19,7 +22,7 @@ import { PartyHealPhase } from "#app/phases/party-heal-phase"; import i18next from "i18next"; const namespace = "mysteryEncounters/aTrainersTest"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -41,10 +44,10 @@ describe("A Trainer's Test - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.A_TRAINERS_TEST ]); + biomeMap.set(biome, [MysteryEncounterType.A_TRAINERS_TEST]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -78,8 +81,8 @@ describe("A Trainer's Test - Mystery Encounter", () => { expect(ATrainersTestEncounter.onInit).toBeDefined(); - ATrainersTestEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + ATrainersTestEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(ATrainersTestEncounter.dialogueTokens?.statTrainerName).toBeDefined(); expect(ATrainersTestEncounter.misc.trainerType).toBeDefined(); @@ -107,8 +110,17 @@ describe("A Trainer's Test - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(scene.currentBattle.trainer).toBeDefined(); - expect([ i18next.t("trainerNames:buck"), i18next.t("trainerNames:cheryl"), i18next.t("trainerNames:marley"), i18next.t("trainerNames:mira"), i18next.t("trainerNames:riley") ] - .map(name => name.toLowerCase()).includes(scene.currentBattle.trainer!.config.name)).toBeTruthy(); + expect( + [ + i18next.t("trainerNames:buck"), + i18next.t("trainerNames:cheryl"), + i18next.t("trainerNames:marley"), + i18next.t("trainerNames:mira"), + i18next.t("trainerNames:riley"), + ] + .map(name => name.toLowerCase()) + .includes(scene.currentBattle.trainer!.config.name), + ).toBeTruthy(); expect(enemyField[0]).toBeDefined(); }); @@ -138,7 +150,7 @@ describe("A Trainer's Test - Mystery Encounter", () => { vi.spyOn(scene, "playSoundWithoutBgm").mockImplementation(() => { return { totalDuration: 1, - destroy: () => null + destroy: () => null, } as any; }); }); diff --git a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts similarity index 82% rename from src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts rename to test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts index a72a9fbb5a3..3e1588f3a72 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -1,11 +1,14 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; +import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; @@ -19,7 +22,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import i18next from "i18next"; const namespace = "mysteryEncounters/absoluteAvarice"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.PLAINS; const defaultWave = 45; @@ -42,9 +45,9 @@ describe("Absolute Avarice - Mystery Encounter", () => { vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.PLAINS, [ MysteryEncounterType.ABSOLUTE_AVARICE ]], - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.PLAINS, [MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -85,7 +88,10 @@ describe("Absolute Avarice - Mystery Encounter", () => { it("should spawn if player has enough berries", async () => { game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); - game.override.startingHeldItems([{ name: "BERRY", count: 2, type: BerryType.SITRUS }, { name: "BERRY", count: 3, type: BerryType.GANLON }]); + game.override.startingHeldItems([ + { name: "BERRY", count: 2, type: BerryType.SITRUS }, + { name: "BERRY", count: 3, type: BerryType.GANLON }, + ]); await game.runToMysteryEncounter(); @@ -93,7 +99,10 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("should remove all player's berries at the start of the encounter", async () => { - game.override.startingHeldItems([{ name: "BERRY", count: 2, type: BerryType.SITRUS }, { name: "BERRY", count: 3, type: BerryType.GANLON }]); + game.override.startingHeldItems([ + { name: "BERRY", count: 2, type: BerryType.SITRUS }, + { name: "BERRY", count: 3, type: BerryType.GANLON }, + ]); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); @@ -129,7 +138,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(Species.GREEDENT); const moveset = enemyField[0].moveset.map(m => m?.moveId); expect(moveset?.length).toBe(4); - expect(moveset).toEqual([ Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.CRUNCH ]); + expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.CRUNCH]); const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); expect(movePhases.length).toBe(1); @@ -143,11 +152,15 @@ describe("Absolute Avarice - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); - for (const partyPokemon of scene.getParty()) { + for (const partyPokemon of scene.getPlayerParty()) { const pokemonId = partyPokemon.id; - const pokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === pokemonId, true) as PokemonHeldItemModifier[]; - const revSeed = pokemonItems.find(i => i.type.name === i18next.t("modifierType:ModifierType.REVIVER_SEED.name")); + const pokemonItems = scene.findModifiers( + m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId, + true, + ) as PokemonHeldItemModifier[]; + const revSeed = pokemonItems.find( + i => i.type.name === i18next.t("modifierType:ModifierType.REVIVER_SEED.name"), + ); expect(revSeed).toBeDefined; expect(revSeed?.stackCount).toBe(1); } @@ -171,7 +184,11 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("Should return 3 (2/5ths floored) berries if 8 were stolen", { retry: 5 }, async () => { - game.override.startingHeldItems([{ name: "BERRY", count: 2, type: BerryType.SITRUS }, { name: "BERRY", count: 3, type: BerryType.GANLON }, { name: "BERRY", count: 3, type: BerryType.APICOT }]); + game.override.startingHeldItems([ + { name: "BERRY", count: 2, type: BerryType.SITRUS }, + { name: "BERRY", count: 3, type: BerryType.GANLON }, + { name: "BERRY", count: 3, type: BerryType.APICOT }, + ]); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); @@ -187,7 +204,11 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("Should return 2 (2/5ths floored) berries if 7 were stolen", { retry: 5 }, async () => { - game.override.startingHeldItems([{ name: "BERRY", count: 2, type: BerryType.SITRUS }, { name: "BERRY", count: 3, type: BerryType.GANLON }, { name: "BERRY", count: 2, type: BerryType.APICOT }]); + game.override.startingHeldItems([ + { name: "BERRY", count: 2, type: BerryType.SITRUS }, + { name: "BERRY", count: 3, type: BerryType.GANLON }, + { name: "BERRY", count: 2, type: BerryType.APICOT }, + ]); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); @@ -230,17 +251,17 @@ describe("Absolute Avarice - Mystery Encounter", () => { it("should add Greedent to the party", async () => { await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); - const partyCountBefore = scene.getParty().length; + const partyCountBefore = scene.getPlayerParty().length; await runMysteryEncounterToEnd(game, 3); - const partyCountAfter = scene.getParty().length; + const partyCountAfter = scene.getPlayerParty().length; expect(partyCountBefore + 1).toBe(partyCountAfter); - const greedent = scene.getParty()[scene.getParty().length - 1]; + const greedent = scene.getPlayerParty()[scene.getPlayerParty().length - 1]; expect(greedent.species.speciesId).toBe(Species.GREEDENT); const moveset = greedent.moveset.map(m => m?.moveId); expect(moveset?.length).toBe(4); - expect(moveset).toEqual([ Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF ]); + expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF]); }); it("should leave encounter without battle", async () => { diff --git a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts similarity index 84% rename from src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts rename to test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts index 0585b4ce72b..3c7bda8febd 100644 --- a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts +++ b/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts @@ -3,16 +3,16 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { AnOfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Moves } from "#enums/moves"; import { ShinyRateBoosterModifier } from "#app/modifier/modifier"; @@ -22,7 +22,7 @@ import { Abilities } from "#enums/abilities"; const namespace = "mysteryEncounters/anOfferYouCantRefuse"; /** Gyarados for Indimidate */ -const defaultParty = [ Species.GYARADOS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.GYARADOS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -38,17 +38,18 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); scene = game.scene; - game.override.mysteryEncounterChance(100) + game.override + .mysteryEncounterChance(100) .startingWave(defaultWave) .startingBiome(defaultBiome) .disableTrainerWaves() .ability(Abilities.INTIMIDATE); // Extortion ability const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE ]); + biomeMap.set(biome, [MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -67,10 +68,12 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { expect(AnOfferYouCantRefuseEncounter.dialogue).toBeDefined(); expect(AnOfferYouCantRefuseEncounter.dialogue.intro).toStrictEqual([ { text: `${namespace}:intro` }, - { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` } + { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` }, ]); expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(AnOfferYouCantRefuseEncounter.options.length).toBe(3); }); @@ -80,7 +83,9 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe( + MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, + ); }); it("should initialize fully ", async () => { @@ -91,15 +96,19 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { expect(AnOfferYouCantRefuseEncounter.onInit).toBeDefined(); - AnOfferYouCantRefuseEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + AnOfferYouCantRefuseEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.strongestPokemon).toBeDefined(); expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.price).toBeDefined(); - expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.option2PrimaryAbility).toBe(i18next.t("ability:intimidate.name")); + expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.option2PrimaryAbility).toBe( + i18next.t("ability:intimidate.name"), + ); expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.moveOrAbility).toBe(i18next.t("ability:intimidate.name")); expect(AnOfferYouCantRefuseEncounter.misc.pokemon instanceof PlayerPokemon).toBeTruthy(); - expect(AnOfferYouCantRefuseEncounter.misc?.price?.toString()).toBe(AnOfferYouCantRefuseEncounter.dialogueTokens?.price); + expect(AnOfferYouCantRefuseEncounter.misc?.price?.toString()).toBe( + AnOfferYouCantRefuseEncounter.dialogueTokens?.price, + ); expect(onInitResult).toBe(true); }); @@ -130,7 +139,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { const price = scene.currentBattle.mysteryEncounter!.misc.price; - expect(updateMoneySpy).toHaveBeenCalledWith(scene, price); + expect(updateMoneySpy).toHaveBeenCalledWith(price); expect(scene.money).toBe(initialMoney + price); }); @@ -147,13 +156,13 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { it("Should remove the Pokemon from the party", async () => { await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); - const initialPartySize = scene.getParty().length; + const initialPartySize = scene.getPlayerParty().length; const pokemonName = scene.currentBattle.mysteryEncounter!.misc.pokemon.name; await runMysteryEncounterToEnd(game, 1); - expect(scene.getParty().length).toBe(initialPartySize - 1); - expect(scene.getParty().find(p => p.name === pokemonName)).toBeUndefined(); + expect(scene.getPlayerParty().length).toBe(initialPartySize - 1); + expect(scene.getPlayerParty().find(p => p.name === pokemonName)).toBeUndefined(); }); it("should leave encounter without battle", async () => { @@ -186,28 +195,30 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { it("should award EXP to a pokemon with an ability in EXTORTION_ABILITIES", async () => { await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); - const party = scene.getParty(); - const gyarados = party.find((pkm) => pkm.species.speciesId === Species.GYARADOS)!; + const party = scene.getPlayerParty(); + const gyarados = party.find(pkm => pkm.species.speciesId === Species.GYARADOS)!; const expBefore = gyarados.exp; await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(gyarados.exp).toBe(expBefore + Math.floor(getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave / 5 + 1)); + expect(gyarados.exp).toBe( + expBefore + Math.floor((getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave) / 5 + 1), + ); }); it("should award EXP to a pokemon with a move in EXTORTION_MOVES", async () => { game.override.ability(Abilities.SYNCHRONIZE); // Not an extortion ability, so we can test extortion move - await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, [ Species.ABRA ]); - const party = scene.getParty(); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA)!; - abra.moveset = [ new PokemonMove(Moves.BEAT_UP) ]; + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, [Species.ABRA]); + const party = scene.getPlayerParty(); + const abra = party.find(pkm => pkm.species.speciesId === Species.ABRA)!; + abra.moveset = [new PokemonMove(Moves.BEAT_UP)]; const expBefore = abra.exp; await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(abra.exp).toBe(expBefore + Math.floor(getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave / 5 + 1)); + expect(abra.exp).toBe(expBefore + Math.floor((getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave) / 5 + 1)); }); it("Should update the player's money properly", async () => { @@ -220,7 +231,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { const price = scene.currentBattle.mysteryEncounter!.misc.price; - expect(updateMoneySpy).toHaveBeenCalledWith(scene, price); + expect(updateMoneySpy).toHaveBeenCalledWith(price); expect(scene.money).toBe(initialMoney + price); }); diff --git a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts similarity index 87% rename from src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts rename to test/mystery-encounter/encounters/berries-abound-encounter.test.ts index bfa3d428bc0..e19726f49fd 100644 --- a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -2,16 +2,19 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; +import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { BerryModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import * as EncounterDialogueUtils from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -20,7 +23,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { Abilities } from "#enums/abilities"; const namespace = "mysteryEncounters/berriesAbound"; -const defaultParty = [ Species.PYUKUMUKU, Species.MAGIKARP, Species.PIKACHU ]; +const defaultParty = [Species.PYUKUMUKU, Species.MAGIKARP, Species.PIKACHU]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -36,7 +39,8 @@ describe("Berries Abound - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); scene = game.scene; - game.override.mysteryEncounterChance(100) + game.override + .mysteryEncounterChance(100) .mysteryEncounterTier(MysteryEncounterTier.COMMON) .startingWave(defaultWave) .startingBiome(defaultBiome) @@ -47,9 +51,7 @@ describe("Berries Abound - Mystery Encounter", () => { .enemyPassiveAbility(Abilities.BALL_FETCH); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.BERRIES_ABOUND ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.BERRIES_ABOUND]]]), ); }); @@ -80,8 +82,8 @@ describe("Berries Abound - Mystery Encounter", () => { expect(BerriesAboundEncounter.onInit).toBeDefined(); - BerriesAboundEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + BerriesAboundEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); const config = BerriesAboundEncounter.enemyPartyConfigs[0]; expect(config).toBeDefined(); @@ -152,7 +154,9 @@ describe("Berries Abound - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); for (const option of modifierSelectHandler.options) { expect(option.modifierTypeOption.type.id).toContain("BERRY"); @@ -176,7 +180,7 @@ describe("Berries Abound - Mystery Encounter", () => { const encounterTextSpy = vi.spyOn(EncounterDialogueUtils, "showEncounterText"); await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); - scene.getParty().forEach(pkm => { + scene.getPlayerParty().forEach(pkm => { vi.spyOn(pkm, "getStat").mockReturnValue(1); // for ease return for every stat }); @@ -191,8 +195,8 @@ describe("Berries Abound - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); // Should be enraged - expect(enemyField[0].summonData.statStages).toEqual([ 0, 1, 0, 1, 1, 0, 0 ]); - expect(encounterTextSpy).toHaveBeenCalledWith(expect.any(BattleScene), `${namespace}:option.2.selected_bad`); + expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 1, 0, 0]); + expect(encounterTextSpy).toHaveBeenCalledWith(`${namespace}:option.2.selected_bad`); }); it("should start battle if fastest pokemon is slower than boss above wave 50", async () => { @@ -200,7 +204,7 @@ describe("Berries Abound - Mystery Encounter", () => { const encounterTextSpy = vi.spyOn(EncounterDialogueUtils, "showEncounterText"); await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); - scene.getParty().forEach(pkm => { + scene.getPlayerParty().forEach(pkm => { vi.spyOn(pkm, "getStat").mockReturnValue(1); // for ease return for every stat }); @@ -215,8 +219,8 @@ describe("Berries Abound - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); // Should be enraged - expect(enemyField[0].summonData.statStages).toEqual([ 1, 1, 1, 1, 1, 0, 0 ]); - expect(encounterTextSpy).toHaveBeenCalledWith(expect.any(BattleScene), `${namespace}:option.2.selected_bad`); + expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 1, 0, 0]); + expect(encounterTextSpy).toHaveBeenCalledWith(`${namespace}:option.2.selected_bad`); }); it("Should skip battle when fastest pokemon is faster than boss", async () => { @@ -225,7 +229,7 @@ describe("Berries Abound - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); - scene.getParty().forEach(pkm => { + scene.getPlayerParty().forEach(pkm => { vi.spyOn(pkm, "getStat").mockReturnValue(9999); // for ease return for every stat }); @@ -235,13 +239,15 @@ describe("Berries Abound - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); for (const option of modifierSelectHandler.options) { expect(option.modifierTypeOption.type.id).toContain("BERRY"); } - expect(EncounterDialogueUtils.showEncounterText).toHaveBeenCalledWith(expect.any(BattleScene), `${namespace}:option.2.selected`); + expect(EncounterDialogueUtils.showEncounterText).toHaveBeenCalledWith(`${namespace}:option.2.selected`); expect(EncounterPhaseUtils.leaveEncounterWithoutBattle).toBeCalled(); }); }); diff --git a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts similarity index 89% rename from src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts rename to test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts index e0f37c7e045..9befe77e688 100644 --- a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts +++ b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -2,16 +2,20 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { TrainerType } from "#enums/trainer-type"; import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; @@ -22,7 +26,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; const namespace = "mysteryEncounters/bugTypeSuperfan"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.WEEDLE ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.WEEDLE]; const defaultBiome = Biome.CAVE; const defaultWave = 24; @@ -49,7 +53,7 @@ const POOL_1_POKEMON = [ Species.CHARJABUG, Species.RIBOMBEE, Species.SPIDOPS, - Species.LOKIX + Species.LOKIX, ]; const POOL_2_POKEMON = [ @@ -78,26 +82,26 @@ const POOL_2_POKEMON = [ Species.KLEAVOR, ]; -const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ +const POOL_3_POKEMON: { species: Species; formIndex?: number }[] = [ { species: Species.PINSIR, - formIndex: 1 + formIndex: 1, }, { species: Species.SCIZOR, - formIndex: 1 + formIndex: 1, }, { species: Species.HERACROSS, - formIndex: 1 + formIndex: 1, }, { species: Species.ORBEETLE, - formIndex: 1 + formIndex: 1, }, { species: Species.CENTISKORCH, - formIndex: 1 + formIndex: 1, }, { species: Species.DURANT, @@ -110,35 +114,19 @@ const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ }, ]; -const POOL_4_POKEMON = [ - Species.GENESECT, - Species.SLITHER_WING, - Species.BUZZWOLE, - Species.PHEROMOSA -]; +const POOL_4_POKEMON = [Species.GENESECT, Species.SLITHER_WING, Species.BUZZWOLE, Species.PHEROMOSA]; const PHYSICAL_TUTOR_MOVES = [ Moves.MEGAHORN, Moves.X_SCISSOR, Moves.ATTACK_ORDER, Moves.PIN_MISSILE, - Moves.FIRST_IMPRESSION + Moves.FIRST_IMPRESSION, ]; -const SPECIAL_TUTOR_MOVES = [ - Moves.SILVER_WIND, - Moves.BUG_BUZZ, - Moves.SIGNAL_BEAM, - Moves.POLLEN_PUFF -]; +const SPECIAL_TUTOR_MOVES = [Moves.SILVER_WIND, Moves.BUG_BUZZ, Moves.SIGNAL_BEAM, Moves.POLLEN_PUFF]; -const STATUS_TUTOR_MOVES = [ - Moves.STRING_SHOT, - Moves.STICKY_WEB, - Moves.SILK_TRAP, - Moves.RAGE_POWDER, - Moves.HEAL_ORDER -]; +const STATUS_TUTOR_MOVES = [Moves.STRING_SHOT, Moves.STICKY_WEB, Moves.SILK_TRAP, Moves.RAGE_POWDER, Moves.HEAL_ORDER]; const MISC_TUTOR_MOVES = [ Moves.BUG_BITE, @@ -147,7 +135,7 @@ const MISC_TUTOR_MOVES = [ Moves.QUIVER_DANCE, Moves.TAIL_GLOW, Moves.INFESTATION, - Moves.U_TURN + Moves.U_TURN, ]; describe("Bug-Type Superfan - Mystery Encounter", () => { @@ -168,9 +156,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.BUG_TYPE_SUPERFAN ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.BUG_TYPE_SUPERFAN]]]), ); }); @@ -209,8 +195,8 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { expect(BugTypeSuperfanEncounter.onInit).toBeDefined(); - BugTypeSuperfanEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + BugTypeSuperfanEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); const config = BugTypeSuperfanEncounter.enemyPartyConfigs[0]; expect(config).toBeDefined(); @@ -384,7 +370,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await game.phaseInterceptor.run(MysteryEncounterRewardsPhase); expect(selectOptionSpy).toHaveBeenCalledTimes(1); - const optionData = selectOptionSpy.mock.calls[0][1]; + const optionData = selectOptionSpy.mock.calls[0][0]; expect(PHYSICAL_TUTOR_MOVES.some(move => new PokemonMove(move).getName() === optionData[0].label)).toBe(true); expect(SPECIAL_TUTOR_MOVES.some(move => new PokemonMove(move).getName() === optionData[1].label)).toBe(true); expect(STATUS_TUTOR_MOVES.some(move => new PokemonMove(move).getName() === optionData[2].label)).toBe(true); @@ -400,12 +386,12 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option.2.label`, buttonTooltip: `${namespace}:option.2.tooltip`, - disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip` + disabledButtonTooltip: `${namespace}:option.2.disabled_tooltip`, }); }); it("should NOT be selectable if the player doesn't have any Bug types", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.ABRA ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.ABRA]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -431,21 +417,25 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(2); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("SUPER_LURE"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("GREAT_BALL"); }); it("should proceed to rewards screen with 2-3 Bug Types reward options", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE, Species.BEEDRILL ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE, Species.BEEDRILL]); await runMysteryEncounterToEnd(game, 2); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("QUICK_CLAW"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MAX_LURE"); @@ -453,14 +443,21 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should proceed to rewards screen with 4-5 Bug Types reward options", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE, Species.BEEDRILL, Species.GALVANTULA, Species.VOLCARONA ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ + Species.BUTTERFREE, + Species.BEEDRILL, + Species.GALVANTULA, + Species.VOLCARONA, + ]); await runMysteryEncounterToEnd(game, 2); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("GRIP_CLAW"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MAX_LURE"); @@ -468,14 +465,23 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should proceed to rewards screen with 6 Bug Types reward options (including form change item)", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE, Species.BEEDRILL, Species.GALVANTULA, Species.VOLCARONA, Species.ANORITH, Species.GENESECT ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ + Species.BUTTERFREE, + Species.BEEDRILL, + Species.GALVANTULA, + Species.VOLCARONA, + Species.ANORITH, + Species.GENESECT, + ]); await runMysteryEncounterToEnd(game, 2); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MASTER_BALL"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MEGA_BRACELET"); @@ -538,9 +544,10 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { it("should remove the gifted item and proceed to rewards screen", async () => { game.override.startingHeldItems([{ name: "GRIP_CLAW", count: 1 }]); - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE]); - const gripClawCountBefore = scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; + const gripClawCountBefore = + scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -548,12 +555,15 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(2); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MYSTERY_ENCOUNTER_GOLDEN_BUG_NET"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("REVIVER_SEED"); - const gripClawCountAfter = scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; + const gripClawCountAfter = + scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; expect(gripClawCountBefore - 1).toBe(gripClawCountAfter); }); @@ -561,7 +571,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { game.override.startingHeldItems([{ name: "GRIP_CLAW", count: 1 }]); const leaveEncounterWithoutBattleSpy = vi.spyOn(encounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [ Species.BUTTERFREE ]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE]); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts similarity index 73% rename from src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts rename to test/mystery-encounter/encounters/clowning-around-encounter.test.ts index 82ed558e6db..4bbe76e5c72 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -2,39 +2,44 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; -import BattleScene from "#app/battle-scene"; -import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import type BattleScene from "#app/battle-scene"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowning-around-encounter"; import { TrainerType } from "#enums/trainer-type"; import { Abilities } from "#enums/abilities"; import { PostMysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { Button } from "#enums/buttons"; -import PartyUiHandler from "#app/ui/party-ui-handler"; -import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import type PartyUiHandler from "#app/ui/party-ui-handler"; +import type OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; +import type { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { BerryType } from "#enums/berry-type"; -import { PokemonHeldItemModifier } from "#app/modifier/modifier"; -import { Type } from "#app/data/type"; +import type { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { PokemonType } from "#enums/pokemon-type"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { NewBattlePhase } from "#app/phases/new-battle-phase"; const namespace = "mysteryEncounters/clowningAround"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -56,9 +61,7 @@ describe("Clowning Around - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.CLOWNING_AROUND ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.CLOWNING_AROUND]]]), ); }); @@ -105,8 +108,8 @@ describe("Clowning Around - Mystery Encounter", () => { expect(ClowningAroundEncounter.onInit).toBeDefined(); - ClowningAroundEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + ClowningAroundEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); const config = ClowningAroundEncounter.enemyPartyConfigs[0]; expect(config.doubleBattle).toBe(true); @@ -114,13 +117,13 @@ describe("Clowning Around - Mystery Encounter", () => { expect(config.pokemonConfigs?.[0]).toEqual({ species: getPokemonSpecies(Species.MR_MIME), isBoss: true, - moveSet: [ Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC ] + moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC], }); expect(config.pokemonConfigs?.[1]).toEqual({ species: getPokemonSpecies(Species.BLACEPHALON), customPokemonData: expect.anything(), isBoss: true, - moveSet: [ Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN ] + moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN], }); expect(config.pokemonConfigs?.[1].customPokemonData?.types.length).toBe(2); expect([ @@ -138,7 +141,7 @@ describe("Clowning Around - Mystery Encounter", () => { Abilities.MISTY_SURGE, Abilities.MAGICIAN, Abilities.SHEER_FORCE, - Abilities.PRANKSTER + Abilities.PRANKSTER, ]).toContain(config.pokemonConfigs?.[1].customPokemonData?.ability); expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs?.[1].customPokemonData?.ability); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); @@ -173,9 +176,19 @@ describe("Clowning Around - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(2); expect(enemyField[0].species.speciesId).toBe(Species.MR_MIME); - expect(enemyField[0].moveset).toEqual([ new PokemonMove(Moves.TEETER_DANCE), new PokemonMove(Moves.ALLY_SWITCH), new PokemonMove(Moves.DAZZLING_GLEAM), new PokemonMove(Moves.PSYCHIC) ]); + expect(enemyField[0].moveset).toEqual([ + new PokemonMove(Moves.TEETER_DANCE), + new PokemonMove(Moves.ALLY_SWITCH), + new PokemonMove(Moves.DAZZLING_GLEAM), + new PokemonMove(Moves.PSYCHIC), + ]); expect(enemyField[1].species.speciesId).toBe(Species.BLACEPHALON); - expect(enemyField[1].moveset).toEqual([ new PokemonMove(Moves.TRICK), new PokemonMove(Moves.HYPNOSIS), new PokemonMove(Moves.SHADOW_BALL), new PokemonMove(Moves.MIND_BLOWN) ]); + expect(enemyField[1].moveset).toEqual([ + new PokemonMove(Moves.TRICK), + new PokemonMove(Moves.HYPNOSIS), + new PokemonMove(Moves.SHADOW_BALL), + new PokemonMove(Moves.MIND_BLOWN), + ]); // Should have used moves pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -218,7 +231,7 @@ describe("Clowning Around - Mystery Encounter", () => { // Stop next battle before it runs await game.phaseInterceptor.to(NewBattlePhase, false); - const leadPokemon = scene.getParty()[0]; + const leadPokemon = scene.getPlayerParty()[0]; expect(leadPokemon.customPokemonData?.ability).toBe(abilityToTrain); }); }); @@ -251,45 +264,48 @@ describe("Clowning Around - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); // Set some moves on party for attack type booster generation - scene.getParty()[0].moveset = [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.THIEF) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.THIEF)]; // 2 Sitrus Berries on lead scene.modifiers = []; - let itemType = generateModifierType(scene, modifierTypes.BERRY, [ BerryType.SITRUS ]) as PokemonHeldItemModifierType; - await addItemToPokemon(scene, scene.getParty()[0], 2, itemType); + let itemType = generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getPlayerParty()[0], 2, itemType); // 2 Ganlon Berries on lead - itemType = generateModifierType(scene, modifierTypes.BERRY, [ BerryType.GANLON ]) as PokemonHeldItemModifierType; - await addItemToPokemon(scene, scene.getParty()[0], 2, itemType); + itemType = generateModifierType(modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getPlayerParty()[0], 2, itemType); // 5 Golden Punch on lead (ultra) - itemType = generateModifierType(scene, modifierTypes.GOLDEN_PUNCH) as PokemonHeldItemModifierType; - await addItemToPokemon(scene, scene.getParty()[0], 5, itemType); + itemType = generateModifierType(modifierTypes.GOLDEN_PUNCH) as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getPlayerParty()[0], 5, itemType); // 5 Lucky Egg on lead (ultra) - itemType = generateModifierType(scene, modifierTypes.LUCKY_EGG) as PokemonHeldItemModifierType; - await addItemToPokemon(scene, scene.getParty()[0], 5, itemType); + itemType = generateModifierType(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(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.getParty()[0], 5, itemType); + itemType = generateModifierType(modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getPlayerParty()[0], 5, itemType); // 2 Golden Egg on lead (rogue) - itemType = generateModifierType(scene, modifierTypes.GOLDEN_EGG) as PokemonHeldItemModifierType; - await addItemToPokemon(scene, scene.getParty()[0], 2, itemType); + itemType = generateModifierType(modifierTypes.GOLDEN_EGG) as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getPlayerParty()[0], 2, itemType); // 5 Soul Dew on second party pokemon (these should not change) - itemType = generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType; - await addItemToPokemon(scene, scene.getParty()[1], 5, itemType); + itemType = generateModifierType(modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getPlayerParty()[1], 5, itemType); await runMysteryEncounterToEnd(game, 2); - const leadItemsAfter = scene.getParty()[0].getHeldItems(); + const leadItemsAfter = scene.getPlayerParty()[0].getHeldItems(); const ultraCountAfter = leadItemsAfter .filter(m => m.type.tier === ModifierTier.ULTRA) .reduce((a, b) => a + b.stackCount, 0); 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.getParty()[1].getHeldItems(); + const secondItemsAfter = scene.getPlayerParty()[1].getHeldItems(); expect(secondItemsAfter.length).toBe(1); expect(secondItemsAfter[0].type.id).toBe("SOUL_DEW"); expect(secondItemsAfter[0]?.stackCount).toBe(5); @@ -333,27 +349,27 @@ describe("Clowning Around - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); // Same type moves on lead - scene.getParty()[0].moveset = [ new PokemonMove(Moves.ICE_BEAM), new PokemonMove(Moves.SURF) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.ICE_BEAM), new PokemonMove(Moves.SURF)]; // Different type moves on second - scene.getParty()[1].moveset = [ new PokemonMove(Moves.GRASS_KNOT), new PokemonMove(Moves.ELECTRO_BALL) ]; + scene.getPlayerParty()[1].moveset = [new PokemonMove(Moves.GRASS_KNOT), new PokemonMove(Moves.ELECTRO_BALL)]; // No moves on third - scene.getParty()[2].moveset = []; + scene.getPlayerParty()[2].moveset = []; await runMysteryEncounterToEnd(game, 3); - const leadTypesAfter = scene.getParty()[0].customPokemonData?.types; - const secondaryTypesAfter = scene.getParty()[1].customPokemonData?.types; - const thirdTypesAfter = scene.getParty()[2].customPokemonData?.types; + const leadTypesAfter = scene.getPlayerParty()[0].getTypes(); + const secondaryTypesAfter = scene.getPlayerParty()[1].getTypes(); + const thirdTypesAfter = scene.getPlayerParty()[2].getTypes(); expect(leadTypesAfter.length).toBe(2); - expect(leadTypesAfter[0]).toBe(Type.WATER); - expect([ Type.WATER, Type.ICE ].includes(leadTypesAfter[1])).toBeFalsy(); + expect(leadTypesAfter[0]).toBe(PokemonType.WATER); + expect([PokemonType.WATER, PokemonType.ICE].includes(leadTypesAfter[1])).toBeFalsy(); expect(secondaryTypesAfter.length).toBe(2); - expect(secondaryTypesAfter[0]).toBe(Type.GHOST); - expect([ Type.GHOST, Type.POISON ].includes(secondaryTypesAfter[1])).toBeFalsy(); - expect([ Type.GRASS, Type.ELECTRIC ].includes(secondaryTypesAfter[1])).toBeTruthy(); + expect(secondaryTypesAfter[0]).toBe(PokemonType.GHOST); + expect([PokemonType.GHOST, PokemonType.POISON].includes(secondaryTypesAfter[1])).toBeFalsy(); + expect([PokemonType.GRASS, PokemonType.ELECTRIC].includes(secondaryTypesAfter[1])).toBeTruthy(); expect(thirdTypesAfter.length).toBe(2); - expect(thirdTypesAfter[0]).toBe(Type.PSYCHIC); - expect(secondaryTypesAfter[1]).not.toBe(Type.PSYCHIC); + expect(thirdTypesAfter[0]).toBe(PokemonType.PSYCHIC); + expect(secondaryTypesAfter[1]).not.toBe(PokemonType.PSYCHIC); }); it("should leave encounter without battle", async () => { @@ -367,9 +383,14 @@ describe("Clowning Around - Mystery Encounter", () => { }); }); -async function addItemToPokemon(scene: BattleScene, pokemon: Pokemon, stackCount: integer, itemType: PokemonHeldItemModifierType) { +async function addItemToPokemon( + scene: BattleScene, + pokemon: Pokemon, + stackCount: number, + itemType: PokemonHeldItemModifierType, +) { const itemMod = itemType.newModifier(pokemon) as PokemonHeldItemModifier; itemMod.stackCount = stackCount; - await scene.addModifier(itemMod, true, false, false, true); + scene.addModifier(itemMod, true, false, false, true); await scene.updateModifiers(true); } diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts similarity index 86% rename from src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts rename to test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index 47625541160..a4c1052463c 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -1,11 +1,15 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; +import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; @@ -21,7 +25,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; const namespace = "mysteryEncounters/dancingLessons"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.PLAINS; const defaultWave = 45; @@ -44,9 +48,9 @@ describe("Dancing Lessons - Mystery Encounter", () => { vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.PLAINS, [ MysteryEncounterType.DANCING_LESSONS ]], - [ Biome.SPACE, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.PLAINS, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.SPACE, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -98,7 +102,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); // Make party lead's level arbitrarily high to not get KOed by move - const partyLead = scene.getParty()[0]; + const partyLead = scene.getPlayerParty()[0]; partyLead.level = 1000; partyLead.calculateStats(); await runMysteryEncounterToEnd(game, 1, undefined, true); @@ -107,7 +111,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.ORICORIO); - expect(enemyField[0].summonData.statStages).toEqual([ 1, 1, 1, 1, 0, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 0, 0, 0]); const moveset = enemyField[0].moveset.map(m => m?.moveId); expect(moveset.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); @@ -119,19 +123,19 @@ describe("Dancing Lessons - Mystery Encounter", () => { it("should have a Baton in the rewards after battle", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); // Make party lead's level arbitrarily high to not get KOed by move - const partyLead = scene.getParty()[0]; + const partyLead = scene.getPlayerParty()[0]; partyLead.level = 1000; partyLead.calculateStats(); await runMysteryEncounterToEnd(game, 1, undefined, true); - // For some reason updateModifiers breaks in this test and does not resolve promise - vi.spyOn(game.scene, "updateModifiers").mockImplementation(() => new Promise(resolve => resolve())); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); // Should fill remaining expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toContain("BATON"); }); @@ -157,7 +161,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "unshiftPhase"); await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); - scene.getParty()[0].moveset = []; + scene.getPlayerParty()[0].moveset = []; await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1 }); const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof LearnMovePhase).map(p => p[0]); @@ -169,7 +173,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); - scene.getParty()[0].moveset = []; + scene.getPlayerParty()[0].moveset = []; await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1 }); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); @@ -196,13 +200,13 @@ describe("Dancing Lessons - Mystery Encounter", () => { it("should add Oricorio to the party", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); - const partyCountBefore = scene.getParty().length; - scene.getParty()[0].moveset = [ new PokemonMove(Moves.DRAGON_DANCE) ]; + const partyCountBefore = scene.getPlayerParty().length; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.DRAGON_DANCE)]; await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); - const partyCountAfter = scene.getParty().length; + const partyCountAfter = scene.getPlayerParty().length; expect(partyCountBefore + 1).toBe(partyCountAfter); - const oricorio = scene.getParty()[scene.getParty().length - 1]; + const oricorio = scene.getPlayerParty()[scene.getPlayerParty().length - 1]; expect(oricorio.species.speciesId).toBe(Species.ORICORIO); const moveset = oricorio.moveset.map(m => m?.moveId); expect(moveset?.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); @@ -211,8 +215,8 @@ describe("Dancing Lessons - Mystery Encounter", () => { it("should NOT be selectable if the player doesn't have a Dance type move", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); - const partyCountBefore = scene.getParty().length; - scene.getParty().forEach(p => p.moveset = []); + const partyCountBefore = scene.getPlayerParty().length; + scene.getPlayerParty().forEach(p => (p.moveset = [])); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -223,7 +227,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { vi.spyOn(scene.ui, "playError"); await runSelectMysteryEncounterOption(game, 3); - const partyCountAfter = scene.getParty().length; + const partyCountAfter = scene.getPlayerParty().length; expect(scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled @@ -236,7 +240,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); - scene.getParty()[0].moveset = [ new PokemonMove(Moves.DRAGON_DANCE) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.DRAGON_DANCE)]; await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts similarity index 80% rename from src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts rename to test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 66d628ef82f..94faf070a39 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -1,24 +1,36 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; +import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/delibirdy-encounter"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; -import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { BerryModifier, HealingBoosterModifier, HitHealModifier, LevelIncrementBoosterModifier, MoneyMultiplierModifier, PokemonInstantReviveModifier, PokemonNatureWeightModifier, PreserveBerryModifier } from "#app/modifier/modifier"; +import type { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { + BerryModifier, + HealingBoosterModifier, + HitHealModifier, + LevelIncrementBoosterModifier, + MoneyMultiplierModifier, + PokemonInstantReviveModifier, + PokemonNatureWeightModifier, + PreserveBerryModifier, +} from "#app/modifier/modifier"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; import { BerryType } from "#enums/berry-type"; const namespace = "mysteryEncounters/delibirdy"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -40,9 +52,7 @@ describe("Delibird-y - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.DELIBIRDY ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.DELIBIRDY]]]), ); }); @@ -98,9 +108,10 @@ describe("Delibird-y - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); await runMysteryEncounterToEnd(game, 1); - const price = (scene.currentBattle.mysteryEncounter?.options[0].requirements[0] as MoneyRequirement).requiredMoney; + const price = (scene.currentBattle.mysteryEncounter?.options[0].requirements[0] as MoneyRequirement) + .requiredMoney; - expect(updateMoneySpy).toHaveBeenCalledWith(scene, -price, true, false); + expect(updateMoneySpy).toHaveBeenCalledWith(-price, true, false); expect(scene.money).toBe(initialMoney - price); }); @@ -121,9 +132,9 @@ describe("Delibird-y - Mystery Encounter", () => { // Max Amulet Coins scene.modifiers = []; - const amuletCoin = generateModifierType(scene, modifierTypes.AMULET_COIN)!.newModifier() as MoneyMultiplierModifier; + const amuletCoin = generateModifierType(modifierTypes.AMULET_COIN)!.newModifier() as MoneyMultiplierModifier; amuletCoin.stackCount = 5; - await scene.addModifier(amuletCoin, true, false, false, true); + scene.addModifier(amuletCoin, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 1); @@ -190,10 +201,10 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 2 Sitrus berries on party lead scene.modifiers = []; - const sitrus = generateModifierType(scene, modifierTypes.BERRY, [ BerryType.SITRUS ])!; - const sitrusMod = sitrus.newModifier(scene.getParty()[0]) as BerryModifier; + const sitrus = generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS])!; + const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -211,10 +222,10 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Reviver Seed on party lead scene.modifiers = []; - const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED)!; - const modifier = revSeed.newModifier(scene.getParty()[0]) as PokemonInstantReviveModifier; + const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; + const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -232,15 +243,15 @@ describe("Delibird-y - Mystery Encounter", () => { // 99 Candy Jars scene.modifiers = []; - const candyJar = generateModifierType(scene, modifierTypes.CANDY_JAR)!.newModifier() as LevelIncrementBoosterModifier; + const candyJar = generateModifierType(modifierTypes.CANDY_JAR)!.newModifier() as LevelIncrementBoosterModifier; candyJar.stackCount = 99; - await scene.addModifier(candyJar, true, false, false, true); - const sitrus = generateModifierType(scene, modifierTypes.BERRY, [ BerryType.SITRUS ])!; + scene.addModifier(candyJar, true, false, false, true); + const sitrus = generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS])!; // Sitrus berries on party - const sitrusMod = sitrus.newModifier(scene.getParty()[0]) as BerryModifier; + const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); + scene.addModifier(sitrusMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -261,15 +272,15 @@ describe("Delibird-y - Mystery Encounter", () => { // 3 Berry Pouches scene.modifiers = []; - const healingCharm = generateModifierType(scene, modifierTypes.BERRY_POUCH)!.newModifier() as PreserveBerryModifier; + const healingCharm = generateModifierType(modifierTypes.BERRY_POUCH)!.newModifier() as PreserveBerryModifier; healingCharm.stackCount = 3; - await scene.addModifier(healingCharm, true, false, false, true); + scene.addModifier(healingCharm, true, false, false, true); // Set 1 Reviver Seed on party lead - const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED)!; - const modifier = revSeed.newModifier(scene.getParty()[0]) as PokemonInstantReviveModifier; + const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; + const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -290,9 +301,9 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; - const modifier = soulDew.newModifier(scene.getParty()[0]); - await scene.addModifier(modifier, true, false, false, true); + const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; + const modifier = soulDew.newModifier(scene.getPlayerParty()[0]); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await game.phaseInterceptor.to(MysteryEncounterPhase, false); @@ -318,10 +329,10 @@ describe("Delibird-y - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); // Set 1 Reviver Seed on party lead - const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED)!; - const modifier = revSeed.newModifier(scene.getParty()[0]) as PokemonInstantReviveModifier; + const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; + const modifier = revSeed.newModifier(scene.getPlayerParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); @@ -352,10 +363,10 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 2 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; - const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; + const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 2; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -373,10 +384,10 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; - const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; + const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -394,15 +405,15 @@ describe("Delibird-y - Mystery Encounter", () => { // 5 Healing Charms scene.modifiers = []; - const healingCharm = generateModifierType(scene, modifierTypes.HEALING_CHARM)!.newModifier() as HealingBoosterModifier; + const healingCharm = generateModifierType(modifierTypes.HEALING_CHARM)!.newModifier() as HealingBoosterModifier; healingCharm.stackCount = 5; - await scene.addModifier(healingCharm, true, false, false, true); + scene.addModifier(healingCharm, true, false, false, true); // Set 1 Soul Dew on party lead - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; - const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; + const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -423,9 +434,9 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Reviver Seed on party lead scene.modifiers = []; - const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED)!; - const modifier = revSeed.newModifier(scene.getParty()[0]); - await scene.addModifier(modifier, true, false, false, true); + const revSeed = generateModifierType(modifierTypes.REVIVER_SEED)!; + const modifier = revSeed.newModifier(scene.getPlayerParty()[0]); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await game.phaseInterceptor.to(MysteryEncounterPhase, false); @@ -452,10 +463,10 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; - const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; + const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); diff --git a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts similarity index 87% rename from src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts rename to test/mystery-encounter/encounters/department-store-sale-encounter.test.ts index 1869a4d3c3c..d4b0de30535 100644 --- a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts +++ b/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts @@ -2,11 +2,11 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { DepartmentStoreSaleEncounter } from "#app/data/mystery-encounters/encounters/department-store-sale-encounter"; @@ -16,7 +16,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const namespace = "mysteryEncounters/departmentStoreSale"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.PLAINS; const defaultWave = 37; @@ -38,10 +38,10 @@ describe("Department Store Sale - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]); + biomeMap.set(biome, [MysteryEncounterType.DEPARTMENT_STORE_SALE]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -63,10 +63,12 @@ describe("Department Store Sale - Mystery Encounter", () => { { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue`, - } + }, ]); expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(DepartmentStoreSaleEncounter.options.length).toBe(4); }); @@ -97,7 +99,9 @@ describe("Department Store Sale - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); for (const option of modifierSelectHandler.options) { expect(option.modifierTypeOption.type.id).toContain("TM_"); @@ -132,11 +136,15 @@ describe("Department Store Sale - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); for (const option of modifierSelectHandler.options) { - expect(option.modifierTypeOption.type.id.includes("PP_UP") || - option.modifierTypeOption.type.id.includes("BASE_STAT_BOOSTER")).toBeTruthy(); + expect( + option.modifierTypeOption.type.id.includes("PP_UP") || + option.modifierTypeOption.type.id.includes("BASE_STAT_BOOSTER"), + ).toBeTruthy(); } }); @@ -168,11 +176,15 @@ describe("Department Store Sale - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); for (const option of modifierSelectHandler.options) { - expect(option.modifierTypeOption.type.id.includes("DIRE_HIT") || - option.modifierTypeOption.type.id.includes("TEMP_STAT_STAGE_BOOSTER")).toBeTruthy(); + expect( + option.modifierTypeOption.type.id.includes("DIRE_HIT") || + option.modifierTypeOption.type.id.includes("TEMP_STAT_STAGE_BOOSTER"), + ).toBeTruthy(); } }); @@ -204,7 +216,9 @@ describe("Department Store Sale - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); for (const option of modifierSelectHandler.options) { expect(option.modifierTypeOption.type.id).toContain("BALL"); diff --git a/src/test/mystery-encounter/encounters/field-trip-encounter.test.ts b/test/mystery-encounter/encounters/field-trip-encounter.test.ts similarity index 75% rename from src/test/mystery-encounter/encounters/field-trip-encounter.test.ts rename to test/mystery-encounter/encounters/field-trip-encounter.test.ts index a6f925274c3..8bd35d6013f 100644 --- a/src/test/mystery-encounter/encounters/field-trip-encounter.test.ts +++ b/test/mystery-encounter/encounters/field-trip-encounter.test.ts @@ -1,11 +1,11 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; @@ -17,7 +17,7 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import i18next from "i18next"; const namespace = "mysteryEncounters/fieldTrip"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -37,12 +37,10 @@ describe("Field Trip - Mystery Encounter", () => { game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - game.override.moveset([ Moves.TACKLE, Moves.UPROAR, Moves.SWORDS_DANCE ]); + game.override.moveset([Moves.TACKLE, Moves.UPROAR, Moves.SWORDS_DANCE]); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.FIELD_TRIP ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.FIELD_TRIP]]]), ); }); @@ -60,12 +58,12 @@ describe("Field Trip - Mystery Encounter", () => { expect(FieldTripEncounter.dialogue).toBeDefined(); expect(FieldTripEncounter.dialogue.intro).toStrictEqual([ { - text: `${namespace}:intro` + text: `${namespace}:intro`, }, { speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue` - } + text: `${namespace}:intro_dialogue`, + }, ]); expect(FieldTripEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(FieldTripEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); @@ -91,7 +89,9 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(0); }); @@ -101,13 +101,25 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_attack")); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_defense")); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_speed")); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.DIRE_HIT.name")); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.RARER_CANDY.name")); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_attack"), + ); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_defense"), + ); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_speed"), + ); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.DIRE_HIT.name"), + ); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.RARER_CANDY.name"), + ); }); it("should leave encounter without battle", async () => { @@ -138,7 +150,9 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(0); }); @@ -148,13 +162,25 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_sp_atk")); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_sp_def")); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_speed")); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.DIRE_HIT.name")); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.RARER_CANDY.name")); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_sp_atk"), + ); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_sp_def"), + ); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_speed"), + ); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.DIRE_HIT.name"), + ); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.RARER_CANDY.name"), + ); }); it("should leave encounter without battle", async () => { @@ -185,7 +211,9 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(0); }); @@ -196,14 +224,32 @@ describe("Field Trip - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_accuracy")); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe(i18next.t("modifierType:TempStatStageBoosterItem.x_speed")); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.AddPokeballModifierType.name", { modifierCount: 5, pokeballName: i18next.t("pokeball:greatBall") })); - expect(i18next.t).toHaveBeenCalledWith(("modifierType:ModifierType.AddPokeballModifierType.name"), expect.objectContaining({ modifierCount: 5 })); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.IV_SCANNER.name")); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe(i18next.t("modifierType:ModifierType.RARER_CANDY.name")); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_accuracy"), + ); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:TempStatStageBoosterItem.x_speed"), + ); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.AddPokeballModifierType.name", { + modifierCount: 5, + pokeballName: i18next.t("pokeball:greatBall"), + }), + ); + expect(i18next.t).toHaveBeenCalledWith( + "modifierType:ModifierType.AddPokeballModifierType.name", + expect.objectContaining({ modifierCount: 5 }), + ); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.IV_SCANNER.name"), + ); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.name).toBe( + i18next.t("modifierType:ModifierType.RARER_CANDY.name"), + ); }); it("should leave encounter without battle", async () => { diff --git a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts similarity index 79% rename from src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts rename to test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index 5a270f1cbec..3d311134d4e 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -1,34 +1,39 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; -import { Biome } from "#app/enums/biome"; -import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; -import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import { Biome } from "#enums/biome"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; import { Gender } from "#app/data/gender"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { AttackTypeBoosterModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; -import { Type } from "#app/data/type"; -import { Status, StatusEffect } from "#app/data/status-effect"; +import { PokemonType } from "#enums/pokemon-type"; +import { Status } from "#app/data/status-effect"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Abilities } from "#enums/abilities"; import i18next from "i18next"; +import { StatusEffect } from "#enums/status-effect"; const namespace = "mysteryEncounters/fieryFallout"; /** Arcanine and Ninetails for 2 Fire types. Lapras, Gengar, Abra for burnable mon. */ -const defaultParty = [ Species.ARCANINE, Species.NINETALES, Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.ARCANINE, Species.NINETALES, Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.VOLCANO; const defaultWave = 56; @@ -44,17 +49,18 @@ describe("Fiery Fallout - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); scene = game.scene; - game.override.mysteryEncounterChance(100) + game.override + .mysteryEncounterChance(100) .startingWave(defaultWave) .startingBiome(defaultBiome) .disableTrainerWaves() - .moveset([ Moves.PAYBACK, Moves.THUNDERBOLT ]); // Required for attack type booster item generation + .moveset([Moves.PAYBACK, Moves.THUNDERBOLT]); // Required for attack type booster item generation vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIERY_FALLOUT ]], - [ Biome.MOUNTAIN, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.VOLCANO, [MysteryEncounterType.FIERY_FALLOUT]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -103,8 +109,8 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(FieryFalloutEncounter.onInit).toBeDefined(); - FieryFalloutEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + FieryFalloutEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(FieryFalloutEncounter.enemyPartyConfigs).toEqual([ { @@ -113,20 +119,20 @@ describe("Fiery Fallout - Mystery Encounter", () => { species: getPokemonSpecies(Species.VOLCARONA), isBoss: false, gender: Gender.MALE, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: expect.any(Function) + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: expect.any(Function), }, { species: getPokemonSpecies(Species.VOLCARONA), isBoss: false, gender: Gender.FEMALE, - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: expect.any(Function) - } + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: expect.any(Function), + }, ], doubleBattle: true, - disableSwitch: true - } + disableSwitch: true, + }, ]); expect(weatherSpy).toHaveBeenCalledTimes(1); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); @@ -175,9 +181,11 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); - const leadPokemonId = scene.getParty()?.[0].id; - const leadPokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, true) as PokemonHeldItemModifier[]; + const leadPokemonId = scene.getPlayerParty()?.[0].id; + const leadPokemonItems = scene.findModifiers( + m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, + true, + ) as PokemonHeldItemModifier[]; const item = leadPokemonItems.find(i => i instanceof AttackTypeBoosterModifier); expect(item).toBeDefined; }); @@ -202,23 +210,31 @@ describe("Fiery Fallout - Mystery Encounter", () => { it("should damage all non-fire party PKM by 20%, and burn + give Heatproof to a random Pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - const party = scene.getParty(); - const lapras = party.find((pkm) => pkm.species.speciesId === Species.LAPRAS)!; + const party = scene.getPlayerParty(); + const lapras = party.find(pkm => pkm.species.speciesId === Species.LAPRAS)!; lapras.status = new Status(StatusEffect.POISON); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA)!; + const abra = party.find(pkm => pkm.species.speciesId === Species.ABRA)!; vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); await runMysteryEncounterToEnd(game, 2); - const burnablePokemon = party.filter((pkm) => pkm.isAllowedInBattle() && !pkm.getTypes().includes(Type.FIRE)); - const notBurnablePokemon = party.filter((pkm) => !pkm.isAllowedInBattle() || pkm.getTypes().includes(Type.FIRE)); + const burnablePokemon = party.filter( + pkm => pkm.isAllowedInBattle() && !pkm.getTypes().includes(PokemonType.FIRE), + ); + const notBurnablePokemon = party.filter( + pkm => !pkm.isAllowedInBattle() || pkm.getTypes().includes(PokemonType.FIRE), + ); expect(scene.currentBattle.mysteryEncounter?.dialogueTokens["burnedPokemon"]).toBe(i18next.t("pokemon:gengar")); - burnablePokemon.forEach((pkm) => { - expect(pkm.hp, `${pkm.name} should have received 20% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.2)); + burnablePokemon.forEach(pkm => { + expect(pkm.hp, `${pkm.name} should have received 20% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe( + pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.2), + ); }); expect(burnablePokemon.some(pkm => pkm.status?.effect === StatusEffect.BURN)).toBeTruthy(); expect(burnablePokemon.some(pkm => pkm.customPokemonData.ability === Abilities.HEATPROOF)); - notBurnablePokemon.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); + notBurnablePokemon.forEach(pkm => + expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp()), + ); }); it("should leave encounter without battle", async () => { @@ -254,7 +270,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); - const leadPokemonItems = scene.getParty()?.[0].getHeldItems() as PokemonHeldItemModifier[]; + const leadPokemonItems = scene.getPlayerParty()?.[0].getHeldItems() as PokemonHeldItemModifier[]; const item = leadPokemonItems.find(i => i instanceof AttackTypeBoosterModifier); expect(item).toBeDefined; }); @@ -269,12 +285,12 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); it("should be disabled if not enough FIRE types are in party", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, [ Species.MAGIKARP ]); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, [Species.MAGIKARP]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); - const continueEncounterSpy = vi.spyOn((encounterPhase as MysteryEncounterPhase), "continueEncounter"); + const continueEncounterSpy = vi.spyOn(encounterPhase as MysteryEncounterPhase, "continueEncounter"); await runSelectMysteryEncounterOption(game, 3); diff --git a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts similarity index 89% rename from src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts rename to test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts index d23e7919267..d233e72932a 100644 --- a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts +++ b/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts @@ -2,17 +2,21 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { FightOrFlightEncounter } from "#app/data/mystery-encounters/encounters/fight-or-flight-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; @@ -20,7 +24,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const namespace = "mysteryEncounters/fightOrFlight"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -42,9 +46,7 @@ describe("Fight or Flight - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]), ); }); @@ -75,8 +77,8 @@ describe("Fight or Flight - Mystery Encounter", () => { expect(FightOrFlightEncounter.onInit).toBeDefined(); - FightOrFlightEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + FightOrFlightEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); const config = FightOrFlightEncounter.enemyPartyConfigs[0]; expect(config).toBeDefined(); @@ -126,7 +128,9 @@ describe("Fight or Flight - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(item.type.name).toBe(modifierSelectHandler.options[0].modifierTypeOption.type.name); }); @@ -144,14 +148,14 @@ describe("Fight or Flight - Mystery Encounter", () => { selected: [ { text: `${namespace}:option.2.selected`, - } + }, ], }); }); it("should NOT be selectable if the player doesn't have a Stealing move", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); - scene.getParty().forEach(p => p.moveset = []); + scene.getPlayerParty().forEach(p => (p.moveset = [])); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -175,7 +179,7 @@ describe("Fight or Flight - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); // Mock moveset - scene.getParty()[0].moveset = [ new PokemonMove(Moves.KNOCK_OFF) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.KNOCK_OFF)]; const item = game.scene.currentBattle.mysteryEncounter!.misc; await runMysteryEncounterToEnd(game, 2); @@ -184,7 +188,9 @@ describe("Fight or Flight - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(item.type.name).toBe(modifierSelectHandler.options[0].modifierTypeOption.type.name); diff --git a/src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts similarity index 89% rename from src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts rename to test/mystery-encounter/encounters/fun-and-games-encounter.test.ts index 2f4f6bed288..4bb44c4d19e 100644 --- a/src/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts +++ b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts @@ -3,14 +3,17 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/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 { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; +import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { Nature } from "#enums/nature"; @@ -23,7 +26,7 @@ import { Command } from "#app/ui/command-ui-handler"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; const namespace = "mysteryEncounters/funAndGames"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -44,11 +47,9 @@ describe("Fun And Games! - Mystery Encounter", () => { game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]); + const biomeMap = new Map([[Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.FUN_AND_GAMES ]); + biomeMap.set(biome, [MysteryEncounterType.FUN_AND_GAMES]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -69,7 +70,7 @@ describe("Fun And Games! - Mystery Encounter", () => { { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue`, - } + }, ]); expect(FunAndGamesEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(FunAndGamesEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); @@ -95,7 +96,7 @@ describe("Fun And Games! - Mystery Encounter", () => { expect(encounter.onInit).toBeDefined(); - const onInitResult = onInit!(scene); + const onInitResult = onInit!(); expect(onInitResult).toBe(true); }); @@ -137,13 +138,13 @@ describe("Fun And Games! - Mystery Encounter", () => { it("should get 3 turns to attack the Wobbuffet for a reward", async () => { scene.money = 20000; - game.override.moveset([ Moves.TACKLE ]); + game.override.moveset([Moves.TACKLE]); await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(scene.getEnemyPokemon()?.species.speciesId).toBe(Species.WOBBUFFET); - expect(scene.getEnemyPokemon()?.ivs).toEqual([ 0, 0, 0, 0, 0, 0 ]); + expect(scene.getEnemyPokemon()?.ivs).toEqual([0, 0, 0, 0, 0, 0]); expect(scene.getEnemyPokemon()?.nature).toBe(Nature.MILD); game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { @@ -186,13 +187,15 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(0); }); it("should have Wide Lens item in rewards if Wubboffet is at 15-33% HP remaining", async () => { scene.money = 20000; - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); @@ -213,14 +216,16 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("WIDE_LENS"); }); it("should have Scope Lens item in rewards if Wubboffet is at 3-15% HP remaining", async () => { scene.money = 20000; - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); @@ -241,14 +246,16 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("SCOPE_LENS"); }); it("should have Multi Lens item in rewards if Wubboffet is at <3% HP remaining", async () => { scene.money = 20000; - game.override.moveset([ Moves.SPLASH ]); + game.override.moveset([Moves.SPLASH]); await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); @@ -269,7 +276,9 @@ describe("Fun And Games! - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MULTI_LENS"); }); diff --git a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts similarity index 82% rename from src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts rename to test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index b08f8008b68..f68561c2286 100644 --- a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -1,11 +1,11 @@ import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; @@ -18,9 +18,10 @@ 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 ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -42,10 +43,10 @@ describe("Global Trade System - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.GLOBAL_TRADE_SYSTEM ]); + biomeMap.set(biome, [MysteryEncounterType.GLOBAL_TRADE_SYSTEM]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -70,7 +71,7 @@ describe("Global Trade System - Mystery Encounter", () => { }); it("should not loop infinitely when generating trade options for extreme BST non-legendaries", async () => { - const extremeBstTeam = [ Species.SLAKING, Species.WISHIWASHI, Species.SUNKERN ]; + const extremeBstTeam = [Species.SLAKING, Species.WISHIWASHI, Species.SUNKERN]; await game.runToMysteryEncounter(MysteryEncounterType.GLOBAL_TRADE_SYSTEM, extremeBstTeam); expect(GlobalTradeSystemEncounter.encounterType).toBe(MysteryEncounterType.GLOBAL_TRADE_SYSTEM); @@ -106,10 +107,10 @@ describe("Global Trade System - Mystery Encounter", () => { it("Should trade a Pokemon from the player's party for the first of 3 Pokemon options", async () => { await game.runToMysteryEncounter(MysteryEncounterType.GLOBAL_TRADE_SYSTEM, defaultParty); - const speciesBefore = scene.getParty()[0].species.speciesId; + const speciesBefore = scene.getPlayerParty()[0].species.speciesId; await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1, optionNo: 1 }); - const speciesAfter = scene.getParty().at(-1)?.species.speciesId; + const speciesAfter = scene.getPlayerParty().at(-1)?.species.speciesId; expect(speciesAfter).toBeDefined(); expect(speciesBefore).not.toBe(speciesAfter); @@ -119,10 +120,10 @@ describe("Global Trade System - Mystery Encounter", () => { it("Should trade a Pokemon from the player's party for the second of 3 Pokemon options", async () => { await game.runToMysteryEncounter(MysteryEncounterType.GLOBAL_TRADE_SYSTEM, defaultParty); - const speciesBefore = scene.getParty()[1].species.speciesId; + const speciesBefore = scene.getPlayerParty()[1].species.speciesId; await runMysteryEncounterToEnd(game, 1, { pokemonNo: 2, optionNo: 2 }); - const speciesAfter = scene.getParty().at(-1)?.species.speciesId; + const speciesAfter = scene.getPlayerParty().at(-1)?.species.speciesId; expect(speciesAfter).toBeDefined(); expect(speciesBefore).not.toBe(speciesAfter); @@ -132,10 +133,10 @@ describe("Global Trade System - Mystery Encounter", () => { it("Should trade a Pokemon from the player's party for the third of 3 Pokemon options", async () => { await game.runToMysteryEncounter(MysteryEncounterType.GLOBAL_TRADE_SYSTEM, defaultParty); - const speciesBefore = scene.getParty()[2].species.speciesId; + const speciesBefore = scene.getPlayerParty()[2].species.speciesId; await runMysteryEncounterToEnd(game, 1, { pokemonNo: 3, optionNo: 3 }); - const speciesAfter = scene.getParty().at(-1)?.species.speciesId; + const speciesAfter = scene.getPlayerParty().at(-1)?.species.speciesId; expect(speciesAfter).toBeDefined(); expect(speciesBefore).not.toBe(speciesAfter); @@ -159,23 +160,40 @@ describe("Global Trade System - Mystery Encounter", () => { expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option.2.label`, - buttonTooltip: `${namespace}:option.2.tooltip` + buttonTooltip: `${namespace}:option.2.tooltip`, }); }); it("Should trade a Pokemon from the player's party for a random wonder trade Pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.GLOBAL_TRADE_SYSTEM, defaultParty); - const speciesBefore = scene.getParty()[2].species.speciesId; + const speciesBefore = scene.getPlayerParty()[2].species.speciesId; await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1 }); - const speciesAfter = scene.getParty().at(-1)?.species.speciesId; + const speciesAfter = scene.getPlayerParty().at(-1)?.species.speciesId; expect(speciesAfter).toBeDefined(); expect(speciesBefore).not.toBe(speciesAfter); 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"); @@ -203,10 +221,10 @@ describe("Global Trade System - Mystery Encounter", () => { // Set 2 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; - const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; + const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 2; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); @@ -214,7 +232,9 @@ describe("Global Trade System - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier).toBe(ModifierTier.MASTER); const soulDewAfter = scene.findModifier(m => m instanceof PokemonNatureWeightModifier); @@ -228,10 +248,10 @@ describe("Global Trade System - Mystery Encounter", () => { // Set 1 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; - const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + const soulDew = generateModifierType(modifierTypes.SOUL_DEW)!; + const modifier = soulDew.newModifier(scene.getPlayerParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; - await scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); diff --git a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts similarity index 86% rename from src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts rename to test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts index dec14d46cc8..f23bc8738f2 100644 --- a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts +++ b/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts @@ -5,21 +5,20 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "../encounter-test-utils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; -import BattleScene from "#app/battle-scene"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; +import type BattleScene from "#app/battle-scene"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { PartyExpPhase } from "#app/phases/party-exp-phase"; import i18next from "i18next"; - const namespace = "mysteryEncounters/lostAtSea"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ -const defaultParty = [ Species.BLASTOISE, Species.PIDGEOT, Species.ABRA ]; +const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA]; const defaultBiome = Biome.SEA; const defaultWave = 33; @@ -42,9 +41,9 @@ describe("Lost at Sea - Mystery Encounter", () => { vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.SEA, [ MysteryEncounterType.LOST_AT_SEA ]], - [ Biome.MOUNTAIN, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -83,8 +82,8 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(LostAtSeaEncounter.onInit).toBeDefined(); - LostAtSeaEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + LostAtSeaEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(LostAtSeaEncounter.dialogueTokens?.damagePercentage).toBe("25"); expect(LostAtSeaEncounter.dialogueTokens?.option1RequiredMove).toBe(i18next.t("move:surf.name")); @@ -114,14 +113,14 @@ describe("Lost at Sea - Mystery Encounter", () => { const laprasSpecies = getPokemonSpecies(Species.LAPRAS); await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); - const party = game.scene.getParty(); - const blastoise = party.find((pkm) => pkm.species.speciesId === Species.BLASTOISE); + const party = game.scene.getPlayerParty(); + const blastoise = party.find(pkm => pkm.species.speciesId === Species.BLASTOISE); const expBefore = blastoise!.exp; await runMysteryEncounterToEnd(game, 1); await game.phaseInterceptor.to(PartyExpPhase); - expect(blastoise?.exp).toBe(expBefore + Math.floor(laprasSpecies.baseExp * defaultWave / 5 + 1)); + expect(blastoise?.exp).toBe(expBefore + Math.floor((laprasSpecies.baseExp * defaultWave) / 5 + 1)); }); it("should leave encounter without battle", async () => { @@ -135,7 +134,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should be disabled if no surfable PKM is in party", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [ Species.ARCANINE ]); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [Species.ARCANINE]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -179,14 +178,14 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.startingWave(wave); await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); - const party = game.scene.getParty(); - const pidgeot = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); + const party = game.scene.getPlayerParty(); + const pidgeot = party.find(pkm => pkm.species.speciesId === Species.PIDGEOT); const expBefore = pidgeot!.exp; await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(PartyExpPhase); - expect(pidgeot!.exp).toBe(expBefore + Math.floor(laprasBaseExp * defaultWave / 5 + 1)); + expect(pidgeot!.exp).toBe(expBefore + Math.floor((laprasBaseExp * defaultWave) / 5 + 1)); }); it("should leave encounter without battle", async () => { @@ -200,7 +199,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should be disabled if no flyable PKM is in party", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [ Species.ARCANINE ]); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [Species.ARCANINE]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -241,19 +240,23 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); - const party = game.scene.getParty(); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA)!; + const party = game.scene.getPlayerParty(); + const abra = party.find(pkm => pkm.species.speciesId === Species.ABRA)!; vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); await runMysteryEncounterToEnd(game, 3); - const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); - const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); - allowedPkm.forEach((pkm) => - expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25)) + const allowedPkm = party.filter(pkm => pkm.isAllowedInBattle()); + const notAllowedPkm = party.filter(pkm => !pkm.isAllowedInBattle()); + allowedPkm.forEach(pkm => + expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe( + pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25), + ), ); - notAllowedPkm.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); + notAllowedPkm.forEach(pkm => + expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp()), + ); }); it("should leave encounter without battle", async () => { diff --git a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts similarity index 75% rename from src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts rename to test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts index 7bbc505dd8e..8e825dc2c9b 100644 --- a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -3,14 +3,17 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; +import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { MysteriousChallengersEncounter } from "#app/data/mystery-encounters/encounters/mysterious-challengers-encounter"; import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#app/data/trainer-config"; @@ -22,7 +25,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const namespace = "mysteryEncounters/mysteriousChallengers"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -43,11 +46,9 @@ describe("Mysterious Challengers - Mystery Encounter", () => { game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]); + const biomeMap = new Map([[Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]); + biomeMap.set(biome, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -66,7 +67,9 @@ describe("Mysterious Challengers - Mystery Encounter", () => { expect(MysteriousChallengersEncounter.dialogue).toBeDefined(); expect(MysteriousChallengersEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(MysteriousChallengersEncounter.options.length).toBe(3); }); @@ -89,8 +92,8 @@ describe("Mysterious Challengers - Mystery Encounter", () => { expect(encounter.onInit).toBeDefined(); - encounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + encounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(encounter.enemyPartyConfigs).toBeDefined(); expect(encounter.enemyPartyConfigs.length).toBe(3); @@ -108,16 +111,20 @@ describe("Mysterious Challengers - Mystery Encounter", () => { trainerConfig: expect.any(TrainerConfig), levelAdditiveModifier: 1.5, female: expect.any(Boolean), - } + }, ]); - expect(encounter.enemyPartyConfigs[1].trainerConfig?.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), - new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true) - )); - expect(encounter.enemyPartyConfigs[2].trainerConfig?.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), - new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)) + expect(encounter.enemyPartyConfigs[1].trainerConfig?.partyTemplates[0]).toEqual( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), + ), + ); + expect(encounter.enemyPartyConfigs[2].trainerConfig?.partyTemplates[0]).toEqual( + new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + ), ); expect(encounter.spriteConfigs).toBeDefined(); expect(encounter.spriteConfigs.length).toBe(3); @@ -158,7 +165,9 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toContain("TM_COMMON"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toContain("TM_GREAT"); @@ -200,12 +209,26 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toBe(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toBe(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toBe(ModifierTier.GREAT); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toBe(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.GREAT); }); }); @@ -243,12 +266,26 @@ describe("Mysterious Challengers - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toBe(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toBe(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toBe(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toBe(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toBe(ModifierTier.GREAT); }); }); }); diff --git a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts b/test/mystery-encounter/encounters/part-timer-encounter.test.ts similarity index 86% rename from src/test/mystery-encounter/encounters/part-timer-encounter.test.ts rename to test/mystery-encounter/encounters/part-timer-encounter.test.ts index ba8ce648a3f..639a2e140ff 100644 --- a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -2,11 +2,14 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; +import type BattleScene from "#app/battle-scene"; import { CIVILIZATION_ENCOUNTER_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -17,7 +20,7 @@ import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; const namespace = "mysteryEncounters/partTimer"; // Pyukumuku for lowest speed, Regieleki for highest speed, Feebas for lowest "bulk", Melmetal for highest "bulk" -const defaultParty = [ Species.PYUKUMUKU, Species.REGIELEKI, Species.FEEBAS, Species.MELMETAL ]; +const defaultParty = [Species.PYUKUMUKU, Species.REGIELEKI, Species.FEEBAS, Species.MELMETAL]; const defaultBiome = Biome.PLAINS; const defaultWave = 37; @@ -39,10 +42,10 @@ describe("Part-Timer - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.PART_TIMER ]); + biomeMap.set(biome, [MysteryEncounterType.PART_TIMER]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -64,7 +67,7 @@ describe("Part-Timer - Mystery Encounter", () => { { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue`, - } + }, ]); expect(PartTimerEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(PartTimerEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); @@ -90,9 +93,9 @@ describe("Part-Timer - Mystery Encounter", () => { buttonTooltip: `${namespace}:option.1.tooltip`, selected: [ { - text: `${namespace}:option.1.selected` - } - ] + text: `${namespace}:option.1.selected`, + }, + ], }); }); @@ -101,15 +104,15 @@ describe("Part-Timer - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); // Override party levels to 50 so stats can be fully reflective - scene.getParty().forEach(p => { + scene.getPlayerParty().forEach(p => { p.level = 50; p.calculateStats(); }); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }); - expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(1), true, false); + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene.getWaveMoneyAmount(1), true, false); // Expect PP of mon's moves to have been reduced to 2 - const moves = scene.getParty()[0].moveset; + const moves = scene.getPlayerParty()[0].moveset; for (const move of moves) { expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } @@ -120,16 +123,16 @@ describe("Part-Timer - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); // Override party levels to 50 so stats can be fully reflective - scene.getParty().forEach(p => { + scene.getPlayerParty().forEach(p => { p.level = 50; - p.ivs = [ 20, 20, 20, 20, 20, 20 ]; + p.ivs = [20, 20, 20, 20, 20, 20]; p.calculateStats(); }); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 2 }); - expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(4), true, false); + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene.getWaveMoneyAmount(4), true, false); // Expect PP of mon's moves to have been reduced to 2 - const moves = scene.getParty()[1].moveset; + const moves = scene.getPlayerParty()[1].moveset; for (const move of moves) { expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } @@ -155,9 +158,9 @@ describe("Part-Timer - Mystery Encounter", () => { buttonTooltip: `${namespace}:option.2.tooltip`, selected: [ { - text: `${namespace}:option.2.selected` - } - ] + text: `${namespace}:option.2.selected`, + }, + ], }); }); @@ -166,15 +169,15 @@ describe("Part-Timer - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); // Override party levels to 50 so stats can be fully reflective - scene.getParty().forEach(p => { + scene.getPlayerParty().forEach(p => { p.level = 50; p.calculateStats(); }); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 3 }); - expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(1), true, false); + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene.getWaveMoneyAmount(1), true, false); // Expect PP of mon's moves to have been reduced to 2 - const moves = scene.getParty()[2].moveset; + const moves = scene.getPlayerParty()[2].moveset; for (const move of moves) { expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } @@ -185,16 +188,16 @@ describe("Part-Timer - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); // Override party levels to 50 so stats can be fully reflective - scene.getParty().forEach(p => { + scene.getPlayerParty().forEach(p => { p.level = 50; - p.ivs = [ 20, 20, 20, 20, 20, 20 ]; + p.ivs = [20, 20, 20, 20, 20, 20]; p.calculateStats(); }); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 4 }); - expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(4), true, false); + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene.getWaveMoneyAmount(4), true, false); // Expect PP of mon's moves to have been reduced to 2 - const moves = scene.getParty()[3].moveset; + const moves = scene.getPlayerParty()[3].moveset; for (const move of moves) { expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } @@ -221,9 +224,9 @@ describe("Part-Timer - Mystery Encounter", () => { disabledButtonTooltip: `${namespace}:option.3.disabled_tooltip`, selected: [ { - text: `${namespace}:option.3.selected` - } - ] + text: `${namespace}:option.3.selected`, + }, + ], }); }); @@ -232,7 +235,7 @@ describe("Part-Timer - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); // Mock movesets - scene.getParty().forEach(p => p.moveset = []); + scene.getPlayerParty().forEach(p => (p.moveset = [])); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -256,12 +259,12 @@ describe("Part-Timer - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); // Mock moveset - scene.getParty()[0].moveset = [ new PokemonMove(Moves.ATTRACT) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.ATTRACT)]; await runMysteryEncounterToEnd(game, 3); - expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(2.5), true, false); + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene.getWaveMoneyAmount(2.5), true, false); // Expect PP of mon's moves to have been reduced to 2 - const moves = scene.getParty()[0].moveset; + const moves = scene.getPlayerParty()[0].moveset; for (const move of moves) { expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } diff --git a/test/mystery-encounter/encounters/safari-zone.test.ts b/test/mystery-encounter/encounters/safari-zone.test.ts new file mode 100644 index 00000000000..3506020aae4 --- /dev/null +++ b/test/mystery-encounter/encounters/safari-zone.test.ts @@ -0,0 +1,177 @@ +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/testUtils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; +import type BattleScene from "#app/battle-scene"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/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(); + const onInitResult = onInit!(); + 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/teleporting-hijinks-encounter.test.ts b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts similarity index 86% rename from src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts rename to test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts index 02375d83b98..85c823038e8 100644 --- a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts +++ b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -1,4 +1,4 @@ -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { TeleportingHijinksEncounter } from "#app/data/mystery-encounters/encounters/teleporting-hijinks-encounter"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; import { Abilities } from "#enums/abilities"; @@ -8,22 +8,26 @@ import { Species } from "#enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import i18next from "i18next"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const namespace = "mysteryEncounters/teleportingHijinks"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; -const TRANSPORT_BIOMES = [ Biome.SPACE, Biome.ISLAND, Biome.LABORATORY, Biome.FAIRY_CAVE, Biome.WASTELAND, Biome.DOJO ]; +const TRANSPORT_BIOMES = [Biome.SPACE, Biome.ISLAND, Biome.LABORATORY, Biome.FAIRY_CAVE, Biome.WASTELAND, Biome.DOJO]; describe("Teleporting Hijinks - Mystery Encounter", () => { let phaserGame: Phaser.Game; @@ -47,9 +51,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { .enemyPassiveAbility(Abilities.BALL_FETCH); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.TELEPORTING_HIJINKS ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.TELEPORTING_HIJINKS]]]), ); }); @@ -115,8 +117,8 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { expect(TeleportingHijinksEncounter.onInit).toBeDefined(); - TeleportingHijinksEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + TeleportingHijinksEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(TeleportingHijinksEncounter.misc.price).toBeDefined(); expect(TeleportingHijinksEncounter.dialogueTokens.price).toBeDefined(); @@ -181,7 +183,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 0, 1, 0, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 1, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); @@ -190,7 +192,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 1, 1, 1, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 1, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); }); @@ -207,13 +209,13 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { selected: [ { text: `${namespace}:option.2.selected`, - } + }, ], }); }); it("should NOT be selectable if the player doesn't the right type pokemon", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.BLASTOISE ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.BLASTOISE]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -232,14 +234,14 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { }); it("should be selectable if the player has the right type pokemon", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.METAGROSS ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.METAGROSS]); await runMysteryEncounterToEnd(game, 2, undefined, true); expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); }); it("should transport to a new area", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.PIKACHU ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.PIKACHU]); const previousBiome = scene.arena.biomeType; @@ -250,19 +252,19 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { }); it("should start a battle against an enraged boss below wave 50", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.PIKACHU ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.PIKACHU]); await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 0, 1, 0, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 1, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); it("should start a battle against an extra enraged boss above wave 50", { retry: 5 }, async () => { game.override.startingWave(56); - await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [ Species.PIKACHU ]); + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.PIKACHU]); await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 1, 1, 1, 1, 1, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 1, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); }); @@ -287,7 +289,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); await runMysteryEncounterToEnd(game, 3, undefined, true); const enemyField = scene.getEnemyField(); - expect(enemyField[0].summonData.statStages).toEqual([ 0, 0, 0, 0, 0, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([0, 0, 0, 0, 0, 0, 0]); expect(enemyField[0].isBoss()).toBe(true); }); @@ -300,9 +302,19 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.some(opt => opt.modifierTypeOption.type.name === i18next.t("modifierType:AttackTypeBoosterItem.metal_coat"))).toBe(true); - expect(modifierSelectHandler.options.some(opt => opt.modifierTypeOption.type.name === i18next.t("modifierType:AttackTypeBoosterItem.magnet"))).toBe(true); + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect( + modifierSelectHandler.options.some( + opt => opt.modifierTypeOption.type.name === i18next.t("modifierType:AttackTypeBoosterItem.metal_coat"), + ), + ).toBe(true); + expect( + modifierSelectHandler.options.some( + opt => opt.modifierTypeOption.type.name === i18next.t("modifierType:AttackTypeBoosterItem.magnet"), + ), + ).toBe(true); }); }); }); diff --git a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts similarity index 83% rename from src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts rename to test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts index a3a43815ec6..9160126ffc3 100644 --- a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts @@ -3,13 +3,16 @@ import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-e import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; +import type 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 { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { CommandPhase } from "#app/phases/command-phase"; @@ -18,9 +21,10 @@ 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 ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -41,11 +45,9 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]); + const biomeMap = new Map([[Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER ]); + biomeMap.set(biome, [MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -64,15 +66,17 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { expect(TheExpertPokemonBreederEncounter.dialogue).toBeDefined(); expect(TheExpertPokemonBreederEncounter.dialogue.intro).toStrictEqual([ { - text: `${namespace}:intro` + text: `${namespace}:intro`, }, { speaker: "trainerNames:expert_pokemon_breeder", - text: `${namespace}:intro_dialogue` + text: `${namespace}:intro_dialogue`, }, ]); expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(TheExpertPokemonBreederEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(TheExpertPokemonBreederEncounter.options.length).toBe(3); }); @@ -82,7 +86,9 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe( + MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER, + ); }); it("should initialize fully", async () => { @@ -95,8 +101,8 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { expect(encounter.onInit).toBeDefined(); - encounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + encounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(encounter.enemyPartyConfigs).toBeDefined(); expect(encounter.enemyPartyConfigs.length).toBe(1); @@ -132,12 +138,15 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { const ace = scene.currentBattle?.enemyParty[0]; if (ace) { // Pretend that loading assets takes an extra 500ms - vi.spyOn(ace, "loadAssets").mockImplementation(() => new Promise(resolve => { - setTimeout(() => { - successfullyLoaded = true; - resolve(); - }, 500); - })); + vi.spyOn(ace, "loadAssets").mockImplementation( + () => + new Promise(resolve => { + setTimeout(() => { + successfullyLoaded = true; + resolve(); + }, 500); + }), + ); } return scene.currentBattle?.enemyParty ?? []; @@ -152,7 +161,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); - expect(scene.getParty().length).toBe(1); + expect(scene.getPlayerParty().length).toBe(1); }); it("Should reward the player with friendship and eggs based on pokemon selected", async () => { @@ -182,7 +191,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); }); }); @@ -211,12 +223,15 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { const ace = scene.currentBattle?.enemyParty[0]; if (ace) { // Pretend that loading assets takes an extra 500ms - vi.spyOn(ace, "loadAssets").mockImplementation(() => new Promise(resolve => { - setTimeout(() => { - successfullyLoaded = true; - resolve(); - }, 500); - })); + vi.spyOn(ace, "loadAssets").mockImplementation( + () => + new Promise(resolve => { + setTimeout(() => { + successfullyLoaded = true; + resolve(); + }, 500); + }), + ); } return scene.currentBattle?.enemyParty ?? []; @@ -231,7 +246,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); - expect(scene.getParty().length).toBe(1); + expect(scene.getPlayerParty().length).toBe(1); }); it("Should reward the player with friendship and eggs based on pokemon selected", async () => { @@ -261,7 +276,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 }); }); @@ -290,12 +305,15 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { const ace = scene.currentBattle?.enemyParty[0]; if (ace) { // Pretend that loading assets takes an extra 500ms - vi.spyOn(ace, "loadAssets").mockImplementation(() => new Promise(resolve => { - setTimeout(() => { - successfullyLoaded = true; - resolve(); - }, 500); - })); + vi.spyOn(ace, "loadAssets").mockImplementation( + () => + new Promise(resolve => { + setTimeout(() => { + successfullyLoaded = true; + resolve(); + }, 500); + }), + ); } return scene.currentBattle?.enemyParty ?? []; @@ -310,7 +328,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); - expect(scene.getParty().length).toBe(1); + expect(scene.getPlayerParty().length).toBe(1); }); it("Should reward the player with friendship and eggs based on pokemon selected", async () => { @@ -340,7 +358,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/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts similarity index 73% rename from src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts rename to test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts index 040381c4ac3..4adb8c6b076 100644 --- a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts @@ -2,21 +2,28 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; +import type 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 { initSceneWithoutEncounterPhase } from "#test/testUtils/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 ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -38,10 +45,10 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { game.override.disableTrainerWaves(); const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.THE_POKEMON_SALESMAN ]); + biomeMap.set(biome, [MysteryEncounterType.THE_POKEMON_SALESMAN]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -62,7 +69,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(dialogue).toBeDefined(); expect(dialogue.intro).toStrictEqual([ { text: `${namespace}:intro` }, - { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` } + { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` }, ]); const { title, description, query } = dialogue.encounterOptionsDialogue!; expect(title).toBe(`${namespace}:title`); @@ -87,8 +94,8 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(ThePokemonSalesmanEncounter.onInit).toBeDefined(); - ThePokemonSalesmanEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + ThePokemonSalesmanEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(ThePokemonSalesmanEncounter.dialogueTokens?.purchasePokemon).toBeDefined(); expect(ThePokemonSalesmanEncounter.dialogueTokens?.price).toBeDefined(); @@ -122,7 +129,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"); @@ -132,26 +139,38 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { const price = scene.currentBattle.mysteryEncounter!.misc.price; - expect(updateMoneySpy).toHaveBeenCalledWith(scene, -price, true, false); + expect(updateMoneySpy).toHaveBeenCalledWith(-price, true, false); 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); - const initialPartySize = scene.getParty().length; + const initialPartySize = scene.getPlayerParty().length; const pokemonName = scene.currentBattle.mysteryEncounter!.misc.pokemon.name; await runMysteryEncounterToEnd(game, 1); - expect(scene.getParty().length).toBe(initialPartySize + 1); + expect(scene.getPlayerParty().length).toBe(initialPartySize + 1); - const newlyPurchasedPokemon = scene.getParty()[scene.getParty().length - 1]; + const newlyPurchasedPokemon = scene.getPlayerParty()[scene.getPlayerParty().length - 1]; expect(newlyPurchasedPokemon.name).toBe(pokemonName); 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 +191,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/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts similarity index 81% rename from src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts rename to test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index 4d95ff31d36..57d55af5dac 100644 --- a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -1,17 +1,20 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; -import { Biome } from "#app/enums/biome"; -import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; -import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import { Biome } from "#enums/biome"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; -import { Nature } from "#app/data/nature"; +import { Nature } from "#enums/nature"; import { BerryType } from "#enums/berry-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { PokemonMove } from "#app/field/pokemon"; @@ -20,15 +23,15 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { BerryModifier, PokemonBaseStatTotalModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; -import { Abilities } from "#app/enums/abilities"; +import { Abilities } from "#enums/abilities"; const namespace = "mysteryEncounters/theStrongStuff"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -54,9 +57,9 @@ describe("The Strong Stuff - Mystery Encounter", () => { vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [ Biome.CAVE, [ MysteryEncounterType.THE_STRONG_STUFF ]], - [ Biome.MOUNTAIN, [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS ]], - ]) + [Biome.CAVE, [MysteryEncounterType.THE_STRONG_STUFF]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]), ); }); @@ -97,8 +100,8 @@ describe("The Strong Stuff - Mystery Encounter", () => { expect(TheStrongStuffEncounter.onInit).toBeDefined(); - TheStrongStuffEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + TheStrongStuffEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(TheStrongStuffEncounter.enemyPartyConfigs).toEqual([ { @@ -109,15 +112,16 @@ 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 ], + moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], modifierConfigs: expect.any(Array), - tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], - mysteryEncounterBattleEffects: expect.any(Function) - } + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: expect.any(Function), + }, ], - } + }, ]); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); @@ -143,10 +147,10 @@ describe("The Strong Stuff - Mystery Encounter", () => { it("should lower stats of 2 highest BST and raise stats for rest of party", async () => { await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); - const bstsPrior = scene.getParty().map(p => p.getSpeciesForm().getBaseStatTotal()); + const bstsPrior = scene.getPlayerParty().map(p => p.getSpeciesForm().getBaseStatTotal()); await runMysteryEncounterToEnd(game, 1); - const bstsAfter = scene.getParty().map(p => { + const bstsAfter = scene.getPlayerParty().map(p => { const baseStats = p.getSpeciesForm().baseStats.slice(0); scene.applyModifiers(PokemonBaseStatTotalModifier, true, p, baseStats); return baseStats.reduce((a, b) => a + b); @@ -194,15 +198,28 @@ describe("The Strong Stuff - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.SHUCKLE); - expect(enemyField[0].summonData.statStages).toEqual([ 0, 2, 0, 2, 0, 0, 0 ]); + expect(enemyField[0].summonData.statStages).toEqual([0, 2, 0, 2, 0, 0, 0]); const shuckleItems = enemyField[0].getHeldItems(); expect(shuckleItems.length).toBe(5); - expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.SITRUS)?.stackCount).toBe(1); - expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.ENIGMA)?.stackCount).toBe(1); - expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.GANLON)?.stackCount).toBe(1); - expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.APICOT)?.stackCount).toBe(1); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.SITRUS)?.stackCount).toBe( + 1, + ); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.ENIGMA)?.stackCount).toBe( + 1, + ); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.GANLON)?.stackCount).toBe( + 1, + ); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.APICOT)?.stackCount).toBe( + 1, + ); expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.LUM)?.stackCount).toBe(2); - expect(enemyField[0].moveset).toEqual([ new PokemonMove(Moves.INFESTATION), new PokemonMove(Moves.SALT_CURE), new PokemonMove(Moves.GASTRO_ACID), new PokemonMove(Moves.HEAL_ORDER) ]); + expect(enemyField[0].moveset).toEqual([ + new PokemonMove(Moves.INFESTATION), + new PokemonMove(Moves.SALT_CURE), + new PokemonMove(Moves.GASTRO_ACID), + new PokemonMove(Moves.HEAL_ORDER), + ]); // Should have used moves pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -220,7 +237,9 @@ describe("The Strong Stuff - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("SOUL_DEW"); }); diff --git a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts similarity index 80% rename from src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts rename to test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts index 2653b76ab7c..94c8141aa1e 100644 --- a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts +++ b/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts @@ -1,16 +1,16 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; -import { Biome } from "#app/enums/biome"; -import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; -import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import { Biome } from "#enums/biome"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; @@ -19,15 +19,16 @@ import { Nature } from "#enums/nature"; import { Moves } from "#enums/moves"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { TheWinstrateChallengeEncounter } from "#app/data/mystery-encounters/encounters/the-winstrate-challenge-encounter"; -import { Status, StatusEffect } from "#app/data/status-effect"; +import { Status } from "#app/data/status-effect"; import { MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import { CommandPhase } from "#app/phases/command-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { PartyHealPhase } from "#app/phases/party-heal-phase"; import { VictoryPhase } from "#app/phases/victory-phase"; +import { StatusEffect } from "#enums/status-effect"; const namespace = "mysteryEncounters/theWinstrateChallenge"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -48,11 +49,9 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - const biomeMap = new Map([ - [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], - ]); + const biomeMap = new Map([[Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]]]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [ MysteryEncounterType.THE_WINSTRATE_CHALLENGE ]); + biomeMap.set(biome, [MysteryEncounterType.THE_WINSTRATE_CHALLENGE]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -74,10 +73,12 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue`, - } + }, ]); expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); - expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.description).toBe( + `${namespace}:description`, + ); expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); expect(TheWinstrateChallengeEncounter.options.length).toBe(2); }); @@ -100,8 +101,8 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { expect(encounter.onInit).toBeDefined(); - encounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + encounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(encounter.enemyPartyConfigs).toBeDefined(); expect(encounter.enemyPartyConfigs.length).toBe(5); @@ -114,42 +115,42 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, abilityIndex: 0, // Soundproof nature: Nature.MODEST, - moveSet: [ Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.SWALOT), isBoss: false, abilityIndex: 2, // Gluttony nature: Nature.QUIET, - moveSet: [ Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.DODRIO), isBoss: false, abilityIndex: 2, // Tangled Feet nature: Nature.JOLLY, - moveSet: [ Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.ALAKAZAM), isBoss: false, formIndex: 1, nature: Nature.BOLD, - moveSet: [ Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.DARMANITAN), isBoss: false, abilityIndex: 0, // Sheer Force nature: Nature.IMPISH, - moveSet: [ Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE ], - modifierConfigs: expect.any(Array) - } - ] + moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE], + modifierConfigs: expect.any(Array), + }, + ], }, { trainerType: TrainerType.VICKY, @@ -159,10 +160,10 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, formIndex: 1, nature: Nature.IMPISH, - moveSet: [ Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH ], - modifierConfigs: expect.any(Array) - } - ] + moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH], + modifierConfigs: expect.any(Array), + }, + ], }, { trainerType: TrainerType.VIVI, @@ -172,26 +173,26 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, abilityIndex: 3, // Lightning Rod nature: Nature.ADAMANT, - moveSet: [ Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.BRELOOM), isBoss: false, abilityIndex: 1, // Poison Heal nature: Nature.JOLLY, - moveSet: [ Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.CAMERUPT), isBoss: false, formIndex: 1, nature: Nature.CALM, - moveSet: [ Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT ], - modifierConfigs: expect.any(Array) - } - ] + moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT], + modifierConfigs: expect.any(Array), + }, + ], }, { trainerType: TrainerType.VICTORIA, @@ -201,18 +202,18 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, abilityIndex: 0, // Natural Cure nature: Nature.CALM, - moveSet: [ Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.GARDEVOIR), isBoss: false, formIndex: 1, nature: Nature.TIMID, - moveSet: [ Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP ], - modifierConfigs: expect.any(Array) - } - ] + moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP], + modifierConfigs: expect.any(Array), + }, + ], }, { trainerType: TrainerType.VICTOR, @@ -222,19 +223,19 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { isBoss: false, abilityIndex: 0, // Guts nature: Nature.ADAMANT, - moveSet: [ Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK ], - modifierConfigs: expect.any(Array) + moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK], + modifierConfigs: expect.any(Array), }, { species: getPokemonSpecies(Species.OBSTAGOON), isBoss: false, abilityIndex: 1, // Guts nature: Nature.ADAMANT, - moveSet: [ Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH ], - modifierConfigs: expect.any(Array) - } - ] - } + moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH], + modifierConfigs: expect.any(Array), + }, + ], + }, ]); expect(encounter.spriteConfigs).toBeDefined(); expect(encounter.spriteConfigs.length).toBe(5); @@ -299,7 +300,9 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MYSTERY_ENCOUNTER_MACHO_BRACE"); }, 15000); @@ -339,7 +342,9 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(1); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("RARER_CANDY"); }); @@ -351,7 +356,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { * @param game * @param isFinalBattle */ -async function skipBattleToNextBattle(game: GameManager, isFinalBattle: boolean = false) { +async function skipBattleToNextBattle(game: GameManager, isFinalBattle = false) { game.scene.clearPhaseQueue(); game.scene.clearPhaseQueueSplice(); const commandUiHandler = game.scene.ui.handlers[Mode.COMMAND]; @@ -362,7 +367,7 @@ async function skipBattleToNextBattle(game: GameManager, isFinalBattle: boolean game.scene.field.remove(p); }); game.phaseInterceptor["onHold"] = []; - game.scene.pushPhase(new VictoryPhase(game.scene, 0)); + game.scene.pushPhase(new VictoryPhase(0)); game.phaseInterceptor.superEndPhase(); if (isFinalBattle) { await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); diff --git a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts similarity index 81% rename from src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts rename to test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index 8286c6a694b..90e2312e624 100644 --- a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -2,21 +2,24 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { HitHealModifier, HealShopCostModifier, TurnHealModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; @@ -24,7 +27,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; const namespace = "mysteryEncounters/trashToTreasure"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -46,9 +49,7 @@ describe("Trash to Treasure - Mystery Encounter", () => { game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.TRASH_TO_TREASURE ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.TRASH_TO_TREASURE]]]), ); }); @@ -81,8 +82,8 @@ describe("Trash to Treasure - Mystery Encounter", () => { expect(TrashToTreasureEncounter.onInit).toBeDefined(); - TrashToTreasureEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + TrashToTreasureEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(TrashToTreasureEncounter.enemyPartyConfigs).toEqual([ { @@ -92,12 +93,13 @@ 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 ], - } + moveSet: [Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH], + }, ], - } + }, ]); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); @@ -175,7 +177,12 @@ describe("Trash to Treasure - Mystery Encounter", () => { expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.GARBODOR); - expect(enemyField[0].moveset).toEqual([ new PokemonMove(Moves.PAYBACK), new PokemonMove(Moves.GUNK_SHOT), new PokemonMove(Moves.STOMPING_TANTRUM), new PokemonMove(Moves.DRAIN_PUNCH) ]); + expect(enemyField[0].moveset).toEqual([ + new PokemonMove(Moves.PAYBACK), + new PokemonMove(Moves.GUNK_SHOT), + new PokemonMove(Moves.STOMPING_TANTRUM), + new PokemonMove(Moves.DRAIN_PUNCH), + ]); // Should have used moves pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -193,12 +200,26 @@ describe("Trash to Treasure - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(4); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.GREAT); }); }); }); diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts similarity index 88% rename from src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts rename to test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index fa1b5ecdeb7..452dfcf3784 100644 --- a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -2,15 +2,18 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; +import { + runMysteryEncounterToEnd, + runSelectMysteryEncounterOption, +} from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; @@ -22,12 +25,12 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import { BerryType } from "#enums/berry-type"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { Stat } from "#enums/stat"; -import { BerryModifier } from "#app/modifier/modifier"; +import type { BerryModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; import { Abilities } from "#enums/abilities"; const namespace = "mysteryEncounters/uncommonBreed"; -const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -43,7 +46,8 @@ describe("Uncommon Breed - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); scene = game.scene; - game.override.mysteryEncounterChance(100) + game.override + .mysteryEncounterChance(100) .mysteryEncounterTier(MysteryEncounterTier.COMMON) .startingWave(defaultWave) .startingBiome(defaultBiome) @@ -52,9 +56,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { .enemyPassiveAbility(Abilities.BALL_FETCH); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.UNCOMMON_BREED ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.UNCOMMON_BREED]]]), ); }); @@ -85,8 +87,8 @@ describe("Uncommon Breed - Mystery Encounter", () => { expect(UncommonBreedEncounter.onInit).toBeDefined(); - UncommonBreedEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + UncommonBreedEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); const config = UncommonBreedEncounter.enemyPartyConfigs[0]; expect(config).toBeDefined(); @@ -116,7 +118,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); const config = game.scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; - const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId; + const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId!; await runMysteryEncounterToEnd(game, 1, undefined, true); @@ -126,7 +128,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); const statStagePhases = unshiftPhaseSpy.mock.calls.filter(p => p[0] instanceof StatStageChangePhase)[0][0] as any; - expect(statStagePhases.stats).toEqual([ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]); + expect(statStagePhases.stats).toEqual([Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]); // Should have used its egg move pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -143,7 +145,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); const config = game.scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]; - const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId; + const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId!; await runMysteryEncounterToEnd(game, 1, undefined, true); @@ -153,7 +155,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); const statStagePhases = unshiftPhaseSpy.mock.calls.filter(p => p[0] instanceof StatStageChangePhase)[0][0] as any; - expect(statStagePhases.stats).toEqual([ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]); + expect(statStagePhases.stats).toEqual([Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD]); // Should have used its egg move pre-battle const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -176,7 +178,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { selected: [ { text: `${namespace}:option.2.selected`, - } + }, ], }); }); @@ -213,14 +215,14 @@ describe("Uncommon Breed - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); // Berries on party lead - const sitrus = generateModifierType(scene, modifierTypes.BERRY, [ BerryType.SITRUS ])!; - const sitrusMod = sitrus.newModifier(scene.getParty()[0]) as BerryModifier; + const sitrus = generateModifierType(modifierTypes.BERRY, [BerryType.SITRUS])!; + const sitrusMod = sitrus.newModifier(scene.getPlayerParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; - await scene.addModifier(sitrusMod, true, false, false, true); - const ganlon = generateModifierType(scene, modifierTypes.BERRY, [ BerryType.GANLON ])!; - const ganlonMod = ganlon.newModifier(scene.getParty()[0]) as BerryModifier; + scene.addModifier(sitrusMod, true, false, false, true); + const ganlon = generateModifierType(modifierTypes.BERRY, [BerryType.GANLON])!; + const ganlonMod = ganlon.newModifier(scene.getPlayerParty()[0]) as BerryModifier; ganlonMod.stackCount = 3; - await scene.addModifier(ganlonMod, true, false, false, true); + scene.addModifier(ganlonMod, true, false, false, true); await scene.updateModifiers(true); await runMysteryEncounterToEnd(game, 2); @@ -241,14 +243,14 @@ describe("Uncommon Breed - Mystery Encounter", () => { selected: [ { text: `${namespace}:option.3.selected`, - } + }, ], }); }); it("should NOT be selectable if the player doesn't have an Attracting move", async () => { await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); - scene.getParty().forEach(p => p.moveset = []); + scene.getPlayerParty().forEach(p => (p.moveset = [])); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -270,7 +272,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.UNCOMMON_BREED, defaultParty); // Mock moveset - scene.getParty()[0].moveset = [ new PokemonMove(Moves.CHARM) ]; + scene.getPlayerParty()[0].moveset = [new PokemonMove(Moves.CHARM)]; await runMysteryEncounterToEnd(game, 3); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); diff --git a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts similarity index 78% rename from src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts rename to test/mystery-encounter/encounters/weird-dream-encounter.test.ts index c1fa6d83a18..fbb88e346a8 100644 --- a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -2,16 +2,19 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { Biome } from "#app/enums/biome"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; -import BattleScene from "#app/battle-scene"; +import { + runMysteryEncounterToEnd, + skipBattleRunMysteryEncounterRewardsPhase, +} from "#test/mystery-encounter/encounter-test-utils"; +import type BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; import { WeirdDreamEncounter } from "#app/data/mystery-encounters/encounters/weird-dream-encounter"; import * as EncounterTransformationSequence from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; @@ -19,7 +22,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { ModifierTier } from "#app/modifier/modifier-tier"; const namespace = "mysteryEncounters/weirdDream"; -const defaultParty = [ Species.MAGBY, Species.HAUNTER, Species.ABRA ]; +const defaultParty = [Species.MAGBY, Species.HAUNTER, Species.ABRA]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -39,12 +42,12 @@ describe("Weird Dream - Mystery Encounter", () => { game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(); - vi.spyOn(EncounterTransformationSequence, "doPokemonTransformationSequence").mockImplementation(() => new Promise(resolve => resolve())); + vi.spyOn(EncounterTransformationSequence, "doPokemonTransformationSequence").mockImplementation( + () => new Promise(resolve => resolve()), + ); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([ - [ Biome.CAVE, [ MysteryEncounterType.WEIRD_DREAM ]], - ]) + new Map([[Biome.CAVE, [MysteryEncounterType.WEIRD_DREAM]]]), ); }); @@ -62,7 +65,7 @@ describe("Weird Dream - Mystery Encounter", () => { expect(WeirdDreamEncounter.dialogue).toBeDefined(); expect(WeirdDreamEncounter.dialogue.intro).toStrictEqual([ { - text: `${namespace}:intro` + text: `${namespace}:intro`, }, { speaker: `${namespace}:speaker`, @@ -84,8 +87,8 @@ describe("Weird Dream - Mystery Encounter", () => { expect(WeirdDreamEncounter.onInit).toBeDefined(); - WeirdDreamEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit!(scene); + WeirdDreamEncounter.populateDialogueTokensFromRequirements(); + const onInitResult = onInit!(); expect(loadBgmSpy).toHaveBeenCalled(); expect(onInitResult).toBe(true); @@ -110,14 +113,14 @@ describe("Weird Dream - Mystery Encounter", () => { it("should transform the new party into new species, 2 at +90/+110, the rest at +40/50 BST", async () => { await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); - const pokemonPrior = scene.getParty().map(pokemon => pokemon); + const pokemonPrior = scene.getPlayerParty().map(pokemon => pokemon); const bstsPrior = pokemonPrior.map(species => species.getSpeciesForm().getBaseStatTotal()); await runMysteryEncounterToEnd(game, 1); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); - const pokemonAfter = scene.getParty(); + const pokemonAfter = scene.getPlayerParty(); const bstsAfter = pokemonAfter.map(pokemon => pokemon.getSpeciesForm().getBaseStatTotal()); const bstDiff = bstsAfter.map((bst, index) => bst - bstsPrior[index]); @@ -142,7 +145,9 @@ describe("Weird Dream - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(5); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("ROGUE_BALL"); @@ -184,7 +189,7 @@ describe("Weird Dream - Mystery Encounter", () => { const enemyField = scene.getEnemyField(); expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); - expect(scene.getEnemyParty().length).toBe(scene.getParty().length); + expect(scene.getEnemyParty().length).toBe(scene.getPlayerParty().length); }); it("should have 2 Rogue/2 Ultra/2 Great items in rewards", async () => { @@ -196,14 +201,34 @@ describe("Weird Dream - Mystery Encounter", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; expect(modifierSelectHandler.options.length).toEqual(6); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); - expect(modifierSelectHandler.options[4].modifierTypeOption.type.tier - modifierSelectHandler.options[4].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); - expect(modifierSelectHandler.options[5].modifierTypeOption.type.tier - modifierSelectHandler.options[5].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[4].modifierTypeOption.type.tier - + modifierSelectHandler.options[4].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[5].modifierTypeOption.type.tier - + modifierSelectHandler.options[5].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.GREAT); }); }); @@ -227,14 +252,14 @@ describe("Weird Dream - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); - const levelsPrior = scene.getParty().map(p => p.level); + const levelsPrior = scene.getPlayerParty().map(p => p.level); await runMysteryEncounterToEnd(game, 3); - const levelsAfter = scene.getParty().map(p => p.level); + const levelsAfter = scene.getPlayerParty().map(p => p.level); for (let i = 0; i < levelsPrior.length; i++) { expect(Math.max(Math.ceil(0.9 * levelsPrior[i]), 1)).toBe(levelsAfter[i]); - expect(scene.getParty()[i].levelExp).toBe(0); + expect(scene.getPlayerParty()[i].levelExp).toBe(0); } expect(leaveEncounterWithoutBattleSpy).toBeCalled(); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/test/mystery-encounter/mystery-encounter-utils.test.ts similarity index 64% rename from src/test/mystery-encounter/mystery-encounter-utils.test.ts rename to test/mystery-encounter/mystery-encounter-utils.test.ts index 134966a188d..1c4a2cf89bd 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -1,17 +1,28 @@ -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; -import Phaser from "phaser"; -import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; -import { Species } from "#enums/species"; -import BattleScene from "#app/battle-scene"; -import { StatusEffect } from "#app/data/status-effect"; -import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; +import type BattleScene from "#app/battle-scene"; import { speciesStarterCosts } from "#app/data/balance/starters"; -import { Type } from "#app/data/type"; -import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPlayerPokemon, getRandomSpeciesByStarterTier, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { getEncounterText, queueEncounterMessage, showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +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, + getRandomSpeciesByStarterCost, + koPlayerPokemon, +} from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { PokemonType } from "#enums/pokemon-type"; import { MessagePhase } from "#app/phases/message-phase"; +import GameManager from "#test/testUtils/gameManager"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Mystery Encounter Utils", () => { let phaserGame: Phaser.Game; @@ -31,7 +42,7 @@ describe("Mystery Encounter Utils", () => { beforeEach(() => { game = new GameManager(phaserGame); scene = game.scene; - initSceneWithoutEncounterPhase(game.scene, [ Species.ARCEUS, Species.MANAPHY ]); + initSceneWithoutEncounterPhase(game.scene, [Species.ARCEUS, Species.MANAPHY]); }); describe("getRandomPlayerPokemon", () => { @@ -39,174 +50,174 @@ describe("Mystery Encounter Utils", () => { // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); - let result = getRandomPlayerPokemon(scene); + let result = getRandomPlayerPokemon(); expect(result.species.speciesId).toBe(Species.MANAPHY); game.override.seed("random2"); - result = getRandomPlayerPokemon(scene); + result = getRandomPlayerPokemon(); expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("gets a fainted pokemon from player party if isAllowedInBattle is false", () => { + it("gets a fainted pokemon from player party if isAllowedInBattle is false", async () => { // Both pokemon fainted - scene.getParty().forEach(p => { + scene.getPlayerParty().forEach(p => { p.hp = 0; p.trySetStatus(StatusEffect.FAINT); - p.updateInfo(); + void p.updateInfo(); }); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); - let result = getRandomPlayerPokemon(scene); + let result = getRandomPlayerPokemon(); expect(result.species.speciesId).toBe(Species.MANAPHY); game.override.seed("random2"); - result = getRandomPlayerPokemon(scene); + result = getRandomPlayerPokemon(); expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("gets an unfainted legal pokemon from player party if isAllowed is true and isFainted is false", () => { + it("gets an unfainted legal pokemon from player party if isAllowed is true and isFainted is false", async () => { // Only faint 1st pokemon - const party = scene.getParty(); + const party = scene.getPlayerParty(); party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); - let result = getRandomPlayerPokemon(scene, true); + let result = getRandomPlayerPokemon(true); expect(result.species.speciesId).toBe(Species.MANAPHY); game.override.seed("random2"); - result = getRandomPlayerPokemon(scene, true); + result = getRandomPlayerPokemon(true); expect(result.species.speciesId).toBe(Species.MANAPHY); }); - it("returns last unfainted pokemon if doNotReturnLastAbleMon is false", () => { + it("returns last unfainted pokemon if doNotReturnLastAbleMon is false", async () => { // Only faint 1st pokemon - const party = scene.getParty(); + const party = scene.getPlayerParty(); party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); - let result = getRandomPlayerPokemon(scene, true, false); + let result = getRandomPlayerPokemon(true, false); expect(result.species.speciesId).toBe(Species.MANAPHY); game.override.seed("random2"); - result = getRandomPlayerPokemon(scene, true, false); + result = getRandomPlayerPokemon(true, false); expect(result.species.speciesId).toBe(Species.MANAPHY); }); - it("never returns last unfainted pokemon if doNotReturnLastAbleMon is true", () => { + it("never returns last unfainted pokemon if doNotReturnLastAbleMon is true", async () => { // Only faint 1st pokemon - const party = scene.getParty(); + const party = scene.getPlayerParty(); party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); - let result = getRandomPlayerPokemon(scene, true, false, true); + let result = getRandomPlayerPokemon(true, false, true); expect(result.species.speciesId).toBe(Species.ARCEUS); game.override.seed("random2"); - result = getRandomPlayerPokemon(scene, true, false, true); + result = getRandomPlayerPokemon(true, false, true); expect(result.species.speciesId).toBe(Species.ARCEUS); }); }); describe("getHighestLevelPlayerPokemon", () => { it("gets highest level pokemon", () => { - const party = scene.getParty(); + const party = scene.getPlayerParty(); party[0].level = 100; - const result = getHighestLevelPlayerPokemon(scene); + const result = getHighestLevelPlayerPokemon(); expect(result.species.speciesId).toBe(Species.ARCEUS); }); it("gets highest level pokemon at different index", () => { - const party = scene.getParty(); + const party = scene.getPlayerParty(); party[1].level = 100; - const result = getHighestLevelPlayerPokemon(scene); + const result = getHighestLevelPlayerPokemon(); expect(result.species.speciesId).toBe(Species.MANAPHY); }); it("breaks ties by getting returning lower index", () => { - const party = scene.getParty(); + const party = scene.getPlayerParty(); party[0].level = 100; party[1].level = 100; - const result = getHighestLevelPlayerPokemon(scene); + const result = getHighestLevelPlayerPokemon(); expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("returns highest level unfainted if unfainted is true", () => { - const party = scene.getParty(); + it("returns highest level unfainted if unfainted is true", async () => { + const party = scene.getPlayerParty(); party[0].level = 100; party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); party[1].level = 10; - const result = getHighestLevelPlayerPokemon(scene, true); + const result = getHighestLevelPlayerPokemon(true); expect(result.species.speciesId).toBe(Species.MANAPHY); }); }); describe("getLowestLevelPokemon", () => { it("gets lowest level pokemon", () => { - const party = scene.getParty(); + const party = scene.getPlayerParty(); party[0].level = 100; - const result = getLowestLevelPlayerPokemon(scene); + const result = getLowestLevelPlayerPokemon(); expect(result.species.speciesId).toBe(Species.MANAPHY); }); it("gets lowest level pokemon at different index", () => { - const party = scene.getParty(); + const party = scene.getPlayerParty(); party[1].level = 100; - const result = getLowestLevelPlayerPokemon(scene); + const result = getLowestLevelPlayerPokemon(); expect(result.species.speciesId).toBe(Species.ARCEUS); }); it("breaks ties by getting returning lower index", () => { - const party = scene.getParty(); + const party = scene.getPlayerParty(); party[0].level = 100; party[1].level = 100; - const result = getLowestLevelPlayerPokemon(scene); + const result = getLowestLevelPlayerPokemon(); expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("returns lowest level unfainted if unfainted is true", () => { - const party = scene.getParty(); + it("returns lowest level unfainted if unfainted is true", async () => { + const party = scene.getPlayerParty(); party[0].level = 10; party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); party[1].level = 100; - const result = getLowestLevelPlayerPokemon(scene, true); + const result = getLowestLevelPlayerPokemon(true); expect(result.species.speciesId).toBe(Species.MANAPHY); }); }); - 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 +225,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); @@ -223,15 +234,23 @@ 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 ]); + // Only 9 tiers are: Kyogre, Groudon, Rayquaza, Arceus, Zacian, Koraidon, Miraidon, Terapagos + const result = getRandomSpeciesByStarterCost(9, [ + Species.KYOGRE, + Species.GROUDON, + Species.RAYQUAZA, + Species.ARCEUS, + Species.KORAIDON, + Species.MIRAIDON, + Species.TERAPAGOS, + ]); 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 ]); + // Only 9 tiers are: Kyogre, Groudon, Rayquaza, Arceus, Zacian, Koraidon, Miraidon, Terapagos + const result = getRandomSpeciesByStarterCost(9, undefined, [PokemonType.GROUND]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.GROUDON); }); @@ -239,12 +258,12 @@ describe("Mystery Encounter Utils", () => { describe("koPlayerPokemon", () => { it("KOs a pokemon", () => { - const party = scene.getParty(); + const party = scene.getPlayerParty(); const arceus = party[0]; arceus.hp = 100; expect(arceus.isAllowedInBattle()).toBe(true); - koPlayerPokemon(scene, arceus); + koPlayerPokemon(arceus); expect(arceus.isAllowedInBattle()).toBe(false); }); }); @@ -254,7 +273,7 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); - const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); + const result = getEncounterText("mysteryEncounter:unit_test_dialogue"); expect(result).toEqual("mysteryEncounter:unit_test_dialogue"); }); @@ -263,7 +282,7 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); scene.currentBattle.mysteryEncounter.setDialogueToken("testvalue", "new"); - const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); + const result = getEncounterText("mysteryEncounter:unit_test_dialogue"); expect(result).toEqual("mysteryEncounter:unit_test_dialogue"); }); }); @@ -275,7 +294,7 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene, "queueMessage"); const phaseSpy = vi.spyOn(game.scene, "unshiftPhase"); - queueEncounterMessage(scene, "mysteryEncounter:unit_test_dialogue"); + queueEncounterMessage("mysteryEncounter:unit_test_dialogue"); expect(spy).toHaveBeenCalledWith("mysteryEncounter:unit_test_dialogue", null, true); expect(phaseSpy).toHaveBeenCalledWith(expect.any(MessagePhase)); }); @@ -287,8 +306,15 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const spy = vi.spyOn(game.scene.ui, "showText"); - await showEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("mysteryEncounter:unit_test_dialogue", null, expect.any(Function), 0, true, null); + await showEncounterText("mysteryEncounter:unit_test_dialogue"); + expect(spy).toHaveBeenCalledWith( + "mysteryEncounter:unit_test_dialogue", + null, + expect.any(Function), + 0, + true, + null, + ); }); }); @@ -298,9 +324,14 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const spy = vi.spyOn(game.scene.ui, "showDialogue"); - await showEncounterDialogue(scene, "mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue", null, expect.any(Function), 0); + await showEncounterDialogue("mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue"); + expect(spy).toHaveBeenCalledWith( + "mysteryEncounter:unit_test_dialogue", + "mysteryEncounter:unit_test_dialogue", + null, + expect.any(Function), + 0, + ); }); }); }); - diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/test/mystery-encounter/mystery-encounter.test.ts similarity index 89% rename from src/test/mystery-encounter/mystery-encounter.test.ts rename to test/mystery-encounter/mystery-encounter.test.ts index eaf6e04a639..c9d31f28717 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/test/mystery-encounter/mystery-encounter.test.ts @@ -1,10 +1,10 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; describe("Mystery Encounters", () => { let phaserGame: Phaser.Game; @@ -29,7 +29,10 @@ describe("Mystery Encounters", () => { }); it("Spawns a mystery encounter", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ Species.CHARIZARD, Species.VOLCARONA ]); + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ + Species.CHARIZARD, + Species.VOLCARONA, + ]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); expect(game.scene.getCurrentPhase()!.constructor.name).toBe(MysteryEncounterPhase.name); @@ -51,4 +54,3 @@ describe("Mystery Encounters", () => { expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); }); }); - diff --git a/test/phases/form-change-phase.test.ts b/test/phases/form-change-phase.test.ts new file mode 100644 index 00000000000..deac21ed0dd --- /dev/null +++ b/test/phases/form-change-phase.test.ts @@ -0,0 +1,60 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { PokemonType } from "#enums/pokemon-type"; +import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { modifierTypes } from "#app/modifier/modifier-type"; + +describe("Form Change Phase", () => { + 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]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("Zacian should successfully change into Crowned form", async () => { + await game.classicMode.startBattle([Species.ZACIAN]); + + // Before the form change: Should be Hero form + const zacian = game.scene.getPlayerParty()[0]; + expect(zacian.getFormKey()).toBe("hero-of-many-battles"); + expect(zacian.getTypes()).toStrictEqual([PokemonType.FAIRY]); + expect(zacian.calculateBaseStats()).toStrictEqual([92, 120, 115, 80, 115, 138]); + + // Give Zacian a Rusted Sword + const rustedSwordType = generateModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM)!; + const rustedSword = rustedSwordType.newModifier(zacian); + await game.scene.addModifier(rustedSword); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + // After the form change: Should be Crowned form + expect(game.phaseInterceptor.log.includes("FormChangePhase")).toBe(true); + expect(zacian.getFormKey()).toBe("crowned"); + expect(zacian.getTypes()).toStrictEqual([PokemonType.FAIRY, PokemonType.STEEL]); + expect(zacian.calculateBaseStats()).toStrictEqual([92, 150, 115, 80, 115, 148]); + }); +}); diff --git a/test/phases/frenzy-move-reset.test.ts b/test/phases/frenzy-move-reset.test.ts new file mode 100644 index 00000000000..2f628f8a8c4 --- /dev/null +++ b/test/phases/frenzy-move-reset.test.ts @@ -0,0 +1,72 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { StatusEffect } from "#enums/status-effect"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; + +describe("Frenzy Move Reset", () => { + 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") + .disableCrits() + .starterSpecies(Species.MAGIKARP) + .moveset(Moves.THRASH) + .statusEffect(StatusEffect.PARALYSIS) + .enemyMoveset(Moves.SPLASH) + .enemyLevel(100) + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.BALL_FETCH); + }); + + /* + * Thrash (or frenzy moves in general) should not continue to run if attack fails due to paralysis + * + * This is a 3-turn Thrash test: + * 1. Thrash is selected and succeeds to hit the enemy -> Enemy Faints + * + * 2. Thrash is automatically selected but misses due to paralysis + * Note: After missing the Pokemon should stop automatically attacking + * + * 3. At the start of the 3rd turn the Player should be able to select a move/switch Pokemon/etc. + * Note: This means that BattlerTag.FRENZY is not anymore in pokemon.summonData.tags and pokemon.summonData.moveQueue is empty + * + */ + it("should cancel frenzy move if move fails turn 2", async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.THRASH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceStatusActivation(false); + await game.toNextTurn(); + + expect(playerPokemon.summonData.moveQueue.length).toBe(2); + expect(playerPokemon.summonData.tags.some(tag => tag.tagType === BattlerTagType.FRENZY)).toBe(true); + + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.move.forceStatusActivation(true); + await game.toNextTurn(); + + expect(playerPokemon.summonData.moveQueue.length).toBe(0); + expect(playerPokemon.summonData.tags.some(tag => tag.tagType === BattlerTagType.FRENZY)).toBe(false); + }); +}); diff --git a/test/phases/game-over-phase.test.ts b/test/phases/game-over-phase.test.ts new file mode 100644 index 00000000000..438efc85167 --- /dev/null +++ b/test/phases/game-over-phase.test.ts @@ -0,0 +1,77 @@ +import { Biome } from "#enums/biome"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { achvs } from "#app/system/achv"; +import { Unlockables } from "#app/system/unlockables"; + +describe("Game Over Phase", () => { + 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.MEMENTO, Moves.ICE_BEAM, Moves.SPLASH]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH) + .startingWave(200) + .startingBiome(Biome.END) + .startingLevel(10000); + }); + + it("winning a run should give rewards", async () => { + await game.classicMode.startBattle([Species.BULBASAUR]); + vi.spyOn(game.scene, "validateAchv"); + + // Note: `game.doKillOpponents()` does not properly handle final boss + // Final boss phase 1 + game.move.select(Moves.ICE_BEAM); + await game.toNextTurn(); + + // Final boss phase 2 + game.move.select(Moves.ICE_BEAM); + await game.phaseInterceptor.to("PostGameOverPhase", false); + + // The game refused to actually give the vouchers during tests, + // so the best we can do is to check that their reward phases occurred. + expect(game.phaseInterceptor.log.includes("GameOverPhase")).toBe(true); + expect(game.phaseInterceptor.log.includes("UnlockPhase")).toBe(true); + expect(game.phaseInterceptor.log.includes("RibbonModifierRewardPhase")).toBe(true); + expect(game.scene.gameData.unlocks[Unlockables.ENDLESS_MODE]).toBe(true); + expect(game.scene.validateAchv).toHaveBeenCalledWith(achvs.CLASSIC_VICTORY); + expect(game.scene.gameData.achvUnlocks[achvs.CLASSIC_VICTORY.id]).toBeTruthy(); + }); + + it("losing a run should not give rewards", async () => { + await game.classicMode.startBattle([Species.BULBASAUR]); + vi.spyOn(game.scene, "validateAchv"); + + game.move.select(Moves.MEMENTO); + await game.phaseInterceptor.to("PostGameOverPhase", false); + + expect(game.phaseInterceptor.log.includes("GameOverPhase")).toBe(true); + expect(game.phaseInterceptor.log.includes("UnlockPhase")).toBe(false); + expect(game.phaseInterceptor.log.includes("RibbonModifierRewardPhase")).toBe(false); + expect(game.phaseInterceptor.log.includes("GameOverModifierRewardPhase")).toBe(false); + expect(game.scene.gameData.unlocks[Unlockables.ENDLESS_MODE]).toBe(false); + expect(game.scene.validateAchv).not.toHaveBeenCalledWith(achvs.CLASSIC_VICTORY); + expect(game.scene.gameData.achvUnlocks[achvs.CLASSIC_VICTORY.id]).toBeFalsy(); + }); +}); diff --git a/test/phases/learn-move-phase.test.ts b/test/phases/learn-move-phase.test.ts new file mode 100644 index 00000000000..55b9d8b79d4 --- /dev/null +++ b/test/phases/learn-move-phase.test.ts @@ -0,0 +1,165 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#test/testUtils/gameManager"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { LearnMovePhase } from "#app/phases/learn-move-phase"; +import { Mode } from "#app/ui/ui"; +import { Button } from "#app/enums/buttons"; + +describe("Learn Move Phase", () => { + 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.xpMultiplier(50); + }); + + it("If Pokemon has less than 4 moves, its newest move will be added to the lowest empty index", async () => { + game.override.moveset([Moves.SPLASH]); + await game.classicMode.startBattle([Species.BULBASAUR]); + const pokemon = game.scene.getPlayerPokemon()!; + const newMovePos = pokemon?.getMoveset().length; + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(LearnMovePhase); + const levelMove = pokemon.getLevelMoves(5)[0]; + const levelReq = levelMove[0]; + const levelMoveId = levelMove[1]; + expect(pokemon.level).toBeGreaterThanOrEqual(levelReq); + expect(pokemon?.moveset[newMovePos]?.moveId).toBe(levelMoveId); + }); + + it("If a pokemon has 4 move slots filled, the chosen move will be deleted and replaced", async () => { + await game.classicMode.startBattle([Species.BULBASAUR]); + const bulbasaur = game.scene.getPlayerPokemon()!; + const prevMoveset = [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]; + const moveSlotNum = 3; + + game.move.changeMoveset(bulbasaur, prevMoveset); + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + + // queue up inputs to confirm dialog boxes + game.onNextPrompt("LearnMovePhase", Mode.CONFIRM, () => { + game.scene.ui.processInput(Button.ACTION); + }); + game.onNextPrompt("LearnMovePhase", Mode.SUMMARY, () => { + for (let x = 0; x < moveSlotNum; x++) { + game.scene.ui.processInput(Button.DOWN); + } + game.scene.ui.processInput(Button.ACTION); + }); + await game.phaseInterceptor.to(LearnMovePhase); + + const levelMove = bulbasaur.getLevelMoves(5)[0]; + const levelReq = levelMove[0]; + const levelMoveId = levelMove[1]; + expect(bulbasaur.level).toBeGreaterThanOrEqual(levelReq); + // Check each of mr mime's moveslots to make sure the changed move (and ONLY the changed move) is different + bulbasaur.getMoveset().forEach((move, index) => { + const expectedMove: Moves = index === moveSlotNum ? levelMoveId : prevMoveset[index]; + expect(move?.moveId).toBe(expectedMove); + }); + }); + + it("selecting the newly deleted move will reject it and keep old moveset", async () => { + await game.classicMode.startBattle([Species.BULBASAUR]); + const bulbasaur = game.scene.getPlayerPokemon()!; + const prevMoveset = [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]; + + game.move.changeMoveset(bulbasaur, [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]); + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + + // queue up inputs to confirm dialog boxes + game.onNextPrompt("LearnMovePhase", Mode.CONFIRM, () => { + game.scene.ui.processInput(Button.ACTION); + }); + game.onNextPrompt("LearnMovePhase", Mode.SUMMARY, () => { + for (let x = 0; x < 4; x++) { + game.scene.ui.processInput(Button.DOWN); // moves down 4 times to the 5th move slot + } + game.scene.ui.processInput(Button.ACTION); + }); + game.onNextPrompt("LearnMovePhase", Mode.CONFIRM, () => { + game.scene.ui.processInput(Button.ACTION); + }); + await game.phaseInterceptor.to(LearnMovePhase); + + const levelReq = bulbasaur.getLevelMoves(5)[0][0]; + expect(bulbasaur.level).toBeGreaterThanOrEqual(levelReq); + expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual(prevMoveset); + }); + + it("macro should add moves in free slots normally", async () => { + await game.classicMode.startBattle([Species.BULBASAUR]); + const bulbasaur = game.scene.getPlayerPokemon()!; + + game.move.changeMoveset(bulbasaur, [Moves.SPLASH, Moves.ABSORB, Moves.ACID]); + game.move.select(Moves.SPLASH); + await game.move.learnMove(Moves.SACRED_FIRE, 0, 1); + expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual([ + Moves.SPLASH, + Moves.ABSORB, + Moves.ACID, + Moves.SACRED_FIRE, + ]); + }); + + it("macro should replace moves", async () => { + await game.classicMode.startBattle([Species.BULBASAUR]); + const bulbasaur = game.scene.getPlayerPokemon()!; + + game.move.changeMoveset(bulbasaur, [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]); + game.move.select(Moves.SPLASH); + await game.move.learnMove(Moves.SACRED_FIRE, 0, 1); + expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual([ + Moves.SPLASH, + Moves.SACRED_FIRE, + Moves.ACID, + Moves.VINE_WHIP, + ]); + }); + + it("macro should allow for cancelling move learning", async () => { + await game.classicMode.startBattle([Species.BULBASAUR]); + const bulbasaur = game.scene.getPlayerPokemon()!; + + game.move.changeMoveset(bulbasaur, [Moves.SPLASH, Moves.ABSORB, Moves.ACID, Moves.VINE_WHIP]); + game.move.select(Moves.SPLASH); + await game.move.learnMove(Moves.SACRED_FIRE, 0, 4); + expect(bulbasaur.getMoveset().map(m => m?.moveId)).toEqual([ + Moves.SPLASH, + Moves.ABSORB, + Moves.ACID, + Moves.VINE_WHIP, + ]); + }); + + it("macro works on off-field party members", async () => { + await game.classicMode.startBattle([Species.BULBASAUR, Species.SQUIRTLE]); + const squirtle = game.scene.getPlayerParty()[1]!; + + game.move.changeMoveset(squirtle, [Moves.SPLASH, Moves.WATER_GUN, Moves.FREEZE_DRY, Moves.GROWL]); + game.move.select(Moves.TACKLE); + await game.move.learnMove(Moves.SHELL_SMASH, 1, 0); + expect(squirtle.getMoveset().map(m => m?.moveId)).toEqual([ + Moves.SHELL_SMASH, + Moves.WATER_GUN, + Moves.FREEZE_DRY, + Moves.GROWL, + ]); + }); +}); diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/test/phases/mystery-encounter-phase.test.ts similarity index 60% rename from src/test/phases/mystery-encounter-phase.test.ts rename to test/phases/mystery-encounter-phase.test.ts index 32e31ce1c94..f903932d2cb 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/test/phases/mystery-encounter-phase.test.ts @@ -1,13 +1,13 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it, vi } from "vitest"; -import GameManager from "#app/test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { Mode } from "#app/ui/ui"; import { Button } from "#enums/buttons"; -import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; +import type MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import MessageUiHandler from "#app/ui/message-ui-handler"; +import type MessageUiHandler from "#app/ui/message-ui-handler"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import i18next from "i18next"; @@ -34,15 +34,21 @@ describe("Mystery Encounter Phases", () => { }); describe("MysteryEncounterPhase", () => { - it("Runs to MysteryEncounterPhase", async() => { - await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ Species.CHARIZARD, Species.VOLCARONA ]); + it("Runs to MysteryEncounterPhase", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ + Species.CHARIZARD, + Species.VOLCARONA, + ]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); expect(game.scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); }); - it("Runs MysteryEncounterPhase", async() => { - await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ Species.CHARIZARD, Species.VOLCARONA ]); + it("Runs MysteryEncounterPhase", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ + Species.CHARIZARD, + Species.VOLCARONA, + ]); game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { // End phase early for test @@ -51,16 +57,21 @@ describe("Mystery Encounter Phases", () => { await game.phaseInterceptor.run(MysteryEncounterPhase); expect(game.scene.mysteryEncounterSaveData.encounteredEvents.length).toBeGreaterThan(0); - expect(game.scene.mysteryEncounterSaveData.encounteredEvents[0].type).toEqual(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + expect(game.scene.mysteryEncounterSaveData.encounteredEvents[0].type).toEqual( + MysteryEncounterType.MYSTERIOUS_CHALLENGERS, + ); expect(game.scene.mysteryEncounterSaveData.encounteredEvents[0].tier).toEqual(MysteryEncounterTier.GREAT); expect(game.scene.ui.getMode()).toBe(Mode.MYSTERY_ENCOUNTER); }); - it("Selects an option for MysteryEncounterPhase", async() => { + it("Selects an option for MysteryEncounterPhase", async () => { const { ui } = game.scene; vi.spyOn(ui, "showDialogue"); vi.spyOn(ui, "showText"); - await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ Species.CHARIZARD, Species.VOLCARONA ]); + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [ + Species.CHARIZARD, + Species.VOLCARONA, + ]); game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { const handler = game.scene.ui.getHandler() as MessageUiHandler; @@ -75,82 +86,70 @@ describe("Mystery Encounter Phases", () => { handler.processInput(Button.ACTION); // Waitfor required so that option select messages and preOptionPhase logic are handled - await vi.waitFor(() => expect(game.scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterOptionSelectedPhase.name)); + await vi.waitFor(() => + expect(game.scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterOptionSelectedPhase.name), + ); expect(ui.getMode()).toBe(Mode.MESSAGE); expect(ui.showDialogue).toHaveBeenCalledTimes(1); expect(ui.showText).toHaveBeenCalledTimes(2); - expect(ui.showDialogue).toHaveBeenCalledWith(i18next.t("battle:mysteryEncounterAppeared"), "???", null, expect.any(Function)); - expect(ui.showText).toHaveBeenCalledWith(i18next.t("mysteryEncounters/mysteriousChallengers:intro"), null, expect.any(Function), 750, true); - expect(ui.showText).toHaveBeenCalledWith(i18next.t("mysteryEncounters/mysteriousChallengers:option.selected"), null, expect.any(Function), 300, true); + expect(ui.showDialogue).toHaveBeenCalledWith( + i18next.t("battle:mysteryEncounterAppeared"), + "???", + null, + expect.any(Function), + ); + expect(ui.showText).toHaveBeenCalledWith( + i18next.t("mysteryEncounters/mysteriousChallengers:intro"), + null, + expect.any(Function), + 750, + true, + ); + expect(ui.showText).toHaveBeenCalledWith( + i18next.t("mysteryEncounters/mysteriousChallengers:option.selected"), + null, + expect.any(Function), + 300, + true, + ); }); }); describe("MysteryEncounterOptionSelectedPhase", () => { - it("runs phase", () => { + it("runs phase", () => {}); - }); + it("handles onOptionSelect execution", () => {}); - it("handles onOptionSelect execution", () => { + it("hides intro visuals", () => {}); - }); - - it("hides intro visuals", () => { - - }); - - it("does not hide intro visuals if option disabled", () => { - - }); + it("does not hide intro visuals if option disabled", () => {}); }); describe("MysteryEncounterBattlePhase", () => { - it("runs phase", () => { + it("runs phase", () => {}); - }); + it("handles TRAINER_BATTLE variant", () => {}); - it("handles TRAINER_BATTLE variant", () => { + it("handles BOSS_BATTLE variant", () => {}); - }); + it("handles WILD_BATTLE variant", () => {}); - it("handles BOSS_BATTLE variant", () => { - - }); - - it("handles WILD_BATTLE variant", () => { - - }); - - it("handles double battle", () => { - - }); + it("handles double battle", () => {}); }); describe("MysteryEncounterRewardsPhase", () => { - it("runs phase", () => { + it("runs phase", () => {}); - }); + it("handles doEncounterRewards", () => {}); - it("handles doEncounterRewards", () => { - - }); - - it("handles heal phase if enabled", () => { - - }); + it("handles heal phase if enabled", () => {}); }); describe("PostMysteryEncounterPhase", () => { - it("runs phase", () => { + it("runs phase", () => {}); - }); + it("handles onPostOptionSelect execution", () => {}); - it("handles onPostOptionSelect execution", () => { - - }); - - it("runs to next EncounterPhase", () => { - - }); + it("runs to next EncounterPhase", () => {}); }); }); - diff --git a/src/test/phases/phases.test.ts b/test/phases/phases.test.ts similarity index 85% rename from src/test/phases/phases.test.ts rename to test/phases/phases.test.ts index 5ef25361a3f..4aabeb55b9e 100644 --- a/src/test/phases/phases.test.ts +++ b/test/phases/phases.test.ts @@ -1,9 +1,9 @@ -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import { LoginPhase } from "#app/phases/login-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { UnavailablePhase } from "#app/phases/unavailable-phase"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -29,7 +29,7 @@ describe("Phases", () => { describe("LoginPhase", () => { it("should start the login phase", async () => { - const loginPhase = new LoginPhase(scene); + const loginPhase = new LoginPhase(); scene.unshiftPhase(loginPhase); await game.phaseInterceptor.run(LoginPhase); expect(scene.ui.getMode()).to.equal(Mode.MESSAGE); @@ -38,7 +38,7 @@ describe("Phases", () => { describe("TitlePhase", () => { it("should start the title phase", async () => { - const titlePhase = new TitlePhase(scene); + const titlePhase = new TitlePhase(); scene.unshiftPhase(titlePhase); await game.phaseInterceptor.run(TitlePhase); expect(scene.ui.getMode()).to.equal(Mode.TITLE); @@ -47,7 +47,7 @@ describe("Phases", () => { describe("UnavailablePhase", () => { it("should start the unavailable phase", async () => { - const unavailablePhase = new UnavailablePhase(scene); + const unavailablePhase = new UnavailablePhase(); scene.unshiftPhase(unavailablePhase); await game.phaseInterceptor.run(UnavailablePhase); expect(scene.ui.getMode()).to.equal(Mode.UNAVAILABLE); diff --git a/test/phases/select-modifier-phase.test.ts b/test/phases/select-modifier-phase.test.ts new file mode 100644 index 00000000000..bb3d5debc7c --- /dev/null +++ b/test/phases/select-modifier-phase.test.ts @@ -0,0 +1,279 @@ +import type BattleScene from "#app/battle-scene"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import type { CustomModifierSettings } from "#app/modifier/modifier-type"; +import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { shiftCharCodes } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Button } from "#enums/buttons"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/testUtils/gameManager"; +import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("SelectModifierPhase", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let scene: BattleScene; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + scene = game.scene; + + game.override + .moveset([Moves.FISSURE, Moves.SPLASH]) + .ability(Abilities.NO_GUARD) + .startingLevel(200) + .enemySpecies(Species.MAGIKARP); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + + vi.clearAllMocks(); + }); + + it("should start a select modifier phase", async () => { + initSceneWithoutEncounterPhase(scene, [Species.ABRA, Species.VOLCARONA]); + const selectModifierPhase = new SelectModifierPhase(); + scene.pushPhase(selectModifierPhase); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + }); + + it("should generate random modifiers", async () => { + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); + game.move.select(Moves.FISSURE); + await game.phaseInterceptor.to("SelectModifierPhase"); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(3); + }); + + it("should modify reroll cost", async () => { + initSceneWithoutEncounterPhase(scene, [Species.ABRA, Species.VOLCARONA]); + const options = [ + new ModifierTypeOption(modifierTypes.POTION(), 0, 100), + new ModifierTypeOption(modifierTypes.ETHER(), 0, 400), + new ModifierTypeOption(modifierTypes.REVIVE(), 0, 1000), + ]; + + const selectModifierPhase1 = new SelectModifierPhase(0, undefined, { + guaranteedModifierTypeOptions: options, + }); + const selectModifierPhase2 = new SelectModifierPhase(0, undefined, { + guaranteedModifierTypeOptions: options, + rerollMultiplier: 2, + }); + + const cost1 = selectModifierPhase1.getRerollCost(false); + const cost2 = selectModifierPhase2.getRerollCost(false); + expect(cost2).toEqual(cost1 * 2); + }); + + it.todo("should generate random modifiers from reroll", async () => { + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); + scene.money = 1000000; + scene.shopCursorTarget = 0; + + game.move.select(Moves.FISSURE); + await game.phaseInterceptor.to("SelectModifierPhase"); + + // TODO: nagivate the ui to reroll somehow + //const smphase = scene.getCurrentPhase() as SelectModifierPhase; + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(3); + + modifierSelectHandler.processInput(Button.ACTION); + + expect(scene.money).toBe(1000000 - 250); + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + expect(modifierSelectHandler.options.length).toEqual(3); + }); + + it.todo("should generate random modifiers of same tier for reroll with reroll lock", async () => { + game.override.startingModifier([{ name: "LOCK_CAPSULE" }]); + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); + scene.money = 1000000; + // Just use fully random seed for this test + vi.spyOn(scene, "resetSeed").mockImplementation(() => { + scene.waveSeed = shiftCharCodes(scene.seed, 5); + Phaser.Math.RND.sow([scene.waveSeed]); + console.log("Wave Seed:", scene.waveSeed, 5); + scene.rngCounter = 0; + }); + + game.move.select(Moves.FISSURE); + await game.phaseInterceptor.to("SelectModifierPhase"); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(3); + const firstRollTiers: ModifierTier[] = modifierSelectHandler.options.map(o => o.modifierTypeOption.type.tier); + + // TODO: nagivate ui to reroll with lock capsule enabled + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + expect(modifierSelectHandler.options.length).toEqual(3); + // Reroll with lock can still upgrade + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toEqual(firstRollTiers[0]); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toEqual(firstRollTiers[1]); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toEqual(firstRollTiers[2]); + }); + + it("should generate custom modifiers", async () => { + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); + scene.money = 1000000; + const customModifiers: CustomModifierSettings = { + guaranteedModifierTypeFuncs: [ + modifierTypes.MEMORY_MUSHROOM, + modifierTypes.TM_ULTRA, + modifierTypes.LEFTOVERS, + modifierTypes.AMULET_COIN, + modifierTypes.GOLDEN_PUNCH, + ], + }; + const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers); + scene.unshiftPhase(selectModifierPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("SelectModifierPhase"); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(5); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_ULTRA"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("LEFTOVERS"); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("AMULET_COIN"); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.id).toEqual("GOLDEN_PUNCH"); + }); + + it("should generate custom modifier tiers that can upgrade from luck", async () => { + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); + scene.money = 1000000; + const customModifiers: CustomModifierSettings = { + guaranteedModifierTiers: [ + ModifierTier.COMMON, + ModifierTier.GREAT, + ModifierTier.ULTRA, + ModifierTier.ROGUE, + ModifierTier.MASTER, + ], + }; + const pokemon = new PlayerPokemon(getPokemonSpecies(Species.BULBASAUR), 10, undefined, 0, undefined, true, 2); + + // Fill party with max shinies + while (scene.getPlayerParty().length > 0) { + scene.getPlayerParty().pop(); + } + scene.getPlayerParty().push(pokemon, pokemon, pokemon, pokemon, pokemon, pokemon); + + const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers); + scene.unshiftPhase(selectModifierPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("SelectModifierPhase"); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(5); + expect( + modifierSelectHandler.options[0].modifierTypeOption.type.tier - + modifierSelectHandler.options[0].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.COMMON); + expect( + modifierSelectHandler.options[1].modifierTypeOption.type.tier - + modifierSelectHandler.options[1].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.GREAT); + expect( + modifierSelectHandler.options[2].modifierTypeOption.type.tier - + modifierSelectHandler.options[2].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ULTRA); + expect( + modifierSelectHandler.options[3].modifierTypeOption.type.tier - + modifierSelectHandler.options[3].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.ROGUE); + expect( + modifierSelectHandler.options[4].modifierTypeOption.type.tier - + modifierSelectHandler.options[4].modifierTypeOption.upgradeCount, + ).toEqual(ModifierTier.MASTER); + }); + + it("should generate custom modifiers and modifier tiers together", async () => { + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); + scene.money = 1000000; + const customModifiers: CustomModifierSettings = { + guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_COMMON], + guaranteedModifierTiers: [ModifierTier.MASTER, ModifierTier.MASTER], + }; + const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers); + scene.unshiftPhase(selectModifierPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(4); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_COMMON"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); + }); + + it("should fill remaining modifiers if fillRemaining is true with custom modifiers", async () => { + await game.classicMode.startBattle([Species.ABRA, Species.VOLCARONA]); + scene.money = 1000000; + const customModifiers: CustomModifierSettings = { + guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM], + guaranteedModifierTiers: [ModifierTier.MASTER], + fillRemaining: true, + }; + const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers); + scene.unshiftPhase(selectModifierPhase); + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(3); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); + }); +}); diff --git a/test/plugins/api/pokerogue-account-api.test.ts b/test/plugins/api/pokerogue-account-api.test.ts new file mode 100644 index 00000000000..9ec98b6a59f --- /dev/null +++ b/test/plugins/api/pokerogue-account-api.test.ts @@ -0,0 +1,157 @@ +import type { AccountInfoResponse } from "#app/@types/PokerogueAccountApi"; +import { SESSION_ID_COOKIE_NAME } from "#app/constants"; +import { PokerogueAccountApi } from "#app/plugins/api/pokerogue-account-api"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; +import * as Utils from "#app/utils"; +import { http, HttpResponse } from "msw"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +const apiBase = getApiBaseUrl(); +const accountApi = new PokerogueAccountApi(apiBase); +const { server } = global; + +afterEach(() => { + server.resetHandlers(); +}); + +describe("Pokerogue Account API", () => { + beforeEach(() => { + vi.spyOn(console, "warn"); + }); + + describe("Get Info", () => { + it("should return account-info & 200 on SUCCESS", async () => { + const expectedAccountInfo: AccountInfoResponse = { + username: "test", + lastSessionSlot: -1, + discordId: "23235353543535", + googleId: "1ed1d1d11d1d1d1d1d1", + hasAdminRole: false, + }; + server.use(http.get(`${apiBase}/account/info`, () => HttpResponse.json(expectedAccountInfo))); + + const [accountInfo, status] = await accountApi.getInfo(); + + expect(accountInfo).toEqual(expectedAccountInfo); + expect(status).toBe(200); + }); + + it("should return null + status-code anad report a warning on FAILURE", async () => { + server.use(http.get(`${apiBase}/account/info`, () => new HttpResponse("", { status: 401 }))); + + const [accountInfo, status] = await accountApi.getInfo(); + + expect(accountInfo).toBeNull(); + expect(status).toBe(401); + expect(console.warn).toHaveBeenCalledWith("Could not get account info!", 401, "Unauthorized"); + }); + + it("should return null + 500 anad report a warning on ERROR", async () => { + server.use(http.get(`${apiBase}/account/info`, () => HttpResponse.error())); + + const [accountInfo, status] = await accountApi.getInfo(); + + expect(accountInfo).toBeNull(); + expect(status).toBe(500); + expect(console.warn).toHaveBeenCalledWith("Could not get account info!", expect.any(Error)); + }); + }); + + describe("Register", () => { + const registerParams = { username: "test", password: "test" }; + + it("should return null on SUCCESS", async () => { + server.use(http.post(`${apiBase}/account/register`, () => HttpResponse.text())); + + const error = await accountApi.register(registerParams); + + expect(error).toBeNull(); + }); + + it("should return error message on FAILURE", async () => { + server.use( + http.post(`${apiBase}/account/register`, () => new HttpResponse("Username is already taken", { status: 400 })), + ); + + const error = await accountApi.register(registerParams); + + expect(error).toBe("Username is already taken"); + }); + + it('should return "Unknown error" and report a warning on ERROR', async () => { + server.use(http.post(`${apiBase}/account/register`, () => HttpResponse.error())); + + const error = await accountApi.register(registerParams); + + expect(error).toBe("Unknown error!"); + expect(console.warn).toHaveBeenCalledWith("Register failed!", expect.any(Error)); + }); + }); + + describe("Login", () => { + const loginParams = { username: "test", password: "test" }; + + it("should return null and set the cookie on SUCCESS", async () => { + vi.spyOn(Utils, "setCookie"); + server.use(http.post(`${apiBase}/account/login`, () => HttpResponse.json({ token: "abctest" }))); + + const error = await accountApi.login(loginParams); + + expect(error).toBeNull(); + expect(Utils.setCookie).toHaveBeenCalledWith(SESSION_ID_COOKIE_NAME, "abctest"); + }); + + it("should return error message and report a warning on FAILURE", async () => { + server.use( + http.post(`${apiBase}/account/login`, () => new HttpResponse("Password is incorrect", { status: 401 })), + ); + + const error = await accountApi.login(loginParams); + + expect(error).toBe("Password is incorrect"); + expect(console.warn).toHaveBeenCalledWith("Login failed!", 401, "Unauthorized"); + }); + + it('should return "Unknown error" and report a warning on ERROR', async () => { + server.use(http.post(`${apiBase}/account/login`, () => HttpResponse.error())); + + const error = await accountApi.login(loginParams); + + expect(error).toBe("Unknown error!"); + expect(console.warn).toHaveBeenCalledWith("Login failed!", expect.any(Error)); + }); + }); + + describe("Logout", () => { + beforeEach(() => { + vi.spyOn(Utils, "removeCookie"); + }); + + it("should remove cookie on success", async () => { + vi.spyOn(Utils, "setCookie"); + server.use(http.get(`${apiBase}/account/logout`, () => new HttpResponse("", { status: 200 }))); + + await accountApi.logout(); + + expect(Utils.removeCookie).toHaveBeenCalledWith(SESSION_ID_COOKIE_NAME); + }); + + it("should report a warning on and remove cookie on FAILURE", async () => { + server.use(http.get(`${apiBase}/account/logout`, () => new HttpResponse("", { status: 401 }))); + + await accountApi.logout(); + + expect(Utils.removeCookie).toHaveBeenCalledWith(SESSION_ID_COOKIE_NAME); + expect(console.warn).toHaveBeenCalledWith("Log out failed!", expect.any(Error)); + }); + + it("should report a warning on and remove cookie on ERROR", async () => { + server.use(http.get(`${apiBase}/account/logout`, () => HttpResponse.error())); + + await accountApi.logout(); + + expect(Utils.removeCookie).toHaveBeenCalledWith(SESSION_ID_COOKIE_NAME); + expect(console.warn).toHaveBeenCalledWith("Log out failed!", expect.any(Error)); + }); + }); +}); diff --git a/test/plugins/api/pokerogue-admin-api.test.ts b/test/plugins/api/pokerogue-admin-api.test.ts new file mode 100644 index 00000000000..0ce727b88da --- /dev/null +++ b/test/plugins/api/pokerogue-admin-api.test.ts @@ -0,0 +1,244 @@ +import type { + LinkAccountToDiscordIdRequest, + LinkAccountToGoogledIdRequest, + SearchAccountRequest, + SearchAccountResponse, + UnlinkAccountFromDiscordIdRequest, + UnlinkAccountFromGoogledIdRequest, +} from "#app/@types/PokerogueAdminApi"; +import { PokerogueAdminApi } from "#app/plugins/api/pokerogue-admin-api"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; +import { http, HttpResponse } from "msw"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +const apiBase = getApiBaseUrl(); +const adminApi = new PokerogueAdminApi(apiBase); +const { server } = global; + +afterEach(() => { + server.resetHandlers(); +}); + +describe("Pokerogue Admin API", () => { + beforeEach(() => { + vi.spyOn(console, "warn"); + }); + + describe("Link Account to Discord", () => { + const params: LinkAccountToDiscordIdRequest = { + username: "test", + discordId: "test-12575756", + }; + + it("should return null on SUCCESS", async () => { + server.use(http.post(`${apiBase}/admin/account/discordLink`, () => HttpResponse.json(true))); + + const success = await adminApi.linkAccountToDiscord(params); + + expect(success).toBeNull(); + }); + + it("should return a ERR_GENERIC and report a warning on FAILURE", async () => { + server.use(http.post(`${apiBase}/admin/account/discordLink`, () => new HttpResponse("", { status: 400 }))); + + const success = await adminApi.linkAccountToDiscord(params); + + expect(success).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not link account with discord!", 400, "Bad Request"); + }); + + it("should return a ERR_USERNAME_NOT_FOUND and report a warning on 404", async () => { + server.use(http.post(`${apiBase}/admin/account/discordLink`, () => new HttpResponse("", { status: 404 }))); + + const success = await adminApi.linkAccountToDiscord(params); + + expect(success).toBe(adminApi.ERR_USERNAME_NOT_FOUND); + expect(console.warn).toHaveBeenCalledWith("Could not link account with discord!", 404, "Not Found"); + }); + + it("should return a ERR_GENERIC and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/admin/account/discordLink`, () => HttpResponse.error())); + + const success = await adminApi.linkAccountToDiscord(params); + + expect(success).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not link account with discord!", expect.any(Error)); + }); + }); + + describe("Unlink Account from Discord", () => { + const params: UnlinkAccountFromDiscordIdRequest = { + username: "test", + discordId: "test-12575756", + }; + + it("should return null on SUCCESS", async () => { + server.use(http.post(`${apiBase}/admin/account/discordUnlink`, () => HttpResponse.json(true))); + + const success = await adminApi.unlinkAccountFromDiscord(params); + + expect(success).toBeNull(); + }); + + it("should return a ERR_GENERIC and report a warning on FAILURE", async () => { + server.use(http.post(`${apiBase}/admin/account/discordUnlink`, () => new HttpResponse("", { status: 400 }))); + + const success = await adminApi.unlinkAccountFromDiscord(params); + + expect(success).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not unlink account from discord!", 400, "Bad Request"); + }); + + it("should return a ERR_USERNAME_NOT_FOUND and report a warning on 404", async () => { + server.use(http.post(`${apiBase}/admin/account/discordUnlink`, () => new HttpResponse("", { status: 404 }))); + + const success = await adminApi.unlinkAccountFromDiscord(params); + + expect(success).toBe(adminApi.ERR_USERNAME_NOT_FOUND); + expect(console.warn).toHaveBeenCalledWith("Could not unlink account from discord!", 404, "Not Found"); + }); + + it("should return a ERR_GENERIC and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/admin/account/discordUnlink`, () => HttpResponse.error())); + + const success = await adminApi.unlinkAccountFromDiscord(params); + + expect(success).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not unlink account from discord!", expect.any(Error)); + }); + }); + + describe("Link Account to Google", () => { + const params: LinkAccountToGoogledIdRequest = { + username: "test", + googleId: "test-12575756", + }; + + it("should return null on SUCCESS", async () => { + server.use(http.post(`${apiBase}/admin/account/googleLink`, () => HttpResponse.json(true))); + + const success = await adminApi.linkAccountToGoogleId(params); + + expect(success).toBeNull(); + }); + + it("should return a ERR_GENERIC and report a warning on FAILURE", async () => { + server.use(http.post(`${apiBase}/admin/account/googleLink`, () => new HttpResponse("", { status: 400 }))); + + const success = await adminApi.linkAccountToGoogleId(params); + + expect(success).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not link account with google!", 400, "Bad Request"); + }); + + it("should return a ERR_USERNAME_NOT_FOUND and report a warning on 404", async () => { + server.use(http.post(`${apiBase}/admin/account/googleLink`, () => new HttpResponse("", { status: 404 }))); + + const success = await adminApi.linkAccountToGoogleId(params); + + expect(success).toBe(adminApi.ERR_USERNAME_NOT_FOUND); + expect(console.warn).toHaveBeenCalledWith("Could not link account with google!", 404, "Not Found"); + }); + + it("should return a ERR_GENERIC and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/admin/account/googleLink`, () => HttpResponse.error())); + + const success = await adminApi.linkAccountToGoogleId(params); + + expect(success).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not link account with google!", expect.any(Error)); + }); + }); + + describe("Unlink Account from Google", () => { + const params: UnlinkAccountFromGoogledIdRequest = { + username: "test", + googleId: "test-12575756", + }; + + it("should return null on SUCCESS", async () => { + server.use(http.post(`${apiBase}/admin/account/googleUnlink`, () => HttpResponse.json(true))); + + const success = await adminApi.unlinkAccountFromGoogleId(params); + + expect(success).toBeNull(); + }); + + it("should return a ERR_GENERIC and report a warning on FAILURE", async () => { + server.use(http.post(`${apiBase}/admin/account/googleUnlink`, () => new HttpResponse("", { status: 400 }))); + + const success = await adminApi.unlinkAccountFromGoogleId(params); + + expect(success).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not unlink account from google!", 400, "Bad Request"); + }); + + it("should return a ERR_USERNAME_NOT_FOUND and report a warning on 404", async () => { + server.use(http.post(`${apiBase}/admin/account/googleUnlink`, () => new HttpResponse("", { status: 404 }))); + + const success = await adminApi.unlinkAccountFromGoogleId(params); + + expect(success).toBe(adminApi.ERR_USERNAME_NOT_FOUND); + expect(console.warn).toHaveBeenCalledWith("Could not unlink account from google!", 404, "Not Found"); + }); + + it("should return a ERR_GENERIC and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/admin/account/googleUnlink`, () => HttpResponse.error())); + + const success = await adminApi.unlinkAccountFromGoogleId(params); + + expect(success).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not unlink account from google!", expect.any(Error)); + }); + }); + + describe("Search Account", () => { + const params: SearchAccountRequest = { username: "test" }; + + it("should return [data, undefined] on SUCCESS", async () => { + const responseData: SearchAccountResponse = { + username: "test", + discordId: "discord-test-123", + googleId: "google-test-123", + lastLoggedIn: "2022-01-01", + registered: "2022-01-01", + }; + server.use(http.get(`${apiBase}/admin/account/adminSearch`, () => HttpResponse.json(responseData))); + + const [data, err] = await adminApi.searchAccount(params); + + expect(data).toStrictEqual(responseData); + expect(err).toBeUndefined(); + }); + + it("should return [undefined, ERR_GENERIC] and report a warning on on FAILURE", async () => { + server.use(http.get(`${apiBase}/admin/account/adminSearch`, () => new HttpResponse("", { status: 400 }))); + + const [data, err] = await adminApi.searchAccount(params); + + expect(data).toBeUndefined(); + expect(err).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not find account!", 400, "Bad Request"); + }); + + it("should return [undefined, ERR_USERNAME_NOT_FOUND] and report a warning on on 404", async () => { + server.use(http.get(`${apiBase}/admin/account/adminSearch`, () => new HttpResponse("", { status: 404 }))); + + const [data, err] = await adminApi.searchAccount(params); + + expect(data).toBeUndefined(); + expect(err).toBe(adminApi.ERR_USERNAME_NOT_FOUND); + expect(console.warn).toHaveBeenCalledWith("Could not find account!", 404, "Not Found"); + }); + + it("should return [undefined, ERR_GENERIC] and report a warning on on ERROR", async () => { + server.use(http.get(`${apiBase}/admin/account/adminSearch`, () => HttpResponse.error())); + + const [data, err] = await adminApi.searchAccount(params); + + expect(data).toBeUndefined(); + expect(err).toBe(adminApi.ERR_GENERIC); + expect(console.warn).toHaveBeenCalledWith("Could not find account!", expect.any(Error)); + }); + }); +}); diff --git a/test/plugins/api/pokerogue-api.test.ts b/test/plugins/api/pokerogue-api.test.ts new file mode 100644 index 00000000000..241453866a5 --- /dev/null +++ b/test/plugins/api/pokerogue-api.test.ts @@ -0,0 +1,97 @@ +import type { TitleStatsResponse } from "#app/@types/PokerogueApi"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; +import { http, HttpResponse } from "msw"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +const apiBase = getApiBaseUrl(); +const { server } = global; + +afterEach(() => { + server.resetHandlers(); +}); + +describe("Pokerogue API", () => { + beforeEach(() => { + vi.spyOn(console, "warn"); + }); + + describe("Game Title Stats", () => { + const expectedTitleStats: TitleStatsResponse = { + playerCount: 9999999, + battleCount: 9999999, + }; + + it("should return the stats on SUCCESS", async () => { + server.use(http.get(`${apiBase}/game/titlestats`, () => HttpResponse.json(expectedTitleStats))); + + const titleStats = await pokerogueApi.getGameTitleStats(); + + expect(titleStats).toEqual(expectedTitleStats); + }); + + it("should return null and report a warning on ERROR", async () => { + server.use(http.get(`${apiBase}/game/titlestats`, () => HttpResponse.error())); + const titleStats = await pokerogueApi.getGameTitleStats(); + + expect(titleStats).toBeNull(); + expect(console.warn).toHaveBeenCalledWith("Could not get game title stats!", expect.any(Error)); + }); + }); + + describe("Unlink Discord", () => { + it("should return true on SUCCESS", async () => { + server.use(http.post(`${apiBase}/auth/discord/logout`, () => new HttpResponse("", { status: 200 }))); + + const success = await pokerogueApi.unlinkDiscord(); + + expect(success).toBe(true); + }); + + it("should return false and report a warning on FAILURE", async () => { + server.use(http.post(`${apiBase}/auth/discord/logout`, () => new HttpResponse("", { status: 401 }))); + + const success = await pokerogueApi.unlinkDiscord(); + + expect(success).toBe(false); + expect(console.warn).toHaveBeenCalledWith("Discord unlink failed (401: Unauthorized)"); + }); + + it("should return false and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/auth/discord/logout`, () => HttpResponse.error())); + + const success = await pokerogueApi.unlinkDiscord(); + + expect(success).toBe(false); + expect(console.warn).toHaveBeenCalledWith("Could not unlink Discord!", expect.any(Error)); + }); + }); + + describe("Unlink Google", () => { + it("should return true on SUCCESS", async () => { + server.use(http.post(`${apiBase}/auth/google/logout`, () => new HttpResponse("", { status: 200 }))); + + const success = await pokerogueApi.unlinkGoogle(); + + expect(success).toBe(true); + }); + + it("should return false and report a warning on FAILURE", async () => { + server.use(http.post(`${apiBase}/auth/google/logout`, () => new HttpResponse("", { status: 401 }))); + + const success = await pokerogueApi.unlinkGoogle(); + + expect(success).toBe(false); + expect(console.warn).toHaveBeenCalledWith("Google unlink failed (401: Unauthorized)"); + }); + + it("should return false and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/auth/google/logout`, () => HttpResponse.error())); + + const success = await pokerogueApi.unlinkGoogle(); + + expect(success).toBe(false); + expect(console.warn).toHaveBeenCalledWith("Could not unlink Google!", expect.any(Error)); + }); + }); +}); diff --git a/test/plugins/api/pokerogue-daily-api.test.ts b/test/plugins/api/pokerogue-daily-api.test.ts new file mode 100644 index 00000000000..95d938e6625 --- /dev/null +++ b/test/plugins/api/pokerogue-daily-api.test.ts @@ -0,0 +1,89 @@ +import type { GetDailyRankingsPageCountRequest, GetDailyRankingsRequest } from "#app/@types/PokerogueDailyApi"; +import { PokerogueDailyApi } from "#app/plugins/api/pokerogue-daily-api"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; +import { ScoreboardCategory, type RankingEntry } from "#app/ui/daily-run-scoreboard"; +import { http, HttpResponse } from "msw"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +const apiBase = getApiBaseUrl(); +const dailyApi = new PokerogueDailyApi(apiBase); +const { server } = global; + +afterEach(() => { + server.resetHandlers(); +}); + +describe("Pokerogue Daily API", () => { + beforeEach(() => { + vi.spyOn(console, "warn"); + }); + + describe("Get Seed", () => { + it("should return seed string on SUCCESS", async () => { + server.use(http.get(`${apiBase}/daily/seed`, () => HttpResponse.text("this-is-a-test-seed"))); + + const seed = await dailyApi.getSeed(); + + expect(seed).toBe("this-is-a-test-seed"); + }); + + it("should return null and report a warning on ERROR", async () => { + server.use(http.get(`${apiBase}/daily/seed`, () => HttpResponse.error())); + + const seed = await dailyApi.getSeed(); + + expect(seed).toBeNull(); + expect(console.warn).toHaveBeenCalledWith("Could not get daily-run seed!", expect.any(Error)); + }); + }); + + describe("Get Rankings", () => { + const params: GetDailyRankingsRequest = { + category: ScoreboardCategory.DAILY, + }; + + it("should return ranking entries on SUCCESS", async () => { + const expectedRankings: RankingEntry[] = [ + { rank: 1, score: 999, username: "Player 1", wave: 200 }, + { rank: 2, score: 10, username: "Player 2", wave: 1 }, + ]; + server.use(http.get(`${apiBase}/daily/rankings`, () => HttpResponse.json(expectedRankings))); + + const rankings = await dailyApi.getRankings(params); + + expect(rankings).toStrictEqual(expectedRankings); + }); + + it("should return null and report a warning on ERROR", async () => { + server.use(http.get(`${apiBase}/daily/rankings`, () => HttpResponse.error())); + + const rankings = await dailyApi.getRankings(params); + + expect(rankings).toBeNull(); + expect(console.warn).toHaveBeenCalledWith("Could not get daily rankings!", expect.any(Error)); + }); + }); + + describe("Get Rankings Page Count", () => { + const params: GetDailyRankingsPageCountRequest = { + category: ScoreboardCategory.DAILY, + }; + + it("should return a number on SUCCESS", async () => { + server.use(http.get(`${apiBase}/daily/rankingpagecount`, () => HttpResponse.json(5))); + + const pageCount = await dailyApi.getRankingsPageCount(params); + + expect(pageCount).toBe(5); + }); + + it("should return 1 and report a warning on ERROR", async () => { + server.use(http.get(`${apiBase}/daily/rankingpagecount`, () => HttpResponse.error())); + + const pageCount = await dailyApi.getRankingsPageCount(params); + + expect(pageCount).toBe(1); + expect(console.warn).toHaveBeenCalledWith("Could not get daily rankings page count!", expect.any(Error)); + }); + }); +}); diff --git a/test/plugins/api/pokerogue-savedata-api.test.ts b/test/plugins/api/pokerogue-savedata-api.test.ts new file mode 100644 index 00000000000..47eafa0a933 --- /dev/null +++ b/test/plugins/api/pokerogue-savedata-api.test.ts @@ -0,0 +1,46 @@ +import type { UpdateAllSavedataRequest } from "#app/@types/PokerogueSavedataApi"; +import { PokerogueSavedataApi } from "#app/plugins/api/pokerogue-savedata-api"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; +import { http, HttpResponse } from "msw"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +const apiBase = getApiBaseUrl(); +const savedataApi = new PokerogueSavedataApi(apiBase); +const { server } = global; + +afterEach(() => { + server.resetHandlers(); +}); + +describe("Pokerogue Savedata API", () => { + beforeEach(() => { + vi.spyOn(console, "warn"); + }); + + describe("Update All", () => { + it("should return an empty string on SUCCESS", async () => { + server.use(http.post(`${apiBase}/savedata/updateall`, () => HttpResponse.text(null))); + + const error = await savedataApi.updateAll({} as UpdateAllSavedataRequest); + + expect(error).toBe(""); + }); + + it("should return an error message on FAILURE", async () => { + server.use(http.post(`${apiBase}/savedata/updateall`, () => HttpResponse.text("Failed to update all!"))); + + const error = await savedataApi.updateAll({} as UpdateAllSavedataRequest); + + expect(error).toBe("Failed to update all!"); + }); + + it("should return 'Unknown error' and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/savedata/updateall`, () => HttpResponse.error())); + + const error = await savedataApi.updateAll({} as UpdateAllSavedataRequest); + + expect(error).toBe("Unknown error"); + expect(console.warn).toHaveBeenCalledWith("Could not update all savedata!", expect.any(Error)); + }); + }); +}); diff --git a/test/plugins/api/pokerogue-session-savedata-api.test.ts b/test/plugins/api/pokerogue-session-savedata-api.test.ts new file mode 100644 index 00000000000..67abc9c9336 --- /dev/null +++ b/test/plugins/api/pokerogue-session-savedata-api.test.ts @@ -0,0 +1,200 @@ +import type { + ClearSessionSavedataRequest, + ClearSessionSavedataResponse, + DeleteSessionSavedataRequest, + GetSessionSavedataRequest, + NewClearSessionSavedataRequest, + UpdateSessionSavedataRequest, +} from "#app/@types/PokerogueSessionSavedataApi"; +import { PokerogueSessionSavedataApi } from "#app/plugins/api/pokerogue-session-savedata-api"; +import type { SessionSaveData } from "#app/system/game-data"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; +import { http, HttpResponse } from "msw"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +const apiBase = getApiBaseUrl(); +const sessionSavedataApi = new PokerogueSessionSavedataApi(apiBase); +const { server } = global; + +afterEach(() => { + server.resetHandlers(); +}); + +describe("Pokerogue Session Savedata API", () => { + beforeEach(() => { + vi.spyOn(console, "warn"); + }); + + describe("Newclear", () => { + const params: NewClearSessionSavedataRequest = { + clientSessionId: "test-session-id", + isVictory: true, + slot: 3, + }; + + it("should return true on SUCCESS", async () => { + server.use(http.get(`${apiBase}/savedata/session/newclear`, () => HttpResponse.json(true))); + + const success = await sessionSavedataApi.newclear(params); + + expect(success).toBe(true); + }); + + it("should return false on FAILURE", async () => { + server.use(http.get(`${apiBase}/savedata/session/newclear`, () => HttpResponse.json(false))); + + const success = await sessionSavedataApi.newclear(params); + + expect(success).toBe(false); + }); + + it("should return false and report a warning on ERROR", async () => { + server.use(http.get(`${apiBase}/savedata/session/newclear`, () => HttpResponse.error())); + + const success = await sessionSavedataApi.newclear(params); + + expect(success).toBe(false); + expect(console.warn).toHaveBeenCalledWith("Could not newclear session!", expect.any(Error)); + }); + }); + + describe("Get ", () => { + const params: GetSessionSavedataRequest = { + clientSessionId: "test-session-id", + slot: 3, + }; + + it("should return session-savedata string on SUCCESS", async () => { + server.use(http.get(`${apiBase}/savedata/session/get`, () => HttpResponse.text("TEST SESSION SAVEDATA"))); + + const savedata = await sessionSavedataApi.get(params); + + expect(savedata).toBe("TEST SESSION SAVEDATA"); + }); + + it("should return null and report a warning on ERROR", async () => { + server.use(http.get(`${apiBase}/savedata/session/get`, () => HttpResponse.error())); + + const savedata = await sessionSavedataApi.get(params); + + expect(savedata).toBeNull(); + expect(console.warn).toHaveBeenCalledWith("Could not get session savedata!", expect.any(Error)); + }); + }); + + describe("Update", () => { + const params: UpdateSessionSavedataRequest = { + clientSessionId: "test-session-id", + slot: 3, + secretId: 9876543321, + trainerId: 123456789, + }; + + it("should return an empty string on SUCCESS", async () => { + server.use(http.post(`${apiBase}/savedata/session/update`, () => HttpResponse.text(null))); + + const error = await sessionSavedataApi.update(params, "UPDATED SESSION SAVEDATA"); + + expect(error).toBe(""); + }); + + it("should return an error string on FAILURE", async () => { + server.use(http.post(`${apiBase}/savedata/session/update`, () => HttpResponse.text("Failed to update!"))); + + const error = await sessionSavedataApi.update(params, "UPDATED SESSION SAVEDATA"); + + expect(error).toBe("Failed to update!"); + }); + + it("should return 'Unknown Error!' and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/savedata/session/update`, () => HttpResponse.error())); + + const error = await sessionSavedataApi.update(params, "UPDATED SESSION SAVEDATA"); + + expect(error).toBe("Unknown Error!"); + expect(console.warn).toHaveBeenCalledWith("Could not update session savedata!", expect.any(Error)); + }); + }); + + describe("Delete", () => { + const params: DeleteSessionSavedataRequest = { + clientSessionId: "test-session-id", + slot: 3, + }; + + it("should return null on SUCCESS", async () => { + server.use(http.get(`${apiBase}/savedata/session/delete`, () => HttpResponse.text(null))); + + const error = await sessionSavedataApi.delete(params); + + expect(error).toBeNull(); + }); + + it("should return an error string on FAILURE", async () => { + server.use( + http.get(`${apiBase}/savedata/session/delete`, () => new HttpResponse("Failed to delete!", { status: 400 })), + ); + + const error = await sessionSavedataApi.delete(params); + + expect(error).toBe("Failed to delete!"); + }); + + it("should return 'Unknown error' and report a warning on ERROR", async () => { + server.use(http.get(`${apiBase}/savedata/session/delete`, () => HttpResponse.error())); + + const error = await sessionSavedataApi.delete(params); + + expect(error).toBe("Unknown error"); + expect(console.warn).toHaveBeenCalledWith("Could not delete session savedata!", expect.any(Error)); + }); + }); + + describe("Clear", () => { + const params: ClearSessionSavedataRequest = { + clientSessionId: "test-session-id", + slot: 3, + trainerId: 123456789, + }; + + it("should return sucess=true on SUCCESS", async () => { + server.use( + http.post(`${apiBase}/savedata/session/clear`, () => + HttpResponse.json({ + success: true, + }), + ), + ); + + const { success, error } = await sessionSavedataApi.clear(params, {} as SessionSaveData); + + expect(success).toBe(true); + expect(error).toBeUndefined(); + }); + + it("should return sucess=false & an error string on FAILURE", async () => { + server.use( + http.post(`${apiBase}/savedata/session/clear`, () => + HttpResponse.json({ + success: false, + error: "Failed to clear!", + }), + ), + ); + + const { success, error } = await sessionSavedataApi.clear(params, {} as SessionSaveData); + + expect(error).toBe("Failed to clear!"); + expect(success).toBe(false); + }); + + it("should return success=false & error='Unknown error' and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/savedata/session/clear`, () => HttpResponse.error())); + + const { success, error } = await sessionSavedataApi.clear(params, {} as SessionSaveData); + + expect(error).toBe("Unknown error"); + expect(success).toBe(false); + }); + }); +}); diff --git a/test/plugins/api/pokerogue-system-savedata-api.test.ts b/test/plugins/api/pokerogue-system-savedata-api.test.ts new file mode 100644 index 00000000000..81d863049f0 --- /dev/null +++ b/test/plugins/api/pokerogue-system-savedata-api.test.ts @@ -0,0 +1,122 @@ +import type { + GetSystemSavedataRequest, + UpdateSystemSavedataRequest, + VerifySystemSavedataRequest, + VerifySystemSavedataResponse, +} from "#app/@types/PokerogueSystemSavedataApi"; +import { PokerogueSystemSavedataApi } from "#app/plugins/api/pokerogue-system-savedata-api"; +import type { SystemSaveData } from "#app/system/game-data"; +import { getApiBaseUrl } from "#test/testUtils/testUtils"; +import { http, HttpResponse } from "msw"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +const apiBase = getApiBaseUrl(); +const systemSavedataApi = new PokerogueSystemSavedataApi(getApiBaseUrl()); +const { server } = global; + +afterEach(() => { + server.resetHandlers(); +}); + +describe("Pokerogue System Savedata API", () => { + beforeEach(() => { + vi.spyOn(console, "warn"); + }); + + describe("Get", () => { + const params: GetSystemSavedataRequest = { + clientSessionId: "test-session-id", + }; + + it("should return system-savedata string on SUCCESS", async () => { + server.use(http.get(`${apiBase}/savedata/system/get`, () => HttpResponse.text("TEST SYSTEM SAVEDATA"))); + + const savedata = await systemSavedataApi.get(params); + + expect(savedata).toBe("TEST SYSTEM SAVEDATA"); + }); + + it("should return null and report a warning on ERROR", async () => { + server.use(http.get(`${apiBase}/savedata/system/get`, () => HttpResponse.error())); + + const savedata = await systemSavedataApi.get(params); + + expect(savedata).toBeNull(); + expect(console.warn).toHaveBeenCalledWith("Could not get system savedata!", expect.any(Error)); + }); + }); + + describe("Verify", () => { + const params: VerifySystemSavedataRequest = { + clientSessionId: "test-session-id", + }; + + it("should return null on SUCCESS", async () => { + server.use( + http.get(`${apiBase}/savedata/system/verify`, () => + HttpResponse.json({ + systemData: { + trainerId: 123456789, + } as SystemSaveData, + valid: true, + }), + ), + ); + + const savedata = await systemSavedataApi.verify(params); + + expect(savedata).toBeNull(); + }); + + it("should return system-savedata and report a warning on FAILURE", async () => { + server.use( + http.get(`${apiBase}/savedata/system/verify`, () => + HttpResponse.json({ + systemData: { + trainerId: 123456789, + } as SystemSaveData, + valid: false, + }), + ), + ); + + const savedata = await systemSavedataApi.verify(params); + + expect(savedata?.trainerId).toBe(123456789); + expect(console.warn).toHaveBeenCalledWith("Invalid system savedata!"); + }); + }); + + describe("Update", () => { + const params: UpdateSystemSavedataRequest = { + clientSessionId: "test-session-id", + secretId: 9876543321, + trainerId: 123456789, + }; + + it("should return an empty string on SUCCESS", async () => { + server.use(http.post(`${apiBase}/savedata/system/update`, () => HttpResponse.text(null))); + + const error = await systemSavedataApi.update(params, "UPDATED SYSTEM SAVEDATA"); + + expect(error).toBe(""); + }); + + it("should return an error string on FAILURE", async () => { + server.use(http.post(`${apiBase}/savedata/system/update`, () => HttpResponse.text("Failed to update!"))); + + const error = await systemSavedataApi.update(params, "UPDATED SYSTEM SAVEDATA"); + + expect(error).toBe("Failed to update!"); + }); + + it("should return 'Unknown Error' and report a warning on ERROR", async () => { + server.use(http.post(`${apiBase}/savedata/system/update`, () => HttpResponse.error())); + + const error = await systemSavedataApi.update(params, "UPDATED SYSTEM SAVEDATA"); + + expect(error).toBe("Unknown Error"); + expect(console.warn).toHaveBeenCalledWith("Could not update system savedata!", expect.any(Error)); + }); + }); +}); diff --git a/src/test/pre.test.ts b/test/pre.test.ts similarity index 100% rename from src/test/pre.test.ts rename to test/pre.test.ts diff --git a/src/test/reload.test.ts b/test/reload.test.ts similarity index 84% rename from src/test/reload.test.ts rename to test/reload.test.ts index b15e9691ed6..f54885eccfb 100644 --- a/src/test/reload.test.ts +++ b/test/reload.test.ts @@ -1,13 +1,14 @@ import { GameModes } from "#app/game-mode"; -import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import type OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { Biome } from "#enums/biome"; import { Button } from "#enums/buttons"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; -import { MockClock } from "#test/utils/mocks/mockClock"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import GameManager from "#test/testUtils/gameManager"; +import type { MockClock } from "#test/testUtils/mocks/mockClock"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Reload", () => { let phaserGame: Phaser.Game; @@ -25,6 +26,11 @@ describe("Reload", () => { beforeEach(() => { game = new GameManager(phaserGame); + vi.spyOn(pokerogueApi, "getGameTitleStats").mockResolvedValue({ + battleCount: -1, + playerCount: -1, + }); + vi.spyOn(pokerogueApi.daily, "getSeed").mockResolvedValue("test-seed"); }); it("should not have RNG inconsistencies in a Classic run", async () => { @@ -45,7 +51,7 @@ describe("Reload", () => { .battleType("single") .startingLevel(100) // Avoid levelling up .disableTrainerWaves() - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .enemyMoveset(Moves.SPLASH); await game.dailyMode.startBattle(); @@ -78,7 +84,7 @@ describe("Reload", () => { .battleType("single") .startingLevel(100) // Avoid levelling up .disableTrainerWaves() - .moveset([ Moves.SPLASH ]) + .moveset([Moves.SPLASH]) .enemyMoveset(Moves.SPLASH); await game.classicMode.startBattle(); // Apparently daily mode would override the biome @@ -110,8 +116,7 @@ describe("Reload", () => { }, 20000); it("should not have RNG inconsistencies at a Daily run double battle", async () => { - game.override - .battleType("double"); + game.override.battleType("double"); await game.dailyMode.startBattle(); const preReloadRngState = Phaser.Math.RND.state(); @@ -124,9 +129,7 @@ describe("Reload", () => { }, 20000); it("should not have RNG inconsistencies at a Daily run Gym Leader fight", async () => { - game.override - .battleType("single") - .startingWave(40); + game.override.battleType("single").startingWave(40); await game.dailyMode.startBattle(); const preReloadRngState = Phaser.Math.RND.state(); @@ -139,9 +142,7 @@ describe("Reload", () => { }, 20000); it("should not have RNG inconsistencies at a Daily run regular trainer fight", async () => { - game.override - .battleType("single") - .startingWave(45); + game.override.battleType("single").startingWave(45); await game.dailyMode.startBattle(); const preReloadRngState = Phaser.Math.RND.state(); @@ -154,10 +155,8 @@ describe("Reload", () => { }, 20000); it("should not have RNG inconsistencies at a Daily run wave 50 Boss fight", async () => { - game.override - .battleType("single") - .startingWave(50); - await game.runToFinalBossEncounter([ Species.BULBASAUR ], GameModes.DAILY); + game.override.battleType("single").startingWave(50); + await game.runToFinalBossEncounter([Species.BULBASAUR], GameModes.DAILY); const preReloadRngState = Phaser.Math.RND.state(); diff --git a/src/test/settingMenu/helpers/inGameManip.ts b/test/settingMenu/helpers/inGameManip.ts similarity index 96% rename from src/test/settingMenu/helpers/inGameManip.ts rename to test/settingMenu/helpers/inGameManip.ts index b81e577f5b9..ca1fac3bc65 100644 --- a/src/test/settingMenu/helpers/inGameManip.ts +++ b/test/settingMenu/helpers/inGameManip.ts @@ -45,7 +45,9 @@ export class InGameManip { icon = "KEY_" + icon; } this.icon = this.config.icons[icon]; - expect(getIconForLatestInput(this.configs, this.latestSource, this.selectedDevice, this.settingName)).toEqual(this.icon); + expect(getIconForLatestInput(this.configs, this.latestSource, this.selectedDevice, this.settingName)).toEqual( + this.icon, + ); return this; } diff --git a/src/test/settingMenu/helpers/menuManip.ts b/test/settingMenu/helpers/menuManip.ts similarity index 88% rename from src/test/settingMenu/helpers/menuManip.ts rename to test/settingMenu/helpers/menuManip.ts index 0b1f48525f1..1ddd842c864 100644 --- a/src/test/settingMenu/helpers/menuManip.ts +++ b/test/settingMenu/helpers/menuManip.ts @@ -1,4 +1,15 @@ -import { assign, canIAssignThisKey, canIDeleteThisKey, canIOverrideThisSetting, deleteBind, getIconWithKeycode, getIconWithSettingName, getKeyWithKeycode, getKeyWithSettingName, getSettingNameWithKeycode } from "#app/configs/inputs/configHandler"; +import { + assign, + canIAssignThisKey, + canIDeleteThisKey, + canIOverrideThisSetting, + deleteBind, + getIconWithKeycode, + getIconWithSettingName, + getKeyWithKeycode, + getKeyWithSettingName, + getSettingNameWithKeycode, +} from "#app/configs/inputs/configHandler"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { expect } from "vitest"; @@ -29,7 +40,10 @@ export class MenuManip { const parts = input.split("_"); // Skip the first part and join the rest with an underscore - const result = parts.slice(1).map(part => part.toUpperCase()).join("_"); + const result = parts + .slice(1) + .map(part => part.toUpperCase()) + .join("_"); return result; } @@ -43,7 +57,7 @@ export class MenuManip { } iconDisplayedIs(icon) { - if (!(icon.toUpperCase().includes("KEY_"))) { + if (!icon.toUpperCase().includes("KEY_")) { icon = "KEY_" + icon.toUpperCase(); } this.iconDisplayed = this.config.icons[icon]; @@ -99,7 +113,6 @@ export class MenuManip { this.confirm(); } - confirm() { assign(this.config, this.settingName, this.keycode); } diff --git a/src/test/settingMenu/rebinding_setting.test.ts b/test/settingMenu/rebinding_setting.test.ts similarity index 72% rename from src/test/settingMenu/rebinding_setting.test.ts rename to test/settingMenu/rebinding_setting.test.ts index 37cf8032897..28b5d73d7cc 100644 --- a/src/test/settingMenu/rebinding_setting.test.ts +++ b/test/settingMenu/rebinding_setting.test.ts @@ -1,6 +1,6 @@ import cfg_keyboard_qwerty from "#app/configs/inputs/cfg_keyboard_qwerty"; import { getKeyWithKeycode, getKeyWithSettingName } from "#app/configs/inputs/configHandler"; -import { InterfaceConfig } from "#app/inputs-controller"; +import type { InterfaceConfig } from "#app/inputs-controller"; import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; import { deepCopy } from "#app/utils"; import { Button } from "#enums/buttons"; @@ -9,10 +9,12 @@ import { InGameManip } from "#test/settingMenu/helpers/inGameManip"; import { MenuManip } from "#test/settingMenu/helpers/menuManip"; import { beforeEach, describe, expect, it } from "vitest"; - describe("Test Rebinding", () => { + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let config; + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let inGame; + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let inTheSettingMenu; const configs: Map = new Map(); const selectedDevice = { @@ -100,7 +102,12 @@ describe("Test Rebinding", () => { it("Check prevent rebind indirectly the d-pad buttons", () => { inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("A"); inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Right").iconDisplayedIs("D"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("A").weWantThisBindInstead("LEFT").weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("A") + .weWantThisBindInstead("LEFT") + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Left"); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); @@ -109,7 +116,12 @@ describe("Test Rebinding", () => { it("Swap alt with a d-pad main", () => { inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Up").iconDisplayedIs("KEY_ARROW_UP").weWantThisBindInstead("W").weCantOverrideThisBind().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Up") + .iconDisplayedIs("KEY_ARROW_UP") + .weWantThisBindInstead("W") + .weCantOverrideThisBind() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); }); @@ -118,19 +130,37 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("RIGHT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("RIGHT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("UP").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("UP") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("RIGHT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("RIGHT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); @@ -142,19 +172,31 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_A").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_A") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_D").weWantThisBindInstead("W").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_D") + .weWantThisBindInstead("W") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Left"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_W").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_W") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Left"); @@ -162,18 +204,36 @@ describe("Test Rebinding", () => { }); it("Check if triple swap d-pad is prevented", () => { - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("RIGHT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("RIGHT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Right").iconDisplayedIs("KEY_ARROW_RIGHT").weWantThisBindInstead("UP").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Right") + .iconDisplayedIs("KEY_ARROW_RIGHT") + .weWantThisBindInstead("UP") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").weWantThisBindInstead("LEFT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .weWantThisBindInstead("LEFT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("LEFT").weShouldTriggerTheButton("Button_Left"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); @@ -184,19 +244,31 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_A").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_A") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Right").thereShouldBeNoIcon().weWantThisBindInstead("W").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Right") + .thereShouldBeNoIcon() + .weWantThisBindInstead("W") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Right"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_D").weWantThisBindInstead("A").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_D") + .weWantThisBindInstead("A") + .confirm(); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); @@ -216,12 +288,20 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("R").weShouldTriggerTheButton("Button_Cycle_Shiny"); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("F").weShouldTriggerTheButton("Button_Cycle_Form"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Shiny").iconDisplayedIs("KEY_R").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Shiny") + .iconDisplayedIs("KEY_R") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Button_Cycle_Shiny"); inGame.whenWePressOnKeyboard("R").nothingShouldHappen(); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("F").weShouldTriggerTheButton("Button_Cycle_Form"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Form").iconDisplayedIs("KEY_F").weWantThisBindInstead("R").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Form") + .iconDisplayedIs("KEY_F") + .weWantThisBindInstead("R") + .confirm(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Button_Cycle_Shiny"); inGame.whenWePressOnKeyboard("R").weShouldTriggerTheButton("Button_Cycle_Form"); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); @@ -231,7 +311,11 @@ describe("Test Rebinding", () => { it("Swap alt with a key not binded yet", () => { inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").iconDisplayedIs("KEY_W").weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .iconDisplayedIs("KEY_W") + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("W").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Up"); }); @@ -252,7 +336,11 @@ describe("Test Rebinding", () => { inTheSettingMenu.whenWeDelete("Alt_Button_Left").thereShouldBeNoIconAnymore(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").thereShouldBeNoIcon().weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .thereShouldBeNoIcon() + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Left"); }); @@ -261,13 +349,21 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("F").weShouldTriggerTheButton("Button_Cycle_Form"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Shiny").iconDisplayedIs("KEY_R").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Shiny") + .iconDisplayedIs("KEY_R") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("R").nothingShouldHappen(); inGame.whenWePressOnKeyboard("F").weShouldTriggerTheButton("Button_Cycle_Form"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Button_Cycle_Shiny"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Form").iconDisplayedIs("KEY_F").weWantThisBindInstead("W").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Form") + .iconDisplayedIs("KEY_F") + .weWantThisBindInstead("W") + .confirm(); inGame.whenWePressOnKeyboard("R").nothingShouldHappen(); inGame.whenWePressOnKeyboard("F").nothingShouldHappen(); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Button_Cycle_Form"); @@ -283,7 +379,11 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Down").iconDisplayedIs("KEY_S").weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Down") + .iconDisplayedIs("KEY_S") + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("R").nothingShouldHappen(); inGame.whenWePressOnKeyboard("F").nothingShouldHappen(); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Button_Cycle_Form"); @@ -293,9 +393,7 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Down"); }); - it("Delete bind then assign not already existing button", () => { - inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); @@ -303,23 +401,34 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").thereShouldBeNoIcon().weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .thereShouldBeNoIcon() + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Left"); }); - it("change alt bind to not already existing button, than another one alt bind with another not already existing button", () => { inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); inGame.whenWePressOnKeyboard("B").nothingShouldHappen(); inGame.whenWePressOnKeyboard("U").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").iconDisplayedIs("KEY_A").weWantThisBindInstead("B").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .iconDisplayedIs("KEY_A") + .weWantThisBindInstead("B") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("U").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Right").iconDisplayedIs("KEY_D").weWantThisBindInstead("U").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Right") + .iconDisplayedIs("KEY_D") + .weWantThisBindInstead("U") + .confirm(); inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); inGame.whenWePressOnKeyboard("B").weShouldTriggerTheButton("Alt_Button_Left"); @@ -331,26 +440,38 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Up").iconDisplayedIs("KEY_ARROW_UP").weWantThisBindInstead("RIGHT").weCantOverrideThisBind().weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Up") + .iconDisplayedIs("KEY_ARROW_UP") + .weWantThisBindInstead("RIGHT") + .weCantOverrideThisBind() + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").iconDisplayedIs("KEY_W").weWantThisBindInstead("D").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .iconDisplayedIs("KEY_W") + .weWantThisBindInstead("D") + .confirm(); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("W").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Up"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").iconDisplayedIs("KEY_D").weWantThisBindInstead("W").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .iconDisplayedIs("KEY_D") + .weWantThisBindInstead("W") + .confirm(); inGame.whenWePressOnKeyboard("UP").weShouldTriggerTheButton("Button_Up"); inGame.whenWePressOnKeyboard("RIGHT").weShouldTriggerTheButton("Button_Right"); inGame.whenWePressOnKeyboard("W").weShouldTriggerTheButton("Alt_Button_Up"); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); }); - it("Delete 2 bind then reassign one of them", () => { - inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").weShouldTriggerTheButton("Alt_Button_Right"); @@ -362,7 +483,11 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("A").nothingShouldHappen(); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Left").thereShouldBeNoIcon().weWantThisBindInstead("A").confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Left") + .thereShouldBeNoIcon() + .weWantThisBindInstead("A") + .confirm(); inGame.whenWePressOnKeyboard("A").weShouldTriggerTheButton("Alt_Button_Left"); inGame.whenWePressOnKeyboard("D").nothingShouldHappen(); }); @@ -391,24 +516,74 @@ describe("Test Rebinding", () => { inGame.whenWePressOnKeyboard("ESC").weShouldTriggerTheButton("Button_Menu"); inGame.whenWePressOnKeyboard("HOME").nothingShouldHappen(); inGame.whenWePressOnKeyboard("DELETE").nothingShouldHappen(); - inTheSettingMenu.whenCursorIsOnSetting("Button_Submit").iconDisplayedIs("KEY_ENTER").whenWeDelete().iconDisplayedIs("KEY_ENTER"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Up").iconDisplayedIs("KEY_ARROW_UP").whenWeDelete().iconDisplayedIs("KEY_ARROW_UP"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Down").iconDisplayedIs("KEY_ARROW_DOWN").whenWeDelete().iconDisplayedIs("KEY_ARROW_DOWN"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Left").iconDisplayedIs("KEY_ARROW_LEFT").whenWeDelete().iconDisplayedIs("KEY_ARROW_LEFT"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Right").iconDisplayedIs("KEY_ARROW_RIGHT").whenWeDelete().iconDisplayedIs("KEY_ARROW_RIGHT"); - inTheSettingMenu.whenCursorIsOnSetting("Button_Menu").iconDisplayedIs("KEY_ESC").whenWeDelete().iconDisplayedIs("KEY_ESC"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").iconDisplayedIs("KEY_W").whenWeDelete().thereShouldBeNoIconAnymore(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").thereShouldBeNoIcon().weWantThisBindInstead("DELETE").weCantAssignThisKey().butLetsForceIt(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Up").thereShouldBeNoIcon().weWantThisBindInstead("HOME").weCantAssignThisKey().butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Submit") + .iconDisplayedIs("KEY_ENTER") + .whenWeDelete() + .iconDisplayedIs("KEY_ENTER"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Up") + .iconDisplayedIs("KEY_ARROW_UP") + .whenWeDelete() + .iconDisplayedIs("KEY_ARROW_UP"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Down") + .iconDisplayedIs("KEY_ARROW_DOWN") + .whenWeDelete() + .iconDisplayedIs("KEY_ARROW_DOWN"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Left") + .iconDisplayedIs("KEY_ARROW_LEFT") + .whenWeDelete() + .iconDisplayedIs("KEY_ARROW_LEFT"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Right") + .iconDisplayedIs("KEY_ARROW_RIGHT") + .whenWeDelete() + .iconDisplayedIs("KEY_ARROW_RIGHT"); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Menu") + .iconDisplayedIs("KEY_ESC") + .whenWeDelete() + .iconDisplayedIs("KEY_ESC"); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .iconDisplayedIs("KEY_W") + .whenWeDelete() + .thereShouldBeNoIconAnymore(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .thereShouldBeNoIcon() + .weWantThisBindInstead("DELETE") + .weCantAssignThisKey() + .butLetsForceIt(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Up") + .thereShouldBeNoIcon() + .weWantThisBindInstead("HOME") + .weCantAssignThisKey() + .butLetsForceIt(); inGame.whenWePressOnKeyboard("DELETE").nothingShouldHappen(); inGame.whenWePressOnKeyboard("HOME").nothingShouldHappen(); inGame.whenWePressOnKeyboard("W").nothingShouldHappen(); }); it("check to delete all the binds of an action", () => { - inGame.whenWePressOnKeyboard("V").weShouldTriggerTheButton("Button_Cycle_Variant"); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Variant").thereShouldBeNoIcon().weWantThisBindInstead("K").confirm(); - inTheSettingMenu.whenCursorIsOnSetting("Alt_Button_Cycle_Variant").iconDisplayedIs("KEY_K").whenWeDelete().thereShouldBeNoIconAnymore(); - inTheSettingMenu.whenCursorIsOnSetting("Button_Cycle_Variant").iconDisplayedIs("KEY_V").whenWeDelete().thereShouldBeNoIconAnymore(); + inGame.whenWePressOnKeyboard("V").weShouldTriggerTheButton("Button_Cycle_Tera"); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Cycle_Tera") + .thereShouldBeNoIcon() + .weWantThisBindInstead("K") + .confirm(); + inTheSettingMenu + .whenCursorIsOnSetting("Alt_Button_Cycle_Tera") + .iconDisplayedIs("KEY_K") + .whenWeDelete() + .thereShouldBeNoIconAnymore(); + inTheSettingMenu + .whenCursorIsOnSetting("Button_Cycle_Tera") + .iconDisplayedIs("KEY_V") + .whenWeDelete() + .thereShouldBeNoIconAnymore(); }); }); diff --git a/src/test/sprites/pokemonSprite.test.ts b/test/sprites/pokemonSprite.test.ts similarity index 78% rename from src/test/sprites/pokemonSprite.test.ts rename to test/sprites/pokemonSprite.test.ts index c29f88d3143..5bd08a58cda 100644 --- a/src/test/sprites/pokemonSprite.test.ts +++ b/test/sprites/pokemonSprite.test.ts @@ -2,7 +2,7 @@ import { getAppRootDir } from "#test/sprites/spritesUtils"; import fs from "fs"; import path from "path"; import { beforeAll, describe, expect, it } from "vitest"; -import _masterlist from "../../../public/images/pokemon/variant/_masterlist.json"; +import _masterlist from "../../public/images/pokemon/variant/_masterlist.json"; type PokemonVariantMasterlist = typeof _masterlist; @@ -42,7 +42,7 @@ describe("check if every variant's sprite are correctly set", () => { const errors: string[] = []; const trimmedDirpath = `variant${path.sep}${dirpath.split(rootDir)[1]}`; if (fs.existsSync(dirpath)) { - const files = fs.readdirSync(dirpath).filter((filename) => !/^\..*/.test(filename)); + const files = fs.readdirSync(dirpath).filter(filename => !/^\..*/.test(filename)); for (const filename of files) { const filePath = `${dirpath}${filename}`; const trimmedFilePath = `${trimmedDirpath}${filename}`; @@ -54,7 +54,7 @@ describe("check if every variant's sprite are correctly set", () => { if (name.includes("_")) { const id = name.split("_")[0]; const variant = name.split("_")[1]; - const index = parseInt(variant, 10) - 1; + const index = Number.parseInt(variant, 10) - 1; if (ext !== "json") { const urlJsonFile = `${dirpath}${id}.json`; if (mlist.hasOwnProperty(id)) { @@ -78,7 +78,9 @@ describe("check if every variant's sprite are correctly set", () => { const trimmedUrlSpriteFilepath = `${trimmedDirpath}${id}_${variant}.json`; const spriteFileExists = fs.existsSync(urlSpriteJsonFile); if (spriteFileExists) { - errors.push(`[${id}] [${mlist[id]}] - the value should be 2 for the index ${index} - ${trimmedUrlSpriteFilepath}`); + errors.push( + `[${id}] [${mlist[id]}] - the value should be 2 for the index ${index} - ${trimmedUrlSpriteFilepath}`, + ); } } } @@ -92,10 +94,12 @@ describe("check if every variant's sprite are correctly set", () => { for (const key of Object.keys(data)) { if (mlist[name][key] !== 1) { // if 2, check if json there - const urlSpriteJsonFile = `${dirpath}${name}_${parseInt(key, 10) + 1}.json`; + const urlSpriteJsonFile = `${dirpath}${name}_${Number.parseInt(key, 10) + 1}.json`; const spriteFileExists = fs.existsSync(urlSpriteJsonFile); if (!spriteFileExists) { - errors.push(`[${name}] [${mlist[name]}] - the value should be 1 for the index ${key} - ${trimmedFilePath}`); + errors.push( + `[${name}] [${mlist[name]}] - the value should be 1 for the index ${key} - ${trimmedFilePath}`, + ); } } } @@ -109,10 +113,9 @@ describe("check if every variant's sprite are correctly set", () => { const errors: string[] = []; for (const key of Object.keys(keys)) { const row = keys[key]; - for (const [ index, elm ] of row.entries()) { + for (const [index, elm] of row.entries()) { let url: string; if (elm === 0) { - continue; } else if (elm === 1) { url = `${key}.json`; const filePath = `${dirPath}${url}`; @@ -122,13 +125,13 @@ describe("check if every variant's sprite are correctly set", () => { errors.push(`index: ${index} - ${filePath}`); } } else if (elm === 2) { - url = `${key}_${parseInt(index, 10) + 1}.png`; + url = `${key}_${Number.parseInt(index, 10) + 1}.png`; let filePath = `${dirPath}${url}`; if (!fs.existsSync(filePath)) { errors.push(filePath); } - url = `${key}_${parseInt(index, 10) + 1}.json`; + url = `${key}_${Number.parseInt(index, 10) + 1}.json`; filePath = `${dirPath}${url}`; if (!fs.existsSync(filePath)) { errors.push(filePath); @@ -147,7 +150,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("check female variant files", () => { @@ -156,7 +159,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("check back female variant files", () => { @@ -165,7 +168,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("check back male back variant files", () => { @@ -176,25 +179,36 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); - it("check exp back variant files", () => { - const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; - const errors = getMissingFiles(expVariant.back, dirPath); + it("check exp back female variant files", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}female${path.sep}`; + const errors = getMissingFiles(expVariant.back.female, dirPath); if (errors.length) { console.log("errors", errors); } expect(errors.length).toBe(0); }); + it("check exp back male variant files", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + const backMaleVariant = deepCopy(expVariant.back); + delete backMaleVariant.female; + const errors = getMissingFiles(backMaleVariant, dirPath); + if (errors.length) { + console.log("errors", errors); + } + expect(errors).toEqual([]); + }); + it("check exp female variant files", () => { const dirPath = `${rootDir}exp${path.sep}female${path.sep}`; const errors = getMissingFiles(expVariant.female, dirPath); if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("check exp male variant files", () => { @@ -206,7 +220,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); // check over every file if it's correctly set in the masterlist @@ -217,7 +231,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("look over every file in variant back female and check if present in masterlist", () => { @@ -226,25 +240,34 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("look over every file in variant back male and check if present in masterlist", () => { const dirPath = `${rootDir}back${path.sep}`; const backMaleVariant = deepCopy(backVariant); - const errors = getMissingMasterlist(backMaleVariant, dirPath, [ "female" ]); + const errors = getMissingMasterlist(backMaleVariant, dirPath, ["female"]); if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); - it("look over every file in variant exp back and check if present in masterlist", () => { - const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + it("look over every file in variant exp back female and check if present in masterlist", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}female${path.sep}`; const errors = getMissingMasterlist(expVariant.back, dirPath); if (errors.length) { console.log("errors for ", dirPath, errors); } + expect(errors).toEqual([]); + }); + + it("look over every file in variant exp back male and check if present in masterlist", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + const errors = getMissingMasterlist(expVariant.back, dirPath, ["female"]); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } expect(errors.length).toBe(0); }); @@ -254,24 +277,24 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("look over every file in variant exp male and check if present in masterlist", () => { const dirPath = `${rootDir}exp${path.sep}`; - const errors = getMissingMasterlist(expVariant, dirPath, [ "back", "female" ]); + const errors = getMissingMasterlist(expVariant, dirPath, ["back", "female"]); if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("look over every file in variant root and check if present in masterlist", () => { const dirPath = `${rootDir}`; - const errors = getMissingMasterlist(masterlist, dirPath, [ "back", "female", "exp", "icons" ]); + const errors = getMissingMasterlist(masterlist, dirPath, ["back", "female", "exp", "icons"]); if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); }); diff --git a/src/test/sprites/spritesUtils.ts b/test/sprites/spritesUtils.ts similarity index 62% rename from src/test/sprites/spritesUtils.ts rename to test/sprites/spritesUtils.ts index f3ee634cd76..0c4bcd875fb 100644 --- a/src/test/sprites/spritesUtils.ts +++ b/test/sprites/spritesUtils.ts @@ -1,7 +1,7 @@ -const fs = require("fs"); -const path = require("path"); +const fs = require("node:fs"); +const path = require("node:path"); -export function getAppRootDir () { +export function getAppRootDir() { let currentDir = __dirname; while (!fs.existsSync(path.join(currentDir, "package.json"))) { currentDir = path.join(currentDir, ".."); diff --git a/test/system/game_data.test.ts b/test/system/game_data.test.ts new file mode 100644 index 00000000000..93e615711c4 --- /dev/null +++ b/test/system/game_data.test.ts @@ -0,0 +1,82 @@ +import * as BattleScene from "#app/battle-scene"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import type { SessionSaveData } from "#app/system/game-data"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import GameManager from "#test/testUtils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import * as account from "#app/account"; + +describe("System - Game Data", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([Moves.SPLASH]) + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + describe("tryClearSession", () => { + beforeEach(() => { + vi.spyOn(BattleScene, "bypassLogin", "get").mockReturnValue(false); + vi.spyOn(game.scene.gameData, "getSessionSaveData").mockReturnValue({} as SessionSaveData); + vi.spyOn(account, "updateUserInfo").mockImplementation(async () => [true, 1]); + }); + + it("should return [true, true] if bypassLogin is true", async () => { + vi.spyOn(BattleScene, "bypassLogin", "get").mockReturnValue(true); + + const result = await game.scene.gameData.tryClearSession(0); + + expect(result).toEqual([true, true]); + }); + + it("should return [true, true] if successful", async () => { + vi.spyOn(pokerogueApi.savedata.session, "clear").mockResolvedValue({ + success: true, + }); + + const result = await game.scene.gameData.tryClearSession(0); + + expect(result).toEqual([true, true]); + expect(account.updateUserInfo).toHaveBeenCalled(); + }); + + it("should return [true, false] if not successful", async () => { + vi.spyOn(pokerogueApi.savedata.session, "clear").mockResolvedValue({ + success: false, + }); + + const result = await game.scene.gameData.tryClearSession(0); + + expect(result).toEqual([true, false]); + expect(account.updateUserInfo).toHaveBeenCalled(); + }); + + it("should return [false, false] session is out of date", async () => { + vi.spyOn(pokerogueApi.savedata.session, "clear").mockResolvedValue({ + error: "session out of date", + }); + + const result = await game.scene.gameData.tryClearSession(0); + + expect(result).toEqual([false, false]); + expect(account.updateUserInfo).toHaveBeenCalled(); + }); + }); +}); diff --git a/src/test/utils/TextInterceptor.ts b/test/testUtils/TextInterceptor.ts similarity index 57% rename from src/test/utils/TextInterceptor.ts rename to test/testUtils/TextInterceptor.ts index 466bcbf8052..4aaed458e44 100644 --- a/src/test/utils/TextInterceptor.ts +++ b/test/testUtils/TextInterceptor.ts @@ -9,12 +9,26 @@ export default class TextInterceptor { scene.messageWrapper = this; } - showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer): void { + showText( + text: string, + _delay?: number, + _callback?: Function, + _callbackDelay?: number, + _prompt?: boolean, + _promptDelay?: number, + ): void { console.log(text); this.logs.push(text); } - showDialogue(text: string, name: string, delay?: integer, callback?: Function, callbackDelay?: integer, promptDelay?: integer): void { + showDialogue( + text: string, + name: string, + _delay?: number, + _callback?: Function, + _callbackDelay?: number, + _promptDelay?: number, + ): void { console.log(name, text); this.logs.push(name, text); } diff --git a/src/test/utils/errorInterceptor.ts b/test/testUtils/errorInterceptor.ts similarity index 90% rename from src/test/utils/errorInterceptor.ts rename to test/testUtils/errorInterceptor.ts index 7f06c47fd39..a8fb3284b78 100644 --- a/src/test/utils/errorInterceptor.ts +++ b/test/testUtils/errorInterceptor.ts @@ -29,8 +29,7 @@ export default class ErrorInterceptor { } } - -process.on("uncaughtException", (error) => { +process.on("uncaughtException", error => { console.log(error); const toStop = ErrorInterceptor.getInstance().running; for (const elm of toStop) { @@ -40,7 +39,7 @@ process.on("uncaughtException", (error) => { }); // Global error handler for unhandled promise rejections -process.on("unhandledRejection", (reason, promise) => { +process.on("unhandledRejection", (reason, _promise) => { console.log(reason); const toStop = ErrorInterceptor.getInstance().running; for (const elm of toStop) { diff --git a/src/test/utils/fakeMobile.html b/test/testUtils/fakeMobile.html similarity index 95% rename from src/test/utils/fakeMobile.html rename to test/testUtils/fakeMobile.html index 4b566d592d9..263b03969d4 100644 --- a/src/test/utils/fakeMobile.html +++ b/test/testUtils/fakeMobile.html @@ -35,7 +35,7 @@
R
-
+
V
@@ -59,7 +59,7 @@
N
-
+
V
diff --git a/src/test/utils/gameManager.ts b/test/testUtils/gameManager.ts similarity index 65% rename from src/test/utils/gameManager.ts rename to test/testUtils/gameManager.ts index 86c51972c8b..0ebc83cae31 100644 --- a/src/test/utils/gameManager.ts +++ b/test/testUtils/gameManager.ts @@ -1,60 +1,60 @@ import { updateUserInfo } from "#app/account"; import { BattlerIndex } from "#app/battle"; import BattleScene from "#app/battle-scene"; -import { BattleStyle } from "#app/enums/battle-style"; -import { Moves } from "#app/enums/moves"; -import { getMoveTargets } from "#app/data/move"; -import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { getMoveTargets } from "#app/data/moves/move"; +import type { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import Trainer from "#app/field/trainer"; import { GameModes, getGameMode } from "#app/game-mode"; import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; import overrides from "#app/overrides"; +import { CheckSwitchPhase } from "#app/phases/check-switch-phase"; import { CommandPhase } from "#app/phases/command-phase"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { FaintPhase } from "#app/phases/faint-phase"; import { LoginPhase } from "#app/phases/login-phase"; import { MovePhase } from "#app/phases/move-phase"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { NewBattlePhase } from "#app/phases/new-battle-phase"; import { SelectStarterPhase } from "#app/phases/select-starter-phase"; -import { SelectTargetPhase } from "#app/phases/select-target-phase"; +import type { SelectTargetPhase } from "#app/phases/select-target-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; -import InputsHandler from "#app/test/utils/inputsHandler"; -import CommandUiHandler from "#app/ui/command-ui-handler"; -import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; -import PartyUiHandler from "#app/ui/party-ui-handler"; -import TargetSelectUiHandler from "#app/ui/target-select-ui-handler"; +import ErrorInterceptor from "#test/testUtils/errorInterceptor"; +import type InputsHandler from "#test/testUtils/inputsHandler"; +import type BallUiHandler from "#app/ui/ball-ui-handler"; +import type BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; +import type CommandUiHandler from "#app/ui/command-ui-handler"; +import type ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import type PartyUiHandler from "#app/ui/party-ui-handler"; +import type TargetSelectUiHandler from "#app/ui/target-select-ui-handler"; import { Mode } from "#app/ui/ui"; -import { Button } from "#enums/buttons"; -import { ExpNotification } from "#enums/exp-notification"; -import { PlayerGender } from "#enums/player-gender"; -import { Species } from "#enums/species"; -import { generateStarter, waitUntil } from "#test/utils/gameManagerUtils"; -import GameWrapper from "#test/utils/gameWrapper"; -import PhaseInterceptor from "#test/utils/phaseInterceptor"; -import TextInterceptor from "#test/utils/TextInterceptor"; -import { AES, enc } from "crypto-js"; -import fs from "fs"; -import { vi } from "vitest"; -import { ClassicModeHelper } from "./helpers/classicModeHelper"; -import { DailyModeHelper } from "./helpers/dailyModeHelper"; -import { ChallengeModeHelper } from "./helpers/challengeModeHelper"; -import { MoveHelper } from "./helpers/moveHelper"; -import { OverridesHelper } from "./helpers/overridesHelper"; -import { SettingsHelper } from "./helpers/settingsHelper"; -import { ReloadHelper } from "./helpers/reloadHelper"; -import { ModifierHelper } from "./helpers/modifiersHelper"; -import { CheckSwitchPhase } from "#app/phases/check-switch-phase"; -import BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; -import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; -import { expect } from "vitest"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { isNullOrUndefined } from "#app/utils"; -import { ExpGainsSpeed } from "#app/enums/exp-gains-speed"; +import { BattleStyle } from "#enums/battle-style"; +import { Button } from "#enums/buttons"; +import { ExpGainsSpeed } from "#enums/exp-gains-speed"; +import { ExpNotification } from "#enums/exp-notification"; +import type { Moves } from "#enums/moves"; +import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { PlayerGender } from "#enums/player-gender"; +import type { Species } from "#enums/species"; +import { generateStarter, waitUntil } from "#test/testUtils/gameManagerUtils"; +import GameWrapper from "#test/testUtils/gameWrapper"; +import { ChallengeModeHelper } from "#test/testUtils/helpers/challengeModeHelper"; +import { ClassicModeHelper } from "#test/testUtils/helpers/classicModeHelper"; +import { DailyModeHelper } from "#test/testUtils/helpers/dailyModeHelper"; +import { ModifierHelper } from "#test/testUtils/helpers/modifiersHelper"; +import { MoveHelper } from "#test/testUtils/helpers/moveHelper"; +import { OverridesHelper } from "#test/testUtils/helpers/overridesHelper"; +import { ReloadHelper } from "#test/testUtils/helpers/reloadHelper"; +import { SettingsHelper } from "#test/testUtils/helpers/settingsHelper"; +import PhaseInterceptor from "#test/testUtils/phaseInterceptor"; +import TextInterceptor from "#test/testUtils/TextInterceptor"; +import { AES, enc } from "crypto-js"; +import fs from "node:fs"; +import { expect, vi } from "vitest"; /** * Class to manage the game state and transitions between phases. @@ -79,10 +79,10 @@ export default class GameManager { * @param phaserGame - The Phaser game instance. * @param bypassLogin - Whether to bypass the login phase. */ - constructor(phaserGame: Phaser.Game, bypassLogin: boolean = true) { + constructor(phaserGame: Phaser.Game, bypassLogin = true) { localStorage.clear(); ErrorInterceptor.getInstance().clear(); - BattleScene.prototype.randBattleSeedInt = (range, min: number = 0) => min + range - 1; // This simulates a max roll + BattleScene.prototype.randBattleSeedInt = (range, min = 0) => min + range - 1; // This simulates a max roll this.gameWrapper = new GameWrapper(phaserGame, bypassLogin); this.scene = new BattleScene(); this.phaseInterceptor = new PhaseInterceptor(this.scene); @@ -115,7 +115,7 @@ export default class GameManager { * @returns A promise that resolves when the mode is set. */ waitMode(mode: Mode): Promise { - return new Promise(async (resolve) => { + return new Promise(async resolve => { await waitUntil(() => this.scene.ui?.getMode() === mode); return resolve(); }); @@ -130,12 +130,19 @@ export default class GameManager { /** * Adds an action to be executed on the next prompt. + * This can be used to (among other things) simulate inputs or run functions mid-phase. * @param phaseTarget - The target phase. * @param mode - The mode to wait for. - * @param callback - The callback to execute. + * @param callback - The callback function to execute on next prompt. * @param expireFn - Optional function to determine if the prompt has expired. */ - onNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn?: () => void, awaitingActionInput: boolean = false) { + onNextPrompt( + phaseTarget: string, + mode: Mode, + callback: () => void, + expireFn?: () => void, + awaitingActionInput = false, + ) { this.phaseInterceptor.addToNextPrompt(phaseTarget, mode, callback, expireFn, awaitingActionInput); } @@ -157,6 +164,7 @@ export default class GameManager { this.scene.enableTutorials = false; this.scene.gameData.gender = PlayerGender.MALE; // set initial player gender this.scene.battleStyle = this.settings.battleStyle; + this.scene.fieldVolume = 0; } /** @@ -173,8 +181,8 @@ export default class GameManager { this.onNextPrompt("TitlePhase", Mode.TITLE, () => { this.scene.gameMode = getGameMode(mode); const starters = generateStarter(this.scene, species); - const selectStarterPhase = new SelectStarterPhase(this.scene); - this.scene.pushPhase(new EncounterPhase(this.scene, false)); + const selectStarterPhase = new SelectStarterPhase(); + this.scene.pushPhase(new EncounterPhase(false)); selectStarterPhase.initBattle(starters); }); @@ -203,18 +211,29 @@ export default class GameManager { await this.runToTitle(); - this.onNextPrompt("TitlePhase", Mode.TITLE, () => { - this.scene.gameMode = getGameMode(GameModes.CLASSIC); - const starters = generateStarter(this.scene, species); - const selectStarterPhase = new SelectStarterPhase(this.scene); - this.scene.pushPhase(new EncounterPhase(this.scene, false)); - selectStarterPhase.initBattle(starters); - }, () => this.isCurrentPhase(EncounterPhase)); + this.onNextPrompt( + "TitlePhase", + Mode.TITLE, + () => { + this.scene.gameMode = getGameMode(GameModes.CLASSIC); + const starters = generateStarter(this.scene, species); + const selectStarterPhase = new SelectStarterPhase(); + this.scene.pushPhase(new EncounterPhase(false)); + selectStarterPhase.initBattle(starters); + }, + () => this.isCurrentPhase(EncounterPhase), + ); - this.onNextPrompt("EncounterPhase", Mode.MESSAGE, () => { - const handler = this.scene.ui.getHandler() as BattleMessageUiHandler; - handler.processInput(Button.ACTION); - }, () => this.isCurrentPhase(MysteryEncounterPhase), true); + this.onNextPrompt( + "EncounterPhase", + Mode.MESSAGE, + () => { + const handler = this.scene.ui.getHandler() as BattleMessageUiHandler; + handler.processInput(Button.ACTION); + }, + () => this.isCurrentPhase(MysteryEncounterPhase), + true, + ); await this.phaseInterceptor.run(EncounterPhase); if (!isNullOrUndefined(encounterType)) { @@ -233,15 +252,25 @@ export default class GameManager { await this.classicMode.runToSummon(species); if (this.scene.battleStyle === BattleStyle.SWITCH) { - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + this.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, + () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase), + ); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase)); + this.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, + () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnInitPhase), + ); } await this.phaseInterceptor.to(CommandPhase); @@ -254,18 +283,30 @@ export default class GameManager { * @param {BattlerIndex} targetIndex The index of the attack target, or `undefined` for multi-target attacks * @param movePosition The index of the move in the pokemon's moveset array */ - selectTarget(movePosition: integer, targetIndex?: BattlerIndex) { - this.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { - const handler = this.scene.ui.getHandler() as TargetSelectUiHandler; - const move = (this.scene.getCurrentPhase() as SelectTargetPhase).getPokemon().getMoveset()[movePosition]!.getMove(); // TODO: is the bang correct? - if (!move.isMultiTarget()) { - handler.setCursor(targetIndex !== undefined ? targetIndex : BattlerIndex.ENEMY); - } - if (move.isMultiTarget() && targetIndex !== undefined) { - throw new Error(`targetIndex was passed to selectMove() but move ("${move.name}") is not targetted`); - } - handler.processInput(Button.ACTION); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(MovePhase) || this.isCurrentPhase(TurnStartPhase) || this.isCurrentPhase(TurnEndPhase)); + selectTarget(movePosition: number, targetIndex?: BattlerIndex) { + this.onNextPrompt( + "SelectTargetPhase", + Mode.TARGET_SELECT, + () => { + const handler = this.scene.ui.getHandler() as TargetSelectUiHandler; + const move = (this.scene.getCurrentPhase() as SelectTargetPhase) + .getPokemon() + .getMoveset() + [movePosition]!.getMove(); // TODO: is the bang correct? + if (!move.isMultiTarget()) { + handler.setCursor(targetIndex !== undefined ? targetIndex : BattlerIndex.ENEMY); + } + if (move.isMultiTarget() && targetIndex !== undefined) { + throw new Error(`targetIndex was passed to selectMove() but move ("${move.name}") is not targetted`); + } + handler.processInput(Button.ACTION); + }, + () => + this.isCurrentPhase(CommandPhase) || + this.isCurrentPhase(MovePhase) || + this.isCurrentPhase(TurnStartPhase) || + this.isCurrentPhase(TurnEndPhase), + ); } /** Faint all opponents currently on the field */ @@ -278,15 +319,32 @@ export default class GameManager { /** Emulate selecting a modifier (item) */ doSelectModifier() { - this.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => { - const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - handler.processInput(Button.CANCEL); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase) || this.isCurrentPhase(CheckSwitchPhase), true); + this.onNextPrompt( + "SelectModifierPhase", + Mode.MODIFIER_SELECT, + () => { + const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + handler.processInput(Button.CANCEL); + }, + () => + this.isCurrentPhase(CommandPhase) || + this.isCurrentPhase(NewBattlePhase) || + this.isCurrentPhase(CheckSwitchPhase), + true, + ); - this.onNextPrompt("SelectModifierPhase", Mode.CONFIRM, () => { - const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - handler.processInput(Button.ACTION); - }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase) || this.isCurrentPhase(CheckSwitchPhase)); + this.onNextPrompt( + "SelectModifierPhase", + Mode.CONFIRM, + () => { + const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + handler.processInput(Button.ACTION); + }, + () => + this.isCurrentPhase(CommandPhase) || + this.isCurrentPhase(NewBattlePhase) || + this.isCurrentPhase(CheckSwitchPhase), + ); } /** @@ -303,9 +361,10 @@ export default class GameManager { vi.spyOn(enemy, "getNextMove").mockReturnValueOnce({ move: moveId, - targets: (target !== undefined && !legalTargets.multiple && legalTargets.targets.includes(target)) - ? [ target ] - : enemy.getNextTargets(moveId) + targets: + target !== undefined && !legalTargets.multiple && legalTargets.targets.includes(target) + ? [target] + : enemy.getNextTargets(moveId), }); /** @@ -320,7 +379,10 @@ export default class GameManager { const originalMatchupScore = Trainer.prototype.getPartyMemberMatchupScores; Trainer.prototype.getPartyMemberMatchupScores = () => { Trainer.prototype.getPartyMemberMatchupScores = originalMatchupScore; - return [[ 1, 100 ], [ 1, 100 ]]; + return [ + [1, 100], + [1, 100], + ]; }; } @@ -333,10 +395,15 @@ export default class GameManager { async toNextWave() { this.doSelectModifier(); - this.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.setMode(Mode.MESSAGE); - this.endPhase(); - }, () => this.isCurrentPhase(TurnInitPhase)); + this.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.setMode(Mode.MESSAGE); + this.endPhase(); + }, + () => this.isCurrentPhase(TurnInitPhase), + ); await this.toNextTurn(); } @@ -374,8 +441,8 @@ export default class GameManager { */ exportSaveToTest(): Promise { const saveKey = "x0i2O7WRiANTqPmZ"; - return new Promise(async (resolve) => { - const sessionSaveData = this.scene.gameData.getSessionSaveData(this.scene); + return new Promise(async resolve => { + const sessionSaveData = this.scene.gameData.getSessionSaveData(); const encryptedSaveData = AES.encrypt(JSON.stringify(sessionSaveData), saveKey).toString(); resolve(encryptedSaveData); }); @@ -386,7 +453,7 @@ export default class GameManager { * @param path - The path to the data file. * @returns A promise that resolves with a tuple containing a boolean indicating success and an integer status code. */ - async importData(path): Promise<[boolean, integer]> { + async importData(path): Promise<[boolean, number]> { const saveKey = "x0i2O7WRiANTqPmZ"; const dataRaw = fs.readFileSync(path, { encoding: "utf8", flag: "r" }); let dataStr = AES.decrypt(dataRaw, saveKey).toString(enc.Utf8); @@ -400,11 +467,16 @@ export default class GameManager { return updateUserInfo(); } + /** + * Faints a player or enemy pokemon instantly by setting their HP to 0. + * @param pokemon The player/enemy pokemon being fainted + * @returns A promise that resolves once the fainted pokemon's FaintPhase finishes running. + */ async killPokemon(pokemon: PlayerPokemon | EnemyPokemon) { return new Promise(async (resolve, reject) => { pokemon.hp = 0; - this.scene.pushPhase(new FaintPhase(this.scene, pokemon.getBattlerIndex(), true)); - await this.phaseInterceptor.to(FaintPhase).catch((e) => reject(e)); + this.scene.pushPhase(new FaintPhase(pokemon.getBattlerIndex(), true)); + await this.phaseInterceptor.to(FaintPhase).catch(e => reject(e)); resolve(); }); } @@ -427,7 +499,7 @@ export default class GameManager { * @param pokemonIndex the index of the pokemon in your party to revive */ doRevivePokemon(pokemonIndex: number) { - const party = this.scene.getParty(); + const party = this.scene.getPlayerParty(); const candidate = new ModifierTypeOption(modifierTypes.MAX_REVIVE(), 0); const modifier = candidate.type!.newModifier(party[pokemonIndex]); this.scene.addModifier(modifier, false); @@ -453,8 +525,27 @@ export default class GameManager { } /** - * Intercepts `TurnStartPhase` and mocks the getSpeedOrder's return value {@linkcode TurnStartPhase.getSpeedOrder} - * Used to modify the turn order. + * Select the BALL option from the command menu, then press Action; in the BALL + * menu, select a pokéball type and press Action again to throw it. + * @param ballIndex the index of the pokeball to throw + */ + public doThrowPokeball(ballIndex: number) { + this.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + (this.scene.ui.getHandler() as CommandUiHandler).setCursor(1); + (this.scene.ui.getHandler() as CommandUiHandler).processInput(Button.ACTION); + }); + + this.onNextPrompt("CommandPhase", Mode.BALL, () => { + const ballHandler = this.scene.ui.getHandler() as BallUiHandler; + ballHandler.setCursor(ballIndex); + ballHandler.processInput(Button.ACTION); // select ball and throw + }); + } + + /** + * Intercepts `TurnStartPhase` and mocks {@linkcode TurnStartPhase.getSpeedOrder}'s return value. + * Used to manually modify Pokemon turn order. + * Note: This *DOES NOT* account for priority, only speed. * @param {BattlerIndex[]} order The turn order to set * @example * ```ts @@ -468,7 +559,7 @@ export default class GameManager { } /** - * Removes all held items from enemy pokemon + * Removes all held items from enemy pokemon. */ removeEnemyHeldItems(): void { this.scene.clearEnemyHeldItemModifiers(); diff --git a/src/test/utils/gameManagerUtils.ts b/test/testUtils/gameManagerUtils.ts similarity index 62% rename from src/test/utils/gameManagerUtils.ts rename to test/testUtils/gameManagerUtils.ts index 543ee9627fe..ae6c11f5efa 100644 --- a/src/test/utils/gameManagerUtils.ts +++ b/test/testUtils/gameManagerUtils.ts @@ -1,13 +1,14 @@ -import BattleScene from "#app/battle-scene"; +import Battle, { BattleType } from "#app/battle"; +import type BattleScene from "#app/battle-scene"; import { getDailyRunStarters } from "#app/data/daily-run"; import { Gender } from "#app/data/gender"; import { getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; -import { Moves } from "#app/enums/moves"; import { PlayerPokemon } from "#app/field/pokemon"; import { GameModes, getGameMode } from "#app/game-mode"; -import { Starter } from "#app/ui/starter-select-ui-handler"; -import { Species } from "#enums/species"; -import Battle, { BattleType } from "#app/battle"; +import type { StarterMoveset } from "#app/system/game-data"; +import type { Starter } from "#app/ui/starter-select-ui-handler"; +import { Moves } from "#enums/moves"; +import type { Species } from "#enums/species"; /** Function to convert Blob to string */ export function blobToString(blob) { @@ -26,30 +27,42 @@ export function blobToString(blob) { }); } - export function holdOn(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } -export function generateStarter(scene, species?: Species[]) { +export function generateStarter(scene: BattleScene, species?: Species[]): Starter[] { const seed = "test"; - const starters = getTestRunStarters(scene, seed, species); + const starters = getTestRunStarters(seed, species); const startingLevel = scene.gameMode.getStartingLevel(); for (const starter of starters) { const starterProps = scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); - const starterGender = starter.species.malePercent !== null - ? !starterProps.female ? Gender.MALE : Gender.FEMALE - : Gender.GENDERLESS; - const starterPokemon = scene.addPlayerPokemon(starter.species, startingLevel, starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, undefined, starter.nature); - starter.moveset = starterPokemon.moveset; + const starterGender = + starter.species.malePercent !== null ? (!starterProps.female ? Gender.MALE : Gender.FEMALE) : Gender.GENDERLESS; + const starterPokemon = scene.addPlayerPokemon( + starter.species, + startingLevel, + starter.abilityIndex, + starterFormIndex, + starterGender, + starterProps.shiny, + starterProps.variant, + undefined, + starter.nature, + ); + const moveset: Moves[] = []; + starterPokemon.moveset.forEach(move => { + moveset.push(move!.getMove().id); + }); + starter.moveset = moveset as StarterMoveset; } return starters; } -function getTestRunStarters(scene, seed, species) { +function getTestRunStarters(seed: string, species?: Species[]): Starter[] { if (!species) { - return getDailyRunStarters(scene, seed); + return getDailyRunStarters(seed); } const starters: Starter[] = []; const startingLevel = getGameMode(GameModes.CLASSIC).getStartingLevel(); @@ -57,21 +70,21 @@ function getTestRunStarters(scene, seed, species) { for (const specie of species) { const starterSpeciesForm = getPokemonSpeciesForm(specie, 0); const starterSpecies = getPokemonSpecies(starterSpeciesForm.speciesId); - const pokemon = new PlayerPokemon(scene, starterSpecies, startingLevel, undefined, 0, undefined, undefined, undefined, undefined, undefined, undefined); + const pokemon = new PlayerPokemon(starterSpecies, startingLevel, undefined, 0); const starter: Starter = { species: starterSpecies, dexAttr: pokemon.getDexAttr(), abilityIndex: pokemon.abilityIndex, passive: false, nature: pokemon.getNature(), - pokerus: pokemon.pokerus + pokerus: pokemon.pokerus, }; starters.push(starter); } return starters; } -export function waitUntil(truth) { +export function waitUntil(truth): Promise { return new Promise(resolve => { const interval = setInterval(() => { if (truth()) { @@ -83,29 +96,37 @@ export function waitUntil(truth) { } /** Get the index of `move` from the moveset of the pokemon on the player's field at location `pokemonIndex` */ -export function getMovePosition(scene: BattleScene, pokemonIndex: 0 | 1, move: Moves) { +export function getMovePosition(scene: BattleScene, pokemonIndex: 0 | 1, move: Moves): number { const playerPokemon = scene.getPlayerField()[pokemonIndex]; const moveSet = playerPokemon.getMoveset(); - const index = moveSet.findIndex((m) => m?.moveId === move && m?.ppUsed < m?.getMovePp()); + const index = moveSet.findIndex(m => m?.moveId === move && m?.ppUsed < m?.getMovePp()); console.log(`Move position for ${Moves[move]} (=${move}):`, index); return index; } /** * Useful for populating party, wave index, etc. without having to spin up and run through an entire EncounterPhase - * @param scene - * @param species */ -export function initSceneWithoutEncounterPhase(scene: BattleScene, species?: Species[]) { +export function initSceneWithoutEncounterPhase(scene: BattleScene, species?: Species[]): void { const starters = generateStarter(scene, species); - starters.forEach((starter) => { + starters.forEach(starter => { const starterProps = scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); const starterGender = Gender.MALE; const starterIvs = scene.gameData.dexData[starter.species.speciesId].ivs.slice(0); - const starterPokemon = scene.addPlayerPokemon(starter.species, scene.gameMode.getStartingLevel(), starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, starterIvs, starter.nature); + const starterPokemon = scene.addPlayerPokemon( + starter.species, + scene.gameMode.getStartingLevel(), + starter.abilityIndex, + starterFormIndex, + starterGender, + starterProps.shiny, + starterProps.variant, + starterIvs, + starter.nature, + ); starter.moveset && starterPokemon.tryPopulateMoveset(starter.moveset); - scene.getParty().push(starterPokemon); + scene.getPlayerParty().push(starterPokemon); }); scene.currentBattle = new Battle(getGameMode(GameModes.CLASSIC), 5, BattleType.WILD, undefined, false); diff --git a/src/test/utils/gameWrapper.ts b/test/testUtils/gameWrapper.ts similarity index 77% rename from src/test/utils/gameWrapper.ts rename to test/testUtils/gameWrapper.ts index 48c0007118b..6af36f22d24 100644 --- a/src/test/utils/gameWrapper.ts +++ b/test/testUtils/gameWrapper.ts @@ -4,17 +4,18 @@ import BattleScene, * as battleScene from "#app/battle-scene"; import { MoveAnim } from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as Utils from "#app/utils"; -import { blobToString } from "#test/utils/gameManagerUtils"; -import { MockClock } from "#test/utils/mocks/mockClock"; -import mockConsoleLog from "#test/utils/mocks/mockConsoleLog"; -import { MockFetch } from "#test/utils/mocks/mockFetch"; -import MockLoader from "#test/utils/mocks/mockLoader"; -import mockLocalStorage from "#test/utils/mocks/mockLocalStorage"; -import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; -import MockTextureManager from "#test/utils/mocks/mockTextureManager"; -import fs from "fs"; +import { blobToString } from "#test/testUtils/gameManagerUtils"; +import { MockClock } from "#test/testUtils/mocks/mockClock"; +import mockConsoleLog from "#test/testUtils/mocks/mockConsoleLog"; +import { MockFetch } from "#test/testUtils/mocks/mockFetch"; +import MockLoader from "#test/testUtils/mocks/mockLoader"; +import mockLocalStorage from "#test/testUtils/mocks/mockLocalStorage"; +import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; +import fs from "node:fs"; import Phaser from "phaser"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { vi } from "vitest"; import { MockGameObjectCreator } from "./mocks/mockGameObjectCreator"; import InputManager = Phaser.Input.InputManager; @@ -23,7 +24,8 @@ import KeyboardPlugin = Phaser.Input.Keyboard.KeyboardPlugin; import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; import EventEmitter = Phaser.Events.EventEmitter; import UpdateList = Phaser.GameObjects.UpdateList; -import { version } from "../../../package.json"; +import { version } from "../../package.json"; +import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; Object.defineProperty(window, "localStorage", { value: mockLocalStorage(), @@ -32,7 +34,8 @@ Object.defineProperty(window, "console", { value: mockConsoleLog(false), }); - +BBCodeText.prototype.destroy = () => null; +BBCodeText.prototype.resize = () => null; InputText.prototype.setElement = () => null; InputText.prototype.resize = () => null; Phaser.GameObjects.Image = MockImage; @@ -44,14 +47,12 @@ window.URL.createObjectURL = (blob: Blob) => { }; navigator.getGamepads = () => []; global.fetch = vi.fn(MockFetch); -Utils.setCookie(Utils.sessionIdKey, 'fake_token'); - +Utils.setCookie(Utils.sessionIdKey, "fake_token"); window.matchMedia = () => ({ matches: false, }); - /** * Sets this object's position relative to another object with a given offset * @param guideObject {@linkcode Phaser.GameObjects.GameObject} to base the position off of @@ -71,14 +72,13 @@ Phaser.GameObjects.NineSlice.prototype.setPositionRelative = setPositionRelative Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; - export default class GameWrapper { public game: Phaser.Game; public scene: BattleScene; constructor(phaserGame: Phaser.Game, bypassLogin: boolean) { - Phaser.Math.RND.sow([ 'test' ]); - vi.spyOn(Utils, "apiFetch", "get").mockReturnValue(fetch); + Phaser.Math.RND.sow(["test"]); + // vi.spyOn(Utils, "apiFetch", "get").mockReturnValue(fetch); if (bypassLogin) { vi.spyOn(battleScene, "bypassLogin", "get").mockReturnValue(true); } @@ -89,20 +89,25 @@ export default class GameWrapper { Pokemon.prototype.enableMask = () => null; Pokemon.prototype.updateFusionPalette = () => null; Pokemon.prototype.cry = () => null; - Pokemon.prototype.faintCry = (cb) => { if (cb) cb(); }; + Pokemon.prototype.faintCry = cb => { + if (cb) { + cb(); + } + }; + BattleScene.prototype.addPokemonIcon = () => new Phaser.GameObjects.Container(this.scene); } setScene(scene: BattleScene) { this.scene = scene; this.injectMandatory(); - this.scene.preload && this.scene.preload(); + this.scene.preload?.(); this.scene.create(); } injectMandatory() { this.game.config = { seed: ["test"], - gameVersion: version + gameVersion: version, }; this.scene.game = this.game; this.game.renderer = { @@ -125,7 +130,7 @@ export default class GameWrapper { pause: () => null, setRate: () => null, add: () => this.scene.sound, - get: () => ({...this.scene.sound, totalDuration: 0}), + get: () => ({ ...this.scene.sound, totalDuration: 0 }), getAllPlaying: () => [], manager: { game: this.game, @@ -134,7 +139,7 @@ export default class GameWrapper { setVolume: () => null, stop: () => null, stopByKey: () => null, - on: (evt, callback) => callback(), + on: (_evt, callback) => callback(), key: "", }; @@ -146,15 +151,15 @@ export default class GameWrapper { }; this.scene.tweens = { - add: (data) => { + add: data => { if (data.onComplete) { data.onComplete(); } }, - getTweensOf: () => ([]), - killTweensOf: () => ([]), + getTweensOf: () => [], + killTweensOf: () => [], chain: () => null, - addCounter: (data) => { + addCounter: data => { if (data.onComplete) { data.onComplete(); } @@ -181,14 +186,15 @@ export default class GameWrapper { game: this.game, textures: { addCanvas: () => ({ - get: () => ({ // this.frame in Text.js + get: () => ({ + // this.frame in Text.js source: {}, setSize: () => null, glTexture: () => ({ spectorMetadata: {}, }), }), - }) + }), }, cache: this.scene.load.cacheManager, scale: this.game.scale, @@ -199,29 +205,30 @@ export default class GameWrapper { events: new EventEmitter(), settings: { loader: { - key: 'battle', - } + key: "battle", + }, }, input: this.game.input, }; const mockTextureManager = new MockTextureManager(this.scene); this.scene.add = mockTextureManager.add; this.scene.textures = mockTextureManager; - this.scene.sys.displayList = this.scene.add.displayList; + this.scene.sys.displayList = this.scene.add.displayList; this.scene.sys.updateList = new UpdateList(this.scene); this.scene.systems = this.scene.sys; this.scene.input = this.game.input; this.scene.scene = this.scene; this.scene.input.keyboard = new KeyboardPlugin(this.scene); this.scene.input.gamepad = new GamepadPlugin(this.scene); - this.scene.cachedFetch = (url, init) => { - return new Promise((resolve) => { + this.scene.cachedFetch = (url, _init) => { + return new Promise(resolve => { // need to remove that if later we want to test battle-anims - const newUrl = url.includes('./battle-anims/') ? prependPath('./battle-anims/tackle.json') : prependPath(url); + const newUrl = url.includes("./battle-anims/") ? prependPath("./battle-anims/tackle.json") : prependPath(url); + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let raw; try { - raw = fs.readFileSync(newUrl, {encoding: "utf8", flag: "r"}); - } catch(e) { + raw = fs.readFileSync(newUrl, { encoding: "utf8", flag: "r" }); + } catch (_e) { return resolve(createFetchBadResponse({})); } const data = JSON.parse(raw); @@ -232,6 +239,7 @@ export default class GameWrapper { this.scene.make = new MockGameObjectCreator(mockTextureManager); this.scene.time = new MockClock(this.scene); this.scene.remove = vi.fn(); // TODO: this should be stubbed differently + this.scene.eventManager = new MockTimedEventManager(); // Disable Timed Events } } diff --git a/src/test/utils/helpers/challengeModeHelper.ts b/test/testUtils/helpers/challengeModeHelper.ts similarity index 73% rename from src/test/utils/helpers/challengeModeHelper.ts rename to test/testUtils/helpers/challengeModeHelper.ts index 5210d942d5a..0b7826eda7e 100644 --- a/src/test/utils/helpers/challengeModeHelper.ts +++ b/test/testUtils/helpers/challengeModeHelper.ts @@ -1,22 +1,21 @@ import { BattleStyle } from "#app/enums/battle-style"; -import { Species } from "#app/enums/species"; +import type { Species } from "#app/enums/species"; import overrides from "#app/overrides"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { SelectStarterPhase } from "#app/phases/select-starter-phase"; import { Mode } from "#app/ui/ui"; import { generateStarter } from "../gameManagerUtils"; import { GameManagerHelper } from "./gameManagerHelper"; -import { Challenge } from "#app/data/challenge"; +import type { Challenge } from "#app/data/challenge"; import { CommandPhase } from "#app/phases/command-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; -import { Challenges } from "#enums/challenges"; +import type { Challenges } from "#enums/challenges"; import { copyChallenge } from "data/challenge"; /** * Helper to handle Challenge mode specifics */ export class ChallengeModeHelper extends GameManagerHelper { - challenges: Challenge[] = []; /** @@ -45,8 +44,8 @@ export class ChallengeModeHelper extends GameManagerHelper { this.game.onNextPrompt("TitlePhase", Mode.TITLE, () => { this.game.scene.gameMode.challenges = this.challenges; const starters = generateStarter(this.game.scene, species); - const selectStarterPhase = new SelectStarterPhase(this.game.scene); - this.game.scene.pushPhase(new EncounterPhase(this.game.scene, false)); + const selectStarterPhase = new SelectStarterPhase(); + this.game.scene.pushPhase(new EncounterPhase(false)); selectStarterPhase.initBattle(starters); }); @@ -65,15 +64,25 @@ export class ChallengeModeHelper extends GameManagerHelper { await this.runToSummon(species); if (this.game.scene.battleStyle === BattleStyle.SWITCH) { - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); } await this.game.phaseInterceptor.to(CommandPhase); diff --git a/src/test/utils/helpers/classicModeHelper.ts b/test/testUtils/helpers/classicModeHelper.ts similarity index 70% rename from src/test/utils/helpers/classicModeHelper.ts rename to test/testUtils/helpers/classicModeHelper.ts index 80d0b86de7b..5b6a38f5747 100644 --- a/src/test/utils/helpers/classicModeHelper.ts +++ b/test/testUtils/helpers/classicModeHelper.ts @@ -1,5 +1,5 @@ import { BattleStyle } from "#app/enums/battle-style"; -import { Species } from "#app/enums/species"; +import type { Species } from "#app/enums/species"; import { GameModes, getGameMode } from "#app/game-mode"; import overrides from "#app/overrides"; import { CommandPhase } from "#app/phases/command-phase"; @@ -14,7 +14,6 @@ import { GameManagerHelper } from "./gameManagerHelper"; * Helper to handle classic mode specifics */ export class ClassicModeHelper extends GameManagerHelper { - /** * Runs the classic game to the summon phase. * @param species - Optional array of species to summon. @@ -30,12 +29,12 @@ export class ClassicModeHelper extends GameManagerHelper { this.game.onNextPrompt("TitlePhase", Mode.TITLE, () => { this.game.scene.gameMode = getGameMode(GameModes.CLASSIC); const starters = generateStarter(this.game.scene, species); - const selectStarterPhase = new SelectStarterPhase(this.game.scene); - this.game.scene.pushPhase(new EncounterPhase(this.game.scene, false)); + const selectStarterPhase = new SelectStarterPhase(); + this.game.scene.pushPhase(new EncounterPhase(false)); selectStarterPhase.initBattle(starters); }); - await this.game.phaseInterceptor.run(EncounterPhase); + await this.game.phaseInterceptor.to(EncounterPhase); if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) { this.game.removeEnemyHeldItems(); } @@ -50,15 +49,25 @@ export class ClassicModeHelper extends GameManagerHelper { await this.runToSummon(species); if (this.game.scene.battleStyle === BattleStyle.SWITCH) { - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); } await this.game.phaseInterceptor.to(CommandPhase); diff --git a/src/test/utils/helpers/dailyModeHelper.ts b/test/testUtils/helpers/dailyModeHelper.ts similarity index 72% rename from src/test/utils/helpers/dailyModeHelper.ts rename to test/testUtils/helpers/dailyModeHelper.ts index 813544f85df..0f5bc84df68 100644 --- a/src/test/utils/helpers/dailyModeHelper.ts +++ b/test/testUtils/helpers/dailyModeHelper.ts @@ -5,7 +5,7 @@ import { CommandPhase } from "#app/phases/command-phase"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; -import SaveSlotSelectUiHandler from "#app/ui/save-slot-select-ui-handler"; +import type SaveSlotSelectUiHandler from "#app/ui/save-slot-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { GameManagerHelper } from "./gameManagerHelper"; @@ -13,7 +13,6 @@ import { GameManagerHelper } from "./gameManagerHelper"; * Helper to handle daily mode specifics */ export class DailyModeHelper extends GameManagerHelper { - /** * Runs the daily game to the summon phase. * @returns A promise that resolves when the summon phase is reached. @@ -26,7 +25,7 @@ export class DailyModeHelper extends GameManagerHelper { } this.game.onNextPrompt("TitlePhase", Mode.TITLE, () => { - const titlePhase = new TitlePhase(this.game.scene); + const titlePhase = new TitlePhase(); titlePhase.initDailyRun(); }); @@ -50,15 +49,25 @@ export class DailyModeHelper extends GameManagerHelper { await this.runToSummon(); if (this.game.scene.battleStyle === BattleStyle.SWITCH) { - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); } await this.game.phaseInterceptor.to(CommandPhase); diff --git a/src/test/utils/helpers/gameManagerHelper.ts b/test/testUtils/helpers/gameManagerHelper.ts similarity index 80% rename from src/test/utils/helpers/gameManagerHelper.ts rename to test/testUtils/helpers/gameManagerHelper.ts index 432e6fdf853..85d7bc0df97 100644 --- a/src/test/utils/helpers/gameManagerHelper.ts +++ b/test/testUtils/helpers/gameManagerHelper.ts @@ -1,4 +1,4 @@ -import GameManager from "../gameManager"; +import type GameManager from "../gameManager"; /** * Base class for defining all game helpers. diff --git a/src/test/utils/helpers/modifiersHelper.ts b/test/testUtils/helpers/modifiersHelper.ts similarity index 93% rename from src/test/utils/helpers/modifiersHelper.ts rename to test/testUtils/helpers/modifiersHelper.ts index c38bf5770a8..22500c87906 100644 --- a/src/test/utils/helpers/modifiersHelper.ts +++ b/test/testUtils/helpers/modifiersHelper.ts @@ -1,6 +1,7 @@ import { expect } from "vitest"; import { GameManagerHelper } from "./gameManagerHelper"; -import { itemPoolChecks, ModifierTypeKeys } from "#app/modifier/modifier-type"; +import type { ModifierTypeKeys } from "#app/modifier/modifier-type"; +import { itemPoolChecks } from "#app/modifier/modifier-type"; export class ModifierHelper extends GameManagerHelper { /** diff --git a/src/test/utils/helpers/moveHelper.ts b/test/testUtils/helpers/moveHelper.ts similarity index 50% rename from src/test/utils/helpers/moveHelper.ts rename to test/testUtils/helpers/moveHelper.ts index 73fe63395fd..543f46b2026 100644 --- a/src/test/utils/helpers/moveHelper.ts +++ b/test/testUtils/helpers/moveHelper.ts @@ -1,12 +1,16 @@ -import { BattlerIndex } from "#app/battle"; +import type { BattlerIndex } from "#app/battle"; +import { Button } from "#app/enums/buttons"; +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 type { CommandPhase } from "#app/phases/command-phase"; +import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; import { Moves } from "#enums/moves"; -import { getMovePosition } from "#test/utils/gameManagerUtils"; -import { GameManagerHelper } from "#test/utils/helpers/gameManagerHelper"; +import { getMovePosition } from "#test/testUtils/gameManagerUtils"; +import { GameManagerHelper } from "#test/testUtils/helpers/gameManagerHelper"; import { vi } from "vitest"; /** @@ -29,7 +33,7 @@ export class MoveHelper extends GameManagerHelper { * Used to force a move to miss. * @param firstTargetOnly - Whether the move should force miss on the first target only, in the case of multi-target moves. */ - public async forceMiss(firstTargetOnly: boolean = false): Promise { + public async forceMiss(firstTargetOnly = false): Promise { await this.game.phaseInterceptor.to(MoveEffectPhase, false); const hitCheck = vi.spyOn(this.game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck"); @@ -71,4 +75,57 @@ export class MoveHelper extends GameManagerHelper { await this.game.phaseInterceptor.to("MovePhase"); vi.spyOn(Overrides, "STATUS_ACTIVATION_OVERRIDE", "get").mockReturnValue(null); } + + /** + * Changes a pokemon's moveset to the given move(s). + * Used when the normal moveset override can't be used (such as when it's necessary to check or update properties of the moveset). + * @param pokemon - The {@linkcode Pokemon} being modified + * @param moveset - The {@linkcode Moves} (single or array) to change the Pokemon's moveset to + */ + 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(", ")}])!`); + } + + /** + * Simulates learning a move for a player pokemon. + * @param move The {@linkcode Moves} being learnt + * @param partyIndex The party position of the {@linkcode PlayerPokemon} learning the move (defaults to 0) + * @param moveSlotIndex The INDEX (0-4) of the move slot to replace if existent move slots are full; + * defaults to 0 (first slot) and 4 aborts the procedure + * @returns a promise that resolves once the move has been successfully learnt + */ + public async learnMove(move: Moves | number, partyIndex = 0, moveSlotIndex = 0) { + return new Promise(async (resolve, reject) => { + this.game.scene.pushPhase(new LearnMovePhase(partyIndex, move)); + + // if slots are full, queue up inputs to replace existing moves + if (this.game.scene.getPlayerParty()[partyIndex].moveset.filter(m => m).length === 4) { + this.game.onNextPrompt("LearnMovePhase", Mode.CONFIRM, () => { + this.game.scene.ui.processInput(Button.ACTION); // "Should a move be forgotten and replaced with XXX?" + }); + this.game.onNextPrompt("LearnMovePhase", Mode.SUMMARY, () => { + for (let x = 0; x < (moveSlotIndex ?? 0); x++) { + this.game.scene.ui.processInput(Button.DOWN); // Scrolling in summary pane to move position + } + this.game.scene.ui.processInput(Button.ACTION); + if (moveSlotIndex === 4) { + this.game.onNextPrompt("LearnMovePhase", Mode.CONFIRM, () => { + this.game.scene.ui.processInput(Button.ACTION); // "Give up on learning XXX?" + }); + } + }); + } + + await this.game.phaseInterceptor.to(LearnMovePhase).catch(e => reject(e)); + resolve(); + }); + } } diff --git a/src/test/utils/helpers/overridesHelper.ts b/test/testUtils/helpers/overridesHelper.ts similarity index 82% rename from src/test/utils/helpers/overridesHelper.ts rename to test/testUtils/helpers/overridesHelper.ts index 404f5c34a26..e69e05bce45 100644 --- a/src/test/utils/helpers/overridesHelper.ts +++ b/test/testUtils/helpers/overridesHelper.ts @@ -1,28 +1,31 @@ -import { StatusEffect } from "#app/data/status-effect"; -import { Weather, WeatherType } from "#app/data/weather"; +import type { Variant } from "#app/data/variant"; +import { Weather } from "#app/data/weather"; import { Abilities } from "#app/enums/abilities"; -import { Biome } from "#app/enums/biome"; -import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; import * as GameMode from "#app/game-mode"; -import { GameModes, getGameMode } from "#app/game-mode"; -import { ModifierOverride } from "#app/modifier/modifier-type"; +import type { GameModes } from "#app/game-mode"; +import { getGameMode } from "#app/game-mode"; +import type { ModifierOverride } from "#app/modifier/modifier-type"; +import type { BattleStyle } from "#app/overrides"; import Overrides from "#app/overrides"; +import type { Unlockables } from "#app/system/unlockables"; +import { Biome } from "#enums/biome"; +import { Moves } from "#enums/moves"; +import type { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import type { WeatherType } from "#enums/weather-type"; import { vi } from "vitest"; import { GameManagerHelper } from "./gameManagerHelper"; -import { Unlockables } from "#app/system/unlockables"; -import { Variant } from "#app/data/variant"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; /** * Helper to handle overrides in tests */ export class OverridesHelper extends GameManagerHelper { /** If `true`, removes the starting items from enemies at the start of each test; default `true` */ - public removeEnemyStartingItems: boolean = true; + public removeEnemyStartingItems = true; /** If `true`, sets the shiny overrides to disable shinies at the start of each test; default `true` */ - public disableShinies: boolean = true; + public disableShinies = true; /** * Override the starting biome @@ -68,6 +71,26 @@ export class OverridesHelper extends GameManagerHelper { return this; } + /** + * Override the wave level cap + * @param cap the level cap value to set; 0 uses normal level caps and negative values + * disable it completely + * @returns `this` + */ + public levelCap(cap: number): this { + vi.spyOn(Overrides, "LEVEL_CAP_OVERRIDE", "get").mockReturnValue(cap); + let capStr: string; + if (cap > 0) { + capStr = `Level cap set to ${cap}!`; + } else if (cap < 0) { + capStr = "Level cap disabled!"; + } else { + capStr = "Level cap reset to default value for wave."; + } + this.log(capStr); + return this; + } + /** * Override the player (pokemon) starting held items * @param items the items to hold @@ -119,7 +142,7 @@ export class OverridesHelper extends GameManagerHelper { public starterForms(forms: Partial>): this { vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue(forms); const formsStr = Object.entries(forms) - .map(([ speciesId, formIndex ]) => `${Species[speciesId]}=${formIndex}`) + .map(([speciesId, formIndex]) => `${Species[speciesId]}=${formIndex}`) .join(", "); this.log(`Player Pokemon form set to: ${formsStr}!`); return this; @@ -137,7 +160,7 @@ export class OverridesHelper extends GameManagerHelper { } /** - * Override the player (pokemon) {@linkcode Abilities | ability} + * Override the player (pokemon) {@linkcode Abilities | ability}. * @param ability the (pokemon) {@linkcode Abilities | ability} to set * @returns `this` */ @@ -158,6 +181,20 @@ export class OverridesHelper extends GameManagerHelper { return this; } + /** + * Forces the status of the player (pokemon) **passive** {@linkcode Abilities | ability} + * @param hasPassiveAbility forces the passive to be active if `true`, inactive if `false` + * @returns `this` + */ + public hasPassiveAbility(hasPassiveAbility: boolean | null): this { + vi.spyOn(Overrides, "HAS_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(hasPassiveAbility); + if (hasPassiveAbility === null) { + this.log("Player Pokemon PASSIVE ability no longer force enabled or disabled!"); + } else { + this.log(`Player Pokemon PASSIVE ability is force ${hasPassiveAbility ? "enabled" : "disabled"}!`); + } + return this; + } /** * Override the player (pokemon) {@linkcode Moves | moves}set * @param moveset the {@linkcode Moves | moves}set to set @@ -166,9 +203,9 @@ export class OverridesHelper extends GameManagerHelper { public moveset(moveset: Moves | Moves[]): this { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(moveset); if (!Array.isArray(moveset)) { - moveset = [ moveset ]; + moveset = [moveset]; } - const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + const movesetStr = moveset.map(moveId => Moves[moveId]).join(", "); this.log(`Player Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); return this; } @@ -228,7 +265,7 @@ export class OverridesHelper extends GameManagerHelper { public seed(seed: string): this { vi.spyOn(this.game.scene, "resetSeed").mockImplementation(() => { this.game.scene.waveSeed = seed; - Phaser.Math.RND.sow([ seed ]); + Phaser.Math.RND.sow([seed]); this.game.scene.rngCounter = 0; }); this.game.scene.resetSeed(); @@ -237,13 +274,14 @@ export class OverridesHelper extends GameManagerHelper { } /** - * Override the battle type (single or double) + * Override the battle type (e.g., single or double). + * @see {@linkcode Overrides.BATTLE_TYPE_OVERRIDE} * @param battleType battle type to set * @returns `this` */ - public battleType(battleType: "single" | "double" | null): this { + public battleType(battleType: BattleStyle | null): this { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue(battleType); - this.log(`Battle type set to ${battleType} only!`); + this.log(battleType === null ? "Battle type override disabled!" : `Battle type set to ${battleType}!`); return this; } @@ -301,6 +339,21 @@ export class OverridesHelper extends GameManagerHelper { return this; } + /** + * Forces the status of the enemy (pokemon) **passive** {@linkcode Abilities | ability} + * @param hasPassiveAbility forces the passive to be active if `true`, inactive if `false` + * @returns `this` + */ + public enemyHasPassiveAbility(hasPassiveAbility: boolean | null): this { + vi.spyOn(Overrides, "OPP_HAS_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(hasPassiveAbility); + if (hasPassiveAbility === null) { + this.log("Enemy Pokemon PASSIVE ability no longer force enabled or disabled!"); + } else { + this.log(`Enemy Pokemon PASSIVE ability is force ${hasPassiveAbility ? "enabled" : "disabled"}!`); + } + return this; + } + /** * Override the enemy (pokemon) {@linkcode Moves | moves}set * @param moveset the {@linkcode Moves | moves}set to set @@ -309,9 +362,9 @@ export class OverridesHelper extends GameManagerHelper { public enemyMoveset(moveset: Moves | Moves[]): this { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(moveset); if (!Array.isArray(moveset)) { - moveset = [ moveset ]; + moveset = [moveset]; } - const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + const movesetStr = moveset.map(moveId => Moves[moveId]).join(", "); this.log(`Enemy Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); return this; } diff --git a/src/test/utils/helpers/reloadHelper.ts b/test/testUtils/helpers/reloadHelper.ts similarity index 64% rename from src/test/utils/helpers/reloadHelper.ts rename to test/testUtils/helpers/reloadHelper.ts index e0e538120cc..842cd88b95c 100644 --- a/src/test/utils/helpers/reloadHelper.ts +++ b/test/testUtils/helpers/reloadHelper.ts @@ -5,8 +5,8 @@ import { vi } from "vitest"; import { BattleStyle } from "#app/enums/battle-style"; import { CommandPhase } from "#app/phases/command-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; -import { SessionSaveData } from "#app/system/game-data"; -import GameManager from "../gameManager"; +import type { SessionSaveData } from "#app/system/game-data"; +import type GameManager from "../gameManager"; /** * Helper to allow reloading sessions in unit tests. @@ -18,9 +18,9 @@ export class ReloadHelper extends GameManagerHelper { super(game); // Whenever the game saves the session, save it to the reloadHelper instead - vi.spyOn(game.scene.gameData, "saveAll").mockImplementation((scene) => { - return new Promise((resolve, reject) => { - this.sessionData = scene.gameData.getSessionSaveData(scene); + vi.spyOn(game.scene.gameData, "saveAll").mockImplementation(() => { + return new Promise((resolve, _reject) => { + this.sessionData = game.scene.gameData.getSessionSaveData(); resolve(true); }); }); @@ -31,17 +31,17 @@ export class ReloadHelper extends GameManagerHelper { * beginning of the first turn (equivalent to running `startBattle()`) for * the reloaded session. */ - async reloadSession() : Promise { + async reloadSession(): Promise { const scene = this.game.scene; - const titlePhase = new TitlePhase(scene); + const titlePhase = new TitlePhase(); scene.clearPhaseQueue(); // Set the last saved session to the desired session data vi.spyOn(scene.gameData, "getSession").mockReturnValue( - new Promise((resolve, reject) => { + new Promise((resolve, _reject) => { resolve(this.sessionData); - }) + }), ); scene.unshiftPhase(titlePhase); this.game.endPhase(); // End the currently ongoing battle @@ -51,15 +51,25 @@ export class ReloadHelper extends GameManagerHelper { // Run through prompts for switching Pokemon, copied from classicModeHelper.ts if (this.game.scene.battleStyle === BattleStyle.SWITCH) { - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); - this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - this.game.setMode(Mode.MESSAGE); - this.game.endPhase(); - }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase)); + this.game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + this.game.setMode(Mode.MESSAGE); + this.game.endPhase(); + }, + () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase), + ); } await this.game.phaseInterceptor.to(CommandPhase); diff --git a/src/test/utils/helpers/settingsHelper.ts b/test/testUtils/helpers/settingsHelper.ts similarity index 94% rename from src/test/utils/helpers/settingsHelper.ts rename to test/testUtils/helpers/settingsHelper.ts index 83baa329cec..d5a60e6496a 100644 --- a/src/test/utils/helpers/settingsHelper.ts +++ b/test/testUtils/helpers/settingsHelper.ts @@ -27,7 +27,7 @@ export class SettingsHelper extends GameManagerHelper { */ typeHints(enable: boolean): void { this.game.scene.typeHints = enable; - this.log(`Type Hints ${enable ? "enabled" : "disabled"}` ); + this.log(`Type Hints ${enable ? "enabled" : "disabled"}`); } /** @@ -36,7 +36,7 @@ export class SettingsHelper extends GameManagerHelper { */ playerGender(gender: PlayerGender) { this.game.scene.gameData.gender = gender; - this.log(`Gender set to: ${PlayerGender[gender]} (=${gender})` ); + this.log(`Gender set to: ${PlayerGender[gender]} (=${gender})`); } /** @@ -45,7 +45,7 @@ export class SettingsHelper extends GameManagerHelper { */ expGainsSpeed(speed: ExpGainsSpeed) { this.game.scene.expGainsSpeed = speed; - this.log(`Exp Gains Speed set to: ${ExpGainsSpeed[speed]} (=${speed})` ); + this.log(`Exp Gains Speed set to: ${ExpGainsSpeed[speed]} (=${speed})`); } private log(...params: any[]) { diff --git a/src/test/utils/inputsHandler.ts b/test/testUtils/inputsHandler.ts similarity index 70% rename from src/test/utils/inputsHandler.ts rename to test/testUtils/inputsHandler.ts index bf690d5d74c..6e9dd453541 100644 --- a/src/test/utils/inputsHandler.ts +++ b/test/testUtils/inputsHandler.ts @@ -1,9 +1,9 @@ -import BattleScene from "#app/battle-scene"; +import type BattleScene from "#app/battle-scene"; import pad_xbox360 from "#app/configs/inputs/pad_xbox360"; -import { InputsController } from "#app/inputs-controller"; +import type { InputsController } from "#app/inputs-controller"; import TouchControl from "#app/touch-controls"; -import { holdOn } from "#test/utils/gameManagerUtils"; -import fs from "fs"; +import { holdOn } from "#test/testUtils/gameManagerUtils"; +import fs from "node:fs"; import { JSDOM } from "jsdom"; import Phaser from "phaser"; @@ -30,8 +30,8 @@ export default class InputsHandler { this.init(); } - pressTouch(button: string, duration: integer): Promise { - return new Promise(async (resolve) => { + pressTouch(button: string, duration: number): Promise { + return new Promise(async resolve => { this.fakeMobile.touchDown(button); await holdOn(duration); this.fakeMobile.touchUp(button); @@ -39,8 +39,8 @@ export default class InputsHandler { }); } - pressGamepadButton(button: integer, duration: integer): Promise { - return new Promise(async (resolve) => { + pressGamepadButton(button: number, duration: number): Promise { + return new Promise(async resolve => { this.scene.input.gamepad?.emit("down", this.fakePad, { index: button }); await holdOn(duration); this.scene.input.gamepad?.emit("up", this.fakePad, { index: button }); @@ -48,8 +48,8 @@ export default class InputsHandler { }); } - pressKeyboardKey(key: integer, duration: integer): Promise { - return new Promise(async (resolve) => { + pressKeyboardKey(key: number, duration: number): Promise { + return new Promise(async resolve => { this.scene.input.keyboard?.emit("keydown", { keyCode: key }); await holdOn(duration); this.scene.input.keyboard?.emit("keyup", { keyCode: key }); @@ -58,7 +58,7 @@ export default class InputsHandler { } init(): void { - const touchControl = new TouchControl(this.scene); + const touchControl = new TouchControl(); touchControl.deactivatePressedKey(); //test purpose this.events = this.inputController.events; this.scene.input.gamepad?.emit("connected", this.fakePad); @@ -66,13 +66,21 @@ export default class InputsHandler { } listenInputs(): void { - this.events.on("input_down", (event) => { - this.log.push({ type: "input_down", button: event.button }); - }, this); + this.events.on( + "input_down", + event => { + this.log.push({ type: "input_down", button: event.button }); + }, + this, + ); - this.events.on("input_up", (event) => { - this.logUp.push({ type: "input_up", button: event.button }); - }, this); + this.events.on( + "input_up", + event => { + this.logUp.push({ type: "input_up", button: event.button }); + }, + this, + ); } } @@ -82,7 +90,7 @@ class Fakepad extends Phaser.Input.Gamepad.Gamepad { constructor(pad) { //@ts-ignore - super(undefined, { ...pad, buttons: pad.deviceMapping, axes: []}); //TODO: resolve ts-ignore + super(undefined, { ...pad, buttons: pad.deviceMapping, axes: [] }); //TODO: resolve ts-ignore this.id = "xbox_360_fakepad"; this.index = 0; } @@ -90,7 +98,7 @@ class Fakepad extends Phaser.Input.Gamepad.Gamepad { class FakeMobile { constructor() { - const fakeMobilePage = fs.readFileSync("./src/test/utils/fakeMobile.html", { encoding: "utf8", flag: "r" }); + const fakeMobilePage = fs.readFileSync("././test/testUtils/fakeMobile.html", { encoding: "utf8", flag: "r" }); const dom = new JSDOM(fakeMobilePage); Object.defineProperty(window, "document", { value: dom.window.document, diff --git a/src/test/utils/mocks/mockClock.ts b/test/testUtils/mocks/mockClock.ts similarity index 99% rename from src/test/utils/mocks/mockClock.ts rename to test/testUtils/mocks/mockClock.ts index 7fad3651010..67f399ae41d 100644 --- a/src/test/utils/mocks/mockClock.ts +++ b/test/testUtils/mocks/mockClock.ts @@ -1,6 +1,5 @@ import Clock = Phaser.Time.Clock; - export class MockClock extends Clock { public overrideDelay: number | null = 1; constructor(scene) { diff --git a/src/test/utils/mocks/mockConsoleLog.ts b/test/testUtils/mocks/mockConsoleLog.ts similarity index 56% rename from src/test/utils/mocks/mockConsoleLog.ts rename to test/testUtils/mocks/mockConsoleLog.ts index 9c3cbca6bb6..808b6ea4d4d 100644 --- a/src/test/utils/mocks/mockConsoleLog.ts +++ b/test/testUtils/mocks/mockConsoleLog.ts @@ -8,17 +8,17 @@ const MockConsoleLog = (_logDisabled = false, _phaseText = false) => { const originalWarn = console.warn; const notified: any[] = []; - const blacklist = [ "Phaser", "variant icon does not exist", "Texture \"%s\" not found" ]; - const whitelist = [ "Phase" ]; + const blacklist = ["Phaser", "variant icon does not exist", 'Texture "%s" not found']; + const whitelist = ["Phase"]; - return ({ + return { log(...args) { const argsStr = this.getStr(args); logs.push(argsStr); - if (logDisabled && (!phaseText)) { + if (logDisabled && !phaseText) { return; } - if ((phaseText && !whitelist.some((b) => argsStr.includes(b))) || blacklist.some((b) => argsStr.includes(b))) { + if ((phaseText && !whitelist.some(b => argsStr.includes(b))) || blacklist.some(b => argsStr.includes(b))) { return; } originalLog(args); @@ -31,10 +31,10 @@ const MockConsoleLog = (_logDisabled = false, _phaseText = false) => { debug(...args) { const argsStr = this.getStr(args); logs.push(argsStr); - if (logDisabled && (!phaseText)) { + if (logDisabled && !phaseText) { return; } - if (!whitelist.some((b) => argsStr.includes(b)) || blacklist.some((b) => argsStr.includes(b))) { + if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { return; } originalDebug(args); @@ -42,10 +42,10 @@ const MockConsoleLog = (_logDisabled = false, _phaseText = false) => { warn(...args) { const argsStr = this.getStr(args); logs.push(args); - if (logDisabled && (!phaseText)) { + if (logDisabled && !phaseText) { return; } - if (!whitelist.some((b) => argsStr.includes(b)) || blacklist.some((b) => argsStr.includes(b))) { + if (!whitelist.some(b => argsStr.includes(b)) || blacklist.some(b => argsStr.includes(b))) { return; } originalWarn(args); @@ -61,22 +61,22 @@ const MockConsoleLog = (_logDisabled = false, _phaseText = false) => { logs = []; }, getStr(...args) { - return args.map(arg => { - if (typeof arg === "object" && arg !== null) { - // Handle objects including arrays - return JSON.stringify(arg, (key, value) => - typeof value === "bigint" ? value.toString() : value - ); - } else if (typeof arg === "bigint") { - // Handle BigInt values - return arg.toString(); - } else { + return args + .map(arg => { + if (typeof arg === "object" && arg !== null) { + // Handle objects including arrays + return JSON.stringify(arg, (_key, value) => (typeof value === "bigint" ? value.toString() : value)); + } + if (typeof arg === "bigint") { + // Handle BigInt values + return arg.toString(); + } // Handle all other types return arg.toString(); - } - }).join(";"); + }) + .join(";"); }, - }); + }; }; export default MockConsoleLog; diff --git a/src/test/utils/mocks/mockFetch.ts b/test/testUtils/mocks/mockFetch.ts similarity index 57% rename from src/test/utils/mocks/mockFetch.ts rename to test/testUtils/mocks/mockFetch.ts index 2fa7cd198ce..195d4f65752 100644 --- a/src/test/utils/mocks/mockFetch.ts +++ b/test/testUtils/mocks/mockFetch.ts @@ -1,24 +1,25 @@ -export const MockFetch = (input, init) => { +export const MockFetch = (input, _init) => { const url = typeof input === "string" ? input : input.url; + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let responseHandler; + // biome-ignore lint/suspicious/noImplicitAnyLet: TODO let responseText; const handlers = { - "account/info": { "username":"greenlamp", "lastSessionSlot":0 }, + "account/info": { username: "greenlamp", lastSessionSlot: 0 }, "savedata/session": {}, "savedata/system": {}, "savedata/updateall": "", "daily/rankingpagecount": { data: 0 }, - "game/titlestats": { "playerCount":0, "battleCount":5 }, + "game/titlestats": { playerCount: 0, battleCount: 5 }, "daily/rankings": [], }; - for (const key of Object.keys(handlers)) { if (url.includes(key)) { - responseHandler = async() => handlers[key]; - responseText = async() => handlers[key] ? JSON.stringify(handlers[key]) : handlers[key]; + responseHandler = async () => handlers[key]; + responseText = async () => (handlers[key] ? JSON.stringify(handlers[key]) : handlers[key]); break; } } diff --git a/src/test/utils/mocks/mockGameObject.ts b/test/testUtils/mocks/mockGameObject.ts similarity index 100% rename from src/test/utils/mocks/mockGameObject.ts rename to test/testUtils/mocks/mockGameObject.ts diff --git a/src/test/utils/mocks/mockGameObjectCreator.ts b/test/testUtils/mocks/mockGameObjectCreator.ts similarity index 89% rename from src/test/utils/mocks/mockGameObjectCreator.ts rename to test/testUtils/mocks/mockGameObjectCreator.ts index 27860be0cec..caf98b79a9f 100644 --- a/src/test/utils/mocks/mockGameObjectCreator.ts +++ b/test/testUtils/mocks/mockGameObjectCreator.ts @@ -1,5 +1,5 @@ import MockGraphics from "./mocksContainer/mockGraphics"; -import MockTextureManager from "./mockTextureManager"; +import type MockTextureManager from "./mockTextureManager"; export class MockGameObjectCreator { private readonly textureManager: MockTextureManager; diff --git a/src/test/utils/mocks/mockLoader.ts b/test/testUtils/mocks/mockLoader.ts similarity index 61% rename from src/test/utils/mocks/mockLoader.ts rename to test/testUtils/mocks/mockLoader.ts index 661eb72f2c2..7452f85a317 100644 --- a/src/test/utils/mocks/mockLoader.ts +++ b/test/testUtils/mocks/mockLoader.ts @@ -1,17 +1,16 @@ import CacheManager = Phaser.Cache.CacheManager; - export default class MockLoader { public cacheManager; constructor(scene) { this.cacheManager = new CacheManager(scene); } - once(event, callback) { + once(_event, callback) { callback(); } - setBaseURL(url) { + setBaseURL(_url) { return null; } @@ -19,24 +18,17 @@ export default class MockLoader { return null; } - spritesheet(key, url, frameConfig) { - } + spritesheet(_key, _url, _frameConfig) {} - audio(key, url) { - - } + audio(_key, _url) {} isLoading() { return false; } - start() { - } + start() {} - image() { + image() {} - } - - atlas(key, textureUrl, atlasUrl) { - } + atlas(_key, _textureUrl, _atlasUrl) {} } diff --git a/src/test/utils/mocks/mockLocalStorage.ts b/test/testUtils/mocks/mockLocalStorage.ts similarity index 91% rename from src/test/utils/mocks/mockLocalStorage.ts rename to test/testUtils/mocks/mockLocalStorage.ts index bb4ea4e890d..235aa76f664 100644 --- a/src/test/utils/mocks/mockLocalStorage.ts +++ b/test/testUtils/mocks/mockLocalStorage.ts @@ -1,4 +1,4 @@ -const mockLocalStorage = (() => { +const mockLocalStorage = () => { let store = {} as Storage; return { @@ -22,6 +22,6 @@ const mockLocalStorage = (() => { store = {} as Storage; }, }; -}); +}; export default mockLocalStorage; diff --git a/src/test/utils/mocks/mockTextureManager.ts b/test/testUtils/mocks/mockTextureManager.ts similarity index 72% rename from src/test/utils/mocks/mockTextureManager.ts rename to test/testUtils/mocks/mockTextureManager.ts index ce19d6b6432..fe249c5a5f7 100644 --- a/src/test/utils/mocks/mockTextureManager.ts +++ b/test/testUtils/mocks/mockTextureManager.ts @@ -1,12 +1,12 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; -import MockImage from "#test/utils/mocks/mocksContainer/mockImage"; -import MockNineslice from "#test/utils/mocks/mocksContainer/mockNineslice"; -import MockPolygon from "#test/utils/mocks/mocksContainer/mockPolygon"; -import MockRectangle from "#test/utils/mocks/mocksContainer/mockRectangle"; -import MockSprite from "#test/utils/mocks/mocksContainer/mockSprite"; -import MockText from "#test/utils/mocks/mocksContainer/mockText"; -import MockTexture from "#test/utils/mocks/mocksContainer/mockTexture"; -import { MockGameObject } from "./mockGameObject"; +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; +import MockImage from "#test/testUtils/mocks/mocksContainer/mockImage"; +import MockNineslice from "#test/testUtils/mocks/mocksContainer/mockNineslice"; +import MockPolygon from "#test/testUtils/mocks/mocksContainer/mockPolygon"; +import MockRectangle from "#test/testUtils/mocks/mocksContainer/mockRectangle"; +import MockSprite from "#test/testUtils/mocks/mocksContainer/mockSprite"; +import MockText from "#test/testUtils/mocks/mocksContainer/mockText"; +import MockTexture from "#test/testUtils/mocks/mocksContainer/mockTexture"; +import type { MockGameObject } from "./mockGameObject"; import { MockVideoGameObject } from "./mockVideoGameObject"; /** @@ -51,7 +51,7 @@ export default class MockTextureManager { return sprite; } - existing(obj) { + existing(_obj) { // const whitelist = ["ArenaBase", "PlayerPokemon", "EnemyPokemon"]; // const key = obj.constructor.name; // if (whitelist.includes(key) || obj.texture?.key?.includes("trainer_")) { @@ -74,7 +74,19 @@ export default class MockTextureManager { } nineslice(x, y, texture, frame, width, height, leftWidth, rightWidth, topHeight, bottomHeight) { - const nineSlice = new MockNineslice(this, x, y, texture, frame, width, height, leftWidth, rightWidth, topHeight, bottomHeight); + const nineSlice = new MockNineslice( + this, + x, + y, + texture, + frame, + width, + height, + leftWidth, + rightWidth, + topHeight, + bottomHeight, + ); this.list.push(nineSlice); return nineSlice; } diff --git a/test/testUtils/mocks/mockTimedEventManager.ts b/test/testUtils/mocks/mockTimedEventManager.ts new file mode 100644 index 00000000000..10f32fd4c8b --- /dev/null +++ b/test/testUtils/mocks/mockTimedEventManager.ts @@ -0,0 +1,18 @@ +import { CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER } from "#app/data/balance/starters"; +import { TimedEventManager } from "#app/timed-event-manager"; + +/** Mock TimedEventManager so that ongoing events don't impact tests */ +export class MockTimedEventManager extends TimedEventManager { + override activeEvent() { + return undefined; + } + override isEventActive(): boolean { + return false; + } + override getClassicFriendshipMultiplier(): number { + return CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER; + } + override getShinyMultiplier(): number { + return 1; + } +} diff --git a/src/test/utils/mocks/mockVideoGameObject.ts b/test/testUtils/mocks/mockVideoGameObject.ts similarity index 81% rename from src/test/utils/mocks/mockVideoGameObject.ts rename to test/testUtils/mocks/mockVideoGameObject.ts index d11fb5a44ce..65a5c37b244 100644 --- a/src/test/utils/mocks/mockVideoGameObject.ts +++ b/test/testUtils/mocks/mockVideoGameObject.ts @@ -1,11 +1,9 @@ -import { MockGameObject } from "./mockGameObject"; +import type { MockGameObject } from "./mockGameObject"; /** Mocks video-related stuff */ export class MockVideoGameObject implements MockGameObject { public name: string; - constructor() {} - public play = () => null; public stop = () => this; public setOrigin = () => null; diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/test/testUtils/mocks/mocksContainer/mockContainer.ts similarity index 79% rename from src/test/utils/mocks/mocksContainer/mockContainer.ts rename to test/testUtils/mocks/mocksContainer/mockContainer.ts index 05dad327dc6..0a792c6fc79 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/test/testUtils/mocks/mocksContainer/mockContainer.ts @@ -1,5 +1,5 @@ -import MockTextureManager from "#test/utils/mocks/mockTextureManager"; -import { MockGameObject } from "../mockGameObject"; +import type MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; +import type { MockGameObject } from "../mockGameObject"; export default class MockContainer implements MockGameObject { protected x; @@ -25,17 +25,15 @@ export default class MockContainer implements MockGameObject { this.visible = visible; } - once(event, callback, source) { - } + once(_event, _callback, _source) {} - off(event, callback, source) { - } + off(_event, _callback, _source) {} removeFromDisplayList() { // same as remove or destroy } - removeBetween(startIndex, endIndex, destroyChild) { + removeBetween(_startIndex, _endIndex, _destroyChild) { // Removes multiple children across an index range } @@ -43,7 +41,7 @@ export default class MockContainer implements MockGameObject { // This callback is invoked when this Game Object is added to a Scene. } - setSize(width, height) { + setSize(_width, _height) { // Sets the size of this Game Object. } @@ -51,7 +49,7 @@ export default class MockContainer implements MockGameObject { /// Sets the mask that this Game Object will use to render with. } - setPositionRelative(source, x, y) { + setPositionRelative(_source, _x, _y) { /// Sets the position of this Game Object to be a relative position from the source Game Object. } @@ -66,11 +64,11 @@ export default class MockContainer implements MockGameObject { this.alpha = alpha; } - setFrame(frame, updateSize?: boolean, updateOrigin?: boolean) { + setFrame(_frame, _updateSize?: boolean, _updateOrigin?: boolean) { // Sets the frame this Game Object will use to render with. } - setScale(scale) { + setScale(_scale) { // Sets the scale of this Game Object. } @@ -91,59 +89,59 @@ export default class MockContainer implements MockGameObject { this.list = []; } - setShadow(shadowXpos, shadowYpos, shadowColor) { + setShadow(_shadowXpos, _shadowYpos, _shadowColor) { // Sets the shadow settings for this Game Object. } - setLineSpacing(lineSpacing) { + setLineSpacing(_lineSpacing) { // Sets the line spacing value of this Game Object. } - setText(text) { + setText(_text) { // Sets the text this Game Object will display. } - setAngle(angle) { + setAngle(_angle) { // Sets the angle of this Game Object. } - setShadowOffset(offsetX, offsetY) { + setShadowOffset(_offsetX, _offsetY) { // Sets the shadow offset values. } - setWordWrapWidth(width) { + setWordWrapWidth(_width) { // Sets the width (in pixels) to use for wrapping lines. } - setFontSize(fontSize) { + setFontSize(_fontSize) { // Sets the font size of this Game Object. } getBounds() { return { width: this.width, height: this.height }; } - setColor(color) { + setColor(_color) { // Sets the tint of this Game Object. } - setShadowColor(color) { + setShadowColor(_color) { // Sets the shadow color. } - setTint(color) { + setTint(_color) { // Sets the tint of this Game Object. } - setStrokeStyle(thickness, color) { + setStrokeStyle(_thickness, _color) { // Sets the stroke style for the graphics. return this; } - setDepth(depth) { + setDepth(_depth) { // Sets the depth of this Game Object. } - setTexture(texture) { + setTexture(_texture) { // Sets the texture this Game Object will use to render with. } @@ -155,15 +153,15 @@ export default class MockContainer implements MockGameObject { // Sends this Game Object to the back of its parent's display list. } - moveTo(obj) { + moveTo(_obj) { // Moves this Game Object to the given index in the list. } - moveAbove(obj) { + moveAbove(_obj) { // Moves this Game Object to be above the given Game Object in the display list. } - moveBelow(obj) { + moveBelow(_obj) { // Moves this Game Object to be below the given Game Object in the display list. } @@ -171,12 +169,11 @@ export default class MockContainer implements MockGameObject { this.name = name; } - bringToTop(obj) { + bringToTop(_obj) { // Brings this Game Object to the top of its parents display list. } - on(event, callback, source) { - } + on(_event, _callback, _source) {} add(obj) { // Adds a child to this Game Object. diff --git a/src/test/utils/mocks/mocksContainer/mockGraphics.ts b/test/testUtils/mocks/mocksContainer/mockGraphics.ts similarity index 79% rename from src/test/utils/mocks/mocksContainer/mockGraphics.ts rename to test/testUtils/mocks/mocksContainer/mockGraphics.ts index b20faf4ed6a..ebf84e935e3 100644 --- a/src/test/utils/mocks/mocksContainer/mockGraphics.ts +++ b/test/testUtils/mocks/mocksContainer/mockGraphics.ts @@ -1,14 +1,14 @@ -import { MockGameObject } from "../mockGameObject"; +import type { MockGameObject } from "../mockGameObject"; export default class MockGraphics implements MockGameObject { private scene; public list: MockGameObject[] = []; public name: string; - constructor(textureManager, config) { + constructor(textureManager, _config) { this.scene = textureManager.scene; } - fillStyle(color) { + fillStyle(_color) { // Sets the fill style to be used by the fill methods. } @@ -16,7 +16,7 @@ export default class MockGraphics implements MockGameObject { // Starts a new path by emptying the list of sub-paths. Call this method when you want to create a new path. } - fillRect(x, y, width, height) { + fillRect(_x, _y, _width, _height) { // Adds a rectangle shape to the path which is filled when you call fill(). } @@ -24,20 +24,15 @@ export default class MockGraphics implements MockGameObject { // Creates a geometry mask. } - setOrigin(x, y) { - } + setOrigin(_x, _y) {} - setAlpha(alpha) { - } + setAlpha(_alpha) {} - setVisible(visible) { - } + setVisible(_visible) {} - setName(name) { - } + setName(_name) {} - once(event, callback, source) { - } + once(_event, _callback, _source) {} removeFromDisplayList() { // same as remove or destroy @@ -47,7 +42,7 @@ export default class MockGraphics implements MockGameObject { // This callback is invoked when this Game Object is added to a Scene. } - setPositionRelative(source, x, y) { + setPositionRelative(_source, _x, _y) { /// Sets the position of this Game Object to be a relative position from the source Game Object. } @@ -55,12 +50,11 @@ export default class MockGraphics implements MockGameObject { this.list = []; } - setScale(scale) { + setScale(_scale) { // Sets the scale of this Game Object. } - off(event, callback, source) { - } + off(_event, _callback, _source) {} add(obj) { // Adds a child to this Game Object. diff --git a/src/test/utils/mocks/mocksContainer/mockImage.ts b/test/testUtils/mocks/mocksContainer/mockImage.ts similarity index 70% rename from src/test/utils/mocks/mocksContainer/mockImage.ts rename to test/testUtils/mocks/mocksContainer/mockImage.ts index be183a0dd89..768fcfeb765 100644 --- a/src/test/utils/mocks/mocksContainer/mockImage.ts +++ b/test/testUtils/mocks/mocksContainer/mockImage.ts @@ -1,5 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; - +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockImage extends MockContainer { private texture; diff --git a/src/test/utils/mocks/mocksContainer/mockNineslice.ts b/test/testUtils/mocks/mocksContainer/mockNineslice.ts similarity index 66% rename from src/test/utils/mocks/mocksContainer/mockNineslice.ts rename to test/testUtils/mocks/mocksContainer/mockNineslice.ts index a8e10036a72..90c0e13e725 100644 --- a/src/test/utils/mocks/mocksContainer/mockNineslice.ts +++ b/test/testUtils/mocks/mocksContainer/mockNineslice.ts @@ -1,5 +1,4 @@ -import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; - +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; export default class MockNineslice extends MockContainer { private texture; @@ -8,7 +7,7 @@ export default class MockNineslice extends MockContainer { private topHeight; private bottomHeight; - constructor(textureManager, x, y, texture, frame, width, height, leftWidth, rightWidth, topHeight, bottomHeight) { + constructor(textureManager, x, y, texture, frame, _width, _height, leftWidth, rightWidth, topHeight, bottomHeight) { super(textureManager, x, y); this.texture = texture; this.frame = frame; diff --git a/test/testUtils/mocks/mocksContainer/mockPolygon.ts b/test/testUtils/mocks/mocksContainer/mockPolygon.ts new file mode 100644 index 00000000000..4a7f3baec78 --- /dev/null +++ b/test/testUtils/mocks/mocksContainer/mockPolygon.ts @@ -0,0 +1,7 @@ +import MockContainer from "#test/testUtils/mocks/mocksContainer/mockContainer"; + +export default class MockPolygon extends MockContainer { + constructor(textureManager, x, y, _content, _fillColor, _fillAlpha) { + super(textureManager, x, y); + } +} diff --git a/src/test/utils/mocks/mocksContainer/mockRectangle.ts b/test/testUtils/mocks/mocksContainer/mockRectangle.ts similarity index 79% rename from src/test/utils/mocks/mocksContainer/mockRectangle.ts rename to test/testUtils/mocks/mocksContainer/mockRectangle.ts index 48cd2cb1380..eec431d8ada 100644 --- a/src/test/utils/mocks/mocksContainer/mockRectangle.ts +++ b/test/testUtils/mocks/mocksContainer/mockRectangle.ts @@ -1,4 +1,4 @@ -import { MockGameObject } from "../mockGameObject"; +import type { MockGameObject } from "../mockGameObject"; export default class MockRectangle implements MockGameObject { private fillColor; @@ -6,23 +6,18 @@ export default class MockRectangle implements MockGameObject { public list: MockGameObject[] = []; public name: string; - constructor(textureManager, x, y, width, height, fillColor) { + constructor(textureManager, _x, _y, _width, _height, fillColor) { this.fillColor = fillColor; this.scene = textureManager.scene; } - setOrigin(x, y) { - } + setOrigin(_x, _y) {} - setAlpha(alpha) { - } - setVisible(visible) { - } + setAlpha(_alpha) {} + setVisible(_visible) {} - setName(name) { - } + setName(_name) {} - once(event, callback, source) { - } + once(_event, _callback, _source) {} removeFromDisplayList() { // same as remove or destroy @@ -32,7 +27,7 @@ export default class MockRectangle implements MockGameObject { // This callback is invoked when this Game Object is added to a Scene. } - setPositionRelative(source, x, y) { + setPositionRelative(_source, _x, _y) { /// Sets the position of this Game Object to be a relative position from the source Game Object. } @@ -74,7 +69,7 @@ export default class MockRectangle implements MockGameObject { getAll() { return this.list; } - setScale(scale) { + setScale(_scale) { // return this.phaserText.setScale(scale); } } diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/test/testUtils/mocks/mocksContainer/mockSprite.ts similarity index 94% rename from src/test/utils/mocks/mocksContainer/mockSprite.ts rename to test/testUtils/mocks/mocksContainer/mockSprite.ts index e726fec454d..dcc3588f127 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/test/testUtils/mocks/mocksContainer/mockSprite.ts @@ -1,9 +1,8 @@ import Phaser from "phaser"; -import { MockGameObject } from "../mockGameObject"; +import type { MockGameObject } from "../mockGameObject"; import Sprite = Phaser.GameObjects.Sprite; import Frame = Phaser.Textures.Frame; - export default class MockSprite implements MockGameObject { private phaserSprite; public pipelineData; @@ -38,11 +37,11 @@ export default class MockSprite implements MockGameObject { }; } - setTexture(key: string, frame?: string | number) { + setTexture(_key: string, _frame?: string | number) { return this; } - setSizeToFrame(frame?: boolean | Frame): Sprite { + setSizeToFrame(_frame?: boolean | Frame): Sprite { return {} as Sprite; } @@ -51,8 +50,7 @@ export default class MockSprite implements MockGameObject { return this.phaserSprite.setPipeline(obj); } - off(event, callback, source) { - } + off(_event, _callback, _source) {} setTintFill(color) { // Sets the tint fill color. @@ -117,7 +115,7 @@ export default class MockSprite implements MockGameObject { return this.phaserSprite.setTint(color); } - setFrame(frame, updateSize?: boolean, updateOrigin?: boolean) { + setFrame(frame, _updateSize?: boolean, _updateOrigin?: boolean) { // Sets the frame this Game Object will use to render with. this.frame = frame; return frame; @@ -172,9 +170,7 @@ export default class MockSprite implements MockGameObject { return this.phaserSprite.setAngle(angle); } - setMask() { - - } + setMask() {} add(obj) { // Adds a child to this Game Object. @@ -210,6 +206,4 @@ export default class MockSprite implements MockGameObject { getAll() { return this.list; } - - } diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/test/testUtils/mocks/mocksContainer/mockText.ts similarity index 86% rename from src/test/utils/mocks/mocksContainer/mockText.ts rename to test/testUtils/mocks/mocksContainer/mockText.ts index faa32ff8a06..552f8ff3ff8 100644 --- a/src/test/utils/mocks/mocksContainer/mockText.ts +++ b/test/testUtils/mocks/mocksContainer/mockText.ts @@ -1,5 +1,5 @@ import UI from "#app/ui/ui"; -import { MockGameObject } from "../mockGameObject"; +import type { MockGameObject } from "../mockGameObject"; export default class MockText implements MockGameObject { private phaserText; @@ -13,7 +13,7 @@ export default class MockText implements MockGameObject { public name: string; public color?: string; - constructor(textureManager, x, y, content, styleOptions) { + constructor(textureManager, _x, _y, _content, _styleOptions) { this.scene = textureManager.scene; this.textureManager = textureManager; this.style = {}; @@ -81,11 +81,11 @@ export default class MockText implements MockGameObject { showText( text: string, - delay?: integer | null, + delay?: number | null, callback?: Function | null, - callbackDelay?: integer | null, + callbackDelay?: number | null, prompt?: boolean | null, - promptDelay?: integer | null + promptDelay?: number | null, ) { this.scene.messageWrapper.showText(text, delay, callback, callbackDelay, prompt, promptDelay); if (callback) { @@ -93,42 +93,49 @@ export default class MockText implements MockGameObject { } } - showDialogue(keyOrText: string, name: string | undefined, delay: integer | null = 0, callback: Function, callbackDelay?: integer, promptDelay?: integer) { + showDialogue( + keyOrText: string, + name: string | undefined, + delay: number | null = 0, + callback: Function, + callbackDelay?: number, + promptDelay?: number, + ) { this.scene.messageWrapper.showDialogue(keyOrText, name, delay, callback, callbackDelay, promptDelay); if (callback) { callback(); } } - setScale(scale) { + setScale(_scale) { // return this.phaserText.setScale(scale); } - setShadow(shadowXpos, shadowYpos, shadowColor) { + setShadow(_shadowXpos, _shadowYpos, _shadowColor) { // Sets the shadow settings for this Game Object. // return this.phaserText.setShadow(shadowXpos, shadowYpos, shadowColor); } - setLineSpacing(lineSpacing) { + setLineSpacing(_lineSpacing) { // Sets the line spacing value of this Game Object. // return this.phaserText.setLineSpacing(lineSpacing); } - setOrigin(x, y) { + setOrigin(_x, _y) { // return this.phaserText.setOrigin(x, y); } - once(event, callback, source) { + once(_event, _callback, _source) { // return this.phaserText.once(event, callback, source); } - off(event, callback, obj) {} + off(_event, _callback, _obj) {} removedFromScene() {} addToDisplayList() {} - setStroke(color, thickness) { + setStroke(_color, _thickness) { // Sets the stroke color and thickness. // return this.phaserText.setStroke(color, thickness); } @@ -143,15 +150,15 @@ export default class MockText implements MockGameObject { // return this.phaserText.addedToScene(); } - setVisible(visible) { + setVisible(_visible) { // return this.phaserText.setVisible(visible); } - setY(y) { + setY(_y) { // return this.phaserText.setY(y); } - setX(x) { + setX(_x) { // return this.phaserText.setX(x); } @@ -162,7 +169,7 @@ export default class MockText implements MockGameObject { * @param z The z position of this Game Object. Default 0. * @param w The w position of this Game Object. Default 0. */ - setPosition(x?: number, y?: number, z?: number, w?: number) {} + setPosition(_x?: number, _y?: number, _z?: number, _w?: number) {} setText(text) { // Sets the text this Game Object will display. @@ -170,17 +177,17 @@ export default class MockText implements MockGameObject { this.text = text; } - setAngle(angle) { + setAngle(_angle) { // Sets the angle of this Game Object. // return this.phaserText.setAngle(angle); } - setPositionRelative(source, x, y) { + setPositionRelative(_source, _x, _y) { /// Sets the position of this Game Object to be a relative position from the source Game Object. // return this.phaserText.setPositionRelative(source, x, y); } - setShadowOffset(offsetX, offsetY) { + setShadowOffset(_offsetX, _offsetY) { // Sets the shadow offset values. // return this.phaserText.setShadowOffset(offsetX, offsetY); } @@ -190,7 +197,7 @@ export default class MockText implements MockGameObject { this.wordWrapWidth = width; } - setFontSize(fontSize) { + setFontSize(_fontSize) { // Sets the font size of this Game Object. // return this.phaserText.setFontSize(fontSize); } @@ -208,17 +215,17 @@ export default class MockText implements MockGameObject { setInteractive = () => null; - setShadowColor(color) { + setShadowColor(_color) { // Sets the shadow color. // return this.phaserText.setShadowColor(color); } - setTint(color) { + setTint(_color) { // Sets the tint of this Game Object. // return this.phaserText.setTint(color); } - setStrokeStyle(thickness, color) { + setStrokeStyle(_thickness, _color) { // Sets the stroke style for the graphics. // return this.phaserText.setStrokeStyle(thickness, color); } @@ -228,7 +235,7 @@ export default class MockText implements MockGameObject { this.list = []; } - setAlpha(alpha) { + setAlpha(_alpha) { // return this.phaserText.setAlpha(alpha); } @@ -236,7 +243,7 @@ export default class MockText implements MockGameObject { this.name = name; } - setAlign(align) { + setAlign(_align) { // return this.phaserText.setAlign(align); } diff --git a/src/test/utils/mocks/mocksContainer/mockTexture.ts b/test/testUtils/mocks/mocksContainer/mockTexture.ts similarity index 83% rename from src/test/utils/mocks/mocksContainer/mockTexture.ts rename to test/testUtils/mocks/mocksContainer/mockTexture.ts index bedd1d2c84a..eb8b70902fa 100644 --- a/src/test/utils/mocks/mocksContainer/mockTexture.ts +++ b/test/testUtils/mocks/mocksContainer/mockTexture.ts @@ -1,6 +1,5 @@ -import MockTextureManager from "#test/utils/mocks/mockTextureManager"; -import { MockGameObject } from "../mockGameObject"; - +import type MockTextureManager from "#test/testUtils/mocks/mockTextureManager"; +import type { MockGameObject } from "../mockGameObject"; /** * Stub for Phaser.Textures.Texture object @@ -23,7 +22,7 @@ export default class MockTexture implements MockGameObject { width: 100, height: 100, cutX: 0, - cutY: 0 + cutY: 0, }; this.frames = { firstFrame: mockFrame, @@ -31,7 +30,7 @@ export default class MockTexture implements MockGameObject { 1: mockFrame, 2: mockFrame, 3: mockFrame, - 4: mockFrame + 4: mockFrame, }; this.firstFrame = "firstFrame"; } diff --git a/src/test/utils/phaseInterceptor.ts b/test/testUtils/phaseInterceptor.ts similarity index 71% rename from src/test/utils/phaseInterceptor.ts rename to test/testUtils/phaseInterceptor.ts index ec9309e2405..742a6bc8441 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/test/testUtils/phaseInterceptor.ts @@ -1,17 +1,18 @@ import { Phase } from "#app/phase"; -import ErrorInterceptor from "#app/test/utils/errorInterceptor"; +import ErrorInterceptor from "#test/testUtils/errorInterceptor"; import { AttemptRunPhase } from "#app/phases/attempt-run-phase"; 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"; import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { EvolutionPhase } from "#app/phases/evolution-phase"; import { FaintPhase } from "#app/phases/faint-phase"; +import { FormChangePhase } from "#app/phases/form-change-phase"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { LevelCapPhase } from "#app/phases/level-cap-phase"; import { LoginPhase } from "#app/phases/login-phase"; @@ -49,11 +50,17 @@ import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase, - PostMysteryEncounterPhase + PostMysteryEncounterPhase, } from "#app/phases/mystery-encounter-phases"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; import { PartyExpPhase } from "#app/phases/party-exp-phase"; import { ExpPhase } from "#app/phases/exp-phase"; +import { GameOverPhase } from "#app/phases/game-over-phase"; +import { RibbonModifierRewardPhase } from "#app/phases/ribbon-modifier-reward-phase"; +import { GameOverModifierRewardPhase } from "#app/phases/game-over-modifier-reward-phase"; +import { UnlockPhase } from "#app/phases/unlock-phase"; +import { PostGameOverPhase } from "#app/phases/post-game-over-phase"; +import { RevivalBlessingPhase } from "#app/phases/revival-blessing-phase"; export interface PromptHandler { phaseTarget?: string; @@ -67,7 +74,6 @@ type PhaseClass = | typeof LoginPhase | typeof TitlePhase | typeof SelectGenderPhase - | typeof EncounterPhase | typeof NewBiomeEncounterPhase | typeof SelectStarterPhase | typeof PostSummonPhase @@ -82,7 +88,7 @@ type PhaseClass = | typeof TurnStartPhase | typeof MovePhase | typeof MoveEffectPhase - | typeof DamagePhase + | typeof DamageAnimPhase | typeof FaintPhase | typeof BerryPhase | typeof TurnEndPhase @@ -102,6 +108,7 @@ type PhaseClass = | typeof SwitchPhase | typeof SwitchSummonPhase | typeof PartyHealPhase + | typeof FormChangePhase | typeof EvolutionPhase | typeof EndEvolutionPhase | typeof LevelCapPhase @@ -112,15 +119,21 @@ type PhaseClass = | typeof MysteryEncounterBattlePhase | typeof MysteryEncounterRewardsPhase | typeof PostMysteryEncounterPhase + | typeof RibbonModifierRewardPhase + | typeof GameOverModifierRewardPhase | typeof ModifierRewardPhase | typeof PartyExpPhase - | typeof ExpPhase; + | typeof ExpPhase + | typeof EncounterPhase + | typeof GameOverPhase + | typeof UnlockPhase + | typeof PostGameOverPhase + | typeof RevivalBlessingPhase; type PhaseString = | "LoginPhase" | "TitlePhase" | "SelectGenderPhase" - | "EncounterPhase" | "NewBiomeEncounterPhase" | "SelectStarterPhase" | "PostSummonPhase" @@ -135,7 +148,7 @@ type PhaseString = | "TurnStartPhase" | "MovePhase" | "MoveEffectPhase" - | "DamagePhase" + | "DamageAnimPhase" | "FaintPhase" | "BerryPhase" | "TurnEndPhase" @@ -155,6 +168,7 @@ type PhaseString = | "SwitchPhase" | "SwitchSummonPhase" | "PartyHealPhase" + | "FormChangePhase" | "EvolutionPhase" | "EndEvolutionPhase" | "LevelCapPhase" @@ -165,9 +179,16 @@ type PhaseString = | "MysteryEncounterBattlePhase" | "MysteryEncounterRewardsPhase" | "PostMysteryEncounterPhase" + | "RibbonModifierRewardPhase" + | "GameOverModifierRewardPhase" | "ModifierRewardPhase" | "PartyExpPhase" - | "ExpPhase"; + | "ExpPhase" + | "EncounterPhase" + | "GameOverPhase" + | "UnlockPhase" + | "PostGameOverPhase" + | "RevivalBlessingPhase"; type PhaseInterceptorPhase = PhaseClass | PhaseString; @@ -187,63 +208,80 @@ export default class PhaseInterceptor { /** * List of phases with their corresponding start methods. + * + * CAUTION: If a phase and its subclasses (if any) both appear in this list, + * make sure that this list contains said phase AFTER all of its subclasses. + * This way, the phase's `prototype.start` is properly preserved during + * `initPhases()` so that its subclasses can use `super.start()` properly. */ private PHASES = [ - [ LoginPhase, this.startPhase ], - [ TitlePhase, this.startPhase ], - [ SelectGenderPhase, this.startPhase ], - [ EncounterPhase, this.startPhase ], - [ NewBiomeEncounterPhase, this.startPhase ], - [ SelectStarterPhase, this.startPhase ], - [ PostSummonPhase, this.startPhase ], - [ SummonPhase, this.startPhase ], - [ ToggleDoublePositionPhase, this.startPhase ], - [ CheckSwitchPhase, this.startPhase ], - [ ShowAbilityPhase, this.startPhase ], - [ MessagePhase, this.startPhase ], - [ TurnInitPhase, this.startPhase ], - [ CommandPhase, this.startPhase ], - [ EnemyCommandPhase, this.startPhase ], - [ TurnStartPhase, this.startPhase ], - [ MovePhase, this.startPhase ], - [ MoveEffectPhase, this.startPhase ], - [ DamagePhase, this.startPhase ], - [ FaintPhase, this.startPhase ], - [ BerryPhase, this.startPhase ], - [ TurnEndPhase, this.startPhase ], - [ BattleEndPhase, this.startPhase ], - [ EggLapsePhase, this.startPhase ], - [ SelectModifierPhase, this.startPhase ], - [ NextEncounterPhase, this.startPhase ], - [ NewBattlePhase, this.startPhase ], - [ VictoryPhase, this.startPhase ], - [ LearnMovePhase, this.startPhase ], - [ MoveEndPhase, this.startPhase ], - [ StatStageChangePhase, this.startPhase ], - [ ShinySparklePhase, this.startPhase ], - [ SelectTargetPhase, this.startPhase ], - [ UnavailablePhase, this.startPhase ], - [ QuietFormChangePhase, this.startPhase ], - [ SwitchPhase, this.startPhase ], - [ SwitchSummonPhase, this.startPhase ], - [ PartyHealPhase, this.startPhase ], - [ EvolutionPhase, this.startPhase ], - [ EndEvolutionPhase, this.startPhase ], - [ LevelCapPhase, this.startPhase ], - [ AttemptRunPhase, this.startPhase ], - [ SelectBiomePhase, this.startPhase ], - [ MysteryEncounterPhase, this.startPhase ], - [ MysteryEncounterOptionSelectedPhase, this.startPhase ], - [ MysteryEncounterBattlePhase, this.startPhase ], - [ MysteryEncounterRewardsPhase, this.startPhase ], - [ PostMysteryEncounterPhase, this.startPhase ], - [ ModifierRewardPhase, this.startPhase ], - [ PartyExpPhase, this.startPhase ], - [ ExpPhase, this.startPhase ], + [LoginPhase, this.startPhase], + [TitlePhase, this.startPhase], + [SelectGenderPhase, this.startPhase], + [NewBiomeEncounterPhase, this.startPhase], + [SelectStarterPhase, this.startPhase], + [PostSummonPhase, this.startPhase], + [SummonPhase, this.startPhase], + [ToggleDoublePositionPhase, this.startPhase], + [CheckSwitchPhase, this.startPhase], + [ShowAbilityPhase, this.startPhase], + [MessagePhase, this.startPhase], + [TurnInitPhase, this.startPhase], + [CommandPhase, this.startPhase], + [EnemyCommandPhase, this.startPhase], + [TurnStartPhase, this.startPhase], + [MovePhase, this.startPhase], + [MoveEffectPhase, this.startPhase], + [DamageAnimPhase, this.startPhase], + [FaintPhase, this.startPhase], + [BerryPhase, this.startPhase], + [TurnEndPhase, this.startPhase], + [BattleEndPhase, this.startPhase], + [EggLapsePhase, this.startPhase], + [SelectModifierPhase, this.startPhase], + [NextEncounterPhase, this.startPhase], + [NewBattlePhase, this.startPhase], + [VictoryPhase, this.startPhase], + [LearnMovePhase, this.startPhase], + [MoveEndPhase, this.startPhase], + [StatStageChangePhase, this.startPhase], + [ShinySparklePhase, this.startPhase], + [SelectTargetPhase, this.startPhase], + [UnavailablePhase, this.startPhase], + [QuietFormChangePhase, this.startPhase], + [SwitchPhase, this.startPhase], + [SwitchSummonPhase, this.startPhase], + [PartyHealPhase, this.startPhase], + [FormChangePhase, this.startPhase], + [EvolutionPhase, this.startPhase], + [EndEvolutionPhase, this.startPhase], + [LevelCapPhase, this.startPhase], + [AttemptRunPhase, this.startPhase], + [SelectBiomePhase, this.startPhase], + [MysteryEncounterPhase, this.startPhase], + [MysteryEncounterOptionSelectedPhase, this.startPhase], + [MysteryEncounterBattlePhase, this.startPhase], + [MysteryEncounterRewardsPhase, this.startPhase], + [PostMysteryEncounterPhase, this.startPhase], + [RibbonModifierRewardPhase, this.startPhase], + [GameOverModifierRewardPhase, this.startPhase], + [ModifierRewardPhase, this.startPhase], + [PartyExpPhase, this.startPhase], + [ExpPhase, this.startPhase], + [EncounterPhase, this.startPhase], + [GameOverPhase, this.startPhase], + [UnlockPhase, this.startPhase], + [PostGameOverPhase, this.startPhase], + [RevivalBlessingPhase, this.startPhase], ]; private endBySetMode = [ - TitlePhase, SelectGenderPhase, CommandPhase, SelectModifierPhase, MysteryEncounterPhase, PostMysteryEncounterPhase + TitlePhase, + SelectGenderPhase, + CommandPhase, + SelectModifierPhase, + MysteryEncounterPhase, + PostMysteryEncounterPhase, ]; /** @@ -291,29 +329,29 @@ export default class PhaseInterceptor { * @param runTarget - Whether or not to run the target phase. * @returns A promise that resolves when the transition is complete. */ - async to(phaseTo: PhaseInterceptorPhase, runTarget: boolean = true): Promise { + async to(phaseTo: PhaseInterceptorPhase, runTarget = true): Promise { return new Promise(async (resolve, reject) => { ErrorInterceptor.getInstance().add(this); if (this.phaseFrom) { - await this.run(this.phaseFrom).catch((e) => reject(e)); + await this.run(this.phaseFrom).catch(e => reject(e)); this.phaseFrom = null; } const targetName = typeof phaseTo === "string" ? phaseTo : phaseTo.name; - this.intervalRun = setInterval(async() => { + this.intervalRun = setInterval(async () => { const currentPhase = this.onHold?.length && this.onHold[0]; if (currentPhase && currentPhase.name === targetName) { clearInterval(this.intervalRun); if (!runTarget) { return resolve(); } - await this.run(currentPhase).catch((e) => { + await this.run(currentPhase).catch(e => { clearInterval(this.intervalRun); return reject(e); }); return resolve(); } if (currentPhase && currentPhase.name !== targetName) { - await this.run(currentPhase).catch((e) => { + await this.run(currentPhase).catch(e => { clearInterval(this.intervalRun); return reject(e); }); @@ -338,7 +376,7 @@ export default class PhaseInterceptor { if (currentPhase) { if (currentPhase.name !== targetName) { clearInterval(interval); - const skip = skipFn && skipFn(currentPhase.name); + const skip = skipFn?.(currentPhase.name); if (skip) { this.onHold.unshift(currentPhase); ErrorInterceptor.getInstance().remove(this); @@ -354,7 +392,7 @@ export default class PhaseInterceptor { ErrorInterceptor.getInstance().remove(this); resolve(); }, - onError: (error) => reject(error), + onError: error => reject(error), }; currentPhase.call(); } @@ -362,10 +400,10 @@ export default class PhaseInterceptor { }); } - whenAboutToRun(phaseTarget: PhaseInterceptorPhase, skipFn?: (className: PhaseClass) => boolean): Promise { + whenAboutToRun(phaseTarget: PhaseInterceptorPhase, _skipFn?: (className: PhaseClass) => boolean): Promise { const targetName = typeof phaseTarget === "string" ? phaseTarget : phaseTarget.name; this.scene.moveAnimations = null; // Mandatory to avoid crash - return new Promise(async (resolve, reject) => { + return new Promise(async (resolve, _reject) => { ErrorInterceptor.getInstance().add(this); const interval = setInterval(async () => { const currentPhase = this.onHold[0]; @@ -391,7 +429,7 @@ export default class PhaseInterceptor { * * @param shouldRun Whether or not the current scene should also be run. */ - shift(shouldRun: boolean = false) : void { + shift(shouldRun = false): void { this.onHold.shift(); if (shouldRun) { this.scene.shiftPhase(); @@ -406,11 +444,11 @@ export default class PhaseInterceptor { this.originalSuperEnd = Phase.prototype.end; UI.prototype.setMode = (mode, ...args) => this.setMode.call(this, mode, ...args); Phase.prototype.end = () => this.superEndPhase.call(this); - for (const [ phase, methodStart ] of this.PHASES) { + for (const [phase, methodStart] of this.PHASES) { const originalStart = phase.prototype.start; this.phases[phase.name] = { start: originalStart, - endBySetMode: this.endBySetMode.some((elm) => elm.name === phase.name), + endBySetMode: this.endBySetMode.some(elm => elm.name === phase.name), }; phase.prototype.start = () => methodStart.call(this, phase); } @@ -427,7 +465,7 @@ export default class PhaseInterceptor { name: phase.name, call: () => { this.phases[phase.name].start.apply(instance); - } + }, }); } @@ -456,10 +494,11 @@ export default class PhaseInterceptor { const currentPhase = this.scene.getCurrentPhase(); const instance = this.scene.ui; console.log("setMode", `${Mode[mode]} (=${mode})`, args); - const ret = this.originalSetMode.apply(instance, [ mode, ...args ]); + const ret = this.originalSetMode.apply(instance, [mode, ...args]); if (!this.phases[currentPhase.constructor.name]) { - throw new Error(`missing ${currentPhase.constructor.name} in phaseInterceptor PHASES list --- Add it to PHASES inside of /test/utils/phaseInterceptor.ts`); - + throw new Error( + `missing ${currentPhase.constructor.name} in phaseInterceptor PHASES list --- Add it to PHASES inside of /test/utils/phaseInterceptor.ts`, + ); } if (this.phases[currentPhase.constructor.name].endBySetMode) { this.inProgress?.callback(); @@ -475,13 +514,19 @@ export default class PhaseInterceptor { this.promptInterval = setInterval(() => { if (this.prompts.length) { const actionForNextPrompt = this.prompts[0]; - const expireFn = actionForNextPrompt.expireFn && actionForNextPrompt.expireFn(); + const expireFn = actionForNextPrompt.expireFn?.(); const currentMode = this.scene.ui.getMode(); const currentPhase = this.scene.getCurrentPhase()?.constructor.name; const currentHandler = this.scene.ui.getHandler(); if (expireFn) { this.prompts.shift(); - } else if (currentMode === actionForNextPrompt.mode && currentPhase === actionForNextPrompt.phaseTarget && currentHandler.active && (!actionForNextPrompt.awaitingActionInput || (actionForNextPrompt.awaitingActionInput && currentHandler.awaitingActionInput))) { + } else if ( + currentMode === actionForNextPrompt.mode && + currentPhase === actionForNextPrompt.phaseTarget && + currentHandler.active && + (!actionForNextPrompt.awaitingActionInput || + (actionForNextPrompt.awaitingActionInput && currentHandler.awaitingActionInput)) + ) { const prompt = this.prompts.shift(); if (prompt?.callback) { prompt.callback(); @@ -499,13 +544,19 @@ export default class PhaseInterceptor { * @param expireFn - The function to determine if the prompt has expired. * @param awaitingActionInput */ - addToNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn?: () => void, awaitingActionInput: boolean = false) { + addToNextPrompt( + phaseTarget: string, + mode: Mode, + callback: () => void, + expireFn?: () => void, + awaitingActionInput = false, + ) { this.prompts.push({ phaseTarget, mode, callback, expireFn, - awaitingActionInput + awaitingActionInput, }); } @@ -516,7 +567,7 @@ export default class PhaseInterceptor { * function stored in `this.phases`. Additionally, it clears the `promptInterval` and `interval`. */ restoreOg() { - for (const [ phase ] of this.PHASES) { + for (const [phase] of this.PHASES) { phase.prototype.start = this.phases[phase.name].start; } UI.prototype.setMode = this.originalSetMode; diff --git a/test/testUtils/saves/data_new.prsv b/test/testUtils/saves/data_new.prsv new file mode 100644 index 00000000000..04d13a791a1 --- /dev/null +++ b/test/testUtils/saves/data_new.prsv @@ -0,0 +1 @@ +U2FsdGVkX19MR31wG/zuE2yXyoWwVbNsIqYA8Xea5s2w78yNwHxCfZgEY/TmPvUvEuPpgydwPRGJrafwX74yB9fdaanuKzcsK+EVxUpxQPBxBzGjAQU3K8K92VFNnRZjGgDPCCUbEcg8r9I04u3U4k0YFE00UP0GsMvKMwin6lfcedBV9YLTIvPCmNs9FZHGrSe7MsbY8YFn7MIXchztGCYSUE0UC5PNzHQSWPp2CvP5tabxpgvceYh+WNv8/6Fl12hIAefzPLJINjYJ5V3P2FVYa2Iz3OlLCOX4PQ739OXKXZUdLiVz2ZbRwqkVLPWNYH3yUfA6mAZCiqXVo2iVKWRzoNHPqKREgqBN3zC5jDgf+Mspnmj+X6vQ17W2yU7+u7JGrcU35aNlKOyYWvN0EirFN3rE+5fKRPcNYaYVjOYks9gL0aA1VSJ0O8pTGcjzAN91Snt8PUY3d23Q2qUrQKvmvWXN/+6hcryLfXqczJ5TIdD02MhZWmK1FIHjjq7vCmYRy8cOIHbtryCXA6kfpXGVPL4+rVFTxw64wZbrzDPwDEUXdG53s89OCWyDaxFDnwfs82B69i/ibXRULlXlXNICNgDNKz2v53y3br8Hpe7azbX0YFjQ4QpNgUnpSNjUxvnAiinn6k7ii24HNTNk9wDhEAc8iVZ0nxzqt5dvnh5K/ny2ScJ78WHxXo1a6HlvVJvYc4xE4OI8NLp5q3x8ZKSYGfOLtHO4FUrSBtmH3pJaq8mUK4RKfEIpfN3yx7ZvR9A9LT/MveLozt4qsXDWns0RKTAnU6KiwcVPCTl/RIwxLftmiPlDt/FIIFgVbQWvyfhVcXqJ6kFUctnmIi45IsP24a3blIjHucM+CBKrEpJWl7/49YO7YkdfH0LByygMa4rAX7NSzIgOjuGbrjYgYzQGQ4vhUVD/WVO3dgisc9umMQe/y+MLG1GekpfRsOhS4olJML4vOYAwyp1AqFq/XkQZL7qzB84avPEzMJLivDzeyuDoZna2Q7jfB/PwaKLJWWyvsBEAZUI+DFGP8dxNpKSF4Ax7GeTqv/CVx3YRtdi14VGgXfycrB09DXPDeg+oH9sO76YHLgBfqJ0C48Aihi6ArZTLNUuVaT6mLdGJItcrHWuOQKSMrKYiO/Z0CC/D0ItKKb3rD/SpB9A9OVeDaJOYqt/Xmg3hv7CXEb/16/GqWvz1J2+w2kLOzOq42LgY4Ps9kV1vnyyZZTN8yT5Krm4dYtPmTPD8z3YzO4v7fIMh+0T71IBDduxFC3qMPI28NnorfK8KR0k3Ood8rRZgLvKiZ0IaWrf4Flt+/MyGahk9toMuZVUw4T+2SvQBPpMdLBwHNrRNO+hTI3rXVJLqMt/wjZ/zU8HR1vvIE6dWElwrbdu/H6QBw6ZjLfMkPmtDvKWKE7ziNwO9d7LvBTvVDZZX/W0e2M3kb7c6B4zFHLi2e1XNTP0cfrC3ZfUesqPmQo5hCKP9LA+PINKUUKH/vWg6YZp6Ufq8UEZ5aSUuHsFe0Gg/E2Z0oFu+XPDSQoV8IM1FT+S3GxzSErT3pdx4OGA26r2eI5ENpTwGfnTDLJZKrCpSIQENPF6PcII9b7gJw5h5AxXqfdIYEz/7V+y6F3X0rxQ4G/iws/zlrbRh5w2U8jM3j/khBBnzZhTqF6JixdyocpSXu14YsLv0qQz3tMouyezTR6OY26xKZieQWsaJ6Sj+r8JW2DiTVhyYYd1lSrbYG9GPbAQasQW1V3UXY0VlwU9Gff+GmAaSIIlkRf2IE4UuS4zjdRe4mOfyWQk5WcBckrn7t0lc8OAXB3upBJ0e44+nJd9qmj/P7mi3rYcxvZzMXhQIbf0yqFfKMJnQSWXyQELQP7ZDKduHfVkrqJe+Y8bJu95ZR5w/WFbwESrUdDir3TP/nrolsG9wY3v6OocNSkGx8wb+OU+2KHwGlyZ0ejFmF3rD6vIIZSpjRDfmNx1AxjK+cBuJi7iP3SuKQLHS4gmY10MMoeUDeRKPB7y9tFF/N4VpBhj+YuqWIdYsjpCV8ei2GxReGt3lXkxzknHLdM7KMhKKiLUDQWYgoUd5cdzXJ75By2CAk8zVWA5wgQuBTu+FcL/QYJKA5J90IX4nV2/G1VAjoYswx+JGSC8Az7dxd1jnzkNq/+Wd8rz5oN37ZppzJ8lpmCLr1ugtS8NKTqkT/Hkn77+pFTuC21JgH/tnAFAYjEBTU3HzHJioWc0d2VWlLJsloaSie5l2iNsat6JJYyNr3azsXO71L5laWqLIwHbB79BKNl8bT2+NFsneG5MiicGPIdGjzRK1ym/FSTxsF89okb/psG6vRL3BfyhQ/ez6Qo9OMxJGqYGZEfKSBPMa/CkpP5YM5audxzOf2xmqmqUrTrey2NZiqY2vXl912gwwXVwF4o202cnGXMvY+6/iODN8Afbr4Q8GEHWxzEJ603YrQe9woehazloPEfpHo1oXymTVTvKVAbvDPxKHNk+o3JnpZbOfODS0KwFttwwuiSk7rkaxfi9EpqRms5ITHQ2Z6gzh1pF5AkAbRFS2x8Oq/8XOmVLxQjiugHpiwUfOUv9nNd57K8k+1FDCRg2uzbtgwMkHNjmeB9cAZIAbE9GrXcHo52IAeH3sQuva+sPsebGssHJ1HdNyQJdK5PwjZunF3XGYfdMRHFKJhNLAr95WEAEM2+iNZ1/san7yTg0jXIHseAxyhpTYUQoy+x0zBka95N3CUWoNUDJx0HcSmvrUjnzTGmu4r4agd3Ph+0rBcxv7Lq48/P8HjrFou/pfaBpnn3Mp3o7g6G1DAddR8jStc+47pwG8GhiMoWzueQKRgwK3I5+Vr6EJ0QYHuuVjX1spt3jCWEZMHrXmXYniygWQbuU1AUuxGzv/W48+evIp9SIz0kU9eEnogc1pRLpIp96803244jQrcXUnvofnqLCkJiwSTAJWM/eqbFvDxH99qzbk2N6NdD5uiHEbGMThZRRAZozbnN8FgBG36RY+BrcO201A+y3XWYliZJqaaGzo4BdQjD879NvLxvc4lXfgN6ZbD3TRRlilt9zNDefjWifxGh0kD1H+/q15otj1Q5RAeYuz+d9RRzMHvr+HpThnMakXaYi0j6xaSEZjo/lECU9/qb/q6Axqnjc0w4rJ9no4qmFNBGnd3kvUMvY9DvUpdhlEKRkWRsws85INMPwRZmE2hq2wmH1NrLCYoB3wAve3UcXohW8vUwkT/MC/t02Ev+iUKCbf2DlBw++RnaU8s2CKKoXTpeJ5byNSNeyhkaZnQQXqGYs/1FVNB08CFKKsG5/mQiOQHU6nzmIo5jJ9aUsMDbF3ZRr8CDrp02UHd9Oa+HFufEhW88WLCLGtAPo8YZPDIWaqrJ0mYI+3+ZexsCi0s1MyfcBuhGEoZ5KrsSsLOiyrmASYer7u8o44mqE6KeE5XNy8LWdk7rXoqrb6ZqzuKqqBwf4ffhlEbj6YypbXps2gpNCESZ6iQf+ZOfIYRvfr/PXP0spkERXxfAidN4OdC1N8WlPZeTs3zpaJMK9BIV+UQB6TiE5bjJCm2+NssY+56qXCYg4zvCix5xNSl2HHGhriLOa4oM4jGSuEgq145RSpU+mB5xpz4XcdhOhRihYMeDR7klLVNnVcX/mbLWpm5bgMqbtXSa/0jBRbos1MfEzA+I5NFx4lIXvMb06gmGUfnd5eqakSjGXWnqaJBFlIrXdiIaTSu9KTVkBy2/FjYBnSqwwkVJQdVbXcTVsrxXWkjGqRO8G6TgxtVfPD7ixvRtWPTS+jxDr3rlaEeUITVNWYQsnZGgWZfWVu6/GGhFYmPLyRZZvrzMqi7Y3orVgUiKnaMmavEaHVVmeuy4MMn4SDmJgQUZot6qxOg7xHil+u++5j+fUh9VLLy6uKiM9toThogPCOXn8nBgbcogQnM1lOITN6P/XvwS6DtZoT37KNujDMheSyMz/NI26xyi+5jgwVbakQlSgD+9sGCnlsQ+avWXW2G2xwYj7DQBwfb2G70Cqf1EjAkMU6HuQZy1FEtxNWDmubMkQxhS9x1pFpLqF9LHzqylR/O4HPvdTzUHgSBL8USXpD2IhGBRC+stNQ1M55mpyuDopKiMUPxQYvq/CrEC1+kk0C8AY8Dll5A4zS9U2O6w4BURVwLxUrnwNXouPIRo0ngfmY+ca131p3gEX6X5wZIZpFs2eZnwZQn1iheyR6apqiBLXCU8WnXX+vKmsZ6WsNpCsrtXpxeqAK6nir8j5fd+BBPYjb7MG3MeJdKtXwOB1iqP0rlcIdFgS7hijwdtf+i+aVQILcmq7uPgRYSQbC/fIEtrvZRehHa97+jT7fGxEiTI2bPbK15CJODJK0/AbSjkddWpYz7KdhjewPFZ5KgSmXOM10bTe2Ifws+3VB+/s247tVqnSrFXxzTztfr0Qg2gjDYf5yWXcfIDmnx503EUWpmiT4/XShS2CLRmti4apLbPcRtxqlJE5R2jt6ovY0pRsanmNYMUUyc8AdLsP5bndvp2y/CdmFJ0gNBUEEV+cLp2OsMA1/7f0pRXkSKosc36F+c8HZsaWKvR6hycGTPnRAWd2V+eSNQJADUPpKL2JIeMO0zrD8TWJzmHR3VZj6OqJp0fOBKcklQXUlbfetjkF1G1xH5IKtaij4JJfekAJMKyGPd2rRcd6YrM9eE8YEQGbbdDrAvenKGYJ2gGvHn97dQAzpkei3nbCY1Poc5A0cRY/DuREE0PSMZT95SBVUKgrFQldoIvhwpqvcMlVb9yYSnfY53uLrIouV87fgG4XfCXVJE57ISNtb03os1CLTUbs5fInHZqMKNy/T/TTPDVugxPFNeX8a9Etp+AX/hY2QquGs0xscpyBpUB/CJmgODaQrdipWFPw7z7Cb2ZSZogOaX4xH+4wYBI+ejezc51T0nmSBKB4DUIVc1RaHubQytYxhe0i9sYyBWEDK3izd0Xr3bpnC+MFwaSFsgOhx1FkfyJel7n/uETdXNmCmOaN0HBh1tux4jLL9HqN2lXsh+VSsA0PuWPBA+ZRGtbMs+3X3cHZyKYN7eamJk9or1xofwFW5nzywM8fm1aGIShHY/drDXibHkerxbj5WQFzpbbTRYKQzu7w1hppWm4okrybGihfRMc5CkCazDLiU3Zs3043aI1QheQgyBXzIwFMgCCr7JFSL1vV4SbkI40iiCYLhe8XNG0K044ZCSW41RmxyqEXkPgF4SCcpf6w7xW27baBluIxt9SuS3zc4qH991x688Ec+yNOVHj5C/lqqE5Xs5xnyhDnDL6CH5FMZ9pezk3+vlhxFohVpzTbFtCXuTKFXrAGBePiaLqkllVJ/o39xHM/s5tqeEp3d0mvA1mRiFz8lVDN3Cqzwg9noeA/dR+B9M09o/vW76/1MpA/VDYtcmqesvtLcfQ4WmSkoyxYhdDnO4QagDI7zGRPcLFHSb2FdKiopcjTcT3kUYEuFQ+ZgjDEX+l1YoLDSkf5eHN6xBTXY5DFhuMhEgWOS2edBubFBUf8JX5MPADmjDrbBQr4KuTxPk2RojBDRHuBh3UlNCAUak1bWDh2byeLPaeS/8p6WYefGWD1npDbGq6CDLsWQQVhFswvB3PujaRZkbiHcezxD7vo6BvaWYiXdJUdSZY3d6f1V95ccICkc9/ig7nMQ/bh1/f9tVkfMJicgPGbhzpVDPeNps8vwMFNGBEZrSQU8GS+eWOdnRVHUwJuTgtdjn4LLlyBE5ugwNrRXXkpWkcvvFQywnD3ViSE1OlMXYP6dLWcxWmWLGxj1q+6GXqyd6CPHtmdMowNHqsAFenlwcmr0vEnOSoyGcIcaI/yjzsezKkOthM7JVemLMawLxg9381Kzlij0paqMLoZQMQ+iO078E7sSbPX4EIR/ghg8AQSr/wF72fDE1n+WyA5tV/7CAK2+EElHmjmi5fiNRO1n9mrrbfKZZr0boE9uuBYXUxq5Z4CDRXy7h+AxW0kalw6JRj5uGBUBmq8JlBUS6/3WLDQtyawgQVRNdzttnYH9MW4biFld/xyeYPYPK5Q8M6u8HKCoGOwpnv3gkkfHD8dc3GnnB7P14ANOD77Fk/cv+AmzzviG1yY2oFHMTg2zQsL3nDC/iAYdYi/FLCezD7XOYNFW7cEXOi7heP9dOGDWzUBzNpUmv+Xr7/T2FWEBrvgmSaO1m7hCeSZCm3z0Ihkp+e9dernIWjY29LQS7WTFwAxgHRRwJtLYIURrrkemE6UqKPej23dZ0u2vz5p6i2EWVGOz+Zx/MZiSG4GVzTDOK//CX9A4a23pwMLuJLWesKKDeyKTzrHvcMAkeTqkjaD4T2wJ8gH7A+lhdA6Xy+++YHgxRAjH45vEZ5OnJnp6TgExr8EmBF5mfwuknQEukFQLRy8T6mM4aHuzwRqrbJGEmJnNxCC02ZCnwSgvU2UpNEMvKd4dKnO/zVzsHEonykD2BNI5apoO4J3b+l9dSIqJa1QHFPs5kiMvkCfeNYugreMJfSdt2C1BpgLmOHRmHqNW3GooRLtWEfh5umJsqFBY4iRVnnoUvLABXGbjHTrz1eI1H0FwH/ayHoEGjHHw8+/XG6G9PYPCOrnNjnnG956FGaulk3WqbROxyQpx1EJ4X3pkVB/OeMap1n84CUOZJqQsufK6i2vRd5ZPAepwqnAfmtpAuBehN5cD/o4W/YW1SEctOllJOo+QdzndLeZWJH2i9ZJ+BD7dJjbp+zGxQxsm1humDt21Cve6SgqiJhYbJX1K2tv14HL94IFXID9VjgGfoRxHcEBTaMXcDrPibuxuV6A0UkWiovazyn10mFqpFC+Kbdup9BYuHISzFZElGtDjFpwRokSN5VZ+JWnvGa+5ZPAPu0BbgKaxDGL8kJKhhfMyw33C8duRlooeCssTILa2bp9gTehLbwAkKJahBccSQ4EBAV/fDfdIiOFcCnSuL5LIep1G+vCQ7S+4bblcNy1kWf/PgYHycPUPmTnE25SYiQAAuAdeaRs0ebx4G+j5IRfqHATs1QGtk7N1FuAhDPJg+vbLuhadkTxMInYD9WdROuS1nOva9Jl3Q1pv54AWKOKrmlWNfpnTZ64CYdIs6EfsrvqdAkbgRwv3/o7gb8aaru/FUnwerYCRy5tQOYSj2/y+vgBjp2psAIU6H6Vt49QlTa9F9zeaH0uJowyBzXhD5KzflGoKudXSNk5ucGp3BWP3rv9Fn9eTqiRserX8ezNbhfvYJbYJ4SZyaHXXpLyg6qfWpT+I99Ti/LHLtGRU7S5flLPvRVLR4ZkRcs80zqDyB7uIenG7jTHXpzg9pemwd7VtbuTsv/2/erWZnpLbA64/AWViHRkaSSLWzT/90p9XyxJ4XMxpRUkB7UvIQkip8DyUSj+gqIiXpnTc8IxRNfwsPMm00izPX8ndnOPEWeHSWas9oHjY5aHt/j15NMu+c/uX3o96GB/DDjEcNYnUFLh1pHDmiPEg84lHq04eB6AsabbeW1p4O1g/gBmTIC/kHjJIqIrdvowEcFdHLffqmz013kCxlwh4PwSrlEao8nZ+NfjEILbILv8qZZ53VAk+UErDmk5zXauW+Wfwa6g/Jmt/MoV0hbqmZPJ/7CmZwaUD1yVZ3PhJzkdp8Sgos/Zq7OePe17FUKITdor74LT7nrvmVNpj4uyJJQ37V9vBWoGmVhA1RwLoJfbxA1I3D5IihQc3v4YP6Y2RNn4x3ubaKoCsxeeCyzS9qqN442iQI8yafnrldoKX3GgTX5DexVcPZzg6JJFbdvpXriDU/s+NvsRbAKvvOCppIZ9HfiPAQk4YjO1J7NwEEUYtqDFwUAGEYGYxYt6fuiuyJE4i/h743I1TWGejSPCewLAGxt12zheEn309n2AShfaZHSMiDsDKzj7tnQEIfLq1LuZDHiuc8IfMomsLi2J31TituPF2DDcnWu8LEW5DGylGc3ht/ARrs7nvz9XCqvaqmJ2iCwOBiFi9jddJT5rgbdAyVXWgToZ9CUS4+txUIAvk3rIFJev+HO3nksMFT1iSLi5x//QyGWYEywUoURQ+RLaAUPxRFdrzNa75jsI6eeH37AUQlZJ8NkH+9HKPh+/k9jq4bUBUSxIr6Ub4Hhv05R/Dq2ZuItq1afVmgTTgPPN6OsSgoU61uOIYICYf3HkC9hzUfXd46dLZE3KDCfeAUMMDDzNfV2megjziJb23JIP7iQ5TV5/Om1BnFIDY77FCXusBrADSmoItHEzGW+ow1tplDsd0FrN48SAkVg9PEwxM7xnd8xZ1DFYF0E23VY6+7lbqA0V8WTh/6YWtCgH8ssJcVgk+h9/wLkWD+hW7U/dbsxoadLtm0eFf6WtQxKHdOLgS3asibe/Z9lRlh+NfkINZ0P14oouFBAjiQz/hTvcT+0WNno6XkGKN9+U+Qfse5G2RrmhuoHgNOHBlO0I05vQFUTT70hQaaWW2YxZmutbkQT9uMy+HvzF9faBtFzcnkxNL5GKYcMSaYRLFp+DgWYh8S/HNOlyEGIRVAX+cDskzMYcCY7AWPz/2OG+OYBA0rttFEtRqyIjmYIJLK3rsIHkg/qSCT5/31Edg33spn3KJ6pbyIcT9e4ZUej8nOfXR9LsrwKIfiANpWgOCjvLIeVR0AY2sI1hMIWRFMU3JCYiJrvryKDfuvcRWapRqm36T3tCruHg0m0NfaSN+o5gSwuzz9uZGgUxiIK+MiP0Z1mMqLFjWGIxy0N4QNpdQ2O5PAK+F19jmlcKK2+KjYajg4bWXo1/jXhDLJS9veY66ca2VRakhx91t4WpZeytjZxdVxUsyLFm5ov2p8ycsN23dM5NLvdaenFEL2yREUqAuGsHw09c2DrvzfqvzdQfWSXMnVqRKW5alcJGNq/CdMSM7BGo7+/3nG6VFjyzcgMTpET5wW4Y3dHkizM7EQ3EBCnwCZEp8C7Yf9/l4+Qg/iPK8AuZH36wIqin9vzRoSMXfEnnHPqSXLyBZd9A97mdjjvycOKqApdSeCGXBJLKurNLKOrfy5X4hQq2eliWJTzh8EFPn2uUlY3Y3ynMefh2/GHp5QKajn7/1hjsnXNbrayhYEs/HeTNkGkzwxMhyZPypyUIPhgT0hNN8ZtiIA1Lxbq3XJXyK5YbmaVknNf+wlJxJNNxNL2HMPQ+OUNXpc0wqOxjY0XvI70llhw7CgK69YI0xV7u+ULKwCygA+xJh6EcoOGPpn4PKs0VPUcB5c2JQBgehhCNHwhrdNX6SoH/b5Bj/UlXtQhVms8DOKDzuLhEL25huCgVTlUAQMmGqekC1t+e5aTykcczISk5nILOPc6iZO3sf9r3E2DGxwCfsWOA6eO/zJuvQlVqdDjzQgI3FZiD8q7yk5PiAnumDEtdJQU5SHeiiTSfRpVSt1ivd0xdeRBkaWxqbbNBqU44E+LRQwUz694mnmZhkqhStpZBQo5+v8gxENNdmoTsRvaFNo5CdjBN4LsP75IbEG1A3yO4JekeAgeXNljEr8lEQbInC6fVjwL/yYYdNro098riB3ve05eEMCOnvnY86TtfGu3TOlewhnqW3k0AlqTZ/VwfE+UKSne9+ELljZlmrbhpxRmnQxlZvZ7ZcC1ZMEFfU9/2bAFkC7AKTyMSkqvJbat4gsZA89fmjYZjWa1pzYsB6m3qWHbE9MASTCtW1dcpd9FYZNlBuyKpcdiIUZTH97bwwXLjKdmcWSVN/DZzVOfLcbKf28vGyvqizLKjDH9o09cmYT568cGqX8Svim+LWUg7MoQKW7By/cgN2beOvLqpAuEluxrkLrrI8rqpQhfeziYkwPDT8qaVzx+E21uhFQmJx2iE8qfLIsLVqqXTd/motLJta78A1w79W/qttCyf8zCg/7tcUMDOQeHaxidrm4xIOD3kthgUSKgM6aVFDfspiYv39j3BEm70to7IMhQ0AEBG5cNbwXuPHk/VjDVHr0oeIc0pb0VhPAcELpR0rTmZQptLiibzSBTDa66XBXF8+boUvsW0cfP282oVypMTUpomSuDTNPtic+ZU1BmvAtf3m2gr4fxgYFILMdtHcu494744lUovm2XdYjKcXAVU11s8kLQ8Tp5a84rVpWklXUcrcHTVFnfqCiP5RQvy0cWtqt3FZxrEMe1EO1u79jGBSBaoqvWh1VVjOfSWL6/848ETAdLyqeoMhKDqE+NVVl7ej9dCTXVnGA8rav/0ro5HKitlozjsmPZS+ZKwRn0MDefHuRtPY5sYerxR0VgLQKdXYsFTIFt0niWDfY6/tRLeANgVdaY0EQwHWGlDl9+KwoPZ4+VLL9TgZcq6lNQ47UkI/xRE/E3ejPb9A/ijj19V9T37Zs+Tt7NV+DuFfTqVPNCZmTcYDwE/OMiZDcdU1eVz9GNVeqReIbb3YAfWsi78K/KMFOMfiBoQ34x07wNbQd3Z4tejda9TZvpIaUGmt7y6ANFrxnvSWNbAY+IoAOqKybymCm1UGc4IOUTKDr+7xXkOTbY6BhlWbFvMuQDDMkwAKKA9JZjRLG+ArlOglFfKW4P7uCJjEC2Vcc2pCti2QYKxZ7lutKzuMHsU1U2E89DapqOKvL6LeoIiDsOZSRuXLLEArCDjZqxqW3pgPFqJmEWgtDBUOxck5RXpcMGS7es0W1xculNmStrgSHSyNpcPZeA9pe//zPStqICB6KfdaiFx45Cg1iLt1Cw/f3DTjwolp5dEI79JMVQFWGDUxyiTIOIUvVF58J7UcbiFa2cVzMXzhx/CBhKQri/56OG1XfwCTTy4BZMtY0DVKlNQl49lsYcBlLNdkEM9yY5j4pOWSE9JTOjJYfJSyt2GdQJrTXD+qqVs4MAT5wHcnY2rTMf/Ie7GB4v5+IO8nM6RvIzaLNzeu5sdc9KjYr7XYeiwe5UNJnIWSYnmLGio7elmURJHewvuQr5744/vOObboyVZEBR/KlXaqfufu5QrhBZ0JdOjKq0jvWbX3rp7pmHL+OMbv4dwUUSjGSPFmLg6c94UuFUqaSnIS9Aq3Q0xJKXEOVRA1M5pvmCNM+Iybxx0bIt661em72Eg53bELJrJ3skVNdz2PB3qcrs4MWgZmO6oHDrtrUUecRmTByAS63YEJyF45Vdyw84A1Mhn0hLmIMMALXPLTkrVs0phgiIxefkZdgGbgVCU2LXxKL1aPbOUhBcD9rYcNVhLTPucbPfz07BQgG7Qz9PXir2tWZYkipN0gRc3LSIhpk+R5dMOl/GT5/Ibo8oDxCCU88VrpOMIyQOu0D5hURey60MACnli/O6HQv88a5JB/DrmWUZxYJa+YYFyUc1DCgD77NPJ6ws7F1uaO0WOBrYv0AvlYom93mwmSMO4uwo6P01WkoCbkYW9SENSnRN9h3nZSPgq2mc8nhrfsFK0aX2htHS5xHfP6z/miHYjLQQoSuwU97FcRzMnLw3qsoFSJySO02aa5sfd8orhHj4XR6ww7zTyeKkohIIxM/DCTQDUD42y19/U1fgXfA99KHVuLUEVkYQo5yiiPqK+XFvHC7ZUJFoKyxObpSQPnP/85o9GcWc04wyvWWkkvAMg+vtvsaGVKzQ1CdNarQBa8GPiEW92q6YAnD65x/eU/e6/zItgBQKADSFSk4PKLQwPehhju7j6JUAwp5GYg3SSdDWzdWZ00mgWF6jsLBpEl0faSn668vHiCUk5p33sv/QQ982sF3iU8R2QcM+5NjwfLpS7TpoXrdSYniVbHFwb+p2lhXBocZeuqOSd7Ng8kzo16zT1JD5ObrJvl/qmWeyCr8yuLSchCUx+whOXY8s9LUv5Jj5JQoqAlCDM5kXe5g9G3mMXcsHHmO/rVTneDxoxMEeBsCBt8bTtXqI8aaGaV+inY61MSvNXrzv4TDl0eyQJu4pRUn2hmFhHi8ps2E6f+00YXp0nygizHJXZCm7Ruo2uldawOjtBn3jwxokMBeTy0mfXCx7hkWG4A1umiCEHuFORvIrIuokezaIdQmgHCl9JGbI9byz0P8DTDXEcWnmFp58y4mdEbq1LrnrUarX6OCrNJG8uli916plqTHon0/vbCb/RIO96ChErdixTKj4QHma9tXoad0hJmJc9oHXG6vbgVh1Fqc+mM99gaRkhg4B7LKCcmQWIqs8dyNJ/j1D5bGXk8SGOV0Gr7wQ0bGkhRCij0xudlkyW3P1J1krQmLS51CYorERwwA/CeviHYQIUUsJ07MZZWiKyhhQMWOuXwTrxSzqqD6aAkH/JKupIcj9I6qf4Mk1k+pbk4stITKKE1kGXxwxGX3s4QOThm9VVrJKD2HgjivOR1z18UIF7FH+IMhlEQ+64xKeioKtVXBtSuRCGRivUh02nhiYOu6Qs0dwWL1hsRRSYfYXDD6BFQi3RoMDmogynhcNs/ORim39vvv/riekeUTtj/mTz1fVrLtpFuJNq5q2C7y1ogSkSuHDP+zKPFWmgJKHMgKBGH1f0pYkG+8n43yCgiyrMndxeHSXepwRGY5ZNBGafjL1JZ173mfVO+IqIzN2NIhIQtwDocbF8Br+xZyANoWGcxdmGNO39E3xq9VFvssmf0ukW9k3zlxLccX0u1gEt2zyiQG/4zjscirDdv2WfzKhlXkeMV8KIINsGu8jLGMARt1thTcL5olzUM2MvbRdMlVMFLe51vbJlNrdAs63vk4B7bK79VsfVXXr9dpUaIMNlat5qi7baah87jE/pmYDVnykHDH7dCJIq7zMIk+wHbKU2oWJNDnNPB8TQUbaaGwQb6oy/OCYX0rwPNiQptfrAmAij9nzGq3vTPVzSv8HJisz6ZHVMI/BYNG+D6Cu5LpYlvEPCJs2/qFmc1X8J+Lv0Vu7d6naPVeqsoyDSsIzJUZlC1hSeWvU6AvOUjvkkCBtRTRwG7+T6Hd4x0SBCKR5vWVlJTXdYcM+JVnXcKUD3qA7X5gvviegTb5AKx8DSDuYKIZ9NCdNqpxxwJr0dMlcuA5ESNhg8SD9hvXiopmglnP8A+5sUqaM/WhveJaCR9W1bp6xDpVsKUk68EPKvOuE8ZD3XSmNAKAZrePJrAKlAPrxkx5Wy1rOpajZ/P9ah0r5ieFnXNc3K04iV0AD0EmvFdpEh025iF8HoL04L262gs1LahYrxVjv2R3Q9hSh4Nwk3Urr40k3DRAGo+NrWGp+rxPDhb46PebwUB250MvluOj5t9bjScL7VYhH0tQvKGTG5YKN8K/T4m78duLFHeOAl7uMRZ6oSB6Tjt1wQaX1g/+r7O7SkzyyUwX9C7gBjQ1a9dALi0eFZhGZA21CVjxX1z/PF+Yu2D06Ul/Wdc/onODCUmuBsamqqW+6Umh0dlbaHIdX52EkAxNloxzP6FS3HZnB5dgAJFHds07suPLAbNVsAQ2mm9JkEOWZWgJ6JE0edLURHqePh48hEegpakPh4lhTmOUcLtuYUiK9kOgGiu74mkuSsHHg3rYnoBxUWimf/8zqdnifzLKdpGWvrgBHUl0ya+6pa/obS4iI4G33dgSEOytN+MA93TiT7ZTaUAcCllKIK3hDtrah/PJ8BSNVvbl39AjWDZp4586ggwHRYpomnsnunb2s29komHDmUR6zm0I0QTscE8Ox27n72Yt8+9lfMlEAAeSgiUD3I/GUnZjTNX+Wtz64lFNBvJv82ye3FYijW6AikqDMN+0hHRevEt3jRxjcwNJbDwPfuA6QTIqaCbmJu+Em4N6p97QhFVbuH96FoaFogS+26rHksQsp2XaIsBrFJCZ1xPphupbB0Ab3nKje3by/o5/uGM+55fOnIvTIaAFHvm+boUpmu6wAIGVFsfNnSiRMAuVQz1JW+VFN6hnQApiIdrgyt115aGDjvX4OnHbScjbsrHhG9N+6X8ufleopAgFUSb63mFPsnt3ChVEdKL+k3GruqHoNf4FqFFbpYfi0jnO5LHBwAtyv/DdRGgenT2aiLdaQQlHbAWoXF/bONVOY7b7m7xylgPkK/Vn+4UhRTGFm5cZuNibNFqpVsfZVJd78wewnpoUrlTAQyI7aQRIpiEKvqILdH500bisk37C0is7M/+9W+S/jNBh+Htn5sBPs11yn78xL3MFIsqnhKSuWrVkODMyvM3N+bwzr+lw5rcK6eNjhrizm51NJBDz8clr93qzxuINvstW3/7ZgxJMRd73HqWPe6NMA3gk2n9ctvG3R1KYIpM8afd/ZkMU3UObwH03EFVZAt7SAY/tMKoo2NQlZIGqQvDddGCc4B/7o0vXEDSAOrJPGhJQKQgCh9yXQeMmbe24Uagdpt3mvbeCVQ6DENKnanTSNFwHoM0sELhllbqUha3w+WRc+PAujk0LwchMGrZyVFtBxZtHV89v7tzUjwx8aN53ngpGDsvPkDJAA7y7VH7eI+FiXZbQKyUCx2X6tuiSdwJvCIylgD9+Cz8W89RO2kyMXa5jNfJguLySL8BQcv7QMe6w7Vkjl71ZZqBcPXWycRDEc8FehJshGbO0G32+O/dXEBM8nlHDqPyeidEPsNFPw3jyVbzWLXfqMtX5fVbAjR7WrbPq1unTVYmlCiQDLUc650LzMKUZRlQPoN4FoC2jfpFHAkkyETg77jB+4BjlXMQnEQUc86PBtyMZbqTqcZZsjZ/a18XYF6RSCj1yiCviurRhA5iKXwg5LFE97nGZzBFo9OFMyR42w2F1+ggyNICb1EiPu9Fxc+Fq8Wf9PVmc+zzcAv5VOuZlrC/PTo9QOq+OqRMDsaLuStATNHueHR9WftY4gf65BEdBQTcS4lPOxeatMfuecWXh7Olm7+u4hXOPymgx79n4j1bGW+23SuQuYALQkZBd3PqEz2fqdUltrM69nlXrr42nUy/Dh3SOGqcZ35bBtHEgMjAogh15b5kvxVzh/1JiPvAMP1+IJJ2mF8Wc/QPIFUGx8ZJ2/8mGfzQ1WUyEevS2o+8Mzbr7UNgnW702hfz4unfKhx+8m9W84TIYb88k0bOyDrm07ZcKwx8NUHyfDFhPXTWgWxtpYu0AZxAyw9BnKF4YieJe92LI4q1+kjsnva+LHMxIKvQZYTaqwv5o9n/wHLNccnpC1EG9dPr4Jd9t7/GuXeG059Acqs4b6+/yy5OXjK+QxA3i5hNfvHFdaTyTPDgEmUbSnXE+ibDCNWbb5GP8LsCXIPac/iAC3ji8zRbbF9c3vToYtu637JmMrhzFquP91X20m7ZNm9PDUHS5+oe3xPLgv9dH7nHmKullrKci4d0F881Hdws+tTQbGMs+YRd93pw7alKhZFjvEhbV5UnNjHHF6ZC1tBYz0dlT64CPVHvqw8KsFxchKtEgw/HCrIpF6/Yn8YAy9IISWcp3iomx4oC3phxjZIWGz8gvIrkXG0QAHvObj5+iScZMW2YtgMk2XaThaulkIAgIWv24bPDJDwbrahs1wDCzyw5xSfjC8mEPpVTpA076/JIasO4AB84Iromq105vCONdH3+mG63dME2Ipagke7ppEZmni6KtT7uNrjwE3L+hfbjp/bHG2NJ/Cmka87PYBBRgTnrG4TAdWNwDngnva2rLXk9MGMGyMwDmw8tqVRiML0XQev8VbHNpblB0qnwfn6nSygqW9YSwUlDJn9uwiBrw1qnrIyRAK+VIAF6bYELqcnziFUtm+cj0gXkykO9bPi3y4kILQKgLcoxk0j1FACOvsbQYI2wQJIoLrXaZz1wQqICNKiGuWBIq3L4+edJzUg01Lcr0lmiDAFBZgwLl1NFa4micTya7sm6+cXe2rzvAu11RN34uIftyWROTKFtAtcRiruqI3Sf4bMlqyCTOauLNxPF4ogzakCVqO9wu4aZ7oLD4MguN8+muTpLth8Rl5QA5AFiK9szaO9LCm8eYcN9i9DsXNHvB7cLVXDrwFj7nltsNX/qJovIa5sSQLIil9T9KdH2Oh+/KZpSXl0e2ByBfFcFGBd7sSOPcMwVv4mo1JeihZrzxvDlyAZKM2z3Dle6JyXfAPRecZiJpy7KIkQzyBtptu/wWnWfD9Q0AtVm/HqDYwnQ0qKqP1XaQnsloL9tegNhV1L8xnqxtPcqmWgA8NboQ7nkWKq6mjcIegtU1ej17fM4oLqDUDOAqRR0D6EFkj/0lrOdciNHaydZySPIBxuEMbfoAUi4qxvjW1ZTM5Y/JX+2NfLLOOBoZhtRNU6Uijf0cEOP6WvG8ITVm0O9fVutObq1Yi7uFMOdqfvtNoSCByD45HT2G3zNsYSVJ5L66hfwTeCZ8pSLj77ypZ7s0/QSH7dxMheTir81WPAgz0CTdNzJei5xJlqjApct/T25RqsNp0EOPdQlnOUrlOKUnhwP7s22JA2vh4hGrXNVpjfGku5O4/Y4Vd1UrWcGWGsY3uvFOyK1nT9PCYzeuysxjWGSz0HAQ0vOGMXDw8/uoPXD2Ss+E24BdDmkdj0qbPULZMSZEo71J4M3AmI+/mdoxnvOjdlhWeZHxvRtrfMpbFeLehS8cr7NLlNOPJgcPdx7mfc0GRC6+BnUyGx84sflOdlQ685VoFoI32ZZZ9hU1l+dymfL2up2bFT3BWbhu3yjBKfpsJEKn7nPlz8caR6EH/c7lbJKFfpRY+fgB/fqOkDmhjfONpBQJxYmEjF4KyikuFifWi0uLyyQVgU1j8cLYipxyNdcst8WIPgLYkPOwOoCKjG5RBrOXh54FME/WCF6QBTzzQHozgT4jXx147vcRTxoMrm2N35370+p3pkD2uYdgy2HF+YrG/LLV9O5CtMYKemSFL1KNmEwiWr0giOan/b8C8hSTID1VU5h1VKvt9OXd2XFQIhPq2kFw4eFB52wSMPxOIJoFllry+fw7lDTsrBSuhFf+duyDxX2ZYaNwZyM35IyQg60+2iW4gwKoHJhQ6KBsmFPn0WJqMeCN1n3HHH9BaWr/oEnbe/X8WkeJohuYaZVwpr+XgpDTJEY7nwmFyYajC+CfcE73V0bSk639rTEgDo1NyDhuOCqByVILjq3A4r85nrMLHvtB5k+s6vlDKdqFakN/HtHvlSiukane76+wWDpqu5Kxi34AEUJQ+OJ35Me8sZrqH6J2dM061hzCnut4XUV31tQREYexSRhOT/71oCHA9e11wcYmoi6baFGHwrd21Oquk3t8Wrs8+z2SjzXrLtdh84DWtAwXFCLwWiKY3Rr5UK1AtyGstyEZLQUCvQ5iXSzpmyVVCrOGe5orEV6u087bRarb+/AxFdiBYedG1x6KNx0oy81rTehCb12s20wW4WWVR4e+sUMEAA/Jq2z5OZNyXScU0EXEDBW/yMXz9UVsIjRjZagv828YA1zk6KTiz8dQS+qkhv6NFZ//tcF13SLVOvsTqA27UN24xiGl/ELgfEGzpKEuWUk1BLSwD/Sr5B0JCsDZYc3xb2I2UzzeFiyA7YOlTfovDsjiFQ44MMR1X7V0Jnrp1XPJqYEqmvZRsV0pAPRk3GfO1iquOiZl2pV2Rk2/4maeqHwM9vZmTFICVL3FEA5JQcKSsdDVQ5Oznkmd63bGQP1uRDpe8RJy37fxo8NDsu2hjFrwZ1fLPucMkip+uzRGv8Y7mjNTMPZ4mXctiGGfm4uimf/Qt5bQuCZdjG2wWtDAJReUY9oStKlUz8UAXjWveGl6V+6LmvGUnJKVck1fPdpVEjFgnecMfPSLyI5bnNcQp15NJKmxVX+cflnKYIwccJxARnx6p7cU0T0V6Zt9XvjwtEjzuQvqiGObkqPDlJC4NLFZIWuGuZGK2CWP/kH3P+T13fniSmOTrC5P8JnmY1BHjWJW3/LP0x8FlW8KJs4wG1qrUsdvJgen+43eyyQmWAobyc6T32sx9ZPKHUg8edbn3qAuHfzMqobhcMiAxyMUFOndvwsoyIfHawLr+RnRG6wxQ1LDgYnYONXj2XoFC9aB99xbO+nCo5JtnKfQK9+wMe03YaeHrwr2FNZdT39wF0moe365i/L9i69cyacW2j1awAym2txh5FFMVFVEcTiGNOVL6Kicz0po3BpLUukeoxRUqqbnwz0uRXud479lMLCzY6G3CyMdAtIdITOxddI9PNMCCIvPWc73W6k4iCZ6PYWnRwVg0GAQgAkgavd6pk4PayW6oCVBSrpk+n9CKMnVuX41jV2PHV7l0zjod/CvnWGsyUSZM1phTzno7jD9kLLxqXgFkVNy8Yi1gn6fQvn5sCFsaj/Du9m23Ros2B3QqQYN1Btwv//5U++wQ0uH+MUsO95U7Sd9JN8XKRVVu3SlHMfNwA1Ljdz7sRhVVGjULyqh0zI722OET0twuiaO7hrNQxcY/PoY67Z74D16wBg56P4Ounu5ixwcRuKbEYxtBw7wzvNxbUMIIpp84BHv2W0G3cSiC7OUeN+cfS0gRJ1IcWMjDB6ERjER5yBu9zVlgoevYawlhIyz+gc/cGz09J9/3b7m+1+FEQco+MMe1NuhiNnzYXECOExjm6CM/cJx3riGpEZCmGiicrjPOEzrZ/3ZmR6vfRxt1Gge+gauorQsSF5NOsGh2xENhEemx2ep9JthAsUAFWi85orOZeJ7amtPcnBiqd4mxtB7CCki4I9sZPAs9jPjcZ8nF/9NdbT75R4pb4xW5kqr4k50GXS8Eh4PqveCGNECzAbkbkO31S5raWrOGsw1BDwZg9pxp9HrnOQbrL6sycCrJeUSUSwAgPqETR3CPRUNS1b8/SMQ5Z8e99r3pIGyiMGoLEzn3gOlUvEmZSLePPMcB+uQUPUpFWsJTBv6oGSO0Y1pSHrijP4tJkZGmY4ASOsOoAxpYZ0lCHrp91HrSSjQvqFQy6m1rgVRjOT+r0q059GZxyjf37Z5FJfgbLJf2sY+QDMr4V/+yQU0J1UOf9ord9iL9bNLtQyQ7Ryog5uSzAJLfZDMjAKv2Yt9S99yVKkpXANHWgoQ2sJTETYeDDjNj1+Ep5uabP6h/6n55fXbToqRdf1RVLXodrKBlOS443qONQc3yOkhPjSkrEB0XN6MWLu9IzP2Vs5Q90FOSx5N58/xWZZucm7QgNkvgEGuRL88Eq8LTc2MqLSCIcZQXHnLGDDbT6txcPaVmRoOkeaCAFi96ZhseYOH8MdVsvzLLgDXmBNQfUtLAP47OVeIQwFwGRQC+uHw/upAfOeBATq2k6XtF5yidL9xL+ptfAchuiU2apGAvPVpGwLG8kYWaP/Jk4i2Nx9Z4b/6kiIaV1JwUKo3yCr5+dhsuCTKzvXUtVm/4ca8bLc+UlJc+S4LE/zn8D+nuIMDBbSmzQ2qbi/lb7+KReG8lp0JR/hLCwap4zf0xMAOMpwfEJAGpd3B71IWS1bA8lEeLGzwn8S6FXOvJ2Ook3tFUKWzpCUl9/tFlIWvbQEnbSX2blfLTNyGXHM61aMhB5snjhrm5kis6qwjZoBJd2YdrcrgpVJCcGLnoY0guyxTR98Du730ZJ9PBWN1U7+sKEds1fulKabygCbR6wLWyZrkLM/5XasHfq4pjWukXBt4RIM8JV2DucISxdiYEVbHOOF8/ICbD+Qff5ymjwtwbGY0mRLfHN1oeBEPAZjNq0lt4+W0tIgTbNyB1imXS1hPF5wNkh8PrM/kQ8DwylxR5UkTWj3yeWvaR8LqK63cxiXrhZcCCgd0fmmJ3sJEGmrsEYhXsFP8E006zeiu+6ZO07uSYwBfnI6kG2dU7URH/RFUyWA6dXGTxeFAvWUG2Bc/lINtwZnF1o83MauR74eIp52r+5WBevQfEl3QoyX1CvL/F9zS1uomW2L+SwQoNWs7+M8Gk2YUZmWUJF1f3afO9cxPt/IRQ9l+0NQmRRQuOs1AL2iimtsVNPm9ScHHuxL6Engmke8AVDxqWEvEJuOxRzyNWMPRX8Px7bgQzVIs84VDIvj8NtEYde+3jL7lsvmu0uGcbmMmAEEQBxiC811LA/ALgcD1Dmp6kikPMcVZ3XdGry6SYKPLo/oYFBluNgTpKlQpAYgV0aFCEC8KKrA9IoyksfEgrao1YM+vMF51GCHdtdqAPBzZH0q/nN51rOwNZXELIV+VbmVJA6wSt0yY8gFEa1Fa05jPWv1HuI/B8H+BC0uWpvO2m2OcBCh5mABIKhTJlN5+y+dzjo11oYkrE8V1YBQ3JiPfCoG7IILXhmLXS4APYJGyPN+uBvJbop728Mitew4v5wq36reZ4aYrB2Z/F3Aj4Y1DL1PZaQDtgwzWNbBk0twmok4KiS6JlztRFIzkj6bljl3bwF7paFRzc/xHgKVG7g68xbSqbb9F1x9b8GS0B9F0z8dWVCg9jazBkKY1+Pjs59dq72yoNwSwbkmyBdc/5Evt3Riu9Zskg+swHyttp9XIoq9KpjT62rCGoZKqlaelHapBylRHRR7USMmmVs7VgVoZa0Kx9ioV3tcdGn7YvXcBIjtj/FAG9VL/0AG5X7CuLtDc4NjnBAm8a+pmhnQyfEd6AsV26ETPwhiVpkXq+mDw5AuLh0hlfMEF6yZzDKgw0pMG3QflNeWMq5+401qYZK6BPsekw0hdi/oOuwOI7moC4daR1T5nRIWw8H0zpryIQQT8UExolnsleT+IJQuKnJ6KpTK9JwSH8Bo1ySTl5Ee24P5U5eYDAHR8UEInGQJOMgpZcC1nFIWH+pSObq/tF1FU+yKoKqkTrzjmGljymXoJ3S0hbUPJjXwBe8FN3xF/u8LucqE8EfmHLJIA+ltRNYZhIGRSoEOh5PVvIF3mCdDHzYY+nbkWi8NtZUzN+CPQYUCJOV1IIp8A8Lh1jOx9xuxQEyXWjhzjHqYEn1dLwWiKUkFYvRDh4KPR+Nrf6K23V7rU8r7fJYA9518Wg79E17eJKa8Bir/r7yIPnArlLUyuxHR+puKpvwXgumPp0HOa5dgG42bItlZtNeAT4QL7KRMW48nb4GE/gSFhUajIPaTRTG2QFe42IhwAMcI0AEjJS8lOAMWh8Di/G7ZpuUnnqcaPJQDZVgZI1MpbdRZ4iS4Y4ByUaHxQpvUXUluS0o3/ow03hpzUJ7sGtPJ5oOYwWVjr8/aw+KaIPGYZEMyMect3Fwj8C2w9XIl8Fkd5+XPMUV+xYo89K7vDxHriBjNAhXrJCdCku2HsgfGc69gYJgloAhYHafRQsqKMtgokG6qJiL6pEtoTCyJPXWcghHgv1Yb5nHOrlOfik2AY4lgf6/+kVYR2l0Tpgx5hzCW8wo/BCWnsooscIoz8dNboZoHtKYHv0aKU0b0LfBXM1KDLAFq6W/cucTTABZ2X7/eT0dqPxIkWbRqPog8y9B0D0QeC5ESch+3x+Q77EWA5cIyKb+qzRU+wS8lZEbXYdbulXU/IAorq5ttUKGWVAOFPVNtGsDUt3ExdJXOwqkdZdpTa2ujkS2eXtkyFkNMixBsdk8R+rthNHt57SesZ11m0fCnRdIKlQ19gGrMJ5HIO+BMU5We5R+if5Im+boRdatyOF7QPRnL5VcvL978DMo/rGVFttVbbZtep8LzKF01nQeLaKxJptdCt1GyJ5WaF6s/27Mn//ixvMgBUT3PqH87t824gSfH1Zw0Od+ZTGm+fnssjHFlKKpYZ5EdQ5EKQNk1z//bOXBrh6qJYvSHAyQKqeaoAcqV594h8PQJacu3K9jhm4YojeUbyoX/dApFs3VftiHb1KkVF1Pt8YoJxumc0UVfnw+RuEzRSnbC9lPxLnP/ISPPz4HvhW62+y57LWsUYaG03jTYbBalQQMbWkD/zk1ldTn4EPgT/yQmSwSa0MFw/Y/16zja4KCMS4+EdbJTNJgdsD+5F/gKp3kZ1IpuGE0y4hBXCQW8J8+ejjMaHV8dJxlgrzsnHmTA4XakQoYtCRi7W9t4xbP8RWg44lSHbQbmveg+QksMWeYbVWBlPXZF6Q39TJw6qS7b2K/mYfw6rHqu2eQTYSD7035XsAVo2Ua18VunwXRtwW4b028K+SSZiKtNsNg7hDtyrFP884/tEiikGeCR99nwjOXNZ4Y2HZtLEfvmQ6cd9teTIcpH67PkuXlpsAThqUbXhHOj7twG0O2NrRP77r3SfKF1aI2a2i7N7SrRw7ORrzU7RYFfEZLdal2B08gIklb2sw5Ko1CtyihVB9OJGmU+9hyi6LXaJN31Qv50JJvie4tcL+oV9ttcslJ9Ti+aRToxfqaK2lqtPyZ7x9qgtzGGokKfuJCasbo0rvli23vR838JuTQLFfiFVv9QfFucRE982JhAh3LHMkdGo9GNIPSXs693YAiYKxZbqT7Hczv5QtARb1ePXEW8vMfuxuEUdXqi03qOa8ZTdGgXQp97zZPYZrOE6O2/qZ2eRRArY6BQHSXKkudoTvNlCvPXHRlR627erDU+7rQNxjOUw7CJ858tuRlvERs/zBHq9Qpn0mmtgooZIxKd2rzyJx6cu7YbwiF03cpk/Ch60K4Pj7T1uS5s94nmxE2AGQHQkxdWQQTw8TpLzhR68+F5F0I5ndE+ZDHxeJFg3lRv5hxum6hi2zBwihirv8Gn48+2UEQNq2sOinHAHEA8DRuIREIVRNzlofUETIrrb5EUfTo5qJXH5D6jiE9dxUKxEF6BFd9xnC5wTkOsCpHcH9Xr0sUkxNKnmyO2bSGHE9vKucdlsvI8OmEr7Ix1RocPR4GGBpcn0XcWFk6ZPe3OsLPM7/OupcYXG+gji9QGkDkHr6iSPQny2d6ll8UxRNTNiLSZPec+iC79Ga4a24+a/sB3m9RmGGam0vQvDQSx3A+OIWzK6abHbqH4mInTVtpwP9ptVnXYVKT5yZX+C6AFBS6e/56gXoI3MABAH4d2taEkzaq6fNV03HMWo3GHWUzzwf6C9+1000QjveKWDpAhy592677Xobxe5+JpEWlvqNVQUCNc2wccnJjU6XIgkEOMe6I/8c5i+jBA3pg7vkY6+tRTtEtgUejOzpvqDSdHYzqTzJoNQgueIMk2i5t6Q3jvpuZI6q6yZ65khxnuiiGN8k084kGBwyOXBcdm2lGvBFGagZfdoEqOs78jMVtRX8aou3nVy4oHFNj0ePL0VLGJTOvDEiR/fmib8H733IM1SN7VuvMp2G6+9jWJFP9G+BWCbYrevC9mRo1qfaGqQ+SDpOMb7u79ORZizoZwYckDFVomK+Db9dWSO/LaQJFcvtok007wvgoVqA1v8nlwMpVjv6Md5l2SXMMEbN8SStw7sTUkI20sNjnWeMXQSpK6E8ukcQnqylEiVaB0TRa1COUZJ4p+yqOlhnrVy3yGQ8KD6ty0foLG8GqBV1wHjrWUcm1CeXIIj2UHaClC3E91rfdmREiN3cFnrwHAxF6xKCunBc+det4xsQTmLsm7tknpdTNekQ7K9Nz5EkEjrRxGfDOCy6oVFglw/4M17sCzMNeo4ihiQ0ON7teW6OuznECLGEec+pmDykcEmLzMn/v6KRoNMEuA+Qf4hXoSt4Zcs3Pl1g/FEX5kef1ptXkYU7pmoTmHcB+slXUnki42Uayufu3vaRallngZi2dWDM9vnwSmwb77CxGC6WOlNRBAX2CwnlpN1m7U3JFkBsLlb2JscfcpP633Ep60LwCHxhRzQrJ5EW/ivGGKXGdkvC1YCO8GsIg/bjpvVhhCQaBeENJyMsazcPI9rECcDyfLFgH1Cn2y02aVYaRXvCa1jL53Ck10hSoUuoyV3ql/Dl0HNpt5MGkJZvgwt+RdWpT/2knWiXwHOOwmzu2kH/sypg25aoRFiDb+jN8HN5KP2OKBKefbZhWNwBMl8Y6FzV5kp9q2P2ThjEoHtmY+eBvHOFCL2woW5D0OBvmARNmQInlrQ1BIyHggp/+r9n8hmFudZFnEk29LvhI9EGJdBiklD4k1b+ZYo5zs8Y3/qn1NuDEKKOn6CyASW6D/mGPH2ceSRzKK4Uxh6CS7VXyucmSdFd54bI7Gh7zBTIgy0VjzKQZDnslSIeBjprugPdI9GisnkZ05x+mScitflkcaA2Jkd7TPOdHyomtCjgxmjYsQcoD6XLz4IIPipehsyT/A2lW6qmeGnVi+jMFC8LtkaXD2Z9G8O2/Ku4bbYldpnvTrwEJMpxnhelxh/j/wyn068pvNlfFb5cGbdUyJmqoWr0YGbHodmOUb/p0ZlbGNEjH2mGe18O1oq/doSq3olLPse1IwbPOOCdrJ+yPG1UttMEzyAx0ugAI3tDwiFHexdZf2jp17pILvtZfWy1EdJX0j3JFr2ZgJb9/D7lAWfUooEBNcQmrPJp5lTbqJ2ih9NveAlGRTV4YxQ97VTtqjGMtkSEBfhfE8zQkt/LxFUhRB0wArKp94fidWIW5E3tUdMWYivbn1BGmTZGPEd/5/p2eE+H2IWcK3TnjceApnV9Xb5OPlu3UU4WN+TzyW/2sCMbR1ylCXwD9Yw6aViQNJjMIX56TFpTJcwd6oNAEEJovBYpGmLDkHdHwPzfoFJwfPeuN+GV705Eiv5Gu46qJ5T/aY8qFFI7w/rR+2tVn5guNNPExhZCZpNdwZwk2ucS5em81nNLn8EeFuxlHFTAyfheQB3914IoQGnkILCH0xfnckjDCwjr2XOTpsGNqxByJWAnRLeehS6MCXXbS4YrINEjBzttda0vNTQ5p1PKg9+TQmu9v2akpyaYfK3+sLen7ZCJfirOCEPN6/saeF82ouTq3MSKcvQXbnkh7htrwZCAKsj3OXgKvs4uoJH/H5gXy0/c4dXYXO8mpoEWLTfiqpYUKNJCn83P3HQCtIjr2sI8k6CMQ/ZRf9KFeQkL+uOD1K4QobIK1nBGSbpRoDfvzn/n1AIdhXSRvFDSs1fTV8hjW3rQzut9l9i3ZIHqvDG5V6CaMecyx8DiouKNp4VWpj3y7Phkg/97HC7qyzSu9Tar4R2HZeCdxZxCDRDVymWXiki3mvi5zIIHUEst/nD+kXAHJJEcM9ITtgzdww9ZBtdXfKxnoMyAnCv7nxtMuSJ7xeEvG0IxI6vuG23pvytWhh2bXVv/gZOBwq+NKoLQugUB30dCGXREGgT1KnlFJKrqJpL3xVf72nA3qcosz+T3cNyQxCrHUTFmiHduiiYKhtWS0AFT35UWiFWmwdj3SEgSN4SdanEADFNkJN/bgp47vmW3JQGljq+eq4do39KzONYrMMI7J96ZS5orTlzFoFaDLwNuRcGgb0Y6bEa8iNX6aw1jzWjfXaO+3Erh2oyuMuiHW35SvWlAQ2sVi0u1MOR+lJiTujuI2J6TdV1n+lkxRE6SL8WCSS0tBLaTUL8S+oNgPn2ErCxYghmNkNx/8a+BHyWngjIElP0Qnt/eCSWVXwv8FD43zoXJbdLeBqZRxpT5Uc7dBR3P8JNBBXnlmmJFFc36Nrg6g2vMhW/kO7ylcHAGyczWrqLJn8obbTd8biVtuQuqvKeJJtr9fydPA3Xqlq/BOYMiMNquPNzg/aDqTERUE6PoLwL5zY+M7CkqXVspu6axJhBGrmTnOGQMyudI3ZeADgU13Qe24//Fu8fexfdtZrv5MZYrwYp6UbURFRNM5dfPEo8pKsKRuU3SuHj/ARGuH/lKTKw7hjVXiiago8Adtsh7agl5EWKD8d67PKjENmPNMYyO5tQsWrPrkgTo/l9lamKm7vlLzEBBsfn0vrilP0CBrRhKQ2alMHA3aTOAgclp66FVv/q87H05txtq8S5MTayqMkOPVi49JOs3jg6l7R2my5lZEDQTFjgUQ0bVNT38Uz6TZsEd51hhOP8hiW2VyCA7Ru7d3UTC8xiBYhMvLB2iZA9A6m58PoRZXgx5ZIc+lh2+dFbiSEc93ySWNSj4pdzrakbgM0e9dlbTfGDP84NMw55MrrOsjYMfjpmPyx4ma3Nfo0vXwzpJe4+ASNeqJwgBc7EwcudgkTWEkBnzYLZqrUZ2H3tx4QngZluViyHVk3Y+r6M1JMfacZ2BB5B2Wd2THPEl1jfj4tkaQOUzHaWBXhArS3PPD2j6Fg7mX5vLJGL+IDxde9YpOLrnVQR6VIJIkLzgYstAAGF0yDVsL24pMMy7lWkS0zec8A4CncvMWF8s4OoCzV67Lzc/cunPvliC49puLcxST9Uy9Pfk4j2OKBDw3BSgeWpmO5Mp8ZNlGW1K2iZrNspLGf2Sd0mANjtGZCDb5jkZRQTyYbTWp2PhKvx8qWVc7BGT4AeLDJDxf3TYgaSo25KhSMr4eOHbXo36AFpXBiekt4xAY0/TMZ1ZzT3IlxEgueif1dhTKuQR+4bHA34mEakuH2fggfKxrxQF6M2vpFxjRK5BIoG9uc0eFQ0iH2MzaPJWiVW1KDhTCXyhylt+myGef/sm3tcikKRajMhXi4OYE6XrpGfE1ifh+fOBSIkPwgU83tpzPpzieeyERWY/iJLJ86bF427qV+1M2Fm/ezx08UW3u0g6YUtqZJPuqu8kZ7bEBbnUcQAhvTv/iwh2eMzA7+gsx8wihQU4j5e/F4kJfxfep8D0mkfyZTXiT8S9qymtFWfvJN7mPdzRhwMZjYZEx+7W6rDL18pOPZeOD+aq5gqi/MmAjhKMMCTu9AxJHtJLXe6PCLyjZnaVDE4il0OhfkmausuMNnrFFnCSs7IGeesSsHhqmia23muku9zEPKJfZAVO+Ou+hkJHncesUCv1ua4yKLHb4uDwweS2QI9VyirCkkXMB7UgW1ib/pNMEbi7Vpe48SPtvyNPpFUETQiWY/ToOfz54zc2HBhCYge0nBcU+vkmW25Y/n5jBkKV+WgQ7WE14bzrtEbXG+wTiiOJZqfM/nLniA9b8IzwOUoOhnR78nSDIUNvYZle845TIQwPcSUemOyMhqPmSZni7pBLH2ztNLB7FX0omJiY3eCLu0nUrKnAu8dBxSJPiy4DuzCFNoCwob4T9SDDglQKumJQqukw1qGpTVYqW2VCEeYb4Ui3Sy6lQt5kiXorG5RSnjI2OTDkFwMat2kO2j6wbYjdeakb7Ml6NBOgHggPKepEeXPA6IBZqgW8XR+v2oK3fgfVs4LkQPC+f9CTi/FI1VRNnLRzjHyIKc3nRV2QWDeoYB73GulUhK8wFliIDfDCbg0gQ+KVG4fHPbJqnAhvGkVsVs8+ik3uN5a0x4/rf1JquWuQrY1RZqbqYELVV8+BSji9VIqkdue4sJ8aQ3xK/Ea06Lt8pd9w67IMlbnYqfpHboGFPEeDwPDIanRuiPnd97G3747Pb4yyaWlSt0VNjTxdTaaAB4VuSqOQHFm24/4/PF+LU2JHQEhxjf//bhRJoTAtVPCJ0pAdMGADb/qvonjeT85MjnurlRTdHkFOtXHtlAjjAjYSSeV1K1iYhanM7NPedMAWzFnl3+rVoxpfjtsuNhs75k5bfVFPJs5RNUs3OCDJMaRoedJozqNLIQageQn6HlMbHkFnsCVlphHaUEdVBnGuJxNWEkrcCnwB0L3N7pXB6UgFW7RdulGQwOa8yoRMBcDc8lIToeih9H4Zwp6t2/bz3bOIfl90UjdhCLVF5o06kf4hVE4m5Mtx9gyi8EK8is+XfIZgxYy+AIwR/k0TRZrhPjxh5SHQIA63znN2JzeLx4CT1fxlAWLybSHVlgLDAEye0AGSDlErBvtfjQqP8vQjxlSi1IfRnt3avXrIJ6ihrMLZBT0zfHBNL9JU8GWjdhlWHSmdpBRY9p89Ssqeb8VcMIRblARt7UYSYohKGOPMhIA/5jrHxQYo3FaxwlZC5fmRPktt+mXd/j6RnwWttMdw28BtpI7rM9F5ux/SF/wKQfcvaJDR5OOkEo5CifDBMbDhkaLGxWONHra8wnx9UCWYa4RaBBd8ik3wPQB0WAY+oi8R0Zc5waKP+VIeE4/fUzMJtZMt9zfy/eLYeP0FhUHQt5ZpFrZ/UEOVzd3m/Pk8yaotbnNmK7bulBcQlocCBfSL6eif3GSuJ0MEd88zyjB+VmMJAAna6Zo6+dk4M3BMF+DX/46DO8MooMoABArRuo3uK7MOyTVULhM6lvQobpA8xe718NxQ+/iGbUIUf1m9Q8qGVLISH800H0n3noNxZYct5XfNPoClk2317iTpSvVXH5Ju+KRbWHDbdom0dseaFpSeJZHi0Xk8ygmXPA4iLTsY4qCNUWvVRVpHrriJIh/8ozukAJkCv9sKWGmK0idSLb4BvDMSBiH/cNUgp1kMpt6BYFT8WDS2/NJxWFBxtq8LyyikRD7J1Awo29lsJe2uZjGoMSte0sQ8RLeS3Sbpy+5LemV81J7eDCXneLbD4DMbClkTvw6oXam5pX3ICAUo6uvAHqzmf+FsEUNLZiHe22OlpajSSIlLPtfeO+GnqUCVhVSo73MQkivm719u46vxc2JWRSFbUeGX7Qvh8mWqEmj1ua6dt+I1fnEyrUuPcgQWzPs2tpY8Ll6NNH4rWyA1NkxHoV3ibdpBMp/7mbi38SVCiLfqhexREhRLYIYlkrfpSbtRLcRanVS0iXx4Wc3OCgmL8q6Q/6HtLVCluTQ9P0dj5K+m9aRVPvmwN+QsBu04AzPH0om0p7UmQHbJBFG0vOyRkiFmcn+FIye/oQg8LUjqft6LrVq4f/ecSPWjIV/ePTiYJFqOMclGT1wNBtuz/6IYLbjm4tUdOS/B2Wpf6A+uaIqiza6QKfjDEufb6WCudauCDVJQ5Teq4sJuB2JmomNjouy7behyAR6ghC8LPVcU4z4zCVDl4DLXwEcIlDmkC6ukcoT2Bw6IK6BvsV+i86Mm+wtG5NCLGIBJZDKmFyfUK3rcEKe8PnmCCKJsLLom6TSlAPRqrF4DD6QhknYr375bh1eAjXqdG9TDD0uIzMuBrReycMKmk+iL+Os1XdYCGuqF3dtEuGw34txkSR3wcLwiDgkDEwSHFFWxQvXe3NAdRp4k4zGP3MMmbTAGbgd0JnRLEtaAHQV3/vgkO8hMLc0NZbhbtHJBfHh2p5kh9TniYVwX2TmDpTawY0H/HuHizGysrCm6YYwYX316V4PPWGj+LkX0mJHnmCemRpH8RC9cU8ewwlYtG41U2x2OuszjMNApdMv4RhGK6V1o9ixodKwoyVjszfn1PrZ4DNRR34kSZTuRKZZZ1JM2XuAWafs9wXkRRFSg+zzMmqtw3ahLkAhPb9NRBiC0U6jmeBEtplU2P7WCAAMA3kKe6ZTs2NRNNwEcvf2jTGuw75Dacmpiknx/FAm5YHd9PRtTv4Zod+3p3zkfZNQ49B/l6ThFN1/rG5MXtYqQu5GLbV/TSEyCZ0TFGMirpLCI8gORYH1TDTYS6UvWtBd+j9SiIPT3d4Z9ppm8Mpg3Kq2oikK6FnWVehjvJKmQ8Q5aXWoNwydqmHp1RKyrbM82gh1pWTJqVkUer43nDz3h8/8bUXOSZkHy0kxIE8SdqXdGJ9035FCqw1CFF4UICTgG6shC7dQnjg+jG4lc5BJpmwBC7Bobgk1/z/SqnJyXE3FtIw6Ll3u5nvW2nWsI/S4IwE7n85pECT14ebBng4rnkuGFzrtozVph1ZaPrjNc+aieoH1Ankt/gNGbawWY0ySMWG++ppqB5uvUoGaTj40g2jQbIIQWakHkGL9nnF7dACmVRfoEwkV1BFQh3SD7oyY0TbUGl5c1WmcTQFwFOXLwsrciY6gLOK6fxKyi85WXHICs+d46c5Yw3+uhunHaJZW1tmsCwT6nSW6suyabolergV8rD+9R9a3Pg7UqpFbjeUaOIGt+X0Qa9Q+NMkB4GbJWMebZ2JgKyj2+vUaCJDf5TuW23Tm+mXgeTQpdHz4ZnfY/Lo4hDabIVQTnprl1R1KoA1i4IL5OsMTi/K/EYGRvinH4M/sqvO4TOseE3h1pQlBKjxsY1EcRI34WDUTbzfDDTGISXU6lH4TgGBJpUstwtwJ+X+dIl2lTkr3rROXdxiezmyESky8o6WiCQDFNb7jBUU8hVeEQp93l4eLfKrNfgySjMeWowz2ZVr39Wni+6TeqGg/5tfrl2P1c572Dk6EJ9fA5OcAIt6GyfkrSzwJgPquq4xJKn1qK2zpptMJNf5lTuENLOAjOkvGDc1QZCLg/k2ezfwyL2B3I8nEjocAAQnBOulh3GwWjimzO0Eawg1vrK9C7YByele7hdKN9Ra10xfrYf8C1TZ2d4/yyORcPURkhBJ7pZyBC9yfiXa+Gg3d8ldkLPbqLg8h8SA12jv7GK0Udh+XCcKxaw08OAb07s/xOVgXJvBTA39GiqYKjSfD2aXUUhJNukRCkCPK/NHmiJMWiGbUPRZYTz7TmKGbeJvE1wjcUQXa39XzjIBWi9x4QdYVJxxra3S7GTMK6JwyddIz/u7S9zky5unPImOIanDWg2ZHc9UZhqngtfZq/EK1vQtIpz+OcgUoT4jbSUWPI1HZu3oV/AfSiMES71UpeTjAhkKnlMBcGRK6wKT9KBcZnlOWlUd5TNfZziWNlf6KnVqsL1OOMCgTILG0AxgtYQhG5LBZadHpWcfTYxAMjjLh93Tb4r7oC/KqjMuUItJcjrYazYSNSUGJufUv9vp/CnFmCd6VPB7lGBnUHp9hY3DCFnKvNcTuPrgOrnd7sbKTW46/s6xSiL1+ogPWsjTP2N4/ij6j4FVcqjG7nygak5xmmvZQIpEdgWZwByIRO1t8ywCrZIsYx8T0EvJryCWVL9I+HRPg/MgXmieMJTanP/N9UyLA709tD3B6XODZZHmubINnwZM7SEH72ahoKPOiFBRNhDrsqO/+qJIhm8mXDctCPXJsfobrjkIREvXoyo3W/iCS7dBaRGS2wDVXSeeHRU6ZDBI3+3n4QU5WY9GY4B0lBxK/s8I752SirItpkMe+eEU25PoyHIk4vRebFtDHzmIlRuA4H2jg1RiylRU0T7R9aDsLuZNraZRVPCNxKrw8coF4TPn0JK3l+cvFyy8Ov3ThE9RtpPmcaN+GPGS35axp6C50mupoSVpa//0A5KlZiHAwr1vYzbycm2lTqkd87ylq7pndnhGkdH8rnZPHB1vkn5n7Lnf9rE62+clEmuC82Vvq5kHg0aE+GM+FzzBWteTn+/3EMf05ZzUcKOkEB03yUzsyPS/iOfg/yEeKxU99UIZlkXpfiWh65EYAu1KDST0UNsTLwzef+qskAXvAVP2/1/6mJvieKKpaXYJkMCOxV/eCP1GeC+D5Z5kWgEq5g9WfaWIHR6O6cS4SsJDX/+dAq5qZF4UN0L8ubxDVBQKnvFj4Vz9+NYHyet9YaA+BmSHy4Ydnnbwc/XN4bUMW9Fzjy7gjtYajh3NJhnIHAVGIwO258sRbtgc9cQ260C1VW/c7V3G4QWsf1LyybdftEtkOIFh/IO2FqqDk5HLzX4LJ+ViyL/OjvnMWDT8JtGHY6wiSnIrUbGFP+1qmB/nPPBcsPz70Df5TatGPPtpz5ZANO4s6wUS7E6W0xkaFc0rwnudSjlL0s9UMMvQU/IonRP/BSNjzOJbq+zUen3Xh/whKmomjUwoV2loTr8idKp5J6GajKktyugpQqxq91FovLNq59sxg4GYOHy+j1d1YuQUZk+xQmXdwEqm+rL7PbSlBvkz9uo3huckKuH36Xk23J5KQIR1nUuzPIAy+RNxjjr7XTmOlZtC1ENRiuWDtydUpFHtuzu5d+TscBo3avQwMCdvnsbzkFI+qOpivJMIkQcYn6d4qtde/MSUZeDs4sLLG1SrMHkWSWt/AbxLou/dY3ZW4hpUoqmDFWQChdSDOUixVWHJGtAx7O2yBTtrGRVzTuHdGDD/nx9dPtwGCaVO2FkKFLnpgxARnoyb7nR5B6CyXhtY5vu9QlYWEewMv91nA7yF49P5846U5Gpq2RY68fdPidudkJl6hn9DCpPBKIgvPx7VayugfAz0WBnkOG0+ml4QzDSnDYMD055YzEyOFDOx4d1euISpLA9RKpCF8OhIg8BmW2WEguCRbpJYyRXQVypap7V0qCNE1Pbuq+qFBUq5JgxgAkQ+UN7kz4ingLsVbuHOOatSREmPX/NCc3lXg8wHtiPzA7u1n2MQ84SnBKxc4OysPVThjk+YqkCaNP02D+Q5Pmp9g5vXoimw+2WBoy38v3nQXQE1YtxdzH/FDKjhPdg2xSPSsfGaBfcTaCAFoJCZBmXdAR5Nv/QIAuoePmW2UGrPxTbMKOzCv9ajsZAyZUgKfrsGPPx+9LKL+z4KScJuZqkuVpuSWt7mySgUdOWpSol8QvFWwJtqxhwIf2Ua2YyhTijIURXAxUWpztRpjjtsGNrMEjBIEY9vaVWq6taI6kz0NhP1CGh1ZvhXjT4IZgFctHlGnHjRJQTifYDA4/eZM6RZnDQy7IHzRiVBXb41AKDi7SMr6Iy3m5Fetj7RI13JAaMhHCMAjHN0yT2o+f2prdopeB5HfaiDW0C6TEQreuE3FKJae+EVcN/MvM8sXaIqGhTIRzNiJ+3FlIZBCDrFreDPiw+2Jn8+YY922TMhckinSD4Rn7MCHOuPRmXkdcwUkweSOklY25D2gNimgfOot6F6Ma3sJF/owoMps7kCMksSeTV1egXeISKOrod8VLUek5I+ggwWDrpkpR2U5S/8KDUoklcDkuU6D3f47xUnNqVbZjgoIEOZYS/0pXih6JLY/7Sh+JoZE9XuhOykEeCsRZBC1que2K0C8J6IN/3inXXjJX1zuUa829TnloCYU7/EU2FEHLa4ZUefmafwYdfA0dhAwG5IJnly7isvV7RJfwBxUzUcbaputdRJ42Z6uU7M/IZ/03gbv+FITV42HTLpOauPHu0Re17DFeszFgaDIeK0TbZuiMULt7ike8sIXfzxDZF2IU7CGNE/JEChaPzaLqADDf45x/T9cgFrJDc++9R7/COnOPxPAzlqTprqH+afgdoaYi/rOoQkceKSm/biqJTDdrReIErNqaVOGm8wVDuhfhSxIC8e3bVecxpDbwrTAGDv8cj1CXe9BUst+AvwRMSAllhaNMT7dbghKMfyT7GwHE3GzMIg7MeB6Apv65NnyUVHBkvK9un+uiBb2u2qsnYgtxMBKdq2OMWITXXWw5IYjzvklsdBJrdpTky5QwnlxOPMaGIXK4vvJjqOyvAAKlHNGAZhsVCGTfRyVronXPr7cvAqxpH03br+i4qXrWmOOCWm7xY3QWXbNgVBPvXUQB8spSXT5XqLGjvaiYfNiCRgksbDuXdnhFOSGTtOHvXN8q1lRgRJkyuVVze59IW+gO++SReqPYU6ZcljEa1DUWe5A0Hm4USkuOq+N6fNTx1ZQZDntKgWFE7hZWWyE0GTEUa0dpwg0egvbCOh1FkdIylwqCfnzmJS6oMdU0L6jcDkGsv3zx6vLCGUMAfoFPDYQrta+89DJln6mU7wNuZGAFqh03tVqoT59RqEvIS+Bs5dXLALk0LaPxF+aQbk14HoDvUgvvlBEb1OPCZT9Y9MTRJX9PtOANqqBWg4yRrhtZYSFNoMriZacrQotYdSDcMeimmenUMwGgMDaeEUjQR/lMiIEzujgrZBNjt3JOu9Mm1YhAz2NLAlZU+L4I7GQ5ius8puSaBHRRpidq0/bHYVdCIYO3HzlmKYvpFGmnXIV4aDCfkVTo8JShLxycZp8klktVYy3mDsxWCLlyp3gYkwNgnYDP4VGCXV9VGWgIeBYh9byNzhHfOshGOtC9hXHg4yfZpCael7YoQA9xtc6nsFO58FUQRWqpKKyx2njDokY30Ml27E2wOCaQZkydhl4ctgVq1HtRvtp3KGcVx7MGcce+mtzHMi6NJeqccFr/t72Xnw9894v6C2dPI7nOqOZ6jqt/Gt9Dwg8mFTVJLeNsrNS9GllIyEWhB6GhaSNpDSFs/kRJMUmizw+ObAPyGSJb4mP7aTtjgXODQNiDsdVeuRCfev/Vpgu8WBVPgBIsP/gbX2YpZTGpp5zoqZnDe+DHHtqQ+ZTvDW70Twg1n2EH9Rp1Pok477ygUN4+FwrfdKKIws7RAo7pJgWLsyeE3+3qdy09USytlshDYBPRiMX+b7FuBTugYPSKHc4Kv5PLvh1nPOo54udm01nmQtatg2oQhnXHqGREPFKBw0sBEum9zPtkXyueFVIqIT7KpLv273aiDWLWAaLLjgno2kyjTnWAZGJSe116tX+av+kAaD006/8ywEGSBGaT01x/sNaWuZWS8hIEcm0RnzIF7N1fMlf49W0+4+DKMG7yWradj2ZK14emXbGh5o6XjTwV3Qbbq4l6EatwubWtaklBK2LEqVGQ4dHwEMg3DYDBEZFOivkh1vcrvqjZiQT+gTNjue8Mc4NLZYNMDBpe9DGTassS8fb9TUpFeEaLyKbbI6FJqqt6nejc4gmaOSgizhRruLhc2xvHMhC0Y5dtOzWg2sDh9O331yMeHCKih6TlvciKkirq/RpuOk4wf4RdrCj2Vs7cgcV9FQUd5kPg53Gzi6sdA1xBj38BGP0vycT0msBlCVlOrjLNao+pskZxrFng79/w4nMN7cXmM2vKk+iUFB1XXzgldQdYvl4TzUpa2a4la3ALRDnja3Dp9XHltzpotZIQnDKf/MbLHo2rZqmZ1YpO4GNlWN0rVOFpyDXfAeGl1hMBaALFruF8lCks1XPwHVYF7uZ3ZzcKffkKlvHpYxpSx7PL9BogTXYsV9f2VOdHvUDtr1iTQ/srjo1+ZlwhHypX7Dsld6vV3Rf8OtHl+GA4ZS1D7CSA41PFkxRi3s0h0vaFNFkHGuhskMPilElgUCJjEaYt1qJzqqd4baGWWTef18TjAfeHLTaf7gPnVxLrupr0fa1GRZSaX6+EPyXzQGkexN7YUAL758bSvZ6tLw0WtxquhJn5tFfzyVXrA8aC7NG7SrE1DONg1llkpKTFmVHd1mNEiT7WKWaNZNi9MzZqrJQYvO0Oy2bI2jYTQZv+fgrv/mpI0X57PBtHPbdpWOtm2BtTNeyY2ms6a5jt54tS6glntj/wrO33S89VA3+ScQZqVW9YeGAt5b0Z4fxlKD0ioIx8rKco+KKjSIJJ3Cp6dbNV+XuO1SK0sb5M1CjGxXdGybeFTnwrTSU0HOT11OTG17YifaTsEfddGBmEgs0hUTNUiDPQXsuwlNCJ7xW/E1XAhuj3pISu3nlLTOQ8c9rPKe2KrEw/IOboMby2o70NogeFi/645ame11RC7t8jY57l6y5ecfH5A+HJ+TWiS5uecJGtlBMWl/qpGDhF/tC25JsIbez9oCNeTZOonMS3INZgOh/blU6RYaWb4k9a3/LftUMRxmv6n1ukemigvsENsY8rr84F/ghBz+moFi5B2z90suFuqfGliH09LLP0vIbsGc/+l/A0cYSeheLtu79Q+QDL+xXdNW1XWGn9R56T3ILSmcxnwET7JvyQbMkq02KmvyHvdk9TFzv7/Rl9p9fO2q33DXzOzu1DgdkNrBeD8QgQOQkgKniDBN7N5KqULkZ4PUNw6Uk5ysu1OovoiIQQguURaGwkSx1nhqitzW80hjCdU0eBgh+pIr6QJqKiu2ITpHNDRPqqVllVPuHLjpGpLiEZUoIg1dA+gpib5WTkURhFZbEEZzK1M39mvT4Y6HgqfB8iQggAOPHumkZKhJqJ+NNzj2uo0ullg/i4PYqEQCEwlNJSwe5p6emwfCvhBr+YWHEPjzmTp5GNLFqhYdzzwUEJQ7o33MBZ6JsvtXfJ8PKqGOt+DhgOcEDhWeM0K4706oyvdxt7YKGH0pnnvqRPDdR1gcLvOBMMGKh/Zx+v984d9zQjoEi2ucQsJO4bE+iJHuY0a1kCkfpg5FqUpwRXGle86gNNgvpBG82Bptt2Uur5yH6LV8/VtsDl2TIUKQEpKp2VF6ntGGf+zCbal3RXYspN3TxO2mpR6XIbcN7oofxDJ/EQ8aHyLxGJtotmRT3BOMhrBwMRNpVmX7tKI7vgVkzKdMWsA59vuO+PGatfRbtSX3F5kJ1jB5Whl4yEH/IDdf/ly9NISIOBDs9QobIZT5zRwXD0WeudseE99fqzpQYeHL3izm1bObqFCSlmvPO7NCPwlUp7Z3LiUzSC5R49WjGFzDVwGGjSDWUFxkkcinCA9tVQWfAFq2lpT+4jypOoUOfEzxLc2g01evY4U75SVey3PIlyaYNL/sZoO2D+xD+fSpbwhzeAz71fgnyt8aQ7cQ0jhyJyoSOXRCjjEGOTtHpOtiMrkIirAs2S7Pex8jzxHAt44T1JeSNOsXfEHN6u2FngbOuSj/14erPjqxV0uUOiUQ+tAxUQkTTHYbROQMKVGKpmULzY8bSVFyTF1pKnBiIEEKNpTvJM424zAnLsLMjUTcAKWNEPCmBN96LYpc+z4CxYTCYOgf35zcCBlwve0A4x/psnU/g8imWF8MbmeTZpyByaxSqBWGLbKXJ7qkoL8L+/J6rzxTT7ikSjjgkWw2VDgZPng89aZXppekcued0o2WBxWHNqn7RXu4ylC1XphOT+QvY2iDeyJfm17qlKOYzm7BPkfpz8crD8TgLYEZiot/EejAc4E9zGwG+x+fMiIRsyKK+/Y0ORFr1KUC9TwXYjQFu+JILD2pKYm/n1eNbjb/XFrDArPJgzzpmrIp+qP1hArAgFHFnm/qpD56gpvAyjf2IzvKqRU+hVEdNcZ2OJ/FJYE74GLu1xkTXey2dl8FvlupIVnm6awah6uVL7E32WzBWIitDwXnzNGAj2Z1/c7Mdm8fd4I406zlMpV0xRd+WZwu6q73G83mYzUvRhJQHJwGfyoJt+xTFIQxi+yRJtSw1OZkCwathWMoh0bQTxcts8Joq5XOZjVR7581nXFmKjjl0bNrrCFm7h2ee/xy+w/0rF3x0QGpWHEgQihOqqvVisuW25fxBeUmmdvO0EhdjLOJlzZzk/QWJT6/7Q+BhwDA8Z7IdwpuzimJHa6iZsMgEGgP19mTGJH0B4AR/MkAtlSLZkbTrQKC0jU7coE5pcrXQSSCONv3BFVDIjwIH7ts8lhiXF53EK5uio4cpDHRdCFolKYq2LlNS99YRMBK4K7SO7ZZYai4ARpWr8z4m7BPcx0W3LflhL17H+BG48xqEdVjP3uVQ+2y1S1gnNENwma/7dsFQSnblfmphXU/tFEyleqrOVf4iAGmPusJOXjDgOozLyxPwMXykr1oX0ScrvFIQmF0C0fdl3EYJZ1/CFYkd2a4hVwL7UPA5GwPDvWCJARlvJ++UsSH1kRMGMf31o8yFpOeRICKX9I1sESmIAd5SrLR9LSZq6Y4yiLM0F0md5cbAdD+jrR7kmvYvALsDgnUDAeFYzPK7DJzz9AiGJ0CloTbMbRHt4OlThutBxayY3J07b3Ruz90HEooh+HdnlCOema47cYbY8n7AWp8fTuNxe2ZyBBNx+8g5HG4KdPZYpe0BalegfbuFzsR+cv4HlG15+VBA+RXvPUzXbm/u6SSjS/huwqF/dGp+BTg32c9bNWBUhUrtBqOZV3JdvQVFYwugd4JGpFnOrGmfAHjoUlbeR2qG9jxi7lS9DFrpnBFS8cxiyykHGubPet1XHo5fpVdPBr26LYIm2ykJ1S83v9RFv9Fkvt92gqfF3xoz2qJ1dquU6l7HGAmMMJah5KPIpabWzKqLgwRzmAQ+clC+bMrDYXz+AJFVBjDyMyMrfPS4aLHQvm0K6zWBnve7U2tNqb3U9TiZXdQ5EJb0iXbKCrqJ6tO/14EX/VH+aZsto3b24Mb/QlJUpezum84SkhfmSo3B/Y3MYa5VmaaCbRLbiEnmhLujZH3p/xjsYUXLZVNEZV2PMAA19vmKN0OstbWGMXIhuBqG7dXPlI3rmVI611b07IQQbZQvUXQHCR4KB7797JCyOicTQVNlTJVg/lCDO5+EebmZ3qCJwqcxm6ayRZsI36SnAtgs63YzT6fJIM4MiLhIIIvC7EaNszhMnrqOP7PJENV/qKq7AsYYmS74exBVhAw07fuVuyoDSjMPJ5Ebox5C3paeV2SGwbfyRC0ZZNjnTSBXZqpFRFaXOMEiWO6gFbZRTTVhBDZcwfV6YXUCryh5Z6oTjMUZSpGUJrKttPjYB/Wc3TCjiWVBr5DksgqRELLgNID/hYS1NGto6fT9I80msd7X2h6XqAZ7/Gs4sVHDIEe9jrRNK+hbXrSFgOgbdyiMy5JrPzsIPcYGYXa6L3rXA/SSh+O0zdMZF/PxhV11KnMQe/sAruvtH67Yn0qbF6HGETVGE0N01e5fPiDCWJW3V3fdIz5kUjo+9oigfiRbyTshO8m0zJzoyGFThpCSKyBGr8YJAtd7O4kt+Vzfx8fHGvkAc/pQhWVg+8sf9bL745HuKV0wjGugaDlLIkL98ZguwK67Fui8huDknM3aJghEp68mPTEuJtZEWKhHIoOmfMDrgKNAksY3B/poKn1pLHpwZ4lKGJHfnSOzVhKi1AvTz3khBpGewMu5QUHvD07vvdosn/RdCW9CRzJxrc2OoWA4XF+i6XtDsWt/2sdnPmigwCC813R+2LIbJAchAXv6K+jXNLIqOhEoyxnpJw59+Kg8tj7jp0dsJwj8+3w/J8NOZSlmxUoQA809Si0lZDN1GeQIrmBanY2/KKBzKOWyXePfrLE0rDMTPivsRu6HXm77SYC6OtSTiCccqVPraJMpHLcomlXVd6elL0Co+Er9Wu5brp30t8KTinC6fBDZUwcMB/RGABNo3q3gWM0QmBTwR/sYkNfbMd0P5t06OeTeG6V6WyR7GqjjDcwTLwSBdKZoN7Xqs9jfDt+goL9S+IWS+BO+AqlIrgc4XKqXrhmQsgVJs5fRrc4JEtaxjUqIJMFqlarKSHpC3SfP2h29u99VpFbMukAUu+vSz7W1YtQaUvdJr5pybFCIQ26Uk0a/YEZ9AlevnkqE7aXb1UFrK0cRWPBeO2fl4j2SMvqFqqrpwl4kWMGlalunxLFs9vJtwvf84nthvsutAx20lmLjvKr/DoqyAlmUQ61ufz7q07JAbn5tdmvAO2ivtTBtS9xTaz4y+E6D+8fZVhEoVzcQazdzPLhAyq90JHmbuPOH8GEXaKwNRdXjo9PM3Stb2spHIK7V7TCZjIjbtMP8+k1ToUu1j1CV/iaSjz/E/wgnpng/FBjyJWFYlDtLVvrivrvgjTbqz50EDaj+o6VjILs3YhewQ09WcYedny6OCZ3iiHsCIwcQnn1W1VURO+wcn9xeXMnT+Kd5wdrqXmXmbfmieRidalVaLiVgmo3LCFcOjpKGbscx5AHFtCUKZRoYTWV3/4CAqQBITe3xPaWOSLxoW9UTQZicnPlNUSh44NKrtF10biem2Aoe4DyoF7MonN+u7BGRlV9sFH/d5vxhgsSDbXRIj2ngeii7Qu8dXhPzSjxLV0aCqtJmFjgFZmOKOfLj0pYBytwh378Dbdt8NvUJWI/myaIsBQSaBJpLKSI+EHYrkvyGU76jcSPJ04WRSGMspq5AKdh5wt8EE+OwWv9hrtnPd3cxK2cwgOzFNA6cI4014mj01OvckegkFaNgm0OhQXm6tHYkBsXKTofU4jKI800/eF552wJKDkXOOFYf3qSDQ1EzhMxafjgdvZQG1O4PWFhue0a3iRnZrZE3PfQNr/WA35jVJ3yi5aRG6iErOKODbEF4HTsBOW5+0rvbSSufxDnIprg1vW8liYgNrB2UpMeRwxjxvOvWGgJ9kf2q27tDzWQgbjdc4KQsslVKcvqTlvv9Nvxwte2FNQBBFyj9nLiGDNO/eJ96+gA/Nn2Qi2Yb4qJY5aYoba+gsHmlgoGLca0YL0uzDPIrJkwhJnm54//UaYe2rET0GFkZZ0Q02e72hWqcqElci3pw2MBR741Noh/RQBXQFJd8JX0zm+CxmmT57Bbdz+fXpBXyHrNKwBMTqW0XP3X9IPUPJSgqAL4iPmUJrgFDJis8JxJpYmESftghE9CgVPup5lgCxs++fiOt6SL5BFNphnongKxLhbRXcBMBuvGDleLWGEfmWCryin1KDv/htLhseBYWvLJPAWS9lEada0gn6c2YNcxI3xvatyO9ofG78bqtXZ7XR4zet/bP3fTYUJkkHNgfUidw0PdTaAlfFy/PchoFfpvthaJLBkVjYG07MxKIxzfV1YDVW1FOZJfRNGbSw1VdVzSyRnrhwHavSzfjStgWgio8Ts4DGwDmSTNLAbyminbhanOlKs8FuneHpx3eq17s5OQ0EbGEDeHt6Tuo9Pf0lsEN+gs0LOAxFOWdwvl5Jp471qbe2rFtBx7DOYmy+29WIYt/cCdYkiwc9vR607sDnNIw9AZzEVt6UOyafxHTqRbkjyaNgtyqsf2ZY0KeFYHHWtKkU2JDlPiysPJgP2Q0NktanX5BhTYWz/JxN2iZY28txPQnhZqkPO8TPhrAmrQVJLuB0hOWasFA/HpYcR1QQ7UM5OZLAATDzOII28Zsp/jPkwdHzr+6e0euMrPkcyVjmF+5vTCGUxYAEq2iyoKnUbcKSzCAlTOd3XsJGhlwcMWSazlCS7rc27c26+DT5UJPKCe9e7qhKpmQurb2BswLYOgsxfNHLLBPZnyDxnlJYpMOk8z7RKf0zZu6Q7BvVx3ZR8g6rySYuVifC0E62siAZY2gvvWCM+U2wjWGfjAHcdJ7jXd4arVg3h2n7PhrD8KxJIVyAS1D3BobpysQGeeOxHlXZvsA0szm9yfD2JfAKMZBB0nSIIDimWDc/wSHGnErzybhKwbS3X8YbFU7Wqi2Kq5RNWONS9gJpeA3nuL6twmsumuBoudk1tF4KxbyJs0285F5zBhMA1DUpHoSDrQ3aiAoNtALeQMyuXKvbj5zkO/gNyu4SMPgnmC0qapVbBFu860/2weGAybUSpo8qPspKfaHC6sbPMacYAUegxWgPUBAdN3Ol+xZAw7iORLszHgdL6MJKfd1nowbY3F+d4VQ1BPUQd++6t5ygjCENPZr2YA0J5tVFtDkg7BZSgzn7kx8mfo4WWLoS0GQNMjvLUxvisNA2cy2ioWeiUGdnR3HXq1fibdnwwrp8PfznKxpP5poOQckC+fFBwqwHeIFz3HQzPbuSRwAGkqA0I5C6+GNXQDfonb+oAfIOTLGlXdq00FWpGTmSNOivrY94bP+Rm5c+6h7SMGjra/P//GIcMlvN3FMc7z2d7LUE28kHs4zKHk0aqDw0Oh2Y94rywu/H7M8s8h03qq22jczvnYwLla++9OaKjlz2g/74JLrcQcu3U8jwxS5a8mlUibCX8avg6Hrp1q62QTAxLlJsPiUhU37GM4mheHG0ceOHWHSrY3YjXZ8I2hYrym5jXhKQyDBm9rcWXz2xh67MVHTIeoT3t+EmnDzEvYiz+XGVHsaqW9KBNoea/ogUx7KeCm61JqZsTjvRtc61ZWceje5qJWgfcwjBWWZkAxlmbtzjkLFDyNhCLbXB9GM9higpDCyR+a/6mVYj4iAeQKGwPntK8Ny5SQsKbMNUN4jHjpjSZtsDS+wgYwhRthqr33tMPRcyns+kpazAoowKTrrqi0S3bCl9yyVmhzwCuoK9+sY6ObpYG7Byv05kaAGs0/T+MesRtEBcVpndZg3Dj6/PUlcKnkEnBlpaOxN02Ml+abclWQuNwA9Wxzgh5SKgFKDuwvzhAsNYw84+OXUzigGtorrDV9XbWttx3zU6g5YzvAVpbOwLhILRJ/R4OsC9X/DWEjaqEF1sLCCcit1HYcfhL++p0U4LfiEG5wPzIaaPfOxjyRKewIWWDjg/s77dWOSJ3qNAykVkvLrfG86zrLZ1NhxhOMCT8LF6Zqvt5h/ttF6z7OrVLg0v/ifJbz/tkFrCK5llkvmzePG/xjM412bo5BBATThEwI2qrT0Mlr696+PbTqqovVdtnTGn5CxMz5XSTQbcHp8ydnHO98MCMetR9Q+VDBNberTDJ5JkI3taH7IpD2btXf5druGluGEp+/t2lSlw2TCAclHcitLNWZsFWlLzQIoUpjIY7MxgnQmXaztnZT1k1DHu0CgyPMHFReGj3jCo5c92YYdhHbNT5nQWAO7arV0BGbV9un6ikm1Ll32uYCaCCC9YP60szclSbSRHSNbWYO4M0o9z9KnUvEujwF+9Pb23R93tujcUraCnL5WjhiC9CcSQG9mrcSINJHzQ4CoRM+pe4DXIZSivEtrJhrdlPhHTy7JjjyvKZO3s9s8xlS6YDpahuI830D6d5xWq5fltnltEDEI+3M1t/FyE1m0Jl/pWDhxYa4KxIZjUIeEbgpRQZSFD5lnSi/nxiIw1Z/8YEQ7Tj1vFDz3+qTFmnfcKP8mM3zG+8wQOxgbhW5IR/c5Pi/gpm9Ro2Gnrt3hWzWS3csY9mUrXGCKa7o+QdWXdQPMCKWd/BR/TvMt5VcZ+ZuUdWIkZnZ97JC9NCssajm3CqTCle6zs+CSWUSTtZI3XXQDC2pImG6bRSmioGvpJk3STyt3aAiRt3fMykOYY6Ok/QCVUFOr0x4e8YUk/3G3uEUmJPqgiIP5hStLwRpG1aqrQCeG9FFm5HypY6JvlTpzaUOVZO9bEK+xLXvMTYM9tUsyUq6vpt8dSxaEuzu+R/ZB6Pmp2iU8Bj1ZAQDIV5irTSmvBaLvJuxy4kxbUqrdoEiKbFyIk57+BzMp/fXb5qEPAD9WUgOT5V4X9gHt6uAl2xa4PTO8eNdtCbLgR+NSb1ws/HTtCMZRzlS2SVuS/Nds60Qk7x3rqFonx0NV+NT/8nnntGu3EHQsFErZ0QLlNzeYt/9/HC05jEeI6RjGhKJdLeEc06nw3ld0LMn5ZXEOY1KgpiItV1kFH1MdobGXy0VhCLmtvY4Bkd3tZoszfyCP2s2k9yL812S2l1i/pqLQJf2dxdDa1ekXoACDgd4KK17GZuYBvmMyBoKUN01KO4jQ3U+3j7ov8OHw8KwfJrkCas26PG5dUObMgMrbg/3M4srUGYqLPpcA1q6wFG5ssS9gCn6tT8x8kkyrNdQZUot74ZRGc7rITKA+HjnP4XSI+Yjs7Z09NYko5TAJH1ToxAw2IjX0cIOcI+U8jpnQAM3banFxchvxbPR2fTTVdK6uWpeOw4HrSfQCZLf9wfPZXbB5q2dDVdXbDQZZXSuWjgfoBVtUhMZFt3SlddsnjcqlAgeevNUovkN9/N2w6CyJEFbZHMHF4mlwwdUF9KXmmPX7c8S7q9THYTf2/vv4QKhSv0cAa1aKoWiejs7a92S3IYODP5XYTKFJ+rOlFd6KmvIzdGklrtDPeeDP2fnS6I6vnl0remlo9lMxyJVT03G49pVKtBzQq+mx4w6oUWTxydvWEXE/TFCT1YGs+xCgK50GzkOsdDsSddCKJ0bbHD2/+Rsbr0ZZ9oZlrKFbOSGd7GimeN0XElMRLOo0nOoao0sdJJ72UB9gEV2TArpH6exD+x0A6HgzS9hH5dVtZnw4VmU0y58kVjk6InCntHupl5Qr3OfcgRc7tb1whYg0GS8nIT1CMx1wMoTFjT6IabDU+t/D+8aFlvwyOR846ruEPd0KfrFVdjJlzlaySdlfpBI3MyVJ4Jsx3rSgklXyaabddZ6npN+086rP/PpTJoXfBMav1z0iDK83sTj9ZkXZSaF2GKYxNzL30b5fe+HU+eYrN1gWf+QT9zjYkPGAHnNzQw1DI80X6YFVrOnK8Nhx5DFCV/10Xsg/AelYNuYAbPwj1H0ensqgsDqA5ewZpId/Be3sdKj920bIzzdoUB3vl7YIbW9otvYBzipOc+/IgmjV22xEfByxQ9rftQ8ZInmUgeyWAeyKlTe0T0Da4p2rjpfEfLsdIbh3XpXiBxZ2ldli6VfHXn2WADHDfiwsnqf0UoIBgCszGzokTjk3USOoko34vfoZjc+qNi7PEvGexthh+kwcaHix+4FpjWa+vwgp8+0cqV/rNG6flpBPC2K9ceBaE9x8Sltf7/5eviTJll33w4i60ZO5iC8HILC5LKZEut3WBjU0KpXyGaQ9u0GxShqZofsRwKaIZ0PdB442Eejcn5Oz1jNHcIWQG7pCKgoIq88c+j67fiQ8HlH/WCSv19i1Ww1WO3/B6Ge4GX0IrUQYIA1ul4j+BWyKGaTF36DrtrBIUQGTgmvc9mHFCcdiZsThwoLoR4GrVQKy7tkGcES2nsLLOiQUb8MXfp0Jo0dlD7pkPpSE1rT8LGjTC/wNzaTnCXSkBvsGo2xOAYVDzBrvcI4RWhVMwDuN0vTcV1ndo9riUlikM9leE2rmbc3NH33m28fxOaQmxbP+LiwD6RvFIe+nIJDl/ic++xOp2QSncQMoyYxLd/2uroK+OLiiI/4DVlnC6VzlaYoYhgVvy9DGhUUWwqYhA+ka8EdhKXdAQxsCzlg3fMJ1N6uWxI1jd/JAPrjygEiTDS63hNYuM6mHp4CqTAcv03i8aOxUsPZnHeip1JtwPkWaKco6AoQ8I2yBYOjE6JyaUt30XtkxwqDuYM7HyBtm9JkXUL1994PEsek/4/qVI0a211pUBuU76zio6SYH+QOgAqwc+dj/Kc3DJa93GuO1wwVKoOSW/MHH7zd8mpOAc+/LZZsWJMgYO5SVKsnaOTdwGKD/2aggK19Qa2inpBAmdz00baHTZfHiJVcfrRzp4HjVZOYKp6xZ2zcZS4OIfMx1gcKpsfSzICGhckykjiJCXsaYHLnWeGcoZhzCJGqizDXl1ScsifIqQtLcv7YXLsOG0OQLNCyoqWaBQrB2Wq1do08E5uT1oGbLEG7rZipYEttDkudPz0tUHdkMeZQwXG67qudphBYmuLl0iK1zGn86hcIHDkK+XEiYN37tMrqMU9oOABHFDJSyItE1ulCve1SXk73BpsmVYEmQnrYstGl7yhC5bxFhHCfBIKOgOAxwAIWuF5u5pOFbsQaIs2jgN24G+GgNrLpI1NOEid4VV5q5hoFcmCVlZIvMVyiNQBxejMn/zOsjBDdrUUzZxWqJ/cptYQVHAhHt203BycbKS9D/fvt8rtigcMH3zgL7epbPqnRsKc4cKZ+m6E34riTsoOTnUG1wAZvZgwb6t5WIg60Pd3jVJdQRn+uG3+G8tGgxOXp6dfgNuin3baBZaGsJDekOvsDNbxBaiwyKiMh4MtqtaQ26WEglnMwn/T1lx0tpUvIECPh6Z8SwMfrRnhrCmVr3RzuWGRI2VAprcTrEVw6cWTZ1G42PXFNtypWqprh5X10mK3PXYjrpB1dnvWLKNU9u15Su9rfoXgvGHeqentHNuQrbzWPpGnFGcJedAMw2njPbh72ktkUesHDuZ44TrTSTPUcwD30qSGnb4RmyXGF4tWzopHAQLTYx6TbJ0EBVASjKKHYz7a0gWz2SDOvUbcpsVA1J2JPJO6ikU9r3pzgb+5BJY20gP2QJ2dzU/Gg5jk8WI5KbGUgclfIIdVqRORjJZDz73UTHBXqBaQj73jJ6lRNWjfSMeJBYmQL1IeI/+Vj2myf3zgpt8cEdsIm9K2RkdIVV1CwjjizWYE3I9lH7SQWIBcscQhjv0jG64IOWZCJX9LOsvMgiIb4LAvF72Kh4g539SaMfEnOi1y/bVOJD7tvkju2ayrM2il1yp1BsD2EotyR6ir/fbAEf2fc0KHjpxemhyFXEQ7H1UP0bjximaZgHArNru2QJFQWkyy7dZVkFDvbeRzLg/Uckk8sYaZghTkepzh5oxT+NTvHh+ub01p0ukXMtg4k8v0UOHrEAEhox+bp1BZZ2mJB2nUdolfEa9h4kZQ8HadHaZ7tEDexL2MU4AI5i111rKfkhV/jUh+VZAUzkXqTXAN+QGyIO96blGC2Oc+q0OK3wj6CiK3sZH9BN/ASpk9WwPhdU5pcbvUQISLX24nSjy6IQ5jJwV/IXhzctOmWjOpcIr0R1W0q17dydxAmM/Dause/c9ifdU/iLkz5kQISNzL0bdGtPKiGKGLiTTluT1n88+kGB5Owxcj+y8Lg4t7mzKVR+a6FlAufEYATvxM/ieqE/cUh333hwO16DPsOJ1vIqeS8wOCMbTwTJ+0M/LXh0FuUsSizexvzt4ztThMWthLSbBTDjznohklWk8+8mYcigduEnK45vYCCrkhz+VrBc5ByUGqjATxcCJbzOr7n4xhOmazvUAN3r7AKLwdsNP0e1XYDKFjhTXB9Ggk5ofnNt/LSl6P/ggmlowEc4MN+ElRbcfDMN1n6PI4+tdWnjnsd8GlQRZXzm/FZ4j9nSMj3dI9dwZhxtjcLfWZNCza/kk+SSiWDwA4VjsSqTXBq0y50ZyqDF4c1c+lLtj9eIS9TYqZxHHTf3Rr9N6S4VPb7IfP4VICH8SKVui2Tg9hoxREJGhj+1eJEU2MT7J5QjLoJtU/fLbXVXv+GDU5bE6t54WdxrM9EfkwI7F5ZwBgrpCRSRksZvfE8j3VRr4LPLXAnPQA63ZuLUJWpZJnKpnbABWJGs/XVIMbnIn9PP7+DGam9GoGUnZpX37+DTi2otQiC2NAjnOBDZJp4tXCqZ2ovDjia4J1wetVqY0wZhlTNRrUs7IgspAHG+S/28ARQlh7bsSQzUOP42ICwoNRn8xEL3uaszej2hC6ffZnLTNg/+22J6/IOVLM5+hpE6oJvvAp1H2FvYox7VxmtClTPZZNqMO7hjNjyH4gu8So+hyp/3ejTRRmh/0HERHSSbMjRNPYzxu1YBbPSLdqcMQEj7KYEuhYPFXdyYFLJWQcSqT4+EQ8vB16n4h2PEnhf37iHfoqJ+bqHa5watPPZVhierRIpwho693kYcKPchzETJQslwmr7bpdTGzzv64BA2myyuwYdYcEH1NAS6fDiVQxKQRKFQm4UZc9gQnJl/zDrJRhAAz36rYMvyBqr0ugduA//r7b+eNrLoUDmAvFRU9mv+RA8PWqD2QSGrp9+pTno1VjwplC6uD6nFDvTDdySL+w1hYOho7UroH0rf2kyawh27QO9e7Rf6OHFQ9KHN6uqVeKL+2bQPSZXDu3cvwZiXDPw2xpJoy8yGn5y9+BrJDkNhhx5v353PQlhP9lysPTSPm7egTK0JNhwMJHJ52VYOg7zdovKAbMHV8fGHbHki2QK6LLANeKBK0pOazI83N+DHcKGpIsrx9NojUf6rFAl6r/Qw9BLoIB4AWRBezZQm8/BQwrR31nrDxQBu2Je+SNmtfapxytbXEl0HsgcHf80gGjiT1t1lCTX6oo2s9YnwDhf9s1Enc/gGTu0fd5E1m2XoHale/dwYnXOWlblX7zTjq6h/rrKeiXq3yIjO6thwhNuSKygNEKHOElylRgcn/W9UQ3OYK6N/GVzbCxwGgIOO3cokbcI0CgD/Db2sVvlFELZY9/ydKmKbtAYUFDYOb/Z7fZYFx/Mnyo2LFWI145gihfT5h57iT3DZrqP+SqsiXLgDYSDPYAwCKq22Jk8X8UqPa7neFyW6DuExoU1NdZbcFApWlpTjRqQtbat3HyKXgVLfCGBnRXpa0IIuwB+Q5dqYXllJko5+50G2dgVDk69k/ZD7W/V19QzEQfaVwISaYJvneEwnEkZZWw31gVLKLTY4ncxVZr8T/Fd1qS5B74u2VYIpAA3tOsTfjqVzzRDhKCsqs0TEh1tbnPIuEVjRhab3r8THd7gJoF8DmNA4D3CBaaT38pzMctt6ODv0nBfqtn73ZebNALo4EuEl0+sRRSDOFEvcPrM05JlCo95jzAATk/Ap0/uC+ohk7hOMrwKFb+n/gvsfSysuHEuCP6Qjc3PZrmdIRq0f+COSihdfVISTnF7zg+j0l3Lx1pPDXcrRaLE3HRrwQt6qkQ+mWIy8UFqCUfkk91a/DyvXJwLD+RYmj4W1jGOl5vWzYiGn+EXSxyj8TFGZdzVZCFv++UtmKp6JB7G+ydFFiZ/epGVx3j27Th8E8xZHo64W+MNLnVyr5ir4Y4lkU+wqP90R5xV9UXroz4ABb0gran3eNIgm9M+4JBSc3NGHalyAwzG5uG0V4+cE0+9GtL0NnbF5NXNrdv+fwc5uY0VR412M4qBQTloZCx3Dg3Ium39WAQ1odjaNPZRYuNe5+iX4SjGaj1axn4majPDy7F/nv7amauFNyhFEqA0OXkyWHoeHUjhdr7/CKiq0td+gN/bR9cOTnvz/pnjkEgeYKXCrPGODp5Ay4I8NhI1RDfOXIQGnweQd5rP79StYFABD5zYQGcUXn4UUOd1Y3sF8mfHYhBt/1MMCkh48OjLUxrJ9Xk6r4o5/a15hYEW1rcIhWQl0Ja2o9UcfvOSIvfnNAv4RybhFSni8pnatCjqIqNw4d68tfVRlbIL79VWgMYVTMJ66HEMoXDpLVfEoaR3WiqJu6YHiAQanI8N9x8ozD7XbWynZI+gRRkyktNdHSRzdVA6Y7FZQgR+wPXCco1ie5KXoqISJ7ax+TkkeZSWRt4GjKgMR3lqFsaUKxbCupgRySHIPxtaAehrqx7Q59wvpTfOEp9acf7ko7t+vSdXK/ku5sDtwF93GI4aRFDEoR3LJSs/ICnH5eMTSWRUnwr+Anqn8NX4dY6MCnpfzU3UTpyz+/leI33oP96NvUBEherOlHdcM7uSUnTxQenhMU6Q0GLv2vwcCgWUzUzsz0GNkObodEBm6XQlfK10OcvmvHRKbuHIOjYTgTo5+mLUOwZfxzUy/AedQEh16nb2UxTqFQeymApfuWHbZL2DTW48hg3CycR8l+YzzvFIRJ3veBhFxEMh8qxOfoMuNIhUOKw30o/fVd7tFAJRkdG7VgYhWPpTrqy3fa7gHTPxzCmHGnZhX/PArdYlf/VQclgqIYqi8sWbwxkAavHJRFfgWcHr09WfHNzWNE5j89fOPefeUE9Mflt13G3deoP4CVNZq1xjrsnfeCnsbouxzBJQc+n0nnVG9whU3y3U/Hz4jD+Dz5foEHhdxMi2P6KthQgVQZyuuRKBHFruc87N/Nki/cG6YMJHNoSFFbI0QWZuGbycHtH9mOfI3KvgKUxpa4KEncTvdTXsGcbADHlTZ0g4v1HvmtcAFINYYUsjj7Ns0usrDTn4xvq7LSvMcDNw5dGR9tsgqDK1SxiCBHkC8mHxWrx022ZefLBEkjyZvZA4dz5SbCTrgOaJz3mMabEqv27+unFjqDo7LfupRHnBzjQbhYZ1vc7MrnxJkKavtfTdVGlTiGulRG00evk7SHt9D6A/S44QoVKg+75BQmYYphUwzJ5P44afgTP67lgOxSjtVCGaLYetv8d8716xNZ/PFNOfbLlHCqfVOBVw8Yc1Xpws3V8FJhRN0Ubz+MRjwLS5QVGjhiGMErqVPW1SSG24UJXqA3sF/s+VEzfxoBiamkYZgLzD2W6nntKTlEWidD66761J/2ILct52IkiZvghHHWxhA0Ghw36Fiju7LgV791ApPVMJoSIM+nOGAW696dl5r4LKWrt359kiciLnlmyfE/cMbEsutpTYj9K8XiqHRECuaTcS6EOc28ckkPDlosN49ncUiHlJlR6r19bIfeLX3IP/DDzR2qyODCidcVPNBrQWO9ssOwzFWYxhk9PQm76HeR/sIG5No25Tj/KPiu+XEScC1JfXmoZjcy5glMQztmvbQRmCMGqVgNPyH+QGrVR5FnQftDutkSMnvGD/Sthg9NKNCgaB7muRlDE2N33vy0bYjP5p4Mvkycy6sDDJbvDuVLRcaZvgzmtleGUk2Wy89aG28KkA3tSnIBOPsjfNsG0l1xY0nSB4FkMiEqbm1WNmUQnJbozsGOLvn1+mRYLn/T5GiozhZky2keFaFfYSIRpOj3c9EEOicB3DS1Iigc0laaCAwMgyCe/yJdf1gTkglWqcHKYWOPZVUwTJ1XUQF8ehvhVJzkCEQzSenA2uLZe5ZDUuCmh2ie3fSsC6+QJXK1SvJJDn0vvXt8usf/5hoTvlruh0I8tXsT8RBn+icocqFTb9pCepXHO76c5I5Ntk9evE1c6OOVlYUWsYgdhTRLNESonMqESkuXVpiOhIpC7WGJ4yBR6RxyqJix1k7OKS1TTOeWZKIcgXRyueroxagT1f4yf6onqtsSztTH20tr26ISA6g4cA+BjEA06zBzLULZWNxhY616f7iViHmLIqoITWthMGsAx48t0QFoNaT3gD2avqI8sIStUK5IVWyj4R1QhmnykX6HrBjM5yj7+a91aQ31711F5t1EeYk2q1JNC/xTqsumgCVLh9lyuckUWPPW3Xa6He8/ymuPBjF/cRfvVH/jnvxIMcJNwUrqUtPMR3gJN9TcnQAs2bi4iaC7EgarPvrL6gc/FgwNkaO9KHeMKLPHm3BguyfG8VappydFHSx/wZz8QWTbkogUEcgi2yvjXLER38HjiCYLP3Tj8HFwmlnqvBbhS7l1HBfy7FCRX2+AJsCWs6SpAnB+/S7zwYFX3wvpgdDA7LqR3JPOQvHOo14s+Upk8vYpbADSPDF5VAWw6HXv7yjl2IL/pOWstcY8A+rJ07WaRL7aaW5LTjRVwqYN7fMDKn+EWeow9cJp2quzu3VyvSGX1PNeHXsv4+TTkxAw6QRuil5Na8rf5iW0PMZzucNo8EJmGM4PDZMF8aQYXBqBoWl1u1YMQAyngYJuAot9wX/3Nv7xtJESbi8DYunQr+fhRE4c+CGitu6c3CiKrOCMwn0MoNVriJ/2GDkNhS8qZGWZ796Zi3yxhDBKaf5v7HMetCdzx1+TxHjs9HKdM4jAkC/YIFwlUNOm2vU7B783cvgwPtotyTHeZ6EoNnxu2UETxjvPI8IQz6G9jo/KNRhH/0fuazfdLl4bVh5gWR0w8tSfnF01lIqHoxL2lQfq7Gi2nCPajtB3kqM9M3J83j6di0W8dIOrA+3VYfBj9UmpUtd7NLk1Wfobn5+d2wgOHw2Lmv4aeuhmQEyNQ9M+VeAnW3FeGf0ecE+GZliD6J3ztVzqQlLo1pimqts9dN26n7Ksl1K9FvwS4RFPxH6gkHCNEFeP2jrXZJr+YE2OwBBxiMTQR25VVibqd57gwSuj04Bd/ivAayUssArcREKwxIU3eYJ9oRlUzr+sbI3QuiEb/9y8POEeHWcnsmGhbCx/qS+t1kiQVYnC0uPeJTFhEZTB0dSkhLBiyJGG40aW9ELHYAXHfDPeqMyB8UuntWowCaEBgJV6HTHrFYjB/0EfQ1PWVxyw8gI9VlzmyPHCNTcwkYFT7EQ/ac0UV8QCmYQhmEP/Q4b1C5EeQtDNIjczG0GzErcWlDcDLk9OBWpt80P+wL4T8qmzuwKOEA9Z4IQ5TkzE6zSaHRNxU8ZRaD0iMZ+6X1Y6cmga39EUgnw5izQCRc7FvWvH1BlCSLQKwQkl2GIqPIJlhhTvmKggI6VN3Yr32C9Z9ry81Q0EY6EgcG0EC+t/BKBairH+JxBRk9IGnqXXU+LCEjtOPxeaZIakdj0G+cmWjSIreC3DMDzes5mXELAN9Iz7B6YJ1wSFYlbNx2KE2DnLPZR1hoZKJG7P8SPxEVs8tlh5/50uo6iZ8dq+xnhTTQlYxPpgG/xHy5SdnDusiEhakrtU6ovVNH7we7w7CNtUk+pvdLu13PipyoxgB3X/aQQNPTEUHsKi9uj49dTfEc7YbthpdXfsCcc4Ls8glDl6aiYsjEOMhIdgD0wQJJVZmcRSMIR5BDSB9Jib8E9rD2WNW5yYc8d6FhqBklc8Jq8M8h4cboQxV5CVnszUVHTixFx07y7I3/kXO+uoTdyk+8aKc8VBLloP+DfEAuYuxUhe/PHsShCISvtMnQGcumBe1UbwtZEEAdiaMSmyqMTGJDfPiXfjYl8ua4+xzMGvgcDrOXXRwy2+5UnvKBejBIuZ7NGjHG/PMRVhaTNbkl7FWbDzQxSSahoXb231m2hjIFhPaXb24DJ+pk5N93541CeFaPgoJsV+G3Q1FHY89TWgL3zJz+c4bsRMnIBvUbM0pDHSN+w8BXGKnz6471u4vz+gVIO2B/mLfLxCOjvaS5CsFCopMbDbAlbcIUGtIh5vSYYxpLfY7AeJwRZAB8Bt0sPYAArL2acx2htEktfpFvleSs/9JGZxGin3ZfB/brp2SBxmQL1JPacTYOTFLsBybda1HNHBsK/T6i15HolAPsbDN1SKgwJMYwdyhgSoUB4wIzGUZn9PtATqAyCZDTxo+uZ/6mPOAAk0FGRNRbzAxzGkpp5jftr69KAyqwviFPmSe+Y4OGPoM7HwuVTntYCJBq1wwulhC19510ctr2ynUJwXLo0o+XOMzHZrpChINVxKS5jOeAhusq0O6v0TwbCPacl60gWLplrJbf9T+l1YRUxbzASu0KZCgj/0AOQ8G7ndMh03MqqH80doA7b3HxF+TWHe0YtnuzoCeQHCs/IGB9ObrJPjX+h8P5t2+6BrFu+GNouzjR5FVQhpzdJcQYTpAknMNOc5ii1GSfJTDaALBUsyTRptErEUAE9JkBsTezv+sXAPdmGL7dESojlSagWJ2y62QuMUNvkcJ1Bh06vdK5IRwd59YJ8LBAeM5re80/bsesby5PY/uU7WIoUvshLxBa4m0qq6p1p7PeX9od3DhiZflF3hyAl9aG0VYQ0jddppDA0sYuuzSVvUz0sXFZprs1B9n78wwN4HzLDoN+64FuStZLHPNF2PUjBTrW1Vr5K48dzdL2fq/ZYqzA5ZzMMQwNviCl0tGkT5I3e25LVdXLHMRjrk2qZkTiQYTzoKmYaxcHj4YLjO0Lk/MgHpwnRi3aaozXZ0Sn40QMjeQtURYkBQnme/beW1DqPQl7pK8uUKj1WhsmxL2iOJDb4v9/5ZbWYQkol/7Pk5NL9/o4Aax7vsmB0CgxSvZS7FI/RfP8Uas2DkVo+mEHlwSQI6C5TUgT10+P2M623fCg2OqXAus2evWJRY5kB2/h284B9Yo7jCUGYWdaB0k0WjvfxCBmFMx0qRCZRt8nit27zK2s1xczTSKqWZEa2XRxSsgybEonqR8+ionDxBOnKX5WpsQUVlq3TjV+WT7dSq1hf852W7rIw5ryhuZDaWQK7zBYfZUKgjVCetppcmieLtNZvYLTG3kLIGUuyAnoKfMMC91Fa0QrAbQTAX/Puls7g3iZCdexMt8cI3K9LsZ6GMhxREIJYlfG77HO/1xI8zOz3J04nJND0GYls42FkTgmo/Z263z+5kJUaTLMi2bWDycFW+7bb4CTRJ01RL5Ns7suUxwyH7n0c3xHCu3Y6LhgY6z2VQBzYxoNZtca57wbNfxlevkUwZeiaPzI0kKkWRC0aazsFTPnFk3ykZRuGcbtRNrEiXL6qPRpff7jB29eDqOfMoIL6lCqlGXUQm6/wF016fV8igR3+NRVUbUc5NWS0CmH8V/52wMSYCoZw9fIW9Ikuf+vpFgxU8uTi9sVIh+87v/iYMu98bZW+0MvNE8LZ1ulvv4TBShRFyBq7WlAWDjQP1ccBojBQjtRQe96dAx6NNKc/fle3LUZy1t/3RE5ZR98OxnkqCzhNqf0pIWf8YQ0FWB/wtOMGxpvwyERJrBR+kR9LKj1RcOz0+iG0PXXsA087hsKQKnD7PxS1Z2CdVQuSp6ItNMhLd588sOIeOyyH39TgPZ8lrB2BwTpjQaY6Ix6xnQWnSZnN9V0S0SNrD3TIMrfr6EzSafi687zAyHECf6KwlnlBbmBMGYHnAU0jjR4fSVnpeHe//ziexg6wW7jBWIIfo9cd1H4vTp3G4VbxmC5I7YOA3MMwJUqrQXZkfoeJ1o+dnQ+COWKkRCcsP9aYaAY2Z2bwbtel3Hs4IO78AgaVYwO6D/abHpjOHN7Up+WbDZBcR2BGJ6SoAWSh2qYGLLDzwUaAXpPWu5yW0bLW9RLdKx/oPUOEoDqO+BfrDBU32vLewI04Rdwk8c5ayTse4asbaAOG4AONFPT//7NkJTxufpuoDbMdPmboUr/FhbBFvI9j2rwJFiPNj2E+88qafnPFSpXXR4pMPNhw4pxcBbZQV1s5Wy/DKbpT8+dAtF8EwLOmWh8dmZZAW4BHm7LjfkUioEr8gdriMLBNRCgWxo59jUr9J/fYdXMnu4k67PON+bmF35IQT3WVJ4DNwB8okXRd1gJcK9FKnFAtDdXg3cLyMbmk/rQ8KAs5F/wO3xGJfLJ7581v/kb89oOFk7t4isiDFokZItbd190mEns4gdnMAewLOk+IebRJeGePI8Sv6iO+IfH1jmILiWnwoXBpEaVaE9aqniZjIccuVOcunjhKRoqqbKEl4gMP9QtYII26h0QAvZafoiav6GCU00ivUkxZeO20sdfQeS6RTCHNxl2C5p+fHJe3fBC9W4vJCBRJIfm61bqGottscTXeOkd0luVEvhbUhFnptQqlqWhfYYk+Jpy33Vses/gCcjjF0w2QtmgV+S+DgYiGW810rk1fkkGYAMsvbM8RuoVDKemx6gVsMe7KatZ94JWY4MHQjbibH6Xe5OGFruRwwwIrAx4eEJTrlXfxCnQ/jVedpg4ez8QXhzcYN9nBtf02AZDMxgzUXB/G+gvWKa9CiE31ecIYZg8YeEcIMg5NEnys1xjPYlRLFrUT8N3pJIa/IKoc5x1PZaxfagpHM3HPb5ubTqt8+JNLKrf2Yun8B+rV26I7zbXn5LrHprh4EMb+T74PXyQ2/ZUs0gd0fSYDrzSK6U//ZwrijCKX0YQaAQsPi+kT5CgpKZ9aMxOP70qYqt9SjLQT+D5x0y+FQOrZNEhYXQyma+ChA2zzILdQ1bomBB3aUTL8cW6Jlm8Ji5cqrj8yO139ved3y8H24BP88VHgyXIooYXWq4D6f6x733ENsFUMQfiY5A7/Sji365LG1fj24+i9FXHgYzP9pM+5aD1Q8MspT/6nLtrWrdE52LmRRNq7U4E8JZZkn7ZnKWYWFxZzcJKAelrVKmQjz0knIg2dp+Xg12vV3oceiprkMWWHjyw9Ewf0OrtZrH8k+ukIP3wFPZqgVJNmVZB7X+Tn81E6cOtLn2DlFzrSYeUFopk80ZSTJl9DSdHDN0GJeG4rOHD4iyEHE9GmlyJ+lfduorUix3QiBKHtFnuKMPoA6M0wMKz/23/cUp+TslWAu61RHfAoZv4BY8yKv8KRchvjygYJqEFivrkw1KYVeF7AnIMqiZRS9iOi5LdE3wp1dx/X8h0wL0mS2ArKxZ+1tEZh5eILFyh2h4hRP8vEN3xH6wLP2ndI33Nieo6aqKaVwSmjJTi1xAuJ4Cebefy8k9FnqENgeK4zXwEmBS1XNLU9rKI3TXq2jBj+9wewchv9hD941sCPzI5m0teooJN+W3WbiTkm7VmBAmDlWgaJ+QcXnMsH4syjAEZvf4cBLLH1ym1lPnhr5UQ85afOrYLHOMaUn4nXQOfXeEdngHb8ArlR4Lw2RfyCMb6PiPxfhEJ4ZuAdFh8XMSPXFMHnRwVjkjoxo9E8gXx1h7Ha2Z0caF7+XFPP2ige2Qn9RmRVN//MsM/yIObHpB49hK3sNcl4/xbgG72toLJOw3pU9I3JMc755pV6OYzQ626KptLFXIqRtAYT2q7Ibw8wrKs10E3SFbyJzLO+2ZJBoGa64z2hOF6FpyKPsWaK25mU3Pr/JNvey9D72a0NL5KCwoy+a4JHujIjuK1dhcolbt+5K9yUlRR5TDT68Y2xYfyxx3LduK7hf2x4tJuU8hJaEazxtzg7ANW76qxNtAeGJ73LqVh9X1dQTcmDqrQuixAOBmhb4Poggi5wGuriMDuDQ8XXJW4SC4Qwcn1uj7/Fe/U9+Rb0WOeyIDEWBPZQqFWi0OWto7hA4Mt/GFQB09o+s4hKPKSCmpnqAf+FZyYQvrXtxPxKQfMoogzunbP2upeV41sRsNwFEze0UePCX8daM2i0/3f5hjlJJUof/R1UpA2LjBGa6ZaJ9kk6fRuWvtggFG1xhbq+KCXSoKjEDv3zOm2bGTvu23CzIPT1giHwtlofFCLw7DapAlAZom449e9oYr9K/feR12yCZ/LK2lN6Jz35dn0lFfMItfKikwRPTh+w85ksfgZapZaj1Dn97SaStrXutnbs+jq0wY0SRoCRR74+Cc+GWuOPVNEAMWkMlUrZ5PHA5p7nJtNdrYOO6yL4vctUDiHjbNly/HLtXlPNduIwpTeOXmJE9MRSL1QczHJrYmgIRN6G2NOjiwbydu3nvLrFPJj4CHu2eINEKqxYtfticC4xEXRAhFwGfOlFrWQLk6g3Lph/V8yanYV/Z2rLLrHrs8uvnUsilGsNWLxm748yYwd/YMyLZeE9nliGWqy/HR8vn4c5rR9A1pZP9Gf5leFL420b36P/qK4NMEeyAEjQGz/sLWg5wum4DPZVzue408gsmbS1LCaqjDND0jf3UF/bbU/ua4KQ7pZ3v4/Bn8s4iSZjLoru05dnvEAZH2iC02PmCLpNXmfmHLKKmE8Y+OXr3WqmWzSXukKMBD+V+1VxXlhMalrV5FswymArciJOEgzgxXULRRor9nmpTTcsmGONoP5J0VqEJpnSVjBgzy0eprxRjMk2yswWHCb0JoRFzLk6R+w98AMekfdc1D72IOH/l3OlL6YqoH29O/Jsiofw8BsRu6u1xQpGDJN63axSth6vv2QMkUH8JXuM7rgrDA8qwgcMoT1msC9S8tXzALscZDZN/HUKBO6gpSy0pfZSSh121ShXcHT+7T77YJv5Q/JVzTH3Xs/DiMVf7QHT6kP4mK5EypClRFGx1MvICABrA477duMOU3LPysBpMv+Ft1h9FOnQtN7YG5liR5IO0lLGIwBD7mBuGrqs4Q2f3NGP3fNaphjjXfYGl7kk1oi5bY/AcimeGNAjZEXHkBw1KCQIRykOColn0KUsbBDZoIVRJ4mHSYSqJHkZ4QIjNjowDkd+CbF7dRShHlECrQgkNbUBTZvZZbNSjprx5sGTuEorvjMyug09eDlYMupoThEUbVKgvYgdEjjbVaTIMLigbrvBcFVD4ylon2LsFILgCu4O5fqJ2kmV+WedJpecXSwKhEMqimUy+Ve9Czna05cexxpH3BoFHX7IKqGg+jjMecrFdhobIEVjsk4nsAn3dAfiWtJl0BX107+09O8lfsXnHT8kgaNB+ueeM6PKQPqs9ATh53TBtIBA5a5PT2mLhlRB5hzabZ8e8VIpEZ9MxQQIfAmZFXdwLYLRPOzYrtVCOgPhwUlpbliromGuIo6RmBBOCCrdYnRZz3Lv0Vy4kjZa9cf5Xmcd005kfVqYYIgORxozDzQaT6eetDCw/BLQJNAjjw2ZY7T9ZaRvsq1mleG8Dt9sumlCNO+yDBkt+reI5+DGsM++BbCXX4lCQ+gMG53wK9onaSZzk/2qap5d7+M2dymZ/r/fKr33gJ6PLsp681xOlnRxa5HZy9Tc8M+GdaygXKuxTnL0G6EEAM5ixnibqcOvB7pFVvVp0fe4raeshc3eOHy4FRDA8rAv4busvmAutKlECFzpkTvuoKTOQIfEJMIaibotALBVVS4l1DB6sacjoz9PVX5WzZeEqGgiVcYKa+yWV2bGmyR+R0mhJc7Y3WiabVveGOHrVet10vigWZZOH6+KVdBwWXOn21dvg66GRbgsgxWZ167TDd7h99Q6Hmus4J4Qz8qHh9WA5A1ZIADuVMtzKgQdOZEG20bDc4fadkcXM1yRzdRRcrBVS1r7l5eEocz2SEWV/5O73um8luLh8QusuKtk3ZWlRwGmv2xDZ+z8luhUvMeKqEfAPrkBBAFlhCiq3p42ZfvtFe1VzHNosFmUv/e9HGoYeiszyJl0hI3Ei6vmj38PmG1miLH7OlDVU2VFGfoEEoV/iYZcOKfZD5YHwnDVLyjKQiWjNxZaW18Mf7NHbIasdCTpilayjvrsxTMrnrbp/QfUUvReDl7LmbqeKkGr31jXuYnlQuNu9bD4N7JZRqP/+X6eiaCkZ8BQAQadAxvHtwzdymZmW+5jI35o2UFAANcq+4JbTPhLr2PN3agNzrpuJA9uDLBGeXvlKpnwDKB5v5M1OJUb+QPtqFyMLO05MDBbxfU8+u66NCT4J9XHitdoIs7ZX1yVFRcm0qr9j6dKeRfCsoBHXSlatJrg13NQd9FdBD3mbnMn7uuUbon4wza2eKMJb5eFmwmHA+X0wA/4/azlzpkP+ZY2Fy2kHBQi5NtZKKGizrp0I4Y7KO2htp5JoeEydFFv/B/CdJKEVDrCYwb1TGdh9iFBUso0h5sWAZrjMar8p7XUnET/sTGk3q7uW+Ig6o2htbxnfTODWmXbx5MrFlAhE/QLwDsvtxXmuft///vylE/pleTKNdzNs47hdqIAz1WuxZp4xhu0YJXhMOohZd6Zvd5lHcAl3XekwGQ06qyryn+aiDjUmFcKm0NY9PyUllRcMgevicDXMWd9OTmNqWbUGJ9b7cQseSwpfKcCHkytKOoGCPsQ26Rwihde+ZrJnDinBOx9+xr+8Z+K5xei8qIQPDcNJ4DOWnC4d+3DVZ+vQWsXUIpiKIrWWw9YskmWg0RipovOaztFzfznHhJeWnILHj/ioQWWf5toAUCG9LKtWlHPJF8OhFu2UH4KjIx+wbiUPL9MNg9pb96tobJYSoKaGFrw898Nvc99AfgLyRH+S9H66dYVMfN94TNqTDMPgZGLA7MuYxdWFMINfaYJ3nrxlAnrsp5YqjwJOGHsC3Cnr9XfTQQ7um8HpiR7KgGCrgjv7PxuNiR/HXH0G8rwy8MPjv5Pe4aLSmyj0NlehX6llLX8JWZAgrTtWeD2pVuZnxa0Ft8eYO8KCkNL69ejg4wnLMWCQwQX4LgJWTHR4sQT73Ncf6nF2vgWOqpLUZAj1IcWXyWsmQBPcFIvB+A7oXG+TvuLr5MFJtqbb2jNaj7EvMOpYTvTfyRY6C+Mdh6dT+BWUPXiOHPLk/Wi+KsaM3IGZWwV5DY7b1cmXmLeK1z/VuyOw+CqatBorewsO3+r2IYBqAVrBH9VrxXBvmXO74idN0w2U+y3niCONUazP4LqbGmfigQpfY+p3O96c3uXouz+kBuYjBekZsN8252U4wmi2HP+V4DREMCTqsZ2RE0/ox5XmjYLOzW4ai/TGT4QcUjc+GGaMRYNlKoKQjPfnt3Wh4PzXKW/UiFfEtGFlzgkeWzJ27fBeTon7cOzdhSX0QjHy5iov03MZO9VT7EQlGiQ4fURECIlzAdwUN6H2LppiThOK/pUYde3WKz2rnrkP6TXDZitQgjfKhPEsMF1UARI5jg5/vwVgyg+CAoYJbjUrp7z8aZm0XvUQH5Wa1mV85KYfVIQ9s7wEa7CzizY+vCQQxnDQjF2oyvlUPR4jX5VKODesW2hEFOSndJ0QsoGAFdM4q6mCMrnFohGLn2e3MRwMkxyHcnedDyEp3UwWt4nVs9EH7JnYLH8T4xOia8HZ74eavkdmLYfnRsTwG7ovQ1Kfmu5EYKYJeF+hdkzq++vos2eP3vFcUKbHF7WnhSZwwbD2tgVt12XkCgVDiEkMYXnm/8kAlzw1Ouhb/ffKH1ca3F6km+i4MJWUNHasya1xoKxyHuQsIITxLiZyip3smKx+BQFUz1IycaqhNENpR4tJh3RtBum7W2mMWbsKYUDNa1XM8lUAXykKFhHxSxLtMyQ3wJj2mTtt7uUBgDXwfX6VD3Srx/cB0nCZDwZwoHUxVPhwPN2cGO4LlbMg8n0yGP2/qFlNo3ZgStEMW+d9mx3wPYcRUX5CwBAoG7VxlUh7J+AbPr4CV0otfeW604yVX6iX41walDuHnBjrzUF+OJVID4RUqGqXyUxZxdr0Ld9VkNHUkyBwO4hh2BeW81AZ3X5x8EBw9zpdXdQ4vWMW0u4YAuF2zw4aBCzHjfiSkgkm2pOWJDkBIfZ2aGGrz0Qob3Sek4sTMRW2fzVE8WP/pbMnlTBkf4cIZzObfuvxJPxB2ijbToJNrMXEKP2QjWWF9qd0qQ7PSs4z03HAxUOLIYb9rKvSknN+HDLqkbcA0qAZxrlTY5GGcsl1BmRu+JpykML4UYzPVc4jrhXpOHC2xTY/wEMXHBNTRhY/zEcXFAmGxFEZhMzjH5HyHkBhAEnHLDZ/7JzEUJ8SGmmdn0YRYbjLYUWjrl3IMBBVlJuDv4FlsTAUIdNlkpcyxWoQRLhPhhRQz/zO5Wnv+NAdQdkiYu9BAV2oSWnLDvNdhUY/uEymgoJMvnpYdWJkaxPd7Ek7kRq9nUIwi0iXsi130UJLM915FovQMV2KFj9Kk8hesP2KaKH/XzIiai5na4tWY/V4t0t1h+V8XXnTmlsgWDlLox4ahosJ1faEGm6hFNYVQm8bW0HBeqvDBlwgTYpsnq9LIFADQh3b38Ik8TaV2gvL2iivkZLmZq1yTfXR/lUnhLnjBOFczUbF7KdVq5VvNclwsha/nuHZtZjwGncSAJcxqfWuLxCpLBpo+4qxPi+8UNj+NrTagHDXLZhRX1OcOtIZyoi/xRFs7pd0F0BpeJVJQftonVpO84Iz0fY8aUeHHkdWB/XMmQNX8bgfwXl1zwVgkND6/MuMqccEGRYCbYV2o+AH7PdPHUY7nyjJ8oD9CLVMTsCe4RvlJ1hRzhX0K3LEPTvXHSBpeyuBac5HtsgD05bIbF6V4/i5WzYw1pnT6OtloCCpV73QXCKg8xGS8MQjBfavXBn5FODCsYaHHzxuGMn62rXFatDXLhPc34tZODsW/KhIczYgrIOB1ysD0vouTD5JnMxuMa0ZNaAwQuC129ciwh7t0Bdm+iB5qkg6yg8lFdvSsVEZOrauNpyjc1cpjjqf4wC3gf6EVAianRdCGaCAb7eg2zZ9oie+r9Ar56SLwl9K6fwKKGE8XC9V1dwyhN6bnCPsfTY01Z2t2IdjWzkFupRJoCotp9rV5950UIha3iKoazFdNe4fqC/uQmYtn9zRWeqgnkzFfaNJs3ZtOCH9071ulCxTndnhMdCai2PUFNZrV53jXuDarrsAlnEnO4bxvBUoSqHi6WAFajXIvqmIS2qZzrHO4sIv9icplZusEX6OxFeNFh0d7mhJenzSKLBeg1sZQn73BHrGKa5GyNosqJHsN+QZGdHP3e9Nn7WNY9PnUaH2ee2S66BMUJ7PIJ2UB0LnCp0Z8/RwDp9Mk3lN4THMkTvq1VirxzSNkF53BF74dlcjyz1DWaRbapv5W6iTnMsCAoZBpIpud3kZg0v+WTcOa/luQHT3Aq4XUcdfNpkzCYGhs1VfvwDwsZHVaadk2p9xhNWg5YZbNNTRS7i2qgv2J5hFlOCuRwYHzS5EitoNm3g9Jz0jrPqjkC7WTpH5N47W/VDTjT99qVoi3TI+QpfuGj3JTx3sA7HeiD7kh4j196opNPB+S+cCKK9pdejBJW9AdnkdY0ZQpbH9bY6sLPA6Mn3/ZyqRdLY4uDr8Sl60LyFjfkUJUPNQcH/rOBICzoC8JIXgifo45t9ZvUP6k5FURkRgSE9EGVHDM7omdAIJZDZ3a1u3jnO8dvnAxWoV7+tIrKDcion7ce4lA31bPOv3W8JQIo83XCFFV7lcD10n0ghgWQ04MlmBJhZXPwo/V8aOVusURyRQJBp3DsZxbOuPC7q36JVROUPdLrppF02/ZA3OWk+K/Jj+rbbziJSpNXAxQ4X6oxwD+K5X+LDhryfPoXKap8ibbv9fCWScyJMiKI3ISBd689gS6KC2n724GH/bdUL2AO2bxtYBthTi6pHpx6JLnpP8s43rPCGTrseEv4QPe/gEImILXhFlv/CiycLYEqKktFC5Un+7sMr10+i0DUvR4un5K6j7KP5LhmMUysasF30JA6OsCBw1IG53HFFBEUyVF//L16kL8AzRObkSLXC8rwDo2gB0zTA3S5eBbEpm7yBmebXvPX9QAblDrnP6jxUd61jZXt3f3u5z0amjvIqC0D4jKob7VZGOqaKA9W1xdzTt2XpQwFU/b+T1ubOtuvGqzSJJAGPevoJU8i7fAFwP5P6y8XEYOeZbJaKYRveVIWsGom+aNxQ+ywEzBAIWPN0wGO2ywdL6lOusu4G8bqzDbDyC890my4V5yNMcbC5/f3a+vs8rYI1r8m3a3qCqmk12AT17scJXbn9zmsRH7iDdMi8aGDr7+Yb/UksjzFFWcafQt2yfJXelnSmgq4cDWVBfLQ+Q8kCvAlN8dIedxK/IR8Ux5BSVKfxpWR0JF+wyMoKrhY8xdnAkL7Mz+gRpIFKmHHbHLZBQOqTHvLLuIuWBiRqFBWoT4ZJaGD1eWJfvPazPuWuQM+hCNgGYUG7w63At3hfB614eBshx6MouTT66n49ZDjeqjrdgwQ4Mb+TPfNAQHv6sy73qLRktEAaR/IHSGCdYdM5YuyqG2ePnY69Vy65Sx2V8CaehUtRvQeZVEah835xg73I8Qfc9RDfaIG4xCb6mPLUbixVJARotvln0P1JIxWiMO1oGJERBcks7csPcIsNG3w8Ej6/A7Xv6u8fJWREhtAEKSn3NrYIVYQpVK27fwL47TwTL4vr65G8payTOJVqTjKLN6i/0fFTQ+JZd1ZuB894CaHqS6ftJ3UQV+RQXY3M+CSeq/jXsJPl9qmsQK7Pnvvi43DJ9I8tARtNpl9jiqTpZh1hhwcvzCjTIt29rRvkrXlvizqR2TFiQrYlu8JGQcNBPtJmsddq9FUn8MusnWCWJDUCZdxwu2kuI52SKLr++gjDti2HoI8e1LZIMDFi9SnWSQy7V7EP+PVxDzpLz0i3Zgwp6FcoTHr4ekKqnTQtPgnsf3lqWLGpp+puJJ4TVZKNWqGqLcqIZKvwQDfjxjEyd813GJfF+Z29APpop+0cKHXpQPX7MbVbDgdSDefHB4BhWG3jssU/7wewwtMykgKfD6iK9sVGXbyqqikQFm0B3AhVHeEo/NeoN6VuxhpXUYvhzgEgUxI8hRBOfoR0wcdRfda8BHesD35rFhhUiEVdh8nIUyOSugdzAzILmQwUWKmz+2OfHwXUAKTDmuSRErcWRqVhfuZ3BlyT+GMwoXylzyWmvls11ghminpWSGwnwvLaCT+ebiQe1qtRaHx/tvS2wlkJbvNsZj3lZ8RUPi88FMJnMBQ99hjuebRj2kyGerlG3E8d/wUtNbYyc3E8egcJ2AcpQTz8ptd9sSODjOLF3dlCUgZX16/HUSDwTwRYCkjFD8AnDg12UsYlb/7zbZHgiJ429igshy4/QSe3+NGSTmPPe9BBgNTQ2NQ5oDlLBc/5CNcvZhUKp2K+HlkidAQgIv+ncKBo8VdCVZj89qu8H0W83059BBJheSDbg89fSX5YJwgZ908o2CejaZLms3kKqdQn7ogZmDhftBjaTEVRivku+pxLhBDB9M8TTrOy6bmbC9GSi/TExnxYOvnklqO/RntYJ22xgdbOHttClYPzE4dae0y4vMp9yzQ98oDA/3hinqlhucLynfT2pz0D06PtPyxFPSfZBHmie8IAQTD4Hd+a+oYYnIELBsDOYNd9o40FXpZU6rnauBdN/2YbNfsGKtyheMZAz8MG69LzNTRtBfbRTnaNRvKrbCM/84jnEC8wI6dL/ENZfgy1BgCO5Rb6pDpLtzbzjM2VUaVG8Jj/3zn6q/XGt4j/BDgLYxlEqtqdUu019aqN9/6cUSCR2gnYZqbpUV7isQztW8kxzAuPODuy1LU8f4SGyV/wMTYfzJV7t5NljXvPkHp2iQllr4SvU809SCl32Jr/D711ZECdbQwk3wI2+AW/iQIUIPHbSbGoEYss1srZnFlM0HrcEmNG1N/A6qShHmMLv7xPrquZ4Y9N/NKRGsUY3qgWGCFI9Piq4P13pCI/MOiwvz9aKXk6PmUiUpfBtgBHHKCrKe/qxk+mU64w9TydvaYeORFyjnC3abHbaEN+tgYm8AWRMuBXy8fK+XQHPLRanfaE5Pb9rKntiLuHuE2k/hq15Jfdufd2e91Ndk2iPcDoAeSElx650cPKm7OSNbYph9rV5y3Q15hic2Pon/AE+ZBU4/LgbWTlQAtQ6tJKvdcXNJLtBECa+mS7u6IEqvLY9WHWn8ONmIy2g3Ml2qNayfoGDyapqbF6pjR7Dr2+WowiytBGcrvW7uTpw8qDoAgcz/+zV2MgN+jYRJ8WReUYooa+cZ6lCELGlLdkl7xQYCJBQr0fUAFRQCcUdGcQCtgof0IAarFen5eqL1tytKb5bqT5SGn0GfK+/njo7f7cPr/mVqzB3rX+o3mYRvvzxXtyWHJz3uJTxvdaNKbftToZG5cYfJVNMRxmrQhlIXNw4iKqzNrzzv4bUfS830AjCuflh7UOuDeeU+/PPK3yOzOA3EV/0GJKj3XbhKRq21o+FiM7dXhvAmtMjdT9nB1h9ZuaK3/RKyhz25bVfNqMi2WDiB0hZJcRs8RFs5oA/vzn0cXqP0adKTVq4Ab/54AiHsHisamvH5JMsNRExYfR4s4ejBoS6lUfVZUfg4V8mw3ooj89ccwaCBp9aSzkflTrWbU3O0V2mwlnbrrcz4mIFNywT11sGZVh9sS77z0veZUStw/vnvSB+D2UAO8KpyGlWMjoXYQulBo7KLn6IDt/8H50cI5+X0/26BRpEPu7lE5oBg34NsAiOnFHOxFVZvvCE253K178M2l6nb0Di3epxB3piQjYRl5Vi3NuJdaAT7y23W/JklGwL9UL/xlToXLcS64yDYYagkJVFOFSaAO6pyJ4f7p/iqr07wcsRDNvSFoicfuQhMOdTUbDlg51DD7s25yoRPhZG8PNWllzoF112wNT7AKNZktfmaUe1UAxWwtuQyUcV8IuuVUkn404gxmvs00Tb7rgWiFEi2PDTAfYcococE4pbNHRGmoAnRwPtf5GFa6DxiMqbsG+8Cs1ok3lDohyeBwBGI2gbVtphBmRgxn7Bh36hp9YhfueLCI1R3pmMrD1//UeIA1r1l78noEwDaTwWKCziqpNvmcQuh+3rasIPiE2lugwBeVZw0EqfIA0pq+gQUy/dN8XPX7M6iaVivrH6vZqk+gBNlUu8JHi9EE6+64gkj+JvsqljzsFumqTS3eBlG/zFz/DNPfnNi5K2Kw51EvwnqyJ1ydjSHK7zU6lZ4Q1BbckvlK1hkdpr2wMCu189IXOo7gB1bd3/09CzyTIOVxoGKpLNYTGZS860P1liBofiqIPgptFk7+15a4U9gRa26AOZJVdNnvRNLktBYzrp7y/RWeenYGxVSzQTToSDoKeQ2/+4/fpkFR2hnwSIQ7I6LRZoJjz3badeDrYTWiyhHV6qRXaeQ55a2y5r6/f8Re6t0sygfxNVxMz/zYTNisPHAbd3gNcP1QxFmy/uRbzL7Vs3UoOK3rFZGfdtBemNzmcWKIytqGVafn6CIFWfSE4+jSTyF0Q4rxoUcrQ2X6nClObz7b/n5CEYs11jxzLI1mtWXXy7ZX6s3SDY1iZOaVwBnwTdVXXsP+aMlXHNY1XPxeLy6611MCOgOkikEiXVez+s78BKtsHE7FwECau2mGpeN4OanFE2/pQ1xFkKtmGzaZrrG2Rp7+U/IDXR32iyH4EU4/43g4puLKyD+BctXkJRp8AuDE7XbU1gLh578HlMsBPIrZP3dzMBvgu9qQ5sQ+uU/O0nMG0kLFoVOyobY3chMtg7N2HdlZ38br0pnF3Oc3A7WkNHGZarXZkLXiTavEoEFBLIwilghllW0QlGNCzhiNzKZNHC1fmc4FHF9FuJ2QoxkZjPkMsdsd8R67iRrC6Hf5aew3xlyg5tw1mJKBol8mbvdXIq5wvrXmjuYrFfBmTybdM00zLOxO7h/p3jeDnYE8K0DgqauOV5ifl74iBghk1Z7/zbChbMg4aNNWYCXRwBtHBIt+CozO+wvpa6M1r4YNIE1atVgh17fYpi2TONJPKU4v6ZVDF2LNbkd2H3rQ6HyFGidz6NcNF3dIFm8OqyF7KALq6YrWKjgMRGTiLvpuwgDJH9Iw48YhSWKQMNQuCX+iGa+WGNM6PnNHEC/ScrqQ+KUw+picTxBuopcb7udGjh9pTfpGZPNjjDv/GAf7w2j4zQDeZz/j8HdA39AFoNL7DV5zjiuDMtxwiamO+TgEdaK/PfapJaJLsJC9FPpe7Z/kfaJAZh2Spiwb/ekAQibU078YpYi5KXX7jmHKZ++gH9o9o0jQBs7xxxz44J0gv1R1k6QQ3uM65MiHXJP38+k9u7TMhCHeEuCBUbYm4W6ALfp0lW8nJyOtE4F7XF0q51VTay/3npe8OUtj6oIOvhoMmHUcKagt2CcgJAcxkcuGea1HQprJGvJH623DGG8K5qSngCT552fuTYhcO8onW67xqzaC+BRd96RMFSHEk54jySvqHSGEA+ggVWXMXR/tWNzBWMPJs5q5fAd5rKzq9r7ZEnHinpJgByJo+HstvFIzoldcp9DadIJeTza45kyDMnawFn2qSvtitxWS1HUNl9cH/fYZNDx7tPQOJwI+LsubL/PyzvefqrK+8WgHB9TAxx12UcK0aMAq/Ie2kLdIpmPIMwZIaKMwRQqSr4MPyNv58/MX4KQZ4C7Gkc+ULGuvuNg9hDT3NydnidVklfLAkwWJ+W/WtzgRJdtwR6FqCC46Tkheg8ZWiA5pPkYUcCU12yf8kE34e1uwIrxcNUoIUrFVofMdWKfKmH1zjjIhxh9nFi/SGkOZmVHp33TvLHs4lRRQRS3EQkzIM0TIPLy6wo18G6l31dEvDp8FgVJ0hZXTq1V/0ie7apMQwNAgv9NNiSTbdo0WEY2AFdKm1YSM/ictj4n7rBgwtlzPxmdMw4zAT8R202xKUK9RVKkpYZZO8zipAiZ4DPTvFKUJ4Umo/IITDcLoYvev8lV+VSIoYZn+rmpJC6gE9Be5RmrtiREpY1rCG+91ENr/BhAClcxnywOEaBq7Lwb64YAsnDaephVsyyzDQnb3OevC8JJrYoDu2VgY/OIihJut79hReCEbkqUN+63vxfk9qEXUg1WkkneYBx+wdEunM7eXY3tJ7kpaJHIyXlTpEW6jOM7uxCEB9hv7U0qkkj7cQc0lY4fz6w1qcvWDSrsXVJkGcCZVXlRksDcytuWrHV4rpyZtsbkruREYPJ+2D9OspQsX57nHdDL0WWgi+tCjDc80Fv3As0MXbd6Zk+gJEOEwVrk2UpizCxODarOppLTTHT3whrQg+CNkILnGgeieNQSzva2Sr2GVW7C5iTwKAsQPYZgsF1Bq4MR6VG5JAKYZ/MhEqMvV9GYKCOzYrwQwUTwf2uCZ4ePLOgGAlMjfV0x3rphz0szLMjO/zD/GqeotbJrs5p4Qlw2FF1jgXV+2kV2KwBiT1Xr10smDkMqAutp2B6tWG7SSBLSFt/TgTyUGEVcHiQxIRmb/h7fetqXlBwUqAnLs2p8co1vMqn95s7Gxvok6AyW/1kC/SfX7Ne/Bp7Mp7xc02ldWraU9C5IsBusMPnxpaLtz1VIvk6DUAPakZHFwhCnvs79eFTDDvkKKBANAW4Wz7CDu1e89IJfDN5IGgTACjkFUXhFXXbvDQlugP8kz/mQe5v/W/oFT+go8mEEptB8lJGUNGvBVJa4kh5kzzF3nk6i+eWEuKlc2iiEi9T/q8i5rtnvPJ+3JjqM/WxQqK5LSjc6qzjYrCtcWLrzdTHEBnPdtUPFPIP8C+aaUF4d6H2V936Y27E2DJNX1HzD+ygdsK42waIK7S6kQPivjr91IQr3nvr7zqcINjU0KLevLelJohWL2q4Kx+kfT7X4RSJAx1HMHMx/LQycIz3wNSHkt+iQnj1NZ/IX3ZNj1u5brZoOcYABbaMzpXjdTccv2jX5IDDMYvs84JOC40Qp16zD/U6ziauONMRbyn7HIuZqkPdjtiAg9P1852/EnWYALq62JMHO3ujD0M3yhq188YnMjmI21K14UGJKsmY7wiux2kTDyrASr8chqChzzwmhZ/BuV4178Bu0LNgP7BwNkCN2ldKwq+ALb6TjRBcS56JAwUznMUG/xF0q7AlenfH/P/PU7hM/TFWi7nyBYS+WO9hqV8okIo2NnV82kND+NidMclkxkoZBLUaQbN9AajjrvQIact0LrwrM1wfDz/XbNN9axkjokgbfoSVYsr0x7MQYEZ8m2kiVO7J7FaxQsjubge9Tqs6fybTPtzBLOw+u7eCgZJphfb+D3KVQdGTEZBvEYWqudFTTorkUjpclbi3CiGJ7XLNPkL6Chg+pZ0dgyfWeMY0ubQoTQ/Ao6rFClyZDjsyOJ8CvnQ3oC6F5KMhx/AqIUvfKrZicI5N9BpNpLgqQHb/bVPmN02ZRdtZXn+ZRcnP4CWuzMX6gIARrf1MhD0fsQRAAgVqiS49BM4lsWbpMQgWexKLQM9RRU5WjoLDxAff81CUUXpLGL+TRVrO59U0IEx5rrYtA/O/8AMf6Mkrod+eVzJHooonA/LbsLs5yzj2iGq8Teiei8GALJvMWlZroRybtN3MPiW1lT+VbiEd/TTIlf/CnSGbF1vwJIgJRhzuyHoyjFMJzgtY93PiMvV5W7S3+ilPpzaG02NCcw0XH7r7Rx9Ai/W8Aa6UzCwpOFD/0rOGvLE9Qeo9Eg7Zscgn5PCcZ5mdeuBFee+xYNEtzskx7cfDwAxO5/3ET3YG++UZ+yd0LLtxpTkBOf/tIdovQXtXTJFqgS3MZDB8+o35hXzwxrCfBB4HD5o64RzBHrprH8ZR09qgiWTAsrNKCZTw70uT2l6d+Nz+aNhsBioJB2qgLyFYpvJKEh6WL7vFOMgDAcBY45rQyicm/HNyWQEAjITd5b2wvMu0pIaeRgUsEWvHqw1mM2nAT2CbwjGpt8aCe7LY+dWZv0V95XadxyzJoa85fweuJcHCraNEpAHooIRwRnPcgRYh/qLSYafsAGs0M0hdr6TzpKovypu4MY1+rUXN16TQqNcK/s2m5fiNZYM1PISF5JZ3zvJdz0a9g9KClgkBEwtvHzdFkDaPe3Og8UOqvcIyk1Ng99JVHcM8s7C2LQEBF3Kn2rPBDETNMuX16tKmP/YqOyMeKQt+W28hJW3/fde60r8iNBAoFqV99eEu/qxAMBIkj9mcJi/vHFcmtA7RtNtGINyh1z58QK2A4FV7AzBNfZGnZB/YyZ1QW4sca5q16YrF3vTTk/lPTIbWaLxlqnh/U5/X/RzuhrEc92YGqA88t+fo0bWAAEWxf1WnsM3J65v7AjauEcmNqIWxQyWyWV6lAOhcJufEfs7ShgEcCdH9nG9N0fQSnPUppxH0bPI04yS15NQfaCB7/lcqKNQBZFvyiIUOr9bli35mknum+QOnsx78/2dlLTGZh2Bk2Jmg7uC4X1fVD+jlIRKWIjkpVjqP4eQ9C5/M33cPnI5/z4RDzJtu1k5mUsqXMulQETnz0eqGmJT/8u9DrB/bqFcifLmQbK85PjGrZjAW2DakIsmgH+8eTrB0E+KquY1fhkT3aQoC3ItpvkR26Z4PBnyOsAqUr/bqpTqHQfsxHaJWmBx5b8Jsg9sIANhNdCcfwV8oPa3pCP4Tyxk0TAgWOBMQgGT8gqYNPayk9rfjpNU4GyFMCDzecNavH/bzfrCvLpJhP7houQky21G0Qc3bzIFPQcPIXuKjeWUzvPFipO3qeJ7DddeRrPG16E9UhDd3zgjtRSgAkPGqIg3QnqIQQJIcWmX6QQ+8w3htp0zMRsGaoavKITHUGXRojDKIhuVhuwSHIqmMgp889vOpsJDbuUyrwxFjMIxg0UQf+oKGsSd3ZjHAFB7FVGW7MaIo/8WoXSduTjPykSGZvAsBiG6/+6soRHYIX8iHlLzt2Qef0VnyYpCC6mRSPZFPVN0S3FlXuZRdngN2j0D/ARSWAMz54IKuQ3v5ovwbzvdyt6Y+n9Dt7pK+UFpLnJBF3VbNQCqjXAbyaQhhHs9PaSSYuIlgN/pB9Ip+PtTYvAVn5vOXdutJJL+5Yw1+wA01z9Gkw0PkP4dytTjBNiY+MCaAgEV0MmbplTdgyyGN+SGUf20/5R1ICIhOmtmDcyQk/y3QKNSp4qVgQajShYLzJkofYF43TkzMqijdP6h9l4+31q1764Xra5A/jnkiCh5qdfy6yz3v1F8LAlY90c6w/AnVw4rM5ZP5WwrPu/iWAAWDJV8jL8Bw+rlZ2+KTtOPxhDRF9kh9nGHDdT2TYWElpLi583oKkfXk233npE2DwQoPuXtcG1cL7l8qJh/nhjkdGiw+oWu4/ZLGqaGSLnkLwz+4rgjy4vLl0eRRR70twuk78kRgCxHv5RoxdqD6h0hGRo4sEPGqLRAMbPgtLaUZxfyrCV1sp0kGRF1uZ6714deKXUu95kdsKeUOC7ye+NX5jhAG0zd6hItZN5NbH3v/aeN8BUKQZhrAITcZ0+/QumM2+1oVhw5ph9T3uSAFrXIaylZBqaUOs7UmtebukoyLlUOzeBhuwheem716d2CzVL3QcB3Cfm58KLAbHkVnbm3wSpyd0rbwY3wBwQivAWpYgw0x7/+A6TomVjNV6LE20OgJhxeP8A4P4J5p+6K0Nrgy3NY0fK4tb3oC3tB//AfEBLYKTjjDmV9u2tfJxIe7pRgkoE8TlApWw5L7jsaaWIbQnVQ/CXrrPEh4CnGmhw2axuXxN7tGxylzqDAPnwt/Ylofw1arjLHKIxYaiYlhDoNAfKu/kSAz7NYWxYueAOAzFclziE4XAKntaPsS6uDXUPt/BbSnubjcVi4URI5KN3Uz3+CGGHTum0z37WBvNSOtpApTu1p7WQurHdL82zk+i8PJcV/v1ea8N4ppo1mJzNWIuovrfx+l1O/PIaa9QLkZLXeqtObcHfkU0tCW+RR9GiEdWnX98BUas1llRbJj+q8RAlZbASoIClhW24ojLowMiZg00PgchJSdG1OMXCNYeFk6107oeMViG/nGhEPco3HgU6OdcCTdB/yrKD+J8hNAzVXdj6TdhRbq+q5tBSX78R7T+lg1KQ0kYmeKd+WGBXk7224uSnXUXwF+EhXaW0F0YgvRQ/nul5CHmcWSVJFxKf471qoGjLbcbbTZ9t+xOLh3UDg868ZaeX87WExoHA4HyclLBCF7BzVpDaHlUkEtJpZvRaTv054pG1Wcr8QLcNvmmRxizWiZ4Ut1sosUVE9F/qWJ4yVAfQxLd9SwEy+fts/FBn6xVlUkR8F6hthrD/MMiOrECuHffE3xiR3mefZyA+/t/l7m1CLrndCUKZrcMQDGH4yOQYEwrVZTDIq4D0TcaxYraW2zDfKfJPPp0oXdOZ5gh2z5lwo/2XHgYqCDjvpq6/R0ivgYs8GGs2bPsMVo0/9I1nzIU46u7LHBSn4i6lfT2TXsqpmDTkfYXU0t23Z9U02eXmBy5WuI1oM3Df/19DCfwssMvyCRVq50WgaxCKTrFoi4L41upEZrLugdwqEyF+LlgwvjBfbhjkUYbD6HiZh3fXrn7bxDdDCjerLdCKBvjVa9WeRyeK22vUoyx0s39dieOCQDvsNKc39pouNSAQgm5Cfsd8M75+V1I4irUvoINGl7LajarD9q3PMmAFEo/g6cVB7J+llp9evkKUorMIPc9MscA6fJYHb9f3eYmKAweEitSMDp+BGyWcGDgp705nmdJGuBS3REn7ykzfsOaDYnWW8UTD9u+Y7UOw06L1YBL1XE61Bs8D6Lrzr72cif7gunDXR31ZKFceyQZuVqckeHonEPo3O1KvuAMnI35Aeniaa3AZ/kZEIEF/YclZiHgD+B3ZfTT32u5xXRrLscqbCPlVti6NYmHBPdOjl2AgqzrxWhNJAJ56fdw/Hs4btCtvYyWJD0sUKEx5WQt17MBTxPDHPk3Xg3R8UAXY0rzcs9SgmZXs4O3ZNLcl/voylH4snbsGDo3gSxqfdzF+3PciksA/2bWvVHadQP+uneVWfa6IAcpIPglhhVlEHxUJxCAy4Ys6zkQL9ubjagbWqDqktXIqWyHJHoUT3oY0Bnty0TNwt9uDd4kRReLNDUp9WAnR4SzBTo5tm1Fn9/a2idKPuIVaXoURQIwBqJaqjnUcUXsxUQQ/yykRCWDqy6nbeMeVP34JK2zmsfodAbC8xNyj/ZMLB+AZRlaG5BgYMbCd84SoJZxDWjRGnMGC/WqHFgeZrog+PxX2LIIA6dAo8hdDQXn7Oc5WFnBOk/dHqhDOXShzZDIPHOngp8DQCw0A3Ldjyc/BUzfM1E9XTyqm4V/2kvJ2JaqHQr+U6R2ti5yXDEaqyy5ZamXVd1R3hjEOLSaaznXhzlgFDiH22DvhAW6hYqtquTfji3DfZgG31XQS81GHFOCSYOL4cRpRRJ5YzRhvqSuVHHDShX7ZSDAqriC4vMy+0oRo+mF27iStb9DgBOCo0bE/qrPBp1pb0rWCLwk3eTwem986w0C5QkMjfslNswKDn4zazi1MMAc8t7vqsBh6y3gjNcjcApNHUB/qxe2+vb1B34HO9TfyQhjv7mH0iERqQZYfLpuSDxXy0cguPICIZ84G0qXFdVB3kMioig6BY8Nm7RYghwIrX13NX9142Cjvl+7SHTxnVTAQe4f1OACvpKVwYuFRbrRIUJdamntLgUkyfyHQgx8uvFZMNA68b6z5arwpTyGu+SICQx6OvB0KR+EyK6rY/BH22z15YzGzZQ/pXFN57GNa1fiC3qHPJDNEmmSAYyyo9RoE4dWq4QgRInJee3Q6kd7eGuTq5B00OPCcbl89M09nQt56TW0oWsYQ7rcZUgVUMtqc+iDnkECVQKGmkD05m8RKRObdWXYc6/6fct6um39D8ArTL4+CmnpZq5/p5+Et0dFBeIS7ha7RZuv4YIChhnfct+Jjkp/ginE8GhrJ2TmIXwMQjTk+lbHqEDo2LQu5v4MeEsxX8uo7+tEM6qO9WoREgWgvK1jVbaKXOk61tmP27WV3Cd5VPJ0taxo/bmTWqrvFYLzjY3sNqDRjvungqqt4yPxXLtp16EQNQNcy2Gc8n3LCFJJlOXrQlgGyqLhr55jfmgjyH4V4PreKNBaVFu61oTn76+wdHocZYfV26oMWBqEE/UWRxWuKqyRx2ZZmWRjG2BnVFeZkCXKTsf2O8S4o4a/K+POd+QWXiThpyTPyKjs34CjR7NmDZhOu15Bp9rTfyC9P7xe9xQTHEnk9OBtI/Ud8ieewuydW30dPBof6ENb2rF0go6PSrEBd6leqWumNUwCUCoYGKuocNYK9/MN7UIJz8VqXg97f5X0lEftBt4g9+rFSXySoi+5ulNGy9g/m5nOlh1S+DOn3yagTxGEXuDMueSOQWH1p843Keuo+MiUVC11OyHLTdIYGL/f93tC5cWQv90G16PM6LPRfmv0RJMhKHriZOS5T0PEOEclcT7CRAM06A6P+vGyRFZugB96bndvteNLEodL4Lnu+/vjk8/3mCksztqgcsdi5oP9d0etFsnn3SPEwpStlulohORZW5nvVw86wFSnP2yBQPJEteNTwRQxDC89dNvsAjQ0Qu9Y4HPgCMITnrqA7yr9nKfUPoTjP4hkaOVpj6KZQ/1lI0jhm59e8Mw0mzth5vb5fCQJ5ipdTRtq1v6W7aIidnM9QifOpQFe6k+CzzFQDZp9xom2HpGFgX8teSuZCJioJS6r656hB0X5wDqI4t8GnYrQ8jsuoLQwccRVm+iTKgA26uZB3Pg7zT1HpOj0s4vdmYFXOvHmVuQvltW8TdRBn4wQFH4E1a/T2j22kklXLhAqk2OPxCLuhhcGPAbEJxx/TlDSeSub6Ol+JJSILaPhJ/Qz53U9Qd/kfrutZeJJzzcxBTga68I8TtUnTw5paIJZWKlz3VpzOon1Sy47HtCOs7L7gkqezvY7rAQt2QPxheoj4qkxP9YZgULGaxXxF1v+pYuXB8TlnSWx6wKN6sQU40CNKakNnfRQLw7Pv+9D39DC8iTKDeB3JqFMBJXZ4GKPfztQdFKCf9lddA6ttlf+ltq/S/mz/XO/XQZ+3xwUiQYgFfbkM31gEWBaWiZZPASoe/8I0lCQ6pUEDGq4OPLijhxIGjRq5PkRCITkE8Bm1L6retkdM6Yf3fePPYpdEPINuMFBQgkMk+HwXjj2voaGq7afoGaz1sBkJl3sy3HuAwEdotKmArH5CrTh6PCSIywjAFb22HjmwPBsW8TRnwoH0VQb1BzRY5eO9nG90yGcNKV4EmLgshyuzfhS1o7ssM0i3GSG6mu3kJERpLWiL8yiDBAbZlwZQ9yP51ECLdnH1JN7t3xPq303VyY65hVb1yhBQUdGrG9QaNd9a8WWTI5zhIdE8CMbnEjZZEygylGazNksV8mvQjenFdfMaLCBTZzoQGlhtxnU1JrAvg/AC7shUaTywmbmbscI/oITkMyhaa/TidsS8/+tFZCLP3kowpgQAWc9XSTsKHjyBHPv8+kqDAPOyaXeCrWN06G2gvjhHHrX3H9l1DV9og0+mmOKKCdkOD0LsNmbuavQYq0Q3g1c7bYZ1N156wb58UEUbIdDaaYixBGAnP2fntuFYeBnvk+DDyLTNkeesCI3kannwXF2e/8MKVn7PoLJODvjswkmDYYTkGxPbljY4/csZzchf91FoPD8dFkyU0dgyEjUYuhQsnBr8ttSiP72l+XisSzP0kVxIWZfFaLOVfcacFSyhDUAAqV8XjzzprFQF5Z3DNELkCmmLs7nPsNv6zJXpgUVA/gRD5Pq7GhYXL5PHvtGng9Nr1moIx0YHrLDxIHtjlr6dICBCPrKcsquIIlwpOEB6YTgKCZRsXUnQ6uSJ3IV+EnwIHjWoVa7qjrulNXb0irg3cCOg23mZhnjnG4+a9oDtJx5aRW0Bn9sv5tvGtIsz/HUTxBxrST5pl3XFZ6uCkfrjnTQVHEe+DuzdmIdACmsUlZVBJe+EHQAAQZI6YmSZBXKNCnJ4k1VSN3vAICVG1KcIMUlCrF0HH5m+TJ7u8uNY7gulcMsFsX5E/ZiD/aDZwyEBFlEiRRdidXnMM6FMCgJFKNixbvRtkAjM/vLzBLWIy7XKatnnogxu3MFIMCOh2T0QmQNYbRlPVTnZyN6+uoFpctFlecKR0uJUZ7e6v4Y24bsJ75L3b/iQAOZjjO5cTdMnp1CCOD+UP+FjAHDaV/Hnaf+CpUHb4iKsYq1FKbColctPgDSW28nCtUjaGymhD5SqGwROMhP6KAR/tUkgVrXULYdnNzKVshUwSq/QlxOY5TeGtqrs+ClwIQzgM1ygbZchL6Nw1an+ECh2jpdKHaTPOrQ79A320EFwdhRE8jzjcXKl723vbJBrOTxKQYxLyrhYt8AUcYl97xoNEjCqWUeyOO9Qaz8eCcPVdAlaS+A7wDYEjWzaacrFQPXJZx+wg64kdajvHBhrhW80Z+kxGFf16ZlnA/hxlRj29/hPmDakZIO2pC2N9w7rxsjSHB9lGtTM4YV0HfnVHvF3Ib9Z9Rod0fSwh0hKdBdTcJy84X6uhEMIGQDRufVoG1NqACVn4jyYR7WSXKCs2yqLsEJwteWK9oKLlJZj6fYjGLL5xKR1Um2cKtnvqXNrTuSh2+nEecWIzlIW+mNABnVzNuZKbVLkIp3qTNwjKj5BOILlJ5h5/HiXwvj4OtbW39ThRnQDXfYAMdaKPArQy4/DRstSajHuI0DBTVdnrBI43g45iBLetpHWKpir0VmaQojgfkvfLIbA9I6LAaPhEuSvQjyml82bflf2eud+lmt14Mn9gWxATTDi5WCtQMpI3yPF8BhGNrmEMd+bumIPFtZ0l5v6PC0knZO9gqq6vivOhiAFBeCeEob4lShfyxlVFO0mFp2VVtYe5k64v/BMePxKZmzVsKwCQrtbXzD0+2MivtIKl3HJncPgMwRXA8ffdLVpr/MbysuRO01BoJFZ+jp+8A/qDNKZpPfsrJ+Kj+Zko7Iiw+3GAvhmyNhqQLav9SDxe+QSZ/0lJwq+RkUP4l7im1fKs7U7nrnt+Kea5uBp3jjLzWZyDlksfQ39Fq5bNQoJka8InGeBdfVvd9/3rk7ZfeT9M/I+zx0O3o19SdvsLntW2y0UMRGgvOw+dOdK404aX+CRC+dB8+GosHux0IsFRoqoFOtPCEVvZMluLTaO/0yLtEde7opFF9Kts0tvuK0VPJ9uQgs1zRlg0SBqMdubGIQXhMo882/FjI+WNUIMZTIc8eWiUIRJzb9v/zCdliwOhljSGtSt4i6oZQwtezK9soNN6dIHfhvSJLATehbuYh2nO7+0T331Stb1L1+xTymgE0bUM0P9xQjBmOMQqDh2DpRNiQF3t+PKaPL+DEoBmXK8EuSQ/PCoJZx53NOOLU9WnInWkvQNvrGHItwAzfn0AwiDPfvtzfTWl0h/KELYJ5lYHLKXKNVX095cwt2a3JLnSC6vP50EP06423XwVxLNQUzShufZHErWaFr8ToOoPB4ppZpWaEQWHSQOcVlOOonCOQ7Q872H4RIcGnrkTLe+6w4tWs0Akhn1E/Cw7Xb7y+ebg+2daTgwmJ1FtCG0P6O/QHWN1yTefFC2oYqm36AE5/V/OCvnCdTkI421Sp9q+15BxT2VZd9OcZRUOxhaBdHW0bDPHOq8JypkmhDoiEmrOefR1i7r17AQHpeOYYacP498EgeoLHlnr6MQ/iNqPEcbgMoYfxJzY055XLcL/iH3uqpkxREOe6w0xGqFg3t5BW2yoSn7YBn8OKzEEc+d+y57NTIzX4h8r7ABqZBJ7X5mJ8y0i2ulTtDT69+7EvkKQlOVYNlSX0ILzFyizgiYonIXGrn/M8xF8OcDmSPKa65GVXxncAyZcOBPYF8CcCr1kSvX6UkAccMALHVg1cc3JdVE4IdYYJXmaJNDz9Ga1XJLvNyGY0B1CNodi4W0I/AZKlTe/DgqsyNgXxDoLOJnmp2l7Xgs4qe2Dn830/zZg5/wacsNossVdw7HvjzRKxQkik4j4eU7W4vtYnYZ9YUM/OWZmbmZCRLEMOitytyb/6aggGbdF4BELKfUGSVSctFDJUuA7ciPWK1jwAhqpUqRSlF7huqp9UjTsAY6YX9ppJIYKJlTFRcF5vueHYOyNjUc0Fhr0iNqzgQnRNfVyMV0kk1bhtp+hWEKQ6s1TvCcbDL/1STifuL9wHAldkSeP3DrcZoCSLq3cHJgbuSvAxCjomh2gLcRFfqcOloG+b1JoRtnkRQ1laPwHqUqGL9oKC8wmn4ECyQVQCh8SS08kJQyDs4L1TiMvVEYzDd7gZWWbxqnUeGyOTAjQIzDXp06lJ6EuvQQD57STHgwWb/fPppZwz7o6Z553QfhywhEbCeYiL2tZoXxhNETPIqni1mopchzPbZSOMtd7igsvbWqIR8lhlp8GTrJPatIWSqYN89XAyVGPkJi+KT0PBRDp4tCoA0vo8QjB9wZGSJ+NS5rhcoDw9gY2PGTKbH/jnlZQ/l8+UdR7RvjKODYJUsoInwPf5HUdRczlgkVp9lL5/MPjT+8C9qw6Fx3285ZyO+Rq7xrVDb8uiO6BuRtjSVHomcab+Pmqsdp/TopdDJRx1oJkUKdQheAdWfcjP+WFlbKFpvNBdpVUfxmw1kRwA22aHBia+wSp2XuYzjEjdYxDmd2O0/dk5eI1tXQlXgrZDLKfN+tMr596AvESLK9UNuH4zWlYBSv1vOjh6PkQfqL7CwqUoCuspOuK4LgSs8eP7GqkI/asUKQ+rYPhofnV2JH5vOiaNDskFLD9OI2Rj1qxT+yyaj41vUXLpo++mck4zlQFM99moVVblbhuv2CnBYVoTLDHrzdo8+jw3GPp21Y/IKRO48fG2fz89qlY7C4GPrF/jRLtAqkkjsTGCd6pav06CD4TJXjUB60B7tG33Cltay9R6XmhGrtvJvoW6zrAe01r8FTvLZ014Amkz84fLzB7f7isJYKuTvw62lAFnFCbPEqJzw3fhkT2uFCBbEjmMGd1e4i4AHE9FltDNwYlb7rs+VZfavhWuTGds3ERBzQeBvNtNIvfjGpn8vdoU4b/F9FeTV9qsICyNZ8M+aW9zW79ZBlP4KSq62FiDHOHMhYKrj82sAtH7T5oCMtUDigvyQ/YfbmFfg7tlrBVoo+A8U/trXgBGvt6TPgr7prcJiIl7m0KuQwuf/b4/Tj5NFIqI+P5GewDxCITyEZZfggJxepXruN8/fmGq0Y4yGVg0JdCvDvp57TivdBL+/ubZdrTf4TaK+EDEaN79nOVmLzuYLPDtnQDptt0veUMaC6xQ9SRSmiDmnGK5yrmh9fzJUL56Ti7ot2vqi4IKR+XA6USxW6dAtQpDZ4kMcjqdDyvzCgIC/gLbyJb8C9i9OJ3gYfTuhNIQom6+Mjx0WxswrCRNfv3o6yxxisCKjtOQW46cM1Znqow+mATgFQP1EfIJjTWwRdQ5wSQhupo7/txKmdtC9bsZdm9oMjPVd8demYlfSiXmfPd/iQeP+fAcpXg+pYhdTX0akkrtIH2uIZq1kR/aq0dG/p2+39KzIImj4deT4oU9nxfix+2AqYHUq4sy+M5Sf6arbONgX7Bqp0ZLf7o9mViwnbjmpBQYd41RhOwSuhoKheSsgxSV2q4SFlEgh9wJ6YZMhD3C0Ox/8pZIPjLFxpONC6trLEWdOrJTKkqkUlY5AMC5AGK3XR/mtJcGul+x5xtduNfG7kJfc9DzCxpB+Q547bNZaV+6Q8YNVSWB6QDduWY0PNvEc/OxxNdD01QnFnNWUoHvj1N1uu0CftW6eth4ZxRumi1ECGmjzHf1B40gfXTNJahNZcO/tbkQYO4SgIEdxY6P7MnSHpuU4Rs3JUTZJoQEJanAn9U9gE7d6FTyUpGz2VHw2uiTY6cRcQKgAZ7D61g4ZgsP75Mg0zJLvlqc+Ef1W7hRn73hZPWOtPU6Cy6W0uajOXo9ppsJq3Sc02EnPlMZHgAKdQsHcaasULfsoKjdaGF/zNW9qYQzLR0yOUO6ZHDybRQNUsRvoBoUTzlZSnkL40qGkxcd9Xt9KgdlShEgRikHtEJcJ4pR7AkuudPOgSKcfj/qgO4OMWxn3usS/phzzFQ/N+xPikxMSsNIqzGF4yVe+mYQI0VhBxmHdjwsdY4uOb0dbE+1bDbmdI1F3zYueuSGc6mbF78yi0ekR5xx5eIbk1962BVLhOfMg/4aanFeyZ1cwpgqO8IFhqUtY0spP/3J4SU9sdEjnm0luutSJIB8Ypoi1iPfqwUfXQBr2G4JeVrO8OvOeS0mSwgjQq2Yzk8J9HVZgNFoDxo8mNvrLPKSLSNJGByHoaT/O5Wpzyrh/7IZNW1yB6/bopAwu87O8ISFl1hUu08ozSvaGPglsjm87+SV20fBGbmRJE0Ki6tR7DzKyXg5mPqHOm88+JtKqSafO31qkCU1lMIbIxiZwPHDHW/9FCyO6vs5tmOgs3Ng/1+i+TnFdDHhzznLL4u/e8UsvsZZx4M+Tc4lJ1UlYE5cbd1DVU2o+1305Bcl1s7xQ3zd6GH7ZINIyLwSCpXFgcfzWTxgz6NlUkkVYOMDyDxz6kAtTULgt5384tylVpKwSyOL/z5/h78AYhiRPWYKZkO4jq6lF4ihJWjO2IU2TmfdJbmQuPzPfWe/EAcU+fCk+aYZVXleAv0jwe2U4FATjUjuslVbiaIcckD+2gZdjCFGuBm+Xi9WKKihE3WIx10G+i0XXnPTc798Pa+OZzUxlh/YcFEEvXOuwd1pv8mx8EPd9h+pT/gDlnjrAV1nbkrX5i2r/4mHzyO7zaMwBaNNZmQyoHAYj0m35dDtGNBg6PB9w3/cCkx6FltjqinYwW1ZUjMnWBoYGmVsU9AMQwUIaPCZq8I4VBYSzpsntb1ItwVCnLGGW0XiTXQ0Z5KJ+2q8H7IuQxwg0QwZYG0uDO7A7LfbP9AFXzuLvej582jCLXZIsNIFMctwMQNyKxygNn7xbdabHrA85ilYWSKf30wziOtvO7KiEFrnzwPB1tqxJW4rtGsYY6+oiL9fCsZdmc7LlKes+EpBKiaSfjD2xg/5xLyOM2TkUqxOc+naPC6CTc+7gzsSLfrMAXYNcTzesK1EXrfpxK6Xh7YYYYVvPRIv2KIvm0n5EIQGNSSCMb+mjp6ZAPp5unSvodxmFqsjJQMwvnud/Mg8AV0wBirOiRhNRw/+IV9Q7yba4DiL5Ruyzfp4fpGp7tFRO4hHqAxpSSM2AQVAG5EY2H5ORJa6F1VJWCEvihdsPJkZ4zTPqn65ziXmtKVWMK8BFrGGAmQN4MSRQTL+/gr9ogrs2J6fyiEhE7ypOhWv/hFM91H7dHEyUOqN2MvcN+adp9mOkxBrLx9gqkQCsSeV6q4c9+UwwtLAcuFCFr3y8WCoLekuJVJKJvAppvPASmQafBcqDfvsg4xPxTzjDz6wWnpOxn+mAOPvavtJXYd8H+j91OwmJSoZrT7nVYyJvC/PM0o2E430O61Gk5Rwepw6WYMojmHqlhs3P/wjAO2kIzTxzqZSoG5bN8xd3hIVL48JtGT3LSLIZ4+vwgJKEtA8xkT7If0DdslX4EkyaBJ5fRlT4mW5ExdYcq+t39kADaaVLDxH0YUv5OO4QC1WvteT2FLkDcTqI+IE8zqEwLCqHVmhJiEVvK3tgorchztQXX5Dq21KIvX2nJX4KJ3UY2+9Kf9KZXpwA3lot6/2b4vqz/GwDcEiu25cZAwUun4Jq0fyduQ1Fer4kec1vb2bCBu9wEVQGoLlKxJXDATnSH3NMdN1PSkQU0b7IairvgW9LWVd09zbejcDkural2tydajPDOaz0MWujDaY2UZ4opxRYO5AV3eC4XMM73Yw/hqAHp3qirL5NM1hpE3f1N+FoaQPprM6rkLATaKVvMhi6feCXUN18dzPpVIqfmIxAk8xGUoUJtFUHR/qC1s2IjzaThN0xCbXJuRjoCS8D1ihiSSSpXw9urwpCTdDrb7hO6dGN7wC/7oPxBnX8sUUnLKcEyTVe0n03b0lC6WfO1pScLq/G+2bTLEq9kI6p/1mJWY1N/yZaOYveN1Ypri8Ey4rypgZQqg3MwzZSsg1gD4B4cRtaoMlEolSdF45lqKpooLl8EpiKhsESY//eS2cLfwgxKxllv2svWFVAPPAzNYDqx1RKF0yQKfsT9bhVi8chK0rkMr3Zs4+/OeLp5Zv1F8m2F6epJe+Vl558EBkOD0sNqAbt4yAXsAPrCmIlAihZ5gQutEJjLfyLI2CzT/bYQTJiGnxunw2pQPdiQ+xMQY9YuqRVxk8ZSM8ciTtqkEbnoC0SS6vvehaCviYSvx0RT+njLOH9mhte/NhV7zGPrq0rH0izZZOEqpxcPcQjjpQ2T+/CG/JKNNkbJ2clL7czmNzLBxYGHFLvTTBWUpfYg5utR5mU0ytkRz0FvHsrpZ+5IfxkVBnjrcYEgMRmnCqXnH9FWj3No1iTRy8u2VTdX/HjxB12IP+3wMBQsPTJzB7zKkdEFgl4XfL8bEQ6cEXQ7NAstBzBdbnfhhrZqxX9iqoNarc9hxSxZjBQkx4bDYzEs4S1sMlerLpCBHR0Zz9+pz0NwvbhTr8Om9cc9I8j9xJl2F8xFW3kdn3eDu6QboTE2OANWKa1n+fusfhZZuN3RZrKMSQRcPeRRQ+C5ix5o/O7LoRuuUHrYQDH7lKpm/ZaE7hqe5/fbaS6JcLzGTz6/ry0jAL9YBrQi8y+RvAicd9HVAbAm198gL0QOBZ3+HnJ2Uc7HIZALCyXT/phNPSsD5nCLFyAvqJcHPvOTFT+x6wLXBesQTW/f61em5Jb2EgOD7TfX1f/SCDy/FJxWybSjhe0QCYY2+/jeegCdyZKGnFn92DyA78Xb003hgRJsDGIwsvNOLCcBzAzF6rHxwSPgQV2SdExOv2oQlqjTlsmvMWoG0MOY1k9rpqJpl9Q8JA5TcNzASM4015W3mFw3Ohaab2Mkv1XFGcaGo4+KJokzwmn3IGvWsmoNExAsY4RHn5JWduffBFH5X79l1suRcQA7QwCsp/rUDR9ox1XM607VVnE7ZiZsgkwVoZdWxNWz3PSmX8EUk+MbQkFBhbgofZaCykHv9BqZ+x0qKxkf7TXtPtb4gmSz5yyrFy6ubprMUAPWKcuC1iybnx+NFxeGaoLhi/p1+fOCcwr2ubs2Cy4jzPUF/Ikpj7LZKjr09UG7k9wd8ISsHDj5MWYOewvz8W1VD7stpzSgWMAH5wdK/ytY1KQJlZGwiDWuytbWuGmbCIv1eMJG/TVbUEs+skGCZbvJilCwAepqCWeWU9y6VP3v8eTUa21b2q9UC8EnahFdQPyWsNvL/EmP2j66y8A94M+ts6I1yKieapyyy+MPxRl0jInCgK2rt+Nl6eWOklPDrD4qQgyZ5bHBKrAuS5w8N9URuWgMP1smIEw7ZODfx2eu3kiANV2/D0JWFrKInvoS5cZr4rzGprLN3srikc9/vmhyh70ZaQe/Y511+dYd/XAFBuHubXLrgXo3kOdABH+ANIHCzu6tS04ALDidNbenrx7qj/NyqnYN5V534vfxI9GyGXAp9x5mN1FAqHn5Lvx1ECGHNM79hldOA6A/kHyB+EJ6dV2mNS1PnrTbWSJlirw+chQepcIJFfwuuCRe4yBhn4Zfst1ym91rkW2y8X+8pjU9Qsf007Pxv4kWNZ/HFjpmAA7RqgCvR3HAYSlkM2zJ4hX9ti+nNde12J5oYAV+9dfac4Q9sd/fAaGQ4m3vN8ujO4CHD7vwqFxL0lQC/OJ2WQzogHZDbw3PiHj+V4n5gxBjrzMhY4RUv/94riZ/swQIDI2+QDztt7FIi77HVjda1K6HuLgpQ094XMPWGSmqsITTK0x5suyIkesmE+3o3cBekcO8jiZUlRWQ3dMydvTmYeKJCP9pgVSCHy2vdTgU9c694JIRK/hKm3DVpVDSmd80cb8Ju+I5QO6bPOiDqSq7ZBa84A3uF4PmpsNZ8yER3Awda6HbpTEVomFwmJYdM5q3ecxS76efjASTZlJFwIjShOaYiVZ+UKHU9E72bhkUeX1fcK7eznG3zTuS6+R4guL8LL8Q5NYf5UBTMe5GZux5Ad81yt+2FDNZFKLH6udcJl5AwBfj60AZfFSeku068mH3F0R+9ZSMyiFgNOZxyxJTzZC5oRrA1wUKXwKH7OCz2yPA9glRfKgwyY2luYNCtE5Qp7FsOKT49D97d0SntlhBTVBHB+EJdAMhrxDbsiYmK7THGB1/vt0AUXh93q+F2qZwiQdicsIIRMAlTO1kCJ4QXmXZXRcfqHFmhfrKwEae+rVCzVPiL7zNwhCFO5METeAxNBhc+5jOGNK2Bw4VDJAiKGA5CPiu2yxtZ5ePiTvIoAaNwtynA8iLWwL1Eu8gfiCcg9IebfwQEu2LcxBoOKE7OEcc7pQMlvtZlaP95gMXwoh19dIBeHvKWYFh1x09qj9C8Wdl/souAy/fitVXQUpWqWW9d0X1UZ7M4IHnVbe0rwZUz6r6iH+mGxfzkwfImc059YQEARciFgEEh/bspNYcKjlU4WiGnaimnpMNYTVwMarkHDAos6ZYWJi8FQXuR0RJlaov8cSG5nLgBJYcv9SsumXQlzswOmr7vXktJDhjPQY8438jVwHMQzFk9LOa3bMfF0bdyQqKLJ7dopHe3FBsstrvtHqOn7pbnBS15GE64w4OR1fkBtDbE4gYSSIXtuNHd1Eqe4mWAhzMzZyUO3Htm23YQgcZ4oM+dQ7g0QnRdfWhzv3XouByx/tXxi0NNEMc0lbfAx8Pv8HUTBH1mAFXmJ4TnYWA4bCbrX7QXzNZ1W8znmwblBVAGprp8PB0qd3FFd41SwENNrSNVjiFlOSkIgDAXsBsxCfglC/ApEtbmVFjWfqbrfl/L2YnsnPCB3/wLyh6Q0DztF+n5p023dtq5ZEqiln5M42TyRI0NDdaNUf4ml1d0TkH+5yQ8aLFmccz8lziUbULEAWrEACNn1pcNZyACqV3nHGgjiNiw7toScvLhsIi3EeP0aIllbQoOSZ+EUuPcrROB3EbPfKtKxJLW1SWkpBJ4ZHZllvEWq61UhJotgnY4hcwlHy7SiwHHQS30qPqMltQw/VV1gifV94d44+jbVp2ezibF50S3xqfSfrK+BaAnN/6uZNP4FdyRgD7eqGTGP4wbFr5BIhLDbdGy3yw38fxOVTDDZ+mROwTZDCDkLffSc9ANCVgs+Rxci5QY01KE1E/PiYHZnuyIWnRPMeEr54rFhQQWQll21zCxdyQl89p/66iiVOyA3Im7WhIykkPO30T7X4SdPulVZNy+1iuBFJYVAoePgtM7QKZMnQMow3GoDivhfgvY207Jz9Ib6GttUDKsLcE9mbNO4aP4X9fLEQr/Cx/nZ6Iccs777F3zGgo2HJsU/14zY1zDYZ9VI0kKu9dVvR4qI++RBrkn8N+mgjq/ILsRUdv9AKTSEDC4p+VBb/TzhmgJYY7q4K3Z64XKBxs95ZFEpqIB8pvTKtu8d8O7W5OMV9doYRGzVBcVux3Rl1+LKl5PwkA+oU57gj21bM8bdWtNc7fvDqopDC375d8LV2847K2Rvb5MrgHHvB2EwlJg2VXEVoRWG6MqmNDYy0wkygB9z+XD/aEuM4BvvQuvi1SKtOdXT+y2oozdrLOAhLqSkucNm6zt8q8Y68X87N9fYa0DiO1Vfppezg1Q+Vpaw+zJ8QkWH+nURcMyCXKKfb+ADcKyuqqMOu1CSUVnwMq2Ex7Q0zkasNklPN94C7GLrz+nmD5XzN/rpDpiPvsUS1u6gHj8LWOfc48FByMOPa147Rk0ajlIwW9zWWpVZK2tr1goTXNzHeE42lyvB48beRfNBFTBeE+VM6HMjLifdl4V6EOKzzNKtljRqYYTdUFA1PzUyEN/ZMOSH/1yaFg8Dm3tcnnMr3ujyZI0OEQBJ3wmL6xQmsMTqgBBuWvYUCX7IgapPr+HHsCnAhYIcF8685FkqbD/nBeLWYoR+7svnx7+iQYF8Vj50orsFfrKbrBL7zCoLhIC5AqWg3vICCAWDArWSyd6Nl0SiOYDT2Jbbp7TDM2h3FU8iNxYM48M4VsWRzRf3JVJlxuJHXbxTWLpRszYP9haYousP67kzbhU6PzLes4as1Cna1Zat5FKAY36zM3tdGayh4XAU25wmwwng+EFJHJ+UBL1eIBO3vdQkrbtBciuiuRf4pcauzUMIsnAk/+3Sq50Y/Lxr1utT23rDg0rN8Ebf2oc5F5YCQ3QSocVrT37TWaOvw3/0tklWOBxxCdT7XOP/uYGliMTenie9lwUARaKd7nizet7HdVO7LRI7YwrB16Y4/3OXnAmJgL0mwAO9XUZd0Etwc82GH033hmiDF24pyh9evP5iIhr+K3hnvBybIA9THr/YddQXCxlBfRHeW5z/6VywjfZynx32b2FFwcDJKkYV9MMZuMAhGXiQo1vwRzDTXEMp90YmzoAvU4yZd+lrZoNT6oa+81lG0SNq3hhIp9ElyU14qlo+obGaDY2MX6+lzDWtvRNoNq+JpnBzt5xhGFct/gc+csQNUMtj9ElZYHq2WTFdoVTp5XcDR+eylFv2D+3oHYpuSwFU9sNtK6pALRazmkmGF/dF7FUZv0n3IpN7mSfvtpDuafQWIWnykSzUsvNbaBWr0K/75mi8iJpfV5PuED9PvpTacrhpWzl3UKla08LGBfpLwflUW/Qw5IganB8stK/4O5wyY9B4IRN5pszh2eUPidr+hBJs66sQIIzZO5Ddp0HphpBxV0TfeKxoZo7BDKrPZIGW1ohuqsBY09mdMqIm0QFHYhJybMLl/vCUPZTrDcy4s6yof49X02e5n8qEuafjqUANClzIc72Y4kctLr39ed4Wh94tocYeOYfCixMrQbcAM0jYpE+exhDDt3vmdSrTIuNv7nds+pAEYdOlqD0nD6XBk4KBGwOqShGriH3LDe1mrMw0tr22AM/8YS7HoE2GBlLF4T+Aa0jlORe3/gnadplMzSVK+WjLrsWTRDxAIRX2WxmzmuT1AYOyREvm+pMTySx/dMc6pO5xBO2MdEtrMUK7pl+nq0vlSmg0QZeNJuCCyRCQT9UjgIHxwtAMfGLMixr4dum4Kms7U1//675MMhGq+vPDB6G9sufwIcW28mieP7SfkcV6Xm+4SscEwhO+dQeTpyQfdkrm0wbbLLL97vunQ/KUQnMiHWdQ9VKxqCgEMWmjkOfiSg/TQghI1nMAQupWYNh60bBj4TxeUSg9K6PeKBs0jooVmbHO/ADRnF6/+17xc5x8hVU+Tb728SHz7WOskm2N1tvMIN25ORLgcvrtnhrRw64ou84EnRm3LO7tRgbGKN8piCcitIJiKNFCvdQsxgGqFzyeOTJwkbPtx9n7DhqcJGmdNafEnCW5NArT8tme+AyiMkqaGVTAozFA39w88tTQZMyIW+hy5HgkdkuI2o5m7nqLAKBL1SLwCPzCPHHLIg2fLV4mwqAzMdAd7CsV4aH+jpsPJ3QlxNl8wCXNw8tcAAGI1ZSgoURtKbp/y5zfzxMxKXYptzhyz8KPIiAeEk26q5crA3nBH7RsWoN0RlVXNxShn8hoIZ++uPI/T+gpbrwNijpniHCnv1KoZ43iMImV3sERBQbVda0SMrbsj67sZDMp3y+UV335IwBuoNgLO2Z2z6KHBWmesIchE5P7TfdHoaXLXDQPWv/k7+b07r2OlP+CR8XTV6LR+qgJ1/H2kscWWx2jbe3A2Oa8B2Rl2tUin540m+liRkTFuyOtzRr//SiVkgH6iN0PWhkhgVStdEUnvo95sqofSWM5YaP9o3EhscvPNEy0EVX2rQ0x0nNlzaQrwGQw3YhY0H2Y0hGaTKpkfhFGoFWv6vajukCM9COSP+hEX3CUEQPW3mtkJnVVVbD4+XS2CK65xp5WlUW4hze3My9ecn/WzkRfWLvpTWDYIQgBJB5I439WAPBmv/4gZKGcA4NOrFKiWget7Y3ryqK3cqQ02AqvD1YMFwU1wKoEbpUJ8W+JIU3LpdWu2kQzgF4s86i1VFrY2+fOXMRdKosZn9LCvOfxil712LxNaqhUAO2j6bL6AYqbGHm2GK8BCoG5hElMfu4sMEjnN8V+WQaBE+z6LMNVs2xMt9PeyFX3urVL8hCIlcCFWS2DTgR1Fl4ucCUcGXLyMHZ2BM1oyf4NrsrxhRIp5dw1TVE4ZtFiCeSXciEa9aYCOR0jcfTNQWkoE8kOaBpDkFIP+V1OQU+cUvFdmDGpdo92Ff4x/pugbHP6Sb1afVi4Yv1+srly29y3mJp2wrA0lI7aLlzvXGmD4OO2CVAw8DAp9CblqMTu+N69AbqhCfu3sAIMXMvhJ1UD7+fJWNjtBpFhMTYLaJFPb6H2hKrKUE2wQxyvNWPajcuknbZJdo33N+6t4V5nMmH32D+V01LAN9WcjZn299sGVKr+fuW8glGFOLyNeP/7oiQvh9fSkiqLG2a6+oNxIGx6YkFEs2SN9NXVNUnZdClsULhUlNyniq9C34mLTTwwNaK55xuZufYOX6o/hlZQPHfU/6NuxuzEhCPwyrLbJxh2RSFFJgCVVqdz6MGlJpOop+XXJUt+bemFqeBPDVIJDs1RLABhTV0oO/v6Jgviu3NxkfAnwjzU7LavM+8cruI413wN9JrYy3Gq1HIIl9BZZyJsmSs2gYo+3pLUs0gIdN1wke8VOalIoRxN/rT9Ay3el1H7+DBEAoEF6Ns0pJ8bWSW2DjekusXTnwGM6ElahpJ1144C6TN+WIIsNVI/Cc/i/A4wZyeVLrdS5QmbATpre8SibU7WT/x+QJvZjZ9i43newV/erieqVuGJRNfCI+DG6p3HVSCkC6mQhg/GV9+NHkkDiOBy39woMWePwDMN12r0r9j10fei3j2OltUslLDuOFHAwTFt6/CVgNnGX3rVs5z/d0egkm9wrp464GKDNE7DTh9gaBFbw+d2hmyLgM3IZcYoeM90pIQlgsEjvKzbEioY0tN5wjVrfZ5HaJ6xL3asGo/GPlVz0U9kcerFUvt2brKbws2BJC8OpnxyvKZ0lFA1bzsnQq3Vpg6TVgIuWlxurzUtt8wDalsAN/wB5KmQ1G96z+JW1x6kdUS3T2+GaUAdrEg0ef0HvbXRyqKy2DU++cMcOLGgbASc9rnfSa4kD9pC70W4d2LogY5dWDJOG8UrTT13GYEjMhA+p2kBpHGpq+YOxvSc8ayPZE0HgSF9EwzNTL0LfSKujt0kKC6wOEpWA+O3awVZ5Op92Zl7NcZR8N+nlOFCFw0thumZBvFbpAtkdl5jUCmcfV8NMbUeVVSK/d7sm+821MPZjXNdCcBuxUfG7wwN3goi3YW5TVXW5Isb9pAPYsuIQrQaBMJzJ5l0jShJWa3COk9HV6W1N/X4lwmSFhYF6MB8sczlKR1lqONORtaInbU5dpNDKLlWSeKB4S5uAV9bXL8F77qYwqGAawoVU+0j3KtpG4LO6QEM+JhZZnVmED/d4BvVoliIBUE1vDK/ez8ifJqrxXLQcT2xYqSAl/dYWEKG9z9aBv561oaCExgOfIxP4qMI9lm0lFJ96Bx0Z44cOZljXDgxSzhCkuif7HG9o/nE/bGPA7sldcAI4C1qBzCg/wc1Ig4y1+DpSqeADlmrD133w5uNPUEfOXc7f0m6JXvAXQBNfZXW1JwM6qnLEkEv6wmLGXnvaWmxiD//5/nU5tuqPgFn6DkFIh9Q2rh+3toq6GL2ycRH1ponQCibLrQOiKQWqxg6iYcNIXU45V5p9o4SRwQcN+k3GhaKWEPQS/G/mO6ueEEyqHrkiNEuuPqI0L8rEEjgPYVa+zTPJXYrYWb24VCm43Gha4h7aeHVN+r1e9RpgWdSvOB6tZ42q7NXblmgKkhzDN2ddCfB3pKLbCnkRnFYslca9Js4ElmoNK95BC/JfOWRSdnhoHahGjpZr7BzLgu8EBM5oakveCOkCsHlqNzx434Xogz8lMa+WAa6hV80MV3tAjrDerCD2bsXrOQIqAS4WfjQwbyA2EIkNLBfO4FviSvDaYmEqjxnT3WWOe0lvBx25gah8yqg1lshohH1TI2zcReXHSCe2ARibyhOMI1t6axf7O1TXwmBlXHqohXZDTQ/EKRdeublVsjnzKvpolDn46HIHgJ4VngqO2VM46VpZsKAOD3JEck3Hd/uPU9VZoHCAMfezsTKlMKNtL9PTKPbdg8x4f0+eZDg4/AjkpqP/NTLM2Mb6yMNxhLJqgFaUrdbVA0dg+C7w4CkeI/ythwp1YhO4048bZsus7pvNUvR3KSaHbNkR2nb9APtF4D3jS5n+xQrAQ4aOVmF7cTfQkWrcX57CdD+DCySsmZhnxa8USXpu/FHTZj++UDGkEmHZemSL0+s05BiIlg9+AMRF0vMjAKzDL5FU/8QMceCPqmqK36Dsq9KSubxzERAI8q6dq7RZZtQQ8oiABGPgs+lP5+jTUdSYGrmRDdP5VEdzvT9se+fo6JuR7yhZRzn6I65cmDki4I7WUqJv3XIvugXM3tUsIcQU5J61pqDsejKztzwOu7UvV1zuipITH45KBccElspl8C+krzV4KcKSvgyAHHgdsQkJLit8m+FKjOJKRvhwzdakfDY9Zc1vzVuol+TTe6PkdRZJCX3JbKROlYNVgTxsIDq01swhR5peteljyz8wPN8IGg5adRKjghzsM+2kpTGpOb0Ktd2hMqoZ/a0JM63/nfaDTj2CEssnQUP0K1hm/V5rC7S41l3exShRtbjSJJxdlm7y62ZPVEq1ocOfLsPozzHOVg3tnFvNn5Vwp9EIl+qIGKDwYgKffrH1Hjqh26rYdH3Ak816Zfxx4IGETpm8J4wERoiLJNbwicWq8LyGhPOGi317Q673PU7B9UTfA+8WvKDcTDq9vIn7s7RULFSYafcMIgYzs9Bj6kZKidNEKMAciNC5lxgcUaHsbgCz9Zjh6oF9Dpuz/m5T7qeTvW8bBO9CTwCwFnmeYEJyC+tupwo1pxk9LL4N5Vuc9OhRM6NWR+UaioQ3CeAs1OaFZB1n0MjHcgd71LxAQuKRgRaeus1pbTGpsJ+iwPdYfttzuI2lBDvJo3T0EjhQiwJGdaYOanijd+8+PsTO305+OaK4t6YEuI9gG4oWJHKMDrZl7cDh/zsdZLs3y+sLRAoRVMdi+DHWCMv3CDDSUCx+LtaGk4mZ1QoVx9XMGZOrj/ZITOc4bODQioPbp8hmrau/dXZAV2vlK43nlvpFNS9KDvAU0TPczuFG3hSHuebStD8skpGH9Yb2XgwPcfgqvOrmtT7LxBtxdwZSW+RI7euP/mEbR1xs9KG9OVDCJAY2E07xGARa4TISGGK1RxZGONLzJqPwSyG0wHbBiUsTipRTiriO0+PPrXCopYKFonvWC4cXcAx2QJeQH8pkVYQSInowYSIvS/IxFDz64AU3WJTiI/obiWlm62hW+HD+nnuLnQZPG1yc2bcoV0orfmX4XEUUZebkR7cgLMJ7QGo98AFy5gas/VUr1y69zs8ZlC98zlUa0X2bbDh7fIpPhhZxMRfdEMe5HpgEXHvHFcqvkkAn+uN1U2sGLQPyA83i9xYJKHbPoAP/Kr78AcAYuBtYumgHXUva2JOpUizfmhAq7ylSeyc3pGFYxe9Ae1Qym50/rVt3i/x7YoBTbDtdBSyvi5IsyI3dxG63UEY9JacSN/PJzKRlrgOqHIYhEPullsV9xEkmN8nUS4ekC0q4URVFPjlp6MckHjxGe4xQvwdxC2cCm0hIykw0pVRmcIAfxD+bOEYWKMkmuLCt0WwYEMngejG96OOX4LO/X7rZL9IlMdpfg41ZdiXKyX2rhsnsAgqeaMaN/mIgahhdw/SEQaSxET4tM+o6Uezq/GMFYob5s8Um/tBS1Wum3FL9sRZcIivMA489faLBoOBs328x9yFV7tUTothomwjzvTgdeWVjRHbSCqJRi+E1p07bssml5C3YgqBVO8QOH9mBW5MRF4Ta6MRxT9E6Z/eTDj1a+9WNUYKSN7kfsZvRkS9jkTme0lGMGw0S2EVog01Qn+vY+ZCFFjWL/90314QDtdcZ/7P5/dSULaNuN7oXTEd9nDg0Mjqs6IWFuEST7J2WjymmDceFNQPw8kLrmtdVOm7Im3xmcKNGgiZu7b7ft+px18BAD1nqzSIGg84OWwMe0SnlyolZEKNjkH3AUB9bEripDafaMMF/cjUtP05jArtBXE9Lx6J3hbhiILbXJ9P1cC0YnxdG6YJP3iyVPeVZU/3nsCuY0t57XkXx2/ci3oWhIjiHHW/ew/habpsEwlI8SgT2PV8jxUCZbzuX6md0tdF4MqcZr0i+hPQvAK3Eamp+gpL/0m+uriOIcV9AskxuxbwmWVktoP/V0qa0ScCQeK4TRiO5KYXkrDp0C897A8GaACSWav7K79ZMbRCxMs7Lp8sUbLicbpz/sTk74qjRerK/v2SDs7+kXDT1Cw254Fn2drYJn9iQdAEl5SSJg1zAcwty/dpheHNApiOXy7sHEFEc0brAr9gctK+9GMmJm7iCjcOnpQujnJnTzXoHf7Bt4wuQZo4sTaZtXgIq3ufXh640mwbRo/BmsWRn/NM3tYKDkMstYD/UOv1vK6h6UZRLTlTxyg9D/2RrR4C9h6gyECMIdZaD9no/cDntUAWirLmGhobpsL1sYmQIw6kcSEAvwE8g8jvaS5z+mO9aW0vowMfwO2cq6f/oB3NknV5DT3n6voxKmeriGC4LmgsvwpckhZA+Gd5UOj8Zmoe4+xWszgD8GeWN28ww/88osyQx1bgpz5+95FBGofVa/WRAhptM5WusBBXDYJvXI6kso2Ip8o+cZ8/La47TU9E01CNua5SA2lNm72B9hIGu5p7ynBoO5LhH3r2KXq7vihMP6sKGopfgtU2M6rPh0GleI+h3blioL/5NU7D8nqhvQbGvZXIBdxxL4XG4ZslaZo6QFDCN7OaQCV5svXPz8GjOCgCgTXcgDP8Nj2qwm/zYHo0c49N3M8peZeoDZRdWTSfEZ1OYZ5xquqJstari5OBKprMwBZURa8b/3hvS8B9iuy10B+Cc0Vk8OPCjrQGvUAsPd1r0qXgLopheLLvac+l/1B18QmmOHCK9mSz/4xNzG+7pv10eY3aZ6/xrm6n6czSeSYando6WMRnnWAFsaKKMN5Vw8LbuU3Vt70hob7We1LBBPFmSEIDah0XxzGvOikvV2mmD1uTdb4r/pvvzlHyxnMBJX2VC7DyNT2nTABd6dd5DisYfLT3kph5+e1BJ1EOz+r9phaMIftfW4gijCkiKkpjVQR2wJl/bTCy8q3ExCRU5SultHgDmUmZyE73R608lUp7rczGONbTFPyNTAF/eS5jMa/oRjpC/CMRg+PN80dW3Ymez52SZoSpaTM9sBXsp/i1xIp2ag/NNedp1dIsTAGkka2OtagKj+7oBJ+FfReUWLdmD4qm1B02edV9KJEMPbs5ysRGwmwWgfN2Ijnfg2RQ0zyW71ly8diPq/kJNob+5LMyPpBBm6ZB7YB4CHdP1MsVZzTajOTmsWg1ebeuHw4xdmnUWRBVxiL7HQeQTQ3zX61a8nL+o0HYx6cQwudX3W+/XJ63dKe6am9B84WtGPPVtmgpQcCXfCCcfJGVSNs94ICEO0kOVrTIhfueYPtw4Gpdlb4SQZFKVBB1o78sjqWkWt50CFOaR9PaemdqVkiZ/dQaMQq++db98m5wNIID04uqTLxSQWYqJWxyfHFjJGBw6ZNEk+z2ZyaQ+B76yJYRRuRcG0BovKJMWq1D0X8t7WHUb4ozRAy8ppTDuG3uIY7HR4Cbnsn3WMuOqr/YcXh90ByGgpLrhSz+GyGBE/AWh+KS1+Si5MWmYs+PNHWs/sP6saAVznhhVyqH+JHKaXwGVm5LOnLOt8PtnJ4jp6+P6nX76MykmdfFggLcYz6JeEub5BcZRrwi3lVuQrYgE4g5b67q8NijmYfTdbZ4aKuI4dLHotmz9L4SB8frPkbdNS2D7O3314g/Uq9XZszFSMmPkVf2wCAZT9K64IeRoaKdlZpi1mDFc10r3a5aDdIuUpz8n7iCsW5aoW4ul22Md2nO4MvZVYQrIFNrFYsvQSLBIhGo/DgGs9GPb2PPLum++omKNuWm7Z1Xqpaj7JUdZRi6pP+OLWKeAYTvYQMvIUZFYDjyGiq7EggYSGl+cWX4B5g/P7o5ABVnQQkMmJzxeZsfKYpgXxLjpsm1tTcKsf4M4kW1pxe+Fm1Kp18IGGrTp+Y8sLmTJwa+PS81wocuopKXdCxjHbHOZ3iuZag4uMJ8pE8K+IUSZHvHM71QfhrtVRr04AKAIFUUFOjkGECpe1ZFAz4dVWUKZweezsuQwBZhb1A4seDD1yrD9djdRAUGNX7x1U+7I9kkXDmcPzPbmBJYSWQoxV4fAY6g9R49RsPDYFbpzXzPkScTblI6Qg/ZAXQk+vVL9nq5JWksNn75oDKR8FEk74zKdX7Zr5ni5jgt8qtRKfmLRQp5L+5dP8xBlpjn46BdVsqElxWWxylis3P7ocyOGSjDzApGd6pF78jT3HGBgfUQ6fWutbEPImtTAjhJj3++S8P6SHMatKObZ2SJBEQ855uCekMzrMYGdQGl9sKWI2rYSR2+j+rQEFfWNftdxHyQ+LSSnOcRx5X4H/ACDJxRFgi8HjKBH7mDlWzf1VgrVYydN3Daj1jG64qPOUI0Se0eApqKInao3bcjnBiePT65lpb+lkuRW9MddasglxzDCrIiYTO6QBH8S+ZoKg+RRrau1L+TUYENBCr1GmlY0f24grO487jH+cz2HrRk1sCMVMdrSshLClYDFxEjSrKKYVdoFo4FElYYIh5rVqOqKMb6RqeH/eHSkHDAvopcRZG6THkuaxtZuzIOQ9D2Z65IWes38pSpkEcTtCrbiFjUVgmhKOolwP6gweCBN3uiqdtpB7w83/4QSln8vsHdZsenNiOmYpdt/uSGLfFc2b3CYb4tbIwIbhZ3ekXWRZTvYjsLDuPAcZMW25eNj8zjMI2Rrmtv4B+Lguim3aRAAn4OQh9yuFudXwUvHazBIrpzaYDcY+t205SHHDT1qJYecfxyHUDDdcdxq4+a4RXUI3QXn+1KioAWNIMsFk6Uv3lbxTQFDtvOpWbvtPLV1q01QLayRnlwk8+aNpazV/EUzjBHqJtNs+Lc2tNWj5pHFRSG+pUN/pLrcRymZFht2NsVMz0WFhMDUEFx0ouPm9/zswkMxvEGTMHCXXm2ZDqjvdLqBDRfdj9TlUAumdXzCH6XheFqY3XOBb4ghwDjDW810FpbAJ0YzKZMpBEUJsxcDya34NbHb7SLrmCGgJmXEsJvgUj8CFUeg5l9zQvoQL63YRuw5DZ2GNdM5AFnY+n/vmgDRO0guwhwrBbV8W5LSA7hxSMm2ylv837Gh/DsNb4q1mvINZotYO4/mEVnx/jNMd7zslPmIWXEU87FYxhXdNXHLxSQTkKYKBuHaKOVXvwAaiprfjKhCVU/ezrR5Q2NxtwZl4uh8Wj3wmVKTAfu0p0PfqrB5iFQ9gA8+LHKNusOYOt836SrOdLFMw2ctG1JSCqaXol9PA1wa1NSTrsYHFjyNLSFn85ozBWzIYyCFhTnJjruL+XCEqqc192sj1lEkqLz7v1OyjkwXcjxPeAci2YDEUeH70h7khhyuL10v46ib+D92kqvcBWvx8bx//Ym5aH+AKUPAKZrbiQBJD0DQxB/t5CK/kZdbbP/tPcDSekdoKfKKFpBvb0oiO7cFvhTEkXscv88ZQU97Fxb0ax48VSbfNBiemxAAw2QzfCHFiA5h5Qy7D/RIrxKBdBt0p8LRbv293FefNuv7pu2G+fM9UwDldw+AFJ5KWgzegTLn+QIXpWgt4+5tG3TvE4mVkp5mynCsDPp2rd/EnqngR7l9KufBnCs+kKEi+67Cf//XvFehmMXecitXsu49rfnPQoCMay49jH07HOl6ihsJEN72KOU3qGl/hGnAlwC9mTJ5LpHfEz3oiqpxPhqtQETolP8GMlGCQqtUwFQLRJyW0IinCrF1dJKy0Ro/+s7pIj3qXEpEw1cKreA70hxAdEhz+7/s418pe7EzgVAZ/I21xTNDQl7y5mnjmGcO0tolZIjAr6CCz8nwNM7yBhLKi0d4QeGoSpWh5uYIWHCv22jwydoCLsYFHe+1ynDlKoonar0Rh503yTRNR+GHUss7XzOsmI/2Cf4tElu+/h1dC2LR0Lbc5KiFBD+r6A+/M530pYe+vlSnYShHRj9kkgtKylYEzJwa0uWMANxpypLL9lduQJVVCsCLV91eQZkxntJ8kONT8miXF7HVKVxnKQOoH/2HfneaOIynEIqfd3KqFNZxztZqwPdPS9h9Vfh5PMOfl6oyMKB4ZYOx1P3makA1RFlZVnbEtV4lwdFw30iyHB8BV2e/zsTPuOW0LT6833SR4+uttb1eqxc2gXs7D0VsxSygWFtLk74gib/AeW6nRxVjjllEfwI39ALZNOzTkfKOKDSJ/s6OewSghqOvErtLQf6OWOgvS782xAowUbXsQUbY1r2oVUCcfDYsvdLRsBiZ+pNOv86uXOqgVXoeC0b03QMbhVam0mHcYqY7X/2/pUNRHtYIcaXbD+YFI2E2rTS/KYSWUfbXdWmMiI9vBVRZBkRV3ix1MdEFbMAyWDpQChraspyYxmOITvqsU42b++WMPE0olDNdbUlNXPOOd6m9JkIfqR3F27DWXRXmpdFiE+Chov87kzKyInLdJa3xuZt4BNuUKnyWX6mavpRAn4jzrfENK+vO9wChUYRPxsiAWJ8ECsS8iZxpQQ9pY/G0tgQOixphbDpn8GNqG0fMT5PWGhF/KpUQ5dW6qGRI1m5/dfJEjnMbgUU57fvCRRx+3yCLreHk7NZA+JlTsPNEouJ39Jk9rqhvbEjqaSe3duPguboUEIbRcQ3Hr+kuYnHWzwC3U7L/irEX/UEOksGlU3xW4mKOGCCxZu4Zr7Qg+6TxZYhD/qO/DC2Pz19w3yJPQPb6D+up9p6cRcTm7gqVbfLjBYarZDKEkD8S+dOrJUtM1Ws6W7xqlOZAXA9K7ORGdBheOEpWouAZE1Izhhz5IXyM11zGW7CYlMdeYubgBNHzwylNXIY3KDQxl40JRTgSk4lEjL7D/MkHLhdr+bb57TdidrxZRu70Je8E911Dh5oIESvtchoHelIRL+X/vAnMMYj/fgUKyNQDuGvfwcjolKKSdsVnj01GtQLed/GCP+CboFnykg0638G+h9UUvcOxFXD3urjDcSkKV9oiV4V+Zyv1piHOqZtL2/F1vaFVA0m7+4NSOiswI0lKlIqWdSTJjA2eMpPHUzuPb/105oyQAXaGkpwVmE6BlVU7+nREGYRa0wBp5YenbvHFNimWlb8wQnUTsSAsC8jpLshU1hcxhS0gOKhqfcngXhz5IVTcJ/3A4QB/MVcj3C2wDLWfuOgl1YWj+ezN1EJoNTEeDSQCMajtwSHNWI4Q9l54z2u98+c1ibYdKYdLI6a9X+54a5O8WIDV+boKPXG/8AmFH5OBNxdY79JP2G60KXhb+dA77DJBroAX6XhP30obTJGgKwj6sOIVx/Wl6RCBF7Uy4tg1C88ruTVa0sGR1L6va9w02DbhOe+HP/TQ10R6LQ9cula3phUccGDzDcDGHFxjVF/cMQpF3/yRKnUhr0obj7o3BO+EGb6seHrgU5L7QrqUbpr5vROSTGQD7DX5JjaN/NWDq6CpfSwXh3Rf1Msw+ZQ30PqBpEDAlSYCpsYPN3yr6G9xBtRO2MC3B9Jq2DPbiH6zc8+cBX8r1NBuu+TSCANTiyKkHOooJ1VfFPzGB2tv2Bxv5wV/PP4911qappdQQucvPFhTsUBH960h4217E1EocWvoHZM7Y5RmQ05l1ZXRsaaLCCMhIQ8BYXGQVBvfbDc0HK7hyXQxa4byp6JtDY7sQRm8EI30mfyt+j30cR7TkY2BuZCXcGwG88fEdNFwmIOEMLqDMobzDfFcgrZ2VwjwYyV8+U/iKdU4sycP5VSWL1Sh7aHITjAD0Cur1uOHnd47gcHcotLa6J/qR6eXKcQutw9/7iyJEzfSgK9lFhfIFLdxO0OtjGbT76psUfF5tNfAn1hDdudfyj+js8SD1KaA7dYr5B/jtNKGZsjZonUW62fWvU741IcdUhQf3e959UTKwXQbeatSF8WiFLhP+Rfjx8xxDrrKzYw0VbHqAxbeVLBXqGLLyy9fTRLxfVwfBMSrepuk0p2x09EmzCdku0oLSs8qpPgI5LBZkraDiHPub5mtQoSMWtoGo8HGUpSQYDTLHiPTJZgjuElXL/dfFHWW6Z+By7jXrg7DYkuNQGpovbm4hw7ooVZKVtHye37aRKNCVJ3wR4AIkuLPziVNwnXld2AMYBGCiVppxFOhI796K23ihxTVMCbDd5KHIEbm+T53ONDeRG59CONWuDiBpwBcVnCIXXLWEVrsIycae8PqF6QR6cq4ppmDqpCXDY2tthDtLGNde1w5LL6hY2ybzlV+HZGV73VDAgmoTGGQvlr8H0YxIzj7tlxJZWoREi6AaD1dumQ/KYfzcjD8cT+Hd1i9YufGlaApLi85HR/uOJH5gtCJD/k9vKjbgi8RcuCHDJkJiXyPRj7Tdg9VuNDkw3LuGltV8MDx0evte93pUYLNYPaaiJvfwHrtE4e3WNf4Osn8iWeSfD4xPmCgaJrKgM6IEh4N2GDaNYqqgYVefExV9vJM6Y8RKhjm5pwdse73LE/EZZJ0wV7jNgBfEYx2vI+12w61P7gvv1/7BC57F4c4CItesbWH7HW97SqnBB3kFjJSXzNMjMyWjC7mE6Ukd6bS2x3OBf/kqPBFhEP9G53hECEpxVLh7GC8/2klX1ZWhXJHfN0hpTJ3i3Q746BMbeVVm6ZuFR793w2QGnjVUfkKawZjgw1+N9Q83iCpQzrsGG4SevrqNpjCeMa/uwxh1jfygYwrtEI7Nccp5eZyx/zJQmUSr+MUawExu+l35sMYEf9w58B1DMKAfDBrIK7TM4flWfjiUWFJwJ+puyRkt1QITQ/M7evbXdYh5qAc9FlPYs2mMyoF9ApYBJDLu7KrNa9uxJe0Q0sCr6DIWisOX8bTvWRgqhjrt8GPkJBAwVEJ8j1/qX3kav1idSVquey4ecA1rGapr2wLTdJlt7XNBIf77IA32YuCv0kBrbwil+HRposI8Lb9nlcpm6OJe9IlbLikeIm58T1reVMxypuH+HGES/lQZju/v9RCp6KDAfNxdZerulrv9ir+eiU8IJSEfawcUNSP0o8cpWZOODZ9prRMxNEszWhqfcDfnh8RU+odXfph86TlzbACRkuliab1lmQjUWhxXP6iIw4mc31JlIEhCdzMBcpddYW7ZcVWlciOcma6UKZ6v0BNZH6wCZipvvAj+YIA17Ybw+ng17+WRfkLl3Avi6G0XK+FTZfKNlXSjVPZozIC1Zm8SOCk51gVA4e6DOUy9X9lRcE+QZWcwGMsfWnL8eL4m5gNCALBRlmMylhHvHp3Q8Y8e8fzdUOEvF8otvesn6hrmJ93iuvK7l536zHM0i8J20eMTUT1EBJrdwvlmSpioCRRBE/EXg/ZRxRSE6oCJKULoC10nUAjubxKlOelNifDXVVqvicTKy8R2AoGxFOWyMcjty6OdcH3w5ChRsvN7GhFP/09OxV4rMKBhBQhQ478aGGaga8wBLkcCqeM+CATlyPJkozVH30+18nqasvb7tA9mDMjFPT9SVDQrT/74RNz5A0Szqjrvsp6MjCRHifezWgy6OquT85Mi9cnJuK4lFMQIY3GaPel9SRTq+IRKxyTRAHg2ZbRU0XCi6+Vm8DZMJfEkPdBKTQzXns5CkQHBxIfaNxpxjz5wcSsgdyeIq4H79LEh5G+Y4gyoLS1Ov1LyQMZeKpc5m5zz9rtFyPxgYVpvLy92PrKE8oRJgmVdUOFobvuMsJGzEs+jhaMUsfcu/ZuJgtqUXENc1yjpVnTSgJYNHLv8RIYD7N34GzQIJUtTL9k2OuxQX4+ZUJ474P8n35a0IVsSmcjnPwRUz+/Z/WJX9XG8LqcWmqleetePc/48BFOIziagomVaY/Q/VWyaIsKbz7lnun4dgDyKUp9qzrAVLW8v35oQ/w4UdJnxvq74HCv/9824gS9aNTYzELmxY3fGRVBhERnq4Q9j5QwQrIqrTzgupI+gy7i80eoJ4l7tx7MUIsUQHnSMf2tWZ9EWIzQaz5dHl/c6m9GTSb5jXgZh6GXZxjjyaJc1ycU5jDa9VGFMhVS3W5JgK3ZPZz7EIUkgjK+gsjwbN53If8AzJuTOrPeFqfX+C/yQ+suOFBLDn86IMFx5CjxVpt7nJHf1htlglbNruqSfqh8oF7L8ubUsUI5cS55eep2qcAuFtoRFY2MCi/SgDB+XmtbNcHQ9ih9e3rPtzwYyBlE4lW/ciaccz+usKFsDLASL/Ui0ATZ14ifJrEBDqeYJv56E9wCcMUoNBtwYiLRwqXHDmeW9k4WUXc/Gt5wGDYutHRm8nOgnhtA6thdd5JuaC0SmvRZKxz8rqFO72SuFuWyj5HjvF8Xtn9LNc6fhXm6VBQUi1UB6+9GSEVejHZZ9FEJH+M7o9UOWnWBpGpsAXavgVM5aM/jrmHBbLgpBFTAbAn4HLQZJrd470HXreREpz2u2Bi++NgbJInp0FECKiVvI/Q2mUqRtkd/8GLB2+hYLIsM0rt5TAlqyJ7jK/BZrzPEpaZdBxnc/hKBnbwWaZM8RYa1RXEHd+/eKhy+7/4soQxKPRLSqPVF1QJS6OQMUJKI4o43cIQ+mtgBKv8T0HW9a0/OWwR+iNqtDU76eXDp/WLc90Ys1ndQIcMl7hz0a5hfQjmAG/9x7KqRJ0zKtZKtwf+mMou1EQM5YNtaNO1G4Qm99j+0yEWBdAvNT3Rg0BMbmgLzCdwBpFAaq2/i+GiQm3zTICtQclUcC+UCs/WlEh36LKJgojjE8EewW9HsLP0KM8eMJDTwnSgVrB2rMe5xVDp24KGH8GywyhmmJQJ1u9nyCTAw8iG5SqkEyxJvcTGBOcRtq79IM1d+ig6RDV0YQP7OuM2LAy3G4L09b9Pv2zijaYkiDLEAI/a+X4kl0YcALexYMo+maGwDevBVsfqGKVfIyxjUA5eOMT25nP8fQI6jFs6QjIvu0pR2noR41YQ+DDOnSEEe/Jct6wZri/8q9n+XQj237nMU/v5i5wVm5qatTl2nsYjtI+K+Er5zb3Yi5CLMr2BeQKBJ/ORSSzJbP6fz0aDHVfF2in6/jdnVz2507aglsRlcrFErSU3aULFsSeYG+hzDiGiD1o+5rsfAMwUjlp2OVDdkhJBuxFpy0qLoLf4epj3J27k4wMCJbTT1vGEXjiN9tD5V5D+6pFf6d0A1MxAljk+yWssSbdR/z8NUF4xx3/IzbWsRAmcbvp9rVCIBNQLcmCOYM4Xz8uSYZKnBoK/tyA8yX3NaqHcHaB0ZK0+9bdka+LOQxBh45GIB8yf8ePplwn+IEilQvw/t5pnXmaMMS71T+MyTsl4KiWnVQ4rKHuWHpkHNQ7T2S1k2nEA340Emq712UwiP92pNIfCvGJQrQwEVooG7bIrhD0WMqOzqrqA1wwLu7JvbBY6YmQONaGGObNek/IcjuYIyIwe/JZhPjWSZzZ4VSXJJbjzE5xGv8a8jTxmTy+FGnM+xAdUPjuoPAfH17Swf/Rv3lDq72AlbSMnEKkX9kSl0hyhOJ1vjf7BqAZ8hg7vFtHHnQLyDjj+TAGbIGJBj1FyebI/Oa8p5hIaqyU/vKsLs5i2nBZDNymKveWCsM3Z9Gv4b5KXa/7gyRREl67JWRpGXgZlGeMgwk8K0ncBVkxyWzWjw2CXOex8deufuq3XmkfOkGLc3l5+kLLnDJXWUr1M+rcfylypBUpChZuzKayLT4iB1QZM12+dUX90jM1JJNEc1hlqLlrAcqM4z9WZgiCt36E1GKYNvmPMM9bNMp8EvmXNTbeCDLaRSfkD+LBLfkuvFhzsgZLXQs6L0e4dpIIEP/Wy+ccKMzieLO8K1mGVaTq1hPUdf3EDNM0vvYcFPiqQAdZdAg0QNvF/M/I611zjmKKKm59hVAJ3u8QU/tP12gNy9QmJuletLauHZH5Zzv1dtgz2Y80IflL+IQ38WFauIVDBoODpILt+xURPEk0NWhEIVFIAw03Cqzca+miqvzXapFrOAV+yUIuFQLL7O4eOYns2N8WbbzxHjgxJwxeTBJvgpr0fTM28kIiCbnmdt5PpJ886Mdd8aCzTmkF2yNITmZ7lcw0y+0D/2R2Ddf7rbJ6qXynJEoo2+sjNb890wdV9kkVg5VPP20INN0OqM/2kZA3lWY8g1TKDC6HOYnJ2IDHc96gQxeeM2t3RXK8d2eksxyJy4Nwjgr9ECKpKIYAA2TKbioLihBgl22eIdUCf4ql7d/kvS4OFyUZpBlIJyUuXgSKNJujPBjj5sVOVmfpyKV2qbaw4Kw6PTetuz+JmbMYW/OyHzD2MFDkGlFsf5m4QnrZ8/ayme1vKRXdU41SEZ5dZdev3XWq3qWhQdmMfDNoPTm0GbTyC94JAeRJG5o8Qf0w2iJa5nrZ4mMbidxJ3Zo01Ocz8GyPF2ilLCybZbijp/7cTwpTJC+bSEOMa/D97HCkCRYdOEROBe9j3Zhw5BDLOb710kANnumMAXkiNb5QE2fQkmVxwcwcW1QS5TdcfiPlEkKQqT0kxEO0BnokoDslRWqbXQ80OULK6OYUS0xnf91rGVOKm2ASPjl2NO4lIklw3sYmjttHp2s6Jcvzw89lajOJNL5fkf/6RwPtth01U6grI8UzY04ojvw955cMAa4xYR/RUNjQtf9nuDbbdv+ZI7dq0lDXI26WRhZPrt7EKACoq00i+zLzbWXig3o0m8paCktt5lJnQhNQujX6BF2vS5+WLhGFew9Kt0yyG8ul1sd2rNd9v3tw/eWUAb4beHinkVj4qH5hJUJqwAwdPzwQh6/0AdLjdSIK2MNftogPxGxzpGaadvJVHaXxwNj6D/rr3qOS0GH7UBJIjfBR5Tdcv4ZZt3Nw2jpBgXREBukdTKFEUMQ6sxsAI3fW6Mpk61qjmM/vPhANb9gF7tPD73850kssrdTp9nt9xlgYyg0oHazESBnqX78+IcqgUeSKI5mk6wPIEwOBlUquI8J3qczEkzpaQHS84RMkZGE6ZDrg0rI01q0XtOwSKraPOBxBeyX3k0V/fBnUUdtdDQiB+SdSH62wIYfZoybhSn3GghLFGFCHhMuvvNu+8BBB5RCBrl4+yTB2v3gscilAgqyOcRyZgY5lkaTRWMIuUL+kE5DHxToU0wu57D7InNXRss6jNUZfGd5h8ORpDcSS3EE2TQVwlWXrnukvA4AAkzAHS+G9fZygQT3BgufLfdZ6QWBo3nO1q3WtK94TSuAUuFus3Phlt+Hv85/yJ0CFHlApk8IHU0g1wzsdvKjsmSolDd+BV6FWKbBEKi/YIOnk1NxYoVUXI5VnX/vxkPn85Jq1SAWFoHWIX5qne/fyeHs5dYreqabjN1B8xA2MvTRicjAGb/h9cgRmPBWbV6XriNogInRfTkNEqJX3T5eiy38WV1XHIkt3h+7BTBBIWbR4VAf8t6zl6TfNX06n8pwMNe6YLsay6mfmQxe1WGqVzPsnr0Y7rXFG9X9RToSBuoP0hkSEKPxcZUti+Z4BjuKP4cO5LqyKBl0w4EX5qB0UbNX8glAwbbAZiCfqidfMdvXLop0cMsaRxNITWwxqqGFI5dwW8USUhygWEOUh0YAEXVBJ1Igzbt2eeW5CmGwNXeN61P49CaQJInIs7dDYVyQircbJd2jhfCcjld0+S1itokyo1ROZRht/f0UaiZQQhsJf3vcXw6GauUr6WGuDPsN0cRALVGanxBFbIlPGgzfLHV5BXAEQq83dLzw1OnAavaBEii1eYtj1DvqcMEIKvSEulkA0AobhyUqF2NgYN38+tcqCOhXvDc8bNR5qPiUDr/qPz7S8aP0PtE10+ou1azebeHTG8UduUJX2m9h8G+1FEEpu559by4wLY2Y7Z94JLg1UA/MLdxWz1XX/ERf+yaWQXaXMFnwRo91dfoEEBlR1qPcc9Nn1wjZW0ftuvbK9Xq8Gc6DhfqKJLuuRYcfLSVpL3WNwv1S86uM6+inTxkP0Jhr9DSHip7Sf4daq5UDAX4Bfv1dSr0mywDqeXBnpRoapgNE/T6yO3VugBaoam5R7vJS/xJDqGFYx2ZjvzUcyTf1dZb2NWcJVW+hV6//ZD7dKFbUhP9qYpRCWzSyVIO2pjX5/gQx9Wzxk2wT+eNLsts5fThM8tDt5GjV+OXFeyi0JNmQeSSITHmh4dbBoFZaHbZmv2z5S2Oxicn7ukVeR44v6ghLjM/6IR13nOS8fUQR5fy8FY9mDjHFWjJd89EdnXrzs5Hmg1LeNsWrMre6lmLPXc8MQ5Y0cfLblCJBUkPlq8trhCTWld1Kh8JYO6gMNWQ8S8zjz31rDw99P8I1pozzmpMigDqcxsYUrcGEtJtZabt5pGAQdcJ53CpcS9mgRtztCDHhg6xq+InKu4XgXSqN9t2OwEVnHdxTdQO/BFQFCCdUo2C8hAzn0gS1rXE3AJx5kZxU4uJxt6XooH0uz5viUWGnMmkmUOsO8qBuYgNTCRc1PZajKSuSUIQF6aMz/IVH4puwwVHrVeYEHOTvL7JiIqBqQTvV1LQ71iNcO80RFUTSEPx+3i4IYKBn8FzOAcAIufDXYGeNzJOD0IeB52QJ1+HQl9Lvvrvmotn5EwdUrNXdQlWm80gZSVriuhFnXIOo8uednSwkQ6vkVh/jwtgwbvIDhqjY8EIHbiCRAcPiUvKvSlY/1QJTiQOlBt3mqZQswMJKSRYrK3J56giNAVNVtlPX9W0XJqWgQSQfJtFnPw7DOCBCobx6o29RhA2Gw0c971skKoSJia0OpQsGUYLlAuLpWqNo4nFM9lwKu7KGf8BU66weiIa5lxyrYlFbsT3uCV3ggGbx1qRl9gsndgiNP/5faZdhaTaelKMdT4OEnQug67ruE7YM6ONQ8x6IIsGK0bjsv+j/uecRParxXCvGGspIh8NGnOSRri/0XwG64adb0vvDH49ZSYXXiwlKWZCOzja7e7OaAgOwsfLRuG/mgN846lD0TL4Ag/Mj0jMmhFzB3uP9eexG2AWClfa/i7yEjh67+14TNQ0T532Ni6K+I+I066SiTbyyrkJSXaYTTMJVCSlVtP56748jBdGChtTVFvr5xjDKjGhJakEBTDE0v4x6eQ+vTcg1tK/wiGZmOX3OM/XIi4IkR+oBkB4tAXKJz4XE/wpSsa83jdy22++s0pmMdiHTeAZdLZdTUnUsSZ01xWytlHEGMhnzfDYqKm223bSWzs79BaTp5Fi0r7WxInmJgMC6DrL/I1elGBBGJzw9DUr3DCiVvbO92aOeBXvLGdVeIFKseai5ucK2ZEzMTIPa1jOleOL7JsMmxPFr5v1G7MbJA8ZnrwscUetZL3j+TC8ct/0DUMf1OTAvyX3ZiqrNSQpOmd3ERFEa80aCSqJpvenPNFyl+fY4iKafR6L8+/vkScIDdKC5Q2nKNYQJIrUwEJVJwWgWP4HrXgXcP/hvVr6AN1Cb2nHRSNdLrL2vfYVCcV1DyVh9afhB3zJ5rhm/WTAeoMcQikG83WrAJ/D7gvzw7U5GfDM7BgwdaZWgo7jdwbFTA/pC8kncwMyAExdlMKPngKtBOXW1X1skU0Vfkxll+HLZG11HPKubv691XPVEAkRHYKnDlNj13WffecbLXHKntoPqZtTAqCQFFGjcbz2B5KdFWFe//XqxTJdAfaRGlIoUOCBt/YWF9obwy82nmgN6sJ055Zc/E+eUfqDr/0LM0IKJ1Neslg/dbaEuj3g/CLdsm228VVlygv8PRmG3rEdtc4lwxRyzTW7wmJCFsRzV4a4irNE/N6EbA/RK+AAUrqunC2gDNEouHlZZ2riic+o9+1QFqvrme0N3Tc0VQPRF8LXZ40yeeel5mBBd0B/ii9V/wB+vCkaxcXdSdJGnsG8SBT80YUirMaHpGtOx6oN4M6j38ybdwlXAggmnBI/5C0XUNe85uFnR0cE1G4MJviPmiMVNOet4BvgQlkjugavE4TWDcEdwoyVoPSTIMgm0pNkGqTsEgQifExEG5Uh4L4CIjXRKkpmSMGFJtCLsKveKu8fO0941hiLNvIGrw2KiEp2YN1g/RnRau9admRPqP+G0leTv5r0PJ0K4am9APRngmr5G41N7oj+OJpBtDPxXIYv2md3YkVatUgKk0Au+4Rel5bNCXHmX+F5Kj3BEoFbLk0EN+CeYX1gex0L8DNJhKUb6tQ+Et9netvllkpmY2/4pQeXq45KPywX/QikGYFBKS2JFGawlfmiyT+8ApfeSvip2Gu2ozZhmwT6QYcsAlcuElG2TILpga/+I8yHkYnuOtOZhIH3DaUzlTM1Hg7dpqOrTes9WuCGm2ZS6C/iqfgQUcti8llKn/ixNNLbc/EkJZpkgfxw20RtjRt4KmhInP8R+jYxxv8rdsvOBxIb2YjBhnTs0ZjESjI+yUf6BACKWQso4AsZp5KeUnEIoAfXTVCfEaU+6fP5Sak6+/dnoSxwUZLuLyQTWO+Sbnrt9yP80g0AuTGclB4v1mSNDrneEmpZ4mor2BymFdVqdnlGFLPljZijDRvdCJNLev1/XebgWkw0q4XRTdbPoCbsSaWtEF9Il0CbSjQMVTi2bHHMKtng5Xg/Vm8DeZCDXJNGjsspMq+QQ7amp5Vte0GGwesooENoEyaTXMDgTrlsmU/X2xnMY4J16gH7c6q8tPYtXGWVXmVi1HJl2Pwb/cEXoY4JHLced0QCVJgnBc27xP3Qq69hjME7MwR9Rz5vzioKzPQh9v2e4Ap1AB03LlLDWPugpnEFFpCuTisX4lrCUyblplX67cgKTSbSf1aGYcCSmCkYt4dlgqXeNhhT7zLf+tyCBD8LJZGaWn69ISBcNwB3PMrDYloWyEkFwH7AhbGpLtBNui6y2tGez8DPHIzakha63uC+3KW4exWlPJMg6O6LnUzkK2THXfbzpkoyHtw2k9DykxXt9NbIV5eVnYNcni4/jRbFFuuaIn+3MMnUN74J+cgjNXTZ0psw1UOuBiJuj66w4Gz2vl2Rh6Ze1Iu5ERHIziLGCjWSlnLzM+vDbEju5vh3+braLt1XfOj+hVTMXAmIAbeAGblRCYbM3+gs5vuWGturEzoUDGtaoyb16GFpzXvI6fdcYBvyMVSkCZwMOLmxpD5vyTyG+rM2EGnhthodR+CwD++JjewXoqVc2QVPXVpmqy890JyUQgQAepeMDwy85SIqUNvQ7dIhYcMc3Yq3cEOMB8cXbh7jRTDxOMtdajU5EYRzZY/D1WdR9Ja6KmINuRR16i/MvSZ1JDwGhm4tSDFWnexI+Bxl5el4wXjiz8kZL18hzOKBeoTQrQs47e8uHvo1lsYUbwF7nvnSKRkKQINQtb6F6NCDh4rewpYudw8ntxKVPEv+mPDuCUOo7VBrKm9aHF7XlhdQVxoew09S8RviN4pUqk6FKlSghz0thxiHv4Ezy9lHNObNmZhObYvT8euxw+e6ASWmWVLZuXQJ/5noH6ustrcEybQgwRnD9jB1IMiyyrRPbGIkXkoN8bfjbi/MH6cYBru4UsM4k12uAhUsnmwk/GUYLi6LCAlo5TDtXFI7p1M0N9xo2VGDXSaUvE5IlC5EjGfRq5a957tJUUO8XVYKrxrlcRwAgGVBqFGqdxp5h51NUhMbfWqM9syB0z7VaI460++IeJeTvIMXkTiGSVXsOrgEHZMV3tCboOpRJD1fGxzh6167t9c3AC4WIbS1vY8HFn+JuKhK/dsQKgbyegehS6nljblrJQRtArYJHCWPMqGIRLglTyDzTzNYDZpELPKUNGCC8NsIq5pDnr4F04DsT2rMR26Ilv46xxpzxL0l1mllTb+d7kBcDh8x1Wh88rDnhB53I9+OwwNp4IZAVjgB7q0mSqlN5bg1Sazw+ET/L9TzLViSVNmshTVPsGPEj6RwugMM974wRMt45KFq29Ny7QcNyDuMKhWDPB75HyLbF+4i9pXZr78m1tXb8Chuxx4+rBnr9l1hegr7wbsUHjsny49Ba5rlBfwu2KQpecXix9ymTgAvLOujsXyRqdAQdUL64UwMuiXDzO6igUh+xWnTeomOlEI934gm4UbKuc7I1g1Ol7NFDihtebYDU5Db2lmqRbkxEL+hFmL8miANxw5rxnjlAyjwhQyIDRDSexaABfZ1CB2cS+nKqNLVfb0oVLy3jRbB933H/yTuzzf0YXyqSZJh591NIvojy9FbHXa9lUsDECjkMV3y9yI4qHYKk46z6FbJnPgzQGBW16H31U28DLotNIPkhYQ00Ky6FtP4SPZwtvDX2Kz8nn6peSgQFAD0y5a//H5cNCdFXbkFvAE2xp66JA0nwG1hy8GtTVcMYy/Kvq5WVUY/qGNJ36HHSTRmHp3SXa1jhUc2DwWdYV0jM3nRcAS3yuOxD8wBtvBe5K/Jxlie2RfJOUxCRfk7gtNI4TfkfSNFY6yvX9tWZa66OExb1ZELb/IM4yMh2h0g9CRljtBbSvMKJTpYgSYOVkqX0B+lDGmVQ9x5whc04zmjuILgyGnDlj9pwG2MZg7O3lEJSA7XV6cZII/HacnHnOE9v/Qr8iRMSNcivQFGs/fFLFbdMl7RYPSXPV/7BS+bk6xY3sAweCIfyf6hTmmxoL+wcjAOX9pL3tBzm7QInI7WJAHs7CGhV1T55vsiJldWq7CsYwEnFjaIiboR19T0LB8eyhXxc/yERLNzjwIKHCRUOYB5WMx6u/K9FER3lC/eLxz6LfMMJfCZMZcyd+eDgeusdld7CzcmAd18r9ZuiESkYGNV5Fpiqq0SAC0jnzYeIPvmgfa/6hwoLLpy7B5bKY85AmAoQL3H0AD8/C/rNrMt6d8l5hO2Hn5GSZrS6skH3N4/mYeOhH/cXBHFIqE4boSYhJiUeUft/daoW5f4TpfGVoO1JeSnHVeJdLcyCH7YMuo8zxqeX+CIUfKPc2VnxVX+3xHujqGotAjL/lImv0g6aKwfn6SlGR5VK9WHdHNGW4cwTlcbtR6/suKCIIuL7A5xvLlGqrOJVY2gM6gyKKMEtjV3/LWI02WTm6H8VAdY+qpC724juUrldkBlr1kMANf+oFdbga485+N3TXxjUmeNloTIaaKdgoqxeafipU1ma6fOJafrePoWzaddyMBCFtkHdEMB9hiE4B5Vs46NB03/RVdi9XlHa2KZeEoU48W8tHgxo2YZF9U6Nu/1+2V6W4Y7sqdtX/Y6zFGESWBpF8QUdqma9ZmhB+NLtbGVHz4UtXRVAPejl8giUM+EGyn1zXg0NjgoXMRMvzuGJEGVClaW0dj2HydmX/YZLlyYlNoVeSg40tGWniW/+1MzKx288JB/8Oyxayw6gLVSMuUIZF/F/oQIyzJnsOhhFYcISZoWjyReujsRUp+rTPlVnlPZ/ZOSJGHSeh9H1ZKNPug73Du01bYeobkW7SmArTrzYj2hQMiYzMsSQ4rFJ5I9V8o54qVsms4PghwUVUrTO3yve+uTcGWnV1Nwf9qetTZEaAuzuvOUTk/+AEfa//jZyVTPpLo1Q/XumHVx5T9SiO+pXEFb1PHYE4miMmZmcVS5IGUcnV8cqXu6ACwi+PnsJZ5a5fncT2nv3mF/UWoemBs7E8BNitrbNIoSNb2LJ1eDYCZzTMAO9bAkOhnP/iYOCcsoyro8G/rGjU26KviRnG410JbLRkfEu6k6PGJoNHwF3kgQxbmKdGyrO8NMm61ugpYwW49Rxr2+9At9BqoHPtEEVxMsg/iQzdv1xjDCnmI7VBPwj0n8QoBQQf1rEYlQ51gO86Bk+mIZalJYUENMYiU6Y2C9Eno26wOUOwI6BfJOsz39+a8NsUTEZu/7TncfF0i612T9bcXnrDqt0GTSI8Cdmva5SJJZw/1gp9CUF740Pc9AHZgQq42Q7BhJgYWMevuiJhy/f40mTMHVHbV3rQb2uLSC8fmz2P5iyjwUd/74SWqW75nz9NhGRveSlXkK/+y4fSB6Zyzv46akOJcho/Xu+SPuAhWKih8KGQNElramiGSI7bdsNNBm4yLDp5195iSd+9hVy/uoiV/XhbhB8VNzDfNt7UcyjDIPj4u4uIQTWBNry+Lnc9k/cbkMHekk/1fQBjun4Fg9/5ChOBMeWeWLbruV988MHhvNF/dJfpWmJZg/5EbdF8ztk+8yXCUSUZjISOBCPLl/KNFF77u6MG/zcZ4z9rPppw6Jia+rQO96mcfK4ujYjHEF5qVl917ZZ3xZ8EmoO0xF+HBSuqmKlfckq1B6Bhk96j+Ku0CiswNkcrbi/yUx+7nnGl4H2FivEat002MU9tF6W+4OUWx7ZlWQqa3ofFuIuQyyMHo885GYdymXQ6p5xbCbG0njps6707YHAcuTJqgLHA6L9ZwqGrsIamfsyPD5+miP557mx/Ox8ugEGT20Yb4m9BXrlpF6cG+fYpmUur2GYCj/i8b6a9TiYINzo0v0R6L0IchxkpEmgyNnp8fNp8W6QbP7t7hlqoG4CKmaCE7rAGVtbU666ZHm1WNQVFYALVLOwp6qqdeH4wiWDGptxjZmQu3ZlL1o1yTyAnUca0McFugu2A1Bjfw5+VuKoDFeo16JL4zBXT1LW0oaJNa4ociquhazLDTacZHKh55ixEl6uO+yGa9T86Ff7IjkIHUbUlpMCPzZmXyHDEV4irtJ4QcyugynYkRQrUivqkgYEPB8L3ArVsSpXYyPpDuSWwGlJ8EOE4aE2ZOn2jGE214lQWmCe/sNH6ps3c4jvzEY+C1EqQ4ff8yZBQLpH16jiCq2r6WlzAUhuArXXaOAl1YfmXo7MZom7vifMgyKXCY8Bvhak7PbUjXjw2O71Hgo4ca+h4knzVU/rvtXcWs0ag45uQu3jwCQrIAt6ZMv/kv1q0zrGeiYdmybWKlwdITE2+63S4HLVl5oljB7gMaXRjZWzfh/THwvqHtenqGZnde111CNtb67FnrCYUpIefjIA/ZA4GiNhbUXWEMvXvHeB7mOfI0cbAT7deGHVfueiJvAPVf6XhcuxAEPmk8CgBPTou4zRk8EE/evfa4WNGpsRdSlRfN9+d6LlnC/LmyYkcu5VpCTxMPCo5AUD9hW0EyRyiHhpdptMIoTQcMjUXVVzksIenpdONvL6n34HyqFKA9ahIo8Pg4hpgt17a2liuS7UXjy86AK5W3E2yZvqX4axAJbiTSfztVtVHCGL+lchUb9he85mCqC9MiyBo/A+bR6vIoAoTKFoAI+Wf9lrgWDO71Ni2LJxSC9o1wk4Re8/XQIpOqkUHx+00aMqzA/LN/YeBB6M2RndjtcnxChcoBDlcI86KV2uZevdGNIOZwPg6LO9mU0hgZHZLjWuiRSQB9xYkTWd44u/6hIxFXR03TH0uMioRNYVogK35k7Sz4mD704VILagz62aowid0ubk6280ucmy62yxvqtEGa7dYf7FjiAIDeaVinzREXd3cMWYDnOVuYg/scp8JzgfMWEFk68/dDwI5xJshNirHxjjl9pBApnTs9J0umKq/eRnqQWBxuZYLDBsRbtazDiy5ggPrQSto6vkoot9PDUzQi19qOtccN9Sj0TI+SvY19EsWzyAJUpGXTpeNgmOTqxMGQnogdFvCbMzVHaaJdj3PY5DBD4U27rg/9vEUr7v7QWyQ+RPlZyPJqWd2hVh1K51u1VF1i6VCFHo3F2oEFZCyFnl7elggJgcqPYQMMXWs2nMYYnX4TIahsgTdt6ITdHK8cw943kJikmzyS+SQvK3+8nuIVdHmSd8bGOU1pTPThuOc5fomyAsxbmMHGKsfZiY0h75iO45OW6+pSLKx13uv1dsWm/mZdQpjcWL9LLesEc3owrsPbTi6cP578aGv4V1ieIOYN+B9wd2PRA3S2kqG8/DyTwTMquQNhm7D91uzwi7h6/vOulesYQsI3Znn8x71mfT4rRrC36dlUx/pPYTMdLqVJIARGCpORKJVeTEmhxNJltMd2dGmjHL6Pz0Vo8SOhSMkq9H8w2QQljnI1jCbwJhcTXFcmgCjxU5ciRMhH7SCzv8uEA1nf1DusQzQ2oj/SN2q//eSSEzNC96eBxXa2v8Am/L8mwazjAoTmUAyqGNoX2thYYBzuQ450gX3TPbRfYceByDNox/4d8hDFjQdpKn40LcWhMvb2TdUJfk2iEN6eVM/mkUMZSfgFexY7nKTWF2kFZ4TM01QxKufcjrxnpeOPmTwm8OdH/IHJNjziZT3gc/SvYmCgnGYZC62Lve6ZTxwOZ5myFFp7aPjRgr69M5okWOyNykDCAFRg+OGGkPJxBsvk67L/g6Bpa82YjdsyE32nXEYUTt1gHCCFU2OTsO9GAd3Ckj4LzkSy7+/YsnvHIVVejcKqcQYCT6lUKvCQPkjvKKamRYBxqyRue96QPCBRs5Kk5uOuzG7G3lZV5KyTDgc+MwBvk2Q4bD2sULSXrdeUik9tsW/e87Ha8vu/2IR93qm8Rg3nJdphqawM0tWMlIxRnFC7I4DkRXZIizmT9qF2d2CIVd08P0/Wz5Rkj/22U8NfWabuxWn1PdGyNDIZhMrmSnFFuAy5AWSGyaKSTlF2ejLIEzw3Ur7TEneaMsYV9YIt+3KGwYEJl89nASxQYVyeCEs5x43e3EukiBvlKtVKfazEq2Ar4Z5Ya6DlnXEb0dc1nuiYgqwYzQnT+ULPd/hqDrlsuBZMPXW844BZHShxXJyoVrVaKbKSHTY6teVNVyB9mDFFg71M0ru47KN5sZhBaj1/s1/A1G5Ufng9bLadS1YkrtKLPmknE7xOBbyCAYoceibLN0HzMrxTjpqJykxVa/93MUZwfa2zsXFZNaNDac4cCeai5Q9i4EwImBLNMY0mrgJesF4bt58tB/b52WLSYoV8H4bT//z2faGJpiWH7g7wR7qD/um/IIO33mSE4j4S3AcbUnLfX6vVJuiCV4e/oJzoviD2KyWkII98la3PFsynq6/scIFjwXS5Re3J6QVO3p4zlLywUDsz+499z5g+X1DRzwPvD4sq6LJ5xB4Ds0A6+Mb4EcLX4P9S2Saswa2sf7KcOwHMGKf+kgAMImYxqeY0vHwEhqdPjOb/0qC/wXQU/PLpTw/XYQ6GGzwhWNg0rs5WWw5vNPWVXSnVMQhtKcbiJJhrcLOuf6i9EV5g8DvJzLxwLBgn1Qls54xeRnnw45bAQ1hFK/LqhjVBFIk2DydcEcb+UPKERR6Um4VCgDn1bLnC3uEVt+tnh9d1lil1t6cNIWg7KoaVgJaQX3I7nk7OB+x2v4zD4faqf2NF2YlXK0jAd3ZDep2Iu+t+Bz2jhGqs5zmbxmeV8hvHu8ZC5lmGH4nKj/wuJjxH7ujSEt2EJYzZ5lwciI1TU5fHG6iJJ9NZfgxGQi8kZWVTUMcPFQdImu+uH1youJIFXQV7LnTOrF3Hk8AjdggJbG8WxBaiWOVBRUb9eHZuBrQlV5syLRJ5sst0JgPDeeisNLO4gtIxznzaTfrC306gAbLQqPMk65OaenzbV3Hymm0d8TVLPw9h+NSuL/6bRvzsrcYY6TgHU1rpFHTZ/2inW6YMmr2EYHcqLqDaIDlGlbJVKZjRRO/m9s9amJcxxtCqrZ4s7NawQkeA3Emwq4/UMJH1+pufkS0M1yQRhg0XOxfrrRkF4QsrlBUNH8agEOY1Gga1s9etqCFdJWGwx2PYZAt+Ujc555MKMjm83WQLxUYiSYJfALok4SClrBhR/zqPy04kwqbOuDa8rR5lY85/atuvePyBT9fl7wqStJ0l754U07WrUYDnVlGpD34vWQE1grq9A0xOQpLstvg/gbQL8OERzlAW2fP34Sjm1QVZDszmZ3G+4U3a76lm/whuSlhRCFDPP+dXLzjVS2VVvJZsB+YWpJ4vEsbLUEAJHAu5cIyEPb3cBLsl+3tR9Uof6ozMqMJLkjUDrBJBgEJXNpvD7/N8QuSvtgZyppkgqs3ikuFa6uSrFR+E4nxDeUkYHr5KZuXgP80OjoeI3nFQrnrZQvmgAxeyqRzF81d0LElb5KwlF0OZKPoerc5q70k2VaAqcKdl/0ZN+0ZFND9Jg46q+FiWPt7xJt5pUr4DTSDAO/D8UtUNfV6cB3y6F4Hh+bp001TKMtVT92Y8GALj4plMkoA0F2sMX++zqqafpt2EhOuMAQ+VirAl0PN6lcm0VqrSFvNkbrPtVzpzrFbf8+SewJIDltJvsYzp56N8K+L49SfuU+CscWU/SfCLQxomr7IVrvBvo5rXqJhILqUrNWLHroqN0QR6K6G1xibnsXDjQ6jRiAGUQqzU7Mywb7OHdH86x8M6+SPgQTVq45E0Mw6N1+y7m+p+RJTXXB9Xmhz+kk0/jgg5eP8OE7ZG5/Hx6H8ORvmh26gd6drVWypgEGQEh+n3ty4ma6u+vLhaUurk3Ifne9Yo8Vp0w5NxWoRxHXkkrqS4UPpWgl5Hf0c+2vao8vk3wCdZ+a1agTc9r5CZbhpphjIzVw16hqzkG3AxhKeHpKfrOv7HJPRw5u+7539rid8E0jQyvytEKIuKynoGpKGcQu5ZIvjbERrgc48MSP5a1aqmI5DN+EsV86AXv9chxNROPVJ3MS+k4U2zMids/6LCIX6aEaK6Y24bUaLsJXxKyy48krDbb14vEmqEC8R/HrO9BrcTJpGLNgc1JrnutBTzigkS/YIbPOZS7gm4KoPiODcyccqUqP/7W5eIZAc7F980MSYpeGmOtRJG4+XiHCV5+3TiijcikhmJfH8AN7cvOPbaR3uBbChN1STgRbp3ASYlKs3CBlenX9f9QV4npK1d4OhXkaJa8tZcO1hM2oEnxjfkei39whHQiGaPvLQjGp05BtkGKaymjdmlfSMBNnsk0bSTSa7qqn4dndfES21CrQoVSbMVmwQKsmpMSnw27or86AGXShj5U3ra9/KU8GlBX8XAqtxPrx8wgptAaw9Byz1Qa5LuMztTcwgzJ5CGoodXS7cX+0ao3MzRi16vkGSJY1MkDvlMiJJgtcSXQOFJPAz1Z11OaJSpsTpoF4ujbIlT1QSwMo9qrmasamq5VcyCHpaLtnMfKEtMIoYBRXZx8uT9iPmubsGjMnYfFIskNWhNaFxGKz6NQPhkQH1FUALUVnOfn7UCnSiiNUPjgzWN8FZiOkq3M8PnLxlnvXSnxWt4ikCQNtBOAnJ4rAR2cUPX8i2Vaa69OsPgTbIIbSjLrrIpvSvAWftWt2eKfnpVdssEfMBEDxVhyDnG1n79gKck77rnGiCdP/TTvRhenxjHfl5xcN6hk1+97Ik89e2pI98940WcdkWbeyP/bfYxRwrFh+fy8AKx7baB+6qoEBfD7iz5tXgGo/vauFbUI5UZqFxKHet4gBlEHmREtB49BeyHxYjOck6P9zaFdfrDPeV4oitqx+tizPTwkshhPJKGiwd4iwRMETXc2jMTNglNq2akfEfJhn/2npJ/7OIR2ZsS2xYtoHi+JDoH52k7irRJg4ZKI+cBcCwJEFvZ5SQHD1lTHTWvRfOhz0oDzcZXhxNL1NBoxKUTtEg+IRWBrbYeJBp/3/SoH/596YMhhg0sacDSYqXl+8jKCOwM20wFxeN1RXVXec9zrRNW6TiztzR6QvNPQhQ7/iQPz7wFNG3OHidbhN5WetmfsoZBUlD9+1l1NKw53o8G/TCl+IhC8DWhO+Q0jsjUc0e1APJD75UvsdVkhoG6pUk+tvDCvgjaI6OH1JsGKWf6d8lxYiyEYZuHvdM/lhOj1sN+16cE+yOIXkkyHr8wjxU+OH/rjLl9Z9uoggDH1ubk7hfsIx5ASxr4PYP/I1Hej7BY3J8TXlF0D1x3LG0FQQy13juxAk7dGCoFSt/ZahGL5Eo4HAQMOtuoEuJ/HvIYPq0QvlljDPMlMWfNVLJbAGGaYE5IPYDDJSc8vEu5lhGjTTSByvwYRVWj41gJQgwRakU2l/VNWHctla+htl2GV6ZnRwkd3f/xVCD4r8jx7thgTTKAs8BEWSBrLZqR+AxRlVAFQcypDLwF8Z70xOAHKeFM8t1JeovILWc02BBjRYARjuaxe9lSTx9MxuvgMR5zjZl7s2ScF/1Q7AEFVvVBcBm4247S/CWf4vaKV9Xa+OQlDbPfrssZzj5K51/TPqNcIfvCKmqK5lGJYzwsGpzdWGmLJAj3Y9wXJtM1jjHHyDPDQN3W2aGHMQosQwSzmO3cNP44XDCV4G6ryccN8LZKXYgZweTSrJoOj/QSiwsxdWqdq5Lk+tosUbIGRxBNBXbT5xHjwsztrnuXEUxhHaYXeOsphzZ+gwa/rHBExdw0+/7W7xxNCQGqI+rrfryVGSi5ii+buKIYPuI+MbYpg6wXzZ9MHBIAGRZfYyCl7UgdDqsFlt9Dcn0bLR36LwFRxrnwQ5VVipOWdg1jgakp4TojajF+4eqwx9sfVx8LnKqt7I/kR6RdNG/q9KXxOT1z0RdN+mW5MFlGvcow50yOvaE0KjfmG6Ks09hGtlgdrOrQ7FmnCviFqtptlDtMCdNUtuiFK8ydn/yspSGzg2Ep+clSir6Oq7NKhivw2PcNy1vz3C1dRSuIwj7R/Zdo5fR4EA792BUmw7pYQ5o4fDVIxKZZCX9ehHQxam1NxXIYqufcrjGhcSVosrp0WFwSypy0Jb/oJLcXJCmc6FjZTlBIDNENPJi8J7eFlPgwqTQmkZc8dZiHNDUORtAXVj9/ssQIBX6Amhu91rGiXQp8+RcT9ccmvP5fpA9hLwQkUfh0y/l5M3piQYy1ePljAeVbQZptTa/Wv/fT/paR6uW47lsVHF9gnlLY3KekmrBLb6PQ4wvY7tKHW9XBTsoF79S29BqCwbxEX2ALqsGQ1rI4w335Pe+HwPk0GCPzXcSn3MxfFn5jQox52CT0ISEfouCSFNtcVbijWyJwwOwDvO0/9ujk773GYDz3T7W4EDP7B3n0kpk4IxxM6k2b3TEqTpFnwWC7/t+1Kmn6i9fHBMAt2pnyjtEtcobUGprBiUJ5T1pMYqCTE5ynJ+z6eaCpgEG5QTVB5vqw8oiV2mOWiXf9NoHdAgjywLhDojA4o3USbzOeRc7MDpjqM2XVfB1PxFzbOqeKjKJ5Ae4TNY08gtRif3GK+/w0ZQ9c853F+DR2VSRbU+NRAsow5PgfeISgPev40EcvpXivPgZ2xI69Q6gWUtdwstM6748WvS+IetnjmS/4rrH3bLC317DyebIkF66t5TJGPT8od2plx8CV6H3yompQJ8z5Xy5l67jOO/1MjDq8sNPG5FlrXdmHM0T4YfCavLpVrYWs0b5xClUnlWZaWFUrEHGE5bpxGzec2Kx4QnlnEMSTMqRQeMpwTPniuhdbvfwCk6p235ZzP34UI5A7mxjxTaQxY2WJOyGPLNEbyUtgzFqTjwJjlE2N90Y8ugkKU8XUK54NhdtNY/Yc7R73hP+B519rEQIjhnajbuwTkiEhaUMd9/PxjpjT0peT1vbOgclscp4obPMlPlMMV4bJ/xr9eW6c8wzGYF9tIUTaFcCkHEfloV9UDz5hzKiqPytGYRPote8GavljbCi2qN4AYZ/M9qQtIi/B1uIOAAvpLf8yrnSowqO5/ATe/WVybTrS5Ck2414Hal9RME+dGm9D3tBiodCKSnkHKYYTaCk0vQd/ovhyTe45e/SKRauoWIcBd9tUcUh/+a0TOgSxWdrQ7Vod2dWQCAsPDkLc0mRC+SwLzgwTCG82ssOR2BB/xVQLWmJSfkCfTpfuA8I4o0H3MtWIUrLAUal/l42hUT7OwEs+b6HpIAGLg6qW3NTh5HhlmcsHDNEl856IHpYmStGRZR41x4sruxRANg05Z7FMNIKfQ++qmzAw+d/mIXxTypTGUfvGpsLDchjd3eCJMxKdXa30Ei3tEw5fZVTmz9rRd8frqO+HHlYjKKKN/CpfM5E8rtFICVnNQmbAvdIEtJSOANfXGxrJfqykFkYpiPGFd6KHM0vp09rrWrOW3XreqzXf+gZWHjPwAF90HcsTBkK/Qh9jBvXDajJoE0Kx9EeUpydlnAt+Zjb9TmkLDr+M7JKUBQH6UcGj6d7FUeSjLDrTbNVWU2uuXWF8YjOKh1OyTRRhBhXRjRvcLnzmUkPMv+nWP45iTM9D03umiZUPGIuZN8hvc/8EZTyXS0nIYqXtDfFpZ6D/T7ej0yig2Q9bDL4jeCqGQopUxa6V7iV4IaEl62jPXCjNBMHy7zJ3yUfrKK+o/tozkAjFYRf4pDF8CfhijWM2dT1yHRpaMc4qqjYl7eagEdySyY+faeOcAri9Zdg1Gf4br3ncUp0PEJ6Ah2sS871dOiWEtXDJcH2zPqHf42KUrCE9j9yrTNzxe1IaBqUXCFQMX5tCoJfRdFflQ8RnEyM9xE0FTikakvv3JK+mdj7nG6Z/QB/YcZ0D02KiCKdAZn8oBOrIZgwYmCKxFpFHT/oagiojIdQ2j9FLFR2gavRrKDhPZ0bxyuHLsE5Uzmh6lPdlLvYbTPDh5QQOuKAHPDX0fkgUqokV9TGpsbgJbvW78bUgIVxeM6F1r3llQzqA8yNrYDwB77F+CWggFD8zfXrzJgYlq+rW4k+WrhCBZVx5yCeOzTN3xIayIT3ouMiJAQI2pwtG0hXHs199++GZP/rp2EZ3zzXGyWk7Cgcun5K5KDr/hmrzrX5P3uBYcIj60RgLMJJmmY7hSB0YI6PKvE+HkrVt1kUfiXwQ4OdIYWZeV7+HxX5Ya0jORABzVjfxjVQEAEzjwr/DlGk5mFkArBHSBg0o1nFy8mL60jQV+X72D5WWJpNFW7+HDZJyBpLKaX2w3Uqz/q4fAMS5jkW51tz29dyZNDIeH48RyicCVliBYSjiGvEpNFoSDgpl/3RO4jut7D6CkkfAo7UhZeFUpTHXwZWiG2Jloqkk2XTKpNLriR6axaaSzwf1o+wdc6dS6OF2l3uSauWSdrXum33wZIrqJfsl14kEk13XWeyxU9ZeTzx561RBeTZgPFrUlzyZiF2UZ4jukGyqlCZeQohnkE63KhxObz22klZ51zzE0PAMYtl3pPyhj0kw5TqWESeyRLQ27B/RE48cMBYv6A5VCsM5p8k1uQXB14LReiyFshSHJ6aW1boL3EZ/RzLXiWgrdHi9gH29vErdwTg7UiISBXL3ZOxp+WHF8Tw2b1Owt2IGCK7D5EnTTKK7Q0eGuvrACNtgOifwphNbA/tovtIXStswxuL/3nyx3aBAtp0+mPlaBw+f8J+BgAalD8ohB8GYUKl2+WeQ4RdWRISD2CRSje8USSKx6iajBuQ/KnQebfjcNp83faAB/X2tuczTXVaSQBtd1unzHbYjfEw/4Zlc3TWrIOEhVAmFFU5pWrzh9zcuCQ453u02M0WIQvu/djCs9txpKgsnnsko6fJA272Nx7wgZc8sHICOCEnVsd2EB2+9dtBkkpRnKOPtEVLTdwjmmCASXdKt8gSLmEjYNDBTmlHGSfT6N/kBRwm6nnVZxG5/f62NTe29ekRqx8nQQXABp0ho50PTM2hi1lMzULLAn8rRnyhQJ4AV/OmogGokpHwQWDIr14rb9PB0hXs/8yERQTUyexC74Mt0ISJ8gJbUPk8Bj77TwFfePx6SqEeHqO9+nGH7+lOxr2Z4PfumJGAsJQIjQtc54/quWMg+CQFoOes+pGD62wxfJ2Z5PO+CiIuz/ExVzYM9cKeuXVChMyorU7+aveKhj1L5b7T7MA3IPeK8sEzsnRiZbTjzyLW10LMT5q4/wI+Y2rk4u+D5wDbsTou9/NSe0CKc/fBUS2mktCZXnV93NpDzm+6+nVYAH0Gn3tIVwpLuh5AFvPEImH9tlxXJdqIYk21z9yLZRZr/+tZvtUY9FciA5fYCWID9ewaWWYI60cVfqXDe2Gnoij2oa//OXc9DIltWyF4I2hNxRIk23Isa2b7jtxGT0MvuMq8GyvvjKPxRWtD6Oc0+FaSRyXwVNbal/rr51tFbapsAl2HhfSkmE4adbSClaGFQK1sUbBV2XQhZ+E0DKV++MqAU3rTvnJYX07+QzG0Y1iamsbxXFu6L4wHgiYOvCLYpyyhco9dQwXsjjZUDXgJccipWWMaqPX6/804Y3lRcVa8rZwVo8PtSu70IH6Zc6h9DmQLoIYJQtOfWG2gLAM39DngLOP1P6QSg/ARFf3qqWNfJjEb1VYPcJBY8Ood6ffZFuI+8ne3wonmrKkgnVrc86NRmjy9qpU0bNf8FUOdsDu+LHAz8QVpryxuuc8tfuLQKKvjRQwOAcFIy2lKZp6vKhQ4SJF6L9+FUFlTyXTAAmUa+GO6w8RBVG8bzznw8ti1tixtOTQjiOXMUqDdXxmqwR4L5QYAgofFb3wewe6+3QBS0M+58HEiIiy5K+L9Y4GkOf4QdjqLt3fey3vcSejMRaJiOFRoniZ/lFbxeFo7OM6I2d/Nbz8ilO1EVIaH79CvWHUDKxkwtOkXsHjcGAbrxOGHLefeJp6ePw6hBkZI4WO6fAp29/RyAQQ0dg8qGBfUfE7G4mbX9OALJkLz2oAb/0G5HyfzV9oyAd066dIWjyiIbQKwQPfBhqN61xHtvEh3WzS8BgwnrFteAKMRZMvd5ssDnjELvLXTn+UcJiPbXSCRh/Re2+OXGdK9W05TxotSKgWtgXtsD8U4JNSpnzWG+c8JYdvtZwkLgSNHD+zk8angKArNRfI56fB8d8ZmWELBs6iiLdQQzM//2+/rloPPjsNhHrisJNxRmTU/v8PEwtdciaP6Sho8BypDLQvdjgu0yScCvKKO8FpE4vkE5ylU6jMi2N25LjdHXW0VeqMOdR/QZh1GrCqWKG87Wmdh5rBSl3Ixw8SuVTe8CQkr9dCv2otMKJxRXC3vYKn18/jfHeAOeiCGTpCocX8utR5XDI8A/4MM0oubUa97EkevsiHRbNPfuKLo2biLqo96H7y7NH1jrOE5/3yKbWla1Vr/yQoR0di9ODvx9JTFCVU91ad6QchpLifEjSxsfdT3A69FSZEA3/GwfpumOlh1gUf6rOTamMQS+OSrsYPS+ujVQ8QtTpN77oc3R1p+NjJM+YbVf0fzm1qgYnhH+PdkDSHa8nxaV6v218v4diCvrVulpW9W69k6TshBNLCJZzHPDIITSqN8ZZMLucu/ZTxZMnJxRccqKOytlaB1oCKcLMDZ/ez2JD/R833ihPFIADVJ0jjUhSKD+4jrF/BEFUfujyuE+f/hUgBjFfEvwlHL4xoHwUCtF7z7IWNsw2Z206oZHeJdZxhSd+HAv/3RM38MinEepJUmCBz1va1gTpPfaVjpscpwtTLEVg3H9Z8pudIkyCnzoBDFSZ472+oVRTO+OFfMQCB9u5C83KhW6tb+gU7DG9WSTjBgEBt5j818kR8BfI1XOlz9gsQ/aynZh8VEMIpGkCyn6EA/EpXEEDu7yo57nH+R0K1dEH9fBm4iFswKbdn3tnjj+NPLAwhffryZBgOR5VM1V8hY0DFtbOP4w0zYYkO5P2+SlByJgWcKSAZGt/etHatHOGcahNk0SVIg7IAVrxns62pfV1w6BoJYV9HHwAFpupGLJiRCq8KMnuVwrXacym/gzl6X6Hx7gE5i1Sd7/QYUz9EEik7yDnZ5tK6L3i04fdXI6o6Pahgiugx0jJSsLMPwrtw3LM5CrCZ5TYRggKsuwFp4oJwlO5Xb2/MuNFxBEXuGxYD35aeHIOlkTPd96uNa6RjGVaG5z3FyCkNpQZgQ87nfFC9D7zq3n/1WFnLszWmxzwugLZ343Zg0LFdpN/tIIgdGtd0XLXQ6eSVcXK70vXFFVYemvjXp8yFd62fVSNf5yS3yzvqcsI/VNekv/LIpz8YN48Ef0kMBVINo39kwglEehwqaFYJ1Kdgc4SRZHS/z6zc0pT+GdD3NHvX7zGaIIy98f+2rx1BkOFWR8lRYS+x5o9i0olBTmwWeTV1VeJeG6TB5X1bJYzGsht8HptVy/XvuQaUoLesPKiC2gPuVIkxFdoM6HjlvMpjpoRSbt0Ex2PpIF2UHn5nJVu8sW4TkMFLvAJE7fMU3LjZnPyNzYhXW7khvXmrBvDn9YtLOl7smMSJVWkCYt54iz044eEZr5iwPk/jXwZqq6Rze0IzhMRQhoq/sH/4zX2LvLOMoYkx+eJB8D9dPQCOPhKiUyg0BEgU2tKOiUxfG4aVKB7oNGGsJG7FNRKWp2rRL7aXBmVPNxgZIfL1sYY3BLInfnUAb87xpmOtpB9GXxpaR1/TZQ4Bl1tF2QN4ohKIQuds9dfp3ePGo07GGUqadXjcZjm+6AAPdFw7G0oeqSTMLkRjm4FAve24nDE299zJACQN17phhewfaxztbwmEnVcv80A8FDj5fPWVYnm3wF3aRy9zWwpUHmA6GD5MPwQ7PEg45Dna1v4GZY5TcT5D/kvVr0Heiob0moCt4n36ptC2Rxk9ZHqXNbCEu+98kjCC1ZK1Z8O6G6kxrZVwHUn7FeY742Onds7RCG8Iw7Q1z2GXr7uRZIr0wNMQBB2yQCZiT6U30Ip2JUJ2zKUGS0sT9hzdJy44qJ01y1vD0fa+1sgo8TnuufKFnyEjendVb9g4yVc3xXuc+bRf0PvlI6sdyZE0NbIM1BDR277lLpkbWo4FoRwl0Ud2vs0P5SsoGpUtfnUEsdzTeZdDs7hmidyHNJNIcvJMJMlxsTuZ9WkiGFzxdC+l/lmyznyLJcf0dgYqfEallRdJ9F3M1i5T7S0XK1eaJnMaKjxZJv4ciDD2jiMeULq++UVztKnjPJrRwyHiyeaKcamxETDrK6y98npc0JqOQD/LAK1MwT0wdFY3fYIjBvXl7rBV8BJYV3DMazS/UxpkUD1kgRnoRgMTfyAkMRO10mRmshffLEAS3phwcj9CJBLfyRTJIKFZSnwydrL1vNjdRd4OJQSiHaaZfz93089gbe5tFKywpPus8bI554Fdxp/Q50hdS8iNonO0eZvgaVdDMAQlwlb/Y21AzfIPu1eEezW8jmbOqHuKraiVt2R88cEKbWs59KXpK51uz3h6jYFpn+uOKKoLWQaGOoLJ70awCl+2BG6jTsF9j2teXYLssqU2H7+WQR+7NR6pKC7r0H8OhndsLYWYul+Uv1+Wyx+Q7/Lja5GtNSi9XsOMC0PjokvRcAqYgjkaDvGT4aQjaTDYOylHbtJcK/f46vN6UjhCtvcQogXu4QIHsw6pNVoh2UTjh3UURX+L0xz7m7KIZvQtDfyJPXWYFl2MvnexlGFxzHMcUT3hYd2tkW5UQQz3ZkP0p0E7t0fAd542B2HOUNXocQB6HXnEWQD5d3IZ5K/Sw/asrHMjMUKcQB3ffOTaKWRVHO4sHEEOWi+m6Sd5lg0XSa9CF5FYoAz7M4phlVQ+PIeVnq4w3Yyv3U88DuvS65Y1RVODKlv7mF8qy/r6ePl0jE0WG0d8G7d8dERTDOLQX3SDKSidUvkVhwGx6FP1wa5mDxrtW8GhGDZ6q3obQAaVNiYY8WkPPhDrEtusfBBJ3JNb3PEhrJevvyw+M6ht1tsthwQKc0WXkzDBxLk6Op1QbWcyoQDBUIT9Myhz9ZHxFC4tXGscgcLWvIQe+x4e6E+l9RQjdk3JvHTh20y3795IwB92YL99/UOTRJGkdy37qdaKhSSjK3f4gdUCIJn9WsZxfafWb60+datHX9cQvsWuL6GUGq2YvcszFhFDDVNccqTenq21r56LrhJTYR7E/OUh6YRMqjOe+YxWZZ/6YAChWfRH+z/VAlWIcctjMZgwQRLKOzbAsPaZcOphHfn+rI0XpHyqvWA45Aat7ja9f8T0gWec1M3N9pBwxsu3KHLiQAo9i5kSKUmoJ9nxk44PmrFhn0cvGdfRyZ1Sa2Y/C6dyGLNdNkk5wS25G36PcCZPjDSJIdspzwluAjcSVRemmtITY8NYBNVUDZV3fmXKzTMGUI7YQAXXGjWDXrt5ymYsXKbii2rCmMoc5RNsI0qu8uzkrhXxmOPwN3Okml0TDpib1iAIQ/vlUVCnM5B77lgcHXww3xqereKMGLEcnNS3VdtOwjMCWknrppqtrHQnOTTo38qe34eTf2K2eJoBL6LyEokLwq6ArtAJ1eyo0l/6QMAuBxmLaIpb+F1p7lV9ozxwq/H37lVtQdesXJeONXnUrsV82b69yBXS60bUN2bWvd2JOYNyA1GfNaEqafiGIRrFXYP6/1F/tpuvkhMkZCF6ez4MUPzKkVLDCPJz7TfBXS77wpg5pWNSpLUZFEu0e+0Uqg/I4t+By9rIfAXq9/C/Z95/2Atwib1doHg3A1IDqWSVRKGKWApRWoJ/2dodEy3Dqj+c9WunBtxvGAbUbeWjGI2OYMWzOGU800zpDLOcqagjZp9PZg9mBARgtmNjEum5PeOzs+LPzkqzcKGiJW5VlO7zDM/5Uz9JNnyIKGBWR3cJdxPBOaW/ojlHI4nxV61v32zWBfdakWuYovY5Riu+NtFqsBzBoF2HsHCRnr0Whks7OFSBb5YxmNKMxe2QPd5yk4AdSk8NaZ8d29QS0Ta1c6dTu4X9zCZoJJktzgagOcmvlQhatNQzr/3aQqsnlxuJdhg8pbR2gHfVu9OJqXSsXx1R65DPhxQWBhrJrFj1eL0rdULnouNIDo7VyD5E5zd50IpHVe1QbcxARQJXVD0iNd6x+K6JzbMAjxx4qKw5F5X+Ar4usCZjkFxckwfvR0yJ0B2xV+EjjqljnSpRyqB4WmJ1Nr6lnvgOzPMi4BB7Ry8u8fY1kc8lcgHjwcNBYPLvTHLnJ8qagX2I/Mtcuobon9Q5EcHpT8AHTd1CIps/7Z0JuQNkYzAaRNjD/odrlQqkYE7rCw0QkFWivdpIu8NPJK/jjxsGz1ySYkDzIQbPC1kY+0l4oJ8SlHKEPlEKvkH5FalJaTzpcsPG0ZgRenePOuqqphJWD+lxftxaTQdMX0XKMR+x1j/UwMhsUwsPx3YJH4eIFCyQ2qbbwEPCIQkBh7F6j+ympkA5BvALs5ly5YwixYLFaGzJ5qe4ZLpik5wcfnd6V5cFpG6bhSut5Lb655ChJqHl1LtH2nPoEFR3kq0CErziUGufBJLf4zih49sql8/QNrsJC1n2JWchb3vVwoJqgxC17OTfRosxDmuoyJvYqtgwLZ/fPhGc/nsH0wCvfcGc47QG4l9EEYpSKjSIxrZTrrZlYme+SipshyqAgx1YsKW63apOtUoPiikt9h/GIBS2MpjGhtBZyBVxmctFfnrLxerRQPtjI0t7DDYHJz5jEMi3xFkzu8N0YXcjhD6U6mljkp3OfTa6EEbSlo7qMPtbRYdWX34q00O5bzsKNe56y6cgnICckLOYXfuaUzNEN33wrkx25XsMuW82lHl9PanLKLdwyHZ4MIS9UxQ6XwzGBGBCjSwwMOXG0bilPdgYnrLLLjLEUz33FkFULbJECOw4uVNpjvMsVeKRp0AQPO2bENqSVZyuzDNgvLY3zrIAKwXRwYpI1LBxbmdCBug3DVQkdkoegv4Wv+Eb8gXx3v2/F761mCXZ1PFYFusJ2BaNeoDGytDy7WIkBmxp+kVNEUSE2VlQ9VMVDidERLgCi8OfyfEiDJhN85q7EXihtLe4kQoXs/Dtron4xfns6pVDlBACl4URwMWxKFC3qAzrJmyDHGW5RtLFVYXS0dhts4DxtjpRDlvSNbos0pVJtYmOB3hqt3up9TseRZ9vmRutXVUtdITGxu1np7lCHcVy4Zy1pzYrwd3RTXcqhTpGpxEgvNLi8eqIkGjMCD1KBtHQ8Y5/apTPP75HGzhcnb4fY4nppGCV+wthasZGQN0qtiyHb5cVDXkwlyKKzcvauGN0Ad/Lz53q/f7DiMe8CSasaqD7jj+EObS6C9GzgsRW4DsaZDl6InJpkrYckfYlNzjXuCaHkHZv4NRO155G4qqzdvhDYTiUJFkctha+cwHEaSbLt0Abmq2xJhES23OW6K0Shxnw7bLYgayOhV0XnstQIDssAWlGVPvIGyNMH7xvH/1aX7VFvotQgmgrB+OOJwVe0Y6XVX6tsL/hpYCa0ad96FFf7wnalke0a2SvI9Yn5JWL9U3rcQsyZNJFQifwzkouZr8n9aj/WQYd+tInTQgEcLurCSS6QvoW5sQMGrhgRdDvxJKhJ9Qk7OjaSXQSAnmtznhA5Xh+vKXbSvVDbO5x0eC0ZyrIE8NAbHBsn21qzEv+jumSYrwsRlZjMqHvMCrzYI9S6xDrpoUXgeWqxahRZA3UyxewcurJney9ZVOu67c/rghqgPBWxc+puDLyXWmW1SXrijM1wAARcATjHTCxIp4CwiBloHqmbflFJ4YjxxnLdxxoguEmrXFknt2vq1JLdPaoB/Em8VMKg/B+BEIds7Jq7aNevm4uxzeAe0uKtXw19WP1bxUcc0GDUbeJcO6daHDfJcs6ts1XygdzC9zFpsZZuNByz5Wm7XLydxQLJuRyFaXqWk6rVbSsSx9WkjdClaimEowSTyzU+fm6jK+usFc+DKQKT8VSd9UXwavDfPgt37m2hSsDFcKOd/ehV/PJibWAariDMO8F2aMqu+h6ceFqw7M13WAXJBkCbUBIdTo78K4HMb6SeGKENMQp2GNA3I5IMsxFXu9ALjtqBolkiAuMnDcKv/47JKlPXPdHQ8sd34bT1C9WIwdlqGtsESNsB9S7H9z/0EZBi94tAsxthtWkyLib21JFdK3dbU2pkc471Z4jcY29dXAARJklR68PskC7M+VwrIBIGlYw8RHQu2WdxkLs3Df+mm/sTixr26sGNjHC4yXVzX0lq2CMQCo+zB0XeVUlYleQg3KgbLtpXZiRUzXifYUurzS5bPWLlrkrvjwJIXBjc8P2BG1rtx6XeyA8Z+tjqosFqjIgIjXSO/SpqFdhkSKJ2JJmSLqXaf8m2FV9w/tbUA66KEVbRXo5mtZAa5qV0s8rcaC6FdWq3KMv6dMT5K0W/lhyVYAvp+uXjPTSVdtjdMrOqJRknb3YH7ZofZBGCNQM81UqxmpnCAMUOP7l4EIgmohgUmjiEK3Yq8QuWpToMoePmQeFM2x0mX8cEOGGxQZw7fNdVSbjyE2kkf27LmvFUw2c2u/fpxld2wfneD8jDZ23sAByvyMbWZY1LCX+mT5+uedzHRTMqZIhMoWnI+5AAaYrxNB9Q47OWXxm+zvt36qKR029Vm8yehMms75wm3oPstVSvVNJOENZhaHY0wC9A5SHLeqHyRNRFfejtFT9aimf0tP6NWX5WqCTiz9KDD81UEoNKEaB7WhsdJNJcLIo6klv5q9KxQY5/OM5DvwyG0oADbOHp3lx2g9K0HlYbtGctuKwQwDFXvAngVBZhnOxtvtF85evpOu8HA22gd4vXvhBpkIYOD+zyYntzixWR3YyZqcjCHarxvXMF/NCrUTAnRfd1wCaAwKbj64kTlwfkRbMGYUHJYozqAJ9i2Cr8NCr9wNjYvveeZKf3Aod3MM5B9v2fkh3+gGgMEUygfl8bJo5fxyWcLdY2QNajjvYFKSVBhtUzY5y57HmrVnh4zsUJmqNa/I0xH+nPQD0ipJjs9WYU2TpsOQ7YJanJlB8tfzERzkK/3YNDV23MO0k6elXr8/lQS2s3mAl50OZLZS+zpmMXKRxrNXKNCZTZ73o3YqGfdims+bQANDZgzFy90JKMRZtGIDs2V/E6V+HBCfUUoqiKGXJLfaJ4n6NNLOwYVrrFfZburyDT3wryl4sXs1IZJMLMs0COIgqvb7/NQdLvs3hZWBjNJ7VUS9iUnLFZAyD3sQOPUhtSEWa7OMaScPWeC+y7aVKXEGyIKTll/w8L0wRArMOZuic+6AOwrmoeO7c+8DJmQ1qCH4EVqus0rhqDJ3zjgfoWrY+o+3h0eysAF2S2khC8DK1EZ78FxbC7ofIU1XVEKKzIUbeY7ydqBCB5aZHZBUaL4/4hjK7eNGIev6xAfsv6/Hz9himQRU7BsztupznifngQy29gqKLfctB0ba/gIxP4E89zVS1LXtK6bG8OI4neyEc52LjPcIFwQdYgjRQ3Fklyqu7T9pEbRoiJ3M6B2fyq6jGkyG8FUogU/3uYhvh078eZ9dJymcWcIMrz7yleN+ib7zYYYmb1KGrJ2vbqTjziUWHea/XNdCxqsp0mZnClIHie2nJmuUVwB0g9wPAFzJ9NOSMx5610U45Y/Td35mj35xX60NC9pyE11Woee+6pcX3F9Uc3+rxirDFKbKamXI0czcFxu0lxfx/rpacbrz36c8XGmb1XaS7vzGe9LwCHD7xH+h+K9MKGDaE+XzuXYr/nsxOIjHEgDOTct6cha7W8teV4LGTVkHnzR48yAADd+z/83+73aCuwNv8fzUuvvLbsX5SxmbXVomIsej6J1qmU7OiDOuzyfAC7IVPO8izBUOc+5LvEEwyrPY7I7RTOFPvlyDDVCRFUYTzaqj0lE86qqLrRQFePSZ+YYvybHiB1skTeZ8qqufIUGm4gspUtnoDqAKdNxxR7h48St/F1hB+TXwZ4werZti3Xe9/vyozHLeNQmzMwL1vK0Ch/xNllnD5FZX3qUaww58u4zZUt/0kP/CHsmhdRkyu0eriR9PAshK1MKaYQT/eHtTofWNOz+q6K8WmPt+Aqdzrfv/xmsjLwVbY0aF+iRqj0vU5hiiNxJwdkGE6l/dvCou82RVOGchz9zbYlJzaUx4I14SKAT1EdIcf/R/t9kIF638mL/Tr1Fet2GO1ZC9rrHn740+aA2vEoTcoOd4rfIVx4UApHx6Wh7UBOM9c2rkGr/etE37Sv67N0i0HcmTW4OPSjhQOhvBN3btOFgFccITqbP+NY2XKEfh4n6y7SvujEuskb7Jb3MQcGo4B3OXz8c94bK7SI+RmJBiVN09U1Ynh3eHVXU/WrNq7BhAGCE9qlvH2JNTO+Onf2uXKzt0ULgk4RjvDMwhwfMUg9sDFPI6PPVazRiv9Q4iPW4enzuSzh7D1nHCxi+0+2M4vmE+k8S+LXGz2ZyWaCAPgNA1TZsnekZUGYeYnS9CTt81ACzKiSRA5cduUivHXk+Qo4za64D2K9izYYFsdQmT5ROz1KmrDHm+mzWAu23rHRLvwkcEdPQyjQ2KQIzGZNwLBtgugBtgsYsi1Atk7P9BehWe9JM4IQd2miFO0zW49G2BHrq94HW3CqGZIaGQUaQXQ3XVGXLxaHxRMHyusqp1rnaMW3kVy2roE+v06MMmEEVGMNfO9e/69XMBiyclUMVXNYR79K58sGReGRh+ZsKVQZBNLfdoJCgR1q3ZMtymzNKH6re1HuTn1NNBzrowDBa5MPV+9Guit3pIP3dl4QOQq0gQlI25aiwKmBFqgQGYNvKd+GDhVF252MeO4kK1Cz0Xw4uGW96pOaNhGd8pv7UBqWGUXagUSV6ULBu9QzjFPh+/UVdp4QD6T2bru6U+G4IY0U0TKjVzLn6uJsJc6ZaP8+fNP46aGBp1m8gp7MHkN40YJ70sPPaqTR5hK7yD5YhKS9QZfeBwIlLIPc9KkvLXryA1ko2m5o328Mr+Ox6H5v5LiZv9QjX1NeHGvCjaGwdLZp11FgL3Ww3yRu87nGTjq6KE/p7D5AGP4N+7wVc1tmGRtzY7rbHo3r898OTyPYgJShZiyIgFCFwKOFqkUbvkTzVa9wAnABe7jVqpMficvOa+WOHhdoUr6ftfo7f2qM5nyKfRxsavKcr33+YePDtS7h2YWGcR0y3AEsVKyjH/cibSeI0cLPead2KrdbOtjD/SrGBW0jS063LHFrQOImGA/khNcvrN1d43SlhJWKV638khz6LtHz+z2P0/NNyN8qUWALqX38F4EOdS+bD/3DNAvktTeXzVWjWbKy65duMI/qK+cUnLcKZeOo+v5aVjPhDVD7Fo0mKMJmgyUJt9+f4eZ5qPtUOX9xGMKUtIMhhrPkhT8NU0+jLdNDV+rh0MdgI4sB9Qbms3YfN+24axrbja3pLM/4fJxL0fqRd+qvR14JF6NxaBxzUt7mdVhrT2SVorBP4CGzuC8Amw9kWfJyiAHx5jo1iv0HQ2F55IkdNGavnhE8Z9hm4zy4nax0DJIzIuiX7ly2u1vdg5B1b4nP9261AcuaVpScexuuKZl1R6u0TEH4bpBMFV+UMPF4pHs8YOQyN6FkkvZFJat9e+0frdokZYaWVmhh/W1SxdILm1VfnL3XK+Jqc3l9mdP9uTpWidbz7sBVv4P6+ezxqj0tQpupkmy7BZD1Uq34w4JIFwgwl2CeDEvwOGaMKd4DN899eqs7ybvb5YOsDvwhW64mr7MtxGsH7uEbtKH4TmAcvA7BCNHZKQr560xjadlyg210mVOpCiofQKP6SL4OQBjVOI+sEbftdenRdBIotb/2gm/HvDbKwsFoYFX9oXpqgEhIqrvMmwGsF0RUQO/mZhegr0m5n4v2vPHTRJw3UbOJbk0D/pPzt9wqHLlZe8TQJcFH7udgxXKIofrTBM7gEHmK2UtwEuOPCxuU0ZXfxzj1AwNikV2I/crT7xtUFkze9InK4PA1D5Zcf11OnuH8dwyxhMyPHmX7bFiZwfHfYDzNOKdRROabfvWoJz+rnyrlJbVIneJG568LqvythPVwcqzKZBvvc3WetUMWiq5a79hHFH3xfiLHouk76rOjnMP4dhHKzZlrF21YFx/dJjVsfVRr6ePf5dFe84Q+QFALE2AvyyZck7209Z8re4kGgo1Ibbde94v7V6SV/ofOkBdexhJReEAGqG5xIT527H1QgmiEPyG4kJq6DxMm50gaDOMcSjFaBYpYZDMSzgsEeyrnhFeROI/3Om9Nus6lCY2cxafxYHMdttAKSNW8SPluVpwRA/ROMvY1vIOd7ZgDU0ZwsBXWFbAev8aAoW9ceGNF8HLY7AC3rpzPCicwezlLy2ZBBf3kjesn0MOm6/sAEcs0ijORp3jZKbVYNSJ15J5w59BL4k17GkZdxh9Jt7AhNpe31WK1seyh79sMn7VRNZxzB5VVLmM1zvSnPhkdiJIFX7DUnNfQG1wKph6X+m8DiVM8eXUe5Ig/eeI6i/H1mFgMUMvTK7xDa/GxaDq9wYfrAtzpTiEk9Lar1/9znlngm5frHVIDYgHx8cKf9LleNex3iw/PwVJzBH/mNWCIvbaHNxksoXX1rb0Cerd4jPJhxVAXz+X3cHmZQzIwrlSgz9SzgTmZ7LW+i5xlpliidcizaYo6ZSZkJ5tdfhJLVfcyenwDPPYzzyaiXcJPp01vf04TaOBr+taksrH0MS73Zj/aYUbZv24eitxCaM0OyTkuas3icsaGwN0GUbdY9KFVEzSLI2kfzSo1BiXpDVqzNTh9qWoWIRcFkBy0gthiP0MFJdRxYbNcoJVzlvFzcvHTsF3rnjjY6sxUI7/BX5iZMSwWLrNGNx/9hPQtXE3wmO/wkQNhsBUik1nuyg0WO+m3F5yZmXnIiG3ISN0V3eF5jzCm6fmCpO9uCmBX7JeyTz8A2W4bSP3lrfBTW3f145RlYYlBJnEV3fht3cxal7haO2jyvwZflwKkR56NMSEp/ZcQ3SveGJPjifCSo/AK4i8/QzgOvx3aGughEaYKVFEdunPFiSNhR/y3xy/xGFTDIt8kAVI5dyHmRhVimX1OnsLRu+mgT224Q4d2yUu9Sv84NOakIpbmVNp0Qt4VTQMAGhyLqOmZq7XIB+5Qb8kwukxNS9wI7h1XKsMRykc/zlJcv4FjqO1RxFDoO9AFeXJcwVajHyp5eimDzf7gNp0zDjJt7HsyY2bPrKoUPmegCp9Y4Z+7zivp0Q9ZRUqao2f/MIl1xO4KWeGF/u+raOFBAnOGRQE5V0tzq9NW0fMTWuhbEnPoFR83dq5HlalNd8bGq6msvyDzYvN+jqH+zQkDuiwkTWTIxYukITsH0X0ZxeV+hyXfm8aaQb7bgO9zT0OhXDdLXvPgBskTNjZ+uo4Gb4tqXlkQ9Q1isfmjgbxrHxnkRwgIRamslRffc7WKCRAYXj8fIelJHAwPMKwoH+04PYLtdjMVER+sYvgaT1nWfpT3OWOouCOzGJFH23ZYaHNBEWYlJS8DzG2Zvz4Zkmn6YxekXeoRoHRzWBWhII+MwMgbtvBUCX87O+ZWkX6cedvwa6lfP929otb/4vk7u+kr/B8NGYgmiFVpKeX7Zd2r4ynhRjEJE1ysFgxxhrZQjy1KLScYuB1hk9fk2FSXFNLvFpY9zJLwPjfdY6GYbH13MZQQxrUqUVV8A+DA6pE85dkmK7s61UcImaDZ5t9NbXRClXpwUpaPrD5Aa3a0z9cbo3e8yk+xo/nmlns+KQPr90P0dxRTGqI1SMUdJVgP8GHGwOl21V2xTI14IOmgy1lP6I2FGtFyJ3GOE4s04a/lfi4a5PjIxeKIvUKA+Los/wnEfbULoTMBkax5bIdr3pSUl2n3+MmT3HecqDhRiq9WabSFvSAOhRtt/9EzepYQ4PA6dZwXD6yno2ZzcE+ulacPZqODvBkk/Bhl4AmazhtUMsy9GRx1HaYkZkxWOHp7eCPXWiCubmPuOanIgOAEG97nEBNFVqyfcikbPlMS9ABgdJQHP9PEDYNwjvFombNLuIpP0HX5uCsUspmm7SGUw06qQ/GIomUMw+JhweNq/9p4pVJE3FrXT4ZSWXPXDkGixerDSsO2SLoTBEjljc79NgfHDcSDcN04243066hkaWBsoiEgiEzJyu019TWxKiPQ6AU/nfDeekLGKdgxUZcT9Q3x2eWkUO1YOHbKTFAP269s04QcWScy5MXnDUZZ1bTt/VR10ZZb9qyb9YBQEP9NKrnQI1aarJ4050gg+uanD7vlWiQCUt26m+uurfRu1E5/GiCcKVOuY2TNYqnns+Uqcg1iQn+C4vmceYk275s61WAW7FEvqrAXb+S0m1+mVoqMWpbLHojCa/pi0dAdJHDkSyEnGAOZE3MVbhs64aObX6WY0zdAAdWl5va7ja7bsY0AKUtYBOau/+l9GHnbgmFEDcOLLvo3RwtFK3G9ff96HmgTSRQ+M6/Qjd56t1y2HHidJVo8H5o7CImfTJcJ/7lZxUEQ1q7TqUmdVGRYe6e0nLRy0mW731S1OpDA9kP1jO+ne7mYdkESqNUzONvueKZyPD90GXNI2g77h0E2DZ2qGFejRGhjdMJSWBkL6p4s67WqG2BGZvEyLH0hwRUUhk5QRwkT7moKKq8Nqsdj4ycOM+mE1IbEtDcwy2VgUleT0cN/z+8ZSc4m8hHlwp7usngsCbUQBAq13837UsETge6KcxsnWqE39BUEWTwn/lcK4bOGaE1fh/VxOTKTQDyZBGVUAUvDQClAWHxjbfq0pCEQL1Hx0SJ4xce55261sBQwSkPpYj+MFf5SP1nwMGKfV730e6pHGK2+LO8V1fOmPkWCGjWG8+piR8Yv/m6ozOJSbd4GE78o/sFZdFWKs0xXsYAIbQ3TGD+1bIOx1sruPrz2611LDyrIV3QXdwQoX1waCisORkJzurc2OIhmGpk1FkX3BKZEM4oqgXVyOX2O8gtjmm1VG/lrDNgQ6LyIQp8YSaLDyf078FcuJRC1Qi9dKDEENBVdWxe1TGZTbIv3TJF8vCvJYb0rS45aPkroa7d+zyXA7xstw3eJcn++sGntVuRTB4M5CrDlIQHZDxt3vy+ORpcTSe+8VkrPv19yIqdH1Au79iWpj+D7tPBP80U1TM3wJWdcsbyIf7IcIB0/pOpemzDiv7F8tM8XM/d+4/RQx97cPkuBHV3vc//a5vksHkZUUJtehdBQFEZ56RI5cDSILCihb1way1+LwX6NvkhsC/i79ryqURhD4Bj9y164G2aDH3TBa8ebSPZNfci6mAPR03d7nbKwWy07RXptRG2+ldbfER8/sFD4ph6fOL4kgM71vnDqDZFJ9DRtDFxXd0m9ATm1EB99KAdYtzq7XNbMf64RAtmQYIHY6OMkODdUNLA5EZ2Y6AockIUTL106PEG1/nw4my52cYjr48kUNH/LwpleQPf359OhFrFAVWfRZ0qZ8aZDPIdg7qzxw1eakfTeZKucV4MFxvpNfLi1uXwRSNkWIFh0/RPnIxaXhN66B41ORe/pbihNr1OtyJMsFTVOiWoJyJD8SdVt6rethaWz/ZqwQEFRuZiRxNB3WSwPfe69AqZUzzRo/s315IL5PoVrpjK0Kc5PuFPr8BE3XokYGT35XmTtmiA48msZn8PT7cljSOrABAr7sBChU2J61aUZQi7hIgHrQusd7SsGdc8i+Sj6s1b+8fC9ESyf+plWk/WRufxRv+0Q0RopCGycZ8gGR9SaACTiAhIZ30cnkYAsce1dqD1Xu/kTEJDz+A9V9OzrH56WbDeUc97iRQCR5MYvPF0A4e7UdSkcqc6pomfP4fTB9mCRspBv6wIYx0GH7S7m9Lp+UywRC5RG6Vz6Hrv28Ym1c5DwSM1fltCPAqgmOr9qknbbfYfFpHgzWSMonq2CCrfUQU/8nSjCYSmR2GrhNhauykiqoWjyxQi+2qm0j7+RrBckivzGPo20eUei+iMcQ4lNPY8D9uWzWjeUDR485CKcygWZG16uv89oSDlVnn3ul4K6pIOG4MhQRiNVg0fpADkbB4NeqSIasrujhVQ5PI3e5W8QAuvpeykT7o2JWi6+4iWzNU+d/FzkX7PpEbM1ZYtx8qvf0nF0VFPIwA7GROT/HwWUVJl+hnA7SAwYh0sLQm3lN7suLz6IyTK3Upu3FASqDSkQW8ntoi0x2Ug6r8Dc09GlQxDXC+gAS0Y7zEv03nLcRpxJS7+waK2taCHKpmuQDqTzWyowXg34ka+GZkFq52hhk8FntMtNFr/WY0lGkd2Uq2M+FU+OBBNcOYdFQxz81BB8EaZ7wQoE6pImxeaMNsBHonontLGXlV4Xd9XAi3tUQaf/9sTxkaVqZM9oPg8l4WDV2+N3gsU1Pdnvg7SiP6vLafD/RnC6dxITCM6MHKdgjT0+Svtb3YP3tidmb87AGMT9WyShMWsE5G0EWmjTQ6TswJNr9dUYU7gYXrUEWRRrhZlWpygYwhrEg4ZrlNIqjp4PHd412faRMVdK+sjtG8YiZfeSRH7VyGo1w8hkt7XsAktIKcFqzLRGfVjTRu37ohTpG/P/bNDSfsN/GwzqnUfIrKZ98PY7b8a14kQN6Z5Hn9VE+P/THrvEORdpagmoG+6tzP5X5HhRSV53GAK15BYUMDw+fKOYgdESxHBuLfFSsjS0v/eZxPxkInrksNzPzs8gb1yTUnKvYduFHOnQCxkZxzCs3fBVi1qcHAkvSdyeeM8kY8LzmHwNIfv8tne6zQPy7v/Lu5znIUlL0po0aHdum/W11j/Mqtj6fFK2vJ10mZ/nuyQxIA9CnN2bFKDWLExq846zRssbLVqt1YswXukX6F0rwLLOiCHB+Qf25ksQugag++6d6yLYN/VtWu6TSQR5QjGnOVyble5L3XLaPTYBQ0A0/rmd8k7x7gdA4toGq4UDZGYkziCNOr62tIXP46eoMsjQi2Epw6c68YN5PAjrUAnY2dwhkvbRh3DCtC4HGiVyZFZxHfXIABYENe78eRVPb6Hzj7c9k4YMCJ543RS/WzSPNfhJZaq0I2kHnrr23aHGSF0ac3BpLnMJVr7K0T028FA9ms8Pp717VBFKH6j2nPXSnMHbEYVdfWR8l5DdFeL5ym21jVsFiuNve40H+Glknu7hkaMaNhESzjGsT9rBSExmxRJUi7VhFZDvEh8ZKMxh5v+RnJQBflSC76Pd0plp1MAcRGvv0UjNeZcPsgbleRWyoA7tuOIWlQfEXINce1auQl7wQ/A+Wwp40LPREHyDet6B1bCl76s85vD5yMLd6CawxXGZEB4s9BGw/kb3jMmC+rrs/F0a5/Cuy99TdKkmZAO9Gq5sgTPNOCouUKkDuU+34GCQmzAWdbALXf6cZifsFFKUmUmAMuyAYUi4EDWTQO6PwRFspJFiQBZH1u60xQ9DiroJcIStVeaqXlps1tr5I6nbvRWToZsBZn6D8zobRuzYRRKy/2yLr4r0Jg6eMyNHEy0+SvIPnmWiyNXfgRuGus7MiFzsH7PgRzT7j56o5Ywz62l6J8zYbO/wffjmXQDP8lUmfVrQq9M3K1fS8trPRTNT2cjlXsyByUUQp3Fzuepg0WcRpnNUJ7e7snZNRO8eBnNtIA7dKI2dGikM0qVIKBDYZw8LuwhXd0Xrvu/AcYATldO2q+TbVN4nG86JJiCMu0+Zkz/9qGUQXuyZb0K4J8rNB/YVlPij/z78FVdxQJUNQfkDI26BDTtUaw+R54VsV1yHeDHliuN4zpnoAzkWfK6NCBGjiG2Nqa0z7FTJ0dk5UivMCqP046k4WXhozFwSlYBZiPpv8yV6VAbMNSC+dn+LTM7MdbxTit8/owb732KVHYW06ASYdu9YjOh+WPwi1i/mXfRiC5PavE35th6+Xr78qi3+tO/Ev+MPv5YN8YCJxF4iLze4LjNZuqxxT9JR/JPJ9e/OQHvhuB2vOMWpqZfrXbfal+C3wcylwRMz1t+b40VRmdZZv4Gj77nXQ1EVGRyN1glniHmIMGOgePN2lNUdmplZsd7GuUctLnlKaFqwf3tShe32m0LZ0Id1NbUUk0iPX8/X8wXn8cLM3AH2H+t/XxS+fI6ids9IBhEyQSzDhxLToTvmcVpz+85JzrFmK15iihFa//BWphCjwHdZCgtM+Q23jJ8wTvSLW1M5hXMV8NgR9XRb/TeWWuCfRicAgjODshkWVndDnRE7DL9ULJFJVXmLifWpr8q/hkHgGKmI8n2oE/Vgvtdxu60mhAyUCfWVQ/dRLwlSAoqgppPOnpAec64TlUfL08Mh3Txn4i+bQtklxv3lplirgzR3p437ZVYeM42F1TwljmlNJ7c6/iLxnyyy4X25lIq52yB5RAOXLglKhNxZHYF7fPYofPGqdDR2BsaGMjGwhI4GJ79l4JoKeb8hGwIVwQXxriNX5KuX+3U5N1i9PyBNBm7BtohwVetg7DKaiy14X+IFw6f/o9/rz9Vs4BZhRJC9XECao71Hpjp5owdZiiwwYPcj/GEjgNMEKnHE1n7iXriq+5wsjUCD82d1yW+J4/Rb7d6aW2PwQJ9QyGDfb90qNDonUcUpKwEpvRvHx9mNoBltC+7AOIFxsZpaOMlcDSTBZaUY2pMaz/yUsoq8QzrtL0dKkkcPhYr1t2caioror4PFdHR0RomgB071bKeCHX6KJAFQ9ZNeRarY6sjbJbt5gSShjwo9SBkwsQGrPoisZ6ybfNjJHz+7N2967NfmbZSqYFzeolMwmoErq5zPZvt+IzXSEnijNghF9TtegUdrzDgMK2BKVOXot54p84Ca47qp17jdbGclkjhxjYS1hqLVbaNBYAYn4gJoTFdyWwr5GhTlNFtjs0KQNWEWrsYalEtxyglftoF0zuiz/mwPndrpOD0wvaNYNcJePjZA70mh74otz2mKWF1Y57j46NdoSortGt8WtAwa9Z7AVg6acCYKMnd6flbjdV0N2gj2rV4R3dcAQSQhlzZ+0KbwmPW9Tp/pmVzGdDDHNaEsNAgHRkkrobIkymu8sFok4x4KgSAneP7rtIHfOuwxSpGfPnZXLRFQRUjVEPJzqNPaSCEfj6ZMhsNtKMVSTuDB5dO3ddLWkjT3+Z+UnIdWSSF4t7vUQAQUzttubCZNHMwYE/pbROdwJ2eoqwbf5yScpdLX0F19uqrsLU546KPiyd1874HqCjcHseJ/RxENvUt+62ReOwvlDv0AS9IJAXp/+86iqncr+l1Bb/nSXTp0qXi+cmniUuhEr0RB19Gzpw2N0Tbek8NwVX33IJQDEN/iS3c5G/eEZuYfISGaS7lYwnnG0gcBkQdqQe82vUYjYQyk6EhQ7V9zN67EG+tXecGWTbq8UlAU0pmAIerP1JUy2BUQoJTox66oOQpHlL0X8It2iTQthMdhRraMintrM4CJp7G/x/eFM3b/RwkLZt9xa0etGM7uhouaOSeH/wW2CFQhmk4HZkDCjPNomFE4v9p7kVntFJOcrhFwFUHwIbuQ2QKqIX7wg5g3dOnu27VvClK4tgAVuEKLArl8k7CvVVMESpW0dWE5ThnJUHEgtqTDhdGjWlPDvoV8wtfYyQSrMiBQhoX4pQHnWqDz+3MQUSK0O8LDrhaHm/7Kl2SAdwS8J4Xs8Ja5tb31P7Lwyvpnqjt5p3D7+AognGrY22emInIzctJamiCcxX9Ym0cMtaqGHcUYxMSFrMI+fAT9/gUeu3w6PjndY6/U6lBc+J16Xf9oDYmV6Loen5mQo3pu95NBrKgPXsEKHbZJHjjdmTarCbw+aB8XMsmaCghA3mlLyFjhmu7zhBF7Pq6kmYc0VVvVUvG2wEZ4aKoCBwObdOoC6pRyUXdMYcABtMPwG0+1hEnxTnE0JW1mxBQOJtHmyFv71tc77urxDvvKZCN+AuwmpUa6lN2qShoA1HM00NaxpAhC5D3Y4sYIatbEIAWGyxOTzs28+OVhiWNJJf6TYq+lOn6U/QJIWIxtqzgic00iQo1rZFtowdD09Ziy+urCoN9X92O/UZwxaZz6HH56HgYrIojR5TL3GjKWm5PVat7SAfHEBQrNXkb4EdYlA3bSzjJ1yQu2C9m0ojQm67FTsLT122HuF2IzKn135WK1pwHq9pGhQmAcrhk5OdA7gUKh7YMn3cfOTYqhS579If02lEd0hAthMzdWlVA5C+2PjkdUKckmkyiXWUpEACjevfxT3T4zscNT2+iI5BXk4EaxABesMq0Jiby6w5bdf0Qk26LOtEldNGDuuw/Q9bMJqWFX2OHN5+XITGOENJ94WA+AA91fTuMw6PWZ0SGZAEW9iNDGwP3ksYzRPhGWWRXO4v/fsfSyEPj5g2nOXCFFGfkTsiH1JwyXtfruUMWIeCUMezefF7gqWb1VrVtkjXX53mM5BGDKcstn0Z2kzuMjFJfPWRARCINVJsAqZUFBWW8LH06a6LG9lxMsa7NIVMNEz/Z3WVBxyakmueJ51EYvYzGj67JlHkvjGJFahLqeqGns/y5Z/6sMVZtzRfmMyIiM695GRfvuoNGUj1x1eIeKKqq/de9emgNTr1PgExXAvJH5YpeAlCT7aU0WOFkfYVhOjhMPL7vkB9KLyr72jqs3OTN8GiIamXz2EguFAmyDrd6hD28uUO/MPEBv6DouhlkI+U521+wOvqyCLmDbslTzwaJbb/Zts8RNZg9dZPMBZax8jCqVczn7nT0381jADw2xovHcJ815BZmqmHtWk1scdAmuaLm4tbGSSaUuCIUyozf5/+uXPFr0w2pN+RlNq1S+f7/YvnVXqyFRs8cmjDJilqhhgp9i7TjyjnyKrMtjGHm3cKsKCvzjlRKGBY6W4sMmGUdxjdxMr1yoTTB6AFBj8Frxbe+gFiSwBl0aZU8qkum512ELqu45g8x5DlQp+6Q/ACi9xkAMvbGg0hJWkxlaCq1NR7EyAYatbjPaJy/1pqBkWO2Xr73WX6FEDrNAzCNWzZNaIMSVa7XPD114R6i6U3UrQoBcG/YGdYXVonvDh0ksR2O1epI/toCbC80CgwEd3esLVNqDuqXDuZNr+FB9Cy1v15vclewKUJ1bP/6yZ0yy/+3QFp8KRcaucSYJKceka0s9347KzoW/MAqtAEUaIhUAGWoEuM2Yn3KqcphY/mhibCBf/KQvazWEqUCd94t0rJe+N7TXs2eMX0+zQT/LQ24w5jW/OEJkEVSSHmXzjtEuvyVoWA6n85rLhB8CdH4cQgKwkcMdW5KifhQVaD4YQnagUdb77a36WPYKiQ76z4EXJ9rrYg6yahsay1UuHJHxRze5t59IzNcjPCgd0J8l+mRtpsW/NpowiJnHUy+3mdpRloLr+f3p2QMLEa4xBjS9p6VkhLGlqz5iXWk774HzoOTcpFIdnknTSVrQpGOGJE81pCI0ZH4FTuGDV039vUa0S/lSm0Aaz3UOr445a1e7RHFYoMe8iiFlRPfmSQvFB0OS3ZRSHNgsQeuR6s7wcEJaueCkQqFVW71w1gv5nKi2Ni7QuXW11qXjnmFo5bZVKWjsqEDL74iF4pBtFiPDU4Wq8Zi+MCl99kY66rr+ngxmG7YjfXbD0YG7nabyygdmrJ+YXNx981ZL0U6+DHWs+/cCye6TBa+7iY1CYPqLQ5RZbmj1Iql+CzhBB5U4wc49xBIViCObLhKzUbXjgg9Hqyg9PFnWZ12Ybte2y0uW/GZsPZvp+MGuY/gTejhHRm62RuiTRBdMgwN8JbwoNzaGPgbQUXu7PEsMuuWPiXHSdKBPUVN/XWvozXwkZ8lenRJmFt7R0EnvfKo/eFsk1Tml1dQ3HnyzfFXrqOlibqc+q+iDfU6EdoCVV1g1NUwYqwbOW3+SB4tQaOYGcZ0F6WG8rIoqSGjOCQVHNFgQ7Lx1dAsNnWUoazvVS50VNQZ5cBxODnu0LbKkw3xZAKtbzTDcedvn36+qf3XusQNGFkWuwNQoaUkAbfiBpcVnmkOur1bq3c+XSLVAvYFA4lQVuQHj0w4iLvRr87ct9FUfKBnTXOJxtM7VFp5+tUznatBxnzs94wJE0PEWAyA7BKutNzp2O/JLy7XrSe+AOoMe7GVDdbHIVcsXLwvqyJBkG4LNGZr4luUQRa0FCIU70a3ALqlQBCjvkyHgRG1rOdbLSjjmCyuBAiQkgh08gNQMDdK7NS3QYvWtl4FEEWPVXzfDKZVWfTfj7eSaUrV1HhysCMDBwUhX93za0fa0k+OJ636MRJBKnr6dnHlQkfa+Xdedy079kkuVTb9c3r9/RjduJWWAaPfkJZ/c6rQFxBpTBU/BMLipRqNayHWIkp/wRmAqahhMxy1mtLaS29vEGP7WAVPp2Nw3a+HzGKcPNdxXMysMuA8gJokvBEO/9Z6XMtk9Gn5pyynXJ5SbDGOVNG1NY9txdepgtzsKTGe5gV41uB2PQyCHr0LQzVLZ2LHhYLEy3oBNBIclxqHFQ5Tymmd+ixbj+9YaqkmM/No+ZZfZq7VbFyQFH14eQsj+5fOaRb6dp/SoKzIb0wK/xXQ6momPKW3sq0Uxk0RzUAgdCQeSO1W10p19knv7r7QgSZ+q30sOkLlhq/TY9CIanaRn18ntfLs+cbEBuFH5hQx6j1UAgJGxjUz17Ap5zWGhf250/7a98vrt6ll21dNxj9ssNPyRNn7H0zAukpSl0b++1PZImaBd3XN3967Z1iDOVuAfK9OeXJ1qfcsv4APBd5/qcFkW6hyi6VORI729FVujn/8JkAQkWdXO4KRTgy6hduPTljZDCTaJt04X6VbDVg3ZvUD8iSHWfSlAdRqCy7s4Q3FKWp+DcFxVKNairuAhc4hs0VBpRBCzU6yEXxNNZcWbu9g+Oqm0OYtsFipBJni+sASMqbjpzqJatCwlqlWi2c3FG99/BYI9ap/MFU/3y1XooLjln3Tm8CawfumuNqzh5bkVjW3H9sGKafJHhke/rgFsOyIvYn5iV+DHnLkMobT4Pb0Y4MuefcvfLjAI4YG+6TtL0Adv1t118qa7SEZEt3JFRzI7KvblR7kNZ0QGFB8yIMJrhkfJZmTl1DyCe77PkbrupD9Zh1BvSe49gXcXkcEVCeLauDvnQ9Eul7glA1dsHg3tZ5T3zuvlnm5yVM3fwKVwT+8Qsuwz66kezEOQTd4/j3fFSn6g1KLfG8vQOWOKMMWYcjj/ggVWUM0olUzSbcUp4S6knc16DFf5S0X2cgoVbjY6grTtxsmDg6sZNHBKQ4B9jwGtw5LYWtWnCWcpcaUfGsODE5vXLoyJxgDN/9DMFZxtlPBm7a+4mxH4w3Pgw2FmXKm6Xif0Ip6WEnqHf76pMaNVsfEoDEpYqkJoowkhB1bGknEZzeKZw3mrRExWLLCRtlws0eOYw98UtRM0UTrymwu4S0aC0BfzHLXFe2QGsieHFWpd4GLTFMv7GKLB4Ps+DXEKtPDdT5pstmE6rlEtDP/3FN9aWt5Iltpt0KrdtU2PdqzmocArbxe+6rJoeFg/TGkr999J1UyWeWGNRg82NQTT8aeI+ttKif9CQ4IeIMHOIRvLLSk0Yh+GK1f9i2L36NiBL1Q+wW7oPkt/k+R/gX6PamP5yckKdNFgCi+TZ2TN2p+Ryoztyd1rR8Dod89vw9Qx2ZMKyDYrA0yaPd32I2ACtjGp/Zt1oL9FFpHlDjRj1vlTUfrNSXraatH97iYApwKoG8a0WaQrdvT7ZxedViYQhZndmP/H6+WzdL8y2X4sUIXKsWKfPARh/L16iYJJPeEPWZeg3vzippEL1t8iREYJofZae4dVyZ4Br3pv77JPgsa00RutJdL3ms7J8O05VuHkF2GM6McrQBwF7LwoxBR3TFC/AQffLypinYYGIV3IODT9zxx3JoOe7vLVbFkEkBzgHyD/h3TYHe6S2uDbxSwtBIo1Ltp7X1REggGme5Du70Q7oDLjvmNi3z19xMcCJGt+RwJAW37u/rFI2qSiMBOUUuPKGzJVfRzpyPKJTc3W/tIOlvcxEe41lWwk0ZoRrf2L4sMO0AcI+J4K6lCn7VBKBSRX2LCsv1wZ0McjmTsFCD/sxB+Ji9QUKQ/MluuayoXd2lonrrODkxxZSwHoU1B17uBPLQGHoMlsEqWIF/nQFVUsusj9APoDDnfLWQ5aEEzVMBuVeab66FJsYQts3Fms4hENkv2RQD9LJexZRSDxyL1d9eVeHZAa4kCWG8eRP8mYMUD1Tcu6hFKnIu55+Cv5Zn89RKj92zLZXKgskymeWcxcQMk60IRZJxGH6Z3RFceWyiL9xd7UDOSF3GdShxo29I1TPgQiSHigMswiWhDTz1Xk6mP3EePeQG+PtqBZ8QEeeNO6Cj5TV9TQiFoVzDcui5mf846RnNM49g0P5fXvmCscKxMPtuVzPbTseGEjKTtfKQi3Bs8+K83J35guhGSM1Qk5QvHwVfUcgbmA/yw8tGg4otwBAruVLsbJd9T8LzatH8I9QgiFjevTldFi5lziA46NJC24MjWxtELWfMSUZIm24QAOVOyHZfLJxPFi5TlLtKNmiiuJbHatWc1KPoho/3t7B+rQ5KCv7Y3KcUmrXcuLf1MGtkuUb7ZXhpr2hA6t1ekShkU99FPLYGLMsz64ACUI+KfhmEBDZx/5UV2E30XE55vT7uY/oq3VfXAj4CjQzfgonJgLxE+gaNVNRVTUmBjd0zMpVHbcpH83H/sgunQBEXOplGcn2y+8mpi78p3rUAGI399VKenn8VQ3a10kd0pSAhu4+LzIn+NqFjlbm90kydN9m6KGe2wF98H+829jVYteAdDVTCm9sVTdUoRkmtKsM6vxZrR0rTGO5XL6AmZWNoPPGTIitikjZ6ymyerOdaPbX4kANz46kY5wi5BYyonWMwZeo4hrSdeHKZWJWtkq8icpGJ3U3mvTXJ+xtP0TKw53Mru11k/HdCWI5f865pFc/7Y2+3LRGJ/v6EhX31wH1ftXGR0gQ0iFxgaj3wET1HQU8qeTCmaMKKn8fgDOn68SNxNOKmkFha5TP6YpXX3cUycvsm1enR3dRU8rDyPeH/+KVSuVJKra6Hlkm8qyNYhgwoJSjI7K8HXrKahei6dPKleIzzPYqZBWLvCR5nTG/CJ3CJrSWNaz9RybFscNKbeC/Bt7cqMsf6J4SU/ARs+Nz2c3y7SdjVfvqa9q9HcWtwUp610tlqipmHmD56PZvrAqa+Fb73RuEdbvBpexwhEKbGKKS7BbF34reLA//5NXedDdH19pC3GRr2/qoFyqooK2p/XZunFiDkAv1iT9XL9k5tkQKSYBDAhGUHPtHS1HzjIK0xk/FlXgAZEizTgudVp1afjALbsrtEmwAZogrRb0dJl8TO1QZbbb3H6iXnzoOMFv/gE2i2bzm5DpOQ2vP9JGk/rxlcZB7JPgg6R5hNHCrpIgYvIEg4tYXk3LLoUpqcrTUYe7dVMAyle+jgRqpIlSmQ0nJ6YbCYUW+o7lgyhvfWMQtI2pQKASjx+/ki4e3ysjtYHTwZWrgNFRv2WCxbDa5npYl0nY2kbU2D25zrig88MOG0+K3DvV0n1UXflObhilUFE1BTHHNFsIkyvAbafnGmCljAdieWLhWh4YmbOaqi9lxj0fQnDmPw9UPmhKt2FUxaqTW0rAAGDPdso3GOllLGvuBo6EBYYrvThP4NToWI3n97dRrXt84A7q52H9AX2OnkxRTL/kXRI+1+itz1l03HFKYJXXOeE4WhTExEkyOcpR0XQIV/Nbp4iFse0LZcGmOQOg1+hO4ZkmvVMr+4FovREOcLBc2G6dOpCQsg9m2yh7yT9/3r/lkFUmv1PEcH1OuZ/DSRdRPwlTH8CcXmEyMkuZ84qYKCpay1A87IVQDC81X8ul7PlFFqd3pAiAiNkjVESx5wRZ76Gu9n+rZeL+hupCmlODY72N2O5xFE47DKjGaY8xnGFzGlaYbmoW3O739102vur1GhTNwoCloDFJjFd4VqjLRu1C/KqD1yzktRhOaNjtY6O6fNJNnWDPI8f7Cv4g4f0Zt19tU5qBAT8qaHZNgfQWGduAOsUUSCrRa/nlpcidIpykiJeaiRMchxMDKl48GNLDqFUrsKjThdP68Ki9SPZ1kghs3+Qm1WZmXq3jS6k15zHSTKE7FeDhmHWJg9eramcpCz5SNrytWrW55aGV0xwoHuBLaaTsP051ApTBkd2LbppZk7eR1glLnnLmnqwdUMlD2diYLbBmOIugk43tm1gYnu6Hj7HyZj683xfIV78pnKCfChUIRj3j+hL3OoladCoq4mTlxQngeNAOrfB2CWVbwarHWl5CUozlzjJMvb0v4dFO94gzBqPrRDcuNH/FNJk6ZGl62PM636txclk/uak2VEEBnPQfHqMopj9mB9VPCQ/DKwPhchqyF8KDTtfTBH+g5OVrSMxwtPO0yjNTIkShdMvEFkkcclqOm2dB8zyN3ZdCtu3r9DMoHiTrR/yj8x3AAaMWMc20i/BYlGpTkzhybHuxRJ2d19MyRsm2TLGiddYgI8H1Jg0BzaooihoQpIObWhtMZrGjkR+mw7+MNRKeXNBFk9AcyfFD3nntnxf0+ckmHlYtIf7FWZhTUvpsk5ktUVct9zWL9XyjeBE3JsQrjRmgbspxlYVNlA7fshKS9F9Vk5ElxK+BVGATtMAssE3KdnbpOWY0tA1doQaHJOAHLXQu5kNzvoOp3FfnsxgU55QBbxbOm0QDPAhGJ9stD8Rg4usDJ1fq7yjK3NsXFWbooMk8AhcIJcCjL/aZMxKQQqxWNXIORjyYnd76ZiXVqLR5sCwzRGe9zLm4m/qr7KbngNsTGmdIEqx+vuqNjdOAnlGrIf00pXa35pUNHoJAXJYQ44qB+ikybW0/xUCZFYHafXcjB+UE9H+UocKT52HRnmKXqaW1JNI+Wbz8IZDSZJiyqn7+r/Y9LFQS7RCI6FvPvaF+GE2z2h5kvVxba7KbcPj5JB4fBHJ0EtQ0ZH/NbzqFdNZTwqlMvPMDAWHNpEMNbK+bNjeMIZ5XjhpRoNmPX4PJsLCwQ0v9Ro2UiVH4C2rdkflEftEyy6GZcCN00URSqbYgmEAcI8uz2dLqrveZv+p6/7nxAYcytWRYGXThoig9MGGCqTQtShNphbdo1wXIzJ45gIijdREm2hkftTN1df7Yce/ZAZs0UpV6PzxdyntuEl4uuV7v7tu1UzYwV4wo9yzl5za4jrk3rTtZPqGouYNGOl+i938Bf3PGCQgy9r91Qq3mG3Oy2X15Ll5CWrlh2JKEpwk0Qwr4FZ3h/odCFvRrkj6vhQ3IeKOC7WEeKLIaRh20tO4wi0FPvqX/gCC/8/JecH5MCaFWpoZxrBWyLD35/tqjdPnNWzAPMCEyrQFI87js1pB3YfEPB3CZdJay5bfdCrYrPp5TkYhNqetL34Orl959kvo4EERD//yzuo4MjP5dA2e2ejRMhT7jESy/+71MG3JFofeXfx6SpjSeSz8kfejYFp5vaOQ7eg3nMUxLUMrGWYnkAoqykQ23Wu/uj5pDdWGri7dERQ/3VdxgexSaSaqHrHG5h9nr1gNgxp+vcv/zjdd6ECdSOihrYq7ZYQ7ePHJKJ1WknPAufJ4cbL5/GhW+u6cePGvXwEby5ZNImMnqV/xEUKP0KBP9LzxQLdu9CSRGClyL0fOZ3Erb/VzGEe7j+CtYTO3XPj2xZlUIy2bkzrzlN1b98rGqToYxzLtF9HtGnNzNIav9x8dc/NfTxhGqhhaorb4GqOL0tG2bSPh7yPXmRuPdxSInsSIfPaXhxw2QLi3TYHYj8O4O+dAB9zFps/l2BAXsvgp4evRSdvdgyyuBpppLO/iFjkCCWxYOJLp+mbT3Wso4wygXMzuqhkBQaUT/uPgSD2/dNl0+W7YKBowuhVmfMc3Z0TCCAMredFjw9GPXb+BdV3oe9giXjSuMiV0H2u2OdL+A/LoANwW6xXbX9e3b39f57kagUMKoXgM0AkLMK16OW5lNflHDOs2QIeWSu3MzQQwpjNxhFitCq+Sjrlxwx9fPPo3mpx7UlbYs8Ed5KN6LaIs8kIpP+I+GEz47oDenR7+j9MJR2kA9ggt78cTjRrGdXmQ8YCXwLq+W/y7ZWYmKnE8uN7m1sWRDMzv6LQJCT9Q1jycSVntf1wE2/6hvmLQ3cf7wIrmg3fALmH//KS3LPj3pdGh3qGmnuDAaI2KWwugMo0tSqEky+RV1MsfyFllCDjZvY/XyvYHaRWHtA/bSs1UQmgXSJFCVUn60nfQSMlgo9iFBMEv1GtjnsOdW22Ou6Zz/7S+oNVa+Om/dZuel8HpF4vMbw/TBl/AbS1fTjOFX62cNY/LraBaUD4BkSa+32othP7Wr8BwCFep1a1vWkuNpVT/1WLMmFiwYci+Hsc98k6mCKDYIQUOwMQmJDVOwf1TX9JR2QTqqc6uI962N+lLQZmcFtmf0REEHFm3rg/icQIJNPm551T6lC/1vU0ixN22ds9QE/ePvG1H8nOqzXo1l5Fixbb0ru+zmh7sXlslv+zgr5jbKm6F2WkahWjuT/BaSKLjBFOrm3PDhXT5k4O2L2BU6taqKvdiSSbyZzKglwMhBqG5gyIXAkpy0HoevD9fgYPuV7VCvFxW/+J3F8IDCvR/ANOK8RlN6ag6SK/+VsUL/UynntIXUtjLs80H3Itrh+jHjc9Y6Illk2QTOPA29m7dwRpz82F4s0e1er/5t4LT/Sp9IOdPMnpg3NUKJRpWrKuQhF4Wi9bmXdS4MuyuhPpItzqBlwIx2Wb7ESWkhKSma5qnv4h9Z4W/Gtu1juwyVB2tdwZKUpx5gqqGUxcO63VyO+SNR9cu4o3lgXjobxitPl6/G0uVM1Fk7eOKF6QvYiDRwXl5vJdtfzuTufj771XWStxRjZ5wlbVypiJv9j/4DUyo2k3t1hDJIuYshwLpUdE1MZ9rfC/siwuoi04wUHWoPfGNw/gBtdlXafcyzFOd33a/S+hOAVp54y3/WGe1lVupGDCxs6N2Hl9hAesFp2wA28NvORsedjm4k6UhkEs52nz1lXqeBxBlmf+ZNTRReKkAaWJg9SGob5rGCepiMw3LGn3Tv5Q2gyqI01MoXE6HrIAPTFDPiZpYRgy44U3RzQ/3eFrQcbZxqcLRfiXS1lY+CoyGF1LpmY1HIOU39zBeETwTXHeG4WUGO9wK2FHMqY6bodjZZXPFh03qgJRIsV/mYke2QyiR+ZsfnMgu7yHBAHLPdXC0JzN6AYeoltwHTmbzv2B4s47O59vjJ1BriC1T1Jl/T5p/OEMkQecXl5Vtjt5OQ7etBjZkUymimLMwiIKdsY+duLi53J3j6VCG8bgntwnE/4ZtXnO2OZD+f2FyZmTbpOrsQ7rg6WgFRr4nA+igOYWAGJZCIzsxUFlfbIgY1YLvmoG7hznTAkvLoRNHjRnQkB2vVLk89ZR6IisoTSsxZnyakZSMAGl0BwBILQdZn6m8tELGwAIRug1VWKdfn+ZidZmhZKTOdN8vguSJcdBBvGldN5u8sWqPPSpkyNR6trZeriYK3VzEBgq1uEX30DqEbmvmpzdvmUPHDyVjajiTuc11c0ZS/ZWcBwp3vKyeJbABQ2tf1GGbhFEks4YAKaijtg3VsjT1lRsAHR0vwCEcgGscnysY207eYblx8k3694pEtv6aib6TyaEtCYDLjG+K40WfIojuhyQvuqLqJzVJ3C9zzoIE20TCXxw29jkpWDTv1m4Cx5VEu4wYuZujQrFKbJroa4LYD7uDDrkmxoAyHT1bwZRRRlxkowQpFzadhPqMiWJoSt4ND7raYOG6Gub8+nATZswB+jS51zj8RjCMVZ4pO4xkaPt8zU7lBGQhYZMUm0BaBqvuPTPtynPrc1OgGtcsGMrOCZxG1SH4TNVJTVgy1TMhjCS13F66ytK/Q7IIPXe1ZUtI/yljID6ptGiyxR5yb1Upr6UaZd7QsYjMUrosJpEvNDtnrSEDRwFQz8XPhR3kavrFTq/WTcJF3dYMyM/hoR3o+k98N/mtcAtPC610geo9CKKntbqGu3wQmw19K9VlaV2e/pQjPUaTej7O1TF560XfbtH3CArySUYGb/D6JEBiruPk7z8EwXUr7py3Es8xum5mjhTz+KtDVNFjRvh1fmeFyPV62wzFadh/v7u0V9Pf0gS9nOSWImAMOgP+lwjXnsbQ2dpNFAod5Hd7a4uJE/1vJ4e+7JNKOyfzJ+AM4vqV5hoi7Zl29yWY9ydTn0MLDd7x4DYmQ+sWipPSs2ilGTpffmHToY2Q+FKsUMhEX7Xh0y247tkD2wEM16U+dISX0p/AxUrTNH/bNy8TyHaW3kW3IhrPtZ/rjX2h83v8avwqxx5kcvAYEIvnq3IrwE0g3yawXssIydSwOykb/S5vGfbXdF8Knabh22H/QMZ3yCjcC5SvbBbHGfWqvrxHqAEd1uDzHVneuPp2vhC5pi8ytxbl/oSGCJaXYLhPQxoCYTu5h8tFbWGA+4Fx4fTgTWGLy4BGZN1KR5HOVfZUKUzjroIpALW5ltadHRdNvsMo70YlwSk/qW+u+1ywPiDxRkPQ2pZdT0ES9Fl46oygqMzjEYsCkBELZ/3k3ieRRH1E3BL8okhfz/qRkKJOLS0q7Wy8y/IytHEhT0aZF3u4dbnuHYPlDshSraIzhPOwr5SAu1JHOcXJ/GCaAl8SEqpecc63nWj8HvW2IeiNwHaR4bOc5FX7wFNVQz9w2wcDq8kBwgkkepSuFNcI2LeMNAbIUJTTnDm4skylvEKdy/PxIeO2D++pzTm6ktH/OmCWEbPd1n1yJmHIE4NmhWg++YD1/gYBBfPSov0+YiWuu4DUnmNqO/TfZygPV2P6XgRj9dqw/tZY0EzE2NnSoix65Y7nvsSO27hReQO9ZA7mTZ2J8zFtuChZhMUnQnwwI59gPvxZ4GBw+GOi31ubmMZp0C8yeQKfdzv9Obrq3aMofZvqpLZPHINEMjqBNQAa7YEep7caim4K710v8SRBUF2zumphLqIcLrv93Wq5+77F8J6Q9nJSkbHqjNeJe6UGCXbQVTN0PZDLs5mkxuxzhWSh9CJ0eJmLw509jBcOdqqI6LIfKvz/WqCJuMeR3zLZIbB5e3BcJDlVEuSVvPKVnf4qolkLDisZhe0Rpgl0p21j5TKC8pWsP9UFl9SSbj6c8aIdhNvZR5gVqYyyYCbTyG0mt62fxcn0cATEg1xzgGz4jpuAOlgYcfQ5peRDiT4sdoOE/gXqZ02B2RYEJdIiqldcu+pAiYfrLyLQEpmjD3lQ9qFHtskaFq2Uj9RLOM2Ml/x6QDQMyej5mpo0GDUgYDxIoxp0ZBrHWkU/2ZOyjwlC5FsnMsxXdm1zaxLEOpy3rFM7RFZ/J3aX7XC+yxr4YWlo5D8tQRmbh1JvEas/RWmBrSrlY+p51NOBphRnV98x1ssQphbYeD5bRjBGHFlzNKM/Nih3k/Bc3msPnI4l+V9BPB41r168qq6D/SghqMP9lnjQzQJoEG4BiRv5kaD6fmXEcIJGqs6SdB6NBAxxrQQBkVh7e6I0UR8rHwc92zwdYyjzaZowJh80g3C0YawYIB3NeZ+8sZ2NBrnivgONP67w8+2sA9nzCNsEjJNWCw/hPWIBLYQtz20EH50/pxQlXWVA1pOn+aBQTvo16WFZARa1CIYkMkFmALj/DMI9GsY+Zwm8hWqQynqPWxSBafgRZY3y/2Dsi99aLduCS1CJQceqVWEodp5zsri9GbnH3l7/U3C1Pxjw2KQIMWkrY3/7J1lE+IjDZmHdpQtbPTvunoBCqxVUurtFSP6rFUAYKacAz85H3Dh5wsDVjbLRhFyhW2UAynSVJCkfEHtfOzIqgm+YPbgX84nPfpQlbHWZoQnHibOBH/zT4dlZ5IuBjjXcd+J5t4QL/7q9iJIvkZISu8lvoAKfssdbHCuCJA1ZUH2wKyS1uUELx2zNZlk5ASj6+ku6yO9qVzaM4NPFo+/FWiwHRdWex0jE0TarGIgm83vgegmIxF4y9QD+8TXWa/nyQ/F2FuLFGXIVExVbbjhqJgDZYiJTnw8DwfUqNxLCDT7KbuzthL3tUIxS9qs9dCAZ9zFx+ExH0n4+rmOz6WC84JOQOeZB0Mady1JxA2ce3hRdSU6WHtH+nXwhg3frjWjHlx1ZviBA4wb25CrYooFM66eXemmUj2aewU+JMAjXsch/Dt0sp9s9wJYtMiPfRQ9doA/aytj0pWViuM/gfroFVLuWj7G2a/JCWSBMaHAoYou/9fj3etp6b+Vx6sTzUkftiyq0+p6ScgXQMCnbEh5C52z0UF8S5/W49it/gt0GoLsG8ARCkqJeZ5b2if1pYU06ZBYrBcFu+izuGwO0HUKA6E68i7XsHjTQo8RnNMi+GKo9ccUVsNl2l7uUSx32n9M7dD2oteu+zXbyJ9tLxp/O7ckFiFxrXL5LBc5X/2EvznP1fVk10LEKaXx8PeGzLDGBhcMgt0yK5CQJtLvUjoG4l6j/GWM7T9d30SFFJM2OUmnDBBlOXXv/cBP495bqB7pHUWHdBSH6+iNbDhvnKUyOaxSxNzoebLQ/PvWRRqwhFEAtHQhpXJmok0kxCEEZC1fotwVhOdX91AUbSBoVr5VXREr3utSsnSHwfWJ6xsEMr5pSwWt/9+l/4xfj/cUZiJOV8RZMCpeRP0pP8WhcNBzElqMP/YPBEPBpsUi9iiPuXRZelP2N42/AedBm4VOkQW/AsT7Bm0dMKbrMLJf3zbbV8Szj6KgBu0dkRWBWhuitajxyTuIjmeD9Wbonaw0Fq0+v5Ug3CvAwrV+WAeCAtG59tlYiebdFn8yWqCcXztu7Mhn7u2RAFF9CMgqujqcl7+Ho9kaS2J5wComDNURDpKJ0adz46VDyU8kD40pTNJ0NSeoD/kdk/Qu0qOLvQZd8xB9uOBADwS9mGsQxmuX/4GzqPHhsi9sMsQWtCJjA902eyDWlHw6+om2zIWIGCntnFiDlX6SVEMozrEcPmI3f1inBH0hpqhwisrez83J/13lfHkXX+ZQ8oik2FvuAi+8e0ixyDcoLgn7DQy7prbdWntrgQBPM/XDcuVXKWgt+25PxiTHSiAZM03gHMWnjGmFy5S6r6gUcyjv1N1kTew3XXirDeZth4z/C7TYwoj+UVx2AITAAx8IMZe0mCXQs61VUyMG+H/m99vM4NFIYV6kRTFcjymZo8VwzdJ/RgOybzhSBo3zavGLb+yFuGufyD/NW8veZxyI2KPfFq5Do5cUvtEfBG9sjJNpqsclQcojHaEd00glJg4PLjNrEeVp4YseH7CwIrwfrjO7rWVRh33/JMUZIYAO2BZoFtaWh1WU6/nkLhtUY5kZo4rctG91Wt/XjIUKb6uhNUjJdgEzChShbULWo9ilbfPZZzBiL0e6aLfyMJ3Dj+5k4AcQIvSpdtox9xe65YJ8CQHvNaqb/V7G0zBRYaFN+Yb+fcUdEb8LgfdTmM2mFZsnR9D+YI3pziNDonRL3S6YNJIlrXiiVvPjysNIMQ1PNARpuKQBqwzRXfWhktQfxFz5679JQCWz6nzijvsncJisksAlsE1RXZdWMd1k2IxzhasNJtN4g6e3IxglAB1QmawOnOycmb9QmjAQbLONxOJYansWhZcm181/MOqubOBCCYdScQSosgXYtIk92WU27OY4HuURyvcci934TdG9EmRqaV1s2e4+479f/NebZ5F3rdW5jzjRIP73X0Li7ZOc+RfShHGoZd83ul7jwSyBk6Eft6n1QuhhsiAtKVc7wQelm93bAAQbvo3IM2wfxcrDKlJBI5vexeVdHAVyq/zGYQpdtyz54Su9soE6s2NVd5rAgR2H2hJ/lwpVHdkJVfvTjias5zdIoigttw2jFcjXE2ZcBYxnhsBXi6pFjRdHafWR0Mq/EFGYPPLNNJ/yfGc7OLfZNKRJKkf/+MXSoeqCiMuol8M0ysnLn/eI+VoSgGBnbkpia9XwUCWDSJeAJtQz2U9Ua2VFlnE1xG+n4f7raDyHr4WX3VDcOqJXQGTuqh+PkrQ0XYIqrSXmD2FtXwNI7z5hLYQE7RfsjIYghUmOLGJ22K0n1PcSFghLgzx4NelakdAmAgyIK1o1yUBh6b7Qafk962/TpKbp6QWcmM8cDdSSAytexuKbHIutYXdJ6+e0eu+5fibuLoBQuX/qlmSuGY9ZAKKR5/299k7lhXiKXAkvtQbPwmTkH/6a9cL5UgbZo/hrckLGZKeNIde4yErtMOh3TvMm89bQWZD7MJD2XwhtlTXHc/D1omCgqR9yNhp7vBVCz9lt7jlUQbgAvoOCkXAk0/KKH9bZK82Z1J5JZrptLIE8PO1HKYIKFl7GNqPaw6lnn7Hqy5uozPSmnNGsWIc5EEN+7uBYMMaIKOUMxr/qRMV2NmOAKQgXoAnDHXfOXEbpnz01XcXa1F+GEh7VL6Nr6rCm9sU9jH65MRhHYDDP9XqaMij3sjJjCRSRTwS7XoCKPWIxQeh1lVspklmlTlCGO9RFTOzyAUcguMrMY2yTRVMoeF1m/qHZj8AyNYiaziat6B/iz4SRQaZuFu43ero02L0/ZaBqf0CLQkdhRhR3aV0IZtqVME23Ttpwz9y+5ZQFzIni8QTElMYtdUcJJeUFxDtbn0rMAJFOJ2+FSSJs8MUoNLKmr1ffLakXMQs/CrMJbL3bI8OXEOgVqk92fBciislccoRy4iNlSZCf5pvSbF5+Hqb3HybWd9DguWDjcJLnPALxEAC0ru4bCGEq9g++UoX91AlPnrO4VanqDxWI3RO5/gV7CR8hvNYRSUhsvSRr+g2Be9jMcBZwq3kj1sXStLwDAju17PYkXzval4KZKW2SnfKSuRG3wgN+SqxtO2HPkX3w7wBGfWor4xKzfHI1K+sx/sFNw82k7s9yy94Ro02Gcv4ack44Vs1Iq6vAytVDNGlxg0ZXkcfwVXJ5zOEi0NwrgKQsg0OPVipN4+Jq7Q/3tKIIdo0JFMESvkLgZmn5YiwpZDeZalkeuaAyI3VOUIKdIk/cIrKRFzdTCGO4arY1Ar8Cq2gRKB2KHtBg0vmfbWhAE1jaR7jbLGjcTMHuYV6Sgzxd7IDic/sftYJBbTeTIN28cIKaceZzaa50JnIWCxJqx0Cz8ng2qO+c0RWO3S263M+6mhfvTYm73KqorBUo2crN7Gz9qUQrIEykW9JZhZtzmr/xw0ssAFHD56XLNuzr1n4kPastDJbNaZjF7XZlu76GuOj8Ybmzw3dpbB3dt3YU2d/AZ4p9CjMq5Ek5cZBI9c8bO9eGPearHrTSWfDnznKIx1YBZ92bcPPRlW5qYgVPQK2mA2Pk7WPS5oTxnhTA6a1YCfWNxIxKLmYRkdy+VcccMNWwO3FbuzoqpGiXjKayl/R0XSxu+YPMF8/lCZT/a2zJloZAXTwaaO1e5xY/W8oN+4DAIId0GEB0JScADaqrhU+LNxrWBffO7/7q1mLycdYiwXAR1iaW9fKD5gAEOgmylHpwfjmphfMMSG/hW2kscImFPjrVn+mpuRCW8XrGBC68IhIwb04mDIeY58s2OhYJDecscNAh2gu9QbvUpDz6f+8MJmvJI2MpuAMRRcyYUutYAW6eAwSEbjHFhnnBwCFwys9Zc8n1XF5cH4a6Dnmo+J3uV1iC2VfzgzNNE1uPXuxed5CnRoSpyCfOZ/2lnNKfCo8oJ0VA8G+rXwkYQgpQsyan0KC5+N3WlrEapBKILD4OT7vxN/9UgjTpDIxTH0f+C+rcn15Z2YCJCx7/bp3PYB66U3nx+y3KA9ZlnprEr3ultKmw+OoFepiFYWXBrSFPo7ZdHJKIHC5OwoZPKfstxTHQ1mJE7T+bGD0xs2/HQfP8VpQcCrpO388BzEQcw7Dy2rM6yDN74c+Lm5qL2aMiFQW9MvhaFNVC8lj5dnaDqXZcNvFj/uv71HJXlxtIko+R6rGiZK+0QJ6D/HNmi05AIQPp54dR9RFyWoMQOhL56pnLC4a2xKIAB2ZgCPPiu/yrIknj4WLBZ6tlBI7l7CmvFqT0sTyrO4VigtE0keAL7/uelaqQiKexCtwQiugyupu+fyqkhNimgfBe2pRCgdQb5IHMiWECwk9Fm40UQRNdqcxQm5dQJz6zgRSE/sIIKKD9mrocK51xQ8poajZ+Tdo0ukDcA+UhTtZ/8ccgqcGrGyNPRBktvn+dRdplowiu9oSHa4zRZRE8tMt4EZk7BjHZzvkKheQsTsX0BvWkMFotDetghBHCwRJ5ntp9EsdyQEjKgJhNKKyGSoGwrbCSHA6NHTAOR7dmVV555EvjwHGBEkk4ey+qPRhpPPwXA+nFMl3I4gNYAILT1EM+GUzbrjCb0uZnu+ZnJXgLfWUmTq+rDiInqN1hb7CnIiJlm/bT6WOwtKz7I4YRT3nFgkJirCl8nKaWo48mTZZcNk/7SNpKGKU3VHbCv/l1ScC/s02e39PDHtWhK0EH/fLWHaKZ99PVMV22ckCMDER9PRk6ttEhCObra3lVljs0DAhxwDAMqOyKMEXfO7YxdOCVxetE55jQE80GCa294yonG4B1gz3r+4DoIy/zWcY+j0XxHPuPi479cg/Eo3Q9gQNqW3RxRXkrJozANDjtxv9cV8gS1biV6n2AyK6SWrICwFDHS9GaqMRQuP0zFqYush7RjatIZjxUfSi4nAVBuawQcEOe1nKxDarqyEi4o+Zu90RfmB0ct2n82XSdbhJXI+cBpkr9qPiA+5Q3Iu1uEARxZq7N1XmH7TSv3VThjfwBFRLF+RbcUkfU7ytVdINCDLoIN97Kmc6MSuIm8hVMsMj0Oin7Gi+medIKrGXbd85K8dhVVOBs2OcWiOVvfRhGMEGnIv3c/X4/k+fVkeyRPnlVnTmwddOMOxmSs5zFinDSQ/k4/AZx1Pvldlt16yifqepjYSJckQCMmlXMrLZCOIEj4ElOvZKNmeA1LylrcmjRXHMj4rv3v4Oj7d3F47GogCJ4UJrpeF9bZPnmuZuvE7jZt3tA/n95xV6npJ4OxYwhjXO6m5QBvAAKUTiARpnLBMU44enugl9puu874BSh5BiUI+W29OOWpgnnNA6DjktepswCsnEQiZanVzfdtyL/B/1is3JYl4fbp5MtvOqJui3fUGtfqejToq2xbtfvKokRn6puEIAs/uYNfdl0Cyu2OMhYogp5TgQBcQF+oXfAGgDN0RLLIRD5GVGA6E+qNxF607boAm3NQS09Uw3MIuWDw7sB1ZCucH7IUzJY6nizY/WNwUJfLDGM9vTcnJXT+WrOOPWxy7BH5zBvpzGWoFe8lk1tFCBTwbYRtrW01Duoavh4c6echZVQdG2bpp9t+9lJUWUS6zWqEtCvXSqddHS/Gjc7KHam3gVrDxLAmNiorSrinlcKr1R+t3e8Fe6KOLLA6TcA00vgwbNISgfhnjerb9NjGg1r9oBiOoLicQrvIyxWMuswH3mraUmv1fvH2en+YFtef9kV4pObcMcJCIQthQOVtWAPFciahopoZoTCzQU6cPsyAnF+bTrcPX3iylVT/3apVta9RBkFmZQl2snFb/gX6GMtWYmVncKdzU1v17GFWWro5jqgRGSb0dikFtJ/wGvPezdygnCVDBi+QjJPXSDV06g0lxD2hAshXGP0LTTDMUEDDAV5bOWZBDGvk26czzmUvGrsgxMSQQKb98KeoA5fvw9h7xRAyXoFCd60L2gPXFDqXa7ysnzFCafm/FJrgPZt/bKF9FzaHpO8rNW4mLbOT0co0SOuolekaA+WqHyZ8SE2v84LgKS9sDyS6cgDE3ZQefrCrZ4Q7n64gRdmAMiv0N0XpAJ115aN80wZRZ1+M8/SfVoUAE+OCD8QlXYBBvG6rkYo+0I5EOW46NtgUgXcnBx/DDk2JhgqcGbhK8kSbB+y6bAXgEZYAS0de6J3vAny26ScOysat0aVqWsoQ1OBAeMeWpgm2qBFT6vqsfCKtwSGLw8pI4r9GSczHvvNunWeFWxwapzWlM2TOn0prLY3QFJRq7Xgu3D0ihuoSTJIS7cL5xr4SkJPREEY25aTQyvGUu0U0cCAp+ItzU9t/bAd5JoQCzkhZkGU6MIiOweF5/yT9NNkDqPd615I31nlBXO0b5AYr87LtOuZKNYXBCqSA8DHPHnowkJVmDoYw0Cf4Q8nZq/cnIZ6wMF9rJkJb8DlMRN7frYiHXW0822eDFYb+YRLkXJBMroEzeFb11+xMg2rTOQ7CTWYKcmMykX6JEsnxGc8ugCR8JD+hIL/Q+iy/Jzdur2qHmIR7Ibh2zch80J4RXzlqi2HSmLLaNZpHo82B3mwwpW8xMJNwKzXgiMFU2UABU0wOlVZukSMvjagQ8ASCvdpU78LVjpS8dq0b+XUfTDsM1EUwnEPKwPRoxsCtGUVJF/QMnUWMLtxI3IQg+S+qS4e1GaKE2vdyxW9KMjrD0XUrPOSr09E5ciOuAzWmUNbwc+pdSiiKMlm8AHm+vKq5Q6FhNGSzbRg4o2b7VYUOuzyiEuWIY3jxht1H7qed/cjs04gmd1h372FUPzvsv/doRh15hT3GLpVRKObavWmyKXOjk6uiJfIIcES1mI/dsxQNic6Wg+YRmqlgRKx7ZfKkpjQMq14gZEgMyTnbdTp1lPVL54BAXvc4kp6wm21jM3lAiXecmhnExpsAz8sAp/CPT83hfsGcxgE8pfWufc1guCeV6pkT+Hv5jtNYyjaRwTrCcK9QLRnk/1Sumso8tmSDxKweik4Hqu8+xwRwtB7LE0/6tohp40MdfnH4do62PLQuPUyu6QV+AtOijQDffzHWdTIJbfwUHSoNGvHe+DsV5BbSOzeWIjZjEJEPAfLD4x6b3TCFM9TUwCHY03DvUgHRw70ocIv2Z/2PSUNd1GBes3nTtmnBkxF7o/FQKy85/T2s6nuce8rWaKnXEzRZpslg+yBmO1QXYzIDXCSGci/Kb5n3OwYlxZKYlYD8a2hTp/QdQiu0yLIQsBaiev1360gGNmXCjya/Tj8gR0IiU8/uvy8Hyxij9I0pe7462Lp5jly0gxhN/iyXK+sRQwemdTTL3ubPDmhJT00vs3yPrJ4Mgvcj836JwHzcS6Eq2+itNpfpfLCSWZxKoCY8QupHWvCIR8jj2kkVwaOBk/PoEHAgPTQfKrNcU60KPViMQujPh5YX/i5juL6YUTEhcqI3Nzlf6LXOa8U3ai326BDYgstDavTSQ5wIUhuygw6vceqZOAqtgytwVwDQXIz9+xKFGcVdVz84QJDPaRHP4OOww7pIzs6lJEiGFhBjxzm81XuZqarhzFIYCCw+1z/IxQ1nzN7bixfes0Rvgd5V9LvoFx5UkyPekp9TXuxM3/LOi/IB1T4nVWiq9iDtcPT5yJufCm5yEhFgSVe0lmttq/MGusOWU8NHTqlJ/ypOmQD8DXOJCHYesSF9SGi3Cwfx8hfktzgksNSPRmfBBCfgqX96dwymVeUr8iTRVmVcwefW+QPs54v9hehUGmUzv36aoB781Xn57mCSAtJVhaOBlC08MqTVBQXKvdJ0+Z215+u1ovJVP08aM/ip9WNfsb1hAzKHoOk/zye+BXNhzfQtRMRAUKYtBtHtg228h4W0zblmEmJkvTeJPDxjfyJsCpTa64+XE7qHarTVkWD8shXne0eCSXAvFq48ojdl+ojNiVm7xGIe8fvos8AckZZehgcAdDptGDAVY6USBHzNr/SJFx6t91OO6WOBf7SrvALGV6HYTFyxBOR6puWmGYzAwZugmD/zYJl7uZl7vvgrmy1uvtmR3jgjp1MNuOxe0URL9tUDNsMD2D7Vz6IS82giyDwiLtR1F0MerJwUd6oEY9DEiJQLNagTb5FHWQk/RlCStVVRO0/23tLOeTuGdirxIcHEn5/WX/iJsV7xf7CQSdj65/TiRg0kMQdsIPYf68d34+JgJvwecpW/Ae173scp26RyJGZYbcPdPNXIXwuDiXt9vpwvfTkZmpxfzIPl8eeYjMJgxnsYUh8Jke6H0mxIRMuWeUi3dI2rTO5RzoaFErtt8yV9pxoXnEBANepwf9QtksAbPvH2nmjLF48B92GURU0sgMqo+3gLR/hRzU5iO7gD9D06I6aedAzfmJHnKaJnElIugAv1gVNjesl3XOk9cFcu2KZsJcLy+7dwTalZz+p7p8LsczcQynD7RnQh+/fXMzPcKUaJtczVJpG3KGBcW4xkLxlUpSp77dDe41pcs6sayogzsGkzuyrkJ1Yp4bSVsWZA7Gj+uE46vEsWGRI7skU3y3xB2GDUl/P5ET7YpM6eXMkGhWoX6QCOX2XfiueIvSajRc20nkGOQZeGfiAoDsJ6grjPJqjKr1DRCXax0AHu+4iPau2QdP9cIjPMUU34hRk5iyweJJfm6gpNX5rIXprMgh7oe+qtbU8dVC6gaq0ZZVnwD4dTjQipfW8GohxQdqQzQMSBRfMmcd+Cn9AmXqJFl6uQFv2TPJWSxoS1LQdd2wU72Y0sq5yE9cg5+SKnG38zVR69EheFbXOekzmlab4H5cLEoHxmJjcz9bBiv1Nbp764HITIb+Az3QUP6fn1N9WKtSf/ha9Yoz1ltaNpFLDjxEsujSQ/5DG6CIxaS/13csgkr9vGGQd7vtaWnR0JxLliM9GKjUQi67mpnEam1XG7XqjKJSYluO+/VbbCEMVekJn6hC+Y7e6V8BOey0/eFabA4q8R/aSGTtX9U9GbiSaFzl6w+rkcVPbrXTK2hhtn2tmY/u8lmmO5sRFMTWRe+P66ocEvsZQJUpeX+8q9WLqeQaJabSZTNidHZRJYO55uB+5siUhM2ZT+YVyHteSMYC3MD/AmTRf6yS5E6PUkQODVGxuj00uGN49Y8HmUfrMPoMX8RAoIYuOKqI+0OHH3N7ksypcIP5EEK/vHrNQi6MvYmv/WnuB+6boifz/qCZCpzG9gw41ShXySatgA6RzW4yq9F4C49YoAI4dMqwB1O1iGXE5LSn/RYmh1mn7qSLgWdAMjRw1osD6oAXtieR68vmhkPi2qRd/Jdb3MGOJ0s5WiSPw26Q+NBcBmfcMw7/UcLQiH6iufU5XW+BbG8X2LdQWjXz88+ZCrANCNLAEUcVZAiEir41s+9JLoy1P+dGKH1EgJtmHSYvDaNBPEpci5elfJtvQm9mhewCKfOXZdrh3qokcNE91+vM4md4i2z3elH2dhfi/DM1b64FqsgwXii2O7f/ecvxyiAzalmxfKpL4EdeVHFTX/bxw3CL5txN9l16sYgP9Wv2K5pWEwLkXSCjAq2pCR/o8iF5CEwJ4z/mMkeOakIfWY+01eO+LvDwn3VZ+YBxGc5gfTnostyt8iTWBR1daRic13WHUkO9W1NxrrRVELKV3CVeQ9oZERpDZvXve0jdUoBJrCz4rlkPxDGOrw3YHvhxNoKxf6bX657XCODLFboHjVWVyoqUiqo+P/C1m71+5JhMPsQNMMW8nvY6wqrtABwnPlUukUsmJiggT7yjRD/X5X9E5VS69oxWgGVMJRWvAGJ+rYiR2qy4bEWJsR7GHJVq5aoHdJsE+pBPLfS5gZZoZ9o9mRrPCTDRpyvyvfF84MEtsWc3C8lFAFU6fw7Q9Zyos3SlKkxF31i66IdWqri5P0m9VMF1PMScoD7QG+IBhJZuFCBUOVTatRsqEHplOfJ35L3Hla7CBMZlH7vD99F4Sb/x4r73GsKvYhhGkxr0hHvAn8TMNh4q6ODvXM0ZRQTZ2wvM72EoFIVTdDUlWl0Jk/aplmQcaB3EwmmlFpHdY2NW8M6y4K9oyWPKGeqJ1crYhP1djPAaiJayiIjfZrTwAR5UNZqbNbxXQoUvUp6NsuzP4UWmKze+3zU7hrb00fDwFgNhWOmHzaXhJ63/TN9o0IDkUtuAUyxNnH5DXUCACa9pgC48TgISw3R7o1oeikNNWiRlJHoLkzxpN8EV2f08Fk88YxcwPWN06B7hSFJy3YjowepFOabvfEspmcljk5a+vKMLeaykLZvPEble6a0s3KHRD74XzSqKDKVlY1RFu7FG/skFeu1FwTOfuR+0zvP9xlUIDwEgePPMxYvy+Z2GGATHr0KxhN3aIatp9whJD/DyHvXMEu+f30O4vcFJ9pNOO+91hf6EOS9rM5p/HCsj+4cGgEFD5b5Nfc3NMZtsXuGlzkTgD/fY+CfBkl1R5k5JmViUWTw8z5eU9+jdQusyL0xqzagQxl7fCrAM7565f7WiBFqH9HlHO6lANrjdrpYw7VOrt6bJ9Q9carZqdLyoKFoTCHLANTFHWBZqhzFfqrN5k8z2vrmDhn5f/hjCpz/t4YN4S6qy12yflsa7GO+udpLHZi3PNLUdEpCyAT7ZcLZ2s6ZMHR8PX8dcc0cI3shwQLM7TK+Xk7gh8ski6aBUGXmUoRueh8GVvR+TA9VCzCpH0ik2CLyzEMS9l6p0XYBLCsDHcQjoxBaQ+gncGY1Sf5oSzN4Syg+5qRApCpKGZAgrmbiy0aKWznxMobqiDSxbJBeXhoWldI/FVpKs0K8zRdXouXcsqCiGLAyKJhoIcTOl+tNiPWn/IYip5MEBqvXEGeFV9OIwhDyDFWvBE+YtIqUO7HqJJJNz55Txhv4k2lbv3i5QcWb+yvcVVOTE/0cesj9SdE76GxK4F7uuq6diKXRz2+0adT9e4wOUWRZ5aOwWB+oWnBQt3hVPFVd86nE0wfFnoDyw9Eb1Aea5Yyq3jQQn0EjD2IKJWIfjo65Z0aB3i2ZiA3NC92Wd6rWTpJwQgHDVztGfeDnWdXPFBywErPhkKp3wSdP1SeFwOdUTkJsyTqDg+4FOolM9DTJsXXCnYTXsHvD+Sd5N6s4GhzSWF0nlM7uaYfe9sU3cTCkowERUSg+pLAqFeaj+V0aPCyGByspsBSBbEG4il5rqgO/MHCC/akPbqo6DWOucTmQzS3IbgLvdKwlXk75p2yAQjTWrsBs7W7SFg/uLJWlUPnbD2EwagCIs9Kb2MpclyXSretYs1XMDRqb7L8zAsnmgExab6qE0R1/fUc7VijaBSlNjGpDajFWv9eJNh/tNsYu17lJM0PgY3ou5BUIv+7TYHeFg80YEy6F9h49ZEC7ay6wYuxRCOKhIZ67fTR2kbF1mNfPLssHBZz00yx9M+rjPQjo5Gcskru0pnbxR9gwtMYcK1OTgn2SOUufN/4f20Wvw6T8dFBDsZa5fGa7YlSRxfbh4YfUd3E/aGrKX7/diAaiGBW1YtUWjObDbvN/V4prtuocHxXPAQVHLZRlmjYqokhzzcybRcodQ6C1ZvNM9bjt3yWKuG/iGseVtjAd2kYMIcOIFM72+GcA4Yyos2ZIDs2eNd4FqEU4zB8eOHeies1p2xtZUP4EG17m+m6IkzqTW3wO0OS97gqwUoMGvp6eZBiW78noUSW5EgD3FFWfgSEEw1qOIrAQSi0IJ9aEDHhsbd4nR4kXi7XQy3M2Lmgka5r2q6xuyK3cdcJmbgY71KBs0UGrjKCmKPaND1Q9sLfs7iHyXA71h2Kg5CVyb6O2DLn27T+eNkRSfIrf4g5IIfXRQzNy47zZi97s06ZqUWyzGbe4n+wfRJRZzbvm0XXwkjbHTP3NTmhKdCb797rzHX9dB9R8B8IWdQB2Ip/w6gjhdrVj4jyAwbcxeYvagN6j0EwQibAw7OIInUDp2pOF34viBgbG3AZW9Qj7qds+gM2fr7c4VOX/C1UVhNFp2SaR82uoXUELft5dQc40jfQvAOJ2Cq8A7QIkKKF7GUujyuSuQCH5znR3DMw5Jz34SLeM8uxnESSXZwh4FRUL8F7+XYYOs5BwYKurOpGszZyJTTGycebK58PoKjCZdVOjO2vA2ryl+GpgtGqf7c3bTTWmjUhUSzzyVQ9Fivmn/MEii+Bn6MTjCs79mxuFcjwLCysup6hf8FZmCNv1gO5CYdYSdTZgEzIpLxK0YcjZO0fbxODCFkYKwQuXAdZUPTBh4ErqYE0lbrTkN1hR5AyPRqvHPJ0A+iDVagNGB9yDELR/1q1+t+9Kra60wlgAxIykCfEV3vNa3GA7SSNR1ud3nRpFtp5JKcw9tNWv+CnCbfD9hgu8VRbrMMe0JaJwf2ua+dacVHO/C6KA5ud9IHIkP6AL85ViQC4hCRDo0pM18WYUuvFE8octrYS+xev0F8U8GSpxDNAlXKES7Kvo8bDreSGlsSp+6EQ5RDB1xSCW05bR8+GSQPQEvstaRP0VptcNmwkgRkxXeMNWd1yKN4L8UQA0BWmcXa9NoHyNF4DKsHrUZ7TQiOBCywuvh/mfVdLrKrgYh4PgKUmBf+3vrdjLB28BBwtaPklvoSV5RtkSgvUnCBaJL/b+jC9DVqB2frIpWpZeoSgCElvRKAIl7mo0YBS6hclegKS7WqhOpeo7XHEALaDgj0G6rDFQC5aweO7F28+LBJQ1GiMFqrP0mJhEClvXTgKrrMAbxKRT8Aiie0cb6KwCWx9VOYC5eVMRKwJRJSsSW3rwC2U93H3lCp0S/HwtcFN0t9DzPBDQ3ZWEeytbAK+zS+JaJgXo473ejqYNdvslRpZXZuMQBFEIS4wt4vloiV02ChcRG/L2deqfYkxgDoiTM/wLIGjVZZVRBiKLpTomrgaEiWM5i/Pz3ujsER4wLQ1bHd/uxPxOcR0L6WeRiyhR0Xe33a6v3440TuWUUL6lkRLvKA4aUGpfE4LzAvl8wvPzLxME6paLconZeP1okoAw08N3rhpjwuEO2bDytGkG/I/Lysu31/musaunYrAOQbb2h4MnNSZzyXv4lMkrimpKJutyoD7U74PqMiBzSA6GbeUtLXqiC9OGrtdZI0lBJvi4bHaAy6Vw7UQd3rg+41bNH5VWlOhRl34gaqaTIooufhzH0+HCL3xRlkuRF2lO2dMwlF8gUxYKa/xtR/+LqOWornWxjWI7ESb91tqE72fPMXQV9xE6/OzF0Oe5l/ZYmCj5WzhBX/cE6cb+ylqeQ/u5/OPI5kNlWroeo1QPH1twy5MpK7+5EfNSeJpN/dwOaCbazjSwcj9zP+9aE7wPl90Oay/1MNVK0mTay83vOkWqotU34r27VN+Wgas/+AmF43opAe0QUe3ab9JPn9bCPFdeb+sD74QC2HN1FQLvjFO1mkx2eAHtxFOAwi0AIpBrWLHg83Ed2ODTJHEq0znDMwBHKrtNHao06+DiwlJ3r4bEr5NB2K1m9G+bFt94Xi2FM6wfyVXj2Eyq2eaDScHKf2Iq+ISMHBI79EORPHbU4WnsjckHfgcfKBi4gZH1ZNYizndW1ZKVXCxh1JqHct0L4H+gWfdizPBaSMKM2Iiy+38rRyeAumOIt95LKIIA8Lfg9EiAURsG3n/OppyNXrlmOkBis6wUGh/deVZAH4jD6Za1tJLBSVMVlOFLF/Nii/FVroNwfWmNxYNbcMTCyYryjBzs1S0NTiu+y4fzMm9ASVti4FFy4m1d2heGMIenI9aLPyqJhCsHn47V+Ujp+zCjUAUe+MMs6+Vp088o9MwOmVQSWssRp7sIuaXKJqmBITvhEVZVxkt164F+4Vg2CZQpgy11QHTWSzAGuPX3NFbGZwEFpVo9oi4NtwRJ8vR0D+kOXfgArwSRwIrj8EUgFh/chiq1ER2erLW69y0r4NZBEryTifTTQWGIurudxqqflTtjYEtvDCwQyaTW6szocvgrXU2PZGQno/YrAaPsntVSeXeyv13wxoKk2bXxP9toT+HDjq63XKgoZohOHuG9SgyOY3QO6IRjMhXqdrOyRzAFPwN+FgmLiGLElwMqEfa2mI27IdY6yUkLxslkwvg3/+bTHsFiCBFoS43MBA5ZOJhJV/fdz+asRjwR3BScFuInqq83bByYXWIcXLx/cEI1qSfrqUOlzj0fMpyiiHoEz/MUpGgFqTA4qoZZmTCa3VeAk8DobtJ7sQWr5zyM+MexjCUxiWWA+tCCcG4TBmw5JAp599mbxIYX8qi9ulYCwj8RA== \ No newline at end of file diff --git a/test/testUtils/saves/everything.prsv b/test/testUtils/saves/everything.prsv new file mode 100644 index 00000000000..f9106ce0e35 --- /dev/null +++ b/test/testUtils/saves/everything.prsv @@ -0,0 +1 @@ +U2FsdGVkX1+27DUwQ/55VO7uOQoasKkJ/J2SIlp206Ia9bvPBDBi0Wi2xphBWkM0XmeykGJtpgG86YPZy9crDYhoDr7Ku2i05XYcDYRJU+YPmXBlAy8S/ygWELOA5BXJHAdfyq0xM+FXYj0LbI+n9HvfUe3b12iKVaXBN9Hcio+3yvj/KFGT22aRO8U66yXg7lUT0k+gUdKN+uApP+VlvaL59BUVv4u8ZJU2uMbLFcdfdByIpGOC57JFSiqqOVAAtgsvIfkZI1QaEED68qAZCbJJ5CeROD5PoM6zd3MJU2X4xr1xpT9uIOrTxVPCboXFSaz/ssW0nqRB1NWOiCwI3DpBtXoL1SZJhiGtB3swH0LWGU0gI+s3pJgpmJubGv7RVaXKhGZpzraLDn0DRZshNtH6eDugSr+XWkB3kMwNDqi0oE9kxqB15EvSFlENDVcFA0rhioeO77y+UwBccHVgXNiJNshn9hqOXLWimUyGnak4tAZ8IXDSOjmU2iorMpLfhO/nvGagHbncJtcn+v6WLlDFSRc2ZQEII2i6VbDsNAsORQeBP/zK4AeavZbpuavs1btoEZa+R4fc4u85SDb0cuEc4LEpnznlqjseyRyJm5dIVpQkOzVAOHLoxCAs7L2P7ssrNYaJ3dHt9fcdTPv0LBQXiwaaUngxMOULJ2tJJa82HlTIpuCZwnr5WHRnxIAoU3H3mwhoJb0Pfu5uK3RAeJzsQ9YeYKcw0iLAv50Ho2VdEnR0LCMA6NK3oykC32iOKwuKSXhANVJt7PVDGKwBxBLtGvJZCGjmxnmrsaupT0YdRfkK2EdqsmH3X1zqFoiOo/3VHOf//RAu6L6HwFBNxc559UWpxxEuNZeHxnYAAIPDWoA1ywRB7/849vuenkl0xflV70muI01Qhj6Rl0MEBbFoJvh8rxT5FUrf0NNUjg/bsDohj8L5pKTyCZLSwnjwQmB3cIPPKwlRBOhYU7v6E9oJOYM0aKW1uPGMbRSkJSd25JeQ2k5yph72q04omaDJF7NH3QtS0+xMyfUDsdbenSE/qc6zqIF3GCq8h29hL7AABs1+dZ3DPiV/MwFbKKA3cLH2CnCzMNgMVSqvyzGC79UFQw1kF+ijRXRarxQgw8tSp7L8YDnJ8tZ92OJHhdpaiFvWm/85lsJgkrXtvS66Pt6iyyWfdSP1H8Z5JaFxTqRFdMfpyqFYlimr5d1WON/ynZaZjb3WuSVxbcqf54qS8oJqWDdVCg4yrXZpqGaoe3r8KEBzSq3jE1bhNDjSqlAH3rjLdPLIp90TBiG1c9dIytWfK+YsGX8h8KgXulfeCKBXALaST+dKAqK2Rj4q/3qgyBk5IBjLG742znoFG/zvXLOmA6fKF5TETbf2gYdIHHtC8MI7SFVAWJfaVqMBGxTpy2vkA8eCc2vel3nCbypCPoC04QWH5H/7IIDWrl6ilNjPG2RBar0XFIzoW421N3/zGLMe7TXf8YQGYUoCbCV2AoHMVUCeRvMm9O9R1s/ZbfhHVsQ+q/1B9vlB/G7QBtcoGbAmhN2KNc/2dEHJu9gg+MPEF0hEUpJVQrXfMeteRv+Onsf7U5KiN4OQKq5ATFQo6k73levPrA153ud2BqsVwS3+HVW7eNBavxf6jhBllsY+p2AxC65myj37VLeIGA/poLaXKDjcQteTkWnMrBI9Al2ut/lAn8yHss42Oc7d6HyCoWx0Y228lG6F/UWELRtpA0XCPb58efKnAPUDtGzRhggH/RYPFNewP2MWC16a1OiO4yBnRFDWfZpCirYBiPCiLktVjlQPTdWCl+6/VIrk8CJjZ7HPuyV9ZKAbMYffwGJ/ZcI9yvHB573BT0Z6RV5BzOA4J/Te1Jttw59ZGFIxn7lv684/3PhLRcRZUCkLa0B3XnnWF5gcp1L/UjZ4h3t7ytLqQIFfPVvL5a8h4rXAFHyJHnRGkXcVGG2UdwxIhNDKvJxojemiKxaAScHc+tVFmzRgeNRs+g0ocZqTNk3mFRmTHTJnQ8+7o27DWAKXZ3tN2YQczrYr/IWjFTiVxAyUCQwZRDPTWs0mk8krDjfBVE9ULLHMVxiWhjs8Jn4iw52yLCDL7Mg1JsZMBAEO8BIMig4pPVTR+niZrKevEb032h/kl5WMirKTmScjE/Cus1zvV4uHggny9Sf8G6zpUPq1PvxCc64aq4xD+4RhfA/gl196ryzW+UWz+c38/LAe12seCgPMHQdpiujRV2L4r9HwskyZuJ+eJq75PSghHWcxbdMUctZKZyMv0od/FwD/C6ffFpaeT4U7JAhH7/TgVw8F4lO/uBjDtd3/Icphw3QXWeLPzKR5YTaRaDiJUxDnFjfJX6g0jlSMXyTOvDDg46u3b+DRm0XiIJ0TsaioPxYPyhAK3ugseJNRxvyjaqDdMsKy7MgbdY0+Hj3uhIGrKA9M3PmQ2swZCADCkauGRvyoNQjC1TTq5xQXvyNnGAkHre4jPvi1GX9IuQtN202yL6++RJhs5XP8iz+/Lg9vgWCfSA5JgkY4h8aPtnU4cBXeB95kLJ3fgpApGcU2mardrhbkc+0h9umrgWFsf122Ee4JTlc28m63pP3x+sWVlQpJihPtDFA4p+rohq0UZJ3DAnq/DGUVGVaJVSivdVK2B+sbSZkJoRtXcbMcxXgvINV8/0yTOFRnptwHUdNpklL5aepb51mz6rvBJpjpgmCrzouTekC/lOCLBkcLh/FrIj/bpV0/cmgwqdYOR4eU5r9wRQ/DXs491yePhupxqpjoXqGVhLlwqfv5LUSiO07mKvhSjJtH8dKpUw7mJqddBPU8+u0C4juADVWC7zZYlCNdFeBNYtHp4m/Cu6+s+H/YB0BXJDmlJYx05vIMAYPVCscd3wRPCsXKzvq7fn3QuefQhzhH5o1wum4XmR2WDsDp7N4uO+QPZL99XYLTRDiBSYvyokPaJMvEDW3xDWqehaO42dh5YCVFiLBk2cHXNGqKaPNJeOKZXHNYo4rTmlWwxRARzoBQCKDvV92n/OvlXigk8xZSuaYMaEAdBMfxDuzu1ZT7W03v5MPjc0dwI85wshJzqK9uKFZgxkTFTKCL2zs9QhD92QhV53aCupyK836bl5bCELv7Eh1GbIbLCIU7j1TPQyxtVT2vD8RfAIS3PFpCBChT/v7rh02I57BBQcTTsDrIKCT5Getjdg41oMSuWZsZc0l9aIUEvZucaF400LQU2SqkVp7CX+lzqekH7OTUIOAjsWnaW4ebSql4101IDSLlEyagv+8HELR6IZCPQwC1kRGL3412LCsAjtstXzPrun8Wgpru9lHFsRk0/uDL+0rvXzirvd88oybrZLsCTtecr2gdd+h2CfGiK9HQhMTLQGPn0ZuniBe0lqj9KgEk51443G//dA7lSwmolVGH9IOi1QW7ezVki2Yr8kgpnEHLtOavC57QdFtcnLKsXdDzXEY/FcjrNYWBwoFKrJKptP+HRZBzBucEbnj4J/Cdcnr9z1Vt2ClTSCFkuHXoFk7d+J7x5qoPVCBjpZlG/tOBm03NLAkBWO72ZHGVvLRlu263k67m4veuKcv6W+30dKOb63g+tYtVDXgpX22uPRKvUKI+p7omZSFGvD0cN307MF4M/Drk8GQce3OJbkn71cgbxsm4GklHZc4CCP64Om90HCK1XZE158iWwGcVjXk1wKVb2AB9n5gFEvHwG4OoHs5JGjdfM3b4YRXJ5NOuKrk6U3ljhMreXCisbCWIhuCTDO72pRcUSsEYpcLXdH8kQMCEIBA0gNAXSlGBb83roZj3XInzBiMgfHlpUY3CAK0PLllV5gFYj1My4a7yq8Pt/zArTKmqjTuhrixtAnhN+R9DlDh27u+H+8bvxz3NUfN8KDTXeD3pSENYTRP/6du+BMzZj4pdhu1Cwlozw6+r4pvTy2AhV0JFGNg7LArEJfEIV1PcTNRqJczmngs79CjJlmtYzRw/n9B3U1u5Ybp1lsePffcz7E8SbQIF4mCVOkVBu4iJzLJSEEWaKtoom2GFWh7Brfq70Y3g9zsoPCFA7yeANgb0EWGdHLh6R8jDD6V0lBO3f9uaxuvRRsPYuhuYC82AK1ujTW7vRdSaxJdg1h56NuO8x3IPA6HmVSy45fQPsz1T75+l33CZjDvQiXU6slJGSKM8YqtDgzAVaAz20YYEfDxqCYlc525lmNxKHy/EjONnc8fpECJ0Q1k5k0rELObGjBSaBLblWoNPWSb98kYDsqkRbldA3ehxHXc8qYEEGtmm4Wivb1C40JQf9jCiiKLkJkJTUv8zJJCtxwh1FPXsAmciHYzPFUkiMXOA4/oJ5ytKkPXhB4//sKm0mBFop7CSdwbOUfumn19yRzD6r/BZS8uyyOkcoWSrEM+V4QAbBc7ImjqFYogVQiS+3L2MRBJEYJ+sKNsKse1z2k5jb0rZ1NstHFiQguiwFw1T73/MyH4V36dTM0epLR3x9wuXPp748ZE1LD0AA/0pxNe2UNO1eymqtUfFkyZ3VojVlbTZOXWBiu4NaFsGCJh09jE9Mb+dQAD3u5c3BmFxhvwCv29u1YowkxYHWNC3oTmWDrZE9jSd4wg4PMhtOyXOzBmeCQk2ODbe64SgLTa5gzJuQDJOY1ZONHRkiSN058wteU600caa/NZPZuFi1drEYm1opdbbjtfUkU82cVcWNoRo7vNqB1bnmDTOFiIfZK4k9UWQphePipcUOIC8g7Chq6lJul/285At7rMrRC1jpSh9UW7lvt9k6sLZsta/vxzhTgBvH53wrtxE2qWSdHnSgdqz1rALkp95AzNODJVejVVPi1UTiQQRYgJRow5O6xITUUxu1N5d0VlSLgCTYaWqnwt5yACwlofs89HdbNjqAgyP+tFZryfHHw5RPzx+9E0b3cQgVkCGhC5vK5oOy9tPnrZEbH4fU8pNctxZ+FUdbHWDzoyc3p9Y+KvFGEGJmahfuVjJGZ/+JdIZQBhTiub3TjKppELypnfHWEvNHLM5IoS4/+UVEvncBS6PWnfK6R2q18CwGkdOoVHcfJQ51wjpi41GrsJEnkIJKwRDxuH9Ybz8mBjAR1yZ90uxM80TJzh0FuvANrXKvu++K2c4FXDYZTa8ZoSzVSx4H/LFzKqhezD22Ej1rhOIHjSd2ptzncYNtgibxNU3Fjkrg8FJSwJMlj00r63l3HOaFmQ6Tp9hHqBjzTuxPPwaTTf99YjSo7VJLXFxaw+Xx//Kx1FejgzmQQEyaLSyEChjQv3sRvR0hrGR8+0MYLTxMLlm0Rcwhz0y8KOikQ91V49CmS3215Wj2noNaU35iUVGqwqh6StdvDN2y8Cpv2Cshx0HCWx8PNk7tAjZ6TeoxhitBLBb56KPN+KUUO3SGjJWP9GJ+VqjGvaeyi+6zvQeUKCbMxy9zMCgct1ULc1X6qhFuJruirs6sQEkzdBLnhh7wcs7WirLucSj45JtE0/nzwMVN/E6XH6S2+jXcCR+P9NtBT2vpL7Yzl3m1l3HQMfd6gaqq+w3hUe4TTNHZaVEX714Qid+DaZNFwaIS+k+Sr6tH2gU1cDocDMs7+MiH37B/wbZbXYyZ1v7NLCr3z4W3KRlFWeboOM0fjAv+1XCg3RLxKtSqxUUpW5yHi6IYStjWrLeh3VD407xeGuL7FmiIOKYzRUu+gqe3orWbHUbrNUx3fqWwgskbM54joXIHYHr71iK/8hEsuLY+Jom0vIT4M2egjvEvZkAYMcOvLoO+sNHtuWu+cYkIvSoAdmxEpETI557kewevukBDZ+waNbLFyTMZXTkJcAUObGpM5nUrddlmIO3FZ3jcl5WSz0A5dhO6c+65yGN/1HD5Q2iv2v+J6wzwxwz5h8Uq/l3NTWWTGPL3ZIPP3VVyKf8TGfbgYqB3B3yXrEDroNwJynSP9glBbPmZ9aSjMu5J1hEsKeEcHbWwcRhgm+oqAZK6fOITHLR5ag8awlwVt+vd2fLlRX7ajjwHFKDHNJivGQ1zz/8d/hi6rGKw6RAKQQTXCEIHTElALwhM8d6dJkqLg8OLqbpQttpx2qaj5i1Xa8tt1X3dQte6onxSkiJ2sAFZKXrQfzZ88WEJySJL6gfnqXjRoWL6SBa0P3kh/Q/le+eMD50jTUtmrdESST8YtvHevnt9CfY4NwSGmdRMC+AGVcjoxlOJlCTcT2gsese7j34RhvBPL1AuaQz3VspwDWaDMUdCWRATJZq+Dwu+esVGMJZaxrBewGBi6FEgz+Qo71XoTWJDKZScJ7UzThbCzwASFyWA/7rdvv6Y9U6dFKjeNhgfGHh1IA/y8TfoffqAglViGRozFYLn5cYfgN/+NysP7NGpZ+Fj/spkGftkpBCGaDWNNpSWiRkQt/f5MHDjpXvtsifGoMa/we7LQLi8FjIz0cQXuOTMxDReu/FqxT6iwzSuVo/DQG1g3pW7F4GBIUF+b+3kU3N9Z4TfkKcnM6C3ASO9o8pXWWa0+mSes/MQEnVW/q9f7hTqs/k5UQ31PXjPuSUsuD+zGdfC1iaLmS1M01b3IGNqnuKsGMh7Kl0uMhhtmvcK2MEu7i8ojmL4IhqpO+NJdrbhdgrZAWiq+jN914qxZBNuD9lTo0N6Zn9YMqpqF79DFYP3svgmYBLM/jx4D06vppho1+6v88ewYFOl9iidNROm7rVBd8EFszFxhEOrKjQI9CyJpNWMwuhzAHW2T4fEtS5UnhR0wG5QI5GWt+2THXe2HW8QDocO8L+mUUT/Tk2MfO3UrwCAyBxEpGrz+HmJaBctoRE/p1poJgzds746e6f1clnGEcx69TzOHfy+Inln+0J9Bt/A315nskByyIB+7uwAdovhKcfD7ea4eoGGtS+0+AQSZup7+2iIqnJVK0YP5J18jOMfa5cApsXvTC6ppXzskYKIBaLAS1l8mPp740QSttXuNDGOBzHSwbc0gokaVDwhULSfAXKgr2MBu6XX+y7kFORoRR2cGtPK70Jj7TrCHnTKupp8K+lqthr4b9vz0fkJCkGYGTUSOyaWbRoOd4AQna2qlOeHtu3dhlroAgWQQOJ0KTZYwCGhJg5hY45iyPzucZf0N7loL2ZOHhOvjmIldtDHVJ8jPa3Z/ur2581iU+/szEXsAq24fIz/kcS+ptwgqTHdVsU+mPBfLIpansgiBL4FayU3AyNLCaugqLJ/4gq59CULlEi3/8ZH5W4/sorkO1aoDAkKPF1HxrMT/JHtl3Lz4yCae8Yaymct78ki/rv8zzHamPmfyLFj2HFKi0gfoqZ/0ROzvvHwgw2zBAZV5iSikUsyZy2xGh86/0KZtclr8ovoDRdiNGRdDijgt7GPjtyuL4UDnmcPb6bRh0gRUtbhtTPzt688P8P0ZekS8sKBPMYx72Ii+vX8muokALsFCGU+Tk5l2HNd+VTJ6tDrc84v3jLQQg8jcT9zgxz8Wlx4UMdHa6zVkLkbqKg44Oonan7T+60fqSYk65OQQ3RtDKaOTrLW24PQ5G9kFdIPK5ar6pEi1tH2e2npLiyBFkkizZvk3MTRbL8Ja7SZ1rvkH9YYs2bCWXK0WOcJ8u1PcYO8v2nWjXzVwGJ2hrRBvMVmw16lnT0nTWJStbbYqg6FDjfTEJr7qxVU62ojlibvtbrKHyE8ehYaNYB4z7w8pGPnCad5DJojj4PpXr9zNjI5y0kSUQ3viKojkkR/Q0C+4p3cFblIKjiWg5FD0VXJiaFnCTGc8P9OP9HgQpUcwKXuJasEddXFXS0+rs8+judIbQ7/Zg80hklavo1V3/8DIRkmOmX56Y0hsxi/bkpFge818SDMyPeT4sqXD63RMQx6EJETnhEcayKCaKhePXenbPaned/QOXT99cDGMyO2CAFMo5fDJQUyRtKgyGy96OtLI7O6Fh4aFuMtHTVw69uQNYyfp9JMxjXqL4QYBjKOupR3DSN3svOSL9UF/WDFwPl9Js+T3G+ESwRH0wDYslRchHN9KwWR6JKDHphD/P+HvsQRUcap1P+opqpk2pvsMZ49U4MzsZbC1RzhsEe04ChR4wBV8YyapZHQEwKO4ic+IZF7lCdEGLgc3oW37WPVbNbK+8cjIBcmEEgviXrhaJomjZZ3qUuKxn6K5fiyW4IwC8AcB+DRhgVZu/5xNJkDankgYGOonkx1nQR6g+6kGBmd/5Ul3zwlmeUEptvbhszbGzWwTHax60hsWf9IiIjgtzRdXTd9lwGvsbi6/NzEDny/R8lgPOysth8Il96bMnBuWwCLEUswn1GJBv/Yt/Ejj7j4VEdxgLq+EDneabs6txaQ7q+HdNXPgRrIWz+2f+oJtEdCnDiWHKaQEVqqxoPanKPWXGev1E8k4tlxty9QtWaxwHAD2xgwJJCrBoXEPtHlwDC0x9drgk4JhWwYHkjHjYiE1xfLmscn1fwPXyTOrClO1PhSiBs/ulJQ6MNFSh0MsyNs6z5ys1N4rpXvPR+DTdjTWtR7Yz+XI6h/1rm/4SyeAJF4SPji/ufhegrQxivR1k/ShGqkYyR88N15DULUsfzR4EUu0GrarSwMwuByzblSxF7u7qe0X12fGz3QRtUEZDuI/8gWE3KDuh/YBWqCzObQQtTDjR6RRC62fibjU8wNFzCYK3DlmmgWRbG76TMxjtk4OFfUi9i96KBBhrv6TRxzm+VfhsS6vD4hrcdAAgbAYD7gPp8O1uadYE9OzdomeavYpUJ09XP6twdqWcVfYpfzQsr7ln2lGD6QmtaGlthKvUO4KwaLWiAo5XC/6yYoypgFX16w/3qzL1dezHjGcuFlYECeV623inRRQCle6iQ+4spAjgLV9l0n2sPgMNMrRd2bhi+Dk4IQozXHM62TsvOvFEs/yw3GfJJYFO0KflyZ8xgTjM823s/MMtjLNYekqsi6yRl7/XxDcRCeMSbnkwPSLgehxNFxtEG7xy+MYr7w6XN9v2TqV+F/ZGUDijhoJjmm5tRvt3yrfRNJ9Ai428H2Qeo0wJJdRkvz4uBYvVffRRk9LKXjC5pvRM2lQrB5Yt9mtNDQbsTcCVgKwoiiNbiv/2aXQK5QdYO57b5pbkR0na0r7oIwNUJ7CEkv72dcWyNOjs5XCw98UqBwqHK6rpPwXwxffDNe0MlMzaeHS3hB53CkNcnL7wneXbs41TwNr6N3LSQtwMDJQXs+Jm/ATurLZhCUWaBiUnWYXwF4vlHGwSzqHcXTq33qwoqD+CgksSMrlO8pWI+aIBz8+iDE87n1ZuRQzbSTgiWQopvttA+YX+rgU139cUJ7TcDit3bi3mKvqbjGA8Yi2xSLHIdiLKJwQ4+2wVtZpJiG0a6MPxcEuQHeuXoSKumZ1otbPsmICa2q0nLQ4mRsyGkMGBVOMRohvjSdjwZRuRoSeqwYX+dInhWPiJBp8prjHeI2SnvtkvCmVMzdmXvzYTcX3U/u1VEUPsmUvH8gVY2g6IJwo81q5359f0ylWptvwwlodoe6oeEkzBP27EG1eSRVjp3PMuNdz2hWIwHQqxFVO1wkLgIcIwWw4Gp0FIwInkArM5ACCetDiZLZSCQb5/Uzp70pRZCfAS1v5IF09luB8k4nMHSLYb11aoBbt9j/lhV5Hk2HeFbN3Y+aK1jiAwIDLdq+004WZhnpLV/HD6Nb4+5wirkRNFhPp35BfKyl/mNusUzyJQC9hDBPMa0lrAScVB8lCJq1suN5xggLdXRHcaD/677KAkEH4T8GkNWyfu15N55zAaqvmxNK0buPZaWClstdpDTDACXWfOHBvItym34Ixr+irCpsIUOZ9jRRz7g/yL+BVsQFhDE8FJ2C/EGtw6OnzilPD1R2paxV4juArwvGsUMSNdH5vIwHGdO83qIZfaSGHQkMM+0kkPdVF3DgbzUUMnwKyxAAvYGEZo3kRErdlRmeeRFs/ES0gaIjqjddVLACZ6eYL8mCwvI/E3pS5A2wv+9evHjkBbLhWpa+jWudBDce+H5rCGvVOV2QRCIUMwJiQ6PvoJwJbBkHCMizPNLV2GXOTGW6fXTqEp/N0XwlNUxzubmS42VfTCOEZqz6GtfHmfh0NJQHljK8nqLY/GNsAl3GremdtCATczX4rXQ9uGK3c+bicIu+8tgpNB0bZFCZ7GHP+0SEvyvuccPdM+sX1fqzdqkp/nTx4f5fPdJwM9W+NigjzbOvdSnznioDyzItQSfA9sMXcW9aCl2DVwpfuSjIjIBM5aHEN4+QpQYR03+KypTOlESNoVSluu9MxnOJR38Ht/TAwC/8kAfn4sWuP8RJrDG8/Sae+cKtxVgAH5y5zVA0B/6lZJbb66rYqVJdVZcfDMVRiC9X1H4CpzqJnyzgQVmyMm+lBgiKkdzGqjT/LKaHPGqKe3UcLf09lO4X3V+F1JpGwVBLUDzvCEDrFsxIVb0YFAWi+eFxVjeBmI4+4g2YjimIuv3Ei6fNVMvaHTB1BmAOaGMi55VgPZLW9bfRwUg5mW9H4IyJn0XADsuaUM3NYx44baMpexaIMMUXvo6+kDX7BOl/SrxpwbpSCUBNxwHcZWuLCgTFePS0SttPOcMV+xzw432xYXTe11aJDoWcIdqmxlHeLWE4zuTdO3L6HQKBP15DB6XoxsP1/s/n+4Ol+UxXBGrkZgHLaHIuh9VErk0eHiW1uEAQjIFH375pIoWfEUn+6JRSy+36+NtPQtcQ3eZL2guAe1P4q+yxTKwGzquXPst3okBh3b7KP7tDUZglX5IItOVtFr6NYvDSuLmTe6zJRiMp1tD2Bk0c4vwtZfAPTwKt0574QAafza2Cc5h9i+wHDGJxKWyho1sxlI7OGFDlmPqaDWXepx/BIKRkDpehWBod2OIy8c+YsQjsSeJ7Xz7PBPaYV3kxUAwveEW3PRWzrjqO6cwI0ZAtSHVUo1uT47kJIa4h+CuGbJSV6zMCHP2fC9v0RyL3iJYQg5+lux5sk4AE7jrnGcFu6x+IH7On7YB3gczraEDWLSUYAiCoXe1Y1hHieocXvGnbB9g2KeKU+549N1v5OsVoMF+J+75YTLCvAkeaeBBJU7Xoe6DZvc1P/QdR9OuA2Y9Hp5W5sQ2+iFG9ru9abqXH/zofH1vnb4bWLNSZtwXjSZsUnAjMvpS0mr8K8lI5CIlxygFxuHbrqpzD4qdDe4atIvvvbjnv1by2ZwLXWrLyc2gOzYK0d51/Z2Ag46OoNjlIKl7SidUdUVotwXp16IMTQLkOpXj6SgcyoksaeZXi7IBwdSDKY2NlXB8+nydgSmqOkvnfhWiT7fCMMmiruHBxqynkOycmpOIXNEKKkh64I8i3kGwwnjBRYFan5bsfu8vP1AhKDcsM07jMsbh55diiDG5UjO5FqPMBuf1xNpEds53xPlkFJLuQFmkbeiyOvp9M7sH4UvwVtzsR/MIkqhJtPEdiV0dhnEY6GFRaTjEKe9k9fBvMiPjkY1t9eHHbqAe26pp6ZNb4okvaU8iLkijCfsHIFfs5Tfefu6EovQrJV9NgS4QnHJBFU7EUzT70phi6YEi4Ydh4rQZvyqu9GDONrIM5/gfB1scXXSEtU14OQmuiQCYmMRMAqgwNvlkydjX1z0nBxQG4P7PNKlOG9J/8AhqTNJ4rKfPCeTtsgqea8o/POKY/kX+NZKmYePzfab6WHC7oIcDAuMy99w8TsOv/lGk8PrU7iqrNoSF3k8qjAq4/PKLzLv6DLHw8oGhuJHxD4ZDOFmI27/OzwJou2BYlpnZbh+W8B1SpisVBLPx8CiMFaxZfP63OmzWdiMwaNvNEp1qd7uOJcL3qNpxTBMPsv0/OTsJxi8l4dJMiJcFXA6vdY1/MMQm4itTgHPGvrcD9PkUxxSGGGb/D9f9lOOGlXjuKX6Wbye2dtC5BAJlaf8sz4L9/ylgQfCM0syScbevkaQ7vdvzIWEXZfNQClBLwjLHMcuoTTLFVFyS1OhmswxdUu0HHgbGHstJuYfC/mTeG8odIoxsOqS5l10mHmRnO4cAmv4rsaV61rnsepp8FaGm7UGcOZ82ZrZPgiygHwbbfL7ElOoMkV171rArqOaKyUXymqjQ62RkPU+wb05dcoI1jnkUodvUX9Q/E4FURRTvB4fXJB/pcjQcN1qf+Fw2/8CQV6duYplZeYx0Y6IwpYYEmG3INIIw+rMFklAQIi/mO235sMhJwp8eOGgHRuFQbsbRe1Hx1mJycfzZBx3aXcAKxKeObGXerNv2G31gSafWTtT0TNV/ebUcMiLq/zCwgX2x1kLzfYtxnIXYF3gzBiwuQMWTwuVuJWkQLIC22C9ILl8zD2uazAeWdJNPC+109ifrPOPiPQkyjrcNf9bpb9L40VjRMUzXFtuO4qa4HR+4Moh6Ja1NotOGCP8RsYEeSIHvLR6oW9w5CM4oedQ2IQKNdn6rayXtt8iC5gQSYoeBSFE7PfKZPAIdOzglkfyEvPScTTl6nIQ8YrQVTk2Ku1RFAD0zi4wzhNTgY785HGXArPxOP4rRZbVuVZ1DaTy7XqHsBSEY1LgkipKy7Xnmg95l+mXImHP1Ln3ao09Fxa++fFmkZxtps0qMf/daBWivP/A5HeNsXN4ysOxDaOmgh7nZf7jQCBMDQEpu9k0W3yOl8Uih3O3xMYem3MfphtrGCeJ1yxXEFTyEOJPHeN2JR1EiR8xDc3XhmxiGF5gX57LFknZcT860bnaPwVu2I/yho/GtI0ApVJHMeBaI9G8i8s5CR6gxpD/+C7ubO3Zm29MmxIgVoYqaTGgs7g1/3FnN9cYeCuL0I9NLLifFj2Ra0Noq39iIrfVyRyDOBguLS/xFiY8ugvSVH6opLfg/r14wT8aowvI4RQo9svF303mCBfACwM3R0bFsEKztfy9l8PS/lfPVy930dSdUDjfGhmL9GsDV0ESr7lH6i2Vwo3npTrunU+ZcezcQku2c0ILukFr3asNrxSV5KZca+UCpXvijTb9z86wbmfKqRDhcNdQ/h+k2VMowiMHnNIYa889hZnFiHIvbTPWeynxb/aJbhmwhiSMlTWUsnvcQFKS8MfWwaQPDubOIPFhysnynXP4V4n5OdR2B25/vQJskH8JBA9kiwqtOlF6rNw/j3IYa1iuuLltB005ktONsrTBGE7bgZmg+O9KU3bA+uVVblwx4jppr2/8UhVuKOYNKXasG4eJEr88DDAMULTuX/4lzEbWTIpMBMBEg0VlUIM7Io+JyxO+jShmpp0D7feI+qTQO5KW9324mOabJHrs4JxHcwJMMN8ijrQBQzDwDvxBVf9ggHsNasvjLLtSwAsEsXFQgxoUYCMA5DDbnCXf1wJHK1kYZuex2PvXZr6KWAmsblC6IYG3u0LIia4S3hmpHxkgSN1vZRuam470taQOXtkVkdbv2mI4g5eQzyqCtwPI+0tT0+oZ+nnw9TpIIYnHKJ9cSOcki7sAhnlKnHqAvcHphhtn5hqjqlrSAipU6+6pMPsCCz4uDcRsj6Wabqdy1bsja7IWhPtBZLKpCmCIaRatf8KLsEVp2/3DjjTYZ7dmFvS3eUVFndjryuhbGFAw3Ev5WWg4MJxpQxE5vH4MH4giFNnSGq70Rfoc1lhZ/A1yrWkEQIEQ8lvYkaYHXOBvWblMH1k3eMpJO0lmxXt7bAhTPkCGPNiQf2VuXcz6GkzFWbxnBFYLyjXi71GRfGAu5QesmPUJ20HEnU3Muli2Pqp3eKT9T4PeLo81t5pKxoz3PNaZhvadvpp7YE5OsOHZfqP04hL3FJ9KXR8o8/xEZ1K0vX65L2M3Orc0HKcdlCKqVhsrKdWAhSJgm+9L1MaoGxhW1gpkIYy143fw8PSSzEXRo+qlCU3O+3hUiTr3O5NPkJyXSp95L0Bmj7bn10cr80GI+mzjsoFHJ7AeiepXN1RwfYQM95CdRXaPI3c8rbl46T8CFTZN1dj1y9PHoPk2bqbQvGm3i3iTNb+310A330KhtX8X7XHhAjI7TdKW6GWxnyziyWyCr5JazByiG0YVlJPj9EXMRGW9O45rzja8BtEivHd24ErhJzBNe7b00DC+SSUBFEHl7PFar5usJoKmQpS3YSsgMAP9UZpm/JaK/E3LbnsbntkRe3FgQFZINMPvojj1Gz4J0VS3q4gcPWPAkZ86GDSzfvl/Cm05+AuTEfIjQ39LsbMWs4IJDxnFIdov6k2gx2xAVaEG8EhZB494+UrgyWAdYX0UEe88q6dopJ+UUBTrF7ekDEc6/n62ZsAchrhkjKyDB0RO93JToT3FOb5iVsF+NSAodcSWDX7zd8rI45uH/2E8vxg9ntMTt6L2b2DQLGBDqrivrRZHtrx2sr8CM77cVJheUcnzWjqFTTxr8VkQe0tXhX2zW4hRJbLbz31RrYzOC0aga9a8vrgsXKqNwp74aUF5em3D3Ltoux3KUIKb+lXzOxzP2s7hwQPMID8QO1/d64qF8VGGYfzJGMcGYtMK4dIRHS4u/uo0MhRKga4LBy/izItxgcpS/fRxN5xituOPp1MOxRcrYZpj/IQ4009Kct9PlOMvGUs6C9sRoEfypZVh9dsxbtOrFz0HyaWZB/xP7vzbE9DDG2se3Y6MGgFdzywvv2wayQDB2zTL3fjARFQDGXvRmsAhz+V7ogo+7u9NTZtb5wewzQcKg3EG1xw4KLT+BDHcNA/Hobqr9cywU6t04Ub5UcRbuf++Nca/xET06ol5mfeZ1Ll43lO/VsvX+mK9R34+YUI8pInhHwq7CkRjZYvqi1BRgdRL2WHHGRI7QsEZYdGUSaLiMZcAjQOOo7kzbXzlxHsQHYrozRHMQxSSI45vVW6gaWWEo8WABzaNA3sKLSAfpRBvaDGnA7PBxDHhXKzhcTc92C6ioxuKq7WxlKZjVuY5PC6H6tr89Pgo06E2WvCyggd6aCz53sAxQ3oL7VrQReJKmv5CjDGiArXaUM2Lzv5UpKV3r9XEHiMP+kAR4yWa4cBeBZozzImHe3rf5E/yubxbJNRkHoe2/xVTKyTn2c+KOmGLYuz7mbiSUrZXQIYmN9RoXIS1cLz/URaEaNJ/DgANlSFYhYEhnsbfy8hE5zWoJmfdr1jaOpV+UA8tFAap8/fb7t3Ci7tLZiw7FY4u4VeVdzmPhzfm12TdwRnn/XuT7LKQiPSLzHVfqego/FOy81eeUYpxvrFmA3XYWQNEW3zzbf6bb1vwNilYP6MJOPNwrzK73lnIWtNoSCEn8+MS8zcjXlLNyUGw05qXnoTfC0OtRBGOPiWYA0XIL64HlK81Ugt92nRZmfpM9h4kHOB2R+XYRtJOGcwwBUdoE2D7VU7pZSAAU6Wcl2maNmpumMikI9VOVqWpzj66rMZrBCH/TKJUTr+o+lm6bQ5McBgw0o0Nasx6xiXb7d5xmqDGZu0xB0dGzPZyHucUdgt6vdXppJs53Er9DrXmV1yqrrR9HlF+gzeif9sHLYIT0TcM4zLnpWpavvIGDuiRPLAId5utjjATmsLFGBqLJq0MZ1Uz7p7MapDX3ObqZDrBhmW6icJXsn55Y9l/7hi4O18QTJQPa5ofEw9InYxl+OWqo1scAY1dErKX3QmU5GFa3YP1MvQ1pNN2C6qXjGVDx0z2jJtFnRSXaZmExuhYdPRitKISVmwaNPJK+4w8Imz8bTeKyAZV5mshT+eEG376uuT7cuwszcWaIip6Zkr4WVJqKYREv7kI7PcKzvvgwKy666c2CNLIQs6CiYWAaMqi7pBO5IygV85oh3PGGr45+pGIZujzWg9ObVHGRIiqSrjT7EmsSGBVXPokTVPokpD9qQ8TlSbSNbRcV+CFybFH735Xf9K+nxlTOPpUoiPn62VK3SZASYKUwjrqLqrH1Qi5YG8r/Jpz1+lnHvs43O+jwpC8pSWrhsXueJlkitKewpB0/bp1u48224ktD3SxEEmJOG6fxgaJTgqRhXSXBy2cTFrrX0uy1FfsN/aYLUsHS22go5dDd4ZYsAj2Q7sYAlLtzTM10ZEuNNid3sV7WquV92ZuS0cLDk2Unq1xbV7x5+/DK7xFhhRqlOpbhVwF+Nigk4ATXZU7arrN8zs6+WClJJQ1dYvvyMgU+U829vc4uUuAIClbnDRSFXIoe8zx7ES0zPw60ea+qhDq4zG6WzHiBoObqNt67eEfhymFPEt0QXqsJ16SI+YZ0VHPGUFOt4BHl0OROef8fvL62es0/nt+oPYa8GS8RvyThUb9dJMVRX53ic9wUKenWJc+4YemndK2cHU1EmQ8b1PMF6RgrbO4ECjQF2AtmIXN2J8MyJaSWlzG6rnvwAM3JQ89/oKJDAzYh9dw9LUBJH8hYlAI+WxfXmqLZFjLvwAjYQNVwcWVS7iEStzAPC+duE91cY7zg7eWCMMj211d5FnoGMpIu5xE++6OkSB/5ThwUWa5BdZzTXVNmKqzEd2ggnpOph9SIcn/ElRZohfoESZexblo8ZGSt9IDPCQZxbdmWxhGpQN5AnVTZA3fN4rhMnJW10k2c0Wax+0kyPULlBKFtFAKMWnm44j7vcuF1dMMYoIE7Q8lQKqnAQst6hLh3x0icbBNp6Di697ScaznVd+uG4dasOVnGVIU1RqZb+v1Tf0EWcoHp0MizSRQ60PppqIbIXlsBhSQAuUWOXMjJQfCA+zclNHXXPXUSWbg4x5m67BqWmbaxHzR3s4agErdj1DSWMyyRty4SGafKdeNNlgdJmeVcVHKqG4CPSKSmRWub9M7qeRAk4f7MOEijEHL+jBSe+8XnkoPMF5fySAZBX9KL1E4WFR1VPNsapn37cxRU/Kn0luhN+rGU6krADQKyRj1gnobE1OA7QiIksa8VcEFFvqBu2qSBqWMU7ET9umYIfzVyByBxwTvymPEIShSU2nkeuWvFendrJxcYz0RYzEFooyFIhvcM/XTDbdWnjHckkl3Yep36jjoYE7cDtIm8FMabXZYzzpgZKPd56JBEdXM9XSJVDlefBscmv1oMhSAvNjIQGGouM/vFlRxKyjBwgyKDJ1Tj82OAlygww/tpiofXV+tEP2L4N/jfXohvAgQb2F968q9oNI110OBNgfX4ySU626XRxGj3oCGdnw6rTDC5K7rK77P2CnybWo8SjUYz6CNt9PA2c2oUfGstx8wB6E8WUXKFO7Ti0TxY5MLpWypF2HcQ9imhViknZ2HL70ZIGgV5z0aHUluEOph01Vs2btUKCCCACJrDJErH0jxjRqey+usKioQ5TwDiAboC/gxsIOv1rws91BfMmln5KgJDwqNHmNiIChjqSm80912XImOCSYzf/i+ymML1o/fRuqeNFtU+7M9h6IUMdVRrTPDzBTq5Mu2pTjLpUjZwdXVLuEJczCvSxrD5HpbJC4EBI98BP7BcJkq3XRgzhBxHHDLFLiWMRb36ppskZjoUQiaXd5OxHAExNT6HCk7VOvic/1voKVpxuOxB5FUVB+B1XjlGZ17z7VMkFrY0985hejOtoTJwkPrn2OjvS6lB0dK1J0S7GqsrbQAxv2zjAlyLKwEPStptIeYC7sZqJt9OAiuwhTD29oqn5DfgsJxTsas/BGghcPpSIfCCYMks+IW1o1YMDZiDVqFmpV9mZ+581srNCzWEHFXBFQU1aiaj1Zru5oXdS10rnATgZ1XGUKweAyrUm4jwEIVoNfDTiS4q7tF76fHPxBd33z/lac+11w8edpCELcvluHkJuYZHlgns3CSE/2e9kZcDXXcPTVPz6YAX2sMkIBTecDZ+4/+xGJpgv/ZK/ZbgGwgEDtw6DC34MdJ+up3oIpFK4HirHp74f553whnGgrGSxpCcqEwvEz+b5FPC3T6sBgo2O6IGycpZRx/Tg+O60JJVpQLfJ2wJmWRj+QWSBHd2cbWaKw6420dmYl3NxyAdUZuBDOq3VOwzkKUNVcP6kmStJBMvZq3nBd674O8Jwysb/yG0DosBsgHa3wXZKYxAvawur6hGXHNrEi7ZCpplaR1iHU4LAcLroqR42Ih8a9VX8BzsSGr23S3P5RP9UbNboebcw4caR0KGanQY2Da2JLSbhLep3751UxQttWebYOuM1tdCholqoe8hzxrWcQhumfegVmrALC2vHIPWYMBuEC4IqTqldoURJSZea/nc5gQYA1oKkm0930MMNLRcypihfnQn8gmdzCQt4JBRS39/FusNvbUUpoV4M1UkUGs+pbtNMJ8SbMAcQ46swje5JhabhToyCIAmgVBU23f6Orhk0gk+o6mNdmCWxikDwTcSXe1F9E3mMV2mhzAeKErNbna/HafyZiwFgIBZAvvcIFpezHwpCTgzGfZ/zBOjP42IJBFVNnhx4E9q5bjfu5wBCW2m+zTT/ZdieilB06hUb7lvvZ5ZBF/Zj+M0INu6DUoveo5m0uAqjIUbZE1ZALwlxu8G1slXwPa7eFRZxTQcC4XPIgCvP9WWel5Srz0/WfGA0NOpZBoy5UnQkS9LqEE1i3+TTZAYgKR2aj/Y0rjuyd6XCRIoGP7zO2a4hdGL6OTjoUTUQ6YmKLeyS1ecgrFHZE9g9otfGPpTJ8etmVgNAxym4FnfB8uqrtdk38ybHgXcYvtPI5xbEDuVW8Dm5/D5SGeFRu/viL3fsLxTOlZaDnyCvxJ/0OanPIk8fMb4G49hUFUUEw7lsrJXzFlEkz3tCanxPw5Qq4QKumjv9+t2GRSCQWc8xBTFI5ajIlnwYI7LdwBwcqfRAdE8llqcoxEoH90ZyPzl24mDmVh9Gn18dVAit7DJ4gpve95PW7xivBTJIKJR32OoUM/ThMR8JRTd6R94h7p3NGy4k8TgHkeljZqUJOH7uMzi2LJSWrUWVTny1PtHfP4VWkKZbXYXN9P+1/JjmhIeX2DXBJUVlp4nJNbiJg97wtt9KdDaau3hZTYsNrIaAEo+36hYlXwSL9im9INaZMZpyP4FMKid+SK9yXo6mxfCmcbKfzKbNEF0Nz52WQebEgpNmxCpta4Jdptr6zhzFXkdkNbsdI3fd592jylxPfkUpCnDkTxa/gD4zjntmP9GGmjlJRoLBKR9KXo8Sv63QmLtMWdrhmWv7yJoRGRwbP1jbszV9X2JJH9uKnaso0iZ4Ye2XrZu8bNrb1Sk0s1GFByNhqc4+ezElKZHeCdXpmVOWK3NsPiENFY1xNrTPiIHO7WFO86WP16+9TIVqq9tD7kRaZjUdrvAkIdRTik3Qaaepr0Dpx0PlJ1yOnkLAcUA99BCfWO5OP6OyifJD/Eo31lzETNvUDhsTibwS9p2f3tNAYK+TqQrhi5uBroZnSg9EMQmzvN+FrlqIxL4QVYy3iTlPsUlzYC9mgAZg4RN42/8YS+VK2SZU/A5v2PiRFTFmAP7qbrRrinaB+4Qv3FXwzZXyGlN41B0ltMBIN4EfYefZOSUe0QpAlES5Vzpz8zOt9aa7S21ouved3r3QxUkL4PoKKLx2LYyXg4fFc56swDncDer45Ko98hjnOtPk44bxLswoJT5aIQL/IxqoCceTkUY+6hrQ0Oo/xxtqu6c7OhsS8avWa3fYn+t1iZqsVCvBegIw+IwHRKexTQ9wLYvOXGvUgkLJNvjrrMsufV44eIaC3IlvARZ9ZH1qmhbmK1kIy7G+zWNQEX5h3cqSLogF8pKrjD8kFJvFbwYsPWJ1TnS0ulLN8v/r/uj75QkRPGwSbznZiFTnRNCvEGF70y44sz1rVuBMxBzgd2wcR7Hnu5HkMpJq4SC4exmYviryeKL6/W2V/7vt6X+jW77WG79lssSxXz25sT6pc+J53zh0xcBWiTmjrt/T2bMiwhoQM19/R0xXEKWpYAWBKac/d4H+0HhrXHHKsyxHrhwOaluCAt3GQj2vuOOrYMsY+tqEcXzF/1MwLLEnNTfTzBSiz3DXFLJI8CGQOYG0NFrZOyCo+dBHXnITISd7/kwfBSGlaUY/4Ep0ZCx35hV5ZC8eEFMu8OQzFuIw2eOjGlekToXDCRtEjHH2pTJtp59EEY/bvmlZFIgedp5+G274NRW2qSzQX96PM0X4O+8iZMBLNAqA5x1F5La6ASvefHGmIpm4/Q8+VJeK7cJNeBPqm36usafo9L9KHzjOM5QjTmB6UdX4QM/uHHAEj2KpFQJwIU+WDZVQMZ41guIey9lcOFDcH3/JqmrQDsAwIm0mAXF/w1rEpXmCJMibyhRstEo+s9vClD+zVsVUoLUg8BxbXNdF1v44CJZ4HfCLeZYzo0olFkw22gYRbLu0/Co1j4wwpztb53BWXO8eAv4KmnwYdcwNphu0/JyK7VPKhPogy0xGPtG0m9eE1e5u9o4qxkfCgOI61Nz4YdCa6X8dm9hhoRQML6MSVCdGoJUBAQAn8pMguSdfrMCilBvmd0gUJkGWS5cmyN3n0cF26v/Dw9GEHSdpnscyotXa3iqNcjPrBcepxWtXuCymaaQCsuqCuys75/G0Sa02FM9kwJB+bKFx5pODXTGdnM300H62NnONR51WMQ4YqkvG8YZ6KipkTr1VuL/+697XejjYUMGrtNC57CSoJ0XRaDdF5jzD36T9eyeNKqkalTxmkUVNCo+lV2I7JIHGj0E1rknuFyv1/DnOKjnbvRdGGb6/mbDAwZeOmcVAn4eDjHsaZ+979hH/OcCZjUhIPL67GsYUb3IVHcXzrohnROo+Arg5Y4/foBOdUS+9PF/nQnPb1p0hqHt3LCrBTAW7eYegHeOXWhsqmlnDXmBzay8pYa9/8q9w+YavB7iJVkpKZmzUnc7hByklG4K2fQ4Lz0pevoARs+pxxlmg7xFYLzCnhT3TGuxY3g2A5YAYpkYQL1h5ZkfFTkZUB9n7931OdFQQhsE0m1b0TiAVZ2/AgWqMA/YaoL0SORKYCKDPlJOPvXKvOaBukB8KOAqOFd9Uy7zO15P+T1c6izMuYStF8SudCKMMqlKRwVDOE+w+KUOtWA+Jm1d2BivGERcHWMrsKG/uvhUb+k2b+mwavDKGMxevQVoJEaHKqXiPe414s5DNp0hfjOf44RaapxmxTNzDs2AzknWSvi0huwng59utx8OYlpk68tlf2gkNDIzdVIGe3MJGcIzaLzRKleQp5FT31g8dU2wT0pj2A65igOX2/duPcewHs1lEC1yZtp/XixROeGLk7NG0J5ZtzhiSI2zsJT9i4ZA2+a9nMQJ7Vzu+NS77o9jQw99hTe0buNxkvPcdzdlbBpYR86k3MAZOiQQ2YqllcGsm5xeWsxIV/dJb3q/MtBVeo38gHF+qJp7YOIGYR77l/8aF/0n4XKHP8bVgszbV4T2YtDzsUGRkrHX0ChY2R9iGhYTrga3HUJrIGgZA3I+FB/ZwieLnyLvBr5wnBSc2feHP0Gb85fdOf80E3PO8VSTBLvL5qiUvmHvPCMTexYT80LWm+ZCmJjyMWCxesxWZCNDNHLWRfkoQBT6WPdsAVCQe/rcw+OVYJUBD0Z4l+ungk4KDIjyx5tNQK6GgDRFosyTRZE/XixXPtet7VYmBLxAsuWu8/s8PveB0/yekSejylfmEXLdCN09n316zfWrj4WK8V6nUaDtxSp+jFzuKMFm+f4OtFk+s9gHs6DEH8Xpo7YAEn/pKOjxoLRRMvmkpWz7nZt4RVkeaWswW6sLcC+OmiC5+oaJrbVs4454lCpBeqytdnSraiRpJV6NXSZiuJrdDKk1VWrcN5h8XVwmKQaX+rZ+54yryFKzUUFbYbkQtk3nAgEk8nk+eD1TaarmUqHCII5Q2h2j3+WtLL7uH75vnR11FVHz5/HkZG32P5BVE3X4+5SB1PL4TIk7enIGwbJZJM1Y6VwaFROWxoODDBSS2efBVPWvtQIOLWK6eJxMvSZd+x9ukAfpoUF5IW/aaZpfMOaSttm52g2pgfuVi8a7tRYbE+2FmVNb41KmYYGFyprLUd04wm5v9do+ECz5FnEWUm/iz9d0Bgfbo6qnbnIuKOLt4v6Qv45CViI+VTM8p1d2z/NyBDPFsfD6An8PJNP4IdJp5/JBwC50g5VIuLaXRK+NVKBfgKA0HFYPBicKz46NFp+tfkQ2VwCZtfYEfn8ULZ+3ovgHjk07kGOgh3AxygQLZXhRLTrp8onPKZHgcOQ19z453n8HgSu1UBzIcfQfLklUJlt2WC3/6TtktziJXmDcg7SIsJWujTHXJNQwpezKXlJV7XIYmMdJMIdHkGDL+iT4pT5of2+SYPZ7sk/M03I79cooBxPno3aunVBB2dZmVF44JXiaBM2OM9WphZokVAtB6Z9cgq/GN8hf3P51hI9/w8IY94QOjYj8GGguePmIxV7pXKbEbkNjC3Fhvc+XWHBkoAoe4Y7rgEZbK9mGzGRdp5rfJ1dN9wjYuGMiHMKy/KvPGdC+Yt8USdXnvRENWLnMpXJ7Bce980GGYVz/8S9iYRcbMwwBQ9k67obHUvNFJQG21we2geN1AijhlH+yDEolciUNxAdnnWfNSqE/QxPotCs4LGWl/VqHARFFCxKEJynTjBDsOnui+QJ0+KgakQhmXFbVZPzak1RJVWoSlp8DYNZxvRxxRukrIvk4lNtMa7Ride5oWndGW4xONnCyfExouv6CYVHAdHHBWxOnUO5ZKP+21kpjX2cGjqBIkVkXtvsnUvaczqYUYBuNw0wPwdppnVKLy3tYWpHtm4IytkaHA5egmq6YF3kux6AkFTyyO71Hw8H9WNB9WMzrS4vewFMhQtSdYikKXGpoILGzxX+cEQG3FVuPRveG78AmKx11MMHAtq/zhmY9DpzCM6T0vCfjDcg0E1BPND7nNiZ+0ZPs7+fNB5lJ9eVhlvRamW/M0oK4e4gD2PKU85GW2NRZXXAV6gkrypiBGDANMqV3bshiJhwIxz6O2txkXIqHcVhnHgV9e18PIVk+VMW3Ag+nr5tdsSYMWlYnG+9v7eTi4lDZS13GVFS3uua2x/pxrWFivPijfhzrFxInkInN6/nyW6xxeAFEJn8ofH0rp8RoRkpjpvOFOholdDXiIBlIyADnTg3P63gEbZLp6ofDINc3XhAX6iT2LRIIQ9rGcgsmC+19Y3zoC6dULcTBv9SyLOtXMHNG4DEijzHzxAG0flImv8rtyfYdH5HnieuEJqhZbpxybGkwB40+b9KZwnSgi3r+ncGgwhnI2gem9ADGrvRZCWmNc1MCs3XYsjI442jZXevTBkYOhHNl3meYxTE1NxyfRRgaZhsNGZ7edcbJWoVNAiZK+pNCxfqsqMIl1WWaa2M+xHfZDxBcuSeLvwhHXFl57FRqRc9JxoR7PyhvjcHSARIRzvISiyjSPDl/nXDDGFNXBfNC09Py9CW4eyCfJ9CeuPNVoWThM8IqxW8iq12WnKlenSYdbVNkE1qe107Rxd+D2IZEVQYIuLL89zn/Ceay4pmxknflhs01rlufoQzxJAPd9362Dvvthf/dFR6GW7aku7TaytfZyHt+K3VOOHWbSccIxFv2jHa9wkDaEmqpuOKHOT+pyvynrWwc3cHLgRqhjcDadPzw3j19JDe/pNOGNnLY0nJ82/LQBnnsJRyAvjeRAmL1kbW9EsVtOG88syttSsTCWGMun3yMWFvHI0D0ZY5h/Re74r+MpKodR1thOcyPVqGTgCeeluV7YRsK5athJ9lCqptAWMXgg8L0n/uiBM9UeiPtcMcjZIZ4qQhWGSQxE2BNSYBKKwQDNv5+fB8csPX97VwImdG4XV5BrqiPIL3rR1/Cj6TUXJMBLGGEeOxa9UI2qQNtLPNy1oR+b30sUist4hIRfyLwwWEF9hYU3oJvZJdQwEs92jq0WUcSbBmqN2GHwQChK1c0cOmfmPAGjYfvmeTrxYZNcsG+go/xZtuCVnm7XvWgMMyt+2UzfxbjAFgj4s3dd0+6Qr4B7gB41Ka5IW/hSMktb211c1H7Cfc170TeAjhAndHYt8qh2awozdttEemvrb1tSj9CD7JATKCYC5S/joYFdWgO/4+lk1iEPp9Kz7EywUNy3WWYbce1PfQYBL5C92ify4/BABKqbFsr3E7Qwx4PmMgBBa6BK0xko09gDgtMM0XSg1AFarMeFNQKPXe8gk2l3geWHqwoR6rLMdGaM+GHQqE17qDI+F/ojpnFl121i3bSK/TSJSs9rNH5fyyBjvy7UfGPrwpQ2Go8oAMMugmO9K+jg5Q+1cJnAlezO+vwCqVKQ7TJzExZOlfh1O2VcU3iVqbkmpTavNjK58M/r/eD9xs+guTwNXKznhihAT6tjj6zH208TA1ayYofFnOFP3Pe19+Nnc9a0PEwZ/atCHz2x5tKSa3nM295DouOpDVrmWticVxuRK6mdaY2YTLwC3VI3Zdt/OzHeZeoIeCBTzeKgMkTPbTmMxe5Kyyee7fcJiX7ksxp0qJCMlzdt40mFjYV2xY8wvI42+GWeN8qAKmG0N/GIZGD77ict5ZRGMtM/2JAgKoufsUInkUolD7YVhLk9mAUE4SIMAWaD/zBvLbLQHgDWV7j6dg1Xvd+DroNvI8CkE3nc6ygCf/vaZyKepogpPm/Y+edoCzDZ/0UOhbDM4wVQtLMQwTtHRwovB1lxSu4qvDJIWnF0TPN6X0Zbux6rYuQA6JtTrGtmu3y8OHQyOkzokfV1rPj6djl1ooDUxAXIiZ99phqJ/u0T17mMZM1DSzUAGy1DbAF9Bq6/EeWjeDkOubFS/wl/fK0Ev+ZA3ixhTwPdQv4Fpnf3k+MJKUGl6UKRYkziYA5S3GyVGAT2hEoZXzaueI+ZgVVuBqFUxCWgbGPWlJF6qYRFIinB7eVCikzq6JgGj/EiTnOR0rTA6hXUS7IwOOU6PSbDwNKQoMeGyc9PFw1xJD0PhXDgBC2TjhfR9xseDSA+vlilMuiLt0epmDdRA0hJ0tubfhainrbRq1Vp0uxPlNE+QsaVKHwNfOLGn6adc1r4ZxD/DfTCd3RtqOXchy8Y9HwOxtfhmT3KpvbbkNNNKe/7k9tO1O/6RmXSOWc62d1/LmPhPQ8dPbRmVy3KW3lCyUPWHSet216hNcZyHTpHWA8R8dFGOaXKgeCkCvMNN2p23quRpYatYaRa54M0Hz+yy/Vsm3lOkm+F5o0ViPWbZtny5Lq9RtjbblurXx30twm+0Y9M2gUAAYVG7P6EPb+NN1+1+8aYURGNYYanxo5Eb2FCEwNGvC9yahxlXSWHOafsXIqn8TJwtKenewKob/OgRtOUtSXiHjFLesNKoEM+DWGQnga7a/c6E802ONDlHt9g+npcJu58+ot1/0iguMet3aD5MyCEvDiXQrWK5cONaRvTwGYis89CDPZYhupUsNLMu3HsRN9FSBfJgtCvFsSmCveCNfqPg2BlsJNachUpV3chSJqkP1rIBi83d1we2dZIVxX79fePkbKGM7hETSYHYHHR7KbD0Ht3rGvn5kWJSplT47QOR9xpmUc0FIC3h1BBC2J3iCfEzHs7Ds9Vw4narfP+2anDyJx+9zS2g2nukNTGxw74q9o2Z9DQha6khK1HyuXFo+bCiojWgRByVacQY1CH+HCGfu5X5mQVM8F7adG87MREsUzoNmNTfwc54aYKNrRJybBtb3xFQYvJ2EOCvNHYmN4+XQo4sM8OcJkQQVpp7nyEItgx0zOcVW0T67ntXnhFANeq2iNwKlTPtamjS1gYT4mGqXsfgEpF5bckKp7nqySHT0ZNLzBLsl/8QVc6PTt7NPebZ8X2VC9hD8cwRlmNfvQfGZQuRNVvLN0CEQ27cpjqPRdvhl64MraWWHTavWTo6U/lNodDDLpxwhkgns3dZERWqBGWvnZDyaWe88BTOMUOyU0EmFUQWDb9WrEpeORNvfl94k7yWNAMA7UrQFWjJseUW68W48ZZh7SQ3wF0+ySKqd+1tk6jpPqe0NA+kOZNRxmMG/7dCCs1HJTIaNHZulPyEm2T9FXMDRFkSa+PZTiIyyZQwvMfk+lCA93FidO3S0ped7B9w5a4egh4eOFEmLNgWUUsoWIQVoGdYZNM5ULgmLJr7VGr8/G/X9XPqWTX7YYD0qZr1VHGTDP00CffMvr6jIZUk0oMGsqIuz/qfeoQExvb+3/yvGGOmdCpVAhYGxDR+flbut3DXyjy7pphRklb3xaex1B+URMztFTajHhL7rju9hYWphyP7WtDtlNJIxj0LCq6EMf8LmnPRsp8gUdGV84z9803brAmMKwFWD02YWHQq71Fr9fBzGa2OOYWHWIinaKMLni/CuY/54ew/izO4uuoE+9BlLu0Fa8izF0hfbYgDQg+KepCgtTId2+IQ356znPbni2e0+mNYau8M4z2O66E0fBzkBX1v36QnPoamkHuWGXdAhNNGJ4tt5xd79JB+XvSI3oLK/dwz5uwwAvTZplO2Re0I9mcXDZ7Kkgi4JiXd44wPH30sYBKZw3fiL5H0sfNXQBYVhfDXnwY31quRKbYJyXPxK4F85wnbC8DOEPRTTbNOI6Zn/JXGruOJi2ZdaY36vaTJE2hfIG/kVSKzQu4Xo+B0iTZhGya+1NDjw15evSd4ZBmfTD686WOlEZjUKhGkrnG93z+Pmw1laXQylc865iinDkKPqTPGmzrQDfI3/bBCBdGS0GboPaO1vnj3dFbXMknWOgy98IYEYKYcLu65E8dRKYblqaTgoIzIgn7RU0g6mYGaEnc+HRp/IdZ66qAeo7DS1hgWqlClNStrcCj1w6eK+FZLU3WixhUkfeZqf7ruxJ42EBwpctYwvQXX4QFSMeUX4HZTDReZsPlhi64ugO35RKNlBKREwTkI/OLqVzuSLo4/N2D3ixEvtLssOZRfZ8ENCaRd7UnA9x5ykEAfgKerB2fozCfH6IILlscBg2x4ofKWOxwStHU66espXWS2d3/dCOyAH4+c6XfyKbOALLBreG+xMQTfZlHJyhX0uylLUFkC87ufkKgnetLbjLRmFsShLQfzLp4K5jeGlz9lszIZJZPzPrV1QZKlbZs4huY2s2QZ0ebm6RFNmsVGmJfyBDn7dkoKyr+HLrzT6nNo9lIiBVpLdzcNrWUz4CNXXDSvzH6I81slXk90h/qmY8awv55Jpc2BAUedRNREsVRNM17ZNAJKDYTTCZ7wcS2s0ukf8NXdKGwewKKGK1tBpdSVyzRPKc8hChk6qlrFIUcboJrxrjfT6iztQ0zxOJATQ0dh7l/8nXRRkv/JyrNCO1PEU3P73i64RmYAoJCyWBp/iB6vkDMtVqZJFpOs6htzKVywG4jifxkSA82INXhdkl8+UJZDKWmlkrfe+magkUdl3KqAMNrSFBcTHT6YaqcN/ShBO+vbJ0TFhhWzoNavaL90wwg12kh89+Jz/7MlKzWiZwkUWS3BUVXTCNJPEURS1Gi/ujqsP/cXJRvdTe2Su1Ar4P5ejwYZRh4EhLJohZJk/iUc+IAw6DgpAdWQNsICj4m2mhLxx8umxEyxkuDEbyFAxCf/yoGEhtesvMS3kUXFYeTWsEz3VoPm9oUCM8BjD2sqUxcNWhXFCu5dx8kxKLUr/Uj6qjz4mbwZqko2TU5WvZJX7xrZwkjnsXBqHbcUWjPfiiKaDQCOUH8V2e+cI+6UpUU2eSQwJ9ubPeyNQsn2YPoR1Z5LgYy146xo+atmIIE5ElZ112JT8U6LXJ/rMTiC6dExPY42JxPieP1zWo2SQOYAB1+i8hsgBAWKvysh8bKeWQJkAyxYz1Lyl8pneqX9IL0qkANytXxCkDhTetMeqKMFHGQ23Oddtm5ROsyAEdNeC1lEuQdny9X9naWVlKYimrw0WvhS3JeyoCjE9aYOOXfM2tj6SkW+jI2yUwO6SbV0i7WrYhs4GxOzqV3fNihHdewMcB6g6gLAxQI6BOtnzP0+btlboTVvuVlaaLkLflEyLKcir1rQE1uwmeQemqEN2gTBXQXRwrHB6gyrYF84Bcio7YR/988D1AqMS+RDT5tO0MdzVQWEdb3ttmYtQUZ1mf785Ksgymy7QDh+G+Q93SF2K2kyXmymx1RJYHimfIBAuIp6OE3/c7f1KXvCzCROXKd8RmiNliAgGriifKKN/0Y/n2bH+AP55XLbM+q+aMnpTV2JBPK5ctxatAiVbC7w4E5lPXsukR7gWOVoQO0A14hPUWXamA9F3uIfTvvFkNWx4ZvK2ubJhF9A86E30MuSgUr+RFR68jUT3atstCHMp9m97nim9jNOWOR6diuZ/eIElV/npokuxTquwL/QVgj7jyG/FQ8XQRmWvlSx1HCNw8WscoNEU5/zrG6vIG+ex5qn0+c7jOXxOrCuKBwdfVApRy1SCxHU1b89tS5wKVcPJ0s1p/shlBDJa/r6pjDQBbGdLgc5w0sXzMmnGz1aBrYJDmUBpsmPOOMO9T4EsAqkTV7lTc3OA7gcQp0cwxac4X7XegWgUlsI8PL67G7NvIiivey+SbMk73WT2+nLfgY7w61cawJerBg5iM62wdt4OOrb/YCun0iZ4sd73qzherQ3Y5kCM0zJyG9MAPUyq1/nsxFXsEegAF0+7Q5AAxPlaeMtPMZN1UMtzjn5lTWkPlxgh9zxS9kXli1O5dbBRPS/84jxbvGC7rkPebwxEZH1B8zN7RdDfA5LwKkCQnmauxO3qEpJwoaSSOnX8gMfj42WL6tCC8dUO6VNCFAUIDxrF6xJDmRV8JEnd7hrxqIHSUmiE3sgnTdCBvUjt6gfp7MtXxEEMcgh6uKoAcwTgGcMS68o6ZqxtuOhEn1FGGsceZeOCRq3gdoZYp4z04onQOgsu+z2D14Am+MtOfkWxDT7etI/hWeSiSw1i4lQ5snbfMiMyluqVTOgIXB/yJZbYJ1FcGMOLrlivVXzwjUd6ffpEf78eRbnj0HY4e0JixGHJ/Lkl50vA64qSSXBIoSoMr0mzDCfNBnjUcJZgOB69jy0P7rAoiu0h/JGc9AHhowbxsU4exYQ+oqNk6NezcQELQ1IHhep6/6Rxkk94sfz/vWhiV/+a+nWdNLMnBkql/JCBLyKlG2i93n7CX2VoCj7foNZvKsJcw1MPT2+p74SjOSrO6Z3o093cbmJnE8vp4L7qvFKfrg+U7o4ZO9Iqm0qs/67U/Wg9PFUZBHUCdVYMaTaZNFcJPpMjd9n+W0W/MJ4ucCXqPgm72qb/7YZvfvLBfQKuhtDmOjhZ2dp6IJ9ckSU9ISQ/Ldmb4Hd364Um+ViNDO0ZZS2xDLQrgaHr71WLblOeFp5zjOPsuISw2O1lzQwEZ2PF7PPNH739ygR7PnhRHhjpdhpzlYvOQtpKeGbEO7sZqb1DiVF1QLQVicRRVZOlTKEwXt5VixOrFsvgZf1+1TQex+N1CVYhSfV/JRwNOT0jR2hmu3ijQ+YWh0oPcQxO7pXPzyhduVZWtQ0BGW4gusaJ++YBUvuXcTNnuDO7tuvuaB6u6F90fkUpqfo92+xv7tF5D89ee3dYMhlxrWtU8Zm22yhhEVOy2B/ZauYKiHfV4OqtsO6gVgO106CfXNY6nOY5gcHHPXS+2j8e9hH2pYJw3YatFTFJ2FMTYmKj6nbFSDLxOPL9cItNp9n1Kn0GKNZWynF59UJ1F4lc7M9Rvfvc6EteT3L7iuM9/R4DtU0Gfnu9f/DS8/BuQpFDP/dvmnM9TkkmrcTomaARHn3sxQze7sRvUdX9x3RVuO3vhS08PySodJdyZN6mLLmfsUO1tqlPwHrdnhwR4u2iXNieSHz44djTTI6+VDu5DWM6h6gJ62FZxhlyGMga17nDkfala0t3XLgJL9FSwLuBSGUleGfwuRtScrlqe/iTbfwB29T8HL2MXJiDw0IvQY9hlIw3J2YYpaL6hci7ca0aS9cIIpm9iPC0ff0BtSfFSxUetl98i/FD78Mkbj0T36BLAC8PYYBkUhMub1o2GiFyWfeAcI4bc+tr6p8XbLXeYsEcjv16OdPITr1TRmp0Bb/eIt6aedK2B5kl0zi8eZOT3K2FLUKF2LjiKlNpUTc8lPU6vLzs0ZeCurbMUNJGQg/vdkZRwrRl/XGiJmqVvbCqwiLWwjne2yxtLiC4HexZ0hZfO1G2dndqxVooz2vP1svvnh7bQe2CMz6v7wNrte9Cv815Wv/E4gtWLobrfEAZsu8+8li/EE9kK6njzhJYBSU++py+ct7m6x9a/nF3cAmpqnfshrHJYNrpFWEKFCiz/0QfYV2qtXAuR8d401aS+B7RstH+JfhXoEcz8if0U4KRTAVAI+Lrg44dOYhUteYuw2xRdY1bxr0r7YWt4eHMt6nDARrLxPK0mZk4dVIxkJHiJfM/i6/babbskeoRZJJNRn7rO7IZRLkm1e/nqVxqx2rtH/EMGCgLeCAL7F5o2wMCsbOqAOigZqrzs6VDvLrY1w+n/+Y21+xi4Sw0n5f4x6Qt2UF2t05thOT1zcAIbbnYIU8r+BDaR/ndhNr5Z/U6GnAKH4pcjZNfuqV4Y2Hcq8/dKfN5zQbY0mZJlTNT5kI9iiGPszwxoUXWGBo49pSSFwIRKAhS1TlMNKeBLDPQzu1FLMGdekPbIJiEIvvah6mpfCN0w++YqU2ZVrRyOhF1ip9evTJOpR5tbojwTIWE2WNp3Mdp7WRRKgBVmF4U37N0tyujJDq4x5EWoCeO8wDwpCpm5X2jgnMqayC7rGHb2L75biGTUtmGV6cddm/vpOBXYoWKXmkPJz8WTAhat7ex+81P7G9VpsbUnHYLA/KhOXJ9UGmOM7c+Wn7rno/8h6/OvY35ZBShe5IvdG2TwlnmpHdynnX+hoe46zfNCE0yrGhlQnjF85z+VcIC3Swi2HOK2RbYOaiYr9RwllYu5/tiALrNE3RxbdT5Hncj7GPh65Rutje35Fhd44ERxcNRhZTr1hjXaJXTcdgxxqI0aP1uewBPGkPIGd0DqgkV77e8nM6zPcNEYM3B/oviDX1p8oKe0mJGhjjK8ZxSnsPraGmxBnZwKxy/BDpeJAAtOgzx74VgLqWtsHoPgcee9Q0qN1lD6eTK8AWpSwLQVv6BMrdni2lkNtllkCWNIjNbhT3+NXuxIwSe6TiLZf/xyr6ReqqEtl/PA2aCfkyvtvdrIHVBvTXQ7WStKmCVJz/M97x5WL0OEoP+aLZbBVnDTiKx0hgxjdMCc+ZPqjSKeHoxAxp9rxBIJCmndcRwuimx4lv+frX3csmgA46NJnviY+ib1Z2QEyVNKXlIQZBCzV0LFdxb48pSlK8f9gt6gu5A0ZOx/eo84rSa0DqWvzhirUgbOz1aT3nRpEdGt1+ghsw0o3w5uYtq8GQPF5T0/nSSibgGZZKRCdrl9lqdY6n7G5B6m5IdK2c2ukYeOxbtGzU3B8Duu7Ax6OROJA4a9gTr6tdx8I7DdIsVrUy6mQQVVXs8RtziBwdAog10xslLIHVKFxbv+6Z0q3T8mwNL0u1eVGTx99Qv20eZZnpYlJz2LjVYrIwWsWeR8G15UG0bLsBT79ygBcRNvBFLyMAdzvyvOBunY4FOBHr1RFtESoxH0/QjYpu3YttF49WsH2OL9cxQRxebfObzjZiJBflJLe8pAV2+VUAOZQzUuy2i6XqyR7CMqO7/1tl4lopnCoQFtafrUmzWv7poBRMMfLRTSojebd20RTUsJvr5ZhRmUmu/rhDveN+BQmoo731Fur5bhkVDFcw5qkKHMIt35WykTWpZt416iKAUJd9TkkrDCgRG1z5RM/RmbUXHuZSYmT2fsQSgej1uY8Z6Bvz73SHj/iqKMi1otmGDWM9xNMdkFnhRpdk0keIDrCjZe92wObGBeDVu2ES9FtBfhT+dBnhnxasybfKxMNrEpGLnZ8g/yUzdAmhnk6IgscH/H5M5n+Vk0vpdJuAOv8eF2VS7F4cdiq/ZKWg45QsYOlFEKv8ep0dPJYSx+dZiAwsvbWyjdItvAE/Du4o+tgIxsF4qC2CBKez8Mu1JhSazZjjZkNnZvSj+GuBcZVZcO9b/m7u9Cdtkg7MOt6TWsm8XZjz+lvZ5YZsarbS5CBjyAQRiv5aIM8r2/NTHcEvvO/AuHe+DxTkWsemKFEtvxHqf2CmQdu3f9G2BZ24StfcYlvwyVdY1FSL4f3RJki+de3+TsH35ZtJqiS0zqJe62spI/8vS2jCfF1pkZj9+C8tLoYXXWWheEs2C0fu+O6ezgNF+GBNIUzg4F+eJaQCpvCcibSgX/raIWvDQC/S5l3UvB0gZSPDplqr/VQQw/VImiOLPO6ZksYWVL7LEXIcsa+Ih8dUdPLGnrv45QW3j/Nz17/ZA4dbgWSz65JuqlN4zeWhcmFeyYnQUIWpo5OlxpMOUWW5d3ctDGdNU81I+MozsdxIHjJw9eBr6NUiyzvcnEq5koenqj+XxuSbkfVoyL/n7G9OvEy3q1RNf772xzNaiQ0nprosS2dooL+25/f6SKz/3PBHwkLMlwRXt1vZKHqKzpAxIyO9GSAu9CdKyuB7V4NsEiadJGuQbtcCIM6TuS6b76ltjpntnfN9gx+7uAjjE2Jnk2Gt+wgP6TS2VzEd5vu6N27UwmYGWjGa/jxnV5bSVsyE3LiCwR4wVPRDasAhyO+pVO07qnOrXgIhTee+BS/mYwEGbSXy5bUV4GtiJlqh88SILGWzcojCp6NNDNHV6Hg1mO7hjg9M+0fWF38qhiZUAgHypcrzAxlDLv8Cg2lrSssHTvSEqeYXdZUt9rrxiUoINJSS+F74V91Fv88/fEFrAmjhZw4lIyxmyscAzSfR5UHgy46dwj7h40TPJKt9MHOOAr5tKlQxqKq9KKQ40GW0Di0bPpzprm3Q2NUr3Iz9kup1nFgg61/VIWGYJCDnofnfKq4QHW3SGYxKw3+Pqd+z1BTRtYa/BYKsXHDkvigLFuUHjj/eJaZ48Cnn9tpXmb/VlD/Y6FusNebTWFKta+DgVD0pqraqc3h9x+hn3MtSQcdcniZRP2V6PqRVqlW5v77RkjiiNrCajp4Cq6GydE25W31y9u3ZO8q2OK7/e6H3C0mrt97gB4kkfqSJQ8gWc+cwGDJJP9ljjzVgjnxqb33F3uwM6O2RDZJ4dmaTe/+fQ5hYGHFVr0+4mNJ0l3ip/tXpYLstsxtYsRExoDbGZJN+LYMIaZYmCwCeOuIdjhKMWrKbp+9eLUln6hyBgS8CNkZN4S7AXsGCTfExEuDowAPvzhBPxPOoREe6LvdAM3lAIbeGosEPktuPAhE7uZojABicLX9B7PkBScjDENMSCg6c+cP4QKjJHduNglr64FOySv2004ymFEKRBldmEfUF/ZbBWfPCSuc7Qmzzr7T9jfToceOxm70Z7G05h+s6jahVxDFIAVHLI/PgXqke8M/9P5qvOtfplFBja2rA4bwzaChtiKKNg9J5vldI5TscNWjZABOF78hyz2W99XfuhjO0Q9RbpWEqeiGqciYZ3fpccP9IFl9dQ06FXZkkqmqzVfgYz8kYeyL51p2RtrYfPr5EZWqTnMYbJgcQS9mnf2j6Vt0BYGgbtZNoe1kJw2cm1x1u2q5kLYVE2sV+a4y+MiB0PfSYH333k9MgN0EJQ+rQT8tSN/4yyEDrG9gXWIPBqVaFf+5c8r1TJQkCt/YIxx5kyodf1FkUEKfTKokM4MOimPio7PN+UXcoQfCx1/e9NFRdYo0WUSMMm4F1a3AcYtuY5dSzA8PgrSCHF4/fd0h2rA8Mwm5kgi03MjRQmITBhI+eI+TGms6FmNaigZmBYx5B9v1R9ftxDsz+8wY24pNWv3xna3sCmwJOa/8n+unntIuriXyEVAk8pBds1nyqYqtptRZ2RmcYshpWBEwLoS32qcGba3pt+mTJCQW6B1ZAmWLni0n4Ub8Sao8g5XhrOuCGCBlQINoeAY1qKErsorR+PH2bPXb7jmNiwd/JrapuXZsAGGOQxz2SwyIRgG28qCxbinFxwFXateKaE18g1cXvoC37JuOEIMSoj0KhUgdU/6b6YAfV5OCMkl1ScNmzQvEYHIFTZkuDHBDuw71DcaAEtAGYz96zktsoxufsO6XP5gJgyXsp7Q3/AcZvRdPQLmwVhRHF8Xbr52iCEwP7Qk+MoZ+KgnyX3kftsNDx7t1qxTj3ZhwONpEaZdGPADGAQLjhtGqH4QszjJukhkeHVop5rG5w+xNTtMh+ymuf3fTH6safMPginS2Tn/W4bk29wwU6jGNLUhPm3x1jOW5esEZwmf4yo15iAcCNk3jH3aR3KhOQxMPsa6DEws0JcygVwObbDhO7o+ObQsV1r4Iv0u749hTjrKapmxB9UloCvaPnCddvndt6EYmBSqEDAMTibdcUMeP6yOqX/2qx5TBahiBaPsxCP7l7VL6wpaLUF3F7hte8fhGs+1nafl4DPItMbuHJ0xXa9SPkVFLxlTn7Y9ovQa8vTUej+r+CK/1LCbizkVDgC0gkaDeLon9kLrvXWThI53QYo7xeGRvon6MJLfcnhL4qJiDrbg2l4RFn7xd99EC4ODJVDvR90/090rojhw0rzwK8/PAwlcDuXTSD8ewkdGeS1m2CX//6UQwn0LiT/4tvUZtWf2LhDdKRBILCZLeFh5RWI2DklBbeuaupvbh5AKUtJBqtHvkOvKIOAH/ReE0RKr4cUDLNlr0N4kw9Vkipou4FPbAzAVrtvoFECFPTzoWwl2PmUR118Ffv74wslEthDwo7pkRlel29xVbo1wgqGwGeL6g44di8wZzsnxCSP4wL6gFdaYZ7D1Cm1yrbBIRvUhrvmk46aUEGRvoiEcpDrtizppHdiH24cp9fxxaDfDqIhPU+O2a+yH+OrkUjVEs0Dod8kbjUCekaHdROGjOanCSkLh7ogwavko/n1gxj7CuH+62sqQzsJBG3wREcGgIlvAJcdPzFFlbt67SgDEfUUnO87WYb+d3sszwifHxc2x9RQd/aSihOVTq3KpmNeXwD8pCylrl6El/4pvpIGyo+yAcumhHTvj/UkAef5HcspPA2T5VzdeAfjw+PG/HBo4/cWeBevyB8j+qvBfZ4eBVW5cV89nqCrXwgvAhZfmPnkkS/0cWFwvgeQLr+aTfDj88R2pdkVF60j9n0uyz+cKG6w6iuoLuK6qAyaJKijPwI4FeCDyvMMjngpsPgBF45b4ooGv5qYM5ADyePvEoCCbnSkX9ki5um1mKWXyxjE7hxcfjFsj8nYvuQFN53fVk0/32w1hMR0/UzE7uWLerukabM8fwM2/fhFrhRJ7SbQ9vvs+Fe8H5/Sv6Myo26Zdflercl9rB6h+GNc2yvxdX8YOwdJS/aeGTXNmQUewCZZ/wJaPPagJBXM3RNo/QtLBdw1r5ce7A4iqhoaeaSdNVVOL9H1QkUv3nk6w4VwRUWwLcvYtfhaW1lslYWwWuGkTNNhWb14dSjNhtbP5QXnEpfphPO4aWHZwyEMAxxBbTiROWCM+FBj+BzK+wy9dH7N4UhgslILvRBzZzpyesxHA6xRbyV9mOWAfHkd6Exlewie9Hj9+b8z6KpaMp0lLmjNO8osUNix9s8krreEljs9ah/2qUJpbAOkU1yFm80wi3mSvQJ4rBJCjtIMeP57vIDV4FOHKAnj3Cr6FrYgr+GubtKLBFryB46u2nJ4Z76QnHnUnum5T6RfeLnnfia6HgYquWZNJo2b4NUgE9MbwDwvPDq+uB0s37ezsn7rx+bucukLyTpsjgJDMvs7AbjgykyNxBiqqOhRB9ZiEJruvWtvGY48XcIfBKemOLhT1yKrcSe0g0xAY5h/Kq5PJJXpgP/GG3+yEXBxl2bvl8dJGrNBBvc3T5zaPe+Sg9OK8EVrWUcHHs3Pvz8huUl7x3svbKb0lZ4ILERmyUR4fRM4JbYOoJgzUrvwLiJ0RmGPIyaqPpgkkSvy6T1J4MUUavIwvh4Av+J2g5wKu9eTj3CC7oOlk6wykPBN/P/3XU6eJ/7ChhISHHG1Gi68aHwEu0QhcuuqNpivMgfZgzEUKgOLkBsiSWmmlenvbdqr455Utu6rQ0yKVwCdiKs/0Y/++eDEvlepC4bDmTKbRBUW4xW7N6NJw/Mt83WCrl0V6D96A7WepYArDLaPViPA6IVotsjoquS4QCWU2DMRBUGwADbipLzeDtpfL3JRaWTJrdALYRTAZFWwk5PxHKVcUzrafNXQO3pJKYQuu+AH3hwEp+WDtGxmBBzkFeJcktEUFimyzhciq1n5arkRT0W+caI1HRWPCHOThkhQmqTR1mMIxP4IRLSprxswWB5tTeObCImm5DDns84EuXZCJ5V0OQ02nt7jydYtoKJMCnU3Xgm40WwE/hYqZ5Z/qisoUHtk/yuEGd8xqzP9vjGA3k0Sxf1UyCBRYWSRlbxm4vPmV45GzJpToSa3eL/94Lcuj224rzg16XXXIGPMRtVgw9odtjVRCbN5VHq5QaNNxtL9gc8L8eT1mFi+jH8iN3frBZb/4M4OjmZMnBTv0+E03l6YiUsv7U1diee3BC7ygbDCrRId25IbK8z/Zk2GgctydCADF12KU60CyotqBha5xGqHkN32jGFtODlZzdW1SkLXGTYf7/NaKZxgmY3HfDS7Z89zuERm3hBptVsoove5PEXNV0qfUTRh33AmTb3jmBS89P0NmE0isFa8nTi8qZhcSE9VBDQuijJQSkMYbyUqUDQUR+VDfzFs7Yrf+KmqBG26K54QhT66UCOqu6MIAyevo1CQmlL60UKZw3MdKW/LwaIpZEhsdrYhbPuMg7N55gOizqHBElDyVMq/Gxst3FDYg8Uxcx35U3JtV8XdE7FP7AM5HVTVT/Xh5ApoJ76M4ERDUtKkpYqbbv/yOvj2UJ7I68LVLwU9kJIYHHdONFp4cuu+GAktUjecpQi4vBC++wQPNU4XGjwf5m1yGpiQzMDIWu+vFTHik/7A0QB03VRdBYtCi/72JdEEqR7YRV7l2MuppOS+x9yO6Isls/9cuoxH1RYqiOaCe8HYL1hMML18OOTPLcfck8SqpPiE5rWB0B0/FI/3imW5DThommdWOppwn0SVxMXKIW4Bpjm1cQGp5nddBa/Kg8KvcRsjJk5WlXjhLiJBFsKxcIxgGTOrHyobrwlmtFqYJ649cJnYEzuCYGpJxeAIvTLBQuT28aXu3tCUHX+EIcm9QJpJjuxJRw59IhtMuv3ms9GPGUKiRAYMZ/0/8b6SRd7RoyassmKQ16lsrkeXwdn+jj9m/mfeUh+3xe6mKx3Q4ydDYY9fjCZ6R9jwSgHy1b8bw1kPfUbh/OBihtbS2eBrUrDS4lPXJnbnmUe9DGXeFHyZIEdkb2hgjYiYBloNCOId2Vf0+KT8k0e4myePPFY7v0ml9PTQXRsheY7m8uwWW7kJJWol42ZI27uqJz55GTopTmuvbA9r7er4dnXStWGo9w0NJ9T8oNq3QXjea/bmDnG1lLxXQiTlac8jj+iIXhi31oDuz9PXxJsA9/Q8U7Ek2RURNZUOieACgqmE45dOo3iE+1iWWYOoPqHJmwNPP1oP6O4taSYeKLA00XoeHR6zBhl51ABiETBtzrOKsu+HBlVzN2u4Ved66ygAa7ytxbiY8/ZOPl5vq+sqNOAw3igoSpWa7XiZI60lL2SZ+ywxaNtcozs9422YPfLEiurDKibt0dnhGYSF2oDUH0YcfaigPjClEHPb9Gha5Lprn01AnY8Gja0bYspwp+ZtCMGPL6JaxB9OQ0sqXE9x0FlT8mR4vEjiScUXrH7A6n4eOAODxWYxFTEtA6ob43UF+n0/CmT7UCtPbhZr0vThkTz0vYnHbM9hCbM/Lz04eQVSvqhJ+kUe4Tt7EoRRDxfPeFGwwpAr/hg1kGehPEMoxJkRlMYVZw4eGfJoK2Be7teGWb9ZYbq8rbCA4EdD/v5ReBaYgKwway72n0KIqN52IgtAlrOHyjLzNCv+Sgi9FK3q3QkOFXn3QAbhLunn5UJ94D2JBridhyD70Sfne2DO6kQvNyq7kWZbfU/R+g91UTWRFHqydqY5SZwcAiT3Xjpzjvi4lknr6GIMRBjaQDDKbMwAS1udKLvjyhdNqcncp8q/wCiZt2nwSJDDc7AnHrEDaBgg/KX2WpXhwF0F9JnIzThHHfOZnO/Tv5bZLiDcBUv7Cq6rDCRLYfKtkhl5ubtI0CKKm+LIM/BH8YVH9mWj4M4T3560s4YykbAsVExfJwAIKkqsg01iLre2OW4Zs5H64rF+u4o7vT/fWQ4sXQPyuy9/2Ekz53s6eWWO3jA48utkQXpoELIL2U8tsigULnxNI+dcR/D0MD15l2VWJIXoKA9QtHK2o9bEMmeNXlJVHoIiTPf/C870v54bLSo/pMbWLR5CgvEDrAoAWtZkdKZ5DCwN8CnymS/OLREJPrJ1kEbDRPwY8FGEc0BjsRd/0z2bAUB9CMtYoz2LYDaZnRVrXfWknhIBmBhRXcx3125/0HcvC3gOlO0G3wjNQ/nmg9l6dJfsd81YvlUKwllY6NI6sIJ+Ruv+LvP4JKJis8bx7taEB8GitnNKMoN0A9pQWPnvzwG2EGgr4tvAWA9ufY13qO/U+6KYFrGHXa8RmdoYwnFsJnWI2w4hvSW0ZXNX8pV57JEV/Kie2iakRVsuMYH4Vl5296HlhzGNLVINN+HfQfigwIVKrrDNtTUpc0jx6ePfhOmwkPtOLo0OJ8c2r+wlRJBgzQRn9wU6Lx+b0SQaFK7w4wnjOL//aGCDQnMMD5UnIOhd431bvE2WhDIzbxiUHpyCMPRAS/WcRIdTe2IiZRXiqTTs+pWhn+rKJcxhEmlNsxbNAtlWIMtF9IfXWqt2SYqXIu6l/bveCPLdx0cXtapsAhJr8AhxEPIZVcx9ldckYiLS7EswJSCjACAoEvE/CyLqTEuPqk5Zzlxh3Lcna6n6U/2U5e5DqyUas35C0SQSvgcf025I8d1QBfF2VmD8Cmq8FWnXLjuEv2GPd+0h+Hp9wnoM/5libOcHiFMnFcGpvEWsOtgV97EYzUImVSbj+vvPv11hLaMTEO8rGNAxgQ7kRbRNFnqiFXKBe0IR4ObphnrWiWN77LKuCWQd8J6Pjrt7PZBodIksm39L1t4pgV1dQg3LYv64zBRtWlOTHzAjM86VwckrVX7zgWOeszdf+8o0PcXvo/4fbvmdoDm/+AK4X5496LxXsvFyO3l1YpydmM9HRnmTwqj00JtkhOOLUCIOe+ThHQZVYeaOrFbcuceyLGZR56Z8+it2vz6Mp9ozT76dBBRHCAWX+AmAQnVCdFwmjwDY4UhQFcOz42dAxWVxDRM9m16jGH4C+L2mY6E9DB8u7DvmRkFyDT2+SjOAyhen6JDfi070EAqv9QZSwOTdduNWk+5xTCv/B4+2lWuT8368+saQsD5YMSi8zt3XEMLgYlZfqCr5LEArjbXeb8mYmObX62Nppl1lX+zUig0Fkax5JGvJeFm6ZA8qpk1QF+w4eWABHYAjScC2qfVb3bN30oy1Ck4Y89H2dvz5Rss4D/O88MLK6m9y7h8dTMou5+3dOn3NzqD5zesVUtDQjRLv8debcPjgR7E/9Fp5mt03BbSWrvcGyf2n4+pngzM850kaFgeZELsngZPQhVYUQKt6ihEyV5MwESKtlaw6kvY9eETKXo/12nEv42vuCDjTdN7KTI5DEv2SFk5+RwE+ySCQsqXg8U90PCEliqRaWt9CcH77uqol9YZSRN6Kyk3ib3krBl55wq23GujFDsNUcuIdgueytAm49Z6CtrYPYg5o/FUtOPJWih/eaYWT5i4O9FhctVZZhf3LhWndAPeIofmzvUqaSMB1b7FqVpQvNQ5+ntRqkrdglRadNlqjnOyT0DWvW1WnMp2Bf+Elzsl2NekLRAavkf3ZGzWbH2bU+ZTNJXesPucKoaAph2ih/XDe6qP0N7xw3LKf/ugvSQGMFWufRhXDK1NdtzHBi71OimiTGwKJDiYueqP7oPwyS7P2KAxOtCXPeDlN2QPGz6/oZTCsB/9cUR1ss6uBUYPJBg5y/Zo0wh3Ls0j76v0XBml+/3pfYTi4fcZeRJ8RcQJC6P5BD5scC4yK1YUUNLoT02TcOklYqWWYE5TBLadsCn2eertuZcpznC8SqoHYWkMnP5/FrHjeRsPxZfX8hxxI/rbuNGf1/Ik8trppjiqvyoN2u3bMWXSE77uWhRAbRitkwlKpQiXd22hjOYsG9x8UC8JR1ErtTQH0p0PsFE+JYuLhFE/WX/V3nmfnjt6h7YrZbUIhiCspAMHHR6+vCzkQbh3ZCvjWzr9rFqUS5l9o0uh7LC+d4ZEUS5fnFYdxFJ4olARBI9bHTEgBoH3siqlEzGaqlGmKiDNtn7wXiXwbLgrN7MXH09EVXoHl32dC63+bBAgFQkp/RgyD+skkbcUjR9LBIFvAnQZ40vZC0QFnGh0hhh/I+qhxP+r6HlpnZDRI7K1uhVMx0OgN1Bi5oL8rs7z1AGFkakbsyu1gLNDEETsWIe0Aw+5B97MsH2FwgKltlPfDrpS0f96ukodjGMxSbSaKNJTKptR8ZBHuZgprxaJGVlK7mCjGfmo8p9a5Ky9AqKe/nSEoI+1gAe0CfILXmIhMk5bO2Wr2qEIuBcgRw2Gce8hFSKDgdPKCZZm0J2lFRvdmGDKbrrL9ruJtGzVTHLaTINgG37UJBtEyOue+VwR9IadSQGGBOoacf/msuCTEo9msN/VKeGQcOkj48Ozhm8OXTCXpZEQwcZ64QkIUgpLJREBjacFo98IKhVRawDsUX25x/b2ClKKaXLnfSAv6cAUXh02ejY7kE70p8HfCFyBuGxwCPsrB1OU8jq/ifnLjYxk1+nN7CKwDIiSrGp2oR4dO/HfjUf6J7eEGp8lQ8sSxQNwCV6nNJmhZPleKTrlKC1cJV9CaiukUza9vlC6EvB6V6GRRYSoFpou7B5LMcjLMNintUvoI4tZk0BBM3J8rIdZG1yIf8Swk2mt71xlmIE8nvHbYEWmi9+W0jPzx+1KQ2k/eUQ877roBqzMCdgY9qyDsNtulsOJQb7ePtUpF3+uvIXNm8eE4UMqXXPkDkXWTfJIFvz0NZs6oyzqMMuBB7CDR5QlwkWooQEW5WAS2oXBf9LoKv0UgiKOkhRlT73LjJJsMQyb7KAqgqb/S4OJ/nRgq8ck9caLpT9qEv8NDJrhmeN+zmbBSAbPpdPRJ04Z0QaJ4aGWNS2eyE0YlXxPlMCI973STTIY19493E4jBSPTomG/Hv1RteYjakUG8XeWH5HpzY0ro/UfZrTpGXuJvg+V+NGl7UWqJQ83JlvtEzFXKyIvmY3wna0JBd8KOLac9uQgdFiGankkbVF9T5H8+ll1D85a+a4GnvKtYoAQ9ZJ082bHzsE7PxS6H3fgmzF0weflUccqrbjzUSp9ccH4Z2OFa2PvWchZ6splu2eWXsHLOZQMGH6xDlm03Ukse7XoG79y16hAMMIZC8W2BCoYIyP16N8gO3HRuHESq6AMdeS70kKX6MascxkUkF3BLhA9Ivrlii7rhWeD4ybuoft/0vmFCjDA/V4dIHrgKHLczBZ0RxBII2cuMWt8QmnCqq3hd6u8FXy5+qDHoUqXpgzLDWdhMSaMBWfyFgpz0qg+JTSkpDwK/Z47UEzt4M3k5gOA66Fi12wUYADdz0rz3ITWyPv0MzH0KRYw3nS32AaUWpVlh1oI/NK1xeCF0CBe/fauKJCCszAz6YOryPliQLmssJy89s+hu+pbmYKZU5GSF9eaXPnDjAhyspK55XAxPdq7/LPSW8EmfPzj0lG8fgd5sPNmG3NPCvApLi4ADPD/Cf+g/qiKuDpk+nOP9mhJSsGa8xrt3RIFta86fTWw7gPnaq5/178jO+thPEZyRWw/G+YGOcyPxVOJqRjzsxuvvV2lgXu3+SxEw2PdgaKCNXR4SeaBEHtCY16iJOYeR78bKqTw+N57S7YiNAchm4pbv4/Lt/GGqavO9rAYCFHM7L81nMuJn2Kcdp/R7LrH8gvbVolrEvWogRvbcf8rR1ODPpBibt0j0KIcg6kFeSh9hZtwoqZCc+v9zs0J4j2V82GJDtRC/04NRSsuGe2JjneekZCj8WFv4suLItd8lmQcrYuVD9/jH8/58vMoarRZjhHHQzTW2J0COKgs0jpSSZL8kFRgL5XzkpPAC2okWmUDeNIqMQMVv9M14lD46FpP1gYPrb4IReKdG5p58CrIiRTO65ltqKmYr8ZAi4h94TQGeP3B/qJEvbCvT5271C7zk7X89Pr/7iztKaLJZnnkOaYKp6/zDDha58YhNd0TYGmFwgJve9ygWwnZph5TC28G4nsCP8LQO3bGzGA0h8mjcQ2CFestV1IR1eYMl9KLguMYB3fIcg/1vERBbFqQNEUnM9KXLkPixV9S3Dm48A+oo66xyK0DrklEB0blQSbJHsMgJ4ExACIA65E0hcibfyJY6+gBqKLkY9NPiu56BCPAi/fMjZW30bSGB04R3gAqdRTgAjF0m6fPDCj8ftYwiNzb+qZ3tr+63ambJAPaPx6d+7BGWdOPEZDfqIbx72czhq5WCJNKwPjHspSiUd0P/ju/FqxZ9aGd/VtouCss75XoF4FIgxT98PIxmCwqhQUKfTkJqGvNfib9QWIM5qHpQxtCzwn35YJZyL3UgVP5gWyWMDqff6aPlQChWmg6H4ud8MATb2T7WTcYEjQ8WMY2/vFqGDmoSB1RL5I8UKS6WJokCJXPsHNJsI5TU78dAABRcfnGfTeVEsUdW4FTqvQfKdYGnkZgTzo5iCE8sqdLi+LLUhpyYX/hBU3y0/qZRxDBntk5eMQrUKXaUrIx9pB8QYiMIGsF4PPHq/9lHSpRzKk1qK+dR3lMrcGLnN8dOcE28UYBNsuyYl/An+n39Wt+K8hzgp622eCT9pqKVqwdJvrYRJnAlTRkSLSAAlu9fo/AInkDLECXjneV0xxnc9GHA0WdA+AFaH6Hf74xxWwC0aP7K/QH5N9cj3l43jLCDfL+aIG2ZsPjR6CMSloDbm7Z+BIGhipKPH7yoGB+Gq+NdqIziQb8glchNrEQ2NoF3aFLa81qmjL1EnLl0OT2Fav2U/TyIHg6cc2uHDgvNh449iHryJSrL7hTwyP3z6pP3frYrlmHmie+5pDzHsadA4dBaFcx/x5Eg5hz5FaSXuBVfRSkwHBpx2fewZEzYcHAFRayHLlq0GpPtc3gB3eTlkA/acYiO7VoSOkJBVPRrchQaW0aTm9D3JlzqCU7WK1VbvRHsfiQyGMy8cBqzmLGVfiaS1vonIhBpRTN1uGV+BmTHXumo3sy6KRuMXSlCmMvVxpxkFsrIzLgt+d3qJAxNI3dHotN7PaBhUj1DqBpoWc1bpCqJIjD9KEz+vnK/hzEB0gRd/uDe4x+eOb0uktU8frDWV3lfCeWeINgW/Qst2wbwrWHof4wywQ6lCnP3OQg8zPdho5RkjbJA11cy8vgmkaRRxIa6aUomy2opWTuv70d/O1htl4xA3Ybol0eFAOcVzpwrL16BJI3GTWW8DEKNdixiiiEJ+4aN2gkHbP2E7tKukPft7vNW3jvVUC2cPxw3pHX2I0cjsfCvUM8BRMPorzWI1XzrxnHOtrtgk5DhlD1zzgbP+TnJ1PhAZQjzwB8wZrAWxI3puXi/NM2jIlgRNRK16r/G3mScKhiBCUTlSUWDQJoFwGH35Nac4iQM9OOpopSxHO8JZaOYpZP9wvv6t3lGf8bhMleKiZ/iFXvT4/JMnMZb9s77orW65QlwYv0LIw1qzuz/pitIi3HG0Gzm/kgittfwD8xJOcfSBGfIBSBQ3eGOTslNiFkK0m7qEIzBowfmGrMOKgpGpoh+H3CqwWQVp3kia4gPw4hYCT2QhS2Y3VLefS1V3GQrs3UtfHvf7DQA8+Ze1FjWQh1tHGsJolw07y774WaTf1MmitvLOKIB9hNYCWAjjQFe2al6els7OlKE55OsF0Md/ozALLKZfSoQnZu8hTCgNY5ET5uu44lbvleWeokpGhj8Y33Yl96ScX34NYQOyTgmJjeUSxTnyfY+19o0ZwvgPDeF5Di3Kyv3d5H0sOwnlL0ymprYGHEHno/JBdoPDWFrdgLB8grCe/f2wNhLriCjku+qCjq6SOn4MKOD7CclvG8xih2wGumuQI7TteNIxUsLB8xKt0Q/AVPZ9CY5htQXr2ZeSXrVm+CyqqsM+6aYrqss2WhEcNdEmK1GF18Jj+VOvK3tD8CqRw/1WrrrN0Bdlzsp21G/lHd6QerffGixKtbLejkQ1W43OY1t8QfUC25liOVJR6mS60UKB0a+9otL42GIIIvoXe7VU4Y8qpcHWhcIMbKgzfNhqO0KMzsSNfEQcaWGobnAYuAEwQFEyDcFuERGdTvGr0rrywb55WUh8SF3cqc6nTxfLdMQsXwirBYIvXiK7N2axKE8rtYYk6pyuJjlVGZwbYL7+mskVxkmzSo/IPQzul+dmpZV/DRSMgf82TJD8hnd3ZxUDqQGkm+WK8vE4Rf+2zlKWgbZqNjccZd25x1w2rPpVuVJU2/f7A8ZrTXBBusrF6igPo5alQQbz7c79i0yakDQdQ308pEQRDr0BxX/DUxnGy9MrZ165AkLQ9uRXj3rTelKqUcalxQceqQz1SweRKSPDByLm7XHJefI3bRXHfGFWmkr8rrkhAdsqQ4+Ta2q1L1dyRpszpK1nWHbW281JWOU3eoyngdOM7s4CZ56dqI7UmEMmFomlMX1YEzBGl/bMlhxnwFgIHFa8JOV8qDrNLwkKIuPNyYsJG1h3P8rgwTLmSrZ6RG5k3761g85pveMVohNAekjoulMmkXA9bYkN2r5IsPnzfvJc2+7/daqoIhYCc7e+F/ORkP00/cdxxIigteeio9cNJP0hMkSMRB6c9Uosx0Vnu+YOTIzBD5LRFcW50ISsCrrSZNq+6qJSgiOIJn+eadKH/NpIwchhCWQHdDdS3BZNRG/UvWTQ5z9DpS/KjkoqUzUsvv1d0XdKig9jSWyhKAMcrTXeW1mPWVEea3Hmtq3VqGQ/zBBEel20jhfzPwCQw6vLPtRJj2bzUUgFaRMCBuWLRzREH2n532Dq7gR/OVvNb1MTGNRdBsXqUVsPsy0WwwlhTUNEXluf2gi2fsAMSMsYdUOiIhowWtnqgHzA8gIKp7XfRZxdQNN1Mw+BjGsQQOxWLoPPK64I8oyCrVmXZr/xcFeIDoDMXjhdxc+9AjUyEJIOUiEkk+DvhLU1CLobKxZKAVmS9xacwedChvPMneXD6vKV5FwHFh+kHUWkS+2Rs+0f2YdaWLC2oxQdC44/1N7m6aoy/dTCVI1F4D2iQ9XnDraqRRChvscZlFqMig6D+gmUbSaHRHmMXnoK1MSo8IGHwruMpIPaeyMxckixhqji4+NyGk+pjTEBSoeBsUhGBdYY+ETRZyx/bHhjXwVcBEJXnqkNwnxopqCVxPZ1IcycMceoknW2egRtmpOflrOM4zQnGWySjBVIewX5CWWMwCAIuQ+U8NPQZH5FnnIpl7DiCCzoGMNeJ+B4/P2C/Pn3wkDF6ODOUE7C39iwewfCfreUCFN/svr0qrQkiOExoEnNAvwoKLEPraPGFjS102tz98/+ZxVzCec12NaChjqXZunikdvbibva5a3cO4mooaEAUI7GeGGL4qewPZ/qdmKQmqsr1E+OB0VSXcRSEHcM7m5KLZXcL/LPEH3siS4DUIsPjhN3O1Hiqjyjxw/tBtYaNPmtx9yQOk89S1RVr3p3UtA1gyU/crrLTuFxLYLE/AEbvmqaAzVmSep1SpUw8MWQxRxHho28rfdvOJZmks1w8xduPGQiu/3/Q2WBVBI5nIWMR8phCPS9oZu7rgVO11UkqudstviV509aa8+R+vixj1b/VrofZ0aAtAzuDT0TuB7cqoXXSGPSjS6qoRM1lxgJqpm/4KTTCg68OMDQjT76qWRriK0+UDmfW/evlJvUgCxFe+lOVvT0krB83SdeDXECiYdJ8PKiDBlCdWIghIbdWttNWSiPFssjhk10raRJYTG4KvtcsiLHuaSJZlI5jSi8ZQ+ulslFfLnSQ0TCuepxz5qxSn2ga8/zQWVAAuiRd0hMaxS28w6wrmOW8umkDCEB4OmuLg+YMgWM4P6lMHLfWbMmFp8bwXV/faQdV1n0pG5al78vZD7O6dm9eDpjUTTh07ZeF0cZAJfX2jhQ4NhYjiiVGlG+4cznjgUwivqA2UtmAfMMYI4YvcMJdbahrv0RMB8uJXdpXlBmpBTDeM1gq3StTPwol9QRvlXGjnsBC7+Rfv/lAXroPg/mI+7nkpfBqYyxTulzr3tEUaHSPLG5v8AKUF4irDUqM388+kvtikU4For8TQCItavHzkoJGyI3VnyMRcB8UwwC30aAzURyUHmw4NLQvbFWKOYr3xWzpLJxocgTPJT10hlFuKs8sKTw7MqQ1FepaA0CLVvnQtupTUqlrTprdLDfchqkAuDOI8XZV4gWqPqlkB/6KjmSTH6MJz2cLVf+/ecnqYUgthKYZ2CSBfCqCg/Riai6fcG3c8JdRZ4ky/vMyNPkd4WUJlLQM5XvJOPHyPYJ2/f4V2b/bywkBNLxpeZBreHjs0kgdbkZPfeVJ+MIfdpA6d118wRhzb5g9QEZ/Nt8TbdDnbj8Um5Dluox5L1/r0KMLAQ7xTGJ0HyxZc8vc3usRcMSESEEx4EUcq0vzhnjuQRmiQRr5KR3D8Zwm8uXPCf77DppX9pX4ww/j3syMf+mhASiAkOmhu8Tm2IiKP2gT7fUBXM0/G0wsvtmu9GYSr9YbKpb4EYx+5pEEz89pNS5PaSOJ5GeLKMuEzmT9OfdBWzOtKKo7tRYL+TibJvpfiifpf0X5Eii7V4ilZ70o653DYju7UvNU9q3FKtUmzUubM5zp3CqKqEPOsilWoZJAx4IDreTMI/H0mCDnsavGTOYyqMDKwhXGi5P84R3wGV+6lxAAnXqzPPhnH7wz15Y8u8PZhy1wvtoay3tgwvI9jG0JJD5UbMtkfAv+xG8us+LhCb8W/N46pokc8lhG9uDIc5wXHV04vJvZNziK3izOP3u6oTxdxa0CVVWs/fgwI/yqPDUsMmySo/pKDqBhhtDRLMSH/xrDNL3zg7f6U2V0UYUhykna7HBDkujH0u542M1LvRQXMvX33rmKXaxbfAYkCT7Wunq5M6IfYzLsKWrNB7t5NKL+RNIifFUmDwNBylare7x8g/26AdeaxV7cse1oTIQMGe5HiYqatn91hEghCb5H1fEwDLHItze+McsmTKmhfDgxPxlIRbVH1xRPR4ZXti2qdPmL9/uLB36kZ/7ymHxDElgWGqfi4rR7iSziTYqYxezwGBao4vYO5IxySKx70ahxUiTyVfQLYX2ExrXIJOoFCwaz6e8gASZSKZggFefzUL3jWlzvZmzHURSpqj/y0G2aROsB/dxGMaqPe/Gin6ULE4vlEpUf6vVsCZ4fe2zlzegvN1ewcWGUltJaj3VHeX9krPm03zpjKML2c8BAjU0LaVPs9AwPfl2yb35fZW5qYGKiwCjKvTYl3htBLrEpIzcaMVzX3gGZAP0qrOs0R4o1fJCzxGOOINWt/rHmDGObpMifhmYpfqntwQYgZsR5j/BDBVlEj8KQLdTpxg/L+Y0Dm/OH6hklY+Fhwramjw4DrAiWR2WV61sGHZ0kh+v19UqdolwNp07QiblBEyEAx81SFfDMdwXxuKU+5U6KSTcMRyTRVOHUAVqB4vQVTzvy1o0C7U0TZDYWJYXWzVupTT6AH1gw9xVL+eUxwot/tb7X0I2tNnGe32WnZZeauvI4xirStgJ/u2ukPaECn3WxM4IahdNmuswKXntPFrnSIV8H9UpooUaK4c9gASKtKg/UI/+TqT/gVea8ONbWeXX2Gju2LDrtXHyfbCdkq8oAb9//9RYxmyj1biMRn+25/2HsAYFYntqgFxcA/37by6/6sjLrcO+4oAyj+mYj3FTwA2yoAnHWfavXvyUQZp0yQtvd8fXJaagS2eIBBhxUDkNRWZp5tAm4iU3kW6Be6NnlMh4n+zVOX+TziR9TSPwlOr+lMsbEgYZvU1jOogCH8bjPJ4hQVEO44X8nsSPdLAW6Cjycvv1zbk4A+asokynx4olsRnoYIEscvMeliwRfbi2sSEmuhuGW2k12/Vm15T4IKKqIh1bFJCH55zJAw0uKWw1YWUUDSGdjbY/i/R7cdxRyq7CL56PhCMeotWAH8bz5UNWh062lzyrbViau2ChDQHM5NLpI3Tdke4lBb5pYSkFNbw6oAwGrAaaVNPnURwMIKc3+M82QlvNuhrx50LeUf0pQNXpQ5uwzA4iuQI5fhQhnRhXdd8wAdAVS/eizGuXzNScO4o5BWx5D1lpTGFzs7TIe81JwC5fEyCax6wV//JYBNTEF2mu0vLEYZec1eTrWxmhQ7wIq+8PtOMgZwj+vSG3o1v+SCig1IyG70Ugu8ugHLGnCqAjRiUUFFNr7kGBEF4IM/QonSu78wBwn4SOXN+sX9qw1/yFJLCvKJAjGCN1S31v8XY4SBe6ri3Tl/y7lkdTsBMjy4kEg8a00UXLTexC4IW+9l/jlHRutTYztZs1i6snEOQCDDZzy7WiushsgpsGg6oTsuNJdFttRKTfDED7vjU3t6eKEE6BI0W+vCbh0ig7cXq8WReNlcC+/h/N8mWdHSBcy7j8av6WyxXsSwW88eZlnW+7RqTPYkH4NhKdDXS41yNLbZnb4ywhKDYYItAMOkkdnHm55eDgCLcULwTogL9iaalJX23M7pUZ+YOq+09fYh+cR++lcBn3H8AREJfWnChN0TCXmYBP695jgQlEfTFlnOcuXU3ANjbRaejWBrFVUqAtzFfwAqaTTnVarQDkCVuA6tZi6kaDkFzG7M6lDwcld0FoNzusMvoBi8RMLxjArryc9d4+2mmaMCqimyk3Ob6qvyi1fX2itmR/sVjG9lpVxAjlRqXcgfv4zpj0DVqyjsJDCJWovYqkA+Qs4HATXJwZuYEyLnFipZ5EiFEStdhALPU6ZOiADLGEL7rimW8QWp6fCod/c1pme36DUg3fGYBJIoULNfkLBw9es2E7s63f9BL9YQ5LcjefC5AXqnfCWu76+M+PMmpmtP5j/RUbb5IqRWanFia5jvi71p7xyX8GRvCFJUqqDTyKL3OB/z2JZAhE3yiBtBukz598uwi8fj6k1uzUaVrteqy6NJWa+FCFRCwTTpcENWsNegxVNdvuPKUOQfbA8Vss6BIb+GkF6L63zjVM/e8Mc437jLpDzBlp3rBHWFXW/ZPs1+zY8IfWjx8C2EqnTtC7jKJDFWFkRRfrfHD2M+g+tIJMIH8eJdxBswncAZf/VJlpD4lJVU9WfjInQcWGPOxG7tIObZsMNffpOGTtyVjo+oGB9gC6Ad/u3ifLPwKsOFnqz1QMLS0SdlZgJBXIPEjx49B4w1STmsjB0r0VLUQYHvuKLOHbcUiCn3ZMin+SoGi8KCOAQZs0+POV8INwiWkAsGLtmnzINyM4G9J8yTevp5tmTr4pWfVU6twKsbPHHDPygBbx19d9E2Mwvbq//fDc4g7tNWkAfTmYB1zBUpiiPXbsE/uNSf0djIc2CaPOGl+XHuDqkB5AUAHeZDQRjzgLT6SdDdIREgKWMChJho9N+BkPXwo8/527Z4DJtPPG/JRTvJAjPrB8KhHswRCIJ42bC64mGa9GL5yK9cT35eeMHfxi2SUcjKvIPvTBt2oEIcTAV64gkhKCJCliMgeWz8mb2PjMwpk+X9oMG4611HRxMGupzya+hnqrgZMEjS00+0yaEyAzWcopd99q3CF6/Zdqm/ALgdQp9tdkdy4EyC1N+LDl4FL6Z0iaksmzw/sxhwGZGUOftbDU/TMdOHoLRZrgsjUh4Zp6Cf2l0i3GOuHmaLiA0iUH6xU9PXh6JSqVtQ6hwpF8LcH9VcjxwaCHmUD0De9nJiylT/BX/jjnfFKLmLHyca6sHexzV42mBvoSWuJahlmYm5nIXY/so0qNZyit2+rb50FktyahdQdsHDrpHF6w5IYuylISpOEsx1SzvuwRjvSk1pyfUC89/MX75CQ5+JXhEvAEgwe5AVVmuUFGKhqbFPgWhO2K5Yl16QBXf8n1kN5VQDTfbzpSyeAXFqleeuGY8qaVKkmN8p9MSPPYoL8tRmb+WS0tyMDdcBYK+9naD257Modo9iHKDL94uMbqPFnkVOUMT1INuuQqB3f3omt9Ts11Md7e6B8WrEskJqwkKa64Bu2sJBuMvSS6MOHzuzB0VIH6AaJhueDgUjyCa11S8RTuKCpAmjD9GMswx0QWIn/FUMNnMz0v6zvBzzb6gctzKrZK34wKpC4NBJsHsnzNeNuh5eZXl9bdIPXVEILa3tfMRhUJB7ze/F5lVNkmrPPoxz5r8fLd7GZOjiwUfhYuH656xq5Xb75ZZpPcUB1MThtAzb527ROg1duqWgscz3voFVI/MZmWJ/z0cPXnbf7c2IfjmwkE7J2pqny6KDBNc8dzpo+UXz3KkzIS4TtDzeJQs5endhVkE5ruJzGrPGs+5T17BNgnTSw5GHPtQvxKU5mdlOIzzxll/ixZUGEta4nZKrV+caoWMefP8ydydbMYSgaMxJnmEtQLIea3c+6Ow3ajR86AG88EH7l3VDKCXQXO8ftF//f3Oq2YaXVZ3/563NFlzbnojuGTu7BIyXoDXqNiwjLF/+6DEkwAtR2Wwdn5qzdO4diEehTl93ZE84nwrUTHMmzKHqReFxtKYDLQMrOUWywrbNMGV/x4aUSfHicw0gvvd4nFA3jk5/O8bI1XIj4aLziVDHcGzHQVLpxEgzQpSRjBdSsmv2+mrF2F683Inh2UzbphhIYUbs2SZrp6wO6QQp2S2yibZEcseCU4MgerFuWRz+2lWiFuDZ/zbcoh/D4SgeHKYaaT/IvmWHGFn2dhmuQ9bF/m5QjsWYpsVoj33s22T95sMys/kIHxY3o8BclmEHs0myJLatqiw8EtMjnK86ozanh7A51mWtWlJHv23Lw9eKmI+cdu2SRV1DsHSJ98bhn/En7aZIXJ2nliz5qrVqQM6ARiuRD/jg7I1f0ml8fCq09xWcF34OnS0eqbNYRrDhAgb3otsWpnqWFoFJA9oaJ1Fw5L/0z3sxRUHInDwjePbHivqsKvIC9lrmIX+ozG+f/1a1QpSBMhATpR9rLAvz5q3s1tleRUUOLXBHhAOPwc5CsEK4AYgbqyibupBdhmTvXuIqAICMLKeoUg/T1jbfLrnvgTAnc3Qqb5wEpNYfrXKd/6gMrCtFzukB73K4+UJ4FdRR8wcRAIP15rrGvt9bkwxddO9ojCADExSJMUrZYUT4Ejlu/VJBryjAsbjnGx8F9orCcP4KhMF+DAG5D8GkKO2T/QmC1nFU9whD1io/CiieFaGyWgw45X+axAZjLOwGFPHbiGJZtkXWEIS5RuT2nELO7pTqxAJJWcaKBVAMshiTK1F+5iQYCwUMu3DP7WPIvOJAJpBOfo8A/XPnRVOYsWEIchYV2xAE5axirRGKBVoKdyPbx8qm/PxpwzdtdyDYNwexz6ewAdsI/tJjYDLOX3AvB0NM6VAmah3O/65c/iwCUck4xalJC0/f07eoxZ41VvmPjXb0zoGBA3lxJJrahQB7olVVt/BPPh2bpTxHTVXNWabKKSt2xPCqgGUeXA6656Z4t/ORxUO1zrJg9UPXMOMZQVbrwWeFE4VSKmuBnYcqqxRCmyhj9Q9VAzelmfpB8cBN8wW0gKfcGkFB0t9EGuH0LdjXeU4b4Z4z09k+2f5A+Zosofh0SDN9UKVNZ48G6AXCnhSI++1jNqUYjunm0i87Deq0T4yNjne+aXtWni32Aix6Am/nst6R4BFNMeG8GPfLJ0fo6Cbu0wrzIIaTW/cU0g3CJ6gmP9zZMbFKzNhckgIkxcTPhJYGWFjAYgRdTXiDxlt7o6xyfBbb8MhBpIwTfKvLkoFBazFottRUVIgL5bt/6EFmTOxaPEmW+HGVDbI/erEqXjreDvmGvbfyEWGbSCZ4CMAdzo6JmI8aUhrEWC04bdFlVztRl/bqr8i3XHBcO0lG+VKceYKTv8fvM1Xp+bqXh3ttBACi694cRENKlML7SuvOrljmzThNRm8i0wKjybOrb69cIDlO3GbDFKcWWAqpYnmmDB0usMcoi/7A+4dXbqxaz8zQCijhNaGM+87Su6MGD3k8yYLgDmCQVaJLyIiPCN3oAuf3MRpjq2SUrVu03q6uNPTW9V5pBHOpPeAMqMu6tIO6y+FQirKxQRij8Ua0BEh7PLRhgEXOz2mOFtc5BQPhdHDF5yd05pYjzdc9MVIjt7bROoUCd3ecaSwlK7fPo/f+pP8AifDDWV53nugsxysPxT+OLyFCa0V6Y++HAp+B4E/gtxn7We9jOJEsl3UXLsMbKZ04wHqvJzbLUdqHAkR3dKLW+t1pzbDBLPGmirVC9FN/NZgnITP7LWmt7JgMOAfnC0Hypq58zqugqAAyKdyeKlu3ox684RXLc6/QkgxvAcecZv9uCtMsibBZSWDNuUc7fBr0h0+ENEGdy5t0Hvr003uSUmj++VMhZdKoRiMS7XrmtMzI0m84N6/o6uLl5wtW95xJaY1bqfZYpWs8jJ1/d4vztjWj2IsYrAoj438yYYhr8eFrJoVPUKMKLUX9dPDtboMPu9AmE8lwC2IVx1Q4crXTej/RHo5HPT7sfkB81yZXTAYzuDaDzEryk6KzYNhn55dmAIY4TbQvvzzNiqfe6xhUr/RCH3eC62v8pAlko2A0sbUW9hoEIK2tov6ZhgKhWiMQd0CG4/Y/3XWx80Vi4aZKs0lj++/qhOo8Vavo57cOFnzyQjxUj1w7fTlX0wYTIbRbYJTh8r3XCKc2NyhDf8ff+c5GSdtoRuHTeS+OOmynhCb1t7WRAnHxcf+TNnvk2EITjkZrWNMFKBDm1nPf4rit1AFm/21VJJNCC+024jugp+0WDJmxxAq/rBUwFVv1qJHuoJsxRrAqUIVwDGih6JD+GiZRMjh4QB1kbc2aGCS46Uwg5KCACy4Cer9sgJ9sw1QjPYxe5dnMWL9/3aoMy22L5D983wu7/Ba2Nwm/ia7JQHJF6WOcbzuMxU2fj4tIdSgFAiqfRM/PMvCs60SJH0ELzVavbCIlXHYotTDkz1ndx2RJCk/b/l8JP+9nrREzhUS8eEVQItmVw/l6DOMyA4fwbx+e1zl62rQWG/ipVh/9aLEqjj19LMVeSJmmkv7ECbiYVOwPOigVmXd2QeSmSDxsapjf/7GxO1s5HLmJRI2dkacgFblBhGNBdnE7YB6pdcJYsTyE5GtUtSEtTTweOK9saqbv0z0L/OZK+/5qC4q2+2FuxhQ9IhWbWGP18rJGz6bfxlfi+uG/97LYvLxllRexcMY1WJFqpnHLnJssLMrSHw83WIoArrfTBPXKXFbpnlpzgNQgVswf3IQY0V5WXtZMunoPh7FAfCLWoNLK0tics155ZuHxreKWDQU63GLEFFZLVaeg4GHxM4VrPVwVf2PTjYEj4Co9vVG12zseh6M62Q3SpEWpF4rivRv+dHU9fzgRUDw3QYNyn/bFArI6fXTNFOM1+2hqjVW056frrqH72RrguSoN27yMYKJtTVMASyb5jqShNrjKreHr8VDLaFRVBYf5gT9obQ1g6mr2SJo+T2Tapx5aKb005MfJkwYZEg8iqXSfEkY1z80s8oj3kp7ja3RAFfEGea0so16tXdgaK/BJPEMjD2JZzpXSzHHl8S/1KsAiZz4BRgUioONGGhAOzT5WnaNoCBF/gcs89TWj4Ne12kd4meJEHCph6VLapUqTfkCtK9iSrMnOwDByXG6piW1J4kr7IBiYNiR97xWANrma5KFTc+TQcepUJF6uRQStPC23lNQpw8Za8zK3MmrsLxrGKh0oI9QeEXWjbF6504XLnoPcSFoFe4LIl9VsS39y4R3CzYWx7WnP/XgxSPTS05jGzfrRMsPyau9XWuqxbHSTOUC4msB74OaoRP/2OoSxJfPr1ZmIpRUuu9qsWaXcU0U4RgzxahHx9G4WHWDhFd+00okrHhTRE3nRbcfsyV6XVEPmR2Dfs4EGb+Ny8GX64FER+/Rd8HLdAAxP3lvHpTH2gI2ObdBwIjkLAfLH0iAjEf/jIvyzwHquncjY3a+03magHxsaSsCnF6rFjBWRleGY8nVHtSQ5XQoTJhY8RI4gjKbZLkHN/vsmABfwaU+Idw2xwevz8y6em/4fBa3kpJTT6QzS6z54Q+spPLGifazVt8sIsP1Ueo5Y7gU0gAHtqpaTvaeaPMvOrcsTAPtqprn2luBn6Ukl7unFCLsUrj1IFEiT43dinVs22DkYAkQCZJpVhtSOJoC/TaIdEI8vyx5zRZOW7d7ZGcLHAsC2OqejIhkgIYunyuk2pLxzKNyCoyQZNBXlaKAl0Kh4gmSvQ5zVctAdJ2gm4ZQUekstblbtJEBW2CAgHu1StWuxWdSYA31H2W54DGbZTiDCjm3NFYRWNM0hHNGue9B4yfdAisIMT/zr/0/c7io0HK157TOEyws4mgyddzDXfKZKUosWp0sfLGHUsqal5faEhRwa5WXSDz6KDsrEDl9+xbee3XalhWYFifyf7h+qfqpGTPSZhSe7e1/oJ3tRMA83EfF/8TFP8Ow0tT2nVgVN/XK9aBc5aeNJgxMbXDqW5d2iG1U6awGHmUOTFFowi2HRmXa/6mqW5/pVOWmI5/bhqV3k8F1VZnnsQZVf1mj9jcPLruo8hCzLWF89tEks0DN96tnlSR2+n97vLNDqohPtk62iDWYL/5iZzKKhgKOvlAsyvl+ioTWd/nizgMGiFuHjT1cE37CSffGqVv6U7ah6Vn2jfAbPT/p9Q8mNIS4Q+3jSynt2RgTZ8/fQsAlTgTtnXvY5NVHqH9UHS4wMHRn9rNciXGwdEu0nLzOXi1RHvtozt/D4fUbpYdAMbz0qH2QWh4TC8G+PXj2+hYfTR+NFZrqOPUtqQ7PJuRSmST/+bI8Lj2hxC7S6wkjIYLA7sMbidvjg4cMTZlGHHqLNOey6ptBsL+IkoIk+2yVqCaz35jkExoa817iJCSZh/L9AjrML0nNFPDd3PyHIry3gZ7adkcpf5sZ8mrur53WEvBy+kDJH8d5SouHfXdJrJQmN1Y3zaWFX5wZD3K2B/9mGaW7UPw1dcspjqXrQzoO9jzCu5ezK+4FjfP10+OvTwY5qNw++4uH5JE93WP52Vj3aTd0PqaRA9+WMMUcvp1B/sjebZP0yWhiTBo5H0SMwTMwnDCP3/JY2FemhW5tIeBdK0QRy/hKIx7UWOSsfK/2s09IX5mgBYfW0lUDTRNIs6/u6DgKhgg5mDDxCf6f0ycMSA4QDfmOGC+wpUzTuAHhDM2IrIl65UGvPvqCgKj78fzF/pQgjea5y+c4wxmzYHdomMUHO6ty8FnYToYXhnqS6Wot6ZSKv9skti+XrHhtUBur9oR61zn5CViESC3RHYbsOoLB65KywA2yeowWEt/DqA36zKGoMRbE+CuS+JyqspiYaQdHCzKcRJhXnIzv9+DLRv2dY1iqptu+zZVta2srppsKRYk97dlqx8a4QnaEDk3L/5xIhpqFLGlAYtv2ysxCUlslMryxo9JskczmRyQI5HjNnHDSzBnmLE/sZ7VDutZh3C6xpSmUIPHnbuoNCCFGOCqmUM8My1/Qo7L3OXUrloE4Ic9F1FAV2aKMrAtSjTeKcHFqIqpM1m2MKHG1+t/MML2y/egXTAO2Bst5F+OZeh9KW6pD4V/7/5mlNxlCVIs701DtjYC5sx6fcgYAroa3snhJYSbnNAuQ4IXm9obqC3EdMLzXz4ECTREn37ivom5gCFotZqLcDwr+SHazfFu8E+LaK9bleAjeWyHFdjBRvE3Mg4pyeb6Y2rCpYV9fH1PYORsltZFye4ebuer2BMK5+1ENzh0KXFYDShBhc9j4OalnJcZ6ycJ3EI2DRynV7g9fVHb5zRpt4GdiL/f8YrOZphdf/Zp8mCT3RoMXYCddpFZBtXde9x6czITd5RqT+bQqjHdbbMLTsOiAZzXwrNVVzCbQvb82s1KsebbDat0pb4jhlO6R5MmneW3RT2HRHOE8nBwVZ/33/PVKrd84iTNAqJ0dDnB79BkTAF7lbe7lswGe4fWkaDla+dD3GzjvKVztenccZXcjosd+aAAHZENcH7f/AUy+Y60vpFqbLZmGV2Ay+zHroPTp+uriZoDE5nOvm/2MSIYbg1Ov+YQUSpVp6bR646oZrdTn2jcq1VbwhfCE+St19mRdp60s2/Dx+tX4jRynAIGR6YV4viJ/aIdgvNMghIE2IacQae/ExyyFpbhUV9FEvTgLPbfZZIOduBUUdNhvIBL6bW4FL4JVkMQ/5F/qv10QOtrGaf1a8/CXL06B4F98tZs+d8CcE99tR0MB7c0QCb832Y1YCT4nHqVDDGxVUBo2WbpKy1mAms/6S0QEhHa2D5eFHLS7d580lqjtwykqqYoygBZ4/TUFsYGjfshGtyYetrNrWM9jBcuVZBq0aNtuJnQeT6wlH6esbfehfedhFWyMvi0D1YYNEtwBH7HSiBHXhqM6GrT/Z/dcsoBdMYg5y+yJW2YDhLc1HqgI/NsLGA0Y+1efaE3a4i4Hz4t4NDJ/GAIHmQMKEExbmlM3fvggpiJ9rtCVO4V5+hRCb8PfC7i4+C7vg4Yy7/bDlFqaYQelgCXvAUUZT9bjNOXh57QKB84u6djYMv8D9J9IvTXKDhQp89Q3y7yVA1nKh2idF3px8zWUIf/libSGyWLj/Medx7evT1w2Wyzr2tSBnpS9pBZNCX71QPqYVKwW1tNV/XR6+BobWLLa2LYLsS+BXL9ygzGW3nibo9t2F4CPUOn5bbtmymkbY+4yID+KsTevx5gS5Kwxi/wCmP24mshbPHsU6ZVNIEV0Li/LgpSXNde2kDRafHEF6dccpjbLdU2sZZdAloihQ/JSmSY+98XsKgpPmjCUqpFofK8SZlnx+jbTZhthMj1IR8O75SwD+yILxfuaT3AqMniL1wdGKOyH2h6gT3eqGG4im6EXUW1cGLXku4w6zE6ac+w6fbjTeLzJ+3SP/EH0lExEKMyB0e8pxi5vslvn/fIktQavsPb2Nm6CcMZmusaGcdjUL3+1WwNowstMbhANAEoI9wPRJF8IDTsQqnvpFSgMcXK4iEB9ThF2GJBrEMr8pu1ortmnbP2Zi0GnS4pnsa60KHORo3N51u/Y6qgLKIy1ZTlAO87KUInW7BU04mujdwcNaIywCIY8EBDWtF3nOS+wNdZU8w4DDLTa5ZVZgQk+Kx5Pin6l+E0+EYO7gIzqC4Tk9HH0JRmKf+Vo43VucqA49lEwXwhcSWC3deZIq0h0C8rV3ZrrmttAKajIi9YXi09iG3EvVpMxb7unzkoGLgiYtXsRKPDuNPjc8ji16JrHfms4YXLmu5bM3ggrzuwB+DkzrIN/L0RR8iFaxfDUGkEGnFycQC6C7809ukPfvDr70DhHjzvvGpw0it30E5PodZ2TgjJn+ixI+3JAYvMzAtzKuFoVfG943Dghs7DTW8oYR6CWaoznJr/qYKeqnsyiIUlyXZEwCjrwuEueW1Pr9WZr0yltiByLVTA/5wqnmeujul3mo4/9bAFoo6VFwUvBK5SZ1tNDRgU6/tunPCME2JRjZSKUn8cj2s7+lvLJsNMxZacBwPFHcf2GZad+hm5vXRlla7mhK2nxyEX+LX7Q4TfHclS/BSMAutlxEcO6E4Dhh4Gz+OCsrO8Sy9QIToBHMbqwrDV/sFTHzQt5FDQn+rbwyvbzipuL8AOeczuGA2WChvfukEUqLtPgbId8qiVcF73sNayNqnyYL+pH6jvU12+wDljCDbP13YxwjJB7Q4pOKrUMSIIYhAnSGu1gSXnHXpmalbXmm8C+5O5So2ghuB+Iv9fcJzAp8oHhu/KFk3bR1X3aUIsOGY19QtudhEJTxOL2otPpI0mLyBb0BrDTTeiOPqjqkVXbn7SHAX/1iGn8AksRS8aFQEWXxgYAoDMGwc6ZOKVAQmsSckEqriKktQeDF73C6O7L3GFVrBDFdWIAW6RP5A8QS5pXocvgvB0Y813WsHni3ybUgr3mN+Cx3k7++SdFDL8oBKhOFufe80Q+CYQzhX8c2mce6jpbbIrANlUuuQFAdnj1yo2FhnuuqLwTWmROKD7jTXqrM7qXka0RyIzytShD5MizRkfbpuSZQqDyh7CgipWbuI+H7F+OJpew3Yyue8Q4yA9dsUiIYWVEZz4kIHqSCUTggBBkBs6TMWXjEQXSefDA7fIJVGgb3aS3Ao8rmrsInw2QYhzd6oCzeRQZDPO0tiGTzGlhsUna/6FuGk/DsIdsvZWTXS1HyP/FC7IKV0dxd4uvoa0xrlj3P7UAeiz45ZDWYJXuz/24U+BYSEDr7kbx8A923XltQH3gA5ubKWHtI1iVAvSgAnnSzfpHTE+O6gwdViYPrCHWE+Y2Id2u4ZldSOOTzS00cq1Hud4DoYPgIBUwo/w2OuMT+kc4s+p0GOdSAXbepqlpCKWw01KQH0+LiCtHoAceXM86cRZ2wLImH+ht7gwPAZflYO+QPVoZluTYLpcM7ztnpjZm+YTwZQp8UEJBxHO2Y3+doJsJdRhIgaDPgIY1+koiBcQzWmgEhiNQ3ERwSoT3tFkYDrIJh8c0p7D67N0XozP7YEJ0sxCpHlFcjeXlZwgglMonBwu8xAJSchD18txFSDCQDF7J3wCbwDLkzhLmrzPRdAjzXdmd8VigulbWNDdE97o/5bDCH46Y2TyEkzFQkXtf4vpcLYzoHqGk446SQf1PtW/czy0w3uzgtv+5l+2MWKu41hgtgu6n2OBxPD2qEt2Vsva1Lm2gF6ighRzrJBjOPzcgBuunmPf1o5HdPSC/vGy3YrXSXE/zRJT1Lnfgon3nNN0e7Hx4KA1zqmgkB4qr/r8PEGZtjC5lyhuHVwsrmhPPal4/wzJ11xoSyWttNiLYmsBoVZtfjNfn7jS3/rRMC1/oUzDnVhOIyhYE9fyAbN4T2phk+NqL2mdP41DQqER+U6fzNnIyUC3mL8NAfpWx1BUjYnd0hNBbpVx4ggwob/23NY3Kmv9TS61PTaaUqEWzENm+6mqy95E2cXFpk0TshfkK9MAtjyoFgbekYlRHu28VSt1viOdbbnKN0kntfGT/far3K4T8pBZsYlKqw4ngg4nIT3nKsM2XFa5I3kAwTPVVG00YSZX4wmFMbL1wF9CdfPgqV+HBP+N8qu3drGjIHljUw4Y5JynT/rgNF+Wq8Wb7ptSJJDMzPjC1SVHBN2ybWxOgIGejRnNhsUWg/QaatxA1EuUYh3zMPFPYTwnX2vIN+L91dvm4zY7J+6Few82TqeSDWIsj7w+l/BTddHMezX5t/V7V0FAvucUVCPi1Z9HfJconaRqMMZFVva7d4nf/nZ8g2R3tKKSsuFWBRQ0HZiwSmBwN5EeSD4S6ZcqnuhBov5VOCunp1Hf0eiyxazP2ICK4MRx15EBEOy/qUpdpIhk/N4EvIHh5VZXbkczFr8z18q/GRLmT0EsjZFczBFbFqZhTFBoiVGg6g6u8vz45SYr+BPlUvv78I9BJx4xva8RQ+8oEWYRYoZY35ovVMdziCRHQT0FifDjIX+/9EZIfy1zHIq3ukIx18HxVLGvxe8jWOacoV3Ky7hOIf0ULTEc2InbEd05navevsGKOKD9J4cPLpFDlMSSI+6Qp4T/lBXPZTlXFk6l7tUedWrxHcvpBfKuKzNZYG4cO6jyHSuj9QTJE5zUpgVaEbO4mnaMH1zsRw3DMGELDOQ081HJU28EdwVvuwo7Ztnl9yREjA0FoGE4gAnZ6L/ZBJjoRgkJzuhDxSFkIQ/PP8Y1ke5tB0GZJboJ0FGrRDRZ2A7Hmz3aJUCA3dnQAFkgDOAisq3EPacBXeWzDOWfWzqW3Lr47IwkE5CqPrkSzV5zgbhcwVlvNWDKALbcY+JY3gYmdO1JdrYxQymeSWWR2jJ+bGZhDdHQDmj/hM/mizOX17XvBRhqodiiKrUzOjpfUAUthx56XPaSOPUYjGmjpI9sa6pbv0AWTX7Co0+fPDaAsjzqTC9AefwbVzTWgftFzQJaJIGw4/xCPZ0Kd6jCyJJ03EdR0pxYWyAxYUGiMX4qbPnTI6NNwt+Jx/lBuB+qlm+T7Uo1qmzHfmcnMU4HZZCcWjYfJvQ/M3V6Q60p7gXAPOlJdu/DPH84bZzw1Dl3dxW38T8c1BNMlTlDxDu+tlAb2MC8fLD8NC29OUsMz2tFtww5booXEbFSv9LOh1KZpFaCCj6zsGK8xldNzO/SOsc0a9QSjfRWVNPjYeGEKxHy2HpMkJm74NZxxUkAY22rlZF+p2nR2Is/+/XdKdcwTW401gYZqrnoTXsXHca5t7wXiOfrxu5+0KJRNeVBuQerCqxiPUxAxwh/nX7POns29oGl2hDCFuKMy9ZxDQb9d4ZKmKZxBrb2a8ZRMkkiojLeJrID6C7yDgLfd2jUqgORyTxX1qGj9g0RozG4cmlkBVx3MG65pXj2QnUsw3sX91+1J3psc8GwBeHSPj6ARCfcS3rZYyfGL9a3+i1g1QSFWc+HbNUlLEOuinXBouojXry0zGud/BIILqT/IdTw+7ZpUZaoiL3ZEZ3pogvZuPf6gPsSYof1S5Hru4DiC/7tLkljHHHmUhMEpe7lpLH7TgDTk5WkJy8Q+dVJSixh5rh+TGD1N2e0+UjW9DJhqT6NoNVYycjgvCDMMSB6N9sBHuiFNLf9LIETNvJhuNr2NIjG+3fH2kdSRrDl7Vq3wl6FJiRYGBzbLPSZ+HqbOXIhMGyHz3Er+sZsF97pAW8irJW0rB1lLsK2C7xH9d7ML0/P53fgcNDA0P7e+aZKXnV/ludMfyACOZkZJW4Yu2NFOBNzuk5qpR18j5aGRku933xeIbyBzT1hS6VIeougW2NKqaFBX+4y86z1VjYsf4ypdJqdZvNRWAPitepqedv92+CMVD1VdfTk6eNFhAYq+2HrMsj23MZT+2nUojoncQVP9SBkd4UIJd2k6tyNU0cTmMHt5NX4DVes9ofCZ6NEeZfEsuGtRDsU9Nq3GE4no599rt0Dh36+ohnuJzvPzYDOQJIlWRCStBrplRWD4tiU0L6IaktwJwmvAdr9L08Om+mQCCIYTU1Q0v9KUFFu0dVo8zfbqFLnuVNp+avvc9JooOk9mPV0b6BgM4+Tk/Iz8xyWjU5Fr1Harzw1V04rJLPM8qtNIL5akox7BS2u+2E2yxZvEQ08XlHLZy+Ikgj6Zuf00fmzTgRU65XOcF2djZHM8NYO+O/f0kEagjtkJRhkP9LSGk9U/rSnsoj4qRX+aO41CNu+c0iJLU6YIvKBBGMiEVt0n1GwAr8ctw9xQgKVcE6KfNjs8IlNOhWnnNyDcQdW9KKKm3pyzffAF+L1GT+CCaae7uX5EWauG5JvsFym/91uHXk45uNXM9RV0nv+WQ2s1uFvGekBw1Kvm7cJRc+rWH8ue20QXX30BAFq46EdCUma/WmOodooRDtC0UGdYZezofPZyynRXN0tAk8XozYKG/JrvK1WTdWCyXhbL3dajJM9AGrD4OK5urOZ7QNTJOT7kmI9LFccRzGyZJo18UF7UR4rXdHpd956+cSTBEhM3CxNFjz9TmNMV6Nv9DMkbl+AGoB8l372Jh2ZWERbOwCaxAaPVzgQJMMuuh3S8etI+rKZ4eExd8j4QnJgrfVc2TMalhOYgjz1x/t4PLYmS8WXA6Sx22e/XpJz10MBkerQqfngguX3OMR9+nHJPvOB7y6PYmQ0sYSZFyGQMgUsc12bDCJd2LiTaxZ5Y/vOtBBaTEC3FFF002NXVj6Fms/fw4+mED+xPifabmJsUoMLyuypEOVP9CJy19HTqUPS3G6jysD0NL7Afr2vGtta6uUXfNYwX3C96JeuN4bdIEyIcAaYiQxVRUugNkDBmSupSqhIjsdqnyxK5kn99DU4GFNIz0L82FXBz6sTYWJCcfgzSYZ7i6dYgPnIJYXbcw61kuToDRpA7+6lIFJ+mid79OSIozjx7v+qLE6dmipdDDBq8/yAbDM6U/w+sM1dkMZqJgI0JsMwe7MNN2SpJudS8qfCLnrcyRtOr025TnqcLYWndMscd3Hxg0dlTlrNb6KMXbdEe3uZicmVuxYbvyDOPLhXEmK+JZv+F0RAkBk9Ex+3NL5zF4WWIMj208K6cisdOfOI+dOuNGSr02c0q0iAx0HwWGcPWAYRQMsuDW/NbTHz6nB35GlwlvH0YYcGwcj/EHxXxF8wg9lsYqfM/K2KQe+V2H0sQLvxgAHRbsykKV9MjMhbBnbTL67pRQHT8furne1Bw5aJQN4VGGHLntpoH9E2CEkpCW0bq/gGbD1TIqzmGUQ/wK9RVgiLNcC3aJy4QdBGELNmujA8IkhJvXN4V02rkHTVG3lweEDq4XVCuhYhOkEBgvQAxkURHdnMdhpVjOf9RUoFjXGQPvQaTrVYyMfAe4KqS6s7cs1k9sPddPVVGlY5n7QtdWMN8BG4p8MJTRjfJusJMQRzaApsyZinWxhB5nQJl7WDR7atSX9kz1lcQmJ1tcv171ztwKjlXdUzWJoETm16vpV5jgLp2PFP5Xklia0PaA3RQdesbZCIvKqqJ5HjMvOU7e+H+kGHUnuLkqxDP+YjW/6CFhcDdX3VF9MkpevQa5FT3Igd8rqo429zULmb53GEkxWhzjeaQrd09VMyrpwOhYS7cpX5mhMCntKtME0TmhbevL53bzAiDDKJI4CrWJXzZsQ5NoUIM5omY6kWYDXgWjkGiPTqovZCpKzTttxZJxHwNGKEfBASkhtFFPhki7W3MyjndH/GzRvPOtACtmqj+4iILcNmcwUBeCraM/QE9ts+5AXGbNylgx1Q/ZwpfNYOV6iPJ6d9opUmY1fJXrWo4fJV/H2CD/5x11ZL3pgzyltLmFDCP7i6K6s2P0iyuJRrbF+M3vUQu233KPZYnYLPQ+RFAIMq5dXXEIxHESPlgIlwLBe5zi9pkuh8h01cShhj833Yxzd1D3QMIeSpGPe448GYgWSp02ylB/c2I1HvOCnF6VFxMErfQ5A+ZgAMCiZucDXmuuUkjcWDtwOkTzrZyN7k/ZpiCTDvUpJ7XA3jPnPQlatiLIdx/7OO/q+828zssQNGmxgrnnYpbTWxGS6EebIjB+8L089svJSrK+Z4+m6a5tfd9Qh00KwQZJW1QjcBkocuxQHhdOk7e+IXnOTYiefVc0hEM0PAgZ+jmLTmVxJTlxXGbsYXiO07coY2dI5Q62Wt7BvSkQDTiycK7lVVkZQ1ILBVIgRVS3L/cmOvmnGhLtlYW6KhKz+77Nv7FjQCivTNY5TAivvvm3qapz8Q+Piam0a1QMIxEdbEorppM8b4d4U9kh0XJ15zDfmefPXOdEDiD2AIH7rpSYomUjdJ8pKVg3VsDE6s7ycG3LqxYILd4A9fcELnVKSszRXhFyhVQ9g25KKJNV7wfeVp6FYCB3FA0HlLLMgtCZHC2J6cCNAOGUaOEMZvno8tySbzDlGJfnHkUVFenuu9qOSinzd5qJCbj7rSPr0BieFO1iN7zdrgUr4L5tojZJccTnv9Dw7PLt/dWYkxexei7QWyHla8FDzj4UFuo1UA1z51C3qhI3xZUkAdfD7kVbVLI7Z97J2wsew0I5rejEiuAP9nYvkDe1EcO+WCGApNe7oQMvSRuE3qpbLLLikTUguIwy5gx+t/Ndvh0OTxcRKr2S738BVkjeEjnPkK3dpEIjQz5FuPJEm/v9UqlWbCf7IAcuefmYXmjYv2rkO27wXvMa6IpyigcquOQcHiM3He/h7BnVCD8FLNaQ6UDwO8WsZKXHDY3EQL8yWGN/HhPHs80/Zog+jr3B/TOZby5BmUP0IFHpFm+djvakemsYwJrwsVfRTwnpFsMlix0cREzr3WMmubaphwPlzD8N0WhAf0WiIMTOMSgdncmKWGaJwJ5X8PFid7TwgQ/HPKxifDhFxyci8j/RISegw9GVz95/CVfjekMpd/gDEWOJdnpQK2WwCpbQ22TmoqB5y9Tp7GBZO6lzEMJjhc5meYSaMXTKeX/MFjpobkJPhFw9SIyU2LlomDZVCnn+ucW+/q05Fabq3gdNxwkuAK7qGIu+Ce0hO8AGvOXVXxGhWo6vStHwIEeUnrIQiEJBR0r/ivTV3Zw3iO/9Sc1daj/YIpzWO0klrluDLtwd02YH+Yc0gJykBx325J54irc3aUTowKBm7AYFbF/mrHeX84VHlyHeC/ScYa28d6GolzTEvIBzWuXqyaVTKFgk2d3ZnCKu/dglzymHgldo/5o2dQWUn9VwHlK2/O5MqRj9ghI4CPmW8SNaBQqIJPBTJVPoG/17e63g7jvuGGs6ZvIu24L5a9JDRHOnZqB0Ji3b1nkqLQnl280/k5HDJLcLOg9wNRrlDp+tgOvYXqKfOowgZ0mWReAgnq3rcorZfD1wKwbAwn/onf84sSEdXrvJKUpN9tMfD/q+P120W8yXB0oZH4JrtbPIgaDxY0UUUL/eg3R71B3j73o42OS7Pe8iQoJHCLBRcHWIFryAeQ6+Z4vpaCqiTp41JnVburiE9TdG7xNyGqTU5cEmMDVtIRJ3ZCcPUMpTTXHYlk8Inf0mNeaC0Mr4kctC7J42rlBRvdpiJAqMl9mgIFQuErt/epzylti7IV26o25ul1dM89s98COtXlueeD+fyzSHSFzyCD1LZVPfwCX/JfIzEiVhf3jGnppMavz1bi+RDUebTPZDRGAsGX+1pDQgPAI8Gyxzlgo/6H7n7rx1o/JMU7s/X3Zp/bygNcINyFvQCK4XPEyrQP7A/jeBH/73iiCEI+M2OCa3+uGcVxe7rKmbXWlAP5w9jJDWuIJlOq5fXx2WeXehxZ5019PBZYi98Qony1fvUiX5/JgvqlKwRAkyYnbzLNMdn9VvDpB10c10OnLL7s1FuSDcXB3Hm1VIg1AwqOto0FlIqRyhZE3yRM4j7fBX032nICsZ5Hh9pyq95TTBy6UB2t9w790LgBOq/RkL3S3yyANReQ6AK1ZgneGpSM6s2gENcHVoDQvdoz60efije6SDe5tn8u6cVKxEdMhuupaIZy9mY7DTlu6hTaPmHYMyusGCTXc5MDTJsHwGVcnkwuu+WJtdFxL8GgvIrC7zSrS2eAXPSrM4cJcStG+MFYOd4MqDd98utT015sImVdvY+0BoeWOgCbWi3yHYg9OS7eC+nzw4/YPvzDNrN9+WsvH72TLf+ql/6v3ThSaU5HIdr5/jMpmuXSaWpr7zHqPjo8LKZN0g+a/P5R0lagCYvt8pTC4OLN4WuJKlFcA2JYnkon96LDpJ65QJ8GnhyuxwLsR4rUYjrlGj48rgKm5e1jOZkX7OcpFrofdcaQ66JU2xCwKRuMEvNE83sEa/1w8RPXB63GW/Yu9ZUlzP15oeD7XcUaLpHN+FhlMnKeJ4IDfU+TG96YgO6+H/VK5dkk/AkYFZN07WXSgi/CBZ5n5OFqnGeTNHfaJL6+nI1yapVqcl/loCkqKHKPfLcWOHD1dmn09WcIDHtPdJ2dXPC+c5VlgzDwXBt6OCkY20lXFjyDMh5jZBZZUTFdOJhTgnFMeCb6LZcuxzuM1XqeQnr2cMCye8l9zF53up8Nw6OC+/UlXt5MOLTRxwVWxrfOMq+5WVoo83294ig8ID7CKXpozXy0AP1vOngQlRK8cqXGCY1vL85pkaa4SCObKuS3KgyPeSLRGMXFhQV/mbskyseeGnyf2jRS6Y0baWuC/scVBkFrjGmVTVRI9N19wuP0cS/f4Yyd8SS9fpjC0nozUWmuJUe0ljoF5ayMJpfkdX87qnK5gDDkz7hyijxC0rXilAFaS20ec6IKJL+MrgBA7NNSSpSbSsSG2uGUYyTl+jknRkFXnvovsDEB2J9dXEUx7iNhMBwk3I22Eg7R6d3O61LKJZU6ypObAX2DbeA6h2lTBHe7bkiYFxUvSkPj4fCiOK95w8ZE9jKtCk0oy7HlxqTi6JE+xRhaQOmS0nEFlZ6TelzUiTpGu1r2uuymTjkdIIQv0doQwm7jZcIbC9gRfcQzr0yI7ZpZpWDoN9BhSa6OwM5nEOKhPCx7wnWB9i7N2YEol/yMKWmhJv3L1bfhDhVvcpBytk3AjmUksNg5KgCIzV2egkQ78JCCJaePcNjG5JpQrxQuYGPdl6GK8TlvoBX7zVsegO9mzSeF1RJn4B9mw0yGg94Ag0OijxKBvDMxw6vtvtL8hXEHmxOQPTLuAyAHkQNpLW1P5fhBFw/97ma7vQp0oBxFep60PennQPn0hWfdmQKoR8XDdBUee9GDpbuAYBisMi0sGAaJWBxQ0ULW00c278OqNTvattDDiq/L97/hfHfAWdu8ZKJb2cwEbRc+Jkm/VVWh85lj30il15Msy5OBa7XE6Hi/+5+fkugWQm+4h641dbfPGxoYmrbDx1B+7/O4IP4L3Te9IYb5XkZzd7c8sK3M0mgnp8jZteZF7NRIJawaNKWCz8sQa5O3OHcCML5Ff3tNMMSi4nxxenGTQFHUuxS1HVu9I5MEJ7qXnZ++uCbnFooF2pz+Zf/ANClxOyh3/SH/97TJL9Cyjz+rBDsALRZYV03KN1BrqSlDrYg6+iprTjOv9GflvB2jNleRvB32bpyWChFDR+Ua3mhxAsyStJizD/ojHz5TPecy3JUl33F3+hpj3XanUJdl/8QM1zo37wmzfT3yvvmQhEpOch/yQAsptnUYEAHseLSnN2igIUK7DGEM6T1O05tUlAjcOOaFY0bE7l/6W3Ob1RulVrCAdqtOVYB7+fpuRQymKHKmfeJbFIugp0rLsYrUVYsFl3uABvuSXvJb8WGNC9xvAEEKM1vhFnDVDxu38Nv71KD7bubk99YGbnO28u6ubX4qSl6y1zPPOEIf51qWrrY9TDXcnQRKPKJwhBhU/VmhBoo8ffIBBffsnuoi3Y++XwPcQ36vBpLbX2ey/yhnQg0W28nXfUFWyHp/wVNRScRmuBBaqshHzFhOFKIg46HTNQ00o+qJpbmjDdAww20/155YoZXj8jU5Xgpflrwfoj7DnAXy72nx8pZjuTNPT+TEefhXi5KTqEWuxTVbqGZrjVA6g9ZdkfdCYWijmYAV6EFaaBLdFgfzs3CVKzKHcH+DTyhY9EIOWlgoLyZDMYsiy9lZcAqeLpiAxTvpbt8/RlQlxRUMZv3YriybbndPqVDxIMeo6al2GvcPCRZk6O3UDrQzznpwkmexIawZnCdeTxgUdVU5uf0c2hkwVHtyYZbI77l1Fwn4vgx0GwtHDgW747VwkQOMFNfq7X4JEx7kLguv4BOIBiU++bcJbVaFYmCzi1ix2EFnFzlHhf7RZdXG9ojVs7b5SK6498Zqb4P62mQc066XdFjB7mhwBNH7U49U6uPj1WfGqHVKuBtg59pCH9LQPp4HhuLRiDqx8P8WcrXmsDLCPJJIw6EX4UwjVFuwRJW5IzfLHf40j+mFLPZ8vRnOHur45R1R2Z2/xa6XZZbQ9r0mE0cScTzv98wafN+hP53g3jF3zKaurSM4HPxmIPlgWJOUtIez3O3Ii72B3k0+Oq4fvX3aG1dvegznLZi7JHdaySRv5oVGXumVoPNbTpOHIaHYQvBkOcjKb55wbm6l4DMRca7S9JrhiUE2tysFvyReE+KX24fwcOqxVw6GHSs+0wzo0PaaKn+0s/NLVqrDs3o8DUaddOM851RfVOUQ8E440Q2wEeWLTVByp+O+DaKy7Fqqg8qwgtZ/t4OCVG+94ejKGEZw2z8HZcyvKBvDmjhLj3uxaqrGzPtOzlB+pkvB57vtSZ4TukOgvNoVguXs0Xx9YZ7YPesBMCuK1GigNVnOHhdt8nLPKIAKNGx95SBB2bsmFenzYn1acrusHcyMlQizd7KcwdSl6C1kmDgHEBLLQqrKoBR6C/iiotj2H7BoUrxwgtd/I+kAtOYx497Ra46XUun6ReCcFrygaACjREM46rdgC5cqkc6Y0PaaRgq/7nKX9tbLQHDY3LsDIMT1gZ452KrgxZemtdFD6pZyU1MblHXf+il+BZ2aIKWo+xe1ubJZgHKSH/dViqve90dq1mqFcN+y/rCS+jny2B74pnPktBkcIqxMa5nvVHEecdOGDE+qH+mmY6n/LGSFWd9TgmXh7jsnCER+R8c7ViyPpw+GMkgUBKWwZHoNtxUtFUnju8j39WMlfveNuHvQ5mw+PW1L8q9Ro5iT7U1i/PCmo2YnXT23yLirsxbIJhR5ZYXPI+CKSjTiVgqO8cCk8CGt54xwwSq5Q5TxmsoGr7Jy8sbsmtaEJ0hYicSFu39gNFYggqIvdAD6mDFXW9sAaJcnKKqZNvcBnbz5GdQ8y50GICtjfjU9Qr9qmR2q3SkL5J38Isr9mYl3sA3SDrqGOKY/1UIiVkaLMDbcPlqZGnk9h3NyZXzeEDFxaz/0jvIDVUcstfZlhvQsTZGD8pyb/BHp63atBn/F6dRFFt16qRnJ/lCW6bQ9hgfE797SQpq+tTzQaiC1ZdJDkf2qhDD4oRYRmViadpXtoRwIEpp3fIYeUkqMHqCsk6RwVkWMrFDPFQqEjBSXvIsYFIHzLgq85pe2xM33HLt+GQctyOTqGS5SjOovbvC0yt4wlIYcg0ASz10cDL6PeBRoSm1PUaq+Y/qFMGk5Q2Gu1ml/sk2r2PRm0FSR6p9KvNYurfYgl53YiFaIgDSp/yOWSVZuIJgm5TYYs8/6nttogiRh6kzegkqR+27JtLMs+lBav9wG9Arx92cO5gOC2IJjjt7qN/mK+hCC2ldjtFo48QYiaN3rfFvZQLrW3JB+0PH0b9JhRCyGG69QD5Eu+5YqOzcIUG4zfG/ymKpY3CVV2nN/PxN7fU2jM5LGT2ueUlYfcdbExVvXvG+A3KGmR+ZxdqAZOtkkRGe82M8V5oG9SI+AkzNIaOhtBbiwIpabFxKo0gJG4ncAGs1WAUeKIAJ4qfIYUw9ipZN240DpuItpSU6rkWRxnpY/2+u+dVPncjK13WfvBcPg6CQPvKdfy/1D/Mc6FrgjtI6j70CzAB/ZGeRhG+4D7l0sX258ZjTNYPBe4yGl4U4oFxNzbN2C+NH4mO5ryTioZqYgsa9JZBJkwaI3eGtkJd+MFry4hyYKvcOeaTq2gcrnYFa2fb4MchmUvnms6pplcDwJB8L/1/ZAdjgAKik41RCuwoJKrc68SNkF9xxN03ggghVmyRUCk2Mj5UHIXLqyWJ4/fIsbM4iJm/ArrsUpYcZZcypYNo254RpygIAtMkCBswRNiUFVCsCJ6c+Io8zh6xrvHBqFbEF2WmmYcfvuVRaegl9ltelgvnpdrl5DtrkLJCysRkJZsM0jcUfgiZBcus+Q7v1w52qmd5oBzpV5D5S1zNjQ1Z8FLLtrRcpgZuvIIXBmQc9Tb7eVEBEGntEoGO4pX5ndJCmfAgU3BXIHxnqHSMCMLNih85khKGYdyo6g6HejWUnGUYdnwZjY6raoaQ2cwWnoNOuZ+lsu6C5XqvOnHb07OaSJNaLOY7nCSrvIvVewDrunvXQzoCTNZDHfMLt7iNRvKin10OBy8EU98u7ONU59kzq+QjkuxxuAD/lT3fyI4h7hWlvGcbP+gZvQrnFIpEJ1HXkk7A590ygLSOC0fIuNnJ4YUUIFU1+h+V9zIne+uDszbmx3Bh+jGrSFv3VUFky7QVG5CCyoa2ZzozFqqn79ctt2Dz3+K7M24xBBxo498iydL+h9+MHNjt0Eawq/GFF+87uTLkfeeP7ll5yPMUj6Hl8nmUHiZwvd3RZEtN6GROioVx+VD1YKG+TPvx9djyeHq74bKZC0RCg8//6jMT1TEj+Epd2s/k60Yy2knUmzVIuk1wdtP6F8/VCfqWdKrBPkPpSQVEX6Omu03tF3CFUzf9N1M/hDCJUCiFg/aWxPOa//s3wS1YIuODTFQ1X3DM+U4tRaTMjVveLqCSP22FOfpPfw77Tk5EUxKhsArUa/iCFq9q4s2em8EHGuIEi1Cnc0JppK4rmqWJs4CF2WBV1r/96h1aZX2KCBSpAI5RDre9BHwzlSwNJ364fi43pHQIhZ3gG7zaQI8ejFb+unAFTK3KGj530j3LBSwY7bOmb3qvxzKGu9QW1adfj27XejtKLKYX2iiEqjMXGwoSI8g7BcqagWBCSh2ZbGfhAvtMLodJwdfxhtId8MtNVROrDLOzmQIw0ut6tBX2lIyIb0Qoq/lDnr+xc16h/C/vij6eA1/IIq5q2VQdlav7f2vIsc5K8hDd2osqHJXw/D3mNwryMga9wJ8JFALYP8gaNaJCRa+ZBa3nN3Bj1r/vgJbNw5+ClEOPeMuvO3XIQDWdM27bQLG80g/8pnsKnpaYIFZo4//346ML57MlcycMV9S5n4vNZQX1W6FJxjC8vFQbdIqjiQSDjK39WWYaay9hk0D0DI9IF6c5jOsAdC8xQ+uKlmGDey/01VnMzdqNshHP32NT5dksVypdo1MUJRJ4zorASR9lhZDerzQa/1/xb0lyCx+myBGBitE8jOs7rskHVSXLOMcOy4Xl/smz6X90Vl3LKzCiZNxRrBzetM9zplAYQsW4DJzLDbLdd0eXLje8kAOluIMXVwEH2oivy6azDKxtFHAZOlX6LYfVboDU7i8N9+VsWcrknivHGaO7h8R99d9VGaYcq8cm+0BXy3LT/1iqRAC6qLrQmZ7MPkmNsaEX/lOuJYpq/Mb9P28DEhG34WHZhZ0sXk7ty0yfjRZ1eTY+f6+ppIxFY9e+ZznBy6vsVYD6yQklQl0DZfM6iKMkBtpomMtCaNowcbPfJUXIhgrWnAuS6NMY5wB8fwoIcAkEXOGKC9ebWDBIH9ekJyJ9U8rK5ULDe0YIVzIFjWr0SlhseSd4yCkFIkXxfahU95jjim2Bjz2AlbnoxQAcGEems8BNx+BGwuEMZltgE/qH7NtD+MZxz3QKZ+X71sXvS19LwPoCjSHPke96WiGBSsWMMn+ChreHsVQRs8xVnFZHYS1JPLZfN4dQ7/ttIA0brWFNXicTRDKqljJyN2PyzbbVB90lkm+dtEdg0hNoo1Riof3e+TInW8auAUHVAWF4ls+FcP+GySRyAQJEXUQVGZ+aelYyw7+i29jYwM1L24GMl9hZ+bhyZB7xQ7Je9Xk59A0gA35L8v+PkYR779HRBoLbpihGqx/Zr0A57oXiDlaQWfVzDHPEg6y8voAeROHe64xhcjBYKvUFcWq4ySKlnbAhOuBvprQE7Dy8tVCxR8Gp4gfEg2ysEbWCmet5Z7g4yS5OQquIGip2e9QToNZ4W/0BaRRtpsmFG3IVfzXZ4oWVknqJJb8agMupFEB2HHcH7dEl950lofIdHwC0vZJfH3lkbY07XohTQLEQMJJHwjHG/sDg0iqoEbm4liaCwG7ml60v1ZzvpZdkjx35p988roMJ8d90DEDUxmalw6a7uZ3bEtuOUAKPHSCHfFr3TjBqTjc7r0D9Um32+r+0u1kXx+1XBM8Oe7bXuK+jA/9rMdoTgqqdZO8jRg7SjVWCYZOgJzd5QUvZ4FVv1qHhsSgvuH8QWvm5fymIY5GIb9domLrnFYfpa0ECJ+r6Tq6v108is4lEaPcLY1PIHOncin94lGMenpfDcp/PT7YWqoQrmZV3p5haBGMkagYiAUzvwaGaArB1l9CtmqUtj9rJf4UFvavYG7cYj/pr5rn2WDZ+Kii/EcvzfA02EZY+KkOr7xBdRb0k+5dyiq5LgFCdwx8y1Pza4/I6lzxP2AFcIPuhbxeKix0iIM8XD6i5cR11rTcFXFprmq186JgkUB5P8OJZ66XT5N/1nXvu/j2M7/xiIVG6w4nDWA2FA40pf0Rb/KVXN6iBYuwxy105GrRCQhg4pqnt9r5Yp05wYMrISTxk5XSAEUVE4YeysaCRkSJl5/FmoXjmiLjNN3Z5C3NM7RX9HSrLLYoZ3e6DDqQKUFiWDKxv6LYKZ0RqY2FEa22M1WKVzMEB1LDF3lxZwY3WfsaOdStLr7jGHKTZWco2CELAPhv+abgQIkYqtcsZLo0GC0gTSbKOIJjAaP1zge2qIk02MY5pnmHuYReWvP9yREkVeq4Gcc7+dT8VsvjudfrwZFVy9U+jt5s81c3xuyN7yKeS+iKoPoEU9PNQIvdLzCXSol3v5fcD6LoeYH61LM6i1ArS7fQGwxtCD9b4+K7jx95HCNRzCDx0EE68HOhT5zMSHz81bvTA7sesABEHYLTn5520HPYYLobRKxVcgF82cfVq34EnNf0jtiCyfQo+N7wEsxvZMADDj4LmL+3r0SIoyVi1+GqSnezyL7nQd6WTAgnHhE3lWop6+FudatqTFrOYv6D72oe6hbOQk8qX2zl2WLk0rxAGAfVhpd0U0PjY0HXmOo3GfRx0WcPgq8bupMYt06vEzDceYy+BhmMWw8oSNxYLu+iKUF44DqAaPO5jx629TYmpQeE0+tnkAcGMyNZodLtfMI7Fga+QAdFJnuqyKyOCEXJhN/5RCkfAlcIudSTk4Ry1kgy1AOzA7QNy+KVsM+eLgOwG4C5ARMFIYUVKTGi6rz3YJLES5FtWnfCQ4oq34gwX05QaasqP6tvAm33ZxWA7oZYDotUTftHeEYlzLvQ1KT2Kwbj0z97Brz9xsAhCK/2oGMW+EtKLdYHEPsFaunM3q/cLrnmL+xT8J7VykITzWIApoaexFqesYZEulLtcKDwfKLG63tHSu8ioaVGExNEBQIDfphu82Ni9i/dnex0IuijeuC6ByVZyNJTZ5YoXUaSIn7xRkzBTi70hFlW+9CoT7Jg4OpE73g0NNqthJwShGx+JxeSal24uv4itj3fRYnvhR059OlJirQbQSNBNBNg7zfYnJEOfgqI996nwCEmbpsxFuK1UMe7DZL6V/igNIyH+2VNMlKUASLKq+XQfeoq4j06RbJ5flEOV1B/3T35RxDwNd7/aPEa0lW8xZJe45o1PbuF+dojZqd3aMzXpBlXgZ/pK+xesv1gIfQEBqWzar/QEYfXVp8CNciY9DdCtOw6u48h2HPVQ0wMJ1zjeeGNKjkpbC1HQ7kwgS1qwdXlML3pJlNbGntzwH30aDtxcP4AkpLJlVoYWBwdD6tWLp1//rPyjht7jhySvsAl9Aiux+N/X1LRw4bxUKV/+hoYjkVa4jQW0K8BLM1PTKK0AFZZjmqaNir1HyHzAESoP75IPzuxSOzKIrc/rksqkA4JYlSvlkha+IneL69cV+0R9OGd7d5547Z717s11t8rT3TY5jHC3blz10R7f3OeoldXLQ5fgDYToXkwzlwN7c1nti2TODVQ7yEkHFTEyqECSqr4yorE2Xy/F5nHP5REA9/rTle7Pymy7d3xJwwkyfjKERyljRf3MxPUoM5U8xLK4+tEsM8nH2gdvbmHBdvENH6Q+88ioz9qoVhn1Ks1hgdkCSffxe429JAMU6uI7aAlxte3hHXI1JKyaSERMet7rusFbStLezCBYkbqrTyZUYJEmComqN7bTCvlsRiqg01SOkGg+isEFtVY/tPwOsGs1sUjjCocef4Auv1Z2c9M9xv+bBI5MLXy1eWbDh2wYYBGTo5eMApwpAMQu0ZLuWl45pPAvcXd8RnD2vv6c0zrgQI1BemY4lXfgLY5/bjwJNE3DVUKtbR3I8QIpW3fq0H0wipFzv8AkKgULD0kAKPAPeYiyuFB1xbhFNscxZQAs8Q+2a61eUoSk6qprI6E3CBfrFyEoYzQy1gSXUXDAZmfJXnYRK3cuKWylUK1U2ZGk7XcXVb+JNQSNr3pptpNxg75TeDdQbrJECTWIKeBHb6w8Uyymdr8HL3h1NZJXUK9uvgvrcXIaaYe4dLNqmCPHdHKO/OAieXzhv5gqdMV/yg3wdruZC+nTOdRQuPV79s6G3woF2ocD5FeO0khd1PGFckEsTzHhgKDRdpHyBnG0e2TwoFts19m758rtTZ6CcE8Q14B/9MQbXuHuQ914j6cVp+uKc5wVVZ0xYXZfLFJJ5c8NPnl8Ub/W/AMcyc3qfUQK+ifE+pnaxjqIJ5naiAW6uVjrjJ1E1rTBZP3wDVAMHDfLsE/CC+kBqX0lXJbLF5KEZKZwzl36XIYRJNAys8+/SsiMfaMtOkwP7dfoYarIHSpU6nGyepu6dkoDqKvISD3WCU2q/PD/hRLjN8NAMMCcG0uy7VMMRzY8KjOJMCBQdkdaBN92iY2VTSaZkVTYW9mXL1g1/b/yJDrTOJhb6h0zq5Ti1stisJRuALS8FyRgsMoBsbKbN22qHC487b62+E4Yj3tvJwcLfxylp1iYWy4uE6e+Kz+OkPxQN0Yux1rkfkOA0AbxUed8HgwQJbTc30soSQhEJ7Shck/JOFein5BC9m+9DYqtjrcO8EiO6n6Ei7wDFcEe59pKLuacuw5/7fpJQT5buxnamLiAiMxqtP+S8bccDAARHj+tY1LIl8DqddsPtVbiAXjTXRvJSS40Wt1Ac4ikaISGcl/g4AqPUHX921Vhxi0nUl+jNPKhRpjwlOSL8obWgiHN+sow2zUp+nNo9IrlpSFPf7FwHxLW3aKIVO1LgoknDlOnMU0H+fy97/RM7jqrNG4TaGS1RTpsM9ZCHjySCsjfwpbufQ9PlKCOH6bQ9t8TGMOHTdFk6gOa8oXrPCvW8apsFJ1KdVwmon/9wXJnKz00JiTZ/eLBKHaTT8EISpHB2pcr4s/uYoOgqQBa18IwRsl3/uCHj9Y6wpEiofI9vJTq6I4V2tGgX7L9Njc2axclyHi+xpXU59SJ6I/nqQDjF5j7eeo1lXXQAw0FhWujwLAjxz3DAicz2pfbuICp7g5ua92YOP36ef2kUDJCRxn0fcMY4kYNAp3FE95ZFBvSTqMsTae+0GzhKRVif+yCUgpplghtKw5n+T71/QFyEWnALsmCU6YJPFhna2wvf8NUpCqnhIsel0Dm41YtfXEZpuJ68q7wC0pDPxEBdIx2BWJGlf7IKB+iwoEXqNNOKe8cIVpMFruap+2h5U9WK/Lu7HLbHfsOKngwuCJ2W31KkvQgMKsg1zcz171Czg9XFXMJl8CL/+CqLN2C1m6d+ZHbHLkaxuBVClOXefCnZYRvy33TqRUbSYVRVjsyF4JeO+V1IJ/CWo/F9BsELqNKZtmdYKwueqTGBTUqUHHOr7jtZC4y4pBIIV6AWk3NRaH50vSDG1zGupOgZtx9iTB2BYOv8nqDVtXovPCpd6X2+qoixst66LU6WbN+R2iMVZEO5djEE53BC3MXVvwtcozLwtwmaBfNdy9XpNNN9NEPYwB0zE2hwv3bC64VPOYsunJlKr2Ayh9itU0XahVlj4obAiY4sI0kcR06hyYfnZI8SIN/+bNmRxnMHOXsGebzC/q9rU9QzadXXgEZWx+kxZ8uxaIZOAFfkMr9NRLWtDsxXVPfr180FFrzo9oSE1013CGK9yaso0KVqzblIU06Jk7VNljGjvk2ORqIwUM7lKR/XlIbCAaUbVKQqXY/Igkkvd/y0+Z9Xp85FVbUESi7jtFlic9SHwfNdae3qpFtD0fgwTTAjv+VcfuDeIlP/Ha2gnvFwd1SPnfdh7kTVAREzv6fvYXV8SH5WGpyWTY+8Pl4LSWjyjfl3E8usISKHGSg0GiTK9thadFKth8XxJ0Uf8u/FtU6DjSn71+Ua7J74zlIMbFUU2Y2XAfwrkCpmUoY6K4NHNBvvkKG2lxA6GQSV3/j/rfO6nfrDpn2N1rNjujYdHy3qIL3HOFPWd0ox/Ouza6Is4UrovPMbFX4B+B/UaKhmjR2xNKUDALoHeDwZgv1zWKB42TiT6wBvDwazYafOl9gpXgIQSQke6xJjX+XdiywwsIIlt7XDNUuWv83Y7Pwb/r0myfncCGtncZiUplSdi9AGN/Zdo8FARZDyzEKtJk4bbWy+vkp79vL6WWsKuL3B+jN4i2Ky8SHfa9svhlMELlDnkE4nooEmQwY2MNHH3UP75UZOg8laEFk2deJb9KpZhk5xlDZ9qWeiRPeXtycIKyrIwbszdj7c4JADcIKNQlo/CgybBin1eX1yd+xJyArLVpmCk0yBZCECW8SWBgwVpES5t/23NItL8vc9wNKb+6yGawGvRSfc9QdkypmdCQZ+DO/XkXYutNDNEQ/FjZbR+AK2iv5E3F8WhSaUv2TzAme+FdJvdmwEEOmj4UqB7lFIIE3/CU3kcxfc1VY47plACAaqPM6zf5PNOo94QeIFnIhVh/wKSwUpBL8P/hw+WP5vrnykNtp3Nuji8nI4gIXK9Qogq6E/FTGlcWQxI7Do8PsD8ELaJEqSnge3DZpkvCmXdNsDITBEzOxmGg9E/J7J5ZAR4tpZTk9C3I0+MmL2p3CISNRvp5+bEXnPtYdqCi36GvpyJYeHLsGbl2jssCwRu4I37e2/blAc5q79zRbYBz0Cvkhv59ssbtfpVaXz9ug9LQsSR20LNb/psD3hfoE6pG+0ftz6dBKRxI5z6hmTtWeBUicifnNU2Qmwf9jTOgRUz2skbNjRuqpiTGWTZOr8GB8ldKWbOITQVv3rd0Ic/YrGrtHfdRwCFchW6OvIAWzz4CKzF4C/ClKIgLz+Gmq7Xllmay1d7bhY4UDnKgvjCidcxUwj5vR+cI/Sdcp8AQsWr7Yof9M9gXOXOzdmPBvz8T+sdfmxdMpGQBRmUJtBCh6royWj3gIjiO3zQKavkr0pskFw21PFy6Hb93wtqA8PV7mA9HCNnSmYGCjkmD+uqyNLb+hq13Q154T73ZogcWv7/vMuFdwtgiT0GM4qQj7GvYQKzY/RqsLFPjr2jsSGCN3Zq8yIh4/tM9z+DMRU96DexZh0iAkYCi4cwYlenLiMDfzAdie9aU+T+KopcpaoAn2NeynCN8dz7/F92m4aoiYn8OmlPG9Bce1yoh15wo99rNz4enzsF0l5muKiNyjjFC3DOxRGrGhEPiapBOxBAwWWGVahNjfVetKITcEQrCQFvLbJsH2ekMoSojIwFq1OcC8JtS5mpb0bwvg16tCsflvelazvcr4VbhwvYeoF0Q6hgUOuiNBgHOcJEAT6CfagNPOIA1JiBnpN4gON6BTrLKgiaHlz/YKYP8VwdcMhALjjhqueitpMF4sz99cZRuzvVyvydA/A3iZ6JQsNJcGCdoRmbCzgbAyCtgcwGRC0PjTuE06HDQSYDEfpHynsHFItGNftkJ6xynEjKJiHUwxS530dzvwALSQwBuF78QKFQSGO/Z/zoIPgSPspOkzhRpLtHn+Y0MTfR2s84xr6QVgyx6gDc5HGSAqr5YSqCBFBtN3g2PsIhnVUnL3lVlLFb1I7cnzGen9ntu/ykQUAo5ECy+ox3zIk7ZZ8Frt4ipaewKr0EOw1U88jG0briGY3tLac+baMLBvNoLzsls621I3/1xt23p416PmGz4U8VCRQoGOFlgzv5ZmpsxIJ21xjvLQniDzBMxfqkuJLEFou58R9UX/I/qFOKPqd+1pZhLMLYPkRkggrRs7dSBAamSXGXQaVMcQIV2xzbmxPLQIeGzjLDym6Azxwqch5VeOiOFxC/BBltASPc1lKb/qYEHgCFo8VNnEXVGqNbIY/XceVViKZzsp7mSZs870Np/0xcqIdhM1WrrJ+Id63OrRRYsR4L+dSNrlRxl0mC+Uh7n1W8Zhrfeb6p6LQsrnai1RYwsGt7hxj2FZv7VFkQinZFREvXn9HicwTI39suT0x/bZ/9Motxmb/SIWpjeGaSB3t/7/OGJ/tEQBgb4Jb+7TuWvUOYAY1zc74GyKveFK7+4GcOudkf7fbjPCN4eLWc2RDwADmeRoKBR2Irfimw3X+aHlW5+c3kHVCASkvX8W+vKa/DwDEN/P4PnL28thjkF+RWvtmHJ8wXTodhdLEBpq18/7rc9T67WhP2oW31PwfhlpcHTCVbxDwcYj+q//Wl7niQmmySpx7Ed66HzD9iZ/Rq677HOqLZsQrfUA0Ok7/YyqGBeojVHNQQKx4DrYC3DXw5PssPqg3jWXk55D0HfPizPxGC1yqdUX5U/n2aW3lYYLpWk9DPzxLhSieo6NMof0eqhA/TQaS2MXWhF+Z4vMT1rh4W1XuOlkLYIYtVz2y2ZyU1FF3VZCj/PY4A+ZKaScLbCyr0RkP5vPcCo2+wif1WvCS0/RKZQ+shna+HppN/WA2uYmh7wUEQjChnSeLSjN3DTiPnmZLz7gWyOPDooBtTaAfSEbOJ6ojLmJupJZMX2tKopzxG6d7HFq/ejeL+tfZut72baYjq9ArG/g/ckFZUzc7wM2lwIPAktuRt1W0OWg0WqXdrkxGiLG497+yyD4N7YPKe5xt/+JFAwgIJK7XkBgDHRQ9wLSRTm+SCueOhb9mt4Z8BoVz6Zqb/8C7u1fkzAizttMu7ot2nYuahECYTgHCOmE290heNvsg4j03AzeeF83/3eriHne0aeKFCri3It7P7LNgyxJUWmpl/F/7MIGCtSexwqNLkeiuvpHffCiddQ5MsZlBuWdxZnTSyxmg/53JaQ0PLOOqOKUpP6ckd5/XDnO+9VEM3OeMcJxHWTCWfwYWDplo25DZKrtvueR2fgfm593iFT8ELSs20RiaOKU+d4FDpB9qlmiwsQrVxiF+b84WLsGZX1jCnzzxJfCLfnMkHsU2+jxoFH2nLr0IO4dNrHripgQwFr41wfiWZ6/BBdcXsO3R72iqPvuM2Vaq0iM67ypbNFf8yc2mz8ZsL/wzhzxtE/0GDHOPfCodhY8tFl4mbepVTYGUimD6uRkd4hg1wOdv6y1F3exDufbmoW4LIbsHwV5Mj6IBfRhvzZRG/gL4bhWONo4zclheL7hCno5R467/WfXJyt9CKjGjDrwU0UQGWYImPJO96qdgzkkLtyrDmNrnaDGRMHUTww2ClYo96xg/vleLkq1Ni19AaoHEOq77s5P2j80zx/S3UrSTtwVJmdUCZwGWgOSBXG+o7FTQW+PNiY0BgRErCjuZJkN8pFZrSqNO9vWol3ZlrX3B6bWwylOYWAGZ75HkdJQKRySD0gBrCStOdVZSIGb8ENCXQ/5v9c7y908wX/i1ndb1C+KLDQA7ggHCSCpmPdq7L+YTNJmk+5BxM/qHmV4RAchwZLsQ+37Jg37+nyDuv93HV0LsCqnEhyPgXSLnE0tdTykaQVv41vim4opVGkkcxX1N+gyv7qtLKNf6FxySPjsh1DS+W7JglrJgczQZm5dyZ6rJTubYh8GGe++RPTiK4Zx64HydMDZJvw0ClzJ7WZwsuDGb443VsJxl0Nfts7MjktBbmbUXXS9P4FuiZGaLUOb2vCSw7hQgx1RdkjGHA12+d9SCnUTjKPLf82RCKpkzZIjBCUnf1Qf7S3uWkxUgmTL3nE2dDxZHSHm89tQrimztupGzWDGJ43sgbgVzsrbkiq6vUXbjO4LTMbIa42HaDuS7RJwiAGjnvM5ZvPGVDmNWpYXwuaQ0r9IEdZGz3iPxVy0FFhOacYs5QA1tpoiQZ6kLq33V5zxWyKQDaTIxiJWiBmV9vbIEjffym7YMjrNN50/hquWgh/iDZvH4DryXHdAfXPafao1Ie2fSXar7YlGGrvGX62Sfbk9SQ8b5CvF8dwGcgkGSOvFVSIaANN5031ymn7cGL7K9gIvNTIt8i9255oA1t+juMPgUAC8+Ym9Wy4XHcV9LCqkk7h26oLU51gnPD73aLAX76d2brYCdoz8soayLXZHU8LWeT520C5xlxNt4b0oa2rZl3WQESBRh3/hu/GMsOber7kFa+t/hrzQLngcRaJ3oeavCNt5giez0jnFY2KryhTWLTG/d0/7bWwmF/sV6zHI8KNWIqq9tdgnASVG0lKz0EOprKczhdbamm46LsIk+uNFHVtcDu51U95jrwZxT8r133D6S6TKxe7nnBzT3kFwJV3rQXE0H8acaDATMffTvoMzPBXu7pHVt4UAQKUzg//WOT4/oICZOSuP3UN0UXuQKymD4/Jt47lS6IgtiPeCYLods06JzyExOPGwa/EYlbLvcJBj0oC1M2j7tqJTkvQogKam+IlZxg5tjhBQbyR5taE/KhHES5FoCBzdvcORIpNgOXUVJpxPHYQb4DlFO2+vOlOEsj+GZtosTEK560vpAls8n2UFatNV/h3Fmn/6i3gJbJrmBT7v4Nlh/TtutCJ1YtmsD5nHGmIegii2UXRNbc9BuG7oQ8tmXwrO6/y2s7SP/MVnpmKYukc97pezD3SYZAvnejTFSbvb9YjlicNkmiw8ZR6RlOm0aeUlahoneHjY3rh00DBVd/X85u4CN7tzObxFTQcOM+VkOTm73ukcovala1MNa/lbg3tYm33UuqaCdqBkoOoM0+/j+3BgT9DoUkGSWt/fxXeNsJM8cURk+Q6h8N5pJDIdYtOpBatLkgiB/r6xxTjJcjqOdhOTkfmWK6Q2OrPVd3ey4ztA0VLgqJo9JrD8jppqjJhY96AnNWLYJa8maO/dtIpRE/Vl9YxuPc+6BUjTxc8aVd4XHjFoaIhsSfJMfQ2t+QbFh6bsVuTcLeiMkqJR98KQP1NJESvRivbMo5v+AM+MXnoZa95+q441aFM3/L5Cz0u+5W4KEm8YI0t2px295/5Bm2oQlUUnfdQjCZG7bXaAg4uRol0qm8wCaLkxA64tCw3HSWQlQMFTr9HpBxJSNNdDV/CKHByLKjGGSBKkLyfBko6n+3Y6FB51nrqNTD2bv2Evbbg0nZTOKterbmJdx12pal43nwm6WBXIayvuaCC6MAOBAQUZhXLrLbdahdiAIp+TcK6t6vAvxpW3gO86P9il3dN28DPRv8yC+Z2sUCAX8QKmuS5zeRy2hHDVgR3KbMzFKhyD6WvAr4rNIVWjaWwT3rcgEnBhvppIZk9Yfk6xGaQefd3K6FcOO1UQ9UEcWjA7Ww8i8czdlYZfMOVSfg1Mx/qq7Q1UR+b9zJ2b//JnH8t6IMBc3568U4cYUOu6xkM4vxirDPcTJKECuh2FLNTGIYvmveif641kAgfOx6Kcs4403YSUhUnd4ZNebRn/EWXla6YmfShnGrKPV9Zo5s8LZNyY/7CltOQULSdZ4P+t56EyYglDe4OuCQ/gS8OCKw031Msh4s8Y511gJZt5vZ1FXwtTUBA/fND6zmB7DfItziOjqErQB2vPgww5gnNAmIXMRVOnB4fuQBE4Juedw3Q/H/qN5MywX9CcedGx1LD0Hd5k/V8hFpM0Yf1YLvx/m/QuYh9v/cJuOI5MnpnlBCjLl2cShFpMo2haiGaXc5eheVMhtZg/E8qvlrLqXQ/z4xtY/YMantbuMJ/aER7Mm72i+pqQxWAwusks92Se7mqWq9gPh0iTECuVKtCnsLRsAMREtjStECOHDoXnptFa9DRrFO2zzgOmWFdDa2LU27JRJoEQbgCxCA0n9KngXmGqMkAhKgrZgBG17fOLiWpTYJc+kNzF06y8UjGZgCmNwRORUqxsiw9duTprXu5yy5kyukit5tiW0gI6l4DKBrjDtjkxyAevyeqrtYMoPnQUQd6l0KAYjngNMO9taATWDA426ba42IczdqIb865uxVeqIdhLZqJCfzjJQ0H9N0v10Vpf/uIBE1beTmnLaeNV8jGqAFjvVycP7+Rt1hqYFyyhy3+NiMX7hyOkOrRFlsXK810XYz4Vq4i0G2mSmba+Qss7hP9v+jz42FsdDHTRWtazBzs9911q/QaFtM3qn8HYjndRq3ouI7PQ0NHwhKbViMNIrTPjWJ2uIvXt/9s23qPL94BKpN9NmL9pbJX4USkNH+D0YJQbsnURFTPM4T6sP2ClcxP5rJ1Yhfi5PP1dU3pGvp/lRFqCaOjSz5ebgQblavgtwyYKvfA/SoGyMq5LZ45SsT2KfZDBGRVhfgsa0yU0Uv6BBqoBNTTzSErDCzM3h5Bf9htfmeTo+RoPzbQKm6QutjbPu2K4HAHz2rWv82UaP6zruQH17g+UcRT2gNmvk4DwlH5e18gDLFTFWpj+dSWKjUaVqPL0PGVYw6EXRn8qENUZiNXLHxlXIk3aOb9kXRalt7eZn36UczKSWBl/rrhK1kf2jqxRol83WEk4xF6uvJUeNJMBbRciluJkRW7u51X4DRmPc3dK1SmPE3qvCHdakY1KAZkJSbGcxkTAFdZkrkaCd6+IIFAoe1lCFKE+fqR1SOYuCcZQ3rPfLyJzr7Ap6XQt7AE0Z6Ikwv/PMkGx17p9hA42oGlNme7n3VK9bAclcglTAK3EXtXvn1TiAXmSRdQ8B7ORx5MWemnehLyy2e7or07ZheaknV01c/Q2f1gZeVYv1arN3arW8/hngxZ0lgivZmyVfJbC0aXB6Ut7dKgOn+K9Sh4Qbm3NqdiLIzx8E1X+BJ7GnLTjyK8Xe/b6wa/9h7qcEKeexeNj46SbxMfmp63mlbUkOkSg6e4Uq4t2Bley32hIMQLTpWOgRxnxh/f47r9eYNk087tMsY8mkUBEodnRxbRJKAEGf3EJusY5PpN3BNfCwf30z9+LgB0GFUOmSNMV4qsHNdJgIVd3WINVynSYvkvUnFGiCA1XNDY0/7j+vmWIx2vrb5aDqnYpK2lOEOS+Umvl/7ZCCZTlxcXjfJM538MQGFjQFcf6GCMiANwUEDeMN7igwFx5IfIkgVMWeglWlNUMZksEt52L4eVigmcVGssXIc9wGoB7Caqit1G2f6G6CSx/a/szNcvANHDKAPSJrV/892P9RZ4xxFi6KKil9sWCVQkXNDgFSPjO1vfp1GDMYnp19wHiWnDloDr7lOQxpSEfpsUE0GhEle5pdwyoAprToxiHw+Tn1WUMRy7451IJrlvOUQUlP6zqp0j22OjyPgembTsANELXqx/9K3VGgwrg9S4E1YH3w121/zaRFhtNne1aW/CNlygerANfHkDKi0itECREviy13WSDcF/VArIPiUNKGNze6n5dr57DqSmFu8tPa76E0SeVUb/iWNtdbX68iwPtzYyDT2mgleNYzTqqzYcDm2HWD1D4/ySnCBSDFUymddv3OIoyppedTAQMqqoIpXt2usEC0ZL+ly2iFF0cy4t94bF1udxha6ySStDQ/vMZD8an8fx+k4DWT/NGmHprnTh79PdNuuBVvWddHOQD2J4VtdyaS1EtyEyPxIrr6ueuX4GFDWk+ju07tUrekoQNk5tW0Z1aXV/feWzldxELaeY5onNWaexO5m71Gl6TKLCeEvaU+s926jrpQAcNDNn5AAQM5dTjhQUTXwScbAEGRLG9ZjsVjZ8WxCDIYI43M11IcsrMeXQaUdoJ+7ZjrSCXP2nNZnxZldp1ymSNpDTMGPZzmse1OuK3OiOHb96rAPR6973j1HUe4DsiOgj7QmRzwI1ShtvBgsjEmx3mw3zLS6xMXHZLs8KGRkXIgFCHvcMF8uw8YEuiHfiuSSsO/UmkfxgFFrjmUaeWGoD/giogZEFvpz+WT3mn+CVBC9UIT2sEAfvPPI8Ky/WNvUAeBIZgXAQ19v+bRC7XMV+s4o6SUjlgSnMDVg71nbCtxXsFXwji6s0BMue7tqI39QoQ4Hetnv4sVNHrx0AyYBqmzIf6kbuA25lTGOR/tb/RneqBu0+m+m9t8WzDGm9jF/u+uqYFN1DmXnZmBwCjRMijP+3oHEaF2gDa6Iku6pVykkWM2bRtYBVsJCN5QKSljdpBxI58sw6hgiduhXpMTql1vr/y+GSB6cWAPdLouvYet7p0WkBTrbb9mPiaMRUTB1+d+AA5IuHGSvr9tgnfShMeQogiUq77yN0lq/Tue5pr4ESfFcpDwANMsLUe36AYsgcvkZ0DzxD+B4FAv4eynAWfDOekRm3L94kyzOBJhNPfPMSKvaEdVjpWwN4A+MaSHZl8DZkj1lWLoO4XWTkpFo/eeyUu+XWvasyCNVFQjkYQuK8acaGU5Vg/IU1Mn0wcg1EjVWnPAmKbuqAMKqflnmUAL1A+5vx6id7ec86jpmiuQAghMEcddNpBHnJg65HCDnW4PeKfRVD3fT/FkY75jiQHvPaYqPaOOw3YpL/ouAETht6E08fQnjGQNWz82TiMUKOTeTITfnmPI/3qnjZHmkiWr4l5SVPfDcGSlfzq8c+X77brP7BzrXd48uYEi8bGjYLkQ2iw/rUu6IDxSn9vfDTTHV5lKq/2q3PbyRTP4DCKFIPCNtDN6cDYdQRGqzl/2FeA/KWRyz5BXsyI/9+pp8hTEoOT4M7o7SUw0ZJQ76R8kkLFU2GbKVS0dUiLWLJ/GLBaz7O0PoSNrapUZCme8dEbYFpW6L/aw0q+W4XfWhZuFqGrAfY7WoDSFFq4Ov52WL1+2lIKK8WQfHz7ioktoappTDcqb66Q61VtqJXpvbqOzexJljrOc/ZgT+F1itKtmvq1n3t5S1p1g1iIoDFtEQ0ZOQBAnq96kt5Y63qB20E5p65ur/u8D578n664dcI/PmEx9HYHCHG5y8HidPzbWotjEFVEmj74xcAReEwS3azwSQvcfXgIfulPP+G1MsazQ8e5kUiu1pYSNCeyF6v93qr5IkiNzJe5x0N+l9WnHKZJQnzEl3TDVrfKZl3SR/AflHmvf3VM96bO8EiumFwjPcP9H0WTATK7nrDobOHrMJGvlkqNFZbzbhZOURnKrbDlhmpENoVpyKWfYT3gkbr+X43adzl3v18owuqkg/2bqET57qhpZLOWoEsamxkZOsSYMkpDe6mVe3Eqd/nbS5PfDHgAV4mFUFuBBxmchFRn0om+FUQI0wb5FCZbLZ8UN1yIqdcFkEdecxoF9chsyEdTadmO5+cIexR8loeL0B5A9m7AwDujCc57iiGRcMZYQrQRWZcqoWFvxmS+EH+CehRuxmWu6AwPXGevvpHXtCRJue0UZvqJSnSBAhtt84y+ufnX2LWjRLKhPrU3g6ajbLuPoC5A+B/PEG4N8inpAKoKaIPah3bprLe5dkxNGV5MGfPFabgvVe4aq/YeI4Dcejs6rWvwhysJVywUQiCQ0zA8h+wN46F9QSZrJC5WADgUR3qCH4Y5ORlAuVWmRX1/uPHP4O/U0dc2jKxQbJr7TM7gy4lajMNvSHvkpNrc1w15TVPSyny+xJmzy5uM50snymFppEbSxpRGoiTKLgu96TMG5HXrYKeHdv4ajI3lubJErSHXdtSl8z7LznQAVFU5vw+bm9mgbA6oDC1Ver1W/Dvzc0D5PrKrsVbH1xn73yLm2l6+GPnPD02gt78b8MsBb3lyFHtQcd7jc3WQ8ajMg0sjWb58enErEoxk/TFITXdGwYuCcM0w5hiEu7KJOo1kR5UuRfQdOrtLyLbcQ1SHLC8fUYc7ltQqQ2PxPm3EgickjF1Stdp9msH5xpRseNvqUcBw6ffTEvfHuMB02IICiH5BqqjEcJEF9c20KEkvmGsUpHMFCjcJ8H5qFlZutRZteQhRHGogqJNU5sWbFn96F8mJcBkUlG4WH96fJcOMgmnVY29cqNVJdMyjDL813yVcv4+bStKpPtdiUVo3AxKXEiuhblXLI6c8WBrWss/RH4L5W+cGDIiUNM3ER7CFZ+8ySZTWCrvFA3cFtopCJPg8TWEiylQZXCf1ckA03V0eL6cBVAthe8KsC4w/LIb2krR1Tsq4lvTK8BTbN39SikEYRBkycZXiWlmcHY9XJLVGVRp0qbpAj3ny4FK38uC6kjRyOsApYMZSq4vyHRgSQhWcIEf5rWp/W6dFh3JyiBkyYxJJ+byS8T6RRy5PlnCPp8pwbGeO4RUL55AVp+NT0vKJ1AX4dsf02txaAZaKC2lRWR+qtZ1nET/jsGaxQj98eoo3Nv9natkf82BoMa61Q3pCMFClOdrpDbOEfR+ku758aFvVcPIwcEtB4l6itoxC6ZEZ76ipTx91LmmGS+JQpxlvZvpsdH1ELwz3F1n8DTNu0FCSTlUBDgHBHbZWLK6If2dPnjVrf+hZaDCulQR1955YaS7aNv5HKXToroaHgWHkJUAyUmq1D3bHANmHBUHOAgTQ8vpDdLmSS1EJI7GQQ3QNDHY+xnCYGN8JQE3EUsIKX6HfXXbUZtR6X4DWkFPKIumQ8ziQ2wlpmvjvzBu3xwa/fYzOEb/kiALK+jy/KJEUEE8ruREZqovfJ4yQD1Z/wKUIOLOKtC7Cml11rU3Tra972aZfe3EBo9Hg5934zDHc8aZnazK6ManBr1uFvmBwo0I1tpDvMbWFJolvEVxiSGwvJ2xu+LUTjvhZaDa4/ViUg2kvDot0ForTduhXyrtwufxbrhUBjDjDK15XlfcfU3p8o922W7DOM7lTcmLmShi0M0jTi5/Cm0zi34WbfbLCEZZko2MSQ1nd4aEunGQbP60mChdySLr4fFr4sXMSKIn5cLmiwW8tG1rUTvXluTgoeHYLnEKAKA2EpAy/dcS9HvurGL2PyHZYdPg3BC1dOVo6ir0HgKAScZ5uXgSPVV0f8iFsRQ6Y0HGq6I4ciDwGyt7luDDtTe6T8c9PmWRXhd486z2smeVTrzLgrdSL0Ba0LJ6/NxSEoO9u9ZJlCWxF9qA1uYbf0ShkeHPDkRBGg2ZM49Y5fOUcEYVZcz++mMHm1TpCtzK9+WDNKjWVay3AUgrg88ZDOqdN497jO2amwqaw/GLGIRvtPtUtWAzmmSgmY1jvYH+683ZmKEnZm4pDbJHgCxS0v1a6yAvr3Lcg+JbBgLURFC992Wa0g8uyBvPy0184vwOHJQV516fJHk7pGSCkxC4IA5qFapPkwx6GCdVEhLUHdk0kgHkj+KSAnwIOr2t05Fs5DPKbM5XLbI0IGGwxh1afc58b01itUO6pZuLG535wQp7OFVU32pFmoIYTqlJbgnKVU25pcX1Vc00TQcfhdzs91DgjhOnDbH3SGXaiZ7NdhIreUVldNxhotN3Ppt6AjD1MKEDYgM2dIqlyAsKq8jlm1u5OY7I0D2ldaz+j8syY6dwSph91/AzxkdnglIwQrxYc4xnR3HbMqDaUGSnVE25LwHG9UATu0qVHA7rtHHqYkCBJ2fVuzHCRIyANy9MoWPEcZfVSB0u4JqQABkjaC5XXBf/tpOP2dTvoobNtuBaR2NbIRCXPaJRf2GXuVHoYOsRsMjVmTviQtigoCYV8vQUnz6bEXUKe0SlyiQ88TRyhnyfHyYkhmcKXJW+6hUd42vFvmcQ21xyZFR9J52med1UHiOXHpoKY16x8kDmZaucISIdRLKAWKDjDjtKpl0KfhrUP8SM8H9713b6Hn4/8PGBCODGKnZXJxpGdTZL+KL6OLIQY9kXW5kkHfPOmEwZQ6xJoXw+x9dC97c75/Axbari0e9Ln39v0OQUxeX95QDsxJXhCARGT+YcxYhZzNHw+MkmPAZ0cD8C0pFncmDBBhJOkq8UHuN339jN+WthN4BHVcwXx/E5djINfOrKTn68vVwLVGzjgib/33nXuc052FESu8wC2t6za87SNcwQh0g/6OX1RTLD/GAA80ZMRMXynWzxeB0fFfdBFURrpfbRk1Wp3rdRfGMEqbnZjlzbv8GOwKLhbUYefewvCe9CbRBpSXubE0UO4sBZ9iAJjxUQgfeRkgdRaaShyVOloX47IemG/Ci1Zv4l1TwKx6ec8RQ8gNpAu5OfPjdmaNQFOy/cKgsvE9is+gigbG0wB8eTqc7ljpWIYwflsVfrkQxcdKgideKv8L7kSWNnmKoLrO9nE0kx16/022aTxsyGzBP+ZC+aucFppN8pIoiZuRVIccdxJPMBSVxWaBeFqgjYGKRYLNC10OnvEvLomsQypBKG+/S2A1TQidPjVdB6JAkJZyuobnAFG1yMC8A8775C+/DDMQ47se4JeKqswAVMGT8ClHi1ow6coM3ALNbQ60P+lRHkLJI5a8zBvMfgZ/tO1SDjrzq65zoJoJUBe9P4OJ63Y8IPNdTjWeAd3nHM5rgqcS6XmxMdRIa3gMYU9MVwuYh0ndoZvw2k15k7OlVD40Oy7lGrVfmZzHo1ew8Bq9XAPRhoxrK9TVs5GsM5ywZBzLNvSjtXGldBLvzGnjQGfdsMDbzbSBrbkblfMqP4g1sbEb756NO2DsT6BpPn66aSPGfnrvtplm5OhZRJdcuJuF/mHQW9JsXC38ZUgtMAtYO2z7YEhMhSSt5zS0b5eT9fbh5sG5NbuRhYOnozJVgZa1mZfv98ObIkfqnsPA0UtyDj7Wq9jyBbaUuacCzj2/H7azHfqYRISArfcxNk4ZeYKRojxJ0rCeGrS1BEt1zTMlpChrC8HJoS8x8lXrl+IztmJcvIbzEyNPLOwTvCiDlROCyKMkHkTwb3SPCyKLH471TbbnZbJc7gnLOKsyzcF1bCfVZXMjixv+W7PP976F4Y4Zocpr3XL/kqucw+2DQDtWdE7irutk0rgA/WnHey6wD6rw7eObYEvlD4V+YtsH1qUKSl5Wzt2oCnnljoTL5SwJh2rmQlVWwZGbdvwzreoHmpD7oKcgZ/kIIQ6RiOCpriJrmyrjonEaj+NgyYcpfAp2ZmXdV7kDzNiu/5lgu7DC8htylkp8JdkP+v6BS14tAApixwWAPs67jIlIJnWwBXR2xJAk1YRKYQA0PM1pE4zQW66YGZRnYg+pj9ywWN2lA+LzEs4YEEuG6cRAz75VjTJUdWz1NVRwAUaXH+cProfnudE/gqddv/EFPnbepGNbgKba3EW2WuebEUky3rbIH/S4398M8k+eLsz9hDAPbugopfOAnhI3V68iS43buHuWpd/NyoCYhBcU8Ed0njev8mo7y4NPTnt6WDZL9ybcfUvRBZvT2WVYLCzLRo3zfAK4A9vl4k5DdxknYk/XaGxAhwlyufeUbTklTNI49A/m3y6xJHXqE/g4FUQOzOBSbu+MDy0kOuAL5I9eRqacgTwVT91gKd0r22FMKVi0iDt0b/I1H+u7xK4vhCO+tVzc0g9b1HeY4zeKN8xrQlxsfmvx+n+Ng1KK3PQwKvFHIRpym3P0vS0pq1rUVOt5ysQvfFAdz6voc+sLd27+mQR0fCcyeIN04AwsYhYDlNEb9oLsUbabWe/kpoAzS2DvTUeH1TR1Zppx3GZl/pRAlgvlXokzRaowVYl2PenPY5VhDYzHrt5NXtcf3hBk89W64MAoOZfqOSat3nKZgfioed6kQp7Thkqo7aaq3JOzmYGrR0wmK24sAyxTLoF6uJqCMVLj9u4x+4GzA8dZMmUjVJryhrr4rQRjqVW+Ti8JJZdJyo6hHuAZoUbmk5Svo3sW9lHio2Teq31GoaMOmPYwPKNHTz3cYd9pxA9Y1Q3qK4A3BE/fESQ9k1V/2TOTjUtrl5V5pgLqqVAiCvT8gEHqV2QlSjzXSMvgDI/5C/EcDwwRgFQtMMchTT/g29VMGlSTVRyH2IuD6/OUsbyAihzZksGTsY2246VzHTSJ4uKJm8PjGgJwXqv6y4QI3/6FUycl60WJP35GHormF/PvbD6vHa41o8UHjp500A81rr9sKjzvt3ADCDeMSsmB1m55lDuhhiz2/uaMW6bWCy5VHh4BeWkqEHjZh4o/Z2Lpv2x5H3ZptkP3OIk6YvUhIiYD8VrBnKJtFAS3D1jARnoK8/kKXHhDr5CAi/vMIoYIMIxAFITKa3RaTg9zaE6q3LX4F31gYQdTVWBH0wNKIL6gtWWYB/IowP2oPEnlL5RlpJVkEAwHOBr9FaY17PZqjsi9fQe2ka3y7VUyZX+7MU/sWEYigAMVwh7gK289GfmxcaQJiwOF/js0jHNjvtjHBBCA6Dh8HChgrKCbozaiwd91OdXIMfU/megBa4YuWMsZqf+l703PrCAgkM2pgE4Jb1LEJMVCj0XFJMTCd215Sq+pDGmYoqC7GSFTNXohcJ4lH5nXHmaDNjNJgspoIZchqjNp7CkZvYM40ffx5WxKFOds51H152LRyCfykccIudlLToJB8XwqEB/Peai0Kt9ZImRV8ChjOL8xD8Hhc7mL3Sel0BqdTheUclHaXvPK0x29WCBZ4BAWsBSbBRhtP+el0d8iF+841c4sy6Nig3CBCGQJSGgySVM+fGdswYj1/RLi0x2FjBFy9NCz11JFqSM2QoLJBXb9xbpfu5ogb7edgGSpbeyMMqHOAMbdtYqQE78PXBt/Q4hjpCCHcnqA+EZky5P8mbbPVxEYMPqWglD3PFVZr3uahiyhBvULVogjMHHvIENyOujuVK27la29ILtDbq8F8YH2LBbwAzYyG+xgWcIweECBnsjKtFJmoX3GZTTy4iDFK9zRGLZnb/HA40y7akX94kSK7LuZrlninWqKrQhBBvNMENWcAE2soadIi3KJAzuNMMZli2DPKPbAMcTULcdSoNzwHOXmO8aRmV1eNntu5GgZp0L14hsPDGs9oQ5o9TUWfvc3Lmpr79VEa/QoF5nJcqcGw1LBCeKOFevdW+IPo6kFFNGRB9SoSxcmZRf7wG96GAmd1OB4owlNSsIJSsm2Ep9LuTXnxfZc4OGqHlCkLUMDp4CPKso10rM1QgUNLVdFATDQenOJ6V0+NxbuVBk2pk2Pb9uFYJTGl3mTmlAmh87YeKOoMX5D6kf/r3hy3meMZA5wAdBJbo6v360Pto1z0+4tIXQgOnJ1h/410bNvKegWSYQNVbGW06GqY0dw46cSWbxi65U1bW8dNZW+fkbSIFxVJzAj2qonHnsWRzmR0+wrDyl5x4i4OeVthRfe64TPdnrdlTdm2UULaGVvAQtegEP2Ky0JlHDSpp/byS0TQ45KHzGDU6ISsQmIYqQvU2SJ6MHBLOQUXUFBtLi58rZO94sFgF2vYAs99qRyPhfZ+HtOXJW0A3RNH2T2Uiol/ZOeykDPUJ3I7koucpiQQqo50IGm74piq3k3e9QQwNbCJOSyJqq0K0XYVywvZqchyG2FawBd/6usbbgkN041zIIak0fouOpEKP5trYeOpzjB2V6FrZkE5U/b1fhcONLG6lf3/0LCSWvDLNk0wV8r6dUgogKrdr3psBe9SjFAlmIQ1ALLVxyAORTG1FjCcc4iAA9LCywAL2MFNFxDOeo/i6W/CNW+J26Q1Z6+//3L9ELrACmL0gcCKz1bWDJDafCAYBUA2fzu0xZAyCji2fXAlZJTK+w+Y7aFBzA8rnfF7G6mar2cHVMxshNbDHP0lRQIczg7b50a9tMBP57sVwLWtx4OXeEkcHXmBLUSwnmBd87UESrvkeDSX8SFAnYfwC50hNoN0nob4yK96fn4Ap4+rov/v/+yLg7+Bz5hyEg8KmgySc9uJX7mohoGA6EIioWfk6YrH2fx8WgSpHoxYLI8R2Bv5pa7GA4B2EJzPjDZ9G9d4GQKus35LpnH950hYLioL+VTWtoa27EeBFmC9pE+PksaQmxjLfYGRLpLYYSsiWDDoa41NeAxDkglLNzpqU6fdLxt4n2Jr58DbemQuspjW0haLqKsmUtTFWBO7mRFSE3lFzeqG55kaQJF7567c+C7dZjIjkDY/fJDYjlsTA5CJ3enSquh8y8Vq9W5KVBoVcCpzQvU/hx7Rwa4F7m3uoiK8G7pZF6OfXaTEGcpm4LP6d7hGYqcOUPTTGthq2iNhtvVWS0yJBDxR4vJ3LAwX+A4yFvKXmuIvF8w6JSd9L+TKJ94Ai1ZI5gYpYZd3cJ9hkx4auXX9/foXOghiPHeA8aG4p9b5MdBiF80a4tP2+Amijm38CJU1zimnREDeOdg1t3hlQzUaoW58HKrh5sbqW5utkcozaXJmUp6HI43nTO6FLfAd0DPwO8jjwUyBwSQ9tMpn4FX1JT964fTKtDgeot1fdHk5swjv0Id7VvjJQ+9Zy4hpZZxIUf15mjIwFOesfxPvsTX/0A0h1wkR5/FnZJ5Sbaqu6IMm84pe9YsNG6tRPaktm2VwqdpPSeK66gs6qX9OyOLhZR88VOMuJCxNNGVbolSa4fHB7wBhm3JTnjjchWucyzP0VCkZkKKfg30EZ2ZogjqsP+aFw1Z2+H97PJRxRgwAJh460BuujV4Y0ftvnI8QwWz6saW/Q7ETKjEk97/eYSyNm4LD6e5zN8yCYz/VcCoP40UwVGV+El7EwYj5MottnuAQrEo2HSZsSBmpVc/+4eJqH62FgwEEtkQ3EYsi0Mj2hYgf/2SmZvJPAAmYWrom54Zp7qABvngYHYZkZ5Qu9gWrylm70hT54+Kvg+7+FzFWkP9WC1j0rSEyBJgx97i4O3EUnwR15cU2cxMy2E5pwbw3xT1ocE039wVQzOtc/llyBb9Nt9CO0croIPGW5LCFRDGy9VOFdwhMB6Yy44p8IwXMi4k5OCATuueT7Mvm6ws8BQz3Ii1NnJtyke0KeiLIyug6WwlYt+QihR9b57DrZt2FOLa/gJdUtqUWc6CLeUn6h1mdqy0bwG3dSJVhN5H6ZCHvO428NGwNo1+wLWITogXuejpNJIxsPpTWDoYRsajIEIZ5eii9mnIuIKoJ5KC5fp1RZ87oZv6MqHjIfOKg6ZTgnaOoSb18U+erUbx2J4XGSO8gMuQGy2xm+hH+Ew5NJ78Hs0/nEx24A7A0cpgFurc+2u+isQaP+21GcqNCkvsJf4ahzpZnVvI5CBI1R3+Gb7en2ywKsfYeEpZEU8yoR29jhncYVoIXsQnq66CWYTeUdvuLbh9ro7LfF0HvSMr3OFFPitZViKP5UL6nDj7wqJD+FcRPc4jjvTOpIBNwFqnCirDThVx/ruvTVAwzwq98Vtx7fcJ0jbQ3mCDY+CUtcEZu+oH8AVutYwUZWcUTqFtHZYM2D2D4HFi/QsjtTdHBoKZBsrGaUvLT424bqBoX8MMO13RM00MC+VKgDd3riLj/oLsL5aDXMWfHrsTY0R3GSZSLDDLsOLitAm8x3Q9zERFQsXI0gx6OsuEbyRO2v+g348e6TpZKnht2o+JWWkRHKx3mbNSbzdnKcIPi5KniGWuEy9FhAuKPgeVY/rZstEtsf10R/H7UBmdmZFBxFBmQ9inXtlVOo4Q/2TNhrMlYclKGS70hOhQoY6jKejxUfn1a6VzJsV/wUxIrNGmZC1iWwp4OtsAqbSGshCIkyWfOL9V9iR7A3ZsWdfIUflqfcyB7MG6PGT2C02Aj7K7RTxXYY3teHVPWEPvaz07dmxSCupETYbLDDF6bAT3dTNBJPDVFmqCjnYFYXwdMVSQMQBNMVHrmPVr6WgvicUguseb2wCKJoxy7jICltP87yH8axlS2ye1ZxVx0mepobgMm5X+wsW4rkM3ZY7pgVFXiPPxCIR4Qtx2SNXBZVsy1HqQarpJnw5R5hSXaZaQtfobhOndi+1DPWEh1Y6jkYaHy2zHehLWK4c/zK11Gk3T43RH8IC0a3xkZkZsxT0500HiBi84bmjAu6l5g+qUONNysUHEpLbiYNrCoNwbuIBJk2iDD+O2Ah8S4eKE1ku5xeZtqjOVCiAezabDfk/6axcNKftIqOapzYZtUgZyCyC1iJBJZ8steWOJXyaQEUcG3ewTsyfuPZQNV0eO3YeBCnac9OktTvtBmSf0eJUObTp4PXveZ4XoTvCHS9yIz7F1+Qz8bIb1zhC0U1usqEaJVpaYrDzYsTr+khQzjOaAG4+SwbKy3Fuw315bUOG7GbobpGP9HGuJtix5HXKzYT9FaWYRW4ZdFzeDDaM+3ytiNuJSvY4P59Zpg1RxXnLrirHwg7d+rm30VeB4V1Xj5vA/LmAd+pcPiCijUTJAOQobFHTwTk4MRJ/gAcFMmhlB7xUNGty6a1Dxk9l56QP+x8Ep6jFUo9nUmcLf6wYJ4ZHubI6JO5B93hiHtavlXT6NodWQL5k3F/MHPFMF9H4OPRy799DmxrIUVfvQVmrhctzK266KCbrTsmvafluJOhRxg55+l2MSoXwQFIBj8Wuet+uI18av4lv1u2d2hY+lLRshYtx5Fbqcsdx65DEIWxY8Sjm9vDEdFTFfm5OUmfskf2U8bcpSnPA/E5HSev863a4lakg13v9oSMp2ildXwwDVJgoSUW52OYJ7rZzJUKlLwLcSfTcg7LSPKvJC3NmJsE0z+jwjDMEdCj4WnzVCZH8XMYO23IQbIrvT+N49heUVcVcldVJOflHfn5J59h2SZqRAhiKoLA6ziDPnYMYajiIFFBFD2RMWKGqylrQPj2a1uh9uf9htsWJ9y4Hx/VHgWaHInpEP+lcH0naPsOBkUN0cZGfelI/bhj8i0RbB0uh0ptieTB0Hwt+lq7b8TQhItbZo4FazimoWEjAo9b3fhSAQYm4y5r1I6OnfqSlwoYsv2MLzk9lDPT9W4qsN5epCsVgpXbcaVNWFrozfU6KgLJW4rbvwVeJNtvSfEd1EgkmyjTxV5cp8k6mD7fkXj1ecb0EbYOIZ+ENsYiU7ajETkS1lXen4RhJk3npkFghv8623P3oD9M2uKqf/ENo3aYKXC1OYBP0brk0TBM44jLy7Ma7Lmx6+4NbWF+ihU/18wmInjsOcne9lnRpwDvobSrwaxYdJo2rPPrsAE722LnPzAoq7G8jmUwq12geMLZkkZJDt0L3vS3EqoXvm2GkxHsM4RcKfOqMZ7Gu5AFY+VeRyGlgt1DmYvZ46xPEobQwmFzpe1FvpXzZzp63bKBg8u8uSFPe04NA3IgwGtXekRdH5n/QLY3dJvdcv7dpzMSrdsj6iKKgC7cfDhpgFzsfIVYeipN7y+NSsvyfs5X81KrI9tMZzwOsemp1Qa3cnJXiO3vUh1Z+8t2UkiiyN3ntj2czKb8SkjQxhypW54k6FdKes3yJ7Oh0o7/nVPZW/EOkQQmo7jnMx6eTm6a+AIB48V0674K+mfoO/L53rtkdB6VzrGRiyKKml12BcvmRxrB6idWq5Nam6GVeRHpTd1EWvs7vNjOXDLewwmdkdAebHrXB1cda/fQ6k93oirJNaMD20GFRQ8r2fhGwKQk6t7o8F1jaXhmaodBA/TO1XEpRzde9nRMpZ/eVguApGv5ZnFXop38ypDs6z/JY38sKHjJJJ9WBf+HYEVuZgxmA6zIQ8MO066T8xG9N94E6ncQRUZqLXBG55Qp1G6sGlggiJJBxm2xGKXVYfS3drls1mTzWtuLSZW7TgDjplzE2U/jXuMo39logxWeq/g2GCar5HfnbX+PSyHbl4rsWFTHU7ImEZiCR+Cb3K2Sgmvu3dKStoOSKlve4TfK4OFUfTWoyf4YShUPA1QV0rdgkuInJ3QM6R0Rg3nJnlJSkbI0BtgAkGDZLAEvPJE0epFbWW+Py0tHHuzRRtHF/Peo3xc2jdKEm5EpNkebdo8lLmVkdqFo/vw9vt+rsIrLXjUPeoBjTSIHpvgOrReW17HJpCZsMW1MsZvfa0GrdzJaGZMJ6uO/GMd1VhVly/9o1npGla9rp6maQkBNIXKujFte+ihA2mdKaqPOR/MDOUD6PJvbFty/JJ5sR3WV8HGcVKOihpYfh1ZSvDz8wFwcEuI+/ykuV015TEsS7SrmMZqn2tiT6zVzltkfc9Tb2HnvPJ7rI41d6IavQJZ6Rs2XdfcjMDPnqJl4o6Uqi74GwAzFRmz+IfYefkuj1oYez2hrQ9xqb1etU+WnxWSc3EHcY8uE0ElMHEbRJ9i3M0lOg6uSLFqirxMyz4sPTb/oBLeNVjYCdYUVm3Ff/VGjqdI8Kbw8m6+bnCv0h8GGbUWuXH4uckHdeb4dbMaK9sMuxeMErsIzSqVDYUujhm4gIX39N/ph5VB/ez3W8CRJAy5KsMk/ryUQcg5BYNWbTGKRR2fOGIYtc0hcNavhJ0zwWUe5kEHiHliIto0gVIBqj+bIZzmskk3RdcXgkvCr9az5S3kgAH/Zlm3qitNYkhHT1On0izkGZhqrJpfR/iEleqa44L90FOOPmIRKoij29nKXKYgi3ZlIG0idn3xKLo2pLgFxSVmBDbwiJ65oIWJCSUhulGzt/n5+KSRRbq9QrHASu7qLNKQj04DmfFyCt3pu6TxvFNDMLVYhF0sTS5lvpjDkcVAjF4FGVGcwGX9g/flazfKsna0aDu/imxRAdoHLMLIh7+Ie4xW20YAX/YgFrlhDeEp41e5phCTO0nkw5/zOIlWfU3tz8NWChWtS0BwTFWmz97njL3Q70h2lBDnODENGnOHD4T3hJqtdZilalBX02vtXZnIl6q+D2rn3ySYBpf7Nl/Lvm/30bypKsgHCc1rJikrzY7gbrwa4rRaoYZevMrXsCQs/bu2geQ1A4WpK3Xh1TJzoBJHXCNnjEdYCqwdB2u2qO5a3pZBDjDZAelGnqcK0BEc/9ZuCJq14sIbJkhpBF87d8OsTdtl/iNKGT8qOVO+1gAru2Eguun/IgPo7zSeMprnwsJvfEorVSiI7B+KZ3TF/jU9rAcVbG0fIY+1x1hzZ4B7jBPaV/4KeFumCZZa4ga3AKK+hamfX3+c2P1igTPvkvVJ9sWNNcRPDlHkEYgtWNtvyTOiWhZSIvim68yjin8WPlpvBrh/slyLB1FFQ/pa7Q3sDp6718Pz4gSN4NC7w04XicqTj4+kfUtmD4wccHIb34iafHx0763paha19Vu016ty0JEN3OW7abuO/LOn3Ao7I5+RF9k0O78F08qkSc8/kx8ElUaPbxXm419XYiCGXO52Rv2DYkZBm+eVlTBMBVhfBRkpy76HQ+MjX/7EArS8q2sw3l3gBC/TQTzdf931xHOt4k1EEj8lUV6EbWJRjktGMhgnclBYimpQc72B5BxlY7XKw8D0UDccrd7wDl6UMPRJBYUbZ+/oVYoe/i33wpS/IegPet3Ko4dKT4Y8UvmhJfL0lNtkOzz3Fvp0oKVcufmiLFP8nxYJLnHQfOtFALM0In9fA8EIngrIkogs1GUS06F4PjbXTSiWD+sUniVaAaGmr9JrZb9BjKRo7vC3TC7QgFR5/UscwuTxGLNYNx5DKMt076iXuNC6qgMqW4mhVD0rNNrsARWUE+kIgGQ/uvWt6G9rBBrMOVgNqqjnESNeLMhrbOXRmXMdBjvTN4esQFnakAC75eikWVAX3NvdXXegWcha8Sx22wqofaSH87oK2caDkPT5SjHYgvUa/xEvw8hBa//2svYYAveoiGiZe4Om7kLJlP9Hv5NczYdyn+KhunH4CwYony+Zqa5vuU8e5JoweAUr0e3/wireMTd0DjremJxAst/qVKwn1+mcU5QdfnPdzzZ6bFbXxHSGpF0LKhky/btIChhS8ZaMzI8TSSgbuOuQscSe9xVtH628DXcLHUdqELGias3F4pND2zfGDM633uXs9YQL31lOGj1Ogrwcn3qNj3vlkUSPBeUqYXVLRsAXwUzcC6utaLSsza+SLMTY2Egrz1uQyTJlXbK69FNhxyp6xUv+Q9WBTQa0eFAubOjMlxS1uH+mRS7Wvbzqr5UH/9iSsoRrb7JHyTzj/N+qeXBnYh73t996TZFRDdGjIAUKAaPFLvLuAg+fqKtLLyZpEOy0IW/0yav+4AMbIXzi4FX60vvo8ECTLShwwrw9HfcPvpxSkZS7IFxFnfRKy6xKuh+XU6tZR82X1SNM8u7CuCC151xJn9FnpLAxhLEe1Dh29Vs9Xqg1yT9h+OZtqzMWBlAZbPfRXchYwzpNC8zIkRwqflEkb4I94AZevU6xV9b1PpK5oKCYSxJLQVcHj6XLTAADNhIEnL/W0Su9SH/A11v0Vr9Z1C8z7x4yyOhNxq4+YsGxKwPdn0KO03UoT9ju8y7un/F0U6puoLhbQp5quy+cua5EGrFbocrbSzcEdQhSQUGfrfDF0AOUim6gJD6NBfRZFBpDgH4MNZE1aqRTQKM5jxZbamm+LmykU/e1+rF2Oe+z6pJasgZzvf1TMvvQyMPELNwt1Y300ZW34VHFlMt8Z9sZ1Np1fAcVWLDRvnQQsK4Fomfm1173Xwh4sUFj8j3ERl+cpZKONFZAYhcz9zKxItZB/hqCzzwxUxoISiNyTEVPNxRATqJ+3L0SJ/pNeRX4w+P1W0mEEuwRwe59qT2agjhRiasbvYlWGU4/2pfpSgNFzK4xmPJdbZb87Kuk4vYDZ8TuZfrHSVlbgDdy/27sswDL+dnTiNKqp/BxNbcRvlVT6bFn/zb0KV8DRm8Yj+NpKFw3k5wkx0Psy6YWGqYRS4hkDPgu3+9GL9edjxDEIdTSG8FssYNUmUivvGSwRcqwI2yyE6ka++me67CU6ZebF2EENBZa2tWC4Y0xWpmbvgM6rdpEAX+zQ8OpvU0xHp+5bwFZV08IEnZ5YomXuarTAxFkjI4VY1SYa2XDyv5K/YG+YDFO91zu14+xX8jJZd2YlPDkq/2Ra/itIWSqhm4lWdyuq7e7lr9x+xrWftwNs5tAmuswulBdEN82TS6BHDK/8RzwzzWuEMHe2Grvi5ZXLfF2y3rMKNYn+6yfGlqBMHK0y2VpMh1OgzY6yr4Qooa4i+4y/dRffHvbLYRRVdZ3Xzfqw3tAcdX09A6vR/eAIQ/ypwtOSQ+g0BO3Ro2wGkx7PMpuu0IPwl30t6u6JfK9dsma5UFvpbmO53h5hl8h/buF4V+2Bsk95eeXV8SOaHyyc4F/SyeBFbCwh2VAP5nZvun8/bE2y9VgCv5b9ZU1hUIwNOocGdt5n/jHMIL1nKdhIDxNgFvvlqSOZgkXmNz4Dcj6zAvjJ3u0IYU7V2Pm7/BAltDQ5A5oaQ2a1AxVIGv1oUBLeFzkdvchxq61RdzzOWJ5xSCgZODLl7BI+j4GPCswVfr8BFj1ZCHcj/EGgqR6W27FW+4yizvizIBvPKHnnLwiPs20osaR26iGqm8GXIUzHKTNJDcM8/bJ9DxFMYhiIDVxCi8RjEf0Bk/Tw5s6E3xhgm6wdsbwr3ydhgVyv/tmUrjrxI78FLI+JGwlIXr5dT0Kg2QSM9lJ5gcXrzKXDyf7Q3ZvicjfwaZEUF+9+Ni8VuRlOXWX7/o+ihMSHNeHSIl7yaUWgelxOM+F6DzBApvZ+5+vH2Fu39cYuRcDTcvhpF1viknFAQYpB0SUmqjSVGf4YZ4KQ3gZOI4FtV5FW0jgRhzJRFMSKEGoVyJtjYhRF/ouH3lLJHRfXKhOWZtYf4BVDZGKq3rw4S6m6bcbZ1pToqykxP/JMaYJJHEfeyL/nTY87CVm9N6wsKc6cLcl3s4GUdPy0itxnj9OgMp7W6GHZ8O2Xd8S4+0SiCRZXh+pSTOvPXW9JeQHPhY6fFMeuY/ffpH0PkM1o3+RR8VPsrB0yGqcJTa5Y2vDJHbO6K/4Ev07KpqyYBBTDxkujo0ZAUeLPcs7vTB4Q0zEnB+O1W1yVFxavyPHXkPpEtS93oRWwtju4IBb8SzuoFOUh/Ay0gwLZbmTya8Hwtt82wrurnEMMnqmI/JkzB9u0GoNeajZuNS+JtFV7Q7z+ouwOA/bf1fzHn1U/6MK2IkqSU+/qVPIpKNLJQrxpcPtRJqUBIJVIB4zeGdsSo3ea88H1syo3iWZDUrVFcf6IpjPRMmA9kgi+fpFg6NYmINmwnV1uW3txUnWpRZXBNLT5ONhOgUGzl1+3QpAnzXpzAU/4TqA563eDfz9sw/UMtp67SuiEgXG1QO3Y0qALYnXCLGbS/ig5Vc2hKGNdjOrtqNw4jVZ+rjnQmQwJ70jlB4D8FwCWKN6YE6Zirxeo2ZqGUnggk77c7bA83kdTFuv8S7X97lLM/iYVGywbiB73+p5HoRKDOuZnb5m9chkoARhpNF6vEOwuIAdpBZ/h7UQtR1cMK9s3rQRKp1qBwtj750MnTD3mMgpxxALHyZ2gpV6ZUq8tXpA26SUtPqqElyFk+MxFeGjhCQN4k9LeSjC1trqDHn3ZaQFlX9HaGibmqtGVTCCDVAE+jyh8XB8aqLin7t87DcT6H6GAmp25+kxYpy+8nGpS7xdBZDVYz664eoT/duLebSnVJArY04B3wkysSvptYKcwzDRhSaECsdNVg8JjKtFPEhQ85df+kddmpdlhrwqxibM56zDGChA8xrIgx6wFf5V9In9NR9uLD7qVN+Wq0FkHd9KmC1aMBQ4DgmyKLfgAiGv7S8hc5t2EPNupw9jsQFDTNSZKq89ZMtdCY3cKBwXu0nRF3xhM2SYDFQGKR77qozUBtKcOiOC6yDarW9sAaYxXgYRCYOzyF9jaKfWqJVifAHLgv/N1EJetRcBb44hBoMZzXv3sZv/6eN0LigVSPH13PagGgBlTscORXGJEpm13IqskQbyF4C9qG1nZRRkWz9t5gVpV0L6Wi/vFyhVUUOlZfs2tswrIJQyfpKHgWBETdbekwxpRrvhhxxCTrt6C6FYMG80LaX08Uyv48A0DWRbgXwe2dYQJ/tvKo445IJ/Xan0SgEavKIElqOV1P1ViCZyLX2xpJI4Sqgc02aNTOpCgwOHsI9BOeklKRg4dOJ5uqljY/FPPluk16LI4XjFpntTe0VlGlRXDr+JHuE/Pw2zZPi41b8KGVsERUTgmGDKbFrtdTHlloHKSK3baao6QNprlCz7nhB0ZadYAoepvTda5p42pYuvnI0XjAMLiB5XAkzFMjSZzhxiaQYHmyzNA4rq9/66begUNYg8PeYUVaCbR2y6ZBIt7+cYtAR5lOtTHVU65JFpS2/2udDvfsZTd2YxQKs1ejf3HWVjkc8y2OKYYyzIQivtuqp1o1r9FKMG/aCcWVpESoNz6Ol0DN4WFsIeOgCud0JROW4Ofku1P3U0CZyYpBkY8Au1tlsy2Bo91iFC04JyQ1lo61p6AXHjhnIVmoxir5xoCbO6+9RRgz9LaJflkbd6XXEE3tOQ9ocmE16EdePqkN2iQT7HKcNoo1yLMByj7pNuZzgOAh7p8FHvagzWDbK5F8EkBofBUt6V9zvgSu/lOXh1gA4N4N0H4HKhr+Mte6uu4DAFAxs2x2PKCUBjR+zqZYVDhcaaHvGh7/oEc/JACXD4MDxnpjTZ/irft6yrzw+/VX9thVfMNJJvkYgcZF8+IrwseSefNOLZMJHJy0KPi8XlJxUewj+SMtziC6M8u6cAeBYm/mbWQYYSNMCF4kFIfRmQz2pq1VKrV08RXaBWHZ3kiOm973e2rA4C9O1AyZdA2WQfJPSE6k6mHlN0fkJS289Vt74KeViof5TxOykc23B9dIGIwB0Y5ZNQ8Dy0a8uTblEaMThpNo3uW099TLFJDtMocIbq185Pa3PhT1kV6pkO3u6IEG1UwTl/E4anHPqUI2LKCL+XKwFQwqgZU0YND7Vqe+seIqSMy2X8tgZzRTOkwFOdEnr6/1ba43jLqmB7iMUgQSfhUHTWq57o4wdwsumR24JfFUtq41153iuJFTKVCIRbkpx4eD3sjsSRnJpN1lBkxK3bZhbER6zmPlsD59vBx7+GW3XsrG9b+G0SbXtZPzpfcBHJ7aGTA0Bkzt2haGPxmf2S5up06wdo2eOSE5lA+nBC0yp6otyVehoV/4wNiQ5bAhiw6n4fH6Pu/BGXuURvJAU4VPR9O2JlFGkI3vjsi5XXgSUGpEw0PxqVM2FhXs1dzLBFHXpBJRNuxJHM9E0xcH0xpKpbi5YLBKq1iGmECL+FppICN7Ewv0AhXJ2zzUGv4hx9ZLbxIb5+u5fivCAFaMXKURqmBIIApjjTl71LwzjRVJ3K6e/0JOa1fd4S9DH8HPecjrtZJfwlwmGZmformVaUGHqYnq7C8VU6KuLDILN9Vmm/wblQHB0kivPm9sc2lvfAyN55yIps8b2HBIh/F1KcoZJQPQU8NQVu6oMg/XiBirrMN/4zBFVZ8ctLdjptZnq1CqWliO6GZsm5kmC5PpCjG4yytpgTb5U9nU+uEMyS1OE3XMmRAfXGFgl3aZ9l4zMMkPYOZdbAEwUREuPwYvq7KghvGvq4qdZur6nqcISCvN7+t019SbWMnoUdG+oUNdyiWd7v0V1feuNt5uz2Subh93nDos73YGGGkG9efwODAUj9Dd0eDNZcyBcBFY0rdr/YiGsvGGMhLaxJoNZHQxCPVjQMwUa6yJn7X/emEgMFxtYeeGj1ktNGHe3/JfJz8T8g+wpz4QtVortz2oWA+ddlChUZq33HI8KJnBezzKN7+IEq7dmBsitKwKWDXBQ8ZrlVA0d/OGhyO+E1Cjvd/wgjCy5EKSFVufbcOxs8MEAoQODy28tpAh0Jk+AGPmzutZK06suXttG3cju2X0KYUeR/Xg1qeXXTztROM50v3bMOEGcWkLS4OoFk5RgBZBYXcrMhlawVVXrBNZi9094wtAJjJqYk1w68M7+TMMH6ZlHgmhLX/0OA+7EVftxb0jJR6ld94iwlWdVELbr8donu07CDQgsU7lg97o2/RPwHxxC/+ytCKuPb0jmuqTAmQYUggXkFnbeBG7MzW//BvSGCgi4jo+ehk2atJmghrBgyOnikOIRUiaZzB4zL4FSzj77urXiXWigJ6o6lyfe3tC99kLUaSjaWukgnV2j06kFcpAs1VlZfRhziUK49Dc+mBTAT8TyHuh4yWoRUJJhU5cHVnNX7lBB18ykRjhtw0DQK5uKR7yqIpz9KCt3EdXDG8E7DcV3TLPcmw1w2FkWZuKVZXxCZycRr5Y+/eIJHir2D3H3xsxf2SE7baZNtj7kyEBf/ZYIyrc0LNhhLy7N70k/4GBl3vyFQxVIlUMUAyZd9wV2qVOWfn3JvIjQDF8wx2/oJaEyzCFTGI/OoPNMMYiIpVkFYQQ1DSCWnRN8tXV23515gBwrocBQVuJ4WXIvW9OUJbhwNlVGs033CfY4hBltfaQCJVYZpLiC/SOx1bx7GYkrJDSpH6F5Lsdhxbbe+olKovqO6+KFfkJtgQ35/aIoyaklyGbQnQ01T6GgvM4vllRBayetcpO/rgXdMmkNAV90PFZnWI6uWiz6gho9fwJ/6AphLolw3NkL57xFgZSJ/To5YmWYFSsJPyi3ckFpMhhcxqOvsmAXImWJa6Qd0GkTn9CtxriATjOILIWbYHPYbAVTbKOqW1iJIgb+GvVPIzv37cfrgjiNAG4A1Ivd8UCbNeFnObRdyyfQvDq9Fwlz/lBsoI7xm1jFh1xsb0zhJVWNtOcgCow4cYwpdUz4esf1bEO6Vi7rGMMcNSjL6fhE6uM9cueNsflvwpoVJVcbceDTggnCMHnd01Y2gBMR45pcJfyi4vTYKRVBm4o4Q//OUWBGexX60ElENvVfhcR7cNXV9OBTYpagUrbzjCxqScRoEyBaZN8goZchB0wkSQwGi4qJuJ4u4yTG8PPeceOgajHJd2+uZ4f+AUlIlKtV3GZQSIK3V8jPR1UZSO1L/fHm7XcrtocREapafWLeIX7Bwb5/bAuNkoPqzYmNxnzVlKwoRGJNiTK7WW+q0p+F9X02ZBw/gpZjstT1t39sbEF1ahzkDwtSvwFUUQ2q9vn3o3Gai5vvZhPZqlnGf5LIU2QXeOqKLQly0JIVEJYSrKaI9cBBnPF2jlPUfPUqswJWrXjx/iSUWcwWaed59jF8MAhvAtkGNTN0uCbgaAY6MNmGgQsTrAnwtCzxZgxcn6yZnnsyBSx9H9mvexh5e8K3zWQEny9MMsWu9V0afICDtv4BoI42J1f1J5of+/Pak2NiLoFMlJJWbMDPT9JmTUDa3DZxLkruWU2W3b1QihbwqErE5x5XNwdMvlk9nreJPdEXWJh08gj50dQmp5BOYMsMkMOBX4t5efxTOq4Yij8bBumniCrRsIfpKiikhO7Wqu2ZDQh2y838UbJs9Ad4c8XWB/sI6jITiR09/0XDTcydQUcNk/O9xTqdtZe+7FRbWNWDQU2bq1/GKFfIl4K9OPKXa5IWNWED+OTPyrlD4ziVdZ6ebAgFgfQ2fyPrfuCucyyv+1hktCAAFKiHNyFYBrLY/PVMu0CeV9uwxNrAmTtgXg6Qqena/Of8oxM6qukPcdb3IhTiWCy0TWr6h7orL22DvtMTq/BPuVHMrU0to6MP7+s+rWJdqmWPVOeRMMXYAemqOqB9/8vn+pBPs9ZA3U+VxGTxA6JTaWh3HT6X6HDGQDejMgag1RR7soXORTyYPKNlOpzcoNZuFOH/YQwLLxyM96eRtIt6OtV8Copy66sZ5DpAeFqLxiHSjRFCGOZTUoEG4vCHGkIMmSRgKw5eOHIodV4sMv1nWko9HD4dU4/0T0yRUWYdtHIYBxXM+VoyJ9xbpzbbPYIFM0J/KwP+CfOeiSZE9yJ3t9xJcPRMplCX/6QJ7Z+s/tkODRzQ9EXKzXB2dQf/LmrP1KkYLKz1A6tBspBsSt1Jxdre/JbX9N/RViBzKg52Eu+QF4gJF2P5OZyjLxEdu7BQe+NufKNrOs4r1MIa5WRMQl2C9ERV2Zk/8EEPcw9FgSxbt25JXWAOsNCmQMUd7nV66zq6TcgJCNtggGlxPAZlPmaKSkb+Bn/BlOeqc2NicJLM3sOd1JpL696F+F88KhBFDh0RBGIrgqwYe+RDc9ud+7vy2qTQAnIMPlgiuFSLeVkYMzjiJzRANKSMv0cF+TlVGG3ufwr8B0OPnx9y9tPPwZ5zY7JZw8syqQXPEAVjh6k9P+HOypZtM68Lno0F31werZyUMwNoQIRTVesE4++1q5N5QMI7fBz4+anVmvIZFkvieSYZMvcl+oflg0EPYghNoLtMycFUvaEQP9hXD0tzVXgKrs/YKlh2pYD7ku522ZgBXHkEZJvIFUSPHoWnL97Y/4LRO9BjRFvIVI/1W5KHvWMuVIBhItuxEswWYR9zsAv/C0o+jRq86a/MQERC/gQmXsde0YwK9V0+yje05HD4tyzclu5mhu4K9Y5TBOddHPFVPYiHXo4M9Itvaptv9K5L3GAkicOx/6bMNZuaAgBfywnOZdRR8YccTk6GGqNFekgvtQrdj+dNhgdpbnMKZM/mMSlMpoA1E9ff++XTixzpJ6pqQMVtLHgB9X1gzYHTJjev8uKUlP0g44Mg4CsWBRGosDE2V5F5x8FVYQfGTU2D+XpneR34y4hQ2u4/RNl4HkSSTWjcJck1gI/pXamzafOPTSeF3emfXaYTpbN40MK9pgZyyL7jsy147O8bSgrx7+Z8ox7fmTTFrxktk6uXM4310+kjtMKN41XNjn6NyM0ij8R5HmMxq2SJ6QaBbdxhzKy7l1Z/KnaOYbmFKdUncqogyUX/U9c56Om7mw0kp5c7G6tpXbmCDt9CkA4FbYTwes4NqjgMTLd6QUDaEXX2pjNeqz2Qq0qWEF3nS3M0+siF9MKYaciNYyGHYQI6rJDQ05yO+Pb1NbtdhFgQQ/P4SJ3I+bYH/Tf5OxyIVLrd53/9Wy+hRL3lnEr95o0maOqj7no2/DodvNPrkyWg6EgMGzDxRpO+zVDrAQcZTjQ6Eqd3AWMo0Nv4Qd4THCtE5dzcDz10oi+0IDGjP7sOANBVT882meZ5HHeCtUIP5rOg651VJhAP0HdiNwVFFyxppEOGbqjySR5NvDjUwqC/UOVNNhW2rkTZmxm2qqKd4l6UTFyuwMTrSoSOVnQ8cz1XvFzM01s2YPlAN4PEdjQ2rYsYzKXIaF2oDmR0gOqAS6DC4UgRUpKSAUeMyFOI9DICrDR0LoV2E3YSf3KmcK4Lyj0ZxlyqjJAWC2PC1p0w/AN6Oopw0pn1qUKo8GjX4yJrSa7oTOwIvM6Pt6HAku6VURXEUnx7PyOZVqsXDIUqxie1pue28yE+TVvS90YmF9hNdfpYfEz+RHv/B/8n9P2G9Wb6GQaySetT4ywaPRgKxJsSvj/1oM6NsIJFT2/zBCLdimRAJcQtPwPHIcqpYFSPrmrEzFxfw5DVaaVwvkKrf+svdAESmwiAHnjFaJ88W7dY527fVtBBug4R5xxmaseEpqua9CSNG206D+WWauP5xQ5U4kF6g9wi9kHGPsnE9HVE4rcMXxCZj+9bihsGaW9MvrLO6KBO82N04llhLi66GxlUsrInjpDHconYSImLsLQNNdmQcH2Ji2iOKhNsq8vBsyjiN5BUEJZ+Iz2ooaUhYe0/BeDz7nOvr7ob2XLF32NfFoOf3ERlie+LqCI59qPxQuCz6Pqn+nX1NUKSuI6C3OrTPtylMCqusvSa65RdTLbtF+tQs0eq7hfp4BhP9awE6ZKUqlnKl6YQHfRdL53souV5PQKSztZXkupFFa4o/eRZxUkS8Oqtd+bnxWh21rgzhUFanLaVrRVjyP2HkQxv0BAydllnGYU+YiHlRKPHrCGQ8SUyYdnOzaMMLl/5OONwulOtmezogR2GpsLSPlo7QOoXXuYs235bdDdxAT3B0fWaU5SoWyS4EAs939n7/jqxG+fS8UHANGMxg+dLqBSY28y147vgqvuYZCpqsa3W+9tC4lKGJsU3HMfcNlEo5JhTCeb0BqNYQH3+oSFBVUIisvRlte3C/M5zcxGvrZlFn5qDphAj0aJFIqJ4u4loT4ssC95eS1DbM7f4xCrtZCsijUwnpwgaoLHD5Cp2iqdiObZ6vviMgK8gc5knwShrtwFu8A9kifzjTTH9dJVuyxuv95y5MqgRCgEJayD66wRjrOcL5PL9lDtHHkeuD4JOq2rhmYzDyYQwN00BdcCh2psc5MclXZU6YptgGYq05Dh1Hy8c8E59rBlNKqbpWeT/YXWylng3KC6zx25KmhOEMaw24FCWJu+ouzX9EoraEFNoxqevIV3ZhL/Zn1CncK5ew90KF7/wJp1/7Vt7D6vUTSAgfNFPerZvWCvH6SIy/y5RLCMvuX/r6FPSqQjDtaOHzFAcBqYTqKgNZbCJLklDgsaD3rgvE8yU+XR1jP//6jsuiBDl43pPE24TBcyk4/8jlKawdMWcqtebHdPVGCZvAeQPawCiuHBvr4iqO0jeT0Me7qj9j03LK5RyOixFU/lFF879rNpi1AllbiWQhXxnDrshTzVskW3acHXbcUBW1ScYo19tRTFcQVnhoo+2jpWcMJCt8F2hKu1m1Anhy7TuV7Rjnp9FY0k2kV9siPaM2EQxmaLTf4Us2gV4VhZ3rA+M3Xb6EGLg8mk7rlJUQS4EfmS9D7Q86tzulM47Bm0P6dCpA2pcExsaLeKZQtrD4bE0vCAyOAyYXZQ1VGVKzsOT7ICECYrwcxYyUTVUZLvHNuFcH8XJd6tYQDW/P6zEkBhXkS7u4ec+eCHjPN5sqv/8MElRMdCstqQLizRbkyKuErSR6piuCDq/D1S2UFbtCkRaX5VuD9HaZjwXfPwn+bqO+6nJlxFAMw4I570KqcCvLUjln50zlPCs5oVt94yhlnA2MPoSjzlsOaDkIcZLaknRrUkd4XY5PO+ymLqLOysb5VWfLOcMfNAsmV+RR4ejacgBCzkyIHua2k6ggzGSN3XnA5zRkZBz1TKLyl1p3Mk35MXzTUCD3L8Hww9Ki4PITjNIKj874EbotaSlKfFBMxA7EAAagU+dOgmYml1nC32Vsc4MNeWbNxggEA/a8+63syP7vDKgeLV1U4p7jAqt2toZUICTJymQS1ebQZpHMZTyQ1oS3WxCfqHHSJxgdJEZX5mpTtB5iLJypHXrLXWRod8iga01ZSotwpcQ98VzwAUIgfwB6+/RpmdmUKt0mNt6dvqOL57adm3AJcIWs4qpF/PzkNp/PI5nNmtYB/eA1jqum3gckQiz/bZxjDnyRiXkhEKcLL5iGKSNcOSUYP7kp/H18Ug18c3evZW92FwqIHJGjYsJ3MMtFNmcekyvqPzyzgBn4VjrFnaB7Hgu7Md+rQypoYP8VyYsa7iq1ZA2dz01pjWHMO6A8TVxZ5X+zN0tq80Z2bhc8eAXrjZOZglwKbGMAw/1Nq1E7DEItCIZ4KrSb07/OeMKSnfBS+KikWh6sjwo/mh6ShloCISrQnMZ5VTJVG9+G2Jyl5Crf3eob6rdapUL449uP91NRTYAO9eyS8uMjhFxI6aB9bIex4zIgx+udpZJoX/FX4YmQvg3F8gq8Y+WMBmSpR9EyBnxpLTFfFGvth7s6QkIlOLlD2CD/bW0JqRib/LpJBVyKeLePHgIXecbOGwwHSzrDhSLQArPt1LutYO4jzH1OMqab8aRwH75s+vBHRmDx+PQeRF5QuWbSn0k2wVN2/4ufa1OWiLrC5VNmwCXP7zsvte0GUeNu+oV4WwsRVelMxeRgeRZgeUqr+YPwH/EswRH7JXK1EJKr+xf1gM4Wu3jXgKP8c4uF4aIlxg9ikzEdQ5eQYssrTDBZ9/e61B1TGw1PTWXTrQanHgs7mGhCHgrAlqJzEHOFNs8sTySnhQzeXAG646NnfJ6RfiEQw9DJ+rwvKV0pz0takbp5wfk9MYwrexiZ6qnmXu62shKo+R/YUhuKROsvgNgX7Tzj02tLOuMS7rQGp4YSwHyt3z9crvXXErtwV+mTeKpXJYjRng+e5Hf6em6gQr9Kbhkz74x6czfNVEl054hzxf+Y1jrAv5k7Oj/725C0lDgiSrsgs6Uw8wkcpZxFi0fTzdfOPpFGi+Yg5MV55IPs8CDXhbwsT3PRstxcnSR4lxMrEDK1LzfrTnVLUYWu8eXBYic7CGam7PvGe3JC1QkxEgj3Pqmp2n3S16wsnfTBXIGd6JZvbYJQj91B7UudljwbFVh+TpcZ5gxESuLSpKnb6kE8up0BG4NjPF7c9PdELDcJFHiXR3WAyeRYxomnqQPVLPiThgI5w65l2ha14Ljk6xb7H2ItVaTwcG0jY8gYyYXtiD5qyrAH4nSIisqcwDmz9SOlkOMSp8x7N89UsbP4ciBI4kJXqtclO1AflWgZOZsV6h6oMd2/ajTY5cSDqxi1JAetk9eZF0weTkgo9Y6STIHpp1fOcMIxl1naJaz/dum2Pwg9jLZ0mjs5coeeTLU6CF9N87KxDwbRsqY5Hmn2bmiy5L5LFOJPkuv7wDRIsau2sovq8FF+/JbPerA6m+JrFHIKEGR8llYQ9d9lkR1yOC2zlrHYUmL1206V+K1AsG7oWenWHWZP/y2Qcx2mRAExipzmmP/F5yWJvIMl3babLjI3TQeKbW+WBWc1LkmNgnialzG3BtRCevUfPboyYfO+9WvzhqgmIH+JM7/qn8gll+Kwhylir7yJdvtPe+Cej85kQIi7OvPWdm6mxWKWvdPNkFFl2XoUR7pnRkTrmafmWsZRh5UT4MCocWMjA81ES2mdXamGO9iUtRV5IsnJRzIsVEFs25pP4iGzx4o5mQLF35gApNKzusFRqsQ+kY7QqqB9CC6cDMXVSJbTEaoVv3WKCRqKlouSBAgdZ5Sfa9+pvdkh3DGCzFTqWKFqfgPlfvMwMc7/5f3yFawv06jnQN6QEHfbm5/HlLxfiarH8Hnx1NJLDZ3JVmxr34yqCMbd/R/a+oe5A738jekGAELRaBOhtN0WQ0dfrVDkKzuF5MQiOJA27LVNQP9KtuDL3WyDnVX9VT2wYZ1LLvlIw3FtOYpfOGqTLyxETJwz22t7b/Cbw4tpe8ZSsMd5Qek09sgeOLjSBowA4jzHTOvt0gJQxiOpeSzHwD9IW2bwme4UKF4hxQIDRHTMYZqzkOlCb0KiBkOQQsAK04yUI2NVfuvTjh8ZD7QrrlEjllnzV84xSVK1/TkwW3PLiFhF6w6W/f4MsAle5BeAz9sDU4McKsEQTTJDSY714fqPlSuA7A/4zw7VSz4/8vlvb7zOnDPol2bnXjSSLQqu0FSt+oFm4WGpF1q3csGX3b0upYReTswU9QYsR6rLMeypXVlHTuo3Wx5CgAmNdS3Goo20vfX3X9ebGo+BZ5bm8QwdGWVDmyqKzVF3PsGUXNzuJkiwJqrBIcMYfQ5NlS3KrSJ1Azv7R4WRe8l+tAe6GwtIMIqf7faRUCxkBnq+xl9oGz/xzY/JZ4DPIOXWC0EeeIFVdp6dH9hyM/rZVqtPOd6Zf6Em29DHijzM35RqLxBkiO6Unk1/PCmXSMpcJZLCgXbHwzmrgowf6+pSmQiyab0dsMmuLHR1ze2c98Huvv2DhY8UDYiHfn/uhukKKGuxH0b08olNjoioc9H0fczSTCdvarQ22wPR+Yp7SL5m0t0CT4lw8QkK1wjJYHd06L5mLgMZJl0/6miy/9bqGbZvfCxU1qYAz9b0aWtY+rNaUwuVV26/wsQRyAhRl1iYTThOdXobZ/3fZ111X5xSuL82nmI8ireBirlei0elgIZ2iKeARBArUKMWxQ9f21Sr+RReLqtetEhPQ8fN4ss1aRh0IWMMiHdVmNqkAxltTFC6+K0N8BXIAqKw/kgdtbcvsnPG8E79UjWeEHuIgt6HiYy/92HzSkFGPQaQZrDkHSPDsX55otoH3kVmu8aOipW1n42PCwjEAhkBJ7ZxHb2GeXRqozAfYENNpcUa2/pVrzlDUhiaBMxAXj/+SKVD7Kv7ebCLDpfiVK7ccBrU3wcnSsPlDYtUgtYhYqzC+hBiIZgH5AIRyewckXYJYRz9qKwbRXw9EiRDPgnhsGnbN0QRWpQVRfjVA4HU9DRELUvDZu/O4qhfdVRHab1xzBkRDoQx/cBc8es9/TYFwT94MLabRb+O3jyPCMlwp4OMQnqZagYbqqZc70vmb1yoMbaeaxT4gc/cqGXX57cvnb4cyzxGBzpFsh75ev8RwDhMkAQU2noqzMTB/54/sHo469UCQSp8IKTBnBWEkn8GykB7TEut2B/Z/ggntEjyT039FrehodPlScH0pJRnC0j/unbSz7nAN/cnWyU4lYmQ0f94Iv/g6v4i2MbQr95mGu/4omtLTmK1tT8H21y9/cV+H1T3lqZt6yGQBf9iHpRa6HydAydrvSeJiXQ6AriyRQjTQcqVMchstMlMd6WSfwND4dSEwHE9b6xwBayEIEUlfCLFfCAVkOT2X7X1YOfH9lb1igHwTBguPcIRguDYi7kAtyZowxuHERajXSzbmbbqiU/mwLtW1cpP6vjGQwC7CWFXGQF0bW8PWw5L5dVWPiQLMOiGMnPXqvtbaG3Wu2fKQsfbwHUPN5r0EDrJ5YWhluLz0eFDSz2rpS+pZCd0LKlwIJJGuibktl4dGXzcyr10dtbwJ/s9sJR0sXGci3HV1AXzsblFN+wAW+lDCTZNTK1cl7DpL3a1+8RcSUqhDkMHyPRYHeJ3AXKOhbADDClBcJVYNcEnC3Qr8Vjc2LLNdqNSeOKFI7IYO24BU43+xqWfVt3pgdCxOgGQ8gQJrEJaPMn89NKdQL12NO9g1zydk6efjz9806eEnjI/P6oLVMtp8LHXzSAnhcrrL2KzTTjXlqvTdUtZfzzCQF6TKoBmKvBgfZhherIMpqsiKug+5zAGQD3e4dKTNXR5yyIOotH2xr8gGDBA8Y3ORc+GVcIjiiH58o6ZKXSxbXzmsilkNap03x9C8UDh3O6qDJRAovJFPCXawj+OeOqiTDFS+6HF2V2JZHLFiJu50FefWXdokqjz2113gsCSqqAv9IqqUEumhVCn/x1TZIA2DYkp3ZjxEV8VKo/Ukk5A3zmkltiZW1PVlEw3AIiolSzmWxitlVau8hEBj4VZbpsAuPvYHzHNfzbjVRA3uh536cOQdZ7vpGkPA4dfKJ/EhsMPIKyCzE8CC/C5amozfr9teAwMiCJaVVIKw+2AO7nLy6c9UpUUPfY1fR7aZpM1XEnpfYJEDk2Fb+UbmB54DSs7t+T9dhyHW4ZbIhMeMRW8KpwupTaZQd3JV6xpAepXo81PGgbPLLcmHn1NnIRq4Bo3GgXiMcP+AhQw1SBiRLZYuOINu2FyiIyUW8xiNpfoUhRKSp6wHcqMsWZ1WcVGasQvLiBAISZon9dCPfgm2mUVjsdd8xPRpN4r0o2S6LvtYct7BEqLU9IsB9O2t6kNKJcyCi0jAKZYGQS8TpmuusVrqmW4r5jwIctext1AJsWBDbGiENV0ZFC0RDGk05jh6SZOjC9CHZVnit4enRW4sxvkHyKC2ipbiFkcNhAblnINjGtdXNH+HjUFmuUwO4oCE5F6NISAR9AakXEfMgLBFnqGBGb8MOw1Or+j9CtGa/QtsGoF3JEG/f84vpN+F8F5J91oahnp1qaOR5ald7Q2l2HL9ylIaMl+t1IyyxePYlexn6qIYaGdddd00ttRhGS+pbAGE0+XQCz5HTwURhH3QLxq8erIqcYF8ItV3g/DtU4y2Jw9yCyHh8PcrMIYdDgX2MPFi6KXn6glXCM7kw6mQnvxnT/qbtNIvQBT0YNC/4MbObHzUxmDf5k1D33k7A7CSu1gaVDwFpjoxeXsLeFGZAwUedss2ciBYTJV4w3WxEtLaRrmVGGfOm+CvdlNq71wkQkpoMMIMg9H+xxhKOnFJjH5vYvj2P+/LyLIpWeL+RQJi/OyUmNUnno91Ky4nBEnmYaLMuXaReXObu8LemCFaqbB8FecK47IPV/Bv2P6C4LuSCFzCMG6W3sxJCRV1BEQoa/QtR10Zz5RFHNhqfZ4ALtDsKApzo7pI9mmiLDQVjRi9GdEwwGscvuH1IDI4k8/IjCiPRLmVQzUqg3gmOukQFif9AIhKZ2CC9YEZ4UsZ2dQ3K0wiWcdOVWChULvPpBExutx/4jaw0dLdB5m883DbMDhuTGclJJMKhKvT7GbRf5YrhidM9teB3bhdaVfJ4AUYqPXm5681Xfs8IqYg3va9ac6DwvKIBGtRR/j3dKEHItH95mcGoRhmJYL1MeI5m34nxPsKgMvXK6lBvSHhfu/mckdzIzYGTHFOjDf0n29bJYfGu5ksrLI6aS++FxknVDPOOHmofIK6FBTnTdinPzIHZfHx6Nu2NvHSQFoXnepVVNr3jqhrJc1FgPCM+zWWBtgv3BTERlczWBF4PjBkmLuib3n2BLT2bOW2R3FA2rYIawTBqwdxCZ8k5Ot8nhzNSrHpNOVtg1TudnrE4tIWhuhM99kFIsGZXqlgiOl9zbxd1n9hv7YMbBBZfjBDykac+BXhwipS83PAQn58mV9vaYw8JseQelhNGE8Gdqn7H8ZSzmj1Co6gfm4MTSEb3CWNUaZvKqypGvabqAbyCS67D4Xwg5G4GdyhlfMXZrBzFpmTX6Awouv6qY589YqiO/N0KAD9rpQouH0UfXeFttUtSdT6PKGKBiIh8ae19dvq615omL4lZNjuvk39EbTyLmRAzl4rdadWQ7NiyFTGjODPVa/PkiepEzwDMMWp6fBj6qm5RB9mUu4Sp2RPhmJZlSPJi8yiY1B2lpXdOGN4ckceAUvtPgOdsZWfQvSdv/S/0rM+DBmnRx83z6b5SVS1AML8vH8GkvN2lLj4qruGDgB1N7/icKVm2RrygKUju+tWKNx7p6WNGkwMfRGYJK0ceOI637yVGjcfD/b+CKU5KUXPy4gSpJKFNHt0WTQdtJvLmjMxc+RraXEHTAydFzaX4ohDUuOufE9kGHL5vvYTXZ+bpOghoSdh5ykYH2bLz1n/7Tchu7s7BYjpHgQiTvZuTLx8p3nBeWTUs7oIU3Q818E7k44HNKFmD0L9C3pRNMGVdu1Ap/5jncdeoaSwVsB1rBx6s4aCw6GM6ZULBuxNADvCb1ahCSO5sYxv9HPLTIbSw8ajk3scM4pfck5ED7cPg+roMHlTtUxkVmZMfwCuQx23ZqrtdTvdzBPweLwbfpHiGcLlfw9zLifjoWOLM52S/sfVsjxhc5RZwSQjxqtE+5DdDV+M9pu3nDuRsSx9cfOdUneT3naCLc9wMHRHl6T9KGNL1+Arr38ApD3FLktCSrPGBG+xDer3+qXpEpjty2kbDquC+ymIKI2GHw5f+WrrroXWzR5+XTDUdl9wYkQckpj0518AkfF9c/y7Z3+wJ/4MerZuVs3RbGnLvV9Qae+TyW9gk7cbQ5kDSIkeKogmXbDXwe/Nx/943gkppmJM1Ng82V3BQWLzxcnvb8+PVHdNO3cgCwVj2XaV0Q3nR1kmZ8Hy7pt7uvYLxmqTvlyajKNNAb7WnvGKfFThWlJgNTFrvF6D6HQf9Yjf3snBExn7pAK9IIq00y1pXUiF/exADHGmIOIxDRpTRh8NKaXZ0KDhHMUMEBSIAQiRekZM4FxvltDVSCl5hdxXrPTh4XtWL1GwxRbMDfA/F0ue5xJZQdlfwXnD1i3SpKyPtbCmmQMCedoXSFB5X0o8wseU/6MOOzbAv+FFxRo0fyEt95j4p+Q0h+IQ190IJQnfUPsxmiwOLM91UoO+Ji+7aYZ/rraFydaGGORwAYkPQ73lBsAMdHwkNXVnXwzuPMNWdIPOod8Vm74kt+yvM8kbIvb6fzYu2TQfodntjIVoGd1i4rZ1DLb6vwR4AufiWKpSkk/dcdqZP/AvFrefu7+zSjwOdkzHLfgQsK2RFthyShUMDILtutaHinycphmnlp3fk0MLxmB0eiVa0miKtS3w74JkALtAH1Qv1DLwE4nKYgm9hjPmbTvjqc5teADeHOJJsJ/68NJlOzN/S4Ps3dOlk7ML85X+F/X/yZOrtnZhyNQKRZwg+rlpkv9Q2H2CKLlbhKJL9ZrtmqFQI8byEcmoVeKDpc+fqr4cz4nuYhiqd0ewK1XP8TZDSWPSCE34Z5ljDeQ1du2eE3ONyGPjOz5P3NoVDLKgvcLjkLjaJfZPv/IrYBSjZ9Bu5IcKT5jXgiB6D0BhIse9+W/AhzcDktNvmDOfAOghbsEh6UaNyam2TXsem998vo+AlCYbJ9UdoCk7HsMz/9sZAs+2W1KAPoXNk/pCRbhrkB3075KIVx9kUvyd/uJksn7sBMUPFgNHlzX1vjc83eziKqvnt0hSUQPEwm3uPPaWgYI3qBDT1mjFRC3JRawJoDmSkrO2BGjbJiY0Teci+BV9lMRcnxLj8XSMkZI/V52Cc5UZMauo0p4+cwdMHsyS3hPv1AFXP4cXqaeCzDaBKMRxgFGkbs/aHF57y7Yt577dKRZEqqL1d57wzH5kGcsD0wqlISO+rtu6Zp1cAMDIzBYkr19FCw5l5cZn4CVhNt/3W5dX3So0uapLlvE7pO44miRXzL1t2LLXf3HbIFr/bxhjAtlo62dvjb7n9rRH41ECHZ/fPdcoL5o/RIVX9w8XTG1XSz9NyKgNFPhvabfjugiPgOwISLcDZp5uHBCiJIFfBL8H2GB+bX2G6ZPW4MR/RBzHhMW20rKh6YD1kXsMZ02BrLyYC7sllhI8/fnIdOqSic+jWVeXwd2z//sVCKCbAgJ+GHT0jLt4Had7Vvt1dRoXwYl2no6eqe0C8IKHs/9UypSdQKcNmq5RAEnSfsa0HQXDF+B1Y3IBuoyAjb+BTkKvD+M5uv4Aj4u/GMZp2k6OG/iiqaHC7uAfimaF9zl3R6giNrDfOm9JTD9SHTEYZk2+OluybUlZpcnqiGZPAWgQsWwypszYa6jG2G+rhnnnFXdFizwq/JSCHRJET8Ck9hf0NMhdtUN1yWK0LzGyeZ33SlzVJcKAnjnVAgXB89yWyz4aoT8zg8NEfGP2f/5HyuhHizA8eaEC/YZyq/dnxCvnGCvWpCjFWE+yDsHX/NIy0Rd8CeHm+fzEfcs394Lp9i6xPv+t+kX9dIfY87mOVIU5G64gr8u4vNvYuZSF0spQZmUmlIn82DDBIlokS6Z7BkCxYSR2q/0wh77G/3sQXUtB9R/qsZrsb24IZQ7xXTHR3Dr1n0Soka6+ZXEC7ldZEPdMZCHf6T+n1k/SKX/goEdkgVRosWCsa17pz/Um0oFDBTdo9TSTrTcxEQYAnI1dNiZc9Clfnq8qOrXst1f82nApgEC6Or+M3BzZkI771ZSa15phI1m6szeD1E/OPamqqQfyb4RZr3iuZ0xIJiJQ2lg8r/oeTn2f5RdXsOf7esRZnlHfGC5Ndivs9D4/VY4224sL1TYbHheeX76CKThmhhWDlMJPdjnwi2qfF4Sj7YSrQwLWWuycZxuU8YjfTtOK2diX+S5PesqQ3zjaQniBvikA5CkwXvxoq7i78yirso6zAINGw4xFEN5jf5OMvzDqshzat4SIwOFkxnIXYVsqbtH9dm138gH1TxF1lcG8Ny0fhpB/2IHAASXmuUHzxRrlDQBJr9hYWh/e0I5QTU6XKZhwlu7PtUvBKmMAOJVxiNpgY109sD+91ZQ3KiEDlrnoTTV+SvX1ggYnqVJLQpli3w6Jd2/OQhoy2WyZHANMZcYdRli9fGLXPN8Q1oKfC3ZC9wxifi/5wRtlY+OMBYYxdgHpWiz3+LqCUmJPCOcYL/U2WP9YlvFnVkpXH//IvX6+syRtcwBliJtwpEm2kqENRIJrcCBhLXUTP5HDG+TNYwopA6ueWBes+DSXVyl5d4U9mA8JDzDy7Exe7G+m4N/BcGVeV2xSvwQKp3KYrrwEWFWTsHJXg62SPnAeSbroQD6fY5h2G/LERzWdy1SwbV+HlBCgu1FSMtON3rNmipt3g2zy7Y8fGmTUiLfgjWDaMvaJRr2aC9vv0Oybc7w6tI/deObYFf2PoFdceRs4nTGK0iPrQdfCOxqF6chrlXgbWHuPDNOTFac0K+jby51YEqWPydhzl9PaYZkBeHyZtqxzV73I6wJcqhUfgdG6M45mJjTT5yeF5UFijuPpjD9OwrQ8gFkn5eW8MTO0nE/ZSnWfgdVKjFm+dBCiUku/++kH7awr2UJCqQ9uGlQ/N8x0JQ0KtyIy7XWeczTfAqFszO+otgV895lnnE3ncaVcG55SXuzM8QQA7wQk4rNk+Sx0K91DMFldMRhHH7+htaH637i/s3hNOCRFfL+RDxtmmWdyfyLYst7sUZJRNfQ72y1pnnW5CiIH+okoBbcEgVIUdUNdHEfgpzkEx0gWwxmY3Wre2LpJl66LuaTZNONK7x4GOOtMaGZ0ty+uY9GMtYiKpFetR7RttlwAE6yTpo2prpixSZnuQcJYFvcr0tRQJP3VAAVqabiA5bu/TT2hMfnbPt0yTbpbAL94GUy7FFIWgjy++fwuXkDx2Dn+EeuAYWhLP/Md1I6IkZoDeFNaNlfFaC/bnzi1giNNADc9mUjRskp+DVk687mm9cgF/62xYpx64pEZNttRm97JPCtPFVJH0Eiat7j5/V3/Pc9upwtXOTjqrIRwpyL7+sJXv9BEhL0nrsnG4v843fCuNQa1LXNyBYw5oVVj4ZBCnyemnrhtwEaOFWS7+PFkDPkSM9sZfOUtksx2rs46uQwuQW7kKVHnaAlosqprxei9IFws2aLW7/o3jtkTOl/wlIcVBwHRVRXznpBLZiH1mqhTRJOqnyG9F6NBETUmUU7GjLyDp47UJfXC+J3VRgL1HBO61WckV29SZwdKdj7oU90ymgt4xswfQXUNk6egVPJerXGEdXuPJ1Rj5SZcuZ2beYH8Nld3UaD8KSNbvwTKzHrv172nRZ+rhDVeDsQ2L7QS2hAKJaFxPo7EO9kBoOgNzA3K8BNpa0q4PmHbrAPEoAOhGsh7KJuNA1JgQNC/wdMXgjpyE1mnPN6hu5CS69GHsOqzTEIHGLw146FOAg+MY+5tthhVGvvErYaO7RC6wBD1LVPJdPnqqvaqNVRWEkBewYtxlW5DTIsT8Agqth5OsO4FKn9WHDQ9tKPV3gKyDKm6MxVj5lf4+v/JcWeJG5W3O5L+/H+aKgFDwXb438DeUy+6TeLdGJHpGlpTe+pBxO3cfwb+7O7pZVYQMxGNzad/KlgIyo826ZZTeP6aZSJF3eLgPIqOuJfgI/x7lDL4OYZCu5fJZ2XVg4rVqfAYbBsGtMMjVyk0mStaDYd3fNWQKC9RSg+3fPif//Qy6M4FQXX1Zi8HiNPVl3VGL9ls/1lJXEaO7Lidk8S8PWPSMMb0XwKcL26q59rT8hXPmJrf7341shwaV3//rGuBTEBhO9imIsx8/hOSxD8e71tEbLCjHJ2dHbNRXpiwLSB9jwYP7Rg82fiiVM1QJnWSRkWqnOI9b/evNWj92ynuJ3npmkDjKSFDDFI0RrKwedavOlfmuf7DyXy3iUiKfi/zZUDIO1EkPHAwdxvnMKMdmIVk6XD1Mswm9Fo+Ncp6XXexvRzGhKOlXFAsXgdA4klUwEsAELzowg73orvwLcuUBI7c8nEBcmKC/DXadAtwp31hG0xJ6iOYmGlurqEUtGvFnl8SLRYpV3qIa/v1Y2OU12yi0pSpDfJNTmG6TYfNKPNoWQHsznHFhMplDGD5up6KLJ2GNqgC+KjhjNncydVfzx/vir7iumD61bCNKs9IQLSgZN2ci2IvGi3mCbXpBguGW22gVBkS8HV3D6xF00i4uMtRPEQP/+B0XuulKWs8o+3l+HYfm0OwGjHAU+5MP6kBzhiIDeWNlwDt2j49NN6b1isN9w+h1BIEmNAUx8BVp9Fyeedptv9T6BrmykXQfyejQDzq6cJm3fP7xRrGJ2YBX/pZv4stw5gfNTMPWr5DgsNFstzzn10ePuhr6fewVUyKt1qoPsLJ+o42ISvwO60txw/Yf9zp1BcNghv33akAhBuSJaXgjsh+6+Mi+bis4VqhHckH23OnaYVZ8Op3M0k/yVPTER9oSkR91qGgkTTHQEAex8gWUuKsejTEL3G/x1sYXSdM/MYa0XyvXLm+V2XFaiQk44Q0R3QUHw/RzFANuFd5Hmrduno6JN3WW8TBDnGD7v++QecLfI9eB6KLdAXlU+e5eN+BII7Wq5NEKQUL/Htb5PW68dlgiraFQrFdNUncnZ5w5BXChqoIZktPxxKB5c1yYnr/7zJDgthapnXe13eg/5hWAqBKvsY2zkof3G9zMTpae9anWN1oYBKuGD8LOtmrpP9kjVYMsrKeU1maOXpDQHWI+WAhjIPtqvdLKrk6Ml+Nykc/wNZw6y8vx53kH382hc5h+U5mLfbJTkLyk+pQ7R+rywS6/y7HTstC6bJHYTaoWMQFEapVgZT7uznyqsHOIHwTtCaaNADJR/07VQUU8+28jfUGDXwXVjNOybNnnBSlgc5cjzlaVDC8X1uQWcSphqyeioft0PAcgoHqVEa3ARU0e2XB4iDUbK8r7pb8CaggGCP1j+natKAXmCKJmxmtfz42chBcgOHur8GACZ8PAmw81FA08HqWF8lfqmavaApPayApV/zXMCU9aBX1b6eFNDV+4v8Tis9dCD3Q7CvEeKdHcSfU/o+Uu/75GNmDhDEys+lVO6KtUmhxBFsnDaFMg6IR095xxjct0tko83lwaS8ARH8ZYQTdte0R9/BoytTsPnNTf07jNVniUYW+QwZArMFeyKcd8NNb1S9kYhaVccZALUr7LZtYQtWBJM1RJbkxSEwnjsqyCPf/D69cNbYgWDZe9oi0X5huiDgpeJ6PMH6wGXLQVmYBFd4h6GDJHh45rQJ3QNK6nqk7D9Q/NQwb0Df3fkriOixEM6yfzIgmc2kbHQTobsoMYKfZeXMORQegUk1xW/3Aix1zVOPQdKVNP0jlXM73UJkkwLioJmohHE7FExwPDzy4hlV1WXHJsbkaQE1KOBaFiIjeQiDs6qg52jSbvu+gfvjJlCv977v9jp4glT/ayG59IGvxfUusxz4eTdRCCWU3YzwPOaUHzuKuuW/7+ehX2ndQTuJLxfXiQGcht5Hf6hjjCLSvvlfgbl5OONVydo6PwGZKG84PkYsqqm4J4/JjVabjouGM0I55bLF+ZGxmgGncHPjhH6yUrer9EYKEDIJ772uUCvr3EbT4mTfTqdIJhyG3+VwYcZTBUpFltrJhJ5VKm1EjmkvgcptOHDGOEIXbhAsE8d9lUxl7dmUwj2270WBNSASiR8Hxrtyk/1BIUm1xKr/q7ctQi/qfFs5lpXS6CDc14F2zWU9gBHt2awYnlKnYJWaZntH+LjPbgWo/DxZWKoiuSMwSwtM9IKf0gPkXxoUtpFb+1zzXuX1rEnTLdiSX95wWi2tl5kKRH4kJ+d+drA0n4Ze8ZbJsVRhIiNy+mO7Sarw9J82dDSTkCa5akPSKGzItn3jeDUbF/YUgM+813r+u3xA2QF8F7lXLJhlvBlVnVe+OGD7ANfrEmf7fPNtLCPIEhvGVh7xKrqGaITpuPWIet5m8b+MO1QeUktPS7zraPXrmJi2p8XQuaZfomHMzOd5AG4qimJ0/eb7lIcCL3w2+807qgpr0JSzmB0gLd9YA0m/6vxRNxShLI5dNLpSumcmPdb9HK4ZkO6L+losyjf1ovPfGNgLEvBAHlTFdzOBCSV/MNAjlkFqBRhWI6sQBS7Zw9dk69T8j5jz/UmcRtOxaZCgbKIeopMHJaHe+CjzunrRmFTYoDyP/C37f5qvyV63OJ9II0XpOBWJgfZcRbTnvo9y0MFJLYqvaEgqPQHQidF7Xn4Cj6Zl7AiNVKI6JuyNfom6Ra7EeslSZuT2U9kTwDxapcye9I2AVxkJvZNHEYQRZAtNjdyYDPOYgk8ygC5OazJ1+PZBuenbJh0xAlQ7seO2/8ih96xfCdkIYARm1shqGcRZ6GGzDACaxsw5vkvVJhEbbFiM/0CjUYfR1yl/i6Qpz+HfmGJJ2H+z2JYKrLwJJOW7G1pq8EDUixXobXOLZYUaQqSSaYEsifnZY8YUO5Ia4An7IL96a2GL/fn6JZKPkaOBexFc+rH244kEzImZswJ1CiU8EihKE20sHFNUFVczwIbUbBa5VLOnx4/A/R31gOeVvDBakZImsbSe7kiLbwQAQIyaRnwUTOJ3lcuun2A7fXA5OT++X7gb/2HbKl3zIl1udGor6pkBfO3Pq3Cskfd6KhzwaUbUeSiBkrheGqz77dcKoIsRoersLN/juzyUxZJO8uYBDoLvzGdDIg59p3Uj+gTJ+CopqSH0KMQgpm0dZCVXmfnAlfJix6Y0DrLVBSDzlCv5W6hhDTzym6tY75bzumx2AinAoV077Dbfl/f5AocH9oVvB3t7CIBukIdG+hg8W5hueUv9XIFxz4K6nku0TNr4AFB9CMHprDKWprKh81Ed5n3WWze9BQWrnGrGjuRqs68Dz7dItlqTdFzqAiEH5ajX4MYCjTdsyxH0cZjGfazyWSn5o0HEuEA0wDok67E/2Ny/U5CLR8hcj5s+xIzwUw5t1JsKRUQMEgRWDJ7D660tv1v5J54CKnGebbOafql51vdH186peYnSWyafU4EgSAqWH+bVsSwyHhizt8vwQWbgo8RMx0BVWfIHsbET0SF7U7zr9A8GYX9eY5dLCmLOMSs3t6NHQbJ4VpTLe0UTYUCzg1gjE/FzfLAX8v+Ppql2T0JiAI5NO7QRUtM2+3kh9Nyqb0kq40yCii2JL0HCROj/61GFWKEUoNBRVTpi6JFxB0zwYf/uYTAVTDAFNJMQEpPj2WXYH28tmR98P5HJBioewjDoqUJnes3sqflnd6quZ5MduekMmHfQuIVPU6RLKNc0YvVtSVnmu2mtV258H/CcZedzAII6FTL2hinYENlZWufnvSk2c8Mo2aiPdwX4hRvVPpTwNXNBOk+UB6+tYvPt72PwnEJ/KCizwrKOqYmBG1GhLM8trbg+zG3FHCcjMUVjXLLLja9sNeYkvi9FI/iSE4IzuqGd+orMDwgn7h4mKvNZlrEbB/4yTowQTa1uVcudxK+pUhMFw4WdvnZy+72jp1H1RKo187UedTp2YYEz4FO8QmkVhburlbjljE0W9XQtZ3CW8yWvkGJaRnv7fu8yyPAR82ZRK+Q20/dM/YmNzHF73bV/4pSpw5GKb2ol7gtwil5WZLcgm+sZa7VhgIiLhmspZDGWkUanr/G/WEE/4/7qMEx50LdFJpEPN97WpOpljVWD2D9RPLQ5PW3DZYz0+1r3barjM+CTbAJyIS3Zlqrm458O9/HldDyZI/Jz1Ap6cTqNq8F+DnD+LQ+kPIljZp/rlau4fVkGAfWsyHwTB+CUGFMWtmtLWin6I/IhiFYP7Q81KqFYXvY3CyT25vWGr07eMJlXEIjPnGKkiWsMIpc6v9Z+jUDbxhtNndgCaN3hgh/0Bg1jGjfZeycSPNXZeny1T7W7kx6h3JvbX3Eu1si6QDf7C2r5Olp6u5pucCBKiJzXrXF+3tNLh/wpcWoBGmLRw4UnUC4MiHpZ31a7CcUiDvucjls/Ib74GYAFz1XBkvg7gV1aGQrTiKHmhxjbpNEApvm7vqOo/6nknP7GDRrNaXIjBiNU/fsBtjKpMhXLOLoDy1HkcM4BGkgVw26soPryI0KkS39BSUTqJYfoCJ5QJsVuzSLTHQwDPyiOA65mlmge3sqK8EOoKSOOqzukR6s3Z19P6oK23DxHr8Spp1jFUTzG3sWPd72CqNlm0XzpX27CdjJ3EBwoIaLbr4iuyPInbFIua8wH3ex4QSEPBomR0SXbwyJ2ELsZw0ppmKtsmnBBSat0KH1AKKvTWAkmWYBCRrzupNyrrb8VjUzaJItmXaktJExY9/NIPQC5xQzXvl6vI1vcFNJg7RoDD3wmTDjSv0V8PJ2ZP41VMH9gXOvXAfCnul2UyLoxBIHCYI/5Drgnaym7ka6vp/1UFnGkQKNVFvD5gEjLYloIUOj+Lwx1x8+DXk5dxIP/sQaGvHjXWinufwTQX5fzolsU5xXW99YYFNWoUS/5NOfBHgGp82Vwoioi0ycvx7FTeNS9wnCT38FUsN7NIS43tWoAmyPzAdtdGJMn0FMwvpG8FrRuiHfJnUmUwPDhUJ6EgC+U24d6uJKPNMtgR2ZBfLMpsVe837gV1Rwa4gBMsD46HvKnOrk79sUg+aagthafKfYyfELXzcW4/nhUOJb7FvshxzcxrBTaVQVUgjak8kQt6KWl76VE2R089WGsMSv58KNSFtMTyW4PI2qWuniAF96A9QSvajRp3DQqxN+RFO/YBhJnojbhVH2pYSgFcvNtgrr0facmmQ2NY+EVloWIn6Ncxq2fbk9silikfu+YjOvqVO7pg2fZEfJCeJcm/TJNfWhBRgyRDKRTE0fGiZKOKdQJsUbYL+7jeHcVGA2BJfv87gYv7tFhQ7hsvObUiv4iXdRp2WbCoyCv1VSHPsNuN5BZYapVPXbbWXQkmBWT9simSMRsejOgZD4w94MXzT8WhqEzglkIF+FClWEI8K/ofV7uprxvUn/Y/fkbCSM087PshsTXxuqJlxyi2Kd8G3FNz+VS7R+1pwmMd7HbbnXzAyWnmf6TYt7eC0ak3Rf6jcpTNRjI+E7c6R9mRB6H8iRDdx7qqU10Kdat9ax2CS469BSwFeteXXLzMrU6Gv5Q+LQWBhoeXj+j/EU4pxJOc7E/0/yxPwQtl7pbWgyh6fy0YYAn+SHFWbJPTsGTyDAn7WnmB/wo5LThZbwk85bvWqpQFsHZXxeC6aRIb+fmcogzepvKDr1MgEPk+UUL0T69im9CD+86mecp84rEdP69V7oJ+2zq0Sw3ISKX6cxk6qDfCm90Gmc51AjwnR90HuMhivwUBuxtZurGaHSDBCQ21EErlveBVDqLtVmdyP+8X6hngFweWeLNVuihXK9TA9TQDEp9pxtbHHoPoryq6sLLVTIZPq4tZOszCcMYVfLzlI7KFT+ufZKc9ImxjE/lkzOEhicdm4oQD0ekbHSjkXJeOei6Z2CG/yZb9SBzFv1ahQkJK28va8P8pVEGyP9kZazdeQJ6Sxqs657cleItd+dHU8F6TZ37sOa+OVIX7H53n+QozE2k/5rJLtThC/hlBxS26LrKr0W6HEVu+n99XOZ/eSJt4sdLSs49gPdLf1tOSiVydc1gHYp5IYwDX7PoYiXibEG8OU84xkHUHBmIuz5nGy6xxs9+w0Ya//evWkLxg1uhRwE5UdFMXo/aG2017Z8DjWg5Jjo4XSblZLjlKT8RO/rMouZLLJcn67SeOqBuN/Ds5KC8vJ22sQIGd+HE5l1RH8if8DzmD0QRCwV8Tq6/zQfuWp0HwoP78pqo2IFsqXeiamDqvPo0L+aJcMBG7zEwsuEmJxJ94mF5fnKzsrIXsT7CMqgONpO0Zf7qp+XO5oKRJX2oWq3A9XYljQTu/ZyodikSGtzY0SITofIOv7jZJb8KhmO3QbE2K/BAeluvBh4s+iMdFpgCY7884QAJyW5hUSdsWiu6cfB+a68mgPv/WAvjqvUPvU8f877ta8Ij6IhNjfPAM8ZXR6vUqdtkbCCmu6hlCkJWNZ8LLzOC8uH6shCSE0pUVslzrwUsJvdwmKG/NfoqkDqjyaUF89u0z5nh53ZYYWYPBmBvyg37tMzPz/P6Fv/l+ilzG/q5bxnQP5zddONQG9b2hITaxViy5LidhNRItzGjSL5xMKnKvHHv+VU9LIMFCOjdPxJ8p/dBbiCPJYHkfn8+uumbvWL/7FthBAzEUVn/Eqmu/uW/wl2klqc68E/lEjGvzHwu+Xrd40arsu7/0+RWvYR41wCxnXAekr5UIMRLIk/1SYQzGIDJwI7bOVx98Y9ToWepojaGTnU96qHBOGoLCu957cuYfmZSkt0erDGzWGy2xdhtBQF3OZVepQcgTK/7ceF++dKaZVMb0N2o8EA7hGG3612naX/407bPGJFOHAtN8Nu8igQHLpULN9My3YI4WgBIzOT/IuisrLlywQMjuKvRQ1wAKY8U4QITnoWLEqwthG64H8zl1H1j+1O9YqhgiyO2sXKq35FKhNuVHuXJDS5+kZQ6oOe88Rl0+QhMgTI6u2vFhguC+zIC800wwG6IEMe408bf8Frd6+/diDLaUKfcqWXxVMLwvLBAvCYFS63EfrlH23BLUVrut14qLmiUTaMy9E+PBRcPjW1+/OMNTKp+91o6lqb6GvUrWgIya0TJPgdv3mayUdSrLUev7FSH5ewwMPRGZiWobkp9/U5re6wh0rUnNTgdv7KAK3jyZjESOSFP4JIHjHQQ7z0nKmotYsoJJHfG9urdY06A7Pgbi5UCBulH0ZL1hhYc+NxnZ3eHxUT5Txma1wulH7/USVoFVuyuj3Kx90gvPmuJIsExtIrOLHb1qGs3G/tPpEosgzXEQNfhYm3uTOpjuj7Xp6SkAn4RwDyhXyTUzIB4kTJn5HhYxTAf0HR0eHwzrsev8WLzCStvMUyR1DA0trXJcEhFbHA/tupp6LGE0Jhn72og/mFKfkmGdrWadoHtw4GumFL5VJS2kC/LzaE0/viv9hADK500cakAIbAndZh8n8uW7pge16n9lCwqCYLxULwUKdNh+e4HKXqt1TWDTw0iertmy/EX9vJkUly/Dhq9xa79KumV+EtqkAGPH3snkIafFjW3Xy4yjf9mlpfnktjUTMzPpJnj93bsMxP6AzePhhpkFg1OqXplKcu1Orm/TuV9lImKPgUQdsh6OjmFata7Dd68w5TsEIFCrx3FMaahtwfCzNfOFcZ+bK3FeCi5LGi9ChvAnvrMQd792YkNukFV/wo/HW3fotIU3VhcgiDJbi38HZz4KS7zgipAEjJbxXOwqS9lwjn2mS7u5YU/ppZ23rNhQV5QC7E0X04dn7/PA0SWoB0aDKuNRB4Qfn2PA2S58PegglWo8Ps+ZOHAz8SxucMMJshMM4Wn2WzG3GjjS64OVxswMXuyi40hYt1uzzSJaCLBcj0nbu3aTarkh1oUWkYWR3+Llzqmp1K4o+0bGN1CuXEpoUUrRs32IFoU92/rVy44HpOFxlfvlYnLqZWbCt3K2G6ljG4IeClfuuGU1ynhaAPozq59HFQHeV2uYOUU2SiSivZTcx7LgWSvf67cR4MPJ/AP8vOc5wWGNZChsKrXRNGGxuVuU9oxCX0+Gy14hsU+der69OgS35Sb7L1IMdqHaZYcHDkR+TV3g9y+CKSxZdvwM+M5FZm0ecsUuLGF05tfmL+t4A5DapvtXyUMP1bMIamorZS4NEaO96LoQJ+gA9A0JrSS9+2VcaXwGIarsi1yamQqHSL7IVH3cRf6X0jTH1C6zD2aMfMvVPD9zQtVelQGpO9Zdbg3WnzdbwQzS9mBulpl/dLFYwXgpWILA3OfoMw5xyP9Z016LO7DrSUDzPbFL31tHRLRoMrjDdjuxTVOZppqK5Xjg4dyGFS4VpMemfF3KFX67+JbUAyryhUIeaGmxwvTTQnhFw8y7SObYsBzdR49FwDv9y1mroNvo3s6cY3vhNe7o+CSFpod2W4OFdsZ3k+paGzSkgNZqYcZ00FoZkgxfgo9bD2c2MVrQNjUneuGLwhNofWN05qvMD/zT33VZcl7ugpzY+HMj2m5gaVMvu3/Jz7oCJlcSvwGxHxSd65Zanq/K4OHAWQF3HgFEWh6SzS+yarciaLDimM8DcDwFuLli67PT4QEb42xvfe/PSKJ0RADg9witNvfRCiSos1qZuC8PnSWBe+M4nSfbqnOl/RPhgAxFMKkRpzjrJtHZ1EiGujaub4wEpjywUVkYPwZ/uiL1snm6Pa5ncuZ2MxdmvV9mz1T/ReqC9g4oMCE2573zhQ2GKMvESf4O33vbREjDnuk8R6PLLGGyiviV7StTmIFbp13SU4G7Z4//OV3pJ5atr1xXYI4YOGWi88eFxBJq1E9k7LespCTAyFYly9tDp/5dnORx/rheP4jEP5ZISnt83sms9PPEBwVSzW/MPZ7kf1cOyTELNgvFxYwQImNOrtVa+WS9gYlAzUvayexQzvqRGopPu33rfRLk+4PT4BfGiU91hMsg2rWqFBC+qRc0nfWffR1H3cokjxPYw9dpWMdSj2Eg9UCtmcCIPq0fQS9QWNI4hlouZCMa73PbqT55BmKqY8VJ6JZTjeYr2vIb0jcyXMRggMMFoendX/pR0AqYK1VjlpQjLxVZrO4GMV7Cnm3mI9BZGaIDAoKJMfQLG41eYIAc245KzaRRWoZek7RukHKtuY41T3lTHAC8av/l6OyXGq54i8i7TcaWHisRuofZRgUeuOowmCLEIR+g8IT9KMpARZ8ElJCg7d4dW6nTSNAHRkHRM4FjJnOz9fK4+6uXIhK7sLdrsNSWKd26zzstfjmrdnsR+LS8SygkYXsa4mMBreZtJ7e2ywLwbLFEhctoV5T8++FNqtzAhYu1j2hUAAtw7cJdxphxPYAC8YBlcUF3ymfijTBsxdAkJidVJcHs/FI24J7o/CNYWLihOHUC/wSNfPlLmS+1S1zOP/nHkxRwIgS6NgJjszdHMnp2hlhYVck6D2qVwEE+8kH3cbqvIGU6yiIwMkjMEaUNlKadUDsvgheHXqst1Pw+jEJJAAHlUKTl8NBvhKv5nastu+s0bLJJ6uv0ybJd5QdS7H78DSfwYT4H3Z0NVZKYXJyHZp/Q++HnADQZH0tutI8UB2luVcfl8BL5kh/hHxoV5bPFwrJyYUr6S2ZUo9ErEhqpQ011ekXX+h+BtHPDlGHmeU5aPJhGZlTE/gK9yyaur/WNODU2L35HaPU28sXA93B+svxY/VhH8jPe/4AGjwFmWlPnsgcMYvQCIt/QfjXtArEQMU6HaPWEy4/kK/fJlow7AstTOHIzsUSt9cN2CqBDtfgXoTaouDEg3zGGIGf6ZkxHk+8dv07C4eyZF0iMJE6Z+iWWVpa8mFVTwA4VpB51pR5ca4IZOoFF+BIjzFh4mApaX0fMeej4e/mCTCh2JPszEvCHW7d+OASceKSKhAAi9TiIweJR6HWwmPpKB/22FGeEFIYHSoYJGQoA+ltad7HnR71Z/WeSvzz7P8T4GP8ugoBWWV0dnWXjqZGMkDByNKMbYW0dIg1qg4SYgakwQKgA/9q1w1XI1kkCNQDqEgfhzn+PYT8sNuNyV1YRZ6PJxJRN/hoGeeieR34n+Jzm6hp/JreI/Luk8XrXYBFrrY4IpCjVleJzbG5xMCKUwe40SXvZbz12lqWT7AYeEnchsOVyvaR8+SoODx0RWZG8g8S/4X/tm5ox10OaCD7GCrvaG0SZ1Md1qXPUOvnD6bA4ctrEFa3Foj81GLh0+llbqki2KDE8iCDJEPy75RuXvvZREcSlFje7jxzIXxb715aztw741C6n93gdjIxOYJPBIcQtJ7Rcj1xJJ153pAODCbTwxXv9kE2sZ2QwgKV2qvS7PjjNe/jxBk5aPyEyLoUUt9CdIMaP8sj3Q5YlhEiFmRjGueZl+a+f/zPp8N6EozNr5NaqTxy2BTpb1nvXbHS0eoIiVfsSn+xJij3rXLJ2MTFEtwjI1treJmKowfzZnvCmZ/JEBSJxjk3mJNQ6ngVcicfB/1rl781zowAUAvmjvwtuxjf1+p/+weiboMj6qajMe8lBERmGPVHgPcMWWbahdC6T+hSXiHdYC4s0a4EtrXFvZUmT5r0sUz9Bl8TYZiKXlbdpI/LeuDeVOmide1shs23gLr5Mfjuv3t3TFE4nk2NcNrgOjOUEAn3wXKfI6bmwTi2oUdPHEiP1WYWvo5qhQAal7K7RJtdtqy3ZVgNxaTjpPMmJWhYGEYm/AXL4sMbYjQasxX838mHoUrJZs0J1fnlNm5ScZzKTMnW+f2F5uNjUOu7PWQCxSlwaBWxuXoziVwCFGe14L4YgLeCbEnVais/RcyUWsD8a+pq3akDSQS2uoqlBG4TgHLrXATwCJzvFllqaFAZZ07789Hw4/bSHbNkurOV28rf4/1AIpxzjn9Zb+DDVHiQeHq7Hb9SJzNOLQk/RH2WZ3ERXZPUr/pE6HMhs7Gg1bDZSB8kxkIq2JXzxwkznI0m9TyVxjGRoPmT3CyY/jv8Z5AT0hZOeWaUR7UKSBDA35oc+cuxvHT5exBv1ldZJXarMM5gkSwi0lJW4fjnyQp10E1DSyxs5xA1VY9H1652lazzCdq9AkJ2ovnUG1iN7UZdcyirBYqVw7Kg7aZdVj6MmlmyCjdnXgbWh36usYk5BoE3/jQnaQNoYsYM9Gd+1dPEptL06dZCrW/9WrWufOOeCuNkwxrpS1kIJfUmYV/AHmNvVxzS7Ji+yxmcwgIRPwJL3ExJV92GZ+DYLXu7GZ4JqSfsgY51Alswg84G81fH5hHPoC0XXMbm3GznfBvAAVTrqQWlvn3/M6kDEZYEQOdyt+IrKSxEhC1pnE3tPC6TC4OV3O3bxsz4TY5XMsAuombncijp/B34d8XaD96Kw91ZUqkxlHG7bKRWvQs18YiTfyhumV37CfX9ctAowjodvU+IXCqjCtt2K+JkX5VYHZMlfg8/KmQsefz1xdMHd76sJwOWReqJeO0H3dJ38LPt9ZBqBoKDtomsPjMv5KN1zNYonnbmk7bPxviGVGVbVm+8q8fjNOpjCEJVzdeSzQ7OGAUHXPmzNT/KL+dSJz19aMleXrMXZ7it+nWsrIUqKYCqlsLTKImVQP3sY6WFzK01C1I9xrPadJyK3z0iOaJwRAasBrfJ4Kl5P/m38t9dvdMg5Qr0BZYGONJ2DX8OPhpvce2BXVNVIMeDj4RQT34bzL7l1U4CaAAEXQGDgu2Pt43y9iLdZ2ZaHODJIancg8Ub2FzoV3FMi7bAV+woPFvpR8rplA8stQqDY/Lz7KAt44ekAiO40lHbSqerJpIzGSVbKbFuS6fbRK7N2qHJ90LjgXkY90BBBFD0VrQvRu5sQ30gG72BR84tYUhUxSNpFKHSDMD5rb47sURyUk9vydy4e4cHiOzg/rPEggl5YVQP3X4/bUx+IHFtc3vg3yjsGU3QkQbLHoN4WsaQW69ui++fGgzCFX9iZ4iWs+ZRLOWSFZ92tvm4yoYh3c9huy/p3Wz/RaxnNReXGLmPrnSeyGmOKraeHustWlhvPhra9bqf3kvfT5gDS/HLaMh//9aeRrbAKyM/AutNlbw++9zUqr6Ahtn80TLsWuOysmXf/O6qiMKzpkJsZAreots0cOY4BZyi+HotUOzHSYaw0zZL6ARD5d0GvctM2xvCW0YlMFFeeYnVJD3AVMEGOOeu1auMCjtWEH6GG9VBIvKteRZUwd0ZREurpuwsBeIiZiRXFbE7kwMFyJ/Va9RQDgD3oa5Zt1BKMaD6ERpGuZS4ITGnLnwYFk1KGqtRu2IkMMVKKzIYXZU25BKBjtZlec+IhLYj5oNdmF0w4BdbuTzH7JwjHAkhp3Rd/J4iiCRDFmbL7r/VH3dk59+I4bBze9ByT033MYFsKcaG0M+edvGeENB8AoWTZTrzj/UKzhULqkcL/3GKzD9XGH62NaT7y1EiSemSrypRz4QD1akIFoqBk80QVsoSHdzUP9YB/o/uteD9Xu5CNR/gkBciyGCM5TRieG1r7rtW3PtifGlYm5sBJtZMU0eivXEvpr0kadlTBYgT2DOx8DxIW2RrreiNmCYlEOpEEHGVH8ag53jXV3W7PBHVnxmX/p0Wag2CagKC28TL8WRFWTwvTcUVY1DRotnYXcDHKkJg4ad1/dkZlk+5orxdOPxA7xABZdj2ZZuV2CVFB1AFSI7MFkTbqI7xh/XBs1rVwaeWxrs7uEU2tEe7yFBs5ZWmw90nm+v6z7y71cX6tN5T8fQ25xCnI9LAnQzKjH7vfYV7gRmF/WL/IP+R51gYj5lM3ucJ8H9CVbneoIqjuhVtlVfwkkUpwHmL4X9tqqCds4RFr9311YcTEYcM+zim91VDKufUGQ6LdmSrcCBrAVOsdgyCY6OpcCOcn9mmEcDj5BakIMnRnw4JO38WgnnQPOx29wKBTlTtmpnffUj4/uZ70Bx922fKb6Gp9N2axUZysbLsl1rRvE+bU6xHyCkdac1jLgelA/02av8BBs6F2cPdRpdHZQ9El8iKmJkYHwicejyiPD/O0pjhSzr6OrcbspP9gcHUpw+8KUh+JPMN8tLVlsDs5xbjolDn0t4Ugi3hYSYESsh4xBX0Hoak/TvzIXs/PW6qodaSvBcXQoUSHBq/z9Tg2q2L+gj0uISVBznNzgiye6L0/W7LncclsoZA26WmjYBguXzouSdsDzPF2F5RIDISYwQs/xQE0lhTrYVNFDcOIr6Q6bUKeZc2CNBFV+r1oJrVgn7+AglVKoiUtJjuThxQivMYgjwu1SnTdzps92JFSPxhmsGD4fpEJBChlWZjbPV3+MWoDbN7Gl3K9zR2uXVv6pfRkxJLA4PFLlc26XNyPH1aJqHWiDc1hE1V1oAyJlkeD3+TW5jI1rkLUVSJY6mT+77/RCFJvlNjmidfTw/BWjdXv/x2uBv8c08xI8R4gepfUo1wEiNni8Uk2LrS4ntVhHVX8a3mX7WKYDJWwhyshK6ycsM6T2UgQidiTVgKu3Bym6SSXdt0kjKVdlZW5GL9WffSlGtJUGkwpdtyRq3XFjlY6dQdweWzCa/+xAuQL4PL0v0vZBQoNsIKdgFyqmKruQW16SgNXeM8mWPi11DMNDHhz8tR22gvHSPTzvQSoecGL6sdZYkTJLVKnm1Pz/io+MA+xb43ta1T9SwGm1SdwQSf7m8aU46cbr8VZ1nSYLLM5oKCWAE/wckTtsiw63NNBl8tuHnmBQlA/W6xLPHLFqZ/AngnpbzkRo6HOP1euRz46UXbacqRD37L2w5umJd51rV5/cFc/wTg1ia6aqJMyTp3OacPoM7aGTKj6Ayn6VkiwBQNPW8KrSvAPupd8UdpxuN0B8lpP4TdgpbTKZK1SKGVK4wMSmaZaw4ZHAq2c6S6GJGbdeagnWQPEvcVsRJUt9VmMYMdQO0b3CwRyvLzJG1f/BKorsoauGe7tYbjyXxTRji1jxKosk/pqbDu27PxaQQY4sVw9jHKSmeFWwvOC5EkM29QhnFkOE4qu2BpbAIajH/tw79bufJfr5V8J/UrrKdoBc6A4YldM/PxqphPmtXtcRToGmt0iB1OaRWNHXBX9h0g7vC6hy0ARWuKWXh2+6R7ZSAIKAcr3t47tYWfru4teYN9P2rDQQfhYAVuE8v21xJ3rc7kejyCThfGq5AEJMLeav6E7Dz91xk7a7+jl25SggDO+isLICac1npdKGug2hxpeaxkC+WEl1DRTAX5fYJDOZh0/cAOJrrU789U/gnSEnUnBZYg8VzjBXdMQF0tiwtI/d0lqLVQu1UyTw8IxVs8AjcIGIDv+slAjpeS964oJ+VzlTYt4y85m0CmK9j0HLqq7Uv1PNeWSxC/vuiEmd3Mf1K7UKR7cVp6jnh6H/DtCW56+fLX6Y7GYU+maqpK5j+CnBaFCODdf1Xem1G1aMCzR37FpcxuKwM1fzxCFjDWljl+XPiI/C1Zwu7zXiDZ5NTlzs/MRgCtSKTQppRbizmvRjvsKzHGwwIHw/bMLK3QBIM/YkqAQ1lbrBhrQSJpSQlWokgKzAvQfZA5q2hBAJoyVKtnW+m0AH/D2e2eFH4hCs53S12ZPXhahk8kXOex0armbLnQK6CpIOLcemLn4Dm93OSxOd6w6Xt4ts/6+ei5GRy5fRwCGtHRp/riCK5IBJjO8ups1s/IDFhQhESOZYyKgQaul+AWKLTR9Ysu0g4wX3Yb2Ju5h3ytdoZbso03yScpLcmlk6IWJbgRxq9DF0ANCxPq1rXpm7KP27w8SOmKLRb0TjBzQnEQkOfJXBxcLSV38pLpnaPfEReGtArBwkU2VD8gVOkwNodVmxKdhZDT4RqmviHxdIj2u6TfrOleKv6k8ISa3IhPlUMstCPWUqiyKg2M7uOyyDTJ4YOoOi9EgM6zPCcW6NwO8ln16haZ+HaE7TaCeMhwE74UYSMkaW+KVJSZ9OxR/Bejpf/NVT7+C1ls1jFNEXTT3TR+q6hUrjLIzzi5v1rLY37ln8Z2677ZPWeiN74apY5Gfbyqm7KYbXwcElGhfuPpopT44qF7eZTyaTty5Zh+FIQm6pgzErSOs1LE++HjE7/9buqUqn54NMu/1WZ7Pwv8HvNqfQwuw5IKSR1EYa+UjwlbyrHbcs5W4AguETDpEan77ykuEVcFmjRwcp6UeoDWn8kIThPx9xGPmyIWBnfDfjpgG32zXlVMb/PKmoCVPtwlaTsGwFwtnqLigBhNhuzhQ4JJ/FfrHstqETq1fQB4cYnhZ0TVhm3uS+IR9RA9AEjLMvjHjqr67VnauHL6yPEmD8bSZ0RHtaAB04GEmlBxn8Pi5anvgQfpvIIyY07KFpTtw8Jz4PEQfPOb8GRz4HktHwyDJkicasdeGvf/5Ubu0If+PoMY37mhl4d9Zk59C21WqJ3GKVMCLiqNNzN/ubhrguH/EiKj/osDDrbyoyruBXcMyqcws2B/39dxyWTDIthEBr7yaPuqY7I7ow2BNfJDxpjZU7dpD6iwnlhwqWiA98k0ukztn6FxxJVeaNT/K4PuG76SwiVIzvdsuhSkuXTB4q2cm1ARdHbWtn/AIHlF6PohiGt6E05ZNRsoTxUmilz0YGTXC9dHXNPJbtUqeYSb6/WxrWPXtuJfuS7FiB7TB1dLzAmZRb/hPUKFkW5SxeonuB8FtSJuWrKlvXAb87dkfJdW0IVh+OdYC2NQV7WEniTFajanlg5YIH2k/zF0vQNWXOgaACIFd/OrLe0FAJzE9LgRYWnMuLMQC5+NgC2LOWiSFiRTq2PDwLWn8ajsUcb0yp5ExYGcbtpX9uh9DUOc+d6qsWvXEw/z4aJEdu5kK1SrqHPUGkKn3PUxxjoBkIAjjbf7TAkjqRHNjJ/bs71A7FmLwnxDL/mWiqQcY35WPtgAzzZqPl+2GEw342ByUVESRVa/aAYKxUu1snMcV98Af6siFgHaVJpFsFYmcm8qtNQ5EBwhlbBfV2SR5PdP83YgxL6TjrvMK0v/UwnOZez9fvy0tOCKNAEtYKO/GD2b5L9ubl34yWGBnPvoRX9EYz8DCIhbYmpva7u+WgbC4l3hntunq1EwVxDcS3unUwpXrUjuFlutANwUNTlKLF7rsmzrLXxN36Hl7w91pccaZWSJBUfZYUb+4+1EOZo5gN15uzBhU8BWkFP35sR7TWIQlxaUZdaBxWNSBO5m4ovnmCYfkr2yvNYYBQt5wiaLg3ZP0GSPWIglN6DJfVdGG+bCwr9PIA1b0G8V/wM0MwFA+7CP2NZXBtbe1ALeXtQJzl3qubcGDmb5VFpQFTCOVArAu7k5IGNPmoLYPh37TgK5ojPA2ymZCR9ub9dI1KO6mwxPTegH0TY+xH5oxSFyJBDA4W1rHCQhgsImX3Fx1eeRGHrvJ1iWwKNOd+HEmoBKtXJC1Vg6kfDZB71qDPIixZOUeqczol6S1J35pfKVJ/oa8obM7J6KAzi1fHV7rIXelE1+gQu5vbVQi6YBNAAUf0bRWU9JrmyecFJvyHfTLyg0XQ1FjoXQzkMcz+BgcO/bU74ivypfIxdaYQFYv5+RIWL+/+MX6mPtCvfPIdAom90orWENC0kxTW3YYbB9nyvAhmn04NogRMrlmvhku2TaIRjq1JIU/reRVa4aHrhlZEPna6OMNe/96X8503CzThK0OV83t5aSD3mPbk8bQ0FirXr+Qw9BqQhxp6zhlvCsuNo2E54aCpkCm+jnbcTL1SzpAlbPIXoTwFqTNnUVzMqjCmER+YE9HKW0qzKO6wvsujpHTEPc6iJpVubyjOrq1o39G17XSjuqcAj1vGa+reK7i5byW5Q93j467+N5V4Vl8EkDTOOm/gXqeIZZUCQ//tHAOY+AEf5aPuSqXuOZeiwl71LuDkDq+UtjAarVcueXqdYVCBrffodnlJytkYSGAUQ+o5d1jnIVRcNo9VWw78mvEl3Bai4lkPCllmwg1ge+9W3ftYKHdNrkORP+yokO4XP9Nw38LgtLKFQm2wSb6E5QadvpIkP83NQ4nf9OUDcUw95rDsA1GMoqCV7JxkVhOvw1gQukCmf4rQOJujR9qJw0kAADGM/hy/Oa6ciPRBMko37AH4EAYAiu7c0iTBn4PF3EBGidD0MGYl05O9e2VIyQiYHKoYhh6abc2nyaqIlCXQQWfzZNAp9vbyvg3LQrv2hOa1VNj7IYaIoJbfHqmKyA7K3VceUAMYlx45rYN97yEQatX5GiERwrN+XbQxeFWpjcwer9dZ2LznkUZOPjkJrYDzjOmmku0w7pLIzwkUqO5+c2bHly5eI5GSHPBtiwpzXsNZRyYjTlBqCcOnNyAPj3sFmpED8LPeX1eMEEH9BMR8QonjTlXzf8pFyNZ1NIrlw3A+JuQ7eaRtIw6OQ5+fRU8u8DB1FtKeqg4+VvdlnxmBUiTVTn2Z2GauX1IN65/oMlKLK4kYPfhBN1PdzpL+wwSthp+nBfDkqj1m69Sgwpe6nz8DdMGGqNOIb7DVPFv0IOrceF3FsLLEemWZAjujVpozhbGw1WCLES23/tLTHTrBNnJiARZVPNLBv8xN3CiZPeaLBElQT6ipmD0DvrD55vZzqyhh2oGBFZSSU+pxZzF4Vw8lWi7LaGl6+NAnYMjWEQsok2UzM4acDqwh8s0/Ab76ohArHoRJpaJpfXUmkiM8eZtZKOR+pjB8rJWhOdtTJAwoBztRnmfvOufJZMZWx9ridH16PyTlb1Bp7W99dl6m1wmki0Lw6MXGPm2k1Mhzw2w0hWgnv+bb8NBALS4mq/OqFf9x5pIrXIWxaUmSdt7g414ZEFalEBRlRwAse4cqRUYHSMYbassW0QrfmCZcq8z47qi11z5MOGNURMI4uUvHJooEnAmPRagsC55c1y0SBXblr0GYl6kNYectZ7rRDFMAJUomlIZqMheZOCiPRiWRRtmclLq9Rd9Kx3pBhIAFK3VfbkJ1P/XK2tcp37PA4TfcD8KZpRmfBWRD0BbKRVESrGVrp2oOfgRtCGTgjxszLUsShd9anG4nxsvey0NfHHsbFsAXWA1/ohhQDSRSzX0St0xVUlg2h+3Khtv13xkubAKbThmrPfUUdFiPuMnbshxyPdo0SEz4Cnv0OhfT8DeIjeRQb1y6OUCqRPS+psaPaCudRFmKcHbMD9R0JdqrmSXmMNo0gK3sXKtJN1uJjY2p267tbsjp/xZf5+dZU0/FubaA/3V3zz+m7cq3DbWXl9ss7sAv192yHIVNx3a1rbVXnlYrAwE9VSAHBEzdlOUHAtNOk9M/YEIU1ekZnvSZOjK3+stJ6LbetrRvKsTplznQ2982mLXsjHSTQ8bP9Y0sirMifTQgb2lbtgQ3tR6VmwwE2RvGd6888Y2FBVcDyiQGyE7JK3QM6vRt5OcHqsImOc7FwV/ENec/3pGfE2a10NbeH5pHS1gbZ1z+cHbUUWrdt2eBe0HoiUqniCor831ARRpMQH+0Hsr43mwWLX5I01RilyTEYTMMTrC1pk2UzBGaaPr5jjiGUsqHVMzzQdvlnNhxvX2+GX3VfAdbNThm7l2nvMJho7ap0NAyzwYv9ygwbUSueB6kuI7O4OOju1asZUpBAYpwlamNOxXwXgPdHSW0kat32+zrGoEnpZbhd3aIcmO7PGt2yBQaNBFx5yQjlRKJSbfDM+ImlzWjqhOgjzBcxDrVtNISRRAAh083L40wzhI2JouKq1Ma2uRQFN3QZsrKLjXoFonYpmxFnrDflLeyQ76T7ubkMyGzIS82+OgzhY/TXBwL7ey77/WUJ6x3MEXZVsidLkLGTf65aJZKNGrksjosDeRdrZmQMa1FJSnEkPa4xwKeds7YW8iVtBX7ximONK1m/o71ZmzVkO691WIIxW8JS1HhHD8V6ELt1gs7Q6ZYNsxFIPeYLC0eIAlHdcRMgFla2jCMVDsJDaMBVJnDMdK73AMuKCaBQX1wyq1lzgasSLmrGttpkwWfM/W+1LjA/2K2EnTiAeZyq+Aunj0h6vOxOUfPMW3a80B1y5MVSH7EYiUF0LH8K71nIRA2HLoawnEmD2xh3z2wyruwvEHk8X40riMp8+zksggGjR5g5PdMENHKCwKnAtp9ycOoLslLC0wmKDK0jdguvfCwKH14RgeYdo9QLI3dxN6B9LM7j5CLPbWxBjrFCdexjFGrDoUy+0zHNppjSZ41XCnhxgb/6k2kjZno72SNjf576X81XK2Hid4Lx9NA3PzNT/Jmd14Bjqap5fBPqL9SCJyr4Jc5j2+nr9Gkuz5tro4LWB0mQZN/BCLa5cSyF6f55J/AYZlYmXqNMgaAgEELyYCoqMDiAnxtIfxFvtLdh2K8LyrdriQYRqetEGZLD2fpRMy8Jboo0pBZu4kUXcDtzWDvfjPd6ioWoc6Ay8LCkr+WcjYOq4Z7LkEK1UJTwu8E9aJ3nBG2loLzOQ1MJiL0uIwLw1ex/3hNbFxsu4D6Q2RTs+gr573aZgAFISE3NJ4bzssnJmcxeZvnW65fluu4C607t9zhlvTJDx9+R+Hex2BdWkxWxp+R3bDr1ytji49pB3JggwCMOX8ZqmhDPIlt6xHOONnwh3G4CJPuf74ouNydRSm5unOKDiv3qoAA7WK3Qles5qa63IPFdYHQLkginHomNSLlrXGnctFJQhMfRZ/f1NfL8MtPjqWG9V/zN7rEqlu4Txyryfm8Zk0Leo0bAM6pCtsxXsYL0voBKPR2wiMpZ1K5490lG7bIcnGhWGem4YO2kc8STYJv71XsaiIxJGmsJagvnAXRHRHQTdf+LkB7Od9V/rKkK+CVwftbnDtpQBHO3uHytbiiivjwg3rJICkVvNI9zWtxYUbZ8FI2FL8J/tSgCWBUjqr/ZJ87uevyS66tEOPqWzyvyWl/9MvWInPLCvOIkgAUohJZ9szRHeCx2uM1G0FY6/VCN2pHCpBrhyuEN6x7I1ZODAp6LgPWgLJaY2CiOLl5q4UC0JhYjopDApGrOTt54Wgr5e1fZB4KdvFcVRyVnvGxNoJSh2joCqw9L6i+rFzxhCESxyc/y1l+cJ7Rq5Gj9IqY6oFUekTMHp67Yt79RwtfUg8vT8Ja0vTaB7mikT9ETm9mow7l6kL50kTyqYcxRfqybaxPYMnypZhRdF1lw3H+KwXNxf7nGF0RuBwh7QQUm/W7o9+OcRn1j6qQbRvUykLXTTGiFHaH2Nn8sCQR647AZZK33WLe68c6kc0771A5t3E3rDSv+zwOwcMWoVYUDEOOcTj2FTthfIdeQATu74EAawFxo6LiS9FQL4+woio57jMs6vRVausWS95vjr2G5DrnpoJgAoP3oRhIR4rl1Ts1IpGPBtE8odwOKzrqjz2QDk29sieMippk0KEKHK0XxEJWVBPvyQ/NVkRpmZNQtWM4xA4JIhjKCx3RsHzffolSCB1hyOTA/QzSRAWmUB/ibdN8esTGarXoACS/7wbKoReqGoFUGMpu1kMQxNdKMhRal/iypj0cz2e//RBjH/Spjcnp7R249bBB3XkRMMyz5rU0SUFZHQ502WoM1bu8dKEuKyQ0l3Yz/5cJ5I0rAXARyQj33pZsDPgQvTE0xCc+f/5bJYMW81suWQ58ouXM97ZeXC8Sn1NHA3NgEVHGyEnvc7AuYFu/F+b79IfIO2/PMkcu2naxX89rPUMNDcs7F6KX19ylMRnon8rUheQBTbq0GUFOoJRUyVlOd6ZKAfVqK/eR0+e1j0PEcaMy4f0RFfGy9EG/Ad0+3cSxlhh47uydVp7xlFPF9DAlR0mEPVF6hNttaM6fchMTprkqj1KrMDq01qV93pA5Dwb16MKhCw/B9uyV5+oaHioPWNrqjRdmj5pdeVgtzUS+adMd7mrMt8PY5jdZbvO7Gp86/P2mMAw7F/rclidjzcDm+WRvKWIUWJmipSt7heVdxC1GoqPLBbynwV1fBr9UjCOgHXLsDwI34/v92iqJKDAM9pl5aiQ5C+KQXps4sjyNyaMHFVhhRlm6UKru4TR+8D2i61wxjak3f8L/nGt+p7U19nhAMRSJ7dsUfLxAtb/nnNoIh2Rsob9cIMi1hHz7i005TBdCSpeKhb1IYrt2FOFAjyUweAJ0N2Db58vDMG6py3nmykeCP8Y4W/O0J2N68cPeZ/4eOOfzKvaRU0Bg6r9wJI6X7XeiNDA+A9PslfGHrIBRxRCk4iaXb13iAeY4sT4olb15YgctSO2ZERd7qobquEl4Hv+VKdb79f91tT8uTzEZ2GgfwAlTqmkdcV8VwpsR6Ca4gMOfZHwkRAdAq8e4u2HKyioJtBDszceasCAm0IrjOcOjhG5MYG1mBXHX9H+V6zqEAdCkFj07vfEqpQOnTYVhTYpQxbk3R6StczQmHUGK3Eo0k0AulCYYrk9n1iYRBbXAzrZu4Mogvi8ZGrUzKcPVXj05tTF2o8VdY4hzEiWGNlEQVmh5IRdJC/B98QcUhIRQeNhrDVpABxX1H4NZO+D5lKZY+31kfOCoaz+IrchxabLIbH3C10UAOXCIxqWRLA9BZ2WZFuHfLGvygqgTJFMxgnfeF8KpNDpPLVug7O9Onw06JN2QbeOVCP90Ep4o/dUgSJ2ut83xFVEOPWJ3YRwsiSLERQCYDZpNOi25q97uXoZJSNaFXC9O2jFbGeDGedcR/I0Y9RvTgm8nqSECfHoAgrrpyOzCmdu+fojmLqbOAWh2eOCLv2weE0kri0Ww04v7i4jbAjFK4Vow1zhv+zr7v36F3os2ONad7NRN/qIU2ZeICL+ShuVL886d1JAjQWCLXfsxtG7mXbPr8PsL+BFxxvXdR7InxMfwZj4fGVG4XKDW+lxM+UPOuOGJCR0sAymXjphX7MmtiYIHSYDotx6/jHXYDhibtiEGcuHKiw13GF9UhMdVVpoIJqQSM77XB8EIg0fV0WsxgrHGSld5gHGxepX7v4WIIyWPDwaT66cI+ez4Amkxypwv1mwukq2rCAZPR8NL0rqO8iKA7T3XxNtqsHFmreEqoFkRScvi5lff2xLW8mDjJOGh7yqHH+b2jiudZzPi0Rr2iIL6PqOaqvP3o6hiZKUT/mlxwQqkaJPCqiu0zSEBwsSNKJzmcaOhQHQv5VXIqAKwxBxKD9UIBl1pGSTlCweIw5zgfaSEZvHR+dtVwyK7jpplXvyOmBLSi6ZkliwJsABZ2a2x4/oNs1I32wt0O+uQV+YUXWXxllJ241EagtxkMlx8DEAwFHBsEjsJ99pQUKuZFHUsq2JptQbCoKLcslTgkQIPA6/XF1lTauI+gryFJkHwWqLmJY4VVnKVXWTsGUt0waEv9No5dyjGSN7CUElrYbioxK0LBcqWHBEnl3pEo7AYrSs6a3ISDg824JSGEtZ8POhsqBUWaeuH/uJW5orBLO67jeYwYtUsDKP8SUgrA5Yi5WVHCSdnkZYksCM/MNgPzqMtQwBeu4bDugl6wR79nvBqQuLLMWt+CAATS2u2+iTg8Tbtfo6LITr05/cYwJ6AwzSHQLXmBQ5LRJh9Rs7elf91gGQqtwBsRUQ/SCsQHJJUOp+PvZD6O++qo2GNo27GcA2/rNMEn2bok6Ecftdh//wIZ0J806E1eNbAbCLhlHu4kdo83VRAeI+h6g9gfzKAqidfnXGudmzreqs/ozT+HyFB+nPTMpm7V1PbvZVtw3X6VmXZy3YhetPJhMaUBHE/GbXGLtc08HwweVmvIw+c4nZkm/3lM0vNOl83x+vy9E/ZWSjAgnhUgvHH3/VZUisCn5faedsLNV4aLJlDZe8kjicLXRgWd7H2QLGYA7IF0YOSNrJyv+3rftkX4pWGlXbNY7o1o4zLu7SXqS9rlQxlBIT87lmoe/cDdopVcVkPI6oSag5RPu4Rz+ELNTYa4QvNYRm64bdKRC6/Tf62//UE8qBwONwDiDjciqOH4+kJp5+hpVKvQ6dNoStkzJNkidvX34iIliMl5Im0fEx+OBSfbbJRvsgUPNhvzEB4TBSbe4MlMPofocSJUdPprnQX8Nscw6auidobaUlHaSxVeWqxpw3Q0R6VAHJnU3GnSH+rDBKVxa/8jO+YgJakO3/61lrA97AjH3B8llH3k3C99L2PxjTEek5YC+g/DBno3tEJ+3WeROGiEh660IXwLDOf+I+LMhUoUtEX+WXRqmPS7Svrbh6GIwX52YKiwjocKxHnzclERNVwxjHAaXGnKjNOsaccj07qn6V2B+AdzyZBL/dXVOVDREmiR7AsL8gdoayTxtX/tnUixIXm1rnkMNmyakwO47jZj4M3ywaR7EfdkGxk4O7tQhMz+/ivYNQTrLYCH2+X9sdZdddksVGg4sPZoxLfgCN9BLKHZSW8BCC8awNenTePAm517CIYzwa2/NxptDxioFj8+zuPpleV5zd1KFk8sqVKawcxt2CJSo/TS0D441oH5gg3XfKymFHoXkoozK93RTbFJmtp9oY9/u9GxJWYPR2nV6XbHLxQb9gyTntuWYO1bQGUbLIHRCF4OwfxwXR1WLo19gZhjbQXuna2ifvX8wcRZZUM8DZohtb33M7X3rypJgcHfUPwBU8rXByPixnK2eCV4K5n+bra2xj+ihDgZPex8tD2D92iuEPVjCRgU9oCW57RcQ5lc4gaqLJrfmLBeewYwpW4uQWHlMzgqEew0X4RS/ZdVSK5JJaZdjpRpIBVJ/ODV8aUuxgR+qNkXbrpcHR5bQT8F7GL9tA4IrFQEo1r82ej0HnfMoCPxcvtaQ0sGKS19cSY4o2/pTyaJd/XZTqxpccyDfl/TZq8qDHMeMFI4ZbvGxv8IF2Tc8NcvIfXAT7SH8Dvj8sIavTzcPenVWigBMKnvSPUMsN3NNDLbnv8jLUunu+lxiBqMOOgFMbBzxw84pM2LJ0b2+9HRUUGbgnORvBz9o2Af56gx5QAN1G7WJXTeGgZOjdtdBvRdmWh6hSlEFLR07D3fQey6yyeG++0hZbmda0+arbwXaxFWpNDRA7nHDTSSx4QmgZl0qtmBmKI8Mc4jNrB90YsF70Ypf7zhwa0T9rr6psTYy2RXwxtEPwMLCChFNvHwnsZ251G6aMt6BfwzS+eJaO1aQdbEfMl364RlkHfBkUbnsPvC52fmN4kV7aeN5YcvAKIXizPmaMxNcFwB2WeEv9VqZ3C+QpG7WiLxvSAF3KkKIVqx2WJh8zBpAFv5WW8b4awXgBqg/qWEYAnqvdiCzmUiYWGJMHKPCEtqO2EbVmMR1dralzX0rgQcp/ZI4SBSlMVuZoT8mF9sN2WCpBRPceSbMdvH824g4qkcCb/NFilw1uWWhGs48wADYcOsOB0M6iHNiw9pW6K9IPT/R0+ZdnMYTpK7dxmqVPCasmdMSz8yK9jwmnE+O5XIpzoGoWqQi06ulG4wH/q/Dd7mus0h3Tj0Fbe8DymThdkvprlFO2RtzQ7X1CrTVmH9nAvavwdSSrC1NXHH9Fbfbf73A9JeuZEquy77z0fIgN5GZ31F734/lBL6NOqMFc8tMb3r0+6uVhHQs7B3eUy2DrMe6YE0ewjWMwG7JK8yjrMH7c0DjLfGlWw+qUgXGogJXrE6W93gRRAJVkqdNveNWiRUbNtwa1+Q9LRsrF3xPYUrG8Qh1slXlGc5v6xqJqVCOvBvhU6fOEGHD5fs95y7Y3dQMMI8/iRU2Wj9KZXawZHBiruAEpPcWtig47i60XJEiJ/Muanx9Fa476y8qiDbLMNc9m2KUq34qpaYaTPqUAMoBxSRKPtxvfx+8cVmRrE4nwwwajQJ9pu5ife4Xnn2Qi+JNeSU1qVW0pxnY6a6HLKAeP2mCtcTebyPXOrAJ7m1Q9D3MnPbEDk04ADespoOHxO0534hR0I5HSPevBIHzWQWF4Vj3DIIy1kcylZCpd0ZuW96yuzcLtJXRJIJcO0ZRhb0GlXUPPSBCUIz5EsZN0WDU3LLkbWiO/9/k0zQM/k3HOsK0FF/VS+pDRDwIQgOnAk8TQlHCaFAwqlZcdufPhFF73xKXNGSVzhDzYWyEJBoVjNBe3r0q4paR1XPlOy8qCSWzL2bWXkQg2TCTwU0MRhb03CRJtDlAkn1AjwfpF9VjUlxMzvYCk35nDbtBVgd2gltPfnfxiNC3MVb/njbMyfWwou8xr0fSrmqe5VGKr3lone1v4yTEVfZi732RNMX+3sznRCXiXKSQGuRzFvoaOuLdzw836Q4syKLZeSOpbAWvIjh/hYl80CwAIvLEH2XogDdIt9BUXytgUL+fGXURUu5Ti+8q/gMnH4/tg3eTtNTE3BzoRrKBb67SIUoaVDxGvbQzkHs2DJdnvQrjyE9OH43odCXs18YnGgS+hctUESNeVhTSuvEQyhU0WCbmqthcABEBWQNeZbDo+rJLlP4VJQlySgrjQxoqG9DhqTi+yrwSlO6YI1YOyGcCF64MkOeZZd9n0io6KQl9kBrV5+CSXvq1GcexYSjS9tQ8UXtZPzF6diuKooAirWpj+zavGnPCAeJjQwt2tBf0I0dKSwrshCMtAppScqhhJHEaUkFTSSGs+aWDJUd/Y4aSp8ZVggAB8wyOSKxrASrdEFVk7LNRD8s10S2Il302BYluVZ7gscNaYDPHYyYYBvK9DZ3CV7tC9/I28O5FE0nXVQKl3w3dCtA57lzzbaxGiuCDQAUYEqAN7KbDrLf3+kr3d4H/eLkOQpQXqTRtHnkI6q5rzcIkldz/Obatc7TKcF9yIpjKNx4PnahHOP2psOu74u1xneCIVz74ekyhqGZac5P3duZjR/dvoBJKuJsB8XhqrnhAX82x2aw5ys1nPEikeoNV5Mg9rMastMJiJ1HBRJPqTq8lj7U1VigjP9T3eASa3jJfStipv0IeMDnmYGAE7a17gNt51Q8Pz3/MTU+KlcPSjLkEJCgVaZlsmlUhOoZhRbVkj2TdGiWysTlcWSqOjVk2Hvj1JbyVjDDnch1y41PqbjipiPAdf3uNelmAB46LxqcRU2eo82cRcP75d94o0xkK/S9IOyLJuviYnXghwVDOu4LPgwt2Fjsttx4A5eqf0HDZhxqYjlCYy+SyI8rzoyxtX7Hfx20LJ5TlUnoAkip8g+U/Jc3bRIE23mDN7MlF/hGuiSEO7k2CleSW/y8a/45Q2d2BpTDqbDlxuAmVzCUwm+BmjNGkqhXr3DOgwl+kmRNEs+aEswWVlwrlLRGSfd0qTd6vaSmnxpQ+2ejIa4TzvLWnJ8yrucsNK//SaAmXNvE80hsr8zzEESw9VKTCzxzSYqOzU0J/qd3KTAimM2U/cmssiU04fwNWvWuIDPNY9wYl+m55u1cY3gNx9o9Hs80B/oFNi7etD2x8Q3VozErCLYeof7SiBJs9jNqHJYTeL7+aZmDmOLj53e/nOsp8mpWImpmTV6V27EeabkwtR2gXkr9BMnBGCxAY23Rv2CHuRlVWVRaaTZpssLa9R8/UvjxYUe3PTD8B4JPjzXSq6+jvLx+nLM2Ha+pEgC3NH3gH0g8e4TSvi4oVZlwW1e60Be56o0RRXoGTOApPLffu4KwA9YuB5geR3JN0j4zxe6M889ri5MXO9CB0o1s2X3YnwVFBU8UrgbzJ3Fk+bDANMUwXIh8hh1UHQEcapeZerlDc3hPojTPD920t7PBwFzPJb6F9xDvhO318BEIxTH0cyLyh7UMOA+mni/rNYaCLY24GMI+WvkkeB2uPoDGNSRpvX3jYif87HCQK/VJ235cuhp/zi5iee76u+n1tqNgstroLj4O1Mfeiz6rSffym4EHcS0L38WXDZk6mTmO2Y53CqX5SEGka0ZJ/L3svMqyBzUg+wXAdVlpXFEE3vyuX/gK6K9sZnz/nZQ3D5V2MlVn4QU0ObiJFGYX9N/I2s+68dsUTuqxq3yJ/AT0mxMVUKzoZyN52G5WTD97kVp2R5OzTuVaxosMuQrnG+yGeRGrQZUpM/VJfrkzHc1vH9uvu3rQfen2i5ceQYcJ9Y/D5W9/+y03EMr+/96NNJSZrDhZBNb+ef42yc6SFwuFxYVGT9DDqxprO2pzKsReRlUVY3JuQ8CpWIgpbAZ+Bj9O9Ej0HX82fnfdIk8pOP+5dpU1kvoTPtzIOHCRpmYGL/gnifpf6q1SwB1vdieF8GbbwQXqhFCA0G82rd0U4s/OD/JZSxBFlmd5dkudeR0L5Fk8WInoJgv/y/yBHzwMoiMBq+QiR2+M99r+e5B1dSKuxmvH94/WEkoTaEaMZ3TV+aC1r+pNTb+GWQFT0HAZjxCvaX27WIrDoNVBvurS8DKN19szyevPiz67KqyBfvSwX5pF4lzx9B6bUimOED+U8BvO0auen17o8V1029x3YXtMgQv3OSCnl31v3iU7HaMz6f9VDArqip/vofCaAPSKFsAw79FOwLxb+VFPmK723fcHPZZ2hcFC7E/nozyfKqZC9UcJyDCTAg1DGlj01PvY/EkS5EU9zrsHf2n/CfhSzOKDe3bAvSQ0Bx94oWUSThYk4Visc9LXNuCyundMlPEjMd8Gq1o4aRsjIh8x54gOaWxY3Jf4tsI2A6ZwQcyQtyb+7UKXH2zMAEXCpecnkR4dHCs90dIo/oOpyfOJ3WwE1OZi989z464ASZpQ1BCkVE7bNxlE/p/o0nzWJJ/wSqSO0Td97BTn1lX5aJRPtWHmn6GmOheT0L//A3KpfFMafONGHSj1ZFzpeoBI9iFj8nPnqYuBw+6wBOfDtFpYnXjxOD5UypP0i0Zh5KkBv8P/l97Av6nZg80swgXrcGQiFyIpYeXhGAZjiUSv0ZWmfvulgSjBMBWa4Cl48LZ0iPdDpWDmkS0l7nUNFDYdX7OHTPPdTYlLgl9h9P1h8QCKYKiJuNKEiUnJcd8UG7YPfbaa+UjnvGYpek6iW7fDpmikFGlFZBh2LsC6nwitk2wT9w6z+Tiqa85ptjKoIR+tLGM5ik/xTGLsKRcSThZqhV5OK+3ZwxmT3QT0aUiHvmSGPZyXufhDj5gD2cTY9wuVUTim5M0EDCtfXqosfYnBw6SwAfZr5QF6V6utcG2ihcpB2EWLymzoz3glF6IrTZwPomoWy+4cZSIyxiSoTDNdl+jE63guOQV9g45ZuC7n+AKZdlP9I7C9okNZXGckN0H9FIu8VcwYHVoCqL46/yNDe/T1DkLyPxdpIReRJX6iyYIDTmKGlE9nlbjEbMhUyHZ1Lc/GdDZ2D+bi4S9rRKGDwMDjWph4THZohkeuzu3d8VcBLpom6rhDm14schZKh8GKZgKx7shdst8XmMXVqn52Bw82k3eHTbNBnvHlH3rfHttmcoHp+VjWzmxopWyuWOnsfGF5ZMJnp8SW3J0QIozniKM8i8bn3vpnlVgDYPgmvXPxND4UouldWJrHrmEPjNwbXE7rHP8KvzlSBrWxtWxXpwOOOnkJsjih984/ervuMJoyXpo5ykyFrCm1MTq54jmP5sF1sI+ItLqzEGL4kjq73NLTGUWiE9x39UdoQhpCShrZzW+fcyknVr5X7QujLR4gHJBcvnKGyYiqwD126aqfA1aHcR+02/Z57J0BKOhQNkDWQ/SYLSjrPu5rOROPmhe1mEQ2D2qjfRCyT1eAfBe4og4gOG7NYyRJN/ObSddguWg5M7nj4113mDoSBYHvFgA+3/751AIOUnD8nwTEIcRcA+uyBVif31cFizhTrxMXNh0vIpsGwHxe46EX8TLzhWty4iW2CyXqUXX1Dgddbxl5NYuXzxdbX94wDAG+RSZUtuXnBEsOi4DTGzjbL0GnzcZG6LBn+IZcsMSmNGDmo2N38XM53xUBa9S0ma3PQhIEsoaSwAhOK30ay/3caPB0w0PISV1K6FCu7lVsY/XDJbLX5FSsUiV1HJrZHUv0ymbo/MIxSaA2mged0/XwkRcPrPUJtRuhUB6a8fAPRkBLEH+2Ise3B0SqzgORCc08G5GFzIvszLqajSMu12VgG/WdaOOl74fXk2qImP9ViHQg3/GsgMtBXnbH2aQJwLTZ8Dz1EzW8z7U2MuW4z5N6By+/+xEVWkiYk2/SZdp9UEzBR5/CjUOMhYhYyY5rPPw6EO5jHRa3/WkTp7RPUG661Po58NHDx31UW2nqkmCM2/dk9rKuFcEMKRH8tcLN/4X5hc84cRgq6sxsZjldwE3NPO4Mnn5Br0V7N0g8TtyQygc4BfnWFxVWnKn6Jc2Jvh9A4ugVanzDJUKTanpclB6aCRSGk5Sb2MiVMZ4dSvgkVtAsghmi1hzmyyL/tp2W3oekeYXbRR3Cbi0u4FPsZgYLO01Hte3UXP7wmLUciNjj/eVQynxFxQsLDunES9pwfkLHLZM1c//TIH7O78aSCwa0qyAHac35BmYObyRMsa8ky9U2swKpR15AxcDJ2v0qZI/nJnrzri60e1pG1NpFBLarvGCGjOzVkYSciR9Ti6Y2ZVqQsRgPHEcBpUZTo4WH/TpCXw7ku5Wnfj9W2W9cZgtSLXfJbliuUvsqwuaa02J41cmFa/F3M+HQTJAgWixYNZ1tWUE0hlb0hWtVbbz3MBkzxJ0gQNJYjRLF+5FdumRvtewAWmueSA/Lc7OHhDVInq4DEDFempVOnh320eraBHlvvFMnd7CK+sTXu39xA288HlJI76NvSbOl8kW1PciMueBnVaVcKTkcDQxAzMme738ETyPcOJpQCesS4+/VVpMtTPPfef1wxOYrsI9AsY57iCj95s/rw1/iTIvIqMW/NiWLz6k355Pf2sKDYHxcZdZxfLWfYXVbHAygbHnSNaQidz5n8dPHi4l3NaV3JJ/8q454TlfHXu06+DOc7Uzw9bkZgTlxw95NKiLqqY+30VW/g1vC3CwzPl6t4jTfPlRqW6QAwGclJCCW6qxeUO7Q7Jr4SLDZS33X6xr1J5GYk34U8CxEZDFikGR/s6jQzsZU7J9FUh8xHpd48Z8wibHq23vZCoaQNEGbjY7Xf4e+kCK2YXQAwZy925D4RJYnQi8o1FXYfOfXu5U6h26Lo3PNj7FJ4iWzp+7ntmI1Tkt/DyhuW5XXOs5dFSr4s0QmCcT7ojvzLCNkPkiP+Xbkn1KjMEeRD5yySStpF+i0om14/lNssxRgT8ifQXkKeZZNJn2z7xs5+wOunCshjoHVTn2gRLu8p7AAqW1dXRKNnQbk4LqsujT11Jtg0G3MW++q1HovruakA52oYg+D1+9X73NvP1+tcZDnv12K1MbwPigW37rltklk60lY/x2jJWBPDGYQLXc7Oo85PDC+t+A93oQHeMi7gZtiekhMlX5KkhMwVmx4DMx3PuDOiz5jdLO1Jms0nR2eocwR7M1Q8Yu9jx38wztxGW3++TkGDQslgYAt294LO7gcLZL2dPcgqFx7Oet5FUrbFp/F719G9sDRKCsxHTFOXxKxHQWsj9ca76XNEckZHnwZsNgFzxlPo3G92zwh0x6txUmhryy01/3tLwmYNcvrDUJwO6Yrrijp6Tn90W4e2KBNMYYXaW9sfiKIEZoPPbt2U7utUPWMoo2yfGs6W5KV3mDAFFISrJ7aNOG3pJaAXGwIRbMHc5Ov0CDVZsi/+v6Gq7zgI4X2P3CFfQ6bScnZeqZZRS/KE2B0ckuGAgEDCPSbeDPlk0nR9oUUIEt9X3oZz3sX8hwVi4Zf5yWmITIav/mR/VPPyu2BimVQ3jpMWw7L+o/RdDK9szaYnN+/cJURd4Iv5gLf0RpxFgczYyZuq0tcJTscYZ3XbUs+DJXuIUQxLuI8kknllPpDjcXs0RcWx6aID4K6D3sdvBburqS20cKcVIExdN8DN33kvWgsN+GMCvxYwAvMyTMNXfN0hvKu+XhT71b76CK2dkiuUYIJQv6gG+wkvFrOmr6Xi2MUvd2wIfBrm3jnB9eISeWOHLgxYPkmdFX4QKeVFAY7vv61NNSx+wr62VsRjWhJu616UuG0iszJIaJF4NuCRWYwwpavP0M3PAuVgQSsVRhKLYt+MObC62kONLGHm4rtZ6uhsi+LOrgRV5ctjeWBd6ETVuk5gu11FROCDxA6rZYhY/vIhFPgCZSdxt+HWUTdDnXhzVC+o+vzsQm6nzYnCc5SZsCrWqxq0tt5zYh1/hrqtZhKW7ZQKwyeqQoyaLLtmyWAlNKVgCjHYDa7DJsxhq7IP3XM8kF85F08iufrOLt/WG4asUKSO8KLxpJGVt3fwjVi2LyWc1zqBOIMN2qPv7sh0QF7+s6rH6xBek4JsrY0dhI/CHH8u4csLT7+fvrIbmINzB4QJB/TAYvtLg4B3rD1kCZPN3ZEqtXJHvtOWEAILcbrt1JOahbNkXkO0igKKjaThAPeorJOoYV8+M4xBj4tm664YW9wakag55gF+7WBug7mqoY0uFyvN1N9DhBkzo4HlrthuTuzN5xY0Rg5Y8Y9bcHffaAreTihEyfAq6My2Ge2r3fuHRWzZuqUTaD7yTzWqvDEIWPOfsFkW1yqZl1EJhi8oSYXfJ9tJSQ/piuUK3K19J2PJLGuNWLhtHB4hakPVpn1rxhvOiEMjQ7ueb2+/KOhSyvJOYnMka2gOm7pVd5ZpcuNsJ2zRCx4/T86kDWxGv7ZP9iMn2KmbxDKtHaQhEm+hTVve5n3VpkC0nHQPvUF7PJEVweW+xgo45KlZKwBVUntkqytXIbhTJObB+ef0eWN9/OiH6xcPe2tZY2sERw4BE1JGa5K89M1bGCblfM1jwK5kwVhHC9f7SkXDfamF+FRMxawjaYwGDPjQGhkq2QeXn+lgFH88h94+LRgj5Kbckc0uCC6t8cO6daJBAQ7RqLKnB9uN3R6I/tz2R0a5Ji9zQtMYrXX8KzD1eyOifcnv6uGyVeKR/vqrj9HddpieFjiNcD05U2zk+GLuitPXvCyicHbWHiMumtg41zktEAtM7ynyqJiViuPFrXTxa5gWcxV0crePAYbVSeT4eV5Qc3xaqwPSckge6huvY+B2a6REbjCU3Gwo5Xr/WWb54dyKCuYWcfUm4P2rKSot4acOHlOQF26zPVarsV44NwkXRaLIlGF22f4NWxkCk1krnZD6WkilKrDnvsmtjDXGT5b/NrUH/r/2EZzK51PDfg3qzvBOvJQy7yW1wD2ORsRO6IWfS2vOp2P7dlWPE9PKXNQdM7i6leKAK8fCLV+Q69J4pF9nCZWpRkYUZm5KHK/1kIXxC3U2PMYvL0d8helTZbyu85pXLEsuAhjSjCyjGaQHmRhpNabO/U8zscVPMqDD+XYPrWxGzAKKOvmEJDLvF75sbxCFCX9tFeDm6YHU3zd/mnphI9EWBPA/Z+PAovecGLW5rTazK+abHDkx7Vsb6DcVoazS75lKShYuM5O8GQCNbYsvP0oPDwNvdoBEbRtn/cHUB71X0rbTfzBzcHwXpA+6CUkx3+l+JlMkSsEagWaG/l6DEEQICrNDt77ucTtBML2HJwBXV3hgBkcRBA9H7qaalkeFZ1rbQNLel78tmNxYsnjRwBMYQx17CQRXDitymlAtQj5Mi7Xw1OQY348NtqNP+qox3mlFb+oYrN3kY3/gooAZ9P75kdk4YPTAN9Z9JdgN2RqP/cgouzzDtdDdeTdvXDCrhQ1BE9awF2kie9jOBUUkI0xeAlM4Z+1jfiV3fU+4yA4N4I6wDf3cXmsaGOBacSCAMgwdwMQaCHaJJEYA6um2VGgpMhITglto9wP+FJAEoACrrcvV32J4STKwonP3lRdwZ7sOANzRATe8VsRAkFbauUOcwQIQcUuVSqA8YIJELddDpaFublYRRSeyHPDti4PVxxLzjMfPGpLqQRj1WvPqsj2XyWLjw23kCYXk8CPcc7v4ZGTC+C1m/LIpcC6SgBvV1hvmq0/5Bhbvz6KoPecLVTP8j0miU9etX+jd7kPYZnuumPiF7vFgRrBXgbcRMJQTRIfMSbInL9PNPyX/rG0eC0vELsqR723jFM14GK8A53ZWiOWZcFGhQwmeCLuERvsQ9S4QxfTbWJbSwJZM47oHVuxV0x8h9fFzbseAzKeXyczrWZgzawSz5hzR0sntRQZx574xI44FvDJPBXDLW/L6WiYVyxSLaUfi7Rbjpy4qwRPbbLjbaxJK1Os0kiK7mokuVHusokFoqjy0BzB/1LCk7gZJc0Rpum0Q2+dVZIAVvCUmQdG3VIX8jz9llNOccsrzEXiKVXzU1PBIfQUpGUXpMPdeJKKxrdQS4qKbqdsGm17yNz4hWcha+NgC9/qxQnLX5Ac7jm7bU5mJbC0DY/jhweOONfPCOMzmrMQlDaoFGzzLiCYO0FwC9qIoeBcROYwKHJ+Sg42L60tepV8bs27hNEJaRWmi+7hYH6Yx2Ra30nJMXTpd6mAbo7girnXKpIoBOTZVd/vMOP3fS/iCT8IT0tClNo5ttUok/aupA+ulvCUZAWMJfeGd+5I7u3LLzXEUlgqzRuPZAZj0cECUF2cm6hxCpoSar6rIPi6TvKMHMnEwRnqPRLON9Xzb99Q/c+0jJ0AyPf5n0VKLFteaQCjhO8vmxWsHMJrHNA+gpFF1KCIhy+oQTp4jwLe0TRWFYwR+K/Gvw8kV24EtMyHiYjJ4+R7NRyWw+JkDwqSRgYmrQ6QfEa+HSpwoB7JEGa4UYm502ULeHGzqXGEVDMSRz1U0LL4iWZA7MKGBn4Xhf6YtsAmz71KgEXUINk7ZI5L0OhhbEiEQBRX3t2jAuKe5gVVJoxLkA7UK2ItIWzzwVjZhQp457QMoD8gm/ozHA/R8nf9QGzbRJi858fF4Igi4dClmKO7h5cU8lruz3zzQzTRyFg5lqGCFLgUwml50pL1NS42j/MY0BysloC56K+ikJvEa10C1Jui91W+iEdIEw8ilSSJ5359EDKqtuwcRX+tBAWiV5rOPcq+Di714AdTZQ7Lt93TXkKogDex0Dz1qNg5QCbBsnCm//EQVEKC3azhRb/vp6sjIVOcJ4gIYkM6YKC7ejoX1Q0xvrttUTy9CAwksE1sZhuYCdUzYLLV3gP6ixbmOornl/8EKkGlwrOq0tyilW0rSqVyze7fA830fiXx/2hGH6RnGNSXg3UV155qZGr3APT2aJ33HjXxenqOFM2clNm9aRH+J2cuqpjd1qzWzObXoK9kzFaSql0amcOszpaqKoPVwyFxXK3HXAlJ5e12UB79uP6u65nPKvap6RI+5jCHKtSbeYI0H3ok3RhFO9HbbpvBNTp6i7dZegTXBBbWtsqNTlNPUSCbE+yWfXRimgdActCl2bpLmq8QP8oODhRbxmekWv8y6KpdR/WWSDXTZlMPl0gQLgev4A3HhKRbTPBiu9tGxvdN78pz/kVcbf6pV9RDeqo9uoR07rpbhsdiKnhTRUJc5v8dHziHkG0pVwku1dRrSnKXzPeR0RxSG6LMVcccsy1UrabzWV+laFKpk3Z2m6+HeyMAWAIAdstr6roijBZWRKhuKrdzYdGTjt3x/d2lpVfYW/Q7eNYb6QSd4EeY+xJVSD8L/QRVfK9jjHOBu27JolqfSvHxL4i2NjTWRDwUdql4jqaZ+1wDXRYOlcFeZxvempkxLpfSpTJkExlk2kOAmyd97hkNXWaPPsVY5pNKjyknMoPZh86R/sobWrQDuDp3idKP0rq1IMGbN75yeMOlGI8tiERq0Y4oTgDDHRrdXdj/aj23ZE5OGqE1ACeHEfFWQN/xk35E0P4uViOKNDqV2G7uYCbgg+fAzHdvD8o2Sak/pNTmAnQAqctKx3J2l3vV+I36w/ZS4Pv8os7EWE2wIGvkM5EJ32TjicKFPmYNkBI8H6qtEmEbRumctSjgFbqL9+cHe7yrrxbKZuYkdeUcgoFUGmMgdxcDvaAuCpbU4vT3Ek9nOcsp5yuLG2rXY0yV/tgtpXOYi2imfIpWz8IwmXjJh+Gjy+AwrjOTn19oSy8p2ZmIHkf7kPAg/ww9ZsaRyn2ZLdGefpcdKQCfIur9Bh8Qh89ry4qKDMlwOXA/eBbzdxtw7u4W7tWmBBaZFWNM2jqDdpbzZwBlikKXjI+/EP0N+dlt2WbWJacr5DZDrgXtfhmfwiV+jvYNDWG3E8hKeE525srbU1Ie9f5LdgM9fGk1sudsWeG1yM35mHUgAWoJV5KFtsCb3KK7oPgwRGwXCyTrgVzPhBji+6KVobUCjfWc2hBeTohSMcp8ZSiT5qWmgX71mfaW6+Vom25xz5t69LBli806e+cHIXFYhZOJzXI3eJgM7DU7ysSFyAGF88czNBd8q5ouMdoXk74jFrV0F7zGif6abMrvxeDNcyXxDtCALRAGFj3k1ZVnOfA6e4sW9YZVAgwGSU6HG6vBaJDabusZRBGU2PmxEcV9V1S/dFbE5z6Jz/2+TuGYcj01+mbFW5zjz3ah4VqILjLRPppc2YQN/6+p8iYd+nyRA6kCW8oupAdLszKgOhYj5KxHZiGZxuZZgKHUrsXTsTlANWKImxKlZua1v17FVKJMSwFXCvFyYOIXvFf3QfbWKGtxgUNqAZXo+fi8TkUQHlvVwdXrANFSurJf7GH1aC5V0PMqm4Ojv/rXl6nm+bsru89nsbBfPE3K+m6OkRkEOJrkIEKtIjg/20K/U2NTYowlOcPV+3z5v0L107EjO4TPzFsl/NmvVBQoe17M4nmQAykKUftcnUr1lw3YP28rhXKpA5x0KwEYeM5ueIfJxGa8JBLEo1SpthJ6T3MElZAVZZTtdvxyP6Tv4X/bLmE/5YjI+pTQgx2KMZYNJZpTcRg5XQXSNaMDp5v2+htCAd72e0L0FKHRGHPyA8jLU/cAcb6FJeaVksoXcZHmI7CLbd7UBC5AdqDquzXEIHIvvhMb4Zj1kCpa4jZMaRHbd2ZUNSFSb5ZCZYz67MbEXkclxt4Rv1DUrlkcAYyJDeNdH6Yi/eZI0sPGt3nVMwCzh6BPRS/wVOOoxgdQqglPGmqgkzhE39UG3iOvDURqyyo5jjhp+p0ANhriCb2/sIAEHd5BAAUI6xQwAQOqUKPwGMiQJAJaAXSEY7fgZoLb7x4w+hV23BgVKYzN6hFMcnF3x5XtDfrTzHcCIy24W7fzZ/TLwb/OybtfNFpk3v795wn6tjy3zY/ytuvgu9JytwV/vayg2SFbOHBYemBXdfXZCKlj3mfjOP9V/gksi0nR7jEf4eYpmeBOPj19EGBlwJO40iXATbBeVj7zv9gzDRvSKFfh37XFtz5vVE44u5jmi1dtmdHTzk0wupSg0rV+/x/9tbcsBDUfT9Aw+kjXKwtG8LHo1FxP27MlKDMyAYLR/LU5VeJJV1ksYme3dMXmIiF4Lrg7PPa++IHU62f2EZ8xwgswMZW3GfUvhZYwTK/ljfcx56blFcjSPosCTob92nVJEh4++4d2v3HtmCX9pRsLL4FSEPlf/jxiYWmJEGQBO80YLyacZiguCBmSmxlCta8h8F7TVeIFBsglzCSckeSfFlW6cu34cwlrf8OjBmn26Iy8J1BNeNl5FkPu5DoJw07q/b93ansjM5T3maX1X8qjMXTIVZAiSwdGSAvuBDHMziWUlhGesvJyCeiyLJeYc/2FHLlPL1dqM21UxpTzTsP4vbCaQ7QP5qy+7807SJu6J4b+YXsPfNXaQCsbxkFbTdlQJdYWRMHFeM17MO5R0SPlnYTB4KsJ3yJ2a9Kb/dAuoRkFE1IpRn5meCodfoyO35VKy1VlifRMbosRlkAkI/QD+bBKZK/is4ddiWELB3RHbJRjWqR8X0keGCZQnNHaZPrWzGBpT1rxFGXps5IcX49HjgmDWxiqBhiO8pBEXjwh6UWoH038Zj+xIsr+2qknWQZbbAwfN7vV6C9d9eQvcnPcjgKixdxZdEBZWXrF/lE2VkJDqCTEoYU7DVP8NVmF7HcfqOatAaVFAqPmhPtrfq8K4xW4dRLzZpEmTeBYySrvJnvxz2yWJ/n3MTxyv8j+jy/Udn+MmSMYXPFrl1ox3s2w4/QEP4MklGg9GMk/yErh7w/A+1epxSNpuLQYVS5aZRvKPOaE7cP45qLZDOOAVyzOQd3JViAmzI9EHcZiU/7U2mirnpNAAM3/l5ZM3jKDZ1Ha/PpSsTf9swsQdSYcrXMj7bDz+UfZIMwCglWyzMO0GO9XzlHWE2CONJDoBNVj2lHsJR0AlwuV0NALMp4v1cRHFGI6yOVfeQG2iIFNwOhEBmSpHtpAaAEU+4i/NDOWwEko9n2tQajK1V9cP5mewPHxBgNnixgukRr0zbSt+stOoN+II0XdEawXNEo2WlYJtd0Z2P3GDqQyzfdGiqk2BVM4RqI6BD5Saa23SuBNyBVNNtKdCdlqDfbZR8wDiHu1F4qjO7BxeufaQfXjZ1LdNoc+NSikaHOTiQ0ZsTD9JutgQZpkMS/PMgO3rwDF11QXBSQUl7PxyhZHEl6PJHmP3X0uqpQRFwJlrjRlNHFgWgVMuBs8Aig1Pq2loQVmcYisB/zyRA417ehvmMnOYgVmwNV3mHw8zLwJdT1SJTUpoyb6nunuoid+FMBzT9dVhVU7ZDqyOXXVa+U6hK4jfEs+r4ZjizAdF7Yo9AwZD0McDikY9WVP4dj8IrYlojyEsc9X3ouI3hVvC8Qi0iXJ3Dpm8YQkkrSeYdN1dXZmh42tkMK7mrarLLcZPj6mBrDC8k+S6H8zgeY7NDPd/SycWIXMmeQ02qf3t3V53XNLJmNnyS6tjf4i6lsjLNT4jtHIRDzmbw6ZoCBCM2ANsu9v8OLr+tM8rMTB3aL0zqDT6LEUHNbqPjo6x22ppaZtKk+AgkQzsXCd17+GT65dapIBsplKIYk8+ZTtAugd9QaeO+4MCN0FqkFZD2qWuR1QjPqLFsNMYU6eNvfDTefSvJQZ4O0TChjgtdohAyrYwQJFrwXX26eZfMZxcfTyE3UE5Fj7fmaOMetvoKQa04g1/cCdEQewTDldlOxItiq7ZLjEJmujKcK8l+qRxiJXjhSbjk+UESRgwMn4GTGDt7yRtwmOnCuyenmdCmimQhPKwTPOQK+GHwUizDsGy6W5TN1r6XGVT6H/YjPubZTV9q0sm8IWAyGBVgHFfVWoq5NwId8TCpD/KuU2gqiCmy2v5ar4Y+oo7oKHSQsm8nb8jLZ45ZvkmHyy/AzY8ve1N6G/Dm5y9XLi7cv0lZVUvAiL3ovDHs2YmFTbweiGpi1O53dhcP1BgdMKuw2CtIbv903h0UVkRV3S4BWxpZu6eYiwPbLEIXpH4VMfXwo56HIp4uiGaBRhKv1aN2Lnl/NXv5a19mcPE9Q2TreOMR3zMYppn3ndpeKMwfo15lF/KaD9gg5KSaBKtqUuOdNiUsafmkteNY0W8w197U4AEa1fNHcdTOyB9ZJyDjGEc4Z4MQ/6nSTZhd03B4XVBsv/osv0xP1oKIOpL0zstIH1mVK6s5M0aP7e0PUxzAvYnhHiss1V2WrL3yNvQ3T2oaYF+9uEbEnJd2m4EchLDOrbc16JFZPVPZZ73wMJF6Q27zvF6otKk+bbRxOvrsKBaNXWCdoLKB/SPo+Dg5kbbKl4SscYZGUvgUSw8Y/wiJ8uvT7ees3B6FPksSR0cFgvr6FWp8H+T25tT1Y3XuLNljOYUFCqleDWmlnS+NAb8YYg8dwpLvML93DVwYTchceg9em2kFt8FSPdJwQLSG6MgTTqsFxw6mIMlLwi94wiUJJtNYRZXBYWP8Pzs3Z5a4GcktAKnvrK+w1NfpOS9CRHx9NSq9w5rPYyXNEKoAm9Z/544THhN0JzPna7Yisq9qt+6BTTk3kGRqiF/Tsu4fQFM5D2K7pm+qQ9g8KRknX+l5M+DYx+VpwXtxgiuHWovQp3jX8JS57KGmyypNLl5CxVk6MOq5FjsSsdSohmhxe5I15KP8fXogP8sAxZYeLQvmxTs8ZCsbOAT1m9j9ciq8omaBJHZSspFchIA84IchvGHhi95cbHgCQAjDPq6/MjgOUP3rDgp+l5RakoIjyrEQzKrYC3qm3uoutjjNQqX9x5oIjyIrAWc1PLcuT1fVrpBy+mUA2CO0o6BwWIolZQWmSv/aF2CiZvAgmd02aCMQDwaBw0V+P7gDMhcmwq7guB6aQb+JsFF6SI4VkBPTmSIFhlVyLO4MCtFX5tIKnU5ySrDpew4gizo2+65uPHGgn6+FIJSYyXkge4YX89ZY8ZR3LHW42OdTgcp/bCAhdKHfc1qoiCHMbK+lQVCbY+cSevGytgeY8ifwtB51HplL9rtbRPg7nB/Y+CZRh3aav0GZ4IO0iYLEF9X1uPDY9uLb5YpzB5525+3KYzTma0oSA58LjliCpDks+elrkvMkNHsoxeKgzzh7Hw4PbjtbYWiETGwruwI9NFo66VwmQXMnDaBNUz49edXtQd92ohkW6GlEbcx4USSGxj3c2AlX9XenoVFXSM6Q2QVi44uTe3fyYWaKilxbHNeGz6XTZ//R3xTVN+EAlWkoA9aqT0NduIA5cEAE1PVh+Ft1Gpvh3V292HWc0NfmJ9eP/dZVfeoVT1/jrPPRaAi7GU84lLwVOsqI959IZkWu+ub6xj3KUZ4dOQ5Y3ZlRw7cwYFnXCWlzgUI4wFJyapXdlcmVFtxPlxHerrcu8g7PJ+LMGKq9CmRv0QzbAfMp4ZaV9iOPRJBa0n840PwCpmjtU1FpXIcKwMT2pblia7LXV+mmjMp7zkE9nna3seOz5Gcl0wJyD1j7S7hOdXpVzr2AxRiB1O8H+EX02thlYypD0irPOHs+XBTI1ViCs7tqiBIvO/V65LcVlCpBOqqZVbAedFKJVMUfSBbYbsR0vIaMu9/MS0uaeTXwNR+zW86FRUTU/zzX1qP/0uNRHZMM9KU4s68xsnY+NfOSMVBITV22DZ81DHRUXMp1LDjFPksM9NN2kToBVHALPTqzk9f6UJMpO2xM2qUP9t+jx2unlOFP+BlN2/unLnqf74Z1I06tk299B4LHUrYzuXQD3VNxQsdbKLEN1nm++NrIrkP5GFEKHhNXrGDurLeuPFEjk1gzzJjB5pZORVlEZ/6a5dkoWyA8GLXkJPwazkv7ezllMVQ1xs6DNYhTfyrq/4T6FXIo9h9JxV1UeLZw7+FdaDJvDAdzUgJeqBAC/8TSESrTiZPhkyh1/hziISFfsbPztEp2CoHKc7uj/elJKDxbz+AYmoiNLp/6U4236vo0aew+kCIw4WnHxaNbhUw6jiI+AavSif3vqSZsa7NwLtQEuzMYP9kDVg64hZ7Pedwc7uyRWGSb5D8GkSmxWffJ2k2delhlFsUCDCE41w4Fl9/OoKp0KC1XFORQhd7s9TFI2izLEuKpVCv9G7JgrvrqynqYpXUVZZ3zoN/tv3o5cRdYVAxA5U/+BKWFjhdpdRm4dlpb6oBPOziPe9PvMLlacrmaIw/F7NDEDm+ovJcAipebPGTbczzKu9DM8RMqkG5kjJkZJ67Cbc8nTBMCopf0iXy6JhAboWD0z5MkzH/0sezj+JQc4zzPeDFnrr6b/IvgGQZfcT5+k9T2UffRwCYLP3zowolgErCz6sGu2KgszBv48d06ze+QENTxUuiQr2CBCZ8DIEQJPD2WWASlx9M9KLc/LWDzem08L02KIc2ZTjXCxvmD1cCbFmjl/ENc94UrjQJswRvjqgj0VFRRpLDd7/FxTSMHdoJRdw7dGzer4E5/pyvjiRxwpAxuYdE8nb0+LWHAZ05cJHRRcoaSBS2vsdoMvYpWErwJboJ5Q5iWaqzFVT4ZGARUU2M3HMtusX6SwdYZIaPTpFS/srhzjEkJWeXpnV0GRiArt28N7oQRcI30xHT1jg+oTXyhZz91eHeK+PpFPgRR8Z0+VHcqm5kapk1umU5IE182kDUiQWvc4fXA9Qd2mvQwNzvMRR0jjK9wKVjNlcaSZXfxb+OSJ+rPKrXnu0zZg92OvdkOqlintJBH1xRF1BHrtqqAaUqtdq5x4f4vIlbCWR8uFXz2PRyhwskqEufBWz8G5ausG77OPs8wx7cvcWaifAMNj0ZrFEedZwjXX3Pocwkl5Rj2Zv4ya0at4ceW0BL0tq8bLODlt0wWuMVY2ULUkPyD0+/TFcavRjUrRBb2s0bmfJ/r5XnGFaY7H60WGLK4X2qIvukFweUwiDVCMfZwz+67HSXDYfR9NC/gNr9adTiYYfKgVraK2ukej8dP0A0WGNBk7p5qkCsnSKtn1WIIX59+ptu4PgXA41DAdE1tqoOG1BFE07teEVpBKp5HEIp+gHhpJo/sEkxI5NHgeVxaXJ1U8G0YT6U6w6hCLUs36c8XHa1gATFKX56toTS+BEeo/y2Oww/28H0L0CapIGIGNToPgWN5vonJIe5HMr9IHhchLC6KrZRr38Os0d8LGbtrkqVTDU/WzFF5v+n3c3TrIFUjTV7/8Umq6D7ewvwDcoRp0uDcZ2ZFbaY2irPnOnxzjbcDIGw0U8HI01MuhWJV6lOfWuk4RMbodB9uxR2koWc4locUw3ovDCzDb/hqgSLwvTgp1RpNvGgzn3XU3u6Uc3guWUt3f/60dJnh0/p4wOCXiNn7dxsPynIHceoUy2RauLU8JSIOPnvAvyqMafWMsgS62MLvdj8LhlxK/hfF6SbXaYINWPyPG9UxIPKFMhK5l/xPEoCvDdxLuoBwi5EW9Pa1xqqmGL/dLhmyaSM7FOOiXqWwC2hXw1uYFpB94s1+JJJfKPnHnu6DdefrXEixAOBSl18bd8lFQpbYVO/X8EkOeVzLqypXtfwfyn4avYRqJfNo6xv2TdRpHoGPk0LpKsJwrBU22obilibr3AjUAeYGUcpxpmNeoa7W52G7JZak8THd/b6xbeBc+K7ecjHaaMq/ZoP3h/riiNpzum+CZCFp/QnbhI8zcq1HzEJxIt35fDm/rSYRJ8bZxDpsOW94DXkPikgcr7vAi3o4fh3beIN83gXTbKEfwY7b5uk7ceuVtXvyLTrwpLabWurhZCg56mzknewkRwpKbRVpdUi+3DY7ZcBabv0iAILc7+vYynm+BkmrWZOq7iAOWzOsCUZ/RLzm2yt/SplD6vkmi2IAm2ksxNhTxcYW9OREscJTAX4tVsHgL9PSgwJN4Mug5SBjteXPGsBsOfiMs8a690kFAmW4kkazRvo77o3bdGa+/Tk4CtEDH+PvHCmukaFKarjlusC+BopmDXa7THhY96/kpTJ4fUVtEUj5sNpcNqtYlUxFhlNpoJPfZg2ktK5YDJoDAJ6EinFgFip9IYMVernc6F5dKW6d1aukOhwYCQrDy23/5/ww+mYJC49PificHv+yivP8KT1If1YdpmRtunQ7s93Bi54czxygI+CLi1+zfxWg7EIEmLFrLPQn6yEz9p0B5o3V8Ff/VZXFik+annwtFVhuzGQebahQlFCpV28de5xyqGAseSy7TmNkrxoG7xcX8cOpAmlWu0OIqc2Jns0KLml5H6QSr//3Eq+np9SL9DOibDJpA5X8p3ROQruQTgmOC9aniANHheuF0qt0YwYkJKgVZnD9eTn9Y92Sxb6tEW7cC+cPxdRg1n1081LcEqm4VIFEC1NM9zkH7JRkLiJ+VYA+QVOiO/XrsM9SGkllmQHvORpAy2VO+wTdFPuAbYmCn1ZudNJ0bjMpNS7NdVzO8E/3nB66x1XqMsT8G6aLH27L5upWAxnSRoXTLqJtKysJZ7wjR2LrOIK4O+miwOKEBh+tNRF9raU+9VcxYFUJ2q2lCpvfP4ANqiT5/i9fjLZQxWiKahR2PMgBzQxbtJCS3Iza/oo/+fV1IcQTJB0VHE56yszBUqrya7SzVUMAAMasoeXtU4qM/5R/XpnjifFylnJgocHnEq7M7k9JlGHDRSDIEZH1DGlMFtPe5L/l6dLBiJYUCTKT5LnayEKVZla5WW0tDnuBid3n5aPbxG1+HNkIzxSPsSH2cYjyvyHm0xdR5mG85H+oQ9zCeCF5ZNpbga0zwrUbbDZFMu599h9NC2+HGLZZsehOMtoyGB8QaB6Fmyt3As22U4NqkSJDCUW+jp4gewTDjKomwRUl2ZdhfwD1imDgwfVomIMJFjbe8XKZfvAheNozynotKmRLj0oz69w0lVHl1/qbRBDrl7cgqDrxYdGwmGB8l8oQf6aadSjmF5zvvIsXqp+QnAcSINTGe2nrKYgwFm4eFjunJ5Ki9hf3TcLlaTInbN/nJMOf+pPZ+mUDXJMwe9FewlHzIXQ3z0Cxdzkcp1hjBdx8w2nMcdZn6h/zVvYJ9BmGO8VMdbUippM3po7S7rnsVvNJuQE1BKGXyO4/CeUd/HQnqLOfcH+gHFVBvQ2RkV1IqCqTs4WBkpEa6Zexf/kFcidLKtPmiUMv7h0+053RRE80ktMkg7Hv22B1wXbvXujQeO61wbGeOPl0Z4+tghnk/PcKhtVlsGjGAiDV2i2afxn2d1Jp6ON6iphhsPoUJLpdtdnEgF6X0M50Lwk4vzA5Q8kkt73uCavytvn5g5J5cRNQCinflaclK0BuTupYplQvXJvhMqQiVOtbuR2P1Ob+XEnL4mOAqWsegB6gXEPmUQQgiA560KbZw6XYewIhl4NVKB0ZrGE9Mes2lSTTD+mv09ZDsA4G/CG4sQU4E6KgJH1qQcGhNO9Jo87S3F8ukiCDq2WUPEQ+bJ89tfRArpnSuVFvtWZAvmt/JKKB8uC7l8fACJ4QXp2BITd6WnmJifR6kY1NvqaM2uZhOBz2H4SrCJBSIKH4RhKeHMMCNfrKIFv7iahg2y5WQcY7Za6YBzHLY2A8cYceY28Zkjq6ahdRz3CM19nq6I0rn8+J0YB1t7uB3ZNrM/CmFvfGNihDxIHnFErNUvFAsuiu/gbRyc0lpd2FKYvxJyHD7HzWHRkOkwF0cp6gROYFg6YKajCfswwX0xOysvXI+F51wy3yE4l3Yp02WHefFJCekY9L5JPjtDM1sXDQEaoH0MNDjoABE/UMX3N7Lcmvetml0FhF8VxnTTh8wZRewHsFzejvcHYU4iPYzYa+m+/7CrFVJxZo4QEAD6wmkafYVQvA1wv+abUxWEH083M6fR8Od1TWGtDl64il9GQSylH0PXhkt17hZ0R1fwiCPfrPufFBXHYA6+J1zS75+xNkOh5vSnoW+ANsaTnPfT90b0wg2Qthw6aaaixX3UMfRoZeT4W7iTxTefy3RBq8PWFZbdwReH1v5bv/YEYmUw8FF3VK/58EOEmi6WT716QsqzYxfvUYdYPmS2XAzPDKY3sADk1CLGj7ddMC+SJ0lCo4RVTPkP0LMvqVxRfqVsPxn3H9fVZhRLpsiArwVwdkUI6XRd79kC0WL1yQAXBqee59vb1MaGhdWxCgnMxIZ+wgdL1TwnpDhtqOp87S/tzwiUjHdJmR0+jfexuWlNL2CrmeulnRKowmd0iB7Lc1ETony1ZoBNZkU85+GVSvWRsCw2YGP3wbdWh/1J+okkV+ZPF+DCS16i4sr94Ukv+la9a9T1YcI+Xdhht17YEI47U6SBFDJViigi+lSnBThb8agt+ncFKEVzZlaIOD4AZY88x+2ngzuZHsXrKXG0tv2tjHH8sjOUARraC1EkP66Y+EqJHY174DsKWsngpM6wNUvGGKZJJPcjVBA1/dS5i4uW1qd+QyqtxkPG+S300MridkAoQk7VjCKEwwojbITK1y9tTJ4HCDFfR+9Vcu4y9iBXa4F0UKVyxAteQijDF2UBI29EA2jn40z4oZ8wazEUfhxcNhklQ2Gzz3m0wkWcEs3Y3LEEMcwNmggDtg+Q9A1Z1PEdIFXqfq3FqOTpL6gYHr7K4MlVuDk7EtbjKmP9o/H0F8uDunrCAZLsY9fU3cKk3dGvZAPZ0dIURxRkomU3hA4Pj5Meop5gn6alQwxKdXDrPIaOtbaq2QzR0BXUAMsJv6NpYa8KhVRt6nulP9a5d3HuzmlQyPa0MIdYaLzcWoEMTBBt4u2lS6rYUPrDq/8unWO3xUPkG/p2/P1wuFH9e3KE00YS+7EUyFlDCFThqa66MpNbT2o3QN3WtimgW+pl+kEBSNgQkNHfOPDjlyPZl55PA6RI45dtbnqGcKe8INA/NBGSoyHdULn6ZlEUeAPNJFQJ8sIxDaVbh94LxNyZZAR+G98p8e20Gq9HwB3AaNCuNR5+ZynaVTQ1gsP1OEwvhy1V21RSqumRThUOACmYhp0gPGI5rNYf7/IFzZe5TZecMrPuUnYTFtDTVHd0lYOrAxGq6+aT9UKLbVcCKzl2om28hmIFa93saJ3FnsEhjTyLnvzRRsnADmKXZPgAvEWjlKM8pim0lsjwrrCltYYJ7vvRqPLe5qmzhVD2MwfTDSpi6GOK1s5fYX/6PftnH1y9mB7odgOB7yc45hlsFsJfEDBS9j1264v+tS6PqW6ezNp1e724TOQJowPCHhhXN3shwgFzuy5DyAXYlg6ihi/4+W361P3yEXXaiB25DFTbo5M4gHdp5jfG/yx/LJu/jDNm47Ok3BQZ+Zf1XcFYYaAe5L4oG5Z0FpBmQRgYfjRot1sHtGQ0xJYE4auUBP83Ls54Z9Xv3ZpxZ0I+e/VyFFIQWNXghp8lAHvMKEp570ZVX2av/DlW83tKvlRp4ugPsJZbMmWhm4L7flG7fT2xaMA5WnHV6XZWBIqjdJfLrL2sdLeqLoUGNIG5pmbGyjm8OY0PVE7ajYzICLst7dN15Szgt6x5smhTyc4PxMPp8vuuqZoDTX91gfjj/yGnNY1kTtp7CaKsow0/eRJ8waViOMBWWRPn8HbyGez+eBZShqoG9w+BcldLv/Dgiw2v+z3HP0COS1KLQR6C/c82HUhIhyVhT+Dqms42EwWIfm69J/kNpF3ljGHAVDFGfHg3DBUFpM5Qqq/8mOpBIxf8JgSd8oclV5hFxHI3YDQ2GutYwbbD2xlTMdW9YXk9cfAd6+6RRNs4WW9AMlJ7NiL35WM6iydQHElJTuoW2yNqUpkUwaN+H2L34q5UmSe8bnbMhlm/MAOHl1XPN7UW4VK5Sc0Cz1A8ZEPuaZNahBogNCDGZZWSK+8Lx3boDlUxrrIdEVORwJAA7tPrTgaqGaDHf8hxjqx+99aF/ffq9DCtjAr+sP+lKXsz+moenr8JcnRwWtubfSZEe2nxMZY1TeKb3EN746MyTBFcS3eVql2M8cb+TduOvo8+WbDshD/vYhUJGBsSO/EzuauZpAS5H9pSOr+xNVhtcBSGjtIPHRV82YkzLW4BYeY0aFUhd9YLTSGs0JS2jpq1lRCiKaOb9ln9mF1+ynKDNREHfFbX57WeUDSGQimhhPAP9y8V3tPMkXbaJXsKhUGY+DChoTzs/uu/xjjwS6XYlX3hPu8Y7mUtcutj+2lJX8cmg+D2+ORA9Aqn1I+RX6OvzO6u71wxx8t3J+yTI3bXGNV7lah7By5g9bo5QaF5YtJeS+i9qnIVtEn9uCfpy/T/RcqIqJbfAnHuv7N+uUx+gGdGwZ4i/ApAMx0HyjDtLYCXfovZyYth+rdHRdMYN7SoDmgbU7MycFplQXu4XMyrvhW+gD1bhnFJUsvbjgG8DGmvuLokZSTScO5I+caeuApJCaPE4nf/TiQgA1Sbf7ewCGeKlbLpCVwuDkQn19b2Wh2imVB5KhNvBZScj0gakwA5s57ZDc00Y3piRzyxkNCu17z2pRjBxGvLjm+Abii2YUTxUgUcu5blz9SMdGlfFyrkgpMvZkz+sitJZctNwKXC6UtKhbOOe/Lk696G/nnShQdpSgOgcZWUxpDxxexyyWDRiEYkCbdZPT0HWpnCtgmurfgL7fIY1B9lXmBmCAcgMTe3secG9TA5eRWO0DslV4r0FjzvUUdKZl2ZyBMyggF2V0wIiOlJ2Ahbjvt/cUCX8IoS0P7ZmJZo4dAJv1I6sjcLFBQdH3Gz3nQ73xYM2tRjxCMEmVQVs21IK/NbGlW5/rOtuLAt1U72yc1tuRGEqChHpkmdoHBIcPesQwyLITXCh3ufkHdzRXg2YmCdPfWKE93cYj4wGgjnzQARgbIGpP+7KFwAMgFzh9yvZRoxi5A/fmXHzz306oDQI/NOWl0ZmaMb6/EH0oVLLyXBsR+JS7VpOQe9fdh12VnFFEDxNVdDU9cIZ/qePP8nKJv6EQsRb5f2PchrJcxfIjT0wO6Yd+1nIi6stekOocGqWH7mCRNpKURrbhYJNaPwJ17ZrW6s/uuaVcx2XRPoYIKNPkN5J4BBY2rX+KErFWbY3r0LBtIUesDMqNCtZyjOV4ij6EMu5QleFgG4Sj6qKBYsteNkFOuiCEvOWxU+Q2YWzbzAk6BwvSeTOk4dyx1u7BO/+XTZUUxe7iOd2fg9PcgJlev1L5f5Gi8N76aXpn5ybg//8pVJfW3nH5eaoc/oRG6EsSLQB0IBW4Brvo4yuzRx1vF8Wj66FWYpUSsi3V14jpp+2+xrw1a5zHo+czKv0zejDlBbrN7YVamg7VQGYE0t3Oa9b/CyjACYLvVtgV7FR4edI5inqpMtJAS1ZrteoRRzbWmYyttj88WJAI1IkIF+/3xgPbK9KvVwRo2OQKtJCubZiMtSWfwSPpkxoNLXeqEJ5JEvBIn5zEgIIeGEXj6qsUTXoujn22XabeESAV01zGv7dmWLOqaXEuyF2hNS72Ai5W/Dx6e4qZjKmW7uVG57tIpsfmlfi3oCSnW3kRNpvKRvcM+UsnyaFPbuCtvMtcoLrhVI4QGNa+u6t/tlKSu/DI/x6wzUtBzmtuMeQ1JXA/FFQTY6PYOvds49TcgFU7GQuAfaumuhCSTCqeAi+2eL/vVGlEOEKrGQXVfn6txPoXmy2g3SYBbURhm2BMLoHSwVMr0Omg10zy+3wlDgkFNj1yuwZtY5ScHv5ChI/HLsmUo2iurgDFOqzS7Js6R2QPjmak1alp8l93VVTGd9NWtpMvWvafUKvFkgiicuq9J86EiH4DuI6BdiTm0Tv1l0TeZmuYa9YKuRGm80ydzHHlQAumzuplSD4BqRp0d//PSaYNiDQkxz/4nSUYVwBQswkbfh6jV1Hkp08i6CJ5sfbfIAxL/YmsZU06xm+K5aMFgRrpCiJtADSSv8kfOK+MZ/naXETbDrgA59QB2H0pZLC5wUXomP2xJiaMT31yoOucQwcQ5IQmkoOk5l1mLhYarDmmiG6k5FHFi3M0hethWPzlG27+Tl8mcDwlR998xVgc/ak7+ALTDiV9XRnFdPHrv1Fcduvge3eVFX0CEGcgu6ehZJY1+h86avIy/c1Y6+R6Pm9GhPMI0kWKGDDm8rOmGZ4dI6wqWj3LkqY4jLNnTCUNYdnOLxEzykJFpqdAnufT59uskqV2mJJ/9tii0j6pBzEQEqdi25hcLpDOY5wUrMKrvg65dMwBGQqVKxb3ArFodVr05kdgwgkGAJhOtzZfH9lVU13io0Iaqci3UucvKc/zE4psF9V4/er0w9FjB2fCjDWG5UeLfn1H7JZuOWHzDRdCY7TzSNSsjyMAHmySm96/DMFlwuHr8lrQzIAuhn0MHRdNoJnvPOnH2nGP+T60Hb5EG7QYX0y3f90xer/aOFbERziYn4Vy57+lCuH9fRDlN9mKXM7BwZW9YvO7XZ1/Mol4jnHQx1fBSNfk7KNWQixmJdryJjGrEsUkQJ8syOiTsDyC2YibIa4BS0FpzPi1+Rqv3wyUh5bO5QCKlxbFwjYya86OiqIYo5QNZx24ysiz6A475YNxa0Et3vFndwM6W+ILiMAPFhowvuNXQcNM9hEbuIMLajlt66K89aJEM8y5eDo7lnxGCoJKvJ8E+R2N5zj1SQImuuQKvX2sHnhWdKqX0Zoq1Tb9a7BVZQPjmszgWr1oSvdx5gMsxRwJQdbqXUYEKHIXPmZSVtYjN/H8FyHy90njrJgllvw6znbSoHLvBZl51j2Dfq+vbwisPiIPJwXJFiGscc5nefoPUePLwp/cc7iRK6AQwcKY5QqgMMzoyOkdiyHkDqIxlpS9mtsb14OpkSU1L79ukJ6RJJde0zKvKsMVOhqfU4GM/IXNtOBZoFzLA0biT9WimGBPkG7FmilNVazQvY+mD5qztcJ0Efl2hbNMakVt5rOIa9TjCRYPktMGLKPcMRHDIq29ge9Jg5+F27ZE1qxJjsBq9plGjh+g2ucKwhcyE7LG/uipCDAz1j+l9cfhYVPCUUcn5XtnULGpuu2vErZWkT6WoSlYcAPM3G64HgWdcePyaFkxLA8jmXmwmEzltaczTijdQMDXQP3TfqClkI16RRxAkiYqwD8X4jauvDXZdgIAbLHha/aljQlf3Lzg2vz5piJr+fPnqBfb4slhbN3CRxxNjrgJSldUFZkMTYWoNd5RMDbvnJk5GxAXFnBUMPUv9x1gcDgRC0GY5ccFAAJiBsF9XGajAPxwbSggi6rA/mF6jmQfZaUMU12+j0mUXU8VC1dQBIRfzMbmSgBRVdx90i8GzHCKcWf1PkML7SVAKmHq4gftgJc41+KJaGtMOkQ8MqnHwDE4jnbyTgy0bSBOlRXRGYKG70kuj09h5/mbLR7EunWrC/UnR2W1kldqHjB15MxSQki9HG+xYx842EQdS4Fhwa884f/ZGsiEBGlzTNbjHB7mrO/mgQTi6jAN7+gVY66bm2Uu35mfIG0T+N8aCX6Pdx5M5yeiftXrum24TZ1ovt9apdOYKw+yeSCFu3nfwaHv7b+sTBRiE5wJ21LAv0GXjzSpPRDRuW1j/yYuLpvxLWLYOeTiDSMJgzcHgajwxPcxcClyL3KYP2IunjaZJJuPHTFPdAuEXPhbCf59eMFUaA+3JyBHBBkxk9RQzeSwhmU6kgeOIe57t2Y3qZAaoTrwwFMK12W5UZxGf2Z3nr5UcOGSWW/XIxbYZm/EUWTFNIwYs7HmJAYjuSn3UJzXlADC+hkPh9nYM7d/CKQ6gG0CX0EsdKU6dWxbUCgDCdU2ZeUmh2juaU/0zAOAimMwP/spMsK9Wkry/QEinFSk7kDPIMHnTKyS5my+TwSC+x9LSkqsNu1oqI6i6T6XwwwGnsazCluX0BvW0Visr42GuBGf2g8ameHKUkdCJ0CtW35Iza3vOC0I7kwpEwm50FHZvJJnopoptS009YZ8aiHlL3h2f4Y15rJhmYfqQrlVLp3tX+rXWZHJkbTEpgYkvw3PtuIn2jrKaF6Nc3nYb0MErjQYVf7nufZoxc7n/PJ8GtWsha+fdWQfn7deN/aTgELgb1mEp5OKcl/enJsP3G/HaW343BmhVUwdRpbTDrvw/JM7OJ+9fJMAXuNkBsaPAbGEVUBKTIXYrBKnUty8oBXqku2me75efkw+z2IgERnDrKqtDfljjrfRYVkp/wkekW5hLerRXt+IzRmvtAlmoLXX8N2BtvdCJpJDhkStK10c59UCr8bCzbZsR6sncQ95dJHMN+CuB1HxDiqNQ8gQ7GJxJ5AATuMrW00rKNCpz8c+uwYv3vdLqCiAVnPgOL10eZsKsglL52pU8N8hZGHJRCkhc91wA7tuCm0SspVzYBOTlHR+jcEl5Nzpf6B7Wd7rpl/TB66m8lWKKXeWuUieKsufW4jI7hronRyGKkj+7dB3EbNPYtX0vmQ85sk3ZJyeeMc80F4TyYDdRucBuPyhmNF51qf21XDmN+CVSAkRVTtbbs1oDQODO0sd/NxSjZ0qXMzZz8eUYODEQc/ljw5E3Jd8b5OEpAQ6u+zHukt50YDFLmR6RPknh/2fqhAHgYhiR6lOS74wS8LkAlUu4GMeRawdyKL0SZOLRe/uQ8VXD70hKRmwG4TsDQFIrnFvzPwu/RxmT/atq2oR1s6IRS3zLt2bBQtNurng2P3IAk6URtCwQpsFOXqrhMYaHoDHCB5j0IVOtL+BCbAB+0UuZ0f45muCRRzAia2aZcjOLRjx7fV796EFNfJvEYhQDclgwXjTyo7d0NaZebdR+K5HQWhglWJBqVLHQROgk5Zzf2fS6rBpD3HFwvu3sqfwWobF4xsXtsTRuAQAk3ku7aVfoT5u6Sq53GbS01fhcL4/sOJyiVXBwF5rdXpppIS+51Nk1Fo+UUdFYkpUyPdpMPGcuYtcZigpu7bVmJ6lP+Zcz02MdDWIaKK6+INZAXvRDx1aSRrCO+h0fmALvAVQIUaAv/XQsmUPWzrRntPtoZ4TzNeWYqHJK9RqCBQzxeh/hyDeEaGcWTOa907XozT4UWrw8FewfahKrodoXIsSJJdJYq/4v+srtoUE+tbobHhw2mTkvGgKuzCyJKCa81Cu4k/NBsoJwSrtvGyIc36LWhyhiBbqVKQp8mDwMV7PNlC4V5JDp9oCuddcW4a827vjjE8DU7fpvxF3NzvxPZPvWSDQCy7U+HAqWtdzFi+sSuaEQ+H1Tk7dhXemBEvKOZ2srz0axjDj7y+m8m3ng3MnRroQzeQkHjd7dlfitwoO30u0Mwh53uAF9TJ88G8BeVGAlQe4pJTBxVJMtalxHCpjF5uZjREhE9GIoqbchAJFWgVs/G9vvwjMw+g3SvH2DHWl5eWEdqf/VBTPsktl7eLg4OkyTpk8DN6Az8iP9lqu4Hxmq+WTuDPVXfXaiim1q1ifWWqwEcr5PeFHJPVi9Tpk8QRTRpgxUCPefdpakwycPn9PMxE8ljCvsTPcfILFPjfe8hwRYUTaWyyvG8uLwACpQbFgHNQgwwCkcT14NrNdnTFDe7G90JX8tdj8p7o9P+tH731Ou0WJGzuJUEn0/96bqwBtVA/XuO74I3aGJxAVpgT3yitoiCFGDqtdv+W+KTQcEJL1z1k7H+D3dUToJBaGoAOQhmomaAoNN8Is4hcL52voP5RtV4f0ay878S8rtgzLLYEm2/VMzBnR5u0WfBNVXf/S6YBqHvAeMCHCZBhr1ydhGbp7xCAB7mbAb+kaFb59mzqNASm1LQTKCYyxlP32YlSi5S/o2hl8M9gn/7dad1f2fCaIRkibrU+0WNr4o6mSxLw+vU4NQUaJOPu3nCwf9XiorphvdWZDCapOPlmHgnFh9HnNwsClaF2TwwLQ5a+//i1eDAPiS8YqcG8sg20+/OzMvB/hnzQm1t84cEcH4nQ86syyFjRTKcde+dqaWMV9tqcORPy3sYqyR+GdVguhIB94yDDfkNc2GNYu1T8jvY/DQS8JgQl1MA0o8XpWQl00nCbTxPl8M1yzPicEYMVpWZCxLWJqPcOa2rhoKzTk36CU5uAVz3lBKO840r0Z/wXZentPcGQ2FsNLe1lMi1z6M0LUSVKAgd8Sj1paVtPGXYevg3cW0IzRWm/6uOyWkmGJZl/d8nfkMMU0y4SHnNqj7nL+na9UZ3hGQ/nAQ6JGa3orZIepE/F5LIArgWg+VA5fhlce+8l4qjExpTvQLK9E8orqpM16ANW8LBrftAcfkj2xc1l5K7h2Csm8RuUzi+sSAahqJvpAbvd65/AbdxpRTkvcEtObXNJul4LE0jyXUWFj3brYeEe4nrHIWQKngDVQlnTl9MMgKqT+gKg5bcZQFluHRX/vOCYlGPw4o6aqbavoLBns7ZjaMujcfECMSJwTcPd8ubSdMvx6tXoc1NcYlL8M1j6zC8j7jWnSg0LSLcNLYiOLJh5WyNm3MLKVMqmu7lRRSwPxkEDpqWuz1flLrYqMLLy34siFQ32ty4FPEdy4FZQIafZbSCOR8gCqG6sdBTG+Yci1GevMvHUvnXw8QSWj15X6DUUTo47sxrSAf2jVEaifxtbAy8MMn4s5mW+wS3hX0gcrKILOUx8pbw05caYT/uv9i0OG4R8Wrqkwrkc87+/CzFLreWjIq5MHFKtL9komLGPKdHFSy48jYfeLymFPRD4m1JaUi0ZlO9b5AJlda8Ass2adiocUXKq9l/T6BXeH9EnNgBY6lpr+oJGyu+qaFL5kmjauiJ5OVkbpdJdHeO/xGncVxvKeiemA3FLI23mJvIIz6KLLMYlZnEQCG/2CQ+Z40mF1X4G5SbuggOfSUlyt+ZF0cd0F6XkfK8LUGDyNijZgk3vTEJZHyhvEL9KdN7UCPnv881alF4VkZKoQ/3Ng3+xb68kxmrjHTTkgbH3XT6NTwsLyxIaVLCP/91ldthBRCNmKITF4wS0mrRyjddlqcsajp9oLmHA/aio4CqiTVR6NnyqRl7LJPi+ajwMfGPlEvqN2d6xWo/keZgOXaaFoWMREfbHsU9+P4RFNuaDVoU5mE7lZQYEcaqfQvf5MBjumu+ITJwCAHIvGHFCNE/TVl7+43fK/WzP48HJtqcO2+19h6e7rDjow1a+PaTkEj/p/1CAIylsLLVLHy14jsCcYkM8dX2DUBi/1SBjjPrZD9ySF4xKd4bz+OUw6iQe/ECycs8P10ZwzcDawy5wVyK4o5XY3ZNMDVFJxYud4ezyDzKQEazIi/RloxSvBkdeUFJoaaqPIiVuspMHDqzYykckKGkCOaVIzbFLdyNgbe9ZsPU6kHJ7o7lbD5gtUTXcTNOKxbxllB3FYReVhA8CfucATgfD31r2/N4EL/Eo8rQW/FeU+oS78PCVtuhypjMdnaTDC2oML2yeJG7HJijdJX5fJb2//Igjc7JoqDPH8PJHz+s6PUVJIIYKwpQojIWN1VP5vfakZM+9eVfnpWOB4qqumskk26RsZIkWwckdXEYvllRcG0Bg1O0gn/xiMKsUkCihwzCv8iVnqxMGD7jd3Rr7AHK1DTbQqOC6pE293F0lkIFIyX/GzBlEWlQJmE72u5v0il7wd/FU8YCzYSKd/TmVe3hmG4llToiCIfgCHyHjTqMVbUxra0y3ntiBd/PMxP2kkt6Eh8OHBewPWWjUeWXFI+kM3gz7cZfb6WGz+6Epl46p1KVzZn4lzLhrBNA6C6+oEWwP9nmk9mEUoapp5KrZTAvJXV8CxC6D82UAQ/rXkvFCAWz5FbBCY7GE4ibEW3kQEmlICO69zgIzDCjrDklQkkH1Xb0i5vl7Vci5G/3SGlys7p+SSNWmNcBwdBWIMtpUSchBIC0kFt7DKhSQXiP+XlcXfzK0ElLfs7z6+eS0u4IJ8hEvU4nCV1nj5UhEBwsEBMx/K2H/lnjsljFEiEfpQY4M+kINdbMyM4h/2DIiVmBR+4eEQL33QrqheJbu5RCnv2wQLe8EpTZoqMfYF/oL4gborxXgvCJLWX+uEamgxW6xOduki23FV+8GerPtLY7cgb2ZXzOx2Tt5b6B6M/UZG6xi9iWjRASMr4XDwJip730ovdaNZTjs9fTjnsUm+SptCC/dnwQjQ7fEWkU495FWbtQRUzASJzLMzpeFnTNCe9mSWtjeXu3zVh+aBTAJFAAkVPEjBZIJ/Q1lHc88rwoEuCfUqRdmUAVdt/qMktFdM++DUG7f0SX0Qd6hKmkzUaNNDpjJ8K3jojrb7rjMqUaRcAjzCacVtI0SwmU+5v4t2/uasQA6yhe90MyHV9yO4uz+mWUmUYGibxAmAOJ6CF9t2+uiuxnUpy92g+lEcMWCs4ZMpXr2BKhq3sPHlnZh7qMox15Qjo2423QJ/Tpy0Agb1ooviMfM+CSE2hSpysuF1Ai4+UyZg55zvPlxHaQ0Hg6lopVTdbAT9giQcxlboLYT5qaLUwdvMPTVaUO6F6363BKhcxoJ5I1LFs1GzTeVAz3XO+6OqLee+g5NhrZoI411zqvzcZaZ4L6J58Vw5SOBPULae+ShKAN/9nhPqS+cctr3iY/dv+DwO7e3/KNHTnAeF0eNHe1FA0BcO6iEmjsMLffzO3IxC8WfzOJvsrw/g6axSJQ2gpAMr/Y7nYROT6CscCjARJ4Q0VmYbLGvBYWNEh1vxJb8XRTlMytlhFT+iFXf31PnfbT86IEvxup0rjTvoI3JkAFJYU7SRD+7s6OXUA6ieccOfsu345+XzCZDTihLFCGO0ZgDP2CFABolqfxVLilYTIwVJdtlsz4wqwiJEwLmjhnFO/zvvIZh9szJ5ZczRbGhs1tWNbYT9tQS9auqSfj9M/QbgAnlGwKc70cE+s0F31ELdDN0cdvZcmMIzE/3A3VWhxaHKAIfX9cJ6dfIvB3qsUYj4sDORsEKCCZdDAcsPPFiNeHTmKAiIw1UQWyzUthTVlVd9wrq/9Sy6Z+yOlRyS37XTeBTffUO+8cdNhz3oKhYS0lk5Q+glz+p15/gEngKIl/9AYieANKHEEeRctw8anJ8bZ3zxo3iE8YNEXny/oZJwITHQFHqm90IMdSzVC6m1coSgPm2gZiuEZj/gxCeDm1tI5sZphp9Xva6m5+T7F1FdOZX3scqP7NNnXLY0J0d64+knZjAibqeNLncTQTmi+NRg0A1HbexCcpEk/Np1QQVaJZdN6NpdYw7iV9IBG/yqE4eIiJucQ4EGdFdYvnPgRKcTZ82kLnKxMXcS4VYgQbkEONvT8BEZKKKGn5a2UQ8WwXK/C3yBArBdxz3etuFoYDdx8dTGPd9X90OaxUITvpDRH9oPTYJVMmGEHzM63ldabrXR18PORRdpsSY7sUAUbn7V57eMU/A7q7KM0Uz7thMm4qdDKTvhSAaEovhB8Esb4xB76RN5yVUqL+nDIstShtY5L+jaPlZL/Qos+ker3H5bHny9GSVZtWeEgRdV8SFWTZk+fmqbtJ+Wq7myT1mu2cOZcjwUfuFGRmDE7qb6gbzc61mu3fLkiGJFRaOciLMXwUpxrQWVaotFbpQ/KPg1tVfaFBGKMo3RwdTeI1n8xJI3vX8fI1fwW2XOtp7MKsD0BYSJXrxlLpjyfI73hL4sRF6KJvDEwiD4qht4rknrBKoZgzeSD5j3rpUThRStF/dL2hhKJXqs6whe1skY7F4xrbO4FQOGwuGn3C9QghFFHQG9SkedtOmPm6RJb6CMUvDCqjTagVZtWmVoAooOKF1nvYGvShNb0I4tlL0Py6H3/dQKW+a3OSUCbVVt+NG2bFx5q8tCQZwfP9bpUkDUJs+m3s+ih5w4Q3FOKE2Gp4VJ/W05CMgEJexocwRaW2jaFffUhE/a0gVaEXpzR6hnaM+77z+xyipU5g+7CQZG1Ej51znu5Wb8m3ziUPlsD36t0jKQ8RvdnJ6RamP61F9mXzdf30TIlEs63qQM6JrMrSz9rVRGSkj2sAtDq8G9xSaZoxA9lkqCPfL2cbE9nBdjzokittOqqgzD4VmAqTIAYWVK1tLldXerkW3H17MMMpL994gTCVAi/6wA13gBMGXpE4cvcnvKfcXGFLKkeSFgCuQxxglVn+IrstArGjp0KvySaCHRtqBXL0JTCkrUgY7asoMEIT1ph//ywAo6XBKnFQmpeWzcpVxvLSM40xB1922MKH1KV60RI94fWJUPzGkMkcDHgzCLPVBL0fRCItfm0gwompT/j/aHyEGLRjdB+fhvh5icOZ9wWeNNH659eDDILCm68W+bU34xmp9ulpfEn0CowleCeRZJXz3XchEb8yqw3O0Gy0lmUaZb4l17eWJQnerkAxnFGLqN/mrgdPhjpHsuEmrIC6QFtebUVNEJPShxKz0ttYqrMpo6UN3sviHratiUIFd3cjyXTXvec90C0cUPmb5jbQpXzhnkCfHsxDifX6pEFpcDtWR4HGFLx0cCHa6+o11fTADgXco5U3f2jqhEmGW+EbM16Ca2d78xiX/OZ7gZlwe1QnJeOCs8XIKw71MhALD69CEutZ3ToUZds/WsfvOl0hKsTOoRLp62ACUDwUxSapJQjnXdLwICETck3wMz9yhUShfpF/vljW5FNlE/T0oOAuGa+w490FJ3WsvUiG9+QoYpiJE/ZWCVPdTW9NlJR+eVi9a/Qewu2BRkeCExSOom62k5OA8fAg2oT+pWnVEx2TJSDws1jvwRMWLdDzvcpIRWKyIMr4tdz7Q8x3zlLAw953BJZPJyrTJF6wv6BR/loq6GpdbrmUD5RNrtSKu+BDLigB/ERvjdSWGels2u0nQKcrUy9RhdigKJo+wUFi4sxbl5/+JWe6iVxuV1H7kLxyUp5Mlq8JuxbzbonZx14oI955tGRf6Hx0ORKiI6FGcaFM6ve3A1lMh4AgbKzHIlqxD6yNATKh8EFSDStBa8vL5UXjGUmeeNyatCTn3sPG2/iEUBRFGaw7A+dkg/iShT+bxN8cYiXdZ7erd2X8wegYfsOAQ1o1ItqNg1JejCsIXK+AIhPNgUM3U+IAbdKg4HztaTqxR9Nt+Qro6lmzqOtSZ6dNorg4BkPOVR5hn5eBcWwtCEv97AFhA63gvvXvM5BmQjH/qW9OJE3FauiJ125GJAoywZ3Q1ed9ZYJW5xuYuRZUbYnNas1nWHEHKSS4ZJExAM/8JZpgqr9OXDQd9Y2LQrRb71VZ44wDb+6mxF//WTnbJpx63EHDh9POPPLbFqrnNj5sh6ySmCymCINbamESNKSwbW7H71whDXrO5hbPezh1iC9+wcp+kHH22FMfmF4mFoybTuVD2lYfJwf2EomgpND3ATyVuYddEdwoRk36BPFmH+rdeuTuBgI5C5RITo5epww0foPceUbLXnagAQmWQZC+3ARlFypMBtr7oZaszHaBZ+Hq+e75hILl5DX8u3nRiIAZSpiIDo/KJUMe27mC1+UNsGiPwmJFViAX9bKy0tRNnxJ+NSL2+Vq55pzbAZ21uLUEu3WjLIu92QPZuwCwt6MrOrEmILwV30f6mSwYuoH4a+O42zQdqk4FhN7UDY5P7APlm708mDM7LvCLI9e7BARWyCR4lue4QVxYiEgdmhZwx5ORpKIAge61lJ6uBWTQ8JE4SDduYhxPtMG0Vq0PrRFIzFVQG/er5qVu9ozsTVCOO1zipEkuPATjcN74nJHtNL2p99lX+FkleIfjnRZW+kUxTwuzNPLkerTJWBs1mijVtnuSmnsL99fyqKrbSte2erSGUn93Sxo44Pj74CD4saxoNmTymXH1ZtYidrfr3TOTTzDvYCmFW+ca871Wg5IuCUPuEXNo3LjV13D4J59UTHDPPM3tMYhOMmXs92vus/By9Lvc9ZKl0FbE0bn35lSZ5QRLfUDhnH6vy7K0tZBUesQ2r3ZSltP5vNQt/d+kvDcTS1kaRxc2jbksoedicp/QXZF+obA95brAy+nVn4yXe8C4JzfGktwxj29aH2hS6wLoP/5YA8hEGQStuH3w/MvVWEy7SqdFacx/fphFMBUynKy6F6PGMmSGYBMny8k2OfI0NTAO4xtj1dKVeArgeH/81PhaRzsd4pX4CCO4NyzhrQzPJ+wO6/l27ImeFlVekeZ3myqOAbbr7Pi+lTC9IZsxuQmStbi1UnbE6wvF2g/2DrFNbuFmZeQZm1y54n+qM10JCbNUlvGugeyHrdCvw0aONSf9LztNcP7gYnUqGcN1Tt/L3ypR37XRTHTVihO1Q7uUTZxIEgka6/nPlSin/aUQo7pe9OHFjnWv/c6dHlv/oRYcqVWVW1p5u6OU4CqEMLhqSn3V53gXviRjGsfBfrm7nxJeqNc6Ju2RPFHP/Gj97snyuVQMjGaM33Yz2ROF6OAuEIF77QU/oED7e4eJYnMBSbO9gfeUTGH2jVLmRM9hPngNAAOpVFEexi0ZOGB0pSHW95Xl6I9DN8B1yy50yS1tsFoGxqFGO29qBpuZTXj2cuXoVNCbP0geGX2VbQm7UsD4g0Is2aVDQuhDjtmQ/Sol+Lv5JGfSNCSwT0tjrPjuwJK01/+yuwHCz7kCbXR6Nn+yscd7+xcpFAFcS/zvn+ckJPPzPFvlwpkrjK4HzqSQ47iWcy+xr5S7EsOqXHB2iJF6SjMRe+D1//KiH8WBka6iahbJQQ4MsutPIOfOnfgBJvWZHzizoMZLtM7btTRH6pZvCY7EzfbNE+blFBBct6/stZQCrB+8NR6LskjUAyFbjKSJzOSdGr4zRzCsl0HNcSVAoXfFwWFHCQPeQOkptmGp76ZUzz1YArnFs4A98MpXGX+l/7wOS/5QFIm71MahA/A8641XfO6iBK5ICCBml0pZB6l23R1mX7AiUIxSoWdI4XxjERQDqjGPhR0KMa7sMO1eAxuEEKJnKdcStWXDG5Ytq/wi8XAmFdfBp3wl5dC1JEFoIeubNI2TIaKjdyjqL1ZEN+hHPR0EJiEkzqDk9skJxQBqFo52wChadIhwHwCY2RI3y2YxonSjIgP9c3dy0brEREnbguDxsnNTdVo2XZMxSA49PWcuCnW9GmYlT9tLM/zFYf/yw6DOahhh2v+SF6w089H1/qLg+0MjNyafsJRAaX9H5ks5xkCaCSiNyxeAPMdRWzE33tIPXdfNqMA4az7YObs4C1EmzdrSofbDJeF5qI6GwZZtAdgX1uk9nkZCLpmerQpR0WxVLZvnCKBfOx4Fc4QZL1N8yILdUqXdENnbe8fuM/xdwMbuaBWo8dKOFZhV6R08HvMfAOyKxpcnuuqQKcRxHoThMWod2xHl4SakolgTjgRUfUIKuExCdMuev0XgN69P5Bu4bjvd1MyG43oDbUl4xR9gtZlROHTQy+NoDxOE/V2pKbagPc0ZT7KXNSuhzU+LN26umGo9bhTBy9u0MjjUZVbVBpJ4Z6g/8U0uKpkj2/SakoUmVcZhPtQcMJMqhuSWlwWsbmLZNxSoiNjk6PbnOnjZb24TZY5yadFr/iJX3xSSI8cXMXnsrWBd7YqYVrl3ifdCH6zmEH2phF6WNFgwZpoDVTP0AodVHuLYCIhN6m9SDX2kJ19LhWziRC8wXdjiOc1stwI4aYfHJ2fPNUQpslbGMIS3pL5CtDTKhsDWFVVplcuqkNgu+qHNFgqrHfq0THAwBjDsVgJ9fwNeWkYLlV0BwmH8XzGe2Pzlc6sWv/Z6bJxyIw82pYVrA65UAEhhKuZKJTYRwCL3GYwOkyzu4lbUcmAFk7q8beICrXmCbALevVOzFT6LmT0Lp2Kqw+IEbensovSXs/aMZ3QyAKQhVL5kV2EDLBmzPF64cb4MG2VWB1KKYcCIiuRUhB5co8GfYyBPh0p3mi8ib6kPYCuR60QNAutD44sLGIDAMTx5EW4cNrjYo4fgIBZvL7JQeuG2f0cDG80WFYcpUVxSFv5p4P0aM8FVWABcZK4Lfi4w5fEd8P3KXa+M2yUIj5l6GHqLyD65cRharPWjSJEs2v41TcLjRxaG+/xEvsnnCodSqkNLvZ8m2lQEq2q4T8H/W4Td603jjuV7zjEep6WntYs0nACp+QapBDd+DRsBNg8nbZu/HuKuZKKs/v5dG6Coc5rg2RzHJ2EaM8B/EKp8LP+Na88Dj/qcv07r3/TPAdjD/jYSxymsLZDQqOW3kiAGpp3Z1+ifBxDJsMCG8pidIFxypXtsKZzQOdARTXEEhacmg0lUN1dFJbSCsAO9of1i4EDQZtPWB6Af9E3m+nMdeJhs6xZk5RUFku6eopPhL2C941tUIUuhSYKonNGfqR3Gw9Ei2f1N553D9I5F8XjhP2U6YxusHyOdhMouDT2Ts8y9sGP6nIflpX8SGW0XSzrtRv77LoH2uXjCxZQm3CXuI2DqI15oPawG5njzDPMhkxqBPW/JKZApU8EW+BuT2x9EAXzFx32Adt46TqquXVmNFKfV+0eCQLgPzgxgpVYZeR0JgyDcqSYKuj3ffuvEv4r+06rV2eMSuWLEySVzKdO/dWqYHT1XOt5ioAk8EyrPAtO3OJDMg7DYoNlWerRjerdUBAd76UBNNCo+16LOoguYOhd53SqgJeUmxmsZmfOq0xFTzSppp0RUwkGmiybO+PHNmLxqTIh39IEkHQU+vu+iLW6/WY6h05dFZNKGaSJ7zNiYNRiCbflxBPrPinY2HJtDRYfKk8lHHA6XWhkJJmRSj2Lfztcf4r4DhCEComgQ0nwb8/rlGqx3iYfL1m5wBPk/ha7JoBj2ah7+XYd7mNvBcBN1i+W2SQBWJz0a+7cjLH16nZ/48E39cyjb9c6ykbIxZckAaOIGlct7gH8GDjKIC8FJylrCMU/IXlefcyDuOpH/00EEuhBwIWHbkQSS8KRbE2xqBhBt9RyHsiJ0k23idfzxQtmvoseEDF3NWCHrpUJDiv6xX3cIj3rsMrToeQKFoCLoR8m+JWSjACiQfEkR/YK862QtZ0jM+Me6LtFyPmYwG91kBhb7a26qtbKvq+ZX6xiG2pPVTOyvcl38/aO2okupNFiGa4j6PA1DWW5XqmDAxvl1LKWUZyX0NRVaGHSxJZxbpmBCfazGITK3FL732oIYNMqtIwSmY/9HoV/vggOQ7OhWgg0nAs/vNgkgGUTOU4CyU4qKFUdPX33BRvpu2n7oH3WN5HDFZ5zKTVFiCY52d+JrwRo+91whV55eZKfF2uSAjQ7SrAYzDmfR/hdFBzXaN2vvM5YV8RWZ1jHFQwGN8hTk5UJ5bCdcKfdZbU5+/OT6NjZLtGWnve2Im88ZZuwRjSlV8u8xMqZ7x8IN7+NHa99KJxuHQlfggPDKnbCqUCxcFw+18oCU7Q/ADCSkrfPpYfObTl/ZFayrrhm6WYyv+aTnYlXC06RBNTAJLH4pCz7NoxxMnP5CJox4nrbr/vnqt9/mVD4DCTFFg2P27W91KkDfvp/VWXhCUs+626qguspXDFuhbouy+Iq21OI+vgiHg9P8FcAUZOIb981c8A1xZ0BkF4A30MxT6jCQJSdHKdOjGEG1QWHs2M5G37k2Jimh83H/v25TMgT4qi6udHnc+E5MSO+0/C1A0h2snFlhpuZjgJBVEn7idfX5dokgd4sONHfe5v1Z3eFVRXdxEhKO8Jf6LyMJZMcPQ5G3jFRUngf+QCxFAYLxeV8gI3F0voxlOrTAdW/VPDtASflPjSCRJcWpfLCRlixzCPPOvpbUdh52U5/rtP6KNb7t1I8eNRI6uqqgBZ0w1SsLlhZTR8X+KRNX5pfEx9/9B8C2qwZeSLbLpGcKjw1rz3Nc4wjMm5vAE9wQS1fkeMm0l3zFEndrnw8fd+ClF6rFJmPSpCfqgQKhqLpvi2m9VwGmZudTX1ewGYQAbjUIGqAiRibrhYvfJP4v2Sypy9nAYhCJb/ISmgUvUuCVWIEeQCK4V/hL+Vt7zoQnADd4uofv/mAQ1FdFxQMOdnTiqKa5gfdt7gFPk30Uqo2KC7PSBIssrMJ432nTW4Otw9Dzi/HUAwY03ywDiFAgp624+/NEf3L+x26v5jLoVaknC+JRrbUDUGNwGHGaylgM9K+v4O1zVfaIeppXaJUMgYdfSprytLH9DRilYYUVi6L4LV17ujsu0wojrKgMFs70O5uLZYsUIPbWttC/62zleB3GKR2S2R0FhWBYCLsJahdZ2rX3cx9/imm4QBJgvXujBeTgSWzNuUp7Ub0FseSliQul74uVgD9BFrySq343xJuz7G7L+pUxrVw2iyKh1IY/1siW49YeJ3h8l8C3r2T7pHmyRmjBdUT2uIwb2c6MUSaasZ99QJHkoExDIEMadC6+9UvsGrb0JecIRfuEwlEU7R64bspKNP8GGNn9gTDGCz3tUYYIUJyQVGU3aOySRvUqmVk9cKQFWBOuVTiebGybRH0thtUZ8d2EYl+WLBGe9Cyol+EjPVlamZzBzDmS94j8p1cB4LJX/jZxIaOlqeYuBEllI0leQY8TNwW1Dwl4IQQM+bdHgVuYwWAv5EjVLX+rIT+tgFfYUCCQSnjDStbHqQkhq2yXRi8B09z7Jvuh9w+uR4z9zmWLMEYSDVLuTvju3AFCuUyRZC7Nhn/m8t6S14NUM1M5DcJJ/B/pp8zH85UJz2uXmp2jvvkEwNJkKKvBEwDH8X+2KHAVMkdw6Pwhy/tmhYJUkKgfYTrw694G++cdhjupVZDILZsWtITm8Zq1urQsla1tMJ6pbF+CafiW/2yM79fPgB79UGQ3R9VuyR4w5RQcb6tpaHZtPYZ//ZepxLlzHjF0WPKhefv1jMhed8t8Wrr7qoUFdmW+EUgEXVDfBMTQxhL/56mY8hhZcnvn1mxm4TYhC0EkUN8JGa00kYVNOcPLuhM8ZAYAZyOe1jeZDuWbRdqU9T+DKkJo7amtEpamltUDX0ImwoVcNSexJEL17ONmCWdZyAM+Os0pZ6vOGdbb6Z0WjJsVX9heimBFOsfy2fBK+FtnjBiJJgIRhaMID9SHZ/4k9kVB2WJL5R9jQMJfIn4pARcWHDq81U7PaUBoXJVfc7Z9rnSV/fU/83Y7AN0OzH8qJ4eH2xThmYjHv9g8RKcSQ9HtUid8ilTgX4N4fOBYhYbyGXEfW0YdxKsNlNE/DxDBR5fW2HC5OCHxem6c+lnTGVkC5FX+su2wRxZ/SI4cKl7Kp7hFfjFyBMuvAD6YqQ1EIce50inyS9tF26IQ6Pz7G0ihBgO7bvflBcXjztra5WOb5ycfm2VkINWRQ42dgHDwhXARbMkkxZkV0tXiACkXXFv6P3jDaP7hJ8sL9zN3HmGlLIKZyOyaaRWuRVNE3iEitYJ5x5N3mF03XcOHHgSw24eUKuRkeQhC0gq+dDf4aO4OZ1mVxTR44o5cQVcG/GeKqnNwukEa/5qaeDuC0qX9DqXS03l/x9O3xZHtOCleh88co4Nx+SpHEJ/CfsHWKJ9WvQ7pFRp7Lx+v9lMzv9s7SpvFrK3UYfTrTPeJFzRAkbOFlrcoi1XBYz0rJfz5Fc8MaKpu/rMUfnIc4ZZnrL6EwirHya6a7RrJvmqdk4ino4x7I4gBxhM3DlJ6nJElcBjcNfmHYECd4lSFZq0VizFMJutmfFbCTbQjW8UEB3x/WY4RYX/sphMLzeDqzUXEV82JI6kObmdDXDsrsJSDYNubc1UrOvNwWg9byUgn1TCoL1Wq0ZKkeUb0ene1Vp/IVfaXn8zOtOJL0usRGFe1lpPxAakx2PBBWcO7WWyxGj5huNMCyi08J8VNHkU6lWrga6M65C8F9RmI2oMc+7opGPqptKfeV1/g0rr5q9h49QYQYh1DqXCyln0RP2gvvp1SDthUzDWSGzdO4Ff9GDIZAluJwT7bcimJ9ze6opaRwdTLEeUecAYvWZ8FrK5MzceU3rxLx7FNx1fLUryOd2cAkT1qToPMaXQWyrjQTBhlcQbJkwtZLHOx/7/EpbTSzOoQ4p1x1kgHKyhxL1asNS9LrmpT551dOzEg2cYHSBFSZPyHyAEUvprCs2D4IG3dHlzN10Py/xWifWT1HBF4huTod+mowRSWlQnMjKpXApW4dIMEjTl8fp3W2WqmUvB7fVuG4RKXujKjDIaeZsQaFUhNdiF+ON1pSWypJd9XH331svIfdiAB8L+cDih/0nxDkIVVyBO5fCbRhjUV6oJKkLqbQa1+hkj8mUen0zcXFzaFVli3pXoYCo4Gbxtyl9hT4kBAMLGobZkqwoMYIouAug0aMQjrB2h+u6CDEzzPyBA3zpFlmJrmw413EwX7N3+V+w6j9eD0s+eZ4ek8ZUvxlWDWhtJRpqrmK+IGuO4VuCYvlRoXmAQ/QcxVHg3qeMuhxwNju5M6/qOiZeDA4yntBqSbeRdZhlYiJ5CCBDwpO3yRIbJFc7inNqPx31zxqUfF3yCXiErQjsD5T60LjouspZSk0a+wOCLrxHGo2tfckTDdWIjlIuISZHMMzWuvA7H+aZIo6rnsICGGZVH948LGPrJ3BUqvs9UdZwtyNZ/VcLGh29bvwgcL7TrdwnzDBlKiudWWkZywPxd8gW8NhbyRjUXbJMOAMF3eJQc54zPXQQsUp4oeIhrB8oY+UpT+1KaPimnEjAyQjtrpgYsU5uGIN4QaBBXTjLdGHLRBrM1K4sf+btLe1tbQncqAo0typO0LCwHJYPG/+/vAdI5SuPmlCUDe599/zB0DRFv/qpyijgB21cIhuwPcoAqzyQeuZMhpAKWjOUBT+TA1EMzJmG0svTc97Zv/gTSR9on9dk2UarsSN3pDPJXlK+b4rCjjV3STuxK5zInFGbdwbEIejih3PqS501+KxzOD7nhAjDl50kfd+UzdSGO3og/VcJoZfeelx7Qt0x2v3vkDz2osNcNkeeLmMNeKCKkbNBco2v53pVH1vQYjznFUmm3cwY4vll7tth9w0iVioKUQhAtGthwRLoCwM+JBzBa1Wz3xdBuF1PkDcCED316y73RffspRlyPJ9XilzO43IXiGMTtv0NVoQeg299mUuMnpEXSYdyS+xfqyoqbOJ6Sw2bmdo3XJLq9kRTbtQOz6lywzzMTjAG2MgFb+e+tNFX15YswWYVzig5oz5NNabtNdfAHVcX66cA20x5K4w2oMcnQqXC1x1XSM8zstW+ev4Y4WCeAltIkfW0AZcPjBe36WXn4xEGb6NrgO7LbYyn4WTzF4qSETolUUsOUzRydxYXM4JcNinX9a0sqyG7cH2got6BW8iPH7gKuXhN3R8HK4OgGUSt1lTRYtdcWyUHDX1/h8gJXh8mFsJjDUoyhvfO53f8GeBD8R551FhoFZ/EmZfvPLtmCm0HFomZBj3EFlfIrRZ7mB3uyVHK/5OiXalqgDgxAPpfS4PE8VypG1NLMyjuFwfgnEtlkYUmk05VPuts49FzoKoDyAovmqOWUpr1boFxzSYH6hChhYoRBN6M0BJPjTH7y4V4//a1Qt0Wq9wonurqHOBtOZyecWfMtIFNzy/mzNxzagw/J7OaMbpg6Rqu2bi9q+wCDbf73iwGBW2+pYFOaAwG70lRISUTlDVncBEGbvCwpTgoNifpokOyQ/ClHp+NXG98iE0XXptuQlPrEd2TGKy3msTDQZoKYGipEXwRElumfaLpJK4xvs4KBMZI00BmkSOn1sCVJnzCyffJCut5CYblSHMpSS3IQIJC3TvnrdzCH3UDC5D7TimytVlbK5Pvn9/Bj6VEhqCyOnwiwX7seG2K2tvRgj7EXl1sisDWPAkbQrIWRXIHyS7f1grra+jOGwOYcTTDqYwWvMDIvt7LwztIJHCxg3kBHh2HwYbcj/nLXepOLFrSXG4XMUPyqiDQC+HfifIkTBTu0YZO5PSdrSf+eIaJvzsFMKPF1yLbA2D1OOVKyBPiJZzHali/VzoOjekejmT3F7nn2QVWxG8gsG2CJ9zdH1C504hMtVMcPKTnwnAs1tYQZ6zXGG01sdNBvabx0iWOWi/vVQO1a7ExjiSuEiQPxH+XrausZ+BfTaF8KW0ZHPLohAl7MQ78BYLuG+egrriRoqvitVHltPKrjpFAxsc4mw+QivJLdVQNc35qNMvykHc81AoGeXaX1F4myqTodH5C4FpvW/S543dGrgCPHu3JwZsoexMLX+z87dbi5e7SyP1V/7+iB3YidkJQWjkN2VAS4jqmuRKK4eQKnXSkucOn/ggCc9/sJqn5dohRgWAS4NdnN18u7EB21fcZmKQRi/gif5j7kP6MsewXVajcdiU90Ie9a/kQlEnhRa8YzV1kuZqJhDPIPuqhSl19bcGU7cBRO0gVQrhUwE3GQAqKMUdN2gvp1tDka+fuKaxbjX/Z/Gq1IM8uAgd911K6anv6LFM/AjJ0ODUObjvljB/g+wM05miFswNkKYN1k7IO/YbFkO1ZA0UhmHeM6+IkL+FOxScGMXAN/IHumf1W5fC9cqmytBlAkFx3+WoSdzPAEL+/V0TLsTj8sK9+wXVHrYVLMn2+G56RoKriCggANWLord0G49tLLNJ1m5eCWTJZmr+hR0eZrVX9s/PM13GCYJohha0vuMsTXjqiJ0dxZnKj7h1NBYeNHYK40HkM8giphtgif9YORVcRyzE0g4aA1XNHcUvfKIaIdKkXZNrcw3dVOdsBJACeuCTQwuJ5+RRxmJ7J353qkwkKLIqI1iZbWQ3sHGHaAjnQ/flYGAzqh/iEirMIM1gRshd4Suz7kTlolL8Arvmwmiuk1YaH1JxL8gi88MX8FlX9vkUkISekNpdJ5o513MJIel6sXickdQtn2oyt9RVGtmOnTMOrITI67GnkFTfdpDTPZpM7UTF8hoYiT/UH9/R3muI1xGdkJggKszrGzbBBtaiDN7O643FOHm+Z9vLc3nPyflXKmGU1tDKcLpc71+DCwoKdfP+SAIQnGGnzjYEyIHP66PPJ/NZg6gVs5wFZZ/myWqcBCWB97gujdLRbR6t7eWfYGsV8//s0wKkxbyrYrEvcRVDYyHPk3rh0cIsb6JsgR6BmjPjxOkL96PyViJfZENw1q8OAzdRDmkMTg8UX8qcG0xhfDFCHEGN0V6GvQnRZhQVKoKdxVcdYnLHL/+xblfbLRJFgMOCj9ejx6+8KslORJjz9K/gUBx+5w9wsFPI7LY5ApbPQnK2yccktKU1WyHPuDmxKsK0X6difpfleVp0Hsl5DF4TvAjvctw6MhC1pG81gZZANOqDgHPeeYThPOQ7EawnamGEvK798Qta+G88FGqJBIn7EzSkQV9JoMadtIbw9pwQHbXDqFDVv5E0NXSg3DzK58Ke7RDzlFO1Z8TmWzRPIelP49P9N3yzaPLxv7NF+A/FGFE+lvUACOgm+Csh3kS7WOS9krX8tSYx/9/62/LN2CDa62C7Gg+6NPxBnxf3FDsZr8loetGVUhXkFru50lj2fnVhLQY8SXGN2Backf+FHJpOACjbVNISlHGPPtTpMXn5umqjD843+3u8+M10hrK/jafKjhzn8xYzC9hMDP18QGltpjCFKN/OKpjvEyK/nADqw6dhq7pbNSCt/P+6AlO30gLPsfeSiVoZrEooYZ0IRjg/GNBHBkuGEWAkqKjhgPnOgQBtly1/1c0crQhpT6XrbIqphy2i7DoF3LItQuJjrWXz94H5+cZwfcplSpRrUZbz2r6BnMDrC02aqCQedcxdWbKhnn6pqvtj2zfy8krg+IkFzP4UAZNOc05k5ZDcY/O70cqLBc8LWgjQ0PB5EpdyRgBoUuqxje9D506ts4ewAbkAJA0SA9OTfpBaHEG1eGnoAh6VgOQsAfLWoTpV1CGDv+QpqBR+uIRg5aEaoY1gnAQFoTENBVEdTYEG4DesIoUyAETjrueT87MqrYAYD0RYoFJtYkiZ8nOrHJRMTvz/qjdvtWuOU7RsoAPwtND5YuxZfUAE48a3l6jsi93y8up66EETGtQVlwnv7O/VR/urnZG1xWlC286BeKkv6BGTZu0vpw0k2yDezWSuXLcdkLjDsMJdcXD51cOUlwsbNCmugnT78pvYWc11iIukFrjrV0iwW60a/ssjCFC07WasCyv6BUiwQZUc/oNZDCh5IsTfK9PQBHFB9QVg2pymic7E3BQsAxXIZVy6bJcCKmcOUW/BRZSCMzPzRz6enmFPIrlXZafPWtbp3yy5b+iq+Y3H0EEStMu1Y2MUVZfjQmnjc5bWZBN/IZZm4YkpZMuphjyhbGEt6mBZq7JC66L5UYJ/oKElPz+VSQ/O2RWJ36/UWIQ+atGIl+A1uk0RfRCfLu3I6qPzUIXv2xumsvbhzzqJTF8TYDKHkzdQRnkcV4IFQfm+3RLk8PkMUbyfY9FRCOFGuo+l5HDbEcrfD+q0s0WGXGrf/ArT30vOsZSPTpCuZgdDU1NIRoxEhKO5QPSptylmkrMsVCZ6mU/drToesS+H35lLqFtsyLaLSrm0+g5PQJC6qs99MuwIbyXQkUZET+k+JIC2T3iOsLIg44NjvAZCaX1JxDm79BwjtlD9CLvvxUj91wkSoPi2jW5FXUb4j4j0Or6sRpvFqgO6c9b9gcdW2iW2aYpUvjNm38El69xOC1lk7cHxQRtboI8qvmoY1jEW4bqXNkEOugL4z/cwLxU7oizF7VXNeB58Yd2Smoa7xcsVnuHKbK/lgBBReCQQzvMtlTBEnnVYIw3MqjQDcSOev/SbPMFoKOrWkcgC3cryqThEhGiBVr2abtvFB51qRVnaolPnVVWM5HtxWgR3mLAsnXKwHfLaLxu/RfmF4uFC2tCfbF8NVHkYRa98SgLL8879bs452uc73oiSK6UMaLzup7iKTPOlVqxpHITvZVs+ejsRiGtMUaLDM5jTXRR1Oy8/BLl9FtrVMw+jSeA89hSn+h8Hr9TO/6TktHO5DcBdUni0RoUSmoZ2PgvByk9xJbk3qRvwSFcGwNPvLqgo4wMkm0VHctm6it3BFTy3gJQH9ALCRPQ1FRky5v7uccs271X8BtvDFw77GmcbO20C9bV6EUkXXL/I1BPBEUDpDnlUUhe05lPQS/gnKEip+2Fbes/+LOg4Uvl8sWFP7m5Rmig7poNeV10+4uZUqY0wQWYHC9BUwcAFwob922g8JBHZ0kIhNh1CpXpnlv9QC7JrEyxEcL8lVhmJ4paqONo78V1ot9byI8dwbOlN/veQB+lezpScjcHg/vCEGus9l2hS/QFw518WND4ZeaAZ8UvvWjLlXqBOWnvy8NiFXgqW0rF9+loq20dIL6urBoICUPZzbqKcGRNGqQdTB9rWpaadF5cicy1g6+SrKr9zVlkUuXDvLkXihooHiixx2sWpZxz0RVOmwUK3iTmvFFlifHAOBHpoSI7MUbSVLAd0niKwZrNqZnxHoP2qdnMQjaeJYVW5b25uRRseJGIaDuspvWIIG49wbovHaUqGOYPxLlb2+/hRJmmkpvnxvuyq99N9iSvYBvfzSNvbDQXDApm8jOTcBF5MZgZ/046R+Za9rgI3+pV+okU+jIng3lkoRHuwwv8TlUjjlr7EwZZ+8gY5HAJ4bPf6ne4enoAkE5R5WG/t6I/Z7ksTwDzmPkca2PfSYc2u7ncRLi1V/7zXWTfTdFxzDabab+WrU3Jm/BmmlQ6/tv2ca8mv/wgg8HoRVe9Y5gsS7JwUevzp2C46BrSft2cNxczDCWxTyEpELV7JFQlzi/QbchyptxFi6xvDAsPWCJCsiQ7MjjglpVjuz4bpiz52xj5sHEK9f/j7YBCoQ70wD3JUnW//SDjVALI8oCouOc9h/3NapwitFR5/EDi8N+RQePKNimYf7eXZ4pTBaRnSSB07lq04/moPuzLK4oEZYriSeJZ4m81jXNXq8bFWWEWcgrCl6/RfwQYVM64XK4EzfJVpF05tAd6wtePR0VyQybHfUITrH7jEl+vNUpsYiIjW9VhN/FNvoskQGyjQToa1XwKE8G0WAwbJu88gQ6fUUWSq3/tcnx6cp6c398cBbOoB9PBEMPUjybOVFxH8XOVAJx0IwOH71XpRYmT7HALZVx2E+79VXfsLo6hzZ5HExAuZPxa8rq8Rpr46zac6GT7JGP1K7BzCYDGh19D+PShSOFJ6WDDEb1LPjptwur+JCjfj3gm/EZdV9XlieMaduiKsW3uNLfvboTDmMsH+nT+Y4sSGf5ym1y7ZEzTKMsVGJRktELl9W1TrosqU6rS/T7SiejqN5s3zhWqS7qMkfHoHnMXEB0dLJmx+SY3/9dqHp2R3Gw7OwNR9G1Bqkn9dN770GqCZuUFQcB9Qq5oju5j2HQyugvGeKpcc3hk9l9tcdA5H7NzjSEey9yfjkYvrvzL4eK2XNLzsdJpBmRCmq0YgiTmDTwSHe57AbbiDiR3lZg+extxs8HuKiTcSDe3qupATrvc8kZwOggesJLJOYamp3PM5zyaPwvL5QEAhfFWgHdei4Zk58nCL7sHfz5dDWKc1glGU1om7mRsnutVvTJ8bZj1Kw+QNIJAlGyFR/+et2PPayUE7jNmgVvhj3a9ZFdM/3/gZpl1nKVkk3oypiln8DXk1DpmchsK0XoyC8MhEOPqhhIck/fMTzg/8ArP9Cb1luCs+EPxQa7aAzQX34YnnR0FOxAQqLwDqUM2HdmN1bknFiByBciMB222eaSv4x2+wKRI4rE77U/OkvuxLFzCpC0wGu4KT+FKzf4A2YACDZwKIp1eT2PhbZF8rXJsIcbSQQZoPzZdnJTcHc/eSWbRnB/yrOwDYjRYwYGXfGUHcorukaA6OAGtJllw2M7J2jlAULOMix/DyO5Ts9RaTpf1PT6+dmQyj6oquhcHDZWFBXvciH8FSRp2lEcM6EcVanwcPCc16CnKj2L4NLQs6zVLm0jJ1QGk8oLg2waEwCSNHl97a0N738myzwjHdaIi3p1ZiEkeauoBbb1GnV+B1kuiGQ+9zBTmviU7d9KRxle+lgZbXYk0hdMBA7M6e7nhU6WF4PtK09P5Qp6+qjkkd57Bwk5ElZwaeLV2oAK+GnUIfSDVcAo5FRgU7GWWx63O/ehem8tsilbqozjbeI5ydBaWhPCXNCPbjSEXdtPeth4vyPIc0XpyxtbsgvTFKb1sXuCr8wlOfeZAlASImVliC/JAaY/qpiNUtoQxYxUonqvzyPBWu63FinhsvYO+0QnvEi7NI6JaxzvgYylwMAxye1yASB6H8AYt0RgvBk+l6P4i7Q32xvKFtdADTWOEXdx9yCTSdOym7OgTbGkYjIOx2/6NJSNBQ80PKb51hHV71V/cnHw1yMVl5uDtSowgqqZW0yuze0lgLefwsjQsf74Y0NP5hqWR4banIuO4irpOS11b4jV8H83qBvg13E4cBpnax8EquxZXqMhiK+qKZ9hY5uRxpWX77MV4uj6xYKiDVW96wFipJNIfZ9q01Y5ontrm84E2Mt0121PVLSU7y3eAMHGoWgQYF2Uy9I+hDCW+MaL4my5AjisC/YWWJJW4DzOx2IlHTkEC23uDiD2P/LgV77FC5RuGXsPfcwhvJda+Kyy+/kmIjRmXpipe8u33lEP6s0qpHNjdpgi5j94Ltz8ktT5VjcmMGzLez1Tdq3dwypWmbtifTbxb6rTaBnaDPdp8D/DFPtrbf9mdIoKvuWzmvOgd2iXPY16pwBd6VReumcjfM8+TZ8bwjX+8wsVe4LyIufIsG4N14fm8pKkCbB9U+LChm6VK94qlAbbkUZf2hP2odusFk7HqXnE9e5cgZ4czKuOAno+qgpiF4oDQKqSWkogsQUI+IBc07MDP0rzd8G4IuedIhgtx5g4HHMImoVZ8Z8afInEacUGq68IgUc7T/YSTzJvGXrLTKyeh/azKnPreRt7r2tuPOHQED8TVKkJljZUdJ+YV4j2bFjZe2/cQUe9HKLYdyBHp6kujwDxmahtO0cIdPlFoz7wUnCFCDJm3X1gV7pxT6jPWNHa0zuevC98V3UBUTmXAXByMIZXROpKmuLVmMZ2HzwoAkbW6Y4432hi2gszV0WqJBuZC42BkdNnwxxzl+dlT90yRwxZZLGAebzKmvE/GtAxIyrxS3wRFLUeodgu9flQuJxI/uEX1m/XFVmN408oqM2585PqEawFWnbLCMRcklidgmIljFciAw0QsZu6wpR5VvMzpgvDOIaedXPVS6302neK8sJ2x4cmDMMFAjDS4Uqo8dYEdi94Gwd7steJeAbjC5USwVWT9qtnuxAU0hSngcLudUZHqHPDDjOw67eqdotJd17680MhYhwZ0m0Ea30g2U7mnIsG3igcUUhK+zleT/JHKGvUfJlHFSNx9hywoqxyCfDCYhj8BV6fjiYVfe3nvETKT0atvjLPGtwRVV+liBzhz1jba0GryTugjtR7kHb9AALhCUQ1aAhJ6/wvVxC5xa2J/pZ1nJ2/i9LxzttKAYj+h91o913l5mlmr3VNC6stKlKAIXnRFchXN0ks0pDH8d4pKkost0UFzkZSHl/jcyqGmGpKZ4GjX6rc9Xgm9nqTm5g7f71NECWDeBq02xinFUge9K9JLSIoxycu+XlWU5c62oAVDMFbW9sAsm0LPKLpRO2FXaKCqbsFvdhfw8ygb23hh6yqZHIIQAZerNZ2h6gV+LZEoOS50sqO2FRFo7ma5sAJKlvKCZHq2yvJGBdtEmP8vuQEnxVVksVCafaYOJ9B4j2oYLcezqUH3bqU01wQKsPLoNfxlNJWKAnaJLTCPr38kvwaJqGQnKqeQMf5I6uCr8KSB+T262w17cTuLFJVIjBC9I4JGxYH+NpN3hRj9AxuO9ePb7889VxroyiRnY1mFcsM8Cy+ZoU6ANyliRLvc/DkeiNR2mHBh62/61F/GzNaIvnySVdItfBN0KgZzS62CPGBBQdT5uu9TOvEgVYVAkwQW6lsnIk+/vlfQJnEMFxfkx1QHLvHE7Q7+VO7y50z5Co0lkDxS1c+P5fkYQp2wZ/53x5zdiAhSSxdbQAyefUnYzKMRDytoSkqFZqJFQpJO+BxU2CvDoI4d2CtDP+SX5C3O79th/SbMd8F5OSXNo63zt4I2ak1Cd8bPwOuAC9hw0l98WmJydrM5SG1BsJ8c7PjFzzpeSNFlR+BdSk/Rcjlz0m4kep6HRd9hfm9LVqpERgnfv8ZazU7drMCgl1mWvdhW3K0hv1Ridn7idnQN70KOYNGO5PXv6tAoWduwUXxb3YQrvTMM/S/SMnmovX/66u9WI8mbjQRFFRucQtUdVQKsvxUipFqIEBkT4dQETe36gWzEsqBcVF7DYfsNkHJiCqiIk1qp78CG0msUNBKcknPa1uDgfKByUtE+379BQoz5wm76WZufWoiqLbANNrIAvUDWl11ctsokb9+D0CNZ9Tt5KtpajPNMbcux0G/tgvpu9/c8Qy4X6fox55Z8kX5fTOwoXsMzgxH3H/IjkInNf2GMAxYaTTp0sAHgO9EOF5zAJSp2DnxEC3RaYY+zYETXkyPtaCYclmGi4/DtA3pMGkNwj3pRju9CNALkob5jdfQu63Jdsyd8yVHbgrFTxYMkHysSgqSLHlxvXhXFowZuA3MtXS3LCuA54ZbEoJX7XsUlWB2m7slsnAiPBW+o+6kuR6FR9qbA/9vbuuQiZu62zXGJM/Mwz5wU75EY5rocyccFq0hB6cZBSZfYVLpooutdh/ms/Rq7VuwXitBtHa+5hBy3Q2zkBWuHwDbSNyWRJLLE5YGf5V7n5Glzt3oOcQlbZKimdRyDwIKLBfwo3XG3sc3u1EDzjSJiBgEnQfgyW3exDimv6gZB2PHVjHyFiX3NdH3GS9+6Eu3sli1cUHG3co3aeu8ZO4u2uOckUEQvraHElHcCb31bGTUmbXIGkg5shNukHvZXKiZefUHdeG8T0QPwsOLqQHDE3SG5ZcvbOaMsEYQJ3WH11tiL0bnyqW31cndCzLOtPPeOJ3KxuPA6UGQmmRZQcjPkMx2s2PGZT8FWFcgPuTX7p3A9xFZQG2Y02P9pujjdlqkNDvFFJf/UewW4oM7coGMPrA/dtsRuClyXiJo7OVF2bNboXXPnPMy1913ZLQE5UrBaXyjS/Sh2FYbdc8P+zADSdyqtNNiTOjK+mB22VN6sjAhw88eRJBSr6JdJ4h4q+bIDH7eeUvvWHceuY3c/EyKY2fItW3PSkwt774791fmqr63As+XAAOzLr1a1WWhvsW6ySHfE0OlSmvTybEnGCODdgJFsnXUTqp5CJtbXO8hm8gtdq9scD2zwMu6qYLiXklsbFiu2qJNWHOWmGuK4rduPrBzwdgvKKa1yWDobP1ZYAkiUhsegDrhE53iLAsww6JZdOyr3nlQkTHUWInvQKhHT0r/UdvX/bqSMGf5stSo4OmE17T8fp+ZzgYA2hBGVplpHmWuzT7F0D67op4TDbuffgMtVh+mh7tPLL4qKtoiw8KCP+lBBFRQfaXV8KgZRrPsLVAE2mW6h7Rzmxg6XHd0zwfmFKPDgyFZx6zLxFFB++dxX4bPorqGUDBLScKYHniv//roMHDG6vy3HG32TH6fo+GPACBRPBu8Fpz/bODnP9jdKXisC/wmWw3BGlp5ayID6eR3SIsPd97dQUCp7GnfDtHQ7mjGEyhdPDj3zaRjLLiBtses21CMq4xATuAQvL9Tdmj4GBN7yPebcziQzJGwh2SdiZEZfaAMdnlrn0E1ndl5QuOh9HXurTMa7UqoRzl8e8VtlQeNWKvjrm4mOfiV/cTYami1gZIZRbp/fWo92GE2/KZOrRdUrGk0Wlr+wJx99KawMnsoR+h8iUvoxWuLomx1PB/KKLmv4Fb+8rUnfnB16JsOlxbe+9BYG1pyy4jg61h4Awra/yT3dSR1J3masI+EKnLH2vJnuG5s2Bh0FszgdJxe2ZhvNopSI12rj/OB+OdyK0+aHMivLa6tdM1J1Bd3nU9r5S6w3N8WMn5WdmQ8ApWZhw1TJQqPTZqFExZdJ3GpI39D+FD1B7+ziybdNOEVgi29uwaSESCXD4ch/kmsm+B5vVMU8Jl7r1Q9lyJrc8ua0khAffHkvR2uicPLkqS+Fpy5uDIOmLRRDOBdm/cd3PuoY9GaqcEr1xzjM/g4GGl7XbwNLStUY1j5NL+WDPYtJzjHeSGZXTXfsQ+XAyGkKlsat12xERgn9SV2kXVbFgRXdtEPKAy15n4Cl1rxUkCNyDwbE2rmXuc5aa8Fk9hOMwt0GUfCIPL8zngH5HdVNK/tZcPy3KC4kWKDD9lPMX+rcw2iavFuqBsQi6BX2JOVkOo3vKMUiWzbLO9/YSMf4X16v5e9Mpk1gITjTCzdzTbGeeB6FxbK46HZbk8KXIMXCE92wrSQLieGXdyALZco5PTUyF4w/EitrjK1LcGg87t/SaftTc1JUF0G1k5QJQl6MfQ5Y1NVbITNWgsri0+f8ADUquCi0SvQek6+uyPQNwuMJ6iSXClxQLvQcNDxAp0rhQ7hxyGzG8nOj5bSceUnv8Iki8lnVl2bhT7X9yTGqLWS7G97O8knFTu+jMpm3Jwz/15v/NjxYqU0+KOJnidtbNkjRJIgO1clgY9DWs5tKNfYDsENnntH0cPITiUlpJFat0a/B2nKnFt0Y7kYQgi7dMYMrNpP6RNmDb+ZxBTuxf4fGkpWrMPOdUTTYgiqjTaj9JmdZy6Uh/CjaSpqsVuMjuJ+sfIFFv9snT9/SOH74vRK8IPmpCl4kUySOZQQyOI8mW2OjXcIiI13rajka99rUQ+wESDXMrIxeo6wtiUqZ37j2OvZKfNdQxK0KTi6EAiTOjODOR7saSbyhLSiBl0128xiqjdEslDAUR6P6Uu2eF8/9PkYF3LGmkx65lovMAeErldGYoCGL4MviwhvCbfzk963DkRGqnWxrOMHI1I2twgIXnM3sd+yXew6JV7gcVfwcKvQtFaSVkVElO0DZOQ9g7u/CfvKOxsfsZRcI7MsI2J909S6/lEO2EBEpl85CDSRmz3L1grgeLWwKH9lhIPufEd4GA9zhZqOtLHY4gPIGJQEwq/e1JlVMmR80QhXHLKxaD57+iJnd3aWy7ed4mZ3d2WYaXTOyvQFdomF+7uLcX+FkpyxiNA6jh51QEAE8JJuqPeI4+LY00gbYFchkmcaPjN0tOZZOvm62NQ90ZxiHYSWQKoTx1EWtA8NPLY5Jjaslb4kE+xJwBKRW5YJLEMMWrh6qkkxYFYXQWgp+wGucHGoH7xzfppJy70GUXGH/HKYFnD0ruixaVCiqlwgBn8MrzubduFPPXxfB/O4l5QCvj2c/qA82FWB5t6A5huRvP6oIsOwJPNwVHgj748tziwiO44M7lcaKohOLnkOIagwfqIS72X2TOC1wzIMga+nsqE+NhcXpUUgQxY0wmpcvYMt1CMCOiXetBOzRyx3b6MLkv+QBKExt/wPu5G2rNmgBbxcWwSVHz2UNovTqkmEdKFCHEfCrAMNodRhVdrWJ3prtYoK2VhjrU2dvkrVRk4LdqXEXCXUmzuaO2IeHS2h6o1vsGvLV3dUz32JNtT8IpIlXD8M3r2JsITlkh7SMC6YCBheqd+JF5y2QBqT4oAlF8SkY2keOnZpFDFIUQZFIaasldYoufAHRyMFUpmAwW7ZyzHyubsy2O4CciQmjKAvV4AHNhsm+TlC7V1rj8nviGruAe4XcgnQjHQt7mpH6cYrC2RxjoKKkK89gS03Nn83yf6zExxxUf8BOPKEftUr4WNgdEWbaVbVnjPDUFz0Gr+D6ZqqkOtZRZUt6jcJOaPUxJNnQo4aQNsBkOWBy+abvP96AH40HjhVVQ33qJTlmqLF5s8pdLOH1U0vBk38spYric55fWLm4+BZInsU/rbygPPpkJJXpSxyS+O+K/dYjurtyG9OWXgq3i3F21xHqnt2EE0NG+epa0xKFQB3jEDNL9NFNDlYG5VhZK4+mZob7TendUpUvYC6Ilb+YUwJBrA1WG6tpPTgxQCwK1jRYbi3MggsRbLOwrL0gghopBFil5ZfVfnrqX+FHlh8RF2XzoUXxiS4GwOwKpDNqmVNvbixVAZ4cJVL8KfdP1Wvx/A8LDO7qvxyyZ9hGHlymCcs3G00RwddyHCmNr9Nb3J8Ae3R6rrCPs88jbVlNonuqjAWjXPHFA7jiUqaE4xQ34wnmkDl9euspVKC6AxQ+cTGuqkovBZz82waM4Q6X2GmXfQb0kk+wPuueF7IRZMdfRk4A71poV+2RZ/e4Ux+P6YRob9tnSz/yY6xWuvrhdxaUUpQOBnm9aBHNFD+S7BS64Ntsbf3Sd7mSggCVRzjJFm59+duI2LqmTKBhhJKp4NjGVFFbx9fLZOIF5OVEnOlGl0sMpy1Fj0KmkwfakZPy8o2TbnZOXckxT+/1mUwUPb52LZDUoTAjGY40LumfWsKj58nB2M8OhMmqiGRin7u+LtVk3xcR8w+LFWvhhhjLHZvz3eIap5ZY+wi3PkM+Ejh+8pOX7RoDqgakWqMPKiHCp4xa1SvWAJRXC0ebMKZZ3d7NILwyQ4Kb0Lhd9RMLjxl8oc+Xd2Zjte/B4t1XgLw85LbcCJ53BgpnRpoGzFdRjft912Wu/3vuojvmq4aH/pYNPVu7UzZcI1XBj3w5tM6K3U5tMTepYMD5GLKCurCLgY0UFxRc7BVM4/G+rzOZdy92mb/r50I53mpEgJ7dhwutFU+6kv1oumpj2/nKjO2uOF03EqMBLs1iyjatCobPKcvUcnDegfS7D4U27El/6pCzZ68zOscfgMbxbRt1zyj8xjNolYf10JSrsMmAzgX32yPit00jPED/MlRrba+AU3q23/LgyWa7O/93HXrIm5hsr3NbEzEY1d8SE8A2OvnrvQcCDtYiPYFjrQM9UD9Gv9i9Mw06/9kir8MC73ghsX9cOh2SiyGQ/SVLM+enXtMfUKJqVYE3Qp1e1RzrgVje1ikESpIn9KR2Ija5joWQzvCqHn2o9zUYNgYhDMdvEApKIxfxhSwiGByNMdk2YpMHSRcIiVKIBcoSdWyNTgSlQhL1gjzJ47fiidDi2c/9paneXNI2X88IUbYqBR0uOdZjcaj1cTVkm1WA8Ps42CTt2Vbxj3CEzq/CotTfDxsXvQCIBTbCBFJRhoc07Kqx0FPO41XPP3M3C2SY17ZVjrhT2zfcsmxV961eqVfT+3IVw00OE25lRr2tlgLUJDRo4YjaWBXl8zV8rMsTdt3GFNWC8gm9/kkFCpsFQpcpE1Un16pFkIl5bJGRFMV26hlraReOsmN4THYFea0i+vkNe23bcPPZTlmKvqwbI6bQTKZK50x9pvCeHcMfQgeUe9Wg8bpUIBI4AwZ7T1KGWH1P08+6F56eB0PWmOac/Ptq0TDOwpTddSnQrfIpAgYzqRu7vQR6y1BlxaU6zcQgejN7nPOB5mA73u0uKT85TtkwBbZz7pe/Oupog4mnM9ABvxzssZCXHjkYPv0DuB13D0q5x4tGHUjLhrmqNx690EFSSkdNbHqpjBpw17Nup4QBIegjhrbW30oVoAU+wbRW9FbeZqM/XH3m3rxvTe+l4oC3143MK1h0EDLsWI2ezMpBGT8c43P8f+4AINMwtGhQvi4FTQ3C6LALlw2ITqnp7ZjVe8g72xFhCQ7qzBuV0uGxu45zk20ZfvjOPnZmm3ZYnfeRoh9KbA0LNQeX1vBHtYmk2/oyxb1cJ7S9rVRB+N9fDsa8I2++w7gJ37iPOKd/TkDTeJdp2lRQyrAZHQqGta5tI/azkaT9C8+9PTXXJN0Na9i4+hKWjNAQ4y5NWgfIIf1vgSRc2C3Xz/AzGF9z27WD+jTCfKOcW94SqAkWHdb3kMJuhLjPBZ3RRsN4hhuDdvKIuna1617LpwPwkZLDLheq8zdWXEmaJS2T70nB6nxXmDD1thRX9/HV7FivdpXe8QbWmPM7LMn1y3UA+xKiDz2TA5ov/mwaz60gdPazOqRdFj6JpX7bUHIe/x7sCHgoZqUaCEGKC1m2jgIq/mNermGq07yOcEXuxSVS0F+ryKP7uI2Jlz+VDtx+zFziRuuxX7ihulUP0aPyOQYBQyZZ0KDVtNqxEjcsai+8qgN2N2tfTurmyl2OMJTSSIfYD9m6d9oYbT5X4Ttzi9oLtPaIVlzXQ4bJg3pK4abYf3iis0DvcCikCkUuF93E58QbC9Wk9vqtF3/p9SgCu+JtVxjQfmkJW2nlnjMcuHjxhKiNfDBp9aK1DSXyvItfoT4VeB5QqSiR3NGwFvybEthQaWj2X8Ra4Cqi5xsJT8GJq0blKh2XuVWHmfKU//hTTulNjGZX1PMN1FaU9cWcTTkdp988TDyI6Um5cecvfU7y4aL5aLkOwqR00sA5SZ9d0Er8YncH0JBgF4cUbJpMirLNXmASJyFZ9rvGywq8Jygu3gQgSeYL/39am9fb3eclLLXa7KouO9ANDmDtErQbhh9omUP82WZM9Nvzl3CLR1RoOgc/SGuy8POgMaC5JcpI9OKFcjR97lhiY1yhHPKNCQ2iak7kdlE4KiiLlGd+U6Ak4BxJr1fCyV5ckVv9dwlJbIafzGtbDhRp4HwjohpLKdzaYUiAJ4HmU3cXpNVMLZ9+FI69mXlPRyOTDuM7E0kHCa7QCO+0s9ZqzUrfPfpQTJo8IfkTKDg1y9l8JOyjcBY1EDYaEVf++Qb2jqNmekZRP/dGQq+4TKD8aR328kyQFrudwZnMl1VkURkSiruBAjWbSHSKdc21ZRbIdZHrBobCEH/vO6hicsXjDa5UzQLr+xxSEpFGxsD+Ori4WoI0W4oCs3VzYWiIORZftaV/8kChErjjAyOnftGAx5qUwO9Bt66oTujO0S8C7BRyG3oHDHgu8T8jez8KdX1KTMn4OQLPAGSFZ+h4e09nnlxJeWKblOS0ZMtVPV6buCxUv0sqwFPO8+KYvOcxnwsujYGTUnka00LcWn0SuoDUUkFKS3RBhnrpEVoKzX7PpPPWpE305aoxipBiLiigVNIO7I+zGgVgz6mhb4v3EW3fQNEVcxbLMpm9z7jvnW6+7koNX/4uGUllNAL4OmVDjDzkf4kR8ldcWNTLSox6oNdkdnl7nMT2Ro6jhSklg/6rt6+7H5MKAo+c8xUktgcwhwtglA29zsAyysBTE4cTHXE7aDlniPiCfcFoKG8yvrD6h9ft1JC8PMnK4nyVO1dAH60plDH/6i5RVJz4G8Vf+NMLDSuJeEOTTQb5r1LvR/izNb3BeJL/VvKQGhiEnZI2od4PNYbbKIhmw0UagiT4UPFZVDQzlJ5jg1zV5CO1z1x7mP9ALg74eVP8+g6dvJJ3XUJQtGZC2F8ziGlBL/Lk6cDJ07G9TWRBL22iJ8kgre2IRvumD1qYyiALFCgzUHg7lIeXP1QWlOz4M/LTm3rX2M1Ip6c96FZauOe9GcxOcn0Patb6hoczuVrKyw8N2ICfjWAuMDSNWw3KMGFW6CPLNr4xUVN1qzvsr6KvDFVpjXxIYpCZlDx5q8T6DJp/SaWuRdCI4b96n7C5tocb9WmcfhsA2biq593TGVeAJIDYDptVPLaP/ub8oZ9SivUzmyD2DE/k/h9wRWoDVPUK6bFsFwhrco65KzTHmlm5LCf2ZJlY/R9rU6vyWeRbC5HBzCBrUh5jItDnfxC36d49Co+dvnq+vnkPFKZN9LoDhLkvq4tI0Xgwnx5f10CSOkKl1gG8xdpg5zA5TXV1DyIOuxWOLboj1FNtq5MAx6psUdwQXrvZupqdvu/62R1o1j5zzDE/p/oZIvDuxQswgO6hChKzcwNlhJvFYuejou8MfmSI/rl9vbDiHlLT05ym6ql6VE9+CQeLH9VLjselHOg3YV9tmI8kcvloHvMIBpBxaoeiHh572uXnOnH+0/eHZDHLhslWLSJ/moZRgk08p6tYDb6NoxP6JrzpYm0HCb0F4MdxYc1BtUQgJh3oNXcmdXpT2Eo7korp+IzhYUspjgUQ/I22GmfLfKsM5T1ZzWKxPd3f4vlZYX4CKalODXP9CgY8e9l5bar8/tPVFjHVaITvCoMGEIENTwUEPBpqlLh5hU8G4AQKQKZDP+YBrrsdGtAd3zXyxK5wB7RoV8ghz1erqICbO3/R8ERNPxREszpOO69ozG2+xbJgvrnQSX+u1Mzdh+yF72+gvu/XyH/gQDN9hC29zL+bq9qxfSgenyrOfcC6GDiYL89B3sAIBccel+52IuqOgK1nLYx+2qIFj45cN67UnNl0GpQwe3h6zacLTlovw3ElCQIju/hQ10CS1UyXhoS1aozklXDJoNoZlYyfYvP4kET95NnVXJzxb5APUEnMKnmnWzPKp+ad11ykVeiJSjg8iUjzE7rujcH+eWaMOs4KxhbRATJgqtvhOiuuYvBo3pafEd9etf/K39cEiZMvqEQn2Mf1RDhsTjWO/oVPA+IMVrX9nRG700717buij8xQ+/EbTo8ls/hDJbkxWwClhVuIKTOjRHoPUMEg1kAJxtv8Z9eMW8L8elhf8NGdyPln/qy0jeya1Bvi3GW65BvxciQkNtbj14IZJFJritdrNd0xnX0OFG+PMmppJe7CQmH9r1Df6KQlHxsTDSi05WpDDkUX3KPPGJ06R8ycx1iS8P6j7lFU0JaKpFhHIPeE+OHcWF/ut1cjHStYGQLMVe1bLBHq/eDPjfWjlauBfgiZvlZfm6zHVU9fLCGLO6Dr/PWp9Ep0SjR6t1iVJ9WJBEpwtSrdNfr4+Gl2KRUVwSAb73YqdfrjUrxzA2ShkSDSPCuSTml7W4IMzna4T1nr4PhPu7pqRMTGhxH7uq4rb7APeJST4pyReM8Yl645615ViGv2i7SjEWmaDFD+Re0yfM72wR6xc7YZ0kkgxa1AsmbrsEsinfSDd+YSzClQchBbnPCPseWPZIDEHdyqawvqeA5MnD5PGfcLIM8jFEQqTlOSoqm434Exvkhul3lBZ16vgkD4HfE0cLt3bRsQ/UxFX2lNPn7ayhvDSDNoXs6bFRjHE2LKjh+G6CQqos+efAaK6lodOL0lAVv3d16VhHVV0OjrRUzSj63hyQaBCC88K+lVS9gIVDt6YiyJxd6KxyhstatT5e3lRL+LVxZjVVMKjnfM34nvN4BSaBaCJokKHbPlyumwJHxR4GzI/0gg6JjphFCR28ONxyoyxXh+mgAxQ47LQfEbjcg7qkLc0D6K3kah/rZF3HmFtFB0hyjI3YiWI1kdTYCrxdgT9skC1vIJB9q68OPuX6ITq8EIjm6zpzRuIdguwTVrj3BICGmJNqm9H8lBBT69VDiNJq7pz/wniAsgK375t6/pDun3jp3/FdINKiaJPdOT1N3+yeJBRK/YhKyZrh8eKyUfdrRpJ8uiPdm6rHeCdL28IjMFicTId0W+ICx673Ab93w2vx0727Nz4bpjrfTribv9kvfNOFeftlnZUPeaXjhQnH02WHHIChdOur1HxneDX/rjSNYmpVzoeQH8f+cZ8EbnaTTM5wK+pn30i6TDZEoP4gnPbrQMEcjT/WqeunQwsSFoS0adzaI+L3H5uWCfnqpJLe9BPEyN9Y01dTQTV0XzCfwn9koeLvfXDbCLC/8tMYSa8aukDPhHUtGdaw7NOybvOBtqIFL3KB9vUDQwJxKAzg3ubNWaZ50NsyxxD7FCN/ayfbaO+IDM9rNckkc9pxJszgqBWY8ALhjnxdQxaMY1A8W4stEaJ3Q37M1gNpmomSQvagQMoVWuqFG8gNPWkNGY1o8InmepmAvVtm7BeiQR6Wvr0O1a2RoMhqfKKvzTaBKII6U9RzDkekGVaVruEAE411YDZ0eUVaFJLgA== diff --git a/src/test/utils/testUtils.ts b/test/testUtils/testUtils.ts similarity index 66% rename from src/test/utils/testUtils.ts rename to test/testUtils/testUtils.ts index b922fc9c61c..40e4bbe8775 100644 --- a/src/test/utils/testUtils.ts +++ b/test/testUtils/testUtils.ts @@ -18,6 +18,14 @@ export function mockI18next() { * @param end end number e.g. 10 * @returns an array of numbers */ -export function arrayOfRange(start: integer, end: integer) { +export function arrayOfRange(start: number, end: number) { return Array.from({ length: end - start }, (_v, k) => k + start); } + +/** + * Utility to get the API base URL from the environment variable (or the default/fallback). + * @returns the API base URL + */ +export function getApiBaseUrl() { + return import.meta.env.VITE_SERVER_URL ?? "http://localhost:8001"; +} diff --git a/src/test/ui/battle_info.test.ts b/test/ui/battle_info.test.ts similarity index 78% rename from src/test/ui/battle_info.test.ts rename to test/ui/battle_info.test.ts index 3100372f091..4c6274d5efb 100644 --- a/src/test/ui/battle_info.test.ts +++ b/test/ui/battle_info.test.ts @@ -3,10 +3,11 @@ import { Species } from "#app/enums/species"; import { ExpPhase } from "#app/phases/exp-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +// biome-ignore lint/correctness/noEmptyPattern: TODO: Examine why this is here vi.mock("../data/exp", ({}) => { return { getLevelRelExp: vi.fn(() => 1), //consistent levelRelExp @@ -30,26 +31,26 @@ describe("UI - Battle Info", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.GUILLOTINE, Moves.SPLASH ]) + .moveset([Moves.GUILLOTINE, Moves.SPLASH]) .battleType("single") .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.CATERPIE); }); - it.each([ ExpGainsSpeed.FAST, ExpGainsSpeed.FASTER, ExpGainsSpeed.SKIP ])( + it.each([ExpGainsSpeed.FAST, ExpGainsSpeed.FASTER, ExpGainsSpeed.SKIP])( "should increase exp gains animation by 2^%i", - async (expGainsSpeed) => { + async expGainsSpeed => { game.settings.expGainsSpeed(expGainsSpeed); vi.spyOn(Math, "pow"); - await game.classicMode.startBattle([ Species.CHARIZARD ]); + await game.classicMode.startBattle([Species.CHARIZARD]); game.move.select(Moves.SPLASH); await game.doKillOpponents(); await game.phaseInterceptor.to(ExpPhase, true); expect(Math.pow).not.toHaveBeenCalledWith(2, expGainsSpeed); - } + }, ); }); diff --git a/src/test/ui/starter-select.test.ts b/test/ui/starter-select.test.ts similarity index 84% rename from src/test/ui/starter-select.test.ts rename to test/ui/starter-select.test.ts index 94370ca1b74..1d523c3bbd5 100644 --- a/src/test/ui/starter-select.test.ts +++ b/test/ui/starter-select.test.ts @@ -1,24 +1,23 @@ import { Gender } from "#app/data/gender"; -import { Nature } from "#app/data/nature"; +import { Nature } from "#enums/nature"; import { allSpecies } from "#app/data/pokemon-species"; import { GameModes } from "#app/game-mode"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { SelectStarterPhase } from "#app/phases/select-starter-phase"; -import { TitlePhase } from "#app/phases/title-phase"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; -import SaveSlotSelectUiHandler from "#app/ui/save-slot-select-ui-handler"; -import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; -import StarterSelectUiHandler from "#app/ui/starter-select-ui-handler"; +import type { TitlePhase } from "#app/phases/title-phase"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import type SaveSlotSelectUiHandler from "#app/ui/save-slot-select-ui-handler"; +import type OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; +import type StarterSelectUiHandler from "#app/ui/starter-select-ui-handler"; import { Mode } from "#app/ui/ui"; import { Abilities } from "#enums/abilities"; import { Button } from "#enums/buttons"; import { Species } from "#enums/species"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import i18next from "i18next"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("UI - Starter select", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -37,9 +36,9 @@ describe("UI - Starter select", () => { game = new GameManager(phaserGame); }); - it("Bulbasaur - shiny - variant 2 male", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + it("Bulbasaur - shiny - variant 2 male", async () => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -60,7 +59,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -74,7 +73,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -91,15 +90,15 @@ describe("UI - Starter select", () => { }); await game.phaseInterceptor.whenAboutToRun(EncounterPhase); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.BULBASAUR); - expect(game.scene.getParty()[0].shiny).toBe(true); - expect(game.scene.getParty()[0].variant).toBe(2); - expect(game.scene.getParty()[0].gender).toBe(Gender.MALE); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.BULBASAUR); + expect(game.scene.getPlayerParty()[0].shiny).toBe(true); + expect(game.scene.getPlayerParty()[0].variant).toBe(2); + expect(game.scene.getPlayerParty()[0].gender).toBe(Gender.MALE); }, 20000); - it("Bulbasaur - shiny - variant 2 female hardy overgrow", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + it("Bulbasaur - shiny - variant 2 female hardy overgrow", async () => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -121,7 +120,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -135,7 +134,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -152,16 +151,16 @@ describe("UI - Starter select", () => { }); await game.phaseInterceptor.whenAboutToRun(EncounterPhase); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.BULBASAUR); - expect(game.scene.getParty()[0].shiny).toBe(true); - expect(game.scene.getParty()[0].variant).toBe(2); - expect(game.scene.getParty()[0].nature).toBe(Nature.HARDY); - expect(game.scene.getParty()[0].getAbility().id).toBe(Abilities.OVERGROW); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.BULBASAUR); + expect(game.scene.getPlayerParty()[0].shiny).toBe(true); + expect(game.scene.getPlayerParty()[0].variant).toBe(2); + expect(game.scene.getPlayerParty()[0].nature).toBe(Nature.HARDY); + expect(game.scene.getPlayerParty()[0].getAbility().id).toBe(Abilities.OVERGROW); }, 20000); - it("Bulbasaur - shiny - variant 2 female lonely chlorophyl", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + it("Bulbasaur - shiny - variant 2 female lonely chlorophyl", async () => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -185,7 +184,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -199,7 +198,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -216,17 +215,17 @@ describe("UI - Starter select", () => { }); await game.phaseInterceptor.whenAboutToRun(EncounterPhase); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.BULBASAUR); - expect(game.scene.getParty()[0].shiny).toBe(true); - expect(game.scene.getParty()[0].variant).toBe(2); - expect(game.scene.getParty()[0].gender).toBe(Gender.FEMALE); - expect(game.scene.getParty()[0].nature).toBe(Nature.LONELY); - expect(game.scene.getParty()[0].getAbility().id).toBe(Abilities.CHLOROPHYLL); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.BULBASAUR); + expect(game.scene.getPlayerParty()[0].shiny).toBe(true); + expect(game.scene.getPlayerParty()[0].variant).toBe(2); + expect(game.scene.getPlayerParty()[0].gender).toBe(Gender.FEMALE); + expect(game.scene.getPlayerParty()[0].nature).toBe(Nature.LONELY); + expect(game.scene.getPlayerParty()[0].getAbility().id).toBe(Abilities.CHLOROPHYLL); }, 20000); - it("Bulbasaur - shiny - variant 2 female", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + it("Bulbasaur - shiny - variant 2 female", async () => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -248,7 +247,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -262,7 +261,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -279,15 +278,15 @@ describe("UI - Starter select", () => { }); await game.phaseInterceptor.whenAboutToRun(EncounterPhase); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.BULBASAUR); - expect(game.scene.getParty()[0].shiny).toBe(true); - expect(game.scene.getParty()[0].variant).toBe(2); - expect(game.scene.getParty()[0].gender).toBe(Gender.FEMALE); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.BULBASAUR); + expect(game.scene.getPlayerParty()[0].shiny).toBe(true); + expect(game.scene.getPlayerParty()[0].variant).toBe(2); + expect(game.scene.getPlayerParty()[0].gender).toBe(Gender.FEMALE); }, 20000); - it("Bulbasaur - not shiny", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + it("Bulbasaur - not shiny", async () => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -309,7 +308,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -323,7 +322,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -340,14 +339,14 @@ describe("UI - Starter select", () => { }); await game.phaseInterceptor.whenAboutToRun(EncounterPhase); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.BULBASAUR); - expect(game.scene.getParty()[0].shiny).toBe(false); - expect(game.scene.getParty()[0].variant).toBe(0); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.BULBASAUR); + expect(game.scene.getPlayerParty()[0].shiny).toBe(false); + expect(game.scene.getPlayerParty()[0].variant).toBe(0); }, 20000); - it("Bulbasaur - shiny - variant 1", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + it("Bulbasaur - shiny - variant 1", async () => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -362,15 +361,16 @@ describe("UI - Starter select", () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); handler.processInput(Button.LEFT); - handler.processInput(Button.V); - handler.processInput(Button.V); + handler.processInput(Button.CYCLE_SHINY); + handler.processInput(Button.CYCLE_SHINY); + handler.processInput(Button.CYCLE_SHINY); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -384,7 +384,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -401,14 +401,14 @@ describe("UI - Starter select", () => { }); await game.phaseInterceptor.whenAboutToRun(EncounterPhase); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.BULBASAUR); - expect(game.scene.getParty()[0].shiny).toBe(true); - expect(game.scene.getParty()[0].variant).toBe(1); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.BULBASAUR); + expect(game.scene.getPlayerParty()[0].shiny).toBe(true); + expect(game.scene.getPlayerParty()[0].variant).toBe(1); }, 20000); - it("Bulbasaur - shiny - variant 0", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + it("Bulbasaur - shiny - variant 0", async () => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -423,14 +423,15 @@ describe("UI - Starter select", () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); handler.processInput(Button.LEFT); - handler.processInput(Button.V); + handler.processInput(Button.CYCLE_SHINY); + handler.processInput(Button.CYCLE_SHINY); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -444,7 +445,7 @@ describe("UI - Starter select", () => { expect(options.some(option => option.label === i18next.t("menu:cancel"))).toBe(true); optionSelectUiHandler?.processInput(Button.ACTION); - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.SUBMIT); @@ -461,14 +462,14 @@ describe("UI - Starter select", () => { }); await game.phaseInterceptor.whenAboutToRun(EncounterPhase); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.BULBASAUR); - expect(game.scene.getParty()[0].shiny).toBe(true); - expect(game.scene.getParty()[0].variant).toBe(0); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.BULBASAUR); + expect(game.scene.getPlayerParty()[0].shiny).toBe(true); + expect(game.scene.getPlayerParty()[0].variant).toBe(0); }, 20000); - it("Check if first pokemon in party is caterpie from gen 1 and 1rd row, 3rd column", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + it("Check if first pokemon in party is caterpie from gen 1 and 1rd row, 3rd column", async () => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -490,7 +491,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -505,7 +506,7 @@ describe("UI - Starter select", () => { optionSelectUiHandler?.processInput(Button.ACTION); let starterSelectUiHandler: StarterSelectUiHandler; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { starterSelectUiHandler = game.scene.ui.getHandler() as StarterSelectUiHandler; starterSelectUiHandler.processInput(Button.SUBMIT); @@ -527,12 +528,12 @@ describe("UI - Starter select", () => { saveSlotSelectUiHandler.processInput(Button.ACTION); }); await game.phaseInterceptor.whenAboutToRun(EncounterPhase); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.CATERPIE); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.CATERPIE); }, 20000); - it("Check if first pokemon in party is nidoran_m from gen 1 and 2nd row, 4th column (cursor (9+4)-1)", async() => { - await game.importData("src/test/utils/saves/everything.prsv"); - const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => { + it("Check if first pokemon in party is nidoran_m from gen 1 and 2nd row, 4th column (cursor (9+4)-1)", async () => { + await game.importData("./test/testUtils/saves/everything.prsv"); + const caughtCount = Object.keys(game.scene.gameData.dexData).filter(key => { const species = game.scene.gameData.dexData[key]; return species.caughtAttr !== 0n; }).length; @@ -555,7 +556,7 @@ describe("UI - Starter select", () => { await game.phaseInterceptor.run(SelectStarterPhase); let options: OptionSelectItem[] = []; let optionSelectUiHandler: OptionSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.OPTION_SELECT, () => { optionSelectUiHandler = game.scene.ui.getHandler() as OptionSelectUiHandler; options = optionSelectUiHandler.getOptionsWithScroll(); @@ -570,7 +571,7 @@ describe("UI - Starter select", () => { optionSelectUiHandler?.processInput(Button.ACTION); let starterSelectUiHandler: StarterSelectUiHandler | undefined; - await new Promise((resolve) => { + await new Promise(resolve => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { starterSelectUiHandler = game.scene.ui.getHandler() as StarterSelectUiHandler; starterSelectUiHandler.processInput(Button.SUBMIT); @@ -593,6 +594,6 @@ describe("UI - Starter select", () => { saveSlotSelectUiHandler.processInput(Button.ACTION); }); await game.phaseInterceptor.whenAboutToRun(EncounterPhase); - expect(game.scene.getParty()[0].species.speciesId).toBe(Species.NIDORAN_M); + expect(game.scene.getPlayerParty()[0].species.speciesId).toBe(Species.NIDORAN_M); }, 20000); }); diff --git a/src/test/ui/transfer-item.test.ts b/test/ui/transfer-item.test.ts similarity index 67% rename from src/test/ui/transfer-item.test.ts rename to test/ui/transfer-item.test.ts index 0fbd4a52c61..476f0744436 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/test/ui/transfer-item.test.ts @@ -2,17 +2,14 @@ import { BerryType } from "#app/enums/berry-type"; import { Button } from "#app/enums/buttons"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; -import { BattleEndPhase } from "#app/phases/battle-end-phase"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; -import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("UI - Transfer Items", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -37,11 +34,11 @@ describe("UI - Transfer Items", () => { { name: "BERRY", count: 2, type: BerryType.APICOT }, { name: "BERRY", count: 2, type: BerryType.LUM }, ]); - game.override.moveset([ Moves.DRAGON_CLAW ]); + game.override.moveset([Moves.DRAGON_CLAW]); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset([ Moves.SPLASH ]); + game.override.enemyMoveset([Moves.SPLASH]); - await game.startBattle([ Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA ]); + await game.classicMode.startBattle([Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA]); game.move.select(Moves.DRAGON_CLAW); @@ -52,10 +49,10 @@ describe("UI - Transfer Items", () => { handler.setCursor(1); handler.processInput(Button.ACTION); - game.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER); + void game.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER); }); - await game.phaseInterceptor.to(BattleEndPhase); + await game.phaseInterceptor.to("BattleEndPhase"); }); it("check red tint for held item limit in transfer menu", async () => { @@ -65,14 +62,20 @@ describe("UI - Transfer Items", () => { const handler = game.scene.ui.getHandler() as PartyUiHandler; handler.processInput(Button.ACTION); - expect(handler.optionsContainer.list.some((option) => (option as BBCodeText).text?.includes("Sitrus Berry"))).toBe(true); - expect(handler.optionsContainer.list.some((option) => (option as BBCodeText).text?.includes("Apicot Berry (2)"))).toBe(true); - expect(handler.optionsContainer.list.some((option) => RegExp(/Lum Berry\[color.*(2)/).exec((option as BBCodeText).text))).toBe(true); + expect(handler.optionsContainer.list.some(option => (option as BBCodeText).text?.includes("Sitrus Berry"))).toBe( + true, + ); + expect( + handler.optionsContainer.list.some(option => (option as BBCodeText).text?.includes("Apicot Berry (2)")), + ).toBe(true); + expect( + handler.optionsContainer.list.some(option => RegExp(/Lum Berry\[color.*(2)/).exec((option as BBCodeText).text)), + ).toBe(true); game.phaseInterceptor.unlock(); }); - await game.phaseInterceptor.to(SelectModifierPhase); + await game.phaseInterceptor.to("SelectModifierPhase"); }, 20000); it("check transfer option for pokemon to transfer to", async () => { @@ -86,11 +89,13 @@ describe("UI - Transfer Items", () => { handler.setCursor(1); // move to other Pokemon handler.processInput(Button.ACTION); // select Pokemon - expect(handler.optionsContainer.list.some((option) => (option as BBCodeText).text?.includes("Transfer"))).toBe(true); + expect(handler.optionsContainer.list.some(option => (option as BBCodeText).text?.includes("Transfer"))).toBe( + true, + ); game.phaseInterceptor.unlock(); }); - await game.phaseInterceptor.to(SelectModifierPhase); + await game.phaseInterceptor.to("SelectModifierPhase"); }, 20000); }); diff --git a/src/test/ui/type-hints.test.ts b/test/ui/type-hints.test.ts similarity index 83% rename from src/test/ui/type-hints.test.ts rename to test/ui/type-hints.test.ts index 2977262dda7..fa7532fb674 100644 --- a/src/test/ui/type-hints.test.ts +++ b/test/ui/type-hints.test.ts @@ -4,10 +4,10 @@ import { Species } from "#app/enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import FightUiHandler from "#app/ui/fight-ui-handler"; import { Mode } from "#app/ui/ui"; -import GameManager from "#test/utils/gameManager"; +import GameManager from "#test/testUtils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import MockText from "#test/utils/mocks/mocksContainer/mockText"; +import type MockText from "#test/testUtils/mocks/mocksContainer/mockText"; import i18next from "i18next"; describe("UI - Type Hints", () => { @@ -37,10 +37,10 @@ describe("UI - Type Hints", () => { .startingWave(1) .enemySpecies(Species.FLORGES) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.DRAGON_CLAW ]); + .moveset([Moves.DRAGON_CLAW]); game.settings.typeHints(true); //activate type hints - await game.startBattle([ Species.RAYQUAZA ]); + await game.startBattle([Species.RAYQUAZA]); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { const { ui } = game.scene; @@ -54,7 +54,7 @@ describe("UI - Type Hints", () => { const movesContainer = ui.getByName(FightUiHandler.MOVES_CONTAINER_NAME); const dragonClawText = movesContainer .getAll() - .find((text) => text.text === i18next.t("move:dragonClaw.name"))! as unknown as MockText; + .find(text => text.text === i18next.t("move:dragonClaw.name"))! as unknown as MockText; expect.soft(dragonClawText.color).toBe("#929292"); ui.getHandler().processInput(Button.ACTION); @@ -63,9 +63,9 @@ describe("UI - Type Hints", () => { }); it("check status move color", async () => { - game.override.enemySpecies(Species.FLORGES).moveset([ Moves.GROWL ]); + game.override.enemySpecies(Species.FLORGES).moveset([Moves.GROWL]); - await game.startBattle([ Species.RAYQUAZA ]); + await game.startBattle([Species.RAYQUAZA]); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { const { ui } = game.scene; @@ -79,7 +79,7 @@ describe("UI - Type Hints", () => { const movesContainer = ui.getByName(FightUiHandler.MOVES_CONTAINER_NAME); const growlText = movesContainer .getAll() - .find((text) => text.text === i18next.t("move:growl.name"))! as unknown as MockText; + .find(text => text.text === i18next.t("move:growl.name"))! as unknown as MockText; expect.soft(growlText.color).toBe(undefined); ui.getHandler().processInput(Button.ACTION); diff --git a/src/test/vitest.setup.ts b/test/vitest.setup.ts similarity index 79% rename from src/test/vitest.setup.ts rename to test/vitest.setup.ts index 8438f607db2..44175049042 100644 --- a/src/test/vitest.setup.ts +++ b/test/vitest.setup.ts @@ -5,7 +5,7 @@ import { initAbilities } from "#app/data/ability"; import { initBiomes } from "#app/data/balance/biomes"; import { initEggMoves } from "#app/data/balance/egg-moves"; import { initPokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; -import { initMoves } from "#app/data/move"; +import { initMoves } from "#app/data/moves/move"; import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; import { initPokemonForms } from "#app/data/pokemon-forms"; import { initSpecies } from "#app/data/pokemon-species"; @@ -18,12 +18,14 @@ import { afterAll, beforeAll, vi } from "vitest"; process.env.TZ = "UTC"; /** Mock the override import to always return default values, ignoring any custom overrides. */ -vi.mock("#app/overrides", async (importOriginal) => { +vi.mock("#app/overrides", async importOriginal => { + // eslint-disable-next-line @typescript-eslint/consistent-type-imports const { defaultOverrides } = await importOriginal(); return { default: defaultOverrides, defaultOverrides, + // eslint-disable-next-line @typescript-eslint/consistent-type-imports } satisfies typeof import("#app/overrides"); }); @@ -33,26 +35,29 @@ vi.mock("#app/overrides", async (importOriginal) => { * This is necessary because how our code is structured. * Do NOT try to put any of this code into external functions, it won't work as it's elevated during runtime. */ -vi.mock("i18next", async (importOriginal) => { +vi.mock("i18next", async importOriginal => { console.log("Mocking i18next"); const { setupServer } = await import("msw/node"); const { http, HttpResponse } = await import("msw"); - global.i18nServer = setupServer( - http.get("/locales/en/*", async (req) => { + global.server = setupServer( + http.get("/locales/en/*", async req => { const filename = req.params[0]; try { - const json = await import(`../../public/locales/en/${req.params[0]}`); + const json = await import(`../public/locales/en/${req.params[0]}`); console.log("Loaded locale", filename); return HttpResponse.json(json); } catch (err) { console.log(`Failed to load locale ${filename}!`, err); return HttpResponse.json({}); } - }) + }), + http.get("https://fonts.googleapis.com/*", () => { + return HttpResponse.text(""); + }), ); - global.i18nServer.listen({ onUnhandledRequest: "error" }); + global.server.listen({ onUnhandledRequest: "error" }); console.log("i18n MSW server listening!"); return await importOriginal(); @@ -83,6 +88,6 @@ beforeAll(() => { }); afterAll(() => { - global.i18nServer.close(); + global.server.close(); console.log("Closing i18n MSW server!"); }); diff --git a/tsconfig.json b/tsconfig.json index f8e019a1b8b..30e208745b9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,35 +1,28 @@ { - "compilerOptions": { - "target": "ES2020", - "module": "ES2020", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "esModuleInterop": true, - "strictNullChecks": true, - "sourceMap": false, - "strict": false, - "rootDir": "./src", - "baseUrl": "./src", - "paths": { - "#enums/*": ["./enums/*.ts"], - "#app/*": ["*.ts"], - "#app": ["."], - "#test/*": ["./test/*.ts"] - }, - "outDir": "./build", - "noEmit": true - }, - "typedocOptions": { - "entryPoints": ["./src"], - "entryPointStrategy": "expand", - "exclude": "**/*+.test.ts", - "out": "typedoc" - }, - "exclude": [ - "node_modules", - "dist", - "vite.config.ts", - "vitest.config.ts", - "vitest.workspace.ts", - ] -} \ No newline at end of file + "compilerOptions": { + "target": "ES2020", + "module": "ES2020", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "esModuleInterop": true, + "strictNullChecks": true, + "sourceMap": false, + "strict": false, + "rootDir": ".", + "baseUrl": "./src", + "paths": { + "#enums/*": ["./enums/*.ts"], + "#app/*": ["*.ts"], + "#test/*": ["../test/*.ts"] + }, + "outDir": "./build", + "noEmit": true + }, + "typedocOptions": { + "entryPoints": ["./src"], + "entryPointStrategy": "expand", + "exclude": "**/*+.test.ts", + "out": "typedoc" + }, + "exclude": ["node_modules", "dist", "vite.config.ts", "vitest.config.ts", "vitest.workspace.ts"] +} diff --git a/vite.config.ts b/vite.config.ts index 946315c4b7b..4b6ad687a0a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,43 +1,39 @@ -import { defineConfig, loadEnv, Rollup, UserConfig } from 'vite'; -import tsconfigPaths from 'vite-tsconfig-paths'; +import { defineConfig, loadEnv, type Rollup, type UserConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; import { minifyJsonPlugin } from "./src/plugins/vite/vite-minify-json-plugin"; -export const defaultConfig: UserConfig = { - plugins: [ - tsconfigPaths(), - minifyJsonPlugin(["images", "battle-anims"], true) - ], - clearScreen: false, - appType: "mpa", - build: { - chunkSizeWarningLimit: 10000, - minify: 'esbuild', - sourcemap: false, - rollupOptions: { - onwarn(warning: Rollup.RollupLog, defaultHandler: (warning: string | Rollup.RollupLog) => void) { - // Suppress "Module level directives cause errors when bundled" warnings - if (warning.code === "MODULE_LEVEL_DIRECTIVE") { - return; - } - defaultHandler(warning); - }, - }, - }, +export const defaultConfig: UserConfig = { + plugins: [tsconfigPaths(), minifyJsonPlugin(["images", "battle-anims"], true)], + clearScreen: false, + appType: "mpa", + build: { + chunkSizeWarningLimit: 10000, + minify: "esbuild", + sourcemap: false, + rollupOptions: { + onwarn(warning: Rollup.RollupLog, defaultHandler: (warning: string | Rollup.RollupLog) => void) { + // Suppress "Module level directives cause errors when bundled" warnings + if (warning.code === "MODULE_LEVEL_DIRECTIVE") { + return; + } + defaultHandler(warning); + }, + }, + }, }; +export default defineConfig(({ mode }) => { + const envPort = Number(loadEnv(mode, process.cwd()).VITE_PORT); -export default defineConfig(({mode}) => { - const envPort = Number(loadEnv(mode, process.cwd()).VITE_PORT); - - return ({ - ...defaultConfig, - base: '', - esbuild: { - pure: mode === 'production' ? ['console.log'] : [], - keepNames: true, - }, - server: { - port: !isNaN(envPort) ? envPort : 8000, - } - }); + return { + ...defaultConfig, + base: "", + esbuild: { + pure: mode === "production" ? ["console.log"] : [], + keepNames: true, + }, + server: { + port: !Number.isNaN(envPort) ? envPort : 8000, + }, + }; }); diff --git a/vitest.config.ts b/vitest.config.ts index 9f9245687a1..b52c16ec00c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,7 @@ export default defineProject(({ mode }) => ({ ...defaultConfig, test: { testTimeout: 20000, - setupFiles: ["./src/test/fontFace.setup.ts", "./src/test/vitest.setup.ts"], + setupFiles: ["./test/fontFace.setup.ts", "./test/vitest.setup.ts"], server: { deps: { inline: ["vitest-canvas-mock"], @@ -33,8 +33,8 @@ export default defineProject(({ mode }) => ({ reporters: ["text-summary", "html"], }, name: "main", - include: ["./src/test/**/*.{test,spec}.ts"], - exclude: ["./src/test/pre.test.ts"], + include: ["./test/**/*.{test,spec}.ts"], + exclude: ["./test/pre.test.ts"], }, esbuild: { pure: mode === "production" ? ["console.log"] : [], diff --git a/vitest.workspace.ts b/vitest.workspace.ts index 38121942004..2f5d1f1e2c8 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -6,7 +6,7 @@ export default defineWorkspace([ ...defaultConfig, test: { name: "pre", - include: ["src/test/pre.test.ts"], + include: ["./test/pre.test.ts"], environment: "jsdom", }, },